[FIX] sale_order_dates: fixes + deduplication of _get_planned_date()/_order_line_move...
authorOlivier Dony <odo@openerp.com>
Thu, 6 Mar 2014 22:50:09 +0000 (23:50 +0100)
committerOlivier Dony <odo@openerp.com>
Thu, 6 Mar 2014 22:50:09 +0000 (23:50 +0100)
bzr revid: odo@openerp.com-20140306225009-f0jk43x5qpovurxi

addons/sale_order_dates/i18n/sale_order_dates.pot
addons/sale_order_dates/sale_order_dates.py
addons/sale_order_dates/sale_order_dates_view.xml
addons/sale_order_dates/test/requested_date.yml
addons/sale_stock/sale_stock.py

index 92b536c..b34c114 100644 (file)
@@ -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
index 1143391..f3ff971 100644 (file)
@@ -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',
index 0de4289..cc216dd 100644 (file)
@@ -18,9 +18,7 @@
             </field>
         </record>
         <record id="view_order_tree_date" model="ir.ui.view">
-            <field name="name">sale.order.tree.inherit5</field>
             <field name="model">sale.order</field>
-            <field name="type">tree</field>
             <field name="inherit_id" ref="sale.view_order_tree"/>
             <field name="arch" type="xml">
                 <field name="date_order" position="after">
index cdeec44..d05191a 100644 (file)
@@ -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
 -
   !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:
index a675deb..f90aeca 100644 (file)
@@ -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'):