From a5c978494393feeca695a158d8788da7708b416d Mon Sep 17 00:00:00 2001 From: raman Date: Tue, 4 Mar 2025 15:54:18 +0530 Subject: [PATCH] indian Payrol --- .../hr_payroll_holidays/__init__.py | 4 + .../hr_payroll_holidays/__manifest__.py | 35 ++ .../hr_payroll_holidays/data/demo.xml | 10 + .../hr_payroll_dashboard_warning_data.xml | 58 ++ .../data/ir_actions_server_data.xml | 28 + .../data/mail_activity_data.xml | 11 + .../hr_payroll_holidays/i18n/ar.po | 261 +++++++++ .../hr_payroll_holidays/i18n/bg.po | 255 +++++++++ .../hr_payroll_holidays/i18n/ca.po | 268 +++++++++ .../hr_payroll_holidays/i18n/cs.po | 254 +++++++++ .../hr_payroll_holidays/i18n/de.po | 267 +++++++++ .../hr_payroll_holidays/i18n/es.po | 265 +++++++++ .../hr_payroll_holidays/i18n/es_419.po | 269 +++++++++ .../hr_payroll_holidays/i18n/et.po | 265 +++++++++ .../hr_payroll_holidays/i18n/fi.po | 273 ++++++++++ .../hr_payroll_holidays/i18n/fr.po | 264 +++++++++ .../hr_payroll_holidays/i18n/he.po | 253 +++++++++ .../hr_payroll_holidays/i18n/hi.po | 246 +++++++++ .../hr_payroll_holidays/i18n/hr.po | 260 +++++++++ .../i18n/hr_payroll_holidays.pot | 246 +++++++++ .../hr_payroll_holidays/i18n/id.po | 264 +++++++++ .../hr_payroll_holidays/i18n/it.po | 265 +++++++++ .../hr_payroll_holidays/i18n/ja.po | 254 +++++++++ .../hr_payroll_holidays/i18n/ko.po | 253 +++++++++ .../hr_payroll_holidays/i18n/mn.po | 254 +++++++++ .../hr_payroll_holidays/i18n/nl.po | 267 +++++++++ .../hr_payroll_holidays/i18n/pl.po | 264 +++++++++ .../hr_payroll_holidays/i18n/pt_BR.po | 265 +++++++++ .../hr_payroll_holidays/i18n/ro.po | 264 +++++++++ .../hr_payroll_holidays/i18n/ru.po | 224 ++++++++ .../hr_payroll_holidays/i18n/sl.po | 250 +++++++++ .../hr_payroll_holidays/i18n/sv.po | 256 +++++++++ .../hr_payroll_holidays/i18n/th.po | 259 +++++++++ .../hr_payroll_holidays/i18n/tr.po | 256 +++++++++ .../hr_payroll_holidays/i18n/uk.po | 266 +++++++++ .../hr_payroll_holidays/i18n/vi.po | 263 +++++++++ .../hr_payroll_holidays/i18n/zh_CN.po | 254 +++++++++ .../hr_payroll_holidays/i18n/zh_TW.po | 253 +++++++++ .../hr_payroll_holidays/models/__init__.py | 9 + .../hr_payroll_holidays/models/hr_contract.py | 9 + .../hr_payroll_holidays/models/hr_leave.py | 150 +++++ .../hr_payroll_holidays/models/hr_payslip.py | 30 + .../models/mail_activity.py | 21 + .../hr_payroll_holidays/models/res_company.py | 10 + .../models/res_config_settings.py | 10 + .../security/hr_payroll_holidays_security.xml | 14 + .../static/src/js/hr_payslip_form.js | 21 + .../static/src/js/hr_payslip_form.xml | 11 + .../static/src/js/hr_payslip_list.js | 22 + .../static/src/js/hr_payslip_list.xml | 11 + .../static/src/js/hr_work_entries_gantt.js | 15 + .../static/src/js/hr_work_entries_gantt.xml | 10 + .../static/src/views/hooks.js | 40 ++ .../static/src/views/hooks.xml | 12 + .../hr_work_entry_calendar_controller.js | 19 + .../hr_work_entry_calendar_controller.xml | 11 + .../static/src/xml/templates.xml | 10 + .../hr_payroll_holidays/tests/__init__.py | 5 + .../hr_payroll_holidays/tests/common.py | 70 +++ .../tests/test_timeoff_defer.py | 386 +++++++++++++ .../views/hr_allocation_views.xml | 13 + .../views/hr_leave_views.xml | 87 +++ .../views/hr_payslip_run_views.xml | 13 + .../views/hr_payslip_views.xml | 24 + .../views/res_config_settings_views.xml | 24 + .../l10n_in_hr_payroll/__init__.py | 7 + .../l10n_in_hr_payroll/__manifest__.py | 61 +++ .../l10n_in_hr_payroll/controller/__init__.py | 3 + .../l10n_in_hr_payroll/controller/main.py | 136 +++++ .../data/hr_contract_type_data.xml | 13 + .../hr_payroll_dashboard_warning_data.xml | 77 +++ .../data/hr_payroll_structure_data.xml | 46 ++ .../data/hr_payroll_structure_type_data.xml | 23 + .../data/hr_rule_parameters_data.xml | 304 +++++++++++ .../data/hr_salary_rule_category_data.xml | 20 + .../data/ir_sequence_data.xml | 13 + .../data/l10n_in_hr_payroll_demo.xml | 430 +++++++++++++++ .../data/report_paperformat.xml | 17 + .../data/res_partner_data.xml | 54 ++ .../hr_salary_rule_ind_emp_data.xml | 511 ++++++++++++++++++ .../hr_salary_rule_regular_pay_data.xml | 248 +++++++++ .../hr_salary_rule_stipend_data.xml | 21 + .../hr_salary_rule_worker_data.xml | 50 ++ .../i18n/l10n_in_hr_payroll.pot | 26 + .../l10n_in_hr_payroll/models/__init__.py | 10 + .../l10n_in_hr_payroll/models/hr_contract.py | 47 ++ .../l10n_in_hr_payroll/models/hr_employee.py | 24 + .../l10n_in_hr_payroll/models/hr_payslip.py | 57 ++ .../models/hr_payslip_run.py | 26 + .../models/l10n_in_salary_statement.py | 107 ++++ .../l10n_in_hr_payroll/models/res_company.py | 16 + .../models/res_config_settings.py | 14 + .../l10n_in_hr_payroll/models/res_users.py | 17 + .../l10n_in_hr_payroll/report/__init__.py | 6 + .../report/report_hr_epf.py | 149 +++++ .../report/report_hr_yearly_salary_detail.py | 149 +++++ .../report/report_payroll_advice.py | 34 ++ .../security/ir.model.access.csv | 6 + .../static/img/hr_employee_alisha_sharma.jpg | Bin 0 -> 40913 bytes .../static/img/hr_employee_shaurya.jpg | Bin 0 -> 43108 bytes .../static/img/hr_employee_vihaan.jpg | Bin 0 -> 55165 bytes .../l10n_in_hr_payroll/tests/__init__.py | 4 + .../l10n_in_hr_payroll/tests/common.py | 88 +++ .../tests/test_hr_contract.py | 43 ++ .../tests/test_payment_advice_batch.py | 62 +++ .../views/hr_contract_views.xml | 30 + .../views/hr_employee_views.xml | 25 + .../views/l10n_in_hr_payroll_report.xml | 56 ++ .../views/l10n_in_salary_statement.xml | 45 ++ .../views/report_hr_epf_views.xml | 54 ++ ...eport_hr_yearly_salary_detail_template.xml | 106 ++++ .../views/report_l10n_in_salary_statement.xml | 69 +++ .../views/report_payroll_advice_template.xml | 68 +++ .../views/report_payslip_details_template.xml | 122 +++++ .../views/res_config_settings_views.xml | 40 ++ .../views/res_users_views.xml | 15 + .../l10n_in_hr_payroll/wizard/__init__.py | 6 + .../wizard/hr_payroll_payment_report.xml | 36 ++ .../hr_payroll_payment_report_wizard.py | 158 ++++++ .../wizard/hr_salary_register.py | 55 ++ .../wizard/hr_salary_register.xml | 74 +++ .../wizard/hr_tds_calculation.py | 122 +++++ .../wizard/hr_tds_calculation.xml | 36 ++ .../wizard/hr_yearly_salary_detail.py | 74 +++ .../wizard/hr_yearly_salary_detail_view.xml | 54 ++ 125 files changed, 13644 insertions(+) create mode 100644 addons_extensions/hr_payroll_holidays/__init__.py create mode 100644 addons_extensions/hr_payroll_holidays/__manifest__.py create mode 100644 addons_extensions/hr_payroll_holidays/data/demo.xml create mode 100644 addons_extensions/hr_payroll_holidays/data/hr_payroll_dashboard_warning_data.xml create mode 100644 addons_extensions/hr_payroll_holidays/data/ir_actions_server_data.xml create mode 100644 addons_extensions/hr_payroll_holidays/data/mail_activity_data.xml create mode 100644 addons_extensions/hr_payroll_holidays/i18n/ar.po create mode 100644 addons_extensions/hr_payroll_holidays/i18n/bg.po create mode 100644 addons_extensions/hr_payroll_holidays/i18n/ca.po create mode 100644 addons_extensions/hr_payroll_holidays/i18n/cs.po create mode 100644 addons_extensions/hr_payroll_holidays/i18n/de.po create mode 100644 addons_extensions/hr_payroll_holidays/i18n/es.po create mode 100644 addons_extensions/hr_payroll_holidays/i18n/es_419.po create mode 100644 addons_extensions/hr_payroll_holidays/i18n/et.po create mode 100644 addons_extensions/hr_payroll_holidays/i18n/fi.po create mode 100644 addons_extensions/hr_payroll_holidays/i18n/fr.po create mode 100644 addons_extensions/hr_payroll_holidays/i18n/he.po create mode 100644 addons_extensions/hr_payroll_holidays/i18n/hi.po create mode 100644 addons_extensions/hr_payroll_holidays/i18n/hr.po create mode 100644 addons_extensions/hr_payroll_holidays/i18n/hr_payroll_holidays.pot create mode 100644 addons_extensions/hr_payroll_holidays/i18n/id.po create mode 100644 addons_extensions/hr_payroll_holidays/i18n/it.po create mode 100644 addons_extensions/hr_payroll_holidays/i18n/ja.po create mode 100644 addons_extensions/hr_payroll_holidays/i18n/ko.po create mode 100644 addons_extensions/hr_payroll_holidays/i18n/mn.po create mode 100644 addons_extensions/hr_payroll_holidays/i18n/nl.po create mode 100644 addons_extensions/hr_payroll_holidays/i18n/pl.po create mode 100644 addons_extensions/hr_payroll_holidays/i18n/pt_BR.po create mode 100644 addons_extensions/hr_payroll_holidays/i18n/ro.po create mode 100644 addons_extensions/hr_payroll_holidays/i18n/ru.po create mode 100644 addons_extensions/hr_payroll_holidays/i18n/sl.po create mode 100644 addons_extensions/hr_payroll_holidays/i18n/sv.po create mode 100644 addons_extensions/hr_payroll_holidays/i18n/th.po create mode 100644 addons_extensions/hr_payroll_holidays/i18n/tr.po create mode 100644 addons_extensions/hr_payroll_holidays/i18n/uk.po create mode 100644 addons_extensions/hr_payroll_holidays/i18n/vi.po create mode 100644 addons_extensions/hr_payroll_holidays/i18n/zh_CN.po create mode 100644 addons_extensions/hr_payroll_holidays/i18n/zh_TW.po create mode 100644 addons_extensions/hr_payroll_holidays/models/__init__.py create mode 100644 addons_extensions/hr_payroll_holidays/models/hr_contract.py create mode 100644 addons_extensions/hr_payroll_holidays/models/hr_leave.py create mode 100644 addons_extensions/hr_payroll_holidays/models/hr_payslip.py create mode 100644 addons_extensions/hr_payroll_holidays/models/mail_activity.py create mode 100644 addons_extensions/hr_payroll_holidays/models/res_company.py create mode 100644 addons_extensions/hr_payroll_holidays/models/res_config_settings.py create mode 100644 addons_extensions/hr_payroll_holidays/security/hr_payroll_holidays_security.xml create mode 100644 addons_extensions/hr_payroll_holidays/static/src/js/hr_payslip_form.js create mode 100644 addons_extensions/hr_payroll_holidays/static/src/js/hr_payslip_form.xml create mode 100644 addons_extensions/hr_payroll_holidays/static/src/js/hr_payslip_list.js create mode 100644 addons_extensions/hr_payroll_holidays/static/src/js/hr_payslip_list.xml create mode 100644 addons_extensions/hr_payroll_holidays/static/src/js/hr_work_entries_gantt.js create mode 100644 addons_extensions/hr_payroll_holidays/static/src/js/hr_work_entries_gantt.xml create mode 100644 addons_extensions/hr_payroll_holidays/static/src/views/hooks.js create mode 100644 addons_extensions/hr_payroll_holidays/static/src/views/hooks.xml create mode 100644 addons_extensions/hr_payroll_holidays/static/src/views/work_entry_calendar/hr_work_entry_calendar_controller.js create mode 100644 addons_extensions/hr_payroll_holidays/static/src/views/work_entry_calendar/hr_work_entry_calendar_controller.xml create mode 100644 addons_extensions/hr_payroll_holidays/static/src/xml/templates.xml create mode 100644 addons_extensions/hr_payroll_holidays/tests/__init__.py create mode 100644 addons_extensions/hr_payroll_holidays/tests/common.py create mode 100644 addons_extensions/hr_payroll_holidays/tests/test_timeoff_defer.py create mode 100644 addons_extensions/hr_payroll_holidays/views/hr_allocation_views.xml create mode 100644 addons_extensions/hr_payroll_holidays/views/hr_leave_views.xml create mode 100644 addons_extensions/hr_payroll_holidays/views/hr_payslip_run_views.xml create mode 100644 addons_extensions/hr_payroll_holidays/views/hr_payslip_views.xml create mode 100644 addons_extensions/hr_payroll_holidays/views/res_config_settings_views.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/__init__.py create mode 100644 addons_extensions/l10n_in_hr_payroll/__manifest__.py create mode 100644 addons_extensions/l10n_in_hr_payroll/controller/__init__.py create mode 100644 addons_extensions/l10n_in_hr_payroll/controller/main.py create mode 100644 addons_extensions/l10n_in_hr_payroll/data/hr_contract_type_data.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/data/hr_payroll_dashboard_warning_data.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/data/hr_payroll_structure_data.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/data/hr_payroll_structure_type_data.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/data/hr_rule_parameters_data.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/data/hr_salary_rule_category_data.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/data/ir_sequence_data.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/data/l10n_in_hr_payroll_demo.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/data/report_paperformat.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/data/res_partner_data.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/data/salary_rules/hr_salary_rule_ind_emp_data.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/data/salary_rules/hr_salary_rule_regular_pay_data.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/data/salary_rules/hr_salary_rule_stipend_data.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/data/salary_rules/hr_salary_rule_worker_data.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/i18n/l10n_in_hr_payroll.pot create mode 100644 addons_extensions/l10n_in_hr_payroll/models/__init__.py create mode 100644 addons_extensions/l10n_in_hr_payroll/models/hr_contract.py create mode 100644 addons_extensions/l10n_in_hr_payroll/models/hr_employee.py create mode 100644 addons_extensions/l10n_in_hr_payroll/models/hr_payslip.py create mode 100644 addons_extensions/l10n_in_hr_payroll/models/hr_payslip_run.py create mode 100644 addons_extensions/l10n_in_hr_payroll/models/l10n_in_salary_statement.py create mode 100644 addons_extensions/l10n_in_hr_payroll/models/res_company.py create mode 100644 addons_extensions/l10n_in_hr_payroll/models/res_config_settings.py create mode 100644 addons_extensions/l10n_in_hr_payroll/models/res_users.py create mode 100644 addons_extensions/l10n_in_hr_payroll/report/__init__.py create mode 100644 addons_extensions/l10n_in_hr_payroll/report/report_hr_epf.py create mode 100644 addons_extensions/l10n_in_hr_payroll/report/report_hr_yearly_salary_detail.py create mode 100644 addons_extensions/l10n_in_hr_payroll/report/report_payroll_advice.py create mode 100644 addons_extensions/l10n_in_hr_payroll/security/ir.model.access.csv create mode 100644 addons_extensions/l10n_in_hr_payroll/static/img/hr_employee_alisha_sharma.jpg create mode 100644 addons_extensions/l10n_in_hr_payroll/static/img/hr_employee_shaurya.jpg create mode 100644 addons_extensions/l10n_in_hr_payroll/static/img/hr_employee_vihaan.jpg create mode 100644 addons_extensions/l10n_in_hr_payroll/tests/__init__.py create mode 100644 addons_extensions/l10n_in_hr_payroll/tests/common.py create mode 100644 addons_extensions/l10n_in_hr_payroll/tests/test_hr_contract.py create mode 100644 addons_extensions/l10n_in_hr_payroll/tests/test_payment_advice_batch.py create mode 100644 addons_extensions/l10n_in_hr_payroll/views/hr_contract_views.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/views/hr_employee_views.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/views/l10n_in_hr_payroll_report.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/views/l10n_in_salary_statement.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/views/report_hr_epf_views.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/views/report_hr_yearly_salary_detail_template.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/views/report_l10n_in_salary_statement.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/views/report_payroll_advice_template.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/views/report_payslip_details_template.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/views/res_config_settings_views.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/views/res_users_views.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/wizard/__init__.py create mode 100644 addons_extensions/l10n_in_hr_payroll/wizard/hr_payroll_payment_report.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/wizard/hr_payroll_payment_report_wizard.py create mode 100644 addons_extensions/l10n_in_hr_payroll/wizard/hr_salary_register.py create mode 100644 addons_extensions/l10n_in_hr_payroll/wizard/hr_salary_register.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/wizard/hr_tds_calculation.py create mode 100644 addons_extensions/l10n_in_hr_payroll/wizard/hr_tds_calculation.xml create mode 100644 addons_extensions/l10n_in_hr_payroll/wizard/hr_yearly_salary_detail.py create mode 100644 addons_extensions/l10n_in_hr_payroll/wizard/hr_yearly_salary_detail_view.xml diff --git a/addons_extensions/hr_payroll_holidays/__init__.py b/addons_extensions/hr_payroll_holidays/__init__.py new file mode 100644 index 000000000..b60115f0a --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/__init__.py @@ -0,0 +1,4 @@ +#-*- coding:utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import models diff --git a/addons_extensions/hr_payroll_holidays/__manifest__.py b/addons_extensions/hr_payroll_holidays/__manifest__.py new file mode 100644 index 000000000..fb5dab421 --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/__manifest__.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +{ + 'name': 'Time Off in Payslips', + 'version': '1.0', + 'category': 'Human Resources/Payroll', + 'sequence': 95, + 'depends': ['hr_contract', 'hr_work_entry_holidays', 'hr_payroll'], + 'data': [ + 'security/hr_payroll_holidays_security.xml', + 'views/res_config_settings_views.xml', + 'views/hr_leave_views.xml', + 'views/hr_allocation_views.xml', + 'views/hr_payslip_run_views.xml', + 'views/hr_payslip_views.xml', + 'data/mail_activity_data.xml', + 'data/ir_actions_server_data.xml', + 'data/hr_payroll_dashboard_warning_data.xml', + ], + 'demo': [ + 'data/demo.xml', + ], + 'auto_install': True, + 'assets': { + 'web.assets_backend': [ + 'hr_payroll_holidays/static/src/**/*', + ('remove', 'hr_payroll_holidays/static/src/js/hr_work_entries_gantt.*'), + ], + 'web.assets_backend_lazy': [ + 'hr_payroll_holidays/static/src/js/hr_work_entries_gantt.*', + ], + }, + 'license': 'OEEL-1', +} diff --git a/addons_extensions/hr_payroll_holidays/data/demo.xml b/addons_extensions/hr_payroll_holidays/data/demo.xml new file mode 100644 index 000000000..a52b08785 --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/data/demo.xml @@ -0,0 +1,10 @@ + + + + blocked + + + + blocked + + diff --git a/addons_extensions/hr_payroll_holidays/data/hr_payroll_dashboard_warning_data.xml b/addons_extensions/hr_payroll_holidays/data/hr_payroll_dashboard_warning_data.xml new file mode 100644 index 000000000..1c8698149 --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/data/hr_payroll_dashboard_warning_data.xml @@ -0,0 +1,58 @@ + + + + + + Time Off To Defer + + +leaves_to_defer = self.env['hr.leave'].search([ + ('payslip_state', '=', 'blocked'), + ('state', '=', 'validate'), + ('employee_company_id', 'in', self.env.companies.ids), +]) +if leaves_to_defer: + warning_count = len(leaves_to_defer) + warning_action = 'hr_payroll_holidays.hr_leave_action_open_to_defer' + + + + + Time Off Without Joined Document + + +leaves_no_document = self.env['hr.leave'].search([ + ('state', 'not in', ['refuse', 'validate']), + ('leave_type_support_document', '=', True), + ('attachment_ids', '=', False), + ('employee_company_id', 'in', self.env.companies.ids), +]) +if leaves_no_document: + warning_count = len(leaves_no_document) + warning_records = leaves_no_document + + + + + Time Off Not Related To An Allocation + + +leaves_no_allocation_ids = [] +employees = self.env['hr.employee'].search([('company_id', 'in', self.env.companies.ids)]) +consumed_leaves = employees._get_consumed_leaves(leave_types=self.env['hr.leave.type'].search([ + ('requires_allocation', '=', 'yes'), + ('allows_negative', '=', False), +]))[1] +for employee in consumed_leaves: + to_recheck_leaves_per_leave_type = consumed_leaves[employee] + for holiday_status_id in to_recheck_leaves_per_leave_type: + for end_dates in to_recheck_leaves_per_leave_type[holiday_status_id]['excess_days']: + leave_id = to_recheck_leaves_per_leave_type[holiday_status_id]['excess_days'][end_dates]['leave_id'] + leaves_no_allocation_ids.append(leave_id) +if leaves_no_allocation_ids: + warning_count = len(leaves_no_allocation_ids) + warning_records = self.env['hr.leave'].search([('id', 'in', leaves_no_allocation_ids)]) + + + + diff --git a/addons_extensions/hr_payroll_holidays/data/ir_actions_server_data.xml b/addons_extensions/hr_payroll_holidays/data/ir_actions_server_data.xml new file mode 100644 index 000000000..3f8e6cf60 --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/data/ir_actions_server_data.xml @@ -0,0 +1,28 @@ + + + + + Defer to Next Month + + + list + + code + + records.action_report_to_next_month() + + + + + Mark as deferred + + + list,form + + code + + records.activity_feedback(['hr_payroll_holidays.mail_activity_data_hr_leave_to_defer']) + + + + diff --git a/addons_extensions/hr_payroll_holidays/data/mail_activity_data.xml b/addons_extensions/hr_payroll_holidays/data/mail_activity_data.xml new file mode 100644 index 000000000..2ee3ccc1c --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/data/mail_activity_data.xml @@ -0,0 +1,11 @@ + + + + + Leave to Defer + fa-plane + 100 + hr.leave + + + diff --git a/addons_extensions/hr_payroll_holidays/i18n/ar.po b/addons_extensions/hr_payroll_holidays/i18n/ar.po new file mode 100644 index 000000000..dd50d0f02 --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/i18n/ar.po @@ -0,0 +1,261 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_payroll_holidays +# +# Translators: +# Wil Odoo, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-09-25 09:26+0000\n" +"PO-Revision-Date: 2024-09-25 09:44+0000\n" +"Last-Translator: Wil Odoo, 2024\n" +"Language-Team: Arabic (https://app.transifex.com/odoo/teams/41243/ar/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: ar\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "" +"A great way to keep track on employee’s PTOs, sick days, and approval " +"status." +msgstr "" +"طريقة رائعة لمتابعة إجازات الموظف المدفوعة والإجازات المرضية وحالة الموافقة." +" " + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_mail_activity +msgid "Activity" +msgstr "النشاط" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_company +msgid "Companies" +msgstr "الشركات" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__done +msgid "Computed in current payslip" +msgstr "تم احتسابه في إيصال الدفع الحالي " + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_config_settings +msgid "Config Settings" +msgstr "تهيئة الإعدادات " + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_report_to_next_month +msgid "Defer to Next Month" +msgstr "التأجيل إلى الشهر التالي " + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Deferred Time Off" +msgstr "أيام الإجازة المُرحّلة " + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_company__deferred_time_off_manager +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_config_settings__deferred_time_off_manager +msgid "Deferred Time Off Manager" +msgstr "مدير أيام الإجازة المُرحّلة " + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.view_hr_leave_allocation_inherit_filter +msgid "Employee Code" +msgstr "كود الموظف " + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_contract +msgid "Employee Contract" +msgstr "عقد الموظف" + +#. module: hr_payroll_holidays +#: model:mail.activity.type,name:hr_payroll_holidays.mail_activity_data_hr_leave_to_defer +msgid "Leave to Defer" +msgstr "تركها ليتم ترحيلها " + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_mark_as_reported +msgid "Mark as deferred" +msgstr "التعيين كمؤجلة " + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "Meet the time off dashboard." +msgstr "إليكم لوحة بيانات الإجازات. " + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"Not enough attendance work entries to report the time off %s. Please make " +"the operation manually" +msgstr "" +"لا توجد قيود عمل حضور كافية لإعداد تقرير حول الإجازة %s. يرجى جعل العملية " +"يدوية " + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Only an employee time off to defer can be reported to next month" +msgstr "يمكن التبليغ فقط عن إجازات الموظفين لتأجيلها إلى الشهر التالي " + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_payslip +msgid "Pay Slip" +msgstr "إيصال الدفع " + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_hr_leave__payslip_state +msgid "Payslip State" +msgstr "حالة إيصال الدفع " + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Please create manually the work entry for %s" +msgstr "يرجى إنشاء قيد العمل لـ %s يدوياً " + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Postpone time off after payslip validation" +msgstr "تأجيل الإجازة بعد تصديق إيصال الدفع " + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_form_inherit +msgid "Report to Next Month" +msgstr "التقرير للشهر التالي " + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Responsible" +msgstr "المسؤول " + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The next month work entries are not generated yet or are validated already " +"for time off %s" +msgstr "" +"قيود العمل للشهر التالي لم يتم إنشاؤها بعد أو قد تم تصديقها بالفعل للإجازة " +"%s " + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The pay of the month is already validated with this day included. If you " +"need to adapt, please refer to HR." +msgstr "" +"تم تصديق راتب هذا الشهر بالفعل مع تضمين هذا اليوم. إذا كنت بحاجة إلى " +"التعديل، يرجى التواصل مع قسم الموارد البشرية. " + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The time off %s can not be reported because it is defined over more than 2 " +"months" +msgstr "لا يمكن التبليغ عن الإجازة %s لأنها محددة قبل أكثر من شهرين 2 " + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "There is no work entries linked to this time off to report" +msgstr "لا توجد قيود عمل مرتبطة بهذه الإجازة لكتابة تقرير عنها " + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_payslip.py:0 +msgid "" +"There is some remaining time off to defer for these employees: \n" +"\n" +" %s" +msgstr "" +"هناك بعض أيام إجازة لترحيلها لهؤلاء الموظفين: \n" +"\n" +"%s " + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_work_entry_action +#: model:ir.model,name:hr_payroll_holidays.model_hr_leave +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Time Off" +msgstr "الإجازات " + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_allocation +msgid "Time Off Not Related To An Allocation" +msgstr "الإجازة غير متعلقة بتخصيص " + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_to_defer +msgid "Time Off To Defer" +msgstr "أيام الإجازة لترحيلها " + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_document +msgid "Time Off Without Joined Document" +msgstr "الإجازة دون المستند المشترك " + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_action_open_to_defer +msgid "Time Off to Defer" +msgstr "أيام الإجازة لترحيلها " + +#. module: hr_payroll_holidays +#: model:ir.ui.menu,name:hr_payroll_holidays.menu_work_entry_leave_to_approve +msgid "Time Off to Report" +msgstr "أيام الإجازة لإعداد تقرير عنها " + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +msgid "To Defer" +msgstr "للترحيل " + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__normal +msgid "To compute in next payslip" +msgstr "لاحتسابها في إيصال الدفع القادم " + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__blocked +msgid "To defer to next payslip" +msgstr "لترحيلها إلى إيصال الدفع القادم " + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Validated Time Off to Defer" +msgstr "أيام الإجازة المصدقة لترحيلها " + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "You have some" +msgstr "لديك بعض " + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/views/hooks.js:0 +msgid "You have some to defer to the next month." +msgstr "لديك بعض لترحيلها إلى الشهر القادم. " + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "time off" +msgstr "أيام الإجازة " + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "to defer to the next month." +msgstr "لترحيلها إلى الشهر القادم " diff --git a/addons_extensions/hr_payroll_holidays/i18n/bg.po b/addons_extensions/hr_payroll_holidays/i18n/bg.po new file mode 100644 index 000000000..ecca6900b --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/i18n/bg.po @@ -0,0 +1,255 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_payroll_holidays +# +# Translators: +# Petko Karamotchev, 2024 +# Георги Пехливанов , 2024 +# Albena Mincheva , 2024 +# KeyVillage, 2024 +# Ивайло Малинов , 2024 +# Elena Varbanova, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-09-25 09:26+0000\n" +"PO-Revision-Date: 2024-09-25 09:44+0000\n" +"Last-Translator: Elena Varbanova, 2024\n" +"Language-Team: Bulgarian (https://app.transifex.com/odoo/teams/41243/bg/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: bg\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "" +"A great way to keep track on employee’s PTOs, sick days, and approval " +"status." +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_mail_activity +msgid "Activity" +msgstr "Дейност" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_company +msgid "Companies" +msgstr "Фирми" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__done +msgid "Computed in current payslip" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_config_settings +msgid "Config Settings" +msgstr "Конфигурационни настройки" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_report_to_next_month +msgid "Defer to Next Month" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Deferred Time Off" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_company__deferred_time_off_manager +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_config_settings__deferred_time_off_manager +msgid "Deferred Time Off Manager" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.view_hr_leave_allocation_inherit_filter +msgid "Employee Code" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_contract +msgid "Employee Contract" +msgstr "Договор на служителя" + +#. module: hr_payroll_holidays +#: model:mail.activity.type,name:hr_payroll_holidays.mail_activity_data_hr_leave_to_defer +msgid "Leave to Defer" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_mark_as_reported +msgid "Mark as deferred" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "Meet the time off dashboard." +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"Not enough attendance work entries to report the time off %s. Please make " +"the operation manually" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Only an employee time off to defer can be reported to next month" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_payslip +msgid "Pay Slip" +msgstr "Фиш заплата" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_hr_leave__payslip_state +msgid "Payslip State" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Please create manually the work entry for %s" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Postpone time off after payslip validation" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_form_inherit +msgid "Report to Next Month" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Responsible" +msgstr "Отговорен" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The next month work entries are not generated yet or are validated already " +"for time off %s" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The pay of the month is already validated with this day included. If you " +"need to adapt, please refer to HR." +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The time off %s can not be reported because it is defined over more than 2 " +"months" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "There is no work entries linked to this time off to report" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_payslip.py:0 +msgid "" +"There is some remaining time off to defer for these employees: \n" +"\n" +" %s" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_work_entry_action +#: model:ir.model,name:hr_payroll_holidays.model_hr_leave +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Time Off" +msgstr "Почивка" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_allocation +msgid "Time Off Not Related To An Allocation" +msgstr "" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_to_defer +msgid "Time Off To Defer" +msgstr "" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_document +msgid "Time Off Without Joined Document" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_action_open_to_defer +msgid "Time Off to Defer" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.ui.menu,name:hr_payroll_holidays.menu_work_entry_leave_to_approve +msgid "Time Off to Report" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +msgid "To Defer" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__normal +msgid "To compute in next payslip" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__blocked +msgid "To defer to next payslip" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Validated Time Off to Defer" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "You have some" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/views/hooks.js:0 +msgid "You have some to defer to the next month." +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "time off" +msgstr "почивка" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "to defer to the next month." +msgstr "" diff --git a/addons_extensions/hr_payroll_holidays/i18n/ca.po b/addons_extensions/hr_payroll_holidays/i18n/ca.po new file mode 100644 index 000000000..89023bc6e --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/i18n/ca.po @@ -0,0 +1,268 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_payroll_holidays +# +# Translators: +# Martin Trigaux, 2024 +# Quim - eccit , 2024 +# Manel Fernandez Ramirez , 2024 +# Josep Anton Belchi, 2024 +# Iván Infantes Castarnado, 2024 +# Ivan Espinola, 2024 +# Óscar Fonseca , 2024 +# marcescu, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-09-25 09:26+0000\n" +"PO-Revision-Date: 2024-09-25 09:44+0000\n" +"Last-Translator: marcescu, 2024\n" +"Language-Team: Catalan (https://app.transifex.com/odoo/teams/41243/ca/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: ca\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "" +"A great way to keep track on employee’s PTOs, sick days, and approval " +"status." +msgstr "" +"La millor manera de seguir el seu permís pagat, dies de malalties i altres " +"sol·licituds d'aprovació." + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_mail_activity +msgid "Activity" +msgstr "Activitat" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_company +msgid "Companies" +msgstr "Empreses" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__done +msgid "Computed in current payslip" +msgstr "Calculat en la nòmina actual" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_config_settings +msgid "Config Settings" +msgstr "Paràmetres de configuració" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_report_to_next_month +msgid "Defer to Next Month" +msgstr "Ajorna al mes següent" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Deferred Time Off" +msgstr "Temps lliure diferit" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_company__deferred_time_off_manager +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_config_settings__deferred_time_off_manager +msgid "Deferred Time Off Manager" +msgstr "Gestor de temps lliure diferit" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.view_hr_leave_allocation_inherit_filter +msgid "Employee Code" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_contract +msgid "Employee Contract" +msgstr "Contracte de l'empleat" + +#. module: hr_payroll_holidays +#: model:mail.activity.type,name:hr_payroll_holidays.mail_activity_data_hr_leave_to_defer +msgid "Leave to Defer" +msgstr "Permís d'ajornament" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_mark_as_reported +msgid "Mark as deferred" +msgstr "Marca com a diferit" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "Meet the time off dashboard." +msgstr "Coneix el tauler de control de temps lliure." + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"Not enough attendance work entries to report the time off %s. Please make " +"the operation manually" +msgstr "" +"No hi ha prou entrades de treball d'assistència per a informar del temps " +"d'espera %s. Feu l'operació manualment" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Only an employee time off to defer can be reported to next month" +msgstr "Només es pot informar d'un empleat de temps lliure al mes següent" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_payslip +msgid "Pay Slip" +msgstr "Nómina" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_hr_leave__payslip_state +msgid "Payslip State" +msgstr "Estat de la nòmina" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Please create manually the work entry for %s" +msgstr "Creeu manualment l'entrada de treball per a %s" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Postpone time off after payslip validation" +msgstr "Ajornar el temps lliure després de la validació de la nòmina" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_form_inherit +msgid "Report to Next Month" +msgstr "Informa al mes següent" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Responsible" +msgstr "Responsable" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The next month work entries are not generated yet or are validated already " +"for time off %s" +msgstr "" +"Les prestacions del mes vinent encara no s'han generat o ja han estat " +"validades per l'absència %s" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The pay of the month is already validated with this day included. If you " +"need to adapt, please refer to HR." +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The time off %s can not be reported because it is defined over more than 2 " +"months" +msgstr "" +"L'Absència %s no es pot ajornar perquè està establert per a més de 2 mesos." + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "There is no work entries linked to this time off to report" +msgstr "" +"No hi ha entrades de treball vinculades a aquest temps lliure a l'informe" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_payslip.py:0 +msgid "" +"There is some remaining time off to defer for these employees: \n" +"\n" +" %s" +msgstr "" +"A aquests empleats els queda algun temps lliure per ajornar: \n" +"\n" +" %s" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_work_entry_action +#: model:ir.model,name:hr_payroll_holidays.model_hr_leave +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Time Off" +msgstr "Absències" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_allocation +msgid "Time Off Not Related To An Allocation" +msgstr "" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_to_defer +msgid "Time Off To Defer" +msgstr "Temps d'ajornament" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_document +msgid "Time Off Without Joined Document" +msgstr "Temps d'espera sense un document unit" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_action_open_to_defer +msgid "Time Off to Defer" +msgstr "Temps lliure per a ajornar" + +#. module: hr_payroll_holidays +#: model:ir.ui.menu,name:hr_payroll_holidays.menu_work_entry_leave_to_approve +msgid "Time Off to Report" +msgstr "Temps lliure per a informar" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +msgid "To Defer" +msgstr "Ajornar" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__normal +msgid "To compute in next payslip" +msgstr "A computar en la pròxima nòmina" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__blocked +msgid "To defer to next payslip" +msgstr "Ajornar a la següent nòmina" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Validated Time Off to Defer" +msgstr "Temps lliure validat per a ajornar" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "You have some" +msgstr "Vostè té alguns" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/views/hooks.js:0 +msgid "You have some to defer to the next month." +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "time off" +msgstr "temps lliure" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "to defer to the next month." +msgstr "ajornar fins el mes vinent." diff --git a/addons_extensions/hr_payroll_holidays/i18n/cs.po b/addons_extensions/hr_payroll_holidays/i18n/cs.po new file mode 100644 index 000000000..ead590a76 --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/i18n/cs.po @@ -0,0 +1,254 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_payroll_holidays +# +# Translators: +# Wil Odoo, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-09-25 09:26+0000\n" +"PO-Revision-Date: 2024-09-25 09:44+0000\n" +"Last-Translator: Wil Odoo, 2024\n" +"Language-Team: Czech (https://app.transifex.com/odoo/teams/41243/cs/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: cs\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "" +"A great way to keep track on employee’s PTOs, sick days, and approval " +"status." +msgstr "" +"Skvělý způsob, jak sledovat PTO zaměstnanců, dny nemoci a stav schválení." + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_mail_activity +msgid "Activity" +msgstr "Aktivita" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_company +msgid "Companies" +msgstr "Společnosti" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__done +msgid "Computed in current payslip" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_config_settings +msgid "Config Settings" +msgstr "Konfigurační nastavení" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_report_to_next_month +msgid "Defer to Next Month" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Deferred Time Off" +msgstr "Odložené volno" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_company__deferred_time_off_manager +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_config_settings__deferred_time_off_manager +msgid "Deferred Time Off Manager" +msgstr "Správce odloženého volna" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.view_hr_leave_allocation_inherit_filter +msgid "Employee Code" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_contract +msgid "Employee Contract" +msgstr "Zaměstnanecká smlouva" + +#. module: hr_payroll_holidays +#: model:mail.activity.type,name:hr_payroll_holidays.mail_activity_data_hr_leave_to_defer +msgid "Leave to Defer" +msgstr "Povolení odkladu" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_mark_as_reported +msgid "Mark as deferred" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "Meet the time off dashboard." +msgstr "Seznamte se s dashboardem dovolených." + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"Not enough attendance work entries to report the time off %s. Please make " +"the operation manually" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Only an employee time off to defer can be reported to next month" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_payslip +msgid "Pay Slip" +msgstr "Výplatní páska" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_hr_leave__payslip_state +msgid "Payslip State" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Please create manually the work entry for %s" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Postpone time off after payslip validation" +msgstr "Odložení volna po ověření výplatní pásky" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_form_inherit +msgid "Report to Next Month" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Responsible" +msgstr "Odpovědný" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The next month work entries are not generated yet or are validated already " +"for time off %s" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The pay of the month is already validated with this day included. If you " +"need to adapt, please refer to HR." +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The time off %s can not be reported because it is defined over more than 2 " +"months" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "There is no work entries linked to this time off to report" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_payslip.py:0 +msgid "" +"There is some remaining time off to defer for these employees: \n" +"\n" +" %s" +msgstr "" +"Těmto zaměstnancům zbývá určitá část volna k odložení: \n" +"\n" +"%s" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_work_entry_action +#: model:ir.model,name:hr_payroll_holidays.model_hr_leave +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Time Off" +msgstr "Volno" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_allocation +msgid "Time Off Not Related To An Allocation" +msgstr "" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_to_defer +msgid "Time Off To Defer" +msgstr "" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_document +msgid "Time Off Without Joined Document" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_action_open_to_defer +msgid "Time Off to Defer" +msgstr "Volno k odložení" + +#. module: hr_payroll_holidays +#: model:ir.ui.menu,name:hr_payroll_holidays.menu_work_entry_leave_to_approve +msgid "Time Off to Report" +msgstr "Volné dny k vykázání" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +msgid "To Defer" +msgstr "K odložení" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__normal +msgid "To compute in next payslip" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__blocked +msgid "To defer to next payslip" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Validated Time Off to Defer" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "You have some" +msgstr "Máte nějaké" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/views/hooks.js:0 +msgid "You have some to defer to the next month." +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "time off" +msgstr "volno" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "to defer to the next month." +msgstr "odložit na příští měsíc." diff --git a/addons_extensions/hr_payroll_holidays/i18n/de.po b/addons_extensions/hr_payroll_holidays/i18n/de.po new file mode 100644 index 000000000..c05036645 --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/i18n/de.po @@ -0,0 +1,267 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_payroll_holidays +# +# Translators: +# Wil Odoo, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-09-25 09:26+0000\n" +"PO-Revision-Date: 2024-09-25 09:44+0000\n" +"Last-Translator: Wil Odoo, 2024\n" +"Language-Team: German (https://app.transifex.com/odoo/teams/41243/de/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: de\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "" +"A great way to keep track on employee’s PTOs, sick days, and approval " +"status." +msgstr "" +"Eine gute Möglichkeit, den Überblick über die Urlaubstage und Krankheitstage" +" der Mitarbeiter und den Genehmigungsstatus zu behalten." + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_mail_activity +msgid "Activity" +msgstr "Aktivität" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_company +msgid "Companies" +msgstr "Unternehmen" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__done +msgid "Computed in current payslip" +msgstr "Berechnet in der aktuellen Gehaltsabrechnung" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_config_settings +msgid "Config Settings" +msgstr "Konfigurationseinstellungen" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_report_to_next_month +msgid "Defer to Next Month" +msgstr "Auf nächsten Monat verschieben" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Deferred Time Off" +msgstr "Freistellungen" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_company__deferred_time_off_manager +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_config_settings__deferred_time_off_manager +msgid "Deferred Time Off Manager" +msgstr "Manager für Freistellungen" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.view_hr_leave_allocation_inherit_filter +msgid "Employee Code" +msgstr "Mitarbeitercode" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_contract +msgid "Employee Contract" +msgstr "Arbeitsvertrag" + +#. module: hr_payroll_holidays +#: model:mail.activity.type,name:hr_payroll_holidays.mail_activity_data_hr_leave_to_defer +msgid "Leave to Defer" +msgstr "Zu verschiebender Urlaub" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_mark_as_reported +msgid "Mark as deferred" +msgstr "Als verschoben markieren" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "Meet the time off dashboard." +msgstr "Willkommen auf dem Abwesenheitsdashboard." + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"Not enough attendance work entries to report the time off %s. Please make " +"the operation manually" +msgstr "" +"Nicht genügend Anwesenheitseinträge, um die Abwesenheit %s auf den nächsten " +"Monat zu übertragen. Bitte nehmen Sie den Vorgang manuell vor." + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Only an employee time off to defer can be reported to next month" +msgstr "" +"Nur eine zu verschiebende Abwesenheit kann auf den nächsten Monat übertragen" +" werden." + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_payslip +msgid "Pay Slip" +msgstr "Gehaltsabrechnung" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_hr_leave__payslip_state +msgid "Payslip State" +msgstr "Status der Gehaltsabrechnung" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Please create manually the work entry for %s" +msgstr "Bitte erstellen Sie den Arbeitseintrag für %s manuell" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Postpone time off after payslip validation" +msgstr "Abwesenheit nach der Validierung der Gehaltsabrechnung aufschieben" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_form_inherit +msgid "Report to Next Month" +msgstr "Auf nächsten Monat übertragen" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Responsible" +msgstr "Verantwortlich" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The next month work entries are not generated yet or are validated already " +"for time off %s" +msgstr "" +"Die Arbeitseinträge des nächsten Monats wurden noch nicht erstellt oder " +"wurden bereits für die Abwesenheit %s validiert" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The pay of the month is already validated with this day included. If you " +"need to adapt, please refer to HR." +msgstr "" +"Die Bezahlung des Monats ist bereits mit diesem Tag validiert. Wenn Sie eine" +" Anpassung benötigen, wenden Sie sich bitte an die Personalabteilung." + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The time off %s can not be reported because it is defined over more than 2 " +"months" +msgstr "" +"Die Abwesenheit %s kann nicht übertragen werden, weil sie über mehr als 2 " +"Monate festgelegt ist" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "There is no work entries linked to this time off to report" +msgstr "" +"Es gibt keine mit diesem Abwesenheitsbericht verknüpften Arbeitseinträge" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_payslip.py:0 +msgid "" +"There is some remaining time off to defer for these employees: \n" +"\n" +" %s" +msgstr "" +"Für diese Mitarbeiter gibt es noch einige verbleibende Abwesenheiten, die aufgeschoben werden können: \n" +"%s" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_work_entry_action +#: model:ir.model,name:hr_payroll_holidays.model_hr_leave +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Time Off" +msgstr "Abwesenheiten" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_allocation +msgid "Time Off Not Related To An Allocation" +msgstr "Abwesenheit nicht mit einem Urlaubsanspruch verknüpft" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_to_defer +msgid "Time Off To Defer" +msgstr "Aufzuschiebende Abwesenheit" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_document +msgid "Time Off Without Joined Document" +msgstr "Abwesenheit ohne beigefügtes Dokument" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_action_open_to_defer +msgid "Time Off to Defer" +msgstr "Zu verschiebende Abwesenheit" + +#. module: hr_payroll_holidays +#: model:ir.ui.menu,name:hr_payroll_holidays.menu_work_entry_leave_to_approve +msgid "Time Off to Report" +msgstr "Zu übertragende Abwesenheit" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +msgid "To Defer" +msgstr "Zu verschieben" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__normal +msgid "To compute in next payslip" +msgstr "In nächster Gehaltsabrechnung zu berechnen" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__blocked +msgid "To defer to next payslip" +msgstr "In nächste Gehaltsabrechnung zu verschieben" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Validated Time Off to Defer" +msgstr "Validierte, zu verschiebende Abwesenheit" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "You have some" +msgstr "Sie haben einige" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/views/hooks.js:0 +msgid "You have some to defer to the next month." +msgstr "" +"Sie haben einige auf den nächsten Monat aufzuschiebene " +"." + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "time off" +msgstr "Abwesenheiten" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "to defer to the next month." +msgstr ", die in den nächsten Monat verschieben werden können." diff --git a/addons_extensions/hr_payroll_holidays/i18n/es.po b/addons_extensions/hr_payroll_holidays/i18n/es.po new file mode 100644 index 000000000..bdc8e1a4b --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/i18n/es.po @@ -0,0 +1,265 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_payroll_holidays +# +# Translators: +# Wil Odoo, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-09-25 09:26+0000\n" +"PO-Revision-Date: 2024-09-25 09:44+0000\n" +"Last-Translator: Wil Odoo, 2024\n" +"Language-Team: Spanish (https://app.transifex.com/odoo/teams/41243/es/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: es\n" +"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "" +"A great way to keep track on employee’s PTOs, sick days, and approval " +"status." +msgstr "" +"Una excelente manera de realizar un seguimiento de las ausencias pagadas de " +"los empleados, los permisos por enfermedad y su estado de aprobación." + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_mail_activity +msgid "Activity" +msgstr "Actividad" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_company +msgid "Companies" +msgstr "Compañías" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__done +msgid "Computed in current payslip" +msgstr "Calculado en el recibo de nómina actual" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_config_settings +msgid "Config Settings" +msgstr "Ajustes de configuración" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_report_to_next_month +msgid "Defer to Next Month" +msgstr "Aplazar al próximo mes" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Deferred Time Off" +msgstr "Ausencias aplazadas" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_company__deferred_time_off_manager +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_config_settings__deferred_time_off_manager +msgid "Deferred Time Off Manager" +msgstr "Gerente de ausencias aplazadas" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.view_hr_leave_allocation_inherit_filter +msgid "Employee Code" +msgstr "Código del empleado" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_contract +msgid "Employee Contract" +msgstr "Contrato del empleado" + +#. module: hr_payroll_holidays +#: model:mail.activity.type,name:hr_payroll_holidays.mail_activity_data_hr_leave_to_defer +msgid "Leave to Defer" +msgstr "Permiso a aplazar" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_mark_as_reported +msgid "Mark as deferred" +msgstr "Marcar como aplazado" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "Meet the time off dashboard." +msgstr "Conozca el tablero de ausencias." + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"Not enough attendance work entries to report the time off %s. Please make " +"the operation manually" +msgstr "" +"No hay suficientes entradas de trabajo de asistencia para trasladar la " +"ausencia %s. Por favor, realice la operación manualmente" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Only an employee time off to defer can be reported to next month" +msgstr "" +"Sólo la ausencia de un empleado para aplazar puede ser traslada al próximo " +"mes." + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_payslip +msgid "Pay Slip" +msgstr "Recibo de nómina" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_hr_leave__payslip_state +msgid "Payslip State" +msgstr "Estado del recibo de nómina" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Please create manually the work entry for %s" +msgstr "Cree la entrada de trabajo para %s manualmente." + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Postpone time off after payslip validation" +msgstr "" +"Posponer las ausencias a después de la validación del recibo de nómina" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_form_inherit +msgid "Report to Next Month" +msgstr "Trasladar al próximo mes" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Responsible" +msgstr "Responsable" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The next month work entries are not generated yet or are validated already " +"for time off %s" +msgstr "" +"Aún no se generan las entradas de trabajo del próximo mes o ya se validaron " +"para la ausencia %s" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The pay of the month is already validated with this day included. If you " +"need to adapt, please refer to HR." +msgstr "" +"El pago del mes ya está validado e incluye este día. Si necesita " +"modificarlo, consulte a RR. HH." + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The time off %s can not be reported because it is defined over more than 2 " +"months" +msgstr "" +"La ausencia %s no se puede trasladar porque se define en más de 2 meses " + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "There is no work entries linked to this time off to report" +msgstr "No hay entradas de trabajo vinculadas a esta ausencia para trasladar" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_payslip.py:0 +msgid "" +"There is some remaining time off to defer for these employees: \n" +"\n" +" %s" +msgstr "" +"Hay ausencias restantes por aplazar para estos empleados: \n" +"\n" +" %s" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_work_entry_action +#: model:ir.model,name:hr_payroll_holidays.model_hr_leave +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Time Off" +msgstr "Ausencias" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_allocation +msgid "Time Off Not Related To An Allocation" +msgstr "Ausencia no relacionada con una asignación" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_to_defer +msgid "Time Off To Defer" +msgstr "Ausencia a aplazar" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_document +msgid "Time Off Without Joined Document" +msgstr "Ausencia sin documento unido" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_action_open_to_defer +msgid "Time Off to Defer" +msgstr "Ausencia a aplazar" + +#. module: hr_payroll_holidays +#: model:ir.ui.menu,name:hr_payroll_holidays.menu_work_entry_leave_to_approve +msgid "Time Off to Report" +msgstr "Ausencia a trasladar" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +msgid "To Defer" +msgstr "A aplazar" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__normal +msgid "To compute in next payslip" +msgstr "Para calcular en el siguiente recibo de nómina" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__blocked +msgid "To defer to next payslip" +msgstr "A aplazar en el siguiente recibo de nómina" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Validated Time Off to Defer" +msgstr "Ausencia validada a aplazar" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "You have some" +msgstr "Tiene" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/views/hooks.js:0 +msgid "You have some to defer to the next month." +msgstr "Tiene algunas para aplazar al próximo mes." + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "time off" +msgstr "ausencias" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "to defer to the next month." +msgstr "para aplazar al próximo mes." diff --git a/addons_extensions/hr_payroll_holidays/i18n/es_419.po b/addons_extensions/hr_payroll_holidays/i18n/es_419.po new file mode 100644 index 000000000..1f906a9c7 --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/i18n/es_419.po @@ -0,0 +1,269 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_payroll_holidays +# +# Translators: +# Wil Odoo, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-09-25 09:26+0000\n" +"PO-Revision-Date: 2024-09-25 09:44+0000\n" +"Last-Translator: Wil Odoo, 2024\n" +"Language-Team: Spanish (Latin America) (https://app.transifex.com/odoo/teams/41243/es_419/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: es_419\n" +"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "" +"A great way to keep track on employee’s PTOs, sick days, and approval " +"status." +msgstr "" +"Una excelente manera de monitorear el tiempo personal pagado de los " +"empleados, los permisos por enfermedad y el estado de aprobación." + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_mail_activity +msgid "Activity" +msgstr "Actividad" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_company +msgid "Companies" +msgstr "Empresas" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__done +msgid "Computed in current payslip" +msgstr "Calculado en el recibo de nómina actual" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_config_settings +msgid "Config Settings" +msgstr "Ajustes de configuración" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_report_to_next_month +msgid "Defer to Next Month" +msgstr "Diferir al próximo mes" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Deferred Time Off" +msgstr "Tiempo personal diferido" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_company__deferred_time_off_manager +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_config_settings__deferred_time_off_manager +msgid "Deferred Time Off Manager" +msgstr "Gerente de tiempo personal diferido" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.view_hr_leave_allocation_inherit_filter +msgid "Employee Code" +msgstr "Código del empleado" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_contract +msgid "Employee Contract" +msgstr "Contrato del empleado" + +#. module: hr_payroll_holidays +#: model:mail.activity.type,name:hr_payroll_holidays.mail_activity_data_hr_leave_to_defer +msgid "Leave to Defer" +msgstr "Permiso por diferir" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_mark_as_reported +msgid "Mark as deferred" +msgstr "Marcar como diferido" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "Meet the time off dashboard." +msgstr "Conozca el tablero de tiempo personal" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"Not enough attendance work entries to report the time off %s. Please make " +"the operation manually" +msgstr "" +"No hay suficientes entradas de trabajo de asistencia para reportar el tiempo" +" personal %s. Haga la operación de forma manual." + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Only an employee time off to defer can be reported to next month" +msgstr "" +"Solo se puede reportar al siguiente mes un tiempo personal diferido de un " +"empleado." + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_payslip +msgid "Pay Slip" +msgstr "Recibo de nómina" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_hr_leave__payslip_state +msgid "Payslip State" +msgstr "Estado del recibo de nómina" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Please create manually the work entry for %s" +msgstr "Cree la entrada de trabajo para %s de forma manual." + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Postpone time off after payslip validation" +msgstr "" +"Posponer el tiempo personal a después de la validación del recibo de nómina" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_form_inherit +msgid "Report to Next Month" +msgstr "Reportar al próximo mes" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Responsible" +msgstr "Responsable" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The next month work entries are not generated yet or are validated already " +"for time off %s" +msgstr "" +"Aún no se generan las entradas de trabajo del próximo mes o ya se validaron " +"para tiempo personal %s" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The pay of the month is already validated with this day included. If you " +"need to adapt, please refer to HR." +msgstr "" +"El pago del mes ya está validado e incluye este día. Si necesita " +"modificarlo, consulte a RR. HH." + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The time off %s can not be reported because it is defined over more than 2 " +"months" +msgstr "" +"No se puede reportar el tiempo personal %s porque se definió hace más de 2 " +"meses." + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "There is no work entries linked to this time off to report" +msgstr "" +"No hay entradas de trabajo por reportar vinculadas a este tiempo personal." + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_payslip.py:0 +msgid "" +"There is some remaining time off to defer for these employees: \n" +"\n" +" %s" +msgstr "" +"Hay tiempo personal restante por diferir para estos empleados:\n" +"\n" +"%s" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_work_entry_action +#: model:ir.model,name:hr_payroll_holidays.model_hr_leave +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Time Off" +msgstr "Tiempo personal" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_allocation +msgid "Time Off Not Related To An Allocation" +msgstr "Tiempo personal no relacionado a una asignación" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_to_defer +msgid "Time Off To Defer" +msgstr "Tiempo personal por diferir" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_document +msgid "Time Off Without Joined Document" +msgstr "Tiempo personal sin documento adjunto" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_action_open_to_defer +msgid "Time Off to Defer" +msgstr "Tiempo personal por diferir" + +#. module: hr_payroll_holidays +#: model:ir.ui.menu,name:hr_payroll_holidays.menu_work_entry_leave_to_approve +msgid "Time Off to Report" +msgstr "Tiempo personal por reportar" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +msgid "To Defer" +msgstr "Por diferir" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__normal +msgid "To compute in next payslip" +msgstr "A calcular en el siguiente recibo de nómina" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__blocked +msgid "To defer to next payslip" +msgstr "A diferir en el siguiente recibo de nómina" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Validated Time Off to Defer" +msgstr "Tiempo personal validado por diferir" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "You have some" +msgstr "Tiene" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/views/hooks.js:0 +msgid "You have some to defer to the next month." +msgstr "" +"Tiene algunos días de para diferir al " +"próximo mes." + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "time off" +msgstr "tiempo personal" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "to defer to the next month." +msgstr "para diferir al próximo mes." diff --git a/addons_extensions/hr_payroll_holidays/i18n/et.po b/addons_extensions/hr_payroll_holidays/i18n/et.po new file mode 100644 index 000000000..db34cad59 --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/i18n/et.po @@ -0,0 +1,265 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_payroll_holidays +# +# Translators: +# Stevin Lilla, 2024 +# Piia Paurson , 2024 +# Eneli Õigus , 2024 +# JanaAvalah, 2024 +# Algo Kärp , 2024 +# Anna, 2024 +# Birgit Vijar, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-09-25 09:26+0000\n" +"PO-Revision-Date: 2024-09-25 09:44+0000\n" +"Last-Translator: Birgit Vijar, 2024\n" +"Language-Team: Estonian (https://app.transifex.com/odoo/teams/41243/et/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: et\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "" +"A great way to keep track on employee’s PTOs, sick days, and approval " +"status." +msgstr "" +"Hea võimalus jälgimaks töötajate tasustatud puudumisi, haiguspäevi ja " +"kinnitamise staatust." + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_mail_activity +msgid "Activity" +msgstr "Tegevus" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_company +msgid "Companies" +msgstr "Ettevõtted" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__done +msgid "Computed in current payslip" +msgstr "Arvutatud jooksval palgalehel" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_config_settings +msgid "Config Settings" +msgstr "Seadistused" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_report_to_next_month +msgid "Defer to Next Month" +msgstr "Lükka edasi järgmisele kuule" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Deferred Time Off" +msgstr "Edasilükatud puudumised" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_company__deferred_time_off_manager +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_config_settings__deferred_time_off_manager +msgid "Deferred Time Off Manager" +msgstr "Edasilükatud puudumiste kinnitaja" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.view_hr_leave_allocation_inherit_filter +msgid "Employee Code" +msgstr "Töötaja kood" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_contract +msgid "Employee Contract" +msgstr "Tööleping" + +#. module: hr_payroll_holidays +#: model:mail.activity.type,name:hr_payroll_holidays.mail_activity_data_hr_leave_to_defer +msgid "Leave to Defer" +msgstr "Jäta edasilükkamiseks" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_mark_as_reported +msgid "Mark as deferred" +msgstr "Märgi edasilükatuks" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "Meet the time off dashboard." +msgstr "Tutvuge puudumiste töölauaga." + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"Not enough attendance work entries to report the time off %s. Please make " +"the operation manually" +msgstr "" +"Puudumise %s esitamiseks pole piisavalt piisavalt päevi välja teenitud. " +"Tehke toiming käsitsi" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Only an employee time off to defer can be reported to next month" +msgstr "Only an employee time off to defer can be reported to next month" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_payslip +msgid "Pay Slip" +msgstr "Palgaleht" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_hr_leave__payslip_state +msgid "Payslip State" +msgstr "Palgalehe staatus" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Please create manually the work entry for %s" +msgstr "Loo tööaeg manuaalselt %s" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Postpone time off after payslip validation" +msgstr "Lükake puudumine pärast palgalehe kinnitamist edasi" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_form_inherit +msgid "Report to Next Month" +msgstr "Kajasta järgmises kuus" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Responsible" +msgstr "Vastutaja" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The next month work entries are not generated yet or are validated already " +"for time off %s" +msgstr "" +"Järgmise kuu töökirjeid pole veel loodud või need on juba %s puudumisteks " +"kinnitatud" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The pay of the month is already validated with this day included. If you " +"need to adapt, please refer to HR." +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The time off %s can not be reported because it is defined over more than 2 " +"months" +msgstr "Puudumist %s ei saa esitada kuna see on pikem kui 2 kuud" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "There is no work entries linked to this time off to report" +msgstr "Selle puudumisega ei ole seotud ühtegi töökirjet, millest teatada" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_payslip.py:0 +msgid "" +"There is some remaining time off to defer for these employees: \n" +"\n" +" %s" +msgstr "" +"Nendel töötajatel on jäänud alles kasutamata puhkepäevi:\n" +"\n" +" %s" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_work_entry_action +#: model:ir.model,name:hr_payroll_holidays.model_hr_leave +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Time Off" +msgstr "Puudumised" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_allocation +msgid "Time Off Not Related To An Allocation" +msgstr "" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_to_defer +msgid "Time Off To Defer" +msgstr "Aeg edasi lükata" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_document +msgid "Time Off Without Joined Document" +msgstr "Puudumised ilma seotud dokumendita" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_action_open_to_defer +msgid "Time Off to Defer" +msgstr "Puudumine edasi lükkamiseks" + +#. module: hr_payroll_holidays +#: model:ir.ui.menu,name:hr_payroll_holidays.menu_work_entry_leave_to_approve +msgid "Time Off to Report" +msgstr "Puudumised raportisse" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +msgid "To Defer" +msgstr "Edasi lükata" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__normal +msgid "To compute in next payslip" +msgstr "Arvutamiseks järgmisel palgalehel" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__blocked +msgid "To defer to next payslip" +msgstr "Järgmisele palgalehele edasilükkamiseks" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Validated Time Off to Defer" +msgstr "Kinnitatud puudumised edasilükkamiseks" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "You have some" +msgstr "Teil on mõned" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/views/hooks.js:0 +msgid "You have some to defer to the next month." +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "time off" +msgstr "Puudumised" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "to defer to the next month." +msgstr "Edasi lükata järgmisse kuusse." diff --git a/addons_extensions/hr_payroll_holidays/i18n/fi.po b/addons_extensions/hr_payroll_holidays/i18n/fi.po new file mode 100644 index 000000000..cd742ae11 --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/i18n/fi.po @@ -0,0 +1,273 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_payroll_holidays +# +# Translators: +# Kari Lindgren , 2024 +# Tuomo Aura , 2024 +# Veikko Väätäjä , 2024 +# Martin Trigaux, 2024 +# Konsta Aavaranta, 2024 +# Jarmo Kortetjärvi , 2024 +# Ossi Mantylahti , 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-09-25 09:26+0000\n" +"PO-Revision-Date: 2024-09-25 09:44+0000\n" +"Last-Translator: Ossi Mantylahti , 2024\n" +"Language-Team: Finnish (https://app.transifex.com/odoo/teams/41243/fi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: fi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "" +"A great way to keep track on employee’s PTOs, sick days, and approval " +"status." +msgstr "" +"Loistava tapa seurata työntekijän vapaa- ja sairauspäiviä sekä hyväksynnän " +"tilaa." + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_mail_activity +msgid "Activity" +msgstr "Toimenpide" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_company +msgid "Companies" +msgstr "Yritykset" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__done +msgid "Computed in current payslip" +msgstr "Laskettu nykyisessä palkkalaskelmasta" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_config_settings +msgid "Config Settings" +msgstr "Asetukset" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_report_to_next_month +msgid "Defer to Next Month" +msgstr "Siirretään seuraavaan kuukauteen" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Deferred Time Off" +msgstr "Lykätty vapaa-aika" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_company__deferred_time_off_manager +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_config_settings__deferred_time_off_manager +msgid "Deferred Time Off Manager" +msgstr "Lykättyjen vapaiden esihenkilö" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.view_hr_leave_allocation_inherit_filter +msgid "Employee Code" +msgstr "Työntekijän koodi" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_contract +msgid "Employee Contract" +msgstr "Työsopimus" + +#. module: hr_payroll_holidays +#: model:mail.activity.type,name:hr_payroll_holidays.mail_activity_data_hr_leave_to_defer +msgid "Leave to Defer" +msgstr "Lykätty vapaa" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_mark_as_reported +msgid "Mark as deferred" +msgstr "Merkitse jaksotetuksi" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "Meet the time off dashboard." +msgstr "Tutustu vapaapäivien mittaristoon." + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"Not enough attendance work entries to report the time off %s. Please make " +"the operation manually" +msgstr "" +"Vapaapäivien ilmoittamiseen ei ole riittävästi läsnäolotyömerkintöjä %s. Tee" +" toiminto manuaalisesti" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Only an employee time off to defer can be reported to next month" +msgstr "" +"Ainoastaan työntekijän lykkäämät vapaat voidaan ilmoittaa seuraavaan " +"kuukauteen" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_payslip +msgid "Pay Slip" +msgstr "Palkkalaskelma" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_hr_leave__payslip_state +msgid "Payslip State" +msgstr "Palkkalaskelman tila" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Please create manually the work entry for %s" +msgstr "Luo manuaalisesti työaikatyyppi %s varten" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Postpone time off after payslip validation" +msgstr "Lykkää vapaata palkkalaskelman vahvistamisen jälkeen" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_form_inherit +msgid "Report to Next Month" +msgstr "Raportoi seuraavaan kuukauteen" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Responsible" +msgstr "Vastuuhenkilö" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The next month work entries are not generated yet or are validated already " +"for time off %s" +msgstr "" +"Seuraavan kuukauden työaikatyyppejä ei ole vielä luotu tai ne on jo " +"validoitu vapaata varten %s" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The pay of the month is already validated with this day included. If you " +"need to adapt, please refer to HR." +msgstr "" +"Kuukauden palkka on jo vahvistettu, ja tämä päivä sisältyy siihen. Jos " +"haluat mukauttaa sitä, ota yhteyttä henkilöstöhallintoon." + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The time off %s can not be reported because it is defined over more than 2 " +"months" +msgstr "" +"Vapaa-aikaa %s ei voida ilmoittaa, koska se on määritelty yli 2 kuukauden " +"ajalle" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "There is no work entries linked to this time off to report" +msgstr "Tähän vapaaseen ei liity työmerkintöjä, joista olisi ilmoitettava" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_payslip.py:0 +msgid "" +"There is some remaining time off to defer for these employees: \n" +"\n" +" %s" +msgstr "" +"Näillä työntekijöillä on vielä jonkin verran lykättävää vapaata:\n" +"\n" +" %s" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_work_entry_action +#: model:ir.model,name:hr_payroll_holidays.model_hr_leave +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Time Off" +msgstr "Vapaa" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_allocation +msgid "Time Off Not Related To An Allocation" +msgstr "Vapaa-aika, joka ei liity vastuutukseen" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_to_defer +msgid "Time Off To Defer" +msgstr "Lykättävä vapaa-aika" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_document +msgid "Time Off Without Joined Document" +msgstr "Vapaa-aika ilman yhdistettyä asiakirjaa" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_action_open_to_defer +msgid "Time Off to Defer" +msgstr "Lykättävä vapaa-aika" + +#. module: hr_payroll_holidays +#: model:ir.ui.menu,name:hr_payroll_holidays.menu_work_entry_leave_to_approve +msgid "Time Off to Report" +msgstr "Vapaa-aika raportointia varten" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +msgid "To Defer" +msgstr "Lykätään" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__normal +msgid "To compute in next payslip" +msgstr "Lasketaan seuraavassa palkkalaskelmassa" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__blocked +msgid "To defer to next payslip" +msgstr "Lykätään seuraavaan palkkalaskelmaan" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Validated Time Off to Defer" +msgstr "Vahvistettu lykättävä vapaa-aika" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "You have some" +msgstr "Sinulla on joitakin" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/views/hooks.js:0 +msgid "You have some to defer to the next month." +msgstr "" +"Sinulla on , jonka voit siirtää seuraavaan " +"kuukauteen." + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "time off" +msgstr "vapaa-aika" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "to defer to the next month." +msgstr "siirtää seuraavaan kuukauteen." diff --git a/addons_extensions/hr_payroll_holidays/i18n/fr.po b/addons_extensions/hr_payroll_holidays/i18n/fr.po new file mode 100644 index 000000000..c3b73a33d --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/i18n/fr.po @@ -0,0 +1,264 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_payroll_holidays +# +# Translators: +# Wil Odoo, 2024 +# Manon Rondou, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-09-25 09:26+0000\n" +"PO-Revision-Date: 2024-09-25 09:44+0000\n" +"Last-Translator: Manon Rondou, 2024\n" +"Language-Team: French (https://app.transifex.com/odoo/teams/41243/fr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: fr\n" +"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "" +"A great way to keep track on employee’s PTOs, sick days, and approval " +"status." +msgstr "" +"La meilleure façon de suivre vos congés payés, jours de maladies et autres " +"demandes de validation. " + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_mail_activity +msgid "Activity" +msgstr "Activité" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_company +msgid "Companies" +msgstr "Sociétés" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__done +msgid "Computed in current payslip" +msgstr "Calculé dans la fiche de paie actuelle" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_config_settings +msgid "Config Settings" +msgstr "Paramètres de configuration" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_report_to_next_month +msgid "Defer to Next Month" +msgstr "Reporter au mois suivant" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Deferred Time Off" +msgstr "Congés reportés" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_company__deferred_time_off_manager +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_config_settings__deferred_time_off_manager +msgid "Deferred Time Off Manager" +msgstr "Responsable des congés à reporter" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.view_hr_leave_allocation_inherit_filter +msgid "Employee Code" +msgstr "Code de l'employé" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_contract +msgid "Employee Contract" +msgstr "Contrat d'employé" + +#. module: hr_payroll_holidays +#: model:mail.activity.type,name:hr_payroll_holidays.mail_activity_data_hr_leave_to_defer +msgid "Leave to Defer" +msgstr "Congé à reporter" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_mark_as_reported +msgid "Mark as deferred" +msgstr "Marquer comme reporté" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "Meet the time off dashboard." +msgstr "Découvrez le tableau de bord des congés." + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"Not enough attendance work entries to report the time off %s. Please make " +"the operation manually" +msgstr "" +"Pas assez de prestations pour déclarer le congé %s. Veuillez effectuer " +"l'opération manuellement" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Only an employee time off to defer can be reported to next month" +msgstr "Seul un congé à reporter peut être reporté au mois suivant" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_payslip +msgid "Pay Slip" +msgstr "Fiche de paie" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_hr_leave__payslip_state +msgid "Payslip State" +msgstr "Statut de la fiche de paie" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Please create manually the work entry for %s" +msgstr "Veuillez créer manuellement la prestation pour %s" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Postpone time off after payslip validation" +msgstr "Report du congé après validation de la fiche de paie" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_form_inherit +msgid "Report to Next Month" +msgstr "Reporter au mois suivant" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Responsible" +msgstr "Responsable" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The next month work entries are not generated yet or are validated already " +"for time off %s" +msgstr "" +"Les prestations du mois prochain ne sont pas encore générées ou ont été déjà" +" validées pour le congé %s" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The pay of the month is already validated with this day included. If you " +"need to adapt, please refer to HR." +msgstr "" +"La paie du mois a déjà été validée, ce jour inclus. Si vous devez l'adapter," +" veuillez vous adresser aux ressources humaines." + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The time off %s can not be reported because it is defined over more than 2 " +"months" +msgstr "" +"Le congé %s ne peut pas être reporté parce qu'il est défini sur plus de 2 " +"mois" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "There is no work entries linked to this time off to report" +msgstr "Il n'y a pas de prestations liées à ce congé à reporter" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_payslip.py:0 +msgid "" +"There is some remaining time off to defer for these employees: \n" +"\n" +" %s" +msgstr "" +"Il reste des congés à reporter pour ces employés :\n" +"\n" +"%s" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_work_entry_action +#: model:ir.model,name:hr_payroll_holidays.model_hr_leave +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Time Off" +msgstr "Congés" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_allocation +msgid "Time Off Not Related To An Allocation" +msgstr "Congé sans lien avec une allocation" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_to_defer +msgid "Time Off To Defer" +msgstr "Congés à reporter" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_document +msgid "Time Off Without Joined Document" +msgstr "Congés sans documents joints" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_action_open_to_defer +msgid "Time Off to Defer" +msgstr "Congés à reporter" + +#. module: hr_payroll_holidays +#: model:ir.ui.menu,name:hr_payroll_holidays.menu_work_entry_leave_to_approve +msgid "Time Off to Report" +msgstr "Congés à rapporter" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +msgid "To Defer" +msgstr "À reporter" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__normal +msgid "To compute in next payslip" +msgstr "À calculer dans la prochaine fiche de paie" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__blocked +msgid "To defer to next payslip" +msgstr "À reporter à la prochaine fiche de paie" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Validated Time Off to Defer" +msgstr "Congés validés à reporter" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "You have some" +msgstr "Vous avez des " + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/views/hooks.js:0 +msgid "You have some to defer to the next month." +msgstr "Vous avez des  à reporter au mois suivant." + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "time off" +msgstr "congés" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "to defer to the next month." +msgstr "à reporter au mois prochain." diff --git a/addons_extensions/hr_payroll_holidays/i18n/he.po b/addons_extensions/hr_payroll_holidays/i18n/he.po new file mode 100644 index 000000000..5a0c9c209 --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/i18n/he.po @@ -0,0 +1,253 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_payroll_holidays +# +# Translators: +# Yihya Hugirat , 2024 +# Orel Nahmany, 2024 +# ZVI BLONDER , 2024 +# Netta Waizer, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-09-25 09:26+0000\n" +"PO-Revision-Date: 2024-09-25 09:44+0000\n" +"Last-Translator: Netta Waizer, 2024\n" +"Language-Team: Hebrew (https://app.transifex.com/odoo/teams/41243/he/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: he\n" +"Plural-Forms: nplurals=3; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: 2;\n" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "" +"A great way to keep track on employee’s PTOs, sick days, and approval " +"status." +msgstr "דרך מצוינת לעקוב אחר החופשה בתשלום של העובד, ימי מחלה וסטטוס האישור." + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_mail_activity +msgid "Activity" +msgstr "פעילות" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_company +msgid "Companies" +msgstr "חברות" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__done +msgid "Computed in current payslip" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_config_settings +msgid "Config Settings" +msgstr "הגדרות תצורה" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_report_to_next_month +msgid "Defer to Next Month" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Deferred Time Off" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_company__deferred_time_off_manager +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_config_settings__deferred_time_off_manager +msgid "Deferred Time Off Manager" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.view_hr_leave_allocation_inherit_filter +msgid "Employee Code" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_contract +msgid "Employee Contract" +msgstr "חוזה עובד" + +#. module: hr_payroll_holidays +#: model:mail.activity.type,name:hr_payroll_holidays.mail_activity_data_hr_leave_to_defer +msgid "Leave to Defer" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_mark_as_reported +msgid "Mark as deferred" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "Meet the time off dashboard." +msgstr "הכירו את לוח המחוונים לחופשות." + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"Not enough attendance work entries to report the time off %s. Please make " +"the operation manually" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Only an employee time off to defer can be reported to next month" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_payslip +msgid "Pay Slip" +msgstr "תלוש שכר" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_hr_leave__payslip_state +msgid "Payslip State" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Please create manually the work entry for %s" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Postpone time off after payslip validation" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_form_inherit +msgid "Report to Next Month" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Responsible" +msgstr "אחראי" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The next month work entries are not generated yet or are validated already " +"for time off %s" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The pay of the month is already validated with this day included. If you " +"need to adapt, please refer to HR." +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The time off %s can not be reported because it is defined over more than 2 " +"months" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "There is no work entries linked to this time off to report" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_payslip.py:0 +msgid "" +"There is some remaining time off to defer for these employees: \n" +"\n" +" %s" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_work_entry_action +#: model:ir.model,name:hr_payroll_holidays.model_hr_leave +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Time Off" +msgstr "מאשר חופשות" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_allocation +msgid "Time Off Not Related To An Allocation" +msgstr "" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_to_defer +msgid "Time Off To Defer" +msgstr "" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_document +msgid "Time Off Without Joined Document" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_action_open_to_defer +msgid "Time Off to Defer" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.ui.menu,name:hr_payroll_holidays.menu_work_entry_leave_to_approve +msgid "Time Off to Report" +msgstr "חופש לדיווח" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +msgid "To Defer" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__normal +msgid "To compute in next payslip" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__blocked +msgid "To defer to next payslip" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Validated Time Off to Defer" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "You have some" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/views/hooks.js:0 +msgid "You have some to defer to the next month." +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "time off" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "to defer to the next month." +msgstr "" diff --git a/addons_extensions/hr_payroll_holidays/i18n/hi.po b/addons_extensions/hr_payroll_holidays/i18n/hi.po new file mode 100644 index 000000000..112a1c44f --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/i18n/hi.po @@ -0,0 +1,246 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_payroll_holidays +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-09-25 09:26+0000\n" +"PO-Revision-Date: 2024-09-25 09:44+0000\n" +"Language-Team: Hindi (https://app.transifex.com/odoo/teams/41243/hi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: hi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "" +"A great way to keep track on employee’s PTOs, sick days, and approval " +"status." +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_mail_activity +msgid "Activity" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_company +msgid "Companies" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__done +msgid "Computed in current payslip" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_report_to_next_month +msgid "Defer to Next Month" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Deferred Time Off" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_company__deferred_time_off_manager +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_config_settings__deferred_time_off_manager +msgid "Deferred Time Off Manager" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.view_hr_leave_allocation_inherit_filter +msgid "Employee Code" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_contract +msgid "Employee Contract" +msgstr "" + +#. module: hr_payroll_holidays +#: model:mail.activity.type,name:hr_payroll_holidays.mail_activity_data_hr_leave_to_defer +msgid "Leave to Defer" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_mark_as_reported +msgid "Mark as deferred" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "Meet the time off dashboard." +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"Not enough attendance work entries to report the time off %s. Please make " +"the operation manually" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Only an employee time off to defer can be reported to next month" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_payslip +msgid "Pay Slip" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_hr_leave__payslip_state +msgid "Payslip State" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Please create manually the work entry for %s" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Postpone time off after payslip validation" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_form_inherit +msgid "Report to Next Month" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Responsible" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The next month work entries are not generated yet or are validated already " +"for time off %s" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The pay of the month is already validated with this day included. If you " +"need to adapt, please refer to HR." +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The time off %s can not be reported because it is defined over more than 2 " +"months" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "There is no work entries linked to this time off to report" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_payslip.py:0 +msgid "" +"There is some remaining time off to defer for these employees: \n" +"\n" +" %s" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_work_entry_action +#: model:ir.model,name:hr_payroll_holidays.model_hr_leave +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Time Off" +msgstr "" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_allocation +msgid "Time Off Not Related To An Allocation" +msgstr "" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_to_defer +msgid "Time Off To Defer" +msgstr "" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_document +msgid "Time Off Without Joined Document" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_action_open_to_defer +msgid "Time Off to Defer" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.ui.menu,name:hr_payroll_holidays.menu_work_entry_leave_to_approve +msgid "Time Off to Report" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +msgid "To Defer" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__normal +msgid "To compute in next payslip" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__blocked +msgid "To defer to next payslip" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Validated Time Off to Defer" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "You have some" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/views/hooks.js:0 +msgid "You have some to defer to the next month." +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "time off" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "to defer to the next month." +msgstr "" diff --git a/addons_extensions/hr_payroll_holidays/i18n/hr.po b/addons_extensions/hr_payroll_holidays/i18n/hr.po new file mode 100644 index 000000000..e31add99f --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/i18n/hr.po @@ -0,0 +1,260 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_payroll_holidays +# +# Translators: +# Bole , 2024 +# Vladimir Olujić , 2024 +# Milan Tribuson , 2024 +# Kristina Palaš, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-09-25 09:26+0000\n" +"PO-Revision-Date: 2024-09-25 09:44+0000\n" +"Last-Translator: Kristina Palaš, 2024\n" +"Language-Team: Croatian (https://app.transifex.com/odoo/teams/41243/hr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: hr\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "" +"A great way to keep track on employee’s PTOs, sick days, and approval " +"status." +msgstr "" +"Izvandredan način za praćenje plaćenih odsustava zaposlenika, dana bolovanja" +" i statusa odsustva." + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_mail_activity +msgid "Activity" +msgstr "Aktivnost" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_company +msgid "Companies" +msgstr "Tvrtke" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__done +msgid "Computed in current payslip" +msgstr "Obračunato u aktualnoj isplatnoj listi" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_config_settings +msgid "Config Settings" +msgstr "Konfiguracijske postavke" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_report_to_next_month +msgid "Defer to Next Month" +msgstr "Odgodi za sljedeći mjesec" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Deferred Time Off" +msgstr "Odgođeno odsustvo" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_company__deferred_time_off_manager +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_config_settings__deferred_time_off_manager +msgid "Deferred Time Off Manager" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.view_hr_leave_allocation_inherit_filter +msgid "Employee Code" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_contract +msgid "Employee Contract" +msgstr "Ugovor djelatnika" + +#. module: hr_payroll_holidays +#: model:mail.activity.type,name:hr_payroll_holidays.mail_activity_data_hr_leave_to_defer +msgid "Leave to Defer" +msgstr "Ostaviti za odgodu" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_mark_as_reported +msgid "Mark as deferred" +msgstr "Označi kao odgođeno" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "Meet the time off dashboard." +msgstr "Upoznajte se s nadzornom pločom odsustava." + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"Not enough attendance work entries to report the time off %s. Please make " +"the operation manually" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Only an employee time off to defer can be reported to next month" +msgstr "" +"Samo odsustvo zaposlenika koje je odgođeno može se prijaviti za sljedeći " +"mjesec" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_payslip +msgid "Pay Slip" +msgstr "Obračunski list" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_hr_leave__payslip_state +msgid "Payslip State" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Please create manually the work entry for %s" +msgstr "Molimo kreirajte odsustvo ručno za %s" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Postpone time off after payslip validation" +msgstr "Odgodite odsustvo nakon provjere isplatne liste" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_form_inherit +msgid "Report to Next Month" +msgstr "Izvijestiti sljedeći mjesec" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Responsible" +msgstr "Odgovoran" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The next month work entries are not generated yet or are validated already " +"for time off %s" +msgstr "" +"Prisutnosti i odsustva zaposlenika za sljedeći mjesec još nisu generirana " +"ili su odsustva već odobrena%s" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The pay of the month is already validated with this day included. If you " +"need to adapt, please refer to HR." +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The time off %s can not be reported because it is defined over more than 2 " +"months" +msgstr "Odsustvo %s se ne može prijaviti jer se definira na više od 2 mjeseca" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "There is no work entries linked to this time off to report" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_payslip.py:0 +msgid "" +"There is some remaining time off to defer for these employees: \n" +"\n" +" %s" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_work_entry_action +#: model:ir.model,name:hr_payroll_holidays.model_hr_leave +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Time Off" +msgstr "Odsustva" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_allocation +msgid "Time Off Not Related To An Allocation" +msgstr "" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_to_defer +msgid "Time Off To Defer" +msgstr "Odsustvo za odgodu" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_document +msgid "Time Off Without Joined Document" +msgstr "Odsustvo bez pridruženog dokumenta" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_action_open_to_defer +msgid "Time Off to Defer" +msgstr "Time Off To Defer" + +#. module: hr_payroll_holidays +#: model:ir.ui.menu,name:hr_payroll_holidays.menu_work_entry_leave_to_approve +msgid "Time Off to Report" +msgstr "Odsustava za prijaviti" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +msgid "To Defer" +msgstr "Odgoditi" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__normal +msgid "To compute in next payslip" +msgstr "Za obračun u sljedećoj isplatnoj listi" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__blocked +msgid "To defer to next payslip" +msgstr "Za odgodu do sljedeće isplatne liste" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Validated Time Off to Defer" +msgstr "Odobreno odsustvo za odgodu" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "You have some" +msgstr "Imate neka" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/views/hooks.js:0 +msgid "You have some to defer to the next month." +msgstr "" +"Imate koje možete odgoditi za sljedeći mjesec." + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "time off" +msgstr "Odsustvo" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "to defer to the next month." +msgstr "odgoditi za sljedeći mjesec" diff --git a/addons_extensions/hr_payroll_holidays/i18n/hr_payroll_holidays.pot b/addons_extensions/hr_payroll_holidays/i18n/hr_payroll_holidays.pot new file mode 100644 index 000000000..69c4372c9 --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/i18n/hr_payroll_holidays.pot @@ -0,0 +1,246 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_payroll_holidays +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-09-25 09:26+0000\n" +"PO-Revision-Date: 2024-09-25 09:26+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: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "" +"A great way to keep track on employee’s PTOs, sick days, and approval " +"status." +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_mail_activity +msgid "Activity" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_company +msgid "Companies" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__done +msgid "Computed in current payslip" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_report_to_next_month +msgid "Defer to Next Month" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Deferred Time Off" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_company__deferred_time_off_manager +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_config_settings__deferred_time_off_manager +msgid "Deferred Time Off Manager" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.view_hr_leave_allocation_inherit_filter +msgid "Employee Code" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_contract +msgid "Employee Contract" +msgstr "" + +#. module: hr_payroll_holidays +#: model:mail.activity.type,name:hr_payroll_holidays.mail_activity_data_hr_leave_to_defer +msgid "Leave to Defer" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_mark_as_reported +msgid "Mark as deferred" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "Meet the time off dashboard." +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"Not enough attendance work entries to report the time off %s. Please make " +"the operation manually" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Only an employee time off to defer can be reported to next month" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_payslip +msgid "Pay Slip" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_hr_leave__payslip_state +msgid "Payslip State" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Please create manually the work entry for %s" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Postpone time off after payslip validation" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_form_inherit +msgid "Report to Next Month" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Responsible" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The next month work entries are not generated yet or are validated already " +"for time off %s" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The pay of the month is already validated with this day included. If you " +"need to adapt, please refer to HR." +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The time off %s can not be reported because it is defined over more than 2 " +"months" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "There is no work entries linked to this time off to report" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_payslip.py:0 +msgid "" +"There is some remaining time off to defer for these employees: \n" +"\n" +" %s" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_work_entry_action +#: model:ir.model,name:hr_payroll_holidays.model_hr_leave +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Time Off" +msgstr "" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_allocation +msgid "Time Off Not Related To An Allocation" +msgstr "" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_to_defer +msgid "Time Off To Defer" +msgstr "" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_document +msgid "Time Off Without Joined Document" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_action_open_to_defer +msgid "Time Off to Defer" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.ui.menu,name:hr_payroll_holidays.menu_work_entry_leave_to_approve +msgid "Time Off to Report" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +msgid "To Defer" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__normal +msgid "To compute in next payslip" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__blocked +msgid "To defer to next payslip" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Validated Time Off to Defer" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "You have some" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/views/hooks.js:0 +msgid "You have some to defer to the next month." +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "time off" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "to defer to the next month." +msgstr "" diff --git a/addons_extensions/hr_payroll_holidays/i18n/id.po b/addons_extensions/hr_payroll_holidays/i18n/id.po new file mode 100644 index 000000000..84b708681 --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/i18n/id.po @@ -0,0 +1,264 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_payroll_holidays +# +# Translators: +# Wil Odoo, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-09-25 09:26+0000\n" +"PO-Revision-Date: 2024-09-25 09:44+0000\n" +"Last-Translator: Wil Odoo, 2024\n" +"Language-Team: Indonesian (https://app.transifex.com/odoo/teams/41243/id/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: id\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "" +"A great way to keep track on employee’s PTOs, sick days, and approval " +"status." +msgstr "" +"Cara bagus untuk melacak Cuti, hari sakit, dan status persetujuan karyawan." + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_mail_activity +msgid "Activity" +msgstr "Aktivitas" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_company +msgid "Companies" +msgstr "Perusahaan" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__done +msgid "Computed in current payslip" +msgstr "Dihitung di payslip saat ini" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_config_settings +msgid "Config Settings" +msgstr "Pengaturan Konfigurasi" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_report_to_next_month +msgid "Defer to Next Month" +msgstr "Tunda ke Bulan Depan" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Deferred Time Off" +msgstr "Cuti Ditunda" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_company__deferred_time_off_manager +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_config_settings__deferred_time_off_manager +msgid "Deferred Time Off Manager" +msgstr "Manajer Cuti Ditunda" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.view_hr_leave_allocation_inherit_filter +msgid "Employee Code" +msgstr "Kode Karyawan" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_contract +msgid "Employee Contract" +msgstr "Kontrak Karyawan" + +#. module: hr_payroll_holidays +#: model:mail.activity.type,name:hr_payroll_holidays.mail_activity_data_hr_leave_to_defer +msgid "Leave to Defer" +msgstr "Cuti untuk Ditunda" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_mark_as_reported +msgid "Mark as deferred" +msgstr "Tandai sebagai ditunda" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "Meet the time off dashboard." +msgstr "Silakan liat dashboard cuti." + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"Not enough attendance work entries to report the time off %s. Please make " +"the operation manually" +msgstr "" +"Tidak ada entri kerja absensi yang mencukupi untuk melaporkan cuti %s. Mohon" +" lakukan opearsi secara manual" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Only an employee time off to defer can be reported to next month" +msgstr "" +"Hanya cuti karyawan yang ditunda yang dapat dilaporkan ke bulan berikutnya" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_payslip +msgid "Pay Slip" +msgstr "Slip Gaji" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_hr_leave__payslip_state +msgid "Payslip State" +msgstr "Status Payslip" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Please create manually the work entry for %s" +msgstr "Mohon buat secara manual entri kerja untuk %s" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Postpone time off after payslip validation" +msgstr "Tunda cuti setelah validasi payslip" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_form_inherit +msgid "Report to Next Month" +msgstr "Laporkan ke Bulan Berikutnya" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Responsible" +msgstr "Penanggung Jawab" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The next month work entries are not generated yet or are validated already " +"for time off %s" +msgstr "" +"Entri kerja bulan berikutnya belum dibuat atau belum divalidasi untuk cuti " +"%s" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The pay of the month is already validated with this day included. If you " +"need to adapt, please refer to HR." +msgstr "" +"Gaji bulan ini sudah divalidasi termasuk dengan hari ini. Bila Anda perlu " +"adaptasi, silakan hubungi HR." + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The time off %s can not be reported because it is defined over more than 2 " +"months" +msgstr "" +"Cuti %s tidak dapat dilaporkan karena didefinisikan untuk lebih dari 2 bulan" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "There is no work entries linked to this time off to report" +msgstr "Tidak ada entri kerja yang dihubungkan ke cuti ini untuk dilaporkan" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_payslip.py:0 +msgid "" +"There is some remaining time off to defer for these employees: \n" +"\n" +" %s" +msgstr "" +"Terdapat beberapa cuti tersisa untuk ditunda untuk karyawan berikut: \n" +"\n" +" %s" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_work_entry_action +#: model:ir.model,name:hr_payroll_holidays.model_hr_leave +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Time Off" +msgstr "Cuti" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_allocation +msgid "Time Off Not Related To An Allocation" +msgstr " Cuti Tidak Terkait Alokasi" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_to_defer +msgid "Time Off To Defer" +msgstr "Cuti Untuk Ditunda" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_document +msgid "Time Off Without Joined Document" +msgstr "Cuti Tanpa Dokumen yang Digabung" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_action_open_to_defer +msgid "Time Off to Defer" +msgstr "Cuti untuk Ditunda" + +#. module: hr_payroll_holidays +#: model:ir.ui.menu,name:hr_payroll_holidays.menu_work_entry_leave_to_approve +msgid "Time Off to Report" +msgstr "Cuti untuk Dilaporkan" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +msgid "To Defer" +msgstr "Untuk Ditunda" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__normal +msgid "To compute in next payslip" +msgstr "Untuk dihitung di payslip berikutnya" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__blocked +msgid "To defer to next payslip" +msgstr "Untuk ditunda ke payslip berikutnya" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Validated Time Off to Defer" +msgstr "Cuti yang Divalidasi untuk Ditunda" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "You have some" +msgstr "Anda memiliki beberapa" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/views/hooks.js:0 +msgid "You have some to defer to the next month." +msgstr "" +"Anda memiliki beberapa hari untuk didefer ke ulan " +"berikutnya." + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "time off" +msgstr "cuti" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "to defer to the next month." +msgstr "untuk ditunda ke bulan berikutnya." diff --git a/addons_extensions/hr_payroll_holidays/i18n/it.po b/addons_extensions/hr_payroll_holidays/i18n/it.po new file mode 100644 index 000000000..50ad234d2 --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/i18n/it.po @@ -0,0 +1,265 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_payroll_holidays +# +# Translators: +# Wil Odoo, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-09-25 09:26+0000\n" +"PO-Revision-Date: 2024-09-25 09:44+0000\n" +"Last-Translator: Wil Odoo, 2024\n" +"Language-Team: Italian (https://app.transifex.com/odoo/teams/41243/it/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: it\n" +"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "" +"A great way to keep track on employee’s PTOs, sick days, and approval " +"status." +msgstr "" +"Un ottimo modo per tenere traccia di aspettative retribuite, giorni di " +"malattia e stato delle approvazioni per i dipendenti." + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_mail_activity +msgid "Activity" +msgstr "Attività" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_company +msgid "Companies" +msgstr "Aziende" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__done +msgid "Computed in current payslip" +msgstr "Calcolato nella busta paga corrente" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_config_settings +msgid "Config Settings" +msgstr "Impostazioni di configurazione" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_report_to_next_month +msgid "Defer to Next Month" +msgstr "Differisci al mese successivo" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Deferred Time Off" +msgstr "Ferie differite" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_company__deferred_time_off_manager +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_config_settings__deferred_time_off_manager +msgid "Deferred Time Off Manager" +msgstr "Manager ferie differite" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.view_hr_leave_allocation_inherit_filter +msgid "Employee Code" +msgstr "Codice dipendente" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_contract +msgid "Employee Contract" +msgstr "Contratto dipendente" + +#. module: hr_payroll_holidays +#: model:mail.activity.type,name:hr_payroll_holidays.mail_activity_data_hr_leave_to_defer +msgid "Leave to Defer" +msgstr "Congedo da differire" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_mark_as_reported +msgid "Mark as deferred" +msgstr "Segna come differito" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "Meet the time off dashboard." +msgstr "Scopri la bacheca ferie." + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"Not enough attendance work entries to report the time off %s. Please make " +"the operation manually" +msgstr "" +"Non ci sono sufficienti voci lavorative sulla frequenza per registrare le " +"ferie %s. Effettua l'operazione manualmente" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Only an employee time off to defer can be reported to next month" +msgstr "È possibile registrare nel mese successivo solo le ferie da differire" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_payslip +msgid "Pay Slip" +msgstr "Busta paga" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_hr_leave__payslip_state +msgid "Payslip State" +msgstr "Stato busta paga" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Please create manually the work entry for %s" +msgstr "Crea manualmente la voce lavorativa per %s" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Postpone time off after payslip validation" +msgstr "Posticipa le ferie dopo la convalida della busta paga" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_form_inherit +msgid "Report to Next Month" +msgstr "Registra al mese successivo" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Responsible" +msgstr "Responsabile" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The next month work entries are not generated yet or are validated already " +"for time off %s" +msgstr "" +"Le voci lavorative del prossimo mese non sono state ancora generate oppure " +"sono state già covalidate per le ferie %s" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The pay of the month is already validated with this day included. If you " +"need to adapt, please refer to HR." +msgstr "" +"Lo stipendio del mese è già stato convalidato e include questo giorno. " +"Contatta le risorse umane in caso di modifiche da apportare." + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The time off %s can not be reported because it is defined over more than 2 " +"months" +msgstr "" +"Le ferie %s non possono essere registrate perché sono state definite su più " +"di due mesi" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "There is no work entries linked to this time off to report" +msgstr "" +"Non è presente alcuna voce lavorativa collegata alle ferie da registrare" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_payslip.py:0 +msgid "" +"There is some remaining time off to defer for these employees: \n" +"\n" +" %s" +msgstr "" +"C'è del tempo libero rimanente da differire per questi dipendenti: \n" +"\n" +"%s" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_work_entry_action +#: model:ir.model,name:hr_payroll_holidays.model_hr_leave +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Time Off" +msgstr "Ferie" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_allocation +msgid "Time Off Not Related To An Allocation" +msgstr "Ferie non correlate ad un'assegnazione" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_to_defer +msgid "Time Off To Defer" +msgstr "Ferie da differire" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_document +msgid "Time Off Without Joined Document" +msgstr "Ferie senza documenti allegati" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_action_open_to_defer +msgid "Time Off to Defer" +msgstr "Ferie da differire" + +#. module: hr_payroll_holidays +#: model:ir.ui.menu,name:hr_payroll_holidays.menu_work_entry_leave_to_approve +msgid "Time Off to Report" +msgstr "Tempo libero da segnalare" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +msgid "To Defer" +msgstr "Da differire" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__normal +msgid "To compute in next payslip" +msgstr "Da calcolare nella prossima busta paga" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__blocked +msgid "To defer to next payslip" +msgstr "Da differire alla prossima busta paga" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Validated Time Off to Defer" +msgstr "Ferie differite convalidate" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "You have some" +msgstr "Hai alcuni" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/views/hooks.js:0 +msgid "You have some to defer to the next month." +msgstr "" +"Hai alcuni da posporre al mese prossimo." + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "time off" +msgstr "time off" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "to defer to the next month." +msgstr "da differire al mese successivo." diff --git a/addons_extensions/hr_payroll_holidays/i18n/ja.po b/addons_extensions/hr_payroll_holidays/i18n/ja.po new file mode 100644 index 000000000..fd7beb93a --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/i18n/ja.po @@ -0,0 +1,254 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_payroll_holidays +# +# Translators: +# Wil Odoo, 2024 +# Junko Augias, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-09-25 09:26+0000\n" +"PO-Revision-Date: 2024-09-25 09:44+0000\n" +"Last-Translator: Junko Augias, 2024\n" +"Language-Team: Japanese (https://app.transifex.com/odoo/teams/41243/ja/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: ja\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "" +"A great way to keep track on employee’s PTOs, sick days, and approval " +"status." +msgstr "従業員のPTO、病欠、および承認ステータスを追跡するための優れた方法。" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_mail_activity +msgid "Activity" +msgstr "活動" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_company +msgid "Companies" +msgstr "会社" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__done +msgid "Computed in current payslip" +msgstr "現在の給与明細で計算済" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_config_settings +msgid "Config Settings" +msgstr "コンフィグ設定" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_report_to_next_month +msgid "Defer to Next Month" +msgstr "来月に繰越" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Deferred Time Off" +msgstr "休暇の繰り延べ" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_company__deferred_time_off_manager +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_config_settings__deferred_time_off_manager +msgid "Deferred Time Off Manager" +msgstr "繰越休暇マネジャー" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.view_hr_leave_allocation_inherit_filter +msgid "Employee Code" +msgstr "従業員コード" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_contract +msgid "Employee Contract" +msgstr "従業員契約" + +#. module: hr_payroll_holidays +#: model:mail.activity.type,name:hr_payroll_holidays.mail_activity_data_hr_leave_to_defer +msgid "Leave to Defer" +msgstr "繰越する休暇" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_mark_as_reported +msgid "Mark as deferred" +msgstr "繰越済にする" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "Meet the time off dashboard." +msgstr "ダッシュボードの休暇をご覧ください。" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"Not enough attendance work entries to report the time off %s. Please make " +"the operation manually" +msgstr "休暇%sを報告するには勤怠作業エントリが不十分です。操作を手動で行って下さい。" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Only an employee time off to defer can be reported to next month" +msgstr "繰越する従業員休暇のみ翌月に持越すことができます" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_payslip +msgid "Pay Slip" +msgstr "給与明細" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_hr_leave__payslip_state +msgid "Payslip State" +msgstr "給与明細ステータス" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Please create manually the work entry for %s" +msgstr " %sの作業エントリを手動で作成して下さい" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Postpone time off after payslip validation" +msgstr "給与明細の確認後、休暇を繰り延べます" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_form_inherit +msgid "Report to Next Month" +msgstr "来月に繰越し" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Responsible" +msgstr "担当者" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The next month work entries are not generated yet or are validated already " +"for time off %s" +msgstr "来月の作業エントリが作成されていないか、休暇%s用に既に検証済です。" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The pay of the month is already validated with this day included. If you " +"need to adapt, please refer to HR." +msgstr "その月の給与は、すでにこの日を含めて検証済です。変更が必要な場合は、人事部に相談して下さい。" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The time off %s can not be reported because it is defined over more than 2 " +"months" +msgstr "休暇 %sは繰越できません、2ヶ月以上に渡り定義されているためです。" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "There is no work entries linked to this time off to report" +msgstr "この休暇に連動した未報告の作業エントリはありません" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_payslip.py:0 +msgid "" +"There is some remaining time off to defer for these employees: \n" +"\n" +" %s" +msgstr "" +"これらの従業員には、繰り延べられる休暇が残っています: \n" +"\n" +" %s" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_work_entry_action +#: model:ir.model,name:hr_payroll_holidays.model_hr_leave +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Time Off" +msgstr "休暇" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_allocation +msgid "Time Off Not Related To An Allocation" +msgstr "割当に関連しない休暇" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_to_defer +msgid "Time Off To Defer" +msgstr "繰越する休暇" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_document +msgid "Time Off Without Joined Document" +msgstr "添付ドキュメントのない休暇" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_action_open_to_defer +msgid "Time Off to Defer" +msgstr "繰越する休暇" + +#. module: hr_payroll_holidays +#: model:ir.ui.menu,name:hr_payroll_holidays.menu_work_entry_leave_to_approve +msgid "Time Off to Report" +msgstr "未報告休暇" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +msgid "To Defer" +msgstr "繰越" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__normal +msgid "To compute in next payslip" +msgstr "次回の給与明細で計算" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__blocked +msgid "To defer to next payslip" +msgstr "次回の給与明細に繰越" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Validated Time Off to Defer" +msgstr "繰越する承認済休暇" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "You have some" +msgstr "いくつかの" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/views/hooks.js:0 +msgid "You have some to defer to the next month." +msgstr "翌月に繰り延べできるがあります。" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "time off" +msgstr "休暇" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "to defer to the next month." +msgstr "。" diff --git a/addons_extensions/hr_payroll_holidays/i18n/ko.po b/addons_extensions/hr_payroll_holidays/i18n/ko.po new file mode 100644 index 000000000..a32671cd3 --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/i18n/ko.po @@ -0,0 +1,253 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_payroll_holidays +# +# Translators: +# Wil Odoo, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-09-25 09:26+0000\n" +"PO-Revision-Date: 2024-09-25 09:44+0000\n" +"Last-Translator: Wil Odoo, 2024\n" +"Language-Team: Korean (https://app.transifex.com/odoo/teams/41243/ko/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: ko\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "" +"A great way to keep track on employee’s PTOs, sick days, and approval " +"status." +msgstr "직원의 연차, 병가, 승인 상태를 추적할 수 있는 좋은 방법입니다." + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_mail_activity +msgid "Activity" +msgstr "활동" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_company +msgid "Companies" +msgstr "회사" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__done +msgid "Computed in current payslip" +msgstr "현재 급여 명세서에서 계산" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_config_settings +msgid "Config Settings" +msgstr "환경 설정" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_report_to_next_month +msgid "Defer to Next Month" +msgstr "다음 달로 연기" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Deferred Time Off" +msgstr "이월 휴가" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_company__deferred_time_off_manager +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_config_settings__deferred_time_off_manager +msgid "Deferred Time Off Manager" +msgstr "이월 휴가 관리자" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.view_hr_leave_allocation_inherit_filter +msgid "Employee Code" +msgstr "직원 코드" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_contract +msgid "Employee Contract" +msgstr "근로 계약서" + +#. module: hr_payroll_holidays +#: model:mail.activity.type,name:hr_payroll_holidays.mail_activity_data_hr_leave_to_defer +msgid "Leave to Defer" +msgstr "휴가 연기하기" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_mark_as_reported +msgid "Mark as deferred" +msgstr "연기됨으로 표시" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "Meet the time off dashboard." +msgstr "휴가 현황판을 만나보세요." + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"Not enough attendance work entries to report the time off %s. Please make " +"the operation manually" +msgstr "휴가 %s를 보고할 수 있는 근태 근로 항목이 충분하지 않습니다. 수동으로 작업을 수행해 주세요." + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Only an employee time off to defer can be reported to next month" +msgstr "휴가를 연기한 직원의 휴가 내역만 다음 달로 보고할 수 있습니다." + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_payslip +msgid "Pay Slip" +msgstr "급여 명세서" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_hr_leave__payslip_state +msgid "Payslip State" +msgstr "급여 명세서 상태" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Please create manually the work entry for %s" +msgstr "%s에 대한 근로 항목을 수동으로 작성하세요" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Postpone time off after payslip validation" +msgstr "급여 명세서 승인 후 휴가를 이월할 수 있습니다." + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_form_inherit +msgid "Report to Next Month" +msgstr "다음 달에 보고" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Responsible" +msgstr "담당자" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The next month work entries are not generated yet or are validated already " +"for time off %s" +msgstr "다음 달의 근로 항목이 아직 생성되지 않았거나 %s휴가가 이미 승인되었습니다" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The pay of the month is already validated with this day included. If you " +"need to adapt, please refer to HR." +msgstr "해당 월의 급여는 이미 이 날짜가 포함된 상태로 승인되었습니다. 추가 조정이 필요한 경우 인사팀에 문의하세요." + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The time off %s can not be reported because it is defined over more than 2 " +"months" +msgstr "휴가 %s가 2개월 이상으로 정의되어 있어 휴가를 올릴 수 없습니다." + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "There is no work entries linked to this time off to report" +msgstr "이 휴가와 관련된 근로 항목이 없어 보고할 수 없습니다" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_payslip.py:0 +msgid "" +"There is some remaining time off to defer for these employees: \n" +"\n" +" %s" +msgstr "" +"해당 직원들에게 아직 남아있는 휴가입니다:\n" +"\n" +" %s" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_work_entry_action +#: model:ir.model,name:hr_payroll_holidays.model_hr_leave +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Time Off" +msgstr "휴가" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_allocation +msgid "Time Off Not Related To An Allocation" +msgstr "휴가와 관련 없는 결근" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_to_defer +msgid "Time Off To Defer" +msgstr "이월할 휴가" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_document +msgid "Time Off Without Joined Document" +msgstr "결재가 이루어지지 않은 휴가" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_action_open_to_defer +msgid "Time Off to Defer" +msgstr "이월할 휴가" + +#. module: hr_payroll_holidays +#: model:ir.ui.menu,name:hr_payroll_holidays.menu_work_entry_leave_to_approve +msgid "Time Off to Report" +msgstr "보고할 휴가" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +msgid "To Defer" +msgstr "이월" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__normal +msgid "To compute in next payslip" +msgstr "다음 급여 명세서에서 계산" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__blocked +msgid "To defer to next payslip" +msgstr "다음 급여 명세서로 이월" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Validated Time Off to Defer" +msgstr "결재된 휴가 이월" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "You have some" +msgstr "몇 가지가" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/views/hooks.js:0 +msgid "You have some to defer to the next month." +msgstr "다음달로 이월할 수 있는 가 있습니다." + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "time off" +msgstr "휴가" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "to defer to the next month." +msgstr "다음 달로 이월할 수 있습니다." diff --git a/addons_extensions/hr_payroll_holidays/i18n/mn.po b/addons_extensions/hr_payroll_holidays/i18n/mn.po new file mode 100644 index 000000000..97d04642d --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/i18n/mn.po @@ -0,0 +1,254 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_payroll_holidays +# +# Translators: +# Baskhuu Lodoikhuu , 2024 +# Martin Trigaux, 2024 +# Uuganbayar Batbaatar , 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-09-25 09:26+0000\n" +"PO-Revision-Date: 2024-09-25 09:44+0000\n" +"Last-Translator: Uuganbayar Batbaatar , 2024\n" +"Language-Team: Mongolian (https://app.transifex.com/odoo/teams/41243/mn/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: mn\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "" +"A great way to keep track on employee’s PTOs, sick days, and approval " +"status." +msgstr "" +"Ажилтныхаа Цалинтай чөлөө, өвчний чөлөө, зөвшөөрлийн төлвийг хянах " +"боломжтой." + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_mail_activity +msgid "Activity" +msgstr "Ажилбар" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_company +msgid "Companies" +msgstr "Компаниуд" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__done +msgid "Computed in current payslip" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_config_settings +msgid "Config Settings" +msgstr "Тохиргооны тохируулга" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_report_to_next_month +msgid "Defer to Next Month" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Deferred Time Off" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_company__deferred_time_off_manager +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_config_settings__deferred_time_off_manager +msgid "Deferred Time Off Manager" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.view_hr_leave_allocation_inherit_filter +msgid "Employee Code" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_contract +msgid "Employee Contract" +msgstr "Ажилтны гэрээ" + +#. module: hr_payroll_holidays +#: model:mail.activity.type,name:hr_payroll_holidays.mail_activity_data_hr_leave_to_defer +msgid "Leave to Defer" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_mark_as_reported +msgid "Mark as deferred" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "Meet the time off dashboard." +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"Not enough attendance work entries to report the time off %s. Please make " +"the operation manually" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Only an employee time off to defer can be reported to next month" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_payslip +msgid "Pay Slip" +msgstr "Цалингийн хуудас" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_hr_leave__payslip_state +msgid "Payslip State" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Please create manually the work entry for %s" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Postpone time off after payslip validation" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_form_inherit +msgid "Report to Next Month" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Responsible" +msgstr "Хариуцагч" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The next month work entries are not generated yet or are validated already " +"for time off %s" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The pay of the month is already validated with this day included. If you " +"need to adapt, please refer to HR." +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The time off %s can not be reported because it is defined over more than 2 " +"months" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "There is no work entries linked to this time off to report" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_payslip.py:0 +msgid "" +"There is some remaining time off to defer for these employees: \n" +"\n" +" %s" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_work_entry_action +#: model:ir.model,name:hr_payroll_holidays.model_hr_leave +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Time Off" +msgstr "Чөлөө" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_allocation +msgid "Time Off Not Related To An Allocation" +msgstr "" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_to_defer +msgid "Time Off To Defer" +msgstr "" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_document +msgid "Time Off Without Joined Document" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_action_open_to_defer +msgid "Time Off to Defer" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.ui.menu,name:hr_payroll_holidays.menu_work_entry_leave_to_approve +msgid "Time Off to Report" +msgstr "Чөлөөг тайлагнах" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +msgid "To Defer" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__normal +msgid "To compute in next payslip" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__blocked +msgid "To defer to next payslip" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Validated Time Off to Defer" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "You have some" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/views/hooks.js:0 +msgid "You have some to defer to the next month." +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "time off" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "to defer to the next month." +msgstr "" diff --git a/addons_extensions/hr_payroll_holidays/i18n/nl.po b/addons_extensions/hr_payroll_holidays/i18n/nl.po new file mode 100644 index 000000000..79f9cfa2e --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/i18n/nl.po @@ -0,0 +1,267 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_payroll_holidays +# +# Translators: +# Wil Odoo, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-09-25 09:26+0000\n" +"PO-Revision-Date: 2024-09-25 09:44+0000\n" +"Last-Translator: Wil Odoo, 2024\n" +"Language-Team: Dutch (https://app.transifex.com/odoo/teams/41243/nl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: nl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "" +"A great way to keep track on employee’s PTOs, sick days, and approval " +"status." +msgstr "" +"Een geweldige manier om de betaald verlof, ziektedagen en goedkeuringsstatus" +" van werknemers bij te houden." + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_mail_activity +msgid "Activity" +msgstr "Activiteit" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_company +msgid "Companies" +msgstr "Bedrijven" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__done +msgid "Computed in current payslip" +msgstr "Berekend in huidige loonstrook" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_config_settings +msgid "Config Settings" +msgstr "Configuratie instellingen" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_report_to_next_month +msgid "Defer to Next Month" +msgstr "Uitstellen tot volgende maand" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Deferred Time Off" +msgstr "Uitgesteld verlof" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_company__deferred_time_off_manager +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_config_settings__deferred_time_off_manager +msgid "Deferred Time Off Manager" +msgstr "Manager uitgesteld verlof" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.view_hr_leave_allocation_inherit_filter +msgid "Employee Code" +msgstr "Code werknemer" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_contract +msgid "Employee Contract" +msgstr "Arbeidsovereenkomst" + +#. module: hr_payroll_holidays +#: model:mail.activity.type,name:hr_payroll_holidays.mail_activity_data_hr_leave_to_defer +msgid "Leave to Defer" +msgstr "Laat om uit te stellen" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_mark_as_reported +msgid "Mark as deferred" +msgstr "Markeer als uitgesteld" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "Meet the time off dashboard." +msgstr "Maak kennis met het verlof dashboard." + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"Not enough attendance work entries to report the time off %s. Please make " +"the operation manually" +msgstr "" +"Onvoldoende aanwezigheidsregistraties om de verlof %s aan te vragen. Graag " +"de bewerking handmatig uitvoeren:" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Only an employee time off to defer can be reported to next month" +msgstr "" +"Alleen verlof van een werknemer om uit te stellen kan worden gerapporteerd " +"naar de volgende maand" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_payslip +msgid "Pay Slip" +msgstr "Loonstrook" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_hr_leave__payslip_state +msgid "Payslip State" +msgstr "Status loonstrook" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Please create manually the work entry for %s" +msgstr "Maak handmatig de werkboeking voor %s" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Postpone time off after payslip validation" +msgstr "Verlof uitstellen na loonstrookbevestiging" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_form_inherit +msgid "Report to Next Month" +msgstr "Rapporteren aan volgende maand" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Responsible" +msgstr "Verantwoordelijke" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The next month work entries are not generated yet or are validated already " +"for time off %s" +msgstr "" +"De werkboekingen van de volgende maand zijn nog niet gegenereerd of zijn al " +"gevalideerd voor verlof %s" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The pay of the month is already validated with this day included. If you " +"need to adapt, please refer to HR." +msgstr "" +"Het maandloon is tot en met vandaag reeds gevalideerd. Neem contact met HR " +"op als je wijzigingen wilt aanbrengen." + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The time off %s can not be reported because it is defined over more than 2 " +"months" +msgstr "" +"De verlofaanvraag %s kan niet worden gerapporteerd omdat deze is " +"gedefinieerd over meer dan 2 maanden" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "There is no work entries linked to this time off to report" +msgstr "Er zijn geen werkboekingen gekoppeld aan deze verlof om te melden" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_payslip.py:0 +msgid "" +"There is some remaining time off to defer for these employees: \n" +"\n" +" %s" +msgstr "" +"Er is nog wat verlof om uit te stellen voor deze werknemers:\n" +"\n" +" %s" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_work_entry_action +#: model:ir.model,name:hr_payroll_holidays.model_hr_leave +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Time Off" +msgstr "Verlof" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_allocation +msgid "Time Off Not Related To An Allocation" +msgstr "Verlof die niet gerelateerd is aan een toewijzing" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_to_defer +msgid "Time Off To Defer" +msgstr "Verlof om uit te stellen" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_document +msgid "Time Off Without Joined Document" +msgstr "Verlof zonder toegevoegd document" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_action_open_to_defer +msgid "Time Off to Defer" +msgstr "Verlof om uit te stellen" + +#. module: hr_payroll_holidays +#: model:ir.ui.menu,name:hr_payroll_holidays.menu_work_entry_leave_to_approve +msgid "Time Off to Report" +msgstr "Verlof te rapporteren" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +msgid "To Defer" +msgstr "Uit te stellen" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__normal +msgid "To compute in next payslip" +msgstr "Om te berekenen in de volgende loonstrook" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__blocked +msgid "To defer to next payslip" +msgstr "Uitstellen tot volgende loonstrook" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Validated Time Off to Defer" +msgstr "Bevestigd verlof om uit te stellen" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "You have some" +msgstr "Je hebt sommige" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/views/hooks.js:0 +msgid "You have some to defer to the next month." +msgstr "" +"Je hebt wat om uit te stellen naar de volgende " +"maand." + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "time off" +msgstr "verlof" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "to defer to the next month." +msgstr "uitstellen naar de volgende maand." diff --git a/addons_extensions/hr_payroll_holidays/i18n/pl.po b/addons_extensions/hr_payroll_holidays/i18n/pl.po new file mode 100644 index 000000000..140090002 --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/i18n/pl.po @@ -0,0 +1,264 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_payroll_holidays +# +# Translators: +# Wil Odoo, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-09-25 09:26+0000\n" +"PO-Revision-Date: 2024-09-25 09:44+0000\n" +"Last-Translator: Wil Odoo, 2024\n" +"Language-Team: Polish (https://app.transifex.com/odoo/teams/41243/pl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: pl\n" +"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "" +"A great way to keep track on employee’s PTOs, sick days, and approval " +"status." +msgstr "" +"Świetny sposób na śledzenie WOM pracowników, dni chorobowych i statusu " +"zatwierdzenia." + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_mail_activity +msgid "Activity" +msgstr "Czynność" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_company +msgid "Companies" +msgstr "Firmy" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__done +msgid "Computed in current payslip" +msgstr "Naliczone w bieżącym pasku wypłaty" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_config_settings +msgid "Config Settings" +msgstr "Ustawienia konfiguracji" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_report_to_next_month +msgid "Defer to Next Month" +msgstr "Odrocz na następny miesiąc" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Deferred Time Off" +msgstr "Odroczone dni wolne" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_company__deferred_time_off_manager +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_config_settings__deferred_time_off_manager +msgid "Deferred Time Off Manager" +msgstr "Menedżer odroczonych dni wolnych" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.view_hr_leave_allocation_inherit_filter +msgid "Employee Code" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_contract +msgid "Employee Contract" +msgstr "Umowa pracownika" + +#. module: hr_payroll_holidays +#: model:mail.activity.type,name:hr_payroll_holidays.mail_activity_data_hr_leave_to_defer +msgid "Leave to Defer" +msgstr "Pozostaw do odroczenia" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_mark_as_reported +msgid "Mark as deferred" +msgstr "Oznacz jako odroczone" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "Meet the time off dashboard." +msgstr "Poznaj konsolę czasu wolnego." + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"Not enough attendance work entries to report the time off %s. Please make " +"the operation manually" +msgstr "" +"Za mało wpisów pracy dotyczących obecności, aby zgłosić dni wolne %s. " +"Wykonaj operację ręcznie" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Only an employee time off to defer can be reported to next month" +msgstr "" +"Tylko dni wolne pracownika do odroczenia mogą być zgłaszane do następnego " +"miesiąca" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_payslip +msgid "Pay Slip" +msgstr "Pasek wypłaty" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_hr_leave__payslip_state +msgid "Payslip State" +msgstr "Stan paska wypłaty" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Please create manually the work entry for %s" +msgstr "Należy ręcznie utworzyć wpis pracy dla %s" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Postpone time off after payslip validation" +msgstr "Odroczenie dni wolnych po zatwierdzeniu paska wypłaty" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_form_inherit +msgid "Report to Next Month" +msgstr "Raport na następny miesiąc" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Responsible" +msgstr "Odpowiedzialny" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The next month work entries are not generated yet or are validated already " +"for time off %s" +msgstr "" +"Wpisy pracy z następnego miesiąca nie są jeszcze wygenerowane lub są już " +"zatwierdzone dla dni wolnych %s" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The pay of the month is already validated with this day included. If you " +"need to adapt, please refer to HR." +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The time off %s can not be reported because it is defined over more than 2 " +"months" +msgstr "" +"Dni wolne %s nie mogą być raportowane, ponieważ są zdefiniowane na więcej " +"niż 2 miesiące" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "There is no work entries linked to this time off to report" +msgstr "" +"Nie ma żadnych wpisów pracy związanych z tymi dniami wolnymi do zgłoszenia" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_payslip.py:0 +msgid "" +"There is some remaining time off to defer for these employees: \n" +"\n" +" %s" +msgstr "" +"Tym pracownikom pozostało jeszcze trochę dni wolnych do odroczenia: \n" +"\n" +"%s" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_work_entry_action +#: model:ir.model,name:hr_payroll_holidays.model_hr_leave +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Time Off" +msgstr "Dni wolne" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_allocation +msgid "Time Off Not Related To An Allocation" +msgstr "" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_to_defer +msgid "Time Off To Defer" +msgstr "Dni wolne do odroczenia" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_document +msgid "Time Off Without Joined Document" +msgstr "Dni wolne bez dołączonego dokumentu" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_action_open_to_defer +msgid "Time Off to Defer" +msgstr "Dni wolne do odroczenia" + +#. module: hr_payroll_holidays +#: model:ir.ui.menu,name:hr_payroll_holidays.menu_work_entry_leave_to_approve +msgid "Time Off to Report" +msgstr "Dni wolne do zgłoszenia" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +msgid "To Defer" +msgstr "Do odroczenia" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__normal +msgid "To compute in next payslip" +msgstr "Do obliczenia w następnym pasku wypłaty" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__blocked +msgid "To defer to next payslip" +msgstr "Aby odroczyć do następnego paska wypłaty" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Validated Time Off to Defer" +msgstr "Zatwierdzone dni wolne do odroczenia" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "You have some" +msgstr "Masz trochę" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/views/hooks.js:0 +msgid "You have some to defer to the next month." +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "time off" +msgstr "dni wolne" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "to defer to the next month." +msgstr "do odroczenia do następnego miesiąca." diff --git a/addons_extensions/hr_payroll_holidays/i18n/pt_BR.po b/addons_extensions/hr_payroll_holidays/i18n/pt_BR.po new file mode 100644 index 000000000..b770b8c71 --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/i18n/pt_BR.po @@ -0,0 +1,265 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_payroll_holidays +# +# Translators: +# Wil Odoo, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-09-25 09:26+0000\n" +"PO-Revision-Date: 2024-09-25 09:44+0000\n" +"Last-Translator: Wil Odoo, 2024\n" +"Language-Team: Portuguese (Brazil) (https://app.transifex.com/odoo/teams/41243/pt_BR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: pt_BR\n" +"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "" +"A great way to keep track on employee’s PTOs, sick days, and approval " +"status." +msgstr "" +"Uma ótima maneira de acompanhar as folgas remuneradas dos funcionários, " +"atestados médicos e status de aprovação." + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_mail_activity +msgid "Activity" +msgstr "Atividade" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_company +msgid "Companies" +msgstr "Empresas" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__done +msgid "Computed in current payslip" +msgstr "Calculado no holerite atual" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_config_settings +msgid "Config Settings" +msgstr "Configurações" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_report_to_next_month +msgid "Defer to Next Month" +msgstr "Adiar para o próximo mês" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Deferred Time Off" +msgstr "Folga adiada" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_company__deferred_time_off_manager +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_config_settings__deferred_time_off_manager +msgid "Deferred Time Off Manager" +msgstr "Gerente de folga adiada" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.view_hr_leave_allocation_inherit_filter +msgid "Employee Code" +msgstr "Código do funcionário" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_contract +msgid "Employee Contract" +msgstr "Contrato do funcionário" + +#. module: hr_payroll_holidays +#: model:mail.activity.type,name:hr_payroll_holidays.mail_activity_data_hr_leave_to_defer +msgid "Leave to Defer" +msgstr "Folga a ser adiada" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_mark_as_reported +msgid "Mark as deferred" +msgstr "Marcar como adiado" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "Meet the time off dashboard." +msgstr "Conheça o painel do app Folga." + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"Not enough attendance work entries to report the time off %s. Please make " +"the operation manually" +msgstr "" +"Não há registros de trabalho de presença suficientes para relatar a folga " +"%s. Faça a operação manualmente." + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Only an employee time off to defer can be reported to next month" +msgstr "" +"Somente a folga de um funcionário a ser adiada pode ser reportada para o " +"próximo mês" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_payslip +msgid "Pay Slip" +msgstr "Holerite" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_hr_leave__payslip_state +msgid "Payslip State" +msgstr "Status do holerite" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Please create manually the work entry for %s" +msgstr "Crie manualmente o registro de trabalho para %s" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Postpone time off after payslip validation" +msgstr "Adiar a folga após a validação do holerite" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_form_inherit +msgid "Report to Next Month" +msgstr "Relatar no próximo mês" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Responsible" +msgstr "Responsável" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The next month work entries are not generated yet or are validated already " +"for time off %s" +msgstr "" +"Os registros de trabalho do próximo mês ainda não foram gerados ou já foram " +"validados para a folga %s" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The pay of the month is already validated with this day included. If you " +"need to adapt, please refer to HR." +msgstr "" +"O pagamento do mês já está validado com esse dia incluído. Se você precisar " +"fazer alguma adaptação, consulte o RH." + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The time off %s can not be reported because it is defined over more than 2 " +"months" +msgstr "" +"A folga %s não pode ser relatada porque está definida em mais de 2 meses" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "There is no work entries linked to this time off to report" +msgstr "Não há registros de trabalho vinculados a essa folga para relatar" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_payslip.py:0 +msgid "" +"There is some remaining time off to defer for these employees: \n" +"\n" +" %s" +msgstr "" +"Há algumas folgas a serem adiadas para esses funcionários: \n" +"\n" +"%s" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_work_entry_action +#: model:ir.model,name:hr_payroll_holidays.model_hr_leave +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Time Off" +msgstr "Folga" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_allocation +msgid "Time Off Not Related To An Allocation" +msgstr "Folga não relacionada a uma alocação" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_to_defer +msgid "Time Off To Defer" +msgstr "Folga a ser adiada" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_document +msgid "Time Off Without Joined Document" +msgstr "Folga sem documento anexado" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_action_open_to_defer +msgid "Time Off to Defer" +msgstr "Folga a ser adiada" + +#. module: hr_payroll_holidays +#: model:ir.ui.menu,name:hr_payroll_holidays.menu_work_entry_leave_to_approve +msgid "Time Off to Report" +msgstr "Folga a ser relatada" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +msgid "To Defer" +msgstr "A adiar" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__normal +msgid "To compute in next payslip" +msgstr "A ser computado no próximo holerite" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__blocked +msgid "To defer to next payslip" +msgstr "A ser adiado para o próximo holerite" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Validated Time Off to Defer" +msgstr "Folga validada a ser adiada" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "You have some" +msgstr "Há" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/views/hooks.js:0 +msgid "You have some to defer to the next month." +msgstr "" +"Você tem algumas para adiar para o próximo mês." + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "time off" +msgstr "folga" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "to defer to the next month." +msgstr "a ser adiada para o próximo mês." diff --git a/addons_extensions/hr_payroll_holidays/i18n/ro.po b/addons_extensions/hr_payroll_holidays/i18n/ro.po new file mode 100644 index 000000000..08aa7be95 --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/i18n/ro.po @@ -0,0 +1,264 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_payroll_holidays +# +# Translators: +# Wil Odoo, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-09-25 09:26+0000\n" +"PO-Revision-Date: 2024-09-25 09:44+0000\n" +"Last-Translator: Wil Odoo, 2024\n" +"Language-Team: Romanian (https://app.transifex.com/odoo/teams/41243/ro/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: ro\n" +"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "" +"A great way to keep track on employee’s PTOs, sick days, and approval " +"status." +msgstr "" +"O modalitate excelentă de a urmări PTO-urile angajaților, zilele de concediu" +" medical și statutul de aprobare." + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_mail_activity +msgid "Activity" +msgstr "Activitate" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_company +msgid "Companies" +msgstr "Companii" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__done +msgid "Computed in current payslip" +msgstr "Calculat în fluturașul de salariu curent" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_config_settings +msgid "Config Settings" +msgstr "Setări de configurare" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_report_to_next_month +msgid "Defer to Next Month" +msgstr "Amânare pentru luna următoare" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Deferred Time Off" +msgstr "Concediu amânat" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_company__deferred_time_off_manager +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_config_settings__deferred_time_off_manager +msgid "Deferred Time Off Manager" +msgstr "Manager concediu amânat" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.view_hr_leave_allocation_inherit_filter +msgid "Employee Code" +msgstr "Cod angajat" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_contract +msgid "Employee Contract" +msgstr "Contract angajat" + +#. module: hr_payroll_holidays +#: model:mail.activity.type,name:hr_payroll_holidays.mail_activity_data_hr_leave_to_defer +msgid "Leave to Defer" +msgstr "Autorizare pentru amânare" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_mark_as_reported +msgid "Mark as deferred" +msgstr "Marcați ca amânat" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "Meet the time off dashboard." +msgstr "Vizualizare timp liber de pe tabloul de bord." + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"Not enough attendance work entries to report the time off %s. Please make " +"the operation manually" +msgstr "" +"Nu există suficiente înregistrări de prezență la muncă pentru a raporta " +"timpul liber %s. Vă rugăm să efectuați operațiunea manual" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Only an employee time off to defer can be reported to next month" +msgstr "" +"Doar timpul liber de amânat al unui singur angajat poate fi raportat la luna" +" următoare" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_payslip +msgid "Pay Slip" +msgstr "Fluturas de salariu" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_hr_leave__payslip_state +msgid "Payslip State" +msgstr "Stare fluturaș de salariu" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Please create manually the work entry for %s" +msgstr "Vă rugăm să creați manual intrarea de lucru pentru %s" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Postpone time off after payslip validation" +msgstr "Amânați concediul după validarea fluturașului de salariu" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_form_inherit +msgid "Report to Next Month" +msgstr "Raportați luna viitoare" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Responsible" +msgstr "Responsabil" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The next month work entries are not generated yet or are validated already " +"for time off %s" +msgstr "" +"Înrtrările de lucru pentru luna următoare nu sunt încă generate sau sunt " +"deja validate pentru concediu %s" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The pay of the month is already validated with this day included. If you " +"need to adapt, please refer to HR." +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The time off %s can not be reported because it is defined over more than 2 " +"months" +msgstr "" +"Concediul %s nu poate fi raportat deoarece este definit peste mai mult de 2 " +"luni" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "There is no work entries linked to this time off to report" +msgstr "" +"Nu există intrări de muncă asociate acestui concediu care să fie raportate" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_payslip.py:0 +msgid "" +"There is some remaining time off to defer for these employees: \n" +"\n" +" %s" +msgstr "" +"Mai există concediu de amânat pentru acești angajați: \n" +"\n" +" %s" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_work_entry_action +#: model:ir.model,name:hr_payroll_holidays.model_hr_leave +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Time Off" +msgstr "Concediu" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_allocation +msgid "Time Off Not Related To An Allocation" +msgstr "Timpul liber nu are legătură cu o alocare" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_to_defer +msgid "Time Off To Defer" +msgstr "Concediu de amânat" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_document +msgid "Time Off Without Joined Document" +msgstr "Concediu fără document asociat" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_action_open_to_defer +msgid "Time Off to Defer" +msgstr "Concediu de amânat" + +#. module: hr_payroll_holidays +#: model:ir.ui.menu,name:hr_payroll_holidays.menu_work_entry_leave_to_approve +msgid "Time Off to Report" +msgstr "Concediu de Raportat" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +msgid "To Defer" +msgstr "De amânat" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__normal +msgid "To compute in next payslip" +msgstr "De calculat în următorul fluturaș de salariu" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__blocked +msgid "To defer to next payslip" +msgstr "De amânat în următorul fluturaș de salariu" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Validated Time Off to Defer" +msgstr "Concediu validat pentru amânare" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "You have some" +msgstr "Aveți niște" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/views/hooks.js:0 +msgid "You have some to defer to the next month." +msgstr "Aveți de amânat pentru luna viitoare." + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "time off" +msgstr "Concediu" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "to defer to the next month." +msgstr "de amânat pentru luna viitoare." diff --git a/addons_extensions/hr_payroll_holidays/i18n/ru.po b/addons_extensions/hr_payroll_holidays/i18n/ru.po new file mode 100644 index 000000000..3b3eb692f --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/i18n/ru.po @@ -0,0 +1,224 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_payroll_holidays +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-02-12 10:55+0000\n" +"PO-Revision-Date: 2024-01-30 15:14+0400\n" +"Last-Translator: \n" +"Language-Team: Russian (https://app.transifex.com/odoo/teams/41243/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "A great way to keep track on employee’s PTOs, sick days, and approval status." +msgstr "Отличный способ отслеживать количество отпускных дней сотрудников, больничных и статуса одобрения." + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_mail_activity +msgid "Activity" +msgstr "Активность" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_company +msgid "Companies" +msgstr "Компании" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__done +msgid "Computed in current payslip" +msgstr "Рассчитано в текущем расчетном листке" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_config_settings +msgid "Config Settings" +msgstr "Параметры конфигурации" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_report_to_next_month +msgid "Defer to Next Month" +msgstr "Перенести на следующий месяц" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Deferred Time Off" +msgstr "Отложенный отпуск" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_company__deferred_time_off_manager +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_config_settings__deferred_time_off_manager +msgid "Deferred Time Off Manager" +msgstr "Менеджер по отложенному отпуску" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.view_hr_leave_allocation_inherit_filter +msgid "Employee Code" +msgstr "Код сотрудника" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_contract +msgid "Employee Contract" +msgstr "Договор с Сотрудником" + +#. module: hr_payroll_holidays +#: model:mail.activity.type,name:hr_payroll_holidays.mail_activity_data_hr_leave_to_defer +msgid "Leave to Defer" +msgstr "Разрешение на отсрочку" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_mark_as_reported +msgid "Mark as deferred" +msgstr "Отметить как отложенный" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "Meet the time off dashboard." +msgstr "Встречайте панель управления отгулами." + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Not enough attendance work entries to report the time off %s. Please make the operation manually" +msgstr "Недостаточно рабочих записей о посещаемости для отчета об отгулах %s. Пожалуйста, выполните операцию вручную" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Only an employee time off to defer can be reported to next month" +msgstr "Только отгул сотрудника может быть перенесен на следующий месяц" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_payslip +msgid "Pay Slip" +msgstr "Платежная ведомость" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_hr_leave__payslip_state +msgid "Payslip State" +msgstr "Состояние платежной ведомости" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Please create manually the work entry for %s" +msgstr "Пожалуйста, создайте вручную рабочую запись для %s" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Postpone time off after payslip validation" +msgstr "Перенос отгулов после проверки платежной ведомости" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_form_inherit +msgid "Report to Next Month" +msgstr "Отчет к следующему месяцу" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Responsible" +msgstr "Ответственный" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "The next month work entries are not generated yet or are validated already for time off %s" +msgstr "Записи о работе в следующем месяце еще не созданы или уже подтверждены для отгулов %s" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "The time off %s can not be reported because it is defined over more than 2 months" +msgstr "Отпуск %s не может быть представлен в отчете, поскольку он определен более чем за 2 месяца" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "There is no work entries linked to this time off to report" +msgstr "Никаких рабочих записей, связанных с этим отгулом, нет" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_payslip.py:0 +msgid "" +"There is some remaining time off to defer for these employees: \n" +"\n" +" %s" +msgstr "" +"У этих сотрудников еще остались отгулы, которые можно отложить:\n" +"\n" +" %s" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_work_entry_action +#: model:ir.model,name:hr_payroll_holidays.model_hr_leave +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Time Off" +msgstr "Отпуск" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_to_defer +msgid "Time Off To Defer" +msgstr "Отгулы для отсрочки" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_document +msgid "Time Off Without Joined Document" +msgstr "Отпуск без предъявления документа" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_action_open_to_defer +msgid "Time Off to Defer" +msgstr "Отгулы для отсрочки" + +#. module: hr_payroll_holidays +#: model:ir.ui.menu,name:hr_payroll_holidays.menu_work_entry_leave_to_approve +msgid "Time Off to Report" +msgstr "Отчет по отсутствиям" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +msgid "To Defer" +msgstr "Отложить" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__normal +msgid "To compute in next payslip" +msgstr "Для расчета в следующем расчетном листке" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__blocked +msgid "To defer to next payslip" +msgstr "Перенести на следующий платежный лист" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Validated Time Off to Defer" +msgstr "Подтвержденный отгул для отсрочки" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "You have some" +msgstr "У вас есть несколько" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "time off" +msgstr "отгул" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "to defer to the next month." +msgstr "перенести на следующий месяц." diff --git a/addons_extensions/hr_payroll_holidays/i18n/sl.po b/addons_extensions/hr_payroll_holidays/i18n/sl.po new file mode 100644 index 000000000..96e9ac0b4 --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/i18n/sl.po @@ -0,0 +1,250 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_payroll_holidays +# +# Translators: +# Wil Odoo, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-09-25 09:26+0000\n" +"PO-Revision-Date: 2024-09-25 09:44+0000\n" +"Last-Translator: Wil Odoo, 2024\n" +"Language-Team: Slovenian (https://app.transifex.com/odoo/teams/41243/sl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: sl\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "" +"A great way to keep track on employee’s PTOs, sick days, and approval " +"status." +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_mail_activity +msgid "Activity" +msgstr "Aktivnost" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_company +msgid "Companies" +msgstr "Podjetja" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__done +msgid "Computed in current payslip" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_config_settings +msgid "Config Settings" +msgstr "Uredi nastavitve" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_report_to_next_month +msgid "Defer to Next Month" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Deferred Time Off" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_company__deferred_time_off_manager +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_config_settings__deferred_time_off_manager +msgid "Deferred Time Off Manager" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.view_hr_leave_allocation_inherit_filter +msgid "Employee Code" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_contract +msgid "Employee Contract" +msgstr "Kadrovska pogodba" + +#. module: hr_payroll_holidays +#: model:mail.activity.type,name:hr_payroll_holidays.mail_activity_data_hr_leave_to_defer +msgid "Leave to Defer" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_mark_as_reported +msgid "Mark as deferred" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "Meet the time off dashboard." +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"Not enough attendance work entries to report the time off %s. Please make " +"the operation manually" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Only an employee time off to defer can be reported to next month" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_payslip +msgid "Pay Slip" +msgstr "Pay Slip" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_hr_leave__payslip_state +msgid "Payslip State" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Please create manually the work entry for %s" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Postpone time off after payslip validation" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_form_inherit +msgid "Report to Next Month" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Responsible" +msgstr "Odgovoren" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The next month work entries are not generated yet or are validated already " +"for time off %s" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The pay of the month is already validated with this day included. If you " +"need to adapt, please refer to HR." +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The time off %s can not be reported because it is defined over more than 2 " +"months" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "There is no work entries linked to this time off to report" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_payslip.py:0 +msgid "" +"There is some remaining time off to defer for these employees: \n" +"\n" +" %s" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_work_entry_action +#: model:ir.model,name:hr_payroll_holidays.model_hr_leave +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Time Off" +msgstr "Odsotnost" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_allocation +msgid "Time Off Not Related To An Allocation" +msgstr "" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_to_defer +msgid "Time Off To Defer" +msgstr "" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_document +msgid "Time Off Without Joined Document" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_action_open_to_defer +msgid "Time Off to Defer" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.ui.menu,name:hr_payroll_holidays.menu_work_entry_leave_to_approve +msgid "Time Off to Report" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +msgid "To Defer" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__normal +msgid "To compute in next payslip" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__blocked +msgid "To defer to next payslip" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Validated Time Off to Defer" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "You have some" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/views/hooks.js:0 +msgid "You have some to defer to the next month." +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "time off" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "to defer to the next month." +msgstr "" diff --git a/addons_extensions/hr_payroll_holidays/i18n/sv.po b/addons_extensions/hr_payroll_holidays/i18n/sv.po new file mode 100644 index 000000000..5aae30e21 --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/i18n/sv.po @@ -0,0 +1,256 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_payroll_holidays +# +# Translators: +# Lasse L, 2024 +# Jakob Krabbe , 2024 +# Chrille Hedberg , 2024 +# Anders Wallenquist , 2024 +# Martin Trigaux, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-09-25 09:26+0000\n" +"PO-Revision-Date: 2024-09-25 09:44+0000\n" +"Last-Translator: Martin Trigaux, 2024\n" +"Language-Team: Swedish (https://app.transifex.com/odoo/teams/41243/sv/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: sv\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "" +"A great way to keep track on employee’s PTOs, sick days, and approval " +"status." +msgstr "" +"Ett bra sätt att hålla koll på medarbetarnas PTO, sjukdagar och " +"godkännandestatus." + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_mail_activity +msgid "Activity" +msgstr "Verksamhet" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_company +msgid "Companies" +msgstr "Företag" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__done +msgid "Computed in current payslip" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_config_settings +msgid "Config Settings" +msgstr "Inställningar" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_report_to_next_month +msgid "Defer to Next Month" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Deferred Time Off" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_company__deferred_time_off_manager +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_config_settings__deferred_time_off_manager +msgid "Deferred Time Off Manager" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.view_hr_leave_allocation_inherit_filter +msgid "Employee Code" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_contract +msgid "Employee Contract" +msgstr "Anställningsavtal" + +#. module: hr_payroll_holidays +#: model:mail.activity.type,name:hr_payroll_holidays.mail_activity_data_hr_leave_to_defer +msgid "Leave to Defer" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_mark_as_reported +msgid "Mark as deferred" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "Meet the time off dashboard." +msgstr "Här är anslagstavlan för ledighet." + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"Not enough attendance work entries to report the time off %s. Please make " +"the operation manually" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Only an employee time off to defer can be reported to next month" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_payslip +msgid "Pay Slip" +msgstr "Lönebesked" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_hr_leave__payslip_state +msgid "Payslip State" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Please create manually the work entry for %s" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Postpone time off after payslip validation" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_form_inherit +msgid "Report to Next Month" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Responsible" +msgstr "Ansvarig" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The next month work entries are not generated yet or are validated already " +"for time off %s" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The pay of the month is already validated with this day included. If you " +"need to adapt, please refer to HR." +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The time off %s can not be reported because it is defined over more than 2 " +"months" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "There is no work entries linked to this time off to report" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_payslip.py:0 +msgid "" +"There is some remaining time off to defer for these employees: \n" +"\n" +" %s" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_work_entry_action +#: model:ir.model,name:hr_payroll_holidays.model_hr_leave +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Time Off" +msgstr "Frånvaro" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_allocation +msgid "Time Off Not Related To An Allocation" +msgstr "" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_to_defer +msgid "Time Off To Defer" +msgstr "" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_document +msgid "Time Off Without Joined Document" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_action_open_to_defer +msgid "Time Off to Defer" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.ui.menu,name:hr_payroll_holidays.menu_work_entry_leave_to_approve +msgid "Time Off to Report" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +msgid "To Defer" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__normal +msgid "To compute in next payslip" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__blocked +msgid "To defer to next payslip" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Validated Time Off to Defer" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "You have some" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/views/hooks.js:0 +msgid "You have some to defer to the next month." +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "time off" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "to defer to the next month." +msgstr "" diff --git a/addons_extensions/hr_payroll_holidays/i18n/th.po b/addons_extensions/hr_payroll_holidays/i18n/th.po new file mode 100644 index 000000000..6b2f3fd36 --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/i18n/th.po @@ -0,0 +1,259 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_payroll_holidays +# +# Translators: +# Wil Odoo, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-09-25 09:26+0000\n" +"PO-Revision-Date: 2024-09-25 09:44+0000\n" +"Last-Translator: Wil Odoo, 2024\n" +"Language-Team: Thai (https://app.transifex.com/odoo/teams/41243/th/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: th\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "" +"A great way to keep track on employee’s PTOs, sick days, and approval " +"status." +msgstr "" +"วิธีที่ยอดเยี่ยมในการติดตาม PTO ของพนักงาน วันลาป่วย และสถานะการอนุมัติ" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_mail_activity +msgid "Activity" +msgstr "กิจกรรม" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_company +msgid "Companies" +msgstr "บริษัท" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__done +msgid "Computed in current payslip" +msgstr "คำนวณในสลิปเงินเดือนปัจจุบัน" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_config_settings +msgid "Config Settings" +msgstr "ตั้งค่าการกำหนดค่า" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_report_to_next_month +msgid "Defer to Next Month" +msgstr "เลื่อนเป็นเดือนถัดไป" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Deferred Time Off" +msgstr "ชะลอการลา" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_company__deferred_time_off_manager +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_config_settings__deferred_time_off_manager +msgid "Deferred Time Off Manager" +msgstr "ผู้จัดการชะลอการลา" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.view_hr_leave_allocation_inherit_filter +msgid "Employee Code" +msgstr "รหัสพนักงาน" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_contract +msgid "Employee Contract" +msgstr "สัญญาของพนักงาน" + +#. module: hr_payroll_holidays +#: model:mail.activity.type,name:hr_payroll_holidays.mail_activity_data_hr_leave_to_defer +msgid "Leave to Defer" +msgstr "การลาที่ชะลอออกไป" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_mark_as_reported +msgid "Mark as deferred" +msgstr "ทำเครื่องหมายว่าเลื่อนออกไป" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "Meet the time off dashboard." +msgstr "พบกับแดชบอร์ดการลา" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"Not enough attendance work entries to report the time off %s. Please make " +"the operation manually" +msgstr "" +"รายการของงานการเข้างานไม่เพียงพอที่จะรายงานระบบการลา %s " +"โปรดดำเนินการด้วยตนเอง" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Only an employee time off to defer can be reported to next month" +msgstr "" +"สามารถรายงานการลาหยุดเพื่อเลื่อนเวลาของพนักงานออกไปได้เฉพาะเดือนหน้าเท่านั้น" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_payslip +msgid "Pay Slip" +msgstr "สลิปเงินเดือน" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_hr_leave__payslip_state +msgid "Payslip State" +msgstr "สถานะสลิปเงินเดือน" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Please create manually the work entry for %s" +msgstr "โปรดสร้างรายการงานสำหรับ %s ด้วยตนเอง" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Postpone time off after payslip validation" +msgstr "เลื่อนเวลาปิดหลังจากตรวจสอบสลิปเงินเดือนแล้ว" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_form_inherit +msgid "Report to Next Month" +msgstr "รายงานเดือนหน้า" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Responsible" +msgstr "รับผิดชอบ" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The next month work entries are not generated yet or are validated already " +"for time off %s" +msgstr "" +"รายการงานในเดือนถัดไปยังไม่ถูกสร้างขึ้นหรือได้รับการตรวจสอบแล้วสำหรับระบบการลา" +" %s" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The pay of the month is already validated with this day included. If you " +"need to adapt, please refer to HR." +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The time off %s can not be reported because it is defined over more than 2 " +"months" +msgstr "ไม่สามารถรายงานระบบการลา %s ได้ เนื่องจากมีการกำหนดไว้นานกว่า 2 เดือน" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "There is no work entries linked to this time off to report" +msgstr "ไม่มีรายการงานที่เชื่อมโยงกับการหยุดเวลานี้เพื่อรายงาน" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_payslip.py:0 +msgid "" +"There is some remaining time off to defer for these employees: \n" +"\n" +" %s" +msgstr "" +"มีการลาคงเหลือที่จะชะลอออกไปสำหรับพนักงานเหล่านี้:\n" +"\n" +" %s" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_work_entry_action +#: model:ir.model,name:hr_payroll_holidays.model_hr_leave +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Time Off" +msgstr "การลา" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_allocation +msgid "Time Off Not Related To An Allocation" +msgstr "เวลาหยุดไม่เกี่ยวข้องกับการจัดสรร" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_to_defer +msgid "Time Off To Defer" +msgstr "การลาหยุดเพื่อเลื่อนออกไป" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_document +msgid "Time Off Without Joined Document" +msgstr "การลาหยุดโดยไม่มีเอกสารที่เข้าร่วม" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_action_open_to_defer +msgid "Time Off to Defer" +msgstr "การลาที่จะชะลอออกไป" + +#. module: hr_payroll_holidays +#: model:ir.ui.menu,name:hr_payroll_holidays.menu_work_entry_leave_to_approve +msgid "Time Off to Report" +msgstr "รายงานการลา" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +msgid "To Defer" +msgstr "ชะลอออกไป" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__normal +msgid "To compute in next payslip" +msgstr "เพื่อนำไปคำนวณในสลิปเงินเดือนต่อไป" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__blocked +msgid "To defer to next payslip" +msgstr "ชะลอสลิปเงินเดือนต่อไป" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Validated Time Off to Defer" +msgstr "ตรวจสอบการลาเพื่อชะลอ" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "You have some" +msgstr "คุณมี" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/views/hooks.js:0 +msgid "You have some to defer to the next month." +msgstr "คุณมีที่ถูกเลื่อนไปเดือนหน้า" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "time off" +msgstr "การลา" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "to defer to the next month." +msgstr "ชะลอไปเดือนหน้า" diff --git a/addons_extensions/hr_payroll_holidays/i18n/tr.po b/addons_extensions/hr_payroll_holidays/i18n/tr.po new file mode 100644 index 000000000..2afa045e5 --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/i18n/tr.po @@ -0,0 +1,256 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_payroll_holidays +# +# Translators: +# emre oktem, 2024 +# Ozlem Cikrikci , 2024 +# Murat Kaplan , 2024 +# Levent Karakaş , 2024 +# Ertuğrul Güreş , 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-09-25 09:26+0000\n" +"PO-Revision-Date: 2024-09-25 09:44+0000\n" +"Last-Translator: Ertuğrul Güreş , 2024\n" +"Language-Team: Turkish (https://app.transifex.com/odoo/teams/41243/tr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: tr\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "" +"A great way to keep track on employee’s PTOs, sick days, and approval " +"status." +msgstr "" +"Çalışanların ücretli izinlerini, hastalık izinlerini ve onay durumlarını " +"takip etmek için mükemmel bir yöntem." + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_mail_activity +msgid "Activity" +msgstr "Aktivite" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_company +msgid "Companies" +msgstr "Şirketler" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__done +msgid "Computed in current payslip" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_config_settings +msgid "Config Settings" +msgstr "Yapılandırma Ayarları" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_report_to_next_month +msgid "Defer to Next Month" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Deferred Time Off" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_company__deferred_time_off_manager +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_config_settings__deferred_time_off_manager +msgid "Deferred Time Off Manager" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.view_hr_leave_allocation_inherit_filter +msgid "Employee Code" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_contract +msgid "Employee Contract" +msgstr "Personel Sözleşmesi" + +#. module: hr_payroll_holidays +#: model:mail.activity.type,name:hr_payroll_holidays.mail_activity_data_hr_leave_to_defer +msgid "Leave to Defer" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_mark_as_reported +msgid "Mark as deferred" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "Meet the time off dashboard." +msgstr "İzin panosuyla tanışın." + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"Not enough attendance work entries to report the time off %s. Please make " +"the operation manually" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Only an employee time off to defer can be reported to next month" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_payslip +msgid "Pay Slip" +msgstr "Bordro" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_hr_leave__payslip_state +msgid "Payslip State" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Please create manually the work entry for %s" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Postpone time off after payslip validation" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_form_inherit +msgid "Report to Next Month" +msgstr "" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Responsible" +msgstr "Sorumlu" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The next month work entries are not generated yet or are validated already " +"for time off %s" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The pay of the month is already validated with this day included. If you " +"need to adapt, please refer to HR." +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The time off %s can not be reported because it is defined over more than 2 " +"months" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "There is no work entries linked to this time off to report" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_payslip.py:0 +msgid "" +"There is some remaining time off to defer for these employees: \n" +"\n" +" %s" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_work_entry_action +#: model:ir.model,name:hr_payroll_holidays.model_hr_leave +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Time Off" +msgstr "İzin" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_allocation +msgid "Time Off Not Related To An Allocation" +msgstr "" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_to_defer +msgid "Time Off To Defer" +msgstr "" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_document +msgid "Time Off Without Joined Document" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_action_open_to_defer +msgid "Time Off to Defer" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.ui.menu,name:hr_payroll_holidays.menu_work_entry_leave_to_approve +msgid "Time Off to Report" +msgstr "İzin için Rapor" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +msgid "To Defer" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__normal +msgid "To compute in next payslip" +msgstr "" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__blocked +msgid "To defer to next payslip" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Validated Time Off to Defer" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "You have some" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/views/hooks.js:0 +msgid "You have some to defer to the next month." +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "time off" +msgstr "" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "to defer to the next month." +msgstr "" diff --git a/addons_extensions/hr_payroll_holidays/i18n/uk.po b/addons_extensions/hr_payroll_holidays/i18n/uk.po new file mode 100644 index 000000000..c1cebe1a2 --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/i18n/uk.po @@ -0,0 +1,266 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_payroll_holidays +# +# Translators: +# Wil Odoo, 2024 +# Alina Lisnenko , 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-09-25 09:26+0000\n" +"PO-Revision-Date: 2024-09-25 09:44+0000\n" +"Last-Translator: Alina Lisnenko , 2024\n" +"Language-Team: Ukrainian (https://app.transifex.com/odoo/teams/41243/uk/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: uk\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "" +"A great way to keep track on employee’s PTOs, sick days, and approval " +"status." +msgstr "" +"Чудовий спосіб відстежувати ВОМ працівника, дні хвороби та статус " +"затвердження." + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_mail_activity +msgid "Activity" +msgstr "Дія" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_company +msgid "Companies" +msgstr "Компанії" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__done +msgid "Computed in current payslip" +msgstr "Обчислено у поточному розрахунковому листі" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_config_settings +msgid "Config Settings" +msgstr "Налаштування" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_report_to_next_month +msgid "Defer to Next Month" +msgstr "Відкласти на наступний місяць" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Deferred Time Off" +msgstr "Відпустки майбутніх періодів" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_company__deferred_time_off_manager +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_config_settings__deferred_time_off_manager +msgid "Deferred Time Off Manager" +msgstr "Менеджер відпусток майбуніх періодів" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.view_hr_leave_allocation_inherit_filter +msgid "Employee Code" +msgstr "Код співробітника" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_contract +msgid "Employee Contract" +msgstr "Трудовий контракт" + +#. module: hr_payroll_holidays +#: model:mail.activity.type,name:hr_payroll_holidays.mail_activity_data_hr_leave_to_defer +msgid "Leave to Defer" +msgstr "Відпустка на вікладення" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_mark_as_reported +msgid "Mark as deferred" +msgstr "Позначити як відкладений" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "Meet the time off dashboard." +msgstr "Зустрічайте панель приладів відпусток." + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"Not enough attendance work entries to report the time off %s. Please make " +"the operation manually" +msgstr "" +"Недостатньо записів про відвідування, щоб повідомити про відпустку %s. Будь " +"ласка, виконайте операцію вручну" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Only an employee time off to defer can be reported to next month" +msgstr "На наступний місяць можна повідомити лише про відпустку працівника" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_payslip +msgid "Pay Slip" +msgstr "Розрахунковий лист" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_hr_leave__payslip_state +msgid "Payslip State" +msgstr "Статус розрахункового листа" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Please create manually the work entry for %s" +msgstr "Будь ласка, створіть вручну робочий запис для %s" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Postpone time off after payslip validation" +msgstr "Відкласти відпустку після перевірки платіжної квитанції" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_form_inherit +msgid "Report to Next Month" +msgstr "Звіт на наступний місяць" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Responsible" +msgstr "Відповідальний" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The next month work entries are not generated yet or are validated already " +"for time off %s" +msgstr "" +"Робочі записи наступного місяця ще не створені або вже перевірені для " +"відпустки %s" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The pay of the month is already validated with this day included. If you " +"need to adapt, please refer to HR." +msgstr "" +"Заробітна плата за місяць уже підтверджена з урахуванням цього дня. Якщо вам" +" потрібно адаптуватися, зверніться до відділу кадрів." + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The time off %s can not be reported because it is defined over more than 2 " +"months" +msgstr "" +"Відпустка %s не можна повідомити, оскільки воно визначено протягом більше " +"ніж 2 місяці" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "There is no work entries linked to this time off to report" +msgstr "Немає робочих записів, пов’язаних із цим звітом відпустки" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_payslip.py:0 +msgid "" +"There is some remaining time off to defer for these employees: \n" +"\n" +" %s" +msgstr "" +"Для цих працівників залишається деякий час відпустки: \n" +"\n" +" %s" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_work_entry_action +#: model:ir.model,name:hr_payroll_holidays.model_hr_leave +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Time Off" +msgstr "Відпустка" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_allocation +msgid "Time Off Not Related To An Allocation" +msgstr "Відпустка не повʼязана з розподіленням" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_to_defer +msgid "Time Off To Defer" +msgstr "Відпустка для відкладення" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_document +msgid "Time Off Without Joined Document" +msgstr "Відпустка без доданого документу" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_action_open_to_defer +msgid "Time Off to Defer" +msgstr "Відпустка на майбутнє" + +#. module: hr_payroll_holidays +#: model:ir.ui.menu,name:hr_payroll_holidays.menu_work_entry_leave_to_approve +msgid "Time Off to Report" +msgstr "Відпустка до включення у звіт" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +msgid "To Defer" +msgstr "Відкласти" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__normal +msgid "To compute in next payslip" +msgstr "Обчислити у наступному розрахунковому листі " + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__blocked +msgid "To defer to next payslip" +msgstr "Відкласти до наступного розрахункового листа" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Validated Time Off to Defer" +msgstr "Перевірений час відпустки для відкладення" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "You have some" +msgstr "У вас є деякі" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/views/hooks.js:0 +msgid "You have some to defer to the next month." +msgstr "" +"У вас є залишок, що переходить на наступний " +"місяць." + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "time off" +msgstr "відпустка" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "to defer to the next month." +msgstr "відкласти на наступний місяць." diff --git a/addons_extensions/hr_payroll_holidays/i18n/vi.po b/addons_extensions/hr_payroll_holidays/i18n/vi.po new file mode 100644 index 000000000..498f80517 --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/i18n/vi.po @@ -0,0 +1,263 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_payroll_holidays +# +# Translators: +# Wil Odoo, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-09-25 09:26+0000\n" +"PO-Revision-Date: 2024-09-25 09:44+0000\n" +"Last-Translator: Wil Odoo, 2024\n" +"Language-Team: Vietnamese (https://app.transifex.com/odoo/teams/41243/vi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: vi\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "" +"A great way to keep track on employee’s PTOs, sick days, and approval " +"status." +msgstr "" +"Một cách tuyệt vời để theo dõi PTO của nhân viên, ngày ốm và trạng thái phê " +"duyệt." + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_mail_activity +msgid "Activity" +msgstr "Hoạt động" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_company +msgid "Companies" +msgstr "Công ty" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__done +msgid "Computed in current payslip" +msgstr "Đã tính toán trong phiếu lương hiện tại" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_config_settings +msgid "Config Settings" +msgstr "Cài đặt cấu hình" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_report_to_next_month +msgid "Defer to Next Month" +msgstr "Hoãn sang tháng sau" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Deferred Time Off" +msgstr "Nghỉ phép đã hoãn" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_company__deferred_time_off_manager +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_config_settings__deferred_time_off_manager +msgid "Deferred Time Off Manager" +msgstr "Quản lý nghỉ phép đã hoãn" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.view_hr_leave_allocation_inherit_filter +msgid "Employee Code" +msgstr "Mã nhân viên" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_contract +msgid "Employee Contract" +msgstr "Hợp đồng nhân viên" + +#. module: hr_payroll_holidays +#: model:mail.activity.type,name:hr_payroll_holidays.mail_activity_data_hr_leave_to_defer +msgid "Leave to Defer" +msgstr "Ngày phép cần hoãn" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_mark_as_reported +msgid "Mark as deferred" +msgstr "Đánh dấu là hoãn lại" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "Meet the time off dashboard." +msgstr "Đây là trang chủ nghỉ phép." + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"Not enough attendance work entries to report the time off %s. Please make " +"the operation manually" +msgstr "" +"Không đủ công chấm công để báo cáo nghỉ phép %s. Vui lòng thực hiện thao tác" +" thủ công" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Only an employee time off to defer can be reported to next month" +msgstr "" +"Chỉ có nghỉ phép cần hoãn lại của nhân viên mới có thể được báo cáo vào " +"tháng tiếp theo" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_payslip +msgid "Pay Slip" +msgstr "Phiếu lương" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_hr_leave__payslip_state +msgid "Payslip State" +msgstr "Trạng thái phiếu lương" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Please create manually the work entry for %s" +msgstr "Vui lòng tạo công cho %s theo cách thủ công" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Postpone time off after payslip validation" +msgstr "Hoãn nghỉ phép sau khi xác nhận phiếu lương" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_form_inherit +msgid "Report to Next Month" +msgstr "Báo cáo vào tháng sau" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Responsible" +msgstr "Người phụ trách" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The next month work entries are not generated yet or are validated already " +"for time off %s" +msgstr "" +"Công của tháng tiếp theo chưa được tạo hoặc đã được xác nhận cho nghỉ phép " +"%s" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The pay of the month is already validated with this day included. If you " +"need to adapt, please refer to HR." +msgstr "" +"Tiền lương tháng này đã được xác nhận và tính cả ngày này. Nếu bạn cần điều " +"chỉnh, vui lòng liên hệ HR." + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The time off %s can not be reported because it is defined over more than 2 " +"months" +msgstr "Không thể báo cáo nghỉ phép %s vì nó được xác định trong hơn 2 tháng" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "There is no work entries linked to this time off to report" +msgstr "Không có công nào liên kết với đơn nghỉ phép này để báo cáo" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_payslip.py:0 +msgid "" +"There is some remaining time off to defer for these employees: \n" +"\n" +" %s" +msgstr "" +"Có số giờ nghỉ phép cần hoãn cho các nhân viên sau:\n" +"\n" +" %s" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_work_entry_action +#: model:ir.model,name:hr_payroll_holidays.model_hr_leave +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Time Off" +msgstr "Nghỉ phép" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_allocation +msgid "Time Off Not Related To An Allocation" +msgstr "Đơn nghỉ phép không liên kết với phân bổ" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_to_defer +msgid "Time Off To Defer" +msgstr "Nghỉ phép cần hoãn" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_document +msgid "Time Off Without Joined Document" +msgstr "Đơn nghỉ phép không có tài liệu liên quan" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_action_open_to_defer +msgid "Time Off to Defer" +msgstr "Nghỉ phép cần hoãn" + +#. module: hr_payroll_holidays +#: model:ir.ui.menu,name:hr_payroll_holidays.menu_work_entry_leave_to_approve +msgid "Time Off to Report" +msgstr "Nghỉ phép để Báo cáo" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +msgid "To Defer" +msgstr "Cần hoãn" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__normal +msgid "To compute in next payslip" +msgstr "Để tính toán trong phiếu lương tiếp theo" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__blocked +msgid "To defer to next payslip" +msgstr "Để hoãn trong phiếu lương kế tiếp" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Validated Time Off to Defer" +msgstr "Nghỉ phép đã xác nhận cần hoãn" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "You have some" +msgstr "Bạn có một số giờ" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/views/hooks.js:0 +msgid "You have some to defer to the next month." +msgstr "Bạn có một số cần hoãn sang tháng sau." + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "time off" +msgstr "nghỉ phép" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "to defer to the next month." +msgstr "cần hoãn sang tháng sau." diff --git a/addons_extensions/hr_payroll_holidays/i18n/zh_CN.po b/addons_extensions/hr_payroll_holidays/i18n/zh_CN.po new file mode 100644 index 000000000..95ca334b5 --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/i18n/zh_CN.po @@ -0,0 +1,254 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_payroll_holidays +# +# Translators: +# Wil Odoo, 2024 +# Odoo哥 , 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-09-25 09:26+0000\n" +"PO-Revision-Date: 2024-09-25 09:44+0000\n" +"Last-Translator: Odoo哥 , 2024\n" +"Language-Team: Chinese (China) (https://app.transifex.com/odoo/teams/41243/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "" +"A great way to keep track on employee’s PTOs, sick days, and approval " +"status." +msgstr "追踪员工的PTO、病假和批准状态的一个好方法。" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_mail_activity +msgid "Activity" +msgstr "活动" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_company +msgid "Companies" +msgstr "公司" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__done +msgid "Computed in current payslip" +msgstr "按当前工资单计算" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_config_settings +msgid "Config Settings" +msgstr "配置设置" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_report_to_next_month +msgid "Defer to Next Month" +msgstr "推迟到下个月" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Deferred Time Off" +msgstr "延迟休假" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_company__deferred_time_off_manager +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_config_settings__deferred_time_off_manager +msgid "Deferred Time Off Manager" +msgstr "延迟休假管理员" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.view_hr_leave_allocation_inherit_filter +msgid "Employee Code" +msgstr "员工编号" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_contract +msgid "Employee Contract" +msgstr "员工合同" + +#. module: hr_payroll_holidays +#: model:mail.activity.type,name:hr_payroll_holidays.mail_activity_data_hr_leave_to_defer +msgid "Leave to Defer" +msgstr "推迟" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_mark_as_reported +msgid "Mark as deferred" +msgstr "标注为延迟的" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "Meet the time off dashboard." +msgstr "满足休息时间仪表盘的要求。" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"Not enough attendance work entries to report the time off %s. Please make " +"the operation manually" +msgstr "没有足够的考勤工作条目来报告请假时间 %s。请手动操作" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Only an employee time off to defer can be reported to next month" +msgstr "只有员工休假可以推迟到下个月" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_payslip +msgid "Pay Slip" +msgstr "工资单" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_hr_leave__payslip_state +msgid "Payslip State" +msgstr "薪资单状态" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Please create manually the work entry for %s" +msgstr "请手动创建%s的工作记录" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Postpone time off after payslip validation" +msgstr "薪资单验证后推迟休假时间" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_form_inherit +msgid "Report to Next Month" +msgstr "下个月报表" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Responsible" +msgstr "负责人" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The next month work entries are not generated yet or are validated already " +"for time off %s" +msgstr "下个月的工作条目尚未生成,或者已经过验证,以便休假%s" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The pay of the month is already validated with this day included. If you " +"need to adapt, please refer to HR." +msgstr "本月的薪资已经包含此日期进行了审核。如果您需要进行调整,请咨询人力资源部门。" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The time off %s can not be reported because it is defined over more than 2 " +"months" +msgstr "无法报告休假%s,因为它的定义超过2个月" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "There is no work entries linked to this time off to report" +msgstr "没有链接到此时间的工作条目来报告" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_payslip.py:0 +msgid "" +"There is some remaining time off to defer for these employees: \n" +"\n" +" %s" +msgstr "" +"对这些员工来说,还有一些剩余的时间可以推迟。\n" +"\n" +" %s" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_work_entry_action +#: model:ir.model,name:hr_payroll_holidays.model_hr_leave +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Time Off" +msgstr "休假" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_allocation +msgid "Time Off Not Related To An Allocation" +msgstr "与分配无关的休假" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_to_defer +msgid "Time Off To Defer" +msgstr "推迟的休假" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_document +msgid "Time Off Without Joined Document" +msgstr "未加入文档的休假" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_action_open_to_defer +msgid "Time Off to Defer" +msgstr "推迟休假的时间" + +#. module: hr_payroll_holidays +#: model:ir.ui.menu,name:hr_payroll_holidays.menu_work_entry_leave_to_approve +msgid "Time Off to Report" +msgstr "待报告的休假" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +msgid "To Defer" +msgstr "推迟" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__normal +msgid "To compute in next payslip" +msgstr "在下一张工资单中计算" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__blocked +msgid "To defer to next payslip" +msgstr "推迟到下一张工资单" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Validated Time Off to Defer" +msgstr "已验证的延迟休假时间" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "You have some" +msgstr "您有一些" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/views/hooks.js:0 +msgid "You have some to defer to the next month." +msgstr "您有些 可推迟至下月。" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "time off" +msgstr "休息时间" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "to defer to the next month." +msgstr "推迟到下个月。" diff --git a/addons_extensions/hr_payroll_holidays/i18n/zh_TW.po b/addons_extensions/hr_payroll_holidays/i18n/zh_TW.po new file mode 100644 index 000000000..013bc202e --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/i18n/zh_TW.po @@ -0,0 +1,253 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_payroll_holidays +# +# Translators: +# Wil Odoo, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-09-25 09:26+0000\n" +"PO-Revision-Date: 2024-09-25 09:44+0000\n" +"Last-Translator: Wil Odoo, 2024\n" +"Language-Team: Chinese (Taiwan) (https://app.transifex.com/odoo/teams/41243/zh_TW/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: zh_TW\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "" +"A great way to keep track on employee’s PTOs, sick days, and approval " +"status." +msgstr "追踪員工 PTO、病假和批准狀態的方式。" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_mail_activity +msgid "Activity" +msgstr "活動" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_company +msgid "Companies" +msgstr "公司" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__done +msgid "Computed in current payslip" +msgstr "在目前工資單內計算" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_res_config_settings +msgid "Config Settings" +msgstr "配置設定" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_report_to_next_month +msgid "Defer to Next Month" +msgstr "推遲至下月" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Deferred Time Off" +msgstr "延遲休假" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_company__deferred_time_off_manager +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_res_config_settings__deferred_time_off_manager +msgid "Deferred Time Off Manager" +msgstr "延遲休假管理工具" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.view_hr_leave_allocation_inherit_filter +msgid "Employee Code" +msgstr "員工代碼" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_contract +msgid "Employee Contract" +msgstr "員工契約" + +#. module: hr_payroll_holidays +#: model:mail.activity.type,name:hr_payroll_holidays.mail_activity_data_hr_leave_to_defer +msgid "Leave to Defer" +msgstr "要推遲的休假" + +#. module: hr_payroll_holidays +#: model:ir.actions.server,name:hr_payroll_holidays.ir_actions_server_mark_as_reported +msgid "Mark as deferred" +msgstr "標記為已推遲" + +#. module: hr_payroll_holidays +#: model_terms:ir.actions.act_window,help:hr_payroll_holidays.hr_leave_work_entry_action +msgid "Meet the time off dashboard." +msgstr "看看休假Dashboard." + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"Not enough attendance work entries to report the time off %s. Please make " +"the operation manually" +msgstr "沒有足夠的出勤工作記項去報告休假資料: %s。請手動操作" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Only an employee time off to defer can be reported to next month" +msgstr "只限員工的待推遲休假可於下個月報告" + +#. module: hr_payroll_holidays +#: model:ir.model,name:hr_payroll_holidays.model_hr_payslip +msgid "Pay Slip" +msgstr "薪資單" + +#. module: hr_payroll_holidays +#: model:ir.model.fields,field_description:hr_payroll_holidays.field_hr_leave__payslip_state +msgid "Payslip State" +msgstr "工資單狀態" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Please create manually the work entry for %s" +msgstr "請手動建立 %s 的工作記錄" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Postpone time off after payslip validation" +msgstr "驗證工資單後推遲休假" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_form_inherit +msgid "Report to Next Month" +msgstr "下個月報告" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Responsible" +msgstr "負責人" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The next month work entries are not generated yet or are validated already " +"for time off %s" +msgstr "下月的工作記項尚未產生,或已就相關休假 %s 完成驗證" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The pay of the month is already validated with this day included. If you " +"need to adapt, please refer to HR." +msgstr "該月的工資已經驗證,包括這一天。如果需要修改,請聯絡人力資源部門。" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "" +"The time off %s can not be reported because it is defined over more than 2 " +"months" +msgstr "未能報告休假 %s,因它定義的長度超過 2 個月" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "There is no work entries linked to this time off to report" +msgstr "沒有連結至此休假的工作記項可報告" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_payslip.py:0 +msgid "" +"There is some remaining time off to defer for these employees: \n" +"\n" +" %s" +msgstr "" +"以下員工仍有剩餘休假可以推遲:\n" +"\n" +" %s" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_work_entry_action +#: model:ir.model,name:hr_payroll_holidays.model_hr_leave +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.res_config_settings_view_form +msgid "Time Off" +msgstr "休假" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_allocation +msgid "Time Off Not Related To An Allocation" +msgstr "與分配無關的休假" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_to_defer +msgid "Time Off To Defer" +msgstr "待推遲的休假" + +#. module: hr_payroll_holidays +#: model:hr.payroll.dashboard.warning,name:hr_payroll_holidays.hr_payroll_dashboard_warning_leaves_no_document +msgid "Time Off Without Joined Document" +msgstr "未加入相關文檔的休假" + +#. module: hr_payroll_holidays +#: model:ir.actions.act_window,name:hr_payroll_holidays.hr_leave_action_open_to_defer +msgid "Time Off to Defer" +msgstr "待推遲的休假" + +#. module: hr_payroll_holidays +#: model:ir.ui.menu,name:hr_payroll_holidays.menu_work_entry_leave_to_approve +msgid "Time Off to Report" +msgstr "休假報告" + +#. module: hr_payroll_holidays +#: model_terms:ir.ui.view,arch_db:hr_payroll_holidays.hr_leave_view_search +msgid "To Defer" +msgstr "待推遲" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__normal +msgid "To compute in next payslip" +msgstr "待下期工資單計算" + +#. module: hr_payroll_holidays +#: model:ir.model.fields.selection,name:hr_payroll_holidays.selection__hr_leave__payslip_state__blocked +msgid "To defer to next payslip" +msgstr "待推遲至下期工資單" + +#. module: hr_payroll_holidays +#. odoo-python +#: code:addons/hr_payroll_holidays/models/hr_leave.py:0 +msgid "Validated Time Off to Defer" +msgstr "待推遲已驗證休假" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "You have some" +msgstr "你有一些" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/views/hooks.js:0 +msgid "You have some to defer to the next month." +msgstr "你有些 可推遲至下月。" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "time off" +msgstr "休假" + +#. module: hr_payroll_holidays +#. odoo-javascript +#: code:addons/hr_payroll_holidays/static/src/xml/templates.xml:0 +msgid "to defer to the next month." +msgstr "待推遲至下個月。" diff --git a/addons_extensions/hr_payroll_holidays/models/__init__.py b/addons_extensions/hr_payroll_holidays/models/__init__.py new file mode 100644 index 000000000..ad1457ee5 --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/models/__init__.py @@ -0,0 +1,9 @@ +#-*- coding:utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import res_company +from . import hr_contract +from . import hr_leave +from . import res_config_settings +from . import hr_payslip +from . import mail_activity diff --git a/addons_extensions/hr_payroll_holidays/models/hr_contract.py b/addons_extensions/hr_payroll_holidays/models/hr_contract.py new file mode 100644 index 000000000..54405e725 --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/models/hr_contract.py @@ -0,0 +1,9 @@ +from odoo import models + +class HrContract(models.Model): + _inherit = 'hr.contract' + + def _get_resource_calendar_leaves(self, start_dt, end_dt): + # prevent leaves that are associated with a blocked payslip to be taken + # into account, as they will be deferred lated. + return super()._get_resource_calendar_leaves(start_dt, end_dt).filtered(lambda l: l.holiday_id.payslip_state != 'blocked') diff --git a/addons_extensions/hr_payroll_holidays/models/hr_leave.py b/addons_extensions/hr_payroll_holidays/models/hr_leave.py new file mode 100644 index 000000000..842fd0a92 --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/models/hr_leave.py @@ -0,0 +1,150 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from datetime import datetime +from dateutil.relativedelta import relativedelta + +from odoo import api, fields, models, _ +from odoo.fields import Datetime +from odoo.exceptions import UserError +from odoo.tools.float_utils import float_compare + +class HrLeave(models.Model): + _inherit = 'hr.leave' + + payslip_state = fields.Selection([ + ('normal', 'To compute in next payslip'), + ('done', 'Computed in current payslip'), + ('blocked', 'To defer to next payslip')], string='Payslip State', + copy=False, default='normal', required=True, tracking=True) + + def action_validate(self, check_state=True): + # Get employees payslips + all_payslips = self.env['hr.payslip'].sudo().search([ + ('employee_id', 'in', self.mapped('employee_id').ids), + ('state', 'in', ['done', 'paid', 'verify']), + ]).filtered(lambda p: p.is_regular) + done_payslips = all_payslips.filtered(lambda p: p.state in ['done', 'paid']) + waiting_payslips = all_payslips - done_payslips + # Mark Leaves to Defer + for leave in self: + if any( + payslip.employee_id == leave.employee_id \ + and (payslip.date_from <= leave.date_to.date() \ + and payslip.date_to >= leave.date_from.date()) for payslip in done_payslips) \ + and not any(payslip.employee_id == leave.employee_id \ + and (payslip.date_from <= leave.date_to.date() \ + and payslip.date_to >= leave.date_from.date()) for payslip in waiting_payslips): + leave.payslip_state = 'blocked' + res = super().action_validate(check_state=check_state) + self.sudo()._recompute_payslips() + return res + + def action_refuse(self): + res = super().action_refuse() + self.sudo()._recompute_payslips() + return res + + def _action_user_cancel(self, reason): + res = super()._action_user_cancel(reason) + self.sudo()._recompute_payslips() + return res + + def _recompute_payslips(self): + # Recompute draft/waiting payslips + all_payslips = self.env['hr.payslip'].sudo().search([ + ('employee_id', 'in', self.mapped('employee_id').ids), + ('state', 'in', ['draft', 'verify']), + ]).filtered(lambda p: p.is_regular) + draft_payslips = self.env['hr.payslip'] + waiting_payslips = self.env['hr.payslip'] + for leave in self: + for payslip in all_payslips: + if payslip.employee_id == leave.employee_id and (payslip.date_from <= leave.date_to.date() and payslip.date_to >= leave.date_from.date()): + if payslip.state == 'draft': + draft_payslips |= payslip + elif payslip.state == 'verify': + waiting_payslips |= payslip + if draft_payslips: + draft_payslips._compute_worked_days_line_ids() + if waiting_payslips: + waiting_payslips.action_refresh_from_work_entries() + + def _cancel_work_entry_conflict(self): + leaves_to_defer = self.filtered(lambda l: l.payslip_state == 'blocked') + for leave in leaves_to_defer: + leave.activity_schedule( + 'hr_payroll_holidays.mail_activity_data_hr_leave_to_defer', + summary=_('Validated Time Off to Defer'), + note=_('Please create manually the work entry for %s', + leave.employee_id._get_html_link()), + user_id=leave.employee_id.company_id.deferred_time_off_manager.id or self.env.ref('base.user_admin').id) + return super(HrLeave, self - leaves_to_defer)._cancel_work_entry_conflict() + + def activity_feedback(self, act_type_xmlids, user_id=None, feedback=None): + if 'hr_payroll_holidays.mail_activity_data_hr_leave_to_defer' in act_type_xmlids: + self.write({'payslip_state': 'done'}) + return super().activity_feedback(act_type_xmlids, user_id=user_id, feedback=feedback) + + def action_report_to_next_month(self): + for leave in self: + if not leave.employee_id or leave.payslip_state != 'blocked': + raise UserError(_('Only an employee time off to defer can be reported to next month')) + if (leave.date_to.year - leave.date_from.year) * 12 + leave.date_to.month - leave.date_from.month > 1: + raise UserError(_('The time off %s can not be reported because it is defined over more than 2 months', leave.display_name)) + leave_work_entries = self.env['hr.work.entry'].search([ + ('employee_id', '=', leave.employee_id.id), + ('company_id', '=', self.env.company.id), + ('date_start', '>=', leave.date_from), + ('date_stop', '<=', leave.date_to), + ]) + next_month_work_entries = self.env['hr.work.entry'].search([ + ('employee_id', '=', leave.employee_id.id), + ('company_id', '=', self.env.company.id), + ('state', '=', 'draft'), + ('date_start', '>=', Datetime.to_datetime(leave.date_from + relativedelta(day=1, months=1))), + ('date_stop', '<=', datetime.combine(Datetime.to_datetime(leave.date_to + relativedelta(day=31, months=1)), datetime.max.time())) + ]) + if not next_month_work_entries: + raise UserError(_('The next month work entries are not generated yet or are validated already for time off %s', leave.display_name)) + if not leave_work_entries: + raise UserError(_('There is no work entries linked to this time off to report')) + for work_entry in leave_work_entries: + found = False + for next_work_entry in next_month_work_entries: + if next_work_entry.work_entry_type_id.code != "WORK100": + continue + if not float_compare(next_work_entry.duration, work_entry.duration, 2): + next_work_entry.work_entry_type_id = leave.holiday_status_id.work_entry_type_id + found = True + break + if not found: + raise UserError(_('Not enough attendance work entries to report the time off %s. Please make the operation manually', leave.display_name)) + # Should change payslip_state to 'done' at the same time + self.activity_feedback(['hr_payroll_holidays.mail_activity_data_hr_leave_to_defer']) + + def _check_uncovered_by_validated_payslip(self): + payslips = self.env['hr.payslip'].sudo().search([ + ('employee_id', 'in', self.employee_id.ids), + ('date_from', '<=', max(self.mapped('date_to'))), + ('date_to', '>=', min(self.mapped('date_from'))), + ('state', 'in', ['done', 'paid']), + ]) + + for leave in self: + if any( + p.employee_id == leave.employee_id and + p.date_from <= leave.date_to.date() and + p.date_to >= leave.date_from.date() and + p.is_regular + for p in payslips + ): + raise UserError(_("The pay of the month is already validated with this day included. If you need to adapt, please refer to HR.")) + + def write(self, vals): + if vals.get('active') and self._check_uncovered_by_validated_payslip(): + self._check_uncovered_by_validated_payslip() + return super().write(vals) + + @api.ondelete(at_uninstall=False) + def _unlink_if_no_payslip(self): + self._check_uncovered_by_validated_payslip() diff --git a/addons_extensions/hr_payroll_holidays/models/hr_payslip.py b/addons_extensions/hr_payroll_holidays/models/hr_payslip.py new file mode 100644 index 000000000..0a800cbd7 --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/models/hr_payslip.py @@ -0,0 +1,30 @@ +# -*- coding:utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import api, models, _ +from odoo.exceptions import ValidationError +from datetime import datetime + + +class HrPayslip(models.Model): + _inherit = 'hr.payslip' + + def compute_sheet(self): + if self.env.context.get('salary_simulation'): + return super().compute_sheet() + if self.filtered(lambda p: p.is_regular): + employees = self.mapped('employee_id') + leaves = self.env['hr.leave'].search([ + ('employee_id', 'in', employees.ids), + ('state', '!=', 'refuse'), + ]) + leaves_to_defer = leaves.filtered(lambda l: l.payslip_state == 'blocked') + if leaves_to_defer: + raise ValidationError(_( + 'There is some remaining time off to defer for these employees: \n\n %s', + ', '.join(e.display_name for e in leaves_to_defer.mapped('employee_id')))) + dates = self.mapped('date_to') + max_date = datetime.combine(max(dates), datetime.max.time()) + leaves_to_green = leaves.filtered(lambda l: l.payslip_state != 'blocked' and l.date_to <= max_date) + leaves_to_green.write({'payslip_state': 'done'}) + return super().compute_sheet() diff --git a/addons_extensions/hr_payroll_holidays/models/mail_activity.py b/addons_extensions/hr_payroll_holidays/models/mail_activity.py new file mode 100644 index 000000000..3c2a3b4c8 --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/models/mail_activity.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import models + + +class MailActivity(models.Model): + _inherit = 'mail.activity' + + def _action_done(self, feedback=False, attachment_ids=None): + leave_activities = self.filtered(lambda act: act.res_model == 'hr.leave' and act.res_id) + if leave_activities: + type_to_defer_id = self.env['ir.model.data']._xmlid_to_res_id( + 'hr_payroll_holidays.mail_activity_data_hr_leave_to_defer', + raise_if_not_found=False + ) + if type_to_defer_id: + leave_activities = leave_activities.filtered(lambda act: act.activity_type_id.id == type_to_defer_id) + if leave_activities: + self.env['hr.leave'].browse(leave_activities.mapped('res_id')).write({'payslip_state': 'done'}) # done or normal??? to check + return super()._action_done(feedback=feedback, attachment_ids=attachment_ids) diff --git a/addons_extensions/hr_payroll_holidays/models/res_company.py b/addons_extensions/hr_payroll_holidays/models/res_company.py new file mode 100644 index 000000000..cb5c8c745 --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/models/res_company.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import fields, models + + +class ResCompany(models.Model): + _inherit = "res.company" + + deferred_time_off_manager = fields.Many2one('res.users') diff --git a/addons_extensions/hr_payroll_holidays/models/res_config_settings.py b/addons_extensions/hr_payroll_holidays/models/res_config_settings.py new file mode 100644 index 000000000..3035f99fc --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/models/res_config_settings.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# 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' + + deferred_time_off_manager = fields.Many2one('res.users', related='company_id.deferred_time_off_manager', check_company=True, readonly=False) diff --git a/addons_extensions/hr_payroll_holidays/security/hr_payroll_holidays_security.xml b/addons_extensions/hr_payroll_holidays/security/hr_payroll_holidays_security.xml new file mode 100644 index 000000000..05087132e --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/security/hr_payroll_holidays_security.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/addons_extensions/hr_payroll_holidays/static/src/js/hr_payslip_form.js b/addons_extensions/hr_payroll_holidays/static/src/js/hr_payslip_form.js new file mode 100644 index 000000000..c7bbbd76e --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/static/src/js/hr_payslip_form.js @@ -0,0 +1,21 @@ +/** @odoo-module **/ + +import { TimeOffToDeferWarning, useTimeOffToDefer } from "@hr_payroll_holidays/views/hooks"; +import { registry } from "@web/core/registry"; +import { FormController } from "@web/views/form/form_controller"; +import { formView } from "@web/views/form/form_view"; + +export class PayslipFormController extends FormController { + static template = "hr_payroll_holidays.PayslipFormController"; + static components = { ...PayslipFormController.components, TimeOffToDeferWarning }; + + setup() { + super.setup(); + this.timeOff = useTimeOffToDefer(); + } +} + +registry.category("views").add("hr_payslip_form", { + ...formView, + Controller: PayslipFormController, +}); diff --git a/addons_extensions/hr_payroll_holidays/static/src/js/hr_payslip_form.xml b/addons_extensions/hr_payroll_holidays/static/src/js/hr_payslip_form.xml new file mode 100644 index 000000000..97ecd53bd --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/static/src/js/hr_payslip_form.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/addons_extensions/hr_payroll_holidays/static/src/js/hr_payslip_list.js b/addons_extensions/hr_payroll_holidays/static/src/js/hr_payslip_list.js new file mode 100644 index 000000000..6b6263cad --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/static/src/js/hr_payslip_list.js @@ -0,0 +1,22 @@ +/** @odoo-module **/ + +import { TimeOffToDeferWarning, useTimeOffToDefer } from "@hr_payroll_holidays/views/hooks"; +import { registry } from "@web/core/registry"; +import { ListRenderer } from "@web/views/list/list_renderer"; +import { listView } from "@web/views/list/list_view"; + +class PayslipListRenderer extends ListRenderer { + static template = "hr_payroll_holidays.PayslipListRenderer"; + static components = { ...ListRenderer.components, TimeOffToDeferWarning }; + + setup() { + super.setup(); + this.timeOff = useTimeOffToDefer(); + } +} +const PayslipListView = { + ...listView, + Renderer: PayslipListRenderer, +}; + +registry.category("views").add("hr_payroll_payslip_tree", PayslipListView); diff --git a/addons_extensions/hr_payroll_holidays/static/src/js/hr_payslip_list.xml b/addons_extensions/hr_payroll_holidays/static/src/js/hr_payslip_list.xml new file mode 100644 index 000000000..fed0f958c --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/static/src/js/hr_payslip_list.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/addons_extensions/hr_payroll_holidays/static/src/js/hr_work_entries_gantt.js b/addons_extensions/hr_payroll_holidays/static/src/js/hr_work_entries_gantt.js new file mode 100644 index 000000000..a184d3eaa --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/static/src/js/hr_work_entries_gantt.js @@ -0,0 +1,15 @@ +import { patch } from "@web/core/utils/patch"; +import { TimeOffToDeferWarning, useTimeOffToDefer } from "@hr_payroll_holidays/views/hooks"; +import { WorkEntriesGanttController } from '@hr_work_entry_contract_enterprise/work_entries_gantt_controller'; + +patch(WorkEntriesGanttController.prototype, { + setup() { + super.setup(...arguments); + this.timeOff = useTimeOffToDefer(); + } +}); + +patch(WorkEntriesGanttController, { + components: { ...WorkEntriesGanttController.components, TimeOffToDeferWarning }, + template: "hr_payroll_holidays.WorkEntriesGanttController" +}); diff --git a/addons_extensions/hr_payroll_holidays/static/src/js/hr_work_entries_gantt.xml b/addons_extensions/hr_payroll_holidays/static/src/js/hr_work_entries_gantt.xml new file mode 100644 index 000000000..3b4eb6b42 --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/static/src/js/hr_work_entries_gantt.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/addons_extensions/hr_payroll_holidays/static/src/views/hooks.js b/addons_extensions/hr_payroll_holidays/static/src/views/hooks.js new file mode 100644 index 000000000..0c6f563ef --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/static/src/views/hooks.js @@ -0,0 +1,40 @@ +import { Component, onWillStart } from "@odoo/owl"; + +import { _t } from "@web/core/l10n/translation"; +import { user } from "@web/core/user"; +import { useService } from "@web/core/utils/hooks"; + +export class TimeOffToDeferWarning extends Component { + static props = {}; + static template = "hr_payroll_holidays.TimeOffToDeferWarning"; + + setup() { + this.actionService = useService("action"); + } + + /** @returns {string} */ + get timeOffButtonText() { + const [, before, inside, after] = _t( + "You have some to defer to the next month." + ).match(/(.*) to defer to the next month. +

