Realizar operaciones con fechas

<< Click to Display Table of Contents >>

Navigation:  Bizagi Studio > Asistente de Procesos > Reglas de Negocio > Ejemplos de reglas de negocio >

Realizar operaciones con fechas

Muchas situaciones de negocio necesitan comparar fechas y realizar cálculos con ellas. Esta sección presenta varios ejemplos de cómo realizar operaciones comunes entre fechas.

 

Asignar la fecha de hoy a un atributo de tipo fecha.

Comparar fechas

Restar fechas

Restar fechas de acuerdo al esquema de trabajo de un usuario

Agregar fechas

Agregar fechas de acuerdo al esquema de trabajo

Agregar fechas de acuerdo al esquema de trabajo de un usuario

Verificar si una fecha es un día de trabajo

Verificar si una fecha es un día de trabajo para un usuario específico

Verificar si una hora es una hora de trabajo

Verificar si una hora es una hora de trabajo para un usuario específico

Calcular la edad

 

Para ilustrar cómo funcionan las operaciones entre fechas lea el siguiente ejemplo: El administrador del proceso Solicitud de Vacaciones maneja las actividades necesarias para aprobar las vacaciones de un empleado. Cuando un empleado crea una solicitud, este debe ingresar la fecha de salida y la fecha de regreso. Utilizando estos valores, el sistema calcula el número de días solicitados.

 

En el ejemplo vamos a utilizar operaciones entre fechas para:

 

Asignar la fecha de hoy como fecha de la solicitud (atributo RequestDate)

Definir la duración de las actividades

Verificar que la fecha de regreso de vacaciones sea mayor a la fecha de salida, si no, se debe mostrar un  mensaje de validación.

Calcular el número de días solicitados.

 

El siguiente es el modelo de datos del proceso.

 

Date Operations1

 

Asignar la fecha de hoy a un atributo

Para asignar la fecha de hoy al atributo Request Date, seleccione la opción Acciones de la actividad del paso cuatro del asistente.

Dé clic en la actividad donde desea agregar la expresión.

 

Date Operations2

 

Incluya un elemento de expresión y seleccione el atributo sobre el cual se va a hacer la asignación.

Use la opción Modelo de datos para navegar a través del Modelo de datos.

 

Date Operations3

 

 

Asigne la fecha de hoy al atributo utilizando la función Today de la categoría Fechas y tiempos.

 

Date Operations4

 

La expresión debe lucir de la siguiente forma:

 

Date Operations5

 

<VacationRequest.RequestDate>=DateTime.Today;

 

Clic en Ok para guardar los cambios.

 

Comparar Fechas

En este punto es necesario validar que la fecha de regreso de las vacaciones sea mayor a la fecha de salida. Si no, se debe mostrar un mensaje al usuario final. Para hacer esto es necesario realizar una comparación entre las fechas.

 

1. En el cuarto paso del Asistente, seleccione la opción Acciones de la actividad.

Dé clic en la tarea donde la acción será ejecutada y cree una expresión.

 

Date Operations2

 

2. En el elemento de expresión, cree la comparación utilizando los operadores menor que, mayor que o igual que (<,> o =).

 

Date Operations7

 

3. Cree la condición IF para comparar los atributos.

 

Date Operations8

 

Se debe mostrar un mensaje de error al usuario final cuando la fecha de regreso es menor que la fecha de salida.

Use la función Throw validation error de la categoría Validación de datos para configurar la validación.

 

Date Operations9

 

La expresión debe lucir de la siguiente forma:

 

Date Operations10

 

// Si la fecha de salida es mayor o igual a la fecha de regreso muestre el mensaje de error.
if (<VacationRequest.LeavingDate>>=<VacationsRequest.ReturningDate>)
{
  CHelper.ThrowValidationError("Returning Date cannot be less than the Leaving Date");
}

 

4. Guarde la regla dando clic en Ok.

Ahora puede probar la regla, si ingresa una fecha de regreso mayor que la fecha de salida se muestra el siguiente mensaje:

 

 

Date Operations19

 

 

Verificar si la fecha es un día laboral

