Cambiar Cuenta de Usuario
Cambiar Cuenta de Usuario
Section titled “Cambiar Cuenta de Usuario”Dominio: https://test-api-factura.edw-dev.com
Dominio: https://api-financiero.e-dinky.com
Endpoint que permite a un usuario cambiar entre diferentes cuentas empresariales a las que tiene acceso. Esta funcionalidad es esencial para usuarios que administran múltiples empresas con diferentes RUCs.
Información General
Section titled “Información General”- Método:
PATCH
- Endpoint:
/api/v1/users/change-account
- Autenticación: Requerida (Bearer Token)
- Permisos: Usuario autenticado con acceso a la cuenta especificada
- Tipo de contenido:
application/json
Headers Requeridos
Section titled “Headers Requeridos”Content-Type: application/jsonAccept: application/jsonAuthorization: Bearer {token}
Parámetros del Cuerpo
Section titled “Parámetros del Cuerpo”Parámetro | Tipo | Requerido | Descripción |
---|---|---|---|
account_id | integer | Sí | ID de la cuenta empresarial a la que se desea cambiar |
Validaciones
Section titled “Validaciones”- Account ID: Debe ser un ID válido de una cuenta a la que el usuario tiene acceso
- Permisos: El usuario debe tener permisos para acceder a la cuenta especificada
- Estado: La cuenta debe estar activa
Casos de Uso
Section titled “Casos de Uso”1. Cambio entre Empresas
Section titled “1. Cambio entre Empresas”Cuando un usuario administra múltiples empresas con diferentes RUCs y necesita cambiar el contexto de trabajo.
2. Gestión Multi-empresa
Section titled “2. Gestión Multi-empresa”Para contadores o administradores que manejan la facturación de varias empresas desde una sola cuenta de usuario.
3. Cambio de Contexto
Section titled “3. Cambio de Contexto”Para cambiar entre diferentes ambientes o configuraciones empresariales.
Ejemplos de Implementación
Section titled “Ejemplos de Implementación”Solicitud Básica
Section titled “Solicitud Básica”{ "account_id": 61247344}
Respuesta Exitosa (200)
Section titled “Respuesta Exitosa (200)”{ "message": "Cuenta cambiada exitosamente", "status": "OK", "payload": { "account_id": 61247344, "company_name": "Mi Empresa Principal S.A.", "trade_name": "Empresa Principal", "ruc": "1234567890001", "role": "owner", "permissions": [ "companies.manage", "documents.create", "documents.view", "users.manage", "reports.view" ], "status": "active", "changed_at": "2025-01-17T16:45:00Z" }}
Cuenta No Válida (422)
Section titled “Cuenta No Válida (422)”{ "message": "El account_id no es válido para la empresa proporcionada.", "status": "ERROR", "payload": null, "error": { "account_id": [ "El account_id no es válido para la empresa proporcionada." ] }}
Sin Permisos (403)
Section titled “Sin Permisos (403)”{ "message": "No tienes permisos para acceder a esta cuenta", "status": "ERROR", "payload": null}
Cuenta Inactiva (422)
Section titled “Cuenta Inactiva (422)”{ "message": "La cuenta especificada está inactiva", "status": "ERROR", "payload": null, "error": { "account_id": [ "La cuenta especificada está inactiva" ] }}
Ejemplos de Código
Section titled “Ejemplos de Código”# Cambiar a otra cuenta empresarialcurl -X PATCH "https://dev-facturacion.e-dinky.test/api/v1/users/change-account" \ -H "Content-Type: application/json" \ -H "Accept: application/json" \ -H "Authorization: Bearer {token}" \ -d '{ "account_id": 61247344 }'
<?php
use Illuminate\Support\Facades\Http;
$token = 'your-api-token';
// Cambiar cuenta de usuariofunction changeUserAccount($accountId, $token) { $response = Http::withHeaders([ 'Content-Type' => 'application/json', 'Accept' => 'application/json', 'Authorization' => 'Bearer ' . $token, ])->patch('https://dev-facturacion.e-dinky.test/api/v1/users/change-account', [ 'account_id' => $accountId ]);
if ($response->successful()) { $accountData = $response->json()['payload']; echo "Cuenta cambiada exitosamente a: " . $accountData['company_name'] . "\n"; echo "RUC: " . $accountData['ruc'] . "\n"; echo "Rol: " . $accountData['role'] . "\n";
// Actualizar contexto de la aplicación session(['current_account_id' => $accountData['account_id']]); session(['current_company' => $accountData['company_name']]); session(['current_ruc' => $accountData['ruc']]);
return $accountData; } else { $errors = $response->json(); echo "Error cambiando cuenta: " . $errors['message'] . "\n";
if (isset($errors['error'])) { foreach ($errors['error'] as $field => $messages) { echo "- {$field}: " . implode(', ', $messages) . "\n"; } } return false; }}
// Ejemplo de uso$newAccountId = 61247344;$result = changeUserAccount($newAccountId, $token);
if ($result) { echo "Cambio de cuenta exitoso\n"; // Redirigir o actualizar la interfaz} else { echo "Error en el cambio de cuenta\n";}
// Función para obtener cuentas disponiblesfunction getAvailableAccounts($token) { $response = Http::withHeaders([ 'Accept' => 'application/json', 'Authorization' => 'Bearer ' . $token, ])->get('https://dev-facturacion.e-dinky.test/api/v1/users/my-accounts');
if ($response->successful()) { return $response->json()['payload']; }
return [];}
// Validar si el usuario puede cambiar a una cuenta específicafunction canChangeToAccount($accountId, $token) { $availableAccounts = getAvailableAccounts($token);
foreach ($availableAccounts as $account) { if ($account['account_id'] == $accountId && $account['status'] === 'active') { return true; } }
return false;}
const axios = require('axios');
const token = 'your-api-token';const baseURL = 'https://dev-facturacion.e-dinky.test/api/v1';
// Configurar axios con headers por defectoconst api = axios.create({ baseURL, headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', 'Authorization': `Bearer ${token}` }});
// Cambiar cuenta de usuarioasync function changeUserAccount(accountId) { try { const response = await api.patch('/users/change-account', { account_id: accountId });
const accountData = response.data.payload; console.log('Cuenta cambiada exitosamente a:', accountData.company_name); console.log('RUC:', accountData.ruc); console.log('Rol:', accountData.role);
// Actualizar contexto local localStorage.setItem('current_account_id', accountData.account_id); localStorage.setItem('current_company', accountData.company_name); localStorage.setItem('current_ruc', accountData.ruc); localStorage.setItem('user_permissions', JSON.stringify(accountData.permissions));
return accountData;
} catch (error) { if (error.response) { const errorData = error.response.data; console.error('Error cambiando cuenta:', errorData.message);
if (errorData.error) { Object.entries(errorData.error).forEach(([field, messages]) => { console.error(`- ${field}: ${messages.join(', ')}`); }); } } else { console.error('Error de conexión:', error.message); } throw error; }}
// Obtener cuentas disponiblesasync function getAvailableAccounts() { try { const response = await api.get('/users/my-accounts'); return response.data.payload; } catch (error) { console.error('Error obteniendo cuentas:', error.message); return []; }}
// Validar si se puede cambiar a una cuentaasync function canChangeToAccount(accountId) { const availableAccounts = await getAvailableAccounts();
return availableAccounts.some(account => account.account_id === accountId && account.status === 'active' );}
// Ejemplo de uso con validaciónasync function switchToAccount(accountId) { try { // Validar primero si se puede cambiar const canChange = await canChangeToAccount(accountId);
if (!canChange) { throw new Error('No tienes acceso a esta cuenta o está inactiva'); }
// Realizar el cambio const result = await changeUserAccount(accountId);
console.log('Cambio de cuenta exitoso');
// Emitir evento para actualizar la UI window.dispatchEvent(new CustomEvent('accountChanged', { detail: result }));
return result;
} catch (error) { console.error('Error en el cambio de cuenta:', error.message); throw error; }}
// UsoswitchToAccount(61247344) .then(accountData => { console.log('Nueva cuenta activa:', accountData.company_name); }) .catch(error => { console.error('Fallo el cambio de cuenta:', error.message); });
Consideraciones Importantes
Section titled “Consideraciones Importantes”Seguridad
Section titled “Seguridad”- ✅ Validación de permisos: El sistema verifica que el usuario tenga acceso a la cuenta solicitada
- ✅ Token válido: Requiere autenticación válida
- ✅ Auditoría: Todos los cambios de cuenta se registran en logs
Funcionalidad
Section titled “Funcionalidad”- 🔄 Cambio de contexto: Actualiza automáticamente el contexto de la sesión
- 🏢 Multi-empresa: Permite gestionar múltiples empresas desde una cuenta
- 📊 Permisos dinámicos: Los permisos se actualizan según la nueva cuenta
Limitaciones
Section titled “Limitaciones”- ⚠️ Cuentas activas: Solo se puede cambiar a cuentas activas
- ⚠️ Permisos requeridos: El usuario debe tener acceso previo a la cuenta
- ⚠️ Sesión válida: Requiere token de autenticación válido
Flujo Recomendado
Section titled “Flujo Recomendado”- Obtener cuentas disponibles usando el endpoint de consulta de cuentas
- Validar permisos antes de intentar el cambio
- Realizar el cambio usando este endpoint
- Actualizar contexto de la aplicación con los nuevos datos
- Redirigir o refrescar la interfaz según sea necesario
Casos de Error Comunes
Section titled “Casos de Error Comunes”- Account ID inválido: Verificar que el ID existe y es correcto
- Sin permisos: El usuario no tiene acceso a esa cuenta
- Cuenta inactiva: La cuenta está deshabilitada o suspendida
- Token expirado: Renovar el token de autenticación
Integración con Frontend
Section titled “Integración con Frontend”Este endpoint es especialmente útil para:
- Selectores de empresa en la interfaz
- Cambio rápido entre contextos empresariales
- Gestión de múltiples RUCs desde una sola sesión
- Aplicaciones multi-tenant