diff --git a/bt5/erp5_payroll/SkinTemplateItem/portal_skins/erp5_payroll/PaySheetTransaction_initializePreview.xml b/bt5/erp5_payroll/SkinTemplateItem/portal_skins/erp5_payroll/PaySheetTransaction_initializePreview.xml index 6c16a4eb83a8dbf62686112eec882828c1aaaf20..df59d0ca0df22e2e3ad7cca63a328347d6b04e39 100644 --- a/bt5/erp5_payroll/SkinTemplateItem/portal_skins/erp5_payroll/PaySheetTransaction_initializePreview.xml +++ b/bt5/erp5_payroll/SkinTemplateItem/portal_skins/erp5_payroll/PaySheetTransaction_initializePreview.xml @@ -68,113 +68,154 @@ </item> <item> <key> <string>_body</string> </key> - <value> <string>import random\n + <value> <string>"""\n + This script create the data structure of the pay sheet preview (= the PaySheetTransaction_viewPreview fast input).\n + Then it fill this data structure with rates and amounts of money from the localized pre calculation script.\n +"""\n +\n +import random\n from Products.ERP5Type.Document import newTempBase\n from string import zfill\n \n -global portal_object, num, l\n -portal_object = context.getPortalObject()\n -num = 0\n -l = []\n \n -# get all pre-calculated rates and bases\n -default_values = context.PaySheetTransaction_preCalculation()\n \n -# function to create a new preview line\n -def createPreviewLine( new_id = None\n - , new_title = None\n - , new_base = None\n - , new_base_name = None\n - , new_employee_rate = None\n - , new_employer_rate = None\n - , new_service_url = None\n - , new_organisation_url = None\n - , new_salary_range_cat = None\n - , new_tax_cat = None\n - ):\n +##########################\n +# This part of the script create the data structure designed to hold the result of pre calculation.\n +##########################\n \n - global portal_object, num, l\n - num += 1\n - int_len = 3\n - o = newTempBase(portal_object, new_id)\n - o.setUid( \'new_%s\' % zfill(num, int_len)) # XXX There is a security issue here\n - o.edit(uid=\'new_%s\' % zfill(num, int_len)) # XXX There is a security issue here\n - o.edit( id = new_id\n - , title = new_title\n - , base = new_base\n - , base_name = new_base_name\n - , employee_share_rate = new_employee_rate\n - , employer_share_rate = new_employer_rate\n - , service_url = new_service_url\n - , organisation_url = new_organisation_url\n - , salary_range_cat = new_salary_range_cat\n - , tax_cat = new_tax_cat\n - )\n - l.append(o)\n +# \'d\' is the dict which contain the default values of the Pay Sheet fast input\n +# TODO: Bad name ! Find something more explicit.\n +d = {}\n \n -# get all services related to pay sheet transaction\n -paysheet_services = []\n -erp5site = context.portal_url.getPortalObject()\n -\n -# during 06/2005 service module has been renamed service_module\n +# During 06/2005 service module has been renamed service_module\n # both names are supported\n # XXX This should definitly use portal_catalog !!!\n -if hasattr(erp5site, \'payroll_service_module\') :\n +# XXX The following code will be deprecated when the Payroll Service portal type will be used.\n +erp5site = context.portal_url.getPortalObject()\n +if hasattr(erp5site, \'payroll_service_module\'):\n service_module = erp5site.payroll_service_module\n -elif hasattr(erp5site, \'service_module\') :\n +elif hasattr(erp5site, \'service_module\'):\n service_module = erp5site.service_module\n -else :\n +else:\n service_module = erp5site.service\n \n -\n +# Get all services related to pay sheet transaction\n +# TODO: Only choose services of the current localisation.\n +paysheet_services = []\n for service in service_module.objectValues():\n - base_cat = service.getVariationBaseCategoryList()\n - # A service is related to paysheet transaction if it has\n - # \'tax_category\' and \'salary_range\' as base category.\n - if \'tax_category\' in base_cat and \'salary_range\' in base_cat and service.getId() != \'labour\':\n + # Check service validity\n + # TODO: Use a validation workflow on Payroll Service and check the validity of a Service there\n + base_categories = service.getVariationBaseCategoryList()\n + if \'salary_range\' in base_categories and \'tax_category\' in base_categories:\n + # XXX add "and service.getId() != \'labour\':" ??\n paysheet_services.append(service)\n \n -# Sort the service list by id\n -paysheet_services.sort(lambda x, y: cmp(x.getId(), y.getId()))\n -\n -# generate all lines for the preview form\n -for serv in paysheet_services:\n - cat_list = serv.getCategoryList()\n - # store all categories of the service into lists\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 - # create a line for every salary_range of the service\n - for base in range_cat:\n - mycategory=context.portal_categories.resolveCategory(base)\n - if mycategory is None:\n - context.log("PaySheetTransaction_initializePreview","WARNING : category not found : %s" % base)\n +# Create the pre-calculation data structure\n +for service in paysheet_services:\n + # XXX Is there a better way to get categorylist ? Something like getCategoryList(base=\'tax_category\')\n + # will be nice to have.\n + service_categories = service.getCategoryList()\n + tax_categories = []\n + salary_range_categories = []\n + for category in service_categories:\n + if category.startswith(\'tax_category/\'): tax_categories.append(category)\n + elif category.startswith(\'salary_range/\'): salary_range_categories.append(category)\n + # Create a preview line for each salary_range of the service.\n + # This method is valid as long as we assume each line is composed of a base, an employee share\n + # and an employer share only.\n + for salary_range in salary_range_categories:\n + salary_range_object = context.portal_categories.resolveCategory(salary_range)\n + if salary_range_object is None:\n + context.log( "PaySheetTransaction_initializePreview"\n + , "WARNING! Category not found: %s" % salary_range\n + )\n else:\n - name = serv.getId() + \'/\' + mycategory.getId()\n - # a preview line is composed of a base calculation, an employee share rate and an employer share rate\n - if default_values.has_key(name):\n - new_base = default_values[name][\'base\']\n - new_employee_rate = default_values[name][\'employee_rate\']\n - new_employer_rate = default_values[name][\'employer_rate\']\n - # create a preview line for every salary_range value of the service\n - createPreviewLine( new_id = serv.getId()\n - , new_title = serv.getTitleOrId()\n - , new_base = new_base\n - , new_base_name = context.portal_categories.resolveCategory(base).getTitleOrId()\n - , new_employee_rate = new_employee_rate\n - , new_employer_rate = new_employer_rate\n - , new_service_url = serv.getRelativeUrl()\n - , new_organisation_url = serv.getSource()\n - , new_salary_range_cat = base\n - , new_tax_cat = tax_cat\n - )\n + preview_line_uid = "%s/%s" % (service.getId(), salary_range_object.getId())\n + d[preview_line_uid] = { \'service\' : service\n + , \'tax_categories\': tax_categories\n + , \'salary_range\' : salary_range\n + , \'employer_share\': None\n + , \'employee_share\': None\n + , \'base\' : None\n + }\n +\n +\n +\n +#########################################\n +# This part of the script select the right localized version of PaySheetTransaction_preCalculation_l10n script.\n +# TODO: implement here a generic method to get the right precalculation script automaticcaly.\n +#########################################\n +\n +# Force which script to use - BAD\n +country = \'fr\'\n +year = \'2006\'\n +\n +script_name = \'_\'.join([ "PaySheetTransaction_preCalculation_l10n"\n + , country\n + , year\n + ])\n +calculation_method = getattr(context, script_name)\n +\n +pre_calculation = calculation_method()\n +\n +# Merge pre_calculation and preview line dict\n +preview_line_keys = d.items()[0][1].keys()\n +for k in pre_calculation.keys():\n + if k in d.keys():\n + for required_key in preview_line_keys:\n + if not pre_calculation[k].has_key(required_key):\n + pre_calculation[k][required_key] = d[k][required_key]\n + else:\n + context.log( "PaySheetTransaction_initializePreview"\n + , "Preview line key \'%s\' not found in default services" % k\n + )\n + # Remove line\n + del pre_calculation[k]\n +\n +# Because all rates in the localized file are written in percents, we must convert them in pure floats.\n +for preview_line_uid in pre_calculation.keys():\n + # Only \'Fixed\' (or \'Forfait\' in french) base are expressed in percents\n + # TODO: base this test on "/forfait" string is bad. A more generic way must be found.\n + preview_line = pre_calculation[preview_line_uid]\n + if not preview_line_uid.endswith(\'/forfait\'):\n + # Fix percents\n + for share_type in [\'employer_share\', \'employee_share\']:\n + share_value = preview_line[share_type]\n + if share_value not in (\'\', None):\n + preview_line[share_type] = share_value / 100.0\n + # Normalize the value of \'Fixed\' (or \'Forfait\' in french) base to 1.0\n + else:\n + preview_line[\'base\'] = 1.0\n + pre_calculation[preview_line_uid] = preview_line\n +\n +# Create a preview line for every salary_range value of the service\n +portal_object = context.getPortalObject()\n +preview_line_list = []\n +num = 0\n +INT_LEN = 3\n +for (preview_line_id, preview_line_item) in pre_calculation.items():\n + num += 1\n + context.log("Kev dfsdfsdfsdff", repr((preview_line_id, preview_line_item)))\n + service = preview_line_item[\'service\']\n + salary_range = preview_line_item[\'salary_range\']\n + service_id = service.getId()\n + o = newTempBase(portal_object, service_id)\n + o.setUid( \'new_%s\' % zfill(num, INT_LEN)) # XXX There is a security issue here\n + o.edit(uid=\'new_%s\' % zfill(num, INT_LEN)) # XXX There is a security issue here\n + o.edit( id = service_id\n + , base = preview_line_item[\'base\']\n + , employer_share = preview_line_item[\'employer_share\']\n + , employee_share = preview_line_item[\'employee_share\']\n + , service_title = service.getTitleOrId()\n + , service_id = service_id\n + , salary_range = salary_range\n + , salary_range_title = context.portal_categories.resolveCategory(salary_range).getTitleOrId()\n + , tax_category = preview_line_item[\'tax_categories\']\n + )\n + preview_line_list.append(o)\n \n # return the list of preview lines\n -return l\n +return preview_line_list\n </string> </value> </item> <item> @@ -237,34 +278,47 @@ return l\n <string>newTempBase</string> <string>string</string> <string>zfill</string> + <string>d</string> <string>_getattr_</string> <string>context</string> - <string>portal_object</string> - <string>num</string> - <string>l</string> - <string>default_values</string> - <string>None</string> - <string>createPreviewLine</string> - <string>paysheet_services</string> <string>erp5site</string> <string>hasattr</string> <string>service_module</string> + <string>paysheet_services</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>name</string> + <string>base_categories</string> + <string>service_categories</string> + <string>tax_categories</string> + <string>salary_range_categories</string> + <string>category</string> + <string>salary_range</string> + <string>salary_range_object</string> + <string>None</string> + <string>preview_line_uid</string> + <string>_write_</string> + <string>country</string> + <string>year</string> + <string>script_name</string> + <string>getattr</string> + <string>calculation_method</string> + <string>pre_calculation</string> <string>_getitem_</string> - <string>new_base</string> - <string>new_employee_rate</string> - <string>new_employer_rate</string> + <string>preview_line_keys</string> + <string>k</string> + <string>required_key</string> + <string>preview_line</string> + <string>share_type</string> + <string>share_value</string> + <string>portal_object</string> + <string>preview_line_list</string> + <string>num</string> + <string>INT_LEN</string> + <string>preview_line_id</string> + <string>preview_line_item</string> + <string>repr</string> + <string>service_id</string> + <string>o</string> </tuple> </value> </item> diff --git a/bt5/erp5_payroll/SkinTemplateItem/portal_skins/erp5_payroll/PaySheetTransaction_preCalculation.xml b/bt5/erp5_payroll/SkinTemplateItem/portal_skins/erp5_payroll/PaySheetTransaction_preCalculation.xml deleted file mode 100644 index 4dd681eb345001e9b3b8cbce1e1d5b64933f96fc..0000000000000000000000000000000000000000 --- a/bt5/erp5_payroll/SkinTemplateItem/portal_skins/erp5_payroll/PaySheetTransaction_preCalculation.xml +++ /dev/null @@ -1,169 +0,0 @@ -<?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> - <none/> - </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># This script must select the right localized version of PaySheetTransaction_preCalculation\n -# depending of given parameters.\n -\n -# Force which script to use manually.\n -country = \'fr\'\n -year = \'2006\'\n -\n -script_name = \'_\'.join([ "PaySheetTransaction_preCalculation_l10n"\n - , country\n - , year\n - ])\n -calculation_method = getattr(context, script_name)\n -\n -return calculation_method(**kw)\n -</string> </value> - </item> - <item> - <key> <string>_code</string> </key> - <value> - <none/> - </value> - </item> - <item> - <key> <string>_filepath</string> </key> - <value> - <none/> - </value> - </item> - <item> - <key> <string>_owner</string> </key> - <value> - <none/> - </value> - </item> - <item> - <key> <string>_params</string> </key> - <value> <string>**kw</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>kw</string> - <string>country</string> - <string>year</string> - <string>_getattr_</string> - <string>script_name</string> - <string>getattr</string> - <string>context</string> - <string>calculation_method</string> - <string>_apply_</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</string> </value> - </item> - <item> - <key> <string>warnings</string> </key> - <value> - <tuple/> - </value> - </item> - </dictionary> - </pickle> - </record> -</ZopeData> diff --git a/bt5/erp5_payroll/SkinTemplateItem/portal_skins/erp5_payroll/PaySheetTransaction_preCalculation_l10n_fr_2006.xml b/bt5/erp5_payroll/SkinTemplateItem/portal_skins/erp5_payroll/PaySheetTransaction_preCalculation_l10n_fr_2006.xml index bf19f76855f01f28bb2c27aa48e189d1752b543f..19c5ad38362209e1619417d77da0135c6eb8501e 100644 --- a/bt5/erp5_payroll/SkinTemplateItem/portal_skins/erp5_payroll/PaySheetTransaction_preCalculation_l10n_fr_2006.xml +++ b/bt5/erp5_payroll/SkinTemplateItem/portal_skins/erp5_payroll/PaySheetTransaction_preCalculation_l10n_fr_2006.xml @@ -75,6 +75,7 @@ according french fiscal & social rules for a SME.\n """\n \n +kw = {}\n \n \n ##########################\n @@ -82,7 +83,6 @@ # This part depend mostly of the current localisation.\n ##########################\n \n -global paysheet\n paysheet = context.getObject()\n paysheet_type = paysheet.getPortalType()\n \n @@ -168,66 +168,13 @@ else:\n \n \n ##########################\n -# This part of the script create the data structure designed to hold the result of pre calculation.\n -# TODO: This part must be generic to be moved outside this localized script. Probably in PaySheetTransaction_preCalculation.\n -##########################\n -\n -# \'d\' is the dict which contain the default values of the Pay Sheet fast input\n -d = {}\n -\n -# During 06/2005 service module has been renamed service_module\n -# both names are supported\n -# XXX This should definitly use portal_catalog !!!\n -# XXX The following code will be deprecated when the Payroll Service portal type will be used\n -erp5site = context.portal_url.getPortalObject()\n -if hasattr(erp5site, \'payroll_service_module\'):\n - service_module = erp5site.payroll_service_module\n -elif hasattr(erp5site, \'service_module\'):\n - service_module = erp5site.service_module\n -else:\n - service_module = erp5site.service\n -\n -# Check service validity\n -# TODO: Use a validation workflow on Payroll Service and check the validity of a Service there\n -# TODO: Only choose services of the current localisation.\n -paysheet_services = []\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 -\n -\n -for service in paysheet_services:\n - # XXX Is there a better way to get categorylist ? Something like getCategoryList(base=\'tax_category\') will be nice to have.\n - service_categories = service.getCategoryList()\n - tax_categories = []\n - salary_range_categories = []\n - for category in service_categories:\n - if category.startswith(\'tax_category/\'): tax_categories.append(category)\n - elif category.startswith(\'salary_range/\'): salary_range_categories.append(category)\n - for salary_range in salary_range_categories:\n - salary_range_object = context.portal_categories.resolveCategory(salary_range)\n - if salary_range_object is None:\n - context.log( "PaySheetTransaction_preCalculation"\n - , "WARNING! Category not found: %s" % salary_range\n - )\n - else:\n - preview_line_uid = "%s/%s" % (service.getId(), salary_range_object.getId())\n - d[preview_line_uid] = { \'employer_rate\': None\n - , \'employee_rate\': None\n - , \'base\' : None\n - }\n -\n -\n -\n -##########################\n # This part of the script calculate the default salaey range and rates.\n # This part is the core of the script: all rates and amounts are defined below.\n #\n # Here is a model of a line definition:\n -# d[\'payroll_service_id/salary_range_category_id\'] = \\\n -# { \'employer_rate\' : employer_rate_in_percent\n -# , \'employee_rate\' : employee_rate_in_percent\n +# kw[\'payroll_service_id/salary_range_category_id\'] = \\\n +# { \'employer_share\': employer_rate_in_percent\n +# , \'employee_share\': employee_rate_in_percent\n # , \'base\' : contribution_base_in_currency\n # }\n # Rates and base must be floats.\n @@ -241,93 +188,93 @@ if executive:\n else:\n employer_rate = 13.10\n employee_rate = 0.75\n -d[\'sickness_insurance/salaire_brut\'] = \\\n -{ \'employer_rate\' : employer_rate\n -, \'employee_rate\' : employee_rate\n +kw[\'sickness_insurance/salaire_brut\'] = \\\n +{ \'employer_share\': employer_rate\n +, \'employee_share\': employee_rate\n , \'base\' : gross_salary\n }\n \n # Old-age insurance = Assurance vieillesse\n if executive:\n - d[\'oldage_insurance/salaire_plafonne\'] = \\\n - { \'employer_rate\' : None\n - , \'employee_rate\' : 6.65\n + kw[\'oldage_insurance/salaire_plafonne\'] = \\\n + { \'employer_share\': None\n + , \'employee_share\': 6.65\n , \'base\' : limited_salary\n }\n else:\n - d[\'oldage_insurance/salaire_brut\'] = \\\n - { \'employer_rate\' : 1.60\n - , \'employee_rate\' : 0.10\n + kw[\'oldage_insurance/salaire_brut\'] = \\\n + { \'employer_share\': 1.60\n + , \'employee_share\': 0.10\n , \'base\' : gross_salary\n }\n - d[\'oldage_insurance/salaire_plafonne\'] = \\\n - { \'employer_rate\' : 8.30\n - , \'employee_rate\' : 6.65\n + kw[\'oldage_insurance/salaire_plafonne\'] = \\\n + { \'employer_share\': 8.30\n + , \'employee_share\': 6.65\n , \'base\' : limited_salary\n }\n \n # Family benefits = Allocations familliale\n if not executive:\n - d[\'family_benefits/salaire_brut\'] = \\\n - { \'employer_rate\' : 5.40\n - , \'employee_rate\' : None\n + kw[\'family_benefits/salaire_brut\'] = \\\n + { \'employer_share\': 5.40\n + , \'employee_share\': None\n , \'base\' : gross_salary\n }\n \n # Industrial accident = Accidents du travail\n if not executive:\n - d[\'industrial_accident/salaire_brut\'] = \\\n - { \'employer_rate\' : 1.10\n - , \'employee_rate\' : None\n + kw[\'industrial_accident/salaire_brut\'] = \\\n + { \'employer_share\': 1.10\n + , \'employee_share\': None\n , \'base\' : gross_salary\n }\n \n # Lodging helps = Aide au logemenent\n # if company_size > 9:\n -# d[\'lodging_helps/salaire_brut\'] = \\\n -# { \'employer_rate\' : 0.40\n -# , \'employee_rate\' : None\n +# kw[\'lodging_helps/salaire_brut\'] = \\\n +# { \'employer_share\': 0.40\n +# , \'employee_share\': None\n # , \'base\' : gross_salary\n # }\n # else:\n -# d[\'lodging_helps/salaire_plafonne\'] = \\\n -# { \'employer_rate\' : 0.10\n -# , \'employee_rate\' : None\n +# kw[\'lodging_helps/salaire_plafonne\'] = \\\n +# { \'employer_share\': 0.10\n +# , \'employee_share\': 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 company_size > 9:\n - d[\'transport_payment/salaire_brut\'] = \\\n - { \'employer_rate\' : 1.80\n - , \'employee_rate\' : None\n + kw[\'transport_payment/salaire_brut\'] = \\\n + { \'employer_share\': 1.80\n + , \'employee_share\': None\n , \'base\' : gross_salary\n }\n \n # CSG\n -d[\'csg_deductible/salaire_brut_csg\'] = \\\n -{ \'employer_rate\' : None\n -, \'employee_rate\' : 5.10\n +kw[\'csg_deductible/salaire_brut_csg\'] = \\\n +{ \'employer_share\': None\n +, \'employee_share\': 5.10\n , \'base\' : 0.97 * gross_salary\n }\n -d[\'csg_non_deductible/salaire_brut_csg\'] = \\\n -{ \'employer_rate\' : None\n -, \'employee_rate\' : 2.9\n +kw[\'csg_non_deductible/salaire_brut_csg\'] = \\\n +{ \'employer_share\': None\n +, \'employee_share\': 2.9\n , \'base\' : 0.97 * gross_salary\n }\n \n # CRDS\n -# d[\'crds/salaire_brut_crds\'] = \\\n -# { \'employer_rate\' : None\n -# , \'employee_rate\' : 0.50\n +# kw[\'crds/salaire_brut_crds\'] = \\\n +# { \'employer_share\': None\n +# , \'employee_share\': 0.50\n # , \'base\' : 0.97 * gross_salary\n # }\n \n # Unemployment insurance = Assurance chomage\n -d[\'unemployment_insurance/salaire_brut\'] = \\\n -{ \'employer_rate\' : 4.04\n -, \'employee_rate\' : 2.44\n +kw[\'unemployment_insurance/salaire_brut\'] = \\\n +{ \'employer_share\': 4.04\n +, \'employee_share\': 2.44\n , \'base\' : gross_salary\n }\n \n @@ -336,18 +283,18 @@ d[\'unemployment_insurance/salaire_brut\'] = \\\n fngs_employer_rate = 0.25\n if start_date >= DateTime(2006, 7, 1):\n fngs_employer_rate = 0.15\n -d[\'fngs/salaire_brut\'] = \\\n -{ \'employer_rate\' : fngs_employer_rate\n -, \'employee_rate\' : None\n +kw[\'fngs/salaire_brut\'] = \\\n +{ \'employer_share\': fngs_employer_rate\n +, \'employee_share\': None\n , \'base\' : gross_salary\n }\n \n # ARRCO\n if not executive:\n if salary_slices.has_key(\'1\'):\n - d[\'arrco/tranche_1\'] = \\\n - { \'employer_rate\' : 4.5\n - , \'employee_rate\' : 3.0\n + kw[\'arrco/tranche_1\'] = \\\n + { \'employer_share\': 4.5\n + , \'employee_share\': 3.0\n , \'base\' : salary_slices[\'1\']\n }\n if salary_slices.has_key(\'2\'):\n @@ -357,43 +304,43 @@ if not executive:\n else:\n employee_share_rate = 8.0\n employer_share_rate = 12.0\n - d[\'arrco/tranche_2\'] = \\\n - { \'employer_rate\' : employer_share_rate\n - , \'employee_rate\' : employee_share_rate\n + kw[\'arrco/tranche_2\'] = \\\n + { \'employer_share\': employer_share_rate\n + , \'employee_share\': employee_share_rate\n , \'base\' : salary_slices[\'2\']\n }\n elif salary_slices.has_key(\'A\'):\n - d[\'arrco/tranche_a\'] = \\\n - { \'employer_rate\' : 4.5\n - , \'employee_rate\' : 3.0\n + kw[\'arrco/tranche_a\'] = \\\n + { \'employer_share\': 4.5\n + , \'employee_share\': 3.0\n , \'base\' : salary_slices[\'A\']\n }\n \n # AGFF\n if executive:\n if salary_slices.has_key(\'A\'):\n - d[\'agff_tranche_a/tranche_a\'] = \\\n - { \'employer_rate\' : 1.20\n - , \'employee_rate\' : 0.80\n + kw[\'agff_tranche_a/tranche_a\'] = \\\n + { \'employer_share\': 1.20\n + , \'employee_share\': 0.80\n , \'base\' : salary_slices[\'A\']\n }\n if salary_slices.has_key(\'B\'):\n - d[\'agff_tranche_b/tranche_b\'] = \\\n - { \'employer_rate\' : 1.30\n - , \'employee_rate\' : 0.90\n + kw[\'agff_tranche_b/tranche_b\'] = \\\n + { \'employer_share\': 1.30\n + , \'employee_share\': 0.90\n , \'base\' : salary_slices[\'B\']\n }\n else:\n if salary_slices.has_key(\'1\'):\n - d[\'agff_tranche_a/tranche_1\'] = \\\n - { \'employer_rate\' : 1.20\n - , \'employee_rate\' : 0.80\n + kw[\'agff_tranche_a/tranche_1\'] = \\\n + { \'employer_share\': 1.20\n + , \'employee_share\': 0.80\n , \'base\' : salary_slices[\'1\']\n }\n if salary_slices.has_key(\'2\'):\n - d[\'agff_tranche_b/tranche_2\'] = \\\n - { \'employer_rate\' : 1.30\n - , \'employee_rate\' : 0.90\n + kw[\'agff_tranche_b/tranche_2\'] = \\\n + { \'employer_share\': 1.30\n + , \'employee_share\': 0.90\n , \'base\' : salary_slices[\'2\']\n }\n \n @@ -401,82 +348,82 @@ else:\n # TODO: fix the repartition of share rate in case of slice C\n if executive:\n if salary_slices.has_key(\'B\'):\n - d[\'argic/tranche_b\'] = \\\n - { \'employer_rate\' : 12.60\n - , \'employee_rate\' : 7.70\n + kw[\'argic/tranche_b\'] = \\\n + { \'employer_share\': 12.60\n + , \'employee_share\': 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 - d[\'argic/tranche_c\'] = \\\n - { \'employer_rate\' : 10.15\n - , \'employee_rate\' : 10.15\n + kw[\'argic/tranche_c\'] = \\\n + { \'employer_share\': 10.15\n + , \'employee_share\': 10.15\n , \'base\' : salary_slices[\'C\']\n }\n \n # CET\n if executive:\n if salary_slices.has_key(\'A\'):\n - d[\'cet/tranche_a\'] = \\\n - { \'employer_rate\' : 0.22\n - , \'employee_rate\' : 0.13\n + kw[\'cet/tranche_a\'] = \\\n + { \'employer_share\': 0.22\n + , \'employee_share\': 0.13\n , \'base\' : salary_slices[\'A\']\n }\n if salary_slices.has_key(\'B\'):\n - d[\'cet/tranche_b\'] = \\\n - { \'employer_rate\' : 0.22\n - , \'employee_rate\' : 0.13\n + kw[\'cet/tranche_b\'] = \\\n + { \'employer_share\': 0.22\n + , \'employee_share\': 0.13\n , \'base\' : salary_slices[\'B\']\n }\n if salary_slices.has_key(\'C\'):\n - d[\'cet/tranche_c\'] = \\\n - { \'employer_rate\' : 0.22\n - , \'employee_rate\' : 0.13\n + kw[\'cet/tranche_c\'] = \\\n + { \'employer_share\': 0.22\n + , \'employee_share\': 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 -# d[\'life_insurance/tranche_a\'] = \\\n -# { \'employer_rate\' : 1.5\n -# , \'employee_rate\' : None\n +# kw[\'life_insurance/tranche_a\'] = \\\n +# { \'employer_share\': 1.5\n +# , \'employee_share\': None\n # , \'base\' : salary_slices[\'A\']\n # }\n \n # APEC forfaitaire\n if executive:\n - d[\'apec/forfait\'] = \\\n - { \'employer_rate\' : 3.72\n - , \'employee_rate\' : 2.49\n + kw[\'apec/forfait\'] = \\\n + { \'employer_share\': 3.72\n + , \'employee_share\': 2.49\n , \'base\' : 1.0\n }\n if salary_slices.has_key(\'B\'):\n - d[\'apec/tranche_b\'] = \\\n - { \'employer_rate\' : 0.036\n - , \'employee_rate\' : 0.024\n + kw[\'apec/tranche_b\'] = \\\n + { \'employer_share\': 0.036\n + , \'employee_share\': 0.024\n , \'base\' : salary_slices[\'B\']\n }\n \n # Retirement = Retraite Cadre forfaitaire\n if executive:\n - d[\'cavcic/forfait\'] = \\\n - { \'employer_rate\' : 35.62\n - , \'employee_rate\' : 21.21\n + kw[\'cavcic/forfait\'] = \\\n + { \'employer_share\': 35.62\n + , \'employee_share\': 21.21\n , \'base\' : 1.0\n }\n \n # construction tax\n # if company_size > 9:\n -# d[\'construction_tax/salaire_brut\'] = \\\n -# { \'employer_rate\' : 0.45\n -# , \'employee_rate\' : None\n +# kw[\'construction_tax/salaire_brut\'] = \\\n +# { \'employer_share\': 0.45\n +# , \'employee_share\': None\n # , \'base\' : gross_salary\n # }\n \n # training tax\n -# d[\'training_tax/salaire_brut\'] = \\\n -# { \'employer_rate\' : 0.50\n -# , \'employee_rate\' : None\n +# kw[\'training_tax/salaire_brut\'] = \\\n +# { \'employer_share\': 0.50\n +# , \'employee_share\': None\n # , \'base\' : gross_salary\n # }\n \n @@ -485,9 +432,9 @@ if executive:\n # rate = 0.15\n # else:\n # rate = 1.5\n -# d[\'courses_tax/salaire_brut\'] = \\\n -# { \'employer_rate\' : rate\n -# , \'employee_rate\' : None\n +# kw[\'courses_tax/salaire_brut\'] = \\\n +# { \'employer_share\': rate\n +# , \'employee_share\': None\n # , \'base\' : gross_salary\n # }\n \n @@ -501,9 +448,9 @@ if col_agr not in (None, \'\') and \'syntec\' in col_agr.lower():\n syntec_rate = 0.96\n if employee.getMaritalStatusId() == \'married\':\n syntec_rate *= 2\n - d[\'syntec_insurance/salaire_plafonne_syntec\'] = \\\n - { \'employer_rate\' : syntec_rate\n - , \'employee_rate\' : syntec_rate\n + kw[\'syntec_insurance/salaire_plafonne_syntec\'] = \\\n + { \'employer_share\': syntec_rate\n + , \'employee_share\': syntec_rate\n , \'base\' : ceiling_salary\n }\n \n @@ -513,19 +460,19 @@ if col_agr not in (None, \'\') and \'syntec\' in col_agr.lower():\n # * non-working days (= absences)\n # Thanks to this, the accountant has the freedom to add the missing amount of money\n # that this script can\'t guess.\n -d[\'retenue_maladie/forfait\'] = \\\n -{ \'employer_rate\' : None\n -, \'employee_rate\' : None\n +kw[\'retenue_maladie/forfait\'] = \\\n +{ \'employer_share\': None\n +, \'employee_share\': None\n , \'base\' : 1.0\n }\n -d[\'primes/forfait\'] = \\\n -{ \'employer_rate\' : None\n -, \'employee_rate\' : None\n +kw[\'primes/forfait\'] = \\\n +{ \'employer_share\': None\n +, \'employee_share\': None\n , \'base\' : 1.0\n }\n -d[\'absences/forfait\'] = \\\n -{ \'employer_rate\' : None\n -, \'employee_rate\' : None\n +kw[\'absences/forfait\'] = \\\n +{ \'employer_share\': None\n +, \'employee_share\': None\n , \'base\' : 1.0\n }\n \n @@ -533,27 +480,13 @@ d[\'absences/forfait\'] = \\\n # This tax can be calculated automaticcaly.\n # Because of lack of time we just let the accountant do the work.\n # See coresponding service description for more details.\n -d[\'reduction_fillon_forfait/forfait\'] = \\\n -{ \'employer_rate\' : None\n -, \'employee_rate\' : None\n +kw[\'reduction_fillon_forfait/forfait\'] = \\\n +{ \'employer_share\': None\n +, \'employee_share\': None\n , \'base\' : 1.0\n }\n \n -# Because all rates above are written in percents, we must convert them in pure floats.\n -# TODO: this part is generic, so move it to PaySheetTransaction_preCalculation script.\n -for line_id in d.keys():\n - # Only \'Fixed\' (or \'Forfait\' in french) base are expressed in percents\n - if not line_id.endswith(\'/forfait\'):\n - # Fix percents\n - for share_type in [\'employer_rate\', \'employee_rate\']:\n - share_value = d[line_id][share_type]\n - if share_value not in (\'\', None):\n - d[line_id][share_type] = share_value / 100.0\n - # Normalize the value of \'Fixed\' (or \'Forfait\' in french) base to 1.0\n - else:\n - d[line_id][\'base\'] = 1.0\n -\n -return d\n +return kw\n ]]></string> </value> @@ -610,6 +543,7 @@ return d\n <key> <string>co_varnames</string> </key> <value> <tuple> + <string>kw</string> <string>_getattr_</string> <string>context</string> <string>paysheet</string> @@ -644,22 +578,7 @@ return d\n <string>DateTime</string> <string>old_limit</string> <string>comp_type</string> - <string>d</string> - <string>erp5site</string> - <string>hasattr</string> - <string>service_module</string> - <string>paysheet_services</string> - <string>_getiter_</string> - <string>service</string> - <string>base_cat</string> - <string>service_categories</string> - <string>tax_categories</string> - <string>salary_range_categories</string> - <string>category</string> - <string>salary_range</string> - <string>salary_range_object</string> <string>None</string> - <string>preview_line_uid</string> <string>employer_rate</string> <string>employee_rate</string> <string>fngs_employer_rate</string> @@ -667,9 +586,6 @@ return d\n <string>employer_share_rate</string> <string>col_agr</string> <string>syntec_rate</string> - <string>line_id</string> - <string>share_type</string> - <string>share_value</string> </tuple> </value> </item>