Introducción

Cómo usar este manual

Actualizado: 2026-05-18

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.

Cómo está organizado cada módulo

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.

Pantalla de inicio de sesión
Pantalla de inicio de sesión

Según el rol del usuario, el menú lateral muestra más o menos módulos:

RolPerfilQué ve
1GerenteAcceso total a todos los módulos
2 / 3Operativo / LogísticaOperación, stock, despacho, producción
4Cliente externoPortal acotado: su stock y sus órdenes
5Comercial / VentasPedidos, 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.

Pantalla principal del sistema
Pantalla principal: barra lateral por áreas + área de trabajo
Sobre el botón «Actualizar»

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.

Introducción

Inicio (Tablero)

Actualizado: 2026-05-18

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»).

Tablero de inicio
Tablero de Inicio

Fila 1 — KPIs operativos

TarjetaQué muestraClic / acción
TráficoCargas atrasadas, que descargan hoy y próximasVa al Centro de Tráfico
Saldos NegativosCantidad de alertas de stock contable en negativo (badge rojo con el conteo)Abre el detalle de saldos en descubierto
Órdenes ActivasTotal, desglosado en Cartera y GestiónVa a Órdenes
Movimientos HoyTotal 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.
Datos casi en vivo

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.

Comercial

Pedidos & Ventas

GerenteComercialOperativoOperativo Actualizado: 2026-05-19

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:

RolEntra comoSolapas 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:

EstadoQué significaCómo llega ahí
AUTORIZADOCargado, pendiente de prepararAl crear el pedido (manual o al confirmar una OC importada)
EN_CARGAIncluido en una orden de carga; camión armándoseAl «Generar orden de carga» en Pendientes
CUMPLIDODespachado, o saldo anulado, o cierre forzadoDespacho confirmado en En Carga, «Anular saldo», o «Forzar cierre»
RECHAZADOOC importada descartadaBotón «Rechazar» en Importar OC
Dos campos que conviene conocer

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.

Recorrido completo
Nuevo / Importar OC pedidosVenta · AUTORIZADO ordenesCarga (NP-…) · EN_CARGA movimiento de egreso trigger de stock pedidosVenta · CUMPLIDO

Solapa «Nuevo Pedido» (carga manual)

Formulario de nuevo pedido
Formulario de Nuevo Pedido

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

  1. 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).
  2. Fecha de Documento: por defecto hoy.
  3. Sucursal / Destino: el selector se habilita recién al elegir cliente; al elegir sucursal se autocompletan Provincia y Localidad (solo lectura).
  4. Orden de Compra Cliente: campo fiscal en dos partes — 5 dígitos + 8 dígitos (formato NNNNN-NNNNNNNN). Es la referencia del cliente; opcional.
  5. 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:

  1. Se busca el Artículo (buscador inteligente sobre el panel oscuro).
  2. Se cargan Cantidad (kg), Precio Unitario y, opcionalmente, Descuento ($).
  3. 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.
  4. «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.
  5. Cada renglón de la tabla se puede quitar individualmente.
Validaciones al confirmar

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.

Qué guarda exactamente

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)

Importar orden de compra
Importar OC — bandeja de revisión

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.

  1. Soltar archivos en la zona de arrastre, o seleccionarlos (acepta varios .xls/.xlsx a la vez). Si se suelta otro tipo de archivo, lo rechaza con aviso.
  2. 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.
  3. Cada OC queda en la bandeja con un estado: Pendiente revisión, Incompleto (faltó resolver algo), Confirmado o Rechazado.
  4. Ver detalle: muestra exactamente qué interpretó (cliente, sucursal, renglones, cantidades) para revisar antes de confirmar.
  5. Confirmar: convierte la OC en un pedido real.
  6. Rechazar: pide un motivo y descarta la OC.
Qué hace cada acción con los datos

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.

Requisito para que el match automático funcione

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)

Pedidos pendientes
Bandeja de pedidos pendientes

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)

  1. 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.
  2. 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.
  3. Al confirmar, el sistema pide el correlativo NP-00000001 y, 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 numeroOrdenCarga y 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.
  4. Al terminar, notifica al chofer por WhatsApp el nuevo viaje y redirige a En Carga.
Renglones genéricos: marca obligatoria

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.

Tarifa en cero = alerta para Administración

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ónQué haceEscenarios
Asignar logísticaCarga transporte/chofer/fechas a un pedido sin generar todavía la ordenÚtil para pre-armar viajes
Pausar / AutorizarBloquea o habilita un pedido para carga (isAuthorized)No se puede pausar un pedido que ya está en proceso de carga
EditarAbre el pedido en «Nuevo Pedido» en modo ediciónPide confirmación
CopiarUsa el pedido como plantilla para uno nuevo
Alta / edición de choferCrea o edita un chofer sin salir del flujo (modal)El chofer queda disponible al instante en el buscador
Eliminar / Anular saldoModal de confirmación con palabra clave (ver abajo)Doble comportamiento según haya entregas
Exportar ExcelBaja la bandeja ordenada por fecha de carga/descarga
Cronograma / Mesa de ControlVista de impresión del despacho diario
AlertasAgrega una nota/alerta a un pedido
Eliminar vs. Anular saldo — el modal cambia solo

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 pedidosVenta de 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)

Órdenes en carga
Órdenes de carga activas

Lista las órdenes de carga (ordenesCarga) con pedidos en EN_CARGA. Acciones:

Despachar (la baja de stock real)

El proceso más crítico de la empresa — leer completo

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).

Secuencia exacta del despacho
En Carga → Despachar Paso 0: Tipo de Azúcar (si Consignación) Imputar OCAs Paso 0.5: Flexxus o Manual (si Flexxus) Cruce contra factura Formulario precargado Confirmar → egreso → CUMPLIDO

Paso 0 — Selección de Tipo de Azúcar (obligatorio)

Modal de selección de Tipo de Azúcar
Paso 0: ¿qué stock va a descontar este despacho?

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ónCuándo se eligeQué dispara
Venta en Consignación azulLa 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
La azúcar Orgánica se despacha eligiendo Propia / AZEF / Consignación

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)

Modal de imputación de OCAs de consignación
Imputación: repartir las bolsas del despacho entre los saldos de comitentes

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:

  1. 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.
  2. Se escribe, en cada OCA, cuántas bolsas imputar (tope = el saldo de esa OCA).
  3. 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).
  4. 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.
  5. «Confirmar» cierra el modal y recién ahí sigue el Paso 0.5. «Volver» regresa al selector de Tipo de Azúcar.
Ejemplo de imputación

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.

Por qué la imputación puede descuadrar (caso real frecuente)

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

Modal de elección Flexxus o carga manual
Paso 0.5: vincular la venta facturada en Flexxus o cargar a mano

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 BridgeQué muestraBotó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.
Qué es el Bridge (resumen — detalle en «Integración Flexxus»)

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

Lista de facturas recientes de Flexxus
Facturas recientes en Flexxus, filtradas por el CUIT del cliente

Si elegiste «Vincular Flexxus» se abre la lista de facturas recientes de Flexxus, ya filtrada por el CUIT del cliente de la orden:

  1. Rango de fechas: botones 3 / 7 / 30 días (default 3). Si no aparece la factura, se amplía el rango.
  2. 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.
  3. 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).
  4. ← Seguir con carga manual: descarta Flexxus y va al formulario manual.

Cruce Flexxus (2/2) — Los 4 controles cruzados

Detalle de factura Flexxus con los 4 controles de cruce
Control cruzado GS Moyco vs Flexxus: tipo, líneas (kg + precio) y chofer

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:

ControlQué compara¿Bloquea?
1 · Tipo de ventaEl 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 kgSí — bloqueante
3 · Precio ($/kg)Precio unitario GS vs precio Flexxus normalizado a $/kg. Tolerancia $0,01/kgSí — bloqueante
4 · Chofer + PatentesNombre del chofer y patentes tractor/acoplado de GS vs el transporte de la factura FlexxusNo (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íneaColorSignifica
Match OKVerdeEl artículo cruzó 1 a 1 y está dentro de tolerancia
Match múltipleNaranjaVarios artículos GS tienen ese código Flexxus; se eligió el más cercano por cantidad. Revisar
Sin equivalencia GSRojoEl código Flexxus no está en ningún artículo: falta cargar codigosFlexxus[] en ABM
Sin línea en FlexxusRojo (fila extra)El pedido GS incluye kg que la factura Flexxus no declara
Bloqueo por descuadre — la barrera principal

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.

Bloqueo por CUIT

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:

  1. 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.
  2. Si la factura tiene un único remito vinculado, también autocompleta y bloquea los campos de Remito.
  3. Guarda en memoria un snapshot completo de la factura + el resultado de los 4 controles, que se grabará junto al movimiento.
Qué queda guardado en el movimiento (auditoría)

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

Formulario de confirmar despacho precargado
Modo Despacho: datos importados de la orden, listos para verificar

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.

Modal de confirmación final del despacho
Última revisión antes de descontar stock
  1. Al confirmar, en una transacción atómica se crea el/los movimiento(s) de egreso (tipo VENTA, remitoConformado:false), con el tipoAzucar, las imputaciones[] de consignación (prorrateadas por camión si hay varios ítems) y el flexxusFactura si se vinculó.
  2. El stock lo baja el servidor (un proceso recalcula los stock_snapshots): el formulario nunca escribe el stock a mano.
  3. El pedido pasa a CUMPLIDO y la orden se cierra.
Regla de oro del despacho

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)

EscenarioQué pasaQué hacer
Bridge offline al despacharEl botón Flexxus está deshabilitadoCarga manual y vincular posthoc cuando el Bridge esté arriba
No aparece la factura en la listaEstá fuera del rango o aún no emitidaAmpliar 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ículoCargar el código en ABM → Artículos → Códigos Flexxus, y reintentar
Δ kg o Δ $ en naranja → Confirmar bloqueadoLa factura y el pedido no coinciden en kg/precioCorregir el pedido o la factura en el origen; no forzar
Control 1 «cuenta no mapeada»La cuenta contable Flexxus no tiene tipo GS asignadoConfiguración → Mapeo Flexxus; no bloquea, pero conviene mapear
Control 1/4 en naranja pero kg/precio OKTipo o chofer no coincidenSe puede confirmar igual: queda registrado el desvío para auditoría
Consignación: faltante ≠ 0El botón Confirmar de imputación no se habilitaAjustar bolsas hasta imputar exactamente el total; usar «negativo» si va en descubierto

Editar logística, ajustar, imprimir, anular y forzar

AcciónQué haceCuidados / escenarios
Editar logística de la OCCambia transporte/chofer/fechas/tarifa de toda la ordenPuede reajustar cantidades de los pedidos incluidos
Imprimir OCGenera el PDF de la orden de carga para el chofer
Ver detalleMuestra pedidos, artículos y logística de la orden
Anular orden de cargaDisuelve la agrupación y devuelve los pedidos a PendientesRestituye 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 cierreCierre 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 cumplidos
Historial de pedidos cumplidos

Historial de pedidos cerrados, con filtros, detalle por pedido y exportación a Excel.

Devolución de cliente (proceso completo)

Qué es una devolución y qué NO hace

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: historialCargas no 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

Secuencia exacta de una devolución
Cumplidos → ↩️ (si hubo varios camiones) elegir cuál cálculo del tope a devolver confirmación con números formulario MODO DEVOLUCIÓN confirmar → ingreso → stock repuesto
  1. 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.
  2. 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.

  3. 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.
  4. 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:
    Formulario en modo Devolución de Cliente
    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.CLIENTE y las observaciones ya traen «Devolución de <MW> / NP <número>».
  5. 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.
    Confirmación final de la devolución
    Última revisión: se va a crear un ingreso que repone stock
  6. Al confirmar, en una transacción atómica (crearDevolucionTransaccional) el sistema: (a) crea el movimiento de ingreso (esDevolucionCliente: true, ligado al MW de venta por mwVentaOrigenId); (b) incrementa cantidadDevueltaAcum en el movimiento de venta original (solo metadato de trazabilidad: no cambia su cantidad ni su fecha); (c) escribe un documento en devoluciones_ventas; (d) el servidor recalcula los stock_snapshots y suma la mercadería de vuelta.

