From b867e63d8836531b5cf2e3fd0579d74cab6f47f7 Mon Sep 17 00:00:00 2001
From: Fabien Morin <fabien@nexedi.com>
Date: Tue, 17 Mar 2009 12:48:35 +0000
Subject: [PATCH] update the file to check that slices works and we can
 caculate the total amount spend on a slice

git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@26067 20353a03-c40f-0410-a6d1-a30d3c3de9de
---
 product/ERP5/tests/testPayroll_l10n_fr.py | 138 +++++++++++++++++++---
 1 file changed, 119 insertions(+), 19 deletions(-)

diff --git a/product/ERP5/tests/testPayroll_l10n_fr.py b/product/ERP5/tests/testPayroll_l10n_fr.py
index b8c50355a3..00f028d779 100644
--- a/product/ERP5/tests/testPayroll_l10n_fr.py
+++ b/product/ERP5/tests/testPayroll_l10n_fr.py
@@ -26,31 +26,22 @@
 #
 ##############################################################################
 """
-  Tests paysheet creation using paysheet model.
-
-TODO:
-  this test currently just verify that this bt could be installed,
-  test method must be add to verify things specific to this localised bt.
+  test cases related to french localisation (tranche A for example)
 """
 
 from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
 from AccessControl.SecurityManagement import newSecurityManager
 from Acquisition import aq_parent
+from Products.ERP5.tests.testPayroll import TestPayrollMixin
+from DateTime import DateTime
+import transaction
 
-class TestPayroll_l10n_fr(ERP5TypeTestCase):
-
-  run_all_test = 1
-  quiet = 1
+class TestPayroll_l10n_fr(TestPayrollMixin):
 
   def getTitle(self):
     return "Payroll_l10n_fr"
 
-  def afterSetUp(self):
-    """Prepare the test."""
-    self.portal = self.getPortal()
-    self.login()
-
-  def login(self, quiet=0, run=1):
+  def login(self):
     uf = self.getPortal().acl_users
     uf._doAddUser('admin', 'admin', ['Manager', 'Assignee', 'Assignor',
                                'Associate', 'Auditor', 'Author'], [])
@@ -63,16 +54,125 @@ class TestPayroll_l10n_fr(ERP5TypeTestCase):
         'erp5_payroll', 'erp5_payroll_l10n_fr')
 
 
-  def test_01_btInstallation(self, quiet=0, run=run_all_test):
+  def test_01_btInstallation(self):
     '''
       this test must be replace with real test
       it's just here because a test method must be present to launch test
     '''
-    if not run: return
-    if not quiet:
-      self.logMessage('BT Installation')
     pass
 
