[Erp5-report] r6755 - /erp5/trunk/bt5/erp5_payroll/SkinTemplateItem/portal_skins/erp5_payroll/
nobody at svn.erp5.org
nobody at svn.erp5.org
Sat Apr 15 00:22:53 CEST 2006
Author: kevin
Date: Sat Apr 15 00:22:51 2006
New Revision: 6755
URL: http://svn.erp5.org?rev=6755&view=rev
Log:
Support localised paysheet calculation (very simple mecanism, must be extended)
Added:
erp5/trunk/bt5/erp5_payroll/SkinTemplateItem/portal_skins/erp5_payroll/PaySheetTransaction_preCalculation_l10n_fr_2005.xml
erp5/trunk/bt5/erp5_payroll/SkinTemplateItem/portal_skins/erp5_payroll/PaySheetTransaction_preCalculation_l10n_fr_2006.xml
Modified:
erp5/trunk/bt5/erp5_payroll/SkinTemplateItem/portal_skins/erp5_payroll/PaySheetTransaction_preCalculation.xml
Modified: erp5/trunk/bt5/erp5_payroll/SkinTemplateItem/portal_skins/erp5_payroll/PaySheetTransaction_preCalculation.xml
URL: http://svn.erp5.org/erp5/trunk/bt5/erp5_payroll/SkinTemplateItem/portal_skins/erp5_payroll/PaySheetTransaction_preCalculation.xml?rev=6755&r1=6754&r2=6755&view=diff
==============================================================================
--- erp5/trunk/bt5/erp5_payroll/SkinTemplateItem/portal_skins/erp5_payroll/PaySheetTransaction_preCalculation.xml (original)
+++ erp5/trunk/bt5/erp5_payroll/SkinTemplateItem/portal_skins/erp5_payroll/PaySheetTransaction_preCalculation.xml Sat Apr 15 00:22:51 2006
@@ -66,411 +66,21 @@
</item>
<item>
<key> <string>_body</string> </key>
- <value> <string encoding="cdata"><![CDATA[
-
-True = 1\n
-False = 0\n
+ <value> <string># This script must select the right localized version of PaySheetTransaction_preCalculation\n
+# depending of given parameters.\n
\n
-global paysheet\n
-paysheet = context.getObject()\n
-paysheet_type = paysheet.getPortalType()\n
+# Force which script to use manually.\n
+country = \'fr\'\n
+year = \'2006\'\n
\n
-employee = paysheet.getDestinationSection()\n
-employee_object = paysheet.getDestinationSectionValue()\n
-employer = paysheet.getSourceSection()\n
-employer_object = paysheet.getSourceSectionValue()\n
+script_name = \'_\'.join([ "PaySheetTransaction_preCalculation_l10n"\n
+ , country\n
+ , year\n
+ ])\n
+calculation_method = getattr(context, script_name)\n
\n
-\n
-gross_salary = abs(paysheet.getGrossSalary())\n
-\n
-# each year, look at http://www.urssaf.fr to complete the table\n
-ceiling_salary_list = { 2003 : 2432.0\n
- , 2004 : 2476.0\n
- , 2005 : 2516.0\n
- }\n
-# the default ceiling salary is the last one\n
-paysheet_year = paysheet.getStartDate().year()\n
-ceiling_salary_available_years = ceiling_salary_list.keys()\n
-if paysheet_year not in ceiling_salary_available_years:\n
- paysheet_year = ceiling_salary_available_years[-1]\n
-ceiling_salary = ceiling_salary_list[paysheet_year]\n
-\n
-# limited salary = salaire plafonn\xc3\xa9\n
-if gross_salary < ceiling_salary:\n
- limited_salary = gross_salary\n
-else:\n
- limited_salary = ceiling_salary\n
-\n
-# check if the employee is executive or not\n
-if employee_object.getCareerGrade().split(\'/\')[-1] in (\'engineer\'):\n
- executive = True\n
-else:\n
- executive = False\n
-\n
-company_birth = employer_object.getCreationDate()\n
-\n
-employer_region = employer_object.getDefaultAddress().getZipCode()[:2]\n
-\n
-# get the number of person which are employed by the company ,\n
-# sub_list = employer_object.getSubordinationRelatedValueList()\n
-# company_size = 0\n
-# for person in sub_list:\n
-# if person.getPortalType() == \'Person\': # add condition: if current role == internal and defaultCareerEnd and defaultCareerStart fit in the current year\n
-# #print repr(person) + repr(person.getTitle())\n
-# company_size += 1\n
-#\n
-# print repr(company_size)\n
-#\n
-# return printed\n
-\n
-company_size = 3\n
-\n
-\n
-# "Char" slice type\n
-slice_a_value = ceiling_salary\n
-slice_b_value = ceiling_salary * 4\n
-slice_c_value = ceiling_salary * 8\n
-char_slices = {}\n
-if gross_salary < slice_a_value:\n
- char_slices[\'A\'] = gross_salary\n
-else:\n
- char_slices[\'A\'] = slice_a_value\n
- if gross_salary < slice_b_value:\n
- char_slices[\'B\'] = float(gross_salary) - float(slice_a_value)\n
- else:\n
- char_slices[\'B\'] = slice_b_value\n
- if gross_salary < slice_c_value:\n
- char_slices[\'C\'] = float(gross_salary) - float(slice_b_value)\n
- else:\n
- char_slices[\'C\'] = slice_c_value\n
-\n
-# "Number" slice type\n
-slice_1_value = ceiling_salary\n
-slice_2_value = ceiling_salary * 3\n
-num_slices = {}\n
-if gross_salary < slice_1_value:\n
- char_slices[\'1\'] = gross_salary\n
-else:\n
- char_slices[\'1\'] = slice_1_value\n
- if gross_salary < slice_2_value:\n
- char_slices[\'2\'] = gross_salary - slice_1_value\n
- else:\n
- char_slices[\'2\'] = slice_2_value\n
-\n
-# age-slice of the company\n
-old_limit = DateTime(1997, 1, 1)\n
-if company_birth < old_limit:\n
- comp_type = \'old\'\n
-else:\n
- comp_type = \'new\'\n
-\n
-\n
-#################\n
-# This script will fill the PaySheetTransaction_preview with default values for base salary calculation, employer and employee share\n
-#################\n
-\n
-default = {}\n
-# initialize all variables to None\n
-paysheet_services = []\n
-erp5site = context.portal_url.getPortalObject()\n
-# during 06/2005 service module has been renamed service_module\n
-# both names are supported\n
-if hasattr(erp5site, \'service_module\') : \n
- service_module = erp5site.service_module\n
-else : \n
- service_module = erp5site.service\n
-for service in service_module.searchFolder( portal_type = \'Service\', product_line_id=\'payroll\') :\n
- service = service.getObject()\n
- base_cat = service.getVariationRangeBaseCategoryList()\n
- if \'tax_category\' in base_cat and \'salary_range\' in base_cat:\n
- paysheet_services.append(service)\n
-for serv in paysheet_services:\n
- cat_list = serv.getCategoryList()\n
- tax_cat = []\n
- range_cat = []\n
- for cat in cat_list:\n
- if str(cat).find(\'tax_category\') != -1:\n
- tax_cat.append(cat)\n
- if str(cat).find(\'salary_range\') != -1:\n
- range_cat.append(cat)\n
- for base in range_cat:\n
- new_name = serv.getId() + \'/\' + context.portal_categories.resolveCategory(base).getId()\n
- default[new_name] = {\'employer_rate\':None,\'employee_rate\':None,\'base\':None}\n
-\n
-# sickness insurance\n
-if employer_region in (\'57\', \'67\', \'68\'):\n
- er = 1.70\n
-else:\n
- er = 0.75\n
-default[\'sickness_insurance/salaire_brut\'] = \\\n
-{ \'employer_rate\' : 12.80\n
-, \'employee_rate\' : er\n
-, \'base\' : gross_salary\n
-}\n
-\n
-# old-age insurance\n
-default[\'oldage_insurance/salaire_brut\'] = \\\n
-{ \'employer_rate\' : 1.60\n
-, \'employee_rate\' : None\n
-, \'base\' : gross_salary\n
-}\n
-default[\'oldage_insurance/salaire_plafonne\'] = \\\n
-{ \'employer_rate\' : 8.20\n
-, \'employee_rate\' : 6.55\n
-, \'base\' : limited_salary\n
-}\n
-\n
-# widowhood insurance\n
-default[\'widowhood_insurance/salaire_brut\'] = \\\n
-{ \'employer_rate\' : None\n
-, \'employee_rate\' : 0.10\n
-, \'base\' : gross_salary\n
-}\n
-\n
-# family benefits\n
-default[\'family_benefits/salaire_brut\'] = \\\n
-{ \'employer_rate\' : 5.40\n
-, \'employee_rate\' : None\n
-, \'base\' : gross_salary\n
-}\n
-\n
-# industrial accident\n
-# industrial_accident_rate is a parameter of this script, because rate depending of company size, department & trade (1.10 is for Nexedi, 1.0 is the default value)\n
-if industrial_accident_rate in (\'\', 0, None):\n
- industrial_accident_rate = 1.0\n
-default[\'industrial_accident/salaire_brut\'] = \\\n
-{ \'employer_rate\' : industrial_accident_rate\n
-, \'employee_rate\' : None\n
-, \'base\' : gross_salary\n
-}\n
-\n
-# lodging helps\n
-if company_size > 9:\n
- default[\'lodging_helps/salaire_brut\'] = \\\n
- { \'employer_rate\' : 0.40\n
- , \'employee_rate\' : None\n
- , \'base\' : gross_salary\n
- }\n
-else:\n
- default[\'lodging_helps/salaire_plafonne\'] = \\\n
- { \'employer_rate\' : 0.10\n
- , \'employee_rate\' : None\n
- , \'base\' : limited_salary\n
- }\n
-\n
-# transport payment\n
-# TODO: rate depending of the town, 1.80 is the \'default\' value (when the town isn\'t referenced by laws)\n
-if transport_payment_rate in (\'\', 0, None):\n
- transport_payment_rate = 1.80\n
-if company_size > 9:\n
- default[\'transport_payment/salaire_brut\'] = \\\n
- { \'employer_rate\' : transport_payment_rate\n
- , \'employee_rate\' : None\n
- , \'base\' : gross_salary\n
- }\n
-\n
-# CSG\n
-default[\'csg_deductible/salaire_brut_csg\'] = \\\n
-{ \'employer_rate\' : None\n
-, \'employee_rate\' : 5.10\n
-, \'base\' : 0.95 * gross_salary\n
-}\n
-default[\'csg_non_deductible/salaire_brut_csg\'] = \\\n
-{ \'employer_rate\' : None\n
-, \'employee_rate\' : 2.4\n
-, \'base\' : 0.95 * gross_salary\n
-}\n
-\n
-# CRDS\n
-default[\'crds/salaire_brut_crds\'] = \\\n
-{ \'employer_rate\' : None\n
-, \'employee_rate\' : 0.50\n
-, \'base\' : 0.95 * gross_salary\n
-}\n
-\n
-# unemployment insurance\n
-if char_slices.has_key(\'A\'):\n
- default[\'unemployment_insurance/tranche_a\'] = \\\n
- { \'employer_rate\' : 4.0\n
- , \'employee_rate\' : 2.4\n
- , \'base\' : char_slices[\'A\']\n
- }\n
-if char_slices.has_key(\'B\'):\n
- default[\'unemployment_insurance/tranche_b\'] = \\\n
- { \'employer_rate\' : 4.0\n
- , \'employee_rate\' : 2.4\n
- , \'base\' : char_slices[\'B\']\n
- }\n
-\n
-# AGS\n
-# ags_rate is a parameter of this script, 0.35% was the default value, now it\'s 0.45%\n
-if ags_rate in (\'\', 0, None):\n
- ags_rate = 0.45\n
-if char_slices.has_key(\'A\'):\n
- default[\'ags/tranche_a\'] = \\\n
- { \'employer_rate\' : ags_rate\n
- , \'employee_rate\' : None\n
- , \'base\' : char_slices[\'A\']\n
- }\n
-if char_slices.has_key(\'B\'):\n
- default[\'ags/tranche_b\'] = \\\n
- { \'employer_rate\' : ags_rate\n
- , \'employee_rate\' : None\n
- , \'base\' : char_slices[\'B\']\n
- }\n
-\n
-# ARRCO\n
-if executive == False:\n
- if num_slices.has_key(\'1\'):\n
- default[\'arrco/tranche_1\'] = \\\n
- { \'employer_rate\' : 4.5\n
- , \'employee_rate\' : 3.0\n
- , \'base\' : num_slices[\'1\']\n
- }\n
- if num_slices.has_key(\'2\'):\n
- if comp_type == \'old\':\n
- employee_share_rate = 6.0\n
- employer_share_rate = 9.0\n
- else:\n
- employee_share_rate = 8.0\n
- employer_share_rate = 12.0\n
-\n
- default[\'arrco/tranche_2\'] = \\\n
- { \'employer_rate\' : employer_share_rate\n
- , \'employee_rate\' : employee_share_rate\n
- , \'base\' : num_slices[\'2\']\n
- }\n
-elif char_slices.has_key(\'A\'):\n
- default[\'arrco/tranche_a\'] = \\\n
- { \'employer_rate\' : 4.5\n
- , \'employee_rate\' : 3.0\n
- , \'base\' : char_slices[\'A\']\n
- }\n
-\n
-# AGFF\n
-if executive == True:\n
- if char_slices.has_key(\'A\'):\n
- default[\'agff/tranche_a\'] = \\\n
- { \'employer_rate\' : 1.20\n
- , \'employee_rate\' : 0.80\n
- , \'base\' : char_slices[\'A\']\n
- }\n
- if char_slices.has_key(\'B\'):\n
- default[\'agff/tranche_b\'] = \\\n
- { \'employer_rate\' : 1.30\n
- , \'employee_rate\' : 0.90\n
- , \'base\' : char_slices[\'B\']\n
- }\n
-else:\n
- if num_slices.has_key(\'1\'):\n
- default[\'agff/tranche_1\'] = \\\n
- { \'employer_rate\' : 1.20\n
- , \'employee_rate\' : 0.80\n
- , \'base\' : num_slices[\'1\']\n
- }\n
- if num_slices.has_key(\'2\'):\n
- default[\'agff/tranche_2\'] = \\\n
- { \'employer_rate\' : 1.30\n
- , \'employee_rate\' : 0.90\n
- , \'base\' : num_slices[\'2\']\n
- }\n
-\n
-# AGIRC\n
-# TODO: fix the repartition of share rate in case of slice C\n
-if executive == True:\n
- if char_slices.has_key(\'B\'):\n
- default[\'agirc/tranche_b\'] = \\\n
- { \'employer_rate\' : 12.50\n
- , \'employee_rate\' : 7.50\n
- , \'base\' : char_slices[\'B\']\n
- }\n
- if char_slices.has_key(\'C\'):\n
- # free repartition (20% to share between employee & employer)\n
- default[\'agirc/tranche_c\'] = \\\n
- { \'employer_rate\' : 10.00\n
- , \'employee_rate\' : 10.00\n
- , \'base\' : char_slices[\'C\']\n
- }\n
-\n
-# CET\n
-if executive == True:\n
- if char_slices.has_key(\'A\'):\n
- default[\'cet/tranche_a\'] = \\\n
- { \'employer_rate\' : 0.22\n
- , \'employee_rate\' : 0.13\n
- , \'base\' : char_slices[\'A\']\n
- }\n
- if char_slices.has_key(\'B\'):\n
- default[\'cet/tranche_b\'] = \\\n
- { \'employer_rate\' : 0.22\n
- , \'employee_rate\' : 0.13\n
- , \'base\' : char_slices[\'B\']\n
- }\n
- if char_slices.has_key(\'C\'):\n
- default[\'cet/tranche_c\'] = \\\n
- { \'employer_rate\' : 0.22\n
- , \'employee_rate\' : 0.13\n
- , \'base\' : char_slices[\'C\']\n
- }\n
-\n
-# life insurance\n
-if executive == True and char_slices.has_key(\'A\'):\n
- default[\'life_insurance/tranche_a\'] = \\\n
- { \'employer_rate\' : 1.5\n
- , \'employee_rate\' : None\n
- , \'base\' : char_slices[\'A\']\n
- }\n
-\n
-# APEC\n
-if char_slices.has_key(\'B\'):\n
- default[\'apec/tranche_b\'] = \\\n
- { \'employer_rate\' : 0.036\n
- , \'employee_rate\' : 0.024\n
- , \'base\' : char_slices[\'B\']\n
- }\n
-\n
-# construction tax\n
-if company_size > 9:\n
- default[\'construction_tax/salaire_brut\'] = \\\n
- { \'employer_rate\' : 0.45\n
- , \'employee_rate\' : None\n
- , \'base\' : gross_salary\n
- }\n
-\n
-# training tax\n
-default[\'training_tax/salaire_brut\'] = \\\n
-{ \'employer_rate\' : 0.50\n
-, \'employee_rate\' : None\n
-, \'base\' : gross_salary\n
-}\n
-\n
-# courses tax\n
-if company_size < 10:\n
- rate = 0.15\n
-else:\n
- rate = 1.5\n
-default[\'courses_tax/salaire_brut\'] = \\\n
-{ \'employer_rate\' : rate\n
-, \'employee_rate\' : None\n
-, \'base\' : gross_salary\n
-}\n
-\n
-# Syntec convention\n
-if \'syntec\' in employee_object.getCareerCollectiveAgreementTitle().lower():\n
- # set the syntec rate according to the employee marital status\n
- syntec_rate = 0.915\n
- if employee_object.getMaritalStatusId() == \'married\':\n
- syntec_rate *= 2\n
- default[\'syntec_insurance/salaire_plafonne_syntec\'] = \\\n
- { \'employer_rate\' : syntec_rate\n
- , \'employee_rate\' : syntec_rate\n
- , \'base\' : ceiling_salary\n
- }\n
-\n
-return default\n
-
-
-]]></string> </value>
+return calculation_method(**kw)\n
+</string> </value>
</item>
<item>
<key> <string>_code</string> </key>
@@ -483,8 +93,14 @@
<value> <string>Script (Python):/nexedi/portal_skins/erp5_payroll/PaySheetTransaction_preCalculation</string> </value>
</item>
<item>
+ <key> <string>_owner</string> </key>
+ <value>
+ <none/>
+ </value>
+ </item>
+ <item>
<key> <string>_params</string> </key>
- <value> <string>ags_rate=None, industrial_accident_rate=None, transport_payment_rate=None</string> </value>
+ <value> <string>**kw</string> </value>
</item>
<item>
<key> <string>errors</string> </key>
@@ -504,71 +120,21 @@
<dictionary>
<item>
<key> <string>co_argcount</string> </key>
- <value> <int>3</int> </value>
+ <value> <int>0</int> </value>
</item>
<item>
<key> <string>co_varnames</string> </key>
<value>
<tuple>
- <string>ags_rate</string>
- <string>industrial_accident_rate</string>
- <string>transport_payment_rate</string>
- <string>True</string>
- <string>False</string>
+ <string>kw</string>
+ <string>country</string>
+ <string>year</string>
<string>_getattr_</string>
+ <string>script_name</string>
+ <string>getattr</string>
<string>context</string>
- <string>paysheet</string>
- <string>paysheet_type</string>
- <string>employee</string>
- <string>employee_object</string>
- <string>employer</string>
- <string>employer_object</string>
- <string>abs</string>
- <string>gross_salary</string>
- <string>ceiling_salary_list</string>
- <string>paysheet_year</string>
- <string>ceiling_salary_available_years</string>
- <string>_getitem_</string>
- <string>ceiling_salary</string>
- <string>limited_salary</string>
- <string>executive</string>
- <string>company_birth</string>
- <string>employer_region</string>
- <string>company_size</string>
- <string>slice_a_value</string>
- <string>slice_b_value</string>
- <string>slice_c_value</string>
- <string>char_slices</string>
- <string>_write_</string>
- <string>float</string>
- <string>slice_1_value</string>
- <string>slice_2_value</string>
- <string>num_slices</string>
- <string>DateTime</string>
- <string>old_limit</string>
- <string>comp_type</string>
- <string>default</string>
- <string>paysheet_services</string>
- <string>erp5site</string>
- <string>hasattr</string>
- <string>service_module</string>
- <string>_getiter_</string>
- <string>service</string>
- <string>base_cat</string>
- <string>serv</string>
- <string>cat_list</string>
- <string>tax_cat</string>
- <string>range_cat</string>
- <string>cat</string>
- <string>str</string>
- <string>base</string>
- <string>new_name</string>
- <string>None</string>
- <string>er</string>
- <string>employee_share_rate</string>
- <string>employer_share_rate</string>
- <string>rate</string>
- <string>syntec_rate</string>
+ <string>calculation_method</string>
+ <string>_apply_</string>
</tuple>
</value>
</item>
@@ -580,11 +146,7 @@
<item>
<key> <string>func_defaults</string> </key>
<value>
- <tuple>
- <none/>
- <none/>
- <none/>
- </tuple>
+ <none/>
</value>
</item>
<item>
Added: erp5/trunk/bt5/erp5_payroll/SkinTemplateItem/portal_skins/erp5_payroll/PaySheetTransaction_preCalculation_l10n_fr_2005.xml
URL: http://svn.erp5.org/erp5/trunk/bt5/erp5_payroll/SkinTemplateItem/portal_skins/erp5_payroll/PaySheetTransaction_preCalculation_l10n_fr_2005.xml?rev=6755&view=auto
==============================================================================
--- erp5/trunk/bt5/erp5_payroll/SkinTemplateItem/portal_skins/erp5_payroll/PaySheetTransaction_preCalculation_l10n_fr_2005.xml (added)
+++ erp5/trunk/bt5/erp5_payroll/SkinTemplateItem/portal_skins/erp5_payroll/PaySheetTransaction_preCalculation_l10n_fr_2005.xml Sat Apr 15 00:22:51 2006
@@ -1,0 +1,650 @@
+<?xml version="1.0"?>
+<ZopeData>
+ <record id="1" aka="AAAAAAAAAAE=">
+ <pickle>
+ <tuple>
+ <tuple>
+ <string>Products.PythonScripts.PythonScript</string>
+ <string>PythonScript</string>
+ </tuple>
+ <none/>
+ </tuple>
+ </pickle>
+ <pickle>
+ <dictionary>
+ <item>
+ <key> <string>Python_magic</string> </key>
+ <value> <string encoding="base64">O/INCg==</string> </value>
+ </item>
+ <item>
+ <key> <string>Script_magic</string> </key>
+ <value> <int>3</int> </value>
+ </item>
+ <item>
+ <key> <string>__ac_local_roles__</string> </key>
+ <value>
+ <none/>
+ </value>
+ </item>
+ <item>
+ <key> <string>_bind_names</string> </key>
+ <value>
+ <object>
+ <klass>
+ <global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
+ </klass>
+ <tuple/>
+ <state>
+ <dictionary>
+ <item>
+ <key> <string>_asgns</string> </key>
+ <value>
+ <dictionary>
+ <item>
+ <key> <string>name_container</string> </key>
+ <value> <string>container</string> </value>
+ </item>
+ <item>
+ <key> <string>name_context</string> </key>
+ <value> <string>context</string> </value>
+ </item>
+ <item>
+ <key> <string>name_m_self</string> </key>
+ <value> <string>script</string> </value>
+ </item>
+ <item>
+ <key> <string>name_subpath</string> </key>
+ <value> <string>traverse_subpath</string> </value>
+ </item>
+ </dictionary>
+ </value>
+ </item>
+ </dictionary>
+ </state>
+ </object>
+ </value>
+ </item>
+ <item>
+ <key> <string>_body</string> </key>
+ <value> <string encoding="cdata"><![CDATA[
+
+True = 1\n
+False = 0\n
+\n
+global paysheet\n
+paysheet = context.getObject()\n
+paysheet_type = paysheet.getPortalType()\n
+\n
+employee = paysheet.getDestinationSection()\n
+employee_object = paysheet.getDestinationSectionValue()\n
+employer = paysheet.getSourceSection()\n
+employer_object = paysheet.getSourceSectionValue()\n
+\n
+\n
+gross_salary = abs(paysheet.getGrossSalary())\n
+\n
+# each year, look at http://www.urssaf.fr to complete the table\n
+ceiling_salary_list = { 2003 : 2432.0\n
+ , 2004 : 2476.0\n
+ , 2005 : 2516.0\n
+ , 2006 : 2589.0\n
+ }\n
+# the default ceiling salary is the last one\n
+paysheet_year = paysheet.getStartDate().year()\n
+ceiling_salary_available_years = ceiling_salary_list.keys()\n
+if paysheet_year not in ceiling_salary_available_years:\n
+ paysheet_year = ceiling_salary_available_years[-1]\n
+ceiling_salary = ceiling_salary_list[paysheet_year]\n
+\n
+# limited salary = salaire plafonn\xc3\xa9\n
+if gross_salary < ceiling_salary:\n
+ limited_salary = gross_salary\n
+else:\n
+ limited_salary = ceiling_salary\n
+\n
+# check if the employee is executive or not\n
+if employee_object.getCareerGrade().split(\'/\')[-1:][0] in (\'engineer\'):\n
+ executive = True\n
+else:\n
+ executive = False\n
+\n
+company_birth = employer_object.getCreationDate()\n
+\n
+employer_region = employer_object.getDefaultAddress().getZipCode()[:2]\n
+\n
+# get the number of person which are employed by the company ,\n
+# sub_list = employer_object.getSubordinationRelatedValueList()\n
+# company_size = 0\n
+# for person in sub_list:\n
+# if person.getPortalType() == \'Person\': # add condition: if current role == internal and defaultCareerEnd and defaultCareerStart fit in the current year\n
+# #print repr(person) + repr(person.getTitle())\n
+# company_size += 1\n
+#\n
+# print repr(company_size)\n
+#\n
+# return printed\n
+\n
+company_size = 3\n
+\n
+\n
+# "Char" slice type\n
+slice_a_value = ceiling_salary\n
+slice_b_value = ceiling_salary * 4\n
+slice_c_value = ceiling_salary * 8\n
+char_slices = {}\n
+if gross_salary < slice_a_value:\n
+ char_slices[\'A\'] = gross_salary\n
+else:\n
+ char_slices[\'A\'] = slice_a_value\n
+ if gross_salary < slice_b_value:\n
+ char_slices[\'B\'] = float(gross_salary) - float(slice_a_value)\n
+ else:\n
+ char_slices[\'B\'] = slice_b_value\n
+ if gross_salary < slice_c_value:\n
+ char_slices[\'C\'] = float(gross_salary) - float(slice_b_value)\n
+ else:\n
+ char_slices[\'C\'] = slice_c_value\n
+\n
+# "Number" slice type\n
+slice_1_value = ceiling_salary\n
+slice_2_value = ceiling_salary * 3\n
+num_slices = {}\n
+if gross_salary < slice_1_value:\n
+ char_slices[\'1\'] = gross_salary\n
+else:\n
+ char_slices[\'1\'] = slice_1_value\n
+ if gross_salary < slice_2_value:\n
+ char_slices[\'2\'] = gross_salary - slice_1_value\n
+ else:\n
+ char_slices[\'2\'] = slice_2_value\n
+\n
+# age-slice of the company\n
+old_limit = DateTime(1997, 1, 1)\n
+if company_birth < old_limit:\n
+ comp_type = \'old\'\n
+else:\n
+ comp_type = \'new\'\n
+\n
+\n
+#################\n
+# This script will fill the PaySheetTransaction_preview with default values for base salary calculation\n
+# employer and employee share.\n
+#################\n
+\n
+default = {}\n
+# initialize all variables to None\n
+paysheet_services = []\n
+erp5site = context.portal_url.getPortalObject()\n
+# during 06/2005 service module has been renamed service_module\n
+# both names are supported\n
+if hasattr(erp5site, \'service_module\'): \n
+ service_module = erp5site.service_module\n
+else : \n
+ service_module = erp5site.service\n
+for service in service_module.objectValues():\n
+ base_cat = service.getVariationRangeBaseCategoryList()\n
+ if \'tax_category\' in base_cat and \'salary_range\' in base_cat:\n
+ paysheet_services.append(service)\n
+for serv in paysheet_services:\n
+ cat_list = serv.getCategoryList()\n
+ tax_cat = []\n
+ range_cat = []\n
+ for cat in cat_list:\n
+ if str(cat).find(\'tax_category\') != -1:\n
+ tax_cat.append(cat)\n
+ if str(cat).find(\'salary_range\') != -1:\n
+ range_cat.append(cat)\n
+ for base in range_cat:\n
+ mycategory = context.portal_categories.resolveCategory(base)\n
+ if mycategory is None:\n
+ context.log("PaySheetTransaction_preCalculation","WARNING : category not found : %s" % base)\n
+ else:\n
+ new_name = serv.getId() + \'/\' + mycategory.getId()\n
+ default[new_name] = {\'employer_rate\':None,\'employee_rate\':None,\'base\':None}\n
+\n
+# sickness insurance\n
+if employer_region in (\'57\', \'67\', \'68\'):\n
+ er = 1.70\n
+else:\n
+ er = 0.75\n
+default[\'sickness_insurance/salaire_brut\'] = \\\n
+{ \'employer_rate\' : 12.80\n
+, \'employee_rate\' : er\n
+, \'base\' : gross_salary\n
+}\n
+\n
+# old-age insurance\n
+default[\'oldage_insurance/salaire_brut\'] = \\\n
+{ \'employer_rate\' : 1.60\n
+, \'employee_rate\' : None\n
+, \'base\' : gross_salary\n
+}\n
+default[\'oldage_insurance/salaire_plafonne\'] = \\\n
+{ \'employer_rate\' : 8.20\n
+, \'employee_rate\' : 6.55\n
+, \'base\' : limited_salary\n
+}\n
+\n
+# Commented by vincent 2006/01/13 : Antoine told me it\'s unused\n
+# widowhood insurance\n
+#default[\'widowhood_insurance/salaire_brut\'] = \\\n
+#{ \'employer_rate\' : None\n
+#, \'employee_rate\' : 0.10\n
+#, \'base\' : gross_salary\n
+#}\n
+\n
+# family benefits\n
+default[\'family_benefits/salaire_brut\'] = \\\n
+{ \'employer_rate\' : 5.40\n
+, \'employee_rate\' : None\n
+, \'base\' : gross_salary\n
+}\n
+\n
+# industrial accident\n
+# industrial_accident_rate is a parameter of this script, because rate depending of company size, department & trade (1.10 is for Nexedi, 1.0 is the default value)\n
+if industrial_accident_rate in (\'\', 0, None):\n
+ industrial_accident_rate = 1.0\n
+default[\'industrial_accident/salaire_brut\'] = \\\n
+{ \'employer_rate\' : industrial_accident_rate\n
+, \'employee_rate\' : None\n
+, \'base\' : gross_salary\n
+}\n
+\n
+# lodging helps\n
+if company_size > 9:\n
+ default[\'lodging_helps/salaire_brut\'] = \\\n
+ { \'employer_rate\' : 0.40\n
+ , \'employee_rate\' : None\n
+ , \'base\' : gross_salary\n
+ }\n
+else:\n
+ default[\'lodging_helps/salaire_plafonne\'] = \\\n
+ { \'employer_rate\' : 0.10\n
+ , \'employee_rate\' : None\n
+ , \'base\' : limited_salary\n
+ }\n
+\n
+# transport payment\n
+# TODO: rate depending of the town, 1.80 is the \'default\' value (when the town isn\'t referenced by laws)\n
+if transport_payment_rate in (\'\', 0, None):\n
+ transport_payment_rate = 1.80\n
+if company_size > 9:\n
+ default[\'transport_payment/salaire_brut\'] = \\\n
+ { \'employer_rate\' : transport_payment_rate\n
+ , \'employee_rate\' : None\n
+ , \'base\' : gross_salary\n
+ }\n
+\n
+# CSG\n
+default[\'csg_deductible/salaire_brut_csg\'] = \\\n
+{ \'employer_rate\' : None\n
+, \'employee_rate\' : 5.10\n
+, \'base\' : 0.97 * gross_salary\n
+}\n
+default[\'csg_non_deductible/salaire_brut_csg\'] = \\\n
+{ \'employer_rate\' : None\n
+, \'employee_rate\' : 2.4\n
+, \'base\' : 0.97 * gross_salary\n
+}\n
+\n
+# CRDS\n
+default[\'crds/salaire_brut_crds\'] = \\\n
+{ \'employer_rate\' : None\n
+, \'employee_rate\' : 0.50\n
+, \'base\' : 0.97 * gross_salary\n
+}\n
+\n
+# unemployment insurance\n
+if char_slices.has_key(\'A\'):\n
+ default[\'unemployment_insurance/tranche_a\'] = \\\n
+ { \'employer_rate\' : 4.0\n
+ , \'employee_rate\' : 2.4\n
+ , \'base\' : char_slices[\'A\']\n
+ }\n
+if char_slices.has_key(\'B\'):\n
+ default[\'unemployment_insurance/tranche_b\'] = \\\n
+ { \'employer_rate\' : 4.0\n
+ , \'employee_rate\' : 2.4\n
+ , \'base\' : char_slices[\'B\']\n
+ }\n
+\n
+# FNGS\n
+default[\'fngs/tranche_a\'] = \\\n
+{ \'employer_rate\' : 0.35\n
+, \'employee_rate\' : None\n
+, \'base\' : gross_salary\n
+}\n
+\n
+# Commented by vincent 2006/01/13 : Antoine told me it\'s unused\n
+# AGS\n
+# ags_rate is a parameter of this script, 0.35% was the default value, now it\'s 0.45%\n
+#if ags_rate in (\'\', 0, None):\n
+# ags_rate = 0.45\n
+#if char_slices.has_key(\'A\'):\n
+# default[\'ags/tranche_a\'] = \\\n
+# { \'employer_rate\' : ags_rate\n
+# , \'employee_rate\' : None\n
+# , \'base\' : char_slices[\'A\']\n
+# }\n
+#if char_slices.has_key(\'B\'):\n
+# default[\'ags/tranche_b\'] = \\\n
+# { \'employer_rate\' : ags_rate\n
+# , \'employee_rate\' : None\n
+# , \'base\' : char_slices[\'B\']\n
+# }\n
+\n
+# ARRCO\n
+if executive == False:\n
+ if num_slices.has_key(\'1\'):\n
+ default[\'arrco/tranche_1\'] = \\\n
+ { \'employer_rate\' : 4.5\n
+ , \'employee_rate\' : 3.0\n
+ , \'base\' : num_slices[\'1\']\n
+ }\n
+ if num_slices.has_key(\'2\'):\n
+ if comp_type == \'old\':\n
+ employee_share_rate = 6.0\n
+ employer_share_rate = 9.0\n
+ else:\n
+ employee_share_rate = 8.0\n
+ employer_share_rate = 12.0\n
+\n
+ default[\'arrco/tranche_2\'] = \\\n
+ { \'employer_rate\' : employer_share_rate\n
+ , \'employee_rate\' : employee_share_rate\n
+ , \'base\' : num_slices[\'2\']\n
+ }\n
+elif char_slices.has_key(\'A\'):\n
+ default[\'arrco/tranche_a\'] = \\\n
+ { \'employer_rate\' : 4.5\n
+ , \'employee_rate\' : 3.0\n
+ , \'base\' : char_slices[\'A\']\n
+ }\n
+\n
+# AGFF\n
+if executive == True:\n
+ if char_slices.has_key(\'A\'):\n
+ default[\'agff/tranche_a\'] = \\\n
+ { \'employer_rate\' : 1.20\n
+ , \'employee_rate\' : 0.80\n
+ , \'base\' : char_slices[\'A\']\n
+ }\n
+ if char_slices.has_key(\'B\'):\n
+ default[\'agff/tranche_b\'] = \\\n
+ { \'employer_rate\' : 1.30\n
+ , \'employee_rate\' : 0.90\n
+ , \'base\' : char_slices[\'B\']\n
+ }\n
+else:\n
+ if num_slices.has_key(\'1\'):\n
+ default[\'agff/tranche_1\'] = \\\n
+ { \'employer_rate\' : 1.20\n
+ , \'employee_rate\' : 0.80\n
+ , \'base\' : num_slices[\'1\']\n
+ }\n
+ if num_slices.has_key(\'2\'):\n
+ default[\'agff/tranche_2\'] = \\\n
+ { \'employer_rate\' : 1.30\n
+ , \'employee_rate\' : 0.90\n
+ , \'base\' : num_slices[\'2\']\n
+ }\n
+\n
+# AGIRC\n
+# TODO: fix the repartition of share rate in case of slice C\n
+if executive == True:\n
+ if char_slices.has_key(\'B\'):\n
+ default[\'agirc/tranche_b\'] = \\\n
+ { \'employer_rate\' : 12.50\n
+ , \'employee_rate\' : 7.50\n
+ , \'base\' : char_slices[\'B\']\n
+ }\n
+ if char_slices.has_key(\'C\'):\n
+ # free repartition (20% to share between employee & employer)\n
+ default[\'agirc/tranche_c\'] = \\\n
+ { \'employer_rate\' : 10.00\n
+ , \'employee_rate\' : 10.00\n
+ , \'base\' : char_slices[\'C\']\n
+ }\n
+\n
+# CET\n
+if executive == True:\n
+ if char_slices.has_key(\'A\'):\n
+ default[\'cet/tranche_a\'] = \\\n
+ { \'employer_rate\' : 0.22\n
+ , \'employee_rate\' : 0.13\n
+ , \'base\' : char_slices[\'A\']\n
+ }\n
+ if char_slices.has_key(\'B\'):\n
+ default[\'cet/tranche_b\'] = \\\n
+ { \'employer_rate\' : 0.22\n
+ , \'employee_rate\' : 0.13\n
+ , \'base\' : char_slices[\'B\']\n
+ }\n
+ if char_slices.has_key(\'C\'):\n
+ default[\'cet/tranche_c\'] = \\\n
+ { \'employer_rate\' : 0.22\n
+ , \'employee_rate\' : 0.13\n
+ , \'base\' : char_slices[\'C\']\n
+ }\n
+\n
+# life insurance\n
+if executive == True and char_slices.has_key(\'A\'):\n
+ default[\'life_insurance/tranche_a\'] = \\\n
+ { \'employer_rate\' : 1.5\n
+ , \'employee_rate\' : None\n
+ , \'base\' : char_slices[\'A\']\n
+ }\n
+\n
+# APEC\n
+if char_slices.has_key(\'B\'):\n
+ default[\'apec/tranche_b\'] = \\\n
+ { \'employer_rate\' : 0.036\n
+ , \'employee_rate\' : 0.024\n
+ , \'base\' : char_slices[\'B\']\n
+ }\n
+\n
+# construction tax\n
+if company_size > 9:\n
+ default[\'construction_tax/salaire_brut\'] = \\\n
+ { \'employer_rate\' : 0.45\n
+ , \'employee_rate\' : None\n
+ , \'base\' : gross_salary\n
+ }\n
+\n
+# training tax\n
+default[\'training_tax/salaire_brut\'] = \\\n
+{ \'employer_rate\' : 0.50\n
+, \'employee_rate\' : None\n
+, \'base\' : gross_salary\n
+}\n
+\n
+# courses tax\n
+if company_size < 10:\n
+ rate = 0.15\n
+else:\n
+ rate = 1.5\n
+default[\'courses_tax/salaire_brut\'] = \\\n
+{ \'employer_rate\' : rate\n
+, \'employee_rate\' : None\n
+, \'base\' : gross_salary\n
+}\n
+\n
+# Syntec convention\n
+if \'syntec\' in employee_object.getCareerCollectiveAgreementTitle().lower():\n
+ # set the syntec rate according to the employee marital status\n
+ syntec_rate = 0.915\n
+ if employee_object.getMaritalStatusId() == \'married\':\n
+ syntec_rate *= 2\n
+ default[\'syntec_insurance/salaire_plafonne_syntec\'] = \\\n
+ { \'employer_rate\' : syntec_rate\n
+ , \'employee_rate\' : syntec_rate\n
+ , \'base\' : ceiling_salary\n
+ }\n
+\n
+# antoine taxs. by vincent and jerome \n
+if not executive :\n
+ default[\'oldage_unlimited/salaire_brut\'] = \\\n
+ { \'employer_rate\' : 1.60\n
+ , \'employee_rate\' : 0.10\n
+ , \'base\' : gross_salary\n
+ }\n
+ default[\'industrial_accident/salaire_brut\'] = \\\n
+ { \'employer_rate\' : 1.10\n
+ , \'employee_rate\' : None\n
+ , \'base\' : gross_salary\n
+ }\n
+ default[\'family_benefits/salaire_brut\'] = \\\n
+ { \'employer_rate\' : 5.40\n
+ , \'employee_rate\' : None\n
+ , \'base\' : gross_salary\n
+ }\n
+\n
+\n
+# quick hack for maladie and primes - j\xc3\xa9 2006-02-01\n
+if 1:\n
+ default[\'retenue_maladie/salaire_brut\'] = \\\n
+ { \'employer_rate\' : 0\n
+ , \'employee_rate\' : 0\n
+ , \'base\' : 0\n
+ }\n
+ default[\'primes/salaire_brut\'] = \\\n
+ { \'employer_rate\' : 0\n
+ , \'employee_rate\' : 0\n
+ , \'base\' : 0\n
+ }\n
+\n
+return default\n
+
+
+]]></string> </value>
+ </item>
+ <item>
+ <key> <string>_code</string> </key>
+ <value>
+ <none/>
+ </value>
+ </item>
+ <item>
+ <key> <string>_filepath</string> </key>
+ <value> <string>Script (Python):/nexedi/portal_skins/erp5_payroll/PaySheetTransaction_preCalculation_l10n_fr_2005</string> </value>
+ </item>
+ <item>
+ <key> <string>_params</string> </key>
+ <value> <string>ags_rate=None, industrial_accident_rate=None, transport_payment_rate=None</string> </value>
+ </item>
+ <item>
+ <key> <string>errors</string> </key>
+ <value>
+ <tuple/>
+ </value>
+ </item>
+ <item>
+ <key> <string>func_code</string> </key>
+ <value>
+ <object>
+ <klass>
+ <global name="FuncCode" module="Shared.DC.Scripts.Signature"/>
+ </klass>
+ <tuple/>
+ <state>
+ <dictionary>
+ <item>
+ <key> <string>co_argcount</string> </key>
+ <value> <int>3</int> </value>
+ </item>
+ <item>
+ <key> <string>co_varnames</string> </key>
+ <value>
+ <tuple>
+ <string>ags_rate</string>
+ <string>industrial_accident_rate</string>
+ <string>transport_payment_rate</string>
+ <string>True</string>
+ <string>False</string>
+ <string>_getattr_</string>
+ <string>context</string>
+ <string>paysheet</string>
+ <string>paysheet_type</string>
+ <string>employee</string>
+ <string>employee_object</string>
+ <string>employer</string>
+ <string>employer_object</string>
+ <string>abs</string>
+ <string>gross_salary</string>
+ <string>ceiling_salary_list</string>
+ <string>paysheet_year</string>
+ <string>ceiling_salary_available_years</string>
+ <string>_getitem_</string>
+ <string>ceiling_salary</string>
+ <string>limited_salary</string>
+ <string>executive</string>
+ <string>company_birth</string>
+ <string>employer_region</string>
+ <string>company_size</string>
+ <string>slice_a_value</string>
+ <string>slice_b_value</string>
+ <string>slice_c_value</string>
+ <string>char_slices</string>
+ <string>_write_</string>
+ <string>float</string>
+ <string>slice_1_value</string>
+ <string>slice_2_value</string>
+ <string>num_slices</string>
+ <string>DateTime</string>
+ <string>old_limit</string>
+ <string>comp_type</string>
+ <string>default</string>
+ <string>paysheet_services</string>
+ <string>erp5site</string>
+ <string>hasattr</string>
+ <string>service_module</string>
+ <string>_getiter_</string>
+ <string>service</string>
+ <string>base_cat</string>
+ <string>serv</string>
+ <string>cat_list</string>
+ <string>tax_cat</string>
+ <string>range_cat</string>
+ <string>cat</string>
+ <string>str</string>
+ <string>base</string>
+ <string>mycategory</string>
+ <string>None</string>
+ <string>new_name</string>
+ <string>er</string>
+ <string>employee_share_rate</string>
+ <string>employer_share_rate</string>
+ <string>rate</string>
+ <string>syntec_rate</string>
+ </tuple>
+ </value>
+ </item>
+ </dictionary>
+ </state>
+ </object>
+ </value>
+ </item>
+ <item>
+ <key> <string>func_defaults</string> </key>
+ <value>
+ <tuple>
+ <none/>
+ <none/>
+ <none/>
+ </tuple>
+ </value>
+ </item>
+ <item>
+ <key> <string>id</string> </key>
+ <value> <string>PaySheetTransaction_preCalculation_l10n_fr_2005</string> </value>
+ </item>
+ <item>
+ <key> <string>warnings</string> </key>
+ <value>
+ <tuple/>
+ </value>
+ </item>
+ </dictionary>
+ </pickle>
+ </record>
+</ZopeData>
Added: erp5/trunk/bt5/erp5_payroll/SkinTemplateItem/portal_skins/erp5_payroll/PaySheetTransaction_preCalculation_l10n_fr_2006.xml
URL: http://svn.erp5.org/erp5/trunk/bt5/erp5_payroll/SkinTemplateItem/portal_skins/erp5_payroll/PaySheetTransaction_preCalculation_l10n_fr_2006.xml?rev=6755&view=auto
==============================================================================
--- erp5/trunk/bt5/erp5_payroll/SkinTemplateItem/portal_skins/erp5_payroll/PaySheetTransaction_preCalculation_l10n_fr_2006.xml (added)
+++ erp5/trunk/bt5/erp5_payroll/SkinTemplateItem/portal_skins/erp5_payroll/PaySheetTransaction_preCalculation_l10n_fr_2006.xml Sat Apr 15 00:22:51 2006
@@ -1,0 +1,627 @@
+<?xml version="1.0"?>
+<ZopeData>
+ <record id="1" aka="AAAAAAAAAAE=">
+ <pickle>
+ <tuple>
+ <tuple>
+ <string>Products.PythonScripts.PythonScript</string>
+ <string>PythonScript</string>
+ </tuple>
+ <none/>
+ </tuple>
+ </pickle>
+ <pickle>
+ <dictionary>
+ <item>
+ <key> <string>Python_magic</string> </key>
+ <value> <string encoding="base64">O/INCg==</string> </value>
+ </item>
+ <item>
+ <key> <string>Script_magic</string> </key>
+ <value> <int>3</int> </value>
+ </item>
+ <item>
+ <key> <string>__ac_local_roles__</string> </key>
+ <value>
+ <none/>
+ </value>
+ </item>
+ <item>
+ <key> <string>_bind_names</string> </key>
+ <value>
+ <object>
+ <klass>
+ <global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
+ </klass>
+ <tuple/>
+ <state>
+ <dictionary>
+ <item>
+ <key> <string>_asgns</string> </key>
+ <value>
+ <dictionary>
+ <item>
+ <key> <string>name_container</string> </key>
+ <value> <string>container</string> </value>
+ </item>
+ <item>
+ <key> <string>name_context</string> </key>
+ <value> <string>context</string> </value>
+ </item>
+ <item>
+ <key> <string>name_m_self</string> </key>
+ <value> <string>script</string> </value>
+ </item>
+ <item>
+ <key> <string>name_subpath</string> </key>
+ <value> <string>traverse_subpath</string> </value>
+ </item>
+ </dictionary>
+ </value>
+ </item>
+ </dictionary>
+ </state>
+ </object>
+ </value>
+ </item>
+ <item>
+ <key> <string>_body</string> </key>
+ <value> <string encoding="cdata"><![CDATA[
+
+#\n
+global paysheet\n
+paysheet = context.getObject()\n
+paysheet_type = paysheet.getPortalType()\n
+\n
+employee = paysheet.getDestinationSection()\n
+employee_object = paysheet.getDestinationSectionValue()\n
+employer = paysheet.getSourceSection()\n
+employer_object = paysheet.getSourceSectionValue()\n
+\n
+gross_salary = abs(paysheet.getGrossSalary())\n
+\n
+######\n
+# This script define all rates to apply in 2006 to calculate an entire paysheet\n
+# according french fiscal & social rules for a SME.\n
+######\n
+\n
+### This part of the script define usefull variables to help us calculate dynamic rates\n
+\n
+# each year, look at http://www.urssaf.fr to complete the table\n
+ceiling_salary_list = { 2003 : 2432.0\n
+ , 2004 : 2476.0\n
+ , 2005 : 2516.0\n
+ , 2006 : 2589.0\n
+ }\n
+# the default ceiling salary is the last one\n
+paysheet_year = paysheet.getStartDate().year()\n
+ceiling_salary_available_years = ceiling_salary_list.keys()\n
+if paysheet_year not in ceiling_salary_available_years:\n
+ paysheet_year = ceiling_salary_available_years[-1]\n
+ceiling_salary = ceiling_salary_list[paysheet_year]\n
+\n
+# limited salary = salaire plafonnee\n
+if gross_salary < ceiling_salary:\n
+ limited_salary = gross_salary\n
+else:\n
+ limited_salary = ceiling_salary\n
+\n
+# check if the employee is executive or not\n
+if employee_object.getCareerGrade().split(\'/\')[-1:][0] in (\'engineer\'):\n
+ executive = True\n
+else:\n
+ executive = False\n
+\n
+company_birth = employer_object.getCreationDate()\n
+\n
+employer_region = employer_object.getDefaultAddress().getZipCode()[:2]\n
+\n
+# get the number of person which are employed by the company ,\n
+# sub_list = employer_object.getSubordinationRelatedValueList()\n
+# company_size = 0\n
+# for person in sub_list:\n
+# if person.getPortalType() == \'Person\': # add condition: if current role == internal and defaultCareerEnd and defaultCareerStart fit in the current year\n
+# #print repr(person) + repr(person.getTitle())\n
+# company_size += 1\n
+#\n
+# print repr(company_size)\n
+#\n
+# return printed\n
+\n
+company_size = 3\n
+\n
+# Get the list of all slice the employee fall in\n
+salary_slices = {}\n
+\n
+# "Char" slice type\n
+slice_a_value = ceiling_salary\n
+slice_b_value = ceiling_salary * 4\n
+slice_c_value = ceiling_salary * 8\n
+if gross_salary < slice_a_value:\n
+ salary_slices[\'A\'] = gross_salary\n
+else:\n
+ salary_slices[\'A\'] = slice_a_value\n
+ if gross_salary < slice_b_value:\n
+ salary_slices[\'B\'] = float(gross_salary) - float(slice_a_value)\n
+ else:\n
+ salary_slices[\'B\'] = slice_b_value\n
+ if gross_salary < slice_c_value:\n
+ salary_slices[\'C\'] = float(gross_salary) - float(slice_b_value)\n
+ else:\n
+ salary_slices[\'C\'] = slice_c_value\n
+\n
+# "Number" slice type\n
+slice_1_value = ceiling_salary\n
+slice_2_value = ceiling_salary * 3\n
+if gross_salary < slice_1_value:\n
+ salary_slices[\'1\'] = gross_salary\n
+else:\n
+ salary_slices[\'1\'] = slice_1_value\n
+ if gross_salary < slice_2_value:\n
+ salary_slices[\'2\'] = gross_salary - slice_1_value\n
+ else:\n
+ salary_slices[\'2\'] = slice_2_value\n
+\n
+# age-slice of the company\n
+old_limit = DateTime(1997, 1, 1)\n
+if company_birth < old_limit:\n
+ comp_type = \'old\'\n
+else:\n
+ comp_type = \'new\'\n
+\n
+\n
+### This part of the script aggregate base salary and rates.\n
+\n
+default = {}\n
+\n
+# initialize all variables to None\n
+paysheet_services = []\n
+erp5site = context.portal_url.getPortalObject()\n
+\n
+# during 06/2005 service module has been renamed service_module\n
+# both names are supported\n
+if hasattr(erp5site, \'service_module\'):\n
+ service_module = erp5site.service_module\n
+else :\n
+ service_module = erp5site.service\n
+for service in service_module.objectValues():\n
+ base_cat = service.getVariationRangeBaseCategoryList()\n
+ if \'tax_category\' in base_cat and \'salary_range\' in base_cat:\n
+ paysheet_services.append(service)\n
+for serv in paysheet_services:\n
+ cat_list = serv.getCategoryList()\n
+ tax_cat = []\n
+ range_cat = []\n
+ for cat in cat_list:\n
+ if str(cat).find(\'tax_category\') != -1:\n
+ tax_cat.append(cat)\n
+ if str(cat).find(\'salary_range\') != -1:\n
+ range_cat.append(cat)\n
+ for base in range_cat:\n
+ mycategory = context.portal_categories.resolveCategory(base)\n
+ if mycategory is None:\n
+ context.log("PaySheetTransaction_preCalculation","WARNING! Category not found : %s" % base)\n
+ else:\n
+ new_name = serv.getId() + \'/\' + mycategory.getId()\n
+ default[new_name] = {\'employer_rate\':None,\'employee_rate\':None,\'base\':None}\n
+\n
+# Sickness insurance = Assurance maladie\n
+if executive:\n
+ employer_rate = None\n
+ employee_rate = 1.15\n
+else:\n
+ employer_rate = 13.10\n
+ employee_rate = 0.75\n
+default[\'sickness_insurance/salaire_brut\'] = \\\n
+{ \'employer_rate\' : employer_rate\n
+, \'employee_rate\' : employee_rate\n
+, \'base\' : gross_salary\n
+}\n
+\n
+# Old-age insurance = Assurance vieillesse\n
+if executive:\n
+ default[\'oldage_insurance/salaire_plafonne\'] = \\\n
+ { \'employer_rate\' : None\n
+ , \'employee_rate\' : 6.65\n
+ , \'base\' : limited_salary\n
+ }\n
+else:\n
+ default[\'oldage_insurance/salaire_brut\'] = \\\n
+ { \'employer_rate\' : 1.60\n
+ , \'employee_rate\' : 0.10\n
+ , \'base\' : gross_salary\n
+ }\n
+ default[\'oldage_insurance/salaire_plafonne\'] = \\\n
+ { \'employer_rate\' : 8.30\n
+ , \'employee_rate\' : 6.65\n
+ , \'base\' : limited_salary\n
+ }\n
+\n
+# Family benefits = Allocations familliale\n
+if not executive:\n
+ default[\'family_benefits/salaire_brut\'] = \\\n
+ { \'employer_rate\' : 5.40\n
+ , \'employee_rate\' : None\n
+ , \'base\' : gross_salary\n
+ }\n
+\n
+# Industrial accident = Accidents du travail\n
+if not executive:\n
+ default[\'industrial_accident/salaire_brut\'] = \\\n
+ { \'employer_rate\' : 1.10\n
+ , \'employee_rate\' : None\n
+ , \'base\' : gross_salary\n
+ }\n
+\n
+# Lodging helps = Aide au logemenent\n
+# if company_size > 9:\n
+# default[\'lodging_helps/salaire_brut\'] = \\\n
+# { \'employer_rate\' : 0.40\n
+# , \'employee_rate\' : None\n
+# , \'base\' : gross_salary\n
+# }\n
+# else:\n
+# default[\'lodging_helps/salaire_plafonne\'] = \\\n
+# { \'employer_rate\' : 0.10\n
+# , \'employee_rate\' : None\n
+# , \'base\' : limited_salary\n
+# }\n
+\n
+# transport payment\n
+# TODO: rate depending of the town, 1.80 is the \'default\' value (when the town isn\'t referenced by laws)\n
+# if transport_payment_rate in (\'\', 0, None):\n
+# transport_payment_rate = 1.80\n
+# if company_size > 9:\n
+# default[\'transport_payment/salaire_brut\'] = \\\n
+# { \'employer_rate\' : transport_payment_rate\n
+# , \'employee_rate\' : None\n
+# , \'base\' : gross_salary\n
+# }\n
+\n
+# CSG\n
+default[\'csg_deductible/salaire_brut_csg\'] = \\\n
+{ \'employer_rate\' : None\n
+, \'employee_rate\' : 5.10\n
+, \'base\' : 0.97 * gross_salary\n
+}\n
+default[\'csg_non_deductible/salaire_brut_csg\'] = \\\n
+{ \'employer_rate\' : None\n
+, \'employee_rate\' : 2.9\n
+, \'base\' : 0.97 * gross_salary\n
+}\n
+\n
+# CRDS\n
+# default[\'crds/salaire_brut_crds\'] = \\\n
+# { \'employer_rate\' : None\n
+# , \'employee_rate\' : 0.50\n
+# , \'base\' : 0.97 * gross_salary\n
+# }\n
+\n
+# Unemployment insurance = Assurance chomage\n
+default[\'unemployment_insurance/salaire_brut\'] = \\\n
+{ \'employer_rate\' : 4.04\n
+, \'employee_rate\' : 2.44\n
+, \'base\' : gross_salary\n
+}\n
+\n
+# FNGS\n
+default[\'fngs/salaire_brut\'] = \\\n
+{ \'employer_rate\' : 0.25\n
+, \'employee_rate\' : None\n
+, \'base\' : gross_salary\n
+}\n
+\n
+# ARRCO\n
+if not executive:\n
+ if salary_slices.has_key(\'1\'):\n
+ default[\'arrco/tranche_1\'] = \\\n
+ { \'employer_rate\' : 4.5\n
+ , \'employee_rate\' : 3.0\n
+ , \'base\' : salary_slices[\'1\']\n
+ }\n
+ if salary_slices.has_key(\'2\'):\n
+ if comp_type == \'old\':\n
+ employee_share_rate = 6.0\n
+ employer_share_rate = 9.0\n
+ else:\n
+ employee_share_rate = 8.0\n
+ employer_share_rate = 12.0\n
+\n
+ default[\'arrco/tranche_2\'] = \\\n
+ { \'employer_rate\' : employer_share_rate\n
+ , \'employee_rate\' : employee_share_rate\n
+ , \'base\' : salary_slices[\'2\']\n
+ }\n
+elif salary_slices.has_key(\'A\'):\n
+ default[\'arrco/tranche_a\'] = \\\n
+ { \'employer_rate\' : 4.5\n
+ , \'employee_rate\' : 3.0\n
+ , \'base\' : salary_slices[\'A\']\n
+ }\n
+\n
+# AGFF\n
+if executive:\n
+ if salary_slices.has_key(\'A\'):\n
+ default[\'agff_tranche_a/tranche_a\'] = \\\n
+ { \'employer_rate\' : 1.20\n
+ , \'employee_rate\' : 0.80\n
+ , \'base\' : salary_slices[\'A\']\n
+ }\n
+ if salary_slices.has_key(\'B\'):\n
+ default[\'agff_tranche_b/tranche_b\'] = \\\n
+ { \'employer_rate\' : 1.30\n
+ , \'employee_rate\' : 0.90\n
+ , \'base\' : salary_slices[\'B\']\n
+ }\n
+else:\n
+ if salary_slices.has_key(\'1\'):\n
+ default[\'agff_tranche_a/tranche_1\'] = \\\n
+ { \'employer_rate\' : 1.20\n
+ , \'employee_rate\' : 0.80\n
+ , \'base\' : salary_slices[\'1\']\n
+ }\n
+ if salary_slices.has_key(\'2\'):\n
+ default[\'agff_tranche_b/tranche_2\'] = \\\n
+ { \'employer_rate\' : 1.30\n
+ , \'employee_rate\' : 0.90\n
+ , \'base\' : salary_slices[\'2\']\n
+ }\n
+\n
+# ARGIC\n
+# TODO: fix the repartition of share rate in case of slice C\n
+if executive:\n
+ if salary_slices.has_key(\'B\'):\n
+ default[\'argic/tranche_b\'] = \\\n
+ { \'employer_rate\' : 12.60\n
+ , \'employee_rate\' : 7.70\n
+ , \'base\' : salary_slices[\'B\']\n
+ }\n
+ if salary_slices.has_key(\'C\'):\n
+ # free repartition (20.30% to share between employee & employer)\n
+ default[\'argic/tranche_c\'] = \\\n
+ { \'employer_rate\' : 10.15\n
+ , \'employee_rate\' : 10.15\n
+ , \'base\' : salary_slices[\'C\']\n
+ }\n
+\n
+# CET\n
+if executive:\n
+ if salary_slices.has_key(\'A\'):\n
+ default[\'cet/tranche_a\'] = \\\n
+ { \'employer_rate\' : 0.22\n
+ , \'employee_rate\' : 0.13\n
+ , \'base\' : salary_slices[\'A\']\n
+ }\n
+ if salary_slices.has_key(\'B\'):\n
+ default[\'cet/tranche_b\'] = \\\n
+ { \'employer_rate\' : 0.22\n
+ , \'employee_rate\' : 0.13\n
+ , \'base\' : salary_slices[\'B\']\n
+ }\n
+ if salary_slices.has_key(\'C\'):\n
+ default[\'cet/tranche_c\'] = \\\n
+ { \'employer_rate\' : 0.22\n
+ , \'employee_rate\' : 0.13\n
+ , \'base\' : salary_slices[\'C\']\n
+ }\n
+\n
+# Life insurance = Assurance vie\n
+# if executive == True and salary_slices.has_key(\'A\'):\n
+# default[\'life_insurance/tranche_a\'] = \\\n
+# { \'employer_rate\' : 1.5\n
+# , \'employee_rate\' : None\n
+# , \'base\' : salary_slices[\'A\']\n
+# }\n
+\n
+# APEC forfaitaire\n
+if executive:\n
+ default[\'apec/forfait\'] = \\\n
+ { \'employer_rate\' : 3.72\n
+ , \'employee_rate\' : 2.49\n
+ , \'base\' : 100.0\n
+ }\n
+ if salary_slices.has_key(\'B\'):\n
+ default[\'apec/tranche_b\'] = \\\n
+ { \'employer_rate\' : 0.036\n
+ , \'employee_rate\' : 0.024\n
+ , \'base\' : salary_slices[\'B\']\n
+ }\n
+\n
+# Retirement = Retraite forfaitaire\n
+if executive:\n
+ default[\'cavcic/forfait\'] = \\\n
+ { \'employer_rate\' : 34.58\n
+ , \'employee_rate\' : 20.75\n
+ , \'base\' : 100.0\n
+ }\n
+\n
+# construction tax\n
+# if company_size > 9:\n
+# default[\'construction_tax/salaire_brut\'] = \\\n
+# { \'employer_rate\' : 0.45\n
+# , \'employee_rate\' : None\n
+# , \'base\' : gross_salary\n
+# }\n
+\n
+# training tax\n
+# default[\'training_tax/salaire_brut\'] = \\\n
+# { \'employer_rate\' : 0.50\n
+# , \'employee_rate\' : None\n
+# , \'base\' : gross_salary\n
+# }\n
+\n
+# courses tax\n
+# if company_size < 10:\n
+# rate = 0.15\n
+# else:\n
+# rate = 1.5\n
+# default[\'courses_tax/salaire_brut\'] = \\\n
+# { \'employer_rate\' : rate\n
+# , \'employee_rate\' : None\n
+# , \'base\' : gross_salary\n
+# }\n
+\n
+# Syntec convention\n
+# TOD0: We can\'t take the decision based on the CollectiveAgreementTitle since each\n
+# employee has the right to choose if they want benefit from the insurance or not.\n
+# We can use instead the social_contract property of the (near-)future HR-related stuff.\n
+col_agr = employee_object.getCareerCollectiveAgreementTitle()\n
+if col_agr not in (None, \'\') and \'syntec\' in col_agr.lower():\n
+ # set the syntec rate according to the employee marital status\n
+ syntec_rate = 0.96\n
+ if employee_object.getMaritalStatusId() == \'married\':\n
+ syntec_rate *= 2\n
+ default[\'syntec_insurance/salaire_plafonne_syntec\'] = \\\n
+ { \'employer_rate\' : syntec_rate\n
+ , \'employee_rate\' : syntec_rate\n
+ , \'base\' : ceiling_salary\n
+ }\n
+\n
+# Add blank lines for wickness holding (= retenue maladie) and pay bonus (= primes).\n
+# Thanks to this, the accountant has the freedom to add the missing amount of money\n
+# that this script can\'t guess.\n
+default[\'retenue_maladie/salaire_brut\'] = \\\n
+{ \'employer_rate\' : None\n
+, \'employee_rate\' : None\n
+, \'base\' : None\n
+}\n
+default[\'primes/salaire_brut\'] = \\\n
+{ \'employer_rate\' : None\n
+, \'employee_rate\' : None\n
+, \'base\' : None\n
+}\n
+\n
+return default\n
+
+
+]]></string> </value>
+ </item>
+ <item>
+ <key> <string>_code</string> </key>
+ <value>
+ <none/>
+ </value>
+ </item>
+ <item>
+ <key> <string>_filepath</string> </key>
+ <value> <string>Script (Python):/nexedi/portal_skins/erp5_payroll/PaySheetTransaction_preCalculation_l10n_fr_2006</string> </value>
+ </item>
+ <item>
+ <key> <string>_owner</string> </key>
+ <value>
+ <none/>
+ </value>
+ </item>
+ <item>
+ <key> <string>_params</string> </key>
+ <value> <string></string> </value>
+ </item>
+ <item>
+ <key> <string>errors</string> </key>
+ <value>
+ <tuple/>
+ </value>
+ </item>
+ <item>
+ <key> <string>func_code</string> </key>
+ <value>
+ <object>
+ <klass>
+ <global name="FuncCode" module="Shared.DC.Scripts.Signature"/>
+ </klass>
+ <tuple/>
+ <state>
+ <dictionary>
+ <item>
+ <key> <string>co_argcount</string> </key>
+ <value> <int>0</int> </value>
+ </item>
+ <item>
+ <key> <string>co_varnames</string> </key>
+ <value>
+ <tuple>
+ <string>_getattr_</string>
+ <string>context</string>
+ <string>paysheet</string>
+ <string>paysheet_type</string>
+ <string>employee</string>
+ <string>employee_object</string>
+ <string>employer</string>
+ <string>employer_object</string>
+ <string>abs</string>
+ <string>gross_salary</string>
+ <string>ceiling_salary_list</string>
+ <string>paysheet_year</string>
+ <string>ceiling_salary_available_years</string>
+ <string>_getitem_</string>
+ <string>ceiling_salary</string>
+ <string>limited_salary</string>
+ <string>True</string>
+ <string>executive</string>
+ <string>False</string>
+ <string>company_birth</string>
+ <string>employer_region</string>
+ <string>company_size</string>
+ <string>salary_slices</string>
+ <string>slice_a_value</string>
+ <string>slice_b_value</string>
+ <string>slice_c_value</string>
+ <string>_write_</string>
+ <string>float</string>
+ <string>slice_1_value</string>
+ <string>slice_2_value</string>
+ <string>DateTime</string>
+ <string>old_limit</string>
+ <string>comp_type</string>
+ <string>default</string>
+ <string>paysheet_services</string>
+ <string>erp5site</string>
+ <string>hasattr</string>
+ <string>service_module</string>
+ <string>_getiter_</string>
+ <string>service</string>
+ <string>base_cat</string>
+ <string>serv</string>
+ <string>cat_list</string>
+ <string>tax_cat</string>
+ <string>range_cat</string>
+ <string>cat</string>
+ <string>str</string>
+ <string>base</string>
+ <string>mycategory</string>
+ <string>None</string>
+ <string>new_name</string>
+ <string>employer_rate</string>
+ <string>employee_rate</string>
+ <string>employee_share_rate</string>
+ <string>employer_share_rate</string>
+ <string>col_agr</string>
+ <string>syntec_rate</string>
+ </tuple>
+ </value>
+ </item>
+ </dictionary>
+ </state>
+ </object>
+ </value>
+ </item>
+ <item>
+ <key> <string>func_defaults</string> </key>
+ <value>
+ <none/>
+ </value>
+ </item>
+ <item>
+ <key> <string>id</string> </key>
+ <value> <string>PaySheetTransaction_preCalculation_l10n_fr_2006</string> </value>
+ </item>
+ <item>
+ <key> <string>warnings</string> </key>
+ <value>
+ <tuple/>
+ </value>
+ </item>
+ </dictionary>
+ </pickle>
+ </record>
+</ZopeData>
More information about the Erp5-report
mailing list