product price management application with pim integration

126
Scriptie ingediend tot het behalen van de graad van PROFESSIONELE BACHELOR IN DE ELEKTRONICA-ICT Product price management application with PIM integration Jonathan Dewilde en Rob Liekens Departement Wetenschappen en Techniek Opleiding Elektronica-ICT Academiejaar 2014-2015 Interne promotor: Patrick Van Houtven Externe promotors: Frederik De Galan Nick De Kock Versie: 12 juni 2015

Upload: others

Post on 16-Oct-2021

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Product Price Management Application with PIM Integration

Scriptie ingediend tot het behalen van de graad van

PROFESSIONELE BACHELOR IN DE ELEKTRONICA-ICT

Product price management applicationwith PIM integration

Jonathan Dewilde en Rob Liekens

Departement Wetenschappen en Techniek

Opleiding Elektronica-ICT

Academiejaar 2014-2015

Interne promotor: Patrick Van HoutvenExterne promotors: Frederik De Galan

Nick De Kock

Versie: 12 juni 2015

Page 2: Product Price Management Application with PIM Integration

Dankwoord

Met het schrijven van dit dankwoord leggen we de laatste hand aan onze scriptie. Het was eenperiode waarin we veel hebben geleerd, zowel op technisch als analytisch gebied. We willengraag even stilstaan bij de mensen die ons de afgelopen achttien weken enorm gesteund engeholpen hebben.

In de eerste plaats willen we de werknemers van ons stagebedrijf Xplore Group bedanken voorde fijne samenwerking. We willen ons in het bijzonder richten tot Frederik De Galan en Nick DeKock, de bedrijfspromotors die ons met raad en daad bijstonden doorheen het gehele verloopvan de stage.

Daarnaast willen we graag onze AP promotor Patrick Van Houtven en de algemene sta-gecoordinator Tim Dams bedanken voor hun goede begeleiding en adviezen.

Antwerpen, 12 juni 2015Jonathan Dewilde en Rob Liekens

i

Page 3: Product Price Management Application with PIM Integration

Abstract

Het onderwerp van deze scriptie is de ontwikkeling van een verkoopkanaal afhankelijkeprijsberekeningsapplicatie die kan communiceren met het Product Content Managementsysteem van Hybris, in opdracht van Xplore Group. Deze scriptie beschrijft de technologieen structuur van de prijsberekeningsmodule, alsook het algoritme ontwikkeld om de idealeverkoopprijzen te berekenen.

Het Hybris Product Content Management systeem, een van de leiders op het gebied van PIM(Product Information Management), laat gebruikers toe om product informatie centraal aan temaken, beheren en publiceren. Het idee achter onze applicatie is dat een webshop beheerder,die zijn artikelen wil aanbieden via diverse online verkoopkanalen (bv. Amazon, Bol.com,...)met de price management applicatie automatisch de meest efficiente verkoopprijs per verdelerkan berekenen, en dat deze prijs vervolgens doorgestuurd wordt naar het PIM systeem.

Om dit te verwezenlijken is een Java-based backend ontwikkeld, gekoppeld aan een SQLdatabase die prijsgerelateerde informatie bevat. De user interface bestaat uit een HTML5-basedfrontend met AngularJS, Bootstrap en jQuery integratie. Onderlinge communicatie gebeurt viaREST services.

Het resultaat is een dynamische, schaalbare en gebruiksvriendelijke webapplicatie waarin alleproduct prijsinformatie beheerd kan worden, en waarmee bovendien synchronisatie met eenPIM systeem mogelijk is.

ii

Page 4: Product Price Management Application with PIM Integration

Inhoudsopgave

Dankwoord i

Abstract ii

Lijst van afkortingen ix

Glossarium x

1 Situering 11.1 Bedrijf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.2 Project . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

1.2.1 Introductie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.2.2 Doel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31.2.3 Vereisten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31.2.4 Samenvatting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71.2.5 Conclusie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

1.3 Technologieen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91.3.1 Backend . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91.3.2 Front end . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

1.4 Libraries & frameworks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131.4.1 Backend . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131.4.2 Front end . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

1.5 Tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

2 Bespreking Price Management Application 202.1 Inleiding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202.2 Aanpak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202.3 Use cases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

2.3.1 User use cases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222.3.2 Business use case overview . . . . . . . . . . . . . . . . . . . . . . . 23

iii

Page 5: Product Price Management Application with PIM Integration

INHOUDSOPGAVE iv

2.4 Workflow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252.4.1 User workflow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252.4.2 Business workflow . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

2.5 Technical . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262.5.1 Introductie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262.5.2 Architectuur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262.5.3 Design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312.5.4 Backend . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362.5.5 Front end . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43

2.6 User interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472.6.1 Introductie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472.6.2 Design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

2.7 Sequence diagram . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 492.8 Business logic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50

2.8.1 Price logic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 502.8.2 Status logic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

2.9 Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60

3 Resultaten 613.1 Doelstellingen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 613.2 Resultaten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

3.2.1 Login . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 633.2.2 Navigatie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 643.2.3 Algemene functionaliteit . . . . . . . . . . . . . . . . . . . . . . . . . 663.2.4 Zoekfilters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 683.2.5 Dashboard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 703.2.6 Product . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 723.2.7 Sales channels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 853.2.8 Overige pagina’s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87

4 Besluit 884.1 Reflectie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89

A Use cases 90A.1 CRUD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90

A.1.1 Suppliers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90A.2 GET Products . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92A.3 Price enrichment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93

A.3.1 Price overwrites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93A.4 Calculate prices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94

A.4.1 Calculate selected . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94A.4.2 Calculate all . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94

A.5 Send prices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95

Page 6: Product Price Management Application with PIM Integration

INHOUDSOPGAVE v

A.5.1 Send selected . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95A.5.2 Send all . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95

A.6 Status management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96A.6.1 Show statuses of selected prices . . . . . . . . . . . . . . . . . . . . . 96A.6.2 Show products with errors . . . . . . . . . . . . . . . . . . . . . . . . 96

B ER diagram 97B.1 ER diagram parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98

C Bespreking overige applicatiepagina’s 102C.1 Transport . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102

C.1.1 Regions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102C.1.2 GLS colli . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105C.1.3 GLS freight . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107

C.2 Packaging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109C.2.1 Aanmaken van een nieuwe verpakking . . . . . . . . . . . . . . . . . . 109C.2.2 Wijzigen van een verpakking . . . . . . . . . . . . . . . . . . . . . . . 109C.2.3 Verwijderen van een verpakking . . . . . . . . . . . . . . . . . . . . . 110C.2.4 Overzicht ’Packaging’ pagina . . . . . . . . . . . . . . . . . . . . . . 110

C.3 Supplier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111C.3.1 Aanmaken van een nieuwe leverancier . . . . . . . . . . . . . . . . . . 111C.3.2 Wijzigen van een leverancier . . . . . . . . . . . . . . . . . . . . . . . 111C.3.3 Verwijderen van een leverancier . . . . . . . . . . . . . . . . . . . . . 112C.3.4 Overzicht ’Supplier’ pagina . . . . . . . . . . . . . . . . . . . . . . . 112

Page 7: Product Price Management Application with PIM Integration

Lijst van figuren

1.1 Logo Xplore Group . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.2 Basic project overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.3 Logo Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91.4 Logo SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91.5 JPQL Query Flow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91.6 JPA Principle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101.7 JAX-RS Principle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101.8 Logo Java Enterprise Edition . . . . . . . . . . . . . . . . . . . . . . . . . . 111.9 Logo MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111.10 Logo WildFly . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111.11 Logo HTML5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121.12 Logo CSS3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121.13 Logo Javascript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121.14 Basic Architecture Hibernate . . . . . . . . . . . . . . . . . . . . . . . . . . 131.15 Basic Architecture RESTEasy . . . . . . . . . . . . . . . . . . . . . . . . . . 131.16 Logo Apache Maven . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141.17 Logo Quartz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141.18 Estimated hardware cost to crack a password in 1 year . . . . . . . . . . . . . 141.19 Logo Bootstrap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151.20 Angular's MVW structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151.21 Font Awesome icon examples . . . . . . . . . . . . . . . . . . . . . . . . . . 161.22 Logo jQuery . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161.23 Smart-table example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171.24 Logo Eclipse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181.25 Logo Git en Bitbucket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181.26 Atlassian Products . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

2.1 Agile Development . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212.2 User use case overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232.3 Business use case overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

vi

Page 8: Product Price Management Application with PIM Integration

LIJST VAN FIGUREN vii

2.4 User workflow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252.5 Business workflow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252.6 General project overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262.7 Internet Explorer 403 Error . . . . . . . . . . . . . . . . . . . . . . . . . . . 272.8 CRUD REST actions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282.9 Flow of products and prices between Price Management Application and PIM . 292.10 Technical flow overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302.11 Price Management Application Overview . . . . . . . . . . . . . . . . . . . . 312.12 Development Stack Overview . . . . . . . . . . . . . . . . . . . . . . . . . . 322.13 Simplified ER diagram . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332.14 REST API Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372.15 Bootstrap grid structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 442.16 Angular view structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452.17 Sequence diagram . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 492.18 Price influential parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . 502.19 Basic price logic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 512.20 Fixed product cost logic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 522.21 Fixed transport cost logic . . . . . . . . . . . . . . . . . . . . . . . . . . . . 532.22 Minimum profit calculation logic . . . . . . . . . . . . . . . . . . . . . . . . . 542.23 Final price . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 552.24 Status overview scheme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59

3.1 Login screen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 633.2 Navigatiemenu in open en gesloten toestand . . . . . . . . . . . . . . . . . . 643.3 Compact screen navigation menu . . . . . . . . . . . . . . . . . . . . . . . . 653.4 Navigation bar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 653.5 Save changes button . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 663.6 Save confirmation popup . . . . . . . . . . . . . . . . . . . . . . . . . . . . 663.7 Export to Excel button . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 673.8 Details button . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 673.9 Search filters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 683.10 Search & sort tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 693.11 Dashboard error overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . 713.12 Dashboard buttons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 713.13 Product search page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 723.14 Select sales channels page . . . . . . . . . . . . . . . . . . . . . . . . . . . . 733.15 Column select functionality . . . . . . . . . . . . . . . . . . . . . . . . . . . 743.16 Packaging button . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 743.17 Packaging menu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 753.18 Price overwrite page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 763.19 Product transport page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 773.20 Calculation & Status page . . . . . . . . . . . . . . . . . . . . . . . . . . . . 783.21 Status info on mouse hover . . . . . . . . . . . . . . . . . . . . . . . . . . . 79

Page 9: Product Price Management Application with PIM Integration

LIJST VAN FIGUREN viii

3.22 Price calculation information button . . . . . . . . . . . . . . . . . . . . . . . 793.23 Price calculation information menu . . . . . . . . . . . . . . . . . . . . . . . 803.24 General information from product details page . . . . . . . . . . . . . . . . . 813.25 General price information from product details page . . . . . . . . . . . . . . 823.26 Price overwrite information from product details page . . . . . . . . . . . . . 823.27 Status information from product details page . . . . . . . . . . . . . . . . . . 833.28 Creation information from product details page . . . . . . . . . . . . . . . . . 833.29 Add product page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 843.30 Editable table field . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 853.31 Zone button . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 853.32 Delete button . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 863.33 Delete sales channel error popup . . . . . . . . . . . . . . . . . . . . . . . . 863.34 Sales channel page overview . . . . . . . . . . . . . . . . . . . . . . . . . . . 87

C.1 Editable table field . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103C.2 Delete region error popup . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103C.3 Region page overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104C.4 Select region option . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105C.5 Editable table field . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105C.6 GLS colli page overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106C.7 Select region option . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107C.8 Editable table field . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107C.9 GLS freight page overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108C.10 Editable table field . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109C.11 Delete packaging error popup . . . . . . . . . . . . . . . . . . . . . . . . . . 110C.12 Packaging page overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110C.13 Editable table field . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111C.14 Delete supplier error popup . . . . . . . . . . . . . . . . . . . . . . . . . . . 112C.15 Supplier page overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112

Page 10: Product Price Management Application with PIM Integration

Lijst van afkortingen

� API Application Programming Interface

� AWS Amazon Web Services

� CRUD Create, Read, Update and Delete

� DTO Data Transfer Object

� DOM Document Object Model

� ERP Enterprise Resource Planning

� GUI Graphical User Interface

� IDE Integrated Development Environment

� JEE Java platform, Enterprise Edition

� JPA Java Persistence API

� KDF Key Derivation Function

� MVW Model-View-Whatever

� ORM Object Relational Mapping

� PIM Product Information Management

� POC Proof Of Concept

� SPA Single Page Application

� SQL Structured Query Language

� UI User Interface

ix

Page 11: Product Price Management Application with PIM Integration

Glossarium

� Agile softwareontwikkeling: methode van softwareontwikkeling die toelaat dynami-scher met het ontwikkelingsproces om te gaan.

� Brute force attack: een crypto analytische aanval, die gebruik maakt van rekenkrachtom domweg alle mogelijke wachtwoordcombinaties uit te testen, zonder het gebruik vanalgoritmen om dit proces te versnellen.

� Commit,push,pull: Git terminologie die gebruikt wordt voor het samenvoegen van codekopieen van verschillende ontwikkelaars.

� Continuous integration: het meermaals per dag samenvoegen van developercodekopieen op een gedeelde mainline.

� Entiteit: een object waarover door middel van een ER diagram gegevens wordenvastgelegd, meestal als onderdeel van het ontwerp van een databank.

� Kanban: een specifieke agile ontwikkelingsmethode.

� Module: een module is een losstaand onderdeel in een systeem, dat apart gecreeerd engebruikt kan worden in verschillende systemen.

� Rainbow table: een eenvoudige tabel met mogelijke wachtwoorden en hun overeenkom-stige hashes.

� Repository: opslaglocatie.

� Scrum: een specifieke agile ontwikkelingsmethode.

x

Page 12: Product Price Management Application with PIM Integration

Hoofdstuk1Situering

Dit document beschrijft de price management applicatie voor het bedrijf Xplore Group. In deeerste plaats wordt hier uitgelegd wat de aanleiding en de vereisten van het project waren.Verder biedt deze situering de nodige uitleg over verschillende gebruikte technologieen, toolsen bibliotheken.

1.1 Bedrijf

Xplore Group is een bedrijf dat deel uitmaakt van de alom gekende Cronos Group. Xplore Groupwerd in 1997 opgestart als een IT consultancy bedrijf, met de nadruk op het leveren van hogekwaliteit IT oplossingen aan hun klanten, door het gebruik van Java en PHP solutions.

Binnen Xplore Group zijn er nog een aantal kleinere bedrijven, waaronder XT-i, het bedrijf waaronder andere onze externe promotors, Frederik De Galan en Nick De Kock, voor werken.

Het merendeel van de mensen die meewerken aan het project waartoe onze prijscalculatorbehoort, zijn medewerkers van XT-i, hoewel er ook enkele collega's van Xplore Groupingeschakeld zijn.

Figuur 1.1: Logo Xplore Group

1

Page 13: Product Price Management Application with PIM Integration

HOOFDSTUK 1. SITUERING 2

1.2 Project

1.2.1 Introductie

Consumenten maken meer en meer gebruik van grote verkoopplatformen, zoals bijvoorbeeldAmazon of Bol.com, om een product te verkrijgen. Het aanbod is er gewoonlijk veel hoger ende prijzen liggen over het algemeen lager, wat het voor kopers dus zeer aantrekkelijk maakt.Dit zorgt ervoor dat webshops vaak ook kiezen voor deze bijkomende verkoopstrategie om hunproducten aan te bieden.Zo heeft onder andere Mike Boon, een collega van onze externe promotors, een aantalwebwinkels, waarop hij speelgoed en fietshelmen aanbiedt. Naarmate de webshop groeide,werd het echter steeds moeilijker om alle artikelen handmatig te beheren (voorheen gebeurdedit via Microsoft Excel) . Hierdoor is het idee ontstaan om dit beheer te automatiseren, endaarbij ook de prijsberekening automatisch te laten verlopen.

Het project bestaat dus eigenlijk uit twee delen:

� De ontwikkeling van een product management systeem, het zogenaamde PIM systeem,waarin alle verkoopartikelen en productgerelateerde eigenschappen beheerd worden. Ditsysteem zal productdata naar de price management applicatie doorsturen.

� De ontwikkeling van een prijsberekeningsmodule, waarin alle prijsgerelateerde eigenschap-pen van de verkoopartikelen beheerd worden. Deze module zal bovendien de finaleverkoopprijs per product per verkoopkanaal berekenen, en deze vervolgens naar het PIMsysteem doorsturen.

Merk op dat het eerste deel van het project ontwikkeld wordt door een ander team van XploreGroup, en dus buiten het bestek van deze scriptie valt.Dit brengt ons bij het tweede deel van het project en daarmee ook bij onderwerp van dezescriptie: het ontwikkelen van een software applicatie die de prijsberekeningen automatiseert, envervolgens de berekende ideale prijzen terugstuurt naar het PIM systeem.

Figuur 1.2: Basic project overview

Page 14: Product Price Management Application with PIM Integration

HOOFDSTUK 1. SITUERING 3

1.2.2 Doel

Het doel is om voor het PIM systeem een prijsberekeningsmodule te ontwikkelen die automatischde beste prijs per product per verkoopkanaal berekent, aan de hand van een aantal parameters.De price calculator is niet gebaseerd op bestaande software, en wordt ontwikkeld als eenlosstaande module, aan de hand van voorwaarden afgeleid uit een aantal gesprekken met onzebedrijfsbegeleiders en Mike Boon, de beheerder van de webshops.

De applicatie zou moeten zorgen voor een sterke centralisatie van prijsdata en een automatisatievan prijsdataverwerking, met verschillende grote voordelen als gevolg:

� Significante verlaging van de kans op fouten;

� Duidelijk overzicht van relevante informatie;

� Tijdsbesparing.

1.2.3 Vereisten

User requirements

Prijsberekening

De belangrijkste vereiste van onze price calculator is uiteraard de mogelijkheid om verkoopprijzenper product per verkoopkanaal te berekenen. Indien de uiteindelijke verkoopprijs niet correct zouzijn, gaat dit gepaard met rampzalige verliezen in verkoop en/of winst. De price managementapplication staat of valt dus met de ideale prijsberekening.

Kort samengevat moeten per product per verkoopkanaal 2 prijzen berekend gaan worden:enerzijds de minimumprijs en anderzijds de maximumprijs. De parameters die deze prijzenbeınvloeden kunnen opgedeeld worden in de onderstaande groepen:

� Aankoopprijs en BTW;

� Leverancier;

� Verpakking;

� Verkoopkanaal;

� Transport;

� Winst.

Page 15: Product Price Management Application with PIM Integration

HOOFDSTUK 1. SITUERING 4

Basic operations: create, read, update en delete

