Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions stock_voucher_ux/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@
##############################################################################
from . import models
from . import controllers
from . import wizards
31 changes: 28 additions & 3 deletions stock_voucher_ux/models/stock_picking.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,15 +58,40 @@ def do_print_and_assign(self):
self.assign_numbers(1, self.book_id)
return self.do_print_voucher()

def button_validate(self):
# Imprime el remito al validar sólo si el tipo de operación lo pide
# (``auto_print_delivery_slip``). Autoimpreso: ya numerado en
# ``_action_done``, sólo imprime. Preimpreso: numera al imprimir por
# páginas reales (mismo camino que "Imprimir Remito").
res = super().button_validate()
if (
len(self) == 1
and self.state == "done"
and self.book_required
and self.book_id
and self.picking_type_id.auto_print_delivery_slip
):
if self.autoprinted:
return self.do_print_voucher()
return self.do_print_and_assign()
return res

def _action_done(self):
# Los talonarios preimpresos (``autoprinted=False``) se numeran al
# IMPRIMIR según las páginas reales del reporte, no en la validación por
# la estimación ``lines_per_voucher``. Evitamos que la base los
# pre-asigne acá; los autoimpresos siguen numerándose como antes.
# la estimación ``lines_per_voucher``. Los autoimpresos se numeran acá al
# validar, pero sólo si el tipo de operación pide imprimir el remito al
# validar (``auto_print_delivery_slip``) — el remito reemplaza al recibo
# de entrega nativo. Sin ese flag el número se asigna al IMPRIMIR a mano.
res = super(StockPicking, self.with_context(do_not_assign_numbers=True))._action_done()
if self._context.get("do_not_assign_numbers"):
return res
for picking in self.filtered(lambda p: p.book_required and p.book_id and p.book_id.autoprinted):
for picking in self.filtered(
lambda p: p.book_required
and p.book_id
and p.book_id.autoprinted
and p.picking_type_id.auto_print_delivery_slip
):
picking.assign_numbers(picking.get_estimated_number_of_pages(), picking.book_id)
return res

Expand Down
36 changes: 29 additions & 7 deletions stock_voucher_ux/tests/test_remito_preimpreso.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,10 @@ class TestRemitoPreimpresoNumbering(TransactionCase):
estimación ``lines_per_voucher`` (subnumera). La cantidad se determina al
imprimir, según las páginas reales del reporte (controller).

Autoimpreso (``autoprinted=True``): conserva el comportamiento previo
(asigna en la validación).
Autoimpreso (``autoprinted=True``): se numera en la validación sólo si el
tipo de operación pide imprimir el remito al validar
(``auto_print_delivery_slip``) — el remito reemplaza al recibo de entrega
nativo. Sin ese flag no se numera al validar (se asigna al imprimir a mano).
"""

@classmethod
Expand Down Expand Up @@ -54,9 +56,16 @@ def setUpClass(cls):
cls.src = cls.env.ref("stock.stock_location_stock")
cls.dest = cls.env.ref("stock.stock_location_customers")

def _make_done_picking(self, book):
def _make_done_picking(self, book, auto_print=False):
picking_type = self.env.ref("stock.picking_type_out")
picking_type.write({"book_required": True, "book_id": book.id, "voucher_required": False})
picking_type.write(
{
"book_required": True,
"book_id": book.id,
"voucher_required": False,
"auto_print_delivery_slip": auto_print,
}
)
picking = self.env["stock.picking"].create(
{
"picking_type_id": picking_type.id,
Expand Down Expand Up @@ -94,11 +103,24 @@ def test_preprinted_not_preassigned_on_validation(self):
"la numeración se hace al imprimir según páginas reales.",
)

def test_autoprinted_assigned_on_validation(self):
picking = self._make_done_picking(self.book_auto)
def test_autoprinted_assigned_on_validation_with_flag(self):
# Con auto_print_delivery_slip el remito reemplaza al recibo de entrega
# y el autoimpreso se numera al validar.
picking = self._make_done_picking(self.book_auto, auto_print=True)
self.assertEqual(picking.state, "done")
self.assertEqual(
len(picking.voucher_ids),
1,
"Un talonario autoimpreso debe asignar un único remito en la validación.",
"Un talonario autoimpreso debe asignar un único remito en la validación "
"cuando el tipo de operación tiene auto_print_delivery_slip.",
)

def test_autoprinted_not_assigned_without_flag(self):
# Sin el flag, validar no numera: el número se asigna al imprimir a mano.
picking = self._make_done_picking(self.book_auto, auto_print=False)
self.assertEqual(picking.state, "done")
self.assertFalse(
picking.voucher_ids,
"Sin auto_print_delivery_slip, un talonario autoimpreso no debe numerarse "
"en la validación; el número se asigna al imprimir.",
)
5 changes: 5 additions & 0 deletions stock_voucher_ux/wizards/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
##############################################################################
# For copyright and license notices, see __manifest__.py file in module root
# directory
##############################################################################
from . import stock_backorder_confirmation
24 changes: 24 additions & 0 deletions stock_voucher_ux/wizards/stock_backorder_confirmation.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
##############################################################################
# For copyright and license notices, see __manifest__.py file in module root
# directory
##############################################################################
from odoo import models
from odoo.addons.stock_voucher.wizards.stock_backorder_confirmation import (
StockBackorderConfirmation as VoucherBackorderConfirmation,
)


class StockBackorderConfirmation(models.TransientModel):
_inherit = "stock.backorder.confirmation"

def process(self):
# En Odoo 18 el core re-ejecuta ``button_validate`` sobre los pickings al
# confirmar el backorder, y ese camino ya imprime el remito (respetando
# ``auto_print_delivery_slip`` y numerando el preimpreso con assign=True).
# Saltamos el override de ``stock_voucher``, que reimprimía con
# ``do_print_voucher`` sin assign (dejaba el preimpreso sin numerar) y
# devolvía una tupla que el cliente no ejecuta.
return super(VoucherBackorderConfirmation, self).process()

def process_cancel_backorder(self):
return super(VoucherBackorderConfirmation, self).process_cancel_backorder()