changeset 524acbc2210e in modules/purchase:default
details: https://hg.tryton.org/modules/purchase?cmd=changeset;node=524acbc2210e
description:
Add default lead time to supplier
issue9420
review3117710
diffstat:
CHANGELOG | 1 +
__init__.py | 1 +
party.py | 14 ++++++++++++++
product.py | 22 +++++++++++++++++-----
purchase.py | 13 +++++++++----
view/party_form.xml | 2 ++
6 files changed, 44 insertions(+), 9 deletions(-)
diffs (157 lines):
diff -r 4fc449934f98 -r 524acbc2210e CHANGELOG
--- a/CHANGELOG Sun Jan 17 01:24:33 2021 +0100
+++ b/CHANGELOG Tue Jan 19 14:59:54 2021 +0100
@@ -1,3 +1,4 @@
+* Add default lead time to supplier
* Allow product supplier to be deactivated
* Add summary to purchase line list
* Set payment term and invoice method from last party's purchases
diff -r 4fc449934f98 -r 524acbc2210e __init__.py
--- a/__init__.py Sun Jan 17 01:24:33 2021 +0100
+++ b/__init__.py Tue Jan 19 14:59:54 2021 +0100
@@ -36,6 +36,7 @@
stock.Location,
party.Party,
party.CustomerCode,
+ party.SupplierLeadTime,
purchase.ReturnPurchaseStart,
module='purchase', type_='model')
Pool.register(
diff -r 4fc449934f98 -r 524acbc2210e party.py
--- a/party.py Sun Jan 17 01:24:33 2021 +0100
+++ b/party.py Tue Jan 19 14:59:54 2021 +0100
@@ -16,6 +16,12 @@
" as customer."))
customer_codes = fields.One2Many(
'party.party.customer_code', 'party', "Customer Codes")
+ supplier_lead_time = fields.MultiValue(fields.TimeDelta("Lead Time",
+ help="The time from confirming the purchase order to receiving "
+ "the goods from the party when used as a supplier.\n"
+ "Used if no lead time is set on the product supplier."))
+ supplier_lead_times = fields.One2Many(
+ 'party.party.supplier_lead_time', 'party', "Lead Times")
@classmethod
def multivalue_model(cls, field):
@@ -33,6 +39,14 @@
customer_code = fields.Char('Customer Code')
+class SupplierLeadTime(ModelSQL, CompanyValueMixin):
+ "Supplier Lead Time"
+ __name__ = 'party.party.supplier_lead_time'
+ party = fields.Many2One(
+ 'party.party', "Party", ondelete='CASCADE', select=True)
+ supplier_lead_time = fields.TimeDelta("Lead Time")
+
+
class PartyReplace(metaclass=PoolMeta):
__name__ = 'party.replace'
diff -r 4fc449934f98 -r 524acbc2210e product.py
--- a/product.py Sun Jan 17 01:24:33 2021 +0100
+++ b/product.py Tue Jan 19 14:59:54 2021 +0100
@@ -276,7 +276,10 @@
('id', If(Eval('context', {}).contains('company'), '=', '!='),
Eval('context', {}).get('company', -1)),
])
- lead_time = fields.TimeDelta('Lead Time')
+ lead_time = fields.TimeDelta('Lead Time',
+ help="The time from confirming the purchase order to receiving the "
+ "products.\n"
+ "If empty the lead time of the supplier is used.")
currency = fields.Many2One('currency.currency', 'Currency', required=True,
ondelete='RESTRICT')
uom = fields.Function(
@@ -381,6 +384,15 @@
if self.template.purchase_uom:
return self.template.purchase_uom.id
+ @property
+ def lead_time_used(self):
+ # Use getattr because it can be called with an unsaved instance
+ lead_time = getattr(self, 'lead_time', None)
+ party = getattr(self, 'party', None)
+ if lead_time is None and party:
+ lead_time = party.get_multivalue('supplier_lead_time')
+ return lead_time
+
def compute_supply_date(self, date=None):
'''
Compute the supply date for the Product Supplier at the given date
@@ -389,9 +401,9 @@
if not date:
date = Date.today()
- if self.lead_time is None:
+ if self.lead_time_used is None:
return datetime.date.max
- return date + self.lead_time
+ return date + self.lead_time_used
def compute_purchase_date(self, date):
'''
@@ -399,9 +411,9 @@
'''
Date = Pool().get('ir.date')
- if self.lead_time is None:
+ if self.lead_time_used is None:
return Date.today()
- return date - self.lead_time
+ return date - self.lead_time_used
@staticmethod
def get_pattern():
diff -r 4fc449934f98 -r 524acbc2210e purchase.py
--- a/purchase.py Sun Jan 17 01:24:33 2021 +0100
+++ b/purchase.py Tue Jan 19 14:59:54 2021 +0100
@@ -1405,27 +1405,32 @@
@fields.depends('product_supplier', 'quantity', 'moves', 'purchase',
'_parent_purchase.purchase_date',
'delivery_date_edit', 'delivery_date_store',
- '_parent_purchase.delivery_date')
+ '_parent_purchase.delivery_date', '_parent_purchase.party')
def on_change_with_delivery_date(self, name=None):
pool = Pool()
Date = pool.get('ir.date')
+ ProductSupplier = pool.get('purchase.product_supplier')
if self.moves:
dates = filter(
None, (m.effective_date or m.planned_date for m in self.moves
if m.state != 'cancelled'))
return min(dates, default=None)
+ product_supplier = self.product_supplier
+ if not product_supplier:
+ product_supplier = ProductSupplier()
+ if self.purchase:
+ product_supplier.party = self.purchase.party
delivery_date = None
if self.delivery_date_edit:
delivery_date = self.delivery_date_store
elif self.purchase and self.purchase.delivery_date:
delivery_date = self.purchase.delivery_date
- elif (self.product_supplier
+ elif (product_supplier
and self.quantity is not None
and self.quantity > 0
and self.purchase):
date = self.purchase.purchase_date if self.purchase else None
- delivery_date = self.product_supplier.compute_supply_date(
- date=date)
+ delivery_date = product_supplier.compute_supply_date(date=date)
if delivery_date == datetime.date.max:
delivery_date = None
if delivery_date and delivery_date < Date.today():
diff -r 4fc449934f98 -r 524acbc2210e view/party_form.xml
--- a/view/party_form.xml Sun Jan 17 01:24:33 2021 +0100
+++ b/view/party_form.xml Tue Jan 19 14:59:54 2021 +0100
@@ -9,6 +9,8 @@
<page string="Supplier" id="supplier">
<label name="customer_code"/>
<field name="customer_code"/>
+ <label name="supplier_lead_time"/>
+ <field name="supplier_lead_time"/>
</page>
</xpath>
</data>