Het moet mogelijk zijn voor de beheerder om op elke pagina enkele basisoperaties uit te voeren.Read en update zijn overal noodzakelijk, create en delete zijn afhankelijk van de entiteit.Producten worden uit het PIM systeem opgehaald, en prijsinformatie wordt na bepaalde actiesautomatisch aangemaakt, dus hiervoor zullen create en delete acties overbodig zijn. Voor alleandere entiteiten (verpakking, leverancier, transport en verkoopkanaal), moet ook create endelete functionaliteit voorzien worden.Het is uiteraard essentieel dat al deze basisoperaties simpel en snel uitgevoerd kunnen worden,zodat de gebruikers zo weinig mogelijk hinder ondervinden bij het aanroepen van deze acties.

Mass updates

Naast de basisoperaties, moet het mogelijk zijn om bepaalde velden op een makkelijke manierte updaten voor een grote hoeveelheid producten en/of prijzen.Deze bulk updates moeten duidelijk en overzichtelijk weergegeven worden. Ook is het nietvoldoende om waardes simpelweg te overschrijven, of overal dezelfde waarde in te voeren, maarook simpele berekeningen (x+y en x-y) moeten uitgevoerd kunnen worden.Ook hier is het vanzelfsprekend dat de aanpassingen vlot moeten verlopen, zodat de gebruikerweinig tot geen vertraging ondervindt na het uitvoeren van een mass update.

Status management

De applicatie moet op een overzichtelijke manier kunnen weergeven waar eventuele fouten en/ofverouderde prijzen opgetreden zijn. Hiervoor zullen een aantal statussymbolen geıntegreerdmoeten worden, die voor verschillende doeleinden gebruikt kunnen worden.Zo kan er bijvoorbeeld makkelijk weergegeven worden of:

� Prijsinformatie voor een bepaald product reeds gekend is door de prijscalculator;

� Prijzen herberekend moeten worden (bijvoorbeeld na het veranderen van de aankoopprijsvan een product);

� Prijzen (her)verzonden moeten worden naar het Hybris hoofdsysteem.

Page 16: Product Price Management Application with PIM Integration

HOOFDSTUK 1. SITUERING 5

Dynamisch

De applicatie moet een dynamisch karakter hebben. Dit houdt in dat de prijsberekeningsmodulegebouwd moet worden op een manier waarbij business gerelateerde veranderingen van informatiemakkelijk opgevangen kunnen worden.Praktisch zal dit erop neerkomen dat alle waardes op product en/of prijsniveau overschrijfbaarmoeten zijn om onder andere promoties, bijzondere verzend- of verpakkingsmethodes endergelijke op te vangen.Ook technologische veranderingen moeten makkelijk op te vangen zijn. Er is dus een hogecompatibiliteit vereist met verschillende elektronische apparaten (smartphones, tablets, laptopsen desktop computers) en besturingssystemen.

User friendly

De price calculator moet gebruiksvriendelijk zijn. Er zal op sommige plaatsen ontzettend veeldata weergegeven moeten worden op een overzichtelijke manier.Onder andere zoekfilters, sorteerbare tabellen en duidelijke links naar gerelateerde pagina's inde applicatie zijn dus een must.

Page 17: Product Price Management Application with PIM Integration

HOOFDSTUK 1. SITUERING 6

Business requirements

Hybris synchronisatie

Nieuwe producten moeten uit het hoofdsysteem opgehaald kunnen worden. Na het verrijkenvan de product prijsinformatie en het berekenen van de minimum en maximumprijs, moet deideale prijs op een bepaalde manier naar het PIM systeem gestuurd kunnen worden.

Scalability

Onze applicatie wordt in de eerste plaats door het bedrijf ontwikkeld voor de klant, maar meteen groot aantal andere potentiele klanten in het achterhoofd. De prijscalculator wordt ophet moment dus vooral als POC (Proof Of Concept) ontwikkeld, maar we kunnen er al vanuitgaan dat de mogelijkheid bestaat dat de module later ook voor andere bedrijven gebruikt moetkunnen worden.De applicatie moet dus zo ontworpen worden dat uitbreidingen in de toekomst makkelijkmogelijk zijn.

Technical requirements

Modulaire opbouw

De keuze voor een aparte module voor de prijsberekening is nogal vanzelfsprekend. Aangeziende price calculator applicatie op deze manier geımplementeerd kan worden als een vrijstaandecomponent, kan de module parallel ontwikkeld worden met het voorgenoemde PIM systeem.Bovendien maakt dit het mogelijk om in de toekomst uitbreidingen aan deze component temaken, zonder dat het hoofdsysteem gewijzigd moet worden. Omgekeerd zou het dan ookperfect mogelijk zijn om van hoofdsysteem te veranderen en deze prijscalculator te blijvengebruiken.

Hybris communication through REST

Het Hybris PIM systeem bevat een REST API, waarmee de prijzen en producten verzonden/-ontvangen dienen te worden.

Page 18: Product Price Management Application with PIM Integration

HOOFDSTUK 1. SITUERING 7

1.2.4 Samenvatting

Concreet kunnen we stellen dat het eindresultaat moet voldoen aan volgende eisen:

� De applicatie moet per product twee prijzen kunnen berekenen: een minimum- enmaximumprijs;

� Op elke pagina moeten een aantal basisoperaties uitgevoerd kunnen worden: Create,Read, Update en Delete;

� De gebruiker kan mass (bulk) updates uitvoeren;

� De toepassing is voorzien van een status management tool, die weergeeft waar mogelijkefouten voorkomen;

� De tool moet een dynamisch karakter hebben;

� De applicatie moet gebruiksvriendelijk zijn;

� De applicatie moet een modulaire structuur bezitten;

� Er moet synchronisatie met het hoofdsysteem (Hybris) mogelijk zijn;

� De applicatie moet makkelijk aangepast kunnen worden voor nieuwe, gelijkaardigetoepassingen.

Page 19: Product Price Management Application with PIM Integration

HOOFDSTUK 1. SITUERING 8

1.2.5 Conclusie

Uit de prijsberekeningsvereisten kunnen we afleiden dat er een relatief ingewikkeld relationeeldatabasemodel opgesteld zal moeten worden, om alle verschillende parameters te kunnenomvatten.Om dit databasemodel compatibel te maken met de software, zal gebruik gemaakt moetenworden van ORM (Object-relational mapping). Qua softwareomgeving wordt gekozen voorJava, vermits Xplore Group een Java gespecialiseerd bedrijf is. Met behulp van ORM is hetdan mogelijk om de CRUD (Create, Read, Update, Delete) acties in Java uit te voeren.Omdat de applicatie dynamisch moet zijn, wordt als gebruikersomgeving gekozen voor eenwebapplicatie, vermits deze universeel bruikbaar zou zijn (een installatie op het toestel van degebruiker is hierbij ook overbodig). Bovendien zijn er voor webapplicaties een groot aantalframeworks en plugins beschikbaar om de toepassing schaalbaar en gebruiksvriendelijker temaken.In deze omgeving moet gezorgd worden dat de gebruiker afgeschermd wordt van de onderlingecomplexe relaties van het databasemodel. Elke pagina zal dus enkel de informatie bevattenrond een bepaald onderwerp om verwarring voor de gebruikers te vermijden.De applicatie zal modulair zijn, waardoor het kan meegroeien met de veranderende eisen van degebruikers. Deze modulaire aanpak, met een extra aandachtspunt voor scalability, zorgt ervoordat het in de toekomst relatief makkelijk wordt om aanpassingen te maken.Door deze modulaire opbouw zal het mogelijk moeten zijn om op een bepaalde manier te kunnencommuniceren met het hoofdsysteem. Ook de gebruikersomgeving zal op een of andere maniermet ons backend (Java) systeem moeten kunnen communiceren.

Page 20: Product Price Management Application with PIM Integration

HOOFDSTUK 1. SITUERING 9

1.3 Technologieen

1.3.1 Backend

� Java: Java is een platform onafhankelijke objectgeorienteerde programmeertaal, diesyntactisch grotendeels gebaseerd is op C++. Aangezien ons stagebedrijf gespecialiseerdis in Java en PHP solutions, is de keuze voor Java vanzelfsprekend.

Figuur 1.3: Logo Java

� SQL: SQL is een gestandaardiseerde taal voor een relationeel database managementsys-teem. Met de taal kunnen databanken aangemaakt of aangepast worden. Ook wordt detaal gebruikt om data uit een database op te vragen.

Figuur 1.4: Logo SQL

� JPQL: Java Persistence Query Language is een taal die sterke gelijkenissen vertoont metSQL qua syntax, maar toegepast wordt op objecten van JPA entiteiten in plaats vanrechtstreeks op de database tabellen.

Figuur 1.5: JPQL Query Flow, Bron:[12]

� JPA: Java Persistence API wordt gebruikt om de toegang tot en het beheer van datatussen java klassen en een relationele database te regelen. JPA is geen product maar eenspecificatie. Het kan dus niet op zichzelf bestaan, maar is een collectie van interfaces. Erzijn vele JPA implementaties(bijvoorbeeld Java EE Application Server, Hibernate,...).

Page 21: Product Price Management Application with PIM Integration

HOOFDSTUK 1. SITUERING 10

Figuur 1.6: JPA Principle, Bron:[10]

� JAX-RS: JAX-RS is een Java programming language API voor RESTful Web Services.Hierbij worden annotations toegepast om de ontwikkeling en implementatie van webservice clients te vergemakkelijken. De communicatie tussen backend en Hybris, alsookde onderlinge communicatie tussen backend en front end maken hiervan gebruik.De belangrijkste annotations zijn:

– @Path: specifieert het relatieve pad van de methode of klasse;

– @Get: HTTP request type dat duidelijk maakt dat er geen parameters meegegevenworden, en dat er iets opgehaald moet worden;

– @Post: wordt gebruikt wanneer er een methode word aangeroepen waar eenparameter aan wordt meegegeven;

– @Consumes: specifieert het datatype dat gebruikt wordt in een request;

– @Produces: specifieert het datatype dat verzonden wordt nadat een request isuitgevoerd.

Figuur 1.7: JAX-RS Principle, Bron:[5]

Page 22: Product Price Management Application with PIM Integration

HOOFDSTUK 1. SITUERING 11

Computing platform

� JEE: Java Platform Enterprise Edition biedt een API en runtime environment aan, diegebruikt kan worden voor development en deployment van enterprise software. Desoftware voor dit platform wordt hoofdzakelijk in Java geschreven, en het platformzelf bestaat voornamelijk uit modulaire componenten die draaien op een applicationserver. De grote verschillen met de Standard Edition van het Java Platform zijn de veleuitbreidingen van de functionaliteit van bestaande application programming interfaces, ende toegevoegde API voor web services en object-relational mapping.Een product kan pas als Java EE compatibel bestempeld worden wanneer het voldoet aanbepaalde requirements.

Figuur 1.8: Logo Java Enterprise Edition

Database management

� MySQL: MySQL is het populairste (open source) managementsysteem voor relationeledatabanken. Onderhouden, aanmaken en opvragen van data uit een databank gebeurdvia SQL.MySQL valt onder de GPL v.2 licentie en is bezit van de Oracle Corporation.

Figuur 1.9: Logo MySQL

Application server

� WildFly: WildFly is een open source cross-platform application server, die JEEimplementeert en geschreven is in Java. Vroeger was WildFly gekend als Jboss ApplicationServer, maar bij de overname van het bedrijf Jboss door Red Hat is de naam gewijzigd.Er is echter nog steeds veel bruikbare informatie te vinden onder de oude naam.

Figuur 1.10: Logo WildFly

Page 23: Product Price Management Application with PIM Integration

HOOFDSTUK 1. SITUERING 12

1.3.2 Front end

� HTML5 (HyperText Markup Language 5): de nieuwste versie van de HTML standaard.HTML is een taal die gebruikt wordt om documenten op te maken, die gepubliceerdkunnen worden op het internet, en bekeken kunnen worden met behulp van eenwebbrowser. Vermits onze applicatie universeel bruikbaar moet zijn, is HTML de logischekeuze. Op deze manier kan iedere gebruiker, onafhankelijk van het gebruikte toestel en/ofbesturingssysteem, een versie van de tool openen.

Figuur 1.11: Logo HTML5

� CSS3 (Cascading Style Sheets 3): CSS wordt gebruikt om de vormgeving van HTMLdocumenten vast te leggen. CSS kan zowel toegepast worden in de te stijlen HTMLpagina's, als in een apart *.css bestand, met een verwijzing vanuit de HTML pagina's.Vermits er gekozen is voor een HTML applicatie, is het gebruik van CSS onvermijdelijk.

Figuur 1.12: Logo CSS3

� Javascript: een programmeertaal geschikt om scripts te schrijven, die gebruikt wordenom interactieve webpagina's te creeren. De keuze voor HTML, gecombineerd met deverwachte functionaliteit van de applicatie, maakt het gebruik van Javascript noodzakelijk.

Figuur 1.13: Logo Javascript

Page 24: Product Price Management Application with PIM Integration

HOOFDSTUK 1. SITUERING 13

1.4 Libraries & frameworks

Hieronder worden alle bibliotheken en frameworks die we voor dit project gebruikt hebben korttoegelicht. Bij verdere interesse kan gerelateerde code teruggevonden worden in het portfolioonder 'Finaal product/third party code'.

1.4.1 Backend

� Hibernate: Hibernate ORM is een object-relational mapping bibliotheek voor java. Hetbied een framework aan dat gebruikt wordt voor het mappen van een objectgeorienteerddomeinmodel naar een relationele database. Dit gebeurt door elke database tabel tekoppelen aan een of meerdere Java klasse(s).Hibernate is gratis software die uitgeven wordt onder de GNU Lesser General PublicLicense.

Figuur 1.14: Basic Architecture Hibernate, Bron:[11]

� RESTEasy: RESTEasy is een JBoss project, dat verschillende frameworks aanbiedt voorhet bouwen van RESTful Web Services en RESTful Java applicaties. Het is een vollediggecertificeerde en portable implementatie van de JAX-RS specification.

Figuur 1.15: Basic Architecture RESTEasy, Bron:[9]

Page 25: Product Price Management Application with PIM Integration

HOOFDSTUK 1. SITUERING 14

� Apache Maven: Maven is een framework dat bestaat uit een aantal plugins diegezamenlijk gebruikt kunnen worden als build automation tool. Maven beschrijft hoesoftware gebouwd wordt, en welke dependencies de software heeft. Hoewel er al jarenondersteuning is voor C#, Ruby, Scala en andere programmeertalen, wordt Maven nogsteeds hoofdzakelijk gebruikt voor Java projecten.

Figuur 1.16: Logo Apache Maven

� Quartz: Quartz is een open source job scheduling library die in bijna elke Java applicatiegeıntegreerd kan worden. Tijdsschema's worden in deze bibliotheek opgesteld in de vorm'cron expressions', wat het mogelijk maakt om zowel zeer makkelijke als ongelooflijkingewikkelde tijdsplanningen op te stellen.

Figuur 1.17: Logo Quartz

� Bcrypt: Bcrypt is een KDF (Key Derivation Function) voor wachtwoorden, gebaseerdop het Blowfish cipher (een symetric-key block cipher). Bcrypt voegt random salts toeaan de wachtwoorden om omvorming met behulp van rainbow tables te voorkomen. Eenbijkomend voordeel is het adaptief karakter van bcrypt: het aantal encryptie herhalingen,ook gekend als de 'cost' of work factor, kan verhoogd worden zodat de code resistantblijft tegen brute-force attacks wanneer de kracht van hedendaagse computers vergroot.

Figuur 1.18: Estimated hardware cost to crack a password in 1 year, Bron: [7]

Page 26: Product Price Management Application with PIM Integration

HOOFDSTUK 1. SITUERING 15

1.4.2 Front end

