Ir al contenido

Eliminar Negocio

Borra un negocio del sistema mediante soft-delete (establece deleted_at en lugar de eliminar físicamente).

Requisito: Solo disponible si tienes más de un negocio activo.

  1. Clic en “Eliminar” (botón rojo destructive) — se abre diálogo de confirmación.
  2. Lee la advertencia sobre la eliminación permanente.
  3. Escribe el nombre del negocio para confirmar.
  4. Clic en “Eliminar Negocio” — el negocio se marca como eliminado.

El negocio se marca con deleted_at, pero NO se eliminan físicamente los datos:

  • No se elimina: Facturas, clientes, productos, empleados (quedan inaccesibles)
  • Se conserva: Historial completo por compliance fiscal
  • ⚠️ Cambio de contexto: Cambias automáticamente a otro negocio activo

ALERTA: Esta acción no se puede deshacer. Contacta soporte si necesitas recuperar un negocio eliminado.

CondiciónAcción
Solo tienes 1 negocioBotón “Eliminar” no aparece
Tienes 2+ negociosBotón “Eliminar” disponible
No eres ownerNo tienes acceso a esta función
  • Toast de confirmación: “Negocio eliminado. El negocio y todos sus datos han sido eliminados permanentemente”.
  • Cambias automáticamente a otro negocio activo.
  • El negocio eliminado ya no aparece en el selector de negocios.
MensajeCausaSolución
”No se pudo eliminar el negocio”Error de servidorIntenta de nuevo o contacta soporte
Botón “Eliminar” no apareceSolo tienes 1 negocioNo puedes eliminar tu único negocio
”Acceso restringido”No eres ownerSolo propietarios pueden eliminar
Ver lógica de soft-delete

Componente: BusinessManager.tsx

Función: handleDeleteBusiness()

Flujo:

1. Validar que canDeleteBusiness === true (más de 1 negocio)
2. Soft delete: SET deleted_at = NOW()
3. Obtener lista de negocios restantes (WHERE deleted_at IS NULL)
4. Cambiar a primer negocio restante: switchToBusiness(remainingBusinesses[0].id)
5. Refrescar datos de autenticación: refreshBusinessData()
6. Invalidar cache de React Query
7. Mostrar toast de confirmación

Query de soft-delete:

UPDATE businesses
SET deleted_at = NOW()
WHERE id = '<business_id>';
Ver políticas de recuperación

RLS Policies:

Las políticas RLS filtran automáticamente negocios con deleted_at IS NOT NULL:

-- Política de aislamiento de negocios
CREATE POLICY businesses_business_isolation ON businesses
FOR ALL
USING (
deleted_at IS NULL
AND EXISTS (
SELECT 1 FROM user_businesses
WHERE business_id = businesses.id
AND user_id = auth.uid()
)
);

Recuperación manual (solo admin):

-- Solo ejecutable por administradores de Supabase
UPDATE businesses
SET deleted_at = NULL
WHERE id = '<business_id>';
Ver queries de auditoría

Negocios eliminados de un usuario:

SELECT
b.id,
b.name,
b.legal_name,
b.tax_id,
b.deleted_at,
ub.role
FROM businesses b
JOIN user_businesses ub ON b.id = ub.business_id
WHERE ub.user_id = '<user_id>'
AND b.deleted_at IS NOT NULL
ORDER BY b.deleted_at DESC;

Contar registros asociados a negocio eliminado:

SELECT
(SELECT COUNT(*) FROM invoices WHERE business_id = '<business_id>') as facturas,
(SELECT COUNT(*) FROM customers WHERE business_id = '<business_id>') as clientes,
(SELECT COUNT(*) FROM products WHERE business_id = '<business_id>') as productos,
(SELECT COUNT(*) FROM employees WHERE business_id = '<business_id>') as empleados;