bibliotheek in processmaker - cs.uu.nl · bibliotheek in processmaker gevraagd wordt voor een...
Post on 10-Nov-2018
233 Views
Preview:
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);
top related