[Erp5-report] r21586 - /erp5/trunk/products/ERP5/tests/testPayroll.py

nobody at svn.erp5.org nobody at svn.erp5.org
Fri Jun 13 16:41:17 CEST 2008


Author: jerome
Date: Fri Jun 13 16:41:16 2008
New Revision: 21586

URL: http://svn.erp5.org?rev=21586&view=rev
Log:
tests that accounting lines are generated from a pay sheet

Modified:
    erp5/trunk/products/ERP5/tests/testPayroll.py

Modified: erp5/trunk/products/ERP5/tests/testPayroll.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/tests/testPayroll.py?rev=21586&r1=21585&r2=21586&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/tests/testPayroll.py (original)
+++ erp5/trunk/products/ERP5/tests/testPayroll.py Fri Jun 13 16:41:16 2008
@@ -173,9 +173,9 @@
                           % (message.object_path, message.method_id) )
     get_transaction().commit()
 
-  def login(self, quiet=0, run=1):
+  def login(self):
     uf = self.getPortal().acl_users
-    uf._doAddUser('admin', 'admin', ['Manager', 'Assignee', 'Assignor',
+    uf._doAddUser('admin', '', ['Manager', 'Assignee', 'Assignor',
                                'Associate', 'Auditor', 'Author'], [])
     user = uf.getUserById('admin').__of__(uf)
     newSecurityManager(None, user)
@@ -224,7 +224,11 @@
             'base_amount/%s' % self.base_amount_base_salary,
             'grade/%s' % self.grade_worker,
             'grade/%s' % self.grade_engineer,
-            'group/demo_group'
+            'quantity_unit/time/mounth',
+            'group/demo_group',
+            'product_line/base_salary',
+            'product_line/payroll_tax_1',
+            'product_line/payroll_tax_2',
            )
 
   def createCurrencies(self):
@@ -253,7 +257,7 @@
   def getBusinessTemplateList(self):
     """ """
     return ('erp5_base', 'erp5_pdm', 'erp5_trade', 'erp5_accounting',
-            'erp5_payroll',)
+            'erp5_invoicing', 'erp5_payroll', )
 
   def createPerson(self, id='one', title='One',
       career_subordination_value=None, career_grade=None, **kw):
@@ -1916,6 +1920,285 @@
                             total=((2000 * .50 + 3500 * .20) +
                                    (2000 * .40 + 3500 * .32)))
 
