Base de Conocimiento
Encuentra guías, documentación y respuestas para aprovechar al máximo el sistema.
Primeros pasos
Guía de inicio rápido
Centro de Ayuda — UtilARA ERPMapa completo de la documentación de UtilARA ERP, organizada en siete secciones.
Documentación oficial de UtilARA ERP: ERP multiempresa con contabilidad, facturación, cuentas por cobrar y por pagar, compras, inventario, banco, activos fijos, caja chica, punto de venta, proyectos, nómina y una plataforma de apps instalables (NCF/DGII, CRM, RRHH, Dental, Veterinaria).
Las siete secciones
| Sección | Para quién | Qué contiene |
|---|---|---|
| Primeros pasos | Cliente nuevo | Guía de inicio rápido, acceso al sistema y cómo moverte |
| Manuales | Todo el equipo | Manual de usuario de cada módulo |
| Administración | Administrador de la empresa | Usuarios, roles, empresas, sucursales, configuración y seguridad |
| Contabilidad | Contador y personal financiero | Qué asiento genera cada operación, cierres y reportes |
| No verificado Ayuda | Todos | Recetas paso a paso, flujos completos, preguntas frecuentes y solución de problemas |
| Integraciones y API | Integrador / TI | API, webhooks, integraciones e importación de datos |
| Novedades | Todos | Qué cambió en cada entrega |
Empieza por aquí
| Si eres… | Empieza por |
|---|---|
| Cliente nuevo | Guía de inicio rápido — 10 pasos hasta tu primera factura |
| Usuario que va a operar | Cómo iniciar sesión y el manual de tu módulo |
| Administrador de la empresa | Administración — usuarios, roles y configuración |
| Contador | Contabilidad — manual contable y cierres |
| Integrador | Integraciones y API |
Cómo leer esta documentación
Todo lo que hay aquí está verificado contra el sistema real (código, endpoints, base de datos y ejecución). No se describe funcionalidad que el sistema no tenga: cuando algo no existe o está a medias, el artículo lo dice.
Cada artículo indica su estado:
| Estado | Significa |
|---|---|
| Listo | Verificado de punta a punta: pantalla → API → base de datos → contabilidad |
| Operativo | Funciona completo; le faltan comodidades, no correctitud |
| Parcial | Una parte funciona y otra no. Lee la nota antes de depender de él |
| Pendiente | No implementado todavía |
Cinco cosas que conviene saber desde el principio
- Guardar no es contabilizar. Un documento guardado es un borrador: no consume
comprobante fiscal, no descuenta inventario y no genera asiento. Eso ocurre al postear.
- El NCF se emite al postear. Un borrador abandonado no gasta numeración fiscal, y un
posteo fallido tampoco.
- Lo contabilizado no se edita: se revierte. Una factura posteada se corrige con una
anulación o una nota de crédito, nunca reescribiéndola. Es lo que mantiene la contabilidad auditable.
- Empresa, sucursal, almacén y tienda son cuatro cosas distintas. Elegir mal al
implantar es el error más caro de deshacer. Consulta Empresas, sucursales, almacenes y tiendas en Administración.
- Los permisos se validan en el servidor. Ocultar un botón es solo comodidad; el control
real está detrás.
Limitaciones conocidas
Para que nadie planifique sobre algo que no existe:
| Área | Limitación |
|---|---|
| Importación | No hay importación CSV de artículos, proveedores ni saldos pendientes. Solo clientes, plan de cuentas, presupuestos y entidades personalizadas |
| Búsqueda global (Ctrl+K) | No encuentra facturas, clientes ni artículos: solo registros de entidades personalizadas. Usa el buscador de cada pantalla |
| Numeración interna | Los prefijos y el punto de partida (FAC-AAAA-######) no son configurables |
| Exportación | No se generan .xlsx nativos; hay CSV, .xls y PDF |
| Pagos | No hay pasarela de pago integrada ni conexión automática con bancos |
| API | Compras, Cuentas por Pagar, Inventario y Contabilidad no aceptan API Key, solo sesión de usuario |
| Webhooks | Se disparan desde el motor de registros; los documentos del núcleo aún no los emiten |
| Proyectos | Sin diagrama de Gantt, dependencias ni asignación de recursos |
| e-CF | Implementado contra la API real de la DGII, pero la certificación es un trámite tuyo |
Documentación interna
Existe además documentación técnica, de referencia de API completa y comercial que no se publica en este centro de ayuda: está dirigida al equipo que opera la plataforma.
Bienvenido a UtilARA ERPLos 10 pasos para dejar UtilARA ERP operando y emitir tu primera factura.
Esta guía te lleva desde un sistema recién entregado hasta emitir tu primera factura y registrar tu primer cobro. Son 10 pasos, en orden. Cada paso enlaza a su artículo con el detalle: la ruta exacta del menú, los campos obligatorios y qué queda registrado.
Tiempo estimado: entre 2 y 4 horas si ya tienes los datos a mano (RNC, catálogo de productos, listado de clientes y los NCF autorizados por la DGII).
Antes de empezar, ten a mano
| Dato | Para qué se usa | ¿Obligatorio? |
|---|---|---|
| RNC / Cédula de la empresa | Se imprime en el comprobante fiscal. Sin él el sistema bloquea la emisión con NCF | Sí |
| Razón social y nombre comercial | Encabezado del comprobante | Sí |
| Dirección, teléfono y correo | Encabezado del comprobante y envío por correo | Recomendado |
| Logo (imagen) | Comprobante impreso | Opcional |
| Secuencias de NCF autorizadas por la DGII | Numeración fiscal de las facturas | Sí, para facturar |
| Listado de clientes (CSV) | Carga inicial | Opcional |
| Listado de productos/servicios | Carga inicial | Opcional |
Los 10 pasos
| # | Paso | Dónde |
|---|---|---|
| 1 | Configura tu empresa | Contabilidad → Configuración |
| 2 | Crea tus sucursales | Contabilidad → Configuración → Dimensiones |
| 3 | Crea tus usuarios | Seguridad → Usuarios |
| 4 | Configura impuestos y comprobantes fiscales | Impuestos |
| 5 | Revisa las formas de pago y condiciones | Contabilidad → Tipos de Pago |
| 6 | Importa tus clientes | Cuentas por Cobrar → Cliente |
| 7 | Importa tus productos | Inventario → Ítem |
| 8 | Configura inventario (almacenes y existencias) | Inventario → Almacén |
| 9 | Emite tu primera factura | Facturación → Factura |
| 10 | Registra tu primer cobro | Cuentas por Cobrar → Recibo |
Al terminar, revisa el Checklist de puesta en marcha para confirmar que no quedó nada a medias antes de operar en serio.
Cómo leer esta documentación
Cada artículo indica su estado verificado contra el sistema real:
| Estado | Significa |
|---|---|
| Listo | Verificado de punta a punta: pantalla → API → base de datos → contabilidad |
| Operativo | Funciona completo; le faltan comodidades, no correctitud |
| Parcial | Una parte funciona y otra no. Lee la nota antes de depender de él |
| Pendiente | No implementado todavía |
Cuando algo no existe, esta documentación lo dice. No se describe funcionalidad que el sistema no tenga.
Checklist de puesta en marcha---
section: primeros-pasos subsection: inicio-rapido order: 110 visibility: WEB status: PUBLISHED category: Inicio rápido tags: [checklist, puesta-en-marcha] excerpt: Verificación final antes de operar en producción: 25 puntos que se comprueban en pantalla.
Checklist de puesta en marcha
Recorre esta lista en el sistema, no de memoria. Cada punto se comprueba abriendo la pantalla indicada.
Empresa y contabilidad
- [ ]
Contabilidad → Plan de Cuentasmuestra el catálogo con cuentas. - [ ]
Contabilidad → Períodos Contablestiene los 12 meses del año, y el mes actual está abierto. - [ ]
Seguridad → Configuración → Configurar Compañíatiene RNC, razón social y dirección. - [ ]
Seguridad → Configuración → Configurar Contabilidadtiene asignadas las cuentas de
Cuentas por Cobrar, Ingresos, ITBIS por Pagar, Caja, Cuentas por Pagar, Inventarios y Costo de Ventas.
- [ ]
Contabilidad → Configuración → Dimensionestiene tus sucursales creadas.
Monedas
- [ ]
Banco → MonedalistaDOPmarcada como base. - [ ] Si operas en dólares,
USDestá activa y tiene tasa de cambio cargada
(Banco → Cambio Tasa).
Usuarios y seguridad
- [ ]
Seguridad → Configuración → Configurar Usuariostiene una política de contraseña
razonable (mínimo ≥ 10, letras y números) y bloqueo por intentos activado.
- [ ] Existe más de un usuario con perfil Administrador.
- [ ] Cada persona tiene su propia cuenta — ninguna cuenta compartida.
- [ ] Los perfiles asignados corresponden a lo que cada quien realmente necesita.
- [ ] La verificación en dos pasos está activa al menos para los administradores.
Impuestos y comprobantes
- [ ]
Impuestos → Reglas Fiscalestiene la regla de ITBIS con su vigencia. - [ ]
Impuestos → Serie Fiscaltiene al menos una secuencia activa y vigente (B01 y/o B02). - [ ]
Impuestos → Consulta NCFmuestra disponibilidad suficiente y el umbral de alerta configurado. - [ ] Si usas retenciones, están dadas de alta en
Impuestos → Retenciones.
Catálogos comerciales
- [ ]
Contabilidad → Tipos de Pagotiene los medios que realmente usas. - [ ]
Cuentas por Cobrar → Condición de Pagotiene al menos Contado y una de crédito,
y hay una marcada por defecto.
- [ ]
Cuentas por Cobrar → Clientetiene tus clientes, con RNC correcto. - [ ]
Inventario → Ítemtiene tu catálogo, con unidad y categoría.
Inventario
- [ ]
Inventario → Almacéntiene tus almacenes. - [ ]
Inventario → Existencia en Almacénmuestra cantidad y costo — no cero. - [ ]
Contabilidad → Balanza Comprobaciónmuestra saldo en la cuenta Inventarios
coherente con la valuación.
Prueba de punta a punta
- [ ] Emitiste una factura de prueba y recibió NCF.
- [ ] El inventario del artículo bajó en la cantidad vendida.
- [ ] El asiento de venta y el de costo aparecen en
Contabilidad → Diarioy cuadran. - [ ] Registraste el cobro y el saldo de la factura llegó a cero.
- [ ] La factura de prueba aparece en
Impuestos → Reporte 607. - [ ] Anulaste la factura de prueba y verificaste que el inventario se repuso, los asientos
quedaron en cero y el NCF pasó al 608.
Antes de dar acceso al equipo
- [ ] Definiste quién puede cerrar períodos (
accounting:close-period) — no debería ser todo el mundo. - [ ] Definiste quién puede ver costos de inventario (
inventory:view-cost). - [ ] Definiste quién puede anular documentos (permisos
:delete). - [ ] Sabes dónde consultar la bitácora de actividad para auditar cambios.
Si algún punto falla, corrígelo antes de empezar a operar. Arreglar datos después de facturar cuesta mucho más que configurarlos bien al principio.
Paso 2 — Crea tus sucursales---
section: primeros-pasos subsection: inicio-rapido order: 20 visibility: WEB status: PUBLISHED category: Inicio rápido tags: [sucursales, dimensiones, centros-de-costo] excerpt: Las sucursales son una dimensión contable: permiten ver resultados por local sin duplicar empresas.
Paso 2 — Crea tus sucursales
Estado: Operativo. Las sucursales se crean, se asignan a los asientos y a las líneas de presupuesto, y filtran los reportes contables. No tienen numeración de documento propia.
Qué es una sucursal aquí
Una sucursal es una dimensión contable dentro de una empresa: una etiqueta que viaja con los asientos y permite ver el Mayor, el Estado de Resultados y el presupuesto por local, sin crear una contabilidad separada.
Junto a las sucursales existen otras dos dimensiones del mismo tipo:
| Dimensión | Para qué sirve |
|---|---|
| Centros de Costo | Agrupar gastos por unidad de costo |
| Departamentos | Agrupar por área organizativa |
| Sucursales | Agrupar por local / establecimiento |
Si cada local tiene su propio RNC, no es una sucursal: es otra empresa (paso 1).
Permisos necesarios
| Acción | Permiso |
|---|---|
| Ver dimensiones | accounting:read |
| Crear dimensiones | accounting:create |
Procedimiento
Contabilidad → Configuración (/accounting/config)
Baja hasta la sección Dimensiones. Verás tres tarjetas: Centros de Costo, Departamentos y Sucursales.
Paso 1. Escribir el código
Campo Código — corto y estable, p. ej. SD, STGO, ZONA-E. El sistema lo guarda en mayúsculas automáticamente.
Paso 2. Escribir el nombre
Campo Nombre — el nombre legible: Santo Domingo, Sucursal Santiago.
Paso 3. Pulsar +
La sucursal aparece en la lista de la tarjeta.
El código es único por empresa: no puedes tener dos sucursales con el mismo código dentro de la misma empresa.
Dónde se usa después
| Lugar | Uso |
|---|---|
Asientos contables (/accounting/journal) | Cada asiento y cada línea puede llevar sucursal |
Mayor General (/accounting/ledger) | Filtro por sucursal |
| Estado de Resultados, Balance General, Flujo de Efectivo | Filtro por sucursal |
Presupuestos (/accounting/budgeting) | Cada línea de presupuesto puede asignarse a una sucursal — la importación por CSV acepta la columna branchCode |
| Asientos recurrentes | Las líneas conservan la sucursal |
Lo que una sucursal no hace
| Expectativa | Realidad |
|---|---|
| Numeración de factura por sucursal | No. La numeración (FAC-AAAA-######) es por empresa |
| Secuencia de NCF por sucursal | No. Las secuencias de NCF se configuran por empresa |
| Inventario por sucursal | Se maneja con almacenes (paso 8), no con sucursales |
| Punto de venta por sucursal | Se maneja con Tiendas (/facturacion/tienda/buscar) y terminales POS |
Para separar existencias por local usa almacenes; para separar cajas usa tiendas. La sucursal es la dimensión contable que los cruza.
Cómo verificar
En Contabilidad → Mayor General, el filtro Sucursal debe listar las que creaste.
Siguiente
Paso 3 — Crea tus usuarios.
Paso 9 — Emite tu primera factura---
section: primeros-pasos subsection: inicio-rapido order: 90 visibility: WEB status: PUBLISHED category: Inicio rápido tags: [factura, ncf, venta, contabilidad] excerpt: De borrador a factura posteada: qué pide la pantalla, cuándo se emite el NCF y qué asiento genera.
Paso 9 — Emite tu primera factura
Estado: Listo. La factura selecciona artículos reales, valida existencias, descuenta inventario, genera el costo de venta, emite el NCF al postear y contabiliza.
Requisitos previos
| Requisito | Dónde | Si falta… |
|---|---|---|
| Empresa con cuentas contables configuradas | Seguridad → Configuración → Configurar Contabilidad | El posteo falla |
| Cliente creado | Cuentas por Cobrar → Cliente | No puedes seleccionarlo — la pantalla no crea clientes al vuelo |
| Serie NCF activa y vigente | Impuestos → Serie Fiscal | Solo si vas a emitir comprobante fiscal |
| Período contable abierto | Contabilidad → Períodos Contables | El posteo se rechaza |
| Existencia y almacén | Inventario | Si vendes productos inventariados |
Permisos
| Acción | Permiso |
|---|---|
| Ver facturas | cxc:read |
| Crear, postear y enviar | cxc:create |
| Anular | cxc:delete |
Se validan en el servidor: manipular la pantalla no salta el control.
Ruta
Facturación → Factura → Factura (/facturacion/factura/nuevo)
Facturación → Factura → Buscar Factura (/facturacion/factura/buscar)
Paso 1. Encabezado
| Campo | Obligatorio | Nota |
|---|---|---|
| Número | — | (auto). Se asigna al guardar: FAC-AAAA-000001 |
| Estatus | — | Empieza como Borrador (sin guardar) |
| Fecha | Sí | Determina el período contable |
| Cliente | Sí | Define la cuenta por cobrar y el RNC que va al 607 |
| Condición de pago | No | Si el cliente tiene una predeterminada, se propone sola |
| Vencimiento | No | Con condición de contado se fija igual a la fecha y se bloquea |
| Tipo NCF | No | Elige el tipo. El número se emite al postear, no al guardar |
| Almacén de despacho | Solo con productos | Si hay líneas inventariadas y no eliges almacén, la pantalla lo marca como Requerido |
Paso 2. Líneas
Columnas: Artículo · Descripción · Disp. · Cantidad · Precio · Desc% · ITBIS% · Total.
- Disp. muestra la existencia disponible en el almacén elegido.
- Al elegir el artículo se traen su descripción, precio e ITBIS; puedes ajustarlos.
- Al pie se calculan Subtotal, ITBIS y Total.
Paso 3. Cobro (según la condición)
Si la condición es contado, aparece el bloque Cobro de contado. Si es crédito, puedes marcar Registrar pago inicial.
| Campo | Opciones |
|---|---|
| Método | Efectivo, Transferencia, Tarjeta, Cheque, Depósito, Otro |
| Caja / Banco | Cuenta donde entra el dinero |
| Monto / Efectivo recibido | Con efectivo, si entregas más del total, la pantalla calcula el cambio y aplica solo el total |
| Referencia | Opcional |
Si ves "No hay cajas ni cuentas bancarias activas", crea la cuenta en el módulo Banco antes de cobrar de contado.
En crédito, si el cliente tiene límite de crédito, la pantalla lo muestra y avisa cuando la factura podría superarlo. El servidor bloquea el posteo si se excede.
Paso 4. Guardar y postear
Son dos acciones distintas:
| Acción | Qué hace |
|---|---|
| Guardar | Crea el borrador. No consume NCF, no descuenta inventario, no contabiliza |
| Postear | Emite el NCF, descuenta el inventario, genera el costo de venta y contabiliza |
Un posteo fallido no consume ningún número fiscal.
Qué queda registrado al postear
| Efecto | Detalle |
|---|---|
| NCF emitido | Formato de 11 caracteres, p. ej. B0100000026. La secuencia avanza |
| Cuenta por cobrar | Por el total, con su fecha de vencimiento |
| Asiento de venta | Débito Cuentas por Cobrar · Crédito Ingresos por Ventas · Crédito ITBIS por Pagar |
| Asiento de costo | Débito Costo de Ventas · Crédito Inventarios (solo con productos inventariados) |
| Inventario | Se descuenta del almacén elegido |
| Reporte 607 | La factura entra en el 607 del período |
Paso 5. Entregar el comprobante
En una factura ya guardada aparecen las acciones del documento:
- Vista previa y descarga en PDF — con RNC y dirección del emisor, RNC del comprador,
vigencia del NCF y desglose de ITBIS.
- Imprimir, individual o en lote (
Facturación → Factura → Imprimir Facturas en lote). - Enviar por correo con el PDF adjunto; queda historial de envíos y se puede reintentar.
Si algo sale mal
| Mensaje / síntoma | Causa | Solución |
|---|---|---|
| El posteo falla por período | El período contable está cerrado | Cambia la fecha o reabre el período (permiso accounting:reopen-period) |
| El posteo falla por cuentas | Faltan cuentas en la empresa | Configurar Contabilidad |
| Requerido: hay productos inventariados | Falta el almacén de despacho | Elige el almacén |
| Bloqueo por límite de crédito | El cliente supera su límite | Cobra antes, sube el límite o factura de contado |
| No hay NCF disponible | La secuencia se agotó o venció | Registra una nueva serie en Impuestos → Serie Fiscal |
Para corregir una factura ya emitida
- Anular — revierte el asiento y el inventario; el NCF pasa al reporte 608 y no se reutiliza.
- Nota de crédito — para devoluciones o ajustes parciales.
Ambos casos están documentados en la Base de conocimiento.
Siguiente
Paso 10 — Registra tu primer cobro.
Paso 1 — Configura tu empresaInicializa la contabilidad y completa los datos fiscales que se imprimen en el comprobante.
Estado: Listo. La inicialización crea empresa, monedas, plan de cuentas, períodos fiscales, tipos de pago y conceptos contables en una sola operación.
Objetivo
Dejar creada la empresa sobre la que se registra todo (companyId) y completar los datos fiscales que aparecen impresos en cada factura.
Permisos necesarios
| Acción | Permiso |
|---|---|
| Inicializar contabilidad | accounting:create |
| Crear una empresa adicional | accounting:create |
| Editar datos de la empresa | accounting:update |
Los perfiles Administrador y Gerente los tienen por defecto.
Parte A — Inicializar (solo la primera vez)
Contabilidad → Configuración (/accounting/config)
Si el sistema todavía no tiene ninguna empresa, la pantalla muestra el botón Inicializar ahora. Al pulsarlo, el sistema crea de una vez:
| Qué crea | Detalle |
|---|---|
| Monedas | DOP — Peso Dominicano (RD$), marcada como moneda base, y USD — Dólar Estadounidense |
| Empresa | Código MAIN, nombre igual al de tu cuenta, moneda base DOP |
| Plan de cuentas | Catálogo base completo (activo, pasivo, patrimonio, ingresos, gastos) |
| Períodos fiscales | Los 12 meses del año en curso |
| Reglas contables | Reglas por defecto que deciden qué asiento genera cada operación |
| Tipos de pago | Efectivo, Transferencia bancaria, Tarjeta, Cheque |
| Conceptos contables | Catálogo de conceptos por defecto |
La inicialización es segura de repetir: si ya existe una empresa, no la duplica ni sobrescribe el plan de cuentas.
Parte B — Completar los datos fiscales
Seguridad → Configuración → Configurar Compañía (/security/config/compania)
Selecciona la empresa arriba y completa:
Identidad
| Campo | Significado | ¿Obligatorio? |
|---|---|---|
| Nombre | Nombre corto que ves en el sistema | Sí |
| Razón social | Nombre legal completo | Recomendado |
| Nombre comercial | Si difiere de la razón social | Opcional |
| RNC / Cédula | Se imprime en el comprobante. Sin este dato el sistema no genera comprobantes con NCF | Sí para facturar |
Contacto y dirección
Dirección, Dirección 2, Teléfono, Correo, Sitio web y Sucursal / Establecimiento. Todos se imprimen en el encabezado del comprobante.
Comprobante
| Campo | Qué hace |
|---|---|
| Logo | Imagen del encabezado |
| Formato por defecto | A4, LETTER o THERMAL_80 (rollo de 80 mm para POS) |
| Mostrar logo / vendedor / almacén | Qué bloques aparecen impresos |
| Texto de pie y Términos | Texto libre al final del comprobante |
| Asunto y cuerpo del correo | Plantilla del correo con el PDF adjunto |
Pulsa Guardar.
Parte C — Empresas adicionales (opcional)
Si operas varias razones sociales, cada una es una empresa distinta con su propio plan de cuentas, numeración y contabilidad. Se crean desde Contabilidad → Configuración, con Código (p. ej. SUC2) y Nombre.
Empresa ≠ Sucursal. Una empresa es una entidad legal con contabilidad propia. Una sucursal es una dimensión dentro de una empresa (paso 2). Si tus locales facturan bajo el mismo RNC, son sucursales, no empresas.
Cómo verificar que quedó bien
Contabilidad → Plan de Cuentasmuestra el catálogo con cuentas.Contabilidad → Períodos Contablesmuestra los 12 meses del año, abiertos.Contabilidad → Tipos de Pagomuestra Efectivo, Transferencia, Tarjeta y Cheque.- En
Configurar Compañía, el campo RNC está lleno.
Problemas frecuentes
| Síntoma | Causa | Solución |
|---|---|---|
| No aparece el botón "Inicializar ahora" | Ya hay una empresa creada | Correcto: continúa con la parte B |
| "No hay compañías registradas" en Configurar Compañía | Falta inicializar | Vuelve a la parte A |
| Al emitir factura: error por RNC del emisor | El campo RNC está vacío | Complétalo en Configurar Compañía |
Siguiente
Paso 2 — Crea tus sucursales.
Paso 3 — Crea tus usuariosDos formas de dar acceso — crear el usuario con contraseña o enviar una invitación — y cómo asignarle su perfil.
Estado: Listo. Alta con contraseña, invitación por enlace, asignación de perfiles y protección del último administrador, todo verificado en el backend.
Antes de crear usuarios
Define la política de contraseñas primero: se aplica en el momento del alta, así que si la endureces después, los usuarios ya creados conservan su contraseña anterior.
Seguridad → Configuración → Configurar Usuarios (/security/config/usuarios)
| Opción | Valor por defecto |
|---|---|
| Longitud mínima | 8 caracteres |
| Exigir letras y números | No |
| Exigir mayúscula | No |
| Exigir carácter especial | No |
| Bloquear tras N intentos fallidos | 0 = no bloquear |
| Duración del bloqueo | 15 minutos |
Para producción se recomienda al menos: mínimo 10, letras y números, y bloqueo tras 5 intentos.
Permisos necesarios
| Acción | Permiso |
|---|---|
| Ver usuarios | user:read |
| Crear / invitar | user:create |
| Editar | user:update |
| Eliminar | user:delete |
Opción A — Crear el usuario con contraseña
Seguridad → Usuarios → Usuario (/security/usuario/nuevo)
| Campo | Obligatorio | Nota |
|---|---|---|
| Sí | Es el identificador de acceso. Se guarda en minúsculas. No puede repetirse | |
| Contraseña | Sí | Debe cumplir la política configurada arriba |
| Nombre completo | No | Lo que se muestra en el sistema |
| Perfiles | No | Puedes asignarlos aquí o después |
El usuario queda activo de inmediato y ya puede iniciar sesión.
Opción B — Invitar por correo
Al invitar, el sistema crea el usuario inactivo y devuelve un enlace de invitación válido por 7 días. Cuando la persona lo abre, define su propia contraseña y la cuenta se activa.
- El enlace tiene la forma
https://<tu-dominio>/accept-invite?t=<empresa>&token=… - Está limitado a 20 invitaciones por hora.
- La invitación incluye los perfiles que le asignes.
Asignar perfiles
Seguridad → Usuarios → Perfiles Usuario (/security/usuario/perfiles)
Vienen tres perfiles listos para usar:
| Perfil | Alcance |
|---|---|
Administrador (ADMIN) | Acceso total, incluida la configuración y la seguridad |
Gerente (MANAGER) | Gestión operativa: crear, editar, aprobar, contabilizar |
Personal (STAFF) | Operación diaria: leer y crear, sin aprobar ni cerrar períodos |
Si necesitas algo distinto, crea un perfil propio (ver Roles y permisos en Administración).
Protección del último administrador
El sistema impide desactivar, eliminar o quitarle el perfil ADMIN al último administrador activo. Si lo intentas verás:
No se puede dejar el tenant sin al menos un administrador activo
Crea primero el nuevo administrador y después modifica el anterior.
Límite de usuarios
Cada plan tiene un tope de usuarios. Si lo alcanzas, el alta y la invitación fallan con un mensaje de límite. Consulta el plan contratado antes de dar de alta a todo el equipo.
Cómo verificar
Seguridad → Usuarios → Buscar Usuarios lista los usuarios con su estado y perfiles.
Problemas frecuentes
| Síntoma | Causa | Solución |
|---|---|---|
| "Ya existe un usuario con ese email" | El correo está en uso, incluso si el usuario está inactivo | Reactiva el existente en lugar de crear otro |
| "Perfiles inválidos: …" | El nombre de perfil enviado no existe | Revisa el nombre exacto en Seguridad → Perfiles |
| La contraseña es rechazada | No cumple la política del tenant | Ajusta la contraseña o revisa Configurar Usuarios |
| El enlace de invitación no funciona | Pasaron más de 7 días | Vuelve a invitar |
Siguiente
Paso 4 — Configura impuestos y comprobantes fiscales.
Paso 4 — Configura impuestos y comprobantes fiscalesReglas de ITBIS, retenciones y las secuencias de NCF autorizadas por la DGII.
Estado: Listo. Reglas fiscales con vigencia, retenciones y secuencias de NCF con numeración sin saltos, verificadas de punta a punta.
Este paso tiene dos partes independientes: el impuesto (cuánto se cobra) y el comprobante (con qué número fiscal se emite). Necesitas las dos para facturar.
Parte A — Reglas fiscales (ITBIS)
Impuestos → Reglas y Retenciones → Reglas Fiscales (/impuestos/reglas-fiscales)
Una regla fiscal define la tasa que se aplica y desde cuándo. Las reglas tienen vigencia: cuando la tasa cambia, no se edita la regla anterior — se crea una nueva vigencia, de modo que un documento viejo sigue calculando con la tasa que tenía el día en que se emitió.
| Permiso | Para qué |
|---|---|
tax:read | Ver reglas y retenciones |
tax:manage-rules | Crear reglas y abrir nuevas vigencias |
tax:manage-withholdings | Gestionar retenciones |
Cambio de tasa: usa Nueva vigencia, no Editar. Editar la regla cambia el cálculo de todo, incluido lo ya emitido.
Parte B — Retenciones
Impuestos → Reglas y Retenciones → Retenciones (/impuestos/retenciones)
Categorías de retención (ITBIS retenido, ISR retenido) que se aplican al pagar a proveedores. El sistema calcula la retención automáticamente; un usuario con el permiso tax:override-calculation puede sustituir el monto calculado, y esa sustitución queda auditada.
Parte C — Secuencias de NCF
Impuestos → Serie Fiscal (/impuestos/serie-fiscal/nuevo)
Cada rango que la DGII te autoriza se registra como una secuencia:
| Campo | Significado |
|---|---|
| Tipo | El código de comprobante (ver tabla abajo) |
| Número de autorización | El que emitió la DGII |
| Número inicial / final | El rango autorizado (p. ej. 1 a 500) |
| Vigente desde / hasta | Fechas de validez |
| Umbral de alerta | Cuántos comprobantes libres deben quedar para avisarte (por defecto 50) |
| Activa | Si se puede consumir |
No puedes registrar dos secuencias del mismo tipo con el mismo número inicial en la misma empresa.
Tipos de comprobante disponibles
| Código | Nombre | Código | Nombre | |
|---|---|---|---|---|
B01 | Crédito Fiscal | E31 | e-CF Crédito Fiscal | |
B02 | Consumidor Final | E32 | e-CF Consumidor Final | |
B03 | Nota de Débito | E33 | e-CF Nota de Débito | |
B04 | Nota de Crédito | E34 | e-CF Nota de Crédito | |
B11 | Proveedor Informal | E41 | e-CF Compras | |
B12 | Único Ingreso | E43 | e-CF Gastos Menores | |
B13 | Gastos Menores | E44 | e-CF Regímenes Especiales | |
B14 | Regímenes Especiales | E45 | e-CF Gubernamental | |
B15 | Gubernamental | E46 | e-CF Exportaciones | |
B16 | Exportaciones | E47 | e-CF Pagos al Exterior | |
B17 | Pagos al Exterior |
Para la mayoría de empresas basta empezar con B01 (clientes con RNC) y B02 (consumidor final).
Formato del número emitido
El sistema emite B + tipo (2 dígitos) + secuencial (8 dígitos), 11 caracteres sin guiones:
B0100000026
Cuándo se consume el NCF — importante
El NCF se asigna al contabilizar (postear) la factura, no al guardarla como borrador.
| Situación | ¿Consume NCF? |
|---|---|
| Guardar la factura como borrador | No. Solo se guarda el tipo elegido |
| Postear la factura | Sí. Se asigna el número y avanza la secuencia |
| El posteo falla | No. No se pierde ningún número |
| Anular una factura posteada | El número no se devuelve: pasa al reporte 608 |
Esto es lo que hace que la numeración fiscal no tenga saltos.
Parte D — Configuración de impuesto por defecto (opcional)
Seguridad → Configuración → Configurar Impuesto (/security/config/impuesto)
Impuestos → Impuesto Configuración (/impuestos/configuracion/nuevo)
Valores por defecto que el sistema propone al crear documentos.
Cómo verificar
Impuestos → Consulta NCFmuestra las secuencias con su consumo y disponibilidad.- Crea una factura de prueba, postéala y confirma que recibió un NCF con el formato de 11
caracteres.
Impuestos → Reporte 607debe incluir esa factura.
Sobre e-CF (facturación electrónica)
El sistema tiene el módulo de e-CF implementado contra la API real de la DGII (autenticación por semilla firmada, envío y consulta de estado). Requiere tu certificado digital y su clave, que se cargan en la configuración de e-CF. Consulta el artículo e-CF / DGII en Integraciones antes de activarlo en producción: la habilitación depende de tu proceso de certificación con la DGII, no solo del sistema.
Siguiente
Paso 5 — Revisa las formas de pago y condiciones.
Paso 5 — Configura formas de pago y condicionesDiferencia entre tipo de pago y condición de pago, y cómo definir el crédito de tus clientes.
Estado: Listo. Los tipos de pago se crean en la inicialización; las condiciones controlan de verdad el vencimiento, el límite de crédito y el descuento por pronto pago.
Son dos catálogos distintos y suelen confundirse:
| Catálogo | Responde a | Ejemplo |
|---|---|---|
| Tipo de Pago | ¿Con qué instrumento me pagan? | Efectivo, Transferencia, Tarjeta, Cheque |
| Condición de Pago | ¿Cuándo me pagan? | Contado, 30 días, 60 días |
Parte A — Tipos de pago
Contabilidad → Tipos de Pago (/accounting/payment-types)
La inicialización (paso 1) ya creó cuatro:
| Código | Nombre | Método |
|---|---|---|
CASH | Efectivo | CASH |
TRANSFER | Transferencia bancaria | BANK_TRANSFER |
CARD | Tarjeta | CARD |
CHECK | Cheque | CHECK |
Puedes añadir los tuyos (p. ej. Tarjeta Visa, Depósito BHD). El código es único por empresa. Un tipo se puede desactivar, lo que lo saca de los selectores sin borrar el historial.
Parte B — Condiciones de pago
Cuentas por Cobrar → Condición de Pago (/cxc/condiciones)
Esta es la que cambia el comportamiento del sistema:
| Campo | Qué hace |
|---|---|
| Código y Nombre | Identificación (CONTADO, 30D, …) |
| Tipo | CONTADO o CRÉDITO. Es la fuente de verdad, no el nombre |
| Días | Días de crédito. Una condición de contado debe tener 0 |
| Por defecto | La que se propone al facturar. Solo puede haber una por empresa |
| Orden | Posición en el selector |
| Cargo por mora (%) | Cargo de una sola vez sobre el saldo vencido |
| Interés (%) | Interés mensual sobre el saldo vencido, prorrateado por días de atraso |
| Descuento por pronto pago | Actívalo e indica el % y la ventana de días |
Qué cambia según el tipo
| CONTADO | CRÉDITO | |
|---|---|---|
| Fecha de vencimiento | La misma fecha de la factura | Fecha de factura + días |
| Cobro | Se registra junto con la factura, en una sola operación | Queda pendiente en Cuentas por Cobrar |
| Límite de crédito del cliente | No se valida | Se valida: si lo excede, la factura se bloquea |
| Anulación | Revierte factura y cobro juntos | Revierte solo la factura |
Parte C — Crédito por cliente
En la ficha del cliente (Cuentas por Cobrar → Cliente) se define:
- Condición de pago predeterminada — la que se propone al facturarle.
- Límite de crédito — monto máximo pendiente permitido.
- Crédito bloqueado — impide facturarle a crédito.
- Bloqueo comercial total — impide facturarle, incluso de contado.
Recomendación mínima
Crea al menos:
CONTADO— tipo CONTADO, 0 días, marcada por defecto.30D— tipo CRÉDITO, 30 días.
Con eso ya puedes facturar en los dos escenarios.
Cómo verificar
Crea una factura de prueba: al elegir la condición CONTADO el sistema debe pedirte el cobro en la misma pantalla; al elegir 30D debe calcular la fecha de vencimiento a 30 días.
Siguiente
Paso 6 — Importa tus clientes.
Paso 6 — Importa tus clientesPlantilla CSV oficial, columnas aceptadas, límites y qué hace el sistema con los duplicados.
Estado: Listo. Importación tipada con plantilla, validación fila a fila, reporte de errores y deduplicación. Una fila inválida no bloquea las demás.
Ruta
Cuentas por Cobrar → Cliente (/cxc/clientes)
Permisos
| Acción | Permiso |
|---|---|
| Descargar la plantilla | cxc:read |
| Importar | cxc:create |
Paso 1. Descarga la plantilla
Descarga plantilla_clientes.csv. Trae el encabezado correcto y una fila de ejemplo:
code,name,rnc,email,phone,creditLimit,paymentTerms,currency
,Cliente Ejemplo SRL,131000001,[email protected],809-555-0100,50000,30,DOP
Paso 2. Completa el archivo
Columnas aceptadas
| Columna | Obligatoria | Formato | Por defecto |
|---|---|---|---|
name | Sí | Texto | — |
code | No | Texto. Si lo dejas vacío el sistema asigna CLI-0001, CLI-0002… | Automático |
rnc (o taxid) | No | RNC o cédula | vacío |
email | No | Debe tener formato de correo válido | vacío |
phone | No | Texto | vacío |
mobile | No | Texto | vacío |
address | No | Texto | vacío |
city | No | Texto | vacío |
creditLimit | No | Numérico | 0 |
paymentTerms | No | Entero (días) | 30 |
currency | No | Código ISO (DOP, USD) | DOP |
- Cualquier otra columna se ignora y se reporta al final como columna ignorada.
- Las columnas
id,companyIdytenantIdestán prohibidas: si aparecen, el archivo
se rechaza completo. La empresa la determina la pantalla, nunca el archivo.
Límites
| Límite | Valor |
|---|---|
| Tamaño máximo | 2 MB |
| Filas máximas | 5 000 |
Si tienes más, divide el archivo en varias cargas.
Paso 3. Sube el archivo
El sistema procesa fila a fila y devuelve un resumen:
| Resultado | Significado |
|---|---|
| Creados | Clientes nuevos insertados |
| Omitidos | Ya existía un cliente activo con ese RNC o ese código en la empresa |
| Errores | Fila rechazada, con el número de línea y el motivo |
Las filas con error no se intentan; las válidas sí se crean. No hay carga a medias.
Motivos de error que verás
| Mensaje | Causa |
|---|---|
name es requerido | La columna name está vacía |
email inválido: … | El correo no tiene formato válido |
creditLimit no numérico: … | Texto en un campo numérico |
paymentTerms debe ser entero: … | Decimales o texto en los días |
RNC duplicado en el archivo: … | El mismo RNC aparece dos veces dentro del CSV |
code duplicado en el archivo: … | El mismo código aparece dos veces dentro del CSV |
Falta la columna requerida: name | Encabezado incorrecto |
Columnas protegidas no permitidas: … | El archivo trae id, companyId o tenantId |
Consejos para que salga a la primera
- Guarda el CSV en UTF-8. Si lo exportas desde Excel, elige CSV UTF-8, o las tildes
y las «ñ» llegarán rotas.
- Limpia los RNC antes de subir: el sistema no valida el formato del RNC ni
consulta el padrón de la DGII. Un RNC mal escrito llega tal cual al reporte 607.
- Revisa duplicados en tu archivo original: el sistema los detecta dentro del CSV y
contra la base, pero es más rápido corregirlos antes.
- Empieza con 10 filas de prueba antes de subir las 3 000.
Alta manual
Si son pocos, créalos a mano en la pestaña Cliente. Los únicos campos obligatorios son Nombre y Documento.
Cómo verificar
Cuentas por Cobrar → Cliente → Buscar Cliente con filtros por nombre, código, documento, tienda, vendedor, estatus y tipo de cliente.
Siguiente
Paso 7 — Importa tus productos.
Paso 7 — Carga tus productosCrea el catálogo en el orden correcto — unidades, categorías, marcas y luego los ítems.
Estado: Operativo con una limitación importante. El alta de artículos es completa (individual y edición masiva de los ya creados), pero no existe importación por CSV de artículos. Lee la nota al final antes de planificar una migración grande.
Ruta
Inventario → Ítem (/inventory/items)
Antes de crear artículos: los catálogos base
Créalos primero o tendrás que volver a editar cada artículo:
| Catálogo | Ruta | Para qué |
|---|---|---|
| Item Unidad | /inventory/units | Unidad de medida: Unidad, Caja, Libra, Litro |
| Categoría | /inventory/categories | Agrupación del catálogo, usada en reportes |
| Marcas | /inventory/brands | Marca del producto |
| Grupo de Modificadores | /inventory/modifier-groups | Opciones de venta (tamaños, extras) — típico de POS |
| Almacén | /inventory/warehouses | Dónde vive el stock (paso 8) |
Permisos
| Acción | Permiso |
|---|---|
| Ver artículos | inventory:read |
| Crear / editar | inventory:create / inventory:update |
| Ver costos | inventory:view-cost |
Ver costos es un permiso aparte. Un usuario sin inventory:view-cost ve el catálogo pero no los costos ni la valuación.
Crear un artículo
| Campo | Nota |
|---|---|
| Código | Identificador del artículo |
| Nombre | Descripción comercial |
| Unidad | Del catálogo de unidades |
| Categoría / Marca | Opcionales, pero muy útiles en reportes |
| Tipo | Distingue producto de servicio |
| Método de costeo | AVERAGE (promedio, por defecto), FIFO o costo estándar |
| Precio de venta | Puede sobrescribirse con listas de precio |
Sobre el método de costeo
| Método | Cómo valora la salida |
|---|---|
| AVERAGE (por defecto) | Costo promedio ponderado |
| FIFO | Consume las capas de costo más antiguas primero |
| Estándar | Costo fijo; la diferencia va a una cuenta de variación |
Elígelo antes de que el artículo tenga movimientos: cambiarlo después altera la valoración del inventario existente.
Servicios
Un servicio (mano de obra, asesoría) también se crea como artículo, pero no lleva existencias: no descuenta stock ni genera costo de venta.
Edición masiva
Si necesitas cambiar el mismo campo en muchos artículos (por ejemplo, asignar una categoría), selecciónalos en la lista y usa la edición masiva: aplica el mismo cambio a todos los seleccionados en una sola operación.
Limitación real: no hay importación CSV de artículos
| Vía | ¿Sirve para artículos? |
|---|---|
Inventario → Ítem (alta manual) | Sí |
| Edición masiva de artículos existentes | Sí |
Seguridad → Carga Masiva | No para artículos. Esa pantalla carga entidades personalizadas, no el catálogo real de inventario |
| Importación CSV de clientes | Solo clientes |
| Importación CSV del plan de cuentas | Solo cuentas contables |
Qué hacer con un catálogo grande: cárgalo mediante la API (POST de artículos con una API Key, ver Integraciones y API), o solicita la carga inicial a soporte. No existe hoy una pantalla de importación masiva de artículos, y esta documentación no va a decir lo contrario.
Cómo verificar
Inventario → Panel de Inventario muestra el conteo de artículos, y Inventario → Ítem permite buscarlos por código, nombre y categoría.
Siguiente
Paso 8 — Configura inventario.
Paso 8 — Configura inventarioCrea los almacenes y carga la existencia inicial con su costo, para que el costo de venta salga bien desde la primera factura.
Estado: Listo. Almacenes, existencia inicial valorizada y costeo (promedio / FIFO / estándar) verificados contra la contabilidad.
Este es el paso que más se salta y el que más problemas causa después: si cargas la existencia sin costo, tu costo de venta sale en cero y el margen queda inflado.
Parte A — Almacenes
Inventario → Almacén (/inventory/warehouses)
Un almacén es donde vive físicamente el stock. Crea uno por cada lugar donde guardas mercancía: bodega principal, tienda, vehículo de reparto, mercancía en consignación.
| Campo | Nota |
|---|---|
| Código | Corto y estable (PRIN, TIENDA1) |
| Nombre | Legible |
| Activo | Un almacén inactivo no aparece en los selectores |
Almacén ≠ Sucursal. El almacén controla existencias; la sucursal es una dimensión contable. Puedes tener varios almacenes en una misma sucursal.
Si necesitas más detalle dentro de un almacén (pasillo, estante), usa ubicaciones (/inventory/locations).
Parte B — Existencia inicial
Inventario → Revalorización de Costos (/inventory/valuation)
Cada carga inicial registra, para un artículo en un almacén:
| Campo | Obligatorio | Regla |
|---|---|---|
| Artículo | Sí | Debe estar activo |
| Almacén | Sí | Debe estar activo |
| Cantidad | Sí | Mayor que 0 |
| Costo unitario | Sí | 0 o mayor — pon el costo real, no lo dejes en 0 |
| Fecha efectiva | No | Por defecto hoy. No se admite fecha futura |
| Moneda y tasa de cambio | No | Si cargas en otra moneda, el costo se convierte a la moneda base |
| Referencia / memo | No | Para rastrear de dónde salió el dato |
Reglas que el sistema aplica
| Regla | Qué pasa si la incumples |
|---|---|
| Fecha no futura | Se rechaza |
| Fecha anterior a un saldo ya existente | "No se permite registrar valuación con fecha anterior al saldo existente" |
| El saldo actual del artículo es negativo | Se rechaza hasta corregirlo |
| El artículo debe estar activo y ser de inventario | Se rechaza |
Al cargar sobre un artículo que ya tiene existencia, el sistema recalcula el promedio ponderado entre lo que había y lo que entra: no reemplaza el costo, lo promedia.
Parte C — Verifica la valuación
Inventario → Existencia en Almacén / Consulta Inventario (/inventory/reports)
Filtra por artículo, almacén y fecha. Debes ver cantidad, costo unitario y valor total.
Esta pantalla exige el permiso inventory:view-cost. Sin él verás cantidades pero no costos.
Parte D — Conteos y ajustes
| Necesidad | Ruta |
|---|---|
| Conteo cíclico / auditoría de inventario | Inventario → Auditoría Inventario (/inventory/cycle-counts) |
| Entradas, salidas y traslados | Inventario → Movimiento de Inventario (/inventory/movements) |
| Series y lotes | Inventario → Serie y Lote (/inventory/tracking) |
Efecto contable
La existencia inicial y todo movimiento posterior impactan las cuentas configuradas en la empresa:
| Cuenta | Se usa para |
|---|---|
| Inventarios | Valor de la mercancía en existencia |
| Costo de Ventas | Costo reconocido al vender |
| Ajuste de Inventario | Diferencias de conteo |
| Variación de costo estándar | Diferencias cuando el artículo usa costo estándar |
Se configuran en Seguridad → Configuración → Configurar Inventario y en la configuración contable de la empresa.
Cómo verificar antes de facturar
- El artículo aparece en
Existencia en Almacéncon cantidad y costo distintos de cero. Contabilidad → Balanza Comprobaciónmuestra saldo en la cuenta Inventarios.
Si el paso 2 da cero pero sí tienes existencias, la cuenta de inventario no está configurada.
Siguiente
Paso 9 — Emite tu primera factura.
Paso 10 — Registra tu primer cobroRegistra el dinero que entra, aplícalo a las facturas abiertas y confirma el asiento.
Estado: Listo. Cobro aplicado por antigüedad o manualmente, con control de concurrencia y su asiento contable.
Requisitos previos
| Requisito | Dónde |
|---|---|
| Una factura abierta del cliente | Facturación → Factura |
| Cuenta de banco o caja | Banco → Banco → Cuenta Banco |
| Cuentas contables de la empresa | Seguridad → Configuración → Configurar Contabilidad |
| Período contable abierto | Contabilidad → Períodos Contables |
Permisos
| Acción | Permiso |
|---|---|
| Ver recibos | cxc:read |
| Crear y aplicar | cxc:create |
| Anular | cxc:delete |
Ruta
Cuentas por Cobrar → Recibo (/cxc/recibos)
Paso 1. Datos del recibo
| Campo | Obligatorio | Nota |
|---|---|---|
| Cliente | Sí | De quién se recibe |
| Fecha | Sí | Determina el período contable |
| Monto | Sí | Debe ser 0 o mayor |
| Método | No | Efectivo, transferencia, cheque… |
| Referencia | No | Número de transferencia o cheque |
| Cuenta bancaria | No | Define la cuenta contable del débito |
Si no eliges cuenta bancaria, se usa la cuenta de caja por defecto de la empresa. La contrapartida del asiento sale de la cuenta de tesorería elegida — no es un valor fijo.
Paso 2. Aplicar a facturas
Hay dos formas:
| Modo | Cómo | Resultado |
|---|---|---|
| Automático | No indicas facturas | Se aplica por antigüedad: primero la factura abierta con vencimiento más antiguo |
| Manual | Eliges factura y monto | Se aplica exactamente lo que indiques |
Si el monto recibido supera lo aplicado, el recibo queda abierto con saldo a favor del cliente, listo para aplicarse a facturas futuras.
Paso 3. Grabar
Validaciones del sistema
| Validación | Comportamiento |
|---|---|
| El recibo y la factura deben ser del mismo cliente | Rechaza aplicarlo a otro |
| No se aplica a facturas anuladas | Rechaza |
| No se puede exceder el saldo del recibo | Monto supera el saldo disponible |
| Dos aplicaciones simultáneas | La transacción es serializable: no se puede sobre-aplicar |
| Período contable cerrado | Rechaza |
Qué queda registrado
| Efecto | Detalle |
|---|---|
| Recibo | PAG-AAAA-000001 con su saldo aplicado y pendiente |
| Saldo de la factura | Baja por el monto aplicado; llega a 0 y la factura queda saldada |
| Asiento | Débito Caja/Banco (la cuenta elegida) · Crédito Cuentas por Cobrar |
| Estado de cuenta del cliente | Se actualiza |
Cómo verificar
Cuentas por Cobrar → Dashboard— el saldo por cobrar bajó.Cuentas por Cobrar → Reporte CxC— la factura aparece saldada o con el nuevo saldo.Contabilidad → Diario— el asiento del cobro, cuadrado.Contabilidad → Balanza Comprobación— la cuenta de caja/banco subió.
Casos relacionados
| Caso | Dónde |
|---|---|
| El cliente adelanta dinero sin factura | Cuentas por Cobrar → Anticipo CxC |
| Devolución de mercancía | Cuentas por Cobrar → Nota de Crédito |
| Cargo adicional al cliente | Cuentas por Cobrar → Nota de Débito |
| Cobro en el mostrador | Terminal POS |
¡Listo!
Ya cerraste el ciclo completo: empresa → catálogos → factura → cobro → contabilidad.
Revisa ahora el Checklist de puesta en marcha para confirmar que nada quedó a medias.
Acceso y cuenta
Cómo iniciar sesiónCómo entrar al sistema, activar la verificación en dos pasos y cerrar sesiones abiertas en otros dispositivos.
Estado: Listo. Acceso con correo y contraseña, verificación en dos pasos (TOTP), sesiones rotativas con detección de reutilización de token y cierre de sesión remoto.
Tu dirección de acceso
Cada empresa entra por su propia dirección, no por una página compartida:
https://<tu-empresa>.<dominio>
Esa dirección identifica tu empresa: la pantalla de acceso muestra tu logo y colores. Si entras por la dirección equivocada, tus credenciales no funcionarán, aunque sean correctas.
Guarda la dirección en favoritos. Si no la recuerdas, pídesela a quien administra el sistema en tu empresa.
Entrar
- Abre la dirección de tu empresa.
- Escribe tu correo (el mismo con el que te dieron de alta) y tu contraseña.
- Pulsa Iniciar sesión.
Si tu empresa tiene activada la verificación en dos pasos, verás un segundo paso pidiendo el código de 6 dígitos.
Primera vez: invitación por correo
Si te invitaron, recibiste un enlace de la forma:
https://<tu-empresa>.<dominio>/accept-invite?t=...&token=...
Ábrelo y define tu contraseña. El enlace vence a los 7 días; pasado ese plazo pide una invitación nueva. Hasta que lo uses, tu cuenta está inactiva.
Verificación en dos pasos (MFA)
Es el control que evita que alguien entre solo con tu contraseña. Usa una app de autenticación (Google Authenticator, Microsoft Authenticator, 1Password, Authy…).
Activarla
- Entra a tu perfil → Seguridad.
- Elige Activar verificación en dos pasos. Aparece un código QR.
- Escanéalo con tu app de autenticación.
- Escribe el código de 6 dígitos que muestra la app para confirmar.
- Guarda los códigos de respaldo que el sistema te entrega: son tu única forma de entrar
si pierdes el teléfono. Se muestran una sola vez.
Usarla
Al iniciar sesión, después de la contraseña se te pedirá el código de 6 dígitos.
Desactivarla
Desde el mismo lugar, confirmando con un código válido. No se puede desactivar sin demostrar que controlas el segundo factor.
Recomendación: actívala al menos en todas las cuentas con perfil Administrador.
Cerrar sesión
| Acción | Efecto |
|---|---|
| Cerrar sesión | Cierra la sesión de este dispositivo |
| Cerrar todas las sesiones | Cierra la sesión en todos los dispositivos |
Ver dónde tienes sesión abierta
En tu perfil, la lista de sesiones activas muestra cuándo se abrió cada una, desde qué IP y cuándo vence. Puedes cerrar cualquiera de forma individual.
Úsalo si perdiste un equipo o crees que alguien más entró con tu cuenta.
Cuánto dura la sesión
| Elemento | Duración |
|---|---|
| Sesión activa en el navegador | 15 minutos, renovada automáticamente mientras la uses |
| Sesión recordada (sin volver a escribir la contraseña) | Hasta 30 días de inactividad |
La renovación es automática: no notarás nada mientras trabajes.
Si ves «sesión revocada por seguridad»
El mensaje completo es:
Refresh token ya usado — sesión revocada por seguridad, inicia sesión de nuevo
Significa que el sistema detectó que una credencial de sesión se intentó usar dos veces, la señal típica de un token robado. Ante la duda, el sistema cierra toda la cadena de esa sesión. Vuelve a iniciar sesión con normalidad; si se repite a menudo, avisa a quien administra el sistema.
Cambiar tu contraseña
Desde tu perfil. La nueva contraseña debe cumplir la política que definió tu empresa (longitud mínima, mayúsculas, números o caracteres especiales). Si no la cumple, el sistema la rechaza y te dice qué falta.
Si olvidaste tu contraseña, pide a quien administra el sistema que te la restablezca desde Seguridad → Usuarios.
Problemas al entrar
| Síntoma | Causa probable | Solución |
|---|---|---|
| Correo o contraseña incorrectos | Credenciales mal escritas | Revisa mayúsculas y el teclado |
| Entras y te devuelve a la pantalla de acceso | Estás en la dirección de otra empresa | Usa la dirección de tu empresa |
| Usuario inactivo | La cuenta fue desactivada o la invitación no se completó | Contacta a quien administra el sistema |
| Cuenta bloqueada tras varios intentos | Tu empresa activó el bloqueo por intentos fallidos | Espera el tiempo configurado (por defecto 15 minutos) o pide desbloqueo |
| Perdiste el teléfono con el MFA | — | Usa un código de respaldo; si no los tienes, un administrador debe desactivar tu MFA |
| No llegó la invitación | Correo en spam o dirección equivocada | Pide que te reenvíen la invitación |
Primeros pasosEstado: Listo
Estado: Listo
Objetivo
Que un usuario nuevo pueda ingresar al ERP, elegir su empresa y entender cómo está organizada la pantalla.
A quién va dirigido
Cualquier usuario final que use UtilARA ERP por primera vez.
Cuándo se usa
La primera vez que entras, o cuando cambias de empresa.
Requisitos previos
- Tener un usuario creado por el administrador de la empresa (ver
../administrativo/usuarios.md). - La URL del sistema (en producción: bajo
documentolisto.com). - Un navegador moderno (Chrome/Edge/Firefox actualizado).
Paso a paso
- Abre la URL del ERP. Verás la pantalla de Login.
- Escribe tu correo y contraseña y presiona Ingresar.
- Si te invitaron por correo, primero aceptas la invitación (pantalla Aceptar invitación) y defines tu contraseña.
- Al entrar, el sistema te ubica en tu empresa (tenant). Si tienes acceso a varias, hay un selector de empresa en la barra superior (CompanyBar).
- La pantalla tiene 3 zonas:
- Barra superior: empresa activa, tu usuario, notificaciones.
- Menú lateral (sidebar) izquierdo: los módulos (Facturación, CxC, CxP, Compras, Inventario, Banco, Contabilidad, etc.). Se despliegan en sub-ítems.
- Área central: la pantalla del módulo que elegiste.
- Cada ítem del menú es su propia página. Al entrar a un módulo, dentro verás sub-pestañas propias, típicamente "Buscar X" (lista/búsqueda) y "X" (crear/editar el registro).
Campos explicados (login)
| Campo | Qué es |
|---|---|
| Correo | Tu identificador de usuario. |
| Contraseña | Definida por ti al aceptar la invitación o por el admin. |
Botones/acciones
- Ingresar: valida credenciales y abre la sesión.
- Selector de empresa (arriba): cambia el tenant activo sin cerrar sesión.
Validaciones importantes
- Solo ves los módulos y apps que tu empresa tiene instalados y para los que tienes permiso. Si no ves un módulo, puede ser permiso o app no instalada (ver
../soporte/faq.md).
Errores comunes
- "Credenciales inválidas": correo/contraseña incorrectos.
- "No veo ningún módulo": tu perfil no tiene permisos asignados → contacta al administrador.
- "Veo una versión vieja": el navegador cacheó el frontend (Service Worker). Prueba en Incógnito. Ver
../soporte/errores-comunes.md.
Resultado esperado
Estás dentro del ERP, en tu empresa, viendo el menú de módulos permitidos.
Integraciones relacionadas
- Seguridad / RBAC (qué ves depende de tus permisos).
- Apps instalables (qué módulos existen depende de lo instalado).
Permisos necesarios
Ninguno para entrar; los permisos determinan qué módulos ves después.
Notas técnicas
- Frontend React/Vite. Layout del cliente:
ClientLayout. El menú se pinta data-driven desde el manifest/override del tenant (ver../tecnico/menu-y-overrides.md). - Autenticación por JWT. Ver
../tecnico/autenticacion.md.
Cómo moverte en el sistema
Dashboard / Panel de inicioEstado: Casi listo. Existen varias pantallas de inicio (DashboardPage, HomeDashboardPage, DeskHomePage). El grado de datos reales vs. widgets estáticos por tenant no se verificó end-to-end (No verificado).
Estado: Casi listo. Existen varias pantallas de inicio (DashboardPage, HomeDashboardPage, DeskHomePage). El grado de datos reales vs. widgets estáticos por tenant no se verificó end-to-end (No verificado).
Objetivo
Dar una vista rápida del estado del negocio al entrar (ventas, cobros, saldos, alertas).
A quién va dirigido
Todos, especialmente gerencia.
Cuándo se usa
Es la pantalla de aterrizaje tras el login.
Paso a paso
- Al ingresar, llegas al panel de inicio.
- Revisa los indicadores y accesos rápidos.
- Navega a un módulo desde el menú lateral o desde los accesos del panel.
Validaciones importantes
- Los widgets dependen de los módulos/apps instalados y de tus permisos.
Errores comunes
- "Widgets vacíos": aún no hay datos, o el widget consume un módulo no instalado.
Resultado esperado
Vista general del negocio y navegación rápida.
Integraciones relacionadas
- Consume datos de Facturación, CxC, CxP, Inventario, Banco.
Permisos necesarios
Los de los módulos que alimentan cada widget.
Notas técnicas
- Frontend:
DashboardPage.tsx,HomeDashboardPage.tsx,DeskHomePage.tsx. Backendtenant-runtime/dashboard. - No verificado: conexión de cada widget a datos reales por tenant. Verificar antes de destacar el dashboard en una demo.
Manuales
Facturación
Facturación / Ventas / POSEstado: Listo (facturación, cotización, orden de venta, POS conectados a backend real)
Estado: Listo (facturación, cotización, orden de venta, POS conectados a backend real)
Objetivo
Emitir facturas de venta a clientes, con o sin NCF, descontar inventario y generar la contabilidad y la cuenta por cobrar automáticamente.
A quién va dirigido
Facturadores, cajeros (POS), vendedores.
Cuándo se usa
Cada vez que se vende un producto o servicio a un cliente.
Requisitos previos
- Al menos un cliente (ver
cuentas-por-cobrar.mdo../guias-rapidas/crear-cliente.md). - Al menos un ítem (producto/servicio) (ver
inventario.md). - Si facturas fiscal en RD: una serie NCF configurada (ver
ncf-dgii.md). - Impuestos (ITBIS) configurados.
Pantallas (menú Facturación)
| Sub-módulo | Ruta | Para qué |
|---|---|---|
| Factura | /facturacion/factura/buscar · /facturacion/factura/nuevo | Crear/buscar facturas |
| Pre-Factura | /facturacion/pre-factura/* | Documento previo, facturable después |
| Cotización | /facturacion/cotizacion/* | Ofertar sin comprometer |
| Orden de Venta | /facturacion/orden-venta/* | Confirmar pedido de venta |
| Factura Pro-Forma | /facturacion/pro-forma/* | Proforma |
| Factura Recurrente | /facturacion/recurrente/* | Facturación periódica |
| Lista de Precios | /facturacion/lista-precios/* | Precios por lista |
| Descuento / Oferta | /facturacion/descuento/, /facturacion/oferta/ | Promociones |
| Vendedor / Comisión | /facturacion/vendedor/, /facturacion/esquema-comision/ | Comisiones |
| POS | /facturacion/pos y menú Terminal POS (/pos) | Punto de venta |
Paso a paso (factura de venta)
- Menú Facturación → Factura → Factura (nuevo).
- Selecciona el cliente (buscador/lookup).
- Elige el tipo de comprobante / serie NCF si aplica.
- Agrega líneas: ítem, cantidad, precio, descuento. El ITBIS se calcula según la configuración del ítem/impuesto.
- Revisa subtotal, impuesto y total.
- Guardar (borrador) y luego Emitir/Postear para que impacte contabilidad, inventario y CxC.
- Imprimir o generar el comprobante.
Campos explicados
| Campo | Qué es |
|---|---|
| Cliente | A quién se factura. |
| NCF / Serie | Número de comprobante fiscal (si aplica DGII). |
| Ítem / Cantidad / Precio | Qué se vende, cuánto y a qué precio. |
| Descuento | Rebaja por línea o total. |
| ITBIS / Impuesto | Impuesto sobre la venta. |
| Condición de pago | Contado o crédito (define vencimiento en CxC). |
Botones/acciones
- Guardar: deja la factura en borrador (no contabiliza).
- Emitir/Postear: confirma; genera asiento, movimiento de inventario y CxC. Consume el NCF.
- Imprimir / Imprimir en lote: genera el documento.
- Anular: revierte (si el sistema lo permite según estado/período).
Validaciones importantes
- No se puede emitir sin cliente ni sin líneas.
- Si el ítem controla stock, valida disponibilidad.
- El NCF se consume de la serie; no se reutiliza (numeración sin huecos).
- No se puede postear en un período contable cerrado.
Errores comunes
- "No hay NCF disponible": la serie se agotó o no está configurada → ver
ncf-dgii.md. - "Stock insuficiente": falta inventario del ítem.
- "Período cerrado": la fecha cae en un período cerrado.
- "Sin permiso": falta permiso de facturación.
Resultado esperado
Factura emitida con NCF (si aplica), inventario descontado, cuenta por cobrar creada y asiento contable generado. Ver el detalle contable en ../contable/facturacion-y-cxc.md.
Integraciones relacionadas
- Inventario: descuenta stock y registra costo de venta.
- CxC: crea la cuenta por cobrar del cliente.
- Contabilidad: asiento
invoice.created. - NCF/DGII: consume comprobante, alimenta el 607.
Permisos necesarios
Facturación/ventas (recurso sales/billing según pantalla) y cxc para el impacto en cobros. La app base utilara-erp debe estar instalada.
Notas técnicas
- Backend:
backend/src/tenant-runtime/{sales,quotes,pricing,ncf,cxc}; POS en.../pos. - Asiento automático regla
invoice.created: Dr Cuentas por Cobrar / Cr Ingreso / Cr ITBIS por pagar (cuentas 110201 / 410102 / 210201). Ver../contable/facturacion-y-cxc.md. - Skill de referencia:
utilara-billing-production.
Cuentas por Cobrar
Cuentas por Cobrar (CxC)Estado: Listo (clientes, recibos, notas de crédito/débito, anticipos, reportes conectados a backend real)
Estado: Listo (clientes, recibos, notas de crédito/débito, anticipos, reportes conectados a backend real)
Objetivo
Gestionar lo que los clientes te deben: registrar clientes, cobrar facturas, aplicar notas de crédito/débito y anticipos, y ver el estado de cuenta y la antigüedad de saldos (aging).
A quién va dirigido
Cobradores, cajeros, contabilidad de cuentas por cobrar.
Cuándo se usa
Cuando registras un cliente, cobras una factura, das una nota de crédito o consultas cuánto te deben.
Requisitos previos
- Facturas emitidas (ver
facturacion.md) para poder cobrarlas. - Una cuenta de caja/banco para recibir el cobro (ver
banco.md).
Pantallas (menú Cuentas por Cobrar)
| Sub-módulo | Ruta |
|---|---|
| Dashboard | /cxc/dashboard |
| Cliente | /cxc/clientes |
| Tipo de Cliente | /cxc/tipos-cliente |
| Condición de Pago | /cxc/condiciones |
| Recibo (cobro) | /cxc/recibos |
| Anticipo CxC | /cxc/anticipos |
| Nota de Crédito | /cxc/notas-credito |
| Nota de Débito | /cxc/notas-debito |
| Descuento y Devolución | /cxc/descuentos-devoluciones |
| Reporte CxC / Dinámico | /cxc/reportes-cxc, /cxc/reporte-dinamico |
Nota: algunas pantallas de catálogo (Tipo de Cliente, Condición de Pago) pueden ser catálogos maestros básicos. Ver estado en ../comercial/limitaciones-actuales.md.
Paso a paso (cobrar una factura — Recibo)
- Menú Cuentas por Cobrar → Recibo (nuevo).
- Selecciona el cliente.
- El sistema muestra sus facturas abiertas. Marca cuáles cobras y por cuánto (total o parcial).
- Indica la cuenta de caja/banco donde entra el dinero y el medio de pago.
- Si el cliente te aplicó retención o das descuento por pronto pago, regístralo.
- Guardar/Aplicar. Se genera el asiento y baja el saldo del cliente.
Campos explicados
| Campo | Qué es |
|---|---|
| Cliente | Quién paga. |
| Facturas a aplicar | Qué documentos se abonan con este cobro. |
| Monto | Total o parcial por factura. |
| Cuenta caja/banco | Dónde entra el dinero. |
| Retención | Impuesto que el cliente retiene al pagarte. |
Botones/acciones
- Aplicar recibo: confirma el cobro y postea.
- Nota de crédito: reduce lo que el cliente debe (por descuento o devolución).
- Anticipo: registra dinero recibido por adelantado, aplicable luego a facturas.
- Desaplicar: corrige a qué factura se imputó un recibo, una nota o un anticipo sin anularlo.
Desaplicar: cuando el cobro fue a la factura equivocada
El cobro está bien y el dinero entró bien, pero se imputó a la factura que no era.
Desaplicar no anula el cobro. El recibo sigue existiendo con su número y su asiento; la factura vuelve a figurar como pendiente y el recibo recupera saldo disponible para aplicarlo donde corresponde. Anular el recibo, en cambio, reversa el asiento y el movimiento de caja — y el dinero entró de verdad, así que no es lo que quieres.
Cómo se hace: abre el Recibo, el Anticipo o la Nota de Crédito y pulsa Desaplicar. Verás el historial de a qué documentos se aplicó; puedes deshacer una línea o todas, y escribir el motivo, que queda guardado junto a la aplicación.
Qué pasa con la contabilidad:
| Documento | Efecto en el mayor |
|---|---|
| Recibo | Ninguno. El asiento se hizo al registrar el cobro, no al aplicarlo. |
| Nota de crédito | Ninguno, por la misma razón — tampoco se toca el ITBIS ni el NCF. |
| Anticipo | Sí: se reversa el traslado que se hizo al aplicarlo, y el anticipo vuelve a ser dinero a favor del cliente. |
Nada se borra. La aplicación deshecha queda guardada y marcada como reversada, para que el historial del documento sea completo.
Validaciones importantes
- No se puede cobrar más de lo que la factura debe.
- Dos aplicaciones simultáneas del mismo anticipo no deben sobre-aplicar (control de concurrencia).
- No se postea en período cerrado.
Errores comunes
- "Monto excede el saldo": intentas cobrar más de lo debido.
- "Sin cuenta de caja/banco": falta indicar dónde entra el dinero.
- "Anticipo ya aplicado": el anticipo se usó en otra parte.
Resultado esperado
Saldo del cliente reducido, dinero registrado en caja/banco y asiento contable generado. Detalle en ../contable/facturacion-y-cxc.md.
Integraciones relacionadas
- Facturación: origina los documentos a cobrar.
- Banco/Caja: recibe el dinero.
- Contabilidad: asiento
payment.received(Dr Caja / Cr CxC, cuentas 110101 / 110201).
Permisos necesarios
cxc:read, cxc:create, cxc:update, cxc:delete según la acción. App utilara-erp.
Notas técnicas
- Backend:
backend/src/tenant-runtime/cxc. Controllert/:slug/cxc. - Skill:
utilara-cxc-production. Contrato de paridad con 22 pantallas legacy. - Auditoría 2026-08-18: suite de backend en verde (14 archivos de test, 294 casos). El asiento
customer_advance.applied(traslado del pasivo "Anticipos de Clientes" a CxC al aplicar un anticipo) tiene test de regresión y postea correctamente — el bug histórico de GL en Anticipo ya está corregido. - Límite conocido: Reporte CxC (
ReportesCxC.tsx) trae hasta 500 registros por consulta; el backend ya soportapage/limit/totalPagespero la pantalla todavía no tiene los controles de paginación conectados. No afecta la exactitud del reporte, solo el tope de filas visibles a la vez.
Compras
ComprasEstado: Listo (solicitud → cotización → orden de compra → recepción → factura → matching conectados a backend real)
Estado: Listo (solicitud → cotización → orden de compra → recepción → factura → matching conectados a backend real)
Objetivo
Gestionar el ciclo de abastecimiento: pedir materiales, cotizar con proveedores, emitir órdenes de compra, recibir mercancía y casar la factura del proveedor (invoice matching).
A quién va dirigido
Compradores, almacén (recepción), cuentas por pagar.
Cuándo se usa
Cuando la empresa necesita comprar productos o servicios a proveedores.
Requisitos previos
- Proveedores registrados (compartidos con CxP).
- Ítems en inventario.
- Almacenes definidos para recibir.
Pantallas (menú Compras)
| Sub-módulo | Ruta |
|---|---|
| Panel | /compras/panel |
| Solicitud de Material | /compras/solicitud-material |
| Solicitud de Cotización | /compras/solicitud-cotizacion |
| Cotización del Proveedor | /compras/cotizacion-proveedor |
| Orden de Compra | /compras/orden-compra |
| Factura de Compra | /compras/factura-compra |
| Matching de Facturas | /compras/factura-compra/matching |
| Proveedor / Grupo / Artículo / Lista de Precios | /compras/proveedor, /compras/grupo-proveedor, /compras/articulo, /compras/lista-precios |
| Cuadro de Mando de Proveedores | /compras/cuadro-mando |
| Informes | /compras/informes/* |
Paso a paso (compra estándar)
- Solicitud de Material (opcional): quien necesita algo lo solicita.
- Solicitud de Cotización a uno o varios proveedores; registra sus cotizaciones.
- Orden de Compra: confirma qué, a quién, cuánto y a qué precio.
- Recepción: al llegar la mercancía, se recibe contra la OC (total o parcial) → entra al inventario.
- Factura de Compra + Matching: al llegar la factura del proveedor, se casa (2-way/3-way) contra la OC y la recepción; se crea la CxP.
Campos explicados
| Campo | Qué es |
|---|---|
| Proveedor | A quién se compra. |
| Ítem / Cantidad / Precio | Qué, cuánto y a qué costo. |
| Almacén | Dónde entra lo recibido. |
| Recepción parcial | Recibir menos de lo pedido, dejando la OC abierta. |
| Matching | Comparar OC vs. recepción vs. factura. |
Botones/acciones
- Crear OC / Aprobar OC.
- Recibir (recepción): afecta inventario.
- Casar factura (matching): genera la CxP y su asiento.
Validaciones importantes
- La recepción no debe exceder lo ordenado (salvo tolerancia configurada).
- El matching detecta variancias de cantidad/precio.
- Recepción y factura son transaccionales (no dejan estados a medias).
Errores comunes
- "OC ya cerrada": intentas recibir contra una OC completada.
- "Variancia fuera de tolerancia": la factura no cuadra con la OC/recepción.
Resultado esperado
Mercancía recibida en inventario y factura del proveedor registrada como CxP, con contabilidad generada.
Integraciones relacionadas
- Inventario: la recepción aumenta stock y costo.
- CxP: el matching crea la cuenta por pagar.
- Contabilidad: entrada de inventario (
inventory.movement) y factura de proveedor (vendor_bill.created). - Activos Fijos: una factura de proveedor puede capitalizar un activo (ver
activos-fijos.md).
Permisos necesarios
purchasing:read/create/update/delete. App utilara-erp.
Notas técnicas
- Backend:
backend/src/tenant-runtime/purchasing(+ solape concxpyncf). Controllert/:slug/purchasing. - Skill:
utilara-purchasing-production. Flujo E2E en../flujos/compra-completa.md.
Cuentas por Pagar
Cuentas por Pagar (CxP)Estado: Listo (suplidores, facturas de compra, pagos, notas, retenciones conectados a backend real)
Estado: Listo (suplidores, facturas de compra, pagos, notas, retenciones conectados a backend real)
Objetivo
Gestionar lo que tú debes a tus proveedores (suplidores): registrar sus facturas, aplicar retenciones ITBIS/ISR, pagarles, y ver antigüedad de saldos y estado de cuenta.
A quién va dirigido
Cuentas por pagar, tesorería, contabilidad.
Cuándo se usa
Cuando recibes la factura de un proveedor, le pagas, o consultas cuánto le debes.
Requisitos previos
- Un suplidor registrado.
- Idealmente una orden de compra / recepción (ver
compras.md) si sigues el flujo completo de compras. - Cuenta de banco/caja para pagar.
Pantallas (menú Cuentas por Pagar)
| Sub-módulo | Ruta |
|---|---|
| Dashboard | /cxp/dashboard |
| Factura Suplidor | /cxp/facturas-suplidor |
| Suplidor / Tipo de Suplidor | /cxp/suplidores, /cxp/tipos-suplidor |
| Nota de Crédito / Débito | /cxp/notas-credito, /cxp/notas-debito |
| Anticipo CxP | /cxp/anticipos |
| Pago de Contado | /cxp/pagos-contado |
| Orden de Compras | /cxp/ordenes-compra |
| Reporte CxP / Dinámico | /cxp/reportes-cxp, /cxp/reporte-dinamico |
Paso a paso (registrar y pagar factura de proveedor)
- Registrar factura: menú CxP → Factura Suplidor (nuevo). Selecciona el suplidor, escribe el NCF del proveedor, las líneas (gasto/compra), el ITBIS y las retenciones (ITBIS/ISR) si aplican. Guarda → se crea la CxP y su asiento.
- Pagar: menú CxP → Pago (o Pago de Contado). Selecciona el suplidor, marca las facturas a pagar, indica la cuenta de banco/caja y el medio de pago. Aplica → baja el saldo y postea.
Campos explicados
| Campo | Qué es |
|---|---|
| Suplidor | A quién le debes. |
| NCF proveedor | Comprobante fiscal del proveedor (alimenta el 606). |
| Retención ITBIS / ISR | Impuestos que retienes al proveedor. |
| Neto a pagar | Total menos retenciones. |
| Cuenta banco/caja | De dónde sale el pago. |
Botones/acciones
- Guardar factura: crea la CxP y su asiento.
- Aplicar pago: paga una o varias facturas y postea.
- Nota de crédito/débito: ajusta el saldo del proveedor.
- Desaplicar: corrige a qué factura se imputó un pago, una nota o un anticipo sin anularlo.
Desaplicar: cuando el pago fue a la factura equivocada
Es el error más común del día a día: el pago está bien, el dinero salió bien, pero se imputó a la factura que no era.
Desaplicar no anula nada. El pago sigue existiendo con su número, su fecha y su asiento; la factura vuelve a figurar como debida y el pago recupera saldo disponible para aplicarlo donde corresponde. Anular el pago, en cambio, reversa el asiento y el movimiento del banco — y el dinero salió de verdad, así que no es lo que quieres.
Cómo se hace: abre el documento (Pago de Contado, Anticipo o Nota) y pulsa Desaplicar. Verás el historial de a qué facturas se aplicó; puedes deshacer una línea o todas, y escribir el motivo. El motivo queda guardado junto a la aplicación, así que dentro de un año se puede saber quién la corrigió y por qué.
Qué pasa con la contabilidad, según el documento:
| Documento | Efecto en el mayor |
|---|---|
| Pago | Ninguno. El asiento se hizo al registrar el pago, no al aplicarlo. |
| Nota de crédito/débito | Ninguno, por la misma razón. |
| Anticipo | Sí: se reversa el traslado que se hizo al aplicarlo, y el anticipo vuelve a ser dinero a favor disponible. |
Nada se borra. La aplicación deshecha queda guardada y marcada como reversada, para que el historial del documento sea completo.
Validaciones importantes
- No se puede pagar más del saldo pendiente.
- Concurrencia: dos pagos sobre la misma factura no deben sobre-aplicar.
- No se postea en período cerrado.
Errores comunes
- "NCF duplicado": el NCF del proveedor ya se registró.
- "Saldo insuficiente en la factura": intentas pagar de más.
- "Sin cuenta de banco": falta indicar la fuente del pago.
Resultado esperado
Deuda con el proveedor registrada y luego reducida al pagar; asientos contables generados; NCF del proveedor listo para el 606.
Integraciones relacionadas
- Compras: origina las facturas (invoice matching).
- Banco/Caja: sale el dinero.
- Contabilidad:
vendor_bill.created(Dr Gasto + Dr ITBIS adelantado / Cr Retenciones / Cr CxP) ypayment.sent(Dr CxP / Cr Caja). Cuentas 520105 / 110401 / 210203-210204 / 210101 / 110101. - NCF/DGII: alimenta el 606.
Permisos necesarios
cxp:read, cxp:create, cxp:update, cxp:delete. App utilara-erp.
Notas técnicas
- Backend:
backend/src/tenant-runtime/cxp. Controllert/:slug/cxp. - Skill:
utilara-cxp-production. Ver detalle contable en../contable/compras-y-cxp.md.
Inventario
InventarioEstado: Listo (ítems, almacenes, movimientos, costeo conectados a backend real). Nota: la pantalla real conectada es InventoryPage.tsx; existió una maqueta antigua bajo pages/inventario/ — usar las rutas /inventory/ del menú.
Estado: Listo (ítems, almacenes, movimientos, costeo conectados a backend real). Nota: la pantalla real conectada es InventoryPage.tsx; existió una maqueta antigua bajo pages/inventario/ — usar las rutas /inventory/* del menú.
Objetivo
Controlar los productos: qué hay, dónde, cuánto cuesta, y registrar todas sus entradas y salidas.
A quién va dirigido
Almacenistas, compras, ventas, contabilidad de costos.
Cuándo se usa
Al crear productos, recibir/despachar mercancía, trasladar entre almacenes, ajustar existencias o consultar stock.
Requisitos previos
- Al menos un almacén (ver
../administrativo/almacenes.md). - Categorías/unidades básicas del ítem.
Pantallas (menú Inventario)
| Sub-módulo | Ruta |
|---|---|
| Panel de Inventario | /inventory/dashboard |
| Ítem | /inventory/items |
| Categoría / Unidad / Marcas | /inventory/categories, /inventory/units, /inventory/brands |
| Almacén | /inventory/warehouses |
| Movimiento de Inventario | /inventory/movements (entrada, salida, traslado, conduce, despacho, devolución…) |
| Serie y Lote | /inventory/tracking |
| Existencia / Consulta / Reportes | /inventory/reports |
| Revalorización de Costos | /inventory/valuation |
| Auditoría (conteo cíclico) | /inventory/cycle-counts |
Paso a paso (crear un ítem)
- Menú Inventario → Ítem (nuevo).
- Escribe código, nombre, categoría, unidad.
- Define si controla stock, su método de costeo (FIFO / promedio / estándar), impuestos y precio.
- Guarda.
Paso a paso (movimiento de inventario)
- Menú Inventario → Movimiento de Inventario.
- Elige el tipo (entrada, salida, traslado…).
- Selecciona almacén(es), ítems y cantidades.
- Confirma → actualiza existencias y, si aplica, postea el asiento de inventario.
Cuadrar el inventario con la contabilidad
Tu inventario vive en dos sitios que deben decir lo mismo:
- El auxiliar — lo que hay en el almacén, artículo por artículo, con su valor.
- La cuenta contable de Inventario — lo que dice tu balance general.
Si no coinciden, tu balance está mal aunque cada asiento por separado esté cuadrado.
En Inventario → Reportes → Conciliación se comparan las dos cifras y, cuando hay diferencia, se listan los asientos que tocaron la cuenta de Inventario sin venir de un movimiento de inventario — que es la causa habitual.
También se revisa una segunda cosa: que la existencia de cada artículo coincida con la suma de su kardex. El sistema escribe ambas a la vez, así que una diferencia solo puede venir de una manipulación hecha por fuera de la aplicación.
Regularizar una diferencia
Cuando la diferencia es real y su origen ya no se puede reconstruir, se regulariza. La forma correcta no es retocar movimientos viejos ni cambiar fechas: es reconocer la diferencia hoy, dejando constancia.
Al regularizar se te exige un motivo, y el sistema genera dos cosas:
- Un movimiento de ajuste (
AJU-…) que repone el rastro del kardex. **No cambia tu
existencia**: el almacén tiene lo que tiene; lo que se repara es el registro de cómo llegó a esa cantidad.
- Un asiento contable fechado hoy, contra la cuenta Ajuste de Inventario — nunca
contra Costo de Ventas, porque una diferencia de conciliación no es un costo de vender.
Ambos quedan visibles, con tu nombre y tu motivo, y se pueden anular como cualquier otro documento. Si vuelves a regularizar cuando ya cuadra, no hace nada: no duplica.
Antes de regularizar, vale la pena hacer un conteo físico si la diferencia es grande. Regularizar cierra el hueco contable; contar confirma que la existencia que quedará como buena es la real.
Campos explicados
| Campo | Qué es |
|---|---|
| Método de costeo | Cómo se valora la salida (FIFO/promedio/estándar). |
| Almacén origen/destino | Para traslados. |
| Serie/Lote | Trazabilidad y vencimiento. |
| Costo | Valor unitario del ítem en existencia. |
Botones/acciones
- Guardar ítem.
- Postear movimiento: afecta existencias (y GL si corresponde).
- Revalorizar: ajusta el costo de existencias.
- Conteo cíclico: ajusta stock a lo contado físicamente.
Validaciones importantes
- El stock no debe quedar negativo (salvo configuración).
- Existencia y libro de inventario (Kardex/Stock Ledger) siempre coinciden.
- Los movimientos son transaccionales.
Errores comunes
- "Stock insuficiente": no hay existencia para la salida.
- "Ítem sin costo": falta costo para valorar.
Resultado esperado
Existencias actualizadas, costo recalculado y, cuando corresponde, asiento de inventario/costo de venta.
Integraciones relacionadas
- Compras: recepción aumenta stock.
- Facturación: venta descuenta stock y genera costo de venta (COGS).
- Contabilidad: regla
inventory.movement(entrada: Dr Inventario / Cr contrapartida; salida: Dr COGS / Cr Inventario; cuentas 110301 / 510101).
Permisos necesarios
inventory:read/create/update/delete. App utilara-erp.
Notas técnicas
- Backend:
backend/src/tenant-runtime/inventory. Controllert/:slug/inventory. Frontend real:InventoryPage.tsx. - Skill:
utilara-inventory-production. Detalle contable en../contable/inventario-y-costo.md.
Banco
BancoEstado: Completo. Las cuentas de banco/caja y sus movimientos usan el ledger real (BankAccount/BankTransaction). La conciliación bancaria es completa desde el 2026-07-22: captura el saldo del extracto, permite marcar partidas a mano o impor
Estado: Completo. Las cuentas de banco/caja y sus movimientos usan el ledger real (BankAccount/BankTransaction). La conciliación bancaria es completa desde el 2026-07-22: captura el saldo del extracto, permite marcar partidas a mano o importar el extracto del banco con emparejamiento automático, y no deja cerrar una conciliación que no cuadre. Las cuentas contables por moneda y la impresión de cheques con formato configurable quedaron cerradas el 2026-07-22.
Objetivo
Administrar las cuentas bancarias y de caja de la empresa: registrar cheques, depósitos, transferencias, cargos bancarios y conciliar contra el estado del banco.
A quién va dirigido
Tesorería, contabilidad, finanzas.
Cuándo se usa
Cuando se mueve dinero por banco/caja fuera de una factura de venta/compra directa (transferencias, cheques, cargos, depósitos, conciliación).
Requisitos previos
- Cuentas de banco/caja creadas (menú Banco → Banco → Cuenta Banco).
- Monedas configuradas.
Pantallas (menú Banco) — menú de 3 niveles
| Ítem | Sub-pantallas | Ruta base |
|---|---|---|
| Banco | Buscar Banco, Banco, Buscar/Cuenta Banco | /banco/banco/* |
| Cargo Bancario | Buscar, Detalle | /banco/cargo-bancario/* |
| Cheque | Buscar, Detalle, Imprimir en lote | /banco/cheque/* |
| Conciliación | Buscar, Conciliar | /banco/conciliacion/* |
| Crédito Bancario | Buscar, Detalle | /banco/credito-bancario/* |
| Cambio Tasa | Buscar, Crear | /banco/cambio-tasa/* |
| Depósito Bancario | Buscar, Detalle | /banco/deposito-bancario/* |
| Moneda | Buscar, Detalle | /banco/moneda/* |
| Solicitud Pago | Buscar, Detalle, Pagos Masivos, Aprobaciones Masivas | /banco/solicitud-pago/* |
| Tipo de Cuenta | Buscar, Detalle | /banco/tipo-cuenta/* |
| Transferencia Bancaria | Buscar, Transferencia | /banco/transferencia-bancaria/* |
| Reportes | Reporte Banco, Reporte Dinámico | /banco/reporte-banco/* |
Paso a paso (transferencia entre cuentas)
- Menú Banco → Transferencia Bancaria → Transferencia.
- Elige cuenta origen y cuenta destino.
- Escribe monto y fecha.
- Confirma → mueve el saldo y postea el asiento.
Paso a paso (conciliación bancaria)
Conciliar es comprobar que lo que tú registraste coincide con lo que el banco dice.
- Menú Banco → Conciliación → Conciliar.
- Elige la cuenta y escribe el saldo según el extracto del banco — el número que
aparece en el estado de cuenta que te envía el banco. Es obligatorio: es contra lo que se compara todo.
- Marca las partidas que el banco ya refleja. Dos formas:
- A mano: la lista de la izquierda son las que el banco todavía no muestra;
márcalas una a una a medida que las encuentres en tu estado de cuenta.
- Importando el extracto: sube el archivo CSV que descargas del banco
(fecha,descripción,referencia,monto, con el monto negativo si es una salida). El sistema empareja solo las que coinciden en monto y fecha.
- Mira la diferencia arriba a la derecha. Cuando llegue a cero, el botón
Cerrar Conciliación se habilita.
Cómo leer la pantalla
La franja de arriba es la cuenta que tienes que cuadrar:
Saldo según el banco + depósitos en tránsito − pendientes de cobro = saldo en libros
- Depósitos en tránsito: dinero que tú ya registraste como entrado pero que el banco
todavía no acredita.
- Pendientes de cobro: cheques que giraste o pagos que hiciste y que el banco aún no
ha descontado.
- Diferencia: lo que falta por explicar. Si no es cero, algo no está cuadrado.
Si importaste el extracto, abajo verás las líneas del banco. Las que queden sin pareja son cosas que el banco cobró y tú no has registrado — casi siempre comisiones o intereses. Regístralas como Cargo Bancario o Crédito Bancario y vuelve a conciliar.
Reglas que te va a aplicar el sistema
- No se puede cerrar una conciliación que no cuadra. Si lo intentas, te dice cuánto
falta y por qué. Cerrar es afirmar que libros y banco coinciden.
- Una sola conciliación abierta por cuenta. Dos repartirían las partidas entre dos
documentos y ninguno cuadraría.
- Solo entran las partidas hasta la fecha del extracto. Un movimiento posterior no es
una partida en tránsito, es del mes siguiente.
- Lo cerrado no se toca. Si necesitas corregir algo, usa Reabrir — las marcas se
conservan.
- Desmarcar una partida nunca borra nada: vuelve a la columna de pendientes.
Cuentas por moneda
Si facturas en dólares además de en pesos, no querrás que ambos saldos caigan en la misma cuenta contable: el balance por moneda sería imposible de presentar.
En Banco → Moneda → Cuentas por Moneda eliges, para cada moneda, qué cuenta usa cada concepto: Cuentas por Cobrar y por Pagar, Anticipos, Caja, Notas de Crédito, y las de Ganancia y Pérdida por Diferencia Cambiaria.
- Lo que dejes en blanco usa la cuenta general de la empresa, igual que hasta ahora.
No configurar nada no rompe nada.
- Las cuentas de Prima reciben el ajuste por diferencia cambiaria. Si las configuras,
la revaluación mueve la prima y deja intacta la cuenta de control — así ves el ajuste por separado del saldo real del cliente o del proveedor. Si las dejas vacías, el ajuste va contra la propia cuenta de control.
- Solo puedes elegir cuentas de movimiento: una cuenta de agrupación no admite asientos.
Imprimir cheques
En Banco → Cheque → Imprimir Cheques en lote seleccionas los cheques y los mandas a imprimir. Lo que sale por la impresora son solo los datos, colocados para caer en su sitio sobre el papel preimpreso del banco.
- El tamaño y los ajustes vertical y horizontal salen de la cuenta bancaria
(Banco → Cuenta Banco). Cada impresora alimenta el papel con un desvío distinto: se corrige una vez por cuenta, imprimiendo una prueba y moviendo los milímetros que hagan falta.
- El monto en letras lo escribe el sistema. No es un adorno: si no coincide con el
número, legalmente manda la cantidad en letras.
- Todos los cheques del lote deben ser de una misma cuenta, porque cada una tiene su
propio papel y sus propios ajustes.
- Al imprimir quedan marcados como impresos y dejan de aparecer en el listado.
Campos explicados
| Campo | Qué es |
|---|---|
| Cuenta banco/caja | La cuenta afectada. |
| Cargo bancario | Comisión/cargo que cobra el banco. |
| Cheque | Pago con cheque emitido. |
| Partida en tránsito | Movimiento registrado en el libro pero aún no en el banco (o viceversa). |
Validaciones importantes
- Toda transferencia/cheque/depósito genera su contrapartida en el GL (fail-closed).
- No se crea saldo bancario paralelo: es el mismo ledger que usan CxC/CxP/Caja Chica.
Errores comunes
- "Saldo insuficiente": la cuenta origen no tiene fondos.
- "Conciliación no cuadra": faltan partidas en tránsito por identificar.
Resultado esperado
Movimientos de banco/caja registrados con su asiento, y conciliación con el saldo del banco.
Integraciones relacionadas
- CxC/CxP/Caja Chica: todos los cobros/pagos aterrizan aquí.
- Contabilidad: cada movimiento postea al GL.
Permisos necesarios
banking:read/create/update/delete. App utilara-erp.
Notas técnicas
- Backend:
backend/src/tenant-runtime/banking(reutiliza modelos de TesoreríaBankAccount/BankTransaction). Controllert/:slug/banking. - Skills:
utilara-banking-production,utilara-treasury-production. - Multi-moneda: cada moneda puede tener sus propias cuentas contables (Moneda → Cuentas por Moneda). Lo que se deje en blanco usa la cuenta general de la empresa.
- Cheques: la impresión usa el formato y los ajustes configurados en la cuenta, y escribe el monto en letras automáticamente. Ver
../comercial/limitaciones-actuales.md.
Caja Chica
Caja ChicaEstado: Listo (fondo, desembolso, reposición con GL + Tesorería; migración aplicada a tenants).
Estado: Listo (fondo, desembolso, reposición con GL + Tesorería; migración aplicada a tenants).
Objetivo
Manejar un fondo de efectivo pequeño para gastos menores: crear el fondo, registrar desembolsos y reponerlo cuando baja.
A quién va dirigido
Encargado de caja chica, contabilidad.
Cuándo se usa
Para gastos menores en efectivo que no pasan por banco directamente (transporte, papelería, etc.).
Requisitos previos
- Una cuenta de banco de la que sale el dinero para fondear/reponer.
- Cuentas de gasto para clasificar los desembolsos.
Pantallas (menú Caja Chica)
| Sub-módulo | Ruta |
|---|---|
| Caja Chica (fondo) | /caja-chica/caja-chica |
| Desembolso | /caja-chica/desembolso |
| Reposición | /caja-chica/reposicion |
| Reporte Caja Chica | /caja-chica/reporte |
Paso a paso
- Crear fondo: menú Caja Chica → Caja Chica (nuevo). Define el monto del fondo y la cuenta de banco de la que sale. Al crear/fondear, se transfiere el dinero (asiento vía Tesorería).
- Desembolso: menú Desembolso. Registra cada gasto: cuenta de gasto, monto, beneficiario, comprobante. El fondo disponible baja.
- Reposición: menú Reposición. Cuando el fondo está bajo, se repone por el total de los desembolsos, devolviéndolo a su monto original (sale dinero del banco).
Campos explicados
| Campo | Qué es |
|---|---|
| Monto del fondo | Tope del efectivo asignado. |
| Cuenta de gasto | Clasifica cada desembolso. |
| Disponible | Lo que queda en el fondo. |
| Reposición | Reembolso del gasto para volver al tope. |
Botones/acciones
- Crear fondo (pay-check desde banco).
- Registrar desembolso (reduce disponible; postea gasto fluctuante).
- Reponer (devuelve el fondo al tope; sale dinero del banco).
Validaciones importantes
- No se desembolsa más que el disponible del fondo.
- Concurrencia controlada (CAS) para no duplicar desembolsos.
- No crea saldo bancario paralelo: usa
BankAccount/BankTransaction.
Errores comunes
- "Fondo insuficiente": el desembolso supera lo disponible.
- "Módulo no responde": revisar guard (no debe usar
CombinedAuthGuardpropio) — nota técnica.
Resultado esperado
Fondo creado, gastos registrados y fondo repuesto, todo con su contabilidad.
Integraciones relacionadas
- Banco/Tesorería: fondear y reponer mueven dinero del banco.
- Contabilidad: gasto fluctuante en el desembolso; ver
../contable/caja-chica.md.
Permisos necesarios
Recurso petty-cash (acciones propias del módulo). App utilara-erp.
Notas técnicas
- Backend:
backend/src/tenant-runtime/petty-cash. Controllert/:slug/petty-cash/:companyId. - Skill:
utilara-petty-cash-production. GOTCHA: permisos en doble copia.ts/.mjs; no usarCombinedAuthGuarddentro del módulo.
Activos Fijos
Activos FijosEstado: Listo (activos, depreciación, retiro, revalorización con GL balanceado; migración aplicada a tenants).
Estado: Listo (activos, depreciación, retiro, revalorización con GL balanceado; migración aplicada a tenants).
Objetivo
Registrar los bienes de larga duración (equipos, mobiliario, vehículos), depreciarlos periódicamente, revalorizarlos y darlos de baja cuando se venden o desechan.
A quién va dirigido
Contabilidad de activos, administración.
Cuándo se usa
Al comprar un activo capitalizable, al correr la depreciación mensual, o al retirar/vender un activo.
Requisitos previos
- Tipo de Activo Fijo y Tipo de Depreciación configurados.
- Cuentas contables de activo, depreciación acumulada y gasto.
Pantallas (menú Activos Fijos)
| Sub-módulo | Ruta |
|---|---|
| Activo Fijo | /activos/activo-fijo |
| Tipo de Activo Fijo | /activos/tipo-activo |
| Tipo de Depreciación | /activos/tipo-depreciacion |
| Depreciación | /activos/depreciacion |
| Retiro (baja) | /activos/retiro |
| Revalorización | /activos/revalorizacion |
| Tasa de Inflación | /activos/tasa-inflacion |
| Reportes AF | /activos/reportes |
Paso a paso
- Crear activo: menú Activos Fijos → Activo Fijo (nuevo). Registra descripción, costo, fecha de adquisición, vida útil, valor residual y método de depreciación. (Puede capitalizarse desde una Factura de Suplidor.)
- Depreciar: menú Depreciación. Selecciona el período y ejecuta → genera el asiento de gasto por depreciación.
- Revalorizar (opcional): ajusta el valor del activo al alza/baja.
- Retirar/dar de baja: menú Retiro. Registra venta o desecho → calcula ganancia/pérdida y genera el asiento.
Campos explicados
| Campo | Qué es |
|---|---|
| Costo | Valor de adquisición. |
| Vida útil | Años/períodos a depreciar. |
| Valor residual | Valor estimado al final. |
| Método | Línea recta, saldo decreciente, unidades. |
| Depreciación acumulada | Lo depreciado hasta la fecha. |
Botones/acciones
- Crear/Capitalizar activo.
- Ejecutar depreciación (postea gasto).
- Revalorizar / Retirar (postean sus asientos).
Validaciones importantes
- No se deprecia dos veces el mismo período (control de concurrencia).
- Los asientos siempre cuadran (Σdébito=Σcrédito).
- No se postea en período cerrado.
Errores comunes
- "Ya depreciado en este período": doble depreciación evitada.
- "Activo ya retirado": intentas operar un activo dado de baja.
Resultado esperado
Activo registrado y su valor en libros actualizado por depreciación/revalorización; al retirarlo, ganancia/pérdida reconocida.
Integraciones relacionadas
- Compras/CxP: una factura de proveedor puede capitalizar el activo.
- Contabilidad: asientos de depreciación, revalorización y retiro. Ver
../contable/activos-fijos.md.
Permisos necesarios
fixed-assets:read/create/update/delete/capitalize/depreciate/dispose. App utilara-erp.
Notas técnicas
- Backend:
backend/src/tenant-runtime/fixed-assets. Controllert/:slug/fixed-assets+ sub-controllers (depreciation-type, asset-revaluation, asset-disposal, inflation-rate, fixed-asset-type). GOTCHA: registrar sub-controllers antes del base. - Skill:
utilara-fixed-assets-production.
Terminal POS
Terminal POSAbrir turno, vender, cobrar, anular, devolver y cerrar caja con arqueo.
Estado: Listo. Turnos con arqueo, venta de contado y a crédito, anulación, devolución, reimpresión y reportes, todo con permisos que se aplican de verdad.
Para quién
Cajeros y encargados de tienda. El POS es la pantalla de mostrador: rápida, con teclado, para cobrar de cara al cliente.
Rutas
Terminal POS → Punto de Venta (/pos → /facturacion/pos)
Terminal POS → Terminal (/terminal-pos/terminal)
Terminal POS → Terminal de Impresión (/terminal-pos/impresion)
Facturación → Tiendas (/facturacion/tienda/buscar)
Antes de vender
| Requisito | Dónde |
|---|---|
| Tienda creada | Facturación → Tiendas |
| Almacén asignado con existencias | Inventario → Almacén |
Secuencia de NCF activa (normalmente B02 consumidor final) | Impuestos → Serie Fiscal |
| Cuenta de caja | Banco → Cuenta Banco |
| Usuario con permisos de POS | Seguridad → Perfiles |
Permisos — cada acción tiene el suyo
Esto es lo que permite dar a un cajero solo lo que necesita:
| Permiso | Qué habilita |
|---|---|
pos:read | Ver tiendas, sesiones y ventas |
pos:open-session | Abrir turno |
pos:sell | Vender y cobrar |
pos:sell-on-credit | Vender a crédito |
pos:apply-discount | Aplicar descuento |
pos:override-price | Cambiar el precio (queda auditado) |
pos:void-sale | Anular una venta |
pos:return-sale | Procesar una devolución |
pos:refund | Reembolsar |
pos:reprint | Reimprimir el comprobante |
pos:cash-in / pos:cash-out | Registrar aporte o retiro de caja |
pos:close-session | Cerrar turno (arqueo) |
pos:approve-difference | Aprobar una diferencia de arqueo |
pos:view-reports | Ver reportes |
pos:manage-terminals | Administrar tiendas y cajas |
Recomendación: un cajero típico necesitaread,open-session,sell,close-sessionyreprint. No le desvoid-sale,override-priceniapprove-difference: esos son del encargado.
Abrir el turno
- Entra al Terminal POS y elige tu tienda / caja.
- Pulsa Abrir turno.
- Declara el fondo inicial (el efectivo con el que empiezas).
Sin turno abierto no se puede vender.
Vender
- Agrega artículos: por código de barras, por búsqueda o desde el catálogo en pantalla.
- Ajusta cantidades.
- Elige el cliente si aplica (para consumidor final no es obligatorio; para crédito, sí).
- Cobra: elige el método de pago e indica el efectivo recibido — el sistema calcula el
cambio.
- El comprobante se imprime.
Venta a crédito
Requiere pos:sell-on-credit y un cliente identificado. La venta genera una cuenta por cobrar, igual que una factura normal.
Descuentos y cambios de precio
Requieren su permiso. Un cambio de precio queda auditado: se registra quién lo hizo.
Movimientos de caja durante el turno
| Movimiento | Cuándo |
|---|---|
Aporte de caja (cash-in) | Entra dinero que no viene de una venta (cambio, fondo adicional) |
Retiro de caja (cash-out) | Sale dinero (traslado a bóveda, pago menor) |
Regístralos en el momento: el arqueo los toma en cuenta.
Reporte X — cómo va el turno
Muestra el estado del turno sin cerrarlo: ventas, cobros por método y efectivo esperado. Úsalo para revisar a mitad de jornada o antes de cerrar.
Anular y devolver
| Situación | Acción | Permiso |
|---|---|---|
| Te equivocaste al cobrar, el cliente no se llevó nada | Anular venta | pos:void-sale |
| El cliente devuelve mercancía | Devolución | pos:return-sale |
| Hay que regresar dinero | Reembolso | pos:refund |
Anular revierte la venta, el inventario y la contabilidad. Si la venta llevó comprobante fiscal, el número no se reutiliza: pasa al reporte 608.
Cerrar el turno (arqueo)
- Cuenta el efectivo físico en caja.
- Pulsa Cerrar turno y declara lo contado.
- El sistema compara contra lo esperado y muestra la diferencia.
| Resultado | Qué pasa |
|---|---|
| Sin diferencia | El turno cierra |
| Con diferencia | Puede requerir la aprobación de alguien con pos:approve-difference |
Cerrar el turno deja el registro completo del día: ventas, cobros por método, movimientos de caja y diferencia.
Reimprimir un comprobante
Con pos:reprint, desde la venta.
Reportes
Con pos:view-reports: ventas por turno, por caja y por método de pago.
Problemas frecuentes
| Síntoma | Causa | Solución |
|---|---|---|
| No deja vender | No hay turno abierto | Abre el turno |
| Falta el botón de descuento o anulación | Falta el permiso | El encargado debe autorizar |
| Un artículo no aparece | Sin existencia en el almacén de la tienda, o inactivo | Revisa el inventario del almacén |
| No emite comprobante fiscal | Secuencia agotada o vencida | Registra una serie nueva |
| El arqueo no cuadra | Faltó registrar un aporte o retiro | Regístralos siempre; revisa el reporte X |
Proyectos
ProyectosProyectos, tareas, registro de horas y rentabilidad calculada sobre la contabilidad real.
Estado: Operativo. La rentabilidad se calcula sobre los asientos contables reales filtrados por la dimensión de proyecto. Las pantallas de tareas y horas funcionan; la planificación avanzada (diagrama de Gantt, dependencias entre tareas) no existe.
Para qué sirve
Para saber cuánto costó y cuánto dejó un trabajo concreto: una obra, una implementación, un contrato. El proyecto actúa como una dimensión contable: los documentos que lo llevan asignado suman a su rentabilidad.
Rutas
Proyecto → Proyecto (/proyecto/proyectos)
Proyecto → Rentabilidad (/proyectos/rentabilidad)
Proyecto → Reportes (/proyecto/reportes)
Proyecto → Tareas → Tareas (/utilara-erp/task)
Proyecto → Tiempo y Costos → Registro de Horas (/utilara-erp/timesheet)
Proyecto → Configuración → Tipos de Proyecto (/utilara-erp/project-type)
Permisos
| Permiso | Qué habilita |
|---|---|
project:read | Ver proyectos, tareas y horas |
project:create | Crear proyectos |
project:update | Editar proyectos |
project:delete | Eliminar proyectos |
project:manage-tasks | Crear y editar tareas, y registrar horas |
project:audit | Ver la auditoría del proyecto |
Los botones de eliminación no aparecen si no tienes el permiso.
Crear un proyecto
| Campo | Nota |
|---|---|
| Nombre | Identificación del trabajo |
| Tipo de proyecto | Del catálogo Tipos de Proyecto |
| Cliente | A quién se le factura |
| Fechas | Inicio y fin previstos |
| Estado | Avance del proyecto |
| Presupuesto | Referencia contra la que se compara la ejecución |
El proyecto pertenece a una empresa: el espacio de trabajo respeta la empresa seleccionada y tus permisos efectivos.
Tareas
Con project:manage-tasks:
- Crear tareas dentro del proyecto, con su tipo de tarea.
- Registrar actualizaciones de avance.
No hay diagrama de Gantt, ni dependencias entre tareas, ni ruta crítica. Las tareas son una lista de trabajo con estado, no un planificador.
Registro de horas
Proyecto → Tiempo y Costos → Registro de Horas
Las horas se registran contra una tarea. Junto con los costos de actividad y los tipos de actividad, permiten valorar la mano de obra del proyecto.
Rentabilidad — de dónde salen los números
Proyecto → Rentabilidad (/proyectos/rentabilidad)
Esta pantalla no tiene cifras propias: consulta los asientos contables reales filtrados por la dimensión proyecto. Por eso:
- Un documento sin proyecto asignado no aparece en la rentabilidad de ningún proyecto.
- Un documento en borrador tampoco: solo cuentan los asientos posteados.
| Concepto | De dónde sale |
|---|---|
| Ingresos | Asientos de venta con ese proyecto |
| Costos | Asientos de costo y gasto con ese proyecto |
| Margen | Diferencia entre ambos |
| Ejecución presupuestaria | Comparación contra el presupuesto asignado |
Lo más importante: para que la rentabilidad sea real, asigna el proyecto en los documentos (facturas, compras, gastos) en el momento de registrarlos. Si nadie lo asigna, la pantalla saldrá vacía y no será un error del sistema.
Cifras que nunca se muestran solas
Las magnitudes de comprometido y cobrado siempre se presentan con su contexto (contra qué se comparan), para no confundir un valor parcial con el resultado del proyecto.
Presupuesto por proyecto
En Contabilidad → Presupuestos, cada línea de presupuesto puede asignarse a un proyecto, además de centro de costo, departamento y sucursal. La importación por CSV acepta esas columnas.
Reportes
Proyecto → Reportes — listados de proyectos con su estado y avance.
Limitaciones reales
| Expectativa | Realidad |
|---|---|
| Diagrama de Gantt | No existe |
| Dependencias entre tareas | No existe |
| Asignación de recursos y capacidad | No existe |
| Facturación automática por avance de obra | No existe: se factura manualmente |
| Rentabilidad en tiempo real de documentos en borrador | No: solo asientos posteados |
Problemas frecuentes
| Síntoma | Causa | Solución |
|---|---|---|
| La rentabilidad sale en cero | Los documentos no llevan proyecto asignado | Asígnalo al registrarlos |
| Falta un proyecto en el selector | Pertenece a otra empresa, o está inactivo | Revisa la empresa seleccionada |
| No puedo crear tareas | Falta project:manage-tasks | Solicita el permiso |
| No aparece el botón de eliminar | Falta project:delete | Es intencional |
Recursos Humanos
RRHH / Nómina (app instalable)Estado: Casi listo. App hr. Empleados y Departamentos implementados; la nómina postea al GL (PayrollRun/Line/Config). Verificar cobertura de pantallas de nómina en el frontend antes de prometer corridas completas por UI.
Estado: Casi listo. App hr. Empleados y Departamentos implementados; la nómina postea al GL (PayrollRun/Line/Config). Verificar cobertura de pantallas de nómina en el frontend antes de prometer corridas completas por UI.
Objetivo
Gestionar empleados y departamentos, y procesar la nómina (devengo y pago) con impacto contable.
A quién va dirigido
Recursos Humanos, nómina, contabilidad.
Cuándo se usa
Al registrar empleados, correr la nómina del período y pagarla.
Requisitos previos
- App RRHH instalada (ver
../apps/hr.md). - Configuración de nómina (cuentas contables de nómina).
Pantallas
Menú nav-hr (hr/*): Empleados, Departamentos, y PayrollAccountingPage (integración contable de nómina).
Paso a paso (nómina)
- Registra empleados y departamentos.
- Crea una corrida de nómina (PayrollRun) del período.
- El sistema calcula las líneas (salario, deducciones) y devenga (asiento balanceado).
- Paga la nómina vía banco (asiento de pago).
Validaciones importantes
- El devengo es un asiento balanceado.
- Concurrencia controlada (CAS) para no duplicar corridas.
- No se postea en período cerrado.
Errores comunes
- "No aparece RRHH": app no instalada o sin gating.
- "Configuración de nómina faltante": faltan cuentas contables de nómina.
Resultado esperado
Nómina calculada, devengada y pagada, con contabilidad.
Integraciones relacionadas
- Contabilidad: devengo y pago. Ver
../contable/nomina.md. - Banco: pago de nómina.
Permisos necesarios
Recurso hr (@RequireApp('hr')).
Notas técnicas
- Backend:
backend/src/tenant-runtime/hr(hr.controller, payroll.controller). Manifestapps/hr/manifest.json. - Skills:
utilara-hr-app-production,utilara-hr-payroll-accounting-production.
Impuestos y DGII
Impuestos y DGIIReglas de ITBIS con vigencia, retenciones, series de NCF y los reportes de la DGII.
Estado: Listo. Reglas fiscales con vigencia, retenciones con sustitución auditada, reportes 606/607/608 con historial de versiones y conciliación contra la contabilidad.
Mapa del módulo
Impuestos → Reglas y Retenciones → Reglas Fiscales (/impuestos/reglas-fiscales)
Impuestos → Reglas y Retenciones → Retenciones (/impuestos/retenciones)
Impuestos → Serie Fiscal (/impuestos/serie-fiscal/buscar)
Impuestos → Consulta NCF (/impuestos/consulta-ncf)
Impuestos → Impuesto Configuración (/impuestos/configuracion/buscar)
Impuestos → Proporcionalidad del ITBIS (/impuestos/proporcionalidad/buscar)
Impuestos → Reporte 606 / 607 / 608 / 609
Impuestos → Reporte IR-17 / IR-3 / IT-1
Impuestos → Reporte Novedades TSS / Dependientes TSS
Impuestos → Reporte Dinámico (/impuestos/reporte-dinamico)
Permisos
| Permiso | Qué habilita |
|---|---|
tax:read | Ver reglas, retenciones y reportes |
tax:manage-rules | Crear reglas fiscales y nuevas vigencias |
tax:manage-withholdings | Gestionar categorías de retención |
tax:override-calculation | Sustituir la retención calculada (queda auditado) |
tax:audit | Ver la auditoría de configuración fiscal |
ncf:read / ncf:create / ncf:update / ncf:delete | Series y comprobantes |
ncf:generate-606 / -607 / -608 | Generar la versión del reporte |
ncf:export-606 / -607 / -608 | Descargar el CSV |
Fíjate en la separación: ver un reporte, generar su versión y descargarlo son tres permisos distintos.
Reglas fiscales
Definen la tasa que se aplica y desde cuándo.
La regla de oro: cuando cambia una tasa, crea una nueva vigencia; no edites la regla anterior. Editarla recalcularía documentos ya emitidos con una tasa que no correspondía a su fecha.
Todas las líneas de impuesto del sistema (ventas, compras, ITBIS automático de Cuentas por Pagar) resuelven contra este motor central. No hay tasas escritas dentro del código.
Retenciones
Categorías de retención (ITBIS retenido, ISR retenido) que se aplican al pagar a proveedores.
- El sistema calcula la retención según la categoría y la regla vigente.
- Con
tax:override-calculationse puede sustituir el monto calculado desde la factura de
proveedor. La sustitución queda registrada: quién, cuándo y qué valor.
- El botón de sustitución no aparece para quien no tiene ese permiso.
Series de NCF
Cada rango autorizado por la DGII se registra como una secuencia con su tipo, número de autorización, rango, vigencia y umbral de alerta. El detalle está en la Guía de inicio rápido, paso 4.
Consulta NCF muestra el consumo y la disponibilidad de cada secuencia. Revísala antes de un pico de facturación.
Proporcionalidad del ITBIS
Para empresas con operaciones gravadas y exentas: determina qué proporción del ITBIS pagado en compras es deducible.
Reportes de la DGII
| Reporte | Qué declara |
|---|---|
| 606 | Compras de bienes y servicios |
| 607 | Ventas de bienes y servicios |
| 608 | Comprobantes anulados |
| 609 | Pagos al exterior |
| IR-17 | Retenciones y retribuciones complementarias |
| IR-3 | Declaración de retenciones de asalariados |
| IT-1 | Declaración mensual de ITBIS |
| TSS | Novedades y dependientes adicionales |
Qué entra y qué no
| Documento | 606 | 607 | 608 |
|---|---|---|---|
| Factura de venta posteada y no anulada | — | Sí | — |
| Factura de venta anulada | — | No | Sí |
| Factura de venta en borrador | — | No (no tiene NCF) | — |
| Factura de compra con NCF del proveedor | Sí | — | — |
Esta es la corrección clave de julio de 2026: antes el 607 incluía borradores y anulados.
Historial de versiones
Cada vez que generas un reporte queda registrada la versión: cuándo se generó, quién y con qué resultado. Sirve para saber exactamente qué se declaró y cuándo.
Conciliación fiscal contra la contabilidad
Las pantallas de 606, 607 y 608 incluyen la conciliación contra el mayor: compara lo que declara el reporte fiscal contra lo que dice la contabilidad. Ejecútala antes de presentar: una diferencia aquí es una diferencia que la DGII también verá.
Reporte dinámico
Constructor de consultas sobre los datos fiscales, exportable a CSV.
Rutina mensual sugerida
- Cierra la facturación del mes.
- Revisa que no queden facturas en borrador que debían emitirse.
- Genera el 607 y ejecuta la conciliación contra la contabilidad.
- Genera el 606 y verifica que los NCF de proveedor estén completos.
- Genera el 608 y confirma que corresponde a lo anulado.
- Descarga los CSV y preséntalos.
- Cierra el período contable para que nadie modifique lo declarado.
Problemas frecuentes
| Síntoma | Causa | Solución |
|---|---|---|
| Una factura no aparece en el 607 | Está en borrador o fue anulada | Postéala, o búscala en el 608 |
| El 606 tiene filas sin NCF | La factura de compra se registró sin el NCF del proveedor | Complétalo en la factura |
| La conciliación muestra diferencia | Hay ventas contabilizadas sin comprobante, o comprobantes sin asiento | Revisa el detalle que da la pantalla |
| No puedo descargar el CSV | Falta el permiso de exportación | Solicita ncf:export-60X |
| Se agotó la secuencia a mitad de mes | Umbral de alerta muy bajo o rango pequeño | Sube el umbral y solicita un rango mayor |
NCF / DGII (app instalable)Estado: Listo (app ncf-dgii; reutiliza la lógica fiscal probada del core vía adapter).
Estado: Listo (app ncf-dgii; reutiliza la lógica fiscal probada del core vía adapter).
Objetivo
Cumplir con la DGII (República Dominicana): emitir Comprobantes Fiscales (NCF) y e-CF, y generar los reportes 606/607/608.
A quién va dirigido
Facturación, contabilidad, cumplimiento fiscal.
Cuándo se usa
Al facturar con comprobante fiscal, registrar NCF de proveedores y presentar reportes a la DGII.
Requisitos previos
- App NCF/DGII instalada (ver
../apps/ncf-dgii.md). - Series NCF configuradas (ver
../administrativo/ncf-dgii.md).
Pantallas
Se integra con Facturación (consumo de NCF al emitir) y con el menú Impuestos:
| Función | Ruta |
|---|---|
| Consulta NCF | /impuestos/consulta-ncf |
| Reporte 606 (compras) | /impuestos/reporte-606 |
| Reporte 607 (ventas) | /impuestos/reporte-607 |
| Reporte 608 (anulados) | /impuestos/reporte-608 |
| Serie Fiscal | /impuestos/serie-fiscal/* |
| Proporcionalidad ITBIS | /impuestos/proporcionalidad/* |
Además, la app añade pantallas propias (e-CF recibidos, aprobación comercial, cancelaciones, carga masiva).
Paso a paso (emitir NCF)
- Al emitir una factura (ver
facturacion.md), elige la serie NCF. El sistema asigna el siguiente número sin huecos. - El NCF queda consumido y aparece en el 607.
Paso a paso (reporte 607)
- Menú Impuestos → Reporte 607.
- Selecciona el período.
- Genera → lista las ventas con NCF para presentar a la DGII.
Validaciones importantes
- Numeración sin huecos (gapless) por tipo de comprobante.
- El tipo de NCF debe corresponder a la operación (venta, consumidor final, nota de crédito, etc.).
Errores comunes
- "No hay NCF disponible": la serie se agotó.
- "Tipo de NCF incorrecto": el comprobante no aplica a la operación.
Resultado esperado
Comprobantes emitidos correctamente y reportes 606/607/608 listos para la DGII.
Integraciones relacionadas
- Facturación / CxC: consumo de NCF de ventas → 607.
- CxP / Compras: NCF de proveedores → 606.
Permisos necesarios
Los de la app ncf-dgii (@RequireApp('ncf-dgii')).
Notas técnicas
- Backend:
apps/ncf-dgii/backend(adapter que reutilizaNcfService/EcfXmlServicedel core). ModelosEcf*. - Skill:
utilara-ncf-dgii-app-production.
Finanzas
FinanzasAnálisis financiero, indicadores, presupuesto, conversión de moneda y diferencia cambiaria.
Estado: Listo. Los indicadores, la diferencia cambiaria y el presupuesto se calculan sobre los datos contables reales, con desglose.
Qué encuentras aquí
Finanzas es la capa de análisis sobre la contabilidad. Los estados financieros básicos están tanto aquí como en Contabilidad; lo propio de este módulo son los indicadores, el presupuesto y lo multimoneda.
Finanzas → Análisis Financiero (/finanzas/analisis-financiero)
Finanzas → Balanza de Comprobación (/finanzas/balanza-comprobacion)
Finanzas → Balance General (/finanzas/balance-general)
Finanzas → Estado de Resultados (/finanzas/estado-resultados)
Finanzas → Flujo Efectivo (/finanzas/flujo-efectivo)
Finanzas → Variación Capital (/finanzas/variacion-capital)
Finanzas → Conversión Moneda (/finanzas/conversion-moneda)
Finanzas → Diferencia Cambiaria (/finanzas/diferencia-cambiaria)
Finanzas → Presupuesto (/finanzas/presupuesto)
Finanzas → Reporte Dinámico (/finanzas/reporte-dinamico)
Permisos
| Permiso | Qué habilita |
|---|---|
finance:view-financial-statements | Ver los estados financieros |
finance:view-analysis | Ver el análisis financiero |
finance:view-ratios | Ver indicadores y ratios |
finance:view-fx | Ver la diferencia cambiaria |
finance:manage-budget | Gestionar el presupuesto |
finance:approve-budget | Aprobar el presupuesto |
finance:dynamic-report | Usar el reporte dinámico |
Los permisos son finos a propósito: puedes dar acceso a los estados financieros sin dar acceso al presupuesto.
Análisis financiero
Presenta el conjunto de indicadores con desglose: cada ratio permite ver de qué cuentas salió. Sin ese desglose un indicador es un número sin defensa; con él se puede auditar.
Se agrupan en las familias habituales: liquidez, endeudamiento, rentabilidad y actividad.
Un indicador solo es tan bueno como la contabilidad que lo alimenta. Si la clasificación de cuentas está mal, el ratio saldrá mal.
Diferencia cambiaria
Reporte real sobre el motor de tipo de cambio: muestra el efecto de la variación de la tasa sobre los saldos en moneda extranjera.
Depende de dos cosas:
- Que las tasas de cambio estén cargadas (
Banco → Cambio Tasa). - Que estén configuradas las cuentas por moneda de la empresa: cuenta por cobrar y por
pagar de cada moneda, sus cuentas de prima, y las cuentas de ganancia y pérdida cambiaria.
Sin la configuración por moneda, los saldos en pesos y en dólares se mezclan en la misma cuenta de control y el reporte pierde sentido.
Conversión de moneda
Presenta los saldos convertidos a la moneda que elijas, usando las tasas registradas.
Presupuesto
Conectado al motor real de presupuesto: lo que registras aquí es lo que compara la ejecución.
| Concepto | Detalle |
|---|---|
| Dimensiones por línea | Cuenta, centro de costo, departamento, sucursal y proyecto |
| Importación | CSV, con columnas departmentCode, branchCode, projectName |
| Aprobación | Permiso separado (finance:approve-budget) |
| Ejecución | Se compara contra los asientos reales |
Reporte dinámico
Constructor de reportes sobre los datos contables: eliges columnas, filtras y agrupas.
Campos disponibles (entre otros): número de asiento, fecha, estado (DRAFT / POSTED / VOID), origen, concepto, cuenta, naturaleza de la cuenta, débito, crédito, centro de costo y departamento, moneda, tasa y período fiscal.
Se exporta a CSV.
Filtra por estado POSTED si quieres cifras contables definitivas: los borradores no forman parte de la contabilidad.
Diferencia con el módulo de Contabilidad
| Contabilidad | Finanzas | |
|---|---|---|
| Enfoque | Registrar y cerrar | Analizar |
| Estados financieros | Sí | Sí (mismos datos) |
| Asientos, períodos, cierres | Sí | No |
| Indicadores y ratios | No | Sí |
| Diferencia cambiaria como reporte | No | Sí |
| Consolidación e intercompañía | Sí | No |
Ambos leen la misma contabilidad: no hay dos fuentes de verdad.
Problemas frecuentes
| Síntoma | Causa | Solución |
|---|---|---|
| Un estado financiero sale vacío | No hay asientos posteados en el rango, o filtras por otra empresa | Revisa fechas y empresa |
| Los ratios salen absurdos | Cuentas mal clasificadas en el catálogo | Revisa la naturaleza de las cuentas |
| La diferencia cambiaria sale en cero | Faltan tasas o falta la configuración de cuentas por moneda | Revisa Banco → Cambio Tasa y las cuentas por moneda |
| No veo el módulo | Faltan permisos de finance | Solicítalos |
CRM
CRM (app instalable)Estado: Casi listo. App crm (Citrus). Fase 1 (Dashboard + Configuración, 25 secciones) y Fase 2 (pantallas operativas) implementadas. Verificar qué pantallas operativas están conectadas antes de prometer flujos completos.
Estado: Casi listo. App crm (Citrus). Fase 1 (Dashboard + Configuración, 25 secciones) y Fase 2 (pantallas operativas) implementadas. Verificar qué pantallas operativas están conectadas antes de prometer flujos completos.
Objetivo
Gestionar la relación con clientes y prospectos: pipeline de ventas, contactos, actividades y marketing.
A quién va dirigido
Ventas, marketing, servicio al cliente.
Cuándo se usa
Para seguimiento de oportunidades, contactos y campañas — complementa Facturación/CxC (no las duplica).
Requisitos previos
- App CRM instalada (ver
../apps/crm.md).
Pantallas
La app añade su propio menú (crm/): Dashboard, Configuración (25 secciones), y pantallas operativas (contactos, oportunidades, actividades, reportes, chat). Rutas bajo crm/ en App.tsx.
Paso a paso (uso típico)
- Instala y entra a CRM desde el menú.
- Revisa el Dashboard.
- Configura las secciones necesarias en Configuración.
- Trabaja tus contactos/oportunidades en las pantallas operativas.
Validaciones importantes
- El CRM reutiliza entidades del core (User, Currency, Tax, Item, Company) — no crea clientes/ítems paralelos.
- Si la app no está instalada, sus endpoints responden fail-closed.
Errores comunes
- "No aparece CRM": la app no está instalada, o
client.sidebar.hiddenCodesla oculta.
Resultado esperado
Gestión comercial complementaria al ERP.
Integraciones relacionadas
- Reutiliza clientes/ítems del ERP; se enlaza con Facturación/CxC.
Permisos necesarios
Los de la app crm (@RequireApp('crm')).
Notas técnicas
- Backend/Frontend:
apps/crm/. 31 modelosCrm*. Manifest en/home/admin/devapps/utilara-crm/manifest.json. - Skill:
utilara-crm-app-production.
Reportes
ReportesEstado: Casi listo. Los reportes financieros (Balanza, Mayor, Estado de Resultados, Balance General, Flujo) están conectados y derivan del mayor real. El menú Reportes agrupa accesos a esos reportes de otros módulos; algunos "reportes dinám
Estado: Casi listo. Los reportes financieros (Balanza, Mayor, Estado de Resultados, Balance General, Flujo) están conectados y derivan del mayor real. El menú Reportes agrupa accesos a esos reportes de otros módulos; algunos "reportes dinámicos" pueden ser genéricos (No verificado).
Objetivo
Consultar la información del negocio en forma de reportes: financieros, de ventas/CxC, de compras/CxP e inventario.
A quién va dirigido
Contabilidad, finanzas, gerencia.
Pantallas (menú Reportes)
| Grupo | Reporte | Ruta |
|---|---|---|
| Contabilidad | Balance de comprobación | /contabilidad/balance |
| Contabilidad | Libro mayor | /accounting/ledger |
| Contabilidad | Estado de resultados | /accounting/profit-loss |
| Contabilidad | Balance general | /accounting/balance-sheet |
| Contabilidad | Flujo de efectivo | /accounting/cash-flow |
| Ventas y CxC | Cuentas por cobrar | /contabilidad/cxc |
| Compras y CxP | Cuentas por pagar | /contabilidad/cxp |
| Inventario | Balance de inventario | /inventario/balance |
Cada módulo también tiene sus propios reportes internos (CxC, CxP, Inventario, Banco, Compras, Impuestos, Facturación).
Paso a paso
- Menú Reportes → elige el grupo y el reporte.
- Define período/filtros.
- Genera y, si aplica, exporta.
Validaciones importantes
- Los estados financieros derivan del mayor (gl-entry), no de un módulo aparte.
Errores comunes
- "Reporte vacío": sin movimientos en el período, o filtros muy restrictivos.
Resultado esperado
Reporte con datos consistentes con la contabilidad.
Integraciones relacionadas
- Contabilidad (fuente de los financieros), CxC, CxP, Inventario.
Permisos necesarios
accounting:read y los del módulo correspondiente.
Notas técnicas
- Ver
../contable/reportes-financieros.md. Detalle técnico en../tecnico/eventos-y-gl.md.
Manual de Usuario — UtilARA ERPPara quién: el empleado que opera el ERP día a día (facturador, cajero, comprador, contador operativo, almacenista).
Para quién: el empleado que opera el ERP día a día (facturador, cajero, comprador, contador operativo, almacenista).
Cada documento explica un módulo paso a paso: qué hace, cómo entrar, qué campos llenar, qué botones usar, qué errores evitar y qué resultado esperar.
Antes de empezar
- Lee
primeros-pasos.md: login, selección de empresa, cómo se organiza la pantalla y el menú. - Cada ítem del menú lateral (sidebar) es su propia página con sus sub-pestañas propias ("Buscar X" / "X"). No confundas las sub-pestañas de una página con el menú lateral.
Índice por módulo
| Documento | Módulo | Estado |
|---|---|---|
| primeros-pasos.md | Ingreso, empresa, navegación | Listo |
| dashboard.md | Panel de inicio | Casi listo |
| facturacion.md | Facturación / Ventas / POS | Listo |
| cuentas-por-cobrar.md | CxC (clientes, recibos, notas) | Listo |
| cuentas-por-pagar.md | CxP (suplidores, pagos, notas) | Listo |
| compras.md | Compras (OC, recepción, factura) | Listo |
| inventario.md | Inventario (ítems, movimientos) | Listo |
| banco.md | Banco (cuentas, cheques, transferencias) | Casi listo |
| contabilidad.md | Contabilidad (diario, mayor, reportes) | Listo |
| activos-fijos.md | Activos Fijos | Listo |
| caja-chica.md | Caja Chica | Listo |
| ncf-dgii.md | NCF / DGII (app instalable) | Listo |
| crm.md | CRM (app instalable) | Casi listo |
| rrhh.md | RRHH / Nómina (app instalable) | Casi listo |
| reportes.md | Reportes | Casi listo |
| configuracion.md | Configuración general | Casi listo |
| seguridad.md | Seguridad (mi usuario, perfiles) | Listo |
Para recetas ultra-cortas ("solo dime los pasos"), ver ../guias-rapidas/.Administración
Usuarios
Usuarios (administración)Estado: Listo.
Estado: Listo.
Objetivo
Crear, invitar y gestionar los usuarios de la empresa, y asignarles sus perfiles.
A quién va dirigido
Administrador de la empresa.
Cuándo se usa
Al incorporar personal, cambiar responsabilidades o dar de baja usuarios.
Requisitos previos
- Perfiles (roles) definidos (ver
roles-y-permisos.md).
Paso a paso
- Menú Seguridad → Usuarios → Usuario (nuevo).
- Registra nombre, correo y datos básicos.
- Guarda / envía invitación (el usuario define su contraseña al aceptar).
- Menú Seguridad → Usuario → Perfiles Usuario: asigna uno o más perfiles.
Campos explicados
| Campo | Qué es |
|---|---|
| Correo | Identificador de login. |
| Perfil(es) | Determinan sus permisos. |
| Estado | Activo/inactivo. |
Botones/acciones
- Crear / Invitar usuario.
- Asignar perfiles.
- Desactivar (bloquea acceso sin borrar historial).
Validaciones importantes
- Un usuario sin perfil no ve módulos.
- La baja debe ser desactivación, no borrado, para preservar auditoría.
Errores comunes
- "El usuario no ve nada": falta asignar perfil/permisos.
- "Invitación no llega": revisar configuración de correo.
Resultado esperado
Usuario activo con el acceso correcto.
Integraciones relacionadas
- RBAC / Perfiles.
Permisos necesarios
Administración de usuarios/seguridad.
Notas técnicas
- Frontend:
/security/usuario/*,AcceptInvitePage. Backend:tenant-runtime/users,tenant-runtime/auth.
Roles y permisos
Roles y permisos (RBAC)Estado: Listo (permisos centrales manifest-driven; fail-closed).
Estado: Listo (permisos centrales manifest-driven; fail-closed).
Objetivo
Controlar con precisión qué puede hacer cada usuario, mediante perfiles (roles) que agrupan permisos por recurso y acción.
A quién va dirigido
Administrador de la empresa.
Conceptos
| Concepto | Qué es |
|---|---|
| Recurso | Un área/módulo, ej. cxc, cxp, inventory, accounting, fixed-assets, banking, purchasing, petty-cash, hr, crm. |
| Acción | Qué se hace: read, create, update, delete, y especiales (ej. fixed-assets:depreciate, fixed-assets:dispose, recurring_journal:approve). |
| Permiso | La combinación recurso:acción. |
| Perfil | Conjunto de permisos que se asigna a usuarios. |
Paso a paso (definir permisos de un perfil)
- Menú Seguridad → Perfiles → Permisos Perfil (
SecPerfilPermisosPage). - La matriz muestra el catálogo de permisos = núcleo ERP + apps instaladas (
GET /permissions/catalog). - Marca las acciones permitidas por recurso.
- Guarda.
- Asigna el perfil a los usuarios (ver
usuarios.md).
Validaciones importantes
- Fail-closed: sin el permiso, la acción se rechaza (403) —
TenantPermissionGuard. - Instalar una app siembra sus permisos y los otorga al ADMIN automáticamente (idempotente).
- Existe RBAC a nivel de campo/fila en apps tipadas (Etapa 3, ver commits recientes) para restringir campos dentro de una pantalla.
Errores comunes
- "403 al operar": el perfil no tiene el permiso.
- "Un permiso nuevo no aparece": la app que lo aporta no está instalada.
Resultado esperado
Cada rol con exactamente el acceso que necesita.
Integraciones relacionadas
- Todos los módulos y apps.
Permisos necesarios
Administración de seguridad.
Notas técnicas
- Seed:
tenant-runtime/provisioning/tenant-rbac.seed.ts, catálogotenant-runtime/permissions/permission-catalog.ts. Guardtenant-runtime/auth/tenant-permission.guard.ts(RequirePermission). - Memoria:
project_rbac_central_permissions. Detalle técnico en../tecnico/rbac.md.
Empresas y sucursales
Empresas y tenantsEstado: Casi listo. El aislamiento multi-tenant (base por cliente, ADR-001) está implementado. La creación de tenants es del control-plane (dueño de la plataforma), no del admin de empresa.
Estado: Casi listo. El aislamiento multi-tenant (base por cliente, ADR-001) está implementado. La creación de tenants es del control-plane (dueño de la plataforma), no del admin de empresa.
Objetivo
Entender cómo se organiza el ERP en empresas (tenants) y compañías, y quién administra cada nivel.
A quién va dirigido
Administrador de empresa y equipo de UtilARA (provisioning).
Conceptos
| Concepto | Qué es |
|---|---|
| Tenant | Una empresa cliente. Vive en su propia base de datos (aislada de las demás). |
| Compañía (companyId) | Dentro de un tenant puede haber varias compañías/entidades legales (ej. contabilidad, caja chica y activos operan con companyId). |
| Slug | Identificador del tenant en la URL (t/:slug/...). |
Cómo se crea un tenant
- Lo hace el control-plane (Admin Panel / provisioning del dueño), no el admin de la empresa. Ver
../tecnico/multi-tenant.mdy../tecnico/admin-panel.md. - Al crear el tenant se siembra su base: plan de cuentas base, RBAC (perfil ADMIN), y se instala el app core
utilara-erp.
Qué administra el admin de empresa
- Usuarios y permisos dentro de su tenant.
- Catálogos maestros (cuentas, impuestos, almacenes, monedas).
- Apps instalables de su empresa.
Validaciones importantes
- Aislamiento por base: un usuario de un tenant no puede leer datos de otro (regla R12). El aislamiento es por conexión, no por RLS.
Errores comunes
- "Veo datos de otra empresa": sería un fallo grave de aislamiento; reportar de inmediato (existe test de arquitectura anti-regresión y skill
utilara-security-production).
Resultado esperado
Cada empresa opera aislada y con su propia configuración.
Notas técnicas
- ADR-001: database-per-tenant. Provisioning en
tenant-runtime/provisioning. Control-plane enbackend/src/control-plane/tenants. - Memoria:
project_erp_core_spec,project_security_hardening_2026-07-06.
Empresas, sucursales, almacenes y tiendasCuándo usar empresa, sucursal, almacén o tienda — la decisión que más se equivoca al implantar.
Estado: Operativo. Los cuatro conceptos existen y se usan de verdad. La confusión entre ellos es la causa más común de una implantación que hay que rehacer.
La decisión, en una tabla
| Si… | Usa | Por qué |
|---|---|---|
| Cada local tiene su propio RNC y presenta declaraciones aparte | Empresa | Contabilidad, numeración y NCF independientes |
| Todos los locales facturan con el mismo RNC pero quieres ver el resultado por local | Sucursal | Dimensión contable dentro de una misma contabilidad |
| Quieres saber cuánta mercancía hay en cada sitio | Almacén | Controla existencias |
| Quieres cobrar en mostrador con cajas y turnos | Tienda | Punto de venta con arqueo |
Los cuatro se combinan. Un caso típico: una empresa, tres sucursales, cada una con su almacén y su tienda.
Empresa
Una entidad legal con contabilidad propia.
Contabilidad → Configuración (/accounting/config)
| Aspecto | Detalle |
|---|---|
| Qué tiene propio | Plan de cuentas, períodos fiscales, numeración de documentos, secuencias de NCF, cuentas contables por defecto, moneda base |
| Qué se comparte entre empresas | Usuarios, perfiles, catálogo de monedas |
| Cómo se crea | Código y nombre. La primera se crea con Inicializar ahora |
| Consolidación | Contabilidad → Consolidación combina varias empresas |
| Operaciones entre ellas | Contabilidad → Intercompany |
Crear una empresa de más es caro: duplica catálogos y obliga a consolidar para ver el total. Créala solo si hay una razón legal o fiscal.
Sucursal
Una dimensión contable, junto a centros de costo y departamentos.
Contabilidad → Configuración → Dimensiones → Sucursales
| Campo | Nota |
|---|---|
| Código | Se guarda en mayúsculas. Único por empresa |
| Nombre | Legible |
Dónde se usa: asientos y sus líneas, filtros del Mayor, Estado de Resultados, Balance, Flujo de Efectivo, y líneas de presupuesto (columna branchCode en la importación CSV).
Lo que la sucursal NO hace: no tiene numeración propia de factura, ni secuencia de NCF propia, ni controla existencias.
Existe además el campo Sucursal / Establecimiento en Configurar Compañía: es solo un texto que se imprime en el comprobante. No es la dimensión contable.
Almacén
Donde vive físicamente el stock.
Inventario → Almacén (/inventory/warehouses)
- Cada movimiento de inventario entra o sale de un almacén.
- La factura descuenta del almacén de despacho elegido.
- La existencia inicial se carga por artículo y por almacén.
- Dentro de un almacén puedes definir ubicaciones (
/inventory/locations).
Crea un almacén por cada sitio donde de verdad necesites saber cuánto hay: bodega, tienda, vehículo de reparto, mercancía en consignación.
Tienda
El punto de venta.
Facturación → Tiendas (/facturacion/tienda/buscar)
Facturación → Tipo Tienda (/facturacion/tipo-tienda/buscar)
La tienda es la unidad del Terminal POS: contra ella se abren turnos, se cobra y se hace el arqueo. Se asocia a un almacén, de donde descuenta la mercancía.
Cómo se relacionan
Empresa (RNC, contabilidad, NCF)
├── Sucursal → dimensión contable: "¿cuánto dejó este local?"
├── Almacén → existencias: "¿cuánto hay aquí?"
└── Tienda → punto de venta: "¿quién cobró y cuánto?"
Ejemplos
Cadena de tres locales, un solo RNC
- 1 empresa.
- 3 sucursales:
SD,STGO,LR. - 4 almacenes: uno por local + bodega central.
- 3 tiendas, una por local.
Resultado: Estado de Resultados por sucursal, existencias por almacén y arqueo por tienda.
Dos razones sociales
- 2 empresas, cada una con su plan de cuentas y sus secuencias de NCF.
- Sucursales, almacenes y tiendas dentro de cada una.
Consolidaciónpara ver el total del grupo.
Empresa con bodega y venta solo por facturación
- 1 empresa, 1 almacén, sin tiendas (no usas POS), y sucursales solo si quieres
separar el resultado por zona.
Errores frecuentes
| Error | Consecuencia | Corrección |
|---|---|---|
| Crear una empresa por local con el mismo RNC | Contabilidad y NCF fragmentados, hay que consolidar para todo | Usar sucursales |
| Usar sucursales para controlar existencias | Nunca sabrás cuánto hay en cada sitio | Crear almacenes |
| Un solo almacén para varios locales | El stock no cuadra con la realidad física | Un almacén por local |
| No asignar sucursal en los asientos | Los reportes por sucursal salen vacíos | Asignarla al registrar |
Configuración
App: CRMEstado: Casi listo. Fase 1 (Dashboard + Configuración) y Fase 2 (operativas) implementadas; verificar cobertura de pantallas operativas conectadas.
Estado: Casi listo. Fase 1 (Dashboard + Configuración) y Fase 2 (operativas) implementadas; verificar cobertura de pantallas operativas conectadas.
Identidad
| Campo | Valor |
|---|---|
| code | crm |
| name | CRM (Citrus) |
| depends_on | utilara-erp |
| minPlan | BASIC |
| menú | nav-crm |
Qué hace
Gestión de relación con clientes: dashboard, configuración (25 secciones), y pantallas operativas (contactos, oportunidades, actividades, reportes, chat). Complementa Facturación/CxC, no las duplica.
Cómo reutiliza el core
Reutiliza User, Currency, Tax, Item, Company del ERP. **31 modelos Crm*** propios.
Backend
apps/crm/backend: crm.controller.ts, crm-config.controller.ts, crm-operational.controller.ts, crm-lookups.controller.ts, crm-reports.controller.ts, crm-chat.controller.ts — con @RequireApp('crm').
Frontend
apps/crm/frontend, rutas crm/* en App.tsx, pantallas en appScreenRegistry.tsx. Manifest vivo: /home/admin/devapps/utilara-crm/manifest.json.
GOTCHAs
client.sidebar.hiddenCodespuede ocultar la app.AppRequirementGuardya no cachea (gating instantáneo).
Usuario
Ver ../usuario/crm.md.
Skill
utilara-crm-app-production. Memoria project_crm_app.
App: DentalEstado: Casi listo. Es la app dental real que se conserva (a diferencia de las demos borradas). Verificar cobertura de pantallas/flujos antes de prometer clínica dental completa.
Estado: Casi listo. Es la app dental real que se conserva (a diferencia de las demos borradas). Verificar cobertura de pantallas/flujos antes de prometer clínica dental completa.
Identidad
| Campo | Valor |
|---|---|
| code | dental |
| name | Dental |
| depends_on | — (no declara dependencia en su manifest) |
| menú | dental |
| permisos declarados | 5 |
Qué hace
App vertical para clínica dental. Estructura más autónoma que las demás (tiene prisma/, schemas/, seeds/ propios en apps/dental/).
Estructura
apps/dental/
├── manifest.json
├── backend/ (dental.controller.ts con @RequireApp)
├── frontend/
├── prisma/ (schema propio)
├── schemas/
└── seeds/
Notas
- Es la app dental verdadera; las demos
utilara-dental/utilara-retail/utilara-veterinary(solo manifests) fueron borradas en la limpieza del catálogo (memoriaproject_apps_catalog_cleanup). No confundir. - Frontend tiene
pages/dental/.
Verificar antes de demo
- Qué pantallas están conectadas a backend real vs. genéricas.
- Si factura/contabiliza a través del core.
Skill
No hay skill utilara-dental-* dedicada en la lista; usar el código en apps/dental/ y apps/dental/README.md como referencia. Estado detallado: No verificado verificar end-to-end.
App: NCF / DGIIEstado: Listo (Production ready según skill utilara-ncf-dgii-app-production).
Estado: Listo (Production ready según skill utilara-ncf-dgii-app-production).
Identidad
| Campo | Valor |
|---|---|
| code | ncf-dgii |
| name | NCF / DGII |
| depends_on | utilara-erp |
| minPlan | BASIC |
| menú | nav-ncf-dgii |
Qué hace
Comprobantes Fiscales Electrónicos (e-CF) y cumplimiento DGII (RD): emisión, recepción, aprobación comercial, cancelaciones, carga masiva, y reportes 606/607/608.
Cómo reutiliza el core
La lógica fiscal probada del core (NcfService, EcfXmlService, series NcfSequence, uso NcfUsage, e-CF EcfDocument, reportes 606/607/608) se reutiliza vía adapter — no se duplica.
Modelos propios (6)
EcfReceived, EcfCommercialApproval, EcfCancellation, EcfRecurringTransaction, EcfBulkUpload, EcfSignedXmlLog.
Pantallas
Menú propio de la app + integración con Facturación (consumo NCF) e Impuestos (606/607/608). Ver ../usuario/ncf-dgii.md.
Backend
apps/ncf-dgii/backend — controllers ncf-dgii.controller.ts, ncf-dgii-config.controller.ts con @RequireApp('ncf-dgii').
GOTCHAs
- Build con riesgo de heap OOM (usar heap ampliado).
- Permisos en doble copia
.ts/.mjs.
Contabilidad
Ver ../contable/ncf-dgii.md.
Skill
utilara-ncf-dgii-app-production. Memoria project_ncf_dgii_app.
App: RRHH / NóminaEstado: Casi listo. Empleados/Departamentos + integración contable de nómina (postea al GL). Verificar cobertura de UI de nómina.
Estado: Casi listo. Empleados/Departamentos + integración contable de nómina (postea al GL). Verificar cobertura de UI de nómina.
Identidad
| Campo | Valor |
|---|---|
| code | hr |
| name | Recursos Humanos |
| depends_on | utilara-erp |
| minPlan | BASIC |
| menú | nav-hr |
Qué hace
Gestión de empleados y departamentos, y motor de nómina tipado (PayrollRun/PayrollLine/PayrollConfig) que postea al GL central (devengo + pago).
Backend
backend/src/tenant-runtime/hr (hr.controller.ts, payroll/payroll.controller.ts) con @RequireApp('hr'). Manifest apps/hr/manifest.json.
Contabilidad de nómina
- Devengo: Dr Gasto sueldos / Cr Sueldos por pagar (neto) / Cr deducciones (TSS/ISR/INFOTEP).
- Pago: Dr Sueldos por pagar / Cr Banco.
- Cuentas configurables en
PayrollConfig(bloquea si faltan). Ver../contable/nomina.md.
Frontend
Rutas hr/* en App.tsx, PayrollAccountingPage.tsx, HrPage.tsx.
Cierra brecha de auditoría
RRHH antes no posteaba al GL; ahora sí (memoria project_hr_payroll_accounting).
Usuario
Ver ../usuario/rrhh.md y ../flujos/nomina.md.
Skills
utilara-hr-app-production, utilara-hr-payroll-accounting-production.
App: VeterinariaEstado: Listo (Production ready según skill utilara-veterinary-app-production).
Estado: Listo (Production ready según skill utilara-veterinary-app-production).
Identidad
| Campo | Valor |
|---|---|
| code | veterinary |
| name | Veterinaria |
| depends_on | utilara-erp |
| minPlan | BASIC |
| menú | nav-veterinary |
Qué hace
Clínica veterinaria completa: dueños, mascotas, agenda, expediente clínico, vacunas, quirófano, hospitalización, laboratorio, imagenología, farmacia, grooming, hotel, caja, CRM, portal público del dueño, y reportes.
Alcance real
- 66 tablas / 101 pantallas + uploader real de archivos.
- Portal público del dueño de la mascota.
- Proveedores de mensajería y web pública.
- Retiró el módulo veterinario legado basado en EntityRecord.
- Delega facturación/CRM/marketing al ERP y a la app CRM (commit
refactor(veterinary): delegate billing/CRM/marketing to ERP and CRM app).
Backend
apps/veterinary/backend: controllers veterinary.controller.ts, veterinary-clinical.controller.ts, veterinary-operations.controller.ts, veterinary-billing.controller.ts, veterinary-crm.controller.ts, veterinary-portal.controller.ts, veterinary-premium.controller.ts, veterinary-resource.controller.ts, veterinary-attachments.controller.ts — con @RequireApp('veterinary').
Frontend
apps/veterinary/frontend, rutas veterinary/ en App.tsx, pantallas en appScreenRegistry.tsx. Modelos Veterinary en el schema de tenant.
RBAC de campo/fila
La app tiene permisos a nivel de campo/fila (Etapa 3, commits recientes). Ver ../tecnico/rbac.md.
Verificación
Smoke tests: docs/fixtures/veterinary-*-smoke.md. Test: veterinary-app.spec.ts.
Skill
utilara-veterinary-app-production. Memoria project_veterinary_app.
Dependencias de appsEstado: Listo (dependson real en los manifests).
Estado: Listo (depends_on real en los manifests).
Qué es
Una app puede declarar en su manifest.json que depende de otra (depends_on). No debe instalarse ni funcionar sin su base.
Dependencias reales (de los manifests)
| App (code) | depends_on | minPlan |
|---|---|---|
utilara-erp (core) | — | — |
dental | — (independiente) | — |
crm | utilara-erp | BASIC |
ncf-dgii | utilara-erp | BASIC |
hr | utilara-erp | BASIC |
veterinary | utilara-erp | BASIC |
dentalno declaradepends_onen su manifest (app vertical más autónoma). El resto de apps requieren el coreutilara-erp.
Por qué importa
- Las apps que dependen de
utilara-erpreutilizan su facturación, contabilidad, inventario, clientes, etc. No duplican el core. - Instalar la dependiente sin la base dejaría endpoints/pantallas sin su backing.
Cómo se declara
{
"code": "crm",
"depends_on": ["utilara-erp"],
"minPlan": "BASIC"
}
minPlan
Indica el plan mínimo requerido (ej. BASIC). El gating por plan lo evalúa la plataforma.
Validaciones
- Al instalar, verificar que las dependencias estén presentes.
- Al desinstalar el core, considerar el impacto en las apps dependientes.
Notas técnicas
- Manifests en
apps/<code>/manifest.json(y copia en/home/admin/devapps/). Vercrear-nueva-app-instalable.md.
Instalar y desinstalar una appEstado: Listo.
Estado: Listo.
Instalar
| Acción | Método y ruta |
|---|---|
| Ver instaladas | GET t/:slug/apps |
| Ver disponibles | GET t/:slug/apps/available |
| Instalar | POST t/:slug/apps/:code/install |
| Desinstalar | DELETE t/:slug/apps/:code/uninstall |
Desde la UI: Catálogo de Apps del tenant → Instalar / Desinstalar.
Qué pasa al instalar (AppInstallerService.install)
- Crea/actualiza
InstalledAppconenabled=true. - Siembra los permisos de la app y los otorga al perfil ADMIN (idempotente).
- Registra las entradas de menú del manifest de la app.
Qué pasa al desinstalar
- Marca
enabled=false. - Dispara
onAppUninstalled(tenant, code)(limpieza de integraciones). - Los endpoints de la app vuelven a responder fail-closed (403/404) de inmediato.
Efecto en el menú
- Al instalar, el menú de la app aparece. Si depende de overrides de menú, puede requerir reiniciar el backend. Ver
../tecnico/menu-y-overrides.md. client.sidebar.hiddenCodespuede ocultar una app aunque esté instalada.
Validaciones
- Dependencias: una app con
depends_onrequiere que la base esté instalada (ej.crm,hr,ncf-dgii,veterinarydependen deutilara-erp). Verdependencias-de-apps.md. - Reinstalar es idempotente (no duplica permisos).
Verificar
curl -H "Authorization: Bearer <jwt>" http://localhost:3000/t/<slug>/apps
Debe listar la app con enabled: true.
Flujo E2E completo
Ver ../flujos/app-install-uninstall.md.
Manual de Apps Instalables — UtilARA ERPPara quién: implementadores y desarrolladores que instalan, configuran o crean apps para el ERP.
Para quién: implementadores y desarrolladores que instalan, configuran o crean apps para el ERP.
¿Qué es una app instalable?
UtilARA ERP tiene un núcleo (core) de módulos siempre presentes (Contabilidad, CxC, CxP, Compras, Inventario, Banco, Activos Fijos, Caja Chica, Facturación). Sobre ese núcleo, cada empresa puede instalar apps adicionales que:
- añaden pantallas al menú,
- exponen sus propios endpoints (bloqueados si la app no está instalada — fail-closed),
- declaran sus permisos y a veces dependencias de otras apps,
- reutilizan el core (facturación, contabilidad, inventario) en vez de duplicarlo.
Las apps viven en apps/<code>/ (backend + frontend + manifest.json).
Apps documentadas
| Documento | App (code) | Estado |
|---|---|---|
| dental.md | dental — clínica dental | Casi listo |
| ncf-dgii.md | ncf-dgii — comprobantes fiscales e-CF / DGII | Listo |
| crm.md | crm — CRM (Citrus) | Casi listo |
| hr.md | hr — RRHH / Nómina | Casi listo |
| veterinary.md | veterinary — clínica veterinaria | Listo |
Guías transversales
| Documento | Tema |
|---|---|
| install-uninstall.md | Cómo instalar y desinstalar una app |
| dependencias-de-apps.md | depends_on, apps que requieren otras |
| crear-nueva-app-instalable.md | Crear una app desde cero |
Detalles técnicos
Ver también ../tecnico/apps-instalables.md y ../tecnico/app-registry.md para el mecanismo interno (@RequireApp, AppRequirementGuard, AppRegistryService).
ConfiguraciónEstado: Casi listo. La configuración está repartida por módulo (Contabilidad → Configuración, Facturación, Impuestos, etc.) y en el menú Seguridad → Configuración (permisos por área). No existe un único "módulo de Configuración General" cen
Estado: Casi listo. La configuración está repartida por módulo (Contabilidad → Configuración, Facturación, Impuestos, etc.) y en el menú Seguridad → Configuración (permisos por área). No existe un único "módulo de Configuración General" centralizado del core (el módulo general fue eliminado; ver memoria del proyecto).
Objetivo
Ajustar los parámetros del ERP para la empresa.
A quién va dirigido
Administrador de la empresa.
Dónde se configura cada cosa
| Qué | Dónde |
|---|---|
| Plan de cuentas, períodos, conceptos | Menú Contabilidad (/accounting/config) |
| Impuestos, retenciones, series NCF | Menú Impuestos |
| Listas de precios, descuentos, vendedores | Menú Facturación |
| Monedas y tasas | Menú Banco → Moneda / Cambio Tasa |
| Almacenes, categorías, unidades | Menú Inventario |
| Usuarios, perfiles, permisos por área | Menú Seguridad |
| Apps instalables | Catálogo de Apps (ver ../administrativo/apps-instalables.md) |
Paso a paso
- Identifica qué vas a configurar (usa la tabla anterior).
- Ve al módulo correspondiente y su pantalla de Configuración / catálogo.
- Guarda; algunos cambios de menú requieren reiniciar el backend (ver nota técnica).
Validaciones importantes
- Cambios al menú/manifest no aplican en caliente: requieren reinicio del backend y purgar overrides si aplica.
Errores comunes
- "Configuré algo del menú y no aparece": backend no reiniciado / override no purgado. Ver
../tecnico/menu-y-overrides.md.
Resultado esperado
ERP ajustado a la operación de la empresa.
Permisos necesarios
Permisos de administración por área (ver ../administrativo/roles-y-permisos.md).
Notas técnicas
- El módulo "Configuración General" del core fue eliminado (memoria
project_modules_removed_2026-07-11). La configuración vive por módulo.
Configuración generalEstado: Casi listo. No hay un único módulo de "Configuración General" del core (fue eliminado). La configuración vive por módulo y en Seguridad → Configuración.
Estado: Casi listo. No hay un único módulo de "Configuración General" del core (fue eliminado). La configuración vive por módulo y en Seguridad → Configuración.
Objetivo
Orientar al administrador sobre dónde ajustar cada parámetro del ERP.
A quién va dirigido
Administrador de la empresa.
Dónde se configura cada cosa
| Qué | Dónde |
|---|---|
| Contabilidad (cuentas, períodos, conceptos, tipos de pago) | Menú Contabilidad → Configuración |
| Impuestos, retenciones, series NCF | Menú Impuestos |
| Facturación (listas de precios, descuentos, vendedores, tiendas) | Menú Facturación |
| Inventario (almacenes, categorías, unidades, marcas) | Menú Inventario |
| Banco/Monedas | Menú Banco |
| Seguridad (usuarios, perfiles, permisos por área) | Menú Seguridad → Configuración |
| Apps | Catálogo de Apps |
Paso a paso
- Identifica el parámetro con la tabla.
- Ve al módulo → su pantalla de configuración/catálogo.
- Guarda. Si tocaste el menú/manifest, requiere reinicio del backend.
Validaciones importantes
- Cambios de menú/manifest no son en caliente. Ver
../tecnico/menu-y-overrides.md.
Errores comunes
- "Cambié el menú y no aparece": falta reiniciar el backend / purgar overrides.
Notas técnicas
- Memoria:
project_modules_removed_2026-07-11(Configuración General del core eliminada). Ver../usuario/configuracion.md.
Monedas y tasas de cambioEstado: Casi listo. Existen pantallas de Moneda y Cambio de Tasa en el módulo Banco. La automatización de la diferencia cambiaria/revaluación debe verificarse (No verificado).
Estado: Casi listo. Existen pantallas de Moneda y Cambio de Tasa en el módulo Banco. La automatización de la diferencia cambiaria/revaluación debe verificarse (No verificado).
Objetivo
Definir las monedas que maneja la empresa y sus tasas de cambio.
A quién va dirigido
Administrador / tesorería / contabilidad.
Pantallas
| Función | Ruta |
|---|---|
| Moneda | /banco/moneda/* |
| Cambio Tasa | /banco/cambio-tasa/* |
| Conversión / Diferencia cambiaria (Finanzas) | /finanzas/conversion-moneda, /finanzas/diferencia-cambiaria |
Paso a paso
- Menú Banco → Moneda: registra la moneda (código, símbolo).
- Menú Banco → Cambio Tasa → Crear: registra la tasa vigente por fecha.
Validaciones importantes
- Las operaciones multi-moneda usan la tasa registrada.
- La diferencia cambiaria debe reconocerse contablemente (verificar automatización).
Errores comunes
- "Sin tasa para la fecha": falta registrar la tasa del período.
Resultado esperado
Operaciones en varias monedas con conversión correcta.
Integraciones relacionadas
- Banco, CxC, CxP, Facturación, Finanzas.
Permisos necesarios
banking:create/update.
Notas técnicas
- Backend:
tenant-runtime/banking. Verificar revaluación automática y diferencia cambiaria antes de prometerlas.
Impuestos (ITBIS, retenciones, reglas fiscales)Estado: Casi listo. Existe un menú Impuestos completo (configuración, retenciones, reglas fiscales, reportes). Algunas pantallas de reporte fiscal (IR-17, IR-3, IT-1, TSS) y "reporte dinámico" deben verificarse individualmente (No verificad
Estado: Casi listo. Existe un menú Impuestos completo (configuración, retenciones, reglas fiscales, reportes). Algunas pantallas de reporte fiscal (IR-17, IR-3, IT-1, TSS) y "reporte dinámico" deben verificarse individualmente (No verificado).
Objetivo
Configurar los impuestos que aplica la empresa: ITBIS (impuesto a las ventas), retenciones ITBIS/ISR y reglas fiscales.
A quién va dirigido
Administrador / contador / cumplimiento fiscal.
Pantallas (menú Impuestos)
| Función | Ruta |
|---|---|
| Impuesto Configuración | /impuestos/configuracion/* |
| Reglas Fiscales | /utilara-erp/tax-rule |
| Retenciones | /utilara-erp/tax-withholding-category |
| Proporcionalidad ITBIS | /impuestos/proporcionalidad/* |
| Serie Fiscal (NCF) | /impuestos/serie-fiscal/* |
| Consulta NCF | /impuestos/consulta-ncf |
| Reportes 606/607/608/609 | /impuestos/reporte-60X |
| Reportes TSS / IR-17 / IR-3 / IT-1 | /impuestos/reporte-* |
Paso a paso (configurar ITBIS)
- Menú Impuestos → Impuesto Configuración (nuevo).
- Define la tasa (ej. 18%), la cuenta contable asociada (ITBIS por pagar / adelantado) y su aplicación.
- Asocia el impuesto a los ítems correspondientes.
Paso a paso (retenciones)
- Menú Impuestos → Retenciones.
- Define la categoría de retención (ITBIS/ISR), tasa y cuenta.
- Se aplican al registrar facturas de proveedor (CxP).
Validaciones importantes
- Las cuentas de impuestos deben existir en el plan.
- Las series NCF alimentan 606/607/608.
Errores comunes
- "El impuesto no se calcula": el ítem no tiene el impuesto asociado.
- "Retención no aplica": falta la categoría de retención en el proveedor/factura.
Resultado esperado
Impuestos y retenciones calculados automáticamente en facturas y compras, y reportes fiscales generables.
Integraciones relacionadas
- Facturación (ITBIS ventas → 210201), CxP (retenciones → 210203/210204, ITBIS adelantado → 110401), NCF/DGII (606/607/608).
Permisos necesarios
Administración fiscal / contabilidad.
Notas técnicas
- Reglas de posting usan cuentas de impuestos (ver
cuentas-contables.md). NCF: verncf-dgii.md. - Verificar el estado real de los reportes IR-17/IR-3/IT-1/TSS antes de prometerlos (algunos pueden ser pantallas genéricas).
NumeracionesCómo se numeran los documentos, qué es configurable y qué no.
Estado: Parcial, y conviene saberlo antes de prometerlo. La numeración fiscal (NCF) es totalmente configurable. La numeración interna de los documentos es automática y no se configura desde ninguna pantalla.
Los dos tipos de numeración
| Tipo | Ejemplo | ¿Configurable? |
|---|---|---|
| Interna — identifica el documento dentro del sistema | FAC-2026-000019 | No |
| Fiscal (NCF) — el número que exige la DGII | B0100000026 | Sí, por completo |
Son independientes: una factura tiene ambos.
Numeración interna — cómo funciona
El sistema asigna el número al guardar el documento, con el formato:
<PREFIJO>-<AÑO>-<SECUENCIAL DE 6 DÍGITOS>
| Documento | Prefijo | Ejemplo |
|---|---|---|
| Factura de venta | FAC | FAC-2026-000019 |
| Recibo / cobro | PAG | PAG-2026-000004 |
| Anticipo de cliente | ANTC | ANTC-2026-000002 |
| Cliente | CLI | CLI-0042 (sin año) |
Características:
- Por empresa y por año. Cada empresa lleva su propia serie y reinicia al cambiar el año.
- Automática. El campo aparece como
(auto)y no se puede escribir. - No configurable. No existe pantalla para cambiar el prefijo, la longitud o el punto de
partida.
Si necesitas otro formato, es un cambio de sistema, no de configuración. Plantéalo a soporte antes de arrancar: cambiarlo con documentos ya emitidos es mucho más complejo.
Preguntas que surgen siempre
¿Puedo empezar en el número 1000 porque vengo de otro sistema? No desde la interfaz.
¿Puedo tener una serie por sucursal? No. La serie es por empresa. Si necesitas series separadas de verdad, la separación real es por empresa.
¿Se saltan números? La numeración interna es correlativa por empresa y año. Un documento anulado conserva su número: no se reutiliza ni se reasigna.
Numeración fiscal (NCF) — sí es configurable
Impuestos → Serie Fiscal (/impuestos/serie-fiscal/nuevo)
Aquí registras cada rango que la DGII te autorizó:
| Campo | Qué controla |
|---|---|
| Tipo | B01, B02, B04, E31… |
| Número de autorización | El emitido por la DGII |
| Número inicial / final | El rango autorizado |
| Vigente desde / hasta | Fechas de validez |
| Umbral de alerta | Cuántos comprobantes libres quedan para avisarte (por defecto 50) |
| Activa | Si se puede consumir |
Restricción: no puede haber dos secuencias del mismo tipo con el mismo número inicial en la misma empresa.
Formato emitido
B + tipo (2 dígitos) + secuencial (8 dígitos) = 11 caracteres, sin guiones: B0100000026.
Cuándo se consume
| Momento | ¿Consume número? |
|---|---|
| Guardar borrador | No |
| Postear | Sí |
| Posteo fallido | No |
| Anular una factura posteada | El número no se devuelve; pasa al 608 |
Es lo que garantiza una numeración fiscal sin huecos y trazable.
Vigilar el consumo
Impuestos → Consulta NCF (/impuestos/consulta-ncf)
Muestra cuánto queda de cada secuencia. Revísala antes de un pico de facturación: quedarse sin NCF a mitad de mes detiene la facturación hasta que la DGII autorice un rango nuevo, y esa autorización no es inmediata.
Ajusta el umbral de alerta según tu volumen: si emites 200 facturas al día, un umbral de 50 te avisa con apenas unas horas de margen.
Resumen
| Necesito… | ¿Se puede? |
|---|---|
| Cambiar el prefijo de las facturas | No |
| Empezar la numeración interna en otro número | No |
| Series internas por sucursal | No |
| Registrar varios rangos de NCF | Sí |
| Tener B01 y B02 a la vez | Sí |
| Que me avise cuando se acaben los NCF | Sí, con el umbral de alerta |
| Reutilizar el NCF de una factura anulada | No — la DGII no lo permite |
Cuentas contables (plan de cuentas)Estado: Listo.
Estado: Listo.
Objetivo
Mantener el plan de cuentas (catálogo de cuentas) que usa toda la contabilidad de la empresa.
A quién va dirigido
Administrador / contador.
Cuándo se usa
Al configurar la empresa y al necesitar cuentas nuevas.
Pantalla
Menú Contabilidad → Plan de Cuentas (/accounting/accounts).
Paso a paso
- Menú Contabilidad → Plan de Cuentas.
- Crea una cuenta: código, nombre, tipo (activo, pasivo, patrimonio, ingreso, gasto) y si es de movimiento o agrupadora.
- Guarda.
Cuentas clave que usa el sistema automáticamente
Las reglas de posting automático usan códigos específicos (pueden variar por empresa; revisar accounting-rules):
| Código | Cuenta | Se usa en |
|---|---|---|
| 110101 | Caja/Efectivo | Cobros y pagos |
| 110201 | Cuentas por Cobrar | Facturas de venta |
| 110301 | Inventario | Entradas/salidas |
| 110401 | ITBIS adelantado | Compras |
| 210101 | Cuentas por Pagar | Facturas de proveedor |
| 210201 | ITBIS por pagar | Ventas |
| 210203 / 210204 | Retención ITBIS / ISR | Compras con retención |
| 410102 | Ingresos | Ventas |
| 510101 | Costo de venta (COGS) | Salidas de inventario |
| 520105 | Gasto | Compras/ajustes |
Estos son los valores por defecto de accounting-rules.defaults.ts. La empresa puede tener un mapa distinto; verificar en Contabilidad → Configuración.
Validaciones importantes
- No borrar cuentas con movimiento (desactivar en su lugar).
- Las cuentas que usan las reglas automáticas deben existir.
Errores comunes
- "Cuenta inexistente al postear": una regla apunta a un código que no está en el plan.
Resultado esperado
Plan de cuentas completo y coherente con las reglas de posting.
Integraciones relacionadas
- Todos los módulos que postean al GL.
Permisos necesarios
accounting:create/update.
Notas técnicas
- Backend:
tenant-runtime/accounting(createAccount). Reglas:accounting-rules.defaults.ts. Ver../contable/plan-de-cuentas.md.
Almacenes / bodegasEstado: Listo.
Estado: Listo.
Objetivo
Definir los almacenes (bodegas) donde se guarda y mueve el inventario.
A quién va dirigido
Administrador / almacén.
Pantalla
Menú Inventario → Almacén (/inventory/warehouses).
Paso a paso
- Menú Inventario → Almacén (nuevo).
- Registra código, nombre, ubicación.
- Guarda. Ya puedes recibir/mover inventario en ese almacén.
Validaciones importantes
- Los movimientos requieren un almacén válido.
- No borrar almacenes con existencias.
Errores comunes
- "Sin almacén": no se puede registrar un movimiento sin almacén.
Resultado esperado
Almacenes listos para operar inventario, recepciones y traslados.
Integraciones relacionadas
- Inventario, Compras (recepción), Facturación (despacho).
Permisos necesarios
inventory:create/update.
Notas técnicas
- Backend:
tenant-runtime/inventory. Ver../usuario/inventario.md.
NCF / DGII (administración de series)Estado: Listo (lógica fiscal del core probada; app ncf-dgii para e-CF).
Estado: Listo (lógica fiscal del core probada; app ncf-dgii para e-CF).
Objetivo
Configurar las series de NCF (rangos de comprobantes autorizados por la DGII) para que Facturación pueda emitir comprobantes fiscales.
A quién va dirigido
Administrador / cumplimiento fiscal.
Requisitos previos
- Autorización de rangos por la DGII.
- App NCF/DGII instalada si se usa e-CF (ver
../apps/ncf-dgii.md).
Paso a paso (crear una serie NCF)
- Menú Impuestos → Serie Fiscal (nuevo).
- Define el tipo de comprobante (ej. crédito fiscal B01, consumidor final B02, nota de crédito B04, etc.), el rango (desde/hasta) y la fecha de vencimiento.
- Guarda. Facturación asignará el siguiente número disponible al emitir.
Campos explicados
| Campo | Qué es |
|---|---|
| Tipo de NCF | Clase de comprobante DGII. |
| Rango desde/hasta | Números autorizados. |
| Vencimiento | Fecha límite de uso. |
| Secuencia actual | Próximo número a emitir. |
Validaciones importantes
- Numeración sin huecos (gapless) por tipo.
- No emitir con serie vencida o agotada.
Errores comunes
- "No hay NCF disponible": serie agotada o vencida.
- "Tipo incorrecto": el comprobante no aplica a la operación.
Resultado esperado
Series listas para que Facturación emita comprobantes válidos, y reportes 606/607/608 correctos.
Integraciones relacionadas
- Facturación (consumo NCF ventas → 607), CxP (NCF proveedor → 606).
Permisos necesarios
Administración fiscal.
Notas técnicas
- Backend core:
tenant-runtime/ncf(NcfService,EcfXmlService,NcfSequence,NcfUsage,EcfDocument). App:apps/ncf-dgii. - Skill:
utilara-ncf-dgii-app-production. Ver../contable/ncf-dgii.md.
Apps instalables (administración)Estado: Listo (instalar/desinstalar por endpoint real; siembra permisos y menú).
Estado: Listo (instalar/desinstalar por endpoint real; siembra permisos y menú).
Objetivo
Que el administrador instale/desinstale las apps que su empresa necesita (CRM, RRHH, NCF/DGII, verticales).
A quién va dirigido
Administrador de la empresa.
Cuándo se usa
Al habilitar una funcionalidad opcional para la empresa.
Requisitos previos
- La app debe existir en el registry de la plataforma.
- Algunas apps dependen de otras (ver
../apps/dependencias-de-apps.md).
Paso a paso
- Entra al Catálogo de Apps del tenant (pantalla
apps/). - Elige la app y presiona Instalar.
- Al instalar, el sistema:
- marca la app como instalada (
InstalledApp), - siembra sus permisos y los otorga al perfil ADMIN (auto-grant idempotente),
- añade sus entradas de menú.
- Para quitarla, presiona Desinstalar (marca
enabled=false).
Endpoints reales
| Acción | Método y ruta |
|---|---|
| Listar instaladas | GET t/:slug/apps |
| Listar disponibles | GET t/:slug/apps/available |
| Instalar | POST t/:slug/apps/:code/install |
| Desinstalar | DELETE t/:slug/apps/:code/uninstall |
Validaciones importantes
- Fail-closed: si una app no está instalada/
enabled, sus endpoints responden 403/404 (@RequireApp). - El gating es instantáneo (el
AppRequirementGuardya no cachea). - Al desinstalar, se dispara
onAppUninstalled(limpieza de integraciones).
Errores comunes
- "La app no aparece tras instalar": el menú puede requerir reinicio del backend si depende de overrides; y
client.sidebar.hiddenCodespuede ocultarla. - "Install respondió error pero la app quedó activa": bug histórico corregido (no marcar
enabledsi el install falla) — verificar en versiones viejas.
Resultado esperado
App instalada, con menú y permisos, lista para usar.
Integraciones relacionadas
- RBAC (siembra de permisos), Menú (entradas del manifest de la app).
Permisos necesarios
Administración del tenant / apps.
Notas técnicas
- Backend:
backend/src/tenant-runtime/apps/tenant-apps.controller.ts+AppInstallerService. GuardAppRequirementGuard. - Apps del registry final:
utilara-erp(core),ncf-dgii,crm,hr,dental,veterinary. Ver../apps/README.md. - Memoria:
project_apps_catalog_cleanup.
Mantenimiento operativoEstado: Casi listo. El sistema funciona, pero varias tareas de operación son manuales (reinicio del backend, purga de overrides, invalidación de caché del frontend).
Estado: Casi listo. El sistema funciona, pero varias tareas de operación son manuales (reinicio del backend, purga de overrides, invalidación de caché del frontend).
Objetivo
Que el administrador/operador sepa qué mantenimiento requiere el ERP y cómo hacerlo con seguridad.
A quién va dirigido
Administrador de empresa avanzado, soporte, operación.
Tareas de mantenimiento
1. Reiniciar el backend (aplicar cambios)
El backend corre desde dist/ y no aplica cambios en caliente. Tras un despliegue o cambio de menú/manifest, hay que reiniciar el proceso. Ver ../tecnico/despliegue.md y ../soporte/comandos-utiles.md.
2. Menú que no cambia
Si editaste manifest.json o la tabla app_menu_tree_overrides y el menú no cambia: hay que reiniciar el backend (los overrides se cargan una vez en el boot). Ver ../tecnico/menu-y-overrides.md.
3. Frontend con versión vieja
Un Service Worker cacheado puede servir código viejo. Validar en Incógnito o usar el kill-switch. Ver ../soporte/errores-comunes.md.
4. Copia de seguridad
Menú Seguridad → Copia de Seguridad → Exportar para exportar datos. Ver también ../tecnico/backups.md.
5. Salud del sistema
Endpoint de health del backend (backend/src/health). Ver ../tecnico/monitoreo.md.
Validaciones importantes
- Antes de reiniciar en horario laboral, avisar a los usuarios (se cae la sesión brevemente).
- No borrar overrides sin entender qué shadowean.
Errores comunes
- Ver
../soporte/errores-comunes.md.
Permisos necesarios
Acceso de administración / operación del servidor (para reinicios).
Notas técnicas
- Ver
../tecnico/systemd.mdy../tecnico/nginx-cloudflare.md.
Seguridad y accesos
Seguridad y accesosCómo se protegen las cuentas y los datos, y qué debes configurar tú para que esa protección sirva.
Estado: Listo. Política de contraseñas aplicada, verificación en dos pasos, sesiones rotativas con detección de reutilización, permisos por campo y por fila, cifrado de datos sensibles y bitácora de actividad.
Este artículo es para quien administra el sistema dentro de la empresa. Explica qué protege la plataforma por defecto y qué depende de tu configuración.
1. Cómo se protegen las cuentas
Contraseñas
Seguridad → Configuración → Configurar Usuarios (/security/config/usuarios)
| Opción | Por defecto | Recomendado |
|---|---|---|
| Longitud mínima | 8 | 10 o más |
| Exigir letras y números | No | Sí |
| Exigir mayúscula | No | Sí |
| Exigir carácter especial | No | Opcional |
| Bloqueo tras N intentos fallidos | 0 (desactivado) | 5 |
| Duración del bloqueo | 15 minutos | 15–30 minutos |
La política se aplica al crear el usuario y al cambiar la contraseña. Endurecerla no cambia las contraseñas ya existentes: si la endureces, pide un cambio de contraseña al equipo.
Las contraseñas se guardan con hash bcrypt. Nadie —ni el proveedor— puede leerlas.
Verificación en dos pasos (MFA)
Basada en códigos temporales (TOTP), compatible con cualquier app de autenticación estándar.
- El usuario la activa desde su perfil escaneando un QR.
- Se entregan códigos de respaldo una sola vez.
- Para desactivarla hay que presentar un código válido.
Actívala como mínimo en todas las cuentas con perfil Administrador.
Bloqueo por intentos
Si lo activas, tras N intentos fallidos la cuenta queda bloqueada el tiempo configurado. Es la defensa contra el probado sistemático de contraseñas.
2. Sesiones
| Aspecto | Comportamiento |
|---|---|
| Duración de la sesión activa | 15 minutos, renovada automáticamente mientras se usa |
| Sesión recordada | Hasta 30 días de inactividad |
| Rotación | Cada renovación emite una credencial nueva e invalida la anterior |
| Reutilización detectada | Si una credencial ya usada se presenta otra vez, se revoca toda la cadena de esa sesión |
| Sesiones visibles | Cada usuario ve sus sesiones activas con fecha, IP y vencimiento |
| Cierre remoto | Se puede cerrar una sesión concreta o todas |
La detección de reutilización es lo que limita el daño de una credencial robada: en cuanto se usa desde dos sitios, la sesión completa cae.
3. Permisos
El control de acceso tiene tres niveles:
Por acción (RBAC)
Cada perfil concede acciones sobre recursos: cxc:create, accounting:close-period, inventory:view-cost… Se gestionan en Seguridad → Perfiles → Permisos Perfil.
Los permisos se validan en el servidor. Ocultar un botón es solo comodidad; quien manipule la pantalla igualmente recibe un rechazo.
Por campo
Seguridad → (permiso security:manage-field-rbac)
Permite ocultar o proteger campos concretos para determinados perfiles. Útil para datos como salarios o costos.
Por fila
Políticas que limitan qué registros ve cada perfil (por ejemplo, un vendedor solo sus clientes).
4. Cifrado de datos sensibles
Con security:manage-encryption puedes marcar campos como cifrados. El sistema los cifra en la base de datos y admite rotación de llaves. Existe además un mapa de datos que muestra qué información sensible se guarda y dónde.
5. Aislamiento entre empresas
Cada empresa cliente tiene su propia base de datos. No es una separación por filtro en una tabla compartida: son bases distintas. Una consulta de una empresa no puede alcanzar los datos de otra, ni por error de programación ni manipulando identificadores.
Lo mismo aplica a las API Keys: una llave pertenece a una empresa y solo alcanza sus datos.
6. Auditoría
| Dónde | Qué registra |
|---|---|
Configuración → Bitácora de actividad (/platform/activity-log) | Acciones de los usuarios |
Auditoría de configuración fiscal (tax:audit) | Cambios en reglas y retenciones |
Auditoría de Activos Fijos (fixed-assets:view-audit-log) | Movimientos y transferencias |
Auditoría de proyectos (project:audit) | Cambios en proyectos |
| Historial de registros | Quién creó y modificó cada registro, con el antes y el después |
Las sustituciones sensibles —cambiar un precio en el POS, sustituir una retención calculada— quedan registradas con su autor.
7. Buenas prácticas
- Una cuenta por persona. Las cuentas compartidas destruyen la auditoría: no se sabe
quién hizo qué.
- Perfiles por función, no por persona. Crea Cajero, Contador, Compras; asigna
personas a esos perfiles.
- Mínimo privilegio. Empieza restrictivo y añade permisos cuando hagan falta.
- Separa las acciones críticas. Quien registra no debería ser quien aprueba ni quien
cierra períodos.
- Al menos dos administradores, nunca uno solo. El sistema impide quedarse sin ninguno,
pero uno solo es un punto único de fallo.
- Revisa los accesos cada trimestre, y desactiva de inmediato a quien deja la empresa.
- MFA obligatorio para administradores.
- Revisa las API Keys: revoca las que llevan meses sin uso.
8. Permisos que conviene restringir
| Permiso | Por qué |
|---|---|
accounting:close-period / reopen-period | Reabrir un período permite alterar cifras ya declaradas |
accounting:manage-chart | Cambiar el catálogo afecta toda la contabilidad |
inventory:view-cost | Los costos son información comercial sensible |
pos:override-price / apply-discount | Afectan directamente el margen |
tax:override-calculation | Sustituye un cálculo fiscal |
security:* | Quien administra la seguridad puede darse cualquier permiso |
user:create / user:delete | Control sobre quién entra |
Cualquier :delete | Anulan documentos |
9. Qué hacer si crees que una cuenta fue comprometida
Actúa en este orden:
- Cierra todas las sesiones de esa cuenta (
Cerrar todas las sesiones). - Cambia la contraseña.
- Activa MFA en esa cuenta si no lo tenía.
- Revisa la bitácora de actividad de los últimos días: busca accesos a horas inusuales o
cambios que el usuario no reconozca.
- Revisa las API Keys: si la cuenta comprometida pudo crear llaves, revócalas.
- Revisa los usuarios: confirma que no se creó ninguna cuenta nueva.
- Si hubo movimientos indebidos, anúlalos (no los borres: la anulación deja rastro).
- Avisa a soporte con las fechas y horas exactas.
10. Lo que depende de ti
La plataforma aporta los mecanismos; la configuración es tuya:
- [ ] Política de contraseñas endurecida.
- [ ] Bloqueo por intentos activado.
- [ ] MFA en las cuentas administrativas.
- [ ] Perfiles con el mínimo necesario.
- [ ] Sin cuentas compartidas.
- [ ] Bajas procesadas el mismo día.
- [ ] API Keys revisadas.
- [ ] Alguien mira la bitácora de vez en cuando.
Seguridad (mi usuario, perfiles)Estado: Listo (usuarios, perfiles, permisos manifest-driven; RBAC central).
Estado: Listo (usuarios, perfiles, permisos manifest-driven; RBAC central).
Objetivo
Que el usuario/administrador entienda cómo se controla el acceso: usuarios, perfiles (roles) y permisos por recurso/acción, incluyendo permisos a nivel de campo/fila en apps tipadas.
A quién va dirigido
Administrador de la empresa (gestión) y usuario final (entender por qué ve o no ve algo).
Cuándo se usa
Al dar de alta usuarios, asignarles perfiles y afinar permisos.
Pantallas (menú Seguridad)
| Sub-módulo | Ruta |
|---|---|
| Configuración por área | /security/config/* (usuarios, contabilidad, RRHH, banco, POS, inventario, compañía, facturación, CxP, impuesto, finanzas, activos, caja chica, otros) |
| Usuarios | /security/usuario/* |
| Perfiles | /security/perfil/* (incl. Permisos Perfil) |
| Menú / Submenú | /security/menu/* |
| Procesos | /security/proceso/* |
| Carga Masiva | /security/carga-masiva |
| Copia de Seguridad | /security/copia-seguridad/* |
Paso a paso (dar acceso a un usuario)
- Menú Seguridad → Usuarios → crea el usuario (o invítalo).
- Menú Seguridad → Perfiles → Permisos Perfil: define qué puede hacer un perfil (por recurso y acción: read/create/update/delete y acciones especiales).
- Menú Seguridad → Usuario → Perfiles Usuario: asigna el perfil al usuario.
Campos explicados
| Concepto | Qué es |
|---|---|
| Recurso | Área/módulo (ej. cxc, inventory, accounting). |
| Acción | Qué se puede hacer (read, create, update, delete, y especiales como depreciate). |
| Perfil | Conjunto de permisos que se asigna a usuarios. |
| Permiso de campo/fila | Restricción fina dentro de una pantalla (apps tipadas). |
Validaciones importantes
- Fail-closed: sin permiso, la acción se rechaza (403).
- Instalar una app siembra sus permisos y los otorga al perfil ADMIN (auto-grant idempotente).
- El catálogo de permisos (
/permissions/catalog) = núcleo ERP + apps instaladas.
Errores comunes
- "Sin permiso (403)": falta el permiso en el perfil del usuario.
- "No veo un módulo": puede ser permiso o app no instalada.
Resultado esperado
Usuarios con exactamente el acceso que su rol necesita.
Integraciones relacionadas
- Todos los módulos consultan estos permisos.
- Apps instalables aportan sus propios permisos.
Permisos necesarios
Permiso de administración de seguridad/usuarios.
Notas técnicas
- Frontend:
SecPerfilPermisosPage. Backend:tenant-runtime/permissions,tenant-runtime/roles. Guard:TenantPermissionGuard. - Skills:
utilara-security-production. Memoria:project_rbac_central_permissions. Ver../tecnico/rbac.md.
Manual Administrativo — UtilARA ERPPara quién: el administrador de la empresa (tenant admin) que configura el ERP para su organización: usuarios, permisos, catálogos maestros, impuestos, cuentas y apps.
Para quién: el administrador de la empresa (tenant admin) que configura el ERP para su organización: usuarios, permisos, catálogos maestros, impuestos, cuentas y apps.
No confundir con el Admin Panel de la plataforma (admin.documentolisto.com), que es del dueño de UtilARA. Eso se documenta en../tecnico/admin-panel.md.
Índice
| Documento | Tema | Estado |
|---|---|---|
| empresas-y-tenants.md | Empresas, sucursales, multi-tenant | Casi listo |
| usuarios.md | Alta/baja de usuarios, invitaciones | Listo |
| roles-y-permisos.md | Perfiles, permisos por recurso/acción, RBAC | Listo |
| configuracion-general.md | Parámetros generales | Casi listo |
| monedas.md | Monedas y tasas de cambio | Casi listo |
| impuestos.md | ITBIS, retenciones, reglas fiscales | Casi listo |
| ncf-dgii.md | Series NCF, configuración DGII | Listo |
| cuentas-contables.md | Plan de cuentas | Listo |
| almacenes.md | Almacenes / bodegas | Listo |
| apps-instalables.md | Instalar/desinstalar apps | Listo |
| mantenimiento-operativo.md | Reinicios, backups, salud del sistema | Casi listo |
Orden recomendado de configuración inicial (nueva empresa)
- Crear/entrar a la empresa (tenant) →
empresas-y-tenants.md - Configurar monedas e impuestos →
monedas.md,impuestos.md - Revisar el plan de cuentas sembrado →
cuentas-contables.md - Configurar series NCF (si factura fiscal en RD) →
ncf-dgii.md - Crear almacenes →
almacenes.md - Crear usuarios y asignar perfiles/permisos →
usuarios.md,roles-y-permisos.md - Instalar las apps que la empresa necesite (CRM, RRHH, NCF/DGII, vertical) →
apps-instalables.md
Contabilidad
Manual contable
Manual Contable — UtilARA ERPPara quién: contador, auditor, o cualquier persona que necesite entender qué hace el sistema contablemente cuando el usuario opera.
Para quién: contador, auditor, o cualquier persona que necesite entender qué hace el sistema contablemente cuando el usuario opera.
Este manual está escrito en lenguaje claro. Cada término contable se explica. Si no sabes contabilidad, empieza por principios-contables-del-erp.md.
Regla de oro del sistema
Todo asiento contable (registro en el "diario") que el sistema genera siempre cuadra: la suma de lo que entra (débitos) es exactamente igual a la suma de lo que sale (créditos). El sistema rechaza cualquier asiento descuadrado (regla dura R11). Además, cada empresa lleva su contabilidad aislada de las demás (regla R12).
Índice
| Documento | Tema | Estado |
|---|---|---|
| principios-contables-del-erp.md | Débito/crédito, cuentas, cómo pensar | Listo |
| plan-de-cuentas.md | Catálogo de cuentas y códigos usados | Listo |
| periodos-contables.md | Períodos, apertura/cierre | Casi listo |
| asientos-contables.md | Diario, asientos manuales, recurrentes | Listo |
| facturacion-y-cxc.md | Factura de venta, cobro, nota de crédito | Listo |
| compras-y-cxp.md | Factura de proveedor, pago, retenciones | Listo |
| inventario-y-costo.md | Entradas/salidas, costo de venta (COGS) | Listo |
| banco-y-conciliacion.md | Movimientos de banco, conciliación | Casi listo |
| caja-chica.md | Desembolsos, reposición | Listo |
| activos-fijos.md | Depreciación, retiro, revalorización | Listo |
| nomina.md | Devengo y pago de nómina | Casi listo |
| ncf-dgii.md | Comprobantes fiscales, 606/607/608 | Listo |
| reportes-financieros.md | Estado de Resultados, Balance, Flujo | Listo |
| cierres-contables.md | Cierre de período/año | Parcial |
| reversas-y-anulaciones.md | Cómo se revierte cada operación | Listo |
Cómo se leen los asientos en este manual
Usamos esta tabla en todos los ejemplos:
| Cuenta | Débito | Crédito |
|---|---|---|
| (nombre y código) | monto que entra a la cuenta | monto que sale de la cuenta |
El total de la columna Débito siempre es igual al total de la columna Crédito.
ContabilidadEstado: Listo (diario, mayor, balanza, estados financieros conectados a backend real; asientos automáticos desde eventos de negocio).
Estado: Listo (diario, mayor, balanza, estados financieros conectados a backend real; asientos automáticos desde eventos de negocio).
Objetivo
Registrar y consultar toda la contabilidad de la empresa: plan de cuentas, asientos del diario (manuales, automáticos y recurrentes), mayor general, balanza de comprobación y los estados financieros.
A quién va dirigido
Contadores y auxiliares contables.
Cuándo se usa
Para registrar asientos manuales, revisar los automáticos que generan los otros módulos, cerrar períodos y emitir reportes.
Requisitos previos
- Plan de cuentas sembrado/configurado (ver
../administrativo/cuentas-contables.md). - Períodos contables abiertos.
Pantallas (menú Contabilidad)
| Sub-módulo | Ruta |
|---|---|
| Configuración | /accounting/config |
| Plan de Cuentas | /accounting/accounts |
| Conceptos / Tipos de Pago | /accounting/concepts, /accounting/payment-types |
| Diario | /accounting/journal |
| Diarios Cancelados | /accounting/voided-journals |
| Asientos Recurrentes | /accounting/recurring |
| Períodos Contables / Fiscales | /accounting/accounting-periods, /accounting/fiscal-years |
| Gastos / Reportes de Gasto | /accounting/expenses, /accounting/expense-reports |
| Mayor General | /accounting/ledger |
| Balanza Comprobación | /accounting/trial-balance |
| Estado de Resultados | /accounting/profit-loss |
| Balance General | /accounting/balance-sheet |
| Flujo de Efectivo | /accounting/cash-flow |
| Presupuestos / Consolidación / Intercompany | /accounting/budgeting, /consolidation, /intercompany |
Paso a paso (asiento manual)
- Menú Contabilidad → Diario (nuevo).
- Escribe fecha, concepto/descripción.
- Agrega líneas: cuenta, débito o crédito, descripción.
- Verifica que total débito = total crédito (el sistema lo exige).
- Guardar (borrador) y Postear para afectar el mayor.
Campos explicados
| Campo | Qué es |
|---|---|
| Cuenta | Del plan de cuentas (código + nombre). |
| Débito / Crédito | Los dos lados del asiento; deben sumar igual. |
| Concepto | Motivo del asiento. |
| Período | Debe estar abierto para postear. |
Botones/acciones
- Guardar: deja el asiento en borrador.
- Postear: afecta el mayor (irreversible salvo reversa/anulación).
- Anular / Reversar: ver
../contable/reversas-y-anulaciones.md. - Recurrente: define asientos que se repiten y se aprueban/ejecutan.
Validaciones importantes
- R11: un asiento descuadrado (débito ≠ crédito) es rechazado.
- No se postea en período cerrado.
- Asientos recurrentes requieren permiso de aprobar/ejecutar.
Errores comunes
- "Asiento no balanceado": débitos y créditos no cuadran.
- "Período cerrado": la fecha cae en período cerrado.
- "Cuenta inexistente/inactiva": la cuenta no está en el plan o está inactiva.
Resultado esperado
Asiento posteado al mayor; los reportes financieros lo reflejan.
Integraciones relacionadas
- Todos los módulos postean aquí automáticamente (ventas, compras, inventario, banco, activos, caja chica, nómina).
- Reportes financieros derivan del mayor (gl-entry), no de un módulo separado.
Permisos necesarios
accounting:read/create/update/delete; recurring_journal:view/create/edit/approve/execute/delete. App utilara-erp.
Notas técnicas
- Backend:
backend/src/tenant-runtime/accounting. Controllert/:slug/accounting. Reportes en sub-controllers (trial-balance,profit-loss,balance-sheet,cash-flow). - Asientos automáticos: reglas en
accounting-rules.defaults.tsdisparadas por eventos de dominio. Ver../tecnico/eventos-y-gl.md. - Skill:
utilara-accounting-production. Pendiente: cierre de período como saga real (hoysetPeriodStatuses un flip de estado).
Principios contables del ERP (para quien no sabe contabilidad)Estado: Listo (concepto; refleja cómo opera el sistema real).
Estado: Listo (concepto; refleja cómo opera el sistema real).
Objetivo
Explicar, en palabras simples, cómo "piensa" contablemente UtilARA ERP, para que cualquiera entienda los ejemplos del resto del manual.
1. Todo se registra en "cuentas"
Una cuenta es un cajón donde el sistema guarda un tipo de valor: Caja, Cuentas por Cobrar, Inventario, Ingresos, Gastos, etc. Cada cuenta tiene un código (ej. 110101 = Caja) y un nombre. El conjunto de todas las cuentas es el plan de cuentas (ver plan-de-cuentas.md).
2. Débito y crédito (los dos lados)
Cada movimiento contable (llamado asiento) tiene dos lados:
- Débito (Dr): lo que entra o aumenta en esa cuenta (para activos y gastos).
- Crédito (Cr): lo que sale o aumenta en esa cuenta (para pasivos, patrimonio e ingresos).
No te compliques con la teoría: lo importante es la regla de oro.
3. La regla de oro: todo cuadra
En cada asiento, la suma de los débitos es exactamente igual a la suma de los créditos. Si no cuadra, el sistema lo rechaza (regla dura R11). Nunca podrás guardar un asiento descuadrado.
Ejemplo — vendes RD$1,180 (RD$1,000 + 18% ITBIS) a crédito:
| Cuenta | Débito | Crédito |
|---|---|---|
| Cuentas por Cobrar (110201) | 1,180.00 | |
| Ingresos (410102) | 1,000.00 | |
| ITBIS por pagar (210201) | 180.00 | |
| Total | 1,180.00 | 1,180.00 |
Débito = Crédito. Listo
4. El sistema hace los asientos por ti
Cuando facturas, cobras, compras, pagas, mueves inventario, deprecias o pagas nómina, el ERP crea el asiento automáticamente. Tú solo operas el módulo; la contabilidad se genera sola. El resto de este manual muestra qué asiento genera cada operación.
5. Cada empresa lleva su propia contabilidad
Los datos de una empresa nunca se mezclan con los de otra (regla R12, aislamiento por base de datos). Ver ../tecnico/multi-tenant.md.
6. El "mayor" y los reportes
Todos los asientos posteados forman el Mayor General (el gran libro). Los reportes (Balanza, Estado de Resultados, Balance General, Flujo de Efectivo) se calculan a partir del mayor, no de otra parte. Por eso siempre son consistentes. Ver reportes-financieros.md.
7. Períodos
La contabilidad se organiza en períodos (meses/años). Un período cerrado ya no acepta asientos nuevos. Ver periodos-contables.md.
Glosario rápido
| Término | En simple |
|---|---|
| Asiento | Un registro contable con sus líneas de débito/crédito. |
| Postear | Confirmar el asiento para que afecte el mayor. |
| GL (General Ledger) | El mayor general. |
| CxC / CxP | Lo que te deben / lo que debes. |
| COGS | Costo de la mercancía vendida. |
| ITBIS | Impuesto a las ventas (RD). |
Notas técnicas
- Reglas R11 (balance) y R12 (aislamiento) son invariantes verificadas por tests. Motor:
AccountingService. Ver../tecnico/eventos-y-gl.md.
Plan de cuentasEstado: Listo.
Estado: Listo.
Objetivo
Explicar qué es el plan de cuentas y qué códigos usa el sistema automáticamente.
¿Qué es?
El catálogo de todas las cuentas de la empresa, organizado por tipo (activo, pasivo, patrimonio, ingreso, gasto) con un código jerárquico.
Tipos de cuenta
| Tipo | Ejemplos | Sube con |
|---|---|---|
| Activo | Caja, Bancos, CxC, Inventario, Activos fijos | Débito |
| Pasivo | CxP, ITBIS por pagar, retenciones, préstamos | Crédito |
| Patrimonio | Capital, resultados acumulados, superávit | Crédito |
| Ingreso | Ventas, otros ingresos | Crédito |
| Gasto/Costo | Costo de venta, gastos operativos, depreciación | Débito |
Cuentas que el ERP usa automáticamente (por defecto)
| Código | Cuenta | Usada por |
|---|---|---|
| 110101 | Caja/Efectivo | Cobros, pagos, caja chica |
| 110201 | Cuentas por Cobrar | Facturas venta, cobros, notas |
| 110301 | Inventario | Movimientos de inventario |
| 110401 | ITBIS adelantado | Compras |
| 120201 | Depreciación acumulada | Depreciación |
| 210101 | Cuentas por Pagar | Facturas proveedor, pagos |
| 210201 | ITBIS por pagar | Ventas |
| 210203 | Retención ITBIS | Compras con retención |
| 210204 | Retención ISR | Compras con retención |
| 410102 | Ingresos | Ventas |
| 510101 | Costo de venta (COGS) | Salidas de inventario |
| 520104 | Gasto por depreciación | Depreciación |
| 520105 | Gasto / compra / ajuste | Compras, ajustes de inventario |
Importante: estos son los valores por defecto de accounting-rules.defaults.ts. Cada empresa puede configurar un mapa distinto. Verifica en Contabilidad → Configuración cuáles usa tu empresa.
Dónde se administra
Menú Contabilidad → Plan de Cuentas (/accounting/accounts). Ver ../administrativo/cuentas-contables.md.
Validaciones
- Las cuentas que usan las reglas automáticas deben existir, o el posteo falla.
- No borrar cuentas con movimiento; desactivar.
Notas técnicas
- Mapa de cuentas por regla en
accounting-rules.defaults.ts; resolución por código ycompanyId.
Contabilidad de Facturación y Cuentas por CobrarEstado: Listo (asientos automáticos reales invoice.created, payment.received, creditnote.created).
Estado: Listo (asientos automáticos reales invoice.created, payment.received, credit_note.created).
Objetivo
Explicar qué asiento genera el sistema cuando vendes, cobras o das una nota de crédito.
Cuentas involucradas (valores por defecto)
| Código | Cuenta |
|---|---|
| 110101 | Caja / Efectivo |
| 110201 | Cuentas por Cobrar (CxC) |
| 410102 | Ingresos (ventas) |
| 210201 | ITBIS por pagar |
Estos códigos son los por defecto de las reglas automáticas; tu empresa puede tener otros (ver ../administrativo/cuentas-contables.md).
1. Factura de venta a crédito
Qué hace el usuario: emite una factura (ver ../usuario/facturacion.md).
Asiento (invoice.created) — venta de RD$1,000 + 18% ITBIS:
| Cuenta | Débito | Crédito |
|---|---|---|
| Cuentas por Cobrar (110201) | 1,180.00 | |
| Ingresos (410102) | 1,000.00 | |
| ITBIS por pagar (210201) | 180.00 |
- Se crea la CxC: el cliente ahora te debe 1,180.
- Se afecta inventario por separado: la salida del producto genera el costo de venta (ver
inventario-y-costo.md).
2. Cobro de la factura
Qué hace el usuario: registra un recibo (ver ../usuario/cuentas-por-cobrar.md).
Asiento (payment.received) — cobra los 1,180 en efectivo:
| Cuenta | Débito | Crédito |
|---|---|---|
| Caja (110101) | 1,180.00 | |
| Cuentas por Cobrar (110201) | 1,180.00 |
- Entra el dinero a caja/banco y baja el saldo del cliente.
3. Nota de crédito (descuento o devolución)
Qué hace el usuario: emite una nota de crédito al cliente.
Asiento (credit_note.created) — nota de crédito por 1,180:
| Cuenta | Débito | Crédito |
|---|---|---|
| Ingresos (410102) | 1,000.00 | |
| ITBIS por pagar (210201) | 180.00 | |
| Cuentas por Cobrar (110201) | 1,180.00 |
- Reversa el ingreso y el impuesto, y reduce lo que el cliente debe.
- Si es una devolución de mercancía, además repone el inventario (movimiento aparte).
¿Cuándo se crea la CxC?
Al emitir/postear la factura (no al guardarla como borrador).
¿Cuándo se afecta banco/caja?
Al cobrar (recibo).
Cómo se reversa/anula
- Anular una factura reversa su asiento y el movimiento de inventario.
- Anular un recibo reversa el cobro (devuelve el saldo al cliente).
Ver reversas-y-anulaciones.md.
Validaciones que evitan errores
- El asiento siempre cuadra (R11).
- No se cobra más del saldo.
- No se postea en período cerrado.
Notas técnicas
- Reglas en
accounting-rules.defaults.ts(invoice.created,payment.received,credit_note.created). Backendtenant-runtime/{sales,cxc,accounting}.
Contabilidad de Compras y Cuentas por PagarEstado: Listo (asientos automáticos reales vendorbill.created, payment.sent).
Estado: Listo (asientos automáticos reales vendor_bill.created, payment.sent).
Objetivo
Explicar qué asiento genera el sistema cuando registras una factura de proveedor (con o sin retenciones) y cuando le pagas.
Cuentas involucradas (por defecto)
| Código | Cuenta |
|---|---|
| 520105 | Gasto / compra |
| 110401 | ITBIS adelantado (a favor) |
| 210101 | Cuentas por Pagar (CxP) |
| 210203 | Retención ITBIS por pagar |
| 210204 | Retención ISR por pagar |
| 110101 | Caja / banco |
1. Factura de proveedor (con retenciones)
Qué hace el usuario: registra la factura del suplidor (ver ../usuario/cuentas-por-pagar.md).
Asiento (vendor_bill.created) — compra de RD$1,000 + 18% ITBIS, con retención ITBIS de 100 e ISR de 20:
| Cuenta | Débito | Crédito |
|---|---|---|
| Gasto/compra (520105) | 1,000.00 | |
| ITBIS adelantado (110401) | 180.00 | |
| Retención ITBIS por pagar (210203) | 100.00 | |
| Retención ISR por pagar (210204) | 20.00 | |
| Cuentas por Pagar (210101) | 1,060.00 |
- Se crea la CxP por el neto a pagar (total menos retenciones).
- El ITBIS adelantado es un impuesto a tu favor.
- Las retenciones son montos que le retienes al proveedor y luego pagas a la DGII.
- El NCF del proveedor alimenta el 606 (ver
ncf-dgii.md).
Si no hay retenciones ni ITBIS, el asiento se simplifica a Dr Gasto / Cr CxP.
2. Pago al proveedor
Qué hace el usuario: registra el pago (ver ../usuario/cuentas-por-pagar.md).
Asiento (payment.sent) — paga los 1,060:
| Cuenta | Débito | Crédito |
|---|---|---|
| Cuentas por Pagar (210101) | 1,060.00 | |
| Caja/banco (110101) | 1,060.00 |
- Sale el dinero y baja lo que le debes al proveedor.
¿Cuándo se crea la CxP?
Al registrar/postear la factura del proveedor.
¿Cuándo se afecta banco/caja?
Al pagar.
¿Cuándo se afecta inventario?
Si la compra es de mercancía, la recepción (en Compras) genera la entrada de inventario por separado (ver inventario-y-costo.md). Si la compra capitaliza un activo, ver activos-fijos.md.
Cómo se reversa/anula
- Anular la factura reversa el asiento.
- Anular el pago reversa el desembolso. Ver
reversas-y-anulaciones.md.
Validaciones que evitan errores
- Asiento siempre cuadra (R11).
- No pagar más del saldo; concurrencia controlada.
- NCF de proveedor no duplicado.
Notas técnicas
- Reglas
vendor_bill.created,payment.sentenaccounting-rules.defaults.ts. Backendtenant-runtime/{purchasing,cxp,accounting,ncf}.
Contabilidad de Inventario y Costo de VentaEstado: Listo (regla automática inventory.movement).
Estado: Listo (regla automática inventory.movement).
Objetivo
Explicar qué asiento genera el sistema cuando entra o sale mercancía del inventario, y cómo se reconoce el costo de venta (COGS).
Cuentas involucradas (por defecto)
| Código | Cuenta |
|---|---|
| 110301 | Inventario |
| 510101 | Costo de venta (COGS) |
| 520105 | Contrapartida de ajuste/entrada |
1. Entrada de inventario (recepción de compra)
Qué hace el usuario: recibe mercancía (Compras) o registra una entrada de almacén.
Asiento (inventory.movement, tipo entrada) — entra mercancía por costo RD$800:
| Cuenta | Débito | Crédito |
|---|---|---|
| Inventario (110301) | 800.00 | |
| Contrapartida (520105) | 800.00 |
- Aumenta el inventario valorado al costo.
En el flujo de compra, la contrapartida real es la CxP del proveedor (ver compras-y-cxp.md); aquí se muestra el movimiento de inventario aislado.
2. Salida de inventario (venta / despacho)
Qué hace el usuario: vende/despacha mercancía.
Asiento (inventory.movement, tipo salida) — sale mercancía con costo RD$800:
| Cuenta | Débito | Crédito |
|---|---|---|
| Costo de venta / COGS (510101) | 800.00 | |
| Inventario (110301) | 800.00 |
- Reconoce el costo de lo vendido y baja el inventario.
- Este asiento es independiente del asiento de la factura (que registra el ingreso). Juntos: ingreso 1,000 (factura) − costo 800 (COGS) = utilidad bruta 200.
¿Cuándo se afecta inventario?
En cada movimiento que suba o baje existencia: recepción, despacho, traslado (neutro en total), ajuste, devolución.
Método de costeo
Cada ítem usa FIFO, promedio ponderado o costo estándar (ver ../usuario/inventario.md). El totalCost del movimiento se calcula con ese método.
Cómo se reversa
- Cancelar un movimiento posteado reversa también su asiento.
- Una devolución genera el movimiento inverso.
Validaciones que evitan errores
- Stock no queda negativo (salvo configuración).
- Existencia y libro de inventario (Kardex) siempre coinciden.
- Movimientos transaccionales (no dejan medio-estados).
Notas técnicas
- Regla
inventory.movementcon condiciones pormovementType(RECEIPT/RETURN_IN/IN/INBOUND vs DELIVERY/RETURN_OUT/OUT/OUTBOUND). Backendtenant-runtime/inventory.
Contabilidad de Banco y ConciliaciónEstado: Casi listo (movimientos de banco/caja postean al GL; la conciliación automática/importación de extractos debe verificarse).
Estado: Casi listo (movimientos de banco/caja postean al GL; la conciliación automática/importación de extractos debe verificarse).
Objetivo
Explicar cómo se contabilizan los movimientos de banco/caja y qué es la conciliación.
Principio
Todo movimiento de banco/caja (transferencia, cheque, depósito, cargo bancario, crédito bancario) genera su asiento con contrapartida. No se crea saldo bancario "paralelo": es el mismo ledger (BankAccount/BankTransaction) que usan CxC, CxP y Caja Chica.
Ejemplos de asientos
Transferencia entre dos cuentas propias — RD$10,000 de Banco A a Banco B:
| Cuenta | Débito | Crédito |
|---|---|---|
| Banco B | 10,000.00 | |
| Banco A | 10,000.00 |
Cargo bancario / comisión — RD$500:
| Cuenta | Débito | Crédito |
|---|---|---|
| Gasto bancario | 500.00 | |
| Banco | 500.00 |
¿Qué es la conciliación?
Comparar el saldo del libro (lo que dice el ERP) con el saldo del banco (el estado de cuenta). Las diferencias suelen ser partidas en tránsito:
- Cheques emitidos no cobrados: ya salieron del libro pero no del banco.
- Depósitos en tránsito: ya entraron al libro pero no aparecen aún en el banco.
Paso a paso (conciliar)
- Menú Banco → Conciliación → Conciliar.
- Selecciona cuenta y período.
- Marca los movimientos que aparecen en el estado del banco.
- Identifica las partidas en tránsito.
- El saldo del libro ± partidas en tránsito debe igualar el saldo del banco.
Limitación conocida
- El grado de automatización (importar extracto, matching automático) debe verificarse antes de prometerlo. Ver
../comercial/limitaciones-actuales.md.
Notas técnicas
- Backend
tenant-runtime/banking(reutiliza Tesorería). Skillsutilara-banking-production,utilara-treasury-production.
Contabilidad de Caja ChicaEstado: Listo (asientos reales de apertura, desembolso y reposición vía banco).
Estado: Listo (asientos reales de apertura, desembolso y reposición vía banco).
Objetivo
Explicar los asientos de crear el fondo, desembolsar y reponer la caja chica.
Cuentas involucradas
| Cuenta | Rol |
|---|---|
| Caja Chica (activo) | El fondo de efectivo. |
| Banco | De donde sale el dinero para fondear/reponer. |
| Gasto (según desembolso) | Clasifica cada gasto. |
1. Apertura / fondeo del fondo
Qué hace el usuario: crea la caja chica con un monto (ver ../usuario/caja-chica.md).
Asiento (petty_cash_opening) — fondo de RD$5,000:
| Cuenta | Débito | Crédito |
|---|---|---|
| Caja Chica | 5,000.00 | |
| Banco (contrapartida) | 5,000.00 |
- Sale dinero del banco y queda como fondo de caja chica.
2. Desembolso (gasto menor)
Qué hace el usuario: registra un gasto pagado del fondo.
Asiento (petty_cash_disbursement) — gasto de RD$300 en transporte:
| Cuenta | Débito | Crédito |
|---|---|---|
| Gasto (transporte) | 300.00 | |
| Caja Chica | 300.00 |
- Baja el disponible del fondo y reconoce el gasto.
- Anular un desembolso lo reversa (Dr Caja Chica / Cr Gasto).
3. Reposición
Qué hace el usuario: repone el fondo por el total de los desembolsos.
Asiento (salida de banco, bank_transaction) — reponer RD$300 gastados devuelve el fondo a su tope:
| Cuenta | Débito | Crédito |
|---|---|---|
| Caja Chica (contrapartida) | 300.00 | |
| Banco | 300.00 |
- El banco reembolsa lo gastado; el fondo vuelve a su tope.
¿Cuándo se afecta banco?
En la apertura y en la reposición (no en cada desembolso individual).
Validaciones que evitan errores
- No desembolsar más que el disponible.
- Concurrencia controlada (CAS) → no duplica desembolsos.
- No crea saldo bancario paralelo: usa
BankAccount/BankTransaction.
Notas técnicas
- Eventos
petty_cash_opening,petty_cash_disbursement,bank_transaction(+*_void). Backendtenant-runtime/petty-cash(createBankOutflow).
Contabilidad de Activos FijosEstado: Listo (asientos reales de depreciación, retiro y revalorización; verificados con Σdébito=Σcrédito).
Estado: Listo (asientos reales de depreciación, retiro y revalorización; verificados con Σdébito=Σcrédito).
Objetivo
Explicar los asientos de depreciar, retirar (dar de baja) y revalorizar un activo.
Cuentas involucradas (por defecto)
| Código | Cuenta |
|---|---|
| 520104 | Gasto por depreciación |
| 120201 | Depreciación acumulada |
| (activo) | Cuenta del activo (según tipo) |
| (superávit) | Superávit por revalorización (patrimonio) |
| (ganancia/pérdida) | Resultado en venta de activos |
Los códigos de gasto (520104) y acumulada (120201) son por defecto; el tipo de activo puede definir otros.
1. Depreciación
Qué hace el usuario: ejecuta la depreciación del período (ver ../usuario/activos-fijos.md).
Asiento (asset_depreciation) — depreciación del período RD$500:
| Cuenta | Débito | Crédito |
|---|---|---|
| Gasto por depreciación (520104) | 500.00 | |
| Depreciación acumulada (120201) | 500.00 |
- Reconoce el gasto y aumenta la depreciación acumulada (que reduce el valor en libros del activo).
- Idempotente por activo+período: no deprecia dos veces el mismo período.
2. Retiro / baja (venta de un activo)
Qué hace el usuario: retira el activo (venta o desecho).
Asiento (asset_disposal) — activo con costo 10,000, depreciación acumulada 6,000 (valor en libros 4,000), vendido en 5,000 + ITBIS 900, ganancia 1,000:
| Cuenta | Débito | Crédito |
|---|---|---|
| Depreciación acumulada (120201) | 6,000.00 | |
| Caja/proceeds (ingreso de la venta) | 5,900.00 | |
| Cuenta del activo | 10,000.00 | |
| ITBIS por pagar | 900.00 | |
| Ganancia en venta de activos | 1,000.00 |
- Se da de baja el activo y su depreciación acumulada.
- Si el resultado fuera negativo, en vez de "Ganancia" habría una Pérdida en venta del lado del débito.
- Anular el retiro reversa el asiento y reactiva el activo.
3. Revalorización
Qué hace el usuario: ajusta el valor del activo.
Asiento (asset_revaluation):
- Al alza (revaluación +2,000): Dr Cuenta del activo 2,000 / Cr Superávit por revalorización 2,000.
- A la baja (−2,000): Dr Pérdida por revalorización 2,000 / Cr Cuenta del activo 2,000.
| Caso | Débito | Crédito |
|---|---|---|
| Alza | Activo | Superávit (patrimonio) |
| Baja | Pérdida | Activo |
¿Cuándo se afecta banco/caja?
En el retiro con venta (entra el dinero de la venta). La depreciación y la revalorización no mueven efectivo.
Validaciones que evitan errores
- Σdébito=Σcrédito siempre.
- No doble depreciación (concurrencia).
- No operar un activo ya retirado.
Notas técnicas
- Posteo directo vía
recordSystemEntry(eventosasset_depreciation,asset_disposal,asset_revaluation, más sus*_void). Backendtenant-runtime/fixed-assets.
Contabilidad de NóminaEstado: Casi listo (motor tipado PayrollRun/Line/Config que postea al GL; verificar cobertura de UI de nómina).
Estado: Casi listo (motor tipado PayrollRun/Line/Config que postea al GL; verificar cobertura de UI de nómina).
Objetivo
Explicar los asientos de devengar y pagar la nómina.
Cuentas involucradas (configurables en PayrollConfig)
| Rol | Config |
|---|---|
| Gasto de sueldos | salaryExpenseCode |
| Sueldos por pagar (neto) | salaryPayableCode |
| TSS por pagar | tssPayableCode |
| ISR por pagar | isrPayableCode |
| INFOTEP por pagar | infotepPayableCode |
| Otras deducciones por pagar | otherDeductionsPayableCode |
| Gasto contribución patronal | employerContribExpenseCode |
Estas cuentas se configuran; si faltan, el sistema bloquea el posteo (ej. "Falta la cuenta Sueldos por Pagar").
1. Devengo de la nómina
Qué hace el usuario: crea y devenga la corrida (ver ../usuario/rrhh.md).
Asiento (payroll_run) — salario bruto RD$50,000, deducciones empleado (TSS+ISR) RD$8,000, neto RD$42,000 (esquema simplificado):
| Cuenta | Débito | Crédito |
|---|---|---|
| Gasto de sueldos | 50,000.00 | |
| Sueldos por pagar (neto) | 42,000.00 | |
| TSS / ISR / INFOTEP por pagar (deducciones) | 8,000.00 |
- Reconoce el gasto de personal y las obligaciones (lo que se pagará al empleado y a la seguridad social/impuestos).
- Además se registran las contribuciones patronales (SFS/AFP/INFOTEP/SRL empleador) como gasto adicional con su respectivo pasivo.
2. Pago de la nómina
Qué hace el usuario: paga el neto vía banco.
Asiento (pago):
| Cuenta | Débito | Crédito |
|---|---|---|
| Sueldos por pagar | 42,000.00 | |
| Banco | 42,000.00 |
- Salda la obligación con el empleado.
¿Cuándo se afecta banco?
En el pago (no en el devengo).
Validaciones que evitan errores
- Asiento balanceado.
- Concurrencia (CAS) → no duplica corridas.
- Bloquea si faltan cuentas de configuración.
- El neto a pagar debe ser positivo.
Notas técnicas
- Backend
tenant-runtime/hr/payroll(payroll.service.ts). Tasas configurables enPayrollConfig(SFS, AFP, INFOTEP, SRL, tope salarial TSS). - Skill:
utilara-hr-payroll-accounting-production. Ver../flujos/nomina.md.
NCF / DGII contable (606 / 607 / 608)Estado: Listo (lógica fiscal del core probada).
Estado: Listo (lógica fiscal del core probada).
Objetivo
Explicar cómo se relacionan los comprobantes fiscales (NCF) con la contabilidad y los reportes DGII.
¿Qué es el NCF?
El Número de Comprobante Fiscal identifica cada factura ante la DGII (República Dominicana). Al emitir una factura con NCF, el número se consume de una serie autorizada (sin huecos).
Relación con la contabilidad
El NCF no crea un asiento aparte: acompaña a la factura de venta/compra. El impuesto (ITBIS) sí se contabiliza:
- Venta: ITBIS por pagar (210201) — ver
facturacion-y-cxc.md. - Compra: ITBIS adelantado (110401) — ver
compras-y-cxp.md.
Los reportes DGII
| Reporte | Qué contiene | Fuente |
|---|---|---|
| 606 | Compras y gastos (con NCF de proveedores) | Facturas de proveedor (CxP) |
| 607 | Ventas (con NCF emitidos) | Facturas de venta (CxC) |
| 608 | Comprobantes anulados | NCF anulados |
| 609 | Pagos al exterior | (según configuración) |
Paso a paso (607)
- Menú Impuestos → Reporte 607.
- Selecciona el período.
- Genera → lista las ventas con su NCF, monto e ITBIS para presentar a la DGII.
Validaciones que evitan errores
- Numeración sin huecos por tipo de comprobante.
- El tipo de NCF debe corresponder a la operación (crédito fiscal, consumidor final, nota de crédito, etc.).
Cómo se anula
Anular una factura con NCF lo lleva al 608. Ver reversas-y-anulaciones.md.
Notas técnicas
- Core:
NcfService,EcfXmlService,NcfSequence,NcfUsage,EcfDocument. App e-CF:apps/ncf-dgii. Ver../apps/ncf-dgii.md.
Asientos y automatismos
Asientos contables (diario)Estado: Listo (asientos manuales, automáticos y recurrentes).
Estado: Listo (asientos manuales, automáticos y recurrentes).
Objetivo
Explicar qué es un asiento, cómo se crea uno manual, y cómo funcionan los automáticos y recurrentes.
¿Qué es un asiento?
Un asiento (o entrada de diario) es un registro contable con dos o más líneas, cada una con una cuenta y un monto en débito o crédito. La suma de débitos debe igualar la de créditos (R11).
Tipos de asiento en el ERP
| Tipo | Cómo se origina |
|---|---|
| Automático | Lo genera un módulo al operar (factura, pago, inventario, depreciación, nómina…). No lo escribes tú. |
| Manual | Lo escribes en Contabilidad → Diario (ajustes, reclasificaciones). |
| Recurrente | Plantilla que se repite (alquileres, provisiones); requiere aprobar/ejecutar. |
| Apertura / saldos iniciales | Carga los saldos al iniciar con el ERP. |
Paso a paso (asiento manual)
- Menú Contabilidad → Diario (nuevo).
- Fecha, concepto/descripción.
- Agrega líneas: cuenta, débito o crédito (no ambos en la misma línea), descripción.
- Verifica que cuadre.
- Guardar (borrador) → Postear (afecta el mayor).
Estados de un asiento
- Borrador: guardado, no afecta el mayor.
- Posteado: afecta el mayor.
- Cancelado/Anulado: reversado (ver
reversas-y-anulaciones.md); aparece en "Diarios Cancelados".
Validaciones que evitan errores
- R11: cada línea tiene débito o crédito (no ambos, no cero en ambos); el total cuadra.
- No se postea en período cerrado.
- La cuenta debe existir y estar activa.
Asientos recurrentes
Menú Contabilidad → Asientos Recurrentes (/accounting/recurring). Requiere permisos recurring_journal:create/edit/approve/execute.
Notas técnicas
- Backend
tenant-runtime/accounting(createEntry,postEntry,recordSystemEntry,createOpeningBalance,recurring-journal.service.ts). Validación de líneas envalidateLines().
Reversas y anulacionesEstado: Listo (patrón general de reversa por asiento inverso; verificado en varios módulos).
Estado: Listo (patrón general de reversa por asiento inverso; verificado en varios módulos).
Objetivo
Explicar cómo el sistema deshace una operación contable sin "borrar" nada.
Principio: no se borra, se reversa
En contabilidad no se elimina un asiento posteado: se crea un asiento inverso (intercambia débitos por créditos) que lo neutraliza. Así queda el rastro completo (auditoría). Los documentos anulados quedan visibles (ej. "Diarios Cancelados").
Cómo se reversa cada operación
| Operación original | Cómo se deshace | Efecto |
|---|---|---|
| Factura de venta | Anular / Nota de crédito | Reversa ingreso, ITBIS y CxC; repone inventario si es devolución |
| Recibo (cobro) | Anular recibo | Devuelve el saldo al cliente; reversa el ingreso a caja/banco |
| Factura de proveedor | Anular / Nota de débito | Reversa gasto/ITBIS y CxP |
| Pago a proveedor | Anular pago | Devuelve la deuda; reversa la salida de banco |
| Movimiento de inventario | Cancelar movimiento | Reversa existencia y su asiento |
| Depreciación | (reversa por período) | Reversa gasto y depreciación acumulada |
| Retiro de activo | Anular retiro | Reactiva el activo; reversa el asiento |
| Desembolso caja chica | Anular desembolso | Dr Caja Chica / Cr Gasto |
| Asiento manual | Anular/Cancelar | Asiento inverso; aparece en Diarios Cancelados |
Ejemplo — anular un cobro de RD$1,180
Asiento inverso del payment.received:
| Cuenta | Débito | Crédito |
|---|---|---|
| Cuentas por Cobrar (110201) | 1,180.00 | |
| Caja (110101) | 1,180.00 |
El cliente vuelve a deber 1,180.
Validaciones que evitan errores
- No se reversa en un período cerrado (habría que reabrirlo o reversar en el período abierto).
- Los
*_voiden el backend garantizan que la reversa cuadre (Σdébito=Σcrédito). - No se puede reversar dos veces la misma operación.
Efecto en NCF
Anular una factura fiscal lleva su NCF al 608 (anulados). Ver ncf-dgii.md.
Notas técnicas
- Eventos
*_void(bank_transaction_void,asset_disposal_void,petty_cash_disbursement_void, etc.) que intercambian débito/crédito de las líneas originales. BackendAccountingService.recordSystemEntry.
Cierres y períodos
Períodos contablesEstado: Casi listo (los períodos existen y bloquean posteos; el cierre es hoy un cambio de estado, no una saga completa).
Estado: Casi listo (los períodos existen y bloquean posteos; el cierre es hoy un cambio de estado, no una saga completa).
Objetivo
Explicar cómo se organizan los períodos y qué significa que estén abiertos o cerrados.
¿Qué es un período?
La contabilidad se divide en períodos (normalmente meses) dentro de años/ejercicios fiscales. Cada asiento pertenece a un período según su fecha.
Estados
| Estado | Qué permite |
|---|---|
| Abierto | Se pueden postear asientos con fecha en ese período. |
| Cerrado | No se aceptan asientos nuevos ni ediciones; solo consulta. |
Pantallas
| Función | Ruta |
|---|---|
| Períodos Contables | /accounting/accounting-periods |
| Períodos Fiscales (años) | /accounting/fiscal-years |
Paso a paso (cerrar un período)
- Verifica que todo esté registrado (facturas, pagos, inventario, depreciación, nómina).
- Revisa la Balanza de Comprobación (debe cuadrar).
- Menú Períodos Contables → cambia el período a Cerrado.
Validaciones que evitan errores
- Postear en período cerrado se rechaza.
- Reabrir un período debe ser una acción controlada por permisos.
Limitación conocida
- El cierre actual es un flip de estado (
setPeriodStatus), no una saga de cierre real (asientos de cierre de resultados, apertura del siguiente). Vercierres-contables.mdy la skillutilara-accounting-production(pendiente #22). No prometer un cierre automático completo.
Notas técnicas
- Backend
tenant-runtime/accounting. Pendiente: sagaCurrentlyClosing(06_STATE_MACHINES §17).
Cierres contablesEstado: Parcial. Los períodos se pueden marcar como cerrados (bloquean posteos), pero el cierre como proceso completo (saldar resultados, generar apertura del siguiente ejercicio) no está implementado como saga. Hoy es un cambio de estado.
Estado: Parcial. Los períodos se pueden marcar como cerrados (bloquean posteos), pero el cierre como proceso completo (saldar resultados, generar apertura del siguiente ejercicio) no está implementado como saga. Hoy es un cambio de estado.
Objetivo
Explicar qué es un cierre contable y qué hace (y qué no hace todavía) el ERP.
¿Qué es un cierre?
Al terminar un mes o un año, se "cierra" el período para que no se registren más asientos en él. En un cierre de año también se suelen:
- Saldar las cuentas de resultados (ingresos y gastos) contra la utilidad/pérdida del ejercicio.
- Abrir el nuevo ejercicio con los saldos del balance.
Qué hace el ERP hoy
| Función | Estado |
|---|---|
| Marcar un período como cerrado (bloquea posteos) | Listo |
| Reabrir un período (controlado) | Casi listo verificar permisos |
| Asientos de cierre de resultados automáticos | Pendiente No implementado como saga |
| Apertura automática del siguiente ejercicio | Pendiente No implementado como saga |
Cierre mensual recomendado (manual)
- Registrar todo (facturas, pagos, inventario, depreciación, nómina).
- Ejecutar la depreciación del mes.
- Revisar la Balanza de Comprobación (debe cuadrar).
- Conciliar bancos.
- Marcar el período como Cerrado.
Cierre anual
- Además de lo anterior, los asientos de cierre de resultados deben hacerse manualmente en el Diario (asientos de traspaso a resultados acumulados), ya que la saga automática no existe.
Limitación conocida
- Skill
utilara-accounting-production, pendiente #22: "Saga real de cierre contable mensual (estadoCurrentlyClosing) — hoysetPeriodStatuses solo flip de enum." No prometer cierre automático completo en demos.
Notas técnicas
- Backend
tenant-runtime/accounting(setPeriodStatus). Verperiodos-contables.md.
Reportes financieros
Reportes financierosEstado: Listo (Balanza, Mayor, Estado de Resultados, Balance General, Flujo derivan del mayor real).
Estado: Listo (Balanza, Mayor, Estado de Resultados, Balance General, Flujo derivan del mayor real).
Objetivo
Explicar qué muestra cada reporte financiero y de dónde salen los datos.
Principio clave
Todos los reportes financieros se calculan a partir del Mayor General (gl-entry), no de un módulo separado. Por eso siempre son consistentes con la contabilidad.
Los reportes
| Reporte | Ruta | Qué muestra |
|---|---|---|
| Balanza de Comprobación | /accounting/trial-balance | Saldo de cada cuenta; total débito = total crédito. Es la verificación de que todo cuadra. |
| Mayor General | /accounting/ledger | Todos los movimientos de cada cuenta. |
| Estado de Resultados | /accounting/profit-loss | Ingresos − Gastos = Utilidad/Pérdida del período. |
| Balance General | /accounting/balance-sheet | Activos = Pasivos + Patrimonio, a una fecha. |
| Flujo de Efectivo | /accounting/cash-flow | Entradas y salidas de efectivo. |
Cómo leerlos (simple)
- Estado de Resultados: ¿ganó o perdió la empresa en el período? Suma ingresos, resta gastos y costos.
- Balance General: ¿qué tiene y qué debe la empresa hoy? Activos a la izquierda; pasivos + patrimonio a la derecha; siempre iguales.
- Flujo de Efectivo: ¿de dónde vino y a dónde fue el dinero?
- Balanza: herramienta de control; si no cuadra, hay un problema (no debería ocurrir por R11).
Paso a paso
- Menú Contabilidad (o Reportes) → elige el reporte.
- Define período/fecha.
- Genera.
Validaciones
- Derivan de asientos posteados; los borradores no cuentan.
- Consistencia garantizada por R11.
Notas técnicas
- Sub-controllers
trial-balance,profit-loss,balance-sheet,cash-flow. Memoriaproject_erp_financial_reports(derivan de gl-entry, no del módulo enterprise/accounting).
Ayuda
Base de conocimiento
Cómo ajustar inventario- El ítem y el almacén existentes.
Antes de empezar
- El ítem y el almacén existentes.
- Permiso
inventory:create/update.
Pasos
Opción A — Ajuste directo:
- Menú Inventario → Movimiento de Inventario.
- Tipo Entrada (para sumar) o Salida (para restar), o un ajuste.
- Ítem, almacén, cantidad y motivo.
- Postear.
Opción B — Conteo cíclico:
- Menú Inventario → Auditoría (
/inventory/cycle-counts). - Registra lo contado; el sistema ajusta a la diferencia.
Resultado esperado
Existencia corregida y, si aplica, asiento de ajuste.
Errores comunes
- Stock quedaría negativo.
- Ítem sin costo para valorar.
Permisos necesarios
inventory:create/update.
Módulos relacionados
Inventario, Contabilidad. Ver ../flujos/inventario.md.
Cómo cobrar una factura- Una factura posteada con saldo.
Antes de empezar
- Una factura posteada con saldo.
- Una cuenta de caja/banco.
- Permiso
cxc:create.
Pasos
- Menú CxC → Recibo (nuevo).
- Selecciona el cliente → aparecen sus facturas abiertas.
- Marca la(s) factura(s) y el monto (total o parcial).
- Indica la cuenta de caja/banco y el medio de pago.
- Aplicar.
Resultado esperado
Saldo del cliente reducido; dinero en caja/banco; asiento (Dr Caja / Cr CxC).
Errores comunes
- Cobrar más del saldo.
- Falta la cuenta de caja/banco.
Permisos necesarios
cxc:create/update.
Módulos relacionados
CxC, Banco. Ver ../flujos/pago-cxc.md.
Cómo crear un activo fijo- Tipo de activo y tipo de depreciación configurados.
Antes de empezar
- Tipo de activo y tipo de depreciación configurados.
- Permiso
fixed-assets:create.
Pasos
- Menú Activos Fijos → Activo Fijo (nuevo).
- Registra descripción, costo, fecha de adquisición, vida útil, valor residual, método.
- Guardar.
- Alternativa: capitalizar desde una Factura de Suplidor.
Resultado esperado
Activo registrado, listo para depreciar.
Errores comunes
- Falta el tipo de activo/depreciación.
- Cuentas de activo/gasto/acumulada inexistentes.
Permisos necesarios
fixed-assets:create (o capitalize).
Módulos relacionados
Activos Fijos, Compras/CxP. Ver ../usuario/activos-fijos.md.
Cómo crear un cliente- Estar en el módulo Cuentas por Cobrar.
Antes de empezar
- Estar en el módulo Cuentas por Cobrar.
- Permiso
cxc:create.
Pasos
- Menú CxC → Cliente.
- Pestaña/botón Nuevo.
- Completa nombre, RNC/cédula, tipo de cliente, condición de pago y contacto.
- Guardar.
Resultado esperado
Cliente disponible para facturarle y cobrarle.
Errores comunes
- RNC/cédula duplicado.
- Falta el nombre.
Permisos necesarios
cxc:create.
Módulos relacionados
Facturación, CxC. Detalle en ../usuario/cuentas-por-cobrar.md.
Cómo crear un producto (ítem)- Categoría y unidad básicas.
Antes de empezar
- Categoría y unidad básicas.
- Permiso
inventory:create.
Pasos
- Menú Inventario → Ítem (nuevo).
- Escribe código, nombre, categoría, unidad.
- Define si controla stock, el método de costeo (FIFO/promedio/estándar), impuesto y precio.
- Guardar.
Resultado esperado
Ítem disponible para comprar, vender y mover en inventario.
Errores comunes
- Código duplicado.
- Falta categoría/unidad.
Permisos necesarios
inventory:create.
Módulos relacionados
Inventario, Facturación, Compras. Ver ../usuario/inventario.md.
Cómo crear una caja chica- Una cuenta de banco de la que sale el fondo.
Antes de empezar
- Una cuenta de banco de la que sale el fondo.
- Permiso del módulo
petty-cash.
Pasos
- Menú Caja Chica → Caja Chica (nuevo).
- Define el monto del fondo y la cuenta de banco.
- Guardar / Fondear.
Resultado esperado
Fondo creado; asiento Dr Caja Chica / Cr Banco.
Errores comunes
- Falta la cuenta de banco.
- Módulo no responde (revisar guard — nota técnica).
Permisos necesarios
petty-cash (acción de crear fondo).
Módulos relacionados
Caja Chica, Banco. Ver ../usuario/caja-chica.md.
Cómo crear una factura- Un cliente y un ítem existentes.
Antes de empezar
- Un cliente y un ítem existentes.
- Serie NCF configurada (si es fiscal).
- Permiso de facturación (
cxc:create).
Pasos
- Menú Facturación → Factura → Factura (nuevo).
- Selecciona el cliente.
- Elige la serie NCF (si aplica).
- Agrega líneas (ítem, cantidad, precio, descuento).
- Revisa subtotal, ITBIS, total.
- Guardar → Emitir/Postear.
Resultado esperado
Factura emitida con NCF, inventario descontado, CxC creada y asiento contable generado.
Errores comunes
- "No hay NCF disponible" → configurar serie.
- "Stock insuficiente".
- "Período cerrado".
Permisos necesarios
cxc:create (y ventas/POS según pantalla).
Módulos relacionados
Facturación, Inventario, CxC, NCF. Ver ../flujos/venta-completa.md.
Cómo crear una nóminaEstado: Casi listo (verificar cobertura de UI de nómina).
Estado: Casi listo (verificar cobertura de UI de nómina).
Antes de empezar
- App hr instalada.
PayrollConfigcon cuentas de nómina.- Empleados con salario.
Pasos
- Menú RRHH → asegura empleados y departamentos.
- Crea una corrida de nómina del período.
- Calcular las líneas (bruto, deducciones, neto).
- Revisa el resultado por empleado.
Resultado esperado
Corrida calculada, lista para aprobar/devengar.
Errores comunes
- "Falta la cuenta Sueldos por Pagar" → completar
PayrollConfig. - Corrida duplicada (409).
- App
hrno instalada (403).
Permisos necesarios
Recurso hr.
Módulos relacionados
RRHH, Contabilidad. Ver ../flujos/nomina.md. Para postear ver postear-nomina.md.
Cómo depreciar un activo- Un activo registrado.
Antes de empezar
- Un activo registrado.
- Período contable abierto.
- Permiso
fixed-assets:depreciate.
Pasos
- Menú Activos Fijos → Depreciación.
- Selecciona el período.
- Ejecutar (para todos) o depreciar un activo puntual.
Resultado esperado
Asiento: Dr Gasto por depreciación / Cr Depreciación acumulada. El valor en libros baja. No deprecia dos veces el mismo período.
Errores comunes
- "Ya depreciado en este período".
- Faltan cuentas de gasto/acumulada.
Permisos necesarios
fixed-assets:depreciate.
Módulos relacionados
Activos Fijos, Contabilidad. Ver ../flujos/depreciacion-activos.md.
Cómo desinstalar una app- Permiso de administración de apps.
Antes de empezar
- Permiso de administración de apps.
- Considerar apps que dependen de esta.
Pasos
- Abre el Catálogo de Apps del tenant.
- Elige la app y presiona Desinstalar.
- API equivalente:
DELETE /t/:slug/apps/:code/uninstall.
- Verifica que el menú desaparezca y que sus endpoints respondan fail-closed (403/404).
Resultado esperado
App con enabled=false; menú retirado; endpoints bloqueados de inmediato (guard sin caché); se ejecuta onAppUninstalled.
Errores comunes
- El menú sigue apareciendo → reiniciar backend (override) /
hiddenCodes. - Otras apps dependían de esta.
Permisos necesarios
Administración de apps del tenant.
Módulos relacionados
Apps. Ver ../flujos/app-install-uninstall.md.
Cómo instalar una app- Permiso de administración de apps.
Antes de empezar
- Permiso de administración de apps.
- La dependencia base instalada si la app la requiere (
depends_on, normalmenteutilara-erp).
Pasos
- Abre el Catálogo de Apps del tenant (pantalla
apps/). - Elige la app y presiona Instalar.
- API equivalente:
POST /t/:slug/apps/:code/install.
- Verifica que aparezca su menú y permisos.
- Si el menú no aparece y depende de overrides: reiniciar el backend.
Resultado esperado
App instalada (enabled=true), con menú y permisos sembrados (auto-grant al ADMIN).
Errores comunes
- No aparece el menú → reiniciar backend /
hiddenCodes. - Dependencia faltante → instalar la base primero.
Permisos necesarios
Administración de apps del tenant.
Módulos relacionados
Apps. Ver ../flujos/app-install-uninstall.md, ../apps/install-uninstall.md.
Cómo pagar a un proveedor- Una factura de proveedor con saldo.
Antes de empezar
- Una factura de proveedor con saldo.
- Cuenta de banco/caja.
- Permiso
cxp:create.
Pasos
- Menú CxP → Pago (o Pago de Contado).
- Selecciona el suplidor → sus facturas abiertas.
- Marca las facturas y el monto.
- Indica la cuenta de banco/caja.
- Aplicar.
Resultado esperado
Deuda reducida; salida de banco; asiento (Dr CxP / Cr Banco).
Errores comunes
- Pagar más del saldo.
- Doble pago concurrente (409).
Permisos necesarios
cxp:create/update.
Módulos relacionados
CxP, Banco. Ver ../flujos/pago-cxp.md.
Cómo postear (devengar y pagar) una nóminaEstado: Casi listo (verificar cobertura de UI).
Estado: Casi listo (verificar cobertura de UI).
Antes de empezar
- Una corrida de nómina calculada (ver
crear-nomina.md). - Período abierto y cuentas de nómina configuradas.
Pasos
- Aprobar la corrida.
- Postear (devengar): genera el asiento — Dr Gasto sueldos / Cr Sueldos por pagar (neto) / Cr deducciones.
- Pagar: salida de banco — Dr Sueldos por pagar / Cr Banco.
(API: POST .../runs/:id/approve → /post → /pay.)
Resultado esperado
Nómina devengada y pagada, con contabilidad cuadrada.
Errores comunes
- Falta cuenta de configuración → 400.
- Período cerrado.
Permisos necesarios
Recurso hr.
Módulos relacionados
RRHH, Banco, Contabilidad. Ver ../contable/nomina.md, ../flujos/nomina.md.
Cómo registrar un desembolso de caja chica- Un fondo de caja chica con disponible.
Antes de empezar
- Un fondo de caja chica con disponible.
- Cuenta de gasto para clasificar.
- Permiso del módulo
petty-cash.
Pasos
- Menú Caja Chica → Desembolso (nuevo).
- Selecciona el fondo, la cuenta de gasto, el monto y el beneficiario/comprobante.
- Guardar → Postear.
Resultado esperado
Disponible del fondo reducido; asiento Dr Gasto / Cr Caja Chica.
Errores comunes
- "Fondo insuficiente".
- Doble desembolso concurrente (409).
Permisos necesarios
petty-cash (acción de desembolso).
Módulos relacionados
Caja Chica, Contabilidad. Ver ../flujos/caja-chica.md.
Cómo registrar una compra- Un proveedor y los ítems.
Antes de empezar
- Un proveedor y los ítems.
- Un almacén para recibir.
- Permiso
purchasing:create.
Pasos
- Menú Compras → Orden de Compra (nueva) → aprobar/emitir.
- Al llegar la mercancía: Recepción contra la OC (afecta inventario).
- Al llegar la factura: Factura de Compra → Matching → aprobar → crea la CxP.
Resultado esperado
Mercancía en inventario y cuenta por pagar creada, con contabilidad.
Errores comunes
- Recepción excede la OC.
- Variancia fuera de tolerancia en el matching.
- NCF de proveedor duplicado.
Permisos necesarios
purchasing:create/update, cxp:create.
Módulos relacionados
Compras, Inventario, CxP. Ver ../flujos/compra-completa.md.
Guías Rápidas — UtilARA ERPPara quién: el usuario que solo quiere los pasos, sin teoría.
Para quién: el usuario que solo quiere los pasos, sin teoría.
Cada guía sigue el mismo formato: Antes de empezar → Pasos → Resultado esperado → Errores comunes → Permisos necesarios → Módulos relacionados.
Para el detalle completo de cada módulo, ver ../usuario/.
Índice
| Guía | Estado |
|---|---|
| crear-cliente.md | Listo |
| crear-factura.md | Listo |
| cobrar-factura.md | Listo |
| registrar-compra.md | Listo |
| pagar-proveedor.md | Listo |
| crear-item.md | Listo |
| ajustar-inventario.md | Listo |
| crear-activo-fijo.md | Listo |
| depreciar-activo.md | Listo |
| crear-caja-chica.md | Listo |
| registrar-desembolso.md | Listo |
| crear-nomina.md | Casi listo |
| postear-nomina.md | Casi listo |
| instalar-app.md | Listo |
| desinstalar-app.md | Listo |
Cómo anular una facturaAnular revierte todo — asiento, inventario y saldo — pero el NCF no vuelve.
Estado: Listo. La anulación revierte el asiento, repone el inventario y deja el saldo del cliente en cero, todo en una sola operación.
Cuándo anular y cuándo no
| Situación | Qué hacer |
|---|---|
| La factura está mal completa (cliente, fecha, todo) | Anular y emitir una nueva |
| El cliente devuelve mercancía | Nota de crédito de clase devolución |
| Hay que ajustar el monto sin devolución | Nota de crédito de clase ajuste financiero |
| Hay que cobrar de más | Nota de débito |
Permiso
cxc:delete.
Pasos
Facturación → Factura → Buscar Facturay abre la factura.- Pulsa Anular.
- Confirma.
Qué ocurre exactamente
| Efecto | Detalle |
|---|---|
| Asiento de venta | Se genera el asiento espejo: los saldos quedan en cero |
| Asiento de costo | Se revierte igual |
| Inventario | Las cantidades vuelven al almacén del que salieron |
| Cuenta por cobrar | El saldo del cliente baja por el total de la factura |
| Cobro de contado | Si la factura era de contado, el cobro se revierte junto con ella |
| Estado del documento | Pasa a Anulada. No se borra: sigue visible |
| NCF | No se devuelve. El número pasa al reporte 608 y no se reutiliza |
Antes de anular, verifica
- [ ] El período contable está abierto. Con el período cerrado la anulación se rechaza.
- [ ] La factura no tiene cobros aplicados. Si ya cobraste, revierte primero el cobro.
- [ ] Es realmente una anulación, no una devolución parcial.
Si el período está cerrado
Tienes dos caminos:
- Reabrir el período (permiso
accounting:reopen-period) — solo si el mes no se ha
declarado.
- Emitir una nota de crédito con fecha del período abierto — es lo correcto cuando el mes
ya se declaró a la DGII.
Consulta con tu contador: la segunda opción es casi siempre la buena.
Cómo verificar que quedó bien
- La factura muestra estado Anulada.
Contabilidad → Diariomuestra el asiento de reversión, cuadrado.Inventario → Existencia en Almacénmuestra la cantidad repuesta.Cuentas por Cobrar → Reporte CxC: el cliente ya no debe esa factura.Impuestos → Reporte 608incluye ese NCF; el 607 ya no.
Problemas frecuentes
| Síntoma | Causa | Solución |
|---|---|---|
| No aparece el botón Anular | Falta cxc:delete | Solicita el permiso |
| La anulación se rechaza | Período cerrado | Reabre o usa nota de crédito |
| El inventario no se repuso | La factura no tenía líneas inventariadas | Correcto: solo se repone lo que descontó |
| El NCF sigue en el 607 | El reporte se generó antes de anular | Vuelve a generarlo |
Cómo hacer una devoluciónLa nota de crédito de clase devolución repone inventario y revierte el costo original de esa venta.
Estado: Listo. La nota de crédito distingue entre ajuste financiero y devolución; la devolución repone el inventario y revierte el costo al costo original de la venta.
Elige la clase correcta
Este es el punto que hay que acertar:
| Clase | Cuándo | Qué hace |
|---|---|---|
| Devolución | El cliente devuelve mercancía | Repone el inventario en un almacén y revierte el costo de venta |
| Ajuste financiero | Descuento posterior, error de precio, bonificación | Solo ajusta el monto. No toca el inventario |
Usar ajuste financiero cuando hubo devolución física deja el inventario descuadrado.
Permiso
cxc:create.
Pasos
Cuentas por Cobrar → Nota de Crédito(/cxc/notas-credito).- Elige el cliente y la factura que se está devolviendo.
- Elige la clase: Devolución.
- Selecciona las líneas y las cantidades que realmente se devuelven — puede ser
parcial.
- Indica el almacén donde entra la mercancía devuelta.
- Elige el tipo de comprobante (normalmente
B04— Nota de Crédito). - Guarda como borrador y revisa.
- Postea.
Qué queda registrado al postear
| Efecto | Detalle |
|---|---|
| Inventario | Las cantidades devueltas entran al almacén indicado |
| Costo de venta | Se revierte al costo original de esa venta, no al costo actual |
| Cuenta por cobrar | El saldo del cliente baja por el monto de la nota |
| ITBIS | Se revierte proporcionalmente |
| NCF | Se emite el comprobante de nota de crédito |
| Comprobante | Se genera el PDF de la nota |
Por qué el costo original importa: si el costo del artículo subió desde la venta, revertir al costo de hoy inflaría artificialmente el margen de aquella venta. El sistema usa el costo con el que salió.
Devolución parcial
Es lo normal: selecciona solo las líneas y cantidades devueltas. La factura original conserva el resto de su saldo.
Anulación de la nota de crédito
Se puede anular, y la anulación es fail-closed: si alguna parte de la reversión no puede completarse (por ejemplo, porque el inventario ya no permite el movimiento), la operación completa se rechaza en vez de dejar el sistema a medias.
Cómo verificar
Inventario → Existencia en Almacén: la cantidad subió en el almacén indicado.Contabilidad → Diario: el asiento de la nota está cuadrado, con la reversión del costo.Cuentas por Cobrar → Reporte CxC: el saldo del cliente bajó.Impuestos → Reporte 607: la nota de crédito aparece con su signo.
Problemas frecuentes
| Síntoma | Causa | Solución |
|---|---|---|
| El inventario no cambió | Elegiste ajuste financiero | Anula la nota y emítela como devolución |
| No deja elegir almacén | La factura no tenía líneas inventariadas | Correcto: sin mercancía no hay reposición |
| Rechaza el posteo | Período cerrado | Usa una fecha del período abierto |
| No hay NCF disponible para B04 | Falta la secuencia de nota de crédito | Regístrala en Impuestos → Serie Fiscal |
Si el cliente ya había pagado
Después de postear la nota, la factura queda con saldo a favor del cliente. Puedes:
- Aplicarlo a una factura futura (queda como saldo disponible), o
- Devolver el dinero, registrando la salida desde el módulo de Banco.
Cómo cerrar un períodoQué revisar antes de cerrar el mes, cómo cerrarlo y qué diferencia hay entre cerrar, bloquear y cerrar el ejercicio.
Estado: Listo. Cerrar, reabrir y bloquear períodos, y cierre anual del ejercicio, con permisos separados para cada acción.
Los tres niveles
| Acción | Efecto | Permiso |
|---|---|---|
| Cerrar | El mes deja de admitir movimientos. Reversible | accounting:close-period |
| Reabrir | Vuelve a admitir movimientos | accounting:reopen-period |
| Bloquear | Cierre definitivo del período | accounting:close-period |
| Cierre anual | Cierra el ejercicio completo y traslada el resultado | accounting:close-period |
Reparte estos permisos con cuidado. Quien puede reabrir un período puede alterar cifras ya declaradas a la DGII.
Antes de cerrar — la lista real
Recórrela en el sistema:
- [ ] No quedan facturas en borrador que debieron emitirse este mes.
- [ ] No quedan facturas de compra pendientes de registrar.
- [ ] Los cobros y pagos del mes están registrados.
- [ ] La conciliación bancaria del mes está hecha.
- [ ] Los asientos manuales están posteados, no en borrador.
- [ ] La depreciación del mes está corrida (si usas activos fijos).
- [ ] La nómina del mes está posteada (si usas nómina).
- [ ] La Balanza de Comprobación cuadra: total débito = total crédito.
- [ ] Los reportes 606, 607 y 608 están generados y su conciliación contra la contabilidad
no muestra diferencias.
Es más barato revisar diez puntos que reabrir un mes declarado.
Cerrar
Contabilidad → Períodos Contables(/accounting/accounting-periods).- Localiza el mes.
- Pulsa Cerrar.
Desde ese momento, cualquier operación con fecha dentro del período —postear, anular, aplicar un cobro— es rechazada.
Reabrir
Mismo lugar, botón Reabrir, con el permiso correspondiente.
Cuándo es aceptable: encontraste un error antes de declarar el período. Cuándo no: el mes ya se declaró a la DGII. En ese caso corrige con un documento del período abierto (nota de crédito, asiento de ajuste), no reabriendo el pasado.
Bloquear
Cierre definitivo del período. Úsalo cuando el mes está declarado y auditado: elimina la tentación de reabrirlo.
Cierre anual del ejercicio
Contabilidad → Configuración → Cierre Anual
Se indica el año y la empresa. El proceso se ejecuta en segundo plano y devuelve un número de trabajo; su avance se sigue en Seguridad → Proceso → Buscar Procesos.
El cierre anual traslada el resultado del ejercicio al patrimonio y deja las cuentas de resultado en cero para el año nuevo.
Ejecútalo después de cerrar los doce meses y de tener los estados financieros definitivos.
Períodos del año siguiente
Contabilidad → Períodos Contables permite generar los períodos del año. Hazlo antes de que empiece el año nuevo: sin período abierto no se puede postear.
Qué significa exactamente «período cerrado»
| Puedes | No puedes |
|---|---|
| Consultar todo | Postear un documento con fecha en ese período |
| Ver e imprimir documentos | Anular un documento de ese período |
| Generar reportes | Aplicar un cobro o pago con esa fecha |
| Registrar documentos con fecha del período abierto | Registrar asientos manuales en el período cerrado |
Problemas frecuentes
| Síntoma | Causa | Solución |
|---|---|---|
| No se puede postear en período cerrado | La fecha cae en un mes cerrado | Usa una fecha del período abierto, o reabre |
| No aparece el botón Cerrar | Falta accounting:close-period | Solicita el permiso |
| La balanza no cuadra | Hay asientos en borrador o un documento a medias | Revisa el Diario filtrando por estado |
| El cierre anual no termina | Se ejecuta en segundo plano | Consulta el estado en Buscar Procesos |
Cómo agregar un usuarioCrear un usuario con contraseña o invitarlo por enlace, y asignarle su perfil.
Permiso necesario: user:create.
Opción A — Crear con contraseña
Seguridad → Usuarios → Usuario (/security/usuario/nuevo)
| Campo | Obligatorio |
|---|---|
| Sí — es el identificador de acceso, se guarda en minúsculas y no puede repetirse | |
| Contraseña | Sí — debe cumplir la política de la empresa |
| Nombre completo | No |
| Perfiles | No (se pueden asignar después) |
El usuario queda activo y ya puede entrar.
Opción B — Invitar
El sistema crea la cuenta inactiva y genera un enlace válido 7 días. La persona lo abre, define su contraseña y la cuenta se activa.
Límite: 20 invitaciones por hora.
Asignar el perfil
Seguridad → Usuarios → Perfiles Usuario (/security/usuario/perfiles)
| Perfil | Alcance |
|---|---|
| Administrador | Acceso total, incluida configuración y seguridad |
| Gerente | Gestión operativa: crear, editar, aprobar, contabilizar |
| Personal | Operación diaria: leer y crear |
Un usuario puede tener varios perfiles: se suman los permisos.
Antes de dar de alta a todo el equipo
- Revisa la política de contraseñas (
Configurar Usuarios): se aplica en el momento del
alta, no después.
- Decide los perfiles por función, no por persona.
- Verifica el límite de usuarios de tu plan.
Errores frecuentes
| Mensaje | Causa | Solución |
|---|---|---|
| Ya existe un usuario con ese email | El correo está en uso, incluso si la cuenta está inactiva | Reactiva la existente |
| Perfiles inválidos: … | El nombre de perfil no existe | Verifícalo en Seguridad → Perfiles |
| La contraseña es rechazada | No cumple la política | Ajústala |
| Límite de usuarios alcanzado | Tope del plan | Consulta la ampliación del plan |
Dar de baja
Desactiva, no elimines: eliminar pierde la trazabilidad de lo que esa persona registró. El sistema impide desactivar al último administrador activo.
Cómo cambiar una contraseñaCambiar tu contraseña, restablecer la de otra persona y qué hacer si la olvidaste.
La tuya
- Abre tu perfil.
- Entra en Seguridad.
- Indica la contraseña actual y la nueva.
La nueva debe cumplir la política de tu empresa. Si no, el sistema la rechaza indicando qué falta.
Por defecto: mínimo 8 caracteres. Tu empresa puede exigir más longitud, mayúsculas, números o caracteres especiales.
Una buena contraseña
- Larga antes que complicada:
caballo-verde-mesa-42es mejor queP@s5!. - Distinta de la que usas en otros servicios.
- Nunca compartida. Si alguien más necesita entrar, que tenga su propia cuenta.
La de otra persona (administradores)
Seguridad → Usuarios → Buscar Usuarios (/security/usuario/buscar)
Abre el usuario y establece una contraseña nueva. Comunícala por un canal seguro y pide que la cambie al entrar.
Requiere user:update.
Si la olvidaste
Pide a quien administra el sistema en tu empresa que te la restablezca. No existe un enlace de «olvidé mi contraseña» que puedas usar por tu cuenta.
Después de cambiarla
Las sesiones ya abiertas no se cierran solas. Si cambiaste la contraseña porque sospechas que alguien la conocía:
- Ve a tu perfil → sesiones activas.
- Pulsa Cerrar todas las sesiones.
- Vuelve a entrar con la contraseña nueva.
Si crees que tu cuenta fue comprometida
- Cambia la contraseña.
- Cierra todas las sesiones.
- Activa la verificación en dos pasos.
- Avisa a quien administra el sistema para que revise la bitácora de actividad.
Endurecer la política (administradores)
Seguridad → Configuración → Configurar Usuarios (/security/config/usuarios)
La política se aplica al crear usuarios y al cambiar contraseñas. Endurecerla no invalida las contraseñas existentes: si la cambias, pide un cambio de contraseña al equipo.
Cómo agregar un almacénCrear un almacén, cargarle existencia inicial y empezar a mover mercancía.
Permiso necesario: inventory:create.
Pasos
Inventario → Almacén(/inventory/warehouses).- Completa:
| Campo | Nota |
|---|---|
| Código | Corto y estable: PRIN, TIENDA1, VEHIC1 |
| Nombre | Legible |
| Activo | Un almacén inactivo desaparece de los selectores, sin borrar el histórico |
- Guarda.
Después de crearlo
El almacén nace vacío. Para que sirva:
1. Carga la existencia inicial
Inventario → Revalorización de Costos (/inventory/valuation), artículo por artículo: cantidad, costo unitario y fecha efectiva.
Pon el costo real. Un almacén cargado con costo 0 produce costo de venta 0 y margen inflado en cada factura que despache desde ahí.
2. O trasládale mercancía
Inventario → Movimiento de Inventario → Traslado Almacén: mueve existencias desde otro almacén, con su costo.
Ubicaciones dentro del almacén
Si necesitas más detalle (pasillo, estante, cámara), crea ubicaciones (/inventory/locations) dentro del almacén.
Almacén, sucursal y tienda
| Concepto | Controla |
|---|---|
| Almacén | Cuánta mercancía hay en un sitio |
| Sucursal | Resultado contable por local |
| Tienda | Punto de venta con cajas y turnos |
Son independientes y se combinan. Para saber qué hay en cada local, necesitas un almacén por local.
Cómo se usa después
| Operación | Uso del almacén |
|---|---|
| Factura de venta | Campo Almacén de despacho — de ahí se descuenta |
| Recepción de compra | Almacén donde entra la mercancía |
| Traslados | Origen y destino |
| Conteo cíclico | Se cuenta por almacén |
| Devolución (nota de crédito) | Almacén donde vuelve la mercancía |
Problemas frecuentes
| Síntoma | Causa | Solución |
|---|---|---|
| El almacén no aparece al facturar | Está inactivo, o es de otra empresa | Revisa estado y empresa |
| Aparece pero sin existencias | Nunca se cargó ni recibió mercancía | Carga existencia inicial o traslada |
| El costo de venta sale en cero | Existencia cargada sin costo | Corrige la valuación |
| No puedo eliminar un almacén | Tiene movimientos asociados | Desactívalo en vez de borrarlo |
Cómo exportar a ExcelQué formatos existen, cuál elegir y cómo abrir el CSV sin romper las tildes.
Qué formatos existen
| Formato | Qué obtienes | Cuándo usarlo |
|---|---|---|
| CSV | Texto separado por comas, con marca UTF-8 | Reimportar en otro sistema, o procesar los datos |
| EXCEL | Archivo .xls que Excel abre directo | Trabajar la tabla a mano |
| Documento listo para imprimir o enviar | Archivar o compartir |
El sistema no genera archivos .xlsx nativos. La opción EXCEL produce un archivo que Excel abre sin problema. Si lo que quieres es procesar los datos, usa CSV.
Dónde está cada formato
| Pantalla | Formatos |
|---|---|
| Balanza de Comprobación | CSV · EXCEL · PDF |
| Estado de Resultados | CSV · EXCEL · PDF |
| Balance General | CSV · EXCEL · PDF |
| Flujo de Efectivo | CSV · EXCEL · PDF |
| Mayor General | CSV · EXCEL · PDF |
| Consolidación e Intercompañía | CSV · EXCEL · PDF |
| Reportes de Gasto | CSV |
| Reportes de Inventario | CSV |
| Plan de Cuentas | CSV |
| Reportes dinámicos (CxC, CxP, Banco, Finanzas, Impuestos) | CSV |
| Listados de módulos (clientes, activos, comisiones…) | CSV |
Los botones aparecen en la parte superior del reporte.
Abrir el CSV sin romper las tildes
El archivo sale en UTF-8. Si al abrirlo con doble clic ves MueblerÃa, ábrelo así:
Excel: Datos → Obtener datos → Desde texto/CSV → elige el archivo → en Origen del archivo selecciona UTF-8 → Cargar.
Google Sheets: Archivo → Importar → Subir — detecta UTF-8 automáticamente.
LibreOffice: al abrir, elige juego de caracteres Unicode (UTF-8).
Permisos
Exportar puede requerir un permiso propio:
| Reporte | Permiso |
|---|---|
| Contabilidad | accounting:export |
| Estado de Resultados | profit_loss:export |
| Balance General | balance_sheet:export |
| Balanza | trial_balance:export |
| Mayor General | general_ledger:export |
| Reportes 606 / 607 / 608 | ncf:export-606 / -607 / -608 |
Si el botón no aparece, es un tema de permisos, no un fallo.
Consejos
- Filtra antes de exportar. Es más rápido acotar en pantalla que en Excel.
- Para cifras contables definitivas, filtra por estado POSTED: los borradores no son
contabilidad.
- Para enviar a un tercero, usa PDF: no se altera por accidente.
- Los reportes de la DGII se descargan en su formato propio desde la pantalla de cada
reporte, no con el botón genérico.
Problemas frecuentes
| Síntoma | Causa | Solución |
|---|---|---|
| Tildes rotas | Se abrió sin indicar UTF-8 | Importa indicando UTF-8 |
| Todo en una columna | Excel usa punto y coma como separador | Importa con el asistente e indica coma |
| Archivo vacío | Los filtros no devuelven filas | Amplía el rango |
| No aparece el botón | Falta el permiso de exportación | Solicítalo |
| El PDF tarda | Se genera en el servidor | Espera; para tablas grandes prefiere CSV |
Flujos completos
Flujo: Activo fijo → depreciaciónEstado: Listo.
Estado: Listo.
Pasos
1. Crear el activo
Menú Activos Fijos → Activo Fijo (nuevo). Costo, fecha, vida útil, valor residual, método. API: POST /t/:slug/fixed-assets. (También puede capitalizarse desde una factura de proveedor: POST /fixed-assets/bulk-from-invoice.)
2. Depreciar el período
Menú Activos Fijos → Depreciación → Ejecutar. API: POST /fixed-assets/depreciation/execute (o /:id/depreciate).
Asiento (asset_depreciation, 500):
| Cuenta | Débito | Crédito |
|---|---|---|
| Gasto por depreciación (520104) | 500 | |
| Depreciación acumulada (120201) | 500 |
Resultado esperado
Valor en libros del activo reducido por la depreciación acumulada; gasto reconocido. Idempotente por activo+período (no deprecia dos veces).
Errores comunes
- "Ya depreciado en este período" → doble depreciación evitada.
- Faltan cuentas de gasto/acumulada.
Referencias
../contable/activos-fijos.md, ../api/fixed-assets.md.
Flujo: Caja Chica (fondo → desembolso → reposición)Estado: Listo.
Estado: Listo.
Pasos
1. Crear el fondo
Menú Caja Chica → Caja Chica (nuevo). Monto + cuenta de banco. API: POST /t/:slug/petty-cash/:companyId/funds. Asiento (petty_cash_opening, fondo 5,000): Dr Caja Chica 5,000 / Cr Banco 5,000.
2. Desembolsar
Menú Caja Chica → Desembolso. Cuenta de gasto + monto + beneficiario. API: POST .../disbursements + .../disbursements/:id/post. Asiento (petty_cash_disbursement, gasto 300): Dr Gasto 300 / Cr Caja Chica 300.
3. Reponer
Menú Caja Chica → Reposición. API: POST .../replenishments/generate → /approve → /pay-check. Asiento (salida de banco, 300): Dr Caja Chica 300 / Cr Banco 300.
Resultado esperado
Fondo creado, gastos registrados, fondo repuesto a su tope; todo cuadrado y sin saldo bancario paralelo.
Errores comunes
- Fondo insuficiente para el desembolso.
- Doble desembolso concurrente → 409 (CAS).
Referencias
../contable/caja-chica.md, ../api/petty-cash.md.
Flujo: Cierre de caja / sesión POSEstado: Casi listo (POS con sesiones existe; verificar el flujo exacto de arqueo/cierre por UI).
Estado: Casi listo (POS con sesiones existe; verificar el flujo exacto de arqueo/cierre por UI).
Requisitos previos
App/menú Terminal POS activo; una sesión de POS abierta.
Pasos (esperados)
- Menú Terminal POS → Terminal. Abrir la sesión (
pos-sessions). - Registrar ventas durante el turno (
pos-sales). - Al cerrar el turno, arqueo: contar el efectivo y compararlo con lo esperado.
- Cerrar la sesión → cuadre y, si aplica, asiento del efectivo del día.
Endpoints
Controllers t/:slug/pos → pos-sessions, pos-sales, pos-stores.
Resultado esperado
Sesión cerrada con el efectivo cuadrado; ventas del turno contabilizadas.
A verificar (No verificado)
- El detalle del arqueo/diferencias de caja y su asiento exacto no se confirmó end-to-end en esta auditoría. No prometer el cierre de caja detallado sin validarlo con la skill de facturación/POS y un smoke test.
Referencias
../usuario/facturacion.md (sección POS), ../api/billing.md.
Flujo: Cobro de una factura (CxC)Estado: Listo.
Estado: Listo.
Requisitos previos
Una factura de venta posteada con saldo pendiente; una cuenta de caja/banco.
Pasos
- Menú CxC → Recibo (nuevo). API:
POST /t/:slug/cxc/:companyId/payments. - Selecciona el cliente → aparecen sus facturas abiertas.
- Marca la(s) factura(s) y el monto (total o parcial).
- Indica la cuenta de caja/banco y el medio de pago.
- (Opcional) registra retención del cliente o descuento por pronto pago.
- Aplicar. API:
POST .../payments/:id/apply.
Asiento (payment.received, cobro 1,180)
| Cuenta | Débito | Crédito |
|---|---|---|
| Caja (110101) | 1,180 | |
| CxC (110201) | 1,180 |
Resultado esperado
Saldo del cliente reducido; dinero en caja/banco; asiento posteado.
Errores comunes
- Cobrar más del saldo → rechazado.
- Anticipo ya aplicado (concurrencia) → 409.
- Sin cuenta de caja/banco → falta el destino del dinero.
Reversa
POST .../payments/:id/void → devuelve el saldo al cliente. Ver ../contable/reversas-y-anulaciones.md.
Permisos
cxc:create/update.
Flujo: Compra completa (proveedor → OC → recepción → factura → pago → 606)Estado: Listo.
Estado: Listo.
Actores
Comprador, almacén (recepción), cuentas por pagar.
Requisitos previos
Proveedor, ítems, almacén, cuenta de banco.
Pasos
1. Proveedor
Menú Compras → Proveedor (o CxP → Suplidor).
2. (Opcional) Solicitud y cotización
Menú Compras → Solicitud de Material → Solicitud de Cotización → Cotización del Proveedor. API: POST /t/:slug/purchasing/:companyId/requisitions, /rfqs.
3. Orden de Compra
Menú Compras → Orden de Compra. Aprobar/emitir. API: POST .../orders, .../orders/:id/approve, /issue.
4. Recepción
Al llegar la mercancía: POST .../orders/:id/receipts. Entra al inventario:
| Cuenta | Débito | Crédito |
|---|---|---|
| Inventario (110301) | 800 | |
| (contrapartida recepción) | 800 |
5. Factura del proveedor + Matching
POST .../invoices/:id/match (2/3-way), luego .../approve-for-accounting → crea la CxP.
Asiento (compra 1,000 + ITBIS 180, ret. ITBIS 100 e ISR 20):
| Cuenta | Débito | Crédito |
|---|---|---|
| Gasto/compra (520105) | 1,000 | |
| ITBIS adelantado (110401) | 180 | |
| Ret. ITBIS (210203) | 100 | |
| Ret. ISR (210204) | 20 | |
| CxP (210101) | 1,060 |
6. Pago
Menú CxP → Pago. POST /t/:slug/cxp/:companyId/payments + /apply.
| Cuenta | Débito | Crédito |
|---|---|---|
| CxP (210101) | 1,060 | |
| Banco (110101) | 1,060 |
7. Reporte 606
Menú Impuestos → Reporte 606 → la compra aparece con el NCF del proveedor.
Resultado esperado
Mercancía en inventario, deuda con el proveedor saldada, retenciones registradas, NCF en el 606.
Qué puede salir mal
- Variancia fuera de tolerancia en el matching.
- NCF de proveedor duplicado.
- Recepción excede la OC.
Referencias
../contable/compras-y-cxp.md, ../api/purchasing.md, ../api/cxp.md.
Flujo: Emisión de NCF y reporte 607Estado: Listo.
Estado: Listo.
Requisitos previos
Serie NCF configurada (POST /t/:slug/ncf/sequences); factura de venta.
Pasos
1. Configurar la serie NCF
Menú Impuestos → Serie Fiscal (o API POST /ncf/sequences). Tipo, rango, vencimiento.
2. Emitir factura con NCF
Al postear una factura de venta (POST /t/:slug/cxc/:companyId/invoices/:id/post), el sistema asigna y consume el siguiente NCF de la serie (sin huecos). Registro en NcfUsage.
3. Consultar consumo
GET /t/:slug/ncf/usage — muestra los NCF emitidos.
4. Generar el 607
Menú Impuestos → Reporte 607 o GET /t/:slug/ncf/reports/607?period=YYYY-MM → lista las ventas con NCF, montos e ITBIS para la DGII.
Anulación (608)
Anular una factura con NCF (PATCH /ncf/usage/:id/void / anular factura) lo lleva al 608.
Resultado esperado
Comprobantes emitidos correctamente y reporte 607 listo para presentar.
Errores comunes
- "No hay NCF disponible" → serie agotada/vencida.
- Tipo de NCF incorrecto para la operación.
Referencias
../contable/ncf-dgii.md, ../api/ncf-dgii.md, ../apps/ncf-dgii.md.
Flujo: Instalar app → usar → desinstalarEstado: Listo.
Estado: Listo.
Pasos
1. Ver apps disponibles
GET /t/:slug/apps/available (o Catálogo de Apps en la UI).
2. Instalar
POST /t/:slug/apps/:code/install. Efecto:
InstalledAppconenabled=true.- Permisos sembrados y otorgados al ADMIN.
- Entradas de menú añadidas.
3. El menú aparece
El menú de la app se muestra en el sidebar. Si depende de overrides, reiniciar el backend. Ver ../tecnico/menu-y-overrides.md.
4. Usar un endpoint
Con la app instalada, sus endpoints (@RequireApp('<code>')) responden normal. Ejemplo CRM: GET /t/:slug/apps/crm/dashboard.
5. Desinstalar
DELETE /t/:slug/apps/:code/uninstall. Efecto:
enabled=false.onAppUninstalled(limpieza).
6. El menú desaparece / endpoints bloqueados
Los endpoints de la app vuelven a fail-closed (403/404) de inmediato (guard sin caché). El menú se retira.
Verificar
# antes: instalada
curl -H "Authorization: Bearer <jwt>" .../t/<slug>/apps | grep <code>
# endpoint responde
curl -H "Authorization: Bearer <jwt>" .../t/<slug>/apps/<code>/...
# después de desinstalar: 403/404
Errores comunes
- Menú no cambia → backend no reiniciado (override) o
hiddenCodes. - Dependencia faltante → instalar primero la base (
depends_on).
Referencias
../apps/install-uninstall.md, ../api/apps.md, ../tecnico/apps-instalables.md.
Flujo: Movimientos de inventarioEstado: Listo.
Estado: Listo.
Tipos de movimiento
Entrada, salida, traslado entre almacenes, conduce/despacho, devolución, ajuste, conteo cíclico, revalorización.
Pasos (entrada de almacén)
- Menú Inventario → Movimiento de Inventario.
- Tipo Entrada, almacén destino, ítems y cantidades (con costo).
- Confirmar/postear → sube existencia + asiento.
Asiento (entrada, costo 800): Dr Inventario (110301) 800 / Cr contrapartida (520105) 800.
Pasos (salida / despacho)
- Tipo Salida, almacén origen, ítems y cantidades.
- Postear → baja existencia + costo.
Asiento (salida, costo 800): Dr COGS (510101) 800 / Cr Inventario (110301) 800.
Traslado
Origen − / destino + (neutro en valor total). Genera movimientos en ambos almacenes.
Costeo
FIFO / promedio / estándar por ítem; el totalCost se calcula con ese método.
Resultado esperado
Existencia y Kardex actualizados; asiento cuando corresponde; stock nunca negativo.
Errores comunes
- Stock insuficiente en la salida.
- Ítem sin costo.
Referencias
../contable/inventario-y-costo.md, ../api/inventory.md.
Flujo: Nómina (empleado → corrida → devengo → pago)Estado: Casi listo (motor tipado postea al GL; verificar cobertura de UI).
Estado: Casi listo (motor tipado postea al GL; verificar cobertura de UI).
Requisitos previos
App hr instalada; PayrollConfig con cuentas de nómina; empleados con salario.
Pasos
1. Empleados y departamentos
Menú RRHH. Registra empleados (con salario) y departamentos.
2. Crear la corrida
POST /t/:slug/hr/:companyId/payroll/runs (período).
3. Calcular
POST .../runs/:id/calculate → líneas por empleado (bruto, deducciones, neto, contribuciones patronales).
4. Aprobar y devengar
POST .../runs/:id/approve → POST .../runs/:id/post (devengo, postea al GL).
Asiento (devengo, bruto 50,000, deducciones 8,000, neto 42,000):
| Cuenta | Débito | Crédito |
|---|---|---|
| Gasto de sueldos | 50,000 | |
| Sueldos por pagar (neto) | 42,000 | |
| TSS/ISR/INFOTEP por pagar | 8,000 |
(+ contribuciones patronales como gasto/pasivo adicional.)
5. Pagar
POST .../runs/:id/pay (salida de banco).
| Cuenta | Débito | Crédito |
|---|---|---|
| Sueldos por pagar | 42,000 | |
| Banco | 42,000 |
Resultado esperado
Nómina calculada, devengada y pagada, con contabilidad.
Errores comunes
- "Falta la cuenta Sueldos por Pagar" → completar
PayrollConfig. - Corrida duplicada → 409 (CAS).
- App
hrno instalada → 403.
Referencias
../contable/nomina.md, ../api/payroll.md, ../apps/hr.md.
Flujo: Pago a un proveedor (CxP)Estado: Listo.
Estado: Listo.
Requisitos previos
Una factura de proveedor registrada con saldo; cuenta de banco/caja.
Pasos
- Menú CxP → Pago (o Pago de Contado). API:
POST /t/:slug/cxp/:companyId/payments. - Selecciona el suplidor → sus facturas abiertas.
- Marca las facturas y el monto.
- Indica la cuenta de banco/caja.
- Aplicar. API:
POST .../payments/:id/apply.
Asiento (payment.sent, pago 1,060)
| Cuenta | Débito | Crédito |
|---|---|---|
| CxP (210101) | 1,060 | |
| Banco (110101) | 1,060 |
Resultado esperado
Deuda con el proveedor reducida; salida de banco; asiento posteado.
Errores comunes
- Pagar más del saldo → rechazado.
- Doble pago concurrente → 409.
- Sin cuenta de banco → falta la fuente del pago.
Reversa
POST .../payments/:id/void. Ver ../contable/reversas-y-anulaciones.md.
Permisos
cxp:create/update.
Flujo: Retiro / baja de activo fijoEstado: Listo.
Estado: Listo.
Requisitos previos
Un activo registrado (con su depreciación acumulada).
Pasos
- Menú Activos Fijos → Retiro. Registra si es venta (con monto e ITBIS) o desecho. API:
POST /t/:slug/fixed-assets/:id/dispose. - El sistema calcula ganancia/pérdida = valor de venta − valor en libros.
Asiento (asset_disposal) — costo 10,000, depr. acum. 6,000, venta 5,000 + ITBIS 900, ganancia 1,000
| Cuenta | Débito | Crédito |
|---|---|---|
| Depreciación acumulada (120201) | 6,000 | |
| Caja/proceeds | 5,900 | |
| Cuenta del activo | 10,000 | |
| ITBIS por pagar | 900 | |
| Ganancia en venta de activos | 1,000 |
- Si hay pérdida, va del lado del débito.
Resultado esperado
Activo dado de baja; ganancia/pérdida reconocida; si es venta, entra el dinero.
Reversa
Anular el retiro reactiva el activo y reversa el asiento (asset_disposal_void).
Errores comunes
- "Activo ya retirado".
Referencias
../contable/activos-fijos.md, ../api/fixed-assets.md.
Flujo: Venta completa (cliente → factura → cobro → 607)Estado: Listo.
Estado: Listo.
Actores
Vendedor/facturador, cobrador.
Requisitos previos
Cliente, ítem con stock y costo, serie NCF (si fiscal), cuenta de banco/caja.
Pasos
1. Crear el cliente
Menú CxC → Cliente (nuevo). Ver ../guias-rapidas/crear-cliente.md.
2. Tener el ítem
Menú Inventario → Ítem. Debe tener existencia y costo (para el COGS).
3. Crear la factura
Menú Facturación → Factura (o CxC → invoices). Cliente + líneas + serie NCF. API: POST /t/:slug/cxc/:companyId/invoices.
4. Postear la factura
Botón Emitir/Postear (POST .../invoices/:id/post). Aquí ocurre todo:
- Consume el NCF (→ 607).
- Descuenta inventario y genera COGS.
- Crea la CxC.
- Postea el asiento.
Asiento (venta 1,000 + 18% ITBIS):
| Cuenta | Débito | Crédito |
|---|---|---|
| CxC (110201) | 1,180 | |
| Ingresos (410102) | 1,000 | |
| ITBIS por pagar (210201) | 180 |
Asiento de costo (COGS, costo 800):
| Cuenta | Débito | Crédito |
|---|---|---|
| COGS (510101) | 800 | |
| Inventario (110301) | 800 |
5. Cobrar
Menú CxC → Recibo. Marca la factura, indica caja/banco. API: POST .../payments + .../payments/:id/apply.
Asiento (cobro 1,180):
| Cuenta | Débito | Crédito |
|---|---|---|
| Caja (110101) | 1,180 | |
| CxC (110201) | 1,180 |
6. Reporte 607
Menú Impuestos → Reporte 607 → la venta aparece con su NCF.
Resultado esperado
Cliente sin saldo, inventario descontado, utilidad reconocida (1,000 − 800 = 200), NCF en el 607, todo cuadrado.
Qué puede salir mal
- Sin NCF disponible → configurar serie.
- Stock insuficiente → reponer inventario.
- Período cerrado → usar período abierto.
Referencias
../contable/facturacion-y-cxc.md, ../contable/inventario-y-costo.md, ../api/cxc.md.
Flujos End-to-End — UtilARA ERPPara quién: todos. Cada documento sigue un proceso completo de principio a fin, mostrando qué hace el usuario, qué módulos se enlazan y qué contabilidad se genera en cada paso.
Para quién: todos. Cada documento sigue un proceso completo de principio a fin, mostrando qué hace el usuario, qué módulos se enlazan y qué contabilidad se genera en cada paso.
Índice
| Documento | Flujo | Estado |
|---|---|---|
| venta-completa.md | Cliente → ítem → factura → NCF → inventario → cobro → GL → 607 | Listo |
| compra-completa.md | Proveedor → OC → recepción → factura → CxP → pago → GL → 606 | Listo |
| pago-cxc.md | Cobro de una factura de cliente | Listo |
| pago-cxp.md | Pago a un proveedor | Listo |
| inventario.md | Entrada, salida, traslado, costo | Listo |
| cierre-de-caja.md | Cierre de sesión POS / caja | Casi listo |
| caja-chica.md | Fondo → desembolso → reposición → GL | Listo |
| depreciacion-activos.md | Crear activo → depreciar → GL | Listo |
| retiro-activos.md | Retiro/baja de activo → GL | Listo |
| nomina.md | Empleado → corrida → devengo → pago → GL | Casi listo |
| ncf-607.md | Emisión de NCF y reporte 607 | Listo |
| app-install-uninstall.md | Instalar app → menú aparece → usar → desinstalar → menú desaparece | Listo |
Cómo leer cada flujo
Cada documento tiene:
- Actores y requisitos previos.
- Pasos numerados (con la pantalla real y su ruta).
- Qué asiento contable se genera en cada paso (ver también
../contable/). - Qué puede salir mal.
Preguntas frecuentes
Preguntas frecuentesRespuestas cortas a lo que más se pregunta, con el enlace a la explicación completa.
Mi cuenta
¿Cómo cambio mi contraseña? Desde tu perfil. Debe cumplir la política de tu empresa (longitud mínima y, si están activadas, mayúsculas, números o caracteres especiales).
Olvidé mi contraseña. ¿Cómo la recupero? Pide a quien administra el sistema en tu empresa que te la restablezca desde Seguridad → Usuarios.
¿Cómo activo la verificación en dos pasos? Perfil → Seguridad → Activar. Escanea el QR con tu app de autenticación y guarda los códigos de respaldo: se muestran una sola vez.
Perdí el teléfono con la app de autenticación. Usa un código de respaldo. Si no los tienes, un administrador debe desactivar tu MFA.
¿Puedo ver dónde tengo la sesión abierta? Sí. En tu perfil verás las sesiones activas con fecha, IP y vencimiento, y puedes cerrar cualquiera.
¿Por qué me dice «sesión revocada por seguridad»? El sistema detectó una credencial de sesión usada dos veces —la señal típica de un token robado— y cerró toda la cadena. Vuelve a iniciar sesión.
Usuarios y accesos
¿Puedo tener varios usuarios? Sí. El tope depende del plan contratado. Al alcanzarlo, el alta falla con un mensaje de límite.
¿Cómo agrego un usuario? Seguridad → Usuarios → Usuario, con correo y contraseña; o invítalo y define él mismo su contraseña con un enlace válido 7 días.
¿Por qué no puedo desactivar a un usuario? Si es el último administrador activo, el sistema lo impide. Crea otro administrador primero.
Un empleado se fue. ¿Lo borro? Desactívalo, no lo borres: eliminarlo pierde la trazabilidad de lo que registró.
¿Cada usuario necesita su propia cuenta? Sí. Con cuentas compartidas la auditoría deja de servir: no se sabe quién hizo qué.
Empresas y sucursales
¿Puedo tener varias sucursales? Sí. Se crean en Contabilidad → Configuración → Dimensiones → Sucursales y sirven para ver resultados por local dentro de una misma contabilidad.
¿Cuándo necesito otra empresa en vez de una sucursal? Cuando el local tiene su propio RNC y declara aparte.
¿Cómo agrego un nuevo almacén? Inventario → Almacén, con código y nombre. El almacén controla existencias; la sucursal es una dimensión contable.
Facturación
¿Cómo recupero una factura? Facturación → Factura → Buscar Factura, con filtros por fecha, cliente, número y estado. Nada se borra: los documentos anulados siguen visibles con su estado.
¿Por qué mi factura no tiene NCF? Porque está en borrador. El NCF se emite al postear, nunca al guardar.
¿Puedo modificar una factura ya emitida? No. Se corrige con una anulación o una nota de crédito. Reescribir un documento contabilizado rompería la auditoría.
¿Cómo anulo una factura? Ábrela y usa Anular (permiso cxc:delete). Revierte los asientos y repone el inventario; el NCF pasa al reporte 608 y no se reutiliza.
¿Puedo recuperar el NCF de una factura anulada? No. La DGII no lo permite.
Se me acabaron los NCF. Solicita un rango nuevo a la DGII y regístralo en Impuestos → Serie Fiscal. Para evitarlo, vigila Impuestos → Consulta NCF y sube el umbral de alerta.
Cobros y pagos
¿Cómo registro un pago? Cuentas por Cobrar → Recibo: cliente, fecha, monto, método y cuenta de banco o caja. Se aplica automáticamente por antigüedad o manualmente a las facturas que elijas.
Un cliente pagó de más. ¿Qué hago? El recibo queda abierto con saldo a favor, listo para aplicarse a facturas futuras. Si prefieres, regístralo como anticipo.
¿Cómo hago una devolución? Con una nota de crédito de clase devolución: repone el inventario y revierte el costo de venta al costo original de esa venta.
Inventario
¿Qué hago si no aparece un producto? Recorre esto en orden: empresa correcta → artículo activo → existencia en el almacén elegido → permiso inventory:read. La causa más común es el almacén.
¿Por qué mi costo de venta sale en cero? Porque la existencia inicial se cargó sin costo. Corrige la valuación en Inventario → Revalorización de Costos.
¿Puedo importar mis productos desde Excel? No hay importación CSV de artículos. Se cargan a mano o por API. Si son muchos, coordínalo con soporte.
Contabilidad
¿Qué significa «período cerrado»? Que ese mes ya no admite movimientos: no se puede postear ni anular nada con fecha dentro de él. Es lo que protege las cifras ya declaradas.
¿Puedo reabrir un período cerrado? Sí, con el permiso accounting:reopen-period. Hazlo solo con una razón clara: reabrir un mes declarado puede alterar cifras que ya presentaste.
¿Por qué una factura no contabiliza? Las causas reales, en orden: está en borrador; el período está cerrado; faltan cuentas contables en la empresa; o falta el almacén de despacho con productos inventariados.
¿Cómo cierro un período? Contabilidad → Períodos Contables, botón Cerrar del mes. Antes: revisa que no queden borradores pendientes y ejecuta la conciliación fiscal.
Reportes y exportación
¿Cómo exporto a Excel? Los estados financieros ofrecen CSV, EXCEL y PDF. Otros listados exportan CSV. El sistema no genera .xlsx nativo: la opción EXCEL produce un archivo que Excel abre sin problema.
Se ven mal las tildes al abrir el CSV. Ábrelo indicando codificación UTF-8 (en Excel: Datos → Obtener datos → Desde texto/CSV y elige UTF-8).
No veo el botón de exportar. Exportar requiere permiso propio (accounting:export, profit_loss:export…). Pídelo a quien administra el sistema.
Integraciones
¿Puedo conectar mi tienda en línea? Sí, con una API Key. Ten en cuenta que Compras, Cuentas por Pagar, Inventario y Contabilidad hoy no aceptan API Key, solo el motor de registros y los módulos listados en la documentación de API.
¿Puedo cobrar con tarjeta desde el ERP? No. No hay pasarela de pago integrada; la tarjeta se registra como método de pago, pero el cobro se procesa fuera.
¿El sistema se conecta con mi banco? No hay conexión automática. La conciliación bancaria se hace desde el módulo Banco.
Datos y respaldos
¿Mis datos están separados de los de otras empresas? Sí. Cada empresa cliente tiene su propia base de datos, no un filtro sobre una tabla compartida.
¿Puedo descargar una copia de mis datos? Seguridad → Copia de Seguridad → Exportar genera exportaciones descargables (permiso setting:create). Para condiciones de retención y respaldo del servicio, consulta tu contrato.
No encuentro mi respuesta
Revisa Solución de problemas en esta sección, o abre un ticket desde Configuración → Mesa de ayuda indicando: qué hacías, qué esperabas, qué pasó, el mensaje exacto y la hora.
FAQ — Preguntas frecuentesRespuestas cortas con enlace al detalle.
Respuestas cortas con enlace al detalle.
Operación diaria
¿Cómo creo una factura? Facturación → Factura → nueva; cliente + líneas + serie NCF; Postear. Ver ../guias-rapidas/crear-factura.md.
¿Cómo cobro una factura? CxC → Recibo; selecciona cliente y factura; indica caja/banco; Aplicar. Ver ../guias-rapidas/cobrar-factura.md.
¿Cómo anulo una factura? Abrir la factura → Anular/Void; el sistema reversa el asiento, el inventario y lleva el NCF al 608. Ver ../contable/reversas-y-anulaciones.md.
¿Cómo creo un cliente? CxC → Cliente → nuevo. Ver ../guias-rapidas/crear-cliente.md.
¿Cómo registro una compra? Compras → OC → Recepción → Factura/Matching. Ver ../guias-rapidas/registrar-compra.md.
¿Cómo pago a un proveedor? CxP → Pago; selecciona suplidor y facturas; indica banco; Aplicar. Ver ../guias-rapidas/pagar-proveedor.md.
¿Cómo creo un producto? Inventario → Ítem → nuevo. Ver ../guias-rapidas/crear-item.md.
¿Cómo ajusto inventario? Inventario → Movimiento (ajuste) o Conteo cíclico. Ver ../guias-rapidas/ajustar-inventario.md.
¿Cómo cierro caja (POS)? Terminal POS → cerrar sesión/arqueo. Atención Flujo detallado por verificar. Ver ../flujos/cierre-de-caja.md.
¿Cómo creo un activo fijo? Activos Fijos → Activo Fijo → nuevo. Ver ../guias-rapidas/crear-activo-fijo.md.
¿Cómo ejecuto la depreciación? Activos Fijos → Depreciación → Ejecutar. Ver ../guias-rapidas/depreciar-activo.md.
¿Cómo creo una caja chica? Caja Chica → Caja Chica → nuevo (monto + banco). Ver ../guias-rapidas/crear-caja-chica.md.
¿Cómo registro un desembolso? Caja Chica → Desembolso. Ver ../guias-rapidas/registrar-desembolso.md.
¿Cómo genero el 607? Impuestos → Reporte 607 → período. Ver ../flujos/ncf-607.md.
Apps
¿Cómo instalo una app? Catálogo de Apps → Instalar (o POST /t/:slug/apps/:code/install). Ver ../guias-rapidas/instalar-app.md.
¿Cómo desinstalo una app? Catálogo de Apps → Desinstalar. Ver ../guias-rapidas/desinstalar-app.md.
¿Por qué no aparece una app? No está instalada, o el menú depende de un override no recargado (reiniciar backend), o client.sidebar.hiddenCodes la oculta, o falta una dependencia (depends_on). Ver ../tecnico/menu-y-overrides.md.
Problemas frecuentes
¿Qué hago si no veo un módulo? Puede ser: (1) sin permiso en tu perfil, (2) app no instalada, (3) menú/override no recargado. Ver errores-comunes.md.
¿Qué significa "período cerrado"? El mes/período contable está cerrado y no acepta asientos nuevos. Usa un período abierto o pide reabrirlo. Ver ../contable/periodos-contables.md.
¿Por qué no puedo postear un asiento? Suele ser: descuadrado (débito ≠ crédito, R11), período cerrado, cuenta inexistente, o falta de permiso. Ver ../contable/asientos-contables.md.
¿Dónde veo los logs? journalctl --user -u utilara-erp-backend -f. Ver logs.md.
¿Cómo reinicio el backend? systemctl --user restart utilara-erp-backend. Ver comandos-utiles.md.
¿Cambié algo y no se ve? Backend no reiniciado (corre desde dist), o Service Worker cacheado. Prueba en Incógnito. Ver errores-comunes.md.
Solución de problemas
Soporte y Operación — UtilARA ERPPara quién: soporte técnico de primer/segundo nivel y operadores del sistema.
Para quién: soporte técnico de primer/segundo nivel y operadores del sistema.
Índice
| Documento | Tema |
|---|---|
| faq.md | Preguntas frecuentes (usuario y admin) |
| errores-comunes.md | Errores típicos y su causa/solución |
| recuperacion.md | Qué hacer cuando algo se rompe |
| como-diagnosticar.md | Método para diagnosticar un problema |
| logs.md | Dónde están los logs y cómo leerlos |
| comandos-utiles.md | Comandos de operación frecuentes |
| checklist-soporte.md | Checklist antes de escalar un caso |
Los 3 problemas más frecuentes (atajo)
- "No aparece un módulo / una app". Casi siempre es el menú (override en DB no purgado, o app no instalada, o backend no reiniciado). Ver
errores-comunes.mdy../tecnico/menu-y-overrides.md. - "Cambié algo y no se ve". Backend no reiniciado desde
dist, o Service Worker sirviendo caché vieja. Vererrores-comunes.md. - "No puedo postear un asiento / factura". Período cerrado, permiso faltante, o asiento descuadrado. Ver
faq.md.
¿Por qué una factura no contabiliza?Las cinco causas reales, en el orden en que hay que revisarlas.
Revísalas en este orden. Las dos primeras explican la mayoría de los casos.
1. La factura está en borrador
La causa más común. Guardar no es contabilizar.
| Acción | Qué hace |
|---|---|
| Guardar | Crea el borrador. Sin NCF, sin asiento, sin descontar inventario |
| Postear | Emite el NCF, descuenta inventario, genera el costo y contabiliza |
Cómo saberlo: el campo Estatus de la factura. Si dice Borrador, ahí está el problema.
Solución: ábrela y pulsa Postear.
2. El período contable está cerrado
Si la fecha de la factura cae en un mes cerrado, el posteo se rechaza.
Cómo saberlo: el mensaje de error menciona el período. Verifica en Contabilidad → Períodos Contables.
Solución:
- Si el mes no se ha declarado: reabre el período (
accounting:reopen-period) y postea. - Si el mes ya se declaró: cambia la fecha de la factura al período abierto, o emítela
con fecha actual. Consulta con tu contador.
3. Faltan cuentas contables en la empresa
El asiento necesita saber contra qué cuentas registrar. Si falta alguna, el posteo falla.
Cómo saberlo: Seguridad → Configuración → Configurar Contabilidad.
Deben estar asignadas:
| Cuenta | Para qué |
|---|---|
| Cuentas por Cobrar | El débito de la venta a crédito |
| Ingresos por Ventas | El crédito del ingreso |
| ITBIS por Pagar | El impuesto |
| Caja / Banco | El débito de la venta de contado |
| Inventarios | El crédito del costo (si vendes productos) |
| Costo de Ventas | El débito del costo |
Solución: asígnalas y vuelve a postear.
Esto pasa a menudo después de importar un plan de cuentas nuevo: las cuentas anteriores ya no existen y hay que reasignarlas.
4. Falta el almacén de despacho
Si la factura tiene artículos inventariados y no eligiste almacén, la pantalla marca Requerido: hay productos inventariados y no deja postear.
Solución: elige el Almacén de despacho en el encabezado.
5. No hay comprobante fiscal disponible
Si elegiste un tipo de NCF y su secuencia está agotada, vencida o inactiva, no se puede emitir.
Cómo saberlo: Impuestos → Consulta NCF muestra el consumo y la disponibilidad.
Solución: registra un rango nuevo en Impuestos → Serie Fiscal, o emite sin comprobante fiscal si el caso lo permite.
Otras causas menos frecuentes
| Causa | Señal | Solución |
|---|---|---|
| Límite de crédito del cliente superado | El error menciona el crédito | Cobra antes, sube el límite o factura de contado |
| Existencia insuficiente | El error menciona el stock | Verifica la existencia del almacén |
| Permisos | Error 403 o el botón no aparece | Necesitas cxc:create |
| Cliente bloqueado comercialmente | El error menciona el bloqueo | Revisa la ficha del cliente |
Cómo confirmar que sí contabilizó
- El Estatus de la factura ya no es Borrador.
- Tiene NCF asignado (si eligió tipo de comprobante).
Contabilidad → Diariomuestra el asiento con el número de la factura, cuadrado.Inventario → Existencia en Almacénrefleja la salida.Cuentas por Cobrar → Reporte CxCmuestra el saldo del cliente.
Si nada de esto aplica
Abre un ticket con:
- El número de la factura.
- El mensaje de error exacto.
- La hora del intento.
- Qué estabas haciendo.
El mensaje exacto es lo que permite localizarlo; sin él, el diagnóstico es adivinar.
¿Qué hacer si no aparece un producto?Seis causas, de la más frecuente a la más rara, con cómo comprobar cada una.
Recórrelas en este orden.
1. Estás en otra empresa
El catálogo pertenece a una empresa. Un artículo creado en la empresa A no existe para la empresa B.
Comprueba: el selector de empresa de la pantalla. Solución: cámbiala, o crea el artículo también en la otra empresa.
2. El artículo está inactivo
Un artículo inactivo desaparece de todos los selectores, pero conserva su historial.
Comprueba: Inventario → Ítem, busca por código incluyendo inactivos. Solución: actívalo.
3. No hay existencia en el almacén elegido
En la factura, el desplegable de artículos y la columna Disp. responden al almacén de despacho seleccionado. Si el artículo tiene stock en la bodega central pero facturas desde la tienda, no aparecerá disponible.
Comprueba: Inventario → Existencia en Almacén, filtrando por artículo y almacén. Solución: cambia el almacén de despacho, o traslada mercancía (Inventario → Movimiento de Inventario → Traslado Almacén).
4. Nunca se cargó la existencia inicial
El artículo existe pero nadie le cargó cantidad.
Comprueba: en Existencia en Almacén el artículo sale con 0 o no sale. Solución: carga la existencia en Inventario → Revalorización de Costos, con cantidad y costo.
5. Te faltan permisos
Sin permiso de lectura, la pantalla se ve vacía en vez de dar error.
| Permiso | Qué habilita |
|---|---|
inventory:read | Ver artículos y existencias |
inventory:view-cost | Ver costos y valuación |
Señal típica: ves las cantidades pero no los costos → te falta inventory:view-cost.
6. Es un servicio, no un producto
Los servicios no llevan existencias: no aparecen en las consultas de stock, aunque sí en la factura.
Comprueba: el tipo del artículo en su ficha.
Comprobación rápida
1. ¿Empresa correcta? → selector de empresa
2. ¿Artículo activo? → Inventario → Ítem
3. ¿Existencia en ESE almacén? → Existencia en Almacén
4. ¿Se cargó la existencia inicial? → Revalorización de Costos
5. ¿Tengo inventory:read / view-cost? → Seguridad → Perfiles
6. ¿Es un servicio? → ficha del artículo
Casos relacionados
| Síntoma | Causa | Solución |
|---|---|---|
| Aparece pero con Disp. 0 | Sin stock en ese almacén | Traslada o recibe mercancía |
| Aparece con costo 0 | Existencia cargada sin costo | Corrige la valuación |
| No sale en el buscador global (Ctrl+K) | La búsqueda global no cubre el catálogo del ERP | Usa el buscador de Inventario → Ítem |
| Sale en inventario pero no en la factura | Está inactivo o no es de inventario | Revisa estado y tipo |
Si aun así no aparece
Abre un ticket con el código exacto del artículo, la empresa, el almacén y la pantalla donde lo esperabas.
¿Qué significa «período cerrado»?Qué significa, por qué existe y qué hacer cuando te bloquea una operación.
Qué es
Un período contable es un mes del ejercicio. Cuando está cerrado, ese mes ya no admite movimientos: la contabilidad de ese mes queda fija.
Por qué existe
Porque una vez que declaraste un mes a la DGII y entregaste estados financieros, las cifras de ese mes no pueden cambiar. Si cualquiera pudiera postear una factura con fecha de dos meses atrás, tu declaración dejaría de coincidir con tu contabilidad — y esa diferencia la ve la DGII.
Cerrar el período es lo que convierte una cifra en una cifra confiable.
Qué puedes y qué no
| Puedes | No puedes |
|---|---|
| Consultar todo lo del período | Postear un documento con fecha en ese período |
| Ver e imprimir documentos | Anular un documento de ese período |
| Generar reportes y exportar | Aplicar cobros o pagos con esa fecha |
| Registrar documentos con fecha del período abierto | Registrar asientos manuales en el período cerrado |
Nada se pierde ni se oculta. Lo cerrado se consulta con total normalidad.
Estados de un período
| Estado | Significa |
|---|---|
| Abierto | Admite movimientos |
| Cerrado | No admite movimientos. Reversible con permiso |
| Bloqueado | Cierre definitivo |
Me bloqueó una operación. ¿Qué hago?
Opción A — Usar la fecha del período abierto (lo normal)
Si el mes cerrado ya se declaró, no lo reabras. Registra la corrección con fecha del período abierto:
| Necesito | Documento |
|---|---|
| Anular una venta de un mes cerrado | Nota de crédito con fecha actual |
| Corregir un monto | Nota de crédito o nota de débito con fecha actual |
| Corregir una clasificación contable | Asiento de ajuste con fecha actual |
Es la práctica contable correcta: los errores del pasado se corrigen en el presente, dejando rastro.
Opción B — Reabrir el período
Solo si el mes no se ha declarado todavía y el error es reciente.
- Necesitas el permiso
accounting:reopen-period. Contabilidad → Períodos Contables→ Reabrir.- Corrige.
- Vuelve a cerrarlo.
Si reabres un mes ya declarado, tus reportes fiscales dejarán de coincidir con lo presentado. Consúltalo con tu contador antes, no después.
Mensajes que verás
| Mensaje | Significa |
|---|---|
| No se puede postear en período cerrado | La fecha del documento cae en un mes cerrado |
| Período contable cerrado | Igual, en otra operación |
| No aparece el botón Reabrir | Te falta accounting:reopen-period |
Quién debería poder cerrar y reabrir
| Permiso | Quién |
|---|---|
accounting:close-period | Contabilidad / responsable financiero |
accounting:reopen-period | Solo el responsable financiero, idealmente una persona |
Reabrir un período es una acción de alto impacto: no debería estar en el perfil general.
Preguntas frecuentes
¿Pierdo información al cerrar? No. Solo se impiden nuevos movimientos con esa fecha.
¿Puedo cerrar un mes y dejar abierto el anterior? Sí, técnicamente. No es buena práctica: cierra en orden.
¿Y el cierre anual? Es distinto: cierra el ejercicio completo y traslada el resultado al patrimonio. Se ejecuta después de cerrar los doce meses.
¿Cuándo cierro? Cuando el mes está conciliado y declarado. Si tardas, alguien acabará registrando algo con fecha vieja.
Errores comunes1. ¿Reinicié el backend? (código y menú/override)
| Síntoma | Causa probable | Solución |
|---|---|---|
| No aparece un módulo/app | Sin permiso, app no instalada, override no recargado, hiddenCodes | Revisar perfil, instalar app, reiniciar backend, revisar client.sidebar.hiddenCodes |
| Cambié el menú y no cambia | Overrides se cargan en el boot; 4 fuentes de verdad | Editar la fuente correcta y reiniciar backend; purgar override si aplica (../tecnico/menu-y-overrides.md) |
| Cambié código y no se ve | Backend corre desde dist, sin hot-reload | Rebuild + systemctl --user restart utilara-erp-backend |
| Frontend con versión vieja | Service Worker cacheado (sobre todo por túnel) | Incógnito, hard-reload, o kill-switch del SW (../tecnico/frontend.md) |
| 403 al operar | Sin permiso (RBAC) o app no instalada | Asignar permiso al perfil / instalar app |
| 401 | JWT ausente/expirado | Volver a iniciar sesión |
| "Período cerrado" | La fecha cae en período cerrado | Usar período abierto o reabrir (../contable/periodos-contables.md) |
| "Asiento no balanceado" | Débito ≠ crédito (R11) | Corregir las líneas |
| "No hay NCF disponible" | Serie agotada/vencida | Configurar/renovar serie (../administrativo/ncf-dgii.md) |
| "Stock insuficiente" | Sin existencia del ítem | Reponer inventario |
| Backend no levanta | Falta dist/backend/src/main.js (build mal ubicado) → crash-loop | Rebuild correcto; ver journalctl (../tecnico/despliegue.md) |
| 409 al aplicar pago/anticipo | Concurrencia / doble aplicación | Reintentar; revisar si ya se aplicó |
| Build falla con OOM | nest build sin heap ampliado | Usar el script (NODE_OPTIONS=--max-old-space-size=6144) |
| Módulo caja chica no responde | CombinedAuthGuard mal usado / permisos en una sola copia | No usar guard combinado en el módulo; editar .ts y .mjs |
Regla mental para "no se ve el cambio"
- ¿Reinicié el backend? (código y menú/override)
- ¿Estoy en Incógnito? (Service Worker)
- ¿Edité la fuente correcta? (4 fuentes del menú)
Ver como-diagnosticar.md.
Cómo diagnosticar un problemaMétodo paso a paso para soporte.
Método paso a paso para soporte.
1. Delimita el problema
- ¿Es de un usuario, una empresa (tenant) o todos?
- ¿Es de frontend (pantalla) o backend (datos/API)?
- ¿Cuándo empezó? ¿Coincide con un despliegue?
2. Reproduce
- Reproduce en Incógnito (descarta Service Worker).
- Anota la ruta (URL) y la acción exacta.
3. Revisa la capa correcta
| Si el problema es… | Revisa |
|---|---|
| No carga la página | nginx, build del frontend, consola del navegador |
| Error 401/403 | Sesión (JWT), permisos del perfil, app instalada |
| Error 500 / datos raros | Logs del backend (journalctl) |
| Menú incompleto | Overrides + reinicio del backend |
| Contabilidad no cuadra | Balanza, asientos del documento origen |
4. Mira los logs
journalctl --user -u utilara-erp-backend -f
Busca el error justo al reproducir. Ver logs.md.
5. Verifica el estado del sistema
curl -s -o /dev/null -w '%{http_code}\n' http://localhost:3000/health # 200?
systemctl --user status utilara-erp-backend
6. Verifica datos con la API
curl -H "Authorization: Bearer <jwt>" http://localhost:3000/t/<slug>/apps
Confirma apps instaladas, o consulta el recurso afectado directamente.
7. Aísla causa
- ¿Es permiso? Prueba con un usuario ADMIN.
- ¿Es app? Verifica instalación.
- ¿Es menú? Reinicia backend.
- ¿Es caché? Incógnito.
- ¿Es dato? Revisa el documento origen y su asiento.
8. Escala con evidencia
Si no resuelves, escala con: tenant, usuario, ruta, pasos, hora, y el fragmento de log. Ver checklist-soporte.md.
Recuperación (qué hacer cuando algo se rompe)1. systemctl --user status utilara-erp-backend.
El backend está caído
systemctl --user status utilara-erp-backend.- Revisar logs:
journalctl --user -u utilara-erp-backend -n 100. - Causa típica: falta
dist/backend/src/main.js(build mal ubicado) → rebuild correcto (cd backend && npm run build) ysystemctl --user restart utilara-erp-backend. - Confirmar
curl localhost:3000/health→ 200.
El sitio no carga (nginx)
sudo nginx -t(validar config).sudo systemctl reload nginx.- Verificar que
frontend/distexiste (rebuild del frontend si no). - Revisar el túnel Cloudflare si es acceso externo.
Un despliegue salió mal
- Revertir el commit:
git revert <sha>ogit reset --hard <sha_bueno>(con cuidado). - Re-desplegar:
./deploy/deploy.sh. - Si hubo migración destructiva, restaurar backup de la base afectada.
El menú quedó roto tras un cambio
- Confirmar qué fuente editaste (4 fuentes; gana
tenant_module_overrides). - Reiniciar el backend (los overrides se cargan en boot).
- Validar en Incógnito.
Ver ../tecnico/menu-y-overrides.md.
Datos incorrectos en un tenant
- No borrar asientos: usar reversas/anulaciones (
../contable/reversas-y-anulaciones.md). - Si es corrupción real, restaurar el backup de esa base de tenant.
Restaurar un backup
- Identificar la base correcta (control-plane o el tenant afectado).
- Restaurar el
.sql. - Reiniciar el backend (caché de overrides). Ver
../tecnico/backups.md.
Prevención
- Backup de DB antes de migraciones.
- Desplegar fuera de horario pico.
- Probar en Incógnito tras cada deploy.
Integraciones y API
API
API — Autenticación y API KeysCómo crear una API Key, autenticarte y qué permisos concede cada scope.
Estado: Listo. Creación y revocación de llaves, autenticación por Bearer y autorización por scopes, verificadas con pruebas de regresión.
Cómo funciona
Toda llamada va contra la dirección de tu empresa y lleva tu identificador de empresa en la ruta:
https://<host>/t/<tu-empresa>/<recurso>
Hay dos formas de autenticarse:
| Método | Para qué |
|---|---|
| JWT (el mismo del navegador) | Aplicaciones que actúan en nombre de un usuario |
API Key (uk_…) | Integraciones servidor a servidor, sin usuario |
Esta guía cubre las API Keys, que es lo que necesitas para conectar otro sistema.
Paso 1. Crear la API Key
Configuración → API Keys (/platform/api-keys)
Requiere el permiso apikey:create.
| Campo | Nota |
|---|---|
| Nombre | Para identificarla después (p. ej. Tienda en línea) |
| Scopes | Los permisos que concede. Elige el mínimo necesario |
| Expiración (días) | Opcional. Sin valor, la llave no vence |
También puedes crearla por API con un JWT de administrador:
curl -X POST https://<host>/t/<empresa>/api-keys \
-H "Authorization: Bearer <jwt-admin>" \
-H "Content-Type: application/json" \
-d '{"name":"Integración tienda","scopes":["record:read","record:write"],"expiresInDays":365}'
La llave se muestra UNA sola vez
La respuesta trae el campo key con el valor en claro:
{ "id": "...", "name": "Integración tienda", "keyPrefix": "uk_1a2b3c", "key": "uk_1a2b3c..." }
Guárdala en ese momento. El sistema almacena solo un hash SHA-256: no hay forma de volver a mostrarla. Si la pierdes, revócala y crea otra.
Después solo verás el prefijo (los primeros 10 caracteres), útil para identificarla en la lista.
Paso 2. Usarla
curl https://<host>/t/<empresa>/entity-definitions/<entityId>/records \
-H "Authorization: Bearer uk_1a2b3c..."
Usa siempre el prefijo Bearer . Es la convención soportada.
Scopes disponibles
Un scope tiene la forma recurso:nivel. Los niveles son:
| Nivel | Cubre |
|---|---|
read | Consultar / listar |
write | Crear y modificar |
delete | Eliminar |
| Dominio | Recurso | Niveles | Qué permite |
|---|---|---|---|
| Registros (motor genérico) | record | read · write · delete | Registros de cualquier entidad definida en tu empresa |
| Definiciones de entidad | entity | read · write · delete | Estructura (campos, scripts) de las entidades |
| Webhooks salientes | webhook | read · write · delete | Suscripciones de webhooks |
| Automatizaciones | automation | read · write · delete | Reglas, conectores y registro de eventos |
| Ventas | sales | read · write · delete | Órdenes de venta, cotizaciones y precios |
| Cuentas por cobrar | cxc | write | Aplicar pagos y crear documentos de CxC |
| Punto de venta | pos | read · write | Tiendas, sesiones y ventas de POS |
| Comprobantes fiscales | ncf | read · write | Secuencias y emisión/anulación de comprobantes |
| Comisiones | commissions | read · write | Esquemas, devengos y pagos |
| Presupuestos | budget | read · write | Presupuestos y su ejecución |
El comodín * concede todo. No lo uses salvo en una integración interna controlada.
Scopes sensibles
Estos dan acceso amplio o irreversible; el panel los resalta antes de crear la llave:
record:delete · entity:write · entity:delete · automation:write · sales:delete · cxc:write · pos:write · ncf:write · commissions:write · budget:write
Plantillas
| Plantilla | Contenido |
|---|---|
| Solo lectura | Todos los scopes de nivel read |
| Integración comercial | record:read, record:write, sales:read, sales:write, cxc:write, pos:read, pos:write, ncf:read — lo típico de un e-commerce o POS externo |
Revocar
Desde el mismo panel, o:
curl -X DELETE https://<host>/t/<empresa>/api-keys/<id> \
-H "Authorization: Bearer <jwt-admin>"
La revocación es inmediata y no se puede deshacer: la llave queda inactiva para siempre. Requiere apikey:delete.
Buenas prácticas
- Una llave por integración. Si hay que revocar, no tumbas todo lo demás.
- Scopes mínimos. Si tu tienda solo consulta stock,
record:readbasta. - Pon expiración. 365 días obliga a una rotación anual.
- Nunca la pongas en el navegador ni en una app móvil. Cualquiera puede leerla ahí.
Las API Keys son para servidor a servidor.
- Revísalas cada cierto tiempo. La lista muestra el último uso: una llave sin uso
en meses es candidata a revocarse.
Aislamiento
Una API Key pertenece a una sola empresa (tenant) y solo alcanza sus datos. No existe forma de que una llave de una empresa lea datos de otra.
Errores más comunes
| Código | Qué pasó | Solución |
|---|---|---|
401 | Falta el header, o la llave es inválida, está revocada o venció | Revisa el header Authorization: Bearer uk_… |
403 | La llave autenticó pero no tiene el scope requerido | Crea una llave nueva con el scope correcto (los scopes no se editan) |
404 | El identificador de empresa en la ruta no existe | Revisa /t/<empresa>/ |
429 | Superaste el límite de peticiones | Ver API — errores y límites |
API — Endpoints, errores y límitesEndpoints, formato de las peticiones y respuestas, códigos de error, límites y ejemplos ejecutables.
Estado: Operativo. Los endpoints y comportamientos descritos aquí están verificados contra el código. Donde algo no existe, se dice.
Convenciones
| Aspecto | Valor |
|---|---|
| Base | https://<host>/t/<tu-empresa> |
| Formato | JSON (Content-Type: application/json) |
| Autenticación | `Authorization: Bearer <jwt \ |
| Fechas | ISO 8601 (2026-08-09 o 2026-08-09T14:30:00.000Z) |
| Montos | Números decimales, sin separador de miles |
<tu-empresa> es el identificador de tu empresa (el mismo que aparece en tu dirección de acceso).
La API de registros
Es la API que las API Keys cubren de forma completa. Trabaja sobre entidades definidas en tu sistema.
Listar registros
GET /t/<empresa>/entity-definitions/<entityId>/records
| Parámetro | Por defecto | Nota |
|---|---|---|
page | 1 | Página |
limit | 20 | Máximo 200 — valores mayores se recortan |
search | — | Búsqueda de texto |
sortField / sortOrder | — | Ordenamiento |
filterField / filterValue | — | Filtro simple |
filters | — | Filtros múltiples en JSON |
deleted | false | true incluye eliminados |
curl "https://<host>/t/<empresa>/entity-definitions/<entityId>/records?limit=50&search=santo" \
-H "Authorization: Bearer uk_..."
Obtener uno
GET /t/<empresa>/entity-definitions/<entityId>/records/<recordId>
Crear
curl -X POST https://<host>/t/<empresa>/entity-definitions/<entityId>/records \
-H "Authorization: Bearer uk_..." \
-H "Content-Type: application/json" \
-d '{"name":"Registro de prueba","data":{"campo1":"valor","monto":1500.50}}'
Al crear, el sistema valida los campos contra la definición de la entidad, aplica los campos calculados, cifra los campos marcados como sensibles, guarda el historial y dispara los webhooks y las automatizaciones configuradas.
Actualizar
PATCH /t/<empresa>/entity-definitions/<entityId>/records/<recordId>
Eliminar
DELETE /t/<empresa>/entity-definitions/<entityId>/records/<recordId>
Otras operaciones disponibles
| Operación | Endpoint |
|---|---|
| Historial de cambios | GET …/records/<recordId>/history |
| Comentarios | GET / POST …/records/<recordId>/comments |
| Enviar a flujo de aprobación | POST …/records/<recordId>/submit |
| Cancelar | POST …/records/<recordId>/cancel |
| Transiciones de estado disponibles | GET …/records/<recordId>/transitions |
| Ejecutar una transición | POST …/records/<recordId>/transition |
Otros módulos accesibles con API Key
Estos aceptan API Key si la llave tiene el scope correspondiente:
| Módulo | Base | Scope |
|---|---|---|
| Ventas | /t/<empresa>/sales | sales:read · sales:write · sales:delete |
| Cotizaciones | /t/<empresa>/quotes | sales:* |
| Punto de venta | /t/<empresa>/pos/{stores,sessions,sales} | pos:read · pos:write |
| Comprobantes fiscales | /t/<empresa>/ncf | ncf:read · ncf:write |
| Comisiones | /t/<empresa>/commissions/* | commissions:read · commissions:write |
| Presupuestos | /t/<empresa>/budgets | budget:read · budget:write |
| Webhooks | /t/<empresa>/webhooks | webhook:* |
| Automatizaciones y conectores | /t/<empresa>/{automations,connectors,event-store} | automation:* |
| Aplicar cobros | /t/<empresa>/cxc/... | cxc:write |
Importante: los módulos de Compras, Cuentas por Pagar, Inventario y Contabilidad hoy aceptan solo JWT, no API Key. Una llave con un scope inventado para ellos no funcionará. Si necesitas integrarlos, hay que exponerlos primero — no es una limitación de permisos, es que el endpoint no acepta ese método de autenticación.
Códigos de respuesta
| Código | Significado | Qué hacer |
|---|---|---|
200 / 201 | Correcto | — |
400 | Petición inválida: falta un campo, formato incorrecto, regla de negocio incumplida | Lee el campo message: describe el problema concreto |
401 | No autenticado: falta el header, llave inválida, revocada o vencida | Revisa Authorization |
403 | Autenticado pero sin permiso o sin el scope | Revisa los scopes de la llave |
404 | No existe el recurso, o pertenece a otra empresa | Revisa el identificador y la empresa |
429 | Demasiadas peticiones | Espera y reintenta |
500 | Error del servidor | Reintenta; si persiste, abre un ticket con la hora exacta |
Formato del error
{
"statusCode": 400,
"message": "Scope(s) inválido(s): ventas:leer",
"error": "Bad Request"
}
El campo message está en español y describe el problema real. Regístralo en tus logs: es lo primero que pedirá soporte.
Límite de peticiones
| Límite | Valor |
|---|---|
| Peticiones por minuto | 120 |
| Ventana | 60 segundos |
| Alcance | Por dirección IP, no por API Key |
Al superarlo recibirás 429. Como el límite es por IP, varias integraciones detrás de la misma IP comparten el cupo. No existe todavía un límite por llave. Si necesitas más caudal, espacia las llamadas o usa paginación en vez de muchas peticiones pequeñas.
Algunos endpoints tienen límites propios más estrictos; por ejemplo, invitar usuarios está limitado a 20 por hora.
Buenas prácticas de integración
- Paginar siempre.
limit=200es el tope; no pidas todo de golpe. - Reintentar con espera creciente ante
429y500— nunca en bucle inmediato. - No reintentar ante
400,401,403y404: reintentar no arregla el problema. - Guardar el
idque devuelve el sistema y usarlo como referencia, en vez de buscar por
nombre en cada llamada.
- Probar primero con una llave de solo lectura antes de dar permisos de escritura.
Documentación técnica completa
El servidor expone la especificación interactiva de toda la API en:
https://<host>/api-docs
Cubre la API completa (JWT y API Key), incluidos endpoints internos. No es un contrato curado para terceros: úsala como referencia de exploración, no como garantía de estabilidad. Los endpoints descritos en este artículo sí son los soportados para integración.
Ejemplo completo
HOST="https://erp.ejemplo.com"
EMPRESA="miempresa"
KEY="uk_xxxxxxxxxxxxxxxxxxxx"
# 1. Listar las entidades disponibles
curl -s "$HOST/t/$EMPRESA/entity-definitions" \
-H "Authorization: Bearer $KEY"
# 2. Listar registros de una entidad, paginando
curl -s "$HOST/t/$EMPRESA/entity-definitions/ENTITY_ID/records?page=1&limit=200" \
-H "Authorization: Bearer $KEY"
# 3. Crear un registro
curl -s -X POST "$HOST/t/$EMPRESA/entity-definitions/ENTITY_ID/records" \
-H "Authorization: Bearer $KEY" \
-H "Content-Type: application/json" \
-d '{"name":"Pedido web 1042","data":{"total":2500,"estado":"nuevo"}}'Webhooks
WebhooksRecibe avisos en tu sistema cuando algo pasa en el ERP, con firma HMAC y registro de entregas.
Estado: Listo. Entrega firmada con HMAC-SHA256, protección contra SSRF, fijado de IP y registro de las últimas 50 entregas por webhook.
Un webhook es una URL tuya que el ERP llama cuando ocurre un evento. Sirve para no tener que consultar la API cada pocos minutos: el ERP te avisa.
Configurar
Configuración → Webhooks (/platform/webhooks)
| Campo | Obligatorio | Nota |
|---|---|---|
| Nombre | Sí | Para identificarlo |
| URL | Sí | Tu endpoint. Debe ser HTTPS en el puerto 443 |
| Eventos | Sí | Lista de eventos, o * para todos |
| Entidad | No | Limita el webhook a una entidad concreta. Vacío = todas |
| Secreto | Recomendado | Con él se firma cada entrega |
Permisos: webhook:read, webhook:create, webhook:update, webhook:delete.
Eventos disponibles
| Evento | Cuándo se dispara |
|---|---|
record.created | Se crea un registro |
record.updated | Se modifica un registro |
record.deleted | Se elimina un registro |
record.submitted | Un registro se envía a aprobación |
record.cancelled | Un registro se cancela |
* | Todos los anteriores |
Alcance real: hoy los webhooks se disparan desde el motor de registros (entidades). Los documentos del núcleo — facturas, cobros, órdenes de compra — no emiten webhooks todavía. Si necesitas enterarte de una factura nueva, consulta la API por ahora.
Formato de la llamada
POST https://tu-servidor.com/webhooks/utilara
Content-Type: application/json
User-Agent: UtilARA-Webhooks/1.0
X-Utilara-Signature: sha256=<firma>
{
"event": "record.created",
"data": { "id": "...", "name": "Pedido web 1042", "data": { } },
"ts": "2026-08-09T14:30:00.000Z"
}
Verificar la firma — hazlo siempre
Si configuraste un secreto, cada entrega lleva X-Utilara-Signature con el HMAC-SHA256 del cuerpo exacto de la petición.
const crypto = require('crypto');
function firmaValida(cuerpoCrudo, cabecera, secreto) {
const esperada = 'sha256=' + crypto.createHmac('sha256', secreto)
.update(cuerpoCrudo).digest('hex');
const a = Buffer.from(cabecera ?? '');
const b = Buffer.from(esperada);
return a.length === b.length && crypto.timingSafeEqual(a, b);
}
Firma el cuerpo crudo, antes de convertirlo a objeto. Si lo vuelves a serializar, el resultado no coincidirá.
Reglas de seguridad que aplica el ERP
Están para que un webhook no se convierta en una puerta hacia la red interna:
| Regla | Motivo |
|---|---|
| Solo HTTPS, puerto 443 | Sin tráfico en claro |
Sin credenciales en la URL (https://user:pass@…) | Quedarían guardadas |
No se permite localhost ni hosts que resuelvan a IP privada, loopback, link-local o metadatos de nube | Evita alcanzar servicios internos |
| Fijado de IP: se conecta a la IP ya validada, sin volver a resolver el DNS | Evita el cambio de DNS entre la validación y la conexión |
No se siguen redirecciones: un 3xx cuenta como entrega fallida y no se reintenta | Un receptor de webhooks no debe redirigir |
| Tiempo máximo de espera: 10 segundos | Un receptor lento no bloquea el sistema |
Si al guardar ves "Webhook no permitido: el host resuelve a una IP privada/local", tu URL apunta a una dirección interna: publica el receptor en Internet.
Qué se considera entrega correcta
| Respuesta de tu servidor | Resultado |
|---|---|
2xx | Éxito |
3xx | Fallo, no reintentable |
4xx (salvo 429) | Fallo, no reintentable |
429 o 5xx | Fallo reintentable |
| Tiempo agotado o error de red | Fallo reintentable |
Responde 200 rápido. Encola el trabajo pesado en tu lado en vez de procesarlo dentro de la petición: si tardas más de 10 segundos, la entrega se marca fallida aunque hayas recibido el dato.
Ver el historial de entregas
Cada webhook guarda sus últimas 50 entregas con evento, contenido enviado, código de respuesta y si tuvo éxito. Es lo primero que hay que mirar cuando "no llega nada".
Diagnóstico
| Síntoma | Causa probable | Solución |
|---|---|---|
| No llega ninguna entrega | El webhook está inactivo, o el evento no coincide | Revisa Eventos y el filtro de Entidad |
| Todas las entregas fallan con error de URL | HTTPS, puerto o IP privada | Revisa las reglas de seguridad de arriba |
Entregas con 3xx | Tu servidor redirige (típico: de http a https, o de /ruta a /ruta/) | Apunta el webhook a la URL final exacta |
| Llegan pero la firma no coincide | Estás firmando el cuerpo ya reconstruido | Firma el cuerpo crudo |
| Llegan duplicadas | Tu servidor tardó y el evento se emitió otra vez | Haz tu receptor idempotente usando el id del registro |
Alternativa: conectores
Los webhooks son salientes desde el ERP. Si lo que necesitas es lo contrario — que el ERP llame a una API externa — usa Conectores REST.
Integraciones
CorreoEnvío de facturas en PDF por correo, plantillas reutilizables e historial de envíos.
Estado: Listo para el envío de comprobantes y plantillas. La configuración del servidor de correo la realiza el proveedor del servicio, no el usuario final.
Qué puedes hacer
| Acción | Dónde |
|---|---|
| Enviar una factura en PDF al cliente | Facturación → Factura, botón Enviar |
| Ver el historial de envíos y reintentar | En la misma factura |
| Crear plantillas de correo reutilizables | Configuración → Plantillas de correo (/platform/email-templates) |
| Personalizar el asunto y el cuerpo del correo de factura | Seguridad → Configuración → Configurar Compañía |
Permisos: email:read, email:create, email:update, email:delete.
Enviar una factura
- Abre la factura (debe estar guardada).
- Pulsa Enviar.
- El sistema genera el PDF, lo adjunta y lo manda al correo del cliente.
Queda registrado el envío: destinatario, fecha y resultado. Si falló, puedes reintentar desde la misma pantalla.
Si el cliente no tiene correo en su ficha, el botón no podrá enviar. Complétalo en Cuentas por Cobrar → Cliente.
Personalizar el correo de factura
En Configurar Compañía:
| Campo | Qué hace |
|---|---|
| Asunto del correo | Plantilla del asunto |
| Cuerpo del correo | Plantilla del mensaje |
Ambos admiten variables entre llaves dobles, que se sustituyen con los datos reales de la factura y del cliente. Si los dejas vacíos, se usa el texto por defecto del sistema.
Plantillas de correo
Configuración → Plantillas de correo (/platform/email-templates)
| Campo | Nota |
|---|---|
| Nombre | Identificador de la plantilla |
| Asunto | Admite variables |
| Cuerpo | HTML, admite variables |
Se usan desde las automatizaciones y desde el envío por API, pasando la plantilla y las variables a sustituir.
Configuración del servidor de correo
El envío usa un servidor SMTP. La configuración (servidor, puerto, usuario, contraseña y remitente) es de la plataforma, no de cada empresa: la realiza quien administra el servicio.
| Aspecto | Detalle |
|---|---|
| Puerto habitual | 587 (STARTTLS) o 465 (TLS directo) |
| Remitente | Se define en la configuración; es la dirección que verá tu cliente |
Si los correos no llegan, el problema casi nunca está en el ERP: revisa la carpeta de spam del destinatario y, sobre todo, que el dominio del remitente tenga configurados SPF, DKIM y DMARC. Sin eso, Gmail y Outlook rechazan o marcan como spam los correos automáticos.
Diagnóstico
| Síntoma | Causa probable | Qué hacer |
|---|---|---|
| El botón Enviar no hace nada | El cliente no tiene correo | Complétalo en su ficha |
| El envío queda en error | Servidor de correo no configurado o credenciales vencidas | Contacta a soporte con la hora exacta del intento |
| El correo llega pero sin PDF | La factura no está en un estado que permita generar el comprobante | Verifica que esté guardada y posteada |
| El cliente dice que no le llegó | Filtro de spam o dominio sin autenticar | Revisa el historial de envíos: si marca éxito, el correo salió |
WhatsAppConecta tu número de WhatsApp Business y envía mensajes o plantillas desde el ERP.
Estado: Listo. Envío de mensajes de texto y de plantillas contra la WhatsApp Cloud API de Meta, con la configuración guardada por empresa.
Qué necesitas antes
Esto no se obtiene dentro del ERP: es tuyo y lo gestionas en Meta.
| Requisito | Dónde se obtiene |
|---|---|
| Cuenta de WhatsApp Business verificada | Meta Business Manager |
| Phone Number ID | Meta — API de WhatsApp, tu número |
| Access Token | Meta — token de acceso de la app |
| Business Account ID | Meta — necesario para listar tus plantillas |
Sin cuenta de WhatsApp Business aprobada por Meta, esta integración no puede funcionar. El ERP no crea cuentas de WhatsApp.
Configurar
Necesitas el permiso whatsapp:update.
| Campo | Obligatorio |
|---|---|
| Phone Number ID | Sí |
| Access Token | Sí |
| Business Account ID | Solo si quieres listar plantillas |
Una vez guardado, la configuración muestra el estado Configurado. El Access Token no se vuelve a mostrar.
Enviar mensajes
Permiso: whatsapp:create.
Mensaje de texto
Solo funciona dentro de la ventana de 24 horas desde el último mensaje del cliente. Es una regla de Meta, no del ERP.
Mensaje con plantilla
Fuera de esa ventana, hay que usar una plantilla aprobada por Meta. Se indican:
| Dato | Nota |
|---|---|
| Nombre de la plantilla | Debe existir y estar aprobada en tu cuenta |
| Idioma | Por defecto es |
| Componentes | Los valores que rellenan las variables de la plantilla |
Las plantillas se crean y aprueban en Meta, no en el ERP. Desde el ERP puedes listarlas para elegir la correcta.
Formato del destinatario
El número se limpia automáticamente: se le quitan espacios, guiones y paréntesis. Incluye el código de país (por ejemplo 18095550100). Sin código de país, Meta rechaza el envío.
Errores frecuentes
| Mensaje | Causa | Solución |
|---|---|---|
| WhatsApp no configurado | Falta el Phone Number ID o el Access Token | Complétalos en la configuración |
| Destinatario requerido | No se indicó el número | Revisa que el contacto tenga teléfono |
| Texto requerido | Mensaje de texto sin contenido | Escribe el mensaje |
| Error de Meta al enviar texto | Pasaron más de 24 horas desde el último mensaje del cliente | Usa una plantilla aprobada |
| Error de token | El Access Token venció o fue revocado en Meta | Genera uno nuevo y vuelve a guardarlo |
| La plantilla no aparece | Falta el Business Account ID, o la plantilla no está aprobada | Completa el ID y revisa el estado en Meta |
Qué no hace
| Expectativa | Realidad |
|---|---|
| Recibir mensajes de clientes dentro del ERP (bandeja de entrada) | No. El envío es en un solo sentido |
| Envío masivo a listas | No hay campañas masivas por WhatsApp en el núcleo del ERP |
| Crear plantillas desde el ERP | No. Se crean y aprueban en Meta |
Costos
Meta cobra por conversación según su tarifa. El ERP no añade ningún costo, pero tampoco controla el tuyo: revisa tu consumo en Meta Business Manager.
e-CF / DGII (facturación electrónica)---
section: integraciones-api subsection: integraciones order: 30 visibility: WEB status: PUBLISHED category: Integraciones tags: [ecf, dgii, factura-electronica, certificado] excerpt: Facturación electrónica contra la API real de la DGII: ambientes, certificado digital y ciclo de envío.
e-CF / DGII (facturación electrónica)
Estado: Implementado y verificado contra la API real de la DGII (rutas y esquemas confirmados contra el OpenAPI publicado por la DGII). Requiere tu certificado digital y tu proceso de certificación con la DGII: que el sistema esté listo no significa que tu empresa esté autorizada a emitir.
Qué es
El e-CF (comprobante fiscal electrónico) sustituye al comprobante impreso: se genera en XML, se firma digitalmente y se envía a la DGII, que responde con un número de rastreo y después con el estado final.
Antes de empezar necesitas
| Requisito | De dónde sale |
|---|---|
| Certificado digital de tu empresa (archivo y su clave) | Entidad certificadora autorizada en República Dominicana |
| Autorización de la DGII para emitir e-CF | Proceso de certificación con la DGII |
Secuencias e-CF (E31, E32, …) | Impuestos → Serie Fiscal |
| RNC de la empresa configurado | Configurar Compañía |
Ambientes
| Ambiente | Para qué |
|---|---|
| TesteCF (pruebas) | Desarrollo y pruebas. Empieza aquí siempre |
| CerteCF (certificación) | Las pruebas formales que exige la DGII |
| eCF (producción) | Emisión real |
El sistema construye las direcciones de la DGII a partir del ambiente elegido: no hay que teclear URLs.
Configurar
Permiso: ncf:update.
| Campo | Nota |
|---|---|
| Ambiente | test, cert o production |
| Ruta del certificado | Ubicación del archivo del certificado |
| Clave del certificado | No se vuelve a mostrar después de guardarla |
Después de guardar, usa Probar certificado: valida que el archivo se abre con esa clave y que sirve para firmar. Hazlo antes de intentar cualquier envío — es el fallo más común.
Ciclo de un e-CF
| Paso | Qué hace | Endpoint |
|---|---|---|
| 1. Generar | Construye el XML del comprobante y asigna el e-NCF | POST /ecf/generate |
| 2. Firmar | Firma el XML con tu certificado | POST /ecf/<id>/sign |
| 3. Enviar | Autentica con la DGII y envía el comprobante | POST /ecf/<id>/submit |
| 4. Consultar estado | Pregunta a la DGII el resultado | GET /ecf/<id>/status |
| Ver el XML | Descarga el XML generado | GET /ecf/<id>/xml |
Cómo autentica el sistema con la DGII
La DGII no acepta un envío directo. El sistema hace el intercambio que exige:
- Pide una semilla a la DGII.
- Firma la semilla con tu certificado.
- La devuelve y recibe un token temporal.
- Envía el comprobante con ese token y obtiene un número de rastreo (trackId).
- Consulta el estado con ese número.
Todo esto es automático; se describe aquí porque explica por qué un certificado mal configurado hace fallar el envío antes de que la DGII vea la factura.
Estados que devuelve la DGII
| Estado | Significa |
|---|---|
| Aceptado | El comprobante es válido |
| Aceptado Condicional | Válido, con observaciones — revísalas |
| En Proceso | Aún no hay resultado; vuelve a consultar |
| Rechazado | No es válido. La respuesta trae los mensajes con el motivo |
Notas de crédito y débito electrónicas
Los tipos que modifican otro comprobante (nota de crédito o débito electrónica) exigen indicar el comprobante que modifican. Si falta ese dato, el sistema rechaza la operación antes de consumir un número de secuencia, para no dejar huecos en tu numeración fiscal.
Recomendaciones
- Empieza en el ambiente de pruebas. Emite varios comprobantes de cada tipo antes de
pasar a certificación.
- Vigila el vencimiento del certificado. Cuando vence, todos los envíos fallan de golpe.
- Consulta el estado: un envío aceptado por recepción todavía puede ser rechazado en la
validación posterior.
- Guarda los XML. Son tu respaldo fiscal.
Relación con el NCF impreso
Mientras no emitas e-CF, sigues usando las secuencias B01, B02, etc. Los dos esquemas conviven: el tipo de comprobante elegido en la factura decide cuál se usa.
Preguntas frecuentes
¿El sistema me certifica ante la DGII? No. La certificación es un trámite tuyo con la DGII. El sistema implementa el protocolo.
¿Puedo emitir e-CF sin certificado digital? No. La firma es obligatoria.
¿Qué pasa si la DGII está caída? El envío falla y se puede reintentar. El comprobante ya generado conserva su número.
Conectores RESTDefine una API externa una vez y reutilízala desde las automatizaciones del ERP.
Estado: Operativo. Alta de conectores, prueba de llamada y uso desde automatizaciones.
Un conector guarda los datos de una API externa (dirección base, autenticación y cabeceras) para no repetirlos en cada automatización. Es la vía de salida: el ERP llamando a otro sistema.
Configuración → Conectores (/platform/connectors)
Permisos: automation:read, automation:create, automation:update, automation:delete.
Crear un conector
| Campo | Obligatorio | Nota |
|---|---|---|
| Nombre | Sí | Cómo lo verás en la lista |
| Descripción | No | Para qué sirve |
| URL base | Sí | Dirección raíz de la API. La barra final se quita automáticamente |
| Tipo de autenticación | No | none por defecto |
| Configuración de autenticación | Según el tipo | Token, usuario/contraseña, etc. |
| Cabeceras | No | Cabeceras fijas que se envían en cada llamada |
Probar antes de usarlo
Hay una acción de prueba que ejecuta una llamada real: indicas la ruta, el método y, si aplica, el cuerpo, y ves la respuesta. Úsala siempre antes de conectar el conector a una automatización: es mucho más rápido depurar aquí.
Puedes probar un conector guardado o unos datos sueltos sin guardarlos.
Usarlo desde una automatización
Configuración → Automatizaciones (/platform/automations)
Las automatizaciones responden a eventos (crear, modificar…) y pueden ejecutar acciones, entre ellas llamar a un conector. Así, por ejemplo, al crear un registro puedes notificar a un sistema externo.
Diferencia con webhooks y con la API
| Mecanismo | Dirección | Cuándo usarlo |
|---|---|---|
| Webhook | ERP → tu sistema, disparado por un evento | Quieres enterarte de algo que pasó en el ERP |
| Conector | ERP → sistema externo, disparado por una automatización | Quieres que el ERP consulte o notifique a otro servicio |
| API + API Key | Tu sistema → ERP | Quieres leer o escribir datos del ERP desde fuera |
Recomendaciones
- Un conector por servicio externo, no por endpoint: la ruta se indica en cada llamada.
- Usa HTTPS.
- Credenciales con el mínimo permiso en el sistema de destino.
- Prueba primero con una llamada de solo lectura.
Limitaciones conocidas
| Aspecto | Estado |
|---|---|
| Reintento automático de una llamada fallida | No hay política de reintentos configurable |
| Catálogo de conectores preconfigurados (Slack, Google, etc.) | No existe: se configuran a mano |
| Transformación avanzada de la respuesta | Limitada a lo que ofrece la automatización |
Importación y migración
Importación y migración de datosQué se puede importar por archivo, qué no, y en qué orden traer tus datos.
Estado: Parcial y explícito. Hay importación por CSV real para tres conjuntos de datos. Todo lo demás se carga a mano o por API. Aquí está la lista exacta, sin promesas.
Qué se puede importar y cómo
| Datos | Vía | Estado |
|---|---|---|
| Clientes | CSV con plantilla, desde Cuentas por Cobrar → Cliente | Listo |
| Plan de cuentas | CSV, desde Contabilidad → Plan de Cuentas | Listo |
| Líneas de presupuesto | CSV, desde Contabilidad → Presupuestos | Listo |
| Entidades personalizadas | CSV, desde Seguridad → Carga Masiva | Listo (solo entidades del motor genérico) |
| Productos / artículos | Alta manual o API | Sin importación CSV |
| Proveedores | Alta manual o API | Sin importación CSV |
| Existencia inicial de inventario | Pantalla de valuación, artículo por artículo | Sin importación CSV |
| Cuentas por cobrar pendientes | Facturas de apertura, capturadas | Sin importación CSV |
| Cuentas por pagar pendientes | Facturas de compra de apertura, capturadas | Sin importación CSV |
| Activos fijos | Alta manual | Sin importación CSV |
Si tu migración incluye miles de artículos o saldos pendientes, planifícala con soporte antes de la fecha de arranque: cargarlo a mano lleva tiempo real.
Orden recomendado
Las dependencias importan. Este orden evita rehacer trabajo:
- Plan de cuentas — todo lo demás cuelga de aquí.
- Monedas y tasas de cambio.
- Catálogos base: unidades, categorías, marcas, almacenes, tipos y condiciones de pago.
- Clientes (CSV).
- Proveedores.
- Productos / artículos.
- Existencia inicial con su costo.
- Saldos de apertura contables.
- Cuentas por cobrar y por pagar pendientes.
- Activos fijos y su depreciación acumulada.
Reglas comunes a toda importación CSV
| Regla | Valor |
|---|---|
| Codificación | UTF-8 (con o sin BOM). Excel: guardar como CSV UTF-8 |
| Separador | Coma |
| Texto con comas | Entre comillas dobles: "Caja, principal" |
| Tamaño máximo | 2 MB |
| Filas máximas | 5 000 |
| Primera fila | Encabezado con los nombres técnicos exactos |
Dos comportamientos distintos ante errores
Es importante saber cuál aplica:
| Importación | Ante una fila inválida |
|---|---|
| Clientes | Rechaza esa fila, procesa las demás y devuelve el listado de errores por línea |
| Plan de cuentas | Aborta todo antes de crear nada, indicando la línea del problema |
La del plan de cuentas es todo-o-nada a propósito: un catálogo contable a medias es peor que ninguno.
Antes de importar en producción
- Prueba con 10 filas primero.
- Verifica en pantalla que se crearon como esperabas.
- Solo entonces sube el archivo completo.
- Guarda el archivo original: si algo sale mal, es tu punto de partida para corregir.
Artículos de esta sección
- Importar clientes — plantilla, columnas y errores.
- Importar el plan de cuentas — formato jerárquico y validaciones.
- Carga masiva de entidades — qué es y qué no cubre.
- Errores frecuentes de importación — la lista de lo que más falla.
Importar clientesPlantilla, columnas, límites y reporte de errores de la importación de clientes.
Estado: Listo. Importación tipada con plantilla descargable, validación fila a fila y deduplicación por RNC y por código.
El procedimiento completo está en la Guía de inicio rápido, paso 6. Este artículo es la referencia del formato.
Ruta
Cuentas por Cobrar → Cliente (/cxc/clientes)
Permisos: cxc:read para la plantilla, cxc:create para importar.
Plantilla
code,name,rnc,email,phone,creditLimit,paymentTerms,currency
,Cliente Ejemplo SRL,131000001,[email protected],809-555-0100,50000,30,DOP
Columnas
| Columna | Obligatoria | Formato | Por defecto |
|---|---|---|---|
name | Sí | Texto | — |
code | No | Texto; vacío genera CLI-0001, CLI-0002… | Automático |
rnc (alias taxid) | No | RNC o cédula | vacío |
email | No | Formato de correo válido | vacío |
phone | No | Texto | vacío |
mobile | No | Texto | vacío |
address | No | Texto | vacío |
city | No | Texto | vacío |
creditLimit | No | Numérico | 0 |
paymentTerms | No | Entero (días) | 30 |
currency | No | DOP, USD… | DOP |
- Columnas desconocidas: se ignoran y se informan al final.
- Columnas prohibidas:
id,companyId,tenantId. Su presencia **rechaza el archivo
completo**. La empresa la fija la pantalla, no el archivo.
Límites
| Límite | Valor |
|---|---|
| Tamaño | 2 MB |
| Filas | 5 000 |
Comportamiento
- Las filas válidas se crean aunque otras fallen.
- Un cliente se considera duplicado (y se omite) si ya existe uno activo en la
empresa con el mismo RNC o el mismo código.
- Los duplicados dentro del propio archivo se reportan como error, no se crean dos veces.
Resultado: total, creados, omitidos y la lista de errores con su número de línea.
Errores
| Mensaje | Causa |
|---|---|
Falta la columna requerida: name | Encabezado incorrecto |
Columnas protegidas no permitidas: … | El archivo trae id, companyId o tenantId |
name es requerido | Nombre vacío en esa fila |
email inválido: … | Correo mal formado |
creditLimit no numérico: … | Texto donde va un número |
paymentTerms debe ser entero: … | Decimales o texto |
RNC duplicado en el archivo: … | Repetido dentro del CSV |
code duplicado en el archivo: … | Repetido dentro del CSV |
El archivo CSV está vacío | Sin contenido |
El CSV no contiene filas de datos | Solo encabezado |
Lo que el sistema no valida
| No valida | Consecuencia |
|---|---|
| Formato del RNC (9 u 11 dígitos) | Un RNC mal escrito se guarda tal cual |
| Dígito verificador del RNC | Igual |
| Existencia del RNC en el padrón de la DGII | Igual |
Ese RNC llega directo al reporte 607. Limpia los datos antes de importar: es mucho más barato que corregirlos después de declarar.
Después de importar
- Revisa en
Buscar Clienteque el conteo cuadre. - Revisa los omitidos: suelen ser duplicados legítimos, pero conviene confirmarlo.
- Asigna condición de pago y límite de crédito a los clientes que lo necesiten, si no
venían en el archivo.
Importar el plan de cuentasFormato exacto del CSV del catálogo contable, con jerarquía padre-hijo y validación todo-o-nada.
Estado: Listo. Importación transaccional: si una línea falla, no se crea ninguna cuenta. Resuelve la jerarquía sin importar el orden de las filas.
Cuándo usarla
- Traes el catálogo contable de tu sistema anterior.
- Tu contador prefiere una numeración distinta de la que trae el sistema por defecto.
Si te sirve el catálogo base que crea la inicialización, no necesitas importar nada.
Ruta y permisos
Contabilidad → Plan de Cuentas (/accounting/accounts)
| Acción | Permiso |
|---|---|
| Exportar el catálogo actual | accounting:export |
| Importar | accounting:manage-chart |
Exporta primero. El archivo exportado tiene exactamente el formato que espera la importación: es la mejor plantilla posible.
Formato del archivo
El encabezado debe traer estas nueve columnas, con estos nombres exactos:
code,name,type,normalBalance,isGroup,parentCode,currencyCode,isActive,description
| Columna | Obligatoria | Valores |
|---|---|---|
code | Sí | Código de la cuenta (1, 11, 110101) |
name | Sí | Nombre de la cuenta |
type | Sí | ASSET, LIABILITY, EQUITY, INCOME, EXPENSE |
normalBalance | Sí | DEBIT o CREDIT |
isGroup | No | true/false (también 1/0, si/no, yes). Por defecto false |
parentCode | No | Código de la cuenta padre. Vacío = cuenta de primer nivel |
currencyCode | No | DOP, USD… Vacío = moneda base |
isActive | No | true/false. Por defecto true |
description | No | Texto libre |
Ejemplo
code,name,type,normalBalance,isGroup,parentCode,currencyCode,isActive,description
1,ACTIVO,ASSET,DEBIT,true,,,true,
11,Activo Corriente,ASSET,DEBIT,true,1,,true,
110101,"Caja, principal",ASSET,DEBIT,false,11,DOP,true,"Efectivo, oficina"
2,PASIVO,LIABILITY,CREDIT,true,,,true,
210101,Cuentas por Pagar,LIABILITY,CREDIT,false,2,,true,
Cómo se comporta
| Comportamiento | Detalle |
|---|---|
| El orden de las filas no importa | Una cuenta hija puede ir antes que su padre: el sistema resuelve la jerarquía |
| Todo o nada | Si una línea es inválida, no se crea ninguna cuenta |
| Las cuentas existentes se omiten | Si el código ya existe, se cuenta como omitida, no se sobrescribe |
| Grupo vs. detalle | isGroup=true son cuentas de agrupación: no reciben movimientos directos |
Al terminar recibes: total, creadas y omitidas.
Límites
| Límite | Valor |
|---|---|
| Tamaño | 2 MB |
| Cuentas | 5 000 |
Errores y qué significan
Todos indican la línea del archivo:
| Mensaje | Causa |
|---|---|
Faltan columnas requeridas: … | El encabezado no trae las nueve columnas |
Línea N: code es requerido | Código vacío |
Línea N: name es requerido | Nombre vacío |
Línea N: type inválido (…) | El tipo no es uno de los cinco válidos |
Línea N: normalBalance inválido (…) | No es DEBIT ni CREDIT |
Línea N: isGroup debe ser true o false | Valor no reconocido |
Línea N: código duplicado en el archivo (…) | El mismo código aparece dos veces |
… cuenta padre NN no existe | parentCode apunta a un código que no está en el archivo ni en el sistema |
El CSV está vacío / no contiene cuentas | Archivo sin filas de datos |
El CSV excede el límite de 2 MB / de 5,000 cuentas | Divide el archivo |
Recomendaciones
- Exporta el catálogo actual y úsalo como base.
- Respeta la convención de niveles de tu numeración (1 → 11 → 110101). Es lo que hace
legible el Balance y el Estado de Resultados.
- Marca correctamente los grupos. Una cuenta de detalle marcada como grupo no podrá
recibir asientos.
- Importa antes de operar. Cambiar el catálogo con movimientos ya registrados es
mucho más delicado.
Después de importar
Vuelve a Seguridad → Configuración → Configurar Contabilidad y reasigna las cuentas por defecto de la empresa (Cuentas por Cobrar, Ingresos, ITBIS por Pagar, Caja, Cuentas por Pagar, Inventarios, Costo de Ventas). Si cambiaste la numeración, las anteriores ya no apuntan a nada válido y el posteo fallará.
Carga masiva de entidadesQué carga realmente la pantalla de Carga Masiva — y por qué no sirve para clientes ni artículos.
Estado: Operativo, con un alcance que se malinterpreta a menudo. Lee la primera advertencia antes de planificar una migración con esta pantalla.
Advertencia de alcance
Seguridad → Carga Masiva (/security/carga-masiva)
Esta pantalla carga entidades personalizadas — las que se definen en el constructor de entidades del sistema. No carga los módulos del núcleo del ERP.
| Quiero cargar | ¿Sirve esta pantalla? | Vía correcta |
|---|---|---|
| Clientes | No | Importación CSV de Cuentas por Cobrar |
| Artículos / productos | No | Alta manual o API |
| Proveedores | No | Alta manual o API |
| Facturas | No | Captura o API |
| Cuentas contables | No | Importación CSV del plan de cuentas |
| Registros de una entidad propia | Sí | Esta pantalla |
Cómo se usa
Paso 1. Elegir la entidad
El selector muestra las entidades definidas en tu sistema. Al elegir una, la pantalla lista las columnas disponibles, con un asterisco en las obligatorias.
Paso 2. Descargar la plantilla
Descargar plantilla genera un CSV con el encabezado exacto de esa entidad. Úsalo: los nombres de columna son los nombres técnicos de los campos, no las etiquetas visibles.
Paso 3. Subir el archivo
La primera fila debe traer esos nombres técnicos. Al procesar, el archivo se envía a una cola de importación y se valida y procesa en segundo plano.
Recibirás un número de trabajo:
Carga enviada correctamente. Trabajo #1234. Consulte su avance en Buscar Procesos.
Paso 4. Seguir el avance
Seguridad → Proceso → Buscar Procesos (/security/proceso/buscar)
Ahí se ve el estado del trabajo y su resultado. La carga no es inmediata: no esperes ver los registros al instante.
Recomendaciones
- Descarga siempre la plantilla en vez de escribir el encabezado a mano.
- Prueba con pocas filas y revisa el resultado en Buscar Procesos antes de subir todo.
- Guarda el CSV en UTF-8.
- No dejes vacías las columnas obligatorias (las marcadas con
*).
Errores
| Síntoma | Causa | Solución |
|---|---|---|
| Seleccione una entidad y un archivo CSV | Falta uno de los dos | Complétalos |
| El archivo está vacío | CSV sin contenido | Revisa el archivo |
| El trabajo termina con filas rechazadas | Columnas mal nombradas o valores inválidos | Revisa el detalle en Buscar Procesos y corrige |
| No aparece ninguna entidad en el selector | No hay entidades personalizadas definidas | Esta pantalla no aplica a tu caso |
Errores frecuentes de importaciónLos fallos que se repiten en toda importación y cómo evitarlos antes de subir el archivo.
Ordenados por frecuencia real. Los primeros tres explican la mayoría de los casos.
1. Acentos y «ñ» que llegan rotos
Síntoma: Mueblería llega como MueblerÃa.
Causa: el archivo no está en UTF-8. Excel guarda por defecto en la codificación del sistema.
Solución: en Excel, Archivo → Guardar como → CSV UTF-8 (delimitado por comas). En Google Sheets, Descargar → Valores separados por comas, que ya es UTF-8.
2. Encabezado con las etiquetas visibles en vez de los nombres técnicos
Síntoma: Falta la columna requerida: name, aunque tu archivo tiene una columna «Nombre».
Causa: el sistema espera los nombres técnicos (name, rnc, creditLimit), no las etiquetas en español.
Solución: descarga la plantilla y escribe tus datos debajo de su encabezado, sin tocarlo.
3. Separador equivocado
Síntoma: todo cae en una sola columna, o el error habla de columnas faltantes aunque el archivo se vea bien.
Causa: en configuraciones regionales donde la coma es separador decimal, Excel guarda el CSV con punto y coma.
Solución: ábrelo con un editor de texto y confirma que las columnas van separadas por comas. Si no, ajusta la configuración de Excel o reemplaza los separadores.
4. Números con formato
Síntoma: creditLimit no numérico: 50,000.00
Causa: el número lleva separador de miles o símbolo de moneda.
Solución: escribe 50000 o 50000.00. Sin RD$, sin comas de miles. El separador decimal es el punto.
5. Decimales donde se espera un entero
Síntoma: paymentTerms debe ser entero: 30.0
Solución: 30. Excel a veces convierte a decimal: formatea la columna como número entero antes de guardar.
6. Duplicados
Síntoma: filas rechazadas por RNC duplicado en el archivo o registros contados como omitidos.
Causa: el mismo RNC o código aparece dos veces en el archivo, o ya existe en el sistema.
Solución: deduplica antes de subir. En Excel: Datos → Quitar duplicados sobre la columna del RNC. Los omitidos por existir ya en el sistema suelen ser correctos — revísalos, no los fuerces.
7. Columnas prohibidas
Síntoma: Columnas protegidas no permitidas: id, companyId
Causa: exportaste desde otro sistema y arrastraste columnas técnicas.
Solución: elimínalas. La empresa se determina por la pantalla, nunca por el archivo.
8. Filas vacías al final
Síntoma: el conteo no cuadra, o error en una línea que "está vacía".
Causa: Excel arrastra filas con celdas en blanco pero no realmente vacías.
Solución: selecciona las filas sobrantes debajo de tus datos, bórralas por completo y vuelve a guardar.
9. Archivo demasiado grande
Síntoma: El CSV excede el límite de 2 MB o el máximo de 5 000 filas.
Solución: divide en varios archivos. Las importaciones son acumulativas: puedes subir tres archivos de 2 000 filas.
10. Cuenta padre inexistente (plan de cuentas)
Síntoma: … cuenta padre 99 no existe, y no se creó ninguna cuenta.
Causa: parentCode apunta a un código que no está ni en el archivo ni en el sistema.
Solución: incluye la cuenta padre en el mismo archivo (el orden de las filas da igual) o créala antes.
Antes de subir: lista de comprobación
- [ ] Guardado como CSV UTF-8.
- [ ] Encabezado idéntico al de la plantilla.
- [ ] Separador coma.
- [ ] Números sin separador de miles ni símbolo de moneda.
- [ ] Sin filas vacías al final.
- [ ] Sin duplicados en las columnas clave.
- [ ] Menos de 5 000 filas y 2 MB.
- [ ] Probado primero con 10 filas.
Si el error no está aquí
Copia el mensaje exacto, incluido el número de línea, y ábrelo con soporte junto con el archivo (o las primeras filas). El mensaje del sistema siempre indica la línea y el campo concretos.
Integraciones y APIQué se puede conectar hoy con UtilARA ERP y qué no, sin promesas de más.
Esta sección es para conectar UtilARA ERP con otros sistemas: tu tienda en línea, tu proveedor de correo, WhatsApp, la DGII o cualquier servicio propio.
Lo que existe hoy
| Capacidad | Estado | Dónde |
|---|---|---|
| API con API Keys | Listo | Configuración → API Keys (/platform/api-keys) |
| Webhooks salientes | Listo | Configuración → Webhooks (/platform/webhooks) |
| Correo (SMTP) | Listo | Envío de facturas en PDF y plantillas de correo |
| WhatsApp Business | Listo | Mensajes de texto y plantillas vía WhatsApp Cloud API |
| e-CF / DGII | Implementado — requiere certificación | Facturación electrónica contra la API de la DGII |
| Conectores REST | Listo | Llamar APIs externas desde automatizaciones |
| Importación de datos | Parcial | CSV para clientes, plan de cuentas y presupuestos |
Lo que no existe
Para que nadie planifique sobre algo que no está:
| Expectativa | Realidad |
|---|---|
| Pasarelas de pago para cobrar a tus clientes desde el ERP | No implementado para el tenant. El cobro con tarjeta se registra como un tipo de pago, pero el ERP no procesa la transacción |
| Sincronización automática con bancos (open banking) | No implementado. La conciliación bancaria se alimenta de archivos y registros manuales |
| Especificación OpenAPI pública y curada para terceros | No publicada. Existe documentación interna de la API completa, pero no un subconjunto oficial para integradores |
| Límite de peticiones por API Key | No. El límite es global por IP (ver API — errores y límites) |
| Importación masiva de artículos por CSV | No. Solo por API o alta manual |
Por dónde empezar
| Quiero… | Lee |
|---|---|
| Leer o escribir datos desde otro sistema | API |
| Que el ERP avise a mi sistema cuando pasa algo | Webhooks |
| Enviar facturas por correo | Correo |
| Mandar mensajes por WhatsApp | |
| Emitir facturas electrónicas | e-CF / DGII |
| Llamar a una API externa desde el ERP | Conectores |
| Traer mis datos al arrancar | Importación y migración |
Novedades
Notas de versión
NovedadesCómo se publican los cambios de UtilARA ERP y dónde ver qué cambió en cada entrega.
Aquí se publica qué cambió en el sistema: lo nuevo, lo mejorado y lo corregido.
Cómo se numeran las entregas
UtilARA ERP se entrega en despliegue continuo: no hay versiones tipo «2.8» que el usuario deba instalar. Cada entrega se identifica por su fecha, y las notas de esta sección se agrupan por mes.
| Formato de la entrega | AAAA-MM-DD |
| Frecuencia | Continua; varias entregas por semana |
| ¿Hay que actualizar algo? | No. Al recargar la página ya estás en la versión nueva |
| ¿Se interrumpe el servicio? | Las entregas se aplican sin parar el sistema |
Cómo leer las notas
Cada entrega agrupa los cambios en tres bloques:
| Bloque | Qué contiene |
|---|---|
| Nuevo | Funcionalidad que antes no existía |
| Mejoras | Algo que ya existía y ahora funciona mejor o es más completo |
| Correcciones | Errores corregidos |
Cuando un cambio requiere que hagas algo (revisar una configuración, volver a asignar permisos), la nota lo dice de forma explícita bajo Acción requerida.
Historial
- Agosto 2026 — CRM completo, POS, Caja Chica y Proyectos.
- Julio 2026 — Impuestos, Facturación, Activos Fijos, Finanzas, Contabilidad, Inventario,
Banco, Compras, Seguridad y API Keys.
Cambios que afectan tus datos
Los cambios que modifican estructura o cálculo se aplican con migraciones controladas y se anuncian en la nota correspondiente. Si un cambio exige una decisión de tu parte, se avisa antes y queda registrado en Acción requerida.
Agosto 2026Agosto 2026 — CRM completo, Terminal POS operativo, Caja Chica con arqueo y Proyectos sobre datos contables reales.
Nuevo
CRM completo (20 áreas)
El módulo de CRM quedó operativo sobre datos reales, área por área:
| Área | Qué incluye |
|---|---|
| Pipeline | Embudo con etapas, movimiento de oportunidades y velocidad por etapa |
| Actividades | Registro y seguimiento de gestiones |
| Prospectos | Captación, detección de duplicados y conversión a cuenta |
| Cuentas | Empresas cliente con sus relaciones |
| Contactos | Personas ligadas a cada cuenta |
| Oportunidades | Cierre ganado/perdido y reapertura con reglas reales |
| Comunicaciones | Historial de interacciones |
| Productos | Catálogo del CRM enlazado al catálogo real de artículos |
| Pronósticos | Pronóstico comercial calculado en el servidor |
Además:
- Cotización del CRM → cotización fiscal real. Al crear una cotización desde el CRM se
genera la cotización del módulo de ventas, no un documento paralelo.
- Campos obligatorios por etapa: cada etapa del embudo puede exigir sus propios datos
antes de avanzar.
- Detección de duplicados al crear prospectos y cuentas.
- Territorios y segmentos para organizar la cartera.
- Automatizaciones del CRM.
Terminal POS
- Selección de cliente en la venta.
- Venta a crédito desde el terminal.
- Anulación y devolución de ventas.
- Interfaz que respeta los permisos: cada acción sensible (cambiar precio, aplicar
descuento, anular, aprobar diferencia de arqueo) exige su permiso.
- Reportes reales del punto de venta.
Caja Chica
- Arqueo de fondo y cierre de caja chica.
- Cambio de custodio controlado.
- Enlace fiscal de los desembolsos.
- Interfaz que respeta los permisos del módulo.
Proyectos
- Rentabilidad por proyecto calculada sobre los asientos contables reales (la pantalla
anterior, que leía un motor paralelo y siempre salía vacía, fue retirada).
- Ejecución presupuestaria por proyecto.
- Espacio de trabajo por empresa, con permisos efectivos.
Presupuestos
- El editor de líneas permite asignar centro de costo, departamento, sucursal y proyecto.
Mejoras
- Los botones de eliminación se ocultan para los perfiles que no tienen el permiso
correspondiente, en vez de fallar al pulsarlos.
- La importación de líneas de presupuesto por CSV acepta las columnas de dimensión
(departmentCode, branchCode, projectName).
Correcciones
- CRM: la búsqueda de artículos consultaba una columna de precio que no existe; ya usa el
catálogo real.
- CRM: el movimiento de oportunidades en el tablero se podía saltar las reglas de etapa
usando la ruta genérica de actualización. Cerrado.
- CRM: al actualizar un flujo se reemplazaban las etapas de forma destructiva. Corregido.
- Caja Chica: ya no se puede cambiar la moneda de un fondo que tiene movimientos.
- Caja Chica: cada desembolso genera su propia clave de idempotencia, evitando duplicados
ante un reintento.
- Proyectos: las cifras de comprometido y cobrado nunca se muestran sin su contexto.
Acción requerida
- Si usas CRM: revisa los campos obligatorios por etapa de tu embudo. Si defines
campos nuevos, las oportunidades existentes no podrán avanzar hasta completarlos.
- Si usas POS: revisa los permisos del personal de caja. Las acciones sensibles ahora se
controlan de verdad; un cajero sin pos:apply-discount dejará de ver ese botón.
- Si usas Caja Chica: define la moneda del fondo antes de registrar movimientos.
Julio 2026Julio 2026 — comprobante fiscal en PDF, NCF emitido al postear, reportes 606/607/608 correctos, y configuración de seguridad que sí guarda.
Mes de consolidación fiscal y contable. Varios de estos cambios corrigen comportamientos que afectaban declaraciones a la DGII: léelos si operaste antes de julio de 2026.
Nuevo
Facturación y comprobantes
- Comprobante fiscal en PDF generado en el servidor, con RNC y dirección del emisor, RNC
del comprador, vigencia del NCF y desglose completo de ITBIS.
- Vista previa, impresión individual y impresión en lote en un PDF combinado.
- Envío por correo con el PDF adjunto, historial de envíos y reintento.
- Condición de pago con tipo estructurado (contado / crédito): vencimiento automático,
cobro de contado en una sola operación atómica, límite de crédito configurable por cliente y anulación integral de la venta de contado.
- Nota de crédito con clase: ajuste financiero frente a devolución. La devolución
repone el inventario en un almacén y revierte el costo de venta al costo original.
- Cotización con selector de artículos reales y conversión segura a factura (idempotente,
precio congelado, condición y almacén conservados) y PDF de la cotización.
- Factura proforma con su ciclo completo, incluida la impresión en lote.
Impuestos
- Pantallas reales de Reglas Fiscales y Retenciones (antes eran maquetas sin efecto).
- Historial de generación de los reportes 606, 607 y 608: queda registro de cada versión
generada.
- Conciliación fiscal contra la contabilidad integrada en las pantallas de 606/607/608.
- Sustitución de la retención calculada desde la factura de proveedor, auditada y
limitada a los perfiles autorizados.
Contabilidad y finanzas
- Presupuestos conectados al motor real de presupuesto.
- Reportes de gasto con filtros, paginación y exportación a CSV.
- Columnas comparativas en la Balanza de Comprobación y filtro por origen en el Mayor.
- Reintento de asientos recurrentes que fallaron.
- Reversión desde la pantalla de operaciones entre empresas.
- Diferencia cambiaria reconstruida como reporte real sobre el motor de tipo de cambio.
- Análisis financiero con el set completo de indicadores y desglose.
Inventario y almacén
- Pantallas de Conduce / Despacho, Devolución de Conduce, Recepción de Alquiler y
Recepción de Taller / Reparación.
- Administración de unidades y grupos de modificadores.
- Los costos se ocultan en pantalla para quien no tiene permiso de verlos.
Activos fijos
- Transferencia de activo (custodio y ubicación) con historial de auditoría.
- Filtros por ubicación y custodio en los reportes.
- Confirmación antes de ejecutar la depreciación en lote.
Banco y Cuentas por Pagar
- Reporte dinámico de Banco y de Cuentas por Pagar.
- Pantalla de Cuentas por Moneda incorporada al menú.
Seguridad y accesos
- La política de contraseñas y bloqueo por intentos se guarda y se aplica de verdad
en el alta de usuarios y en el inicio de sesión.
- Índice de configuración efectiva por módulo: se ve qué está realmente configurado.
- Selector real de procesos en Ejecutar Proceso.
- Renovación automática de la sesión y revocación al cerrar sesión.
API
- El selector de scopes de API Keys se alimenta del catálogo real del servidor, en vez de
una lista fija que ofrecía permisos inexistentes.
Correcciones importantes
El NCF se emite al postear, no al guardar
Antes: guardar un borrador consumía un número fiscal. Un borrador abandonado dejaba un hueco en la secuencia y el 607 declaraba documentos que nunca se emitieron.
Ahora: el borrador guarda solo el tipo de comprobante. El número se emite al postear; un posteo fallido no consume nada. El 607 declara solo ventas emitidas y no anuladas; el 608 solo lo que se emitió y luego se anuló.
Acción requerida: si emitiste comprobantes antes del 17 de julio de 2026, revisa con soporte los borradores que hayan quedado con NCF asignado antes de presentar un período.
La factura no descontaba inventario
Antes: la pantalla de factura no seleccionaba artículos reales, así que vender no descontaba existencias ni generaba costo de venta.
Ahora: selecciona artículos reales, elige almacén, valida existencias, descuenta stock y genera el asiento de costo. Al anular, el inventario se repone y ambos asientos quedan en cero.
Otras correcciones
- Cuentas por Pagar: el ITBIS automático usaba un 18 % fijo escrito en el código; ahora lo
calcula el motor fiscal central, respetando tus reglas y sus vigencias.
- Cuentas por Pagar: el botón para sustituir la retención se oculta a los perfiles no
autorizados.
- Seguridad: 12 pantallas de «Configurar X» aparentaban guardar y no guardaban nada.
Sustituidas por configuración real o retiradas.
- Pantallas sin función retiradas: varias rutas que mostraban formularios sin conexión al
sistema fueron bloqueadas o eliminadas, en lugar de dejarlas aparentar que funcionaban.
- Recursos Humanos: el menú publica las 20 pantallas operativas en vez de un listado de
354 rutas mayormente vacías.
- Dental: se ocultaron las pantallas no funcionales; queda el expediente de paciente real.
Acción requerida — resumen
- Revisa los NCF anteriores al 17 de julio de 2026 antes de declarar.
- Verifica la configuración de contabilidad de tu empresa (cuentas de inventario y costo
de ventas): sin ellas, la factura no puede generar el asiento de costo.
- Revisa tu política de contraseñas: ahora se aplica de verdad al crear usuarios.
- Revisa los scopes de tus API Keys: las llaves creadas con scopes que no existían nunca
funcionaron; recréalas con los scopes reales.
Otros artículos
Facturación
Cómo configurar tu NCF en UtilARAGuía oficial para secuencias NCF
Paso 1: ve a Comprobantes. Paso 2: crea tu secuencia B01...
No se encontraron artículos para tu búsqueda.