diff --git a/product/ERP5/Document/Immobilisation.py b/product/ERP5/Document/Immobilisation.py index bca24b751e4da31d24e0a4926fe07192bdd31c60..21bc08cadd8d93c97984f2474fb070788054c2cb 100755 --- a/product/ERP5/Document/Immobilisation.py +++ b/product/ERP5/Document/Immobilisation.py @@ -36,17 +36,18 @@ from Products.CMFCore.WorkflowCore import WorkflowMethod from Products.ERP5Type.XMLObject import XMLObject from Products.ERP5.Document.Amount import Amount from Products.ERP5.Document.Movement import Movement +from Products.ERP5.Document.Delivery import Delivery from string import capitalize from zLOG import LOG -class Immobilisation(Movement, XMLObject): +class Immobilisation(XMLObject, Delivery): """ An Immobilisation object holds the information about an accounting immobilisation (in order to amortise an object) It is an instant movement without source or destination, but which - implies a state change and a source_decision and a source_destination + implies a state change and a source_decision and a destination_decision Do not index in stock table """ meta_type = 'ERP5 Immobilisation' @@ -54,7 +55,7 @@ class Immobilisation(Movement, XMLObject): add_permission = Permissions.AddPortalContent isPortalContent = 1 isRADContent = 1 - isMovement = 1 + isMovement = 0 # Declarative security security = ClassSecurityInfo() @@ -78,318 +79,10 @@ class Immobilisation(Movement, XMLObject): , PropertySheet.Amortisation ) - - # Factory Type Information - factory_type_information = \ - { 'id' : portal_type - , 'meta_type' : meta_type - , 'description' : """\ -An Immobilisation object holds the information about -an accounting immobilisation (in order to amortise an object) - """ - , 'icon' : 'segment_icon.gif' - , 'product' : 'ERP5' - , 'factory' : 'addImmobilisation' - , 'immediate_view' : 'predicate_view' - , 'actions' : - ( { 'id' : 'view' - , 'name' : 'View' - , 'category' : 'object_view' - , 'action' : 'predicate_view' - , 'permissions' : ( - Permissions.View, ) - } - , { 'id' : 'print' - , 'name' : 'Print' - , 'category' : 'object_print' - , 'action' : 'segment_print' - , 'permissions' : ( - Permissions.View, ) - } - , { 'id' : 'metadata' - , 'name' : 'Metadata' - , 'category' : 'object_view' - , 'action' : 'metadata_edit' - , 'permissions' : ( - Permissions.View, ) - } - , { 'id' : 'translate' - , 'name' : 'Translate' - , 'category' : 'object_action' - , 'action' : 'segment_view' - , 'permissions' : ( - Permissions.TranslateContent, ) - } - ) - } - - - - security.declareProtected(Permissions.View, 'getDefaultDurability') - def getDefaultDurability(self, **kw): - """ - Returns a calculated value of the remaining durability - of the item at the immobilisation movement date - """ - item = self.getParent() - current_date = self.getStopDate() - if current_date is None or item is None: - return None - return item.getRemainingDurability(current_date, from_immobilisation=1, **kw) - - - security.declareProtected(Permissions.View, 'getDurabilityOrDefaultDurability') - def getDurabilityOrDefaultDurability(self, **kw): + security.declareProtected(Permissions.View, 'isMovement') + def isMovement(self, **kw): """ - Returns the remaining durability. - If it is None, returns the default durability - """ - durability = self.getDurability() - if durability is None: - durability = self.getDefaultDurability(**kw) - return durability - - - security.declareProtected(Permissions.View, 'getDefaultAmortisationDuration') - def getDefaultAmortisationDuration(self, **kw): - """ - Returns a calculated value of amortisation duration - at the immobilisation movement date - """ - item = self.getParent() - current_date = self.getStopDate() - if current_date is None or item is None: - return None - return item.getRemainingAmortisationDuration(current_date, from_immobilisation=1, **kw) - - - security.declareProtected(Permissions.View, 'getAmortisationOrDefaultAmortisationDuration') - def getAmortisationOrDefaultAmortisationDuration(self, **kw): - """ - Returns the remaining amortisation duration. - If it is None, returns the default remaining amortisation duration. - """ - amortisation_duration = self.getAmortisationDuration() - if amortisation_duration is None: - amortisation_duration = self.getDefaultAmortisationDuration(**kw) - return amortisation_duration - - - security.declareProtected(Permissions.ModifyPortalContent, 'getDefaultAmortisationPrice') - def getDefaultAmortisationPrice(self, with_currency=0, **kw): - """ - Returns a calculated value of amortisation value - at the immobilisation movement date - """ - item = self.getParent() - current_date = self.getStopDate() - if current_date is None or item is None: - return None - returned_value = item.getAmortisationPrice(current_date, from_immobilisation=1, with_currency=with_currency, **kw) - return returned_value - - - security.declareProtected(Permissions.View, 'getAmortisationOrDefaultAmortisationPrice') - def getAmortisationOrDefaultAmortisationPrice(self, with_currency=0, **kw): - """ - Returns the amortisation value. - If it is None, returns the default amortisation value. - """ - amortisation_price = self.getAmortisationStartPrice() - if amortisation_price is None: - amortisation_price = self.getDefaultAmortisationPrice(with_currency=with_currency, **kw) - return amortisation_price - - - security.declarePrivate('_checkConsistency') - def _checkConsistency(self, fixit=0, mapped_value_property_list=()): - relative_url = self.getRelativeUrl() - def checkValue(property_dict): - """ - property_dict must have the following format : - { "property_name" : { "values" : [list of forbidden values], "message" : - ["type of error", degree, "Error message"] }, - ... - } - """ - errors = [] - for property in property_dict.keys(): - getter = getattr(self, "get" + ''.join( [capitalize(x) for x in property.split("_")] ), None) - if getter is None: - errors += [(relative_url, "Accessor inconsistency", 100, "No accessor for property %s" % property)] - else: - property_value = getter() - forbidden_value_list = property_dict[property]["values"] - if property_value in forbidden_value_list: - message = property_dict[property]["message"] - errors += [(relative_url, message[0], message[1], message[2])] - return errors - - - errors = [] - - # Checks common to every amortisation method - errors.extend( checkValue( { "parent" : { "values": [None], "message": - [ "Property value inconsistency", 100, - "The immobilisation movement does not apply on an item" ] }, - "stop_date" : { "values": [None], "message": - [ "Property value inconsistency", 100, - "Date property is empty" ] }, - "durability": { "values": [None], "message": - [ "Property value inconsistency", 100, - "Durability property is empty" ] }, - } ) ) - - - if self.getImmobilisation(): - errors.extend( checkValue( { "amortisation_duration" : { "values" : [None], "message": - [ "Property value inconsistency", 100, - "Amortisation duration property is empty"] }, - "amortisation_start_price" : { "values" : [None], "message": - [ "Property value inconsistency", 100, - "Amortisation price property is empty"] }, - "amortisation_method" : { "values" : [None, ""], "message": - [ "Property value inconsistency", 100, - "No amortisation method"] }, - "vat" : { "values" : [None], "message": - [ "Property value inconsistency", 100, - "VAT Amount property is empty"] }, - "section_value" : { "values" : [None], "message": - [ "Property value inconsistency", 100, - "The corresponding item does not belong to an organisation at this date"] }, - "disposal_price" : { "values": [None], "message": - [ "Property value inconsistency", 100, - "Disposal price property is empty" ] }, - "price_currency" : { "values" : [None], "message": - [ "Property value inconsistency", 100, - "The organisation which owns the item at this date has no amortisation currency"] - } } ) ) - - - for (account, text) in ( (self.getInputAccount() , "Input Account"), - (self.getOutputAccount() , "Output Account"), - (self.getImmobilisationAccount(), "Immobilisation Account"), - (self.getAmortisationAccount() , "Amortisation Account"), - (self.getDepreciationAccount() , "Deprecisation Account"), - (self.getVatAccount() , "VAT Account") ): - if account is None or account is "": - errors += [(relative_url, "Property value inconsistency", 100, text + ' property is empty')] - - section = self.getSectionValue() - if section is not None: - financial_date = section.getFinancialYearStopDate() - if financial_date is None: - errors += [(relative_url, "Property value inconsistency", 100, - "The organisation which owns the item at this date has no financial year end date")] - - - # Checks specific to each amortisation method - if self.getAmortisationMethod(): - specific_parameter_list = self.getAmortisationMethodParameter("specific_parameter_list")["specific_parameter_list"] - for parameter in specific_parameter_list: - errors.extend( checkValue( { parameter : { "values" : [None], 'message': - ["Property value inconsistency", 100, - "%s property is empty" % parameter ] } } ) ) - - if errors: - LOG("errors :", 0, repr(errors)) - return errors - - - security.declareProtected(Permissions.View, 'getSectionValue') - def getSectionValue(self): + An Immobilisation must not be indexed in stock table, so it is not a Movement """ - Returns the organisation which owns the item on which the - immobilisation movement applies, at the time of the immobilisation - movement - See Item.getSectionValue for more details - """ - item = self.getParent() - date = self.getStopDate() - if item is None or date is None: - return None - return item.getSectionValue(at_date = date) - - - security.declareProtected(Permissions.View, 'getSectionTitle') - def getSectionTitle(self): - """ - Returns the name of the organisation which owns the - item on which the immobilisation movement applies, at the - time of the immobilisation movement - """ - section = self.getSectionValue() - if section is None: - return None - return section.getTitle() - - - security.declareProtected(Permissions.View, 'getPriceCurrency') - def getPriceCurrency(self): - """ - Returns the used currency id for this particular immobilisation movement - """ - section = self.getSectionValue() - if section is not None: - return section.getSocialCapitalCurrencyId() - return None - - - security.declareProtected(Permissions.View, 'checkImmobilisationConsistency') - def checkImmobilisationConsistency(self, *args, **kw): - """ - Checks the consistency about immobilisation values - """ - return self._checkConsistency(*args, **kw) - - - security.declareProtected(Permissions.View, 'getAmortisationMethodParameter') - def getAmortisationMethodParameter(self, parameter_list): - """ - Returns a dictionary containing the value of each parameter - whose name is given in parameter_list. - The value is get from the amortisation method parameter folder - (e.g. portal_skins/erp5_immobilisation/eu/linear) - This folder has specifical parameters needed for calculation - """ - if type(parameter_list) == type(""): - parameter_list = [parameter_list] - parameter_dict = {} - for parameter in parameter_list: - parameter_dict[parameter] = None - amortisation_method = self.getAmortisationMethod() - parameter_object = self.restrictedTraverse("erp5_accounting_" + amortisation_method) - if parameter_object is not None: - for parameter in parameter_list: - parameter_dict[parameter] = getattr(parameter_object, parameter, None) - return parameter_dict - - security.declareProtected(Permissions.View, 'isUsingAmortisationMethod') - def isUsingAmortisationMethod(self, method): - """ - Return true if this item is using the given method - """ - if self.getAmortisationMethod() == method: - return 1 return 0 - - security.declareProtected(Permissions.View, 'isUsingEuLinearAmortisationMethod') - def isUsingEuLinearAmortisationMethod(self): - """ - Return true if this item is using this method - """ - return self.isUsingAmortisationMethod('eu/linear') - - security.declareProtected(Permissions.View, 'isUsingFrDegressiveAmortisationMethod') - def isUsingFrDegressiveAmortisationMethod(self): - """ - Return true if this item is using this method - """ - return self.isUsingAmortisationMethod('fr/degressive') - - security.declareProtected(Permissions.View, 'isUsingFrActualUseAmortisationMethod') - def isUsingFrActualUseAmortisationMethod(self): - """ - Return true if this item is using this method - """ - return self.isUsingAmortisationMethod('fr/actual_use') +