SimplifyCRM · Docs Entrar a la app
Docs · Contabilidad e inventario

Contabilidad

Add-on de contabilidad: plan de cuentas, asientos contables, mayor general, balanza de comprobación, estados financieros, cierre mensual y reportes fiscales DGII (606/607).

Organización del menú

Cuando el addon Contabilidad está activo, su menú lateral se agrupa en sub-secciones:

Cómo usarlo

Reglas del sistema

Roles del catálogo — Control / Auxiliar / Detalle

El plan de cuentas estándar RD se estructura en 5 niveles técnicos (Clase, Grupo, Cuenta, Subcuenta, Detalle) pero el contador suele pensar en 3 roles funcionales. La columna Rol del catálogo muestra cuál aplica a cada fila, derivado automáticamente:

Por qué importa: el contador identifica de un vistazo dónde puede postear (auxiliar/detalle) y dónde no (control), sin tener que abrir el árbol. Los reportes (Mayor, Balanza, Estado de Resultados) usan la misma jerarquía: el saldo del control siempre cuadra con la suma de sus auxiliares y detalles.

Recalculo automático: si conviertes una Auxiliar en padre agregándole subcuentas, su rol cambia a Control y deja de aceptar asientos nuevos (los asientos históricos sobre ella siguen visibles en el Mayor, no se pierden — pero ya no se pueden agregar más sobre la cuenta padre; deben ir sobre las hijas). El sistema lo hace solo, no requiere intervención manual.

Validación del formulario de asientos

El form de Nuevo Asiento Manual valida en tiempo real antes de habilitar los botones Guardar Borrador y Contabilizar. Si algún punto impide guardar, se muestra un panel rojo con la lista de correcciones; los botones quedan deshabilitados hasta resolverlos.

Puntos que bloquean el guardado:

Advertencias no bloqueantes (panel ambar):

Reasignar cuenta sobre asiento posted

Cuando descubres que un asiento ya contabilizado (typically auto-generado desde una factura o un gasto) posteó a la cuenta contable equivocada, no hace falta anularlo y emitir reversión ni nota de crédito si solo cambia la cuenta (no los montos).

En vista Asientos, expande el asiento → cada línea muestra el botón Reasignar (icono ). Se abre un modal con:

El botón no aparece para:

Cuándo NO usar Reasignar y sí usar Nota de Crédito / reversión:

Cada reasignación queda registrada en Historial del asiento como acción account_remap, con la cuenta vieja, la nueva, la razón, el usuario y el timestamp.

Modos de contabilización

Configurable en Config → Modo de contabilización:

Cuentas del Sistema (slugs)

El sistema opera con roles contables internos (slugs) que se mapean a tu plan de cuentas. Esto permite que el código no dependa de códigos de cuenta específicos — si tu chart usa 300101 en lugar de 3901, solo cambias el mapping en Config → Cuentas del Sistema y el resto sigue funcionando.

Slugs gestionados:

Si algún slug queda sin configurar, el posteo automático se guardará en borrador (Safe-Fail) hasta que lo completes. El botón Restaurar defaults DR reseta a los valores estándar de República Dominicana.

Permisos

Preguntas frecuentes

¿Cómo corrijo un asiento ya contabilizado?

No se edita. Anúlalo (botón "Anular") y registra un asiento de reversión o uno nuevo correcto. La historia del error queda visible para auditoría.

¿Por qué no me deja guardar con fecha en diciembre?

Ese periodo ya fue cerrado. Pide a un admin que lo reabra formalmente si realmente es necesario.

¿Qué es una "cuenta de control"?

Una cuenta padre cuyo saldo es la suma de sus hijas. No recibe asientos directamente; eso se hace en las cuentas auxiliares o de detalle (hijas). Ver la sección Roles del catálogo para la distinción completa Control / Auxiliar / Detalle.

Cierre de período — validación por-asiento (2026-04-21)

Antes de cerrar un período, el sistema corre una lista de verificación (preflight) que ahora incluye un check por cada asiento individual:

Por qué importa: el chequeo global del balance de comprobación podría cuadrar aunque dos asientos estén individualmente rotos (por ejemplo, uno con +$100 de exceso de débito y otro con −$100 de exceso de crédito se compensan). El trigger de base de datos chk_balanced evita esto al momento de insertar, pero asientos legados o data tocada manualmente pudieron haber escapado al trigger.

