Ir al contenido

Editar Negocio

Actualiza la información fiscal, legal y de contacto de tu empresa mediante un formulario organizado en tres pestañas.

  1. Clic en “Editar” (botón outline a la derecha de la información) — se abre el sheet lateral.
  2. Navega por las tres pestañas: General, Contacto y Dirección.
  3. Modifica los campos necesarios en cada pestaña.
  4. Clic en “Guardar” — los cambios se aplican inmediatamente.

Configura la información fiscal y legal de tu negocio.

CampoObligatorioValidaciónEjemplo
Nombre ComercialMínimo 2 caracteresMi Empresa
Razón SocialMínimo 2 caracteresMi Empresa S.L.
Tipo de NegocioSelección de listaEmpresario individual / autónomo
NIF/CIFSegún tipo de negocioB12345678 o 12345678Z
MonedaEUR, USD, GBPEUR (€)

Aparece únicamente si el tipo de negocio es “Empresario individual / autónomo”.

OpciónPorcentajeDescripción
Nuevo Autónomo7%Primeros 3 años de actividad
Autónomo General15%Después del periodo inicial

Switch adicional:

CampoDescripción
Autónomo ProfesionalActividades profesionales (abogados, médicos, consultores)

Configura los datos de contacto de tu empresa.

CampoObligatorioValidaciónEjemplo
EmailFormato email válidocontacto@miempresa.com
TeléfonoNo9 dígitos (prefijo +34 automático)612345678
Sitio WebNoMínimo 3 caractereswww.miempresa.com

Nota: El teléfono se formatea automáticamente: solo acepta números y máximo 9 dígitos.

Configura la dirección fiscal de tu empresa con autocompletado de Google Places.

CampoObligatorioValidaciónEjemplo
DirecciónTexto no vacíoCalle Mayor, 1
CiudadTexto no vacíoMadrid
ProvinciaTexto no vacíoMadrid
Código Postal5 dígitos (00000-52999)28001
PaísCódigo ISO 2 letrasES
  1. Clic en el campo “Dirección” — se abre el buscador.
  2. Escribe la dirección — aparecen sugerencias de Google Places.
  3. 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.

Se detecta automáticamente según el código postal introducido:

TerritorioCódigo PostalRégimenImpuestos
Península y Baleares01000-52999GeneralIVA: 4%, 10%, 21%
Canarias35000-38999CanariasIGIC: 0%, 3%, 7%, 9.5%, 15%
Ceuta y Melilla51001-51005, 52001-52080Ceuta y MelillaExento 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]
  • 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.
MensajeCausaSolución
”Faltan campos obligatorios: [lista]“Campos requeridos vacíosCompleta todos los campos obligatorios
”El nombre debe tener al menos 2 caracteres”Nombre muy cortoIntroduce mínimo 2 caracteres
”NIF/CIF inválido”Formato incorrecto según tipoVerifica el formato del NIF/CIF
”Este NIF/CIF ya está registrado”Tax ID duplicadoUsa otro NIF/CIF o contacta soporte
”Email inválido”Formato email incorrectoUsa formato nombre@dominio.com
”Teléfono debe ser 9 dígitos”Longitud incorrectaIntroduce exactamente 9 dígitos
”Código postal español debe ser 5 dígitos (00000-52999)“Formato inválidoIntroduce 5 dígitos en rango válido
Ver validaciones del formulario

Validaciones en tiempo real:

CampoValidaciónCódigo
namelength >= 2VAL-NOM-01
legal_namelength >= 2VAL-LGL-01
tax_idvalidatePersonalNif() si autónomoVAL-TAX-01
tax_idvalidateBusinessCif() si empresaVAL-TAX-02
tax_idUnicidad en BD (excluye negocio actual)VAL-TAX-03
emailvalidateEmail()VAL-EML-01
phonevalidatePhone() y length === 9VAL-PHN-01
websitelength >= 3 si no vacíoVAL-WEB-01
postal_codeRegex: /^[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 campos
2. Verificar unicidad de tax_id (excluyendo negocio actual)
3. Actualizar business_type en profiles del owner
4. Actualizar businesses con nuevo data
5. Invalidar cache de React Query
6. Refrescar contexto de autenticación
7. Mostrar toast de confirmación

Actualización de business_type:

// El business_type se guarda en profiles, no en businesses
const { 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 API
3. Devuelve predictions[] con place_id y description
4. Usuario selecciona una predicción
5. Hook llama getPlaceDetails(place_id)
6. Extrae addressComponents con tipos:
- street_number
- route
- locality (ciudad)
- administrative_area_level_2 (provincia)
- postal_code
7. Actualiza formData con todos los campos
8. Si postal_code válido, actualiza tax_regime
Ver 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_type
FROM businesses b
JOIN user_businesses ub ON b.id = ub.business_id
JOIN profiles p ON ub.user_id = p.user_id
WHERE b.id = '<business_id>'
AND ub.role = 'owner';

Historial de actualizaciones (si se implementa auditoría):

SELECT * FROM audit_log
WHERE table_name = 'businesses'
AND record_id = '<business_id>'
ORDER BY created_at DESC
LIMIT 10;