Facturación
Ruta:
/owner/settings/billingGestiona la configuración de facturación, numeración y apariencia de tus documentos.
Vista general
Sección titulada «Vista general»La configuración de Facturación se organiza en tres pestañas principales:
Pestañas: Régimen Fiscal | Series | Apariencia
Descripción:
| Pestaña | Función |
|---|---|
| Régimen Fiscal | Detección automática del territorio fiscal por código postal (IVA, IGIC, IPSI) |
| Series | Gestión de series de numeración para facturas, presupuestos, proformas y albaranes |
| Apariencia | Personalización de plantillas y estilos de documentos PDF |
Funciones principales
Sección titulada «Funciones principales»| Función | Descripción | Documentación |
|---|---|---|
| Configurar Régimen Fiscal | Visualiza el régimen fiscal automático según tu dirección | Ver |
| Gestionar Series | Crea y gestiona series de numeración para documentos | Ver |
| Personalizar Plantillas | Elige y personaliza el estilo de tus facturas | Ver |
| Configurar Logo | Sube y ajusta el logo de tu empresa | Ver |
Régimen fiscal territorial
Sección titulada «Régimen fiscal territorial»El sistema detecta automáticamente tu régimen fiscal según el código postal:
Código Postal → Territorio → Sistema Impositivo 28001 → Península → IVA (21%, 10%, 4%) 35001 → Canarias → IGIC (7%, 3%, 0%) 51001 → Ceuta → IPSI (0.5%, 1%, 4%)Territorios soportados:
| Territorio | Sistema | Tipos estándar |
|---|---|---|
| España Península | IVA | 21%, 10%, 4%, 0% |
| Islas Canarias | IGIC | 7%, 3%, 0% |
| Ceuta y Melilla | IPSI | 0.5%, 1%, 4%, 0% |
Nota: El régimen se actualiza automáticamente al cambiar la dirección fiscal en Configuración > Negocio.
Series de numeración
Sección titulada «Series de numeración»El sistema permite crear series independientes para cada tipo de documento:
Tipos de series:
| Tipo | Uso | Ejemplo |
|---|---|---|
| Facturas | Facturas emitidas y rectificativas | FAC-000001 |
| Presupuestos | Ofertas y cotizaciones | PRES-000001 |
| Proformas | Facturas proforma | PRO-000001 |
| Albaranes | Documentos de entrega | ALB-000001 |
Características:
- Prefijo personalizable (1-10 caracteres)
- Numeración automática con ceros a la izquierda
- Protección contra eliminación de series en uso
- Activación/desactivación sin pérdida de datos
Plantillas de factura
Sección titulada «Plantillas de factura»El sistema incluye plantillas prediseñadas y permite personalización avanzada:
Plantilla por defecto: Minimal Black
Opciones de personalización:
- Colores principales y secundarios
- Tipografía (fuente del cuerpo y encabezados)
- Posición del logo (izquierda, centro, derecha)
- Tamaño del logo (pequeño, mediano, grande, extra grande)
Referencia técnica
Sección titulada «Referencia técnica»Detalles técnicos
Tablas de base de datos
Sección titulada «Tablas de base de datos»| Tabla | Columnas principales | FK |
|---|---|---|
businesses | id, tax_regime, invoice_style, logo_url, postal_code, country | — |
invoice_sequences | id, user_id, name, prefix, current_number, is_active, number_padding | auth.users |
quote_sequences | id, user_id, name, prefix, current_number, is_active, number_padding | auth.users |
proforma_sequences | id, user_id, name, prefix, current_number, is_active, number_padding | auth.users |
delivery_note_sequences | id, user_id, name, prefix, current_number, is_active, number_padding | auth.users |
Políticas RLS
Sección titulada «Políticas RLS»| Política | Regla |
|---|---|
businesses_isolation | id = negocio del usuario autenticado |
invoice_sequences_user_isolation | user_id = usuario autenticado |
quote_sequences_user_isolation | user_id = usuario autenticado |
Hooks y funciones
Sección titulada «Hooks y funciones»| Hook | Archivo | Descripción |
|---|---|---|
useBusinessTerritory | useBusinessTerritory.ts | Detecta territorio y régimen fiscal por código postal |
useResolvedCompanyLogoUrl | useResolvedCompanyLogoUrl.ts | Resuelve URL del logo desde storage |
Componentes principales
Sección titulada «Componentes principales»| Componente | Ruta | Función |
|---|---|---|
Billing.tsx | panels/owner/pages/settings/ | Página principal de configuración |
TaxRegimeSection.tsx | features/settings/components/ | Vista de régimen fiscal |
BillingSeriesSection.tsx | features/settings/components/ | Gestión de series con acordeones |
InvoiceTemplatesSettings.tsx | features/settings/components/ | Editor de plantillas y logo |
InvoiceSeriesManager.tsx | features/invoices/components/series/ | CRUD de series de facturas |
Queries de diagnóstico
Sección titulada «Queries de diagnóstico»Series activas de un usuario:
SELECT id, name, prefix, current_number, is_activeFROM invoice_sequencesWHERE user_id = '<user_id>' AND is_active = trueORDER BY name;Configuración de negocio con régimen fiscal:
SELECT tax_regime, invoice_style, logo_url, postal_code, countryFROM businessesWHERE id = '<business_id>';Series en uso (no eliminables):
SELECT id, name, prefix, current_numberFROM invoice_sequencesWHERE user_id = '<user_id>' AND current_number > 1;Constantes de configuración
Sección titulada «Constantes de configuración»Ver detalles técnicos de plantillas
Archivo: constants/invoiceStylesConfig.ts
Plantillas disponibles:
export const INVOICE_STYLES_CONFIG = { minimalBlack: { id: 'minimalBlack', name: 'Minimal Black', colors: [ { id: 'primary', label: 'Color principal', default: '#000000' }, { id: 'secondary', label: 'Color secundario', default: '#666666' } ], fonts: [ { id: 'body', label: 'Fuente del cuerpo', default: 'Inter' }, { id: 'heading', label: 'Fuente de títulos', default: 'Inter' } ] }, // ... más plantillas};Generación de PDF: templates/invoice/ + jsPDF + html2canvas
Ver detalles técnicos de territorio fiscal
Hook: useBusinessTerritory
export function useBusinessTerritory( postalCode: string | null | undefined, country: string | null | undefined) { // Detecta territorio según código postal const territory = useMemo(() => { if (country !== 'ES' || !postalCode) return 'peninsula';
const code = parseInt(postalCode.substring(0, 2));
if (code >= 35 && code <= 38) return 'canarias'; // IGIC if (code === 51 || code === 52) return 'ceuta_melilla'; // IPSI
return 'peninsula'; // IVA }, [postalCode, country]);
const taxSystem = territory === 'canarias' ? 'IGIC' : territory === 'ceuta_melilla' ? 'IPSI' : 'IVA';
return { territory, taxSystem, ... };}