+ + + diff --git a/addons_extensions/hr_payroll_holidays/tests/__init__.py b/addons_extensions/hr_payroll_holidays/tests/__init__.py new file mode 100644 index 000000000..eb01201af --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/tests/__init__.py @@ -0,0 +1,5 @@ +# -*- coding:utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import common +from . import test_timeoff_defer diff --git a/addons_extensions/hr_payroll_holidays/tests/common.py b/addons_extensions/hr_payroll_holidays/tests/common.py new file mode 100644 index 000000000..d9c321a93 --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/tests/common.py @@ -0,0 +1,70 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo.fields import Date +from odoo.tests.common import TransactionCase, new_test_user + +from dateutil.relativedelta import relativedelta + + +class TestPayrollHolidaysBase(TransactionCase): + + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.env.user.company_id.resource_calendar_id.tz = "Europe/Brussels" + cls.env.context = {'tz': 'Europe/Brussels'} + cls.dep_rd = cls.env['hr.department'].create({ + 'name': 'Research & Development - Test', + }) + + # Create employee + cls.vlad = new_test_user(cls.env, login='vlad', groups='base.group_user') + cls.emp = cls.env['hr.employee'].create({ + 'name': 'Donald', + 'gender': 'male', + 'birthday': '1946-06-14', + 'department_id': cls.dep_rd.id, + 'user_id': cls.vlad.id, + }) + + cls.joseph = new_test_user(cls.env, login='joseph', groups='base.group_user,hr_holidays.group_hr_holidays_user') + + cls.structure_type = cls.env['hr.payroll.structure.type'].create({ + 'name': 'Test - Developer', + }) + + # Create his contract + cls.env['hr.contract'].create({ + 'date_end': Date.today() + relativedelta(years=2), + 'date_start': Date.to_date('2018-01-01'), + 'name': 'Contract for Donald', + 'wage': 5000.0, + 'employee_id': cls.emp.id, + 'structure_type_id': cls.structure_type.id, + 'state': 'open', + }) + + cls.work_entry_type_unpaid = cls.env['hr.work.entry.type'].create({ + 'name': 'Unpaid Leave', + 'is_leave': True, + 'code': 'LEAVETEST300', + 'round_days': 'HALF', + 'round_days_type': 'DOWN', + }) + + # Create a salary structure, necessary to compute sheet + cls.developer_pay_structure = cls.env['hr.payroll.structure'].create({ + 'name': 'Salary Structure for Software Developer', + 'type_id': cls.structure_type.id, + 'unpaid_work_entry_type_ids': [(4, cls.work_entry_type_unpaid.id, False)] + }) + cls.structure_type.default_struct_id = cls.developer_pay_structure + + # Create a leave type for our leaves + cls.leave_type = cls.env['hr.leave.type'].create({ + 'name': 'Unpaid leave', + 'work_entry_type_id': cls.work_entry_type_unpaid.id, + 'time_type': 'leave', + 'requires_allocation': 'no', + }) diff --git a/addons_extensions/hr_payroll_holidays/tests/test_timeoff_defer.py b/addons_extensions/hr_payroll_holidays/tests/test_timeoff_defer.py new file mode 100644 index 000000000..e99fd936d --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/tests/test_timeoff_defer.py @@ -0,0 +1,386 @@ +# -*- coding:utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from datetime import date, datetime + +from odoo.exceptions import ValidationError, UserError +from odoo.fields import Datetime +from odoo.tests.common import tagged +from odoo.addons.hr_payroll_holidays.tests.common import TestPayrollHolidaysBase + +from dateutil.relativedelta import relativedelta + + +@tagged('post_install', '-at_install') +class TestTimeoffDefer(TestPayrollHolidaysBase): + + def test_no_defer(self): + #create payslip -> waiting or draft + payslip = self.env['hr.payslip'].create({ + 'name': 'Donald Payslip', + 'employee_id': self.emp.id, + }) + + # Puts the payslip to draft/waiting + payslip.compute_sheet() + + #create a time off for our employee, validating it now should not put it as to_defer + leave = self.env['hr.leave'].create({ + 'name': 'Golf time', + 'holiday_status_id': self.leave_type.id, + 'employee_id': self.emp.id, + 'request_date_from': (date.today() + relativedelta(day=13)), + 'request_date_to': (date.today() + relativedelta(day=16)), + }) + leave.action_approve() + + self.assertNotEqual(leave.payslip_state, 'blocked', 'Leave should not be to defer') + + def test_to_defer(self): + #create payslip + payslip = self.env['hr.payslip'].create({ + 'name': 'Donald Payslip', + 'employee_id': self.emp.id, + }) + + # Puts the payslip to draft/waiting + payslip.compute_sheet() + payslip.action_payslip_done() + + #create a time off for our employee, validating it now should put it as to_defer + leave = self.env['hr.leave'].create({ + 'name': 'Golf time', + 'holiday_status_id': self.leave_type.id, + 'employee_id': self.emp.id, + 'request_date_from': (date.today() + relativedelta(day=13)), + 'request_date_to': (date.today() + relativedelta(day=16)), + }) + leave.action_approve() + self.assertEqual(leave.payslip_state, 'blocked', 'Leave should be to defer') + + def test_multi_payslip_defer(self): + #A leave should only be set to defer if ALL colliding with the time period of the time off are in a done state + # it should not happen if a payslip for that time period is still in a waiting state + + #create payslip -> waiting + waiting_payslip = self.env['hr.payslip'].create({ + 'name': 'Donald Payslip draft', + 'employee_id': self.emp.id, + }) + #payslip -> done + done_payslip = self.env['hr.payslip'].create({ + 'name': 'Donald Payslip done', + 'employee_id': self.emp.id, + }) + + # Puts the waiting payslip to draft/waiting + waiting_payslip.compute_sheet() + # Puts the done payslip to the done state + done_payslip.compute_sheet() + done_payslip.action_payslip_done() + + #create a time off for our employee, validating it now should not put it as to_defer + leave = self.env['hr.leave'].create({ + 'name': 'Golf time', + 'holiday_status_id': self.leave_type.id, + 'employee_id': self.emp.id, + 'request_date_from': (date.today() + relativedelta(day=13)), + 'request_date_to': (date.today() + relativedelta(day=16)), + }) + leave.action_approve() + + self.assertNotEqual(leave.payslip_state, 'blocked', 'Leave should not be to defer') + + def test_payslip_paid_past(self): + payslip = self.env['hr.payslip'].create({ + 'name': 'toto payslip', + 'employee_id': self.emp.id, + 'date_from': '2022-01-01', + 'date_to': '2022-01-31', + }) + + payslip.compute_sheet() + self.assertEqual(payslip.state, 'verify') + + leave_1 = self.env['hr.leave'].with_user(self.vlad).create({ + 'name': 'Tennis', + 'holiday_status_id': self.leave_type.id, + 'employee_id': self.emp.id, + 'request_date_from': '2022-01-12', + 'request_date_to': '2022-01-12', + }) + payslip.action_payslip_done() + self.assertEqual(payslip.state, 'done') + + leave_1.sudo().action_validate() + self.assertEqual(leave_1.payslip_state, 'blocked', 'Leave should be to defer') + + # A Simple User can request a leave if a payslip is paid + leave_2 = self.env['hr.leave'].with_user(self.vlad).create({ + 'name': 'Tennis', + 'holiday_status_id': self.leave_type.id, + 'employee_id': self.emp.id, + 'request_date_from': '2022-01-19', + 'request_date_to': '2022-01-19', + }) + leave_2.sudo().action_validate() + self.assertEqual(leave_2.payslip_state, 'blocked', 'Leave should be to defer') + + # Check overlapping periods with no payslip + leave_3 = self.env['hr.leave'].with_user(self.vlad).create({ + 'name': 'Tennis', + 'holiday_status_id': self.leave_type.id, + 'employee_id': self.emp.id, + 'request_date_from': '2022-01-31', + 'request_date_to': '2022-02-01', + }) + leave_3.sudo().action_validate() + self.assertEqual(leave_3.payslip_state, 'blocked', 'Leave should be to defer') + + leave_4 = self.env['hr.leave'].with_user(self.vlad).create({ + 'name': 'Tennis', + 'holiday_status_id': self.leave_type.id, + 'employee_id': self.emp.id, + 'request_date_from': '2021-01-31', + 'request_date_to': '2022-01-03', + }) + leave_4.sudo().action_validate() + self.assertEqual(leave_4.payslip_state, 'blocked', 'Leave should be to defer') + + def test_report_to_next_month(self): + self.emp.contract_ids.generate_work_entries(date(2022, 1, 1), date(2022, 2, 28)) + payslip = self.env['hr.payslip'].create({ + 'name': 'toto payslip', + 'employee_id': self.emp.id, + 'date_from': '2022-01-01', + 'date_to': '2022-01-31', + }) + payslip.compute_sheet() + payslip.action_payslip_done() + self.assertEqual(payslip.state, 'done') + + leave = self.env['hr.leave'].new({ + 'name': 'Tennis', + 'employee_id': self.emp.id, + 'holiday_status_id': self.leave_type.id, + 'request_date_from': date(2022, 1, 31), + 'request_date_to': date(2022, 1, 31), + 'request_hour_from': 7, + 'request_hour_to': 18, + }) + leave._compute_date_from_to() + leave = self.env['hr.leave'].create(leave._convert_to_write(leave._cache)) + leave.action_validate() + self.assertEqual(leave.payslip_state, 'blocked', 'Leave should be to defer') + + leave.action_report_to_next_month() + reported_work_entries = self.env['hr.work.entry'].search([ + ('employee_id', '=', self.emp.id), + ('company_id', '=', self.env.company.id), + ('state', '=', 'draft'), + ('work_entry_type_id', '=', self.leave_type.work_entry_type_id.id), + ('date_start', '>=', Datetime.to_datetime('2022-02-01')), + ('date_stop', '<=', datetime.combine(Datetime.to_datetime('2022-02-28'), datetime.max.time())) + ]) + self.assertEqual(reported_work_entries[0].date_start, datetime(2022, 2, 1, 7, 0)) + self.assertEqual(reported_work_entries[0].date_stop, datetime(2022, 2, 1, 11, 0)) + self.assertEqual(reported_work_entries[1].date_start, datetime(2022, 2, 1, 12, 0)) + self.assertEqual(reported_work_entries[1].date_stop, datetime(2022, 2, 1, 16, 0)) + + def test_report_to_next_month_overlap(self): + """ + If the time off overlap over 2 months, only report the exceeding part from january + In case leaves go over two months, only the leaves that are in the first month should be defered + """ + self.emp.contract_ids.generate_work_entries(date(2022, 1, 1), date(2022, 2, 28)) + payslip = self.env['hr.payslip'].create({ + 'name': 'toto payslip', + 'employee_id': self.emp.id, + 'date_from': '2022-01-01', + 'date_to': '2022-01-31', + }) + payslip.compute_sheet() + payslip.action_payslip_done() + self.assertEqual(payslip.state, 'done') + + leave = self.env['hr.leave'].new({ + 'name': 'Tennis', + 'employee_id': self.emp.id, + 'holiday_status_id': self.leave_type.id, + 'request_date_from': date(2022, 1, 31), + 'request_date_to': date(2022, 2, 2), + 'request_hour_from': 7, + 'request_hour_to': 18, + }) + leave._compute_date_from_to() + leave = self.env['hr.leave'].create(leave._convert_to_write(leave._cache)) + leave.action_validate() + self.assertEqual(leave.payslip_state, 'blocked', 'Leave should be to defer') + + leave.action_report_to_next_month() + reported_work_entries = self.env['hr.work.entry'].search([ + ('employee_id', '=', self.emp.id), + ('company_id', '=', self.env.company.id), + ('state', '=', 'draft'), + ('work_entry_type_id', '=', self.leave_type.work_entry_type_id.id), + ('date_start', '>=', Datetime.to_datetime('2022-02-01')), + ('date_stop', '<=', datetime.combine(Datetime.to_datetime('2022-02-28'), datetime.max.time())) + ]) + self.assertEqual(len(reported_work_entries), 6) + self.assertEqual(list({we.date_start.day for we in reported_work_entries}), [1, 2, 3]) + self.assertEqual(reported_work_entries[0].date_start, datetime(2022, 2, 1, 7, 0)) + self.assertEqual(reported_work_entries[0].date_stop, datetime(2022, 2, 1, 11, 0)) + self.assertEqual(reported_work_entries[1].date_start, datetime(2022, 2, 1, 12, 0)) + self.assertEqual(reported_work_entries[1].date_stop, datetime(2022, 2, 1, 16, 0)) + + def test_report_to_next_month_not_enough_days(self): + # If the time off contains too many days to be reported to next months, raise + self.emp.contract_ids.generate_work_entries(date(2022, 1, 1), date(2022, 2, 28)) + payslip = self.env['hr.payslip'].create({ + 'name': 'toto payslip', + 'employee_id': self.emp.id, + 'date_from': '2022-01-01', + 'date_to': '2022-01-31', + }) + payslip.compute_sheet() + payslip.action_payslip_done() + self.assertEqual(payslip.state, 'done') + + leave = self.env['hr.leave'].new({ + 'name': 'Tennis', + 'employee_id': self.emp.id, + 'holiday_status_id': self.leave_type.id, + 'request_date_from': date(2022, 1, 1), + 'request_date_to': date(2022, 1, 31), + 'request_hour_from': 7, + 'request_hour_to': 18, + }) + leave._compute_date_from_to() + leave = self.env['hr.leave'].create(leave._convert_to_write(leave._cache)) + leave.action_validate() + self.assertEqual(leave.payslip_state, 'blocked', 'Leave should be to defer') + + with self.assertRaises(UserError): + leave.action_report_to_next_month() + + def test_report_to_next_month_long_time_off(self): + # If the time off overlap over more than 2 months, raise + self.emp.contract_ids.generate_work_entries(date(2022, 1, 1), date(2022, 2, 28)) + payslip = self.env['hr.payslip'].create({ + 'name': 'toto payslip', + 'employee_id': self.emp.id, + 'date_from': '2022-01-01', + 'date_to': '2022-01-31', + }) + payslip.compute_sheet() + payslip.action_payslip_done() + self.assertEqual(payslip.state, 'done') + + leave = self.env['hr.leave'].new({ + 'name': 'Tennis', + 'employee_id': self.emp.id, + 'holiday_status_id': self.leave_type.id, + 'request_date_from': date(2022, 1, 1), + 'request_date_to': date(2022, 3, 10), + 'request_hour_from': 7, + 'request_hour_to': 18, + }) + leave._compute_date_from_to() + leave = self.env['hr.leave'].create(leave._convert_to_write(leave._cache)) + leave.action_validate() + self.assertEqual(leave.payslip_state, 'blocked', 'Leave should be to defer') + + with self.assertRaises(UserError): + leave.action_report_to_next_month() + + def test_report_to_next_month_half_days(self): + self.leave_type.request_unit = 'half_day' + self.emp.contract_ids.generate_work_entries(date(2022, 1, 1), date(2022, 2, 28)) + payslip = self.env['hr.payslip'].create({ + 'name': 'toto payslip', + 'employee_id': self.emp.id, + 'date_from': '2022-01-01', + 'date_to': '2022-01-31', + }) + payslip.compute_sheet() + payslip.action_payslip_done() + self.assertEqual(payslip.state, 'done') + + leave = self.env['hr.leave'].new({ + 'name': 'Tennis', + 'holiday_status_id': self.leave_type.id, + 'employee_id': self.emp.id, + 'request_date_from': date(2022, 1, 31), + 'request_date_to': date(2022, 1, 31), + 'request_unit_half': True, + 'request_date_from_period': 'am', + }) + leave._compute_date_from_to() + leave = self.env['hr.leave'].create(leave._convert_to_write(leave._cache)) + + leave.action_validate() + self.assertEqual(leave.payslip_state, 'blocked', 'Leave should be to defer') + + leave.action_report_to_next_month() + reported_work_entries = self.env['hr.work.entry'].search([ + ('employee_id', '=', self.emp.id), + ('company_id', '=', self.env.company.id), + ('state', '=', 'draft'), + ('work_entry_type_id', '=', self.leave_type.work_entry_type_id.id), + ('date_start', '>=', Datetime.to_datetime('2022-02-01')), + ('date_stop', '<=', datetime.combine(Datetime.to_datetime('2022-02-28'), datetime.max.time())) + ]) + self.assertEqual(len(reported_work_entries), 1) + self.assertEqual(reported_work_entries[0].date_start, datetime(2022, 2, 1, 7, 0)) + self.assertEqual(reported_work_entries[0].date_stop, datetime(2022, 2, 1, 11, 0)) + + def test_defer_next_month_double_time_off(self): + """ + If you have a time off 5 days on Jun and 3 days on july, when you "defer it to next month" + it's only the 5 days of Jun that should be postponed to july. + """ + self.emp.contract_ids._generate_work_entries(datetime(2023, 6, 1), datetime(2023, 7, 31)) + payslip = self.env['hr.payslip'].create({ + 'name': 'toto payslip', + 'employee_id': self.emp.id, + 'date_from': '2023-06-01', + 'date_to': '2023-06-30', + }) + payslip.compute_sheet() + payslip.action_payslip_done() + self.assertEqual(payslip.state, 'done') + + leave_data = [{ + 'name': 'Paid Time Off', + 'employee_id': self.emp.id, + 'holiday_status_id': self.leave_type.id, + 'request_date_from': '2023-06-26 00:00:00', + 'request_date_to': '2023-06-30 23:59:59', + }, { + 'name': 'Paid Time Off', + 'employee_id': self.emp.id, + 'holiday_status_id': self.leave_type.id, + 'request_date_from': '2023-07-03 00:00:00', + 'request_date_to': '2023-07-05 23:59:59', + }] + leaves = self.env['hr.leave'].create(leave_data) + leaves.action_validate() + leaves[0].action_report_to_next_month() + # reported work entries between the 1st of july 2023 to the 31st of july 2023 + july_work_entries = self.env['hr.work.entry'].search([ + ('employee_id', '=', self.emp.id), + ('company_id', '=', self.env.company.id), + ('state', '=', 'draft'), + ('work_entry_type_id', '=', self.leave_type.work_entry_type_id.id), + ('date_start', '>=', Datetime.to_datetime('2023-07-01')), + ('date_stop', '<=', datetime.combine(Datetime.to_datetime('2023-07-31'), datetime.max.time())) + ]) + # The length of reported work entries is 16 because we are generating records for 8 days of leave. + # Each day is divided into two parts, morning and afternoon, resulting in a total of 16 work entries. + # These leaves cover the period from July 3rd to July 12th, excluding July 1st and 2nd as they are designated holidays. + self.assertEqual(len(july_work_entries), 16) + self.assertEqual(list({we.date_start.day for we in july_work_entries}), [3, 4, 5, 6, 7, 10, 11, 12]) + self.assertEqual(july_work_entries[0].date_start, datetime(2023, 7, 3, 6, 0)) + self.assertEqual(july_work_entries[0].date_stop, datetime(2023, 7, 3, 10, 0)) + self.assertEqual(july_work_entries[1].date_start, datetime(2023, 7, 3, 11, 0)) + self.assertEqual(july_work_entries[1].date_stop, datetime(2023, 7, 3, 15, 0)) diff --git a/addons_extensions/hr_payroll_holidays/views/hr_allocation_views.xml b/addons_extensions/hr_payroll_holidays/views/hr_allocation_views.xml new file mode 100644 index 000000000..a0341fd69 --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/views/hr_allocation_views.xml @@ -0,0 +1,13 @@ + + + + hr.view.leave.allocation.inherit.filter + hr.leave.allocation + + + + + + + + diff --git a/addons_extensions/hr_payroll_holidays/views/hr_leave_views.xml b/addons_extensions/hr_payroll_holidays/views/hr_leave_views.xml new file mode 100644 index 000000000..d593e1cd3 --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/views/hr_leave_views.xml @@ -0,0 +1,87 @@ + + + + hr.leave.view.form.inherit.hr.payroll.holidays + hr.leave + + + + + + + + + + + + + + + Time Off to Defer + hr.leave + list,kanban,form,calendar,activity + + [('payslip_state', '=', 'blocked'), ('state', '=', 'validate'), ('employee_company_id', 'in', allowed_company_ids)] + + + + hr.leave.view.form.inherit + hr.leave + + + + + + + + + + + hr.holidays.view.list.inherit.work.entry + hr.leave + + primary + + + + + + + + + Time Off + hr.leave + list,kanban,form,calendar,activity,gantt + + + { + 'search_default_to_defer':1, + 'hide_employee_name': 1 + } + +