� Bootstrap: Bootstrap is een front-end framework dat gebruikt wordt om op een snelleen makkelijke manier een mooi design aan een webpagina te geven. Ook zijn er eenhele hoop gratis thema templates voor te vinden, wat het nog simpeler maakt om eenwebpagina een professionele look te geven.Wij hebben gebruik gemaakt van het SB Admin 2 thema, een administratorgerichte engebruiksvriendelijke web application user interface (bron: http://startbootstrap.com/template-overviews/sb-admin-2/).

Figuur 1.19: Logo Bootstrap

� AngularJS: AngularJS is een Javascript MVW (Model-View-Whatever) framework dat detekortkomingen van HTML bij de ontwikkeling van dynamische views aanpakt. AngularJSis vooral populair bij het ontwikkelen van SPA's (Single Page Applications), omwille vande vele krachtige mogelijkheden van het framework. Zo is er onder andere ondersteuningvoor two-way databinding, partial views en directives (een manier om nieuwe herbruikbareHTML tags te ontwikkelen).

Figuur 1.20: Angular's MVW structure,Bron:[2]

Page 27: Product Price Management Application with PIM Integration

HOOFDSTUK 1. SITUERING 16

� Font Awesome: Font Awesome is een CSS framework dat bestaat uit een uitgebreidecollectie iconen, die als glyphs (karakters van een lettertype) aangeroepen kunnen worden.Het lettertype dat speciaal hiervoor gecreeerd wordt, noemt men hierdoor ook wel eenicon font.Een groot voordeel aan het gebruik van een icon font in vergelijking met gewone iconen,is het feit dat deze op dezelfde manier aan te passen zijn als tekst. Men kan dus makkelijkvisuele eigenschappen zoals de kleur, grootte of schaduw van de iconen naar eigen wensenaanpassen, met behulp van CSS.

Figuur 1.21: Font Awesome icon examples

� jQuery (v.1.11): jQuery is een zeer uitgebreide Javascript library die vooral gericht is ophet verkorten en vergemakkelijken van standaard Javascript functies, zoals event handling,HTML DOM manipulatie, animaties en Ajax calls. Merk op dat er op het moment vanschrijven al een jQuery 2.0 versie uitgebracht is, maar deze ondersteunt geen InternetExplorer 6,7 en 8 meer. Aangezien deze webbrowsers tegenwoordig toch nog regelmatigworden gebruikt, is beslist om een oudere jQuery versie te implementeren.

Figuur 1.22: Logo jQuery

� Editable table: Editable table is een compacte jQuery plugin die elke tabel verandert ineen aanpasbaar spreadsheet. Vermits de klant voor de ontwikkeling van onze applicatieal zijn berekeningen in Excel deed, is dit een ideale plugin om de applicatie een vertrouwduiterlijk te geven.

� Bootstrap datepicker: een klein kalender widget waarop een datum geselecteerdkan worden, in Bootstrap stijl. Deze plugin vergemakkelijkt de 'zoeken op datum'

functionaliteit in onze applicatie. Dit is een perfecte visuele additie voor de applicatie,aangezien het thema van de gebruikersomgeving reeds op Bootstrap gebaseerd is.

Page 28: Product Price Management Application with PIM Integration

HOOFDSTUK 1. SITUERING 17

� Smart Table: Smart Table is een AngularJS module die kan worden gebruikt om dataop een duidelijke en simpele manier in tabelvorm te tonen, sorteren en filteren.Hiervoor zijn een groot aantal alternatieven beschikbaar, maar Smart Table is een van debetere keuzes omwille van verschillende redenen:

– Gebruiksvriendelijk: de HTML tabel opmaak blijft hetzelfde als voordien, metuitzondering van enkele toegevoegde attributen in de table tags. Bovendien zijncustom builds mogelijk, en is het relatief simpel om eigen plugins in de bibliotheekte implementeren;

– Compact: de minified versie is slechts 4kB groot;

– 1 dependency: de enige dependency van de bibliotheek is AngularJS, wat reedsgebruikt wordt;

– Stabiele release: redelijk veel AngularJS-based alternatieven zijn nog steeds enkel inbeta versie beschikbaar.

Figuur 1.23: Smart-table example, Bron:[3]

Page 29: Product Price Management Application with PIM Integration

HOOFDSTUK 1. SITUERING 18

1.5 Tools

� Eclipse: Eclipse is vooral bekend voor zijn open source Java IDE (Integrated DevelopmentEnvironment), waar ook hier gebruik van gemaakt wordt. Verder zijn er een groot aantaladd-ons en plugins voor deze IDE beschikbaar.

Figuur 1.24: Logo Eclipse

� MySQL Workbench: MySQL Workbench wordt in dit project enkel gebruikt voor hetbeheer van onze online MySQL database, hoewel het programma veel meer functionaliteitbezit. Zo kunnen er onder andere ook databasemodellen met ontworpen en gegenereerdworden.

� Git: Git is een gratis open source version control systeem dat zeer makkelijk bruikbaaris. Git maakt het mogelijk om op een overzichtelijke manier met meerdere mensen aaneen softwareproject te werken. Om Git te kunnen gebruiken is het uiteraard noodzakelijkom een repository te bezitten. Hier is gekozen voor een Atlassian Bitbucket repositoryom een aantal verschillende redenen:

– Xplore Group was al bekend met andere Atlassian software, zoals Confluence, JIRAen HipChat;

– Integratie met andere Atlassian software is mogelijk. Nieuwe commits worden voordit project bijvoorbeeld weergegeven als een HipChat boodschap;

– Bitbucket is gratis (voor maximum 5 gebruikers);

– We hadden als studenten al gebruik gemaakt van Bitbucket in het verleden, en warener toen zeer tevreden over. Ook zorgt dit ervoor dat er nu geen registratieprocesmeer doorlopen moet worden.

Figuur 1.25: Logo Git en Bitbucket

� SmartGit: SmartGit is een gratis Git client die het mogelijk maakt om op een grafischemanier toegang te krijgen tot Git. Dit maakt het gebruik van scripts om verschillendeGit acties (push, pull, commit) uit te voeren volledig overbodig.

� Dropbox: Dropbox is een populaire cloud sharing service voor allerlei bestanden. Opdeze manier kan documentatie, analyses en technische schema's makkelijk onderlinggedeeld worden. Bovendien is Dropbox gratis in gebruik voor een beperkte hoeveelheidopslagruimte, die op verschillende manieren sterk vergroot kan worden.

Page 30: Product Price Management Application with PIM Integration

HOOFDSTUK 1. SITUERING 19

� JIRA: JIRA is een project management tool van Atlassian, dat gebruikt kan worden omtaken te creeren en beheren. Elke taak kan hierbij een eigen prioriteit en verwachte datumvan voltooiing toegewezen krijgen. Verder kan JIRA ook fouten opslaan en documenteren.JIRA is bovendien een ideale tool voor agile softwareontwikkeling: development methodesals scrum en kanban zitten standaard in het programma verwerkt.

� Confluence: Confluence is een ander populair product van Atlassian. Het wordtomschreven als een team management tool. Het gebruik van Confluence zorgt eronder andere voor dat verschillende gebruikers projectgerelateerde documentatie makkelijkkunnen delen met hun teamgenoten.In dit project is Confluence onder andere gebruikt om een overzicht van het project teschetsen, installatie-en configuratiestappen voor bepaalde software te documenteren, eenalgemene planning aan te maken en nuttige bronnen te delen.

� Bamboo: Bamboo is een continuous integration en delivery tool voor softwareprojectenvan Atlassian. Het wordt gebruikt om veranderingen in code automatisch te deployennaar een server, na het uitvoeren van een aantal (optionele) testen.

� HipChat: HipChat, ons laatste gebruikte Atlassian programma, is een instant messagingprogramma, waarin groepschats en videochats mogelijk zijn. Ook zijn er voor HipChatmobiele apps, en is er een optie om boodschappen bij afwezigheid van de ontvanger viamail te versturen. Verder is ook hier integratie met andere Atlassian software mogelijk.Deze superieure chatapplicatie maakt communicatie met collega’s op bijna elk momentvan de dag mogelijk.

Figuur 1.26: Various Atlassian Products

Page 31: Product Price Management Application with PIM Integration

Hoofdstuk2Bespreking Price ManagementApplication

2.1 Inleiding

De berekening van de ideale prijs van een product op een bepaald verkoopkanaal is niet zoeenvoudig. Er zijn tenslotte een zeer groot aantal parameters die in rekening gebracht worden.Deze bespreking beschrijft de uitwerking van de in het vorige hoofdstuk besproken requirements(zie 1.2.3), alsook onze projectaanpak en de toelichting van de motivatie achter bepaaldegemaakte keuzes.

2.2 Aanpak

Voor de uitwerking van dit project hebben we gekozen voor een agile aanpak, omdat er meervan een idee/concept vertrokken is, dan van een product met strikte vereisten. Vanaf het beginbleek dat de klant nog veel knopen moest doorhakken, waardoor vrijwel meteen beslist is dateen agile approach de way-to-go was.Zowel de klant als de interne promotors zijn vanaf het begin sterk bij het project betrokken,door op geregelde basis meetings te houden en zichtbare delen van het project te tonen en tetesten. Op deze manier kon het product zich zeer dynamisch ontwikkelen, en terwijl perfectafstemmen naar de eisen van de klant.Verder is er doorheen het project constant continuous integration gebruikt. Doordatalle teamleden op regelmatige tijdstippen per dag nieuwe commits uitvoerden, zijn groteintegratieproblemen op de main branch vermeden.

20

Page 32: Product Price Management Application with PIM Integration

HOOFDSTUK 2. BESPREKING PRICE MANAGEMENT APPLICATION 21

Figuur 2.1: Agile Development, Bron: [4]

Page 33: Product Price Management Application with PIM Integration

HOOFDSTUK 2. BESPREKING PRICE MANAGEMENT APPLICATION 22

2.3 Use cases

Om de user, business en technical requirements te helpen bepalen en visualiseren, zijn zowel useruse cases als business use cases opgesteld. Deze scriptie zal zich beperken tot het bespreken vande algemene use case overviews. Bij verdere interesse kunnen enkele use cases teruggevondenworden in bijlage A. Ook zijn alle use cases terug te vinden in de folder 'Finaal product/Schema's'van het portfolio.

2.3.1 User use cases

De user use cases kunnen opgesplitst worden in vijf groepen, die elk bestaan uit een aantaltaken die de gebruiker kan ondernemen:

� CRUD functionaliteit: dit is een van de meest uitgebreide groepen, vermits voor elkeentiteit met invloed op de prijsberekening Create, Read, Update en Delete functionaliteitvoorzien moet zijn;

� Price enrichment: de gebruiker moet op product en prijsniveau parameterwaarden (ofoverwrites) kunnen invullen om de berekende prijs naar wens te beınvloeden;

� Hybris synchronisatie:

– Nieuwe en geupdate producten ophalen uit het Hybris PIM systeem;

– Berekende prijzen terugsturen naar het Hybris systeem.

� Prijsberekening: na het verkrijgen en verrijken van de prijsgerelateerde productinfo moetde gebruiker een prijs kunnen laten berekenen;

� Status management: de gebruiker moet in staat zijn om fouten op een overzichtelijkeen duidelijke manier te kunnen vinden en interpreteren.

Page 34: Product Price Management Application with PIM Integration

HOOFDSTUK 2. BESPREKING PRICE MANAGEMENT APPLICATION 23

User use case overview

Figuur 2.2: User use case overview

2.3.2 Business use case overview

Het business use case overview beschrijft hoe geınteresseerde partijen hun gewenste doel kunnenbereiken door gebruik te maken van de applicatie, en welke activiteiten/acties nodig zijn omdit doel te bereiken. Algemeen kan gesteld worden dat het project gesplitst is in twee delen,zoals eerder reeds vermeld is (zie 1.2.1). In de price management application zullen een aantalstappen uitgevoerd moeten worden vooraleer de berekende prijs in Hybris getoond kan worden:

1. Producten moeten ingeladen worden uit Hybris. Merk op dat dit ook elk uur automatischgebeurt (zie figuur 2.3)

2. Voor elk product dienen de gewenste verkoopkanalen geselecteerd te worden.

3. Prijsgerelateerde parameters worden ingevuld en/of overschreven.

4. Prijzen moeten berekend worden (zie Price logic)

5. De berekende prijzen worden verzonden naar het PIM systeem van Hybris. Merk op datdit ook elk uur automatisch gebeurt (zie figuur 2.3)

6. Voor elke prijs wordt gecontroleerd op fouten via het status management. Zowel foutenbij het verzenden en berekenen van prijzen, alsook aanpassingen van gebruikte parameterszullen een error status weergeven (zie Status logic).

Page 35: Product Price Management Application with PIM Integration

HOOFDSTUK 2. BESPREKING PRICE MANAGEMENT APPLICATION 24

Figuur 2.3: Business use case overview

Page 36: Product Price Management Application with PIM Integration

HOOFDSTUK 2. BESPREKING PRICE MANAGEMENT APPLICATION 25

2.4 Workflow

2.4.1 User workflow

Een gebruiker moet om zijn doel te kunnen bereiken een aantal vaste stappen doorlopen.Eerst moet hij zich identificeren door middel van credentials (gebruikersnaam en wachtwoord).Wanneer de credentials goedgekeurd worden, voert hij zijn gewenste handeling(en) uit, zoalsbijvoorbeeld het aanmaken van sales channels, leveranciers wijzigen, of prijzen berekenen.Tenslotte moeten de wijzigingen opgeslagen worden om de actie te finaliseren.

Figuur 2.4: User workflow

2.4.2 Business workflow

Om de prijs van een product te berekenen dienen er een aantal stappen te gebeuren:

1. Een nieuw product wordt toegevoegd in het Product Information Management systeem;

2. Dit product wordt opgehaald door de price calculation module;

3. Parameters met prijsinvloed worden ingevoerd en/of overschreven;

4. Prijzen worden berekend;

5. De prijzen worden teruggestuurd naar het Hybris PIM systeem.

Figuur 2.5: Business workflow

Page 37: Product Price Management Application with PIM Integration

HOOFDSTUK 2. BESPREKING PRICE MANAGEMENT APPLICATION 26

2.5 Technical

2.5.1 Introductie

2.5.2 Architectuur

Algemeen projectoverzicht

Vooraleer de prijscalculator uitgelegd wordt, is hier het volledige project geschetst. Zieonderstaande figuur 2.6 voor een algemeen overzicht van het project.De productinformatie van de webshop wordt beheerd door het centrale Product ContentManagement systeem van Hybris, in het algemeen een PIM systeem genoemd. Vanuit ditsysteem vertrekt productdata naar alle andere componenten.Informatie over de voorraden van de producten wordt bijgehouden met behulp van Navision, eenEnterprise Resource Planning en boekhouding tool van Microsoft. Deze software zal updatesvan stockinformatie doorzenden naar het PIM systeem. Merk op dat momenteel enkel devoorraden van de rechtstreekse verkoopkanalen (Kinderenkoning.be en Mynutty.be) opgevolgdworden. Deze rechtstreekse verkoopkanalen worden beheerd met Magento, een open sourceeCommerce managementsysteem voor webshops.In de rechterbovenhoek van de figuur staat de price calculation module, het onderwerp vandeze scriptie. Deze module zal, zoals alle andere componenten, productinformatie ontvangenvan het PIM systeem.

Figuur 2.6: General project overview

Page 38: Product Price Management Application with PIM Integration

HOOFDSTUK 2. BESPREKING PRICE MANAGEMENT APPLICATION 27

Technical flow

Zoals reeds vermeld in de use case bespreking op pagina 22 kunnen de mogelijke acties in deapplicatie opgedeeld worden in verschillende stukken:

� Authenticatie;

� CRUD operaties;

� Hybris synchronisatie:

– GET products;

– PUT/POST prices;

� Prijscalculatie.

In dit deel worden al deze processen iets technischer toegelicht.

AuthenticatieprocesDe gebruiker dient zijn inlog gegevens in te geven in de web applicatie. Deze worden viaREST door gestuurd naar de WildFly application server, waar het wachtwoord gehashed wordtmet behulp van het bcrypt algoritme, en vervolgens de combinatie wachtwoord&inlognaamvergeleken wordt met de database voor een match. Indien de login gegevens correct ingevuldwerden, wordt er een authorisatie token naar de browser teruggestuurd in de vorm van eencookie. Indien de inloggegevens fout waren, wordt er een HTTP error code 403 (Forbidden)teruggestuurd, en krijgt de gebruiker hier een melding van.

Figuur 2.7: Standaard Internet Explorer 403 Error

CRUD operatiesVia de web applicatie kan de gebruiker makkelijk per entiteit verschillende CRUD actiesuitvoeren. Wanneer de gebruiker zijn wijzigingen vervolgens opslaat, worden deze via decorresponderende REST actie (zie figuur 2.8) naar de WildFly server verzonden. Voor elkeentiteit zijn voor deze REST communicatie 2 DTO's voorzien:

Page 39: Product Price Management Application with PIM Integration

HOOFDSTUK 2. BESPREKING PRICE MANAGEMENT APPLICATION 28

� een DTO voor read functionaliteit, omdat hier tevens een 'in use' status wordtmeegezonden, zodat er na het laden van een pagina geen objecten verwijderd kunnenworden die parent zijn van andere objecten;

� een tweede DTO wordt gebruikt om de wijzigingen terug te sturen naar de server. Ditverloopt op de volgende manier:

– Eerst wordt deze DTO geparsed naar de daadwerkelijke entiteit;

– Vervolgens wordt deze doorverwezen naar status management, waar wordt gecon-troleerd of de veranderingen invloed hebben op de prijs calculatie. Zo ja, dan wordende relevante statussen (zie Status logic) gewijzigd;

– Als laatste stap worden de wijzigingen gepersisteerd door de Hibernate ORM tool.

Figuur 2.8: CRUD REST actions

GET productsDeze functie wordt automatisch elk uur uitgevoerd als een asynchrone job. Dit gebeurt metbehulp van de Quartz scheduler. Er is verder ook nog een optie om deze methode manueel aante roepen via de web applicatie. De werking is als volgt:

� In de database wordt de laatste synchronisatiedatum bij gehouden. Deze datum wordtgebruikt in de REST call naar Hybris, om alle producten die aangemaakt of gewijzigd zijnsinds de synchronisatiedatum, op te halen;

� Hierna worden de opgehaalde Hybris producten geconverteerd naar de product entiteit vande applicatie server. Deze producten worden gesplitst in nieuwe- en gewijzigde producten,door ze te gaan vergelijken met rijen in de producttabel van de applicatie database;

� Voor de nieuwe producten worden er een aantal default waardes ingevuld. Verder wordtde beste (kleinst mogelijke) verpakking gekozen aan de hand van de productafmetingen.Voor gewijzigde producten worden enkel de parameters afkomstig uit Hybris geupdate,waarna enkele statussen(zie Status logic) aangepast worden indien nodig.

Page 40: Product Price Management Application with PIM Integration

HOOFDSTUK 2. BESPREKING PRICE MANAGEMENT APPLICATION 29

PUT/POST pricesNet als de Hybris GET products methode, wordt deze functie elk uur automatisch uitgevoerdals een asynchrone job met behulp van de Quartz scheduler. Ook hier is weer een optie om detaak manueel te triggeren. Deze taak verloopt als volgt:

� Eerst wordt de 'send' status van de door te sturen prijzen op 'sending' gezet;

� Hybris heeft een POST REST methode om nieuwe prijzen te versturen, en een PUTREST methode om bestaande prijzen te updaten. Omdat er voor de price managementapplication geen enkele manier is om op voorhand te weten of een prijs bestaand ofonbestaand is in het Hybris syteem, worden voor alle te verzenden prijzen eerst de POST(create) methode uitgevoerd. Enkel voor prijzen waarbij deze REST call een 404 errorterugstuurt, zal de PUT (update) methode aangeroepen worden;

� Tenslotte wordt de send status aangepast naar 'sent' voor prijzen die succesvoldoorgestuurd zijn, of naar de corresponderende error code voor prijzen waarbij foutenopgetreden zijn.

Figuur 2.9: Flow of products and prices between Price Management Application and PIM

Calculate pricesDeze functie kan enkel manueel getriggerd worden via de web applicatie. Na het aanroepen vande functie, wordt ook hier weer een asynchrone job gestart met behulp van de Quartz scheduler.Deze taak gebeurt als volgt:

� Alle prijzen die berekend dienen te worden, krijgen een calculation status 'calculating';

� De prijzen worden een voor een berekend. Meer info over de prijslogica kan bij hetonderdeel Price logic gevonden worden;

� Bij een succesvolle prijsberekening wordt de calculation status op 'calculated' gezet.Indien een error optreedt wordt als calculation status van de desbetreffende prijs deovereenkomstige error code ingevuld.

Page 41: Product Price Management Application with PIM Integration

HOOFDSTUK 2. BESPREKING PRICE MANAGEMENT APPLICATION 30

Technical flow overview

De onderstaande figuur (2.10) illustreert hoe de aparte componenten van de product pricemanagement application met elkaar en het PIM systeem communiceren.

Figuur 2.10: Technical flow overview

Page 42: Product Price Management Application with PIM Integration

HOOFDSTUK 2. BESPREKING PRICE MANAGEMENT APPLICATION 31

2.5.3 Design

Al vanaf het begin was het duidelijk hoe ons algemeen ontwerp er zou uitzien: een web applicatieals frontend, die via REST services communiceert met een Java backend, die op zijn beurtcommuniceert met het PIM systeem en de database.

Als frontend is er gekozen voor een webapplicatie, met als frameworks een combinatie vanAngularJS en Bootstrap, en daar bovenop nog een aantal kleine toegevoegde plugins, zoalseditable table en Smart Table. Met dit totaalpakket van technologieen, frameworks en libraries,hebben we een performante en intuıtieve SPA gebouwd. Vooral de databinding van AngularJSis een veelgebruikte feature, die de applicatie zeer developer en user friendly maakt.Als backend is er een WildFly application server, waarop een Java application draait. Voor decommunicatie met de front end hebben we een RESTful API geımplementeerd met behulp vanJAX-RS. Dit hebben we ook gebruikt voor onze REST calls naar Hybris. Voor de communicatiemet de database is er gebruikt gemaakt van een combinatie van JPA en Hibernate als ORM.Omdat alle data nodig voor de prijsberekening niet door Hybris gekend is, is er een MySQLdatabase aangemaakt zodat deze data in de price management application ingegeven kanworden.

Figuur 2.11: Price Management Application Overview

Page 43: Product Price Management Application with PIM Integration

HOOFDSTUK 2. BESPREKING PRICE MANAGEMENT APPLICATION 32

Development stackEr is voor continuous integration gekozen om integratieproblemen zo veel mogelijk proberen tevermijden. Om dit te verwezenlijken is gewerkt met lokale Git repositories, die meerdere kerenper dag gesynchroniseerd worden met de master branch op Bitbucket. Als test server wordt ergebruik gemaakt van een Amazon Web Services ec2 instance waar Ubuntu 12 op draait. Opdeze server staan zowel onze application server als onze database.Om onze applicatie te deployen naar de application server, wordt gebruik gemaakt vanAtlassian's continuous integration tool Bamboo: op het einde van elke dag zal de recentsteprojectversie van Bitbucket opgehaald worden, om deze vervolgens te builden op de testservermet behulp van Maven. Ook zijn er enkele basistesten geıntegreerd in het Bamboo proces.Een bijkomend voordeel van Bamboo is dat het tot de Atlassian stack behoort, en dusgelinkt kan worden aan andere Atlassian programma's. Alle stappen in verband met commitsen builds worden zo bijvoorbeeld in het Atlassian chatprogramma HipChat getoond, zodatdevelopers meteen op de hoogte zijn van mogelijke problemen, ook indien deze problemen bijeen geautomatiseerd proces zouden optreden.

Figuur 2.12: Development Stack Overview

Page 44: Product Price Management Application with PIM Integration

HOOFDSTUK 2. BESPREKING PRICE MANAGEMENT APPLICATION 33

Database

Omdat niet alle data nodig voor de prijsberekening door Hybris gekend is, is er gekozen om eenMySQL database te linken aan onze applicatie. Na een gesprek met de klant, is als eerste stapin het ontwikkelingsproces een relationeel model uitgewerkt.Dit model is vervolgens nog meerdere keren gewijzigd, om zo goed mogelijk tegemoet te komenaan de eisen van de klant.

ER diagram

De figuur hieronder illustreert de relaties tussen de verschillende entiteiten in ons datamodel.Merk op dat deze figuur maar een compacte versie van het ER diagram is. Zie bijlage B oppagina 97 voor het volledige ER diagram.

Figuur 2.13: Simplified ER diagram

Relaties

Op de volgende pagina worden de relaties tussen de verschillende entiteiten kort uitgelegd.Verder zijn in bijlage B op pagina 98 enkele tabellen bijgevoegd die de betekenis van allegebruikte parameters verduidelijken. Elke tabel in deze bijlage stelt een aparte entiteit van hetentity relationship diagram voor.

Page 45: Product Price Management Application with PIM Integration

HOOFDSTUK 2. BESPREKING PRICE MANAGEMENT APPLICATION 34

Packaging: deze entiteit bevat de verschillende mogelijke verpakkingen die gebruikt wordenvoor een product. Packaging is enkel afhankelijk van het product en optioneel, maarer zijn meerdere verpakkingen mogelijk (many-to-many relatie). Zo kan er bijvoorbeeldeen doos met noppenfolie gecombineerd worden, of extra cadeauverpakking in rekeninggebracht worden.De afmetingen van de verpakking zijn optionele eigenschappen, vermits bij bv. een strikenkel de prijs belangrijk is.Aan de hand van de afmetingen van een product kan automatisch de meest geschikte doosen de bijhorende verpakkingsprijs bepaald worden. Met de afmetingen van de verpakkingen het gewicht van het product, kan vervolgens bepaald worden of het product via GLSColli(geschikt voor kleine pakketten en goedkoop) of GLS Freight(geschikt voor groterepakketten en duur) verzonden zal worden.

Supplier: deze entiteit bevat de kortingen per leverancier (zowel aankoopkorting als staffel-korting). Een leverancier zal meerdere producten leveren, terwijl elk product maar eenleverancier heeft (one-to-many relatie).

Product: deze entiteit bevat alle toebehoren van een product (algemene informatie, winstmar-ges, prijzen, kosten enzovoort). Ook zijn er op productniveau een aantal overwrites/flagsbeschikbaar. Zo kan er bijvoorbeeld beslist worden of de listing price genegeerd magworden door het aanpassen van de listing price flag. Elk product wordt op verschillendekanalen verkocht en elk kanaal zal verschillende producten aanbieden (many-to-manyrelatie). Ook zal een product meerdere prijzen hebben (1 prijs per sales channel), maarelke prijs zal wel aan 1 product gebonden zijn (one-to-many relatie). Ook zal eenproduct per regio een verschillende transportkost en Drop&Ship prijs hebben (one-to-many relatie).

Transport: deze entiteit bevat de transportkost en Drop&Ship prijzen. Het transport van eenproduct is landafhankelijk. Er zullen dus meerdere transporten per product en per landmogelijk zijn (one-to-many relatie).

Price: er zullen verschillende prijzen zijn voor een product (many-to-one relatie). Tegelijkzullen er aan elk kanaal ook verschillende prijzen gekoppeld zijn (many-to-one relatie),namelijk 1 prijs per product. Een prijs zal mogelijk overwrites hebben maar dit is nietnoodzakelijk het geval (one-to-(n)one relatie). Hoewel de optimale prijs geen overwriteis, hebben we deze hier toch geplaatst omdat deze ook optioneel en kanaalafhankelijk is.Voor de rest bestaat de prijs uit een aantal noodzakelijke, berekende velden (one-to-onerelatie met calculated).

Price overwrite: zie Price.

Price calculated: zie Price.

Page 46: Product Price Management Application with PIM Integration

HOOFDSTUK 2. BESPREKING PRICE MANAGEMENT APPLICATION 35

Channel: er zijn vele kanalen die elk een aantal producten verkopen (many-to-many relatie).De producten hebben allemaal een afzonderlijke prijs, dus een kanaal zal aan meerdereprijzen gekoppeld zijn (one-to-many relatie). Elk kanaal zal leveren in verschillende zones(one-to-many relatie). Per kanaal zal een land van bestemming gedefinieerd worden(one-to-one relatie), waarvoor we de transportprijzen berekenen.

Region: een regio kan voorkomen in meerdere zones en een zone kan bestaan uit meerdereregio's (many-to-many relatie). Meestal zal een regio een volledig land zijn, maar ditis niet altijd het geval. Voor Sardinie bijvoorbeeld, zal GLS een hogere transportkostaanrekenen dan de rest van Italie.

Zone: de relaties van zone zijn al besproken in channel en region.

GLS Colli: Belgie heeft per bestemming (regio) meerdere GLS Colli tarieven (one-to-manyrelatie), die afhankelijk zijn van de afmetingen en het gewicht van het pakket.

GLS Freight: Belgie heeft per bestemming (regio) meerdere GLS freight tarieven (one-to-many relatie), die afhankelijk zijn van de afmetingen en het gewicht van het pakket.

ParametersZie bijlage B op pagina 98 voor meer informatie over de parameters uit het ER diagram.

Page 47: Product Price Management Application with PIM Integration

HOOFDSTUK 2. BESPREKING PRICE MANAGEMENT APPLICATION 36

2.5.4 Backend

Zoals zichtbaar in het Price Management Application Overview op pagina 31, is er alsontwikkelingsplatform gebruik gemaakt van Java Enterprise Edition. De ontwikkelde applicatiedraait op een WildFly application server, die gedeployed wordt op een Ubuntu 12 omgeving inde cloud.Inhoudelijk bestaat de backend grotendeels uit een REST API voor communicatie met de frontend GUI, en code voor de communicatie met Hybris. Verder wordt in dit onderdeel ook jobscheduling en security toegelicht.

CRUD functionaliteit

Nadat de entiteiten en hun onderlinge relaties die reeds beschreven zijn in het ER diagram, isvan dit diagram een databasemodel opgesteld. Dit database model is op zijn beurt met behulpvan ORM, in dit geval de Hibernate plugin, omgezet in Java klassen die bruikbaar zijn in debackend applicatie. Dit liet ons toe om, met behulp van JPQL queries, heel makkelijk CRUDfunctionaliteit te implementeren.In de code hieronder wordt gedemonstreerd hoe een read mogelijk is van alle producten die noggeen prijs hebben, of waar de prijsberekening niet meer up to date is.

Listing 2.1: query to read products without prices or with outdated prices

TypedQuery<Object []> query = em . c r ea t eQue ry ( ”SELECT DISTINCT p , p r iFROM Product p LEFT JOIN p . p r i c e s p r i LEFT JOIN p r i . p r i c eO v e rw r i t epow LEFT JOIN p r i . p r i c e C a l c u l a t e d pc WHERE NOT EXISTS(SELECT p r i c FROM Pr i c e p r i c WHERE p r i c . p roduc t=p )OR pc . s t a t u s P r i c e=FALSE” , Object [ ] . c l a s s ) ;

Zoals zichtbaar in de onderste regel van het codevoorbeeld, heeft de CRUD functionaliteit eenextra dimensie die nog niet besproken is: status. Statussen bijhouden is in deze applicatieessentieel, vermits er op verschillende plaatsen desynchronisatie van data kan optreden. Hetstatus management wordt verder uitgelegd in het onderdeel Status logic op pagina 56.

Page 48: Product Price Management Application with PIM Integration

HOOFDSTUK 2. BESPREKING PRICE MANAGEMENT APPLICATION 37

REST API

De voorgenoemde REST API is op een consistente en logische manier opgebouwd.Dit is dealgemene structuur die gebruikt is:

/pricing/rest/entiteit/subentiteit/aantal

Merk op dat de subentiteit en het aantal niet overal essentieel zijn, en al dan niet toegepastworden afhankelijk van de nodige actie. Om verschillende CRUD acties te onderscheiden, isgebruik gemaakt van HTTP methodes.

Figuur 2.14: REST API Methods, Bron:[8]

Met het onderstaande codevoorbeeld wordt gedemonstreerd hoe de verschillende HTTP RESTmethodes voor een entiteit geımplementeerd zijn.

Listing 2.2: Region entity RESTful service example

/*** This c l a s s p roduces a RESTful s e r v i c e to read / w r i t e the c on t en t s o f the* Region i n f o .*/

@Path ( ”/ r e g i o n ” )@RequestScopedp u b l i c c l a s s Reg i onRe sou r c eRe s tS e r v i c e {

@ I n j e c tp r i v a t e Reg i onRepo s i t o r y r e p o s i t o r y ;

@GET@Produces (MediaType . APPLICATION JSON)p u b l i c L i s t<RegionLoadDTO> l i s t R e g i o n ( ) {

return r e p o s i t o r y . f indAl lOrderedByName ( ) ;}

@PUT@Consumes (MediaType . APPLICATION JSON)@Produces (MediaType . APPLICATION JSON)p u b l i c void update ( L i s t<Region> r egn ) {

r e p o s i t o r y . updateReg ion ( regn ) ;}

@POST@Consumes (MediaType . APPLICATION JSON)@Produces (MediaType . APPLICATION JSON)

Page 49: Product Price Management Application with PIM Integration

HOOFDSTUK 2. BESPREKING PRICE MANAGEMENT APPLICATION 38

p u b l i c void c r e a t e ( L i s t<Region> r egn ) {r e p o s i t o r y . c r e a t eReg i on ( regn ) ;

}

@DELETE@Path ( ”/{ i d }” )@Produces (MediaType . APPLICATION JSON)p u b l i c void remove (@PathParam ( ” i d ” ) long i d ) {

i n t i d i n t = ( i n t ) i d ;Region regn = r e p o s i t o r y . f i n dBy I d ( i d i n t ) ;r e p o s i t o r y . d e l e t eR eg i o n ( regn ) ;

}}

Hybris REST connectie

Voor de communicatie met Hybris, wordt de REST API van Hybris aangesproken vanuit debackend. Om dit te bereiken is gebruik gemaakt van RESTeasy.

Listing 2.3: Hybris PIM connection implementation

@Over r idep u b l i c i n t upda t eP r i c e ( S t r i n g ca ta l og ,P r i c eC a l c u l a t e d p r i c eC a l c u l a t e d , P r i c e p r i c e ) {Re s t e a s yC l i e n t c l i e n t = new Re s t e a s y C l i e n t B u i l d e r ( ) . b u i l d ( ) ;

ResteasyWebTarget t a r g e t = c l i e n t. t a r g e t ( ba s eU r l ). path ( ”/ p r i c emodu l a t o r / c a t a l o g s /”+ca t a l o g+”/ product /”+p r i c e

. ge tProduct ( ) . getSku ()+”/ updatePr iceRow” ) ;

S t r i n g code=ca t a l o g . toUpperCase ()+” ”+p r i c e. ge tChanne l ( ) . getName ( ) . toUpperCase ()+” ”+p r i c e

. ge tProduct ( ) . getSku ( ) . toUpperCase ( ) ;Double p r i c eDoub l e = p r i c e C a l c u l a t e d . g e tOp t ima lP r i c e ( ) ;

Response r e s pon s e = newDe f au l tBu i l d e r ( t a r g e t ). po s t ( E n t i t y . j s o n (new UpdatePr iceBodyPost ( code , p r i c eDoub l e ) ) ) ;

LOG. i n f o ( ” upda t eP r i c e ( ) r e s pon s e : {}” , r e s pon s e . g e t S t a t u s ( ) ) ;return r e s pon s e . g e tS t a t u s ( ) ;

}

Page 50: Product Price Management Application with PIM Integration

HOOFDSTUK 2. BESPREKING PRICE MANAGEMENT APPLICATION 39

Scheduler

Om de performantie en het gebruiksgemak van de applicatie te vergroten, worden bepaaldefuncties asynchroon op een bepaalde tijdsbasis uitgevoerd. Om dit te verwezenlijken is ergebruik gemaakt van de Quartz scheduler library.De implementatie van deze bibliotheek bestaat uit een takenplanner, waar alle jobs (de functiesdie asynchroon uitgevoerd moeten worden) gepland worden.

Listing 2.4: Job scheduler code

@PostConst ructp u b l i c void s c h edu l e J ob s ( ) {

t r y {s c h e d u l e r = new S tdSchedu l e rFa c t o r y ( ) . g e t S ch edu l e r ( ) ;s c h e d u l e r . s e t J obFac t o r y ( cd i J obFac t o r y ) ;

c r e a t eOu tda t edP r i c i n g Job ( ) ;s chedu l eHyb r i sP roduc tSyncJob ( ) ;s c h edu l eHyb r i sP r i c eS yn c Job ( ) ;c r e a t eHyb r i sP r i c e S y n cSp e c i J o b ( ) ;

s c h e d u l e r . s t a r t ( ) ;p r i n t J ob sAndT r i g g e r s ( s c h e d u l e r ) ;

} catch ( S ch edu l e rEx c ep t i o n e ) {LOG. e r r o r ( ” E r r o r wh i l e c r e a t i n g s c h e d u l e r ” , e ) ;

}

De planning van de jobs kan opgesplitst worden in periodische en manueel getriggerde jobs(schedule & create taken). In functie zijn ze bijna identiek, maar enkel bij de periodische jobswordt er een trigger gecreeerd, waarin de periodiciteit beschreven staat met behulp van de cronnotatie.Onderstaande code toont een cron notatie, die eenmaal per uur betekent. Daarop volgt eenvoorbeeld van de code gebruikt om een job te creeeren en plannen.

Listing 2.5: Cron notation - once every hour

p r i v a t e s t a t i c f i n a l S t r i n g HYBRIS PRODUCT SYN CRON = ”0 0 0/1 1/1 * ? *” ;

Listing 2.6: Job creation and scheduling code - Nick De Kock

p u b l i c void t r i g g e rHyb r i sP r odu c tS yn c Job ( ) throws Schedu l e rEx c ep t i o n {s c h e d u l e r . t r i g g e r J o b ( JobKey . jobKey ( ” hyb r i s−product−sync ” , ” p r i c i n g ” ) ) ;}

p r i v a t e void s chedu l e Job ( S t r i n g jobName , S t r i n g groupName , S t r i n g tr iggerName ,C la s s<? extends Job> j o bC l a s s , S t r i n g c ron )

throws Schedu l e rEx c ep t i o n {JobKey jobKey = JobKey . jobKey ( jobName , groupName ) ;J obDe t a i l j o bD e t a i l ;

Page 51: Product Price Management Application with PIM Integration

HOOFDSTUK 2. BESPREKING PRICE MANAGEMENT APPLICATION 40

i f ( s c h e d u l e r . c h e c kE x i s t s ( jobKey ) ) {j o bD e t a i l = s c h e d u l e r . g e t J o bDe t a i l ( jobKey ) ;

} e l s e {// C r ea t e s j ob i f i t doesn ’ t e x i s t y e tLOG. i n f o ( jobKey + ” doesn ’ t e x i s t yet , c r e a t i n g JobDe t a i l ” ) ;j o bD e t a i l = JobBu i l d e r

. newJob ( j o bC l a s s )

. w i t h I d e n t i t y ( jobKey )

. b u i l d ( ) ;}

Tr igge rKey t r i g g e rK e y =Tr igge rKey . t r i g g e rK e y ( t r igge rName+”−”+jobKey , groupName ) ;

T r i g g e r t r i g g e r ;i f ( s c h e d u l e r . c h e c kE x i s t s ( t r i g g e rK e y ) ) {

t r i g g e r = s c h e d u l e r . g e tT r i g g e r ( t r i g g e rK e y ) ;} e l s e {

// C r ea t e s t r i g g e r and s c h e d u l e s j ob i f i t doesn ’ t e x i s t y e tLOG. i n f o ( t r i g g e rK e y + ” doesn ’ t e x i s t yet , c r e a t i n g T r i g g e r

and immed i a t e l y s c h e d u l i n g ” + j o bD e t a i l ) ;t r i g g e r = T r i g g e r B u i l d e r . newTr igger ( )

. w i t h I d e n t i t y ( t r i g g e rK e y )

. w i thSchedu l e ( C ronSchedu l eBu i l d e r . c r onSchedu l e ( c ron ) )

. f o r Job ( jobKey . getName ( ) , jobKey . getGroup ( ) )

. b u i l d ( ) ;s c h e d u l e r . s chedu l e Job ( j o bDe t a i l , t r i g g e r ) ;

}}

Page 52: Product Price Management Application with PIM Integration

HOOFDSTUK 2. BESPREKING PRICE MANAGEMENT APPLICATION 41

Security

Authenticatie gebeurt via bcrypt. In de database wordt de combinatie username en passwordbijgehouden, waarbij het wachtwoord in geencrypteerde vorm volgens het bcrypt algoritmeopgeslagen wordt.Als een gebruiker besluit om in te loggen, worden zijn gegevens via de front end door deREST API naar de backend gestuurd. Hier wordt gecontroleerd of de gebruiker bestaat. Zoja, dan wordt gecontroleerd of het gehashte passwoord overeenkomt met dat in de database.Als deze check ook 'true' terugstuurt, zal een web token teruggestuurd worden in de vormvan een cookie, die vanaf dan gebruikt kan worden om alle REST calls te authoriseren. Hetonderstaande codevoorbeeld demonstreert hoe de security service geımplementeerd is:

Listing 2.7: Security service implementation - Nick De Kock

@App l i ca t i onScopedp u b l i c c l a s s S e c u r i t y S e r v i c e Im p l implements S e c u r i t y S e r v i c e {

@ I n j e c tp r i v a t e Use rRepo s i t o r y u s e rR e p o s i t o r y ;p r i v a t e f i n a l byte [ ] jsonWebTokenKey ;p r i v a t e Logger LOG = Logge rFac to ry . ge tLogge r ( S e c u r i t y S e r v i c e Im p l . c l a s s ) ;

p u b l i c S e c u r i t y S e r v i c e Im p l ( ) {jsonWebTokenKey = new byte [ 6 4 ] ;new SecureRandom ( ) . nex tBy te s ( jsonWebTokenKey ) ;

}

@Over r idep u b l i c S t r i n g a u t h e n t i c a t e ( S t r i n g username , S t r i n g password ) {

User u s e r = u s e rR e p o s i t o r y . getByUsername ( username ) ;i f ( u s e r == n u l l ) {

LOG. i n f o ( ”User not found f o r {}” , username ) ;return n u l l ;

}i f ( BCrypt . checkpw ( password , u s e r . getPassword ( ) ) ) {

LOG. i n f o ( ” Supp l i e d password i s c o r r e c t f o r {}” , username ) ;S t r i n g jsonWebToken = Jwts . b u i l d e r ( ) . s e t S u b j e c t ( username )

. s i gnWith ( S i gna t u r eA l go r i t hm . HS256 , jsonWebTokenKey ) . compact ( ) ;LOG. i n f o ( ” Re tu rn i ng jsonWebToken {}” , jsonWebToken ) ;return jsonWebToken ;

} e l s e {LOG. i n f o ( ” Supp l i e d password i s i n c o r r e c t f o r {}” , username ) ;return n u l l ;

}}@Over r idep u b l i c boolean a u t h o r i z e ( S t r i n g jsonWebToken ) {

t r y {Jws<Claims> jws = Jwts . p a r s e r ( )

. s e tS i gn i ngKey ( jsonWebTokenKey )

Page 53: Product Price Management Application with PIM Integration

HOOFDSTUK 2. BESPREKING PRICE MANAGEMENT APPLICATION 42

. pa r s eC la imsJws ( jsonWebToken ) ;LOG. i n f o ( ” S u c c e s s f u l l y pa r s ed jsonWebToken wi th username {} ” ,jws . getBody ( ) . g e t Sub j e c t ( ) ) ;

return true ;

} catch ( S i g n a t u r eE x c ep t i o n e ) {LOG. i n f o ( ”Unable to a u t h o r i z e jsonWebToken {}” , jsonWebToken ) ;return f a l s e ;

}}

}

Page 54: Product Price Management Application with PIM Integration

HOOFDSTUK 2. BESPREKING PRICE MANAGEMENT APPLICATION 43

2.5.5 Front end

Zoals te zien in figuur 2.11, bestaat de front end uit een HTML5 applicatie met AngularJS,jQuery en Bootstrap integratie. Hier bovenop zijn nog een aantal kleine plugins gebruikt diereeds toegelicht zijn in het onderdeel Libraries & frameworks op pagina 15 .

StructuurDe front end is gestructureerd als een standaard AngularJS applicatie: er is een HTMLhoofdbestand, met een aantal kleinere HTML bestanden die dynamische 'views' bevatten.Afhankelijk van de gevolgde route, wordt een van deze views in het hoofdbestand weergegeven,gecombineerd met de vaste inhoud van het hoofdbestand. De vaste inhoud bestaat in dit gevalenkel uit hoofdingen en menu's.Als AngularJS javascript files wordt gebruik gemaakt van services, controllers en een routecon-troller. De routecontroller bepaald welke dynamische views wanneer getoond moeten worden.De controllers zijn in feite javascript bestanden gelinkt aan een bepaald dynamisch view.Ter verduidelijking dit voorbeeld: de routecontroller zal ervoor zorgen dat bij het openen vaneen link naar '#/Dashboard' de dynamische 'dashboard.html' geladen wordt in het HTMLhoofdbestand, en daarbij wordt ook de bijhorende dashboard controller geladen.AngularJS services worden in dit geval gebruikt om de REST services te configureren. Indieneen AngularJS controller vervolgens gebruik wilt maken van een van deze rest services, kan ditmakkelijk door het toevoegen van de correcte dependency en het aanroepen van de gewenstemethode.Het onderstaand voorbeeld toont hoe de REST services in AngularJS geimplementeerd zijn, envervolgens hoe ze aangeroepen kunnen worden.

Listing 2.8: Angular REST service example

s e r v i c e s . f a c t o r y ( ’ c hanne l s ’ , f u n c t i o n ( $ r e s o u r c e ) {return $ r e s o u r c e ( ’ / p r i c i n g / r e s t / channe l ’ , {} , {

query : {method : ’GET ’ ,i s A r r a y : true

} ,update : {

method : ’PUT ’ ,i s A r r a y : true

} ,c r e a t e : {

method : ’POST ’ ,i s A r r a y : true

}})

} ) ;

Page 55: Product Price Management Application with PIM Integration

HOOFDSTUK 2. BESPREKING PRICE MANAGEMENT APPLICATION 44

Aanroepen in de page controller kan, na het toevoegen van de dependency 'channels', op devolgende manier:

Listing 2.9: Angular REST call example

$ scope . c h a n n e l C o l l e c t i o n=channe l s . que ry ({} ,{} ,

f u n c t i o n ( r e tu rnVa lue , r e spon s eHeade r s ) {// a c t i o n on s u c c e s s

} ,f u n c t i o n ( ht tpResponse ) {

c o nn e c t i o nE r r o r ( h t tpResponse . s t a t u s , ) ;} ) ;

UIDe basis van het UI is het thema SB Admin 2 (Bron: [1]), waarop een hele hoop wijzigingenen uitbreidingen zijn aangebracht. Het eindresultaat van het UI kan bij Resultaten oppagina61 teruggevonden worden. De technische uitdagingen aan dit user interface, waren deschaalbaarheid en plaatsing van alle elementen.De elementen zijn grotendeels gepositioneerd door het gebruik van de Bootstrap grid structuur,waarmee elke pagina duidelijk in schaalbare stukken opgedeeld kan worden. Verder is hetmogelijk om verschillende Bootstrap attributes toe te wijzen aan HTML tags, zodat zeafhankelijk van de schermgrootte optimaal gepositioneerd worden.

Figuur 2.15: Bootstrap grid structure, Bron:[6]

Page 56: Product Price Management Application with PIM Integration

HOOFDSTUK 2. BESPREKING PRICE MANAGEMENT APPLICATION 45

Verder zorgt het gebruik van AngularJS ervoor dat niet de volledige pagina geladen engepositioneerd moet worden, maar enkel het dynamische 'view'. Headers en menubalken blijvenhierdoor ongeschonden, vanaf de eerste pagina door de browser geladen is.

Figuur 2.16: Angular view structure

DatabindingNog een voordeel van AngularJS, is de mogelijkheid om op een makkelijke manier aandatabinding te doen: er hoeven enkel een paar attributes toegevoegd te worden aan de HTMLtags waarin men een bepaalde waarde wil weergeven. Verder zijn ook opties voor databindingvan collecties mogelijk. Hierbij zal AngularJS ervoor zorgen dat voor elk element in de collectiehet gewenste HTML object gecreeerd wordt door het gebruik van ng-repeat. Het spreekt voorzich dat hiervan veelvuldig gebruik gemaakt is in het project. De code op de volgende paginademonstreert hoe eenvoudig het is om met behulp van AngularJS een tabel te creeren voorx elementen met y properties. Het voorbeeld implementeert bovendien ook search & sortfunctionaliteit met behulp van de AngularJS plugin Smart Table. Hiervoor zijn de attributenst-table, st-sort en st-search aan de tabelstructuur toegevoegd.

Page 57: Product Price Management Application with PIM Integration

HOOFDSTUK 2. BESPREKING PRICE MANAGEMENT APPLICATION 46

Listing 2.10: Angular ng-repeat example

<t a b l e i d=” s u p p l i e r T a b l e ” st−t a b l e=” s u p p l i e r C o l l e c t i o n ”st−s a f e−s r c=” s e a r c h C o l l e c t i o n ” c l a s s=” t a b l e t ab l e−s t r i p e d ”>

<thead i d=” thd ”><t r>

<th st−s o r t=” ’ name ’ ” width=”40%”>Name</th><th st−s o r t=” ’ pu r cha s eD i s coun t ’ ” width=”15%”>

Purchase d i s coun t </th><th st−s o r t=” ’ s c a l eD i s c o u n t ’ ” width=”13%”>

Sca l e d i s coun t </th><th c l a s s=” sc r o l l Co l umn ”></th>

</t r><t r>

<th><i n pu t st−s e a r c h=” ’name ’ ”p l a c e h o l d e r=” s e a r ch s u p p l i e r name”c l a s s=” input−sm form−c o n t r o l ”type=” s e a r ch ”/></th>

<th><i n pu t st−s e a r c h=” ’ pu r cha s eD i s coun t ’ ”p l a c e h o l d e r=” s e a r ch pu rchase d i s c o un t ”c l a s s=” input−sm form−c o n t r o l ”type=” s e a r ch ” /></th>

<th><i n pu t st−s e a r c h=” ’ s c a l eD i s c o u n t ’ ”p l a c e h o l d e r=” s e a r ch s c a l e d i s c o un t ”c l a s s=” input−sm form−c o n t r o l ”type=” s e a r ch ” /></th>

</t r></thead><tbody i d=” tbdy ”>

<t r ng−r e p e a t=” s u p p l i e r i n s u p p l i e r C o l l e c t i o n ”i d=”{{ s u p p l i e r . i d }}”>

<td i d=”Name{{ s u p p l i e r . i d }}”>{{ s u p p l i e r . name}}</td><td i d=”PurchaseD i scount {{ s u p p l i e r . i d }}”>

{{ s u p p l i e r . pu r cha s eD i s coun t }}</td><td i d=” Sca l eD i s c oun t {{ s u p p l i e r . i d }}”>

{{ s u p p l i e r . s c a l eD i s c o u n t }}</td></t r>

</tbody></t ab l e>

Page 58: Product Price Management Application with PIM Integration

HOOFDSTUK 2. BESPREKING PRICE MANAGEMENT APPLICATION 47

2.6 User interface

2.6.1 Introductie

Het hoofddoel van de applicatie is om het prijsberekeningsproces te automatiseren, zodat doorhet gebruik van de applicatie tijd en denkwerk gespaard wordt.Om dit te bereiken is per takengroep een aparte pagina gemaakt, waar updates uitgevoerdkunnen worden. Tevens is er voor elk product ook een detail pagina, waarmee alle informatieover de prijsinformatie van een product overzichtelijk wordt weergegeven en aangepast. Vanuitelk resultaat op een takenpagina kan via een link naar de detailpagina van het desbetreffendeproduct genavigeerd worden.

Om op de specifieke pagina's het overzicht te bewaren zijn er een hele reeks zoekfilterstoegevoegd. Daarbuiten kan men nog eens specifiek elke tabel op kolom filteren en sorteren.Deze zoekfilters worden als URL parameters opgeslagen, zodat browser navigatie (back &forward knoppen) makkelijk gebruikt kan worden.

Waar nodig is mass update functionaliteit voorzien. Dit houdt in dat een gebruiker eenparameter van een selectie van producten (of alle producten) in een actie kan aanpassen. Nietalleen simpelweg overschrijven is mogelijk, maar ook wiskundige basisbewerkingen (+ en -).Verder is de applicatie voorzien van een gedetailleerd statusoverzicht, en een dashboard waaropveelvoorkomende acties en error management van de 20 meest relevante fouten uitgevoerdworden.

2.6.2 Design

Volgens deze bron [13], bezit een goed ontworpen UI een aantal kenmerken. Hieronder wordendeze kenmerken opgelijst, en wordt er kort toegelicht hoe rekening gehouden is met dezekenmerken in de applicatie:

� Clarity: alle tekst is in duidelijk, kort en bondig Engels geformuleerd. Er is geeningewikkelde woordenschat gebruikt, en waar nodig zijn popups toegevoegd om eenboodschap te verduidelijken.

� Concision: zoals hiervoor vermeld, is tekst zo kort mogelijk gehouden. Dit vermijdt dathet scherm er te 'vol' of 'warrig' gaat uitzien.

� Familiarity: bepaalde elementen zullen voor nieuwe gebruikers nog steeds vertrouwdaanvoelen. Dit is onder andere mogelijk door het gebruik van Bootstrap. De grid structuuren knoppen in dit framework worden alom toegepast, waardoor de nieuwe gebruikers zichautomatisch iets meer thuis gaan voelen in deze onbekende omgeving.

� Responsiveness: door het gebruik van de databinding van AngularJS zullen aangepastewaardes vrijwel meteen overal in het user interface aangepast worden. Verder is het

Page 59: Product Price Management Application with PIM Integration

HOOFDSTUK 2. BESPREKING PRICE MANAGEMENT APPLICATION 48

zo dat fouten relatief snel opgevangen worden, zodat geen onmenselijke wachttijden bijhet uitvoeren van bepaalde acties ontstaan. Bovendien worden langdurige taken alseen asynchrone job gepland door de backend, zodat de gebruiker hier geen hinder vanondervindt.

� Consistency: elke pagina heeft een specifiek takenpakket, dat overal op dezelfde maniergeımplementeerd wordt. Verder zijn user interface objecten op elke pagina op dezelfdemanier gestructureerd: knoppen staan indien mogelijk overal op dezelfde plaats, tabellenkomen op elke pagina terug,etc.

� Aesthetics: het uiterlijk van de applicatie is het eerste dat een potentiele nieuwe gebruikerte zien krijgt. Hoewel een mooie applicatie niet essentieel is om zijn bestemde takencorrect uit te voeren, is het wel aangenamer voor de gebruiker. In dit geval is voor ditaspect het Bootstrap thema SB Admin 2 [1] gebruikt, een thema speciaal ontworpen vooradministrator gerichte toepassingen zoals deze.

� Efficiency: het gebruik van asynchrone jobs voor grote taken en het tijdelijk opslaanvan wijzigingen op een pagina tot op de save button geklikt wordt, gecombineerd met devlotte databinding van AngularJS, zorgen ervoor dat de applicatie zeer efficient is. Eengebruiker kan eigenlijk enkel bij connectieproblemen merkbare hinder ondervinden bij hetuitvoeren van een actie.

� Forgiveness: bij het optreden van fouten zal altijd een duidelijke foutboodschap aan degebruiker overgebracht wordt door het gebruik van popup menu's. Met behulp van dezefoutboodschappen kan de gebruiker eventuele fouten relatief snel lokaliseren en oplossen.

Page 60: Product Price Management Application with PIM Integration

HOOFDSTUK 2. BESPREKING PRICE MANAGEMENT APPLICATION 49

2.7 Sequence diagram

Het onderstaande schema (figuur 2.17) visualiseert welke stappen uitgevoerd moeten wordenom een prijs te berekenen. Merk op dat er vanuit gegaan wordt dat er nog helemaal geen datain de applicatie aanwezig is bij de start van het schema.

Figuur 2.17: Sequence diagram

Page 61: Product Price Management Application with PIM Integration

HOOFDSTUK 2. BESPREKING PRICE MANAGEMENT APPLICATION 50

2.8 Business logic

Het hoofddoel van de applicatie blijft de mogelijkheid om prijzen te berekenen. Dit onderdeelvan de scriptie beschrijft de logica van deze prijsberekening, alsook de logica van het statusmanagementsysteem.

2.8.1 Price logic

Introductie

De perfecte verkoopsprijs berekenen is geen simpele opgave, vooral als deze afhangt vanmeerdere parameters en entiteiten die verschillende onderlinge relaties hebben. De onderlingerelaties zijn al eerder besproken in het ER diagram. De parameters uit dit diagram, die effectiefinvloed op de prijs hebben zijn hieronder grafisch weergegeven.

Figuur 2.18: Price influential parameters

Al deze parameters opsommen is uiteraard niet voldoende. Er zullen bewerkingen uitgevoerdmoeten worden om tot het correcte resultaat te komen.Om de berekening makkelijker en overzichtelijker te laten verlopen, is de prijscalculatie in eenaantal delen opgesplitst:

� Een vaste kost: deze is verder verdeeld in een productafhankelijke, transportafhankelijkeen verkoopkanaal afhankelijke kost;

Page 62: Product Price Management Application with PIM Integration

HOOFDSTUK 2. BESPREKING PRICE MANAGEMENT APPLICATION 51

� Winst;

� Een variabele kost: deze bestaat uit een aantal procentueel opgeslagen kosten;

� Bewerkingen na de prijsberekening: achteraf moeten een aantal controles en aanpasssin-gen gebeuren vooraleer de eindprijs bekomen wordt. Denk maar aan het afronden vaneen prijs etc.

Figuur 2.19: Basic price logic

Omdat de gebruiker grote flexibiliteit vereist van de applicatie (er zijn tenslotte een hele reeksoptionele en overschrijfbare velden), moet er per blok een hoop logica worden toegepast. Dezelogica is onmogelijk duidelijk in woorden te omschrijven, dus deze scriptie zal de verschillendekostenberekeningen verduidelijken aan de hand van een aantal schematische voorstellingen.

Page 63: Product Price Management Application with PIM Integration

HOOFDSTUK 2. BESPREKING PRICE MANAGEMENT APPLICATION 52

Vaste kosten

De fixed cost bestaat uit meerdere delen, die na berekening worden opgeteld om de totale vastekost te vormen.

Fixed product cost

Figuur 2.20: Fixed product cost logic

Fixed product cost = purchase price+ packaging cost+ handling cost

Fixed channel costDe fixed channel cost is relatief simpel wat een schematische voorstelling overbodig maakt:

Fixed channel cost = fixed channel commission+ fixed 3rd party channel commission

In de bovenstaande formule verstaan we onder 3rd party software: applicaties die gebruiktworden om prijzen automatisch aan te passen en/of te deployen naar een bepaald verkoopkanaal,en hiervoor een vaste commissie vragen.

Page 64: Product Price Management Application with PIM Integration

HOOFDSTUK 2. BESPREKING PRICE MANAGEMENT APPLICATION 53

Fixed transport cost

Figuur 2.21: Fixed product cost logic

Fixed transport cost = fixed region cost+ transport cost+ admin cost

Page 65: Product Price Management Application with PIM Integration

HOOFDSTUK 2. BESPREKING PRICE MANAGEMENT APPLICATION 54

Winst

Voor het berekenen van de winst zijn er eigenlijk twee marges die berekent moeten worden: eenminimum, -en een maximum winstbedrag. Onderstaande figuur (2.22) toont de logica voor hetbepalen van de minimumwaarde. Het maximum berekenen gebeurt uiteraard op gelijkaardigewijze.

Figuur 2.22: Minimum profit calculation logic

Page 66: Product Price Management Application with PIM Integration

HOOFDSTUK 2. BESPREKING PRICE MANAGEMENT APPLICATION 55

Variabele kosten

Na het optellen van de vooraf bepaalde kosten, kunnen de variabele kosten voor dit bedragbepaald worden. Op dit moment worden ook de minimum- en maximumprijs bepaald. Ditgebeurt via de onderstaande formules:

Minimum price = (fixed cost+ fork minimum) ∗ (1/1−((sales channel commission%+ 3rd party commission%+ region extra cost%+

payment commission%)/100)) ∗ (1 + (BTW/100))

Maximum price = (fixed cost+ fork maximum) ∗ (1/1−((sales channel commission%+ 3rd party commission%+ region extra cost%+

payment commission%)/100)) ∗ (1 + (BTW/100))

Bewerkingen na de prijsberekening

De berekende optimale prijs is niet altijd de prijs waaraan men wil verkopen. Voor de verkoopgebruikt men liever afgeronde waarde, zoals bv .95. Ook moet rekening gehouden worden dater voor sommige producten een minimale prijs (listing price) is, waaronder niet verkocht magworden van bepaalde leveranciers. Door de volgende logica toe te passen komt men op de finaleverkoopsprijs.Merk op dat men verder rekent met het minimum. Dit is omdat de veronderstelling gemaaktwordt, dat de ideale verkoopprijs zich rond het minimum bevindt aangezien de concurrentie bijonline verkoop zo talrijk is.

Figuur 2.23: Final price

Page 67: Product Price Management Application with PIM Integration

HOOFDSTUK 2. BESPREKING PRICE MANAGEMENT APPLICATION 56

2.8.2 Status logic

Het nut van status management in een beheertool is al meermaals in deze scriptie aangehaald:het zorgt er enerzijds voor dat problemen en waarschuwingen duidelijk weergegeven worden, enanderzijds stelt het de gebruiker gerust wanneer geen fouten bij een actie optreden.Status management is dus een overzichtelijke en uitgebreide manier om ten allen tijde feedbackaan een gebruiker te bieden.

Gebruikte statussen

Price statusIn de applicatie zijn er verschillende veranderlijke parameters die invloed hebben op deprijsberekening. Als een van deze parameters wordt aangepast nadat er al een prijs berekendis, wil dit dus zeggen dat de berekende prijs niet meer up-to-date is. Indien dit voorvalt, wordtde volgende beschreven status (calculation status) gewijzigd.Om een gebruiker meer inzicht te geven in hoe zijn veranderingen de prijzen beınvloeden, zijn ereen reeks extra, meer gedetaileerde statussen toegevoegd, die per gedesynchroniseerd productweergeven door welke wijzigingen de prijs niet meer up-to-date is. Deze toegevoegde statussenzijn:

� Product;

� Packaging;

� Price overwrite;

� Channel;

� Transport;

� Supplier.

Het spreekt voor zich dat aanpassingen die geen invloed hebben op de prijsberekening(bijvoorbeeld een verandering van de naam van een sales channel), uiteraard niet voor eenstatuswijziging zullen zorgen.Dit is geımplementeerd door, bij het uitvoeren van elke mogelijke CRUD actie, de veranderingeneerst langs een status management functie te sturen.Op de volgende pagina bevindt zich een codevoorbeeld van de status management methodedie aangeroepen wordt bij het updaten van verpakkingen:

Page 68: Product Price Management Application with PIM Integration

HOOFDSTUK 2. BESPREKING PRICE MANAGEMENT APPLICATION 57

Listing 2.11: Packaging status calculation code

@Tran sa c t i ona lp u b l i c void updateSta tu sPackag ing ( L i s t<Packaging> packag ing ) {

L i s t<I n t e g e r> p a c k a g i n g I d L i s t=new Ar r a yL i s t<I n t e g e r >() ;L i s t<I n t e g e r> pa c kag i n g I dL i s t S t a t u sUpda t e=new Ar r a yL i s t<I n t e g e r >() ;// get a l l packag ing tha t i s be i ng updatedf o r ( Packag ing pack : packag ing ) {

p a c k a g i n g I d L i s t . add ( pack . g e t I d ( ) ) ;}TypedQuery<Packaging> query1 =

em . c r ea t eQue ry ( ”SELECT pack FROM Packag ing packWHERE pack . i d IN : packag ing s ” , Packag ing . c l a s s ) ;

query1 . s e tPa ramete r ( ” packag ing s ” , p a c k a g i n g I d L i s t ) ;// check i f packag ing update i n f l u e n c e s p r i c ef o r ( Packag ing packNew : packag ing ) {

f o r ( Packag ing packOld : query1 . g e t R e s u l t L i s t ( ) ) {i f ( packOld . g e t I d ()==packNew . g e t I d ( ) ){

i f ( ! packOld . g e tP r i c e ( ) . e qu a l s ( packNew . g e tP r i c e ( ) ) ) {pa c kag i n g I dL i s t S t a t u sUpda t e . add ( packNew . g e t I d ( ) ) ;

}}

}}// update packag ing s t a t u s f o r a l l p r i c e s a f f e c t e d by the packag ing updatei f ( p a c k ag i n g I dL i s t S t a t u sUpda t e . s i z e ()>0){

