Basic Salary
1
BASIC
none
code
result = payslip.paid_amount
Food Allowance
UNTAXED_FOOD_ALLOWANCE
11
python
result = 0 < version.l10n_ke_food_allowance <= payslip._rule_parameter('l10n_ke_food_alw_max')
code
result = version.l10n_ke_food_allowance
Airtime Allowance
UNTAXED_AIRTIME_ALLOWANCE
13
python
result = 0 < version.l10n_ke_airtime_allowance <= payslip._rule_parameter('l10n_ke_airtime_alw_max')
code
result = version.l10n_ke_airtime_allowance
Pension Allowance
UNTAXED_PENSION_ALLOWANCE
14
python
result = bool(version.l10n_ke_pension_allowance)
code
maximum = payslip._rule_parameter('l10n_ke_pension_alw_max')
result = min(maximum, version.l10n_ke_pension_allowance)
Untaxed Allowance
UNTAXED_ALLOWANCE
20
python
result = categories['KE_UT_ALW']
code
result = categories['KE_UT_ALW']
Food Allowance
TAXED_FOOD_ALLOWANCE
21
python
result = version.l10n_ke_food_allowance > payslip._rule_parameter('l10n_ke_food_alw_max')
code
result = version.l10n_ke_food_allowance
Airtime Allowance
TAXED_AIRTIME_ALLOWANCE
23
python
result = version.l10n_ke_airtime_allowance > payslip._rule_parameter('l10n_ke_airtime_alw_max')
code
result = version.l10n_ke_airtime_allowance
Pension Allowance
TAXED_PENSION_ALLOWANCE
24
python
result = version.l10n_ke_pension_allowance >= payslip._rule_parameter('l10n_ke_pension_alw_max')
code
result = version.l10n_ke_pension_allowance - payslip._rule_parameter('l10n_ke_pension_alw_max')
Commuter Allowance
TAXED_COMMUTER_ALLOWANCE
25
python
result = version.l10n_ke_commuter_allowance
code
result = version.l10n_ke_commuter_allowance
Housing Allowance
TAXED_HOUSING_ALLOWANCE
26
python
result = version.l10n_ke_housing_allowance_fixed if version.l10n_ke_housing_allowance_unit == 'fixed' else version.l10n_ke_housing_allowance_percentage
code
result = version.l10n_ke_housing_allowance_fixed if version.l10n_ke_housing_allowance_unit == 'fixed' else categories['BASIC']
result_rate = version.l10n_ke_housing_allowance_percentage if version.l10n_ke_housing_allowance_unit == 'percentage' else 100
Taxed Allowance
TAXED_ALLOWANCE
30
python
result = categories['KE_T_ALW']
code
result = categories['KE_T_ALW']
Fixed Bonus
BONUS
31
input
input
Fixed Commission
COMMISSION
32
input
input
Gross Salary
100
GROSS
none
code
result = categories['BASIC'] + categories['ALW']
Mortgage Interest
MORTGAGE
102
python
result = employee.l10n_ke_mortgage and not version.l10n_ke_is_secondary
code
result = employee.l10n_ke_mortgage
NSSF Tier 1 Employee Deduction
NSSF_EMPLOYEE_TIER_1
110
python
result = not (version.l10n_ke_is_secondary or payslip._l10n_ke_is_employee_at_least_60())
code
lower_limit = payslip._rule_parameter('l10n_ke_nssf_lower_limit')
pensionable = categories['BASIC'] + categories['COMMISSIONS']
result = min(lower_limit, pensionable)
result_rate = 6
NSSF Tier 2 Employee Deduction
NSSF_EMPLOYEE_TIER_2
111
python
result = not (version.l10n_ke_is_secondary or payslip._l10n_ke_is_employee_at_least_60())
code
lower_limit = payslip._rule_parameter('l10n_ke_nssf_lower_limit')
upper_limit = payslip._rule_parameter('l10n_ke_nssf_upper_limit')
pensionable = categories['BASIC'] + categories['COMMISSION']
result = 0
if upper_limit < pensionable:
result = (upper_limit - lower_limit)
elif lower_limit < pensionable:
result = (pensionable - lower_limit)
result_rate = 6
AHL Amount
AHL_AMOUNT
120
none
code
result = categories['BASIC'] - employee.disabled * payslip._rule_parameter('l10n_ke_disability_threshold')
result_rate = payslip._rule_parameter('l10n_ke_ahl_employee') * 100
NSSF Amount
NSSF_AMOUNT
121
python
result = not (version.l10n_ke_is_secondary or payslip._l10n_ke_is_employee_at_least_60())
code
result = result_rules['NSSF_EMPLOYEE_TIER_1']['total'] + result_rules['NSSF_EMPLOYEE_TIER_2']['total']
NHIF Amount (Hidden)
NHIF_AMOUNT_HIDDEN
122
python
result = not version.l10n_ke_is_secondary and payslip._rule_parameter('l10n_ke_nhif')
code
basic = categories['BASIC']
result = 0
for high, rate in payslip._rule_parameter('l10n_ke_nhif'):
if basic < float(high):
result = rate
break
NHIF Amount
NHIF_AMOUNT
123
python
result = not version.l10n_ke_is_secondary and result_rules['NHIF_AMOUNT_HIDDEN']['total']
code
result = result_rules['NHIF_AMOUNT_HIDDEN']['total']
SHIF Amount
SHIF_AMOUNT
125
python
result = not version.l10n_ke_is_secondary and payslip._rule_parameter('l10n_ke_shif_rate')
code
gross = result_rules['GROSS']['total']
result = 0
if gross < float(payslip._rule_parameter('l10n_ke_shif_min_gross')):
result = payslip._rule_parameter('l10n_ke_shif_min_amount')
else:
result = payslip._rule_parameter('l10n_ke_shif_rate') * gross
Gross Taxable
GROSS_TAXABLE
130
none
code
total_pension = result_rules['NSSF_AMOUNT']['total'] + version.l10n_ke_pension_contribution
max_pension_contribution = payslip._rule_parameter('l10n_ke_max_pension_contribution')
non_taxable_pension = min(total_pension, max_pension_contribution) - max(0, version.l10n_ke_pension_allowance - payslip._rule_parameter('l10n_ke_pension_alw_max'))
result = result_rules['GROSS']['total'] - categories['KE_UT_ALW'] - employee.l10n_ke_mortgage - non_taxable_pension
if payslip.date_to >= datetime(2024,12,27).date():
result -= result_rules['SHIF_AMOUNT']['total'] + result_rules['AHL_AMOUNT']['total']
Income Tax
INCOME_TAX
131
none
code
if version.l10n_ke_is_secondary:
result = result_rules['GROSS_TAXABLE']['total']
result_rate = payslip._rule_parameter('l10n_ke_income_tax_secondary')
else:
remaining_gross = result_rules['GROSS_TAXABLE']['total']
income_tax_breakdown = payslip._rule_parameter('l10n_ke_income_tax_breakdown')
income_tax = 0
for amount, coefficient in income_tax_breakdown:
deduced_fraction = min(float(amount), remaining_gross)
income_tax += deduced_fraction * coefficient
remaining_gross -= deduced_fraction
if remaining_gross <= 0:
break
result = income_tax
NHIF Relief
NHIF_RELIEF
142
python
result = result_rules['NHIF_AMOUNT_HIDDEN']['total'] and not version.l10n_ke_is_secondary
code
result = result_rules['NHIF_AMOUNT_HIDDEN']['total']
result_rate = -15
#77767B
Medical Insurance Relief
MED_INSURANCE_RELIEF
143
python
result = version.l10n_ke_voluntary_medical_insurance and not version.l10n_ke_is_secondary
code
result = version.l10n_ke_voluntary_medical_insurance
result_rate = -15
#77767B
Life Insurance Relief
LIFE_INSURANCE_RELIEF
144
python
result = version.l10n_ke_life_insurance and not version.l10n_ke_is_secondary
code
result = version.l10n_ke_life_insurance
result_rate = -15
#77767B
Education Relief
EDUCATION_RELIEF
145
python
result = version.l10n_ke_education and not version.l10n_ke_is_secondary
code
result = version.l10n_ke_education
result_rate = -15
#77767B
Total Insurance Reliefs
INSURANCE_RELIEF
146
python
result = categories['INS_RELIEF'] and not version.l10n_ke_is_secondary
code
result = - min(
payslip._rule_parameter('l10n_ke_insurance_relief_max'),
-categories['INS_RELIEF']
)
AHL Relief
AHL_RELIEF
147
python
result = payslip.date_from >= datetime(2024, 3, 19).date() and payslip.date_to < datetime(2024,12,27).date() and not version.l10n_ke_is_secondary
code
if payslip._rule_parameter('l10n_ke_ahl_relief_cap') < result_rules['AHL_AMOUNT']['total'] * payslip._rule_parameter('l10n_ke_ahl_relief_rate'):
result = - payslip._rule_parameter('l10n_ke_ahl_relief_cap')
else:
result = result_rules['AHL_AMOUNT']['total']
result_rate = - payslip._rule_parameter('l10n_ke_ahl_relief_rate') * 100
Personal Relief
PERS_RELIEF
148
python
result = payslip._rule_parameter('l10n_ke_personal_relief') and not version.l10n_ke_is_secondary
code
result = - payslip._rule_parameter('l10n_ke_personal_relief')
P.A.Y.E.
PAYE
150
python
result = result_rules['GROSS_TAXABLE']['total'] >= 24000
code
result = max(result_rules['INCOME_TAX']['total'] + categories['RELIEF'], 0)
Statutory Deductions
STATUTORY_DED
151
python
result = categories['STATUTORY_DED']
code
result = categories['STATUTORY_DED']
HELB
HELB
152
python
result = 'HELB' in inputs and not version.l10n_ke_is_secondary
input
Voluntary Medical Insurance
MED_INSURANCE
153
python
result = version.l10n_ke_voluntary_medical_insurance and not version.l10n_ke_is_secondary
code
result = version.l10n_ke_voluntary_medical_insurance
Life Insurance
LIFE_INSURANCE
154
python
result = version.l10n_ke_life_insurance and not version.l10n_ke_is_li_managed_by_employee and not version.l10n_ke_is_secondary
code
result = version.l10n_ke_life_insurance
Education
EDUCATION
155
python
result = version.l10n_ke_education and not version.l10n_ke_is_secondary
code
result = version.l10n_ke_education
Pension Contribution
NSSF_EMPLOYEE_TIER_3
156
python
result = version.l10n_ke_pension_contribution and not version.l10n_ke_is_secondary
percentage
version.l10n_ke_pension_contribution
100
Fringe Benefit
FRINGE_BENEFIT
157
python
result = 'FRINGE_BENEFIT' in inputs and not version.l10n_ke_is_secondary
input
Other Deductions
OTHER_DED
158
python
result = categories['OTHER_DED']
code
result = categories['OTHER_DED']
Attachment of Salary
75
ATTACH_SALARY
python
result = 'ATTACH_SALARY' in inputs
code
result = inputs['ATTACH_SALARY'].amount
result_name = inputs['ATTACH_SALARY'].name
Assignment of Salary
76
ASSIG_SALARY
python
result = 'ASSIG_SALARY' in inputs
code
result = inputs['ASSIG_SALARY'].amount
result_name = inputs['ASSIG_SALARY'].name
Child Support
CHILD_SUPPORT
code
77
python
result = 'CHILD_SUPPORT' in inputs
result = inputs['CHILD_SUPPORT'].amount
result_name = inputs['CHILD_SUPPORT'].name
Deduction
78
DEDUCTION
python
result = 'DEDUCTION' in inputs
code
result = inputs['DEDUCTION'].amount
result_name = inputs['DEDUCTION'].name
Total Deductions
TOTAL_DED
159
python
result = categories['TOTAL_DED']
code
result = categories['TOTAL_DED']
NITA Employer Cost
NITA
160
code
result = payslip._rule_parameter('l10n_ke_nita')
NSSF Employer Cost
NSSF_EMP
161
python
result = not (version.l10n_ke_is_secondary or payslip._l10n_ke_is_employee_at_least_60())
code
result = result_rules['NSSF_AMOUNT']['total']
AHL Amount (employer)
AHL_AMOUNT_EMP
162
none
code
result = categories['BASIC'] - employee.disabled * payslip._rule_parameter('l10n_ke_disability_threshold')
result_rate = payslip._rule_parameter('l10n_ke_ahl_employer') * 100
Non-Cash Benefit
NON_CASH_BENEFIT
163
python
result = 'NON_CASH_BENEFIT' in inputs
code
result = inputs['NON_CASH_BENEFIT'].amount
result_name = inputs['NON_CASH_BENEFIT'].name
Reimbursement
199
REIMBURSEMENT
python
result = 'REIMBURSEMENT' in inputs
code
result = inputs['REIMBURSEMENT'].amount
result_name = inputs['REIMBURSEMENT'].name
Net Salary
200
NET
none
code
result = result_rules['GROSS']['total'] - result_rules['TOTAL_DED']['total'] + categories['EXEMPTION'] + result_rules['NON_CASH_BENEFIT']['total']