chore: import enterprise addons 19.0 bulk snapshot

This commit is contained in:
1b-agent committed 2026-09-16 10:13:08 +00:00
commit ca4af030d3
39951 files changed
+15570005

No files matched your search

+3
View File
@@ -0,0 +1,3 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import models
+1
View File
@@ -0,0 +1 @@
{'name': 'Indonesia - Payroll', 'countries': ['id'], 'category': 'Human Resources/Payroll', 'description': '\n Indonesia Payroll Rules.\n ', 'depends': ['hr_work_entry_holidays'], 'auto_install': ['hr_payroll'], 'data': ['data/resource_calendar_data.xml', 'data/hr_payroll_structure_type_data.xml', 'data/hr_payroll_structure_data.xml', 'data/hr_payslip_input_type_data.xml', 'data/hr_salary_rule_category_data.xml', 'data/hr_rule_parameter_data.xml', 'data/hr_salary_rule_data.xml', 'views/hr_employee_views.xml', 'views/hr_contract_template_views.xml', 'views/res_config_settings_views.xml', 'views/hr_payslip_views.xml', 'views/hr_payslip_line_views.xml'], 'demo': ['data/l10n_id_hr_payroll_demo.xml'], 'author': 'Odoo S.A.', 'license': 'LGPL-3'}
@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="hr_payroll_structure_id_employee_salary" model="hr.payroll.structure">
<field name="name">Indonesia: Regular Pay</field>
<field name="code">IDMONTHLY</field>
<field name="country_id" ref="base.id" />
<field name="type_id" ref="l10n_id_hr_payroll.structure_type_employee_id" />
<field name="unpaid_work_entry_type_ids" eval="[
(4, ref('hr_work_entry.work_entry_type_unpaid_leave')),
]"/>
<field name="rule_ids" eval="[]"/>
</record>
<record id="l10n_id_hr_payroll.structure_type_employee_id" model="hr.payroll.structure.type">
<field name="default_struct_id" ref="hr_payroll_structure_id_employee_salary" />
</record>
</odoo>
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="structure_type_employee_id" model="hr.payroll.structure.type">
<field name="name">Indonesia: Employee</field>
<field name="country_id" ref="base.id"/>
<field name="default_resource_calendar_id" eval="ref('resource_calendar_standard', raise_if_not_found=False)"/>
</record>
</odoo>
@@ -0,0 +1,58 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="input_global_reimbursement" model="hr.payslip.input.type">
<field name="name">Reimbursement</field>
<field name="code">REIMBURSEMENT</field>
<field name="country_id" ref="base.id"/>
<field name="struct_ids" eval="[(4, ref('l10n_id_hr_payroll.hr_payroll_structure_id_employee_salary'))]"/>
</record>
<record id="input_transport_allowance" model="hr.payslip.input.type">
<field name="name">Transport Allowance</field>
<field name="code">TRANSPORT</field>
<field name="country_id" ref="base.id"/>
<field name="struct_ids" eval="[(4, ref('l10n_id_hr_payroll.hr_payroll_structure_id_employee_salary'))]"/>
</record>
<record id="input_incentive" model="hr.payslip.input.type">
<field name="name">INSENTIF</field>
<field name="code">INSENTIF</field>
<field name="country_id" ref="base.id"/>
<field name="struct_ids" eval="[(4, ref('l10n_id_hr_payroll.hr_payroll_structure_id_employee_salary'))]"/>
</record>
<record id="input_meal_allowance" model="hr.payslip.input.type">
<field name="name">Meal Allowance</field>
<field name="code">MEAL</field>
<field name="country_id" ref="base.id"/>
<field name="struct_ids" eval="[(4, ref('l10n_id_hr_payroll.hr_payroll_structure_id_employee_salary'))]"/>
</record>
<record id="input_laptop_allowance" model="hr.payslip.input.type">
<field name="name">Laptop Allowance</field>
<field name="code">LAPTOP</field>
<field name="country_id" ref="base.id"/>
<field name="struct_ids" eval="[(4, ref('l10n_id_hr_payroll.hr_payroll_structure_id_employee_salary'))]"/>
</record>
<record id="input_level_allowance" model="hr.payslip.input.type">
<field name="name">Level Allowance</field>
<field name="code">LEVEL</field>
<field name="country_id" ref="base.id"/>
<field name="struct_ids" eval="[(4, ref('l10n_id_hr_payroll.hr_payroll_structure_id_employee_salary'))]"/>
</record>
<record id="input_insurance_allowance" model="hr.payslip.input.type">
<field name="name">Insurance Allowance</field>
<field name="code">INSURANCE</field>
<field name="country_id" ref="base.id"/>
<field name="struct_ids" eval="[(4, ref('l10n_id_hr_payroll.hr_payroll_structure_id_employee_salary'))]"/>
</record>
<record id="input_holiday_allowance" model="hr.payslip.input.type">
<field name="name">THR</field>
<field name="code">THR</field>
<field name="country_id" ref="base.id"/>
<field name="struct_ids" eval="[(4, ref('l10n_id_hr_payroll.hr_payroll_structure_id_employee_salary'))]"/>
</record>
</odoo>
@@ -0,0 +1,281 @@
<?xml version='1.0' encoding='utf-8'?>
<odoo>
<record id="l10n_id_hr_rule_parameter_bpjs_kesehatan" model="hr.rule.parameter">
<field name="name">BPJS Kesehatan Threshold</field>
<field name="code">l10n_id_bpjs_salary_threshold</field>
<field name="country_id" ref="base.id"/>
</record>
<record id="l10n_id_hr_rule_parameter_bpjs_kesehatan_2009" model="hr.rule.parameter.value">
<field name="parameter_value">12000000</field>
<field name="rule_parameter_id" ref="l10n_id_hr_rule_parameter_bpjs_kesehatan"/>
<field name="date_from" eval="datetime(2009, 1, 1).date()"/>
</record>
<record id="l10n_id_hr_rule_parameter_biaya_jabatan" model="hr.rule.parameter">
<field name="name">Biaya Jabatan Threshold</field>
<field name="code">l10n_id_biaya_jabatan_salary_threshold</field>
<field name="country_id" ref="base.id"/>
</record>
<record id="l10n_id_hr_rule_parameter_biaya_jabatan_2009" model="hr.rule.parameter.value">
<field name="parameter_value">10000000</field>
<field name="rule_parameter_id" ref="l10n_id_hr_rule_parameter_biaya_jabatan"/>
<field name="date_from" eval="datetime(2009, 1, 1).date()"/>
</record>
<record id="l10n_id_hr_rule_parameter_jht" model="hr.rule.parameter">
<field name="name">JHT Threshold</field>
<field name="code">l10n_id_jht_threshold</field>
<field name="country_id" ref="base.id"/>
</record>
<record id="l10n_id_hr_rule_parameter_jht_2013" model="hr.rule.parameter.value">
<field name="parameter_value">9559600</field>
<field name="rule_parameter_id" ref="l10n_id_hr_rule_parameter_jht"/>
<field name="date_from" eval="datetime(2013, 1, 1).date()"/>
</record>
<record id="l10n_id_hr_rule_parameter_jp" model="hr.rule.parameter">
<field name="name">JP Threshold</field>
<field name="code">l10n_id_jp_threshold</field>
<field name="country_id" ref="base.id"/>
</record>
<record id="l10n_id_hr_rule_parameter_jp_2015" model="hr.rule.parameter.value">
<field name="parameter_value">10042300</field>
<field name="rule_parameter_id" ref="l10n_id_hr_rule_parameter_jp"/>
<field name="date_from" eval="datetime(2015, 1, 1).date()"/>
</record>
<record id="l10n_id_hr_rule_parameter_bpjs_jkm_percentage" model="hr.rule.parameter">
<field name="name">JKM Percentage</field>
<field name="code">l10n_id_jkm_percentage</field>
<field name="country_id" ref="base.id"/>
</record>
<record id="l10n_id_hr_rule_parameter_bpjs_jkm_percentage_2015" model="hr.rule.parameter.value">
<field name="parameter_value">0.3</field>
<field name="rule_parameter_id" ref="l10n_id_hr_rule_parameter_bpjs_jkm_percentage"/>
<field name="date_from" eval="datetime(2015, 1, 1).date()"/>
</record>
<record id="l10n_id_hr_rule_parameter_alw_bpjs_kesehatan_percent" model="hr.rule.parameter">
<field name="name">ALW BPJS Kesehatan Percentage</field>
<field name="code">l10n_id_alw_bpjs_kesehatan_percent</field>
<field name="country_id" ref="base.id"/>
</record>
<record id="l10n_id_hr_rule_parameter_alw_bpjs_kesehatan_percent_2013" model="hr.rule.parameter.value">
<field name="parameter_value">4</field>
<field name="rule_parameter_id" ref="l10n_id_hr_rule_parameter_alw_bpjs_kesehatan_percent"/>
<field name="date_from" eval="datetime(2013, 1, 1).date()"/>
</record>
<record id="l10n_id_hr_rule_parameter_biaya_jabatan_percent" model="hr.rule.parameter">
<field name="name">Biaya Jabatan Percentage</field>
<field name="code">l10n_id_biaya_jabatan_percent</field>
<field name="country_id" ref="base.id"/>
</record>
<record id="l10n_id_hr_rule_parameter_biaya_jabatan_percent_2008" model="hr.rule.parameter.value">
<field name="parameter_value">5</field>
<field name="rule_parameter_id" ref="l10n_id_hr_rule_parameter_biaya_jabatan_percent"/>
<field name="date_from" eval="datetime(2008, 1, 1).date()"/>
</record>
<record id="l10n_id_hr_rule_parameter_jht_percent" model="hr.rule.parameter">
<field name="name">JHT Percentage</field>
<field name="code">l10n_id_jht_percent</field>
<field name="country_id" ref="base.id"/>
</record>
<record id="l10n_id_hr_rule_parameter_jht_percent_2013" model="hr.rule.parameter.value">
<field name="parameter_value">2</field>
<field name="rule_parameter_id" ref="l10n_id_hr_rule_parameter_jht_percent"/>
<field name="date_from" eval="datetime(2013, 1, 1).date()"/>
</record>
<record id="l10n_id_hr_rule_parameter_ded_bpjs_kesehatan_percent" model="hr.rule.parameter">
<field name="name">DED BPJS Kesehatan Percentage</field>
<field name="code">l10n_id_ded_bpjs_kesehatan_percent</field>
<field name="country_id" ref="base.id"/>
</record>
<record id="l10n_id_hr_rule_parameter_ded_bpjs_kesehatan_percent_2013" model="hr.rule.parameter.value">
<field name="parameter_value">1</field>
<field name="rule_parameter_id" ref="l10n_id_hr_rule_parameter_ded_bpjs_kesehatan_percent"/>
<field name="date_from" eval="datetime(2013, 1, 1).date()"/>
</record>
<record id="l10n_id_hr_rule_parameter_jp_percent" model="hr.rule.parameter">
<field name="name">JP Percentage</field>
<field name="code">l10n_id_jp_percent</field>
<field name="country_id" ref="base.id"/>
</record>
<record id="l10n_id_hr_rule_parameter_jp_percent_2015" model="hr.rule.parameter.value">
<field name="parameter_value">1</field>
<field name="rule_parameter_id" ref="l10n_id_hr_rule_parameter_jp_percent"/>
<field name="date_from" eval="datetime(2015, 1, 1).date()"/>
</record>
<!-- PPH percentage range
forma: of parameter value: (lower_bound, upper_bound, percentage applied) -->
<record id="l10n_id_hr_rule_parameter_tax_percentage_pph21_a" model="hr.rule.parameter">
<field name="name">PPH21 Rate: Category A</field>
<field name="code">l10n_id_pph21_percentage_a</field>
<field name="country_id" ref="base.id" />
</record>
<record id="l10n_id_hr_rule_parameter_tax_percentage_a_2024" model="hr.rule.parameter.value">
<field name="rule_parameter_id" ref="l10n_id_hr_rule_parameter_tax_percentage_pph21_a"/>
<field name="date_from" eval="datetime(2024, 1, 1).date()"/>
<field name="parameter_value">
[
(0,5400000,0),
(5400000,5650000,0.25),
(5650000,5950000,0.5),
(5950000,6300000,0.75),
(6300000,6750000,1),
(6750000,7500000,1.25),
(7500000,8550000,1.5),
(8550000,9650000,1.75),
(9650000,10050000,2),
(10050000,10350000,2.25),
(10350000,10700000,2.5),
(10700000,11050000,3),
(11050000,11600000,3.5),
(11600000,12500000,4),
(12500000,13750000,5),
(13750000,15100000,6),
(15100000,16950000,7),
(16950000,19750000,8),
(19750000,24150000,9),
(24150000,26450000,10),
(26450000,28000000,11),
(28000000,30050000,12),
(30050000,32400000,13),
(32400000,35400000,14),
(35400000,39100000,15),
(39100000,43850000,16),
(43850000,47800000,17),
(47800000,51400000,18),
(51400000,56300000,19),
(56300000,62200000,20),
(62200000,68600000,21),
(68600000,77500000,22),
(77500000,89000000,23),
(89000000,103000000,24),
(103000000,125000000,25),
(125000000,157000000,26),
(157000000,206000000,27),
(206000000,337000000,28),
(337000000,454000000,29),
(454000000,550000000,30),
(550000000,695000000,31),
(695000000,910000000,32),
(910000000,1400000000,33),
(1400000000,9999999999,34)
]
</field>
</record>
<record id="l10n_id_hr_rule_parameter_tax_percentage_pph21_b" model="hr.rule.parameter">
<field name="name">PPH21 Rate: Category B</field>
<field name="code">l10n_id_pph21_percentage_b</field>
<field name="country_id" ref="base.id" />
</record>
<record id="l10n_id_hr_rule_parameter_tax_percentage_b_2024" model="hr.rule.parameter.value">
<field name="rule_parameter_id" ref="l10n_id_hr_rule_parameter_tax_percentage_pph21_b"/>
<field name="date_from" eval="datetime(2024, 1, 1).date()"/>
<field name="parameter_value">
[
(0,6200000,0),
(6200000,6500000,0.25),
(6500000,6850000,0.5),
(6850000,7300000,0.75),
(7300000,9200000,1),
(9200000,10750000,1.5),
(10750000,11250000,2),
(11250000,11600000,2.5),
(11600000,12600000,3),
(12600000,13600000,4),
(13600000,14950000,5),
(14950000,16400000,6),
(16400000,18450000,7),
(18450000,21850000,8),
(21850000,26000000,9),
(26000000,27700000,10),
(27700000,29350000,11),
(29350000,31450000,12),
(31450000,33950000,13),
(33950000,37100000,14),
(37100000,41100000,15),
(41100000,45800000,16),
(45800000,49500000,17),
(49500000,53800000,18),
(53800000,58500000,19),
(58500000,64000000,20),
(64000000,71000000,21),
(71000000,80000000,22),
(80000000,93000000,23),
(93000000,109000000,24),
(109000000,129000000,25),
(129000000,163000000,26),
(163000000,211000000,27),
(211000000,374000000,28),
(374000000,459000000,29),
(459000000,555000000,30),
(555000000,704000000,31),
(704000000,957000000,32),
(957000000,1405000000,33),
(1405000000,9999999999,34)
]
</field>
</record>
<record id="l10n_id_hr_rule_parameter_tax_percentage_pph21_c" model="hr.rule.parameter">
<field name="name">PPH21 Rate: Category C</field>
<field name="code">l10n_id_pph21_percentage_c</field>
<field name="country_id" ref="base.id" />
</record>
<record id="l10n_id_hr_rule_parameter_tax_percentage_c_2024" model="hr.rule.parameter.value">
<field name="rule_parameter_id" ref="l10n_id_hr_rule_parameter_tax_percentage_pph21_c"/>
<field name="date_from" eval="datetime(2024, 1, 1).date()"/>
<field name="parameter_value">
[
(0,6600000,0),
(6600000,6950000,0.25),
(6950000,7350000,0.5),
(7350000,7800000,0.75),
(7800000,8850000,1),
(8850000,9800000,1.25),
(9800000,10950000,1.5),
(10950000,11200000,1.75),
(11200000,12050000,2),
(12050000,12950000,3),
(12950000,14150000,4),
(14150000,15550000,5),
(15550000,17050000,6),
(17050000,19500000,7),
(19500000,22700000,8),
(22700000,26600000,9),
(26600000,28100000,10),
(28100000,30100000,11),
(30100000,32600000,12),
(32600000,35400000,13),
(35400000,38900000,14),
(38900000,43000000,15),
(43000000,47400000,16),
(47400000,51200000,17),
(51200000,55800000,18),
(55800000,60400000,19),
(60400000,66700000,20),
(66700000,74500000,21),
(74500000,83200000,22),
(83200000,95600000,23),
(95600000,110000000,24),
(110000000,134000000,25),
(134000000,169000000,26),
(169000000,221000000,27),
(221000000,390000000,28),
(390000000,463000000,29),
(463000000,561000000,30),
(561000000,709000000,31),
(709000000,965000000,32),
(965000000,1419000000,33),
(1419000000,9999999999,34)
]
</field>
</record>
</odoo>
@@ -0,0 +1,46 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- PPH21 included as part of deduction -->
<record id="PPH21" model="hr.salary.rule.category">
<field name="name">PPH 21</field>
<field name="code">PPH21</field>
<field name="parent_id" ref="hr_payroll.DED"/>
<field name="country_id" ref="base.id"/>
</record>
<record id="PPH21_yearly" model="hr.salary.rule.category">
<field name="name">PPH 21 Yearly</field>
<field name="code">PPH21_YEARLY</field>
<field name="country_id" ref="base.id"/>
</record>
<record id="PTKP" model="hr.salary.rule.category">
<field name="name">PTKP</field>
<field name="code">PTKP</field>
<field name="country_id" ref="base.id"/>
</record>
<record id="PKP" model="hr.salary.rule.category">
<field name="name">PKP</field>
<field name="code">PKP</field>
<field name="country_id" ref="base.id"/>
</record>
<record id="BASE" model="hr.salary.rule.category">
<field name="name">Base Salary</field>
<field name="code">BASE</field>
<field name="country_id" ref="base.id"/>
</record>
<record id="JABATAN" model="hr.salary.rule.category">
<field name="name">Jabatan</field>
<field name="code">JABATAN</field>
<field name="country_id" ref="base.id"/>
</record>
<record id="YEARLY_GROSS" model="hr.salary.rule.category">
<field name="name">Yearly Gross</field>
<field name="code">YEARLY_GROSS</field>
<field name="country_id" ref="base.id"/>
</record>
</odoo>
@@ -0,0 +1,392 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="l10n_id_hr_payroll_structure_id_employee_salary_basic_salary_rule" model="hr.salary.rule">
<field name="category_id" ref="hr_payroll.BASIC"/>
<field name="name">Basic Salary</field>
<field name="sequence">1</field>
<field name="code">BASIC</field>
<field name="condition_select">none</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">
result = payslip.paid_amount
</field>
<field name="struct_id" ref="hr_payroll_structure_id_employee_salary"/>
</record>
<!-- Employee general allowances/benefits -->
<record id="salary_rule_id_transport_allowance" model="hr.salary.rule">
<field name="category_id" ref="hr_payroll.ALW"/>
<field name="name">Transport Allowance</field>
<field name="code">TRANSPORT_ALW</field>
<field name="sequence">2</field>
<field name="condition_select">input</field>
<field name="condition_other_input_id" ref="l10n_id_hr_payroll.input_transport_allowance"/>
<field name="amount_select">input</field>
<field name="amount_other_input_id" ref="l10n_id_hr_payroll.input_transport_allowance"/>
<field name="struct_id" ref="l10n_id_hr_payroll.hr_payroll_structure_id_employee_salary"/>
</record>
<!-- Allowance -->
<record id="salary_rule_id_insurance" model="hr.salary.rule">
<field name="category_id" ref="hr_payroll.ALW"/>
<field name="name">Insurance</field>
<field name="code">INSURANCE</field>
<field name="sequence">2</field>
<field name="condition_select">input</field>
<field name="condition_other_input_id" ref="l10n_id_hr_payroll.input_insurance_allowance"/>
<field name="amount_select">input</field>
<field name="amount_other_input_id" ref="l10n_id_hr_payroll.input_insurance_allowance"/>
<field name="struct_id" ref="l10n_id_hr_payroll.hr_payroll_structure_id_employee_salary"/>
</record>
<record id="salary_rule_id_laptop" model="hr.salary.rule">
<field name="category_id" ref="hr_payroll.ALW"/>
<field name="name">Latpop</field>
<field name="code">LAPTOP</field>
<field name="sequence">2</field>
<field name="condition_select">input</field>
<field name="condition_other_input_id" ref="l10n_id_hr_payroll.input_laptop_allowance"/>
<field name="amount_select">input</field>
<field name="amount_other_input_id" ref="l10n_id_hr_payroll.input_laptop_allowance"/>
<field name="struct_id" ref="l10n_id_hr_payroll.hr_payroll_structure_id_employee_salary"/>
</record>
<record id="salary_rule_id_incentive" model="hr.salary.rule">
<field name="category_id" ref="hr_payroll.ALW"/>
<field name="name">Insentif</field>
<field name="code">INSENTIF</field>
<field name="sequence">2</field>
<field name="condition_select">input</field>
<field name="condition_other_input_id" ref="l10n_id_hr_payroll.input_incentive"/>
<field name="amount_select">input</field>
<field name="amount_other_input_id" ref="l10n_id_hr_payroll.input_incentive"/>
<field name="struct_id" ref="l10n_id_hr_payroll.hr_payroll_structure_id_employee_salary"/>
</record>
<record id="salary_rule_id_thr" model="hr.salary.rule">
<field name="category_id" ref="hr_payroll.ALW"/>
<field name="name">THR</field>
<field name="code">THR</field>
<field name="sequence">2</field>
<field name="condition_select">input</field>
<field name="condition_other_input_id" ref="l10n_id_hr_payroll.input_holiday_allowance"/>
<field name="amount_select">input</field>
<field name="amount_other_input_id" ref="l10n_id_hr_payroll.input_holiday_allowance"/>
<field name="struct_id" ref="l10n_id_hr_payroll.hr_payroll_structure_id_employee_salary"/>
</record>
<record id="salary_rule_id_meal_allowance" model="hr.salary.rule">
<field name="category_id" ref="hr_payroll.ALW"/>
<field name="name">Meal Allowance</field>
<field name="code">MEAL</field>
<field name="sequence">2</field>
<field name="condition_select">input</field>
<field name="condition_other_input_id" ref="l10n_id_hr_payroll.input_meal_allowance"/>
<field name="amount_select">input</field>
<field name="amount_other_input_id" ref="l10n_id_hr_payroll.input_meal_allowance"/>
<field name="struct_id" ref="l10n_id_hr_payroll.hr_payroll_structure_id_employee_salary"/>
</record>
<record id="salary_rule_id_level_allowance" model="hr.salary.rule">
<field name="category_id" ref="hr_payroll.ALW"/>
<field name="name">Level Allowance</field>
<field name="code">LEVEL</field>
<field name="sequence">2</field>
<field name="condition_select">input</field>
<field name="condition_other_input_id" ref="l10n_id_hr_payroll.input_level_allowance"/>
<field name="amount_select">input</field>
<field name="amount_other_input_id" ref="l10n_id_hr_payroll.input_level_allowance"/>
<field name="struct_id" ref="l10n_id_hr_payroll.hr_payroll_structure_id_employee_salary"/>
</record>
<!-- BASE: show the BASIC + benefits -->
<record id="salary_rule_id_base_salary" model="hr.salary.rule">
<field name="category_id" ref="l10n_id_hr_payroll.BASE"/>
<field name="name">Basic + Benefits</field>
<field name="code">BASE</field>
<field name="sequence">3</field>
<field name="condition_select">none</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">
result = categories['BASIC'] + categories['ALW']
</field>
<field name="struct_id" ref="l10n_id_hr_payroll.hr_payroll_structure_id_employee_salary"/>
</record>
<!-- Allowance: company contribution -->
<record id="salary_rule_id_bpjs_jkk" model="hr.salary.rule">
<field name="category_id" ref="hr_payroll.COMP"/>
<field name="name">(Allowance) BPJS JKK</field>
<field name="code">BPJS_JKK</field>
<field name="sequence">4</field>
<field name="condition_select">python</field>
<field name="condition_python">result = version.l10n_id_bpjs_jkk and payslip.l10n_id_include_jkk_jkm</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">
result = payslip._l10n_id_get_worked_days_rate() * version.wage * version.l10n_id_bpjs_jkk
</field>
<field name="struct_id" ref="l10n_id_hr_payroll.hr_payroll_structure_id_employee_salary"/>
</record>
<record id="salary_rule_id_bpjs_jkm" model="hr.salary.rule">
<field name="category_id" ref="hr_payroll.COMP"/>
<field name="name">(Allowance) BPJS JKM</field>
<field name="code">BPJS_JKM</field>
<field name="sequence">4</field>
<field name="condition_select">python</field>
<field name="condition_python">result = payslip.l10n_id_include_jkk_jkm</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">
result = payslip._l10n_id_get_worked_days_rate() * version.wage
result_rate = payslip._rule_parameter('l10n_id_jkm_percentage')
</field>
<field name="struct_id" ref="l10n_id_hr_payroll.hr_payroll_structure_id_employee_salary"/>
</record>
<record id="salary_rule_id_bpjs_kesehatan" model="hr.salary.rule">
<field name="category_id" ref="hr_payroll.COMP"/>
<field name="name">(Allowance) BPJS Kesehatan</field>
<field name="code">BPJS_Kesehatan</field>
<field name="sequence">4</field>
<field name="condition_select">python</field>
<field name="condition_python">result = payslip.l10n_id_include_bpjs_kesehatan</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">
result = min(payslip._l10n_id_get_worked_days_rate() * version.wage, payslip._rule_parameter('l10n_id_bpjs_salary_threshold'))
result_rate = payslip._rule_parameter('l10n_id_alw_bpjs_kesehatan_percent')
</field>
<field name="struct_id" ref="l10n_id_hr_payroll.hr_payroll_structure_id_employee_salary"/>
</record>
<!-- GROSS: BASIC + ALW + COMP -->
<record id="l10n_id_hr_payroll_structure_id_employee_salary_gross_salary_rule" model="hr.salary.rule">
<field name="category_id" ref="hr_payroll.GROSS"/>
<field name="name">Taxable Salary</field>
<field name="sequence">100</field>
<field name="code">GROSS</field>
<field name="condition_select">none</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">
result = categories['BASE'] + categories['COMP']
</field>
<field name="struct_id" ref="hr_payroll_structure_id_employee_salary"/>
</record>
<!-- DEDUCTIONS -->
<record id="salary_rule_id_jht" model="hr.salary.rule">
<field name="category_id" ref="hr_payroll.DED"/>
<field name="name">JHT</field>
<field name="code">JHT</field>
<field name="sequence">110</field>
<field name="condition_select">python</field>
<field name="condition_python">result = payslip.l10n_id_include_jkk_jkm</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">
result_rate = payslip._rule_parameter('l10n_id_jht_percent')
result = - payslip._l10n_id_get_worked_days_rate() * version.wage
</field>
<field name="struct_id" ref="l10n_id_hr_payroll.hr_payroll_structure_id_employee_salary"/>
</record>
<record id="salary_rule_id_bpjs_sehat_ded" model="hr.salary.rule">
<field name="category_id" ref="hr_payroll.DED"/>
<field name="name">BPJS Kesehatan Deduction</field>
<field name="code">BPJS_KESEHATAN_DED</field>
<field name="sequence">110</field>
<field name="condition_select">python</field>
<field name="condition_python">result = payslip.l10n_id_include_bpjs_kesehatan</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">
result = - min(payslip._l10n_id_get_worked_days_rate() * version.wage, payslip._rule_parameter('l10n_id_bpjs_salary_threshold'))
result_rate = payslip._rule_parameter('l10n_id_ded_bpjs_kesehatan_percent')
</field>
<field name="struct_id" ref="l10n_id_hr_payroll.hr_payroll_structure_id_employee_salary"/>
</record>
<record id="salary_rule_id_jp" model="hr.salary.rule">
<field name="category_id" ref="hr_payroll.DED"/>
<field name="name">JP</field>
<field name="code">JP</field>
<field name="sequence">110</field>
<field name="condition_select">python</field>
<field name="condition_python">result = payslip.l10n_id_include_jkk_jkm</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">
result = - min(payslip._l10n_id_get_worked_days_rate() * version.wage, payslip._rule_parameter('l10n_id_jp_threshold'))
result_rate = payslip._rule_parameter('l10n_id_jp_percent')
</field>
<field name="struct_id" ref="l10n_id_hr_payroll.hr_payroll_structure_id_employee_salary"/>
</record>
<!-- Components to calculate PPH21, only applicable when end of contract/year -->
<record id="salary_rule_id_jabatan" model="hr.salary.rule">
<field name="category_id" ref="l10n_id_hr_payroll.JABATAN"/>
<field name="name">Biaya Jabatan</field>
<field name="code">JABATAN</field>
<field name="sequence">111</field>
<field name="condition_select">python</field>
<field name="condition_python">result = payslip.l10n_id_include_pkp_ptkp and employee.employee_type == 'employee'</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">
gross_total = payslip._l10n_id_get_gross_accumulated()
amount_to_apply = min(payslip._rule_parameter('l10n_id_biaya_jabatan_salary_threshold'), categories['GROSS'])
to_add = (payslip._rule_parameter('l10n_id_biaya_jabatan_percent') / 100 ) * amount_to_apply
result = gross_total + to_add
</field>
<field name="struct_id" ref="l10n_id_hr_payroll.hr_payroll_structure_id_employee_salary"/>
</record>
<record id="salary_rule_id_ptkp" model="hr.salary.rule">
<field name="category_id" ref="l10n_id_hr_payroll.PTKP"/>
<field name="name">PTKP</field>
<field name="code">PTKP</field>
<field name="sequence">120</field>
<field name="condition_select">python</field>
<field name="condition_python">result = payslip.l10n_id_include_pkp_ptkp</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">
status_ptk_map = {'tk0': 54, "tk1": 58.5, "tk2": 63, "tk3": 67.5, "k0": 58.5, "k1": 63, "k2": 67.5, "k3": 72, "ki0": 112.5, "ki1": 117, "ki2": 121.5, "ki3": 126}
result = status_ptk_map[employee.l10n_id_kode_ptkp] * 10**6
</field>
<field name="struct_id" ref="l10n_id_hr_payroll.hr_payroll_structure_id_employee_salary"/>
</record>
<record id="salary_rule_id_pkp" model="hr.salary.rule">
<field name="category_id" ref="l10n_id_hr_payroll.PKP"/>
<field name="name">PKP</field>
<field name="code">PKP</field>
<field name="sequence">121</field>
<field name="condition_select">python</field>
<field name="condition_python">result = payslip.l10n_id_include_pkp_ptkp</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">
result = max(0, payslip._l10n_id_get_total_gross() + categories['GROSS'] - categories['JABATAN'] - categories['PTKP'])
</field>
<field name="struct_id" ref="l10n_id_hr_payroll.hr_payroll_structure_id_employee_salary"/>
</record>
<!-- PPH21: -->
<record id="salary_rule_id_pph" model="hr.salary.rule">
<field name="category_id" ref="l10n_id_hr_payroll.PPH21"/>
<field name="name">PPH 21</field>
<field name="code">PPH21</field>
<field name="sequence">122</field>
<field name="condition_select">none</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">
# regular period
if payslip.l10n_id_include_pkp_ptkp:
# end of year/end of contract
thresholds = [60, 190, 250, 4500]
percentages = [5, 15, 25, 30]
level = 0
total = categories['PKP']
pph21 = 0
while total &gt; 0 and level &lt;= 3:
to_reduce = min(total, thresholds[level] * 1e6)
pph21 += to_reduce * percentages[level] / 100
total -= to_reduce
level += 1
pph21 += total * 0.35 # should now contain the yearly
total_yearly = -payslip._l10n_id_get_end_total_pph_amount()
result = pph21 - total_yearly
else:
amount_to_apply = categories['GROSS']
percentage = payslip._l10n_id_get_pph21_amount(amount_to_apply)
result = categories['GROSS'] * (percentage / 100)
result = -result
</field>
<field name="struct_id" ref="l10n_id_hr_payroll.hr_payroll_structure_id_employee_salary"/>
</record>
<record id="l10n_id_hr_payroll_structure_id_employee_salary_attachment_of_salary_rule" model="hr.salary.rule">
<field name="category_id" ref="hr_payroll.DED"/>
<field name="name">Attachment of Salary</field>
<field name="sequence">174</field>
<field name="code">ATTACH_SALARY</field>
<field name="condition_select">python</field>
<field name="condition_python">result = 'ATTACH_SALARY' in inputs</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">
result = -inputs['ATTACH_SALARY'].amount
result_name = inputs['ATTACH_SALARY'].name
</field>
<field name="struct_id" ref="hr_payroll_structure_id_employee_salary"/>
</record>
<record id="l10n_id_hr_payroll_structure_id_employee_salary_assignment_of_salary_rule" model="hr.salary.rule">
<field name="category_id" ref="hr_payroll.DED"/>
<field name="name">Assignment of Salary</field>
<field name="sequence">174</field>
<field name="code">ASSIG_SALARY</field>
<field name="condition_select">python</field>
<field name="condition_python">result = 'ASSIG_SALARY' in inputs</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">
result = -inputs['ASSIG_SALARY'].amount
result_name = inputs['ASSIG_SALARY'].name
</field>
<field name="struct_id" ref="hr_payroll_structure_id_employee_salary"/>
</record>
<record id="l10n_id_hr_payroll_structure_id_employee_salary_child_support" model="hr.salary.rule">
<field name="category_id" ref="hr_payroll.DED"/>
<field name="name">Child Support</field>
<field name="code">CHILD_SUPPORT</field>
<field name="amount_select">code</field>
<field name="sequence">174</field>
<field name="condition_select">python</field>
<field name="condition_python">result = 'CHILD_SUPPORT' in inputs</field>
<field name="amount_python_compute">
result = -inputs['CHILD_SUPPORT'].amount
result_name = inputs['CHILD_SUPPORT'].name
</field>
<field name="struct_id" ref="hr_payroll_structure_id_employee_salary"/>
</record>
<record id="l10n_id_hr_payroll_structure_id_employee_salary_deduction_salary_rule" model="hr.salary.rule">
<field name="category_id" ref="hr_payroll.DED"/>
<field name="name">Deduction</field>
<field name="sequence">198</field>
<field name="code">DEDUCTION</field>
<field name="condition_select">python</field>
<field name="condition_python">result = 'DEDUCTION' in inputs</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">
result = -inputs['DEDUCTION'].amount
result_name = inputs['DEDUCTION'].name
</field>
<field name="struct_id" ref="hr_payroll_structure_id_employee_salary"/>
</record>
<record id="l10n_id_hr_payroll_structure_id_employee_salary_reimbursement_salary_rule" model="hr.salary.rule">
<field name="category_id" ref="hr_payroll.ALW"/>
<field name="name">Reimbursement</field>
<field name="sequence">199</field>
<field name="code">REIMBURSEMENT</field>
<field name="condition_select">python</field>
<field name="condition_python">result = 'REIMBURSEMENT' in inputs</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">
result = inputs['REIMBURSEMENT'].amount
result_name = inputs['REIMBURSEMENT'].name
</field>
<field name="struct_id" ref="hr_payroll_structure_id_employee_salary"/>
</record>
<record id="l10n_id_hr_payroll_structure_id_employee_salary_net_salary" model="hr.salary.rule">
<field name="category_id" ref="hr_payroll.NET"/>
<field name="name">Net Salary</field>
<field name="sequence">200</field>
<field name="code">NET</field>
<field name="appears_on_employee_cost_dashboard" eval="True"/>
<field name="condition_select">none</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">
result = categories['BASIC'] + categories['ALW'] + categories['DED']
</field>
<field name="struct_id" ref="hr_payroll_structure_id_employee_salary"/>
</record>
</odoo>
@@ -0,0 +1,205 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo noupdate="1">
<record id="base.partner_demo_company_id" model="res.partner" forcecreate="1">
<field name="name">My Indonesian Company</field>
<field name="country_id" ref="base.id"/>
</record>
<record id="base.demo_company_id" model="res.company" forcecreate="1">
<field name="name">My Indonesian Company</field>
<field name="partner_id" ref="base.partner_demo_company_id"/>
<field name="currency_id" ref="base.IDR"/>
<field name="street">Indonesian Street</field>
<field name="zip">10110</field>
<field name="city">Jakarta</field>
<field name="country_id" ref="base.id"/>
<field name="resource_calendar_id" ref="resource_calendar_standard" />
</record>
<record id="base.user_admin" model="res.users">
<field name="company_ids" eval="[(4, ref('base.demo_company_id'))]"/>
</record>
<record id="base.user_demo" model="res.users">
<field name="company_ids" eval="[(4, ref('base.demo_company_id'))]"/>
</record>
<record id="id_hr_department_rd" model="hr.department">
<field name="name">R&amp;D ID</field>
<field name="company_id" ref="base.demo_company_id"/>
</record>
<record id="res_partner_siti" model="res.partner">
<field name="name">Siti Kusuma</field>
<field name="street">Jalan Kenanga</field>
<field name="city">Surabaya</field>
<field name="zip">60293</field>
<field name="state_id" ref="base.state_id_ji"/>
<field name="country_id" ref="base.id"/>
<field name="phone">0999-9876-5432</field>
<field name="company_id" ref="base.demo_company_id"/>
</record>
<record id="res_partner_siti" model="res.partner">
<field name="email" model="res.partner" eval="'demo.' + obj(ref('l10n_id_hr_payroll.res_partner_siti')).name.split(' ')[-1].lower() + '@example.com'"/>
</record>
<record id="res_partner_agus" model="res.partner">
<field name="name">Agus Pratama</field>
<field name="street">Jalan Melati</field>
<field name="city">Jakarta</field>
<field name="zip">10110</field>
<field name="state_id" ref="base.state_id_jk"/>
<field name="country_id" ref="base.id"/>
<field name="phone">0999-3456-7890</field>
<field name="company_id" ref="base.demo_company_id"/>
</record>
<record id="res_partner_agus" model="res.partner">
<field name="email" model="res.partner" eval="'demo.' + obj(ref('l10n_id_hr_payroll.res_partner_agus')).name.split(' ')[-1].lower() + '@example.com'"/>
</record>
<record id="user_agus" model="res.users">
<field name="partner_id" ref="l10n_id_hr_payroll.res_partner_agus"/>
<!-- firstname.lastname@example.com -->
<field name="login" model="res.partner" eval="obj(ref('l10n_id_hr_payroll.res_partner_agus')).name.replace(' ', '.').lower() + '@example.com'"/>
<field name="signature" model="res.partner" eval="obj(ref('l10n_id_hr_payroll.res_partner_agus')).name.split(' ')[0][0] + '. ' + obj(ref('l10n_id_hr_payroll.res_partner_agus')).name.split(' ')[-1]"/>
<field name="company_ids" eval="[(4, ref('base.demo_company_id'))]"/>
<field name="company_id" ref="base.demo_company_id"/>
<field name="group_ids" eval="[(6,0,[ref('base.group_user')])]"/>
<field name="image_1920" type="base64" file="hr/static/img/employee_al-image.jpg"/>
</record>
<record id="id_res_bank_central_asia" model="res.bank">
<field name="name">Bank Central Asia</field>
<field name="bic">CENAIDJAXXX</field>
<field name="street">Jalan Bank Central Asia</field>
<field name="city">Surabaya</field>
<field name="zip">10350</field>
<field name="state" ref="base.state_id_ji"/>
<field name="country" ref="base.id"/>
<field name="phone">99-2379 4879</field>
</record>
<record id="id_res_bank_central_asia" model="res.bank">
<field name="email" model="res.bank" eval="obj(ref('l10n_id_hr_payroll.id_res_bank_central_asia')).name.replace(' ', '.').lower() + '@example.com'"/>
</record>
<record id="id_res_bank_mandiri" model="res.bank">
<field name="name">Bank Mandiri</field>
<field name="bic">BMRIIDJAXXX</field>
<field name="street">Jalan Bank Mandiri</field>
<field name="city">Jakarta</field>
<field name="zip">10210</field>
<field name="state" ref="base.state_id_jk"/>
<field name="country" ref="base.id"/>
<field name="phone">99-5299 1273</field>
</record>
<record id="id_res_bank_mandiri" model="res.bank">
<field name="email" model="res.bank" eval="obj(ref('l10n_id_hr_payroll.id_res_bank_mandiri')).name.replace(' ', '.').lower() + '@example.com'"/>
</record>
<record id="res_partner_bank_account_siti" model="res.partner.bank">
<field name="acc_number">099345678901</field>
<field name="allow_out_payment" eval="True"/>
<field name="bank_id" ref="l10n_id_hr_payroll.id_res_bank_central_asia"/>
<field name="partner_id" ref="l10n_id_hr_payroll.res_partner_siti"/>
<field name="company_id" ref="base.demo_company_id"/>
<field name="currency_id" ref="base.IDR"/>
</record>
<record id="res_partner_bank_account_agus" model="res.partner.bank">
<field name="acc_number">0099234567890</field>
<field name="allow_out_payment" eval="True"/>
<field name="bank_id" ref="l10n_id_hr_payroll.id_res_bank_mandiri"/>
<field name="partner_id" ref="l10n_id_hr_payroll.res_partner_agus"/>
<field name="company_id" ref="base.demo_company_id"/>
<field name="currency_id" ref="base.IDR"/>
</record>
<record id="hr_employee_siti" model="hr.employee">
<field name="name" model="res.partner" eval="obj(ref('l10n_id_hr_payroll.res_partner_siti')).name"/>
<field name="image_1920" type="base64" file="hr/static/img/employee_mit-image.jpg"/>
<field name="work_phone">0999-1234-0001</field>
<field name="work_email" model="res.partner" eval="obj(ref('l10n_id_hr_payroll.res_partner_siti')).name.replace(' ', '.').lower() + '@example.com'"/>
<field name="work_contact_id" ref="l10n_id_hr_payroll.res_partner_siti"/>
<field name="company_id" model="res.partner" eval="obj(ref('l10n_id_hr_payroll.res_partner_siti')).company_id"/>
<field name="resource_calendar_id" ref="resource.resource_calendar_std"/>
<field name="tz">Asia/Jakarta</field>
<field name="private_street" model="res.partner" eval="obj(ref('l10n_id_hr_payroll.res_partner_siti')).street"/>
<field name="private_city" model="res.partner" eval="obj(ref('l10n_id_hr_payroll.res_partner_siti')).city"/>
<field name="private_zip" model="res.partner" eval="obj(ref('l10n_id_hr_payroll.res_partner_siti')).zip"/>
<field name="private_state_id" model="res.partner" eval="obj(ref('l10n_id_hr_payroll.res_partner_siti')).state_id"/>
<field name="private_country_id" model="res.partner" eval="obj(ref('l10n_id_hr_payroll.res_partner_siti')).country_id"/>
<field name="private_email" model="res.partner" eval="obj(ref('l10n_id_hr_payroll.res_partner_siti')).email"/>
<field name="private_phone" model="res.partner" eval="obj(ref('l10n_id_hr_payroll.res_partner_siti')).phone"/>
<field name="distance_home_work">1</field>
<field name="country_id" model="res.partner" eval="obj(ref('l10n_id_hr_payroll.res_partner_siti')).country_id"/>
<field name="identification_id">3174990907961234</field>
<field name="sex">female</field>
<field name="birthday" eval="datetime(1996, 7, 9).date()"/>
<field name="place_of_birth">Surabaya</field>
<field name="country_of_birth" model="res.partner" eval="obj(ref('l10n_id_hr_payroll.res_partner_siti')).country_id"/>
<field name="emergency_contact">Endang Kusuma</field>
<field name="emergency_phone">0999-1930-2130</field>
<field name="certificate">master</field>
<field name="study_field">Engineering</field>
<field name="study_school">Airlangga University</field>
<field name="marital">single</field>
<field name="bank_account_ids" eval="[(4, ref('l10n_id_hr_payroll.res_partner_bank_account_siti'))]"/>
<field name="job_id" ref="hr.job_developer"/>
<field name="department_id" ref="l10n_id_hr_payroll.id_hr_department_rd"/>
<field name="structure_type_id" ref="l10n_id_hr_payroll.structure_type_employee_id"/>
<field name="wage_type">monthly</field>
<field name="wage">12550000</field>
<field name="hr_responsible_id" ref="base.user_demo"/>
<field name="date_version" eval="datetime(2020, 3, 16).date()"/>
<field name="contract_date_start" eval="datetime(2020, 3, 16).date()"/>
</record>
<record id="hr_employee_agus" model="hr.employee">
<field name="name" model="res.partner" eval="obj(ref('l10n_id_hr_payroll.res_partner_agus')).name"/>
<field name="image_1920" type="base64" file="hr/static/img/employee_al-image.jpg"/>
<field name="work_phone">0999-1234-0002</field>
<field name="work_email" model="res.partner" eval="obj(ref('l10n_id_hr_payroll.res_partner_agus')).name.replace(' ', '.').lower() + '@example.com'"/>
<field name="parent_id" ref="l10n_id_hr_payroll.hr_employee_siti"/>
<field name="user_id" ref="l10n_id_hr_payroll.user_agus"/>
<field name="company_id" ref="base.demo_company_id"/>
<field name="resource_calendar_id" ref="resource.resource_calendar_std"/>
<field name="tz">Asia/Jakarta</field>
<field name="private_street" model="res.partner" eval="obj(ref('l10n_id_hr_payroll.res_partner_agus')).street"/>
<field name="private_city" model="res.partner" eval="obj(ref('l10n_id_hr_payroll.res_partner_agus')).city"/>
<field name="private_zip" model="res.partner" eval="obj(ref('l10n_id_hr_payroll.res_partner_agus')).zip"/>
<field name="private_state_id" model="res.partner" eval="obj(ref('l10n_id_hr_payroll.res_partner_agus')).state_id"/>
<field name="private_country_id" model="res.partner" eval="obj(ref('l10n_id_hr_payroll.res_partner_agus')).country_id"/>
<field name="private_email" model="res.partner" eval="obj(ref('l10n_id_hr_payroll.res_partner_agus')).email"/>
<field name="private_phone" model="res.partner" eval="obj(ref('l10n_id_hr_payroll.res_partner_agus')).phone"/>
<field name="distance_home_work">3</field>
<field name="country_id" model="res.partner" eval="obj(ref('l10n_id_hr_payroll.res_partner_agus')).country_id"/>
<field name="identification_id">3174991701932345</field>
<field name="sex">male</field>
<field name="birthday" eval="datetime(1993, 1, 17).date()"/>
<field name="place_of_birth">Jakarta</field>
<field name="country_of_birth" model="res.partner" eval="obj(ref('l10n_id_hr_payroll.res_partner_agus')).country_id"/>
<field name="emergency_contact">Bambang Pratama</field>
<field name="emergency_phone">0999-3839-8678</field>
<field name="certificate">master</field>
<field name="study_field">Computer Science</field>
<field name="study_school">University of Indonesia</field>
<field name="marital">single</field>
<field name="bank_account_ids" eval="[(4, ref('l10n_id_hr_payroll.res_partner_bank_account_agus'))]"/>
<field name="job_id" ref="hr.job_consultant"/>
<field name="department_id" ref="l10n_id_hr_payroll.id_hr_department_rd"/>
<field name="structure_type_id" ref="l10n_id_hr_payroll.structure_type_employee_id"/>
<field name="wage_type">monthly</field>
<field name="wage">8750000</field>
<field name="hr_responsible_id" ref="base.user_demo"/>
<field name="contract_date_start" eval="datetime(2022, 6, 1).date()"/>
<field name="date_version" eval="datetime(2022, 6, 1).date()"/>
</record>
<record id="l10n_id_hr_payroll.structure_type_employee_id" model="hr.payroll.structure.type">
<field name="default_resource_calendar_id" ref="resource_calendar_standard" />
</record>
<record id="l10n_id_hr_payroll.resource_calendar_standard" model="resource.calendar">
<field name="company_id" ref="base.demo_company_id" />
</record>
</odoo>
@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo noupdate="1">
<record id="resource_calendar_standard" model="resource.calendar">
<field name="name">Indonesia Standard 40 hours/week</field>
<field name="tz">Asia/Jakarta</field>
<field name="attendance_ids"
eval="[(5, 0, 0),
(0, 0, {'name': 'Monday Morning', 'dayofweek': '0', 'hour_from': 8, 'hour_to': 12, 'day_period': 'morning'}),
(0, 0, {'name': 'Monday Lunch', 'dayofweek': '0', 'hour_from': 12, 'hour_to': 13, 'day_period': 'lunch'}),
(0, 0, {'name': 'Monday Afternoon', 'dayofweek': '0', 'hour_from': 13, 'hour_to': 17.0, 'day_period': 'afternoon'}),
(0, 0, {'name': 'Tuesday Morning', 'dayofweek': '1', 'hour_from': 8, 'hour_to': 12, 'day_period': 'morning'}),
(0, 0, {'name': 'Tuesday Lunch', 'dayofweek': '1', 'hour_from': 12, 'hour_to': 13, 'day_period': 'lunch'}),
(0, 0, {'name': 'Tuesday Afternoon', 'dayofweek': '1', 'hour_from': 13, 'hour_to': 17.0, 'day_period': 'afternoon'}),
(0, 0, {'name': 'Wednesday Morning', 'dayofweek': '2', 'hour_from': 8, 'hour_to': 12, 'day_period': 'morning'}),
(0, 0, {'name': 'Wednesday Lunch', 'dayofweek': '2', 'hour_from': 12, 'hour_to': 13, 'day_period': 'lunch'}),
(0, 0, {'name': 'Wednesday Afternoon', 'dayofweek': '2', 'hour_from': 13, 'hour_to': 17.0, 'day_period': 'afternoon'}),
(0, 0, {'name': 'Thursday Morning', 'dayofweek': '3', 'hour_from': 8, 'hour_to': 12, 'day_period': 'morning'}),
(0, 0, {'name': 'Thursday Lunch', 'dayofweek': '3', 'hour_from': 12, 'hour_to': 13, 'day_period': 'lunch'}),
(0, 0, {'name': 'Thursday Afternoon', 'dayofweek': '3', 'hour_from': 13, 'hour_to': 17.0, 'day_period': 'afternoon'}),
(0, 0, {'name': 'Friday Morning', 'dayofweek': '4', 'hour_from': 8, 'hour_to': 12, 'day_period': 'morning'}),
(0, 0, {'name': 'Friday Lunch', 'dayofweek': '4', 'hour_from': 12, 'hour_to': 13, 'day_period': 'lunch'}),
(0, 0, {'name': 'Friday Afternoon', 'dayofweek': '4', 'hour_from': 13, 'hour_to': 17.0, 'day_period': 'afternoon'}),
]"
/>
</record>
</odoo>
+378
View File
@@ -0,0 +1,378 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * l10n_id_hr_payroll
#
# Weblate <noreply-mt-weblate@weblate.org>, 2025, 2026.
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 19.0+e\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-17 18:06+0000\n"
"PO-Revision-Date: 2026-04-20 07:31+0000\n"
"Last-Translator: Weblate <noreply-mt-weblate@weblate.org>\n"
"Language-Team: Indonesian <https://translate.odoo.com/projects/odoo-19-l10n/"
"l10n_id_hr_payroll/id/>\n"
"Language: id\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 5.16.2\n"
#. module: l10n_id_hr_payroll
#: model:hr.salary.rule,name:l10n_id_hr_payroll.salary_rule_id_bpjs_jkk
msgid "(Allowance) BPJS JKK"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.salary.rule,name:l10n_id_hr_payroll.salary_rule_id_bpjs_jkm
msgid "(Allowance) BPJS JKM"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.salary.rule,name:l10n_id_hr_payroll.salary_rule_id_bpjs_kesehatan
msgid "(Allowance) BPJS Kesehatan"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.salary.rule,name:l10n_id_hr_payroll.l10n_id_hr_payroll_structure_id_employee_salary_assignment_of_salary_rule
msgid "Assignment of Salary"
msgstr "Pemberian Gaji"
#. module: l10n_id_hr_payroll
#: model:hr.salary.rule,name:l10n_id_hr_payroll.l10n_id_hr_payroll_structure_id_employee_salary_attachment_of_salary_rule
msgid "Attachment of Salary"
msgstr "Lampiran Gaji"
#. module: l10n_id_hr_payroll
#: model:ir.model.fields,field_description:l10n_id_hr_payroll.field_hr_employee__l10n_id_bpjs_jkk
#: model:ir.model.fields,field_description:l10n_id_hr_payroll.field_hr_version__l10n_id_bpjs_jkk
msgid "BPJS JKK"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:ir.model.fields,field_description:l10n_id_hr_payroll.field_res_config_settings__default_l10n_id_bpjs_jkk
msgid "BPJS JKK (%)"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.salary.rule,name:l10n_id_hr_payroll.salary_rule_id_bpjs_sehat_ded
msgid "BPJS Kesehatan Deduction"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.salary.rule.category,name:l10n_id_hr_payroll.BASE
msgid "Base Salary"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.salary.rule,name:l10n_id_hr_payroll.salary_rule_id_base_salary
msgid "Basic + Benefits"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.salary.rule,name:l10n_id_hr_payroll.l10n_id_hr_payroll_structure_id_employee_salary_basic_salary_rule
msgid "Basic Salary"
msgstr "Gaji Pokok"
#. module: l10n_id_hr_payroll
#: model:hr.salary.rule,name:l10n_id_hr_payroll.salary_rule_id_jabatan
msgid "Biaya Jabatan"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.salary.rule,name:l10n_id_hr_payroll.l10n_id_hr_payroll_structure_id_employee_salary_child_support
msgid "Child Support"
msgstr "Bantuan Anak"
#. module: l10n_id_hr_payroll
#: model_terms:ir.ui.view,arch_db:l10n_id_hr_payroll.res_config_settings_view_form
msgid "Company Information"
msgstr "Informasi Perusahaan"
#. module: l10n_id_hr_payroll
#: model:ir.model,name:l10n_id_hr_payroll.model_res_config_settings
msgid "Config Settings"
msgstr "Pengaturan Konfigurasi"
#. module: l10n_id_hr_payroll
#: model:hr.salary.rule,name:l10n_id_hr_payroll.l10n_id_hr_payroll_structure_id_employee_salary_deduction_salary_rule
msgid "Deduction"
msgstr "Potongan"
#. module: l10n_id_hr_payroll
#: model:ir.model.fields,field_description:l10n_id_hr_payroll.field_hr_employee__display_name
#: model:ir.model.fields,field_description:l10n_id_hr_payroll.field_hr_payroll_structure_type__display_name
#: model:ir.model.fields,field_description:l10n_id_hr_payroll.field_hr_payslip__display_name
#: model:ir.model.fields,field_description:l10n_id_hr_payroll.field_hr_version__display_name
#: model:ir.model.fields,field_description:l10n_id_hr_payroll.field_res_config_settings__display_name
msgid "Display Name"
msgstr "Nama Tampilan"
#. module: l10n_id_hr_payroll
#: model:ir.model,name:l10n_id_hr_payroll.model_hr_employee
msgid "Employee"
msgstr "Karyawan"
#. module: l10n_id_hr_payroll
#: model:ir.model,name:l10n_id_hr_payroll.model_hr_version
msgid "Employee Contract"
msgstr "Kontrak Karyawan"
#. module: l10n_id_hr_payroll
#: model:ir.model.fields,help:l10n_id_hr_payroll.field_hr_employee__l10n_id_kode_ptkp
#: model:ir.model.fields,help:l10n_id_hr_payroll.field_hr_version__l10n_id_kode_ptkp
msgid ""
"Employee's tax category that depends on their marital status and number of "
"children"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:ir.model.fields,field_description:l10n_id_hr_payroll.field_hr_employee__id
#: model:ir.model.fields,field_description:l10n_id_hr_payroll.field_hr_payroll_structure_type__id
#: model:ir.model.fields,field_description:l10n_id_hr_payroll.field_hr_payslip__id
#: model:ir.model.fields,field_description:l10n_id_hr_payroll.field_hr_version__id
#: model:ir.model.fields,field_description:l10n_id_hr_payroll.field_res_config_settings__id
msgid "ID"
msgstr "ID"
#. module: l10n_id_hr_payroll
#: model:hr.payslip.input.type,name:l10n_id_hr_payroll.input_incentive
msgid "INSENTIF"
msgstr ""
#. module: l10n_id_hr_payroll
#: model_terms:ir.ui.view,arch_db:l10n_id_hr_payroll.hr_payslip_view_form
msgid "Include BPJS Kesehatan"
msgstr ""
#. module: l10n_id_hr_payroll
#: model_terms:ir.ui.view,arch_db:l10n_id_hr_payroll.hr_payslip_view_form
msgid "Include JKK JKM"
msgstr ""
#. module: l10n_id_hr_payroll
#: model_terms:ir.ui.view,arch_db:l10n_id_hr_payroll.hr_payslip_view_form
msgid "Include PTKP and PKP calculation"
msgstr ""
#. module: l10n_id_hr_payroll
#: model_terms:ir.ui.view,arch_db:l10n_id_hr_payroll.res_config_settings_view_form
msgid "Indonesia Localization"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.payroll.structure,name:l10n_id_hr_payroll.hr_payroll_structure_id_employee_salary
msgid "Indonesia: Regular Pay"
msgstr ""
#. module: l10n_id_hr_payroll
#: model_terms:ir.ui.view,arch_db:l10n_id_hr_payroll.hr_contract_template_view_form
#: model_terms:ir.ui.view,arch_db:l10n_id_hr_payroll.hr_employee_view_form
msgid "Indonesian Payroll"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.salary.rule,name:l10n_id_hr_payroll.salary_rule_id_incentive
msgid "Insentif"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.salary.rule,name:l10n_id_hr_payroll.salary_rule_id_insurance
msgid "Insurance"
msgstr "Asuransi"
#. module: l10n_id_hr_payroll
#: model:hr.payslip.input.type,name:l10n_id_hr_payroll.input_insurance_allowance
msgid "Insurance Allowance"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.salary.rule,name:l10n_id_hr_payroll.salary_rule_id_jht
msgid "JHT"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.salary.rule,name:l10n_id_hr_payroll.salary_rule_id_jp
msgid "JP"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.salary.rule.category,name:l10n_id_hr_payroll.JABATAN
msgid "Jabatan"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:ir.model.fields.selection,name:l10n_id_hr_payroll.selection__hr_version__l10n_id_kode_ptkp__k0
msgid "K/0"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:ir.model.fields.selection,name:l10n_id_hr_payroll.selection__hr_version__l10n_id_kode_ptkp__k1
msgid "K/1"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:ir.model.fields.selection,name:l10n_id_hr_payroll.selection__hr_version__l10n_id_kode_ptkp__k2
msgid "K/2"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:ir.model.fields.selection,name:l10n_id_hr_payroll.selection__hr_version__l10n_id_kode_ptkp__k3
msgid "K/3"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:ir.model.fields,field_description:l10n_id_hr_payroll.field_hr_payslip__l10n_id_include_bpjs_kesehatan
msgid "L10N Id Include Bpjs Kesehatan"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:ir.model.fields,field_description:l10n_id_hr_payroll.field_hr_payslip__l10n_id_include_jkk_jkm
msgid "L10N Id Include Jkk Jkm"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:ir.model.fields,field_description:l10n_id_hr_payroll.field_hr_payslip__l10n_id_include_pkp_ptkp
msgid "L10N Id Include Pkp Ptkp"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.payslip.input.type,name:l10n_id_hr_payroll.input_laptop_allowance
msgid "Laptop Allowance"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.salary.rule,name:l10n_id_hr_payroll.salary_rule_id_laptop
msgid "Latpop"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.payslip.input.type,name:l10n_id_hr_payroll.input_level_allowance
#: model:hr.salary.rule,name:l10n_id_hr_payroll.salary_rule_id_level_allowance
msgid "Level Allowance"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.payslip.input.type,name:l10n_id_hr_payroll.input_meal_allowance
#: model:hr.salary.rule,name:l10n_id_hr_payroll.salary_rule_id_meal_allowance
msgid "Meal Allowance"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.salary.rule,name:l10n_id_hr_payroll.l10n_id_hr_payroll_structure_id_employee_salary_net_salary
msgid "Net Salary"
msgstr "Gaji Bersih"
#. module: l10n_id_hr_payroll
#: model_terms:ir.ui.view,arch_db:l10n_id_hr_payroll.res_config_settings_view_form
msgid "Official Company Information"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.salary.rule,name:l10n_id_hr_payroll.salary_rule_id_pkp
#: model:hr.salary.rule.category,name:l10n_id_hr_payroll.PKP
msgid "PKP"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.salary.rule,name:l10n_id_hr_payroll.salary_rule_id_pph
#: model:hr.salary.rule.category,name:l10n_id_hr_payroll.PPH21
msgid "PPH 21"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.salary.rule.category,name:l10n_id_hr_payroll.PPH21_yearly
msgid "PPH 21 Yearly"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.salary.rule,name:l10n_id_hr_payroll.salary_rule_id_ptkp
#: model:hr.salary.rule.category,name:l10n_id_hr_payroll.PTKP
msgid "PTKP"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:ir.model.fields,field_description:l10n_id_hr_payroll.field_hr_employee__l10n_id_kode_ptkp
#: model:ir.model.fields,field_description:l10n_id_hr_payroll.field_hr_version__l10n_id_kode_ptkp
msgid "PTKP Code"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:ir.model,name:l10n_id_hr_payroll.model_hr_payslip
msgid "Pay Slip"
msgstr "Slip Gaji"
#. module: l10n_id_hr_payroll
#: model_terms:ir.ui.view,arch_db:l10n_id_hr_payroll.hr_payslip_line_view_tree_id_history
msgid "Payslip Lines"
msgstr "Baris Slip Gaji"
#. module: l10n_id_hr_payroll
#: model:hr.department,name:l10n_id_hr_payroll.id_hr_department_rd
msgid "R&D ID"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.payslip.input.type,name:l10n_id_hr_payroll.input_global_reimbursement
#: model:hr.salary.rule,name:l10n_id_hr_payroll.l10n_id_hr_payroll_structure_id_employee_salary_reimbursement_salary_rule
msgid "Reimbursement"
msgstr "Reimbursement"
#. module: l10n_id_hr_payroll
#: model:ir.model,name:l10n_id_hr_payroll.model_hr_payroll_structure_type
msgid "Salary Structure Type"
msgstr "Tipe Struktur Gaji"
#. module: l10n_id_hr_payroll
#: model:hr.payslip.input.type,name:l10n_id_hr_payroll.input_holiday_allowance
#: model:hr.salary.rule,name:l10n_id_hr_payroll.salary_rule_id_thr
msgid "THR"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:ir.model.fields.selection,name:l10n_id_hr_payroll.selection__hr_version__l10n_id_kode_ptkp__tk0
msgid "TK/0"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:ir.model.fields.selection,name:l10n_id_hr_payroll.selection__hr_version__l10n_id_kode_ptkp__tk1
msgid "TK/1"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:ir.model.fields.selection,name:l10n_id_hr_payroll.selection__hr_version__l10n_id_kode_ptkp__tk2
msgid "TK/2"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:ir.model.fields.selection,name:l10n_id_hr_payroll.selection__hr_version__l10n_id_kode_ptkp__tk3
msgid "TK/3"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.salary.rule,name:l10n_id_hr_payroll.l10n_id_hr_payroll_structure_id_employee_salary_gross_salary_rule
msgid "Taxable Salary"
msgstr "Gaji yang Dapat Dipajak"
#. module: l10n_id_hr_payroll
#: model:hr.payslip.input.type,name:l10n_id_hr_payroll.input_transport_allowance
#: model:hr.salary.rule,name:l10n_id_hr_payroll.salary_rule_id_transport_allowance
msgid "Transport Allowance"
msgstr ""
#. module: l10n_id_hr_payroll
#: model_terms:ir.ui.view,arch_db:l10n_id_hr_payroll.hr_employee_view_form
msgid "View GROSS/PPH21 History"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.salary.rule.category,name:l10n_id_hr_payroll.YEARLY_GROSS
msgid "Yearly Gross"
msgstr ""
#. module: l10n_id_hr_payroll
#. odoo-python
#: code:addons/l10n_id_hr_payroll/models/hr_payroll_structure_type.py:0
msgid "month"
msgstr ""
@@ -0,0 +1,374 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * l10n_id_hr_payroll
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 19.0+e\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-17 18:06+0000\n"
"PO-Revision-Date: 2026-07-17 18:06+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: l10n_id_hr_payroll
#: model:hr.salary.rule,name:l10n_id_hr_payroll.salary_rule_id_bpjs_jkk
msgid "(Allowance) BPJS JKK"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.salary.rule,name:l10n_id_hr_payroll.salary_rule_id_bpjs_jkm
msgid "(Allowance) BPJS JKM"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.salary.rule,name:l10n_id_hr_payroll.salary_rule_id_bpjs_kesehatan
msgid "(Allowance) BPJS Kesehatan"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.salary.rule,name:l10n_id_hr_payroll.l10n_id_hr_payroll_structure_id_employee_salary_assignment_of_salary_rule
msgid "Assignment of Salary"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.salary.rule,name:l10n_id_hr_payroll.l10n_id_hr_payroll_structure_id_employee_salary_attachment_of_salary_rule
msgid "Attachment of Salary"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:ir.model.fields,field_description:l10n_id_hr_payroll.field_hr_employee__l10n_id_bpjs_jkk
#: model:ir.model.fields,field_description:l10n_id_hr_payroll.field_hr_version__l10n_id_bpjs_jkk
msgid "BPJS JKK"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:ir.model.fields,field_description:l10n_id_hr_payroll.field_res_config_settings__default_l10n_id_bpjs_jkk
msgid "BPJS JKK (%)"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.salary.rule,name:l10n_id_hr_payroll.salary_rule_id_bpjs_sehat_ded
msgid "BPJS Kesehatan Deduction"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.salary.rule.category,name:l10n_id_hr_payroll.BASE
msgid "Base Salary"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.salary.rule,name:l10n_id_hr_payroll.salary_rule_id_base_salary
msgid "Basic + Benefits"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.salary.rule,name:l10n_id_hr_payroll.l10n_id_hr_payroll_structure_id_employee_salary_basic_salary_rule
msgid "Basic Salary"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.salary.rule,name:l10n_id_hr_payroll.salary_rule_id_jabatan
msgid "Biaya Jabatan"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.salary.rule,name:l10n_id_hr_payroll.l10n_id_hr_payroll_structure_id_employee_salary_child_support
msgid "Child Support"
msgstr ""
#. module: l10n_id_hr_payroll
#: model_terms:ir.ui.view,arch_db:l10n_id_hr_payroll.res_config_settings_view_form
msgid "Company Information"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:ir.model,name:l10n_id_hr_payroll.model_res_config_settings
msgid "Config Settings"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.salary.rule,name:l10n_id_hr_payroll.l10n_id_hr_payroll_structure_id_employee_salary_deduction_salary_rule
msgid "Deduction"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:ir.model.fields,field_description:l10n_id_hr_payroll.field_hr_employee__display_name
#: model:ir.model.fields,field_description:l10n_id_hr_payroll.field_hr_payroll_structure_type__display_name
#: model:ir.model.fields,field_description:l10n_id_hr_payroll.field_hr_payslip__display_name
#: model:ir.model.fields,field_description:l10n_id_hr_payroll.field_hr_version__display_name
#: model:ir.model.fields,field_description:l10n_id_hr_payroll.field_res_config_settings__display_name
msgid "Display Name"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:ir.model,name:l10n_id_hr_payroll.model_hr_employee
msgid "Employee"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:ir.model,name:l10n_id_hr_payroll.model_hr_version
msgid "Employee Contract"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:ir.model.fields,help:l10n_id_hr_payroll.field_hr_employee__l10n_id_kode_ptkp
#: model:ir.model.fields,help:l10n_id_hr_payroll.field_hr_version__l10n_id_kode_ptkp
msgid ""
"Employee's tax category that depends on their marital status and number of "
"children"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:ir.model.fields,field_description:l10n_id_hr_payroll.field_hr_employee__id
#: model:ir.model.fields,field_description:l10n_id_hr_payroll.field_hr_payroll_structure_type__id
#: model:ir.model.fields,field_description:l10n_id_hr_payroll.field_hr_payslip__id
#: model:ir.model.fields,field_description:l10n_id_hr_payroll.field_hr_version__id
#: model:ir.model.fields,field_description:l10n_id_hr_payroll.field_res_config_settings__id
msgid "ID"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.payslip.input.type,name:l10n_id_hr_payroll.input_incentive
msgid "INSENTIF"
msgstr ""
#. module: l10n_id_hr_payroll
#: model_terms:ir.ui.view,arch_db:l10n_id_hr_payroll.hr_payslip_view_form
msgid "Include BPJS Kesehatan"
msgstr ""
#. module: l10n_id_hr_payroll
#: model_terms:ir.ui.view,arch_db:l10n_id_hr_payroll.hr_payslip_view_form
msgid "Include JKK JKM"
msgstr ""
#. module: l10n_id_hr_payroll
#: model_terms:ir.ui.view,arch_db:l10n_id_hr_payroll.hr_payslip_view_form
msgid "Include PTKP and PKP calculation"
msgstr ""
#. module: l10n_id_hr_payroll
#: model_terms:ir.ui.view,arch_db:l10n_id_hr_payroll.res_config_settings_view_form
msgid "Indonesia Localization"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.payroll.structure,name:l10n_id_hr_payroll.hr_payroll_structure_id_employee_salary
msgid "Indonesia: Regular Pay"
msgstr ""
#. module: l10n_id_hr_payroll
#: model_terms:ir.ui.view,arch_db:l10n_id_hr_payroll.hr_contract_template_view_form
#: model_terms:ir.ui.view,arch_db:l10n_id_hr_payroll.hr_employee_view_form
msgid "Indonesian Payroll"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.salary.rule,name:l10n_id_hr_payroll.salary_rule_id_incentive
msgid "Insentif"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.salary.rule,name:l10n_id_hr_payroll.salary_rule_id_insurance
msgid "Insurance"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.payslip.input.type,name:l10n_id_hr_payroll.input_insurance_allowance
msgid "Insurance Allowance"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.salary.rule,name:l10n_id_hr_payroll.salary_rule_id_jht
msgid "JHT"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.salary.rule,name:l10n_id_hr_payroll.salary_rule_id_jp
msgid "JP"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.salary.rule.category,name:l10n_id_hr_payroll.JABATAN
msgid "Jabatan"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:ir.model.fields.selection,name:l10n_id_hr_payroll.selection__hr_version__l10n_id_kode_ptkp__k0
msgid "K/0"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:ir.model.fields.selection,name:l10n_id_hr_payroll.selection__hr_version__l10n_id_kode_ptkp__k1
msgid "K/1"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:ir.model.fields.selection,name:l10n_id_hr_payroll.selection__hr_version__l10n_id_kode_ptkp__k2
msgid "K/2"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:ir.model.fields.selection,name:l10n_id_hr_payroll.selection__hr_version__l10n_id_kode_ptkp__k3
msgid "K/3"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:ir.model.fields,field_description:l10n_id_hr_payroll.field_hr_payslip__l10n_id_include_bpjs_kesehatan
msgid "L10N Id Include Bpjs Kesehatan"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:ir.model.fields,field_description:l10n_id_hr_payroll.field_hr_payslip__l10n_id_include_jkk_jkm
msgid "L10N Id Include Jkk Jkm"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:ir.model.fields,field_description:l10n_id_hr_payroll.field_hr_payslip__l10n_id_include_pkp_ptkp
msgid "L10N Id Include Pkp Ptkp"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.payslip.input.type,name:l10n_id_hr_payroll.input_laptop_allowance
msgid "Laptop Allowance"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.salary.rule,name:l10n_id_hr_payroll.salary_rule_id_laptop
msgid "Latpop"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.payslip.input.type,name:l10n_id_hr_payroll.input_level_allowance
#: model:hr.salary.rule,name:l10n_id_hr_payroll.salary_rule_id_level_allowance
msgid "Level Allowance"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.payslip.input.type,name:l10n_id_hr_payroll.input_meal_allowance
#: model:hr.salary.rule,name:l10n_id_hr_payroll.salary_rule_id_meal_allowance
msgid "Meal Allowance"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.salary.rule,name:l10n_id_hr_payroll.l10n_id_hr_payroll_structure_id_employee_salary_net_salary
msgid "Net Salary"
msgstr ""
#. module: l10n_id_hr_payroll
#: model_terms:ir.ui.view,arch_db:l10n_id_hr_payroll.res_config_settings_view_form
msgid "Official Company Information"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.salary.rule,name:l10n_id_hr_payroll.salary_rule_id_pkp
#: model:hr.salary.rule.category,name:l10n_id_hr_payroll.PKP
msgid "PKP"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.salary.rule,name:l10n_id_hr_payroll.salary_rule_id_pph
#: model:hr.salary.rule.category,name:l10n_id_hr_payroll.PPH21
msgid "PPH 21"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.salary.rule.category,name:l10n_id_hr_payroll.PPH21_yearly
msgid "PPH 21 Yearly"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.salary.rule,name:l10n_id_hr_payroll.salary_rule_id_ptkp
#: model:hr.salary.rule.category,name:l10n_id_hr_payroll.PTKP
msgid "PTKP"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:ir.model.fields,field_description:l10n_id_hr_payroll.field_hr_employee__l10n_id_kode_ptkp
#: model:ir.model.fields,field_description:l10n_id_hr_payroll.field_hr_version__l10n_id_kode_ptkp
msgid "PTKP Code"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:ir.model,name:l10n_id_hr_payroll.model_hr_payslip
msgid "Pay Slip"
msgstr ""
#. module: l10n_id_hr_payroll
#: model_terms:ir.ui.view,arch_db:l10n_id_hr_payroll.hr_payslip_line_view_tree_id_history
msgid "Payslip Lines"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.department,name:l10n_id_hr_payroll.id_hr_department_rd
msgid "R&D ID"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.payslip.input.type,name:l10n_id_hr_payroll.input_global_reimbursement
#: model:hr.salary.rule,name:l10n_id_hr_payroll.l10n_id_hr_payroll_structure_id_employee_salary_reimbursement_salary_rule
msgid "Reimbursement"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:ir.model,name:l10n_id_hr_payroll.model_hr_payroll_structure_type
msgid "Salary Structure Type"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.payslip.input.type,name:l10n_id_hr_payroll.input_holiday_allowance
#: model:hr.salary.rule,name:l10n_id_hr_payroll.salary_rule_id_thr
msgid "THR"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:ir.model.fields.selection,name:l10n_id_hr_payroll.selection__hr_version__l10n_id_kode_ptkp__tk0
msgid "TK/0"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:ir.model.fields.selection,name:l10n_id_hr_payroll.selection__hr_version__l10n_id_kode_ptkp__tk1
msgid "TK/1"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:ir.model.fields.selection,name:l10n_id_hr_payroll.selection__hr_version__l10n_id_kode_ptkp__tk2
msgid "TK/2"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:ir.model.fields.selection,name:l10n_id_hr_payroll.selection__hr_version__l10n_id_kode_ptkp__tk3
msgid "TK/3"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.salary.rule,name:l10n_id_hr_payroll.l10n_id_hr_payroll_structure_id_employee_salary_gross_salary_rule
msgid "Taxable Salary"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.payslip.input.type,name:l10n_id_hr_payroll.input_transport_allowance
#: model:hr.salary.rule,name:l10n_id_hr_payroll.salary_rule_id_transport_allowance
msgid "Transport Allowance"
msgstr ""
#. module: l10n_id_hr_payroll
#: model_terms:ir.ui.view,arch_db:l10n_id_hr_payroll.hr_employee_view_form
msgid "View GROSS/PPH21 History"
msgstr ""
#. module: l10n_id_hr_payroll
#: model:hr.salary.rule.category,name:l10n_id_hr_payroll.YEARLY_GROSS
msgid "Yearly Gross"
msgstr ""
#. module: l10n_id_hr_payroll
#. odoo-python
#: code:addons/l10n_id_hr_payroll/models/hr_payroll_structure_type.py:0
msgid "month"
msgstr ""
+7
View File
@@ -0,0 +1,7 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import hr_version
from . import hr_employee
from . import hr_payroll_structure_type
from . import res_config_settings
from . import hr_payslip
+36
View File
@@ -0,0 +1,36 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import fields, models
class HrEmployee(models.Model):
_inherit = "hr.employee"
l10n_id_bpjs_jkk = fields.Float(
readonly=False,
related="version_id.l10n_id_bpjs_jkk",
inherited=True,
groups="hr_payroll.group_hr_payroll_user",
)
l10n_id_kode_ptkp = fields.Selection(
readonly=False,
related="version_id.l10n_id_kode_ptkp",
inherited=True,
groups="hr_payroll.group_hr_payroll_user",
)
def l10n_id_action_view_historical_lines(self):
""" As the historical payslip line values of 'GROSS' and 'PPH21' is used to calculate
for the end of year/contract payment, HR team likes to cross-check the values manually
Show all payslip lines that are in validated/paid for code: 'GROSS" or 'PPH21'"""
self.ensure_one()
action = self.env["ir.actions.actions"]._for_xml_id("hr_payroll.act_contribution_reg_payslip_lines")
action.update(
{
'domain': [('version_id', '=', self.version_id.id), ('code', 'in', ('GROSS', 'PPH21'))],
'context': "{'search_default_category_id': 1}",
'views': [(self.env.ref('l10n_id_hr_payroll.hr_payslip_line_view_tree_id_history').id, 'list'), (False, 'form')]
}
)
return action
@@ -0,0 +1,13 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import models
class HrPayrollStructureType(models.Model):
_inherit = 'hr.payroll.structure.type'
_description = 'Salary Structure Type'
def _get_selection_schedule_pay(self):
if self.env.company.country_code == 'ID':
return [('monthly', self.env._('month'))]
return super()._get_selection_schedule_pay()
+96
View File
@@ -0,0 +1,96 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import api, fields, models
from datetime import date
KODE_PTKP_MAPPING = {
'tk0': 'a',
'tk1': 'a',
'k0': 'a',
'tk2': 'b',
'tk3': 'b',
'k1': 'b',
'k2': 'b',
'k3': 'c',
}
class HrPayslip(models.Model):
_inherit = "hr.payslip"
l10n_id_include_jkk_jkm = fields.Boolean(default=True) # jkk jkm jht jp
l10n_id_include_bpjs_kesehatan = fields.Boolean(default=True) # bpjs kesehatan + its deduction
l10n_id_include_pkp_ptkp = fields.Boolean(
compute="_compute_l10n_id_include_pkp_ptkp", store=True, readonly=False) # include the PTKP/PKP computation
def _l10n_id_get_historical_categorical_total(self, codes):
""" Get the total amount of specific category among the contract's taxes history that has been validated
within a certain year"""
date_start = date(self.date_to.year, 1, 1)
payslips = self.env['hr.payslip'].search([
('date_to', '>', date_start),
('date_to', '<', self.date_to),
('state', 'in', ['validated', 'paid'])
])
vals = payslips._get_line_values(codes, compute_sum=True)
return sum(vals[code]['sum']['total'] for code in codes)
def _l10n_id_get_pph21_amount(self, amount):
""" Find the right percentage to apply depending on the GROSS amount of the payslip"""
category_type = KODE_PTKP_MAPPING[self.employee_id.l10n_id_kode_ptkp]
ranges = self._rule_parameter('l10n_id_pph21_percentage_' + category_type)
for line in ranges:
if amount < line[1]:
return line[2]
def _l10n_id_get_worked_days_rate(self):
"""Total number of worked days (incl leaves except out of contract)/total number of days
value is returned between 0 to 1"""
total_days = sum(self.worked_days_line_ids.mapped('number_of_days'))
wds = self.worked_days_line_ids.filtered(lambda wd: wd.code != 'OUT')
number_of_days = sum(wds.mapped('number_of_days'))
return number_of_days / total_days
def _l10n_id_get_end_total_pph_amount(self):
""" Getting the accumulated PPH21 amount over the course of a year (from start of year/contract)"""
return self._l10n_id_get_historical_categorical_total(['PPH21'])
def _l10n_id_get_gross_accumulated(self):
# gross_lines = self._l10n_id_get_historical_categorical_total_lines(['GROSS'])
date_start = date(self.date_to.year, 1, 1)
payslips = self.env['hr.payslip'].search([
('date_to', '>', date_start),
('date_to', '<', self.date_to),
('state', 'in', ['validated', 'paid'])
])
vals = payslips._get_line_values(['GROSS'])['GROSS']
gross_lines = [vals[i]['total'] for i in payslips.ids]
sum_gross = 0
threshold = self._rule_parameter('l10n_id_biaya_jabatan_salary_threshold')
percent = self._rule_parameter('l10n_id_biaya_jabatan_percent')
for line in gross_lines:
amount = min(line, threshold)
sum_gross += (percent / 100) * amount
return sum_gross
def _l10n_id_get_total_gross(self):
""" Get the total GROSS accumulated before the current payslip"""
return self._l10n_id_get_historical_categorical_total(['GROSS'])
@api.depends('date_from', 'date_to', 'version_id.contract_date_start', 'version_id.contract_date_end')
def _compute_l10n_id_include_pkp_ptkp(self):
""" by default, if it's end of year/end of contract, set to True"""
for slip in self:
slip.l10n_id_include_pkp_ptkp = (
slip.date_to and (
(slip.date_to.month == 12) or
(
slip.version_id.contract_date_end and
slip.version_id.contract_date_end.month == slip.date_to.month and
slip.version_id.contract_date_end.year == slip.date_to.year
)
)
)
+34
View File
@@ -0,0 +1,34 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import api, fields, models
class HrVersion(models.Model):
_inherit = "hr.version"
l10n_id_bpjs_jkk = fields.Float(string="BPJS JKK", groups="hr_payroll.group_hr_payroll_user", tracking=True)
l10n_id_kode_ptkp = fields.Selection(
selection=[
('tk0', "TK/0"),
('tk1', "TK/1"),
('tk2', "TK/2"),
('tk3', "TK/3"),
('k0', "K/0"),
('k1', "K/1"),
('k2', "K/2"),
('k3', "K/3")],
string="PTKP Code",
default="tk0",
required=True,
groups="hr_payroll.group_hr_payroll_user",
tracking=True,
help="Employee's tax category that depends on their marital status and number of children")
@api.model
def _get_whitelist_fields_from_template(self):
whitelisted_fields = super()._get_whitelist_fields_from_template() or []
if self.env.company.country_id.code == "ID":
whitelisted_fields += [
'l10n_id_bpjs_jkk',
]
return whitelisted_fields
@@ -0,0 +1,12 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import fields, models
class ResConfigSettings(models.TransientModel):
_inherit = 'res.config.settings'
default_l10n_id_bpjs_jkk = fields.Float(
string="BPJS JKK (%)", readonly=False,
default_model="hr.version", default=0.0024
)
+3
View File
@@ -0,0 +1,3 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import test_contract_template_whitelist
@@ -0,0 +1,37 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo.tests import TransactionCase, tagged
@tagged('post_install_l10n', 'post_install', '-at_install')
class TestWhitelistFromTemplate(TransactionCase):
def setUp(self):
super().setUp()
self.company_id = self.env['res.company'].create({
'name': 'ID Co',
'country_id': self.env.ref('base.id').id,
})
self.employee_id = self.env['hr.employee'].create({
'name': 'ID Employee',
'company_id': self.company_id.id,
})
def test_id_contract_template_loading(self):
Version = self.env['hr.version'].with_company(self.company_id)
template = Version.create({
'name': 'ID Template',
'l10n_id_bpjs_jkk': 2.5,
})
contract = self.employee_id.version_id
wizard = self.env['hr.version.wizard']\
.with_company(self.company_id)\
.with_context(active_model='hr.employee', active_id=self.employee_id.id)\
.create({'contract_template_id': template.id})
wizard.action_load_template()
for field in Version._get_whitelist_fields_from_template():
self.assertEqual(contract[field], template[field])
@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="hr_contract_template_view_form" model="ir.ui.view">
<field name="name">hr.contract.template.view.form.inherit.l10_id_hr_payroll</field>
<field name="model">hr.version</field>
<field name="inherit_id" ref="hr.hr_contract_template_form_view"/>
<field name="arch" type="xml">
<group name="salary_info" position="inside">
<group string="Indonesian Payroll" invisible="country_code != 'ID'">
<field name="l10n_id_bpjs_jkk" widget="percentage" class="o_hr_percentage_narrow_field"/>
</group>
</group>
</field>
</record>
</odoo>
@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="hr_employee_view_form" model="ir.ui.view">
<field name="name">hr.employee.view.form.inherit</field>
<field name="model">hr.employee</field>
<field name="inherit_id" ref="hr_payroll.payroll_hr_employee_view_form"/>
<field name="arch" type="xml">
<xpath expr="//header" position="inside">
<button name="l10n_id_action_view_historical_lines" type="object" groups="hr_payroll.group_hr_payroll_user" string="View GROSS/PPH21 History" invisible="country_code != 'ID'"/>
</xpath>
<group name="payroll_group" position="inside">
<group string="Indonesian Payroll" invisible="company_country_code != 'ID'">
<field name="l10n_id_kode_ptkp" class="o_hr_narrow_field"/>
<field name="l10n_id_bpjs_jkk" widget="percentage" class="o_hr_percentage_narrow_field"/>
</group>
</group>
</field>
</record>
</odoo>
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="hr_payslip_line_view_tree_id_history" model="ir.ui.view">
<field name="name">hr.payslip.line.view.list.id.history</field>
<field name="model">hr.payslip.line</field>
<field name="arch" type="xml">
<list string="Payslip Lines">
<field name="date_from"/>
<field name="date_to"/>
<field name="name"/>
<field name="category_id"/>
<field name="total"/>
</list>
</field>
</record>
</odoo>
@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="hr_payslip_view_form" model="ir.ui.view">
<field name="name">hr.payslip.view.form.inherit</field>
<field name="model">hr.payslip</field>
<field name="inherit_id" ref="hr_payroll.view_hr_payslip_form"/>
<field name="arch" type="xml">
<xpath expr="//page[@name='account_info']//field[@name='name']" position="after">
<field name="l10n_id_include_jkk_jkm" string="Include JKK JKM" invisible="country_code != 'ID'"/>
<field name="l10n_id_include_bpjs_kesehatan" string="Include BPJS Kesehatan" invisible="country_code != 'ID'"/>
<field name="l10n_id_include_pkp_ptkp" string="Include PTKP and PKP calculation" invisible="country_code != 'ID'"/>
</xpath>
</field>
</record>
</odoo>
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="res_config_settings_view_form" model="ir.ui.view">
<field name="name">res.config.settings.view.form.inherit.l10n_id_hr_payroll</field>
<field name="model">res.config.settings</field>
<field name="inherit_id" ref="hr_payroll.res_config_settings_view_form"/>
<field name="arch" type="xml">
<xpath expr="//block[@id='hr_payroll_accountant']" position="after">
<block title="Indonesia Localization" id="l10n_id_hr_payroll">
<setting id="company_information" string="Company Information" help="Official Company Information" company_dependent="1">
<div class="mt16 content-group">
<div class="row ms-2">
<label for="default_l10n_id_bpjs_jkk" class="col-md-6 p-0 m-0"/>
<field name="default_l10n_id_bpjs_jkk" class="col-md-6 p-0" widget="percentage"/>
</div>
</div>
</setting>
</block>
</xpath>
</field>
</record>
</odoo>