Cómo usar este manual
Este manual describe cómo se usa el Gestor de Stock de Moyco SRL, módulo por módulo, y qué pasa con los datos por detrás de cada acción. Está pensado para dos perfiles a la vez: el operador que necesita el paso a paso, y gerencia/soporte que necesita entender el flujo de información.
Cada capítulo tiene una sección «Cómo se usa» (qué botón apretar y qué pasa) y una sección «Flujo de datos» (qué colecciones se escriben y qué procesos automáticos se disparan). Usá el buscador de la barra lateral para saltar a un tema puntual (por ejemplo: «anular pedido», «importar OC», «despacho»).
Acceso al sistema
El sistema se abre en el navegador. La pantalla de ingreso pide usuario y
contraseña. El usuario puede escribirse solo (por ejemplo hernan)
y el sistema completa el resto del correo automáticamente.
Según el rol del usuario, el menú lateral muestra más o menos módulos:
| Rol | Perfil | Qué ve |
|---|---|---|
| 1 | Gerente | Acceso total a todos los módulos |
| 2 / 3 | Operativo / Logística | Operación, stock, despacho, producción |
| 4 | Cliente externo | Portal acotado: su stock y sus órdenes |
| 5 | Comercial / Ventas | Pedidos, ventas, cotizaciones, compras |
La pantalla principal
Una vez dentro, la barra lateral izquierda agrupa los módulos por área (Comercial, Operaciones, Logística, Administración). Arriba a la derecha está el selector Azúcar / División Polvos (cambia todo el sistema al otro negocio), el botón Actualizar (refresca datos cacheados) y Salir.
El sistema guarda en el navegador una copia de catálogos (artículos, clientes, transportes, etc.) para ser rápido. Si alguien cargó un dato nuevo y no aparece, apretá Actualizar para volver a bajar la información fresca.
Inicio (Tablero)
Inicio es la pantalla de aterrizaje (también el ícono «Inicio» de la barra lateral). Es un tablero de indicadores (KPIs) de solo lectura: no se cargan datos acá; se consultan y se navega. Cada tarjeta es además un acceso directo al módulo relacionado. Roles 1, 2, 3 y 5 (el rol 4 es redirigido automáticamente a «Mi Stock»).
Fila 1 — KPIs operativos
| Tarjeta | Qué muestra | Clic / acción |
|---|---|---|
| Tráfico | Cargas atrasadas, que descargan hoy y próximas | Va al Centro de Tráfico |
| Saldos Negativos | Cantidad de alertas de stock contable en negativo (badge rojo con el conteo) | Abre el detalle de saldos en descubierto |
| Órdenes Activas | Total, desglosado en Cartera y Gestión | Va a Órdenes |
| Movimientos Hoy | Total del día, desglosado en Ingresos y Salidas | — |
Fila 2 — Stock, proyección y RRHH
Stock Contable
Bolsas por tipo (Consignación / Propia / AZEF) y total, más un acceso a
compras/recepciones pendientes (abrirModalComprasPendientes) para
ver qué está por ingresar.
Proyección de Demanda (15 días)
Gráfico de stock proyectado vs. demanda en firme de los próximos 15 días.
Botones para alternar la base de cálculo: Consignación, Propia u
Otros. Muestra además la demanda sin fecha definida (pedidos sin fecha
de entrega, que no entran en la curva diaria pero sí en el total). Se calcula cruzando
movimientos con pedidosVenta y sus órdenes de carga.
RRHH Hoy
Resumen de asistencia del día. Si hay alertas de RRHH de hoy/ayer aparece un botón rojo que abre el modal de alertas de RRHH.
Fila 3 — Tendencias
- Evolución de Producción: gráfico histórico de producción (con selector de desglose).
- Tendencia Eficiencia: eficiencia de los últimos partes.
Los KPIs se arman a partir de indicadores precalculados (dashboard_kpis)
más consultas puntuales en el momento. Si algo se ve desactualizado, usá
Actualizar arriba a la derecha.
Flujo de datos
El tablero es 100% lectura. Fuentes: dashboard_kpis (KPIs
materializados), movimientos, pedidosVenta,
ordenesCarga, compras_azucar, stock_balance /
stock_snapshots, partesDiarios y datos de RRHH
(rrhh_asistencia_consolidada, avisos_rrhh,
alertas_rrhh). Ningún número se edita acá: todos son consecuencia de lo
que se carga en los demás módulos.
Pedidos & Ventas
El módulo Pedidos & Ventas cubre todo el circuito comercial del azúcar: carga del pedido (manual o importado), preparación logística, despacho con baja de stock, cierre y devoluciones. Es uno de los módulos más densos del sistema; este capítulo cubre cada acción y cada escenario.
Acceso, roles y navegación interna
Se entra desde la barra lateral, área Comercial. El módulo cambia de nombre y de solapas según el rol:
| Rol | Entra como | Solapas que ve |
|---|---|---|
| 1 (Gerente) y 5 (Comercial) | «Pedidos & Ventas» | Nuevo Pedido · Importar OC · Pendientes · En Carga · Cumplidos |
| 2 y 3 (Logística) | «Logística & Despacho» | Pendientes · En Carga · Cumplidos (arranca en Pendientes; no ve carga ni importación) |
La barra lateral propia del módulo (izquierda) tiene los botones de cada solapa, más «Actualizar Datos» (refresca catálogos cacheados) y «Salir del Módulo» (vuelve al Inicio). Si un rol logístico intenta entrar a «Nuevo», el sistema lo redirige automáticamente a «Pendientes».
Ciclo de vida y estados de un pedido
Cada pedido es un documento en pedidosVenta con un campo
estado. Entender los estados explica todo el módulo:
| Estado | Qué significa | Cómo llega ahí |
|---|---|---|
| AUTORIZADO | Cargado, pendiente de preparar | Al crear el pedido (manual o al confirmar una OC importada) |
| EN_CARGA | Incluido en una orden de carga; camión armándose | Al «Generar orden de carga» en Pendientes |
| CUMPLIDO | Despachado, o saldo anulado, o cierre forzado | Despacho confirmado en En Carga, «Anular saldo», o «Forzar cierre» |
| RECHAZADO | OC importada descartada | Botón «Rechazar» en Importar OC |
isAuthorized: un pedido AUTORIZADO se puede pausar (no se
puede cargar hasta reactivarlo).
padreId: cuando un pedido se despacha en partes, se crea un
«pedido hijo» por cada camión, ligado al pedido original (padre). Esto permite
restituir saldos exactos si después se anula la carga.
Solapa «Nuevo Pedido» (carga manual)
El formulario tiene tres secciones y un acordeón opcional de logística.
Modos: Nuevo, Editar y Copiar
El mismo formulario funciona en tres modos, según cómo se llegue:
- Nuevo (badge «Borrador Inicial»): genera un pedido nuevo con número correlativo
PV000001. - Editar (desde Pendientes → «Editar»): pide confirmación, reusa el documento; no genera número nuevo y recalcula el saldo pendiente respetando lo ya entregado.
- Copiar (desde Pendientes → «Copiar»): precarga los datos de un pedido previo como base para uno nuevo.
Sección 1 y 2 — Cliente, destino y referencia
- Cliente (buscador inteligente): se escribe nombre de fantasía o razón social. Al elegirlo se cargan sus sucursales y se autocompleta el Ejecutivo de Ventas (no editable).
- Fecha de Documento: por defecto hoy.
- Sucursal / Destino: el selector se habilita recién al elegir cliente; al elegir sucursal se autocompletan Provincia y Localidad (solo lectura).
- Orden de Compra Cliente: campo fiscal en dos partes — 5 dígitos + 8 dígitos (formato
NNNNN-NNNNNNNN). Es la referencia del cliente; opcional. - Plazo Pago (en días): obligatorio (marcado con asterisco).
Acordeón «Pre-Asignación de Logística» (opcional)
Permite programar el despacho desde la carga del pedido. Campos: Fecha de Carga,
Fecha y Hora de Descarga, Turno/Cupo N°, Transporte y Chofer (buscadores
inteligentes). Si se completa al menos uno, el pedido guarda un bloque
logistica con tarifaPendiente: true (la tarifa exacta se
define después, en Pendientes). Si se deja vacío, logística lo completa más adelante.
Sección 3 — Mercadería (multi-ítem)
Un pedido puede tener varios artículos. Por cada renglón:
- Se busca el Artículo (buscador inteligente sobre el panel oscuro).
- Se cargan Cantidad (kg), Precio Unitario y, opcionalmente, Descuento ($).
- Palletizado (por ítem, opcional): radio Sí/No. Si es «Sí», se elige formato 1000 kg, 1200 kg u «Otro» (campo libre). El formato queda guardado en ese ítem puntual.
- «Agregar» suma el renglón a la tabla. Se repite por cada artículo. Los totales (subtotal, IVA 21%, total) se recalculan automáticamente con cada alta o baja de renglón.
- Cada renglón de la tabla se puede quitar individualmente.
No se puede generar un pedido sin cliente, sin al menos un ítem con cantidad > 0, o sin plazo de pago. El botón de confirmación se bloquea mientras procesa para evitar pedidos duplicados por doble clic.
Nuevo: crea el documento en pedidosVenta con número
PV000001, estado: AUTORIZADO, la suma de kg como
cantidadPendiente y el array items completo. Lleva a
Pendientes. Editar: actualiza el documento y recalcula
cantidadPendiente = total − ya entregado.
Artículo genérico (bolsa 50 kg sin marca)
En las bolsas de 50 kg, al tomar el pedido casi nunca se sabe qué marca se va a cargar (depende del stock y la conveniencia de carga del día). Para no forzar una marca falsa, existe un artículo genérico («AZÚCAR BOLSA 50KG (GENÉRICO)»):
- Se elige como cualquier otro artículo en el renglón de mercadería. El renglón muestra el badge Genérico · marca a definir.
- El genérico solo vive en el pedido y en la cotización previa. No tiene stock propio y está bloqueado en movimientos, pases, cesiones y compras.
- La marca real se elige obligatoriamente al generar la Orden de Carga (ver «Generar orden de carga»). Hasta ese momento el pedido queda legítimamente «sin marca».
Solapa «Importar OC» (desde Excel del cliente)
Carga órdenes de compra que llegan en Excel desde sistemas de clientes. Soporta varios formatos (Krikos / Planexware, La Anónima, Dorinka, etc.), detectando las columnas automáticamente.
- Soltar archivos en la zona de arrastre, o seleccionarlos (acepta varios
.xls/.xlsxa la vez). Si se suelta otro tipo de archivo, lo rechaza con aviso. - Procesar la cola. El sistema lee cada planilla y resuelve entidades:
- Cliente y sucursal por GLN (13 dígitos). Si no encuentra por GLN, intenta por nombre del comprador; si falla, queda para asignar manualmente.
- Artículos por EAN (8–14 dígitos). Si el formato no trae EAN (ej. La Anónima), usa Código de Proveedor o descripción como respaldo.
- Cada OC queda en la bandeja con un estado: Pendiente revisión, Incompleto (faltó resolver algo), Confirmado o Rechazado.
- Ver detalle: muestra exactamente qué interpretó (cliente, sucursal, renglones, cantidades) para revisar antes de confirmar.
- Confirmar: convierte la OC en un pedido real.
- Rechazar: pide un motivo y descarta la OC.
Al procesar, cada OC se guarda en pedidosImportados.
Confirmar crea el documento en pedidosVenta (estado inicial
PENDIENTE) y marca el borrador como CONFIRMADO.
Rechazar solo escribe estado: RECHAZADO y el motivo en el
borrador: no crea pedido ni toca stock.
Los artículos deben tener su EAN cargado en ABM Maestros y las sucursales su GLN. Sin eso, la OC entra como «Incompleto» y hay que asignar a mano.
Solapa «Pendientes» (bandeja de logística)
Lista los pedidos AUTORIZADO. Tiene filtros (cliente, tipo de azúcar) y filtros inteligentes, ordena por fecha de carga/descarga, y permite exportar. Acciones disponibles por pedido:
Generar orden de carga (el corazón del módulo)
- Se abre el Generador, se elige el cliente y se tildan los renglones a despachar. La cantidad se ingresa en bultos; el sistema la convierte a kg con el factor del artículo.
- Se completan los datos del viaje: Fecha de Carga (obligatoria), fecha/hora de descarga, turno, Transporte (obligatorio), Chofer (obligatorio), patente tractor/acoplado, observaciones y Tarifa.
- Al confirmar, el sistema pide el correlativo
NP-00000001y, en una transacción atómica (batch), procesa cada pedido seleccionado en uno de dos escenarios:- Escenario A — Despacho total (se despacha ≥ el saldo, tolerancia 0,5 kg): el pedido pasa a EN_CARGA con su
numeroOrdenCargay el bloque de logística. - Escenario B — Despacho parcial (split): el pedido original conserva el saldo restante y vuelve recalculado; se crea un pedido hijo (con
padreId) que representa exactamente lo que va en este camión, en estado EN_CARGA.
- Escenario A — Despacho total (se despacha ≥ el saldo, tolerancia 0,5 kg): el pedido pasa a EN_CARGA con su
- Al terminar, notifica al chofer por WhatsApp el nuevo viaje y redirige a En Carga.
Si un renglón tildado es el artículo genérico de bolsa 50 kg, la fila muestra un selector ámbar «Elegir marca a despachar (obligatorio)» con las marcas reales de bolsa 50 kg. No se puede generar la orden si quedó algún genérico seleccionado sin marca: el sistema avisa y aborta. Al elegir la marca, esa marca real queda congelada en el pedido (en el despacho total se reescribe el ítem; en el split, el pedido hijo ya nace con la marca). De la Orden de Carga en adelante el genérico ya no existe: el remito, el movimiento de egreso y el stock usan la marca real.
Si la tarifa queda en 0, la orden se marca tarifaPendiente: true para
que Administración la complete luego. El botón «Verificar tarifa» /
«Análisis de tarifa» consulta el Tarifario para sugerir el valor según transporte y
destino antes de generar.
Resto de acciones de Pendientes
| Acción | Qué hace | Escenarios |
|---|---|---|
| Asignar logística | Carga transporte/chofer/fechas a un pedido sin generar todavía la orden | Útil para pre-armar viajes |
| Pausar / Autorizar | Bloquea o habilita un pedido para carga (isAuthorized) | No se puede pausar un pedido que ya está en proceso de carga |
| Editar | Abre el pedido en «Nuevo Pedido» en modo edición | Pide confirmación |
| Copiar | Usa el pedido como plantilla para uno nuevo | — |
| Alta / edición de chofer | Crea o edita un chofer sin salir del flujo (modal) | El chofer queda disponible al instante en el buscador |
| Eliminar / Anular saldo | Modal de confirmación con palabra clave (ver abajo) | Doble comportamiento según haya entregas |
| Exportar Excel | Baja la bandeja ordenada por fecha de carga/descarga | — |
| Cronograma / Mesa de Control | Vista de impresión del despacho diario | — |
| Alertas | Agrega una nota/alerta a un pedido | — |
El mismo botón abre un modal que detecta si el pedido ya tuvo entregas (diferencia > 1 kg entre total y pendiente):
- Modo ROJO «Eliminar Pedido Completo» (pedido sin ninguna carga): borra el documento de
pedidosVentade forma permanente. - Modo NARANJA «Anular Saldo Restante» (pedido con entregas parciales): no borra; pone
cantidadPendiente: 0, estado CUMPLIDO y deja una nota «CIERRE MANUAL SALDO» en el historial.
En ambos casos hay que escribir la palabra ELIMINAR para habilitar el botón.
Solapa «En Carga» (despacho)
Lista las órdenes de carga (ordenesCarga) con pedidos en
EN_CARGA. Acciones:
Despachar (la baja de stock real)
El despacho es donde la mercadería sale físicamente y el stock se descuenta de verdad. Un error acá (tipo de azúcar equivocado, factura cruzada mal, cantidad distinta a la facturada) ensucia stock, consignación y la conciliación con el ERP Flexxus. Esta sección cubre cada pantalla, cada botón y cada escenario, sin omitir nada. Está pensada para alguien que nunca lo hizo.
Desde En Carga, el botón «Despachar» sobre una orden lleva al formulario «Confirmar Despacho» (es el módulo Nuevo Movimiento en modo despacho). El sistema precarga todo desde la orden y, antes de mostrar el formulario, exige dos decisiones en cadena: Tipo de Azúcar y origen de los datos (Flexxus o manual).
Paso 0 — Selección de Tipo de Azúcar (obligatorio)
Apenas se toca «Despachar» aparece el modal «Tipo de Azúcar» («Indique el origen del stock afectado»). En el despacho hay tres opciones (no cuatro: la pantalla de despacho no ofrece «Orgánica» — ver la nota más abajo). La elección determina de qué stock se descuenta y qué controles se aplican después:
| Opción | Cuándo se elige | Qué dispara |
|---|---|---|
| Venta en Consignación azul | La mercadería es de un comitente — «Stock de comitente — requiere imputar OCAs» | Abre el modal de Imputación de OCAs (paso obligatorio, ver abajo) |
| Azúcar Propia verde | «Stock propio con factura» | Sigue directo al Paso 0.5 |
| Otras Azúcares (AZEF) ámbar | «AZEF u otras operaciones» | Sigue directo al Paso 0.5 |
El modal de Tipo de Azúcar del despacho tiene solo esas 3 opciones. La cuarta opción «Orgánica» no existe en el despacho: la azúcar orgánica se despacha como cualquier tipo (Propia, AZEF o Consignación) y no se fuerza un lote al salir. La opción «Orgánica» y el paso de «elegir lote» solo existen en el alta manual de un movimiento (módulo Movimientos de Stock → Nuevo), no en este flujo de despacho desde Orden de Carga. La restricción «artículo Orgánico ↔ tipo Orgánico» solo aplica a ingresos, no a la venta.
El botón «Cancelar» aborta todo el despacho y regresa a Ventas (no se descuenta nada). Cancelar acá es seguro: no deja basura.
Sub-paso Consignación — Imputar OCAs (obligatorio si elegiste Consignación)
Si la venta es en consignación hay que decir de qué OCA (de qué comitente) sale cada bolsa. El modal muestra arriba el Total a imputar (bolsas y kg del despacho) y, debajo, una tarjeta por cada compra de consignación con saldo disponible:
- Cada tarjeta muestra el comitente, la OCA (o «Pendiente OCA» si todavía no tiene número) y el saldo en bolsas y kg. Las OCAs sin saldo no aparecen.
- Se escribe, en cada OCA, cuántas bolsas imputar (tope = el saldo de esa OCA).
- Una barra de progreso abajo muestra «Imputado X / Total — Faltante Y». El botón «Confirmar» se habilita solo cuando el faltante es 0 (lo imputado tiene que ser exactamente el total del despacho).
- Si hace falta despachar más de lo que hay en saldo (venta «en descubierto»), el botón «Cargar negativo» abre un mini-modal: se elige el comitente (buscador) y las bolsas en descubierto; eso queda como una imputación negativa que también suma al total.
- «Confirmar» cierra el modal y recién ahí sigue el Paso 0.5. «Volver» regresa al selector de Tipo de Azúcar.
Despacho de 540 bolsas (27.000 kg). En pantalla: OCA-1180 de «Comitente A» con saldo 400 bls, OCA-1192 de «Comitente B» con saldo 300 bls. Cargás 400 en OCA-1180 y 140 en OCA-1192 → progreso «Imputado 540 / 540 ✓», botón habilitado. Si cargabas 400 + 200 (=600) el progreso muestra «Faltante -60» en rojo y no deja confirmar.
Cuando una venta de una OCA se parte en varios camiones (un MW por
camión), el operador a veces imputa el total del lote a cada MW, dejando la
suma imputada mayor a la cantidad realmente movida. La verdad física es
m.cantidad del movimiento. Imputá por camión lo que realmente va en
ese camión, no el total del lote en todos.
Paso 0.5 — ¿De dónde vienen los datos? Flexxus o Manual
Después del tipo (y de la imputación/lote si correspondía) aparece el modal «¿De dónde vienen los datos?». Mientras se abre, el sistema hace un chequeo de salud del Bridge Flexxus en segundo plano y pinta el estado del botón «Vincular venta de Flexxus»:
| Estado del Bridge | Qué muestra | Botón Flexxus |
|---|---|---|
| Online + base OK | «Bridge OK · usuario» | Habilitado (recomendado) |
| Online pero Flexxus no responde | «⚠️ Bridge OK pero Flexxus no responde» | Deshabilitado («No disponible») |
| Bridge offline | «❌ Bridge offline · Iniciá GSFlexxusBridge» | Deshabilitado («Offline») |
- Vincular venta de Flexxus: abre el cruce contra la factura del ERP (ver abajo). Es el camino recomendado siempre que el Bridge esté disponible.
- Carga manual: sigue al formulario sin Flexxus (igual que siempre). Se usa cuando el Bridge está caído o la venta no está facturada todavía. Se puede vincular después (posthoc).
- ← Volver al listado: cancela el despacho.
El Bridge es un servicio local en Python que corre en la PC y expone la base
de Flexxus (Firebird) de solo lectura. Prueba los puertos
8770 y 8765. Si no está corriendo, no se rompe nada:
simplemente se opera manual. Ver el capítulo «Integración Flexxus (Bridge)».
Cruce Flexxus (1/2) — Elegir la factura
Si elegiste «Vincular Flexxus» se abre la lista de facturas recientes de Flexxus, ya filtrada por el CUIT del cliente de la orden:
- Rango de fechas: botones 3 / 7 / 30 días (default 3). Si no aparece la factura, se amplía el rango.
- Sugerencia por chofer: si el transporte de una factura Flexxus coincide con el chofer del despacho, esa fila se resalta en verde con una ★ y un cartel «Sugerimos FA-… — el transporte coincide con el chofer del despacho». Es solo una ayuda, no obliga.
- Cada fila muestra comprobante, fecha, cliente, transporte (Flexxus) y total c/IVA, con dos botones:
- 👁 Ver: abre el detalle en solo lectura (inspeccionar sin vincular).
- Vincular →: abre el detalle con el botón de confirmar (el que realmente ata la factura).
- ← Seguir con carga manual: descarta Flexxus y va al formulario manual.
Cruce Flexxus (2/2) — Los 4 controles cruzados
Al elegir una factura, el sistema trae su detalle de Flexxus y arma el cruce N×M (varias líneas GS contra varias líneas Flexxus, agrupando por artículo). Arriba se ve la cabecera de la factura (comprobante, fecha, cliente + CUIT, total c/IVA, transporte y remitos vinculados) y luego cuatro controles:
| Control | Qué compara | ¿Bloquea? |
|---|---|---|
| 1 · Tipo de venta | El tipo elegido en GS (Paso 0) contra el tipo que implica la cuenta contable de la factura Flexxus, vía el Mapeo de Cuentas (Configuración → Mapeo Flexxus) | No (informativo). Verde «✓ COINCIDE», naranja «⚠ NO COINCIDE», o ámbar «cuenta no mapeada» |
| 2 · Cantidad (kg) | Kg de GS vs kg de Flexxus por artículo (agregando líneas del mismo artículo). Tolerancia 1 kg | Sí — bloqueante |
| 3 · Precio ($/kg) | Precio unitario GS vs precio Flexxus normalizado a $/kg. Tolerancia $0,01/kg | Sí — bloqueante |
| 4 · Chofer + Patentes | Nombre del chofer y patentes tractor/acoplado de GS vs el transporte de la factura Flexxus | No (informativo). Verde «✓ TODO COINCIDE» / naranja «⚠ HAY DESVÍOS» |
La tabla de líneas (Controles 2+3) muestra, por cada línea Flexxus: código Flexxus, descripción, cantidad Flex, kg Flex, kg GS, Δ kg, $ Flex/kg, $ GS/kg, Δ $ y a qué artículo GS matcheó. El match se hace por los códigos Flexxus cargados en el artículo (ABM → Artículos → Códigos Flexxus). El precio Flexxus se normaliza dividiendo por kg por unidad (ej. un artículo de 500g facturado a $435/unidad = $870/kg).
| Estado de línea | Color | Significa |
|---|---|---|
| Match OK | Verde | El artículo cruzó 1 a 1 y está dentro de tolerancia |
| Match múltiple | Naranja | Varios artículos GS tienen ese código Flexxus; se eligió el más cercano por cantidad. Revisar |
| Sin equivalencia GS | Rojo | El código Flexxus no está en ningún artículo: falta cargar codigosFlexxus[] en ABM |
| Sin línea en Flexxus | Rojo (fila extra) | El pedido GS incluye kg que la factura Flexxus no declara |
Si alguna línea matcheada tiene desvío de precio (> $0,01/kg) o de cantidad (> 1 kg), aparece un recuadro rojo «Vinculación bloqueada — hay desvíos de precio o cantidad» y el botón «Confirmar y cargar» queda deshabilitado. Para vincular, Flexxus y el pedido GS deben coincidir en kg y precio. Los Controles 1 y 4 (tipo y chofer) no bloquean: aún con ⚠ se puede confirmar y el desvío queda registrado para auditoría.
La lista ya viene filtrada por el CUIT del cliente. El CUIT de la factura se compara de forma estricta (sin guiones ni espacios) contra el del cliente GS: es la barrera contra vincular el comprobante de otro cliente.
Al «Confirmar y cargar», el sistema:
- Autocompleta y bloquea los campos Factura (punto de venta 5 dígitos + número 8 dígitos) en el formulario; quedan en ámbar, de solo lectura, con el aviso «Cargado desde Flexxus». Para cambiarlos hay que cancelar el despacho y volver a vincular.
- Si la factura tiene un único remito vinculado, también autocompleta y bloquea los campos de Remito.
- Guarda en memoria un snapshot completo de la factura + el resultado de los 4 controles, que se grabará junto al movimiento.
El movimiento de egreso guarda flexxusFactura con: tipo/PV/número y
comprobante formateado, fecha, CUIT y razón social, totales neto y c/IVA, remitos,
cuenta de resultado, tipo elegido GS vs tipo Flexxus mapeado y si coincide,
transporte/chofer/patentes con sus checks, y el detalle línea por línea
(controles[]: kg GS, kg Flex, Δ, precio GS, precio Flex, Δ, estado de
match). Si fue carga manual, flexxusFactura queda en null.
El formulario «Confirmar Despacho» precargado
El formulario llega con casi todo cargado y bloqueado para evitar errores:
- Título «Confirmar Despacho: NP-…» y banner índigo «MODO DESPACHO ACTIVO».
- Fecha = hoy (el día real del despacho). Servicio = «salida», bloqueado.
- Propietario = MOYCO (el sistema busca el ID real, incluso en la nube si hace falta), bloqueado. Cliente = el de la orden, bloqueado.
- Provincia/Localidad sincronizadas desde el cliente. Cantidad fiel al pedido (no editable desde Mov Web).
- Tarifa = la pactada en la logística de la orden (modo manual para que no se recalcule). Pallets de egreso sugeridos (≈ total kg / 1400, redondeado para arriba).
- Factura/Remito: bloqueados y en ámbar si se vinculó Flexxus; editables si fue manual.
Se verifican las cantidades finales y se confirma. Aparece el modal de confirmación con el resumen (tipo de azúcar, artículos, cantidades, servicio SALIDA) para una última revisión.
- Al confirmar, en una transacción atómica se crea el/los movimiento(s) de egreso (tipo VENTA,
remitoConformado:false), con eltipoAzucar, lasimputaciones[]de consignación (prorrateadas por camión si hay varios ítems) y elflexxusFacturasi se vinculó. - El stock lo baja el servidor (un proceso recalcula los
stock_snapshots): el formulario nunca escribe el stock a mano. - El pedido pasa a CUMPLIDO y la orden se cierra.
El despacho crea un movimiento; el stock lo recalcula el servidor. Para
corregir un despacho equivocado se anula el movimiento (vuelve a disparar el
recálculo); nunca se edita el stock a mano. Si el movimiento está atado a una
liquidación de flete, primero hay que anular esa liquidación (ver «Fletes y
Liquidaciones» → bloqueo por liquidación).
Vincular Flexxus después (posthoc)
Si el despacho se hizo manual (Bridge caído, o la factura todavía no estaba emitida), la factura se puede asociar más tarde desde el listado de Movimientos: el flujo es idéntico (salud del Bridge → facturas → detalle → los 4 controles → confirmar), reconstruyendo el contexto N×M a partir de los movimientos «hermanos» del mismo viaje. El detalle completo está en el capítulo «Integración Flexxus (Bridge)».
Escenarios frecuentes (y qué hacer)
| Escenario | Qué pasa | Qué hacer |
|---|---|---|
| Bridge offline al despachar | El botón Flexxus está deshabilitado | Carga manual y vincular posthoc cuando el Bridge esté arriba |
| No aparece la factura en la lista | Está fuera del rango o aún no emitida | Ampliar a 7/30 días; si sigue sin estar, cargar manual |
| Línea roja «sin equivalencia GS» | El código Flexxus no está en ningún artículo | Cargar el código en ABM → Artículos → Códigos Flexxus, y reintentar |
| Δ kg o Δ $ en naranja → Confirmar bloqueado | La factura y el pedido no coinciden en kg/precio | Corregir el pedido o la factura en el origen; no forzar |
| Control 1 «cuenta no mapeada» | La cuenta contable Flexxus no tiene tipo GS asignado | Configuración → Mapeo Flexxus; no bloquea, pero conviene mapear |
| Control 1/4 en naranja pero kg/precio OK | Tipo o chofer no coinciden | Se puede confirmar igual: queda registrado el desvío para auditoría |
| Consignación: faltante ≠ 0 | El botón Confirmar de imputación no se habilita | Ajustar bolsas hasta imputar exactamente el total; usar «negativo» si va en descubierto |
Editar logística, ajustar, imprimir, anular y forzar
| Acción | Qué hace | Cuidados / escenarios |
|---|---|---|
| Editar logística de la OC | Cambia transporte/chofer/fechas/tarifa de toda la orden | Puede reajustar cantidades de los pedidos incluidos |
| Imprimir OC | Genera el PDF de la orden de carga para el chofer | — |
| Ver detalle | Muestra pedidos, artículos y logística de la orden | — |
| Anular orden de carga | Disuelve la agrupación y devuelve los pedidos a Pendientes | Restituye saldos con exactitud: a los hijos de split les devuelve la cantidad al pedido padre y borra el hijo; los pedidos originales vuelven a AUTORIZADO conservando su logística. Notifica al chofer la cancelación por WhatsApp. |
| Forzar cierre | Cierre administrativo de una orden «trabada» | NO mueve stock. Doble seguridad: confirmación + escribir la palabra FORZAR. Solo si la mercadería ya salió físicamente pero la orden quedó trabada por error de conexión. Deja observación de corrección. |
Solapa «Cumplidos» (historial y devoluciones)
Historial de pedidos cerrados, con filtros, detalle por pedido y exportación a Excel.
Devolución de cliente (proceso completo)
Una devolución registra que el cliente nos devolvió mercadería que ya despachamos. Crea un movimiento de ingreso que repone el stock a la fecha en que se registra. No modifica el despacho original, no cambia el estado del pedido (sigue CUMPLIDO) y no registra cobranzas ni notas de crédito contables (el número de NC es solo una referencia que se anota). El stock lo recalcula el servidor: la devolución solo crea el movimiento.
Dónde está el botón y quién puede
La devolución se inicia desde la solapa «Cumplidos». En la fila de un pedido cerrado aparece el botón ↩️ («Registrar devolución del cliente»), pero solo si se cumplen las dos condiciones:
- El pedido tiene movimientos de stock vinculados (hubo despacho real:
historialCargasno vacío). Un pedido cerrado por «Anular saldo» o «Forzar cierre» no muestra el botón porque nunca salió mercadería. - El rol puede devolver (Gerente / Comercial y los roles logísticos habilitados). Un rol de solo consulta no ve el botón.
El proceso, paso a paso
- Se toca ↩️ en el pedido. Si ese pedido se despachó en un solo camión, el sistema toma ese movimiento directamente. Si tuvo varios despachos parciales (varios camiones / varios MW), aparece una lista numerada con cada movimiento (ID, fecha y kg) y se elige cuál corresponde a la devolución. Cada camión se devuelve por separado.
-
El sistema calcula el «máximo a devolver» de ese movimiento:
Fórmula del tope
máximo = cantidad despachada − cantidadDevueltaAcum
Es decir: lo que salió en ese camión, menos lo que ya se devolvió antes de ese mismo camión. Si ese movimiento ya fue devuelto en su totalidad (máximo ≤ 0), el sistema avisa «Este movimiento ya tiene devolución total registrada» con el despachado y el devuelto, y no deja continuar. - Aparece un cartel de confirmación con los números concretos para revisar antes de seguir: movimiento de origen, NP, cantidad despachada y máximo a devolver (y, si hubo devoluciones previas, cuántos kg ya se devolvieron). «Aceptar» continúa; «Cancelar» aborta sin tocar nada.
-
Se abre el formulario en MODO DEVOLUCIÓN DE CLIENTE (banner y título en
rosa). El formulario llega precargado y bloqueado con los datos del
despacho original para que no se pueda equivocar el cliente, el artículo ni el tipo
de azúcar:
Modo Devolución: datos heredados del despacho original, cantidad acotada al tope - Servicio = «ingreso», bloqueado (la devolución siempre suma stock).
- Fecha = hoy (la devolución impacta a la fecha de registro, no a la del despacho original).
- Propietario (MOYCO), Cliente/Destino, Artículo y Provincia/Localidad: heredados del movimiento original y bloqueados.
- Tipo de azúcar: el mismo del despacho original (no se vuelve a elegir).
- Las etiquetas cambian: «Factura» → «Nota de Crédito» y «Remito» → «Remito Devolución» (son referencias, opcionales).
- Cantidad: editable, con tope = el máximo a devolver (el campo muestra «Máx: …» como ayuda). Acá se decide si la devolución es total o parcial.
- Depósito de ingreso: se sugiere el de origen, pero es editable (la mercadería devuelta puede entrar a otro depósito).
- Ref. interna queda en
DEV.CLIENTEy las observaciones ya traen «Devolución de <MW> / NP <número>».
-
Se confirma. Aparece el modal de confirmación final con el resumen
(ingreso, artículo, cantidad, depósito). Es la última revisión antes de reponer
stock.
Última revisión: se va a crear un ingreso que repone stock -
Al confirmar, en una transacción atómica (
crearDevolucionTransaccional) el sistema: (a) crea el movimiento de ingreso (esDevolucionCliente: true, ligado al MW de venta pormwVentaOrigenId); (b) incrementacantidadDevueltaAcumen el movimiento de venta original (solo metadato de trazabilidad: no cambia su cantidad ni su fecha); (c) escribe un documento endevoluciones_ventas; (d) el servidor recalcula losstock_snapshotsy suma la mercadería de vuelta.
Ejemplos: devolución TOTAL y devolución PARCIAL
Se despachó el pedido PV000312 en la orden NP-00000278: un camión con 25.000 kg de Azúcar Refinada 1kg (movimiento MW-00000457). El cliente rechaza el camión completo en la puerta (mercadería no conforme).
- Cumplidos → ↩️ en PV000312 → un solo despacho, se toma MW-00000457 directo.
- Máximo a devolver = 25.000 − 0 = 25.000 kg.
- En el formulario se carga Cantidad = 25.000 (todo el tope).
- Resultado: ingreso de 25.000 kg,
cantidadDevueltaAcumdel MW-00000457 pasa a 25.000. Si se vuelve a tocar ↩️ sobre ese pedido, el sistema avisa «ya tiene devolución total registrada» y no deja seguir.
Mismo despacho: MW-00000457, 25.000 kg (500 bolsas de 50 kg). El cliente recibe el camión pero 80 bolsas llegaron mojadas y las devuelve = 4.000 kg.
- Cumplidos → ↩️ → confirmación: despachado 25.000 kg, máximo a devolver 25.000 kg.
- En el formulario se carga Cantidad = 4.000 (no el tope completo).
- Resultado: ingreso de 4.000 kg;
cantidadDevueltaAcum= 4.000; el pedido sigue CUMPLIDO. - Si más tarde devuelve otras 20 bolsas (1.000 kg): se repite ↩️ sobre el
mismo pedido. Ahora el máximo a devolver = 25.000 − 4.000 = 21.000 kg, se
carga 1.000, y
cantidadDevueltaAcumqueda en 5.000. Se puede repetir hasta agotar los 25.000 kg.
Nunca se puede devolver más que el máximo: la transacción del servidor revalida el
tope (cantidadDevueltaAcum + nuevo ≤ despachado) y rechaza el exceso aún
si el cliente forzó el campo. Si una devolución se cargó mal (cantidad o
depósito equivocado), no se edita el stock a mano: se anula el movimiento
de ingreso de la devolución desde Movimientos de Stock (el servidor revierte el
stock y descuenta el cantidadDevueltaAcum) y se vuelve a registrar bien.
Si la venta original quedó atada a una liquidación de flete, primero hay que liberar
esa liquidación.
Reparar vínculo pedido ↔ movimiento
Herramienta de saneamiento (repairOrderLink): si un pedido quedó
desincronizado de sus movimientos de stock, busca los MW y los vincula. Si cubren el
total, deja el pedido CUMPLIDO; si es parcial, lo deja
EN_CARGA con el saldo pendiente informado. También
permite generar el F3000 a partir del movimiento.
Flujo de datos (resumen por acción)
| Acción | Escribe | Efecto en cadena |
|---|---|---|
| Crear pedido (manual / confirmar OC) | pedidosVenta (+ pedidosImportados si vino de Excel) | Aparece en Pendientes |
| Generar orden de carga | ordenesCarga + update/insert en pedidosVenta (split) | WhatsApp al chofer; pedido a EN_CARGA |
| Despachar | movimientos (egreso) | Trigger de stock recalcula stock_snapshots; pedido a CUMPLIDO |
| Anular orden de carga | pedidosVenta (restitución), borra hijos | WhatsApp de cancelación; pedidos vuelven a Pendientes |
| Anular saldo | pedidosVenta (CUMPLIDO, saldo 0) | No mueve stock |
| Devolución | movimientos (ingreso) + cantidadDevueltaAcum | Trigger repone stock |
Ni el despacho ni la devolución «escriben el stock»: crean un
movimiento y un proceso del servidor recalcula el saldo. Para corregir
un despacho equivocado se anula el movimiento (vuelve a disparar el
recálculo); nunca se edita el stock a mano.
El sistema no registra cobranzas (solo avance logístico AUTORIZADO →
EN_CARGA → CUMPLIDO). La azúcar orgánica se puede despachar como Propia /
AZEF / Consignación (la restricción de tipo solo aplica a ingresos). Los splits
mantienen integridad de saldos vía padreId: nunca se pierde ni se
duplica kilaje al anular.
Cotizaciones
Cotizaciones arma ofertas comerciales de azúcar (con anexo opcional de productos de Especialidad de la División Polvos). Es un módulo de cálculo: parte del costo real (PPP de compras) y de los fletes del Tarifario, aplica financiación por plazo y muestra el margen con un semáforo. No mueve stock ni crea pedidos — es el paso previo a un pedido. Solo rol 1 (Gerente). Cuatro solapas: Cotizador, Parámetros, Historial y Cot. Especialidades.
Conceptos base (leer antes de cotizar)
| Concepto | Qué es / de dónde sale |
|---|---|
| PPP (Precio Promedio Ponderado) | Costo del azúcar. Sale de compras_azucar de los últimos 30 días. Botón «PPP 30d» en el paso 1; la lupa muestra de qué compras se compuso. |
| Flete de ingreso | Costo de traer el azúcar a planta. Se carga en datos de compra. |
| Flete de salida / distribución | Costo de llevarlo al cliente. Sale del Tarifario: prioriza la tarifa comercial (solapa «Cotización» del Tarifario) y cae a la tarifa Smart si no hay una asignada. |
| Plazo | Días de financiación. El cálculo base es a contado (plazo 0); con una tasa única se derivan los demás plazos. |
| TNA / TEM | Tasa con la que se financia el plazo. Default en Parámetros, ajustable por cotización. |
| Margen y semáforo | Rentabilidad de la venta. Se compara contra los umbrales de Parámetros (margen mínimo de alerta y margen objetivo). |
Solapa «Parámetros»
Define las variables con las que el cotizador calcula. Se cargan una vez (botón
«Guardar Todos los Parámetros») y quedan en
cotizaciones_parametros:
- TNA por defecto — tasa de financiación sugerida para los plazos.
- Días de vigencia — cuántos días vale la oferta por defecto.
- IVA en compra de azúcar — para reconstruir el costo neto real.
- Kg promedio por camión — para prorratear el flete largo por kg.
- Umbrales del semáforo — margen mínimo (debajo = alerta) y margen objetivo (la meta comercial).
Si los parámetros están vacíos o desactualizados, el cotizador calcula con supuestos pobres y el semáforo pierde sentido. Es el primer paso de puesta a punto del módulo.
Solapa «Cotizador» — wizard de 3 pasos
El wizard guía la cotización de principio a fin. El cálculo base se fija siempre a contado (plazo 0); los demás plazos se derivan en el paso 2 con una tasa única.
Paso 1 — Setup
- Cliente (buscador inteligente) y sucursales de destino.
- Artículos: multi-selección. Se pueden cotizar varios productos en una misma oferta (incluido el artículo genérico de bolsa 50 kg — ver más abajo).
- Datos de compra: precio de compra y flete de ingreso. El botón «PPP 30d» trae automáticamente el precio promedio ponderado de los últimos 30 días desde las compras; el ícono de lupa muestra la composición de ese PPP (de qué compras salió y con qué peso).
- Distribución: flete de salida al cliente (del Tarifario) y deducciones comerciales.
- Plazo de cotización: chips con presets 0 / 30 / 60 / 90 o un valor custom (0–365 días).
- Vigencia de la oferta (desde / hasta) y modo de cálculo.
- Checkbox «Incluir Especialidades»: agrega el anexo de productos de Endulzantes a la oferta (ver solapa Especialidades).
Paso 2 — Artículo (iterativo)
El wizard procesa un artículo a la vez. Por cada uno muestra:
- El precio sugerido para el plazo elegido.
- La matriz de plazos de referencia (0 / 30 / 60 / 90 días) derivada de una tasa única: el cliente ve cuánto cuesta el mismo producto a cada plazo.
- El margen resultante con el semáforo: rojo = debajo del mínimo (revisar precio o costo), amarillo = entre el mínimo y el objetivo, verde = en o sobre el objetivo.
Cada artículo procesado queda como un chip. Se repite el paso por todos los artículos seleccionados antes de pasar al resumen.
No bloquea la cotización (la decisión comercial es del Gerente), pero es una señal de que el precio no cubre el margen mínimo: conviene revisar el PPP (¿compras caras?), el flete (¿tarifa correcta?) o subir el precio de venta antes de emitir.
Paso 3 — Resumen y PDF
Vista consolidada de todos los artículos y todos los plazos. Desde acá se
genera el PDF y se guarda la cotización en el historial
(cotizaciones_historial).
Documento multi-página con estética profesional (paleta navy + ámbar y logo Moyco). Una página por producto, con la imagen del artículo (la que se cargó en ABM de Artículos), la matriz de precios por plazo, condiciones y vigencia. Si se tildó «Incluir Especialidades», agrega el anexo con los productos de Especialidad y sus imágenes.
Costo del azúcar = PPP de compras_azucar. Flete = Tarifario
(prioriza la tarifa comercial de la solapa «Cotización» del Tarifario; cae a Smart
si no hay). Por eso conviene tener compras y tarifas actualizadas antes de
cotizar.
Cotizar el artículo genérico (bolsa 50 kg)
En las bolsas de 50 kg, al cotizar todavía no se sabe qué marca se va a entregar. Como la cotización es el paso previo al pedido, se permite usar el artículo genérico («AZÚCAR BOLSA 50KG (GENÉRICO)») igual que cualquier otro:
- Aparece normalmente en el buscador de artículos del paso 1 (es categoría PT).
- Se cotiza por precio y plazo, que no dependen de la marca: la oferta sale correcta sin comprometer una marca específica.
- La marca real recién se define al generar la Orden de Carga, ya en Pedidos & Ventas (no en Cotizaciones). Ver el capítulo de Ventas, sección «Artículo genérico».
El genérico está bloqueado en movimientos, pases, cesiones y compras porque no tiene stock propio. Pero cotizar es solo cálculo: no toca inventario, así que el genérico es válido y útil en esta etapa.
Solapa «Cot. Especialidades»
Carga precios FOB por producto de Endulzantes con vigencia y edad.
Estos productos se incluyen como anexo opcional de la oferta de azúcar cuando
se tilda «Incluir Especialidades» en el paso 1. Colección
cotizaciones_especialidades; los productos y sus imágenes se leen de
endulzantes_articulos.
Solapa «Historial»
Lista las cotizaciones guardadas (cotizaciones_historial). Permite
reabrir una cotización, reimprimir su PDF y usarla como base de
una nueva (precarga todos los datos para ajustar precio/plazo y reemitir rápido).
Escenarios típicos
| Escenario | Cómo se hace |
|---|---|
| Venta a contado, un producto | Paso 1 con plazo chip 0; paso 2 confirma margen verde; paso 3 PDF de una página. |
| Venta financiada (30/60/90) | Se elige el chip del plazo (o custom). El paso 2 muestra igual la matriz de los 4 plazos para que el cliente compare. |
| Varios productos en una oferta | Multi-selección de artículos en paso 1; el paso 2 se repite por cada uno (chips); el PDF sale multi-página. |
| Bolsa 50 kg sin marca definida | Se cotiza el artículo genérico. La marca se resolverá recién en la Orden de Carga del pedido. |
| Oferta de azúcar + Especialidades | Se tilda «Incluir Especialidades» en paso 1; el PDF agrega el anexo con productos e imágenes. |
| Recotizar a un cliente | Historial → usar una previa como base → ajustar precio/plazo → reemitir. |
| Costeo con compras recientes | Botón «PPP 30d» + lupa de composición para justificar el costo ante una negociación. |
Errores y validaciones comunes
| Síntoma | Causa / solución |
|---|---|
| «Completá las fechas de vigencia antes de generar la oferta» | Falta vigencia desde/hasta en el paso 1. Cargar ambas fechas. |
| Flete en cero o muy bajo | No hay tarifa para ese destino/transporte en el Tarifario. Cargar la tarifa comercial o revisar el destino. |
| Semáforo siempre rojo | PPP alto (compras caras), flete mal cargado, o umbrales de Parámetros mal seteados. |
| PPP vacío | No hay compras en los últimos 30 días. Cargar el costo manualmente o revisar Compras. |
| El PDF no muestra imagen del producto | El artículo no tiene imageUrl cargada en ABM → Artículos. |
Flujo de datos
| Colección | Rol |
|---|---|
cotizaciones_parametros | Escribe/lee — variables de cálculo y umbrales del semáforo |
cotizaciones_especialidades | Escribe/lee — precios FOB de Especialidad |
cotizaciones_historial | Escribe al guardar — cotizaciones emitidas |
compras_azucar, tarifas, tarifas_cotizacion, endulzantes_articulos, articulos | Solo lectura — PPP, fletes, productos e imágenes |
Cotizar es un cálculo: no reserva stock ni crea pedido. Si el cliente acepta, el pedido se carga aparte en Pedidos & Ventas — y si era el artículo genérico, la marca se define al armar la Orden de Carga.
Compras & Consignación
Compras & Consignación administra todo el ingreso de azúcar al sistema: compras propias con factura, mercadería en consignación de comitentes y operaciones AZEF/otros. Es la fuente del stock contable y del costo que después consume Cotizaciones. Acá viven las OCAs, los descubiertos, las imputaciones y la integración con el ERP Flexxus vía Bridge. Roles 1, 2, 3 y 5 (algunas acciones son solo Gerente, ver cada sección). Este capítulo no omite nada: cada botón, cada validación, cada mensaje y cada escenario.
La pantalla principal
Cabecera «Compras & Consignación» / «Stock contable de azúcar propio y en consignación», con tres botones:
| Botón | Qué hace |
|---|---|
| «Generar F3000 de Recepción» (verde) | Lee un Remito Electrónico AFIP (PDF) y arma el payload de recepción (ver abajo) |
| «Histórico» (gris) | Consulta paginada de compras anteriores con filtros |
| «Nueva Compra» (azul) | Abre el asistente de 3 pasos |
Todo se actualiza en tiempo real (tres listeners): las compras vivas (hasta 500, descartando canceladas/liquidadas), los KPIs de stock contable y el balance neto de movimientos. Las tres tarjetas KPI muestran el stock contable por tipo:
| Tarjeta | Qué muestra | Clic |
|---|---|---|
| Consignación (azul) | Σ saldo de OCAs de consignación, en bolsas/kg y nº de OCs | — |
| Propia c/ Factura (verde) | Stock propio (neto balance + ajustes) | Abre el detalle de movimientos «propia» |
| AZEF / Otros (ámbar) | Stock AZEF/otros | Abre el detalle de movimientos «otros» |
Si una tarjeta queda en rojo con la insignia «STOCK NEGATIVO», ese tipo
tiene saldo negativo (revisar). El bloque «Por recibir: N bls (N kg)» aparece
cuando hay compras «a recibir» con camiones pendientes (modo con recepción y
kgRecepcionados < cantidadKg).
Tarjeta «Stock en Consignación» — las tres solapas
Panel de totales: DISPONIBLE (Σ saldo de OCAs activas con saldo > 0, menos los descubiertos) y VENDIDO S/LIQ. (lo vendido sin liquidar, solo si > 0). Tres solapas, cada una pagina de a 20 con «Mostrar 20 más»:
| Solapa | Qué lista exactamente |
|---|---|
| Disponible (N · N desc.) | OCAs estado='activo' con saldo > 0. Arriba, los descubiertos agrupados por comitente (pendiente_oca), fila roja con badge DESCUBIERTO, OCA «Sin OCA», saldo en negativo |
| Vendido s/liq. (N) | Descubiertos + OCAs con origenNegativo (badge RELIGAR si falta liquidar) + OCAs con saldo consumido > 0. Badge AGOTADA si saldo ≤ 0 |
| Liquidadas (N) | OCAs estado='liquidado', badge TOTAL o PARCIAL (si liquidó menos que el original) |
Al pie: «Liquidos Productos — Liquidación del Período» (va al módulo Líquidos Productos) y «Exportar Excel — Ventas / Imputaciones OCA» (ver «Exportar Excel»).
Nueva Compra — Asistente de 3 pasos
Paso 1 — Tipo de compra
| Tipo | Cuándo | Titular |
|---|---|---|
| Consignación | «Stock de terceros bajo consignación en Moyco» | «Comitente» |
| Compra Propia c/ Factura | «Azúcar comprada con factura de proveedor» | «Proveedor» |
| AZEF / Otros | «Otras operaciones de ingreso de azúcar» | «Proveedor» |
Al elegir el tipo, el sistema hace un chequeo de salud del Bridge. Si está online y la base responde, abre el selector de OC de Flexxus para pre-cargar la compra. Si el Bridge está offline, salta directo al Paso 2 (carga manual de siempre). El Bridge es un servicio Python local de solo lectura sobre Flexxus (Firebird); ver el capítulo «Integración Flexxus (Bridge)».
El selector de OC de Flexxus (con imágenes)
El modal «Importar desde Orden de Compra» (con el logo de Flexxus) lista las OCs recientes:
- Rango: botones 7 d / 30 d / 60 d (default 30).
- Filtrado automático: solo OCs que contengan artículos cuyos códigos Flexxus estén cargados en ABM → Artículos (categoría MP). El cartel «Filtrando: …» muestra qué códigos se están usando. Si no hay ningún MP con código Flexxus, avisa: «No hay artículos MP con códigos Flexxus cargados. Cargá los códigos en ABM Artículos antes de usar el bridge.»
- Cada OC muestra N° OC, fecha, razón social, CUIT y el match con GS:
- ✓ Nombre del propietario si el CUIT coincide con un propietario de GS;
- ⚠ sin match GS si no hay propietario con ese CUIT.
- El contador arriba dice cuántas OCs hay y cuántas se ocultaron por estar ya vinculadas a otra compra.
- Clic en una OC → trae su detalle de Flexxus y pre-rellena el Paso 2. «← Cargar manualmente (sin bridge)» sigue sin Flexxus.
Si el servicio no está corriendo en la PC o no llega a Flexxus, el modal muestra «Bridge Flexxus no disponible» con el detalle del error y la sugerencia de cargar manual. No se rompe nada: se opera a mano y se puede vincular después.
Matchea el propietario por CUIT (y si no, por razón social). Toma la primera línea de Materia Prima de la OC para kg y precio (bolsas = kg/50; precio bolsa con IVA = precio kg sin IVA × 50 × 1,21). Si la OC tiene varias líneas MP, avisa: «⚠️ La OC #N tiene N líneas de MP. Se importó solo la primera… Las demás cargalas creando una compra adicional.» El artículo se deja vacío a propósito (el operador elige el SKU GS exacto). En el Paso 2 aparece un banner ámbar «Importado de OC Flexxus #N» con un botón «Quitar vinculación» (mantiene lo tipeado) y bloquea OCA/bolsas/kg/precio (candado ámbar) para que coincidan con el ERP.
Paso 2 — Datos de la compra
- Afectación del Stock Contable obligatorio — dos tarjetas:
- «Azúcar ya en planta» (inmediato): «Actualiza stock contable al confirmar».
- «Azúcar a recibir» (con recepción): «Requiere Orden de Recepción» — el stock se va sumando a medida que llegan los camiones.
- Proveedor / Comitente (buscador inteligente). La etiqueta es «Comitente» en consignación, «Proveedor» en propia/AZEF.
- Fecha (default hoy) y N° OCA (ej.:
1234). - Artículo (Materia Prima) (buscador, solo categoría MP).
- Cantidad: bolsas y kg con recálculo bidireccional (1 bolsa = 50 kg).
- Precio Final por Bolsa — con IVA; muestra el total en vivo.
- Observaciones (opcional).
- «Revisar →».
Sin modo: «Indicá la afectación del Stock Contable…». Sin propietario: «Seleccioná el propietario / comitente.». Sin fecha / sin OCA / sin artículo: los avisos correspondientes. Bolsas ≤ 0: «Ingresá una cantidad válida de bolsas.». Precio ≤ 0: «Ingresá el precio por bolsa.».
Validación de stock (solo modo «ya en planta»): si el propietario no tiene stock suficiente, se bloquea con «⛔ STOCK INSUFICIENTE» detallando los kg disponibles y requeridos, y sugiere cambiar a «Azúcar a recibir».
La validación de stock suma todos los stock_snapshots del
propietario sin discriminar artículo: el azúcar del cañero se trata como
commodity. La cesión sí usa el articuloId elegido. Es intencional, no es
un bug.
Paso 3 — Confirmar
Tabla resumen (tipo, afectación, comitente/proveedor, fecha, OCA, artículo, cantidad, precio/bolsa, observaciones, OC Flexxus si hay, Total Operación) y un cuadro que explica qué pasará según el modo. Al «Confirmar y Continuar»:
- Crea el documento en
compras_azucar(tipo, modoAfectacion, propietario, OCA, bolsas/kg, precios,saldoConsumidoKg: 0, estado activo, yflexxusOCsi vino de Flexxus). - Cesión programática: crea dos
movimientos(salida del cedente + ingreso a MOYCO SRL), guardados en la compra comocesionSalidaId/cesionIngresoId. El stock lo recalcula el servidor. - Si el modo es «a recibir», obliga a generar la Orden de Recepción. Si cancelás la OR, el sistema hace rollback completo (anula la cesión y borra/restaura la compra) y avisa: «↩️ Operación cancelada. La compra y la cesión fueron revertidas.»
- Mensaje de éxito: «✅ Compra OCA <oca> y cesión registradas exitosamente. Salida: … · Ingreso: …».
Si es consignación y el comitente tiene un descubierto (registro
pendiente_oca), al confirmar el sistema pregunta: «⚠️ Este
comitente tiene N bolsas en DESCUBIERTO… ¿Desea imputar esta OCA al saldo negativo
existente? • SÍ: la OCA cubre el descubierto • NO: se crea una OCA
independiente». Si elegís SÍ, la OCA arranca con el saldo ya reducido por el
descubierto y queda marcada origenNegativo: true.
Aviso: se envía un mail con la confirmación de la operación
Apenas la compra y la cesión quedan registradas, el sistema pregunta textualmente:
«¿Notificar por mail la compra OCA <oca>?
Se enviará un resumen a los destinatarios habituales (adrian / veronica / jose /
hernan @azucel.com).»
Si aceptás, se envía y confirma: «✉️ Mail enviado a N destinatario(s).» Si falla: «No se pudo enviar el mail. <mensaje>». El mail sale a esos 4 destinatarios fijos, no es opcional a quién: es la notificación oficial de que la operación se registró.
El correo (asunto Mov. Web - <propietario> - OC N° <oca>, remitente «Gestor Stock Moyco») incluye:
- Badge «Compra Registrada», título OCA <oca> · <propietario> y «Se registró exitosamente la operación.»
- Cantidad operada (kg + bolsas + artículo), datos de la operación (cañero, fecha, OCA, tipo, artículo, precio/bolsa, total, OC Flexxus si aplica) y observaciones.
- Pases de stock: tabla con los dos movimientos de cesión (N° MW, propietario, kg).
- Pie: «Operación registrada por <nombre del usuario>».
- Cada envío queda registrado en
compras_notificaciones(auditoría: quién, cuándo, a quién, cuántos llegaron).
Desde el detalle de la OCA, el botón «Re-enviar Mail» pregunta «¿Re-enviar el mail… Se marcará explícitamente como 'Re-Envío' en el asunto y en el cuerpo.» El correo reenviado lleva ` (Re-Envío)` en el asunto y un banner ámbar «⚠️ Re-Envío manual · por <nombre>» aclarando que la operación ya estaba registrada. Confirma «✉️ Re-envío realizado a N destinatario(s).»
F3000 de Recepción
«Generar F3000 de Recepción» abre un selector de PDF y lee un Remito Electrónico AFIP (Código 997): extrae titular (nombre/CUIT/domicilio), transporte (CUIT, chofer, DNI, dominios tractor/acoplado) y detalle (bolsones, peso). Arma el payload de recepción con destino MOYCO S.R.L. (CUIT 30712115013, Arcadia – Tucumán, km 15) y dispara el flujo de recepción tipo «propia». No escribe en Firestore: alimenta el alta de la recepción. Si el PDF no es un remito 997 válido: «No se pudo identificar el remito. Verificá que sea un Remito Electrónico AFIP (Código 997).»
Detalle de una OCA — todas las acciones
Muestra resumen (fecha, original, consumido, saldo, precio, badge «🔗 OC Flexxus #N» si está vinculada) y los movimientos imputados. Hay un botón «Copiar» que copia la liquidación tabulada al portapapeles. La barra de acciones depende del estado y varias son solo Gerente (rol 1):
| Acción | Quién | Qué hace / texto clave |
|---|---|---|
| Liquidar OCA | Gerente | Confirma y marca como liquidada (consume todo el saldo). «…pasará a la pestaña 'Sin Saldo'. Esta acción es reversible editando el registro.» |
| Ajustar Saldo | Gerente | Prompt del saldo pendiente en bolsas; valida número ≥ 0 y ≤ original; doble confirmación. Corrige descuadres de imputación |
| Imputar Descubiertos | Gerente | Modal con los descubiertos del comitente; valida que la suma no supere el saldo; transacción atómica (re-lee el saldo) que sube saldoConsumidoKg y liquida los negativos; religa los movimientos |
| Anular imputación | Gerente | Solo OCAs origenNegativo. Calcula los kg desde los MW vivos (no se pregunta), desliga movimientos y restaura los descubiertos |
| Dar por finalizada | Gerente | Compra «a recibir» con recepción parcial: pide motivo, crea un MW de ajuste por lo no recibido y cierra la OR (estado CARGADA) |
| Anular compra | Gerente | Triple confirmación (ver abajo). Revierte la cesión y, si corresponde, borra la OR |
| Re-enviar Mail | Todos | Reenvía la notificación marcada «Re-Envío» |
| Vincular / Desvincular Flexxus | Todos | Asocia/quita una OC del ERP a posteriori (ver abajo) |
(1) Confirmación con el detalle de la OCA. (2) Motivo obligatorio por prompt
(«Se requiere un motivo.» si lo dejás vacío). (3) Hay que escribir literalmente
ANULAR en mayúsculas; si no coincide: «Anulación cancelada: el texto
no coincide.». Revierte los movimientos de cesión. Si la OR ya tuvo recepciones
parciales, no deja anular: hay que usar «Dar por finalizada».
Si vas a Movimientos de Stock e intentás anular un movimiento de cesión, el sistema lo bloquea y te manda acá: «⛔ ACCIÓN DENEGADA … Para anular debés ir a Compras → abrir la OCA → botón 'Anular compra'.» Así la anulación es siempre en cascada (movimientos + OR + compra), sin quedar a medias.
Vincular / Desvincular una OC Flexxus a posteriori (con cruce)
- Vincular OC Flexxus: si ya está vinculada avisa y no sigue. Hace
pingHealth(si offline: «El bridge Flexxus no está disponible. Revisá que esté corriendo en esta PC.»). Abre el selector en modo cruce: cada OC se colorea por compatibilidad contra esta compra y se abre un modal «Confirmar vinculación» con la tabla GS Moyco vs Flexxus (Proveedor, OCA, Cantidad kg, Cantidad bolsas, Precio bolsa c/IVA) y las líneas de la OC. - Desvincular Flexxus: confirma «¿Desvincular la OC Flexxus #N de esta compra? Los datos de la compra GS no se modifican.» y deja
flexxusOC: null.
| Diferencia detectada | Color | Resultado |
|---|---|---|
| Δ kg ≤ 50 kg y CUIT coincide | Verde ✓ COMPATIBLE | Se puede vincular |
| Δ kg entre 50 y 500 kg | Ámbar ⚠ Δ … kg | Se puede vincular con advertencia |
| Δ kg > 500 kg o CUIT distinto | Rojo ⛔ INCOMPATIBLE | Bloqueado — botón «Confirmar y vincular» deshabilitado |
El modal de confirmación no deja vincular si el CUIT del proveedor no coincide («VINCULACIÓN BLOQUEADA — CUIT del proveedor no coincide…») o si la diferencia de kilos supera la tolerancia («Diferencia de N kg supera la tolerancia (500 kg).»). El precio por bolsa con IVA se compara con tolerancia de $200 (diferencia mayor = ⚠, no bloquea). Es la barrera contra vincular el comprobante equivocado.
Compra GS de «Ingenio La Esperanza», 28.000 kg (560 bolsas), $42.350/bolsa c/IVA.
Se elige la OC #1180 de Flexxus (CUIT coincidente): kg Flexxus 28.000 → Δ 0 kg ✓
COMPATIBLE; precio Flexxus $698,18/kg s/IVA → $698,18 × 50 × 1,21 ≈ $42.240
c/IVA → Δ $110 (≤ $200) ✓. Se habilita «✓ Confirmar y vincular» y la compra
guarda el bloque flexxusOC con vinculadaPosthoc:true. Los
datos de la compra GS no se tocan: solo se agrega la referencia.
Histórico
«Histórico» abre una consulta paginada (25 por página, «Cargar 25 más») de
compras_azucar con filtros de servidor: Tipo (Consignación / Propia
/ AZEF), Modo (Ya en planta / A recibir), Estado (Activa / Anulada /
Finalizada parcial), Desde / Hasta, más un buscador de texto (OCA / cañero) que
filtra lo ya cargado. Si falta un índice de Firestore, avisa: «No se pudo cargar el
histórico… Puede faltar un índice compuesto en Firestore.»
Exportar Excel — Ventas / Imputaciones OCA
Desde la tarjeta de consignación. Pide Desde / Hasta (default últimos 7 días,
máximo 45 días). Genera un CSV con una fila por imputación de venta de
consignación: ID MW, fecha, cliente, depósito, artículo, OCA, comitente, kg (capeados
al peso real del MW), bolsas, flags (⚠ CAP / ANULADO / AJUSTE), factura, remito,
transporte, etc., con fila TOTAL y un bloque «AUDITORÍA POR OCA» que compara lo
reportado contra saldoConsumidoKg (OK / Reporte > consumido / Reporte
< consumido / OCA no encontrada). Sirve para detectar descuadres de imputación.
Cuando una venta de una OCA se parte en varios viajes y el operador imputa el total
a cada uno, saldoConsumidoKg queda inflado. La verdad física es
la cantidad del movimiento. El export prorratea y marca el descuadre; «Ajustar
Saldo» es la corrección manual.
Flujo de datos
| Acción | Escribe | Efecto en cadena |
|---|---|---|
| Confirmar compra | compras_azucar + 2 movimientos (cesión) | Trigger recalcula stock_snapshots y stock_balance/azucar; ofrece mail (Cloud Function → compras_notificaciones) |
| Imputar descubiertos | Transacción sobre compras_azucar + religado de movimientos | Sube saldo consumido; negativos → liquidado |
| Liquidar / Ajustar saldo | compras_azucar.saldoConsumidoKg | Cambia el saldo disponible |
| Finalizar parcial | movimientos (MW ajuste) + ordenesCarga (OR → CARGADA) | Cierra recepción incompleta |
| Anular completa | Reversa de cesión + compras_azucar.estadoCompra='anulada' | Trigger recalcula stock |
| Vincular / Desvincular Flexxus | compras_azucar.flexxusOC | Solo referencia — no toca la compra ni el stock |
El stock lo recalcula el servidor; nunca se edita a mano. El Bridge Flexxus es de
solo lectura sobre el ERP: trae OCs para pre-armar/cruzar y deja la referencia
del lado de GS, nunca modifica Flexxus. Toda compra deja rastro por mail a los 4
destinatarios y en compras_notificaciones.
Stock General
Stock General es la foto del stock contable de azúcar consolidado por propietario y por depósito. Es una pantalla de pura consulta: acá no se edita nada. El saldo es el resultado de compras, producción, movimientos, cesiones y despachos; lo calcula y materializa el servidor. Roles 1, 2, 3 y 5. Tiene versión de escritorio y versión móvil.
100 % lectura — el stock no se corrige acá
Stock General no tiene ningún botón que modifique saldos. Si un número está mal, se corrige en el módulo que lo originó (Compras, Movimientos, Producción, o un despacho / devolución en Ventas) anulando o ajustando el movimiento; un proceso del servidor recalcula el snapshot solo. No existe —a propósito— ninguna edición directa del saldo desde esta pantalla.
Vista de escritorio
Dos columnas:
«Por Propietario» (columna izquierda)
- Buscador «Buscar cliente o empresa...»: filtra en vivo por nombre.
- Casilla «Ver Ceros»: por defecto oculta las cuentas con saldo ≈ 0; al tildarla las muestra.
- Tabla con Propietario · Existencia (Kg) · Bolsas (Est.) · Acción. «Bolsas (Est.)» = kilos ÷ 50 redondeado para abajo.
- Si una cuenta tiene saldo negativo, la fila se pinta de rojo (señal de revisar ese propietario).
- Clic en cualquier fila (o en la flecha ›) → abre el detalle de ese propietario.
Todos los propietarios cuyo nombre contiene «MOYCO» se suman y se muestran como una única fila «MOYCO SRL» (aparece primera; el resto, alfabético). Al abrir su detalle, la consulta busca movimientos en todas las cuentas vinculadas a la vez.
«Por Depósito» (columna derecha)
Tabla Depósito · Total (Kg) · Bolsas (50kg), ordenada de mayor a menor. Solo muestra depósitos con saldo > 0 (salvo que «Ver Ceros» esté activo). Es la lectura física: en qué depósito está la mercadería.
Para ser rápida, la pantalla usa un resumen pre-calculado por el servidor (muestra la hora de cálculo). Si ese resumen no está disponible, cae a leer los saldos en vivo y lo indica con la etiqueta «Datos en Vivo». En ambos casos el número es correcto; cambia solo de dónde se lee.
Detalle de un propietario
- Encabezado con el nombre del propietario y botón «Volver».
- Buscador local «Filtrar movimientos...»: filtra la lista ya cargada por ID, fecha o remito.
- Tabla ID · Fecha · Tipo · Destino/Proc · Artículo · Kg · Documentos. «Tipo» es un badge INGRESO (verde) o SALIDA (rojo).
- Paginación: trae los 30 movimientos más recientes; el botón «Cargar historial antiguo» / «Cargar más antiguos» trae 30 más.
- Botón verde «Descargar Excel»: exporta solo lo que está cargado en pantalla a un
.xlsx(hoja «Movimientos») con columnas ID · Fecha · Tipo · Destino/Procedencia · Artículo · KG · Remito · Factura. ArchivoStock_<Titular>_<fecha>.xlsx. Si no hay nada cargado avisa «No hay movimientos cargados para exportar.».
Al abrir el detalle de una cuenta consolidada (varias cuentas, ej. MOYCO) puede aparecer «Esta consulta requiere un índice nuevo.»: hay que activarlo una sola vez desde el link de la consola (F12). Una vez creado el índice, no vuelve a pasar.
Vista móvil
En el celular se ve como tarjetas por cliente (nombre, badge de bolsas estimadas y el saldo grande en kg; negativo en rojo), con buscador «Buscar por cliente...» y casilla «Ver Cuentas en Cero». Tocar una tarjeta abre la «Auditoría» del cliente: las tarjetas de movimientos paginadas de a 10 con «Cargar movimientos anteriores».
Botón «Actualizar»
«Actualizar» (arriba a la derecha) vuelve a leer los saldos (reintenta el resumen del servidor y, si falla, la lectura en vivo). No recalcula el stock — recalcular es responsabilidad del servidor; este botón solo refresca lo que se muestra.
Flujo de datos
Lee dashboard_kpis/main (resumen), stock_snapshots
(fallback en vivo), movimientos (para el detalle) y las maestras para
resolver nombres. No escribe absolutamente nada.
Stock Pallet
Stock Pallet controla la mercadería palletizada en forma separada del stock contable a granel, e incluye la gestión de vales de pallets. Roles 1, 2, 3 y 5. Tiene dos solapas: Stock Físico y Gestión Vales.
Solapa «Stock Físico»
- La grilla lista los pallets a partir de los snapshots de pallet, con su artículo, formato y cantidad.
- Filtros por artículo/ubicación; botón para reiniciar el filtro.
- Al abrir un renglón (detalle) se ve la composición de ese pallet y su trazabilidad.
Solapa «Gestión Vales»
Administra los vales de pallets (entrega/devolución de pallets al cliente o transportista). Permite registrar y dar seguimiento a los vales, y conciliarlos contra lo facturado.
Flujo de datos
| Colección | Rol |
|---|---|
pallet_snapshots | Lectura — saldo físico de pallets |
vales / gestionesVales | Escribe/lee — vales de pallets y su gestión |
palletsFacturados | Lectura — conciliación contra facturación |
movimientos, pedidosVenta | Lectura — altas y salidas que afectan pallets |
El stock de pallets es independiente del stock contable de Stock General: un mismo despacho puede impactar ambos según cómo se haya armado la mercadería (palletizada o no, definido por ítem al cargar el pedido en Ventas).
Movimientos de Stock
Movimientos de Stock es el corazón del stock de azúcar: acá se registran y consultan todos los movimientos que mueven existencias — recepciones, egresos, ajustes, mermas, pases internos entre depósitos, cesiones de titularidad y el pase intersectorial Azúcar ↔ División Polvos. Es también la pantalla a la que llega el despacho desde una Orden de Carga. Es uno de los módulos más grandes del sistema; este capítulo explica cada botón y cada escenario, con ejemplos. Roles 1, 2, 3 y 5.
El rol 4 (operador básico) solo consulta: no ve los botones de acción (Recepción, Despacho, Pase, Cesión, Pase Polvos), ni «NUEVO», ni Editar/Anular por fila, ni el aviso de facturas pendientes. Todo lo demás es staff (roles 1, 2, 3, 5). Vincular facturas Flexxus es exclusivo de Gerencia (1) y Ventas (5).
El listado
Trae los 50 movimientos más recientes (orden por número descendente) y resuelve los nombres de propietario y destino. El botón «Cargar más antiguos» trae 50 más. Banners que pueden aparecer arriba:
- «Atención: Facturación Pendiente» (amarillo): hay N movimientos de salida sin N° de factura. El enlace «Revisar» abre el modal de pendientes. (Los anulados de 0 kg no cuentan; el sistema los limpia solo.)
- Cierre de período: aviso del período contable.
- Histórico global: «Mostrando Histórico Global. Borre la búsqueda para volver a la vista optimizada.»
La barra superior
| Elemento | Qué hace |
|---|---|
| Buscador «Buscar ID, Remito, Factura, Cliente...» | Filtra localmente los 50 cargados mientras escribís |
| Botón database / Enter | Búsqueda global en todo el histórico (5 consultas exactas: por ID, remito, factura, orden y doc. interno). Para un número exacto tipo 00001-00000005 |
| «Visibles: N» | Cuántos movimientos hay en pantalla |
| «Excel» | Abre el modal de exportación del histórico (ver abajo) |
| «NUEVO» | Abre el formulario de Nuevo Movimiento manual (ver «Nuevo Movimiento») |
Fila de botones de acción
| Botón | Para qué | Sección |
|---|---|---|
| Recepción (verde) | Recibir mercadería de Órdenes en tránsito | Wizard de Recepción |
| Despacho OC (índigo) | Procesar la salida de una Orden de Carga activa | Despacho desde OC |
| Pase Dep. (azul) | Mover mercadería entre depósitos (misma titularidad) | Pase Interno |
| Cesión Stock (violeta) | Cambiar la titularidad del stock en AZUCEL 4 | Cesión de Stock |
| Pase Polvos (ámbar) | Pase intersectorial Azúcar ↔ División Polvos | Pase Polvos |
En la tabla, cada fila muestra ID · Fecha · Tipo · Propietario · Destino/Proc. · Cantidad · Referencia · Acción. Los anulados salen en gris itálica (no se editan ni anulan). Los de salida sin factura salen en amarillo pulsante con badge «SIN FACTURA» y son clickeables para cargar la factura.
Acciones por fila
| Botón | Qué hace |
|---|---|
| Ver (ojo) | Abre la Ficha Técnica del movimiento (ver «Detalle») |
| Ver factura Flexxus (recibo) | Solo si el MW tiene factura Flexxus vinculada: muestra el comprobante del ERP |
| Vincular factura Flexxus (link) | Solo MW de salida tipo VENTA sin factura, y solo roles Gerencia/Ventas. Cruce N×M contra Flexxus (ver «Vincular Flexxus») |
| Editar (lápiz) | Reabre el movimiento en el formulario con campos bloqueados según su estado. No se editan PASE/TRASPASO/Pase Polvos (se anulan y se rehacen) |
| Anular (bloque) | Revierte el movimiento; tiene reglas de bloqueo (ver «Anular») |
Nuevo Movimiento (formulario manual)
El formulario es por pasos y cambia según el tipo.
Paso 0 — Tipo de azúcar
En el alta manual (botón «NUEVO»), el primer paso es elegir el tipo: Consignación, Azúcar Propia (AZPR), AZEF / Otros u Orgánica. «← Volver al listado» cancela sin tocar nada.
Si elegís Orgánica, todos los artículos del movimiento deben ser orgánicos; y un artículo orgánico exige tipo Orgánica. El sistema lo rechaza con aviso. Ojo: esto aplica acá porque son ingresos / movimientos internos. En ventas/despacho la restricción está levantada (la orgánica se despacha como Propia/AZEF/Consignación, y el modal de despacho ni siquiera ofrece «Orgánica»).
Paso 0.5 — Vinculación Flexxus (opcional)
Si corresponde, se puede vincular el movimiento con una factura de Flexxus (cruce N×M, los 4 controles). Es el mismo flujo que en el despacho — ver el capítulo «Integración Flexxus (Bridge)».
Datos del movimiento
- Propietario y Destino / Procedencia (obligatorios, buscadores inteligentes).
- Artículo y Cantidad. En Carga Múltiple (interruptor arriba) se cargan varios renglones artículo/cantidad/lote en un mismo movimiento; el total se recalcula solo.
- Tarifa: el sistema busca la tarifa vigente según transporte y geografía (cascada localidad → zona). Si no hay, se puede activar tarifa manual. Las etiquetas de vigencia van de «✔ Vigente» a «🔴 Nd — revisar» según antigüedad.
- Transporte, chofer y provincia/localidad cuando aplica.
- Saldo no negativo: un egreso que dejaría el stock negativo se rechaza (validación en pantalla + barrera en el servidor).
- Duplicados: si hay un movimiento muy parecido reciente, pide confirmación.
- Fecha anterior: si la fecha es previa al último movimiento, advierte y pide confirmar.
- Bloqueo por liquidación: no se puede editar/re-liquidar un MW ya liquidado. Si la liquidación fue borrada, el sistema detecta el «bloqueo fantasma» y desbloquea solo; si la liquidación existe, hay que anularla primero en Fletes → Historial de Liquidaciones.
Al guardar se crea el documento en movimientos con correlativo
MW00000001. Hay opción «guardar con factura pendiente» para
registrarlo aunque falte el N° de factura (queda en la bandeja de pendientes).
Botón «Recepción» — Wizard de Recepción (paso a paso)
Recibe la mercadería de Órdenes que están en tránsito (estado «GESTIÓN»).
- Paso 1: el sistema busca las órdenes en camino. Se elige el «Titular de la mercadería (Propietario)» y «BUSCAR ÓRDENES». Si no hay órdenes: «No hay órdenes en estado 'GESTIÓN' para recibir.».
- Paso 2: tabla con las órdenes de ese titular (N° Orden, Procedencia/Ingenio, Artículo, Saldo). Se tilda cada orden a recibir y se ingresa la cantidad recibida en kg (precarga el saldo pendiente como sugerido; el tope es el pendiente).
- Paso 3: el sistema valida y arma la recepción:
- No se puede mezclar órdenes vinculadas a compras con órdenes de almacenamiento 3ros: «🚨 No se puede mezclar en una misma recepción…».
- No se pueden mezclar compras de distinto tipo contable (Consignación/Propia/AZEF): «🚨 Las órdenes seleccionadas están vinculadas a compras con distinto tipo contable… Procesá cada tipo por separado.».
- Lleva al formulario de movimiento ya precargado como ingreso de recepción; al confirmar se crea el MW, baja el saldo pendiente de cada Orden (pasa a «CARGADA» cuando se completa, si no queda en «GESTION») y agrega la entrada al historial de cargas. Éxito: «✅ Recepción registrada con éxito. Movimiento: MW…».
Botón «Despacho OC» — Despacho desde Orden de Carga
Abre el modal «Seleccionar Orden de Carga» con las OC activas (pedidos en «EN_CARGA», agrupados por NP). Se elige una con «Confirmar» y el sistema lleva al formulario en modo despacho (egreso) con todo precargado. El paso a paso completo del despacho —tipo de azúcar, imputación de consignación, cruce Flexxus, confirmación— está en el capítulo «Pedidos & Ventas» → Despacho.
Botón «Pase Dep.» — Pase Interno entre depósitos
Mueve mercadería entre depósitos sin cambiar el dueño (sigue siendo MOYCO).
- Fecha, Artículo (excluye los genéricos), Origen (Sale), Destino (Entra), Cantidad (Kg), Costo Mov Bolsa (No Aplica / Propio / 3ro-Pallet / 3ro-Estiba / 3ro-Trasbordo / 3ro-Otros) y Observaciones.
- Valida: campos obligatorios completos y «Origen y Destino deben ser diferentes.».
- Vista previa «Confirmar Pase» (Sale de / Entra a / cantidad / costo) → «Confirmar».
- Genera dos movimientos vinculados (una salida y un ingreso,
docAzucel: PASE INTERNO). Por eso un pase no se «edita»: se anula y se rehace. Éxito: «✅ Pase registrado.».
Botón «Cesión Stock» — Cambio de titularidad
Transfiere stock de un propietario a otro (cambio de titularidad en AZUCEL 4).
- Fecha, Orden (opcional), Artículo, Cedente (Sale), Receptor (Entra), Cantidad, Observaciones.
- Valida campos y «Cedente y Receptor deben ser distintos.».
- Reglas de negocio según quién es Moyco:
- Receptor = MOYCO: bloqueado — «Para registrar un ingreso a Moyco SRL debe utilizar el módulo "Compras".».
- Cedente = MOYCO: confirma que es una salida AZEF/Otras (para otro tipo de venta usar Ventas).
- Ambos terceros → «Almacenamiento 3ros».
- Vista previa «Confirmar Operación» → «Confirmar Cesión». Genera dos movimientos vinculados (
docAzucel: TRASPASO). El alta de compra usa este mismo motor por debajo (cesión programática). Éxito: «✅ Cesión registrada.».
Botón «Pase Polvos» — intersectorial Azúcar ↔ División Polvos
Conecta el sector Azúcar con la División Polvos. Dos operaciones, con código de color para no confundirlas: Pase a Div. Polvos en ámbar y Devolución a Azúcar en teal.
Tiene que existir el destino «Div. Polvos» en ABM → Destinos (si no: «No se encontró 'Div. Polvos' en el ABM de destinos. Agréguela antes de continuar.») y el propietario MOYCO en propietarios.
Pase a Div. Polvos (desde Azúcar)
- Fecha, Depósito Origen, Artículo de Azúcar (con marca) — al elegirlo el sistema auto-mapea el insumo de Polvos (CTA / Refinada según el nombre; si no, «sin mapeo automático» y se elige a mano), Insumo en Div. Polvos, Cantidad (kg), Lote (para Div. Polvos) (default
S/L), Observaciones. - «Ver resumen»: panel rojo «Sale de Azúcar» + panel verde «Entra a Div. Polvos» → «Confirmar Pase».
- Valida stock en el depósito de azúcar («Stock insuficiente en depósito… Disponible / Solicitado»).
- En una única transacción atómica registra: la salida de azúcar (
PASE DIV.POLVOS) + el descuento del snapshot de azúcar + el ingreso del insumo en Polvos + el doc de trazabilidad enpases_polvos. Éxito: «✅ Pase registrado correctamente. Azúcar: MW… (Salida) · Div. Polvos: MED… (Ingreso) · Pase ID: PASE…».
Devolución a Azúcar (desde Polvos)
- Fecha, Insumo a Devolver, Lote a Devolver (lista los lotes con stock > 0, mostrando los kg), Cantidad (kg), Artículo en Azúcar (destino), Depósito Destino, Motivo.
- Valida el saldo del lote («Stock insuficiente en lote… Disponible»).
- «Ver resumen» → «Confirmar Devolución». Transacción atómica: egreso del insumo en Polvos (
DEV.A AZUCAR) + ingreso de azúcar + suma al snapshot de azúcar + doc enpases_polvos. Éxito: «✅ Devolución registrada correctamente…».
El pase y la devolución usan una transacción: la salida de un sector y el
ingreso del otro se graban juntos o no se graba nada. Nunca queda un sector con
salida y el otro sin ingreso. El stock de los insumos de Polvos lo recalcula la
Cloud Function (no lo escribe el cliente, para no duplicar). Trazabilidad
completa en pases_polvos.
Anular un movimiento
El botón Anular revierte el movimiento, pero primero chequea reglas de bloqueo (mensajes que vas a ver, todos empiezan con «⛔ ACCIÓN DENEGADA»):
| Si el movimiento… | Qué dice |
|---|---|
| ya está anulado | «…Este movimiento se encuentra ANULADO. No se permite editar ni modificar registros anulados.» |
| pertenece a un Parte Diario | «…pertenece al Parte Diario {id}. Para anularlo, primero debe eliminar el Parte Diario…» |
| fue liquidado (flete) | «…Este viaje ya fue liquidado ({id}). Debe anular la liquidación antes de modificar el viaje.» |
| es la cesión de una compra OCA | «…Para anular debés ir a Compras → abrir la OCA → botón "Anular compra". Eso anula en cascada…» |
Si no está bloqueado, se abre un modal rojo «¿Anular Movimiento?» con el ID y
la cantidad. Para confirmar hay que escribir la palabra anular
(el botón CONFIRMAR está deshabilitado hasta entonces). La anulación pone el MW en
cantidad 0 y docAzucel: ANULADO; el servidor recalcula el stock por
diferencia. Si tenía un movimiento vinculado (par PASE/TRASPASO) se anula también.
Si el MW es parte de un despacho (NP de una Orden de Carga), el modal avisa que se
anularán N movimientos en cascada y N pedido(s) volverán a «En
Carga». Además restituye el saldo a las Órdenes, revierte
cantidadPendiente, limpia el historial de cargas y borra los
descubiertos de consignación huérfanos. Es la forma correcta de «deshacer» un
despacho.
Ver / Vincular factura Flexxus (posterior)
Solo para MW de salida tipo VENTA sin factura, y solo roles Gerencia (1) y Ventas (5). Si el despacho se hizo sin Bridge, acá se asocia la factura después: detecta los MW «hermanos» del mismo viaje (mismo propietario/destino/remito/ fecha) y aplica la vinculación a todos. Requiere que el destino tenga CUIT cargado. Es el mismo cruce N×M con los 4 controles del despacho — ver el capítulo «Integración Flexxus (Bridge)». Al confirmar, escribe la factura en los MW y deja registro en el historial de vinculaciones.
Detalle — Ficha Técnica del movimiento
El botón Ver abre la «Ficha Técnica de Movimiento», de solo lectura:
- Encabezado: badge ingreso/salida, cantidad en kg, artículo, referencia interna (MW) y fecha.
- Participantes: propietario, destino/procedencia, ubicación física (depósito).
- Logística y costos: transporte, chofer, zona/ciudad, costo mov. bolsa, tarifa, movimiento de envases (pallets ±).
- Tarjetas de Remito, Orden de Carga y Factura.
- Auditoría: quién y cuándo lo registró/editó, las vinculaciones Flexxus (vinculación / re-vinculación con comprobante anterior → nuevo) y un botón «Ver historial» con el log de auditoría.
- Si es salida: sección «Documentación F3000 (DGR Tucumán)» con «Generar carga F3000» (arma los datos y los pasa a la extensión de Chrome «GS Moyco → F3000»; no escribe en la base; si la extensión no está activa avisa). En consignación con imputaciones, prorratea por comitente para no sobre-contabilizar.
El detalle no edita ni anula: esas acciones están en el listado.
Exportar histórico (CSV)
El botón «Excel» pide Desde / Hasta (default últimos 7 días, máximo 31 días: «🚨 ACCESO DENEGADO (Rango Excedido)…» si te pasás). Baja un CSV con todas las columnas del movimiento (propietario, destino, depósito, artículo, kg, documentos, transporte, chofer, tarifa, pallets, etc.).
En el CSV, las salidas se exportan con signo negativo (y el pallet de egreso también). Es a propósito, para que la suma de la columna dé el neto. No es un error del reporte.
Flujo de datos
| Acción | Escribe | Efecto |
|---|---|---|
| Alta de movimiento | movimientos (1 doc; 2 en pase/cesión; N en múltiple) | Trigger recalcula stock_snapshots |
| Wizard de recepción | movimientos + ordenesCarga (saldo/estado/historial) | Stock recalculado; la Orden avanza/cierra |
| Pase Interno / Cesión | 2 movimientos vinculados (PASE INTERNO / TRASPASO) | Stock recalculado en ambas puntas |
| Pase / Devolución Polvos | Transacción: movimientos + endulzantes_movimientos + pases_polvos | Stock recalculado en ambos sectores (insumos vía Cloud Function) |
| Anular | Reversa del MW (si no está bloqueado); cascada si es despacho | Trigger recalcula stock; pedidos vuelven a «En Carga» |
El stock no se escribe a mano: cada movimiento dispara el recálculo del servidor. Para corregir, se anula el movimiento (vuelve a recalcular). El egreso valida saldo antes y el servidor lo vuelve a validar: el stock nunca queda negativo. Los pares (pase/cesión) y los pases a Polvos son atómicos: o ambos lados o ninguno.
Producción
Producción (Centro de Producción) registra la actividad de la planta de azúcar. Es un hub con cuatro solapas: Parte Diario, Planificación, Insumos y Parte Semanal. El botón «Actualizar» recarga los datos. Roles 1, 2, 3, 4 y 5, con restricciones:
| Rol | Parte Diario | Parte Semanal | Planificación | Insumos |
|---|---|---|---|---|
| 1, 3, 4 (operativo / gerencia) | Crear / Editar / Eliminar / Ver / PDF | Crear / Editar / Eliminar / Ver / PDF | Acceso completo | Acceso completo |
| 2 (admin limitado) | Solo Ver y PDF (sin «Nuevo» ni Editar/Eliminar) | Crear / Ver / PDF | Completo | Completo |
| 5 (Ventas, solo lectura) | Solo Ver y PDF | Solo Ver y PDF | No ve la solapa | No ve la solapa |
Parte Diario — paso a paso
El parte diario no carga stock a mano: consolida los movimientos del día y cierra el balance de la jornada (consumo de MP vs producción de PT), generando los ajustes automáticos de merma/ganancia. Es un asistente de 5 pasos.
En el historial, solo el parte más reciente tiene los botones Editar y Eliminar activos; el resto aparece atenuado con el tooltip «Registro bloqueado (Solo se permite editar el último)». Esto protege la cadena de stocks iniciales (el stock final de un parte es el inicial del siguiente).
Crear un Parte Diario
- Botón «Nuevo Parte Diario». El sistema calcula el correlativo siguiente (
PD000001,PD000002… — el máximo conocido + 1). - Fecha: aparece el pedido «📅 Fecha del Parte Diario (YYYY-MM-DD):» con la fecha de hoy precargada. Si se cancela, no se abre el asistente; si se deja vacío, usa hoy.
- Se abre el asistente con la barra de pasos: 1. Ingresos · 2. Egresos · 3. Stock MP · 4. Stock PT · 5. Confirmar, y un panel lateral «Resumen en Vivo».
Paso 1 — Ingresos
El sistema busca en el Depósito de Producción (el que en ABM se llame «AZUCEL 1» o contenga «PRODUCCION»; si no existe avisa «Error: Depósito de Producción no configurado en ABM») los movimientos de ingreso de los últimos 7 días que todavía no estén imputados a otro parte (o que ya pertenezcan a este, si se está editando).
- Tabla Sel · Ref/Fecha · Artículo · Kilos · Ver. Los movimientos de días anteriores llevan un badge ámbar con la fecha. El ojo abre el detalle del movimiento.
- Se tildan los movimientos de producto que ingresaron. Al tildar, el sistema acumula
kgPorArticulo(la base de los pasos 3 y 4) y actualiza el «Resumen en Vivo». - Si no hay movimientos: «Sin movimientos de ingresos pendientes de imputación en Planta (últimos 7 días).».
- 3 KPI: Producción (PT), Consumo (MP) y Desvío Neto (− merma rojo / + ganancia verde).
- 3 gráficos: Nivel de Desvío (hoy) (gauge: verde ≤0,04 % · amarillo ≤0,8 % · rojo más), Tendencia de Desvío (7 días) y Producción vs. Promedio (30 días).
- Tabla «Análisis por Tipo de Azúcar» (Consumo · Prod. · Dif. kg · % Desvío) y los detalles completos de Stock MP y Stock PT.
- Botones «← Volver al Menú» y «Descargar PDF Oficial».
- Paso 1 — Fechas: «Fecha Desde» y «Fecha Hasta» del período a cerrar.
- Paso 2 — Partes Diarios: lista los partes diarios libres en ese rango (ID, Fecha, Prod. PT). Se tildan los que entran al cierre. Hay que elegir al menos uno («Debe seleccionar al menos un Parte Diario para continuar.»). Al tildar, el sistema acumula la producción total, por artículo, por tipo, los paquetes (1kg/500g) y las pérdidas por tipo.
- Pasos 3 a 6 — Insumos (Primarios · Secundarios · Generales · Mecánicos): tabla por insumo con S. Inicial (= stock final del último parte semanal anterior), Ingresos, Egresos, S. Final, Consumo, Rend. Hist. y Rend. Actual.
- Paso 7 — Resumen: KPIs (Producción total, Prod. paquetes, Balance/Desvío, desglose por tipo) y las tablas de insumos por categoría con su semáforo. Botón «Confirmar Cierre».
- Toma los pedidos en estado
AUTORIZADO,CARTERAyEN_CARGAy los separa en demanda diaria (con fecha de carga, entran al día) y demanda flexible (sin fecha, columna «Pendiente S/Fecha»). - El punto de partida real sale del Parte Diario de ayer (si falta, avisa «ATENCIÓN: No se encontró el Parte Diario de AYER. El stock inicial es una estimación.»).
- Por artículo PT hay 4 filas: Stock Inicio · Producción (+) · Despachos (−) · Saldo Final. La fila Producción es editable en los días futuros; el saldo final se recalcula en cascada y se pinta rojo si queda negativo.
- «Guardar Plan» (estado «✅ Plan guardado») escribe el doc
PLAN_<año>_W<semana>enplanificacion_produccion. «PDF» exporta el rolling forecast con el total por día y de la semana. - Buscador por nombre, filtro por tipo (Primario/Secundario/General/Mecánico) y casilla «Solo Alertas» (stock ≤ mínimo).
- Tabla Insumo · Tipo · Stock Actual · Stock Mínimo · Estado (badges SIN STOCK / STOCK BAJO / STOCK OK).
- Clic en una fila abre el análisis del insumo: rendimiento histórico ponderado (un/Tn), autonomía de producción (cuántas toneladas aguanta el stock) y un gráfico de consumo vs rendimiento por semana.
- «Excel» exporta el inventario con rendimiento, capacidad en Tn y valorización (USD).
- Si nunca se cerró un Parte Semanal: «Sin existencias registradas — Debe generar un Parte Semanal para inicializar los saldos de insumos.».
Paso 2 — Egresos
Idéntico al paso 1 pero con los movimientos de salida (consumos / devoluciones) del depósito de producción. Se tildan los que correspondan; alimentan los egresos por artículo.
Paso 3 — Stock MP (Materias Primas)
Tabla por artículo de MP con: S. Inicial, Ing (+), Egr (−), Stock Final Físico (editable) y Consumo.
El sistema lee el último Parte Diario anterior y toma su Stock Final por artículo como Stock Inicial de hoy. Por eso solo se edita el último parte: tocar uno viejo descuadraría toda la cadena.
Consumo = (Stock Inicial + Ingresos) − Egresos − Stock Final
El Stock Final viene precargado con el teórico (SI + Ing − Egr); se ajusta al conteo físico real. Si el resultado da negativo se pinta en rojo.
Paso 4 — Stock PT (Productos Terminados)
Misma tabla para los artículos PT, pero acá el cálculo es de Producción:
Producción = (Stock Final + Egresos) − Stock Inicial − Ingresos
Paso 5 — Confirmar
El sistema clasifica cada artículo por tipo de azúcar (Común tipo "A", Refinada, Orgánica, Otros) y arma el análisis por tipo (consumo MP vs producción PT). Muestra:
Se guarda el documento en partesDiarios (id, fecha, ingresos/egresos
con sus movimientos, stockMP, stockPT, analisisDetallado, totales, rendimiento).
Se vinculan los movimientos tildados (parteDiarioId) para que no
se imputen dos veces. Y se generan los ajustes automáticos: por cada tipo con
diferencia > 100 g se crea un movimiento de stock (docAzucel: AJUSTE
PD) de salida si hubo merma o ingreso si hubo sobrante, contra
el artículo «Perdida/Ganancia Azúcar …» que corresponda. Eso sí impacta el stock.
Confirmación: «⚠️ ¿Está seguro de eliminar el Parte Diario {id}? Se liberarán
remitos, se neutralizarán ajustes y se borrará el reporte.». En una transacción:
desvincula los movimientos (parteDiarioId: null), neutraliza los
ajustes (cantidad 0, ANULADO (PD)) restituyendo el stock, y borra
el parte. Mensaje: «✅ Proceso completado…».
Lista y PDF
| Acción | Qué hace |
|---|---|
| Ver Detalle Técnico | Abre el parte en solo lectura, directo al resumen (paso 5) |
| Descargar PDF Oficial | Genera el PDF «PARTE DIARIO DE PRODUCCIÓN» (KPIs, análisis por tipo, detalle MP y PT, firmas) |
| Editar | Reabre el asistente (solo el último parte) |
| Eliminar | Borra y revierte (solo el último parte) |
| Cargar registros anteriores | Paginación: 30 más, orden por fecha desc. |
Parte Semanal — paso a paso
El parte semanal consolida varios partes diarios en un cierre con correlativo
PS000001 (contador atómico) y calcula el rendimiento de cada
insumo con semáforo contra su histórico. Asistente de 7 pasos.
El paso 2 solo lista partes diarios libres (sin parteSemanalId)
o los de este mismo cierre. Así nunca se cuenta dos veces la misma producción. Al
eliminar un Parte Semanal, los diarios quedan libres de nuevo. Las semanas
PS000001 y PS000002 se excluyen siempre de los cálculos
de rendimiento histórico (son de calibración).
Los 7 pasos
Las pantallas de los 7 pasos, en orden:
Consumo insumo = (S.Inicial + Ingresos) − Egresos − S.Final
Rend. Actual = Consumo / Base de producción
• Base: insumo mecánico → kg de paquetes; general → producción total;
vinculado a un artículo → producción de ese artículo
Rend. Histórico = Σ consumos / Σ producciones de semanas previas (ponderado)
Semáforo comparando Rend. Actual vs Histórico: rojo si el desvío supera +10 % (alto consumo), amarillo si baja más de −10 % (consumo inusualmente bajo), verde en rango. Esto es lo que detecta robos/fugas o cargas mal hechas.
El cierre guarda en partesSemanales: produccionTotalKg,
produccionPackKg, perdidasTotalKg (el balance/desvío de la
semana), produccionPorTipo, perdidasPorTipo, el detalle de
insumos con su rendimiento, y rendimientoGlobal. Esos valores son los
que nutren la tendencia de eficiencia del Tablero de Inicio. Al confirmar
también se genera el PDF automáticamente y se vinculan los partes diarios.
Ver abre el cierre en solo lectura (paso 7). Editar/Eliminar solo el último (eliminar libera los partes diarios: «Los Partes Diarios contenidos quedarán libres para un nuevo cierre.»). Exportar PDF regenera el reporte cuando se necesite.
Planificación (Rolling Forecast)
Arma un plan rodante: Ayer (real, fijo) + 7 días proyectados (omite domingos). Cruza la demanda de pedidos con la producción planificada.
Insumos
Muestra el stock actual de insumos tomado del último Parte Semanal cerrado (no de movimientos). Es de solo lectura.
Flujo de datos
| Colección | Rol |
|---|---|
partesDiarios | Escribe — parte del día; lee el anterior para el stock inicial |
partesSemanales | Escribe — cierre semanal (correlativo atómico counters) |
movimientos / stock_snapshots | Lee ingresos/egresos del día; escribe los ajustes automáticos de merma/ganancia |
planificacion_produccion | Escribe — plan rodante por semana ISO |
pedidosVenta | Lee — demanda (AUTORIZADO / CARTERA / EN_CARGA) |
articulos, insumos | Lee — catálogos (tipo, presentación, artículo vinculado, stock mínimo, valor) |
El Parte Diario referencia movimientos existentes (no inventa stock), salvo los ajustes automáticos de merma/ganancia que sí mueven stock. El Parte Semanal consolida diarios y mide eficiencia por insumo. Un diario solo puede estar en un cierre; eliminar un cierre o un diario revierte limpiamente sus efectos.
Calidad & Trazabilidad
Calidad & Trazabilidad administra la biblioteca de protocolos / estándares de calidad de los productos y permite seguir la trazabilidad de un lote. Disponible para roles 1, 2 y 5.
Estándares (biblioteca de protocolos)
- Botón «Nuevo Estándar» abre el Editor de Estándar: se define el parámetro de calidad (nombre/protocolo, valores de referencia — mínimo, máximo, unidad, rango y criterio de aprobación).
- Cada estándar de la lista se puede Editar (reabre el editor con los datos) o Eliminar (pide confirmación «¿Eliminar este estándar?»).
- Al guardar, si es nuevo se agrega a
quality_standards; si es edición, se actualiza el documento. La lista en memoria se sincroniza al instante.
Trazabilidad de lote
Permite buscar un lote o producto y reconstruir su recorrido: de qué compra/producción salió, qué lo compone y a qué ventas fue. Es una vista de análisis; no genera movimientos de stock.
Flujo de datos
| Colección | Rol |
|---|---|
quality_standards | Escribe/lee — los estándares/protocolos |
quality_records | Registros de control de calidad asociados |
movimientos, compras_azucar, pedidosVenta | Lectura — para reconstruir la trazabilidad del lote |
Los estándares son la base contra la que se evalúa la calidad. Conviene mantener la biblioteca actualizada: agregar/editar un protocolo no afecta registros pasados, pero sí cómo se evalúan los nuevos controles.
Órdenes de Azúcar
Órdenes de Azúcar administra las Órdenes de Carga
(colección ordenesCarga): documentos que dan derecho a retirar /
recibir una cantidad de azúcar de un Emisor (un ingenio u origen) a
favor de un Propietario / Titular. No mueven stock por sí mismas: son el
respaldo documental de mercadería que está por entrar a planta y se va
consumiendo a medida que llega. Roles 1, 2, 3 y 5 (el rol 4 ve solo las
suyas, ver «Mis Órdenes»).
El caso más importante de este módulo. Un ingenio emite una orden a favor de un cañero (su productor) por una cantidad de azúcar — es el pago en especie de la zafra. Nosotros no compramos esa azúcar: la custodiamos y la entregamos contra esa orden. Funciona como un cheque: tiene un monto original (kg), se puede cobrar en partes (retiros / recepciones parciales) y tiene un saldo pendiente que baja con cada movimiento hasta llegar a cero. El Emisor es el ingenio que «firma» el cheque; el Propietario es el cañero a cuyo nombre está.
Conceptos base (leer antes de operar)
| Concepto | Qué es |
|---|---|
| Emisor (Ingenio / Origen) | Quién «firma» la orden: el ingenio o procedencia desde donde sale el azúcar. Sale del maestro destinos. |
| Propietario (Titular) | A nombre de quién está la orden: el cañero dueño de esa azúcar. Sale del maestro propietarios. |
| Artículo | Qué tipo de azúcar ampara la orden (del maestro articulos). |
| Cantidad Original | El «monto» total del cheque, en kg. Se fija al ingresar la orden. |
| Cantidad Pendiente | El saldo que aún no se retiró. Arranca igual al original y baja con cada recepción. |
| Historial de Cargas | Cada recepción parcial deja una entrada (fecha, remito, movimiento, kg). Es la «trazabilidad del cheque». |
| Estado | CARTERA (pendiente de gestionar) → GESTION (en logística / en tránsito) → CARGADA (saldo 0, finalizada). |
| Origen de creación | manual (orden de cañero cargada a mano) o compra (Orden de Recepción generada automáticamente desde una Compra; ver más abajo). |
Los tres estados (las tarjetas de arriba)
Las tarjetas superiores son a la vez filtro y tablero: muestran el
conteo por estado y al hacer clic filtran el listado. El listado se carga
paginado desde ordenesCarga (50 por página, botón «Cargar
más»).
| Estado | Color | Qué significa |
|---|---|---|
| En Cartera | Naranja | Orden ingresada, todavía sin gestionar con logística. Es la bandeja de entrada. |
| Logística (Gestión) | Violeta | Ya se está trabajando el viaje / el retiro. Solo desde Gestión se puede recibir mercadería (el Wizard busca órdenes en GESTION). |
| Finalizadas (Cargada) | Verde | Saldo en 0. La orden se «cobró» entera y pasa al histórico. |
Para usuarios internos los números de las tarjetas se leen de un documento
único de KPIs (dashboard_kpis/main) que mantiene un robot — 1 sola
lectura, no recorre todas las órdenes. El cliente externo (rol 4) sí consulta
solo las propias.
Ingresar una Orden (de cañero) — paso a paso
Botón «Ingresar Orden» (azul, arriba a la izquierda). Se completa:
- N° de Orden — el número del documento que emitió el ingenio (ej.
004599). Es la identificación del «cheque». - Cantidad (Kg) — el monto total amparado por la orden.
- Emisor (Ingenio / Origen) — buscador inteligente sobre
destinos: el ingenio que emite. - Propietario (Titular) — buscador sobre
propietarios: el cañero a cuyo nombre está la orden. - Artículo / Producto — qué azúcar ampara.
- Notas internas — calidad, envío, observaciones.
Al guardar, la orden nace en CARTERA con
cantidadPendiente = cantidadOriginal e historial vacío. Los tres
selectores (Emisor, Propietario, Artículo) son obligatorios y se eligen
con el buscador — no se acepta texto libre.
Si se edita la cantidad total de una orden que ya tuvo recepciones, el sistema
recalcula el saldo: nuevoPendiente = max(0, nuevaCantidad −
yaEntregado). No se pierde lo ya recibido.
Caso especial: Orden de Recepción desde una Compra
Cuando se registra una compra de azúcar, el sistema puede generar automáticamente una Orden de Recepción para que la mercadería entre con respaldo. Estas órdenes:
- Nacen directamente en GESTION (no pasan por Cartera: la mercadería ya está en tránsito por contrato).
- Quedan con
origenCreacion: 'compra'ycompraIdvinculado (back-ref encompras_azucar.ordenRecepcionId). - Arrastran el tipo contable de la compra
(
tipoAzucarCompra: Consignación / Propia / AZEF).
En el Wizard, si se seleccionan varias órdenes y algunas vienen de compra con distinto tipo contable (o se mezclan órdenes de compra con órdenes de almacenamiento de 3ros), el sistema bloquea y pide procesarlas por separado. Cancelar una Orden de Recepción obligatoria revierte la compra y la cesión de stock asociadas.
Acciones sobre las órdenes
| Acción | Qué hace | Disponible en |
|---|---|---|
| A Logística | Mueve la(s) orden(es) tildada(s) de Cartera a Gestión. Pide una instrucción de logística (ej. «Retira Transporte X») que queda guardada. | Cartera (selección múltiple) |
| Devolver | Acción inversa: la orden vuelve a Cartera y se limpia la instrucción. | Gestión |
| Ver detalle | Abre la orden con progreso, historial de cargas y notas. Clic en cualquier fila. | Todas |
| Eliminar | Borra la orden por completo. Solo si no tuvo ninguna carga. Pide tipear «ELIMINAR». | Cartera (sin cargas) |
| Cerrar saldo | Si la orden tuvo cargas parciales, no se borra: se finaliza el saldo pendiente (pasa a CARGADA con pendiente 0). Pide tipear «CERRAR». | Cartera (con cargas) |
| Exportar Excel | Baja el listado del estado actual (N° Orden, Emisor, Propietario, Artículo, Total, Pendiente, Estado). | Todas |
El ícono de acción cambia según la orden: 🗑️ eliminar (orden virgen, se borra de la base) o 🚫 cerrar (orden ya usada parcialmente, se anula el resto y queda en el histórico para trazabilidad). Una orden con cargas nunca se borra: su historial es prueba de mercadería recibida.
Detalle de la orden y su «historial de cargas»
El detalle muestra el «cheque» completo: Emisor, Propietario, Artículo, Total Solicitado, barra de progreso (% cargado) y Pendiente. La tabla Historial de Cargas lista cada recepción parcial con fecha, remito, ID de movimiento vinculado y kg. Si la orden vino de Cartera con instrucción de logística, se ve también esa nota.
Wizard de Recepción — cómo se «cobra» la orden
Es el flujo por el que la mercadería entra físicamente y se descuenta el saldo. Solo trabaja sobre órdenes en GESTION.
- Paso 1 — Titular: el sistema trae todas las órdenes en tránsito y se elige el Propietario para agrupar.
- Paso 2 — Selección: se tildan las órdenes que están ingresando y se escribe cuántos kg se reciben de cada una (no puede superar el saldo). Se puede recibir parcial.
- Paso 3 — Movimiento: el wizard arma un paquete (propietario, emisor, artículo, total, órdenes y tipo contable) y abre el formulario de Movimiento de ingreso precargado. Al confirmar el movimiento, el stock entra y baja el saldo de cada orden, agregando una entrada al historial. Si una orden llega a saldo 0, pasa a CARGADA.
Pasar a Gestión no ingresa stock. El stock entra recién cuando se confirma el movimiento de recepción que dispara el wizard. La orden solo lleva la cuenta del saldo y la trazabilidad.
Anulación: restitución del saldo
Si se anula un movimiento de recepción, el sistema devuelve el saldo
a las órdenes que ese movimiento había consumido (función
revertirSaldoOrden): suma los kg de vuelta a
cantidadPendiente (sin pasar el total), saca la entrada
correspondiente del historial y, si vuelve a quedar pendiente, la orden regresa a
GESTION. El vínculo se resuelve por recepcionOCs del
movimiento o, como respaldo, parseando las observaciones.
«Mis Órdenes» — la vista del cliente / cañero (rol 4)
El mismo dato visto desde el Portal del Cliente: el cañero ve solo las
órdenes de sus cuentas (stockRelacionado), con pestañas
Solicitadas / En Tránsito / Finalizadas y una barra de
avance de carga por orden. Es de solo lectura: sirve para que el titular siga
cuánto le queda por retirar de cada «cheque».
Escenarios típicos
| Escenario | Cómo se resuelve |
|---|---|
| El ingenio emite una orden a un cañero | «Ingresar Orden» → N°, kg, Emisor (ingenio), Propietario (cañero), artículo. Queda en Cartera. |
| Empieza a gestionarse el retiro | Tildar en Cartera → «A Logística» con la instrucción del viaje. Pasa a Gestión. |
| Llega un camión con parte de la orden | Wizard de Recepción → elegir titular → tildar la orden → cargar los kg recibidos. Baja el saldo; la orden sigue en Gestión con el resto pendiente. |
| Se completa la orden | Última recepción deja el saldo en 0 → la orden pasa sola a CARGADA / Finalizada. |
| El cañero no retira el saldo restante | Acción «Cerrar saldo» (tipear CERRAR): se anula el pendiente y la orden queda finalizada en el histórico. |
| Se cargó una orden con datos errados y sin movimientos | «Eliminar» (tipear ELIMINAR): se borra. Si ya tuvo cargas, no se borra — se cierra el saldo. |
| Se anuló por error la recepción | Al anular el movimiento, el saldo vuelve solo a la orden y esta regresa a Gestión. |
| Entra azúcar comprada | La Orden de Recepción la genera la Compra automáticamente, ya en Gestión, lista para el Wizard. |
Errores y validaciones comunes
| Síntoma | Causa / solución |
|---|---|
| «Debe seleccionar Emisor, Propietario y Artículo» | Se escribió en el buscador pero no se eligió la opción. Seleccionar del desplegable. |
| «No hay órdenes en estado GESTIÓN para recibir» | El Wizard solo ve órdenes en Gestión. Pasar antes la orden «A Logística» desde Cartera. |
| No deja recibir más kg de los que muestra | El campo «A Recibir» está topeado al saldo pendiente. Recibir parcial o revisar la cantidad. |
| «No se puede mezclar… distinto tipo contable» | Se tildaron órdenes de compra de tipos distintos (o de compra + 3ros) en la misma recepción. Procesar cada tipo por separado. |
| No aparece el ícono de eliminar | La orden ya tuvo cargas: en lugar de eliminar se ofrece «Cerrar saldo». |
| El stock no cambió al pasar a Logística | Es correcto: pasar a Gestión es administrativo. El stock entra con el movimiento del Wizard. |
Flujo de datos
| Colección | Rol |
|---|---|
ordenesCarga | Escribe/lee — alta, cambios de estado, saldo e historial de cargas |
compras_azucar | Lee/escribe back-ref — origen de las Órdenes de Recepción automáticas |
movimientos | Vínculo — el movimiento de recepción descuenta el saldo y la anulación lo restituye |
destinos, propietarios, articulos | Solo lectura — Emisor, Titular y Artículo |
dashboard_kpis/main | Solo lectura — contadores de las tarjetas (1 lectura) |
Una Orden de Carga es un derecho a recibir, no inventario. El stock físico solo cambia con el movimiento que genera el Wizard de Recepción. Borrar o cerrar mal una orden con cargas rompe la trazabilidad del «cheque» del cañero: por eso una orden usada nunca se elimina, solo se cierra.
Centro de Tráfico
El Centro de Tráfico es el radar logístico en tiempo casi real. Muestra el estado de los viajes en dos vistas: Salidas (outbound, despachos saliendo) y Cargas (inbound, recepciones entrando). Es el detalle de la tarjeta «Tráfico» del Inicio. Roles 1, 2, 3 y 5.
Vista «Salidas» (outbound)
Tablero por columnas con los despachos clasificados por estado temporal. Cada columna tiene su contador:
| Columna / KPI | Qué agrupa |
|---|---|
| Atrasados | Viajes cuya fecha ya pasó y no se cerraron (rojo) |
| Descargan Hoy | Viajes con descarga programada para hoy |
| Próximos Días | Viajes programados a futuro |
Cada tarjeta de viaje se abre para ver chofer, transporte, cliente, fechas y estado.
Vista «Cargas» (inbound)
La misma idea para las recepciones: columnas según si no llegaron (atrasadas), llegan hoy o están programadas. Permite controlar lo que está por entrar a planta.
Operación
- Se alterna entre Salidas y Cargas con las pestañas superiores.
- Botón «Actualizar Radar»: recarga los datos (también se refresca solo al entrar).
- Clic en una tarjeta → detalle del viaje.
Flujo de datos
Es 100% lectura: cruza ordenesCarga, pedidosVenta,
compras_azucar y movimientos para ubicar cada viaje en el
tiempo y clasificarlo. No se cargan datos acá; el estado de cada viaje se gestiona en
Órdenes y la liquidación en Fletes.
Fletes y Liquidaciones
Fletes y Liquidaciones (Centro de Logística) es el módulo donde se controla la documentación de cada viaje y se liquida (paga) a los transportistas. Es uno de los módulos más extensos del sistema. Roles 1, 2, 3 y 5. Este capítulo desarma cada flujo en pasos pensados para alguien que nunca usó el sistema. Se accede desde la barra lateral, área Logística → Fletes y Liquidaciones.
El hub: cuatro caminos
Al entrar se ve el hub con cuatro tarjetas y, debajo, el Historial de Liquidaciones. El botón «Volver a Logística» de cualquier pantalla siempre regresa acá.
| Tarjeta | Para qué es | Cuándo se usa |
|---|---|---|
| Conformar Remitos | Auditar que el viaje se entregó y el remito está firmado/conforme | Apenas el camión descarga |
| Flete Corto | Liquidar viajes de ingreso (entrada de materia prima / cosecha) | Para pagar fletes de entrada |
| Flete Largo | Facturar y liquidar viajes de salida (entregas a clientes) | Para facturar y pagar fletes de venta |
| Mov. de Bolsas | Liquidar a terceros la estiba / paletizado / trasbordo de bolsas | Para pagar mano de obra de bolsas |
Cada viaje es un movimiento de stock. Antes de poder pagarlo recorre
un embudo: se hace el viaje → se conforma el remito → (flete largo) se factura →
se liquida/paga. En cada etapa el viaje queda marcado con el ID de esa
operación (facturaFleteId, liquidacionFleteId…) y deja de
aparecer en las bandejas anteriores. Esto evita pagar dos veces el mismo viaje.
Flete corto salta el paso de factura: del remito conformado se liquida directo. Flete de bolsas es un circuito aparte con su propio tarifario.
A · Conformar Remitos (paso a paso)
«Conformar» un remito es dar fe de que el viaje se entregó y la documentación está correcta. Hasta que un remito no está conformado, su viaje arrastra una alerta en el resto de los procesos. La conformación es un embudo de 3 estados:
| Estado | Qué significa |
|---|---|
| EN TRÁNSITO | El viaje salió; todavía nadie confirmó la descarga |
| A REVISAR (PRE-CONFORMADO) | Descarga confirmada (típicamente por teléfono), falta auditar la documentación |
| CONFORMADO FINAL | Documentación auditada y aprobada |
Conformar un lote de remitos
- Hub → tarjeta «Conformar Remitos».
- Pestaña «PENDIENTES» (la otra es «HISTORIAL» = ya conformados). Opcionalmente filtrá por cliente (buscador inteligente) o buscá un remito exacto por N° (formato
00001-00012345, Enter o lupa). - Se tildan las casillas de la izquierda de los viajes a procesar.
- Botón verde «Confirmar». El sistema explica qué va a pasar y pide confirmación:
- Un viaje EN TRÁNSITO avanza a A REVISAR.
- Un viaje A REVISAR avanza a CONFORMADO FINAL (y se le sella la fecha de conformación).
- Si en ese lote algún viaje llegó a Conformado Final, se abre automáticamente el modal «Ingreso de Vales de Pallets» (ver abajo). Si no, termina con un aviso de éxito.
El modal de Vales de Pallets
Aparece solo después de conformar definitivamente. Lista los viajes recién conformados; se tilda únicamente el viaje que repuso pallets con vale y se cargan N° de Vale y Cantidad de Pallets. Al «Registrar Vales»:
- Se crea un vale en estado CARTERA (queda disponible como crédito de pallets para futuras liquidaciones).
- Se actualiza la cuenta corriente de pallets: + pallets a la cuenta del transporte y − pallets a la cuenta interna «NO APLICA» (Moyco), todo en una transacción atómica.
- Si ningún viaje repuso pallets, se usa «Omitir» y listo.
En la pestaña «HISTORIAL» el botón pasa a ser «Revertir»: devuelve los viajes seleccionados al inicio del embudo (EN TRÁNSITO) por si algo se conformó por error. Si buscás un remito por N° que ya está conformado mientras estás en «Pendientes», el sistema te avisa («auditoría») y te ofrece saltar al historial para verlo: así nunca se duplica una conformación.
B · Flete Corto — Ingreso (paso a paso)
Liquida los viajes de ingreso (entrada de materia prima / cosecha). No requiere conformidad de remito y no pasa por «factura»: del listado de viajes se va directo a la liquidación.
- Hub → tarjeta «Flete Corto».
- Paso 1 — Transportista: buscador inteligente; se elige la empresa a liquidar y «Iniciar Proceso». Si no se elige, avisa y no avanza.
- Paso 2 — Selección de viajes: tabla de viajes de ingreso de ese transporte (ID, Fecha, Origen, Remito, Kilos, Tarifa, Subtotal). Los ya liquidados no aparecen. Se tildan los viajes; arriba se ve el «Total Seleccionado» recalculándose en vivo.
- Si un viaje tiene tarifa en 0, la casilla queda deshabilitada con el badge rojo Sin Precio. Hay que corregir la tarifa antes (ver «Modificar tarifa de un viaje»).
- El subtotal de cada viaje =
(kilos / 1000) × tarifa por tonelada.
- «Vista Previa» (opcional): genera un PDF de pre-liquidación para conciliar con el transportista antes de cerrar. Aclara que todos los valores son SIN IVA y es un documento informativo sujeto a verificación.
- «Finalizar y Liquidar» → pantalla de Resumen: lista los viajes, el Total a Pagar, un campo de Observaciones y el N° de Factura del Transporte. La factura es obligatoria con formato
00000-00000000(4-5 dígitos − 8 dígitos), salvo que se tilde «Cargar Factura Luego». - «Finalizar y Guardar». Se crea la liquidación con ID secuencial tipo
LF000123y cada viaje queda marcado con ese ID (liquidacionFleteId), por lo que desaparece de la bandeja y no se puede volver a liquidar.
Viaje de 28.000 kg con tarifa $42.000/tn → subtotal = 28.000/1000 × 42.000 =
$1.176.000 (sin IVA). Se tildan 5 viajes del cañero, total $5,9 M, se carga
la factura 00003-00004521 y se finaliza: queda
LF000124 en el historial.
C · Flete Largo — Salida
Para los viajes de salida (entregas a clientes). Tiene un hub propio con dos procesos — primero se Factura, después se Liquida/Paga — y, debajo, un bloque con pestañas «Sin Facturar» y «Facturados» para visualizar el estado de los viajes (con filtro por transportista y exportación a Excel/CSV).
C.1 · Facturación de Fletes (paso a paso)
Imputar uno o varios remitos conformados a una factura del proveedor de transporte.
- Hub Flete Largo → «Facturación de Fletes».
- Transporte (buscador) → «Buscar Remitos Sin Facturar».
- Paso 2 — Remitos: se listan los viajes de salida sin facturar desde el 01/03/2026. Se tildan los remitos a meter en una misma factura. El badge informa Conformado / Sin conformar / Sin tarifa. Solo bloquea la selección la falta de tarifa; un remito sin conformar igual se puede facturar (la conformación acá es informativa). «Total Seleccionado (Neto)» en vivo. Confirmar selección.
- Paso 3 — Control de la factura: por cada viaje hay dos botones: «Correcto» (verde, por defecto) o «Dif. de Precio» (ámbar). Si la tarifa del sistema no coincide con lo que el transporte facturó, se marca «Dif. de Precio» y se carga el excedente sin IVA; el sistema lo acumula como Nota de Crédito a solicitar y muestra la advertencia de que la factura quedará en «NO PAGAR» hasta regularizar.
- Cargos adicionales (opcional): «Agregar cargo adicional» con tipo Costo de Descarga · Pago de abasto por el Transporte · Tasa Municipal · Otros (con descripción) e importe sin IVA. Se suman al neto.
- N° Factura del Proveedor obligatorio, formato
00000-00000000. El sistema calcula IVA 21% fijo sobre el neto. - Guardar: se crea la factura con ID secuencial tipo
FF000045en estado «Pendiente de Pago» (o «NC Pendiente / NO PAGAR» si hubo diferencias). Cada remito queda marcado con esa factura y sale del listado «Sin Facturar».
C.2 · Pestaña «Facturados»: editar o anular una factura
- Consultar factura: detalle económico, remitos imputados, diferencias y auditoría.
- Editar header: cambia solo N° factura, fecha e importes (Total = Neto + IVA, verificado con tolerancia). Pide doble confirmación. No cambia los remitos imputados: para eso hay que anular y rehacer. Bloqueado si la factura ya fue pagada.
- Anular factura: soft-delete con motivo obligatorio y doble confirmación. La factura queda ANULADA y libera los remitos (vuelven a estar disponibles para facturar). No se puede anular una factura ya pagada (primero hay que anular la liquidación).
Si una factura tiene diferencias de precio, queda en estado NC Pendiente y no se puede pagar. Para habilitarla hay que regularizarla desde el listado de facturas pendientes con una de dos opciones: «NC Recibida» (se carga el N° de la nota de crédito que mandó el proveedor) o «Dif. Autorizada» (se autoriza pagar la diferencia igual). En ambos casos pasa a «Pendiente de Pago».
C.3 · Liquidación / Pago (paso a paso)
Pagar una o varias facturas pendientes, con control de pallets.
- Hub Flete Largo → «Liquidación / Pago».
- Transporte (buscador) → «Ver Facturas Pendientes».
- Paso 2 — Facturas: se listan las facturas en estado pagable de ese transporte. Badges:
- OK: lista para pagar.
- NO PAGAR: tiene NC pendiente — hay que regularizar primero.
- BLOQUEADA (N sin conf.): tiene remitos sin conformar — se puede desbloquear (pago excepcional) con doble confirmación y motivo obligatorio.
- Control de Pallets (ver «El balance de pallets»).
- Resumen: total, observaciones y N° de Orden de Pago (formato libre, ej.
OP-2026-123) o tilde «Cargar OP Luego». «Finalizar y Guardar»: se crea la liquidaciónLF…, las facturas pasan a PAGADA y quedan atadas a esa liquidación.
La FACTURA (FF…) es lo que el transporte te factura por
sus viajes. La LIQUIDACIÓN (LF…) es lo que vos
le liquidás/pagás de esas facturas (con su control de pallets y su orden de
pago). No es lo mismo el monto facturado que el liquidado: la NC y los créditos de
pallets pueden hacer que difieran.
El balance de pallets (paso de «Control de Pallets»)
Antes de cerrar una liquidación de Flete Largo se concilia la cuenta corriente de pallets con el transporte:
- Debe (rojo): pallets que salieron de planta en esos viajes (lo que el transporte se llevó).
- Haber (verde): créditos disponibles para compensar — los Vales en cartera (tienen prioridad) y los recuperos físicos (ingresos de pallets), ordenados del más viejo al más nuevo (FIFO). Se tildan los créditos a usar.
- Balance final: el sistema calcula el saldo y muestra el escenario:
| Escenario | Significado | Qué se pide |
|---|---|---|
| A — Exacto (verde) | Crédito = Deuda | Nada, balanceado |
| B — Deuda (rojo) | El transporte queda debiendo pallets | Confirmar y, opcional, N° de Factura de Pallets (o marcarla pendiente) |
| C — Sobrante (azul) | Quedó saldo a favor | Se genera un vale de vuelto (VR-…) que queda en cartera para el futuro |
Al finalizar, los vales usados pasan a LIQUIDADO, los recuperos físicos quedan atados a la liquidación y se ajustan los snapshots de pallets. En Flete Corto este paso se saltea (va directo del listado al resumen).
D · Movimiento de Bolsas a 3ros (paso a paso)
Liquidación a terceros por el trabajo físico sobre bolsas: estiba, paletizado, trasbordo. Tiene su propio tarifario histórico y tres pestañas.
D.1 · Cuadro Tarifario (línea de tiempo de precios)
Los conceptos base son «3ro - Pallet», «3ro - Estiba» y «3ro - Trasbordo». Cada concepto tiene una línea de tiempo de precios (modelo histórico): se «Administra» el concepto y se agregan variaciones de tarifa con fecha de vigencia; el sistema recalcula automáticamente hasta cuándo rigió cada precio. Así, una liquidación de marzo aplica el precio que regía en marzo, aunque hoy el precio sea otro.
D.2 · Nueva Liquidación
- Pestaña «Nueva Liquidación». Elegí Desde / Hasta (máximo 30 días de rango) y «Buscar Movimientos».
- Se listan los movimientos con su concepto de gasto, bolsas (50 kg) y la tarifa histórica que aplicó automáticamente según la fecha del movimiento. La columna «Tarifa» se puede editar manualmente; los conceptos «Otros» exigen cargar una tarifa > 0.
- Se tildan los movimientos (o «seleccionar todo»). Abajo se ven Seleccionados, Total Bolsas y Total a Liquidar en vivo.
- «Confirmar» → resumen con el total. Se ingresa el N° de Factura o se tilda «Pendiente».
- Confirmar liquidación: se genera el ID tipo
LIQB-000005en estado CERRADA y cada movimiento queda atado (liquidacionBolsaId) con su tarifa y subtotal congelados; ya no se puede volver a liquidar.
D.3 · Historial y Facturas
- Imprimir la liquidación.
- Cargar Factura: para las que quedaron «Pendiente Factura», se carga el N° después.
- Anular: confirma, marca la liquidación como ANULADA (queda visible para trazabilidad) y libera todos los movimientos asociados (vuelven a estar disponibles para liquidar; se les borra la tarifa y el subtotal aplicados).
Modificar la tarifa de un viaje («Sin Precio»)
En Flete Corto y Largo, un viaje sin tarifa no se puede seleccionar (badge Sin Precio / Sin tarifa). El botón «Modificar Tarifa» de la fila abre un cuadro con la tarifa actual (solo lectura) y un campo «Nueva Tarifa ($ / tonelada)» que muestra un subtotal estimado en vivo. Al guardar, la nueva tarifa queda escrita en ese movimiento (con quién y cuándo la editó) y el viaje ya se puede liquidar. Es un ajuste manual sobre el viaje puntual; no toca el Tarifario general.
Historial de Liquidaciones
En el hub, debajo de las tarjetas, está el historial de todas las liquidaciones (Corto y Largo), con filtro por transportista (buscador inteligente). Cada fila muestra ID, fecha, tipo (Corto / Largo), transportista, monto y estado del documento.
- Ver Detalle: viajes incluidos, kilos/bolsas, subtotales y observaciones (solo consulta).
- Imprimir PDF de la liquidación.
- Cargar OP / Cargar Factura: si quedó pendiente el documento, se completa desde acá (la fila lo muestra como «Pendiente» hasta cargarlo).
- Eliminar / Anular: revierte la liquidación.
Al eliminar una liquidación, los viajes asociados se liberan
(liquidacionFleteId vuelve a vacío) y reaparecen como pendientes de
liquidar; los vales/créditos de pallets usados vuelven a cartera. Sin
embargo, NO revierte automáticamente: el ajuste ya hecho en la cuenta de
pallets (snapshots), el vale de vuelto VR-… generado por
sobrante, ni el estado PAGADA de las facturas
FF… del flete largo. Si necesitás rehacer todo, revisá manualmente
esas piezas.
Un viaje (movimiento) atado a una liquidación queda bloqueado para edición
en el módulo Movimientos de Stock. Para corregir un viaje ya liquidado, primero
se anula la liquidación acá; recién entonces el movimiento se desbloquea. Lo
mismo aplica a bolsas: anular la LIQB-… libera sus movimientos.
Flujo de datos (resumen por acción)
| Acción | Escribe / marca | Efecto |
|---|---|---|
| Conformar remito | movimientos.remitoConformado | Avanza el embudo; al finalizar puede crear vales y ajustar pallet_snapshots |
| Liquidar Flete Corto | liquidacionesFletes (LF), movimientos.liquidacionFleteId | El viaje sale de la bandeja y queda pagado |
| Facturar Flete Largo | facturasFletes (FF), movimientos.facturaFleteId | El remito pasa de «sin facturar» a «facturado» |
| Liquidar Flete Largo | liquidacionesFletes (LF), facturasFletes → pagada, pallet_snapshots, vales | La factura queda pagada con su control de pallets |
| Liquidar Bolsas | liquidacionesBolsas (LIQB-), movimientos.liquidacionBolsaId | Movimientos atados con tarifa/subtotal congelados |
| Anular liquidación | Libera movimientos y vales; borra/anula la liquidación | Los viajes vuelven a estar disponibles (ver caja de advertencia) |
Fletes no inventa kilos ni tarifas: lee la tarifa que ya tiene grabada cada
movimiento (o la que se corrige a mano). Nunca se paga dos veces un
viaje porque cada etapa lo marca con su ID y lo saca de la bandeja anterior.
Tarifario de Fletes
El Tarifario de Fletes es la base de precios de transporte de todo el sistema. Cada tarifa es un precio $/Tn para una combinación de transportista + destino + tipo de operación (VENTA/salida o COMPRA/ingreso). De acá salen los fletes que se autocompletan en pedidos, órdenes de carga y movimientos de stock. Tiene cuatro solapas: Consulta, Análisis Tarifario, Mapa y Cotización. Roles 1, 2, 3 y 5.
Conceptos base (imprescindible)
| Concepto | Qué es |
|---|---|
| Tarifa | Documento en tarifas: transporteId + localidadId (o zonaId) + provinciaId + tipo + valor ($/Tn). |
| Tipo: VENTA (salida) | Flete para llevar mercadería al cliente. Es el que se usa al despachar / facturar. |
| Tipo: COMPRA (ingreso) | Flete para traer mercadería a planta (azúcar comprada / recibida). |
| Alcance: Localidad | Tarifa puntual de una ciudad exacta. Es la de máxima prioridad. |
| Alcance: Zona | Tarifa plana para toda una zona tarifaria (anillo de distancia). Cubre cualquier localidad de esa zona si no hay tarifa puntual. |
| Vigencia por modificación | Hace cuánto se creó o editó el valor (updatedAt). |
| Vigencia por uso | Hace cuánto se aplicó por última vez a un cargamento real (lastUsedAt). |
| Edad efectiva | La más reciente entre las dos: una tarifa editada hace 45 días pero usada ayer sigue vigente. |
| $/Tn·Km | Tarifa dividida por los km al destino. Normaliza el precio para comparar destinos lejanos vs. cercanos. |
La tarifa operativa (tarifas, solapas Consulta/Análisis/Mapa)
paga al transportista y la usan Fletes, Ventas y Movimientos. La tarifa de
Cotización (tarifas_cotizacion, solapa Cotización) calcula el
precio comercial al cliente y la usa el Cotizador. Son colecciones
separadas a propósito: tocar una no afecta la otra.
Cómo se calcula la vigencia (el badge de colores)
Toda la app usa la misma regla de vigencia. Sobre la edad efectiva (mínimo entre modificación y uso):
| Estado | Edad efectiva | Significado |
|---|---|---|
| VIGENTE (verde) | ≤ 30 días | Precio confiable, se puede usar tal cual. |
| PRONTO A VENCER (amarillo) | 31–60 días | Sigue sirviendo pero conviene confirmarla. |
| VENCIDA (rojo) | > 60 días | Sospechosa: renegociar / actualizar antes de comprometerla. |
| SIN DATOS (gris) | — | Sin fecha de modificación ni de uso. |
Una tarifa puede no haberse editado en meses pero seguir aplicándose todas las
semanas: si el precio no cambió, no hay por qué tocarla. Por eso cada vez
que se usa en un despacho real se le sella lastUsedAt y vuelve a
contar como vigente. La vigencia mide «¿este precio sigue siendo el de hoy?», no
«¿hace cuánto lo escribí?».
Solapa «Consulta» — buscar y mantener tarifas
Es una búsqueda on-demand (no carga todo de entrada, para no gastar lecturas): hay que filtrar por al menos un criterio — Transporte, Provincia o Localidad (la localidad se cascada por provincia) — más opcionalmente el Tipo (VENTA/COMPRA). Resultados paginados de a 20, ordenados por valor.
La «cascada de tarifa efectiva»
Si la búsqueda exacta no encuentra nada, el sistema no devuelve vacío: cae por una cascada y marca el origen con un badge para que se sepa qué tan confiable es el número:
- EXACTA — tarifa puntual de esa localidad + transporte. Sin badge: es la buena.
- Otros transportistas — misma localidad, otra empresa (badge REFERENCIA).
- ZONAL — tarifa cargada sobre la zona de esa localidad para ese transporte.
- REFERENCIA de zona — tarifas de localidades hermanas de la misma zona.
- ESTIMADA — no hay nada cargado: se calcula con el modelo km·$/Tn (ver Análisis). Solo para tipo salida.
Solo la tarifa EXACTA se edita/elimina desde la tabla. Las filas ZONAL / REFERENCIA / ESTIMADA son orientativas (fondo de color, sin botones de edición): sirven para no quedarse sin un número, pero conviene cargar la tarifa real de esa localidad antes de cerrar la operación.
Alta / edición de una tarifa
Botón flotante + (abajo a la derecha, solo en Consulta) o el lápiz de una fila EXACTA. Se elige Transporte, Provincia → Localidad (cascada), Tipo de servicio (VENTA/COMPRA) y Valor $/Tn.
Si ya existe una tarifa para la misma combinación (transporte+localidad+tipo), el sistema lo avisa y ofrece actualizar la existente en vez de crear una repetida — así no se ensucia la base con duplicados que descuadran el Análisis.
Solapa «Análisis Tarifario» — inteligencia y control
Es el panel de control de salud del tarifario. Cruza cada localidad con su distancia al origen logístico (Depósito Arcadia, Tucumán), su zona, su última tarifa y su vigencia. Sirve para encontrar huecos (sin tarifa, sin zona, sin km), precios viejos y valores fuera de norma.
- Enriquecer (lat/lng/km) — geocodifica las localidades faltantes (OpenStreetMap, 1 req/seg) y calcula los km desde Arcadia. Es el insumo de todo lo demás: sin km no hay análisis ni estimación.
- Auto-asignar Zonas — sugiere y aplica una zona tarifaria según la distancia, usando bandas estándar: Z1 Local (≤50 km), Z2 NOA (≤300), Z3 Centro (≤800), Z4 AMBA (≤1300), Z5 Patagonia (resto).
- Tabla por localidad — km, zona actual, zona sugerida (botón para aplicarla), última $/Tn, edad, $/Tn·Km y estado de vigencia. Filtros rápidos: sin zona, sin km, sin tarifa, pronto a vencer, vencidas, outliers.
- Dispersión $/Tn vs Km — gráfico con una recta de regresión
y = a + b·kmajustada sobre todas las tarifas vivas. Los puntos a más de 2σ de la recta se marcan outliers (naranja): son tarifas anómalas para su distancia — demasiado caras o demasiado baratas. Se puede hacer zoom arrastrando un rectángulo.
Un punto naranja muy por encima de la recta = pagamos más de lo que la distancia justifica (renegociar). Muy por debajo = tarifa sospechosamente baja o desactualizada (confirmar antes de comprometerla). El $/Tn·Km de la tabla dice lo mismo en número: comparable entre destinos.
Solapa «Mapa» — cobertura geográfica
Mapa interactivo (Leaflet/OpenStreetMap) centrado en Arcadia. Cada localidad con coordenadas es un pin de color por vigencia (verde / amarillo / rojo / gris sin tarifa); los outliers se ven más grandes. Líneas opcionales hacia Arcadia y filtros por estado (vigentes, pronto a vencer, vencidas, sin tarifa, sin zona). Al tocar un pin se ve la localidad, su última tarifa, edad, zona y km. Es la forma rápida de ver dónde tenemos huecos de tarifa en el país.
No tiene lat/lng. Hay que correr «Enriquecer» en la solapa Análisis. Sin coordenadas tampoco entra en la estimación por cercanía.
Solapa «Cotización» — tarifa comercial
Tarifas comerciales de flete largo, separadas de la operativa
(tarifas_cotizacion). Cada documento agrupa una o varias
localidades con un precio por tonelada plano. Las usa el Cotizador como
costo de distribución al cliente.
- Carga por localidad (flujo natural): el modal arranca pidiendo una sola localidad + precio; el nombre es opcional (se autocompleta). «Agrupar más localidades» despliega el multi-selector para cubrir varias con un precio plano único.
- Referencia de precios: al elegir una localidad puntual se muestran las últimas 3 tarifas operativas reales de esa localidad, con un botón para usar el promedio como precio sugerido.
- Bootstrap AMBA: las localidades de AMBA (≤80 km de CABA) se precargan automáticamente con un solo botón.
- La actualización es 100% manual: ningún despacho la mueve (a diferencia de la operativa).
El Cotizador usa la tarifa comercial (esta solapa) como primera opción y, si la localidad no está cubierta, cae a la estimación «Smart» del estimador inteligente. Ver el capítulo Cotizaciones.
El uso de la Tarifa en el proceso (con ejemplos)
Una tarifa cargada acá no se queda quieta: el sistema la busca y autocompleta sola en cada etapa donde hay un flete. Estos son los tres puntos donde aparece, en orden del circuito comercial.
1) En un Pedido de venta
Al cargar el pedido todavía no se sabe el transporte ni la tarifa: el
pedido nace con valorTarifa: 0 y
tarifaPendiente: true. El Tarifario no interviene en esta
etapa — es esperado que el flete esté en cero en el pedido recién creado. La
tarifa se resolverá cuando ese pedido se convierta en Orden de Carga.
Se carga un pedido de 28.000 kg a un cliente de Rosario. No se elige camión todavía: el pedido queda «tarifa pendiente». Correcto.
2) En la Orden de Carga (asignación de logística)
Cuando el pedido pasa a Pendientes y se le asigna transporte, el
sistema busca automáticamente la tarifa de
VENTA para transporte + provincia + localidad del cliente:
- Si existe: autocompleta el valor y muestra un badge de vigencia (✔ Vigente / ⚠ Nd sin actualizar / 🔴 revisar).
- Si no existe: avisa «⚠ Sin Tarifa» y ofrece un panel con las tarifas de otros transportistas de esa misma localidad como referencia (clic para usar ese valor).
- Al guardar la logística, según el checkbox «Actualizar Tarifario
Maestro»:
- Tildado → guarda el valor + updatedAt (el usuario corrigió el precio); si no existía, la crea.
- Sin tildar → solo sella
lastUsedAt = ahora: no cambia el precio, pero la tarifa vuelve a contar como vigente por uso.
Pedido de Rosario, se asigna «Transporte Sur». El sistema trae $48.000/Tn · ✔ Vigente (12d). Se confirma sin tocar el precio → la tarifa queda sellada por uso hoy aunque se haya editado hace 12 días. Si «Transporte Sur» no tuviera tarifa en Rosario, aparecerían las de «Transporte Norte» / «Don Pedro» como referencia para no quedarse sin número.
3) En un Movimiento de Stock
En el formulario de un movimiento (despacho o recepción), al completar transporte + provincia + localidad el campo Tarifa $/Tn se llena solo según el tipo de servicio del movimiento (salida = VENTA, ingreso = COMPRA), con un fallback de 2 niveles:
- Nivel 1 — Localidad exacta: «✔ Vigente (Loc)».
- Nivel 2 — Zona: si la localidad tiene zona y hay tarifa zonal para ese transporte → «🔗 Zona X».
- Nivel 3 — Sin tarifa: «⚠ Sin tarifa», el valor queda en 0.
El campo arranca bloqueado (candado) para no pisar el valor del tarifario por error. El botón candado activa modo manual (vale solo para ese viaje); si se cambia el número, aparece el botón guardar 💾 para impactar el cambio en el Tarifario Maestro (actualiza la tarifa existente o crea una nueva para esa combinación). Si el movimiento está atado a una liquidación de flete, el campo queda bloqueado para no descuadrarla.
Recepción de azúcar desde un ingenio de Famaillá con «Transporte Tucumán». El movimiento es ingreso → el sistema busca tarifa de COMPRA. No hay puntual pero Famaillá está en zona Z1 Local y existe tarifa zonal → autocompleta «🔗 Zona Z1 Local». Si el chofer cobró distinto, se abre el candado, se corrige y se 💾 para dejarlo en el maestro.
El estimador inteligente (cuando no hay tarifa)
Para tipo VENTA, cuando no hay tarifa cargada el sistema puede estimar un valor con una cascada de 7 prioridades (PPP ponderado por recencia — lo reciente pesa más):
| Prioridad | Base de la estimación | Confianza |
|---|---|---|
| 1 | Misma localidad, ≤30 días | Alta |
| 2 | Localidad vecina ≤25 km, ≤30 días | Alta |
| 3 | Localidad vecina 25–50 km, ≤30 días | Media |
| 4 | Misma zona tarifaria, ≤30 días | Media-baja |
| 5 | Mismo corredor de km (±15%), ≤30 días | Media-baja |
| 6 | Ventana ampliada a 60 días (loc/vecinas) | Baja |
| 7 | Sin datos suficientes → cargar manual | Nula |
El número estimado evita quedarse sin precio para seguir operando, pero es orientativo. La buena práctica es cargar la tarifa real en cuanto se confirme con el transportista; ahí deja de ser estimación y empieza a contar su vigencia.
Escenarios típicos
| Escenario | Cómo se hace |
|---|---|
| Cargar la tarifa de un nuevo destino | Consulta → botón + → transporte, provincia, localidad, VENTA, valor. |
| El transportista subió el precio | Buscar la tarifa EXACTA → lápiz → nuevo valor. O corregirla al despachar y tildar «Actualizar Maestro». |
| Cliente en una localidad sin tarifa | Se usa la referencia de otro transportista / la ZONAL / la ESTIMADA, y se carga la real apenas se confirme. |
| Cubrir muchas localidades de una zona con un precio | Cargar una tarifa de alcance Zona (cae como fallback de todas las localidades de esa zona). |
| Auditar tarifas viejas o caras | Análisis → filtro «vencidas» / «outliers» + gráfico de dispersión y $/Tn·Km. |
| Ver dónde faltan tarifas en el país | Mapa → filtro «sin tarifa» (pines grises). |
| Una tarifa figura vencida pero el precio sigue igual | Usarla en un despacho sin tildar «Actualizar Maestro»: se sella lastUsedAt y vuelve a vigente por uso. |
| Precio comercial al cliente para cotizar | Solapa Cotización (tarifa comercial, separada de la operativa). |
Errores y validaciones comunes
| Síntoma | Causa / solución |
|---|---|
| «Búsqueda Protegida: seleccione al menos un criterio» | Consulta es on-demand. Filtrar por transporte, provincia o localidad antes de buscar. |
| Sale una tarifa con badge ZONAL / REFERENCIA / ESTIMADA | No hay tarifa EXACTA: es un valor de respaldo. Cargar la real de esa localidad. |
| Flete en 0 al despachar | No hay tarifa para ese transporte+localidad+tipo. Cargarla o usar una referencia. |
| «Ya existe una tarifa para esta combinación» | Duplicado: el sistema ofrece actualizar la existente. Aceptar para no duplicar. |
| Una localidad no aparece en Mapa / Análisis | Falta lat/lng. Correr «Enriquecer» en Análisis. |
| Todas las tarifas figuran vencidas de golpe | Se está leyendo del caché de localStorage (pierde los Timestamps). El módulo lee de Firestore / caché en RAM para evitarlo — recargar si persiste. |
| El campo tarifa no se deja editar en el movimiento | Está bloqueado a propósito (candado) o atado a una liquidación de flete. Abrir el candado para modo manual; si hay liquidación, no se toca. |
Flujo de datos
| Colección | Rol |
|---|---|
tarifas | Escribe/lee — tarifas operativas (Consulta, Análisis, Mapa). Recibe lastUsedAt al usarse en ventas/movimientos |
tarifas_cotizacion | Escribe/lee — tarifas comerciales (solapa Cotización) |
localidades | Escribe (lat/lng/km, zona) en Análisis · lee en todas |
zonas, provincias, transportes | Solo lectura — catálogos geográficos y de transporte |
pedidosVenta, movimientos | Consumidores — autocompletan el flete desde tarifas y sellan su uso |
Un tarifario actualizado y usado hace que pedidos, órdenes y movimientos salgan con el flete correcto solos. Cargá la tarifa real apenas la confirmes, dejá que el uso la mantenga vigente, y revisá Análisis/Mapa cada tanto para tapar huecos y outliers.
ABM Maestros
ABM Maestros es el alta, baja y modificación de los catálogos base del sistema. Todo lo que se carga acá alimenta los buscadores inteligentes (smart selectors) y los desplegables del resto de los módulos: un cliente que no existe en ABM no se puede elegir en un pedido; un transporte que no está cargado no aparece en una orden de carga. Es, literalmente, la base de datos sobre la que se apoya todo lo demás. Roles 1, 2, 3 y 5. Se accede desde la barra lateral, área Administración → ABM Maestros.
El panel principal y cómo se navega
Al entrar se ve un tablero con 7 tarjetas, una por catálogo. Se hace clic en una tarjeta para entrar a su pantalla propia; cada pantalla tiene su botón «Volver» que regresa al tablero. Arriba a la derecha, el botón «Recargar» recarga la página completa (útil si otra persona cargó datos y no los ves).
| Tarjeta | Qué administra | Colección |
|---|---|---|
| Propietarios | Dueños del stock: clientes con stock propio, cañeros y comitentes | propietarios |
| Depósitos | Ubicaciones físicas donde se guarda mercadería | depositos |
| Artículos | Catálogo de productos de azúcar | articulos |
| Destinos | Clientes y sus sucursales de entrega | destinos (+ vendedores) |
| Geografía | Provincias, Zonas tarifarias y Localidades | provincias, zonas, localidades |
| Logística | Empresas de transporte y choferes con sus patentes | transportes, choferes |
| Insumos | Materiales y envases de producción de azúcar | insumos |
1. Guardado optimista: al guardar, el sistema escribe en la base y a la vez en la memoria del navegador, así el registro aparece al instante en la tabla y en los buscadores, sin esperar ni recargar. 2. Registros «Sistema» (protegidos): algunos registros traen un candado 🔒 y la etiqueta Sistema. Son registros que el sistema necesita para funcionar (ej. el transporte interno «NO APLICA»): no se pueden editar ni eliminar. 3. Búsqueda local: el buscador de cada catálogo filtra sobre lo que ya está en memoria; es instantáneo y no consume lecturas.
Estos tres campos no son decorativos: son llaves de cruce automático. El EAN del artículo y el GLN de la sucursal son lo que usa Ventas → Importar OC para reconocer solo qué producto y a qué sucursal va cada renglón de un Excel de cliente. El CUIT del propietario es lo que usa el cruce Flexxus para vincular el comprobante correcto. Si faltan, la OC entra como «Incompleta» y hay que asignar todo a mano.
1 · Propietarios
Un propietario es un dueño de stock: incluye clientes con mercadería propia en planta, cañeros (productores que entregan caña/azúcar) y comitentes (consignación). Es distinto de «Destinos/Clientes» (ver más abajo): acá se modela de quién es la mercadería, no a dónde se entrega.
Alta / edición paso a paso
- Botón «Nuevo» (o clic en el lápiz de una fila para editar). Se abre el formulario.
- Nombre / Razón Social obligatorio: se guarda siempre en MAYÚSCULAS automáticamente. Ej.:
INGENIO SAN JUAN S.A. - CUIT: formato sugerido
30-12345678-9. Es la llave del cruce Flexxus, conviene cargarlo bien. - Correo Electrónico: opcional.
- Domicilio Fiscal (tarjeta azul): Calle/Ruta, Nro, Provincia (buscador inteligente) y Localidad (buscador inteligente que se habilita recién al elegir provincia y queda filtrado por ella), y C.P.
- «Guardar». El registro aparece ordenado alfabéticamente en la tabla al instante.
Carga del cañero «Finca La Esperanza»: Nombre FINCA LA ESPERANZA SRL,
CUIT 30-71122334-5, Provincia Tucumán, Localidad
Famaillá. Desde ese momento, al comprar caña/azúcar en Compras
el buscador de propietario ya lo encuentra escribiendo «esper».
2 · Depósitos
Ubicaciones físicas donde se almacena mercadería (planta, depósito externo, cámara). Es el catálogo más simple: solo el Nombre (obligatorio, en mayúsculas). Mismo esquema de tabla con buscador, «Nuevo», editar (lápiz) y eliminar (tacho), con confirmación. Alimenta el desplegable de depósito en Movimientos y Stock.
3 · Artículos
El catálogo de productos de azúcar. Es el más rico en campos porque de acá salen el EAN para importar OC, los códigos para cruzar con Flexxus y la presentación para convertir bultos ↔ kilos.
La pantalla tiene buscador (por nombre, tipo o categoría) y tres filtros: Tipo, Presentación y Categoría, más un botón para limpiarlos. Cada fila muestra miniatura, nombre, EAN, tipo, presentación y categoría. Un clic en cualquier parte de la fila (fuera de los botones) abre el detalle de solo lectura; desde ahí hay un botón «Editar».
Formulario de artículo paso a paso
- Imagen del producto (opcional): JPG/PNG/WebP, hasta 5 MB. Se redimensiona a 400 px y se comprime al subir. Botón «Cargar imagen» / «Reemplazar» y «Quitar imagen».
- Nombre obligatorio. Ej.:
Azúcar Ledesma Refinada 1kg. - EAN13 (unidad): exactamente 13 dígitos numéricos. DUM14 (caja): exactamente 14 dígitos. Si se carga algo y no cumple el largo exacto, el sistema rechaza el guardado con aviso.
- Códigos Flexxus (tarjeta ámbar): uno o varios. Se escribe el código y se hace «+ Añadir» (o Enter); aparece como chip que se puede quitar con la ×. Solo letras, números,
_y-, hasta 15 caracteres, se guardan en mayúsculas. Sirven para vincular las ventas que llegan desde Flexxus. - Kg por unidad Flexxus: por defecto
1. Solo se cambia si Flexxus factura por una unidad sub-kilo (ej. presentación 500g → 0.5; 1kg o bolsas → 1). - Tipo de Azúcar: Común tipo "A" · Refinada · Orgánica.
- Presentación: bolsa 25 kg · bolsa 50kg · big bag · 1kg · 500g · N/A.
- Categoría: MP (Materia Prima) o PT (Producto Terminado).
- Artículo genérico (comodity) (casilla ámbar): marcar solo para el caso de la bolsa 50 kg sin marca. Un genérico se usa en el pedido cuando todavía no se sabe la marca; no tiene stock propio, queda excluido de los reportes de stock y la marca real se elige obligatoriamente al armar la Orden de Carga (ver el módulo Pedidos & Ventas).
- «Guardar». Si subiste imagen, primero crea el artículo y después sube/reemplaza la foto.
La presentación es la que define el factor de conversión bultos → kilos en pedidos y órdenes de carga (una «bolsa 50kg» = 50 kg por bulto). Cargarla mal descuadra los kilos de toda la operación.
4 · Destinos (Clientes)
Acá se administran los clientes a los que se les vende y entrega: razón social, CUIT, equipo comercial asignado y, lo más importante, sus sucursales de entrega. Es el catálogo que alimenta el buscador de cliente en Pedidos, Cotizaciones y la importación de OC.
Filtros de la pantalla: buscador (por nombre, CUIT o nombre de fantasía) y casilla «Ver Inactivos». El botón «group_add» (👥+) permite dar de alta un comercial nuevo al vuelo (pide nombre y % de comisión, default 2 — lo usa Líquidos Productos). Por cada cliente hay tres acciones: Ver detalle (👁), Editar (✏️) y Eliminar/Inactivar (🗑) o Reactivar si está inactivo.
Formulario de cliente paso a paso
- Razón Social obligatorio (en mayúsculas). Ej.:
SUPERMERCADOS LA ANÓNIMA S.A. - CUIT y Nombre Fantasía (alias comercial; se usa también para buscar el cliente, ej. «El Super del Centro»).
- Email Notificaciones y Comerciales Asignados (uno o varios — casillas; el primero queda como comercial principal).
- Domicilio Fiscal: Calle/Ruta, N°, Provincia (desplegable), Localidad (desplegable dependiente de la provincia) y CP.
- Sucursales de Entrega — al menos una obligatoria. Por cada sucursal, con «+ Agregar»:
- Nombre Sucursal, Provincia y Localidad (obligatorios para que la fila se guarde).
- GLN (13 dígitos): el Global Location Number GS1 que identifica esa sucursal en las órdenes de compra electrónicas (Planexware). Es la llave del match automático de Importar OC.
- Datos F3000: Dirección de entrega, Nro, C.P. y KM viaje (kilómetros usados para tarifas/fletes).
- «Guardar Cliente».
Al pulsar el tacho, el sistema consulta si el cliente tiene historial (algún pedido o movimiento de stock):
- Tiene historial → no se borra: se pasa a INACTIVO (queda oculto salvo que se tilde «Ver Inactivos»). Trazabilidad intacta.
- No tiene historial → se ofrece eliminar permanentemente.
Un cliente inactivo se puede Reactivar con el botón de restaurar.
5 · Geografía (Provincias · Zonas · Localidades)
Pantalla de tres columnas. La geografía es la base de los domicilios y, sobre todo, de las zonas tarifarias que usa el Tarifario de Fletes.
| Columna | Cómo se da de alta | Datos |
|---|---|---|
| Provincias | Botón + → cuadro de texto pide el nombre | Solo nombre |
| Zonas Tarifarias | Botón + → pide el nombre (se guarda en MAYÚSCULAS) | Ej.: AMBA, NOA, GBA NORTE |
| Localidades | Botón + abre un formulario | Nombre · Provincia (obligatorios) · Zona Tarifaria (opcional) |
Cada columna tiene su propio buscador. Las localidades muestran su provincia y, si tiene, un badge con la zona. Localidades se puede editar (lápiz) y todo se puede eliminar con confirmación. Asociar la Zona Tarifaria a la localidad es lo que permite que el cotizador y el flete encuentren la tarifa por zona.
Si la localidad Pilar (Buenos Aires) está asignada a la zona
AMBA, cualquier flete a Pilar puede tomar la tarifa cargada para AMBA
en el Tarifario, sin tener que cargar precio localidad por localidad.
6 · Logística (Transportes y Choferes)
Pantalla de dos paneles: a la izquierda las Empresas de transporte, a la derecha los Choferes & Patentes. De acá salen el transporte y el chofer que se eligen en una orden de carga, y el WhatsApp al que el sistema avisa el viaje.
Empresa de transporte
- Botón + del panel «Empresas».
- Razón Social obligatorio (en mayúsculas), CUIT, Localidad, C.P. y Provincia.
- «Guardar». Se actualiza también el desplegable de transportes del resto del sistema.
Chofer paso a paso
- Botón + del panel «Choferes».
- Empresa de Transporte obligatorio (buscador inteligente).
- Nombre y Apellido obligatorio (mayúsculas) y DNI.
- Celular (WhatsApp): se escribe solo código de área + número, sin 0 ni 15 (ej.
381 4123456). El sistema agrega solo el prefijo internacional de Argentina y guarda549381..., listo para enviar el aviso por WhatsApp. - Patente Tractor/Camión y Patente Acoplado/Semi (se guardan en mayúsculas).
- «Guardar Datos».
Cuando se genera una Orden de Carga, el sistema notifica el viaje al chofer por WhatsApp usando este número. Si el chofer no tiene celular cargado, no recibe el aviso. Eliminar una empresa de transporte borra el vínculo de sus choferes: revisalos antes.
7 · Insumos
Materiales y envases que consume la producción de azúcar (hilo, bolsas, etiquetas, repuestos). No son los insumos de la División Polvos: esos tienen su propio ABM (ver «ABM (Polvos)»).
- Botón «Nuevo Insumo».
- Nombre obligatorio (ej.
Hilo de coser). - Tipo: Primario (MP) · Secundario (Envases) · General · Mecánico.
- Unidad (U.M.): un · kg · lt · mts.
- Stock Mínimo: dispara las alertas de reposición.
- Vinculado a Artículo (PT): relaciona el insumo con un producto terminado. Se deshabilita automáticamente si el tipo es General o Mecánico (esos no requieren vínculo).
- Valor (Costo USD): con hasta 4 decimales.
- «Guardar». Filtros disponibles: Tipo, Unidad y Vínculo.
Caché y propagación de cambios
Los catálogos se cachean en el navegador para que el sistema sea rápido (0 lecturas de más). Al guardar, ABM actualiza la memoria y refresca los desplegables en segundo plano, así que normalmente lo ves al instante. Si por algún motivo un buscador de otro módulo no refleja un registro recién creado, pulsá «Actualizar Datos» en ese módulo (o «Recargar» acá) para forzar la sincronización.
Flujo de datos
Cada entidad es su propia colección y el ABM únicamente escribe en ellas:
no genera movimientos, ni stock, ni pedidos. EAN y
codigosFlexxus de artículos + gln de sucursales +
cuit de propietarios son las llaves que habilitan el match automático
de Importar OC y el cruce Flexxus.
| Catálogo | Escribe en | Lo consume |
|---|---|---|
| Propietarios | propietarios | Compras, Stock, cruce Flexxus (CUIT) |
| Depósitos | depositos | Movimientos, Stock |
| Artículos | articulos | Pedidos, Cotizaciones, Importar OC (EAN), Flexxus (códigos) |
| Destinos | destinos, vendedores | Pedidos, Cotizaciones, Importar OC (GLN), Fletes (KM) |
| Geografía | provincias, zonas, localidades | Domicilios, Tarifario / Fletes (zonas) |
| Logística | transportes, choferes | Órdenes de carga, aviso WhatsApp, Fletes |
| Insumos | insumos | Producción de azúcar, alertas de stock mínimo |
Recursos Humanos
Recursos Humanos es el módulo de gestión de personal de planta: asistencia, horarios, disciplina, licencias, turnos adicionales, pre-liquidación de haberes, indicadores y comunicaciones (incluido el envío de recibos por WhatsApp). Solo rol 1 (Gerente). Es uno de los módulos más extensos del sistema; abajo se documenta cada solapa, sub-vista, acción y escenario.
Estructura general
La barra superior tiene seis solapas (switchRRHHTab):
Importar, Horarios, Novedades, Licencias,
Gerencia y Comunicaciones. «Gerencia» y «Comunicaciones» son a su vez
hubs con varias sub-vistas internas.
El circuito mensual (visión de conjunto)
- Importar la asistencia del período (fichadas del reloj).
- El sistema la consolida contra los horarios y clasifica cada día (trabajado, tardanza leve/media/grave, ausente justificado/injustificado, licencia).
- Se cargan novedades (sanciones, cortes de luz), licencias y turnos adicionales que ajustan el cálculo.
- En Gerencia → Pre-Liquidación se revisan los haberes y se cierra el período.
- En Comunicaciones → Recibos se publican los recibos de sueldo a cada empleado por WhatsApp.
Solapa «Importar»
Sube el archivo de fichadas (reloj/Excel) del período y lo consolida contra los
horarios definidos, generando rrhh_asistencia_consolidada y marcando
excepciones (días con desvío respecto del horario teórico).
Empleados y Horarios
El modal de empleado (alta/edición) se usa desde esta solapa:
- Nuevo / Editar empleado: nombre, datos y, sobre todo, ID de Reloj (la clave que vincula al empleado con sus fichadas) y su horario asignado.
- Al guardar, valida que el ID de Reloj no esté duplicado en otro empleado (consulta
rrhh_empleadosporid_reloj). - Los selectores de empleado en todo el módulo filtran a los dados de baja.
Solapa «Novedades»
- Sanciones rápidas (el centro completo está en Gerencia → Sanciones).
- Cortes de luz: modal de alta; se muestran limitados a los últimos 3 para no ensuciar la vista.
- Otros eventos del personal del día.
Solapa «Licencias»
Gestiona licencias con sub-pestañas (Activas / Histórico) y maneja feriados. Hay licencia Individual (un empleado, con smart selector) y Global (afecta a todos, p. ej. feriado/parada de planta), separadas a propósito. Las licencias impactan la consolidación de asistencia y la liquidación.
Solapa «Gerencia» (hub de Capital Humano)
Es un hub con seis sub-vistas:
Reportes / Dashboard
Indicadores con tarjetas y drill-down (clic para ver el detalle por empleado): Presentismo (% blando y % duro), Impuntualidad (cantidad de tardanzas), Caídos (ausencias), Horas plus (minutos extra netos, ya descontando lo que no cuenta como extra) y Skills. Se computa cruzando asistencia consolidada, sanciones y licencias del período.
Legajos
Ficha de cada empleado con su historial (ID de reloj, datos, antecedentes).
Sanciones (Centro de Disciplina)
- Feed de sanciones con buscador por empleado y un gráfico por tipo de sanción.
- Wizard de Sanción: se elige el empleado, el motivo (con textos legales pre-redactados, p. ej. ausencia injustificada) y la fecha del fichaje que la motivó. El texto es editable antes de emitir.
- Genera el documento de la sanción/apercibimiento (que luego puede descontar puntaje de conducta según Parámetros).
Turnos Adicionales
Tareas fuera de la jornada (mantenimiento, limpieza) que no cuentan como horas extra: son control horario.
- Nueva asignación de turno adicional a un empleado (tipo de turno tomado de Parámetros).
- Registrar día sobre una asignación activa: Caso A (la tarea se hace al fin del turno) y Caso B (el empleado se retira y vuelve más tarde), con asentamiento manual.
- Listas de Asignaciones activas e Histórico; se puede editar o eliminar una asignación.
Pre-Liquidación de Haberes
- Abre un modal con la tabla de haberes del período por empleado (días trabajados, licencias, ausencias, descuentos por conducta, plus, etc.).
- Toma como base el último período cerrado (
rrhh_liquidaciones_cerradas, ordenado por fecha de fin) y arma el actual. - Cerrar período: guarda el cierre definitivo en
rrhh_liquidaciones_cerradascon su ID de período. Se puede ver o eliminar un cierre cargado.
Se puede cerrar un período puntual a mano. Si el auto-cierre genera una fecha más reciente, prevalece el auto-cierre. Cerrar consolida el período como definitivo: revisar bien antes.
Parámetros
Configuración del cálculo, en pestañas:
| Pestaña | Qué define |
|---|---|
| Reglas | Puntaje de conducta: descuento por ausencia injustificada, por apercibimiento, penalizaciones por tardanza (leve/media/grave) |
| Skills | Habilidades/competencias del personal |
| Tipos Turno Adicional | Catálogo de tipos de turno adicional disponibles |
| Legales | Textos y parámetros legales |
Solapa «Comunicaciones» (hub WhatsApp)
Cuatro sub-pestañas:
| Sub-pestaña | Qué hace |
|---|---|
| Recibos | Se busca el período (año/mes); el sistema separa el PDF de recibos por empleado con «inteligencia posicional» y marca la confianza de cada match. Solo deja publicar si no hay recibos dudosos ni errores. Al publicar, cada empleado recibe su recibo por WhatsApp. |
| Bandeja | Estado de los envíos / mensajes encolados |
| Comunicar | Envío de comunicados al personal |
| Ausentismo | Seguimiento de ausencias y avisos relacionados |
Una vez publicados, los recibos se envían por WhatsApp. Verificá que no haya recibos «dudosos» (confianza media) antes de publicar: el sistema te bloquea la publicación justamente para evitar mandar el recibo equivocado a alguien.
Flujo de datos
| Colección | Qué guarda |
|---|---|
rrhh_empleados | Legajos (incluye id_reloj y horario) |
rrhh_horarios | Horarios/turnos teóricos |
rrhh_movimientos / rrhh_asistencia_consolidada | Fichadas y su consolidación |
rrhh_excepciones | Días con desvío respecto del horario |
rrhh_turnos_adicionales (+ registros) | Asignaciones y días de turno adicional |
rrhh_liquidaciones_cerradas | Cierres de período (pre-liquidación) |
rrhh_cortes_luz, rrhh_rotaciones, rrhh_bitacora | Novedades y bitácora |
procesamiento_recibos | Separación de recibos por período (Comunicaciones) |
avisos_rrhh, alertas_rrhh, documentos_rrhh, recibos_sueldo, cola_mensajes | Avisos, alertas, documentos, recibos y cola de WhatsApp |
La asistencia consolidada y las alertas de RRHH alimentan la tarjeta «RRHH Hoy» y el modal de alertas del tablero de Inicio. Cerrar un período lo vuelve definitivo.
Configuración
Configuración agrupa la administración técnica del sistema. Solo rol 1 (Gerente). Pestañas: Internos y Externos (usuarios), Períodos (cierre contable), Herramientas (ajustes de stock y migración) y Mapeo Flexxus.
Usuarios — visión general
Es el control de quién entra al sistema y qué ve. Cada usuario tiene una
cuenta real en Firebase Authentication (donde vive la contraseña, hasheada)
y un documento en la colección users (donde viven el rol, el
vínculo y el estado activo). Las dos primeras pestañas separan:
| Pestaña | Quiénes | Login |
|---|---|---|
| Internos | Personal de Moyco. Roles 1 Gerente, 2 Administración, 3 Producción, 5 Ventas/Comercial. | Usuario corto (ej. juan) → el sistema lo convierte a juan@moyco.com. |
| Externos | Clientes / titulares (rol 4) que entran al Portal del Cliente. | Usuario + email real + cuentas de stock que podrá ver. |
Alta de usuario
Botón «Nuevo Usuario» (crea según la pestaña activa).
Usuario interno
- Nombre de usuario (login): con «Juan» se crea automáticamente la cuenta
juan@moyco.comen Firebase Auth. - Contraseña inicial: la define el gerente (texto visible al crear). El usuario la cambiará desde Mi Cuenta después del primer ingreso.
- Rol: Gerente / Administración / Producción / Ventas. Define qué módulos y permisos tendrá.
Cliente externo (rol 4)
- Usuario (login) y contraseña inicial.
- Email real del cliente.
- Cuentas relacionadas: selección múltiple (Ctrl/Cmd + clic) de los propietarios cuyo stock podrá ver en el portal. Es obligatorio al menos una; sin vínculo el portal muestra «No tiene cuentas asociadas».
El alta usa un truco de app secundaria de Firebase: el usuario se crea en Auth en una instancia aparte, así el gerente no pierde su propia sesión. Si el email ya existe, el sistema avisa «El usuario ya existe (Email duplicado)».
Contraseñas (claves)
La clave vive únicamente en Firebase Authentication, hasheada e
irreversible. Nadie —ni el gerente— puede «ver» la contraseña de un
usuario: solo se puede resetear (generar una nueva). El campo legado
clave en users quedó en desuso y se limpia
automáticamente.
- Al crear: la contraseña inicial la pone el gerente y se la comunica al usuario (verbal / WhatsApp).
- Mínimo 6 caracteres (regla de Firebase Auth).
- El usuario la cambia él mismo en Mi Cuenta (ver abajo).
- Si la olvida: el gerente la resetea (no se recupera la vieja, se genera una nueva temporal — ver abajo).
«Mi Cuenta» — el usuario cambia su propia clave
Cualquier usuario (interno o externo) tiene la pantalla Mi Cuenta para cambiar su propia contraseña. Pide:
- Contraseña actual: se valida de verdad contra Firebase Auth (reautenticación). Si te dieron una clave temporal tras un reseteo, esa es la «actual».
- Nueva contraseña (mín. 6, no puede ser igual a la actual) + confirmación. Hay botón 👁 para ver/ocultar.
Si la sesión es muy vieja, Firebase exige reautenticación reciente
(requires-recent-login): cerrar sesión, volver a entrar y reintentar
el cambio. Otros errores: «La contraseña actual es incorrecta» o «demasiado
débil».
Reseteo de contraseña (recupero gestionado)
El recupero no es autoservicio: lo hace el gerente desde esta pantalla. Es deliberado — el control de accesos queda centralizado.
En la fila del usuario, el ícono 🔑 (llave) «Resetear contraseña»:
- Pide confirmación (avisa que la clave anterior dejará de funcionar al instante).
- Llama a la Cloud Function
resetPassword, que valida en el servidor que quien la invoca sea rol 1 (un usuario común no puede resetear a otros). - Genera una clave aleatoria de 12 caracteres, la aplica en Auth y la devuelve para mostrarla en un modal una única vez (con botón Copiar).
- Esa clave no se guarda ni se vuelve a mostrar: se le pasa al usuario y este la cambia en Mi Cuenta (usándola como «contraseña actual»).
Si se cierra el modal sin copiar la clave temporal, no hay forma de recuperarla: hay que resetear de nuevo. Pasásela al usuario por un canal seguro y pedile que la cambie apenas entre.
Usuario inactivo (baja y reactivación)
Un usuario no se borra: se da de baja (queda inactivo). Esto preserva la trazabilidad/auditoría y es reversible.
| Acción | Ícono en la fila | Qué hace |
|---|---|---|
| Dar de baja | 🗑️ (papelera) | Marca activo: false y guarda fechaBaja. La cuenta de Auth no se borra. La fila se ve gris con badge INACTIVO. |
| Reactivar | ↩️ (restaurar, verde) | El mismo botón cambia para usuarios inactivos: vuelve activo: true. El acceso se restaura de inmediato con la misma contraseña de antes (no se tocó). |
Al iniciar sesión, además de la contraseña se valida el estado: si
activo === false, el sistema fuerza el cierre de sesión y muestra
«Su cuenta ha sido DESACTIVADA. Contacte a la gerencia». Es decir, un
usuario inactivo no entra aunque sepa su clave correcta.
Editar perfil y rol
El ícono lápiz edita el perfil: en internos cambia el rol; en externos cambia el email y las cuentas vinculadas. No cambia la contraseña (en edición el campo de clave se oculta a propósito: la clave se cambia con Reset o desde Mi Cuenta).
Cambiar un rol cambia los módulos visibles y los permisos del usuario. Revisar bien antes de bajar o subir un rol (ej. pasar a Gerente da acceso total, incluido este panel).
Seguridad de acceso y sesión
| Mecanismo | Comportamiento |
|---|---|
| Cierre por inactividad | Aviso a los 119 min; cierre automático de sesión a las 2 horas sin actividad. |
| Login bloqueado por intentos | Muchos intentos fallidos → «Muchos intentos fallidos. Espere unos minutos» (protección de Firebase). |
| Usuario sin perfil | Existe en Auth pero no en users → «Usuario sin perfil asignado en el sistema». |
| Credenciales incorrectas | Mensaje genérico «Usuario o contraseña incorrectos» (no revela cuál falló). |
Escenarios típicos (usuarios)
| Escenario | Cómo se resuelve |
|---|---|
| Entra un empleado nuevo | Pestaña Internos → Nuevo Usuario → nombre, clave inicial, rol. Se le pasa la clave y cambia en Mi Cuenta. |
| Alta de un cliente para el portal | Pestaña Externos → Nuevo Usuario → login, email, y tildar sus cuentas de stock (≥1). |
| «No me acuerdo la contraseña» | Gerente → 🔑 Resetear → copiar la clave temporal → pasársela → el usuario la cambia en Mi Cuenta. |
| Empleado se va de la empresa | 🗑️ Dar de baja. Queda inactivo (no entra), pero su historial se conserva. |
| Vuelve un empleado dado de baja | ↩️ Reactivar. Entra con su clave anterior; si la olvidó, resetear. |
| Un cliente necesita ver otra cuenta | Editar (lápiz) el externo → agregar el propietario en «Cuentas relacionadas». |
| Cambió la función de alguien | Editar → cambiar el rol. Los módulos/permisos se ajustan solos. |
Errores y validaciones comunes
| Síntoma | Causa / solución |
|---|---|
| «El usuario ya existe (Email duplicado)» | Ese login/email ya tiene cuenta en Auth. Usar otro nombre o editar el existente. |
| «Debe seleccionar al menos una cuenta relacionada» | Externo sin vínculo. Tildar al menos un propietario. |
| «La contraseña actual es incorrecta» (Mi Cuenta) | Se tipeó mal la clave vigente (o quedó un espacio al pegar). Reintentar. |
| «Cerrá sesión y volvé a entrar» al cambiar la clave | Sesión vieja: Firebase pide login reciente. Re-loguear y reintentar. |
| «Su cuenta ha sido DESACTIVADA» | El usuario está inactivo. El gerente debe reactivarlo (↩️). |
| Se cerró el aviso sin copiar la clave temporal | No se recupera. Resetear de nuevo y copiarla esta vez. |
| «Solo los gerentes pueden resetear contraseñas» | La Cloud Function valida rol 1 en el servidor. Debe hacerlo un gerente. |
Ajustes de Stock (pestaña Herramientas)
Registra ajustes de stock (pérdidas, ganancias, mermas) sobre la composición del stock seleccionado. No genera un movimiento normal (MW): ajusta directamente la composición/saldo. Acción restringida a gerentes (si no, «Acceso denegado»).
Períodos (cierre contable)
Define hasta qué fecha está cerrado el período: los usuarios no pueden registrar movimientos con fecha igual o anterior. Soporta auto-cierre (bloquea automáticamente todo lo anterior a N días atrás) y un cierre manual adicional; si ambos aplican, prevalece la fecha más reciente. Configuración global, solo gerentes.
Mapeo Flexxus
Tabla que traduce cada cuenta contable de Flexxus a un tipo de venta de GS (propia / AZEF / consignación). El cruce Flexxus la usa para clasificar automáticamente los asientos según la cuenta del comprobante (ver capítulo Integración Flexxus).
Migración de Líneas (pestaña Herramientas)
Utilidad de una sola vez: recorre las colecciones endulzantes_* y
asigna el campo linea a documentos viejos (por defecto
EDULCORANTES) para separar Edulcorantes de Jugos. No se usa en la
operación diaria; solo se corrió al introducir las líneas.
Flujo de datos
| Acción | Escribe |
|---|---|
| Nuevo usuario | Firebase Auth (cuenta + clave) + users (rol, vínculo, activo, email) |
| Editar usuario | users (rol / email / stockRelacionado) — no toca Auth |
| Resetear contraseña | Firebase Auth (vía Cloud Function resetPassword, solo rol 1) — no persiste la clave |
| Cambiar mi contraseña | Firebase Auth (reautenticación + updatePassword) |
| Dar de baja / reactivar | users (activo, fechaBaja) — la cuenta de Auth se conserva |
| Ajuste de stock | Composición del stock seleccionado (sin pasar por movimientos) |
| Períodos | Configuración de cierre (global) |
| Mapeo Flexxus | Colección de equivalencias cuenta → tipo |
| Migración de líneas | Campo linea en colecciones endulzantes_* |
Portal del Cliente
El Portal del Cliente es la vista acotada para usuarios rol 4 (cliente externo). No ven la operación interna: solo lo suyo, y todo en solo lectura. Tres accesos: Mi Stock, Mis Órdenes y Mi Cuenta. Al ingresar, el sistema redirige al portal automáticamente.
Mi Stock
- Muestra el stock que el cliente tiene en consignación/depósito (de
stock_snapshotsfiltrado por las cuentas que Configuración → Usuarios le vinculó). - Botón «Ver Todo» para el detalle, e «Historial Consolidado» con opción de descargar Excel.
- Si el usuario no tiene cuentas vinculadas, muestra «No tiene cuentas asociadas — contacte a la administración».
Mis Órdenes
Seguimiento de sus órdenes/entregas con el estado de cada una (en preparación,
despachada, cumplida). Lee ordenesCarga y movimientos
filtrados por ese cliente.
Mi Cuenta
Datos de la cuenta del usuario y cambio de contraseña.
Flujo de datos
100% lectura y siempre filtrado por el cliente logueado: el portal nunca muestra datos de otros clientes ni permite operar sobre el stock. La vinculación cliente ↔ cuentas de stock se administra en Configuración → Usuarios (usuario externo). La información es la misma que maneja la operación interna, recortada a lo que le corresponde.
Integración Flexxus (Bridge)
El sistema GS Moyco se integra con Flexxus (el ERP contable de la empresa, base Firebird) a través de un componente llamado Bridge. Esta integración es transversal: aparece en Compras (vincular una OCA con su OC de Flexxus), en el despacho desde Orden de Carga (cruzar contra la factura de Flexxus) y en la vinculación posterior desde el listado de movimientos. Este capítulo explica qué es, cómo se usa y todos los escenarios.
Qué es el Bridge y por qué a veces "no está disponible"
El Bridge es un servicio local en Python que corre en la PC del usuario
(repositorio gs-flexxus-bridge) y expone la base de Flexxus al sistema
web. No es parte del sitio: es un programa aparte que tiene que estar corriendo
en esa computadora y con acceso a la red de Flexxus.
- Puede correr en distintos puertos según la PC (
8770o8765); el sistema los prueba en orden y usa el primero que responde. - Antes de cada operación se hace un chequeo de salud que devuelve si está
onliney si la base está accesible (db_ok). - Si el Bridge no está corriendo (no instalado, dado de baja, PC sin conexión a la LAN de Flexxus), el sistema lo avisa y ofrece la carga manual como alternativa. Nunca se "rompe": simplemente no se puede cruzar/vincular hasta que el Bridge esté activo.
Este mensaje significa que la PC no tiene el servicio Python corriendo o no llega a Flexxus. Solución: levantar el Bridge en esa PC y reintentar. Mientras tanto se puede operar manualmente (cargar la compra/despacho sin vínculo y vincular después).
El "cruce" GS vs. Flexxus (coloreo verde / amarillo / rojo)
Cuando se listan facturas u OCs de Flexxus, cada una se cruza contra el contexto de GS (cantidades, precio, CUIT del proveedor/cliente, OCA). El resultado se muestra con colores y por línea:
| Estado de línea | Color | Significa |
|---|---|---|
ok | Verde | El artículo/cantidad/CUIT coincide dentro de tolerancia |
multi | Amarillo | Hay coincidencia múltiple o parcial: revisar manualmente |
sin_match | Rojo | No coincide (proveedor/cliente equivocado o artículo inexistente) |
El cruce usa tolerancias configuradas para kilos y para precio por kilo (no exige coincidencia exacta al gramo/centavo). Además clasifica el tipo de operación según el mapeo de cuenta contable (ver Configuración → Mapeo Flexxus): la cuenta del asiento define si es venta propia, AZEF o consignación.
El modal de confirmación no deja vincular si el CUIT de la factura/OC de Flexxus no coincide con el del proveedor/cliente de GS. Es la barrera principal contra vincular el comprobante equivocado. (Este es el "bloqueo a diferencias de bridge" que se reforzó en el hub.)
Vincular / desvincular una OCA en Compras
En el detalle de una compra/OCA (módulo Compras & Consignación) hay dos botones ámbar: Vincular Flexxus y Desvincular Flexxus.
Vincular OC Flexxus
- Botón «Vincular Flexxus». Si la compra ya está vinculada, avisa y no continúa.
- Hace el chequeo de salud del Bridge. Si no está online o la base no responde, muestra el aviso y aborta.
- Abre el selector de OC de Flexxus: muestra todas las OCs recientes, ya coloreadas según el cruce contra esta compra (kg, bolsas, precio por bolsa, CUIT del propietario, OCA). Las OCs ya vinculadas a otras compras se excluyen de la lista.
- Al elegir una OC, el sistema guarda en la compra un bloque
flexxusOCcon: tipo, número, código de proveedor, razón social, CUIT, fecha de la OC, precio unitario sin IVA, marca de "vinculada posteriormente", fecha/hora y usuario que vinculó. Los datos de la compra GS no se modifican: solo se agrega la referencia. - Se reabre el detalle de la OCA mostrando el vínculo.
Desvincular OC Flexxus
- Botón «Desvincular Flexxus». Si no está vinculada, avisa.
- Pide confirmación, aclarando que los datos de la compra GS no se modifican.
- Borra el bloque
flexxusOC(queda ennull). La OC vuelve a estar disponible para vincular en otra compra.
Si la compra se está creando con el asistente y se había traído de una OC de Flexxus, hay una opción para quitar la vinculación antes de guardar: la compra se guarda sin referencia, pero se conservan los valores ya tipeados en el formulario (proveedor, artículo, OCA, bolsas, kg, precio, observaciones).
Cruce en el despacho desde Orden de Carga
Al despachar desde una Orden de Carga (Ventas → En Carga → Despachar → Paso 0.5 «Vincular venta de Flexxus»), si el Bridge está online el sistema ofrece cruzar contra la factura de Flexxus. El paso a paso completo y todos los escenarios están en el capítulo «Pedidos & Ventas» → Despacho; acá se muestran las pantallas:
- Chequeo de salud → trae las facturas recientes filtradas por el CUIT del cliente. Rango 3/7/30 días. Botones 👁 Ver (solo inspección) y Vincular →.
- Se elige la factura → trae su detalle → se calcula el cruce N×M (varias líneas GS contra varias líneas Flexxus, agregando por artículo).
- El modal de detalle muestra los 4 controles con coloreo: 1·Tipo (informativo), 2·Cantidad kg y 3·Precio $/kg (bloqueantes, tolerancia 1 kg / $0,01), 4·Chofer + Patentes (informativo).
- «Confirmar y cargar» queda bloqueado si hay desvío de kg/precio o si el CUIT no matchea. Al confirmar, el movimiento de stock queda con un snapshot completo de la factura Flexxus + el resultado de los controles, y se autocompletan/bloquean los campos Factura y Remito.
Vinculación posterior de factura (posthoc) desde Movimientos
Si un despacho se hizo sin Bridge (estaba caído) o la factura todavía no estaba emitida, después se puede asociar desde el listado de Movimientos de Stock: el flujo es idéntico al del despacho (salud → facturas → detalle → los 4 controles → confirmar), reconstruyendo el contexto N×M a partir de los movimientos «hermanos» del mismo viaje. Son exactamente las mismas dos pantallas de arriba («Facturas recientes en Flexxus» y el detalle con los 4 controles); cambia solo el punto de entrada.
Caso típico: el camión salió y se despachó manual porque el Bridge no estaba o la factura del ERP se emitió más tarde. Cuando Flexxus ya tiene la factura, se entra al movimiento desde Movimientos de Stock, se vincula y queda el mismo snapshot de auditoría que si se hubiera hecho en el momento del despacho. No mueve stock: solo agrega la referencia y los controles.
Flujo de datos
| Dónde | Qué se escribe |
|---|---|
| Compras (vincular OCA) | compras_azucar.flexxusOC = { datos de la OC } · desvincular = null |
| Despacho / posthoc | Snapshot de la factura Flexxus en el movimiento de egreso |
| Mapeo contable | Lectura de la tabla de equivalencias cuenta Flexxus → tipo GS (ver Configuración) |
La integración es de solo lectura sobre Flexxus: trae OCs y facturas para cruzarlas y dejar la referencia del lado de GS. No modifica el ERP. Tampoco mueve stock: el stock lo siguen manejando los movimientos de cada módulo.
División Polvos — Conceptos
La División Polvos es el segundo negocio del sistema, en paralelo al de Azúcar. Se entra desde el selector Azúcar / División Polvos arriba a la derecha: al cambiar, todo el sistema pasa al tema verde y muestra los módulos de Polvos (Inicio, Pedidos/Ventas, Movimientos, Stock, Producción, Calidad y ABM propios).
«División Polvos» no es un solo producto. Dentro de la misma división conviven dos líneas de negocio independientes: Endulzantes (edulcorantes en polvo / de mesa) y Jugos (jugos en polvo). Comparten la misma aplicación (mismos módulos, mismas pantallas, mismas colecciones) pero los datos están separados por línea: cada pedido, movimiento, lote, producción y stock «pertenece» a Edulcorantes o a Jugos. Antes de operar siempre hay que mirar en qué línea se está parado.
Cómo funciona el selector de línea (pill)
En cada módulo de Polvos hay un selector tipo pill Edulcorantes / Jugos (arriba de la pantalla o en el sidebar). Es el control más importante de la división:
- Acota todo lo que se ve y se carga a esa línea: el listado, los KPIs, el buscador de artículos, el alta de pedidos/movimientos, etc.
- Al crear algo (un pedido, un movimiento, una producción), queda marcado con la línea activa en ese momento. Cargar en la línea equivocada es el error más común — verificá el pill antes de guardar.
- Cambiar el pill recarga la vista con los datos de la otra línea (no se mezclan).
Algunos insumos (no los productos terminados) se usan en las dos líneas
—por ejemplo un mismo aditivo o envase—. Esos se marcan con línea
AMBAS: tienen stock y lotes únicos y aparecen en las dos
vistas (Edulcorantes y Jugos). Solo aplica a insumos; los artículos / producto
terminado siempre pertenecen a una sola línea.
Los registros viejos (anteriores a la separación) pueden no tener el campo de línea. Para no perderlos, en Edulcorantes el filtro es tolerante (incluye los antiguos sin línea); en Jugos es estricto (solo lo explícitamente marcado como Jugos). Por eso un registro histórico sin línea aparece en Edulcorantes.
Conceptos clave (válidos para todos los módulos de Polvos)
En Polvos, el stockActual y los lotes[] los escribe
únicamente un proceso automático del servidor (trigger
updateEndulzantesStock) a partir de los movimientos. Ningún módulo
(compras, producción, ventas, ajustes, pases) escribe el stock directo: solo
crea el movimiento y el servidor recalcula. Esto evita duplicar stock.
Consecuencia práctica: tras guardar un movimiento, el stock se actualiza
«en segundo plano» (unos segundos), no instantáneo.
Ni el saldo total ni ningún lote pueden quedar por debajo de cero. Hay
doble control: una validación en pantalla al cargar el egreso
(validarSaldoEgreso) y una barrera dura en el servidor que
rechaza el movimiento si dejaría stock negativo.
Muchos productos se venden y despachan por caja/bulto pero el stock se
lleva en unidades. Cada artículo tiene un factor
(unidadesPorBulto): ej. 1 caja = 24 unidades. El sistema muestra
cajas al operar comercialmente y convierte a unidades para el stock
automáticamente. Si el factor es 1, se opera directamente por unidad.
Cada módulo de Polvos (Pedidos/Ventas, Movimientos, Stock, Producción, Calidad, ABM) tiene su propia página en este manual. Todos respetan estas reglas: línea activa, stock calculado por el servidor, no-negativo y caja/unidad. Si algo no cierra, lo primero a revisar es en qué línea estás.
Inicio (Polvos)
Inicio (División Polvos) es el tablero de la división: stock de producto terminado, demanda pendiente, planificación activa, alertas de insumos y stock por línea. Vista de consulta. Roles 1, 2, 3 y 5. Tema verde.
Cómo se usa
El selector Edulcorantes / Jugos (pill superior) acota todos los indicadores a esa línea. Tarjetas:
| Tarjeta | Qué muestra | Acceso |
|---|---|---|
| Stock Prod. Terminado | Unidades totales de PT de la línea | — |
| Demanda Pendiente | Pedidos pendientes de la línea | «Ver Pedidos» |
| Planificación Activa | Producción planificada | «Ir a Producción» |
| Alertas Insumos | Insumos bajo el mínimo | — |
| Stock por línea / Stock Crítico | Barras por producto (clic = ver lotes) y lista de insumos críticos (actual vs. mínimo) | «Ver Todo» |
Algunos resúmenes los arma un proceso (robot) y pueden mostrar «Datos aún no generados» hasta que corra. Es estado normal cuando todavía no hubo actividad en esa línea.
Flujo de datos
Lee endulzantes_articulos, endulzantes_insumos,
endulzantes_movimientos, endulzantes_pedidos y las órdenes
de producción para armar los KPIs por línea. No escribe: refleja lo cargado en los
módulos de Polvos.
Pedidos/Ventas (Polvos)
Pedidos/Ventas (División Polvos) es el circuito comercial completo de Endulzantes y Jugos: desde que se carga un pedido hasta que la mercadería sale físicamente y el pedido queda cumplido. Este capítulo está escrito para que una persona que no conoce la empresa pueda hacer un despacho de principio a fin. Roles 1 (Gerente) y 5 (Comercial) ven todo incluido «Nuevo Pedido»; otros roles entran directo a «Pendientes». Trabaja por línea (pill Edulcorantes / Jugos en el sidebar verde).
Conceptos base (leer antes de operar)
| Concepto | Qué es |
|---|---|
| Línea | Edulcorantes o Jugos. El pill del sidebar. Todo lo que se ve y se crea pertenece a la línea activa. |
| Cliente | A quién se le vende. Sale del maestro destinos (buscador por nombre o CUIT). |
| Sucursal / Planta | Punto de entrega del cliente. Define la provincia/localidad de destino (para flete y orden de carga). |
| Artículo | Producto terminado de la línea (endulzantes_articulos). |
| Caja / Bulto y factor | Se vende y despacha por caja; el stock se lleva en unidades. unidadesPorBulto = cuántas unidades trae la caja. Si es 1, se opera por unidad. |
| PVE-XXXXXX | Número del pedido (colección endulzantes_pedidos). |
| OCE-XXXXXX | Número de la Orden de Carga (un viaje). Agrupa uno o varios pedidos en un mismo camión. |
| Estado del pedido | AUTORIZADO (pendiente) → EN_CARGA (asignado a una OCE) → CUMPLIDO (despachado). |
| Lote | Partida física del producto. En el despacho se elige de qué lote sale cada caja. |
Paso 1 — Nuevo Pedido
En el sidebar, «Nuevo Pedido» (solo roles 1 y 5). Se completa en orden:
- Cliente: buscador inteligente por nombre o CUIT. Al elegirlo se autocompleta el ejecutivo comercial y se cargan sus sucursales.
- Sucursal / Planta de entrega: si el cliente tiene una sola, se preselecciona. Al elegirla se llenan solas la provincia y localidad de destino.
- Orden de Compra / Referencia del cliente (opcional pero recomendado) y fecha de nota.
- Agregar mercadería (panel verde): buscar el artículo, poner la cantidad (en cajas si el producto va en caja — el sistema avisa «CONTENIDO: N por caja») y el precio unitario. Botón «Agregar»: el ítem cae al carrito. Repetir por cada producto.
- El pie calcula Base imponible, IVA 21% y Total automáticamente. Se fija el plazo de cobro en días (default 30).
- «Generar Pedido» → pide confirmar el total → crea el pedido con número PVE-XXXXXX en estado AUTORIZADO y lleva a «Pendientes».
Cliente «Distribuidora del Norte», sucursal «Depósito Salta». Se agrega «Edulcorante Sobres x50» con 20 cajas (factor 12 → 240 unidades) a $1.500 c/u. El total con IVA sale solo. «Generar Pedido» → queda PVE-000142 · AUTORIZADO.
El buscador de artículos está filtrado por la línea activa y el pedido queda marcado con esa línea. Si estás en «Jugos» no vas a encontrar productos de Edulcorantes — cambiá el pill primero.
Paso 2 — Pendientes (bandeja de entrada)
Lista los pedidos AUTORIZADOS sin orden de carga de la línea. Es la vista por defecto del módulo. Por fila se puede:
| Acción | Qué hace |
|---|---|
| Ver | Detalle del pedido (cliente, ítems, totales). |
| Editar | Reabre el formulario con los datos cargados. |
| Copiar | Clona el pedido como uno nuevo (para recompras). |
| Logística | Carga parcial de datos del viaje (transporte, chofer, fechas, tarifa) sin generar todavía la orden — útil para ir reservando el flete. |
| Eliminar | Borra el pedido (pide confirmación). |
El botón clave es «Generar Orden de Carga» (Mesa de Control), que arma el viaje.
Generar la Orden de Carga (OCE) — Mesa de Control
- Cliente: el desplegable solo muestra clientes con pedidos pendientes.
- Aparecen los ítems pendientes de ese cliente. Se tildan los que van en este viaje y se pone cuántas cajas de cada uno (se puede cargar menos que lo pedido: el resto queda pendiente — «split»).
- Logística obligatoria: fecha de carga, empresa de transporte y chofer. Opcionales: fecha/hora de descarga, turno, patentes, tarifa $/Tn y observaciones.
- Confirmar → genera el número OCE-XXXXXX, asigna esa logística y mueve los pedidos a EN_CARGA. Los pedidos cargados completos pasan enteros; los parciales se parten (lo que viaja a EN_CARGA, el resto sigue AUTORIZADO).
El pedido pide 20 cajas pero en el camión entran 12. Se tilda el ítem y se pone 12. El sistema crea la OCE con esas 12 (EN_CARGA) y deja un pedido pendiente por las 8 restantes (AUTORIZADO) para el próximo viaje.
Paso 3 — En Carga (bandeja de salida)
Muestra las órdenes de carga (agrupadas por OCE) de la línea, con cliente, detalle consolidado (en cajas y unidades) y logística. Acciones por orden:
| Botón | Qué hace |
|---|---|
| 👁 Ver detalle | Resumen del viaje y sus ítems. |
| 🖨 Imprimir | Genera el PDF de la Orden de Carga para el transportista. |
| ↩️ Cancelar | Anula la OCE: los pedidos vuelven a Pendientes (AUTORIZADO) y se desvinculan. No mueve stock (todavía no se despachó). |
| 📤 Confirmar Despacho | Abre el Picking — el paso que efectivamente saca la mercadería. Ver abajo. |
Paso 4 — El Despacho (Picking de lotes) · capítulo crítico
Esta es la operación que da de baja el stock. Hasta acá nada salió del inventario; recién al confirmar el despacho la mercadería «sale». Seguí estos pasos exactamente.
- En En Carga, botón verde «Confirmar Despacho» (📤) de la orden. Abre el modal «Picking de Carga: OCE-XXXXXX».
- Por cada producto el modal muestra cuánto hay que cargar (REQUERIDO, en cajas) y una fila de lote. El sistema ya sugiere un lote con stock suficiente y completa la cantidad (sugerencia automática tipo FIFO) — solo hay que verificar que el lote coincida con lo que físicamente se está cargando.
- Si la mercadería sale de varios lotes, botón «Añadir Lote» y se reparte la cantidad entre ellos. Cada lote muestra su stock disponible (en cajas).
- El indicador de cada producto debe quedar en verde «Completo» (lo asignado = lo requerido). Si dice «Faltan N» o «Excede», ajustá las cantidades. No se puede asignar más que el stock del lote.
- «Confirmar Salida»: el sistema valida todo y salta al formulario de Movimiento de Producto ya precargado y bloqueado (cliente, transporte, chofer, destino, ítems y lotes vienen heredados de la orden).
- En ese formulario, revisar y presionar «Confirmar»: se registra el movimiento de egreso. El servidor recalcula el stock (baja del lote elegido) y el pedido pasa a CUMPLIDO.
Confirmar el despacho solo escribe el movimiento; el trigger
updateEndulzantesStock recalcula stock y lotes unos segundos
después. Si un lote no tiene stock suficiente, el sistema rechaza el
despacho (validación en pantalla + barrera en el servidor). Nunca se fuerza un
egreso que dejaría stock negativo.
OCE-000087, cliente del paso anterior, 12 cajas de «Edulcorante Sobres x50». Picking → el sistema sugiere Lote L-2406 (disponible 30 cajas) y pone 12. Queda verde «Completo». «Confirmar Salida» → formulario precargado → «Confirmar». Stock del L-2406 baja a 18 cajas; PVE-000142 pasa a CUMPLIDO.
Mientras esté en En Carga (no despachado) podés Cancelar la OCE y los pedidos vuelven a Pendientes sin tocar stock. Una vez Confirmado el Despacho, ya hay un movimiento: la corrección es anular ese movimiento (ver capítulo Movimientos) o registrar una devolución.
Paso 5 — Cumplidos (Historial) y Devolución
Lista los pedidos CUMPLIDOS de la línea. Es consulta; además permite la devolución de cliente (roles 1, 2, 3, 5) con el botón ↩️.
Devolución de cliente
- ↩️ en el pedido cumplido → modal de devolución multi-renglón (se puede devolver uno o varios productos del pedido).
- Por cada renglón se confirma el lote al que vuelve la mercadería y la cantidad.
- Al confirmar, el sistema crea movimientos con
tipo_movimiento: "DEVOLUCION"(que el servidor trata como ingreso y repone stock), actualiza la cantidad devuelta acumulada del movimiento de salida original y deja un documento resumen enendulzantes_devoluciones_ventas.
Una devolución no reabre el pedido: este se mantiene CUMPLIDO. La devolución es un ingreso de stock trazable aparte, no una marcha atrás del pedido.
Escenarios típicos
| Escenario | Cómo se hace |
|---|---|
| Venta normal de punta a punta | Nuevo Pedido → Pendientes → Generar OCE (transporte+chofer+fecha) → En Carga → Confirmar Despacho → Picking → Confirmar. |
| El camión no entra todo | En la Mesa de Control cargar menos cajas: la OCE se va con lo que entra, el resto queda en Pendientes (split). |
| Varios pedidos en un mismo viaje | En la Mesa de Control del mismo cliente, tildar ítems de varios pedidos: todos van bajo una sola OCE. |
| Producto que sale de dos lotes | En el Picking, «Añadir Lote» y repartir la cantidad. Debe quedar «Completo». |
| Se armó mal la orden | Si no se despachó: En Carga → Cancelar (vuelve a Pendientes). Si ya se despachó: anular el movimiento o devolver. |
| El cliente devuelve mercadería | Cumplidos → ↩️ → elegir renglones y lote → confirmar (repone stock). |
| Recompra igual a una anterior | Pendientes → Copiar el pedido (o Cumplidos como referencia) → ajustar y generar. |
Errores y validaciones comunes
| Síntoma | Causa / solución |
|---|---|
| No encuentro el producto al cargar el pedido | El buscador está filtrado por la línea activa. Verificar el pill Edulcorantes/Jugos. |
| «El pedido está vacío» | Falta agregar ítems al carrito antes de Generar Pedido. |
| El cliente no aparece en la Mesa de Control | Solo se listan clientes con pedidos pendientes (AUTORIZADO sin OCE) en esa línea. |
| «Fecha de Carga, Empresa y Chofer son obligatorios» | Faltan datos mínimos de logística para generar la OCE. |
| En el Picking dice «Faltan N» / «Excede» | Lo asignado entre lotes no coincide con lo requerido. Ajustar cantidades. |
| «Stock insuficiente en lote …» | El lote elegido no tiene esas cajas. Elegir otro lote o repartir; el sistema no permite negativo. |
| El stock no bajó al instante tras despachar | Es normal: lo recalcula el servidor en segundo plano (unos segundos). |
Flujo de datos
| Colección | Rol |
|---|---|
endulzantes_pedidos | El pedido y su estado (AUTORIZADO → EN_CARGA → CUMPLIDO); split en cargas parciales |
endulzantes_movimientos | Egreso por despacho · ingreso por devolución (tipo_movimiento: DEVOLUCION) |
endulzantes_articulos | Solo lectura — productos, factor de empaque, lotes disponibles. El stock lo recalcula el servidor |
endulzantes_devoluciones_ventas | Resumen de cada devolución de cliente |
destinos, transportes, choferes | Solo lectura — cliente, sucursales, logística |
Igual que Azúcar: el sistema solo trackea el avance logístico (AUTORIZADO/EN_CARGA/CUMPLIDO). No maneja estados de cobro/pago.
Movimientos (Polvos)
Movimientos de Stock (División Polvos) es el libro mayor de inventario de Endulzantes y Jugos: cada entrada, salida, ajuste, devolución y despacho queda registrado acá. El stock no se edita nunca a mano — se registra un movimiento y el servidor recalcula. Este capítulo explica todas las funciones de la pantalla, una por una, con ejemplos. Roles 1, 2, 3 y 5. Trabaja por línea (pill Edulcorantes / Jugos).
Conceptos base
| Concepto | Qué es |
|---|---|
| Insumos vs. Productos | Dos pestañas. Insumos = materias primas / envases que entran (compra) o salen (devolución a proveedor). Productos = producto terminado (PT) que se despacha, ingresa por producción o se devuelve. |
| Tipo de movimiento | INGRESO (entra stock), EGRESO / SALIDA (sale stock), DEVOLUCION (el servidor la trata como ingreso, repone stock). |
| Lote | Partida física. Si no se conoce, queda S/L (sin lote). El stock se lleva por lote. |
| MED-XXXXXX | Número correlativo del movimiento (customId). |
| Caja / factor | Los productos se operan por caja; el stock se guarda en unidades. El sistema convierte con unidadesPorBulto. |
| Anulado | Un movimiento no se borra: se anula (cantidad → 0) y el servidor revierte su efecto en el stock. |
Guardar un movimiento solo escribe en
endulzantes_movimientos. El stockActual y los
lotes[] los reescribe únicamente el trigger
updateEndulzantesStock. Por eso al confirmar verás «el stock se
actualizará en segundo plano»: es normal, tarda unos segundos.
La pantalla y cómo se navega
- Pill de línea (Edulcorantes / Jugos): cambia la línea activa y recarga el listado desde el servidor.
- Tabs Insumos / Productos: cambian la tabla y también qué crea el botón verde (Registrar Insumo o Registrar Producto).
- Buscador: filtra sobre lo ya descargado (nombre, N° MED, cliente, remito, factura, proveedor).
- El listado trae 20 movimientos por página (botón «Cargar 20 más»), ordenados por fecha. Cada fila se colorea: verde ingreso, rojo salida, ámbar devolución.
- Clic en una fila → detalle del movimiento (ver más abajo).
Para Jugos el filtro es estricto (solo linea == JUGOS). Para
Edulcorantes se incluyen además los movimientos antiguos sin línea
(para no perderlos). Los insumos compartidos (linea: AMBAS)
aparecen en las dos vistas.
Botones de la barra superior
| Botón | Qué hace |
|---|---|
| Excel | Exporta el historial de movimientos (modal de exportación con filtros). Las salidas salen en negativo para cuadrar. |
| Dev. Azúcar (teal) | Devolución de azúcar desde Polvos hacia la división Azúcar — es el pase inverso al «Pase a Polvos» (transacción atómica que registra el ingreso/egreso en ambos sectores). Ver el capítulo Movimientos de Stock (Azúcar). |
| Registrar Insumo / Producto (verde) | Botón dinámico: abre el alta según la pestaña activa. Es la acción principal. |
Registrar Movimiento de Insumo
Pestaña Insumos → «Registrar Insumo». Campos:
- Tipo: 📥 Compra (Entrada) = INGRESO, o 📤 Devolución (Salida) = EGRESO.
- Fecha del movimiento.
- Insumo: buscador inteligente (
endulzantes_insumos). Al elegirlo se muestra su unidad de medida. - Cantidad en la unidad del insumo.
- Proveedor / Destino: buscador del ABM de proveedores
(
endulzantes_proveedores, lista compartida entre las dos líneas). Si no está, se acepta texto libre. - Factura y Remito (formato N°: 5 + 8 dígitos), Lote del proveedor y observaciones.
- Confirmar Movimiento → genera MED-XXXXXX. Si es EGRESO, antes de crear valida que el lote/total tenga saldo (no permite negativo).
Llega una compra de «Ácido cítrico» del proveedor «Química SA», factura 00012-00004587, 500 kg, lote PROV-9981. Tipo = Compra (Entrada). Confirmar → MED-000534; el stock del insumo sube en segundo plano.
Registrar Movimiento de Producto
Pestaña Productos → «Registrar Producto». Campos:
- Tipo: 📤 Salida (venta/envío) o 📥 Ingreso (devolución/producción).
- Fecha y Destino / Procedencia (buscador de
destinos). - Producto (buscador) y Lote:
- Si es Ingreso: el lote es un campo de texto (lote nuevo).
- Si es Salida: el lote es un selector con los lotes que tienen stock (no se puede sacar de un lote vacío).
- Cantidad (en cajas o unidades según el producto).
- Carga Múltiple (checkbox): permite varios productos/lotes en un mismo movimiento (tabla de ítems).
- Logística: transporte, chofer, provincia, localidad y Tarifa $/Tn (se autocompleta desde el Tarifario al elegir localidad).
- Remito / Orden / Factura (split 5+8), Ref. interna, ajuste de Pallets (+/-) y observaciones.
- Confirmar → registra el movimiento; el servidor recalcula stock y lotes.
Producción terminó un lote: Tipo = Ingreso, producto «Jugo Naranja x12», lote
nuevo JN-2407, 80 cajas, destino «PRODUCCION». Confirmar → el stock
del lote JN-2407 sube en segundo plano.
El Despacho llega acá (Picking)
Cuando en Pedidos/Ventas → En Carga se confirma un despacho, el Picking de lotes y el formulario precargado son de este módulo: el sistema arma el movimiento de SALIDA con los lotes elegidos (sugerencia FIFO, conversión cajas↔unidades) y al confirmar baja el stock. El paso a paso completo del despacho está en el capítulo Pedidos/Ventas (Polvos); acá solo cae el movimiento resultante, que queda como una salida más en el listado.
Un movimiento generado por un despacho queda bloqueado: si se edita, solo se pueden cambiar Notas y Fecha (los campos de producto/cantidad/lote están protegidos para no descuadrar la orden de venta).
Ver el detalle de un movimiento
Clic en cualquier fila. Muestra cantidad y tipo, fecha, ID, proveedor/destino, factura, remito y lote, y las observaciones. Desde acá:
- Ver Trazabilidad (solo productos con lote real): abre la trazabilidad del lote (de dónde salió, a dónde fue).
- Editar: reabre el alta con los datos cargados.
- Anular: deja el movimiento sin efecto (ver abajo).
Editar un movimiento
Reabre el formulario con todo cargado. Se puede corregir lo que no esté bloqueado.
Si al editar se cambia el lote, el sistema avisa el cambio («lote original → lote nuevo») y pide confirmar dos veces: el cambio recalcula el stock de ambos lotes (resta del viejo, suma al nuevo) y no se deshace fácil. Un movimiento anulado no se puede editar.
Anular un movimiento
Desde el detalle, botón «Anular». Pide confirmación. El movimiento no se
borra: se marca anulado: true y su cantidad pasa a 0. Eso
hace que el servidor detecte la diferencia y revierta el efecto en el
stock automáticamente (un ingreso anulado descuenta lo que había sumado; una
salida anulada repone). Queda el rastro en el historial con el prefijo
[ANULADO] en las observaciones.
Se cargó por error un ingreso de 500 kg. Se abre el detalle → «Anular» → confirmar. El movimiento queda en 0 y anulado; el servidor baja esos 500 kg del stock en segundo plano. Para rehacerlo bien, se crea un movimiento nuevo.
Carga de Stock Inicial (PT)
Herramienta para sembrar stock de producto terminado sin trazabilidad de
producción (puesta en marcha / ajuste de apertura). Pide producto, cantidad
(unidades), lote y fecha; crea un movimiento de INGRESO especial
(docAzucel: INGRESO_INICIAL). Úsese con precaución: lo que entra por
acá no tiene parte de producción detrás.
Escenarios típicos
| Escenario | Cómo se hace |
|---|---|
| Entró una compra de insumo | Tab Insumos → Registrar Insumo → Compra (Entrada), cantidad, proveedor, factura/remito, lote. |
| Devolver insumo al proveedor | Tab Insumos → Registrar Insumo → Devolución (Salida); valida saldo del lote. |
| Ingresar PT producido | Tab Productos → Registrar Producto → Ingreso, lote nuevo, cantidad, destino «PRODUCCION». |
| Despachar una venta | No se hace acá: se confirma en Ventas → En Carga → Picking (cae como salida en este listado). |
| Corregir un movimiento mal cargado | Detalle → Editar (si no está vinculado a despacho), o Anular y rehacer. |
| Sembrar stock al arrancar | Carga de Stock Inicial (PT). |
| Devolver azúcar a la división Azúcar | Botón «Dev. Azúcar» (pase inverso atómico). |
| Exportar el historial | Botón Excel → filtros → descarga (salidas en negativo). |
Errores y validaciones comunes
| Síntoma | Causa / solución |
|---|---|
| «Se requiere un índice compuesto en Firebase» | Falta el índice de la consulta (tipo_item + fecha + customId). Crearlo con el enlace de la consola del navegador. |
| No deja registrar un EGRESO | No hay saldo en ese lote/total. El sistema bloquea el stock negativo (cliente y servidor). |
| No aparece el lote en el selector de Salida | Ese lote no tiene stock. Elegir otro o revisar ingresos previos. |
| El stock no cambió al instante | Normal: lo recalcula el servidor en segundo plano. |
| No puedo editar producto/cantidad de un movimiento | Está vinculado a un despacho: solo Notas y Fecha son editables. |
| Un movimiento viejo aparece en Edulcorantes y no en Jugos | Es correcto: los antiguos sin línea se muestran en Edulcorantes (filtro tolerante); Jugos es estricto. |
| «No se puede editar un movimiento anulado» | Ya está anulado. Para rehacer, crear uno nuevo. |
Flujo de datos
| Colección | Rol |
|---|---|
endulzantes_movimientos | Escribe/lee — todo movimiento (INGRESO / EGRESO / SALIDA / DEVOLUCION), anulación, edición. Correlativo MED por movimientos_endulzantes_med |
endulzantes_articulos / endulzantes_insumos | Solo lectura desde acá. stockActual y lotes[] los escribe únicamente el trigger updateEndulzantesStock |
endulzantes_proveedores | Solo lectura — proveedor de insumos (lista compartida, sin línea) |
destinos, transportes, choferes, tarifas | Solo lectura — destino y logística del movimiento de producto |
Se aplica en cliente (al cargar el egreso) y en servidor: un delta que dejaría stock negativo se descarta y se marca en la idempotencia del servidor. Si un egreso «no impacta», revisar el saldo real del lote.
Stock (Polvos)
Stock (Polvos) es la foto del inventario de la División Polvos: cuánto hay de cada insumo (materia prima) y de cada producto terminado (PT), con su detalle de lotes, su valorización y sus alertas de stock mínimo — todo separado por línea (Edulcorantes / Jugos). Es una pantalla de consulta y control: el saldo no se carga acá. Roles 1, 2, 3 y 5.
stockActual y lotes[] los escribe exclusivamente
el trigger updateEndulzantesStock a partir de
endulzantes_movimientos. Esta pantalla solo lee. Si un saldo
está mal, NO se toca el número: se corrige generando el movimiento o la
rectificación correspondiente (ver más abajo «Rectificar»). Vale igual para
Edulcorantes y Jugos.
Edulcorantes y Jugos en el stock
El pill superior cambia la línea con switchStockLinea; el filtrado es
en memoria (no vuelve a consultar Firestore), así que el cambio es
instantáneo. Hay una diferencia importante entre insumos y productos:
| Regla de línea | Por qué | |
|---|---|---|
| Insumos | Se ven los de la línea activa + los marcados AMBAS | Azúcar, ácido cítrico, etc. son compartidos: el mismo stock alimenta Edulcorantes y Jugos. |
| Productos (PT) | Solo los de la línea activa (estricto) | Un Jugo Naranja x12 no tiene sentido en la vista de Edulcorantes. |
Insumos: linea === activeLinea || linea === 'AMBAS' (tolerante; los
insumos sin campo linea se asumen Edulcorantes). Productos:
(linea || 'EDULCORANTES') === activeLinea (estricto). Si un PT no
aparece donde esperás, revisá su campo linea en ABM (Polvos).
Las dos solapas: Insumos y Productos (PT)
Dentro de cada línea, el selector Insumos / Productos (PT) alterna entre las dos grillas. Al entrar al módulo se abre Productos y se descarga fresco de la nube (no usa caché) para que el saldo sea el más reciente.
Solapa «Insumos» (materia prima)
Columnas: Nombre (con su unidad de medida), Categoría (tipo), Stock Físico, Stock Mínimo, Valorizado (stock × valor unitario) y Estado. Un insumo entra en alerta cuando tiene mínimo definido y el stock actual es ≤ ese mínimo: el número se pinta de rojo y el estado muestra ⚠. Si está OK, ✓ verde.
Solapa «Productos (PT)» — cajas y unidades
Para productos, el stock se guarda en unidades pero se muestra de forma
legible usando el factor unidadesPorBulto del artículo:
Jugo Naranja x12 tiene unidadesPorBulto = 12 y un
stockActual de 14.284 unidades. La grilla muestra 1.190
CAJAS y «+ 4 un.» (14.284 ÷ 12 = 1.190 cajas y sobran 4 unidades).
Si el resto es 0, muestra «Pack cerrado». Cuando el factor es 1, se
muestra el número plano. Columnas extra de PT: Valor Unit. y Total
Valorizado.
Buscar, filtrar y paginar
- Buscador inteligente (servidor): busca un insumo/producto por nombre
directamente en Firestore. Al seleccionarlo, el sistema hace un
getDocen vivo para mostrar el saldo exacto de ese ítem (no el cacheado). Borrar el buscador recarga la lista normal. - Filtro «Tipo / Categoría»: se llena automáticamente con las categorías presentes en lo cargado. Filtra en memoria.
- «Solo Alertas»: muestra únicamente los ítems en o bajo el stock mínimo — útil para «¿qué tengo que reponer/producir?».
- «Cargar más registros»: la lista trae de a 50; el botón al pie carga
el siguiente bloque (paginación con
startAfter). - 🔄 Recargar: limpia memoria y vuelve a descargar la lista completa desde la nube (saldos frescos).
Detalle de lotes (clic en una fila)
Al hacer clic en cualquier fila se abre «Composición de Stock por Lote»: el saldo total y el desglose lote por lote. Los lotes con saldo 0 se muestran en gris. Desde cada lote hay dos accesos directos:
- Trazabilidad → abre la historia de ese lote en el módulo Trazabilidad y Calidad (de dónde vino, a quién se vendió).
- Rectificar → ajusta el saldo de ese lote puntual (ver abajo).
Rectificar / Ajustar stock
Hay un botón «Rectificar» en la barra (y también por lote dentro del modal de composición), tanto para Insumos como para Productos. Es el camino correcto para corregir un saldo sin tocar el número a mano: genera un movimiento que el servidor procesa.
- Producto / Insumo: precargado si se entró desde una fila/lote; si no, hay un buscador.
- Lote a rectificar: se elige de la lista de lotes con su saldo actual.
- Tipo de ajuste: + Incremento (suma al lote) o − Merma (resta del lote).
- Cantidad y Observaciones (recomendado: «conteo físico», «merma por vencimiento», etc.).
- Confirmar Ajuste: se genera el movimiento; el saldo lo recalcula el servidor unos segundos después. La merma no puede dejar el lote negativo (barrera de stock no-negativo).
Conteo físico de Jugo Naranja x12 lote JN-2407: el sistema
dice 230 cajas, en depósito hay 224 (6 cajas dañadas). Se rectifica con
− Merma · 6 y observación «Conteo físico — 6 cajas dañadas». Tras unos
segundos el lote queda en 224 y la merma queda trazada.
Los ingresos/egresos normales van por Producción, Movimientos o Ventas. Usá Rectificar solo para diferencias de inventario reales (conteo, rotura, vencimiento). Cada ajuste queda registrado y es auditable.
Exportar a Excel
El botón «Excel» exporta a CSV lo que está visible (respeta los
filtros de tipo y «Solo Alertas» activos, ordenado alfabéticamente). Insumos:
nombre, tipo, UM, stock, mínimo, estado (OK / BAJO / SIN STOCK), valor unitario y
total. Productos: además cajas/bultos estimados, unidades por bulto y total
valorizado. El archivo sale como Stock_…_Endulzantes_AAAA-MM-DD.csv.
Cómo se usa (resumen)
- Elegí la línea (pill Edulcorantes / Jugos).
- Elegí la solapa Insumos o Productos (PT).
- Buscá / filtrá / activá «Solo Alertas» para ver lo que falta.
- Clic en una fila → composición por lote → Trazabilidad o Rectificar.
- Si necesitás el dato afuera, exportá a Excel.
Flujo de datos
| Colección | Rol |
|---|---|
endulzantes_insumos | Solo lectura — insumos, stockActual, lotes[], stockMinimo, linea (incl. AMBAS) |
endulzantes_articulos | Solo lectura — productos terminados, lotes, unidadesPorBulto, valor, linea |
endulzantes_movimientos | Escribe solo cuando se Rectifica (el resto de la pantalla no escribe) |
updateEndulzantesStock (trigger servidor) | Único que escribe stockActual / lotes[]; esta pantalla muestra su resultado |
El stock que ves acá es exactamente el que usan Producción (para validar que hay insumo), Ventas/Picking (para despachar por lote) y Trazabilidad. No hay un «stock paralelo»: si acá dice 0, no se puede despachar ni producir con ese lote.
Producción (Polvos)
Producción (División Polvos) es donde se fabrica: convierte insumos en productos. Tiene dos solapas, que son dos etapas distintas del mismo circuito: Elaboración (preparar el granel / intermedio a partir de una fórmula) y Envasado (convertir ese granel + envases en el producto terminado a partir de una estructura). Todo funciona por línea: el pill Edulcorantes / Jugos de arriba decide con qué familia de productos, recetas e insumos se trabaja. Roles 1, 2 y 3.
Edulcorantes y Jugos: misma mecánica, distinto producto
El módulo es uno solo y funciona igual para las dos líneas. Lo único
que cambia es qué se fabrica: cuando el pill está en Edulcorantes el
buscador, las recetas/estructuras y el historial muestran productos de esa línea;
cuando está en Jugos, los de jugos. Los insumos compartidos (marcados
linea: AMBAS en ABM, ej. azúcar, ácido cítrico) aparecen disponibles en
las dos.
| Edulcorantes | Jugos | |
|---|---|---|
| Elaboración produce… | Una base/granel en polvo (ej. Endulzante Stevia — Base Granel) | Un jarabe o concentrado líquido (ej. Jarabe Base Naranja) |
| Envasado produce… | Sobres / sachets / estuches (ej. Edulcorante Sobres x50) | Cajas de jugo (ej. Jugo Naranja x12) |
| Unidad típica del granel | kg | litros (L) |
| Unidad de venta del PT | caja / display (factor unidadesPorBulto) | caja x6 / x12 (factor unidadesPorBulto) |
| Pill en uso | Edulcorantes (verde activo) | Jugos (verde activo) |
La OP queda marcada con la línea activa al momento de crearla. Si planificás un jarabe de jugo con el pill en Edulcorantes, el producto no aparecerá en el buscador (filtra por línea) o quedará mal clasificado. Primero el pill, después «Nueva OP».
Conceptos base (imprescindible)
| Concepto | Qué es |
|---|---|
| Elaboración / Intermedio (granel) | La preparación a medio camino: un jarabe (jugos), una base en polvo (edulcorantes). Todavía no se vende — alimenta al envasado. |
| Envasado / Producto Terminado (PT) | El producto final que se vende (caja x12, sobres x50). Se arma con el granel + envases. |
| Fórmula / Receta | Qué insumos y en qué % lleva un intermedio. Se carga en ABM → Fórmulas. Sin receta no se puede elaborar. |
| Estructura | Qué componentes (granel + envases) lleva un producto terminado. Se carga en ABM → Estructuras. |
| OPI / OPT | N° de la Orden de Producción de Intermedio (OPI-…) o Terminado (OPT-…). |
| PEI / PET | N° del Parte de producción (lo realmente fabricado): PEI-… elaboración, PET-… envasado. |
| Estado de la orden | PLANIFICADA (creada, insumos reservados) → COMPLETADA (fabricada) · ANULADA. |
| Planificado vs. Real | Lo que se pensó producir vs. lo que realmente salió. La diferencia es merma (menos) o sobre-rendimiento (más). |
| Lote destino | El lote del producto fabricado. Si se deja vacío, el sistema lo autogenera. |
| FIFO | El sistema sugiere consumir primero los lotes de insumo más viejos. Se puede cambiar. |
Ni elaborar ni envasar tocan el stock directo: generan movimientos en
endulzantes_movimientos (EGRESO de lo consumido, INGRESO de lo
producido) y el servidor recalcula. No se puede consumir más insumo del
que hay (barrera de stock no-negativo). Por la misma razón, el stock se ajusta
unos segundos después de confirmar, no al instante. Esto vale igual para
Edulcorantes y para Jugos.
Elaboración vs. Envasado — la diferencia
| Elaboración | Envasado | |
|---|---|---|
| Produce | Granel / intermedio | Producto terminado (lo que se vende) |
| Se basa en | Receta (insumos por %) | Estructura (granel + envases) |
| Orden / Parte | OPI / PEI | OPT / PET |
| Confirmación | Total (una vez) | Parcial (de a tandas, con saldo pendiente) |
| Editar / Anular | Anular vía el detalle / Movimientos | Editar y Anular la OPT mientras esté PLANIFICADA |
SOLAPA «ELABORACIÓN» — paso a paso
Lista las Órdenes de Producción de intermedios de la línea activa, divididas en dos bloques: Órdenes Planificadas (arriba, las pendientes de producir) e Historial de Producción (abajo, los partes PEI ya cerrados, con buscador). Botón «Nueva Orden de Producción». Por fila de una orden planificada: PRODUCIR (confirmar la elaboración), Ver detalle 👁, Imprimir OP 🖨 y Anular 🗑.
Crear la orden — asistente de 3 pasos
- Paso 1 — Qué y cuánto: fecha planificada, lote destino (opcional, se autogenera), producto a elaborar (buscador, solo intermedios de la línea activa) y cantidad a producir (kg en edulcorantes, L en jugos). Al pasar de paso, el sistema verifica que el producto tenga receta; si no, avisa y hay que cargarla en Fórmulas.
- Paso 2 — Asignación de materia prima: por cada insumo de la receta el sistema calcula el requerido (% × cantidad) y sugiere lotes FIFO. Se puede agregar/cambiar lotes y repartir cantidades. No deja asignar más de lo que hay en stock del lote.
- Paso 3 — Confirmar planificación: resumen (producto, cantidad, fecha, lote, componentes reservados) → «Crear Orden». Nace OPI-XXXXXX en estado PLANIFICADA y se reservan los insumos (movimiento de EGRESO).
Pill en Jugos. Se planifica 500 L de «Jarabe Base Naranja» para el 20/05. La receta dice 18% de azúcar, 0,9% de ácido cítrico, 0,5% de saborizante → el paso 2 muestra «requerido 90 kg / 4,5 kg / 2,5 kg» y sugiere lotes. Se confirma → OPI-000045 · PLANIFICADA, insumos reservados.
Pill en Edulcorantes. Se planifica 200 kg de «Endulzante Stevia — Base Granel». La receta lleva 18% de stevia, 75% de eritritol y 5% de antiaglomerante → el paso 2 pide «36 kg / 150 kg / 10 kg» con lotes FIFO. Se confirma → OPI-000050 · PLANIFICADA.
Confirmar la elaboración (lo que realmente salió)
- En la lista de Órdenes Planificadas, sobre una OP PLANIFICADA, botón «PRODUCIR».
- El modal muestra el resumen y los lotes de insumo asignados, y pide la «Producción Real Obtenida» (viene sugerida con lo planificado; se corrige con lo que de verdad salió).
- «Confirmar y Afectar Stock»: genera el parte PEI-XXXXXX, un movimiento de INGRESO del granel con su lote, y cierra la OP en estado COMPLETADA (con la cantidad real y el lote final). Pasa al Historial de Producción.
De los 500 L planificados de OPI-000045 salieron 485 L reales (15 L de merma de proceso). Se pone 485 en «Producción Real». Resultado: ingresa el lote con 485 L, PEI-000031, OP COMPLETADA. La merma queda reflejada en planificado(500) vs real(485).
Ver detalle de una elaboración
El botón 👁 (o, en el historial, «Consultar») abre el detalle del parte: producto, lote producido, planificado vs. real vs. merma, las materias primas utilizadas con sus lotes y las observaciones del proceso. Es la base de la trazabilidad hacia atrás (ver módulo Trazabilidad y Calidad).
SOLAPA «ENVASADO» — paso a paso
Misma estructura que Elaboración pero para productos terminados: lista las Órdenes de Envasado planificadas de la línea + Historial de envasado. Botón «Nueva OP». Por fila: PRODUCIR (Confirmar Parcial), Ver detalle, Editar, Imprimir OP y Anular.
Crear la orden — asistente de 3 pasos
Igual estructura que Elaboración, pero usa la estructura del producto:
- Paso 1: fecha, lote destino, producto terminado (de la línea activa) y cantidad a envasar.
- Paso 2: el sistema analiza la estructura (qué granel y qué envases lleva) y arma los componentes con sus lotes.
- Paso 3: resumen → «Crear Orden» → OPT-XXXXXX PLANIFICADA.
Confirmar Parcial — envasar de a tandas
El envasado normalmente no se hace todo de una vez. El modal Confirmar Parcial permite cargar tandas sucesivas:
- Muestra el Saldo Pendiente de la orden (lo que falta envasar) y el lote destino.
- Se carga la Producción Real de esta tanda (puede ser menor o incluso mayor que lo pendiente — se permite sobre-rendimiento).
- Casilla «Cerrar orden con esta cantidad (anular saldo)»:
- Merma: se produjo menos y no se va a producir más para esa orden → cerrarla con lo hecho (se anula el saldo restante).
- Sobrante: se produjo más de lo planeado → cerrar la orden con ese excedente.
- Al confirmar: parte PET-XXXXXX, INGRESO del PT con su lote y EGRESO automático de los componentes consumidos (granel + envases).
OPT-000060 planifica 1.000 cajas de Jugo Naranja x12. Día 1: se envasan 600 → Confirmar Parcial con 600, sin tildar cierre → quedan 400 pendientes. Día 2: se envasan 380 (faltaron envases) y no se hará más → Confirmar Parcial con 380 y tildando «Cerrar orden» → la OPT queda COMPLETADA con 980 reales (20 de merma anulados del saldo).
OPT envasa Edulcorante Sobres x50. La estructura indica: 1 caja = 50 sobres = X kg de base + 50 sobres vacíos + 1 estuche. Al confirmar 200 cajas se descuenta la base granel y los envases por estructura, y entra el PT por 200 cajas con su lote.
Mientras no se confirmó, una OPT se puede editar (reabre el asistente precargado) o anular (estado ANULADA). Anular libera la reserva. Una vez confirmada (total o parcialmente) ya hay movimientos: corregir es vía Movimientos (anular el MED) — ver capítulo Movimientos de Polvos.
Reglas de oro
- Primero el pill, después la OP. La orden hereda la línea activa (Edulcorantes / Jugos) y eso ya no se cambia.
- Sin fórmula/estructura no hay producción. Cargarlas primero en ABM.
- El stock lo recalcula el servidor a partir de los movimientos; nunca se duplica ni queda negativo.
- Planificar reserva, confirmar fabrica. Crear la OP descuenta/reserva insumos; recién al confirmar ingresa el producto.
- Insumos AMBAS (azúcar, ácido cítrico, etc.) se consumen del mismo stock en las dos líneas.
Escenarios típicos
| Escenario | Cómo se hace |
|---|---|
| Preparar un jarabe (Jugos) | Pill Jugos → Elaboración → Nueva OP (3 pasos) → PRODUCIR con la producción real. |
| Preparar una base en polvo (Edulcorantes) | Pill Edulcorantes → Elaboración → Nueva OP → PRODUCIR. |
| Envasar cajas de jugo / sobres | Solapa Envasado → Nueva OP (estructura) → Confirmar Parcial (una o varias tandas). |
| Salió menos de lo planeado (merma) | Cargar la cantidad real menor; en envasado tildar «Cerrar orden» si no se producirá más. |
| Salió de más (sobre-rendimiento) | Cargar la cantidad real mayor (se permite); tildar cierre para finalizar la orden. |
| Envasar en varios días | Confirmar Parcial por tanda, sin tildar cierre hasta la última. |
| Me equivoqué antes de confirmar | Envasado: Editar o Anular la OPT. Elaboración: anular vía el detalle / rehacer. |
| «El producto no tiene fórmula» | Ir a ABM → Fórmulas (Elaboración) o Estructuras (Envasado) y cargarla; reintentar. |
| El producto no aparece en el buscador | El pill está en la línea equivocada, o falta la categoría/línea del artículo en ABM. |
Errores y validaciones comunes
| Síntoma | Causa / solución |
|---|---|
| «El producto seleccionado NO tiene una fórmula activa» | Falta la receta/estructura en ABM. Cargarla antes de planificar. |
| No deja asignar un lote de insumo | Ese lote no tiene stock suficiente. Elegir otro / repartir. El sistema bloquea negativo. |
| «Debe asignar al menos un lote por insumo» | En el paso 2 quedó un insumo sin lote o sin cantidad. Completar todos. |
| El producto no aparece en el buscador | El buscador filtra por línea y por categoría (intermedio en Elaboración). Verificar el pill y la categoría del artículo en ABM. |
| El stock no subió tras confirmar | Normal: lo recalcula el servidor en segundo plano (unos segundos). |
| La orden quedó con saldo pendiente sin querer | No se tildó «Cerrar orden» en el Confirmar Parcial. Hacer otra confirmación parcial tildando la casilla. |
| «Orden no encontrada / fue anulada por otro usuario» | Otro usuario la anuló/editó. Refrescar la lista. |
| No se puede editar (estado ≠ PLANIFICADA) | Solo se editan/anulan órdenes PLANIFICADA. Si ya se produjo, corregir vía Movimientos. |
Flujo de datos
| Colección | Rol |
|---|---|
ordenes_produccion_intermedios / ordenes_produccion_pt | Escribe/lee — las órdenes (PLANIFICADA → COMPLETADA / ANULADA), correlativos OPI / OPT |
partes_elaboracion_intermedios / partes_elaboracion_pt | Escribe — el parte con lo realmente producido (PEI / PET) |
endulzantes_recetas | Solo lectura — fórmula de los intermedios (insumos por %) |
endulzantes_estructuras | Solo lectura — estructura de los terminados (granel + envases) |
endulzantes_movimientos | Escribe — EGRESO de insumos/componentes e INGRESO del producto. El stock lo recalcula updateEndulzantesStock |
endulzantes_articulos / endulzantes_insumos | Solo lectura — productos, insumos, lotes y stock disponible (filtrados por línea) |
Cada parte deja registrados los lotes de insumo consumidos y el lote
producido, con la referencia PRODUCCION OPI/OPT-… en el
movimiento. Eso es exactamente lo que después permite el «VER ORIGEN» del módulo
Trazabilidad y Calidad: producir bien acá = poder rastrear después, tanto
en Edulcorantes como en Jugos.
Trazabilidad y Calidad (Polvos)
Trazabilidad y Calidad (División Polvos) reconstruye la historia completa de un lote de Endulzantes o Jugos: de qué orden de producción salió, con qué insumos y lotes se fabricó, cuánto stock tuvo en cada momento y a qué clientes se despachó. Es la herramienta para responder un reclamo de calidad o un recall en minutos. Es 100% consulta (no genera movimientos). Roles 1, 2 y 5. Trabaja por línea (pill Edulcorantes / Jugos).
«Un cliente llamó por el lote L-2406: ¿de qué se hizo, a quién más se lo vendimos, y qué otros lotes de producto usaron ese mismo insumo?» — todo eso se contesta acá, navegando hacia atrás (genealogía) y hacia adelante (destinos) desde cualquier lote.
Conceptos base
| Concepto | Qué es |
|---|---|
| Lote | La partida física que se rastrea. Todo gira alrededor del par producto + lote. Los movimientos sin lote (S/L) no son trazables. |
| MED-XXXXXX | N° de un movimiento (customId). Sirve para la Búsqueda Rápida. |
| Remito / Orden / Ref. | Otros documentos por los que se puede entrar (campos remito, orden, docAzucel del movimiento). |
| OPT / OPI | Orden de Producción de Terminado (OPT-…) o de Intermedio (OPI-…). Es el «padre» de un lote producido. |
| Ingreso / Salida / Devolución | Tipo de cada movimiento del lote. Ingreso y Devolución suman saldo; Salida resta. |
| Saldo histórico | El stock del lote en el momento de cada movimiento (acumulado), no solo el actual. Permite ver la película, no la foto. |
| Stock actual del lote | Lo que queda hoy de ese lote (de endulzantes_articulos.lotes[]). |
Cómo encontrar un lote (dos caminos)
Camino A — Búsqueda Rápida (por documento)
El más usado ante un reclamo: se tiene un papel en la mano (un remito, una factura, un N° de movimiento). Caja índigo, arriba.
- Escribir el documento y Enter (o lupa): acepta remito
(
0001-00000055), MED (MED-000123) u orden / referencia (OPT-000001). - El sistema busca por coincidencia exacta en los movimientos de la línea activa (solo los que tienen lote).
- Si hay un único resultado, salta directo a la historia del lote. Si el documento tocó varios lotes (ej. una orden con varios productos), muestra la lista para elegir cuál trazar.
Llega un reclamo con el remito 0003-00000005. Se tipea, Enter →
«Encontrado: Azúcar CTA AZUCEL x1000 — Lote AC42M10» y se abre su historia
automáticamente.
Camino B — Búsqueda Manual (producto + lote)
Cuando se conoce el producto pero no un documento. Caja blanca.
- Producto: buscador inteligente (filtrado por la línea activa).
- Lote: el desplegable se llena con los lotes de ese producto y muestra el stock de cada uno (ej. «AC42M10 (Stock: 1.200)»).
- «Consultar Lote» → arma la historia.
La «Historia del Lote»
El encabezado muestra el lote, el producto y el stock actual del lote. La tabla lista todos los movimientos de ese producto+lote, ordenados del más reciente al más viejo:
| Columna | Qué muestra |
|---|---|
| Fecha | Día del movimiento. |
| Tipo | INGRESO / DEVOLUCIÓN (verde, suma) o SALIDA (rojo, resta). |
| Cantidad | Con signo (+ entra / − sale). |
| Saldo Hist. | Cuánto había de ese lote justo después de ese movimiento. |
| Referencia (OP/OC) | El documento de origen. Si el ingreso vino de producción, muestra el N° de OP con botón «VER ORIGEN». |
| Destino / Cliente | En las salidas, a quién se le despachó (trazabilidad hacia adelante). |
| Trazar | Botón «VER ORIGEN» cuando el lote nació en una orden de producción. |
No es lo mismo «el lote tiene 0 hoy» que ver que entró por producción 1.000, salió 600 a un cliente, volvió 50 por devolución y salió el resto. La columna Saldo Hist. reconstruye ese recorrido movimiento por movimiento.
Trazabilidad hacia ATRÁS (genealogía) — «VER ORIGEN»
Si un ingreso del lote vino de producción, el botón «VER ORIGEN» abre la orden de producción que lo fabricó (OPT terminado u OPI intermedio) y lista las Materias Primas / Lotes Utilizados: cada insumo con su lote y cantidad.
Cada lote de insumo de esa lista es clicable. Al hacer clic, la trazabilidad salta a ese insumo+lote y reconstruye su propia historia. Así se baja el árbol nivel por nivel: PT → su OP → un insumo → de qué compra/OPI vino ese insumo → etc. Se puede llegar hasta la materia prima original.
Trazabilidad hacia ADELANTE (destinos)
La misma tabla de historia, mirando las filas de SALIDA, responde la otra mitad del reclamo: a qué clientes se despachó ese lote y en qué fechas. No hace falta otra pantalla — el destino está en la columna «Destino / Cliente» de cada salida.
Trazabilidad desde otros módulos
No hace falta venir siempre acá: el botón «Ver Trazabilidad» que aparece en el detalle de un movimiento (módulo Movimientos de Polvos) abre la misma «Historia del Lote» en una ventana, sin perder lo que se estaba haciendo. Es el atajo natural cuando se está revisando un movimiento puntual.
Caso completo: gestionar un reclamo
Un cliente reclama por el Jugo Naranja x12, lote JN-2407.
- Entrar al lote: Búsqueda Rápida con el remito del cliente (o Manual: producto «Jugo Naranja x12» → lote JN-2407).
- Hacia adelante: en la historia, las SALIDAS muestran que JN-2407 fue a 3 clientes además del que reclamó → se los puede contactar preventivamente.
- Hacia atrás: el INGRESO de JN-2407 dice «PRODUCCION OPT-000045» → botón «VER ORIGEN». La OP usó, entre otros, «Saborizante Naranja lote SB-9912».
- Profundizar: clic en el lote
SB-9912→ la trazabilidad salta a ese insumo y muestra de qué compra entró y a qué otras OPT se asignó. - Conclusión: si el problema es el saborizante SB-9912, desde su trazabilidad se ven todos los lotes de PT que lo usaron → alcance real del recall, con clientes incluidos.
Escenarios típicos
| Escenario | Cómo se hace |
|---|---|
| Reclamo con un remito en la mano | Búsqueda Rápida → pegar el remito → entra solo a la historia. |
| «¿A quién le vendimos este lote?» | Abrir el lote → mirar las filas de SALIDA (columna Destino/Cliente). |
| «¿De qué se hizo este lote?» | En el ingreso de producción → «VER ORIGEN» → lista de insumos y lotes. |
| Recall por un insumo sospechoso | Llegar al insumo (clic en su lote dentro de «VER ORIGEN») → ver todas las OPT/lotes que lo usaron. |
| Verificar el recorrido de stock de un lote | Leer la columna «Saldo Hist.» fila por fila. |
| Trazar sin salir de Movimientos | Detalle del movimiento → botón «Ver Trazabilidad». |
| Documento con varios productos/lotes | Búsqueda Rápida muestra la lista → elegir el ítem a trazar. |
Errores y validaciones comunes
| Síntoma | Causa / solución |
|---|---|
| «No se encontraron movimientos con lote para ese documento» | El documento no existe en esa línea, o los movimientos eran S/L (sin lote, no trazables). Probar la otra línea o la Búsqueda Manual. |
| No aparece el lote en el desplegable | Es un lote histórico sin stock. Entrar por Búsqueda Rápida (un MED/remito de ese lote): el sistema lo agrega como «(Histórico)». |
| Un ingreso de producción no tiene «VER ORIGEN» | Su referencia no quedó como «PRODUCCION OP…» (ingreso manual o carga inicial). No tiene OP que rastrear hacia atrás. |
| «Orden de Producción no encontrada» | La OP referenciada no está en ordenes_produccion_pt/_intermedios (dato viejo o borrado). |
| El producto no aparece al buscar | El buscador está filtrado por la línea activa. Cambiar el pill Edulcorantes/Jugos. |
| Stock actual en 0 pero hay historia | Es normal: el lote ya se consumió. La historia y el saldo histórico siguen siendo válidos para el reclamo. |
Flujo de datos
| Colección | Rol |
|---|---|
endulzantes_movimientos | Solo lectura — la historia del lote (por articuloId + lote) y la búsqueda por documento (customId/remito/orden/docAzucel) |
endulzantes_articulos | Solo lectura — nombre, presentación y stock actual por lote |
ordenes_produccion_pt / ordenes_produccion_intermedios | Solo lectura — la OP que originó el lote y sus insumos/componentes asignados (con lote) |
endulzantes_devoluciones_ventas | Reflejado vía los movimientos DEVOLUCION que reponen el lote |
Este módulo no edita nada: su valor es poder demostrar el origen y
el destino de cada lote ante un reclamo, una auditoría o un recall. La calidad
del dato depende de cargar siempre el lote en los movimientos: un
S/L rompe la cadena y deja el lote sin trazabilidad.
ABM (Polvos)
ABM (Polvos) administra los catálogos de la División Polvos. Seis vistas: Artículos, Insumos, Catálogos, Recetas, Estructuras y Proveedores. Roles 1, 2, 3 y 5. Las vistas de Artículos e Insumos usan el pill de línea (Edulcorantes / Jugos).
Entidades
| Entidad | Qué define | Línea |
|---|---|---|
| Artículos | Productos terminados | Edulcorantes o Jugos (se elige al crear; el tipo del modal depende de la línea) |
| Insumos | Materias primas | Edulcorantes, Jugos o AMBAS (compartido: stock y lotes únicos, visible en las dos) |
| Catálogos | Listas de valores reutilizables (tipos, presentaciones, etc.) | — |
| Recetas | Fórmula: qué insumos y cantidades producen cada artículo | Por línea |
| Estructuras | Composición/estructura de producto para producción | Por línea |
| Proveedores | Proveedores de insumos | Lista compartida (sin línea) |
Cómo se usa
- Se elige la vista; en Artículos/Insumos, el pill define la línea activa.
- Alta/edición/eliminación con el formulario propio de cada entidad. En Artículos se asigna la línea; en Insumos se puede marcar
AMBAS.
Un insumo que sirve a las dos líneas se carga una sola vez con
linea: AMBAS (stock y lotes únicos). El filtro estándar lo incluye en
ambas vistas. Esto aplica solo a insumos, no a artículos/PT.
Flujo de datos
Colecciones: endulzantes_articulos, endulzantes_insumos,
endulzantes_recetas, endulzantes_estructuras,
endulzantes_proveedores y los catálogos de valores
(polvos_catalogos). Se cachean en el navegador; tras un alta puede hacer
falta Actualizar. El stock de artículos e insumos no se toca acá: lo
maneja el trigger del servidor.