Centro de ayuda

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ónPara quiénQué contiene
Primeros pasosCliente nuevoGuía de inicio rápido, acceso al sistema y cómo moverte
ManualesTodo el equipoManual de usuario de cada módulo
AdministraciónAdministrador de la empresaUsuarios, roles, empresas, sucursales, configuración y seguridad
ContabilidadContador y personal financieroQué asiento genera cada operación, cierres y reportes
No verificado AyudaTodosRecetas paso a paso, flujos completos, preguntas frecuentes y solución de problemas
Integraciones y APIIntegrador / TIAPI, webhooks, integraciones e importación de datos
NovedadesTodosQué cambió en cada entrega

Empieza por aquí

Si eres…Empieza por
Cliente nuevoGuía de inicio rápido — 10 pasos hasta tu primera factura
Usuario que va a operarCómo iniciar sesión y el manual de tu módulo
Administrador de la empresaAdministración — usuarios, roles y configuración
ContadorContabilidad — manual contable y cierres
IntegradorIntegraciones 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:

EstadoSignifica
ListoVerificado de punta a punta: pantalla → API → base de datos → contabilidad
OperativoFunciona completo; le faltan comodidades, no correctitud
ParcialUna parte funciona y otra no. Lee la nota antes de depender de él
PendienteNo implementado todavía

Cinco cosas que conviene saber desde el principio

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

  1. El NCF se emite al postear. Un borrador abandonado no gasta numeración fiscal, y un

posteo fallido tampoco.

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

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

  1. 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:

ÁreaLimitación
ImportaciónNo 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 internaLos prefijos y el punto de partida (FAC-AAAA-######) no son configurables
ExportaciónNo se generan .xlsx nativos; hay CSV, .xls y PDF
PagosNo hay pasarela de pago integrada ni conexión automática con bancos
APICompras, Cuentas por Pagar, Inventario y Contabilidad no aceptan API Key, solo sesión de usuario
WebhooksSe disparan desde el motor de registros; los documentos del núcleo aún no los emiten
ProyectosSin diagrama de Gantt, dependencias ni asignación de recursos
e-CFImplementado 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

DatoPara qué se usa¿Obligatorio?
RNC / Cédula de la empresaSe imprime en el comprobante fiscal. Sin él el sistema bloquea la emisión con NCFSí
Razón social y nombre comercialEncabezado del comprobanteSí
Dirección, teléfono y correoEncabezado del comprobante y envío por correoRecomendado
Logo (imagen)Comprobante impresoOpcional
Secuencias de NCF autorizadas por la DGIINumeración fiscal de las facturasSí, para facturar
Listado de clientes (CSV)Carga inicialOpcional
Listado de productos/serviciosCarga inicialOpcional

Los 10 pasos

#PasoDónde
1Configura tu empresaContabilidad → Configuración
2Crea tus sucursalesContabilidad → Configuración → Dimensiones
3Crea tus usuariosSeguridad → Usuarios
4Configura impuestos y comprobantes fiscalesImpuestos
5Revisa las formas de pago y condicionesContabilidad → Tipos de Pago
6Importa tus clientesCuentas por Cobrar → Cliente
7Importa tus productosInventario → Ítem
8Configura inventario (almacenes y existencias)Inventario → Almacén
9Emite tu primera facturaFacturación → Factura
10Registra tu primer cobroCuentas 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:

EstadoSignifica
ListoVerificado de punta a punta: pantalla → API → base de datos → contabilidad
OperativoFunciona completo; le faltan comodidades, no correctitud
ParcialUna parte funciona y otra no. Lee la nota antes de depender de él
PendienteNo 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 Cuentas muestra el catálogo con cuentas.
  • [ ] Contabilidad → Períodos Contables tiene los 12 meses del año, y el mes actual está abierto.
  • [ ] Seguridad → Configuración → Configurar Compañía tiene RNC, razón social y dirección.
  • [ ] Seguridad → Configuración → Configurar Contabilidad tiene asignadas las cuentas de

Cuentas por Cobrar, Ingresos, ITBIS por Pagar, Caja, Cuentas por Pagar, Inventarios y Costo de Ventas.

  • [ ] Contabilidad → Configuración → Dimensiones tiene tus sucursales creadas.

Monedas

  • [ ] Banco → Moneda lista DOP marcada como base.
  • [ ] Si operas en dólares, USD está activa y tiene tasa de cambio cargada

(Banco → Cambio Tasa).

Usuarios y seguridad

  • [ ] Seguridad → Configuración → Configurar Usuarios tiene 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 Fiscales tiene la regla de ITBIS con su vigencia.
  • [ ] Impuestos → Serie Fiscal tiene al menos una secuencia activa y vigente (B01 y/o B02).
  • [ ] Impuestos → Consulta NCF muestra 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 Pago tiene los medios que realmente usas.
  • [ ] Cuentas por Cobrar → Condición de Pago tiene al menos Contado y una de crédito,

y hay una marcada por defecto.

  • [ ] Cuentas por Cobrar → Cliente tiene tus clientes, con RNC correcto.
  • [ ] Inventario → Ítem tiene tu catálogo, con unidad y categoría.

Inventario

  • [ ] Inventario → Almacén tiene tus almacenes.
  • [ ] Inventario → Existencia en Almacén muestra cantidad y costo — no cero.
  • [ ] Contabilidad → Balanza Comprobación muestra 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 → Diario y 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ónPara qué sirve
Centros de CostoAgrupar gastos por unidad de costo
DepartamentosAgrupar por área organizativa
SucursalesAgrupar por local / establecimiento
Si cada local tiene su propio RNC, no es una sucursal: es otra empresa (paso 1).

Permisos necesarios

AcciónPermiso
Ver dimensionesaccounting:read
Crear dimensionesaccounting: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

LugarUso
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 EfectivoFiltro 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 recurrentesLas líneas conservan la sucursal

Lo que una sucursal no hace

ExpectativaRealidad
Numeración de factura por sucursalNo. La numeración (FAC-AAAA-######) es por empresa
Secuencia de NCF por sucursalNo. Las secuencias de NCF se configuran por empresa
Inventario por sucursalSe maneja con almacenes (paso 8), no con sucursales
Punto de venta por sucursalSe 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

RequisitoDóndeSi falta…
Empresa con cuentas contables configuradasSeguridad → Configuración → Configurar ContabilidadEl posteo falla
Cliente creadoCuentas por Cobrar → ClienteNo puedes seleccionarlo — la pantalla no crea clientes al vuelo
Serie NCF activa y vigenteImpuestos → Serie FiscalSolo si vas a emitir comprobante fiscal
Período contable abiertoContabilidad → Períodos ContablesEl posteo se rechaza
Existencia y almacénInventarioSi vendes productos inventariados

Permisos

AcciónPermiso
Ver facturascxc:read
Crear, postear y enviarcxc:create
Anularcxc: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

CampoObligatorioNota
Número—(auto). Se asigna al guardar: FAC-AAAA-000001
Estatus—Empieza como Borrador (sin guardar)
FechaSíDetermina el período contable
ClienteSíDefine la cuenta por cobrar y el RNC que va al 607
Condición de pagoNoSi el cliente tiene una predeterminada, se propone sola
VencimientoNoCon condición de contado se fija igual a la fecha y se bloquea
Tipo NCFNoElige el tipo. El número se emite al postear, no al guardar
Almacén de despachoSolo con productosSi 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.

CampoOpciones
MétodoEfectivo, Transferencia, Tarjeta, Cheque, Depósito, Otro
Caja / BancoCuenta donde entra el dinero
Monto / Efectivo recibidoCon efectivo, si entregas más del total, la pantalla calcula el cambio y aplica solo el total
ReferenciaOpcional
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ónQué hace
GuardarCrea el borrador. No consume NCF, no descuenta inventario, no contabiliza
PostearEmite 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

EfectoDetalle
NCF emitidoFormato de 11 caracteres, p. ej. B0100000026. La secuencia avanza
Cuenta por cobrarPor el total, con su fecha de vencimiento
Asiento de ventaDébito Cuentas por Cobrar · Crédito Ingresos por Ventas · Crédito ITBIS por Pagar
Asiento de costoDébito Costo de Ventas · Crédito Inventarios (solo con productos inventariados)
InventarioSe descuenta del almacén elegido
Reporte 607La 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íntomaCausaSolución
El posteo falla por períodoEl período contable está cerradoCambia la fecha o reabre el período (permiso accounting:reopen-period)
El posteo falla por cuentasFaltan cuentas en la empresaConfigurar Contabilidad
Requerido: hay productos inventariadosFalta el almacén de despachoElige el almacén
Bloqueo por límite de créditoEl cliente supera su límiteCobra antes, sube el límite o factura de contado
No hay NCF disponibleLa 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ónPermiso
Inicializar contabilidadaccounting:create
Crear una empresa adicionalaccounting:create
Editar datos de la empresaaccounting: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é creaDetalle
MonedasDOP — Peso Dominicano (RD$), marcada como moneda base, y USD — Dólar Estadounidense
EmpresaCódigo MAIN, nombre igual al de tu cuenta, moneda base DOP
Plan de cuentasCatálogo base completo (activo, pasivo, patrimonio, ingresos, gastos)
Períodos fiscalesLos 12 meses del año en curso
Reglas contablesReglas por defecto que deciden qué asiento genera cada operación
Tipos de pagoEfectivo, Transferencia bancaria, Tarjeta, Cheque
Conceptos contablesCatá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

CampoSignificado¿Obligatorio?
NombreNombre corto que ves en el sistemaSí
Razón socialNombre legal completoRecomendado
Nombre comercialSi difiere de la razón socialOpcional
RNC / CédulaSe imprime en el comprobante. Sin este dato el sistema no genera comprobantes con NCFSí 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

CampoQué hace
LogoImagen del encabezado
Formato por defectoA4, LETTER o THERMAL_80 (rollo de 80 mm para POS)
Mostrar logo / vendedor / almacénQué bloques aparecen impresos
Texto de pie y TérminosTexto libre al final del comprobante
Asunto y cuerpo del correoPlantilla 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

  1. Contabilidad → Plan de Cuentas muestra el catálogo con cuentas.
  2. Contabilidad → Períodos Contables muestra los 12 meses del año, abiertos.
  3. Contabilidad → Tipos de Pago muestra Efectivo, Transferencia, Tarjeta y Cheque.
  4. En Configurar Compañía, el campo RNC está lleno.

Problemas frecuentes

SíntomaCausaSolución
No aparece el botón "Inicializar ahora"Ya hay una empresa creadaCorrecto: continúa con la parte B
"No hay compañías registradas" en Configurar CompañíaFalta inicializarVuelve a la parte A
Al emitir factura: error por RNC del emisorEl campo RNC está vacíoComplé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ónValor por defecto
Longitud mínima8 caracteres
Exigir letras y númerosNo
Exigir mayúsculaNo
Exigir carácter especialNo
Bloquear tras N intentos fallidos0 = no bloquear
Duración del bloqueo15 minutos
Para producción se recomienda al menos: mínimo 10, letras y números, y bloqueo tras 5 intentos.

Permisos necesarios

AcciónPermiso
Ver usuariosuser:read
Crear / invitaruser:create
Editaruser:update
Eliminaruser:delete

Opción A — Crear el usuario con contraseña

Seguridad → Usuarios → Usuario (/security/usuario/nuevo)
CampoObligatorioNota
EmailSíEs el identificador de acceso. Se guarda en minúsculas. No puede repetirse
ContraseñaSíDebe cumplir la política configurada arriba
Nombre completoNoLo que se muestra en el sistema
PerfilesNoPuedes 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:

PerfilAlcance
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íntomaCausaSolución
"Ya existe un usuario con ese email"El correo está en uso, incluso si el usuario está inactivoReactiva el existente en lugar de crear otro
"Perfiles inválidos: …"El nombre de perfil enviado no existeRevisa el nombre exacto en Seguridad → Perfiles
La contraseña es rechazadaNo cumple la política del tenantAjusta la contraseña o revisa Configurar Usuarios
El enlace de invitación no funcionaPasaron más de 7 díasVuelve 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ó.

PermisoPara qué
tax:readVer reglas y retenciones
tax:manage-rulesCrear reglas y abrir nuevas vigencias
tax:manage-withholdingsGestionar 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:

CampoSignificado
TipoEl código de comprobante (ver tabla abajo)
Número de autorizaciónEl que emitió la DGII
Número inicial / finalEl rango autorizado (p. ej. 1 a 500)
Vigente desde / hastaFechas de validez
Umbral de alertaCuántos comprobantes libres deben quedar para avisarte (por defecto 50)
ActivaSi 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ódigoNombreCódigoNombre
B01Crédito FiscalE31e-CF Crédito Fiscal
B02Consumidor FinalE32e-CF Consumidor Final
B03Nota de DébitoE33e-CF Nota de Débito
B04Nota de CréditoE34e-CF Nota de Crédito
B11Proveedor InformalE41e-CF Compras
B12Único IngresoE43e-CF Gastos Menores
B13Gastos MenoresE44e-CF Regímenes Especiales
B14Regímenes EspecialesE45e-CF Gubernamental
B15GubernamentalE46e-CF Exportaciones
B16ExportacionesE47e-CF Pagos al Exterior
B17Pagos 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 borradorNo. Solo se guarda el tipo elegido
Postear la facturaSí. Se asigna el número y avanza la secuencia
El posteo fallaNo. No se pierde ningún número
Anular una factura posteadaEl 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

  1. Impuestos → Consulta NCF muestra las secuencias con su consumo y disponibilidad.
  2. Crea una factura de prueba, postéala y confirma que recibió un NCF con el formato de 11

caracteres.

  1. Impuestos → Reporte 607 debe 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álogoResponde aEjemplo
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ódigoNombreMétodo
CASHEfectivoCASH
TRANSFERTransferencia bancariaBANK_TRANSFER
CARDTarjetaCARD
CHECKChequeCHECK

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:

CampoQué hace
Código y NombreIdentificación (CONTADO, 30D, …)
TipoCONTADO o CRÉDITO. Es la fuente de verdad, no el nombre
DíasDías de crédito. Una condición de contado debe tener 0
Por defectoLa que se propone al facturar. Solo puede haber una por empresa
OrdenPosició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 pagoActívalo e indica el % y la ventana de días

Qué cambia según el tipo

CONTADOCRÉDITO
Fecha de vencimientoLa misma fecha de la facturaFecha de factura + días
CobroSe registra junto con la factura, en una sola operaciónQueda pendiente en Cuentas por Cobrar
Límite de crédito del clienteNo se validaSe valida: si lo excede, la factura se bloquea
AnulaciónRevierte factura y cobro juntosRevierte 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:

  1. CONTADO — tipo CONTADO, 0 días, marcada por defecto.
  2. 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ónPermiso
Descargar la plantillacxc:read
Importarcxc: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

ColumnaObligatoriaFormatoPor defecto
nameSíTexto—
codeNoTexto. Si lo dejas vacío el sistema asigna CLI-0001, CLI-0002…Automático
rnc (o taxid)NoRNC o cédulavacío
emailNoDebe tener formato de correo válidovacío
phoneNoTextovacío
mobileNoTextovacío
addressNoTextovacío
cityNoTextovacío
creditLimitNoNumérico0
paymentTermsNoEntero (días)30
currencyNoCódigo ISO (DOP, USD)DOP
  • Cualquier otra columna se ignora y se reporta al final como columna ignorada.
  • Las columnas id, companyId y tenantId están prohibidas: si aparecen, el archivo

se rechaza completo. La empresa la determina la pantalla, nunca el archivo.

Límites

LímiteValor
Tamaño máximo2 MB
Filas máximas5 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:

ResultadoSignificado
CreadosClientes nuevos insertados
OmitidosYa existía un cliente activo con ese RNC o ese código en la empresa
ErroresFila 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

MensajeCausa
name es requeridoLa 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: nameEncabezado incorrecto
Columnas protegidas no permitidas: …El archivo trae id, companyId o tenantId

Consejos para que salga a la primera

  1. Guarda el CSV en UTF-8. Si lo exportas desde Excel, elige CSV UTF-8, o las tildes

y las «ñ» llegarán rotas.

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

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

  1. 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álogoRutaPara qué
Item Unidad/inventory/unitsUnidad de medida: Unidad, Caja, Libra, Litro
Categoría/inventory/categoriesAgrupación del catálogo, usada en reportes
Marcas/inventory/brandsMarca del producto
Grupo de Modificadores/inventory/modifier-groupsOpciones de venta (tamaños, extras) — típico de POS
Almacén/inventory/warehousesDónde vive el stock (paso 8)

Permisos

AcciónPermiso
Ver artículosinventory:read
Crear / editarinventory:create / inventory:update
Ver costosinventory: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

CampoNota
CódigoIdentificador del artículo
NombreDescripción comercial
UnidadDel catálogo de unidades
Categoría / MarcaOpcionales, pero muy útiles en reportes
TipoDistingue producto de servicio
Método de costeoAVERAGE (promedio, por defecto), FIFO o costo estándar
Precio de ventaPuede sobrescribirse con listas de precio

Sobre el método de costeo

MétodoCómo valora la salida
AVERAGE (por defecto)Costo promedio ponderado
FIFOConsume las capas de costo más antiguas primero
EstándarCosto 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 existentesSí
Seguridad → Carga MasivaNo para artículos. Esa pantalla carga entidades personalizadas, no el catálogo real de inventario
Importación CSV de clientesSolo clientes
Importación CSV del plan de cuentasSolo 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.

CampoNota
CódigoCorto y estable (PRIN, TIENDA1)
NombreLegible
ActivoUn 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:

CampoObligatorioRegla
ArtículoSíDebe estar activo
AlmacénSíDebe estar activo
CantidadSíMayor que 0
Costo unitarioSí0 o mayor — pon el costo real, no lo dejes en 0
Fecha efectivaNoPor defecto hoy. No se admite fecha futura
Moneda y tasa de cambioNoSi cargas en otra moneda, el costo se convierte a la moneda base
Referencia / memoNoPara rastrear de dónde salió el dato

Reglas que el sistema aplica

ReglaQué pasa si la incumples
Fecha no futuraSe 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 negativoSe rechaza hasta corregirlo
El artículo debe estar activo y ser de inventarioSe 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

NecesidadRuta
Conteo cíclico / auditoría de inventarioInventario → Auditoría Inventario (/inventory/cycle-counts)
Entradas, salidas y trasladosInventario → Movimiento de Inventario (/inventory/movements)
Series y lotesInventario → Serie y Lote (/inventory/tracking)

Efecto contable

La existencia inicial y todo movimiento posterior impactan las cuentas configuradas en la empresa:

CuentaSe usa para
InventariosValor de la mercancía en existencia
Costo de VentasCosto reconocido al vender
Ajuste de InventarioDiferencias de conteo
Variación de costo estándarDiferencias 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

  1. El artículo aparece en Existencia en Almacén con cantidad y costo distintos de cero.
  2. Contabilidad → Balanza Comprobación muestra 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

RequisitoDónde
Una factura abierta del clienteFacturación → Factura
Cuenta de banco o cajaBanco → Banco → Cuenta Banco
Cuentas contables de la empresaSeguridad → Configuración → Configurar Contabilidad
Período contable abiertoContabilidad → Períodos Contables

Permisos

AcciónPermiso
Ver reciboscxc:read
Crear y aplicarcxc:create
Anularcxc:delete

Ruta

Cuentas por Cobrar → Recibo (/cxc/recibos)

Paso 1. Datos del recibo

CampoObligatorioNota
ClienteSíDe quién se recibe
FechaSíDetermina el período contable
MontoSíDebe ser 0 o mayor
MétodoNoEfectivo, transferencia, cheque…
ReferenciaNoNúmero de transferencia o cheque
Cuenta bancariaNoDefine 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:

ModoCómoResultado
AutomáticoNo indicas facturasSe aplica por antigüedad: primero la factura abierta con vencimiento más antiguo
ManualEliges factura y montoSe 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ónComportamiento
El recibo y la factura deben ser del mismo clienteRechaza aplicarlo a otro
No se aplica a facturas anuladasRechaza
No se puede exceder el saldo del reciboMonto supera el saldo disponible
Dos aplicaciones simultáneasLa transacción es serializable: no se puede sobre-aplicar
Período contable cerradoRechaza

Qué queda registrado

EfectoDetalle
ReciboPAG-AAAA-000001 con su saldo aplicado y pendiente
Saldo de la facturaBaja por el monto aplicado; llega a 0 y la factura queda saldada
AsientoDébito Caja/Banco (la cuenta elegida) · Crédito Cuentas por Cobrar
Estado de cuenta del clienteSe actualiza

Cómo verificar

  1. Cuentas por Cobrar → Dashboard — el saldo por cobrar bajó.
  2. Cuentas por Cobrar → Reporte CxC — la factura aparece saldada o con el nuevo saldo.
  3. Contabilidad → Diario — el asiento del cobro, cuadrado.
  4. Contabilidad → Balanza Comprobación — la cuenta de caja/banco subió.

Casos relacionados

CasoDónde
El cliente adelanta dinero sin facturaCuentas por Cobrar → Anticipo CxC
Devolución de mercancíaCuentas por Cobrar → Nota de Crédito
Cargo adicional al clienteCuentas por Cobrar → Nota de Débito
Cobro en el mostradorTerminal 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

  1. Abre la dirección de tu empresa.
  2. Escribe tu correo (el mismo con el que te dieron de alta) y tu contraseña.
  3. 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

  1. Entra a tu perfil → Seguridad.
  2. Elige Activar verificación en dos pasos. Aparece un código QR.
  3. Escanéalo con tu app de autenticación.
  4. Escribe el código de 6 dígitos que muestra la app para confirmar.
  5. 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ónEfecto
Cerrar sesiónCierra la sesión de este dispositivo
Cerrar todas las sesionesCierra 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

ElementoDuración
Sesión activa en el navegador15 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íntomaCausa probableSolución
Correo o contraseña incorrectosCredenciales mal escritasRevisa mayúsculas y el teclado
Entras y te devuelve a la pantalla de accesoEstás en la dirección de otra empresaUsa la dirección de tu empresa
Usuario inactivoLa cuenta fue desactivada o la invitación no se completóContacta a quien administra el sistema
Cuenta bloqueada tras varios intentosTu empresa activó el bloqueo por intentos fallidosEspera 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ónCorreo en spam o dirección equivocadaPide 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

  1. Abre la URL del ERP. Verás la pantalla de Login.
  2. 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.
  1. 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).
  2. 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.
  1. 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)

