Editar Negocio
Actualiza la información fiscal, legal y de contacto de tu empresa mediante un formulario organizado en tres pestañas.
- Clic en “Editar” (botón outline a la derecha de la información) — se abre el sheet lateral.
- Navega por las tres pestañas: General, Contacto y Dirección.
- Modifica los campos necesarios en cada pestaña.
- Clic en “Guardar” — los cambios se aplican inmediatamente.
Pestaña: General
Sección titulada «Pestaña: General»Configura la información fiscal y legal de tu negocio.
| Campo | Obligatorio | Validación | Ejemplo |
|---|---|---|---|
| Nombre Comercial | Sí | Mínimo 2 caracteres | Mi Empresa |
| Razón Social | Sí | Mínimo 2 caracteres | Mi Empresa S.L. |
| Tipo de Negocio | Sí | Selección de lista | Empresario individual / autónomo |
| NIF/CIF | Sí | Según tipo de negocio | B12345678 o 12345678Z |
| Moneda | Sí | EUR, USD, GBP | EUR (€) |
Configuración IRPF (solo autónomos)
Sección titulada «Configuración IRPF (solo autónomos)»Aparece únicamente si el tipo de negocio es “Empresario individual / autónomo”.
| Opción | Porcentaje | Descripción |
|---|---|---|
| Nuevo Autónomo | 7% | Primeros 3 años de actividad |
| Autónomo General | 15% | Después del periodo inicial |
Switch adicional:
| Campo | Descripción |
|---|---|
| Autónomo Profesional | Actividades profesionales (abogados, médicos, consultores) |
Pestaña: Contacto
Sección titulada «Pestaña: Contacto»Configura los datos de contacto de tu empresa.
| Campo | Obligatorio | Validación | Ejemplo |
|---|---|---|---|
| Sí | Formato email válido | contacto@miempresa.com | |
| Teléfono | No | 9 dígitos (prefijo +34 automático) | 612345678 |
| Sitio Web | No | Mínimo 3 caracteres | www.miempresa.com |
Nota: El teléfono se formatea automáticamente: solo acepta números y máximo 9 dígitos.
Pestaña: Dirección
Sección titulada «Pestaña: Dirección»Configura la dirección fiscal de tu empresa con autocompletado de Google Places.
| Campo | Obligatorio | Validación | Ejemplo |
|---|---|---|---|
| Dirección | Sí | Texto no vacío | Calle Mayor, 1 |
| Ciudad | Sí | Texto no vacío | Madrid |
| Provincia | Sí | Texto no vacío | Madrid |
| Código Postal | Sí | 5 dígitos (00000-52999) | 28001 |
| País | Sí | Código ISO 2 letras | ES |
Autocompletado de dirección
Sección titulada «Autocompletado de dirección»- Clic en el campo “Dirección” — se abre el buscador.
- Escribe la dirección — aparecen sugerencias de Google Places.
- Clic en una sugerencia — se rellenan automáticamente:
- Dirección completa
- Ciudad
- Provincia
- Código Postal
Importante: El régimen fiscal se actualiza automáticamente al seleccionar una dirección con código postal válido.
Régimen Fiscal Territorial
Sección titulada «Régimen Fiscal Territorial»Se detecta automáticamente según el código postal introducido:
| Territorio | Código Postal | Régimen | Impuestos |
|---|---|---|---|
| Península y Baleares | 01000-52999 | General | IVA: 4%, 10%, 21% |
| Canarias | 35000-38999 | Canarias | IGIC: 0%, 3%, 7%, 9.5%, 15% |
| Ceuta y Melilla | 51001-51005, 52001-52080 | Ceuta y Melilla | Exento IVA (IPSI) |
Notificación automática:
Cuando cambias el código postal y se detecta un nuevo régimen fiscal, recibes una notificación:
ℹ️ Régimen fiscal actualizado a [Nombre del Territorio]Cómo sé que lo hice bien
Sección titulada «Cómo sé que lo hice bien»- Toast de confirmación: “Negocio actualizado correctamente”.
- Los cambios se reflejan inmediatamente en la vista principal.
- Si hay campos inválidos, el botón “Guardar” está deshabilitado.
- Los campos con check verde indican validación correcta.
Errores comunes
Sección titulada «Errores comunes»| Mensaje | Causa | Solución |
|---|---|---|
| ”Faltan campos obligatorios: [lista]“ | Campos requeridos vacíos | Completa todos los campos obligatorios |
| ”El nombre debe tener al menos 2 caracteres” | Nombre muy corto | Introduce mínimo 2 caracteres |
| ”NIF/CIF inválido” | Formato incorrecto según tipo | Verifica el formato del NIF/CIF |
| ”Este NIF/CIF ya está registrado” | Tax ID duplicado | Usa otro NIF/CIF o contacta soporte |
| ”Email inválido” | Formato email incorrecto | Usa formato nombre@dominio.com |
| ”Teléfono debe ser 9 dígitos” | Longitud incorrecta | Introduce exactamente 9 dígitos |
| ”Código postal español debe ser 5 dígitos (00000-52999)“ | Formato inválido | Introduce 5 dígitos en rango válido |
Detalles técnicos — Editar Negocio
Sección titulada «Detalles técnicos — Editar Negocio»Ver validaciones del formulario
Validaciones en tiempo real:
| Campo | Validación | Código |
|---|---|---|
name | length >= 2 | VAL-NOM-01 |
legal_name | length >= 2 | VAL-LGL-01 |
tax_id | validatePersonalNif() si autónomo | VAL-TAX-01 |
tax_id | validateBusinessCif() si empresa | VAL-TAX-02 |
tax_id | Unicidad en BD (excluye negocio actual) | VAL-TAX-03 |
email | validateEmail() | VAL-EML-01 |
phone | validatePhone() y length === 9 | VAL-PHN-01 |
website | length >= 3 si no vacío | VAL-WEB-01 |
postal_code | Regex: /^[0-5][0-9]{4}$/ | VAL-ZIP-01 |
Ver lógica de actualización
Hook: useBusinessUpdate()
Archivo: src/features/_shared/hooks/useBusinessUpdate.ts
Flujo de actualización:
1. Validar todos los campos2. Verificar unicidad de tax_id (excluyendo negocio actual)3. Actualizar business_type en profiles del owner4. Actualizar businesses con nuevo data5. Invalidar cache de React Query6. Refrescar contexto de autenticación7. Mostrar toast de confirmaciónActualización de business_type:
// El business_type se guarda en profiles, no en businessesconst { data: ownerData } = await supabase .from('user_businesses') .select('user_id') .eq('business_id', currentBusinessId) .eq('role', 'owner') .maybeSingle();
if (ownerData?.user_id) { await supabase .from('profiles') .update({ business_type: formData.business_type }) .eq('user_id', ownerData.user_id);}Ver detección de territorio fiscal
Service: detectTerritory(postalCode, country)
Archivo: src/features/taxes/services/fiscal/territoryDetectionService.ts
Lógica:
function detectTerritory(postalCode: string, country: string): FiscalTerritory { if (country !== 'ES') return 'peninsula';
const code = parseInt(postalCode.substring(0, 2));
// Canarias: 35xxx-38xxx if (code >= 35 && code <= 38) return 'canarias';
// Ceuta y Melilla: 51xxx, 52xxx if (code === 51 || code === 52) return 'ceuta_melilla';
return 'peninsula';}Conversión a tax_regime:
function territoryToTaxRegime(territory: FiscalTerritory): string { switch (territory) { case 'canarias': return 'canarias'; case 'ceuta_melilla': return 'ceuta_melilla'; default: return 'general'; }}Ver integración con Google Places
Hook: useGooglePlaces()
Archivo: src/features/_shared/hooks/useGooglePlaces.ts
Flujo de autocompletado:
1. Usuario escribe en campo "Dirección"2. Hook hace request a Google Places Autocomplete API3. Devuelve predictions[] con place_id y description4. Usuario selecciona una predicción5. Hook llama getPlaceDetails(place_id)6. Extrae addressComponents con tipos: - street_number - route - locality (ciudad) - administrative_area_level_2 (provincia) - postal_code7. Actualiza formData con todos los campos8. Si postal_code válido, actualiza tax_regimeVer queries de diagnóstico
Verificar negocio actualizado:
SELECT b.id, b.name, b.legal_name, b.tax_id, b.email, b.phone, b.website, b.address, b.city, b.province, b.postal_code, b.country, b.tax_regime, b.currency, b.default_irpf_percentage, b.is_professional_freelancer, b.updated_at, p.business_typeFROM 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';Historial de actualizaciones (si se implementa auditoría):
SELECT * FROM audit_logWHERE table_name = 'businesses' AND record_id = '<business_id>'ORDER BY created_at DESCLIMIT 10;