Ejemplos: devolución TOTAL y devolución PARCIAL

Ejemplo A — Devolución TOTAL (el cliente rechaza todo el camión)

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, cantidadDevueltaAcum del 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.
Ejemplo B — Devolución PARCIAL (el cliente devuelve solo lo dañado)

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 cantidadDevueltaAcum queda en 5.000. Se puede repetir hasta agotar los 25.000 kg.
Límites y cómo corregir un error

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ónEscribeEfecto en cadena
Crear pedido (manual / confirmar OC)pedidosVenta (+ pedidosImportados si vino de Excel)Aparece en Pendientes
Generar orden de cargaordenesCarga + update/insert en pedidosVenta (split)WhatsApp al chofer; pedido a EN_CARGA
Despacharmovimientos (egreso)Trigger de stock recalcula stock_snapshots; pedido a CUMPLIDO
Anular orden de cargapedidosVenta (restitución), borra hijosWhatsApp de cancelación; pedidos vuelven a Pendientes
Anular saldopedidosVenta (CUMPLIDO, saldo 0)No mueve stock
Devoluciónmovimientos (ingreso) + cantidadDevueltaAcumTrigger repone stock
Regla de oro: el stock lo recalcula el servidor

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.

Reglas de negocio a tener presentes

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.

Comercial

Cotizaciones

Gerente Actualizado: 2026-05-18

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.

Dónde encaja en el circuito comercial
Parámetros + Tarifario + Compras (PPP) Cotizador (wizard 3 pasos) PDF de oferta al cliente cotizaciones_historial si acepta → Pedidos & Ventas

Conceptos base (leer antes de cotizar)

ConceptoQué 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 ingresoCosto de traer el azúcar a planta. Se carga en datos de compra.
Flete de salida / distribuciónCosto 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.
PlazoDías de financiación. El cálculo base es a contado (plazo 0); con una tasa única se derivan los demás plazos.
TNA / TEMTasa con la que se financia el plazo. Default en Parámetros, ajustable por cotización.
Margen y semáforoRentabilidad de la venta. Se compara contra los umbrales de Parámetros (margen mínimo de alerta y margen objetivo).

Solapa «Parámetros»

Parámetros de cotización
Parámetros base — se cargan una vez y el cotizador los usa siempre

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áforomargen mínimo (debajo = alerta) y margen objetivo (la meta comercial).
Cargar Parámetros primero

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

Cotizador — wizard paso 1
Paso 1 — Setup de la cotización

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

  1. Cliente (buscador inteligente) y sucursales de destino.
  2. 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).
  3. 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).
  4. Distribución: flete de salida al cliente (del Tarifario) y deducciones comerciales.
  5. Plazo de cotización: chips con presets 0 / 30 / 60 / 90 o un valor custom (0–365 días).
  6. Vigencia de la oferta (desde / hasta) y modo de cálculo.
  7. Checkbox «Incluir Especialidades»: agrega el anexo de productos de Endulzantes a la oferta (ver solapa Especialidades).

Paso 2 — Artículo (iterativo)

Análisis por artículo
Paso 2 — análisis de precio y margen por artículo

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.

Semáforo en rojo

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

Resumen y oferta PDF
Paso 3 — resumen consolidado y oferta para el cliente

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).

El PDF de oferta

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.

De dónde sale el costo

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».
Por qué se permite acá y no en stock

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»

Cotización de Especialidades
Carga de precios FOB de productos de Especialidad

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»

Historial de cotizaciones
Cotizaciones emitidas — reabrir, reimprimir o usar como base

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

EscenarioCómo se hace
Venta a contado, un productoPaso 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 ofertaMulti-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 definidaSe cotiza el artículo genérico. La marca se resolverá recién en la Orden de Carga del pedido.
Oferta de azúcar + EspecialidadesSe tilda «Incluir Especialidades» en paso 1; el PDF agrega el anexo con productos e imágenes.
Recotizar a un clienteHistorial → usar una previa como base → ajustar precio/plazo → reemitir.
Costeo con compras recientesBotón «PPP 30d» + lupa de composición para justificar el costo ante una negociación.

Errores y validaciones comunes

SíntomaCausa / 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 bajoNo hay tarifa para ese destino/transporte en el Tarifario. Cargar la tarifa comercial o revisar el destino.
Semáforo siempre rojoPPP alto (compras caras), flete mal cargado, o umbrales de Parámetros mal seteados.
PPP vacíoNo hay compras en los últimos 30 días. Cargar el costo manualmente o revisar Compras.
El PDF no muestra imagen del productoEl artículo no tiene imageUrl cargada en ABM → Artículos.

Flujo de datos

ColecciónRol
cotizaciones_parametrosEscribe/lee — variables de cálculo y umbrales del semáforo
cotizaciones_especialidadesEscribe/lee — precios FOB de Especialidad
cotizaciones_historialEscribe al guardar — cotizaciones emitidas
compras_azucar, tarifas, tarifas_cotizacion, endulzantes_articulos, articulosSolo lectura — PPP, fletes, productos e imágenes
No reserva mercadería

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.

Comercial

Compras & Consignación

GerenteOperativoOperativoComercial Actualizado: 2026-05-18

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.

Pantalla principal de Compras y Consignación
Pantalla principal: stock contable + tarjeta de consignación con solapas

La pantalla principal

Cabecera «Compras & Consignación» / «Stock contable de azúcar propio y en consignación», con tres botones:

BotónQué 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:

TarjetaQué muestraClic
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/otrosAbre el detalle de movimientos «otros»
Señales visuales que hay que saber leer

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»:

SolapaQué 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

Paso 1 del asistente de nueva compra
Paso 1: elegir el tipo de compra
TipoCuándoTitular
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»
Pre-armado desde Flexxus (si el Bridge está online)

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)

Selector de Órdenes de Compra de Flexxus
«Importar desde Orden de Compra» — OCs reales de Flexxus, filtradas por los códigos MP

El modal «Importar desde Orden de Compra» (con el logo de Flexxus) lista las OCs recientes:

  1. Rango: botones 7 d / 30 d / 60 d (default 30).
  2. 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.»
  3. 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.
    A la derecha, kg, bolsas y monto. Badges posibles: YA RECIBIDA, PARCIAL n/n kg, ANULADA.
  4. El contador arriba dice cuántas OCs hay y cuántas se ocultaron por estar ya vinculadas a otra compra.
  5. Clic en una OC → trae su detalle de Flexxus y pre-rellena el Paso 2. «← Cargar manualmente (sin bridge)» sigue sin Flexxus.
Estado del bridge Flexxus offline
Si el Bridge no responde: aviso claro y opción de carga manual
«Bridge Flexxus no disponible»

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.

Qué precarga exactamente desde la OC

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

  1. 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.
  2. Proveedor / Comitente (buscador inteligente). La etiqueta es «Comitente» en consignación, «Proveedor» en propia/AZEF.
  3. Fecha (default hoy) y N° OCA (ej.: 1234).
  4. Artículo (Materia Prima) (buscador, solo categoría MP).
  5. Cantidad: bolsas y kg con recálculo bidireccional (1 bolsa = 50 kg).
  6. Precio Final por Bolsa — con IVA; muestra el total en vivo.
  7. Observaciones (opcional).
  8. «Revisar →».
Validaciones exactas (mensajes que vas a ver)

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».

Compra a cañero = commodity (decisión consciente)

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»:

  1. Crea el documento en compras_azucar (tipo, modoAfectacion, propietario, OCA, bolsas/kg, precios, saldoConsumidoKg: 0, estado activo, y flexxusOC si vino de Flexxus).
  2. Cesión programática: crea dos movimientos (salida del cedente + ingreso a MOYCO SRL), guardados en la compra como cesionSalidaId / cesionIngresoId. El stock lo recalcula el servidor.
  3. 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.»
  4. Mensaje de éxito: «✅ Compra OCA <oca> y cesión registradas exitosamente. Salida: … · Ingreso: …».
Escenario: comitente con descubierto (vendió sin OCA)

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

Toda compra dispara un mail — el sistema te pregunta antes

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ó.

Ejemplo del mail de notificación de compra
Ejemplo del correo que reciben adrian / veronica / jose / hernan @azucel.com

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).
Re-enviar el mail

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

Detalle de una OCA de consignación
Detalle de OCA: saldo, movimientos imputados y barra de 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ónQuiénQué hace / texto clave
Liquidar OCAGerenteConfirma y marca como liquidada (consume todo el saldo). «…pasará a la pestaña 'Sin Saldo'. Esta acción es reversible editando el registro.»
Ajustar SaldoGerentePrompt del saldo pendiente en bolsas; valida número ≥ 0 y ≤ original; doble confirmación. Corrige descuadres de imputación
Imputar DescubiertosGerenteModal 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ónGerenteSolo OCAs origenNegativo. Calcula los kg desde los MW vivos (no se pregunta), desliga movimientos y restaura los descubiertos
Dar por finalizadaGerenteCompra «a recibir» con recepción parcial: pide motivo, crea un MW de ajuste por lo no recibido y cierra la OR (estado CARGADA)
Anular compraGerenteTriple confirmación (ver abajo). Revierte la cesión y, si corresponde, borra la OR
Re-enviar MailTodosReenvía la notificación marcada «Re-Envío»
Vincular / Desvincular FlexxusTodosAsocia/quita una OC del ERP a posteriori (ver abajo)
Anular compra completa — triple confirmación

(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».

No se puede anular el MW de cesión desde Movimientos

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)

Modal de confirmación de cruce GS vs Flexxus
«Confirmar vinculación»: cruce GS Moyco vs Flexxus, con bloqueo por incompatibilidad
  • 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 detectadaColorResultado
Δ kg ≤ 50 kg y CUIT coincideVerde ✓ COMPATIBLESe puede vincular
Δ kg entre 50 y 500 kgÁmbar ⚠ Δ … kgSe puede vincular con advertencia
Δ kg > 500 kg o CUIT distintoRojo ⛔ INCOMPATIBLEBloqueado — botón «Confirmar y vincular» deshabilitado
Bloqueo por CUIT y por diferencia de kilos

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.

Ejemplo de cruce

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.

Por qué existe «Ajustar Saldo» y la auditoría

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ónEscribeEfecto en cadena
Confirmar compracompras_azucar + 2 movimientos (cesión)Trigger recalcula stock_snapshots y stock_balance/azucar; ofrece mail (Cloud Function → compras_notificaciones)
Imputar descubiertosTransacción sobre compras_azucar + religado de movimientosSube saldo consumido; negativos → liquidado
Liquidar / Ajustar saldocompras_azucar.saldoConsumidoKgCambia el saldo disponible
Finalizar parcialmovimientos (MW ajuste) + ordenesCarga (OR → CARGADA)Cierra recepción incompleta
Anular completaReversa de cesión + compras_azucar.estadoCompra='anulada'Trigger recalcula stock
Vincular / Desvincular Flexxuscompras_azucar.flexxusOCSolo referencia — no toca la compra ni el stock
Regla de oro
Confirmar compra compras_azucar + cesión trigger de stock snapshots / balance Cloud Function → mail

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.

Operaciones

Stock General

GerenteOperativoOperativoComercial Actualizado: 2026-05-18

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.

Stock General — escritorio
Escritorio: «Por Propietario» (izquierda) y «Por Depósito» (derecha)

100 % lectura — el stock no se corrige acá

Esta pantalla nunca escribe

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)

  1. Buscador «Buscar cliente o empresa...»: filtra en vivo por nombre.
  2. Casilla «Ver Ceros»: por defecto oculta las cuentas con saldo ≈ 0; al tildarla las muestra.
  3. Tabla con Propietario · Existencia (Kg) · Bolsas (Est.) · Acción. «Bolsas (Est.)» = kilos ÷ 50 redondeado para abajo.
  4. Si una cuenta tiene saldo negativo, la fila se pinta de rojo (señal de revisar ese propietario).
  5. Clic en cualquier fila (o en la flecha ) → abre el detalle de ese propietario.
Las cuentas «MOYCO» se consolidan en una sola fila

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.

«Datos del servidor (HH:MM)» vs «Datos en Vivo»

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

