Skip to main content

Stock y transferencias

Todo movimiento de inventario en Oxitesa pasa por un solo procedimiento: finances.sp_transfer_supply_to_entity. Es el "verbo" base del sistema de stock.

La primitiva

sp_transfer_supply_to_entity(supply, entidad destino, estado destino, …)

Lo llaman sp_close_delivery, sp_close_visit, sp_close_retirement y los flujos de carga y devolución de vehículo. Si estás escribiendo código que mueve stock y no termina acá, algo está mal.

Qué hace, en orden

La regla del fix v3: solo el inventariable cambia de ubicación

Un elemento descartable que viaja con un inventariable (por ejemplo una tubuladura que acompaña a un concentrador) no cambia su ATENTITYID: se consume. Confundir esto duplicaba stock fantasma en los depósitos.

Errores: SUPPLY_NOT_FOUND, MOVEMENT_STATUS_AVL_NOT_FOUND.

Los estados del supply

Códigos de EntityStatus con ENTITYCODE = 4 (SUPPLY):

CódigoSignificado
AVLDisponible
USEEn uso (con el paciente)
MTNEn mantenimiento — es el estado con el que vuelve lo retirado
TRSEn tránsito
DMGDañado
LSTPerdido
DSCDescartado
OOSSin stock

Cadena de movimientos válidos

DEPÓSITO → PACIENTE : USE
DEPÓSITO → DEPÓSITO : AVL | LST | DMG | DSC
DEPÓSITO → TALLER : MTN
DEPÓSITO ↔ VEHÍCULO : AVL
PACIENTE → DEPÓSITO : AVL | DMG | DSC | LST
PACIENTE → TALLER : MTN
TALLER → DEPÓSITO : AVL | DMG | DSC

Validación de stock

sp_validate_stocks_v2 es el helper que corre antes de aceptar líneas que reservan stock.

Tres cosas para saber:

  1. Lee una view, no la tabla. Consulta finances.view_stock_detail_by_origin, nunca SUPPLIES directo. Si el stock disponible "no da" y en la tabla parece que sí, mirá la view.
  2. Matchea por productId exacto o por elemento cuando el productId viene NULL.
  3. Balance acumulado: varias líneas del mismo producto o elemento en la misma corrida se restan secuencialmente, no cada una contra el stock inicial.

No tiene OUT params: es side-effect-only y deja el resultado en la temp tmp_stock_validation, que el caller inspecciona.

Las views de stock

ViewPara qué
view_stock_detail_by_originLa que consume la validación de stock
view_stock_detail_by_entityStock agrupado por entidad tenedora

Las de views/deprecated/ (view_stock_detail, view_stock_in_vehicles, y sus _v2) no se usan.

Reclasificación de genéricos

sp_reclassify_generic_supplies corrige el producto real de un supply cargado como "Genérico" seriado, usando el prefijo del número de serie contra una tabla de reglas (elemento, prefijo) → SKU.

Se invoca desde el cierre de retiro y de visita, y también existe como backfill para corregir datos históricos.

No todos los prefijos están mapeados

Hay familias donde el prefijo es ambiguo y no alcanza para resolver el producto. Esos casos quedan como genéricos a propósito: no inventes una regla sin validarla contra datos reales del ambiente.

Reservas

SUPPLIESRESERVATION bloquea stock para un remito en preparación sin bajarlo. Se crea al aceptar y se libera al cerrar (o al cancelar el remito / la tarea).

Un desajuste típico de stock es una reserva que quedó viva después de cancelar algo. Si el stock disponible es menor al físico, revisá reservas huérfanas antes que movimientos.

Detalle operativo

La skill sp-transfer-supply-to-entity y sp-validate-stocks-v2 en oxitesa-backend/.claude/skills/ tienen el paso a paso de cada sección y todos los códigos de error.