Si el check falla, el preflight lista hasta 5 asientos desbalanceados con:

El botón Ver en Asientos te lleva al Mayor para inspeccionarlos. Debes revertir y re-registrar cada uno antes de que el período pueda cerrarse.

Retenciones — sub-ledger no integrado al Mayor (2026-04-21)

El módulo Retenciones registra las retenciones ITBIS / ISR que tu empresa practica a proveedores (como agente de retención DGII) y alimenta los reportes 606/607. Sin embargo, esos registros hoy no impactan el Mayor, la Balanza de Comprobación, ni el Balance General.

Qué significa en la práctica: si registras aquí una retención de $5,400 ITBIS pero no creas un asiento contable correspondiente, tu pasivo fiscal en los estados financieros aparecerá en cero aunque realmente debas ese monto a la DGII.

Solución temporal (hasta la Sesión 9 del saneamiento):

Cada vez que registres una retención, crea además un asiento manual en Contabilidad → Asientos → Nuevo manual con este patrón:

CuentaDébitoCrédito
Cuentas por Pagar (del proveedor)$retención
Retenciones ITBIS / ISR por Pagar$retención

El banner ámbar en la vista Retenciones incluye un botón Crear asiento manual que te lleva directamente al formulario. Recuerda usar la fecha y el monto exactos del registro de retención, con una descripción como "Retención ITBIS 30% s/ factura B0100001234 RNC 101-12345-6".

Cuándo dejará de ser necesario: la Sesión 9 del plan de saneamiento integrará el sub-ledger directamente al Mayor — las retenciones generarán asientos automáticos y este banner desaparecerá.

Estados de carga y errores (nuevos 2026-04-21)

Todas las vistas de Contabilidad ahora comparten el mismo patrón de 3 estados:

En Asientos y Configuración, si una fuente opcional (configuración del addon, períodos cerrados, etc.) falla por un error de red transitorio, verás un banner ámbar:

⚠ No se pudo cargar (nombre): (motivo). La vista muestra datos parciales.

La vista sigue siendo utilizable — sólo algunas funciones dependientes del dato faltante quedan inhibidas. Ciérralo con la × cuando hayas leído el aviso, o recarga para reintentar todas las fuentes. Protocolo V2 punto 4 (Safe-Fail): preferimos avisarte antes que mostrar ceros engañosos en silencio.

Escalabilidad — carga diferida (nueva 2026-04-22)

Mayor General, Balance de Comprobación y Cierre de Período antes cargaban todas las líneas contables del tenant en cada entrada a la pestaña. En tenants grandes eso se traducía en segundos de espera y uso inútil de red. Ahora:

Beneficio: en el tenant de Khaostozen la latencia pasó de 3-5 s a < 500 ms al entrar a Mayor, incluso con cientos de miles de líneas acumuladas.

Registro de auditoría — vista Historial (v1.8.66, 2026-04-22)

Cada cambio de estado de un asiento contable queda registrado automáticamente en la tabla journal_entry_audit_log (trigger trg_je_audit_log, migración 20260422000006). Las 5 acciones trazadas son:

Cómo abrirlo

Filtros disponibles

KPIs de la página

Se calculan sobre los eventos de la página actual (no del historial total):

Columnas de la tabla

Paginación

50 eventos por página, ordenados por fecha descendente. Botones Anterior / Siguiente; el botón "Siguiente" se deshabilita cuando no hay más filas.

Consulta directa (alternativa SQL)

Para auditorías puntuales fuera de la UI: SELECT * FROM v_journal_entry_audit_recent WHERE entry_number = 'AS-00000123' ORDER BY actor_at DESC;.

Cuentas por Pagar (CxP)

La vista CxP agrupa tus gastos por proveedor (contacto con categoría Proveedor o equivalente) y calcula el total adeudado a cada uno, junto con una lista de próximos vencimientos y el desglose por categoría.

Qué muestra

Filtros

Qué hace si borras un contacto (2026-04-23)

Si eliminas un contacto del CRM después de haber registrado gastos a su nombre, la vista no oculta esos gastos. El asiento contable ya existe, tu deuda con ese proveedor es real — esconderla de la UI crearía una desincronización entre la vista y el Mayor General.

