From faf92651189ab085c7ee33dc363a101ce79ae26b Mon Sep 17 00:00:00 2001 From: mav-adhoc Date: Fri, 20 Feb 2026 16:46:12 -0300 Subject: [PATCH] [IMP]purchase_stock_ux: adapt functionality to odoo receipt_status native field --- purchase_stock_ux/README.rst | 3 +- purchase_stock_ux/i18n/es.po | 30 ++++------- purchase_stock_ux/i18n/purchase_stock_ux.pot | 24 ++++----- purchase_stock_ux/models/purchase_order.py | 51 +++---------------- .../models/purchase_order_line.py | 38 +++++++------- .../views/purchase_line_views.xml | 4 +- .../views/purchase_order_views.xml | 19 +++---- 7 files changed, 55 insertions(+), 114 deletions(-) diff --git a/purchase_stock_ux/README.rst b/purchase_stock_ux/README.rst index 87cba5dd..bedcf368 100644 --- a/purchase_stock_ux/README.rst +++ b/purchase_stock_ux/README.rst @@ -18,12 +18,11 @@ Several Improvements to purchases. On purchase orders: -#. Add delivery status on purchases #. Add a to filter by PO with billable returns. On purchase lines: -#. Add delivery status on purchase lines +#. Add receipt status on purchase lines #. Add button on purchase lines to allow cancelling of remaining qty to be received #. Add return quantity when you return products with "To Refund" option. diff --git a/purchase_stock_ux/i18n/es.po b/purchase_stock_ux/i18n/es.po index 64174ae2..09459706 100644 --- a/purchase_stock_ux/i18n/es.po +++ b/purchase_stock_ux/i18n/es.po @@ -81,14 +81,9 @@ msgstr "" "de la moneda seteada en el producto." #. module: purchase_stock_ux -#: model_terms:ir.ui.view,arch_db:purchase_stock_ux.view_purchase_order_filter -msgid "Delivery Satus" -msgstr "Estado de la recepción" - -#. module: purchase_stock_ux -#: model:ir.model.fields,field_description:purchase_stock_ux.field_purchase_order__delivery_status -#: model:ir.model.fields,field_description:purchase_stock_ux.field_purchase_order_line__delivery_status -msgid "Delivery Status" +#: model:ir.model.fields,field_description:purchase_stock_ux.field_purchase_order__receipt_status +#: model:ir.model.fields,field_description:purchase_stock_ux.field_purchase_order_line__receipt_status +msgid "Receipt Status" msgstr "Estado de la recepción" #. module: purchase_stock_ux @@ -121,13 +116,6 @@ msgstr "" msgid "Minimum Inventory Rule" msgstr "Regla de inventario mínimo" -#. module: purchase_stock_ux -#: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order__delivery_status__no -#: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order__force_delivered_status__no -#: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order_line__delivery_status__no -msgid "Not purchased" -msgstr "Nada para recibir" - #. module: purchase_stock_ux #: model:ir.model.fields,field_description:purchase_stock_ux.field_purchase_order_line__qty_on_voucher msgid "On Voucher" @@ -188,12 +176,12 @@ msgid "Purchase orders with billable returns" msgstr "Órdenes de compra con devoluciones facturables" #. module: purchase_stock_ux -#: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order__delivery_status__received -#: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order__force_delivered_status__received -#: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order_line__delivery_status__received +#: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order__receipt_status__full +#: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order__force_delivered_status__full +#: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order_line__receipt_status__full #: model_terms:ir.ui.view,arch_db:purchase_stock_ux.purchase_order_line_search #: model_terms:ir.ui.view,arch_db:purchase_stock_ux.view_purchase_order_filter -msgid "Received" +msgid "full" msgstr "Recibido" #. module: purchase_stock_ux @@ -227,8 +215,8 @@ msgstr "" "deshacer. ¿Estás seguro de continuar?" #. module: purchase_stock_ux -#: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order__delivery_status__to_receive -#: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order_line__delivery_status__to_receive +#: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order__receipt_status__to_receive +#: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order_line__receipt_status__to_receive #: model_terms:ir.ui.view,arch_db:purchase_stock_ux.purchase_order_line_search #: model_terms:ir.ui.view,arch_db:purchase_stock_ux.view_purchase_order_filter msgid "To Receive" diff --git a/purchase_stock_ux/i18n/purchase_stock_ux.pot b/purchase_stock_ux/i18n/purchase_stock_ux.pot index 7e07ed8c..4d55a436 100644 --- a/purchase_stock_ux/i18n/purchase_stock_ux.pot +++ b/purchase_stock_ux/i18n/purchase_stock_ux.pot @@ -65,13 +65,7 @@ msgstr "" #. module: purchase_stock_ux #: model_terms:ir.ui.view,arch_db:purchase_stock_ux.view_purchase_order_filter -msgid "Delivery Satus" -msgstr "" - -#. module: purchase_stock_ux -#: model:ir.model.fields,field_description:purchase_stock_ux.field_purchase_order__delivery_status -#: model:ir.model.fields,field_description:purchase_stock_ux.field_purchase_order_line__delivery_status -msgid "Delivery Status" +msgid "Receipt Status" msgstr "" #. module: purchase_stock_ux @@ -105,9 +99,9 @@ msgid "Minimum Inventory Rule" msgstr "" #. module: purchase_stock_ux -#: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order__delivery_status__no +#: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order__receipt_status__no #: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order__force_delivered_status__no -#: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order_line__delivery_status__no +#: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order_line__receipt_status__no msgid "Not purchased" msgstr "" @@ -167,12 +161,12 @@ msgid "Purchase orders with billable returns" msgstr "" #. module: purchase_stock_ux -#: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order__delivery_status__received -#: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order__force_delivered_status__received -#: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order_line__delivery_status__received +#: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order__receipt_status__full +#: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order__force_delivered_status__full +#: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order_line__receipt_status__full #: model_terms:ir.ui.view,arch_db:purchase_stock_ux.purchase_order_line_search #: model_terms:ir.ui.view,arch_db:purchase_stock_ux.view_purchase_order_filter -msgid "Received" +msgid "full" msgstr "" #. module: purchase_stock_ux @@ -203,8 +197,8 @@ msgid "" msgstr "" #. module: purchase_stock_ux -#: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order__delivery_status__to_receive -#: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order_line__delivery_status__to_receive +#: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order__receipt_status__to_receive +#: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order_line__receipt_status__to_receive #: model_terms:ir.ui.view,arch_db:purchase_stock_ux.purchase_order_line_search #: model_terms:ir.ui.view,arch_db:purchase_stock_ux.view_purchase_order_filter msgid "To Receive" diff --git a/purchase_stock_ux/models/purchase_order.py b/purchase_stock_ux/models/purchase_order.py index 9ac2ef8b..a192cb2e 100644 --- a/purchase_stock_ux/models/purchase_order.py +++ b/purchase_stock_ux/models/purchase_order.py @@ -4,7 +4,6 @@ ############################################################################## from odoo import _, api, fields, models from odoo.exceptions import UserError -from odoo.tools.float_utils import float_compare class PurchaseOrder(models.Model): @@ -12,24 +11,13 @@ class PurchaseOrder(models.Model): force_delivered_status = fields.Selection( [ - ("no", "Not purchased"), - ("received", "Received"), + ("pending", "Not Received"), + ("partial", "Partially Received"), + ("full", "Fully Received"), ], tracking=True, copy=False, ) - delivery_status = fields.Selection( - [ - ("no", "Not purchased"), - ("to receive", "To Receive"), - ("received", "Received"), - ], - compute="_compute_delivery_status", - store=True, - readonly=True, - copy=False, - default="no", - ) with_returns = fields.Boolean( compute="_compute_with_returns", @@ -44,39 +32,14 @@ def _compute_with_returns(self): else: order.with_returns = False - @api.depends( - "state", - "order_line.qty_received", - "order_line.qty_returned", - "order_line.product_qty", - "force_delivered_status", - ) - def _compute_delivery_status(self): - precision = self.env["decimal.precision"].precision_get("Product Unit of Measure") + @api.depends("picking_ids", "picking_ids.state", "force_delivered_status") + def _compute_receipt_status(self): + super()._compute_receipt_status() for order in self: - if order.state not in ("purchase", "done"): - order.delivery_status = "no" - continue - if order.force_delivered_status: - order.delivery_status = order.force_delivered_status + order.receipt_status = order.force_delivered_status continue - if any( - float_compare((line.qty_received + line.qty_returned), line.product_qty, precision_digits=precision) - == -1 - for line in order.order_line - ): - order.delivery_status = "to receive" - elif all( - float_compare((line.qty_received + line.qty_returned), line.product_qty, precision_digits=precision) - >= 0 - for line in order.order_line - ): - order.delivery_status = "received" - else: - order.delivery_status = "no" - def write(self, values): self = self.with_context(cancel_from_order=True) self.check_force_delivered_status(values) diff --git a/purchase_stock_ux/models/purchase_order_line.py b/purchase_stock_ux/models/purchase_order_line.py index 134ccbbd..30c7da6a 100644 --- a/purchase_stock_ux/models/purchase_order_line.py +++ b/purchase_stock_ux/models/purchase_order_line.py @@ -16,18 +16,18 @@ class PurchaseOrderLine(models.Model): _inherit = "purchase.order.line" - delivery_status = fields.Selection( + receipt_status = fields.Selection( [ - ("no", "Not purchased"), - ("to receive", "To Receive"), - ("received", "Received"), + ("pending", "Not Received"), + ("partial", "Partially Received"), + ("full", "Fully Received"), ], - compute="_compute_delivery_status", + compute="_compute_receipt_status", store=True, readonly=True, copy=False, - default="no", ) + vouchers = fields.Char(compute="_compute_vouchers") qty_on_voucher = fields.Float( @@ -111,27 +111,23 @@ def _compute_vouchers(self): rec.vouchers = ", ".join(vouchers) @api.depends("order_id.state", "qty_received", "qty_returned", "product_qty", "order_id.force_delivered_status") - def _compute_delivery_status(self): + def _compute_receipt_status(self): precision = self.env["decimal.precision"].precision_get("Product Unit of Measure") for line in self: if line.state not in ("purchase", "done"): - line.delivery_status = "no" + line.receipt_status = False continue if line.order_id.force_delivered_status: - line.delivery_status = line.order_id.force_delivered_status + line.receipt_status = line.order_id.force_delivered_status continue - if ( - float_compare((line.qty_received + line.qty_returned), line.product_qty, precision_digits=precision) - == -1 - ): - line.delivery_status = "to receive" - elif ( - float_compare((line.qty_received + line.qty_returned), line.product_qty, precision_digits=precision) - >= 0 - ): - line.delivery_status = "received" + + qty_total = line.qty_received + line.qty_returned + if float_is_zero(qty_total, precision_digits=precision): + line.receipt_status = "pending" + elif float_compare(qty_total, line.product_qty, precision_digits=precision) >= 0: + line.receipt_status = "full" else: - line.delivery_status = "no" + line.receipt_status = "partial" @api.onchange("product_qty") def _onchange_product_qty(self): @@ -159,7 +155,7 @@ def _compute_qty_returned(self): for move in line.move_ids.filtered( lambda m: m.state == "done" and m.location_id.usage != "supplier" and m.to_refund ): - qty += move.product_uom._compute_quantity(move.product_uom_qty, line.product_uom) + qty += move.product_uom._compute_quantity(move.product_uom_qty, line.product_uom_id) line.qty_returned = qty # Overwrite the origin method to introduce the qty_on_voucher diff --git a/purchase_stock_ux/views/purchase_line_views.xml b/purchase_stock_ux/views/purchase_line_views.xml index 2f846eb8..56ca85ee 100644 --- a/purchase_stock_ux/views/purchase_line_views.xml +++ b/purchase_stock_ux/views/purchase_line_views.xml @@ -23,8 +23,8 @@ - - + + diff --git a/purchase_stock_ux/views/purchase_order_views.xml b/purchase_stock_ux/views/purchase_order_views.xml index 244d1c5f..373e3a36 100644 --- a/purchase_stock_ux/views/purchase_order_views.xml +++ b/purchase_stock_ux/views/purchase_order_views.xml @@ -13,8 +13,8 @@ - -