TypedQuery<P r i c eCa l c u l a t e d> query =em . c r ea t eQue ry ( ”SELECT pc FROM Pr i c e prINNER JOIN pr . p r i c e C a l c u l a t e d pc INNER JOIN pr . p roduc t pINNER JOIN p . packag ing s pack WHERE pack . i d IN : packag ing sAND EXISTS(SELECT pack FROM p . packag ing s pack ) ” ,P r i c eC a l c u l a t e d . c l a s s ) ;

que ry . s e tPa ramete r ( ” packag ing s ” , p a c k ag i n g I dL i s t S t a t u sUpda t e ) ;f o r ( P r i c e C a l c u l a t e d p r i c eC : query . g e t R e s u l t L i s t ( ) ) {

p r i c eC . s e tS t a t u sPackag i ng ( f a l s e ) ;p r i c eC . s e t S t a t u s P r i c e ( f a l s e ) ;em . p e r s i s t ( p r i c eC ) ;

}em . f l u s h ( ) ;

}}

In de bovenstaande code gebeuren dus 4 dingen:

1. Ophalen van verpakkingen die gewijzigd zijn;

2. Voor elke verpakking controleren of een wijziging de prijs van de verpakking beınvloedt;

3. Alle producten met een gewijzigde verpakkingsprijs ophalen;

