Automatiza el alta de colaboradores externos del equipo de decoración virtual. Crea el usuario en Entra ID, asigna licencia y grupos, y prepara sus carpetas OneDrive con permisos exclusivos en 7 pasos.
El operador rellena un formulario web. El alta corre en background y puede seguirse en tiempo real. Si falla un paso intermedio, el estado queda como "partial" y la contraseña generada ya fue mostrada al operador.
Usuario cloud-only en @externos.idealista.com. Contraseña generada automáticamente (patrón Palabra##EspecialPalabra). Se añade al grupo de seguridad "Colaboradores VHS" y al grupo de licencia LIC M365 F1.
Crea #PRODUCCIO/{Nombre Apellidos}/ con subcarpetas #DOWNLOAD, #UPLOAD y ficheros .dat vacíos. Crea sincronitzacio/UPLOADS/{Nombre Apellidos}. Actualiza c.dat con la línea username--email_personal.
Rompe herencia en ambas carpetas via SharePoint REST API (_api/web/breakroleinheritance). Elimina "Colaboradores VHS". Añade Edit al nuevo usuario. Requiere scope OAuth separado del de Graph.
El orden está optimizado: Exchange replication es el paso más lento, por eso va siempre al final. Si no hay licencia disponible, el paso 7 se marca como "skipped" con aviso explícito.
POST /users cloud-only, UPN @externos.idealista.com, contraseña generada, forceChangePasswordNextSignIn=true/Decoracio Virtual/#PRODUCCIO/{Nombre Apellidos}/ + subcarpetas + ficheros .dat vacíos en el OneDrive de decoraciovirtual/Decoracio Virtual/sincronitzacio/UPLOADS/{Nombre Apellidos}sincronitzacio/c.dat, añade línea username--email_personal, resubir| Módulo | Responsabilidad |
|---|---|
services/graph_auth.py | MSAL singleton — dual scope: Graph API y SharePoint REST API (https://{tenant}-my.sharepoint.com/.default) |
services/entra_users.py | create_cloud_user(), add_user_to_group(), check_license_availability() — verifica slots disponibles antes del alta |
services/graph_onedrive.py | Operaciones carpetas: get_or_create_folder(), upload_file(), get_item_sharepoint_ids() |
services/spo_permissions.py | SharePointPermissionManager: break_inheritance(), remove_role_assignment(), add_role_assignment(), ensure_user() |
services/password_generator.py | Genera contraseñas Palabra##EspecialPalabra (port de hybrid-worker, módulo secrets) |
services/exchange_ps.py | add_user_to_mesg() — PowerShell ExchangeOnlineManagement Add-DistributionGroupMember |
services/onboarding_service.py | Orquestador: ejecuta 7 pasos, loguea en DB, gestiona status partial/failed/completed, retry Exchange infinito |
Graph API no soporta breakRoleInheritance. Los permisos de carpetas usan SharePoint REST API (_api/web/...) que requiere un token OAuth con scope separado: https://{tenant}-my.sharepoint.com/.default. MSAL cachea por scope — mismo app object.
Los usuarios cloud-only nuevos pueden tardar 10-30 minutos en propagarse a Exchange Online. El paso 7 reintenta cada 60s indefinidamente. Solo se sale del loop con éxito o con error no-not-found.
La App Registration necesita permiso Sites.Selected bajo SharePoint API (no Graph). Además requiere grant explícito al site via POST /sites/{id}/permissions. Son dos capas independientes.
El certificado FC402921 está solo en sisapps (Windows cert store). Por seguridad nunca se copia a otras máquinas (decomanager, etc.). Es el motivo por el que este proyecto se despliega en sisapps y no en la máquina de decoración virtual.
| Tabla | Descripción |
|---|---|
onboarding_requests | Una fila por alta: datos de entrada, entra_user_id, contraseña generada, status (pending→in_progress→completed/partial/failed) |
onboarding_steps | Log paso a paso: número, nombre, status, detalle, timestamps, error. Permite trazar exactamente dónde falló. |
users | SSO con is_admin |
cd C:\apps\jmfernandez\onboarding-colaboradores
.\deploy.ps1
# git pull + pip install sisapps-ui + restartgraph.onedrive_client_id | cb98c13f (app deco manager, permisos OneDrive + SPO) |
graph.certificate_thumbprint | FC402921 — solo en sisapps |
onboarding.license_group_id | Grupo LIC M365 F1 |
onboarding.security_group_id | Grupo "Colaboradores VHS" |
onboarding.upn_domain | @externos.idealista.com |
sso.dev_bypass_upn | Bypass SSO en desarrollo (vaciar en producción) |