Skip to content

[FIX] purchase_stock_ux: only count returns of the line product in qty_returned - #371

Closed
fw-bot-adhoc wants to merge 1 commit into
ingadhoc:19.0from
adhoc-dev:19.0-18.0-h-126775-les-8441-fw
Closed

fw-bot-adhoc wants to merge 1 commit into
ingadhoc:19.0from
adhoc-dev:19.0-18.0-h-126775-les-8441-fw

Conversation

@fw-bot-adhoc

Copy link
Copy Markdown

Qué pasa

_compute_qty_returned() recorre todos los movimientos de la línea, sin filtrar por producto. Si se recibe un producto equivocado, se lo devuelve al proveedor marcando "Para abonar", y después se corrige el producto en la misma línea de la orden de compra, esa devolución se descuenta de lo que queda por facturar del producto nuevo:

qty_to_invoice = product_qty - qty_invoiced - qty_returned
               = 760        - 0            - 760            = 0

La línea queda en invoice_status = 'invoiced' sin nada facturado, y la factura de proveedor no se puede crear: "No hay líneas para facturar". El estado no se puede revertir desde la interfaz, porque to_refund solo es editable en el asistente de devolución, antes de validarla.

El cambio

Recorrer _get_po_line_moves(), que filtra los movimientos por el producto de la línea. Es el mismo helper que usa el core en _compute_qty_received(), así que las dos cantidades pasan a construirse sobre el mismo conjunto de movimientos.

Una devolución del producto que está en la línea se sigue contando: el caso de devolución con nota de crédito no cambia.

Se agrega también move_ids.to_refund al depends. Ese flag es el que decide si un movimiento cuenta como devuelto, y sin él corregirlo dejaba intactos los campos almacenados qty_to_invoice e invoice_status.

Cómo probarlo

purchase_stock_ux/tests/test_qty_returned.py:

  • test_return_of_replaced_product_not_counted — reproduce el caso: recibir A, devolver A con "Para abonar", cambiar la línea al producto B. Espera qty_returned = 0 y la línea facturable. Sin el fix falla con AssertionError: 10.0 != 0.
  • test_return_of_same_product_counted — no regresión: la devolución del mismo producto de la línea sigue contando (qty_returned = 10, qty_to_invoice = 0). Pasa con y sin el fix.
--test-enable --test-tags /purchase_stock_ux:TestQtyReturned

Verificado en 18.0: con el fix 0 failed, 0 error(s) of 2 tests; revirtiendo solo el cambio del modelo, 1 failed.

Nota para el review

Los campos qty_to_invoice e invoice_status son store=True y no dependen de to_refund, así que las órdenes ya bloqueadas no se recalculan solas al actualizar el módulo. Queda a definir si esta corrección merece un script que fuerce el recómputo de las líneas con devoluciones.

Forward-Port-Of: #370

…y_returned

_compute_qty_returned() iterated over every move of the line, so a
return was counted even when it belonged to a product that is no longer
the one on the line. When a wrong product is received, returned to the
vendor marked to refund, and then corrected on the same purchase order
line, that return was subtracted from what is left to bill for the new
product: qty_to_invoice dropped to 0 and invoice_status became
'invoiced' with nothing actually billed, so the vendor bill could not be
created ("There is no invoiceable line").

Iterate over _get_po_line_moves() instead, which filters the moves by
the product of the line. It is the same helper the core uses in
_compute_qty_received(), so both quantities are now built from the same
set of moves. A return of the product that is on the line keeps being
counted, so the refund case is unchanged.

Add move_ids.to_refund to the depends as well: the flag is what decides
whether a move counts as returned, and without it correcting the flag
left the stored qty_to_invoice and invoice_status untouched.

Signed-off-by: les-adhoc <les@adhoc.inc>
X-original-commit: 889d8a3
@roboadhoc

Copy link
Copy Markdown
Contributor

Pull request status dashboard

@fw-bot-adhoc

Copy link
Copy Markdown
Author

@les-adhoc @mav-adhoc cherrypicking of pull request #370 failed.

stdout:

Auto-merging purchase_stock_ux/models/purchase_order_line.py
CONFLICT (content): Merge conflict in purchase_stock_ux/models/purchase_order_line.py
Auto-merging purchase_stock_ux/tests/__init__.py
CONFLICT (content): Merge conflict in purchase_stock_ux/tests/__init__.py

Either perform the forward-port manually (and push to this branch, proceeding as usual) or close this PR (maybe?).

:shipit: you can use git-fw to re-do the forward-port for you locally.

⚠️ after resolving this conflict, you will need to merge it via @roboadhoc.

More info at https://github.com/odoo/odoo/wiki/Mergebot#forward-port

@fw-bot-adhoc

Copy link
Copy Markdown
Author

@les-adhoc @mav-adhoc this forward port of #370 is awaiting action (not merged or closed).

@les-adhoc

Copy link
Copy Markdown
Contributor

El forward-port automático quedó con conflictos sin resolver por la divergencia 18.0/19.0 en _compute_qty_returned (19.0 ya usa _is_purchase_return() y descartó el _compute_qty_received / _is_exchange_move_helper de 18.0). En vez de resolverlo acá, se rearmó una rama limpia sobre el 19.0 actual: #372. Cierro este.

@les-adhoc les-adhoc closed this Sep 15, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants