Sistema de Onboarding
El sistema de onboarding de Cannahub gestiona el proceso completo de registro y activación de nuevos miembros, desde la verificación inicial hasta la aprobación final. Este proceso asegura el cumplimiento regulatorio y la validación de documentación médica.
Flujo General del Onboarding
El proceso de onboarding se divide en dos fases principales: registro inicial (completado por el miembro) y activación de cuenta (gestionado por el club).
Estados del Onboarding
El sistema gestiona múltiples estados para rastrear el progreso de cada miembro:
Estados de Progreso
- Name
PhoneVerification- Type
- inicial
- Description
Esperando verificación de teléfono por SMS.
- Name
HasReprocann- Type
- en progreso
- Description
Selección si el usuario tiene REPROCANN.
- Name
ReprocannProcess- Type
- en progreso
- Description
Proceso de obtención de REPROCANN (sin REPROCANN).
- Name
PersonalInformation- Type
- en progreso
- Description
Datos personales incompletos.
- Name
Schedule- Type
- en progreso
- Description
Programar consulta médica.
- Name
Payment- Type
- en progreso
- Description
Pago de consulta pendiente.
- Name
RegisterPendingApproval- Type
- esperando
- Description
Solicitud enviada, pendiente de revisión del admin.
- Name
ReprocannSyncCode- Type
- en progreso
- Description
Sincronización de código REPROCANN.
- Name
MedicalConsultation- Type
- en progreso
- Description
Consulta médica en proceso.
- Name
DocumentSigning- Type
- en progreso
- Description
Documentos pendientes de firma.
- Name
Contract- Type
- en progreso
- Description
Firma de contrato.
- Name
MembershipSelection- Type
- en progreso
- Description
Selección de membresía.
- Name
Done- Type
- activo
- Description
Cuenta completamente activa.
Estados de Onboarding
{
"PhoneVerification": "Verificación de teléfono",
"HasReprocann": "Selección REPROCANN",
"ReprocannProcess": "Proceso REPROCANN",
"PersonalInformation": "Información personal",
"Schedule": "Programar consulta",
"Payment": "Pago pendiente",
"RegisterPendingApproval": "Pendiente aprobación",
"ReprocannSyncCode": "Sincronización REPROCANN",
"MedicalConsultation": "Consulta médica",
"DocumentSigning": "Firma de documentos",
"ReprocannPending": "REPROCANN pendiente",
"Contract": "Contrato",
"MembershipSelection": "Selección membresía",
"Done": "Cuenta activa"
}
Endpoints de Onboarding
Verificación de Teléfono - Enviar SMS
Envía un código SMS al número proporcionado para verificación.
Request
- Name
phone- Type
- string
- Description
Número de teléfono sin código de país. Ejemplo:
1155551234
- Name
countryCode- Type
- string
- Description
Código de país. Ejemplo:
+54
Response
- Name
success- Type
- boolean
- Description
Indica si el SMS fue enviado exitosamente.
- Name
nextStep- Type
- string
- Description
Siguiente paso del onboarding.
Enviar SMS
curl -X POST https://api.cannahub.tech/api/onboarding/phone/send \
-H "Content-Type: application/json" \
-d '{
"phone": "1155551234",
"countryCode": "+54"
}'
Response
{
"success": true,
"nextStep": "PhoneVerification"
}
Verificar Código SMS
Verifica el código de 6 dígitos enviado por SMS.
Request
- Name
phone- Type
- string
- Description
Número de teléfono verificado.
- Name
code- Type
- string
- Description
Código de 6 dígitos recibido por SMS.
Verificar Código
curl -X POST https://api.cannahub.tech/api/onboarding/phone/verify \
-H "Content-Type: application/json" \
-d '{
"phone": "1155551234",
"code": "123456"
}'
Response Exitosa
{
"success": true,
"nextStep": "HasReprocann",
"user": {
"id": "cust_123",
"phoneNumber": "1155551234",
"phoneCountry": "+54"
}
}
Establecer Estado REPROCANN
Indica si el usuario ya tiene REPROCANN o necesita obtenerlo.
Request
- Name
hasReprocann- Type
- boolean
- Description
truesi el usuario ya tiene REPROCANN,falsesi necesita obtenerlo.
Response
- Name
success- Type
- boolean
- Description
Indica si se actualizó exitosamente.
- Name
nextStep- Type
- string
- Description
PersonalInformationsi tiene REPROCANN,ReprocannProcesssi no.
Set HasReprocann
curl -X POST https://api.cannahub.tech/api/onboarding/has-reprocann \
-H "Content-Type: application/json" \
-H "Authorization: Bearer {token}" \
-d '{
"hasReprocann": true
}'
Response
{
"success": true,
"nextStep": "PersonalInformation",
"user": {
"id": "cust_123",
"hasReprocann": true
}
}
Guardar Información Personal
Guarda los datos personales del nuevo miembro.
Request
- Name
firstName- Type
- string
- Description
Nombre del miembro.
- Name
lastName- Type
- string
- Description
Apellido del miembro.
- Name
document- Type
- string
- Description
Documento Nacional de Identidad (DNI).
- Name
bornDate- Type
- string
- Description
Fecha de nacimiento (YYYY-MM-DD).
Guardar Datos
curl -X POST https://api.cannahub.tech/api/onboarding/personal-info \
-H "Content-Type: application/json" \
-H "Authorization: Bearer {token}" \
-d '{
"firstName": "Juan",
"lastName": "Pérez",
"document": "30123456",
"bornDate": "1990-05-15"
}'
Response
{
"success": true,
"nextStep": "Schedule",
"user": {
"id": "cust_123",
"firstName": "Juan",
"lastName": "Pérez",
"bornDate": "1990-05-15",
"document": "30123456"
}
}
Vincular REPROCANN
Vincula el código REPROCANN del miembro con el club.
Request
- Name
code- Type
- string
- Description
Código de vinculación de REPROCANN (8-12 caracteres alfanuméricos).
- Name
expirationDate- Type
- string
- Description
Fecha de expiración del REPROCANN (YYYY-MM-DD).
Validaciones
- El código debe tener entre 8 y 12 caracteres alfanuméricos
- Debe estar vigente en el sistema REPROCANN
- No debe estar vinculado a otro club
Vincular REPROCANN
curl -X POST https://api.cannahub.tech/api/onboarding/reprocann/link \
-H "Content-Type: application/json" \
-H "Authorization: Bearer {token}" \
-d '{
"code": "ABC12345",
"expirationDate": "2025-01-15"
}'
Response Exitosa
{
"success": true,
"nextStep": "PersonalInformation",
"user": {
"id": "cust_123",
"hasReprocann": true,
"medicalRecord": {
"reprocannCode": "ABC12345",
"reprocannExpiration": "2025-01-15"
}
}
}
Actualizar Paso del Onboarding
Actualiza el paso actual del onboarding para el usuario.
Request
- Name
step- Type
- OnboardingStep
- Description
Nuevo paso del onboarding.
- Name
metadata- Type
- object
- Description
Metadata adicional para guardar con el paso.
Actualizar Paso
curl -X POST https://api.cannahub.tech/api/onboarding/step \
-H "Content-Type: application/json" \
-H "Authorization: Bearer {token}" \
-d '{
"step": "MembershipSelection"
}'
Response
{
"success": true,
"nextStep": "MembershipSelection",
"user": {
"id": "cust_123",
"onboardingStep": "MembershipSelection"
}
}
Obtener Estado del Onboarding
Obtiene el estado actual del proceso de onboarding del usuario.
Response
- Name
currentStep- Type
- string
- Description
Paso actual del onboarding.
- Name
completedSteps- Type
- array
- Description
Lista de pasos completados.
- Name
user- Type
- object
- Description
Datos del usuario.
Estado del Onboarding
curl -G https://api.cannahub.tech/api/onboarding/status \
-H "Authorization: Bearer {token}"
Response
{
"currentStep": "PersonalInformation",
"completedSteps": [
"PhoneVerification",
"HasReprocann"
],
"user": {
"id": "cust_123",
"firstName": "Juan",
"phoneNumber": "1155551234",
"hasReprocann": true
}
}
Arquitectura del Dominio
El onboarding sigue el patrón de arquitectura de dominios:
src/
├── app/api/onboarding/ # BFF Routes
│ ├── status/route.ts
│ ├── phone/send/route.ts
│ ├── phone/verify/route.ts
│ ├── personal-info/route.ts
│ ├── reprocann/link/route.ts
│ ├── has-reprocann/route.ts
│ └── step/route.ts
├── api/medusa/SSR/onboarding.ts # SSR Functions
├── types/custom/onboarding.ts # Types
└── features/User/Onboarding/
├── services/
│ └── onboarding.client.ts # Client Service
├── hooks/
│ ├── keys.ts # Query Keys
│ ├── queries.ts # React Query Queries
│ ├── mutations.ts # React Query Mutations
│ └── index.ts
└── store/
└── onboarding.store.ts # Zustand Store
Errores Comunes
- Name
INVALID_PHONE- Type
- 400
- Description
Formato de teléfono inválido.
- Name
CODE_EXPIRED- Type
- 400
- Description
El código de verificación expiró. Solicite uno nuevo.
- Name
CODE_INVALID- Type
- 400
- Description
Código de verificación incorrecto.
- Name
REPROCANN_INVALID- Type
- 400
- Description
Código REPROCANN no válido (debe tener 8-12 caracteres alfanuméricos).
- Name
STEP_INVALID- Type
- 400
- Description
Paso de onboarding no válido.