def get_dates_ranges(self): today = fields.Date.context_today(self) is_account_present = hasattr(self.env.company, 'compute_fiscalyear_dates') this_year = { 'date_from': date(today.year, 1, 1), 'date_to': date(today.year, 12, 31) } last_year = { 'date_from': date(today.year - 1, 1, 1), 'date_to': date(today.year - 1, 12, 31) } this_year_dates = self.env.company.compute_fiscalyear_dates( today) if is_account_present else this_year last_year_dates = self.env.company.compute_fiscalyear_dates( today - relativedelta(years=1)) if is_account_present else last_year this_quarter_from, this_quarter_to = date_utils.get_quarter(today) last_quarter_from, last_quarter_to = date_utils.get_quarter( today - relativedelta(months=3)) this_month_from, this_month_to = date_utils.get_month(today) last_month_from, last_month_to = date_utils.get_month(today - relativedelta( months=1)) return { 'this_year': { 'date_from': this_year_dates['date_from'], 'date_to': this_year_dates['date_to'] }, 'last_year': { 'date_from': last_year_dates['date_from'], 'date_to': last_year_dates['date_to'] }, 'this_quarter': { 'date_from': this_quarter_from, 'date_to': this_quarter_to }, 'last_quarter': { 'date_from': last_quarter_from, 'date_to': last_quarter_to }, 'this_month': { 'date_from': this_month_from, 'date_to': this_month_to }, 'last_month': { 'date_from': last_month_from, 'date_to': last_month_to }, }
def _get_dates_previous_period(self, options, period_vals): period_type = period_vals['period_type'] date_from = period_vals['date_from'] date_to = period_vals['date_to'] if not date_from or not date_to: date = (date_from or date_to).replace(day=1) - datetime.timedelta(days=1) return self._get_dates_period(options, None, date, period_type=period_type) date_to = date_from - datetime.timedelta(days=1) if period_type == 'fiscalyear': company_fiscalyear_dates = request.env.user.company_id.compute_fiscalyear_dates( date_to) return self._get_dates_period( options, company_fiscalyear_dates['date_from'], company_fiscalyear_dates['date_to']) if period_type == 'month': return self._get_dates_period(options, *date_utils.get_month(date_to), period_type='month') if period_type == 'quarter': return self._get_dates_period(options, *date_utils.get_quarter(date_to), period_type='quarter') if period_type == 'year': return self._get_dates_period(options, *date_utils.get_fiscal_year(date_to), period_type='year') date_from = date_to - datetime.timedelta(days=(date_to - date_from).days) return self._get_dates_period(options, date_from, date_to)
def get_pay_to(self, today): last_day = last = date(today.year, 12, 31) trim = date_utils.get_quarter(today) if self.full_year: return last_day return trim[1]
def _apply_date_filter(self, options): def create_vals(period_vals): vals = {'string': period_vals['string']} if self.has_single_date_filter(options): vals['date'] = (period_vals['date_to'] or period_vals['date_from'] ).strftime(DEFAULT_SERVER_DATE_FORMAT) else: vals['date_from'] = period_vals['date_from'].strftime( DEFAULT_SERVER_DATE_FORMAT) vals['date_to'] = period_vals['date_to'].strftime( DEFAULT_SERVER_DATE_FORMAT) return vals # ===== Date Filter ===== if not options.get('date') or not options['date'].get('filter'): return options_filter = options['date']['filter'] date_from = None date_to = datetime.date.today() if options_filter == 'custom': if self.has_single_date_filter(options): date_from = None date_to = fields.Date.from_string(options['date']['date']) else: date_from = fields.Date.from_string( options['date']['date_from']) date_to = fields.Date.from_string(options['date']['date_to']) elif 'today' in options_filter: if not self.has_single_date_filter(options): date_from = request.env.user.company_id.compute_fiscalyear_dates( date_to)['date_from'] elif 'month' in options_filter: date_from, date_to = date_utils.get_month(date_to) elif 'quarter' in options_filter: date_from, date_to = date_utils.get_quarter(date_to) elif 'year' in options_filter: company_fiscalyear_dates = request.env.user.company_id.compute_fiscalyear_dates( date_to) date_from = company_fiscalyear_dates['date_from'] date_to = company_fiscalyear_dates['date_to'] else: raise UserError( 'Programmation Error: Unrecognized parameter %s in date filter!' % str(options_filter)) period_vals = self._get_dates_period(options, date_from, date_to) if 'last' in options_filter: period_vals = self._get_dates_previous_period(options, period_vals) options['date'].update(create_vals(period_vals))
def portal_my_timesheets(self, page=1, sortby=None, filterby=None, search=None, search_in='all', groupby='none', **kw): Timesheet_sudo = request.env['account.analytic.line'].sudo() values = self._prepare_portal_layout_values() domain = request.env[ 'account.analytic.line']._timesheet_get_portal_domain() _items_per_page = 100 searchbar_sortings = { 'date': { 'label': _('Newest'), 'order': 'date desc' }, 'name': { 'label': _('Description'), 'order': 'name' }, } searchbar_inputs = self._get_searchbar_inputs() searchbar_groupby = self._get_searchbar_groupby() today = fields.Date.today() quarter_start, quarter_end = date_utils.get_quarter(today) last_week = today + relativedelta(weeks=-1) last_month = today + relativedelta(months=-1) last_year = today + relativedelta(years=-1) searchbar_filters = { 'all': { 'label': _('All'), 'domain': [] }, 'today': { 'label': _('Today'), 'domain': [("date", "=", today)] }, 'week': { 'label': _('This week'), 'domain': [('date', '>=', date_utils.start_of(today, "week")), ('date', '<=', date_utils.end_of(today, 'week'))] }, 'month': { 'label': _('This month'), 'domain': [('date', '>=', date_utils.start_of(today, 'month')), ('date', '<=', date_utils.end_of(today, 'month'))] }, 'year': { 'label': _('This year'), 'domain': [('date', '>=', date_utils.start_of(today, 'year')), ('date', '<=', date_utils.end_of(today, 'year'))] }, 'quarter': { 'label': _('This Quarter'), 'domain': [('date', '>=', quarter_start), ('date', '<=', quarter_end)] }, 'last_week': { 'label': _('Last week'), 'domain': [('date', '>=', date_utils.start_of(last_week, "week")), ('date', '<=', date_utils.end_of(last_week, 'week'))] }, 'last_month': { 'label': _('Last month'), 'domain': [('date', '>=', date_utils.start_of(last_month, 'month')), ('date', '<=', date_utils.end_of(last_month, 'month'))] }, 'last_year': { 'label': _('Last year'), 'domain': [('date', '>=', date_utils.start_of(last_year, 'year')), ('date', '<=', date_utils.end_of(last_year, 'year'))] }, } # default sort by value if not sortby: sortby = 'date' order = searchbar_sortings[sortby]['order'] # default filter by value if not filterby: filterby = 'all' domain = AND([domain, searchbar_filters[filterby]['domain']]) if search and search_in: domain += self._get_search_domain(search_in, search) timesheet_count = Timesheet_sudo.search_count(domain) # pager pager = portal_pager(url="/my/timesheets", url_args={ 'sortby': sortby, 'search_in': search_in, 'search': search, 'filterby': filterby, 'groupby': groupby }, total=timesheet_count, page=page, step=_items_per_page) def get_timesheets(): groupby_mapping = self._get_groupby_mapping() field = groupby_mapping.get(groupby, None) orderby = '%s, %s' % (field, order) if field else order timesheets = Timesheet_sudo.search(domain, order=orderby, limit=_items_per_page, offset=pager['offset']) if field: if groupby == 'date': time_data = Timesheet_sudo.read_group( domain, ['date', 'unit_amount:sum'], ['date:day']) mapped_time = dict([ (datetime.strptime(m['date:day'], '%d %b %Y').date(), m['unit_amount']) for m in time_data ]) grouped_timesheets = [ (Timesheet_sudo.concat(*g), mapped_time[k]) for k, g in groupbyelem(timesheets, itemgetter('date')) ] else: time_data = time_data = Timesheet_sudo.read_group( domain, [field, 'unit_amount:sum'], [field]) mapped_time = dict([(m[field][0] if m[field] else False, m['unit_amount']) for m in time_data]) grouped_timesheets = [ (Timesheet_sudo.concat(*g), mapped_time[k.id]) for k, g in groupbyelem(timesheets, itemgetter(field)) ] return timesheets, grouped_timesheets grouped_timesheets = [ (timesheets, sum(Timesheet_sudo.search(domain).mapped('unit_amount'))) ] if timesheets else [] return timesheets, grouped_timesheets timesheets, grouped_timesheets = get_timesheets() values.update({ 'timesheets': timesheets, 'grouped_timesheets': grouped_timesheets, 'page_name': 'timesheet', 'default_url': '/my/timesheets', 'pager': pager, 'searchbar_sortings': searchbar_sortings, 'search_in': search_in, 'search': search, 'sortby': sortby, 'groupby': groupby, 'searchbar_inputs': searchbar_inputs, 'searchbar_groupby': searchbar_groupby, 'searchbar_filters': OrderedDict(sorted(searchbar_filters.items())), 'filterby': filterby, 'is_uom_day': request.env['account.analytic.line']._is_timesheet_encode_uom_day( ), }) return request.render("hr_timesheet.portal_my_timesheets", values)
def portal_my_timesheets(self, page=1, sortby=None, filterby=None, search=None, search_in='all', groupby='project', **kw): Timesheet_sudo = request.env['account.analytic.line'].sudo() values = self._prepare_portal_layout_values() domain = request.env['account.analytic.line']._timesheet_get_portal_domain() searchbar_sortings = { 'date': {'label': _('Newest'), 'order': 'date desc'}, 'name': {'label': _('Name'), 'order': 'name'}, } searchbar_inputs = { 'all': {'input': 'all', 'label': _('Search in All')}, } searchbar_groupby = { 'none': {'input': 'none', 'label': _('None')}, 'project': {'input': 'project', 'label': _('Project')}, } today = fields.Date.today() quarter_start, quarter_end = date_utils.get_quarter(today) last_week = today + relativedelta(weeks=-1) last_month = today + relativedelta(months=-1) last_year = today + relativedelta(years=-1) searchbar_filters = { 'all': {'label': _('All'), 'domain': []}, 'today': {'label': _('Today'), 'domain': [("date", "=", today)]}, 'week': {'label': _('This week'), 'domain': [('date', '>=', date_utils.start_of(today, "week")), ('date', '<=', date_utils.end_of(today, 'week'))]}, 'month': {'label': _('This month'), 'domain': [('date', '>=', date_utils.start_of(today, 'month')), ('date', '<=', date_utils.end_of(today, 'month'))]}, 'year': {'label': _('This year'), 'domain': [('date', '>=', date_utils.start_of(today, 'year')), ('date', '<=', date_utils.end_of(today, 'year'))]}, 'quarter': {'label': _('This Quarter'), 'domain': [('date', '>=', quarter_start), ('date', '<=', quarter_end)]}, 'last_week': {'label': _('Last week'), 'domain': [('date', '>=', date_utils.start_of(last_week, "week")), ('date', '<=', date_utils.end_of(last_week, 'week'))]}, 'last_month': {'label': _('Last month'), 'domain': [('date', '>=', date_utils.start_of(last_month, 'month')), ('date', '<=', date_utils.end_of(last_month, 'month'))]}, 'last_year': {'label': _('Last year'), 'domain': [('date', '>=', date_utils.start_of(last_year, 'year')), ('date', '<=', date_utils.end_of(last_year, 'year'))]}, } # default sort by value if not sortby: sortby = 'date' order = searchbar_sortings[sortby]['order'] # default filter by value if not filterby: filterby = 'all' domain = AND([domain, searchbar_filters[filterby]['domain']]) if search and search_in: domain = AND([domain, [('name', 'ilike', search)]]) timesheet_count = Timesheet_sudo.search_count(domain) # pager pager = portal_pager( url="/my/timesheets", url_args={'sortby': sortby, 'search_in': search_in, 'search': search, 'filterby': filterby}, total=timesheet_count, page=page, step=self._items_per_page ) if groupby == 'project': order = "project_id, %s" % order timesheets = Timesheet_sudo.search(domain, order=order, limit=self._items_per_page, offset=pager['offset']) if groupby == 'project': grouped_timesheets = [Timesheet_sudo.concat(*g) for k, g in groupbyelem(timesheets, itemgetter('project_id'))] else: grouped_timesheets = [timesheets] values.update({ 'timesheets': timesheets, 'grouped_timesheets': grouped_timesheets, 'page_name': 'timesheet', 'default_url': '/my/timesheets', 'pager': pager, 'searchbar_sortings': searchbar_sortings, 'search_in': search_in, 'sortby': sortby, 'groupby': groupby, 'searchbar_inputs': searchbar_inputs, 'searchbar_groupby': searchbar_groupby, 'searchbar_filters': OrderedDict(sorted(searchbar_filters.items())), 'filterby': filterby, }) return request.render("hr_timesheet.portal_my_timesheets", values)
from dateutil.relativedelta import relativedelta from odoo.tools import date_utils from odoo.fields import Datetime today = Datetime.today() # today = datetime.strptime('2019-03-29 01:53:48', misc.DEFAULT_SERVER_DATETIME_FORMAT) # Представим, что сейчас 2019-03-29 01:53:48 date_utils.get_month(today) # (datetime.datetime(2019, 3, 1, 0, 0), datetime.datetime(2019, 3, 31, 0, 0)) date_utils.get_quarter(today) # (datetime.datetime(2019, 1, 1, 0, 0), datetime.datetime(2019, 3, 31, 0, 0)) date_utils.get_quarter_number(today) # 1 date_utils.get_fiscal_year(today) # (datetime.datetime(2019, 1, 1, 0, 0), datetime.datetime(2019, 12, 31, 0, 0)) date_utils.start_of(today, 'hour') # 2019-03-29 01:00:00 date_utils.start_of(today, 'day') # 2019-03-29 00:00:00 date_utils.start_of(today, 'week') # 2019-03-25 00:00:00 date_utils.start_of(today, 'month') # 2019-03-01 00:00:00 date_utils.start_of(today, 'quarter') # 2019-01-01 00:00:00 date_utils.start_of(today, 'year') # 2019-01-01 00:00:00 date_utils.end_of(today, 'hour')
def _compute_dates(self): for dmfa in self: year = int(dmfa.year) month = int(dmfa.quarter) * 3 self.quarter_start, self.quarter_end = date_utils.get_quarter( date(year, month, 1))
def _get_dates_period(self, options, date_from, date_to, period_type=None): def match(dt_from, dt_to): if self.has_single_date_filter(options): return (date_to or date_from) == dt_to else: return (dt_from, dt_to) == (date_from, date_to) string = None # If no date_from or not date_to, we are unable to determine a period if not period_type: date = date_to or date_from company_fiscalyear_dates = request.env.user.company_id.compute_fiscalyear_dates( date) if match(company_fiscalyear_dates['date_from'], company_fiscalyear_dates['date_to']): period_type = 'fiscalyear' if company_fiscalyear_dates.get('record'): string = company_fiscalyear_dates['record'].name elif match(*date_utils.get_month(date)): period_type = 'month' elif match(*date_utils.get_quarter(date)): period_type = 'quarter' elif match(*date_utils.get_fiscal_year(date)): period_type = 'year' else: period_type = 'custom' if not string: fy_day = request.env.user.company_id.fiscalyear_last_day fy_month = request.env.user.company_id.fiscalyear_last_month if self.has_single_date_filter(options): string = _('As of %s') % (format_date( request.env, date_to.strftime(DEFAULT_SERVER_DATE_FORMAT))) elif period_type == 'year' or ( period_type == 'fiscalyear' and (date_from, date_to) == date_utils.get_fiscal_year(date_to)): string = date_to.strftime('%Y') elif period_type == 'fiscalyear' and ( date_from, date_to) == date_utils.get_fiscal_year( date_to, day=fy_day, month=fy_month): string = '%s - %s' % (date_to.year - 1, date_to.year) elif period_type == 'month': string = format_date( request.env, date_to.strftime(DEFAULT_SERVER_DATE_FORMAT), date_format='MMM YYYY') elif period_type == 'quarter': quarter_names = get_quarter_names( 'abbreviated', locale=request.env.context.get('lang') or 'en_US') string = u'%s\N{NO-BREAK SPACE}%s' % (quarter_names[ date_utils.get_quarter_number(date_to)], date_to.year) else: dt_from_str = format_date( request.env, date_from.strftime(DEFAULT_SERVER_DATE_FORMAT)) dt_to_str = format_date( request.env, date_to.strftime(DEFAULT_SERVER_DATE_FORMAT)) string = _('From %s \n to %s') % (dt_from_str, dt_to_str) return { 'string': string, 'period_type': period_type, 'date_from': date_from, 'date_to': date_to, }
def test_filter_date_fiscalyear_range_custom_years(self): ''' Test the filter_date with 'this_year'/'last_year' in 'range' mode with custom account.fiscal.year records.''' # Create a custom fiscal year for the nine previous quarters. today = fields.Date.from_string('2017-12-31') for i in range(9): quarter_df, quarter_dt = date_utils.get_quarter(today - relativedelta( months=i * 3)) self.env['account.fiscal.year'].create({ 'name': 'custom %s' % i, 'date_from': fields.Date.to_string(quarter_df), 'date_to': fields.Date.to_string(quarter_dt), 'company_id': self.env.company.id, }) self._assert_filter_date( { 'filter': 'this_year', 'mode': 'range' }, { 'string': 'custom 0', 'period_type': 'fiscalyear', 'mode': 'range', 'filter': 'this_year', 'date_from': '2017-10-01', 'date_to': '2017-12-31', 'strict_range': False, }, ) self._assert_filter_date( { 'filter': 'last_year', 'mode': 'range' }, { 'string': 'custom 1', 'period_type': 'fiscalyear', 'mode': 'range', 'filter': 'last_year', 'date_from': '2017-07-01', 'date_to': '2017-09-30', 'strict_range': False, }, ) self._assert_filter_comparison( { 'filter': 'this_year', 'mode': 'range' }, { 'filter': 'previous_period', 'number_period': 2 }, [ { 'string': 'custom 1', 'period_type': 'fiscalyear', 'mode': 'range', 'date_from': '2017-07-01', 'date_to': '2017-09-30', 'strict_range': False, }, { 'string': 'custom 2', 'period_type': 'fiscalyear', 'mode': 'range', 'date_from': '2017-04-01', 'date_to': '2017-06-30', 'strict_range': False, }, ], ) self._assert_filter_comparison( { 'filter': 'this_year', 'mode': 'range' }, { 'filter': 'same_last_year', 'number_period': 2 }, [ { 'string': 'custom 4', 'period_type': 'fiscalyear', 'mode': 'range', 'date_from': '2016-10-01', 'date_to': '2016-12-31', 'strict_range': False, }, { 'string': 'custom 8', 'period_type': 'fiscalyear', 'mode': 'range', 'date_from': '2015-10-01', 'date_to': '2015-12-31', 'strict_range': False, }, ], ) self._assert_filter_comparison( { 'filter': 'this_year', 'mode': 'range' }, { 'filter': 'custom', 'date_from': '2017-07-01', 'date_to': '2017-09-30' }, [ { 'string': 'custom 1', 'period_type': 'fiscalyear', 'mode': 'range', 'date_from': '2017-07-01', 'date_to': '2017-09-30', 'strict_range': False, }, ], )