Benutzer-Werkzeuge

Webseiten-Werkzeuge


de.bkp:intern:ipa:ib2017:ipa_ib2017
Lagerüberwachungsmodul für das interne Lagerverwaltungs Projekt IPA-Bericht Ingrid Betschart
I PA-Bericht





- Teil 1

  1. Aufgabenstellung

Die Funktionalität der 2D Scanner Logik ist schon vorhanden und funktionsfähig. Codes die der 2D-Scanner einliest werden korrekt identifiziert und weitergeleitet. Sie können sich die vorhandene Software-Infrastruktur, Klassen, Schnittstellen und Bibliotheken benutzen. Diese erlauben es Ihnen sich auf das wesentliche zu konzentrieren. Korrekte Validierung, Klassen-Design, Logik und E-Mail-Benachrichtigung.

Source Control:
Damit eine Kontrolle und Nachverfolgung möglich ist, erstellen Sie ein Mercurial Repository auf dem externen Rafisa Root Server. Die Commits sollen im Umfang möglichst klein sein und themenverwandt. Die Commits müssen in guter Qualität kommentiert werden. Jeden Abend soll ein Push auf den Server erfolgen.
• Initialisierung des „Repository“ auf dem Mercurial-Server.
• Es wird der Rafisa-Mercurial-Server benutzt.
• Kleine Commits, z.B. Beim Arbeitsjournal wurde einen Tageseintrag fertiggestellt.
• Themenverwandte Commits, z.B. Business-Klassen wurden erweitert.
• Täglicher Push auf den Server.

Funktion / Programmierung:
Das Modul soll Objektorientiert aufgebaut werden und folgende Richtlinien sind einzuhalten:
• Benutzung der Entity-Schnittstelle und der abstrakten Entity Klasse.
• Benutzung der RIODatabase-Persistenz-Infrastruktur.
• Benutzung der RIOValidate-Infrastruktur.
• Erweiterung der „Ware“-Klasse um die Felder: Max, Min, Amount.
• Erstellung einer neuen Klasse Warehouse-Notification mit folgenden Felder: ID, Recipient, Email, Text.
• Erstellung einer neuen Klasse die die Funktionalität der Lagerverwaltungslogik beinhaltet.
• Erstellung einer neuen Klasse die die Funktionalität der E-Mail-Benachrichtigungslogik beinhaltet.
• Flexibilität bei der Konfiguration der E-Mail-Adresse des Lagerverantwortlichen.
• Benutzung des auf dem Rafisa-Root-Server konfigurierten Mail-Servers.
• Die Überprüfung des Lagerbestandes erfolgt wenn ein Benutzer einen Lagerbewegungsauftrag abschliesst.
• Mögliche Fehler mittels try/catch abfangen und protokollieren.


Code-Konventionen:
• Namenskonvention: analog Java für selbstdefinierte Programmteile. Klassen sind ‚upper camel case‘, Methoden sind ‚lower camel case‘, Variablen sind ‚lower camel case‘ und Konstanten müssen ‚upper case underscore separated‘ sein.
• Formatierung des Codes: Netbeans PHP Standard Formatierer.
• Quellcode Dokumentation, Klassen Definition, ausführliche Kommentare inklusive Instanzierungs-Beispiele. Methoden ausführlich inklusive Parameter, Rückgabewerte und etwaige Throws.

• Variablen/Felder durch das ‚protected‘ Schlüsselwort geschützt, Zugriff auf diese nur durch Methoden.
• Stringliterale wo möglich und sinnvoll als Konstanten.
• Meldungen und Beschriftungen durch externe Dateien.


Logging:
Es wird die bestehende RIOLog-Infrastruktur benutzt.
Jede Aktion soll in einen Logeintrag festgehalten werden. Aus dieser Datei soll ersichtlich sein wer, was, wann getätigt hat. Fehler die mit try/catch abgefangen werden, sollen auch mit einer erklärenden Meldung protokolliert werden.
• Jeder Eintrag hat einen Zeitstempel.
• Jeder Eintrag hat der Aktionsnamen der durchgeführt wurde.
• Jeder Eintrag hat die ID des Benutzers der die Aktion durchgeführt hat.
• Fehler die mittels try/catch abgefangen werden werden mit einer aussagekräftige Fehlermeldung protokolliert.


Testing:
Mindestens folgende Testszenarien müssen durchgeführt werden:
• Lagerunterschreitung benachrichtigen.
• Minimaler Lagerbestand unterschritten benachrichtigen.
• Maximaler Lagerbestand überschritten benachrichtigen.
• Korrekter E-Mail Empfang beim Adressaten: 'i.betschart@rafisa.ch'.

Dokumentation:
Um den Aufbau für den Auftraggeber möglichst transparent zu machen, erstellen Sie die pertinenten Use-Cases, UML und ERM-Diagramme, aus welchen folgende Angaben ableitbar sind:
• Aufbau des Benachrichtigungsmoduls.
• Funktionsweise der Benachrichtigung bei der Unterschreitung der minimal festgelegte Lagerbestände.
• Funktionsweise der Benachrichtigung bei der Überschreitung der maximal festgelegte Lagerbestände.
• Funktionsweise der Benachrichtigung bei Minus-Bestände.

Es ist eine Technische-Anleitung zu erstellen. Diese richtet sich an die zuständigen Personen der Lagerverwaltungssoftware. Folgende Themen müssen behandelt sein:
• Einbindung des Moduls in die bestehende Software
• Konfiguration der E-Mail-Adresse des Lagerverantwortlichen



- Projektaufbauorganisation

Dieses Projekt wird von Ingrid Betschart geplant und umgesetzt. Jorge Windmeisser ist der Fachvorgesetzte und Thomas Schärer der Berufsbilder in der Firma Rafisa.

Für dieses Teilprojekt wird die Projektmanagement-Methode mPM verwendet. In der Planungs-Phase wird der Zeitplan erstellt. Es werden alle nötigen Diagramme erstellt um zu planen wie das Teilprojekt funktionieren soll. In der Realisierungs-Phase wird die Planung umgesetzt. Wenn bei der Programmierung etwas nicht wie geplant funktioniert werden alternative Varianten gesucht. Wenn alles funktioniert werden Tests durchgeführt. Wenn diese erfolgreich sind wird das Teilprojekt in das Hauptprojekt eingebunden und nochmal getestet. Am Ende wird es noch eine Reflexion zum Teilprojekt geben.



- Vorkenntnisse

• OO Programmieren.
HTML, PHP, CSS, SQL.
• Projektabwicklung.



- Vorarbeiten

• Aufbau des Entwicklungs-PCs, korrekte Verkabelung mit dem 2D Scanner, Tastatur und Touchscreen-Monitor
• Korrekter Anschluss an die Netzwerk-Infrastruktur per DHCP.
• Installation der Netbeans-IDE 8.2 (PHP 7.0 Unterstützung)
• Installation vom MySQL
• Installation der PHP-PDO-Klassen
• Installation der PHP-Mail-Klassen
• Installation der PHP-MySQL-Treiber für die PDO-Klassen
• Installation von MySQL-Workbench
• Installation vom Google-Chromium Browser
• Installation vom Libre-Office 



- Benutzte Firmenstandards

• Namenskonvention: analog Java für selbstdefinierte Programmteile. Klassen sind ‚upper camel case‘, Methoden sind ‚lower camel case‘, Variablen sind ‚lower camel case‘ und Konstanten müssen ‚upper case underscore separated‘ sein.
• Formatierung des Codes: Netbeans PHP Standard Formatierer.
• Quellcode Dokumentation, Klassen Definition, ausführliche Kommentare inklusive Instanzierungs-Beispiele. Methoden ausführlich inklusive Parameter, Rückgabewerte und etwaige Throws.
• Variablen/Felder durch das ‚protected‘ Schlüsselwort geschützt, Zugriff auf diese nur durch Methoden.
• Stringliterale wo möglich und sinnvoll als Konstanten.
• Meldungen und Beschriftungen durch externe Dateien.



Zeitplan

Aus Excel einfügen



- Arbeitsjournal

Tag 1 11.04.2017
Ausgeführte Arbeit Erfolge Schwierigkeiten Hilfe Zeiteinhaltung
Zeitplan erstellen Ich habe nun einen Zeitplan.
keine eingehalten
Projektstruktur festlegen
Ich weiss nicht wie ich es verständlich darstellen soll. keine eingehalten
Klassenstruktur festlegen
Dasselbe Problem wie bei der Projektstruktur. keine eingehalten
Vorlage für Dokumentation erstellen Das ging recht schnell, weil ich es ähnlich machte wie letztes Jahr.
keine eingehalten
Repository initialisieren Das Projekt ist nun auf dem Server.
Der Administrator hat das Repository initialisiert. Er hat mir auch erklärt wie Mercurial funktioniert. eingehalten
Bemerkungen Das Erstellen des Zeitplans ging recht gut. Ich bin zufrieden damit und hoffe nun diesen einhalten zu können. Bei den Strukturen hatte ich vor allem Mühe sie verständlich darzustellen. Ich weiss nie ob meine Darstellungen für andere verständlich sind. Beim Repository hatte ich Hilfe. Nun habe ich eine Anleitung zu Mercurial gemacht.

