W tym podmodule definiuje się graf etapów procesu ze wskazaniem obsługiwanej klasy obiektów (pośrednio grupa użytkowników) oraz możliwych przejść w grafie.

W przykładowym rozwiązaniu stosowanym w Politechnice Warszawskiej przyjęto, że opracowanie odbywa się w dwóch etapach:

przy czym w obydwu etapach, zakres działań oraz uprawnienia jednostki centralnej (COP) znaczeni różnią się od tego, co może wykonywać kierownik projektu (poziom wydziału)

Z tego powodu wyróżniono cztery fazy obiegu opracowania:

  1. Rozpoczęcie projektu - przygotowanie rekordu projektu przez COP: COP_01

    1. klasa obiektów: Projekty zarządzane przez COP

    2. możliwe przejścia:

      • Faculty_01

      • Faculty_02

  2. Rozpoczęcie projektu - uzupełnianie opisu projektu przez wydział (kierownika) w fazie początkowej: Faculty_01

    1. klasa obiektów: Projekty zarządzane przez COP

    2. możliwe przejścia:

      • COP_01

  3. Realizacja/Zakończenie projektu - modyfikacja rekordu projektu przez COP: COP_02

    1. klasa obiektów: Projekty zarządzane przez COP

    2. możliwe przejścia:

      • Faculty_01

      • Faculty_02

  4. Realizacja/Zakończenie projektu - uzupełnianie opisu projektu przez wydział (kierownika) w fazie trwania/zakończenia projektu: Faculty_02

    1. klasa obiektów: Projekty zarządzane przez COP

    2. możliwe przejścia:

      • COP_02

Uprawnieni użytkownicy mogą we właściwym stanie opisu “przekazać” rekord do opracowania w innej fazie. wynikającej z potrzeb dalszego uzupełniania danych gromadzonych w opisie projektu.

Poniższe rysunki pokazują najważniejsze pola na formularzu definicji rekordu workflow.

Formularz definicji rekordu workflow zawiera miedzy innymi poniższe pola, które są najbardziej istotne dla definiowania procesu:

Adres odbiorców poczty elektronicznej może być wyznaczany automatycznie na dwa sposoby:

przy czym możliwe jest stosowanie kilku metod oraz skryptu jednocześnie.

Zasady wykorzystania dostępnych metod ustalania adresatów poczty opisane są w podrozdziale Metody automatycznego ustalania adresów poczty elektronicznej.

Przykładowa metoda została użyta w definicji fazy FACULTY_01 i wygląda jak na poniższym rysunku

przy czym treść tej definicji jest następująca:

Skrypt określający adresatów poczty elektronicznej może zawierać następującą treść:

// build email address list of the record owner's unit chief
function chiefEmail(aff, cdaoHelper, iulq) {
var gemail='';
var ca='';
var csep='';
var semail='';
var culq='';
 if (culq =='') {
  var lid = 'cop_HB';
  switch (aff) {
	case 'DPK' : lid = 'cop_BK'; break;
	case 'DFS' : lid = 'cop_MLC'; break;
	case 'DPM' : lid = 'cop_AG'; break;
  }
  culq='login=\''+lid+'\'';
 } else culq = iulq;
 var lu = cdaoHelper.listQ(culq, 'user', "id;ascending");
 if (lu.size() > 0) {
  for (var i1=0; i1<lu.size(); i1++) {
	if (lu[i1].author) {
	 ca=lu[i1].author;
	 if (gemail !='') csep=';';
	 if (ca.email) {semail=ca.email;if (gemail.toLowerCase().indexOf(semail.toLowerCase()) ==-1) gemail=gemail+csep+ca.email;}
	}
  }
 }
 return gemail;
}
var daoHelper = component('daoHelper');
var temail='';
var cemail='';
var csep='';
if (entity) {
 if (entity.owner) {
  var ouq='login=\''+entity.owner+'\' or jcr:contains(@alias,\''+entity.owner+'\')';
  var ou = daoHelper.listQ(ouq, 'user', 'id;ascending');
  if (ou.size() > 0) {
   if (ou[0].author) {
	var oa=ou[0].author;
	if (temail !='') csep=';';
	if (oa.email) temail=temail+oa.email;
	if (oa.affiliation) {
	 var affil = oa.affiliation;
	 if (affil.accronymPL) {
		aff = affil.accronymPL;
		cemail=chiefEmail(aff, daoHelper, '');
		if (cemail !='') {
		 if (temail !='') csep=';';
		 temail=temail+csep+cemail;
		}
	 }
	}
   }
  }
 }
 if (temail =='') {
  if (entity.administratorUnit) {
	if (entity.administratorUnit.accronymPL) {
		aff = entity.administratorUnit.accronymPL;
		cemail=chiefEmail(aff, daoHelper, '');
		if (cemail !='') {
		 if (temail !='') csep=';';
		 temail=temail+csep+cemail;
		}
	}
  }
 }
 if (temail =='') {
	var tulq='login=\'cop_BK\' or login=\'cop_MLC\' or login=\'cop_AG\' or login=\'cop_HB\'';
	cemail=chiefEmail(aff, daoHelper, tulq);
	if (cemail !='') {
	 if (temail !='') csep=';';
	 temail=temail+csep+cemail;
	}
 }
}
temail;