Merge branch 'mig/14.0/l10n_us_hr_payroll_401k' into '14.0'

mig/14.0/l10n_us_hr_payroll_401k into 14.0

See merge request hibou-io/hibou-odoo/suite!700
This commit is contained in:
Jared Kipe
2020-11-24 02:29:08 +00:00
220 changed files with 22681 additions and 0 deletions

View File

@@ -0,0 +1 @@
from . import models

View File

@@ -0,0 +1,27 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
{
'name': 'Hibou Payroll',
'author': 'Hibou Corp. <hello@hibou.io>',
'version': '14.0.1.0.0',
'category': 'Payroll Localization',
'depends': [
'hr_payroll',
'hr_contract_reports',
'hibou_professional',
],
'description': """
Hibou Payroll
=============
Base module for fixing specific qwerks or assumptions in the way Payroll Odoo Enterprise Edition behaves.
""",
'data': [
'views/res_config_settings_views.xml',
],
'demo': [
],
'auto_install': True,
'license': 'OPL-1',
}

View File

@@ -0,0 +1,4 @@
from . import browsable_object
from . import hr_payslip
from . import hr_salary_rule
from . import res_config_settings

View File

@@ -0,0 +1,151 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from odoo import fields
from odoo.addons.hr_payroll.models import browsable_object
class BrowsableObject(object):
def __init__(self, employee_id, dict, env):
self.employee_id = employee_id
self.dict = dict
self.env = env
# Customization to allow changing the behavior of the discrete browsable objects.
# you can think of this as 'compiling' the query based on the configuration.
sum_field = env['ir.config_parameter'].sudo().get_param('hr_payroll.payslip.sum_behavior', 'date_from')
if sum_field == 'date' and 'date' not in env['hr.payslip']:
# missing attribute, closest by definition
sum_field = 'date_to'
if not sum_field:
sum_field = 'date_from'
self._compile_browsable_query(sum_field)
def __getattr__(self, attr):
return attr in self.dict and self.dict.__getitem__(attr) or 0.0
def __getitem__(self, key):
return self.dict[key] or 0.0
def _compile_browsable_query(self, sum_field):
pass
class InputLine(BrowsableObject):
"""a class that will be used into the python code, mainly for usability purposes"""
def _compile_browsable_query(self, sum_field):
self.__browsable_query = """
SELECT sum(amount) as sum
FROM hr_payslip as hp, hr_payslip_input as pi
WHERE hp.employee_id = %s AND hp.state = 'done'
AND hp.{sum_field} >= %s AND hp.date_to <= %s AND hp.id = pi.payslip_id AND pi.code = %s""".format(sum_field=sum_field)
def sum(self, code, from_date, to_date=None):
if to_date is None:
to_date = fields.Date.today()
self.env.cr.execute(self.__browsable_query, (self.employee_id, from_date, to_date, code))
return self.env.cr.fetchone()[0] or 0.0
class WorkedDays(BrowsableObject):
"""a class that will be used into the python code, mainly for usability purposes"""
def _compile_browsable_query(self, sum_field):
self.__browsable_query = """
SELECT sum(number_of_days) as number_of_days, sum(number_of_hours) as number_of_hours
FROM hr_payslip as hp, hr_payslip_worked_days as pi
WHERE hp.employee_id = %s AND hp.state = 'done'
AND hp.{sum_field} >= %s AND hp.date_to <= %s AND hp.id = pi.payslip_id AND pi.code = %s""".format(sum_field=sum_field)
def _sum(self, code, from_date, to_date=None):
if to_date is None:
to_date = fields.Date.today()
self.env.cr.execute(self.__browsable_query, (self.employee_id, from_date, to_date, code))
return self.env.cr.fetchone()
def sum(self, code, from_date, to_date=None):
res = self._sum(code, from_date, to_date)
return res and res[0] or 0.0
def sum_hours(self, code, from_date, to_date=None):
res = self._sum(code, from_date, to_date)
return res and res[1] or 0.0
class Payslips(BrowsableObject):
"""a class that will be used into the python code, mainly for usability purposes"""
def _compile_browsable_query(self, sum_field):
# Note that the core odoo has this as `hp.credit_note = False` but what if it is NULL?
# reverse of the desired behavior.
self.__browsable_query_rule = """
SELECT sum(case when hp.credit_note is not True then (pl.total) else (-pl.total) end)
FROM hr_payslip as hp, hr_payslip_line as pl
WHERE hp.employee_id = %s AND hp.state = 'done'
AND hp.{sum_field} >= %s AND hp.date_to <= %s AND hp.id = pl.slip_id AND pl.code = %s""".format(sum_field=sum_field)
# Original (non-recursive)
# self.__browsable_query_category = """
# SELECT sum(case when hp.credit_note is not True then (pl.total) else (-pl.total) end)
# FROM hr_payslip as hp, hr_payslip_line as pl, hr_salary_rule_category as rc
# WHERE hp.employee_id = %s AND hp.state = 'done'
# AND hp.{sum_field} >= %s AND hp.date_to <= %s AND hp.id = pl.slip_id
# AND rc.id = pl.category_id AND rc.code = %s""".format(sum_field=sum_field)
# Hibou Recursive version
self.__browsable_query_category = """
WITH RECURSIVE
category_by_code as (
SELECT id
FROM hr_salary_rule_category
WHERE code = %s
),
category_ids as (
SELECT COALESCE((SELECT id FROM category_by_code), -1) AS id
UNION ALL
SELECT rc.id
FROM hr_salary_rule_category AS rc
JOIN category_ids AS rcs ON rcs.id = rc.parent_id
)
SELECT sum(case when hp.credit_note is not True then (pl.total) else (-pl.total) end)
FROM hr_payslip as hp, hr_payslip_line as pl
WHERE hp.employee_id = %s AND hp.state = 'done'
AND hp.{sum_field} >= %s AND hp.date_to <= %s AND hp.id = pl.slip_id
AND pl.category_id in (SELECT id from category_ids)""".format(sum_field=sum_field)
def sum(self, code, from_date, to_date=None):
if to_date is None:
to_date = fields.Date.today()
self.env.cr.execute(self.__browsable_query_rule, (self.employee_id, from_date, to_date, code))
res = self.env.cr.fetchone()
return res and res[0] or 0.0
def rule_parameter(self, code):
return self.env['hr.rule.parameter']._get_parameter_from_code(code, self.dict.date_to)
def sum_category(self, code, from_date, to_date=None):
if to_date is None:
to_date = fields.Date.today()
self.env['hr.payslip'].flush(['credit_note', 'employee_id', 'state', 'date_from', 'date_to'])
self.env['hr.payslip.line'].flush(['total', 'slip_id', 'category_id'])
self.env['hr.salary.rule.category'].flush(['code'])
# standard version
# self.env.cr.execute(self.__browsable_query_category, (self.employee_id, from_date, to_date, code))
# recursive category version
self.env.cr.execute(self.__browsable_query_category, (code, self.employee_id, from_date, to_date))
res = self.env.cr.fetchone()
return res and res[0] or 0.0
@property
def paid_amount(self):
return self.dict._get_paid_amount()
# Patch over Core
browsable_object.BrowsableObject.__init__ = BrowsableObject.__init__
browsable_object.BrowsableObject._compile_browsable_query = BrowsableObject._compile_browsable_query
browsable_object.InputLine._compile_browsable_query = InputLine._compile_browsable_query
browsable_object.InputLine.sum = InputLine.sum
browsable_object.WorkedDays._compile_browsable_query = WorkedDays._compile_browsable_query
browsable_object.WorkedDays.sum = WorkedDays.sum
browsable_object.Payslips._compile_browsable_query = Payslips._compile_browsable_query
browsable_object.Payslips.sum = Payslips.sum
browsable_object.Payslips.sum_category = Payslips.sum_category

View File

@@ -0,0 +1,14 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from odoo import fields, models
class HrPayslip(models.Model):
_inherit = 'hr.payslip'
def get_year(self):
"""
# Helper method to get the year (normalized between Odoo Versions)
:return: int year of payslip
"""
return self.date_to.year

View File

@@ -0,0 +1,19 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from odoo import fields, models
class HrPayrollStructure(models.Model):
_inherit = 'hr.payroll.structure'
schedule_pay = fields.Selection(selection_add=[
('semi-monthly', 'Semi-monthly'),
], ondelete={'semi-monthly': 'set null'})
class HrPayrollStructureType(models.Model):
_inherit = 'hr.payroll.structure.type'
default_schedule_pay = fields.Selection(selection_add=[
('semi-monthly', 'Semi-monthly'),
])

View File

@@ -0,0 +1,28 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from odoo import fields, models
class ResConfigSettings(models.TransientModel):
_inherit = 'res.config.settings'
# TODO We need MORE here...
module_l10n_us_hr_payroll = fields.Boolean(string='USA Payroll')
module_l10n_us_hr_payroll_401k = fields.Boolean(string='USA Payroll 401k')
payslip_sum_type = fields.Selection([
('date_from', 'Date From'),
('date_to', 'Date To'),
('date', 'Accounting Date'),
], 'Payslip Sum Behavior', help="Behavior for what payslips are considered "
"during rule execution. Stock Odoo behavior "
"would not consider a payslip starting on 2019-12-30 "
"ending on 2020-01-07 when summing a 2020 payslip category.\n\n"
"Accounting Date requires Payroll Accounting and will "
"fall back to date_to as the 'closest behavior'.",
config_parameter='hr_payroll.payslip.sum_behavior')
def set_values(self):
super(ResConfigSettings, self).set_values()
self.env['ir.config_parameter'].set_param('hr_payroll.payslip.sum_behavior',
self.payslip_sum_type or 'date_from')

View File

@@ -0,0 +1,5 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from . import common
from . import test_special

153
hr_payroll_hibou/tests/common.py Executable file
View File

@@ -0,0 +1,153 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from logging import getLogger
from sys import float_info as sys_float_info
from collections import defaultdict
from odoo.tests import common
from odoo.tools.float_utils import float_round as odoo_float_round
def process_payslip(payslip):
try:
payslip.action_payslip_done()
except AttributeError:
# v9
payslip.process_sheet()
class TestPayslip(common.TransactionCase):
debug = False
_logger = getLogger(__name__)
def setUp(self):
super(TestPayslip, self).setUp()
self.contract_model = self.env['hr.contract']
self.env.user.tz = 'PST8PDT'
self.env.ref('resource.resource_calendar_std').tz = 'PST8PDT'
self.env['ir.config_parameter'].set_param('hr_payroll.payslip.sum_behavior', 'date_to')
self.structure_type = self.env['hr.payroll.structure.type'].create({
'name': 'Test Structure Type',
})
self.structure = self.env['hr.payroll.structure'].create({
'name': 'Test Structure',
'type_id': self.structure_type.id,
})
self._log('structue_type %s and structure %s' % (self.structure_type, self.structure))
self.structure_type.default_struct_id = self.structure
self.resource_calendar = self.ref('resource.resource_calendar_std')
float_info = sys_float_info
def float_round(self, value, digits):
return odoo_float_round(value, digits)
_payroll_digits = -1
@property
def payroll_digits(self):
if self._payroll_digits == -1:
self._payroll_digits = self.env['decimal.precision'].precision_get('Payroll')
return self._payroll_digits
def _log(self, message):
if self.debug:
self._logger.warning(message)
def _createEmployee(self):
return self.env['hr.employee'].create({
'birthday': '1985-03-14',
'country_id': self.ref('base.us'),
'department_id': self.ref('hr.dep_rd'),
'gender': 'male',
'name': 'Jared'
})
def _get_contract_defaults(self, contract_values):
if not contract_values.get('state'):
contract_values['state'] = 'open' # Running
if not contract_values.get('structure_type_id'):
contract_values['structure_type_id'] = self.structure_type.id
if not contract_values.get('date_start'):
contract_values['date_start'] = '2016-01-01'
if not contract_values.get('date_end'):
contract_values['date_end'] = '2030-12-31'
if not contract_values.get('resource_calendar_id'):
contract_values['resource_calendar_id'] = self.resource_calendar
# Compatibility with earlier Odoo versions
if not contract_values.get('journal_id') and hasattr(self.contract_model, 'journal_id'):
try:
contract_values['journal_id'] = self.env['account.journal'].search([('type', '=', 'general')], limit=1).id
except KeyError:
# Accounting not installed
pass
def _createContract(self, employee, **kwargs):
if not 'schedule_pay' in kwargs:
kwargs['schedule_pay'] = 'monthly'
schedule_pay = kwargs['schedule_pay']
contract_values = {
'name': 'Test Contract',
'employee_id': employee.id,
}
for key, val in kwargs.items():
# Assume any Odoo object is in a Many2one
if hasattr(val, 'id'):
val = val.id
found = False
if hasattr(self.contract_model, key):
contract_values[key] = val
found = True
if not found:
self._logger.warn('cannot locate attribute names "%s" on hr.contract().' % (key, ))
self._get_contract_defaults(contract_values)
contract = self.contract_model.create(contract_values)
# Compatibility with Odoo 14
contract.structure_type_id.default_struct_id.schedule_pay = schedule_pay
return contract
def _createPayslip(self, employee, date_from, date_to, skip_compute=False):
slip = self.env['hr.payslip'].create({
'name': 'Test %s From: %s To: %s' % (employee.name, date_from, date_to),
'employee_id': employee.id,
'date_from': date_from,
'date_to': date_to
})
# Included in hr.payslip.action_refresh_from_work_entries() as ov 14.0 EE
# slip._onchange_employee()
# as is the 'compute' that is almost always called immediaately after
if not skip_compute:
slip.action_refresh_from_work_entries()
return slip
def _getCategories(self, payslip):
categories = defaultdict(float)
for line in payslip.line_ids:
self._log(' line code: ' + str(line.code) +
' category code: ' + line.category_id.code +
' total: ' + str(line.total) +
' rate: ' + str(line.rate) +
' amount: ' + str(line.amount))
category_id = line.category_id
category_code = line.category_id.code
while category_code:
categories[category_code] += line.total
category_id = category_id.parent_id
category_code = category_id.code
return categories
def _getRules(self, payslip):
rules = defaultdict(float)
for line in payslip.line_ids:
rules[line.code] += line.total
return rules
def assertPayrollEqual(self, first, second):
self.assertAlmostEqual(first, second, self.payroll_digits)
def assertPayrollAlmostEqual(self, first, second):
self.assertAlmostEqual(first, second, self.payroll_digits-1)

View File

@@ -0,0 +1,127 @@
from .common import TestPayslip, process_payslip
class TestSpecial(TestPayslip):
def test_get_year(self):
salary = 80000.0
employee = self._createEmployee()
# so the schedule_pay is now on the Structure...
contract = self._createContract(employee, wage=salary)
payslip = self._createPayslip(employee, '2020-01-01', '2020-01-14')
self.assertEqual(payslip.get_year(), 2020)
def test_semi_monthly(self):
salary = 80000.0
employee = self._createEmployee()
# so the schedule_pay is now on the Structure...
contract = self._createContract(employee, wage=salary, schedule_pay='semi-monthly')
payslip = self._createPayslip(employee, '2019-01-01', '2019-01-14')
def test_payslip_sum_behavior(self):
self.env['ir.config_parameter'].set_param('hr_payroll.payslip.sum_behavior', 'date')
rule_category_comp = self.env.ref('hr_payroll.COMP')
test_rule_category = self.env['hr.salary.rule.category'].create({
'name': 'Test Sum Behavior',
'code': 'test_sum_behavior',
'parent_id': rule_category_comp.id,
})
test_rule = self.env['hr.salary.rule'].create({
'sequence': 450,
'struct_id': self.structure.id,
'category_id': test_rule_category.id,
'name': 'Test Sum Behavior',
'code': 'test_sum_behavior',
'condition_select': 'python',
'condition_python': 'result = 1',
'amount_select': 'code',
'amount_python_compute': '''
ytd_category = payslip.sum_category('test_sum_behavior', '2020-01-01', '2021-01-01')
ytd_rule = payslip.sum('test_sum_behavior', '2020-01-01', '2021-01-01')
result = 0.0
if ytd_category != ytd_rule:
# error
result = -1.0
elif ytd_rule == 0.0:
# first payslip in period
result = 1.0
'''
})
salary = 80000.0
employee = self._createEmployee()
contract = self._createContract(employee, wage=salary, schedule_pay='bi-weekly')
payslip = self._createPayslip(employee, '2019-12-30', '2020-01-12')
cats = self._getCategories(payslip)
self.assertEqual(cats['BASIC'], salary)
self.assertEqual(cats['test_sum_behavior'], 1.0)
process_payslip(payslip)
# Basic date_from behavior.
self.env['ir.config_parameter'].set_param('hr_payroll.payslip.sum_behavior', 'date_from')
# The the date_from on the last payslip will not be found
payslip = self._createPayslip(employee, '2020-01-13', '2020-01-27')
payslip.compute_sheet()
cats = self._getCategories(payslip)
self.assertEqual(cats['test_sum_behavior'], 1.0)
# date_to behavior.
self.env['ir.config_parameter'].set_param('hr_payroll.payslip.sum_behavior', 'date_to')
# The date_to on the last payslip is found
payslip = self._createPayslip(employee, '2020-01-13', '2020-01-27')
payslip.compute_sheet()
cats = self._getCategories(payslip)
self.assertEqual(cats['test_sum_behavior'], 0.0)
def test_recursive_salary_rule_category(self):
self.debug = True
# In this scenario, you are in rule code that will check for the category
# and a subcategory will also
alw_category = self.env.ref('hr_payroll.ALW')
ded_category = self.env.ref('hr_payroll.DED')
test_category = self.env['hr.salary.rule.category'].create({
'name': 'Special ALW',
'code': 'ALW_SPECIAL_RECURSIVE',
'parent_id': alw_category.id,
})
test_special_alw = self.env['hr.salary.rule'].create({
'name': 'Flat amount 200',
'code': 'ALW_SPECIAL_RECURSIVE',
'category_id': test_category.id,
'condition_select': 'none',
'amount_select': 'fix',
'amount_fix': 200.0,
'struct_id': self.structure.id,
})
test_recursion = self.env['hr.salary.rule'].create({
'name': 'Actual Test Behavior',
'code': 'RECURSION_TEST',
'category_id': ded_category.id,
'condition_select': 'none',
'amount_select': 'code',
'amount_python_compute': """
# this rule will always be the total of the ALW category and YTD ALW category
result = categories.ALW
# Note, this tests the hr.payslip.get_year() to return an integer rep of year
year = payslip.dict.get_year()
result += payslip.sum_category('ALW', str(year) + '-01-01', str(year+1) + '-01-01')
""",
'sequence': 101,
'struct_id': self.structure.id,
})
salary = 80000.0
employee = self._createEmployee()
contract = self._createContract(employee, wage=salary, schedule_pay='bi-weekly')
payslip = self._createPayslip(employee, '2020-01-01', '2020-01-14')
payslip.compute_sheet()
cats = self._getCategories(payslip)
rules = self._getRules(payslip)
self.assertEqual(rules['RECURSION_TEST'], 200.0)
process_payslip(payslip)
payslip = self._createPayslip(employee, '2020-01-15', '2020-01-27')
payslip.compute_sheet()
cats = self._getCategories(payslip)
rules = self._getRules(payslip)
# two hundred is in the YTD ALW
self.assertEqual(rules['RECURSION_TEST'], 200.0 + 200.0)

View File

@@ -0,0 +1,49 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="res_config_settings_view_form_hibou" model="ir.ui.view">
<field name="name">res.config.settings.view.form.inherit.hr.payroll.hibou</field>
<field name="model">res.config.settings</field>
<field name="priority" eval="50"/>
<field name="inherit_id" ref="hr_payroll.res_config_settings_view_form"/>
<field name="arch" type="xml">
<xpath expr="//div[@data-key='hr_payroll']" position="inside">
<field name="module_l10n_us_hr_payroll" invisible="1"/>
<!-- TODO payment, attendance, timesheet, ovetrtime... -->
<h2>Hibou Payroll</h2>
<div class="row mt16 o_settings_container" id="hr_payroll_hibou">
<div class="col-lg-6 col-12 o_setting_box">
<div class="o_setting_left_pane"/>
<div class="o_setting_right_pane">
<label for="payslip_sum_type" string="Payslip Sum Behavior"/>
<div class="text-muted">
Customize the behavior of what payslips are eligible when summing over date ranges in rules.
Generally, "Date To" or "Accounting Date" would be preferred in the United States and anywhere
else where the ending date on the payslip is used to calculate wage bases.
</div>
<field name="payslip_sum_type"/>
</div>
</div>
<div class="col-lg-6 col-12 o_setting_box">
<div class="o_setting_left_pane">
<field name="module_l10n_us_hr_payroll_401k"/>
</div>
<div class="o_setting_right_pane">
<label for="module_l10n_us_hr_payroll_401k" string="USA Payroll 401k"/>
<div class="text-muted">
Provide retirement plans with optional company matching.
</div>
<div class="mt8" id="l10n_us_hr_payroll_401k_match">
<button name="%(hr_payroll.hr_rule_parameter_action)d" icon="fa-arrow-right" type="action"
string="Configure Matching &amp; Limits" class="btn-link"
context="{'search_default_us_payroll_401k': True}"
attrs="{'invisible': [('module_l10n_us_hr_payroll_401k', '=', False)]}"/>
</div>
</div>
</div>
</div>
</xpath>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,12 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from . import models
def _post_install_hook(cr, registry):
"""
This method will set the default for the Payslip Sum Behavior
"""
cr.execute("SELECT id FROM ir_config_parameter WHERE key = 'hr_payroll.payslip.sum_behavior';")
existing = cr.fetchall()
if not existing:
cr.execute("INSERT INTO ir_config_parameter (key, value) VALUES ('hr_payroll.payslip.sum_behavior', 'date');")

View File

@@ -0,0 +1,82 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
{
'name': 'United States of America - Payroll',
'author': 'Hibou Corp. <hello@hibou.io>',
'version': '14.0.2020.0.0',
'category': 'Payroll Localization',
'depends': [
'hr_payroll_hibou',
],
'description': """
United States of America - Payroll Rules.
=========================================
""",
'data': [
'security/ir.model.access.csv',
'data/base.xml',
'data/integration_rules.xml',
'data/federal/fed_940_futa_parameters.xml',
'data/federal/fed_940_futa_rules.xml',
'data/federal/fed_941_fica_parameters.xml',
'data/federal/fed_941_fica_rules.xml',
'data/federal/fed_941_fit_parameters.xml',
'data/federal/fed_941_fit_rules.xml',
'data/state/ak_alaska.xml',
'data/state/al_alabama.xml',
'data/state/ar_arkansas.xml',
'data/state/az_arizona.xml',
'data/state/ca_california.xml',
'data/state/co_colorado.xml',
'data/state/ct_connecticut.xml',
'data/state/de_delaware.xml',
'data/state/fl_florida.xml',
'data/state/ga_georgia.xml',
'data/state/hi_hawaii.xml',
'data/state/ia_iowa.xml',
'data/state/id_idaho.xml',
'data/state/il_illinois.xml',
'data/state/in_indiana.xml',
'data/state/ks_kansas.xml',
'data/state/ky_kentucky.xml',
'data/state/la_louisiana.xml',
'data/state/me_maine.xml',
'data/state/mi_michigan.xml',
'data/state/mn_minnesota.xml',
'data/state/mo_missouri.xml',
'data/state/ms_mississippi.xml',
'data/state/mt_montana.xml',
'data/state/nc_northcarolina.xml',
'data/state/nd_north_dakota.xml',
'data/state/ne_nebraska.xml',
'data/state/nh_new_hampshire.xml',
'data/state/nj_newjersey.xml',
'data/state/nm_new_mexico.xml',
'data/state/nv_nevada.xml',
'data/state/ny_new_york.xml',
'data/state/oh_ohio.xml',
'data/state/ok_oklahoma.xml',
'data/state/pa_pennsylvania.xml',
'data/state/ri_rhode_island.xml',
'data/state/sc_south_carolina.xml',
'data/state/sd_south_dakota.xml',
'data/state/tn_tennessee.xml',
'data/state/tx_texas.xml',
'data/state/ut_utah.xml',
'data/state/vt_vermont.xml',
'data/state/va_virginia.xml',
'data/state/wa_washington.xml',
'data/state/wi_wisconsin.xml',
'data/state/wv_west_virginia.xml',
'data/state/wy_wyoming.xml',
'views/hr_contract_views.xml',
'views/us_payroll_config_views.xml',
],
'demo': [
],
'auto_install': False,
'post_init_hook': '_post_install_hook',
'license': 'OPL-1',
}

View File

@@ -0,0 +1,133 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id="structure_type_employee" model="hr.payroll.structure.type">
<field name="name">USA Employee</field>
<field name="default_resource_calendar_id" ref="resource.resource_calendar_std"/>
<field name="country_id" ref="base.us"/>
</record>
<record id="hr_payroll_structure" model="hr.payroll.structure">
<field name="name">USA Employee Standard</field>
<field name="country_id" ref="base.us"/>
<field name="type_id" ref="l10n_us_hr_payroll.structure_type_employee"/>
<field name="unpaid_work_entry_type_ids" eval="[
(4, ref('hr_work_entry_contract.work_entry_type_unpaid_leave')),
]"/>
</record>
<record id="l10n_us_hr_payroll.structure_type_employee" model="hr.payroll.structure.type">
<field name="default_struct_id" ref="hr_payroll_structure"/>
</record>
<!-- State Unemployment -->
<record id="hr_payroll_category_ee_us_suta" model="hr.salary.rule.category">
<field name="name">EE: State Unemployment SUTA</field>
<field name="code">EE_US_SUTA</field>
<field name="parent_id" ref="hr_payroll.DED"/>
</record>
<record id="hr_payroll_category_er_us_suta" model="hr.salary.rule.category">
<field name="name">ER: State Unemployment SUTA</field>
<field name="code">ER_US_SUTA</field>
<field name="parent_id" ref="hr_payroll.COMP"/>
</record>
<!-- State Income Tax -->
<record id="hr_payroll_category_ee_us_sit" model="hr.salary.rule.category">
<field name="name">EE: State Income Tax Withholding</field>
<field name="code">EE_US_SIT</field>
<field name="parent_id" ref="hr_payroll.DED"/>
</record>
<!-- Tax Exempt Benefits/Wage -->
<!-- IRS Publication 15-B Lists several categories of benefits, limits and classifications -->
<!-- If your rule is intended to add to gross wages or be pre-gross, use the ALW_ Categories -->
<record id="hr_payroll_category_alw_fit_exempt" model="hr.salary.rule.category">
<field name="name">Wage: US FIT Exempt</field>
<field name="code">ALW_FIT_EXEMPT</field>
<field name="parent_id" ref="hr_payroll.ALW"/>
</record>
<record id="hr_payroll_category_alw_fit_fica_exempt" model="hr.salary.rule.category">
<field name="name">Wage: US FIT &amp; FICA Exempt</field>
<field name="code">ALW_FIT_FICA_EXEMPT</field>
<field name="parent_id" ref="hr_payroll.ALW"/>
</record>
<record id="hr_payroll_category_alw_fit_futa_exempt" model="hr.salary.rule.category">
<field name="name">Wage: US FIT &amp; FUTA Exempt</field>
<field name="code">ALW_FIT_FUTA_EXEMPT</field>
<field name="parent_id" ref="hr_payroll.ALW"/>
</record>
<record id="hr_payroll_category_alw_fit_fica_futa_exempt" model="hr.salary.rule.category">
<field name="name">Wage: US FIT &amp; FICA &amp; FUTA Exempt</field>
<field name="code">ALW_FIT_FICA_FUTA_EXEMPT</field>
<field name="parent_id" ref="hr_payroll.ALW"/>
</record>
<record id="hr_payroll_category_alw_fica_exempt" model="hr.salary.rule.category">
<field name="name">Wage: US FICA Exempt</field>
<field name="code">ALW_FICA_EXEMPT</field>
<field name="parent_id" ref="hr_payroll.ALW"/>
</record>
<record id="hr_payroll_category_alw_fica_futa_exempt" model="hr.salary.rule.category">
<field name="name">Wage: US FICA &amp; FUTA Exempt</field>
<field name="code">ALW_FICA_FUTA_EXEMPT</field>
<field name="parent_id" ref="hr_payroll.ALW"/>
</record>
<record id="hr_payroll_category_alw_futa_exempt" model="hr.salary.rule.category">
<field name="name">Wage: US FUTA Exempt</field>
<field name="code">ALW_FUTA_EXEMPT</field>
<field name="parent_id" ref="hr_payroll.ALW"/>
</record>
<!-- Tax Exempt Deductions -->
<!-- If your rule is intended to withhold from gross, use the DED_ Categories -->
<record id="hr_payroll_category_ded_fit_exempt" model="hr.salary.rule.category">
<field name="name">Deduction: US FIT Exempt</field>
<field name="code">DED_FIT_EXEMPT</field>
<field name="parent_id" ref="hr_payroll.DED"/>
</record>
<record id="hr_payroll_category_ded_fit_fica_exempt" model="hr.salary.rule.category">
<field name="name">Deduction: US FIT &amp; FICA Exempt</field>
<field name="code">DED_FIT_FICA_EXEMPT</field>
<field name="parent_id" ref="hr_payroll.DED"/>
</record>
<record id="hr_payroll_category_ded_fit_futa_exempt" model="hr.salary.rule.category">
<field name="name">Deduction: US FIT &amp; FUTA Exempt</field>
<field name="code">DED_FIT_FUTA_EXEMPT</field>
<field name="parent_id" ref="hr_payroll.DED"/>
</record>
<record id="hr_payroll_category_ded_fit_fica_futa_exempt" model="hr.salary.rule.category">
<field name="name">Deduction: US FIT &amp; FICA &amp; FUTA Exempt</field>
<field name="code">DED_FIT_FICA_FUTA_EXEMPT</field>
<field name="parent_id" ref="hr_payroll.DED"/>
</record>
<record id="hr_payroll_category_ded_fica_exempt" model="hr.salary.rule.category">
<field name="name">Deduction: US FICA Exempt</field>
<field name="code">DED_FICA_EXEMPT</field>
<field name="parent_id" ref="hr_payroll.DED"/>
</record>
<record id="hr_payroll_category_ded_fica_futa_exempt" model="hr.salary.rule.category">
<field name="name">Deduction: US FICA &amp; FUTA Exempt</field>
<field name="code">DED_FICA_FUTA_EXEMPT</field>
<field name="parent_id" ref="hr_payroll.DED"/>
</record>
<record id="hr_payroll_category_ded_futa_exempt" model="hr.salary.rule.category">
<field name="name">Deduction: US FUTA Exempt</field>
<field name="code">DED_FUTA_EXEMPT</field>
<field name="parent_id" ref="hr_payroll.DED"/>
</record>
</odoo>

View File

@@ -0,0 +1,38 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base -->
<record id="rule_parameter_940_futa_wage_base" model="hr.rule.parameter">
<field name="name">Federal 940 FUTA Wage Base</field>
<field name="code">fed_940_futa_wage_base</field>
<field name="country_id" ref="base.us"/>
</record>
<record id="rule_parameter_940_futa_wage_base_2016" model="hr.rule.parameter.value">
<field name="parameter_value">7000.00</field>
<field name="rule_parameter_id" ref="rule_parameter_940_futa_wage_base"/>
<field name="date_from" eval="datetime(2016, 1, 1).date()"/>
</record>
<!-- Rate -->
<record id="rule_parameter_940_futa_rate_basic" model="hr.rule.parameter">
<field name="name">Federal 940 FUTA Rate Basic</field>
<field name="code">fed_940_futa_rate_basic</field>
<field name="country_id" ref="base.us"/>
</record>
<record id="rule_parameter_940_futa_rate_basic_2016" model="hr.rule.parameter.value">
<field name="parameter_value">6.0</field>
<field name="rule_parameter_id" ref="rule_parameter_940_futa_rate_basic"/>
<field name="date_from" eval="datetime(2016, 1, 1).date()"/>
</record>
<record id="rule_parameter_940_futa_rate_normal" model="hr.rule.parameter">
<field name="name">Federal 940 FUTA Rate Normal</field>
<field name="code">fed_940_futa_rate_normal</field>
<field name="country_id" ref="base.us"/>
</record>
<record id="rule_parameter_940_futa_rate_normal_2016" model="hr.rule.parameter.value">
<field name="parameter_value">0.6</field>
<field name="rule_parameter_id" ref="rule_parameter_940_futa_rate_normal"/>
<field name="date_from" eval="datetime(2016, 1, 1).date()"/>
</record>
</odoo>

View File

@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id="res_partner_eftps_940" model="res.partner">
<field name="name">US Federal 940 - EFTPS</field>
</record>
<record id="hr_payroll_category_er_fed_940" model="hr.salary.rule.category">
<field name="name">ER: Federal 940 FUTA</field>
<field name="code">ER_US_940_FUTA</field>
<field name="parent_id" ref="hr_payroll.COMP"/>
</record>
<record id="hr_payroll_rule_er_fed_940" model="hr.salary.rule">
<field name="sequence" eval="440"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_er_fed_940"/>
<field name="name">ER: US FUTA Federal Unemployment</field>
<field name="code">ER_US_940_FUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = er_us_940_futa(payslip, categories, worked_days, inputs)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = er_us_940_futa(payslip, categories, worked_days, inputs)</field>
<field name="partner_id" ref="res_partner_eftps_940"/>
<field name="appears_on_payslip" eval="False"/>
</record>
</odoo>

View File

@@ -0,0 +1,88 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Social Security -->
<!-- Wage Base -->
<record id="rule_parameter_941_fica_ss_wage_base" model="hr.rule.parameter">
<field name="name">Federal 941 FICA Social Security Wage Base</field>
<field name="code">fed_941_fica_ss_wage_base</field>
<field name="country_id" ref="base.us"/>
</record>
<record id="rule_parameter_941_fica_ss_wage_base_2016" model="hr.rule.parameter.value">
<field name="parameter_value">128400.0</field>
<field name="rule_parameter_id" ref="rule_parameter_941_fica_ss_wage_base"/>
<field name="date_from" eval="datetime(2016, 1, 1).date()"/>
</record>
<record id="rule_parameter_941_fica_ss_wage_base_2019" model="hr.rule.parameter.value">
<field name="parameter_value">132900.0</field>
<field name="rule_parameter_id" ref="rule_parameter_941_fica_ss_wage_base"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_941_fica_ss_wage_base_2020" model="hr.rule.parameter.value">
<field name="parameter_value">137700.0</field>
<field name="rule_parameter_id" ref="rule_parameter_941_fica_ss_wage_base"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
<!-- Rate -->
<record id="rule_parameter_941_fica_ss_rate" model="hr.rule.parameter">
<field name="name">Federal 941 FICA Rate</field>
<field name="code">fed_941_fica_ss_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<record id="rule_parameter_941_fica_ss_rate_2016" model="hr.rule.parameter.value">
<field name="parameter_value">6.2</field>
<field name="rule_parameter_id" ref="rule_parameter_941_fica_ss_rate"/>
<field name="date_from" eval="datetime(2016, 1, 1).date()"/>
</record>
<!-- Medicare -->
<!-- Wage Base -->
<record id="rule_parameter_941_fica_m_wage_base" model="hr.rule.parameter">
<field name="name">Federal 941 FICA Medicare Wage Base</field>
<field name="code">fed_941_fica_m_wage_base</field>
<field name="country_id" ref="base.us"/>
</record>
<record id="rule_parameter_941_fica_m_wage_base_2016" model="hr.rule.parameter.value">
<field name="parameter_value">"inf"</field>
<field name="rule_parameter_id" ref="rule_parameter_941_fica_m_wage_base"/>
<field name="date_from" eval="datetime(2016, 1, 1).date()"/>
</record>
<!-- Rate -->
<record id="rule_parameter_941_fica_m_rate" model="hr.rule.parameter">
<field name="name">Federal 941 FICA Rate</field>
<field name="code">fed_941_fica_m_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<record id="rule_parameter_941_fica_m_rate_2016" model="hr.rule.parameter.value">
<field name="parameter_value">1.45</field>
<field name="rule_parameter_id" ref="rule_parameter_941_fica_m_rate"/>
<field name="date_from" eval="datetime(2016, 1, 1).date()"/>
</record>
<!-- Medicare Additional -->
<!-- Wage Base -->
<record id="rule_parameter_941_fica_m_add_wage_start" model="hr.rule.parameter">
<field name="name">Federal 941 FICA Medicare Additional Wage Start</field>
<field name="code">fed_941_fica_m_add_wage_start</field>
<field name="country_id" ref="base.us"/>
</record>
<record id="rule_parameter_941_fica_m_add_wage_start_2016" model="hr.rule.parameter.value">
<field name="parameter_value">200000.0</field>
<field name="rule_parameter_id" ref="rule_parameter_941_fica_m_add_wage_start"/>
<field name="date_from" eval="datetime(2016, 1, 1).date()"/>
</record>
<!-- Rate -->
<record id="rule_parameter_941_fica_m_add_rate" model="hr.rule.parameter">
<field name="name">Federal 941 FICA Medicare Additional Rate</field>
<field name="code">fed_941_fica_m_add_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<record id="rule_parameter_941_fica_m_add_rate_2016" model="hr.rule.parameter.value">
<field name="parameter_value">0.9</field>
<field name="rule_parameter_id" ref="rule_parameter_941_fica_m_add_rate"/>
<field name="date_from" eval="datetime(2016, 1, 1).date()"/>
</record>
</odoo>

View File

@@ -0,0 +1,94 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id="res_partner_eftps_941" model="res.partner">
<field name="name">US Federal 941 - EFTPS</field>
</record>
<record id="hr_payroll_category_ee_fed_941" model="hr.salary.rule.category">
<field name="name">EE: Federal 941 FICA</field>
<field name="code">EE_US_941_FICA</field>
<field name="parent_id" ref="hr_payroll.DED"/>
</record>
<record id="hr_payroll_category_er_fed_941" model="hr.salary.rule.category">
<field name="name">ER: Federal 941 FICA</field>
<field name="code">ER_US_941_FICA</field>
<field name="parent_id" ref="hr_payroll.COMP"/>
</record>
<!-- Social Security -->
<record id="hr_payroll_rule_ee_fed_941_ss" model="hr.salary.rule">
<field name="sequence" eval="190"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_ee_fed_941"/>
<field name="name">EE: US FICA Social Security</field>
<field name="code">EE_US_941_FICA_SS</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = ee_us_941_fica_ss(payslip, categories, worked_days, inputs)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = ee_us_941_fica_ss(payslip, categories, worked_days, inputs)</field>
<field name="partner_id" ref="res_partner_eftps_941"/>
<field name="appears_on_payslip" eval="True"/>
</record>
<record id="hr_payroll_rule_er_fed_941_ss" model="hr.salary.rule">
<field name="sequence" eval="440"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_er_fed_941"/>
<field name="name">ER: US FICA Social Security</field>
<field name="code">ER_US_941_FICA_SS</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = er_us_941_fica_ss(payslip, categories, worked_days, inputs)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = er_us_941_fica_ss(payslip, categories, worked_days, inputs)</field>
<field name="partner_id" ref="res_partner_eftps_941"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<!-- Medicare -->
<record id="hr_payroll_rule_ee_fed_941_m" model="hr.salary.rule">
<field name="sequence" eval="190"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_ee_fed_941"/>
<field name="name">EE: US FICA Medicare</field>
<field name="code">EE_US_941_FICA_M</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = ee_us_941_fica_m(payslip, categories, worked_days, inputs)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = ee_us_941_fica_m(payslip, categories, worked_days, inputs)</field>
<field name="partner_id" ref="res_partner_eftps_941"/>
<field name="appears_on_payslip" eval="True"/>
</record>
<record id="hr_payroll_rule_er_fed_941_m" model="hr.salary.rule">
<field name="sequence" eval="440"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_er_fed_941"/>
<field name="name">ER: US FICA Medicare</field>
<field name="code">ER_US_941_FICA_M</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = er_us_941_fica_m(payslip, categories, worked_days, inputs)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = er_us_941_fica_m(payslip, categories, worked_days, inputs)</field>
<field name="partner_id" ref="res_partner_eftps_941"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<!-- Medicare Additional -->
<record id="hr_payroll_rule_ee_fed_941_m_add" model="hr.salary.rule">
<field name="sequence" eval="190"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_ee_fed_941"/>
<field name="name">EE: US FICA Medicare Additional</field>
<field name="code">EE_US_941_FICA_M_ADD</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = ee_us_941_fica_m_add(payslip, categories, worked_days, inputs)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = ee_us_941_fica_m_add(payslip, categories, worked_days, inputs)</field>
<field name="partner_id" ref="res_partner_eftps_941"/>
<field name="appears_on_payslip" eval="True"/>
</record>
</odoo>

View File

@@ -0,0 +1,504 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Shared -->
<record id="rule_parameter_941_fit_allowance" model="hr.rule.parameter">
<field name="name">Federal 941 FIT Allowance</field>
<field name="code">fed_941_fit_allowance</field>
<field name="country_id" ref="base.us"/>
</record>
<record id="rule_parameter_941_fit_allowance_2018" model="hr.rule.parameter.value">
<!-- Bogus 2018 -->
<field name="parameter_value">{
'weekly': 80.80,
'bi-weekly': 161.50,
'semi-monthly': 175.00,
'monthly': 350.00,
'quarterly': 1050.00,
'semi-annually': 2100.00,
'annually': 4200.00,
}</field>
<field name="rule_parameter_id" ref="rule_parameter_941_fit_allowance"/>
<field name="date_from" eval="datetime(2018, 1, 1).date()"/>
</record>
<record id="rule_parameter_941_fit_allowance_2019" model="hr.rule.parameter.value">
<field name="parameter_value">{
'weekly': 80.80,
'bi-weekly': 161.50,
'semi-monthly': 175.00,
'monthly': 350.00,
'quarterly': 1050.00,
'semi-annually': 2100.00,
'annually': 4200.00,
}</field>
<field name="rule_parameter_id" ref="rule_parameter_941_fit_allowance"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_941_fit_allowance_2020" model="hr.rule.parameter.value">
<!-- Warning, major change to allowance in 2020 -->
<field name="parameter_value">4300.0</field>
<field name="rule_parameter_id" ref="rule_parameter_941_fit_allowance"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
<record id="rule_parameter_941_fit_nra_additional" model="hr.rule.parameter">
<field name="name">Federal 941 FIT NRA Additional</field>
<field name="code">fed_941_fit_nra_additional</field>
<field name="country_id" ref="base.us"/>
</record>
<record id="rule_parameter_941_fit_nra_additional_2018" model="hr.rule.parameter.value">
<!-- Bogus from 2018 -->
<field name="parameter_value">{
'weekly': 153.80,
'bi-weekly': 307.70,
'semi-monthly': 333.30,
'monthly': 666.70,
'quarterly': 2000.00,
'semi-annually': 4000.00,
'annually': 8000.00,
}</field>
<field name="rule_parameter_id" ref="rule_parameter_941_fit_nra_additional"/>
<field name="date_from" eval="datetime(2018, 1, 1).date()"/>
</record>
<record id="rule_parameter_941_fit_nra_additional_2019" model="hr.rule.parameter.value">
<field name="parameter_value">{
'weekly': 153.80,
'bi-weekly': 307.70,
'semi-monthly': 333.30,
'monthly': 666.70,
'quarterly': 2000.00,
'semi-annually': 4000.00,
'annually': 8000.00,
}</field>
<field name="rule_parameter_id" ref="rule_parameter_941_fit_nra_additional"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_941_fit_nra_additional_2020" model="hr.rule.parameter.value">
<field name="parameter_value">{
'weekly': 238.50,
'bi-weekly': 476.90,
'semi-monthly': 516.70,
'monthly': 1033.30,
'quarterly': 3100.00,
'semi-annually': 6200.00,
'annually': 12400.00,
}</field>
<field name="rule_parameter_id" ref="rule_parameter_941_fit_nra_additional"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
<!-- Single and Married Single Rate -->
<record id="rule_parameter_941_fit_table_single" model="hr.rule.parameter">
<field name="name">Federal 941 FIT Table Single</field>
<field name="code">fed_941_fit_table_single</field>
<field name="country_id" ref="base.us"/>
</record>
<record id="rule_parameter_941_fit_table_single_2018" model="hr.rule.parameter.value">
<!-- Bogus 2018 -->
<!-- But-not-over, $, % -->
<field name="parameter_value">{
'weekly': [
( 73.00, 0.00, 0),
( 260.00, 0.00, 10),
( 832.00, 18.70, 12),
( 1692.00, 87.34, 22),
( 3164.00, 276.54, 24),
( 3998.00, 629.82, 32),
( 9887.00, 896.70, 35),
( 'inf', 2957.85, 37),
],
'bi-weekly': [
( 146.00, 0.00, 0),
( 519.00, 0.00, 10),
( 1664.00, 37.30, 12),
( 3385.00, 174.70, 22),
( 6328.00, 553.32, 24),
( 7996.00, 1259.64, 32),
( 19773.00, 1793.40, 35),
( 'inf', 5915.35, 37),
],
'semi-monthly': [
( 158.00, 0.00, 0),
( 563.00, 0.00, 10),
( 1803.00, 40.50, 12),
( 3667.00, 189.30, 22),
( 6855.00, 599.38, 24),
( 8663.00, 1364.50, 32),
( 21421.00, 1943.06, 35),
( 'inf', 6408.36, 37),
],
'monthly': [
( 317.00, 0.00, 0),
( 1125.00, 0.00, 10),
( 3606.00, 80.80, 12),
( 7333.00, 378.52, 22),
( 13710.00, 1198.46, 24),
( 17325.00, 2728.94, 32),
( 42842.00, 3885.74, 35),
( 'inf', 12816.69, 37),
],
'quarterly': [
( 950.00, 0.00, 0),
( 3375.00, 0.00, 10),
( 10819.00, 242.50, 12),
( 22000.00, 1135.78, 22),
( 41131.00, 3595.60, 24),
( 51975.00, 8187.04, 32),
( 128525.00, 11657.12, 35),
( 'inf', 38449.62, 37),
],
'semi-annually': [
( 1900.00, 0.00, 0),
( 6750.00, 0.00, 10),
( 21638.00, 485.00, 12),
( 44000.00, 2271.56, 22),
( 82263.00, 7191.20, 24),
( 103950.00, 16374.32, 32),
( 257050.00, 23314.16, 35),
( 'inf', 76899.16, 37),
],
'annually': [
( 3800.00, 0.00, 0),
( 13500.00, 0.00, 10),
( 43275.00, 970.00, 12),
( 88000.00, 4543.00, 22),
( 164525.00, 14382.50, 24),
( 207900.00, 32748.50, 32),
( 514100.00, 46628.50, 35),
( 'inf', 153798.50, 37),
],
}</field>
<field name="rule_parameter_id" ref="rule_parameter_941_fit_table_single"/>
<field name="date_from" eval="datetime(2018, 1, 1).date()"/>
</record>
<record id="rule_parameter_941_fit_table_single_2019" model="hr.rule.parameter.value">
<!-- But-not-over, $, % -->
<field name="parameter_value">{
'weekly': [
( 73.00, 0.00, 0),
( 260.00, 0.00, 10),
( 832.00, 18.70, 12),
( 1692.00, 87.34, 22),
( 3164.00, 276.54, 24),
( 3998.00, 629.82, 32),
( 9887.00, 896.70, 35),
( 'inf', 2957.85, 37),
],
'bi-weekly': [
( 146.00, 0.00, 0),
( 519.00, 0.00, 10),
( 1664.00, 37.30, 12),
( 3385.00, 174.70, 22),
( 6328.00, 553.32, 24),
( 7996.00, 1259.64, 32),
( 19773.00, 1793.40, 35),
( 'inf', 5915.35, 37),
],
'semi-monthly': [
( 158.00, 0.00, 0),
( 563.00, 0.00, 10),
( 1803.00, 40.50, 12),
( 3667.00, 189.30, 22),
( 6855.00, 599.38, 24),
( 8663.00, 1364.50, 32),
( 21421.00, 1943.06, 35),
( 'inf', 6408.36, 37),
],
'monthly': [
( 317.00, 0.00, 0),
( 1125.00, 0.00, 10),
( 3606.00, 80.80, 12),
( 7333.00, 378.52, 22),
( 13710.00, 1198.46, 24),
( 17325.00, 2728.94, 32),
( 42842.00, 3885.74, 35),
( 'inf', 12816.69, 37),
],
'quarterly': [
( 950.00, 0.00, 0),
( 3375.00, 0.00, 10),
( 10819.00, 242.50, 12),
( 22000.00, 1135.78, 22),
( 41131.00, 3595.60, 24),
( 51975.00, 8187.04, 32),
( 128525.00, 11657.12, 35),
( 'inf', 38449.62, 37),
],
'semi-annually': [
( 1900.00, 0.00, 0),
( 6750.00, 0.00, 10),
( 21638.00, 485.00, 12),
( 44000.00, 2271.56, 22),
( 82263.00, 7191.20, 24),
( 103950.00, 16374.32, 32),
( 257050.00, 23314.16, 35),
( 'inf', 76899.16, 37),
],
'annually': [
( 3800.00, 0.00, 0),
( 13500.00, 0.00, 10),
( 43275.00, 970.00, 12),
( 88000.00, 4543.00, 22),
( 164525.00, 14382.50, 24),
( 207900.00, 32748.50, 32),
( 514100.00, 46628.50, 35),
( 'inf', 153798.50, 37),
],
}</field>
<field name="rule_parameter_id" ref="rule_parameter_941_fit_table_single"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_941_fit_table_single_2020" model="hr.rule.parameter.value">
<!-- Major changes in 2020 -->
<!-- Wage Threshold, Base Withholding Amount, Marginal Rate Over Threshold -->
<field name="parameter_value">{
'standard': [
( 0.00, 0.00, 0.00),
( 3800.00, 0.00, 0.10),
( 13675.00, 987.50, 0.12),
( 43925.00, 4617.50, 0.22),
( 89325.00, 14605.50, 0.24),
( 167100.00, 33271.50, 0.32),
( 211150.00, 47367.50, 0.35),
( 522200.00, 156235.00, 0.37),
],
'higher': [
( 0.00, 0.00, 0.00),
( 6200.00, 0.00, 0.10),
( 11138.00, 493.75, 0.12),
( 26263.00, 2308.75, 0.22),
( 48963.00, 7302.75, 0.24),
( 87850.00, 16635.75, 0.32),
( 109875.00, 23683.75, 0.35),
( 265400.00, 78117.50, 0.37),
],
}</field>
<field name="rule_parameter_id" ref="rule_parameter_941_fit_table_single"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
<!-- Married -->
<record id="rule_parameter_941_fit_table_married" model="hr.rule.parameter">
<field name="name">Federal 941 FIT Table Married</field>
<field name="code">fed_941_fit_table_married</field>
<field name="country_id" ref="base.us"/>
</record>
<record id="rule_parameter_941_fit_table_married_2018" model="hr.rule.parameter.value">
<!-- Bogus 2018 -->
<!-- But-not-over, $, % -->
<field name="parameter_value">{
'weekly': [
( 227.00, 0.00, 0),
( 600.00, 0.00, 10),
( 1745.00, 37.30, 12),
( 3465.00, 174.70, 22),
( 6409.00, 553.10, 24),
( 8077.00, 1259.66, 32),
( 12003.00, 1793.42, 35),
( 'inf', 3167.52, 37),
],
'bi-weekly': [
( 454.00, 0.00, 0),
( 1200.00, 0.00, 10),
( 3490.00, 74.60, 12),
( 6931.00, 349.40, 22),
( 12817.00, 1106.42, 24),
( 16154.00, 2519.06, 32),
( 24006.00, 3586.90, 35),
( 'inf', 6335.10, 37),
],
'semi-monthly': [
( 492.00, 0.00, 0),
( 1300.00, 0.00, 10),
( 3781.00, 80.80, 12),
( 7508.00, 378.52, 22),
( 13885.00, 1198.46, 24),
( 17500.00, 2728.94, 32),
( 26006.00, 3885.74, 35),
( 'inf', 6862.84, 37),
],
'monthly': [
( 983.00, 0.00, 0),
( 2600.00, 0.00, 10),
( 7563.00, 161.70, 12),
( 15017.00, 757.26, 22),
( 27771.00, 2397.14, 24),
( 35000.00, 5458.10, 32),
( 52013.00, 7771.38, 35),
( 'inf', 13725.93, 37),
],
'quarterly': [
( 2950.00, 0.00, 0),
( 7800.00, 0.00, 10),
( 22688.00, 485.00, 12),
( 45050.00, 2271.56, 22),
( 83313.00, 7191.20, 24),
( 105000.00, 16374.32, 32),
( 156038.00, 23314.16, 35),
( 'inf', 41177.46, 37),
],
'semi-annually': [
( 5900.00, 0.00, 0),
( 15600.00, 0.00, 10),
( 45375.00, 970.00, 12),
( 90100.00, 4543.00, 22),
( 166625.00, 14382.50, 24),
( 210000.00, 32748.50, 32),
( 312075.00, 46628.50, 35),
( 'inf', 82354.75, 37),
],
'annually': [
( 11800.00, 0.00, 0),
( 31200.00, 0.00, 10),
( 90750.00, 1940.00, 12),
( 180200.00, 9086.00, 22),
( 333250.00, 28765.00, 24),
( 420000.00, 65497.00, 32),
( 624150.00, 93257.00, 35),
( 'inf', 164709.50, 37),
],
}</field>
<field name="rule_parameter_id" ref="rule_parameter_941_fit_table_married"/>
<field name="date_from" eval="datetime(2018, 1, 1).date()"/>
</record>
<record id="rule_parameter_941_fit_table_married_2019" model="hr.rule.parameter.value">
<!-- But-not-over, $, % -->
<field name="parameter_value">{
'weekly': [
( 227.00, 0.00, 0),
( 600.00, 0.00, 10),
( 1745.00, 37.30, 12),
( 3465.00, 174.70, 22),
( 6409.00, 553.10, 24),
( 8077.00, 1259.66, 32),
( 12003.00, 1793.42, 35),
( 'inf', 3167.52, 37),
],
'bi-weekly': [
( 454.00, 0.00, 0),
( 1200.00, 0.00, 10),
( 3490.00, 74.60, 12),
( 6931.00, 349.40, 22),
( 12817.00, 1106.42, 24),
( 16154.00, 2519.06, 32),
( 24006.00, 3586.90, 35),
( 'inf', 6335.10, 37),
],
'semi-monthly': [
( 492.00, 0.00, 0),
( 1300.00, 0.00, 10),
( 3781.00, 80.80, 12),
( 7508.00, 378.52, 22),
( 13885.00, 1198.46, 24),
( 17500.00, 2728.94, 32),
( 26006.00, 3885.74, 35),
( 'inf', 6862.84, 37),
],
'monthly': [
( 983.00, 0.00, 0),
( 2600.00, 0.00, 10),
( 7563.00, 161.70, 12),
( 15017.00, 757.26, 22),
( 27771.00, 2397.14, 24),
( 35000.00, 5458.10, 32),
( 52013.00, 7771.38, 35),
( 'inf', 13725.93, 37),
],
'quarterly': [
( 2950.00, 0.00, 0),
( 7800.00, 0.00, 10),
( 22688.00, 485.00, 12),
( 45050.00, 2271.56, 22),
( 83313.00, 7191.20, 24),
( 105000.00, 16374.32, 32),
( 156038.00, 23314.16, 35),
( 'inf', 41177.46, 37),
],
'semi-annually': [
( 5900.00, 0.00, 0),
( 15600.00, 0.00, 10),
( 45375.00, 970.00, 12),
( 90100.00, 4543.00, 22),
( 166625.00, 14382.50, 24),
( 210000.00, 32748.50, 32),
( 312075.00, 46628.50, 35),
( 'inf', 82354.75, 37),
],
'annually': [
( 11800.00, 0.00, 0),
( 31200.00, 0.00, 10),
( 90750.00, 1940.00, 12),
( 180200.00, 9086.00, 22),
( 333250.00, 28765.00, 24),
( 420000.00, 65497.00, 32),
( 624150.00, 93257.00, 35),
( 'inf', 164709.50, 37),
],
}</field>
<field name="rule_parameter_id" ref="rule_parameter_941_fit_table_married"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_941_fit_table_married_2020" model="hr.rule.parameter.value">
<!-- Major changes in 2020 -->
<!-- Wage Threshold, Base Withholding Amount, Marginal Rate Over Threshold -->
<field name="parameter_value">{
'standard': [
( 0.00, 0.00, 0.00),
( 11900.00, 0.00, 0.10),
( 31650.00, 1975.00, 0.12),
( 92150.00, 9235.00, 0.22),
( 182950.00, 29211.00, 0.24),
( 338500.00, 66543.00, 0.32),
( 426600.00, 94735.00, 0.35),
( 633950.00, 167307.50, 0.37),
],
'higher': [
( 0.00, 0.00, 0.00),
( 12400.00, 0.00, 0.10),
( 22275.00, 987.50, 0.12),
( 52525.00, 4617.50, 0.22),
( 97925.00, 14605.50, 0.24),
( 175700.00, 33271.50, 0.32),
( 219750.00, 47367.50, 0.35),
( 323425.00, 83653.75, 0.37),
],
}</field>
<field name="rule_parameter_id" ref="rule_parameter_941_fit_table_married"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
<record id="rule_parameter_941_fit_table_hh" model="hr.rule.parameter">
<field name="name">Federal 941 FIT Table Head of Household</field>
<field name="code">fed_941_fit_table_hh</field>
<field name="country_id" ref="base.us"/>
</record>
<record id="rule_parameter_941_fit_table_hh_2020" model="hr.rule.parameter.value">
<!-- Major changes in 2020 -->
<!-- Wage Threshold, Base Withholding Amount, Marginal Rate Over Threshold -->
<field name="parameter_value">{
'standard': [
( 0.00, 0.00, 0.00),
( 10050.00, 0.00, 0.10),
( 24150.00, 1410.00, 0.12),
( 63750.00, 6162.00, 0.22),
( 95550.00, 13158.00, 0.24),
( 173350.00, 31830.00, 0.32),
( 217400.00, 45926.00, 0.35),
( 528450.00, 154793.50, 0.37),
],
'higher': [
( 0.00, 0.00, 0.00),
( 9325.00, 0.00, 0.10),
( 16375.00, 705.00, 0.12),
( 36175.00, 3081.00, 0.22),
( 52075.00, 6579.00, 0.24),
( 90975.00, 15915.00, 0.32),
( 113000.00, 22963.00, 0.35),
( 268525.00, 77396.75, 0.37),
],
}</field>
<field name="rule_parameter_id" ref="rule_parameter_941_fit_table_hh"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</odoo>

View File

@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id="hr_payroll_category_ee_fed_941_fit" model="hr.salary.rule.category">
<field name="name">EE: Federal 941 Income Tax Withholding</field>
<field name="code">EE_US_941_FIT</field>
<field name="parent_id" ref="hr_payroll.DED"/>
</record>
<record id="hr_payroll_rule_ee_fed_941_fit" model="hr.salary.rule">
<field name="sequence" eval="190"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_ee_fed_941_fit"/>
<field name="name">EE: US Federal Income Tax Withholding</field>
<field name="code">EE_US_941_FIT</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = ee_us_941_fit(payslip, categories, worked_days, inputs)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = ee_us_941_fit(payslip, categories, worked_days, inputs)</field>
<field name="partner_id" ref="res_partner_eftps_941"/>
<field name="appears_on_payslip" eval="True"/>
</record>
</odoo>

View File

@@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Commissions from hr_payroll_commission -->
<record id="hr_salary_rule_commission" model="hr.salary.rule">
<field name="condition_select">python</field>
<field name="condition_python">result = inputs.COMMISSION.amount > 0.0 if inputs.COMMISSION else False</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result = inputs.COMMISSION.amount if inputs.COMMISSION else 0</field>
<field name="code">BASIC_COM</field>
<field name="category_id" ref="hr_payroll.BASIC"/>
<field name="name">Commissions</field>
<field name="sequence" eval="20"/>
<field name="struct_id" ref="l10n_us_hr_payroll.hr_payroll_structure"/>
</record>
<!-- Badges from hr_payroll_gamification -->
<record id="hr_salary_rule_gamification" model="hr.salary.rule">
<field name="condition_select">python</field>
<field name="condition_python">result = inputs.BADGES.amount > 0.0 if inputs.BADGES else False</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result = inputs.BADGES.amount if inputs.BADGES else 0</field>
<field name="code">BASIC_BADGES</field>
<field name="category_id" ref="hr_payroll.BASIC"/>
<field name="name">Badges</field>
<field name="sequence" eval="20"/>
<field name="struct_id" ref="l10n_us_hr_payroll.hr_payroll_structure"/>
</record>
</odoo>

View File

@@ -0,0 +1,95 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base -->
<record id="rule_parameter_us_ak_suta_wage_base" model="hr.rule.parameter">
<field name="name">US AK Alaska SUTA Wage Base</field>
<field name="code">us_ak_suta_wage_base</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ak_suta_wage_base_2019" model="hr.rule.parameter.value">
<field name="parameter_value">39900.00</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ak_suta_wage_base"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_ak_suta_wage_base_2020" model="hr.rule.parameter.value">
<field name="parameter_value">41500.00</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ak_suta_wage_base"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Rate -->
<record id="rule_parameter_us_ak_suta_rate" model="hr.rule.parameter">
<field name="name">US AK Alaska SUTA Rate</field>
<field name="code">us_ak_suta_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ak_suta_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">1.780</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ak_suta_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_ak_suta_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">1.590</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ak_suta_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_ak_suta_ee_rate" model="hr.rule.parameter">
<field name="name">US AK Alaska SUTA Rate EE</field>
<field name="code">us_ak_suta_ee_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ak_suta_ee_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">0.500</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ak_suta_ee_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_ak_suta_ee_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">0.500</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ak_suta_ee_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_ak_dor" model="res.partner">
<field name="name">US Alaska - Department of Labor and Workforce Development (ADLWD) - Unemployment Tax</field>
</record>
<!-- Categories -->
<!-- Rules -->
<record id="hr_payroll_rule_er_us_ak_suta" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US AK Alaska State Unemployment</field>
<field name="code">ER_US_AK_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_ak_suta_wage_base', rate='us_ak_suta_rate', state_code='AK')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_ak_suta_wage_base', rate='us_ak_suta_rate', state_code='AK')</field>
<field name="partner_id" ref="res_partner_us_ak_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_ee_us_ak_suta" model="hr.salary.rule">
<field name="sequence" eval="195"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_ee_us_suta"/>
<field name="name">EE: US AK Alaska State Unemployment (UC-2)</field>
<field name="code">EE_US_AK_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_ak_suta_wage_base', rate='us_ak_suta_ee_rate', state_code='AK')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_ak_suta_wage_base', rate='us_ak_suta_ee_rate', state_code='AK')</field>
<field name="partner_id" ref="res_partner_us_ak_dor"/>
<field name="appears_on_payslip" eval="True"/>
</record>
</odoo>

View File

@@ -0,0 +1,219 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base -->
<record id="rule_parameter_us_al_suta_wage_base" model="hr.rule.parameter">
<field name="name">US AL Alabama SUTA Wage Base</field>
<field name="code">us_al_suta_wage_base</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_al_suta_wage_base_2019" model="hr.rule.parameter.value">
<field name="parameter_value">8000.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_al_suta_wage_base"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_al_suta_wage_base_2020" model="hr.rule.parameter.value">
<field name="parameter_value">8000.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_al_suta_wage_base"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Rate -->
<record id="rule_parameter_us_al_suta_rate" model="hr.rule.parameter">
<field name="name">US AL Alabama SUTA Rate</field>
<field name="code">us_al_suta_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_al_suta_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">2.7</field>
<field name="rule_parameter_id" ref="rule_parameter_us_al_suta_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_al_suta_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">2.7</field>
<field name="rule_parameter_id" ref="rule_parameter_us_al_suta_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_al_sit_tax_rate" model="hr.rule.parameter">
<field name="name">US AL Alabama SIT Tax Rate</field>
<field name="code">us_al_sit_tax_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_al_sit_tax_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">{
'0': [
( 500, 2),
( 3000, 4),
('inf', 5),
],
'M': [
( 1000, 2),
( 6000, 4),
('inf', 5),
],
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_al_sit_tax_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_al_sit_tax_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">{
'0' : [
( 500, 2),
( 2500, 4),
('inf', 5),
],
'M': [
( 1000, 2),
( 5000, 4),
('inf', 5),
],
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_al_sit_tax_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_al_sit_dependent_rate" model="hr.rule.parameter">
<field name="name">US AL Alabama Dependent Rate</field>
<field name="code">us_al_sit_dependent_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<!-- https://revenue.alabama.gov/wp-content/uploads/2019/01/whbooklet_0119.pdf -->
<!-- Page 7. D-->
<record id="rule_parameter_us_al_sit_dependent_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">[
( 1000, 20000),
( 500, 100000),
( 300, 'inf'),
]</field>
<field name="rule_parameter_id" ref="rule_parameter_us_al_sit_dependent_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<!-- https://revenue.alabama.gov/wp-content/uploads/2019/01/whbooklet_0119.pdf -->
<!-- Page 7. D-->
<record id="rule_parameter_us_al_sit_dependent_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">[
( 1000, 20000),
( 500, 100000),
( 300, 'inf'),
]</field>
<field name="rule_parameter_id" ref="rule_parameter_us_al_sit_dependent_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_al_sit_standard_deduction_rate" model="hr.rule.parameter">
<field name="name">US AL Alabama Standard Deduction Rate</field>
<field name="code">us_al_sit_standard_deduction_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<!-- https://revenue.alabama.gov/wp-content/uploads/2019/01/whbooklet_0119.pdf -->
<!-- Page 7. A-->
<record id="rule_parameter_us_al_sit_standard_deduction_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">{
'0': ((23499.0, 2500.0), (33000.0, 2500.0, 25.0, 500.0), ('inf', 2000.0)),
'S': ((23499.0, 2500.0), (33000.0, 2500.0, 25.0, 500.0), ('inf', 2000.0)),
'MS': ((10749.0, 3750.0), (15500.0, 3750.0, 88.0, 250.0), ('inf', 2000.0)),
'M': ((23499.0, 7500.0), (33000.0, 7500.0, 175.0, 500.0), ('inf', 4000.0)),
'H': ((23499.0, 4700.0), (33000.0, 7500.0, 175.0, 500.0), ('inf', 4000.0)),
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_al_sit_standard_deduction_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<!-- https://revenue.alabama.gov/wp-content/uploads/2019/01/whbooklet_0119.pdf -->
<!-- Page 7. A-->
<record id="rule_parameter_us_al_sit_standard_deduction_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">{
'0': ((23499.0, 2500.0), (33000.0, 2500.0, 25.0, 500.0), ('inf', 2000.0)),
'S': ((23499.0, 2500.0), (33000.0, 2500.0, 25.0, 500.0), ('inf', 2000.0)),
'MS': ((10749.0, 3750.0), (15500.0, 3750.0, 88.0, 250.0), ('inf', 2000.0)),
'M': ((23499.0, 7500.0), (33000.0, 7500.0, 175.0, 500.0), ('inf', 4000.0)),
'H': ((23499.0, 4700.0), (33000.0, 7500.0, 175.0, 500.0), ('inf', 4000.0)),
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_al_sit_standard_deduction_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_al_sit_personal_exemption_rate" model="hr.rule.parameter">
<field name="name">US AL Alabama Personal Exemption Rate</field>
<field name="code">us_al_sit_personal_exemption_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<!-- https://revenue.alabama.gov/wp-content/uploads/2019/01/whbooklet_0119.pdf -->
<!-- Page 7. C-->
<record id="rule_parameter_us_al_sit_personal_exemption_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">{
'0' : 0,
'S' : 1500,
'MS': 1500,
'M' : 3000,
'H' : 3000,
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_al_sit_personal_exemption_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<!-- https://revenue.alabama.gov/wp-content/uploads/2019/01/whbooklet_0119.pdf -->
<!-- Page 7. C-->
<record id="rule_parameter_us_al_sit_personal_exemption_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">{
'0' : 0,
'S' : 1500,
'MS': 1500,
'M' : 3000,
'H' : 3000,
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_al_sit_personal_exemption_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_al_dor" model="res.partner">
<field name="name">US Alabama - Department of Economic Security (IDES) - Unemployment Tax</field>
</record>
<record id="res_partner_us_al_dor_sit" model="res.partner">
<field name="name">US Alabama - Department of Revenue (IDOR) - Income Tax</field>
</record>
<!-- Categories -->
<!-- Rules -->
<record id="hr_payroll_rule_er_us_al_suta" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US AL Alabama State Unemployment</field>
<field name="code">ER_US_AL_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_al_suta_wage_base', rate='us_al_suta_rate', state_code='AL')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_al_suta_wage_base', rate='us_al_suta_rate', state_code='AL')</field>
<field name="partner_id" ref="res_partner_us_al_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_ee_us_al_sit" model="hr.salary.rule">
<field name="sequence" eval="195"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_ee_us_sit"/>
<field name="name">EE: US AL Alabama State Income Tax Withholding</field>
<field name="code">EE_US_AL_SIT</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = al_alabama_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = al_alabama_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="partner_id" ref="res_partner_us_al_dor_sit"/>
<field name="appears_on_payslip" eval="True"/>
</record>
</odoo>

View File

@@ -0,0 +1,145 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base -->
<record id="rule_parameter_us_ar_suta_wage_base" model="hr.rule.parameter">
<field name="name">US AR Arkansas SUTA Wage Base</field>
<field name="code">us_ar_suta_wage_base</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ar_suta_wage_base_2019" model="hr.rule.parameter.value">
<field name="parameter_value">10000.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ar_suta_wage_base"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_ar_suta_wage_base_2020" model="hr.rule.parameter.value">
<field name="parameter_value">8000.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ar_suta_wage_base"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Rate -->
<record id="rule_parameter_us_ar_suta_rate" model="hr.rule.parameter">
<field name="name">US AR Arkansas SUTA Rate</field>
<field name="code">us_ar_suta_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ar_suta_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">3.2</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ar_suta_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_ar_suta_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">2.9</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ar_suta_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_ar_sit_tax_rate" model="hr.rule.parameter">
<field name="name">US AR Arkansas SIT Tax Rate</field>
<field name="code">us_ar_sit_tax_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ar_sit_tax_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">[
( 4599, 0.0, 0.00),
( 9099, 2.0, 91.98),
( 13699, 3.0, 182.97),
( 22599, 3.4, 237.77),
( 37899, 5.0, 421.46),
( 80800, 5.9, 762.55),
( 81800, 6.6, 1243.40),
( 82800, 6.6, 1143.40),
( 84100, 6.6, 1043.40),
( 85200, 6.6, 943.40),
( 86200, 6.6, 843.40),
( 'inf', 6.6, 803.40),
]</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ar_sit_tax_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<!-- https://www.dfa.arkansas.gov/images/uploads/incomeTaxOffice/whformula.pdf-->
<!-- Notover, percentage , minus adjustment page 1. 3.-->
<record id="rule_parameter_us_ar_sit_tax_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">[
( 4599, 0.0, 0.00),
( 9099, 2.0, 91.98),
( 13699, 3.0, 182.97),
( 22599, 3.4, 237.77),
( 37899, 5.0, 421.46),
( 80800, 5.9, 762.55),
( 81800, 6.6, 1243.40),
( 82800, 6.6, 1143.40),
( 84100, 6.6, 1043.40),
( 85200, 6.6, 943.40),
( 86200, 6.6, 843.40),
( 'inf', 6.6, 803.40),
]</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ar_sit_tax_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_ar_sit_standard_deduction_rate" model="hr.rule.parameter">
<field name="name">US AR Arkansas Allowances Rate</field>
<field name="code">us_ar_sit_standard_deduction_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ar_sit_standard_deduction_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">2200.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ar_sit_standard_deduction_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_ar_sit_standard_deduction_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">2200.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ar_sit_standard_deduction_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_ar_dor" model="res.partner">
<field name="name">US Arkansas - Department of Workforce Solutions - Unemployment Tax</field>
</record>
<record id="res_partner_us_ar_dor_sit" model="res.partner">
<field name="name">US Arkansas - Department of Financial Administration - Income Tax</field>
</record>
<!-- Categories -->
<!-- Rules -->
<record id="hr_payroll_rule_er_us_ar_suta" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US AR Arkansas State Unemployment</field>
<field name="code">ER_US_AR_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_ar_suta_wage_base', rate='us_ar_suta_rate', state_code='AR')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_ar_suta_wage_base', rate='us_ar_suta_rate', state_code='AR')</field>
<field name="partner_id" ref="res_partner_us_ar_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_ee_us_ar_sit" model="hr.salary.rule">
<field name="sequence" eval="195"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_ee_us_sit"/>
<field name="name">EE: US AR Arkansas State Income Tax Withholding</field>
<field name="code">EE_US_AR_SIT</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = ar_arkansas_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = ar_arkansas_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="partner_id" ref="res_partner_us_ar_dor_sit"/>
<field name="appears_on_payslip" eval="True"/>
</record>
</odoo>

View File

@@ -0,0 +1,81 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base -->
<record id="rule_parameter_us_az_suta_wage_base" model="hr.rule.parameter">
<field name="name">US AZ Arizona SUTA Wage Base</field>
<field name="code">us_az_suta_wage_base</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_az_suta_wage_base_2019" model="hr.rule.parameter.value">
<field name="parameter_value">7000.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_az_suta_wage_base"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_az_suta_wage_base_2020" model="hr.rule.parameter.value">
<field name="parameter_value">7000.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_az_suta_wage_base"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Rate -->
<record id="rule_parameter_us_az_suta_rate" model="hr.rule.parameter">
<field name="name">US AZ Arizona SUTA Rate</field>
<field name="code">us_az_suta_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_az_suta_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">2.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_az_suta_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_az_suta_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">2.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_az_suta_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_az_dor" model="res.partner">
<field name="name">US Arizona - Department of Economic Security (ADES) - Unemployment Tax</field>
</record>
<record id="res_partner_us_az_dor_sit" model="res.partner">
<field name="name">US Arizona - Department of Revenue (ADOR) - Income Tax</field>
</record>
<!-- Categories -->
<!-- Rules -->
<record id="hr_payroll_rule_er_us_az_suta" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US AZ Arizona State Unemployment</field>
<field name="code">ER_US_AZ_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_az_suta_wage_base', rate='us_az_suta_rate', state_code='AZ')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_az_suta_wage_base', rate='us_az_suta_rate', state_code='AZ')</field>
<field name="partner_id" ref="res_partner_us_az_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_ee_us_az_sit" model="hr.salary.rule">
<field name="sequence" eval="195"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_ee_us_sit"/>
<field name="name">EE: US AZ Arizona State Income Tax Withholding</field>
<field name="code">EE_US_AZ_SIT</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = az_arizona_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = az_arizona_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="partner_id" ref="res_partner_us_az_dor_sit"/>
<field name="appears_on_payslip" eval="True"/>
</record>
</odoo>

View File

@@ -0,0 +1,829 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base -->
<record id="rule_parameter_us_ca_suta_wage_base" model="hr.rule.parameter">
<field name="name">US CA California SUTA Wage Base</field>
<field name="code">us_ca_suta_wage_base</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ca_suta_wage_base_2019" model="hr.rule.parameter.value">
<field name="parameter_value">7000.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ca_suta_wage_base"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_ca_suta_wage_base_2020" model="hr.rule.parameter.value">
<field name="parameter_value">7000.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ca_suta_wage_base"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Rate -->
<record id="rule_parameter_us_ca_suta_rate" model="hr.rule.parameter">
<field name="name">US CA California SUTA Rate</field>
<field name="code">us_ca_suta_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ca_suta_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">3.5</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ca_suta_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_ca_suta_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">3.4</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ca_suta_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- ETT Rate -->
<record id="rule_parameter_us_ca_suta_ett_rate" model="hr.rule.parameter">
<field name="name">US CA California SUTA ETT Rate</field>
<field name="code">us_ca_suta_ett_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ca_suta_ett_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">0.1</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ca_suta_ett_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_ca_suta_ett_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">0.1</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ca_suta_ett_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- SDI Rate -->
<record id="rule_parameter_us_ca_suta_sdi_rate" model="hr.rule.parameter">
<field name="name">US CA California SUTA SDI Rate</field>
<field name="code">us_ca_suta_sdi_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ca_suta_sdi_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">1.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ca_suta_sdi_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_ca_suta_sdi_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">1.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ca_suta_sdi_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_ca_sit_tax_rate" model="hr.rule.parameter">
<field name="name">US CA California SIT Tax Rate</field>
<field name="code">us_ca_sit_tax_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ca_sit_tax_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">{
'head_household': {
'weekly': (
( 316, 0.0110, 0.00),
( 750, 0.0220, 3.48),
( 967, 0.0440, 13.03),
( 1196, 0.0660, 22.58),
( 1413, 0.0880, 37.69),
( 7212, 0.1023, 56.79),
( 8654, 0.1133, 650.03),
(14423, 0.1243, 813.41),
(19231, 0.1353, 1530.50),
('inf', 0.1463, 2181.02),
),
'bi-weekly': (
( 632, 0.0110, 0.00),
( 1500, 0.0220, 6.95),
( 1934, 0.0440, 26.05),
( 2392, 0.0660, 45.15),
( 2826, 0.0880, 75.38),
(14424, 0.1023, 113.57),
(17308, 0.1133, 1300.05),
(28846, 0.1243, 1626.81),
(38462, 0.1353, 3060.98),
('inf', 0.1463, 4362.02),
),
'semi-monthly': (
( 686, 0.0110, 0.00),
( 1625, 0.0220, 7.55),
( 2094, 0.0440, 28.21),
( 2592, 0.0660, 48.85),
( 3062, 0.0880, 81.72),
(15625, 0.1023, 123.08),
(18750, 0.1133, 1408.27),
(31250, 0.1243, 1762.33),
(41667, 0.1353, 3316.08),
('inf', 0.1463, 4725.50),
),
'monthly': (
( 1372, 0.0110, 0.00),
( 3250, 0.0220, 15.09),
( 4188, 0.0440, 56.41),
( 5184, 0.0660, 97.68),
( 6124, 0.0880, 163.42),
(31250, 0.1023, 246.14),
(37500, 0.1133, 2816.53),
(62500, 0.1243, 3524.66),
(83334, 0.1353, 6632.16),
('inf', 0.1463, 9451.00),
),
'quarterly': (
( 4114, 0.0110, 0.00),
( 9748, 0.0220, 45.25),
( 12566, 0.0440, 169.20),
( 15552, 0.0660, 293.19),
( 18369, 0.0880, 490.27),
( 93751, 0.1023, 738.17),
(112501, 0.1133, 8449.75),
(187501, 0.1243, 10574.13),
(250000, 0.1353, 19896.63),
( 'inf', 0.1463, 28352.74),
),
'semi-annual': (
( 8228, 0.0110, 0.00),
( 19496, 0.0220, 90.51),
( 25132, 0.0440, 338.41),
( 31104, 0.0660, 586.39),
( 36738, 0.0880, 980.54),
(187502, 0.1023, 1476.33),
(225002, 0.1133, 16899.49),
(375002, 0.1243, 21148.24),
(500000, 0.1353, 39793.24),
( 'inf', 0.1463, 56705.47),
),
'annually': (
( 16457, 0.0110, 0.00),
( 38991, 0.0220, 181.03),
( 50264, 0.0440, 676.78),
( 62206, 0.0660, 1172.79),
( 73477, 0.0880, 1960.96),
( 375002, 0.1023, 2952.81),
( 450003, 0.1133, 33798.82),
( 750003, 0.1243, 42296.43),
(1000000, 0.1353, 79586.43),
( 'inf', 0.1463, 113411.02),
),
},
'married': {
'weekly': (
( 316, 0.0110, 0.00),
( 750, 0.0220, 3.48),
( 1184, 0.0440, 13.03),
( 1642, 0.0660, 32.13),
( 2076, 0.0880, 62.36),
(10606, 0.1023, 100.55),
(12726, 0.1133, 973.17),
(19231, 0.1243, 1213.37),
(21210, 0.1353, 2021.94),
('inf', 0.1463, 2289.70),
),
'bi-weekly': (
( 632, 0.0110, 0.00),
( 1500, 0.0220, 6.95),
( 2368, 0.0440, 26.05),
( 3284, 0.0660, 64.24),
( 4152, 0.0880, 124.70),
(21212, 0.1023, 201.08),
(25452, 0.1133, 1946.32),
(38462, 0.1243, 2426.71),
(42420, 0.1353, 4043.85),
('inf', 0.1463, 4579.37),
),
'semi-monthly': (
( 686, 0.0110, 0.00),
( 1624, 0.0220, 7.55),
( 2564, 0.0440, 28.19),
( 3560, 0.0660, 69.55),
( 4498, 0.0880, 135.29),
(22978, 0.1023, 217.83),
(27574, 0.1133, 2108.33),
(41667, 0.1243, 2629.06),
(45956, 0.1353, 4380.82),
('inf', 0.1463, 4961.12),
),
'monthly': (
( 1372, 0.0110, 0.00),
( 3248, 0.0220, 15.09),
( 5128, 0.0440, 56.36),
( 7120, 0.0660, 139.08),
( 8996, 0.0880, 270.55),
(45956, 0.1023, 435.64),
(55148, 0.1133, 4216.65),
(83334, 0.1243, 5258.10),
(91912, 0.1353, 8761.62),
('inf', 0.1463, 9922.22),
),
'quarterly': (
( 4112, 0.0110, 0.00),
( 9748, 0.0220, 45.23),
( 15384, 0.0440, 169.22),
( 21356, 0.0660, 417.20),
( 26990, 0.0880, 811.35),
(137870, 0.1023, 1307.14),
(165442, 0.1133, 12650.16),
(250000, 0.1243, 15774.07),
(275736, 0.1353, 26284.63),
( 'inf', 0.1463, 29766.71),
),
'semi-annual': (
( 8224, 0.0110, 0.00),
( 19496, 0.0220, 90.46),
( 30768, 0.0440, 338.44),
( 42712, 0.0660, 834.41),
( 53980, 0.0880, 1622.71),
(275740, 0.1023, 2614.29),
(330884, 0.1133, 25300.34),
(500000, 0.1243, 31548.16),
(551472, 0.1353, 52569.28),
( 'inf', 0.1463, 59533.44),
),
'annually': (
( 16446, 0.0110, 0.00),
( 38990, 0.0220, 180.91),
( 61538, 0.0440, 676.88),
( 85422, 0.0660, 1668.99),
( 107960, 0.0880, 3245.33),
( 551476, 0.1023, 5228.67),
( 661768, 0.1133, 50600.36),
(1000000, 0.1243, 63096.44),
(1102946, 0.1353, 105138.68),
( 'inf', 0.1463, 119067.26),
),
},
'single': {
'weekly': (
( 158, 0.0110, 0.00),
( 375, 0.0220, 1.74),
( 592, 0.0440, 6.51),
( 821, 0.0660, 16.06),
( 1038, 0.0880, 31.17),
( 5303, 0.1023, 50.27),
( 6363, 0.1133, 486.58),
(10605, 0.1243, 606.68),
(19231, 0.1353, 1133.96),
('inf', 0.1463, 2301.06),
),
'bi-weekly': (
( 316, 0.0110, 0.00),
( 750, 0.0220, 3.48),
( 1184, 0.0440, 13.03),
( 1642, 0.066, 32.13),
( 2076, 0.0880, 62.36),
(10606, 0.1023, 100.55),
(12726, 0.1133, 973.17),
(21210, 0.1243, 1213.37),
(38462, 0.1353, 2267.93),
('inf', 0.1463, 4602.13),
),
'semi-monthly': (
( 343, 0.0110, 0.00),
( 812, 0.0220, 3.77),
( 1282, 0.0440, 14.09),
( 1780, 0.0660, 34.77),
( 2249, 0.0880, 67.64),
(11489, 0.1023, 108.91),
(13787, 0.1133, 1054.16),
(22978, 0.1243, 1314.52),
(41667, 0.1353, 2456.96),
('inf', 0.1463, 4985.58),
),
'monthly': (
( 686, 0.0110, 0.00),
( 1624, 0.0220, 7.55),
( 2564, 0.0440, 28.19),
( 3560, 0.0660, 69.55),
( 4498, 0.0880, 135.29),
(22978, 0.1023, 217.83),
(27574, 0.1133, 2108.33),
(45956, 0.1243, 2629.06),
(83334, 0.1353, 4913.94),
('inf', 0.1463, 9971.18),
),
'quarterly': (
( 2056, 0.0110, 0.00),
( 4874, 0.0220, 22.62),
( 7692, 0.0440, 84.62),
( 10678, 0.066, 208.61),
( 13495, 0.0880, 405.69),
( 68935, 0.1023, 653.59),
( 82721, 0.1133, 6325.10),
(137868, 0.1243, 7887.05),
(250000, 0.1353, 14741.82),
( 'inf', 0.1463, 29913.28),
),
'semi-annual': (
( 4112, 0.0110, 0.00),
( 9748, 0.0220, 45.23),
( 15384, 0.0440, 169.22),
( 21356, 0.0660, 417.20),
( 26990, 0.0880, 811.35),
(137870, 0.1023, 1307.14),
(165442, 0.1133, 12650.16),
(275736, 0.1243, 15774.07),
(500000, 0.1353, 29483.61),
('inf', 0.1463, 59826.53),
),
'annually': (
( 8223, 0.0110, 0.00),
( 19495, 0.0220, 90.45),
( 30769, 0.0440, 338.43),
( 42711, 0.0660, 834.49),
( 53980, 0.0880, 1622.66),
( 275738, 0.1023, 2614.33),
( 330884, 0.1133, 25300.17),
( 551473, 0.1243, 31548.21),
(1000000, 0.1353, 58967.42),
( 'inf', 0.1463, 119653.12),
),
},
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ca_sit_tax_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<!-- https://www.edd.ca.gov/pdf_pub_ctr/20methb.pdf -->
<!-- Table 5. Tax rate table -->
<record id="rule_parameter_us_ca_sit_tax_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">{
'head_household': {
'weekly': (
( 339, 0.0110, 0.00),
( 803, 0.0220, 3.73),
( 1035, 0.0440, 13.93),
( 1281, 0.0660, 24.15),
( 1514, 0.0880, 40.39),
( 7725, 0.1023, 60.89),
( 9270, 0.1133, 696.28),
(15450, 0.1243, 871.33),
(19231, 0.1353, 1639.50),
('inf', 0.1463, 2151.07),
),
'bi-weekly': (
( 678, 0.0110, 0.00),
( 1606, 0.0220, 7.46),
( 2070, 0.0440, 27.88),
( 2562, 0.0660, 48.30),
( 3028, 0.0880, 80.77),
(15450, 0.1023, 121.78),
(18540, 0.1133, 1392.55),
(30900, 0.1243, 1742.65),
(38462, 0.1353, 3279.00),
('inf', 0.1463, 4302.14),
),
'semi-monthly': (
( 735, 0.0110, 0.00),
( 1740, 0.0220, 8.09),
( 2243, 0.0440, 30.20),
( 2777, 0.0660, 52.33),
( 3280, 0.0880, 87.57),
(16738, 0.1023, 131.83),
(20085, 0.1133, 1508.58),
(33475, 0.1243, 1887.80),
(41667, 0.1353, 3552.18),
('inf', 0.1463, 4660.56),
),
'monthly': (
( 1470, 0.0110, 0.00),
( 3480, 0.0220, 16.17),
( 4486, 0.0440, 60.39),
( 5554, 0.0660, 104.65),
( 6560, 0.0880, 175.14),
(33476, 0.1023, 263.67),
(40170, 0.1133, 3017.18),
(66950, 0.1243, 3775.61),
(83334, 0.1353, 7104.36),
('inf', 0.1463, 9321.12),
),
'quarterly': (
( 4407, 0.0110, 0.00),
( 10442, 0.0220, 48.48),
( 13461, 0.0440, 181.25),
( 16659, 0.0660, 314.09),
( 19678, 0.0880, 525.16),
(100426, 0.1023, 790.83),
(120512, 0.1133, 9051.35),
(200853, 0.1243, 11327.09),
(250000, 0.1353, 21313.48),
( 'inf', 0.1463, 27963.07),
),
'semi-annual': (
( 8814, 0.0110, 0.00),
( 20884, 0.0220, 96.95),
( 26922, 0.0440, 362.49),
( 33318, 0.0660, 628.16),
( 39356, 0.0880, 1050.30),
(200852, 0.1023, 1581.64),
(241024, 0.1133, 18102.68),
(401706, 0.1243, 22654.17),
(500000, 0.1353, 42626.94),
( 'inf', 0.1463, 55926.12),
),
'annually': (
( 17629, 0.0110, 0.00),
( 41768, 0.0220, 193.92),
( 53843, 0.0440, 724.98),
( 66636, 0.0660, 1256.28),
( 78710, 0.0880, 2100.62),
( 401705, 0.1023, 3163.13),
( 482047, 0.1133, 36205.52),
( 803410, 0.1243, 45308.27),
(1000000, 0.1353, 85253.69),
( 'inf', 0.1463, 111852.32),
),
},
'married': {
'weekly': (
( 338, 0.0110, 0.00),
( 804, 0.0220, 3.72),
( 1268, 0.0440, 13.97),
( 1760, 0.0660, 34.39),
( 2224, 0.0880, 66.86),
(11360, 0.1023, 107.69),
(13632, 0.1133, 1042.30),
(19231, 0.1243, 1299.72),
(22721, 0.1353, 1995.68),
('inf', 0.1463, 2467.88),
),
'bi-weekly': (
( 676, 0.0110, 0.00),
( 1608, 0.0220, 7.44),
( 2536, 0.0440, 27.94),
( 3520, 0.0660, 68.77),
( 4448, 0.0880, 124.70),
(21212, 0.1023, 201.08),
(25452, 0.1133, 1946.32),
(38462, 0.1243, 2426.71),
(42420, 0.1353, 4043.85),
('inf', 0.1463, 4579.37),
),
'semi-monthly': (
( 734, 0.0110, 0.00),
( 1740, 0.0220, 8.07),
( 2746, 0.0440, 30.20),
( 3812, 0.0660, 74.46),
( 4818, 0.0880, 144.82),
(24614, 0.1023, 233.35),
(29538, 0.1133, 2258.48),
(41667, 0.1243, 2816.37),
(49229, 0.1353, 4324.00),
('inf', 0.1463, 5347.14),
),
'monthly': (
( 1468, 0.0110, 0.00),
( 3480, 0.0220, 16.15),
( 5492, 0.0440, 60.41),
( 7624, 0.0660, 148.94),
( 9636, 0.0880, 289.65),
(49228, 0.1023, 466.71),
(59076, 0.1133, 4516.97),
(83334, 0.1243, 5632.75),
(98458, 0.1353, 8648.02),
('inf', 0.1463, 10694.30),
),
'quarterly': (
( 4404, 0.0110, 0.00),
( 10442, 0.0220, 48.44),
( 16480, 0.0440, 181.28),
( 22876, 0.0660, 446.95),
( 28912, 0.0880, 869.09),
(147686, 0.1023, 1400.26),
(177222, 0.1133, 13550.84),
(250000, 0.1243, 16897.27),
(295371, 0.1353, 25943.58),
( 'inf', 0.1463, 32082.28),
),
'semi-annual': (
( 8808, 0.0110, 0.00),
( 20884, 0.0220, 96.89),
( 32960, 0.0440, 362.56),
( 45752, 0.0660, 893.90),
( 57824, 0.0880, 1738.17),
(295372, 0.1023, 2800.51),
(354444, 0.1133, 27101.67),
(500000, 0.1243, 33794.53),
(590742, 0.1353, 51887.14),
( 'inf', 0.1463, 64164.53),
),
'annually': (
( 17618, 0.0110, 0.00),
( 41766, 0.0220, 193.80),
( 65920, 0.0440, 725.06),
( 91506, 0.0660, 1787.84),
( 115648, 0.0880, 3476.52),
( 590746, 0.1023, 5601.02),
( 708890, 0.1133, 54203.55),
(1000000, 0.1243, 67589.27),
(1181484, 0.1353, 103774.24),
( 'inf', 0.1463, 128329.03),
),
},
'single': {
'weekly': (
( 169, 0.0110, 0.00),
( 402, 0.0220, 1.86),
( 634, 0.0440, 6.99),
( 880, 0.0660, 17.20),
( 1112, 0.0880, 33.44),
( 5680, 0.1023, 53.86),
( 6816, 0.1133, 521.17),
(11360, 0.1243, 649.88),
(19231, 0.1353, 1214.70),
('inf', 0.1463, 2279.65),
),
'bi-weekly': (
( 338, 0.0110, 0.00),
( 804, 0.0220, 3.72),
( 1268, 0.0440, 13.97),
( 1760, 0.0660, 34.39),
( 2224, 0.0880, 66.86),
(11360, 0.1023, 107.69),
(13632, 0.1133, 1042.30),
(22720, 0.1243, 1299.72),
(38462, 0.1353, 2429.36),
('inf', 0.1463, 4559.25),
),
'semi-monthly': (
( 367, 0.0110, 0.00),
( 870, 0.0220, 4.04),
( 1373, 0.0440, 15.11),
( 1906, 0.0660, 37.24),
( 2409, 0.0880, 72.42),
(12307, 0.1023, 116.68),
(14769, 0.1133, 1129.25),
(24614, 0.1243, 1408.19),
(41667, 0.1353, 2631.92),
('inf', 0.1463, 4939.19),
),
'monthly': (
( 734, 0.0110, 0.00),
( 1740, 0.0220, 8.07),
( 2746, 0.0440, 30.20),
( 3812, 0.0660, 74.46),
( 4818, 0.0880, 144.82),
(24614, 0.1023, 233.35),
(29538, 0.1133, 2258.48),
(49228, 0.1243, 2816.37),
(83334, 0.1353, 5263.84),
('inf', 0.1463, 9878.38),
),
'quarterly': (
( 2202, 0.0110, 0.00),
( 5221, 0.0220, 24.22),
( 8240, 0.0440, 90.64),
( 11438, 0.0660, 223.48),
( 14456, 0.0880, 434.55),
( 73843, 0.1023, 700.13),
( 88611, 0.1133, 6775.42),
(147686, 0.1243, 8448.63),
(250000, 0.1353, 15791.65),
( 'inf', 0.1463, 29634.73),
),
'semi-annual': (
( 4404, 0.0110, 0.00),
( 10442, 0.0220, 48.44),
( 16480, 0.0440, 181.28),
( 22876, 0.0660, 446.95),
( 28912, 0.0880, 869.09),
(147686, 0.1023, 1400.26),
(177222, 0.1133, 13550.84),
(295372, 0.1243, 16897.27),
(500000, 0.1353, 31583.32),
( 'inf', 0.1463, 59269.49),
),
'annually': (
( 8809, 0.0110, 0.00),
( 20883, 0.0220, 96.90),
( 32960, 0.0440, 362.53),
( 45753, 0.0660, 893.92),
( 57824, 0.0880, 1738.26),
( 295373, 0.1023, 2800.51),
( 354445, 0.1133, 27101.77),
( 590742, 0.1243, 33794.63),
(1000000, 0.1353, 63166.35),
( 'inf', 0.1463, 118538.96),
),
},
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ca_sit_tax_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_ca_sit_income_exemption_rate" model="hr.rule.parameter">
<field name="name">US CA California Low Income Exemption Rate</field>
<field name="code">us_ca_sit_income_exemption_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ca_sit_income_exemption_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">{
'weekly': ( 280, 280, 561, 561),
'bi-weekly': ( 561, 561, 1121, 1121),
'semi-monthly': ( 607, 607, 1214, 1214),
'monthly': ( 1214, 1214, 2429, 2429),
'quarterly': ( 3643, 3643, 7287, 7287),
'semi-annual': ( 7287, 7287, 14573, 14573),
'annually': (14573, 14573, 29146, 29146),
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ca_sit_income_exemption_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<!-- https://www.edd.ca.gov/pdf_pub_ctr/20methb.pdf -->
<!-- Table 1. Low income exemption table -->
<record id="rule_parameter_us_ca_sit_income_exemption_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">{
'weekly': ( 289, 289, 579, 579),
'bi-weekly': ( 579, 579, 1157, 1157),
'semi-monthly': ( 627, 627, 1253, 1253),
'monthly': ( 1254, 1254, 2507, 2507),
'quarterly': ( 3761, 3761, 7521, 7521),
'semi-annual': ( 7521, 7521, 15042, 15042),
'annually': (15042, 15042, 30083, 30083),
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ca_sit_income_exemption_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_ca_sit_estimated_deduction_rate" model="hr.rule.parameter">
<field name="name">US CA California Estimated Deduction Rate</field>
<field name="code">us_ca_sit_estimated_deduction_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ca_sit_estimated_deduction_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">{
'weekly': ( 19, 38, 58, 77, 96, 115, 135, 154, 173, 192),
'bi-weekly': ( 38, 77, 115, 154, 192, 231, 269, 308, 346, 385),
'semi-monthly': ( 42, 83, 125, 167, 208, 250, 292, 333, 375, 417),
'monthly': ( 83, 167, 250, 333, 417, 500, 583, 667, 750, 833),
'quarterly': ( 250, 500, 750, 1000, 1250, 1500, 1750, 2000, 2250, 2500),
'semi-annual': ( 500, 1000, 1500, 2000, 2500, 3000, 3500, 4000, 4500, 5000),
'annually': (1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 10000),
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ca_sit_estimated_deduction_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<!-- https://www.edd.ca.gov/pdf_pub_ctr/20methb.pdf -->
<!-- Table 2. Estimated Deduction table -->
<record id="rule_parameter_us_ca_sit_estimated_deduction_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">{
'weekly': ( 19, 38, 58, 77, 96, 115, 135, 154, 173, 192),
'bi-weekly': ( 38, 77, 115, 154, 192, 231, 269, 308, 346, 385),
'semi-monthly': ( 42, 83, 125, 167, 208, 250, 292, 333, 375, 417),
'monthly': ( 83, 167, 250, 333, 417, 500, 583, 667, 750, 833),
'quarterly': ( 250, 500, 750, 1000, 1250, 1500, 1750, 2000, 2250, 2500),
'semi-annual': ( 500, 1000, 1500, 2000, 2500, 3000, 3500, 4000, 4500, 5000),
'annually': (1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 10000),
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ca_sit_estimated_deduction_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_ca_sit_standard_deduction_rate" model="hr.rule.parameter">
<field name="name">US CA California Standard Deduction Rate</field>
<field name="code">us_ca_sit_standard_deduction_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ca_sit_standard_deduction_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">{
'weekly': ( 85, 85, 169, 169),
'bi-weekly': ( 169, 169, 339, 339),
'semi-monthly': ( 183, 183, 367, 367),
'monthly': ( 367, 367, 734, 734),
'quarterly': (1100, 1100, 2201, 2201),
'semi-annual': (2201, 2201, 4401, 4401),
'annually': (4401, 4401, 8802, 8802),
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ca_sit_standard_deduction_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<!-- https://www.edd.ca.gov/pdf_pub_ctr/20methb.pdf -->
<!-- Table 3. Standard Deduction table -->
<record id="rule_parameter_us_ca_sit_standard_deduction_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">{
'weekly': ( 87, 87, 175, 175),
'bi-weekly': ( 175, 175, 349, 349),
'semi-monthly': ( 189, 189, 378, 378),
'monthly': ( 378, 378, 756, 756),
'quarterly': (1134, 1134, 2269, 2269),
'semi-annual': (2269, 2269, 4537, 4537),
'annually': (4537, 4537, 9074, 9074),
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ca_sit_standard_deduction_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_ca_sit_exemption_allowance_rate" model="hr.rule.parameter">
<field name="name">US CA California Exemption Allowance Rate</field>
<field name="code">us_ca_sit_exemption_allowance_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ca_sit_exemption_allowance_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">{
'weekly': ( 2.41, 4.82, 7.23, 9.65, 12.06, 14.47, 16.88, 19.29, 21.70, 24.12),
'bi-weekly': ( 4.82, 9.65, 14.47, 19.29, 24.12, 28.94, 33.76, 38.58, 43.41, 48.23),
'semi-monthly': ( 5.23, 10.45, 15.68, 20.90, 26.13, 31.35, 36.58, 41.80, 47.03, 52.25),
'monthly': ( 10.45, 20.90, 31.35, 41.80, 52.25, 62.70, 73.15, 83.60, 94.05, 104.50),
'quarterly': ( 31.35, 62.70, 94.05, 125.40, 156.75, 188.10, 219.45, 250.80, 282.15, 313.50),
'semi-annual': ( 62.70, 125.40, 188.10, 250.80, 313.50, 376.20, 438.90, 501.60, 564.30, 627.00),
'annually': (125.40, 250.80, 376.20, 501.60, 627.00, 752.40, 877.80, 1003.20, 1128.60, 1254.00),
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ca_sit_exemption_allowance_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<!-- https://www.edd.ca.gov/pdf_pub_ctr/20methb.pdf -->
<!-- Table 4. Exemption Allowance table -->
<record id="rule_parameter_us_ca_sit_exemption_allowance_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">{
'weekly': ( 2.58, 5.16, 7.74, 10.32, 12.90, 15.48, 18.07, 20.65, 23.23, 25.81),
'bi-weekly': ( 5.16, 10.32, 15.48, 20.65, 25.81, 30.97, 36.13, 41.29, 46.45, 51.62),
'semi-monthly': ( 5.59, 11.18, 16.78, 22.37, 27.96, 33.55, 39.14, 44.73, 50.33, 55.92),
'monthly': ( 11.18, 22.37, 33.55, 44.73, 55.92, 67.10, 78.28, 89.47, 100.65, 111.83),
'quarterly': ( 33.55, 67.10, 100.65, 134.20, 167.75, 201.30, 234.85, 268.40, 301.95, 335.50),
'semi-annual': ( 67.10, 134.20, 201.30, 268.40, 335.50, 402.60, 469.70, 536.80, 603.90, 671.00),
'annually': (134.20, 268.40, 402.60, 536.80, 671.00, 805.20, 939.40, 1073.60, 1207.80, 1342.00),
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ca_sit_exemption_allowance_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_ca_dor" model="res.partner">
<field name="name">US California - Department of Taxation (CA DE88) - Unemployment Tax</field>
</record>
<record id="res_partner_us_ca_dor_sit" model="res.partner">
<field name="name">US California - Department of Taxation - Income Tax</field>
</record>
<!-- Categories -->
<!-- Rules -->
<record id="hr_payroll_rule_er_us_ca_suta" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US CA California State Unemployment</field>
<field name="code">ER_US_CA_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_ca_suta_wage_base', rate='us_ca_suta_rate', state_code='CA')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_ca_suta_wage_base', rate='us_ca_suta_rate', state_code='CA')</field>
<field name="partner_id" ref="res_partner_us_ca_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_er_us_ca_suta_ett" model="hr.salary.rule">
<field name="sequence" eval="451"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US CA California State Employee Training Tax</field>
<field name="code">ER_US_CA_SUTA_ETT</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_ca_suta_wage_base', rate='us_ca_suta_ett_rate', state_code='CA')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_ca_suta_wage_base', rate='us_ca_suta_ett_rate', state_code='CA')</field>
<field name="partner_id" ref="res_partner_us_ca_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_ee_us_ca_suta_sdi" model="hr.salary.rule">
<field name="sequence" eval="195"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_ee_us_suta"/>
<field name="name">EE: US CA California State Disability Insurance</field>
<field name="code">EE_US_CA_SUTA_SDI</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_ca_suta_wage_base', rate='us_ca_suta_sdi_rate', state_code='CA')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_ca_suta_wage_base', rate='us_ca_suta_sdi_rate', state_code='CA')</field>
<field name="partner_id" ref="res_partner_us_ca_dor"/>
<field name="appears_on_payslip" eval="True"/>
</record>
<record id="hr_payroll_rule_ee_us_ca_sit" model="hr.salary.rule">
<field name="sequence" eval="195"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_ee_us_sit"/>
<field name="name">EE: US CA California State Income Tax Withholding</field>
<field name="code">EE_US_CA_SIT</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = ca_california_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = ca_california_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="partner_id" ref="res_partner_us_ca_dor_sit"/>
<field name="appears_on_payslip" eval="True"/>
</record>
</odoo>

View File

@@ -0,0 +1,97 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base -->
<record id="rule_parameter_us_co_suta_wage_base" model="hr.rule.parameter">
<field name="name">US CO Colorado SUTA Wage Base</field>
<field name="code">us_co_suta_wage_base</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_co_suta_wage_base_2020" model="hr.rule.parameter.value">
<field name="parameter_value">13600.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_co_suta_wage_base"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Rate -->
<record id="rule_parameter_us_co_suta_rate" model="hr.rule.parameter">
<field name="name">US CO Colorado SUTA Rate</field>
<field name="code">us_co_suta_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_co_suta_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">1.7</field>
<field name="rule_parameter_id" ref="rule_parameter_us_co_suta_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_co_sit_tax_rate" model="hr.rule.parameter">
<field name="name">US CO Colorado SIT Tax Rate</field>
<field name="code">us_co_sit_tax_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_co_sit_tax_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">4.63</field>
<field name="rule_parameter_id" ref="rule_parameter_us_co_sit_tax_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_co_sit_exemption_rate" model="hr.rule.parameter">
<field name="name">US CO Colorado SIT Exemption Rate</field>
<field name="code">us_co_sit_exemption_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_co_sit_exemption_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">4000</field>
<field name="rule_parameter_id" ref="rule_parameter_us_co_sit_exemption_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_co_dor" model="res.partner">
<field name="name">US Colorado - Department of Labor and Employment - Unemployment Tax</field>
</record>
<record id="res_partner_us_co_dor_sit" model="res.partner">
<field name="name">US Colorado - Division of Revenue - Income Tax</field>
</record>
<!-- Categories -->
<!-- Rules -->
<record id="hr_payroll_rule_er_us_co_suta" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US CO Colorado State Unemployment</field>
<field name="code">ER_US_CO_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_co_suta_wage_base', rate='us_co_suta_rate', state_code='CO')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_co_suta_wage_base', rate='us_co_suta_rate', state_code='CO')</field>
<field name="partner_id" ref="res_partner_us_co_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_ee_us_co_sit" model="hr.salary.rule">
<field name="sequence" eval="195"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_ee_us_sit"/>
<field name="name">EE: US CO Colorado State Income Tax Withholding</field>
<field name="code">EE_US_CO_SIT</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = co_colorado_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = co_colorado_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="partner_id" ref="res_partner_us_co_dor_sit"/>
<field name="appears_on_payslip" eval="True"/>
</record>
</odoo>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,119 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base -->
<record id="rule_parameter_us_de_suta_wage_base" model="hr.rule.parameter">
<field name="name">US DE Delaware SUTA Wage Base</field>
<field name="code">us_de_suta_wage_base</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_de_suta_wage_base_2020" model="hr.rule.parameter.value">
<field name="parameter_value">16500.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_de_suta_wage_base"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Rate -->
<record id="rule_parameter_us_de_suta_rate" model="hr.rule.parameter">
<field name="name">US DE Delaware SUTA Rate</field>
<field name="code">us_de_suta_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_de_suta_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">1.50</field>
<field name="rule_parameter_id" ref="rule_parameter_us_de_suta_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_de_sit_tax_rate" model="hr.rule.parameter">
<field name="name">US DE Delaware SIT Tax Rate</field>
<field name="code">us_de_sit_tax_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_de_sit_tax_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">[
( 2000, 0.0, 0.00),
( 5000, 0.0, 2.20),
(10000, 66.0, 3.90),
(20000, 261.0, 4.80),
(25000, 741.0, 5.20),
(60000, 1001.0, 5.55),
('inf', 2943.0, 6.60),
]</field>
<field name="rule_parameter_id" ref="rule_parameter_us_de_sit_tax_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_de_sit_standard_deduction_rate" model="hr.rule.parameter">
<field name="name">US DE Delaware Standard Deduction Rate</field>
<field name="code">us_de_sit_standard_deduction_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_de_sit_standard_deduction_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">3250</field>
<field name="rule_parameter_id" ref="rule_parameter_us_de_sit_standard_deduction_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_de_sit_personal_exemption_rate" model="hr.rule.parameter">
<field name="name">US DE Delaware Personal Exemption Rate</field>
<field name="code">us_de_sit_personal_exemption_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_de_sit_personal_exemption_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">110</field>
<field name="rule_parameter_id" ref="rule_parameter_us_de_sit_personal_exemption_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_de_dor" model="res.partner">
<field name="name">US Delaware - Division of Unemployment Insurance - Unemployment Tax</field>
</record>
<record id="res_partner_us_de_dor_sit" model="res.partner">
<field name="name">US Delaware - Division of Revenue - Income Tax</field>
</record>
<!-- Categories -->
<!-- Rules -->
<record id="hr_payroll_rule_er_us_de_suta" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US DE Delaware State Unemployment</field>
<field name="code">ER_US_DE_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_de_suta_wage_base', rate='us_de_suta_rate', state_code='DE')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_de_suta_wage_base', rate='us_de_suta_rate', state_code='DE')</field>
<field name="partner_id" ref="res_partner_us_de_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_ee_us_de_sit" model="hr.salary.rule">
<field name="sequence" eval="195"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_ee_us_sit"/>
<field name="name">EE: US DE Delaware State Income Tax Withholding</field>
<field name="code">EE_US_DE_SIT</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = de_delaware_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = de_delaware_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="partner_id" ref="res_partner_us_de_dor_sit"/>
<field name="appears_on_payslip" eval="True"/>
</record>
</odoo>

View File

@@ -0,0 +1,63 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base -->
<record id="rule_parameter_us_fl_suta_wage_base" model="hr.rule.parameter">
<field name="name">US FL Florida SUTA Wage Base</field>
<field name="code">us_fl_suta_wage_base</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_fl_suta_wage_base_2019" model="hr.rule.parameter.value">
<field name="parameter_value">7000.00</field>
<field name="rule_parameter_id" ref="rule_parameter_us_fl_suta_wage_base"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_fl_suta_wage_base_2020" model="hr.rule.parameter.value">
<field name="parameter_value">7000.00</field>
<field name="rule_parameter_id" ref="rule_parameter_us_fl_suta_wage_base"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Rate -->
<record id="rule_parameter_us_fl_suta_rate" model="hr.rule.parameter">
<field name="name">US FL Florida SUTA Rate</field>
<field name="code">us_fl_suta_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_fl_suta_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">2.7</field>
<field name="rule_parameter_id" ref="rule_parameter_us_fl_suta_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_fl_suta_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">2.7</field>
<field name="rule_parameter_id" ref="rule_parameter_us_fl_suta_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_fl_dor" model="res.partner">
<field name="name">US Florida - Department of Revenue</field>
</record>
<!-- Categories -->
<!-- Rules -->
<record id="hr_payroll_rule_er_us_fl_suta" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US FL Florida State Unemployment (RT-6)</field>
<field name="code">ER_US_FL_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_fl_suta_wage_base', rate='us_fl_suta_rate', state_code='FL')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_fl_suta_wage_base', rate='us_fl_suta_rate', state_code='FL')</field>
<field name="partner_id" ref="res_partner_us_fl_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
</odoo>

View File

@@ -0,0 +1,943 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base -->
<record id="rule_parameter_us_ga_suta_wage_base" model="hr.rule.parameter">
<field name="name">US GA Georgia SUTA Wage Base</field>
<field name="code">us_ga_suta_wage_base</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ga_suta_wage_base_2019" model="hr.rule.parameter.value">
<field name="parameter_value">9500.00</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ga_suta_wage_base"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_ga_suta_wage_base_2020" model="hr.rule.parameter.value">
<field name="parameter_value">9500.00</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ga_suta_wage_base"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Rate -->
<record id="rule_parameter_us_ga_suta_rate" model="hr.rule.parameter">
<field name="name">US GA Georgia SUTA Rate</field>
<field name="code">us_ga_suta_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ga_suta_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">2.7</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ga_suta_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_ga_suta_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">2.7</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ga_suta_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_ga_sit_rate" model="hr.rule.parameter">
<field name="name">US GA Georgia SIT Rate Table</field>
<field name="code">us_ga_sit_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ga_sit_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">{
'married filing joint, both spouses working': {
'weekly': (
( 9.50, 0.00, 1.00),
(29.00, 0.10, 2.00),
(48.00, 0.48, 3.00),
(67.50, 1.06, 4.00),
(96.00, 1.83, 5.00),
('inf', 3.27, 5.75),
),
'bi-weekly': (
( 19.00, 0.00, 1.00),
( 57.50, 0.19, 2.00),
( 96.00, 0.96, 3.00),
(135.00, 2.12, 4.00),
(192.00, 3.65, 5.00),
( 'inf', 6.54, 5.75),
),
'semi-monthly': (
( 21.00, 0.00, 1.00),
( 62.50, 0.21, 2.00),
(104.00, 1.04, 3.00),
(146.00, 2.29, 4.00),
(208.00, 3.96, 5.00),
( 'inf', 7.08, 5.75),
),
'monthly': (
( 41.50, 0.00, 1.00),
(125.50, 0.42, 2.00),
(208.00, 2.08, 3.00),
(292.00, 4.58, 4.00),
(417.00, 7.92, 5.00),
( 'inf', 14.17, 5.75),
),
'quarterly': (
( 125.00, 0.00, 1.00),
( 375.00, 1.25, 2.00),
( 625.00, 6.25, 3.00),
( 875.00, 13.75, 4.00),
(1250.00, 23.75, 5.00),
( 'inf', 42.50, 5.75),
),
'semi-annual': (
( 250.00, 0.00, 1.00),
( 750.00, 2.50, 2.00),
(1250.00, 12.50, 3.00),
(1750.00, 27.50, 4.00),
(2500.00, 47.50, 5.00),
( 'inf', 85.00, 5.75),
),
'annual': (
( 500.00, 0.00, 1.00),
(1500.00, 5.00, 2.00),
(2500.00, 25.00, 3.00),
(3500.00, 55.00, 4.00),
(5000.00, 95.00, 5.00),
( 'inf', 170.00, 5.75),
),
},
'married filing joint, one spouse working': {
'weekly': (
( 19.00, 0.00, 1.00),
( 57.50, 0.19, 2.00),
( 96.00, 0.96, 3.00),
(135.00, 2.12, 4.00),
(192.50, 3.65, 5.00),
( 'inf', 6.54, 5.75),
),
'bi-weekly': (
( 38.50, 0.00, 1.00),
(115.00, 0.38, 2.00),
(192.00, 1.92, 3.00),
(269.00, 4.23, 4.00),
(385.00, 7.31, 5.00),
( 'inf', 13.08, 5.75),
),
'semi-monthly': (
( 41.50, 0.00, 1.00),
(125.00, 0.42, 2.00),
(208.00, 2.08, 3.00),
(292.00, 4.58, 4.00),
(417.00, 7.92, 5.00),
( 'inf', 14.17, 5.75),
),
'monthly': (
( 83.00, 0.00, 1.00),
(250.00, 0.83, 2.00),
(417.00, 4.17, 3.00),
(583.00, 9.17, 4.00),
(833.00, 15.83, 5.00),
( 'inf', 28.33, 5.75),
),
'quarterly': (
( 250.00, 0.00, 1.00),
( 750.00, 2.50, 2.00),
(1250.00, 12.50, 3.00),
(1750.00, 27.50, 4.00),
(2500.00, 47.50, 5.00),
( 'inf', 85.00, 5.75),
),
'semi-annual': (
( 500.00, 0.00, 1.00),
(1500.00, 5.00, 2.00),
(2500.00, 25.00, 3.00),
(3500.00, 55.00, 4.00),
(5000.00, 95.00, 5.00),
( 'inf', 170.00, 5.75),
),
'annual': (
( 1000.00, 0.00, 1.00),
( 3000.00, 10.00, 2.00),
( 5000.00, 50.00, 3.00),
( 7000.00, 110.00, 4.00),
(10000.00, 190.00, 5.00),
( 'inf', 340.00, 5.75),
),
},
'single': {
'weekly': (
( 14.50, 0.00, 1.00),
( 43.50, 0.14, 2.00),
( 72.00, 0.72, 3.00),
(101.00, 1.59, 4.00),
(135.00, 2.74, 5.00),
( 'inf', 4.42, 5.75),
),
'bi-weekly': (
( 29.00, 0.00, 1.00),
( 86.50, 0.29, 2.00),
(144.00, 1.44, 3.00),
(202.00, 3.17, 4.00),
(269.00, 5.48, 5.00),
( 'inf', 8.85, 5.75),
),
'semi-monthly': (
( 31.00, 0.00, 1.00),
( 93.50, 0.31, 2.00),
(156.00, 1.56, 3.00),
(219.00, 3.34, 4.00),
(292.00, 5.94, 5.00),
( 'inf', 9.58, 5.75),
),
'monthly': (
( 62.50, 0.00, 1.00),
(187.00, 0.62, 2.00),
(312.00, 3.12, 3.00),
(437.00, 6.87, 4.00),
(583.00, 11.87, 5.00),
( 'inf', 19.17, 5.75),
),
'quarterly': (
( 187.50, 0.00, 1.00),
( 562.50, 1.88, 2.00),
( 937.50, 9.38, 3.00),
(1312.00, 20.63, 4.00),
(1750.00, 35.63, 5.00),
( 'inf', 57.50, 5.75),
),
'semi-annual': (
( 375.00, 0.00, 1.00),
(1125.00, 3.75, 2.00),
(1875.00, 18.75, 3.00),
(2625.00, 41.25, 4.00),
(3500.00, 71.25, 5.00),
( 'inf', 115.00, 5.75),
),
'annual': (
( 750.00, 0.00, 1.00),
(2250.00, 7.50, 2.00),
(3750.00, 37.50, 3.00),
(5250.00, 82.50, 4.00),
(7000.00, 142.50, 5.00),
( 'inf', 230.00, 5.75),
),
},
'head of household': {
'weekly': (
( 19.00, 0.00, 1.00),
( 57.50, 0.19, 2.00),
( 96.00, 0.96, 3.00),
(135.00, 2.12, 4.00),
(192.50, 3.65, 5.00),
( 'inf', 6.54, 5.75),
),
'bi-weekly': (
( 38.50, 0.00, 1.00),
(115.00, 0.38, 2.00),
(192.00, 1.92, 3.00),
(269.00, 4.23, 4.00),
(385.00, 7.31, 5.00),
( 'inf', 13.08, 5.75),
),
'semi-monthly': (
( 41.50, 0.00, 1.00),
(125.00, 0.42, 2.00),
(208.00, 2.08, 3.00),
(292.00, 4.58, 4.00),
(417.00, 7.92, 5.00),
( 'inf', 14.17, 5.75),
),
'monthly': (
( 83.00, 0.00, 1.00),
(250.00, 0.83, 2.00),
(417.00, 4.17, 3.00),
(583.00, 9.17, 4.00),
(833.00, 15.83, 5.00),
( 'inf', 28.33, 5.75),
),
'quarterly': (
( 250.00, 0.00, 1.00),
( 750.00, 2.50, 2.00),
(1250.00, 12.50, 3.00),
(1750.00, 27.50, 4.00),
(2500.00, 47.50, 5.00),
( 'inf', 85.00, 5.75),
),
'semi-annual': (
( 500.00, 0.00, 1.00),
(1500.00, 5.00, 2.00),
(2500.00, 25.00, 3.00),
(3500.00, 55.00, 4.00),
(5000.00, 95.00, 5.00),
( 'inf', 170.00, 5.75),
),
'annual': (
( 1000.00, 0.00, 1.00),
( 3000.00, 10.00, 2.00),
( 5000.00, 50.00, 3.00),
( 7000.00, 110.00, 4.00),
(10000.00, 190.00, 5.00),
( 'inf', 340.00, 5.75),
),
},
'married filing separate': {
'weekly': (
( 9.50, 0.00, 1.00),
(29.00, 0.10, 2.00),
(48.00, 0.48, 3.00),
(67.50, 1.06, 4.00),
(96.00, 1.83, 5.00),
('inf', 3.27, 5.75),
),
'bi-weekly': (
( 19.00, 0.00, 1.00),
( 57.50, 0.19, 2.00),
( 96.00, 0.96, 3.00),
(135.00, 2.12, 4.00),
(192.00, 3.65, 5.00),
( 'inf', 6.54, 5.75),
),
'semi-monthly': (
( 21.00, 0.00, 1.00),
( 62.50, 0.21, 2.00),
(104.00, 1.04, 3.00),
(146.00, 2.29, 4.00),
(208.00, 3.96, 5.00),
( 'inf', 7.08, 5.75),
),
'monthly': (
( 41.50, 0.00, 1.00),
(125.50, 0.42, 2.00),
(208.00, 2.08, 3.00),
(292.00, 4.58, 4.00),
(417.00, 7.92, 5.00),
( 'inf', 14.17, 5.75),
),
'quarterly': (
( 125.00, 0.00, 1.00),
( 375.00, 1.25, 2.00),
( 625.00, 6.25, 3.00),
( 875.00, 13.75, 4.00),
(1250.00, 23.75, 5.00),
( 'inf', 42.50, 5.75),
),
'semi-annual': (
( 250.00, 0.00, 1.00),
( 750.00, 2.50, 2.00),
(1250.00, 12.50, 3.00),
(1750.00, 27.50, 4.00),
(2500.00, 47.50, 5.00),
( 'inf', 85.00, 5.75),
),
'annual': (
( 500.00, 0.00, 1.00),
(1500.00, 5.00, 2.00),
(2500.00, 25.00, 3.00),
(3500.00, 55.00, 4.00),
(5000.00, 95.00, 5.00),
( 'inf', 170.00, 5.75),
),
},
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ga_sit_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<!-- https://dor.georgia.gov/employers-tax-guide File 2020 -->
<!-- Table F, G ,H-->
<record id="rule_parameter_us_ga_sit_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">{
'married filing joint, both spouses working': {
'weekly': (
( 9.50, 0.00, 1.00),
(29.00, 0.10, 2.00),
(48.00, 0.48, 3.00),
(67.50, 1.06, 4.00),
(96.00, 1.83, 5.00),
('inf', 3.27, 5.75),
),
'bi-weekly': (
( 19.00, 0.00, 1.00),
( 57.50, 0.19, 2.00),
( 96.00, 0.96, 3.00),
(135.00, 2.12, 4.00),
(192.00, 3.65, 5.00),
( 'inf', 6.54, 5.75),
),
'semi-monthly': (
( 21.00, 0.00, 1.00),
( 62.50, 0.21, 2.00),
(104.00, 1.04, 3.00),
(146.00, 2.29, 4.00),
(208.00, 3.96, 5.00),
( 'inf', 7.08, 5.75),
),
'monthly': (
( 41.50, 0.00, 1.00),
(125.50, 0.42, 2.00),
(208.00, 2.08, 3.00),
(292.00, 4.58, 4.00),
(417.00, 7.92, 5.00),
( 'inf', 14.17, 5.75),
),
'quarterly': (
( 125.00, 0.00, 1.00),
( 375.00, 1.25, 2.00),
( 625.00, 6.25, 3.00),
( 875.00, 13.75, 4.00),
(1250.00, 23.75, 5.00),
( 'inf', 42.50, 5.75),
),
'semi-annual': (
( 250.00, 0.00, 1.00),
( 750.00, 2.50, 2.00),
(1250.00, 12.50, 3.00),
(1750.00, 27.50, 4.00),
(2500.00, 47.50, 5.00),
( 'inf', 85.00, 5.75),
),
'annual': (
( 500.00, 0.00, 1.00),
(1500.00, 5.00, 2.00),
(2500.00, 25.00, 3.00),
(3500.00, 55.00, 4.00),
(5000.00, 95.00, 5.00),
( 'inf', 170.00, 5.75),
),
},
'married filing joint, one spouse working': {
'weekly': (
( 19.00, 0.00, 1.00),
( 57.50, 0.19, 2.00),
( 96.00, 0.96, 3.00),
(135.00, 2.12, 4.00),
(192.50, 3.65, 5.00),
( 'inf', 6.54, 5.75),
),
'bi-weekly': (
( 38.50, 0.00, 1.00),
(115.00, 0.38, 2.00),
(192.00, 1.92, 3.00),
(269.00, 4.23, 4.00),
(385.00, 7.31, 5.00),
( 'inf', 13.08, 5.75),
),
'semi-monthly': (
( 41.50, 0.00, 1.00),
(125.00, 0.42, 2.00),
(208.00, 2.08, 3.00),
(292.00, 4.58, 4.00),
(417.00, 7.92, 5.00),
( 'inf', 14.17, 5.75),
),
'monthly': (
( 83.00, 0.00, 1.00),
(250.00, 0.83, 2.00),
(417.00, 4.17, 3.00),
(583.00, 9.17, 4.00),
(833.00, 15.83, 5.00),
( 'inf', 28.33, 5.75),
),
'quarterly': (
( 250.00, 0.00, 1.00),
( 750.00, 2.50, 2.00),
(1250.00, 12.50, 3.00),
(1750.00, 27.50, 4.00),
(2500.00, 47.50, 5.00),
( 'inf', 85.00, 5.75),
),
'semi-annual': (
( 500.00, 0.00, 1.00),
(1500.00, 5.00, 2.00),
(2500.00, 25.00, 3.00),
(3500.00, 55.00, 4.00),
(5000.00, 95.00, 5.00),
( 'inf', 170.00, 5.75),
),
'annual': (
( 1000.00, 0.00, 1.00),
( 3000.00, 10.00, 2.00),
( 5000.00, 50.00, 3.00),
( 7000.00, 110.00, 4.00),
(10000.00, 190.00, 5.00),
( 'inf', 340.00, 5.75),
),
},
'single': {
'weekly': (
( 14.50, 0.00, 1.00),
( 43.50, 0.14, 2.00),
( 72.00, 0.72, 3.00),
(101.00, 1.59, 4.00),
(135.00, 2.74, 5.00),
( 'inf', 4.42, 5.75),
),
'bi-weekly': (
( 29.00, 0.00, 1.00),
( 86.50, 0.29, 2.00),
(144.00, 1.44, 3.00),
(202.00, 3.17, 4.00),
(269.00, 5.48, 5.00),
( 'inf', 8.85, 5.75),
),
'semi-monthly': (
( 31.00, 0.00, 1.00),
( 93.50, 0.31, 2.00),
(156.00, 1.56, 3.00),
(219.00, 3.34, 4.00),
(292.00, 5.94, 5.00),
( 'inf', 9.58, 5.75),
),
'monthly': (
( 62.50, 0.00, 1.00),
(187.00, 0.62, 2.00),
(312.00, 3.12, 3.00),
(437.00, 6.87, 4.00),
(583.00, 11.87, 5.00),
( 'inf', 19.17, 5.75),
),
'quarterly': (
( 187.50, 0.00, 1.00),
( 562.50, 1.88, 2.00),
( 937.50, 9.38, 3.00),
(1312.00, 20.63, 4.00),
(1750.00, 35.63, 5.00),
( 'inf', 57.50, 5.75),
),
'semi-annual': (
( 375.00, 0.00, 1.00),
(1125.00, 3.75, 2.00),
(1875.00, 18.75, 3.00),
(2625.00, 41.25, 4.00),
(3500.00, 71.25, 5.00),
( 'inf', 115.00, 5.75),
),
'annual': (
( 750.00, 0.00, 1.00),
(2250.00, 7.50, 2.00),
(3750.00, 37.50, 3.00),
(5250.00, 82.50, 4.00),
(7000.00, 142.50, 5.00),
( 'inf', 230.00, 5.75),
),
},
'head of household': {
'weekly': (
( 19.00, 0.00, 1.00),
( 57.50, 0.19, 2.00),
( 96.00, 0.96, 3.00),
(135.00, 2.12, 4.00),
(192.50, 3.65, 5.00),
( 'inf', 6.54, 5.75),
),
'bi-weekly': (
( 38.50, 0.00, 1.00),
(115.00, 0.38, 2.00),
(192.00, 1.92, 3.00),
(269.00, 4.23, 4.00),
(385.00, 7.31, 5.00),
( 'inf', 13.08, 5.75),
),
'semi-monthly': (
( 41.50, 0.00, 1.00),
(125.00, 0.42, 2.00),
(208.00, 2.08, 3.00),
(292.00, 4.58, 4.00),
(417.00, 7.92, 5.00),
( 'inf', 14.17, 5.75),
),
'monthly': (
( 83.00, 0.00, 1.00),
(250.00, 0.83, 2.00),
(417.00, 4.17, 3.00),
(583.00, 9.17, 4.00),
(833.00, 15.83, 5.00),
( 'inf', 28.33, 5.75),
),
'quarterly': (
( 250.00, 0.00, 1.00),
( 750.00, 2.50, 2.00),
(1250.00, 12.50, 3.00),
(1750.00, 27.50, 4.00),
(2500.00, 47.50, 5.00),
( 'inf', 85.00, 5.75),
),
'semi-annual': (
( 500.00, 0.00, 1.00),
(1500.00, 5.00, 2.00),
(2500.00, 25.00, 3.00),
(3500.00, 55.00, 4.00),
(5000.00, 95.00, 5.00),
( 'inf', 170.00, 5.75),
),
'annual': (
( 1000.00, 0.00, 1.00),
( 3000.00, 10.00, 2.00),
( 5000.00, 50.00, 3.00),
( 7000.00, 110.00, 4.00),
(10000.00, 190.00, 5.00),
( 'inf', 340.00, 5.75),
),
},
'married filing separate': {
'weekly': (
( 9.50, 0.00, 1.00),
(29.00, 0.10, 2.00),
(48.00, 0.48, 3.00),
(67.50, 1.06, 4.00),
(96.00, 1.83, 5.00),
('inf', 3.27, 5.75),
),
'bi-weekly': (
( 19.00, 0.00, 1.00),
( 57.50, 0.19, 2.00),
( 96.00, 0.96, 3.00),
(135.00, 2.12, 4.00),
(192.00, 3.65, 5.00),
( 'inf', 6.54, 5.75),
),
'semi-monthly': (
( 21.00, 0.00, 1.00),
( 62.50, 0.21, 2.00),
(104.00, 1.04, 3.00),
(146.00, 2.29, 4.00),
(208.00, 3.96, 5.00),
( 'inf', 7.08, 5.75),
),
'monthly': (
( 41.50, 0.00, 1.00),
(125.50, 0.42, 2.00),
(208.00, 2.08, 3.00),
(292.00, 4.58, 4.00),
(417.00, 7.92, 5.00),
( 'inf', 14.17, 5.75),
),
'quarterly': (
( 125.00, 0.00, 1.00),
( 375.00, 1.25, 2.00),
( 625.00, 6.25, 3.00),
( 875.00, 13.75, 4.00),
(1250.00, 23.75, 5.00),
( 'inf', 42.50, 5.75),
),
'semi-annual': (
( 250.00, 0.00, 1.00),
( 750.00, 2.50, 2.00),
(1250.00, 12.50, 3.00),
(1750.00, 27.50, 4.00),
(2500.00, 47.50, 5.00),
( 'inf', 85.00, 5.75),
),
'annual': (
( 500.00, 0.00, 1.00),
(1500.00, 5.00, 2.00),
(2500.00, 25.00, 3.00),
(3500.00, 55.00, 4.00),
(5000.00, 95.00, 5.00),
( 'inf', 170.00, 5.75),
),
},
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ga_sit_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_ga_sit_personal_allowance" model="hr.rule.parameter">
<field name="name">US GA Georgia SIT Personal Allowance</field>
<field name="code">us_ga_sit_personal_allowance</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ga_sit_personal_allowance_2019" model="hr.rule.parameter.value">
<field name="parameter_value">{
'married filing joint, both spouses working': {
'weekly': 142.30,
'bi-weekly': 284.62,
'semi-monthly': 308.33,
'monthly': 616.67,
'quarterly': 1850.00,
'semi-annual': 3700.00,
'annual': 7400.00,
},
'married filing joint, one spouse working': {
'weekly': 142.30,
'bi-weekly': 284.62,
'semi-monthly': 308.33,
'monthly': 616.67,
'quarterly': 1850.00,
'semi-annual': 3700.00,
'annual': 7400.00,
},
'single': {
'weekly': 51.92,
'bi-weekly': 103.85,
'semi-monthly': 112.50,
'monthly': 225.00,
'quarterly': 675.00,
'semi-annual': 1350.00,
'annual': 2700.00,
},
'head of household': {
'weekly': 51.92,
'bi-weekly': 103.85,
'semi-monthly': 112.50,
'monthly': 225.00,
'quarterly': 675.00,
'semi-annual': 1350.00,
'annual': 2700.00,
},
'married filing separate': {
'weekly': 71.15,
'bi-weekly': 142.30,
'semi-monthly': 154.16,
'monthly': 308.33,
'quarterly': 925.00,
'semi-annual': 1850.00,
'annual': 3700.00,
},
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ga_sit_personal_allowance"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<!-- https://dor.georgia.gov/employers-tax-guide File 2020 -->
<!-- Table E Column 4. 5. 6.-->
<record id="rule_parameter_us_ga_sit_personal_allowance_2020" model="hr.rule.parameter.value">
<field name="parameter_value">{
'married filing joint, both spouses working': {
'weekly': 142.30,
'bi-weekly': 284.62,
'semi-monthly': 308.33,
'monthly': 616.67,
'quarterly': 1850.00,
'semi-annual': 3700.00,
'annual': 7400.00,
},
'married filing joint, one spouse working': {
'weekly': 142.30,
'bi-weekly': 284.62,
'semi-monthly': 308.33,
'monthly': 616.67,
'quarterly': 1850.00,
'semi-annual': 3700.00,
'annual': 7400.00,
},
'single': {
'weekly': 51.92,
'bi-weekly': 103.85,
'semi-monthly': 112.50,
'monthly': 225.00,
'quarterly': 675.00,
'semi-annual': 1350.00,
'annual': 2700.00,
},
'head of household': {
'weekly': 51.92,
'bi-weekly': 103.85,
'semi-monthly': 112.50,
'monthly': 225.00,
'quarterly': 675.00,
'semi-annual': 1350.00,
'annual': 2700.00,
},
'married filing separate': {
'weekly': 71.15,
'bi-weekly': 142.30,
'semi-monthly': 154.16,
'monthly': 308.33,
'quarterly': 925.00,
'semi-annual': 1850.00,
'annual': 3700.00,
},
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ga_sit_personal_allowance"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_ga_sit_dependent_allowance_rate" model="hr.rule.parameter">
<field name="name">US GA Georgia SIT Dependent Allowance Rate</field>
<field name="code">us_ga_sit_dependent_allowance_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ga_sit_dependent_allowance_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">{
'weekly': 57.50,
'bi-weekly': 115.00,
'semi-monthly': 125.00,
'monthly': 250.00,
'quarterly': 750.00,
'semi-annual': 1500.00,
'annual': 3000.00,
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ga_sit_dependent_allowance_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<!-- https://dor.georgia.gov/employers-tax-guide File 2020 -->
<!-- Table E Column 7.-->
<record id="rule_parameter_us_ga_sit_dependent_allowance_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">{
'weekly': 57.50,
'bi-weekly': 115.00,
'semi-monthly': 125.00,
'monthly': 250.00,
'quarterly': 750.00,
'semi-annual': 1500.00,
'annual': 3000.00,
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ga_sit_dependent_allowance_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_ga_sit_deduction" model="hr.rule.parameter">
<field name="name">US GA Georgia SIT Deduction</field>
<field name="code">us_ga_sit_deduction</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ga_sit_deduction_2019" model="hr.rule.parameter.value">
<field name="parameter_value">{
'married filing joint, both spouses working': {
'weekly': 115.50,
'bi-weekly': 230.75,
'semi-monthly': 250.00,
'monthly': 500.00,
'quarterly': 1500.00,
'semi-annual': 3000.00,
'annual': 6000.00,
},
'married filing joint, one spouse working': {
'weekly': 115.50,
'bi-weekly': 230.75,
'semi-monthly': 250.00,
'monthly': 500.00,
'quarterly': 1500.00,
'semi-annual': 3000.00,
'annual': 6000.00,
},
'single': {
'weekly': 88.50,
'bi-weekly': 177.00,
'semi-monthly': 191.75,
'monthly': 383.50,
'quarterly': 1150.00,
'semi-annual': 2300.00,
'annual': 4600.00,
},
'head of household': {
'weekly': 88.50,
'bi-weekly': 177.00,
'semi-monthly': 191.75,
'monthly': 383.50,
'quarterly': 1150.00,
'semi-annual': 2300.00,
'annual': 4600.00,
},
'married filing separate': {
'weekly': 57.75,
'bi-weekly': 115.50,
'semi-monthly': 125.00,
'monthly': 250.00,
'quarterly': 750.00,
'semi-annual': 1500.00,
'annual': 3000.00,
},
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ga_sit_deduction"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<!-- https://dor.georgia.gov/employers-tax-guide File 2020 -->
<!-- Table E Column 1. 2. 3.-->
<record id="rule_parameter_us_ga_sit_deduction_2020" model="hr.rule.parameter.value">
<field name="parameter_value">{
'married filing joint, both spouses working': {
'weekly': 115.50,
'bi-weekly': 230.75,
'semi-monthly': 250.00,
'monthly': 500.00,
'quarterly': 1500.00,
'semi-annual': 3000.00,
'annual': 6000.00,
},
'married filing joint, one spouse working': {
'weekly': 115.50,
'bi-weekly': 230.75,
'semi-monthly': 250.00,
'monthly': 500.00,
'quarterly': 1500.00,
'semi-annual': 3000.00,
'annual': 6000.00,
},
'single': {
'weekly': 88.50,
'bi-weekly': 177.00,
'semi-monthly': 191.75,
'monthly': 383.50,
'quarterly': 1150.00,
'semi-annual': 2300.00,
'annual': 4600.00,
},
'head of household': {
'weekly': 88.50,
'bi-weekly': 177.00,
'semi-monthly': 191.75,
'monthly': 383.50,
'quarterly': 1150.00,
'semi-annual': 2300.00,
'annual': 4600.00,
},
'married filing separate': {
'weekly': 57.75,
'bi-weekly': 115.50,
'semi-monthly': 125.00,
'monthly': 250.00,
'quarterly': 750.00,
'semi-annual': 1500.00,
'annual': 3000.00,
},
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ga_sit_deduction"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_ga_dor" model="res.partner">
<field name="name">US Georgia - Department of Taxation - Unemployment Tax</field>
</record>
<record id="res_partner_us_ga_dor_sit" model="res.partner">
<field name="name">US Georgia - Department of Taxation - Income Tax</field>
</record>
<!-- Categories -->
<!-- Rules -->
<record id="hr_payroll_rule_er_us_ga_suta" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US GA Georgia State Unemployment</field>
<field name="code">ER_US_GA_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_ga_suta_wage_base', rate='us_ga_suta_rate', state_code='GA')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_ga_suta_wage_base', rate='us_ga_suta_rate', state_code='GA')</field>
<field name="partner_id" ref="res_partner_us_ga_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_ee_us_ga_sit" model="hr.salary.rule">
<field name="sequence" eval="195"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_ee_us_sit"/>
<field name="name">EE: US GA Georgia State Income Tax Withholding</field>
<field name="code">EE_US_GA_SIT</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = ga_georgia_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = ga_georgia_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="partner_id" ref="res_partner_us_ga_dor_sit"/>
<field name="appears_on_payslip" eval="True"/>
</record>
</odoo>

View File

@@ -0,0 +1,181 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base -->
<record id="rule_parameter_us_hi_suta_wage_base" model="hr.rule.parameter">
<field name="name">US HI Hawaii SUTA Wage Base</field>
<field name="code">us_hi_suta_wage_base</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_hi_suta_wage_base_2019" model="hr.rule.parameter.value">
<field name="parameter_value">46800.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_hi_suta_wage_base"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_hi_suta_wage_base_2020" model="hr.rule.parameter.value">
<field name="parameter_value">48100.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_hi_suta_wage_base"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Rate -->
<record id="rule_parameter_us_hi_suta_rate" model="hr.rule.parameter">
<field name="name">US HI Hawaii SUTA Rate</field>
<field name="code">us_hi_suta_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_hi_suta_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">2.40</field>
<field name="rule_parameter_id" ref="rule_parameter_us_hi_suta_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_hi_suta_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">2.40</field>
<field name="rule_parameter_id" ref="rule_parameter_us_hi_suta_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_hi_sit_tax_rate" model="hr.rule.parameter">
<field name="name">US HI Hawaii SIT Tax Rate</field>
<field name="code">us_hi_sit_tax_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_hi_sit_tax_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">{
'single': (
( 2400, 0.00, 1.40),
( 4800, 34.00, 3.20),
( 9600, 110.00, 5.50),
(14400, 374.00, 6.40),
(19200, 682.00, 6.80),
(24000, 1008.00, 7.20),
(36000, 1354.00, 7.60),
('inf', 2266.00, 7.90),
),
'married': (
( 4800, 0.00, 1.40),
( 9600, 67.00, 3.20),
(19200, 221.00, 5.50),
(28800, 749.00, 6.40),
(38400, 1363.00, 6.80),
(48000, 2016.00, 7.20),
(72000, 2707.00, 7.60),
('inf', 4531.00, 7.90),
),
'head_of_household': (
( 2400, 0.00, 1.40),
( 4800, 34.00, 3.20),
( 9600, 110.00, 5.50),
(14400, 374.00, 6.40),
(19200, 682.00, 6.80),
(24000, 1008.00, 7.20),
(36000, 1354.00, 7.60),
('inf', 2266.00, 7.90),
),
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_hi_sit_tax_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<!-- https://files.hawaii.gov/tax/forms/2019/19table.pdf -->
<!-- Table from Schedule I, II and III -->
<record id="rule_parameter_us_hi_sit_tax_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">{
'single': (
( 2400, 0.00, 1.40),
( 4800, 34.00, 3.20),
( 9600, 110.00, 5.50),
(14400, 374.00, 6.40),
(19200, 682.00, 6.80),
(24000, 1008.00, 7.20),
(36000, 1354.00, 7.60),
('inf', 2266.00, 7.90),
),
'married': (
( 4800, 0.00, 1.40),
( 9600, 67.00, 3.20),
(19200, 221.00, 5.50),
(28800, 749.00, 6.40),
(38400, 1363.00, 6.80),
(48000, 2016.00, 7.20),
(72000, 2707.00, 7.60),
('inf', 4531.00, 7.90),
),
'head_of_household': (
( 2400, 0.00, 1.40),
( 4800, 34.00, 3.20),
( 9600, 110.00, 5.50),
(14400, 374.00, 6.40),
(19200, 682.00, 6.80),
(24000, 1008.00, 7.20),
(36000, 1354.00, 7.60),
('inf', 2266.00, 7.90),
),
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_hi_sit_tax_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_hi_sit_personal_exemption_rate" model="hr.rule.parameter">
<field name="name">US HI Hawaii Personal Exemption Rate</field>
<field name="code">us_hi_sit_personal_exemption_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_hi_sit_personal_exemption_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">1144</field>
<field name="rule_parameter_id" ref="rule_parameter_us_hi_sit_personal_exemption_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_hi_sit_personal_exemption_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">1144</field>
<field name="rule_parameter_id" ref="rule_parameter_us_hi_sit_personal_exemption_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_hi_dor" model="res.partner">
<field name="name">US Hawaii - Department of Labor and Industrial Relations - Unemployment Tax</field>
</record>
<record id="res_partner_us_hi_dor_sit" model="res.partner">
<field name="name">US Hawaii - Department of Taxation - Income Tax</field>
</record>
<!-- Categories -->
<!-- Rules -->
<record id="hr_payroll_rule_er_us_hi_suta" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US HI Hawaii State Unemployment</field>
<field name="code">ER_US_HI_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_hi_suta_wage_base', rate='us_hi_suta_rate', state_code='HI')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_hi_suta_wage_base', rate='us_hi_suta_rate', state_code='HI')</field>
<field name="partner_id" ref="res_partner_us_hi_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_ee_us_hi_sit" model="hr.salary.rule">
<field name="sequence" eval="195"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_ee_us_sit"/>
<field name="name">EE: US HI Hawaii State Income Tax Withholding</field>
<field name="code">EE_US_HI_SIT</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = hi_hawaii_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = hi_hawaii_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="partner_id" ref="res_partner_us_hi_dor_sit"/>
<field name="appears_on_payslip" eval="True"/>
</record>
</odoo>

View File

@@ -0,0 +1,303 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base -->
<record id="rule_parameter_us_ia_suta_wage_base" model="hr.rule.parameter">
<field name="name">US IA Iowa SUTA Wage Base</field>
<field name="code">us_ia_suta_wage_base</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ia_suta_wage_base_2019" model="hr.rule.parameter.value">
<field name="parameter_value">30600.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ia_suta_wage_base"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_ia_suta_wage_base_2020" model="hr.rule.parameter.value">
<field name="parameter_value">31600.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ia_suta_wage_base"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Rate -->
<record id="rule_parameter_us_ia_suta_rate" model="hr.rule.parameter">
<field name="name">US IA Iowa SUTA Rate</field>
<field name="code">us_ia_suta_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ia_suta_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">1.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ia_suta_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_ia_suta_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">1.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ia_suta_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_ia_sit_tax_rate" model="hr.rule.parameter">
<field name="name">US IA Iowa SIT Tax Rate</field>
<field name="code">us_ia_sit_tax_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ia_sit_tax_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">{
'daily': (
( 5.13, 0.0033, 0.00),
( 10.25, 0.0067, 0.02),
( 20.50, 0.0225, 0.05),
( 46.13, 0.0414, 0.28),
( 76.89, 0.0563, 1.34),
(102.52, 0.0596, 3.07),
(153.78, 0.0625, 4.60),
(230.68, 0.0744, 7.80),
( 'inf', 0.0853, 13.52),
),
'weekly': (
( 25.63, 0.0033, 0.00),
( 51.27, 0.0067, 0.08),
( 102.52, 0.0225, 0.25),
( 230.67, 0.0414, 1.40),
( 384.46, 0.0563, 6.71),
( 512.62, 0.0596, 15.37),
( 768.92, 0.0625, 23.01),
(1153.38, 0.0744, 39.03),
( 'inf', 0.0853, 67.63),
),
'bi-weekly': (
( 51.27, 0.0033, 0.00),
( 102.54, 0.0067, 0.17),
( 205.04, 0.0225, 0.51),
( 461.35, 0.0414, 2.82),
( 768.92, 0.0563, 13.43),
(1025.23, 0.0596, 30.75),
(1537.85, 0.0625, 46.03),
(2306.77, 0.0744, 78.07),
( 'inf', 0.0853, 135.28),
),
'semi-monthly': (
( 55.54, 0.0033, 0.00),
( 111.08, 0.0067, 0.18),
( 222.13, 0.0225, 0.55),
( 499.79, 0.0414, 3.05),
( 833.00, 0.0563, 14.59),
(1110.67, 0.0596, 33.31),
(1666.00, 0.0625, 49.86),
(2499.00, 0.0744, 84.57),
( 'inf', 0.0853, 146.55),
),
'monthly': (
( 111.08, 0.0033, 0.00),
( 222.17, 0.0067, 0.37),
( 444.25, 0.0225, 1.11),
( 999.58, 0.0414, 6.11),
(1666.00, 0.0563, 29.10),
(2221.33, 0.0596, 62.66),
(3332.00, 0.0625, 99.72),
(4998.00, 0.0744, 169.14),
( 'inf', 0.0853, 293.09),
),
'annual': (
( 1333.00, 0.0033, 0.00),
( 2666.00, 0.0067, 4.40),
( 5331.00, 0.0225, 13.33),
(11995.00, 0.0414, 73.29),
(19992.00, 0.0563, 349.19),
(26656.00, 0.0596, 799.41),
(39984.00, 0.0625, 1196.58),
(59976.00, 0.0744, 2029.58),
( 'inf', 0.0853, 3516.98),
),
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ia_sit_tax_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<!-- https://tax.iowa.gov/sites/default/files/idr/documents/WH/IA%20Withholding%20Formula%20and%20Instructions%20TY2020.pdf -->
<!-- Table from page 2.-->
<record id="rule_parameter_us_ia_sit_tax_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">{
'daily': (
( 5.69, 0.0033, 0.00),
( 11.38, 0.0067, 0.02),
( 22.76, 0.0225, 0.06),
( 51.22, 0.0414, 0.32),
( 85.36, 0.0563, 1.50),
(113.81, 0.0596, 3.42),
(170.71, 0.0625, 5.12),
(256.07, 0.0744, 8.68),
( 'inf', 0.0853, 15.03),
),
'weekly': (
( 28.46, 0.0033, 0.00),
( 56.90, 0.0067, 0.09),
( 113.81, 0.0225, 0.28),
( 256.08, 0.0414, 1.56),
( 426.79, 0.0563, 7.45),
( 569.04, 0.0596, 17.06),
( 853.56, 0.0625, 25.54),
(1280.35, 0.0744, 43.32),
( 'inf', 0.0853, 75.07),
),
'bi-weekly': (
( 56.92, 0.0033, 0.00),
( 113.81, 0.0067, 0.19),
( 227.62, 0.0225, 0.57),
( 512.15, 0.0414, 3.13),
( 853.58, 0.0563, 14.91),
(1138.08, 0.0596, 34.13),
(1707.12, 0.0625, 51.09),
(2560.69, 0.0744, 86.66),
( 'inf', 0.0853, 150.17),
),
'semi-monthly': (
( 61.67, 0.0033, 0.00),
( 23.29, 0.0067, 0.20),
( 246.58, 0.0225, 0.61),
( 554.83, 0.0414, 3.38),
( 924.71, 0.0563, 16.14),
(1232.92, 0.0596, 36.96),
(1849.38, 0.0625, 55.33),
(2774.08, 0.0744, 93.86),
( 'inf', 0.0853, 162.66),
),
'monthly': (
( 123.33, 0.0033, 0.00),
( 246.58, 0.0067, 0.41),
( 493.17, 0.0225, 1.24),
(1109.67, 0.0414, 6.79),
(1849.42, 0.0563, 32.31),
(2465.83, 0.0596, 73.96),
(3698.75, 0.0625, 110.70),
(5548.17, 0.0744, 187.76),
( 'inf', 0.0853, 325.36),
),
'annual': (
( 1480.00, 0.0033, 0.00),
( 2959.00, 0.0067, 4.88),
( 5918.00, 0.0225, 14.79),
(13316.00, 0.0414, 81.37),
(22193.00, 0.0563, 387.65),
(29590.00, 0.0596, 887.43),
(44385.00, 0.0625, 1328.29),
(66578.00, 0.0744, 2252.98),
( 'inf', 0.0853, 3904.14),
),
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ia_sit_tax_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_ia_sit_standard_deduction_rate" model="hr.rule.parameter">
<field name="name">US IA Iowa Standard Deduction Rate</field>
<field name="code">us_ia_sit_standard_deduction_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ia_sit_standard_deduction_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">{
'daily': ( 6.50, 16.00),
'weekly': ( 32.50, 80.00),
'bi-weekly': ( 65.00, 160.00),
'semi-monthly': ( 70.42, 173.33),
'monthly': ( 140.83, 346.67),
'annually': (1690.00, 4160.00),
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ia_sit_standard_deduction_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<!-- https://tax.iowa.gov/sites/default/files/idr/documents/WH/IA%20Withholding%20Formula%20and%20Instructions%20TY2020.pdf-->
<!-- Step 2 -->
<record id="rule_parameter_us_ia_sit_standard_deduction_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">{
'daily': ( 7.23, 17.81),
'weekly': ( 36.15, 89.04),
'bi-weekly': ( 72.31, 178.08),
'semi-monthly': ( 78.33, 192.92),
'monthly': ( 156.67, 385.83),
'annually': (1880.00, 4630.00),
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ia_sit_standard_deduction_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_ia_sit_deduction_allowance_rate" model="hr.rule.parameter">
<field name="name">US IA Iowa Deduction Allowance Rate</field>
<field name="code">us_ia_sit_deduction_allowance_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ia_sit_deduction_allowance_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">{
'daily': 0.15,
'weekly': 0.77,
'bi-weekly': 1.54,
'semi-monthly': 1.67,
'monthly': 3.33,
'annually': 40.00,
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ia_sit_deduction_allowance_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<!-- https://tax.iowa.gov/sites/default/files/idr/documents/WH/IA%20Withholding%20Formula%20and%20Instructions%20TY2020.pdf -->
<!-- Step 4 -->
<record id="rule_parameter_us_ia_sit_deduction_allowance_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">{
'daily': 0.15,
'weekly': 0.77,
'bi-weekly': 1.54,
'semi-monthly': 1.67,
'monthly': 3.33,
'annually': 40.00,
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ia_sit_deduction_allowance_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_ia_dor" model="res.partner">
<field name="name">US Iowa - Department of Economic Security (IDES) - Unemployment Tax</field>
</record>
<record id="res_partner_us_ia_dor_sit" model="res.partner">
<field name="name">US Iowa - Department of Revenue (IDOR) - Income Tax</field>
</record>
<!-- Categories -->
<!-- Rules -->
<record id="hr_payroll_rule_er_us_ia_suta" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US IA Iowa State Unemployment</field>
<field name="code">ER_US_IA_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_ia_suta_wage_base', rate='us_ia_suta_rate', state_code='IA')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_ia_suta_wage_base', rate='us_ia_suta_rate', state_code='IA')</field>
<field name="partner_id" ref="res_partner_us_ia_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_ee_us_ia_sit" model="hr.salary.rule">
<field name="sequence" eval="195"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_ee_us_sit"/>
<field name="name">EE: US IA Iowa State Income Tax Withholding</field>
<field name="code">EE_US_IA_SIT</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = ia_iowa_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = ia_iowa_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="partner_id" ref="res_partner_us_ia_dor_sit"/>
<field name="appears_on_payslip" eval="True"/>
</record>
</odoo>

View File

@@ -0,0 +1,448 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base -->
<record id="rule_parameter_us_id_suta_wage_base" model="hr.rule.parameter">
<field name="name">US ID Idaho SUTA Wage Base</field>
<field name="code">us_id_suta_wage_base</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_id_suta_wage_base_2019" model="hr.rule.parameter.value">
<field name="parameter_value">40000.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_id_suta_wage_base"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_id_suta_wage_base_2020" model="hr.rule.parameter.value">
<field name="parameter_value">41600.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_id_suta_wage_base"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Rate -->
<record id="rule_parameter_us_id_suta_rate" model="hr.rule.parameter">
<field name="name">US ID Idaho SUTA Rate</field>
<field name="code">us_id_suta_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_id_suta_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">1.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_id_suta_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_id_suta_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">1.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_id_suta_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_id_sit_tax_rate" model="hr.rule.parameter">
<field name="name">US ID Idaho SIT Tax Rate</field>
<field name="code">us_id_sit_tax_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_id_sit_tax_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">{
'single': {
'weekly': (
( 235, 0.00, 0.000),
( 264, 0.00, 1.125),
( 294, 0.00, 3.125),
( 324, 1.00, 3.625),
( 353, 2.00, 4.625),
( 383, 4.00, 5.625),
( 457, 5.00, 6.625),
('inf', 10.00, 6.925),
),
'bi-weekly': (
( 469, 0.00, 0.000),
( 529, 0.00, 1.125),
( 588, 1.00, 3.125),
( 647, 3.00, 3.625),
( 706, 5.00, 4.625),
( 766, 7.00, 5.625),
( 914, 11.00, 6.625),
('inf', 21.00, 6.925),
),
'semi-monthly': (
( 508, 0.00, 0.000),
( 573, 0.00, 1.125),
( 637, 1.00, 3.125),
( 701, 3.00, 3.625),
( 765, 5.00, 4.625),
( 829, 8.00, 5.625),
( 990, 12.00, 6.625),
('inf', 22.00, 6.925),
),
'monthly': (
( 1017, 0.00, 0.000),
( 1145, 0.00, 1.125),
( 1273, 1.00, 3.125),
( 1402, 5.00, 3.625),
( 1530, 10.00, 4.625),
( 1659, 16.00, 5.625),
( 1980, 23.00, 6.625),
('inf', 45.00, 6.925),
),
'annually': (
(12200, 0.00, 0.000),
(13741, 0.00, 1.125),
(15281, 17.00, 3.125),
(16822, 65.00, 3.625),
(18362, 121.00, 4.625),
(19903, 192.00, 5.625),
(23754, 279.00, 6.625),
('inf', 534.00, 6.925),
),
},
'married': {
'weekly': (
( 469, 0.00, 0.000),
( 529, 0.00, 1.125),
( 588, 0.00, 3.125),
( 647, 1.00, 3.625),
( 706, 2.00, 4.625),
( 766, 4.00, 5.625),
( 914, 5.00, 6.625),
('inf', 10.00, 6.925),
),
'bi-weekly': (
( 938, 0.00, 0.000),
( 1057, 0.00, 1.125),
( 1175, 1.00, 3.125),
( 1294, 5.00, 3.625),
( 1412, 9.00, 4.625),
( 1531, 15.00, 5.625),
( 1827, 21.00, 6.625),
('inf', 41.00, 6.925),
),
'semi-monthly': (
( 1017, 0.00, 0.000),
( 1145, 0.00, 1.125),
( 1273, 1.00, 3.125),
( 1402, 5.00, 3.625),
( 1530, 10.00, 4.625),
( 1659, 16.00, 5.625),
( 1980, 23.00, 6.625),
('inf', 45.00, 6.925),
),
'monthly': (
( 2033, 0.00, 0.000),
( 2290, 0.00, 1.125),
( 2547, 3.00, 3.125),
( 2804, 11.00, 3.625),
( 3060, 20.00, 4.625),
( 3317, 32.00, 5.625),
( 3959, 47.00, 6.625),
('inf', 89.00, 6.925),
),
'annually': (
(24400, 0.00, 0.000),
(27482, 0.00, 1.125),
(30562, 35.00, 3.125),
(33644, 131.00, 3.625),
(36724, 243.00, 4.625),
(39806, 385.00, 5.625),
(47508, 558.00, 6.625),
('inf', 1068.00, 6.925),
),
},
'head of household': {
'weekly': (
( 235, 0.00, 0.000),
( 264, 0.00, 1.125),
( 294, 0.00, 3.125),
( 324, 1.00, 3.625),
( 353, 2.00, 4.625),
( 383, 4.00, 5.625),
( 457, 5.00, 6.625),
('inf', 10.00, 6.925),
),
'bi-weekly': (
( 469, 0.00, 0.000),
( 529, 0.00, 1.125),
( 588, 1.00, 3.125),
( 647, 3.00, 3.625),
( 706, 5.00, 4.625),
( 766, 7.00, 5.625),
( 914, 11.00, 6.625),
('inf', 21.00, 6.925),
),
'semi-monthly': (
( 508, 0.00, 0.000),
( 573, 0.00, 1.125),
( 637, 1.00, 3.125),
( 701, 3.00, 3.625),
( 765, 5.00, 4.625),
( 829, 8.00, 5.625),
( 990, 12.00, 6.625),
('inf', 22.00, 6.925),
),
'monthly': (
( 1017, 0.00, 0.000),
( 1145, 0.00, 1.125),
( 1273, 1.00, 3.125),
( 1402, 5.00, 3.625),
( 1530, 10.00, 4.625),
( 1659, 16.00, 5.625),
( 1980, 23.00, 6.625),
('inf', 45.00, 6.925),
),
'annually': (
(12200, 0.00, 0.000),
(13741, 0.00, 1.125),
(15281, 17.00, 3.125),
(16822, 65.00, 3.625),
(18362, 121.00, 4.625),
(19903, 192.00, 5.625),
(23754, 279.00, 6.625),
('inf', 534.00, 6.925),
),
},
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_id_sit_tax_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<!-- https://tax.idaho.gov/pubs/EPB00744_06-16-2020.pdf -->
<!-- Page 1 to 3 -->
<record id="rule_parameter_us_id_sit_tax_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">{
'single': {
'weekly': (
( 238, 0.00, 0.000),
( 269, 0.00, 1.125),
( 299, 0.00, 3.125),
( 329, 1.00, 3.625),
( 359, 2.00, 4.625),
( 389, 4.00, 5.625),
( 465, 5.00, 6.625),
('inf', 10.00, 6.925),
),
'bi-weekly': (
( 477, 0.00, 0.000),
( 537, 0.00, 1.125),
( 598, 1.00, 3.125),
( 658, 3.00, 3.625),
( 718, 5.00, 4.625),
( 778, 8.00, 5.625),
( 929, 11.00, 6.625),
('inf', 21.00, 6.925),
),
'semi-monthly': (
( 517, 0.00, 0.000),
( 582, 0.00, 1.125),
( 647, 1.00, 3.125),
( 713, 3.00, 3.625),
( 778, 5.00, 4.625),
( 843, 8.00, 5.625),
( 1007, 12.00, 6.625),
('inf', 23.00, 6.925),
),
'monthly': (
( 1033, 0.00, 0.000),
( 1164, 0.00, 1.125),
( 1295, 1.00, 3.125),
( 1425, 6.00, 3.625),
( 1556, 10.00, 4.625),
( 1687, 16.00, 5.625),
( 2013, 24.00, 6.625),
('inf', 45.00, 6.925),
),
'annually': (
(12400, 0.00, 0.000),
(13968, 0.00, 1.125),
(15536, 18.00, 3.125),
(17104, 67.00, 3.625),
(18672, 124.00, 4.625),
(20240, 197.00, 5.625),
(24160, 285.00, 6.625),
('inf', 545.00, 6.925),
),
},
'married': {
'weekly': (
( 477, 0.00, 0.000),
( 537, 0.00, 1.125),
( 598, 0.00, 3.125),
( 658, 1.00, 3.625),
( 718, 3.00, 4.625),
( 778, 5.00, 5.625),
( 929, 11.00, 6.625),
('inf', 21.00, 6.925),
),
'bi-weekly': (
( 954, 0.00, 0.000),
( 1074, 0.00, 1.125),
( 1195, 1.00, 3.125),
( 1316, 5.00, 3.625),
( 1436, 9.00, 4.625),
( 1557, 15.00, 5.625),
( 1858, 22.00, 6.625),
('inf', 42.00, 6.925),
),
'semi-monthly': (
( 1033, 0.00, 0.000),
( 1164, 0.00, 1.125),
( 1295, 1.00, 3.125),
( 1425, 6.00, 3.625),
( 1556, 10.00, 4.625),
( 1687, 16.00, 5.625),
( 2013, 24.00, 6.625),
('inf', 45.00, 6.925),
),
'monthly': (
( 2067, 0.00, 0.000),
( 2328, 0.00, 1.125),
( 2589, 3.00, 3.125),
( 2851, 11.00, 3.625),
( 3112, 21.00, 4.625),
( 3373, 33.00, 5.625),
( 4027, 47.00, 6.625),
('inf', 91.00, 6.925),
),
'annually': (
(24400, 0.00, 0.000),
(27482, 0.00, 1.125),
(30562, 35.00, 3.125),
(33644, 131.00, 3.625),
(36724, 243.00, 4.625),
(39806, 385.00, 5.625),
(47508, 558.00, 6.625),
('inf', 1068.00, 6.925),
),
},
'head of household': {
'weekly': (
( 238, 0.00, 0.000),
( 269, 0.00, 1.125),
( 299, 0.00, 3.125),
( 329, 1.00, 3.625),
( 359, 2.00, 4.625),
( 389, 4.00, 5.625),
( 465, 5.00, 6.625),
('inf', 10.00, 6.925),
),
'bi-weekly': (
( 477, 0.00, 0.000),
( 537, 0.00, 1.125),
( 598, 1.00, 3.125),
( 658, 3.00, 3.625),
( 718, 5.00, 4.625),
( 778, 8.00, 5.625),
( 929, 11.00, 6.625),
('inf', 21.00, 6.925),
),
'semi-monthly': (
( 517, 0.00, 0.000),
( 582, 0.00, 1.125),
( 647, 1.00, 3.125),
( 713, 3.00, 3.625),
( 778, 5.00, 4.625),
( 843, 8.00, 5.625),
( 1007, 12.00, 6.625),
('inf', 23.00, 6.925),
),
'monthly': (
( 1033, 0.00, 0.000),
( 1164, 0.00, 1.125),
( 1295, 1.00, 3.125),
( 1425, 6.00, 3.625),
( 1556, 10.00, 4.625),
( 1687, 16.00, 5.625),
( 2013, 24.00, 6.625),
('inf', 45.00, 6.925),
),
'annually': (
(12400, 0.00, 0.000),
(13968, 0.00, 1.125),
(15536, 18.00, 3.125),
(17104, 67.00, 3.625),
(18672, 124.00, 4.625),
(20240, 197.00, 5.625),
(24160, 285.00, 6.625),
('inf', 545.00, 6.925),
),
},
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_id_sit_tax_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_id_sit_ictcat_rate" model="hr.rule.parameter">
<field name="name">US ID Idaho Child Tax Credit Allowance Rate</field>
<field name="code">us_id_sit_ictcat_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_id_sit_ictcat_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">{
'weekly': 56.92,
'bi-weekly': 113.85,
'semi-monthly': 123.33,
'monthly': 246.67,
'annually': 2960.00,
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_id_sit_ictcat_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<!-- https://tax.idaho.gov/i-1026.cfm?seg=compute -->
<!-- Idaho Child Tax Credit Allowances Table -->
<record id="rule_parameter_us_id_sit_ictcat_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">{
'weekly': 56.92,
'bi-weekly': 113.85,
'semi-monthly': 123.33,
'monthly': 246.67,
'annually': 2960.00,
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_id_sit_ictcat_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_id_dor" model="res.partner">
<field name="name">US Idaho - Department of Labor (IDOL) - Unemployment Tax</field>
</record>
<record id="res_partner_us_id_dor_sit" model="res.partner">
<field name="name">US Idaho - State Tax Commission (ISTC) - Income Tax</field>
</record>
<!-- Categories -->
<!-- Rules -->
<record id="hr_payroll_rule_er_us_id_suta" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US ID Idaho State Unemployment</field>
<field name="code">ER_US_ID_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_id_suta_wage_base', rate='us_id_suta_rate', state_code='ID')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_id_suta_wage_base', rate='us_id_suta_rate', state_code='ID')</field>
<field name="partner_id" ref="res_partner_us_id_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_ee_us_id_sit" model="hr.salary.rule">
<field name="sequence" eval="195"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_ee_us_sit"/>
<field name="name">EE: US ID Idaho State Income Tax Withholding</field>
<field name="code">EE_US_ID_SIT</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = id_idaho_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = id_idaho_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="partner_id" ref="res_partner_us_id_dor_sit"/>
<field name="appears_on_payslip" eval="True"/>
</record>
</odoo>

View File

@@ -0,0 +1,117 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base -->
<record id="rule_parameter_us_il_suta_wage_base" model="hr.rule.parameter">
<field name="name">US IL Illinois SUTA Wage Base</field>
<field name="code">us_il_suta_wage_base</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_il_suta_wage_base_2019" model="hr.rule.parameter.value">
<field name="parameter_value">12960.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_il_suta_wage_base"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_il_suta_wage_base_2020" model="hr.rule.parameter.value">
<field name="parameter_value">12740.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_il_suta_wage_base"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Rate -->
<record id="rule_parameter_us_il_suta_rate" model="hr.rule.parameter">
<field name="name">US IL Illinois SUTA Rate</field>
<field name="code">us_il_suta_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_il_suta_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">3.175</field>
<field name="rule_parameter_id" ref="rule_parameter_us_il_suta_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_il_suta_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">3.125</field>
<field name="rule_parameter_id" ref="rule_parameter_us_il_suta_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_il_sit_basic_allowances_rate" model="hr.rule.parameter">
<field name="name">US IL Illinois Basic Allowances Rate</field>
<field name="code">us_il_sit_basic_allowances_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_il_sit_basic_allowances_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">2275.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_il_sit_basic_allowances_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_il_sit_basic_allowances_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">2325.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_il_sit_basic_allowances_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_il_sit_additional_allowances_rate" model="hr.rule.parameter">
<field name="name">US IL Illinois Additional Allowances Rate</field>
<field name="code">us_il_sit_additional_allowances_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_il_sit_additional_allowances_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">1000.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_il_sit_additional_allowances_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_il_sit_additional_allowances_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">1000.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_il_sit_additional_allowances_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_il_dor" model="res.partner">
<field name="name">US Illinois - Department of Economic Security (IDES) - Unemployment Tax</field>
</record>
<record id="res_partner_us_il_dor_sit" model="res.partner">
<field name="name">US Illinois - Department of Revenue (IDOR) - Income Tax</field>
</record>
<!-- Categories -->
<!-- Rules -->
<record id="hr_payroll_rule_er_us_il_suta" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US IL Illinois State Unemployment</field>
<field name="code">ER_US_IL_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_il_suta_wage_base', rate='us_il_suta_rate', state_code='IL')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_il_suta_wage_base', rate='us_il_suta_rate', state_code='IL')</field>
<field name="partner_id" ref="res_partner_us_il_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_ee_us_il_sit" model="hr.salary.rule">
<field name="sequence" eval="195"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_ee_us_sit"/>
<field name="name">EE: US IL Illinois State Income Tax Withholding</field>
<field name="code">EE_US_IL_SIT</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = il_illinois_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = il_illinois_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="partner_id" ref="res_partner_us_il_dor_sit"/>
<field name="appears_on_payslip" eval="True"/>
</record>
</odoo>

View File

@@ -0,0 +1,122 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base -->
<record id="rule_parameter_us_in_suta_wage_base" model="hr.rule.parameter">
<field name="name">US IN Indiana SUTA Wage Base</field>
<field name="code">us_in_suta_wage_base</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_in_suta_wage_base_2020" model="hr.rule.parameter.value">
<field name="parameter_value">9500.00</field>
<field name="rule_parameter_id" ref="rule_parameter_us_in_suta_wage_base"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Rate -->
<record id="rule_parameter_us_in_suta_rate" model="hr.rule.parameter">
<field name="name">US IN Indiana SUTA Rate</field>
<field name="code">us_in_suta_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_in_suta_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">2.5</field>
<field name="rule_parameter_id" ref="rule_parameter_us_in_suta_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- state income rate -->
<record id="rule_parameter_us_in_suta_income_rate" model="hr.rule.parameter">
<field name="name">US IN Indiana SUTA Income Rate</field>
<field name="code">us_in_suta_income_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_in_suta_income_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">3.23</field>
<field name="rule_parameter_id" ref="rule_parameter_us_in_suta_income_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_in_sit_personal_exemption_rate" model="hr.rule.parameter">
<field name="name">US IN Indiana SIT Personal Exemption Rate</field>
<field name="code">us_in_sit_personal_exemption_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_in_sit_personal_exemption_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">{
'daily': ( 2.74, 5.48, 8.22, 10.96, 13.70, 16.44),
'weekly': ( 19.23, 38.46, 57.69, 76.92, 96.15, 115.38),
'bi-weekly': ( 38.46, 76.92, 115.38, 153.85, 192.31, 230.77),
'semi-monthly': ( 41.67, 83.33, 125.00, 166.67, 208.33, 250.00),
'monthly': ( 83.33, 166.67, 250.00, 333.33, 416.67, 500.00),
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_in_sit_personal_exemption_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_in_sit_dependent_exemption_rate" model="hr.rule.parameter">
<field name="name">US IN Indiana SIT Dependent Exemption Rate</field>
<field name="code">us_in_sit_dependent_exemption_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_in_sit_dependent_exemption_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">{
'daily': ( 4.11, 8.22, 12.33, 16.44, 20.55),
'weekly': ( 28.85, 57.69, 86.54, 115.38, 144.23),
'bi-weekly': ( 57.69, 115.38, 173.08, 230.77, 288.46),
'semi-monthly': ( 62.50, 125.00, 187.50, 250.00, 312.50),
'monthly': (125.00, 250.00, 375.00, 500.00, 625.00),
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_in_sit_dependent_exemption_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_in_dor" model="res.partner">
<field name="name">US Indiana - Department of Workforce Development - Unemployment Tax</field>
</record>
<record id="res_partner_us_in_dor_sit" model="res.partner">
<field name="name">US Indiana - Department of Revenue - Income Tax</field>
</record>
<!-- Categories -->
<!-- Rules -->
<record id="hr_payroll_rule_er_us_in_suta" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US IN Indiana State Unemployment</field>
<field name="code">ER_US_IN_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_in_suta_wage_base', rate='us_in_suta_rate', state_code='IN')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_in_suta_wage_base', rate='us_in_suta_rate', state_code='IN')</field>
<field name="partner_id" ref="res_partner_us_in_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_ee_us_in_sit" model="hr.salary.rule">
<field name="sequence" eval="195"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_ee_us_sit"/>
<field name="name">EE: US IN Indiana State Income Tax Withholding</field>
<field name="code">EE_US_IN_SIT</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = in_indiana_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = in_indiana_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="partner_id" ref="res_partner_us_in_dor_sit"/>
<field name="appears_on_payslip" eval="True"/>
</record>
</odoo>

View File

@@ -0,0 +1,194 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base -->
<record id="rule_parameter_us_ks_suta_wage_base" model="hr.rule.parameter">
<field name="name">US KS Kansas SUTA Wage Base</field>
<field name="code">us_ks_suta_wage_base</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ks_suta_wage_base_2020" model="hr.rule.parameter.value">
<field name="parameter_value">14000.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ks_suta_wage_base"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Rate -->
<record id="rule_parameter_us_ks_suta_rate" model="hr.rule.parameter">
<field name="name">US KS Kansas SUTA Rate</field>
<field name="code">us_ks_suta_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ks_suta_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">2.7</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ks_suta_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_ks_sit_allowances_rate" model="hr.rule.parameter">
<field name="name">US KS Kansas Allowances Rate</field>
<field name="code">us_ks_sit_allowances_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ks_sit_allowances_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">{
'weekly' : 43.27,
'bi-weekly' : 86.54,
'semi-monthly': 93.75,
'monthly' : 187.50,
'quarterly' : 562.50,
'semi-annual': 1125.00,
'annually': 2250.00,
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ks_sit_allowances_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Table from percentage table from https://www.ksrevenue.org/pdf/kw100.pdf -->
<record id="rule_parameter_us_ks_sit_tax_rate" model="hr.rule.parameter">
<field name="name">US KS Kansas SIT Tax Rate</field>
<field name="code">us_ks_sit_tax_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ks_sit_tax_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">{
'single': {
'weekly': (
( 58, 0.00, 0.00),
( 346, 3.10, 0.00),
( 635, 5.25, 8.94),
('inf', 5.70, 24.09),
),
'bi-weekly': (
( 115, 0.00, 0.00),
( 692, 3.10, 0.00),
( 1269, 5.25, 17.88),
('inf', 5.70, 48.17),
),
'semi-monthly': (
( 125, 0.00, 0.00),
( 750, 3.10, 0.00),
( 1375, 5.25, 19.38),
('inf', 5.70, 52.19),
),
'monthly': (
( 250, 0.00, 0.00),
( 1500, 3.10, 0.00),
( 2750, 5.25, 38.75),
('inf', 5.70, 104.38),
),
'quarterly': (
( 750, 0.00, 0.00),
( 4500, 3.10, 0.00),
(8250, 5.25, 116.25),
('inf', 5.70, 313.13),
),
'semi-annual': (
( 1500, 0.00, 0.00),
( 9000, 3.10, 0.00),
(16500, 5.25, 232.50),
('inf', 5.70, 626.25),
),
'annually': (
( 3000, 0.00, 0.00),
(18000, 3.10, 0.00),
(33000, 5.25, 465.00),
('inf', 5.70, 1252.50),
),
},
'married': {
'weekly': (
( 144, 0.00, 0.00),
( 721, 3.10, 0.00),
(1298, 5.25, 17.88),
('inf', 5.70, 48.17),
),
'bi-weekly': (
( 288, 0.00, 0.00),
( 1442, 3.10, 0.00),
( 2596, 5.25, 35.77),
('inf', 5.70, 96.35),
),
'semi-monthly': (
( 313, 0.00, 0.00),
( 1563, 3.10, 0.00),
( 2813, 5.25, 38.75),
('inf', 5.70, 104.38),
),
'monthly': (
( 625, 0.00, 0.00),
( 3125, 3.10, 0.00),
( 5625, 5.25, 77.50),
('inf', 5.70, 208.75),
),
'quarterly': (
( 1875, 0.00, 0.00),
( 9375, 3.10, 0.00),
(16875, 5.25, 232.50),
('inf', 5.70, 626.25),
),
'semi-annual': (
( 3750, 0.00, 0.00),
(18750, 3.10, 0.00),
(33750, 5.25, 465.00),
('inf', 5.70, 1252.50),
),
'annually': (
( 7500, 0.00, 0.00),
(37500, 3.10, 0.00),
(67500, 5.25, 930.00),
('inf', 5.70, 2505.00),
),
},
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ks_sit_tax_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_ks_dor" model="res.partner">
<field name="name">US Kansas - Department of Labor - Unemployment Tax</field>
</record>
<record id="res_partner_us_ks_dor_sit" model="res.partner">
<field name="name">US Kansas - Department of Revenue - Income Tax</field>
</record>
<!-- Categories -->
<!-- Rules -->
<record id="hr_payroll_rule_er_us_ks_suta" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US KS Kansas State Unemployment</field>
<field name="code">ER_US_KS_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_ks_suta_wage_base', rate='us_ks_suta_rate', state_code='KS')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_ks_suta_wage_base', rate='us_ks_suta_rate', state_code='KS')</field>
<field name="partner_id" ref="res_partner_us_ks_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_ee_us_ks_sit" model="hr.salary.rule">
<field name="sequence" eval="195"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_ee_us_sit"/>
<field name="name">EE: US KS Kansas State Income Tax Withholding</field>
<field name="code">EE_US_KS_SIT</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = ks_kansas_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = ks_kansas_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="partner_id" ref="res_partner_us_ks_dor_sit"/>
<field name="appears_on_payslip" eval="True"/>
</record>
</odoo>

View File

@@ -0,0 +1,99 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base -->
<record id="rule_parameter_us_ky_suta_wage_base" model="hr.rule.parameter">
<field name="name">US KY Kentucky SUTA Wage Base</field>
<field name="code">us_ky_suta_wage_base</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ky_suta_wage_base_2020" model="hr.rule.parameter.value">
<field name="parameter_value">10800.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ky_suta_wage_base"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Rate -->
<record id="rule_parameter_us_ky_suta_rate" model="hr.rule.parameter">
<field name="name">US KY Kentucky SUTA Rate</field>
<field name="code">us_ky_suta_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ky_suta_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">2.7</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ky_suta_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_ky_sit_standard_deduction_rate" model="hr.rule.parameter">
<field name="name">US KY Kentucky Standard Deduction Rate</field>
<field name="code">us_ky_sit_standard_deduction_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<!-- Data from https://revenue.ky.gov/Forms/42A003(T)%20(12-2019)%202020%20Tax%20Tables.pdf -->
<record id="rule_parameter_us_ky_sit_standard_deduction_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">2650</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ky_sit_standard_deduction_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_ky_sit_tax_rate" model="hr.rule.parameter">
<field name="name">US KY Kentucky SIT Tax Rate</field>
<field name="code">us_ky_sit_tax_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<!-- Data from https://revenue.ky.gov/Forms/42A003(T)%20(12-2019)%202020%20Tax%20Tables.pdf -->
<data noupdate="1">
<record id="rule_parameter_us_ky_sit_tax_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">5.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ky_sit_tax_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_ky_dor" model="res.partner">
<field name="name">US Kentucky - Office of Unemployment Insurance - Unemployment Tax</field>
</record>
<record id="res_partner_us_ky_dor_sit" model="res.partner">
<field name="name">US Kentucky - Department of Revenue - Income Tax</field>
</record>
<!-- Categories -->
<!-- Rules -->
<record id="hr_payroll_rule_er_us_ky_suta" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US KY Kentucky State Unemployment</field>
<field name="code">ER_US_KY_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_ky_suta_wage_base', rate='us_ky_suta_rate', state_code='KY')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_ky_suta_wage_base', rate='us_ky_suta_rate', state_code='KY')</field>
<field name="partner_id" ref="res_partner_us_ky_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_ee_us_ky_sit" model="hr.salary.rule">
<field name="sequence" eval="195"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_ee_us_sit"/>
<field name="name">EE: US KY Kentucky State Income Tax Withholding</field>
<field name="code">EE_US_KY_SIT</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = ky_kentucky_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = ky_kentucky_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="partner_id" ref="res_partner_us_ky_dor_sit"/>
<field name="appears_on_payslip" eval="True"/>
</record>
</odoo>

View File

@@ -0,0 +1,157 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base -->
<record id="rule_parameter_us_la_suta_wage_base" model="hr.rule.parameter">
<field name="name">US LA Louisiana SUTA Wage Base</field>
<field name="code">us_la_suta_wage_base</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_la_suta_wage_base_2019" model="hr.rule.parameter.value">
<field name="parameter_value">7700.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_la_suta_wage_base"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_la_suta_wage_base_2020" model="hr.rule.parameter.value">
<field name="parameter_value">7700.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_la_suta_wage_base"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Rate -->
<record id="rule_parameter_us_la_suta_rate" model="hr.rule.parameter">
<field name="name">US LA Louisiana SUTA Rate</field>
<field name="code">us_la_suta_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_la_suta_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">1.14</field>
<field name="rule_parameter_id" ref="rule_parameter_us_la_suta_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_la_suta_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">1.14</field>
<field name="rule_parameter_id" ref="rule_parameter_us_la_suta_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- table data from http://www.revenue.louisiana.gov/taxforms/1306(7_09)W.pdf page 9. -->
<record id="rule_parameter_us_la_sit_tax_rate" model="hr.rule.parameter">
<field name="name">US LA Louisiana SIT Tax Rate</field>
<field name="code">us_la_sit_tax_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_la_sit_tax_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">{
'single': (
(12500.00, 2.10),
(50000.00, 1.60),
( 'inf', 1.35),
),
'married': (
( 25000.00, 2.10),
(100000.00, 1.65),
( 'inf', 1.35),
),
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_la_sit_tax_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_la_sit_tax_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">{
'single': (
(12500.00, 2.10),
(50000.00, 1.60),
( 'inf', 1.35)
),
'married': (
( 25000.00, 2.10),
(100000.00, 1.65),
( 'inf', 1.35)
),
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_la_sit_tax_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_la_sit_personal_exemption_rate" model="hr.rule.parameter">
<field name="name">US LA Louisiana Personal Exemption Rate</field>
<field name="code">us_la_sit_personal_exemption_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_la_sit_personal_exemption_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">4500</field>
<field name="rule_parameter_id" ref="rule_parameter_us_la_sit_personal_exemption_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_la_sit_personal_exemption_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">4500</field>
<field name="rule_parameter_id" ref="rule_parameter_us_la_sit_personal_exemption_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_la_sit_dependent_rate" model="hr.rule.parameter">
<field name="name">US LA Louisiana Dependent Rate</field>
<field name="code">us_la_sit_dependent_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_la_sit_dependent_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">1000.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_la_sit_dependent_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_la_sit_dependent_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">1000.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_la_sit_dependent_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_la_dor" model="res.partner">
<field name="name">US Louisiana - Workforce Commission (LWC) - Unemployment Tax</field>
</record>
<record id="res_partner_us_la_dor_sit" model="res.partner">
<field name="name">US Louisiana - Department of Revenue (LDOR) - Income Tax</field>
</record>
<!-- Categories -->
<!-- Rules -->
<record id="hr_payroll_rule_er_us_la_suta" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US LA Louisiana State Unemployment</field>
<field name="code">ER_US_LA_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_la_suta_wage_base', rate='us_la_suta_rate', state_code='LA')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_la_suta_wage_base', rate='us_la_suta_rate', state_code='LA')</field>
<field name="partner_id" ref="res_partner_us_la_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_ee_us_la_sit" model="hr.salary.rule">
<field name="sequence" eval="195"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_ee_us_sit"/>
<field name="name">EE: US LA Louisiana State Income Tax Withholding</field>
<field name="code">EE_US_LA_SIT</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = la_louisiana_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = la_louisiana_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="partner_id" ref="res_partner_us_la_dor_sit"/>
<field name="appears_on_payslip" eval="True"/>
</record>
</odoo>

View File

@@ -0,0 +1,131 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base -->
<record id="rule_parameter_us_me_suta_wage_base" model="hr.rule.parameter">
<field name="name">US ME Maine SUTA Wage Base</field>
<field name="code">us_me_suta_wage_base</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_me_suta_wage_base_2020" model="hr.rule.parameter.value">
<field name="parameter_value">12000.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_me_suta_wage_base"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Rate -->
<record id="rule_parameter_us_me_suta_rate" model="hr.rule.parameter">
<field name="name">US ME Maine SUTA Rate</field>
<field name="code">us_me_suta_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_me_suta_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">1.92</field>
<field name="rule_parameter_id" ref="rule_parameter_us_me_suta_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- table based on https://www.maine.gov/revenue/forms/with/2020/20_WH_Tab&Instructions.pdf step 6.-->
<record id="rule_parameter_us_me_sit_tax_rate" model="hr.rule.parameter">
<field name="name">US ME Maine SIT Tax Rate</field>
<field name="code">us_me_sit_tax_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_me_sit_tax_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">{
'single': (
( 22200, 0, 5.80),
( 52600, 1288, 6.75),
( 'inf', 3340, 7.15),
),
'married': (
( 44450, 0, 5.80),
( 105200, 2578, 6.75),
( 'inf', 6679, 7.15),
),
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_me_sit_tax_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_me_sit_standard_deduction_rate" model="hr.rule.parameter">
<field name="name">US ME Maine Standard Deduction Rate</field>
<field name="code">us_me_sit_standard_deduction_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_me_sit_standard_deduction_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">{
'single': {
( 82900, 9550),
(157900, 75000),
},
'married': {
(165800, 21950),
(315800, 150000),
},
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_me_sit_standard_deduction_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_me_sit_personal_exemption_rate" model="hr.rule.parameter">
<field name="name">US ME Maine Personal Exemption Rate</field>
<field name="code">us_me_sit_personal_exemption_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_me_sit_personal_exemption_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">4300</field>
<field name="rule_parameter_id" ref="rule_parameter_us_me_sit_personal_exemption_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_me_dor" model="res.partner">
<field name="name">US Maine - Department Of Labor | ReEmploy - Unemployment Tax</field>
</record>
<record id="res_partner_us_me_dor_sit" model="res.partner">
<field name="name">US Maine - Department Of Revenue Services - Income Tax</field>
</record>
<!-- Categories -->
<!-- Rules -->
<record id="hr_payroll_rule_er_us_me_suta" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US ME Maine State Unemployment</field>
<field name="code">ER_US_ME_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_me_suta_wage_base', rate='us_me_suta_rate', state_code='ME')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_me_suta_wage_base', rate='us_me_suta_rate', state_code='ME')</field>
<field name="partner_id" ref="res_partner_us_me_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_ee_us_me_sit" model="hr.salary.rule">
<field name="sequence" eval="195"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_ee_us_sit"/>
<field name="name">EE: US ME Maine State Income Tax Withholding</field>
<field name="code">EE_US_ME_SIT</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = me_maine_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = me_maine_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="partner_id" ref="res_partner_us_me_dor_sit"/>
<field name="appears_on_payslip" eval="True"/>
</record>
</odoo>

View File

@@ -0,0 +1,99 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base -->
<record id="rule_parameter_us_mi_suta_wage_base" model="hr.rule.parameter">
<field name="name">US MI Michigan SUTA Wage Base</field>
<field name="code">us_mi_suta_wage_base</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_mi_suta_wage_base_2019" model="hr.rule.parameter.value">
<field name="parameter_value">9500.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_mi_suta_wage_base"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_mi_suta_wage_base_2020" model="hr.rule.parameter.value">
<field name="parameter_value">9000.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_mi_suta_wage_base"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Rate -->
<record id="rule_parameter_us_mi_suta_rate" model="hr.rule.parameter">
<field name="name">US MI Michigan SUTA Rate</field>
<field name="code">us_mi_suta_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_mi_suta_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">2.7</field>
<field name="rule_parameter_id" ref="rule_parameter_us_mi_suta_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_mi_suta_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">2.7</field>
<field name="rule_parameter_id" ref="rule_parameter_us_mi_suta_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_mi_sit_exemption_rate" model="hr.rule.parameter">
<field name="name">US MI Michigan Exemption Rate</field>
<field name="code">us_mi_sit_exemption_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_mi_sit_exemption_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">4400.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_mi_sit_exemption_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_mi_sit_exemption_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">4750.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_mi_sit_exemption_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_mi_dor" model="res.partner">
<field name="name">US Michigan - Unemployment Insurance Agency - Unemployment Tax</field>
</record>
<record id="res_partner_us_mi_dor_sit" model="res.partner">
<field name="name">US Michigan - Department of Treasury - Income Tax</field>
</record>
<!-- Categories -->
<!-- Rules -->
<record id="hr_payroll_rule_er_us_mi_suta" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US MI Michigan State Unemployment</field>
<field name="code">ER_US_MI_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_mi_suta_wage_base', rate='us_mi_suta_rate', state_code='MI')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_mi_suta_wage_base', rate='us_mi_suta_rate', state_code='MI')</field>
<field name="partner_id" ref="res_partner_us_mi_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_ee_us_mi_sit" model="hr.salary.rule">
<field name="sequence" eval="195"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_ee_us_sit"/>
<field name="name">EE: US MI Michigan State Income Tax Withholding</field>
<field name="code">EE_US_MI_SIT</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = mi_michigan_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = mi_michigan_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="partner_id" ref="res_partner_us_mi_dor_sit"/>
<field name="appears_on_payslip" eval="True"/>
</record>
</odoo>

View File

@@ -0,0 +1,147 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base -->
<record id="rule_parameter_us_mn_suta_wage_base" model="hr.rule.parameter">
<field name="name">US MN Minnesota SUTA Wage Base</field>
<field name="code">us_mn_suta_wage_base</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_mn_suta_wage_base_2019" model="hr.rule.parameter.value">
<field name="parameter_value">34000.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_mn_suta_wage_base"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_mn_suta_wage_base_2020" model="hr.rule.parameter.value">
<field name="parameter_value">35000.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_mn_suta_wage_base"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Rate -->
<record id="rule_parameter_us_mn_suta_rate" model="hr.rule.parameter">
<field name="name">US MN Minnesota SUTA Rate</field>
<field name="code">us_mn_suta_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_mn_suta_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">1.11</field>
<field name="rule_parameter_id" ref="rule_parameter_us_mn_suta_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_mn_suta_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">1.11</field>
<field name="rule_parameter_id" ref="rule_parameter_us_mn_suta_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_mn_sit_tax_rate" model="hr.rule.parameter">
<field name="name">US MN Minnesota SIT Tax Rate</field>
<field name="code">us_mn_sit_tax_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_mn_sit_tax_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">{
'single': (
( 28920, 2400, 5.35, 0.00),
( 89510, 28920, 7.05, 1418.82),
(166290, 89510, 7.85, 5690.42),
( 'inf', 166290, 9.85, 11717.65),
),
'married': (
( 47820, 9050, 5.35, 0.00),
( 163070, 47820, 7.05, 2074.20),
( 282200, 163070, 7.85, 10199.33),
( 'inf', 282200, 9.85, 19551.04),
),
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_mn_sit_tax_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<!-- https://www.revenue.state.mn.us/sites/default/files/2019-12/wh_inst_20_0.pdf -->
<!-- Chart for step 5 value -->
<record id="rule_parameter_us_mn_sit_tax_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">{
'single': (
( 30760, 3800, 5.35, 0.00),
( 92350, 30760, 6.80, 1442.36),
(168200, 92350, 7.85, 5630.48),
( 'inf', 168200, 9.85, 11584.71),
),
'married': (
( 51310, 11900, 5.35, 0.00),
( 168470, 51310, 6.80, 2108.44),
( 285370, 168470, 7.85, 10075.32),
( 'inf', 285370, 9.85, 19251.97),
),
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_mn_sit_tax_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_mn_sit_allowances_rate" model="hr.rule.parameter">
<field name="name">US MN Minnesota Allowances Rate</field>
<field name="code">us_mn_sit_allowances_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_mn_sit_allowances_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">4250.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_mn_sit_allowances_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<!-- https://www.revenue.state.mn.us/sites/default/files/2019-12/wh_inst_20_0.pdf -->
<!-- Step 3. -->
<record id="rule_parameter_us_mn_sit_allowances_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">4300.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_mn_sit_allowances_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_mn_dor" model="res.partner">
<field name="name">US Minnesota - Unemployment Insurance Agency - Unemployment Tax</field>
</record>
<record id="res_partner_us_mn_dor_sit" model="res.partner">
<field name="name">US Minnesota - Department of Treasury - Income Tax</field>
</record>
<!-- Categories -->
<!-- Rules -->
<record id="hr_payroll_rule_er_us_mn_suta" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US MN Minnesota State Unemployment</field>
<field name="code">ER_US_MN_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_mn_suta_wage_base', rate='us_mn_suta_rate', state_code='MN')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_mn_suta_wage_base', rate='us_mn_suta_rate', state_code='MN')</field>
<field name="partner_id" ref="res_partner_us_mn_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_ee_us_mn_sit" model="hr.salary.rule">
<field name="sequence" eval="195"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_ee_us_sit"/>
<field name="name">EE: US MN Minnesota State Income Tax Withholding</field>
<field name="code">EE_US_MN_SIT</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = mn_minnesota_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = mn_minnesota_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="partner_id" ref="res_partner_us_mn_dor_sit"/>
<field name="appears_on_payslip" eval="True"/>
</record>
</odoo>

View File

@@ -0,0 +1,151 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base -->
<record id="rule_parameter_us_mo_suta_wage_base" model="hr.rule.parameter">
<field name="name">US MO Missouri SUTA Wage Base</field>
<field name="code">us_mo_suta_wage_base</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_mo_suta_wage_base_2019" model="hr.rule.parameter.value">
<field name="parameter_value">12000.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_mo_suta_wage_base"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_mo_suta_wage_base_2020" model="hr.rule.parameter.value">
<field name="parameter_value">11500.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_mo_suta_wage_base"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Rate -->
<record id="rule_parameter_us_mo_suta_rate" model="hr.rule.parameter">
<field name="name">US MO Missouri SUTA Rate</field>
<field name="code">us_mo_suta_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_mo_suta_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">2.376</field>
<field name="rule_parameter_id" ref="rule_parameter_us_mo_suta_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_mo_suta_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">2.376</field>
<field name="rule_parameter_id" ref="rule_parameter_us_mo_suta_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_mo_sit_rate" model="hr.rule.parameter">
<field name="name">US MO Missouri SIT Rate Table</field>
<field name="code">us_mo_sit_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<!-- https://dor.mo.gov/forms/4282_2019.pdf -->
<record id="rule_parameter_us_mo_sit_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">[
(1053.0, 1.5),
(1053.0, 2.0),
(1053.0, 2.5),
(1053.0, 3.0),
(1053.0, 3.5),
(1053.0, 4.0),
(1053.0, 4.5),
(1053.0, 5.0),
( 'inf', 5.4),
]</field>
<field name="rule_parameter_id" ref="rule_parameter_us_mo_sit_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<!-- https://dor.mo.gov/forms/4282_2020.pdf -->
<!-- Income Tax Withholding Percentage Table-->
<record id="rule_parameter_us_mo_sit_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">[
(1073.0, 1.5),
(1073.0, 2.0),
(1073.0, 2.5),
(1073.0, 3.0),
(1073.0, 3.5),
(1073.0, 4.0),
(1073.0, 4.5),
(1073.0, 5.0),
( 'inf', 5.4),
]</field>
<field name="rule_parameter_id" ref="rule_parameter_us_mo_sit_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_mo_sit_deduction" model="hr.rule.parameter">
<field name="name">US MO Missouri SIT Deduction</field>
<field name="code">us_mo_sit_deduction</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<!-- https://dor.mo.gov/forms/4282_2019.pdf -->
<record id="rule_parameter_us_mo_sit_deduction_2019" model="hr.rule.parameter.value">
<field name="parameter_value">{
'single': 12400.0,
'married': 24800.0,
'head_of_household': 18650.0,
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_mo_sit_deduction"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<!-- https://dor.mo.gov/forms/4282_2020.pdf -->
<!-- 2020 Missouri Withholding Tax Formula Page.12 -->
<record id="rule_parameter_us_mo_sit_deduction_2020" model="hr.rule.parameter.value">
<field name="parameter_value">{
'single': 12400.0,
'married': 24800.0,
'head_of_household': 18650.0,
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_mo_sit_deduction"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_mo_dor" model="res.partner">
<field name="name">US Missouri - Department of Taxation - Unemployment Tax</field>
</record>
<record id="res_partner_us_mo_dor_sit" model="res.partner">
<field name="name">US Missouri - Department of Taxation - Income Tax</field>
</record>
<!-- Categories -->
<!-- Rules -->
<record id="hr_payroll_rule_er_us_mo_suta" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US MO Missouri State Unemployment</field>
<field name="code">ER_US_MO_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_mo_suta_wage_base', rate='us_mo_suta_rate', state_code='MO')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_mo_suta_wage_base', rate='us_mo_suta_rate', state_code='MO')</field>
<field name="partner_id" ref="res_partner_us_mo_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_ee_us_mo_sit" model="hr.salary.rule">
<field name="sequence" eval="195"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_ee_us_sit"/>
<field name="name">EE: US MO Missouri State Income Tax Withholding</field>
<field name="code">EE_US_MO_SIT</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = mo_missouri_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = mo_missouri_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="partner_id" ref="res_partner_us_mo_dor_sit"/>
<field name="appears_on_payslip" eval="True"/>
</record>
</odoo>

View File

@@ -0,0 +1,139 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base -->
<record id="rule_parameter_us_ms_suta_wage_base" model="hr.rule.parameter">
<field name="name">US MS Mississippi SUTA Wage Base</field>
<field name="code">us_ms_suta_wage_base</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ms_suta_wage_base_2019" model="hr.rule.parameter.value">
<field name="parameter_value">14000.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ms_suta_wage_base"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_ms_suta_wage_base_2020" model="hr.rule.parameter.value">
<field name="parameter_value">14000.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ms_suta_wage_base"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Rate -->
<record id="rule_parameter_us_ms_suta_rate" model="hr.rule.parameter">
<field name="name">US MS Mississippi SUTA Rate</field>
<field name="code">us_ms_suta_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ms_suta_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">1.2</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ms_suta_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_ms_suta_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">1.2</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ms_suta_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_ms_sit_rate" model="hr.rule.parameter">
<field name="name">US MS Mississippi SIT Rate Table</field>
<field name="code">us_ms_sit_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ms_sit_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">[
( 10000.00, 290.0, 0.05),
( 5000.00, 90.0, 0.04),
( 2000.00, 0.0, 0.03),
]</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ms_sit_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<!-- https://www.dor.ms.gov/Documents/Computer%20Payroll%20Flowchart.pdf -->
<!-- Table D. -->
<record id="rule_parameter_us_ms_sit_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">[
( 10000.00, 260.0, 0.05),
( 5000.00, 60.0, 0.04),
( 3000.00, 0.0, 0.03),
]</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ms_sit_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_ms_sit_deduction" model="hr.rule.parameter">
<field name="name">US MS Mississippi SIT Deduction</field>
<field name="code">us_ms_sit_deduction</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ms_sit_deduction_2019" model="hr.rule.parameter.value">
<field name="parameter_value">{
'single': 2300.0,
'head_of_household': 3400.0,
'married_dual': 2300.0,
'married': 4600.0,
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ms_sit_deduction"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<!-- https://www.dor.ms.gov/Documents/Computer%20Payroll%20Flowchart.pdf -->
<!-- Table C. -->
<record id="rule_parameter_us_ms_sit_deduction_2020" model="hr.rule.parameter.value">
<field name="parameter_value">{
'single': 2300.0,
'head_of_household': 3400.0,
'married_dual': 2300.0,
'married': 4600.0,
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ms_sit_deduction"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_ms_dor" model="res.partner">
<field name="name">US Mississippi - Department of Employment Security (Unemployment)</field>
</record>
<record id="res_partner_us_ms_dor_sit" model="res.partner">
<field name="name">US Mississippi - Mississippi Department of Revenue (Income Tax)</field>
</record>
<!-- Categories -->
<!-- Rules -->
<record id="hr_payroll_rule_er_us_ms_suta" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US MS Mississippi State Unemployment</field>
<field name="code">ER_US_MS_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_ms_suta_wage_base', rate='us_ms_suta_rate', state_code='MS')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_ms_suta_wage_base', rate='us_ms_suta_rate', state_code='MS')</field>
<field name="partner_id" ref="res_partner_us_ms_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_ee_us_ms_sit" model="hr.salary.rule">
<field name="sequence" eval="195"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_ee_us_sit"/>
<field name="name">EE: US MS Mississippi State Income Tax Withholding</field>
<field name="code">EE_US_MS_SIT</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = ms_mississippi_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = ms_mississippi_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="partner_id" ref="res_partner_us_ms_dor_sit"/>
<field name="appears_on_payslip" eval="True"/>
</record>
</odoo>

View File

@@ -0,0 +1,227 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base -->
<record id="rule_parameter_us_mt_suta_wage_base" model="hr.rule.parameter">
<field name="name">US MT Montana SUTA Wage Base</field>
<field name="code">us_mt_suta_wage_base</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_mt_suta_wage_base_2019" model="hr.rule.parameter.value">
<field name="parameter_value">33000.00</field>
<field name="rule_parameter_id" ref="rule_parameter_us_mt_suta_wage_base"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_mt_suta_wage_base_2020" model="hr.rule.parameter.value">
<field name="parameter_value">34100.00</field>
<field name="rule_parameter_id" ref="rule_parameter_us_mt_suta_wage_base"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Rate -->
<record id="rule_parameter_us_mt_suta_rate" model="hr.rule.parameter">
<field name="name">US MT Montana SUTA Rate (UI)</field>
<field name="code">us_mt_suta_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_mt_suta_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">1.18</field>
<field name="rule_parameter_id" ref="rule_parameter_us_mt_suta_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_mt_suta_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">1.18</field>
<field name="rule_parameter_id" ref="rule_parameter_us_mt_suta_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_mt_suta_aft_rate" model="hr.rule.parameter">
<field name="name">US MT Montana SUTA Administrative Fund Tax Rate</field>
<field name="code">us_mt_suta_aft_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_mt_suta_aft_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">0.13</field>
<field name="rule_parameter_id" ref="rule_parameter_us_mt_suta_aft_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_mt_suta_aft_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">0.13</field>
<field name="rule_parameter_id" ref="rule_parameter_us_mt_suta_aft_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_mt_sit_rate" model="hr.rule.parameter">
<field name="name">US MT Montana SIT Rate Table</field>
<field name="code">us_mt_sit_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_mt_sit_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">{
'weekly': (
( 135.00, 0.0, 1.80),
( 288.00, 2.0, 4.40),
( 2308.00, 9.0, 6.00),
( 'inf', 130.0, 6.60),
),
'bi-weekly': (
( 269.00, 0.0, 1.80),
( 577.00, 5.0, 4.40),
( 4615.00, 18.0, 6.00),
( 'inf', 261.0, 6.60),
),
'semi-monthly': (
( 292.00, 0.0, 1.80),
( 625.00, 5.0, 4.40),
( 5000.00, 20.0, 6.00),
( 'inf', 282.0, 6.60),
),
'monthly': (
( 583.00, 0.0, 1.80),
( 1250.00, 11.0, 4.40),
( 10000.00, 40.0, 6.00),
( 'inf', 565.0, 6.60),
),
'annually': (
( 7000.00, 0.0, 1.80),
( 15000.00, 126.0, 4.40),
( 120000.00, 478.0, 6.00),
( 'inf', 6778.0, 6.60),
),
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_mt_sit_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<!-- https://app.mt.gov/myrevenue/Endpoint/DownloadPdf?yearId=705 -->
<!-- Table Montana Withholding Tax Formula for Computerized Payroll Systems -->
<record id="rule_parameter_us_mt_sit_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">{
'weekly': (
( 135.00, 0.0, 1.80),
( 288.00, 2.0, 4.40),
( 2308.00, 9.0, 6.00),
( 'inf', 130.0, 6.60),
),
'bi-weekly': (
( 269.00, 0.0, 1.80),
( 577.00, 5.0, 4.40),
( 4615.00, 18.0, 6.00),
( 'inf', 261.0, 6.60),
),
'semi-monthly': (
( 292.00, 0.0, 1.80),
( 625.00, 5.0, 4.40),
( 5000.00, 20.0, 6.00),
( 'inf', 282.0, 6.60),
),
'monthly': (
( 583.00, 0.0, 1.80),
( 1250.00, 11.0, 4.40),
( 10000.00, 40.0, 6.00),
( 'inf', 565.0, 6.60),
),
'annually': (
( 7000.00, 0.0, 1.80),
( 15000.00, 126.0, 4.40),
( 120000.00, 478.0, 6.00),
( 'inf', 6778.0, 6.60),
),
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_mt_sit_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_mt_sit_exemption_rate" model="hr.rule.parameter">
<field name="name">US MT Montana SIT Exemption Rate Table</field>
<field name="code">us_mt_sit_exemption_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_mt_sit_exemption_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">{
'weekly': 37.0,
'bi-weekly': 73.0,
'semi-monthly': 79.0,
'monthly': 158.0,
'annually': 1900.0,
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_mt_sit_exemption_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<!-- https://app.mt.gov/myrevenue/Endpoint/DownloadPdf?yearId=705 -->
<!-- Table Montana Withholding Tax Formula for Computerized Payroll Systems -->
<record id="rule_parameter_us_mt_sit_exemption_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">{
'weekly': 37.0,
'bi-weekly': 73.0,
'semi-monthly': 79.0,
'monthly': 158.0,
'annually': 1900.0,
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_mt_sit_exemption_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_mt_dor" model="res.partner">
<field name="name">US Montana - Department of Labor &amp; Industries</field>
</record>
<record id="res_partner_us_mt_dor_sit" model="res.partner">
<field name="name">US Montana - Department of Revenue - Income Tax</field>
</record>
<!-- Categories -->
<!-- Rules -->
<record id="hr_payroll_rule_er_us_mt_suta" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US MT Montana State Unemployment (UI-5)</field>
<field name="code">ER_US_MT_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_mt_suta_wage_base', rate='us_mt_suta_rate', state_code='MT')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_mt_suta_wage_base', rate='us_mt_suta_rate', state_code='MT')</field>
<field name="partner_id" ref="res_partner_us_mt_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_er_us_mt_suta_aft" model="hr.salary.rule">
<field name="sequence" eval="451"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US MT Montana State Unemployment Administrative Fund Tax (AFT) (UI-5)</field>
<field name="code">ER_US_MT_SUTA_AFT</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_mt_suta_wage_base', rate='us_mt_suta_aft_rate', state_code='MT')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_mt_suta_wage_base', rate='us_mt_suta_aft_rate', state_code='MT')</field>
<field name="partner_id" ref="res_partner_us_mt_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_ee_us_mt_sit" model="hr.salary.rule">
<field name="sequence" eval="195"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_ee_us_sit"/>
<field name="name">EE: US MT Montana State Income Tax Withholding (MW-3)</field>
<field name="code">EE_US_MT_SIT</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = mt_montana_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = mt_montana_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="partner_id" ref="res_partner_us_mt_dor_sit"/>
<field name="appears_on_payslip" eval="True"/>
</record>
</odoo>

View File

@@ -0,0 +1,113 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base -->
<record id="rule_parameter_us_nc_suta_wage_base" model="hr.rule.parameter">
<field name="name">US NC North Carolina SUTA Wage Base</field>
<field name="code">us_nc_suta_wage_base</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_nc_suta_wage_base_2019" model="hr.rule.parameter.value">
<field name="parameter_value">24300.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_nc_suta_wage_base"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_nc_suta_wage_base_2020" model="hr.rule.parameter.value">
<field name="parameter_value">25200.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_nc_suta_wage_base"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Rate -->
<record id="rule_parameter_us_nc_suta_rate" model="hr.rule.parameter">
<field name="name">US NC North Carolina SUTA Rate</field>
<field name="code">us_nc_suta_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_nc_suta_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">1.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_nc_suta_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_nc_suta_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">1.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_nc_suta_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_nc_sit_allowance_rate" model="hr.rule.parameter">
<field name="name">US NC North Carolina Allowance Rate</field>
<field name="code">us_nc_sit_allowance_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<!-- https://files.nc.gov/ncdor/documents/files/NC-30_book_Web_1-16-19_v4_Final.pdf -->
<!-- Allowance Table Page 19. + SD For single or married + SD for Head of household (SD Page. 16-18)-->
<record id="rule_parameter_us_nc_sit_allowance_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">{
'weekly': {'allowance': 48.08, 'standard_deduction': 192.31, 'standard_deduction_hh': 288.46},
'bi-weekly': {'allowance': 96.15, 'standard_deduction': 384.62, 'standard_deduction_hh': 576.92},
'semi-monthly': {'allowance': 104.17, 'standard_deduction': 416.67, 'standard_deduction_hh': 625.00},
'monthly': {'allowance': 208.33, 'standard_deduction': 833.33, 'standard_deduction_hh': 1250.00},
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_nc_sit_allowance_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<!-- https://files.nc.gov/ncdor/documents/files/2020-NC-30_Final.pdf -->
<!-- Allowance Table Page 19. + SD For single or married + SD for Head of household (SD Page. 16-18)-->
<record id="rule_parameter_us_nc_sit_allowance_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">{
'weekly': {'allowance': 48.08, 'standard_deduction': 206.73, 'standard_deduction_hh': 310.10},
'bi-weekly': {'allowance': 96.15, 'standard_deduction': 413.46, 'standard_deduction_hh': 620.19},
'semi-monthly': {'allowance': 104.17, 'standard_deduction': 447.92, 'standard_deduction_hh': 671.88},
'monthly': {'allowance': 208.33, 'standard_deduction': 895.83, 'standard_deduction_hh': 1343.75},
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_nc_sit_allowance_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_nc_dor" model="res.partner">
<field name="name">US North Carolina - Department of Taxation - Unemployment Tax</field>
</record>
<record id="res_partner_us_nc_dor_sit" model="res.partner">
<field name="name">US North Carolina - Department of Taxation - Income Tax</field>
</record>
<!-- Categories -->
<!-- Rules -->
<record id="hr_payroll_rule_er_us_nc_suta" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US NC North Carolina State Unemployment</field>
<field name="code">ER_US_NC_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_nc_suta_wage_base', rate='us_nc_suta_rate', state_code='NC')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_nc_suta_wage_base', rate='us_nc_suta_rate', state_code='NC')</field>
<field name="partner_id" ref="res_partner_us_nc_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_ee_us_nc_sit" model="hr.salary.rule">
<field name="sequence" eval="195"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_ee_us_sit"/>
<field name="name">EE: US NC North Carolina State Income Tax Withholding</field>
<field name="code">EE_US_NC_SIT</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = nc_northcarolina_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = nc_northcarolina_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="partner_id" ref="res_partner_us_nc_dor_sit"/>
<field name="appears_on_payslip" eval="True"/>
</record>
</odoo>

View File

@@ -0,0 +1,280 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base -->
<record id="rule_parameter_us_nd_suta_wage_base" model="hr.rule.parameter">
<field name="name">US ND North Dakota SUTA Wage Base</field>
<field name="code">us_nd_suta_wage_base</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_nd_suta_wage_base_2020" model="hr.rule.parameter.value">
<field name="parameter_value">37900.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_nd_suta_wage_base"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Rate -->
<record id="rule_parameter_us_nd_suta_rate" model="hr.rule.parameter">
<field name="name">US ND North Dakota SUTA Rate</field>
<field name="code">us_nd_suta_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_nd_suta_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">1.02</field>
<field name="rule_parameter_id" ref="rule_parameter_us_nd_suta_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Table based on https://www.nd.gov/tax/data/upfiles/media/rates-and-instructions.pdf?20191208155535 -->
<record id="rule_parameter_us_nd_sit_tax_rate" model="hr.rule.parameter">
<field name="name">US ND North Dakota SIT Tax Rate</field>
<field name="code">us_nd_sit_tax_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_nd_sit_tax_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">{
'single': {
'weekly': (
( 119, 0.00, 0.00),
( 891, 0.00, 1.10),
( 1988, 8.49, 2.04),
( 4016, 30.87, 2.27),
( 8592, 76.91, 2.64),
('inf', 197.71, 2.90),
),
'bi-weekly': (
( 238, 0.00, 0.00),
( 1782, 0.00, 1.10),
( 3975, 16.98, 2.04),
( 8033, 61.72, 2.27),
( 17185, 153.84, 2.64),
( 'inf', 395.45, 2.90),
),
'semi-monthly': (
( 258, 0.00, 0.00),
( 1930, 0.00, 1.10),
( 4306, 18.39, 2.04),
( 8702, 66.86, 2.27),
( 18617, 166.65, 2.64),
( 'inf', 428.41, 2.90),
),
'monthly': (
( 517, 0.00, 0.00),
( 3860, 0.00, 1.10),
( 8613, 36.77, 2.04),
( 17404, 133.73, 2.27),
( 37233, 333.29, 2.64),
( 'inf', 856.78, 2.90),
),
'quarterly': (
( 1550, 0.00, 0.00),
( 11581, 0.00, 1.10),
( 25838, 110.34, 2.04),
( 52213, 401.18, 2.27),
( 111700, 999.90, 2.64),
( 'inf', 2570.35, 2.90),
),
'semi-annual': (
( 3100, 0.00, 0.00),
( 23163, 0.00, 1.10),
( 51675, 220.69, 2.04),
( 104425, 802.34, 2.27),
( 223400, 1999.76, 2.64),
( 'inf', 5140.70, 2.90),
),
'annual': (
( 6200, 0.00, 0.00),
( 46325, 0.00, 1.10),
( 103350, 441.38, 2.04),
( 208850, 1604.69, 2.27),
( 446800, 3999.54, 2.64),
( 'inf', 10281.42, 2.90),
),
},
'married': {
'weekly': (
( 238, 0.00, 0.00),
( 883, 0.00, 1.10),
( 1796, 7.10, 2.04),
( 2611, 25.72, 2.27),
( 4475, 44.22, 2.64),
('inf', 93.43, 2.90),
),
'bi-weekly': (
( 477, 0.00, 0.00),
( 1766, 0.00, 1.10),
( 3591, 14.18, 2.04),
( 5221, 51.41, 2.27),
( 8950, 88.41, 2.64),
( 'inf', 186.86, 2.90),
),
'semi-monthly': (
( 517, 0.00, 0.00),
( 1914, 0.00, 1.10),
( 3891, 15.37, 2.04),
( 5656, 55.70, 2.27),
( 9696, 95.76, 2.64),
( 'inf', 202.42, 2.90),
),
'monthly': (
( 1033, 0.00, 0.00),
( 3827, 0.00, 1.10),
( 7781, 30.73, 2.04),
( 11313, 111.40, 2.27),
( 19392, 191.57, 2.64),
( 'inf', 404.86, 2.90),
),
'quarterly': (
( 3100, 0.00, 0.00),
( 11481, 0.00, 1.10),
( 23344, 92.19, 2.04),
( 33938, 334.20, 2.27),
( 58175, 574.68, 2.64),
( 'inf', 1214.54, 2.90),
),
'semi-annual': (
( 6200, 0.00, 0.00),
( 22963, 0.00, 1.10),
( 46688, 184.39, 2.04),
( 67875, 668.38, 2.27),
( 116350, 1149.33, 2.64),
( 'inf', 2429.07, 2.90),
),
'annual': (
( 12400, 0.00, 0.00),
( 45925, 0.00, 1.10),
( 93375, 368.78, 2.04),
( 135750, 1336.76, 2.27),
( 232700, 2298.67, 2.64),
( 'inf', 4858.15, 2.90),
),
},
'head_household':{
'weekly': (
( 119, 0.00, 0.00),
( 891, 0.00, 1.10),
( 1988, 8.49, 2.04),
( 4016, 30.87, 2.27),
( 8592, 76.91, 2.64),
('inf', 197.71, 2.90),
),
'bi-weekly': (
( 238, 0.00, 0.00),
( 1782, 0.00, 1.10),
( 3975, 16.98, 2.04),
( 8033, 61.72, 2.27),
( 17185, 153.84, 2.64),
( 'inf', 395.45, 2.90),
),
'semi-monthly': (
( 258, 0.00, 0.00),
( 1930, 0.00, 1.10),
( 4306, 18.39, 2.04),
( 8702, 66.86, 2.27),
( 18617, 166.65, 2.64),
( 'inf', 428.41, 2.90),
),
'monthly': (
( 517, 0.00, 0.00),
( 3860, 0.00, 1.10),
( 8613, 36.77, 2.04),
( 17404, 133.73, 2.27),
( 37233, 333.29, 2.64),
( 'inf', 856.78, 2.90),
),
'quarterly': (
( 1550, 0.00, 0.00),
( 11581, 0.00, 1.10),
( 25838, 110.34, 2.04),
( 52213, 401.18, 2.27),
( 111700, 999.90, 2.64),
( 'inf', 2570.35, 2.90),
),
'semi-annual': (
( 3100, 0.00, 0.00),
( 23163, 0.00, 1.10),
( 51675, 220.69, 2.04),
( 104425, 802.34, 2.27),
( 223400, 1999.76, 2.64),
( 'inf', 5140.70, 2.90),
),
'annual': (
( 6200, 0.00, 0.00),
( 46325, 0.00, 1.10),
( 103350, 441.38, 2.04),
( 208850, 1604.69, 2.27),
( 446800, 3999.54, 2.64),
( 'inf', 10281.42, 2.90),
),
},
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_nd_sit_tax_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_nd_sit_allowances_rate" model="hr.rule.parameter">
<field name="name">US ND North Dakota Allowances Rate</field>
<field name="code">us_nd_sit_allowances_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_nd_sit_allowances_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">{
'weekly' : 83.00,
'bi-weekly' : 165.00,
'semi-monthly': 179.00,
'monthly' : 358.00,
'quarterly' : 1075.00,
'semi-annual': 2150.00,
'annually': 4300.00,
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_nd_sit_allowances_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_nd_dor" model="res.partner">
<field name="name">US North Dakota - Office of State Tax Commissioner - Unemployment Tax</field>
</record>
<record id="res_partner_us_nd_dor_sit" model="res.partner">
<field name="name">US North Dakota - Taxpayer Access Point - Income Tax</field>
</record>
<!-- Categories -->
<!-- Rules -->
<record id="hr_payroll_rule_er_us_nd_suta" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US ND North Dakota State Unemployment</field>
<field name="code">ER_US_ND_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_nd_suta_wage_base', rate='us_nd_suta_rate', state_code='ND')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_nd_suta_wage_base', rate='us_nd_suta_rate', state_code='ND')</field>
<field name="partner_id" ref="res_partner_us_nd_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_ee_us_nd_sit" model="hr.salary.rule">
<field name="sequence" eval="195"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_ee_us_sit"/>
<field name="name">EE: US ND North Dakota State Income Tax Withholding</field>
<field name="code">EE_US_ND_SIT</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = nd_north_dakota_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = nd_north_dakota_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="partner_id" ref="res_partner_us_nd_dor_sit"/>
<field name="appears_on_payslip" eval="True"/>
</record>
</odoo>

View File

@@ -0,0 +1,237 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base -->
<record id="rule_parameter_us_ne_suta_wage_base" model="hr.rule.parameter">
<field name="name">US NE Nebraska SUTA Wage Base</field>
<field name="code">us_ne_suta_wage_base</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ne_suta_wage_base_2020" model="hr.rule.parameter.value">
<field name="parameter_value">9000.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ne_suta_wage_base"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Rate -->
<record id="rule_parameter_us_ne_suta_rate" model="hr.rule.parameter">
<field name="name">US NE Nebraska SUTA Rate</field>
<field name="code">us_ne_suta_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ne_suta_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">1.25</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ne_suta_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Table based on Percentage method from https://revenue.nebraska.gov/sites/revenue.nebraska.gov/files/doc/business/2017cir-en_whole.pdf -->
<record id="rule_parameter_us_ne_sit_tax_rate" model="hr.rule.parameter">
<field name="name">US NE Nebraska SIT Tax Rate</field>
<field name="code">us_ne_sit_tax_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ne_sit_tax_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">{
'single': {
'weekly': (
( 57, 0.00, 0.00),
( 105, 0.00, 2.26),
( 342, 1.08, 3.22),
( 496, 8.71, 4.91),
( 629, 16.27, 6.20),
( 1182, 24.52, 6.59),
('inf', 60.96, 6.95),
),
'bi-weekly': (
( 114, 0.00, 0.00),
( 211, 0.00, 2.26),
( 684, 2.19, 3.22),
( 992, 17.42, 4.91),
( 1259, 32.54, 6.20),
( 2364, 49.09, 6.59),
('inf', 121.91, 6.95),
),
'semi-monthly': (
( 124, 0.00, 0.00),
( 228, 0.00, 2.26),
( 741, 2.35, 3.22),
( 1074, 18.87, 4.91),
( 1364, 35.22, 6.20),
( 2561, 53.20, 6.59),
('inf', 132.08, 6.95),
),
'monthly': (
( 248, 0.00, 0.00),
( 457, 0.00, 2.26),
( 1483, 4.72, 3.22),
( 2148, 37.76, 4.91),
( 2728, 70.41, 6.20),
( 5123, 106.37, 6.59),
('inf', 264.20, 6.95),
),
'quarterly': (
( 744, 0.00, 0.00),
( 1370, 0.00, 2.26),
( 4448, 14.15, 3.22),
( 6445, 113.26, 4.91),
( 8183, 211.31, 6.20),
( 15368, 319.07, 6.59),
( 'inf', 792.56, 6.95),
),
'semi-annual': (
( 1488, 0.00, 0.00),
( 2740, 0.00, 2.26),
( 8895, 28.30, 3.22),
( 12890, 226.49, 4.91),
( 16365, 422.64, 6.20),
( 30735, 638.09, 6.59),
( 'inf', 1585.07, 6.95),
),
'annually': (
( 2975, 0.00, 0.00),
( 5480, 0.00, 2.26),
( 17790, 56.61, 3.22),
( 25780, 452.99, 4.91),
( 32730, 845.30, 6.20),
( 61470, 1276.20, 6.59),
( 'inf', 3170.17, 6.95),
),
},
'married': {
'weekly': (
( 137, 0.00, 0.00),
( 204, 0.00, 2.26),
( 508, 1.51, 3.22),
( 790, 11.30, 4.91),
( 981, 25.15, 6.20),
( 1300, 36.99, 6.59),
('inf', 58.01, 6.95),
),
'bi-weekly': (
( 273, 0.00, 0.00),
( 408, 0.00, 2.26),
( 1016, 3.05, 3.22),
( 1581, 22.63, 4.91),
( 1961, 50.37, 6.20),
( 2601, 73.93, 6.59),
('inf', 116.11, 6.95),
),
'semi-monthly': (
( 296, 0.00, 0.00),
( 442, 0.00, 2.26),
( 1101, 3.30, 3.22),
( 1713, 24.52, 4.91),
( 2125, 54.57, 6.20),
( 2818, 80.11, 6.59),
('inf', 125.78, 6.95),
),
'monthly': (
( 592, 0.00, 0.00),
( 884, 0.00, 2.26),
( 2202, 6.60, 3.22),
( 3425, 49.04, 4.91),
( 4249, 109.09, 6.20),
( 5635, 160.18, 6.59),
('inf', 251.52, 6.95),
),
'quarterly': (
( 1775, 0.00, 0.00),
( 2653, 0.00, 2.26),
( 6605, 19.84, 3.22),
( 10275, 147.09, 4.91),
( 12748, 327.29, 6.20),
( 16905, 480.62, 6.59),
( 'inf', 754.57, 6.95),
),
'semi-annual': (
( 3550, 0.00, 0.00),
( 5305, 0.00, 2.26),
( 13210, 39.66, 3.22),
( 20550, 294.20, 4.91),
( 25495, 654.59, 6.20),
( 33810, 961.18, 6.59),
( 'inf', 1509.14, 6.95),
),
'annually': (
( 7100, 0.00, 0.00),
( 10610, 0.00, 2.26),
( 26420, 79.33, 3.22),
( 41100, 588.41, 4.91),
( 50990, 1309.20, 6.20),
( 67620, 1992.38, 6.59),
( 'inf', 3018.30, 6.95),
),
},
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ne_sit_tax_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_ne_sit_allowances_rate" model="hr.rule.parameter">
<field name="name">US NE Nebraska Allowances Rate</field>
<field name="code">us_ne_sit_allowances_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ne_sit_allowances_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">{
'weekly' : 37.69,
'bi-weekly' : 75.38,
'semi-monthly': 81.67,
'monthly' : 163.33,
'quarterly' : 490.00,
'semi-annual': 980.00,
'annually': 1960.00,
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ne_sit_allowances_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_ne_dor" model="res.partner">
<field name="name">US Nebraska - Nebraska Department of Labor - Unemployment Tax</field>
</record>
<record id="res_partner_us_ne_dor_sit" model="res.partner">
<field name="name">US Nebraska - Nebraska Department of Revenue - Income Tax</field>
</record>
<!-- Categories -->
<!-- Rules -->
<record id="hr_payroll_rule_er_us_ne_suta" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US NE Nebraska State Unemployment</field>
<field name="code">ER_US_NE_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_ne_suta_wage_base', rate='us_ne_suta_rate', state_code='NE')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_ne_suta_wage_base', rate='us_ne_suta_rate', state_code='NE')</field>
<field name="partner_id" ref="res_partner_us_ne_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_ee_us_ne_sit" model="hr.salary.rule">
<field name="sequence" eval="195"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_ee_us_sit"/>
<field name="name">EE: US NE Nebraska State Income Tax Withholding</field>
<field name="code">EE_US_NE_SIT</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = ne_nebraska_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = ne_nebraska_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="partner_id" ref="res_partner_us_ne_dor_sit"/>
<field name="appears_on_payslip" eval="True"/>
</record>
</odoo>

View File

@@ -0,0 +1,51 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base -->
<record id="rule_parameter_us_nh_suta_wage_base" model="hr.rule.parameter">
<field name="name">US NH New Hampshire SUTA Wage Base</field>
<field name="code">us_nh_suta_wage_base</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_nh_suta_wage_base_2020" model="hr.rule.parameter.value">
<field name="parameter_value">14000.00</field>
<field name="rule_parameter_id" ref="rule_parameter_us_nh_suta_wage_base"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Rate -->
<record id="rule_parameter_us_nh_suta_rate" model="hr.rule.parameter">
<field name="name">US NH New Hampshire SUTA Rate</field>
<field name="code">us_nh_suta_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_nh_suta_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">1.2</field>
<field name="rule_parameter_id" ref="rule_parameter_us_nh_suta_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_nh_dor" model="res.partner">
<field name="name">US New Hampshire - Department of Employment Security - Unemployment Tax</field>
</record>
<!-- Rules -->
<record id="hr_payroll_rule_er_us_nh_suta" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US NH New Hampshire State Unemployment</field>
<field name="code">ER_US_NH_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_nh_suta_wage_base', rate='us_nh_suta_rate', state_code='NH')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_nh_suta_wage_base', rate='us_nh_suta_rate', state_code='NH')</field>
<field name="partner_id" ref="res_partner_us_nh_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
</odoo>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,303 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base -->
<record id="rule_parameter_us_nm_suta_wage_base" model="hr.rule.parameter">
<field name="name">US NM New Mexico SUTA Wage Base</field>
<field name="code">us_nm_suta_wage_base</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_nm_suta_wage_base_2020" model="hr.rule.parameter.value">
<field name="parameter_value">25800.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_nm_suta_wage_base"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Rate -->
<record id="rule_parameter_us_nm_suta_rate" model="hr.rule.parameter">
<field name="name">US NM New Mexico SUTA Rate</field>
<field name="code">us_nm_suta_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_nm_suta_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">1.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_nm_suta_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_nm_sit_tax_rate" model="hr.rule.parameter">
<field name="name">US NM New Mexico SIT Tax Rate</field>
<field name="code">us_nm_sit_tax_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<!-- Table based on Percentage method from https://s3.amazonaws.com/realFile34821a95-73ca-43e7-b06d-fad20f5183fd/a9bf1098-533b-4a3d-806a-4bf6336af6e4?response-content-disposition=filename%3D%22FYI-104+-+New+Mexico+Withholding+Tax+-+Effective+January+1%2C+2020.pdf%22&response-content-type=application%2Fpdf&AWSAccessKeyId=AKIAJBI25DHBYGD7I7TA&Signature=OK0i%2F7YIRTdSEQHWAC2UY3ukZVI%3D&Expires=1597878297 -->
<record id="rule_parameter_us_nm_sit_tax_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">{
'single': {
'weekly': (
( 119, 0.00, 0.0),
( 225, 0.00, 1.7),
( 331, 1.80, 3.2),
( 427, 5.18, 4.7),
( 619, 9.70, 4.9),
( 927, 19.13, 4.9),
( 1369, 34.20, 4.9),
('inf', 55.88, 4.9),
),
'bi-weekly': (
( 238, 0.00, 0.0),
( 450, 0.00, 1.7),
( 662, 3.60, 3.2),
( 854, 10.37, 4.7),
( 1238, 19.40, 4.9),
( 1854, 38.25, 4.9),
( 2738, 68.40, 4.9),
('inf', 111.75, 4.9),
),
'semi-monthly': (
( 258, 0.00, 0.0),
( 488, 0.00, 1.7),
( 717, 3.90, 3.2),
( 925, 11.23, 4.7),
( 1342, 21.02, 4.9),
( 2008, 41.44, 4.9),
( 2967, 74.10, 4.9),
('inf', 121.06, 4.9),
),
'monthly': (
( 517, 0.00, 0.0),
( 975, 0.00, 1.7),
( 1433, 7.79, 3.2),
( 1850, 22.46, 4.7),
( 2683, 42.04, 4.9),
( 4017, 82.88, 4.9),
( 5933, 148.21, 4.9),
('inf', 242.13, 4.9),
),
'quarterly': (
( 1550, 0.00, 0.0),
( 2925, 0.00, 1.7),
( 4300, 23.38, 3.2),
( 5550, 67.38, 4.7),
( 8050, 126.13, 4.9),
( 12050, 248.63, 4.9),
( 17800, 444.63, 4.9),
( 'inf', 726.38, 4.9),
),
'semi-annual': (
( 3100, 0.00, 0.0),
( 5850, 0.00, 1.7),
( 8600, 46.75, 3.2),
(11100, 134.75, 4.7),
(16100, 252.25, 4.9),
(24100, 497.25, 4.9),
(35600, 889.25, 4.9),
('inf', 1452.75, 4.9),
),
'annually': (
( 6200, 0.00, 0.0),
(11700, 0.00, 1.7),
(17200, 93.50, 3.2),
(22200, 269.50, 4.7),
(32200, 504.50, 4.9),
(48200, 994.50, 4.9),
(71200, 1778.50, 4.9),
('inf', 2905.50, 4.9),
),
},
'married': {
'weekly': (
( 238, 0.00, 0.0),
( 392, 0.00, 1.7),
( 546, 2.62, 3.2),
( 700, 7.54, 4.7),
( 1008, 14.77, 4.9),
( 1469, 29.85, 4.9),
( 2162, 52.46, 4.9),
('inf', 86.38, 4.9),
),
'bi-weekly': (
( 477, 0.00, 0.0),
( 785, 0.00, 1.7),
( 1092, 5.23, 3.2),
( 1400, 15.08, 4.7),
(2015, 29.54, 4.9),
( 2938, 59.69, 4.9),
( 4323, 104.92, 4.9),
('inf', 172.77, 4.9),
),
'semi-monthly': (
( 517, 0.00, 0.0),
( 850, 0.00, 1.7),
( 1183, 5.67, 3.2),
( 1517, 16.33, 4.7),
( 2183, 32.00, 4.9),
( 3183, 64.67, 4.9),
( 4683, 113.67, 4.9),
('inf', 187.17, 4.9),
),
'monthly': (
( 1033, 0.00, 0.0),
( 1700, 0.00, 1.7),
( 2367, 11.33, 3.2),
( 3033, 32.67, 4.7),
( 4367, 64.00, 4.9),
( 6367, 129.33, 4.9),
( 9367, 227.33, 4.9),
('inf', 374.33, 4.9),
),
'quarterly': (
( 3100, 0.00, 0.0),
( 5100, 0.00, 1.7),
( 7100, 34.00, 3.2),
( 9100, 98.00, 4.7),
(13100, 192.00, 4.9),
(19100, 388.00, 4.9),
(28100, 682.00, 4.9),
('inf', 1123.00, 4.9),
),
'semi-annual': (
( 6200, 0.00, 0.0),
(10200, 0.00, 1.7),
(14200, 68.00, 3.2),
(18200, 196.00, 4.7),
(26200, 384.00, 4.9),
(38200, 776.00, 4.9),
(56200, 1364.00, 4.9),
('inf', 2246.00, 4.9),
),
'annually': (
( 12400, 0.00, 0.0),
( 20400, 0.00, 1.7),
( 28400, 136.00, 3.2),
( 36400, 392.00, 4.7),
( 52400, 768.00, 4.9),
( 76400, 1552.00, 4.9),
(112400, 2728.00, 4.9),
( 'inf', 4492.00, 4.9),
),
},
'married_as_single': {
'weekly': (
( 179, 0.00, 0.0),
( 333, 0.00, 1.7),
( 487, 2.62, 3.2),
( 641, 7.54, 4.7),
( 949, 14.77, 4.9),
( 1410, 29.85, 4.9),
( 2102, 52.46, 4.9),
('inf', 86.38, 4.9),
),
'bi-weekly': (
( 359, 0.00, 0.0),
( 666, 0.00, 1.7),
( 974, 5.23, 3.2),
( 1282, 15.08, 4.7),
( 1897, 29.54, 4.9),
( 2820, 59.69, 4.9),
( 4205, 104.92, 4.9),
('inf', 172.77, 4.9),
),
'semi-monthly': (
( 389, 0.00, 0.0),
( 722, 0.00, 1.7),
( 1055, 5.67, 3.2),
( 1389, 16.33, 4.7),
( 2055, 32.00, 4.9),
( 3055, 64.67, 4.9),
( 4555, 113.67, 4.9),
('inf', 187.17, 4.9),
),
'monthly': (
( 777, 0.00, 0.0),
( 1444, 0.00, 1.7),
( 2110, 11.33, 3.2),
( 2777, 32.67, 4.7),
( 4110, 64.00, 4.9),
( 6110, 129.33, 4.9),
( 9110, 227.33, 4.9),
('inf', 374.33, 4.9),
),
'quarterly': (
( 2331, 0.00, 0.0),
( 4331, 0.00, 1.7),
( 6331, 34.00, 3.2),
( 8331, 98.00, 4.7),
( 12331, 192.00, 4.9),
( 18331, 388.00, 4.9),
( 27331, 682.00, 4.9),
( 'inf', 1123.00, 4.9),
),
'semi-annual': (
( 4663, 0.00, 0.0),
( 8663, 0.00, 1.7),
( 12663, 68.00, 3.2),
( 16663, 196.00, 4.7),
( 24663, 384.00, 4.9),
( 36663, 776.00, 4.9),
( 54663, 1364.00, 4.9),
( 'inf', 2246.00, 4.9),
),
'annually': (
( 9325, 0.00, 0.0),
( 17325, 0.00, 1.7),
( 25325, 136.00, 3.2),
( 33325, 392.00, 4.7),
( 49325, 768.00, 4.9),
( 73325, 1552.00, 4.9),
(109325, 2728.00, 4.9),
( 'inf', 4492.00, 4.9),
),
}
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_nm_sit_tax_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_nm_dor" model="res.partner">
<field name="name">US New Mexico - Department of Workforce Solutions - Unemployment Tax</field>
</record>
<record id="res_partner_us_nm_dor_sit" model="res.partner">
<field name="name">US New Mexico - Department of Taxation and Revenue - Income Tax</field>
</record>
<!-- Categories -->
<!-- Rules -->
<record id="hr_payroll_rule_er_us_nm_suta" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US NM New Mexico State Unemployment</field>
<field name="code">ER_US_NM_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_nm_suta_wage_base', rate='us_nm_suta_rate', state_code='NM')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_nm_suta_wage_base', rate='us_nm_suta_rate', state_code='NM')</field>
<field name="partner_id" ref="res_partner_us_nm_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_ee_us_nm_sit" model="hr.salary.rule">
<field name="sequence" eval="195"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_ee_us_sit"/>
<field name="name">EE: US NM New Mexico State Income Tax Withholding</field>
<field name="code">EE_US_NM_SIT</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = nm_new_mexico_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = nm_new_mexico_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="partner_id" ref="res_partner_us_nm_dor_sit"/>
<field name="appears_on_payslip" eval="True"/>
</record>
</odoo>

View File

@@ -0,0 +1,53 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base -->
<record id="rule_parameter_us_nv_suta_wage_base" model="hr.rule.parameter">
<field name="name">US NV Nevada SUTA Wage Base</field>
<field name="code">us_nv_suta_wage_base</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_nv_suta_wage_base_2020" model="hr.rule.parameter.value">
<field name="parameter_value">32500.00</field>
<field name="rule_parameter_id" ref="rule_parameter_us_nv_suta_wage_base"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Rate -->
<record id="rule_parameter_us_nv_suta_rate" model="hr.rule.parameter">
<field name="name">US NV Nevada SUTA Rate</field>
<field name="code">us_nv_suta_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_nv_suta_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">2.95</field>
<field name="rule_parameter_id" ref="rule_parameter_us_nv_suta_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_nv_dor" model="res.partner">
<field name="name">US Nevada - Department of Employment, Training, and Rehabilitation, Employment Security Division - Unemployment Tax</field>
</record>
<!-- Categories -->
<!-- Rules -->
<record id="hr_payroll_rule_er_us_nv_suta" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US NV Nevada State Unemployment (RT-6)</field>
<field name="code">ER_US_NV_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_nv_suta_wage_base', rate='us_nv_suta_rate', state_code='NV')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_nv_suta_wage_base', rate='us_nv_suta_rate', state_code='NV')</field>
<field name="partner_id" ref="res_partner_us_nv_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
</odoo>

View File

@@ -0,0 +1,429 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base -->
<record id="rule_parameter_us_ny_suta_wage_base" model="hr.rule.parameter">
<field name="name">US NY New York SUTA Wage Base</field>
<field name="code">us_ny_suta_wage_base</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ny_suta_wage_base_2019" model="hr.rule.parameter.value">
<field name="parameter_value">11400.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ny_suta_wage_base"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_ny_suta_wage_base_2020" model="hr.rule.parameter.value">
<field name="parameter_value">11600.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ny_suta_wage_base"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Rate -->
<record id="rule_parameter_us_ny_suta_rate" model="hr.rule.parameter">
<field name="name">US NY New York SUTA Rate</field>
<field name="code">us_ny_suta_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ny_suta_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">2.5</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ny_suta_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_ny_suta_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">2.5</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ny_suta_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_ny_suta_rsf_rate" model="hr.rule.parameter">
<field name="name">US NY New York SUTA RSF Rate</field>
<field name="code">us_ny_suta_rsf_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ny_suta_rsf_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">0.075</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ny_suta_rsf_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_ny_suta_rsf_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">0.075</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ny_suta_rsf_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_ny_suta_mctmt_rate" model="hr.rule.parameter">
<field name="name">US NY New York SUTA MCTMT Rate</field>
<field name="code">us_ny_suta_mctmt_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ny_suta_mctmt_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">0.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ny_suta_mctmt_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_ny_suta_mctmt_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">0.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ny_suta_mctmt_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_ny_sit_tax_rate" model="hr.rule.parameter">
<field name="name">US NY New York SIT Tax Rate</field>
<field name="code">us_ny_sit_tax_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ny_sit_tax_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">{
'single': {
'weekly': ((163, 0.0400, 0.0), (225, 0.0450, 6.54), (267, 0.0525, 9.31), (412, 0.0590, 11.54), (1551, 0.0633, 20.04), (1862, 0.0657, 92.17), (2070, 0.0758, 112.58), (3032, 0.0808, 128.38), (4142, 0.0707, 206.08), (5104, 0.0856, 284.60), (20722, 0.0735, 366.90), (21684, 0.5208, 1514.85), ('inf', 0.0962, 2015.62)),
'bi-weekly': ((327, 0.0400, 0.0), (450, 0.0450, 13.08), (535, 0.0525, 18.62), (823, 0.0590, 23.08), (3102, 0.0633, 40.08), (3723, 0.0657, 184.35), (4140, 0.0758, 225.15), (6063, 0.0808, 256.77), (8285, 0.0707, 412.15), (10208, 0.0856, 569.19), (41444, 0.0735, 733.81), (43367, 0.5208, 3029.69), ('inf', 0.0962, 4021.23)),
'semi-monthly': ((354, 0.0400, 0.0), (488, 0.0450, 14.17), (579, 0.0525, 20.17), (892, 0.0590, 25.00), (3360, 0.0633, 43.42), (4033, 0.0657, 199.71), (4485, 0.0758, 243.92), (6569, 0.0808, 278.17), (8975, 0.0707, 446.50), (11058, 0.0856, 616.63), (44898, 0.0735, 794.96), (46981, 0.5208, 3282.17), ('inf', 0.0962, 4367.17)),
'monthly': ((708, 0.0400, 0.0), (975, 0.0450, 28.33), (1158, 0.0525, 40.33), (1783, 0.0590, 50.00), (6721, 0.0633, 86.83), (8067, 0.0657, 399.42), (8971, 0.0758, 487.83), (13138, 0.0808, 556.33), (17950, 0.0707, 893.00), (22117, 0.0856, 1233.25), (89796, 0.0735, 1589.92), (93963, 0.5208, 6564.33), ('inf', 0.0962, 8734.33)),
'annually': ((8500, 0.0400, 0.0), (11700, 0.0450, 340.00), (13900, 0.0525, 484.00), (21400, 0.0590, 600.00), (80650, 0.0633, 1042.00), (96800, 0.0657, 4793.00), (107650, 0.0758, 5854.00), (157650, 0.0808, 6676.00), (215400, 0.0707, 10716.00), (265400, 0.0856, 14799.00), (1077550, 0.0735, 19079.00), (1127550, 0.5208, 78772.00), ('inf', 0.0962, 104812.00)),
},
'married': {
'weekly': ((163, 0.0400, 0.0), (225, 0.0450, 6.54), (267, 0.0525, 9.31), (412, 0.0590, 11.54), (1551, 0.0633, 20.04), (1862, 0.0657, 92.17), (2070, 0.0783, 112.58), (3032, 0.0833, 128.90), (4068, 0.0785, 209.00), (6215, 0.0707, 290.37), (7177, 0.0916, 442.17), (20722, 0.0735, 530.25), (41449, 0.0765, 1525.83), (42411, 0.9454, 3111.42), ('inf', 0.0962, 4020.46)),
'bi-weekly': ((327, 0.0400, 0.0), (450, 0.0450, 13.08), (535, 0.0525, 18.62), (823, 0.0590, 23.08), (3102, 0.0633, 40.08), (3723, 0.0657, 184.35), (4140, 0.0783, 225.15), (6063, 0.0833, 257.81), (8137, 0.0785, 418.00), (12431, 0.0707, 580.73), (14354, 0.0916, 884.35), (41444, 0.0735, 1060.50), (82898, 0.0765, 3051.65), (84821, 0.9454, 6222.85), ('inf', 0.0962, 8040.92)),
'semi-monthly': ((354, 0.0400, 0.0), (488, 0.0450, 14.17), (579, 0.0525, 20.17), (892, 0.0590, 25.00), (3360, 0.0633, 43.42), (4033, 0.0657, 199.71), (4485, 0.0783, 243.92), (6569, 0.0833, 279.29), (8815, 0.0785, 452.83), (13476, 0.0707, 629.13), (15550, 0.0916, 958.04), (44898, 0.0735, 1148.88), (89806, 0.0765, 3305.96), (91890, 0.9454, 6741.42), ('inf', 0.0962, 8711.00)),
'monthly': ((708, 0.0400, 0.0), (975, 0.0450, 28.33), (1158, 0.0525, 40.33), (1783, 0.0590, 50.00), (6721, 0.0633, 86.83), (8067, 0.0657, 399.42), (8971, 0.0783, 487.83), (13138, 0.0833, 558.58), (17629, 0.0785, 905.67), (26933, 0.0707, 1258.25), (31100, 0.0916, 1916.08), (89796, 0.0735, 2297.75), (179613, 0.0765, 6611.92), (183779, 0.9454, 13482.83), ('inf', 0.0962, 17422.00)),
'annually': ((8500, 0.0400, 0.0), (11700, 0.0450, 340.00), (13900, 0.0525, 484.00), (21400, 0.0590, 600.00), (80650, 0.0633, 1042.00), (96800, 0.0657, 4793.00), (107650, 0.0783, 5854.00), (157650, 0.0833, 6703.00), (211550, 0.0785, 10868.00), (323200, 0.0707, 15099.00), (373200, 0.0916, 22993.00), (1077550, 0.0735, 27573.00), (2155350, 0.0765, 79343.00), (2205350, 0.9454, 161794.00), ('inf', 0.0962, 209064.00)),
}
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ny_sit_tax_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_ny_sit_tax_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">{
'single': {
'weekly': (
( 163, 0.0400, 0.00),
( 225, 0.0450, 6.54),
( 267, 0.0525, 9.31),
( 412, 0.0590, 11.54),
( 1551, 0.0609, 20.04),
( 1862, 0.0641, 89.42),
( 2070, 0.0745, 109.35),
( 3032, 0.0795, 124.88),
( 4142, 0.0691, 201.33),
( 5104, 0.0925, 278.06),
(20722, 0.0735, 367.00),
(21684, 0.5208, 1514.94),
('inf', 0.0962, 2015.71),
),
'bi-weekly': (
( 327, 0.0400, 0.00),
( 450, 0.0450, 13.08),
( 535, 0.0525, 18.62),
( 823, 0.0590, 23.08),
( 3102, 0.0609, 40.08),
( 3723, 0.0641, 178.85),
( 4140, 0.0745, 218.69),
( 6063, 0.0795, 249.77),
( 8285, 0.0691, 402.65),
(10208, 0.0925, 556.12),
(41444, 0.0735, 734.00),
(43367, 0.5208, 3029.88),
('inf', 0.0962, 4031.42),
),
'semi-monthly': (
( 354, 0.0400, 0.00),
( 488, 0.0450, 14.17),
( 579, 0.0525, 20.17),
( 892, 0.0590, 25.00),
( 3360, 0.0609, 43.42),
( 4033, 0.0641, 193.75),
( 4485, 0.0745, 236.92),
( 6569, 0.0795, 270.58),
( 8975, 0.0691, 436.21),
(11058, 0.0925, 602.46),
(44898, 0.0735, 795.17),
(46981, 0.5208, 3282.38),
('inf', 0.0962, 4367.38),
),
'monthly': (
( 708, 0.0400, 0.00),
( 975, 0.0450, 28.33),
( 1158, 0.0525, 40.33),
( 1783, 0.0590, 50.00),
( 6721, 0.0609, 86.83),
( 8067, 0.0641, 387.50),
( 8971, 0.0745, 473.83),
(13138, 0.0795, 541.17),
(17950, 0.0691, 872.42),
(22117, 0.0925, 1204.92),
(89796, 0.0735, 1590.33),
(93963, 0.5208, 6564.75),
('inf', 0.0962, 8734.75),
),
'annually': (
( 8500, 0.0400, 0.00),
( 11700, 0.0450, 340.00),
( 13900, 0.0525, 484.00),
( 21400, 0.0590, 600.00),
( 80650, 0.0609, 1042.00),
( 96800, 0.0641, 4650.00),
( 107650, 0.0745, 5686.00),
( 157650, 0.0795, 6494.00),
( 215400, 0.0691, 10469.00),
( 265400, 0.0925, 14459.00),
(1077550, 0.0735, 19084.00),
(1127550, 0.5208, 78777.00),
( 'inf', 0.0962, 104817.00),
),
},
'married': {
'weekly': (
( 163, 0.0400, 0.00),
( 225, 0.0450, 6.54),
( 267, 0.0525, 9.31),
( 412, 0.0590, 11.54),
( 1551, 0.0609, 20.04),
( 1862, 0.0641, 89.42),
( 2070, 0.0746, 109.35),
( 3032, 0.0796, 124.90),
( 4068, 0.0794, 201.44),
( 6215, 0.0691, 283.75),
( 7177, 0.1019, 432.12),
(20722, 0.0735, 530.10),
(41449, 0.0765, 1525.65),
(42411, 0.9454, 3111.27),
('inf', 0.0962, 4020.31),
),
'bi-weekly': (
( 327, 0.0400, 0.00),
( 450, 0.0450, 13.08),
( 535, 0.0525, 18.62),
( 823, 0.0590, 23.08),
( 3102, 0.0609, 40.08),
( 3723, 0.0641, 178.85),
( 4140, 0.0746, 218.69),
( 6063, 0.0796, 249.81),
( 8137, 0.0794, 402.88),
(12431, 0.0691, 567.50),
(14354, 0.1019, 864.23),
(41444, 0.0735, 1060.19),
(82898, 0.0765, 3051.31),
(84821, 0.9454, 6222.54),
('inf', 0.0962, 8040.62),
),
'semi-monthly': (
( 354, 0.0400, 0.00),
( 488, 0.0450, 14.17),
( 579, 0.0525, 20.17),
( 892, 0.0590, 25.00),
( 3360, 0.0609, 43.42),
( 4033, 0.0641, 193.75),
( 4485, 0.0746, 236.92),
( 6569, 0.0796, 270.63),
( 8815, 0.0794, 436.46),
(13467, 0.0691, 614.79),
(15550, 0.1019, 936.25),
(44898, 0.0735, 1148.54),
(89806, 0.0765, 3305.58),
(91890, 0.9454, 6741.08),
('inf', 0.0962, 8710.67),
),
'monthly': (
( 708, 0.0400, 0.00),
( 975, 0.0450, 28.33),
( 1158, 0.0525, 40.33),
( 1783, 0.0590, 50.00),
( 6721, 0.0609, 86.83),
( 8067, 0.0641, 387.50),
( 8971, 0.0746, 473.83),
( 13138, 0.0796, 541.25),
( 17629, 0.0794, 872.92),
( 26933, 0.0691, 1229.58),
( 31100, 0.1019, 1872.50),
( 89796, 0.0735, 2297.08),
(179613, 0.0765, 6611.17),
(183779, 0.9454, 13482.17),
( 'inf', 0.0962, 17421.33),
),
'annually': (
( 8500, 0.0400, 0.00),
( 11700, 0.0450, 340.00),
( 13900, 0.0525, 484.00),
( 21400, 0.0590, 600.00),
( 80650, 0.0609, 1042.00),
( 96800, 0.0641, 4650.00),
( 107650, 0.0746, 5686.00),
( 157650, 0.0796, 6495.00),
( 211550, 0.0794, 10475.00),
( 323200, 0.0691, 14755.00),
( 373200, 0.1019, 22470.00),
(1077550, 0.0735, 27565.00),
(2155350, 0.0765, 79334.00),
(2205350, 0.9454, 161786.00),
( 'inf', 0.0962, 209056.00),
),
}
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ny_sit_tax_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_ny_sit_over_10_exemption_rate" model="hr.rule.parameter">
<field name="name">US NY New York Over 10 Exemption Rate</field>
<field name="code">us_ny_sit_over_10_exemption_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ny_sit_over_10_exemption_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">{
'weekly': (142.30, 152.90, 19.25),
'bi-weekly': (284.60, 305.80, 38.50),
'semi-monthly': (308.35, 331.25, 41.65),
'monthly': (616.70, 662.50, 83.30),
'annual': (7400, 7950, 1000),
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ny_sit_over_10_exemption_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_ny_sit_over_10_exemption_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">{
'weekly': (142.30, 152.90, 19.25),
'bi-weekly': (284.60, 305.80, 38.50),
'semi-monthly': (308.35, 331.25, 41.65),
'monthly': (616.70, 662.50, 83.30),
'annual': (7400, 7950, 1000),
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ny_sit_over_10_exemption_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Table A - Combined deduction and exemption allowance (Step 1) -->
<record id="rule_parameter_us_ny_sit_deduction_exemption_rate" model="hr.rule.parameter">
<field name="name">US NY New York Deduction Exemption Rate</field>
<field name="code">us_ny_sit_deduction_exemption_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ny_sit_deduction_exemption_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">{
'single': {
'weekly': (142.30, 161.55, 180.80, 200.05, 219.30, 238.55, 257.80, 277.05, 296.30, 315.55, 334.80),
'bi-weekly': (284.60, 323.10, 361.60, 400.10, 438.60, 477.10, 515.60, 544.10, 592.60, 631.10, 669.60),
'semi-monthly': (308.35, 350.0, 391.65, 433.30, 474.95, 516.60, 558.25, 599.90, 641.55, 683.20, 724.85),
'monthly': (616.70, 700, 783.30, 866.60, 949.90, 1033.20, 1116.50, 1199.80, 1283.10, 1366.40, 1449.70),
'annually': (7400, 8400, 9400, 10400, 11400, 12400, 13400, 14400, 15400, 16400, 17400),
},
'married': {
'weekly': (152.90, 172.15, 191.40, 210.65, 229.90, 249.15, 268.40, 287.65, 306.90, 326.15, 345.40),
'bi-weekly': (305.80, 344.30, 382.80, 421.30, 459.80, 498.30, 536.80, 575.30, 613.80, 652.30, 690.80),
'semi-monthly': (331.25, 372.90, 414.55, 456.20, 497.85, 539.50, 581.15, 622.80, 664.45, 706.10, 747.75),
'monthly': (662.50, 745.80, 829.10, 912.40, 995.70, 1079.00, 1162.30, 1245.60, 1328.90, 1412.20, 1495.50),
'annually': (7950, 8950, 9950, 10950, 11950, 12950, 13950, 14950, 15950, 16950, 17950),
},
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ny_sit_deduction_exemption_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_ny_sit_deduction_exemption_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">{
'single': {
'weekly': (142.30, 161.55, 180.80, 200.05, 219.30, 238.55, 257.80, 277.05, 296.30, 315.55, 334.80),
'bi-weekly': (284.60, 323.10, 361.60, 400.10, 438.60, 477.10, 515.60, 544.10, 592.60, 631.10, 669.60),
'semi-monthly': (308.35, 350.0, 391.65, 433.30, 474.95, 516.60, 558.25, 599.90, 641.55, 683.20, 724.85),
'monthly': (616.70, 700, 783.30, 866.60, 949.90, 1033.20, 1116.50, 1199.80, 1283.10, 1366.40, 1449.70),
'annually': (7400, 8400, 9400, 10400, 11400, 12400, 13400, 14400, 15400, 16400, 17400),
},
'married': {
'weekly': (152.90, 172.15, 191.40, 210.65, 229.90, 249.15, 268.40, 287.65, 306.90, 326.15, 345.40),
'bi-weekly': (305.80, 344.30, 382.80, 421.30, 459.80, 498.30, 536.80, 575.30, 613.80, 652.30, 690.80),
'semi-monthly': (331.25, 372.90, 414.55, 456.20, 497.85, 539.50, 581.15, 622.80, 664.45, 706.10, 747.75),
'monthly': (662.50, 745.80, 829.10, 912.40, 995.70, 1079.00, 1162.30, 1245.60, 1328.90, 1412.20, 1495.50),
'annually': (7950, 8950, 9950, 10950, 11950, 12950, 13950, 14950, 15950, 16950, 17950),
},
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ny_sit_deduction_exemption_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_ny_dor" model="res.partner">
<field name="name">US New York - Department of Taxation and Finance - Unemployment Tax</field>
</record>
<record id="res_partner_us_ny_dor_rsf" model="res.partner">
<field name="name">US New York - Department of Taxation and Finance - Re-employment Service Fund</field>
</record>
<record id="res_partner_us_ny_dor_mcmt" model="res.partner">
<field name="name">US New York - Department of Taxation and Finance - Metropolitan Commuter Transportation Mobility Tax</field>
</record>
<record id="res_partner_us_ny_dor_sit" model="res.partner">
<field name="name">US New York - Department of Taxation and Finance - Income Tax</field>
</record>
<!-- Categories -->
<!-- Rules -->
<record id="hr_payroll_rule_er_us_ny_suta" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US NY New York State Unemployment</field>
<field name="code">ER_US_NY_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_ny_suta_wage_base', rate='us_ny_suta_rate', state_code='NY')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_ny_suta_wage_base', rate='us_ny_suta_rate', state_code='NY')</field>
<field name="partner_id" ref="res_partner_us_ny_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_er_us_ny_suta_rsf" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US NY New York State Re-employment Service Fund</field>
<field name="code">ER_US_NY_SUTA_RSF</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_ny_suta_wage_base', rate='us_ny_suta_rsf_rate', state_code='NY')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_ny_suta_wage_base', rate='us_ny_suta_rsf_rate', state_code='NY')</field>
<field name="partner_id" ref="res_partner_us_ny_dor_rsf"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_er_us_ny_suta_mctmt" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US NY New York State Metropolitan Commuter Transportation Mobility Tax</field>
<field name="code">ER_US_NY_SUTA_MCTMT</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_ny_suta_wage_base', rate='us_ny_suta_mctmt_rate', state_code='NY')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_ny_suta_wage_base', rate='us_ny_suta_mctmt_rate', state_code='NY')</field>
<field name="partner_id" ref="res_partner_us_ny_dor_mcmt"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_ee_us_ny_sit" model="hr.salary.rule">
<field name="sequence" eval="195"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_ee_us_sit"/>
<field name="name">EE: US NY New York State Income Tax Withholding</field>
<field name="code">EE_US_NY_SIT</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = ny_new_york_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = ny_new_york_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="partner_id" ref="res_partner_us_ny_dor_sit"/>
<field name="appears_on_payslip" eval="True"/>
</record>
</odoo>

View File

@@ -0,0 +1,157 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base -->
<record id="rule_parameter_us_oh_suta_wage_base" model="hr.rule.parameter">
<field name="name">US OH Ohio SUTA Wage Base</field>
<field name="code">us_oh_suta_wage_base</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_oh_suta_wage_base_2019" model="hr.rule.parameter.value">
<field name="parameter_value">9500.00</field>
<field name="rule_parameter_id" ref="rule_parameter_us_oh_suta_wage_base"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_oh_suta_wage_base_2020" model="hr.rule.parameter.value">
<field name="parameter_value">9000.00</field>
<field name="rule_parameter_id" ref="rule_parameter_us_oh_suta_wage_base"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Rate -->
<record id="rule_parameter_us_oh_suta_rate" model="hr.rule.parameter">
<field name="name">US OH Ohio SUTA Rate</field>
<field name="code">us_oh_suta_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_oh_suta_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">2.7</field>
<field name="rule_parameter_id" ref="rule_parameter_us_oh_suta_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_oh_suta_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">2.7</field>
<field name="rule_parameter_id" ref="rule_parameter_us_oh_suta_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_oh_sit_rate" model="hr.rule.parameter">
<field name="name">US OH Ohio SIT Rate Table</field>
<field name="code">us_oh_sit_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_oh_sit_rate_2019" model="hr.rule.parameter.value">
<!-- https://www.tax.ohio.gov/Portals/0/employer_withholding/2019%20tables/WTH_OptionalComputerFormula_2019.pdf -->
<!-- wage_less_than, base_amount, rate_over -->
<field name="parameter_value">[
( 5000.00, 0.0, 0.005),
( 10000.00, 25.0, 0.010),
( 15000.00, 75.0, 0.020),
( 20000.00, 175.0, 0.025),
( 40000.00, 300.0, 0.030),
( 80000.00, 900.0, 0.035),
( 100000.00, 2300.0, 0.040),
( 'inf', 3100.0, 0.050),
]</field>
<field name="rule_parameter_id" ref="rule_parameter_us_oh_sit_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_oh_sit_rate_2020" model="hr.rule.parameter.value">
<!-- https://www.tax.ohio.gov/Portals/0/employer_withholding/2020%20tables/WTH_OptionalComputerFormula_2020.pdf -->
<!-- wage_less_than, base_amount, rate_over -->
<field name="parameter_value">[
( 5000.00, 0.0, 0.005),
( 10000.00, 25.0, 0.010),
( 15000.00, 75.0, 0.020),
( 20000.00, 175.0, 0.025),
( 40000.00, 300.0, 0.030),
( 80000.00, 900.0, 0.035),
( 100000.00, 2300.0, 0.040),
( 'inf', 3100.0, 0.050),
]</field>
<field name="rule_parameter_id" ref="rule_parameter_us_oh_sit_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_oh_sit_exemption_rate" model="hr.rule.parameter">
<field name="name">US OH Ohio SIT Exemption Rate</field>
<field name="code">us_oh_sit_exemption_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_oh_sit_exemption_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">650.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_oh_sit_exemption_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_oh_sit_exemption_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">650.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_oh_sit_exemption_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_oh_sit_multiplier" model="hr.rule.parameter">
<field name="name">US OH Ohio SIT Multiplier Value</field>
<field name="code">us_oh_sit_multiplier</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_oh_sit_multiplier_2019" model="hr.rule.parameter.value">
<field name="parameter_value">1.075</field>
<field name="rule_parameter_id" ref="rule_parameter_us_oh_sit_multiplier"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_oh_sit_multiplier_2020" model="hr.rule.parameter.value">
<field name="parameter_value">1.032</field>
<field name="rule_parameter_id" ref="rule_parameter_us_oh_sit_multiplier"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_oh_dor" model="res.partner">
<field name="name">US Ohio - OBG - Unemployment</field>
</record>
<record id="res_partner_us_oh_dor_sit" model="res.partner">
<field name="name">US Ohio - OBG - Income Withholding</field>
</record>
<!-- Categories -->
<!-- Rules -->
<record id="hr_payroll_rule_er_us_oh_suta" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US OH Ohio State Unemployment (JFS-20125)</field>
<field name="code">ER_US_OH_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_oh_suta_wage_base', rate='us_oh_suta_rate', state_code='OH')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_oh_suta_wage_base', rate='us_oh_suta_rate', state_code='OH')</field>
<field name="partner_id" ref="res_partner_us_oh_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_ee_us_oh_sit" model="hr.salary.rule">
<field name="sequence" eval="195"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_ee_us_sit"/>
<field name="name">EE: US OH Ohio State Income Tax Withholding (IT 501)</field>
<field name="code">EE_US_OH_SIT</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = oh_ohio_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = oh_ohio_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="partner_id" ref="res_partner_us_oh_dor_sit"/>
<field name="appears_on_payslip" eval="True"/>
</record>
</odoo>

View File

@@ -0,0 +1,301 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base -->
<record id="rule_parameter_us_ok_suta_wage_base" model="hr.rule.parameter">
<field name="name">US OK Oklahoma SUTA Wage Base</field>
<field name="code">us_ok_suta_wage_base</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ok_suta_wage_base_2020" model="hr.rule.parameter.value">
<field name="parameter_value">18700.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ok_suta_wage_base"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Rate -->
<record id="rule_parameter_us_ok_suta_rate" model="hr.rule.parameter">
<field name="name">US OK Oklahoma SUTA Rate</field>
<field name="code">us_ok_suta_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ok_suta_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">1.5</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ok_suta_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- table from https://www.ok.gov/tax/documents/2020WHTables.pdf -->
<record id="rule_parameter_us_ok_sit_allowances_rate" model="hr.rule.parameter">
<field name="name">US OK Oklahoma Allowances Rate</field>
<field name="code">us_ok_sit_allowances_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ok_sit_allowances_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">{
'weekly' : 19.23,
'bi-weekly' : 38.46,
'semi-monthly': 41.67,
'monthly' : 83.33,
'quarterly' : 250.00,
'semi-annual': 500.00,
'annually': 1000.00,
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ok_sit_allowances_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- table from https://www.ok.gov/tax/documents/2020WHTables.pdf -->
<record id="rule_parameter_us_ok_sit_tax_rate" model="hr.rule.parameter">
<field name="name">US OK Oklahoma SIT Tax Rate</field>
<field name="code">us_ok_sit_tax_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ok_sit_tax_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">{
'single': {
'weekly': (
( 122, 0.00, 0.00),
( 141, 0.50, 0.00),
( 170, 1.00, 0.10),
( 194, 2.00, 0.38),
( 216, 3.00, 0.87),
( 261, 4.00, 1.53),
('inf', 5.00, 3.30),
),
'bi-weekly': (
( 244, 0.00, 0.00),
( 283, 0.50, 0.00),
( 340, 1.00, 0.19),
( 388, 2.00, 0.77),
( 433, 3.00, 1.73),
( 521, 4.00, 3.06),
('inf', 5.00, 6.60),
),
'semi-monthly': (
( 265, 0.00, 0.00),
( 306, 0.50, 0.00),
( 369, 1.00, 0.21),
( 421, 2.00, 0.83),
( 469, 3.00, 1.88),
( 565, 4.00, 3.31),
('inf', 5.00, 7.15),
),
'monthly': (
( 529, 0.00, 0.00),
( 613, 0.50, 0.00),
( 738, 1.00, 0.42),
( 842, 2.00, 1.67),
( 938, 3.00, 3.75),
(1129, 4.00, 6.63),
('inf', 5.00, 14.29),
),
'quarterly': (
( 1588, 0.00, 0.00),
( 1838, 0.50, 0.00),
( 2213, 1.00, 1.25),
( 2525, 2.00, 5.00),
( 2813, 3.00, 11.25),
( 3388, 4.00, 19.88),
('inf', 5.00, 42.88),
),
'semi-annual': (
( 3175, 0.00, 0.00),
( 3675, 0.50, 0.00),
( 4425, 1.00, 2.50),
( 5050, 2.00, 10.00),
(5625, 3.00, 22.50),
( 6775, 4.00, 39.75),
('inf', 5.00, 85.75),
),
'annually': (
( 6350, 0.00, 0.00),
( 7350, 0.50, 0.00),
( 8850, 1.00, 5.00),
(10100, 2.00, 20.00),
(11250, 3.00, 45.00),
(13550, 4.00, 79.50),
('inf', 5.00, 171.50),
),
},
'married': {
'weekly': (
( 244, 0.00, 0.00),
( 283, 0.50, 0.00),
( 340, 1.00, 0.19),
( 388, 2.00, 0.77),
( 433, 3.00, 1.73),
( 479, 4.00, 3.06),
('inf', 5.00, 4.90),
),
'bi-weekly': (
( 488, 0.00, 0.00),
( 565, 0.50, 0.00),
( 681, 1.00, 0.38),
( 777, 2.00, 1.54),
( 865, 3.00, 3.46),
( 958, 4.00, 6.12),
('inf', 5.00, 9.81),
),
'semi-monthly': (
( 529, 0.00, 0.00),
( 613, 0.50, 0.00),
( 738, 1.00, 0.42),
( 842, 2.00, 1.67),
( 938, 3.00, 3.75),
( 1038, 4.00, 6.63),
('inf', 5.00, 10.63),
),
'monthly': (
( 1058, 0.00, 0.00),
( 1225, 0.50, 0.00),
( 1475, 1.00, 0.83),
( 1683, 2.00, 3.33),
( 1875, 3.00, 7.50),
( 2075, 4.00, 13.25),
('inf', 5.00, 21.25),
),
'quarterly': (
( 3175, 0.00, 0.00),
( 3675, 0.50, 0.00),
( 4425, 1.00, 2.50),
( 5050, 2.00, 10.00),
( 5625, 3.00, 22.50),
( 6225, 4.00, 39.75),
('inf', 5.00, 63.75),
),
'semi-annual': (
( 6350, 0.00, 0.00),
( 7350, 0.50, 0.00),
( 8850, 1.00, 5.00),
( 10100, 2.00, 20.00),
( 11250, 3.00, 45.00),
( 12450, 4.00, 79.50),
( 'inf', 5.00, 127.50),
),
'annually': (
( 12700, 0.00, 0.00),
( 14700, 0.50, 0.00),
( 17700, 1.00, 10.00),
( 20200, 2.00, 40.00),
( 22500, 3.00, 90.00),
( 24900, 4.00, 159.00),
( 'inf', 5.00, 255.00),
),
},
'head_household': {
'weekly': (
( 122, 0.00, 0.00),
( 141, 0.50, 0.00),
( 170, 1.00, 0.10),
( 194, 2.00, 0.38),
( 216, 3.00, 0.87),
( 261, 4.00, 1.53),
('inf', 5.00, 3.30),
),
'bi-weekly': (
( 244, 0.00, 0.00),
( 283, 0.50, 0.00),
( 340, 1.00, 0.19),
( 388, 2.00, 0.77),
( 433, 3.00, 1.73),
( 521, 4.00, 3.06),
('inf', 5.00, 6.60),
),
'semi-monthly': (
( 265, 0.00, 0.00),
( 306, 0.50, 0.00),
( 369, 1.00, 0.21),
( 421, 2.00, 0.83),
( 469, 3.00, 1.88),
( 565, 4.00, 3.31),
('inf', 5.00, 7.15),
),
'monthly': (
( 529, 0.00, 0.00),
( 613, 0.50, 0.00),
( 738, 1.00, 0.42),
( 842, 2.00, 1.67),
( 938, 3.00, 3.75),
( 1129, 4.00, 6.63),
('inf', 5.00, 14.29),
),
'quarterly': (
( 1588, 0.00, 0.00),
( 1838, 0.50, 0.00),
( 2213, 1.00, 1.25),
( 2525, 2.00, 5.00),
( 2813, 3.00, 11.25),
( 3388, 4.00, 19.88),
('inf', 5.00, 42.88),
),
'semi-annual': (
( 3175, 0.00, 0.00),
( 3675, 0.50, 0.00),
( 4425, 1.00, 2.50),
( 5050, 2.00, 10.00),
( 5625, 3.00, 22.50),
( 6775, 4.00, 39.75),
('inf', 5.00, 85.75),
),
'annually': (
( 6350, 0.00, 0.00),
( 7350, 0.50, 0.00),
( 8850, 1.00, 5.00),
(10100, 2.00, 20.00),
(11250, 3.00, 45.00),
(13550, 4.00, 79.50),
('inf', 5.00, 171.50),
),
},
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ok_sit_tax_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_ok_dor" model="res.partner">
<field name="name">US Oklahoma - Employment Security Commission - Unemployment Tax</field>
</record>
<record id="res_partner_us_ok_dor_sit" model="res.partner">
<field name="name">US Oklahoma - Tax Commission - Income Tax</field>
</record>
<!-- Categories -->
<!-- Rules -->
<record id="hr_payroll_rule_er_us_ok_suta" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US OK Oklahoma State Unemployment</field>
<field name="code">ER_US_OK_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_ok_suta_wage_base', rate='us_ok_suta_rate', state_code='OK')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_ok_suta_wage_base', rate='us_ok_suta_rate', state_code='OK')</field>
<field name="partner_id" ref="res_partner_us_ok_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_ee_us_ok_sit" model="hr.salary.rule">
<field name="sequence" eval="195"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_ee_us_sit"/>
<field name="name">EE: US OK Oklahoma State Income Tax Withholding</field>
<field name="code">EE_US_OK_SIT</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = ok_oklahoma_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = ok_oklahoma_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="partner_id" ref="res_partner_us_ok_dor_sit"/>
<field name="appears_on_payslip" eval="True"/>
</record>
</odoo>

View File

@@ -0,0 +1,131 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base -->
<record id="rule_parameter_us_pa_suta_wage_base" model="hr.rule.parameter">
<field name="name">US PA Pennsylvania SUTA Wage Base (ER)</field>
<field name="code">us_pa_suta_wage_base</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_pa_suta_wage_base_2019" model="hr.rule.parameter.value">
<field name="parameter_value">10000.00</field>
<field name="rule_parameter_id" ref="rule_parameter_us_pa_suta_wage_base"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_pa_suta_wage_base_2020" model="hr.rule.parameter.value">
<field name="parameter_value">10000.00</field>
<field name="rule_parameter_id" ref="rule_parameter_us_pa_suta_wage_base"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Rate -->
<record id="rule_parameter_us_pa_suta_rate" model="hr.rule.parameter">
<field name="name">US PA Pennsylvania SUTA Rate</field>
<field name="code">us_pa_suta_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_pa_suta_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">3.6890</field>
<field name="rule_parameter_id" ref="rule_parameter_us_pa_suta_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_pa_suta_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">3.6890</field>
<field name="rule_parameter_id" ref="rule_parameter_us_pa_suta_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_pa_suta_ee_rate" model="hr.rule.parameter">
<field name="name">US PA Pennsylvania SUTA Employee Rate</field>
<field name="code">us_pa_suta_ee_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_pa_suta_ee_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">0.06</field>
<field name="rule_parameter_id" ref="rule_parameter_us_pa_suta_ee_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_pa_suta_ee_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">0.06</field>
<field name="rule_parameter_id" ref="rule_parameter_us_pa_suta_ee_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_pa_sit_rate" model="hr.rule.parameter">
<field name="name">US PA Pennsylvania SIT Rate</field>
<field name="code">us_pa_sit_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_pa_sit_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">3.07</field>
<field name="rule_parameter_id" ref="rule_parameter_us_pa_sit_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_pa_sit_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">3.07</field>
<field name="rule_parameter_id" ref="rule_parameter_us_pa_sit_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_pa_dor" model="res.partner">
<field name="name">US Pennsylvania - Department of Revenue - Unemployment Tax</field>
</record>
<record id="res_partner_us_pa_dor_sit" model="res.partner">
<field name="name">US Pennsylvania - Department of Revenue - Income Tax</field>
</record>
<!-- Categories -->
<!-- Rules -->
<record id="hr_payroll_rule_er_us_pa_suta" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US PA Pennsylvania State Unemployment (UC-2)</field>
<field name="code">ER_US_PA_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_pa_suta_wage_base', rate='us_pa_suta_rate', state_code='PA')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_pa_suta_wage_base', rate='us_pa_suta_rate', state_code='PA')</field>
<field name="partner_id" ref="res_partner_us_pa_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_ee_us_pa_suta" model="hr.salary.rule">
<field name="sequence" eval="195"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_ee_us_suta"/>
<field name="name">EE: US PA Pennsylvania State Unemployment (UC-2)</field>
<field name="code">EE_US_PA_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, rate='us_pa_suta_ee_rate', state_code='PA')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, rate='us_pa_suta_ee_rate', state_code='PA')</field>
<field name="partner_id" ref="res_partner_us_pa_dor"/>
<field name="appears_on_payslip" eval="True"/>
</record>
<record id="hr_payroll_rule_ee_us_pa_sit" model="hr.salary.rule">
<field name="sequence" eval="195"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_ee_us_sit"/>
<field name="name">EE: US PA Pennsylvania State Income Tax Withholding (PA-501)</field>
<field name="code">EE_US_PA_SIT</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_income_withholding(payslip, categories, worked_days, inputs, rate='us_pa_sit_rate', state_code='PA')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_income_withholding(payslip, categories, worked_days, inputs, rate='us_pa_sit_rate', state_code='PA')</field>
<field name="partner_id" ref="res_partner_us_pa_dor_sit"/>
<field name="appears_on_payslip" eval="True"/>
</record>
</odoo>

View File

@@ -0,0 +1,141 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base -->
<record id="rule_parameter_us_ri_suta_wage_base" model="hr.rule.parameter">
<field name="name">US RI Rhode Island SUTA Wage Base</field>
<field name="code">us_ri_suta_wage_base</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ri_suta_wage_base_2020" model="hr.rule.parameter.value">
<field name="parameter_value">24000.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ri_suta_wage_base"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Rate -->
<record id="rule_parameter_us_ri_suta_rate" model="hr.rule.parameter">
<field name="name">US RI Rhode Island SUTA Rate</field>
<field name="code">us_ri_suta_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ri_suta_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">1.06</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ri_suta_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Withhooding tax exemption based on two table on page 7. from http://www.tax.ri.gov/forms/2020/Withholding/2020%20Withhholding%20Tax%20Booklet.pdf -->
<record id="rule_parameter_us_ri_sit_exemption_rate" model="hr.rule.parameter">
<field name="name">US RI Rhode Island Exemption Rate</field>
<field name="code">us_ri_sit_exemption_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ri_sit_exemption_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">{
'weekly' : (( 0.00, 19.23), ( 4451.92, 0.00)),
'bi-weekly' : (( 0.00, 38.46), ( 8903.85, 0.00)),
'semi-monthly': (( 0.00, 41.67), ( 9645.83, 0.00)),
'monthly' : (( 0.00, 83.33), ( 19291.67, 0.00)),
'quarterly' : (( 0.00, 250.00), ( 57875.00, 0.00)),
'semi-annually': (( 0.00, 500.00), ( 115750.00, 0.00)),
'annually': (( 0.00, 1000.0), ( 231500.00, 0000)),
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ri_sit_exemption_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_ri_sit_tax_rate" model="hr.rule.parameter">
<field name="name">US RI Rhode Island SIT Tax Rate</field>
<field name="code">us_ri_sit_tax_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ri_sit_tax_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">{
'weekly': (
( 1255, 0.00, 3.75),
( 2853, 47.06, 4.75),
('inf', 122.97, 5.99),
),
'bi-weekly': (
( 2510, 0.00, 3.75),
( 5706, 94.13, 4.75),
('inf', 245.94, 5.99),
),
'semi-monthly': (
( 2719, 0.00, 3.75),
( 6181, 101.96, 4.75),
('inf', 266.41, 5.99),
),
'monthly': (
( 5438, 0.00, 3.75),
(12363, 203.93, 4.75),
('inf', 532.87, 5.99),
),
'quarterly': (
(16313, 0.00, 3.75),
(37088, 611.74, 4.75),
('inf', 1598.55, 5.99),
),
'semi-annually': (
(32625, 0.00, 3.75),
(74175, 1223.44, 4.75),
('inf', 3197.07, 5.99),
),
'annually': (
( 65250, 0.00, 3.75),
(148350, 2446.88, 4.75),
( 'inf', 6394.13, 5.99),
),
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ri_sit_tax_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_ri_dor" model="res.partner">
<field name="name">US Rhode Island - Department of Labor and Training - Unemployment Tax</field>
</record>
<record id="res_partner_us_ri_dor_sit" model="res.partner">
<field name="name">US Rhode Island - Division of Taxations - Income Tax</field>
</record>
<!-- Categories -->
<!-- Rules -->
<record id="hr_payroll_rule_er_us_ri_suta" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US RI Rhode Island State Unemployment</field>
<field name="code">ER_US_RI_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_ri_suta_wage_base', rate='us_ri_suta_rate', state_code='RI')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_ri_suta_wage_base', rate='us_ri_suta_rate', state_code='RI')</field>
<field name="partner_id" ref="res_partner_us_ri_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_ee_us_ri_sit" model="hr.salary.rule">
<field name="sequence" eval="195"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_ee_us_sit"/>
<field name="name">EE: US RI Rhode Island State Income Tax Withholding</field>
<field name="code">EE_US_RI_SIT</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = ri_rhode_island_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = ri_rhode_island_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="partner_id" ref="res_partner_us_ri_dor_sit"/>
<field name="appears_on_payslip" eval="True"/>
</record>
</odoo>

View File

@@ -0,0 +1,151 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base -->
<record id="rule_parameter_us_sc_suta_wage_base" model="hr.rule.parameter">
<field name="name">US SC South Carolina SUTA Wage Base</field>
<field name="code">us_sc_suta_wage_base</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_sc_suta_wage_base_2019" model="hr.rule.parameter.value">
<field name="parameter_value">14000.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_sc_suta_wage_base"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_sc_suta_wage_base_2020" model="hr.rule.parameter.value">
<field name="parameter_value">14000.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_sc_suta_wage_base"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Rate -->
<record id="rule_parameter_us_sc_suta_rate" model="hr.rule.parameter">
<field name="name">US SC South Carolina SUTA Rate</field>
<field name="code">us_sc_suta_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_sc_suta_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">1.09</field>
<field name="rule_parameter_id" ref="rule_parameter_us_sc_suta_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<!-- Tax rate from https://taxnews.ey.com/news/2019-2183-south-carolina-2020-sui-tax-rates-to-decrease-due-to-elimination-of-the-variable-solvency-surcharge-wage-base-unchanged -->
<record id="rule_parameter_us_sc_suta_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">0.55</field>
<field name="rule_parameter_id" ref="rule_parameter_us_sc_suta_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_sc_sit_tax_rate" model="hr.rule.parameter">
<field name="name">US SC South Carolina SIT Tax Rate</field>
<field name="code">us_sc_sit_tax_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_sc_sit_tax_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">[
( 2450, 1.1, 0.0),
( 4900, 3.0, 26.95),
( 7350, 4.0, 100.45),
( 9800, 5.0, 198.45),
(12250, 6.0, 320.95),
('inf', 7.0, 467.95),
]</field>
<field name="rule_parameter_id" ref="rule_parameter_us_sc_sit_tax_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<!-- Substraction Method table from https://dor.sc.gov/forms-site/Forms/WH1603F_2020.pdf-->
<record id="rule_parameter_us_sc_sit_tax_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">[
( 2620, 0.8, 0.0),
( 5240, 3.0, 57.64),
( 7860, 4.0, 110.04),
(10490, 5.0, 188.64),
(13110, 6.0, 293.54),
('inf', 7.0, 424.64),
]</field>
<field name="rule_parameter_id" ref="rule_parameter_us_sc_sit_tax_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_sc_sit_personal_exemption_rate" model="hr.rule.parameter">
<field name="name">US SC South Carolina Personal Exemption Rate</field>
<field name="code">us_sc_sit_personal_exemption_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_sc_sit_personal_exemption_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">2510</field>
<field name="rule_parameter_id" ref="rule_parameter_us_sc_sit_personal_exemption_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_sc_sit_personal_exemption_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">2590</field>
<field name="rule_parameter_id" ref="rule_parameter_us_sc_sit_personal_exemption_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_sc_sit_standard_deduction_rate" model="hr.rule.parameter">
<field name="name">US SC South Carolina Standard Deduction Rate</field>
<field name="code">us_sc_sit_standard_deduction_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_sc_sit_standard_deduction_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">3470.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_sc_sit_standard_deduction_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_sc_sit_standard_deduction_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">3820.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_sc_sit_standard_deduction_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_sc_dor" model="res.partner">
<field name="name">US South Carolina - Department of Labor and Industrial Relations - Unemployment Tax</field>
</record>
<record id="res_partner_us_sc_dor_sit" model="res.partner">
<field name="name">US South Carolina - Department of Taxation - Income Tax</field>
</record>
<!-- Categories -->
<!-- Rules -->
<record id="hr_payroll_rule_er_us_sc_suta" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US SC South Carolina State Unemployment</field>
<field name="code">ER_US_SC_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_sc_suta_wage_base', rate='us_sc_suta_rate', state_code='SC')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_sc_suta_wage_base', rate='us_sc_suta_rate', state_code='SC')</field>
<field name="partner_id" ref="res_partner_us_sc_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_ee_us_sc_sit" model="hr.salary.rule">
<field name="sequence" eval="195"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_ee_us_sit"/>
<field name="name">EE: US SC South Carolina State Income Tax Withholding</field>
<field name="code">EE_US_SC_SIT</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = sc_south_carolina_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = sc_south_carolina_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="partner_id" ref="res_partner_us_sc_dor_sit"/>
<field name="appears_on_payslip" eval="True"/>
</record>
</odoo>

View File

@@ -0,0 +1,51 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base -->
<record id="rule_parameter_us_sd_suta_wage_base" model="hr.rule.parameter">
<field name="name">US SD South Dakota SUTA Wage Base</field>
<field name="code">us_sd_suta_wage_base</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_sd_suta_wage_base_2020" model="hr.rule.parameter.value">
<field name="parameter_value">15000.00</field>
<field name="rule_parameter_id" ref="rule_parameter_us_sd_suta_wage_base"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Rate -->
<record id="rule_parameter_us_sd_suta_rate" model="hr.rule.parameter">
<field name="name">US SD South Dakota SUTA Rate</field>
<field name="code">us_sd_suta_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_sd_suta_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">1.75</field>
<field name="rule_parameter_id" ref="rule_parameter_us_sd_suta_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_sd_dor" model="res.partner">
<field name="name">US South Dakota - Department of Labor - Unemployment Tax</field>
</record>
<!-- Rules -->
<record id="hr_payroll_rule_er_us_sd_suta" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US SD South Dakota State Unemployment</field>
<field name="code">ER_US_SD_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_sd_suta_wage_base', rate='us_sd_suta_rate', state_code='SD')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_sd_suta_wage_base', rate='us_sd_suta_rate', state_code='SD')</field>
<field name="partner_id" ref="res_partner_us_sd_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
</odoo>

View File

@@ -0,0 +1,51 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base -->
<record id="rule_parameter_us_tn_suta_wage_base" model="hr.rule.parameter">
<field name="name">US TN Tennessee SUTA Wage Base</field>
<field name="code">us_tn_suta_wage_base</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_tn_suta_wage_base_2020" model="hr.rule.parameter.value">
<field name="parameter_value">7000.00</field>
<field name="rule_parameter_id" ref="rule_parameter_us_tn_suta_wage_base"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Rate -->
<record id="rule_parameter_us_tn_suta_rate" model="hr.rule.parameter">
<field name="name">US TN Tennessee SUTA Rate</field>
<field name="code">us_tn_suta_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_tn_suta_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">2.7</field>
<field name="rule_parameter_id" ref="rule_parameter_us_tn_suta_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_tn_dor" model="res.partner">
<field name="name">US Tennessee - Department of Revenue - Unemployment Tax</field>
</record>
<!-- Rules -->
<record id="hr_payroll_rule_er_us_tn_suta" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US TN Tennessee State Unemployment</field>
<field name="code">ER_US_TN_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_tn_suta_wage_base', rate='us_tn_suta_rate', state_code='TN')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_tn_suta_wage_base', rate='us_tn_suta_rate', state_code='TN')</field>
<field name="partner_id" ref="res_partner_us_tn_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
</odoo>

View File

@@ -0,0 +1,127 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base -->
<record id="rule_parameter_us_tx_suta_wage_base" model="hr.rule.parameter">
<field name="name">US TX Texas SUTA Wage Base</field>
<field name="code">us_tx_suta_wage_base</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_tx_suta_wage_base_2019" model="hr.rule.parameter.value">
<field name="parameter_value">9000.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_tx_suta_wage_base"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_tx_suta_wage_base_2020" model="hr.rule.parameter.value">
<field name="parameter_value">9000.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_tx_suta_wage_base"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Rate -->
<record id="rule_parameter_us_tx_suta_rate" model="hr.rule.parameter">
<field name="name">US TX Texas SUTA Rate</field>
<field name="code">us_tx_suta_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_tx_suta_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">2.7</field>
<field name="rule_parameter_id" ref="rule_parameter_us_tx_suta_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_tx_suta_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">2.7</field>
<field name="rule_parameter_id" ref="rule_parameter_us_tx_suta_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_tx_suta_oa_rate" model="hr.rule.parameter">
<field name="name">US TX Texas Obligation Assessment Rate</field>
<field name="code">us_tx_suta_oa_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_tx_suta_oa_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">0.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_tx_suta_oa_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_tx_suta_oa_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">0.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_tx_suta_oa_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_tx_suta_etia_rate" model="hr.rule.parameter">
<field name="name">US TX Texas Employment &amp; Training Investment Assessment Rate</field>
<field name="code">us_tx_suta_etia_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_tx_suta_etia_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">0.1</field>
<field name="rule_parameter_id" ref="rule_parameter_us_tx_suta_etia_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_tx_suta_etia_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">0.1</field>
<field name="rule_parameter_id" ref="rule_parameter_us_tx_suta_etia_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_tx_dor" model="res.partner">
<field name="name">US Texas - Workforce Commission (Unemployment)</field>
</record>
<!-- Categories -->
<!-- Rules -->
<record id="hr_payroll_rule_er_us_tx_suta" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US TX Texas State Unemployment (C-3)</field>
<field name="code">ER_US_TX_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_tx_suta_wage_base', rate='us_tx_suta_rate', state_code='TX')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_tx_suta_wage_base', rate='us_tx_suta_rate', state_code='TX')</field>
<field name="partner_id" ref="res_partner_us_tx_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_er_us_tx_suta_oa" model="hr.salary.rule">
<field name="sequence" eval="451"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US TX Texas Obligation Assessment (C-3)</field>
<field name="code">ER_US_TX_SUTA_OA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_tx_suta_wage_base', rate='us_tx_suta_oa_rate', state_code='TX')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_tx_suta_wage_base', rate='us_tx_suta_oa_rate', state_code='TX')</field>
<field name="partner_id" ref="res_partner_us_tx_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_er_us_tx_suta_etia" model="hr.salary.rule">
<field name="sequence" eval="451"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US TX Texas Employment &amp; Training Investment Assessment (C-3)</field>
<field name="code">ER_US_TX_SUTA_ETIA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_tx_suta_wage_base', rate='us_tx_suta_etia_rate', state_code='TX')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_tx_suta_wage_base', rate='us_tx_suta_etia_rate', state_code='TX')</field>
<field name="partner_id" ref="res_partner_us_tx_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
</odoo>

View File

@@ -0,0 +1,166 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base -->
<record id="rule_parameter_us_ut_suta_wage_base" model="hr.rule.parameter">
<field name="name">US UT Utah SUTA Wage Base</field>
<field name="code">us_ut_suta_wage_base</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ut_suta_wage_base_2020" model="hr.rule.parameter.value">
<field name="parameter_value">36600.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ut_suta_wage_base"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Rate -->
<record id="rule_parameter_us_ut_suta_rate" model="hr.rule.parameter">
<field name="name">US UT Utah SUTA Rate</field>
<field name="code">us_ut_suta_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ut_suta_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">0.1</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ut_suta_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_ut_tax_rate" model="hr.rule.parameter">
<field name="name">US UT Utah TAX Rate</field>
<field name="code">us_ut_tax_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ut_tax_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">0.0495</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ut_tax_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Table based on https://tax.utah.gov/forms/pubs/pub-14.pdf -->
<record id="rule_parameter_us_ut_sit_allowances_rate" model="hr.rule.parameter">
<field name="name">US UT Utah Allowances Rate</field>
<field name="code">us_ut_sit_allowances_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ut_sit_allowances_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">{
'single': {
'weekly' : 7,
'bi-weekly' : 14,
'semi-monthly': 15,
'monthly' : 30,
'quarterly' : 90,
'semi-annual': 180,
'annually': 360,
},
'married': {
'weekly' : 14,
'bi-weekly' : 28,
'semi-monthly': 30,
'monthly' : 60,
'quarterly' : 180,
'semi-annual': 360,
'annually': 720,
},
'head_household': {
'weekly' : 7,
'bi-weekly' : 14,
'semi-monthly': 15,
'monthly' : 30,
'quarterly' : 90,
'semi-annual': 180,
'annually': 360,
},
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ut_sit_allowances_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Table based on https://tax.utah.gov/forms/pubs/pub-14.pdf -->
<record id="rule_parameter_us_ut_sit_tax_rate" model="hr.rule.parameter">
<field name="name">US UT Utah SIT Tax Rate</field>
<field name="code">us_ut_sit_tax_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_ut_sit_tax_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">{
'single': {
'weekly': ((137, 1.3)),
'bi-weekly': ((274, 1.3)),
'semi-monthly': ((297, 1.3)),
'monthly': ((594, 1.3)),
'quarterly': ((1782, 1.3)),
'semi-annual': ((3564, 1.3)),
'annually': ((7128, 1.3)),
},
'married': {
'weekly': ((274, 1.3)),
'bi-weekly': (548, 1.3),
'semi-monthly': ((594, 1.3)),
'monthly': ((1188, 1.3)),
'quarterly': ((3564, 1.3)),
'semi-annual': ((7128, 1.3)),
'annually': ((14256, 1.3)),
},
'head_household': {
'weekly': ((137, 1.3)),
'bi-weekly': ((274, 1.3)),
'semi-monthly': ((297, 1.3)),
'monthly': ((594, 1.3)),
'quarterly': ((1782, 1.3)),
'semi-annual': ((3564, 1.3)),
'annually': ((7128, 1.3)),
},
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_ut_sit_tax_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_ut_dor" model="res.partner">
<field name="name">US Utah - Employment Security Commission - Unemployment Tax</field>
</record>
<record id="res_partner_us_ut_dor_sit" model="res.partner">
<field name="name">US Utah - Tax Commission - Income Tax</field>
</record>
<!-- Categories -->
<!-- Rules -->
<record id="hr_payroll_rule_er_us_ut_suta" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US UT Utah State Unemployment</field>
<field name="code">ER_US_UT_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_ut_suta_wage_base', rate='us_ut_suta_rate', state_code='UT')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_ut_suta_wage_base', rate='us_ut_suta_rate', state_code='UT')</field>
<field name="partner_id" ref="res_partner_us_ut_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_ee_us_ut_sit" model="hr.salary.rule">
<field name="sequence" eval="195"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_ee_us_sit"/>
<field name="name">EE: US UT Utah State Income Tax Withholding</field>
<field name="code">EE_US_UT_SIT</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = ut_utah_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = ut_utah_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="partner_id" ref="res_partner_us_ut_dor_sit"/>
<field name="appears_on_payslip" eval="True"/>
</record>
</odoo>

View File

@@ -0,0 +1,138 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base -->
<record id="rule_parameter_us_va_suta_wage_base" model="hr.rule.parameter">
<field name="name">US VA Virginia SUTA Wage Base</field>
<field name="code">us_va_suta_wage_base</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_va_suta_wage_base_2019" model="hr.rule.parameter.value">
<field name="parameter_value">8000.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_va_suta_wage_base"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_va_suta_wage_base_2020" model="hr.rule.parameter.value">
<field name="parameter_value">8000.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_va_suta_wage_base"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Rate -->
<record id="rule_parameter_us_va_suta_rate" model="hr.rule.parameter">
<field name="name">US VA Virginia SUTA Rate</field>
<field name="code">us_va_suta_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_va_suta_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">2.51</field>
<field name="rule_parameter_id" ref="rule_parameter_us_va_suta_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_va_suta_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">2.51</field>
<field name="rule_parameter_id" ref="rule_parameter_us_va_suta_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Table page no 10 based https://www.tax.virginia.gov/sites/default/files/inline-files/Employer%20Withholding%20Instructions.pdf -->
<record id="rule_parameter_us_va_sit_rate" model="hr.rule.parameter">
<field name="name">US VA Virginia SIT Rate Table</field>
<field name="code">us_va_sit_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_va_sit_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">[
( 0.00, 0.0, 2.00),
( 3000.00, 60.0, 3.00),
( 5000.00, 120.0, 5.00),
( 17000.00, 720.0, 5.75),
]</field>
<field name="rule_parameter_id" ref="rule_parameter_us_va_sit_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_va_sit_exemption_rate" model="hr.rule.parameter">
<field name="name">US VA Virginia SIT Exemption Rate Table</field>
<field name="code">us_va_sit_exemption_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_va_sit_exemption_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">930.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_va_sit_exemption_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_va_sit_other_exemption_rate" model="hr.rule.parameter">
<field name="name">US VA Virginia SIT Other Exemption Rate Table</field>
<field name="code">us_va_sit_other_exemption_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_va_sit_other_exemption_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">800.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_va_sit_other_exemption_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_va_sit_deduction" model="hr.rule.parameter">
<field name="name">US VA Virginia SIT Deduction</field>
<field name="code">us_va_sit_deduction</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_va_sit_deduction_2019" model="hr.rule.parameter.value">
<field name="parameter_value">4500.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_va_sit_deduction"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
</data>
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_va_dor" model="res.partner">
<field name="name">US Virginia - Department of Taxation - Unemployment Tax</field>
</record>
<record id="res_partner_us_va_dor_sit" model="res.partner">
<field name="name">US Virginia - Department of Taxation - Income Tax</field>
</record>
<!-- Categories -->
<!-- Rules -->
<record id="hr_payroll_rule_er_us_va_suta" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US VA Virginia State Unemployment</field>
<field name="code">ER_US_VA_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_va_suta_wage_base', rate='us_va_suta_rate', state_code='VA')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_va_suta_wage_base', rate='us_va_suta_rate', state_code='VA')</field>
<field name="partner_id" ref="res_partner_us_va_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_ee_us_va_sit" model="hr.salary.rule">
<field name="sequence" eval="195"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_ee_us_sit"/>
<field name="name">EE: US VA Virginia State Income Tax Withholding</field>
<field name="code">EE_US_VA_SIT</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = va_virginia_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = va_virginia_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="partner_id" ref="res_partner_us_va_dor_sit"/>
<field name="appears_on_payslip" eval="True"/>
</record>
</odoo>

View File

@@ -0,0 +1,193 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base from https://labor.vermont.gov/unemployment-insurance/ui-employers/quarterly-reporting-taxable-wage-information -->
<record id="rule_parameter_us_vt_suta_wage_base" model="hr.rule.parameter">
<field name="name">US VT Vermont SUTA Wage Base</field>
<field name="code">us_vt_suta_wage_base</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_vt_suta_wage_base_2020" model="hr.rule.parameter.value">
<field name="parameter_value">16100.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_vt_suta_wage_base"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Rate -->
<record id="rule_parameter_us_vt_suta_rate" model="hr.rule.parameter">
<field name="name">US VT Vermont SUTA Rate</field>
<field name="code">us_vt_suta_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_vt_suta_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">1.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_vt_suta_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_vt_sit_allowances_rate" model="hr.rule.parameter">
<field name="name">US VT Vermont Allowances Rate</field>
<field name="code">us_vt_sit_allowances_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_vt_sit_allowances_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">{
'weekly' : 83.65,
'bi-weekly' : 167.31,
'semi-monthly': 181.25,
'monthly' : 362.50,
'quarterly' : 1087.50,
'annually': 4350.00,
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_vt_sit_allowances_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Table based on https://tax.vermont.gov/sites/tax/files/documents/WithholdingInstructions.pdf-->
<record id="rule_parameter_us_vt_sit_tax_rate" model="hr.rule.parameter">
<field name="name">US VT Vermont SIT Tax Rate</field>
<field name="code">us_vt_sit_tax_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_vt_sit_tax_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">{
'single': {
'weekly': (
( 60, 0.00, 0.00),
( 836, 0.00, 3.35),
( 1941, 26.00, 6.60),
( 3983, 98.93, 7.60),
('inf', 254.12, 8.75),
),
'bi-weekly': (
( 120, 0.00, 0.00),
( 1672, 0.00, 3.35),
( 3882, 51.99, 6.60),
( 7966, 197.85, 7.60),
('inf', 508.24, 8.75),
),
'semi-monthly': (
( 130, 0.00, 0.00),
( 1811, 0.00, 3.35),
( 4205, 56.31, 6.60),
( 8630, 214.32, 7.60),
('inf', 550.62, 8.75),
),
'monthly': (
( 260, 0.00, 0.00),
( 3623, 0.00, 3.35),
( 8410, 112.66, 6.60),
(17260, 428.60, 7.60),
('inf', 1101.20, 8.75),
),
'quarterly': (
( 781, 0.00, 0.00),
(10869, 0.00, 3.35),
(25231, 337.95, 6.60),
(51781, 1285.84, 7.60),
('inf', 3303.64, 8.75),
),
'annually': (
( 3125, 0.00, 0.00),
( 43475, 0.00, 3.35),
(100925, 1351.73, 6.60),
(207125, 5143.43, 7.60),
( 'inf', 13214.63, 8.75),
),
},
'married': {
'weekly': (
( 180, 0.00, 0.00),
( 1477, 0.00, 3.35),
( 3315, 43.45, 6.60),
( 4956, 164.76, 7.60),
('inf', 289.47, 8.75),
),
'bi-weekly': (
( 361, 0.00, 0.00),
( 2955, 0.00, 3.35),
( 6630, 86.90, 6.60),
(9913, 329.45, 7.60),
('inf', 578.96, 8.75),
),
'semi-monthly': (
( 391, 0.00, 0.00),
( 3201, 0.00, 3.35),
( 7182, 94.14, 6.60),
(10739, 356.88, 7.60),
('inf', 627.21, 8.75),
),
'monthly': (
( 781, 0.00, 0.00),
( 6402, 0.00, 3.35),
(14365, 188.30, 6.60),
(21477, 713.86, 7.60),
('inf', 1254.37, 8.75),
),
'quarterly': (
( 2344, 0.00, 0.00),
(19206, 0.00, 3.35),
(43094, 564.88, 6.60),
(64431, 2141.49, 7.60),
('inf', 3763.10, 8.75),
),
'annually': (
( 9375, 0.00, 0.00),
( 76825, 0.00, 3.35),
(172375, 2259.58, 6.60),
(257725, 8565.88, 7.60),
( 'inf', 15052.48, 8.75),
),
},
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_vt_sit_tax_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_vt_dor" model="res.partner">
<field name="name">US Vermont - Employment Security Commission - Unemployment Tax</field>
</record>
<record id="res_partner_us_vt_dor_sit" model="res.partner">
<field name="name">US Vermont - Tax Commission - Income Tax</field>
</record>
<!-- Categories -->
<!-- Rules -->
<record id="hr_payroll_rule_er_us_vt_suta" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US VT Vermont State Unemployment</field>
<field name="code">ER_US_VT_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_vt_suta_wage_base', rate='us_vt_suta_rate', state_code='VT')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_vt_suta_wage_base', rate='us_vt_suta_rate', state_code='VT')</field>
<field name="partner_id" ref="res_partner_us_vt_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_ee_us_vt_sit" model="hr.salary.rule">
<field name="sequence" eval="195"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_ee_us_sit"/>
<field name="name">EE: US VT Vermont State Income Tax Withholding</field>
<field name="code">EE_US_VT_SIT</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = vt_vermont_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = vt_vermont_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="partner_id" ref="res_partner_us_vt_dor_sit"/>
<field name="appears_on_payslip" eval="True"/>
</record>
</odoo>

View File

@@ -0,0 +1,200 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base -->
<record id="rule_parameter_us_wa_suta_wage_base" model="hr.rule.parameter">
<field name="name">US WA Washington SUTA Wage Base</field>
<field name="code">us_wa_suta_wage_base</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_wa_suta_wage_base_2019" model="hr.rule.parameter.value">
<field name="parameter_value">49800.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_wa_suta_wage_base"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_wa_suta_wage_base_2020" model="hr.rule.parameter.value">
<field name="parameter_value">52700.00</field>
<field name="rule_parameter_id" ref="rule_parameter_us_wa_suta_wage_base"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_wa_fml_wage_base" model="hr.rule.parameter">
<field name="name">US WA Washington FML Wage Base</field>
<field name="code">us_wa_fml_wage_base</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_wa_fml_wage_base_2019" model="hr.rule.parameter.value">
<field name="parameter_value">132900.00</field>
<field name="rule_parameter_id" ref="rule_parameter_us_wa_fml_wage_base"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_wa_fml_wage_base_2020" model="hr.rule.parameter.value">
<field name="parameter_value">137700.00</field>
<field name="rule_parameter_id" ref="rule_parameter_us_wa_fml_wage_base"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Rate -->
<record id="rule_parameter_us_wa_suta_rate" model="hr.rule.parameter">
<field name="name">US WA Washington SUTA Rate</field>
<field name="code">us_wa_suta_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_wa_suta_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">1.18</field>
<field name="rule_parameter_id" ref="rule_parameter_us_wa_suta_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_wa_suta_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">1.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_wa_suta_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_wa_fml_rate" model="hr.rule.parameter">
<field name="name">US WA Washington FML Rate (Total)</field>
<field name="code">us_wa_fml_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_wa_fml_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">0.4</field>
<field name="rule_parameter_id" ref="rule_parameter_us_wa_fml_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_wa_fml_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">0.4</field>
<field name="rule_parameter_id" ref="rule_parameter_us_wa_fml_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_wa_fml_rate_ee" model="hr.rule.parameter">
<field name="name">US WA Washington FML Rate (Employee)</field>
<field name="code">us_wa_fml_rate_ee</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_wa_fml_rate_ee_2019" model="hr.rule.parameter.value">
<field name="parameter_value">66.33</field>
<field name="rule_parameter_id" ref="rule_parameter_us_wa_fml_rate_ee"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_wa_fml_rate_ee_2020" model="hr.rule.parameter.value">
<field name="parameter_value">66.33</field>
<field name="rule_parameter_id" ref="rule_parameter_us_wa_fml_rate_ee"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_wa_fml_rate_er" model="hr.rule.parameter">
<field name="name">US WA Washington FML Rate (Employer)</field>
<field name="code">us_wa_fml_rate_er</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_wa_fml_rate_er_2019" model="hr.rule.parameter.value">
<field name="parameter_value">33.67</field>
<field name="rule_parameter_id" ref="rule_parameter_us_wa_fml_rate_er"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_wa_fml_rate_er_2020" model="hr.rule.parameter.value">
<field name="parameter_value">33.67</field>
<field name="rule_parameter_id" ref="rule_parameter_us_wa_fml_rate_er"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_wa_dor" model="res.partner">
<field name="name">US Washington - Employment Security Department (Unemployment)</field>
</record>
<record id="res_partner_us_wa_dor_lni" model="res.partner">
<field name="name">US Washington - Department of Labor &amp; Industries</field>
</record>
<record id="res_partner_us_wa_dor_fml" model="res.partner">
<field name="name">US Washington - Employment Security Department (PFML)</field>
</record>
<!-- Categories -->
<!-- Rules -->
<record id="hr_payroll_rule_er_us_wa_suta" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US WA Washington State Unemployment (5208A/B)</field>
<field name="code">ER_US_WA_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_wa_suta_wage_base', rate='us_wa_suta_rate', state_code='WA')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_wa_suta_wage_base', rate='us_wa_suta_rate', state_code='WA')</field>
<field name="partner_id" ref="res_partner_us_wa_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_er_us_wa_fml" model="hr.salary.rule">
<field name="sequence" eval="451"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll.COMP"/>
<field name="name">ER: US WA Washington State Family Medical Leave</field>
<field name="code">ER_US_WA_FML</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = wa_washington_fml_er(payslip, categories, worked_days, inputs)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = wa_washington_fml_er(payslip, categories, worked_days, inputs)</field>
<field name="partner_id" ref="res_partner_us_wa_dor_fml"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_ee_us_wa_fml" model="hr.salary.rule">
<field name="sequence" eval="196"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll.DED"/>
<field name="name">EE: US WA Washington State Family Medical Leave</field>
<field name="code">EE_US_WA_FML</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = wa_washington_fml_ee(payslip, categories, worked_days, inputs)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = wa_washington_fml_ee(payslip, categories, worked_days, inputs)</field>
<field name="partner_id" ref="res_partner_us_wa_dor_fml"/>
<field name="appears_on_payslip" eval="True"/>
</record>
<!-- LNI May need to be updated depending on hours worked (or drywall laid) -->
<record id="hr_payroll_rule_er_us_wa_lni" model="hr.salary.rule">
<field name="sequence" eval="451"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll.COMP"/>
<field name="name">ER: US WA Washington State LNI</field>
<field name="code">ER_US_WA_LNI</field>
<field name="condition_select">python</field>
<field name="condition_python">result = is_us_state(payslip, 'WA') and payslip.contract_id.us_payroll_config_value('workers_comp_ee_code') and worked_days.WORK100 and worked_days.WORK100.number_of_hours and payslip.rule_parameter(payslip.contract_id.us_payroll_config_value('workers_comp_er_code'))</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = worked_days.WORK100.number_of_hours, -payslip.rule_parameter(payslip.contract_id.us_payroll_config_value('workers_comp_er_code'))</field>
<field name="partner_id" ref="res_partner_us_wa_dor_lni"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_ee_us_wa_lni" model="hr.salary.rule">
<field name="sequence" eval="196"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll.DED"/>
<field name="name">EE: US WA Washington State LNI</field>
<field name="code">EE_US_WA_LNI</field>
<field name="condition_select">python</field>
<field name="condition_python">result = is_us_state(payslip, 'WA') and payslip.contract_id.us_payroll_config_value('workers_comp_ee_code') and worked_days.WORK100 and worked_days.WORK100.number_of_hours and payslip.rule_parameter(payslip.contract_id.us_payroll_config_value('workers_comp_ee_code'))</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = worked_days.WORK100.number_of_hours, -payslip.rule_parameter(payslip.contract_id.us_payroll_config_value('workers_comp_ee_code'))</field>
<field name="partner_id" ref="res_partner_us_wa_dor_lni"/>
<field name="appears_on_payslip" eval="True"/>
</record>
</odoo>

View File

@@ -0,0 +1,118 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base -->
<record id="rule_parameter_us_wi_suta_wage_base" model="hr.rule.parameter">
<field name="name">US WI Wisconsin SUTA Wage Base</field>
<field name="code">us_wi_suta_wage_base</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_wi_suta_wage_base_2020" model="hr.rule.parameter.value">
<field name="parameter_value">14000.00</field>
<field name="rule_parameter_id" ref="rule_parameter_us_wi_suta_wage_base"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Rate -->
<!-- Rate based on this file https://dwd.wisconsin.gov/ui/employers/taxrates.htm -->
<record id="rule_parameter_us_wi_suta_rate" model="hr.rule.parameter">
<field name="name">US WI Wisconsin SUTA Rate</field>
<field name="code">us_wi_suta_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_wi_suta_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">3.05</field>
<field name="rule_parameter_id" ref="rule_parameter_us_wi_suta_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<record id="rule_parameter_us_wi_sit_exemption_rate" model="hr.rule.parameter">
<field name="name">US WI Wisconsin Exemption Rate</field>
<field name="code">us_wi_sit_exemption_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_wi_sit_exemption_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">22</field>
<field name="rule_parameter_id" ref="rule_parameter_us_wi_sit_exemption_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Table based on https://www.revenue.wi.gov/DOR%20Publications/pb166.pdf page 25. -->
<record id="rule_parameter_us_wi_sit_tax_rate" model="hr.rule.parameter">
<field name="name">US WI Wisconsin SIT Tax Rate</field>
<field name="code">us_wi_sit_tax_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_wi_sit_tax_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">{
'single': (
( 5730, 0.0000, 0.00),
( 15200, 4.0000, 0.00),
( 16486, 4.4800, 378.80),
( 26227, 6.5408, 436.41),
( 62950, 7.0224, 1073.55),
(240190, 6.2700, 3652.39),
( 'inf', 7.6500, 14765.34),
),
'married': (
( 7870, 0.0000, 0.00),
( 18780, 4.0000, 0.00),
( 21400, 5.8400, 436.40),
( 28308, 7.0080, 589.41),
( 60750, 7.5240, 1073.52),
(240190, 6.2700, 3514.46),
( 'inf', 7.6500, 14765.35),
),
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_wi_sit_tax_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_wi_dor" model="res.partner">
<field name="name">US Wisconsin - Department of Workforce Development - Unemployment Tax</field>
</record>
<record id="res_partner_us_wi_dor_sit" model="res.partner">
<field name="name">US Wisconsin - Department of Revenue - Income Tax</field>
</record>
<!-- Categories -->
<!-- Rules -->
<record id="hr_payroll_rule_er_us_wi_suta" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US WI Wisconsin State Unemployment</field>
<field name="code">ER_US_WI_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_wi_suta_wage_base', rate='us_wi_suta_rate', state_code='WI')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_wi_suta_wage_base', rate='us_wi_suta_rate', state_code='WI')</field>
<field name="partner_id" ref="res_partner_us_wi_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_ee_us_wi_sit" model="hr.salary.rule">
<field name="sequence" eval="195"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_ee_us_sit"/>
<field name="name">EE: US WI Wisconsin State Income Tax Withholding</field>
<field name="code">EE_US_WI_SIT</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = wi_wisconsin_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = wi_wisconsin_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="partner_id" ref="res_partner_us_wi_dor_sit"/>
<field name="appears_on_payslip" eval="True"/>
</record>
</odoo>

View File

@@ -0,0 +1,215 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base -->
<record id="rule_parameter_us_wv_suta_wage_base" model="hr.rule.parameter">
<field name="name">US WV West Virginia SUTA Wage Base</field>
<field name="code">us_wv_suta_wage_base</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_wv_suta_wage_base_2020" model="hr.rule.parameter.value">
<field name="parameter_value">12000.0</field>
<field name="rule_parameter_id" ref="rule_parameter_us_wv_suta_wage_base"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Rate -->
<record id="rule_parameter_us_wv_suta_rate" model="hr.rule.parameter">
<field name="name">US WV West Virginia SUTA Rate</field>
<field name="code">us_wv_suta_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_wv_suta_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">2.7</field>
<field name="rule_parameter_id" ref="rule_parameter_us_wv_suta_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Table base on this https://tax.wv.gov/Documents/TaxForms/it100.1a.pdf page 16-->
<record id="rule_parameter_us_wv_sit_exemption_rate" model="hr.rule.parameter">
<field name="name">US WV West Virginia Exemption Rate</field>
<field name="code">us_wv_sit_exemption_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_wv_sit_exemption_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">{
'weekly' : 38.46,
'bi-weekly' : 76.92,
'semi-monthly': 83.33,
'monthly' : 166.67,
'annually': 2000.00,
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_wv_sit_exemption_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Table base on this https://tax.wv.gov/Documents/TaxForms/it100.1a.pdf page 17-->
<record id="rule_parameter_us_wv_sit_tax_rate" model="hr.rule.parameter">
<field name="name">US WV West Virginia SIT Tax Rate</field>
<field name="code">us_wv_sit_tax_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_wv_sit_tax_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">{
'single': {
'weekly':(
( 192, 0.00, 3.0),
( 481, 5.76, 4.0),
( 769, 17.32, 4.5),
( 1154, 30.28, 6.0),
('inf', 53.38, 6.5),
),
'bi-weekly':(
( 385, 0.00, 3.0),
( 962, 11.55, 4.0),
( 1538, 34.63, 4.5),
( 2308, 60.55, 6.0),
('inf', 106.75, 6.5),
),
'semi-monthly':(
( 417, 0.00, 3.0),
( 1042 , 12.51, 4.0),
( 1667, 37.51, 4.5),
( 2500, 65.64, 6.0),
('inf', 115.62, 6.5),
),
'monthly':(
( 833, 0.00, 3.0),
( 2083, 24.99, 4.0),
( 3333, 74.99, 4.5),
( 5000, 131.24, 6.0),
('inf', 231.26, 6.5),
),
'annually':(
( 10000, 0.00, 3.0),
( 25000, 300.00, 4.0),
( 40000, 900.00, 4.5),
( 60000, 1575.00, 6.0),
( 'inf', 2775.00, 6.5),
),
},
'married': {
'weekly':(
( 115, 0.00, 3.0),
( 288, 3.45, 4.0),
( 462, 10.37, 4.5),
( 692, 18.20, 6.0),
('inf', 32.00, 6.5),
),
'bi-weekly':(
( 231, 0.00, 3.0),
( 577, 6.93, 4.0),
( 923, 20.77, 4.5),
( 1385, 36.34, 6.0),
('inf', 64.06, 6.5),
),
'semi-monthly':(
( 250, 0.00, 3.0),
( 625, 7.50, 4.0),
( 1000, 22.50, 4.5),
( 1500, 39.38, 6.0),
('inf', 69.38, 6.5),
),
'monthly':(
( 500, 0.00, 3.0),
( 1250, 15.00, 4.0),
( 2000, 45.00, 4.5),
( 3000, 78.75, 6.0),
('inf', 138.75, 6.5),
),
'annually':(
( 6000, 0.00, 3.0),
(15000, 180.00, 4.0),
(24000, 540.00, 4.5),
(36000, 945.00, 6.0),
('inf', 1665.00, 6.5),
),
},
'head_household': {
'weekly':(
( 192, 0.00, 3.0),
( 481, 5.76, 4.0),
( 769, 17.32, 4.5),
( 1154, 30.28, 6.0),
('inf', 53.38, 6.5),
),
'bi-weekly':(
( 385, 0.00, 3.0),
( 962, 11.55, 4.0),
( 1538, 34.63, 4.5),
( 2308, 60.55, 6.0),
('inf', 106.75, 6.5),
),
'semi-monthly':(
( 417, 0.00, 3.0),
( 1042, 12.51, 4.0),
( 1667, 37.51, 4.5),
( 2500, 65.64, 6.0),
('inf', 115.62, 6.5),
),
'monthly':(
( 833, 0.00, 3.0),
( 2083, 24.99, 4.0),
( 3333, 74.99, 4.5),
( 5000, 131.24, 6.0),
('inf', 231.26, 6.5),
),
'annually':(
( 10000, 0.00, 3.0),
( 25000, 300.00, 4.0),
( 40000, 900.00, 4.5),
( 60000, 1575.00, 6.0),
( 'inf', 2775.00, 6.5),
),
},
}</field>
<field name="rule_parameter_id" ref="rule_parameter_us_wv_sit_tax_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_wv_dor" model="res.partner">
<field name="name">US West Virginia - WorkForce - Unemployment Tax</field>
</record>
<record id="res_partner_us_wv_dor_sit" model="res.partner">
<field name="name">US West Virginia - Department of Revenue - Income Tax</field>
</record>
<!-- Categories -->
<!-- Rules -->
<record id="hr_payroll_rule_er_us_wv_suta" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US WV West Virginia State Unemployment</field>
<field name="code">ER_US_WV_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_wv_suta_wage_base', rate='us_wv_suta_rate', state_code='WV')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_wv_suta_wage_base', rate='us_wv_suta_rate', state_code='WV')</field>
<field name="partner_id" ref="res_partner_us_wv_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_ee_us_wv_sit" model="hr.salary.rule">
<field name="sequence" eval="195"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_ee_us_sit"/>
<field name="name">EE: US WV West Virginia State Income Tax Withholding</field>
<field name="code">EE_US_WV_SIT</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = wv_west_virginia_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = wv_west_virginia_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="partner_id" ref="res_partner_us_wv_dor_sit"/>
<field name="appears_on_payslip" eval="True"/>
</record>
</odoo>

View File

@@ -0,0 +1,61 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base -->
<record id="rule_parameter_us_wy_suta_wage_base" model="hr.rule.parameter">
<field name="name">US WY Wyoming SUTA Wage Base</field>
<field name="code">us_wy_suta_wage_base</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_wy_suta_wage_base_2019" model="hr.rule.parameter.value">
<field name="parameter_value">25400.00</field>
<field name="rule_parameter_id" ref="rule_parameter_us_wy_suta_wage_base"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_wy_suta_wage_base_2020" model="hr.rule.parameter.value">
<field name="parameter_value">26400.00</field>
<field name="rule_parameter_id" ref="rule_parameter_us_wy_suta_wage_base"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Rate -->
<record id="rule_parameter_us_wy_suta_rate" model="hr.rule.parameter">
<field name="name">US WY Wyoming SUTA Rate</field>
<field name="code">us_wy_suta_rate</field>
<field name="country_id" ref="base.us"/>
</record>
<data noupdate="1">
<record id="rule_parameter_us_wy_suta_rate_2019" model="hr.rule.parameter.value">
<field name="parameter_value">2.10</field>
<field name="rule_parameter_id" ref="rule_parameter_us_wy_suta_rate"/>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_wy_suta_rate_2020" model="hr.rule.parameter.value">
<field name="parameter_value">8.5</field>
<field name="rule_parameter_id" ref="rule_parameter_us_wy_suta_rate"/>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_wy_dor" model="res.partner">
<field name="name">US Wyoming - Department of Workforce Services (WDWS) - Unemployment Tax</field>
</record>
<!-- Rules -->
<record id="hr_payroll_rule_er_us_wy_suta" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="struct_id" ref="hr_payroll_structure"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US WY Wyoming State Unemployment</field>
<field name="code">ER_US_WY_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_wy_suta_wage_base', rate='us_wy_suta_rate', state_code='WY')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_wy_suta_wage_base', rate='us_wy_suta_rate', state_code='WY')</field>
<field name="partner_id" ref="res_partner_us_wy_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
</odoo>

View File

@@ -0,0 +1,30 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
import odoo
def migrate(cr, version):
"""
Post-migration no contracts will have any structure types.
Unfortunately, we have no way of knowing if they used USA in the past
so we have to just assume they did (knowing of course that l10n_us_hr_payroll was installed)...
"""
env = odoo.api.Environment(cr, odoo.SUPERUSER_ID, {})
structure_type = env.ref('l10n_us_hr_payroll.structure_type_employee')
cr.execute("UPDATE hr_contract "
"SET structure_type_id = %s "
"WHERE structure_type_id is null AND state in ('draft', 'open')", (structure_type.id, ))
"""
Additionally, it is known that post-migration databases will have bad
work entry record states (and you will spend time trying to fix them
before you could run a payroll batch).
"""
default_work_entry_type = env.ref('hr_work_entry.work_entry_type_attendance', raise_if_not_found=False)
if default_work_entry_type:
cr.execute("UPDATE hr_work_entry "
"SET work_entry_type_id = %s "
"WHERE work_entry_type_id is null", (default_work_entry_type.id, ))
cr.execute("UPDATE hr_work_entry "
"SET state = 'draft' "
"WHERE state = 'conflict'")

View File

@@ -0,0 +1,26 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
import odoo
def migrate(cr, version):
"""
Salary Rules can be archived by Odoo S.A. during migration.
This leaves them archived after the migration, and even un-archiving them
is not enough because they will then be pointed to a "migrated" structure.
"""
env = odoo.api.Environment(cr, odoo.SUPERUSER_ID, {})
xml_refs = env['ir.model.data'].search([
('module', '=', 'l10n_us_hr_payroll'),
('model', '=', 'hr.salary.rule'),
])
# I don't know why Odoo makes these non-updatable...
xml_refs.write({'noupdate': False})
rule_ids = xml_refs.mapped('res_id')
rules = env['hr.salary.rule'].browse(rule_ids)
rules.write({'active': True})
# Cannot add new selection type without fixing missing
cr.execute('UPDATE hr_payroll_structure SET schedule_pay = \'monthly\' WHERE schedule_pay is null;')
cr.execute('UPDATE hr_payroll_structure_type SET default_schedule_pay = \'monthly\' WHERE default_schedule_pay is null;')

View File

@@ -0,0 +1,6 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from . import hr_contract
from . import hr_payslip
from . import update
from . import us_payroll_config

View File

@@ -0,0 +1 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.

View File

@@ -0,0 +1,79 @@
# 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.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.contract_id.futa_type == payslip.contract_id.FUTA_TYPE_EXEMPT:
# Exit early
return 0.0, 0.0
elif payslip.contract_id.futa_type == payslip.contract_id.FUTA_TYPE_BASIC:
result_rate = -payslip.rule_parameter('fed_940_futa_rate_basic')
else:
result_rate = -payslip.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.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

View File

@@ -0,0 +1,320 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
# import logging
# _logger = logging.getLogger(__name__)
def fica_wage(payslip, categories):
"""
Returns FICA eligible wage for current Payslip (no wage_base, just by categories)
WAGE = GROSS - ALW_FICA_EXEMPT + DED_FICA_EXEMPT
:return: wage
"""
wage = categories.GROSS
less_exempt = categories.ALW_FICA_EXEMPT + \
categories.ALW_FIT_FICA_EXEMPT + \
categories.ALW_FIT_FICA_FUTA_EXEMPT + \
categories.ALW_FICA_FUTA_EXEMPT
plus_exempt = categories.DED_FICA_EXEMPT + \
categories.DED_FIT_FICA_EXEMPT + \
categories.DED_FIT_FICA_FUTA_EXEMPT + \
categories.DED_FICA_FUTA_EXEMPT
# _logger.info('fica wage GROSS: %0.2f less exempt ALW: %0.2f plus exempt DED: %0.2f' % (wage, less_exempt, plus_exempt))
return wage - less_exempt + plus_exempt
def fica_wage_ytd(payslip, categories):
"""
Returns Year to Date FICA eligible wages
WAGE = GROSS - ALW_FICA_EXEMPT + DED_FICA_EXEMPT
:return: wage
"""
year = payslip.dict.get_year()
ytd_wage = payslip.sum_category('GROSS', str(year) + '-01-01', str(year+1) + '-01-01')
less_exempt = payslip.sum_category('ALW_FICA_EXEMPT', str(year) + '-01-01', str(year+1) + '-01-01') + \
payslip.sum_category('ALW_FIT_FICA_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')
plus_exempt = payslip.sum_category('DED_FICA_EXEMPT', str(year) + '-01-01', str(year+1) + '-01-01') + \
payslip.sum_category('DED_FIT_FICA_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')
external_wages = payslip.dict.contract_id.external_wages
# _logger.info('fica ytd wage GROSS: %0.2f less exempt ALW: %0.2f plus exempt DED: %0.2f plus external: %0.2f' % (ytd_wage, less_exempt, plus_exempt, external_wages))
return ytd_wage - less_exempt + plus_exempt + external_wages
def ee_us_941_fica_ss(payslip, categories, worked_days, inputs):
"""
Returns FICA Social Security eligible wage and rate.
:return: result, result_rate (wage, percent)
"""
exempt = payslip.contract_id.us_payroll_config_value('fed_941_fica_exempt')
if exempt:
return 0.0, 0.0
# Determine Rate.
result_rate = -payslip.rule_parameter('fed_941_fica_ss_rate')
# Determine Wage
wage = fica_wage(payslip, categories)
if not wage:
return 0.0, 0.0
ytd_wage = fica_wage_ytd(payslip, categories)
wage_base = payslip.rule_parameter('fed_941_fica_ss_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
er_us_941_fica_ss = ee_us_941_fica_ss
def ee_us_941_fica_m(payslip, categories, worked_days, inputs):
"""
Returns FICA Medicare eligible wage and rate.
:return: result, result_rate (wage, percent)
"""
exempt = payslip.contract_id.us_payroll_config_value('fed_941_fica_exempt')
if exempt:
return 0.0, 0.0
# Determine Rate.
result_rate = -payslip.rule_parameter('fed_941_fica_m_rate')
# Determine Wage
wage = fica_wage(payslip, categories)
if not wage:
return 0.0, 0.0
ytd_wage = fica_wage_ytd(payslip, categories)
wage_base = float(payslip.rule_parameter('fed_941_fica_m_wage_base')) # inf
remaining = wage_base - ytd_wage
if remaining < 0.0:
result = 0.0
elif remaining < wage:
result = remaining
else:
result = wage
return result, result_rate
er_us_941_fica_m = ee_us_941_fica_m
def ee_us_941_fica_m_add(payslip, categories, worked_days, inputs):
"""
Returns FICA Medicare Additional eligible wage and rate.
:return: result, result_rate (wage, percent)
"""
exempt = payslip.contract_id.us_payroll_config_value('fed_941_fica_exempt')
if exempt:
return 0.0, 0.0
# Determine Rate.
result_rate = -payslip.rule_parameter('fed_941_fica_m_add_rate')
# Determine Wage
wage = fica_wage(payslip, categories)
if not wage:
return 0.0, 0.0
ytd_wage = fica_wage_ytd(payslip, categories)
wage_start = payslip.rule_parameter('fed_941_fica_m_add_wage_start')
existing_wage = ytd_wage - wage_start
if existing_wage >= 0.0:
result = wage
elif wage + existing_wage > 0.0:
result = wage + existing_wage
else:
result = 0.0
return result, result_rate
def fit_wage(payslip, categories):
"""
Returns FIT eligible wage for current Payslip (no wage_base, just by categories)
WAGE = GROSS - ALW_FIT_EXEMPT + DED_FIT_EXEMPT
:return: wage
"""
wage = categories.GROSS
wage -= categories.ALW_FIT_EXEMPT + \
categories.ALW_FIT_FICA_EXEMPT + \
categories.ALW_FIT_FICA_FUTA_EXEMPT + \
categories.ALW_FIT_FUTA_EXEMPT
wage += categories.DED_FIT_EXEMPT + \
categories.DED_FIT_FICA_EXEMPT + \
categories.DED_FIT_FICA_FUTA_EXEMPT + \
categories.DED_FIT_FUTA_EXEMPT
return wage
def fit_wage_ytd(payslip, categories):
"""
Returns Year to Date FIT eligible wages
WAGE = GROSS - ALW_FIT_EXEMPT + DED_FIT_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_FIT_EXEMPT', str(year) + '-01-01', str(year+1) + '-01-01') + \
payslip.sum_category('ALW_FIT_FICA_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_FIT_FUTA_EXEMPT', str(year) + '-01-01', str(year+1) + '-01-01')
ytd_wage += payslip.sum_category('DED_FIT_EXEMPT', str(year) + '-01-01', str(year+1) + '-01-01') + \
payslip.sum_category('DED_FIT_FICA_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_FIT_FUTA_EXEMPT', str(year) + '-01-01', str(year+1) + '-01-01')
ytd_wage += payslip.contract_id.external_wages
return ytd_wage
# Federal Income Tax
def ee_us_941_fit(payslip, categories, worked_days, inputs):
"""
Returns Wage and rate that is computed given the amount to withhold.
:return: result, result_rate (wage, percent)
"""
filing_status = payslip.contract_id.us_payroll_config_value('fed_941_fit_w4_filing_status')
if not filing_status:
return 0.0, 0.0
schedule_pay = payslip.contract_id.schedule_pay
wage = fit_wage(payslip, categories)
if not wage:
return 0.0, 0.0
#_logger.warn('initial gross wage: ' + str(wage))
year = payslip.dict.get_year()
if year >= 2020:
# Large changes in Federal Income Tax in 2020 and the W4
# We will assume that your W4 is the 2020 version
# Steps are from IRS Publication 15-T
#
# Step 1
working_wage = wage
is_nra = payslip.contract_id.us_payroll_config_value('fed_941_fit_w4_is_nonresident_alien')
if is_nra:
nra_table = payslip.rule_parameter('fed_941_fit_nra_additional')
working_wage += nra_table.get(schedule_pay, 0.0)
#_logger.warn(' is_nrm after wage: ' + str(working_wage))
pay_periods = payslip.dict.get_pay_periods_in_year()
wage_annual = pay_periods * working_wage
#_logger.warn('annual wage: ' + str(wage_annual))
wage_annual += payslip.contract_id.us_payroll_config_value('fed_941_fit_w4_other_income')
#_logger.warn(' after other income: ' + str(wage_annual))
deductions = payslip.contract_id.us_payroll_config_value('fed_941_fit_w4_deductions')
#_logger.warn('deductions from W4: ' + str(deductions))
higher_rate_type = payslip.contract_id.us_payroll_config_value('fed_941_fit_w4_multiple_jobs_higher')
if not higher_rate_type:
deductions += 12900.0 if filing_status == 'married' else 8600.0
#_logger.warn(' deductions after standard deduction: ' + str(deductions))
adjusted_wage_annual = wage_annual - deductions
if adjusted_wage_annual < 0.0:
adjusted_wage_annual = 0.0
#_logger.warn('adusted annual wage: ' + str(adjusted_wage_annual))
# Step 2
if filing_status == 'single':
tax_tables = payslip.rule_parameter('fed_941_fit_table_single')
elif filing_status == 'married':
tax_tables = payslip.rule_parameter('fed_941_fit_table_married')
else:
# married_as_single for historic reasons
tax_tables = payslip.rule_parameter('fed_941_fit_table_hh')
if higher_rate_type:
tax_table = tax_tables['higher']
else:
tax_table = tax_tables['standard']
selected_row = None
for row in tax_table:
if row[0] <= adjusted_wage_annual:
selected_row = row
else:
# First row where wage is higher than adjusted_wage_annual
break
wage_threshold, base_withholding_amount, marginal_rate = selected_row
#_logger.warn(' selected row: ' + str(selected_row))
working_wage = adjusted_wage_annual - wage_threshold
tentative_withholding_amount = (working_wage * marginal_rate) + base_withholding_amount
tentative_withholding_amount = tentative_withholding_amount / pay_periods
#_logger.warn('tenative withholding amount: ' + str(tentative_withholding_amount))
# Step 3
dependent_credit = payslip.contract_id.us_payroll_config_value('fed_941_fit_w4_dependent_credit')
dependent_credit = dependent_credit / pay_periods
#_logger.warn('dependent credit (per period): ' + str(dependent_credit))
tentative_withholding_amount -= dependent_credit
if tentative_withholding_amount < 0.0:
tentative_withholding_amount = 0.0
# Step 4
withholding_amount = tentative_withholding_amount + payslip.contract_id.us_payroll_config_value('fed_941_fit_w4_additional_withholding')
#_logger.warn('final withholding amount: ' + str(withholding_amount))
# Ideally we would set the 'taxable wage' as the result and compute the percentage tax.
# This is off by 1 penny across our tests, but I feel like it is worth it for the added reporting.
# - Jared Kipe 2019 during Odoo 13.0 rewrite.
#
# return -withholding_amount, 100.0
return wage, -(withholding_amount / wage * 100.0)
else:
working_wage = wage
is_nra = payslip.contract_id.us_payroll_config_value('fed_941_fit_w4_is_nonresident_alien')
if is_nra:
nra_table = payslip.rule_parameter('fed_941_fit_nra_additional')
working_wage += nra_table[schedule_pay]
allowance_table = payslip.rule_parameter('fed_941_fit_allowance')
allowances = payslip.contract_id.us_payroll_config_value('fed_941_fit_w4_allowances')
working_wage -= allowance_table[schedule_pay] * allowances
tax = 0.0
last_limit = 0.0
if filing_status == 'married':
tax_table = payslip.rule_parameter('fed_941_fit_table_married')
else:
tax_table = payslip.rule_parameter('fed_941_fit_table_single')
for row in tax_table[schedule_pay]:
limit, base, percent = row
limit = float(limit) # 'inf'
if working_wage <= limit:
tax = base + ((working_wage - last_limit) * (percent / 100.0))
break
last_limit = limit
tax += payslip.contract_id.us_payroll_config_value('fed_941_fit_w4_additional_withholding')
# Ideally we would set the 'taxable wage' as the result and compute the percentage tax.
# This is off by 1 penny across our tests, but I feel like it is worth it for the added reporting.
# - Jared Kipe 2019 during Odoo 13.0 rewrite.
#
# return -tax, 100.0
return wage, -(tax / wage * 100.0)

View File

@@ -0,0 +1,23 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from odoo import api, fields, models
from .us_payroll_config import FUTA_TYPE_NORMAL, \
FUTA_TYPE_BASIC, \
FUTA_TYPE_EXEMPT
class USHRContract(models.Model):
_inherit = 'hr.contract'
FUTA_TYPE_NORMAL = FUTA_TYPE_NORMAL
FUTA_TYPE_BASIC = FUTA_TYPE_BASIC
FUTA_TYPE_EXEMPT = FUTA_TYPE_EXEMPT
us_payroll_config_id = fields.Many2one('hr.contract.us_payroll_config', 'Payroll Forms')
external_wages = fields.Float(string='External Existing Wages')
# Simplified fields for easier rules, state code will exempt based on contract's futa_type
futa_type = fields.Selection(related='us_payroll_config_id.fed_940_type')
def us_payroll_config_value(self, name):
return self.us_payroll_config_id[name]

View File

@@ -0,0 +1,128 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from odoo import api, fields, models
from .federal.fed_940 import er_us_940_futa
from .federal.fed_941 import ee_us_941_fica_ss, \
ee_us_941_fica_m, \
ee_us_941_fica_m_add,\
er_us_941_fica_ss, \
er_us_941_fica_m, \
ee_us_941_fit
from .state.general import general_state_unemployment, \
general_state_income_withholding, \
is_us_state
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.co_colorado import co_colorado_state_income_withholding
from .state.ct_connecticut import ct_connecticut_state_income_withholding
from .state.de_delaware import de_delaware_state_income_withholding
from .state.ga_georgia import ga_georgia_state_income_withholding
from .state.hi_hawaii import hi_hawaii_state_income_withholding
from .state.ia_iowa import ia_iowa_state_income_withholding
from .state.id_idaho import id_idaho_state_income_withholding
from .state.il_illinois import il_illinois_state_income_withholding
from .state.in_indiana import in_indiana_state_income_withholding
from .state.ks_kansas import ks_kansas_state_income_withholding
from .state.ky_kentucky import ky_kentucky_state_income_withholding
from .state.la_louisiana import la_louisiana_state_income_withholding
from .state.me_maine import me_maine_state_income_withholding
from .state.mi_michigan import mi_michigan_state_income_withholding
from .state.mn_minnesota import mn_minnesota_state_income_withholding
from .state.mo_missouri import mo_missouri_state_income_withholding
from .state.ms_mississippi import ms_mississippi_state_income_withholding
from .state.mt_montana import mt_montana_state_income_withholding
from .state.nc_northcarolina import nc_northcarolina_state_income_withholding
from .state.nd_north_dakota import nd_north_dakota_state_income_withholding
from .state.ne_nebraska import ne_nebraska_state_income_withholding
from .state.nj_newjersey import nj_newjersey_state_income_withholding
from .state.nm_new_mexico import nm_new_mexico_state_income_withholding
from .state.ny_new_york import ny_new_york_state_income_withholding
from .state.oh_ohio import oh_ohio_state_income_withholding
from .state.ok_oklahoma import ok_oklahoma_state_income_withholding
from .state.ri_rhode_island import ri_rhode_island_state_income_withholding
from .state.sc_south_carolina import sc_south_carolina_state_income_withholding
from .state.ut_utah import ut_utah_state_income_withholding
from .state.vt_vermont import vt_vermont_state_income_withholding
from .state.va_virginia import va_virginia_state_income_withholding
from .state.wa_washington import wa_washington_fml_er, \
wa_washington_fml_ee
from .state.wi_wisconsin import wi_wisconsin_state_income_withholding
from .state.wv_west_virginia import wv_west_virginia_state_income_withholding
class HRPayslip(models.Model):
_inherit = 'hr.payslip'
# From IRS Publication 15-T or logically (annually, bi-monthly)
PAY_PERIODS_IN_YEAR = {
'annually': 1,
'semi-annually': 2,
'quarterly': 4,
'bi-monthly': 6,
'monthly': 12,
'semi-monthly': 24,
'bi-weekly': 26,
'weekly': 52,
'daily': 260,
}
def _get_base_local_dict(self):
res = super()._get_base_local_dict()
res.update({
'er_us_940_futa': er_us_940_futa,
'ee_us_941_fica_ss': ee_us_941_fica_ss,
'ee_us_941_fica_m': ee_us_941_fica_m,
'ee_us_941_fica_m_add': ee_us_941_fica_m_add,
'er_us_941_fica_ss': er_us_941_fica_ss,
'er_us_941_fica_m': er_us_941_fica_m,
'ee_us_941_fit': ee_us_941_fit,
'general_state_unemployment': general_state_unemployment,
'general_state_income_withholding': general_state_income_withholding,
'is_us_state': is_us_state,
'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,
'co_colorado_state_income_withholding': co_colorado_state_income_withholding,
'ct_connecticut_state_income_withholding': ct_connecticut_state_income_withholding,
'de_delaware_state_income_withholding': de_delaware_state_income_withholding,
'ga_georgia_state_income_withholding': ga_georgia_state_income_withholding,
'hi_hawaii_state_income_withholding': hi_hawaii_state_income_withholding,
'ia_iowa_state_income_withholding': ia_iowa_state_income_withholding,
'id_idaho_state_income_withholding': id_idaho_state_income_withholding,
'il_illinois_state_income_withholding': il_illinois_state_income_withholding,
'in_indiana_state_income_withholding': in_indiana_state_income_withholding,
'ks_kansas_state_income_withholding': ks_kansas_state_income_withholding,
'ky_kentucky_state_income_withholding':ky_kentucky_state_income_withholding,
'la_louisiana_state_income_withholding': la_louisiana_state_income_withholding,
'me_maine_state_income_withholding': me_maine_state_income_withholding,
'mi_michigan_state_income_withholding': mi_michigan_state_income_withholding,
'mn_minnesota_state_income_withholding': mn_minnesota_state_income_withholding,
'mo_missouri_state_income_withholding': mo_missouri_state_income_withholding,
'ms_mississippi_state_income_withholding': ms_mississippi_state_income_withholding,
'mt_montana_state_income_withholding': mt_montana_state_income_withholding,
'nc_northcarolina_state_income_withholding': nc_northcarolina_state_income_withholding,
'nd_north_dakota_state_income_withholding': nd_north_dakota_state_income_withholding,
'ne_nebraska_state_income_withholding': ne_nebraska_state_income_withholding,
'nj_newjersey_state_income_withholding': nj_newjersey_state_income_withholding,
'nm_new_mexico_state_income_withholding': nm_new_mexico_state_income_withholding,
'ny_new_york_state_income_withholding': ny_new_york_state_income_withholding,
'oh_ohio_state_income_withholding': oh_ohio_state_income_withholding,
'ok_oklahoma_state_income_withholding': ok_oklahoma_state_income_withholding,
'ri_rhode_island_state_income_withholding': ri_rhode_island_state_income_withholding,
'sc_south_carolina_state_income_withholding': sc_south_carolina_state_income_withholding,
'ut_utah_state_income_withholding': ut_utah_state_income_withholding,
'vt_vermont_state_income_withholding': vt_vermont_state_income_withholding,
'va_virginia_state_income_withholding': va_virginia_state_income_withholding,
'wa_washington_fml_er': wa_washington_fml_er,
'wa_washington_fml_ee': wa_washington_fml_ee,
'wi_wisconsin_state_income_withholding': wi_wisconsin_state_income_withholding,
'wv_west_virginia_state_income_withholding': wv_west_virginia_state_income_withholding,
})
return res
def get_pay_periods_in_year(self):
return self.PAY_PERIODS_IN_YEAR.get(self.contract_id.schedule_pay, 0)

View File

@@ -0,0 +1 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.

View File

@@ -0,0 +1,80 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from .general import _state_applies, sit_wage
def al_alabama_state_income_withholding(payslip, categories, worked_days, inputs):
"""
Returns SIT eligible wage and rate.
:return: result, result_rate (wage, percent)
"""
state_code = 'AL'
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
exemptions = payslip.contract_id.us_payroll_config_value('al_a4_sit_exemptions')
if not exemptions:
return 0.0, 0.0
personal_exempt = payslip.contract_id.us_payroll_config_value('state_income_tax_exempt')
if personal_exempt:
return 0.0, 0.0
pay_periods = payslip.dict.get_pay_periods_in_year()
additional = payslip.contract_id.us_payroll_config_value('state_income_tax_additional_withholding')
tax_table = payslip.rule_parameter('us_al_sit_tax_rate')
dependent_rate = payslip.rule_parameter('us_al_sit_dependent_rate')
standard_deduction = payslip.rule_parameter('us_al_sit_standard_deduction_rate').get(exemptions, 0.0)
personal_exemption = payslip.rule_parameter('us_al_sit_personal_exemption_rate').get(exemptions, 0.0)
dependent = payslip.contract_id.us_payroll_config_value('al_a4_sit_dependents')
fed_withholding = categories.EE_US_941_FIT
annual_wage = wage * pay_periods
standard_deduction_amt = 0.0
personal_exemption_amt = 0.0
dependent_amt = 0.0
withholding = 0.0
if standard_deduction:
row = standard_deduction
last_amt = 0.0
for data in row:
if annual_wage < float(data[0]):
if len(data) > 3:
increment_count = (- (wage - last_amt) // data[3])
standard_deduction_amt = data[1] - (increment_count * data[2])
else:
standard_deduction_amt = data[1]
else:
last_amt = data[0]
after_deduction = annual_wage - standard_deduction_amt
after_fed_withholding = (fed_withholding * pay_periods) + after_deduction
if not personal_exempt:
personal_exemption_amt = personal_exemption
after_personal_exemption = after_fed_withholding - personal_exemption_amt
for row in dependent_rate:
if annual_wage < float(row[1]):
dependent_amt = row[0] * dependent
break
taxable_amount = after_personal_exemption - dependent_amt
last = 0.0
tax_table = tax_table['M'] if exemptions == 'M' else tax_table['0']
for row in tax_table:
if taxable_amount < float(row[0]):
withholding = withholding + ((taxable_amount - last) * (row[1] / 100))
break
withholding = withholding + ((row[0] - last) * (row[1] / 100))
last = row[0]
if withholding < 0.0:
withholding = 0.0
withholding /= pay_periods
withholding += additional
return wage, -((withholding / wage) * 100.0)

View File

@@ -0,0 +1,47 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from .general import _state_applies, sit_wage
def ar_arkansas_state_income_withholding(payslip, categories, worked_days, inputs):
"""
Returns SIT eligible wage and rate.
:return: result, result_rate (wage, percent)
"""
state_code = 'AR'
if not _state_applies(payslip, state_code):
return 0.0, 0.0
if payslip.contract_id.us_payroll_config_value('state_income_tax_exempt'):
return 0.0, 0.0
# Determine Wage
wage = sit_wage(payslip, categories)
if not wage:
return 0.0, 0.0
pay_periods = payslip.dict.get_pay_periods_in_year()
additional = payslip.contract_id.us_payroll_config_value('state_income_tax_additional_withholding')
sit_tax_rate = payslip.rule_parameter('us_ar_sit_tax_rate')
standard_deduction = payslip.rule_parameter('us_ar_sit_standard_deduction_rate')
allowances = payslip.contract_id.us_payroll_config_value('ar_ar4ec_sit_allowances')
allowances_amt = allowances * 26.0
taxable_income = (wage * pay_periods) - standard_deduction
if taxable_income < 87001.0:
taxable_income = (taxable_income // 50) * 50.0 + 50.0
withholding = 0.0
for row in sit_tax_rate:
cap, rate, adjust_amount = row
cap = float(cap)
if cap > taxable_income:
withholding = (((rate / 100.0) * taxable_income) - adjust_amount) - allowances_amt
break
# In case withholding or taxable_income is negative
withholding = max(withholding, 0.0)
withholding = round(withholding / pay_periods)
withholding += additional
return wage, -((withholding / wage) * 100.0)

View File

@@ -0,0 +1,35 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from .general import _state_applies, sit_wage
def az_arizona_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 = 'AZ'
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
schedule_pay = payslip.contract_id.schedule_pay
additional = payslip.contract_id.us_payroll_config_value('state_income_tax_additional_withholding')
withholding_percent = payslip.contract_id.us_payroll_config_value('az_a4_sit_withholding_percentage')
if withholding_percent <= 0.0:
return 0.0, 0.0
wh_percentage = withholding_percent / 100.0
withholding = wage * wh_percentage
if withholding < 0.0:
withholding = 0.0
withholding += additional
return wage, -((withholding / wage) * 100.0)

View 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)

View File

@@ -0,0 +1,45 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from .general import _state_applies, sit_wage
def co_colorado_state_income_withholding(payslip, categories, worked_days, inputs):
"""
Returns SIT eligible wage and rate.
:return: result, result_rate (wage, percent)
"""
state_code = 'CO'
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('fed_941_fit_w4_filing_status')
if not filing_status:
return 0.0, 0.0
state_exempt = payslip.contract_id.us_payroll_config_value('state_income_tax_exempt')
if state_exempt:
return 0.0, 0.0
pay_periods = payslip.dict.get_pay_periods_in_year()
additional = payslip.contract_id.us_payroll_config_value('state_income_tax_additional_withholding')
exemption_rate = payslip.rule_parameter('us_co_sit_exemption_rate')
tax_rate = payslip.rule_parameter('us_co_sit_tax_rate')
taxable_income = wage * pay_periods
if filing_status == 'married':
taxable_income -= exemption_rate * 2
else:
taxable_income -= exemption_rate
withholding = taxable_income * (tax_rate / 100)
withholding = max(withholding, 0.0)
withholding = withholding / pay_periods
withholding += additional
return wage, -((withholding / wage) * 100.0)

View File

@@ -0,0 +1,76 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from .general import _state_applies, sit_wage
def ct_connecticut_state_income_withholding(payslip, categories, worked_days, inputs):
"""
Returns SIT eligible wage and rate.
:return: result, result_rate (wage, percent)
"""
state_code = 'CT'
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
pay_periods = payslip.dict.get_pay_periods_in_year()
additional = payslip.contract_id.us_payroll_config_value('state_income_tax_additional_withholding')
withholding_code = payslip.contract_id.us_payroll_config_value('ct_w4na_sit_code')
exemption_table = payslip.rule_parameter('us_ct_sit_personal_exemption_rate').get(withholding_code, [('inf', 0.0)])
initial_tax_tbl = payslip.rule_parameter('us_ct_sit_initial_tax_rate').get(withholding_code, [('inf', 0.0, 0.0)])
tax_table = payslip.rule_parameter('us_ct_sit_tax_rate').get(withholding_code, [('inf', 0.0)])
recapture_table = payslip.rule_parameter('us_ct_sit_recapture_rate').get(withholding_code, [('inf', 0.0)])
decimal_table = payslip.rule_parameter('us_ct_sit_decimal_rate').get(withholding_code, [('inf', 0.0)])
annual_wages = wage * pay_periods
personal_exemption = 0.0
for bracket in exemption_table:
if annual_wages <= float(bracket[0]):
personal_exemption = bracket[1]
break
withholding = 0.0
taxable_income = annual_wages - personal_exemption
if taxable_income < 0.0:
taxable_income = 0.0
if taxable_income:
initial_tax = 0.0
last = 0.0
for bracket in initial_tax_tbl:
if taxable_income <= float(bracket[0]):
initial_tax = bracket[1] + ((bracket[2] / 100.0) * (taxable_income - last))
break
last = bracket[0]
tax_add_back = 0.0
for bracket in tax_table:
if annual_wages <= float(bracket[0]):
tax_add_back = bracket[1]
break
recapture_amount = 0.0
for bracket in recapture_table:
if annual_wages <= float(bracket[0]):
recapture_amount = bracket[1]
break
withholding = initial_tax + tax_add_back + recapture_amount
decimal_amount = 1.0
for bracket in decimal_table:
if annual_wages <= float(bracket[0]):
decimal_amount= bracket[1]
break
withholding = withholding * (1.00 - decimal_amount)
if withholding < 0.0:
withholding = 0.0
withholding /= pay_periods
withholding += additional
return wage, -((withholding / wage) * 100.0)

View File

@@ -0,0 +1,49 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from .general import _state_applies, sit_wage
def de_delaware_state_income_withholding(payslip, categories, worked_days, inputs):
"""
Returns SIT eligible wage and rate.
:return: result, result_rate (wage, percent)
"""
state_code = 'DE'
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('de_w4_sit_filing_status')
if not filing_status:
return 0.0, 0.0
pay_periods = payslip.dict.get_pay_periods_in_year()
additional = payslip.contract_id.us_payroll_config_value('state_income_tax_additional_withholding')
tax_table = payslip.rule_parameter('us_de_sit_tax_rate')
personal_exemption = payslip.rule_parameter('us_de_sit_personal_exemption_rate')
allowances = payslip.contract_id.us_payroll_config_value('de_w4_sit_dependent')
standard_deduction = payslip.rule_parameter('us_de_sit_standard_deduction_rate')
taxable_income = wage * pay_periods
if filing_status == 'single':
taxable_income -= standard_deduction
else:
taxable_income -= standard_deduction * 2
withholding = 0.0
last = 0.0
for row in tax_table:
if taxable_income <= float(row[0]):
withholding = (row[1] + ((row[2] / 100.0) * (taxable_income - last)) - (allowances * personal_exemption))
break
last = row[0]
withholding = max(withholding, 0.0)
withholding = withholding / pay_periods
withholding += additional
return wage, -((withholding / wage) * 100.0)

View File

@@ -0,0 +1,51 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from .general import _state_applies, sit_wage
def ga_georgia_state_income_withholding(payslip, categories, worked_days, inputs):
"""
Returns SIT eligible wage and rate.
:return: result, result_rate (wage, percent)
"""
state_code = 'GA'
if not _state_applies(payslip, state_code):
return 0.0, 0.0
ga_filing_status = payslip.contract_id.us_payroll_config_value('ga_g4_sit_filing_status')
if not ga_filing_status:
return 0.0, 0.0
# Determine Wage
wage = sit_wage(payslip, categories)
if not wage:
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')
dependent_allowances = payslip.contract_id.us_payroll_config_value('ga_g4_sit_dependent_allowances')
additional_allowances = payslip.contract_id.us_payroll_config_value('ga_g4_sit_additional_allowances')
dependent_allowance_rate = payslip.rule_parameter('us_ga_sit_dependent_allowance_rate').get(schedule_pay)
personal_allowance = payslip.rule_parameter('us_ga_sit_personal_allowance').get(ga_filing_status, {}).get(schedule_pay)
deduction = payslip.rule_parameter('us_ga_sit_deduction').get(ga_filing_status, {}).get(schedule_pay)
withholding_rate = payslip.rule_parameter('us_ga_sit_rate').get(ga_filing_status, {}).get(schedule_pay)
if not all((dependent_allowance_rate, personal_allowance, deduction, withholding_rate)):
return 0.0, 0.0
after_standard_deduction = wage - deduction
allowances = dependent_allowances + additional_allowances
working_wages = after_standard_deduction - (personal_allowance + (allowances * dependent_allowance_rate))
withholding = 0.0
if working_wages > 0.0:
prior_row_base = 0.0
for row in withholding_rate:
wage_base, base, rate = row
wage_base = float(wage_base)
if working_wages < wage_base:
withholding = base + ((working_wages - prior_row_base) * rate / 100.0)
break
prior_row_base = wage_base
withholding += additional
return wage, -((withholding / wage) * 100.0)

View File

@@ -0,0 +1,131 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from odoo.exceptions import UserError
from ..federal.fed_940 import futa_wage, futa_wage_ytd
from ..federal.fed_941 import fit_wage, fit_wage_ytd
# import logging
# _logger = logging.getLogger(__name__)
suta_wage = futa_wage
suta_wage_ytd = futa_wage_ytd
sit_wage = fit_wage
sit_wage_ytd = fit_wage_ytd
def _state_applies(payslip, state_code):
return state_code == payslip.contract_id.us_payroll_config_value('state_code')
# Export for eval context
is_us_state = _state_applies
def _general_rate(payslip, wage, ytd_wage, wage_base=None, wage_start=None, rate=None):
"""
Function parameters:
wage_base, wage_start, rate can either be strings (rule_parameters) or floats
:return: result, result_rate(wage, percent)
"""
# Resolve parameters. On exception, return (probably missing a year, would rather not have exception)
if wage_base and isinstance(wage_base, str):
try:
wage_base = payslip.rule_parameter(wage_base)
except (KeyError, UserError):
return 0.0, 0.0
if wage_start and isinstance(wage_start, str):
try:
wage_start = payslip.rule_parameter(wage_start)
except (KeyError, UserError):
return 0.0, 0.0
if rate and isinstance(rate, str):
try:
rate = payslip.rule_parameter(rate)
except (KeyError, UserError):
return 0.0, 0.0
if not rate:
return 0.0, 0.0
else:
# Rate assumed positive percentage!
rate = -rate
if wage_base:
remaining = wage_base - ytd_wage
if remaining < 0.0:
result = 0.0
elif remaining < wage:
result = remaining
else:
result = wage
# _logger.warn(' wage_base method result: ' + str(result) + ' rate: ' + str(rate))
return result, rate
if wage_start:
if ytd_wage >= wage_start:
# _logger.warn(' wage_start 1 method result: ' + str(wage) + ' rate: ' + str(rate))
return wage, rate
if ytd_wage + wage <= wage_start:
# _logger.warn(' wage_start 2 method result: ' + str(0.0) + ' rate: ' + str(0.0))
return 0.0, 0.0
# _logger.warn(' wage_start 3 method result: ' + str((wage - (wage_start - ytd_wage))) + ' rate: ' + str(rate))
return (wage - (wage_start - ytd_wage)), rate
# If the wage doesn't have a start or a base
# _logger.warn(' basic result: ' + str(wage) + ' rate: ' + str(rate))
return wage, rate
def general_state_unemployment(payslip, categories, worked_days, inputs, wage_base=None, wage_start=None, rate=None, state_code=None):
"""
Returns SUTA eligible wage and rate.
WAGE = GROSS + DED_FUTA_EXEMPT
The contract's `futa_type` determines if SUTA should be collected.
:return: result, result_rate(wage, percent)
"""
if not _state_applies(payslip, state_code):
return 0.0, 0.0
# Determine Eligible.
if payslip.contract_id.futa_type in (payslip.contract_id.FUTA_TYPE_EXEMPT, payslip.contract_id.FUTA_TYPE_BASIC):
return 0.0, 0.0
# Determine Wage
wage = suta_wage(payslip, categories)
if not wage:
return 0.0, 0.0
ytd_wage = suta_wage_ytd(payslip, categories)
return _general_rate(payslip, wage, ytd_wage, wage_base=wage_base, wage_start=wage_start, rate=rate)
def general_state_income_withholding(payslip, categories, worked_days, inputs, wage_base=None, wage_start=None, rate=None, state_code=None):
"""
Returns SIT eligible wage and rate.
WAGE = GROSS + DED_FIT_EXEMPT
:return: result, result_rate (wage, percent)
"""
if not _state_applies(payslip, state_code):
return 0.0, 0.0
if payslip.contract_id.us_payroll_config_value('state_income_tax_exempt'):
return 0.0, 0.0
# Determine Wage
ytd_wage = sit_wage_ytd(payslip, categories)
wage = sit_wage(payslip, categories)
result, result_rate = _general_rate(payslip, wage, ytd_wage, wage_base=wage_base, wage_start=wage_start, rate=rate)
additional = payslip.contract_id.us_payroll_config_value('state_income_tax_additional_withholding')
if additional:
tax = result * (result_rate / 100.0)
tax -= additional # assumed result_rate is negative and that the 'additional' should increase it.
return result, ((tax / result) * 100.0)
return result, result_rate

View File

@@ -0,0 +1,43 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from .general import _state_applies, sit_wage
def hi_hawaii_state_income_withholding(payslip, categories, worked_days, inputs):
"""
Returns SIT eligible wage and rate.
:return: result, result_rate (wage, percent)
"""
state_code = 'HI'
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('hi_hw4_sit_filing_status')
if not filing_status:
return 0.0, 0.0
pay_periods = payslip.dict.get_pay_periods_in_year()
additional = payslip.contract_id.us_payroll_config_value('state_income_tax_additional_withholding')
allowances = payslip.contract_id.us_payroll_config_value('hi_hw4_sit_allowances')
tax_table = payslip.rule_parameter('us_hi_sit_tax_rate')[filing_status]
personal_exemption = payslip.rule_parameter('us_hi_sit_personal_exemption_rate')
taxable_income = (wage * pay_periods) - (personal_exemption * allowances)
withholding = 0.0
last = 0.0
for row in tax_table:
if taxable_income <= float(row[0]):
withholding = row[1] + ((row[2] / 100.0) * (taxable_income - last))
break
last = row[0]
withholding = max(withholding, 0.0)
withholding = withholding / pay_periods
withholding += additional
return wage, -((withholding / wage) * 100.0)

View File

@@ -0,0 +1,48 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from .general import _state_applies, sit_wage
def ia_iowa_state_income_withholding(payslip, categories, worked_days, inputs):
"""
Returns SIT eligible wage and rate.
:return: result, result_rate (wage, percent)
"""
state_code = 'IA'
if not _state_applies(payslip, state_code):
return 0.0, 0.0
if payslip.contract_id.us_payroll_config_value('state_income_tax_exempt'):
return 0.0, 0.0
# Determine Wage
wage = sit_wage(payslip, categories)
if not wage:
return 0.0, 0.0
schedule_pay = payslip.contract_id.schedule_pay
fed_withholding = categories.EE_US_941_FIT
additional = payslip.contract_id.us_payroll_config_value('state_income_tax_additional_withholding')
allowances = payslip.contract_id.us_payroll_config_value('ia_w4_sit_allowances')
standard_deduction = payslip.rule_parameter('us_ia_sit_standard_deduction_rate')[schedule_pay]
tax_table = payslip.rule_parameter('us_ia_sit_tax_rate')[schedule_pay]
deduction_per_allowance = payslip.rule_parameter('us_ia_sit_deduction_allowance_rate')[schedule_pay]
t1 = wage + fed_withholding
standard_deduction_amt = standard_deduction[0] if allowances < 2 else standard_deduction[1]
t2 = t1 - standard_deduction_amt
t3 = 0.0
last = 0.0
for row in tax_table:
cap, rate, flat_fee = row
if float(cap) > float(t2):
taxed_amount = t2 - last
t3 = flat_fee + (rate * taxed_amount)
break
last = cap
withholding = t3 - (deduction_per_allowance * allowances)
withholding = max(withholding, 0.0)
withholding += additional
return wage, -((withholding / wage) * 100.0)

View File

@@ -0,0 +1,41 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from .general import _state_applies, sit_wage
def id_idaho_state_income_withholding(payslip, categories, worked_days, inputs):
"""
Returns SIT eligible wage and rate.
:return: result, result_rate (wage, percent)
"""
state_code = 'ID'
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('id_w4_sit_filing_status')
if not filing_status:
return 0.0, 0.0
schedule_pay = payslip.contract_id.schedule_pay
allowances = payslip.contract_id.us_payroll_config_value('id_w4_sit_allowances')
ictcat_table = payslip.rule_parameter('us_id_sit_ictcat_rate')[schedule_pay]
tax_table = payslip.rule_parameter('us_id_sit_tax_rate')[filing_status].get(schedule_pay)
taxable_income = wage - (ictcat_table * allowances)
withholding = 0.0
last = 0.0
for row in tax_table:
if taxable_income <= float(row[0]):
withholding = row[1] + ((row[2] / 100.0) * (taxable_income - last))
break
last = row[0]
withholding = max(withholding, 0.0)
withholding = round(withholding)
return wage, -((withholding / wage) * 100.0)

View File

@@ -0,0 +1,35 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from .general import _state_applies, sit_wage
def il_illinois_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 = 'IL'
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
pay_periods = payslip.dict.get_pay_periods_in_year()
additional = payslip.contract_id.us_payroll_config_value('state_income_tax_additional_withholding')
basic_allowances_rate = payslip.rule_parameter('us_il_sit_basic_allowances_rate')
additional_allowances_rate = payslip.rule_parameter('us_il_sit_additional_allowances_rate')
basic_allowances = payslip.contract_id.us_payroll_config_value('il_w4_sit_basic_allowances')
additional_allowances = payslip.contract_id.us_payroll_config_value('il_w4_sit_additional_allowances')
rate = 4.95 / 100.0
withholding = rate * (wage - (((basic_allowances * basic_allowances_rate) + (additional_allowances *
additional_allowances_rate)) / pay_periods))
if withholding < 0.0:
withholding = 0.0
withholding += additional
return wage, -((withholding / wage) * 100.0)

View File

@@ -0,0 +1,34 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from .general import _state_applies, sit_wage
def in_indiana_state_income_withholding(payslip, categories, worked_days, inputs):
"""
Returns SIT eligible wage and rate.
:return: result, result_rate (wage, percent)
"""
state_code = 'IN'
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
schedule_pay = payslip.contract_id.schedule_pay
additional = payslip.contract_id.us_payroll_config_value('state_income_tax_additional_withholding')
personal_exemption = payslip.contract_id.us_payroll_config_value('in_w4_sit_personal_exemption')
personal_exemption_rate = payslip.rule_parameter('us_in_sit_personal_exemption_rate')[schedule_pay][personal_exemption - 1]
dependent_exemption = payslip.contract_id.us_payroll_config_value('in_w4_sit_dependent_exemption')
dependent_exemption_rate = payslip.rule_parameter('us_in_sit_dependent_exemption_rate')[schedule_pay][dependent_exemption - 1]
income_tax_rate = payslip.rule_parameter('us_in_suta_income_rate')
taxable_income = wage - (personal_exemption_rate + dependent_exemption_rate)
withholding = taxable_income * (income_tax_rate / 100.0)
withholding = max(withholding, 0.0)
withholding += additional
return wage, -((withholding / wage) * 100.0)

View File

@@ -0,0 +1,44 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from .general import _state_applies, sit_wage
def ks_kansas_state_income_withholding(payslip, categories, worked_days, inputs):
"""
Returns SIT eligible wage and rate.
:return: result, result_rate (wage, percent)
"""
state_code = 'KS'
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('ks_k4_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')
allowances = payslip.contract_id.us_payroll_config_value('ks_k4_sit_allowances')
allowances_amt = payslip.rule_parameter('us_ks_sit_allowances_rate')[schedule_pay]
tax_table = payslip.rule_parameter('us_ks_sit_tax_rate')[filing_status].get(schedule_pay)
taxable_income = wage - (allowances * allowances_amt)
withholding = 0.0
last = 0.0
for row in tax_table:
amt, rate, flat_fee = row
if wage <= float(amt):
withholding = ((taxable_income - last) * (rate / 100)) + flat_fee
break
last = amt
withholding = max(withholding, 0.0)
withholding += additional
withholding = round(withholding)
return wage, -((withholding / wage) * 100.0)

View File

@@ -0,0 +1,32 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from .general import _state_applies, sit_wage
def ky_kentucky_state_income_withholding(payslip, categories, worked_days, inputs):
"""
Returns SIT eligible wage and rate.
:return: result, result_rate (wage, percent)
"""
state_code = 'KY'
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
pay_periods = payslip.dict.get_pay_periods_in_year()
additional = payslip.contract_id.us_payroll_config_value('state_income_tax_additional_withholding')
tax_rate = payslip.rule_parameter('us_ky_sit_tax_rate')
standard_deduction = payslip.rule_parameter('us_ky_sit_standard_deduction_rate')
taxable_income = (wage * pay_periods) - standard_deduction
withholding = taxable_income * (tax_rate / 100)
withholding = max(withholding, 0.0)
withholding /= pay_periods
withholding += additional
return wage, -((withholding / wage) * 100.0)

View File

@@ -0,0 +1,62 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from .general import _state_applies, sit_wage
def la_louisiana_state_income_withholding(payslip, categories, worked_days, inputs):
"""
Returns SIT eligible wage and rate.
:return: result, result_rate (wage, percent)
"""
state_code = 'LA'
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('la_l4_sit_filing_status')
if not filing_status:
return 0.0, 0.0
pay_periods = payslip.dict.get_pay_periods_in_year()
personal_exemptions = payslip.contract_id.us_payroll_config_value('la_l4_sit_exemptions')
additional = payslip.contract_id.us_payroll_config_value('state_income_tax_additional_withholding')
dependent_exemptions = payslip.contract_id.us_payroll_config_value('la_l4_sit_dependents')
tax_table = payslip.rule_parameter('us_la_sit_tax_rate')[filing_status]
exemption_rate = payslip.rule_parameter('us_la_sit_personal_exemption_rate')
dependent_rate = payslip.rule_parameter('us_la_sit_dependent_rate')
annual_wage = wage * pay_periods
effect_cap = 0.0
multiplier = 0.0
if filing_status == 'single':
effect_cap = 12500.00
multiplier = 1.60
elif filing_status == 'married':
effect_cap = 25000.00
multiplier = 1.65
after_credits_under = (2.100 / 100) * (((personal_exemptions * exemption_rate) +
(dependent_exemptions * dependent_rate)) / pay_periods)
after_credits_over = 0.00
if after_credits_under > effect_cap:
after_credits_under = effect_cap
after_credits_over_check = ((personal_exemptions * exemption_rate) + (dependent_exemptions * dependent_rate)) - effect_cap
after_credits_over = (multiplier / 100.00) * (after_credits_over_check / pay_periods) if after_credits_over_check > 0 else 0.00
withholding = 0.0
last = 0.0
for amt, rate in tax_table:
withholding = withholding + ((rate / 100.0) * (wage - (last / pay_periods)))
if annual_wage <= float(amt):
break
last = amt
withholding = withholding - (after_credits_under + after_credits_over)
withholding = round(withholding, 2)
withholding += additional
return wage, -((withholding / wage) * 100.0)

View File

@@ -0,0 +1,62 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from .general import _state_applies, sit_wage
def me_maine_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 = 'ME'
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('me_w4me_sit_filing_status')
if not filing_status:
return 0.0, 0.0
exempt = payslip.contract_id.us_payroll_config_value('state_income_tax_exempt')
if exempt:
return 0.0, 0.0
pay_periods = payslip.dict.get_pay_periods_in_year()
additional = payslip.contract_id.us_payroll_config_value('state_income_tax_additional_withholding')
allowances = payslip.contract_id.us_payroll_config_value('me_w4me_sit_allowances')
tax_rate = payslip.rule_parameter('us_me_sit_tax_rate')[filing_status]
personal_exemption = payslip.rule_parameter('us_me_sit_personal_exemption_rate')
standard_deduction = payslip.rule_parameter('us_me_sit_standard_deduction_rate')[filing_status]
taxable_income = wage * pay_periods
exemption_amt = allowances * personal_exemption
last = 0.0
standard_deduction_amt = 0.0
for row in standard_deduction:
amt, flat_amt = row
if taxable_income < 82900:
standard_deduction_amt = flat_amt
break
elif taxable_income < amt:
standard_deduction_amt = last * (amt - taxable_income) / flat_amt
break
last = flat_amt
annual_income = taxable_income - (exemption_amt + standard_deduction_amt)
withholding = 0.0
for row in tax_rate:
amt, flat_fee, rate = row
if annual_income < float(amt):
withholding = ((annual_income - last) * (rate / 100)) + flat_fee
break
last = amt
withholding = max(withholding, 0.0)
withholding = round(withholding / pay_periods)
withholding += additional
return wage, -((withholding / wage) * 100.0)

View File

@@ -0,0 +1,35 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from .general import _state_applies, sit_wage
def mi_michigan_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 = 'MI'
if not _state_applies(payslip, state_code):
return 0.0, 0.0
if payslip.contract_id.us_payroll_config_value('state_income_tax_exempt'):
return 0.0, 0.0
# Determine Wage
wage = sit_wage(payslip, categories)
if not wage:
return 0.0, 0.0
pay_periods = payslip.dict.get_pay_periods_in_year()
additional = payslip.contract_id.us_payroll_config_value('state_income_tax_additional_withholding')
exemption_rate = payslip.rule_parameter('us_mi_sit_exemption_rate')
exemption = payslip.contract_id.us_payroll_config_value('mi_w4_sit_exemptions')
annual_exemption = (exemption * exemption_rate) / pay_periods
withholding = ((wage - annual_exemption) * 0.0425)
if withholding < 0.0:
withholding = 0.0
withholding += additional
return wage, -((withholding / wage) * 100.0)

View File

@@ -0,0 +1,44 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from .general import _state_applies, sit_wage
def mn_minnesota_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 = 'MN'
if not _state_applies(payslip, state_code):
return 0.0, 0.0
filing_status = payslip.contract_id.us_payroll_config_value('mn_w4mn_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
pay_periods = payslip.dict.get_pay_periods_in_year()
additional = payslip.contract_id.us_payroll_config_value('state_income_tax_additional_withholding')
sit_tax_rate = payslip.rule_parameter('us_mn_sit_tax_rate')[filing_status]
allowances_rate = payslip.rule_parameter('us_mn_sit_allowances_rate')
allowances = payslip.contract_id.us_payroll_config_value('mn_w4mn_sit_allowances')
taxable_income = (wage * pay_periods) - (allowances * allowances_rate)
withholding = 0.0
for row in sit_tax_rate:
cap, subtract_amt, rate, flat_fee = row
cap = float(cap)
if cap > taxable_income:
withholding = ((rate / 100.00) * (taxable_income - subtract_amt)) + flat_fee
break
withholding = round(withholding / pay_periods)
if withholding < 0.0:
withholding = 0.0
withholding += additional
return wage, -((withholding / wage) * 100.0)

View File

@@ -0,0 +1,53 @@
# 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.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.contract_id.us_payroll_config_value('state_income_tax_additional_withholding')
sit_table = payslip.rule_parameter('us_mo_sit_rate')
deduction = payslip.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)

View File

@@ -0,0 +1,46 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from .general import _state_applies, sit_wage
def ms_mississippi_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 = 'MS'
if not _state_applies(payslip, state_code):
return 0.0, 0.0
filing_status = payslip.contract_id.us_payroll_config_value('ms_89_350_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
pay_periods = payslip.dict.get_pay_periods_in_year()
additional = payslip.contract_id.us_payroll_config_value('state_income_tax_additional_withholding')
exemptions = payslip.contract_id.us_payroll_config_value('ms_89_350_sit_exemption_value')
standard_deduction = payslip.rule_parameter('us_ms_sit_deduction').get(filing_status)
withholding_rate = payslip.rule_parameter('us_ms_sit_rate')
wage_annual = wage * pay_periods
taxable_income = wage_annual - (exemptions + standard_deduction)
if taxable_income <= 0.01:
return wage, 0.0
withholding = 0.0
for row in withholding_rate:
wage_base, base, rate = row
if taxable_income >= wage_base:
withholding = base + ((taxable_income - wage_base) * rate)
break
withholding /= pay_periods
withholding = round(withholding)
withholding += round(additional)
return wage, -((withholding / wage) * 100.0)

View File

@@ -0,0 +1,45 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from .general import _state_applies, sit_wage
def mt_montana_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 = 'MT'
if not _state_applies(payslip, state_code):
return 0.0, 0.0
if payslip.contract_id.us_payroll_config_value('mt_mw4_sit_exempt'):
return 0.0, 0.0
# Determine Wage
wage = sit_wage(payslip, categories)
if not wage:
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')
exemptions = payslip.contract_id.us_payroll_config_value('mt_mw4_sit_exemptions')
exemption_rate = payslip.rule_parameter('us_mt_sit_exemption_rate').get(schedule_pay)
withholding_rate = payslip.rule_parameter('us_mt_sit_rate').get(schedule_pay)
if not exemption_rate or not withholding_rate:
return 0.0, 0.0
adjusted_wage = wage - (exemption_rate * (exemptions or 0))
withholding = 0.0
if adjusted_wage > 0.0:
prior_wage_cap = 0.0
for row in withholding_rate:
wage_cap, base, rate = row
wage_cap = float(wage_cap) # e.g. 'inf'
if adjusted_wage < wage_cap:
withholding = round(base + ((rate / 100.0) * (adjusted_wage - prior_wage_cap)))
break
prior_wage_cap = wage_cap
withholding += additional
return wage, -((withholding / wage) * 100.0)

Some files were not shown because too many files have changed in this diff Show More