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 @@
+
+
+
+
+
+ Days needed to confirm a PO, define when a PO should be validated
+
+
+
+