-
+
@@ -106,9 +106,12 @@
-
-
-
+
+
+
+
+
+
diff --git a/addons/l10n_de/static/src/scss/report_din5008.scss b/addons/l10n_de/static/src/scss/report_din5008.scss
index 956f05de66..c322b7a4da 100644
--- a/addons/l10n_de/static/src/scss/report_din5008.scss
+++ b/addons/l10n_de/static/src/scss/report_din5008.scss
@@ -1,9 +1,8 @@
.din_page {
- width: 180mm;
- margin-left: -1rem;
font-size: 9pt;
&.header {
+ margin-left: 10px;
table {
width: 100%;
img, h3, td, tr {
@@ -21,7 +20,10 @@
}
}
}
+
&.invoice_note {
+ padding-top: 10px;
+ margin-left: 10px;
tr {
td {
vertical-align: bottom;
@@ -84,7 +86,7 @@
}
}
&.footer {
- padding-left: 5mm;
+ margin-left: 10px;
padding-right: 10mm;
.page_number {
margin-top: 4.23mm;
diff --git a/addons/l10n_ua/data/account.account.template.csv b/addons/l10n_ua/data/account.account.template.csv
index e33ad93442..5be56f859e 100644
--- a/addons/l10n_ua/data/account.account.template.csv
+++ b/addons/l10n_ua/data/account.account.template.csv
@@ -324,7 +324,7 @@
"ua_psbp_970",970,"Витрати від зміни вартості фінансових інструментів","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
"ua_psbp_971",971,"Собівартість реалізованих фінансових інвестицій","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
"ua_psbp_972",972,"Втрати від зменшення корисності активів","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
-"ua_psbp_973",973,"Себестоимость реализованных имущественных комплексов","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_973",973,"Собівартість реалізованих майнових комплексів","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
"ua_psbp_974",974,"Втрати від неопераційних курсових різниць","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
"ua_psbp_975",975,"Уцінка необоротних активів і фінансових інвестицій","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
"ua_psbp_976",976,"Списання необоротних активів","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
diff --git a/addons/purchase_stock/models/stock_rule.py b/addons/purchase_stock/models/stock_rule.py
index 4cf83172aa..60d6399448 100644
--- a/addons/purchase_stock/models/stock_rule.py
+++ b/addons/purchase_stock/models/stock_rule.py
@@ -259,16 +259,17 @@ class StockRule(models.Model):
res['orderpoint_id'] = orderpoint_id.id
return res
+ def _get_po_date(self, company_id, values):
+ purchase_date = min([fields.Datetime.from_string(value['date_planned']) - relativedelta(days=int(value['supplier'].delay)) for value in values])
+ return purchase_date - relativedelta(days=company_id.po_lead)
+
def _prepare_purchase_order(self, company_id, origins, values):
""" Create a purchase order for procuremets that share the same domain
returned by _make_po_get_domain.
params values: values of procurements
params origins: procuremets origins to write on the PO
"""
- purchase_date = min([fields.Datetime.from_string(value['date_planned']) - relativedelta(days=int(value['supplier'].delay)) for value in values])
-
- purchase_date = (purchase_date - relativedelta(days=company_id.po_lead))
-
+ purchase_date = max(self._get_po_date(company_id, values), fields.Datetime.now())
# Since the procurements are grouped if they share the same domain for
# PO but the PO does not exist. In this case it will create the PO from
diff --git a/addons/purchase_stock/tests/test_purchase_lead_time.py b/addons/purchase_stock/tests/test_purchase_lead_time.py
index 97359c9ad3..af94271656 100644
--- a/addons/purchase_stock/tests/test_purchase_lead_time.py
+++ b/addons/purchase_stock/tests/test_purchase_lead_time.py
@@ -361,5 +361,5 @@ class TestPurchaseLeadTime(PurchaseTestCommon):
purchase_order = self.env['purchase.order'].search([('partner_id', '=', self.partner_1.id)])
today = fields.Datetime.start_of(fields.Datetime.now(), 'day')
- self.assertEqual(purchase_order.date_order, today)
+ self.assertEqual(fields.Datetime.start_of(purchase_order.date_order, 'day'), today)
self.assertEqual(fields.Datetime.start_of(purchase_order.date_planned, 'day'), today + timedelta(days=7))
diff --git a/addons/sale_purchase_stock/tests/__init__.py b/addons/sale_purchase_stock/tests/__init__.py
index aae4c2e355..7e78814e60 100644
--- a/addons/sale_purchase_stock/tests/__init__.py
+++ b/addons/sale_purchase_stock/tests/__init__.py
@@ -2,3 +2,4 @@
# Part of Odoo, Flectra. See LICENSE file for full copyright and licensing details.
from . import test_access_rights
+from . import test_lead_time
diff --git a/addons/sale_purchase_stock/tests/test_lead_time.py b/addons/sale_purchase_stock/tests/test_lead_time.py
new file mode 100644
index 0000000000..f38dafe94f
--- /dev/null
+++ b/addons/sale_purchase_stock/tests/test_lead_time.py
@@ -0,0 +1,67 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo, Flectra. See LICENSE file for full copyright and licensing details.
+
+from datetime import timedelta
+
+from flectra import fields
+from flectra.tests import tagged
+from flectra.addons.sale_purchase.tests.common import TestCommonSalePurchaseNoChart
+
+
+@tagged('post_install', '-at_install')
+class TestLeadTime(TestCommonSalePurchaseNoChart):
+
+ @classmethod
+ def setUpClass(cls):
+ super(TestLeadTime, cls).setUpClass()
+
+ cls.buy_route = cls.env.ref('purchase_stock.route_warehouse0_buy')
+ cls.mto_route = cls.env.ref('stock.route_warehouse0_mto')
+ cls.mto_route.active = True
+ cls.vendor = cls.env['res.partner'].create({'name': 'The Emperor'})
+ cls.user_salesperson = cls.env['res.users'].with_context(no_reset_password=True).create({
+ 'name': 'Le Grand Horus',
+ 'login': 'grand.horus',
+ 'email': 'grand.horus@chansonbelge.dz',
+ })
+
+
+ def test_supplier_lead_time(self):
+ """ Basic stock configuration and a supplier with a minimum qty and a lead time """
+
+ seller = self.env['product.supplierinfo'].create({
+ 'name': self.vendor.id,
+ 'min_qty': 1,
+ 'price': 1,
+ 'delay': 7,
+ })
+
+ product = self.env['product.product'].create({
+ 'name': 'corpse starch',
+ 'type': 'product',
+ 'seller_ids': [(6, 0, seller.ids)],
+ 'route_ids': [(6, 0, (self.mto_route + self.buy_route).ids)]
+ })
+
+ so = self.env['sale.order'].with_user(self.user_salesperson).create({
+ 'partner_id': self.partner_a.id,
+ 'user_id': self.user_salesperson.id,
+ })
+ self.env['sale.order.line'].create({
+ 'name': product.name,
+ 'product_id': product.id,
+ 'product_uom_qty': 1,
+ 'product_uom': product.uom_id.id,
+ 'price_unit': product.list_price,
+ 'tax_id': False,
+ 'order_id': so.id,
+ })
+ so.action_confirm()
+
+ po = self.env['purchase.order'].search([('partner_id', '=', self.vendor.id)])
+
+ start_of_day = lambda x: fields.Datetime.start_of(x, 'day')
+ today = start_of_day(fields.Datetime.now())
+
+ self.assertEqual(start_of_day(po.date_order), today)
+ self.assertEqual(start_of_day(po.date_planned), today + timedelta(days=7))