From d18a2def8372f2051df4ac58ea392c0b535c2e0d Mon Sep 17 00:00:00 2001 From: vivah-odoo Date: Fri, 5 Jun 2026 12:26:37 +0530 Subject: [PATCH] [IMP] project_recognition_sync: add recognition mismatch detection - Add recognition sync fields on project - Retrieve recognition journal entries from invoices - Detect mismatch between project date and recognition dates - Show warning banner on project form --- invoice_recognition_sync/__init__.py | 1 + invoice_recognition_sync/__manifest__.py | 19 +++++++ invoice_recognition_sync/models/__init__.py | 1 + .../models/project_project.py | 49 +++++++++++++++++++ .../views/project_project_views.xml | 15 ++++++ 5 files changed, 85 insertions(+) create mode 100644 invoice_recognition_sync/__init__.py create mode 100644 invoice_recognition_sync/__manifest__.py create mode 100644 invoice_recognition_sync/models/__init__.py create mode 100644 invoice_recognition_sync/models/project_project.py create mode 100644 invoice_recognition_sync/views/project_project_views.xml diff --git a/invoice_recognition_sync/__init__.py b/invoice_recognition_sync/__init__.py new file mode 100644 index 00000000000..0650744f6bc --- /dev/null +++ b/invoice_recognition_sync/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/invoice_recognition_sync/__manifest__.py b/invoice_recognition_sync/__manifest__.py new file mode 100644 index 00000000000..0a4b0f134a7 --- /dev/null +++ b/invoice_recognition_sync/__manifest__.py @@ -0,0 +1,19 @@ +{ + "name": "Project Revenue Sync", + "version": "1.0", + "category": "Accounting", + "depends": [ + "project", + "sale_project", + "sale", + "account", + ], + "data": [ + "views/project_project_views.xml", + ], + 'author': 'vivah', + 'license': 'AGPL-3', + 'sequence': 2, + "installable": True, + "application": False, +} diff --git a/invoice_recognition_sync/models/__init__.py b/invoice_recognition_sync/models/__init__.py new file mode 100644 index 00000000000..56545d0d4ff --- /dev/null +++ b/invoice_recognition_sync/models/__init__.py @@ -0,0 +1 @@ +from . import project_project diff --git a/invoice_recognition_sync/models/project_project.py b/invoice_recognition_sync/models/project_project.py new file mode 100644 index 00000000000..26e76da35e1 --- /dev/null +++ b/invoice_recognition_sync/models/project_project.py @@ -0,0 +1,49 @@ +from odoo import api, fields, models + + +class ProjectProject(models.Model): + _inherit = "project.project" + + needs_recognition_sync = fields.Boolean( + compute="_compute_recognition_sync" + ) + + recognition_sync_message = fields.Char( + compute="_compute_recognition_sync" + ) + + def _get_recognition_moves(self): + self.ensure_one() + + sale_order = self.sale_order_id + + if not sale_order: + return self.env["account.move"] + + invoices = sale_order.invoice_ids + + return invoices.mapped("adjusting_entries_move_ids") + + @api.depends("date_start") + def _compute_recognition_sync(self): + for project in self: + project.needs_recognition_sync = False + project.recognition_sync_message = False + + if not project.date_start: + continue + + recognition_moves = project._get_recognition_moves() + + if not recognition_moves: + continue + + recognition_dates = recognition_moves.mapped("date") + + if project.date_start not in recognition_dates: + project.needs_recognition_sync = True + + project.recognition_sync_message = ( + "Revenue recognition entries are not aligned " + "with the project start date." + ) diff --git a/invoice_recognition_sync/views/project_project_views.xml b/invoice_recognition_sync/views/project_project_views.xml new file mode 100644 index 00000000000..1774f1592c6 --- /dev/null +++ b/invoice_recognition_sync/views/project_project_views.xml @@ -0,0 +1,15 @@ + + + + project.project.form.recognition.sync + project.project + + + +
+ +
+
+
+
+