Tag 2 12.04.2017
Ausgeführte Arbeit Erfolge Schwierigkeiten Hilfe Zeiteinhaltung
ERM zur Klasse Ware und der neuen Klasse Warehousenotification Ich war recht schnell fertig damit.
keine eingehalten
Diagramme und Dokumentation der Lagerverwaltungslogik Ich habe ein Flussdiagramm zur Lagerverwaltungslogik gemacht.
keine eingehalten
Bemerkungen Bei beiden Arbeiten kam ich gut vorwärts.



|
|
|
|
|
|| Tag 3 13.04.2017 |||||

Ausgeführte Arbeit Erfolge Schwierigkeiten Hilfe Zeiteinhaltung
Diagramme und Dokumentation der E-Mail-Benachrichtigungslogik Ich habe ein Flussdiagramm zur E-Mail-Benachrichtigungslogik gemacht. Dazu noch ein Use Case für beide Logiken zusammenhängend.
keine eingehalten
RIODatabase aus Hauptprojekt einbinden Die Testabfrage hat funktioniert.
keine eingehalten
Bemerkungen Ich habe zuerst noch eine kleine Änderung am Flussdiagramm zur Lagerverwaltungslogik gemacht, weil mir ein Fehler aufgefallen ist. Bei den Diagrammen kam ich gut vorwärts. Beim Dateien Einbinden habe ich zuerst den Autoloader vergessen. Es fiel mir aber schnell auf und ich kam doch gut vorwärts.





Tag 4 18.04.2017
Ausgeführte Arbeit Erfolge Schwierigkeiten Hilfe Zeiteinhaltung
RIOLogging aus Hauptprojekt einbinden Es geht nun doch. Es ging einfach nicht. Ich habe alles Mögliche versucht und war total frustriert. Am Ende war nur ein Pfad falsch Der Fachvorgesetzte half. Es war nur ein Pfad falsch. Nach dem Frust habe ich am Vormittag nicht mehr weitergemacht.
RIOValidate aus Hauptprojekt einbinden Ich habe die nötigen Ordner kopiert. Keine Zeit zu testen ob es funktioniert.
Erst am Nachmittag angefangen.
Klasse Ware und dazugehörige DB-Tabelle anhand des ERM anpassen Die Klasse und Tabelle sind ergänzt.

Wegen der Verschiebung vom Vormittag auch verschoben.
WarehouseNotification laut ERM erstellen Die Klasse und Tabelle sind erstellt.

Endlich die Zeit wieder aufgeholt.
Bemerkungen Durch die Schwierigkeiten bei der ersten Arbeit hat sich alles verschoben. Ich hatte einen Aussetzer und konnte vormittags nichts mehr machen. Dadurch kam ich am Nachmittag in Stress. Ich glaube nicht, dass die Arbeiten vom Nachmittag gut gemacht und gut dokumentiert sind.



|
|
|
|
|
|| Tag 5 19.04.2017 |||||

Ausgeführte Arbeit Erfolge Schwierigkeiten Hilfe Zeiteinhaltung
Klasse für die Lagerverwaltungslogik erstellen und testen Es wird alles richtig ausgeführt.

eingehalten
Bemerkungen Ich kam gut vorwärts. Für das Testen habe ich einige Daten in die Datenbank eingegeben.





Tag 6 20.04.2017
Ausgeführte Arbeit Erfolge Schwierigkeiten Hilfe Zeiteinhaltung
Kleine Text- und Formatierungskorrekturen im IPA-Bericht Der Text ist übersichtlicher. Der eingefügte Code ist besser lesbar.

war nicht eingeplant
Klasse für die E-Mail-Benachrichtigungslogik erstellen und testen Die Daten werden richtig in die E-Mail eingefügt. Die E-Mail wird gesendet.

eingehalten
Bemerkungen Bei den Korrekturen war gut, dass ich nun den Code formatiert einfügen konnte. Mit der E-Mail Klasse bin ich zufrieden. Sie formatiert alles wie ich es haben wollte. Weil ich nicht direkt den Rafisa Server für den E-Mail-Versand benutzen darf, benutzte ich den PHPMailer und Gmail. Diesen Empfahl mir ein anderer Lernender, der schon Erfahrungen mit dem E-Mail-Versand hat. Ich hatte noch genug Zeit um ein Sequenzdiagramm für den ganzen Ablauf zu machen. Die Validierung wurde noch nicht getestet. Das ist morgen geplant.





Tag 7 21.04.2017
Ausgeführte Arbeit Erfolge Schwierigkeiten Hilfe Zeiteinhaltung
automatische Tests nach Detailbeschreibung durchführen Die Tests waren erfolgreich.

eingehalten
Bemerkungen Die Test die durch die Testklasse ausgeführt werden verliefen erfolgreich. Die Dokumentation dazu ist zwar vorhanden aber etwas kurz. Der zweite Besuch des Experten verlief sehr gut. Ausser das Problem mit dem Passwort. Ich habe es zwar richtig eingegeben, die Tastatur war aber verstellt.





Tag 8 24.04.2017
Ausgeführte Arbeit Erfolge Schwierigkeiten Hilfe Zeiteinhaltung
Deployment
viele Probleme beim Einbinden.
nein
Bemerkungen Es lief überhaupt nicht, wie es sollte und tut es auch jetzt noch nicht. Dadurch konnte ich die Technische Dokumentation nicht anfangen. Die Rechtschreibkorrektur und wohl auch ein Teil der Reflexion verschieben sich nun auf den Reservetag.





Tag 9 25.04.2017
Ausgeführte Arbeit Erfolge Schwierigkeiten Hilfe Zeiteinhaltung















Bemerkungen Kritische Würdigung





Tag 10 26.04.2017
Ausgeführte Arbeit Erfolge Schwierigkeiten Hilfe Zeiteinhaltung















Bemerkungen Kritische Würdigung

Tabelle 1: Arbeitsjournal.



- Teil 2

  1. Kurzfassung des IPA-Berichtes

Ausgangssituation



Umsetzung



Ergebnis



Kurzfassung nicht länger als 1 A4 Seite und keine Grafik enthalten



- Planung

  1. Randbedingungen des Gesamtprojekts

Für dieses Teilprojekt werden viele schon existierende Klassen aus dem Hauptprojekt verwendet. Es geht also nicht nur darum die neuen Funktionen zu programmieren, sondern auch die bestehenden richtig einzusetzen.

Es wird NetBeans IDE 8.2 als Entwicklungsumgebung benutzt. Es wird PHP 7.1.1, Apache 2.4.25, MariaDB 10.1.21 und phpMyAdmin 4.6.5.2 benutzt.

Für die Versionsverwaltung wird ein Mercurial Repository auf dem externen Rafisa Root Server erstellt. Im nächsten Kapitel gibt es eine Anleitung wie Mercurial benutzt wird.

  1. Mercurial

Neues Projekt in NetBeans erstellen

Form1

das zweite Symbol anklicken um ein neues Projekt zu erstellen



PHP Application auswählen



Projektname eingeben

Finish anklicken



Repository Initialisieren

Initialize Repository… anklicken

Pfad eingeben und ok anklicken

Lokal Commiten

Rechtsklick auf Projekt um folgendes Menü zu öffnen

Commit… anklicken



Eine Message eingeben

Autor eingeben

Dateien mit Häkchen werden commited.

Commit anklicken



Auf Server pushen

Rechtsklick auf Projekt um folgendes Menü zu öffnen

Push… anklicken

P fad des Projektes auf dem Server eingeben

Benutzername und Passwort eingeben

Push anklicken











Projekt von Server holen

Rechtsklick auf Projekt um folgendes Menü zu öffnen

Pull… anklicken

P fad des Projektes auf dem Server eingeben

Benutzername und Passwort eingeben

Pull anklicken











- Projektstruktur

- Klassenstruktur

Klassendiagramm zu Entity



- ERM zu den Klassen Ware und Warehousenotification

Für das Teilprojekt muss die Datenbank erweitert werden. In Ware werden min, max und amount hinzugefügt. Die Klasse Warehousenotification ist neu.

ERM zu Ware und Warehousenotification



- Funktionsweise der Lagerverwaltungslogik

Wenn ein Benutzer Waren ins Lager bringt oder welche herausnimmt, muss er diese im GUI auswählen. Dann muss er seine Lagerbewegungen signieren. Dadurch wird eine Aktion ausgelöst die, die Lagerbewegungen als signiert markiert. In dieser Aktion soll auch die Lagerverwaltungslogik aufgerufen werden.

Bevor das Teilprojekt im Hauptprojekt eingebunden ist, wird sie in index.php aufgerufen. Dazu wird ein Objekt der Klasse RIOStockControl erzeugt. In diesem werden alle Lagerbewegungen aus der Datenbank geholt und zwischengespeichert.

Dann wird checkStock() aufgerufen. In dieser Funktion wird jeder Datensatz überprüft, ob er ein Warenein- oder Warenausgang ist und dementsprechend wird bei der dazugehörigen Ware die Menge angepasst und in der Datenbank gespeichert.



Nun wird überprüft ob die Menge noch in einem gültigen Bereich ist. Folgende Überprüfungen werden gemacht:

  • Wurde das Maximum überschritten?
  • Wurde das Minimum unterschritten?
  • Ist in Menge ein Minuswert?

Je nachdem welcher Fall eintrifft, wird mit dem Datensatz zusammen eine andere Meldung in ein Array zwischengespeichert. Das Array und die Empfänger-Mailadresse werden dann an die E-Mail-Benachrichtigungslogik übergeben.

Flussdiagramm zur Lagerverwaltungslogik



- Funktionsweise der E-Mail-Benachrichtigungslogik

Die E-Mail-Benachrichtigungslogik erhält von der Lagerverwaltungslogik ein Array und die Empfänger-Mailadresse. Diese werden nun in die E-Mail eingesetzt.

Die E-Mail wird versandt. Wenn sie erfolgreich abgeschickt wurde wird true zurückgegeben und die Daten werden in die Tabelle Warehousenotification gespeichert. Wenn die E-Mail nicht verschickt werden konnte wird false und eine Meldung zurückgegeben.

Flussdiagramm zur E-Mail-Benachrichtigungslogik



- Zusammenhang der Logiken

Use Case zum Zusammenhang zwischen der Lagerverwaltungslogik und der E-Mail-Benachrichtigungslogik



- Realisierung

Nachdem die Planungsphase abgeschlossen ist, geht es nun an die Umsetzung. Als erstes müssen die benötigten Infrastrukturen aus dem Hauptprojekt eingebunden werden.



- Einbinden von RIOAutoloader

Zuerst muss der Autoloader eingebunden sein. In index.php muss der Autoloader inkludiert werden.

Der Autoloader ist dazu da, dass man nicht alle Dateien, wo sie benötigt werden, einzeln inkludieren muss. Er stellt eine Bibliothek, in der alle Klassen des Projektes enthalten sind, zusammen. So muss man nur einmal den Autoloader inkludieren.

<?php

include_once'RIOAutoloader.php';

?>





- Einbinden von RIODatabase

Danach wird ein Ordner für die Persistenz gemacht. Darin kommen die SQL-Dumps, die Entity-Klassen und die Klasse RIODatabase.

RIODatabase wird für die Datenbankzugriffe verwendet. Damit kann man einfacher Daten auslesen oder Datensätze in die Datenbank speichern.

In index.php im Body wird ein Testzugriff gemacht.

<?php

$userId='User_1';

$user=RIODatabase::getInstance()→load($userId);

echo$user;

?>



Dieser Code gibt die Benutzer-ID aus, wenn sie in der Datenbank existiert. Sonst kommt nichts.



- Einbinden von RIOLogging

Aus dem Hauptprojekt aus persistence die Ordner helper und log kopieren. Aus action den Ordner helper und die Dateien RIOActionInt und RIOAction kopieren.

Bei jeder Aktion muss ein Logeintrag erstellt werden. Im Eintrag sind ein Zeitstempel, der Name der durchgeführten Aktion, die ID des Benutzers der die Aktion auslöste und eine Fehlermeldung.

In action eine Action-Klasse erstellen.

<?php

/**

* Testklasse ob Logging funktioniert

*

* @author Ingrid Betschart

*/

classLogtest extendsRIOAction{

//put your code here

publicfunctiongetHeader(){

}


publicfunctiongetScript(){

}


publicfunctionperform(){

$userId='User_1';

$user=RIODatabase::getInstance()→load($userId);

echo$user;

RIOLogHelper::log($userId,$user,RIOLogClass::ACTION,'error','perform wurde ausgelöst');

}


}



Die Klasse muss von RIOAction abstammen. Mit RIOLogHelper::log(); wird das Logging benutzt.

In Index wird nun ein Objekt der Klasse erzeugt.

$logTest=newLogtest;

$logTest→perform();