Detalle de movimientos de un propietario
Detalle: los movimientos que componen el saldo
  1. Encabezado con el nombre del propietario y botón «Volver».
  2. Buscador local «Filtrar movimientos...»: filtra la lista ya cargada por ID, fecha o remito.
  3. Tabla ID · Fecha · Tipo · Destino/Proc · Artículo · Kg · Documentos. «Tipo» es un badge INGRESO (verde) o SALIDA (rojo).
  4. Paginación: trae los 30 movimientos más recientes; el botón «Cargar historial antiguo» / «Cargar más antiguos» trae 30 más.
  5. 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. Archivo Stock_<Titular>_<fecha>.xlsx. Si no hay nada cargado avisa «No hay movimientos cargados para exportar.».
Si pide un índice de Firestore

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

100 % lectura
Compras / Movimientos / Producción / Ventas trigger del servidor stock_snapshots / dashboard_kpis Stock General (solo muestra)

Lee dashboard_kpis/main (resumen), stock_snapshots (fallback en vivo), movimientos (para el detalle) y las maestras para resolver nombres. No escribe absolutamente nada.

Operaciones

Stock Pallet

GerenteOperativoOperativoComercial Actualizado: 2026-05-18

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.

Stock Pallet
Stock Pallet — Stock Físico

Solapa «Stock Físico»

  1. La grilla lista los pallets a partir de los snapshots de pallet, con su artículo, formato y cantidad.
  2. Filtros por artículo/ubicación; botón para reiniciar el filtro.
  3. 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ónRol
pallet_snapshotsLectura — saldo físico de pallets
vales / gestionesValesEscribe/lee — vales de pallets y su gestión
palletsFacturadosLectura — conciliación contra facturación
movimientos, pedidosVentaLectura — altas y salidas que afectan pallets
Separado del stock a granel

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).

Operaciones

Movimientos de Stock

GerenteOperativoOperativoComercial Actualizado: 2026-05-18

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.

Listado de Movimientos de Stock
El listado: barra de acciones arriba, histórico abajo
Qué ve cada rol

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

ElementoQué hace
Buscador «Buscar ID, Remito, Factura, Cliente...»Filtra localmente los 50 cargados mientras escribís
Botón database / EnterBú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ónPara quéSección
Recepción (verde)Recibir mercadería de Órdenes en tránsitoWizard de Recepción
Despacho OC (índigo)Procesar la salida de una Orden de Carga activaDespacho 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 4Cesión de Stock
Pase Polvos (ámbar)Pase intersectorial Azúcar ↔ División PolvosPase 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ónQué 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 (alta manual)
Paso 0 del alta manual: 4 opciones (incluye Orgánica)

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.

Coherencia Orgánica (estricta en ingresos / internos)

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

  1. Propietario y Destino / Procedencia (obligatorios, buscadores inteligentes).
  2. 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.
  3. 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.
  4. Transporte, chofer y provincia/localidad cuando aplica.
Controles automáticos al guardar
  • 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)

Wizard de Recepción de mercadería
Recepción de Mercadería — Paso 1: elegir el titular

Recibe la mercadería de Órdenes que están en tránsito (estado «GESTIÓN»).

  1. 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.».
  2. 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).
  3. 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.».
  4. 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

Seleccionar Orden de Carga para despachar
Selector de Órdenes de Carga activas

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

Pase Interno entre depósitos
Pase Interno: mover stock de un depósito a otro

Mueve mercadería entre depósitos sin cambiar el dueño (sigue siendo MOYCO).

  1. 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.
  2. Valida: campos obligatorios completos y «Origen y Destino deben ser diferentes.».
  3. Vista previa «Confirmar Pase» (Sale de / Entra a / cantidad / costo) → «Confirmar».
  4. 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

Cesión de Stock entre propietarios
Cesión de Stock (sobre depósito AZUCEL 4)

Transfiere stock de un propietario a otro (cambio de titularidad en AZUCEL 4).

  1. Fecha, Orden (opcional), Artículo, Cedente (Sale), Receptor (Entra), Cantidad, Observaciones.
  2. Valida campos y «Cedente y Receptor deben ser distintos.».
  3. 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».
  4. 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

Pase a División Polvos
Pase a Div. Polvos (ámbar) — mapea el artículo de azúcar al insumo de 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.

Requisitos

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)

  1. 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.
  2. «Ver resumen»: panel rojo «Sale de Azúcar» + panel verde «Entra a Div. Polvos» → «Confirmar Pase».
  3. Valida stock en el depósito de azúcar («Stock insuficiente en depósito… Disponible / Solicitado»).
  4. 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 en pases_polvos. Éxito: «✅ Pase registrado correctamente. Azúcar: MW… (Salida) · Div. Polvos: MED… (Ingreso) · Pase ID: PASE…».

Devolución a Azúcar (desde Polvos)

  1. 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.
  2. Valida el saldo del lote («Stock insuficiente en lote… Disponible»).
  3. «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 en pases_polvos. Éxito: «✅ Devolución registrada correctamente…».
Atómico: o se confirman los dos lados, o ninguno

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…»
Modal de anulación segura

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.

Anular un despacho de venta = anulación en cascada

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

Ficha Técnica de un movimiento
Ficha Técnica: participantes, logística, documentos y auditoría

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.).

Las salidas salen en negativo en el Excel

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ónEscribeEfecto
Alta de movimientomovimientos (1 doc; 2 en pase/cesión; N en múltiple)Trigger recalcula stock_snapshots
Wizard de recepciónmovimientos + ordenesCarga (saldo/estado/historial)Stock recalculado; la Orden avanza/cierra
Pase Interno / Cesión2 movimientos vinculados (PASE INTERNO / TRASPASO)Stock recalculado en ambas puntas
Pase / Devolución PolvosTransacción: movimientos + endulzantes_movimientos + pases_polvosStock recalculado en ambos sectores (insumos vía Cloud Function)
AnularReversa del MW (si no está bloqueado); cascada si es despachoTrigger recalcula stock; pedidos vuelven a «En Carga»
Regla de oro

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.

Operaciones

Producción

GerenteOperativoOperativoComercial Actualizado: 2026-05-18

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:

RolParte DiarioParte SemanalPlanificaciónInsumos
1, 3, 4 (operativo / gerencia)Crear / Editar / Eliminar / Ver / PDFCrear / Editar / Eliminar / Ver / PDFAcceso completoAcceso completo
2 (admin limitado)Solo Ver y PDF (sin «Nuevo» ni Editar/Eliminar)Crear / Ver / PDFCompletoCompleto
5 (Ventas, solo lectura)Solo Ver y PDFSolo Ver y PDFNo ve la solapaNo ve la solapa
Hub de Producción — Parte Diario
Hub de Producción, solapa «Parte Diario» (Historial de Partes)

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.

Solo se edita/elimina el último parte

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

  1. Botón «Nuevo Parte Diario». El sistema calcula el correlativo siguiente (PD000001, PD000002… — el máximo conocido + 1).
  2. 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.
  3. 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

Parte Diario — Paso 1 Ingresos
Paso 1: se tildan los movimientos de ingreso del día

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).».
  • Paso 2 — Egresos

    Parte Diario — Paso 2 Egresos
    Paso 2: los movimientos de salida (consumos / devoluciones)

    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)

    Parte Diario — Paso 3 Stock MP
    Paso 3: Stock MP — el Consumo se calcula solo (Stock Final editable)

    Tabla por artículo de MP con: S. Inicial, Ing (+), Egr (−), Stock Final Físico (editable) y Consumo.

    De dónde sale el Stock Inicial

    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.

    Fórmula del Consumo (MP)

    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)

    Parte Diario — Paso 4 Stock PT
    Paso 4: Stock PT — acá el cálculo es la Producción del día

    Misma tabla para los artículos PT, pero acá el cálculo es de Producción:

    Fórmula de la Producción (PT)

    Producción = (Stock Final + Egresos) − Stock Inicial − Ingresos

    Paso 5 — Confirmar

    Parte Diario — Paso 5 Resumen y Confirmar
    Paso 5: KPIs, gauge de desvío, tendencia y análisis por tipo

    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:

    • 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».
    Qué pasa al «Confirmar y Guardar»

    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.

    Eliminar un Parte Diario revierte todo

    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ónQué hace
    Ver Detalle TécnicoAbre el parte en solo lectura, directo al resumen (paso 5)
    Descargar PDF OficialGenera el PDF «PARTE DIARIO DE PRODUCCIÓN» (KPIs, análisis por tipo, detalle MP y PT, firmas)
    EditarReabre el asistente (solo el último parte)
    EliminarBorra y revierte (solo el último parte)
    Cargar registros anterioresPaginación: 30 más, orden por fecha desc.

    Parte Semanal — paso a paso

    Parte Semanal — Historial de Cierres
    Solapa «Parte Semanal»: Historial de Cierres Semanales

    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.

    Un parte diario vive en un solo cierre

    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

    1. Paso 1 — Fechas: «Fecha Desde» y «Fecha Hasta» del período a cerrar.
    2. 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.
    3. 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.
    4. 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».

    Las pantallas de los 7 pasos, en orden:

    Parte Semanal — Paso 1 Fechas
    Paso 1 — Fechas: período a cerrar
    Parte Semanal — Paso 2 Partes Diarios
    Paso 2 — Partes Diarios libres a consolidar (se tildan)
    Parte Semanal — Paso 3 Insumos Primarios
    Paso 3 — Insumos Primarios (con semáforo Rend. Actual vs Histórico)
    Parte Semanal — Paso 4 Insumos Secundarios
    Paso 4 — Insumos Secundarios (misma tabla, otra categoría)
    Parte Semanal — Paso 5 Insumos Generales
    Paso 5 — Insumos Generales
    Parte Semanal — Paso 6 Insumos Mecánicos
    Paso 6 — Insumos Mecánicos
    Parte Semanal — Paso 7 Resumen
    Paso 7 — Resumen: KPIs y tablas de insumos con semáforo · «Confirmar Cierre»
    Fórmulas del Parte Semanal

    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.

    Indicadores que alimentan el Inicio

    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)

    Planificación de Producción
    Planificación: Ayer (real) + 7 días proyectados

    Arma un plan rodante: Ayer (real, fijo) + 7 días proyectados (omite domingos). Cruza la demanda de pedidos con la producción planificada.

    • Toma los pedidos en estado AUTORIZADO, CARTERA y EN_CARGA y 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> en planificacion_produccion. «PDF» exporta el rolling forecast con el total por día y de la semana.

    Insumos

    Stock Actual de Insumos
    Stock Actual de Insumos (del último Parte Semanal)

    Muestra el stock actual de insumos tomado del último Parte Semanal cerrado (no de movimientos). Es de solo lectura.

    • 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.».

    Flujo de datos

    ColecciónRol
    partesDiariosEscribe — parte del día; lee el anterior para el stock inicial
    partesSemanalesEscribe — cierre semanal (correlativo atómico counters)
    movimientos / stock_snapshotsLee ingresos/egresos del día; escribe los ajustes automáticos de merma/ganancia
    planificacion_produccionEscribe — plan rodante por semana ISO
    pedidosVentaLee — demanda (AUTORIZADO / CARTERA / EN_CARGA)
    articulos, insumosLee — catálogos (tipo, presentación, artículo vinculado, stock mínimo, valor)
    Regla de oro

    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.

Operaciones

Calidad & Trazabilidad

GerenteOperativoComercial Actualizado: 2026-05-18

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.

Calidad y Trazabilidad
Biblioteca de protocolos de calidad

Estándares (biblioteca de protocolos)

  1. 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).
  2. Cada estándar de la lista se puede Editar (reabre el editor con los datos) o Eliminar (pide confirmación «¿Eliminar este estándar?»).
  3. 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ónRol
quality_standardsEscribe/lee — los estándares/protocolos
quality_recordsRegistros de control de calidad asociados
movimientos, compras_azucar, pedidosVentaLectura — para reconstruir la trazabilidad del lote
Definir antes de controlar

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.

Operaciones

Órdenes de Azúcar

GerenteOperativoOperativoComercial Actualizado: 2026-05-18

Ó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»).

La «Orden de Cañero»: pensala como un cheque de azúcar

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á.

