Appearance
Flag Actualiza Costo en Carga de Compras
Módulo: Compra Tipo: Process Estado: Implementado Fecha: 2026-06-11
Descripción
Cada ítem del subdiario de compras expone un checkbox Actualizar costo (actualiza_costo). Este flag es la única autoridad para decidir si la carga de una compra actualiza el costo almacenado del producto. Aplica a todos los artículos, incluyendo los que tienen stock habilitado.
Antes de esta corrección, tres bugs ignoraban el flag:
- Bug A:
MovimientoStockService::insert()actualizaba el costo de TODO movimiento de tipo INGRESO sin considerar el flag — solo los artículos sin stock respetaban la exclusión. - Bug B: Variable de ítems sobreescrita entre iteraciones del formulario (typo
chequeden lugar dechecked), haciendo que el último ítem del form pisara el valor del anterior al editar. - Bug C: Al cargar un comprobante existente para editar, el checkbox mostraba
undefineden lugar del valor persistido.
Reglas de Negocio
RN-001: Flag como única autoridad de actualización de costo
El flag actualiza_costo del ítem es la única decisión que determina si esa compra actualiza el costo del producto. Ninguna otra capa del flujo de compras puede actualizar el costo de forma incondicional.
| Flag | Stock habilitado | ¿Actualiza costo? |
|---|---|---|
| ✅ marcado (default) | sí | ✅ sí |
| ✅ marcado | no | ✅ sí |
| ☐ desmarcado | sí | ❌ no |
| ☐ desmarcado | no | ❌ no |
Movimientos no originados en compras (ej. ajustes manuales de stock) actualizan el costo normalmente, sin ser afectados por este flag.
RN-002: Checkbox refleja el valor persistido al editar
Al cargar un comprobante existente para editar, el checkbox de cada ítem DEBE mostrar el valor almacenado en el registro, no un valor indefinido o por defecto. Esto garantiza que el usuario vea el estado real antes de modificar.
RN-003: Valor independiente por ítem en el formulario
Cada ítem del formulario mantiene su propio valor de actualiza_costo. La modificación del flag de un ítem no afecta los demás ítems del mismo comprobante.
Frontend
Interacciones
- Cada fila del formulario de ítems de compra muestra un checkbox Actualizar costo habilitado por defecto.
- El usuario puede desmarcar el checkbox para indicar que esa compra no debe modificar el costo del artículo.
- Al editar un comprobante existente, el checkbox restaura el valor guardado.
Estados del checkbox
| Estado | Significado |
|---|---|
| Marcado (default) | La carga actualiza el costo del producto |
| Desmarcado | La carga NO actualiza el costo del producto |
Backend
Flujo de actualización de costo
POST /compras/comprobante
Para cada ítem del comprobante:
1. Leer flag actualiza_costo del payload
2. Si artículo tiene stock → llamar MovimientoStockService::insert(actualizarCosto: flag)
3. MovimientoStockService::insert() solo ejecuta el bloque de actualización de costo
cuando actualizarCosto === true
4. Si artículo NO tiene stock → llamar la actualización directa solo si flag === trueArchivos afectados
bautista-backend/service/Compra/MovimientoStockService.php— parámetro$actualizarCostoañadido ainsert()bautista-app/— corrección del typochequed→checkedy restauración del valor al editar
Consideraciones Técnicas
- El parámetro
$actualizarCostose agregó como posicional con defaulttrueenMovimientoStockService::insert()para no romper callers que no son de compras (ajustes manuales, etc.). - Los movimientos de stock generados por fuera del flujo de compras (ej.
MovimientoStockManualService) no pasan el parámetro y conservan el comportamiento original de actualizar siempre el costo.
Referencias
- Spec:
openspec/changes/costo-compras-tilde-actualizar/spec.md - Relacionado: Subdiario de Compras Excel