+  def test_01_getYearToDateSlice(self):
+    '''
+      that slices works and we can caculate the total amount spend on a slice
+
+    '''
+    eur = self.portal.currency_module.EUR
+    model = self.paysheet_model_module.newContent( \
+            portal_type='Pay Sheet Model',
+            variation_settings_category_list=self.variation_settings_category_list)
+    model.setPriceCurrencyValue(eur)
+
+    
+    self.addSlice(model, 'salary_range/%s' % \
+        self.france_settings_slice_a, 0, 1000)
+    self.addSlice(model, 'salary_range/%s' % \
+        self.france_settings_slice_b, 1000, 2000)
+    self.addSlice(model, 'salary_range/%s' % \
+        self.france_settings_slice_c, 2000, 10000000)
+    self.addSlice(model, 'salary_range/%s' % \
+        self.france_settings_forfait, 0, 10000000)
+
+    urssaf_slice_list = [ 'salary_range/'+self.france_settings_slice_a,]
+    urssaf_share_list = [ 'tax_category/'+self.tax_category_employee_share,]
+    salary_slice_list = ['salary_range/'+self.france_settings_forfait,]
+    salary_share_list = ['tax_category/'+self.tax_category_employee_share,]
+    variation_category_list_urssaf = urssaf_share_list + urssaf_slice_list
+    variation_category_list_salary = salary_share_list + salary_slice_list
+
+    model_line_1 = self.createModelLine(model=model,
+        id='model_line_1',
+        variation_category_list=variation_category_list_salary,
+        resource=self.labour,
+        share_list=salary_share_list,
+        slice_list=salary_slice_list,
+        values=[[[10000, None],],],
+        base_application_list=[],
+        base_contribution_list=['base_amount/base_salary',
+          'base_amount/gross_salary'])
+    model_line_1.setIntIndex(1)
+
+    model_line_2 = self.createModelLine(model=model,
+        id='model_line_2',
+        variation_category_list=variation_category_list_urssaf,
+        resource=self.urssaf,
+        share_list=urssaf_share_list,
+        slice_list=urssaf_slice_list,
+        values=[[[None, 0.8]],],
+        source_value=self.payroll_service_organisation,
+        base_application_list=[ 'base_amount/base_salary',],
+        base_contribution_list=['base_amount/net_salary',])
+    model_line_2.setIntIndex(2)
+    
+    model_line_3 = self.createModelLine(model=model,
+        id='model_line_3',
+        variation_category_list=variation_category_list_urssaf,
+        resource=self.urssaf,
+        share_list=urssaf_share_list,
+        slice_list=urssaf_slice_list,
+        values=[[[None, -0.1]],],
+        source_value=self.payroll_service_organisation,
+        base_application_list=[ 'base_amount/net_salary',],
+        base_contribution_list=['base_amount/deductible_tax',])
+    model_line_3.setIntIndex(3)
+
+    # create a paysheet with two lines
+    paysheet = self.portal.accounting_module.newContent(
+                              portal_type='Pay Sheet Transaction',
+                              specialise_value=model,
+                              start_date=DateTime(2009, 07, 1),
+                              stop_date=DateTime(2009, 07, 31))
+    paysheet.PaySheetTransaction_applyModel()
+    self.assertEquals(len(paysheet.contentValues(portal_type='Pay Sheet Line')), 0)
+    # calculate the pay sheet
+    pay_sheet_line_list = self.calculatePaySheet(paysheet=paysheet)
+    self.assertEquals(len(paysheet.contentValues(portal_type='Pay Sheet Line')), 3)
+    # check values on the paysheet
+    line_list = paysheet.contentValues()
+    self.assertEquals(line_list[0].contentValues()[0].getTotalPrice(), 10000)
+    self.assertEquals(line_list[1].contentValues()[0].getTotalPrice(), 8000)
+    self.assertEquals(line_list[2].contentValues()[0].getTotalPrice(), -800)
+    paysheet.stop()
+
+    # create anoter paysheet with two lines
+    paysheet_2 = self.portal.accounting_module.newContent(
+                              portal_type='Pay Sheet Transaction',
+                              specialise_value=model,
+                              start_date=DateTime(2009, 8, 1),
+                              stop_date=DateTime(2009, 8, 31))
+    paysheet_2.PaySheetTransaction_applyModel()
+    self.assertEquals(len(paysheet_2.contentValues(portal_type='Pay Sheet Line')), 0)
+    # calculate the pay sheet
+    pay_sheet_line_list = self.calculatePaySheet(paysheet=paysheet_2)
+    self.assertEquals(len(paysheet.contentValues(portal_type='Pay Sheet Line')), 3)
+    # check values on the paysheet
+    line_list = paysheet_2.contentValues()
+    self.assertEquals(line_list[0].contentValues()[0].getTotalPrice(), 10000)
+    self.assertEquals(line_list[1].contentValues()[0].getTotalPrice(), 8000)
+    self.assertEquals(line_list[2].contentValues()[0].getTotalPrice(), -800)
+    transaction.commit()
+    self.tic()
+
+    # here, check how much is contributed to the slices
+    self.assertEquals(2000, # 1000 from the 1st paysheet + 1000 from the 2e
+        paysheet_2.PaySheetTransaction_getYearToDateSlice(\
+            'salary_range/france/tranche_a'))
+    self.assertEquals(2000, # 1000 from the 1st paysheet + 1000 from the 2e
+        paysheet_2.PaySheetTransaction_getYearToDateSlice(\
+            'salary_range/france/tranche_b'))
+    self.assertEquals(16000, # (10000 - 1000 - 1000)*2
+        paysheet_2.PaySheetTransaction_getYearToDateSlice(\
+            'salary_range/france/tranche_c'))
+
 import unittest
 def test_suite():
   suite = unittest.TestSuite()
-- 
2.30.9