Dónde encaja la Orden de Carga en el circuito
Ingenio emite orden a un cañero Ingreso en este módulo (Cartera) A Logística (Gestión) Wizard de Recepción → Movimiento de ingreso Baja el saldo · entra el stock Saldo 0 → Cargada (historial)
Órdenes de Azúcar
Hub de Órdenes — botonera de estados con contadores y listado paginado

Conceptos base (leer antes de operar)

ConceptoQué 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ículoQué tipo de azúcar ampara la orden (del maestro articulos).
Cantidad OriginalEl «monto» total del cheque, en kg. Se fija al ingresar la orden.
Cantidad PendienteEl saldo que aún no se retiró. Arranca igual al original y baja con cada recepción.
Historial de CargasCada recepción parcial deja una entrada (fecha, remito, movimiento, kg). Es la «trazabilidad del cheque».
EstadoCARTERA (pendiente de gestionar) → GESTION (en logística / en tránsito) → CARGADA (saldo 0, finalizada).
Origen de creaciónmanual (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»).

EstadoColorQué significa
En CarteraNaranjaOrden ingresada, todavía sin gestionar con logística. Es la bandeja de entrada.
Logística (Gestión)VioletaYa se está trabajando el viaje / el retiro. Solo desde Gestión se puede recibir mercadería (el Wizard busca órdenes en GESTION).
Finalizadas (Cargada)VerdeSaldo en 0. La orden se «cobró» entera y pasa al histórico.
Contadores optimizados

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

Modal Nueva Orden de Carga
Modal «Nueva Orden de Carga» — el alta de la orden de cañero

Botón «Ingresar Orden» (azul, arriba a la izquierda). Se completa:

  1. N° de Orden — el número del documento que emitió el ingenio (ej. 004599). Es la identificación del «cheque».
  2. Cantidad (Kg) — el monto total amparado por la orden.
  3. Emisor (Ingenio / Origen) — buscador inteligente sobre destinos: el ingenio que emite.
  4. Propietario (Titular) — buscador sobre propietarios: el cañero a cuyo nombre está la orden.
  5. Artículo / Producto — qué azúcar ampara.
  6. 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.

Editar una orden ya con cargas

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' y compraId vinculado (back-ref en compras_azucar.ordenRecepcionId).
  • Arrastran el tipo contable de la compra (tipoAzucarCompra: Consignación / Propia / AZEF).
No se pueden mezclar tipos en una misma recepción

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ónQué haceDisponible en
A LogísticaMueve 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)
DevolverAcción inversa: la orden vuelve a Cartera y se limpia la instrucción.Gestión
Ver detalleAbre la orden con progreso, historial de cargas y notas. Clic en cualquier fila.Todas
EliminarBorra la orden por completo. Solo si no tuvo ninguna carga. Pide tipear «ELIMINAR».Cartera (sin cargas)
Cerrar saldoSi 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 ExcelBaja el listado del estado actual (N° Orden, Emisor, Propietario, Artículo, Total, Pendiente, Estado).Todas
Eliminar vs. Cerrar saldo

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»

Detalle de la orden
Detalle — Emisor, Propietario, barra de progreso y cada carga parcial

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

Wizard de Recepción
Wizard de Recepción — agrupa por Titular y descuenta el saldo

Es el flujo por el que la mercadería entra físicamente y se descuenta el saldo. Solo trabaja sobre órdenes en GESTION.

  1. Paso 1 — Titular: el sistema trae todas las órdenes en tránsito y se elige el Propietario para agrupar.
  2. 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.
  3. 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.
La orden no mueve stock — el movimiento sí

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

EscenarioCó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 retiroTildar en Cartera → «A Logística» con la instrucción del viaje. Pasa a Gestión.
Llega un camión con parte de la ordenWizard 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 restanteAcció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ónAl anular el movimiento, el saldo vuelve solo a la orden y esta regresa a Gestión.
Entra azúcar compradaLa Orden de Recepción la genera la Compra automáticamente, ya en Gestión, lista para el Wizard.

Errores y validaciones comunes

SíntomaCausa / 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 muestraEl 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 eliminarLa orden ya tuvo cargas: en lugar de eliminar se ofrece «Cerrar saldo».
El stock no cambió al pasar a LogísticaEs correcto: pasar a Gestión es administrativo. El stock entra con el movimiento del Wizard.

Flujo de datos

ColecciónRol
ordenesCargaEscribe/lee — alta, cambios de estado, saldo e historial de cargas
compras_azucarLee/escribe back-ref — origen de las Órdenes de Recepción automáticas
movimientosVínculo — el movimiento de recepción descuenta el saldo y la anulación lo restituye
destinos, propietarios, articulosSolo lectura — Emisor, Titular y Artículo
dashboard_kpis/mainSolo lectura — contadores de las tarjetas (1 lectura)
La orden es el respaldo, no el stock

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.

Logística

Centro de Tráfico

GerenteOperativoOperativoComercial Actualizado: 2026-05-18

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.

Centro de Tráfico
Radar de tráfico — vista Salidas

Vista «Salidas» (outbound)

Tablero por columnas con los despachos clasificados por estado temporal. Cada columna tiene su contador:

Columna / KPIQué agrupa
AtrasadosViajes cuya fecha ya pasó y no se cerraron (rojo)
Descargan HoyViajes con descarga programada para hoy
Próximos DíasViajes 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

  1. Se alterna entre Salidas y Cargas con las pestañas superiores.
  2. Botón «Actualizar Radar»: recarga los datos (también se refresca solo al entrar).
  3. 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.

Logística

Fletes y Liquidaciones

GerenteOperativoOperativoComercial Actualizado: 2026-05-18

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.

Hub del Centro de Logística
El hub: 4 caminos + el historial de liquidaciones abajo

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á.

TarjetaPara qué esCuándo se usa
Conformar RemitosAuditar que el viaje se entregó y el remito está firmado/conformeApenas el camión descarga
Flete CortoLiquidar viajes de ingreso (entrada de materia prima / cosecha)Para pagar fletes de entrada
Flete LargoFacturar y liquidar viajes de salida (entregas a clientes)Para facturar y pagar fletes de venta
Mov. de BolsasLiquidar a terceros la estiba / paletizado / trasbordo de bolsasPara pagar mano de obra de bolsas
Idea clave: el «embudo» de cada viaje

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.

Recorrido completo de un viaje de salida
Viaje (movimiento) Remito conformado Factura del transporte (FF…) Liquidación / pago (LF…)

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:

EstadoQué significa
EN TRÁNSITOEl 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 FINALDocumentación auditada y aprobada
Pantalla de Auditoría de Remitos
Auditoría de Remitos: pestañas, filtros, búsqueda exacta y tabla

Conformar un lote de remitos

  1. Hub → tarjeta «Conformar Remitos».
  2. 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).
  3. Se tildan las casillas de la izquierda de los viajes a procesar.
  4. 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).
    Es decir: para llevar un viaje desde cero hasta «Conformado Final» hay que pulsar «Confirmar» dos veces (una por cada salto del embudo).
  5. 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.
Modal de Vales de Pallets post-conformar
Paso siguiente al conformar: registro de vales de pallets

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.
Revertir y auditar

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.

Wizard de Flete Corto - paso 1
Flete Corto, paso 1: seleccionar el transportista
  1. Hub → tarjeta «Flete Corto».
  2. Paso 1 — Transportista: buscador inteligente; se elige la empresa a liquidar y «Iniciar Proceso». Si no se elige, avisa y no avanza.
  3. 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.
  4. «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.
  5. «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».
  6. «Finalizar y Guardar». Se crea la liquidación con ID secuencial tipo LF000123 y cada viaje queda marcado con ese ID (liquidacionFleteId), por lo que desaparece de la bandeja y no se puede volver a liquidar.
Ejemplo

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).

Hub de Flete Largo
Flete Largo: Facturación | Liquidación + bandeja Sin Facturar / Facturados

C.1 · Facturación de Fletes (paso a paso)

Imputar uno o varios remitos conformados a una factura del proveedor de transporte.

Facturación de Flete Largo
Facturación: selección de transporte y remitos a imputar
  1. Hub Flete Largo → «Facturación de Fletes».
  2. Transporte (buscador) → «Buscar Remitos Sin Facturar».
  3. 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.
  4. 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.
  5. 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.
  6. N° Factura del Proveedor obligatorio, formato 00000-00000000. El sistema calcula IVA 21% fijo sobre el neto.
  7. Guardar: se crea la factura con ID secuencial tipo FF000045 en 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).
Nota de Crédito (NC): qué es «NO PAGAR»

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.

Liquidación / Pago de Flete Largo
Liquidación: facturas pendientes con sus estados
  1. Hub Flete Largo → «Liquidación / Pago».
  2. Transporte (buscador) → «Ver Facturas Pendientes».
  3. 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.
    Se pueden exportar todas a Excel. Se tildan las facturas a pagar → «Siguiente: Control de Pallets».
  4. Control de Pallets (ver «El balance de pallets»).
  5. 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ón LF…, las facturas pasan a PAGADA y quedan atadas a esa liquidación.
«Factura» vs «Liquidación»: la diferencia que hay que tener clara

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:
EscenarioSignificadoQué se pide
A — Exacto (verde)Crédito = DeudaNada, balanceado
B — Deuda (rojo)El transporte queda debiendo palletsConfirmar y, opcional, N° de Factura de Pallets (o marcarla pendiente)
C — Sobrante (azul)Quedó saldo a favorSe 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.

Liquidación de Movimiento de Bolsas
Mov. de Bolsas: Cuadro Tarifario · Nueva Liquidación · Historial

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.

Cuadro tarifario de bolsas
Conceptos y su tarifa vigente; «Administrar» abre la línea de tiempo

D.2 · Nueva Liquidación

Generador de liquidación de bolsas
Nueva Liquidación: rango de fechas y selección de movimientos
  1. Pestaña «Nueva Liquidación». Elegí Desde / Hasta (máximo 30 días de rango) y «Buscar Movimientos».
  2. 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.
  3. Se tildan los movimientos (o «seleccionar todo»). Abajo se ven Seleccionados, Total Bolsas y Total a Liquidar en vivo.
  4. «Confirmar» → resumen con el total. Se ingresa el N° de Factura o se tilda «Pendiente».
  5. Confirmar liquidación: se genera el ID tipo LIQB-000005 en 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.

Historial de liquidaciones
Historial con filtro por transporte y acciones por liquidación
  • 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.
Anular una liquidación: qué revierte y qué NO

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.

Bloqueo por liquidación: cómo se relaciona con Movimientos de Stock

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ónEscribe / marcaEfecto
Conformar remitomovimientos.remitoConformadoAvanza el embudo; al finalizar puede crear vales y ajustar pallet_snapshots
Liquidar Flete CortoliquidacionesFletes (LF), movimientos.liquidacionFleteIdEl viaje sale de la bandeja y queda pagado
Facturar Flete LargofacturasFletes (FF), movimientos.facturaFleteIdEl remito pasa de «sin facturar» a «facturado»
Liquidar Flete LargoliquidacionesFletes (LF), facturasFletes → pagada, pallet_snapshots, valesLa factura queda pagada con su control de pallets
Liquidar BolsasliquidacionesBolsas (LIQB-), movimientos.liquidacionBolsaIdMovimientos atados con tarifa/subtotal congelados
Anular liquidaciónLibera movimientos y vales; borra/anula la liquidaciónLos viajes vuelven a estar disponibles (ver caja de advertencia)
Regla de oro

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.

Logística

Tarifario de Fletes

GerenteOperativoOperativoComercial Actualizado: 2026-05-18

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.

Para qué existe el Tarifario
Cargo / actualizo tarifas ($/Tn) El sistema las busca por transporte+localidad Autocompleta el flete en Pedido / OC / Movimiento El uso real marca la tarifa como «vigente» Análisis detecta desvíos y faltantes

Conceptos base (imprescindible)

