Autónomo Dashboard centraliza ingresos, gastos, modelos fiscales y documentos de soporte en una sola interfaz. Los datos se guardan en Supabase (PostgreSQL) con autenticación y Row Level Security — accesible desde cualquier dispositivo.
Los cálculos del sistema son de apoyo. La liquidación final puede variar según tu situación fiscal anual, la documentación aportada y el criterio aplicado por tu asesoría.
📊 Dashboard
Resume el período seleccionado con ingresos, base deducible, beneficio neto, modelos fiscales y alertas.
- Ingresos: total facturado en el trimestre.
- Base deducible: suma de gastos deducibles sin IVA ni retenciones.
- Beneficio neto: ingresos menos base deducible.
- IRPF estimado: cálculo orientativo del Modelo 130 al 20%.
💰 Facturación
Registra facturas emitidas y vincula documentos de soporte.
- Permite informar cliente, país, número de factura, importe, IVA e IRPF.
- Si el cliente está fuera de España, el sistema propone IVA = 0% con referencia al art. 69.
- Se puede adjuntar una factura o comprobante (PDF, imagen, DOC o Excel, máx. 2 MB).
💸 Gastos
Controla gastos de actividad, IVA soportado y retenciones a proveedores.
- La base imponible es el valor usado como gasto deducible en IRPF.
- El IVA soportado se separa para el Modelo 303.
- El IRPF retenido se informa para el Modelo 111 y no se trata como gasto deducible.
- El sistema muestra el desglose de pago al proveedor y salida total de caja.
⊟ Modelos fiscales
Presenta una visión resumida de los principales modelos operados por la aplicación.
- Modelo 130: pago fraccionado de IRPF sobre beneficio estimado.
- Modelo 303: diferencia entre IVA repercutido e IVA soportado.
- Modelo 111: retenciones practicadas a proveedores o profesionales.
🗂️ Documentos
Centraliza los archivos vinculados a facturas y gastos para consulta posterior.
- Permite filtrar por tipo (factura/gasto), período y texto.
- Incluye vista previa y descarga con URL firmada.
- Los archivos se guardan en Supabase Storage con acceso privado por usuario.
☰ Resumen financiero e Informes
Ofrecen una lectura ejecutiva del período y ayudan a analizar tendencias.
- El Resumen financiero combina ingresos, gastos, impuestos y lectura de caja.
- Los Informes muestran gráficos y acumulados por trimestre.
- La lectura de IVA en tu escenario está orientada a crédito recuperable.
Los datos se guardan en la nube con Row Level Security activo. Solo tú puedes ver tus registros, incluso si otras personas usasen la misma aplicación.
Login y registro con email/contraseña via Supabase Auth. Cada sesión está vinculada a tu user_id y persiste entre sesiones del navegador.
Los documentos adjuntos se guardan en Supabase Storage en un bucket privado. Las URLs de descarga son firmadas con 60 minutos de validez.
La aplicación es un fichero HTML estático alojado en Netlify. No requiere servidor backend — toda la lógica corre en el navegador con la anon key de Supabase protegida por RLS.
Esta versión alinea el informe modal con la estructura del Resumen financiero e implementa la descarga ZIP con el informe y los anexos organizados por carpeta. Introduce resetAppState() para limpiar estado y DOM de forma atómica en el logout y en el bootstrap, eliminando la exposición temporal de datos de la cuenta anterior durante el cambio de usuario. para derivar tiene_iva_soportado dos gastos reais, garantindo que M303 e M390 aparecem no calendário fiscal e na tela Configuración sempre que há IVA en gastos, independientemente del perfil guardado en Supabase.
- "¿Olvidaste tu contraseña?" — link discreto adicionado abaixo do botão Entrar. Leva ao form de reset dentro do mesmo card de autenticação, sem mudar de ecrã.
- Form de solicitação de reset — campo de email + botão "Enviar enlace de recuperación". Mensagem neutra por segurança: nunca revela se o email existe. Usa sb.auth.resetPasswordForEmail(email, { redirectTo: window.location.origin }) — funciona em localhost e produção sem configuração adicional.
- Tela de nova senha — #reset-screen separada, activada pelo evento PASSWORD_RECOVERY do Supabase. Validações: mín. 6 chars, confirmação obrigatória, senhas devem coincidir. Estados: form → sucesso (✅) ou inválido/expirado (⚠️) com acção de reenvio.
- detectSessionInUrl: true — alterado de false. Necessário para o Supabase processar o token de recovery do URL hash quando o utilizador clica no link do email.
- onAuthStateChange actualizado — trata o evento PASSWORD_RECOVERY mostrando a tela de reset sem interferir com os fluxos de login, registo e primeiro acesso.
- showScreen('reset') — nova rota adicionada a showScreen(). Compatível com as rotas existentes: loading, auth, onboarding, app.
- Zero regressões — login, registo, onboarding e sessões existentes não foram alterados.
- Causa raiz corrigida — getLinkedRecords(filteredDocs) só devolvia gastos que tinham documento. O informe excluía silenciosamente todos os gastos dedutíveis sem anexo. Corrigido em generateInformeContable, buildPrintHTML e downloadInformeConAnexos.
- Nova função getRecordsByPeriod(records, filters) — filtra gastos/ingresos por período (ano, trimestre, mês) independentemente da existência de documentos. Reutilizada nos 3 pontos de entrada do informe.
- Tabela de gastos completa — todas as linhas dedutíveis do período aparecem. Linhas sem documento: fundo laranja claro + badge ⚠ Pendiente em vermelho bold. Linhas com documento: ✓ nome do ficheiro em verde. Gastos não dedutíveis sem doc: — Sin doc. discreto.
- Métricas de conformidade documental corrigidas — denominador passa a ser o total de gastos dedutíveis do período, não o número de documentos. Portada e KV card mostram X/Y gastos ded. con doc. (Z%).
- Incidências sem duplicação — variáveis gastosDedSinDoc e incSinDocAlt calculadas uma única vez e reutilizadas, eliminando a definição redundante que existia no bloco de incidências.
- Status "Sin incidencias críticas" rigoroso — gastos dedutíveis sem documento geram incidência de nível Alto, impedindo o status verde quando há pendências documentais reais.
- Zero alterações de cálculo — calcTax, expTotalCash, expSupplierPaid, M130, M303, M111 intactos.
- Botão "Imprimir" removido — eliminado do modal. A acção de imprimir gerava divergência entre versões do relatório. A versão oficial é a exportada em HTML+ZIP.
- "Con anexos" → "Generar y descargar" — botão principal renomeado para tornar clara a acção: gera e descarrega o informe oficial com todos os anexos. Comportamento inalterado.
- Selector do botão actualizado — referência interna ao botão migrada de querySelector('[onclick=...]') para getElementById('inf-btn-download') para maior robustez.
- Modal = preview fiel — o modal exibe exactamente o mesmo conteúdo que será exportado; "Generar y descargar" é a única acção disponível além de fechar.
- Zero alterações de cálculo — nenhuma função fiscal, cálculo ou HTML exportado foi modificado.
- Informe impresso = informe oficial — buildPrintHTML refactorizada para delegar a buildInformeModalHTML: impressão e ZIP produzem agora o mesmo relatório de auditoria (portada, resumen, incidências, matriz, reconciliação, livros, repositório). Eliminado o relatório antigo e simplificado.
- Portada do modal corrigida — CSS da portada melhorado: espaçamento entre título/subtítulo, linha separadora, min-width nos labels, padding e line-height normalizados. Cabeçalho legível e alinhado.
- Regras de incidências expandidas — novas detecções: (Alto) gastos no período sem ingresos associados; (Alto) facturas sem documento adjunto; mensagens mais descritivas com categorias e contexto; threshold de "base baixa" refinado.
- Tela de Documentos — coluna "Vinculado a" — nova coluna mostra para cada documento: categoria + descrição (gastos) ou nº factura + cliente (facturas); "⚠ Sin vínculo" em vermelho quando o registo não é encontrado. Consistente com o repositório documental do informe.
- Portada de auditoría — período, data/hora, versão, utilizador, tipo contribuinte, filtros activos, % documentos vinculados e status automático (✅ Sin incidencias / 🟡 Revisión recomendada / 🔴 Incidencias detectadas).
- Resumen ejecutivo expandido — 12 KPIs: ingresos, base deducible, beneficio neto, IRPF estimado, IVA repercutido, IVA soportado nacional, IVA ISP, total IVA M303, retenciones M111, salida de caja real, neto imp. IVA, ratio documentos vinculados.
- Detección de incidencias automática — 4 níveis (Crítico/Alto/Medio/Info): ISP com IVA 0, base inválida, gastos sem documento, documentos sem vínculo, retenção em categoria incomum, proveedor español com IVA 0, base deducible baixa.
- Matriz fiscal do período — tabela de contagens e valores por tipo: IVA nacional, ISP, sin IVA, com retenção, deducible, não deducible. Com percentagem sobre o total.
- Reconciliação por modelo — 3 blocos lado a lado: M130 (ingresos → rendimiento → cuota), M303 (repercutido − soportado es − ISP → resultado), M111 (base, total, nº operações).
- Livro de gastos auditado — colunas: fecha, cat., desc., base M130, IVA M303, tipo IVA (Nacional/ISP/Sin IVA), IRPF ret., pagado prov., caja, deducible, documento (✓ nome / ⚠ Sin doc.), observação fiscal automática.
- Livro de ingresos auditado — colunas: fecha, nº factura, cliente, país, base, IVA%, IVA€, IRPF%, IRPF€, tipo fiscal (Nac./Ext.), documento vinculado.
- Repositório documental com rastreabilidade — tabela: documento | tipo | referência | fecha | valor | estado (✓ Vinculado / ⚠ Sin vínculo).
- Zero alterações de cálculo — calcTax, calcSummaryData, expTotalCash, expSupplierPaid intactos. Apenas buildInformeModalHTML foi substituída.
- Validação ISP + IVA 0% — aviso quando modo ISP está seleccionado e taxa = 0%. Orienta a aplicar o tipo fiscal correcto sem bloquear.
- Validação Proveedor español + IVA 0% — aviso quando modo ES está activo e taxa = 0%. Recorda verificar se a operação é realmente exenta.
- Sugestões por categoria — Software/SaaS sugere classificar como nacional ou ISP quando modo = none; Gestoría/Asesor recorda IVA + possível retenção; Seguridad Social alerta se tiver IVA configurado.
- Tooltips reforçados — Tipo de operación IVA (com descrição das 3 opções), Tipo IVA (nota ISP), IRPF retenido (referência M111 explícita), Base deducible (orientação clara).
- Insights na tela de Gastos — alerta discreto quando mais de 70% dos gastos filtrados não têm IVA (mínimo 5 gastos); alerta quando há gastos ISP no período filtrado.
- Badges na tabela — célula IVA mostra IVA (verde) para proveedor nacional, ISP (roxo) para inversión del sujeto pasivo, 0% (cinzento discreto) para sin IVA.
- Zero alterações de cálculo — calcTax, calcSummaryData, expTotalCash, expSupplierPaid intactos.
- Bug corrigido — Salida de caja total — a função expTotalCash() não descontava o IRPF retenido na saída de caixa, inflando o total em exactamente o valor retido. O IRPF não é pago ao fornecedor — é uma obrigação fiscal declarada via M111.
- Correcção — expTotalCash(e) passa a devolver base + ivaAmt - irpfRet (modo nacional) e base - irpfRet (modo ISP), alinhado com expSupplierPaid() que já estava correcto.
- Validação — cenário: Assessoria €95,40 + Seguridad Social €89,00 + ChatGPT €23,00 + Claude Max €74,32 + Claude Pro €18,00 = €299,72.
- Zero outras alterações — expSupplierPaid, calcTax, IVA, ISP, M130, M303, M111, labels, tooltips, layout — intactos.
- Validação — IRPF incoerente com categoria — aviso contextual quando IRPF retenido > 0 em categorias onde normalmente não se aplica (Software/SaaS, Hardware, Formación, Marketing, Oficina, Seguros, Seguridad Social). Não bloqueia.
- Validação — base zero ou negativa — aviso ao preencher base imponible com valor ≤ 0. Desaparece ao corrigir o valor.
- Validação — base deducible — aviso informativo leve ao marcar "Base deducible" com valor preenchido, lembrando que só é deducible se relacionado com a actividade. Tom orientativo.
- Aviso ISP consistente — o bloco informativo de inversión del sujeto pasivo existente foi mantido e é agora complementado pelos novos warnings, sem duplicação.
- CSS .ef-warn — classe mínima para warnings contextuais (fundo âmbar claro, tom neutro). Aparece com .show, desaparece automaticamente ao corrigir.
- Listeners adicionados — ef-cat e ef-ded-tog passam a chamar updExpIva() para reavaliação em tempo real.
- Reset limpa warnings — resetExpenseForm() remove a classe .show de todos os warnings ao abrir novo gasto ou cancelar edição.
- Zero alterações de cálculo — nenhuma função fiscal foi modificada.
- Insight IVA no Dashboard — texto substituído por "Generas saldo de IVA a tu favor basado en tus gastos. Incluye IVA soportado y, en su caso, IVA por inversión del sujeto pasivo." Eliminada referência genérica a "IVA deducible".
- Label "Neto" — renomeado para "Neto considerando impacto IVA (M303)" em todos os pontos (stat card Resumen, Detalle del periodo, informe modal). Eliminada ambiguidade de "crédito" ou "recuperable".
- Badge ISP na tabela de Gastos — célula IVA mostra badge discreto ISP em cor púrpura quando o gasto usa modo inversión del sujeto pasivo. Sem coluna nova, sem alteração de layout.
- Tooltip IVA na coluna Gastos — title da coluna IVA actualizado para explicar que inclui IVA soportado e ISP.
- Card M303 (tela Tax) — título do aviso corrigido de "Generas IVA deducible" para "Generas saldo de IVA a tu favor en M303".
- Informe modal — KV card "Neto ajustado" → "Neto imp. IVA (M303)"; "IVA soportado" → "Total IVA (M303)".
- Tooltip M303 no Dashboard — actualizado para referenciar explicitamente IVA soportado nacional e ISP.
- Zero alterações de cálculo — nenhuma função fiscal foi modificada.
- calcTax() — desglose es/isp — adicionados ivaInEs (IVA soportado proveedor nacional) e ivaInIsp (IVA por inversión del sujeto pasivo) sem alterar ivaIn, ivaBalance nem o cálculo do M303.
- calcSummaryData() — desglose es/isp — mesmos campos adicionados. ivaRecoverable mantido para compatibilidade; Detalle del periodo mostra linhas separadas por natureza fiscal.
- Dashboard M303 — quando existem gastos ISP e nacionais, o card mostra linhas separadas: "IVA soportado (proveedores nacionales)", "IVA inversión del sujeto pasivo (ISP)" e "Total IVA con impacto en M303".
- Gastos — card IVA — label corrigida para "Total IVA con impacto en M303". Sub-label dinâmica mostra o desglose quando coexistem gastos es e isp.
- Resumen Financiero — Detalle do período com linhas separadas por natureza fiscal. Label "Neto ajustado" renomeada para "Neto con crédito IVA (M303)". Insight do IVA com mensagem contextual conforme os modos presentes.
- Cálculo-base M303 intacto — ivaIn e ivaBalance não foram alterados. Informes e Documentos Fiscales não foram tocados.
- Nuevo campo "Tipo de operación IVA" — substitui o toggle "Lleva IVA (proveedor español)" por un selector con tres opciones explícitas: Sin IVA / no sujeto / exento, Proveedor español con IVA e Proveedor no establecido / inversión del sujeto pasivo.
- Regla ISP correcta — en modo inversión del sujeto pasivo, el IVA se registra para M303 pero no incrementa la salida de caja ni el importe pagado al proveedor. El desglose calculado lo indica explícitamente.
- Retrocompatibilidad — registros antiguos sin ivaMode: si tenían ivaAmt > 0 se interpretan como proveedor español; si ivaAmt = 0, como sin IVA. Ningún dato antiguo se reclasifica automáticamente.
- Tooltips en español — añadidos en todos los campos del formulario: tipo de operación, base imponible, IRPF retenido, tipo IVA, base deducible y desglose calculado.
- Migración BD — columna iva_mode añadida a la tabla expenses (nullable, sin valor por defecto para no reclasificar datos antiguos).
- Sincronização do total com filtros — o importe total exibido no canto da tabela e o subtítulo passam a calcular sobre o conjunto filtrado, não sobre todas as facturas. Total e tabela reflectem exactamente os mesmos dados.
- Ordenação por columna — ordenação padrão por Cliente (ASC) + Fecha (DESC) como desempate. Headers clicáveis com indicador ▲/▼ para todas as colunas: Fecha, Nº Factura, Cliente, País, Importe, IVA, IRPF. Função global setIncSort(col) com toggle ASC/DESC.
- Paginação de 15 registros — máximo 15 facturas por página. Navegação com Anterior/Siguiente e acesso directo por número de página. Página reinicia ao aplicar ou limpar filtros e ao mudar ordenação.
- Sincronização dos cards com filtros — os indicadores BASE DEDUCIBLE (M130), AHORRO IRPF ESTIMADO, IVA SOPORTADO (M303), IRPF RETENIDO (M111) e SALIDA DE CAJA TOTAL passam a calcular sobre o conjunto filtrado, não sobre todos os gastos. Cards e tabela reflectem exactamente os mesmos dados.
- Ordenação por columna — ordenação padrão por Descripción (ASC) + Fecha (DESC). Headers clicáveis com indicador de coluna activa (▲/▼) permitem ordenação manual por qualquer coluna. A página é reiniciada ao mudar de ordenação.
- Paginação de 15 registros — a tabela mostra máximo 15 gastos por página. Navegação com botões Anterior/Siguiente e acesso directo a cada página. A página é reiniciada ao aplicar ou limpar filtros.
- Tooltips nos stat cards — ícone ? discreto no label de cada card (Ingresos, Base deducible, Beneficio neto, IRPF estimado) com explicação curta ao hover. Nenhum cálculo ou layout alterado.
- Tooltips nos modelos fiscais — ícone ? no título de cada tax card (M130, M303, M111) com explicação do modelo. Apenas adicionado ao HTML gerado dinamicamente.
- Tooltip explicativo nos gráficos — ícone ? no card-header de "Ingresos vs Gastos" e "Distribución trimestral" com descrição do objectivo do gráfico.
- Hover nas barras do gráfico — ao passar o rato numa barra, tooltip mostra: mês · série (Ingresos/Gastos) · valor em €. Implementado com mousemove/mouseleave sem alterar o draw existente.
- Hover nos segmentos do donut — ao passar o rato num segmento, tooltip mostra: categoria · valor em € · percentagem. Hit test por ângulo e raio sobre os arcos já desenhados.
- Zero alterações a cálculos, layout, estilos globais, outras páginas, regras de negócio ou estrutura de dados.
- Informe modal — estrutura do Resumen financiero — buildInformeModalHTML reescrito com a mesma estrutura do "Detalle del periodo": KPIs (Ingresos, Base deducible, Ahorro IRPF, Neto ajustado, IVA soportado, Retenciones), tabela Detalle del periodo com os 8 conceitos exactos, desglose por categoría, detalle de gastos/ingresos e documentos adjuntos.
- Cálculos alinhados com calcSummaryData() — netBeforeTaxes, netAfterTaxes, netAjustado com IVA recuperable, ahorroIrpf, irpfEstimado — exactamente iguais ao Resumen financiero.
- Descargar informe con anexos (ZIP) — botão "⬇ Con anexos" no modal. Gera um ZIP com: Informe.html (standalone) + Anexos/Facturacion/ + Anexos/Gastos/. Ficheiros ordenados por data crescente (JAN→DEC), prefixo de data no nome do ficheiro. Respeita os filtros activos da tela. Usa JSZip via CDN.
- Print mantido — buildPrintHTML e printInforme inalterados com classes pr-*.
- Causa raiz — generateInformeContable passara a usar buildPrintHTML() para preencher #informe-body. O modal recebeu HTML com classes pr-* que o CSS do modal não conhece, resultando em HTML cru sem estilo.
- buildInformeModalHTML(filteredDocs, incFiltered, expFiltered, periodoAplicado) — nova função que usa exclusivamente classes informe-* para o popup. Recebe os dados já filtrados pela fonte única de verdade.
- buildPrintHTML(allDocs) — mantida com classes pr-* exclusivamente para #print-report-root e window.print(). Também passa a receber _allDocsCache explicitamente.
- Filtros preservados — ambas as funções usam getDocumentFilters() + applyDocumentFilters() + getLinkedRecords(). Nenhuma lógica de filtro foi duplicada ou alterada.
- Estado vazio — modal mostra empty state com design consistente com o popup; print mostra estado vazio com classes pr-*.
- Causa raiz corrigida — renderDocuments e generateInformeContable eram duas funções completamente independentes com fontes de dados separadas. O informe buscava documentos do Supabase sem filtros e usava income[]/expenses[] globais directamente.
- getDocumentFilters() + applyDocumentFilters() + getLinkedRecords() — fonte única de verdade partilhada por tabela e informe. applyDocumentFilters aplica todos os 6 critérios (tipo, formato, ano, trimestre, mês, busca) sobre o mesmo array de documentos.
- buildPrintHTML(allDocs) — recebe agora o array de documentos como parâmetro, aplica os filtros activos via fonte única, e calcula os aggregados apenas sobre os income/expenses vinculados aos documentos filtrados (getLinkedRecords).
- generateInformeContable — simplificado: carrega documentos frescos e delega todo o cálculo e renderização ao buildPrintHTML.
- Estado vazio coerente (cenário F) — se nenhum documento passa os filtros, o informe mostra mensagem clara em vez de dados globais antigos.
- Cache _allDocsCache — partilhado entre tabela e informe; invalidado ao navegar para Documentos, após upload e no logout.
- Campo document_date na tabela documents (Supabase) — nova coluna document_date DATE com default CURRENT_DATE. Registo existentes retroactivamente preenchidos com a data de upload para compatibilidade.
- Data do documento nos formulários — campo "Fecha del documento" adicionado na zona de adjunto de Facturación e Gastos. Por defeito vem com a data de hoje; o utilizador pode alterar para qualquer data retroativa (ex: data da factura em papel).
- Filtros de documentos usam document_date — os filtros de ano, trimestre e mês priorizam agora document_date em vez de uploaded_at, garantindo consistência total com o período real do documento.
- Data visível na tabela e no painel — a tabela de Documentos e o painel de detalhes mostram a data do documento; a data de upload fica disponível como tooltip.
- Filtros Mes y Trimestre en Documentos — adicionados dois novos selects: Trimestre (Q1–Q4) e Mes (Enero–Diciembre). O filtro usa a data do registo associado (income.date / expense.date), não a data de upload, para consistência total com o informe.
- Informe contable reflecte todos os filtros — buildPrintHTML() lê agora todos os 4 filtros activos (tipo, ano, trimestre, mês) e aplica-os a income e expenses via função auxiliar matchesDateFilter(). O cabeçalho do PDF indica o período exacto (ex: "Q1 · Año 2025").
- Reset e listeners actualizados — resetDocFilters() e bindFilterListeners() incluem os novos campos. Seleccionar qualquer filtro actualiza a tabela imediatamente.
- Tabela user_alert_settings (Supabase) — nova tabela com RLS completo. Campos: user_id, model_type (M130–M100), days_before (1–30), enabled. Constraint UNIQUE por utilizador+modelo. Defaults automáticos: 5 dias para trimestrais, 7 para anuais.
- Alertas de prazo no dashboard — calcFiscalAlerts() calcula diariamente quais modelos fiscais se aproximam do prazo. Aparecem no painel de alertas do dashboard, discretos e não invasivos: amarelo quando faltam ≤N dias, vermelho quando faltam ≤2 dias.
- Configuração de alertas em Configuración — novo card "Alertas de entrega de modelos" com toggle por modelo e campo de dias de antelação. Só mostra modelos aplicáveis ao perfil actual. Persiste via saveAlertSettings().
- Carregamento no bootstrap — loadAlertSettings() carregado na sequência de boot após loadUserAccess. Reset incluído no resetAppState() para isolamento entre sessões.
- Tema claro corrigido — o CSS da Guía de uso tinha :root, body e * globais que sobrescreviam as variáveis do tema. Todos os selectores foram scopados ao #page-guia para isolamento total.
- Ícone do menu Guía de uso — substituído 👉 por ◎, no padrão dos restantes ícones do menu lateral.
- Idioma espanhol — corrigidos textos em português visíveis ao utilizador: textos da Guía de uso, botão "Baixar" → "Descargar", parágrafos do modal de confirmação e secções avançadas da guia.
- Filtros de Documentos activos — adicionados os listeners em bindFilterListeners(); as alterações nos filtros de tipo, formato, ano e busca disparam renderDocuments() imediatamente.
- Informe contable respeita os filtros — buildPrintHTML() lê os filtros activos da tela de Documentos (tipo de registo e ano) e aplica-os a income e expenses antes de calcular. O cabeçalho do PDF indica o filtro aplicado.
- Nova página "Guía de uso" — integração do manual v2 como nova rota page-guia. O conteúdo HTML e CSS do manual foram preservados exactamente como fornecidos, sem adaptações.
- CSS isolado — os estilos do manual estão dentro do próprio #page-guia, sem afectar o CSS global da aplicação nem as outras páginas.
- Item "👉 Guía de uso" no menu — adicionado ao MENU_CONFIG após "Ayuda", visível para todos os utilizadores. Respeita o sistema de controlo de acesso existente (canAccess).
- Zero alterações ao existente — nenhuma lógica fiscal, regra de negócio, estilo global ou outra página foi modificada.
- resetAppState() — reset atómico de estado e DOM — nova função que limpa explicitamente todos os arrays de dados (income, expenses), perfil fiscal, role, currentUser, e as regiões HTML visíveis (dashboard, tabelas, modelos fiscais, documentos, informe modal) de forma síncrona antes de qualquer render.
- Logout seguro — o botão "Cerrar sesión" agora chama resetAppState() e showScreen('loading') antes de signOut(), eliminando a janela onde dados do utilizador anterior ficavam visíveis enquanto o Supabase confirmava o logout.
- onAuthStateChange SIGNED_OUT usa resetAppState() — substitui os resets individuais dispersos por uma chamada única e completa, garantindo que nenhuma variável de estado sobrevive à troca de conta.
- bootApp chama resetAppState() no início — em troca de conta (utilizador A → utilizador B), o bootstrap garante reset completo antes de carregar qualquer dado do novo utilizador, eliminando a race condition que mostrava dados antigos durante o carregamento.
- enrichProfile() — perfil enriquecido com dados reais — nova função que injeta tiene_iva_soportado derivado dos gastos reais (expenses.ivaAmt) no perfil antes de qualquer cálculo de modelos aplicáveis. Resolve a inconsistência entre o perfil guardado no Supabase e o estado fiscal real.
- M303 aparece no calendário fiscal — buildFiscalCalendar e getApplicableModels recebem agora o perfil enriquecido, pelo que M303 e M390 aparecem no calendário Q1–Q4 sempre que há IVA soportado em gastos.
- Tela Configuración consistente — secção educativa e card de perfil actual usam também o perfil enriquecido. "No aplica" substituído por "Activo (solo soportado)" quando aplicável. Após guardar alterações, a secção educativa também é atualizada com o estado real.
- M303 sempre activo quando há IVA soportado — eliminado o "No aplica según tu perfil" incorrecto. M303 activo se tiene_iva=true (IVA repercutido) OU se há gastos com IVA soportado (ivaIn>0). Autónomos que faturam fora de Espanha mas têm gastos com IVA agora vêem corretamente o seu crédito fiscal.
- Card M303 redesenhado — mostra sempre IVA repercutido + IVA soportado + saldo. Caso só soportado: badge "Solo IVA soportado" e mensagem educativa explicando a compensação/devolução. Nunca esconde o crédito fiscal do utilizador.
- Alertas do dashboard corrigidos — alerta de IVA mostra mensagem diferente conforme o caso (só soportado vs. misto). Removido o alerta errado "no presentas M303".
- Mensagens do onboarding e Configuración corrigidas — texto "No presentarás M303" substituído por explicação correcta do crédito fiscal por IVA soportado.
- M190 adicionado — Modelo 190 (Resumen anual de retenciones IRPF) incluído em FISCAL_MODELS. Activo quando M111 está activo. Aparece no calendário Q4 e na secção de modelos anuais.
- Secção "Modelos anuais" na tela Modelos fiscales — M390 e M190 aparecem separados dos trimestrais, com estado baseado no perfil e aviso de prazo (janeiro do ano seguinte).
- Secção educativa na tela Configuración — lista completa de modelos aplicáveis ao perfil do utilizador, com descrição, frequência e estado (obrigatório / não aplica).
- Historial corrigido — sequência de versões 1.0 → 1.1 → 1.2 → 1.3 → 1.4 → 1.5 → 1.6 restaurada com as entradas correctas para cada versão.
- Onboarding fiscal guiado em 4 camadas — fluxo sequencial com barra de progresso: (1) tipo de contribuinte, (2) tipo de actividade, (3) destinos de facturação com multi-seleção e derivação automática de IVA, (4) retenciones e resumo.
- Derivação automática de IVA — se só fatura fora de Espanha, tiene_iva = false (art. 21/69). Mensagens contextuais orientam em cada caso. Suporta cenários híbridos (nómada digital, misto).
- Tela Configuración — acessível a todos via sidebar. Edição do perfil fiscal completo com modal de confirmação de impacto. Após confirmar, recarrega automaticamente dashboard, calendário fiscal e informe.
- Schema Supabase ampliado — novos campos: tipo_actividad, destinos_facturacion (array), distribucion_pct (JSONB), iva_override, perfil_version.
- Informe contable y fiscal — relatório completo com 6 blocos: resumen ejecutivo, ingresos por trimestre, detalle fiscal de gastos, detalle de ingresos, documentos adjuntos e observaciones. Preparado para leitura por terceiros.
- Impressão isolada via #print-report-root — container dedicado fora do modal elimina o problema de páginas em branco e de elementos da aplicação a aparecer no PDF.
- Refinamento visual do informe — tipografia Georgia/serif, cabeçalho formal, headers de tabela escuros, larguras de coluna controladas com <colgroup>, truncamento inteligente.
- Bug de loading infinito corrigido — eliminada a race condition entre onAuthStateChange e getSession().
- Bootstrap centralizado em bootApp(session) — único ponto de entrada para inicialização.
- Flag bootstrapInProgress — impede bootstraps paralelos em refresh rápido.
- try/catch/finally garantido — loading nunca fica activo indefinidamente.
- Logs de diagnóstico — prefixo [boot], [auth], [init] no browser console.
- Lógica fiscal por perfil — M303 e M111 — M303 mostra "No aplica" se tiene_iva = false; M111 mostra "No aplica" se tiene_retenciones = false. Cálculos zerados, não apenas ocultos.
- Dashboard com perfil — os 3 cards fiscais do dashboard respeitam o perfil.
- Sistema de toasts — substituídos todos os alert() por notificações não-bloqueantes.
- RLS optimizado no Supabase — 13 políticas corrigidas com (select auth.uid()). 13 avisos de performance eliminados.
- updated_at em income e expenses — campos com trigger automático.
- Índice em documents.record_id — melhora performance de lookup.
- Responsividad completa — breakpoints desktop (≥1024px), tablet (768–1023px) y mobile (≤767px).
- Drawer de navegación — sidebar convertida en menú lateral deslizante con botón ☰ en mobile y overlay para cerrar.
- Onboarding fiscal obligatorio — en el primer acceso, el usuario define su perfil y responde preguntas complementares (IVA, retenciones, alquiler).
- Perfil fiscal en Supabase — tabla user_fiscal_profile con RLS, almacena perfil y estado de onboarding.
- Calendario fiscal paramétrico — generado automáticamente según el perfil. Modelos trimestrales en los 4 trimestres; anuales solo en Q4.
- Tabla FISCAL_MODELS centralizada — M130, M303, M111, M115, M390 y M100 con periodicidad, plazos y condición de aplicación.
- Dashboard — resumen trimestral con stats, gráficos, modelos fiscales, alertas y resumen anual.
- Facturación — CRUD completo con IVA 0% art. 69, retención IRPF y adjunto de documentos.
- Gastos — CRUD con base deducible, IVA soportado, retención M111, ahorro IRPF estimado y adjunto.
- Modelos fiscales — M130, M303, M111 y calendario fiscal.
- Resumen financiero — vista mensual y trimestral con desglose, categorías e insights.
- Informes — gráficos anuais y acumulado por trimestre.
- Documentos — repositorio de adjuntos con filtros, vista previa y descarga con URL firmada.
- Autenticación y persistencia — Supabase Auth + PostgreSQL con RLS + Storage privado.
- Filtros colapsáveis — año, categoría y texto en Facturación, Gastos y Documentos.
- Versionamiento centralizado — variable global APP_VERSION.
Afecta al calendario fiscal, los modelos aplicables, los cálculos del dashboard y los informes. Confirma los cambios solo si tu situación real ha cambiado.
Cargando...
Recibirás un aviso en el dashboard cuando se acerque la fecha de entrega de cada modelo fiscal. Configura con cuántos días de antelación quieres ser avisado.
Cargando configuración de alertas...
Como usar o Autónomo Dashboard
Este guia foi pensado para ensinar um novo usuário sem parecer um manual pesado. A ideia é mostrar o fluxo natural do sistema: configurar o perfil, lançar receitas e gastos, anexar documentos, revisar os modelos fiscais e gerar o informe final.
Comece aqui
Antes de lançar qualquer informação, revise a configuração fiscal. Essa etapa define como o sistema interpreta IVA, IRPF, retenções e os modelos que devem aparecer para o seu perfil.
1. Revise a Configuración
Confirme se seu perfil fiscal está correto: tipo de contribuinte, atividade, destinos de faturamento e regras adicionais.
2. Registra ingresos y gastos
Rellena primero tus facturas en Facturación y después los gastos en Gastos, con el máximo detalle posible.
3. Confira modelos e informe
Depois dos lançamentos, use a tela de Modelos fiscales e o informe contable y fiscal para revisar o período.
Fluxo de uso recomendado
Esse é o caminho ideal para quem está começando a usar o sistema pela primeira vez.
Configuração inicial
Entre na aba Configuración e revise se o perfil fiscal representa sua situação real. Essa é a base do sistema.
Registrar ingresos em Facturación
Cadastre cada fatura emitida com data, número, cliente, país, valor, IVA da operação e conceito.
Registrar gastos
Cadastre as despesas da atividade informando categoria, base, IVA suportado, retenções e se o gasto é dedutível.
Anexar comprovantes
Vincule PDFs, imagens e faturas na aba Documentos para manter o lançamento justificado e organizado.
Revisar os modelos fiscales
Confira se o sistema está interpretando corretamente M130, M303, M111 e os modelos anuais aplicáveis.
Gerar o informe final
Use o Informe contable y fiscal para revisar o período e compartilhar uma visão consolidada com o contador.
Configuración
Essa é a tela mais importante para começar. Ela define como o sistema vai ler os seus lançamentos e quais modelos devem aparecer.
O que conferir
Quando alterar
Facturación
Aqui você registra as faturas emitidas. Pense nessa tela como a fonte principal das suas receitas.
Gastos
Essa tela concentra as despesas da atividade. Um gasto bem lançado melhora o cálculo, a conferência e a qualidade do informe final.
Documentos
Usa esta sección como repositorio documental. Lo ideal es adjuntar los archivos en el momento del registro.
Adjunta al registrar
Reduce el riesgo de perder comprobantes y mantiene el sistema más organizado.
Vincule ao registro certo
Associe o documento à receita ou ao gasto correspondente.
Pense no contador
Um anexo bem vinculado facilita revisão fiscal e auditoria interna.
Modelos fiscales
Essa tela serve para verificar como o sistema está interpretando o seu perfil e os seus lançamentos.
O que olhar primeiro
Como usar essa tela
No la uses solo como “aplíca” o “no aplica”. Úsala para confirmar que la lectura fiscal del sistema tiene sentido con tu situación real.
Informe contable y fiscal
Esse é o documento final de revisão. Ele consolida visão executiva, fiscal e documental em um formato mais apropriado para leitura por gestor ou contador.
Quando gerar
No fechamento do período ou antes de enviar as informações ao contador.
O que ele mostra
Ingresos, gastos, base dedutível, IVA, retenções e detalhe dos registros.
Como interpretar
Use o informe como uma revisão consolidada, não como substituto absoluto da análise do contador.
Detalhes rápidos, se você quiser se aprofundar
Los detalles avanzados están agrupados aquí para mantener la página limpia e intuitiva.
Por que começar por Configuración?
Em que ordem devo usar o sistema no dia a dia?
Quando vale revisar o informe contable y fiscal?
Resumo final
Se o usuário seguir esse fluxo, ele consegue usar o sistema de forma muito mais natural:
1. Configurar
Revisar o perfil fiscal corretamente.
2. Registrar
Lançar receitas, gastos e anexos com clareza.
3. Conferir
Validar modelos fiscais e gerar o informe final.