El sitio donde esperamos que encuentres la inspiración necesaria para solucionar tus problemas con nuestra plataforma favorita de Microsoft
Conquista el calendario de recursos en Dynamics 365
Conquista el calendario de recursos en Dynamics 365

Conquista el calendario de recursos en Dynamics 365

En nuestro día a día como programadores nos vemos envueltos por dificultades y retos que nos ponen a prueba (algunas veces nuestra propia paciencia) y es que es realmente complejo cómo se han estructurado los calendarios en D365

En cada recurso (Ya sea persona, máquina u animal) de Field Services tenemos un calendario donde definimos el horario laboral, vacaciones, enfermedades, indisponibilidades.. esto tiene un aspecto tal que así:

Hasta aquí todo bien, porque la visualización es muy sencilla de manejar y con el nuevo control personalizado que han implementado lo es mucho más. Con unos pocos clicks y unos formularios rápidos podemos crear disponibilidades o indisponibilidades.

Pero claro, el problema es cuando intentamos integrar estos calendarios con algún ETL, DataFlow…etc La estructura que lleva por detrás es muy compleja. Os muestro este diagrama que espero que ayude a la explicación:

  1. Cada Recurso tiene un lookup a una entidad llamada “Calendar”.
  2. Cada Calendar tiene N calendarrules y a este conjunto lo llamaremos DateRule ya que, aquí nos informará de la fecha en que ocurre el evento (disponibilidad.. indisponibilidad de calendario).
  3. Cada calendarrule tiene un calendar más asociado
  4. Este segundo calendar a su vez tiene N calendarrule asociados. A este segundo conjunto de calendarrules los llamaremos TimeRule porque en este conjunto se definirá la hora.

¿Qué significa esto de que en un sitio se defina la fecha y en otro la hora? ¿Tiene algún sentido? Seguramente no (o si) pero desde luego si quieres ganarle la batalla a estos calendarios debes aceptarlo. Este sería el proceso esquematizado si desde .Net queremos informar al sistema de una disponibilidad:

0.- Queremos insertar desde .Net que un recurso trabaja el día 5 de noviembre de 2020 de 8 a 14 horas.

1.- Recuperamos el calendar asociado al recurso

2.- Creamos un calendarrule nuevo asociándolo a este calendar. Informaremos el parámetro starttime de esta entidad con la fecha 5/11/2020

3.- Creamos un registro de calendar asociado a este calendarrule.

4.- Creamos un registro de calendarrule asociado al calendar creado en el paso 3. Y no, no informaremos la hora directamente, debemos hacer una combinación de los distintos parámetros

4.1. Offset: Es la diferencia de horas desde las 12 de la noche hasta la hora de comienzo en el calendario. En este caso será 8

4.2. Duration: Es la duración total del evento. En este caso de 8 a 14 hay 6 horas y este parámetro será 6.

Espero que os sirvan estos pequeños tips acerca del calendario. No olvidéis que si tenéis alguna duda podéis consultarme sin ningún tipo de problema!!

Y no pensaréis que os iba a dejar sin un código de ejemplo, no? Aquí en este repositorio podéis encontrar ejemplos para consultar e insertar calendarios en .Net

5 comentarios

  1. mar

    Muchas gracias Enrique, después de una semana buscando las horas que no encontraba en calendarrule por fin lo he comprendido y las he encontrado!!
    Ahora queda traspasar todo este a un flow y que funcione.

      1. mar

        Hola Enrique!!
        La verdad que por ahora no paro de tropezar con los calendarios.
        Ya logré el flow con los datos de calendarrule gracias a este blog pero ahora me he tropezado con otro problema y es que no me coge las nuevas fechas de los festivos para el año 2023. 🙁
        Te detallo a ver si me iluminas, he ido al calendario que está vigente y que tienen asignados los bookableresource y he añadido los dias festivos para el año que viene, he guardado los cambios pero cuando voy a la ficha de los bookableresource y veo las horas laborables no salen esos días como festivos, sólo se ven los que había anteriormente.
        Voy a la tabla calendar y expando a calendarrule y sí que veo esos días, por lo tanto se han guardado bien y ahora es cuando me vuelvo loca porque no sé que me falta para que se vean esos cambios en las horas laborables.
        ¿que me estoy dejando en el tintero?
        Gracias anticipadas Enrique.

        1. Enrique Romero

          Buenas Mar,

          En esta casuística yo me plantearía dos escenarios:

          La primera que utilices la API que nos ofrece el Universal Resource Scheduler: https://learn.microsoft.com/en-us/dynamics365/field-service/field-service-work-hours-calendar-api. Yo cuando escribí este artículo esta API aún estaba en una preview muy temprana y no pude utilizarla.

          La segunda es que, si como yo, no tienes alternativa entonces créate el mismo escenario pero generándolo desde el control del calendario del recurso. Observa las propiedades de los registros de calendarrule que te ha generado y observa las diferencias con los que tu generes. Esta respuesta es verdad que no es una respuesta absoluta pero por lo menos espero que te dé las pistas para acercarte un poco más a la solución 😊

          Suerte Mar, ya me contarás!

          1. MAR

            Usando la API, msdyn_SaveCalendar no he tenido ningún problema me lo crea y me devuelve el InnerCalendarIds, luego hago una llamada desde postman y veo la entrada, se ha creado sin problema pero sigue sin verse en las horas laborables del bookableresource.
            Resumiendo, he añadido dias desde Programación de Vacaciones, desde la Plantilla del Calendario y desde la API, me coge los datos perfectamente pero luego no se muestran en las horas laborables que en definitiva es lo que ven los usuarios.
            Lo único que funciona es cargar una nueva plantilla con nuevas fechas (no ampliar una existente) pero tiene un enorme problema y
            es que machaca todo lo anterior, con lo que se pierde el historial anterior a la carga, lo que por lo menos para mi empresa, no es operativo.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.