Suponga que se quiere verificar la fecha de regreso del viaje es un día laboral. Si no es un día laboral se debe mostrar un mensaje de error, de lo contrario la aplicación continúa con la siguiente actividad.

 

1. En el cuarto paso del Asistente seleccione la opción Acciones de la actividad.

Dé clic en la actividad donde se ejecutará la acción y cree una Expresión.

 

Date Operations2

 

2. En un módulo de expresión cree un condicional if. Evalúe si la fecha de regreso es un día laboral utilizando la función IsWorkingDay de la categoría Validación de datos.

 

Date Operations32

 

Utilice como parámetro de entrada la fecha de regreso (ReturningDate) del modelo de datos.

 

Date Operations33

 

La función IsWorkingDay, regresará verdadero si la fecha es un día laboral, de lo contrario regresa falso.

 

 

Date Operations34

 

 

//Evalúa si el día es laboral
if (CHelper.IsWorkingDay(Me,<TravelRequest.ReturningDate>)==false)
{
  CHelper.ThrowValidationError("Returning day is non working.");
}

 

Guarde la regla dando clic en Ok.

 

 

Verificar si una fecha es un día laboral para un usuario específico

En un Proceso de Solicitud de Viaje usted puede iniciar un caso en la actividad de Registro de Solicitud. Usted debe ingresar la fecha de partida. Si la fecha de partida no es un día laboral para el solicitante, se debe mostrar una validación para evidenciar esta situación.

 

Para saber si la fecha de partida es un día laboral para el solicitante, usted puede utilizar la función CHelper.IsWorkingDayForUser. Este método devuelve Verdadero si un día específico es un día laboral de acuerdo al esquema de trabajo del usuario. En otro caso, devuelve Falso.

 

Esta función utiliza dos parámetros:

 

idUser: Id del usuario para el cual se evalúa el día laboral.

dtDate: Fecha a evaluar.

 

La sintaxis de esta función es:

CHelper.IsWorkingDayForUser(idUser,dtDate)

 

Cree una expresión como una acción A la Salida de la actividad Registrar solicitud.

 

CHelper31

 

Use la función IsWorkingDayForUser utilizando como parámetro la fecha de partida y el identificador del creador del caso.

 

CHelper33

 

 

//Obtenga el identificador del creador del caso

var Creator=Me.Case.Creator.Id;

//Evalúe si la fecha de partida es un día laboral para el solicitante

if (CHelper.IsWorkingDayForUser(Creator,<TravelRequest.LeavingDate>)==false)

{

CHelper.ThrowValidationError("Depart day is non working.");

}

 

 

Verificar si una hora es una hora laboral

Suponga que usted tiene un proceso en el cual se debe programar una reunión (una fecha y hora específica).
Usted desea validar si la fecha seleccionada por el usuario final es una hora laboral bajo el esquema laboral de la organización.

 

Para saber si la hora tentativa de la reunión es una hora laboral, usted puede hacer uso de la función CHelper.IsWorkingMinute. Este método devuelve Verdadero si una fecha específica cae bajo el esquema de trabajo de la organización. De lo contrario, devuelve Falso.

 

Esta función utiliza dos parámetros:

 

Me

dtDate: Fecha a evaluar. Esta considera el día calendario así como la hora definida para este.

 
La sintaxis de esta función es:

CHelper.IsWorkingMinute(Me,dtDate)

 

Cree una expresión como una acción a la salida de la tarea donde se programa la reunión.

 

 

CHelper59

 

Utilice la función IsWorkingMinute usando como parámetro de entrada la fecha de la reunión. Así mismo, utilice una validación para notificar al usuario final que la fecha seleccionada no es una opción válida (si ese es el caso).

 

 

Chelper58

 

 

//Evalúe si la fecha de la reunión es una hora laboral

if (CHelper.IsWorkingMinute(Me,<TravelRequest.LeavingDate>)==false)

{

CHelper.ThrowValidationError("Meeting hour is non working.");

}

 

Verificar si una hora es una hora laboral para un usuario específico