4. Voor elk product de status 'Packaging' op false zetten.

Page 69: Product Price Management Application with PIM Integration

HOOFDSTUK 2. BESPREKING PRICE MANAGEMENT APPLICATION 58

Calculation statusZoals bij de bespreking van de price status op pagina 50 reeds vermeld is, zal bij een prijsdesynchronisatie de calculation status van de desbetreffende prijs op 'Changed' gezet worden.Andere mogelijke waarden voor deze status zijn:

� Draft: deze status geeft aan dat er nog geen prijs berekend is;

� Calculating: deze status wordt gegeven aan alle prijzen die (her)berekend worden, zodatde gebruiker bij lange wachttijden of trage connectie kan zien welke prijzen nog aan hetberekenen zijn (of berekend, maar nog niet teruggezonden zijn). Ook bij serverpannetijdens het uitvoeren van de calculatiejob, zal de status op 'Calculating' blijven staan,zodat de calculatie hervat kan worden wanneer de server opnieuw opgestart is;

� Calculated: geeft weer dat de prijs correct berekend, en up-to-date is;

� Error: Dit treed op als er een fout optreedt tijdens het berekenen van een prijs. Er zijnmeerdere foutboodschappen mogelijk, waarvan de meeste te maken hebben met het feitdat er te weinig data aanwezig is om de berekening correct uit te voeren.

