GastosApp maneja cuatro entidades principales que se persisten como arrays de objetos planos dentro del JSON almacenado enDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/Davidmallega/Gastos-App/llms.txt
Use this file to discover all available pages before exploring further.
localStorage. No existe un ORM ni un esquema formal: los objetos son literales de JavaScript que siguen las formas definidas a continuación. Conocer estos modelos es fundamental para extender la app, depurar datos exportados o escribir tests sobre la lógica de negocio.
GastoCaja
Representa un gasto pagado por caja (efectivo, débito o transferencia) que puede o no tener boleta de respaldo. El IVA siempre es cero para este tipo de documento.Identificador único generado al crear el registro. Se construye concatenando
Date.now().toString() con un fragmento aleatorio de Math.random().toString(36).Fecha del documento en formato
'YYYY-MM-DD'. Se almacena como string para evitar desfases de zona horaria en Electron (ver Arquitectura → Fechas como string).Número de boleta. Solo aplica cuando
tieneDocumento es true. Puede quedar vacío si el usuario no lo ingresa.Nombre del proveedor tal como aparece en el directorio de proveedores. Se usa para el auto-completado y para las consultas de cascada al renombrar proveedores.
Nombre de la categoría asignada al gasto. Debe coincidir con un valor del array
categorias del estado global.Método de pago utilizado. Valores típicos:
'Efectivo', 'Débito', 'Transferencia'.Indica si el gasto tiene respaldo de boleta.
false = Sin Documento · true = Con Boleta. Afecta si se muestra el campo numero en la UI.Monto neto del gasto en pesos chilenos (CLP). En gastos caja equivale al total ya que el IVA es siempre 0.
Monto del IVA. Siempre es
0 en gastos caja. Se incluye en el modelo por consistencia con el modelo Factura.Monto total del gasto en CLP. Equivale a
neto dado que iva siempre es 0.Texto libre de observaciones. Puede estar vacío.
Estado de pago.
false = pendiente · true = pagado. Se actualiza con marcarPagado y se puede revertir con revertirPago.Fecha en que se registró el pago, en formato
'YYYY-MM-DD'. Es null mientras el gasto esté pendiente.Literal
'caja'. Permite discriminar entre gastos y facturas en colecciones mixtas (por ejemplo, en la vista de Pagos Pendientes).Timestamp ISO completo del momento en que se creó el registro (
new Date().toISOString()). Se usa para ordenamiento cronológico interno.Factura
Representa una factura electrónica SII o una Nota de Crédito. Las Notas de Crédito pueden vincularse a la factura que anulan mediantefacturaRefId; la app deduce automáticamente el monto neto a pagar en las vistas de pendientes y totales.
Identificador único generado con el mismo patrón que
GastoCaja.id.Fecha de emisión del documento SII en formato
'YYYY-MM-DD'.Tipo de documento. Acepta exactamente dos valores:
'Factura' o 'Nota de Crédito'.Folio SII del documento. Se usa para detectar duplicados en la importación CSV.
RUT del proveedor con el formato tal como viene del SII (puede incluir puntos y guión). Se usa para el auto-completar y para vincular con el directorio de proveedores.
Razón social del proveedor emisor.
Categoría asignada al documento.
Método de pago. Puede quedar vacío si se completa al marcar como pagado.
Monto neto en CLP (sin IVA).
IVA calculado al 19% sobre el neto. En la UI se auto-calcula al ingresar el neto.
Total del documento:
neto + iva.Texto libre de observaciones.
Estado de pago del documento.
Fecha de pago en formato
'YYYY-MM-DD'. Es null mientras esté pendiente.Solo para Notas de Crédito: contiene el
id de la factura que esta NC anula. Es null si el documento es una factura regular o si la NC no está vinculada. Este campo se agregó en la migración v1 → v2.Literal
'factura'. Discriminador de tipo en colecciones mixtas.Timestamp ISO de creación del registro.
Proveedor
Directorio de proveedores con información fiscal y comercial. LarazonSocial es el campo canónico que se usa en los documentos; nombreFantasia se muestra como tooltip en las tablas.
Identificador único. Los proveedores creados antes de la v1 del schema tienen IDs del tipo
'legacy_0', 'legacy_1', etc.RUT del proveedor. Puede estar vacío si el proveedor no tiene RUT registrado. Se normaliza para comparaciones eliminando puntos, guión y espacios.
Nombre legal del proveedor. Es el campo canónico que aparece en los documentos y se usa en las búsquedas de auto-completar.
Nombre comercial o de fantasía. Se muestra como tooltip sobre la razón social en las tablas cuando difiere de ella.
Información de contacto libre (email, teléfono, nombre de contacto).
Categoría por defecto que se asigna automáticamente al seleccionar este proveedor en un formulario de gasto o factura.
Días de plazo de pago acordados con el proveedor. Se usa para calcular una
_fechaVencimiento virtual al renderizar la lista de pendientes. null significa sin plazo definido. Este campo se agregó en la migración v3 → v4.Texto libre de observaciones internas sobre el proveedor.
Compromiso
Plantilla de gasto recurrente que genera automáticamente documentos (GastoCaja o Factura) al registrarse. El estado del compromiso se calcula dinámicamente en cada apertura de la app comparando ultimoRegistro con la frecuencia y el día de vencimiento configurados.
Identificador único del compromiso.
Nombre descriptivo del compromiso (ej.
'Arriendo local', 'Luz mensual').Tipo de documento que genera al registrarse.
'caja' crea un GastoCaja; 'factura' crea una Factura con IVA calculado al 19%.Monto del compromiso en CLP. Si
tipo es 'factura', el neto se calcula como Math.round(monto / 1.19) y el IVA como monto - neto.Categoría que se asigna al documento generado.
Nombre del proveedor que se asigna al documento generado. Si está vacío, se usa
nombre.Método de pago que hereda el documento generado.
Frecuencia de repetición. Valores posibles:
'mensual', 'quincenal', 'semanal', 'bimestral', 'trimestral', 'anual'.Día del mes de vencimiento (1–31). Aplica a todas las frecuencias excepto
'semanal'.Día de la semana de vencimiento (0 = domingo, 6 = sábado). Solo aplica cuando
frecuencia es 'semanal'.Indica si el compromiso está activo. Un compromiso inactivo no genera alertas de vencimiento y aparece con el estado
'Inactivo' en la UI.Texto libre de observaciones.
Timestamp ISO del momento en que se registró por última vez este compromiso (
new Date().toISOString()). Es null si nunca se ha registrado. La lógica de estado (getCompromisoStatus) lo compara con la fecha actual y la frecuencia para determinar si el compromiso está Registrado, Vencido, Próximo, etc.id del último documento (GastoCaja o Factura) generado al registrar el compromiso. Permite navegar desde el compromiso al documento generado.Timestamp ISO de creación del compromiso.
Estado del schema
El estado completo se serializa como un único objeto JSON bajo la clave'gastos_app_data' en localStorage:
schemaVersion es 4 en la versión actual. Al cargar los datos (al iniciar la app o al importar un backup), la función migrateData aplica las migraciones necesarias para llevar cualquier versión anterior al schema actual sin pérdida de datos.
Cuando un registro se elimina desde cualquier módulo de la app, no se borra permanentemente: se mueve al array
papelera[] con dos campos adicionales agregados automáticamente:deletedAt: timestamp ISO del momento de la eliminación.deletedFrom: string que indica el array de origen ('gastosCaja','facturas'o'compromisos').
PAPELERA_DAYS = 30 define el tiempo de retención. Al iniciar la app, la función purgePapelera elimina silenciosamente todos los ítems cuyo deletedAt supere los 30 días. Los ítems dentro del plazo pueden restaurarse a su sección original con todos sus datos intactos.