From 95eb2c5a013586b42a01d4ce60eeec7bd1355f39 Mon Sep 17 00:00:00 2001 From: Numerigraphe - Lionel Sausin Date: Tue, 13 Dec 2011 16:17:09 +0100 Subject: [PATCH 01/18] [IMP] sale_order_date: use requested date when creating pickings ; improved help texts bzr revid: ls@numerigraphe.fr-20111213151709-37cm140n28lh7lee --- addons/sale_order_dates/__openerp__.py | 2 +- addons/sale_order_dates/sale_order_dates.py | 24 +++++++++++++++++---- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/addons/sale_order_dates/__openerp__.py b/addons/sale_order_dates/__openerp__.py index 72aa496b6bc..a0a546840e5 100644 --- a/addons/sale_order_dates/__openerp__.py +++ b/addons/sale_order_dates/__openerp__.py @@ -22,7 +22,7 @@ { 'name': 'Dates on Sales Order', - 'version': '1.0', + 'version': '1.1', 'category': 'Sales Management', 'complexity': "easy", 'description': """ diff --git a/addons/sale_order_dates/sale_order_dates.py b/addons/sale_order_dates/sale_order_dates.py index ceb6d48755c..05dd0170d9b 100644 --- a/addons/sale_order_dates/sale_order_dates.py +++ b/addons/sale_order_dates/sale_order_dates.py @@ -25,9 +25,11 @@ from dateutil.relativedelta import relativedelta from osv import fields, osv class sale_order_dates(osv.osv): + """Add several date fields to Sale Orders, computed or user-entered""" _inherit = 'sale.order' def _get_effective_date(self, cr, uid, ids, name, arg, context=None): + """Read the shipping date from the related packings""" res = {} dates_list = [] for order in self.browse(cr, uid, ids, context=context): @@ -39,14 +41,23 @@ class sale_order_dates(osv.osv): else: res[order.id] = False return res + + def _prepare_order_picking(self, cr, uid, order, *args): + """Take the requested date into account when creating the picking""" + picking_data = super(sale_order_dates, self)._prepare_order_picking(cr, + uid, order, *args) + picking_data['date'] = order.requested_date + return picking_data def _get_commitment_date(self, cr, uid, ids, name, arg, context=None): + """Compute the commitment date""" res = {} dates_list = [] for order in self.browse(cr, uid, ids, context=context): dates_list = [] for line in order.order_line: - dt = datetime.strptime(order.date_order, '%Y-%m-%d') + relativedelta(days=line.delay or 0.0) + dt = (datetime.strptime(order.date_order, '%Y-%m-%d') + + relativedelta(days=line.delay or 0.0) ) dt_s = dt.strftime('%Y-%m-%d') dates_list.append(dt_s) if dates_list: @@ -54,9 +65,14 @@ class sale_order_dates(osv.osv): return res _columns = { - 'commitment_date': fields.function(_get_commitment_date, store=True, type='date', string='Commitment Date', help="Date on which delivery of products is to be made."), - 'requested_date': fields.date('Requested Date', help="Date on which customer has requested for sales."), - 'effective_date': fields.function(_get_effective_date, type='date', store=True, string='Effective Date',help="Date on which picking is created."), + 'commitment_date': fields.function(_get_commitment_date, store=True, + type='date', string='Commitment Date', + help="Date by which the products must be delivered."), + 'requested_date': fields.date('Requested Date', + help="Date by which the customer has requested the products to be delivered."), + 'effective_date': fields.function(_get_effective_date, type='date', + store=True, string='Effective Date', + help="Date on which shipping is created."), } sale_order_dates() From 1baca5880909a2146c5aac9b4af916caed2d89be Mon Sep 17 00:00:00 2001 From: Numerigraphe - Lionel Sausin Date: Tue, 13 Dec 2011 18:28:59 +0100 Subject: [PATCH 02/18] [IMP] sale_order_dates: warn users when the requested date is before the commitment date bzr revid: ls@numerigraphe.fr-20111213172859-06vmdnpzapu6kb0h --- addons/sale_order_dates/sale_order_dates.py | 41 ++++++++++++++++++- .../sale_order_dates_view.xml | 2 +- 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/addons/sale_order_dates/sale_order_dates.py b/addons/sale_order_dates/sale_order_dates.py index 05dd0170d9b..71a436aa4b4 100644 --- a/addons/sale_order_dates/sale_order_dates.py +++ b/addons/sale_order_dates/sale_order_dates.py @@ -23,6 +23,8 @@ from datetime import datetime from dateutil.relativedelta import relativedelta from osv import fields, osv +from tools.translate import _ +from tools import DEFAULT_SERVER_DATE_FORMAT class sale_order_dates(osv.osv): """Add several date fields to Sale Orders, computed or user-entered""" @@ -56,14 +58,49 @@ class sale_order_dates(osv.osv): for order in self.browse(cr, uid, ids, context=context): dates_list = [] for line in order.order_line: - dt = (datetime.strptime(order.date_order, '%Y-%m-%d') + dt = (datetime.strptime(order.date_order, + DEFAULT_SERVER_DATE_FORMAT) + relativedelta(days=line.delay or 0.0) ) - dt_s = dt.strftime('%Y-%m-%d') + dt_s = dt.strftime(DEFAULT_SERVER_DATE_FORMAT) dates_list.append(dt_s) if dates_list: res[order.id] = min(dates_list) return res + def onchange_requested_date(self, cr, uid, ids, requested_date, + commitment_date, context=None): + """Warn if the requested dates is sooner than the commitment date""" + if requested_date < commitment_date: + lang = self.pool.get("res.users").browse(cr, uid, uid, + context=context).context_lang + if lang: + lang_ids = self.pool.get('res.lang').search(cr, uid, + [('code', '=', lang)]) + date_format = self.pool.get("res.lang").browse(cr, uid, + lang_ids, context=context)[0].date_format + # Parse the dates... + req_date_formated = datetime.strptime(requested_date, + DEFAULT_SERVER_DATE_FORMAT) + com_date_formated = datetime.strptime(commitment_date, + DEFAULT_SERVER_DATE_FORMAT) + # ... and reformat them according to the user's language + req_date_formated = req_date_formated.strftime(date_format) + com_date_formated = com_date_formated.strftime(date_format) + else: + req_date_formated = requested_date + com_date_formated = commitment_date + print lang, req_date_formated, com_date_formated + return {'warning': { + 'title': _('Requested date is too soon!'), + 'message': _("The date requested by the customer (%s) is " + "sooner than the commitment date (%s). You may be " + "unable to honor the customer's request." % + (req_date_formated, com_date_formated)) + } + } + else: + return {} + _columns = { 'commitment_date': fields.function(_get_commitment_date, store=True, type='date', string='Commitment Date', diff --git a/addons/sale_order_dates/sale_order_dates_view.xml b/addons/sale_order_dates/sale_order_dates_view.xml index c6544d5238f..f1be2e414f1 100644 --- a/addons/sale_order_dates/sale_order_dates_view.xml +++ b/addons/sale_order_dates/sale_order_dates_view.xml @@ -9,7 +9,7 @@ - + From 939177c4a4a5faa6e3eef611391e06a271450b0c Mon Sep 17 00:00:00 2001 From: "Ferdinand @ Camptocamp (office-chricar)" <> Date: Wed, 14 Dec 2011 09:41:34 +0100 Subject: [PATCH 03/18] [IMP] sale_order_dates - enhanced tree view lp bug: https://launchpad.net/bugs/753291 fixed bzr revid: ls@numerigraphe.fr-20111214084134-b3v3tqiwjys2kk9r --- addons/sale_order_dates/sale_order_dates_view.xml | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/addons/sale_order_dates/sale_order_dates_view.xml b/addons/sale_order_dates/sale_order_dates_view.xml index f1be2e414f1..9ed13a37211 100644 --- a/addons/sale_order_dates/sale_order_dates_view.xml +++ b/addons/sale_order_dates/sale_order_dates_view.xml @@ -17,6 +17,17 @@ + + sale.order.tree.inherit5 + sale.order + tree + + + + + + + - \ No newline at end of file + From aac17e39803d5d838d214ab0deaec05660f629bb Mon Sep 17 00:00:00 2001 From: Numerigraphe - Lionel Sausin Date: Wed, 14 Dec 2011 09:43:55 +0100 Subject: [PATCH 04/18] [IMP] sale_order_dates: display requested date in tree view too bzr revid: ls@numerigraphe.fr-20111214084355-j69ihsirz1dq5gdr --- addons/sale_order_dates/sale_order_dates_view.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/sale_order_dates/sale_order_dates_view.xml b/addons/sale_order_dates/sale_order_dates_view.xml index 9ed13a37211..c57512c6d1e 100644 --- a/addons/sale_order_dates/sale_order_dates_view.xml +++ b/addons/sale_order_dates/sale_order_dates_view.xml @@ -24,6 +24,7 @@ + From dbfc97552f75b71fafb9cd8670a232693ccd343c Mon Sep 17 00:00:00 2001 From: Numerigraphe - Lionel Sausin Date: Wed, 14 Dec 2011 15:59:47 +0100 Subject: [PATCH 05/18] [REF] refactor the stock move date out of the main picking creation method so we can override it bzr revid: ls@numerigraphe.fr-20111214145947-fj0z84q3w1t37003 --- addons/sale/sale.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/addons/sale/sale.py b/addons/sale/sale.py index 9f53b5cfd24..f0c981bc13a 100644 --- a/addons/sale/sale.py +++ b/addons/sale/sale.py @@ -706,6 +706,16 @@ class sale_order(osv.osv): 'property_ids': [(6, 0, [x.id for x in line.property_ids])], 'company_id': order.company_id.id, } + + def _order_line_move_date(self, cr, uid, line): + """Compute the Stock Move date for the Sale Order Line""" + date_planned = datetime.strptime(line.order_id.date_order, + DEFAULT_SERVER_DATE_FORMAT) + # XXX shouldn't this be a timedelta() instead of a relativedelta()? + date_planned += relativedelta(days=line.delay or 0.0) + date_planned -= timedelta(days=line.order_id.company_id.security_lead) + return date_planned.strftime(DEFAULT_SERVER_DATETIME_FORMAT) + def _prepare_order_line_move(self, cr, uid, order, line, picking_id, date_planned, *args): location_id = order.shop_id.warehouse_id.lot_stock_id.id @@ -778,8 +788,7 @@ class sale_order(osv.osv): if line.state == 'done': continue - date_planned = datetime.strptime(order.date_order, DEFAULT_SERVER_DATE_FORMAT) + relativedelta(days=line.delay or 0.0) - date_planned = (date_planned - timedelta(days=order.company_id.security_lead)).strftime(DEFAULT_SERVER_DATETIME_FORMAT) + date_planned = self._order_line_move_date(cr, uid, line) if line.product_id: if line.product_id.product_tmpl_id.type in ('product', 'consu'): From e83bd89ca7d2be0220d1ccd95f8cfa35d3249c8f Mon Sep 17 00:00:00 2001 From: Numerigraphe - Lionel Sausin Date: Wed, 14 Dec 2011 16:37:43 +0100 Subject: [PATCH 06/18] [IMP] sale_order_date: use requested date as expected date for moves instead of order date for picking; fix the onchange for requested date becoming empty; improve help texts bzr revid: ls@numerigraphe.fr-20111214153743-ggpljq1z85ggeboh --- addons/sale_order_dates/sale_order_dates.py | 44 ++++++++++++++------- 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/addons/sale_order_dates/sale_order_dates.py b/addons/sale_order_dates/sale_order_dates.py index 71a436aa4b4..2435df92671 100644 --- a/addons/sale_order_dates/sale_order_dates.py +++ b/addons/sale_order_dates/sale_order_dates.py @@ -19,19 +19,31 @@ # ############################################################################## -from datetime import datetime +from datetime import datetime, timedelta from dateutil.relativedelta import relativedelta from osv import fields, osv from tools.translate import _ -from tools import DEFAULT_SERVER_DATE_FORMAT +from tools import DEFAULT_SERVER_DATE_FORMAT, DEFAULT_SERVER_DATETIME_FORMAT class sale_order_dates(osv.osv): """Add several date fields to Sale Orders, computed or user-entered""" _inherit = 'sale.order' - + + def _order_line_move_date(self, cr, uid, line): + """Compute the expected date from the requested date, not the order date""" + order=line.order_id + if order and order.requested_date: + date_planned = datetime.strptime(order.requested_date, + DEFAULT_SERVER_DATE_FORMAT) + date_planned -= timedelta(days=order.company_id.security_lead) + return date_planned.strftime(DEFAULT_SERVER_DATETIME_FORMAT) + else: + return super(sale_order_dates, self)._order_line_move_date(cr, uid, line) + def _get_effective_date(self, cr, uid, ids, name, arg, context=None): """Read the shipping date from the related packings""" + # XXX would be better if it returned the date the picking was processed res = {} dates_list = [] for order in self.browse(cr, uid, ids, context=context): @@ -43,13 +55,6 @@ class sale_order_dates(osv.osv): else: res[order.id] = False return res - - def _prepare_order_picking(self, cr, uid, order, *args): - """Take the requested date into account when creating the picking""" - picking_data = super(sale_order_dates, self)._prepare_order_picking(cr, - uid, order, *args) - picking_data['date'] = order.requested_date - return picking_data def _get_commitment_date(self, cr, uid, ids, name, arg, context=None): """Compute the commitment date""" @@ -70,7 +75,8 @@ class sale_order_dates(osv.osv): def onchange_requested_date(self, cr, uid, ids, requested_date, commitment_date, context=None): """Warn if the requested dates is sooner than the commitment date""" - if requested_date < commitment_date: + if (requested_date and commitment_date + and requested_date < commitment_date): lang = self.pool.get("res.users").browse(cr, uid, uid, context=context).context_lang if lang: @@ -104,12 +110,22 @@ class sale_order_dates(osv.osv): _columns = { 'commitment_date': fields.function(_get_commitment_date, store=True, type='date', string='Commitment Date', - help="Date by which the products must be delivered."), + help="Date by which the products is sure to be delivered. This is " + "a date that you can promise to the customer, based on the " + "Product Lead Times."), 'requested_date': fields.date('Requested Date', - help="Date by which the customer has requested the products to be delivered."), + help="Date by which the customer has requested the items to be " + "delivered.\n" + "When this Order gets confirmed, the Delivery Order's " + "expected date will be computed based on this date and the " + "Company's Security Delay.\n" + "Leave this field empty if you want the Delivery Order to be " + "processed as soon as possible. In that case the expected " + "date will be computed using the default method: based on " + "the Product Lead Times and the Company's Security Delay."), 'effective_date': fields.function(_get_effective_date, type='date', store=True, string='Effective Date', - help="Date on which shipping is created."), + help="Date on which the first Delivery Order was created."), } sale_order_dates() From 0e12b870f7eef3022c6216eba7f747343b477ed9 Mon Sep 17 00:00:00 2001 From: Numerigraphe - Lionel Sausin Date: Wed, 14 Dec 2011 16:41:06 +0100 Subject: [PATCH 07/18] [IMP] sale_delivery_date: don't copy the requested date when coying sale order. bzr revid: ls@numerigraphe.fr-20111214154106-lmsrlt8w211fsgc9 --- addons/sale_order_dates/sale_order_dates.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/addons/sale_order_dates/sale_order_dates.py b/addons/sale_order_dates/sale_order_dates.py index 2435df92671..8d3b9e3b232 100644 --- a/addons/sale_order_dates/sale_order_dates.py +++ b/addons/sale_order_dates/sale_order_dates.py @@ -29,6 +29,16 @@ from tools import DEFAULT_SERVER_DATE_FORMAT, DEFAULT_SERVER_DATETIME_FORMAT class sale_order_dates(osv.osv): """Add several date fields to Sale Orders, computed or user-entered""" _inherit = 'sale.order' + + def copy(self, cr, uid, id, default=None, context=None): + """Don't copy the requested date along with the Sale Order""" + if default is None: + default = {} + else: + default = default.copy() + default['requested_date'] = False + return super(sale_order_dates, self).copy(cr, uid, id, default=default, + context=context) def _order_line_move_date(self, cr, uid, line): """Compute the expected date from the requested date, not the order date""" From 0b4bb899ce303bf71ab590f74405ee5e33948443 Mon Sep 17 00:00:00 2001 From: Numerigraphe - Lionel Sausin Date: Wed, 14 Dec 2011 16:43:17 +0100 Subject: [PATCH 08/18] [IMP] sale_order_dates: requested date is readonly when order state is not draft. bzr revid: ls@numerigraphe.fr-20111214154317-05xy0q2np7cqrpg0 --- addons/sale_order_dates/sale_order_dates.py | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/sale_order_dates/sale_order_dates.py b/addons/sale_order_dates/sale_order_dates.py index 8d3b9e3b232..d53e05010a2 100644 --- a/addons/sale_order_dates/sale_order_dates.py +++ b/addons/sale_order_dates/sale_order_dates.py @@ -124,6 +124,7 @@ class sale_order_dates(osv.osv): "a date that you can promise to the customer, based on the " "Product Lead Times."), 'requested_date': fields.date('Requested Date', + readonly=True, states={'draft': [('readonly', False)]}, help="Date by which the customer has requested the items to be " "delivered.\n" "When this Order gets confirmed, the Delivery Order's " From f49260dc5c764e823e5416d355df62da8e38ec35 Mon Sep 17 00:00:00 2001 From: Numerigraphe - Lionel Sausin Date: Wed, 14 Dec 2011 18:09:13 +0100 Subject: [PATCH 09/18] [IMP] sale_order_dates: add a test file to prove the required date is taken into account when creating the delivery order; fixed onchange parameters in view; removed a debugging print statement bzr revid: ls@numerigraphe.fr-20111214170913-1iwc8tsix19db2ky --- addons/sale_order_dates/__openerp__.py | 4 +- addons/sale_order_dates/sale_order_dates.py | 1 - .../sale_order_dates_view.xml | 2 +- .../sale_order_dates/test/requested_date.yml | 83 +++++++++++++++++++ 4 files changed, 87 insertions(+), 3 deletions(-) create mode 100644 addons/sale_order_dates/test/requested_date.yml diff --git a/addons/sale_order_dates/__openerp__.py b/addons/sale_order_dates/__openerp__.py index a0a546840e5..92f7bab5db3 100644 --- a/addons/sale_order_dates/__openerp__.py +++ b/addons/sale_order_dates/__openerp__.py @@ -46,7 +46,9 @@ You can add the following additional dates to a sale order: ], 'demo_xml': [ ], - 'test': [], + 'test': [ + 'test/requested_date.yml', + ], 'installable': True, 'active': False, 'certificate' : '00867497685972962845', diff --git a/addons/sale_order_dates/sale_order_dates.py b/addons/sale_order_dates/sale_order_dates.py index d53e05010a2..11e3483672b 100644 --- a/addons/sale_order_dates/sale_order_dates.py +++ b/addons/sale_order_dates/sale_order_dates.py @@ -105,7 +105,6 @@ class sale_order_dates(osv.osv): else: req_date_formated = requested_date com_date_formated = commitment_date - print lang, req_date_formated, com_date_formated return {'warning': { 'title': _('Requested date is too soon!'), 'message': _("The date requested by the customer (%s) is " diff --git a/addons/sale_order_dates/sale_order_dates_view.xml b/addons/sale_order_dates/sale_order_dates_view.xml index c57512c6d1e..f66f9e144c7 100644 --- a/addons/sale_order_dates/sale_order_dates_view.xml +++ b/addons/sale_order_dates/sale_order_dates_view.xml @@ -9,7 +9,7 @@ - + diff --git a/addons/sale_order_dates/test/requested_date.yml b/addons/sale_order_dates/test/requested_date.yml new file mode 100644 index 00000000000..07fb131a6cf --- /dev/null +++ b/addons/sale_order_dates/test/requested_date.yml @@ -0,0 +1,83 @@ +- + + I create Demanding Corp. +- + !record {model: res.partner, id: demanding}: + name: Demanding Corp. +- + I create contact address for Demanding Corp. +- + !record {model: res.partner.address, id: demanding_address}: + partner_id: demanding + street: Requirement St. 11 + type: contact +- + I define a product category +- + !record {model: product.category, id: categ_test}: + name: Products for test +- + I define a product. +- + !record {model: product.product, id: test_product}: + categ_id: categ_test + cost_method: standard + mes_type: fixed + name: Dummy Product + procure_method: make_to_order + supply_method: buy + type: product + uom_id: product.product_uom_unit + uom_po_id: product.product_uom_unit +- + In order to test the Requested Date feature in Sale Orders in OpenERP, + I create a Sale Order having Requested Date on 2010-12-20 +- + !record {model: sale.order, id: sale_order_requested_date1}: + date_order: '2010-12-01' + requested_date: '2010-07-17' + invoice_quantity: order + name: Test_ReqDate + order_line: + - name: Dummy product + price_unit: 200 + product_uom: product.product_uom_unit + product_uom_qty: 500.0 + state: draft + delay: 7.0 + product_id: test_product + product_uos_qty: 500.0 + type: make_to_order + order_policy: manual + partner_id: demanding + partner_invoice_id: demanding_address + partner_order_id: demanding_address + partner_shipping_id: demanding_address + picking_policy: direct + pricelist_id: product.list0 + shop_id: sale.shop +- + I confirm the Sale Order. +- + !workflow { + model: sale.order, action: order_confirm, + ref: sale_order_requested_date1 + } +- + I verify that the Procurements and Stock Moves have been generated with the + correct date +- + !python {model: sale.order}: | + from datetime import datetime, timedelta + from tools import DEFAULT_SERVER_DATE_FORMAT, DEFAULT_SERVER_DATETIME_FORMAT + + so = self.browse(cr, uid, ref("sale_order_requested_date1")) + security_delay = timedelta(days=so.shop_id.company_id.security_lead) + requested_date = datetime.strptime(so.requested_date, + DEFAULT_SERVER_DATE_FORMAT) + right_date = (requested_date - security_delay).strftime( + DEFAULT_SERVER_DATETIME_FORMAT) + for line in so.order_line: + assert line.procurement_id, "No Procurement was created" + assert line.procurement_id.date_planned == right_date, "The planned date for the Procurement Order is wrong" + assert line.procurement_id.move_id.date_expected == right_date, "The expected date for the Stock Move is wrong" From ce5d6ffe1d6bd94629fcf748f60ac43a0de35178 Mon Sep 17 00:00:00 2001 From: Numerigraphe - Lionel Sausin Date: Wed, 4 Jan 2012 16:55:14 +0100 Subject: [PATCH 10/18] [REF] sale: use timedelta. This was suggested by O. Dony: 'datetime.timedelta and dateutil.relativedelta are equivalent for our purpose here, so you can safely change to use the same one for both lines (relativedelta supports extended use cases, such as months/years deltas)' bzr revid: ls@numerigraphe.fr-20120104155514-357k2ky3tfbkmkpu --- addons/sale/sale.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/addons/sale/sale.py b/addons/sale/sale.py index f0c981bc13a..f06a7668309 100644 --- a/addons/sale/sale.py +++ b/addons/sale/sale.py @@ -20,7 +20,6 @@ ############################################################################## from datetime import datetime, timedelta -from dateutil.relativedelta import relativedelta import time import pooler from osv import fields, osv @@ -711,8 +710,7 @@ class sale_order(osv.osv): """Compute the Stock Move date for the Sale Order Line""" date_planned = datetime.strptime(line.order_id.date_order, DEFAULT_SERVER_DATE_FORMAT) - # XXX shouldn't this be a timedelta() instead of a relativedelta()? - date_planned += relativedelta(days=line.delay or 0.0) + date_planned += timedelta(days=line.delay or 0.0) date_planned -= timedelta(days=line.order_id.company_id.security_lead) return date_planned.strftime(DEFAULT_SERVER_DATETIME_FORMAT) From 69a132dd7eda0e1ed451bba84738fac61578cd6c Mon Sep 17 00:00:00 2001 From: Numerigraphe - Lionel Sausin Date: Wed, 4 Jan 2012 16:58:11 +0100 Subject: [PATCH 11/18] [REF] sale_order_date: use timedelta only. bzr revid: ls@numerigraphe.fr-20120104155811-2eofblu9zclr9brn --- addons/sale_order_dates/sale_order_dates.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/addons/sale_order_dates/sale_order_dates.py b/addons/sale_order_dates/sale_order_dates.py index 11e3483672b..118d2f2d320 100644 --- a/addons/sale_order_dates/sale_order_dates.py +++ b/addons/sale_order_dates/sale_order_dates.py @@ -20,7 +20,6 @@ ############################################################################## from datetime import datetime, timedelta -from dateutil.relativedelta import relativedelta from osv import fields, osv from tools.translate import _ @@ -75,7 +74,7 @@ class sale_order_dates(osv.osv): for line in order.order_line: dt = (datetime.strptime(order.date_order, DEFAULT_SERVER_DATE_FORMAT) - + relativedelta(days=line.delay or 0.0) ) + + timedelta(days=line.delay or 0.0) ) dt_s = dt.strftime(DEFAULT_SERVER_DATE_FORMAT) dates_list.append(dt_s) if dates_list: From f2235451f014019f08b53ffa962529dc3bfb4f87 Mon Sep 17 00:00:00 2001 From: Numerigraphe - Lionel Sausin Date: Wed, 4 Jan 2012 17:02:03 +0100 Subject: [PATCH 12/18] [IMP] sale_order_date: simplify the on_change method as suggested by O. Dony bzr revid: ls@numerigraphe.fr-20120104160203-98b4yquttjhgirjl --- addons/sale_order_dates/sale_order_dates.py | 25 +++------------------ 1 file changed, 3 insertions(+), 22 deletions(-) diff --git a/addons/sale_order_dates/sale_order_dates.py b/addons/sale_order_dates/sale_order_dates.py index 118d2f2d320..7b00d55267f 100644 --- a/addons/sale_order_dates/sale_order_dates.py +++ b/addons/sale_order_dates/sale_order_dates.py @@ -86,30 +86,11 @@ class sale_order_dates(osv.osv): """Warn if the requested dates is sooner than the commitment date""" if (requested_date and commitment_date and requested_date < commitment_date): - lang = self.pool.get("res.users").browse(cr, uid, uid, - context=context).context_lang - if lang: - lang_ids = self.pool.get('res.lang').search(cr, uid, - [('code', '=', lang)]) - date_format = self.pool.get("res.lang").browse(cr, uid, - lang_ids, context=context)[0].date_format - # Parse the dates... - req_date_formated = datetime.strptime(requested_date, - DEFAULT_SERVER_DATE_FORMAT) - com_date_formated = datetime.strptime(commitment_date, - DEFAULT_SERVER_DATE_FORMAT) - # ... and reformat them according to the user's language - req_date_formated = req_date_formated.strftime(date_format) - com_date_formated = com_date_formated.strftime(date_format) - else: - req_date_formated = requested_date - com_date_formated = commitment_date return {'warning': { 'title': _('Requested date is too soon!'), - 'message': _("The date requested by the customer (%s) is " - "sooner than the commitment date (%s). You may be " - "unable to honor the customer's request." % - (req_date_formated, com_date_formated)) + 'message': _("The date requested by the customer is " + "sooner than the commitment date. You may be " + "unable to honor the customer's request.") } } else: From 6b267821a54617a3b35f0b379990c5b375f54e84 Mon Sep 17 00:00:00 2001 From: Numerigraphe - Lionel Sausin Date: Wed, 4 Jan 2012 17:58:40 +0100 Subject: [PATCH 13/18] [FIX] sale_order_dates: allow the context to be passed to _order_line_move_date(). bzr revid: ls@numerigraphe.fr-20120104165840-f97w6mbdwcku6zpd --- addons/sale_order_dates/sale_order_dates.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/sale_order_dates/sale_order_dates.py b/addons/sale_order_dates/sale_order_dates.py index 7b00d55267f..5a48f1152b1 100644 --- a/addons/sale_order_dates/sale_order_dates.py +++ b/addons/sale_order_dates/sale_order_dates.py @@ -39,7 +39,7 @@ class sale_order_dates(osv.osv): return super(sale_order_dates, self).copy(cr, uid, id, default=default, context=context) - def _order_line_move_date(self, cr, uid, line): + def _order_line_move_date(self, cr, uid, line, context=None): """Compute the expected date from the requested date, not the order date""" order=line.order_id if order and order.requested_date: From 1146becd4dd76bae4a32e3c1c6fc5bb8380bda49 Mon Sep 17 00:00:00 2001 From: Numerigraphe - Lionel Sausin Date: Wed, 4 Jan 2012 18:05:58 +0100 Subject: [PATCH 14/18] [IMP] sale_order_date: simplify the test file. This was suggested by O. Dony: 'FYI due to the proliferation of yaml tests we're trying to enforce a stricter policy on the size of these tests, to make them easier to maintain. Therefore we ask developer to keep them as minimalist as possible, and not to introduce master data records (companies, partners, products, boms, etc.), and re-use the demo master data instead.' bzr revid: ls@numerigraphe.fr-20120104170558-td1geevul0ivb5s9 --- .../sale_order_dates/test/requested_date.yml | 62 ++----------------- 1 file changed, 5 insertions(+), 57 deletions(-) diff --git a/addons/sale_order_dates/test/requested_date.yml b/addons/sale_order_dates/test/requested_date.yml index 07fb131a6cf..cdeec445409 100644 --- a/addons/sale_order_dates/test/requested_date.yml +++ b/addons/sale_order_dates/test/requested_date.yml @@ -1,67 +1,15 @@ -- - - I create Demanding Corp. -- - !record {model: res.partner, id: demanding}: - name: Demanding Corp. -- - I create contact address for Demanding Corp. -- - !record {model: res.partner.address, id: demanding_address}: - partner_id: demanding - street: Requirement St. 11 - type: contact -- - I define a product category -- - !record {model: product.category, id: categ_test}: - name: Products for test -- - I define a product. -- - !record {model: product.product, id: test_product}: - categ_id: categ_test - cost_method: standard - mes_type: fixed - name: Dummy Product - procure_method: make_to_order - supply_method: buy - type: product - uom_id: product.product_uom_unit - uom_po_id: product.product_uom_unit - In order to test the Requested Date feature in Sale Orders in OpenERP, - I create a Sale Order having Requested Date on 2010-12-20 + I update a demo Sale Order with Requested Date on 2010-12-17 - - !record {model: sale.order, id: sale_order_requested_date1}: - date_order: '2010-12-01' - requested_date: '2010-07-17' - invoice_quantity: order - name: Test_ReqDate - order_line: - - name: Dummy product - price_unit: 200 - product_uom: product.product_uom_unit - product_uom_qty: 500.0 - state: draft - delay: 7.0 - product_id: test_product - product_uos_qty: 500.0 - type: make_to_order - order_policy: manual - partner_id: demanding - partner_invoice_id: demanding_address - partner_order_id: demanding_address - partner_shipping_id: demanding_address - picking_policy: direct - pricelist_id: product.list0 - shop_id: sale.shop + !python {model: sale.order}: | + so = self.write(cr, uid, ref("sale.order"), {'requested_date': '2010-07-12'}) - I confirm the Sale Order. - !workflow { model: sale.order, action: order_confirm, - ref: sale_order_requested_date1 + ref: sale.order } - I verify that the Procurements and Stock Moves have been generated with the @@ -71,7 +19,7 @@ from datetime import datetime, timedelta from tools import DEFAULT_SERVER_DATE_FORMAT, DEFAULT_SERVER_DATETIME_FORMAT - so = self.browse(cr, uid, ref("sale_order_requested_date1")) + so = self.browse(cr, uid, ref("sale.order")) security_delay = timedelta(days=so.shop_id.company_id.security_lead) requested_date = datetime.strptime(so.requested_date, DEFAULT_SERVER_DATE_FORMAT) From a5089441745ef2263b62bfeb2ba9921237d3fed5 Mon Sep 17 00:00:00 2001 From: Numerigraphe - Lionel Sausin Date: Thu, 5 Jan 2012 10:42:45 +0100 Subject: [PATCH 15/18] [IMP] module description for sale_order_date bzr revid: ls@numerigraphe.fr-20120105094245-2ovj0mkhz4clcgo0 --- addons/sale_order_dates/__openerp__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/sale_order_dates/__openerp__.py b/addons/sale_order_dates/__openerp__.py index 92f7bab5db3..605e100b8f5 100644 --- a/addons/sale_order_dates/__openerp__.py +++ b/addons/sale_order_dates/__openerp__.py @@ -30,7 +30,7 @@ Add additional date information to the sales order. =================================================== You can add the following additional dates to a sale order: - * Requested Date + * Requested Date (will be used as the expected date on pickings) * Commitment Date * Effective Date """, From f6d4e1451b56434d9b4abcd64dd6d865ec8a2b29 Mon Sep 17 00:00:00 2001 From: Numerigraphe - Lionel Sausin Date: Thu, 5 Jan 2012 10:53:51 +0100 Subject: [PATCH 16/18] [IMP] updated translation for sale_order_dates bzr revid: ls@numerigraphe.fr-20120105095351-y40njq7zpu70mc6a --- addons/sale_order_dates/i18n/es_MX.po.moved | 71 ------------------- addons/sale_order_dates/i18n/fr.po | 69 +++++++++--------- .../i18n/sale_order_dates.pot | 32 ++++++--- 3 files changed, 58 insertions(+), 114 deletions(-) delete mode 100644 addons/sale_order_dates/i18n/es_MX.po.moved diff --git a/addons/sale_order_dates/i18n/es_MX.po.moved b/addons/sale_order_dates/i18n/es_MX.po.moved deleted file mode 100644 index b682cb925d7..00000000000 --- a/addons/sale_order_dates/i18n/es_MX.po.moved +++ /dev/null @@ -1,71 +0,0 @@ -# Translation of OpenERP Server. -# This file contains the translation of the following modules: -# * sale_order_dates -# -msgid "" -msgstr "" -"Project-Id-Version: OpenERP Server 6.0.2\n" -"Report-Msgid-Bugs-To: support@openerp.com\n" -"POT-Creation-Date: 2011-07-05 16:02+0000\n" -"PO-Revision-Date: 2011-07-05 16:02+0000\n" -"Last-Translator: <>\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Plural-Forms: \n" - -#. module: sale_order_dates -#: sql_constraint:sale.order:0 -msgid "Order Reference must be unique !" -msgstr "¡La referencia del pedido debe ser única!" - -#. module: sale_order_dates -#: help:sale.order,requested_date:0 -msgid "Date on which customer has requested for sales." -msgstr "Fecha en que el cliente ha solicitado la venta." - -#. module: sale_order_dates -#: field:sale.order,commitment_date:0 -msgid "Commitment Date" -msgstr "Fecha compromiso" - -#. module: sale_order_dates -#: field:sale.order,effective_date:0 -msgid "Effective Date" -msgstr "Fecha efectiva" - -#. module: sale_order_dates -#: model:ir.module.module,shortdesc:sale_order_dates.module_meta_information -msgid "Sales Order Dates" -msgstr "Fechas en pedidos de venta" - -#. module: sale_order_dates -#: help:sale.order,effective_date:0 -msgid "Date on which picking is created." -msgstr "Fecha en que la orden ha sido creada." - -#. module: sale_order_dates -#: field:sale.order,requested_date:0 -msgid "Requested Date" -msgstr "Fecha solicitud" - -#. module: sale_order_dates -#: model:ir.model,name:sale_order_dates.model_sale_order -msgid "Sales Order" -msgstr "Pedido de venta" - -#. module: sale_order_dates -#: model:ir.module.module,description:sale_order_dates.module_meta_information -msgid "\n" -"Add commitment, requested and effective dates on the sales order.\n" -"" -msgstr "\n" -"Añade las fechas de compromiso, solicitada y efectiva en el pedido de venta.\n" -"" - -#. module: sale_order_dates -#: help:sale.order,commitment_date:0 -msgid "Date on which delivery of products is to be made." -msgstr "Fecha en que la entrega de productos se va a realizar." - diff --git a/addons/sale_order_dates/i18n/fr.po b/addons/sale_order_dates/i18n/fr.po index 9a71e524ab4..fc2ff669a67 100644 --- a/addons/sale_order_dates/i18n/fr.po +++ b/addons/sale_order_dates/i18n/fr.po @@ -4,43 +4,57 @@ # msgid "" msgstr "" -"Project-Id-Version: OpenERP Server 6.0dev\n" -"Report-Msgid-Bugs-To: support@openerp.com\n" -"POT-Creation-Date: 2011-12-22 18:46+0000\n" -"PO-Revision-Date: 2011-01-13 12:19+0000\n" -"Last-Translator: Maxime Chambreuil (http://www.savoirfairelinux.com) " -"\n" +"Project-Id-Version: OpenERP Server 6.1beta\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-01-05 09:45+0000\n" +"PO-Revision-Date: 2012-01-05 09:45+0000\n" +"Last-Translator: <>\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-12-23 07:24+0000\n" -"X-Generator: Launchpad (build 14560)\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" #. module: sale_order_dates #: sql_constraint:sale.order:0 msgid "Order Reference must be unique per Company!" -msgstr "" - -#. module: sale_order_dates -#: help:sale.order,requested_date:0 -msgid "Date on which customer has requested for sales." -msgstr "Date à laquelle le client a fait une demande d'achat." +msgstr "La référence de commande doit être unique dans la société !" #. module: sale_order_dates #: field:sale.order,commitment_date:0 msgid "Commitment Date" msgstr "Date d'engagement" +#. module: sale_order_dates +#: help:sale.order,effective_date:0 +msgid "Date on which the first Delivery Order was created." +msgstr "Date de la première livraison." + +#. module: sale_order_dates +#: code:addons/sale_order_dates/sale_order_dates.py:91 +#, python-format +msgid "The date requested by the customer is sooner than the commitment date. You may be unable to honor the customer's request." +msgstr "La date demandée par le client est avant la date d'engagement : il vous sera peut-être impossible de respecter la demande du client." + +#. module: sale_order_dates +#: help:sale.order,requested_date:0 +msgid "Date by which the customer has requested the items to be delivered.\n" +"When this Order gets confirmed, the Delivery Order's expected date will be computed based on this date and the Company's Security Delay.\n" +"Leave this field empty if you want the Delivery Order to be processed as soon as possible. In that case the expected date will be computed using the default method: based on the Product Lead Times and the Company's Security Delay." +msgstr "Date à laquelle le client souhaite que les produits soient livrés.\n" +"Lorsque la commande sera validée, la date prévue pour le bon de livraison sera calculée en fonction de cette date et du délai de sécurité de la société.\n" +"Laissez ce champ vide si vous souhaitez que la livraison soit effectuée dès que possible. Dans ce cas la date prévue sera calculée selon la méthode par défaut : selon les délais de livraison des produits et le délai de sécurité de la société." + #. module: sale_order_dates #: field:sale.order,effective_date:0 msgid "Effective Date" msgstr "Date effective" #. module: sale_order_dates -#: help:sale.order,effective_date:0 -msgid "Date on which picking is created." -msgstr "Date à laquelle le prélèvement a été créé." +#: code:addons/sale_order_dates/sale_order_dates.py:90 +#, python-format +msgid "Requested date is too soon!" +msgstr "La date demandée est trop tôt !" #. module: sale_order_dates #: field:sale.order,requested_date:0 @@ -50,23 +64,10 @@ msgstr "Date demandée" #. module: sale_order_dates #: model:ir.model,name:sale_order_dates.model_sale_order msgid "Sales Order" -msgstr "Commande de ventes" +msgstr "Commande de vente" #. module: sale_order_dates #: help:sale.order,commitment_date:0 -msgid "Date on which delivery of products is to be made." -msgstr "Date à laquelle la livraison des produits doit être faite." +msgid "Date by which the products is sure to be delivered. This is a date that you can promise to the customer, based on the Product Lead Times." +msgstr "Date à laquelle on est certain que le produit sera livré. C'est une date que vous promettez de tenir au client, en fonction des délais de livraison des produits." -#~ msgid "Sales Order Dates" -#~ msgstr "Dates de commande de ventes" - -#~ msgid "" -#~ "\n" -#~ "Add commitment, requested and effective dates on the sales order.\n" -#~ msgstr "" -#~ "\n" -#~ "Ajoute les dates d'engagement, demandée et effective sur le bon de " -#~ "commande.\n" - -#~ msgid "Order Reference must be unique !" -#~ msgstr "La référence de la commande doit être unique !" diff --git a/addons/sale_order_dates/i18n/sale_order_dates.pot b/addons/sale_order_dates/i18n/sale_order_dates.pot index 57ededdfc3e..ebe9c6799c9 100644 --- a/addons/sale_order_dates/i18n/sale_order_dates.pot +++ b/addons/sale_order_dates/i18n/sale_order_dates.pot @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: OpenERP Server 6.1beta\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-12-22 18:46+0000\n" -"PO-Revision-Date: 2011-12-22 18:46+0000\n" +"POT-Creation-Date: 2012-01-05 09:44+0000\n" +"PO-Revision-Date: 2012-01-05 09:44+0000\n" "Last-Translator: <>\n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -21,13 +21,26 @@ msgid "Order Reference must be unique per Company!" msgstr "" #. module: sale_order_dates -#: help:sale.order,requested_date:0 -msgid "Date on which customer has requested for sales." +#: field:sale.order,commitment_date:0 +msgid "Commitment Date" msgstr "" #. module: sale_order_dates -#: field:sale.order,commitment_date:0 -msgid "Commitment Date" +#: help:sale.order,effective_date:0 +msgid "Date on which the first Delivery Order was created." +msgstr "" + +#. module: sale_order_dates +#: code:addons/sale_order_dates/sale_order_dates.py:91 +#, python-format +msgid "The date requested by the customer is sooner than the commitment date. You may be unable to honor the customer's request." +msgstr "" + +#. module: sale_order_dates +#: help:sale.order,requested_date:0 +msgid "Date by which the customer has requested the items to be delivered.\n" +"When this Order gets confirmed, the Delivery Order's expected date will be computed based on this date and the Company's Security Delay.\n" +"Leave this field empty if you want the Delivery Order to be processed as soon as possible. In that case the expected date will be computed using the default method: based on the Product Lead Times and the Company's Security Delay." msgstr "" #. module: sale_order_dates @@ -36,8 +49,9 @@ msgid "Effective Date" msgstr "" #. module: sale_order_dates -#: help:sale.order,effective_date:0 -msgid "Date on which picking is created." +#: code:addons/sale_order_dates/sale_order_dates.py:90 +#, python-format +msgid "Requested date is too soon!" msgstr "" #. module: sale_order_dates @@ -52,6 +66,6 @@ msgstr "" #. module: sale_order_dates #: help:sale.order,commitment_date:0 -msgid "Date on which delivery of products is to be made." +msgid "Date by which the products is sure to be delivered. This is a date that you can promise to the customer, based on the Product Lead Times." msgstr "" From 2d9590a8c7b7bbf8211fd9d4927bb1b0e08a3859 Mon Sep 17 00:00:00 2001 From: Lionel Sausin Date: Wed, 5 Mar 2014 18:08:05 +0100 Subject: [PATCH 17/18] [REF] cosmetic change to ease the merge to/from the latest v7.0 branches bzr revid: ls@numerigraphe.com-20140305170805-abhdkdyhpdkp87ck --- addons/sale_order_dates/sale_order_dates_view.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/sale_order_dates/sale_order_dates_view.xml b/addons/sale_order_dates/sale_order_dates_view.xml index 1f9391dad2b..0de42895f5b 100644 --- a/addons/sale_order_dates/sale_order_dates_view.xml +++ b/addons/sale_order_dates/sale_order_dates_view.xml @@ -8,7 +8,7 @@ - + From 1b66087ed833e38893892a121900c451180309da Mon Sep 17 00:00:00 2001 From: Olivier Dony Date: Thu, 6 Mar 2014 23:50:09 +0100 Subject: [PATCH 18/18] [FIX] sale_order_dates: fixes + deduplication of _get_planned_date()/_order_line_move_date() methods on sale.order bzr revid: odo@openerp.com-20140306225009-f0jk43x5qpovurxi --- .../i18n/sale_order_dates.pot | 2 +- addons/sale_order_dates/sale_order_dates.py | 40 +++++++++---------- .../sale_order_dates_view.xml | 2 - .../sale_order_dates/test/requested_date.yml | 21 +++++----- addons/sale_stock/sale_stock.py | 17 ++------ 5 files changed, 35 insertions(+), 47 deletions(-) diff --git a/addons/sale_order_dates/i18n/sale_order_dates.pot b/addons/sale_order_dates/i18n/sale_order_dates.pot index 92b536c973e..b34c1143ec0 100644 --- a/addons/sale_order_dates/i18n/sale_order_dates.pot +++ b/addons/sale_order_dates/i18n/sale_order_dates.pot @@ -54,7 +54,7 @@ msgstr "" #. module: sale_order_dates #: help:sale.order,commitment_date:0 -msgid "Date by which the products is sure to be delivered. This is a date that you can promise to the customer, based on the Product Lead Times." +msgid "Date by which the products are sure to be delivered. This is a date that you can promise to the customer, based on the Product Lead Times." msgstr "" #. module: sale_order_dates diff --git a/addons/sale_order_dates/sale_order_dates.py b/addons/sale_order_dates/sale_order_dates.py index 11433911c45..f3ff971be9f 100644 --- a/addons/sale_order_dates/sale_order_dates.py +++ b/addons/sale_order_dates/sale_order_dates.py @@ -30,29 +30,26 @@ class sale_order_dates(osv.osv): _inherit = 'sale.order' def copy(self, cr, uid, id, default=None, context=None): - """Don't copy the requested date along with the Sale Order""" - if default is None: - default = {} - else: - default = default.copy() - default['requested_date'] = False + """Don't copy the requested date along with the Sales Order""" + default = dict(default or {}, requested_date=False) return super(sale_order_dates, self).copy(cr, uid, id, default=default, - context=context) - - def _order_line_move_date(self, cr, uid, line, context=None): + context=context) + + def _get_date_planned(self, cr, uid, order, line, start_date, context=None): """Compute the expected date from the requested date, not the order date""" - order=line.order_id if order and order.requested_date: - date_planned = datetime.strptime(order.requested_date, - DEFAULT_SERVER_DATE_FORMAT) + planned_str = self.date_to_datetime(cr, uid, + order.requested_date, context) + date_planned = datetime.strptime(planned_str, + DEFAULT_SERVER_DATETIME_FORMAT) date_planned -= timedelta(days=order.company_id.security_lead) return date_planned.strftime(DEFAULT_SERVER_DATETIME_FORMAT) - else: - return super(sale_order_dates, self)._order_line_move_date(cr, uid, line) + return super(sale_order_dates, self)._get_date_planned( + cr, uid, order, line, start_date, context=context) def _get_effective_date(self, cr, uid, ids, name, arg, context=None): """Read the shipping date from the related packings""" - # XXX would be better if it returned the date the picking was processed + # TODO: would be better if it returned the date the picking was processed? res = {} dates_list = [] for order in self.browse(cr, uid, ids, context=context): @@ -70,11 +67,13 @@ class sale_order_dates(osv.osv): res = {} dates_list = [] for order in self.browse(cr, uid, ids, context=context): + order_datetime_str = self.date_to_datetime(cr, uid, order.date_order, + context) + order_datetime = datetime.strptime(order_datetime_str, + DEFAULT_SERVER_DATETIME_FORMAT) dates_list = [] for line in order.order_line: - dt = (datetime.strptime(order.date_order, - DEFAULT_SERVER_DATE_FORMAT) - + timedelta(days=line.delay or 0.0) ) + dt = order_datetime + timedelta(days=line.delay or 0.0) dt_s = dt.strftime(DEFAULT_SERVER_DATE_FORMAT) dates_list.append(dt_s) if dates_list: @@ -93,13 +92,12 @@ class sale_order_dates(osv.osv): "unable to honor the customer's request.") } } - else: - return {} + return {} _columns = { 'commitment_date': fields.function(_get_commitment_date, store=True, type='date', string='Commitment Date', - help="Date by which the products is sure to be delivered. This is " + help="Date by which the products are sure to be delivered. This is " "a date that you can promise to the customer, based on the " "Product Lead Times."), 'requested_date': fields.date('Requested Date', diff --git a/addons/sale_order_dates/sale_order_dates_view.xml b/addons/sale_order_dates/sale_order_dates_view.xml index 0de42895f5b..cc216ddd9b9 100644 --- a/addons/sale_order_dates/sale_order_dates_view.xml +++ b/addons/sale_order_dates/sale_order_dates_view.xml @@ -18,9 +18,7 @@ - sale.order.tree.inherit5 sale.order - tree diff --git a/addons/sale_order_dates/test/requested_date.yml b/addons/sale_order_dates/test/requested_date.yml index cdeec445409..d05191a4d99 100644 --- a/addons/sale_order_dates/test/requested_date.yml +++ b/addons/sale_order_dates/test/requested_date.yml @@ -3,13 +3,13 @@ I update a demo Sale Order with Requested Date on 2010-12-17 - !python {model: sale.order}: | - so = self.write(cr, uid, ref("sale.order"), {'requested_date': '2010-07-12'}) -- + self.write(cr, uid, ref("sale.sale_order_6"), {'requested_date': '2010-07-12'}) +- I confirm the Sale Order. -- +- !workflow { model: sale.order, action: order_confirm, - ref: sale.order + ref: sale.sale_order_6 } - I verify that the Procurements and Stock Moves have been generated with the @@ -17,12 +17,13 @@ - !python {model: sale.order}: | from datetime import datetime, timedelta - from tools import DEFAULT_SERVER_DATE_FORMAT, DEFAULT_SERVER_DATETIME_FORMAT - - so = self.browse(cr, uid, ref("sale.order")) - security_delay = timedelta(days=so.shop_id.company_id.security_lead) - requested_date = datetime.strptime(so.requested_date, - DEFAULT_SERVER_DATE_FORMAT) + from openerp.tools import DEFAULT_SERVER_DATE_FORMAT, DEFAULT_SERVER_DATETIME_FORMAT + + so = self.browse(cr, uid, ref("sale.sale_order_6")) + security_delay = timedelta(days=so.company_id.security_lead) + requested_date = datetime.strptime( + self.date_to_datetime(cr, uid, so.requested_date), + DEFAULT_SERVER_DATETIME_FORMAT) right_date = (requested_date - security_delay).strftime( DEFAULT_SERVER_DATETIME_FORMAT) for line in so.order_line: diff --git a/addons/sale_stock/sale_stock.py b/addons/sale_stock/sale_stock.py index a675debd738..f90aecac184 100644 --- a/addons/sale_stock/sale_stock.py +++ b/addons/sale_stock/sale_stock.py @@ -21,7 +21,6 @@ ############################################################################## from datetime import datetime, timedelta from openerp.tools import DEFAULT_SERVER_DATE_FORMAT, DEFAULT_SERVER_DATETIME_FORMAT, DATETIME_FORMATS_MAP, float_compare -from dateutil.relativedelta import relativedelta from openerp.osv import fields, osv from openerp.tools.translate import _ import pytz @@ -257,7 +256,7 @@ class sale_order(osv.osv): if tz_name: utc = pytz.timezone('UTC') context_tz = pytz.timezone(tz_name) - user_datetime = user_date + relativedelta(hours=12.0) + user_datetime = user_date + timedelta(hours=12.0) local_timestamp = context_tz.localize(user_datetime, is_dst=False) user_datetime = local_timestamp.astimezone(utc) return user_datetime.strftime(DEFAULT_SERVER_DATETIME_FORMAT) @@ -313,15 +312,6 @@ class sale_order(osv.osv): 'company_id': order.company_id.id, 'note': line.name, } - - def _order_line_move_date(self, cr, uid, line, context=None): - """Compute the Stock Move date for the Sale Order Line""" - date_planned = datetime.strptime(line.order_id.date_order, - DEFAULT_SERVER_DATE_FORMAT) - date_planned += timedelta(days=line.delay or 0.0) - date_planned -= timedelta(days=line.order_id.company_id.security_lead) - return date_planned.strftime(DEFAULT_SERVER_DATETIME_FORMAT) - def _prepare_order_line_move(self, cr, uid, order, line, picking_id, date_planned, context=None): location_id = order.warehouse_id.lot_stock_id.id @@ -388,8 +378,9 @@ class sale_order(osv.osv): return True def _get_date_planned(self, cr, uid, order, line, start_date, context=None): + """Compute the Stock Move date for the Sale Order Line""" start_date = self.date_to_datetime(cr, uid, start_date, context) - date_planned = datetime.strptime(start_date, DEFAULT_SERVER_DATETIME_FORMAT) + relativedelta(days=line.delay or 0.0) + date_planned = datetime.strptime(start_date, DEFAULT_SERVER_DATETIME_FORMAT) + timedelta(days=line.delay or 0.0) date_planned = (date_planned - timedelta(days=order.company_id.security_lead)).strftime(DEFAULT_SERVER_DATETIME_FORMAT) return date_planned @@ -421,7 +412,7 @@ class sale_order(osv.osv): if line.state == 'done': continue - date_planned = self._order_line_move_date(cr, uid, line, context=context) + date_planned = self._get_date_planned(cr, uid, order, line, order.date_order, context=context) if line.product_id: if line.product_id.type in ('product', 'consu'):