Send statusDeze status is relatief eenvoudig en kan de volgende waardes verkrijgen:

� Draft: de prijs is nog nooit verzonden;

� Changed: als er een prijs verandert, geeft deze status aan dat de prijs opnieuw verstuurddient te worden;

� Sending: Alle prijzen die verzonden dienen te worden krijgen deze status. Dit heeft, netals de calculation status 'Calculating', als voordeel dat de gebruiker beter zicht heeft opwat er intern gebeurt, en zorgt er bovendien voor dat eventuele niet-verstuurde prijzenna een systeemcrash opnieuw verzonden kunnen worden;

� Sent: de prijs is succesvol verzonden;

� Error code: deze error code komt overeen met de error die Hybris terugstuurt als eenbepaalde prijs niet verzonden kan worden. Momenteel zijn de mogelijke error codes:

– 404: ofwel kan het product, ofwel het verkoopkanaal van de prijs niet gevondenworden in het PIM systeem;

– 500: internal server error. Hoe de error in deze situatie kan optreden valt buitenhet bestek van deze scriptie.

Page 70: Product Price Management Application with PIM Integration

HOOFDSTUK 2. BESPREKING PRICE MANAGEMENT APPLICATION 59

Status overview

Figuur 2.24 toont de verschillende mogelijke statussen die een prijs kan verkrijgen, nadatbepaalde acties uitgevoerd zijn.

Figuur 2.24: Status overview scheme

Page 71: Product Price Management Application with PIM Integration

HOOFDSTUK 2. BESPREKING PRICE MANAGEMENT APPLICATION 60

2.9 Testing

Omdat de applicatie optimale verkoopsprijzen moet gaan bereken is er op dit vlak geen plaatsvoor foutmarges. Tijdens de development fase is er dus veel aandacht besteed aan de controlevan de berekeningsmethode. Dit hebben we bereikt door de klant vroeg in het proces tebetrekken. De prijsberekeningsformule is aan de hand van overleggen in samenspraak met deklant ontwikkeld en doorheen het ontwikkelingsproces verder geevolueerd. Er is in de loop vanhet project aan verschillende vormen van testing gedaan:

� Unit testing: er zijn enkele basis unit tests geschreven, die CRUD acties kunnen testen.In de toekomst zullen er voor de prijsberekeningsmethode en het status managementongetwijfeld ook nog een aantal unit tests geschreven worden.

� User acceptance testing: zoals in de inleiding van het onderdeel ?? al vermeld werd, isde klant vanaf het begin van het ontwikkelingsproces bij het project betrokken. Vanaf ereen stuk functionaliteit af was, heeft de klant deze kunnen uitproberen in de testomgeving,en eventuele bugs of verbeteringen doorgegeven.

� Operational testing: er is getracht zoveel mogelijk fouten op te vangen en vervolgensgetest of al deze fouten de correcte feedback aan de gebruiker doorgeven. Verdereoperational testing zal zeker gebeuren vooraleer de applicatie in productie genomen wordt.

� Functional/manual testing: zoals altijd tijdens de ontwikkeling van software, is elkstuk code/functionaliteit uitvoerig getest vooraleer dit definitief geımplementeerd werd.

Page 72: Product Price Management Application with PIM Integration

Hoofdstuk3Resultaten

3.1 Doelstellingen

Zoals vermeld in het Doel op pagina 3, was de bedoeling om voor het PIM systeemeen prijsberekeningsmodule te ontwikkelen die automatisch de beste prijs per product perverkoopkanaal berekent, aan de hand van een aantal parameters.

De applicatie zou moeten zorgen voor een sterke centralisatie van prijsdata en een automatisatievan prijsdataverwerking, met verschillende grote voordelen als gevolg:

� Significante verlaging van de kans op fouten;

� Duidelijk overzicht van relevante informatie;

� Tijdsbesparing.

Verder waren er een hele hoop Vereisten besproken (vanaf pagina 3), waaraan de applicatiemoest voldoen.

61

Page 73: Product Price Management Application with PIM Integration

HOOFDSTUK 3. RESULTATEN 62

3.2 Resultaten

Vermits de eerste ontwikkelingsfase net afgelopen is, is het nog niet mogelijk om met zekerheidte zeggen dat de kans op fouten bij het beheer van verkoopprijzen lager is dan voordien.Ook of er een tijdsbesparing is, kan nog niet getest worden aangezien de gebruiker nog in degewenningsfase van de software zit. Wel geeft de applicatie al zeker een duidelijk overzicht vanrelevante informatie.Verder voldoet de applicatie aan alle voorgenoemde Vereisten, dus we kunnen besluiten dat dedoelstellingen gehaald zijn.

Het resultaat van het ontwikkelingsproces dat besproken is in deze scriptie, is een volledigfunctionele web applicatie die producten kan ophalen, productinformatie kan verrijken, prijzenkan berekenen en deze prijzen tenslotte kan terugzenden naar het PIM systeem.

Vanaf de volgende pagina wordt per webpagina alle mogelijke functionaliteit kort uitgelegd.

Page 74: Product Price Management Application with PIM Integration

HOOFDSTUK 3. RESULTATEN 63

3.2.1 Login

Vooraleer de applicatie gebruikt kan worden, dient ingelogd te worden op de login pagina. Ditgebeurt door op de 'Login ' knop te klikken na het invoeren van de onderstaande gegevens:

� Username: admin

� Password: pricing

Figuur 3.1: Login screen

Wanneer de login gegevens succesvol ingevoerd zijn, zal de gebruiker worden doorverwezen naarde homepage van de applicatie, het Dashboard.

Page 75: Product Price Management Application with PIM Integration

HOOFDSTUK 3. RESULTATEN 64

3.2.2 Navigatie

Om van de ene naar de andere pagina in de applicatie te verplaatsen, kan zowel hetnavigatiemenu, als de compactere navigatiebalk gebruikt worden.

Navigatiemenu

Standaard weergave

Het menu bevindt zich voor grotere schermen, zoals computers en laptops, aan de linkerzijdevan de pagina. Met een klik op de pijl bovenaan in het menu, kan de menubalk ingeklaptworden, zodat meer informatie op het scherm getoond kan worden. Dit is vooral handig oppagina's zoals Price, waar soms ontzettend grote tabellen weergegeven moeten worden.

Figuur 3.2: Navigatiemenu in open en gesloten toestand

Hierboven is het menu weergegeven in geopende en ingeklapte toestand. Merk op dat depagina die momenteel geopend is, altijd iets donkerder weergegeven wordt in het menu. Op delinkerfoto bovenaan, is duidelijk zichtbaar dat de dashboard pagina geopend is.

Page 76: Product Price Management Application with PIM Integration

HOOFDSTUK 3. RESULTATEN 65

Compacte weergave

Voor kleinere tablets en smartphones, bevindt het menu zich in de balk bovenaan. Openen ensluiten van het menu gebeurt door op de knop in de rechterbovenhoek te drukken.

Figuur 3.3: Compact screen navigation menu

Navigatiebalk

Onder de titel van elke pagina is een compacte navigatiebalk te vinden, die weergeeft waar inhet menu de gebruiker zich bevindt.

Figuur 3.4: Navigation bar

Page 77: Product Price Management Application with PIM Integration

HOOFDSTUK 3. RESULTATEN 66

3.2.3 Algemene functionaliteit

Doorheen de applicatie is er een hele hoop functionaliteit die meermaals terugkomt. Zo zal erbijna overal een 'Save changes' knop te vinden zijn, en zal elke pagina een of meerdere tabellenweergeven.

Wijzigingen opslaan

In de linkeronderhoek van bijna elke pagina is een 'Save changes' knop te vinden. Alle wijzigingendie op deze pagina uitgevoerd zijn, worden pas definitief opgeslagen wanneer op deze knopgeklikt wordt.

Figuur 3.5: Save changes button

Na het selecteren van de knop, zal vervolgens een confirmatie popup tevoorschijn komen, zoalsop het onderstaande voorbeeld. Indien de gebruiker beslist om de veranderingen definitief opte slaan, dient 'OK' geselecteerd te worden. Het selecteren van de 'Cancel' knop, zal zorgendat de gebruiker terug op de originele pagina terecht komt en eventuele verdere aanpassingenkan doen, alvorens hij deze opslaat.

Figuur 3.6: Save confirmation popup

Opmerking: indien de gebruiker besluit om wijzigingen niet op te slaan, is het voldoende omhet browservenster te herladen.

Page 78: Product Price Management Application with PIM Integration

HOOFDSTUK 3. RESULTATEN 67

Exporteren naar Excel

De 'Export' knop kan op elke pagina(uitgezonderd Product Details) in de rechterbenedenhoekteruggevonden worden. Deze knop zorgt ervoor dat resultaten opgeslagen kunnen worden alseen Excel tabel.

Figuur 3.7: Export to Excel button

Link naar details pagina

In alle tabellen die producten of productprijzen weergeven, is uiterst rechts een kolom 'Info'voorzien. Deze kolom bevat per rij een knop, waarmee makkelijk naar de detailpagina van hetproduct genavigeerd kan worden.

Figuur 3.8: Details button

Page 79: Product Price Management Application with PIM Integration

HOOFDSTUK 3. RESULTATEN 68

3.2.4 Zoekfilters

Elke pagina heeft verschillende manieren om naar bepaalde informatie te zoeken.

Zoekfilters bovenaan de pagina

Op een aantal pagina's kan bovenaan een aantal zoekvelden ingevuld worden, vooraleerresultaten weergegeven worden. Na het invullen van de gewenste zoekcriteria, gevolgd door eendruk op de 'Search' knop, zullen alle resultaten onder het zoekvenster in tabelvorm weergegevenworden. Deze tabel kan bovendien ook nog verder gefilterd worden (zie Zoekfunctionaliteit intabellen). Verder is er de optie om deze zoekfilter in te klappen door een klik op het icoon linksnaast 'Search filters'.

Figuur 3.9: Search filters

Opmerking: indien de gebruiker alles wil tonen zonder het gebruik van de zoekfilter, selecteerthij bij 'General' het bolletje links naast 'SKU' vooraleer op de 'Search' knop te klikken.

Page 80: Product Price Management Application with PIM Integration

HOOFDSTUK 3. RESULTATEN 69

Zoekfunctionaliteit in tabellen

In alle tabellen (uitgezonderd Product Details), is er de mogelijkheid om te sorteren opkolomnaam, of te zoeken naar een bepaalde waarde in een kolom. Door een waarde in te vullenin de 'search..' velden, kan gezocht worden naar deze waarde. Sorteren gebeurt door te klikkenop de vetgedrukte titel van een kolom, zodat een driehoekig pijltje naast de titel verschijnt. Alsdit pijltje naar boven wijst, zal de tabel alfabetisch gerangschikt worden van A-Z volgens naam.Indien nogmaals op dit pijltje geklikt wordt, zal de tabel omgekeerd worden, zodat van Z naarA gesorteerd wordt. Het onderstaande voorbeeld demonstreert deze functionaliteit: de tabelis in dit geval alfabetisch gesorteerd op 'Name', en verder is er gefilterd naar rijen waarvan dewaarde in kolom 'Purchase discount %' begint met het getal 3.

Figuur 3.10: Search & sort tables

Page 81: Product Price Management Application with PIM Integration

HOOFDSTUK 3. RESULTATEN 70

3.2.5 Dashboard

Het dashboard is een overzichtspagina, die standaard geopend wordt nadat de gebruiker ingelogdis. Op deze pagina zijn een aantal belangrijke functies mogelijk, die hier uitgelegd worden.

Error overview

