## Script (Python) "PaySheetTransaction_preCalculation"
##bind container=container
##bind context=context
##bind namespace=
##bind script=script
##bind subpath=traverse_subpath
##parameters=ags_rate=None, industrial_accident_rate=None, transport_payment_rate=None, syntec_rate=None
##title=
##
True  = 1
False = 0

global paysheet
paysheet      = context.getObject()
paysheet_type = paysheet.getPortalType()

employee        = paysheet.getDestinationSection()
employee_object = paysheet.getDestinationSectionValue()
employer        = paysheet.getSourceSection()
employer_object = paysheet.getSourceSectionValue()


gross_salary = abs(paysheet.getGrossSalary())

# check if the employee is executive or not
if employee_object.getCareerGrade().split('/')[-1:][0] in ('engineer'):
  executive = True
else:
  executive = False

company_birth = employer_object.getCreationDate()

employer_region = employer_object.getDefaultAddress().getZipCode()[:2]

# get the number of person which are employed by the company ,
# sub_list = employer_object.getSubordinationRelatedValueList()
# company_size = 0
# for person in sub_list:
#   if person.getPortalType() == 'Person': # add condition: if current role == internal and defaultCareerEnd and defaultCareerStart fit in the current year
#     #print repr(person) + repr(person.getTitle())
#     company_size += 1
#
# print repr(company_size)
#
# return printed

company_size = 3


# limited salary = salaire plafonné
if gross_salary < 2432:     #!!! depending of the wage periodicity, 2432 euros is for a month
  limited_salary = gross_salary
else:
  limited_salary = 2432

# "Char" slice type
slice_a_value = 2432
slice_b_value = 9728
slice_c_value = 19456
char_slices = {}
if gross_salary < slice_a_value:
    char_slices['A'] = gross_salary
else:
    char_slices['A'] = slice_a_value
    if gross_salary < slice_b_value:
        char_slices['B'] = float(gross_salary) - float(slice_a_value)
    else:
        char_slices['B'] = slice_b_value
        if gross_salary < slice_c_value:
            char_slices['C'] = float(gross_salary) - float(slice_b_value)
        else:
            char_slices['C'] = slice_c_value

# "Number" slice type
slice_1_value = 2432
slice_2_value = 7296
num_slices = {}
if gross_salary < slice_1_value:
    char_slices['1'] = gross_salary
else:
    char_slices['1'] = slice_1_value
    if gross_salary < slice_2_value:
        char_slices['2'] = gross_salary - slice_1_value
    else:
        char_slices['2'] = slice_2_value

# age-slice of the company
old_limit = DateTime(1997, 1, 1)
if company_birth < old_limit:
  comp_type = 'old'
else:
  comp_type = 'new'


#################
# This script will fill the PaySheetTransaction_preview with default values for base salary calculation, employer and employee share
#################

default = {}
# initialize all variables to None
paysheet_services = []
erp5site = context.portal_url.getPortalObject()
for service in erp5site['service'].objectValues():
    base_cat = service.getVariationRangeBaseCategoryList()
    if 'tax_category' in base_cat and 'salary_range' in base_cat:
        paysheet_services.append(service)
for serv in paysheet_services:
    cat_list = serv.getCategoryList()
    tax_cat = []
    range_cat = []
    for cat in cat_list:
        if str(cat).find('tax_category') != -1:
            tax_cat.append(cat)
        if str(cat).find('salary_range') != -1:
            range_cat.append(cat)
    for base in range_cat:
        new_name = serv.getId() + '/' + context.portal_categories.resolveCategory(base).getId()
        default[new_name] = {'employer_rate':None,'employee_rate':None,'base':None}

# sickness insurance
if employer_region in ('57', '67', '68'):
    er = 1.70
else:
    er = 0.75
default['sickness_insurance/salaire_brut'] = \
{ 'employer_rate' : 12.80
, 'employee_rate' : er
, 'base'          : gross_salary
}