ConceptoQué es
TarifaDocumento 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: LocalidadTarifa puntual de una ciudad exacta. Es la de máxima prioridad.
Alcance: ZonaTarifa plana para toda una zona tarifaria (anillo de distancia). Cubre cualquier localidad de esa zona si no hay tarifa puntual.
Vigencia por modificaciónHace cuánto se creó o editó el valor (updatedAt).
Vigencia por usoHace cuánto se aplicó por última vez a un cargamento real (lastUsedAt).
Edad efectivaLa más reciente entre las dos: una tarifa editada hace 45 días pero usada ayer sigue vigente.
$/Tn·KmTarifa dividida por los km al destino. Normaliza el precio para comparar destinos lejanos vs. cercanos.
Dos tarifarios distintos — no confundir

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):

EstadoEdad efectivaSignificado
VIGENTE (verde)≤ 30 díasPrecio confiable, se puede usar tal cual.
PRONTO A VENCER (amarillo)31–60 díasSigue sirviendo pero conviene confirmarla.
VENCIDA (rojo)> 60 díasSospechosa: renegociar / actualizar antes de comprometerla.
SIN DATOS (gris)Sin fecha de modificación ni de uso.
Por qué la «vigencia por uso» importa

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

Tarifario — Consulta
Consulta on-demand: filtros inteligentes + tabla con vigencia y origen

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:

  1. EXACTA — tarifa puntual de esa localidad + transporte. Sin badge: es la buena.
  2. Otros transportistas — misma localidad, otra empresa (badge REFERENCIA).
  3. ZONAL — tarifa cargada sobre la zona de esa localidad para ese transporte.
  4. REFERENCIA de zona — tarifas de localidades hermanas de la misma zona.
  5. ESTIMADA — no hay nada cargado: se calcula con el modelo km·$/Tn (ver Análisis). Solo para tipo salida.
EXACTA = se puede comprometer; lo demás = referencia

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

Modal de tarifa
Modal de tarifa — transporte, destino, tipo y valor $/Tn

Botón flotante + (abajo a la derecha, solo en Consulta) o el lápiz de una fila EXACTA. Se elige Transporte, ProvinciaLocalidad (cascada), Tipo de servicio (VENTA/COMPRA) y Valor $/Tn.

Control de duplicados

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·km ajustada sobre todas las tarifas vivas. Los puntos a más de 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.
Cómo leer un outlier

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.

Si una localidad no aparece en el mapa

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).
Prioridad en el Cotizador

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.

La misma tarifa, en tres momentos distintos
1 · Pedido (todavía sin tarifa) 2 · Orden de Carga / Logística (se asigna y se sella el uso) 3 · Movimiento de Stock (se confirma el flete del viaje)

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.

Ejemplo

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)

Asignación de logística y tarifa
Al asignar transporte a la OC el sistema busca y muestra la tarifa con su vigencia

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:

  1. Si existe: autocompleta el valor y muestra un badge de vigencia (✔ Vigente / ⚠ Nd sin actualizar / 🔴 revisar).
  2. 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).
  3. 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.
Ejemplo

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

Tarifa en el formulario de movimiento
Formulario de movimiento — campo Tarifa $/Tn autocompletado con su estado

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:

  1. Nivel 1 — Localidad exacta: «✔ Vigente (Loc)».
  2. Nivel 2 — Zona: si la localidad tiene zona y hay tarifa zonal para ese transporte → «🔗 Zona X».
  3. 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.

Ejemplo (compra / ingreso)

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):

PrioridadBase de la estimaciónConfianza
1Misma localidad, ≤30 díasAlta
2Localidad vecina ≤25 km, ≤30 díasAlta
3Localidad vecina 25–50 km, ≤30 díasMedia
4Misma zona tarifaria, ≤30 díasMedia-baja
5Mismo corredor de km (±15%), ≤30 díasMedia-baja
6Ventana ampliada a 60 días (loc/vecinas)Baja
7Sin datos suficientes → cargar manualNula
Estimar no es cargar

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

EscenarioCómo se hace
Cargar la tarifa de un nuevo destinoConsulta → botón + → transporte, provincia, localidad, VENTA, valor.
El transportista subió el precioBuscar la tarifa EXACTA → lápiz → nuevo valor. O corregirla al despachar y tildar «Actualizar Maestro».
Cliente en una localidad sin tarifaSe 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 precioCargar una tarifa de alcance Zona (cae como fallback de todas las localidades de esa zona).
Auditar tarifas viejas o carasAnálisis → filtro «vencidas» / «outliers» + gráfico de dispersión y $/Tn·Km.
Ver dónde faltan tarifas en el paísMapa → filtro «sin tarifa» (pines grises).
Una tarifa figura vencida pero el precio sigue igualUsarla en un despacho sin tildar «Actualizar Maestro»: se sella lastUsedAt y vuelve a vigente por uso.
Precio comercial al cliente para cotizarSolapa Cotización (tarifa comercial, separada de la operativa).

Errores y validaciones comunes

SíntomaCausa / 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 / ESTIMADANo hay tarifa EXACTA: es un valor de respaldo. Cargar la real de esa localidad.
Flete en 0 al despacharNo 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álisisFalta lat/lng. Correr «Enriquecer» en Análisis.
Todas las tarifas figuran vencidas de golpeSe 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 movimientoEstá 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ónRol
tarifasEscribe/lee — tarifas operativas (Consulta, Análisis, Mapa). Recibe lastUsedAt al usarse en ventas/movimientos
tarifas_cotizacionEscribe/lee — tarifas comerciales (solapa Cotización)
localidadesEscribe (lat/lng/km, zona) en Análisis · lee en todas
zonas, provincias, transportesSolo lectura — catálogos geográficos y de transporte
pedidosVenta, movimientosConsumidores — autocompletan el flete desde tarifas y sellan su uso
Regla de oro

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.

Administración

ABM Maestros

GerenteOperativoOperativoComercial Actualizado: 2026-05-18

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.

Panel principal de ABM Maestros
Panel principal: 7 tarjetas, una por catálogo

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).

TarjetaQué administraColección
PropietariosDueños del stock: clientes con stock propio, cañeros y comitentespropietarios
DepósitosUbicaciones físicas donde se guarda mercaderíadepositos
ArtículosCatálogo de productos de azúcararticulos
DestinosClientes y sus sucursales de entregadestinos (+ vendedores)
GeografíaProvincias, Zonas tarifarias y Localidadesprovincias, zonas, localidades
LogísticaEmpresas de transporte y choferes con sus patentestransportes, choferes
InsumosMateriales y envases de producción de azúcarinsumos
Tres conceptos que se repiten en TODOS los catálogos

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.

EAN, GLN y CUIT: de esto depende la importación de OC y Flexxus

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.

Listado de Propietarios
Listado de Propietarios con buscador y «Cargar más»

Alta / edición paso a paso

  1. Botón «Nuevo» (o clic en el lápiz de una fila para editar). Se abre el formulario.
  2. Nombre / Razón Social obligatorio: se guarda siempre en MAYÚSCULAS automáticamente. Ej.: INGENIO SAN JUAN S.A.
  3. CUIT: formato sugerido 30-12345678-9. Es la llave del cruce Flexxus, conviene cargarlo bien.
  4. Correo Electrónico: opcional.
  5. 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.
  6. «Guardar». El registro aparece ordenado alfabéticamente en la tabla al instante.
Ejemplo concreto

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.

Listado de Depósitos
Depósitos — alta simple de una sola línea

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.

Listado de Artículos
Artículos: miniatura, EAN, tipo, presentación, categoría y filtros

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

Formulario de alta de artículo
Formulario de artículo: imagen, códigos de barra y Flexxus
  1. 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».
  2. Nombre obligatorio. Ej.: Azúcar Ledesma Refinada 1kg.
  3. 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.
  4. 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.
  5. 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).
  6. Tipo de Azúcar: Común tipo "A" · Refinada · Orgánica.
  7. Presentación: bolsa 25 kg · bolsa 50kg · big bag · 1kg · 500g · N/A.
  8. Categoría: MP (Materia Prima) o PT (Producto Terminado).
  9. 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).
  10. «Guardar». Si subiste imagen, primero crea el artículo y después sube/reemplaza la foto.
Por qué importa la presentación

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.

Gestión de Clientes (Destinos)
Clientes: razón social/CUIT, contacto, comercial y cantidad de sucursales

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

Formulario de alta de cliente
Formulario de cliente con domicilio fiscal y sucursales
  1. Razón Social obligatorio (en mayúsculas). Ej.: SUPERMERCADOS LA ANÓNIMA S.A.
  2. CUIT y Nombre Fantasía (alias comercial; se usa también para buscar el cliente, ej. «El Super del Centro»).
  3. Email Notificaciones y Comerciales Asignados (uno o varios — casillas; el primero queda como comercial principal).
  4. Domicilio Fiscal: Calle/Ruta, N°, Provincia (desplegable), Localidad (desplegable dependiente de la provincia) y CP.
  5. 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).
  6. «Guardar Cliente».
Eliminar vs. Inactivar — el sistema decide solo

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.

Geografía: provincias, zonas y localidades
Tres columnas: Provincias · Zonas Tarifarias · Localidades
ColumnaCómo se da de altaDatos
ProvinciasBotón + → cuadro de texto pide el nombreSolo nombre
Zonas TarifariasBotón + → pide el nombre (se guarda en MAYÚSCULAS)Ej.: AMBA, NOA, GBA NORTE
LocalidadesBotón + abre un formularioNombre · 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.

Ejemplo de uso de 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.

Logística: empresas y choferes
Doble panel: Empresas | Choferes & Patentes

Empresa de transporte

  1. Botón + del panel «Empresas».
  2. Razón Social obligatorio (en mayúsculas), CUIT, Localidad, C.P. y Provincia.
  3. «Guardar». Se actualiza también el desplegable de transportes del resto del sistema.

Chofer paso a paso

Formulario de alta de chofer
Chofer: empresa, datos, WhatsApp y patentes
  1. Botón + del panel «Choferes».
  2. Empresa de Transporte obligatorio (buscador inteligente).
  3. Nombre y Apellido obligatorio (mayúsculas) y DNI.
  4. 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 guarda 549381..., listo para enviar el aviso por WhatsApp.
  5. Patente Tractor/Camión y Patente Acoplado/Semi (se guardan en mayúsculas).
  6. «Guardar Datos».
El WhatsApp del chofer no es opcional en la práctica

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)»).

Listado de Insumos
Insumos con tipo, stock mínimo y valor en USD
  1. Botón «Nuevo Insumo».
  2. Nombre obligatorio (ej. Hilo de coser).
  3. Tipo: Primario (MP) · Secundario (Envases) · General · Mecánico.
  4. Unidad (U.M.): un · kg · lt · mts.
  5. Stock Mínimo: dispara las alertas de reposición.
  6. 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).
  7. Valor (Costo USD): con hasta 4 decimales.
  8. «Guardar». Filtros disponibles: Tipo, Unidad y Vínculo.

Caché y propagación de cambios

Si no ves un alta nueva en otro módulo

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

ABM solo escribe catálogos — nunca mueve stock
ABM Maestros colección del catálogo caché del navegador buscadores / desplegables de todos los módulos

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álogoEscribe enLo consume
PropietariospropietariosCompras, Stock, cruce Flexxus (CUIT)
DepósitosdepositosMovimientos, Stock
ArtículosarticulosPedidos, Cotizaciones, Importar OC (EAN), Flexxus (códigos)
Destinosdestinos, vendedoresPedidos, Cotizaciones, Importar OC (GLN), Fletes (KM)
Geografíaprovincias, zonas, localidadesDomicilios, Tarifario / Fletes (zonas)
Logísticatransportes, choferesÓrdenes de carga, aviso WhatsApp, Fletes
InsumosinsumosProducción de azúcar, alertas de stock mínimo
Administración

Recursos Humanos

Gerente Actualizado: 2026-05-18

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.

