diff --git a/addons/purchase_stock/models/__init__.py b/addons/purchase_stock/models/__init__.py index 1cfbfcbf891..d822fea458a 100644 --- a/addons/purchase_stock/models/__init__.py +++ b/addons/purchase_stock/models/__init__.py @@ -4,6 +4,7 @@ from . import account_invoice from . import product from . import purchase +from . import res_company from . import res_config_settings from . import stock from . import stock_rule diff --git a/addons/purchase_stock/models/res_company.py b/addons/purchase_stock/models/res_company.py new file mode 100644 index 00000000000..b49d8cf9259 --- /dev/null +++ b/addons/purchase_stock/models/res_company.py @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import fields, models + + +class ResCompany(models.Model): + _inherit = 'res.company' + + days_to_purchase = fields.Float( + string='Days to Purchase', + help="Days needed to confirm a PO, define when a PO should be validated") diff --git a/addons/purchase_stock/models/res_config_settings.py b/addons/purchase_stock/models/res_config_settings.py index 1abab462893..5f45996256d 100644 --- a/addons/purchase_stock/models/res_config_settings.py +++ b/addons/purchase_stock/models/res_config_settings.py @@ -8,6 +8,8 @@ class ResConfigSettings(models.TransientModel): _inherit = 'res.config.settings' module_stock_dropshipping = fields.Boolean("Dropshipping") + days_to_purchase = fields.Float( + related='company_id.days_to_purchase', readonly=False) is_installed_sale = fields.Boolean(string="Is the Sale Module Installed") diff --git a/addons/purchase_stock/models/stock_rule.py b/addons/purchase_stock/models/stock_rule.py index 93624ea7cc6..f300d31132d 100644 --- a/addons/purchase_stock/models/stock_rule.py +++ b/addons/purchase_stock/models/stock_rule.py @@ -144,7 +144,9 @@ class StockRule(models.Model): delay_description += '%s+ %d %s' % (_('Vendor Lead Time'), supplier_delay, _('day(s)')) security_delay = buy_rule.picking_type_id.company_id.po_lead delay_description += '%s+ %d %s' % (_('Purchase Security Lead Time'), security_delay, _('day(s)')) - return delay + supplier_delay + security_delay, delay_description + days_to_purchase = buy_rule.company_id.days_to_purchase + delay_description += '%s+ %d %s' % (_('Days to Purchase'), days_to_purchase, _('day(s)')) + return delay + supplier_delay + security_delay + days_to_purchase, delay_description @api.model def _get_procurements_to_merge_groupby(self, procurement): diff --git a/addons/purchase_stock/tests/test_purchase_lead_time.py b/addons/purchase_stock/tests/test_purchase_lead_time.py index 986b401a4a8..45d29ce71f2 100644 --- a/addons/purchase_stock/tests/test_purchase_lead_time.py +++ b/addons/purchase_stock/tests/test_purchase_lead_time.py @@ -1,10 +1,12 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -from datetime import timedelta +from datetime import datetime, timedelta +from unittest.mock import patch from odoo import fields from .common import PurchaseTestCommon +from odoo.tests.common import Form class TestPurchaseLeadTime(PurchaseTestCommon): @@ -239,3 +241,56 @@ class TestPurchaseLeadTime(PurchaseTestCommon): self.assertEqual(len(po_line), 2, 'the purchase order lines are merged') self.assertEqual(po_line[0].product_qty, 10, 'the purchase order line has a wrong quantity') self.assertEqual(po_line[1].product_qty, 5, 'the purchase order line has a wrong quantity') + + def test_reordering_days_to_purchase(self): + self.patcher = patch('odoo.addons.stock.models.stock_orderpoint.fields.Date', wraps=fields.Date) + self.mock_date = self.patcher.start() + + vendor = self.env['res.partner'].create({ + 'name': 'Colruyt' + }) + + self.env.company.days_to_purchase = 2.0 + + product = self.env['product.product'].create({ + 'name': 'Chicory', + 'type': 'product', + 'seller_ids': [(0, 0, {'name': vendor.id, 'delay': 1.0})] + }) + orderpoint_form = Form(self.env['stock.warehouse.orderpoint']) + orderpoint_form.product_id = product + orderpoint_form.product_min_qty = 0.0 + orderpoint = orderpoint_form.save() + + warehouse = self.env['stock.warehouse'].search([], limit=1) + delivery_moves = self.env['stock.move'] + for i in range(0, 6): + delivery_moves |= self.env['stock.move'].create({ + 'name': 'Delivery', + 'date_expected': datetime.today() + timedelta(days=i), + 'product_id': product.id, + 'product_uom': product.uom_id.id, + 'product_uom_qty': 5.0, + 'location_id': warehouse.lot_stock_id.id, + 'location_dest_id': self.ref('stock.stock_location_customers'), + }) + delivery_moves._action_confirm() + self.env['procurement.group'].run_scheduler() + po_line = self.env['purchase.order.line'].search([('product_id', '=', product.id)]) + self.assertEqual(fields.Date.to_date(po_line.order_id.date_order), fields.Date.today() + timedelta(days=2)) + self.assertEqual(len(po_line), 1) + self.assertEqual(po_line.product_uom_qty, 20.0) + self.assertEqual(len(po_line.order_id), 1) + orderpoint_form = Form(orderpoint) + orderpoint_form.save() + + self.mock_date.today.return_value = fields.Date.today() + timedelta(days=1) + self.env.cache.invalidate() + self.env['procurement.group'].run_scheduler() + po_line = self.env['purchase.order.line'].search([('product_id', '=', product.id)]) + self.assertEqual(len(po_line), 2) + self.assertEqual(len(po_line.order_id), 2) + new_order = po_line.order_id.sorted('date_order')[-1] + self.assertEqual(fields.Date.to_date(new_order.date_order), fields.Date.today() + timedelta(days=2)) + self.assertEqual(new_order.order_line.product_uom_qty, 5.0) + self.patcher.stop() diff --git a/addons/purchase_stock/views/res_config_settings_views.xml b/addons/purchase_stock/views/res_config_settings_views.xml index 592167c6830..8d068ef423e 100644 --- a/addons/purchase_stock/views/res_config_settings_views.xml +++ b/addons/purchase_stock/views/res_config_settings_views.xml @@ -55,6 +55,20 @@ +
+
+
+