Die Logdatei warehouse.log wird im Unterordner data gespeichert. Die Einträge sehen wie folgt aus:

1492515445|User_1|Ingrid Betschart|ACTION|error|perform wurde ausgelöst



- Einbinden von RIOValidate

Aus dem Hauptprojekt aus persistence den Ordner validation kopieren. Die Validierung wird erst später gebraucht. Dann wird genauer erklärt wie sie benutzt wird.



- Entity-Klassen und Datenbank anpassen

Für dieses Teilprojekt muss die Klasse Ware erweitert werden und die neue Klasse Warehousenotification erstellt werden.



- Klasse und Tabelle Ware erweitern

In der Klasse Ware müssen die Konstanten MIN, MAX und AMOUNT ergänzt werden.

constMIN ='min';

constMAX ='max';

constAMOUNT ='amount';


Die neuen Konstanten in Ware.



In der Tabelle müssen die Spalten namens min, max und amount eingefügt werden.

Neue Struktur der Tabelle Ware



- Klasse und Tabelle Warehousenotification erstellen

Die Klasse Warehousenotification muss erstellt werden.

Sie muss von der Klasse RIOEntity erben. Darin sind die Konstanten ID, DELETED, CREATEDDATE und MODIFIEDDATE die in allen Entity-Klassen gebraucht werden.

In Warehousenotification selbst müssen die Konstanten RECIPIENT, EMAIL und TEXT enthalten sein.

In die Tabelle Warehousenotification werden später die Inhalte der versendeten E-Mails gespeichert. Sie enthält eine ID, die User-ID, die E-Mail Adresse des Empfängers und den Inhalt der E-Mail als Text. Wie alle andern Tabellen enthält sie die Spalten deleted, createddate und modifieddate.

Struktur der neuen Tabelle Warehousenotificaton



Um zu testen ob die Zugriffe funktionieren wurden Testdaten eingegeben. Diese wurden nun in Index ausgelesen.

$wareList=RIODatabase::getInstance()→loadList(Ware::class);

foreach($wareListas$ware){

$min=$ware→get(Ware::MIN);

echo'min aus Ware '.$min.'<br>';

$max=$ware→get(Ware::MAX);

echo'max aus Ware '.$max.'<br>';

$amount=$ware→get(Ware::AMOUNT);

echo'amount aus Ware '.$amount.'<br>';

}

$notificationList=RIODatabase::getInstance()→loadList(Warehousenotification::class);

foreach($notificationListas$warehousenotification){

$recipient=$warehousenotification→get(Warehousenotification::RECIPIENT);

echo'recipient aus Warehousenotification '.$recipient.'<br>';

}

Code aus index.php der Mithilfe eines Database-Objektes die Daten ausliest und ausgibt.

Ausgabe



- Klasse für Lagerverwaltungslogik

Nun wird die Planung aus Kapitel 2.2.6 umgesetzt. Die Klasse RIOStockControl gehört ins business, weil sie Berechnungen durchführt.

Zuerst werden die Filter gesetzt um die Lagerbewegungen vom angemeldeten Benutzer die nicht abgeschlossen sind aus der Datenbank auszulesen. Diese Lagerbewegungen werden zwischengespeichert.

Dann wird die Funktion checkStock() aufgerufen. In ihr werden die einzelnen Datensätze verarbeitet. Mit der Waren ID der Lagerbewegung und der ID der Waren, wird nun die entsprechende Ware rausgefiltert.

Es wird überprüft ob die Spalte inoutput aus der Lagerbewegung ein Ein- oder Ausgang ist. Je nachdem wird bei der Spalte amount der Ware nun eins dazu oder abgezählt. Nun wird der neue Wert von amount in die Tabelle Ware gespeichert.

Danach wird mit den Spalten min und max verglichen ob der Wert von amount noch im gültigen Bereich ist. Wenn sie nicht im gültigen Bereich sind werden sie mit der ID, Beschreibung, Menge, Minimum, Maximum und einer, je nach Art der Abweichung, unterschiedlichen Meldung in ein Array gespeichert.

Um den Code zu vereinfachen gibt es für das Abfüllen des Arrays die Funktion fillArray().

Der Array der nun von der Funktion checkStock zurückgegeben wird, wird an die E-Mail-Benachrichtigungslogik übergeben.

Um zu testen wurden einige Daten in die Datenbank eingegeben. Um zu sehen ob alles richtig abläuft wurden einige Variablen Werte mit echo ausgegeben.

