[FIX] stock: change of scheduled date

- Install Inventory, Purchase
- General Settings/tick Multi-step routes
- In Warehouses/YourCompany
  Incoming Shipments: Receive goods in input, then quality and then
  stock (3 steps)
- Create a PO and add the same products on 2 lines. One has a scheduled
  date in the future
- Go to transfers, where "Picking List" or "Procurement Group"
  correspond to your PO
  => the 3 scheduled_date correspond to Datetime.now()
- Validate the first picking (WH/IN)

The scheduled_date (resp date_expected) in the remaining pickings WH/INT
(resp. stock moves) are changed to the past.

This is due to the fact that both moves are merged in subsequent
pickings. The cleanest solution would be to avoid the merge in case the
expected dates are different. Although this makes sense, that also
implies a change of behavior.

Therefore, we avoid such situation by preventing the propagation of an
expected date in the past, which does not make much sense when
propagating.

opw-2171509

closes odoo/odoo#47155

X-original-commit: c7b2341b35aabe394a34e14c48a913a8595737fc
Signed-off-by: Nicolas Martinelli (nim) <nim@odoo.com>
Co-authored-by: Arnold Moyaux <arm@odoo.com>
This commit is contained in:
Nicolas Martinelli
2020-03-09 08:33:58 +00:00
co-authored by Arnold Moyaux
parent 7484791497
commit 121c73246d
3 changed files with 49 additions and 3 deletions
@@ -1,10 +1,11 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from datetime import datetime, timedelta
from odoo.tools import DEFAULT_SERVER_DATETIME_FORMAT
from datetime import date, datetime, timedelta
from odoo.addons.product.tests import common
from odoo.tests import Form
from odoo.tools import DEFAULT_SERVER_DATETIME_FORMAT
class TestCreatePicking(common.TestProductCommon):
@@ -470,6 +471,46 @@ class TestCreatePicking(common.TestProductCommon):
self.assertNotEqual(purchase_order_line.date_planned, delivery_order.scheduled_date,
'Delivery order schedule date should not changed.')
def test_07_differed_schedule_date(self):
warehouse = self.env['stock.warehouse'].search([], limit=1)
# mark all rules as propagate_date so that push rules will use it
self.env['stock.rule'].search([]).write({
'propagate_date': True,
'propagate_date_minimum_delta': 5,
})
with Form(warehouse) as w:
w.reception_steps = 'three_steps'
po_form = Form(self.env['purchase.order'])
po_form.partner_id = self.partner_id
with po_form.order_line.new() as line:
line.product_id = self.product_id_1
line.date_planned = datetime.today()
line.product_qty = 1.0
with po_form.order_line.new() as line:
line.product_id = self.product_id_1
line.date_planned = datetime.today() + timedelta(days=7)
line.product_qty = 1.0
po = po_form.save()
# mark the po line as propagate_date so that the created moves will use it
po.order_line.write({
'propagate_date': True,
'propagate_date_minimum_delta': 5,
})
po.button_approve()
po.picking_ids.move_line_ids.write({
'qty_done': 1.0
})
po.picking_ids.button_validate()
pickings = self.env['stock.picking'].search([('group_id', '=', po.group_id.id)])
for picking in pickings:
self.assertEqual(picking.scheduled_date.date(), date.today())
def test_update_quantity_and_return(self):
po = self.env['purchase.order'].create(self.po_vals)
+4 -1
View File
@@ -433,7 +433,10 @@ class StockMove(models.Model):
delta_days = (new_date - move.date_expected).total_seconds() / 86400
if move.propagate_date and abs(delta_days) >= move.propagate_date_minimum_delta and move_dest_ids:
for move_dest in move_dest_ids:
move_dest.date_expected += relativedelta.relativedelta(days=delta_days)
# We want to propagate a negative delta, but not propagate an expected date
# in the past.
new_move_date = max(move_dest.date_expected + relativedelta.relativedelta(days=delta_days or 0), fields.Datetime.now())
move_dest.date_expected = new_move_date
move_dest_ids.filtered(lambda m: m.delay_alert)._propagate_date_log_activity(move)
if move.delay_alert:
move._delay_alert_check(new_date)
+2
View File
@@ -209,6 +209,8 @@ class StockRule(models.Model):
'picking_id': False,
'picking_type_id': self.picking_type_id.id,
'propagate_cancel': self.propagate_cancel,
'propagate_date': self.propagate_date,
'propagate_date_minimum_delta': self.propagate_date_minimum_delta,
'warehouse_id': self.warehouse_id.id,
'delay_alert': self.delay_alert,
'procure_method': 'make_to_order',