From a7ebe61b2fddd2280edec47ab8fe70cc6aacdfda Mon Sep 17 00:00:00 2001 From: ??? Date: Fri, 22 May 2026 11:47:01 +0200 Subject: [PATCH] [IMP] connector_sage: import payslip processes from Sage --- connector_sage/__manifest__.py | 2 + connector_sage/data/ir_cron.xml | 15 +++++ .../data/queue_job_function_data.xml | 13 ++++ connector_sage/models/__init__.py | 1 + .../payroll_sage_payslip_process/__init__.py | 5 ++ .../payroll_sage_payslip_process/adapter.py | 23 +++++++ .../payroll_sage_payslip_process/binder.py | 25 +++++++ .../payroll_sage_payslip_process/binding.py | 53 +++++++++++++++ .../payroll_sage_payslip_process/importer.py | 22 ++++++ .../payroll_sage_payslip_process/mapper.py | 23 +++++++ connector_sage/models/sage_backend/common.py | 24 +++++++ connector_sage/security/ir.model.access.csv | 2 + connector_sage/views/connector_sage_menus.xml | 8 +++ .../payroll_sage_payslip_process_views.xml | 67 +++++++++++++++++++ connector_sage/views/sage_backend_views.xml | 26 +++++++ 15 files changed, 309 insertions(+) create mode 100644 connector_sage/models/payroll_sage_payslip_process/__init__.py create mode 100644 connector_sage/models/payroll_sage_payslip_process/adapter.py create mode 100644 connector_sage/models/payroll_sage_payslip_process/binder.py create mode 100644 connector_sage/models/payroll_sage_payslip_process/binding.py create mode 100644 connector_sage/models/payroll_sage_payslip_process/importer.py create mode 100644 connector_sage/models/payroll_sage_payslip_process/mapper.py create mode 100644 connector_sage/views/payroll_sage_payslip_process_views.xml diff --git a/connector_sage/__manifest__.py b/connector_sage/__manifest__.py index 101db3043..5395fafc7 100644 --- a/connector_sage/__manifest__.py +++ b/connector_sage/__manifest__.py @@ -1,5 +1,6 @@ # Copyright NuoBiT Solutions - Eric Antones # Copyright NuoBiT Solutions - Kilian Niubo +# Copyright 2026 NuoBiT Solutions SL - Deniz Gallo # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) { @@ -27,6 +28,7 @@ "views/hr_employee_views.xml", "views/res_partner_views.xml", "views/payroll_sage_labour_agreement_views.xml", + "views/payroll_sage_payslip_process_views.xml", "views/payroll_sage_payslip_line_views.xml", "views/payroll_sage_payslip_check_views.xml", "views/payroll_sage_payslip_views.xml", diff --git a/connector_sage/data/ir_cron.xml b/connector_sage/data/ir_cron.xml index 91ac070ce..1ca293a8a 100644 --- a/connector_sage/data/ir_cron.xml +++ b/connector_sage/data/ir_cron.xml @@ -29,4 +29,19 @@ code model._scheduler_import_labour_agreements() + + + Sage - Import payslip processes + + + + + 1 + days + -1 + + code + model._scheduler_import_payslip_processes() + diff --git a/connector_sage/data/queue_job_function_data.xml b/connector_sage/data/queue_job_function_data.xml index 4d61a0bc2..a8176f208 100644 --- a/connector_sage/data/queue_job_function_data.xml +++ b/connector_sage/data/queue_job_function_data.xml @@ -1,6 +1,7 @@ + + + import_payslip_processes_since + + + +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) + + +from odoo.addons.component.core import Component + + +class PayrollSagePayslipProcessAdapter(Component): + _name = "sage.payroll.sage.payslip.process.adapter" + _inherit = "sage.adapter" + _apply_on = "sage.payroll.sage.payslip.process" + + _sql = """ + select n.CodigoEmpresa, + n.TipoProceso + from %(schema)s.Historico n + where n.TipoProceso is not null + and n.TipoProceso != '' + group by n.CodigoEmpresa, + n.TipoProceso + """ + + _id = ("CodigoEmpresa", "TipoProceso") diff --git a/connector_sage/models/payroll_sage_payslip_process/binder.py b/connector_sage/models/payroll_sage_payslip_process/binder.py new file mode 100644 index 000000000..efdafd4be --- /dev/null +++ b/connector_sage/models/payroll_sage_payslip_process/binder.py @@ -0,0 +1,25 @@ +# Copyright 2026 NuoBiT Solutions SL - Deniz Gallo +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) + +from odoo.addons.component.core import Component + + +class PayrollSagePayslipProcessBinder(Component): + """Bind records and give odoo/sage ids correspondence + + Binding models are models called ``sage.{normal_model}``, + like ``sage.res.partner`` or ``sage.product.product``. + They are ``_inherits`` of the normal models and contains + the Sage ID, the ID of the Sage Backend and the additional + fields belonging to the Sage instance. + """ + + _name = "sage.payroll.sage.payslip.process.binder" + _inherit = "sage.binder" + + _apply_on = "sage.payroll.sage.payslip.process" + + _external_field = [ + "sage_codigo_empresa", + "sage_tipo_proceso", + ] diff --git a/connector_sage/models/payroll_sage_payslip_process/binding.py b/connector_sage/models/payroll_sage_payslip_process/binding.py new file mode 100644 index 000000000..049b97404 --- /dev/null +++ b/connector_sage/models/payroll_sage_payslip_process/binding.py @@ -0,0 +1,53 @@ +# Copyright 2026 NuoBiT Solutions SL - Deniz Gallo +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) + +from odoo import fields, models + + +class PayrollSagePayslipProcess(models.Model): + _inherit = "payroll.sage.payslip.process" + + sage_bind_ids = fields.One2many( + comodel_name="sage.payroll.sage.payslip.process", + inverse_name="odoo_id", + string="Sage Bindings", + ) + + +class PayrollSagePayslipProcessBinding(models.Model): + _name = "sage.payroll.sage.payslip.process" + _inherit = "sage.binding" + _inherits = {"payroll.sage.payslip.process": "odoo_id"} + _description = "Payslip process binding" + + odoo_id = fields.Many2one( + comodel_name="payroll.sage.payslip.process", + string="Payslip process", + required=True, + ondelete="cascade", + ) + + # composed id + sage_codigo_empresa = fields.Integer(string="CodigoEmpresa", required=True) + sage_tipo_proceso = fields.Char(string="TipoProceso", required=True) + + _sql_constraints = [ + ( + "uniq", + "unique(backend_id, sage_codigo_empresa, sage_tipo_proceso)", + "Payslip process with same ID on Sage already exists.", + ), + ] + + def import_payslip_processes_since(self, backend_record=None, since_date=None): + """Prepare the import of payslip processes modified on Sage""" + filters = { + "CodigoEmpresa": backend_record.sage_company_id, + } + now_fmt = fields.Datetime.now() + self.env["sage.payroll.sage.payslip.process"].import_batch( + backend=backend_record, filters=filters + ) + backend_record.import_payslip_processes_since_date = now_fmt + + return True diff --git a/connector_sage/models/payroll_sage_payslip_process/importer.py b/connector_sage/models/payroll_sage_payslip_process/importer.py new file mode 100644 index 000000000..55d334b08 --- /dev/null +++ b/connector_sage/models/payroll_sage_payslip_process/importer.py @@ -0,0 +1,22 @@ +# Copyright 2026 NuoBiT Solutions SL - Deniz Gallo +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) + + +from odoo.addons.component.core import Component + + +class PayrollSagePayslipProcessBatchImporter(Component): + """Import the Sage Payslip Processes. + + For every payslip process in the list, a delayed job is created. + """ + + _name = "sage.payroll.sage.payslip.process.delayed.batch.importer" + _inherit = "sage.delayed.batch.importer" + _apply_on = "sage.payroll.sage.payslip.process" + + +class PayrollSagePayslipProcessImporter(Component): + _name = "sage.payroll.sage.payslip.process.importer" + _inherit = "sage.importer" + _apply_on = "sage.payroll.sage.payslip.process" diff --git a/connector_sage/models/payroll_sage_payslip_process/mapper.py b/connector_sage/models/payroll_sage_payslip_process/mapper.py new file mode 100644 index 000000000..daddc6d1e --- /dev/null +++ b/connector_sage/models/payroll_sage_payslip_process/mapper.py @@ -0,0 +1,23 @@ +# Copyright 2026 NuoBiT Solutions SL - Deniz Gallo +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) + + +from odoo.addons.component.core import Component +from odoo.addons.connector.components.mapper import mapping, only_create + + +class PayrollSagePayslipProcessImportMapper(Component): + _name = "sage.payroll.sage.payslip.process.import.mapper" + _inherit = "sage.import.mapper" + _apply_on = "sage.payroll.sage.payslip.process" + + direct = [ + ("TipoProceso", "name"), + ("CodigoEmpresa", "sage_codigo_empresa"), + ("TipoProceso", "sage_tipo_proceso"), + ] + + @only_create + @mapping + def backend_id(self, record): + return {"backend_id": self.backend_record.id} diff --git a/connector_sage/models/sage_backend/common.py b/connector_sage/models/sage_backend/common.py index 84a501e77..645ac47c7 100644 --- a/connector_sage/models/sage_backend/common.py +++ b/connector_sage/models/sage_backend/common.py @@ -1,5 +1,6 @@ # Copyright NuoBiT Solutions - Eric Antones # Copyright NuoBiT Solutions - Kilian Niubo +# Copyright 2026 NuoBiT Solutions SL - Deniz Gallo # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) import logging @@ -65,6 +66,10 @@ def _select_state(self): "Import labour agreements since" ) + import_payslip_processes_since_date = fields.Datetime( + "Import payslip processes since" + ) + import_payslip_line_id = fields.Many2one( "payroll.sage.payslip", string="Payslip Line" ) @@ -126,6 +131,17 @@ def import_labour_agreements_since(self): return True + def import_payslip_processes_since(self): + for rec in self: + since_date = rec.import_payslip_processes_since_date + self.env[ + "sage.payroll.sage.payslip.process" + ].with_delay().import_payslip_processes_since( + backend_record=rec, since_date=since_date + ) + + return True + def import_payslip_lines(self): for rec in self: if not rec.import_payslip_line_id: @@ -180,3 +196,11 @@ def _scheduler_import_labour_agreements(self): domain = [("company_id", "=", company_id.id)] self.search(domain).import_labour_agreements_since() + + @api.model + def _scheduler_import_payslip_processes(self): + company_id = self.get_current_user_company() + + domain = [("company_id", "=", company_id.id)] + + self.search(domain).import_payslip_processes_since() diff --git a/connector_sage/security/ir.model.access.csv b/connector_sage/security/ir.model.access.csv index ebb6a74a9..fa72e34fb 100644 --- a/connector_sage/security/ir.model.access.csv +++ b/connector_sage/security/ir.model.access.csv @@ -8,6 +8,8 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink "access_sage_payroll_sage_labour_agreement_user","sage_payroll_sage_labour_agreement user","model_sage_payroll_sage_labour_agreement","base.group_user",1,0,0,0 "access_sage_payroll_sage_labour_agreement_wage_type_line_manager","sage_payroll_sage_labour_agreement_wage_type_line connector_manager","model_sage_payroll_sage_labour_agreement_wage_type_line","connector.group_connector_manager",1,1,1,1 "access_sage_payroll_sage_labour_agreement_wage_type_line_user","sage_payroll_sage_labour_agreement_wage_type_line user","model_sage_payroll_sage_labour_agreement_wage_type_line","base.group_user",1,0,0,0 +"access_sage_payroll_sage_payslip_process_manager","sage_payroll_sage_payslip_process connector_manager","model_sage_payroll_sage_payslip_process","connector.group_connector_manager",1,1,1,1 +"access_sage_payroll_sage_payslip_process_user","sage_payroll_sage_payslip_process user","model_sage_payroll_sage_payslip_process","base.group_user",1,0,0,0 "access_sage_payroll_sage_payslip_line_payroll_manager","sage_payroll_sage_payslip_line_payroll connector manager","model_sage_payroll_sage_payslip_line_payroll","connector.group_connector_manager",1,1,1,1 "access_sage_payroll_sage_payslip_line_payrolluser","sage_payroll_sage_payslip_line_payroll connector user","model_sage_payroll_sage_payslip_line_payroll","base.group_user",1,0,0,0 "access_sage_payroll_sage_payslip_line_transfer_manager","sage_payroll_sage_payslip_line_transfer connector manager","model_sage_payroll_sage_payslip_line_transfer","connector.group_connector_manager",1,1,1,1 diff --git a/connector_sage/views/connector_sage_menus.xml b/connector_sage/views/connector_sage_menus.xml index 7880d4938..6c500c11e 100644 --- a/connector_sage/views/connector_sage_menus.xml +++ b/connector_sage/views/connector_sage_menus.xml @@ -1,5 +1,6 @@ + + + + + + payslip.process.form.inherit.connector.sage + payroll.sage.payslip.process + + + + + + + + + + + + + + + + + sage.payslip.process.form + sage.payroll.sage.payslip.process + +
+ + + + + + + +
+
+
+ + + sage.payslip.process.tree + sage.payroll.sage.payslip.process + + + + + + + +