Recursos Humanos
Módulo de Recursos Humanos

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)

  1. Importar la asistencia del período (fichadas del reloj).
  2. El sistema la consolida contra los horarios y clasifica cada día (trabajado, tardanza leve/media/grave, ausente justificado/injustificado, licencia).
  3. Se cargan novedades (sanciones, cortes de luz), licencias y turnos adicionales que ajustan el cálculo.
  4. En Gerencia → Pre-Liquidación se revisan los haberes y se cierra el período.
  5. 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:

  1. Nuevo / Editar empleado: nombre, datos y, sobre todo, ID de Reloj (la clave que vincula al empleado con sus fichadas) y su horario asignado.
  2. Al guardar, valida que el ID de Reloj no esté duplicado en otro empleado (consulta rrhh_empleados por id_reloj).
  3. 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)

  1. Feed de sanciones con buscador por empleado y un gráfico por tipo de sanción.
  2. 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.
  3. 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.

  1. Nueva asignación de turno adicional a un empleado (tipo de turno tomado de Parámetros).
  2. 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.
  3. Listas de Asignaciones activas e Histórico; se puede editar o eliminar una asignación.

Pre-Liquidación de Haberes

  1. Abre un modal con la tabla de haberes del período por empleado (días trabajados, licencias, ausencias, descuentos por conducta, plus, etc.).
  2. Toma como base el último período cerrado (rrhh_liquidaciones_cerradas, ordenado por fecha de fin) y arma el actual.
  3. Cerrar período: guarda el cierre definitivo en rrhh_liquidaciones_cerradas con su ID de período. Se puede ver o eliminar un cierre cargado.
Auto-cierre vs. cierre manual

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ñaQué define
ReglasPuntaje de conducta: descuento por ausencia injustificada, por apercibimiento, penalizaciones por tardanza (leve/media/grave)
SkillsHabilidades/competencias del personal
Tipos Turno AdicionalCatálogo de tipos de turno adicional disponibles
LegalesTextos y parámetros legales

Solapa «Comunicaciones» (hub WhatsApp)

Cuatro sub-pestañas:

Sub-pestañaQué hace
RecibosSe 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.
BandejaEstado de los envíos / mensajes encolados
ComunicarEnvío de comunicados al personal
AusentismoSeguimiento de ausencias y avisos relacionados
Publicar recibos es irreversible hacia el empleado

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ónQué guarda
rrhh_empleadosLegajos (incluye id_reloj y horario)
rrhh_horariosHorarios/turnos teóricos
rrhh_movimientos / rrhh_asistencia_consolidadaFichadas y su consolidación
rrhh_excepcionesDías con desvío respecto del horario
rrhh_turnos_adicionales (+ registros)Asignaciones y días de turno adicional
rrhh_liquidaciones_cerradasCierres de período (pre-liquidación)
rrhh_cortes_luz, rrhh_rotaciones, rrhh_bitacoraNovedades y bitácora
procesamiento_recibosSeparación de recibos por período (Comunicaciones)
avisos_rrhh, alertas_rrhh, documentos_rrhh, recibos_sueldo, cola_mensajesAvisos, alertas, documentos, recibos y cola de WhatsApp
Relación con el Inicio

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.

Administración

Configuración

Gerente Actualizado: 2026-05-18

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.

Configuración — Usuarios
Configuración de Usuarios — tabla con rol/vínculo, estado y acciones

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ñaQuiénesLogin
InternosPersonal 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.
ExternosClientes / titulares (rol 4) que entran al Portal del Cliente.Usuario + email real + cuentas de stock que podrá ver.
Dónde vive cada cosa de un usuario
Contraseña → Firebase Auth (hasheada, irreversible)· Rol / vínculo / activo → colección users· Login valida ambas

Alta de usuario

Botón «Nuevo Usuario» (crea según la pestaña activa).

Usuario interno

Nuevo usuario interno
Alta de usuario interno — nombre, contraseña inicial y rol
  1. Nombre de usuario (login): con «Juan» se crea automáticamente la cuenta juan@moyco.com en Firebase Auth.
  2. Contraseña inicial: la define el gerente (texto visible al crear). El usuario la cambiará desde Mi Cuenta después del primer ingreso.
  3. Rol: Gerente / Administración / Producción / Ventas. Define qué módulos y permisos tendrá.

Cliente externo (rol 4)

Nuevo cliente externo
Alta de cliente externo — credenciales, email y cuentas relacionadas
  1. Usuario (login) y contraseña inicial.
  2. Email real del cliente.
  3. 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».
Por qué crear un usuario no te cierra la sesión

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)

Las contraseñas NO se guardan en la base

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

Mi Cuenta
Mi Cuenta — cambio de contraseña con reautenticación

Cualquier usuario (interno o externo) tiene la pantalla Mi Cuenta para cambiar su propia contraseña. Pide:

  1. 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».
  2. Nueva contraseña (mín. 6, no puede ser igual a la actual) + confirmación. Hay botón 👁 para ver/ocultar.
«Por seguridad, cerrá sesión y volvé a entrar»

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)

No hay «¿Olvidaste tu contraseña?» en el login

El recupero no es autoservicio: lo hace el gerente desde esta pantalla. Es deliberado — el control de accesos queda centralizado.

Contraseña temporal generada
Clave temporal generada — se muestra UNA sola vez

En la fila del usuario, el ícono 🔑 (llave) «Resetear contraseña»:

  1. Pide confirmación (avisa que la clave anterior dejará de funcionar al instante).
  2. 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).
  3. 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).
  4. 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»).
Anotala antes de cerrar el aviso

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 filaQué 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ó).
Cómo se bloquea realmente el acceso

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).

El rol controla todo

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

MecanismoComportamiento
Cierre por inactividadAviso a los 119 min; cierre automático de sesión a las 2 horas sin actividad.
Login bloqueado por intentosMuchos intentos fallidos → «Muchos intentos fallidos. Espere unos minutos» (protección de Firebase).
Usuario sin perfilExiste en Auth pero no en users → «Usuario sin perfil asignado en el sistema».
Credenciales incorrectasMensaje genérico «Usuario o contraseña incorrectos» (no revela cuál falló).

Escenarios típicos (usuarios)

EscenarioCómo se resuelve
Entra un empleado nuevoPestaña Internos → Nuevo Usuario → nombre, clave inicial, rol. Se le pasa la clave y cambia en Mi Cuenta.
Alta de un cliente para el portalPestañ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 cuentaEditar (lápiz) el externo → agregar el propietario en «Cuentas relacionadas».
Cambió la función de alguienEditar → cambiar el rol. Los módulos/permisos se ajustan solos.

Errores y validaciones comunes

SíntomaCausa / 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 claveSesió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 temporalNo 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ónEscribe
Nuevo usuarioFirebase Auth (cuenta + clave) + users (rol, vínculo, activo, email)
Editar usuariousers (rol / email / stockRelacionado) — no toca Auth
Resetear contraseñaFirebase Auth (vía Cloud Function resetPassword, solo rol 1) — no persiste la clave
Cambiar mi contraseñaFirebase Auth (reautenticación + updatePassword)
Dar de baja / reactivarusers (activo, fechaBaja) — la cuenta de Auth se conserva
Ajuste de stockComposición del stock seleccionado (sin pasar por movimientos)
PeríodosConfiguración de cierre (global)
Mapeo FlexxusColección de equivalencias cuenta → tipo
Migración de líneasCampo linea en colecciones endulzantes_*
Administración

Portal del Cliente

Cliente externo Actualizado: 2026-05-18

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

Mi Stock (portal cliente)
Mi Stock — vista del cliente
  1. Muestra el stock que el cliente tiene en consignación/depósito (de stock_snapshots filtrado por las cuentas que Configuración → Usuarios le vinculó).
  2. Botón «Ver Todo» para el detalle, e «Historial Consolidado» con opción de descargar Excel.
  3. 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.

Administración

Integración Flexxus (Bridge)

GerenteOperativoOperativoComercial Actualizado: 2026-05-18

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 (8770 o 8765); 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á online y 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.
"El bridge Flexxus no está disponible"

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íneaColorSignifica
okVerdeEl artículo/cantidad/CUIT coincide dentro de tolerancia
multiAmarilloHay coincidencia múltiple o parcial: revisar manualmente
sin_matchRojoNo 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.

Bloqueo por CUIT

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

  1. Botón «Vincular Flexxus». Si la compra ya está vinculada, avisa y no continúa.
  2. Hace el chequeo de salud del Bridge. Si no está online o la base no responde, muestra el aviso y aborta.
  3. 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.
  4. Al elegir una OC, el sistema guarda en la compra un bloque flexxusOC con: 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.
  5. Se reabre el detalle de la OCA mostrando el vínculo.

Desvincular OC Flexxus

  1. Botón «Desvincular Flexxus». Si no está vinculada, avisa.
  2. Pide confirmación, aclarando que los datos de la compra GS no se modifican.
  3. Borra el bloque flexxusOC (queda en null). La OC vuelve a estar disponible para vincular en otra compra.
Quitar el vínculo durante el alta de una 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:

Lista de facturas recientes de Flexxus en el despacho
1) Facturas recientes filtradas por CUIT del cliente — la sugerida (chofer = transporte) viene resaltada
  1. 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 →.
  2. 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).
  3. 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).
  4. «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.
Detalle de factura Flexxus con los 4 controles del cruce
2) El cruce GS Moyco vs Flexxus: Control 1 (tipo), Control 2+3 (kg + precio por línea) y Control 4 (chofer/patentes)

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.

Cuándo usar posthoc

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óndeQué se escribe
Compras (vincular OCA)compras_azucar.flexxusOC = { datos de la OC } · desvincular = null
Despacho / posthocSnapshot de la factura Flexxus en el movimiento de egreso
Mapeo contableLectura de la tabla de equivalencias cuenta Flexxus → tipo GS (ver Configuración)
El Bridge nunca escribe en Flexxus

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 (Endulzantes)

División Polvos — Conceptos

GerenteOperativoOperativoComercial Actualizado: 2026-05-18

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).

Selector de negocio
Selector Azúcar / División Polvos (cambia todo el sistema al tema verde)
Hoy conviven DOS líneas: Endulzantes y Jugos

«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).
Insumos compartidos: línea «AMBAS»

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.

Detalle técnico del filtro por 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)

El stock lo calcula el servidor, nunca la pantalla

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.

El stock no puede quedar negativo

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.

Caja vs. unidad (el factor de empaque)

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.

Cómo leer el resto de este capítulo

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.

División Polvos (Endulzantes)

Inicio (Polvos)

GerenteOperativoOperativoComercial Actualizado: 2026-05-18

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.

Dashboard Endulzantes
Tablero de la División Polvos

Cómo se usa

El selector Edulcorantes / Jugos (pill superior) acota todos los indicadores a esa línea. Tarjetas:

TarjetaQué muestraAcceso
Stock Prod. TerminadoUnidades totales de PT de la línea
Demanda PendientePedidos pendientes de la línea«Ver Pedidos»
Planificación ActivaProducción planificada«Ir a Producción»
Alertas InsumosInsumos bajo el mínimo
Stock por línea / Stock CríticoBarras por producto (clic = ver lotes) y lista de insumos críticos (actual vs. mínimo)«Ver Todo»
Datos que "aún no fueron generados"

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.

División Polvos (Endulzantes)

Pedidos/Ventas (Polvos)

GerenteComercial Actualizado: 2026-05-18

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).

El circuito de punta a punta
1 · Nuevo Pedido (PVE) 2 · Pendientes 3 · Generar Orden de Carga (OCE) 4 · En Carga 5 · Despacho / Picking de lotes 6 · Cumplido· ↩️ Devolución
Pedidos/Ventas Endulzantes
Módulo Ventas (Polvos): sidebar verde con las 4 vistas y el pill de línea

Conceptos base (leer antes de operar)

ConceptoQué es
LíneaEdulcorantes o Jugos. El pill del sidebar. Todo lo que se ve y se crea pertenece a la línea activa.
ClienteA quién se le vende. Sale del maestro destinos (buscador por nombre o CUIT).
Sucursal / PlantaPunto de entrega del cliente. Define la provincia/localidad de destino (para flete y orden de carga).
ArtículoProducto terminado de la línea (endulzantes_articulos).
Caja / Bulto y factorSe 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-XXXXXXNúmero del pedido (colección endulzantes_pedidos).
OCE-XXXXXXNúmero de la Orden de Carga (un viaje). Agrupa uno o varios pedidos en un mismo camión.
Estado del pedidoAUTORIZADO (pendiente) → EN_CARGA (asignado a una OCE) → CUMPLIDO (despachado).
LotePartida física del producto. En el despacho se elige de qué lote sale cada caja.

Paso 1 — Nuevo Pedido

