Commit b6debe61 authored by Sebastien Robin's avatar Sebastien Robin

update made by Guillaume


git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@1798 20353a03-c40f-0410-a6d1-a30d3c3de9de
parent eb118709
......@@ -33,6 +33,7 @@ from Products.ERP5.ERP5Globals import movement_type_list, order_movement_type_li
from DateTime import DateTime
from copy import deepcopy
from string import lower
from Products.ERP5Type.DateUtils import centis, getClosestDate, addToDate
from zLOG import LOG
......@@ -143,8 +144,7 @@ An ERP5 Rule..."""
### First, plan the theorical accounting movements
accounting_movement_list = []
immobilisation_movement_list = my_item.getImmobilisationMovementList()
LOG('AmortisationRule :', 0, 'immobilisation_movement_list = %s' % repr(immobilisation_movement_list))
immobilisation_movement_list = my_item.getImmobilisationMovementValueList()
current_immo_movement = None
for mvt_number in range(len(immobilisation_movement_list)):
......@@ -189,16 +189,12 @@ An ERP5 Rule..."""
if accounting_movement['quantity'] != 0:
my_type = accounting_movement['type']
if ids.get(my_type) is None:
LOG('AmortisationRule :', 0, 'ids has no attribute %s' % repr(my_type))
ids[my_type] = movement_last_id_list.get(my_type, None)
if ids[my_type] is None:
ids[my_type] = -1
ids[my_type] = ids[my_type] + 1
new_id = my_type + '_' + str(ids[my_type])
LOG('AmortisationRule :', 0, 'ids[my_type] = %s after incrementing' % repr(ids[my_type]))
LOG('AmortisationRule :', 0, 'creating simulation movement %s...' % repr(new_id))
# Round date
stop_date = accounting_movement['stop_date']
......@@ -230,26 +226,15 @@ An ERP5 Rule..."""
between the two given immobilisation movements.
If next_immo_movement is None, accounting movements are made at infinite.
"""
def changeDateYear(date, new_year):
"""
Return the given date modified so that its year is new_year
"""
if new_year is not None:
return DateTime( str(int(new_year)) + "/" + str(date.month()) + "/" + str(date.day()) )
else:
return date
item = current_immo_movement.getParent()
if item is not None:
# First we need to calculate the item value at the first immobilisation movement date
begin_value = current_immo_movement.getAmortisationOrDefaultAmortisationValue()
begin_value = current_immo_movement.getAmortisationOrDefaultAmortisationPrice()
begin_remaining = current_immo_movement.getAmortisationOrDefaultAmortisationDuration()
# To find financial end date, we need to know the company
organisation = current_immo_movement.getOrganisation()
currency = current_immo_movement.getCurrency()
section = current_immo_movement.getSectionValue()
currency = current_immo_movement.getPriceCurrency()
if currency is not None:
currency = self.currency[currency.split('/')[-1]]
......@@ -261,26 +246,27 @@ An ERP5 Rule..."""
returned_list = []
# Calculate particular accounting movements (immobilisation beginning, end, ownership change...)
immobilised_before = item.isImmobilised(at_date = start_date - 0.00001)
LOG('_getAccountingMovement start_date',0,start_date)
LOG('_getAccountingMovement centis',0,centis)
immobilised_before = item.isImmobilised(at_date = start_date - centis)
immobilised_after = current_immo_movement.getImmobilisation()
replace = 0
if immobilised_before and previous_immo_movement is not None:
immo_begin_value = previous_immo_movement.getAmortisationOrDefaultAmortisationValue()
immo_end_value = current_immo_movement.getDefaultAmortisationValue() # We use this method in order to get the calculated value
immo_begin_value = previous_immo_movement.getAmortisationOrDefaultAmortisationPrice()
immo_end_value = current_immo_movement.getDefaultAmortisationPrice() # We use this method in order to get the calculated value
# of the item, and not the value entered later by the user
if immo_end_value is not None:
amortisation_value = immo_begin_value - immo_end_value
amortisation_price = immo_begin_value - immo_end_value
end_vat = previous_immo_movement.getVat() * immo_end_value / immo_begin_value
immo_end_value_vat = immo_end_value + end_vat
returned_list.extend([{ 'stop_date' : start_date,
'type' : 'immo',
'quantity' : -immo_begin_value,
'source' : None,
'destination' : previous_immo_movement.getImmobilisationAccount(),
'source_section_value' : None,
'destination_section_value' : previous_immo_movement.getOrganisation(),
'destination_section_value' : previous_immo_movement.getSectionValue(),
'resource_value' : currency },
{ 'stop_date' : start_date,
'type' : 'vat',
......@@ -288,15 +274,15 @@ An ERP5 Rule..."""
'source' : None,
'destination' : previous_immo_movement.getVatAccount(),
'source_section_value' : None,
'destination_section_value' : previous_immo_movement.getOrganisation(),
'destination_section_value' : previous_immo_movement.getSectionValue(),
'resource_value' : currency },
{ 'stop_date' : start_date,
'type' : 'amo',
'quantity' : amortisation_value,
'quantity' : amortisation_price,
'source' : None,
'destination' : previous_immo_movement.getAmortisationAccount(),
'source_section_value' : None,
'destination_section_value' : previous_immo_movement.getOrganisation(),
'destination_section_value' : previous_immo_movement.getSectionValue(),
'resource_value' : currency },
{ 'stop_date' : start_date,
'type' : 'in_out',
......@@ -304,7 +290,7 @@ An ERP5 Rule..."""
'source' : None,
'destination' : previous_immo_movement.getOutputAccount(),
'source_section_value' : None,
'destination_section_value' : previous_immo_movement.getOrganisation(),
'destination_section_value' : previous_immo_movement.getSectionValue(),
'resource_value' : currency } ] )
replace = 1
......@@ -319,7 +305,7 @@ An ERP5 Rule..."""
returned_list[2]['source'] = current_immo_movement.getAmortisationAccount()
returned_list[3]['source'] = current_immo_movement.getInputAccount()
for i in range(4):
returned_list[i]['source_section_value'] = organisation
returned_list[i]['source_section_value'] = section
replace = 0
else:
returned_list.extend([{ 'stop_date' : start_date,
......@@ -327,7 +313,7 @@ An ERP5 Rule..."""
'quantity' : - immo_begin_value,
'source' : current_immo_movement.getImmobilisationAccount(),
'destination' : None,
'source_section_value' : organisation,
'source_section_value' : section,
'destination_section_value' : None,
'resource_value' : currency },
{ 'stop_date' : start_date,
......@@ -335,7 +321,7 @@ An ERP5 Rule..."""
'quantity' : - begin_vat,
'source' : current_immo_movement.getVatAccount(),
'destination' : None,
'source_section_value' : organisation,
'source_section_value' : section,
'destination_section_value' : None,
'resource_value' : currency },
{ 'stop_date' : start_date,
......@@ -343,7 +329,7 @@ An ERP5 Rule..."""
'quantity' : 0,
'source' : current_immo_movement.getAmortisationAccount(),
'destination' : None,
'source_section_value' : organisation,
'source_section_value' : section,
'destination_section_value' : None,
'resource_value' : currency },
{ 'stop_date' : start_date,
......@@ -351,7 +337,7 @@ An ERP5 Rule..."""
'quantity' : immo_begin_value + begin_vat,
'source' : current_immo_movement.getInputAccount(),
'destination' : None,
'source_section_value' : organisation,
'source_section_value' : section,
'destination_section_value' : None,
'resource_value' : currency } ] )
......@@ -371,24 +357,19 @@ An ERP5 Rule..."""
if immobilised_after:
# Search for the first financial end date after the first immobilisation movement
end_date = organisation.getFinancialYearEndDate()
end_date = changeDateYear(end_date, start_date.year() )
if end_date - start_date <= 0:
end_date = changeDateYear(end_date, end_date.year()+1)
end_date = getClosestDate(target_date=start_date, date=section.getFinancialYearStopDate(), precision='year', before=0)
while (stop_date is None and current_value > 0) or (stop_date is not None and end_date - stop_date < 0):
annuity_end_value = item.getAmortisationPrice(at_date=end_date)
LOG('AmortisationRule :',0,'annuity_end_value=%s, current_value=%s' % (repr(annuity_end_value), repr(current_value)))
if annuity_end_value is not None:
annuity_value = current_value - annuity_end_value
if annuity_value != 0:
LOG('AmortisationRule :', 0, 'annuity until %s ; value = %s, organisation = %s' % (repr(end_date), repr(annuity_value), repr(organisation)))
returned_list.extend([{ 'stop_date' : end_date,
'type' : 'annuity_depr',
'quantity' : (- annuity_value),
'source' : current_immo_movement.getDepreciationAccount(),
'destination' : None,
'source_section_value' : organisation,
'source_section_value' : section,
'destination_section_value': None,
'resource_value' : currency },
{ 'stop_date' : end_date,
......@@ -396,28 +377,27 @@ An ERP5 Rule..."""
'quantity' : annuity_value,
'source' : current_immo_movement.getAmortisationAccount(),
'destination' : None,
'source_section_value' : organisation,
'source_section_value' : section,
'destination_section_value': None,
'resource_value' : currency } ] )
current_value -= annuity_value
end_date = changeDateYear(end_date, end_date.year()+1)
end_date = addToDate(end_date, {'year':1})
# Get the last period until the next immobilisation movement
if stop_date is not None:
# We use DefaultAmortisationValue in order to get the calculated value of the item,
# We use getDefaultAmortisationPrice in order to get the calculated value of the item,
# and not the value entered later by the user for the next immobilisation period
annuity_end_value = next_immo_movement.getDefaultAmortisationValue()
annuity_end_value = next_immo_movement.getDefaultAmortisationPrice()
if annuity_end_value is not None:
annuity_value = current_value - annuity_end_value
if annuity_value != 0:
LOG('AmortisationRule :', 0, 'annuity until %s ; value = %s, organisation = %s' % (repr(next_immo_movement.getStopDate()), repr(annuity_value), repr(organisation)))
returned_list.extend([{ 'stop_date' : end_date,
'type' : 'annuity_depr',
'quantity' : (- annuity_value),
'source' : current_immo_movement.getDepreciationAccount(),
'destination' : None,
'source_section_value' : organisation,
'source_section_value' : section,
'destination_section_value': None,
'resource_value' : currency },
{ 'stop_date' : end_date,
......@@ -425,7 +405,7 @@ An ERP5 Rule..."""
'quantity' : annuity_value,
'source' : current_immo_movement.getAmortisationAccount(),
'destination' : None,
'source_section_value' : organisation,
'source_section_value' : section,
'destination_section_value': None,
'resource_value' : currency } ] )
......
......@@ -119,17 +119,17 @@ an accounting immobilisation (in order to amortise an object)
}
security.declareProtected(Permissions.View, 'getAmortisationOrDefaultAmortisationValue')
def getAmortisationOrDefaultAmortisationValue(self, with_currency=0, **kw):
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_value = self.getAmortisationValue()
if amortisation_value is not None:
return amortisation_value
amortisation_price = self.getAmortisationBeginningPrice()
if amortisation_price is not None:
return amortisation_price
else:
return self.getDefaultAmortisationValue(with_currency=with_currency, **kw)
return self.getDefaultAmortisationPrice(with_currency=with_currency, **kw)
security.declareProtected(Permissions.View, 'getAmortisationOrDefaultAmortisationDuration')
......@@ -159,15 +159,14 @@ an accounting immobilisation (in order to amortise an object)
return item.getRemainingAmortisationDuration(current_date, from_immobilisation=1, **kw)
security.declareProtected(Permissions.ModifyPortalContent, 'getDefaultAmortisationValue')
def getDefaultAmortisationValue(self, with_currency=0, **kw):
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()
LOG('Immobilisation :',0, 'current_date=%s, item=%s' % (repr(current_date), repr(item)))
if current_date is None or item is None:
return None
......@@ -175,48 +174,41 @@ an accounting immobilisation (in order to amortise an object)
return returned_value
security.declareProtected(Permissions.View, 'isNotValid')
def isNotValid(self):
"""
Checks if necessary data is present on the immobilisation movement.
Returns an error message, or None if the immobilisation is valid
security.declarePrivate('_checkConsistency')
def _checkConsistency(self, fixit=0, mapped_value_property_list=()):
errors = []
relative_url = self.getRelativeUrl()
XXX please use checkConsistency API instead and try to use constraint
checkers for implementation
"""
item = self.getParent()
if item is None:
return "The immobilisation movement does not apply on an item"
errors += [(relative_url, "Property value inconsistency", 100, "The immobilisation movement does not apply on an item")]
immo_date = self.getStopDate()
if immo_date is None:
return 'Date field is not filled'
errors += [(relative_url, "Property value inconsistency", 100, 'Date property is empty')]
if self.getImmobilisation():
immo_duration = self.getAmortisationDuration()
if immo_duration is None:
return 'Duration field is not filled'
immo_value = self.getAmortisationValue()
errors += [(relative_url, "Property value inconsistency", 100, 'Amortisation duration property is empty')]
immo_value = self.getAmortisationBeginningPrice()
if immo_value is None:
return 'Value field is not filled'
errors += [(relative_url, "Property value inconsistency", 100, 'Amortisation price property is empty')]
immo_type = self.getAmortisationType()
if immo_type is None or immo_type is "":
return "Amortisation field is not filled"
errors += [(relative_url, "Property value inconsistency", 100, 'Amortisation type property is empty')]
if immo_type == "degressive":
fiscal_coef = self.getFiscalCoefficient()
if fiscal_coef is None:
return "Fiscal coefficient field is not filled"
errors += [(relative_url, "Property value inconsistency", 100, 'Fiscal coefficient property is empty')]
vat = self.getVat()
if vat is None:
return "VAT Amount field is not filled"
errors += [(relative_url, "Property value inconsistency", 100, 'VAT Amount property is empty')]
for (account, text) in ( (self.getInputAccount() , "Input Account"),
(self.getOutputAccount() , "Output Account"),
(self.getImmobilisationAccount(), "Immobilisation Account"),
......@@ -224,72 +216,58 @@ an accounting immobilisation (in order to amortise an object)
(self.getDepreciationAccount() , "Deprecisation Account"),
(self.getVatAccount() , "VAT Account") ):
if account is None or account is "":
return text + " list has no selected choice"
errors += [(relative_url, "Property value inconsistency", 100, text + ' property is empty')]
section = self.getSectionValue()
if section is None:
errors += [(relative_url, "Property value inconsistency", 100, "The corresponding item does not belong to an organisation at this date")]
else:
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")]
organisation = self.getOrganisation()
if organisation is None:
return "Item %s does not belong to an organisation at this date" % item.getTitle()
financial_date = organisation.getFinancialYearEndDate()
if financial_date is None:
return "The organisation which owns the item at this date has no financial year end date"
currency = self.getCurrency()
currency = self.getPriceCurrency()
if currency is None:
return "The organisation which owns the item at this date has no amortisation currency"
errors += [(relative_url, "Property value inconsistency", 100, "The organisation which owns the item at this date has no amortisation currency")]
return None
security.declareProtected(Permissions.View, 'getOrganisation')
def getOrganisation(self):
return errors
security.declareProtected(Permissions.View, 'getSectionValue')
def getSectionValue(self):
"""
Returns the organisation which owns the item on which the
immobilisation movement applies, at the time of the immobilisation
movement
XXX Naming problem -> it is an owner
Please rename to getSectionValue on both item and immobilisation
"""
# if self.isContext() and hasattr(self, 'organisation'):
# return self.organisation
item = self.getParent()
date = self.getStopDate()
if item is None or date is None:
return None
LOG('Immobilisation :', 0, 'item = %s for immobilisation %s' % (repr(item), repr(self)))
return item.getOwner(at_date = date)
return item.getSectionValue(at_date = date)
security.declareProtected(Permissions.View, 'getOrganisationTitle')
def getOrganisationTitle(self):
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
XXX id. same naming problem getSectionTitle
"""
organisation = self.getOrganisation()
if organisation is None:
section = self.getSectionValue()
if section is None:
return None
return organisation.getTitle()
return section.getTitle()
security.declareProtected(Permissions.View, 'getCurrency')
def getCurrency(self):
security.declareProtected(Permissions.View, 'getPriceCurrency')
def getPriceCurrency(self):
"""
Returns the used currency id for this particular immobilisation movement
XXX Rename to getPriceCurrency (this is the name we use at this point, it will be renamed
some day to getTradeCurrency - make sure getPriceCurrencyValue is object and getPriceCurrency is not)
"""
organisation = self.getOrganisation()
if organisation is not None:
LOG('Immobilisation :', 0, 'organisation = %s, currency = %s' % (repr(organisation), repr(organisation.getSocialCapitalCurrency())))
return organisation.getSocialCapitalCurrency()
LOG('Immobilisation :', 0, 'organisation = %s, currency = %s' % (repr(organisation), repr(None)))
section = self.getSectionValue()
if section is not None:
return section.getSocialCapitalCurrency()
return None
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