De tabel die weergegeven wordt op deze pagina, bevat een lijst van producten waarvan deprijzen fouten bevatten. Om prestatieredenen zullen hier maximaal 20 producten per keergetoond worden. Zoals te zien op het onderstaande screenshot, zijn in dit error overzicht eenaantal verschillende statussen te vinden:

� Channels linked: geeft weer of een product al gebonden is aan verkoopkanalen. Indiendit niet het geval is, zullen er ook nog geen prijzen voor het product beschikbaar zijn.

� Price status: geeft weer of een van de prijzen van een bepaald product niet meer up-to-date is. Deze status is een combinatie van verschillende statussen die op de statuspaginate vinden zijn, namelijk:

– Product;

– Packaging;

– Price overwrite;

– Sales channel;

– Transport;

– Supplier.

� Calc status: geeft de berekeningsstatus van de prijzen van het product weer. Indien eenvan de prijzen herberekend wordt/moet worden, of nog nooit berekend is, zal ook dezestatus een waarschuwing tonen.

� Sync status: geeft weer of de prijzen van het product naar Hybris doorgestuurd zijn.Ook hier zal een waarschuwing getoond worden wanneer de laatst berekende prijs nogniet doorgestuurd is.

Page 82: Product Price Management Application with PIM Integration

HOOFDSTUK 3. RESULTATEN 71

Figuur 3.11: Dashboard error overview

Extra: ook de statuskolommen kunnen hier gefilterd worden. Dit gebeurt door het ingevenvan de letter 't' (true) voor statussen zonder problemen, of het invoeren van de letter 'f' (false)voor het weergeven van statussen met problemen.

Overige functionaliteit

Onder het error overview kunnen een aantal knoppen teruggevonden worden:

� Calculate all: wanneer deze knop ingedrukt wordt, zal een taak gestart worden waarinalle verouderde/onberekende prijzen in het systeem (her)berekend worden. Denk eraandat deze taak lang kan duren, zeker indien er een groot aantal prijzen met fouten in hetsysteem zitten. Als alternatief is er de optie om op de Calculation & Status pagina eenaantal prijzen te selecteren die herberekend moeten worden.

� Get new products: deze knop zal controleren of er nieuwe/gewijzigde producten inhet Hybris PIM systeem zijn. Merk op dat deze taak automatisch elk uur uitgevoerd zalworden, en het meestal dus overbodig is om deze knop te gebruiken.

� Send prices: knop om nieuwe en/of herberekende prijzen door te sturen naar het Hybrishoofdsysteem. Ook deze taak wordt elk uur automatisch uitgevoerd, wat het gebruik vande knop in de meeste gevallen niet noodzakelijk maakt.

� Export: zie Exporteren naar Excel

Figuur 3.12: Dashboard buttons

Page 83: Product Price Management Application with PIM Integration

HOOFDSTUK 3. RESULTATEN 72

3.2.6 Product

Dit is geen op zich bestaande pagina, maar een deel van het menu dat verder onderverdeeld isvoor het gemak van de gebruiker.

Search

Deze pagina bestaat uit een aantal zoekfilters (zie Zoekfilters), gevolgd door een tabel diebasisinformatie over het product weergeeft. Het nut van deze pagina is om makkelijk en vloteen bepaald product te kunnen vinden, om vervolgens de productdetails te kunnen bekijken,door op de details knop (zie pagina 67)te klikken.

Figuur 3.13: Product search page

Page 84: Product Price Management Application with PIM Integration

HOOFDSTUK 3. RESULTATEN 73

Select sales channels

Deze pagina wordt gebruikt om, na het toevoegen van nieuwe producten, de gewensteverkoopkanalen te selecteren. Voor al deze verkoopkanalen zal vervolgens een rij in deprijstabellen voorzien worden.Deze pagina bevat bovenaan ook weer een aantal velden waarop de productenlijst gefilterd kanworden. Zo wordt het bijvoorbeeld heel makkelijk om enkel de meest recente producten weerte geven door het gebruik van de datum filter.In de resultatentabel is het niet nodig om per product per verkoopkanaal het vakje aan te vinken.Indien een verkoopkanaal voor alle producten gebruikt zal worden, kan gewoon de select all knopbovenaan gebruikt worden, waardoor alle vakjes in de kolom van het verkoopkanaal automatischaangevinkt zullen zijn.

Figuur 3.14: Select sales channels page

Na het selecteren van de gewenste sales channels, moeten de wijzigingen uiteraard bevestigdworden met de 'Save changes' knop. Verder is ook hier functionaliteit om de informatie uit detabel te exporteren naar Excel.

Page 85: Product Price Management Application with PIM Integration

HOOFDSTUK 3. RESULTATEN 74

Price

Deze pagina wordt gebruikt om prijs gerelateerde parameters op productniveau in te stellen.Omdat er zo'n uitgebreide hoeveelheid informatie op deze pagina weergegeven kan worden, is eenbijkomende filter toegevoegd waarmee geselecteerd kan worden welke kolommen weergegevenmoeten worden op het scherm. Deze filter is te vinden in de rechterbovenhoek van hetresultatenscherm.

Figuur 3.15: Column select functionality

In de Price pagina kan behalve een aantal waardes ook de verpakking(en) van een productgeselecteerd worden. Dit gebeurt door een druk op de Packaging knop (zie onderstaandefiguur) van het desbetreffende product.

Figuur 3.16: Packaging button

Vervolgens zal een popup menu geopend worden, waarin een aantal knoppen te vinden zijn:

� Add packaging: hiermee kan een verpakking aan het product toegevoegd worden.Vervolgens wordt op de naam van de toegevoegde verpakking geklikt en de gewensteverpakking geselecteerd.

� Done: selecteer deze knop indien de toegevoegde verpakking(en) later opgeslagenmoeten kunnen worden.

� Cancel: selecteer deze knop indien de wijzigingen aan de productverpakking later nietopgeslagen moeten worden (bv. bij fouten).

Page 86: Product Price Management Application with PIM Integration

HOOFDSTUK 3. RESULTATEN 75

Figuur 3.17: Packaging menu

Opmerking: na het toevoegen van verpakkingen en het selecteren van 'Done' knop, moetnog steeds onderaan de pagina op 'Save changes' geklikt worden om de nieuwe/gewijzigdeverpakking definitief op te slaan!

Page 87: Product Price Management Application with PIM Integration

HOOFDSTUK 3. RESULTATEN 76

Price overwrites

Deze pagina wordt gebruikt om prijs gerelateerde parameters op product-verkoopkanaal niveauin te stellen (voor een product dat verkocht wordt op x kanalen, zullen hier dus x resultatengetoond worden). Na het toepassen van de gewoonlijke zoekfilters, verkrijgt men eengelijkaardig resultaat als de onderstaande figuur.

Figuur 3.18: Price overwrite page

De niet aanpasbare getallen in de tabel stellen de winsten en listing price op productniveauvoor. In de input velden kan dan per verkoopkanaal een 'overwrite' waarde ingesteld worden.Deze overwrites zijn bijvoorbeeld nuttig wanneer een gebruiker op een bepaald verkoopkanaalveel meer concurrentie heeft, en dus beter iets minder winst maakt dan normaal om daardoortoch meer te verkopen dan de concurrentie.Met het 'ignore' vakje kan een vooropgelegde listing price van de leverancier op een bepaaldverkoopkanaal genegeerd worden.

Page 88: Product Price Management Application with PIM Integration

HOOFDSTUK 3. RESULTATEN 77

Transport

Op deze pagina kunnen alle bestemming afhankelijke parameters van een bepaald productaangepast worden. Merk op dat enkel de bestemmingen van een product getoond worden,die als 'main region' gebruikt zijn voor de geselecteerde verkoopkanalen (zie Sales channels).Verdere informatie bij deze pagina is overbodig, vermits alle andere functionaliteit al uitgelegdis in het onderdeel Algemene functionaliteit.

Figuur 3.19: Product transport page

Page 89: Product Price Management Application with PIM Integration

HOOFDSTUK 3. RESULTATEN 78

Calculation & Status

Deze pagina toont alle statussen (behalve de 'Channels linked' status, vermits de prijs op ditogenblik al bestaat en deze status dus altijd in orde zou zijn) en de berekende prijzen van degewenste producten, alsook de laatste prijsberekeningsdatum. Deze statussen zijn:

� Calc status: geeft de berekeningsstatus van de prijzen weer. Indien een prijs herberekendwordt/moet worden, of nog nooit berekend is, zal deze status een waarschuwing tonen.

� Sync status: geeft weer of de prijzen naar Hybris doorgestuurd zijn. Ook hier zal eenwaarschuwing getoond worden wanneer de laatst berekende prijs nog niet doorgestuurdis.

� Product: geeft weer of de productgerelateerde prijsparameters (bv. aankoopprijs,BTW,...) up-to-date zijn t.o.v. de laatste prijsberekening.

� Packaging: geeft weer of de geselecteerde verpakkingen up-to-date zijn in de laatsteprijsberekening t.o.v. de laatste prijsberekening.

� Price OW: geeft weer of de price overwrite waarden, met andere woorden de product-verkoopkanaal afhankelijke parameters, up-to-date zijn t.o.v. de laatste prijsberekening

� Channel: geeft weer of de verkoopkanaal gebonden kosten up-to-date t.o.v. de laatsteprijsberekening.

� Transport: geeft weer of de transportkosten up-to-date zijn t.o.v. de laatsteprijsberekening

� Supplier: geeft weer of de kosten en/of kortingen van de leverancier up-to-date zijnt.o.v. de laatste prijsberekening.

Figuur 3.20: Calculation & Status page

Page 90: Product Price Management Application with PIM Integration

HOOFDSTUK 3. RESULTATEN 79

Ook hier zijn de statuskolommen sorteer-en filterbaar. Alle statussen, met uitzonderingvan 'Calc' en 'Sync' status, kunnen gevonden worden door de letters 't' (true, toont decorrecte statussen) of 'f' (false, toont de error statussen). Voor de 'Calc' status zijn dezoekmogelijkheden als volgt:

� Status OK: Calculated

� Momenteel de prijs aan het berekenen: Calculating

� Error:

– Missing data;

– No colli;

– No freight;

– No transport

Voor 'Sync' zijn er deze keywords:

� Draft;

� Sending;

� Sent;

� Changed;

� Error.

Opmerking: bij de 'Sync' en 'Calc' statuskolommen is het mogelijk om de huidigestatusboodschap te tonen door met de muis over het status icoon te hoveren. Dit kan handigzijn om specifiekere informatie over een error te verkrijgen.

Figuur 3.21: Status info on mouse hover

Verder is er op deze pagina nog een knop te vinden die meer informatie over de uitgevoerdeprijsberekening weergeeft (zie figuur 3.22).

Figuur 3.22: Price calculation information button

Page 91: Product Price Management Application with PIM Integration

HOOFDSTUK 3. RESULTATEN 80

Een druk op deze knop opent het onderstaand menu.

Figuur 3.23: Price calculation information menu

Page 92: Product Price Management Application with PIM Integration

HOOFDSTUK 3. RESULTATEN 81

Product Details

Deze pagina is de meest uitgebreide pagina in de hele applicatie. Per product kanalle prijsgerelateerde informatie hier teruggevonden en aangepast worden. Deze pagina isproductafhankelijk, en kan alleen geopend worden door in een resultatentabel op de Link naardetails pagina knop te klikken. Er is op deze pagina dus ook geen zoekfunctionaliteit voorzien,vermits alle data al productspecifiek is. Wel is de pagina ingedeeld in verschillende inklapbarevensters, die allemaal een deel van de producteigenschappen bevatten. Zo zijn er venstersgemaakt voor:

� Algemene informatie;

� Algemene prijsinformatie;

� Verkoopkanaal specifieke prijsinformatie;

� Status informatie;

� Productcreatie informatie.

Opmerking: al deze informatie kan uiteraard ook in de reeds besproken pagina's geselecteerdworden. De detailpagina dient louter om een gedetailleerd overzicht van prijsinformatie overeen product weer te geven, zodat eventuele fouten of ongekende informatie makkelijk gevondenen verbeterd kunnen worden.

Algemene informatie

Dit venster toont enerzijds de informatie afkomstig uit Hybris (naam, SKU nummer, merk,gewicht en afmetingen), en anderzijds enkele producteigenschappen die in de Price Manage-ment Application geselecteerd moeten/kunnen worden (leverancier en transportmethode zijnverplicht, geschat gewicht en verpakking is optioneel).

Figuur 3.24: General information from product details page

Page 93: Product Price Management Application with PIM Integration

HOOFDSTUK 3. RESULTATEN 82

Algemene prijsinformatie

In dit venster wordt productspecifieke prijsinformatie ingesteld. Aan de linkerzijde worden alleprijzen en kosten weergegeven, en aan de rechterzijde de winsten. Merk op dat packaging costeen niet aanpasbaar veld is, vermits deze afhangt van de prijs van de geselecteerde verpakkingen.Om dit te omzeilen is er een packaging cost overwrite veld voorzien.

Figuur 3.25: General price information from product details page

Verkoopkanaal specifieke prijsinformatie

Dit onderdeel bevat alle verkoopkanaal specifieke parameters van de prijsbepaling, met anderewoorden de 'price overwrite' parameters. Ook de selectie van de verkoopkanalen waarvoor eenprijs berekend moet worden gebeurt hier. Verder worden rechts de minimum-, maximum- enfinale prijs weergegeven.

Figuur 3.26: Price overwrite information from product details page

Page 94: Product Price Management Application with PIM Integration

HOOFDSTUK 3. RESULTATEN 83

Status informatie

Dit venster bevat een tabel, gelijkaardig aan de tabel op de reeds besproken Calculation &Status pagina. Verder zijn hier 2 knoppen te vinden: een knop voor het (her)berekenen vangeselecteerde prijzen, en een knop voor het verzenden van een selectie prijzen naar het PIMsysteem. Deze functionaliteit is ook reeds besproken in de voorgenoemde Calculation & Statuspagina.

Figuur 3.27: Status information from product details page

Productcreatie informatie

Dit venster toont enerzijds de informatie afkomstig uit Hybris (naam, SKU nummer, merk,gewicht en afmetingen), en anderzijds enkele producteigenschappen die in de Price Manage-ment Application geselecteerd moeten/kunnen worden (leverancier en transportmethode zijnverplicht, geschat gewicht en verpakking is optioneel).

Figuur 3.28: Creation information from product details page

Page 95: Product Price Management Application with PIM Integration

HOOFDSTUK 3. RESULTATEN 84

Add a product

Op deze pagina kunnen eventueel nieuwe producten aan de Price Management Applicationtoegevoegd worden. Dit zou echter enkel voor testredenen mogen gebeuren, vermits dezeproducten niet in Hybris aanwezig zijn, en het terugsturen van hun berekende prijzengegarandeerd fouten zal veroorzaken.Deze pagina is dus nuttig om snel een prijs voor een fictief product te kunnen berekenen, maarniet aan te bevelen voor regelmatig gebruik.

Figuur 3.29: Add product page

Page 96: Product Price Management Application with PIM Integration

HOOFDSTUK 3. RESULTATEN 85

3.2.7 Sales channels

Op deze pagina kunnen verkoopkanalen toegevoegd, gewijzigd of verwijderd worden.

Aanmaken van een verkoopkanaal

Toevoegen van een verkoopkanaal gebeurt op de volgende manier:

1. Druk op de knop 'Add channel'

2. Bovenaan de tabel zal een nieuwe rij verschijnen

3. Door op een veld in de rij te klikken, zal de waarde aangepast kunnen worden zoals opde onderstaande foto.

Figuur 3.30: Editable table field

4. Vervolgens kan stap 3 herhaald worden voor elk veld in de rij tot aan de 'Zones' kolom.Opmerking: het veld 'Currency' is optioneel, vermits alle eindprijzen in euro weergegevenworden.

5. Indien gewenst kunnen een aantal delivery zones toegevoegd worden aan het verkoop-kanaal door een druk op de zone knop (zie onderstaande figuur). Vervolgens zal hetonderstaand menu geopend worden. Zones toevoegen gebeurt op dezelfde manier als hettoevoegen van verpakkingen op de Price pagina.

Figuur 3.31: Zone button

Opmerking: Deze stap is optioneel, en heeft op geen enkele manier invloed op deprijsberekening.

6. Na het instellen van alle gewenste waardes dient een 'Main region' geselecteerd te worden.Deze regio kan eigenlijk geınterpreteerd worden als de regio van levering. Wanneer vanuitBelgie verstuurd wordt voor een verkoopkanaal dat levert in Belgie en Nederland, is hetbijvoorbeeld het veiligst om Nederland te selecteren, vermits zo de hoogst mogelijketransportkosten in de prijscalculatie verwerkt zijn.

7. Selecteer de 'Save changes' knop en klik vervolgens op 'OK'.

Page 97: Product Price Management Application with PIM Integration

HOOFDSTUK 3. RESULTATEN 86

Wijzigen van een verkoopkanaal

Indien een bestaand verkoopkanaal gewijzigd dient te worden, dienen de stappen voor hetAanmaken van een verkoopkanaal vanaf stap 3 herhaald te worden.

Verwijderen van een verkoopkanaal

Een verkoopkanaal kan simpelweg verwijderd worden door op de onderstaande knop te drukken.

Figuur 3.32: Delete button

Indien het verkoopkanaal dan niet verwijderd wordt, zal de onderstaande popup getoond worden.Deze popup betekent dat het verkoopkanaal momenteel nog in gebruik is door een aantalproducten. Om dit op te lossen, dient de gebruiker op de Select sales channels pagina hetvinkje bij dit verkoopkanaal voor alle producten uit te vinken.

Figuur 3.33: Delete sales channel error popup

Page 98: Product Price Management Application with PIM Integration

HOOFDSTUK 3. RESULTATEN 87

Overzicht ’Sales channels’ pagina

Figuur 3.34: Sales channel page overview

3.2.8 Overige pagina’s

Alle overige ontwikkelde pagina's hebben min of meer dezelfde functionaliteit als de Saleschannels pagina die vanaf bladzijde 85 besproken wordt.In bijlage C is meer informatie over deze pagina's beschikbaar indien gewenst.

Page 99: Product Price Management Application with PIM Integration

Hoofdstuk4Besluit

In functioneel opzicht voldoet het product aan de vooropgestelde eisen. Er worden productenvanuit het PIM systeem opgehaald, deze producten kunnen met informatie verrijkt worden,er kunnen prijzen berekend worden en tot slot kunnen deze berekende prijzen teruggestuurdworden naar het PIM systeem.Het succes van het project hing echter niet enkel af van de functionele vereisten, maar ook vande vraag of de applicatie bruikbaar zou zijn in een zakelijke omgeving en of de nieuwe tool eenverbetering opleverde tegenover de voorgaande werkmethode.

Uit de laatste gesprekken met de opdrachtgevers kan er geconcludeerd worden dat de tool weldegelijk een beter overzicht van de relevante informatie bevat. Door het simpele en intuıtievedesign, maar ook door de snelheid en performantie van een SPA, kan vermoedelijk ook eenmerkbare hoeveelheid tijd bespaard worden, hoewel dit door de huidige, korte periode vangebruik nog niet met zekerheid gezegd kan worden.

