mirror of
https://gitlab.com/hibou-io/hibou-odoo/suite.git
synced 2025-01-20 12:37:31 +02:00
IMP l10n_us_hr_payroll Port l10n_us_ca_hr_payroll CA California including migration
This commit is contained in:
@@ -15,6 +15,7 @@ from .state.general import general_state_unemployment, \
|
||||
from .state.al_alabama import al_alabama_state_income_withholding
|
||||
from .state.ar_arkansas import ar_arkansas_state_income_withholding
|
||||
from .state.az_arizona import az_arizona_state_income_withholding
|
||||
from .state.ca_california import ca_california_state_income_withholding
|
||||
from .state.ct_connecticut import ct_connecticut_state_income_withholding
|
||||
from .state.ga_georgia import ga_georgia_state_income_withholding
|
||||
from .state.il_illinois import il_illinois_state_income_withholding
|
||||
@@ -63,6 +64,7 @@ class HRPayslip(models.Model):
|
||||
'al_alabama_state_income_withholding': al_alabama_state_income_withholding,
|
||||
'ar_arkansas_state_income_withholding': ar_arkansas_state_income_withholding,
|
||||
'az_arizona_state_income_withholding': az_arizona_state_income_withholding,
|
||||
'ca_california_state_income_withholding': ca_california_state_income_withholding,
|
||||
'ct_connecticut_state_income_withholding': ct_connecticut_state_income_withholding,
|
||||
'ga_georgia_state_income_withholding': ga_georgia_state_income_withholding,
|
||||
'il_illinois_state_income_withholding': il_illinois_state_income_withholding,
|
||||
|
||||
98
l10n_us_hr_payroll/models/state/ca_california.py
Normal file
98
l10n_us_hr_payroll/models/state/ca_california.py
Normal file
@@ -0,0 +1,98 @@
|
||||
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
|
||||
|
||||
from .general import _state_applies, sit_wage
|
||||
|
||||
MAX_ALLOWANCES = 10
|
||||
|
||||
|
||||
def ca_california_state_income_withholding(payslip, categories, worked_days, inputs):
|
||||
"""
|
||||
Returns SIT eligible wage and rate.
|
||||
|
||||
:return: result, result_rate (wage, percent)
|
||||
"""
|
||||
|
||||
state_code = 'CA'
|
||||
if not _state_applies(payslip, state_code):
|
||||
return 0.0, 0.0
|
||||
|
||||
# Determine Wage
|
||||
wage = sit_wage(payslip, categories)
|
||||
if not wage:
|
||||
return 0.0, 0.0
|
||||
|
||||
filing_status = payslip.contract_id.us_payroll_config_value('ca_de4_sit_filing_status')
|
||||
if not filing_status:
|
||||
return 0.0, 0.0
|
||||
|
||||
schedule_pay = payslip.contract_id.schedule_pay
|
||||
additional = payslip.contract_id.us_payroll_config_value('state_income_tax_additional_withholding')
|
||||
sit_allowances = payslip.contract_id.us_payroll_config_value('ca_de4_sit_allowances')
|
||||
additional_allowances = payslip.contract_id.us_payroll_config_value('ca_de4_sit_additional_allowances')
|
||||
low_income_exemption = payslip.rule_parameter('us_ca_sit_income_exemption_rate')[schedule_pay]
|
||||
estimated_deduction = payslip.rule_parameter('us_ca_sit_estimated_deduction_rate')[schedule_pay]
|
||||
tax_table = payslip.rule_parameter('us_ca_sit_tax_rate')[filing_status].get(schedule_pay)
|
||||
standard_deduction = payslip.rule_parameter('us_ca_sit_standard_deduction_rate')[schedule_pay]
|
||||
exemption_allowances = payslip.rule_parameter('us_ca_sit_exemption_allowance_rate')[schedule_pay]
|
||||
|
||||
low_income = False
|
||||
if filing_status == 'head_household':
|
||||
_, _, _, income = low_income_exemption
|
||||
if wage <= income:
|
||||
low_income = True
|
||||
elif filing_status == 'married':
|
||||
if sit_allowances >= 2:
|
||||
_, _, income, _ = low_income_exemption
|
||||
if wage <= income:
|
||||
low_income = True
|
||||
else:
|
||||
_, income, _, _ = low_income_exemption
|
||||
if wage <= income:
|
||||
low_income = True
|
||||
else:
|
||||
income, _, _, _ = low_income_exemption
|
||||
if wage <= income:
|
||||
low_income = True
|
||||
|
||||
withholding = 0.0
|
||||
taxable_wage = wage
|
||||
if not low_income:
|
||||
allowance_index = max(additional_allowances - 1, 0)
|
||||
if additional_allowances > MAX_ALLOWANCES:
|
||||
deduction = (estimated_deduction[0] * additional_allowances)
|
||||
taxable_wage -= deduction
|
||||
elif additional_allowances > 0:
|
||||
deduction = estimated_deduction[allowance_index]
|
||||
taxable_wage -= deduction
|
||||
|
||||
if filing_status == 'head_household':
|
||||
_, _, _, deduction = standard_deduction
|
||||
taxable_wage -= deduction
|
||||
elif filing_status == 'married':
|
||||
if sit_allowances >= 2:
|
||||
_, _, deduction, _ = standard_deduction
|
||||
taxable_wage -= deduction
|
||||
else:
|
||||
_, deduction, _, _ = standard_deduction
|
||||
taxable_wage -= deduction
|
||||
else:
|
||||
deduction, _, _, _ = standard_deduction
|
||||
taxable_wage -= deduction
|
||||
|
||||
over = 0.0
|
||||
for row in tax_table:
|
||||
if taxable_wage <= row[0]:
|
||||
withholding = ((taxable_wage - over) * row[1]) + row[2]
|
||||
break
|
||||
over = row[0]
|
||||
|
||||
allowance_index = sit_allowances - 1
|
||||
if sit_allowances > MAX_ALLOWANCES:
|
||||
deduction = exemption_allowances[0] * sit_allowances
|
||||
withholding -= deduction
|
||||
elif sit_allowances > 0:
|
||||
deduction = exemption_allowances[allowance_index]
|
||||
withholding -= deduction
|
||||
|
||||
withholding += additional
|
||||
return wage, -((withholding / wage) * 100.0)
|
||||
@@ -66,6 +66,17 @@ class HRContractUSPayrollConfig(models.Model):
|
||||
string='Arizona A-4 Withholding Percentage',
|
||||
help='A-4 1. (0.8 or 1.3 or 1.8 or 2.7 or 3.6 or 4.2 or 5.1 or 0 for exempt.')
|
||||
|
||||
ca_de4_sit_allowances = fields.Integer(string='California W-4 Allowances',
|
||||
help='CA W-4 3.')
|
||||
ca_de4_sit_additional_allowances = fields.Integer(string='California W-4 Additional Allowances',
|
||||
help='CA W-4 4(c).')
|
||||
ca_de4_sit_filing_status = fields.Selection([
|
||||
('', 'Exempt'),
|
||||
('single', 'Single or Married filing separately'),
|
||||
('married', 'Married filing jointly'),
|
||||
('head_household', 'Head of Household')
|
||||
], string='California W-4 Filing Status', help='CA W-4 1(c).')
|
||||
|
||||
ct_w4na_sit_code = fields.Selection([
|
||||
('a', 'A'),
|
||||
('b', 'B'),
|
||||
|
||||
Reference in New Issue
Block a user