Suponga que tiene un proceso en el cual, el jefe del usuario creador del caso necesita agendar una reunión con él (una fecha y una hora específica.
Usted desea validar que la fecha seleccionado por el jefe es una hora laboral para el esquema de trabajo del usuario creador del caso.

 

Para saber si la hora de reunión es una hora laboral, utilice la función CHelper.IsWorkingMinuteForUser. Este método retorna Verdadero si una fecha específica cae vajo el esquema de trabajo de un usuario dado. De lo contrario, retorna Falso.

 

Esta función utiliza dos parámetros:

 

idUser: Identificador del usuario al cuál se le evalúa el minuto laboral.

dtDate: Fecha a evaluar. Considere el día calendario como el tiempo definido (hora del día).

 
La sintaxis de esta función es:

CHelper.IsWorkingMinuteForUser(idUser,dtDate)

 

Cree una expresión Al Salir de la Tarea donde se programa la reunión.

 

CHelper96

 

Utilice la función IsWorkingMinuteForUser y asigne como parámetros el usuario creador del caso y la fecha de reunión. También, use una validación para notificarle al usuario final que la fecha seleccionada no es una opción válida (de ser este el caso).

 

CHelper97

 

//Obtenga el id del creador
var Creator=Me.Case.Creator.Id;
//Evalúe si la hora de reunión es una hora de trabajo del solicitante
if (CHelper.IsWorkingMinuteForUser(Creator,<Project.ResultsMeeting>)==false)
{
  CHelper.ThrowValidationError("Meeting hour is not in requester's working time.");  
}

 

Resta de fechas (diferencia entre fechas)

El siguiente ejemplo ilustra cómo encontrar la diferencia entre dos fechas: en días, años, horas o minutos. La función utilizada para el ejemplo retorna la diferencia de tiempo considerando solamente días laborales.

 

El número de días laborales de su solicitud serán calculados utilizando la  fecha de salida y de regreso de sus vacaciones.

 

1. En el cuarto paso del Asistente seleccione la opción Acciones de la actividad.

Seleccione la actividad donde se ejecutará esta acción y cree una expresión Al Guardar de la misma.

 

Date Operations2

 

2. Declare las variables fecha de inicio y fecha final dando clic en la opción Variables y luego seleccione la opción Nuevo.

 

 

Date Operations6

 

 

3. Inicialice las variables con los valores de los atributos correspondientes.

Date Operations11

 

 

4. La diferencia de fechas se guardará en un atributo del modelo de datos llamado NumberofBusinessDaysReq. Utilice la opción modelo de datos para incluir el atributo.

 

5. Utilice la función GetEffectiveDuration de la categoría Fechas y tiempos para calcular la diferencia de fechas.

 

 

Date Operations12

 

Los parámetros de la función son: una fecha de inicio (Start date) y una fecha de fin (End date).

En este caso, estas fechas son las variables StartDate y FinalDate declaradas previamente.

 

Date Operations13

//Inicializar variables
Start=<VacationRequest.LeavingDate>;
End=<VacationsRequest.ReturningDate>;
//Calcular los días de la solicitud y guardarlos en un atributo
<VacationRequest.NumberofBusinessDaysReques>=CHelper.getEffectiveDuration(Me,Start,End)/480;

 

Note que la expresión previa es dividida por 480.

La función retorna la diferencia en minutos; por lo tantom, el resultado se debe convertir a días. Por defecto, el tiempo de trabajo (laboral) para esta aplicación tiene 8 horas diarias (60 min.* 8 horas = 480 min) por lo que la respuesta se divide en 480. Si el resultado es requerido en minutos, la división puede ser omitida.

note_pin

El cálculo se realiza considerando el esquema laboral organizacional.

Es decir, la diferencia de fechas (desde la fecha de inicio hasta la fecha de fin) excluirá los periodos de tiempo no laborales.

 

 

Luego de que la expresión ejecute el cálculo, el valor podrá observarse en el campo Number of business days requested.

 

Date Operations20

 

 

 

Resta de fechas de acuerdo al esquema de trabajo de un usuario

El siguiente ejemplo ilustra cómo encontrar la diferencia entre dos fechas teniendo en cuenta el esquema de trabajo de un usuario específico: en días, años, horas o minutos. La función utilizada para el ejemplo retorna la diferencia de tiempo considerando solamente días laborales para dicho usuario.

 

El número de días laborales de su solicitud serán calculados utilizando la  fecha de salida y de regreso de sus vacaciones.

 

1. En el cuarto paso del Asistente seleccione la opción Acciones de la actividad.

Seleccione la actividad donde se ejecutará esta acción y cree una expresión Al Guardar de la misma.

 

Date Operations2

 

2. Declare las variables StartDate y FinalDate, dando clic en la opción Variables y luego seleccione la opción Editar.

 

 

Date Operations6

 

 

3. Inicialice las variables con los valores de los atributos correspondientes.

Date Operations11

 

 

4. La diferencia de fechas se guardará en un atributo del modelo de datos llamado NumberofBusinessDaysReq. Utilice la opción modelo de datos para incluir el atributo.

 

5. Utilice la función GetEffectiveDurationForUser de la categoría Fechas y tiempos para calcular la diferencia de fechas.

 

 

Date Operations35

 

Los parámetros de la función son: id del Usuario (idUser), una fecha de inicio (Start date) y una fecha de fin (End date).

En este caso el usuario es el solicitante de las vacaciones. La fecha de inicio y de fin serán las variables declaradas anteriormente.

 

 

Date Operations36

 

//Inicializar variables
Start=<VacationRequest.LeavingDate>;
End=<VacationsRequest.ReturningDate>;
//Calcular los días de la solicitud y guardarlos en un atributo
<VacationRequest.NumberofBusinessDaysReques>=CHelper.getEffectiveDurationForUser(<VacationRequest.Requester.idUser>,Start,End)/480;

 

Note que la expresión previa es dividida por 480.

La función retorna la diferencia en minutos; por lo tantom, el resultado se debe convertir a días. Por defecto, el tiempo de trabajo (laboral) para esta aplicación tiene 8 horas diarias (60 min.* 8 horas = 480 min) por lo que la respuesta se divide en 480. Si el resultado es requerido en minutos, la división puede ser omitida.

note_pin

El cálculo se realiza considerando el esquema laboral del usuario especificado. Es decir, la diferencia de fechas (desde la fecha de inicio hasta la fecha de fin) excluirá los periodos de tiempo no laborales de dicho usuario.

 

 

Luego de que la expresión ejecute el cálculo, el valor podrá observarse en el campo Number of business days requested.

 

Date Operations20

 

 

Agregar fechas

Suponga que la última actividad del proceso de Solicitud de Vacaciones debe realizarse en los cinco días posteriores al regreso del empleado de sus vacaciones. Para calcular esa fecha, es necesario agregar cinco días al atributo.

Para realizar esta acción vamos a utiliza una función .NET que permite agregar días a un atributo o variable.

 

ResultingDate=Date.AddDays(Value);

 

Otras funciones .Net que permiten la adición de horas, meses o años:

 

ResultingDate=Date.AddHours(Value);

ResultingDate=Date.AddMonths(Value);

ResultingDate=Date.AddYears(Value);

 

Si quiere restar horas, días, meses o años, utilice la misma función pero con valores negativos:

ResultingDate=Date.AddDays(-Value);

 

Para establecer la duración de una tarea utilice la función Estimated Solution date.

 

1. En el cuarto paso del Asistente seleccione la opción Acciones de la actividad.

Seleccione la actividad donde se ejecutará esta acción y cree una expresión Al Guardar de la misma.

 

Date Operations18

 

2. Declare dos variables de tipo date time.

 

LeavingDate: Guarda el atributo Fecha de regreso de vacaciones del empleado.

FixedDate: Guarda la fecha límite derivada de la función, se utilizará para definir la duración de la tarea.

 

Date Operations14

 

 

3. La duración de la tarea se calcula con base en el atributo Fecha de regreso del modelo de datos. El valor del atributo será guardado en la variable ReturningDate.

 

Date Operations15

 

4. La fecha límite de la tarea. Se debe agregar cinco días a la fecha guardada en la variable ReturningDate.

El resultado será asignado a la variable FixedDate.

 

Date Operations16

 

5. Asigne la duración de la tarea utilizando la función Estimated solution date de la categoría Fechas y tiempos.

 

En la siguiente imagen muestra la expresión:

 

Date Operations17

 

//Obtener el valor de un atributo y guardarlo en una variable de tipo date time.
ReturningDate=<VacationRequest.ReturningDate>;
//Calcular la fecha límite y guardarlo en una variable de tipo date time
FixedDate=ReturningDate.AddDays(5);
//Asignar la duración de la actividad con base al cálculo realizado.
Me.EstimatedSolutionDate=FixedDate;

 

Dé clic en Ok para guardar cambios.

 

Calcular una fecha con base al esquema de trabajo

Suponga que necesita calcular una fecha con base a una fecha más cierto periodo de tiempo. Esto se debe hacer teniendo en cuenta el esquema de trabajo de la organización, de modo que no se incluyan periodos de tiempo no laborales.

 

La última actividad del proceso de Solicitud de Vacaciones debe ser completada en un máximo de cinco días laborales luego de que el empleado regrese de sus vacaciones.

 

Vamos a utilizar la función getEstimatedDate, la cual retorna una fecha, dada una fecha inicial (guardada en la variable dtFromDate) y un periodo de tiempo (5 días guardados en la variable iDuration), la función considera el esquema de trabajo. La duración de la función siempre se debe dar en minutos.

 

1. Siga los pasos 1-4 del ejemplo anterior.

 

2. Para calcular la nueva fecha utilice la función getEstimatedDate  de la categoría Fechas y tiempos.

 

Date Operations31

 

 

Date Operations29

 

La sintaxis para la función es:

 

CHelper.getEstimatedDate(Me,dtFromDate,iDuration)

 

note_pin

Esta función no considera los festivos configurados para la organización. Si su requerimiento de negocios necesita incluirlos, puede usar la función getSolutionDate.

 

Ambas funciones comparten los mismos atributos y la sintaxis para esta es:

 

CHelper.getSolutionDate(Me,dtFromDate,iDuration)

 

 

Note que la expresión anterior convierte días en minutos.

La conversión del parámetro iDuration es necesaria, ya que la función espera el valor en minutos. Por defecto, el esquema de trabajo tiene definido un día laboral de 8 horas. El total de minutos de los cinco días se calcula con la siguiente formula: 60 minutos de una hora por 8 horas por día y de nuevo por 5 días (5*8*60).

 

Finalmente asigne la duración de la tarea.

 

Date Operations30

 

///Obtener el valor de un atributo y guardarlo en una variable de tipo date time.
ReturningDate=<VacationRequest.ReturningDate>;
//Calcular la fecha límite y guardarlo en una variable de tipo date time
// Si necesita incluir los festivos de la organización, utilice
// FixedDate=CHelper.getSolutionDate(Me,ReturningDate,5*8*60);
FixedDate=CHelper.getEstimatedDate(Me,ReturningDate,5*8*60);
//Asignar la duración de la actividad con base al cálculo realizado.
Me.EstimatedSolutionDate=FixedDate;

 

Calcular una fecha con base al esquema de trabajo de un usuario

Suponga que necesita calcular la fecha de solución en un proceso interno de Administración Quejas y Reclamos, el usuario asignado para solucionar el incidente cuenta con seis días para enviar una respuesta de acuerdo a su esquema de trabajo. El solicitante y el usuario asignado pueden tener dos esquemas de trabajo diferentes debido a que la compañía tiene dos divisiones en dos paises diferentes y cada usuario podría pertenecer a uno diferente.

 

Para saber la fecha de respuesta, usted puede usar la función CHelper.getEstimatedDateForUser. Este método retorna la fecha final dada una fecha inicial y un número de minutos. Este calculo se hace agregando o restando el número de minutos al parámetro de la fecha inicial basándose en el esquema de trabajo de un usuario específico.

 

Esta función utiliza tres parámetros:

 

idUser: Identificador del Usuario al cual se evaluará el esquema de trabajo.

dtFromDate: Fecha a la cual se le agregarán o restarán el número dado de minutos.

iDuration: Número de minutos a agregar o sustraer de la fecha inicial.

 

La sintaxis correcta es:

 

CHelper.getEstimatedDateForUser(idUser,dtFromDate,iDuration)

 

note_pin

Esta función no considera los festivos configurados para el usuario especificado. Si su requerimiento de negocios necesita incluirlos, puede usar la función getSolutionDateForUser.

 

Ambas funciones comparten los mismos atributos y la sintaxis para esta es:

 

CHelper.getSolutionDateForUser(idUser,dtFromDate,iDuration)

 

 

Cree una expresión Al Salir de la tarea Recibir Solicitud (Receive Request), la nueva expresión estará de última ya que el usuario asignado se establece en expresiones anteriores.

 

CHelper98

Utilice la función getEstimatedDateForUser y establezca como parámetros de entrada, el Id del usuario asignado, la fecha de apertura y los seis días representados en minutos (ingrese 6*8*60). Agregue el resultado al atributo correspondiente en su modelo de datos.

 

CHelper99

 

// Obtenga el usuario
var AssignedUser = <ClaimandComplaintRequest.Person.Id>;
// Calcule la fecha límite desde la fecha de apertura añadiendo 6 x 8 x 60 minutos

// Si necesita incluir los festivos de los usuarios, utilice:

// var AnswerDate = CHelper.getSolutionDateForUser(AssignedUser, <ClaimandComplaintRequest.OpeningDate>, 6*8*60);
var AnswerDate = CHelper.getEstimatedDateForUser(AssignedUser, <ClaimandComplaintRequest.OpeningDate>, 6*8*60);
// Establezca la fecha límite con el resultado de la función
<ClaimandComplaintRequest.DueDate> = AnswerDate;

 

Calcular una edad

Es posible obtener el día, mes o año especifico de una fecha guardada en un atributo. Esto es muy útil en situaciones donde se necesita realizar cálculos con base a esa información, por ejemplo el cálculo de la edad de una persona basándose en la fecha de nacimiento.

 

Suponga que necesita calcular la edad de un empleado, con base a la fecha de nacimiento almacenada en la entidad Empleado.

 

Date Operations21

 

1. Defina una expresión en la actividad donde se quiere calcular la edad del empleado.

 

Date Operations23

 

2. En el editor de expresiones, agregue cuatro variables como se muestra a continuación.

 

Date Operations22

 

3. Asigne el valor del atributo DateofBirth a la variable BirthDate.

Del mismo modo se asignará la fecha actual a la variable TodayDate.

 

Date Operations24

 

 

 

4. El cálculo de la edad necesita la porción del año, tanto del año de nacimiento como la del año actual en el formato número.

Separe cada fecha en tres segmentos diferentes: año, mes y días.

Respectivamente asigne la porción del año de cada año a las variables YearToday (año de la fecha de hoy), YearBirth (año de la fecha de nacimiento)

 

Date Operations25

 

 

Date Operations26

 

Reste los dos años como se muestra a continuación:

 

Date Operations27

 

 

//Inicializar variables
BirthDate=<VacationRequest.Employee.DateofBirth>;
Todaydate=DateTime.Today;
 
//Separar componentes
BirthDate=new DateTime(BirthDate.Year,BirthDate.Month,BirthDate.Day);
TodayDate=new DateTime(TodayDate.Year,TodayDate.Month,TodayDate.Day);
 
//Asignar años
YearBirth=BirthDate.Year;
YearToday=TodayDate.Year;
 
//Calcular edad
<VacationRequest.Employee.Age>=YearToday-YearBirth;

 

Clic en Ok para guardar cambios.

 

6. Si desea validar si la fecha de hoy cae después del cumpleaños, puede agregar la siguiente validación:

 

Date Operations28

 

//Validación de cumpleaños
if (BirthDate<TodayDate)
{
//Calculo de la edad
  <VacationRequest.Employee.Age>=YearToday-YearBirth;
}