diff --git a/product/ERP5/Document/Inventory.py b/product/ERP5/Document/Inventory.py index 00ac0c873921d675d5b94a20e46ad536419ce5e8..613c040b11f6b051a69c379fc14f319d192643fc 100755 --- a/product/ERP5/Document/Inventory.py +++ b/product/ERP5/Document/Inventory.py @@ -29,6 +29,8 @@ from AccessControl import ClassSecurityInfo from Products.ERP5Type import Permissions, PropertySheet from Products.ERP5.Document.Delivery import Delivery +from Acquisition import aq_base +from zLOG import LOG class Inventory(Delivery): """ @@ -64,3 +66,87 @@ class Inventory(Delivery): Returns the current state in simulation """ return 'delivered' # For now, consider that Inventory has no workflow XXX + + + def immediateReindexObject(self,**kw): + """ + Rewrite reindexObject so that we can insert lines in stock table + to make sure all stock values for resources in this inventory + is equal to null before the date of this inventory + """ + resource_and_variation_list = [] + stock_object_list = [] + from Products.ERP5Type.Document import newTempDeliveryLine + start_date = self.getStartDate() + node = self.getDestination() + for movement in self.getMovementList(): + resource = movement.getResourceValue() + variation_text = movement.getVariationText() + if (resource,variation_text) not in resource_and_variation_list: + resource_and_variation_list.append((resource,variation_text)) + current_inventory_list = resource.getInventoryList( \ + to_date = start_date + , variation_text = variation_text + , node = node + , simulation_state = self.getPortalCurrentInventoryStateList() + , group_by_sub_variation = 1 + , group_by_variation = 1 + ) + kwd = {'uid':self.getUid()} + kwd['start_date'] = start_date + variation_list = variation_text.split('/n') + for inventory in current_inventory_list: + sub_variation_list = [] + if inventory.sub_variation_text is not None: + sub_variation_list = inventory.sub_variation_text.split('\n') + category_list = self.getCategoryList() + if inventory.total_quantity != 0: + temp_delivery_line = newTempDeliveryLine(self, + self.getId()) + kwd['quantity'] = - inventory.total_quantity + category_list.append('resource/%s' % inventory.resource_relative_url) + category_list.extend(variation_list) + category_list.extend(sub_variation_list) + kwd['category_list'] = category_list + temp_delivery_line.edit(**kwd) + stock_object_list.append(temp_delivery_line) + object_list = [self] + self.portal_catalog.catalogObjectList(object_list) + self.portal_catalog.catalogObjectList(stock_object_list, + method_id_list=('z_catalog_stock_list',), + disable_cache=1) + + security.declarePublic( 'recursiveReindexObject' ) + def recursiveReindexObject(self, *args, **kw): + """ + Do not use group_method_id for the inventory, but it can + be used for inventory lines and cells + """ + root_indexable = int(getattr(self.getPortalObject(),'isIndexable',1)) + self._reindexObject() + if self.isIndexable and root_indexable: + self.activate(group_method_id='portal_catalog/catalogObjectList', + expand_method_id='getIndexableChildValueList', + **kw).recursiveImmediateReindexObject(*args, **kw) + + security.declareProtected( Permissions.AccessContentsInformation, 'getIndexableChildValueList' ) + def getIndexableChildValueList(self): + """ + Get indexable childen recursively. + """ + value_list = [] + if self.isIndexable: + #value_list.append(self) # do not include self + for c in self.objectValues(): + if hasattr(aq_base(c), 'getIndexableChildValueList'): + value_list.extend(c.getIndexableChildValueList()) + return value_list + + def _reindexObject(self, *args, **kw): + """ + Defined here because we want to + Make sure to call without the group_method_id for inventories + """ + root_indexable = int(getattr(self.getPortalObject(),'isIndexable',1)) + if self.isIndexable and root_indexable: + self.activate(**kw).immediateReindexObject(*args, **kw)