From 0cc30bf08382128a77455a51d831ef45ccdfdb48 Mon Sep 17 00:00:00 2001 From: Hetashree Chauhan Date: Mon, 1 Jul 2019 05:36:19 +0000 Subject: [PATCH] [IMP] sale(_*): replace confirmation date with order date * pos_sale, sale, sale_crm, sale_management, sale_stock, website_sale Purpose of this commit is replace the confirmation date field with order date from sale. As order_date and confirmation_date of sale order are having same value so no need to keep two fields, remove confirmation field and instead use order date. cretae_date use as order Date and replace the order_date on confirmation of the order as confirmation date. task-2027274 closes: #34571 Signed-off-by: Damien Bouvy (dbo) --- addons/pos_sale/report/sale_report.py | 1 - addons/sale/data/sale_demo.xml | 14 +++++++------- addons/sale/models/sale.py | 13 ++++++------- addons/sale/models/sales_team.py | 2 +- addons/sale/report/sale_report.py | 3 --- addons/sale/report/sale_report_templates.xml | 6 +++--- addons/sale/report/sale_report_views.xml | 5 ++--- addons/sale/views/sale_portal_templates.xml | 10 ++++++++-- addons/sale/views/sale_views.xml | 18 ++++++++++++------ addons/sale_crm/models/crm_team.py | 2 +- addons/sale_management/models/digest.py | 5 +++-- addons/sale_stock/models/sale_order.py | 4 ++-- .../sale_stock/tests/test_sale_order_dates.py | 2 +- .../views/stock_production_lot_views.xml | 2 +- addons/website_sale/controllers/backend.py | 18 +++++++++--------- addons/website_sale/data/demo.xml | 11 ----------- addons/website_sale/models/digest.py | 4 ++-- .../website_sale/views/sale_report_views.xml | 1 - .../data/sale_order_demo.xml | 2 -- .../report/sale_report_views.xml | 4 ++-- 20 files changed, 60 insertions(+), 67 deletions(-) diff --git a/addons/pos_sale/report/sale_report.py b/addons/pos_sale/report/sale_report.py index ec2a6ee84cb..b0584edaa70 100644 --- a/addons/pos_sale/report/sale_report.py +++ b/addons/pos_sale/report/sale_report.py @@ -37,7 +37,6 @@ class SaleReport(models.Model): count(*) AS nbr, pos.name AS name, pos.date_order AS date, - pos.date_order AS confirmation_date, CASE WHEN pos.state = 'draft' THEN 'pos_draft' WHEN pos.state = 'done' THEN 'pos_done' else pos.state END AS state, pos.partner_id AS partner_id, pos.user_id AS user_id, diff --git a/addons/sale/data/sale_demo.xml b/addons/sale/data/sale_demo.xml index ee66c68efd4..aab4fdc83d6 100644 --- a/addons/sale/data/sale_demo.xml +++ b/addons/sale/data/sale_demo.xml @@ -625,25 +625,25 @@ - + - + - + - + - + - + @@ -786,7 +786,7 @@ Thanks! - + diff --git a/addons/sale/models/sale.py b/addons/sale/models/sale.py index 60f4cfad5fc..35b7814fb0e 100644 --- a/addons/sale/models/sale.py +++ b/addons/sale/models/sale.py @@ -1,4 +1,4 @@ -7# -*- coding: utf-8 -*- +# -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. from datetime import datetime, timedelta @@ -130,7 +130,7 @@ class SaleOrder(models.Model): ('done', 'Locked'), ('cancel', 'Cancelled'), ], string='Status', readonly=True, copy=False, index=True, tracking=3, default='draft') - date_order = fields.Datetime(string='Order Date', required=True, readonly=True, index=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, copy=False, default=fields.Datetime.now) + date_order = fields.Datetime(string='Order Date', required=True, readonly=True, index=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, copy=False, default=fields.Datetime.now, help="Creation date of draft/sent orders,\nConfirmation date of confirmed orders.") validity_date = fields.Date(string='Expiration', readonly=True, copy=False, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, help="Beyond this date, the customer is no longer able to accept the quotation from the portal.", default=_default_validity_date) is_expired = fields.Boolean(compute='_compute_is_expired', string="Is expired") @@ -142,7 +142,6 @@ class SaleOrder(models.Model): help='Request an online payment to the customer in order to confirm orders automatically.') remaining_validity_days = fields.Integer(compute='_compute_remaining_validity_days', string="Remaining Days Before Expiration") create_date = fields.Datetime(string='Creation Date', readonly=True, index=True, help="Date on which sales order is created.") - confirmation_date = fields.Datetime(string='Confirmation Date', readonly=True, index=True, help="Date on which the sales order is confirmed.", copy=False) user_id = fields.Many2one('res.users', string='Salesperson', index=True, tracking=2, default=lambda self: self.env.user) partner_id = fields.Many2one('res.partner', string='Customer', readonly=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, required=True, change_default=True, index=True, tracking=1, help="You can find a customer from their name, email, tax ID or reference.") partner_invoice_id = fields.Many2one('res.partner', string='Invoice Address', readonly=True, required=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)], 'sale': [('readonly', False)]}, help="Invoice address for current sales order.") @@ -197,7 +196,7 @@ class SaleOrder(models.Model): string='Authorized Transactions', copy=False, readonly=True) _sql_constraints = [ - ('confirmation_date_conditional_required', "CHECK( (state IN ('sale', 'done') AND confirmation_date IS NOT NULL) OR state NOT IN ('sale', 'done') )", "A confirmed sales order requires a confirmation date."), + ('date_order_conditional_required', "CHECK( (state IN ('sale', 'done') AND date_order IS NOT NULL) OR state NOT IN ('sale', 'done') )", "A confirmed sales order requires a confirmation date."), ] @api.constrains('company_id', 'order_line') @@ -229,14 +228,14 @@ class SaleOrder(models.Model): for order in self: order.is_expired = order.state == 'sent' and order.validity_date and order.validity_date < today - @api.depends('order_line.customer_lead', 'confirmation_date', 'order_line.state') + @api.depends('order_line.customer_lead', 'date_order', 'order_line.state') def _compute_expected_date(self): """ For service and consumable, we only take the min dates. This method is extended in sale_stock to take the picking_policy of SO into account. """ for order in self: dates_list = [] - confirm_date = fields.Datetime.from_string(order.confirmation_date if order.state in ['sale', 'done'] else fields.Datetime.now()) + confirm_date = fields.Datetime.from_string(order.date_order if order.state in ['sale', 'done'] else fields.Datetime.now()) for line in order.order_line.filtered(lambda x: x.state != 'cancel' and not x._is_delivery()): dt = confirm_date + timedelta(days=line.customer_lead or 0.0) dates_list.append(dt) @@ -685,7 +684,7 @@ class SaleOrder(models.Model): order.message_subscribe([order.partner_id.id]) self.write({ 'state': 'sale', - 'confirmation_date': fields.Datetime.now() + 'date_order': fields.Datetime.now() }) self._action_confirm() if self.env.user.has_group('sale.group_auto_done_setting'): diff --git a/addons/sale/models/sales_team.py b/addons/sale/models/sales_team.py index 1ea7f5d9570..f1bd92f2b9a 100644 --- a/addons/sale/models/sales_team.py +++ b/addons/sale/models/sales_team.py @@ -98,7 +98,7 @@ class CrmTeam(models.Model): def _graph_date_column(self): if self._context.get('in_sales_app'): - return 'confirmation_date' + return 'date_order' return super(CrmTeam,self)._graph_date_column() def _graph_y_query(self): diff --git a/addons/sale/report/sale_report.py b/addons/sale/report/sale_report.py index 0cdcc6c2cfb..9160f2e0f29 100644 --- a/addons/sale/report/sale_report.py +++ b/addons/sale/report/sale_report.py @@ -18,7 +18,6 @@ class SaleReport(models.Model): name = fields.Char('Order Reference', readonly=True) date = fields.Datetime('Order Date', readonly=True) - confirmation_date = fields.Datetime('Confirmation Date', readonly=True) product_id = fields.Many2one('product.product', 'Product Variant', readonly=True) product_uom = fields.Many2one('uom.uom', 'Unit of Measure', readonly=True) product_uom_qty = fields.Float('Qty Ordered', readonly=True) @@ -77,7 +76,6 @@ class SaleReport(models.Model): count(*) as nbr, s.name as name, s.date_order as date, - s.confirmation_date as confirmation_date, s.state as state, s.partner_id as partner_id, s.user_id as user_id, @@ -123,7 +121,6 @@ class SaleReport(models.Model): t.categ_id, s.name, s.date_order, - s.confirmation_date, s.partner_id, s.user_id, s.state, diff --git a/addons/sale/report/sale_report_templates.xml b/addons/sale/report/sale_report_templates.xml index 6172f3df91c..7f406c11c02 100644 --- a/addons/sale/report/sale_report_templates.xml +++ b/addons/sale/report/sale_report_templates.xml @@ -42,9 +42,9 @@ Your Reference:

-

- Date Ordered: -

+

+ Order Date: +

Quotation Date: diff --git a/addons/sale/report/sale_report_views.xml b/addons/sale/report/sale_report_views.xml index be03f02cccd..cd2c2ec421f 100644 --- a/addons/sale/report/sale_report_views.xml +++ b/addons/sale/report/sale_report_views.xml @@ -7,7 +7,7 @@ - + @@ -18,7 +18,7 @@ sale.report - + @@ -57,7 +57,6 @@ - diff --git a/addons/sale/views/sale_portal_templates.xml b/addons/sale/views/sale_portal_templates.xml index d67a37a5287..ec772f81fe9 100644 --- a/addons/sale/views/sale_portal_templates.xml +++ b/addons/sale/views/sale_portal_templates.xml @@ -47,7 +47,7 @@ Quotation # - Order Date + Quotation Date Valid Until Total @@ -376,7 +376,13 @@
- Date: + + Quotation Date: + + + Order Date: + +
Expiration Date: diff --git a/addons/sale/views/sale_views.xml b/addons/sale/views/sale_views.xml index 55816e2aca9..a5be726630c 100644 --- a/addons/sale/views/sale_views.xml +++ b/addons/sale/views/sale_views.xml @@ -189,7 +189,7 @@ - + @@ -213,7 +213,7 @@ - + @@ -300,7 +300,14 @@ - +
+
+ +
+
+ @@ -606,7 +613,6 @@ - @@ -720,7 +726,7 @@ - + @@ -1253,7 +1259,7 @@ sale.report graph [('state','not in',('draft','cancel'))] - {'search_default_Sales': 1, 'time_ranges': {'field':'confirmation_date', 'range':'last_30_days'}, 'search_default_team_id': [active_id]} + {'search_default_Sales': 1, 'time_ranges': {'field':'date_order', 'range':'last_30_days'}, 'search_default_team_id': [active_id]} This report performs analysis on your sales orders. Analysis check your sales revenues and sort it by different group criteria (salesman, partner, product, etc.) Use this report to perform analysis on sales not having invoiced yet. If you want to analyse your turnover, you should use the Invoice Analysis report in the Accounting application. diff --git a/addons/sale_crm/models/crm_team.py b/addons/sale_crm/models/crm_team.py index 183f6cc03a2..1138d897262 100644 --- a/addons/sale_crm/models/crm_team.py +++ b/addons/sale_crm/models/crm_team.py @@ -25,7 +25,7 @@ class CrmTeam(models.Model): def _graph_date_column(self): if self.use_opportunities and self._context.get('in_sales_app'): - return 'confirmation_date' + return 'date_order' return super(CrmTeam,self)._graph_date_column() def _graph_y_query(self): diff --git a/addons/sale_management/models/digest.py b/addons/sale_management/models/digest.py index 7ddf5d27d1f..e73309188d3 100644 --- a/addons/sale_management/models/digest.py +++ b/addons/sale_management/models/digest.py @@ -17,8 +17,9 @@ class Digest(models.Model): for record in self: start, end, company = record._get_kpi_compute_parameters() all_channels_sales = self.env['sale.report'].read_group([ - ('confirmation_date', '>=', start), - ('confirmation_date', '<', end), + ('date_order', '>=', start), + ('date_order', '<', end), + ('state', 'not in', ['draft', 'cancel', 'sent']), ('company_id', '=', company.id)], ['price_total'], ['price_total']) record.kpi_all_sale_total_value = sum([channel_sale['price_total'] for channel_sale in all_channels_sales]) diff --git a/addons/sale_stock/models/sale_order.py b/addons/sale_stock/models/sale_order.py index 46cf1e16eb7..4d13c64f9af 100644 --- a/addons/sale_stock/models/sale_order.py +++ b/addons/sale_stock/models/sale_order.py @@ -49,7 +49,7 @@ class SaleOrder(models.Model): super(SaleOrder, self)._compute_expected_date() for order in self: dates_list = [] - confirm_date = fields.Datetime.from_string(order.confirmation_date if order.state in ['sale', 'done'] else fields.Datetime.now()) + confirm_date = fields.Datetime.from_string(order.date_order if order.state in ['sale', 'done'] else fields.Datetime.now()) for line in order.order_line.filtered(lambda x: x.state != 'cancel' and not x._is_delivery()): dt = confirm_date + timedelta(days=line.customer_lead or 0.0) dates_list.append(dt) @@ -377,7 +377,7 @@ class SaleOrderLine(models.Model): """ values = super(SaleOrderLine, self)._prepare_procurement_values(group_id) self.ensure_one() - date_planned = self.order_id.confirmation_date\ + date_planned = self.order_id.date_order\ + timedelta(days=self.customer_lead or 0.0) - timedelta(days=self.order_id.company_id.security_lead) values.update({ 'group_id': group_id, diff --git a/addons/sale_stock/tests/test_sale_order_dates.py b/addons/sale_stock/tests/test_sale_order_dates.py index a28195d86b5..4cf0ae8823a 100644 --- a/addons/sale_stock/tests/test_sale_order_dates.py +++ b/addons/sale_stock/tests/test_sale_order_dates.py @@ -63,7 +63,7 @@ class TestSaleExpectedDate(common.TransactionCase): # Setting confirmation date of SO to 5 days from today so that the expected/effective date could be checked # against real confirmation date confirm_date = fields.Datetime.now() + timedelta(days=5) - sale_order.write({'confirmation_date': confirm_date}) + sale_order.write({'date_order': confirm_date}) # if Shipping Policy is set to `one`(when SO is confirmed) then expected date should be # SO confirmation date + longest lead time from all of it's order lines diff --git a/addons/sale_stock/views/stock_production_lot_views.xml b/addons/sale_stock/views/stock_production_lot_views.xml index 7bc4ab22f3c..817285d258e 100644 --- a/addons/sale_stock/views/stock_production_lot_views.xml +++ b/addons/sale_stock/views/stock_production_lot_views.xml @@ -24,7 +24,7 @@ - + diff --git a/addons/website_sale/controllers/backend.py b/addons/website_sale/controllers/backend.py index 11020969286..5da4d518e9d 100644 --- a/addons/website_sale/controllers/backend.py +++ b/addons/website_sale/controllers/backend.py @@ -46,8 +46,8 @@ class WebsiteSaleBackend(WebsiteBackend): domain=[ ('website_id', '=', current_website.id), ('state', 'in', ['sale', 'done']), - ('confirmation_date', '>=', date_from), - ('confirmation_date', '<=', fields.Datetime.now())], + ('date_order', '>=', date_from), + ('date_order', '<=', fields.Datetime.now())], fields=['product_tmpl_id', 'product_uom_qty', 'price_subtotal'], groupby='product_tmpl_id', orderby='product_uom_qty desc', limit=5) for product_line in report_product_lines: @@ -117,8 +117,8 @@ class WebsiteSaleBackend(WebsiteBackend): sales_domain = [ ('website_id', '=', current_website.id), ('state', 'in', ['sale', 'done']), - ('confirmation_date', '>=', date_from), - ('confirmation_date', '<=', fields.Datetime.now()) + ('date_order', '>=', date_from), + ('date_order', '<=', fields.Datetime.now()) ] sales_values['graph'] += [{ 'values': self._compute_sale_graph(date_date_from, date_date_to, sales_domain), @@ -134,8 +134,8 @@ class WebsiteSaleBackend(WebsiteBackend): sale_utm_domain = [ ('website_id', '!=', False), ('state', 'in', ['sale', 'done']), - ('confirmation_date', '>=', date_from), - ('confirmation_date', '<=', date_to) + ('date_order', '>=', date_from), + ('date_order', '<=', date_to) ] orders_data_groupby_campaign_id = request.env['sale.order'].read_group( @@ -171,10 +171,10 @@ class WebsiteSaleBackend(WebsiteBackend): daily_sales = request.env['sale.report'].read_group( domain=sales_domain, - fields=['confirmation_date', 'price_subtotal'], - groupby='confirmation_date:day') + fields=['date_order', 'price_subtotal'], + groupby='date_order:day') - daily_sales_dict = {p['confirmation_date:day']: p['price_subtotal'] for p in daily_sales} + daily_sales_dict = {p['date_order:day']: p['price_subtotal'] for p in daily_sales} sales_graph = [{ '0': fields.Date.to_string(d) if not previous else fields.Date.to_string(d + timedelta(days=days_between)), diff --git a/addons/website_sale/data/demo.xml b/addons/website_sale/data/demo.xml index d4752f1778e..dd27704fa7a 100644 --- a/addons/website_sale/data/demo.xml +++ b/addons/website_sale/data/demo.xml @@ -287,7 +287,6 @@ - sale @@ -309,7 +308,6 @@ - sale @@ -331,7 +329,6 @@ - sale @@ -353,7 +350,6 @@ - sale @@ -375,7 +371,6 @@ - sale @@ -397,7 +392,6 @@ - sale @@ -419,7 +413,6 @@ - sale @@ -440,7 +433,6 @@ - sale @@ -571,7 +563,6 @@ - sale @@ -593,7 +584,6 @@ - @@ -615,7 +605,6 @@ - diff --git a/addons/website_sale/models/digest.py b/addons/website_sale/models/digest.py index aed881ce5fb..276a5b54618 100644 --- a/addons/website_sale/models/digest.py +++ b/addons/website_sale/models/digest.py @@ -17,8 +17,8 @@ class Digest(models.Model): for record in self: start, end, company = record._get_kpi_compute_parameters() confirmed_website_sales = self.env['sale.order'].search([ - ('confirmation_date', '>=', start), - ('confirmation_date', '<', end), + ('date_order', '>=', start), + ('date_order', '<', end), ('state', 'not in', ['draft', 'cancel', 'sent']), ('website_id', '!=', False), ('company_id', '=', company.id) diff --git a/addons/website_sale/views/sale_report_views.xml b/addons/website_sale/views/sale_report_views.xml index c8876ed6416..16ec77ae641 100644 --- a/addons/website_sale/views/sale_report_views.xml +++ b/addons/website_sale/views/sale_report_views.xml @@ -21,7 +21,6 @@ - diff --git a/addons/website_sale_slides/data/sale_order_demo.xml b/addons/website_sale_slides/data/sale_order_demo.xml index ecb50a77d79..c05e1a200c8 100644 --- a/addons/website_sale_slides/data/sale_order_demo.xml +++ b/addons/website_sale_slides/data/sale_order_demo.xml @@ -12,7 +12,6 @@ - sale @@ -34,7 +33,6 @@ - sale diff --git a/addons/website_sale_slides/report/sale_report_views.xml b/addons/website_sale_slides/report/sale_report_views.xml index 14d3bebd3c8..319f7301a6f 100644 --- a/addons/website_sale_slides/report/sale_report_views.xml +++ b/addons/website_sale_slides/report/sale_report_views.xml @@ -5,7 +5,7 @@ sale.report - + @@ -17,7 +17,7 @@ ir.actions.act_window graph,pivot [("product_id.channel_ids", "!=", False)] - {'group_by': ['confirmation_date', 'product_id']} + {'group_by': ['date', 'product_id']}