@startuml uml-activity-asignacion-auto-orden !include _style.iuml title 1. Asignación automática de prestador al crear orden start partition "Cliente" { :Solicitar servicio desde app móvil; :Confirmar dirección, servicio y horario; } partition "API ExpressMX" { :Validar payload y permisos del cliente; :INSERT INTO ordenes_servicio\n(estatus = 'solicitada', prestador_id = NULL); } partition "Trigger SQL asignar_prestador_auto" { :Leer servicio_id, fecha_programada,\nduracion_estimada_min; :Calcular ventana [inicio, fin]; :Construir CTE candidatos:\nprestadores activos\n+ servicio activo\n+ recibe_ordenes = true\n+ sin choque de horario; note right Filtros: usuarios.activo, servicios_prestador.activo, rango tstzrange exclusivo. end note :Ordenar por carga_activa ASC,\ncarga_futura ASC, RANDOM(); if (¿hay candidatos disponibles?) then (sí) :SELECT primer prestador del ranking; :UPDATE ordenes_servicio\nSET prestador_id, estatus = 'asignada'; if (¿UPDATE afectó fila?) then (sí) :INSERT historial_estatus_orden\n(solicitada -> asignada,\nnota = 'Asignación automática'); else (no) :Conflicto de concurrencia; stop endif else (no) :Mantener estatus 'solicitada'; note left Orden queda en cola hasta que un prestador libere capacidad o RRHH intervenga. end note stop endif } partition "Prestador" { :Recibir notificación push\ncon detalle de orden; if (¿acepta dentro de SLA?) then (sí) :Marcar 'en_camino'; stop else (no) :Rechazo o timeout; :Re-encolar para reasignación; stop endif } footer Fuente: 00.sql (asignar_prestador_auto, trigger asignar_prestador_auto_after_insert) @enduml