A uf folgendem Bild ist die Ausgabe zu sehen. Es wurden vier Datensätze überprüft.

Der erste Wert ist die Menge der Ware. Der Zweite ist der Warenein- oder Warenausgang. Der Dritte ist die Menge nach der Verrechnung. Der Vierte ist das Minimum das von dieser Ware an Lager sein sollte. Der Fünfte ist das Maximum das von dieser Ware an Lager sein sollte. Der Sechste ist die Meldung der Art der Abweichung.



















Ausgabe



- Klasse für die E-Mail-Benachrichtigungslogik

Nun wird die Planung aus Kapitel 2.2.7 umgesetzt. Die Klasse RIOMail gehört auch ins business. Sie ist für das Erstellen, den Versand und die Speicherung der E-Mails verantwortlich.



- E-Mail senden

Zuerst wird für den E-Mail-Versand der PHPMailer und ein Gmail-Konto verwendet. Später wird dann der Rafisa Server verwendet.

Auf folgender Webseite findet man alles Nötige um den PHPMailer einzurichten:

http://www.codexworld.com/how-to-send-email-from-localhost-in-php/

Im zweiten Absatz auf den Link zum „PHPMailer from GitHub“ klicken. Nun kann man auf GitHub den PHPMailer als zip herunterladen.

Im Projekt den Ordner _lib erstellen. Den zip-Ordner dann im Projekt in _lib entpacken. Den Ordnernamen von PHPMailer-master auf PHPMailer ändern.

Dann muss man über folgenden Link https://www.google.com/settings/security/lesssecureapps
sich einloggen und „Weniger sichere Apps zulassen“ aktivieren.

Dann muss man den Code von der weiter oben genannten codexworld-Seite ins Projekt in die E-Mail-Funktion kopieren.

Im Code nun den Pfad auf den PHPMailer richtig angeben und bei Username seine Gmail-Adresse eingeben und bei Password das dazugehörige Passwort. Bei addAddress muss man die Empfängeradresse eingeben.

Nun in index.php zum Testen aufrufen.

$mail=newRIOMail();

$mail→sendMail();



Erste E-Mail gesendet



Nun muss der Inhalt der E-Mail aus StockControl übergeben werden und richtig in die E-Mail eingefügt werden.

Wenn der Warenarray in checkStock durchgearbeitet wurde, werden der Warenarray und ein Array mit den Spaltentiteln und die Empfänger-Adresse an die Funktion sendMail übergeben.



In sendMail wird der Inhalt der E-Mail zusammengestellt. Dazu gibt es die Variable bodyContent. Diese wird dann mit folgender Zeile in die E-Mail eingefügt:

$mail→Body =$bodyContent;


Im bodyContent wird nun der Titel eingetragen. Dann werden der Warenarray und der Titelarray in eine HTML-Tabelle eingefügt. In der ersten Zeile wird der Titelarray in einer for-Schleife ausgelesen. Danach folgen die Zeilen mit den Waren. Die Waren werden in einer foreach-Schleife ausgelesen.

Die Betreffzeile der E-Mail gibt man in folgender Zeile ein:

$mail→Subject ='Abweichungen Warenlager';



Wenn der Inhalt eingefügt ist, wird die E-Mail abgesendet. Dann wird überprüft, ob die E-Mail abgesendet werden konnte. Wenn es geklappt hat wird true zurückgegeben sonst false. Zum Test werden Meldungen mit echo ausgegeben.

Bei false wird eine Fehlermeldung ausgegeben:

Bei true:

So sieht nun die E-Mail aus.



- E-Mail in Tabelle Warehousenotification speichern

Wenn die E-Mail abgesendet werden konnte wird sie in die Tabelle Warehousenotification gespeichert.

Um etwas in Warehousenotification speichern zu können muss eine Validations-Klasse dazu erstellt werden. Die Validierung wird im nächsten Kapitel genau erklärt.

Wenn sendMail true zurückgibt wird der Warenarray in Text umformatiert. Dieser wird zusammen mit der Empfänger-Adresse und der User ID an die Funktion saveMail übergeben.

Die Funktion saveMail erzeugt eine neues Objekt von Warehousenotification. Mit der Funktion set werden die übergebenen Werte in die entsprechenden Konstanten gesetzt. Dann wird das Objekt an ein RIODatabase-Objekt übergeben und über diese in der Datenbank gespeichert.



- Validierung von Warehousenotification

