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.