← Volver al índice
👤 Decoración Virtual — Alta colaboradores externos

Onboarding Colaboradores

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.

🌟 Python 3 + Flask + Waitress
Graph API + SharePoint REST
🌐 Puerto 8089
🏠 WinSW Service
En producción
7
Pasos de onboarding
Retry Exchange (replicación)
2
Carpetas OneDrive creadas
SSO
Entra ID App Proxy

Cómo funciona

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.

🔐 Entra ID cloud-only

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.

📁 OneDrive

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.

🔒 Permisos SharePoint

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.

Los 7 pasos del alta

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.

1
Crear usuario en Entra IDPOST /users cloud-only, UPN @externos.idealista.com, contraseña generada, forceChangePasswordNextSignIn=true
2
Añadir a grupo licencia LIC M365 F1 — group-based licensing. Precheck de disponibilidad antes del paso 1.
3
Crear carpeta #PRODUCCIO/Decoracio Virtual/#PRODUCCIO/{Nombre Apellidos}/ + subcarpetas + ficheros .dat vacíos en el OneDrive de decoraciovirtual
4
Crear carpeta UPLOADS/Decoracio Virtual/sincronitzacio/UPLOADS/{Nombre Apellidos}
5
Actualizar c.dat — descarga sincronitzacio/c.dat, añade línea username--email_personal, resubir
6
Configurar permisos — SharePoint REST API: breakRoleInheritance en ambas carpetas → remove Colaboradores VHS → add Edit al nuevo usuario
7
Añadir a grupo Colaboradores VHS (MESG) — Exchange Distribution Group. Retry infinito cada 60s hasta que Exchange replique el nuevo usuario. Skipped si sin licencia.

Servicios y responsabilidades

MóduloResponsabilidad
services/graph_auth.pyMSAL singleton — dual scope: Graph API y SharePoint REST API (https://{tenant}-my.sharepoint.com/.default)
services/entra_users.pycreate_cloud_user(), add_user_to_group(), check_license_availability() — verifica slots disponibles antes del alta
services/graph_onedrive.pyOperaciones carpetas: get_or_create_folder(), upload_file(), get_item_sharepoint_ids()
services/spo_permissions.pySharePointPermissionManager: break_inheritance(), remove_role_assignment(), add_role_assignment(), ensure_user()
services/password_generator.pyGenera contraseñas Palabra##EspecialPalabra (port de hybrid-worker, módulo secrets)
services/exchange_ps.pyadd_user_to_mesg() — PowerShell ExchangeOnlineManagement Add-DistributionGroupMember
services/onboarding_service.pyOrquestador: ejecuta 7 pasos, loguea en DB, gestiona status partial/failed/completed, retry Exchange infinito

Consideraciones clave

⚠ Graph vs SharePoint REST

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.

⏱ Exchange replication delay

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.

🔒 Sites.Selected

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.

🔗 Certificado en sisapps

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.

Esquema SQLite

TablaDescripción
onboarding_requestsUna fila por alta: datos de entrada, entra_user_id, contraseña generada, status (pendingin_progresscompleted/partial/failed)
onboarding_stepsLog paso a paso: número, nombre, status, detalle, timestamps, error. Permite trazar exactamente dónde falló.
usersSSO con is_admin

Deploy y configuración

Deploy

cd C:\apps\jmfernandez\onboarding-colaboradores .\deploy.ps1 # git pull + pip install sisapps-ui + restart

Config clave (app-config.json)

graph.onedrive_client_idcb98c13f (app deco manager, permisos OneDrive + SPO)
graph.certificate_thumbprintFC402921 — solo en sisapps
onboarding.license_group_idGrupo LIC M365 F1
onboarding.security_group_idGrupo "Colaboradores VHS"
onboarding.upn_domain@externos.idealista.com
sso.dev_bypass_upnBypass SSO en desarrollo (vaciar en producción)
Onboarding Colaboradores · Equipo de Sistemas · 2026