Move carrier and cost from sale_shipment_cost to stock_shipment_cost

issue10375
review358031002
This commit is contained in:
Cédric Krier committed 2021-05-19 12:44:43 +02:00
1 parent 756f410d4a
commit 0ecdc46c41
6 files changed
+28 -109

No files matched your search

-6
View File
@@ -15,9 +15,3 @@ Two new fields are added to *Sale* and *Sale Configuration*:
At the quotation if a carrier is selected a new line is appended with the
shipment cost but the added line can be modified when going back to draft.
Three new fields are added to *Customer Shipment*:
- *Carrier*: The carrier used for the shipment.
- *Cost*: The cost of the shipment.
- *Cost Currency*: The currency of the cost.
-1
View File
@@ -65,7 +65,6 @@ requires.append(get_require_version('trytond'))
tests_require = [
get_require_version('proteus'),
get_require_version('trytond_stock_shipment_cost'),
]
for dep in ['account', 'party', 'stock', 'sale_promotion']:
tests_require.append(get_require_version('trytond_%s' % dep))
+20 -84
View File
@@ -12,66 +12,34 @@ from .exceptions import InvoiceShipmentCostError
class ShipmentOut(metaclass=PoolMeta):
__name__ = 'stock.shipment.out'
carrier = fields.Many2One('carrier', 'Carrier', states={
'readonly': ~Eval('state').in_(['draft', 'waiting', 'assigned',
'picked', 'packed']),
},
depends=['state'])
cost_used = fields.Function(fields.Numeric(
"Cost", digits=price_digits,
states={
'invisible': ~Eval('carrier') | Eval('cost_edit', False),
},
depends=['carrier', 'cost_edit']),
'on_change_with_cost_used')
cost = fields.Numeric(
"Cost", digits=price_digits,
states={
'invisible': ~Eval('carrier') | ~Eval('cost_edit', False),
'readonly': ~Eval('state').in_(
['draft', 'waiting', 'assigned', 'picked', 'packed']),
},
depends=['carrier', 'state'])
cost_sale_currency_used = fields.Function(fields.Many2One(
'currency.currency', "Cost Sale Currency",
states={
'invisible': ~Eval('carrier') | Eval('cost_edit', False),
'invisible': Eval('cost_edit', False),
},
depends=['carrier', 'cost_edit']),
depends=['cost_edit']),
'on_change_with_cost_sale_currency_used')
cost_sale_currency = fields.Many2One(
'currency.currency', "Cost Sale Currency",
states={
'invisible': ~Eval('carrier') | ~Eval('cost_edit', False),
'invisible': ~Eval('cost_edit', False),
'required': Bool(Eval('cost_sale')),
'readonly': ~Eval('state').in_(
['draft', 'waiting', 'assigned', 'picked', 'packed']),
}, depends=['carrier', 'cost_sale', 'state'])
'readonly': Eval('state').in_(['done', 'cancelled']),
}, depends=['cost_sale', 'state'])
cost_sale_used = fields.Function(fields.Numeric(
"Cost Sale", digits=price_digits,
states={
'invisible': ~Eval('carrier') | Eval('cost_edit', False),
'invisible': Eval('cost_edit', False),
},
depends=['carrier', 'cost_edit']),
depends=['cost_edit']),
'on_change_with_cost_sale_used')
cost_sale = fields.Numeric(
"Cost Sale", digits=price_digits,
states={
'invisible': ~Eval('carrier') | ~Eval('cost_edit', False),
'readonly': ~Eval('state').in_(
['draft', 'waiting', 'assigned', 'picked', 'packed']),
}, depends=['carrier', 'state'])
cost_edit = fields.Boolean(
"Edit Cost",
states={
'invisible': ~Eval('carrier'),
'readonly': ~Eval('state').in_(
['draft', 'waiting', 'assigned', 'picked', 'packed']),
},
depends=['carrier', 'state'],
help="Check to edit the cost.")
'invisible': ~Eval('cost_edit', False),
'readonly': ~Eval('state').in_(['done', 'cancelled']),
}, depends=['state'])
cost_invoice_line = fields.Many2One('account.invoice.line',
'Cost Invoice Line', readonly=True)
@@ -88,42 +56,21 @@ class ShipmentOut(metaclass=PoolMeta):
table_h.column_rename('cost_currency', 'cost_sale_currency')
super().__register__(module)
def _get_carrier_context(self):
return {}
def get_carrier_context(self):
return self._get_carrier_context()
@fields.depends('carrier', 'company', methods=['_get_carrier_context'])
def _compute_costs(self):
pool = Pool()
Currency = pool.get('currency.currency')
costs = {
'cost': None,
'cost_sale': None,
'cost_sale_currency': None,
}
costs = super()._compute_costs()
costs.update({
'cost_sale': None,
'cost_sale_currency': None,
})
if self.carrier:
with Transaction().set_context(self._get_carrier_context()):
cost, currency_id = self.carrier.get_purchase_price()
cost_sale, sale_currency_id = self.carrier.get_sale_price()
if cost is not None:
cost = Currency.compute(
Currency(currency_id), cost, self.company.currency,
round=False)
costs['cost'] = round_price(cost)
if cost_sale is not None:
costs['cost_sale'] = round_price(cost_sale)
costs['cost_sale_currency'] = sale_currency_id
return costs
@fields.depends('state', 'cost', 'cost_edit', methods=['_compute_costs'])
def on_change_with_cost_used(self, name=None):
if not self.cost_edit and self.state not in {'cancelled', 'done'}:
return self._compute_costs()['cost']
else:
return self.cost
@fields.depends(
'state', 'cost_sale', 'cost_edit', methods=['_compute_costs'])
def on_change_with_cost_sale_used(self, name=None):
@@ -140,11 +87,10 @@ class ShipmentOut(metaclass=PoolMeta):
elif self.cost_sale_currency:
return self.cost_sale_currency.id
@fields.depends(
'cost_edit', 'cost_used', 'cost_sale_used', 'cost_sale_currency_used')
@fields.depends('cost_edit', 'cost_sale_used', 'cost_sale_currency_used')
def on_change_cost_edit(self):
super().on_change_cost_edit()
if self.cost_edit:
self.cost = self.cost_used
self.cost_sale = self.cost_sale_used
self.cost_sale_currency = self.cost_sale_currency_used
@@ -214,19 +160,13 @@ class ShipmentOut(metaclass=PoolMeta):
cost = super()._get_shipment_cost()
methods = {
m.sale.shipment_cost_method for m in self.outgoing_moves if m.sale}
if methods == {None}:
cost += self.cost_used or 0
if 'shipment' in methods:
if self.cost_sale:
cost_sale = Currency.compute(
self.cost_sale_currency, self.cost_sale,
self.company.currency, round=False)
else:
cost_sale = 0
delta = cost_sale - (self.cost_used or 0)
if delta < 0:
cost -= delta
if 'order' in methods and self.cost_used:
cost -= cost_sale
if 'order' in methods:
sales = {
m.sale for m in self.outgoing_moves
if m.sale and m.sale.shipment_cost_method == 'order'}
@@ -235,10 +175,7 @@ class ShipmentOut(metaclass=PoolMeta):
(s.cost_used or 0) for s in sale.shipments
if s.state == 'done' and s != self)
cost_sale = sale.shipment_cost_amount
if cost_sale < shipment_cost:
cost += self.cost_used or 0
elif cost_sale < shipment_cost + (self.cost_used or 0):
cost += shipment_cost + self.cost_used - cost_sale
cost -= max(cost_sale - shipment_cost, 0)
return cost
@classmethod
@@ -246,7 +183,6 @@ class ShipmentOut(metaclass=PoolMeta):
@Workflow.transition('done')
def done(cls, shipments):
for shipment in shipments:
shipment.cost = shipment.cost_used
shipment.cost_sale = shipment.cost_sale_used
shipment.cost_sale_currency = shipment.cost_sale_currency_used
cls.save(shipments)
@@ -17,7 +17,6 @@ Activate modules::
>>> config = activate_modules([
... 'sale_shipment_cost',
... 'sale',
... 'stock_shipment_cost',
... ])
>>> Carrier = Model.get('carrier')
+1 -1
View File
@@ -9,9 +9,9 @@ depends:
res
sale
stock
stock_shipment_cost
extras_depend:
sale_promotion
stock_shipment_cost
xml:
sale.xml
stock.xml
+7 -16
View File
@@ -2,21 +2,12 @@
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
this repository contains the full copyright notices and license terms. -->
<data>
<xpath expr="/form/notebook" position="after">
<label name="carrier"/>
<field name="carrier"/>
<group id="costs" col="-1" colspan="2">
<label name="cost"/>
<label name="cost_used"/>
<field name="cost"/>
<field name="cost_used"/>
<label name="cost_sale"/>
<label name="cost_sale_used"/>
<field name="cost_sale"/>
<field name="cost_sale_used"/>
<field name="cost_sale_currency"/>
<field name="cost_sale_currency_used"/>
<field name="cost_edit"/>
</group>
<xpath expr="//field[@name='cost_used']" position="after">
<label name="cost_sale"/>
<label name="cost_sale_used"/>
<field name="cost_sale"/>
<field name="cost_sale_used"/>
<field name="cost_sale_currency"/>
<field name="cost_sale_currency_used"/>
</xpath>
</data>