Immaginate di dover sviluppare un “banale” processo di Service Desk.
Dopo l’apertura del ticket, con uno qualsiasi dei punti di contatto messi a disposizione (web form, twitter, telefono, etc.), la successiva attività di “Presa in carico” ha una scadenza che è funzione dello SLA contrattualizzato con il cliente dalla società che offre il servizio.
Come possiamo modificare la data di scadenza di un task coerentemente ai turni lavorativi aziendali e/o definiti negli accordi?
Per raggiungere l’obiettivo abbiamo bisogno di uno strumento che ci consenta di implementare un “nostro” calendario lavorativo e di calcolare su di esso lo SLA.
Il prodotto IBM BPM mette a disposizione a tal fine delle API.
La strategia
In un General System Service si implementa lo script di generazione del calendario lavorativo che fa uso di un particolare oggetto, il TimePeriod, che di fatto è un’astrazione del turno.
// Remove if exist Holiday Calendar if (tw.system.findHolidayScheduleByName("Close")!=null) { tw.system.removeHolidaySchedule(tw.system.findHolidayScheduleByName("Close").id); } // Remove if exist Custom Calendar if (tw.system.findTimeScheduleByName("9AM-1PM M/F, 2PM-6PM M/F") != null) { tw.system.removeTimeSchedule(tw.system.findTimeScheduleByName("9AM-1PM M/F, 2PM-6PM M/F").id) } // Create Holiday Calendar tw.local.holidaySchedule = new tw.object.TWHolidaySchedule(); tw.local.holidaySchedule.id = ""; tw.local.holidaySchedule.name = "Close"; tw.local.holidaySchedule.dates = new tw.object.listOf.Date(); tw.local.holidaySchedule.dates[0] = new TWDate(); function addHoliday(date, format) { var x = tw.local.holidaySchedule.dates.listLength; tw.local.holidaySchedule.dates[x] = new TWDate(); tw.local.holidaySchedule.dates[x].parse(date, format) } addHoliday("20140101", "yyyyMMdd"); addHoliday("20140501", "yyyyMMdd"); addHoliday("20140815", "yyyyMMdd"); // Add Holiday Calendar to local system tw.system.addHolidaySchedule(tw.local.holidaySchedule); // Create Custom Calendar tw.local.timeSchedule = new tw.object.TWTimeSchedule(); tw.local.timeSchedule.name = "9AM-1PM M/F, 2PM-6PM M/F"; function addPeriod(from, till, format) { var timePeriod = new tw.object.TWTimePeriod(); timePeriod.startTime = new tw.object.Time(); timePeriod.startTime.parse(from, format); timePeriod.endTime = new tw.object.Time(); timePeriod.endTime.parse(till, format); timePeriod.monday = true; timePeriod.tuesday = true; timePeriod.wednesday = true; timePeriod.thursday = true; timePeriod.friday = true; timePeriod.saturday = false; timePeriod.sunday = false; return timePeriod; } tw.local.timeSchedule.periods = new tw.object.listOf.TWTimePeriod(); tw.local.timeSchedule.periods[0] = addPeriod("09:00", "13:00", "HH:mm"); tw.local.timeSchedule.periods[1] = addPeriod("14:00", "18:00", "HH:mm"); tw.local.timeSchedule.excludeHolidays = true; // Add Custom Calendar to local system tw.system.addTimeSchedule(tw.local.timeSchedule);
Non credo ci sia bisogno di commentare ulteriormente il semplice codice (javascript) sopra riportato.
In un altro General System Service si implementa lo script che utilizza la funzione calculateBusinessDate offerta dal namespace teamworks (TW).
tw.local.workSchedule = new tw.object.TWWorkSchedule(); tw.local.workSchedule.timeSchedule = tw.system.findTimeScheduleByName(tw.local.nameTimeSchedule); //tw.local.workSchedule.timeZone = tw.system.defaultTimeZone; //With defaultTimeZone my test process don't work. tw.local.workSchedule.timeZone = "Europe/Rome"; tw.local.workSchedule.holidaySchedule = tw.system.findHolidayScheduleByName(tw.local.nameHolidaySchedule); tw.local.endDate = tw.system.calculateBusinessDate(tw.local.startDate, tw.local.delta, tw.local.period, tw.local.workSchedule);
Anche in questo caso non credo ci sia bisogno di commentare il codice salvo specificare che, per un motivo che a dire il vero non ho ancora chiarito, la variabile tw.local.workSchedule.timeZone non deve essere impostata a tw.system.defaultTimeZone, ma al valore dello specifico userTimeZone (nel mio caso “Europe/Rome”).
Di seguito uno screenshot del processo di prova realizzato per testare il funzionamento.
Il primo task è una Human Activity che occorre per impostare i valori da passare alla funzione di calcolo della successiva Business Date. Nelle sue variabili private ho impostato il calendario di riferimento appena creato.
I valori impostati per svolgere la prova sono riportati nella figura che segue.
Il secondo task del processo di prova è implementato dalla Human Activity di default.
L’unica cosa interessante ai fini del test è constatare la data di scadenza calcolata a partire dalla condizione impostate nel task precedente.