+  def test_AccountingLineGeneration(self):
+    # create payroll services
+    base_salary = self.portal.payroll_service_module.newContent(
+                          portal_type='Payroll Service',
+                          title='Base Salary',
+                          product_line='base_salary',
+                          variation_base_category_list=('tax_category',),
+                          variation_category_list=('tax_category/employee_share',
+                                                   'tax_category/employer_share'))
+    bonus = self.portal.payroll_service_module.newContent(
+                          portal_type='Payroll Service',
+                          title='Bonus',
+                          product_line='base_salary',
+                          variation_base_category_list=('tax_category',),
+                          variation_category_list=('tax_category/employee_share',
+                                                   'tax_category/employer_share'))
+    deductions = self.portal.payroll_service_module.newContent(
+                          portal_type='Payroll Service',
+                          title='Deductions',
+                          product_line='base_salary',
+                          variation_base_category_list=('tax_category',),
+                          variation_category_list=('tax_category/employee_share',
+                                                   'tax_category/employer_share'))
+    tax1 = self.portal.payroll_service_module.newContent(
+                          portal_type='Payroll Service',
+                          title='Tax1',
+                          product_line='payroll_tax_1',
+                          variation_base_category_list=('tax_category',),
+                          variation_category_list=('tax_category/employee_share',
+                                                   'tax_category/employer_share'))
+
+    # create accounts
+    account_payroll_wages_expense = self.portal.account_module.newContent(
+                          portal_type='Account',
+                          title='Payroll Wages (expense)',
+                          account_type='expense',)
+    account_payroll_taxes_expense = self.portal.account_module.newContent(
+                          portal_type='Account',
+                          title='Payroll Taxes (expense)',
+                          account_type='expense',)
+    account_net_wages = self.portal.account_module.newContent(
+                          portal_type='Account',
+                          title='Net Wages',
+                          account_type='liability/payable',)
+    account_payroll_taxes = self.portal.account_module.newContent(
+                          portal_type='Account',
+                          title='Payroll Taxes',
+                          account_type='liability/payable',)
+
+    # create an invoice transaction rule for pay sheets.
+    rule = self.portal.portal_rules.newContent(
+                          portal_type='Invoice Transaction Rule',
+                          title='Rule for PaySheet Accounting',
+                          reference='paysheet_transaction_rule',
+                          test_method_id=
+                              'SimulationMovement_testInvoiceTransactionRule')
+    rule.newContent(portal_type='Predicate',
+                    title='Employee Share',
+                    string_index='tax_category',
+                    int_index=1,
+                    membership_criterion_base_category_list=('tax_category',),
+                    membership_criterion_category_list=('tax_category/employee_share',))
+    rule.newContent(portal_type='Predicate',
+                    title='Employer Share',
+                    string_index='tax_category',
+                    int_index=2,
+                    membership_criterion_base_category_list=('tax_category',),
+                    membership_criterion_category_list=('tax_category/employer_share',))
+
+    rule.newContent(portal_type='Predicate',
+                    title='Base Salary',
+                    string_index='payroll_service',
+                    int_index=1,
+                    membership_criterion_base_category_list=('product_line',),
+                    membership_criterion_category_list=('product_line/base_salary',))
+    rule.newContent(portal_type='Predicate',
+                    title='Payroll Tax 1',
+                    string_index='payroll_service',
+                    int_index=2,
+                    membership_criterion_base_category_list=('product_line',),
+                    membership_criterion_category_list=('product_line/payroll_tax_1',))
+
+    get_transaction().commit()
+    self.tic()
+
+    cell_list = rule.contentValues(portal_type='Accounting Rule Cell')
+    self.assertEquals(4, len(cell_list))
+
+    employee_base_salary = rule._getOb('movement_0_0')
+    self.assertEquals('Employee Share * Base Salary',
+                      employee_base_salary.getTitle())
+    employee_base_salary.newContent(
+                      portal_type='Accounting Rule Cell Line',
+                      destination_debit=1,
+                      destination_value=account_payroll_wages_expense)
+    employee_base_salary.newContent(
+                      portal_type='Accounting Rule Cell Line',
+                      destination_credit=1,
+                      destination_value=account_net_wages)
+
+    employer_tax = rule._getOb('movement_1_1')
+    self.assertEquals('Employer Share * Payroll Tax 1',
+                      employer_tax.getTitle())
+    employer_tax.newContent(
+                      portal_type='Accounting Rule Cell Line',
+                      destination_debit=1,
+                      destination_value=account_payroll_taxes)
+    employer_tax.newContent(
+                      portal_type='Accounting Rule Cell Line',
+                      destination_credit=1,
+                      destination_value=account_payroll_taxes_expense)
+
+    employee_tax = rule._getOb('movement_0_1')
+    self.assertEquals('Employee Share * Payroll Tax 1',
+                      employee_tax.getTitle())
+    employee_tax.newContent(
+                      portal_type='Accounting Rule Cell Line',
+                      destination_debit=1,
+                      destination_value=account_payroll_taxes)
+    employee_tax.newContent(
+                      portal_type='Accounting Rule Cell Line',
+                      destination_credit=1,
+                      generate_prevision_script_id=\
+      'SimulationMovement_generatePrevisionForEmployeeSharePaySheetMovement',
+                      destination_value=account_net_wages)
+    rule.validate()
+
+    # create a pay sheet
+    eur = self.portal.currency_module.EUR
+    employer = self.portal.organisation_module.newContent(
+                      portal_type='Organisation',
+                      title='Employer',
+                      price_currency_value=eur,
+                      group_value=self.portal.portal_categories.group.demo_group)
+    employee = self.portal.person_module.newContent(
+                      portal_type='Person',
+                      title='Employee',
+                      career_reference='E1',
+                      career_subordination_value=employer)
+    provider = self.portal.organisation_module.newContent(
+                      portal_type='Organisation',
+                      title='Payroll Service Provider')
+
+    ps = self.portal.accounting_module.newContent(
+                      portal_type='Pay Sheet Transaction',
+                      price_currency_value=eur,
+                      resource_value=eur,
+                      title='Employee 1',
+                      destination_section_value=employer,
+                      source_section_value=employee,
+                      start_date=DateTime(2006, 1, 1),)
+    
+    # base salary = 2000
+    line = ps.newContent(portal_type='Pay Sheet Line',
+                   title='Base salary',
+                   resource_value=base_salary,
+                   destination_value=employee,
+                   variation_category_list=('tax_category/employee_share',
+                                            'tax_category/employer_share'))
+    line.updateCellRange(base_id='movement')
+    cell_employee = line.newCell('tax_category/employee_share',
+                                portal_type='Pay Sheet Cell',
+                                base_id='movement',
+                                mapped_value_property_list=('price',
+                                                            'quantity'),)
+    cell_employee.edit(price=1, quantity=2000, tax_category='employee_share')
+    cell_employer = line.newCell('tax_category/employer_share',
+                                portal_type='Pay Sheet Cell',
+                                base_id='movement',
+                                mapped_value_property_list=('price',
+                                                            'quantity'),)
+    cell_employer.edit(price=1, quantity=2000, tax_category='employer_share')
+    
+    # base_salary += 100 (bonus)
+    line = ps.newContent(portal_type='Pay Sheet Line',
+                   title='Bonus',
+                   resource_value=bonus,
+                   destination_value=employee,
+                   variation_category_list=('tax_category/employee_share',
+                                            'tax_category/employer_share'))
+    line.updateCellRange(base_id='movement')
+    cell_employee = line.newCell('tax_category/employee_share',
+                                portal_type='Pay Sheet Cell',
+                                base_id='movement',
+                                mapped_value_property_list=('price',
+                                                            'quantity'),)
+    cell_employee.edit(price=1, quantity=100, tax_category='employee_share')
+    cell_employer = line.newCell('tax_category/employer_share',
+                                portal_type='Pay Sheet Cell',
+                                base_id='movement',
+                                mapped_value_property_list=('price',
+                                                            'quantity'),)
+    cell_employer.edit(price=1, quantity=100, tax_category='employer_share')
+
+    # base_salary -= 50 (deductions)   => base_salary == 2050
+    line = ps.newContent(portal_type='Pay Sheet Line',
+                   title='Deduction',
+                   resource_value=deductions,
+                   destination_value=employee,
+                   variation_category_list=('tax_category/employee_share',
+                                            'tax_category/employer_share'))
+    line.updateCellRange(base_id='movement')
+    cell_employee = line.newCell('tax_category/employee_share',
+                                portal_type='Pay Sheet Cell',
+                                base_id='movement',
+                                mapped_value_property_list=('price',
+                                                            'quantity'),)
+    cell_employee.edit(price=-1, quantity=50, tax_category='employee_share')
+    cell_employer = line.newCell('tax_category/employer_share',
+                                portal_type='Pay Sheet Cell',
+                                base_id='movement',
+                                mapped_value_property_list=('price',
+                                                            'quantity'),)
+    cell_employer.edit(price=-1, quantity=50, tax_category='employer_share')
+
+    # tax1 = 10% for employee ( 205 ) 
+    #        20% for employer ( 410 )
+    line = ps.newContent(portal_type='Pay Sheet Line',
+                   title='Tax 1',
+                   resource_value=tax1,
+                   source_section_value=provider,
+                   destination_value=employee,
+                   variation_category_list=('tax_category/employee_share',
+                                            'tax_category/employer_share'))
+    line.updateCellRange(base_id='movement')
+    cell_employee = line.newCell('tax_category/employee_share',
+                                portal_type='Pay Sheet Cell',
+                                base_id='movement',
+                                mapped_value_property_list=('price',
+                                                            'quantity'),)
+    cell_employee.edit(price=-.1, quantity=2050, tax_category='employee_share')
+    cell_employer = line.newCell('tax_category/employer_share',
+                                portal_type='Pay Sheet Cell',
+                                base_id='movement',
+                                mapped_value_property_list=('price',
+                                                            'quantity'),)
+    cell_employer.edit(price=-.2, quantity=2050, tax_category='employer_share')
+
+    ps.plan()
+
+    get_transaction().commit()
+    self.tic()
+    
+    related_applied_rule = ps.getCausalityRelatedValue(
+                                portal_type='Applied Rule')
+    self.assertNotEquals(related_applied_rule, None)
+    
+    # build accounting lines
+    ps.confirm()
+    ps.start()
+    get_transaction().commit()
+    self.tic()
+
+    accounting_line_list = ps.contentValues(
+        portal_type='Pay Sheet Transaction Line')
+    self.assertEquals(len(accounting_line_list), 4)
+    
+    line = [l for l in accounting_line_list
+            if l.getDestinationValue() == account_payroll_wages_expense][0]
+    self.assertEquals(2050, line.getDestinationDebit())
+    self.assertEquals(employer, line.getDestinationSectionValue())
+
+    line = [l for l in accounting_line_list
+            if l.getDestinationValue() == account_net_wages][0]
+    self.assertEquals(2050 - 205, line.getDestinationCredit())
+    self.assertEquals(employer, line.getDestinationSectionValue())
+    self.assertEquals(employee, line.getSourceSectionValue())
+    
+    line = [l for l in accounting_line_list
+            if l.getDestinationValue() == account_payroll_taxes_expense][0]
+    self.assertEquals(410, line.getDestinationDebit())
+    self.assertEquals(employer, line.getDestinationSectionValue())
+
+    line = [l for l in accounting_line_list
+            if l.getDestinationValue() == account_payroll_taxes][0]
+    self.assertEquals(410 + 205, line.getDestinationCredit())
+    self.assertEquals(employer, line.getDestinationSectionValue())
+    self.assertEquals(provider, line.getSourceSectionValue())
+    
 
 import unittest
 def test_suite():




More information about the Erp5-report mailing list