Mi Negocio
Ruta:
/owner/settings/businessConfigura y actualiza todos los datos de tu negocio: información fiscal, contacto y dirección.
Vista general
Sección titulada «Vista general»La pantalla de Mi Negocio muestra la información actual de tu empresa en tres secciones organizadas:
Secciones de información:
| Sección | Icono | Contenido |
|---|---|---|
| General | Building2 | Nombre comercial, razón social y NIF/CIF |
| Contacto | Email, teléfono y sitio web | |
| Dirección | MapPin | Dirección completa, ciudad, provincia y código postal |
Badges informativos:
| Badge | Descripción | Colores |
|---|---|---|
| Tipo de negocio | Autónomo / Nuevo Autónomo / Empresa | Verde (nuevo), Azul (autónomo), Morado (empresa) |
| Régimen fiscal | Canarias (IGIC) / Ceuta y Melilla (IPSI) | Gris outline |
| Autónomo Profesional | Actividades profesionales | Azul |
Acciones disponibles: Editar, Eliminar (solo si tienes más de un negocio)
Tipos de negocio
Sección titulada «Tipos de negocio»Factux distingue entre dos tipos principales de negocio:
Empresario individual / autónomo
Sección titulada «Empresario individual / autónomo»Características:
- Usa NIF personal (formato: 12345678Z)
- Dos opciones de retención IRPF: 7% (nuevo autónomo) o 15% (general)
- Puede marcarse como “Autónomo Profesional” para actividades profesionales
Retenciones IRPF:
| Tipo | Porcentaje | Cuándo aplicar |
|---|---|---|
| Nuevo Autónomo | 7% | Primeros 3 años de actividad |
| Autónomo General | 15% | Después del periodo inicial |
Empresa (S.L., S.A., etc.)
Sección titulada «Empresa (S.L., S.A., etc.)»Características:
- Usa CIF empresarial (formato: B12345678)
- No aplica retención IRPF
- Requiere razón social completa
Régimen fiscal territorial
Sección titulada «Régimen fiscal territorial»El régimen fiscal se detecta automáticamente según el código postal:
┌──────────────────┐│ Código Postal │└────────┬─────────┘ │ Auto-detecta┌────────▼─────────┐│ Régimen Fiscal │└──────────────────┘Regímenes disponibles
Sección titulada «Regímenes disponibles»| Territorio | Código Postal | Impuesto | Tipos |
|---|---|---|---|
| Península y Baleares | 01000-52999 | IVA | 4%, 10%, 21% |
| Canarias | 35000-38999 | IGIC | 0%, 3%, 7%, 9.5%, 15% |
| Ceuta y Melilla | 51001-51005, 52001-52080 | IPSI | Exento IVA |
Importante: El régimen fiscal se actualiza automáticamente al cambiar el código postal.
Estado de completitud
Sección titulada «Estado de completitud»El sistema valida que todos los campos obligatorios estén completos:
Campos obligatorios:
| Campo | Validación | Ejemplo |
|---|---|---|
| Nombre comercial | Mínimo 2 caracteres | Mi Empresa |
| Razón social | Mínimo 2 caracteres | Mi Empresa S.L. |
| NIF/CIF | Formato válido según tipo | B12345678 / 12345678Z |
| Formato email válido | contacto@miempresa.com | |
| Dirección | No vacío | Calle Mayor, 1 |
| Ciudad | No vacío | Madrid |
| Provincia | No vacío | Madrid |
| Código Postal | 5 dígitos (00000-52999) | 28001 |
| País | Código ISO 2 letras | ES |
Funciones
Sección titulada «Funciones»| Función | Descripción | Documentación |
|---|---|---|
| Editar Negocio | Actualiza información del negocio en tres pestañas | Ver |
| Eliminar Negocio | Borra un negocio (solo si tienes más de uno) | Ver |
| Crear Nuevo Negocio | Abre wizard para configurar otro negocio | Ver |
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»Ver esquema de tablas
| Tabla | Columnas principales | FK |
|---|---|---|
businesses | id, name, legal_name, tax_id, email, phone, website, address, city, province, postal_code, country, tax_regime, currency, logo_url, bank_accounts | — |
profiles | user_id, business_type | auth.users |
user_businesses | user_id, business_id, role | auth.users, businesses |
Campos de configuración fiscal:
| Campo | Tipo | Descripción |
|---|---|---|
tax_regime | text | ’general’ | ‘canarias’ | ‘ceuta_melilla’ |
fiscal_regime | text | Régimen fiscal específico |
fiscal_territory_code | text | Código de territorio fiscal |
default_irpf_percentage | numeric | 7 o 15 (solo autónomos) |
is_professional_freelancer | boolean | Si es autónomo profesional |
Políticas RLS
Sección titulada «Políticas RLS»Ver políticas de seguridad
| Política | Regla |
|---|---|
businesses_business_isolation | Solo acceso a negocios del usuario autenticado |
profiles_own_profile | Solo lectura/escritura del propio perfil |
user_businesses_own_businesses | Solo acceso a relaciones del usuario |
Tipos TypeScript
Sección titulada «Tipos TypeScript»Ver definiciones de tipos
Business Row:
{ id: string; name: string; // Nombre comercial legal_name: string; // Razón social tax_id: string; // NIF/CIF email: string; phone: string | null; website: string | null; address: string; city: string; province: string; postal_code: string; country: string; // Default: 'ES' currency: string; // Default: 'EUR' tax_regime: string | null; // 'general' | 'canarias' | 'ceuta_melilla' fiscal_regime: string | null; fiscal_territory_code: string | null; default_irpf_percentage: number | null; // 7 o 15 is_professional_freelancer: boolean | null; logo_url: string | null; bank_accounts: Json | null; invoice_series: string | null; invoice_start_number: number | null; invoice_style: string | null; created_at: string | null; updated_at: string | null; deleted_at: string | null;}BusinessUpdateData:
interface BusinessUpdateData { name: string; legal_name: string; tax_id: string; email: string; phone?: string; website?: string; address: string; city: string; province: string; postal_code: string; country: string; currency: string; tax_regime?: string; fiscal_regime?: string; is_professional_freelancer?: boolean; default_irpf_percentage?: number; logo_url?: string; bank_accounts?: any[];}Validaciones
Sección titulada «Validaciones»Ver funciones de validación
Validadores en src/utils/validators.ts:
| Función | Validación | Retorno |
|---|---|---|
validatePersonalNif(value) | NIF personal con letra válida | { valid: boolean, message: string } |
validateBusinessCif(value) | CIF empresarial con dígito de control | { valid: boolean, message: string } |
validateEmail(value) | Formato email RFC 5322 | { valid: boolean, message: string } |
validatePhone(value) | Teléfono español 9 dígitos | { valid: boolean, message: string } |
Validación de código postal:
// Regex: ^[0-5][0-9]{4}$// Rango: 00000-52999Hooks personalizados
Sección titulada «Hooks personalizados»Ver hooks de React
useBusinessUpdate:
const { updateBusiness, isUpdating } = useBusinessUpdate();
// Actualiza el negocio y refresca el contexto de autenticaciónawait updateBusiness(data: BusinessUpdateData);useBusinessTerritory:
const { territory, territoryName, taxRatesDescription } = useBusinessTerritory(postalCode: string, country: string);
// Detecta automáticamente el territorio fiscal desde código postaluseTaxIdValidation:
const { checkTaxIdExists, isChecking } = useTaxIdValidation();
// Verifica unicidad del NIF/CIFconst { exists } = await checkTaxIdExists(taxId: string, excludeBusinessId?: string);Componentes principales
Sección titulada «Componentes principales»Ver componentes React
| Componente | Ubicación | Descripción |
|---|---|---|
BusinessManager | src/features/_shared/components/business/BusinessManager.tsx | Componente principal que muestra la información del negocio |
BusinessEditSheet | src/features/_shared/components/business/BusinessEditSheet.tsx | Sheet modal con formulario de edición en 3 pestañas |
NewBusinessFormSheet | src/features/_shared/components/business/NewBusinessFormSheet.tsx | Wizard de creación de nuevo negocio |
DeleteBusinessDialog | src/features/_shared/components/business/DeleteBusinessDialog.tsx | Diálogo de confirmación para eliminar negocio |
Queries de diagnóstico
Sección titulada «Queries de diagnóstico»Ver queries SQL útiles
Negocio completo con tipo de usuario:
SELECT b.*, p.business_type, ub.roleFROM businesses bJOIN user_businesses ub ON b.id = ub.business_idJOIN profiles p ON ub.user_id = p.user_idWHERE b.id = '<business_id>' AND ub.role = 'owner';Verificar unicidad de NIF/CIF:
SELECT id, name, tax_id, deleted_atFROM businessesWHERE tax_id = '<tax_id>' AND deleted_at IS NULL;Negocios de un usuario con roles:
SELECT b.id, b.name, b.legal_name, b.tax_id, ub.roleFROM businesses bJOIN user_businesses ub ON b.id = ub.business_idWHERE ub.user_id = '<user_id>' AND b.deleted_at IS NULLORDER BY b.created_at DESC;Detectar territorio fiscal desde código postal:
SELECT code, name, default_vat_rate, reduced_vat_rate, super_reduced_vat_rateFROM fiscal_territoriesWHERE '<postal_code>' BETWEEN postal_code_start AND postal_code_end;Errores comunes
Sección titulada «Errores comunes»| Error | Causa | Solución |
|---|---|---|
| ”El NIF/CIF ya está registrado” | Tax ID duplicado en otro negocio | Usa otro NIF/CIF o contacta soporte |
| ”Código postal inválido” | No cumple formato 00000-52999 | Introduce 5 dígitos válidos |
| ”Email inválido” | Formato incorrecto | Usa formato nombre@dominio.com |
| ”Teléfono debe ser 9 dígitos” | Longitud incorrecta | Introduce exactamente 9 dígitos |
| ”Acceso restringido” | Usuario no es owner | Solo propietarios pueden editar |