BPM

Come modificare la data di scadenza di un task con IBM BPM

Immaginate di dover sviluppare un “banale” processo di Service Desk.

ibm

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.

bpd

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.

htsetDueDate

I valori impostati per svolgere la prova sono riportati nella figura che segue.

formTestDueDateIl 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.

resultTestDueDate

Sorgente

TestLab – dev_0.2.twx