{{ screen==='setup' ? 'Configurar PIN' : 'Introduce tu PIN' }}

Primer uso: crea un PIN (mínimo 4 caracteres) para proteger el acceso.

{{ err }}

Dashboard

{{ todayStr }}

Últimos 30 días

Ingresos
{{ money(dash.last30?.income) }}
Gastos
{{ money(dash.last30?.expense) }}
Beneficio
{{ money(dash.last30?.profit) }}

Este año

Ingresos
{{ money(dash.year?.income) }}
Gastos
{{ money(dash.year?.expense) }}
Beneficio
{{ money(dash.year?.profit) }}

Evolución 12 meses

Alertas

{{ dash.unreviewed_count }} movimientos sin revisar.
{{ money(dash.debt_overdue) }} vencido pendiente de cobro.
{{ money(dash.debt_pending) }} pendiente de cobro.

Extractos importados · {{ monthsYear }}

{{ monthsImportedCount }}/{{ monthsExpectedCount }}
{{ m.label }}
{{ m.state==='ok' ? (m.tx_count + ' movs') : m.state==='future' ? '—' : 'pendiente' }}

🟢 importado · 🔴 pendiente · ⚪ mes futuro

Atajo iOS · Importación rápida

Genera un token de larga duración (1 año) para usar en un Atajo de iOS que sube el PDF con un solo tap desde el móvil.

URL del endpoint: http://192.168.50.111:8100/api/pdf/quick-import
Guarda el token en un sitio seguro. Válido 1 año.

Copias de seguridad

Exporta un archivo JSON con todos tus movimientos, categorías, proyectos, reglas, deudores y facturas. Puedes restaurarlo después.

{{ backupStatus }}

Top proyectos

Aún no hay proyectos.
{{ p.name }}
Ingresos {{ money(p.income) }} · Gastos {{ money(p.expense) }}
{{ money(p.profit) }}

Movimientos

{{ accountLabel(a.id) }}
Sin movimientos. Importa un PDF para empezar.
Todas las cuentas están ocultas. Haz clic en una pill para mostrarla.
{{ t.description_clean||t.description_raw }}
{{ fmtDate(t.date) }} {{ categoryIcon(t.category_name) }} {{ t.category_name }} {{ t.project_name }} sin revisar
{{ money(t.amount) }}

Análisis

Período

Categorías

Todas
Sin categoría
{{ categoryIcon(c.name) }} {{ c.name }}

Cuentas

Todas
{{ accountLabel(a.id) }}
{{ gastosMode==='income'?'Total ingresado':'Total gastado' }}
{{ money(gastosKPIs.total) }}
Media diaria
{{ money(gastosKPIs.dailyAvg) }}
Top categoría
{{ gastosKPIs.topCat || '—' }}

{{ gastosMode==='income'?'Ingresos por mes':'Gasto por mes' }}

Reparto por categoría

Por cliente / origen

👤 {{ cl.name }} · {{ cl.count }} mov.
{{ money(cl.total) }}

Movimientos ({{ gastosFiltered.length }})

No hay gastos con estos filtros.
{{ t.description_clean||t.description_raw }}
{{ fmtDate(t.date) }} {{ categoryIcon(t.category_name) }} {{ t.category_name }} {{ t.project_name }}
{{ money(t.amount) }}

Proyectos

Crea un proyecto para agrupar ingresos y gastos.
{{ p.name }} {{ p.status }}
🌐 {{ p.domain }} · 👤 {{ p.client_name }}
Ingresos {{ money(p.pnl.income) }} · Gastos {{ money(p.pnl.expense) }}
{{ money(p.pnl.profit) }}

Deudores

Total pendiente
{{ money(totalDebt) }}
{{ debtorsWithDebt }} deudor(es) · {{ pendingInvoices.length }} factura(s) pendiente(s)
⚠ Vencido: {{ money(overdueDebt) }}

Deudores

Añade un deudor con el botón "+ Deudor".
{{ d.name }}
{{ d.invoice_count }} factura(s) · {{ d.email }}
{{ money(d.pending_amount) }}
{{ inv.status }} {{ fmtDate(inv.issue_date) }} · {{ inv.notes }} · {{ inv.number }}
{{ money(inv.amount) }} ✓ {{ money(inv.amount_pending) }}

Histórico · facturas cobradas

Aún no has cobrado ninguna factura.
{{ inv.debtor_name }}
Emitida {{ fmtDate(inv.issue_date) }} · {{ inv.notes }}
{{ money(inv.amount) }}

Importar PDF

Arrastra un extracto bancario o pulsa para seleccionar.

Analizando PDF...
📄 Arrastra aquí un PDF
o haz clic para seleccionar

Vista previa · {{ preview.bank }}

Titular: {{ preview.holder }}
Periodo: {{ fmtDate(preview.period_start) }} → {{ fmtDate(preview.period_end) }}
⚠ {{ preview.warnings.join(', ') }}

Cuentas detectadas

Selecciona qué cuenta(s) importar.

{{ acc.name }} existente nueva
{{ acc.iban }}
{{ acc.tx_count }} movimientos · Duplicados: {{ duplicateCountForIban(acc.iban) }}

Vista previa de movimientos ({{ previewSelectedTxs.length }} a importar)

Selecciona al menos una cuenta arriba.
Fecha Concepto Importe
{{ fmtDate(t.date) }}
{{ t.description }}
👤 {{ t.counterparty }}
{{ money(t.amount) }}
... y {{ previewSelectedTxs.length-80 }} más
{{ selected.size }} seleccionados