Commit d49ced68 authored by Sebastien Robin's avatar Sebastien Robin

inventory: fixed cases where an inventory forget to remove previous corrections

parent b418885f
...@@ -149,6 +149,8 @@ class Inventory(Delivery): ...@@ -149,6 +149,8 @@ class Inventory(Delivery):
stock_object_list = [] stock_object_list = []
stock_append = stock_object_list.append stock_append = stock_object_list.append
to_delete_stock_uid_set = set()
to_delete_stock_uid_add = to_delete_stock_uid_set.add
for inventory_calculation_dict in default_inventory_calculation_list: for inventory_calculation_dict in default_inventory_calculation_list:
...@@ -200,6 +202,8 @@ class Inventory(Delivery): ...@@ -200,6 +202,8 @@ class Inventory(Delivery):
return value return value
for movement in method(): for movement in method():
# Make sure we remove any any value
to_delete_stock_uid_add(movement.getUid())
if movement.getResourceValue() is not None and \ if movement.getResourceValue() is not None and \
movement.getInventoriatedQuantity() not in (None, ''): movement.getInventoriatedQuantity() not in (None, ''):
...@@ -325,18 +329,27 @@ class Inventory(Delivery): ...@@ -325,18 +329,27 @@ class Inventory(Delivery):
disable_archive=disable_archive, disable_archive=disable_archive,
immediate_reindex_archive=immediate_reindex_archive) immediate_reindex_archive=immediate_reindex_archive)
# Do deletion for everything first, even if there is no need to apply correction,
# in case we need to remove previous corrections
to_delete_stock_uid_add(self.getUid())
to_delete_list = []
to_delete_list_append = to_delete_list.append
for uid in to_delete_stock_uid_set:
temp_line = temp_constructor(self, inventory_id)
temp_line.setUid(uid)
to_delete_list_append(temp_line)
catalog_kw = dict(sql_catalog_id=sql_catalog_id,
disable_cache=1, check_uid=0, disable_archive=disable_archive,
immediate_reindex_archive=immediate_reindex_archive)
method_id_list = ['z0_uncatalog_stock']
if portal.portal_catalog.getSQLCatalog(sql_catalog_id) \
.hasObject('SQLCatalog_trimInventoryCacheOnCatalog'):
method_id_list.append('SQLCatalog_trimInventoryCacheOnCatalog')
# Delete existing stock records and old inventory_cache first.
portal.portal_catalog.catalogObjectList(
to_delete_list[:], method_id_list=method_id_list, **catalog_kw)
if stock_object_list: if stock_object_list:
kw = dict(sql_catalog_id=sql_catalog_id,
disable_cache=1, check_uid=0, disable_archive=disable_archive,
immediate_reindex_archive=immediate_reindex_archive)
method_id_list = ['z0_uncatalog_stock']
if portal.portal_catalog.getSQLCatalog(sql_catalog_id) \
.hasObject('SQLCatalog_trimInventoryCacheOnCatalog'):
method_id_list.append('SQLCatalog_trimInventoryCacheOnCatalog')
# Delete existing stock records and old inventory_cache first.
portal.portal_catalog.catalogObjectList(
stock_object_list[:], method_id_list=method_id_list, **kw)
# Then insert new records without delete. # Then insert new records without delete.
portal.portal_catalog.catalogObjectList( portal.portal_catalog.catalogObjectList(
stock_object_list, method_id_list=('z_catalog_stock_list_without_delete_for_inventory_virtual_movement', ), stock_object_list[:], method_id_list=('z_catalog_stock_list_without_delete_for_inventory_virtual_movement', ),
**kw) **catalog_kw)
\ No newline at end of file
...@@ -53,6 +53,15 @@ class TestInventoryModule(TestOrderMixin, ERP5TypeTestCase): ...@@ -53,6 +53,15 @@ class TestInventoryModule(TestOrderMixin, ERP5TypeTestCase):
def getInventoryModule(self): def getInventoryModule(self):
return getattr(self.getPortal(), 'inventory_module',None) return getattr(self.getPortal(), 'inventory_module',None)
def deliverPackingList(self, packing_list):
"""step through all steps of packing list workflow."""
packing_list.confirm()
packing_list.setReady()
packing_list.start()
packing_list.stop()
packing_list.deliver()
self.assertEqual(packing_list.getSimulationState(), 'delivered')
def stepCreateInitialMovements(self, sequence=None, **kw): def stepCreateInitialMovements(self, sequence=None, **kw):
"""Create movements before this inventory. """Create movements before this inventory.
""" """
...@@ -60,15 +69,6 @@ class TestInventoryModule(TestOrderMixin, ERP5TypeTestCase): ...@@ -60,15 +69,6 @@ class TestInventoryModule(TestOrderMixin, ERP5TypeTestCase):
splm = self.getPortal().sale_packing_list_module splm = self.getPortal().sale_packing_list_module
iplm = self.getPortal().internal_packing_list_module iplm = self.getPortal().internal_packing_list_module
def deliverPackingList(pl):
"""step through all steps of packing list workflow."""
pl.confirm()
pl.setReady()
pl.start()
pl.stop()
pl.deliver()
self.assertEqual(pl.getSimulationState(), 'delivered')
# we create content : # we create content :
# 1 purchase packing list # 1 purchase packing list
# 1 sale packing list # 1 sale packing list
...@@ -85,7 +85,7 @@ class TestInventoryModule(TestOrderMixin, ERP5TypeTestCase): ...@@ -85,7 +85,7 @@ class TestInventoryModule(TestOrderMixin, ERP5TypeTestCase):
resource_value=sequence.get('resource'), resource_value=sequence.get('resource'),
quantity=month*10) # dummy quantity, it will be quantity=month*10) # dummy quantity, it will be
# replaced by inventory # replaced by inventory
deliverPackingList(ppl) self.deliverPackingList(ppl)
spl = splm.newContent( spl = splm.newContent(
portal_type='Sale Packing List', portal_type='Sale Packing List',
...@@ -97,7 +97,7 @@ class TestInventoryModule(TestOrderMixin, ERP5TypeTestCase): ...@@ -97,7 +97,7 @@ class TestInventoryModule(TestOrderMixin, ERP5TypeTestCase):
spl.newContent( portal_type='Sale Packing List Line', spl.newContent( portal_type='Sale Packing List Line',
resource_value=sequence.get('resource'), resource_value=sequence.get('resource'),
quantity=month*10) quantity=month*10)
deliverPackingList(spl) self.deliverPackingList(spl)
ipl = iplm.newContent( ipl = iplm.newContent(
portal_type='Internal Packing List', portal_type='Internal Packing List',
...@@ -109,7 +109,7 @@ class TestInventoryModule(TestOrderMixin, ERP5TypeTestCase): ...@@ -109,7 +109,7 @@ class TestInventoryModule(TestOrderMixin, ERP5TypeTestCase):
ipl.newContent( portal_type='Internal Packing List Line', ipl.newContent( portal_type='Internal Packing List Line',
resource_value=sequence.get('resource'), resource_value=sequence.get('resource'),
quantity=month*10) quantity=month*10)
deliverPackingList(ipl) self.deliverPackingList(ipl)
def createInventory(self, start_date=None, def createInventory(self, start_date=None,
sequence=None,**kw): sequence=None,**kw):
...@@ -619,6 +619,131 @@ class TestInventoryModule(TestOrderMixin, ERP5TypeTestCase): ...@@ -619,6 +619,131 @@ class TestInventoryModule(TestOrderMixin, ERP5TypeTestCase):
sequence_list.play(self) sequence_list.play(self)
def createInitialDeliveryForCheckingUselessCorrection(self, sequence=None):
organisation = sequence.get('organisation1')
from_organisation = sequence.get('organsation2')
delivery = self.getPortal().internal_packing_list_module.newContent(
portal_type='Internal Packing List',
specialise=self.business_process,
source_value = from_organisation,
destination_value = organisation,
start_date=DateTime(2019, 02, 20),
)
resource_value = sequence.get('resource')
delivery.newContent( portal_type='Internal Packing List Line',
resource_value=resource_value,
quantity=2)
self.deliverPackingList(delivery)
self.tic()
return delivery
def stepCheckInventoryDoesNotKeepUselessCorrectionAtInventoryLevel(self, sequence=None):
organisation = sequence.get('organisation1')
resource_value = sequence.get('resource')
delivery = self.createInitialDeliveryForCheckingUselessCorrection(sequence=sequence)
def getInventoryQuantity():
return self.getSimulationTool().getCurrentInventory(node_uid=organisation.getUid(),
resource=resource_value.getRelativeUrl())
self.assertEqual(2, getInventoryQuantity())
inventory = self.getInventoryModule().newContent()
inventory.edit(start_date=DateTime(2019, 02, 21),
destination_value=organisation,
full_inventory=True)
inventory.deliver()
self.tic()
self.assertEqual(0, getInventoryQuantity())
delattr(delivery, 'workflow_history')
self.assertEqual('draft', delivery.getSimulationState())
delivery.reindexObject()
self.tic()
inventory.reindexObject()
self.tic()
self.assertEqual(0, getInventoryQuantity())
def test_06_InventoryDoesNotKeepUselessCorrectionAtInventoryLevel(self):
"""
We will create a movement, then a full inventory setting all stock to 0.
This will insert a correction line in stock table with uid of inventory.
But then, if initial movement is cancelled, a reindex of inventory must remove the correction
"""
sequence_list = SequenceList()
# Test with a simple inventory without cell
sequence_string = 'stepCreateNotVariatedResource \
stepCreateOrganisation1 \
stepTic \
stepCheckInventoryDoesNotKeepUselessCorrectionAtInventoryLevel'
sequence_list.addSequenceString(sequence_string)
sequence_list.play(self)
def stepCheckInventoryDoesNotKeepUselessCorrectionAtLineLevel(self, sequence=None):
organisation = sequence.get('organisation1')
resource_value = sequence.get('resource')
delivery = self.createInitialDeliveryForCheckingUselessCorrection(sequence=sequence)
def getInventoryQuantity():
return self.getSimulationTool().getCurrentInventory(node_uid=organisation.getUid(),
resource=resource_value.getRelativeUrl())
self.assertEqual(2, getInventoryQuantity())
inventory = self.getInventoryModule().newContent()
inventory.edit(start_date=DateTime(2019, 02, 21),
destination_value=organisation,
full_inventory=True)
inventory_line = inventory.newContent(portal_type='Inventory Line',
resource_value=resource_value,
quantity=3)
inventory.deliver()
self.tic()
self.assertEqual(3, getInventoryQuantity())
delattr(delivery, 'workflow_history')
self.assertEqual('draft', delivery.getSimulationState())
delivery.reindexObject()
self.tic()
inventory.reindexObject()
self.tic()
self.assertEqual(3, getInventoryQuantity())
# Even though this scenario might not really, happen, make sure the code does not
# keep a correction line for a resource which is not set any more
inventory_line.setResourceValue(None)
inventory.reindexObject()
self.tic()
self.assertEqual(0, getInventoryQuantity())
inventory_line.setResourceValue(resource_value)
inventory.reindexObject()
self.tic()
self.assertEqual(3, getInventoryQuantity())
# last safety check, make sure deletion of line of inventory has really an impact
inventory.manage_delObjects(ids=[inventory_line.getId()])
inventory.reindexObject()
self.tic()
self.assertEqual(0, getInventoryQuantity())
def test_07_InventoryDoesNotKeepUselessCorrectionAtLineLevel(self):
"""
We will create a movement, then a full inventory changing stock value.
This will insert a correction line in stock table with uid of inventory line.
But then, if initial movement is cancelled, a reindex of inventory must remove the correction
"""
sequence_list = SequenceList()
# Test with a simple inventory without cell
sequence_string = 'stepCreateNotVariatedResource \
stepCreateOrganisation1 \
stepTic \
stepCheckInventoryDoesNotKeepUselessCorrectionAtLineLevel'
sequence_list.addSequenceString(sequence_string)
sequence_list.play(self)
def test_suite(): def test_suite():
suite = unittest.TestSuite() suite = unittest.TestSuite()
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment