Download - Bibliotheek in ProcessMaker - cs.uu.nl · Bibliotheek in ProcessMaker Gevraagd wordt voor een bibliotheek een informatiesysteem te ontwerpen. De bibliotheek heeft een aantal bibliothecarissen

Transcript

Bibliotheek in ProcessMaker Gevraagd wordt voor een bibliotheek een informatiesysteem te ontwerpen. De bibliotheek heeft

een aantal bibliothecarissen die de verzameling beheren, en leden die deze boeken kunnen lenen.

Leden mogen maximaal 2 boeken thuis hebben. Daarnaast wil de bibliothecaris nieuwe boeken

kunnen bestellen bij de verschillende leveranciers. Gevraagd wordt hier een informatiesysteem voor

te ontwerpen.

Er zijn dus twee processen van belang: boeken aanschaffen en boeken lenen.

Specificatie

Datamodel

BookMember

User

Supplier Offer

Locationba

d

c

Voor de bibliotheek gebruiken we een versimpeld datamodel. Boeken staan op een locatie in de kast

(relatie b) of zijn uitgeleend aan een lid (relatie a). Als relatie a niet gezet is, is het boek aanwezig in

de bibliotheek. Voor een boek worden offertes uitgebracht (relatie c) door een supplier (relatie d).

Proces 1: boek aanschaffen

In dit model gaan we ervan uit dat er 5 leveranciers zijn.

Analyse: Het model is sound omdat a) alle plaatsen afgedekt zijn met de plaatsinvarianten

i+p+q+r+s+f = 1 en t+leveranciers = 5, en b) f+5leveranciers is een home marking. Daarnaast

kan transitie bestel boek alleen vuren als er 5 tokens in leveranciers liggen, wat door het

model afgedwongen wordt, doordat vraag leverancier en geef levertijd altijd even vaak

moeten vuren. Het model is dus correct.

Transitie Rol Omschrijving

Selecteer boek librarian De bibliothecaris geeft de details van het boek dat besteld moet

worden.

Vraag

leverancier

librarian De bibliothecaris vraagt aan een leverancier om de beschikbaarheid

en levertijd op te geven.

Levertijd

leverancier

supplier De leverancier geeft de beschikbaarheid en levertijd van het

gevraagde boek door

Bestel boek librarian Uit de opgaven van de leveranciers kiest de bibliothecaris de beste

optie, en bestelt daar het boek

Lever boek supplier De uitverkoren supplier levert het boek af bij de bibliotheek

Plaats boek librarian De bibliothecaris plaatst het boek in het rek in de bibliotheek, zodat

leden het boek kunnen lenen.

Proces 2: leen een boek

Aanname: leden brengen boeken altijd terug.

Analyse: het model is een Jackson omdat iedere transitie maar één ingaande en één uitgaande pijl

heeft. Met behulp van de Jackson reductieregels is het net te reduceren tot een enkele gemarkeerde

plaats. Ofwel, het model is sound.

Transitie Rol Omschrijving

Kies boek Member Een lid van de bibliotheek pakt een boek uit de kast om het te

lenen.

Controleer

uitgeleende

boeken

Librarian De bibliothecaris controleert of het betreffende lid niet al twee

boeken geleend heeft. Is dit het geval, mag het lid het boek niet

meenemen.

Leen boek Member Het lid neemt het boek mee naar huis

Breng boek terug Member Het lid brengt het boek terug

Zet boek terug Librarian De bibliothecaris zet het boek terug in de kast.

Implementatie

Gebruikers en rollen

Eerst maken we de gebruikers aan.

1. Log in op ProcessMaker

2. Ga naar Admin -> users

3. Klik op “New” en maak de volgende gebruikers aan:

User name First name Last name Password

asup Ab Supplier absup

bsup Bert Supplier besup

balie Bert Alie balie

lid1 Een Lid eenlid

lid2 Tweede Lid tweelid

We definiëren vervolgens de volgende drie rollen: Member, Librarian en Supplier.

1. Selecteer “Groups”

2. Klik op “New” en maak ieder van de drie rollen aan.

3. Selecteer de rol en klik op “Users”. Voeg de volgende gebruikers aan de rollen toe:

Rol Leden

Member lid1, lid2

Librarian balie

Supplier asup, bsup

Datamodel

Het datamodel implementeren we ook in ProcessMaker. Hiervoor blijven we in Admin.

1. Klik op Settings, en ga naar PM tables

2. Klik op New en kies “New PM table”

3. Maak de volgende tabellen op deze manier:

Tabel Veldnaam Label Type Size Primary Key Auto incr.

BOOK ID Id VARCHAR 255 Ja

NAME Name VARCHAR 255

ISBN ISBN VARCHAR 255

AUTHORS Authors VARCHAR 255

LOCATION Location BIGINT

MEMBER Member VARCHAR 255

OFFER SUPPLIER Supplier VARCHAR 255 Ja

BOOK Book VARCHAR 255 Ja

DELIVERY Delivery date DATETIME

PRICE Price FLOAT

LOCATION ID Id BIGINT Ja Ja

NAME Name VARCHAR 255

Location kunnen we van te voren al vullen met waarden, zeg “Kast 1” en “Kast 2”. Dit doen we door

op de tabel “Location” te klikken en op “Data” te klikken.

Nu hebben we de tabellen en gebruikers aangemaakt, en kunnen we de processen gaan definiëren.

Proces 1: Bestel boek

Omzetting van Petrinet: in plaats van de constructie met de plaats “Leverancier” gebruiken we het

“multi-instance task” workflowpatroon, door de taak “Geef levertijd” het type Parallel mee te geven.

Daarmee wordt de taak uitgevoerd door alle Suppliers, en Bestel boek kan pas vuren nadat alle

taken zijn afgerond. Daarmee heeft het BPMN-model hetzelfde gedrag als bovenstaand Petrinet,

voor een willekeurig aantal leveranciers.

Om een formulier te maken, klik in het zijmenu op “Dynaforms”

Formulier: “Selecteer boek”

Dit formulier vult de bibliothecaris in bij het bestellen van een nieuw boek.

Elementen:

Element Variabele Type Label Display mode

Textbox book String Boek Parent

Textbox authors String Auteurs Parent

Textbox ISBN String ISBN Parent

Formulier “Geef Levertijd”:

Dit formulier vult een leverancier in om de levertijd en prijs door te geven.

Elementen

Element Variabele Type Label Display mode

Textbox book String Boek View

Textbox authors String Auteurs View

Textbox ISBN String ISBN View

Datetime deliveryTime Datetime Levertijd Parent

Textbox price Float Prijs Parent

Om bestaande variabelen te gbruiken, kiezen we niet “Create variable”, maar “Select variable” (zie

hieronder).

Om een float-variabele toe te voegen, klik op settings tijdens het koppelen:

Formulier “Bestel boek”

Dit formulier gebruikt de bibliothecaris om de leverancier te selecteren waarbij hij of zij het boek wil

bestellen.

Elementen:

Element Variabele Type Label Display mode

Textbox book String Boek View

Textbox authors String Auteurs View

Textbox ISBN String ISBN View

Dropdown preferred_supplier String Leverancier Parent

Daarnaast zetten we nog de SQL query voor de Dropdown om de juiste opties te tonen. We willen

dat de leveranciers getoond worden, samen met de waarden die ze geselecteerd hebben. Dat doen

we met de volgende query:

SELECT SUPPLIER AS k, CONCAT(USR_FIRSTNAME, ' ', US R_LASTNAME, ': ', DELIVERY, ' (prijs:',ROUND(PRICE,2),')') AS v FROM PMT_OFFER INNER JOIN USERS ON USR_UID=SUPPLIER WHERE BOOK="@#APPLICATION"

De query retourneert twee velden: een key en een label. In dit geval is de key de supplier, en de

value is de naam van de supplier, samen met de levertijd en prijs die de leverancier voor dat boek

