Determinar Días Hábiles y Horas Horario de Trabajo con Arcade

Document created by xander_bakker on Oct 24, 2017
Version 1Show Document
  • View in full screen mode

En el blog Usar Arcade para graficar el tiempo que una solicitud está abierta explicamos como se puede usar ArcGIS Arcade | ArcGIS for Developers  para determinar los días que una solicitud está abierta. Sin embargo, el método aplicado en el blog no toma en cuenta fines de semana y festivos ni tampoco el horaria de oficina. A continuación explicamos como se puede tener en cuenta los días hábiles y un horario de trabajo.

 

 

Calcular los días hábiles que una solicitud está abierta

De varios clientes hemos escuchado que les guste la opción de calcular los días que una solicitud está abierta, pero para los negocios es necesario excluir los fines de semanas y festivos en este cálculo.

 

Abajo la expresión de Arcade para lograr esto:

// listado de festivos paar 2017, 2018 y 2019
var lst_festivos = ["01/01/2017","09/01/2017","20/03/2017","13/04/2017","14/04/2017","01/05/2017","29/05/2017",
"19/06/2017","26/06/2017","03/07/2017","20/07/2017","07/08/2017","21/08/2017","16/10/2017",
"31/12/2016","06/11/2017","13/11/2017","08/12/2017","25/12/2017","01/01/2018","08/01/2018",
"19/03/2018","29/03/2018","30/03/2018","01/05/2018","14/05/2018","04/06/2018","11/06/2018",
"31/12/2017","02/07/2018","20/07/2018","07/08/2018","20/08/2018","15/10/2018","05/11/2018",
"12/11/2018","08/12/2018","25/12/2018","01/01/2019","07/01/2019","25/03/2019","18/04/2019",
"19/04/2019","01/05/2019","03/06/2019","24/06/2019","01/07/2019","31/12/2018","01/07/2019",
"20/07/2019","07/08/2019","19/08/2019","14/10/2019","04/11/2019","11/11/2019","08/12/2019",
"25/12/2019"];

var hoy = Now();
var fecha = $feature.FechaHora;

Console("fecha:" + fecha);

var date_i = fecha;
var days = 0;
var max_i = Round(DateDiff(hoy, fecha, "days") + 1,0);

var test = -1;
var fin_semana = [0, 6];
Console("");
for (var i = 0; i < max_i; i++) {
    date_i = DateAdd(date_i, 1, "days");
    Console("date_i: " + date_i);
    if (date_i > hoy) {
        Console("break");
        break;
    }
    var week_day = WeekDay(date_i);
    test = IndexOf(fin_semana, week_day);
    if (test != -1) {
        // no incrementar dias habiles
        Console("no incrementar dias: " + week_day);
    } else {
        // validar si es festivo
        var date_i_txt = Text(date_i, "D/MM/Y");
        Console(date_i_txt);
        test = IndexOf(lst_festivos, date_i_txt);
        if (test != -1) {
            // festivo
            Console("no incrementar es festivo:" + date_i_txt);
        } else {
            days += 1;
            Console(" - days:" + days);
        }
    }
}

Console(" - resultado days:" + days);
return Round(days, 0);

 

En este caso usamos una variable lst_festivos que contiene un listado de festivos en Colombia para los años 2017, 2018 y 2019. Además es importante excluir los sábados y domingos con tienen valores 0 y 6 al aplicar la función "WeekDay" (ver linea 31). En este caso solamente los días enteros (incluyendo la hora) son incluidos en el resultado. Puesto que habrá una fracción de día, entramos a aplicar el horario de oficina (8 am a 5 pm) para definir cuantos horas además de los días la solicitud está abierta.

 

Calcular el tiempo adicional a los días que una solicitud está abierta

En esta caso asumimos un horario de oficina de 8 am a 5 pm (pero esto se puede configurar en la expresión). Abajo podemos observar que tiempo se debe considerar en algunos casos que se pueden presentar (no son todos los casos). El día empiece a las 8 am y termine a las 5 pm. En naranja con un "S" está marcado el momento en que fue registrado la solicitud, en azul con un "A" la hora que es actualmente y en verde el tiempo que se debe retornar. 

 

Abajo la expresión de Arcade que nos permite hacer eso:

Function CorrectDate(date_in, start_of_day, end_of_day) {
    var date_corr = date_in;
    if (date_in < start_of_day) {
        date_corr = start_of_day;
    } else if (date_in > end_of_day) {
        date_corr = end_of_day;
    }
    return date_corr;
}

var fecha = $feature.FechaHora;
var hoy = Now();
var hora_now = Hour(hoy);
var min_now = Minute(hoy);
var hora_sol = Hour(fecha);
var min_sol = Minute(fecha);
var year_now = Year(hoy);
var month_now = Month(hoy);
var day_now = Day(hoy);

var fecha_now = Date(year_now, month_now, day_now, hora_now, min_now, 0);
var fecha_sol = Date(year_now, month_now, day_now, hora_sol, min_sol, 0);

var start_day = Date(year_now, month_now, day_now, 8, 0, 0);
var end_day = Date(year_now, month_now, day_now, 17, 0, 0);

// correct fecha_now and fecha_sol
fecha_now = CorrectDate(fecha_now, start_day, end_day);
fecha_sol = CorrectDate(fecha_sol, start_day, end_day);
Console(" fecha_now (corr): " + fecha_now);
Console(" fecha_sol (corr): " + fecha_sol);

var horas_dif = 0;
if (fecha_now > fecha_sol) {
    var horas_dif = DateDiff(fecha_now, fecha_sol, "hours");
} else if (fecha_sol > fecha_now) {
    var horas_dif1 = DateDiff(end_day, fecha_sol, "hours");
    var horas_dif2 = DateDiff(fecha_now, start_day, "hours");
    var horas_dif = horas_dif1 + horas_dif2;
}

var h_dif = Floor(horas_dif, 0);
var m_dif = Round((horas_dif - h_dif) * 60, 0);
Console("h_dif: " + h_dif);
Console("m_dif: " + m_dif);

return Text(h_dif, "00") + ":" + Text(m_dif, "00")

 

Al combinar las expresiones se puede obtener este resultado en la ventana emergente:

 

Recursos

Attachments

    Outcomes