# Haptiplan - UML Diagramme **Autoren:** NM, HB, OK, RM (Ansprechpartner Rico Meiner) **Lizenz:** [CC-BY-SA](https://creativecommons.org/licenses/by-sa/4.0/deed.de) :::spoiler Inhaltsverzeichnis [toc] ::: ## Frontend - Anwendungsfälle Spieler ### Akteure im Unternehmensplanspiel ```plantuml skinparam packageStyle rectangle package Akteure { actor User as U actor Gamemaster as S actor Admin as A } actor Backend as B ``` ```plantuml left to right direction skinparam packageStyle rectangle package Rollen { actor User as U actor Gamemaster as G actor Admin as A } package Unternehmensplanspiel { usecase "Entscheidungen eingeben" as UC1 usecase "Entscheidungen verarbeiten" as UC2 usecase "Spiel/Spieler verwalten" as UC3 usecase "Software administrieren" as UC4 } :U: --> UC1 :G: --> UC2 :G: --> UC3 :A: --> UC4 UC1 --> :Backend: UC2 --> :Backend: UC3 --> :Backend: UC4 --> :Backend: ``` Das Unternehmensplanspiel bietet den Akteuren folgende Möglichkeiten: * Use Case 1 Teilnehmer können Entscheidungen eingeben * Use Case 2 Spielleiter können die eingegebenen Entscheidungen verarbeiten * Use Case 3 Spielleiter kann Spieler sowie Einstellungen des Spiels verwalten * Use Case 4 Administrator kann die gesamte Software verwalten Der Spielleiter kann die Rolle des Spielers einnehmen und die Entscheidungen "überarbeiten". ### Produktion ```plantuml left to right direction skinparam packageStyle rectangle actor Teilnehmer as T actor Backend as B rectangle Produktion{ usecase "Produzierbaremenge eingeben" as UC1 usecase "Auslastung eingeben" as UC2 usecase "Überstunden eingeben" as UC3 } T --> UC1 T --> UC2 T --> UC3 UC1 --> B UC2 --> B UC3 --> B note right of B : Verabeitung der Daten ``` ### Maschinenverwalten ```plantuml left to right direction actor Teilnehmer as T actor Backend as B rectangle Maschinenverwalten{ usecase "Maschinen kaufen" as UC2 usecase "Maschine löschen" as UC1 usecase "Maschine updaten" as UC3 } T -->UC1 T-->UC2 T --> UC3 UC1 --> B UC2 --> B UC3 --> B ``` ### Rohstoffenbeschaffung ```plantuml left to right direction actor Teilnehmer as T actor Lieferant as L rectangle Rohstoffenbeschaffung{ usecase "bestellen" as UC1 } T -- UC1 UC1 -- L ``` ### Login ```plantuml left to right direction actor Teilnehmer as T actor Backend as B rectangle login{ usecase "Login" as UC1 usecase "Authentifizieren" as UC2 usecase "Login \nwiederherstellen" as UC3 note "Condition: Login \n vergessen \nextension point: Login\n wiederherstellen" as N2 } T --> UC1 UC1 ..> UC2 :include N2 .. UC3 UC1 <.. (N2) :extends UC2 --> B UC3 --> B ``` Noch verbessern bzw. übersichtlicher machen! ### Kredit ```plantuml left to right direction actor Teilnehmer as T actor Backend as B rectangle Kredit{ usecase "Kredit anfragen" as UC1 usecase "Kredit tilgen" as UC2 } T --> UC2 T --> UC1 UC1 --> B UC2 --> B ``` ### Wertanlage ```plantuml left to right direction actor Teilnehmer as T actor Backend as B rectangle Wertanlage{ usecase "Wertanlage anlegen" as UC1 usecase "Wertanlage tilgen" as UC2 } UC2 --> B UC1 --> B T --> UC2 T --> UC1 ``` ### Marketing und Werbung ```plantuml left to right direction actor Teilnehmer as T actor Backend as B rectangle Marketing_Werbung { usecase "Werbebudget (pro Markt) setzen" as UC1 usecase "Vertriebsmitarbeiter \n(pro Markt) einstellen" as UC2 usecase "Werbebudget (Aufträge)" as UC3 } UC1 --> B T --> UC1 UC2 --> B T --> UC2 UC3 --> B T --> UC3 ``` Usecase 3 kritisch prüfen! (Werbebudget für Aufträge) ### Forschung und Entwicklung ```plantuml left to right direction actor Teilnehmer as T actor Backend as B rectangle Forschung { usecase "Kompetenzen und Produkte planen" as UC1 usecase "FuE-Personal einstellen" as UC2 usecase "FuE-Personal entlassen" as UC3 } UC1 --> B T --> UC1 UC2 --> B T --> UC2 UC3 --> B T --> UC3 ``` ### Personal ```plantuml left to right direction actor "Teilnehmer" as T actor "Backend" as B rectangle Personal { usecase "Personal einstellen" as UC1 usecase "Personal entlassen" as UC2 usecase "Personal umstationieren" as UC3 usecase "Personal weiterbilden" as UC4 } T --> UC1 T --> UC2 T --> UC3 T --> UC4 UC1 --> B UC2 --> B UC3 --> B UC4 --> B ``` ### Grundstücke ```plantuml left to right direction actor Teilnehmer as T actor Backend as B rectangle Grundstücke { usecase "Grundstück kaufen" as UC1 usecase "Grundstück verkaufen" as UC2 usecase "Grundstück mieten" as UC3 usecase "Grundstücksmiete\nkündigen" as UC4 } T --> UC1 T --> UC2 T --> UC3 T --> UC4 UC1 --> B UC2 --> B UC3 --> B UC4 --> B ``` ### Gebäude ```plantuml left to right direction actor Teilnehmer as T actor Backend as B rectangle Gebäude { usecase "Gebäude kaufen" as UC1 usecase "Gebäude verkaufen" as UC2 usecase "Gebäude mieten" as UC3 usecase "Gebäudemiete kündigen" as UC4 } T --> UC1 T --> UC2 T --> UC3 T --> UC4 UC1 --> B UC2 --> B UC3 --> B UC4 --> B ``` ### GuV-Rechnung ```plantuml left to right direction actor "Teilnehmer" as T actor "Backend" as B rectangle GuV-Rechnung{ usecase "Saldo GuV-Konto\n anzeigen" as UC1 usecase "auf Konto buchen" as UC3 } T<--UC1 UC3-->B UC1<-- B T-->UC3 ``` ### Kommunikation ```plantuml left to right direction actor Unternehmen as U actor Spielleiter as S rectangle Kommunikation{ usecase "Privatnachricht" as UC1 usecase "Nachricht an alle" as UC2 } U <|-- S U --> UC1 S -->UC2 ``` Kommunikation kritisch prüfen. ### Aufträge ```plantuml left to right direction actor Kunde as K actor Unternehmen as U actor Subunternehmen1 as S1 rectangle Aufträge { usecase (Auftrag geben) as UC1 usecase (Auftrag nehmen) as UC2 usecase (Auftrag bearbeiten) as UC3 usecase (Auftrag weiterleiten) as UC4 usecase (Eintragen der Arbeitzeit) as UC5 usecase (Rechnungen erstellen) as UC6 } K -- UC1 UC1 --> U UC2 <-- U UC3 <-- U UC4 <.. UC3: include UC4 --> S1 UC5 <-- S1 UC6 ..> UC5: Uses UC6 <-- U ``` ### Aufträge (neu) ```plantuml left to right direction actor Kunde as K actor Unternehmen as U actor Subunternehmen1 as S1 rectangle Aufträge { usecase (Auftrag geben) as UC1 usecase (Auftrag bearbeiten) as UC3 usecase (Auftrag weiterleiten) as UC4 usecase (Rechnungen erstellen) as UC6 } K -- UC1 UC1 --> U UC4 .left.> UC3: extends UC3 <-left- U UC4 --> S1 UC6 <-- U ``` ## Frontend - Anwendungsfälle Spielleiter - [x] Teilnehmer verwalten - [x] Unternehmen verwalten - [x] Spiel starten - [x] Spiel beenden ### Runde beenden ```plantuml left to right direction actor "Spielleiter" as S actor "Backend" as B actor "Unternehmen 1..n" as U rectangle Runde_beenden { usecase "Entscheidung [Runde beenden]" as UC1 usecase "Entscheidungen anpassen" as UC2 usecase "Runde beenden" as UC3 } UC1 --> B U --> UC1 UC2 --> UC3 UC3 --> B S --> UC2 ``` ### Schlussbilanz :::danger noch zu überarbeiten! ::: ```plantuml left to right direction rectangle Schlussbilanz{ usecase "Schlussbilanz\n anzeigen" as UC1 usecase "Schlussbilanzkonto\n erstellen" as UC2 } UC1<--:Teilnehmer: UC2<..UC1: includes :Backend:-->UC2 ``` ### Eröffnungsbilanz :::danger noch zu überarbeiten! ::: ```plantuml left to right direction rectangle Eröffnungsbilanz{ usecase "Eröffnungsbilanz\n erstellen" as UC1 usecase "Eröffnungsbilanz\n anzeigen" as UC2 } :Backend:-->UC1 UC1<..UC2: includes UC2<--:Teilnehmer: ``` ### Entscheidungen ```plantuml left to right direction rectangle Entscheidungen{ usecase "Beschaffen/\nVerkaufen" as UC1 usecase "Entscheidung \nverwalten" as UC2 usecase "Produktion \nverwalten" as UC4 usecase "Aufträge\nannehmen" as UC5 usecase "Teilaufträge\nunterteilen + abgeben" as UC6 usecase "Marktforschung\nfördern" as UC7 usecase "Werbung schalten" as UC8 usecase "Runde\nabschließen" as UC10 } :Teilnehmer:-->UC2 :Teilnehmer:-->(UC5) :Teilnehmer:-->UC1 :Teilnehmer:-->(UC4) :Teilnehmer:-->(UC7) :Teilnehmer:-->(UC8) :Teilnehmer:-->(UC10) (UC5)<..(UC6): extends (UC10)-->:Backend: UC2-->:Backend: ``` Alle Entscheidung in einem Use Case Diagramm oder jede Entscheidung einzeln. ### Teilnehmer ```plantuml left to right direction actor "Spielleiter" as S actor "Backend" as B rectangle "Teilnehmer verwalten"{ usecase "Teilnehmer erstellen" as UC1 usecase "Teilnehmer löschen" as UC2 usecase "Teilnehmer\nName bearbeiten" as UC3 } S --> UC1 S --> UC2 S --> UC3 UC1 --> B UC2 --> B UC3 --> B ``` ### Unternehmen ```plantuml left to right direction actor "Spielleiter" as S actor "Backend" as B rectangle "Unternehmen verwalten"{ usecase "Unternehmen erstellen" as UC1 usecase "Unternehmen löschen" as UC2 usecase "Teilnehmer hinzufügen" as UC3 usecase "Teilnehmer entfernen" as UC4 } S --> UC1 S --> UC2 S --> UC3 S --> UC4 UC1 --> B UC2 --> B UC3 --> B UC4 --> B ``` ### Spielstart ```plantuml left to right direction actor "Spielleiter" as S actor "Backend" as B rectangle "Spiel starten"{ usecase "Spieler erstellen" as UC1 usecase "Unternehmen erstellen" as UC2 usecase "Spielern ein\nUnternehmen zuweisen" as UC3 usecase "Anfangsbedingungen setzten" as UC4 } S --> UC1 S --> UC2 S --> UC3 S --> UC4 UC1 --> B UC2 --> B UC3 --> B UC4 --> B ``` ### Spielende ```plantuml left to right direction actor "Spielleiter" as S actor "Backend" as B rectangle "Spiel beenden"{ usecase "Entscheidungen/Ergebnisse\nexportieren" as UC1 usecase "Spiel (Unternehmen, Spieler)\nlöschen" as UC2 } S --> UC1 S --> UC2 UC1 --> B UC2 --> B ``` ## Backend - Anwendungsfälle, Use Case - [ ] Eventuell Datenbank und Backend Usecase - [ ] Kommunikation zwischen Backend und Frontend ## Klassendiagramm Dokumentation [Klassendiagramme](https://plantuml.com/de/class-diagram) ### FrontController ```plantuml skinparam style strictuml class Request { - requestedPage: String + setRequestedPage() + getRequestedPage(): String } class Router { - machinecontroller: MachineController + Router() + callController($requestedPage, $method) } class MachineController { + Model + views + addMachine() + updateMachine() + deleteMachine() + displayMachine() + createMachine() + editMachine() + deleteForm() } class Model { State Data } class MachineType { - machine_id: int - machine_name: String - machine_capacity: int - machine_price: double - machine_duration: int - machine_period : int + setId(id: int) + getId():int + setNam(name: String) + getName(): String + setKapazitaet(kapazitaet: int) + getKapazitaet():int + setPreis(preis: double) + getPreis(): double + setLaufzeit(laufzeit: int) + getLaufzeit(): int + setPeriode(periode: int) + getPeriode():int } Request -left--> Router Router --> MachineController MachineController --> Model MachineController --> View View --> Model View --> Router ``` ```plantuml skinparam style strictuml abstract class Decision { - decision_id:int - timestamp: datetime - company_id: int - user_id: int - period_id: int } class Machine implements Decision { - position - decision_type - machine_type_id } class Building implements Decision { - position - decision_type - building_type_id } class EmployeeProduction implements Decision { - decision_type - employee_id } class Raw implements Decision { - postition - decision_type - product_type_id } class Credit implements Decision { - credit_amount - decision_type - credit_type_id } note right of Decision Sets for decision_type - Machine {buy, sell, replace} - Building {buy, sell, rent} - Employee {hire, fire, educate} - Raw {buy, sell, } - Credit {take, repay} end note ``` ### Rechnungswesen ```plantuml skinparam style strictuml class Account { - company_id - period_id - account_id - account_number - account_type - account_level - account_name } note bottom of Account number: Kontonummer type: {Aktiv, Passiv, Aufwand, Ertrag} level: {AV, UV, EK, FK} end note class Balance{ - asset_accounts[] - liability_accounts[] } class ProfitLoss { - profit_accounts[] - loss_accounts[] } class Account_entry{ - account_entry_id - account_number_debit - account_number_credit - account_entry_value } Account *--left Account_entry Balance o-- Account ProfitLoss o-- Account ``` ## Sequenzdiagramme ### Router ```plantuml actor Client Client ++ Client -> index ++ : HTTP request index -> Router ++ : CallController($requested_page, $method) Router -> MachineController ++ : addMachine() MachineController -> Model ++ : createMachine() Model --> MachineController : machine deactivate Model MachineController -> View ++ : rednerView(machine):Response View --> MachineController : viewResponse deactivate View MachineController --> Router : viewResponse deactivate MachineController Router --> index : Response deactivate Router index -> ResponseHandler ++ : sendResponse(response) ResponseHandler --> index : HTTP response deactivate ResponseHandler index --> Client : HTTP response deactivate index deactivate Client ``` ## Json ### Maschine :::spoiler Beispiele noch zu überarbeiten! ```plantuml @startjson { "name": "Holzklopper", "Kapazität": "15", "Preis":"75000" , "id": 1, "Laufzeit" : 3, "Periode" : 4, "TypID" : { "Funktion" : "Säge" } } @endjson ``` ### Stifte(Beispiel) Auftrag 100.000 Stifte ```plantuml @startjson { "Stiftmine": 100.000, "Holzform": 100.000, "Radiergummi" : 100.000, "Preis":"2 Euro", "Teilaufträge" : [ { "Typ" : "Holzverarbeiter", "Stück": "100.000 Formen", "Teilauftrag" : { "Typ" : "Holzlieferant", "Stück" : "5000" } } ] } @endjson ``` ### Pinsel ```plantuml @startjson { "Borsten": { "Typ": "Hof", "Stück": "" }, "Zwinge": 75000, "Stiel": { "Typ": "Säge", "Stück": "75000" }, "Kleber": "", "Preis" : "1€ pro Stück" } @endjson ``` ### Regal Auftrag 500 Regale ```plantuml @startjson { "Auftrag" : "Regale", "Menge" : 500, "UVP" : "200 Euro pro Regal", "Aufgaben" : ["montage", "kleben"], "Vorprodukt" : [ { "Auftrag" : "Brett lackiert dick", "Menge" : 2000, "Aufgaben" : ["fräsen", "lackieren"], "Vorprodukt" : "Brett" }, { "Auftrag" : "Brett dick", "Menge" : 1500, "Aufgaben" : ["fräsen", "lackieren"], "Vorprodukt" : "Brett" }, { "Auftrag" : "Dübel", "Menge" : 10000, "Aufgaben" : ["sägen", "fräsen"], "Vorprodukt" : "Holz" } ] } @endjson ``` ::: ## Datenbanken :::spoiler SQL (Erzeugen der DB) ```sql= create database haptiplan; use haptiplan; CREATE TABLE machinetype ( machine_id INT PRIMARY KEY AUTO_INCREMENT, machine_name VARCHAR(255), machine_capacity INT, machine_price FLOAT, machine_duration INT, machine_period INT ); INSERT INTO machinetype (machine_id, machine_name, machine_capacity, machine_price, machine_duration, machine_period) VALUES (1, 'MachineA', 100, 1500.50, 24, 12), (2, 'MachineB', 75, 1200.75, 18, 8), (3, 'MachineC', 120, 2000.25, 36, 24), (4, 'MachineD', 90, 1800.00, 30, 16), (5, 'MachineE', 150, 2500.80, 48, 20); CREATE TABLE credit ( credit_id INT AUTO_INCREMENT PRIMARY KEY, credit_amount int ); CREATE TABLE building ( building_id INT AUTO_INCREMENT PRIMARY KEY, building_name VARCHAR(255), building_position INT, building_price INT, building_type_id INT ); CREATE TABLE player_building ( player_id INT, building_id INT, FOREIGN KEY (building_id) REFERENCES building(building_id), FOREIGN KEY (building_type_id) REFERENCES building(building_type_id), PRIMARY KEY (player_id, building_id) ); CREATE TABLE employeetype ( employee_id INT AUTO-INCREMENT PRIMARY KEY, employee_name VARCHAR(255), employee_salary INT ); ``` :::