CampoQué es
CorreoTu identificador de usuario.
ContraseñaDefinida 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

Cómo moverte en el sistemaEl patrón "Buscar / Registro" que se repite en todo el sistema, y cómo buscar, filtrar, exportar e imprimir.
Estado: Operativo. Descrito sobre las pantallas reales. Donde hay una limitación (por ejemplo la búsqueda global), se dice.

El patrón que se repite en todas partes

Casi todos los módulos usan la misma estructura de dos pestañas:

PestañaPara qué
Buscar …Lista con filtros. Aquí encuentras lo que ya existe
… (singular)El formulario. Aquí creas o editas un registro

Ejemplo: Facturación → Factura tiene Buscar Factura y Factura. Cuentas por Cobrar → Cliente tiene Buscar Cliente y Cliente.

Para editar un registro: búscalo en la pestaña de búsqueda, selecciónalo y se abre en el formulario.

El selector de empresa

Casi todo se registra dentro de una empresa. Si un selector de empresa aparece vacío, no podrás guardar. Si un cliente, artículo o factura "no aparece", lo primero a revisar es que estés en la empresa correcta.

Buscar

Buscador de cada pantalla (el que debes usar)

Cada pantalla de búsqueda trae los filtros que tienen sentido para ese documento. Por ejemplo, Buscar Cliente filtra por ID, Nombre, Código, Documento, Tienda, Comprobante Fiscal, Vendedor, Estatus y Tipo de Cliente.

Consejos:

  • Los filtros de texto buscan coincidencias parciales: escribir mueble encuentra

Mueblería Santo Domingo.

  • Los filtros se combinan: rango de fechas + estado + cliente.
  • Si no aparece nada, quita filtros de arriba hacia abajo hasta encontrar cuál sobra.

Búsqueda global (Ctrl+K) — con una limitación importante

El atajo Ctrl+K (o ⌘+K en Mac) abre un buscador general en la barra superior.

Limitación real: hoy la búsqueda global consulta únicamente los registros de entidades personalizadas, no los documentos del núcleo del ERP. No encontrará facturas, clientes, artículos ni proveedores. Para esos, usa el buscador de la pantalla correspondiente.

Escribe al menos 2 caracteres; devuelve hasta 20 resultados, con las coincidencias por nombre primero.

Editar

  1. Encuentra el registro en la pestaña de búsqueda y ábrelo.
  2. Modifica lo que necesites.
  3. Pulsa Grabar / Guardar.

Lo que ya está contabilizado no se edita. Un documento posteado se corrige con una anulación o una nota de crédito / débito, nunca reescribiendo el original: es lo que mantiene la contabilidad auditable.

Anular

Anular no borra: revierte. El documento queda visible con estado Anulado y el sistema genera el asiento espejo que deja los saldos en cero. Requiere permiso de eliminación del módulo (cxc:delete, cxp:delete, …).

En comprobantes fiscales, anular no devuelve el NCF: el número pasa al reporte 608 y no se reutiliza.

Imprimir y descargar PDF

Las facturas y otros comprobantes tienen acciones de documento:

AcciónQué hace
Vista previaMuestra el documento como se imprimirá
Descargar PDFGenera el PDF en el servidor
ImprimirEnvía a la impresora
Imprimir en loteUn solo PDF con varias facturas (Facturación → Factura → Imprimir Facturas en lote)
Enviar por correoManda el PDF adjunto y deja historial de envíos

El formato del comprobante (A4, Carta o rollo térmico de 80 mm) se configura por empresa en Seguridad → Configuración → Configurar Compañía.

Exportar

Casi todos los listados y reportes se exportan. Según la pantalla verás uno o varios formatos:

FormatoQué obtienesCuándo usarlo
CSVArchivo de texto separado por comas, con BOM UTF-8Para volver a cargarlo en otro sistema o abrirlo en Excel
EXCELArchivo .xls que Excel abre directamentePara trabajar la tabla a mano
PDFDocumento listo para imprimir o enviarPara archivar o compartir

Los estados financieros (Balanza, Estado de Resultados, Balance General, Flujo de Efectivo, Mayor General, Consolidación) ofrecen los tres. Otros listados exportan solo CSV.

Sobre "exportar a Excel": el sistema no genera archivos .xlsx nativos. La opción EXCEL produce un archivo que Excel abre sin problema; la opción CSV es la más segura para reimportar en otro sistema. Abre siempre el CSV como UTF-8 para que las tildes se vean bien.

Exportar puede requerir un permiso específico (accounting:export, profit_loss:export, etc.). Si el botón no aparece, es un tema de permisos.

Atajos y detalles útiles

AcciónCómo
Abrir la búsqueda globalCtrl+K / ⌘+K
Cerrar el buscadorEsc
Cambiar el idiomaSelector de idioma en la pantalla de acceso

Cuando algo "no aparece"

Recórrelo en este orden:

  1. ¿Estás en la empresa correcta?
  2. ¿Hay un filtro activo que lo excluye (estado, fechas, almacén)?
  3. ¿El registro está inactivo? Los catálogos inactivos no salen en los selectores.
  4. ¿Tienes permiso para verlo? Sin permiso de lectura, la pantalla se ve vacía en vez de

dar error.

  1. ¿El período está cerrado? Algunos listados se limitan al período abierto.
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

  1. Al ingresar, llegas al panel de inicio.
  2. Revisa los indicadores y accesos rápidos.
  3. 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. Backend tenant-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.md o ../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óduloRutaPara qué
Factura/facturacion/factura/buscar · /facturacion/factura/nuevoCrear/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)

  1. Menú Facturación → Factura → Factura (nuevo).
  2. Selecciona el cliente (buscador/lookup).
  3. Elige el tipo de comprobante / serie NCF si aplica.
  4. Agrega líneas: ítem, cantidad, precio, descuento. El ITBIS se calcula según la configuración del ítem/impuesto.
  5. Revisa subtotal, impuesto y total.
  6. Guardar (borrador) y luego Emitir/Postear para que impacte contabilidad, inventario y CxC.
  7. Imprimir o generar el comprobante.

Campos explicados

