From 4a666bfc28a7ad62199fb5a8240ca7d3b2798434 Mon Sep 17 00:00:00 2001 From: DavidJForgeFlow Date: Mon, 27 Feb 2023 10:47:48 +0100 Subject: [PATCH] [ADD] stock_move_delay_report --- .../odoo/addons/stock_move_delay_report | 1 + setup/stock_move_delay_report/setup.py | 6 + stock_move_delay_report/README.rst | 0 stock_move_delay_report/__init__.py | 5 + stock_move_delay_report/__manifest__.py | 17 +++ stock_move_delay_report/models/__init__.py | 4 + stock_move_delay_report/models/stock_move.py | 40 +++++++ .../readme/CONTRIBUTORS.rst | 2 + .../readme/DESCRIPTION.rst | 1 + stock_move_delay_report/readme/USAGE.rst | 9 ++ stock_move_delay_report/report/__init__.py | 4 + .../report/delay_report.py | 78 +++++++++++++ .../report/delay_report_views.xml | 108 ++++++++++++++++++ .../security/ir.model.access.csv | 3 + .../security/report_security.xml | 10 ++ 15 files changed, 288 insertions(+) create mode 120000 setup/stock_move_delay_report/odoo/addons/stock_move_delay_report create mode 100644 setup/stock_move_delay_report/setup.py create mode 100644 stock_move_delay_report/README.rst create mode 100644 stock_move_delay_report/__init__.py create mode 100644 stock_move_delay_report/__manifest__.py create mode 100644 stock_move_delay_report/models/__init__.py create mode 100644 stock_move_delay_report/models/stock_move.py create mode 100644 stock_move_delay_report/readme/CONTRIBUTORS.rst create mode 100644 stock_move_delay_report/readme/DESCRIPTION.rst create mode 100644 stock_move_delay_report/readme/USAGE.rst create mode 100644 stock_move_delay_report/report/__init__.py create mode 100644 stock_move_delay_report/report/delay_report.py create mode 100644 stock_move_delay_report/report/delay_report_views.xml create mode 100644 stock_move_delay_report/security/ir.model.access.csv create mode 100644 stock_move_delay_report/security/report_security.xml diff --git a/setup/stock_move_delay_report/odoo/addons/stock_move_delay_report b/setup/stock_move_delay_report/odoo/addons/stock_move_delay_report new file mode 120000 index 0000000..891d3fa --- /dev/null +++ b/setup/stock_move_delay_report/odoo/addons/stock_move_delay_report @@ -0,0 +1 @@ +../../../../stock_move_delay_report \ No newline at end of file diff --git a/setup/stock_move_delay_report/setup.py b/setup/stock_move_delay_report/setup.py new file mode 100644 index 0000000..28c57bb --- /dev/null +++ b/setup/stock_move_delay_report/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +) diff --git a/stock_move_delay_report/README.rst b/stock_move_delay_report/README.rst new file mode 100644 index 0000000..e69de29 diff --git a/stock_move_delay_report/__init__.py b/stock_move_delay_report/__init__.py new file mode 100644 index 0000000..e603f2c --- /dev/null +++ b/stock_move_delay_report/__init__.py @@ -0,0 +1,5 @@ +# Copyright 2023 ForgeFlow S.L. +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import models +from . import report diff --git a/stock_move_delay_report/__manifest__.py b/stock_move_delay_report/__manifest__.py new file mode 100644 index 0000000..ad20785 --- /dev/null +++ b/stock_move_delay_report/__manifest__.py @@ -0,0 +1,17 @@ +# Copyright 2023 ForgeFlow S.L. +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "Stock Move Delay Report", + "summary": "Stock Move Delay Report", + "version": "13.0.1.0.0", + "license": "AGPL-3", + "author": "ForgeFlow, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/stock-logistics-reporting", + "depends": ["stock"], + "data": [ + "security/ir.model.access.csv", + "security/report_security.xml", + "report/delay_report_views.xml", + ], +} diff --git a/stock_move_delay_report/models/__init__.py b/stock_move_delay_report/models/__init__.py new file mode 100644 index 0000000..27aa87d --- /dev/null +++ b/stock_move_delay_report/models/__init__.py @@ -0,0 +1,4 @@ +# Copyright 2023 ForgeFlow S.L. +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import stock_move diff --git a/stock_move_delay_report/models/stock_move.py b/stock_move_delay_report/models/stock_move.py new file mode 100644 index 0000000..cbbdb57 --- /dev/null +++ b/stock_move_delay_report/models/stock_move.py @@ -0,0 +1,40 @@ +# Copyright 2023 ForgeFlow S.L. +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class StockMove(models.Model): + _inherit = "stock.move" + + date_delay = fields.Float( + compute="_compute_date_delay", + store=True, + help="If the move is done, the difference between " + "the scheduled date and the deadline", + ) + + responsible_id = fields.Many2one( + comodel_name="res.partner", + compute="_compute_responsible", + store=True, + help="Partner responsible of completing the move on time.", + ) + + @api.depends("state") + def _compute_date_delay(self): + for rec in self: + if rec.state == "done" and rec.date_expected: + rec.date_delay = (rec.date - rec.date_expected).days + elif not rec.date_expected: + rec.date_delay = 0 + else: + rec.date_delay = None + + @api.depends("state") + def _compute_responsible(self): + for rec in self: + if rec.picking_id.picking_type_id.code == "incoming": + rec.responsible_id = rec.picking_id.partner_id + elif rec.picking_id.picking_type_id.code == "outgoing": + rec.responsible_id = rec.picking_id.company_id.partner_id diff --git a/stock_move_delay_report/readme/CONTRIBUTORS.rst b/stock_move_delay_report/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000..5437306 --- /dev/null +++ b/stock_move_delay_report/readme/CONTRIBUTORS.rst @@ -0,0 +1,2 @@ +* `ForgeFlow `_: + * David Jiménez diff --git a/stock_move_delay_report/readme/DESCRIPTION.rst b/stock_move_delay_report/readme/DESCRIPTION.rst new file mode 100644 index 0000000..2ddfc5b --- /dev/null +++ b/stock_move_delay_report/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +This module adds a report to check the delay from incoming and outgoing moves grouped by Responsible Partner. diff --git a/stock_move_delay_report/readme/USAGE.rst b/stock_move_delay_report/readme/USAGE.rst new file mode 100644 index 0000000..345938a --- /dev/null +++ b/stock_move_delay_report/readme/USAGE.rst @@ -0,0 +1,9 @@ +Go to Inventory -> Reporting -> Delay Analysis. + +Here there are 3 views: + +Graph View: Shows the mean delay days of the stock moves for each partner with incoming or outgoing moves. + +Pivot View: Shows the mean delay days of the stock moves for each partner with incoming or outgoing moves. Also shows the % of moves done on time. + +Tree View: Shows all the done moves grouped by the partner responsible (in charge) of the picking. diff --git a/stock_move_delay_report/report/__init__.py b/stock_move_delay_report/report/__init__.py new file mode 100644 index 0000000..35f8247 --- /dev/null +++ b/stock_move_delay_report/report/__init__.py @@ -0,0 +1,4 @@ +# Copyright 2023 ForgeFlow S.L. +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import delay_report diff --git a/stock_move_delay_report/report/delay_report.py b/stock_move_delay_report/report/delay_report.py new file mode 100644 index 0000000..f5334e2 --- /dev/null +++ b/stock_move_delay_report/report/delay_report.py @@ -0,0 +1,78 @@ +# Copyright 2023 ForgeFlow S.L. +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models, tools + + +class StockMoveDelayReport(models.Model): + _name = "stock.move.delay.report" + _description = "Delay Analysis Report" + _auto = False + + date = fields.Date("Date Scheduled", readonly=True) + move_id = fields.Many2one("stock.move", "Stock Move #", readonly=True) + product_id = fields.Many2one("product.product", "Product", readonly=True) + reference = fields.Char("Reference", readonly=True) + location_src_id = fields.Many2one("stock.location", "From", readonly=True) + location_dest_id = fields.Many2one("stock.location", "To", readonly=True) + date_delay = fields.Float("Date Delay", group_operator="avg", readonly=True) + done_on_time = fields.Float("Done on Time", group_operator="avg", readonly=True) + product_uom = fields.Many2one("uom.uom", "Unit of Measure", readonly=True) + responsible_id = fields.Many2one("res.partner", "Responsible", readonly=True) + company_id = fields.Many2one("res.company", string="Company") + + def _done_on_time(self): + return """ + case when sm.date_delay > 0 then 0.0 else 100.0 end as done_on_time + """ + + def _select(self): + return """ + sm.id, + sm.date, + sm.id AS move_id, + sm.product_id, + sm.reference, + sm.location_id AS location_src_id, + sm.location_dest_id, + sm.date_delay, + %s, + sm.product_uom, + sm.responsible_id, + sm.company_id + """ % ( + self._done_on_time() + ) + + def _from(self): + return """ + stock_move AS sm + """ + + def _where(self): + if len(self.env.company) == 1: + return """ + sm.state = 'done' AND sm.responsible_id IS NOT NULL + """ + else: + return """ + sm.state = 'done' AND sm.responsible_id IS NOT NULL + """ + + def _query(self): + return """ + (SELECT %s + FROM %s + WHERE %s) + """ % ( + self._select(), + self._from(), + self._where(), + ) + + def init(self): + tools.drop_view_if_exists(self.env.cr, self._table) + # pylint: disable=E8103 + self.env.cr.execute( + """CREATE or REPLACE VIEW %s as (%s)""" % (self._table, self._query()) + ) diff --git a/stock_move_delay_report/report/delay_report_views.xml b/stock_move_delay_report/report/delay_report_views.xml new file mode 100644 index 0000000..f4c47e3 --- /dev/null +++ b/stock_move_delay_report/report/delay_report_views.xml @@ -0,0 +1,108 @@ + + + + + stock.move.delay.report.pivot + stock.move.delay.report + + + + + + + + + + + stock.move.delay.report.graph + stock.move.delay.report + + + + + + + + + + stock.move.delay.report.tree + stock.move.delay.report + + + + + + + + + + + + + + + + + + stock.move.delay.report.search + stock.move.delay.report + + + + + + + + + + + + + + Delay Analysis + stock.move.delay.report + graph,pivot,tree + + { + 'search_default_group_responsible_id': 1, + 'search_default_only_products': 1, + } + +

+ No data yet! +

+ Complete a new stock move +

+
+
+ + + +
diff --git a/stock_move_delay_report/security/ir.model.access.csv b/stock_move_delay_report/security/ir.model.access.csv new file mode 100644 index 0000000..f8d64b2 --- /dev/null +++ b/stock_move_delay_report/security/ir.model.access.csv @@ -0,0 +1,3 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_stock_move_delay_report_user,stock.move.delay.report.user,model_stock_move_delay_report,base.group_user,1,0,0,0 +access_stock_move_delay_report_manager,stock.move.delay.report.manager,model_stock_move_delay_report,base.group_system,1,1,1,1 diff --git a/stock_move_delay_report/security/report_security.xml b/stock_move_delay_report/security/report_security.xml new file mode 100644 index 0000000..d83819e --- /dev/null +++ b/stock_move_delay_report/security/report_security.xml @@ -0,0 +1,10 @@ + + + Stock Move Delay Analysis multi-company + + + ['|',('company_id','=',False),('company_id', 'in', company_ids)] + +