From 49b1742477f6e5578d80fb2b49649ae1b3108750 Mon Sep 17 00:00:00 2001 From: Joren Van Onder Date: Fri, 27 May 2016 09:39:02 +0200 Subject: [PATCH] [FIX] point_of_sale: respect user timezone for all data in Sale Details 9f0120d73bbbc364d8ec04b0e3ad63c75086ba52 solved this issue already, but it was only applied to POS orderlines. There is other data on the report (eg. payments, taxes, ...) that should also correctly respect the user time zone as well. opw-678748 --- addons/point_of_sale/report/pos_details.py | 38 ++++++++++++++-------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/addons/point_of_sale/report/pos_details.py b/addons/point_of_sale/report/pos_details.py index da529a7f852..3ada02f332e 100644 --- a/addons/point_of_sale/report/pos_details.py +++ b/addons/point_of_sale/report/pos_details.py @@ -40,6 +40,19 @@ class pos_details(report_sxw.rml_parse): user_obj = self.pool.get('res.users') return user_obj.search(self.cr, self.uid, []) + def _get_utc_time_range(self, form): + user = self.pool['res.users'].browse(self.cr, self.uid, self.uid) + tz_name = user.tz or self.localcontext.get('tz') or 'UTC' + user_tz = pytz.timezone(tz_name) + between_dates = {} + + for date_field, delta in {'date_start': {'days': 0}, 'date_end': {'days': 1}}.items(): + timestamp = datetime.datetime.strptime(form[date_field] + ' 00:00:00', tools.DEFAULT_SERVER_DATETIME_FORMAT) + datetime.timedelta(**delta) + timestamp = user_tz.localize(timestamp).astimezone(pytz.utc) + between_dates[date_field] = timestamp.strftime(tools.DEFAULT_SERVER_DATETIME_FORMAT) + + return between_dates['date_start'], between_dates['date_end'] + def _pos_sales_details(self, form): pos_obj = self.pool.get('pos.order') user_obj = self.pool.get('res.users') @@ -47,18 +60,11 @@ class pos_details(report_sxw.rml_parse): result = {} user_ids = form['user_ids'] or self._get_all_users() company_id = user_obj.browse(self.cr, self.uid, self.uid).company_id.id - user = self.pool['res.users'].browse(self.cr, self.uid, self.uid) - tz_name = user.tz or self.localcontext.get('tz') or 'UTC' - user_tz = pytz.timezone(tz_name) - between_dates = {} - for date_field, delta in {'date_start': {'days': 0}, 'date_end': {'days': 1}}.items(): - timestamp = datetime.datetime.strptime(form[date_field] + ' 00:00:00', tools.DEFAULT_SERVER_DATETIME_FORMAT) + datetime.timedelta(**delta) - timestamp = user_tz.localize(timestamp).astimezone(pytz.utc) - between_dates[date_field] = timestamp.strftime(tools.DEFAULT_SERVER_DATETIME_FORMAT) + date_start, date_end = self._get_utc_time_range(form) pos_ids = pos_obj.search(self.cr, self.uid, [ - ('date_order', '>=', between_dates['date_start']), - ('date_order', '<', between_dates['date_end']), + ('date_order', '>=', date_start), + ('date_order', '<', date_end), ('user_id', 'in', user_ids), ('state', 'in', ['done', 'paid', 'invoiced']), ('company_id', '=', company_id) @@ -97,7 +103,8 @@ class pos_details(report_sxw.rml_parse): user_obj = self.pool.get('res.users') user_ids = form['user_ids'] or self._get_all_users() company_id = user_obj.browse(self.cr, self.uid, self.uid).company_id.id - pos_ids = pos_obj.search(self.cr, self.uid, [('date_order','>=',form['date_start'] + ' 00:00:00'),('date_order','<=',form['date_end'] + ' 23:59:59'),('user_id','in',user_ids),('company_id','=',company_id),('invoice_id','<>',False)]) + date_start, date_end = self._get_utc_time_range(form) + pos_ids = pos_obj.search(self.cr, self.uid, [('date_order','>=', date_start),('date_order','<=',date_end),('user_id','in',user_ids),('company_id','=',company_id),('invoice_id','<>',False)]) for pos in pos_obj.browse(self.cr, self.uid, pos_ids): for pol in pos.lines: self.total_invoiced += (pol.price_unit * pol.qty * (1 - (pol.discount) / 100.0)) @@ -115,7 +122,8 @@ class pos_details(report_sxw.rml_parse): user_obj = self.pool.get('res.users') user_ids = form['user_ids'] or self._get_all_users() company_id = user_obj.browse(self.cr, self.uid, self.uid).company_id.id - pos_ids = pos_obj.search(self.cr, self.uid, [('date_order','>=',form['date_start'] + ' 00:00:00'),('date_order','<=',form['date_end'] + ' 23:59:59'),('user_id','in',user_ids),('company_id','=',company_id)]) + date_start, date_end = self._get_utc_time_range(form) + pos_ids = pos_obj.search(self.cr, self.uid, [('date_order','>=',date_start),('date_order','<=',date_end),('user_id','in',user_ids),('company_id','=',company_id)]) for pos in pos_obj.browse(self.cr, self.uid, pos_ids): for pol in pos.lines: self.total_discount += ((pol.price_unit * pol.qty) * (pol.discount / 100)) @@ -126,7 +134,8 @@ class pos_details(report_sxw.rml_parse): pos_order_obj = self.pool.get("pos.order") user_ids = form['user_ids'] or self._get_all_users() company_id = self.pool['res.users'].browse(self.cr, self.uid, self.uid).company_id.id - pos_ids = pos_order_obj.search(self.cr, self.uid, [('date_order','>=',form['date_start'] + ' 00:00:00'),('date_order','<=',form['date_end'] + ' 23:59:59'),('state','in',['paid','invoiced','done']),('user_id','in',user_ids), ('company_id', '=', company_id)]) + date_start, date_end = self._get_utc_time_range(form) + pos_ids = pos_order_obj.search(self.cr, self.uid, [('date_order','>=',date_start),('date_order','<=',date_end),('state','in',['paid','invoiced','done']),('user_id','in',user_ids), ('company_id', '=', company_id)]) data={} if pos_ids: st_line_ids = statement_line_obj.search(self.cr, self.uid, [('pos_statement_id', 'in', pos_ids)]) @@ -175,7 +184,8 @@ class pos_details(report_sxw.rml_parse): user_ids = form['user_ids'] or self._get_all_users() pos_order_obj = self.pool.get('pos.order') company_id = self.pool['res.users'].browse(self.cr, self.uid, self.uid).company_id.id - pos_ids = pos_order_obj.search(self.cr, self.uid, [('date_order','>=',form['date_start'] + ' 00:00:00'),('date_order','<=',form['date_end'] + ' 23:59:59'),('state','in',['paid','invoiced','done']),('user_id','in',user_ids), ('company_id', '=', company_id)]) + date_start, date_end = self._get_utc_time_range(form) + pos_ids = pos_order_obj.search(self.cr, self.uid, [('date_order','>=',date_start),('date_order','<=',date_end),('state','in',['paid','invoiced','done']),('user_id','in',user_ids), ('company_id', '=', company_id)]) for order in pos_order_obj.browse(self.cr, self.uid, pos_ids): for line in order.lines: line_taxes = account_tax_obj.compute_all(self.cr, self.uid, line.product_id.taxes_id, line.price_unit, line.qty, product=line.product_id, partner=line.order_id.partner_id or False)