mirror of
https://gitlab.com/hibou-io/hibou-odoo/suite.git
synced 2025-01-20 12:37:31 +02:00
This release fixes multiple logical problems with Odoo's payroll, including the difference in behavior on payslips with 'recursive' category calculations needed for many.
80 lines
3.0 KiB
Python
80 lines
3.0 KiB
Python
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
|
|
|
|
|
|
def futa_wage(payslip, categories):
|
|
"""
|
|
Returns FUTA eligible wage for current Payslip (no wage_base, just by categories)
|
|
WAGE = GROSS - ALW_FUTA_EXEMPT + DED_FUTA_EXEMPT
|
|
:return: wage
|
|
"""
|
|
wage = categories.GROSS
|
|
|
|
wage -= categories.ALW_FUTA_EXEMPT + \
|
|
categories.ALW_FIT_FUTA_EXEMPT + \
|
|
categories.ALW_FIT_FICA_FUTA_EXEMPT + \
|
|
categories.ALW_FICA_FUTA_EXEMPT
|
|
|
|
wage += categories.DED_FUTA_EXEMPT + \
|
|
categories.DED_FIT_FUTA_EXEMPT + \
|
|
categories.DED_FIT_FICA_FUTA_EXEMPT + \
|
|
categories.DED_FICA_FUTA_EXEMPT
|
|
|
|
return wage
|
|
|
|
|
|
def futa_wage_ytd(payslip, categories):
|
|
"""
|
|
Returns Year to Date FUTA eligible wages
|
|
WAGE = GROSS - ALW_FUTA_EXEMPT + DED_FUTA_EXEMPT
|
|
:return: wage
|
|
"""
|
|
year = payslip.dict.get_year()
|
|
ytd_wage = payslip.sum_category('GROSS', str(year) + '-01-01', str(year+1) + '-01-01')
|
|
|
|
ytd_wage -= payslip.sum_category('ALW_FUTA_EXEMPT', str(year) + '-01-01', str(year+1) + '-01-01') + \
|
|
payslip.sum_category('ALW_FIT_FUTA_EXEMPT', str(year) + '-01-01', str(year+1) + '-01-01') + \
|
|
payslip.sum_category('ALW_FIT_FICA_FUTA_EXEMPT', str(year) + '-01-01', str(year+1) + '-01-01') + \
|
|
payslip.sum_category('ALW_FICA_FUTA_EXEMPT', str(year) + '-01-01', str(year+1) + '-01-01')
|
|
|
|
ytd_wage += payslip.sum_category('DED_FUTA_EXEMPT', str(year) + '-01-01', str(year+1) + '-01-01') + \
|
|
payslip.sum_category('DED_FIT_FUTA_EXEMPT', str(year) + '-01-01', str(year+1) + '-01-01') + \
|
|
payslip.sum_category('DED_FIT_FICA_FUTA_EXEMPT', str(year) + '-01-01', str(year+1) + '-01-01') + \
|
|
payslip.sum_category('DED_FICA_FUTA_EXEMPT', str(year) + '-01-01', str(year+1) + '-01-01')
|
|
|
|
ytd_wage += payslip.dict.contract_id.external_wages
|
|
return ytd_wage
|
|
|
|
|
|
def er_us_940_futa(payslip, categories, worked_days, inputs):
|
|
"""
|
|
Returns FUTA eligible wage and rate.
|
|
:return: result, result_rate (wage, percent)
|
|
"""
|
|
|
|
# Determine Rate.
|
|
if payslip.dict.contract_id.futa_type == payslip.dict.contract_id.FUTA_TYPE_EXEMPT:
|
|
# Exit early
|
|
return 0.0, 0.0
|
|
elif payslip.dict.contract_id.futa_type == payslip.dict.contract_id.FUTA_TYPE_BASIC:
|
|
result_rate = -payslip.dict.rule_parameter('fed_940_futa_rate_basic')
|
|
else:
|
|
result_rate = -payslip.dict.rule_parameter('fed_940_futa_rate_normal')
|
|
|
|
# Determine Wage
|
|
wage = futa_wage(payslip, categories)
|
|
if not wage:
|
|
return 0.0, 0.0
|
|
|
|
ytd_wage = futa_wage_ytd(payslip, categories)
|
|
wage_base = payslip.dict.rule_parameter('fed_940_futa_wage_base')
|
|
remaining = wage_base - ytd_wage
|
|
|
|
if remaining < 0.0:
|
|
result = 0.0
|
|
elif remaining < wage:
|
|
result = remaining
|
|
else:
|
|
result = wage
|
|
|
|
return result, result_rate
|