PaySheetTransaction_getDetails.py 6.74 KB
Newer Older
Jean-Paul Smets's avatar
Jean-Paul Smets committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
## Script (Python) "PaySheetTransaction_getDetails"
##bind container=container
##bind context=context
##bind namespace=
##bind script=script
##bind subpath=traverse_subpath
##parameters=
##title=
##
# this dict contain all paysheet details
paysheet_details = {}

# initialize the employee and employer share total
total_employee_share          = 0.0
total_employer_share          = 0.0
total_taxable_employee_share  = 0.0

# get the gross salary
gross_salary = context.getGrossSalary()
if gross_salary == None:
  gross_salary = 0.0

paysheet_cat = {}
object_list = []
for object in context.objectValues():
  object_list += [object]
# Sort the list by id since lines are already ordered by id.
object_list.sort(lambda x, y: cmp(int(x.getId()), int(y.getId())))
for pay_sheet_line in object_list:
  variation_list =  pay_sheet_line.getVariationCategoryList()
  range_variation = []
  for variation in variation_list:
    if variation.find('salary_range')==0:
      if not variation in range_variation: # Extra checking because
                                           # get VariationCategoryList returns
                                           # the same 1 items 2 times
        range_variation += [variation]
  for range in range_variation:
    pay_sheet_dict = {}
    #pay_sheet_dict['range']=range[range.rfind('/')+1:]
    pay_sheet_dict['id'] = pay_sheet_line.getId()
    pay_sheet_dict['title'] = pay_sheet_line.getResourceTitle()
    for cell in pay_sheet_line.objectValues():
      predicate_list = cell.getPredicateValueList()
      if range in predicate_list:
        pay_sheet_dict['base_name'] = context.portal_categories.resolveCategory(range).getTitleOrId()
        for predicate in predicate_list:
          if cell.getTotalPrice() != 0:
            if predicate.find('employee_share')>=0:
              pay_sheet_dict['base']= - cell.getQuantity()
              pay_sheet_dict['employee_share'] = cell.getTotalPrice()
              pay_sheet_dict['employee_share_rate'] = cell.getPrice() * 100
              total_employee_share += float(-pay_sheet_dict['employee_share'])
              # here we decide if a resource is taxable or not
              if str(pay_sheet_line.getResource())[-14:] == 'non_deductible' or str(pay_sheet_line.getResource())[-4:] == 'crds' or str(pay_sheet_line.getResource())[-7:] == 'taxable':
                pay_sheet_dict['taxable']='yes'
              elif str(pay_sheet_line.getResource())[-10:] == 'deductible':
                pay_sheet_dict['taxable']='no'
              else:
                pay_sheet_dict['taxable']='no'
              if pay_sheet_dict['taxable'] == 'yes':
                total_taxable_employee_share += float(-pay_sheet_dict['employee_share'])
            elif predicate.find('employer_share')>=0:
              pay_sheet_dict['base'] = - cell.getQuantity()
              pay_sheet_dict['employer_share'] = cell.getTotalPrice()
              pay_sheet_dict['employer_share_rate'] = cell.getPrice() * 100
              total_employer_share += float(-pay_sheet_dict['employer_share'])
    for key in ('employee_share','employee_share_rate','employer_share','employer_share_rate'):
      if not (pay_sheet_dict.has_key(key)):
        pay_sheet_dict[key]='' # so that we can display nothing

    # find the category of the current pay sheet line
    cat_id = None
    cat_path = None
    for var in variation_list:
      sub_cat = var.split('/')
      if sub_cat[0] == 'tax_category':
        cat_id = sub_cat[1]
        cat_path = sub_cat[0] + '/' + sub_cat[1]
        break
    if cat_id == None:
      cat_id = 'no_cat'
    # add the current pay sheet line to its category
    if not paysheet_cat.has_key(cat_id):
      paysheet_cat[cat_id] = {}
      paysheet_cat[cat_id]['lines'] = []
    if cat_path != None:
      paysheet_cat[cat_id]['title'] = context.portal_categories.resolveCategory(cat_path).getTitleOrId()
    paysheet_cat[cat_id]['lines'].append(pay_sheet_dict)

# get all paysheet transaction to calculate the sum of different value in a year
accounting_folder = context.aq_parent
paysheet_transactions = accounting_folder.contentValues(filter={'portal_type':'Pay Sheet Transaction'})

# initialize every yearly variable
yearly_net_salary           = 0.0
yearly_gross_salary         = 0.0
yearly_employee_share       = 0.0
yearly_employer_share       = 0.0
yearly_taxable_net_salary   = 0.0

# get the current paysheet start date and employee
start_date  = context.getStartDate()
employee    = context.restrictedTraverse(context.getDestinationSectionRelativeUrl())

# browse through paysheet transaction
for paysheet_obj in paysheet_transactions:
  # ignore the current paysheet to avoid infinite loop
  if paysheet_obj.getId() != context.getId():
    # the paysheet must have the same employee
    if (employee==None) or (employee!=None and context.restrictedTraverse(paysheet_obj.getDestinationSectionRelativeUrl())==employee):
      # check the date
      if (start_date==None) or (start_date!=None and paysheet_obj.getStartDate()!=None and start_date.year()==paysheet_obj.getStartDate().year() and paysheet_obj.getStartDate()<= start_date):
        # get all detailed values of the paysheet
        ps_details = paysheet_obj.PaySheetTransaction_getDetails()
        # sum of yearly values
        yearly_net_salary           += float(ps_details['net_salary'])
        yearly_gross_salary         += float(ps_details['gross_salary'])
        yearly_employee_share       += float(ps_details['total_employee_share'])
        yearly_employer_share       += float(ps_details['total_employer_share'])
        yearly_taxable_net_salary   += float(ps_details['taxable_net_salary'])

# save the total share values in the exported dict
paysheet_details['net_salary']                    = gross_salary - total_employee_share
paysheet_details['gross_salary']                  = gross_salary
paysheet_details['paysheet_categories']           = paysheet_cat
paysheet_details['total_employee_share']          = total_employee_share
paysheet_details['taxable_net_salary']            = paysheet_details['net_salary'] + total_taxable_employee_share
paysheet_details['total_employer_share']          = total_employer_share
paysheet_details['total_taxable_employee_share']  = total_taxable_employee_share

# don't forget to add the current values to the yearly sum
paysheet_details['yearly_net_salary']         = yearly_net_salary + paysheet_details['net_salary']
paysheet_details['yearly_gross_salary']       = yearly_gross_salary + paysheet_details['gross_salary']
paysheet_details['yearly_employee_share']     = yearly_employee_share + paysheet_details['total_employee_share']
paysheet_details['yearly_employer_share']     = yearly_employer_share + paysheet_details['total_employer_share']
paysheet_details['yearly_taxable_net_salary'] = yearly_taxable_net_salary + paysheet_details['taxable_net_salary']

return paysheet_details