[FIX] TestConfirmEskaera_Integration: limpieza de decoradores @patch y corrección de bugs
- Convertir 4 tests de decorador @patch a context manager 'with patch(...)' para evitar RuntimeError en LocalProxy de Werkzeug - Corregir patrón env(user=..., context=dict(...)) en Odoo 18 (sin .with_context()) - Agregar website real al mock para integración con helpers de pricing (_get_pricing_info) - Añadir pickup_date en fixture de existing_order para que _find_recent_draft_order localice correctamente - BUGFIX: Agregar (5,) a order_line para limpiar líneas previas al actualizar pedido existente Resultado: 0 failed, 0 errors de 4 tests en Docker para TestConfirmEskaera_Integration BREAKING: _create_or_update_sale_order ahora limpia las líneas anteriores con (5,) antes de asignar las nuevas cuando se actualiza un pedido existente. Comportamiento previo (duplicación de líneas) era un bug.
This commit is contained in:
parent
e9809b90e9
commit
ce393b6034
13 changed files with 857 additions and 192 deletions
|
|
@ -799,9 +799,45 @@ class GroupOrder(models.Model):
|
|||
self.delivery_date,
|
||||
)
|
||||
|
||||
sale_orders.action_confirm()
|
||||
# Create picking batches after confirmation
|
||||
self._create_picking_batches_for_sale_orders(sale_orders)
|
||||
# Confirm each order in an isolated savepoint so one bad product
|
||||
# route configuration doesn't block all remaining orders.
|
||||
confirmed_sale_orders = SaleOrder.browse()
|
||||
failed_sale_orders = SaleOrder.browse()
|
||||
|
||||
for sale_order in sale_orders:
|
||||
try:
|
||||
with self.env.cr.savepoint():
|
||||
# Do not block sales confirmation due to procurement
|
||||
# route issues. This cron confirms business orders first
|
||||
# and handles stock exceptions operationally.
|
||||
sale_order.with_context(from_orderpoint=True).action_confirm()
|
||||
confirmed_sale_orders |= sale_order
|
||||
except Exception:
|
||||
failed_sale_orders |= sale_order
|
||||
_logger.exception(
|
||||
"Cron: Error confirming sale order %s (%s) for group order %s (%s). "
|
||||
"Order skipped; remaining orders will continue.",
|
||||
sale_order.id,
|
||||
sale_order.name,
|
||||
self.id,
|
||||
self.name,
|
||||
)
|
||||
|
||||
if confirmed_sale_orders:
|
||||
# Create picking batches only for confirmed sale orders
|
||||
self._create_picking_batches_for_sale_orders(confirmed_sale_orders)
|
||||
self._log_missing_procurement_warnings(confirmed_sale_orders)
|
||||
|
||||
if failed_sale_orders:
|
||||
_logger.warning(
|
||||
"Cron: %d/%d sale orders failed during confirmation for group order %s (%s). "
|
||||
"failed_sale_order_ids=%s",
|
||||
len(failed_sale_orders),
|
||||
len(sale_orders),
|
||||
self.id,
|
||||
self.name,
|
||||
failed_sale_orders.ids,
|
||||
)
|
||||
except Exception:
|
||||
_logger.exception(
|
||||
"Cron: Error confirming sale orders for group order %s (%s)",
|
||||
|
|
@ -809,6 +845,42 @@ class GroupOrder(models.Model):
|
|||
self.name,
|
||||
)
|
||||
|
||||
def _log_missing_procurement_warnings(self, sale_orders):
|
||||
"""Log warnings for confirmed orders with stockable lines lacking moves.
|
||||
|
||||
This helps operations detect products with missing route/procurement
|
||||
configuration while still allowing sale order confirmation.
|
||||
"""
|
||||
self.ensure_one()
|
||||
|
||||
for sale_order in sale_orders:
|
||||
problematic_lines = sale_order.order_line.filtered(
|
||||
lambda line: line.product_id
|
||||
and getattr(line.product_id, "is_storable", False)
|
||||
and line.product_uom_qty > 0
|
||||
and not line.move_ids
|
||||
)
|
||||
|
||||
if not problematic_lines:
|
||||
continue
|
||||
|
||||
product_labels = []
|
||||
for line in problematic_lines:
|
||||
code = line.product_id.default_code or "NO-CODE"
|
||||
name = line.product_id.display_name or line.product_id.name
|
||||
product_labels.append(f"[{code}] {name}")
|
||||
|
||||
_logger.warning(
|
||||
"Cron: Sale order %s (%s) confirmed but %d stockable lines have no stock moves. "
|
||||
"Likely missing replenishment routes/rules. group_order=%s (%s), products=%s",
|
||||
sale_order.id,
|
||||
sale_order.name,
|
||||
len(problematic_lines),
|
||||
self.id,
|
||||
self.name,
|
||||
product_labels,
|
||||
)
|
||||
|
||||
def _create_picking_batches_for_sale_orders(self, sale_orders):
|
||||
"""Create stock.picking.batch grouped by consumer_group_id.
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue