changeset 0ac0488bff40 in modules/sale_supply:default
details:
https://hg.tryton.org/modules/sale_supply?cmd=changeset;node=0ac0488bff40
description:
Add sale_supply_production module
issue3257
review256721002
diffstat:
CHANGELOG | 2 +
doc/index.rst | 3 +-
sale.py | 60 ++++++++++++++++++++++++++++--------------------
view/sale_line_form.xml | 4 +-
4 files changed, 41 insertions(+), 28 deletions(-)
diffs (175 lines):
diff -r dbc67876e451 -r 0ac0488bff40 CHANGELOG
--- a/CHANGELOG Thu Mar 19 19:13:16 2020 +0100
+++ b/CHANGELOG Mon Apr 13 14:49:07 2020 +0200
@@ -1,3 +1,5 @@
+* Rename purchase request state into supply state
+
Version 5.4.0 - 2019-11-04
* Bug fixes (see mercurial logs for details)
diff -r dbc67876e451 -r 0ac0488bff40 doc/index.rst
--- a/doc/index.rst Thu Mar 19 19:13:16 2020 +0100
+++ b/doc/index.rst Mon Apr 13 14:49:07 2020 +0200
@@ -1,10 +1,11 @@
Sale Supply Module
##################
-The Sale Supply module adds a supply on sale option on product.
+The Sale Supply module adds a "supply on sale option" to purchasable products.
If checked, it will generate a purchase request for each sale line of this
product regardless of the stock levels. Once the purchased products are
received they are assigned on the customer shipments.
+If the purchase is cancelled the sale goes back to the default supply method.
.. warning::
If the shiment method is *On Invoice Paid*, the purchase request will be
diff -r dbc67876e451 -r 0ac0488bff40 sale.py
--- a/sale.py Thu Mar 19 19:13:16 2020 +0100
+++ b/sale.py Mon Apr 13 14:49:07 2020 +0200
@@ -11,7 +11,7 @@
def is_done(self):
done = super(Sale, self).is_done()
if done:
- if any(l.purchase_request_state in ('', 'requested')
+ if any(l.supply_state in {'', 'requested'}
for l in self.lines if l.supply_on_sale):
return False
return done
@@ -22,30 +22,36 @@
# information about requests during the shipments creation
# like the supplier
self.create_purchase_requests()
- self.create_move_from_purchase_requests()
+ self.create_move_from_supply()
shipments = super(Sale, self).create_shipment(shipment_type)
return shipments
def create_purchase_requests(self):
- 'Create the purchase requests for the sale'
+ pool = Pool()
+ PurchaseRequest = pool.get('purchase.request')
+ Line = pool.get('sale.line')
+ requests = []
+ lines = []
for line in self.lines:
request = line.get_purchase_request()
if not request:
continue
- request.save()
+ requests.append(request)
assert not line.purchase_request
line.purchase_request = request
- line.save()
+ lines.append(line)
+ PurchaseRequest.save(requests)
+ Line.save(lines)
- def create_move_from_purchase_requests(self):
- 'Set to draft move linked to purchase requests'
+ def create_move_from_supply(self):
+ 'Set to draft move linked to supply'
pool = Pool()
Move = pool.get('stock.move')
ShipmentOut = pool.get('stock.shipment.out')
moves = []
for line in self.lines:
- if line.purchase_request_state in ['purchased', 'cancel']:
+ if line.supply_state in {'supplied', 'cancelled'}:
for move in line.moves:
if move.state == 'staging':
moves.append(move)
@@ -60,25 +66,29 @@
purchase_request = fields.Many2One('purchase.request', 'Purchase Request',
ondelete='SET NULL', readonly=True)
- purchase_request_state = fields.Function(fields.Selection([
- ('', ''),
- ('requested', 'Requested'),
- ('purchased', 'Purchased'),
- ('cancel', 'Cancel'),
- ], 'Purchase Request State',
+ supply_state = fields.Function(fields.Selection([
+ ('', ""),
+ ('requested', "Requested"),
+ ('supplied', "Supplied"),
+ ('cancelled', "Cancelled"),
+ ], "Supply State",
states={
- 'invisible': ~Eval('purchase_request_state'),
- }), 'get_purchase_request_state')
+ 'invisible': ~Eval('supply_state'),
+ }), 'get_supply_state')
- def get_purchase_request_state(self, name):
+ @property
+ def has_supply(self):
+ return bool(self.purchase_request)
+
+ def get_supply_state(self, name):
if self.purchase_request is not None:
purchase_line = self.purchase_request.purchase_line
if purchase_line is not None:
purchase = purchase_line.purchase
if purchase.state == 'cancel':
- return 'cancel'
+ return 'cancelled'
elif purchase.state in ('processing', 'done'):
- return 'purchased'
+ return 'supplied'
return 'requested'
return ''
@@ -97,7 +107,6 @@
if (self.type != 'line'
or not self.product
or self.quantity <= 0
- or not self.product.purchasable
or any(m.state not in ['staging', 'cancel']
for m in self.moves)):
return False
@@ -107,9 +116,8 @@
move = super().get_move(shipment_type)
if (move
and shipment_type == 'out'
- and (self.supply_on_sale
- or self.purchase_request)):
- if self.purchase_request_state in ('', 'requested'):
+ and (self.supply_on_sale or self.has_supply)):
+ if self.supply_state in {'', 'requested'}:
move.state = 'staging'
return move
@@ -124,7 +132,9 @@
Uom = pool.get('product.uom')
Request = pool.get('purchase.request')
- if not self.supply_on_sale or self.purchase_request:
+ if (not self.supply_on_sale
+ or self.purchase_request
+ or not self.product.purchasable):
return
# Ensure to create the request for the maximum paid
@@ -170,7 +180,7 @@
Uom = pool.get('product.uom')
Move = pool.get('stock.move')
- if self.purchase_request_state != 'purchased':
+ if self.supply_state != 'supplied':
return
moves = set()
for move in self.moves:
diff -r dbc67876e451 -r 0ac0488bff40 view/sale_line_form.xml
--- a/view/sale_line_form.xml Thu Mar 19 19:13:16 2020 +0100
+++ b/view/sale_line_form.xml Mon Apr 13 14:49:07 2020 +0200
@@ -4,7 +4,7 @@
<data>
<xpath expr="/form/notebook/page/field[@name='shipping_date']"
position="after">
- <label name="purchase_request_state"/>
- <field name="purchase_request_state"/>
+ <label name="supply_state"/>
+ <field name="supply_state"/>
</xpath>
</data>