El módulo de inventario le permite controlar todos sus productos, almacenes, movimientos de mercancía y niveles de stock en tiempo real.
| Campo | Descripción |
|---|---|
| SKU | Código único del producto (ej: PROD-001) |
| Nombre | Nombre del producto |
| Descripción | Detalle adicional |
| Imagen | Foto del producto |
| Categoría | Clasificación del producto |
| Unidad de medida | Unidad base (unidad, caja, kg, etc.) |
| Costo | Precio de compra/adquisición |
| Precio de venta | Precio al público |
| Punto de reorden | Nivel mínimo antes de reordenar |
| Cantidad a reordenar | Cuánto pedir al proveedor |
| Tiempo de entrega | Días que tarda el proveedor en entregar |
| Impuestos | Tasa de ITBIS u otros impuestos aplicables |
Puede alternar entre dos vistas:
En la parte superior de la lista de productos verá:
Haga clic en un producto para ver su ficha completa:
Cada producto tiene un flag is_public independiente de is_active. Por defecto, los productos son privados - su inventario interno no se expone hasta que usted decida qué publicar.
Tres formas de marcar un producto como público:
Solo los productos is_active=true AND is_public=true aparecen en el catálogo de su tienda en tienda.axentra.com.do/<slug>.
Ver: Tienda Pública.
Organice sus productos en una estructura jerárquica:
Ejemplo:
Electrónica
├── Teléfonos
│ ├── iPhone
│ └── Samsung
├── Computadoras
└── Accesorios
Alimentos
├── Bebidas
└── Snacks
Defina equivalencias entre unidades:
| De | A | Factor |
|---|---|---|
| Caja | Unidad | 12 |
| Kg | Gramo | 1000 |
| Paquete | Unidad | 6 |
Esto permite comprar en una unidad (cajas) y vender en otra (unidades) sin perder el control del inventario.
Cree múltiples almacenes para representar sus instalaciones físicas:
Cada almacén tiene: código, nombre, dirección y estado (activo/inactivo).
Dentro de cada almacén, cree ubicaciones específicas:
El stock se rastrea a nivel de ubicación, permitiéndole saber exactamente dónde está cada producto.
Cada vez que el inventario cambia, se registra un movimiento. Existen 9 tipos:
| Tipo | Efecto | Cuándo Ocurre |
|---|---|---|
| Compra | +stock | Recibe mercancía del proveedor |
| Venta | −stock | Se vende al cliente (automático desde POS) |
| Transferencia | Mueve entre ubicaciones | Envío entre almacenes o reubicación |
| Ajuste positivo | +stock | El conteo físico muestra más de lo esperado |
| Ajuste negativo | −stock | Pérdida, daño, vencimiento |
| Desecho | −stock | Producto dañado e inutilizable |
| Devolución cliente | +stock | Un cliente devuelve un producto |
| Devolución proveedor | −stock | Devuelve mercancía defectuosa al proveedor |
| Conteo | ±stock | Ajuste automático por conteo físico |
Cada movimiento registra:
Cuando hay más de un almacén (sucursal, depósito, vehículo de delivery), es normal mover mercancía de uno a otro sin que sea una venta. Axentra registra estas transferencias como un par de movimientos enlazados que mantienen el costo del producto y dejan auditoría de la salida y la entrada.
Vaya a Inventario → Movimientos → Nueva Transferencia o seleccione "Transferencia" como tipo en el formulario de nuevo movimiento.
Axentra registra dos movimientos atómicos con la misma referencia:
Ambos llevan el mismo costo unitario - el costo promedio actual del producto en el almacén de origen. El costo no cambia con la transferencia.
Las transferencias no generan asientos de GL. Son solo movimientos de inventario; el valor total del activo "Inventario" en el balance no cambia, solo se redistribuye entre almacenes. Por eso una transferencia mal ejecutada no afecta los reportes financieros - solo el inventario físico de cada almacén.
El conteo físico le permite verificar que el stock registrado en el sistema
coincida con la mercancía real en su almacén, y corregir la diferencia.
La pantalla es una tabla de conciliación: una fila por producto, con lo que el
sistema espera, lo que usted contó, y la diferencia entre ambos con su impacto
en costo.
Solo se ajustan los productos que usted contó. Una casilla que deja vacía
significa "no lo conté" y el sistema no toca ese stock.
Esto es deliberado: casi ningún conteo cubre el almacén completo de una sola
vez. Si dejar una casilla vacía se interpretara como "conté cero", publicar los
ajustes daría de baja toda la mercancía que nadie alcanzó a contar.
Si de verdad contó cero unidades de un producto, escriba 0. No es lo mismo.
Al iniciar el conteo elija cómo quiere trabajar:
| Tipo | Qué hace | Cuándo usarlo |
|---|---|---|
| Con almacén bloqueado | El almacén no acepta ventas ni movimientos mientras dure el conteo | Cuando puede cerrar. Nada cambia bajo sus pies, así que la comparación es directa |
| Conteo cíclico | El almacén sigue vendiendo durante el conteo | Cuando no puede cerrar: un solo almacén, un colmado, una farmacia de turno |
En el conteo cíclico cada línea se compara contra lo que debía haber en el
estante en el momento en que usted la contó, no contra la foto del inicio. Si
vendió 5 unidades a las 10:00 y cuenta ese producto a las 11:00, la venta ya
está descontada y el conteo sale en cero. No aparece como faltante y el ajuste
no descuenta la venta por segunda vez.
La columna Sistema muestra esa cantidad ya ajustada. Al lado, entre
paréntesis, verá la cantidad original y los movimientos del período.
Con almacén bloqueado: mientras el conteo esté abierto, la caja no puede
facturar contra ese almacén y los recibos de compra se rechazan. Es la causa
número uno de "el sistema no me deja vender". La pantalla se lo advierte al
iniciar y mientras el conteo está abierto.
1. Iniciar el conteo
El sistema toma una foto del stock actual y arma la lista de productos a contar.
2. Contar
Para cada producto, escriba en la columna Contado la cantidad que tiene
físicamente en el estante. La columna Diferencia se calcula sola: en rojo si
falta mercancía, en verde si sobra, y con el impacto en costo al lado.
Cada cantidad se guarda sola al salir de la casilla, así que cerrar el navegador
o quedarse sin batería no le cuesta el trabajo del pasillo. Un check verde
confirma que la línea quedó guardada.
Para moverse rápido:
3. Revisar antes de publicar
Ordene por Mayor impacto en costo para ver primero las diferencias que
valen dinero. Cada línea muestra quién la contó.
Si una diferencia le parece sospechosa, use el botón de volver a contar de
esa fila: la línea vuelve a quedar pendiente y puede contarla de nuevo. Volver a
contar no es lo mismo que escribir cero.
Al pie de la pantalla, siempre visible, está la conciliación completa del
conteo: cuántas líneas lleva contadas, cuántas faltan, la diferencia neta en
unidades y el impacto neto en costo. Estos totales cubren todo el conteo,
no solo lo que se ve en pantalla, así que siguen siendo correctos aunque tenga
un filtro o una búsqueda activa.
4. Publicar los ajustes
Haga clic en Contabilizar Ajustes. Antes de escribir nada, el sistema le
muestra cuántas líneas va a ajustar y el impacto neto en costo.
Al confirmar se generan los movimientos de ajuste y sus asientos contables:
Todo conteo real encuentra mercancía en el estante que el sistema no tiene en
existencia: una compra registrada al almacén equivocado, una devolución que
nunca se procesó, un error al recibir.
Escanee el producto. Si existe en el catálogo pero no está en la lista del
conteo, el sistema le ofrece agregarlo. La fila entra con la existencia que
el sistema tenga en ese momento (normalmente cero), se marca con la etiqueta
Encontrado, y lo que usted cuente entra como sobrante.
Un producto que se maneja por lotes aparece con una fila por lote, y cada
fila muestra su número de lote y su vencimiento. Cuente cada lote por separado
contra el empaque que tiene en la mano: el ajuste se aplica al lote que usted
contó, no a uno que el sistema elija.
Un producto por lotes que no esté en la lista no se puede agregar desde el
conteo, porque el ajuste necesita saber a qué lote pertenece. Regístrelo como
entrada de mercancía indicando el lote del empaque y vuelva a contarlo.
No aparecen en la lista, y es intencional:
| Estado | Significado |
|---|---|
| Contando | El conteo está abierto y se están registrando cantidades |
| Contabilizando | Los ajustes se están aplicando |
| Contabilizado | Los ajustes ya se aplicaron al inventario |
| Cancelado | El conteo se descartó sin cambiar nada |
Si la contabilización se interrumpe, el conteo queda en Contabilizando y la
pantalla se lo indica. Vuelva a presionar Contabilizar Ajustes: las líneas
que ya se aplicaron no se repiten.
Un conteo quedó abierto y nadie lo va a terminar. Los conteos abiertos
aparecen listados al entrar a la pantalla, con el almacén y el tiempo que
llevan. Puede abrirlos o cancelarlos desde ahí. Un conteo abandonado sin
cantidades registradas se cancela solo a las 24 horas, y el almacén se libera.
Un conteo con cantidades ya registradas nunca se cancela solo. Ese trabajo
es de alguien y el sistema no lo descarta por su cuenta: queda esperando a una
persona.
El almacén quedó bloqueado y no hay conteo que cancelar. La pantalla lo
detecta y ofrece Forzar desbloqueo, que reabre el almacén. Requiere permiso
de contabilizar conteos y descarta cualquier conteo abierto de ese almacén, así
que es el último recurso.
Un producto por lotes no deja contabilizar. Si la línea no tiene lote
registrado, el sistema se niega a publicar el ajuste en vez de adivinar a qué
lote pertenece. Vuelva a contar esa línea para que quede con su lote.
El almacén siguió vendiendo y ya no queda mercancía para descontar. En un
conteo cíclico puede pasar que la diferencia que usted registró sea mayor que la
existencia que queda al momento de contabilizar. El sistema se lo dice antes de
aplicar nada y el conteo sigue abierto: vuelva a contar esa línea contra lo que
hay ahora.
| Acción | Permiso |
|---|---|
| Iniciar un conteo | Iniciar conteos |
| Registrar cantidades, agregar productos, cancelar | Registrar conteos |
| Contabilizar ajustes y forzar desbloqueo | Contabilizar conteos |
El sistema genera alertas automáticas para situaciones que requieren atención:
| Alerta | Severidad | Significado |
|---|---|---|
| Stock bajo (debajo del punto de reorden) | Alta | Es momento de pedir más al proveedor |
| Producto agotado | Crítica | No hay stock disponible para vender |
| Sobrestock | Media | Hay más inventario del necesario (capital inmovilizado) |
| Stock negativo | Crítica | Error en el sistema - el stock no puede ser negativo |
| Movimiento lento | Baja | Producto que no se ha vendido en mucho tiempo |
Las alertas aparecen en el panel de inventario. Puede:
Configure cuándo y cuánto pedir de cada producto:
| Campo | Ejemplo | Significado |
|---|---|---|
| Punto de reorden | 50 unidades | Cuando el stock llegue a 50, es hora de pedir |
| Cantidad a reordenar | 200 unidades | Pida 200 unidades al proveedor |
| Tiempo de entrega | 5 días | El proveedor tarda 5 días en entregar |
El sistema analiza el consumo promedio diario de cada producto y sugiere:
Puede aceptar o ajustar estas sugerencias.
Vaya a Inventario → Reorden → Sugerencias y elija el almacén. El sistema:
Si el producto no tiene ventas en los últimos 30 días, no aparece en las sugerencias.
Para aplicar una sugerencia individual: haga clic en Aplicar en la fila del producto. La cantidad sugerida pasa al campo Punto de reorden y Cantidad a reordenar del nivel de stock.
Puede aplicar todas las sugerencias de golpe con Aplicar Todas si confía en la base de datos. La operación es idempotente: ejecutarla varias veces el mismo día siempre da el mismo resultado.
El campo Tiempo de entrega (LeadTimeDays) se configura por producto en Inventario → Productos → Detalle → Niveles de Stock. Si no se configura, se asume 7 días por defecto. Conviene ajustarlo por proveedor real, ya que la sugerencia del punto de reorden es directamente proporcional.
Para productos que requieren seguimiento individual (equipos electrónicos, electrodomésticos):
Al recibir mercancía, ingrese los números de serie de cada unidad. Cada serial tiene un estado:
| Estado | Significado |
|---|---|
| Disponible | En inventario, listo para vender |
| Reservado | Asignado a una venta pendiente |
| Vendido | Entregado al cliente |
| Devuelto | Regresó del cliente |
| Desechado | Dado de baja |
Busque cualquier número de serie para saber:
Asigne impuestos a cada producto:
| Tipo de Impuesto | Descripción |
|---|---|
| ITBIS | Impuesto a la Transferencia de Bienes (18%) |
| ISC | Impuesto Selectivo al Consumo |
| Comunicaciones | Impuesto a telecomunicaciones |
| Otros | Cualquier impuesto adicional |
Los impuestos pueden calcularse como:
El sistema calcula automáticamente el costo de cada producto usando el método de costo promedio ponderado:
Ejemplo:
Esto significa que:
Las promociones permiten aplicar descuentos automáticos a productos o categorías sin que el cajero tenga que calcular manualmente. Se configuran una vez y el POS las aplica solo cuando corresponda (fecha vigente, monto mínimo, producto incluido).
| Tipo | Comportamiento |
|---|---|
Porcentaje (percent_off) |
Descuenta un % del subtotal del producto. Ejemplo: 10% off en cualquier camisa. |
Monto Fijo (fixed_off) |
Descuenta un monto fijo, hasta el subtotal de la línea. Ejemplo: RD$ 50 menos en cada compra mayor a RD$ 500. |
Compra X, Lleva Y (buy_x_get_y) |
Por cada X unidades compradas, Y se llevan al precio más bajo de la línea. Ejemplo: 2x1, 3x2. |
Vaya a Inventario → Promociones y haga clic en Nueva Promoción.
Cuando el cajero termina una venta, el motor evalúa todas las promociones activas y aplica las que correspondan, ordenándolas de mayor descuento a menor. Esto significa que si dos promociones aplican al mismo producto, gana la que descuente más al cliente.
Filtros que se aplican antes de descontar:
Después de aplicar las promociones y completar la venta, el sistema incrementa el contador de usos para las promociones aplicadas. Esto es lo que cierra el ciclo de "Usos máximos totales".
Para detener una promoción antes de su fecha de fin:
Las ventas anteriores con la promoción aplicada no se modifican - el descuento queda histórico en esas transacciones.
"La promoción no se aplica en el POS"
Verifique: (a) está activa, (b) la fecha actual está dentro del rango, (c) el producto/categoría coincide con el alcance, (d) el monto mínimo se cumple.
"La promoción se aplicó a productos que no debían"
Probablemente el alcance está en "Todo" cuando debería ser "Categoría" o "Producto" específico.
"El descuento es mayor al esperado"
Hay otra promoción aplicando primero por dar mayor descuento. Revise todas las promociones activas para esa fecha.
Cuando se completa una venta en el POS:
Los movimientos de inventario generan asientos contables automáticamente:
Las cuentas contables se configuran en Contabilidad → Mapeo de Cuentas.
Las alertas de stock bajo aparecen como notificaciones en el menú lateral con un contador de alertas pendientes.
A partir de la migración 000040, los productos tienen tres modos de rastreo. Pickea el correcto al crear el producto, el modo es inmutable después.
Importante: una vez creado el producto, el modo de rastreo no se puede cambiar. Cambiar de
bulkabatchoserialized(o viceversa) dejaría las filas destock_levels,stock_movements,batchesyserial_numbershuérfanas, indexadas bajo el modo viejo. El backend rechaza el cambio coninventory: tracking mode is immutable once a product existsy la UI deshabilita el dropdown al editar. Si te equivocaste, desactiva el producto y crea uno nuevo con el modo correcto.
| Modo | Qué se rastrea | Cuándo usarlo |
|---|---|---|
Bulto (bulk) |
Cantidad agregada por almacén | Productos sin vencimiento (papelería, hardware, ropa) |
Lote (batch) |
Por lote con número, fabricación y vencimiento | Alimentos perecederos, medicamentos no controlados |
Serial (serialized) |
Por unidad con número de serie | Electrónica con serial, sustancias controladas (Lista I-V) |
Para productos con modo batch (o serialized + controlado), tienes dos caminos:
Camino A: Recibo dedicado (/inventory/receipts/new)
(producto, número de lote) y registra el movimiento de entrada apuntando a ese lote.Camino B: Diálogo de Movimiento (Inventario → Movimientos → Recibir Mercancía)
batch o serialized controlado, el diálogo muestra los campos de lote automáticamente.FindOrCreateBatch): si vuelves a recibir el mismo número de lote, suma cantidad en lugar de fallar por duplicado.Si configuraste Vida útil por defecto en el producto, el sistema calcula el vencimiento sumando esos días a la fecha de fabricación cuando la dejas en blanco.
Para mermas de un lote concreto (rotura, contaminación, derrame), abre Inventario → Movimientos → Descartar Mercancía. Cuando el producto seleccionado es batch-tracked, el diálogo agrega un selector de lote: pickeas exactamente cuál lote sale del inventario. El movimiento queda registrado contra ese lote, no contra un agregado anónimo, así el kardex del lote queda consistente.
Cuando un producto batch se vende en el POS:
Cada lote consumido se imprime en el conduce con su número y fecha de vencimiento - es el documento que viaja con la mercancía y que MISPAS audita en inspecciones (Decreto 246-06 Art. 105).
El e-CF emite FechaElaboracion y FechaVencimientoItem por línea cuando el producto tiene modo batch o serialized controlado. El XSD DGII v1.1 los marca opcionales - productos bulk los dejan vacíos.
ACTIVE -> QUARANTINE (pausa por QC)
ACTIVE -> EXPIRED (cron diario detecta vencimiento)
ACTIVE -> DEPLETED (la última unidad se vendió)
ACTIVE -> RECALLED (recall manual)
QUARANTINE -> ACTIVE (QC liberó el lote)
QUARANTINE -> RECALLED (recall durante hold)
Los estados terminales (EXPIRED, DEPLETED, RECALLED) son de un solo sentido. Para volver a vender el mismo número de lote, recibe una nueva entrega - se crea una fila de lote nueva.
Un cron diario a las 06:00 AST escanea todos los lotes ACTIVE/QUARANTINE con vencimiento <= 30 días (configurable). Crea una alerta abierta por (lote, almacén) - el índice único parcial garantiza que correr el cron dos veces el mismo día no duplica alertas.
Para lotes EXPIRED/QUARANTINE/RECALLED, un usuario con permiso inventory.batch.writeoff puede dar de baja el inventario restante:
5.4.1.05 Pérdidas por Vencimiento.5.4.1.06 Pérdidas por Recall.Estas son cuentas separadas de la merma genérica (5.3.10.03) para que MISPAS pueda extraer pérdidas regulatorias de manera independiente.
A partir de la migración 000042, cada inquilino puede definir sus propios atributos de productos y servicios sin tocar código. Cada concesionario, farmacia, supermercado y dueño de tienda guarda lo que necesita: VIN, año modelo, talla, principio activo, marca del proveedor, lo que sea relevante.
| Tipo | Para qué se usa | Validación al guardar |
|---|---|---|
Texto (STRING) |
Nombres, descripciones libres, notas, códigos alfanuméricos (VIN, lote del proveedor) | Solo no vacío si está marcado como obligatorio |
Número entero (INTEGER) |
Año modelo, kilometraje, cantidad de cilindros | El sistema rechaza decimales y texto no numérico |
Decimal (DECIMAL) |
Peso en kg, capacidad en litros, dimensiones | Acepta enteros, decimales y cadenas convertibles |
Lista desplegable (DROPDOWN) |
Combustible, transmisión, categoría interna, talla | El valor debe estar en la lista de opciones definida; lo demás se rechaza |
VIN en concesionarios o Principio activo en farmacias.ILIKE. Si lo apagas, el valor sigue guardado pero no aparece en la búsqueda.PRODUCT, SERVICE, o BOTH. Un campo VIN solo tiene sentido en productos físicos. Un campo Duración del servicio solo en servicios.Ve a Inventario → Campos Personalizados (requiere permiso inventory.product.manage, asignado a ADMIN y MANAGER).
^[a-z][a-z0-9_]{0,58}[a-z0-9]$ (empieza con letra, solo minúsculas, dígitos y guion bajo).Lista desplegable, escribe las opciones una por línea.Una vez creada, la clave y el tipo quedan congelados. Cambiarlos invalidaría silenciosamente todos los valores ya guardados en productos. La etiqueta, las opciones, las banderas, el alcance y el orden sí se pueden editar libremente.
Si te equivocaste con la clave o el tipo, desactiva el campo y crea uno nuevo. Los valores históricos quedan en el JSONB del producto pero el formulario deja de mostrarlos.
El botón Desactivar marca el campo como inactivo. El formulario de productos deja de mostrarlo y la búsqueda deja de incluir su valor, pero los valores existentes en cada producto se conservan. Esto protege la trazabilidad histórica: si auditaste tres meses con un campo "Origen", desactivarlo no borra el origen registrado en cada producto.
Para mostrar campos desactivados en la lista, prende el switch Mostrar desactivados en la barra superior. No hay borrado físico desde la UI.
Los valores viven en una columna JSONB llamada custom_field_values directamente en la fila del producto, indexada por la clave del campo:
{
"vin_number": "1HGBH41JXMN109186",
"ano_modelo": 2024,
"combustible": "Gasolina"
}
Esto permite:
int64, decimales como número, dropdowns como string validado.GIN automático sobre la columna para futuras consultas estructuradas.Hay un campo separado en products llamado search_tokens (texto, indexado con pg_trgm) que la aplicación mantiene en cada Crear o Actualizar de producto. Contiene:
lower(nombre) || ' ' || lower(sku) || ' ' || valor1 || ' ' || valor2 ...
donde valor1, valor2, etc. son los valores de solo los campos marcados como buscables. La búsqueda en /inventory y la del POS hacen ILIKE contra este texto único, así un solo WHERE cubre nombre, SKU y todos los campos custom buscables sin necesidad de joins.
Cuando prendes o apagas el flag Buscable de un campo, los productos existentes mantienen su search_tokens viejo hasta que los actualices. Para forzar un recálculo en lote, pulsa Reindexar Búsqueda en la página de campos personalizados. El sistema recorre todos los productos activos y reescribe los tokens. Es una operación idempotente; corrérla varias veces no rompe nada.
Es la única acción que no se ejecuta automáticamente: cambiar la bandera es barato (UPDATE product_custom_fields SET is_searchable = ...), recorrer los productos no.
El backend valida en cada createProduct y updateProduct:
appliesTo coincide con el tipo del producto."texto" para INTEGER, valor fuera de las opciones para DROPDOWN, etc.).inventory: required custom field has no value.El frontend hace la misma validación de "obligatorio" antes de enviar para mostrar el error inline sin esperar el round-trip.
ILIKE sobre tokens. "Filtrar productos donde Color = Rojo" exacto requiere un siguiente fase con UI de filtros./tienda/<slug>, dilo y agregamos un flag showOnStorefront por campo.| Término | Significado |
|---|---|
| Almacén (warehouse) | Bodega física. Cada movimiento de inventario apunta a uno. |
| Ubicación (location) | Subdivisión dentro de un almacén (estante, gaveta, refrigerador). Un almacén tiene N ubicaciones. |
| Bulto (bulk) | Modo de rastreo agregado: solo se cuenta cantidad por almacén. Sin lote, sin vencimiento. |
| Lote (batch) | Lote de fabricación con número, fecha de fabricación y fecha de vencimiento. Trazabilidad granular para perecederos y medicamentos. |
| Serial (serialized) | Rastreo por unidad individual con número de serie único. Obligatorio para sustancias controladas (Ley 50-88). |
| Conteo con almacén bloqueado | Conteo físico durante el cual el almacén no acepta ventas ni movimientos. La cantidad del sistema no cambia mientras se cuenta. |
| Conteo cíclico | Conteo físico que no bloquea el almacén. Cada línea se concilia contra lo que debía haber en el estante en el momento en que se contó, de modo que las ventas del período no aparecen como faltante. |
| Diferencia | Cantidad contada menos cantidad esperada. Negativa es faltante, positiva es sobrante. |
| Mercancía encontrada | Producto hallado en el estante que el sistema no tenía en existencia. Se agrega al conteo y entra como sobrante. |
| FEFO | First Expired, First Out. Política de despacho que consume primero el lote con vencimiento más cercano. El POS aplica FEFO automáticamente cuando no se escanea un lote específico. |
| FIFO | First In, First Out. El primero en entrar es el primero en salir. Axentra usa FEFO por encima de FIFO en productos por lote: el vencimiento manda sobre la antigüedad de recepción. |
| Kardex | Historial cronológico de movimientos de un producto o lote: entradas, salidas, ajustes, transferencias. |
| ROP (Reorder Point) | Punto de reorden. Cantidad mínima a partir de la cual el sistema sugiere reabastecer. |
| Costo promedio (avg cost) | Costo unitario calculado como promedio ponderado de las entradas. Cada compra ajusta el promedio; las salidas usan el promedio vigente para postear COGS. |
| COGS | Cost of Goods Sold. Costo de la mercancía vendida que se postea como gasto al momento de la venta. |
| Conduce | Documento físico que viaja con la mercancía y prueba el despacho. Independiente del e-CF. MISPAS lo audita en inspecciones. |
| Stock disponible | Cantidad presente menos cantidad reservada (en transacciones POS abiertas, transferencias en tránsito). Lo que se puede vender ahora. |
| Cuarentena | Estado del lote pausado por control de calidad. No se puede vender hasta liberar (releaseBatchFromQuarantine). |
| Recall | Retiro forzado de un lote del mercado. Marca el lote RECALLED, postea writeoff a 5.4.1.06, y opcionalmente notifica a clientes que compraron unidades de ese lote. |
| Writeoff | Asiento contable que da de baja inventario sin contraparte de venta (vencimiento, recall, scrap). Pega a una cuenta de gasto/pérdida. |
| Movimiento | Cada entrada o salida de inventario es una fila en stock_movements con tipo (PURCHASE, SALE, TRANSFER_IN/OUT, ADJUSTMENT_IN/OUT, SCRAP, EXPIRY_WRITEOFF, RECALL_WRITEOFF, RETURN). El kardex se reconstruye sumando estas filas. |
| Sustancia controlada | Psicotrópico de Lista I-V (Ley 50-88). Forzosamente serialized, exige cédula del paciente y número de receta al dispensar, escribe al registro inmutable controlled_substance_log. |
| DIGEMAPS | Dirección General de Medicamentos y Productos Sanitarios. Regulador farmacéutico DR. Recibe los reportes de recall y los registros de psicotrópicos. |
| MISPAS | Ministerio de Salud Pública. Audita farmacias y supermercados; revisa el conduce y el kardex de lotes. |
| Campo personalizado (custom field) | Atributo definido por el comerciante en Inventario → Campos Personalizados. Cuatro tipos: texto, entero, decimal, lista desplegable. Ejemplos: VIN, año modelo, talla, principio activo. |
| Clave del campo (field key) | Identificador estable en snake_case con que el sistema indexa el valor en el JSONB. Inmutable después de crearlo. Ejemplo: vin_number, ano_modelo. |
| Buscable (searchable) | Bandera por campo. Cuando está activa, el valor del campo se concatena al search_tokens del producto y participa en la búsqueda global de inventario y POS. |
| Reindexar | Recalcula search_tokens para todos los productos activos. Necesario después de prender o apagar el flag "Buscable" en un campo, para que los productos existentes lo reflejen. |
| Alcance del campo (scope) | Determina si el campo aparece en productos físicos (PRODUCT), servicios (SERVICE), o ambos (BOTH). Controla qué formularios renderizan el campo. |