Add stock: backport to 3.0 of http://codereview.tryton.org/2651002
This commit is contained in:
parent
eb3d0add10
commit
48f153555a
|
@ -0,0 +1,292 @@
|
||||||
|
Index: move.py
|
||||||
|
===================================================================
|
||||||
|
|
||||||
|
--- ./modules/stock/move.py
|
||||||
|
+++ ./modules/stock/move.py
|
||||||
|
@@ -181,7 +181,11 @@
|
||||||
|
| Eval('shipment'))
|
||||||
|
}, depends=['state', 'shipment'],
|
||||||
|
select=True)
|
||||||
|
- effective_date = fields.Date("Effective Date", readonly=True, select=True)
|
||||||
|
+ effective_date = fields.Date("Effective Date", readonly=True, select=True,
|
||||||
|
+ states={
|
||||||
|
+ 'required': Eval('state') == 'done',
|
||||||
|
+ },
|
||||||
|
+ depends=['state'])
|
||||||
|
state = fields.Selection([
|
||||||
|
('draft', 'Draft'),
|
||||||
|
('assigned', 'Assigned'),
|
||||||
|
@@ -565,36 +569,38 @@
|
||||||
|
product.default_uom, round=True)
|
||||||
|
return internal_quantity
|
||||||
|
|
||||||
|
+ def set_effective_date(self):
|
||||||
|
+ pool = Pool()
|
||||||
|
+ Date = pool.get('ir.date')
|
||||||
|
+
|
||||||
|
+ if not self.effective_date and self.shipment:
|
||||||
|
+ self.effective_date = self.shipment.effective_date
|
||||||
|
+ if not self.effective_date:
|
||||||
|
+ self.effective_date = Date.today()
|
||||||
|
+
|
||||||
|
@classmethod
|
||||||
|
@ModelView.button
|
||||||
|
@Workflow.transition('draft')
|
||||||
|
def draft(cls, moves):
|
||||||
|
- pass
|
||||||
|
+ cls.write(moves, {
|
||||||
|
+ 'effective_date': None,
|
||||||
|
+ })
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
@ModelView.button
|
||||||
|
@Workflow.transition('assigned')
|
||||||
|
def assign(cls, moves):
|
||||||
|
- pool = Pool()
|
||||||
|
- Date = pool.get('ir.date')
|
||||||
|
-
|
||||||
|
- today = Date.today()
|
||||||
|
for move in moves:
|
||||||
|
if not move.effective_date:
|
||||||
|
- move.effective_date = today
|
||||||
|
- move.save()
|
||||||
|
+ move.set_effective_date()
|
||||||
|
+ move.save()
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
@ModelView.button
|
||||||
|
@Workflow.transition('done')
|
||||||
|
def do(cls, moves):
|
||||||
|
- pool = Pool()
|
||||||
|
- Date = pool.get('ir.date')
|
||||||
|
-
|
||||||
|
- today = Date.today()
|
||||||
|
for move in moves:
|
||||||
|
- if not move.effective_date:
|
||||||
|
- move.effective_date = today
|
||||||
|
+ move.set_effective_date()
|
||||||
|
if (move.from_location.type in ('supplier', 'production')
|
||||||
|
and move.to_location.type == 'storage'
|
||||||
|
and move.product.cost_price_method == 'average'):
|
||||||
|
@@ -660,11 +666,11 @@
|
||||||
|
cls.raise_user_error('modify_done_cancel',
|
||||||
|
(move.rec_name,))
|
||||||
|
|
||||||
|
+ super(Move, cls).write(moves, vals)
|
||||||
|
+
|
||||||
|
if any(f not in cls._allow_modify_closed_period for f in vals):
|
||||||
|
cls.check_period_closed(moves)
|
||||||
|
|
||||||
|
- super(Move, cls).write(moves, vals)
|
||||||
|
-
|
||||||
|
for move in moves:
|
||||||
|
internal_quantity = cls._get_internal_quantity(move.quantity,
|
||||||
|
move.uom, move.product)
|
||||||
|
|
||||||
|
Index: shipment.py
|
||||||
|
===================================================================
|
||||||
|
|
||||||
|
--- ./modules/stock/shipment.py
|
||||||
|
+++ ./modules/stock/shipment.py
|
||||||
|
@@ -40,7 +40,9 @@
|
||||||
|
"Supplier Shipment"
|
||||||
|
__name__ = 'stock.shipment.in'
|
||||||
|
_rec_name = 'code'
|
||||||
|
- effective_date = fields.Date('Effective Date', readonly=True)
|
||||||
|
+ effective_date = fields.Date('Effective Date', states={
|
||||||
|
+ 'readonly': Eval('state').in_(['cancel', 'done']),
|
||||||
|
+ }, depends=['state'])
|
||||||
|
planned_date = fields.Date('Planned Date', states={
|
||||||
|
'readonly': Not(Equal(Eval('state'), 'draft')),
|
||||||
|
}, depends=['state'])
|
||||||
|
@@ -465,7 +467,7 @@
|
||||||
|
Move = pool.get('stock.move')
|
||||||
|
Date = pool.get('ir.date')
|
||||||
|
Move.do([m for s in shipments for m in s.inventory_moves])
|
||||||
|
- cls.write(shipments, {
|
||||||
|
+ cls.write([s for s in shipments if not s.effective_date], {
|
||||||
|
'effective_date': Date.today(),
|
||||||
|
})
|
||||||
|
|
||||||
|
@@ -474,7 +476,9 @@
|
||||||
|
"Supplier Return Shipment"
|
||||||
|
__name__ = 'stock.shipment.in.return'
|
||||||
|
_rec_name = 'code'
|
||||||
|
- effective_date = fields.Date('Effective Date', readonly=True)
|
||||||
|
+ effective_date = fields.Date('Effective Date', states={
|
||||||
|
+ 'readonly': ~Eval('state').in_(['cancel', 'done']),
|
||||||
|
+ }, depends=['state'])
|
||||||
|
planned_date = fields.Date('Planned Date',
|
||||||
|
states={
|
||||||
|
'readonly': Not(Equal(Eval('state'), 'draft')),
|
||||||
|
@@ -718,7 +722,7 @@
|
||||||
|
Date = pool.get('ir.date')
|
||||||
|
|
||||||
|
Move.do([m for s in shipments for m in s.moves])
|
||||||
|
- cls.write(shipments, {
|
||||||
|
+ cls.write([s for s in shipments if not s.effective_date], {
|
||||||
|
'effective_date': Date.today(),
|
||||||
|
})
|
||||||
|
|
||||||
|
@@ -780,7 +784,9 @@
|
||||||
|
"Customer Shipment"
|
||||||
|
__name__ = 'stock.shipment.out'
|
||||||
|
_rec_name = 'code'
|
||||||
|
- effective_date = fields.Date('Effective Date', readonly=True)
|
||||||
|
+ effective_date = fields.Date('Effective Date', states={
|
||||||
|
+ 'readonly': Eval('state').in_(['cancel', 'done']),
|
||||||
|
+ }, depends=['state'])
|
||||||
|
planned_date = fields.Date('Planned Date',
|
||||||
|
states={
|
||||||
|
'readonly': Not(Equal(Eval('state'), 'draft')),
|
||||||
|
@@ -1194,7 +1200,7 @@
|
||||||
|
Date = pool.get('ir.date')
|
||||||
|
|
||||||
|
Move.do([m for s in shipments for m in s.outgoing_moves])
|
||||||
|
- cls.write(shipments, {
|
||||||
|
+ cls.write([s for s in shipments if not s.effective_date], {
|
||||||
|
'effective_date': Date.today(),
|
||||||
|
})
|
||||||
|
|
||||||
|
@@ -1312,7 +1318,9 @@
|
||||||
|
"Customer Return Shipment"
|
||||||
|
__name__ = 'stock.shipment.out.return'
|
||||||
|
_rec_name = 'code'
|
||||||
|
- effective_date = fields.Date('Effective Date', readonly=True)
|
||||||
|
+ effective_date = fields.Date('Effective Date', states={
|
||||||
|
+ 'readonly': Eval('state').in_(['cancel', 'done']),
|
||||||
|
+ }, depends=['state'])
|
||||||
|
planned_date = fields.Date('Planned Date',
|
||||||
|
states={
|
||||||
|
'readonly': Not(Equal(Eval('state'), 'draft')),
|
||||||
|
@@ -1654,7 +1662,7 @@
|
||||||
|
Move = pool.get('stock.move')
|
||||||
|
Date = pool.get('ir.date')
|
||||||
|
Move.do([m for s in shipments for m in s.inventory_moves])
|
||||||
|
- cls.write(shipments, {
|
||||||
|
+ cls.write([s for s in shipments if not s.effective_date], {
|
||||||
|
'effective_date': Date.today(),
|
||||||
|
})
|
||||||
|
|
||||||
|
@@ -1752,7 +1760,9 @@
|
||||||
|
"Internal Shipment"
|
||||||
|
__name__ = 'stock.shipment.internal'
|
||||||
|
_rec_name = 'code'
|
||||||
|
- effective_date = fields.Date('Effective Date', readonly=True)
|
||||||
|
+ effective_date = fields.Date('Effective Date', states={
|
||||||
|
+ 'readonly': Eval('state').in_(['cancel', 'done']),
|
||||||
|
+ }, depends=['state'])
|
||||||
|
planned_date = fields.Date('Planned Date',
|
||||||
|
states={
|
||||||
|
'readonly': Not(Equal(Eval('state'), 'draft')),
|
||||||
|
@@ -1972,7 +1982,7 @@
|
||||||
|
Move = pool.get('stock.move')
|
||||||
|
Date = pool.get('ir.date')
|
||||||
|
Move.do([m for s in shipments for m in s.moves])
|
||||||
|
- cls.write(shipments, {
|
||||||
|
+ cls.write([s for s in shipments if not s.effective_date], {
|
||||||
|
'effective_date': Date.today(),
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
Index: tests/scenario_stock_shipment_out.rst
|
||||||
|
===================================================================
|
||||||
|
|
||||||
|
--- ./modules/stock/tests/scenario_stock_shipment_out.rst
|
||||||
|
+++ ./modules/stock/tests/scenario_stock_shipment_out.rst
|
||||||
|
@@ -13,6 +13,7 @@
|
||||||
|
>>> from decimal import Decimal
|
||||||
|
>>> from proteus import config, Model, Wizard
|
||||||
|
>>> today = datetime.date.today()
|
||||||
|
+ >>> yesterday = today - relativedelta(days=1)
|
||||||
|
|
||||||
|
Create database::
|
||||||
|
|
||||||
|
@@ -158,6 +159,14 @@
|
||||||
|
>>> states.sort()
|
||||||
|
>>> states
|
||||||
|
[u'assigned', u'draft']
|
||||||
|
+ >>> effective_dates = [m.effective_date for m in
|
||||||
|
+ ... shipment_out.inventory_moves]
|
||||||
|
+ >>> effective_dates == [today, None]
|
||||||
|
+ True
|
||||||
|
+ >>> planned_dates = [m.planned_date for m in
|
||||||
|
+ ... shipment_out.outgoing_moves]
|
||||||
|
+ >>> planned_dates == [today, today]
|
||||||
|
+ True
|
||||||
|
|
||||||
|
Delete the draft move, assign and pack shipment::
|
||||||
|
|
||||||
|
@@ -188,6 +197,14 @@
|
||||||
|
>>> shipment_out.reload()
|
||||||
|
>>> set([m.state for m in shipment_out.outgoing_moves])
|
||||||
|
set([u'done'])
|
||||||
|
+ >>> planned_dates = [m.planned_date for m in
|
||||||
|
+ ... shipment_out.outgoing_moves]
|
||||||
|
+ >>> planned_dates == [today, today]
|
||||||
|
+ True
|
||||||
|
+ >>> effective_dates = [m.effective_date for m in
|
||||||
|
+ ... shipment_out.outgoing_moves]
|
||||||
|
+ >>> effective_dates == [today, today]
|
||||||
|
+ True
|
||||||
|
>>> len(shipment_out.outgoing_moves)
|
||||||
|
2
|
||||||
|
>>> len(shipment_out.inventory_moves)
|
||||||
|
@@ -197,3 +214,56 @@
|
||||||
|
>>> sum([m.quantity for m in shipment_out.inventory_moves]) == \
|
||||||
|
... sum([m.quantity for m in shipment_out.outgoing_moves])
|
||||||
|
True
|
||||||
|
+
|
||||||
|
+Create Shipment Out with effective date::
|
||||||
|
+
|
||||||
|
+ >>> ShipmentOut = Model.get('stock.shipment.out')
|
||||||
|
+ >>> shipment_out = ShipmentOut()
|
||||||
|
+ >>> shipment_out.planned_date = yesterday
|
||||||
|
+ >>> shipment_out.effective_date = yesterday
|
||||||
|
+ >>> shipment_out.customer = customer
|
||||||
|
+ >>> shipment_out.warehouse = warehouse_loc
|
||||||
|
+ >>> shipment_out.company = company
|
||||||
|
+ >>> move = StockMove()
|
||||||
|
+ >>> shipment_out.outgoing_moves.append(move)
|
||||||
|
+ >>> move.product = product
|
||||||
|
+ >>> move.uom =unit
|
||||||
|
+ >>> move.quantity = 1
|
||||||
|
+ >>> move.from_location = output_loc
|
||||||
|
+ >>> move.to_location = customer_loc
|
||||||
|
+ >>> move.company = company
|
||||||
|
+ >>> move.unit_price = Decimal('1')
|
||||||
|
+ >>> move.currency = currency
|
||||||
|
+ >>> shipment_out.save()
|
||||||
|
+ >>> ShipmentOut.wait([shipment_out.id], config.context)
|
||||||
|
+
|
||||||
|
+Make 1 unit of the product available::
|
||||||
|
+
|
||||||
|
+ >>> incoming_move = StockMove()
|
||||||
|
+ >>> incoming_move.product = product
|
||||||
|
+ >>> incoming_move.uom = unit
|
||||||
|
+ >>> incoming_move.quantity = 1
|
||||||
|
+ >>> incoming_move.from_location = supplier_loc
|
||||||
|
+ >>> incoming_move.to_location = storage_loc
|
||||||
|
+ >>> incoming_move.planned_date = yesterday
|
||||||
|
+ >>> incoming_move.effective_date = yesterday
|
||||||
|
+ >>> incoming_move.company = company
|
||||||
|
+ >>> incoming_move.unit_price = Decimal('1')
|
||||||
|
+ >>> incoming_move.currency = currency
|
||||||
|
+ >>> incoming_move.save()
|
||||||
|
+ >>> StockMove.do([incoming_move.id], config.context)
|
||||||
|
+
|
||||||
|
+Finish the shipment::
|
||||||
|
+
|
||||||
|
+ >>> ShipmentOut.assign_try([shipment_out.id], config.context)
|
||||||
|
+ True
|
||||||
|
+ >>> ShipmentOut.pack([shipment_out.id], config.context)
|
||||||
|
+ >>> ShipmentOut.done([shipment_out.id], config.context)
|
||||||
|
+ >>> shipment_out.reload()
|
||||||
|
+ >>> shipment_out.state
|
||||||
|
+ u'done'
|
||||||
|
+ >>> shipment_out.outgoing_moves[0].effective_date == yesterday
|
||||||
|
+ True
|
||||||
|
+ >>> shipment_out.inventory_moves[0].effective_date == yesterday
|
||||||
|
+ True
|
||||||
|
+
|
||||||
|
|
Loading…
Reference in New Issue