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.
54 lines
1.9 KiB
Python
54 lines
1.9 KiB
Python
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
|
|
|
|
from .general import _state_applies, sit_wage
|
|
|
|
|
|
def mo_missouri_state_income_withholding(payslip, categories, worked_days, inputs):
|
|
"""
|
|
Returns SIT eligible wage and rate.
|
|
WAGE = GROSS + DED_FIT_EXEMPT
|
|
|
|
:return: result, result_rate (wage, percent)
|
|
"""
|
|
state_code = 'MO'
|
|
if not _state_applies(payslip, state_code):
|
|
return 0.0, 0.0
|
|
|
|
filing_status = payslip.dict.contract_id.us_payroll_config_value('mo_mow4_sit_filing_status')
|
|
if not filing_status:
|
|
return 0.0, 0.0
|
|
|
|
# Determine Wage
|
|
wage = sit_wage(payslip, categories)
|
|
if not wage:
|
|
return 0.0, 0.0
|
|
|
|
reduced_withholding = payslip.contract_id.us_payroll_config_value('mo_mow4_sit_withholding')
|
|
if reduced_withholding:
|
|
return wage, -((reduced_withholding / wage) * 100.0)
|
|
|
|
pay_periods = payslip.dict.get_pay_periods_in_year()
|
|
additional = payslip.dict.contract_id.us_payroll_config_value('state_income_tax_additional_withholding')
|
|
sit_table = payslip.dict.rule_parameter('us_mo_sit_rate')
|
|
deduction = payslip.dict.rule_parameter('us_mo_sit_deduction')[filing_status]
|
|
|
|
gross_taxable_income = wage * pay_periods
|
|
gross_taxable_income -= deduction
|
|
|
|
remaining_taxable_income = gross_taxable_income
|
|
withholding = 0.0
|
|
for amt, rate in sit_table:
|
|
amt = float(amt)
|
|
rate = rate / 100.0
|
|
if (remaining_taxable_income - amt) > 0.0 or (remaining_taxable_income - amt) == 0.0:
|
|
withholding += rate * amt
|
|
else:
|
|
withholding += rate * remaining_taxable_income
|
|
break
|
|
remaining_taxable_income = remaining_taxable_income - amt
|
|
|
|
withholding /= pay_periods
|
|
withholding += additional
|
|
withholding = round(withholding)
|
|
return wage, -((withholding / wage) * 100.0)
|