heeft ingevuld. Het boek identificeren we aan de hand van de variabele “@@APPLICATION” (in SQL

moet je daar @# voor schrijven volgens de ProcessMaker handleiding). Omdat we niet het ID van de

supplier willen hebben, maar de volle naam, halen we deze op uit de tabel USERS. Daarmee krijg je

dus een INNER JOIN op die tabel. (Je kunt deze query altijd uitproberen met bijvoorbeeld

PHPMyAdmin).

Formulier “Lever boek”

Dit formulier gebruikt de leverancier om aan te geven dat het boek is geleverd.

Elementen

Element Variabele Type Label Display mode

Textbox book String Boek View

Textbox authors String Auteurs View

Textbox ISBN String ISBN View

Datetime delivered Datetime Datum Parent

Formulier “Plaats boek”

Dit formulier gebruikt de bibliothecaris om het boek in het systeem en in de kast te plaatsen.

Elementen

Element Variabele Type Label Display mode

Textbox book String Boek View

Textbox authors String Auteurs View

Textbox ISBN String ISBN View

Datetime delivered Datetime Datum View

Dropdown location Bigint Locatie Parent

Daarnaast moeten we nog de opties voor de locaties in de Dropdown aangeven. Dit doen we weer

met een SQL query:

SELECT id, name FROM PMT_LOCATION;

Koppel vervolgens de formulieren aan de betreffende taken.

Role-Assignment

Koppel de taken aan de gebruikersrollen zoals in de specificatie bij de transities vermeld (selecteer

self-service):

Voor de taak “Geef levertijd”, selecteer je “Parallel Assignment”, met de rol Supplier.

Eerste testrun

Nu is in principe het model rond, en kun je gaan testen of het werkt. Zoals je merkt, krijgen de twee

leveranciers de taak “geef levertijd” toebedeeld, maar ziet de tweede leverancier de waarden van de

eerste leverancier. Ook is de Drop-down voor de leverancier nog leeg, omdat het systeem er geen

data in zet! Dat gaan we doen met triggers!

Triggers

Trigger 1: Sla leveranciersgegevens op.

We willen de waarden die de leverancier heeft ingevuld opslaan in de tabel PMT_OFFER. Dat geeft

drie stappen:

1. Haal de waarden op die de leverancier heeft ingevuld

2. Stop deze in de database

3. Reset de formulierwaarden voor de volgende run.

Dat levert de volgende PHP-code op:

// get the values $current_case = @@APPLICATION; $current_user = @@USER_LOGGED; $deliverytime = @@deliveryTime; $price = @@price; $query =

"INSERT INTO PMT_OFFER (SUPPLIER, DELIVERY, PRICE, BOOK)

VALUES('" . $current_user . "', '". $deliverytime . "'," . $price . ", '". $current_case

. "');"; // execute the query executeQuery($query); // reset delivery time and price @@deliveryTime = getCurrentDate(); @@price = 0;

Wat doet deze code? Allereerst haalt deze de waarden op uit ProcessMaker: @@APPLICATION

ofwel de case identifier van het proces gebruiken we als ID voor het boek, de supplier is de huidige

gebruiker, ofwel @@USER_LOGGED. De deliveryTime halen we uit @@deliveryTime en de prijs uit

@@price.

Vervolgens maken we een query die deze waarden als een nieuwe rij in de tabel invoegt. Deze

voeren we vervolgens uit.

Tenslotte zetten we de ProcessMaker varaibelen weer op de initiële waarden voor de volgende

gebruiker.

Deze trigger koppelen we vervolgens aan “Geef levertijd”, zodat deze NA het invullen van het

formulier wordt getoond. Open hiervoor het menu “Steps” van deze taak, klap het dynaform uit, en

sleep de trigger in “After Dynaform”:

Trigger 2: Sla boek op in database

Als laatste stap moeten we het boek ook in het systeem opslaan, zodat leden het boek ook

daadwerkelijk kunnen uitlenen. Ook dit doen we met een trigger, volgens bovenstaande procedure.

Dit levert de volgende PHP-code op:

Deze trigger slaan we op, en voeren we uit NA het tonen van de dynaform van “Plaats boek”.

Lever boek door de juiste leverancier laten uitvoeren

Als laatste stap willen we dat “Lever boek” door de geselecteerde leverancier laten uitvoeren. De

geselecteerde leverancier wordt gekozen met de Dropdown preferred_supplier in de taak “Bestel

boek”. Dus gebruiken we die variabele voor het selecteren van de juiste gebruiker:

$id = @@APPLICATION; $titel = @@book; $auteurs = @@authors; $isbn = @@ISBN; $location = @@location; $query = "INSERT INTO PMT_BOOK (ID, NAME, ISBN, AUTHORS, LO CATION) VALUES(" . "'" . $id . "'" . ", '" . $titel . "'" . ", '" . $isbn . "'" . ", '" . $auteurs . "'" . ", " . $location . ");"; executeQuery($query);

Proces 2: Leen boek

Omzetting van Petrinet Letterlijke omzetting. Alleen Leen boek en controleer Lener zijn in dit model

samengenomen.

Formulier: Pak boek

Dit formulier toont alle niet uitgeleende boeken die een lid kan pakken.

Elementen

Element Variabele Type Label Display mode

Dropdown book String Boek Parent

Om de beschikbare boeken te selecteren, voegen we de volgende SQL query toe aan de Dropdown:

SELECT ID AS k, CONCAT(AUTHORS, ': ', NAME) AS lbl FROM PMT_BOOK WHERE (MEMBER IS NULL OR MEMBER = '') ORDER BY AUTH ORS

Ofwel, alle boeken waarvan het veld MEMBER leeg is (of NULL).

Formulier: Controleer lener

Dit formulier wordt getoond aan de bibliothecaris die bepaalt of het boek al dan niet uitgeleend

wordt.

Elementen

Element Variabele Type Label Display mode

Textbox member_first String Voornaam View

Textbox member_last String Achternaam View

Textbox books_borrowed Int Boeken uitgeleend View

Textbox book_title String Boek View

Checkbox approved Boolean Goedgekeurd Parent

Het idee van dit formulier is dat de bibliothecaris ziet welk lid het boek wil lenen, samen met het

aantal boeken dat het lid al geleend heeft. De bibliothecaris gebruikt het veld approved om te

bepalen of het lid al dan niet een boek mag lenen.

Formulier Breng boek terug

Dit formulier toont het boek dat het lid moet terugbrengen.

Elementen

Element Variabele Type Label Display mode

Textbox book_title String Boek View

Formulier Zet boek terug

Elementen

Element Variabele Type Label Display mode

Textbox book_title String Boek View

Textbox authors String Auteurs View

Dropdown location int Locatie Parent

Voor dropdown willen we alle locaties tonen. Dus voegen we de volgende SQL query toe:

SELECT ID, NAME FROM PMT_LOCATION ORDER BY NAME;

Koppel de taken en formulieren (1-op-1 correspondentie).

Triggers

Trigger 1: Haal member-gegevens op

Allereerst willen we weten welk lid de casus start. Immers deze moet ook het boek terugbrengen.

Eerst maken we onder Variables een nieuwe variabele aan: Member van het type string. Vervolgens

maken we een trigger die member en de bijbehorende velden vult, zoals je hieronder kunt zien.

Het eerste statement kijkt of de variabele @@member een waarde heeft (dus null of leeg is). Als dat

het geval is, geven we @@member de waarde van @@USER_LOGGED, ofwel de gebruiker die

ingelogd is. Deze waarde kennen we ook toe aan $member, zodat we deze in de code kunnen

gebruiken.

Vervolgens halen we de voor- en achternaam op van de gebruiker, door een query op te stellen, en

die uit te voeren. Als het resultaat minimaal 1 rij is, kunnen we @@member_first en

@@member_last vullen met de voor- en achternaam, respectievelijk.

Als laatste bepalen we hoeveel boeken een lid heeft uitgeleend. Dit zien we in de tabel PMT_BOOK,

waarin het aantal rijen waarin MEMBER de huidige gebruiker is aangeeft hoeveel boeken deze heeft

geleend. Dat doen we met de query:

SELECT COUNT(*) AS BORROWED FROM PMT_BOOK WHERE MEMBER='…';

Waarna we het resultaat in @@books_borrowed opslaan. Dit levert de volgende trigger op:

Trigger 2: Haal boekgegevens op

Vervolgens moeten we weten welk boek is geselecteerd door de gebruiker: wat is de titel en wie zijn

de auteurs?, zodat we die kunnen weergeven in de formulieren. Dat is een zelfde stukje PHP code:

Sla het boek op in $id, haal vervolgens de gegevens van dat boek op, en sla de titel en auteurs op.

Trigger 3: Leen boek uit

Wanneer de bibliothecaris de uitlening heeft goedgekeurd, moet dit ook in de database aangepast

worden. Met het veld MEMBER in tabel PMT_BOOK slaan we op wie op dat moment het boek heeft.

Dat leidt tot het volgende stukje PHP-code, dat voor zich spreekt:

if (!isset(@@member) or empty(@@member)) { @@member = @@USER_LOGGED; } $member = @@member; $query = "SELECT USR_FIRSTNAME, USR_LASTNAME FROM U SERS WHERE USR_UID='".$member."'"; $res = executeQuery($query); if (is_array($res) && count($res) > 0) { @@member_first = $res[1]['USR_FIRSTNAME']; @@member_last = $res[1]['USR_LASTNAME']; } $query = "SELECT COUNT(*) AS BORROWED FROM PMT_BOOK WHERE MEMBER='".$member."';"; $res = executeQuery($query); if (is_array($res) && count($res) > 0) { @@books_borrowed = $res[1]['BORROWED']; }

$id = @@book; $query = "SELECT NAME, AUTHORS FROM PMT_BOOK WHERE ID='".$id."'"; $res = executeQuery($query); if (is_array($res) && count($res) > 0) { @@book_title = $res[1]['NAME']; @@authors = $res[1]['AUTHORS']; }

$book = @@book; $member = @@member; $approved = @@approved; if ($approved) { $query = "UPDATE PMT_BOOK

SET MEMBER='". $member. "' WHERE ID='". $book. "';" ; executeQuery($query); }

Trigger 4: Boek terugbrengen

Om het boek terug te brengen, moeten we de locatie weer goed zetten, en het veld MEMBER in

PMT_BOOK leegmaken, zodat het systeem weet dat het boek terug is. Dat leidt tot de volgende,

voor zichzelf sprekende code:

Koppelen van de triggers

Wanneer moeten de triggers uitgevoerd worden? Haall Membergegevens moet eigenlijk zo snel

mogelijk opgehaald worden, dus voor het tonen van het eerste scherm. De boekgegevens mogen we

ophalen zodra we het boek hebben geselecteerd. De andere triggers horen na het tonen van de

bijbehorende formulieren uitgevoerd te worden. Dat leidt tot de volgende instellingen:

Taak Positie Trigger

Pak boek Voor dynaform Haal member-gegevens op

Na dynaform Haal boekgegevens op

Controleer lener Na dynaform Leen boek uit

Zet boek terug Na dynaform Boek terugbrengen

Authorisatie

Stel de authorisatie als volgt in:

Taak Type authorisatie Groep / rol Variabele

Pak boek Value-based assignment Member @@member

Controleer lener Self-service Librarian

Breng boek terug Value-based assignment Member @@member

Zet boek terug Self-service Librarian

Hiermee hebben we dus twee processen die met elkaar verbonden zijn door de data die ze delen.

$book = @@book; $location = @@location; $query = "UPDATE PMT_BOOK SET MEMBER='', LOCATION=" .$location." WHERE ID='".$book."';"; executeQuery($query);