diff --git a/product/ERP5/Document/ImmobilisableItem.py b/product/ERP5/Document/ImmobilisableItem.py index 2b04de5ac6e2ca93b7c5106de8107e431759788e..8dc94836b601607092ce4c69508211e0548772c6 100644 --- a/product/ERP5/Document/ImmobilisableItem.py +++ b/product/ERP5/Document/ImmobilisableItem.py @@ -88,15 +88,18 @@ class ImmobilisableItem(XMLObject, Amount): owner_movement_list = None, **kw): """ - Returns a dictionary of lists containing movements related to amortisation system - from_date is included, to_date is excluded - filter_valid eliminates all invalid immobilisation movements in immobilisation movement list. - Also, only movements in current_inventory state are returned if filter_valid is set. - If filter_valid is set and some movements are in state 'calculating', a ImmobilisationValidityError is launch - immobilisation_movement and owner_change specify which lists to return - immobilisation_movement_list is the list of movements to use instead of looking in SQL. Warning : in the case of - movement_list is provided, no filter is applied on it (unless looking at each movement validity) - and movement_list is supposed to be well sorted. + Returns a dictionary of lists containing movements related to amortisation + system from_date is included, to_date is excluded filter_valid eliminates + all invalid immobilisation movements in immobilisation movement list. + Also, only movements in current_inventory state are returned + if filter_valid is set. + If filter_valid is set and some movements are in state 'calculating', + a ImmobilisationValidityError is launch. + Immobilisation_movement and owner_change specify which lists to return + immobilisation_movement_list is the list of movements to use instead of + looking in SQL. Warning : in the case of movement_list is provided, + no filter is applied on it (unless looking at each movement validity) and + movement_list is supposed to be well sorted. The search is based on catalog so you can use related keys """ @@ -145,7 +148,8 @@ class ImmobilisableItem(XMLObject, Amount): movement = movement.getObject() if movement.getStopDate() is not None: # Test immobilisation movement - if filter_valid and movement.getImmobilisationState() in ['invalid','calculating']: + if filter_valid and movement.getImmobilisationState() in ('invalid', + 'calculating',): raise ImmobilisationValidityError, \ '%s : some preceding movements are still in calculating state' % self.getRelativeUrl() immo_list.append(movement) @@ -215,7 +219,8 @@ class ImmobilisableItem(XMLObject, Amount): filter_valid=1, **kw): """ - Returns a list of immobilisation movements applied to current item from date to date + Returns a list of immobilisation movements applied to current item from + date to date Argument filter_valid allows to select only the valid immobilisation movements """ return self.getImmobilisationRelatedMovementList(from_date=from_date, @@ -237,25 +242,25 @@ class ImmobilisableItem(XMLObject, Amount): security.declareProtected(Permissions.View, 'getPastImmobilisationMovementValueList') def getPastImmobilisationMovementValueList(self, from_date=None, at_date=None, **kw): """ - Returns a list of immobilisation movements applied to current item before the given date, or now + Returns a list of immobilisation movements applied to current item + before the given date, or now """ if at_date is None: at_date = DateTime() - result = self.getImmobilisationMovementValueList(from_date = from_date, - to_date = at_date, - **kw ) + result = self.getImmobilisationMovementValueList(from_date=from_date, + to_date=at_date, **kw ) return result security.declareProtected(Permissions.View, 'getFutureImmobilisationMovementValueList') def getFutureImmobilisationMovementValueList(self, to_date=None, at_date=None, from_movement=None, **kw): """ - Returns a list of immobilisation movements applied to current item after the given date (excluded), or now - If from_movement is set and the given movement is found, remove it from the list + Returns a list of immobilisation movements applied to current item + after the given date (excluded), or now. + If from_movement is set and the given movement is found, remove it from the list. """ if at_date is None: at_date = DateTime() at_date = at_date + millis - result = self.getImmobilisationMovementValueList(from_date = at_date, - to_date = to_date, - **kw) + result = self.getImmobilisationMovementValueList(from_date=at_date, + to_date=to_date, **kw) if from_movement is not None and from_movement in result: result.remove(from_movement) return result @@ -266,7 +271,7 @@ class ImmobilisableItem(XMLObject, Amount): """ Returns the last immobilisation movement before the given date, or now """ - past_list = self.getPastImmobilisationMovementValueList(at_date = at_date, **kw) + past_list = self.getPastImmobilisationMovementValueList(at_date=at_date, **kw) if len(past_list) > 0: return past_list[-1] return None @@ -278,9 +283,10 @@ class ImmobilisableItem(XMLObject, Amount): If from_movement is set and the given movement is the next one, returns the second next movement """ - future_list = self.getFutureImmobilisationMovementValueList(at_date = at_date, - from_movement=from_movement, - **kw) + future_list = self.getFutureImmobilisationMovementValueList( + at_date=at_date, + from_movement=from_movement, + **kw) if len(future_list) > 0: return future_list[0] return None @@ -315,11 +321,13 @@ class ImmobilisableItem(XMLObject, Amount): else: for key in keys: current_period[key] = previous_period[key] - ##### - - # We need to separate immobilisation treatment from section_change movements treatment - # An immobilisation is a movement which contains immobilisation data and MAY change the section - # A section change movement DOES NOT contain immobilisation data + """ + We need to separate immobilisation treatment from section_change + movements treatment. + An immobilisation is a movement which contains immobilisation data + and MAY change the section. + A section change movement DOES NOT contain immobilisation data + """ immobilisation_list = self.getImmobilisationMovementValueList(from_date=from_date, to_date=to_date, **kw) @@ -337,19 +345,23 @@ class ImmobilisableItem(XMLObject, Amount): "Some movements related to item %s have the same date" % self.getRelativeUrl() elif section_movement.getStopDate() not in date_list and \ section_movement not in section_movement_list: - # The section movement is different from immobilisation movements + #The section movement is different from immobilisation movements date_list.append(section_movement.getStopDate()) section_movement_list.append(section_movement) else: - # It means the current section_movement is a movement in immobilisation_list + #It means the current section_movement is a movement in immobilisation_list if section_movement.getAmortisationMethod() in ("", None, NO_CHANGE_METHOD): section_movement_list.append(section_movement) immobilisation_list.remove(section_movement) - # At this stade, section_movement_list contains the movements which only change the owner - # immobilisation_list contains movements with immobilisation data and which - # may change the owner, but it may contain some movements which does not change the owner - # but with a NO_CHANGE_METHOD. Such movements must not be took into account, because they - # do not define a new immobilisation period. So remove them. + """ + At this stade, section_movement_list contains the movements which only + change the owner. + Immobilisation_list contains movements with immobilisation data and which + may change the owner, but it may contain some movements which does not + change the owner but with a NO_CHANGE_METHOD. + Such movements must not be took into account, because they do not define + a new immobilisation period. So remove them. + """ for immobilisation in immobilisation_list[:]: if immobilisation.getAmortisationMethod() in ("", None, NO_CHANGE_METHOD): immobilisation_list.remove(immobilisation) @@ -357,8 +369,10 @@ class ImmobilisableItem(XMLObject, Amount): current_immo_period = {} immo_cursor = 0 section_cursor = 0 - while immo_cursor <= len(immobilisation_list) and section_cursor <= len(section_movement_list) and \ - not (immo_cursor == len(immobilisation_list) and section_cursor == len(section_movement_list)): + while immo_cursor <= len(immobilisation_list) and\ + section_cursor <= len(section_movement_list) and \ + not (immo_cursor == len(immobilisation_list) and \ + section_cursor == len(section_movement_list)): immobilisation = None section_movement = None is_immo_movement = 0 @@ -396,12 +410,14 @@ class ImmobilisableItem(XMLObject, Amount): open_new_period = 0 # First close the previous immobilisation period if current_immo_period not in (None, {}): - current_immo_period['stop_durability'] = self.getRemainingDurability(at_date=movement.getStopDate(), - immo_period_list=immo_period_list+[current_immo_period], - immo_cache_dict=immo_cache_dict) - current_immo_period['stop_duration'] = self.getRemainingAmortisationDuration(at_date=movement.getStopDate(), - immo_period_list=immo_period_list+[current_immo_period], - immo_cache_dict=immo_cache_dict) + current_immo_period['stop_durability'] = self.getRemainingDurability( + at_date=movement.getStopDate(), + immo_period_list=immo_period_list+[current_immo_period], + immo_cache_dict=immo_cache_dict) + current_immo_period['stop_duration'] = self.getRemainingAmortisationDuration( + at_date=movement.getStopDate(), + immo_period_list=immo_period_list+[current_immo_period], + immo_cache_dict=immo_cache_dict) current_immo_period['stop_movement'] = movement current_immo_period['stop_date'] = movement.getStopDate() immo_period_list.append(current_immo_period) @@ -411,7 +427,8 @@ class ImmobilisableItem(XMLObject, Amount): # Then open the new one if open_new_period and method != UNIMMOBILISING_METHOD: # First check if there is a valid owner in this period - section = self.getSectionValue(at_date = movement.getStopDate(), include_to_date=1) + section = self.getSectionValue(at_date=movement.getStopDate(), + include_to_date=1) if (section is not None) and \ (section.getPriceCurrencyValue() is not None) and \ (section.getFinancialYearStopDate() is not None): @@ -419,8 +436,11 @@ class ImmobilisableItem(XMLObject, Amount): if is_immo_movement: previous_period_method = None current_immo_period['continuous_movement'] = movement.getAmortisationMethodParameterForItem(self,"continuous")['continuous'] - # The current movement is an immobilisation movement - # We fill each 'start' and 'initial' property by looking at the movement properties + """ + The current movement is an immobilisation movement. + We fill each 'start' and 'initial' property by looking at the movement + properties + """ property_list = IMMOBILISATION_NEEDED_PROPERTY_LIST + \ IMMOBILISATION_UNCONTINUOUS_NEEDED_PROPERTY_LIST + \ IMMOBILISATION_FACULTATIVE_PROPERTY_LIST @@ -435,20 +455,29 @@ class ImmobilisableItem(XMLObject, Amount): current_immo_period['start_' + key] = value current_immo_period['initial_' + key] = value else: - # The current movement is a section change movement - # We get 'start' properties from previous period, and set some other - # 'start' properties by calculation + """ + The current movement is a section change movement. + We get 'start' properties from previous period, and set some other + 'start' properties by calculation + """ current_immo_period['start_date'] = movement.getStopDate() - setPreviousPeriodParameters(immo_period_list, current_immo_period, prefix='start') + setPreviousPeriodParameters(immo_period_list, + current_immo_period, + prefix='start') current_immo_period['start_date'] = movement.getStopDate() - setPreviousPeriodParameters(immo_period_list, current_immo_period, keys=['continuous_movement']) + setPreviousPeriodParameters(immo_period_list, + current_immo_period, + keys=['continuous_movement']) current_immo_period['start_vat'] = 0 current_immo_period['start_extra_cost_price'] = 0 - current_immo_period['start_main_price'] = self.getAmortisationPrice(at_date=movement.getStopDate(), - immo_cache_dict=immo_cache_dict) - current_immo_period['start_duration'] = self.getRemainingAmortisationDuration(at_date=movement.getStopDate(), - immo_cache_dict=immo_cache_dict) - current_immo_period['start_durability'] = self.getRemainingDurability(at_date=movement.getStopDate(), + current_immo_period['start_main_price'] = self.getAmortisationPrice( + at_date=movement.getStopDate(), + immo_cache_dict=immo_cache_dict) + current_immo_period['start_duration'] = self.getRemainingAmortisationDuration( + at_date=movement.getStopDate(), + immo_cache_dict=immo_cache_dict) + current_immo_period['start_durability'] = self.getRemainingDurability( + at_date=movement.getStopDate(), immo_cache_dict=immo_cache_dict) method = current_immo_period.get('start_method', "") # For both types of movement, set some properties @@ -460,10 +489,14 @@ class ImmobilisableItem(XMLObject, Amount): current_immo_period['start_price'] = (main_price or 0.) + (extra_cost_price or 0.) current_immo_period['initial_price'] = current_immo_period['start_price'] current_immo_period['owner'] = section - # Determine if this period continues a previous one - # There are two concepts of 'continuing' : - # - "continuous" means the current period is continuing the previous immobilisation - # - "adjacent" means the current period will use previous period data but starts a new immobilisation + """ + Determine if this period continues a previous one. + There are two concepts of 'continuing' : + - "continuous" means the current period is continuing the previous + immobilisation + - "adjacent" means the current period will use previous period + data but starts a new immobilisation + """ continuous = 0 adjacent = 0 if len(immo_period_list)>0: @@ -475,8 +508,11 @@ class ImmobilisableItem(XMLObject, Amount): method in ("", NO_CHANGE_METHOD) \ ) and \ immo_period_list[-1]['stop_date'] == movement.getStopDate() - # We must check if the current owner is in the same group as the previous one, in - # order to know if this period is completely new or not + """ + We must check if the current owner is in the same group as + the previous one, in order to know if this period is completely + new or not + """ previous_section = self.getSectionValue(at_date = movement.getStopDate()) continuous = adjacent and not ( previous_section is None or \ @@ -491,19 +527,25 @@ class ImmobilisableItem(XMLObject, Amount): # A continuous period gets 'initial' data from previous period. setPreviousPeriodParameters(immo_period_list, current_immo_period) elif adjacent: - # An adjacent period calculates some start values then copies them to initial values - # These values overload 'initial' values acquired from previous period + """ + An adjacent period calculates some start values then copies them to + initial values. + These values overload 'initial' values acquired from previous period + """ setPreviousPeriodParameters(immo_period_list, current_immo_period) if is_immo_movement: - # Calculation of start values is already done above for section change movements + #Calculation of start values is already done above for section change movements current_immo_period['start_vat'] = 0 current_immo_period['start_extra_cost_price'] = 0 - current_immo_period['start_main_price'] = self.getAmortisationPrice(at_date=movement.getStopDate(), - immo_cache_dict=immo_cache_dict) - current_immo_period['start_duration'] = self.getRemainingAmortisationDuration(at_date=movement.getStopDate(), - immo_cache_dict=immo_cache_dict) - current_immo_period['start_durability'] = self.getRemainingDurability(at_date=movement.getStopDate(), - immo_cache_dict=immo_cache_dict) + current_immo_period['start_main_price'] = self.getAmortisationPrice( + at_date=movement.getStopDate(), + immo_cache_dict=immo_cache_dict) + current_immo_period['start_duration'] = self.getRemainingAmortisationDuration( + at_date=movement.getStopDate(), + immo_cache_dict=immo_cache_dict) + current_immo_period['start_durability'] = self.getRemainingDurability( + at_date=movement.getStopDate(), + immo_cache_dict=immo_cache_dict) extra_cost_price = current_immo_period.get('start_extra_cost_price') main_price = current_immo_period.get('start_main_price') current_immo_period['start_price'] = (main_price or 0.) + (extra_cost_price or 0.) @@ -511,7 +553,7 @@ class ImmobilisableItem(XMLObject, Amount): for key in key_list: value = current_immo_period[key] if key.find('_') != -1: - if key.split('_')[0] == 'start' and value not in (None,"",NO_CHANGE_METHOD): + if key.split('_')[0] == 'start' and value not in (None, '', NO_CHANGE_METHOD): current_immo_period['initial_%s' % '_'.join(key.split('_')[1:])] = value else: # A period wich is alone only copies start values to initial ones @@ -530,39 +572,37 @@ class ImmobilisableItem(XMLObject, Amount): movement.getNeededSpecificParameterListForItem(self) + \ movement.getUncontinuousNeededSpecificParameterListForItem(self) for key, value, tag in needed_property_list: - if current_immo_period.get('initial_%s' % key) in (None,"",NO_CHANGE_METHOD): + if current_immo_period.get('initial_%s' % key) in (None, '', NO_CHANGE_METHOD): current_immo_period = {} - if current_immo_period not in (None,{}): + if current_immo_period not in (None, {}): immo_period_list.append(current_immo_period) # Round dates since immobilisation calculation is made on days for immo_period in immo_period_list: - for property in ('start_date', 'stop_date', 'initial_date'): + for property in ('start_date', 'stop_date', 'initial_date',): if immo_period.has_key(property): immo_period[property] = roundDate(immo_period[property]) - immo_cache_dict['period'][ (self.getRelativeUrl(), from_date, to_date) + + immo_cache_dict['period'][ (self.getRelativeUrl(), from_date, to_date) + tuple([(key,kw[key]) for key in kw_key_list]) ] = immo_period_list return immo_period_list - security.declareProtected(Permissions.View, 'getLastImmobilisationPeriod') def getLastImmobilisationPeriod(self, to_date=None, **kw): """ Returns the current immobilisation period, or the last one if the item is not currently immobilised, at the given at_date (excluded) """ - period_list = self.getImmobilisationPeriodList(from_date=None, to_date=to_date, **kw) + period_list = self.getImmobilisationPeriodList(from_date=None, + to_date=to_date, **kw) if len(period_list) == 0: return None return period_list[-1] - security.declareProtected(Permissions.View, 'isCurrentlyImmobilised') def isCurrentlyImmobilised(self, **kw): """ Returns true if the item is immobilised at this time """ return self.isImmobilised(at_date = DateTime(), **kw) - security.declareProtected(Permissions.View, 'isNotCurrentlyImmobilised') def isNotCurrentlyImmobilised(self, **kw): """ Returns true if the item is not immobilised at this time """ @@ -588,8 +628,10 @@ class ImmobilisableItem(XMLObject, Amount): security.declareProtected(Permissions.View, 'getCurrentRemainingAmortisationDuration') def getCurrentRemainingAmortisationDuration(self, **kw): - """ Returns the calculated remaining amortisation duration for this item at the current time. """ - return self.getRemainingAmortisationDuration(at_date = DateTime(), **kw) + """ Returns the calculated remaining amortisation duration for this item + at the current time. + """ + return self.getRemainingAmortisationDuration(at_date=DateTime(), **kw) security.declareProtected(Permissions.View, 'getRemainingAmortisationDuration') def getRemainingAmortisationDuration(self, at_date=None, **kw): @@ -606,7 +648,7 @@ class ImmobilisableItem(XMLObject, Amount): if new_kw.has_key('at_date'): del new_kw['at_date'] if immo_period_list is None: - immo_period_list = self.getImmobilisationPeriodList(to_date = at_date, **new_kw) + immo_period_list = self.getImmobilisationPeriodList(to_date=at_date, **new_kw) if len(immo_period_list) > 0: immo_period = immo_period_list[-1] initial_date = immo_period['initial_date'] @@ -627,8 +669,9 @@ class ImmobilisableItem(XMLObject, Amount): The durability is quantity of something which corresponds to the 'life' of the item (ex : km for a car, or time for anything) - Each Immobilisation Movement stores the durability at a given time, so it is possible - to approximate the durability between two Immobilisation Movements by using a simple + Each Immobilisation Movement stores the durability at a given time, + so it is possible to approximate the durability between two Immobilisation + Movements by using a simple linear calculation. Note that durability has no sense for items which are immobilisated but not @@ -659,19 +702,21 @@ class ImmobilisableItem(XMLObject, Amount): start_date = immo_period['start_date'] start_durability = immo_period['start_durability'] if start_durability is None: + immo_cache_dict = kw.get('immo_cache_dict', {'period':{}, 'price':{}}) start_durability = self.getRemainingDurability(at_date=start_date, - immo_cache_dict=kw.get('immo_cache_dict', {'period':{},'price':{}})) + immo_cache_dict=immo_cache_dict) if start_durability is None: return None stop_date = None - stop_durability = None - next_movement = self.getNextImmobilisationMovementValue(at_date = at_date, **kw) + stop_durability = None + next_movement = self.getNextImmobilisationMovementValue(at_date=at_date, **kw) while stop_durability is None and next_movement is not None: stop_date = next_movement.getStopDate() stop_durability = next_movement.getDurability() - next_movement = self.getNextImmobilisationMovementValue(at_date = stop_date, - from_movement=next_movement, - **kw) + next_movement = self.getNextImmobilisationMovementValue( + at_date=stop_date, + from_movement=next_movement, + **kw) if stop_durability is None: # In this case, we take the end of life of the item and use # it like an immobilisation movement with values set to 0 @@ -694,14 +739,15 @@ class ImmobilisableItem(XMLObject, Amount): """ Returns the remaining durability at the current date """ - return self.getRemainingDurability(at_date = DateTime(), **kw) + return self.getRemainingDurability(at_date=DateTime(), **kw) security.declareProtected(Permissions.View, 'getAmortisationPrice') def getAmortisationPrice(self, at_date=None, with_currency=0, **kw): """ Returns the deprecated value of item at given date, or now. - If with_currency is set, returns a string containing the value and the corresponding currency. + If with_currency is set, returns a string containing the value and the + corresponding currency. """ if at_date is None: @@ -764,10 +810,11 @@ class ImmobilisableItem(XMLObject, Amount): period_stop_date = addToDate(period_start_date, month=period_start_duration) if at_date > period_stop_date: return self.getAmortisationPrice(at_date=period_stop_date, **kw) - stop_duration = self.getRemainingAmortisationDuration(at_date = period_stop_date, - immo_period_list=immo_period_list, - immo_cache_dict=immo_cache_dict) - stop_durability = self.getRemainingDurability(at_date = period_stop_date, + stop_duration = self.getRemainingAmortisationDuration( + at_date=period_stop_date, + immo_period_list=immo_period_list, + immo_cache_dict=immo_cache_dict) + stop_durability = self.getRemainingDurability(at_date=period_stop_date, immo_period_list=immo_period_list, immo_cache_dict=immo_cache_dict) @@ -787,26 +834,31 @@ class ImmobilisableItem(XMLObject, Amount): round_duration = amortisation_parameters["round_duration"] date_precision = amortisation_parameters["date_precision"] with_amortisation = amortisation_parameters["with_amortisation"] - + # Return the price if no amortisation is needed if not with_amortisation: return period_start_price - - ### Adjust some values according to the parameters + + ### Adjust some values according to the parameters # Adapt period bound dates according to date_precision - period_start_date = getClosestDate(date=financial_date, target_date=period_start_date, + period_start_date = getClosestDate(date=financial_date, + target_date=period_start_date, precision=date_precision, before=1, strict=0) - period_stop_date = getClosestDate(date=financial_date, target_date=period_stop_date, + period_stop_date = getClosestDate(date=financial_date, + target_date=period_stop_date, precision=date_precision, before=0, strict=0) # Calculate remaining annuities at bound dates local_stop_date = addToDate(period_start_date, month = period_start_duration) - initial_remaining_annuities = getAccountableYearFraction(from_date = period_start_date, - to_date = local_stop_date) - start_remaining_annuities = getAccountableYearFraction(from_date = start_date, - to_date = local_stop_date) - local_stop_date = addToDate(period_stop_date, month = stop_duration) - stop_remaining_annuities = getAccountableYearFraction(from_date = period_stop_date, - to_date = local_stop_date) + initial_remaining_annuities = getAccountableYearFraction( + from_date=period_start_date, + to_date=local_stop_date) + + start_remaining_annuities = getAccountableYearFraction(from_date=start_date, + to_date=local_stop_date) + + local_stop_date = addToDate(period_stop_date, month=stop_duration) + stop_remaining_annuities = getAccountableYearFraction(from_date=period_stop_date, + to_date=local_stop_date) # Round annuities if needed if round_duration == "greater annuity": if start_remaining_annuities != int(start_remaining_annuities): @@ -815,12 +867,12 @@ class ImmobilisableItem(XMLObject, Amount): start_remaining_annuities = int(start_remaining_annuities) elif round_duration == "lower annuity": start_remaining_annuities = int(start_remaining_annuities) - + if cut_annuities: - current_date = getClosestDate(date = financial_date, - target_date = period_start_date, - precision = "year", - before = 0) + current_date = getClosestDate(date=financial_date, + target_date=period_start_date, + precision='year', + before=0) else: current_date = period_start_date annuity_number = -1 @@ -858,7 +910,7 @@ class ImmobilisableItem(XMLObject, Amount): 'current_annuity': annuity_number, 'start_remaining_durability': start_durability, 'stop_remaining_durability': stop_durability, - # 'annuity_start_date': annuity_start_date, + #'annuity_start_date': annuity_start_date, }) try: ratio_script = self.unrestrictedTraverse(amortisation_method).ratioCalculation @@ -869,7 +921,7 @@ class ImmobilisableItem(XMLObject, Amount): raise ImmobilisationCalculationError, \ 'Unable to find the ratio calculation script %s for item %s at date %s' % ( '%s/ratioCalculation' % amortisation_method, self.getRelativeUrl(), repr(at_date)) - + current_ratio = ratio_script(**ratio_params) if current_ratio is None: LOG("ERP5 Warning :",0, @@ -879,27 +931,30 @@ class ImmobilisableItem(XMLObject, Amount): raise ImmobilisationCalculationError, \ "Unable to calculate the ratio during the amortisation calculation on item %s at date %s" % ( repr(self), repr(at_date)) - + # Calculate the value at the beginning of the annuity annuity_start_price = depreciable_price local_period_start_price = annuity_start_price if annuity_number: if price_calculation_basis == "period recalculated start price": local_period_start_date = start_date - local_period_start_price = self.getAmortisationPrice(at_date=local_period_start_date, - immo_cache_dict=immo_cache_dict) + local_period_start_price = self.getAmortisationPrice( + at_date=local_period_start_date, + immo_cache_dict=immo_cache_dict) if local_period_start_price is None: # It means no immobilisation period exists before ; we use real start date local_period_start_price = start_price if local_period_start_date > annuity_start_date: annuity_start_price = local_period_start_price else: - annuity_start_price = self.getAmortisationPrice(at_date=annuity_start_date, - immo_cache_dict=immo_cache_dict) - disposal_price + annuity_start_price = self.getAmortisationPrice( + at_date=annuity_start_date, + immo_cache_dict=immo_cache_dict) - disposal_price else: - annuity_start_price = self.getAmortisationPrice(at_date=annuity_start_date, - immo_cache_dict=immo_cache_dict) - disposal_price - + annuity_start_price = self.getAmortisationPrice( + at_date=annuity_start_date, + immo_cache_dict=immo_cache_dict) - disposal_price + # Calculate the raw annuity value if price_calculation_basis == "start price": raw_annuity_price = depreciable_price * current_ratio @@ -907,20 +962,22 @@ class ImmobilisableItem(XMLObject, Amount): raw_annuity_price = annuity_start_price * current_ratio elif price_calculation_basis == "period recalculated start price": raw_annuity_price = local_period_start_price * current_ratio - + # Apply the prorata temporis on the raw annuity value if annuity_number and \ price_calculation_basis == 'period recalculated start price' and \ truncated_annuity_start_date < local_period_start_date: truncated_annuity_start_date = local_period_start_date - if truncated_annuity_start_date <= annuity_start_date and truncated_annuity_stop_date >= annuity_stop_date: + if truncated_annuity_start_date <= annuity_start_date and \ + truncated_annuity_stop_date >= annuity_stop_date: annuity_value = raw_annuity_price else: local_stop_date = truncated_annuity_stop_date if local_stop_date > at_date: local_stop_date = at_date - annuity_value = raw_annuity_price * getAccountableYearFraction(from_date = truncated_annuity_start_date, - to_date = local_stop_date) + annuity_value = raw_annuity_price * getAccountableYearFraction( + from_date=truncated_annuity_start_date, + to_date=local_stop_date) if annuity_value < NEGLIGEABLE_PRICE: annuity_value = 0 # Deduct the price at the given date @@ -939,8 +996,8 @@ class ImmobilisableItem(XMLObject, Amount): security.declareProtected(Permissions.View, 'getCurrentAmortisationPrice') def getCurrentAmortisationPrice(self, with_currency=0, **kw): """ Returns the deprecated value of item at current time """ - return self.getAmortisationPrice (at_date = DateTime(), with_currency=with_currency, **kw) - + return self.getAmortisationPrice(at_date=DateTime(), + with_currency=with_currency, **kw) security.declareProtected(Permissions.ModifyPortalContent, '_createAmortisationRule') def _createAmortisationRule(self): @@ -952,7 +1009,8 @@ class ImmobilisableItem(XMLObject, Amount): my_applied_rule_list = [] for applied_rule in applied_rule_list: specialise_value = applied_rule.getSpecialiseValue() - if specialise_value is not None and specialise_value.getPortalType() == "Amortisation Rule": + if specialise_value is not None and\ + specialise_value.getPortalType() == "Amortisation Rule": my_applied_rule_list.append(applied_rule) if len(my_applied_rule_list) == 0: @@ -976,7 +1034,6 @@ class ImmobilisableItem(XMLObject, Amount): # It is time to expand it my_applied_rule.expand() - security.declareProtected(Permissions.View, 'expandAmortisation') def expandAmortisation(self,**kw): """ @@ -990,19 +1047,19 @@ class ImmobilisableItem(XMLObject, Amount): related_packing_list_path_list = [x.getPath() for x in related_packing_list_list] self.activate( after_path_and_method_id=( - related_packing_list_path_list, - ['immediateReindexObject', 'recursiveImmediateReindexObject', 'updateImmobilisationState']), + related_packing_list_path_list, ('immediateReindexObject', + 'recursiveImmediateReindexObject', + 'updateImmobilisationState',)), after_tag='expand_amortisation' ).immediateExpandAmortisation() - security.declareProtected(Permissions.View, 'immediateExpandAmortisation') def immediateExpandAmortisation(self): """ Calculate the amortisation annuities for the item SHOULD BE RUN AS MANAGER """ - activate_kw = {'tag':'expand_amortisation'} + activate_kw = {'tag' : 'expand_amortisation'} try: self._createAmortisationRule() except ImmobilisationValidityError: @@ -1012,13 +1069,12 @@ class ImmobilisableItem(XMLObject, Amount): delivery.updateImmobilisationState() self.activate().expandAmortisation(activate_kw=activate_kw) - security.declareProtected(Permissions.View, 'getSectionMovementValueList') def getSectionMovementValueList(self, include_to_date=0, **kw): """ - Return the list of successive movements affecting + Return the list of successive movements affecting owners of the item. If at_date is None, return the result all the time Only the movements in current_inventory_state are taken into account """ @@ -1077,7 +1133,9 @@ class ImmobilisableItem(XMLObject, Amount): for movement in owner_change_list: owner = movement.getDestinationSectionValue() owner = self._getFirstIndependantOrganisation(owner) - owner_list.append( {'owner' : owner, 'date' : movement.getStopDate(), 'movement':movement } ) + owner_list.append( {'owner' : owner, + 'date' : movement.getStopDate(), + 'movement' : movement } ) return owner_list security.declareProtected(Permissions.View, 'getSectionValue') @@ -1091,7 +1149,6 @@ class ImmobilisableItem(XMLObject, Amount): return owner_list[-1]['owner'] return None - security.declareProtected(Permissions.View, 'getCurrentSectionValue') def getCurrentSectionValue(self, **kw): """