Formulario Nuevo Pedido
Alta de pedido: cliente, entrega y carrito de mercadería

En el sidebar, «Nuevo Pedido» (solo roles 1 y 5). Se completa en orden:

  1. Cliente: buscador inteligente por nombre o CUIT. Al elegirlo se autocompleta el ejecutivo comercial y se cargan sus sucursales.
  2. Sucursal / Planta de entrega: si el cliente tiene una sola, se preselecciona. Al elegirla se llenan solas la provincia y localidad de destino.
  3. Orden de Compra / Referencia del cliente (opcional pero recomendado) y fecha de nota.
  4. 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.
  5. El pie calcula Base imponible, IVA 21% y Total automáticamente. Se fija el plazo de cobro en días (default 30).
  6. «Generar Pedido» → pide confirmar el total → crea el pedido con número PVE-XXXXXX en estado AUTORIZADO y lleva a «Pendientes».
Ejemplo

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.

Cargar en la línea correcta

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)

Bandeja de Pendientes
Pedidos AUTORIZADOS esperando que se les arme un viaje

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ónQué hace
VerDetalle del pedido (cliente, ítems, totales).
EditarReabre el formulario con los datos cargados.
CopiarClona el pedido como uno nuevo (para recompras).
LogísticaCarga parcial de datos del viaje (transporte, chofer, fechas, tarifa) sin generar todavía la orden — útil para ir reservando el flete.
EliminarBorra 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

Mesa de Control / Generador de OCE
Se elige el cliente, los ítems a cargar y la logística del viaje
  1. Cliente: el desplegable solo muestra clientes con pedidos pendientes.
  2. 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»).
  3. Logística obligatoria: fecha de carga, empresa de transporte y chofer. Opcionales: fecha/hora de descarga, turno, patentes, tarifa $/Tn y observaciones.
  4. 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).
Ejemplo de carga parcial (split)

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)

Bandeja En Carga
Órdenes de carga armadas, agrupadas por OCE, listas para despachar

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ónQué hace
👁 Ver detalleResumen del viaje y sus ítems.
🖨 ImprimirGenera el PDF de la Orden de Carga para el transportista.
↩️ CancelarAnula la OCE: los pedidos vuelven a Pendientes (AUTORIZADO) y se desvinculan. No mueve stock (todavía no se despachó).
📤 Confirmar DespachoAbre 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.

Modal de Picking de despacho
Picking: por cada producto se asignan los lotes físicos que salen
  1. En En Carga, botón verde «Confirmar Despacho» (📤) de la orden. Abre el modal «Picking de Carga: OCE-XXXXXX».
  2. 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.
  3. 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).
  4. 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.
  5. «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).
  6. 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.
El stock lo baja el servidor — y nunca queda negativo

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.

Ejemplo completo de despacho

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.

Si te equivocaste de orden

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

Historial de cumplidos
Pedidos despachados — consulta, reimpresión 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

  1. ↩️ en el pedido cumplido → modal de devolución multi-renglón (se puede devolver uno o varios productos del pedido).
  2. Por cada renglón se confirma el lote al que vuelve la mercadería y la cantidad.
  3. 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 en endulzantes_devoluciones_ventas.
El pedido sigue CUMPLIDO

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

EscenarioCómo se hace
Venta normal de punta a puntaNuevo Pedido → Pendientes → Generar OCE (transporte+chofer+fecha) → En Carga → Confirmar Despacho → Picking → Confirmar.
El camión no entra todoEn 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 viajeEn la Mesa de Control del mismo cliente, tildar ítems de varios pedidos: todos van bajo una sola OCE.
Producto que sale de dos lotesEn el Picking, «Añadir Lote» y repartir la cantidad. Debe quedar «Completo».
Se armó mal la ordenSi no se despachó: En Carga → Cancelar (vuelve a Pendientes). Si ya se despachó: anular el movimiento o devolver.
El cliente devuelve mercaderíaCumplidos → ↩️ → elegir renglones y lote → confirmar (repone stock).
Recompra igual a una anteriorPendientes → Copiar el pedido (o Cumplidos como referencia) → ajustar y generar.

Errores y validaciones comunes

SíntomaCausa / solución
No encuentro el producto al cargar el pedidoEl 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 ControlSolo 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 despacharEs normal: lo recalcula el servidor en segundo plano (unos segundos).

Flujo de datos

ColecciónRol
endulzantes_pedidosEl pedido y su estado (AUTORIZADO → EN_CARGA → CUMPLIDO); split en cargas parciales
endulzantes_movimientosEgreso por despacho · ingreso por devolución (tipo_movimiento: DEVOLUCION)
endulzantes_articulosSolo lectura — productos, factor de empaque, lotes disponibles. El stock lo recalcula el servidor
endulzantes_devoluciones_ventasResumen de cada devolución de cliente
destinos, transportes, choferesSolo lectura — cliente, sucursales, logística
No registra cobranzas

Igual que Azúcar: el sistema solo trackea el avance logístico (AUTORIZADO/EN_CARGA/CUMPLIDO). No maneja estados de cobro/pago.

División Polvos (Endulzantes)

Movimientos (Polvos)

GerenteOperativoOperativoComercial Actualizado: 2026-05-18

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).

Movimientos Endulzantes
Pantalla principal: pill de línea, tabs Insumos/Productos, listado y acciones

Conceptos base

ConceptoQué es
Insumos vs. ProductosDos 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 movimientoINGRESO (entra stock), EGRESO / SALIDA (sale stock), DEVOLUCION (el servidor la trata como ingreso, repone stock).
LotePartida física. Si no se conoce, queda S/L (sin lote). El stock se lleva por lote.
MED-XXXXXXNúmero correlativo del movimiento (customId).
Caja / factorLos productos se operan por caja; el stock se guarda en unidades. El sistema convierte con unidadesPorBulto.
AnuladoUn movimiento no se borra: se anula (cantidad → 0) y el servidor revierte su efecto en el stock.
El stock lo recalcula el servidor, nunca esta pantalla

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

  1. Pill de línea (Edulcorantes / Jugos): cambia la línea activa y recarga el listado desde el servidor.
  2. Tabs Insumos / Productos: cambian la tabla y también qué crea el botón verde (Registrar Insumo o Registrar Producto).
  3. Buscador: filtra sobre lo ya descargado (nombre, N° MED, cliente, remito, factura, proveedor).
  4. 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.
  5. Clic en una fila → detalle del movimiento (ver más abajo).
Filtro por línea — por qué un viejo aparece en Edulcorantes

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ónQué hace
ExcelExporta 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

Modal nuevo movimiento de insumo
Alta de movimiento de insumo (compra / devolución a proveedor)

Pestaña Insumos → «Registrar Insumo». Campos:

  1. Tipo: 📥 Compra (Entrada) = INGRESO, o 📤 Devolución (Salida) = EGRESO.
  2. Fecha del movimiento.
  3. Insumo: buscador inteligente (endulzantes_insumos). Al elegirlo se muestra su unidad de medida.
  4. Cantidad en la unidad del insumo.
  5. Proveedor / Destino: buscador del ABM de proveedores (endulzantes_proveedores, lista compartida entre las dos líneas). Si no está, se acepta texto libre.
  6. Factura y Remito (formato N°: 5 + 8 dígitos), Lote del proveedor y observaciones.
  7. Confirmar Movimiento → genera MED-XXXXXX. Si es EGRESO, antes de crear valida que el lote/total tenga saldo (no permite negativo).
Ejemplo

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

Modal nuevo movimiento de producto
Alta de movimiento de producto terminado (salida / ingreso) con logística

Pestaña Productos → «Registrar Producto». Campos:

  1. Tipo: 📤 Salida (venta/envío) o 📥 Ingreso (devolución/producción).
  2. Fecha y Destino / Procedencia (buscador de destinos).
  3. 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).
  4. Cantidad (en cajas o unidades según el producto).
  5. Carga Múltiple (checkbox): permite varios productos/lotes en un mismo movimiento (tabla de ítems).
  6. Logística: transporte, chofer, provincia, localidad y Tarifa $/Tn (se autocompleta desde el Tarifario al elegir localidad).
  7. Remito / Orden / Factura (split 5+8), Ref. interna, ajuste de Pallets (+/-) y observaciones.
  8. Confirmar → registra el movimiento; el servidor recalcula stock y lotes.
Ejemplo (ingreso por producción)

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.

Movimiento vinculado a un despacho

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

Detalle de un movimiento
Ficha del movimiento: cantidad, documentación, lote y acciones

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.

Cambiar el lote pide doble confirmación

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.

Ejemplo

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

EscenarioCómo se hace
Entró una compra de insumoTab Insumos → Registrar Insumo → Compra (Entrada), cantidad, proveedor, factura/remito, lote.
Devolver insumo al proveedorTab Insumos → Registrar Insumo → Devolución (Salida); valida saldo del lote.
Ingresar PT producidoTab Productos → Registrar Producto → Ingreso, lote nuevo, cantidad, destino «PRODUCCION».
Despachar una ventaNo se hace acá: se confirma en Ventas → En Carga → Picking (cae como salida en este listado).
Corregir un movimiento mal cargadoDetalle → Editar (si no está vinculado a despacho), o Anular y rehacer.
Sembrar stock al arrancarCarga de Stock Inicial (PT).
Devolver azúcar a la división AzúcarBotón «Dev. Azúcar» (pase inverso atómico).
Exportar el historialBotón Excel → filtros → descarga (salidas en negativo).

Errores y validaciones comunes

SíntomaCausa / 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 EGRESONo hay saldo en ese lote/total. El sistema bloquea el stock negativo (cliente y servidor).
No aparece el lote en el selector de SalidaEse lote no tiene stock. Elegir otro o revisar ingresos previos.
El stock no cambió al instanteNormal: lo recalcula el servidor en segundo plano.
No puedo editar producto/cantidad de un movimientoEstá vinculado a un despacho: solo Notas y Fecha son editables.
Un movimiento viejo aparece en Edulcorantes y no en JugosEs 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ónRol
endulzantes_movimientosEscribe/lee — todo movimiento (INGRESO / EGRESO / SALIDA / DEVOLUCION), anulación, edición. Correlativo MED por movimientos_endulzantes_med
endulzantes_articulos / endulzantes_insumosSolo lectura desde acá. stockActual y lotes[] los escribe únicamente el trigger updateEndulzantesStock
endulzantes_proveedoresSolo lectura — proveedor de insumos (lista compartida, sin línea)
destinos, transportes, choferes, tarifasSolo lectura — destino y logística del movimiento de producto
Barrera de stock no-negativo

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.

División Polvos (Endulzantes)

Stock (Polvos)

GerenteOperativoOperativoComercial Actualizado: 2026-05-19

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.

Stock Endulzantes
Stock consolidado de la División Polvos (vista de Productos)
El saldo es del servidor — acá NO se edita

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íneaPor qué
InsumosSe ven los de la línea activa + los marcados AMBASAzú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.
Lectura del filtro (cómo lo decide el sistema)

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)

Stock — solapa Insumos (Edulcorantes)
Insumos en línea Edulcorantes: Stevia y Sobres en alerta (rojo) por estar bajo el mínimo

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

Stock — Productos en línea Jugos
Productos en línea Jugos: el stock físico se muestra en CAJAS + sueltas

Para productos, el stock se guarda en unidades pero se muestra de forma legible usando el factor unidadesPorBulto del artículo:

Ejemplo concreto

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

  1. Buscador inteligente (servidor): busca un insumo/producto por nombre directamente en Firestore. Al seleccionarlo, el sistema hace un getDoc en vivo para mostrar el saldo exacto de ese ítem (no el cacheado). Borrar el buscador recarga la lista normal.
  2. Filtro «Tipo / Categoría»: se llena automáticamente con las categorías presentes en lo cargado. Filtra en memoria.
  3. «Solo Alertas»: muestra únicamente los ítems en o bajo el stock mínimo — útil para «¿qué tengo que reponer/producir?».
  4. «Cargar más registros»: la lista trae de a 50; el botón al pie carga el siguiente bloque (paginación con startAfter).
  5. 🔄 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:

