diff --git a/product/ERP5/tests/testPayroll.py b/product/ERP5/tests/testPayroll.py index cf756bb83dfeff15e77522376c5b6606ed3baf6b..6d0385d4f04f272e6396948cd9f25d44daa89b8e 100644 --- a/product/ERP5/tests/testPayroll.py +++ b/product/ERP5/tests/testPayroll.py @@ -33,6 +33,7 @@ from Products.ERP5Type.tests.Sequence import SequenceList from Products.ERP5Type.tests.utils import reindex from DateTime import DateTime import transaction +from Products.ERP5Type.tests.utils import createZODBPythonScript class TestPayrollMixin(TestTradeModelLineMixin): BUSINESS_PATH_CREATION_SEQUENCE_STRING = """ @@ -63,12 +64,72 @@ class TestPayrollMixin(TestTradeModelLineMixin): def getTitle(self): return "Payroll" + def setPayrollBaseAmountQuantityMethod(self, base_amount_id, text): + """Populate TradeModelLine_getBaseAmountQuantityMethod shared script + + This helper method edits the script so that: + - there's no need to do any cleanup + - data produced by previous still behaves as expected + """ + skin = self.portal.portal_skins.custom + script_id = self.amount_generator_line_portal_type.replace(' ', '') \ + + '_getBaseAmountQuantityMethod' + test = "\nif base_application.startswith(%r):\n " % base_amount_id + try: + old_text = '\n' + skin[script_id].body() + except KeyError: + old_text = '' + else: + skin._delObject(script_id) + text = "context.log('ba', base_application)\n\n" + test + '\n '.join(text.splitlines()) + old_text + createZODBPythonScript(skin, script_id, "base_application", text) + return base_amount_id + + def afterSetUp(self): """Prepare the test.""" TestTradeModelLineMixin.afterSetUp(self) self.createCategories() self.fixed_quantity = self.setBaseAmountQuantityMethod('fixed_quantity', - "return lambda *args, **kw: 1") + "return lambda *args, **kw: 1") + self.setPayrollBaseAmountQuantityMethod("base_amount/payroll/base/contribution", + """\ + def returnZeroQuantity(*args, **kw): + return 0 + context.log('context %s, ba = %s' %(context, context.getBaseApplicationList())) + for application in context.getBaseApplicationList(): + if 'salary_range' in application: + context.log('method is zeroQ') + return returnZeroQuantity + context.log('method is default') + return context.getBaseAmountQuantity +""") + + self.setPayrollBaseAmountQuantityMethod("base_amount/payroll/l10n/fr/salary_range", + """\ + def getBaseAmountQuantity(delivery_amount, base_application, **kw): + quantity = 0 + salary_range = base_application.split('/')[-1] + salary_range_cat = 'salary_range/france/%s' %(salary_range) + cell = delivery_amount.getSpecialiseValue().getCell(salary_range_cat) + if cell is not None: + model_slice_min = cell.getQuantityRangeMin() + model_slice_max = cell.getQuantityRangeMax() + base_application = delivery_amount.getTotalPrice(0.0) + if base_application <= model_slice_min: + # if base_application is not in the slice range, quantity is 0 + quantity = 0 + elif base_application-model_slice_min > 0: + if base_application <= model_slice_max: + quantity = base_application - model_slice_min + elif model_slice_max: + quantity = model_slice_max - model_slice_min + else: + quantity = delivery_amount.getTotalPrice() + context.log('quantity is', quantity) + return quantity + return getBaseAmountQuantity + """) @reindex def beforeTearDown(self): @@ -124,6 +185,8 @@ class TestPayrollMixin(TestTradeModelLineMixin): 'contribution_share/employee', 'base_amount/payroll/base/income_tax', 'base_amount/payroll/base/contribution', + 'base_amount/payroll/base/contribution/employer', + 'base_amount/payroll/base/contribution/employee', 'base_amount/payroll/report/salary/net', 'base_amount/payroll/report/salary/gross', 'base_amount/payroll/l10n/fr/salary_range/a', @@ -181,14 +244,13 @@ class TestPayrollMixin(TestTradeModelLineMixin): node = self.createService() node.edit(title='Urssaf', product_line='state_insurance', quantity_unit='time/month', - variation_base_category_list=['contribution_share', 'salary_range'], + variation_base_category_list=['base_application'], use='payroll/tax') - node.setVariationCategoryList(['contribution_share/employee', - 'contribution_share/employer', - 'salary_range/france/slice_0_to_200', - 'salary_range/france/slice_200_to_400', - 'salary_range/france/slice_400_to_5000', - 'salary_range/france/slice_600_to_800', + node.setVariationCategoryList(['base_application/base_amount/payroll/base/contribution/employee', + 'base_application/base_amount/payroll/base/contribution/employer' + 'base_application/base_amount/payroll/l10n/fr/salary_range/slice_0_to_200', + 'base_application/base_amount/payroll/l10n/fr/salary_range/slice_200_to_400', + 'base_application/base_amount/payroll/l10n/fr/salary_range/slice_400_to_5000', ]) sequence.edit(urssaf_service = node) @@ -210,28 +272,31 @@ class TestPayrollMixin(TestTradeModelLineMixin): def stepCreateBonusService(self, sequence=None, **kw): node = self.createService() node.edit(title='Bonus', quantity_unit='time/month', - variation_base_category_list=['contribution_share'], - product_line='labour', use='payroll/base_salary') - node.setVariationCategoryList(['contribution_share/employee', - 'contribution_share/employer']) + variation_base_category_list=['base_contribution'], + product_line='labour', use='payroll/base_salary') + node.setVariationCategoryList(['base_contribution/base_amount/payroll/base/contribution/employee', + 'base_contribution/base_amount/payroll/base/contribution/employer' + ]) sequence.edit(bonus_service = node) def stepCreateOldAgeInsuranaceService(self, sequence=None, **kw): node = self.createService() node.edit(title='Old Age Insurance', quantity_unit='time/month', - variation_base_category_list=['contribution_share', 'salary_range'], - product_line='state_insurance', use='payroll/tax') - node.setVariationCategoryList(['contribution_share/employee', - 'contribution_share/employer']) + variation_base_category_list=['base_application'], + product_line='state_insurance', use='payroll/tax') + node.setVariationCategoryList(['base_application/base_amount/payroll/base/contribution/employee', + 'base_application/base_amount/payroll/base/contribution/employer' + ]) sequence.edit(old_age_insurance_service = node) def stepCreateSicknessInsuranceService(self, sequence=None, **kw): node = self.createService() node.edit(title='Sickness Insurance', quantity_unit='time/month', - variation_base_category_list=['contribution_share', 'salary_range'], - product_line='state_insurance', use='payroll/tax') - node.setVariationCategoryList(['contribution_share/employee', - 'contribution_share/employer']) + variation_base_category_list=['base_application'], + product_line='state_insurance', use='payroll/tax') + node.setVariationCategoryList(['base_application/base_amount/payroll/base/contribution/employee', + 'base_application/base_amount/payroll/base/contribution/employer' + ]) sequence.edit(sickness_insurance_service = node) def createModel(self): @@ -308,11 +373,10 @@ class TestPayrollMixin(TestTradeModelLineMixin): reference='urssaf_model_line', trade_phase='payroll/france/urssaf', resource_value=sequence.get('urssaf_service'), - variation_category_list=['contribution_share/employee', - 'contribution_share/employer'], - base_application_list=[ 'base_amount/payroll/base/contribution'], - base_contribution_list=['base_amount/payroll/base/income_tax']) - #model_line.setQuantity(0.0) + variation_category_list = ['base_application/base_amount/payroll/base/contribution/employee', + 'base_application/base_amount/payroll/base/contribution/employer'], + base_contribution_list=['base_amount/payroll/base/income_tax'], + ) sequence.edit(urssaf_model_line = model_line) def stepModelCreateUrssafModelLineWithSlices(self, sequence=None, **kw): @@ -322,12 +386,11 @@ class TestPayrollMixin(TestTradeModelLineMixin): reference='urssaf_model_line_2', trade_phase='payroll/france/urssaf', resource_value=sequence.get('urssaf_service'), - variation_category_list=['contribution_share/employee', - 'contribution_share/employer', - 'salary_range/france/slice_0_to_200', - 'salary_range/france/slice_200_to_400', - 'salary_range/france/slice_400_to_5000'], - base_application_list=[ 'base_amount/payroll/base/contribution',], + variation_category_list=['base_application/base_amount/payroll/base/contribution/employee', + 'base_application/base_amount/payroll/base/contribution/employer', + 'base_application/base_amount/payroll/l10n/fr/salary_range/slice_0_to_200', + 'base_application/base_amount/payroll/l10n/fr/salary_range/slice_200_to_400', + 'base_application/base_amount/payroll/l10n/fr/salary_range/slice_400_to_5000',], base_contribution_list=['base_amount/payroll/base/income_tax']) sequence.edit(urssaf_model_line_with_slices = model_line) @@ -338,156 +401,182 @@ class TestPayrollMixin(TestTradeModelLineMixin): reference='urssaf_model_line_3', trade_phase='payroll/france/urssaf', resource_value=sequence.get('urssaf_service'), - variation_category_list=['contribution_share/employee', - 'contribution_share/employer', - 'salary_range/france/slice_200_to_400', - 'salary_range/france/slice_600_to_800'], - base_application_list=[ 'base_amount/payroll/base/contribution'], + variation_category_list=['base_application/base_amount/payroll/base/contribution/employer', + 'base_application/base_amount/payroll/base/contribution/employee', + 'base_application/base_amount/payroll/l10n/fr/salary_range/slice_200_to_400', + 'base_application/base_amount/payroll/l10n/fr/salary_range/slice_600_to_800',], base_contribution_list=['base_amount/payroll/base/income_tax']) #model_line.setQuantity(0.0) sequence.edit(urssaf_model_line_with_slices = model_line) - def stepPaysheetCreateUrssafModelLine(self, sequence=None, **kw): - '''The model line created here have the same reference than the model line - created in stepModelCreateUrssafModelLine. This is used for line - overloading tests''' - paysheet = sequence.get('paysheet') - model_line = self.createModelLine(paysheet) - model_line.edit(title='Urssaf', - reference='urssaf_model_line', - trade_phase='payroll/france/urssaf', - resource_value=sequence.get('urssaf_service'), - variation_category_list=['contribution_share/employee', - 'contribution_share/employer'], - base_application_list=[ 'base_amount/payroll/base/contribution'], - base_contribution_list=['base_amount/payroll/base/income_tax']) - sequence.edit(urssaf_model_line = model_line) - def stepUrssafModelLineCreateMovements(self, sequence=None, **kw): model_line = sequence.get('urssaf_model_line') - cell1 = model_line.newCell('contribution_share/employee', + cell1 = model_line.newCell('base_application/base_amount/payroll/base/contribution/employee', portal_type='Pay Sheet Model Cell', + base_application='base_amount/payroll/base/contribution/employee', base_id='movement', mapped_value_property_list=('quantity', 'price')) - cell1.edit(price=0.1, contribution_share='employee', quantity=None) - cell2 = model_line.newCell('contribution_share/employer', + cell1.edit(price=0.1, quantity=None) + cell2 = model_line.newCell('base_application/base_amount/payroll/base/contribution/employer', portal_type='Pay Sheet Model Cell', + base_application='base_amount/payroll/base/contribution/employer', base_id='movement', mapped_value_property_list=('quantity', 'price')) - cell2.edit(price=0.5, contribution_share='employer', quantity=None) + cell2.edit(price=0.5, quantity=None) def stepUrssafModelLineCreateMovementsWithQuantityOnly(self, sequence=None, **kw): model_line = sequence.get('urssaf_model_line') - cell1 = model_line.newCell('contribution_share/employee', - portal_type='Pay Sheet Model Cell', - base_id='movement', - mapped_value_property_list=('quantity', 'price')) - cell1.edit(quantity=-100.0, contribution_share='employee') - cell2 = model_line.newCell('contribution_share/employer', - portal_type='Pay Sheet Model Cell', - base_id='movement', - mapped_value_property_list=('quantity', 'price')) - cell2.edit(quantity=-200.0, contribution_share='employer') - - def stepUrssafModelLineWithSlicesCreateMovements(self, sequence=None, **kw): - model_line = sequence.get('urssaf_model_line_with_slices') - cell1 = model_line.newCell('contribution_share/employee', - 'salary_range/france/slice_0_to_200', - portal_type='Pay Sheet Model Cell', - base_id='movement', - base_application='base_amount/payroll/l10n/fr/salary_range/slice_0_to_200', - mapped_value_property_list=('quantity', 'price')) - cell1.edit(price=0.1, contribution_share='employee', quantity=None, - salary_range='france/slice_0_to_200') - cell2 = model_line.newCell('contribution_share/employer', - 'salary_range/france/slice_0_to_200', + cell1 = model_line.newCell('base_application/base_amount/payroll/base/contribution/employee', portal_type='Pay Sheet Model Cell', + base_application='base_amount/payroll/base/contribution/employee', base_id='movement', - base_application='base_amount/payroll/l10n/fr/salary_range/slice_0_to_200', mapped_value_property_list=('quantity', 'price')) - cell2.edit(price=0.2, contribution_share='employer', quantity=None, - salary_range='france/slice_0_to_200') - cell3 = model_line.newCell('contribution_share/employee', - 'salary_range/france/slice_200_to_400', - portal_type='Pay Sheet Model Cell', - base_id='movement', - base_application='base_amount/payroll/l10n/fr/salary_range/slice_200_to_400', - mapped_value_property_list=('quantity', 'price')) - cell3.edit(price=0.3, contribution_share='employee', quantity=None, - salary_range='france/slice_200_to_400') - cell4 = model_line.newCell('contribution_share/employer', - 'salary_range/france/slice_200_to_400', - portal_type='Pay Sheet Model Cell', - base_id='movement', - base_application='base_amount/payroll/l10n/fr/salary_range/slice_200_to_400', - mapped_value_property_list=('quantity', 'price')) - cell4.edit(price=0.4, contribution_share='employer', quantity=None, - salary_range='france/slice_200_to_400') - cell5 = model_line.newCell('contribution_share/employee', - 'salary_range/france/slice_400_to_5000', - portal_type='Pay Sheet Model Cell', - base_id='movement', - base_application='base_amount/payroll/l10n/fr/salary_range/slice_400_to_5000', - mapped_value_property_list=('quantity', 'price')) - cell5.edit(price=0.5, contribution_share='employee', quantity=None, - salary_range='france/slice_400_to_5000') - cell6 = model_line.newCell('contribution_share/employer', - 'salary_range/france/slice_400_to_5000', + cell1.edit(quantity=-100.0, contribution_share='employee') + cell2 = model_line.newCell('base_application/base_amount/payroll/base/contribution/employer', portal_type='Pay Sheet Model Cell', + base_application='base_amount/payroll/base/contribution/employer', base_id='movement', - base_application='base_amount/payroll/l10n/fr/salary_range/slice_400_to_5000', mapped_value_property_list=('quantity', 'price')) - cell6.edit(price=0.6, contribution_share='employer', quantity=None, - salary_range='france/slice_400_to_5000') + cell2.edit(quantity=-200.0, contribution_share='employer') + + def stepUrssafModelLineWithSlicesCreateMovements(self, sequence=None, **kw): + model_line = sequence.get('urssaf_model_line_with_slices') + cell1 = model_line.newCell( + 'base_application/base_amount/payroll/base/contribution/employee', + 'base_application/base_amount/payroll/l10n/fr/salary_range/slice_0_to_200', + portal_type='Pay Sheet Model Cell', + base_id='movement', + base_application_list=[ + 'base_amount/payroll/base/contribution/employee', + 'base_amount/payroll/l10n/fr/salary_range/slice_0_to_200', + ], + mapped_value_property_list=('quantity', 'price')) + cell1.edit(price=0.1, quantity=None,) + + cell2 = model_line.newCell( + 'base_application/base_amount/payroll/base/contribution/employer', + 'base_application/base_amount/payroll/l10n/fr/salary_range/slice_0_to_200', + portal_type='Pay Sheet Model Cell', + base_id='movement', + base_application_list=[ + 'base_amount/payroll/base/contribution/employer', + 'base_amount/payroll/l10n/fr/salary_range/slice_0_to_200', + ], + mapped_value_property_list=('quantity', 'price')) + cell2.edit(price=0.2, quantity=None,) + + cell3 = model_line.newCell( + 'base_application/base_amount/payroll/base/contribution/employee', + 'base_application/base_amount/payroll/l10n/fr/salary_range/slice_200_to_400', + portal_type='Pay Sheet Model Cell', + base_id='movement', + base_application_list=[ + 'base_amount/payroll/base/contribution/employee', + 'base_amount/payroll/l10n/fr/salary_range/slice_200_to_400', + ], + mapped_value_property_list=('quantity', 'price')) + cell3.edit(price=0.3,quantity=None) + + cell4 = model_line.newCell( + 'base_application/base_amount/payroll/base/contribution/employer', + 'base_application/base_amount/payroll/l10n/fr/salary_range/slice_200_to_400', + portal_type='Pay Sheet Model Cell', + base_id='movement', + base_application_list=[ + 'base_amount/payroll/base/contribution/employer', + 'base_amount/payroll/l10n/fr/salary_range/slice_200_to_400', + ], + mapped_value_property_list=('quantity', 'price')) + cell4.edit(price=0.4, quantity=None,) + + cell5 = model_line.newCell( + 'base_application/base_amount/payroll/base/contribution/employee', + 'base_application/base_amount/payroll/l10n/fr/salary_range/slice_400_to_5000', + portal_type='Pay Sheet Model Cell', + base_id='movement', + base_application_list=[ + 'base_amount/payroll/base/contribution/employee', + 'base_amount/payroll/l10n/fr/salary_range/slice_400_to_5000', + ], + mapped_value_property_list=('quantity', 'price')) + cell5.edit(price=0.5, quantity=None,) + + cell6 = model_line.newCell( + 'base_application/base_amount/payroll/base/contribution/employer', + 'base_application/base_amount/payroll/l10n/fr/salary_range/slice_400_to_5000', + portal_type='Pay Sheet Model Cell', + base_id='movement', + base_application_list=[ + 'base_amount/payroll/base/contribution/employer', + 'base_amount/payroll/l10n/fr/salary_range/slice_400_to_5000', + ], + mapped_value_property_list=('quantity', 'price')) + cell6.edit(price=0.6, quantity=None,) def stepUrssafModelLineWithComplexSlicesCreateMovements(self, sequence=None, **kw): model_line = sequence.get('urssaf_model_line_with_slices') - cell1 = model_line.newCell('contribution_share/employee', - 'salary_range/france/slice_200_to_400', - portal_type='Pay Sheet Model Cell', - base_id='movement', - base_application='base_amount/payroll/l10n/fr/salary_range/slice_200_to_400', - mapped_value_property_list=('quantity', 'price')) - cell1.edit(price=0.1, contribution_share='employee', quantity=None, - salary_range='france/slice_200_to_400') - cell2 = model_line.newCell('contribution_share/employer', - 'salary_range/france/slice_200_to_400', - portal_type='Pay Sheet Model Cell', - base_id='movement', - base_application='base_amount/payroll/l10n/fr/salary_range/slice_200_to_400', - mapped_value_property_list=('quantity', 'price')) - cell2.edit(price=0.2, contribution_share='employer', quantity=None, - salary_range='france/slice_200_to_400') - cell3 = model_line.newCell('contribution_share/employee', - 'salary_range/france/slice_600_to_800', - portal_type='Pay Sheet Model Cell', - base_id='movement', - base_application='base_amount/payroll/l10n/fr/salary_range/slice_600_to_800', - mapped_value_property_list=('quantity', 'price')) - cell3.edit(price=0.3, contribution_share='employee', quantity=None, - salary_range='france/slice_600_to_800') - cell4 = model_line.newCell('contribution_share/employer', - 'salary_range/france/slice_600_to_800', - portal_type='Pay Sheet Model Cell', - base_id='movement', - base_application='base_amount/payroll/l10n/fr/salary_range/slice_600_to_800', - mapped_value_property_list=('quantity', 'price')) - cell4.edit(price=0.4, contribution_share='employer', quantity=None, - salary_range='france/slice_600_to_800') - - def stepPaysheetUrssafModelLineCreateMovements(self, sequence=None, **kw): - model_line = sequence.get('urssaf_model_line') - cell1 = model_line.newCell('contribution_share/employee', - portal_type='Pay Sheet Model Cell', - base_id='movement', - mapped_value_property_list=('quantity', 'price')) - cell1.edit(price=0.3, contribution_share='employee', quantity=None) - cell2 = model_line.newCell('contribution_share/employer', - portal_type='Pay Sheet Model Cell', - base_id='movement', - mapped_value_property_list=('quantity', 'price')) - cell2.edit(price=0.7, contribution_share='employer', quantity=None) + cell1 = model_line.newCell( + 'base_application/base_amount/payroll/base/contribution/employee', + 'base_application/base_amount/payroll/l10n/fr/salary_range/slice_200_to_400', + portal_type='Pay Sheet Model Cell', + base_id='movement', + base_application_list=[ + 'base_amount/payroll/base/contribution/employee', + 'base_amount/payroll/l10n/fr/salary_range/slice_200_to_400', + ], + mapped_value_property_list=('quantity', 'price')) + cell1.edit(price=0.1, quantity=None) + + cell2 = model_line.newCell( + 'base_application/base_amount/payroll/base/contribution/employer', + 'base_application/base_amount/payroll/l10n/fr/salary_range/slice_200_to_400', + portal_type='Pay Sheet Model Cell', + base_id='movement', + base_application_list=[ + 'base_amount/payroll/base/contribution/employer', + 'base_amount/payroll/l10n/fr/salary_range/slice_200_to_400', + ], + mapped_value_property_list=('quantity', 'price')) + cell2.edit(price=0.2, quantity=None) + + cell3 = model_line.newCell( + 'base_application/base_amount/payroll/base/contribution/employee', + 'base_application/base_amount/payroll/l10n/fr/salary_range/slice_600_to_800', + portal_type='Pay Sheet Model Cell', + base_id='movement', + base_application_list=[ + 'base_amount/payroll/base/contribution/employee', + 'base_amount/payroll/l10n/fr/salary_range/slice_600_to_800', + ], + mapped_value_property_list=('quantity', 'price')) + cell3.edit(price=0.1, quantity=None) + + cell4 = model_line.newCell( + 'base_application/base_amount/payroll/base/contribution/employer', + 'base_application/base_amount/payroll/l10n/fr/salary_range/slice_600_to_800', + portal_type='Pay Sheet Model Cell', + base_id='movement', + base_application_list=[ + 'base_amount/payroll/base/contribution/employer', + 'base_amount/payroll/l10n/fr/salary_range/slice_600_to_800', + ], + mapped_value_property_list=('quantity', 'price')) + cell4.edit(price=0.2, quantity=None) + + # def stepPaysheetUrssafModelLineCreateMovements(self, sequence=None, **kw): + # return + # model_line = sequence.get('urssaf_model_line') + # cell1 = model_line.newCell('contribution_share/employee', + # portal_type='Pay Sheet Model Cell', + # base_id='movement', + # mapped_value_property_list=('quantity', 'price')) + # cell1.edit(price=0.3, contribution_share='employee', quantity=None) + # cell2 = model_line.newCell('contribution_share/employer', + # portal_type='Pay Sheet Model Cell', + # base_id='movement', + # mapped_value_property_list=('quantity', 'price')) + # cell2.edit(price=0.7, contribution_share='employer', quantity=None) def createPaysheet(self, sequence=None, **kw): module = self.portal.getDefaultModule(portal_type='Pay Sheet Transaction') @@ -514,7 +603,8 @@ class TestPayrollMixin(TestTradeModelLineMixin): price=20, quantity=150, resource_value=sequence.get('labour_service'), - base_contribution_list=['base_amount/payroll/base/contribution', + base_contribution_list=['base_amount/payroll/base/contribution/employee', + 'base_amount/payroll/base/contribution/employer', 'base_amount/payroll/l10n/fr/salary_range/slice_0_to_200', 'base_amount/payroll/l10n/fr/salary_range/slice_200_to_400', 'base_amount/payroll/l10n/fr/salary_range/slice_400_to_5000', @@ -526,24 +616,26 @@ class TestPayrollMixin(TestTradeModelLineMixin): paysheet = sequence.get('paysheet') paysheet_line = self.createPaysheetLine(paysheet) paysheet_line.edit(title='Bonus', - resource_value=sequence.get('bonus_service'), - variation_category_list=['contribution_share/employee', - 'contribution_share/employer'], - base_contribution_list=[ 'base_amount/payroll/base/contribution']) + resource_value=sequence.get('bonus_service'), + variation_category_list=['base_contribution/base_amount/payroll/base/contribution/employer', + 'base_contribution/base_amount/payroll/base/contribution/employee'], + ) sequence.edit(bonus_paysheet_line = paysheet_line) - + def stepPaysheetCreateBonusPaySheetLineMovements(self, sequence=None, **kw): paysheet_line = sequence.get('bonus_paysheet_line') - cell1 = paysheet_line.newCell('contribution_share/employee', - portal_type='Pay Sheet Cell', - base_id='movement', - mapped_value_property_list=('quantity', 'price')) - cell1.edit(quantity=1000, price=1, contribution_share='employee') - cell2 = paysheet_line.newCell('contribution_share/employer', - portal_type='Pay Sheet Cell', - base_id='movement', - mapped_value_property_list=('quantity', 'price')) - cell2.edit(quantity=1000, price=1, contribution_share='employer') + cell1 = paysheet_line.newCell('base_contribution/base_amount/payroll/base/contribution/employee', + portal_type='Pay Sheet Cell', + base_contribution='base_amount/payroll/base/contribution/employee', + base_id='movement', + mapped_value_property_list=('quantity', 'price')) + cell1.edit(quantity=1000, price=1) + cell2 = paysheet_line.newCell('base_contribution/base_amount/payroll/base/contribution/employer', + portal_type='Pay Sheet Cell', + base_id='movement', + base_contribution='base_amount/payroll/base/contribution/employer', + mapped_value_property_list=('quantity', 'price')) + cell2.edit(quantity=1000, price=1) def checkUpdateAggregatedAmountListReturn(self, paysheet, expected_movement_to_delete_count, expected_movement_to_add_count): @@ -594,7 +686,7 @@ class TestPayrollMixin(TestTradeModelLineMixin): def stepCheckPaysheetLineAreCreated(self, sequence=None, **kw): paysheet = sequence.get('paysheet') paysheet_line_list = paysheet.contentValues(portal_type='Pay Sheet Line') - self.assertEqual(len(paysheet_line_list), 2) + self.assertEqual(len(paysheet_line_list), 3) self.assertEqual(len(paysheet.getMovementList(portal_type=\ 'Pay Sheet Cell')), 2) # 2 because labour line contain no movement @@ -603,15 +695,14 @@ class TestPayrollMixin(TestTradeModelLineMixin): paysheet_line_list = paysheet.contentValues(portal_type='Pay Sheet Line') self.assertEqual(len(paysheet_line_list), 0) self.assertEqual(len(paysheet.getMovementList(portal_type=\ - 'Pay Sheet Cell')), 0) # 2 because labour line contain no movement + 'Pay Sheet Cell')), 0) # 0 because labour line contain no movement def stepCheckPaysheetLineAreCreatedUsingBonus(self, sequence=None, **kw): paysheet = sequence.get('paysheet') paysheet_line_list = paysheet.contentValues(portal_type='Pay Sheet Line') - self.assertEqual(len(paysheet_line_list), 3) + self.assertEqual(len(paysheet_line_list), 4) self.assertEqual(len(paysheet.getMovementList(portal_type=\ - 'Pay Sheet Cell')), 4) # 4 because labour line contain no movement - # 2 for bonus, and 2 for urssaf + 'Pay Sheet Cell')), 4) # 2 for bonus 2 for urssaf def stepCheckThereIsOnlyOnePaysheetLine(self, sequence=None, **kw): paysheet = sequence.get('paysheet') @@ -623,7 +714,7 @@ class TestPayrollMixin(TestTradeModelLineMixin): def stepCheckPaysheetLineAreCreatedUsingSlices(self, sequence=None, **kw): paysheet = sequence.get('paysheet') paysheet_line_list = paysheet.contentValues(portal_type='Pay Sheet Line') - self.assertEqual(len(paysheet_line_list), 4) + self.assertEqual(len(paysheet_line_list), 7) self.assertEqual(len(paysheet.getMovementList(portal_type=\ 'Pay Sheet Cell')), 6) # 6 because labour line contain no movement and # because of the 3 slice and 2 contribution_shares @@ -631,7 +722,7 @@ class TestPayrollMixin(TestTradeModelLineMixin): def stepCheckPaysheetLineAreCreatedUsingComplexSlices(self, sequence=None, **kw): paysheet = sequence.get('paysheet') paysheet_line_list = paysheet.contentValues(portal_type='Pay Sheet Line') - self.assertEqual(len(paysheet_line_list), 3) + self.assertEqual(len(paysheet_line_list), 5) self.assertEqual(len(paysheet.getMovementList(portal_type=\ 'Pay Sheet Cell')), 4) # 4 because labour line contain no movement and # because of the 2 slice and 2 contribution_shares @@ -639,17 +730,14 @@ class TestPayrollMixin(TestTradeModelLineMixin): def stepCheckPaysheetLineAreCreatedUsingWith3Lines(self, sequence=None, **kw): paysheet = sequence.get('paysheet') paysheet_line_list = paysheet.contentValues(portal_type='Pay Sheet Line') - self.assertEqual(len(paysheet_line_list), 3) + self.assertEqual(len(paysheet_line_list), 5) self.assertEqual(len(paysheet.getMovementList(portal_type=\ - 'Pay Sheet Cell')), 4) # 4 because labour line contain no movement and - # because of the two lines and 2 contribution_shares - # (urssaf and sickness insurance. old age - # insurance does not match predicate) + 'Pay Sheet Cell')), 4) # 2 for urssaf 2 for sickness insurrance def stepCheckPaysheetLineAreCreatedAfterUpdateWithLinesWithSameResource(self, sequence=None, **kw): paysheet = sequence.get('paysheet') paysheet_line_list = paysheet.contentValues(portal_type='Pay Sheet Line') - self.assertEqual(len(paysheet_line_list), 5) + self.assertEqual(len(paysheet_line_list), 9) self.assertEqual(len(paysheet.getMovementList(portal_type=\ 'Pay Sheet Cell')), 8) # 8 because labour line contain no movement and # because of the 3 slice and 2 contribution_shares @@ -661,12 +749,14 @@ class TestPayrollMixin(TestTradeModelLineMixin): for paysheet_line in paysheet_line_list: service = paysheet_line.getResourceTitle() if service == 'Urssaf': - cell1 = paysheet_line.getCell('contribution_share/employee') - self.assertEquals(cell1.getQuantity(), 3000) - self.assertEquals(cell1.getPrice(), 0.1) - cell2 = paysheet_line.getCell('contribution_share/employer') - self.assertEquals(cell2.getQuantity(), 3000) - self.assertEquals(cell2.getPrice(), 0.5) + if paysheet_line.getBaseApplication() == "base_amount/payroll/base/contribution/employee": + cell = paysheet_line.getCell('base_application/base_amount/payroll/base/contribution/employee') + self.assertEquals(cell.getQuantity(), 3000) + self.assertEquals(cell.getPrice(), 0.1) + if paysheet_line.getBaseApplication() == "base_amount/payroll/base/contribution/employer": + cell = paysheet_line.getCell('base_application/base_amount/payroll/base/contribution/employer') + self.assertEquals(cell.getQuantity(), 3000) + self.assertEquals(cell.getPrice(), 0.5) elif service == 'Labour': self.assertEqual(paysheet_line.getTotalPrice(), 3000.0) else: @@ -678,19 +768,27 @@ class TestPayrollMixin(TestTradeModelLineMixin): for paysheet_line in paysheet_line_list: service = paysheet_line.getResourceTitle() if service == 'Urssaf': - cell1 = paysheet_line.getCell('contribution_share/employee') - self.assertEquals(cell1.getQuantity(), 4000) - self.assertEquals(cell1.getPrice(), 0.1) - cell2 = paysheet_line.getCell('contribution_share/employer') - self.assertEquals(cell2.getQuantity(), 4000) - self.assertEquals(cell2.getPrice(), 0.5) + if paysheet_line.getBaseApplication() == "base_amount/payroll/base/contribution/employer": + cell = paysheet_line.getCell('base_application/base_amount/payroll/base/contribution/employer') + self.assertEquals(cell.getQuantity(), 4000) + self.assertEquals(cell.getPrice(), 0.5) + elif paysheet_line.getBaseApplication() == "base_amount/payroll/base/contribution/employee": + cell = paysheet_line.getCell('base_application/base_amount/payroll/base/contribution/employee') + self.assertEquals(cell.getQuantity(), 4000) + self.assertEquals(cell.getPrice(), 0.1) + else: + self.fail("Unknown contribution for line %s" % paysheet_line.getBaseContribution()) elif service == 'Labour': self.assertEqual(paysheet_line.getTotalPrice(), 3000.0) elif service == 'Bonus': - cell1 = paysheet_line.getCell('contribution_share/employee') - self.assertEquals(cell1.getTotalPrice(), 1000) - cell2 = paysheet_line.getCell('contribution_share/employer') - self.assertEquals(cell2.getTotalPrice(), 1000) + if paysheet_line.getBaseContribution() == "base_amount/payroll/base/contribution/employer": + cell = paysheet_line.getCell('base_contribution/base_amount/payroll/base/contribution/employer') + self.assertEquals(cell.getTotalPrice(), 1000) + elif paysheet_line.getBaseContribution() == "base_amount/payroll/base/contribution/employee": + cell = paysheet_line.getCell('base_contribution/base_amount/payroll/base/contribution/employee') + self.assertEquals(cell.getTotalPrice(), 1000) + else: + self.fail("Unknown contribution for line %s" % paysheet_line.getBaseContribution()) else: self.fail("Unknown service for line %s" % paysheet_line.getTitle()) @@ -700,14 +798,16 @@ class TestPayrollMixin(TestTradeModelLineMixin): for paysheet_line in paysheet_line_list: service = paysheet_line.getResourceTitle() if service == 'Urssaf': - cell1 = paysheet_line.getCell('contribution_share/employee') - # XXX-Aurel quantity from model line is multiply by total price of labour line - # price remains None - self.assertEquals(cell1.getQuantity(), -300000) - self.assertEquals(cell1.getPrice(), None) - cell2 = paysheet_line.getCell('contribution_share/employer') - self.assertEquals(cell2.getQuantity(), -600000) - self.assertEquals(cell2.getPrice(), None) + if paysheet_line.getBaseContribution() == "base_amount/payroll/base/contribution/employee": + # XXX-Aurel quantity from model line is multiply by total price of labour line + # price remains None + cell = paysheet_line.getCell('base_application/base_amount/payroll/base/contribution/employee') + self.assertEquals(cell.getQuantity(), -300000) + self.assertEquals(cell.getPrice(), None) + elif paysheet_line.getBaseContribution() == "base_amount/payroll/base/contribution/employer": + cell = paysheet_line.getCell('base_application/base_amount/payroll/base/contribution/employer') + self.assertEquals(cell.getQuantity(), -600000) + self.assertEquals(cell.getPrice(), None) elif service == 'Labour': self.assertEqual(paysheet_line.getTotalPrice(), 3000.0) else: @@ -719,35 +819,45 @@ class TestPayrollMixin(TestTradeModelLineMixin): for paysheet_line in paysheet_line_list: service = paysheet_line.getResourceTitle() if service == 'Urssaf': - if paysheet_line.getSalaryRange() == 'france/slice_0_to_200': - cell1 = paysheet_line.getCell('contribution_share/employee', - 'salary_range/france/slice_0_to_200') - self.assertEquals(cell1.getQuantity(), 200) - self.assertEquals(cell1.getPrice(), 0.1) - cell2 = paysheet_line.getCell('contribution_share/employer', - 'salary_range/france/slice_0_to_200') - self.assertEquals(cell2.getQuantity(), 200) - self.assertEquals(cell2.getPrice(), 0.2) - elif paysheet_line.getSalaryRange() == 'france/slice_200_to_400': - cell3 = paysheet_line.getCell('contribution_share/employee', - 'salary_range/france/slice_200_to_400') - self.assertEquals(cell3.getQuantity(), 200) - self.assertEquals(cell3.getPrice(), 0.3) - cell4 = paysheet_line.getCell('contribution_share/employer', - 'salary_range/france/slice_200_to_400') - self.assertEquals(cell4.getQuantity(), 200) - self.assertEquals(cell4.getPrice(), 0.4) - elif paysheet_line.getSalaryRange() == 'france/slice_400_to_5000': - cell5 = paysheet_line.getCell('contribution_share/employee', - 'salary_range/france/slice_400_to_5000') - self.assertEquals(cell5.getQuantity(), 2600) - self.assertEquals(cell5.getPrice(), 0.5) - cell6 = paysheet_line.getCell('contribution_share/employer', - 'salary_range/france/slice_400_to_5000') - self.assertEquals(cell6.getQuantity(), 2600) - self.assertEquals(cell6.getPrice(), 0.6) + app_list = paysheet_line.getBaseApplicationList() + if 'base_amount/payroll/base/contribution/employee' in app_list: + if "base_amount/payroll/l10n/fr/salary_range/slice_0_to_200" in app_list: + cell1 = paysheet_line.getCell('base_application/base_amount/payroll/base/contribution/employee', + 'base_application/base_amount/payroll/l10n/fr/salary_range/slice_0_to_200') + self.assertEquals(cell1.getQuantity(), 200) + self.assertEquals(cell1.getPrice(), 0.1) + elif "base_amount/payroll/l10n/fr/salary_range/slice_200_to_400" in app_list: + cell3 = paysheet_line.getCell('base_application/base_amount/payroll/base/contribution/employee', + 'base_application/base_amount/payroll/l10n/fr/salary_range/slice_200_to_400') + self.assertEquals(cell3.getQuantity(), 200) + self.assertEquals(cell3.getPrice(), 0.3) + elif "base_amount/payroll/l10n/fr/salary_range/slice_400_to_5000" in app_list: + cell5 = paysheet_line.getCell('base_application/base_amount/payroll/base/contribution/employee', + 'base_application/base_amount/payroll/l10n/fr/salary_range/slice_400_to_5000') + self.assertEquals(cell5.getQuantity(), 2600) + self.assertEquals(cell5.getPrice(), 0.5) + else: + self.fail("Unknown application %s for line %s" % (app_list,paysheet_line.getTitle())) + elif 'base_amount/payroll/base/contribution/employer' in app_list: + if "base_amount/payroll/l10n/fr/salary_range/slice_0_to_200" in app_list: + cell2 = paysheet_line.getCell('base_application/base_amount/payroll/base/contribution/employer', + 'base_application/base_amount/payroll/l10n/fr/salary_range/slice_0_to_200') + self.assertEquals(cell2.getQuantity(), 200) + self.assertEquals(cell2.getPrice(), 0.2) + elif "base_amount/payroll/l10n/fr/salary_range/slice_200_to_400" in app_list: + cell4 = paysheet_line.getCell('base_application/base_amount/payroll/base/contribution/employer', + 'base_application/base_amount/payroll/l10n/fr/salary_range/slice_200_to_400') + self.assertEquals(cell4.getQuantity(), 200) + self.assertEquals(cell4.getPrice(), 0.4) + elif "base_amount/payroll/l10n/fr/salary_range/slice_400_to_5000" in app_list: + cell6 = paysheet_line.getCell('base_application/base_amount/payroll/base/contribution/employer', + 'base_application/base_amount/payroll/l10n/fr/salary_range/slice_400_to_5000') + self.assertEquals(cell6.getQuantity(), 2600) + self.assertEquals(cell6.getPrice(), 0.6) + else: + self.fail("Unknown application %s for line %s" % (app_list,paysheet_line.getTitle())) else: - self.fail("Unknown salary range for line %s" % paysheet_line.getTitle()) + self.fail("Unknown application %s for line %s" % (app_list,paysheet_line.getTitle())) elif service == 'Labour': self.assertEqual(paysheet_line.getTotalPrice(), 3000.0) else: @@ -759,26 +869,35 @@ class TestPayrollMixin(TestTradeModelLineMixin): for paysheet_line in paysheet_line_list: service = paysheet_line.getResourceTitle() if service == 'Urssaf': - if paysheet_line.getSalaryRange() == 'france/slice_200_to_400': - cell1 = paysheet_line.getCell('contribution_share/employee', - 'salary_range/france/slice_200_to_400') - self.assertEquals(cell1.getQuantity(), 200) - self.assertEquals(cell1.getPrice(), 0.1) - cell2 = paysheet_line.getCell('contribution_share/employer', - 'salary_range/france/slice_200_to_400') - self.assertEquals(cell2.getQuantity(), 200) - self.assertEquals(cell2.getPrice(), 0.2) - elif paysheet_line.getSalaryRange() == 'france/slice_600_to_800': - cell3 = paysheet_line.getCell('contribution_share/employee', - 'salary_range/france/slice_600_to_800') - self.assertEquals(cell3.getQuantity(), 200) - self.assertEquals(cell3.getPrice(), 0.3) - cell4 = paysheet_line.getCell('contribution_share/employer', - 'salary_range/france/slice_600_to_800') - self.assertEquals(cell4.getQuantity(), 200) - self.assertEquals(cell4.getPrice(), 0.4) + app_list = paysheet_line.getBaseApplicationList() + if 'base_amount/payroll/base/contribution/employee' in app_list: + if "base_amount/payroll/l10n/fr/salary_range/slice_200_to_400" in app_list: + cell1 = paysheet_line.getCell('base_application/base_amount/payroll/base/contribution/employee', + 'base_application/base_amount/payroll/l10n/fr/salary_range/slice_200_to_400') + self.assertEquals(cell1.getQuantity(), 200) + self.assertEquals(cell1.getPrice(), 0.1) + elif "base_amount/payroll/l10n/fr/salary_range/slice_600_to_800" in app_list: + cell3 = paysheet_line.getCell('base_application/base_amount/payroll/base/contribution/employee', + 'base_application/base_amount/payroll/l10n/fr/salary_range/slice_600_to_800') + self.assertEquals(cell3.getQuantity(), 200) + self.assertEquals(cell3.getPrice(), 0.1) + else: + self.fail("Unknown application %s for line %s" % (app_list,paysheet_line.getTitle())) + elif 'base_amount/payroll/base/contribution/employer' in app_list: + if "base_amount/payroll/l10n/fr/salary_range/slice_200_to_400" in app_list: + cell2 = paysheet_line.getCell('base_application/base_amount/payroll/base/contribution/employer', + 'base_application/base_amount/payroll/l10n/fr/salary_range/slice_200_to_400') + self.assertEquals(cell2.getQuantity(), 200) + self.assertEquals(cell2.getPrice(), 0.2) + elif "base_amount/payroll/l10n/fr/salary_range/slice_600_to_800" in app_list: + cell4 = paysheet_line.getCell('base_application/base_amount/payroll/base/contribution/employer', + 'base_application/base_amount/payroll/l10n/fr/salary_range/slice_600_to_800') + self.assertEquals(cell4.getQuantity(), 200) + self.assertEquals(cell4.getPrice(), 0.2) + else: + self.fail("Unknown application %s for line %s" % (app_list,paysheet_line.getTitle())) else: - self.fail("Unknown salary range for line %s" % paysheet_line.getTitle()) + self.fail("Unknown application %s for line %s" % (app_list,paysheet_line.getTitle())) elif service == 'Labour': self.assertEqual(paysheet_line.getTotalPrice(), 3000.0) else: @@ -791,40 +910,47 @@ class TestPayrollMixin(TestTradeModelLineMixin): for paysheet_line in paysheet_line_list: service = paysheet_line.getResourceTitle() if service == 'Urssaf': - if paysheet_line.getSalaryRange() == 'france/slice_0_to_200': - cell1 = paysheet_line.getCell('contribution_share/employee', - 'salary_range/france/slice_0_to_200') - self.assertEquals(cell1.getQuantity(), 200) - self.assertEquals(cell1.getPrice(), 0.1) - cell2 = paysheet_line.getCell('contribution_share/employer', - 'salary_range/france/slice_0_to_200') - self.assertEquals(cell2.getQuantity(), 200) - self.assertEquals(cell2.getPrice(), 0.2) - elif paysheet_line.getSalaryRange() == 'france/slice_200_to_400': - cell3 = paysheet_line.getCell('contribution_share/employee', - 'salary_range/france/slice_200_to_400') - self.assertEquals(cell3.getQuantity(), 200) - self.assertEquals(cell3.getPrice(), 0.3) - cell4 = paysheet_line.getCell('contribution_share/employer', - 'salary_range/france/slice_200_to_400') - self.assertEquals(cell4.getQuantity(), 200) - self.assertEquals(cell4.getPrice(), 0.4) - elif paysheet_line.getSalaryRange() == 'france/slice_400_to_5000': - cell5 = paysheet_line.getCell('contribution_share/employee', - 'salary_range/france/slice_400_to_5000') - self.assertEquals(cell5.getQuantity(), 2600) - self.assertEquals(cell5.getPrice(), 0.5) - cell6 = paysheet_line.getCell('contribution_share/employer', - 'salary_range/france/slice_400_to_5000') - self.assertEquals(cell6.getQuantity(), 2600) - self.assertEquals(cell6.getPrice(), 0.6) - else: - cell1 = paysheet_line.getCell('contribution_share/employee') - self.assertEquals(cell1.getQuantity(), 3000) - self.assertEquals(cell1.getPrice(), 0.1) - cell2 = paysheet_line.getCell('contribution_share/employer') - self.assertEquals(cell2.getQuantity(), 3000) - self.assertEquals(cell2.getPrice(), 0.5) + app_list = paysheet_line.getBaseApplicationList() + if 'base_amount/payroll/base/contribution/employee' in app_list: + if "base_amount/payroll/l10n/fr/salary_range/slice_0_to_200" in app_list: + cell1 = paysheet_line.getCell('base_application/base_amount/payroll/base/contribution/employee', + 'base_application/base_amount/payroll/l10n/fr/salary_range/slice_0_to_200') + self.assertEquals(cell1.getQuantity(), 200) + self.assertEquals(cell1.getPrice(), 0.1) + elif "base_amount/payroll/l10n/fr/salary_range/slice_200_to_400" in app_list: + cell1 = paysheet_line.getCell('base_application/base_amount/payroll/base/contribution/employee', + 'base_application/base_amount/payroll/l10n/fr/salary_range/slice_200_to_400') + self.assertEquals(cell1.getQuantity(), 200) + self.assertEquals(cell1.getPrice(), 0.3) + elif "base_amount/payroll/l10n/fr/salary_range/slice_400_to_5000" in app_list: + cell1 = paysheet_line.getCell('base_application/base_amount/payroll/base/contribution/employee', + 'base_application/base_amount/payroll/l10n/fr/salary_range/slice_400_to_5000') + self.assertEquals(cell1.getQuantity(), 2600) + self.assertEquals(cell1.getPrice(), 0.5) + else: + cell1 = paysheet_line.getCell('base_application/base_amount/payroll/base/contribution/employee') + self.assertEquals(cell1.getQuantity(), 3000) + self.assertEquals(cell1.getPrice(), 0.1) + elif 'base_amount/payroll/base/contribution/employer' in app_list: + if "base_amount/payroll/l10n/fr/salary_range/slice_0_to_200" in app_list: + cell1 = paysheet_line.getCell('base_application/base_amount/payroll/base/contribution/employer', + 'base_application/base_amount/payroll/l10n/fr/salary_range/slice_0_to_200') + self.assertEquals(cell1.getQuantity(), 200) + self.assertEquals(cell1.getPrice(), 0.2) + elif "base_amount/payroll/l10n/fr/salary_range/slice_200_to_400" in app_list: + cell1 = paysheet_line.getCell('base_application/base_amount/payroll/base/contribution/employer', + 'base_application/base_amount/payroll/l10n/fr/salary_range/slice_200_to_400') + self.assertEquals(cell1.getQuantity(), 200) + self.assertEquals(cell1.getPrice(), 0.4) + elif "base_amount/payroll/l10n/fr/salary_range/slice_400_to_5000" in app_list: + cell1 = paysheet_line.getCell('base_application/base_amount/payroll/base/contribution/employer', + 'base_application/base_amount/payroll/l10n/fr/salary_range/slice_400_to_5000') + self.assertEquals(cell1.getQuantity(), 2600) + self.assertEquals(cell1.getPrice(), 0.6) + else: + cell1 = paysheet_line.getCell('base_application/base_amount/payroll/base/contribution/employer') + self.assertEquals(cell1.getQuantity(), 3000) + self.assertEquals(cell1.getPrice(), 0.5) elif service == 'Labour': self.assertEqual(paysheet_line.getTotalPrice(), 3000.0) else: @@ -836,21 +962,21 @@ class TestPayrollMixin(TestTradeModelLineMixin): for paysheet_line in paysheet_line_list: service = paysheet_line.getResourceTitle() if service == 'Urssaf': - cell1 = paysheet_line.getCell('contribution_share/employee') - self.assertEquals(cell1.getQuantity(), 3000) - self.assertEquals(cell1.getPrice(), 0.1) - cell2 = paysheet_line.getCell('contribution_share/employer') - self.assertEquals(cell2.getQuantity(), 3000) - self.assertEquals(cell2.getPrice(), 0.5) + if paysheet_line.getBaseContribution() == "base_amount/payroll/base/contribution/employee": + self.assertEquals(paysheet_line.getQuantity(), 3000) + self.assertEquals(paysheet_line.getPrice(), 0.1) + if paysheet_line.getBaseContribution() == "base_amount/payroll/base/contribution/employer": + self.assertEquals(paysheet_line.getQuantity(), 3000) + self.assertEquals(paysheet_line.getPrice(), 0.5) elif service == 'Labour': self.assertEqual(paysheet_line.getTotalPrice(), 3000.0) elif service == 'Sickness Insurance': - cell1 = paysheet_line.getCell('contribution_share/employee') - self.assertEquals(cell1.getQuantity(), 3000) - self.assertEquals(cell1.getPrice(), 0.4) - cell2 = paysheet_line.getCell('contribution_share/employer') - self.assertEquals(cell2.getQuantity(), 3000) - self.assertEquals(cell2.getPrice(), 0.3) + if paysheet_line.getBaseContribution() == "base_amount/payroll/base/contribution/employee": + self.assertEquals(paysheet_line.getQuantity(), 3000) + self.assertEquals(paysheet_line.getPrice(), 0.4) + if paysheet_line.getBaseContribution() == "base_amount/payroll/base/contribution/employer": + self.assertEquals(paysheet_line.getQuantity(), 3000) + self.assertEquals(paysheet_line.getPrice(), 0.3) else: self.fail("Unknown service for line %s" % paysheet_line.getTitle()) @@ -860,21 +986,21 @@ class TestPayrollMixin(TestTradeModelLineMixin): for paysheet_line in paysheet_line_list: service = paysheet_line.getResourceTitle() if service == 'Urssaf': - cell1 = paysheet_line.getCell('contribution_share/employee') - self.assertEquals(cell1.getQuantity(), 3000) - self.assertEquals(cell1.getPrice(), 0.1) - cell2 = paysheet_line.getCell('contribution_share/employer') - self.assertEquals(cell2.getQuantity(), 3000) - self.assertEquals(cell2.getPrice(), 0.5) + if paysheet_line.getBaseContribution() == "base_amount/payroll/base/contribution/employee": + self.assertEquals(paysheet_line.getQuantity(), 3000) + self.assertEquals(paysheet_line.getPrice(), 0.1) + if paysheet_line.getBaseContribution() == "base_amount/payroll/base/contribution/employer": + self.assertEquals(paysheet_line.getQuantity(), 3000) + self.assertEquals(paysheet_line.getPrice(), 0.5) elif service == 'Labour': self.assertEqual(paysheet_line.getTotalPrice(), 3000.0) elif service == 'Old Age Insurance': - cell1 = paysheet_line.getCell('contribution_share/employee') - self.assertEquals(cell1.getQuantity(), 3000) - self.assertEquals(cell1.getPrice(), 0.5) - cell2 = paysheet_line.getCell('contribution_share/employer') - self.assertEquals(cell2.getQuantity(), 3000) - self.assertEquals(cell2.getPrice(), 0.8) + if paysheet_line.getBaseContribution() == "base_amount/payroll/base/contribution/employee": + self.assertEquals(paysheet_line.getQuantity(), 3000) + self.assertEquals(paysheet_line.getPrice(), 0.5) + if paysheet_line.getBaseContribution() == "base_amount/payroll/base/contribution/employer": + self.assertEquals(paysheet_line.getQuantity(), 3000) + self.assertEquals(paysheet_line.getPrice(), 0.8) else: self.fail("Unknown service for line %s" % paysheet_line.getTitle()) @@ -899,6 +1025,17 @@ class TestPayrollMixin(TestTradeModelLineMixin): business_link.setSourceSectionValue(sequence.get('urssaf_roubaix')) business_link.setDeliveryBuilderList(('portal_deliveries/pay_sheet_builder',)) sequence.edit(business_link=business_link) + # Add a trade model path + business_process = sequence.get('business_process') + urssaf_roubaix = sequence.get('urssaf_roubaix') + business_process.newContent(portal_type='Trade Model Path', + trade_phase_list=['payroll/france/urssaf', + 'payroll/france/labour'], + reference="paysheet_path", + efficiency=1.0, + source_section_value=urssaf_roubaix, + ) + def stepModelSpecialiseBusinessProcess(self, sequence=None, **kw): model = sequence.get('model') @@ -915,10 +1052,10 @@ class TestPayrollMixin(TestTradeModelLineMixin): for paysheet_line in paysheet_line_list: service = paysheet_line.getResourceTitle() if service == 'Urssaf': - cell1 = paysheet_line.getCell('contribution_share/employee') - self.assertEquals(cell1.getSourceSectionValue(), urssaf_roubaix) - cell2 = paysheet_line.getCell('contribution_share/employer') - self.assertEquals(cell2.getSourceSectionValue(), urssaf_roubaix) + if paysheet_line.getBaseApplication() == "base_amount/payroll/base/contribution/employee": + self.assertEquals(paysheet_line.getSourceSectionValue(), urssaf_roubaix) + if paysheet_line.getBaseApplication() == "base_amount/payroll/base/contribution/employer": + self.assertEquals(paysheet_line.getSourceSectionValue(), urssaf_roubaix) elif service == 'Labour': pass else: @@ -1094,8 +1231,9 @@ class TestPayrollMixin(TestTradeModelLineMixin): int_index = 10, reference='intermediate_line', price=0.2, - base_contribution_list=['base_amount/payroll/base/income_tax'], - base_application_list=['base_amount/payroll/base/contribution']) + base_contribution_list=['base_amount/payroll/base/income_tax/employee', + 'base_amount/payroll/base/income_tax/employer'], + base_application_list=['base_amount/payroll/base/contribution/employee',]) sequence.edit(intermediate_model_line = model_line) def stepModelCreateAppliedOnTaxModelLine(self, sequence=None, **kw): @@ -1109,24 +1247,25 @@ class TestPayrollMixin(TestTradeModelLineMixin): trade_phase='payroll/france/urssaf', resource_value=sequence.get('urssaf_service'), reference='line_applied_on_intermediate_line', - variation_category_list=['contribution_share/employee', - 'contribution_share/employer'], - base_contribution_list=['base_amount/payroll/report/salary/net'], - base_application_list=['base_amount/payroll/base/income_tax']) + variation_category_list=['base_application/base_amount/payroll/base/income_tax/employee', + 'base_application/base_amount/payroll/base/income_tax/employer'], + base_contribution_list=['base_amount/payroll/report/salary/net'],) sequence.edit(model_line_applied_on_tax = model_line) def stepAppliedOnTaxModelLineCreateMovements(self, sequence=None, **kw): model_line = sequence.get('model_line_applied_on_tax') - cell1 = model_line.newCell('contribution_share/employee', - portal_type='Pay Sheet Model Cell', - base_id='movement', - mapped_value_property_list=('quantity', 'price')) - cell1.edit(price=0.1, quantity=None, contribution_share='employee') - cell2 = model_line.newCell('contribution_share/employer', - portal_type='Pay Sheet Model Cell', - base_id='movement', - mapped_value_property_list=('quantity', 'price')) - cell2.edit(price=0.5, quantity=None, contribution_share='employer') + cell1 = model_line.newCell('base_application/base_amount/payroll/base/income_tax/employee', + portal_type='Pay Sheet Model Cell', + base_id='movement', + base_application='base_amount/payroll/base/income_tax/employee', + mapped_value_property_list=('quantity', 'price')) + cell1.edit(price=0.1, quantity=None) + cell2 = model_line.newCell('base_application/base_amount/payroll/base/income_tax/employer', + portal_type='Pay Sheet Model Cell', + base_id='movement', + base_application='base_amount/payroll/base/income_tax/employer', + mapped_value_property_list=('quantity', 'price')) + cell2.edit(price=0.5, quantity=None) def stepModelCreateOldAgeInsuranceModelLine(self, sequence=None, **kw): model = sequence.get('model') @@ -1135,26 +1274,25 @@ class TestPayrollMixin(TestTradeModelLineMixin): trade_phase='payroll/france/urssaf', resource_value=sequence.get('old_age_insurance_service'), reference='old_age_insurance', - variation_category_list=['contribution_share/employee', - 'contribution_share/employer'], - base_application_list=[ 'base_amount/payroll/base/contribution'], + variation_category_list=['base_application/base_amount/payroll/base/contribution/employee', + 'base_application/base_amount/payroll/base/contribution/employer'], base_contribution_list=['base_amount/payroll/base/income_tax']) sequence.edit(old_age_insurance = model_line) def stepOldAgeInsuranceModelLineCreateMovements(self, sequence=None, **kw): model_line = sequence.get('old_age_insurance') - cell1 = model_line.newCell('contribution_share/employee', + cell1 = model_line.newCell('base_application/base_amount/payroll/base/contribution/employee', portal_type='Pay Sheet Model Cell', + base_application='base_amount/payroll/base/contribution/employee', base_id='movement', - quantity=None, mapped_value_property_list=('quantity', 'price')) - cell1.edit(price=0.5, contribution_share='employee') - cell2 = model_line.newCell('contribution_share/employer', + cell1.edit(price=0.5, quantity=None) + cell2 = model_line.newCell('base_application/base_amount/payroll/base/contribution/employer', portal_type='Pay Sheet Model Cell', + base_application='base_amount/payroll/base/contribution/employer', base_id='movement', - quantity=None, mapped_value_property_list=('quantity', 'price')) - cell2.edit(price=0.8, contribution_share='employer') + cell2.edit(price=0.8, quantity=None) def stepModelCreateSicknessInsuranceModelLine(self, sequence=None, **kw): model = sequence.get('model') @@ -1163,48 +1301,51 @@ class TestPayrollMixin(TestTradeModelLineMixin): trade_phase='payroll/france/urssaf', resource_value=sequence.get('sickness_insurance_service'), reference='sickness_insurance', - variation_category_list=['contribution_share/employee', - 'contribution_share/employer'], - base_application_list=[ 'base_amount/payroll/base/contribution'], - base_contribution_list=['base_amount/payroll/base/income_tax']) + variation_category_list=['base_application/base_amount/payroll/base/contribution/employee', + 'base_application/base_amount/payroll/base/contribution/employer'], + base_contribution_list=['base_amount/payroll/base/income_tax'],) sequence.edit(sickness_insurance = model_line) def stepSicknessInsuranceModelLineCreateMovements(self, sequence=None, **kw): model_line = sequence.get('sickness_insurance') - cell1 = model_line.newCell('contribution_share/employee', + cell1 = model_line.newCell('base_application/base_amount/payroll/base/contribution/employee', portal_type='Pay Sheet Model Cell', + base_application='base_amount/payroll/base/contribution/employee', base_id='movement', - quantity=None, mapped_value_property_list=('quantity', 'price')) - cell1.edit(price=0.4, contribution_share='employee') - cell2 = model_line.newCell('contribution_share/employer', + cell1.edit(price=0.4, quantity=None) + cell2 = model_line.newCell('base_application/base_amount/payroll/base/contribution/employer', portal_type='Pay Sheet Model Cell', + base_application='base_amount/payroll/base/contribution/employer', base_id='movement', - quantity=None, mapped_value_property_list=('quantity', 'price')) - cell2.edit(price=0.3, contribution_share='employer') + cell2.edit(price=0.3, quantity=None) def stepCheckPaysheetIntermediateLines(self, sequence=None, **kw): paysheet = sequence.get('paysheet') - # paysheet should contain only two lines (labour and urssaf, but not + # paysheet should contain only three lines (labour and 2 urssaf, but not # intermediate urssaf self.assertEquals(len(paysheet.contentValues(portal_type=\ - 'Pay Sheet Line')), 2) + 'Pay Sheet Line')), 3) # check amounts paysheet_line_list = paysheet.contentValues(portal_type='Pay Sheet Line') for paysheet_line in paysheet_line_list: service = paysheet_line.getResourceTitle() if service == 'Urssaf': - cell1 = paysheet_line.getCell('contribution_share/employee') - self.assertEquals(cell1.getQuantity(), 600) # here it's 600 of tax - # because of the intermediate line (3000*0.2) - self.assertEquals(cell1.getPrice(), 0.1) - cell2 = paysheet_line.getCell('contribution_share/employer') - self.assertEquals(cell2.getQuantity(), 600) # here it's 600 of tax - # because of the intermediate line (3000*0.2) - self.assertEquals(cell2.getPrice(), 0.5) + if paysheet_line.getBaseApplication() == 'base_amount/payroll/base/income_tax/employee': + cell1 = paysheet_line.getCell('base_application/base_amount/payroll/base/income_tax/employee') + self.assertEquals(cell1.getQuantity(), 600) # here it's 600 of tax + # because of the intermediate line (3000*0.2) + self.assertEquals(cell1.getPrice(), 0.1) + elif paysheet_line.getBaseApplication() == 'base_amount/payroll/base/income_tax/employer': + cell2 = paysheet_line.getCell('base_application/base_amount/payroll/base/income_tax/employer') + self.assertEquals(cell2.getQuantity(), 600) # here it's 600 of tax + # because of the intermediate line (3000*0.2) + self.assertEquals(cell2.getPrice(), 0.5) + else: + self.fail("Unknown application for %s line %s" % (paysheet_line.getBaseApplication(), paysheet_line.getTitle())) elif service == 'Labour': self.assertEqual(paysheet_line.getTotalPrice(), 3000.0) else: @@ -1212,20 +1353,19 @@ class TestPayrollMixin(TestTradeModelLineMixin): def stepModelModifyUrssafModelLine(self, sequence=None, **kw): model_line = sequence.get('urssaf_model_line') - # modify price on movements : - cell_1 = model_line.getCell('contribution_share/employee', - base_id='movement') + cell_1 = model_line.getCell('base_application/base_amount/payroll/base/contribution/employee', + base_id='movement') self.assertNotEquals(cell_1, None) - cell_1.edit(price=0.2) - cell_2 = model_line.getCell('contribution_share/employer', - base_id='movement') + cell_1.edit(price=0.2, quantity=None) + cell_2 = model_line.getCell('base_application/base_amount/payroll/base/contribution/employer', + base_id='movement') self.assertNotEquals(cell_2, None) - cell_2.edit(price=0.6) + cell_2.edit(price=0.6, quantity=None) def stepModelDelUrssafModelLine(self, sequence=None, **kw): model_line = sequence.get('urssaf_model_line') model = sequence.get('model') - model.manage_delObjects(model_line.getId()) + model.manage_delObjects([model_line.getId(),]) def stepCheckPaysheetLineNewAmountsAfterUpdate(self, sequence=None, **kw): paysheet = sequence.get('paysheet') @@ -1233,12 +1373,14 @@ class TestPayrollMixin(TestTradeModelLineMixin): for paysheet_line in paysheet_line_list: service = paysheet_line.getResourceTitle() if service == 'Urssaf': - cell1 = paysheet_line.getCell('contribution_share/employee') - self.assertEquals(cell1.getQuantity(), 3000) - self.assertEquals(cell1.getPrice(), 0.2) - cell2 = paysheet_line.getCell('contribution_share/employer') - self.assertEquals(cell2.getQuantity(), 3000) - self.assertEquals(cell2.getPrice(), 0.6) + if paysheet_line.getBaseApplication() == "base_amount/payroll/base/contribution/employee": + cell = paysheet_line.getCell('base_application/base_amount/payroll/base/contribution/employee') + self.assertEquals(cell.getQuantity(), 3000) + self.assertEquals(cell.getPrice(), 0.2) + if paysheet_line.getBaseApplication() == "base_amount/payroll/base/contribution/employer": + cell = paysheet_line.getCell('base_application/base_amount/payroll/base/contribution/employer') + self.assertEquals(cell.getQuantity(), 3000) + self.assertEquals(cell.getPrice(), 0.6) elif service == 'Labour': self.assertEqual(paysheet_line.getTotalPrice(), 3000.0) else: @@ -1341,7 +1483,7 @@ class TestPayrollMixin(TestTradeModelLineMixin): self.assertEquals(model_reference_dict[model_company_alt_url], ['social_insurance']) self.assertNotEquals(model_reference_dict.has_key(model_country_url), True) - + # check the object list : object_list = paysheet.getInheritedObjectValueList(portal_type_list=\ ('Annotation Line',)) @@ -1375,19 +1517,24 @@ class TestPayrollMixin(TestTradeModelLineMixin): # if the line has cells with different tax categories, new properties are # added to this line. urssaf_service = sequence.get('urssaf_service') + urssaf_service.edit(variation_base_category_list=['base_contribution']) + urssaf_service.setVariationCategoryList(['base_contribution/base_amount/payroll/base/contribution/employee', + 'base_contribution/base_amount/payroll/base/contribution/employer' + ]) line.setResourceValue(urssaf_service) - line.setVariationCategoryList(['contribution_share/employee', - 'contribution_share/employer']) - cell0 = line.newCell('contribution_share/employee', + line.setVariationCategoryList(['base_contribution/base_amount/payroll/base/contribution/employee', + 'base_contribution/base_amount/payroll/base/contribution/employer' + ]) + cell0 = line.newCell('base_contribution/base_amount/payroll/base/contribution/employee', portal_type='Pay Sheet Cell', base_id='movement') cell0.setMappedValuePropertyList(['quantity', 'price']) - cell0.setVariationCategoryList(('contribution_share/employee',)) + cell0.setVariationCategoryList(('base_contribution/base_amount/payroll/base/contribution/employee',)) cell0.setPrice(2.0) cell0.setQuantity(3.0) - cell1 = line.newCell('contribution_share/employer', + cell1 = line.newCell('base_contribution/base_amount/payroll/base/contribution/employer', portal_type='Pay Sheet Cell', base_id='movement') cell1.setMappedValuePropertyList(['quantity', 'price']) - cell1.setVariationCategoryList(('contribution_share/employer',)) + cell1.setVariationCategoryList(('base_contribution/base_amount/payroll/base/contribution/employer',)) cell1.setPrice(4.0) cell1.setQuantity(5.0) @@ -1429,7 +1576,7 @@ class TestPayrollMixin(TestTradeModelLineMixin): base_contribution_list=['base_amount/payroll/base/contribution', 'base_amount/payroll/report/salary/gross'], quantity=10000.0) - + # create the paysheet paysheet = self.createPaysheet() paysheet.edit(specialise_value=model_without_ref, @@ -1443,7 +1590,7 @@ class TestPayrollMixin(TestTradeModelLineMixin): # if no reference, we don't care about dates sub_object_list = paysheet.getInheritedObjectValueList(portal_type_list) - + self.assertEquals(len(paysheet.contentValues(\ portal_type='Pay Sheet Line')), 0) # calculate the pay sheet @@ -1540,7 +1687,7 @@ class TestPayrollMixin(TestTradeModelLineMixin): reference='fabien_model_2009', effective_date=DateTime(2009, 1, 1), expiration_date=DateTime(2009, 06, 30)) - + model_2 = self.getPortalObject().paysheet_model_module.newContent( \ specialise_value=sequence.get('business_process'), portal_type='Pay Sheet Model', @@ -1592,7 +1739,7 @@ class TestPayrollMixin(TestTradeModelLineMixin): # XXX-Aurel Why it is one as the model should not apply since date are not in the range ?? self.assertEquals(len(paysheet.contentValues(\ portal_type='Pay Sheet Line')), 1) - # check values on the paysheet, if it's model_2, the total_price + # check values on the paysheet, if it's model_2, the total_price # should be 30000. # self.assertEquals(paysheet.contentValues()[0].getTotalPrice(), 30000) @@ -2028,7 +2175,7 @@ class TestPayroll(TestPayrollMixin): def test_updateAddMovements(self): ''' - Calculate the paySheet using a model, add a model line in the model + Calculate the paySheet using a model, add a model line in the model and check that updateAggregatedAmount add the movements corresponding to this model_line ''' @@ -2056,7 +2203,7 @@ class TestPayroll(TestPayrollMixin): def test_updateRemoveMovements(self): ''' - Calculate the paySheet using a model, delete a model line in the model + Calculate the paySheet using a model, delete a model line in the model and check that updateAggregatedAmount remove the movements corresponding to this model_line ''' @@ -2210,7 +2357,7 @@ class TestPayroll(TestPayrollMixin): Check predicates can be used on model lines to select a line or not. 1 - employee have married marital status so Sickness Insurance tax should be applied, and Old age insurance should not be - 2 - employee marital status is changed to single. So after re-apply + 2 - employee marital status is changed to single. So after re-apply the transformation, Sickness Insurance tax sould not be applied (and it's movements should be removed) but Old age insurance should be applied (and two movements should be created). @@ -2319,6 +2466,8 @@ class TestPayroll(TestPayrollMixin): variation_base_category_list=('contribution_share',), variation_category_list=('contribution_share/employee', 'contribution_share/employer')) + + business_process = self.createBPMRelated() employer = self.portal.organisation_module.newContent( portal_type='Organisation', title='Employer', @@ -2481,6 +2630,8 @@ class TestPayroll(TestPayrollMixin): 'contribution_share/employer', 'salary_range/france/slice_a', 'salary_range/france/slice_b')) + + business_process = self.createBPMRelated() employer = self.portal.organisation_module.newContent( portal_type='Organisation', title='Employer', @@ -2505,6 +2656,7 @@ class TestPayroll(TestPayrollMixin): ps1 = self.portal.accounting_module.newContent( portal_type='Pay Sheet Transaction', title='Employee 1', + specialise_value=business_process, destination_section_value=employer, source_section_value=employee1, start_date=DateTime(2006, 1, 1),) @@ -2560,6 +2712,7 @@ class TestPayroll(TestPayrollMixin): ps2 = self.portal.accounting_module.newContent( portal_type='Pay Sheet Transaction', title='Employee 2', + specialise_value=business_process, destination_section_value=employer, source_section_value=employee2, start_date=DateTime(2006, 1, 1),) @@ -2702,6 +2855,8 @@ class TestPayroll(TestPayrollMixin): variation_base_category_list=('contribution_share',), variation_category_list=('contribution_share/employee', 'contribution_share/employer')) + + business_process = self.createBPMRelated() employer = self.portal.organisation_module.newContent( portal_type='Organisation', title='Employer', @@ -2730,6 +2885,7 @@ class TestPayroll(TestPayrollMixin): ps1 = self.portal.accounting_module.newContent( portal_type='Pay Sheet Transaction', title='Employee 1', + specialise_value=business_process, destination_section_value=employer, source_section_value=employee1, payment_condition_source_payment_value=employee1_ba, @@ -2770,6 +2926,7 @@ class TestPayroll(TestPayrollMixin): ps2 = self.portal.accounting_module.newContent( portal_type='Pay Sheet Transaction', title='Employee 2', + specialise_value=business_process, destination_section_value=employer, source_section_value=employee2, payment_condition_source_payment_value=employee2_ba, @@ -2841,6 +2998,39 @@ class TestPayroll(TestPayrollMixin): line_list[-1], total_price=3000 + 2000 - (2000 * .5) - (3000 * .5)) + def createBPMRelated(self): + #raise ValueError + business_process = self.createBusinessProcess() + business_link = self.createBusinessLink(business_process) + + + business_process.newContent(portal_type='Trade Model Path', + trade_phase_list=['default/order',], + trade_date='trade_phase/default/order', + reference="path_order", + efficiency=1.0, + ) + business_process.newContent(portal_type='Trade Model Path', + trade_phase_list=['default/delivery',], + trade_date='trade_phase/default/order', + reference="path_delivery", + efficiency=1.0, + ) + business_process.newContent(portal_type='Trade Model Path', + trade_phase_list=['default/invoicing',], + trade_date='trade_phase/default/delivery', + reference="path_invoicing", + efficiency=1.0, + ) + business_process.newContent(portal_type='Trade Model Path', + trade_phase_list=['default/accounting',], + trade_date='trade_phase/default/accounting', + reference="path_accounting", + efficiency=1.0, + ) + return business_process + + def test_AccountingLineGeneration(self): currency_module = self.getCurrencyModule() if not hasattr(currency_module, 'EUR'): @@ -2895,6 +3085,8 @@ class TestPayroll(TestPayrollMixin): title='Payroll Taxes', account_type='liability/payable',) + business_process = self.createBPMRelated() + # create an invoice transaction rule for pay sheets. rule = self.portal.portal_rules.newContent( portal_type='Invoice Transaction Simulation Rule', @@ -3030,6 +3222,7 @@ class TestPayroll(TestPayrollMixin): ps = self.portal.accounting_module.newContent( portal_type='Pay Sheet Transaction', + specialise_value=business_process, price_currency_value=eur, resource_value=eur, title='Employee 1', @@ -3157,7 +3350,7 @@ class TestPayroll(TestPayrollMixin): def test_modelWithoutReferenceValidity(self): ''' Check that if no REFERENCE are defined on a model, the behavior is - that this model is always valid. So check a Pay Sheet Transaction Line + that this model is always valid. So check a Pay Sheet Transaction Line is created after calling the calculation script ''' sequence_list = SequenceList() @@ -3175,7 +3368,7 @@ class TestPayroll(TestPayrollMixin): sequence_list.play(self) def test_modelWithoutDateValidity(self): - """ Check that if no DATE are defined on a model, the behavior is that + """ Check that if no DATE are defined on a model, the behavior is that this model is always valid. (XXX check if it's what we want) So check that a line is created after calling calculation script, even if there is no start_date or stop_date @@ -3214,7 +3407,7 @@ class TestPayroll(TestPayrollMixin): def test_modelVersioning(self): '''check that latest version is used in case of more thant one model is - matching using dates + matching using dates ''' sequence_list = SequenceList() sequence_string = """