+ Meet the time off dashboard. +

+ A great way to keep track on employee’s PTOs, sick days, and approval status. +

+
+
+ + + +
diff --git a/addons_extensions/hr_payroll_holidays/views/hr_payslip_run_views.xml b/addons_extensions/hr_payroll_holidays/views/hr_payslip_run_views.xml new file mode 100644 index 000000000..403df409a --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/views/hr_payslip_run_views.xml @@ -0,0 +1,13 @@ + + + + hr.payslip.run.view.list.inherit.hr.payroll.holidays + hr.payslip.run + + + + hr_payroll_payslip_tree + + + + diff --git a/addons_extensions/hr_payroll_holidays/views/hr_payslip_views.xml b/addons_extensions/hr_payroll_holidays/views/hr_payslip_views.xml new file mode 100644 index 000000000..f6385fa51 --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/views/hr_payslip_views.xml @@ -0,0 +1,24 @@ + + + + hr.payslip.view.form.inherit.hr.payroll.holidays + hr.payslip + + + + hr_payslip_form + + + + + + hr.payslip.view.list.inherit.hr.payroll.holidays + hr.payslip + + + + hr_payroll_payslip_tree + + + + diff --git a/addons_extensions/hr_payroll_holidays/views/res_config_settings_views.xml b/addons_extensions/hr_payroll_holidays/views/res_config_settings_views.xml new file mode 100644 index 000000000..824690616 --- /dev/null +++ b/addons_extensions/hr_payroll_holidays/views/res_config_settings_views.xml @@ -0,0 +1,24 @@ + + + + res.config.settings.view.form.inherit.hr.payroll.holidays + res.config.settings + + + + + + +
+
+
+
+
+
+
+
+
+
diff --git a/addons_extensions/l10n_in_hr_payroll/__init__.py b/addons_extensions/l10n_in_hr_payroll/__init__.py new file mode 100644 index 000000000..637b45b52 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/__init__.py @@ -0,0 +1,7 @@ +# -*- coding:utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import models +from . import report +from . import wizard +from . import controller diff --git a/addons_extensions/l10n_in_hr_payroll/__manifest__.py b/addons_extensions/l10n_in_hr_payroll/__manifest__.py new file mode 100644 index 000000000..ae3c987d0 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/__manifest__.py @@ -0,0 +1,61 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +{ + 'name': 'Indian Payroll', + 'countries': ['in'], + 'category': 'Human Resources/Payroll', + 'depends': ['hr_payroll_holidays', 'hr_payroll'], + 'auto_install': ['hr_payroll'], + 'description': """ +Indian Payroll Salary Rules. +============================ + + -Configuration of hr_payroll for India localization + -All main contributions rules for India payslip. + * New payslip report + * Employee Contracts + * Allow to configure Basic / Gross / Net Salary + * Employee PaySlip + * Allowance / Deduction + * Integrated with Leaves Management + * Medical Allowance, Travel Allowance, Child Allowance, ... + - Payroll Advice and Report + - Yearly Salary by Employee Report + """, + 'data': [ + 'data/report_paperformat.xml', + 'views/l10n_in_hr_payroll_report.xml', + 'data/res_partner_data.xml', + 'data/hr_salary_rule_category_data.xml', + 'data/hr_payroll_structure_type_data.xml', + 'data/hr_payroll_structure_data.xml', + 'data/salary_rules/hr_salary_rule_stipend_data.xml', + 'data/salary_rules/hr_salary_rule_ind_emp_data.xml', + 'data/salary_rules/hr_salary_rule_regular_pay_data.xml', + 'data/salary_rules/hr_salary_rule_worker_data.xml', + 'data/hr_contract_type_data.xml', + 'data/hr_rule_parameters_data.xml', + 'data/ir_sequence_data.xml', + 'data/hr_payroll_dashboard_warning_data.xml', + 'wizard/hr_tds_calculation.xml', + 'views/hr_contract_views.xml', + 'views/res_users_views.xml', + 'views/hr_employee_views.xml', + 'views/res_config_settings_views.xml', + 'security/ir.model.access.csv', + 'views/report_payslip_details_template.xml', + 'wizard/hr_salary_register.xml', + 'views/report_hr_epf_views.xml', + 'wizard/hr_yearly_salary_detail_view.xml', + 'wizard/hr_payroll_payment_report.xml', + 'views/report_hr_yearly_salary_detail_template.xml', + 'views/report_payroll_advice_template.xml', + 'views/l10n_in_salary_statement.xml', + 'views/report_l10n_in_salary_statement.xml', + ], + 'demo': [ + 'data/l10n_in_hr_payroll_demo.xml', + ], + 'license': 'OEEL-1', +} diff --git a/addons_extensions/l10n_in_hr_payroll/controller/__init__.py b/addons_extensions/l10n_in_hr_payroll/controller/__init__.py new file mode 100644 index 000000000..80ee4da1c --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/controller/__init__.py @@ -0,0 +1,3 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import main diff --git a/addons_extensions/l10n_in_hr_payroll/controller/main.py b/addons_extensions/l10n_in_hr_payroll/controller/main.py new file mode 100644 index 000000000..5bac0be80 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/controller/main.py @@ -0,0 +1,136 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from datetime import datetime +from io import BytesIO +from copy import deepcopy + +from odoo import http, _ +from odoo.http import request +from odoo.tools.misc import xlsxwriter + + +class L10nInSalaryRegisterController(http.Controller): + + def _get_payslip_rules(self, employee_ids, payslips, struct_id=None): + rule_by_name = [] + if struct_id and struct_id.rule_ids: + rule_by_name = [(i.code, i.name) for i in struct_id.rule_ids] + else: + rule_by_name = [ + (rule.code, rule.name) + for payslip in payslips + for rule in payslip.struct_id.rule_ids + ] + child_dict = {code: [name, 0] for code, name in rule_by_name} + rules_per_employee = {employee_id: deepcopy(child_dict) for employee_id in employee_ids} + rules_by_name = dict(rule_by_name) + return rules_by_name, rules_per_employee + + @http.route(['/export/salary-register/'], type='http', auth='user') + def export_salary_register(self, wizard_id): + wizard = request.env['salary.register.wizard'].browse(wizard_id) + if not wizard.exists() or not request.env.user.has_group('hr_payroll.group_hr_payroll_user'): + return request.render( + 'http_routing.http_error', + { + 'status_code': 'Oops', + 'status_message': _('It seems that you either not have the rights to access the Salary Register ' + 'or that you try to access it outside normal circumstances. ' + 'If you think there is a problem, please contact an administrator.') + } + ) + output = BytesIO() + workbook = xlsxwriter.Workbook(output, {'in_memory': True}) + worksheet = workbook.add_worksheet('salary_register_report') + style_highlight = workbook.add_format({'bold': True, 'pattern': 1, 'bg_color': '#E0E0E0', 'align': 'center'}) + style_normal = workbook.add_format({'align': 'center'}) + column_width = 30 + + date_from = str(wizard.date_from) + date_to = str(wizard.date_to) + employee_ids = wizard.employee_ids + struct_id = wizard.struct_id + + # VERTICAL HEADERS + vertical_headers = [ + _('EMPLOYER ID'), + _('EMPLOYER NAME'), + _('FROM DATE'), + _('TO DATE'), + ] + # VERTICAL DATA + vertical_data = [ + wizard.company_id.company_registry or '', + wizard.company_id.name, + date_from, + date_to, + ] + blank_lines = 1 + + # HORIZONTAL HEADERS + horizontal_headers = [ + _('EMPLOYEE CODE'), + _('EMPLOYEE NAME'), + ] + + # HORIZONTAL DATA + domain = [('employee_id', 'in', employee_ids.ids), ('date_from', '>=', date_from), ('date_to', '<=', date_to), ('state', '=', 'paid')] + if struct_id: + domain.append(('struct_id', '=', struct_id.id)) + payslips_per_employee = dict(request.env['hr.payslip']._read_group( + domain=domain, + groupby=['employee_id'], + aggregates=['id:recordset'], + )) + rules_by_name, rules_per_employee = self._get_payslip_rules(employee_ids, payslips_per_employee.values(), struct_id=struct_id) + rules_per_employee = { + employee: rules + for employee, rules in rules_per_employee.items() + if employee in payslips_per_employee + } + # Dynamically calculated headers + horizontal_headers = [*horizontal_headers, *rules_by_name.values()] + for employee_id, payslips in payslips_per_employee.items(): + rule_codes = payslips.struct_id.rule_ids.mapped('code') + payslip_rules = payslips._get_line_values(rule_codes, compute_sum=True) + for code, rule in payslip_rules.items(): + rules_per_employee[employee_id][code][1] += rule['sum']['total'] + + horizontal_data = [] + for employee_id in rules_per_employee: + dynamic_horizontal_data = [data[1] for data in rules_per_employee[employee_id].values()] + horizontal_data.append(( + employee_id.registration_number or "", + employee_id.name, + *dynamic_horizontal_data, + )) + + # WRITE IN WORKSHEET + row = 0 + for (vertical_header, vertical_point) in zip(vertical_headers, vertical_data): + worksheet.write(row, 0, vertical_header, style_highlight) + worksheet.write(row, 1, vertical_point, style_normal) + row += 1 + + row += blank_lines + for col, horizontal_header in enumerate(horizontal_headers): + worksheet.write(row, col, horizontal_header, style_highlight) + worksheet.set_column(col, col, column_width) + + for payroll_line in horizontal_data: + row += 1 + for col, payroll_point in enumerate(payroll_line): + worksheet.write(row, col, payroll_point, style_normal) + + row += 1 + workbook.close() + xlsx_data = output.getvalue() + date_obj = datetime.strptime(date_from, '%Y-%m-%d').date() + filename = _("salary_register_report_%(year)s_%(month)s", year=date_obj.year, month=date_obj.month) + response = request.make_response( + xlsx_data, + headers=[ + ('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'), + ('Content-Disposition', f'attachment; filename={filename}.xlsx')], + ) + return response diff --git a/addons_extensions/l10n_in_hr_payroll/data/hr_contract_type_data.xml b/addons_extensions/l10n_in_hr_payroll/data/hr_contract_type_data.xml new file mode 100644 index 000000000..216cd829f --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/data/hr_contract_type_data.xml @@ -0,0 +1,13 @@ + + + + Probation + 4 + + + + Intern + 5 + + + diff --git a/addons_extensions/l10n_in_hr_payroll/data/hr_payroll_dashboard_warning_data.xml b/addons_extensions/l10n_in_hr_payroll/data/hr_payroll_dashboard_warning_data.xml new file mode 100644 index 000000000..8780895b9 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/data/hr_payroll_dashboard_warning_data.xml @@ -0,0 +1,77 @@ + + + + + + Employees Without PAN Number + + +indian_companies = self.env.companies.filtered(lambda c: c.country_id.code == 'IN') +if indian_companies: + # Employees Without PAN Number + employees_wo_pan = self.env['hr.employee'].search([ + ('l10n_in_pan', '=', False), + ('company_id', 'in', indian_companies.ids), + ]) + if employees_wo_pan: + warning_count = len(employees_wo_pan) + warning_records = employees_wo_pan + + + + + Employees Without UAN Number + + +indian_companies = self.env.companies.filtered(lambda c: c.country_id.code == 'IN') +if indian_companies: + # Employees Without PAN Number + employees_wo_uan = self.env['hr.employee'].search([ + ('l10n_in_uan', '=', False), + ('company_id', 'in', indian_companies.ids), + ]) + if employees_wo_uan: + warning_count = len(employees_wo_uan) + warning_records = employees_wo_uan + + + + + Employees Without ESIC Number + + +indian_companies = self.env.companies.filtered(lambda c: c.country_id.code == 'IN') +if indian_companies: + # Employees Without PAN Number + employees_wo_esic = self.env['hr.employee'].search([ + ('l10n_in_esic_number', '=', False), + ('company_id', 'in', indian_companies.ids), + ]) + if employees_wo_esic: + warning_count = len(employees_wo_esic) + warning_records = employees_wo_esic + + + + + Employees Probation ends within a week + + +indian_companies = self.env.companies.filtered(lambda c: c.country_id.code == 'IN') +if indian_companies: + # Employees who are on the probation and their contracts expire within a week + probation_contract_type = self.env.ref('l10n_in_hr_payroll.l10n_in_contract_type_probation', raise_if_not_found=False) + if probation_contract_type: + nearly_expired_contracts = self.env['hr.contract'].search([ + ('contract_type_id', '=', probation_contract_type.id), + ('state', '=', 'open'), ('kanban_state', '!=', 'blocked'), + ('date_end', '<=', date.today() + relativedelta(days=7)), + ('date_end', '>=', date.today() + relativedelta(days=1)), + ]) + if nearly_expired_contracts: + warning_count = len(nearly_expired_contracts.employee_id) + warning_records = nearly_expired_contracts.employee_id + + + + diff --git a/addons_extensions/l10n_in_hr_payroll/data/hr_payroll_structure_data.xml b/addons_extensions/l10n_in_hr_payroll/data/hr_payroll_structure_data.xml new file mode 100644 index 000000000..679e3d105 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/data/hr_payroll_structure_data.xml @@ -0,0 +1,46 @@ + + + + + India: Regular Pay + + + + + + + + Worker Pay + + + + + + + Stipend + + + + Stipend + + + + Non-Executive Employee + + + + + + + + + + + + + + + + + + diff --git a/addons_extensions/l10n_in_hr_payroll/data/hr_payroll_structure_type_data.xml b/addons_extensions/l10n_in_hr_payroll/data/hr_payroll_structure_type_data.xml new file mode 100644 index 000000000..039859e1c --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/data/hr_payroll_structure_type_data.xml @@ -0,0 +1,23 @@ + + + + hourly + + + + India: Employee Pay + + + + India: Intern + + + + India: Worker + + + + India: Non-Executives + + + diff --git a/addons_extensions/l10n_in_hr_payroll/data/hr_rule_parameters_data.xml b/addons_extensions/l10n_in_hr_payroll/data/hr_rule_parameters_data.xml new file mode 100644 index 000000000..4b155effd --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/data/hr_rule_parameters_data.xml @@ -0,0 +1,304 @@ + + + + + India: Basic Salary Value + l10n_in_basic_value + + + + 7000 + + + + + + India: Basic Salary Percentage + l10n_in_basic_percent + + + + 0.60 + + + + + + India: Basic Salary Days + l10n_in_basic_days + + + + 0.31 + + + + + + India: House Rent Allowance Value + l10n_in_hra_value + + + + 0.40 + + + + + + India: Standard Allowance + l10n_in_std_alw + + + + 4167 + + + + + + India: Bonus Value and Percentage + l10n_in_bonus_percent + + + + [ + (450000.00, (12, 0.30)), + (550000.00, (3, 0.20)), + (0.00, (1, 0.10)), + ] + + + + + + India: TDS Rate Chart + l10n_in_tds_rate_chart + + + + [ + (0.0, (0, 300000)), + (0.05, (300000, 600000)), + (0.1, (600000, 900000)), + (0.15, (900000, 1200000)), + (0.2, (1200000, 1500000)), + (0.3, (1500000, 'inf')) + ] + + + + + + India: Surcharge Rate + l10n_in_surcharge_rate + + + + [ + (0.0, (0, 5000000)), + (0.1, (5000000, 10000000)), + (0.15, (10000000, 20000000)), + (0.25, (20000000, 'inf')), + ] + + + + + + India: Standard Deduction + l10n_in_standard_deduction + + + + 50000 + + + + + + India: Minimun Income for Tax Rebate + l10n_in_min_income_tax_rebate + + + + 700000 + + + + + + India: Miminum Income for Surcharge + l10n_in_min_income_surcharge + + + + 5000000 + + + + + + India: Maximum Tax Rate for Surcharge + l10n_in_max_surcharge_tax_rate + + + + [ + (5000000, 1200000, 0), + (10000000, 2700000, 270000), + (20000000, 5700000, 855000), + (50000000, 14700000, 3675000), + ] + + + + + + India: Leave Travel Allowance Value and Percentage + l10n_in_lta_percent + + + + [ + (450000.00, (12, 0.30)), + (550000.00, (3, 0.20)), + (0.00, (1, 0.10)), + ] + + + + + + India: Professional Tax + l10n_in_professional_tax + + + + [-200, -150, -80] + + + + + + India: Provident Fund Percentage + l10n_in_pf_percent + + + + 0.12 + + + + + + India: Provident Fund Value + l10n_in_pf_amount + + + + 15000.00 + + + + + + India: EPS Contri Percentage + l10n_in_eps_contri_percent + + + + 0.0833 + + + + + + India: Employer's State Insurance Corporation Percentage + l10n_in_esicf_percent + + + + 0.0325 + + + + + + India: City Compensatory Allowance Percentage + l10n_in_city_alw_percent + + + + 0.10 + + + + + + India: Child Education Allowance + l10n_in_chea_value + + + + [100, 200] + + + + + + India: Child Hostel Allowance Value + l10n_in_child_hostel_allowance + + + + [300, 600] + + + + + + India: Employer's State Insurance Corporation Value + l10n_in_esicf_value + + + + 21000 + + + + + + India: Leave Days + l10n_in_leave_days + + + + 22 + + + + + + India: India:Employee's NPS Contribution + l10n_in_cbda_percent + + + + 0.10 + + + + + + India: Performace Bonus Percentage + l10n_in_regular_bonus_percent + + + + 0.40 + + + + + diff --git a/addons_extensions/l10n_in_hr_payroll/data/hr_salary_rule_category_data.xml b/addons_extensions/l10n_in_hr_payroll/data/hr_salary_rule_category_data.xml new file mode 100644 index 000000000..285139ffb --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/data/hr_salary_rule_category_data.xml @@ -0,0 +1,20 @@ + + + + + Special Allowance + SPA + + + + Leave Allowance + LEAVE + + + + Performance Bonus + PBS + + + + diff --git a/addons_extensions/l10n_in_hr_payroll/data/ir_sequence_data.xml b/addons_extensions/l10n_in_hr_payroll/data/ir_sequence_data.xml new file mode 100644 index 000000000..42fa6fd70 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/data/ir_sequence_data.xml @@ -0,0 +1,13 @@ + + + + + + Payment Advice + payment.advice + 3 + + + + + diff --git a/addons_extensions/l10n_in_hr_payroll/data/l10n_in_hr_payroll_demo.xml b/addons_extensions/l10n_in_hr_payroll/data/l10n_in_hr_payroll_demo.xml new file mode 100644 index 000000000..08865e478 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/data/l10n_in_hr_payroll_demo.xml @@ -0,0 +1,430 @@ + + + + + IN Company + Block no. 401 + Street 2 + Hyderabad + + + 500001 + +91 81234 56789 + + + + IN Company + + + 24DUMMY1234AAZA + + + + HDFC Bank + HDFC0000123 + + + + State Bank + SBIS0000321 + + + + + + + + + Vihaan Sengupta + A-4 Gunj Society + near AK Hospital + Hyderabad + 385426 + + + +91 98765 43021 + vihaan.sengupta@example.com + + + + Alisha Sharma + + + + + Shaurya Khurana + + + + + 1245670000123 + + + + + + + + + 0112340000998 + + + + + + + + + 0222340000789 + + + + + + + + + + vihaan@example.com + vihaan@123 + --
+V. Sengupta
+ + + + Asia/Kolkata + +
+ + + + Standard 24 hours/week + + 8 + + + + + Research & Development IN + + + + Technical Support & Investigation + + + + Marketing + + + + + Experienced Developer + + 5 + + + + Technical Support & Investigation Intern + + 10 + + + + + + Vihaan Sengupta + male + single + +91 8765432109 + + A-4 Gunj Society + near AK Hospital + Hyderabad + 385426 + + + +91 7654321098 + vihaan.sengupta123@example.com + + Software Developer + + Harshiv Sengupta + +91 9348762345 + India + + bachelor + Computer Engineering + TechInnova University + + + + 82735682375623 + + + + Father + 124567334654 + 93874947361284657 + HDIUE8765M + + + Shaurya Khurana + + male + + + single + +91 7890123456 + 503, highsky residency + VR Road + Ahmedabad + 385876 + + + +91 9870165432 + shaurya.khurana@example.com + India + + Asia/Kolkata + + + 82735682375623 + + + + + 387438790384 + 93487475300284657 + KUPYH9876I + + + Alisha Sharma + + + + female + Asia/Kolkata + +91 9887756789 + alisha.sharma@example.com + India + + + + + + + 398175628304 + 4658302649025064783 + GUNI5723P + + + + + Alisha Sharma + + + + + open + + + + + + Shaurya Contract + + + + hourly + 250 + + + + + open + + + + + + Vihaan Sengupta Contract + + + + 50000 + open + + 5000 + 1442.50 + 6550 + 12 + 12 + 6850 + 2750 + 1560 + + + + + + + Vihaan Sengupta Contract + + + + 40000 + close + + + + + 4000 + 1142 + 5100 + 12 + 16 + 5560 + 2000 + 1160 + + + + + Paid Time Off for Indian Employee 1 + + + + 24 + confirm + + + + + Paid Time Off for Indian Employee 2 + + + + 24 + confirm + + + + + Paid Time Off for Indian Employee 3 + + + + 24 + confirm + + + + + + + + 1 + + + confirm + + + + + + 0.5 + + + + confirm + + + + + + + + + + 5500 + 5500 + + + Health Insurance + + + + + + + + + + + + + + + + Vihaan Payslip September + + + + + + + + Shaurya Payslip September + + + + + + + + Vihaan Payslip October + + + + + + + + + Alisha Sharma November + + + + + + + + + + + + + +
+
diff --git a/addons_extensions/l10n_in_hr_payroll/data/report_paperformat.xml b/addons_extensions/l10n_in_hr_payroll/data/report_paperformat.xml new file mode 100644 index 000000000..b24941486 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/data/report_paperformat.xml @@ -0,0 +1,17 @@ + + + + Yealy Salary Head Report + + A4 + 0 + 0 + Landscape + 15 + 15 + 5 + 5 + + 96 + + diff --git a/addons_extensions/l10n_in_hr_payroll/data/res_partner_data.xml b/addons_extensions/l10n_in_hr_payroll/data/res_partner_data.xml new file mode 100644 index 000000000..5eef7fdfe --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/data/res_partner_data.xml @@ -0,0 +1,54 @@ + + + + Register for House Rent Allowance + + + + Register for Provident Fund + + + + Register for Professional Tax + + + + Register for Food Coupen + + + + Register for TDS + + + + Register for NPS Contribution + + + + Register for Voluntary Provident Fund + + + + Register for Company Provided Transport Deduction + + + + Register for State Labour Welfare Fund Deduction + + + + Register for Company Provided Group Term Insurance Deduction + + + + Register for Leave Availed Deduction + + + + Register for Company Provided Medical Insurance Deduction + + + + Register for Other Deduction from Employer + + diff --git a/addons_extensions/l10n_in_hr_payroll/data/salary_rules/hr_salary_rule_ind_emp_data.xml b/addons_extensions/l10n_in_hr_payroll/data/salary_rules/hr_salary_rule_ind_emp_data.xml new file mode 100644 index 000000000..ad61926dd --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/data/salary_rules/hr_salary_rule_ind_emp_data.xml @@ -0,0 +1,511 @@ + + + + HRAMN + code + +nonmetro_alw = contract.l10n_in_house_rent_allowance_metro_nonmetro / 100 +result = contract.wage * nonmetro_alw + + + House Rent Allowance + + + HRA is an allowance given by the employer to the employee for taking care of his rental or accommodation expenses. + + + + + SA + Grade/Special/Management/Supplementary Allowance + + python + result = bool(contract.l10n_in_supplementary_allowance) + code + result = contract.l10n_in_supplementary_allowance + + This allowance is normally given as an additional benefit to employees and is fully taxable. + + + + + CHEA + Child Education Allowance + + python + result = bool(employee.children) + code + +amounts = payslip._rule_parameter('l10n_in_chea_value') +if employee.children == 1: + result = amounts[0] +else: + result = amounts[1] + + + Per school going child 1200 per annum is non-taxable.Maximum for 2 children, so max 2400 per annum becomes non-taxable. + + + + + CHEAH + Child Hostel Allowance + + python + result = bool(employee.l10n_in_residing_child_hostel) + code + +amounts = payslip._rule_parameter('l10n_in_child_hostel_allowance') +if employee.l10n_in_residing_child_hostel == 1: + result = amounts[0] +else: + result = amounts[1] + + In case the children are in hostel, the exemption available for child. + + + + + + CBDA + City Compensatory Allowance + + none + + code + +city_alw_percent = payslip._rule_parameter('l10n_in_city_alw_percent') +result = contract.wage * city_alw_percent + + This allowance is paid to Employees who are posted in big cities. The purpose is to compensate the high cost of living in cities like Mumbai, Delhi, etc. However it is Fully Taxable. + + + + + CMETRO + City Allowance for Metro city + + none + + fix + 850.0 + + + + + CNMETRO + City Allowance for Non Metro city + + none + + fix + 800.0 + + + + + ARRE + Arrears + + code + +result = 'ARS' in inputs and inputs['ARS'].amount +result_name = 'ARS' in inputs and inputs['ARS'].name + + + + Generally arrears are fully taxable, but employee may claim exemption u/s 89(1). +One would need to compute income tax on the arrears if it would have been received in actual year. +Now difference of income tax between payment year and actual year would be allowed for deduction. + + + + + MEDA + Medical Reimbursement + + code + +result = 'MR' in inputs and inputs['MR'].amount +result_name = 'MR' in inputs and inputs['MR'].name + + + This component is on-taxable up to 15000 per year (or Rs 1500 per month) on producing medical bills. + + + + + fix + + 'WORK100' in worked_days and worked_days['WORK100'].number_of_days + FC + + Food Allowance + + + + + + + ESICF + Employer's State Insurance Corporation + + + python + result = result_rules['GROSS']['total'] <= payslip._rule_parameter('l10n_in_esicf_value') + code + +esicf_percent = payslip._rule_parameter('l10n_in_esicf_percent') +gross = categories['GROSS'] +result = gross * esicf_percent + + + + + + + + ERPF + Employer's PF Contribution + + code + +pf_ctb_percent = payslip._rule_parameter('l10n_in_pf_percent') +result = -contract.wage * pf_ctb_percent + + + + + Both the employees and employer contribute to the fund at the rate of 12% of the basic wages, dearness allowance and retaining allowance, if any, payable to employees per month. + + + + + PERJ + Book and Periodicals Allowance (BNP) + + code + +result = 'PJ' in inputs and inputs['PJ'].amount +result_name = 'PJ' in inputs and inputs['PJ'].name + + + Some employers may provide component for buying magazines, journals and books as a part of knowledge enhancement for business growth.This part would become non taxable on providing original bills. + + + + + UNIFS + Uniform/Dress Allowance for Senior Executive + + fix + + + Some sections of employees mat get allowance for purchase of office dress/uniform.In such case, the component would become non-taxable. + + + + + TELR + Telephone Reimbursement + + code + +result = 'TR' in inputs and inputs['TR'].amount +result_name = 'TR' in inputs and inputs['TR'].name + + + In some of the cases, companies may provide a component for telephone bills.Employees may provide actual phone usage bills to reimburse this component and make it non-taxable. + + + + + + PDA + Professional Development Allowance + + fix + + + + + + + CAR + Car Expenses Reimbursement + + code + +result = 'CEI' in inputs and inputs['CEI'].amount +result_name = 'CEI' in inputs and inputs['CEI'].name + + + In case company provides component for this and employee use self owned car for official and personal purposes, Rs 1800 per month would be non-taxable on showing bills for fuel or can maintenance. This amount would be Rs 2400 in case car is more capacity than 1600cc. + + + + + INT + Mobile and Internet Expense + + code + +result = 'IE' in inputs and inputs['IE'].amount +result_name = 'IE' in inputs and inputs['IE'].name + + + Employer may also provide reimbursement of Mobile and Internet Expense and thus this would become non taxable. + + + + + DRI + Driver Salary + + python + result = bool(contract.l10n_in_driver_salay) + fix + + + Rs. 900 per month (non taxable) + + + + + + + + EPMF + Employee's PF Contribution + + code + +pf_ctb_percent = payslip._rule_parameter('l10n_in_pf_percent') +result = -contract.wage * pf_ctb_percent + + Employer contribution does not become part of employee’s income and hence income tax is not payable on this part. + + + + + + + ENPFC + Employee's NPS Contribution + + code + +pf_ctb_percent = payslip._rule_parameter('l10n_in_cbda_percent') +result = -contract.wage * pf_ctb_percent + + + + Employee can claim deduction even of employer's contribution to NPS. + + + + + VPF + Voluntary Provident Fund Contribution + + python + result = bool(contract.l10n_in_voluntary_provident_fund) + code + +VPF = contract.l10n_in_voluntary_provident_fund +result = -contract.wage * VPF / 100 + + + + VPF is a safe option wherein you can contribute more than the PF ceiling of 12% that has been mandated by the government.This additional amount enjoys all the benefits of PF except that the employer is not liable to contribute any extra amount apart from 12%.An added advantage is that the interest rate is equal to the interest rate of PF and he withdrawal is tax free. Please note that the maximum contribution towards VPF is 100% of your Basic.The highest rate of interest (close to 9%) makes it a very attractive saving scheme. Because of these advantages many employees chose not to close their PF account even after getting employment else where other than India.Employees also get a major tax break on their entire contribution to the fund up to a ceiling of Rs. 70,000/- + + + + + CPT + Deduction for Company Provided Transport + + none + fix + + + + Company provided transport amount is based on company. + + + + + fix + + 'WORK100' in worked_days and worked_days['WORK100'].number_of_days + FD + + Deduction Towards Food Coupons + + + + + + + LWFE + Employee's Deduction Towards State Labour Welfare Fund + + fix + + + + The LWF is applicable to all the members of the organisation except the Management staff (Staffs having authority to sign on the cheque/official documents on behalf of the organisation). for e.x. Employee Contribution is Rs. 3.00 and Employer contribution Rs. 6.00 Total Rs 9.00 and deposited to the LWF office.It is half yearly contribution (June and December). + + + + + LWF + Employer's Deduction Towards State Labour Welfare Fund + + fix + + + + The LWF is applicable to all the members of the organisation except the Management staff (Staffs having authority to sign on the cheque/official documents on behalf of the organisation). for e.x. Employee Contribution is Rs. 3.00 and Employer contribution Rs. 6.00 Total Rs 9.00 and deposited to the LWF office.It is half yearly contribution (June and December). + + + + + CGTI + Deduction Towards Company Provided Group Term Insurance + + fix + + + + Group term insurance provides a solid foundation to a comprehensive employee benifit program,backed up by government asistance in the form of valuable tax incentives to both employees and employers. + + + + + DLA + Deduction Towards Leave Availed + + python + result = 'LAI' in inputs + code + +result = -inputs['LAI'].amount +result_name = inputs['LAI'].name + + + + + + CMT + Deduction Towards Company Provided Medical Insurance + + python + result = bool(contract.l10n_in_medical_insurance) + code + +result = -contract.l10n_in_medical_insurance + + + + + + + + + ODE + Other Deduction from Employer + + fix + + + + + + + + ENPC + Employer's NPS Contribution + + code + +pf_ctb_percent = payslip._rule_parameter('l10n_in_cbda_percent') +result = -contract.wage * pf_ctb_percent + + + + Any amount contributed by your employer to your NPS account is treated as part of your salary and is included in your income but you can claim deduction under Section 80C for this too.thus, effectively making it exempt from tax within the limit of 10% of your basic salary. This is very useful and tax efficient for you particularly if you fall in the maximum tax. + + + + + EPF + Employer's PF Contribution + + code + +pf_ctb_percent = payslip._rule_parameter('l10n_in_pf_percent') +result = -contract.wage * pf_ctb_percent + + + + + Both the employees and employer contribute to the fund at the rate of 12% of the basic wages, dearness allowance and retaining allowance, if any, payable to employees per month. + + + + + ESICS + Employer's State Insurance Corporation + + + python + result = bool(contract.l10n_in_esic_amount) + code + result = -contract.l10n_in_esic_amount + + + + + + EXPENSE + Refund Expenses + + python + result = 'EXPENSES' in inputs + code + +result = inputs['EXPENSES'].amount +result_name = inputs['EXPENSES'].name + + + + + + GRATUITY + Gratuity + + + python + result = bool(contract.l10n_in_gratuity) + code + result = -contract.l10n_in_gratuity + + + + + PF + Provident fund + + python + result = bool(contract.l10n_in_provident_fund) + code + +PF = payslip._rule_parameter('l10n_in_pf_percent') +result = -contract.wage * PF + + + + + + diff --git a/addons_extensions/l10n_in_hr_payroll/data/salary_rules/hr_salary_rule_regular_pay_data.xml b/addons_extensions/l10n_in_hr_payroll/data/salary_rules/hr_salary_rule_regular_pay_data.xml new file mode 100644 index 000000000..e67fcffda --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/data/salary_rules/hr_salary_rule_regular_pay_data.xml @@ -0,0 +1,248 @@ + + + + + + + + + + TDS + Tax Deducted at Source + + python + result = bool(contract.l10n_in_tds) + code + result = -(contract.l10n_in_tds) + + + As per income tax rules, all payment which are taxable in nature should be done after deduction of taxes at the source itself. Hence employer compute income tax on salary payment and deduct it every month. This TDS is based on employee’s saving/investment declaration at the start of year. If investments for tax saving is not done, large amount may be deducted in last few months. + + + + + HRA + House Rent Allowance + + + code + +hra_value = payslip._rule_parameter('l10n_in_hra_value') +result = categories['BASIC'] * hra_value + + + + + + STD + Standard Allowance + + + 1 + code + +std_awl = payslip._rule_parameter('l10n_in_std_alw') +work_rate = 1 +if payslip.worked_days_line_ids: + total_days = sum(payslip.worked_days_line_ids.mapped('number_of_days')) + total_unpaid_days = worked_days['LEAVE90'].number_of_days if 'LEAVE90' in worked_days else 0 + work_rate = (total_days - total_unpaid_days) / total_days +result = std_awl * work_rate + + + + + + BONUS + Bonus + + + code + +bonus_percent = payslip._rule_parameter('l10n_in_bonus_percent') +result = 0 +for treshhold, coef in bonus_percent: + annual_wage = contract.wage * coef[0] + if annual_wage < treshhold: + result = categories['BASIC'] * coef[1] + break + + + + + + LTA + Leave Travel Allowance + + + code + +lta_percent = payslip._rule_parameter('l10n_in_lta_percent') +result = 0 +for treshhold, coef in lta_percent: + annual_wage = contract.wage * coef[0] + if annual_wage < treshhold: + result = categories['BASIC'] * coef[1] + break + + + + + + SPL + Supplementary Allowance + + + code + +basic_and_alw = categories['BASIC'] + categories['ALW'] +basic_in_per = payslip._rule_parameter('l10n_in_basic_percent') +result = payslip.paid_amount * basic_in_per - basic_and_alw + + + + + + P_BONUS + Performance Bonus + + + code + +basic_percent = payslip._rule_parameter('l10n_in_basic_percent') +regular_bonus_percent = payslip._rule_parameter('l10n_in_regular_bonus_percent') +worked_days_ratio = 1 +if payslip.worked_days_line_ids: + total_days = sum(payslip.worked_days_line_ids.mapped('number_of_days')) + total_unpaid_days = worked_days['LEAVE90'].number_of_days if 'LEAVE90' in worked_days else 0 + worked_days_ratio = (total_days - total_unpaid_days) / total_days +bonus_base_ded = contract.wage * basic_percent * 2 / payslip._rule_parameter('l10n_in_leave_days') + contract.l10n_in_gratuity +bonus_base = contract.wage * regular_bonus_percent - bonus_base_ded +result = bonus_base * worked_days_ratio + + + + + + + + + + + LEAVE + Leave Allowance + + + python + result = bool(contract.l10n_in_leave_allowance) + code + result = contract.l10n_in_leave_allowance + + False + + + + PT + Professional Tax + + + code + +amounts = payslip._rule_parameter('l10n_in_professional_tax') +if categories['GROSS'] >= 12000: + result = amounts[0] +elif categories['GROSS'] >= 9000 and categories['GROSS'] < 12000: + result = amounts[1] +elif categories['GROSS'] >= 6000 and categories['GROSS'] < 9000: + result = amounts[2] +else: + result = 0 + + + + + + PF + Provident fund - Employee + + + python + result = bool(contract.l10n_in_provident_fund) + code + +total_days = sum(payslip.worked_days_line_ids.mapped('number_of_days')) +total_worked_days = total_days - ('LEAVE90' in worked_days and worked_days['LEAVE90'].number_of_days) +result = - categories['BASIC'] * payslip._rule_parameter('l10n_in_pf_percent') if ((categories['BASIC']) < 15000) else -(1800/total_days) * total_worked_days + + + + + + PFE + Provident fund - Employer + + + python + result = bool(contract.l10n_in_provident_fund) + code + +total_days = sum(payslip.worked_days_line_ids.mapped('number_of_days')) +total_worked_days = total_days - ('LEAVE90' in worked_days and worked_days['LEAVE90'].number_of_days) +result = - categories['BASIC'] * payslip._rule_parameter('l10n_in_pf_percent') if ((categories['BASIC']) < 15000) else -(1800/total_days) * total_worked_days + + + + + + ATTACH_SALARY + Attachment of Salary + + + python + result = 'ATTACH_SALARY' in inputs + code + +result = -inputs['ATTACH_SALARY'].amount +result_name = inputs['ATTACH_SALARY'].name + + + + + + ASSIG_SALARY + Assignment of Salary + + + code + python + result = 'ASSIG_SALARY' in inputs + +result = -inputs['ASSIG_SALARY'].amount +result_name = inputs['ASSIG_SALARY'].name + + + + + Expenses Reimbursement + EXPENSES + + + python + result = inputs['EXPENSES'].amount > 0.0 if 'EXPENSES' in inputs else False + code + +result = inputs['EXPENSES'].amount +result_name = inputs['EXPENSES'].name + + + + + + + + + + diff --git a/addons_extensions/l10n_in_hr_payroll/data/salary_rules/hr_salary_rule_stipend_data.xml b/addons_extensions/l10n_in_hr_payroll/data/salary_rules/hr_salary_rule_stipend_data.xml new file mode 100644 index 000000000..460431122 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/data/salary_rules/hr_salary_rule_stipend_data.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + diff --git a/addons_extensions/l10n_in_hr_payroll/data/salary_rules/hr_salary_rule_worker_data.xml b/addons_extensions/l10n_in_hr_payroll/data/salary_rules/hr_salary_rule_worker_data.xml new file mode 100644 index 000000000..7709ab313 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/data/salary_rules/hr_salary_rule_worker_data.xml @@ -0,0 +1,50 @@ + + + + TCA + Transport/Conveyance Allownace + + fix + + + A conveyance allowance refers to an amount of money reimbursed to someone for the operation of a vehicle or the riding of a vehicle. The allowance is typically a designated amount or percentage of total transportation expenses that is referenced in a country's tax laws or code. Organizations and private or public businesses may also offer a conveyance allowance in addition to reimbursing employees or members for transportation expenses. In this instance, the conveyance allowance may identify an unusual transport occurrence that may not be covered by a designated travel expense report such as travel to a specific job site that requires a daily bus or taxi ride. + + + + + SA + Special + + python + result = bool(contract.l10n_in_supplementary_allowance) + code + result = contract.l10n_in_supplementary_allowance + + This allowance is normally given as an additional benefit to worker and is fully taxable. + + + + + PTD + Professional Tax + + python + result = categories['GROSS'] >= 3000 + code + +amounts = payslip._rule_parameter('l10n_in_professional_tax') +if categories['GROSS'] >= 12000: + result = amounts[0] +elif categories['GROSS'] >= 9000 and categories < 11999: + result = amounts[1] +elif categories['GROSS'] >= 6000 and categories['GROSS'] <= 8999: + result = amounts[2] +else: + result = 0 + + + + Workers living in states that impose the professional tax must submit a payment each half-year for the right to practice a profession or trade. It applies equally to employees who work for the national or state government, and those employed by private corporations. The professional tax uses a six-month accounting system, which divides the year into two periods, beginning on April 1 and October 1. + + + diff --git a/addons_extensions/l10n_in_hr_payroll/i18n/l10n_in_hr_payroll.pot b/addons_extensions/l10n_in_hr_payroll/i18n/l10n_in_hr_payroll.pot new file mode 100644 index 000000000..149c5d733 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/i18n/l10n_in_hr_payroll.pot @@ -0,0 +1,26 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * l10n_in_hr_payroll +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server saas~16.2\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-06-05 06:08+0000\n" +"PO-Revision-Date: 2023-06-05 06:08+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_in_hr_payroll +#: model_terms:ir.ui.view,arch_db:l10n_in_hr_payroll.report_payslip_details_template +msgid "Employee Code" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model_terms:ir.ui.view,arch_db:l10n_in_hr_payroll.report_payslip_details_template +msgid "Joining Date" +msgstr "" diff --git a/addons_extensions/l10n_in_hr_payroll/models/__init__.py b/addons_extensions/l10n_in_hr_payroll/models/__init__.py new file mode 100644 index 000000000..fe3977d69 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/models/__init__.py @@ -0,0 +1,10 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import hr_employee +from . import res_users +from . import hr_contract +from . import hr_payslip +from . import hr_payslip_run +from . import res_company +from . import res_config_settings +from . import l10n_in_salary_statement diff --git a/addons_extensions/l10n_in_hr_payroll/models/hr_contract.py b/addons_extensions/l10n_in_hr_payroll/models/hr_contract.py new file mode 100644 index 000000000..7fea3230b --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/models/hr_contract.py @@ -0,0 +1,47 @@ +# -*- coding:utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from datetime import timedelta +from odoo import api, fields, models, _ + + +class HrContract(models.Model): + """ + Employee contract allows to add different values in fields. + Fields are used in salary rule computation. + """ + _inherit = 'hr.contract' + + l10n_in_tds = fields.Float(string='TDS', digits='Payroll', + help='Amount for Tax Deduction at Source') + l10n_in_driver_salay = fields.Boolean(string='Driver Salary', help='Check this box if you provide allowance for driver') + l10n_in_medical_insurance = fields.Float(string='Medical Insurance', digits='Payroll', + help='Deduction towards company provided medical insurance') + l10n_in_provident_fund = fields.Boolean(string='Provident Fund', default=False, + help='Check this box if you contribute for PF') + l10n_in_voluntary_provident_fund = fields.Float(string='Voluntary Provident Fund (%)', digits='Payroll', + help='VPF is a safe option wherein you can contribute more than the PF ceiling of 12% that has been mandated by the government and VPF computed as percentage(%)') + l10n_in_house_rent_allowance_metro_nonmetro = fields.Float(string='House Rent Allowance (%)', digits='Payroll', + help='HRA is an allowance given by the employer to the employee for taking care of his rental or accommodation expenses for metro city it is 50% and for non metro 40%. \nHRA computed as percentage(%)') + l10n_in_supplementary_allowance = fields.Float(string='Supplementary Allowance', digits='Payroll') + l10n_in_gratuity = fields.Float(string='Gratuity') + l10n_in_esic_amount = fields.Float(string='ESIC Amount', digits='Payroll', + help='Deduction towards company provided ESIC Amount') + l10n_in_leave_allowance = fields.Float(string='Leave Allowance', digits='Payroll', + help='Deduction towards company provided Leave Allowance') + + @api.model + def update_state(self): + contract_type_id = self.env.ref('l10n_in_hr_payroll.l10n_in_contract_type_probation', raise_if_not_found=False) + if contract_type_id: + one_week_ago = fields.Date.today() - timedelta(weeks=1) + contracts = self.env['hr.contract'].search([ + ('date_end', '=', one_week_ago), ('state', '=', 'open'), ('contract_type_id', '=', contract_type_id.id) + ]) + for contract in contracts: + contract.activity_schedule( + 'note.mail_activity_data_reminder', + user_id=contract.hr_responsible_id.id, + note=_("End date of %(name)s's contract is today.", name=contract.employee_id.name), + ) + return super().update_state() diff --git a/addons_extensions/l10n_in_hr_payroll/models/hr_employee.py b/addons_extensions/l10n_in_hr_payroll/models/hr_employee.py new file mode 100644 index 000000000..4d2f352e3 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/models/hr_employee.py @@ -0,0 +1,24 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +import re + +from odoo import fields, models + + +class HrEmployee(models.Model): + _inherit = 'hr.employee' + + l10n_in_uan = fields.Char(string='UAN', groups="hr.group_hr_user") + l10n_in_pan = fields.Char(string='PAN', groups="hr.group_hr_user") + l10n_in_esic_number = fields.Char(string='ESIC Number', groups="hr.group_hr_user") + l10n_in_relationship = fields.Char("Relationship", groups="hr.group_hr_user", tracking=True) + l10n_in_residing_child_hostel = fields.Integer("Child Residing in hostel", groups="hr.group_hr_user", tracking=True) + + _sql_constraints = [ + ('unique_l10n_in_uan', 'unique (l10n_in_uan)', 'This UAN already exists'), + ('unique_l10n_in_pan', 'unique (l10n_in_pan)', 'This PAN already exists'), + ('unique_l10n_in_esic_number', 'unique (l10n_in_esic_number)', 'This ESIC Number already exists'), + ] + + def _get_employees_with_invalid_ifsc(self): + return self.filtered(lambda emp: not bool(re.match("^[A-Z]{4}0[A-Z0-9]{6}$", emp.bank_account_id.bank_bic))) diff --git a/addons_extensions/l10n_in_hr_payroll/models/hr_payslip.py b/addons_extensions/l10n_in_hr_payroll/models/hr_payslip.py new file mode 100644 index 000000000..8a59108e2 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/models/hr_payslip.py @@ -0,0 +1,57 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from datetime import datetime, time + +from odoo import api, models, _ +from odoo.tools import format_date, date_utils + + +class HrPayslip(models.Model): + _inherit = 'hr.payslip' + + def _get_l10n_in_company_working_time(self, return_hours=False): + self.ensure_one() + slip_date_time = datetime.combine(self.date_from, time(12, 0, 0)) + company_work_data = self.company_id.resource_calendar_id.get_work_duration_data( + date_utils.start_of(slip_date_time, 'month'), + date_utils.end_of(slip_date_time, 'month')) + if return_hours: + return company_work_data['hours'] + return company_work_data['days'] + + @api.depends('employee_id', 'struct_id', 'date_from') + def _compute_name(self): + super()._compute_name() + for slip in self.filtered(lambda s: s.country_code == 'IN'): + lang = slip.employee_id.lang or self.env.user.lang + payslip_name = slip.struct_id.payslip_name or _('Salary Slip') + date = format_date(self.env, slip.date_from, date_format="MMMM y", lang_code=lang) + if slip.number: + slip.name = '%(payslip_name)s - %(slip_ref)s - %(dates)s' % { + 'slip_ref': slip.number, + 'payslip_name': payslip_name, + 'dates': date + } + else: + slip.name = '%(payslip_name)s - %(dates)s' % { + 'payslip_name': payslip_name, + 'dates': date + } + + def _get_data_files_to_update(self): + # Note: file order should be maintained + return super()._get_data_files_to_update() + [( + 'l10n_in_hr_payroll', [ + 'data/hr_salary_rule_category_data.xml', + 'data/hr_payroll_structure_type_data.xml', + 'data/hr_rule_parameters_data.xml', + 'data/salary_rules/hr_salary_rule_ind_emp_data.xml', + 'data/salary_rules/hr_salary_rule_regular_pay_data.xml', + 'data/salary_rules/hr_salary_rule_worker_data.xml', + ])] + + def _get_base_local_dict(self): + return {**super()._get_base_local_dict(), '_': self.env._} + + def _get_employee_timeoff_data(self): + return self.env['hr.leave.type'].with_company(self.company_id).with_context(employee_id=self.employee_id.id).get_allocation_data_request() diff --git a/addons_extensions/l10n_in_hr_payroll/models/hr_payslip_run.py b/addons_extensions/l10n_in_hr_payroll/models/hr_payslip_run.py new file mode 100644 index 000000000..28b5e5af7 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/models/hr_payslip_run.py @@ -0,0 +1,26 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import fields, models, _ + + +class HrPayslipRun(models.Model): + _inherit = 'hr.payslip.run' + + def action_payment_report(self, export_format='advice'): + self.ensure_one() + return { + 'name': _('Create Payment'), + 'type': 'ir.actions.act_window', + 'res_model': 'hr.payroll.payment.report.wizard', + 'view_mode': 'form', + 'view_id': 'hr_payslip_payment_report_view_form', + 'views': [(False, 'form')], + 'target': 'new', + 'context': { + 'default_payslip_ids': self.slip_ids.ids, + 'default_payslip_run_id': self.id, + 'default_export_format': export_format, + 'default_date': self.date_end, + 'dialog_size': 'medium', + }, + } diff --git a/addons_extensions/l10n_in_hr_payroll/models/l10n_in_salary_statement.py b/addons_extensions/l10n_in_hr_payroll/models/l10n_in_salary_statement.py new file mode 100644 index 000000000..0fd72f265 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/models/l10n_in_salary_statement.py @@ -0,0 +1,107 @@ +import calendar + +from odoo import api, fields, models, Command, _ +from dateutil.relativedelta import relativedelta +from collections import defaultdict +from datetime import datetime + + +class L10nInSalaryStatement(models.Model): + _name = 'l10n_in_hr_payroll.salary.statement' + _inherit = 'hr.payroll.declaration.mixin' + _description = 'Salary Statement Report' + + name = fields.Char(string="Description", required=True, compute='_compute_name', readonly=False, store=True) + month = fields.Selection([ + ('1', 'January'), + ('2', 'February'), + ('3', 'March'), + ('4', 'April'), + ('5', 'May'), + ('6', 'June'), + ('7', 'July'), + ('8', 'August'), + ('9', 'September'), + ('10', 'October'), + ('11', 'November'), + ('12', 'December'), + ], required=True, default=lambda self: str((fields.Date.today() + relativedelta(months=-1)).month)) + + def default_get(self, fields_list): + res = super().default_get(fields_list) + res['year'] = str(datetime.now().year) + return res + + @api.depends('year', 'month') + def _compute_name(self): + for sheet in self: + month_name = calendar.month_name[int(sheet.month)] + sheet.name = _('Salary Statement - %(month)s, %(year)s', month=month_name, year=sheet.year) + + def action_generate_declarations(self): + for sheet in self: + date_from = datetime(int(sheet.year), int(sheet.month), 1) + date_to = date_from + relativedelta(months=1, days=-1) + employees = self.env['hr.payslip'].search([ + ('date_to', '<=', date_to), + ('date_from', '>=', date_from), + ('state', 'in', ['done', 'paid']), + ('company_id', '=', sheet.company_id.id), + ]).mapped('employee_id') + + sheet.write({ + 'line_ids': [Command.clear()] + [Command.create({ + 'employee_id': employee.id, + 'res_model': 'l10n_in_hr_payroll.salary.statement', + 'res_id': sheet.id, + }) for employee in employees] + }) + return super().action_generate_declarations() + + def _country_restriction(self): + return 'IN' + + def _get_pdf_report(self): + return self.env.ref('l10n_in_hr_payroll.action_report_salary_statement') + + def _get_rendering_data(self, employees): + self.ensure_one() + date_from = datetime(int(self.year), int(self.month), 1) + date_to = date_from + relativedelta(months=1) + payslips = self.env['hr.payslip'].search([ + ('employee_id', 'in', employees.ids), + ('state', 'in', ['done', 'paid']), + ('date_from', '>=', date_from), + ('date_to', '<=', date_to), + ]) + + result = defaultdict(lambda: { + 'month': calendar.month_name[int(self.month)], + 'year': self.year, + 'allow_rules': defaultdict(lambda: {'name': '', 'total': 0, 'total_annual': 0}), + 'deduct_rules': defaultdict(lambda: {'name': '', 'total': 0, 'total_annual': 0}), + 'ctc': 0, + 'ctc_annual': 0 + }) + + for line in payslips.line_ids.filtered(lambda l: l.salary_rule_id.appears_on_payslip): + employee_id = line.employee_id + rule_category = result[employee_id]['deduct_rules' if line.total < 0 else 'allow_rules'][line.salary_rule_id] + + rule_category['name'] = line.salary_rule_id.name + rule_category['total'] = line.total + rule_category['total_annual'] = line.total * 12 + + if line.code == 'GROSS' or line.total < 0: + total = abs(line.total) + result[employee_id]['ctc'] += total + result[employee_id]['ctc_annual'] += total * 12 + result[employee_id]['date'] = line.date_from.strftime('%d/%m/%Y') + + result = dict(result) + return result + + def _get_pdf_filename(self, employee): + self.ensure_one() + month_name = calendar.month_name[int(self.month)] + return _('%(employee_name)s-salary-statement-report-%(month)s-%(year)s', employee_name=employee.name, month=month_name, year=self.year) diff --git a/addons_extensions/l10n_in_hr_payroll/models/res_company.py b/addons_extensions/l10n_in_hr_payroll/models/res_company.py new file mode 100644 index 000000000..c39f14032 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/models/res_company.py @@ -0,0 +1,16 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import fields, models + +class ResCompany(models.Model): + _inherit = 'res.company' + + l10n_in_dearness_allowance = fields.Boolean(string='Dearness Allowance', default=True, + help='Check this box if your company provide Dearness Allowance to employee') + l10n_in_epf_employer_id = fields.Char(string="EPF Employer ID", + help="Code of 10 numbers. The first seven numbers represent the establishment ID.\n Next three numbers represent the extension code.") + l10n_in_esic_ip_number = fields.Char(string="ESIC IP Number", + help="Code of 17 digits.\n The Identification number is assigned to the company if registered under the Indian provisions of the Employee\'s State Insurance (ESI) Act.") + l10n_in_pt_number = fields.Char(string="PT Number", + help="Code of 11 digit.\n The P TIN digit number with the first two digits indicating the State.") + l10n_in_is_statutory_compliance = fields.Boolean(string="Statutory Compliance") diff --git a/addons_extensions/l10n_in_hr_payroll/models/res_config_settings.py b/addons_extensions/l10n_in_hr_payroll/models/res_config_settings.py new file mode 100644 index 000000000..f799311f2 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/models/res_config_settings.py @@ -0,0 +1,14 @@ +# 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' + + l10n_in_dearness_allowance = fields.Boolean( + string="Dearness Allowance", related='company_id.l10n_in_dearness_allowance', readonly=False) + l10n_in_epf_employer_id = fields.Char(related='company_id.l10n_in_epf_employer_id', readonly=False) + l10n_in_esic_ip_number = fields.Char(related='company_id.l10n_in_esic_ip_number', readonly=False) + l10n_in_pt_number = fields.Char(related='company_id.l10n_in_pt_number', readonly=False) + l10n_in_is_statutory_compliance = fields.Boolean(related='company_id.l10n_in_is_statutory_compliance', readonly=False) diff --git a/addons_extensions/l10n_in_hr_payroll/models/res_users.py b/addons_extensions/l10n_in_hr_payroll/models/res_users.py new file mode 100644 index 000000000..7cc8e695b --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/models/res_users.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import fields, models + +class User(models.Model): + _inherit = 'res.users' + + l10n_in_relationship = fields.Char(related='employee_id.l10n_in_relationship', readonly=False, related_sudo=False) + + @property + def SELF_READABLE_FIELDS(self): + return super().SELF_READABLE_FIELDS + ['l10n_in_relationship'] + + @property + def SELF_WRITEABLE_FIELDS(self): + return super().SELF_WRITEABLE_FIELDS + ['l10n_in_relationship'] diff --git a/addons_extensions/l10n_in_hr_payroll/report/__init__.py b/addons_extensions/l10n_in_hr_payroll/report/__init__.py new file mode 100644 index 000000000..495a2479c --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/report/__init__.py @@ -0,0 +1,6 @@ +# -*- coding:utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import report_payroll_advice +from . import report_hr_yearly_salary_detail +from . import report_hr_epf diff --git a/addons_extensions/l10n_in_hr_payroll/report/report_hr_epf.py b/addons_extensions/l10n_in_hr_payroll/report/report_hr_epf.py new file mode 100644 index 000000000..e735a7c07 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/report/report_hr_epf.py @@ -0,0 +1,149 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +import base64 +import io +import calendar +from odoo import api, fields, models +from odoo.tools.misc import xlsxwriter + +MONTH_SELECTION = [ + ('1', 'January'), + ('2', 'February'), + ('3', 'March'), + ('4', 'April'), + ('5', 'May'), + ('6', 'June'), + ('7', 'July'), + ('8', 'August'), + ('9', 'September'), + ('10', 'October'), + ('11', 'November'), + ('12', 'December'), +] + + +class HrEPFReport(models.Model): + _name = 'l10n.in.hr.payroll.epf.report' + _description = 'Indian Payroll: Employee Provident Fund Report' + + month = fields.Selection(MONTH_SELECTION, default='1', required=True) + year = fields.Integer(required=True, default=lambda self: fields.Date.context_today(self).year) + xls_file = fields.Binary(string="XLS file") + xls_filename = fields.Char() + + @api.depends('month', 'year') + def _compute_display_name(self): + month_description = dict(self._fields['month']._description_selection(self.env)) + for report in self: + report.display_name = f"{month_description.get(report.month)}-{report.year}" + + @api.model + def _get_employee_pf_data(self, year, month): + # Get the relevant records based on the year and month + indian_employees = self.env['hr.employee'].search([('contract_id.l10n_in_provident_fund', '=', True)]).filtered(lambda e: e.company_country_code == 'IN') + + result = [] + end_date = calendar.monthrange(year, int(month))[1] + + payslips = self.env['hr.payslip'].search([ + ('employee_id', 'in', indian_employees.ids), + ('date_from', '>=', f'{year}-{month}-1'), + ('date_to', '<=', f'{year}-{month}-{end_date}'), + ('state', 'in', ('done', 'paid')) + ]) + + if not payslips: + return [] + + payslip_line_values = payslips._get_line_values(['GROSS', 'BASIC', 'PF']) + + for employee in indian_employees: + + wage = 0 + epf = 0 + eps = 0 + epf_contri = 0 + + payslip_ids = payslips.filtered(lambda p: p.employee_id == employee) + + if not payslip_ids: + continue + + for payslip in payslip_ids: + pf_value = payslip_line_values['PF'][payslip.id]['total'] + if pf_value == 0: + continue + + epf_contri -= pf_value + wage += payslip_line_values['GROSS'][payslip.id]['total'] + epf += payslip_line_values['BASIC'][payslip.id]['total'] + + # Skip the employee if there are no valid PF contributions + if epf_contri == 0: + continue + + # Calculate contributions and differences + eps = min(payslip_ids[0]._rule_parameter('l10n_in_pf_amount'), epf) + eps_contri = round(eps * payslip_ids[0]._rule_parameter('l10n_in_eps_contri_percent'), 2) + diff = round(epf_contri - eps_contri, 2) + + result.append(( + employee.l10n_in_uan, + employee.name, + wage, + epf, + eps, + eps, + epf_contri, + eps_contri, + diff, + 0, 0, + )) + + return result + + def action_export_xlsx(self): + self.ensure_one() + + output = io.BytesIO() + workbook = xlsxwriter.Workbook(output, {'in_memory': True}) + worksheet = workbook.add_worksheet('Employee_provident_fund_report') + style_highlight = workbook.add_format({'bold': True, 'pattern': 1, 'bg_color': '#E0E0E0', 'align': 'center'}) + style_normal = workbook.add_format({'align': 'center', 'font_size': 12}) + row = 0 + worksheet.set_row(row, 20) + + headers = [ + "UAN", + "MEMBER NAME", + "GROSS WAGES", + "EPF WAGES", + "EPS WAGES", + "EDLI WAGES", + "EPF CONTRIBUTION REMITTED", + "EPS CONTRIBUTION REMITTED", + "EPF EPS DIFFERENCE REMITTED", + "NCP DAYS", + "REFUNDED OF ADVANCES" + ] + + rows = self._get_employee_pf_data(self.year, self.month) + + for col, header in enumerate(headers): + worksheet.write(row, col, header, style_highlight) + worksheet.set_column(col, col, 30) + + row = 1 + for data_row in rows: + col = 0 + worksheet.set_row(row, 20) + for data in data_row: + worksheet.write(row, col, data, style_normal) + col += 1 + row += 1 + + workbook.close() + xlsx_data = output.getvalue() + + self.xls_file = base64.encodebytes(xlsx_data) + self.xls_filename = f"{self.display_name} EPF Report.xlsx" diff --git a/addons_extensions/l10n_in_hr_payroll/report/report_hr_yearly_salary_detail.py b/addons_extensions/l10n_in_hr_payroll/report/report_hr_yearly_salary_detail.py new file mode 100644 index 000000000..a12f3f8b6 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/report/report_hr_yearly_salary_detail.py @@ -0,0 +1,149 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from datetime import date +from dateutil.relativedelta import relativedelta + + +from odoo import api, fields, models, _ +from odoo.tools import SQL +from odoo.exceptions import UserError + +class EmployeesYearlySalaryReport(models.AbstractModel): + _name = 'report.l10n_in_hr_payroll.report_hryearlysalary' + _description = "Indian Yearly Salary Report" + + # YTI: This mess deserves a good cleaning + + def _get_periods_new(self, form): + months = [] + # Get start year-month-date and end year-month-date + first_year = int(form['year']) + first_month = 1 + + # Get name of the months from integer + month_name = [] + for count in range(0, 12): + m = date(first_year, first_month, 1).strftime('%b') + month_name.append(m) + months.append(f"{first_month:02d}-{first_year}") + if first_month == 12: + first_month = 0 + first_year += 1 + first_month += 1 + return [month_name], months + + def _get_employee(self, form): + return self.env['hr.employee'].browse(form.get('employee_ids', [])) + + def _get_employee_detail_new(self, form, employee_id, months, date_from, date_to): + structures_data = {} + payslip_lines = self._cal_monthly_amt(form, employee_id, months, date_from, date_to) + for structure_name, payslip_data in payslip_lines.items(): + allow_list = [] + deduct_list = [] + total = 0.0 + gross = False + net = False + for line in payslip_data: + code = line[0] + subline = line[1:] + if code == "GROSS": + gross = [code, subline] + elif code == "NET": + net = [code, subline] + elif subline[-1] > 0.0 and code != "NET": + total += subline[-1] + allow_list.append([code, subline]) + elif subline[-1] < 0.0: + total += subline[-1] + deduct_list.append([code, subline]) + + if gross: + allow_list.append(gross) + if net: + deduct_list.append(net) + + structures_data[structure_name] = { + 'allow_list': allow_list, + 'deduct_list': deduct_list, + 'total': total, + } + + return structures_data + + def _cal_monthly_amt(self, form, emp_id, months, date_from, date_to): + result = {} + salaries = {} + + self.env.cr.execute(SQL( + """ + SELECT src.code, pl.name, sum(pl.total), to_char(p.date_to,'mm-yyyy') as to_date, ps.name + FROM hr_payslip_line as pl + LEFT JOIN hr_salary_rule AS sr on sr.id = pl.salary_rule_id + LEFT JOIN hr_salary_rule_category AS src on (sr.category_id = src.id) + LEFT JOIN hr_payslip as p on pl.slip_id = p.id + LEFT JOIN hr_employee as e on e.id = p.employee_id + LEFT JOIN hr_payroll_structure as ps on ps.id = p.struct_id + WHERE p.employee_id = %(employee_id)s + AND p.state = 'paid' + AND p.date_from >= %(date_from)s AND p.date_to <= %(date_to)s + GROUP BY src.parent_id, pl.sequence, pl.id, sr.category_id, pl.name, p.date_to, src.code, ps.name + ORDER BY pl.sequence, src.parent_id + """, employee_id=emp_id, date_from=date_from, date_to=date_to + )) + + for category_code, item_name, amount, payslip_date, structure_name in self.env.cr.fetchall(): + salaries.setdefault(structure_name, {}).setdefault(category_code, {}).setdefault(item_name, {}).setdefault(payslip_date, 0.0) + salaries[structure_name][category_code][item_name][payslip_date] += amount + + result = {key: self.salary_list(value, months) for key, value in salaries.items()} + return result + + def salary_list(self, salaries, months): + cat_salary_all = [] + for code, category_amount in salaries.items(): + for category_name, amount in category_amount.items(): + cat_salary = [code, category_name] + total = 0.0 + for month in months: + if month != 'None': + if len(month) != 7: + month = '0' + str(month) + if amount.get(month): + cat_salary.append(amount[month]) + total += amount[month] + else: + cat_salary.append(0.00) + else: + cat_salary.append('') + cat_salary.append(total) + cat_salary_all.append(cat_salary) + return cat_salary_all + + @api.model + def _get_report_values(self, docids, data=None): + if not self.env.context.get('active_model') or not self.env.context.get('active_id'): + raise UserError(_("Form content is missing, this report cannot be printed.")) + + model = self.env.context.get('active_model') + docs = self.env[model].browse(self.env.context.get('active_id')) + employees = self._get_employee(data['form']) + month_name, months = self._get_periods_new(data['form']) + date_from = fields.Date.today() + relativedelta(day=1, month=1, year=int(data['form']['year'])) + date_to = fields.Date.today() + relativedelta(day=31, month=12, year=int(data['form']['year'])) + + employee_data = {} + for employee in employees: + structures_data = self._get_employee_detail_new(data['form'], employee.id, months, date_from, date_to) + employee_data[employee.id] = structures_data + return { + 'doc_ids': docids, + 'doc_model': model, + 'data': data, + 'docs': docs, + 'date_from': date_from, + 'date_to': date_to, + 'get_employee': self._get_employee, + 'get_periods': lambda form: month_name, + 'get_employee_detail_new': lambda emp_id: employee_data.get(emp_id, {}), + } diff --git a/addons_extensions/l10n_in_hr_payroll/report/report_payroll_advice.py b/addons_extensions/l10n_in_hr_payroll/report/report_payroll_advice.py new file mode 100644 index 000000000..164384c4f --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/report/report_payroll_advice.py @@ -0,0 +1,34 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +import time + +from odoo import api, models + + +class payroll_advice_report(models.AbstractModel): + _name = 'report.l10n_in_hr_payroll.report_payrolladvice' + _description = "Indian Payroll Advice Report" + + def get_month(self, input_date): + res = { + 'from_name': '', 'to_name': '' + } + slip = self.env['hr.payslip'].search([('date_from', '<=', input_date), ('date_to', '>=', input_date)], limit=1) + if slip: + from_date = slip.date_from + to_date = slip.date_to + res['from_name'] = from_date.strftime('%d') + '-' + from_date.strftime('%B') + '-' + from_date.strftime('%Y') + res['to_name'] = to_date.strftime('%d') + '-' + to_date.strftime('%B') + '-' + to_date.strftime('%Y') + return res + + @api.model + def _get_report_values(self, docids, data=None): + payment_report = self.env['hr.payroll.payment.report.wizard'].browse(docids) + return { + 'doc_ids': docids, + 'doc_model': 'hr.payroll.payment.report.wizard', + 'data': data, + 'docs': payment_report, + 'time': time, + 'get_month': self.get_month, + } diff --git a/addons_extensions/l10n_in_hr_payroll/security/ir.model.access.csv b/addons_extensions/l10n_in_hr_payroll/security/ir.model.access.csv new file mode 100644 index 000000000..9a1946dc0 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/security/ir.model.access.csv @@ -0,0 +1,6 @@ +"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" +"access_yearly_salary_detail_user","yearly.salary.detail","model_yearly_salary_detail","hr_payroll.group_hr_payroll_user",1,1,1,0 +l10n_in_hr_payroll.access_salary_register_wizard,access_salary_register_wizard,l10n_in_hr_payroll.model_salary_register_wizard,hr_payroll.group_hr_payroll_user,1,1,1,1 +l10n_in_hr_payroll.access_l10n_in_tds_computation_wizard,access_l10n_in_tds_computation_wizard,l10n_in_hr_payroll.model_l10n_in_tds_computation_wizard,base.group_user,1,1,1,0 +access_report_l10n_in_hr_payroll_report_epf,report.l10n_in_hr_payroll.report_epf,model_l10n_in_hr_payroll_epf_report,hr_payroll.group_hr_payroll_user,1,1,1,1 +l10n_in_hr_payroll.access_l10n_in_hr_payroll_salary_statement,access_l10n_in_hr_payroll_salary_statement,l10n_in_hr_payroll.model_l10n_in_hr_payroll_salary_statement,"hr_payroll.group_hr_payroll_user",1,1,1,1 diff --git a/addons_extensions/l10n_in_hr_payroll/static/img/hr_employee_alisha_sharma.jpg b/addons_extensions/l10n_in_hr_payroll/static/img/hr_employee_alisha_sharma.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5f3908976b122c3dad2ae009e7c11e662b091544 GIT binary patch literal 40913 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 literal 0 HcmV?d00001 diff --git a/addons_extensions/l10n_in_hr_payroll/static/img/hr_employee_vihaan.jpg b/addons_extensions/l10n_in_hr_payroll/static/img/hr_employee_vihaan.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c5d7d9c73872ffc50b2fb239edc9572c59f3e1a2 GIT binary patch literal 55165 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 Y+(#(60NH;})7sbVj>lq0voSya+4t|r2LJ#7 literal 0 HcmV?d00001 diff --git a/addons_extensions/l10n_in_hr_payroll/tests/__init__.py b/addons_extensions/l10n_in_hr_payroll/tests/__init__.py new file mode 100644 index 000000000..e275ab870 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/tests/__init__.py @@ -0,0 +1,4 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import test_payment_advice_batch +from . import test_hr_contract diff --git a/addons_extensions/l10n_in_hr_payroll/tests/common.py b/addons_extensions/l10n_in_hr_payroll/tests/common.py new file mode 100644 index 000000000..eda93ec02 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/tests/common.py @@ -0,0 +1,88 @@ +# -*- coding:utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from datetime import date + +from odoo.tests.common import TransactionCase +from odoo.tests import tagged + + +@tagged('post_install_l10n', 'post_install', '-at_install') +class TestPayrollCommon(TransactionCase): + + def setUp(self): + super(TestPayrollCommon, self).setUp() + + self.Bank = self.env['res.partner.bank'] + self.Employee = self.env['hr.employee'] + self.PayslipRun = self.env['hr.payslip.run'] + self.PayslipEmployee = self.env['hr.payslip.employees'] + self.Company = self.env['res.company'] + self.partner = self.env.ref('base.partner_admin') + self.bank_1 = self.env.ref('base.res_bank_1') + self.in_country = self.env.ref('base.in') + self.rd_dept = self.env.ref('hr.dep_rd') + self.employee_fp = self.env.ref('hr.employee_admin') + self.employee_al = self.env.ref('hr.employee_al') + + self.company_in = self.Company.create({ + 'name': 'Company IN', + 'country_code': 'IN', + }) + + self.in_bank = self.env['res.bank'].create({ + 'name': 'Bank IN', + 'bic': 'ABCD0123456' + }) + + # I create a new employee “Rahul” + self.rahul_emp = self.Employee.create({ + 'name': 'Rahul', + 'country_id': self.in_country.id, + 'department_id': self.rd_dept.id, + }) + + # I create a new employee “Rahul” + self.jethalal_emp = self.Employee.create({ + 'name': 'Jethalal', + 'country_id': self.in_country.id, + 'department_id': self.rd_dept.id, + }) + + self.res_bank = self.Bank.create({ + 'acc_number': '3025632343043', + 'partner_id': self.rahul_emp.work_contact_id.id, + 'acc_type': 'bank', + 'bank_id': self.in_bank.id, + 'allow_out_payment': True, + }) + self.rahul_emp.bank_account_id = self.res_bank + + self.res_bank_1 = self.Bank.create({ + 'acc_number': '3025632343044', + 'partner_id': self.jethalal_emp.work_contact_id.id, + 'acc_type': 'bank', + 'bank_id': self.in_bank.id, + 'allow_out_payment': True, + }) + self.jethalal_emp.bank_account_id = self.res_bank_1 + + self.contract_rahul = self.env['hr.contract'].create({ + 'date_start': date(2023, 1, 1), + 'date_end': date(2023, 1, 31), + 'name': 'Rahul Probation contract', + 'wage': 5000.0, + 'employee_id': self.rahul_emp.id, + 'state': 'open', + 'hr_responsible_id': self.employee_fp.id, + }) + + self.contract_jethalal = self.env['hr.contract'].create({ + 'date_start': date(2023, 1, 1), + 'date_end': date(2023, 1, 31), + 'name': 'Jethalal Probation contract', + 'wage': 5000.0, + 'employee_id': self.jethalal_emp.id, + 'state': 'open', + 'hr_responsible_id': self.employee_fp.id, + }) diff --git a/addons_extensions/l10n_in_hr_payroll/tests/test_hr_contract.py b/addons_extensions/l10n_in_hr_payroll/tests/test_hr_contract.py new file mode 100644 index 000000000..dae2eb72c --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/tests/test_hr_contract.py @@ -0,0 +1,43 @@ +# -*- coding:utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from datetime import date + +from freezegun import freeze_time +from odoo.addons.l10n_in_hr_payroll.tests.common import TestPayrollCommon +from odoo.tests import tagged + + +@tagged('post_install_l10n', 'post_install', '-at_install') +class TestHrContract(TestPayrollCommon): + + def test_contract_end_reminder_to_hr(self): + """ Check reminder activity is set the for probation contract + Test Case + --------- + 1) Create contract + 2) Check the activity is activity schedule or not + 3) Now run cron + 4) Check the activity is activity schedule or not + """ + user_admin_id = self.env.ref('base.user_admin').id + + contract = self.env['hr.contract'].create({ + 'date_start': date(2020, 1, 1), + 'date_end': date(2020, 4, 30), + 'name': 'Rahul Probation contract', + 'resource_calendar_id': self.env.company.resource_calendar_id.id, + 'wage': 5000.0, + 'employee_id': self.rahul_emp.id, + 'state': 'open', + 'contract_type_id': self.env.ref('l10n_in_hr_payroll.l10n_in_contract_type_probation').id, + 'kanban_state': 'done', + 'hr_responsible_id': user_admin_id, + }) + with freeze_time("2020-04-24"): + mail_activity = self.env['mail.activity'].search([('res_id', '=', contract.id), ('res_model', '=', 'hr.contract')]) + self.assertFalse(mail_activity.exists(), "There should be no mail activity as contract is not ends on 2020-04-10") + # run the cron + self.env['hr.contract'].update_state() + mail_activity = self.env['mail.activity'].search([('res_id', '=', contract.id), ('res_model', '=', 'hr.contract')]) + self.assertTrue(mail_activity.exists(), "There should be reminder activity as employee rahul's contract end today") diff --git a/addons_extensions/l10n_in_hr_payroll/tests/test_payment_advice_batch.py b/addons_extensions/l10n_in_hr_payroll/tests/test_payment_advice_batch.py new file mode 100644 index 000000000..a2236c129 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/tests/test_payment_advice_batch.py @@ -0,0 +1,62 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import Command +from odoo.addons.l10n_in_hr_payroll.tests.common import TestPayrollCommon +from odoo.tests import tagged + + +@tagged('post_install_l10n', 'post_install', '-at_install') +class TestPaymentAdviceBatch(TestPayrollCommon): + def _prepare_payslip_run(self): + payslip_run = self.env['hr.payslip.run'].create({ + 'date_start': '2023-01-01', + 'date_end': '2023-01-31', + 'name': 'January Batch', + 'company_id': self.company_in.id, + }) + + payslip_employee = self.env['hr.payslip.employees'].with_company(self.company_in).create({ + 'employee_ids': [ + Command.set([self.rahul_emp.id, self.jethalal_emp.id]) + ] + }) + + payslip_employee.with_context(active_id=payslip_run.id).compute_sheet() + payslip_run.action_validate() + return payslip_run + + def test_payment_report_advice_xlsx_creation(self): + payslip_run = self._prepare_payslip_run() + self.assertEqual(payslip_run.state, "close", "Payslip run should be in Done state") + + # Generating the XLSX report for the batch + payment_report_dict = self.env["hr.payroll.payment.report.wizard"].create({ + 'payslip_ids': payslip_run.slip_ids.ids, + 'payslip_run_id': payslip_run.id, + 'export_format': 'advice', + }).generate_payment_report_xls() + + payment_report = self.env['hr.payroll.payment.report.wizard'].browse(payment_report_dict['res_id']) + + self.assertTrue(payslip_run.payment_report, "XLSX File should be generated!") + self.assertTrue(payment_report.l10n_in_payment_advice_xlsx, "XLSX File should be generated!") + self.assertEqual(payment_report.l10n_in_payment_advice_filename_xlsx, payment_report.l10n_in_reference + '.xlsx') + self.assertTrue(payslip_run.payment_report_filename) + + def test_payment_report_advice_pdf_creation(self): + payslip_run = self._prepare_payslip_run() + self.assertEqual(payslip_run.state, "close", "Payslip run should be in Done state") + + # Generating the PDF report for the batch + payment_report_dict = self.env["hr.payroll.payment.report.wizard"].create({ + 'payslip_ids': payslip_run.slip_ids.ids, + 'payslip_run_id': payslip_run.id, + 'export_format': 'advice', + }).generate_payment_report_pdf() + + payment_report = self.env['hr.payroll.payment.report.wizard'].browse(payment_report_dict['res_id']) + + self.assertTrue(payslip_run.payment_report, "PDF File should be generated!") + self.assertTrue(payment_report.l10n_in_payment_advice_pdf, "PDF File should be generated!") + self.assertEqual(payment_report.l10n_in_payment_advice_filename_pdf, payment_report.l10n_in_reference + '.pdf') + self.assertTrue(payslip_run.payment_report_filename) diff --git a/addons_extensions/l10n_in_hr_payroll/views/hr_contract_views.xml b/addons_extensions/l10n_in_hr_payroll/views/hr_contract_views.xml new file mode 100644 index 000000000..61525ffca --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/views/hr_contract_views.xml @@ -0,0 +1,30 @@ + + + + hr.contract.form.in.inherit + hr.contract + + + + + + + + + + + + + + + diff --git a/addons_extensions/l10n_in_hr_payroll/views/hr_employee_views.xml b/addons_extensions/l10n_in_hr_payroll/views/hr_employee_views.xml new file mode 100644 index 000000000..60beb61ec --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/views/hr_employee_views.xml @@ -0,0 +1,25 @@ + + + + + hr.employee.form.in.inherit + hr.employee + + + + + + + + + + + + + + + + + + + diff --git a/addons_extensions/l10n_in_hr_payroll/views/l10n_in_hr_payroll_report.xml b/addons_extensions/l10n_in_hr_payroll/views/l10n_in_hr_payroll_report.xml new file mode 100644 index 000000000..abb5873ff --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/views/l10n_in_hr_payroll_report.xml @@ -0,0 +1,56 @@ + + + + PaySlip Details + hr.payslip + qweb-pdf + l10n_in_hr_payroll.report_payslip + l10n_in_hr_payroll.report_payslip + 'Payslip - %s' % (object.employee_id.name) + + report + + + + PaySlip Details (Light) + hr.payslip + qweb-pdf + l10n_in_hr_payroll.report_light_payslip + l10n_in_hr_payroll.report_light_payslip + 'Payslip - %s' % (object.employee_id.name) + + report + + + + + Advice Report + hr.payroll.payment.report.wizard + qweb-pdf + l10n_in_hr_payroll.report_payrolladvice + l10n_in_hr_payroll.report_payrolladvice + report + + + + Yearly Salary by Employee + yearly.salary.detail + qweb-pdf + l10n_in_hr_payroll.report_hryearlysalary + l10n_in_hr_payroll.report_hryearlysalary + + + report + + + + Salary Statement + hr.employee + qweb-pdf + l10n_in_hr_payroll.report_salary_statement + l10n_in_hr_payroll.report_salary_statement + (object._get_report_base_filename()) + + report + + diff --git a/addons_extensions/l10n_in_hr_payroll/views/l10n_in_salary_statement.xml b/addons_extensions/l10n_in_hr_payroll/views/l10n_in_salary_statement.xml new file mode 100644 index 000000000..e20b244dc --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/views/l10n_in_salary_statement.xml @@ -0,0 +1,45 @@ + + + + l10n_in_hr_payroll.salary.statement.form + l10n_in_hr_payroll.salary.statement + +
+
+
+ +
+ +
+ + + + + +
+
+
+
+ + + Salary Statement Report + ir.actions.act_window + l10n_in_hr_payroll.salary.statement + list,form + + + +
diff --git a/addons_extensions/l10n_in_hr_payroll/views/report_hr_epf_views.xml b/addons_extensions/l10n_in_hr_payroll/views/report_hr_epf_views.xml new file mode 100644 index 000000000..4ae4ba964 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/views/report_hr_epf_views.xml @@ -0,0 +1,54 @@ + + + + + l10n.in.hr.payroll.epf.report + + + + + + + + + + l10n.in.hr.payroll.epf.report + +
+
+
+ + + + + + + + +
+