Für die Validierung wurde im Ordner validation die Klasse RIOValidateWarehousenotification erstellt. Sie erbt von RIOValidate. Die save-Funktion von RIODatabase braucht die Validationsklasse. In der neuen Klasse werden die an save übergebenen Daten validiert.

Bei allen Daten wird überprüft, ob sie nicht leer sind und ob die Limite von 255 Zeichen eingehalten wurde.



- Zusammenhang der Klassen RIOStockControl und RIOMail

Sequenzdiagramm



- Automatisierter Test

Nun soll das Projekt nach Vorgaben getestet werden. Folgende Szenarien werden getestet.

  • Benachrichtigung bei Lagerunterschreitung
  • Benachrichtigung bei Unterschreitung des minimalen Lagerbestandes
  • Benachrichtigung bei Überschreitung des maximalen Lagerbestandes
  • Korrekter E-Mail Empfang beim Adressaten: ‘i.betschart@rasifa.ch‘



- Randbedingungen

Im XAMPP Control Panel müssen Apache und MySQL gestartet werden. Der Test wird in NetBeans gestartet. Beim Gmail-Konto muss „Weniger sichere Apps zulassen“ aktiviert sein.

Die beiden Tabellen Ware und Stockmovement müssen vor dem Test leer sein.



- Testklasse

Mithilfe einer Testklasse werden einige vorgegebene Waren und Lagerbewegungen in die Datenbank gespeichert. Dann wird RIOStockControl ausgeführt.



erwartete Ergebnisse des Tests

Kennzeichnungsetiketten: Maximum überschritten

Universal Etiketten: im gültigen Bereich, also nicht in E-Mail

Switch: im Minusbereich

Externe Harddisk: Minimum unterschritten



Tatsächliches Ergebnis

E-Mail nach Durchführung des automatischen Tests



- In das Hauptprojekt einbinden

Als erstes die neueste Version des Hauptprojektes herunterladen.

In der Datei RIODatabase die Daten zur Datenbankverbindung anpassen.

Die beiden Dateien RIOMail.php und RIOStockControl aus dem Teilprojekt kopieren und im Hauptprojekt ins business einfügen. In beiden die echos auskommentieren.

Die beiden Dateien Ware.php und Warhousenotifiation.php aus dem Teilprojekt kopieren und im Hauptprojekt in persistence in entity einfügen. Die alte Datei Ware.php im Hauptprojekt löschen.

Den SQL-Dump warehouse.sql auch ins Hauptprojekt kopieren und in persistence data einfügen.

Die Validierungsklasse RIOValidateWarehousenotification.php ins Hauptprojekt in persistence validation einfügen.

In die Bibliothek muss noch der PHP-Mailer.

Nun muss StockControl an der richtigen Stelle erzeugt werden. Folgende zwei Zeilen:

$stockControl=newRIOStockControl();

$stockControl→perform($user);





$filter=[];

$filter[Stockmovement::USER]=$user;

$filter[Stockmovement::INOUTPUT]=$inoutput;

$filter[Stockmovement::FINISHED]=0;


$list=RIODatabase::getInstance()→loadList(Stockmovement::class,$filter);


//Zeilen hier einfügen


RIODatabase::getInstance()→beginTransaction();



Die User-Id wird der Funktion perform übergeben. Dort wird sie zwischengespeichert.

$userId=$user;



Die Logeinträge wie folgt anpassen:

RIOLogHelper::log($ipAddress, $user, RIOLogClass::ACTION, self::class, 'OK');



- Schlusswort

Reflexion. Wie zufrieden. Wo Probleme, wäre bessere Variante möglich gewesen oder warum keine andere möglich.

Schlüsse ziehen aus der Reflexion.

Persönliche Bilanz



- Quellenangaben

  1. Quellen aus Büchern

Was wurde aus welchem Buch verwendet Seite angeben

  1. Quellen aus dem Internet

Internetseite (Aufrufdatum)



- Abbildungsverzeichnis

Abb. 1: Zeitplan. (eigenes Bild).

Abb. 2: …..

  1. Tabellenverzeichnis

Tabelle 1: Arbeitsjournal.

Tabelle 2: …..

  1. Listings

Listing 1: Code aus Datei soundso

Listing 2: ….

  1. Glossar

KA Komplizierte Abkürzung. Erklären was das ist.

  1. Anhang
    1. Technische Anleitung
    2. Sourcecode



11. April 2017 Seite 37 von 37

de.bkp/intern/ipa/ib2017/ipa_ib2017.txt · Zuletzt geändert: 2021/02/08 14:55 von 127.0.0.1