diff --git a/custom_mrp_descarga/__manifest__.py b/custom_mrp_descarga/__manifest__.py index c4913762..3e920cd7 100644 --- a/custom_mrp_descarga/__manifest__.py +++ b/custom_mrp_descarga/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Custom MRP Descarga", - "version": "14.0.1.0.0", + "version": "14.0.1.1.0", "category": "MRP", "license": "AGPL-3", "author": "AvanzOSC", @@ -46,4 +46,5 @@ ], "installable": True, "auto_install": True, + "pre_init_hook": "pre_init_hook", } diff --git a/custom_mrp_descarga/i18n/custom_mrp_descarga.pot b/custom_mrp_descarga/i18n/custom_mrp_descarga.pot index f80ba09c..8abbdb5b 100644 --- a/custom_mrp_descarga/i18n/custom_mrp_descarga.pot +++ b/custom_mrp_descarga/i18n/custom_mrp_descarga.pot @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 14.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-29 11:09+0000\n" -"PO-Revision-Date: 2024-10-29 11:09+0000\n" +"POT-Creation-Date: 2025-01-30 13:22+0000\n" +"PO-Revision-Date: 2025-01-30 13:22+0000\n" "Last-Translator: \n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -65,6 +65,7 @@ msgid "Assign Serials" msgstr "" #. module: custom_mrp_descarga +#: model:ir.model.fields,field_description:custom_mrp_descarga.field_sale_order_line__lot_average_price #: model:ir.model.fields,field_description:custom_mrp_descarga.field_stock_move_line__average_price #: model:ir.model.fields,field_description:custom_mrp_descarga.field_stock_production_lot__average_price msgid "Average Price" @@ -275,6 +276,7 @@ msgstr "" #. module: custom_mrp_descarga #: model:ir.model.fields,field_description:custom_mrp_descarga.field_mrp_production__birth_difference #: model:ir.model.fields,field_description:custom_mrp_descarga.field_mrp_production__qty_difference +#: model:ir.model.fields,field_description:custom_mrp_descarga.field_sale_report__difference msgid "Difference" msgstr "" @@ -293,6 +295,8 @@ msgstr "" #: model:ir.model.fields,field_description:custom_mrp_descarga.field_report_mrp_production_quartering_summary_xlsx__display_name #: model:ir.model.fields,field_description:custom_mrp_descarga.field_report_mrp_production_summary_xlsx__display_name #: model:ir.model.fields,field_description:custom_mrp_descarga.field_saca_line__display_name +#: model:ir.model.fields,field_description:custom_mrp_descarga.field_sale_order_line__display_name +#: model:ir.model.fields,field_description:custom_mrp_descarga.field_sale_report__display_name #: model:ir.model.fields,field_description:custom_mrp_descarga.field_stock_inventory_line__display_name #: model:ir.model.fields,field_description:custom_mrp_descarga.field_stock_move_line__display_name #: model:ir.model.fields,field_description:custom_mrp_descarga.field_stock_production_lot__display_name @@ -414,6 +418,8 @@ msgstr "" #: model:ir.model.fields,field_description:custom_mrp_descarga.field_report_mrp_production_quartering_summary_xlsx__id #: model:ir.model.fields,field_description:custom_mrp_descarga.field_report_mrp_production_summary_xlsx__id #: model:ir.model.fields,field_description:custom_mrp_descarga.field_saca_line__id +#: model:ir.model.fields,field_description:custom_mrp_descarga.field_sale_order_line__id +#: model:ir.model.fields,field_description:custom_mrp_descarga.field_sale_report__id #: model:ir.model.fields,field_description:custom_mrp_descarga.field_stock_inventory_line__id #: model:ir.model.fields,field_description:custom_mrp_descarga.field_stock_move_line__id #: model:ir.model.fields,field_description:custom_mrp_descarga.field_stock_production_lot__id @@ -517,6 +523,8 @@ msgstr "" #: model:ir.model.fields,field_description:custom_mrp_descarga.field_report_mrp_production_quartering_summary_xlsx____last_update #: model:ir.model.fields,field_description:custom_mrp_descarga.field_report_mrp_production_summary_xlsx____last_update #: model:ir.model.fields,field_description:custom_mrp_descarga.field_saca_line____last_update +#: model:ir.model.fields,field_description:custom_mrp_descarga.field_sale_order_line____last_update +#: model:ir.model.fields,field_description:custom_mrp_descarga.field_sale_report____last_update #: model:ir.model.fields,field_description:custom_mrp_descarga.field_stock_inventory_line____last_update #: model:ir.model.fields,field_description:custom_mrp_descarga.field_stock_move_line____last_update #: model:ir.model.fields,field_description:custom_mrp_descarga.field_stock_production_lot____last_update @@ -540,10 +548,22 @@ msgid "Last Year" msgstr "" #. module: custom_mrp_descarga +#: model:ir.model.fields,field_description:custom_mrp_descarga.field_sale_report__lot_id #: model_terms:ir.ui.view,arch_db:custom_mrp_descarga.view_mrp_production_filter msgid "Lot" msgstr "" +#. module: custom_mrp_descarga +#: model:ir.model.fields,field_description:custom_mrp_descarga.field_sale_report__lot_average_price +msgid "Lot Average Price" +msgstr "" + +#. module: custom_mrp_descarga +#: model:ir.model.fields,field_description:custom_mrp_descarga.field_sale_order_line__lot_cost +#: model:ir.model.fields,field_description:custom_mrp_descarga.field_sale_report__lot_cost +msgid "Lot Cost" +msgstr "" + #. module: custom_mrp_descarga #: model:ir.model,name:custom_mrp_descarga.model_stock_production_lot msgid "Lot/Serial" @@ -686,6 +706,11 @@ msgstr "" msgid "Peso medio" msgstr "" +#. module: custom_mrp_descarga +#: model:ir.model.fields,field_description:custom_mrp_descarga.field_sale_report__price_unit +msgid "Price Unit" +msgstr "" + #. module: custom_mrp_descarga #: model:ir.model.fields,field_description:custom_mrp_descarga.field_mrp_production__speed_consume_qty msgid "Produced Kg/Hour" @@ -722,6 +747,15 @@ msgstr "" msgid "Product Unit of Measure" msgstr "" +#. module: custom_mrp_descarga +#: code:addons/custom_mrp_descarga/models/stock_move_line.py:0 +#: code:addons/custom_mrp_descarga/models/stock_move_line.py:0 +#: code:addons/custom_mrp_descarga/models/stock_move_line.py:0 +#: code:addons/custom_mrp_descarga/models/stock_move_line.py:0 +#, python-format +msgid "Product not found, reader information for product code: %(reader)s" +msgstr "" + #. module: custom_mrp_descarga #: code:addons/custom_mrp_descarga/models/saca_line.py:0 #: code:addons/custom_mrp_descarga/models/saca_line.py:0 @@ -878,6 +912,16 @@ msgstr "" msgid "Saca Line" msgstr "" +#. module: custom_mrp_descarga +#: model:ir.model,name:custom_mrp_descarga.model_sale_report +msgid "Sales Analysis Report" +msgstr "" + +#. module: custom_mrp_descarga +#: model:ir.model,name:custom_mrp_descarga.model_sale_order_line +msgid "Sales Order Line" +msgstr "" + #. module: custom_mrp_descarga #: code:addons/custom_mrp_descarga/report/mrp_production_quartering_summary_xlsx.py:0 #: code:addons/custom_mrp_descarga/report/mrp_production_quartering_summary_xlsx.py:0 @@ -1067,6 +1111,13 @@ msgstr "" msgid "Unidades" msgstr "" +#. module: custom_mrp_descarga +#: code:addons/custom_mrp_descarga/models/stock_move_line.py:0 +#: code:addons/custom_mrp_descarga/models/stock_move_line.py:0 +#, python-format +msgid "Unidentified barcode format : %(reader)s" +msgstr "" + #. module: custom_mrp_descarga #: model:ir.model.fields,field_description:custom_mrp_descarga.field_mrp_production__unit_difference msgid "Unit Difference" diff --git a/custom_mrp_descarga/i18n/es.po b/custom_mrp_descarga/i18n/es.po index 7f1424e3..76968d83 100644 --- a/custom_mrp_descarga/i18n/es.po +++ b/custom_mrp_descarga/i18n/es.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 14.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-29 11:09+0000\n" -"PO-Revision-Date: 2024-10-29 11:09+0000\n" +"POT-Creation-Date: 2025-01-30 13:22+0000\n" +"PO-Revision-Date: 2025-01-30 13:22+0000\n" "Last-Translator: \n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -65,6 +65,7 @@ msgid "Assign Serials" msgstr "Asignar Lotes" #. module: custom_mrp_descarga +#: model:ir.model.fields,field_description:custom_mrp_descarga.field_sale_order_line__lot_average_price #: model:ir.model.fields,field_description:custom_mrp_descarga.field_stock_move_line__average_price #: model:ir.model.fields,field_description:custom_mrp_descarga.field_stock_production_lot__average_price msgid "Average Price" @@ -277,6 +278,7 @@ msgstr "" #. module: custom_mrp_descarga #: model:ir.model.fields,field_description:custom_mrp_descarga.field_mrp_production__birth_difference #: model:ir.model.fields,field_description:custom_mrp_descarga.field_mrp_production__qty_difference +#: model:ir.model.fields,field_description:custom_mrp_descarga.field_sale_report__difference msgid "Difference" msgstr "Diferencia" @@ -295,6 +297,8 @@ msgstr "% diferencia" #: model:ir.model.fields,field_description:custom_mrp_descarga.field_report_mrp_production_quartering_summary_xlsx__display_name #: model:ir.model.fields,field_description:custom_mrp_descarga.field_report_mrp_production_summary_xlsx__display_name #: model:ir.model.fields,field_description:custom_mrp_descarga.field_saca_line__display_name +#: model:ir.model.fields,field_description:custom_mrp_descarga.field_sale_order_line__display_name +#: model:ir.model.fields,field_description:custom_mrp_descarga.field_sale_report__display_name #: model:ir.model.fields,field_description:custom_mrp_descarga.field_stock_inventory_line__display_name #: model:ir.model.fields,field_description:custom_mrp_descarga.field_stock_move_line__display_name #: model:ir.model.fields,field_description:custom_mrp_descarga.field_stock_production_lot__display_name @@ -416,6 +420,8 @@ msgstr "Galllinas" #: model:ir.model.fields,field_description:custom_mrp_descarga.field_report_mrp_production_quartering_summary_xlsx__id #: model:ir.model.fields,field_description:custom_mrp_descarga.field_report_mrp_production_summary_xlsx__id #: model:ir.model.fields,field_description:custom_mrp_descarga.field_saca_line__id +#: model:ir.model.fields,field_description:custom_mrp_descarga.field_sale_order_line__id +#: model:ir.model.fields,field_description:custom_mrp_descarga.field_sale_report__id #: model:ir.model.fields,field_description:custom_mrp_descarga.field_stock_inventory_line__id #: model:ir.model.fields,field_description:custom_mrp_descarga.field_stock_move_line__id #: model:ir.model.fields,field_description:custom_mrp_descarga.field_stock_production_lot__id @@ -519,6 +525,8 @@ msgstr "" #: model:ir.model.fields,field_description:custom_mrp_descarga.field_report_mrp_production_quartering_summary_xlsx____last_update #: model:ir.model.fields,field_description:custom_mrp_descarga.field_report_mrp_production_summary_xlsx____last_update #: model:ir.model.fields,field_description:custom_mrp_descarga.field_saca_line____last_update +#: model:ir.model.fields,field_description:custom_mrp_descarga.field_sale_order_line____last_update +#: model:ir.model.fields,field_description:custom_mrp_descarga.field_sale_report____last_update #: model:ir.model.fields,field_description:custom_mrp_descarga.field_stock_inventory_line____last_update #: model:ir.model.fields,field_description:custom_mrp_descarga.field_stock_move_line____last_update #: model:ir.model.fields,field_description:custom_mrp_descarga.field_stock_production_lot____last_update @@ -542,10 +550,22 @@ msgid "Last Year" msgstr "Último año" #. module: custom_mrp_descarga +#: model:ir.model.fields,field_description:custom_mrp_descarga.field_sale_report__lot_id #: model_terms:ir.ui.view,arch_db:custom_mrp_descarga.view_mrp_production_filter msgid "Lot" msgstr "Lote" +#. module: custom_mrp_descarga +#: model:ir.model.fields,field_description:custom_mrp_descarga.field_sale_report__lot_average_price +msgid "Lot Average Price" +msgstr "Precio medio lote" + +#. module: custom_mrp_descarga +#: model:ir.model.fields,field_description:custom_mrp_descarga.field_sale_order_line__lot_cost +#: model:ir.model.fields,field_description:custom_mrp_descarga.field_sale_report__lot_cost +msgid "Lot Cost" +msgstr "Coste lote" + #. module: custom_mrp_descarga #: model:ir.model,name:custom_mrp_descarga.model_stock_production_lot msgid "Lot/Serial" @@ -688,6 +708,11 @@ msgstr "Rendimiento" msgid "Peso medio" msgstr "" +#. module: custom_mrp_descarga +#: model:ir.model.fields,field_description:custom_mrp_descarga.field_sale_report__price_unit +msgid "Price Unit" +msgstr "Precio unitario" + #. module: custom_mrp_descarga #: model:ir.model.fields,field_description:custom_mrp_descarga.field_mrp_production__speed_consume_qty msgid "Produced Kg/Hour" @@ -724,6 +749,15 @@ msgstr "Plantilla de producto" msgid "Product Unit of Measure" msgstr "UdM de producto" +#. module: custom_mrp_descarga +#: code:addons/custom_mrp_descarga/models/stock_move_line.py:0 +#: code:addons/custom_mrp_descarga/models/stock_move_line.py:0 +#: code:addons/custom_mrp_descarga/models/stock_move_line.py:0 +#: code:addons/custom_mrp_descarga/models/stock_move_line.py:0 +#, python-format +msgid "Product not found, reader information for product code: %(reader)s" +msgstr "Producto no encontrado, código de producto del lector: %(reader)s" + #. module: custom_mrp_descarga #: code:addons/custom_mrp_descarga/models/saca_line.py:0 #: code:addons/custom_mrp_descarga/models/saca_line.py:0 @@ -880,6 +914,16 @@ msgstr "Fecha de saca" msgid "Saca Line" msgstr "Línea de saca" +#. module: custom_mrp_descarga +#: model:ir.model,name:custom_mrp_descarga.model_sale_report +msgid "Sales Analysis Report" +msgstr "Informe de análisis de ventas" + +#. module: custom_mrp_descarga +#: model:ir.model,name:custom_mrp_descarga.model_sale_order_line +msgid "Sales Order Line" +msgstr "Línea de pedido de venta" + #. module: custom_mrp_descarga #: code:addons/custom_mrp_descarga/report/mrp_production_quartering_summary_xlsx.py:0 #: code:addons/custom_mrp_descarga/report/mrp_production_quartering_summary_xlsx.py:0 @@ -1069,6 +1113,13 @@ msgstr "Importe total" msgid "Unidades" msgstr "" +#. module: custom_mrp_descarga +#: code:addons/custom_mrp_descarga/models/stock_move_line.py:0 +#: code:addons/custom_mrp_descarga/models/stock_move_line.py:0 +#, python-format +msgid "Unidentified barcode format : %(reader)s" +msgstr "Formato de lector indefinido: %(reader)s" + #. module: custom_mrp_descarga #: model:ir.model.fields,field_description:custom_mrp_descarga.field_mrp_production__unit_difference msgid "Unit Difference" diff --git a/custom_mrp_descarga/migrations/14.0.1.1.0/pre-migration.py b/custom_mrp_descarga/migrations/14.0.1.1.0/pre-migration.py new file mode 100644 index 00000000..912b2648 --- /dev/null +++ b/custom_mrp_descarga/migrations/14.0.1.1.0/pre-migration.py @@ -0,0 +1,42 @@ +# Copyright 2025 Berezi Amubieta - AvanzOSC +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +import logging + +from openupgradelib import openupgrade + +_logger = logging.getLogger(__name__) + + +@openupgrade.migrate() +def migrate(env, version): + cr = env.cr + if not openupgrade.column_exists(cr, "sale_order_line", "lot_average_price"): + cr.execute( + """ + ALTER TABLE sale_order_line + ADD COLUMN lot_average_price float; + """ + ) + cr.execute( + """ + UPDATE sale_order_line + SET lot_average_price = (SELECT stock_production_lot.average_price + FROM stock_production_lot + WHERE stock_production_lot.id = sale_order_line.lot_id) + """ + ) + if not openupgrade.column_exists(cr, "sale_order_line", "lot_cost"): + cr.execute( + """ + ALTER TABLE sale_order_line + ADD COLUMN lot_cost float; + """ + ) + cr.execute( + """ + UPDATE sale_order_line + SET lot_cost = (SELECT stock_production_lot.average_price * product_uom_qty + FROM stock_production_lot + WHERE stock_production_lot.id = sale_order_line.lot_id) + """ + ) diff --git a/custom_mrp_descarga/models/__init__.py b/custom_mrp_descarga/models/__init__.py index d3330669..5f39e837 100644 --- a/custom_mrp_descarga/models/__init__.py +++ b/custom_mrp_descarga/models/__init__.py @@ -9,3 +9,4 @@ from . import mrp_bom from . import stock_inventory_line from . import mrp_workorder +from . import sale_order_line diff --git a/custom_mrp_descarga/models/sale_order_line.py b/custom_mrp_descarga/models/sale_order_line.py new file mode 100644 index 00000000..a99059dd --- /dev/null +++ b/custom_mrp_descarga/models/sale_order_line.py @@ -0,0 +1,19 @@ +# Copyright 2022 Berezi Amubieta - AvanzOSC +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +from odoo import api, fields, models + + +class SaleOrderLine(models.Model): + _inherit = "sale.order.line" + + lot_average_price = fields.Float( + digits="MRP Price Decimal Precision", + related="lot_id.average_price", + store=True, + ) + lot_cost = fields.Float(compute="_compute_lot_cost", store=True) + + @api.depends("lot_average_price", "product_uom_qty") + def _compute_lot_cost(self): + for line in self: + line.lot_cost = line.lot_average_price * line.product_uom_qty diff --git a/custom_mrp_descarga/report/__init__.py b/custom_mrp_descarga/report/__init__.py index ca43a7ed..ba1403db 100644 --- a/custom_mrp_descarga/report/__init__.py +++ b/custom_mrp_descarga/report/__init__.py @@ -1,2 +1,3 @@ from . import mrp_production_summary_xlsx from . import mrp_production_quartering_summary_xlsx +from . import sale_report diff --git a/custom_mrp_descarga/report/sale_report.py b/custom_mrp_descarga/report/sale_report.py new file mode 100644 index 00000000..f3c8cf74 --- /dev/null +++ b/custom_mrp_descarga/report/sale_report.py @@ -0,0 +1,48 @@ +# Copyright 2020 Alfredo de la Fuente - AvanzOSC +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +from odoo import fields, models + + +class SaleReport(models.Model): + _inherit = "sale.report" + + lot_average_price = fields.Float(readonly=True, group_operator="avg") + lot_id = fields.Many2one( + comodel_name="stock.production.lot", + readonly=True, + ) + price_unit = fields.Float(readonly=True, group_operator="avg") + lot_cost = fields.Float( + readonly=True, + ) + difference = fields.Float( + readonly=True, + ) + + def _group_by_sale(self, groupby=""): + res = super()._group_by_sale(groupby) + res += """, l.lot_id""" + res += """, l.price_unit""" + res += """, l.lot_average_price""" + return res + + def _select_additional_fields(self, fields): + fields["lot_id"] = ", l.lot_id as lot_id" + fields["price_unit"] = ", l.price_unit as price_unit" + fields["lot_average_price"] = ", l.lot_average_price as lot_average_price" + return super()._select_additional_fields(fields) + + def _query(self, with_clause="", fields=None, groupby="", from_clause=""): + if not fields: + fields = {} + fields["lot_cost"] = ", sum(l.lot_cost / u.factor * u2.factor) as " "lot_cost" + fields["difference"] = ( + ", sum(l.price_subtotal - l.lot_cost / u.factor * u2.factor) as " + "difference" + ) + return super(SaleReport, self)._query( + with_clause=with_clause, + fields=fields, + groupby=groupby, + from_clause=from_clause, + )