Modelo de datos (Contabilidad)
App A comparte el proyecto Firebase con App B. Las declaraciones no se persisten (se calculan en runtime y se exportan); sí se guardan libros, prorrata, pagos, taxi y cuentas.
Colecciones (Firestore)
Raíz
subscriptions/{userId}_accountants— suscripción del contador (Paddle).facturadorAccess/{authUid}— índice de accesos POS (custom claims).feCallback/{clave}— callbacks de Hacienda.
Por cliente — users/{userId}/clients/{clientId}
| Subcolección | Contenido |
|---|---|
accountantFiles/{fileId} | Factura cruda aplanada: Emisor.*, Receptor.*, ResumenFactura.*, MH, MR, tipoMovimiento, FechaEmisionTS, Clave, y el desglose plano IVA(x%), NETO_IVA(x%), TE, totalTE, Otros, tarifaMismatch, tarifaMismatchDetails. |
gastosBook/{year}, ingresosBook/{year} | Doc de año { regimenes[], monthSummaries{} }. Subcolección months/{periodo} → rows/{rowKey} = PurchaseBookRow/SalesBookRow (incluye ivaPorTarifa, ivaPorTarifaNeto, cuentaContable, detalleSeleccionado, actividadSeleccionada, mismatchOverride, tarifaMismatchDetails — breakdown original). |
oldIngresos/{year} | Prorrata manual { year, values, savedAt }. |
cuentas/{year} | Overrides del árbol de cuentas contables. |
pagos/{pagoId} | Pagos/cobros (interfaz Pago). |
taxiBook/{year}/quarters/{quarterId}/rows/{rowId} + taxiPlacaIndex/{placa} | Lecturas de odómetro (índice compuesto placa + fechaLectura). |
Compartidas con App B (reglas en firestore.rules)
facturacionConfig (secretos del emisor, solo Admin), consecutivos (Admin), comprobantes/{clave} (metadata; owner + facturador), comprobantesXml (Admin), productos, receptores/{id}/exo, proveedores, exportJobs.
Tipos principales — lib/accountants/types.ts
PurchaseBookRow/SalesBookRow— la fila de libro con su desglose, cuenta, detalle, régimen y override.Pago— pagos/cobros.FormData/FormSection/FormField— estructura de las declaraciones.FormTotals/RateTotals/DetalleTotals/PagoDiferidoTotals— agregados de cálculo.YearBookDoc/MonthSummaryEntry— el doc de año y sus resúmenes mensuales.
Claves planas del desglose (en accountantFiles y en las filas)
| Clave | Significado |
|---|---|
IVA(0.5%) … IVA(13%) | IVA bruto por tarifa |
NETO_IVA(x%) | IVA neto por tarifa (preferido en los cálculos) |
TE / totalTE | Impuesto de tarifa especial (IVA / base) |
Otros | Impuestos código 99 |
tarifaMismatch | Flag: el código de tarifa no coincide con la tarifa real |
tarifaMismatchDetails | { resolvedKey, originalCode, actualTarifa, monto, montoNeto, lineaBase } |
Ingreso vs. gasto
tipoMovimiento se deriva al ingestar: ingreso si la cédula del cliente es el emisor del XML; gasto si es el receptor. Define en qué libro (ventas/compras) cae la factura.
Archivos de referencia de Hacienda
app/apiHaciendaYllaves/ contiene artefactos de referencia (catálogo CABYS .xlsx, códigos de moneda v4.4, y las llaves/certificados de firma usados por App B). El PDF de ANEXOS Y ESTRUCTURAS v4.4 y los .p12 están gitignored (sensibles).