From 85f3c08039b687b2a32f7a1b970bc2aa84d5fe10 Mon Sep 17 00:00:00 2001 From: yhu-odoo Date: Mon, 8 Jun 2020 17:42:28 +0000 Subject: [PATCH] [IMP] purchase: set scheduled date to the last minute of that day When set scheduled date on PO line, set it to be the last minute of that day to correctly decide the late of the receipt. Task 2265912 PR #52693 Related: odoo/enterprise#11034 Related: odoo/upgrade#1323 Signed-off-by: Simon Lejeune (sle) --- addons/purchase/models/purchase.py | 10 ++++++---- addons/purchase_stock/tests/test_purchase_lead_time.py | 8 ++++---- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/addons/purchase/models/purchase.py b/addons/purchase/models/purchase.py index 674e09b0daa..e2d254d56fe 100644 --- a/addons/purchase/models/purchase.py +++ b/addons/purchase/models/purchase.py @@ -1,8 +1,9 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -from datetime import datetime +from datetime import datetime, time from dateutil.relativedelta import relativedelta from itertools import groupby +from pytz import timezone, UTC from werkzeug.urls import url_encode from odoo import api, fields, models, SUPERUSER_ID, _ @@ -922,9 +923,10 @@ class PurchaseOrderLine(models.Model): """ date_order = po.date_order if po else self.order_id.date_order if date_order: - return date_order + relativedelta(days=seller.delay if seller else 0) + date_planned = date_order + relativedelta(days=seller.delay if seller else 0) else: - return datetime.today() + relativedelta(days=seller.delay if seller else 0) + date_planned = datetime.today() + relativedelta(days=seller.delay if seller else 0) + return timezone(self.order_id.user_id.tz or 'UTC').localize(datetime.combine(date_planned.date(), time.max)).astimezone(UTC).replace(tzinfo=None, microsecond=0, second=0) @api.depends('product_id', 'date_order') def _compute_analytic_id_and_tag_ids(self): @@ -945,7 +947,7 @@ class PurchaseOrderLine(models.Model): return # Reset date, price and quantity since _onchange_quantity will provide default values - self.date_planned = self.order_id.date_planned or datetime.today().strftime(DEFAULT_SERVER_DATETIME_FORMAT) + self.date_planned = self.order_id.date_planned or timezone(self.order_id.user_id.tz or 'UTC').localize(datetime.combine(datetime.today(), time.max)).astimezone(UTC).replace(tzinfo=None, microsecond=0, second=0) self.price_unit = self.product_qty = 0.0 self._product_id_change() diff --git a/addons/purchase_stock/tests/test_purchase_lead_time.py b/addons/purchase_stock/tests/test_purchase_lead_time.py index f01aad815e3..e42e2104733 100644 --- a/addons/purchase_stock/tests/test_purchase_lead_time.py +++ b/addons/purchase_stock/tests/test_purchase_lead_time.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -from datetime import datetime, timedelta +from datetime import datetime, timedelta, time from unittest.mock import patch from odoo import fields @@ -33,7 +33,7 @@ class TestPurchaseLeadTime(PurchaseTestCommon): self.assertEqual(purchase.date_order, order_date, 'Order date should be equal to: Date of the procurement order - Purchase Lead Time - Delivery Lead Time.') # Check scheduled date of purchase order - schedule_date = order_date + timedelta(days=self.product_1.seller_ids.delay) + schedule_date = datetime.combine(order_date + timedelta(days=self.product_1.seller_ids.delay), time.max).replace(microsecond=0, second=0) self.assertEqual(purchase.order_line.date_planned, schedule_date, 'Schedule date should be equal to: Order date of Purchase order + Delivery Lead Time.') # check the picking created or not @@ -70,11 +70,11 @@ class TestPurchaseLeadTime(PurchaseTestCommon): self.assertEqual(purchase2.date_order, order_date, 'Order date should be equal to: Date of the procurement order - Delivery Lead Time.') # Check scheduled date of purchase order line for product_1 - schedule_date_1 = order_date + timedelta(days=self.product_1.seller_ids.delay) + schedule_date_1 = datetime.combine(order_date + timedelta(days=self.product_1.seller_ids.delay), time.max).replace(microsecond=0, second=0) self.assertEqual(order_line_pro_1.date_planned, schedule_date_1, 'Schedule date of purchase order line for product_1 should be equal to: Order date of purchase order + Delivery Lead Time of product_1.') # Check scheduled date of purchase order line for product_2 - schedule_date_2 = order_date + timedelta(days=self.product_2.seller_ids.delay) + schedule_date_2 = datetime.combine(order_date + timedelta(days=self.product_2.seller_ids.delay), time.max).replace(microsecond=0, second=0) self.assertEqual(order_line_pro_2.date_planned, schedule_date_2, 'Schedule date of purchase order line for product_2 should be equal to: Order date of purchase order + Delivery Lead Time of product_2.') # Check scheduled date of purchase order