Composición de Stock por Lote (Jugos)
Lotes de Jugo Naranja x12: 1.190 cajas repartidas en 3 lotes activos + 1 agotado
  • 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.

Rectificar / Ajustar Stock PT
Rectificar: producto, lote, tipo de ajuste (+ Incremento / − Merma), cantidad y observación
  1. Producto / Insumo: precargado si se entró desde una fila/lote; si no, hay un buscador.
  2. Lote a rectificar: se elige de la lista de lotes con su saldo actual.
  3. Tipo de ajuste: + Incremento (suma al lote) o − Merma (resta del lote).
  4. Cantidad y Observaciones (recomendado: «conteo físico», «merma por vencimiento», etc.).
  5. 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).
Ejemplo

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.

Rectificar es la excepción, no la rutina

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)

  1. Elegí la línea (pill Edulcorantes / Jugos).
  2. Elegí la solapa Insumos o Productos (PT).
  3. Buscá / filtrá / activá «Solo Alertas» para ver lo que falta.
  4. Clic en una fila → composición por lote → Trazabilidad o Rectificar.
  5. Si necesitás el dato afuera, exportá a Excel.

Flujo de datos

ColecciónRol
endulzantes_insumosSolo lectura — insumos, stockActual, lotes[], stockMinimo, linea (incl. AMBAS)
endulzantes_articulosSolo lectura — productos terminados, lotes, unidadesPorBulto, valor, linea
endulzantes_movimientosEscribe solo cuando se Rectifica (el resto de la pantalla no escribe)
updateEndulzantesStock (trigger servidor)Único que escribe stockActual / lotes[]; esta pantalla muestra su resultado
Una sola fuente de verdad

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.

División Polvos (Endulzantes)

Producción (Polvos)

GerenteOperativoOperativo Actualizado: 2026-05-19

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.

El circuito de fabricación (idéntico para las dos líneas)
Insumos (materia prima) ELABORACIÓN (receta) → Granel / Intermedio ENVASADO (estructura) → Producto Terminado Stock disponible para vender
Producción Endulzantes
Hub de Producción: pill de línea (Edulcorantes / Jugos) + solapas Elaboración / Envasado

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.

EdulcorantesJugos
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 granelkglitros (L)
Unidad de venta del PTcaja / display (factor unidadesPorBulto)caja x6 / x12 (factor unidadesPorBulto)
Pill en usoEdulcorantes (verde activo)Jugos (verde activo)
Antes de producir: confirmá el pill

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)

ConceptoQué 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 / RecetaQué insumos y en qué % lleva un intermedio. Se carga en ABM → Fórmulas. Sin receta no se puede elaborar.
EstructuraQué componentes (granel + envases) lleva un producto terminado. Se carga en ABM → Estructuras.
OPI / OPTN° de la Orden de Producción de Intermedio (OPI-…) o Terminado (OPT-…).
PEI / PETN° del Parte de producción (lo realmente fabricado): PEI-… elaboración, PET-… envasado.
Estado de la ordenPLANIFICADA (creada, insumos reservados) → COMPLETADA (fabricada) · ANULADA.
Planificado vs. RealLo que se pensó producir vs. lo que realmente salió. La diferencia es merma (menos) o sobre-rendimiento (más).
Lote destinoEl lote del producto fabricado. Si se deja vacío, el sistema lo autogenera.
FIFOEl sistema sugiere consumir primero los lotes de insumo más viejos. Se puede cambiar.
Producir NO escribe stock — crea movimientos

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ónEnvasado
ProduceGranel / intermedioProducto terminado (lo que se vende)
Se basa enReceta (insumos por %)Estructura (granel + envases)
Orden / ParteOPI / PEIOPT / PET
ConfirmaciónTotal (una vez)Parcial (de a tandas, con saldo pendiente)
Editar / AnularAnular vía el detalle / MovimientosEditar 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

Asistente Nueva OP — Paso 1 (Edulcorantes)
Paso 1 (línea Edulcorantes): fecha, lote destino, producto a elaborar y cantidad
Asistente Nueva OP — Paso 1 en la app
El mismo Paso 1 abierto dentro de la aplicación
  1. 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.
  2. 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.
  3. 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).
Asistente Nueva OP — Paso 2
Paso 2: requerido por insumo según la receta y asignación de lotes (FIFO)
Ejemplo — línea Jugos

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.

Ejemplo — línea Edulcorantes

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ó)

Confirmar Elaboración
«PRODUCIR» / Confirmar Elaboración: se carga la producción real obtenida
  1. En la lista de Órdenes Planificadas, sobre una OP PLANIFICADA, botón «PRODUCIR».
  2. 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ó).
  3. «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.
Ejemplo con merma (Jugos)

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).

Detalle de Elaboración
Detalle de un PEI (Edulcorantes): lotes de insumo consumidos y merma

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.

Solapa Envasado — listado de OPT (Jugos)
Solapa Envasado en línea Jugos: órdenes planificadas + historial PET

Crear la orden — asistente de 3 pasos

Igual estructura que Elaboración, pero usa la estructura del producto:

  1. Paso 1: fecha, lote destino, producto terminado (de la línea activa) y cantidad a envasar.
  2. Paso 2: el sistema analiza la estructura (qué granel y qué envases lleva) y arma los componentes con sus lotes.
  3. Paso 3: resumen → «Crear Orden»OPT-XXXXXX PLANIFICADA.

Confirmar Parcial — envasar de a tandas

Confirmar Parcial de Envasado
Confirmar Parcial: saldo pendiente, producción real y cierre forzado (merma/sobrante)

El envasado normalmente no se hace todo de una vez. El modal Confirmar Parcial permite cargar tandas sucesivas:

  1. Muestra el Saldo Pendiente de la orden (lo que falta envasar) y el lote destino.
  2. Se carga la Producción Real de esta tanda (puede ser menor o incluso mayor que lo pendiente — se permite sobre-rendimiento).
  3. 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.
    Si no se tilda, la orden queda con el saldo pendiente para la próxima tanda.
  4. Al confirmar: parte PET-XXXXXX, INGRESO del PT con su lote y EGRESO automático de los componentes consumidos (granel + envases).
Ejemplo de envasado en dos tandas (Jugos)

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).

Ejemplo (Edulcorantes)

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.

Editar / Anular una orden de envasado

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

EscenarioCó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 / sobresSolapa 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íasConfirmar Parcial por tanda, sin tildar cierre hasta la última.
Me equivoqué antes de confirmarEnvasado: 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 buscadorEl pill está en la línea equivocada, o falta la categoría/línea del artículo en ABM.

Errores y validaciones comunes

SíntomaCausa / 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 insumoEse 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 buscadorEl 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 confirmarNormal: lo recalcula el servidor en segundo plano (unos segundos).
La orden quedó con saldo pendiente sin quererNo 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ónRol
ordenes_produccion_intermedios / ordenes_produccion_ptEscribe/lee — las órdenes (PLANIFICADA → COMPLETADA / ANULADA), correlativos OPI / OPT
partes_elaboracion_intermedios / partes_elaboracion_ptEscribe — el parte con lo realmente producido (PEI / PET)
endulzantes_recetasSolo lectura — fórmula de los intermedios (insumos por %)
endulzantes_estructurasSolo lectura — estructura de los terminados (granel + envases)
endulzantes_movimientosEscribe — EGRESO de insumos/componentes e INGRESO del producto. El stock lo recalcula updateEndulzantesStock
endulzantes_articulos / endulzantes_insumosSolo lectura — productos, insumos, lotes y stock disponible (filtrados por línea)
Trazabilidad garantizada

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.

División Polvos (Endulzantes)

Trazabilidad y Calidad (Polvos)

GerenteOperativoComercial Actualizado: 2026-05-18

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).

Qué resuelve, en una frase

«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.

Las dos direcciones de la trazabilidad
Insumo + lote Orden de Producción (OPI/OPT) Lote de Producto Terminado Salidas / Despachos Cliente
Trazabilidad y Calidad (Polvos)
Pantalla: pill de línea, Búsqueda Rápida por documento y Búsqueda Manual por producto+lote

Conceptos base

ConceptoQué es
LoteLa partida física que se rastrea. Todo gira alrededor del par producto + lote. Los movimientos sin lote (S/L) no son trazables.
MED-XXXXXXN° 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 / OPIOrden de Producción de Terminado (OPT-…) o de Intermedio (OPI-…). Es el «padre» de un lote producido.
Ingreso / Salida / DevoluciónTipo de cada movimiento del lote. Ingreso y Devolución suman saldo; Salida resta.
Saldo históricoEl 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 loteLo 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.

  1. Escribir el documento y Enter (o lupa): acepta remito (0001-00000055), MED (MED-000123) u orden / referencia (OPT-000001).
  2. El sistema busca por coincidencia exacta en los movimientos de la línea activa (solo los que tienen lote).
  3. 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.
Ejemplo

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.

  1. Producto: buscador inteligente (filtrado por la línea activa).
  2. Lote: el desplegable se llena con los lotes de ese producto y muestra el stock de cada uno (ej. «AC42M10 (Stock: 1.200)»).
  3. «Consultar Lote» → arma la historia.

La «Historia del Lote»

Historia del lote
Línea de tiempo del lote: cada movimiento, su saldo histórico y de dónde vino

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:

ColumnaQué muestra
FechaDía del movimiento.
TipoINGRESO / DEVOLUCIÓN (verde, suma) o SALIDA (rojo, resta).
CantidadCon 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 / ClienteEn las salidas, a quién se le despachó (trazabilidad hacia adelante).
TrazarBotón «VER ORIGEN» cuando el lote nació en una orden de producción.
El saldo histórico cuenta una película

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»

Origen de producción del lote
«VER ORIGEN»: la orden de producción y los lotes de insumo que la formaron

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.

La parte poderosa: genealogía recursiva

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

Ejemplo de punta a punta

Un cliente reclama por el Jugo Naranja x12, lote JN-2407.

  1. Entrar al lote: Búsqueda Rápida con el remito del cliente (o Manual: producto «Jugo Naranja x12» → lote JN-2407).
  2. 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.
  3. 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».
  4. 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ó.
  5. 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

EscenarioCómo se hace
Reclamo con un remito en la manoBú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 sospechosoLlegar 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 loteLeer la columna «Saldo Hist.» fila por fila.
Trazar sin salir de MovimientosDetalle del movimiento → botón «Ver Trazabilidad».
Documento con varios productos/lotesBúsqueda Rápida muestra la lista → elegir el ítem a trazar.

Errores y validaciones comunes

SíntomaCausa / 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 desplegableEs 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 buscarEl buscador está filtrado por la línea activa. Cambiar el pill Edulcorantes/Jugos.
Stock actual en 0 pero hay historiaEs normal: el lote ya se consumió. La historia y el saldo histórico siguen siendo válidos para el reclamo.

Flujo de datos

ColecciónRol
endulzantes_movimientosSolo lectura — la historia del lote (por articuloId + lote) y la búsqueda por documento (customId/remito/orden/docAzucel)
endulzantes_articulosSolo lectura — nombre, presentación y stock actual por lote
ordenes_produccion_pt / ordenes_produccion_intermediosSolo lectura — la OP que originó el lote y sus insumos/componentes asignados (con lote)
endulzantes_devoluciones_ventasReflejado vía los movimientos DEVOLUCION que reponen el lote
Trazabilidad = calidad

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.

División Polvos (Endulzantes)

ABM (Polvos)

GerenteOperativoOperativoComercial Actualizado: 2026-05-18

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).

ABM Endulzantes
ABM de la División Polvos

Entidades

EntidadQué defineLínea
ArtículosProductos terminadosEdulcorantes o Jugos (se elige al crear; el tipo del modal depende de la línea)
InsumosMaterias primasEdulcorantes, Jugos o AMBAS (compartido: stock y lotes únicos, visible en las dos)
CatálogosListas de valores reutilizables (tipos, presentaciones, etc.)
RecetasFórmula: qué insumos y cantidades producen cada artículoPor línea
EstructurasComposición/estructura de producto para producciónPor línea
ProveedoresProveedores de insumosLista compartida (sin línea)

Cómo se usa

  1. Se elige la vista; en Artículos/Insumos, el pill define la línea activa.
  2. 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.
Insumos compartidos

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.