CampoQué es
ClienteA quién se factura.
NCF / SerieNúmero de comprobante fiscal (si aplica DGII).
Ítem / Cantidad / PrecioQué se vende, cuánto y a qué precio.
DescuentoRebaja por línea o total.
ITBIS / ImpuestoImpuesto sobre la venta.
Condición de pagoContado 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óduloRuta
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)

  1. Menú Cuentas por Cobrar → Recibo (nuevo).
  2. Selecciona el cliente.
  3. El sistema muestra sus facturas abiertas. Marca cuáles cobras y por cuánto (total o parcial).
  4. Indica la cuenta de caja/banco donde entra el dinero y el medio de pago.
  5. Si el cliente te aplicó retención o das descuento por pronto pago, regístralo.
  6. Guardar/Aplicar. Se genera el asiento y baja el saldo del cliente.

Campos explicados

CampoQué es
ClienteQuién paga.
Facturas a aplicarQué documentos se abonan con este cobro.
MontoTotal o parcial por factura.
Cuenta caja/bancoDónde entra el dinero.
RetenciónImpuesto 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:

DocumentoEfecto en el mayor
ReciboNinguno. El asiento se hizo al registrar el cobro, no al aplicarlo.
Nota de créditoNinguno, por la misma razón — tampoco se toca el ITBIS ni el NCF.
AnticipoSí: 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. Controller t/: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 soporta page/limit/totalPages pero 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óduloRuta
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)

  1. Solicitud de Material (opcional): quien necesita algo lo solicita.
  2. Solicitud de Cotización a uno o varios proveedores; registra sus cotizaciones.
  3. Orden de Compra: confirma qué, a quién, cuánto y a qué precio.
  4. Recepción: al llegar la mercancía, se recibe contra la OC (total o parcial) → entra al inventario.
  5. 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

CampoQué es
ProveedorA quién se compra.
Ítem / Cantidad / PrecioQué, cuánto y a qué costo.
AlmacénDónde entra lo recibido.
Recepción parcialRecibir menos de lo pedido, dejando la OC abierta.
MatchingComparar 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 con cxp y ncf). Controller t/: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óduloRuta
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)

  1. 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.
  2. 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

CampoQué es
SuplidorA quién le debes.
NCF proveedorComprobante fiscal del proveedor (alimenta el 606).
Retención ITBIS / ISRImpuestos que retienes al proveedor.
Neto a pagarTotal menos retenciones.
Cuenta banco/cajaDe 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:

DocumentoEfecto en el mayor
PagoNinguno. El asiento se hizo al registrar el pago, no al aplicarlo.
Nota de crédito/débitoNinguno, por la misma razón.
AnticipoSí: 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) y payment.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. Controller t/: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óduloRuta
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)

  1. Menú Inventario → Ítem (nuevo).
  2. Escribe código, nombre, categoría, unidad.
  3. Define si controla stock, su método de costeo (FIFO / promedio / estándar), impuestos y precio.
  4. Guarda.

Paso a paso (movimiento de inventario)

  1. Menú Inventario → Movimiento de Inventario.
  2. Elige el tipo (entrada, salida, traslado…).
  3. Selecciona almacén(es), ítems y cantidades.
  4. 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:

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

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

CampoQué es
Método de costeoCómo se valora la salida (FIFO/promedio/estándar).
Almacén origen/destinoPara traslados.
Serie/LoteTrazabilidad y vencimiento.
CostoValor 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. Controller t/: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