En su lugar, verás:

Cómo recuperar la visibilidad: vuelve a crear un contacto con el mismo id (raro, requiere soporte), o reasigna los gastos huérfanos a otro contacto vía el módulo Gastos.

Fechas de vencimiento inválidas (2026-04-23)

Si por alguna razón un gasto tiene una expirationDate malformada (null, vacía, con formato incorrecto, o NaN), antes veías textos como "NaN días" en la tarjeta de vencimiento. Ahora el sistema filtra estas fechas del listado de próximos vencimientos y, si se renderiza alguna, muestra "Fecha inválida" en lugar del cálculo erróneo. Reporta estos casos a soporte — suelen venir de importaciones o ediciones manuales fuera de la UI.

Asientos contables generados por CxP

Todos los asientos respetan el per-line snapshot DGII: la línea base carga rnc_contraparte + ncf_documento + tipo_bienes_servicios, las líneas de ITBIS cargan rnc + ncf, y la línea de control solo rnc + ncf. Esto alimenta directamente el 606 sin joins adicionales.

Bloqueo optimista — transiciones de asientos (v1.8.66, 2026-04-22)

Contabilizar, Anular y Eliminar borrador usan un bloqueo optimista para evitar que dos pestañas (o dos usuarios) pisen el mismo asiento al mismo tiempo. El sistema guarda el updated_at de la fila al momento de leerla y lo manda como condición en la escritura. Si el valor cambió en el servidor, la escritura afecta 0 filas y se aborta.

Qué verás si se detecta una colisión

Un toast ámbar con 12 s de duración:

⚠️ Este borrador fue modificado por otro usuario o en otra pestaña.

Recarga la vista para ver el estado actual antes de volver a contabilizar.

El mensaje cambia ligeramente según la acción (contabilizar / anular / eliminar), pero la resolución es siempre la misma: recarga la vista Asientos y reintenta sobre el estado fresco. Recargar es una decisión consciente del usuario — el sistema no reintenta automáticamente porque el asiento podría haber cambiado en formas que invalidan tu intención (p. ej. alguien más ya lo contabilizó).

Cuándo ocurre típicamente

Qué acciones NO requieren el bloqueo

Por qué este diseño (vs. bloquear la fila en el servidor)

Bloqueo pesimista (lock explícito en DB) obligaría a marcar el asiento como "en edición" y liberarlo al salir; una pestaña cerrada abruptamente dejaría asientos bloqueados. El optimista solo detecta la colisión cuando realmente ocurre, es local a la escritura y no requiere coordinación entre pestañas.

e-CF emitidos sin asiento — red de seguridad (2026-06-12)

El asiento de venta de una factura se contabiliza en tu navegador cuando la guardas. Para facturas e-CF (serie E), el e-NCF se asigna recién al emitir a DGII, así que el asiento que se crea al guardar queda en borrador (le falta el e-NCF para poder postearse). Si luego DGII acepta el e-CF pero ese borrador nunca se completa (porque cerraste la pestaña, hubo un corte de red, etc.), tendrías un comprobante fiscal aceptado sin reflejo en el Mayor.

Para evitarlo hay un reconciliador automático en el servidor que corre cada 30 minutos:

El asiento siempre queda en borrador para que un humano lo valide y lo postee — el sistema nunca postea solo un comprobante fiscal. Encuéntralos en Asientos → Pendientes de completar.

Semáforo amarillo en el Dashboard

El Dashboard de Contabilidad muestra un banner amarillo cuando hay e-CF aceptados sin asiento posteado, con el conteo. El banner desaparece cuando todos están contabilizados (cero pendientes). Si ves el banner, ve a Asientos, revisa cada borrador ecf_accepted_unposted, corrige la cuenta de ingreso si la venta fue de servicios (el reconciliador asume productos por defecto), agrega el costo de venta (COGS) si aplica, y postéalo.

Nota para el contador: el reconciliador NO genera el asiento de costo de venta (COGS) — ese es un evento de inventario separado. Complétalo al revisar el borrador si la venta movió inventario físico.
¿No encontraste lo que buscabas? Abre la app y usa el botón ❓ del módulo, o contáctanos por Soporte. ← Toda la documentación