Generation Complete

+

+ Download the XLSX details file:
+ +

+
+
+
+
+
+ + + EPF Report + l10n.in.hr.payroll.epf.report + list,form + + + + +
diff --git a/addons_extensions/l10n_in_hr_payroll/views/report_hr_yearly_salary_detail_template.xml b/addons_extensions/l10n_in_hr_payroll/views/report_hr_yearly_salary_detail_template.xml new file mode 100644 index 000000000..5d0f6604a --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/views/report_hr_yearly_salary_detail_template.xml @@ -0,0 +1,106 @@ + + + + diff --git a/addons_extensions/l10n_in_hr_payroll/views/report_l10n_in_salary_statement.xml b/addons_extensions/l10n_in_hr_payroll/views/report_l10n_in_salary_statement.xml new file mode 100644 index 000000000..e80c36790 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/views/report_l10n_in_salary_statement.xml @@ -0,0 +1,69 @@ + + + + diff --git a/addons_extensions/l10n_in_hr_payroll/views/report_payroll_advice_template.xml b/addons_extensions/l10n_in_hr_payroll/views/report_payroll_advice_template.xml new file mode 100644 index 000000000..15d7d2a8e --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/views/report_payroll_advice_template.xml @@ -0,0 +1,68 @@ + + + + diff --git a/addons_extensions/l10n_in_hr_payroll/views/report_payslip_details_template.xml b/addons_extensions/l10n_in_hr_payroll/views/report_payslip_details_template.xml new file mode 100644 index 000000000..738013749 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/views/report_payslip_details_template.xml @@ -0,0 +1,122 @@ + + + + + + + + + + + + diff --git a/addons_extensions/l10n_in_hr_payroll/views/res_config_settings_views.xml b/addons_extensions/l10n_in_hr_payroll/views/res_config_settings_views.xml new file mode 100644 index 000000000..4f32bd9ac --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/views/res_config_settings_views.xml @@ -0,0 +1,40 @@ + + + + res.config.settings.view.form.inherit.l10n_in_hr_payroll + res.config.settings + + + +