Tijdens de ontwikkeling van de applicatie waren er twee beperkende factoren. Het eersteprobleem was dat er een hele hoop nieuwe technologieen en tools aangeleerd moesten worden.Er was dus een zeer steile leercurve, zeker tijdens de eerste ontwikkelingsweken. De tweedefactor, die versterkt werd door de eerste, was de omvang van het project in verhouding met debeschikbare tijd.Dit resulteerde in een aantal zaken die beter gekund hadden. Vooral unit testing hadiets uitgebreider mogen gebeuren, en er had iets meer aandacht aan de leesbaarheid enonderhoudbaarheid van de code besteed moeten worden.

88

Page 100: Product Price Management Application with PIM Integration

HOOFDSTUK 4. BESLUIT 89

4.1 Reflectie

We vonden het over het algemeen een zeer boeiende stage. Het was vooral interessant om teontdekken hoe het voelt om het volledige ontwikkelingsproces van een project uit te voeren.Zowel de analytische als technische aspecten van softwareontwikkeling zijn aan bod gekomen,en we hebben op beide vlakken ontzettend veel kunnen bijleren.Hoewel er een aantal zaken waren die we onderschat hadden (vooral bij analytische taken), zijnwe er toch in geslaagd om het project tot een goed einde te brengen en aan de eisen van deklant te voldoen.Verder zien we duidelijk het nut en potentieel van onze applicatie, en hebben we al een helehoop uitbreidingen in gedachten. Hierbij denken we aan:

� Automatische conversie van de eindprijs naar andere munteenheden;

� Producten met hun berekende prijs automatisch aanbieden op het juiste verkoopkanaal;

� Logboeken van prijzen bijhouden doorheen de tijd zodat analyses uitgevoerd kunnenworden;

� Rekening houden met stockhoeveelheid bij de keuze van het transporttype en deberekening van de verkoopprijs;

� ...

Page 101: Product Price Management Application with PIM Integration

BijlageAUse cases

Tijdens dit project zijn een groot aantal use cases beschreven. Deze kunnen allemaalteruggevonden worden in het portfolio onder ’Finaal product/schema's’. Hieronder wordenenkele van de beschreven use cases weergegeven.

A.1 CRUD

Zoals weergegeven in figuur 2.2, zijn er relatief veel CRUD gerelateerde use cases. Om degrootte van dit document wat te beperken zijn deze niet allemaal in bijlage opgenomen. Aande hand van het onderstaande voorbeeld wordt duidelijk gemaakt wat deze use cases inhouden.Men kan er dus vanuit gaan dat de andere CRUD gerelateerde cases in figuur 2.2 op eengelijkaardige manier beschreven zijn.

A.1.1 Suppliers

Read

90

Page 102: Product Price Management Application with PIM Integration

BIJLAGE A. USE CASES 91

Create

Update

Page 103: Product Price Management Application with PIM Integration

BIJLAGE A. USE CASES 92

Delete

A.2 GET Products

Deze use case beschrijft hoe een gebruiker nieuwe/geupdate producten kan ophalen uit hetHybris PIM systeem. Merk op dat deze actie niet noodzakelijk door een gebruiker aangeroepenmoet worden, maar ook via een job event getriggerd kan worden.

Page 104: Product Price Management Application with PIM Integration

BIJLAGE A. USE CASES 93

A.3 Price enrichment

Deze sectie bestaat uit een aantal verschillende use cases, die in figuur 2.2 allemaal voorafgegaan worden door het woord ’Product’ (met uitzondering van ’Product Status&calculatedvalues’). Ook hier is de inhoud van deze use cases grotendeels gelijkaardig, en is er dus ookgekozen om maar een voorbeeld in deze bijlage op te nemen.Wat deze use cases onderscheidt van de CRUD use cases, is dat ze enerzijds zoekfunctionaliteitbevatten, en anderzijds geen Create/Delete functionaliteit bezitten.

A.3.1 Price overwrites

Read

Update

Page 105: Product Price Management Application with PIM Integration

BIJLAGE A. USE CASES 94

A.4 Calculate prices

Deze use cases beschrijven hoe een gebruiker de prijsberekeningsmethode kan aanroepen.

A.4.1 Calculate selected

A.4.2 Calculate all

Page 106: Product Price Management Application with PIM Integration

BIJLAGE A. USE CASES 95

A.5 Send prices

Deze use cases beschrijven hoe een gebruiker de gewenste prijzen naar Hybris kan doorsturen.Merk op dat deze actie niet noodzakelijk door een gebruiker aangeroepen moet worden, maarook via een job event getriggerd kan worden.

A.5.1 Send selected

A.5.2 Send all

Page 107: Product Price Management Application with PIM Integration

BIJLAGE A. USE CASES 96

A.6 Status management

Deze use cases beschrijven hoe een gebruiker na het uitvoeren van bepaalde acties kan zien of erfouten/verouderde prijzen voorkomen. Een prijsaanpassing van een verpakking zal bijvoorbeeldtot gevolg hebben dat alle prijzen van producten die deze verpakking gebruiken een error statusverkrijgen. Er zijn een uitgebreid aantal statussen voorzien, die allemaal beschreven worden inhet onderdeel status logic op pagina 56.

A.6.1 Show statuses of selected prices

A.6.2 Show products with errors

Page 108: Product Price Management Application with PIM Integration

BijlageBER diagram

97

Page 109: Product Price Management Application with PIM Integration

BIJLAGE B. ER DIAGRAM 98

B.1 ER diagram parameters

Packaging

Supplier

Supplier

Transport

Page 110: Product Price Management Application with PIM Integration

BIJLAGE B. ER DIAGRAM 99

Product

Price

Page 111: Product Price Management Application with PIM Integration

BIJLAGE B. ER DIAGRAM 100

Price Overwrite

Price Calculated

Sales channel

Delivery zone

Page 112: Product Price Management Application with PIM Integration

BIJLAGE B. ER DIAGRAM 101

Delivery region

GLS Colli

GLS Freight

Page 113: Product Price Management Application with PIM Integration

BijlageCBespreking overige applicatiepagina’s

C.1 Transport

Transport is geen bestaande pagina in de applicatie, maar enkel een onderverdeling in het menuom onderscheid te maken tussen transport gerelateerde pagina's en de rest. De pagina's diehiertoe behoren zijn:

� Regions;

� GLS Colli;

� GLS Freight.

C.1.1 Regions

Deze pagina bevat de mogelijk regio's waarin geleverd kan worden, en hun extra kost. Dezeextra kost kan eigenlijk geınterpreteerd worden als het retour risico dat leveringen in deze regiomet zich meebrengen.

Aanmaken van een nieuwe regio

Toevoegen van een regio gebeurt op de volgende manier:

1. Druk op de knop 'Add region'

2. Bovenaan de tabel zal een nieuwe rij getoond worden

3. Door op een veld in de rij te klikken, zal de waarde aangepast kunnen worden zoals opde onderstaande foto.

102

Page 114: Product Price Management Application with PIM Integration

BIJLAGE C. BESPREKING OVERIGE APPLICATIEPAGINA’S 103

Figuur C.1: Editable table field

4. Vervolgens kan stap 3 herhaald worden voor de volgende twee kolommen.

5. Selecteer de 'Save changes' knop en klik vervolgens op 'OK'.

Wijzigen van een regio

Indien een bestaande regio gewijzigd dient te worden, dienen de stappen voor het Aanmakenvan een nieuwe regio vanaf stap 3 herhaald te worden.

Verwijderen van een regio

Een regio kan simpelweg verwijderd worden door op de 'Delete' knop te drukken. Indien deregio dan niet verwijderd wordt, zal de onderstaande popup getoond worden.

Figuur C.2: Delete region error popup

Deze popup betekent dat de regio momenteel nog in gebruik is door een of meerdere kanalenen/of GLS tabellen. Om dit op te lossen, dient de gebruiker op de Sales channels pagina deregio van elk verkoopkanaal te controleren, en indien de regio nog voorkomt, deze te vervangen.Hierna moet op de pagina's GLS colli en GLS freight de volledige tabel voor die regio verwijderdworden (elke rij verwijderen met de 'Delete' knop) alvorens de regio verwijderd kan worden.

Page 115: Product Price Management Application with PIM Integration

BIJLAGE C. BESPREKING OVERIGE APPLICATIEPAGINA’S 104

Overzicht ’Regions’ pagina

Figuur C.3: Region page overview

Page 116: Product Price Management Application with PIM Integration

BIJLAGE C. BESPREKING OVERIGE APPLICATIEPAGINA’S 105

C.1.2 GLS colli

Deze pagina bevat de General Logistics Systems tarieven voor Colli transport in tabelvorm. Dezetarieven zijn afhankelijk van het gewicht en de afmetingen van het te verzenden pakket, duszullen gewichten en afmetingen zeker in de tabel terug te vinden zijn. Voor het gewicht wordter per rij een minimum en maximum gedefinieerd. Voor de afmetingen zijn er 2 eigenschappentoegevoegd:

� Maximum lengte: zowel lengte, breedte als hoogte van de verpakking van een productwordt hiermee vergeleken (of de afmetingen van het product, indien geen verpakkinggebruikt wordt).

� Girth: 2x de hoogte + 2x de lengte + de langste zijde Verder is het GLS tarief afhankelijkvan de regio, dus zal vooraleer er iets te zien is op deze pagina een regio geselecteerdmoeten worden.

Figuur C.4: Select region option

Aanmaken van een nieuwe GLS colli rij

Toevoegen van een nieuw tarief voor een bepaald gewicht en bepaalde afmetingen in eenbepaalde regio gebeurt op de volgende manier:

� Selecteer een regio

� Druk op de 'Add row' knop

� Bovenaan de tabel zal een nieuwe rij aangemaakt worden

� Door op een veld in de rij te klikken, zal de waarde aangepast kunnen worden zoals opde onderstaande foto.

Figuur C.5: Editable table field

� Vervolgens kan stap 3 herhaald worden voor de overige kolommen.

� Selecteer de 'Save changes' knop en klik vervolgens op 'OK'.

Page 117: Product Price Management Application with PIM Integration

BIJLAGE C. BESPREKING OVERIGE APPLICATIEPAGINA’S 106

Opmerking: bij het aanmaken van een nieuwe regio, zal automatisch een volledige standaardGLS colli tabel aangemaakt worden, waarin alle gewicht en dimensie gerelateerde kolommen alcorrect ingevuld zijn, waardoor enkel de prijzen nog aangepast moeten worden.

Wijzigen van een GLS colli rij

Indien een bestaande GLS colli rij gewijzigd dient te worden, dienen de stappen voor hetAanmaken van een nieuwe GLS freight rij vanaf stap 4 herhaald te worden.

Verwijderen van een GLS colli rij

Een GLS colli rij kan simpelweg verwijderd worden door op de 'Delete' knop te drukken.

Overzicht ’GLS colli’ pagina

Figuur C.6: GLS colli page overview

Page 118: Product Price Management Application with PIM Integration

BIJLAGE C. BESPREKING OVERIGE APPLICATIEPAGINA’S 107

C.1.3 GLS freight

Deze pagina bevat de General Logistics Systems tarieven voor Freight transport in tabelvorm.Deze tarieven zijn afhankelijk van het gewicht en de afmetingen van het te verzenden pakket, duszullen gewichten en afmetingen zeker in de tabel terug te vinden zijn. Voor het gewicht wordter per rij een minimum en maximum gedefinieerd. Voor de afmetingen zijn er 2 eigenschappentoegevoegd:

� Maximum lengte: zowel lengte, breedte als hoogte van de verpakking van een productwordt hiermee vergeleken (of de afmetingen van het product, indien geen verpakkinggebruikt wordt).

� Girth: 2x de hoogte + 2x de lengte + de langste zijde Verder is het GLS tarief afhankelijkvan de regio, dus zal vooraleer er iets te zien is op deze pagina een regio geselecteerdmoeten worden.

Figuur C.7: Select region option

Aanmaken van een nieuwe GLS freight rij

Toevoegen van een nieuw tarief voor een bepaald gewicht en bepaalde afmetingen in eenbepaalde regio gebeurt op de volgende manier:

� Selecteer een regio

� Druk op de 'Add row' knop

� Bovenaan de tabel zal een nieuwe rij aangemaakt worden

� Door op een veld in de rij te klikken, zal de waarde aangepast kunnen worden zoals opde onderstaande foto.

Figuur C.8: Editable table field

� Vervolgens kan stap 3 herhaald worden voor de overige kolommen.

� Selecteer de 'Save changes' knop en klik vervolgens op 'OK'.

Page 119: Product Price Management Application with PIM Integration

BIJLAGE C. BESPREKING OVERIGE APPLICATIEPAGINA’S 108

Opmerking: bij het aanmaken van een nieuwe regio, zal automatisch een volledige standaardGLS freight tabel aangemaakt worden, waarin alle gewicht en dimensie gerelateerde kolommenal correct ingevuld zijn, waardoor enkel de prijzen nog aangepast moeten worden.

Wijzigen van een GLS freight rij

Indien een bestaande GLS freight rij gewijzigd dient te worden, dienen de stappen voor hetAanmaken van een nieuwe GLS freight rij vanaf stap 4 herhaald te worden.

Verwijderen van een GLS freight rij

Een GLS freight rij kan simpelweg verwijderd worden door op de 'Delete' knop te drukken.

Overzicht ’GLS freight’ pagina

Figuur C.9: GLS freight page overview

Page 120: Product Price Management Application with PIM Integration

BIJLAGE C. BESPREKING OVERIGE APPLICATIEPAGINA’S 109

C.2 Packaging

Op deze pagina kunnen de verschillende verpakkingen aangemaakt worden. De eigenschappenvan deze verpakkingen zijn:

� Naam: naam van de verpakking;

� Prijs: prijs van de verpakking;

� Afmetingen: dit is enkel noodzakelijk voor dozen zodat bij het laden van nieuwe productenautomatisch de meest geschikte doos geselecteerd kan worden. Voor extra verpakkingenzoals bubble wrap, cadeauverpakking, etc. zijn deze velden overbodig.

C.2.1 Aanmaken van een nieuwe verpakking

Toevoegen van een nieuwe verpakking gebeurt op de volgende manier:

1. Druk op de 'Add packaging' knop

2. Bovenaan de tabel zal een nieuwe rij aangemaakt worden

3. Door op een veld in de rij te klikken, zal de waarde aangepast kunnen worden zoals opde onderstaande foto.

Figuur C.10: Editable table field

4. Vervolgens kan stap 3 herhaald worden voor de overige kolommen.

5. Selecteer de 'Save changes' knop en klik vervolgens op 'OK'.

C.2.2 Wijzigen van een verpakking

Indien een bestaande verpakking gewijzigd dient te worden, dienen de stappen voor hetAanmaken van een nieuwe verpakking vanaf stap 3 herhaald te worden.

Page 121: Product Price Management Application with PIM Integration

BIJLAGE C. BESPREKING OVERIGE APPLICATIEPAGINA’S 110

C.2.3 Verwijderen van een verpakking

Een verpakking kan simpelweg verwijderd worden door op de 'Delete' knop te drukken. Indiende verpakking niet verwijderd kan worden, zal onderstaande popup op het scherm verschijnen.

Figuur C.11: Delete packaging error popup

Dit betekent dat de verpakking momenteel in gebruik is voor verschillende producten, en dusenkel verwijderd kan worden na dat de verpakking van deze producten gewijzigd is.

C.2.4 Overzicht ’Packaging’ pagina

Figuur C.12: Packaging page overview

Page 122: Product Price Management Application with PIM Integration

BIJLAGE C. BESPREKING OVERIGE APPLICATIEPAGINA’S 111

C.3 Supplier

Op deze pagina kunnen de verschillende leveranciers, en hun leveringskortingen ingesteld worden.

C.3.1 Aanmaken van een nieuwe leverancier

1. Druk op de 'Add supplier' knop

2. Bovenaan de tabel zal een nieuwe rij aangemaakt worden

3. Door op een veld in de rij te klikken, zal de waarde aangepast kunnen worden zoals opde onderstaande foto.

Figuur C.13: Editable table field

4. Vervolgens kan stap 3 herhaald worden voor de overige kolommen.

5. Selecteer de 'Save changes' knop en klik vervolgens op 'OK'.

C.3.2 Wijzigen van een leverancier

Indien een bestaande leverancier gewijzigd dient te worden, dienen de stappen voor hetAanmaken van een nieuwe leverancier vanaf stap 3 herhaald te worden.

Page 123: Product Price Management Application with PIM Integration

BIJLAGE C. BESPREKING OVERIGE APPLICATIEPAGINA’S 112

C.3.3 Verwijderen van een leverancier

Een leverancier kan simpelweg verwijderd worden door op de 'Delete' knop te drukken. Indiende leverancier niet verwijderd kan worden, zal onderstaande popup op het scherm verschijnen.

Figuur C.14: Delete supplier error popup

Dit betekent dat de leverancier momenteel in gebruik is voor verschillende producten, en dusenkel verwijderd kan worden na dat de leverancier van deze producten gewijzigd is.

C.3.4 Overzicht ’Supplier’ pagina

Figuur C.15: Supplier page overview

Page 124: Product Price Management Application with PIM Integration

Bibliografie

[1] Start Bootstrap. SB Admin 2. http://startbootstrap.com/template-overviews/sb-admin-2/. 44, 48

[2] Riccardo Cardin. MVC e di spring e AngularJS. http://www.slideshare.net/RiccardoCardin/mvc-e-di-spring-e-angular-js. 15

[3] Lorenzo Fox. Smart Table Introduction. https://lorenzofox3.github.io/smart-table-website/. 17

[4] Mikell P. Groover. Automation, Production Systems, and Computer IntegratedManufacturing. Prentice Hall, 2000. 21

[5] Kenji Hasunuma. JAX-RS 1.1 explained. http://www.coppermine.jp/docs/programming/2012/12/jaxrs1.html. 10

[6] Uche Ogbuji. Rapid web development with Bootstrap. http://www.ibm.com/developerworks/library/wa-bootstrap/. 44

[7] Colin Percival. Stronger Key Derivation via Sequential Memory-Hard Functions, pp. 14.14

[8] RestApiTutorial.com. Using HTTP Methods for RESTful Services. http://www.restapitutorial.com/lessons/httpmethods.html. 37

[9] Jose Sandoval. RESTful Java Web Services. PACKT Publishing, november 2009. 13

[10] SourceMaking. Object Relational Design Patterns - Convert Procedural Design to Objects.http://kniterpa.com/object-relational-design-patterns/. 10

[11] The Hibernate Team. HIBERNATE - Relational Persistence for Idiomatic Java. https://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html single/. 13

[12] what-when how. Introducing JPQL Part 1 (EJB 3). http://what-when-how.com/enterprise-javabeans-3/introducing-jpql-part-1-ejb-3/. 9

113

Page 125: Product Price Management Application with PIM Integration

BIBLIOGRAFIE 114

[13] Wikipedia. User Interface. https://en.wikipedia.org/wiki/User interface. 47

Page 126: Product Price Management Application with PIM Integration