# old-age insurance
default['oldage_insurance/salaire_brut'] = \
{ 'employer_rate'          : 1.60
, 'employee_rate'          : None
, 'base'        : gross_salary
}
default['oldage_insurance/salaire_plafonne'] = \
{ 'employer_rate'  : 8.20
, 'employee_rate'  : 6.55
, 'base': limited_salary
}

# widowhood insurance
default['widowhood_insurance/salaire_brut'] = \
{ 'employer_rate'          : None
, 'employee_rate'          : 0.10
, 'base'        : gross_salary
}

# family benefits
default['family_benefits/salaire_brut'] = \
{ 'employer_rate'          : 5.40
, 'employee_rate'          : None
, 'base'        : gross_salary
}

# industrial accident
# 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)
if industrial_accident_rate in ('', 0, None):
    industrial_accident_rate = 1.0
default['industrial_accident/salaire_brut'] = \
{ 'employer_rate'          : industrial_accident_rate
, 'employee_rate'          : None
, 'base'        : gross_salary
}

# lodging helps
if company_size > 9:
    default['lodging_helps/salaire_brut'] = \
    { 'employer_rate'          : 0.40
    , 'employee_rate'          : None
    , 'base'        : gross_salary
    }
else:
    default['lodging_helps/salaire_plafonne'] = \
    { 'employer_rate'  : 0.10
    , 'employee_rate'          : None
    , 'base': limited_salary
    }

# transport payment
# TODO: rate depending of the town, 1.80 is the 'default' value (when the town isn't referenced by laws)
if transport_payment_rate in ('', 0, None):
    transport_payment_rate = 1.80
if company_size > 9:
    default['transport_payment/salaire_brut'] = \
    { 'employer_rate'          : transport_payment_rate
    , 'employee_rate'          : None
    , 'base'        : gross_salary
    }

# CSG
default['csg_deductible/salaire_brut_csg'] = \
{ 'employer_rate'      :None
, 'employee_rate'          :5.10
, 'base'    : 0.95 * gross_salary
}
default['csg_non_deductible/salaire_brut_csg'] = \
{ 'employer_rate'      :None,
 'employee_rate'      : 2.4
, 'base'    : 0.95 * gross_salary
}

# CRDS
default['crds/salaire_brut_crds'] = \
{ 'employer_rate':None,
'employee_rate'     : 0.50
, 'base'   : 0.95 * gross_salary
}

# unemployment insurance
if char_slices.has_key('A'):
    default['unemployment_insurance/tranche_a']['employer_rate']     = 4.0
    default['unemployment_insurance/tranche_a']['employee_rate']     = 2.4
    default['unemployment_insurance/tranche_a']['base']   = char_slices['A']
if char_slices.has_key('B'):
    default['unemployment_insurance/tranche_b']['employer_rate']     = 4.0
    default['unemployment_insurance/tranche_b']['employee_rate']     = 2.4
    default['unemployment_insurance/tranche_b']['base']   = char_slices['B']

# AGS
# ags_rate is a parameter of this script, 0.35% was the default value, now it's 0.45%
if ags_rate in ('', 0, None):
    ags_rate = 0.45
if char_slices.has_key('A'):
    default['ags/tranche_a']['employer_rate']      = ags_rate
    default['ags/tranche_a']['base']    = char_slices['A']
if char_slices.has_key('B'):
    default['ags/tranche_b']['employer_rate']      = ags_rate
    default['ags/tranche_b']['base']    = char_slices['B']

# ARRCO
if executive == False:
    if num_slices.has_key('1'):
        default['arrco/tranche_1']['employer_rate']    = 4.5
        default['arrco/tranche_1']['employee_rate']    = 3.0
        default['arrco/tranche_1']['base']  = num_slices['1']
    if num_slices.has_key('2'):
        if comp_type == 'old':
            employee_share_rate   = 6.0
            employer_share_rate = 9.0
        else:
            employee_share_rate   = 8.0
            employer_share_rate = 12.0
        default['arrco/tranche_2']['employer_rate']    = employer_share_rate
        default['arrco/tranche_2']['employee_rate']    = employee_share_rate
        default['arrco/tranche_2']['base']  = num_slices['2']