ÍtemSub-pantallasRuta base
BancoBuscar Banco, Banco, Buscar/Cuenta Banco/banco/banco/*
Cargo BancarioBuscar, Detalle/banco/cargo-bancario/*
ChequeBuscar, Detalle, Imprimir en lote/banco/cheque/*
ConciliaciónBuscar, Conciliar/banco/conciliacion/*
Crédito BancarioBuscar, Detalle/banco/credito-bancario/*
Cambio TasaBuscar, Crear/banco/cambio-tasa/*
Depósito BancarioBuscar, Detalle/banco/deposito-bancario/*
MonedaBuscar, Detalle/banco/moneda/*
Solicitud PagoBuscar, Detalle, Pagos Masivos, Aprobaciones Masivas/banco/solicitud-pago/*
Tipo de CuentaBuscar, Detalle/banco/tipo-cuenta/*
Transferencia BancariaBuscar, Transferencia/banco/transferencia-bancaria/*
ReportesReporte Banco, Reporte Dinámico/banco/reporte-banco/*

Paso a paso (transferencia entre cuentas)

  1. Menú Banco → Transferencia Bancaria → Transferencia.
  2. Elige cuenta origen y cuenta destino.
  3. Escribe monto y fecha.
  4. 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.

  1. Menú Banco → Conciliación → Conciliar.
  2. 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.

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

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

CampoQué es
Cuenta banco/cajaLa cuenta afectada.
Cargo bancarioComisión/cargo que cobra el banco.
ChequePago con cheque emitido.
Partida en tránsitoMovimiento 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ía BankAccount/BankTransaction). Controller t/: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óduloRuta
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

  1. 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).
  2. Desembolso: menú Desembolso. Registra cada gasto: cuenta de gasto, monto, beneficiario, comprobante. El fondo disponible baja.
  3. 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

CampoQué es
Monto del fondoTope del efectivo asignado.
Cuenta de gastoClasifica cada desembolso.
DisponibleLo que queda en el fondo.
ReposiciónReembolso 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 CombinedAuthGuard propio) — 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. Controller t/:slug/petty-cash/:companyId.
  • Skill: utilara-petty-cash-production. GOTCHA: permisos en doble copia .ts/.mjs; no usar CombinedAuthGuard dentro 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óduloRuta
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

  1. 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.)
  2. Depreciar: menú Depreciación. Selecciona el período y ejecuta → genera el asiento de gasto por depreciación.
  3. Revalorizar (opcional): ajusta el valor del activo al alza/baja.
  4. Retirar/dar de baja: menú Retiro. Registra venta o desecho → calcula ganancia/pérdida y genera el asiento.

Campos explicados

CampoQué es
CostoValor de adquisición.
Vida útilAños/períodos a depreciar.
Valor residualValor estimado al final.
MétodoLínea recta, saldo decreciente, unidades.
Depreciación acumuladaLo 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. Controller t/: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

RequisitoDónde
Tienda creadaFacturación → Tiendas
Almacén asignado con existenciasInventario → Almacén
Secuencia de NCF activa (normalmente B02 consumidor final)Impuestos → Serie Fiscal
Cuenta de cajaBanco → Cuenta Banco
Usuario con permisos de POSSeguridad → Perfiles

Permisos — cada acción tiene el suyo

Esto es lo que permite dar a un cajero solo lo que necesita:

PermisoQué habilita
pos:readVer tiendas, sesiones y ventas
pos:open-sessionAbrir turno
pos:sellVender y cobrar
pos:sell-on-creditVender a crédito
pos:apply-discountAplicar descuento
pos:override-priceCambiar el precio (queda auditado)
pos:void-saleAnular una venta
pos:return-saleProcesar una devolución
pos:refundReembolsar
pos:reprintReimprimir el comprobante
pos:cash-in / pos:cash-outRegistrar aporte o retiro de caja
pos:close-sessionCerrar turno (arqueo)
pos:approve-differenceAprobar una diferencia de arqueo
pos:view-reportsVer reportes
pos:manage-terminalsAdministrar tiendas y cajas
Recomendación: un cajero típico necesita read, open-session, sell, close-session y reprint. No le des void-sale, override-price ni approve-difference: esos son del encargado.

Abrir el turno

  1. Entra al Terminal POS y elige tu tienda / caja.
  2. Pulsa Abrir turno.
  3. Declara el fondo inicial (el efectivo con el que empiezas).

Sin turno abierto no se puede vender.

Vender

  1. Agrega artículos: por código de barras, por búsqueda o desde el catálogo en pantalla.
  2. Ajusta cantidades.
  3. Elige el cliente si aplica (para consumidor final no es obligatorio; para crédito, sí).
  4. Cobra: elige el método de pago e indica el efectivo recibido — el sistema calcula el

cambio.

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

MovimientoCuá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ónAcciónPermiso
Te equivocaste al cobrar, el cliente no se llevó nadaAnular ventapos:void-sale
El cliente devuelve mercancíaDevoluciónpos:return-sale
Hay que regresar dineroReembolsopos: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)

  1. Cuenta el efectivo físico en caja.
  2. Pulsa Cerrar turno y declara lo contado.
  3. El sistema compara contra lo esperado y muestra la diferencia.
ResultadoQué pasa
Sin diferenciaEl turno cierra
Con diferenciaPuede 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íntomaCausaSolución
No deja venderNo hay turno abiertoAbre el turno
Falta el botón de descuento o anulaciónFalta el permisoEl encargado debe autorizar
Un artículo no apareceSin existencia en el almacén de la tienda, o inactivoRevisa el inventario del almacén
No emite comprobante fiscalSecuencia agotada o vencidaRegistra una serie nueva
El arqueo no cuadraFaltó registrar un aporte o retiroRegí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

PermisoQué habilita
project:readVer proyectos, tareas y horas
project:createCrear proyectos
project:updateEditar proyectos
project:deleteEliminar proyectos
project:manage-tasksCrear y editar tareas, y registrar horas
project:auditVer la auditoría del proyecto

Los botones de eliminación no aparecen si no tienes el permiso.

Crear un proyecto

CampoNota
NombreIdentificación del trabajo
Tipo de proyectoDel catálogo Tipos de Proyecto
ClienteA quién se le factura
FechasInicio y fin previstos
EstadoAvance del proyecto
PresupuestoReferencia 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.
ConceptoDe dónde sale
IngresosAsientos de venta con ese proyecto
CostosAsientos de costo y gasto con ese proyecto
MargenDiferencia entre ambos
Ejecución presupuestariaComparació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

ExpectativaRealidad
Diagrama de GanttNo existe
Dependencias entre tareasNo existe
Asignación de recursos y capacidadNo existe
Facturación automática por avance de obraNo existe: se factura manualmente
Rentabilidad en tiempo real de documentos en borradorNo: solo asientos posteados

Problemas frecuentes

SíntomaCausaSolución
La rentabilidad sale en ceroLos documentos no llevan proyecto asignadoAsígnalo al registrarlos
Falta un proyecto en el selectorPertenece a otra empresa, o está inactivoRevisa la empresa seleccionada
No puedo crear tareasFalta project:manage-tasksSolicita el permiso
No aparece el botón de eliminarFalta project:deleteEs 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)

  1. Registra empleados y departamentos.
  2. Crea una corrida de nómina (PayrollRun) del período.
  3. El sistema calcula las líneas (salario, deducciones) y devenga (asiento balanceado).
  4. 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). Manifest apps/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

PermisoQué habilita
tax:readVer reglas, retenciones y reportes
tax:manage-rulesCrear reglas fiscales y nuevas vigencias
tax:manage-withholdingsGestionar categorías de retención
tax:override-calculationSustituir la retención calculada (queda auditado)
tax:auditVer la auditoría de configuración fiscal
ncf:read / ncf:create / ncf:update / ncf:deleteSeries y comprobantes
ncf:generate-606 / -607 / -608Generar la versión del reporte
ncf:export-606 / -607 / -608Descargar 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-calculation se 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

ReporteQué declara
606Compras de bienes y servicios
607Ventas de bienes y servicios
608Comprobantes anulados
609Pagos al exterior
IR-17Retenciones y retribuciones complementarias
IR-3Declaración de retenciones de asalariados
IT-1Declaración mensual de ITBIS
TSSNovedades y dependientes adicionales

Qué entra y qué no

Documento606607608
Factura de venta posteada y no anulada—Sí—
Factura de venta anulada—NoSí
Factura de venta en borrador—No (no tiene NCF)—
Factura de compra con NCF del proveedorSí——

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

  1. Cierra la facturación del mes.
  2. Revisa que no queden facturas en borrador que debían emitirse.
  3. Genera el 607 y ejecuta la conciliación contra la contabilidad.
  4. Genera el 606 y verifica que los NCF de proveedor estén completos.
  5. Genera el 608 y confirma que corresponde a lo anulado.
  6. Descarga los CSV y preséntalos.
  7. Cierra el período contable para que nadie modifique lo declarado.

Problemas frecuentes

SíntomaCausaSolución
Una factura no aparece en el 607Está en borrador o fue anuladaPostéala, o búscala en el 608
El 606 tiene filas sin NCFLa factura de compra se registró sin el NCF del proveedorComplétalo en la factura
La conciliación muestra diferenciaHay ventas contabilizadas sin comprobante, o comprobantes sin asientoRevisa el detalle que da la pantalla
No puedo descargar el CSVFalta el permiso de exportaciónSolicita ncf:export-60X
Se agotó la secuencia a mitad de mesUmbral de alerta muy bajo o rango pequeñoSube 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ónRuta
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)

  1. Al emitir una factura (ver facturacion.md), elige la serie NCF. El sistema asigna el siguiente número sin huecos.
  2. El NCF queda consumido y aparece en el 607.

Paso a paso (reporte 607)

  1. Menú Impuestos → Reporte 607.
  2. Selecciona el período.
  3. 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 reutiliza NcfService/EcfXmlService del core). Modelos Ecf*.
  • 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

PermisoQué habilita
finance:view-financial-statementsVer los estados financieros
finance:view-analysisVer el análisis financiero
finance:view-ratiosVer indicadores y ratios
finance:view-fxVer la diferencia cambiaria
finance:manage-budgetGestionar el presupuesto
finance:approve-budgetAprobar el presupuesto
finance:dynamic-reportUsar 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:

  1. Que las tasas de cambio estén cargadas (Banco → Cambio Tasa).
  2. 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.

ConceptoDetalle
Dimensiones por líneaCuenta, centro de costo, departamento, sucursal y proyecto
ImportaciónCSV, con columnas departmentCode, branchCode, projectName
AprobaciónPermiso separado (finance:approve-budget)
EjecuciónSe 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

ContabilidadFinanzas
EnfoqueRegistrar y cerrarAnalizar
Estados financierosSíSí (mismos datos)
Asientos, períodos, cierresSíNo
Indicadores y ratiosNoSí
Diferencia cambiaria como reporteNoSí
Consolidación e intercompañíaSíNo

Ambos leen la misma contabilidad: no hay dos fuentes de verdad.

Problemas frecuentes

SíntomaCausaSolución
Un estado financiero sale vacíoNo hay asientos posteados en el rango, o filtras por otra empresaRevisa fechas y empresa
Los ratios salen absurdosCuentas mal clasificadas en el catálogoRevisa la naturaleza de las cuentas
La diferencia cambiaria sale en ceroFaltan tasas o falta la configuración de cuentas por monedaRevisa Banco → Cambio Tasa y las cuentas por moneda
No veo el móduloFaltan permisos de financeSolicí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)

  1. Instala y entra a CRM desde el menú.
  2. Revisa el Dashboard.
  3. Configura las secciones necesarias en Configuración.
  4. 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.hiddenCodes la 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 modelos Crm*. 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)

GrupoReporteRuta
ContabilidadBalance de comprobación/contabilidad/balance
ContabilidadLibro mayor/accounting/ledger
ContabilidadEstado de resultados/accounting/profit-loss
ContabilidadBalance general/accounting/balance-sheet
ContabilidadFlujo de efectivo/accounting/cash-flow
Ventas y CxCCuentas por cobrar/contabilidad/cxc
Compras y CxPCuentas por pagar/contabilidad/cxp
InventarioBalance 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

  1. Menú Reportes → elige el grupo y el reporte.
  2. Define período/filtros.
  3. 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

DocumentoMóduloEstado
primeros-pasos.mdIngreso, empresa, navegaciónListo
dashboard.mdPanel de inicioCasi listo
facturacion.mdFacturación / Ventas / POSListo
cuentas-por-cobrar.mdCxC (clientes, recibos, notas)Listo
cuentas-por-pagar.mdCxP (suplidores, pagos, notas)Listo
compras.mdCompras (OC, recepción, factura)Listo
inventario.mdInventario (ítems, movimientos)Listo
banco.mdBanco (cuentas, cheques, transferencias)Casi listo
contabilidad.mdContabilidad (diario, mayor, reportes)Listo
activos-fijos.mdActivos FijosListo
caja-chica.mdCaja ChicaListo
ncf-dgii.mdNCF / DGII (app instalable)Listo
crm.mdCRM (app instalable)Casi listo
rrhh.mdRRHH / Nómina (app instalable)Casi listo
reportes.mdReportesCasi listo
configuracion.mdConfiguración generalCasi listo
seguridad.mdSeguridad (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

  1. Menú Seguridad → Usuarios → Usuario (nuevo).
  2. Registra nombre, correo y datos básicos.
  3. Guarda / envía invitación (el usuario define su contraseña al aceptar).
  4. Menú Seguridad → Usuario → Perfiles Usuario: asigna uno o más perfiles.

Campos explicados

CampoQué es
CorreoIdentificador de login.
Perfil(es)Determinan sus permisos.
EstadoActivo/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

ConceptoQué es
RecursoUn área/módulo, ej. cxc, cxp, inventory, accounting, fixed-assets, banking, purchasing, petty-cash, hr, crm.
AcciónQué se hace: read, create, update, delete, y especiales (ej. fixed-assets:depreciate, fixed-assets:dispose, recurring_journal:approve).
PermisoLa combinación recurso:acción.
PerfilConjunto de permisos que se asigna a usuarios.

Paso a paso (definir permisos de un perfil)

  1. Menú Seguridad → Perfiles → Permisos Perfil (SecPerfilPermisosPage).
  2. La matriz muestra el catálogo de permisos = núcleo ERP + apps instaladas (GET /permissions/catalog).
  3. Marca las acciones permitidas por recurso.
  4. Guarda.
  5. 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álogo tenant-runtime/permissions/permission-catalog.ts. Guard tenant-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

ConceptoQué es
TenantUna 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).
SlugIdentificador 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.md y ../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 en backend/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…UsaPor qué
Cada local tiene su propio RNC y presenta declaraciones aparteEmpresaContabilidad, numeración y NCF independientes
Todos los locales facturan con el mismo RNC pero quieres ver el resultado por localSucursalDimensión contable dentro de una misma contabilidad
Quieres saber cuánta mercancía hay en cada sitioAlmacénControla existencias
Quieres cobrar en mostrador con cajas y turnosTiendaPunto 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)
AspectoDetalle
Qué tiene propioPlan de cuentas, períodos fiscales, numeración de documentos, secuencias de NCF, cuentas contables por defecto, moneda base
Qué se comparte entre empresasUsuarios, perfiles, catálogo de monedas
Cómo se creaCódigo y nombre. La primera se crea con Inicializar ahora
ConsolidaciónContabilidad → Consolidación combina varias empresas
Operaciones entre ellasContabilidad → 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
CampoNota
CódigoSe guarda en mayúsculas. Único por empresa
NombreLegible

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ón para 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

ErrorConsecuenciaCorrección
Crear una empresa por local con el mismo RNCContabilidad y NCF fragmentados, hay que consolidar para todoUsar sucursales
Usar sucursales para controlar existenciasNunca sabrás cuánto hay en cada sitioCrear almacenes
Un solo almacén para varios localesEl stock no cuadra con la realidad físicaUn almacén por local
No asignar sucursal en los asientosLos reportes por sucursal salen vacíosAsignarla 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

CampoValor
codecrm
nameCRM (Citrus)
depends_onutilara-erp
minPlanBASIC
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.hiddenCodes puede ocultar la app.
  • AppRequirementGuard ya 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

CampoValor
codedental
nameDental
depends_on— (no declara dependencia en su manifest)
menúdental
permisos declarados5

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 (memoria project_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

CampoValor
codencf-dgii
nameNCF / DGII
depends_onutilara-erp
minPlanBASIC
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

CampoValor
codehr
nameRecursos Humanos
depends_onutilara-erp
minPlanBASIC
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

CampoValor
codeveterinary
nameVeterinaria
depends_onutilara-erp
minPlanBASIC
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_onminPlan
utilara-erp (core)——
dental— (independiente)—
crmutilara-erpBASIC
ncf-dgiiutilara-erpBASIC
hrutilara-erpBASIC
veterinaryutilara-erpBASIC
dental no declara depends_on en su manifest (app vertical más autónoma). El resto de apps requieren el core utilara-erp.

Por qué importa

  • Las apps que dependen de utilara-erp reutilizan 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/). Ver crear-nueva-app-instalable.md.
Instalar y desinstalar una appEstado: Listo.

Estado: Listo.

Instalar

AcciónMétodo y ruta
Ver instaladasGET t/:slug/apps
Ver disponiblesGET t/:slug/apps/available
InstalarPOST t/:slug/apps/:code/install
DesinstalarDELETE t/:slug/apps/:code/uninstall

Desde la UI: Catálogo de Apps del tenant → Instalar / Desinstalar.

Qué pasa al instalar (AppInstallerService.install)

  1. Crea/actualiza InstalledApp con enabled=true.
  2. Siembra los permisos de la app y los otorga al perfil ADMIN (idempotente).
  3. Registra las entradas de menú del manifest de la app.

Qué pasa al desinstalar

  1. Marca enabled=false.
  2. Dispara onAppUninstalled(tenant, code) (limpieza de integraciones).
  3. 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.hiddenCodes puede ocultar una app aunque esté instalada.

Validaciones

  • Dependencias: una app con depends_on requiere que la base esté instalada (ej. crm, hr, ncf-dgii, veterinary dependen de utilara-erp). Ver dependencias-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

DocumentoApp (code)Estado
dental.mddental — clínica dentalCasi listo
ncf-dgii.mdncf-dgii — comprobantes fiscales e-CF / DGIIListo
crm.mdcrm — CRM (Citrus)Casi listo
hr.mdhr — RRHH / NóminaCasi listo
veterinary.mdveterinary — clínica veterinariaListo

Guías transversales

DocumentoTema
install-uninstall.mdCómo instalar y desinstalar una app
dependencias-de-apps.mddepends_on, apps que requieren otras
crear-nueva-app-instalable.mdCrear 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, conceptosMenú Contabilidad (/accounting/config)
Impuestos, retenciones, series NCFMenú Impuestos
Listas de precios, descuentos, vendedoresMenú Facturación
Monedas y tasasMenú Banco → Moneda / Cambio Tasa
Almacenes, categorías, unidadesMenú Inventario
Usuarios, perfiles, permisos por áreaMenú Seguridad
Apps instalablesCatálogo de Apps (ver ../administrativo/apps-instalables.md)

Paso a paso

  1. Identifica qué vas a configurar (usa la tabla anterior).
  2. Ve al módulo correspondiente y su pantalla de Configuración / catálogo.
  3. 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 NCFMenú Impuestos
Facturación (listas de precios, descuentos, vendedores, tiendas)Menú Facturación
Inventario (almacenes, categorías, unidades, marcas)Menú Inventario
Banco/MonedasMenú Banco
Seguridad (usuarios, perfiles, permisos por área)Menú Seguridad → Configuración
AppsCatálogo de Apps

Paso a paso

  1. Identifica el parámetro con la tabla.
  2. Ve al módulo → su pantalla de configuración/catálogo.
  3. 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ónRuta
Moneda/banco/moneda/*
Cambio Tasa/banco/cambio-tasa/*
Conversión / Diferencia cambiaria (Finanzas)/finanzas/conversion-moneda, /finanzas/diferencia-cambiaria

Paso a paso

  1. Menú Banco → Moneda: registra la moneda (código, símbolo).
  2. 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ónRuta
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)

  1. Menú Impuestos → Impuesto Configuración (nuevo).
  2. Define la tasa (ej. 18%), la cuenta contable asociada (ITBIS por pagar / adelantado) y su aplicación.
  3. Asocia el impuesto a los ítems correspondientes.

Paso a paso (retenciones)

  1. Menú Impuestos → Retenciones.
  2. Define la categoría de retención (ITBIS/ISR), tasa y cuenta.
  3. 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: ver ncf-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

TipoEjemplo¿Configurable?
Interna — identifica el documento dentro del sistemaFAC-2026-000019No
Fiscal (NCF) — el número que exige la DGIIB0100000026Sí, 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>
DocumentoPrefijoEjemplo
Factura de ventaFACFAC-2026-000019
Recibo / cobroPAGPAG-2026-000004
Anticipo de clienteANTCANTC-2026-000002
ClienteCLICLI-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ó:

CampoQué controla
TipoB01, B02, B04, E31…
Número de autorizaciónEl emitido por la DGII
Número inicial / finalEl rango autorizado
Vigente desde / hastaFechas de validez
Umbral de alertaCuántos comprobantes libres quedan para avisarte (por defecto 50)
ActivaSi 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 borradorNo
PostearSí
Posteo fallidoNo
Anular una factura posteadaEl 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 facturasNo
Empezar la numeración interna en otro númeroNo
Series internas por sucursalNo
Registrar varios rangos de NCFSí
Tener B01 y B02 a la vezSí
Que me avise cuando se acaben los NCFSí, con el umbral de alerta
Reutilizar el NCF de una factura anuladaNo — 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

  1. Menú Contabilidad → Plan de Cuentas.
  2. Crea una cuenta: código, nombre, tipo (activo, pasivo, patrimonio, ingreso, gasto) y si es de movimiento o agrupadora.
  3. 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ódigoCuentaSe usa en
110101Caja/EfectivoCobros y pagos
110201Cuentas por CobrarFacturas de venta
110301InventarioEntradas/salidas
110401ITBIS adelantadoCompras
210101Cuentas por PagarFacturas de proveedor
210201ITBIS por pagarVentas
210203 / 210204Retención ITBIS / ISRCompras con retención
410102IngresosVentas
510101Costo de venta (COGS)Salidas de inventario
520105GastoCompras/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

  1. Menú Inventario → Almacén (nuevo).
  2. Registra código, nombre, ubicación.
  3. 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)

  1. Menú Impuestos → Serie Fiscal (nuevo).
  2. 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.
  3. Guarda. Facturación asignará el siguiente número disponible al emitir.

Campos explicados

CampoQué es
Tipo de NCFClase de comprobante DGII.
Rango desde/hastaNúmeros autorizados.
VencimientoFecha límite de uso.
Secuencia actualPró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

  1. Entra al Catálogo de Apps del tenant (pantalla apps/).
  2. Elige la app y presiona Instalar.
  3. 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ú.
  1. Para quitarla, presiona Desinstalar (marca enabled=false).

Endpoints reales

AcciónMétodo y ruta
Listar instaladasGET t/:slug/apps
Listar disponiblesGET t/:slug/apps/available
InstalarPOST t/:slug/apps/:code/install
DesinstalarDELETE 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 AppRequirementGuard ya 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.hiddenCodes puede ocultarla.
  • "Install respondió error pero la app quedó activa": bug histórico corregido (no marcar enabled si 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. Guard AppRequirementGuard.
  • 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.md y ../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ónPor defectoRecomendado
Longitud mínima810 o más
Exigir letras y númerosNoSí
Exigir mayúsculaNoSí
Exigir carácter especialNoOpcional
Bloqueo tras N intentos fallidos0 (desactivado)5
Duración del bloqueo15 minutos15–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

AspectoComportamiento
Duración de la sesión activa15 minutos, renovada automáticamente mientras se usa
Sesión recordadaHasta 30 días de inactividad
RotaciónCada renovación emite una credencial nueva e invalida la anterior
Reutilización detectadaSi una credencial ya usada se presenta otra vez, se revoca toda la cadena de esa sesión
Sesiones visiblesCada usuario ve sus sesiones activas con fecha, IP y vencimiento
Cierre remotoSe 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óndeQué 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 registrosQuié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

  1. Una cuenta por persona. Las cuentas compartidas destruyen la auditoría: no se sabe

quién hizo qué.

  1. Perfiles por función, no por persona. Crea Cajero, Contador, Compras; asigna

personas a esos perfiles.

  1. Mínimo privilegio. Empieza restrictivo y añade permisos cuando hagan falta.
  2. Separa las acciones críticas. Quien registra no debería ser quien aprueba ni quien

cierra períodos.

  1. Al menos dos administradores, nunca uno solo. El sistema impide quedarse sin ninguno,

pero uno solo es un punto único de fallo.

  1. Revisa los accesos cada trimestre, y desactiva de inmediato a quien deja la empresa.
  2. MFA obligatorio para administradores.
  3. Revisa las API Keys: revoca las que llevan meses sin uso.

8. Permisos que conviene restringir

PermisoPor qué
accounting:close-period / reopen-periodReabrir un período permite alterar cifras ya declaradas
accounting:manage-chartCambiar el catálogo afecta toda la contabilidad
inventory:view-costLos costos son información comercial sensible
pos:override-price / apply-discountAfectan directamente el margen
tax:override-calculationSustituye un cálculo fiscal
security:*Quien administra la seguridad puede darse cualquier permiso
user:create / user:deleteControl sobre quién entra
Cualquier :deleteAnulan documentos

9. Qué hacer si crees que una cuenta fue comprometida

Actúa en este orden:

  1. Cierra todas las sesiones de esa cuenta (Cerrar todas las sesiones).
  2. Cambia la contraseña.
  3. Activa MFA en esa cuenta si no lo tenía.
  4. Revisa la bitácora de actividad de los últimos días: busca accesos a horas inusuales o

cambios que el usuario no reconozca.

  1. Revisa las API Keys: si la cuenta comprometida pudo crear llaves, revócalas.
  2. Revisa los usuarios: confirma que no se creó ninguna cuenta nueva.
  3. Si hubo movimientos indebidos, anúlalos (no los borres: la anulación deja rastro).
  4. 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óduloRuta
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)

  1. Menú Seguridad → Usuarios → crea el usuario (o invítalo).
  2. Menú Seguridad → Perfiles → Permisos Perfil: define qué puede hacer un perfil (por recurso y acción: read/create/update/delete y acciones especiales).
  3. Menú Seguridad → Usuario → Perfiles Usuario: asigna el perfil al usuario.

Campos explicados

ConceptoQué es
RecursoÁrea/módulo (ej. cxc, inventory, accounting).
AcciónQué se puede hacer (read, create, update, delete, y especiales como depreciate).
PerfilConjunto de permisos que se asigna a usuarios.
Permiso de campo/filaRestricció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

DocumentoTemaEstado
empresas-y-tenants.mdEmpresas, sucursales, multi-tenantCasi listo
usuarios.mdAlta/baja de usuarios, invitacionesListo
roles-y-permisos.mdPerfiles, permisos por recurso/acción, RBACListo
configuracion-general.mdParámetros generalesCasi listo
monedas.mdMonedas y tasas de cambioCasi listo
impuestos.mdITBIS, retenciones, reglas fiscalesCasi listo
ncf-dgii.mdSeries NCF, configuración DGIIListo
cuentas-contables.mdPlan de cuentasListo
almacenes.mdAlmacenes / bodegasListo
apps-instalables.mdInstalar/desinstalar appsListo
mantenimiento-operativo.mdReinicios, backups, salud del sistemaCasi listo

Orden recomendado de configuración inicial (nueva empresa)

  1. Crear/entrar a la empresa (tenant) → empresas-y-tenants.md
  2. Configurar monedas e impuestos → monedas.md, impuestos.md
  3. Revisar el plan de cuentas sembrado → cuentas-contables.md
  4. Configurar series NCF (si factura fiscal en RD) → ncf-dgii.md
  5. Crear almacenes → almacenes.md
  6. Crear usuarios y asignar perfiles/permisos → usuarios.md, roles-y-permisos.md
  7. 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

DocumentoTemaEstado
principios-contables-del-erp.mdDébito/crédito, cuentas, cómo pensarListo
plan-de-cuentas.mdCatálogo de cuentas y códigos usadosListo
periodos-contables.mdPeríodos, apertura/cierreCasi listo
asientos-contables.mdDiario, asientos manuales, recurrentesListo
facturacion-y-cxc.mdFactura de venta, cobro, nota de créditoListo
compras-y-cxp.mdFactura de proveedor, pago, retencionesListo
inventario-y-costo.mdEntradas/salidas, costo de venta (COGS)Listo
banco-y-conciliacion.mdMovimientos de banco, conciliaciónCasi listo
caja-chica.mdDesembolsos, reposiciónListo
activos-fijos.mdDepreciación, retiro, revalorizaciónListo
nomina.mdDevengo y pago de nóminaCasi listo
ncf-dgii.mdComprobantes fiscales, 606/607/608Listo
reportes-financieros.mdEstado de Resultados, Balance, FlujoListo
cierres-contables.mdCierre de período/añoParcial
reversas-y-anulaciones.mdCómo se revierte cada operaciónListo

Cómo se leen los asientos en este manual

Usamos esta tabla en todos los ejemplos:

CuentaDébitoCrédito
(nombre y código)monto que entra a la cuentamonto 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óduloRuta
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)

  1. Menú Contabilidad → Diario (nuevo).
  2. Escribe fecha, concepto/descripción.
  3. Agrega líneas: cuenta, débito o crédito, descripción.
  4. Verifica que total débito = total crédito (el sistema lo exige).
  5. Guardar (borrador) y Postear para afectar el mayor.

Campos explicados

CampoQué es
CuentaDel plan de cuentas (código + nombre).
Débito / CréditoLos dos lados del asiento; deben sumar igual.
ConceptoMotivo del asiento.
PeríodoDebe 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. Controller t/:slug/accounting. Reportes en sub-controllers (trial-balance, profit-loss, balance-sheet, cash-flow).
  • Asientos automáticos: reglas en accounting-rules.defaults.ts disparadas por eventos de dominio. Ver ../tecnico/eventos-y-gl.md.
  • Skill: utilara-accounting-production. Pendiente: cierre de período como saga real (hoy setPeriodStatus es 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:

CuentaDébitoCrédito
Cuentas por Cobrar (110201)1,180.00
Ingresos (410102)1,000.00
ITBIS por pagar (210201)180.00
Total1,180.001,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érminoEn simple
AsientoUn registro contable con sus líneas de débito/crédito.
PostearConfirmar el asiento para que afecte el mayor.
GL (General Ledger)El mayor general.
CxC / CxPLo que te deben / lo que debes.
COGSCosto de la mercancía vendida.
ITBISImpuesto 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

TipoEjemplosSube con
ActivoCaja, Bancos, CxC, Inventario, Activos fijosDébito
PasivoCxP, ITBIS por pagar, retenciones, préstamosCrédito
PatrimonioCapital, resultados acumulados, superávitCrédito
IngresoVentas, otros ingresosCrédito
Gasto/CostoCosto de venta, gastos operativos, depreciaciónDébito

Cuentas que el ERP usa automáticamente (por defecto)

CódigoCuentaUsada por
110101Caja/EfectivoCobros, pagos, caja chica
110201Cuentas por CobrarFacturas venta, cobros, notas
110301InventarioMovimientos de inventario
110401ITBIS adelantadoCompras
120201Depreciación acumuladaDepreciación
210101Cuentas por PagarFacturas proveedor, pagos
210201ITBIS por pagarVentas
210203Retención ITBISCompras con retención
210204Retención ISRCompras con retención
410102IngresosVentas
510101Costo de venta (COGS)Salidas de inventario
520104Gasto por depreciaciónDepreciación
520105Gasto / compra / ajusteCompras, 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 y companyId.
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ódigoCuenta
110101Caja / Efectivo
110201Cuentas por Cobrar (CxC)
410102Ingresos (ventas)
210201ITBIS 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:

CuentaDébitoCré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:

CuentaDébitoCré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:

CuentaDébitoCré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). Backend tenant-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ódigoCuenta
520105Gasto / compra
110401ITBIS adelantado (a favor)
210101Cuentas por Pagar (CxP)
210203Retención ITBIS por pagar
210204Retención ISR por pagar
110101Caja / 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:

CuentaDébitoCré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:

CuentaDébitoCré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.sent en accounting-rules.defaults.ts. Backend tenant-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ódigoCuenta
110301Inventario
510101Costo de venta (COGS)
520105Contrapartida 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:

CuentaDébitoCré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:

CuentaDébitoCré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.movement con condiciones por movementType (RECEIPT/RETURN_IN/IN/INBOUND vs DELIVERY/RETURN_OUT/OUT/OUTBOUND). Backend tenant-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:

CuentaDébitoCrédito
Banco B10,000.00
Banco A10,000.00

Cargo bancario / comisión — RD$500:

CuentaDébitoCrédito
Gasto bancario500.00
Banco500.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)

  1. Menú Banco → Conciliación → Conciliar.
  2. Selecciona cuenta y período.
  3. Marca los movimientos que aparecen en el estado del banco.
  4. Identifica las partidas en tránsito.
  5. 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). Skills utilara-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

CuentaRol
Caja Chica (activo)El fondo de efectivo.
BancoDe 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:

CuentaDébitoCrédito
Caja Chica5,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:

CuentaDébitoCrédito
Gasto (transporte)300.00
Caja Chica300.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:

CuentaDébitoCrédito
Caja Chica (contrapartida)300.00
Banco300.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). Backend tenant-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ódigoCuenta
520104Gasto por depreciación
120201Depreciació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:

CuentaDébitoCré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:

CuentaDébitoCrédito
Depreciación acumulada (120201)6,000.00
Caja/proceeds (ingreso de la venta)5,900.00
Cuenta del activo10,000.00
ITBIS por pagar900.00
Ganancia en venta de activos1,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.
CasoDébitoCrédito
AlzaActivoSuperávit (patrimonio)
BajaPérdidaActivo

¿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 (eventos asset_depreciation, asset_disposal, asset_revaluation, más sus *_void). Backend tenant-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)

RolConfig
Gasto de sueldossalaryExpenseCode
Sueldos por pagar (neto)salaryPayableCode
TSS por pagartssPayableCode
ISR por pagarisrPayableCode
INFOTEP por pagarinfotepPayableCode
Otras deducciones por pagarotherDeductionsPayableCode
Gasto contribución patronalemployerContribExpenseCode
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):

CuentaDébitoCrédito
Gasto de sueldos50,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):

CuentaDébitoCrédito
Sueldos por pagar42,000.00
Banco42,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 en PayrollConfig (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

ReporteQué contieneFuente
606Compras y gastos (con NCF de proveedores)Facturas de proveedor (CxP)
607Ventas (con NCF emitidos)Facturas de venta (CxC)
608Comprobantes anuladosNCF anulados
609Pagos al exterior(según configuración)

Paso a paso (607)

  1. Menú Impuestos → Reporte 607.
  2. Selecciona el período.
  3. 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

TipoCómo se origina
AutomáticoLo genera un módulo al operar (factura, pago, inventario, depreciación, nómina…). No lo escribes tú.
ManualLo escribes en Contabilidad → Diario (ajustes, reclasificaciones).
RecurrentePlantilla que se repite (alquileres, provisiones); requiere aprobar/ejecutar.
Apertura / saldos inicialesCarga los saldos al iniciar con el ERP.

Paso a paso (asiento manual)

  1. Menú Contabilidad → Diario (nuevo).
  2. Fecha, concepto/descripción.
  3. Agrega líneas: cuenta, débito o crédito (no ambos en la misma línea), descripción.
  4. Verifica que cuadre.
  5. 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 en validateLines().
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 originalCómo se deshaceEfecto
Factura de ventaAnular / Nota de créditoReversa ingreso, ITBIS y CxC; repone inventario si es devolución
Recibo (cobro)Anular reciboDevuelve el saldo al cliente; reversa el ingreso a caja/banco
Factura de proveedorAnular / Nota de débitoReversa gasto/ITBIS y CxP
Pago a proveedorAnular pagoDevuelve la deuda; reversa la salida de banco
Movimiento de inventarioCancelar movimientoReversa existencia y su asiento
Depreciación(reversa por período)Reversa gasto y depreciación acumulada
Retiro de activoAnular retiroReactiva el activo; reversa el asiento
Desembolso caja chicaAnular desembolsoDr Caja Chica / Cr Gasto
Asiento manualAnular/CancelarAsiento inverso; aparece en Diarios Cancelados

Ejemplo — anular un cobro de RD$1,180

Asiento inverso del payment.received:

CuentaDébitoCré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 *_void en 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. Backend AccountingService.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

EstadoQué permite
AbiertoSe pueden postear asientos con fecha en ese período.
CerradoNo se aceptan asientos nuevos ni ediciones; solo consulta.

Pantallas

FunciónRuta
Períodos Contables/accounting/accounting-periods
Períodos Fiscales (años)/accounting/fiscal-years

Paso a paso (cerrar un período)

  1. Verifica que todo esté registrado (facturas, pagos, inventario, depreciación, nómina).
  2. Revisa la Balanza de Comprobación (debe cuadrar).
  3. 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). Ver cierres-contables.md y la skill utilara-accounting-production (pendiente #22). No prometer un cierre automático completo.

Notas técnicas

  • Backend tenant-runtime/accounting. Pendiente: saga CurrentlyClosing (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ónEstado
Marcar un período como cerrado (bloquea posteos)Listo
Reabrir un período (controlado)Casi listo verificar permisos
Asientos de cierre de resultados automáticosPendiente No implementado como saga
Apertura automática del siguiente ejercicioPendiente No implementado como saga

Cierre mensual recomendado (manual)

  1. Registrar todo (facturas, pagos, inventario, depreciación, nómina).
  2. Ejecutar la depreciación del mes.
  3. Revisar la Balanza de Comprobación (debe cuadrar).
  4. Conciliar bancos.
  5. 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 (estado CurrentlyClosing) — hoy setPeriodStatus es solo flip de enum." No prometer cierre automático completo en demos.

Notas técnicas

  • Backend tenant-runtime/accounting (setPeriodStatus). Ver periodos-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

ReporteRutaQué muestra
Balanza de Comprobación/accounting/trial-balanceSaldo de cada cuenta; total débito = total crédito. Es la verificación de que todo cuadra.
Mayor General/accounting/ledgerTodos los movimientos de cada cuenta.
Estado de Resultados/accounting/profit-lossIngresos − Gastos = Utilidad/Pérdida del período.
Balance General/accounting/balance-sheetActivos = Pasivos + Patrimonio, a una fecha.
Flujo de Efectivo/accounting/cash-flowEntradas 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

  1. Menú Contabilidad (o Reportes) → elige el reporte.
  2. Define período/fecha.
  3. 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. Memoria project_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:

  1. Menú Inventario → Movimiento de Inventario.
  2. Tipo Entrada (para sumar) o Salida (para restar), o un ajuste.
  3. Ítem, almacén, cantidad y motivo.
  4. Postear.

Opción B — Conteo cíclico:

  1. Menú Inventario → Auditoría (/inventory/cycle-counts).
  2. 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

  1. Menú CxC → Recibo (nuevo).
  2. Selecciona el cliente → aparecen sus facturas abiertas.
  3. Marca la(s) factura(s) y el monto (total o parcial).
  4. Indica la cuenta de caja/banco y el medio de pago.
  5. 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

  1. Menú Activos Fijos → Activo Fijo (nuevo).
  2. Registra descripción, costo, fecha de adquisición, vida útil, valor residual, método.
  3. 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

  1. Menú CxC → Cliente.
  2. Pestaña/botón Nuevo.
  3. Completa nombre, RNC/cédula, tipo de cliente, condición de pago y contacto.
  4. 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

  1. Menú Inventario → Ítem (nuevo).
  2. Escribe código, nombre, categoría, unidad.
  3. Define si controla stock, el método de costeo (FIFO/promedio/estándar), impuesto y precio.
  4. 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

  1. Menú Caja Chica → Caja Chica (nuevo).
  2. Define el monto del fondo y la cuenta de banco.
  3. 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

  1. Menú Facturación → Factura → Factura (nuevo).
  2. Selecciona el cliente.
  3. Elige la serie NCF (si aplica).
  4. Agrega líneas (ítem, cantidad, precio, descuento).
  5. Revisa subtotal, ITBIS, total.
  6. 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.
  • PayrollConfig con cuentas de nómina.
  • Empleados con salario.

Pasos

  1. Menú RRHH → asegura empleados y departamentos.
  2. Crea una corrida de nómina del período.
  3. Calcular las líneas (bruto, deducciones, neto).
  4. 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 hr no 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

  1. Menú Activos Fijos → Depreciación.
  2. Selecciona el período.
  3. 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

  1. Abre el Catálogo de Apps del tenant.
  2. Elige la app y presiona Desinstalar.
  • API equivalente: DELETE /t/:slug/apps/:code/uninstall.
  1. 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, normalmente utilara-erp).

Pasos

  1. Abre el Catálogo de Apps del tenant (pantalla apps/).
  2. Elige la app y presiona Instalar.
  • API equivalente: POST /t/:slug/apps/:code/install.
  1. 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

  1. Menú CxP → Pago (o Pago de Contado).
  2. Selecciona el suplidor → sus facturas abiertas.
  3. Marca las facturas y el monto.
  4. Indica la cuenta de banco/caja.
  5. 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

  1. Aprobar la corrida.
  2. Postear (devengar): genera el asiento — Dr Gasto sueldos / Cr Sueldos por pagar (neto) / Cr deducciones.
  3. 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

  1. Menú Caja Chica → Desembolso (nuevo).
  2. Selecciona el fondo, la cuenta de gasto, el monto y el beneficiario/comprobante.
  3. 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

  1. Menú Compras → Orden de Compra (nueva) → aprobar/emitir.
  2. Al llegar la mercancía: Recepción contra la OC (afecta inventario).
  3. 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íaEstado
crear-cliente.mdListo
crear-factura.mdListo
cobrar-factura.mdListo
registrar-compra.mdListo
pagar-proveedor.mdListo
crear-item.mdListo
ajustar-inventario.mdListo
crear-activo-fijo.mdListo
depreciar-activo.mdListo
crear-caja-chica.mdListo
registrar-desembolso.mdListo
crear-nomina.mdCasi listo
postear-nomina.mdCasi listo
instalar-app.mdListo
desinstalar-app.mdListo
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ónQué hacer
La factura está mal completa (cliente, fecha, todo)Anular y emitir una nueva
El cliente devuelve mercancíaNota de crédito de clase devolución
Hay que ajustar el monto sin devoluciónNota de crédito de clase ajuste financiero
Hay que cobrar de másNota de débito

Permiso

cxc:delete.

Pasos

  1. Facturación → Factura → Buscar Factura y abre la factura.
  2. Pulsa Anular.
  3. Confirma.

Qué ocurre exactamente

EfectoDetalle
Asiento de ventaSe genera el asiento espejo: los saldos quedan en cero
Asiento de costoSe revierte igual
InventarioLas cantidades vuelven al almacén del que salieron
Cuenta por cobrarEl saldo del cliente baja por el total de la factura
Cobro de contadoSi la factura era de contado, el cobro se revierte junto con ella
Estado del documentoPasa a Anulada. No se borra: sigue visible
NCFNo 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:

  1. Reabrir el período (permiso accounting:reopen-period) — solo si el mes no se ha

declarado.

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

  1. La factura muestra estado Anulada.
  2. Contabilidad → Diario muestra el asiento de reversión, cuadrado.
  3. Inventario → Existencia en Almacén muestra la cantidad repuesta.
  4. Cuentas por Cobrar → Reporte CxC: el cliente ya no debe esa factura.
  5. Impuestos → Reporte 608 incluye ese NCF; el 607 ya no.

Problemas frecuentes

SíntomaCausaSolución
No aparece el botón AnularFalta cxc:deleteSolicita el permiso
La anulación se rechazaPeríodo cerradoReabre o usa nota de crédito
El inventario no se repusoLa factura no tenía líneas inventariadasCorrecto: solo se repone lo que descontó
El NCF sigue en el 607El reporte se generó antes de anularVuelve 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:

ClaseCuándoQué hace
DevoluciónEl cliente devuelve mercancíaRepone el inventario en un almacén y revierte el costo de venta
Ajuste financieroDescuento posterior, error de precio, bonificaciónSolo ajusta el monto. No toca el inventario

Usar ajuste financiero cuando hubo devolución física deja el inventario descuadrado.

Permiso

cxc:create.

Pasos

  1. Cuentas por Cobrar → Nota de Crédito (/cxc/notas-credito).
  2. Elige el cliente y la factura que se está devolviendo.
  3. Elige la clase: Devolución.
  4. Selecciona las líneas y las cantidades que realmente se devuelven — puede ser

parcial.

  1. Indica el almacén donde entra la mercancía devuelta.
  2. Elige el tipo de comprobante (normalmente B04 — Nota de Crédito).
  3. Guarda como borrador y revisa.
  4. Postea.

Qué queda registrado al postear

EfectoDetalle
InventarioLas cantidades devueltas entran al almacén indicado
Costo de ventaSe revierte al costo original de esa venta, no al costo actual
Cuenta por cobrarEl saldo del cliente baja por el monto de la nota
ITBISSe revierte proporcionalmente
NCFSe emite el comprobante de nota de crédito
ComprobanteSe 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

  1. Inventario → Existencia en Almacén: la cantidad subió en el almacén indicado.
  2. Contabilidad → Diario: el asiento de la nota está cuadrado, con la reversión del costo.
  3. Cuentas por Cobrar → Reporte CxC: el saldo del cliente bajó.
  4. Impuestos → Reporte 607: la nota de crédito aparece con su signo.

Problemas frecuentes

SíntomaCausaSolución
El inventario no cambióElegiste ajuste financieroAnula la nota y emítela como devolución
No deja elegir almacénLa factura no tenía líneas inventariadasCorrecto: sin mercancía no hay reposición
Rechaza el posteoPeríodo cerradoUsa una fecha del período abierto
No hay NCF disponible para B04Falta la secuencia de nota de créditoRegí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ónEfectoPermiso
CerrarEl mes deja de admitir movimientos. Reversibleaccounting:close-period
ReabrirVuelve a admitir movimientosaccounting:reopen-period
BloquearCierre definitivo del períodoaccounting:close-period
Cierre anualCierra el ejercicio completo y traslada el resultadoaccounting: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

  1. Contabilidad → Períodos Contables (/accounting/accounting-periods).
  2. Localiza el mes.
  3. 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»

PuedesNo puedes
Consultar todoPostear un documento con fecha en ese período
Ver e imprimir documentosAnular un documento de ese período
Generar reportesAplicar un cobro o pago con esa fecha
Registrar documentos con fecha del período abiertoRegistrar asientos manuales en el período cerrado

Problemas frecuentes

SíntomaCausaSolución
No se puede postear en período cerradoLa fecha cae en un mes cerradoUsa una fecha del período abierto, o reabre
No aparece el botón CerrarFalta accounting:close-periodSolicita el permiso
La balanza no cuadraHay asientos en borrador o un documento a mediasRevisa el Diario filtrando por estado
El cierre anual no terminaSe ejecuta en segundo planoConsulta 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)
CampoObligatorio
EmailSí — es el identificador de acceso, se guarda en minúsculas y no puede repetirse
ContraseñaSí — debe cumplir la política de la empresa
Nombre completoNo
PerfilesNo (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)
PerfilAlcance
AdministradorAcceso total, incluida configuración y seguridad
GerenteGestión operativa: crear, editar, aprobar, contabilizar
PersonalOperación diaria: leer y crear

Un usuario puede tener varios perfiles: se suman los permisos.

Antes de dar de alta a todo el equipo

  1. Revisa la política de contraseñas (Configurar Usuarios): se aplica en el momento del

alta, no después.

  1. Decide los perfiles por función, no por persona.
  2. Verifica el límite de usuarios de tu plan.

Errores frecuentes

MensajeCausaSolución
Ya existe un usuario con ese emailEl correo está en uso, incluso si la cuenta está inactivaReactiva la existente
Perfiles inválidos: …El nombre de perfil no existeVerifícalo en Seguridad → Perfiles
La contraseña es rechazadaNo cumple la políticaAjústala
Límite de usuarios alcanzadoTope del planConsulta 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

  1. Abre tu perfil.
  2. Entra en Seguridad.
  3. 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-42 es mejor que P@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:

  1. Ve a tu perfil → sesiones activas.
  2. Pulsa Cerrar todas las sesiones.
  3. Vuelve a entrar con la contraseña nueva.

Si crees que tu cuenta fue comprometida

  1. Cambia la contraseña.
  2. Cierra todas las sesiones.
  3. Activa la verificación en dos pasos.
  4. 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

  1. Inventario → Almacén (/inventory/warehouses).
  2. Completa:
CampoNota
CódigoCorto y estable: PRIN, TIENDA1, VEHIC1
NombreLegible
ActivoUn almacén inactivo desaparece de los selectores, sin borrar el histórico
  1. 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

ConceptoControla
AlmacénCuánta mercancía hay en un sitio
SucursalResultado contable por local
TiendaPunto 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ónUso del almacén
Factura de ventaCampo Almacén de despacho — de ahí se descuenta
Recepción de compraAlmacén donde entra la mercancía
TrasladosOrigen y destino
Conteo cíclicoSe cuenta por almacén
Devolución (nota de crédito)Almacén donde vuelve la mercancía

Problemas frecuentes

SíntomaCausaSolución
El almacén no aparece al facturarEstá inactivo, o es de otra empresaRevisa estado y empresa
Aparece pero sin existenciasNunca se cargó ni recibió mercancíaCarga existencia inicial o traslada
El costo de venta sale en ceroExistencia cargada sin costoCorrige la valuación
No puedo eliminar un almacénTiene movimientos asociadosDesactí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

FormatoQué obtienesCuándo usarlo
CSVTexto separado por comas, con marca UTF-8Reimportar en otro sistema, o procesar los datos
EXCELArchivo .xls que Excel abre directoTrabajar la tabla a mano
PDFDocumento listo para imprimir o enviarArchivar 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

PantallaFormatos
Balanza de ComprobaciónCSV · EXCEL · PDF
Estado de ResultadosCSV · EXCEL · PDF
Balance GeneralCSV · EXCEL · PDF
Flujo de EfectivoCSV · EXCEL · PDF
Mayor GeneralCSV · EXCEL · PDF
Consolidación e IntercompañíaCSV · EXCEL · PDF
Reportes de GastoCSV
Reportes de InventarioCSV
Plan de CuentasCSV
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:

ReportePermiso
Contabilidadaccounting:export
Estado de Resultadosprofit_loss:export
Balance Generalbalance_sheet:export
Balanzatrial_balance:export
Mayor Generalgeneral_ledger:export
Reportes 606 / 607 / 608ncf:export-606 / -607 / -608

Si el botón no aparece, es un tema de permisos, no un fallo.

Consejos

  1. Filtra antes de exportar. Es más rápido acotar en pantalla que en Excel.
  2. Para cifras contables definitivas, filtra por estado POSTED: los borradores no son

contabilidad.

  1. Para enviar a un tercero, usa PDF: no se altera por accidente.
  2. 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íntomaCausaSolución
Tildes rotasSe abrió sin indicar UTF-8Importa indicando UTF-8
Todo en una columnaExcel usa punto y coma como separadorImporta con el asistente e indica coma
Archivo vacíoLos filtros no devuelven filasAmplía el rango
No aparece el botónFalta el permiso de exportaciónSolicítalo
El PDF tardaSe genera en el servidorEspera; 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):

CuentaDébitoCré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)

  1. Menú Terminal POS → Terminal. Abrir la sesión (pos-sessions).
  2. Registrar ventas durante el turno (pos-sales).
  3. Al cerrar el turno, arqueo: contar el efectivo y compararlo con lo esperado.
  4. 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

  1. Menú CxC → Recibo (nuevo). API: POST /t/:slug/cxc/:companyId/payments.
  2. Selecciona el cliente → aparecen sus facturas abiertas.
  3. Marca la(s) factura(s) y el monto (total o parcial).
  4. Indica la cuenta de caja/banco y el medio de pago.
  5. (Opcional) registra retención del cliente o descuento por pronto pago.
  6. Aplicar. API: POST .../payments/:id/apply.

Asiento (payment.received, cobro 1,180)

CuentaDébitoCré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:

CuentaDébitoCré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):

CuentaDébitoCré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.

CuentaDébitoCré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:

  • InstalledApp con enabled=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)

  1. Menú Inventario → Movimiento de Inventario.
  2. Tipo Entrada, almacén destino, ítems y cantidades (con costo).
  3. Confirmar/postear → sube existencia + asiento.

Asiento (entrada, costo 800): Dr Inventario (110301) 800 / Cr contrapartida (520105) 800.

Pasos (salida / despacho)

  1. Tipo Salida, almacén origen, ítems y cantidades.
  2. 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):

CuentaDébitoCrédito
Gasto de sueldos50,000
Sueldos por pagar (neto)42,000
TSS/ISR/INFOTEP por pagar8,000

(+ contribuciones patronales como gasto/pasivo adicional.)

5. Pagar

POST .../runs/:id/pay (salida de banco).

CuentaDébitoCrédito
Sueldos por pagar42,000
Banco42,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 hr no 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

  1. Menú CxP → Pago (o Pago de Contado). API: POST /t/:slug/cxp/:companyId/payments.
  2. Selecciona el suplidor → sus facturas abiertas.
  3. Marca las facturas y el monto.
  4. Indica la cuenta de banco/caja.
  5. Aplicar. API: POST .../payments/:id/apply.

Asiento (payment.sent, pago 1,060)

CuentaDébitoCré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

  1. Menú Activos Fijos → Retiro. Registra si es venta (con monto e ITBIS) o desecho. API: POST /t/:slug/fixed-assets/:id/dispose.
  2. 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

CuentaDébitoCrédito
Depreciación acumulada (120201)6,000
Caja/proceeds5,900
Cuenta del activo10,000
ITBIS por pagar900
Ganancia en venta de activos1,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):

CuentaDébitoCrédito
CxC (110201)1,180
Ingresos (410102)1,000
ITBIS por pagar (210201)180

Asiento de costo (COGS, costo 800):

CuentaDébitoCré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):

CuentaDébitoCré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

DocumentoFlujoEstado
venta-completa.mdCliente → ítem → factura → NCF → inventario → cobro → GL → 607Listo
compra-completa.mdProveedor → OC → recepción → factura → CxP → pago → GL → 606Listo
pago-cxc.mdCobro de una factura de clienteListo
pago-cxp.mdPago a un proveedorListo
inventario.mdEntrada, salida, traslado, costoListo
cierre-de-caja.mdCierre de sesión POS / cajaCasi listo
caja-chica.mdFondo → desembolso → reposición → GLListo
depreciacion-activos.mdCrear activo → depreciar → GLListo
retiro-activos.mdRetiro/baja de activo → GLListo
nomina.mdEmpleado → corrida → devengo → pago → GLCasi listo
ncf-607.mdEmisión de NCF y reporte 607Listo
app-install-uninstall.mdInstalar app → menú aparece → usar → desinstalar → menú desapareceListo

Cómo leer cada flujo

Cada documento tiene:

  1. Actores y requisitos previos.
  2. Pasos numerados (con la pantalla real y su ruta).
  3. Qué asiento contable se genera en cada paso (ver también ../contable/).
  4. 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

DocumentoTema
faq.mdPreguntas frecuentes (usuario y admin)
errores-comunes.mdErrores típicos y su causa/solución
recuperacion.mdQué hacer cuando algo se rompe
como-diagnosticar.mdMétodo para diagnosticar un problema
logs.mdDónde están los logs y cómo leerlos
comandos-utiles.mdComandos de operación frecuentes
checklist-soporte.mdChecklist antes de escalar un caso

Los 3 problemas más frecuentes (atajo)

  1. "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.md y ../tecnico/menu-y-overrides.md.
  2. "Cambié algo y no se ve". Backend no reiniciado desde dist, o Service Worker sirviendo caché vieja. Ver errores-comunes.md.
  3. "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ónQué hace
GuardarCrea el borrador. Sin NCF, sin asiento, sin descontar inventario
PostearEmite 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:

CuentaPara qué
Cuentas por CobrarEl débito de la venta a crédito
Ingresos por VentasEl crédito del ingreso
ITBIS por PagarEl impuesto
Caja / BancoEl débito de la venta de contado
InventariosEl crédito del costo (si vendes productos)
Costo de VentasEl 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

CausaSeñalSolución
Límite de crédito del cliente superadoEl error menciona el créditoCobra antes, sube el límite o factura de contado
Existencia insuficienteEl error menciona el stockVerifica la existencia del almacén
PermisosError 403 o el botón no apareceNecesitas cxc:create
Cliente bloqueado comercialmenteEl error menciona el bloqueoRevisa la ficha del cliente

Cómo confirmar que sí contabilizó

  1. El Estatus de la factura ya no es Borrador.
  2. Tiene NCF asignado (si eligió tipo de comprobante).
  3. Contabilidad → Diario muestra el asiento con el número de la factura, cuadrado.
  4. Inventario → Existencia en Almacén refleja la salida.
  5. Cuentas por Cobrar → Reporte CxC muestra 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.

PermisoQué habilita
inventory:readVer artículos y existencias
inventory:view-costVer 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íntomaCausaSolución
Aparece pero con Disp. 0Sin stock en ese almacénTraslada o recibe mercancía
Aparece con costo 0Existencia cargada sin costoCorrige la valuación
No sale en el buscador global (Ctrl+K)La búsqueda global no cubre el catálogo del ERPUsa el buscador de Inventario → Ítem
Sale en inventario pero no en la facturaEstá inactivo o no es de inventarioRevisa 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

PuedesNo puedes
Consultar todo lo del períodoPostear un documento con fecha en ese período
Ver e imprimir documentosAnular un documento de ese período
Generar reportes y exportarAplicar cobros o pagos con esa fecha
Registrar documentos con fecha del período abiertoRegistrar 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

EstadoSignifica
AbiertoAdmite movimientos
CerradoNo admite movimientos. Reversible con permiso
BloqueadoCierre 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:

NecesitoDocumento
Anular una venta de un mes cerradoNota de crédito con fecha actual
Corregir un montoNota de crédito o nota de débito con fecha actual
Corregir una clasificación contableAsiento 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.

  1. Necesitas el permiso accounting:reopen-period.
  2. Contabilidad → Períodos Contables → Reabrir.
  3. Corrige.
  4. 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

MensajeSignifica
No se puede postear en período cerradoLa fecha del documento cae en un mes cerrado
Período contable cerradoIgual, en otra operación
No aparece el botón ReabrirTe falta accounting:reopen-period

Quién debería poder cerrar y reabrir

PermisoQuién
accounting:close-periodContabilidad / responsable financiero
accounting:reopen-periodSolo 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íntomaCausa probableSolución
No aparece un módulo/appSin permiso, app no instalada, override no recargado, hiddenCodesRevisar perfil, instalar app, reiniciar backend, revisar client.sidebar.hiddenCodes
Cambié el menú y no cambiaOverrides se cargan en el boot; 4 fuentes de verdadEditar la fuente correcta y reiniciar backend; purgar override si aplica (../tecnico/menu-y-overrides.md)
Cambié código y no se veBackend corre desde dist, sin hot-reloadRebuild + systemctl --user restart utilara-erp-backend
Frontend con versión viejaService Worker cacheado (sobre todo por túnel)Incógnito, hard-reload, o kill-switch del SW (../tecnico/frontend.md)
403 al operarSin permiso (RBAC) o app no instaladaAsignar permiso al perfil / instalar app
401JWT ausente/expiradoVolver a iniciar sesión
"Período cerrado"La fecha cae en período cerradoUsar 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/vencidaConfigurar/renovar serie (../administrativo/ncf-dgii.md)
"Stock insuficiente"Sin existencia del ítemReponer inventario
Backend no levantaFalta dist/backend/src/main.js (build mal ubicado) → crash-loopRebuild correcto; ver journalctl (../tecnico/despliegue.md)
409 al aplicar pago/anticipoConcurrencia / doble aplicaciónReintentar; revisar si ya se aplicó
Build falla con OOMnest build sin heap ampliadoUsar el script (NODE_OPTIONS=--max-old-space-size=6144)
Módulo caja chica no respondeCombinedAuthGuard mal usado / permisos en una sola copiaNo usar guard combinado en el módulo; editar .ts y .mjs

Regla mental para "no se ve el cambio"

  1. ¿Reinicié el backend? (código y menú/override)
  2. ¿Estoy en Incógnito? (Service Worker)
  3. ¿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áginanginx, build del frontend, consola del navegador
Error 401/403Sesión (JWT), permisos del perfil, app instalada
Error 500 / datos rarosLogs del backend (journalctl)
Menú incompletoOverrides + reinicio del backend
Contabilidad no cuadraBalanza, 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

  1. systemctl --user status utilara-erp-backend.
  2. Revisar logs: journalctl --user -u utilara-erp-backend -n 100.
  3. Causa típica: falta dist/backend/src/main.js (build mal ubicado) → rebuild correcto (cd backend && npm run build) y systemctl --user restart utilara-erp-backend.
  4. Confirmar curl localhost:3000/health → 200.

El sitio no carga (nginx)

  1. sudo nginx -t (validar config).
  2. sudo systemctl reload nginx.
  3. Verificar que frontend/dist existe (rebuild del frontend si no).
  4. Revisar el túnel Cloudflare si es acceso externo.

Un despliegue salió mal

  1. Revertir el commit: git revert <sha> o git reset --hard <sha_bueno> (con cuidado).
  2. Re-desplegar: ./deploy/deploy.sh.
  3. Si hubo migración destructiva, restaurar backup de la base afectada.

El menú quedó roto tras un cambio

  1. Confirmar qué fuente editaste (4 fuentes; gana tenant_module_overrides).
  2. Reiniciar el backend (los overrides se cargan en boot).
  3. Validar en Incógnito.

Ver ../tecnico/menu-y-overrides.md.

Datos incorrectos en un tenant

  1. No borrar asientos: usar reversas/anulaciones (../contable/reversas-y-anulaciones.md).
  2. 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étodoPara 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.

CampoNota
NombrePara identificarla después (p. ej. Tienda en línea)
ScopesLos 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:

NivelCubre
readConsultar / listar
writeCrear y modificar
deleteEliminar
DominioRecursoNivelesQué permite
Registros (motor genérico)recordread · write · deleteRegistros de cualquier entidad definida en tu empresa
Definiciones de entidadentityread · write · deleteEstructura (campos, scripts) de las entidades
Webhooks salienteswebhookread · write · deleteSuscripciones de webhooks
Automatizacionesautomationread · write · deleteReglas, conectores y registro de eventos
Ventassalesread · write · deleteÓrdenes de venta, cotizaciones y precios
Cuentas por cobrarcxcwriteAplicar pagos y crear documentos de CxC
Punto de ventaposread · writeTiendas, sesiones y ventas de POS
Comprobantes fiscalesncfread · writeSecuencias y emisión/anulación de comprobantes
Comisionescommissionsread · writeEsquemas, devengos y pagos
Presupuestosbudgetread · writePresupuestos 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

PlantillaContenido
Solo lecturaTodos los scopes de nivel read
Integración comercialrecord: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

  1. Una llave por integración. Si hay que revocar, no tumbas todo lo demás.
  2. Scopes mínimos. Si tu tienda solo consulta stock, record:read basta.
  3. Pon expiración. 365 días obliga a una rotación anual.
  4. Nunca la pongas en el navegador ni en una app móvil. Cualquiera puede leerla ahí.

Las API Keys son para servidor a servidor.

  1. 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ódigoQué pasóSolución
401Falta el header, o la llave es inválida, está revocada o vencióRevisa el header Authorization: Bearer uk_…
403La llave autenticó pero no tiene el scope requeridoCrea una llave nueva con el scope correcto (los scopes no se editan)
404El identificador de empresa en la ruta no existeRevisa /t/<empresa>/
429Superaste el límite de peticionesVer 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

AspectoValor
Basehttps://<host>/t/<tu-empresa>
FormatoJSON (Content-Type: application/json)
Autenticación`Authorization: Bearer <jwt \
FechasISO 8601 (2026-08-09 o 2026-08-09T14:30:00.000Z)
MontosNú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ámetroPor defectoNota
page1Página
limit20Máximo 200 — valores mayores se recortan
search—Búsqueda de texto
sortField / sortOrder—Ordenamiento
filterField / filterValue—Filtro simple
filters—Filtros múltiples en JSON
deletedfalsetrue 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ónEndpoint
Historial de cambiosGET …/records/<recordId>/history
ComentariosGET / POST …/records/<recordId>/comments
Enviar a flujo de aprobaciónPOST …/records/<recordId>/submit
CancelarPOST …/records/<recordId>/cancel
Transiciones de estado disponiblesGET …/records/<recordId>/transitions
Ejecutar una transiciónPOST …/records/<recordId>/transition

Otros módulos accesibles con API Key

Estos aceptan API Key si la llave tiene el scope correspondiente:

MóduloBaseScope
Ventas/t/<empresa>/salessales:read · sales:write · sales:delete
Cotizaciones/t/<empresa>/quotessales:*
Punto de venta/t/<empresa>/pos/{stores,sessions,sales}pos:read · pos:write
Comprobantes fiscales/t/<empresa>/ncfncf:read · ncf:write
Comisiones/t/<empresa>/commissions/*commissions:read · commissions:write
Presupuestos/t/<empresa>/budgetsbudget:read · budget:write
Webhooks/t/<empresa>/webhookswebhook:*
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ódigoSignificadoQué hacer
200 / 201Correcto—
400Petición inválida: falta un campo, formato incorrecto, regla de negocio incumplidaLee el campo message: describe el problema concreto
401No autenticado: falta el header, llave inválida, revocada o vencidaRevisa Authorization
403Autenticado pero sin permiso o sin el scopeRevisa los scopes de la llave
404No existe el recurso, o pertenece a otra empresaRevisa el identificador y la empresa
429Demasiadas peticionesEspera y reintenta
500Error del servidorReintenta; 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ímiteValor
Peticiones por minuto120
Ventana60 segundos
AlcancePor 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

  1. Paginar siempre. limit=200 es el tope; no pidas todo de golpe.
  2. Reintentar con espera creciente ante 429 y 500 — nunca en bucle inmediato.
  3. No reintentar ante 400, 401, 403 y 404: reintentar no arregla el problema.
  4. Guardar el id que devuelve el sistema y usarlo como referencia, en vez de buscar por

nombre en cada llamada.

  1. 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)
CampoObligatorioNota
NombreSíPara identificarlo
URLSíTu endpoint. Debe ser HTTPS en el puerto 443
EventosSíLista de eventos, o * para todos
EntidadNoLimita el webhook a una entidad concreta. Vacío = todas
SecretoRecomendadoCon él se firma cada entrega

Permisos: webhook:read, webhook:create, webhook:update, webhook:delete.

Eventos disponibles

EventoCuándo se dispara
record.createdSe crea un registro
record.updatedSe modifica un registro
record.deletedSe elimina un registro
record.submittedUn registro se envía a aprobación
record.cancelledUn 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:

ReglaMotivo
Solo HTTPS, puerto 443Sin 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 nubeEvita alcanzar servicios internos
Fijado de IP: se conecta a la IP ya validada, sin volver a resolver el DNSEvita 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 reintentaUn receptor de webhooks no debe redirigir
Tiempo máximo de espera: 10 segundosUn 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 servidorResultado
2xxÉxito
3xxFallo, no reintentable
4xx (salvo 429)Fallo, no reintentable
429 o 5xxFallo reintentable
Tiempo agotado o error de redFallo 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íntomaCausa probableSolución
No llega ninguna entregaEl webhook está inactivo, o el evento no coincideRevisa Eventos y el filtro de Entidad
Todas las entregas fallan con error de URLHTTPS, puerto o IP privadaRevisa las reglas de seguridad de arriba
Entregas con 3xxTu 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 coincideEstás firmando el cuerpo ya reconstruidoFirma el cuerpo crudo
Llegan duplicadasTu servidor tardó y el evento se emitió otra vezHaz 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ónDónde
Enviar una factura en PDF al clienteFacturación → Factura, botón Enviar
Ver el historial de envíos y reintentarEn la misma factura
Crear plantillas de correo reutilizablesConfiguración → Plantillas de correo (/platform/email-templates)
Personalizar el asunto y el cuerpo del correo de facturaSeguridad → Configuración → Configurar Compañía

Permisos: email:read, email:create, email:update, email:delete.

Enviar una factura

  1. Abre la factura (debe estar guardada).
  2. Pulsa Enviar.
  3. 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:

CampoQué hace
Asunto del correoPlantilla del asunto
Cuerpo del correoPlantilla 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)
CampoNota
NombreIdentificador de la plantilla
AsuntoAdmite variables
CuerpoHTML, 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.

AspectoDetalle
Puerto habitual587 (STARTTLS) o 465 (TLS directo)
RemitenteSe 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íntomaCausa probableQué hacer
El botón Enviar no hace nadaEl cliente no tiene correoComplétalo en su ficha
El envío queda en errorServidor de correo no configurado o credenciales vencidasContacta a soporte con la hora exacta del intento
El correo llega pero sin PDFLa factura no está en un estado que permita generar el comprobanteVerifica que esté guardada y posteada
El cliente dice que no le llegóFiltro de spam o dominio sin autenticarRevisa 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.

RequisitoDónde se obtiene
Cuenta de WhatsApp Business verificadaMeta Business Manager
Phone Number IDMeta — API de WhatsApp, tu número
Access TokenMeta — token de acceso de la app
Business Account IDMeta — 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.

CampoObligatorio
Phone Number IDSí
Access TokenSí
Business Account IDSolo 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:

DatoNota
Nombre de la plantillaDebe existir y estar aprobada en tu cuenta
IdiomaPor defecto es
ComponentesLos 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

MensajeCausaSolución
WhatsApp no configuradoFalta el Phone Number ID o el Access TokenComplétalos en la configuración
Destinatario requeridoNo se indicó el númeroRevisa que el contacto tenga teléfono
Texto requeridoMensaje de texto sin contenidoEscribe el mensaje
Error de Meta al enviar textoPasaron más de 24 horas desde el último mensaje del clienteUsa una plantilla aprobada
Error de tokenEl Access Token venció o fue revocado en MetaGenera uno nuevo y vuelve a guardarlo
La plantilla no apareceFalta el Business Account ID, o la plantilla no está aprobadaCompleta el ID y revisa el estado en Meta

Qué no hace

ExpectativaRealidad
Recibir mensajes de clientes dentro del ERP (bandeja de entrada)No. El envío es en un solo sentido
Envío masivo a listasNo hay campañas masivas por WhatsApp en el núcleo del ERP
Crear plantillas desde el ERPNo. 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

RequisitoDe 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-CFProceso de certificación con la DGII
Secuencias e-CF (E31, E32, …)Impuestos → Serie Fiscal
RNC de la empresa configuradoConfigurar Compañía

Ambientes

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

CampoNota
Ambientetest, cert o production
Ruta del certificadoUbicación del archivo del certificado
Clave del certificadoNo 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

PasoQué haceEndpoint
1. GenerarConstruye el XML del comprobante y asigna el e-NCFPOST /ecf/generate
2. FirmarFirma el XML con tu certificadoPOST /ecf/<id>/sign
3. EnviarAutentica con la DGII y envía el comprobantePOST /ecf/<id>/submit
4. Consultar estadoPregunta a la DGII el resultadoGET /ecf/<id>/status
Ver el XMLDescarga el XML generadoGET /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:

  1. Pide una semilla a la DGII.
  2. Firma la semilla con tu certificado.
  3. La devuelve y recibe un token temporal.
  4. Envía el comprobante con ese token y obtiene un número de rastreo (trackId).
  5. 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

EstadoSignifica
AceptadoEl comprobante es válido
Aceptado CondicionalVálido, con observaciones — revísalas
En ProcesoAún no hay resultado; vuelve a consultar
RechazadoNo 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

  1. Empieza en el ambiente de pruebas. Emite varios comprobantes de cada tipo antes de

pasar a certificación.

  1. Vigila el vencimiento del certificado. Cuando vence, todos los envíos fallan de golpe.
  2. Consulta el estado: un envío aceptado por recepción todavía puede ser rechazado en la

validación posterior.

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

CampoObligatorioNota
NombreSíCómo lo verás en la lista
DescripciónNoPara qué sirve
URL baseSíDirección raíz de la API. La barra final se quita automáticamente
Tipo de autenticaciónNonone por defecto
Configuración de autenticaciónSegún el tipoToken, usuario/contraseña, etc.
CabecerasNoCabeceras 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

MecanismoDirecciónCuándo usarlo
WebhookERP → tu sistema, disparado por un eventoQuieres enterarte de algo que pasó en el ERP
ConectorERP → sistema externo, disparado por una automatizaciónQuieres que el ERP consulte o notifique a otro servicio
API + API KeyTu sistema → ERPQuieres leer o escribir datos del ERP desde fuera

Recomendaciones

  1. Un conector por servicio externo, no por endpoint: la ruta se indica en cada llamada.
  2. Usa HTTPS.
  3. Credenciales con el mínimo permiso en el sistema de destino.
  4. Prueba primero con una llamada de solo lectura.

Limitaciones conocidas

AspectoEstado
Reintento automático de una llamada fallidaNo 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 respuestaLimitada 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

DatosVíaEstado
ClientesCSV con plantilla, desde Cuentas por Cobrar → ClienteListo
Plan de cuentasCSV, desde Contabilidad → Plan de CuentasListo
Líneas de presupuestoCSV, desde Contabilidad → PresupuestosListo
Entidades personalizadasCSV, desde Seguridad → Carga MasivaListo (solo entidades del motor genérico)
Productos / artículosAlta manual o APISin importación CSV
ProveedoresAlta manual o APISin importación CSV
Existencia inicial de inventarioPantalla de valuación, artículo por artículoSin importación CSV
Cuentas por cobrar pendientesFacturas de apertura, capturadasSin importación CSV
Cuentas por pagar pendientesFacturas de compra de apertura, capturadasSin importación CSV
Activos fijosAlta manualSin 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:

  1. Plan de cuentas — todo lo demás cuelga de aquí.
  2. Monedas y tasas de cambio.
  3. Catálogos base: unidades, categorías, marcas, almacenes, tipos y condiciones de pago.
  4. Clientes (CSV).
  5. Proveedores.
  6. Productos / artículos.
  7. Existencia inicial con su costo.
  8. Saldos de apertura contables.
  9. Cuentas por cobrar y por pagar pendientes.
  10. Activos fijos y su depreciación acumulada.

Reglas comunes a toda importación CSV

ReglaValor
CodificaciónUTF-8 (con o sin BOM). Excel: guardar como CSV UTF-8
SeparadorComa
Texto con comasEntre comillas dobles: "Caja, principal"
Tamaño máximo2 MB
Filas máximas5 000
Primera filaEncabezado con los nombres técnicos exactos

Dos comportamientos distintos ante errores

Es importante saber cuál aplica:

ImportaciónAnte una fila inválida
ClientesRechaza esa fila, procesa las demás y devuelve el listado de errores por línea
Plan de cuentasAborta 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

  1. Prueba con 10 filas primero.
  2. Verifica en pantalla que se crearon como esperabas.
  3. Solo entonces sube el archivo completo.
  4. 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

ColumnaObligatoriaFormatoPor defecto
nameSíTexto—
codeNoTexto; vacío genera CLI-0001, CLI-0002…Automático
rnc (alias taxid)NoRNC o cédulavacío
emailNoFormato de correo válidovacío
phoneNoTextovacío
mobileNoTextovacío
addressNoTextovacío
cityNoTextovacío
creditLimitNoNumérico0
paymentTermsNoEntero (días)30
currencyNoDOP, 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ímiteValor
Tamaño2 MB
Filas5 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

MensajeCausa
Falta la columna requerida: nameEncabezado incorrecto
Columnas protegidas no permitidas: …El archivo trae id, companyId o tenantId
name es requeridoNombre 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íoSin contenido
El CSV no contiene filas de datosSolo encabezado

Lo que el sistema no valida

No validaConsecuencia
Formato del RNC (9 u 11 dígitos)Un RNC mal escrito se guarda tal cual
Dígito verificador del RNCIgual
Existencia del RNC en el padrón de la DGIIIgual

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

  1. Revisa en Buscar Cliente que el conteo cuadre.
  2. Revisa los omitidos: suelen ser duplicados legítimos, pero conviene confirmarlo.
  3. 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ónPermiso
Exportar el catálogo actualaccounting:export
Importaraccounting: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
ColumnaObligatoriaValores
codeSíCódigo de la cuenta (1, 11, 110101)
nameSíNombre de la cuenta
typeSíASSET, LIABILITY, EQUITY, INCOME, EXPENSE
normalBalanceSíDEBIT o CREDIT
isGroupNotrue/false (también 1/0, si/no, yes). Por defecto false
parentCodeNoCódigo de la cuenta padre. Vacío = cuenta de primer nivel
currencyCodeNoDOP, USD… Vacío = moneda base
isActiveNotrue/false. Por defecto true
descriptionNoTexto 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

ComportamientoDetalle
El orden de las filas no importaUna cuenta hija puede ir antes que su padre: el sistema resuelve la jerarquía
Todo o nadaSi una línea es inválida, no se crea ninguna cuenta
Las cuentas existentes se omitenSi el código ya existe, se cuenta como omitida, no se sobrescribe
Grupo vs. detalleisGroup=true son cuentas de agrupación: no reciben movimientos directos

Al terminar recibes: total, creadas y omitidas.

Límites

LímiteValor
Tamaño2 MB
Cuentas5 000

Errores y qué significan

Todos indican la línea del archivo:

MensajeCausa
Faltan columnas requeridas: …El encabezado no trae las nueve columnas
Línea N: code es requeridoCódigo vacío
Línea N: name es requeridoNombre 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 falseValor no reconocido
Línea N: código duplicado en el archivo (…)El mismo código aparece dos veces
… cuenta padre NN no existeparentCode apunta a un código que no está en el archivo ni en el sistema
El CSV está vacío / no contiene cuentasArchivo sin filas de datos
El CSV excede el límite de 2 MB / de 5,000 cuentasDivide el archivo

Recomendaciones

  1. Exporta el catálogo actual y úsalo como base.
  2. 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.

  1. Marca correctamente los grupos. Una cuenta de detalle marcada como grupo no podrá

recibir asientos.

  1. 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
ClientesNoImportación CSV de Cuentas por Cobrar
Artículos / productosNoAlta manual o API
ProveedoresNoAlta manual o API
FacturasNoCaptura o API
Cuentas contablesNoImportación CSV del plan de cuentas
Registros de una entidad propiaSí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

  1. Descarga siempre la plantilla en vez de escribir el encabezado a mano.
  2. Prueba con pocas filas y revisa el resultado en Buscar Procesos antes de subir todo.
  3. Guarda el CSV en UTF-8.
  4. No dejes vacías las columnas obligatorias (las marcadas con *).

Errores

SíntomaCausaSolución
Seleccione una entidad y un archivo CSVFalta uno de los dosComplétalos
El archivo está vacíoCSV sin contenidoRevisa el archivo
El trabajo termina con filas rechazadasColumnas mal nombradas o valores inválidosRevisa el detalle en Buscar Procesos y corrige
No aparece ninguna entidad en el selectorNo hay entidades personalizadas definidasEsta 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

CapacidadEstadoDónde
API con API KeysListoConfiguración → API Keys (/platform/api-keys)
Webhooks salientesListoConfiguración → Webhooks (/platform/webhooks)
Correo (SMTP)ListoEnvío de facturas en PDF y plantillas de correo
WhatsApp BusinessListoMensajes de texto y plantillas vía WhatsApp Cloud API
e-CF / DGIIImplementado — requiere certificaciónFacturación electrónica contra la API de la DGII
Conectores RESTListoLlamar APIs externas desde automatizaciones
Importación de datosParcialCSV para clientes, plan de cuentas y presupuestos

Lo que no existe

Para que nadie planifique sobre algo que no está:

ExpectativaRealidad
Pasarelas de pago para cobrar a tus clientes desde el ERPNo 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 tercerosNo publicada. Existe documentación interna de la API completa, pero no un subconjunto oficial para integradores
Límite de peticiones por API KeyNo. El límite es global por IP (ver API — errores y límites)
Importación masiva de artículos por CSVNo. Solo por API o alta manual

Por dónde empezar

Quiero…Lee
Leer o escribir datos desde otro sistemaAPI
Que el ERP avise a mi sistema cuando pasa algoWebhooks
Enviar facturas por correoCorreo
Mandar mensajes por WhatsAppWhatsApp
Emitir facturas electrónicase-CF / DGII
Llamar a una API externa desde el ERPConectores
Traer mis datos al arrancarImportació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 entregaAAAA-MM-DD
FrecuenciaContinua; 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:

BloqueQué contiene
NuevoFuncionalidad que antes no existía
MejorasAlgo que ya existía y ahora funciona mejor o es más completo
CorreccionesErrores 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:

ÁreaQué incluye
PipelineEmbudo con etapas, movimiento de oportunidades y velocidad por etapa
ActividadesRegistro y seguimiento de gestiones
ProspectosCaptación, detección de duplicados y conversión a cuenta
CuentasEmpresas cliente con sus relaciones
ContactosPersonas ligadas a cada cuenta
OportunidadesCierre ganado/perdido y reapertura con reglas reales
ComunicacionesHistorial de interacciones
ProductosCatálogo del CRM enlazado al catálogo real de artículos
PronósticosPronó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

  1. Revisa los NCF anteriores al 17 de julio de 2026 antes de declarar.
  2. 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.

  1. Revisa tu política de contraseñas: ahora se aplica de verdad al crear usuarios.
  2. 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.