Indian Localization

+
+
+
+
+ Company Information +
+ Offical Company Information +
+ + + +
+
+
+
+ +
+
+
+
+
+ + + + diff --git a/addons_extensions/l10n_in_hr_payroll/views/res_users_views.xml b/addons_extensions/l10n_in_hr_payroll/views/res_users_views.xml new file mode 100644 index 000000000..e82fef0f8 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/views/res_users_views.xml @@ -0,0 +1,15 @@ + + + + + res.user.preferences.view.form.l10n.in.payroll.inherit + res.users + + + + + + + + + diff --git a/addons_extensions/l10n_in_hr_payroll/wizard/__init__.py b/addons_extensions/l10n_in_hr_payroll/wizard/__init__.py new file mode 100644 index 000000000..6bdea8998 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/wizard/__init__.py @@ -0,0 +1,6 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import hr_yearly_salary_detail +from . import hr_salary_register +from . import hr_tds_calculation +from . import hr_payroll_payment_report_wizard diff --git a/addons_extensions/l10n_in_hr_payroll/wizard/hr_payroll_payment_report.xml b/addons_extensions/l10n_in_hr_payroll/wizard/hr_payroll_payment_report.xml new file mode 100644 index 000000000..d77e14d16 --- /dev/null +++ b/addons_extensions/l10n_in_hr_payroll/wizard/hr_payroll_payment_report.xml @@ -0,0 +1,36 @@ + + + + hr.payroll.payment.advice.report.wizard.form + hr.payroll.payment.report.wizard + + + + + + + + + + + + + + + export_format == 'advice' + + +