elif char_slices.has_key('A'):
    default['arrco/tranche_a']['employer_rate']    = 4.5
    default['arrco/tranche_a']['employee_rate']    = 3.0
    default['arrco/tranche_a']['base']  = char_slices['A']

# AGFF
if executive == True:
    if char_slices.has_key('A'):
        default['agff/tranche_a']['employer_rate']     = 1.20
        default['agff/tranche_a']['employee_rate']     = 0.80
        default['agff/tranche_a']['base']   = char_slices['A']
    if char_slices.has_key('B'):
        default['agff/tranche_b']['employer_rate']     = 1.30
        default['agff/tranche_b']['employee_rate']     = 0.90
        default['agff/tranche_b']['base']   = char_slices['B']
else:
    if num_slices.has_key('1'):
        default['agff/tranche_1']['employer_rate']     = 1.20
        default['agff/tranche_1']['employee_rate']     = 0.80
        default['agff/tranche_1']['base']   = num_slices['1']
    if num_slices.has_key('2'):
        default['agff/tranche_2']['employer_rate']     = 1.30
        default['agff/tranche_2']['employee_rate']     = 0.90
        default['agff/tranche_2']['base']   = num_slices['2']

# AGIRC
# TODO: fix the repartition of share rate in case of slice C
if executive == True:
    if char_slices.has_key('B'):
        default['agirc/tranche_b']['employer_rate']    = 12.50
        default['agirc/tranche_b']['employee_rate']    = 7.50
        default['agirc/tranche_b']['base']  = char_slices['B']
    if char_slices.has_key('C'):
        # free repartition (20% to share between employee & employer)
        default['agirc/tranche_b']['employer_rate']    = 10.00
        default['agirc/tranche_b']['employee_rate']    = 10.00
        default['agirc/tranche_b']['base']  = char_slices['C']

# CET
if executive == True:
    if char_slices.has_key('A'):
        default['cet/tranche_a']['employer_rate']    = 0.22
        default['cet/tranche_a']['employee_rate']    = 0.13
        default['cet/tranche_a']['base']  = char_slices['A']
    if char_slices.has_key('B'):
        default['cet/tranche_b']['employer_rate']    = 0.22
        default['cet/tranche_b']['employee_rate']    = 0.13
        default['cet/tranche_b']['base']  = char_slices['B']
    if char_slices.has_key('C'):
        default['cet/tranche_c']['employer_rate']    = 0.22
        default['cet/tranche_c']['employee_rate']    = 0.13
        default['cet/tranche_c']['base']  = char_slices['C']

# life insurance
if executive == True and char_slices.has_key('A'):
    default['life_insurance/tranche_a'] = \
    { 'employer_rate'      : 1.5
    , 'employee_rate': None
    , 'base'    : char_slices['A']
    }

# APEC
if char_slices.has_key('B'):
    default['apec/tranche_b'] = \
    { 'employer_rate'      : 0.036
    , 'employee_rate'      : 0.024
    , 'base'    : char_slices['B']
    }

# construction tax
if company_size > 9:
    default['construction_tax/salaire_brut'] = \
    { 'employer_rate'      : 0.45
    , 'employee_rate': None
    , 'base'    : gross_salary
    }

# training tax
default['training_tax/salaire_brut'] = \
{ 'employer_rate'      : 0.50
, 'employee_rate': None
, 'base'    : gross_salary
}

# courses tax
if company_size < 10:
    rate = 0.15
else:
    rate = 1.5
default['courses_tax/salaire_brut'] = \
{ 'employer_rate'      : rate
, 'employee_rate':None
, 'base'    : gross_salary
}

# Syntec convention
#syntec_rate = 0.915
# XXX If it is the paysheet of yoshinory , we do *2 because he is married.
# if married(employee) : syntec_rate = syntec_rate * 2
#syntec_rate = 1.83
if syntec_rate in ('', 0, None):
    syntec_rate = 0.915
default['syntec_insurance/salaire_plafonne_syntec'] = \
{ 'employer_rate'   : syntec_rate
, 'employee_rate'   : syntec_rate
, 'base' : 2432
}

return default