35d460b127
Multi-tenant marine invoicing system: Stripe payments, PDF generation, digital signatures, QR codes, SMTP email, bilingual templates. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
93 lines
4.5 KiB
HTML
93 lines
4.5 KiB
HTML
{% extends "base.html" %}
|
|
{% block title %}Dashboard — MarineInvoice Pro{% endblock %}
|
|
{% block content %}
|
|
<h1 class="page-title">Dashboard</h1>
|
|
<p class="page-subtitle">Bienvenido, {{ current_user.full_name or current_user.username }}</p>
|
|
|
|
<!-- Stat cards -->
|
|
<div class="grid-4 mb-4">
|
|
<div class="stat-card"><div class="stat-icon">🏢</div><div class="stat-label">Compañías</div><div class="stat-value">{{ companies|length }}</div></div>
|
|
<div class="stat-card"><div class="stat-icon">👥</div><div class="stat-label">Clientes</div><div class="stat-value">{{ total_clients }}</div></div>
|
|
<div class="stat-card"><div class="stat-icon">📄</div><div class="stat-label">Invoices</div><div class="stat-value">{{ total_invoices }}</div></div>
|
|
<div class="stat-card"><div class="stat-icon">📋</div><div class="stat-label">Cotizaciones</div><div class="stat-value">{{ total_quotes }}</div></div>
|
|
</div>
|
|
|
|
<!-- Total facturado banner -->
|
|
<div style="background:linear-gradient(135deg,#1a2744 0%,#243560 100%);border-radius:12px;padding:20px 28px;margin-bottom:24px;display:flex;align-items:center;justify-content:space-between;">
|
|
<div>
|
|
<div style="color:#c9a84c;font-size:12px;font-weight:600;letter-spacing:1px;text-transform:uppercase;">Total Facturado (Invoices)</div>
|
|
<div style="color:white;font-size:32px;font-weight:700;margin-top:4px;">${{ "%.2f"|format(total_billed) }}</div>
|
|
</div>
|
|
<div style="font-size:40px;opacity:0.4;">💰</div>
|
|
</div>
|
|
|
|
<!-- Two columns: Invoices | Cotizaciones -->
|
|
<div style="display:grid;grid-template-columns:1fr 1fr;gap:20px;">
|
|
|
|
<!-- INVOICES -->
|
|
<div class="card" style="margin-bottom:0;">
|
|
<div class="card-header" style="border-left:4px solid #c9a84c;padding-left:12px;">
|
|
<span class="card-title" style="color:#c9a84c;">📄 Últimos Invoices</span>
|
|
<a href="/invoices" class="btn btn-primary btn-sm">Ver todos</a>
|
|
</div>
|
|
{% if recent_invoices %}
|
|
{% for inv in recent_invoices %}
|
|
{% set client = inv.client %}
|
|
<div class="list-item" style="padding:10px 0;">
|
|
<div class="list-item-info">
|
|
<h4 style="font-size:13px;margin-bottom:2px;">
|
|
{{ inv.number }}
|
|
{% if inv.status == 'draft' %}<span class="badge badge-gold">Borrador</span>
|
|
{% elif inv.status == 'sent' %}<span class="badge badge-blue">Enviado</span>
|
|
{% elif inv.status == 'paid' %}<span class="badge badge-green">Pagado</span>
|
|
{% else %}<span class="badge" style="background:#eee;color:#666;">Cancelado</span>{% endif %}
|
|
</h4>
|
|
<p style="font-size:11px;color:var(--gray);">{{ client.name if client else '—' }} · {{ inv.date }}</p>
|
|
</div>
|
|
<span style="font-weight:700;color:#c9a84c;font-size:13px;">${{ "%.2f"|format(inv.total) }}</span>
|
|
</div>
|
|
{% endfor %}
|
|
{% else %}
|
|
<div class="empty-state" style="padding:30px 0;">
|
|
<div class="emoji">📄</div>
|
|
<h3>No hay invoices aún</h3>
|
|
<p>Ve a <a href="/invoices">Invoices</a> para crear uno</p>
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
|
|
<!-- COTIZACIONES -->
|
|
<div class="card" style="margin-bottom:0;">
|
|
<div class="card-header" style="border-left:4px solid #4a90d9;padding-left:12px;">
|
|
<span class="card-title" style="color:#4a90d9;">📋 Últimas Cotizaciones</span>
|
|
<a href="/quotes" class="btn btn-secondary btn-sm">Ver todas</a>
|
|
</div>
|
|
{% if recent_quotes %}
|
|
{% for qt in recent_quotes %}
|
|
{% set client = qt.client %}
|
|
<div class="list-item" style="padding:10px 0;">
|
|
<div class="list-item-info">
|
|
<h4 style="font-size:13px;margin-bottom:2px;">
|
|
{{ qt.number }}
|
|
{% if qt.status == 'draft' %}<span class="badge badge-gold">Borrador</span>
|
|
{% elif qt.status == 'sent' %}<span class="badge badge-blue">Enviado</span>
|
|
{% elif qt.status == 'accepted' %}<span class="badge badge-green">Aceptado</span>
|
|
{% else %}<span class="badge" style="background:#fde8e8;color:#c0392b;">Rechazado</span>{% endif %}
|
|
</h4>
|
|
<p style="font-size:11px;color:var(--gray);">{{ client.name if client else '—' }} · {{ qt.date }}</p>
|
|
</div>
|
|
<span style="font-weight:700;color:#4a90d9;font-size:13px;">${{ "%.2f"|format(qt.total) }}</span>
|
|
</div>
|
|
{% endfor %}
|
|
{% else %}
|
|
<div class="empty-state" style="padding:30px 0;">
|
|
<div class="emoji">📋</div>
|
|
<h3>No hay cotizaciones aún</h3>
|
|
<p>Ve a <a href="/quotes">Cotizaciones</a> para crear una</p>
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
|
|
</div>
|
|
{% endblock %}
|