diff --git a/README.md b/README.md index 5ba7934..014d304 100644 --- a/README.md +++ b/README.md @@ -101,7 +101,7 @@ Um Anfragen zu autorisieren, muss jeder Request einen gültigen CSRF-Token entha | `get_dashboard_stats` | Liefert aggregierte Daten (Bürger, Städte, Fahrzeuge, Energie). | - | | `get_active_vehicles_count` | Gibt die Anzahl der aktuell aktiven Fahrzeuge zurück. | - | | `get_citizens_count` | Gibt die Gesamtzahl der Bürger zurück. | - | -| `get_sql_result` | Führt eine spezifische SQL-Datei aus dem `/sql` Ordner aus. | `file` (Dateiname) | +| `get_sql_result` | Führt eine spezifische SQL-Datei nach bestehender API-Logik aus. | `file` (Dateiname, z.B. `getCitizensCount.sql`) | | `get_all_tables` | Gibt alle SQL-Abfrageergebnisse inkl. des SQL-Quellcodes zurück. | - | | `get_sql_files` | Listet den Inhalt aller verfügbaren SQL-Dateien auf. | - | diff --git a/documentation/APs/AP10-Revision-Use-Cases.md b/documentation/APs/AP10-Revision-Use-Cases.md index 91c246c..4ea95ef 100644 --- a/documentation/APs/AP10-Revision-Use-Cases.md +++ b/documentation/APs/AP10-Revision-Use-Cases.md @@ -38,7 +38,7 @@ Für AP10 bedeutet das: Die Use Cases werden nicht mehr aus allen vorhandenen Pr | Use Case | Konkrete Handlung eines Nutzers mit dem System innerhalb eines Businessprozesses. | | SQL-Query / Stored Procedure | Technische Unterstützung, um Daten für einen Use Case bereitzustellen. | -Wichtig: SQL-Queries sind keine eigenen Use Cases. Eine SQL-Datei wie `getRessourcesBelowMin.sql` ist also nicht der Use Case selbst, sondern unterstützt den Use Case „Kritische Ressourcen anzeigen“ technisch. +Wichtig: SQL-Queries sind keine eigenen Use Cases. Eine SQL-Datei wie `sql/queries/bp1/getRessourcesBelowMin.sql` ist also nicht der Use Case selbst, sondern unterstützt den Use Case „Kritische Ressourcen anzeigen“ technisch. Beispiel: diff --git "a/documentation/APs/AP11-BPMN-Modellierung-BP1-Kritische Ressourcen\303\234berwachenUndNachschubAusl\303\266sen.md" "b/documentation/APs/AP11-BPMN-Modellierung-BP1-Kritische Ressourcen\303\234berwachenUndNachschubAusl\303\266sen.md" index 7ebb926..f4d6a60 100644 --- "a/documentation/APs/AP11-BPMN-Modellierung-BP1-Kritische Ressourcen\303\234berwachenUndNachschubAusl\303\266sen.md" +++ "b/documentation/APs/AP11-BPMN-Modellierung-BP1-Kritische Ressourcen\303\234berwachenUndNachschubAusl\303\266sen.md" @@ -66,6 +66,14 @@ Relevante Datenbankaufgaben: | interne Verfügbarkeit prüfen | Lager oder Produktion auswerten | | Bestand aktualisieren | neue Werte speichern | +Konkret umgesetzte Stored Procedures für BP1: + +| Stored Procedure | Prozessschritt | Ergebnis | +|---|---|---| +| `sql/storedProcedure/bp1/getRessourcesBelowMin.sql` | Mindestbestand vergleichen | zeigt kritische Ressourcen inklusive Fehlmenge und Handlungspriorität | +| `sql/storedProcedure/bp1/getRessourcesAtRisk.sql` | Ablaufdatum prüfen | zeigt abgelaufene oder bald ablaufende Ressourcen mit empfohlener Maßnahme | +| `sql/storedProcedure/bp1/getNachschubanforderungen.sql` | Bedarf berechnen und interne Verfügbarkeit prüfen | erstellt eine fachliche Nachschubliste mit Anforderungsmenge, Grund und Maßnahme | + --- ## Bezug zur Webanwendung @@ -96,9 +104,9 @@ Der Prozess ist fachlich sinnvoll, wirtschaftlich relevant und gut für eine dat | Punkt | Status | |---|---| -| Feedback von Prof. Dr. Becking einarbeiten | in Bearbeitung | -| SQL-Abfragen konkret zuordnen | offen | -| Stored Procedures planen | offen | +| Feedback von Prof. Dr. Becking einarbeiten | erledigt | +| SQL-Abfragen konkret zuordnen | erledigt | +| Stored Procedures planen | erledigt | | BPMN-Modell final prüfen | offen | | BPMN-Grafik in Projektdokumentation einfügen | vorbereitet | diff --git a/documentation/APs/AP11-BPMN-Modellierung-BP2-Ueberschuessige-Ressourcen-an-externe-Unternehmen-verkaufen.md b/documentation/APs/AP11-BPMN-Modellierung-BP2-Ueberschuessige-Ressourcen-an-externe-Unternehmen-verkaufen.md index 19e3d5e..5cbab4f 100644 --- a/documentation/APs/AP11-BPMN-Modellierung-BP2-Ueberschuessige-Ressourcen-an-externe-Unternehmen-verkaufen.md +++ b/documentation/APs/AP11-BPMN-Modellierung-BP2-Ueberschuessige-Ressourcen-an-externe-Unternehmen-verkaufen.md @@ -67,6 +67,14 @@ Relevante Datenbankaufgaben: | Sicherheitsreserve berücksichtigen | interne Versorgung nicht gefährden | | Verkaufspotenzial vorbereiten | wirtschaftliche Entscheidung fachlich unterstützen | +Konkret umgesetzte Stored Procedures für BP2: + +| Stored Procedure | Prozessschritt | Ergebnis | +|---|---|---| +| `sql/storedProcedure/bp2/getRessourcenUeberschuss.sql` | Überschuss erkennen und Sicherheitsreserve prüfen | zeigt verkaufbare Mengen mit 7-Sol-Sicherheitspuffer und Überschuss-Status | +| `sql/storedProcedure/bp2/getVerkaufspotenzial.sql` | Verkaufspotenzial bewerten | verbindet berechnete Überschüsse mit vorhandenen Überschussbewertungen und empfohlener Maßnahme | +| `sql/storedProcedure/bp2/getExterneAbgabeVorbereitung.sql` | externe Abgabe vorbereiten | zeigt vorbereitete Verkäufe mit Unternehmen, Positionen, Werten und Abgabe-Status | + --- ## Bezug zur Webanwendung @@ -99,9 +107,9 @@ Der Prozess ist fachlich sinnvoll, weil er den wirtschaftlichen Nutzen der Marsk |---|---| | BPMN-Modell erstellen | offen | | BPMN-Grafik in Projektdokumentation einfügen | offen | -| SQL-Abfragen konkret zuordnen | offen | -| Prüfen, ob spätere Verkaufstabellen benötigt werden | offen | -| Feedback von Prof. Dr. Becking einarbeiten | offen | +| SQL-Abfragen konkret zuordnen | erledigt | +| Prüfen, ob spätere Verkaufstabellen benötigt werden | erledigt | +| Feedback von Prof. Dr. Becking einarbeiten | erledigt | --- diff --git a/documentation/APs/AP4-Auswahl-Case-Study.md b/documentation/APs/AP4-Auswahl-Case-Study.md index b59332b..2de368f 100644 --- a/documentation/APs/AP4-Auswahl-Case-Study.md +++ b/documentation/APs/AP4-Auswahl-Case-Study.md @@ -12,15 +12,15 @@ Damit ist die Case Study fachlich passend für ein Datenbankanwendungsprojekt, w | Geschäftsbereich | Bedeutung in der Marskolonie | Bezug zur aktuellen Repo | |---|---|---| -| Ressourcenmanagement | Kontrolle von Sauerstoff, Wasser, Treibstoff, Nahrung, Ersatzteilen und Baumaterialien | `getRessourcenWithLager.sql`, `getRessourcesBelowMin.sql`, `getRessourcesAtRisk.sql`, `getRessourceLog.sql` | -| Lagerverwaltung | Überwachung von Lagerorten, Kapazitäten und kritischen Beständen | `getAllLager.sql`, `getStorageResourceSummary.sql`, `getLagerVersorgungAtRisk.sql` | -| Transportlogistik | Planung und Kontrolle von Transportwegen zwischen Städten/Sektoren | `getMissionsBericht.sql`, `getCitiesWithoutTransportConnection.sql` | -| Flottenmanagement | Kontrolle aktiver/inaktiver Fahrzeuge und Raumfahrzeuge | `getActiveVehicles.sql`, `getFlotte.sql`, `getVehiclesByStatus.sql`, `getLowTreibstoff.sql` | -| Energieversorgung | Überwachung aktueller Energieerzeugung und Versorgungslücken | `getCurrentEnergieLeistung.sql`, `getEnergySourcesByCity.sql`, `getCitiesWithoutEnergySource.sql` | -| Stadtverwaltung | Verwaltung von Städten, Koordinaten, Einwohnerzahlen und Infrastruktur | `getCitiesWithStats.sql`, `getCitiesWithKoords.sql`, `getCitiesCount.sql` | -| Bewohnerverwaltung | Verwaltung der Koloniebewohner und ihrer Zuordnung zu Städten/Adressen | `getAllCitizens.sql`, `getAllCitizensByName.sql`, `getBewohnerAtAddress.sql`, `getResidentCountByAddress.sql` | -| Personalverwaltung | Verwaltung von Mitarbeitern, Rollen, Berufen, Abteilungen und Gehältern | `getAllEmployees.sql`, `getEmployeeProfile.sql`, `getMitarbeiterRolle.sql`, `getMitarbeiterByBeruf.sql`, `getAvgWorkTimeByBeruf.sql` | -| Abteilungs- und Ressourcenabhängigkeit | Analyse, welche Abteilungen von welchen Ressourcen abhängig sind | `getDepartmentResourceDependencies.sql`, `getDepartmentsWithLeaders.sql`, `getEmployeeCountByDepartment.sql` | +| Ressourcenmanagement | Kontrolle von Sauerstoff, Wasser, Treibstoff, Nahrung, Ersatzteilen und Baumaterialien | `sql/queries/shared/getRessourcenWithLager.sql`, `sql/queries/bp1/getRessourcesBelowMin.sql`, `sql/queries/bp1/getRessourcesAtRisk.sql`, `sql/queries/general/getRessourceLog.sql` | +| Lagerverwaltung | Überwachung von Lagerorten, Kapazitäten und kritischen Beständen | `sql/queries/general/getAllLager.sql`, `sql/queries/shared/getStorageResourceSummary.sql`, `sql/queries/general/getLagerVersorgungAtRisk.sql` | +| Transportlogistik | Planung und Kontrolle von Transportwegen zwischen Städten/Sektoren | `sql/queries/general/getMissionsBericht.sql`, `sql/queries/general/getCitiesWithoutTransportConnection.sql` | +| Flottenmanagement | Kontrolle aktiver/inaktiver Fahrzeuge und Raumfahrzeuge | `sql/queries/general/getActiveVehicles.sql`, `sql/queries/general/getFlotte.sql`, `sql/queries/general/getVehiclesByStatus.sql`, `sql/queries/general/getLowTreibstoff.sql` | +| Energieversorgung | Überwachung aktueller Energieerzeugung und Versorgungslücken | `sql/queries/general/getCurrentEnergieLeistung.sql`, `sql/queries/general/getEnergySourcesByCity.sql`, `sql/queries/general/getCitiesWithoutEnergySource.sql` | +| Stadtverwaltung | Verwaltung von Städten, Koordinaten, Einwohnerzahlen und Infrastruktur | `sql/queries/general/getCitiesWithStats.sql`, `sql/queries/general/getCitiesWithKoords.sql`, `sql/queries/general/getCitiesCount.sql` | +| Bewohnerverwaltung | Verwaltung der Koloniebewohner und ihrer Zuordnung zu Städten/Adressen | `sql/queries/general/getAllCitizens.sql`, `sql/queries/general/getAllCitizensByName.sql`, `sql/queries/general/getBewohnerAtAddress.sql`, `sql/queries/general/getResidentCountByAddress.sql` | +| Personalverwaltung | Verwaltung von Mitarbeitern, Rollen, Berufen, Abteilungen und Gehältern | `sql/queries/general/getAllEmployees.sql`, `sql/queries/general/getEmployeeProfile.sql`, `sql/queries/general/getMitarbeiterRolle.sql`, `sql/queries/general/getMitarbeiterByBeruf.sql`, `sql/queries/general/getAvgWorkTimeByBeruf.sql` | +| Abteilungs- und Ressourcenabhängigkeit | Analyse, welche Abteilungen von welchen Ressourcen abhängig sind | `sql/queries/general/getDepartmentResourceDependencies.sql`, `sql/queries/general/getDepartmentsWithLeaders.sql`, `sql/queries/general/getEmployeeCountByDepartment.sql` | ## Geschäftsmodell @@ -71,7 +71,7 @@ Die folgenden Use Cases leiten sich aus der Case Study und den vorhandenen SQL-A |---|---| | Primärer Akteur | Logistikoffizier | | Ziel | Kritische Ressourcen frühzeitig erkennen | -| Repo-Bezug | `getRessourcesBelowMin.sql`, `getRessourcenWithLager.sql`, `getStorageResourceSummary.sql` | +| Repo-Bezug | `sql/queries/bp1/getRessourcesBelowMin.sql`, `sql/queries/shared/getRessourcenWithLager.sql`, `sql/queries/shared/getStorageResourceSummary.sql` | | WebApp-Bezug | `Ressources` | | Wirtschaftlicher Nutzen | Vermeidung von Notfalllieferungen und Produktionsausfällen | @@ -99,7 +99,7 @@ Das System zeigt alle Ressourcen an, deren Bestand kritisch ist. Dadurch kann di |---|---| | Primärer Akteur | Infrastrukturmanager | | Ziel | Lager und Energiequellen auf Risiko prüfen | -| Repo-Bezug | `getLagerVersorgungAtRisk.sql`, `getCurrentEnergieLeistung.sql`, `getEnergySourcesByCity.sql`, `getCitiesWithoutEnergySource.sql` | +| Repo-Bezug | `sql/queries/general/getLagerVersorgungAtRisk.sql`, `sql/queries/general/getCurrentEnergieLeistung.sql`, `sql/queries/general/getEnergySourcesByCity.sql`, `sql/queries/general/getCitiesWithoutEnergySource.sql` | | WebApp-Bezug | `Overview`, `Cities`, `Ressources` | | Wirtschaftlicher Nutzen | Schutz kritischer Infrastruktur und Vermeidung teurer Ausfälle | @@ -127,7 +127,7 @@ Kritische Infrastruktur wird sichtbar. Das reduziert das Risiko, dass Lager, St |---|---| | Primärer Akteur | Flottenmanager | | Ziel | Einsatzbereitschaft von Fahrzeugen und Raumfahrzeugen prüfen | -| Repo-Bezug | `getActiveVehicles.sql`, `getFlotte.sql`, `getVehiclesByStatus.sql`, `getLowTreibstoff.sql` | +| Repo-Bezug | `sql/queries/general/getActiveVehicles.sql`, `sql/queries/general/getFlotte.sql`, `sql/queries/general/getVehiclesByStatus.sql`, `sql/queries/general/getLowTreibstoff.sql` | | WebApp-Bezug | `Vehicles` | | Wirtschaftlicher Nutzen | bessere Fahrzeugauslastung, weniger Leerlauf, geringere Missionskosten | @@ -156,7 +156,7 @@ Die Kolonie erkennt, welche Fahrzeuge einsatzbereit sind und welche nicht. Missi |---|---| | Primärer Akteur | Missionsplaner | | Ziel | Laufende und abgeschlossene Transporte nachvollziehen | -| Repo-Bezug | `getMissionsBericht.sql`, `getCitiesWithoutTransportConnection.sql`, `getRessourceLog.sql` | +| Repo-Bezug | `sql/queries/general/getMissionsBericht.sql`, `sql/queries/general/getCitiesWithoutTransportConnection.sql`, `sql/queries/general/getRessourceLog.sql` | | WebApp-Bezug | `Overview`, später mögliche Seite `Missions` | | Wirtschaftlicher Nutzen | geringere Transportkosten und bessere Versorgungssicherheit | @@ -184,7 +184,7 @@ Transporte werden nachvollziehbar. Städte ohne Verbindung werden erkannt. Dadur |---|---| | Primärer Akteur | Kolonieverwaltung | | Ziel | Städte, Bewohnerzahlen und Adressdaten verwalten | -| Repo-Bezug | `getCitiesWithStats.sql`, `getCitiesWithKoords.sql`, `getCitizensCount.sql`, `getAllCitizens.sql`, `getBewohnerAtAddress.sql`, `getResidentCountByAddress.sql` | +| Repo-Bezug | `sql/queries/general/getCitiesWithStats.sql`, `sql/queries/general/getCitiesWithKoords.sql`, `sql/queries/general/getCitizensCount.sql`, `sql/queries/general/getAllCitizens.sql`, `sql/queries/general/getBewohnerAtAddress.sql`, `sql/queries/general/getResidentCountByAddress.sql` | | WebApp-Bezug | `Cities`, `Citizens`, `city/:name` | | Wirtschaftlicher Nutzen | bessere Ressourcenverteilung pro Stadt und Bevölkerungsgruppe | @@ -212,7 +212,7 @@ Die Kolonie erkennt, wo viele Bewohner leben und welche Städte besondere Versor |---|---| | Primärer Akteur | Personalverwaltung | | Ziel | Mitarbeiter, Rollen, Berufe und Abteilungen auswerten | -| Repo-Bezug | `getAllEmployees.sql`, `getEmployeeProfile.sql`, `getMitarbeiterRolle.sql`, `getMitarbeiterByBeruf.sql`, `getAvgWorkTimeByBeruf.sql`, `getDepartmentsWithLeaders.sql`, `getEmployeeCountByDepartment.sql` | +| Repo-Bezug | `sql/queries/general/getAllEmployees.sql`, `sql/queries/general/getEmployeeProfile.sql`, `sql/queries/general/getMitarbeiterRolle.sql`, `sql/queries/general/getMitarbeiterByBeruf.sql`, `sql/queries/general/getAvgWorkTimeByBeruf.sql`, `sql/queries/general/getDepartmentsWithLeaders.sql`, `sql/queries/general/getEmployeeCountByDepartment.sql` | | WebApp-Bezug | `Employees` | | Wirtschaftlicher Nutzen | effizientere Personalplanung und geringere Fehlbesetzung | @@ -240,7 +240,7 @@ Personal wird nicht isoliert betrachtet, sondern als Teil der Kolonie-Logistik. |---|---| | Primärer Akteur | Betriebsleitung | | Ziel | Erkennen, welche Abteilungen von welchen Ressourcen abhängig sind | -| Repo-Bezug | `getDepartmentResourceDependencies.sql` | +| Repo-Bezug | `sql/queries/general/getDepartmentResourceDependencies.sql` | | WebApp-Bezug | später `Departments` oder Dashboard-Erweiterung | | Wirtschaftlicher Nutzen | bessere Priorisierung knapper Ressourcen | diff --git a/documentation/APs/AP8-Auswahl-DBMS-Infrastruktur-Prototyp.md b/documentation/APs/AP8-Auswahl-DBMS-Infrastruktur-Prototyp.md index f057045..f14e857 100644 --- a/documentation/APs/AP8-Auswahl-DBMS-Infrastruktur-Prototyp.md +++ b/documentation/APs/AP8-Auswahl-DBMS-Infrastruktur-Prototyp.md @@ -20,8 +20,8 @@ Diese Datei ist eine vorläufige Zuarbeit für Tom Coombs / CyZeTLC. Sie fasst z | Server / Hosting | In der Spezifikation wird ein VPS als Serverbetrieb genannt. In der WebApp sind produktionsnahe API-URLs zu einer externen Domain sichtbar. | Der genaue Servertyp und Anbieter sind im Repository nicht vollständig dokumentiert. | Hosting-Anbieter, VPS-Konfiguration und Betriebsumgebung ergänzen. | | API-Anbindung | Eine PHP-API im Ordner `api/` ist vorhanden. Sie liefert JSON-Antworten und nutzt CSRF-Schutz. | Die API lädt SQL-Dateien und führt sie über eine serverseitige Datenbankverbindung aus. | Finale Beschreibung der API-Struktur und produktiven Pfade bestätigen. | | WebApp-Anbindung | Die WebApp ist als React/TypeScript/Vite-Anwendung aufgebaut. Sie ruft Daten über serverseitige API-Funktionen ab. | Seiten wie Dashboard, Ressourcen, Fahrzeuge, Mitarbeitende, Städte, Bewohner und SQL-Übersicht sind im Routing erkennbar. Im aktuellen Fokus sind vor allem Ressourcen- und Lagerdaten relevant. | Bestätigen, welche Seiten für AP8 als Infrastrukturbezug genannt werden sollen. | -| SQL-Dateien | Im Ordner `sql/` sind zahlreiche SQL-Abfragen vorhanden. Zusätzlich existieren Build-Skripte und ein Ordner für Stored Procedures. | Die SQL-Dateien unterstützen viele fachliche Auswertungen. Für die aktuelle Revision stehen Ressourcen-, Lager- und Bestandsabfragen im Vordergrund. | Prüfen, welche Abfragen in der finalen Abgabe tatsächlich verwendet werden. | -| Stored Procedures | Ein Ordner `sql/storedProcedure/` ist vorhanden und enthält viele gleichnamige SQL-Dateien zu den Abfragen. | Der genaue produktive Einsatz als Stored Procedures sollte noch bestätigt werden. | Stored-Procedures-Stand und Einbindung ergänzen. | +| SQL-Dateien | Im Ordner `sql/queries/` sind die normalen SQL-Abfragen nach `bp1/`, `bp2/`, `shared/` und `general/` gegliedert. Zusätzlich existieren Build-Skripte. | Die SQL-Dateien unterstützen viele fachliche Auswertungen. Für die aktuelle Revision stehen Ressourcen-, Lager- und Bestandsabfragen im Vordergrund. | Prüfen, welche Abfragen in der finalen Abgabe tatsächlich verwendet werden. | +| Stored Procedures | Der Ordner `sql/storedProcedure/` ist vorhanden und für den aktuellen Fokus in `bp1/`, `bp2/`, `shared/` und `general/` gegliedert. | Die prozessbezogenen Stored Procedures sind dadurch eindeutig den zwei Hauptprozessen zugeordnet. | Produktive Einbindung über API weiter prüfen. | | Zugangsdaten / Konfiguration | Eine Konfigurationsdatei für die Datenbankanbindung ist vorhanden. | Aus Sicherheitsgründen werden keine Zugangsdaten, Passwörter, Tokens oder privaten Konfigurationswerte dokumentiert. | Tom ergänzt nur allgemeine, freigabefähige Angaben. | | Deployment / Betrieb | Die Dokumentation beschreibt lokale Entwicklung mit Vite und PHP sowie eine vorhandene Serverumgebung. | Der konkrete Deployment-Prozess ist nicht vollständig aus den gelesenen Dateien ableitbar. | Deployment-, Backup- und Betriebskonzept ergänzen. | | Dokumentation | README, Dokumentations-README und Spezifikation beschreiben WebApp, PHP-API, SQL-Dateien und Datenbankbezug. | Die Dokumentation enthält teils unterschiedliche Hinweise zu Oracle, MySQL und MariaDB. | Finale technische Linie vereinheitlichen. | diff --git a/documentation/README.md b/documentation/README.md index 47bad27..2f097bf 100644 --- a/documentation/README.md +++ b/documentation/README.md @@ -94,10 +94,10 @@ Generiert einen neuen CSRF-Token. ``` #### 2. get_sql_result -Führt eine spezifische SQL-Datei aus und gibt das Ergebnis zurück. +Führt eine spezifische SQL-Datei nach bestehender API-Logik aus und gibt das Ergebnis zurück. **Parameter:** -- `file`: Name der SQL-Datei (z.B. "getCitizensCount.sql") +- `file`: Dateiname der SQL-Datei, z.B. `getCitizensCount.sql` **Antwort:** ```json diff --git a/documentation/datenbankabfragen-v2.md b/documentation/datenbankabfragen-v2.md index e53aa2a..6e73d63 100644 --- a/documentation/datenbankabfragen-v2.md +++ b/documentation/datenbankabfragen-v2.md @@ -31,16 +31,20 @@ Für die Präsentation und weitere Dokumentation sollen deshalb nur die Abfragen ## 2. Relevante Abfragen nach Businessprozess +Die normalen SELECT-Abfragen liegen unter `sql/queries/`. Dort trennt die Ordnerstruktur zwischen `bp1/`, `bp2/`, `shared/` und `general/`. Die Stored-Procedure-Versionen liegen getrennt davon unter `sql/storedProcedure/` mit derselben fachlichen Gliederung. Dadurch bleibt klar erkennbar, welche Dateien Prozesslogik für BP1, Prozesslogik für BP2, gemeinsame Ressourcenlogik oder allgemeine WebApp-Abfragen enthalten. + | Businessprozess | Relevante Abfragen / Tabellen | Zweck | |---|---|---| -| Kritische Ressourcen überwachen und Nachschub auslösen | `getRessourcesBelowMin.sql`, `getRessourcenWithLager.sql`, `getStorageResourceSummary.sql`, `getRessourcesAtRisk.sql` | Bestände anzeigen, kritische Ressourcen erkennen, Lagerbezug prüfen und Nachschubbedarf ableiten. | -| Überschüssige Ressourcen an externe Unternehmen verkaufen | `getRessourcenWithLager.sql`, `getStorageResourceSummary.sql`, `EXTERNES_UNTERNEHMEN`, `RESSOURCEN_UEBERSCHUSS_BEWERTUNG`, `RESSOURCEN_VERKAUF`, `RESSOURCEN_VERKAUF_POSITION` | Überschüsse fachlich bewerten und eine externe Abgabe vorbereiten. | +| Kritische Ressourcen überwachen und Nachschub auslösen | `sql/queries/bp1/getRessourcesBelowMin.sql`, `sql/queries/bp1/getRessourcesAtRisk.sql`, `sql/queries/bp1/getNachschubanforderungen.sql`, `sql/queries/shared/getRessourcenWithLager.sql`, `sql/queries/shared/getStorageResourceSummary.sql` | Bestände anzeigen, kritische Ressourcen erkennen, ablaufende Bestände bewerten, Lagerbezug prüfen und Nachschubbedarf als fachliche Anforderung ableiten. | +| Überschüssige Ressourcen an externe Unternehmen verkaufen | `sql/queries/bp2/getRessourcenUeberschuss.sql`, `sql/queries/bp2/getVerkaufspotenzial.sql`, `sql/queries/bp2/getExterneAbgabeVorbereitung.sql`, `EXTERNES_UNTERNEHMEN`, `RESSOURCEN_UEBERSCHUSS_BEWERTUNG`, `RESSOURCEN_VERKAUF`, `RESSOURCEN_VERKAUF_POSITION` | Überschüsse erkennen, Sicherheitsreserve berücksichtigen, Verkaufspotenzial bewerten und externe Abgabe fachlich vorbereiten. | --- ## 3. Abfragen für Prozess 1 -### 3.1 `getRessourcesBelowMin.sql` +Für Prozess 1 liegen die wichtigsten Abfragen zusätzlich als Stored Procedures im Ordner `sql/storedProcedure/bp1/` vor. Die gleichnamigen Dateien im Ordner `sql/queries/bp1/` bleiben als SELECT-Spiegel für die fachliche Dokumentation und spätere Einbindung erhalten. Prozessübergreifende Ressourcenübersichten liegen in `sql/queries/shared/` und `sql/storedProcedure/shared/`. Damit passt die Datenbanklogik zum Feedback aus dem Projektproposal: Die Anwendung soll fachliche Datenbankfunktionen kontrolliert über Procedures nutzen, statt Prozesslogik frei in der Oberfläche zu verteilen. + +### 3.1 `sql/queries/bp1/getRessourcesBelowMin.sql` **Zweck** Diese Abfrage erkennt Ressourcen, deren aktuelle Menge unter dem definierten Mindestbestand liegt. @@ -58,14 +62,16 @@ Die Kolonieleitung kann sehen, welche Ressourcen kritisch sind und bei welchen B | Ressource | Welche Ressource ist betroffen? | | Menge | Wie viel ist aktuell vorhanden? | | Mindestbestand | Ab wann wird die Ressource kritisch? | +| Fehlmenge | Wie groß ist die Lücke bis zum Mindestbestand? | | Lagerbezug | Wo befindet sich die Ressource? | +| Handlungspriorität | Wie dringend muss die Ressource geprüft werden? | **Bezug zum Businessprozess** Diese Abfrage ist der zentrale technische Einstieg für Prozess 1. Wenn eine Ressource unter dem Mindestbestand liegt, wird der fachliche Ablauf zur Prüfung und Nachschubvorbereitung ausgelöst. --- -### 3.2 `getRessourcenWithLager.sql` +### 3.2 `sql/queries/shared/getRessourcenWithLager.sql` **Zweck** Diese Abfrage zeigt, welche Ressourcen in welchem Lager vorhanden sind. @@ -93,7 +99,7 @@ Für Prozess 1 hilft die Abfrage bei der Prüfung interner Verfügbarkeit. Für --- -### 3.3 `getStorageResourceSummary.sql` +### 3.3 `sql/queries/shared/getStorageResourceSummary.sql` **Zweck** Diese Abfrage fasst Lagerbestände zusammen und zeigt pro Lager, wie viele Ressourcen und Mengen vorhanden sind. @@ -123,10 +129,10 @@ Für Prozess 1 unterstützt die Abfrage die Übersicht über verfügbare Lagerre --- -### 3.4 `getRessourcesAtRisk.sql` +### 3.4 `sql/queries/bp1/getRessourcesAtRisk.sql` **Zweck** -Diese Abfrage erkennt Ressourcen, deren Ablaufdatum bald erreicht wird. +Diese Abfrage erkennt Ressourcen, deren Ablaufdatum bald erreicht oder bereits überschritten wurde. **Unterstützter Use Case** Kritische Ressourcen anzeigen @@ -140,13 +146,46 @@ Eine Ressource kann nicht nur wegen zu geringer Menge kritisch sein, sondern auc |---|---| | Ressource | welche Ressource betroffen ist | | Ablaufdatum | wann die Ressource kritisch wird | +| Tage bis Ablauf | wie dringend der Bestand behandelt werden muss | | Lager-ID | wo die Ressource liegt | +| Risikostatus | ob der Bestand abgelaufen ist oder bald abläuft | +| empfohlene Maßnahme | fachliche Reaktion, zum Beispiel Verbrauch planen oder Ersatz prüfen | **Bezug zum Businessprozess** Die Abfrage unterstützt Prozess 1, weil sie zusätzliche Risiken im Bestand sichtbar macht. Sie ist nicht der Hauptauslöser für Nachschub, aber eine sinnvolle Ergänzung für die Ressourcenüberwachung. --- +### 3.5 `sql/queries/bp1/getNachschubanforderungen.sql` + +**Zweck** +Diese Abfrage und die gleichnamige Stored Procedure erstellen eine fachliche Nachschubliste für Prozess 1. Sie berechnen, für welche Ressourcen eine Nachschubanforderung vorbereitet werden soll. + +**Unterstützter Use Case** +Nachschubbedarf erkennen + +**Fachliche Bedeutung** +Die Datenbanklogik verbindet Mindestbestand, aktuelle Menge, Verbrauch pro Sol, Ablaufstatus und Lagerbezug. Dadurch entsteht keine blinde Bestellung, sondern eine begründete Entscheidungsgrundlage für interne Umlagerung oder externen Nachschub. + +**Benötigte Daten** + +| Datenfeld | Bedeutung | +|---|---| +| Nachschubanforderung-ID | nachvollziehbare Kennung für die vorbereitete Anforderung | +| Ressource und Lager | welche Ressource an welchem Ort betroffen ist | +| aktuelle Menge | aktueller Bestand | +| Mindestbestand | fachliche Reservegrenze | +| Verbrauch pro Sol | Grundlage für einen 7-Sol-Sicherheitspuffer | +| Anforderungsmenge | berechnete Menge, die vorbereitet werden soll | +| intern verfügbare Menge | mögliche interne Deckung durch andere Bestände desselben Ressourcentyps | +| Anforderungsgrund | warum Nachschub vorbereitet wird | +| empfohlene Maßnahme | interne Umlagerung prüfen oder externen Nachschub anfordern | + +**Bezug zum Businessprozess** +Diese Abfrage bildet zusammen mit der Stored Procedure den fachlichen Schritt „Bedarf berechnen und interne Verfügbarkeit prüfen“ aus dem BPMN-Prozess ab. Sie erzeugt keine vollautomatische Bestellung, sondern bereitet eine prüfbare Nachschubentscheidung vor. Das entspricht der Abgrenzung aus AP10 und AP13. + +--- + ## 4. Datenbankstrukturen für Prozess 2 Für den Prozess „Überschüssige Ressourcen an externe Unternehmen verkaufen“ reichen reine Ressourcen- und Lagerabfragen nicht vollständig aus. Deshalb wurden neue Tabellen ergänzt, die den Verkaufsprozess fachlich vorbereiten. @@ -162,7 +201,103 @@ Diese Tabellen sind keine vollständige Abrechnungslösung. Sie dienen dazu, Üb --- -## 5. Beispielhafte Daten für Prozess 2 +## 5. Abfragen für Prozess 2 + +Für Prozess 2 liegen die wichtigsten Abfragen ebenfalls als Stored Procedures im Ordner `sql/storedProcedure/bp2/` vor. Die gleichnamigen Dateien im Ordner `sql/queries/bp2/` bleiben als SELECT-Spiegel für die fachliche Dokumentation und spätere Einbindung erhalten. + +### 5.1 `sql/queries/bp2/getRessourcenUeberschuss.sql` + +**Zweck** +Diese Abfrage erkennt Ressourcen, deren aktuelle Menge oberhalb der fachlichen Mindestreserve liegt. + +**Unterstützter Use Case** +Überschüssige Ressourcen anzeigen + +**Fachliche Bedeutung** +Die Abfrage verhindert, dass Ressourcen nur nach aktueller Menge bewertet werden. Stattdessen wird eine Sicherheitsreserve berücksichtigt, damit die interne Versorgung der Kolonie nicht gefährdet wird. + +**Berechnungslogik** + +```text +Mindestreserve = Mindestbestand + Verbrauch pro Sol * 7 +verkaufbare Menge = aktuelle Menge - Mindestreserve +``` + +**Benötigte Daten** + +| Datenfeld | Bedeutung | +|---|---| +| Ressource und Lager | welche Ressource an welchem Ort bewertet wird | +| aktuelle Menge | vorhandener Bestand | +| Mindestschwellenwert | interne Reservegrenze | +| Verbrauch pro Sol | Grundlage für den 7-Sol-Sicherheitspuffer | +| Mindestreserve | Bestand, der intern erhalten bleiben soll | +| verkaufbare Menge | Menge, die fachlich als Überschuss gelten kann | +| Überschuss-Status | Einordnung, ob eine Freigabe nötig ist | +| empfohlene Maßnahme | nächster fachlicher Schritt | + +**Bezug zum Businessprozess** +Diese Abfrage bildet den Schritt „Überschuss vorhanden?“ aus dem BP2-Prozess ab. + +--- + +### 5.2 `sql/queries/bp2/getVerkaufspotenzial.sql` + +**Zweck** +Diese Abfrage bewertet mögliche Überschüsse im Zusammenhang mit vorhandenen Überschussbewertungen. + +**Unterstützter Use Case** +Verkaufspotenzial bewerten + +**Fachliche Bedeutung** +Die Abfrage verbindet berechnete Überschüsse mit der Tabelle `RESSOURCEN_UEBERSCHUSS_BEWERTUNG`. Dadurch wird sichtbar, ob ein Überschuss nur rechnerisch vorhanden ist oder bereits fachlich freigegeben wurde. + +**Benötigte Daten** + +| Datenfeld | Bedeutung | +|---|---| +| verkaufbare Menge | mögliche externe Abgabemenge | +| Mindestreserve | intern gesicherter Bestand | +| Bewertung-ID | vorhandene fachliche Bewertung | +| Bewertungsstatus | zum Beispiel freigegeben | +| Begründung | warum eine externe Abgabe möglich ist | +| Verkaufspotenzial-Status | fachliche Einordnung der Verkaufsfähigkeit | +| empfohlene Maßnahme | Bewertung anlegen, Freigabe einholen oder Abgabe vorbereiten | + +**Bezug zum Businessprozess** +Diese Abfrage bildet den Schritt „Verkaufspotenzial prüfen“ ab. Sie ersetzt kein vollständiges Verkaufsmodul, sondern liefert eine nachvollziehbare Entscheidungsgrundlage. + +--- + +### 5.3 `sql/queries/bp2/getExterneAbgabeVorbereitung.sql` + +**Zweck** +Diese Abfrage zeigt vorbereitete externe Abgaben mit Unternehmen, Verkaufspositionen, Mengen und Werten. + +**Unterstützter Use Case** +Externe Abgabe vorbereiten + +**Fachliche Bedeutung** +Die Abfrage verbindet `RESSOURCEN_VERKAUF`, `RESSOURCEN_VERKAUF_POSITION`, `EXTERNES_UNTERNEHMEN` und `RESSOURCEN_UEBERSCHUSS_BEWERTUNG`. Dadurch ist nachvollziehbar, welche Ressource an welches Unternehmen abgegeben werden soll und ob die Menge durch eine Überschussbewertung gedeckt ist. + +**Benötigte Daten** + +| Datenfeld | Bedeutung | +|---|---| +| Verkauf-ID | vorbereiteter Verkauf oder externe Abgabe | +| Unternehmen | möglicher externer Abnehmer | +| Verkaufsposition | konkrete Ressource, Menge und Lager | +| freigegebene Menge | Menge aus der Überschussbewertung | +| Positionswert | wirtschaftlicher Wert der Position | +| Gesamtwert | Summe des vorbereiteten Vorgangs | +| Abgabe-Status | fachliche Prüfung, ob die Abgabe vorbereitet ist | + +**Bezug zum Businessprozess** +Diese Abfrage bildet den Schritt „externe Abgabe vorbereiten“ ab. Sie erzeugt keine Rechnung und keine Zahlung, sondern macht den vorbereiteten Verkauf prüfbar und präsentierbar. + +--- + +## 6. Beispielhafte Daten für Prozess 2 | Bereich | Beispieldaten | |---|---| @@ -175,13 +310,14 @@ Diese Beispieldaten sind bewusst einfach gehalten, damit der Verkaufsprozess in --- -## 6. Mögliche Auswertung für Ressourcenüberschüsse +## 7. Mögliche Auswertung für Ressourcenüberschüsse -Eine eigene SQL-Datei für Überschüsse kann aus den vorhandenen Ressourcen- und Lagerdaten abgeleitet werden. +Die eigene SQL-Datei `sql/queries/bp2/getRessourcenUeberschuss.sql` leitet Überschüsse aus den vorhandenen Ressourcen- und Lagerdaten ab. Fachliche Logik: ```text +Mindestreserve = Mindestbestand + Verbrauch pro Sol * 7 verkaufbare Menge = aktuelle Menge - Mindestreserve ``` @@ -199,7 +335,7 @@ Beispielhafte Auswertung: --- -## 7. Nicht mehr im Hauptfokus +## 8. Nicht mehr im Hauptfokus Die folgenden Abfragebereiche sind weiterhin vorhanden, stehen aber nicht mehr im Mittelpunkt der aktuellen Revision: @@ -215,7 +351,7 @@ Die vollständige frühere Liste bleibt im Archiv erhalten. --- -## 8. Kurzfazit +## 9. Kurzfazit Die Datenbankabfragen v2 sind auf den aktuellen Projektfokus reduziert. diff --git a/documentation/lastenheft-und-pflichtenheft.md b/documentation/lastenheft-und-pflichtenheft.md index 0362ff3..fdf43c1 100644 --- a/documentation/lastenheft-und-pflichtenheft.md +++ b/documentation/lastenheft-und-pflichtenheft.md @@ -122,8 +122,8 @@ Restaufwand = geschätzter Aufwand ab aktuellem Projektstand | ID | Bezug | Technische Umsetzung | Vorhandener Repo-/DB-Bezug | Restaufwand | |---|---|---|---|---:| -| PH-01 | LH-01, LH-02, LH-03 | Die vorhandenen Ressourcenabfragen und passenden Datenbankfunktionen werden für Ressourcenwarnung, Lagerübersicht und Nachschubbedarf genutzt. | `getRessourcesBelowMin.sql`, `getRessourcenWithLager.sql`, `getStorageResourceSummary.sql` | 1 PT | -| PH-02 | LH-04, LH-05, LH-06 | Verkaufsentscheidungen werden zunächst aus vorhandenen Ressourcen- und Lagerdaten abgeleitet. Dadurch wird sichtbar, welche Ressourcen wirtschaftlich verwertet werden könnten. | `getRessourcenWithLager.sql`, `getRessourcesBelowMin.sql`, `getStorageResourceSummary.sql` | 1 PT | +| PH-01 | LH-01, LH-02, LH-03 | Die vorhandenen Ressourcenabfragen und passenden Datenbankfunktionen werden für Ressourcenwarnung, Lagerübersicht und Nachschubbedarf genutzt. | `sql/queries/bp1/getRessourcesBelowMin.sql`, `sql/queries/bp1/getRessourcesAtRisk.sql`, `sql/queries/bp1/getNachschubanforderungen.sql`, `sql/queries/shared/getRessourcenWithLager.sql`, `sql/queries/shared/getStorageResourceSummary.sql` | 1 PT | +| PH-02 | LH-04, LH-05, LH-06 | Verkaufsentscheidungen werden aus Ressourcenbestand, Sicherheitsreserve, Überschussbewertung und vorbereiteten Verkaufspositionen abgeleitet. Dadurch wird sichtbar, welche Ressourcen wirtschaftlich verwertet werden könnten. | `sql/queries/bp2/getRessourcenUeberschuss.sql`, `sql/queries/bp2/getVerkaufspotenzial.sql`, `sql/queries/bp2/getExterneAbgabeVorbereitung.sql`, Verkaufstabellen | 1 PT | | PH-03 | LH-07 | Die vorhandene Web-App wird als zentrale Oberfläche für Dashboard, Tabellenansichten und Prozessdarstellung genutzt. | React, TypeScript, Vite, Tailwind CSS | 1 PT | | PH-04 | LH-08 | Die vorhandene PHP-API stellt Datenbankergebnisse für die Web-App bereit. | PHP-API, JSON, CSRF-Token | 1 PT | | PH-05 | LH-09, NFA-06 | Die vorhandenen SQL-Dateien und Stored Procedures werden den zwei Hauptprozessen zugeordnet und dokumentiert. | SQL-Dateien / Stored Procedures / Doku / BPMN-Bezug | 1 PT | @@ -137,8 +137,8 @@ Geschätzter Restaufwand: 6 Personentage | Businessprozess | Vorhandene SQL-Dateien / Datenbanklogik | Zweck | |---|---|---| -| Kritische Ressourcen überwachen und Nachschub auslösen | `getRessourcesBelowMin.sql`, `getRessourcenWithLager.sql`, `getStorageResourceSummary.sql` | Erkennt Ressourcen unter Mindestbestand und zeigt Ressourcen mit Lagerinformationen. | -| Überschüssige Ressourcen an externe Unternehmen verkaufen | `getRessourcenWithLager.sql`, `getRessourcesBelowMin.sql`, `getStorageResourceSummary.sql` | Nutzt vorhandene Ressourcen- und Lagerdaten als Grundlage für wirtschaftliche Verkaufsentscheidungen. | +| Kritische Ressourcen überwachen und Nachschub auslösen | `sql/queries/bp1/getRessourcesBelowMin.sql`, `sql/queries/bp1/getRessourcesAtRisk.sql`, `sql/queries/bp1/getNachschubanforderungen.sql`, `sql/queries/shared/getRessourcenWithLager.sql`, `sql/queries/shared/getStorageResourceSummary.sql` | Erkennt Ressourcen unter Mindestbestand, bewertet Ablaufdaten, berechnet Nachschubmengen und zeigt Ressourcen mit Lagerinformationen. | +| Überschüssige Ressourcen an externe Unternehmen verkaufen | `sql/queries/bp2/getRessourcenUeberschuss.sql`, `sql/queries/bp2/getVerkaufspotenzial.sql`, `sql/queries/bp2/getExterneAbgabeVorbereitung.sql`, `RESSOURCEN_UEBERSCHUSS_BEWERTUNG`, `RESSOURCEN_VERKAUF`, `RESSOURCEN_VERKAUF_POSITION` | Erkennt Überschüsse, bewertet Verkaufspotenzial und zeigt vorbereitete externe Abgaben mit Unternehmen, Mengen und Werten. | --- @@ -160,12 +160,12 @@ Damit der Projektumfang realistisch bleibt, wird der sichere Kernumfang auf vorh | Ressourcenübersicht | vorhanden / SQL-Grundlage vorhanden | | Kritische Ressourcen unter Mindestbestand | vorhanden / SQL-Grundlage vorhanden | | Lager- und Ressourcenbezug | vorhanden / SQL-Grundlage vorhanden | -| Ableitung von Nachschubbedarf | aus vorhandenen Daten ableitbar | -| Ableitung möglicher Ressourcenüberschüsse | aus vorhandenen Daten ableitbar | -| Vorbereitung wirtschaftlicher Verkaufsentscheidungen | fachlich beschrieben / weiter auszubauen | +| Ableitung von Nachschubbedarf | über Stored Procedure vorbereitet | +| Ableitung möglicher Ressourcenüberschüsse | über Stored Procedure vorbereitet | +| Vorbereitung wirtschaftlicher Verkaufsentscheidungen | über Stored Procedure und Verkaufstabellen vorbereitet | | Web-App-Darstellung | vorhanden | | PHP-API-Anbindung | vorhanden | -| SQL-Dateien / Stored Procedures | vorhanden / weiter zu optimieren | +| SQL-Dateien / Stored Procedures | BP1- und BP2-Procedures vorhanden / weiter zu optimieren | | Zuordnung zu den zwei Hauptprozessen | zu dokumentieren | | BPMN-Modelle | passend zu erstellen | @@ -226,9 +226,9 @@ Diese Punkte sind sinnvoll, aber nicht zwingend für die aktuelle Version. |---|---| | AK-01 | Kritische Ressourcen unter Mindestbestand werden angezeigt oder über vorhandene Abfragen nachweisbar. | | AK-02 | Ressourcen mit Lagerinformationen werden angezeigt oder über vorhandene Abfragen nachweisbar. | -| AK-03 | Nachschubbedarf kann aus Ressourcenbestand, Mindestbestand und Lagerdaten fachlich abgeleitet werden. | -| AK-04 | Ressourcenübersichten können als Grundlage für Verkaufsentscheidungen genutzt werden. | -| AK-05 | Mögliche Ressourcenüberschüsse können aus vorhandenen Daten fachlich abgeleitet werden. | +| AK-03 | Nachschubbedarf kann aus Ressourcenbestand, Mindestbestand, Ablaufstatus und Lagerdaten über `sql/queries/bp1/getNachschubanforderungen` fachlich abgeleitet werden. | +| AK-04 | Ressourcenübersichten und Verkaufspotenzial können über `sql/queries/bp2/getRessourcenUeberschuss` und `sql/queries/bp2/getVerkaufspotenzial` als Grundlage für Verkaufsentscheidungen genutzt werden. | +| AK-05 | Mögliche Ressourcenüberschüsse können aus Bestand, Mindestreserve, Lagerdaten und vorhandenen Überschussbewertungen fachlich abgeleitet werden. | | AK-06 | Die Web-App ist lauffähig und demonstrierbar. | | AK-07 | Die PHP-API liefert Daten im JSON-Format. | | AK-08 | Die vorhandenen SQL-Dateien und Stored Procedures sind den zwei Hauptprozessen zugeordnet. | diff --git a/documentation/projektentscheidungen/01 - 2026-06-11-prisma-und-rest-api.md b/documentation/projektentscheidungen/01 - 2026-06-11-prisma-und-rest-api.md new file mode 100644 index 0000000..9af55f6 --- /dev/null +++ b/documentation/projektentscheidungen/01 - 2026-06-11-prisma-und-rest-api.md @@ -0,0 +1,18 @@ +# 01 - PR 63: Prisma-Umstellung und REST-API + +Stand: 2026-06-11 + +## Merkpunkte + +- Die geplante Umstellung auf Prisma wurde im Review zu PR #63 bestätigt. +- Tom / CyZeTLC kümmert sich um die REST-API-Logik und das passende Routing. +- Änderungen an `api/restApi.php`, API-Routing oder API-Pfadlogik sollen deshalb nicht nebenbei in SQL-, BP- oder Doku-PRs landen. +- Die SQL-/BP1-/BP2-Struktur, Stored Procedures und fachliche Dokumentation bleiben unabhängig davon relevant. + +## Für spätere Arbeit + +Vor der Abgabe sollte die Dokumentation nochmal gezielt geprüft werden, damit die Beschreibungen zu Prisma, REST-API, Datenbanklogik, BP1/BP2 und finaler Architektur zusammenpassen. + +## Umsetzung in PR #63 + +Die REST-API-Änderungen wurden mit Commit `accdd43` wieder entfernt. Die SQL-/BP1-/BP2-Struktur bleibt erhalten. diff --git a/documentation/projektentscheidungen/README.md b/documentation/projektentscheidungen/README.md new file mode 100644 index 0000000..e46ba68 --- /dev/null +++ b/documentation/projektentscheidungen/README.md @@ -0,0 +1,18 @@ +# Projektentscheidungen + +In diesem Ordner werden wichtige Projektentscheidungen festgehalten, die fuer spaetere Entwicklung, Dokumentation oder Abgabe relevant sind. + +Neue Eintraege sollten fortlaufend nummeriert werden: + +```text +01 - 2026-06-11-prisma-und-rest-api.md +02 - YYYY-MM-DD-kurzer-titel.md +03 - YYYY-MM-DD-kurzer-titel.md +``` + +Jede Datei sollte mindestens enthalten: + +- Datum der Entscheidung +- Kurzbeschreibung, was entschieden wurde +- Konsequenzen fuer weitere Arbeit +- offene Punkte oder spaetere To-dos, falls relevant diff --git a/sql/getRessourcesAtRisk.sql b/sql/getRessourcesAtRisk.sql deleted file mode 100644 index 632154b..0000000 --- a/sql/getRessourcesAtRisk.sql +++ /dev/null @@ -1,8 +0,0 @@ -SELECT r.ressource_id, - r.r_typ as ressource_typ, - r.ablaufdatum, - ig.lager_id -FROM RESSOURCE r - JOIN IST_GELAGERT_IN ig ON r.ressource_id = ig.ressource_id -WHERE r.ablaufdatum BETWEEN CURRENT_DATE AND DATE_ADD(CURRENT_DATE, INTERVAL 30 DAY) -ORDER BY r.ablaufdatum ASC; \ No newline at end of file diff --git a/sql/getRessourcesBelowMin.sql b/sql/getRessourcesBelowMin.sql deleted file mode 100644 index d777579..0000000 --- a/sql/getRessourcesBelowMin.sql +++ /dev/null @@ -1,12 +0,0 @@ -SELECT - r.RESSOURCE_ID, - r.r_typ, - r.menge, - r.min_schwellenwert, - l.lagertyp -FROM RESSOURCE r -INNER JOIN IST_GELAGERT_IN ig - ON r.RESSOURCE_ID = ig.ressource_id -INNER JOIN LAGER l - ON ig.lager_id = l.lager_id -WHERE r.menge < r.min_schwellenwert; \ No newline at end of file diff --git a/sql/queries/bp1/getNachschubanforderungen.sql b/sql/queries/bp1/getNachschubanforderungen.sql new file mode 100644 index 0000000..fc9df01 --- /dev/null +++ b/sql/queries/bp1/getNachschubanforderungen.sql @@ -0,0 +1,118 @@ +SELECT + bp1.NACHSCHUBANFORDERUNG_ID, + bp1.RESSOURCE_ID, + bp1.RESSOURCE_TYP, + bp1.LAGER_ID, + bp1.LAGERTYP, + bp1.AKTUELLE_MENGE, + bp1.MENGE_EINHEIT, + bp1.MIN_SCHWELLENWERT, + bp1.VERBRAUCH_PRO_SOL, + bp1.SICHERHEITSPUFFER_7_SOL, + bp1.ANFORDERUNGSMENGE, + bp1.INTERN_VERFUEGBARE_MENGE, + CASE + WHEN bp1.IST_ABGELAUFEN = 1 AND bp1.IST_UNTER_MINDESTBESTAND = 1 + THEN 'ABGELAUFEN_UND_UNTER_MINDESTBESTAND' + WHEN bp1.IST_ABGELAUFEN = 1 + THEN 'ABGELAUFENER_BESTAND_ERSETZEN' + ELSE 'UNTER_MINDESTBESTAND' + END AS ANFORDERUNGSGRUND, + CASE + WHEN bp1.PRIORITAET = 1 + OR bp1.IST_ABGELAUFEN = 1 + OR bp1.INTERN_VERFUEGBARE_MENGE < bp1.ANFORDERUNGSMENGE + THEN 'HOCH' + WHEN bp1.PRIORITAET = 2 + THEN 'MITTEL' + ELSE 'NIEDRIG' + END AS ANFORDERUNGSPRIORITAET, + CASE + WHEN bp1.IST_ABGELAUFEN = 1 + THEN 'BESTAND_SPERREN_UND_ERSATZ_BESCHAFFEN' + WHEN bp1.INTERN_VERFUEGBARE_MENGE >= bp1.ANFORDERUNGSMENGE + THEN 'INTERNE_UMLAGERUNG_PRUEFEN' + ELSE 'EXTERNEN_NACHSCHUB_ANFORDERN' + END AS EMPFOHLENE_MASSNAHME +FROM ( + SELECT + CONCAT('NA-', LPAD(CAST(r.RESSOURCE_ID AS UNSIGNED), 4, '0'), '-', DATE_FORMAT(CURRENT_DATE, '%Y%m%d')) AS NACHSCHUBANFORDERUNG_ID, + r.RESSOURCE_ID, + r.R_TYP AS RESSOURCE_TYP, + ig.LAGER_ID, + l.LAGERTYP, + COALESCE(r.MENGE, 0) AS AKTUELLE_MENGE, + r.MENGE_EINHEIT, + r.MIN_SCHWELLENWERT, + r.VERBRAUCH_PRO_SOL, + COALESCE(r.VERBRAUCH_PRO_SOL, 0) * 7 AS SICHERHEITSPUFFER_7_SOL, + r.PRIORITAET, + CASE + WHEN r.MIN_SCHWELLENWERT IS NOT NULL + AND COALESCE(r.MENGE, 0) < r.MIN_SCHWELLENWERT + THEN 1 + ELSE 0 + END AS IST_UNTER_MINDESTBESTAND, + CASE + WHEN r.ABLAUFDATUM IS NOT NULL + AND DATE(r.ABLAUFDATUM) < CURRENT_DATE + THEN 1 + ELSE 0 + END AS IST_ABGELAUFEN, + CASE + WHEN r.ABLAUFDATUM IS NOT NULL + AND DATE(r.ABLAUFDATUM) < CURRENT_DATE + THEN GREATEST(COALESCE(r.MIN_SCHWELLENWERT, 0), COALESCE(r.MENGE, 0)) + WHEN r.MIN_SCHWELLENWERT IS NOT NULL + AND COALESCE(r.MENGE, 0) < r.MIN_SCHWELLENWERT + THEN GREATEST(r.MIN_SCHWELLENWERT - COALESCE(r.MENGE, 0), 0) + (COALESCE(r.VERBRAUCH_PRO_SOL, 0) * 7) + ELSE 0 + END AS ANFORDERUNGSMENGE, + GREATEST( + COALESCE(rt.NUTZBARE_GESAMTMENGE, 0) + - CASE + WHEN r.ABLAUFDATUM IS NOT NULL + AND DATE(r.ABLAUFDATUM) < CURRENT_DATE + THEN 0 + ELSE COALESCE(r.MENGE, 0) + END, + 0 + ) AS INTERN_VERFUEGBARE_MENGE + FROM RESSOURCE r + LEFT JOIN IST_GELAGERT_IN ig + ON r.RESSOURCE_ID = ig.RESSOURCE_ID + LEFT JOIN LAGER l + ON ig.LAGER_ID = l.LAGER_ID + LEFT JOIN ( + SELECT + R_TYP, + SUM( + CASE + WHEN ABLAUFDATUM IS NULL + OR DATE(ABLAUFDATUM) >= CURRENT_DATE + THEN COALESCE(MENGE, 0) + ELSE 0 + END + ) AS NUTZBARE_GESAMTMENGE + FROM RESSOURCE + GROUP BY R_TYP + ) rt + ON rt.R_TYP = r.R_TYP + WHERE ( + r.MIN_SCHWELLENWERT IS NOT NULL + AND COALESCE(r.MENGE, 0) < r.MIN_SCHWELLENWERT + ) + OR ( + r.ABLAUFDATUM IS NOT NULL + AND DATE(r.ABLAUFDATUM) < CURRENT_DATE + ) +) bp1 +WHERE bp1.ANFORDERUNGSMENGE > 0 +ORDER BY + CASE + WHEN bp1.IST_ABGELAUFEN = 1 THEN 0 + WHEN bp1.PRIORITAET = 1 THEN 1 + ELSE 2 + END ASC, + bp1.ANFORDERUNGSMENGE DESC, + bp1.RESSOURCE_TYP ASC; diff --git a/sql/queries/bp1/getRessourcesAtRisk.sql b/sql/queries/bp1/getRessourcesAtRisk.sql new file mode 100644 index 0000000..b8b665e --- /dev/null +++ b/sql/queries/bp1/getRessourcesAtRisk.sql @@ -0,0 +1,41 @@ +SELECT + r.RESSOURCE_ID, + r.R_TYP AS RESSOURCE_TYP, + COALESCE(r.MENGE, 0) AS AKTUELLE_MENGE, + r.MENGE_EINHEIT, + r.ABLAUFDATUM, + DATEDIFF(DATE(r.ABLAUFDATUM), CURRENT_DATE) AS TAGE_BIS_ABLAUF, + r.PRIORITAET, + ig.LAGER_ID, + l.LAGERTYP, + CASE + WHEN DATE(r.ABLAUFDATUM) < CURRENT_DATE THEN 'ABGELAUFEN' + WHEN DATE(r.ABLAUFDATUM) = CURRENT_DATE THEN 'LAEUFT_HEUTE_AB' + WHEN DATEDIFF(DATE(r.ABLAUFDATUM), CURRENT_DATE) <= 7 THEN 'LAEUFT_IN_7_TAGEN_AB' + ELSE 'LAEUFT_IN_30_TAGEN_AB' + END AS RISIKOSTATUS, + CASE + WHEN DATE(r.ABLAUFDATUM) < CURRENT_DATE THEN 'BESTAND_SPERREN_UND_ERSATZ_PRUEFEN' + WHEN r.PRIORITAET = 1 + OR DATEDIFF(DATE(r.ABLAUFDATUM), CURRENT_DATE) <= 7 + THEN 'BEVORZUGT_VERBRAUCHEN_ODER_ERSETZEN' + ELSE 'FEFO_VERBRAUCH_PLANEN' + END AS EMPFOHLENE_MASSNAHME +FROM RESSOURCE r +LEFT JOIN IST_GELAGERT_IN ig + ON r.RESSOURCE_ID = ig.RESSOURCE_ID +LEFT JOIN LAGER l + ON ig.LAGER_ID = l.LAGER_ID +WHERE r.ABLAUFDATUM IS NOT NULL + AND DATE(r.ABLAUFDATUM) <= DATE_ADD(CURRENT_DATE, INTERVAL 30 DAY) +ORDER BY + CASE + WHEN DATE(r.ABLAUFDATUM) < CURRENT_DATE THEN 0 + ELSE 1 + END ASC, + r.ABLAUFDATUM ASC, + CASE + WHEN r.PRIORITAET IS NULL THEN 99 + ELSE r.PRIORITAET + END ASC, + r.R_TYP ASC; diff --git a/sql/queries/bp1/getRessourcesBelowMin.sql b/sql/queries/bp1/getRessourcesBelowMin.sql new file mode 100644 index 0000000..236470b --- /dev/null +++ b/sql/queries/bp1/getRessourcesBelowMin.sql @@ -0,0 +1,37 @@ +SELECT + r.RESSOURCE_ID, + r.R_TYP AS RESSOURCE_TYP, + COALESCE(r.MENGE, 0) AS AKTUELLE_MENGE, + r.MENGE_EINHEIT, + r.MIN_SCHWELLENWERT, + GREATEST(r.MIN_SCHWELLENWERT - COALESCE(r.MENGE, 0), 0) AS FEHLMENGE, + ROUND( + (GREATEST(r.MIN_SCHWELLENWERT - COALESCE(r.MENGE, 0), 0) / NULLIF(r.MIN_SCHWELLENWERT, 0)) * 100, + 2 + ) AS FEHLMENGE_PROZENT, + r.PRIORITAET, + ig.LAGER_ID, + l.LAGERTYP, + CASE + WHEN r.PRIORITAET = 1 + OR GREATEST(r.MIN_SCHWELLENWERT - COALESCE(r.MENGE, 0), 0) >= (r.MIN_SCHWELLENWERT * 0.5) + THEN 'SOFORT_PRUEFEN' + WHEN r.PRIORITAET = 2 + THEN 'HOCH' + ELSE 'MITTEL' + END AS HANDLUNGSPRIORITAET, + 'UNTER_MINDESTBESTAND' AS STATUS +FROM RESSOURCE r +LEFT JOIN IST_GELAGERT_IN ig + ON r.RESSOURCE_ID = ig.RESSOURCE_ID +LEFT JOIN LAGER l + ON ig.LAGER_ID = l.LAGER_ID +WHERE r.MIN_SCHWELLENWERT IS NOT NULL + AND COALESCE(r.MENGE, 0) < r.MIN_SCHWELLENWERT +ORDER BY + CASE + WHEN r.PRIORITAET IS NULL THEN 99 + ELSE r.PRIORITAET + END ASC, + FEHLMENGE DESC, + r.R_TYP ASC; diff --git a/sql/queries/bp2/getExterneAbgabeVorbereitung.sql b/sql/queries/bp2/getExterneAbgabeVorbereitung.sql new file mode 100644 index 0000000..fb25007 --- /dev/null +++ b/sql/queries/bp2/getExterneAbgabeVorbereitung.sql @@ -0,0 +1,47 @@ +SELECT + rv.VERKAUF_ID, + rv.STATUS AS VERKAUF_STATUS, + rv.ERSTELLT_AM, + rv.WAEHRUNG, + rv.GESAMTWERT, + eu.UNTERNEHMEN_ID, + eu.NAME AS UNTERNEHMEN_NAME, + eu.BRANCHE, + eu.KONTAKT_NAME, + eu.KONTAKT_EMAIL, + rvp.VERKAUF_POSITION_ID, + rvp.RESSOURCE_ID, + r.R_TYP AS RESSOURCE_TYP, + rvp.LAGER_ID, + l.LAGERTYP, + rvp.MENGE AS ABGABE_MENGE, + rvp.EINHEIT, + rvp.EINZELPREIS, + rvp.POSITIONSWERT, + rub.BEWERTUNG_ID, + rub.VERKAUFBARE_MENGE AS FREIGEGEBENE_MENGE, + rub.STATUS AS BEWERTUNGSSTATUS, + CASE + WHEN LOWER(COALESCE(rv.STATUS, '')) IN ('vorbereitet', 'freigegeben') + AND rvp.MENGE <= COALESCE(rub.VERKAUFBARE_MENGE, rvp.MENGE) + THEN 'ABGABE_FACHLICH_VORBEREITET' + WHEN rvp.MENGE > COALESCE(rub.VERKAUFBARE_MENGE, 0) + THEN 'MENGE_PRUEFEN' + ELSE 'STATUS_PRUEFEN' + END AS ABGABE_STATUS, + rv.BEMERKUNG +FROM RESSOURCEN_VERKAUF rv +INNER JOIN EXTERNES_UNTERNEHMEN eu + ON rv.UNTERNEHMEN_ID = eu.UNTERNEHMEN_ID +INNER JOIN RESSOURCEN_VERKAUF_POSITION rvp + ON rv.VERKAUF_ID = rvp.VERKAUF_ID +INNER JOIN RESSOURCE r + ON rvp.RESSOURCE_ID = r.RESSOURCE_ID +INNER JOIN LAGER l + ON rvp.LAGER_ID = l.LAGER_ID +LEFT JOIN RESSOURCEN_UEBERSCHUSS_BEWERTUNG rub + ON rvp.BEWERTUNG_ID = rub.BEWERTUNG_ID +ORDER BY + rv.ERSTELLT_AM DESC, + rv.VERKAUF_ID ASC, + rvp.VERKAUF_POSITION_ID ASC; diff --git a/sql/queries/bp2/getRessourcenUeberschuss.sql b/sql/queries/bp2/getRessourcenUeberschuss.sql new file mode 100644 index 0000000..8fc17d1 --- /dev/null +++ b/sql/queries/bp2/getRessourcenUeberschuss.sql @@ -0,0 +1,61 @@ +SELECT + bp2.RESSOURCE_ID, + bp2.RESSOURCE_TYP, + bp2.LAGER_ID, + bp2.LAGERTYP, + bp2.AKTUELLE_MENGE, + bp2.MENGE_EINHEIT, + bp2.MIN_SCHWELLENWERT, + bp2.VERBRAUCH_PRO_SOL, + bp2.SICHERHEITSPUFFER_7_SOL, + bp2.MINDESTRESERVE, + bp2.VERKAUFBARE_MENGE, + ROUND((bp2.VERKAUFBARE_MENGE / NULLIF(bp2.AKTUELLE_MENGE, 0)) * 100, 2) AS VERKAUFBARE_MENGE_PROZENT, + bp2.PRIORITAET, + CASE + WHEN bp2.PRIORITAET = 1 THEN 'NUR_NACH_FREIGABE' + WHEN bp2.VERKAUFBARE_MENGE >= bp2.MINDESTRESERVE THEN 'DEUTLICHER_UEBERSCHUSS' + ELSE 'MOEGLICHER_UEBERSCHUSS' + END AS UEBERSCHUSS_STATUS, + CASE + WHEN bp2.PRIORITAET = 1 THEN 'KOLONIELEITUNG_PRUEFEN' + ELSE 'VERKAUFSPOTENZIAL_BEWERTEN' + END AS EMPFOHLENE_MASSNAHME +FROM ( + SELECT + r.RESSOURCE_ID, + r.R_TYP AS RESSOURCE_TYP, + ig.LAGER_ID, + l.LAGERTYP, + COALESCE(r.MENGE, 0) AS AKTUELLE_MENGE, + r.MENGE_EINHEIT, + r.MIN_SCHWELLENWERT, + r.VERBRAUCH_PRO_SOL, + COALESCE(r.VERBRAUCH_PRO_SOL, 0) * 7 AS SICHERHEITSPUFFER_7_SOL, + COALESCE(r.MIN_SCHWELLENWERT, 0) + (COALESCE(r.VERBRAUCH_PRO_SOL, 0) * 7) AS MINDESTRESERVE, + GREATEST( + COALESCE(r.MENGE, 0) + - (COALESCE(r.MIN_SCHWELLENWERT, 0) + (COALESCE(r.VERBRAUCH_PRO_SOL, 0) * 7)), + 0 + ) AS VERKAUFBARE_MENGE, + r.PRIORITAET, + r.ABLAUFDATUM + FROM RESSOURCE r + INNER JOIN IST_GELAGERT_IN ig + ON r.RESSOURCE_ID = ig.RESSOURCE_ID + INNER JOIN LAGER l + ON ig.LAGER_ID = l.LAGER_ID + WHERE r.MIN_SCHWELLENWERT IS NOT NULL +) bp2 +WHERE bp2.VERKAUFBARE_MENGE > 0 + AND ( + bp2.ABLAUFDATUM IS NULL + OR DATE(bp2.ABLAUFDATUM) >= CURRENT_DATE + ) +ORDER BY + CASE + WHEN bp2.PRIORITAET = 1 THEN 1 + ELSE 0 + END ASC, + bp2.VERKAUFBARE_MENGE DESC, + bp2.RESSOURCE_TYP ASC; diff --git a/sql/queries/bp2/getVerkaufspotenzial.sql b/sql/queries/bp2/getVerkaufspotenzial.sql new file mode 100644 index 0000000..58fec88 --- /dev/null +++ b/sql/queries/bp2/getVerkaufspotenzial.sql @@ -0,0 +1,64 @@ +SELECT + bp2.RESSOURCE_ID, + bp2.RESSOURCE_TYP, + bp2.LAGER_ID, + bp2.LAGERTYP, + bp2.AKTUELLE_MENGE, + bp2.MENGE_EINHEIT, + bp2.MINDESTRESERVE, + bp2.VERKAUFBARE_MENGE, + bp2.PRIORITAET, + rub.BEWERTUNG_ID, + rub.BEWERTUNGSDATUM, + rub.STATUS AS BEWERTUNGSSTATUS, + rub.BEGRUENDUNG, + CASE + WHEN LOWER(COALESCE(rub.STATUS, '')) = 'freigegeben' THEN 'BEREITS_FREIGEGEBEN' + WHEN bp2.PRIORITAET = 1 THEN 'KRITISCH_PRUEFEN' + WHEN bp2.VERKAUFBARE_MENGE >= bp2.MINDESTRESERVE THEN 'HOHES_VERKAUFSPOTENZIAL' + ELSE 'MITTLERES_VERKAUFSPOTENZIAL' + END AS VERKAUFSPOTENZIAL_STATUS, + CASE + WHEN LOWER(COALESCE(rub.STATUS, '')) = 'freigegeben' THEN 'EXTERNE_ABGABE_VORBEREITEN' + WHEN bp2.PRIORITAET = 1 THEN 'FREIGABE_DURCH_KOLONIELEITUNG_EINHOLEN' + ELSE 'UEBERSCHUSSBEWERTUNG_ANLEGEN' + END AS EMPFOHLENE_MASSNAHME +FROM ( + SELECT + r.RESSOURCE_ID, + r.R_TYP AS RESSOURCE_TYP, + ig.LAGER_ID, + l.LAGERTYP, + COALESCE(r.MENGE, 0) AS AKTUELLE_MENGE, + r.MENGE_EINHEIT, + COALESCE(r.MIN_SCHWELLENWERT, 0) + (COALESCE(r.VERBRAUCH_PRO_SOL, 0) * 7) AS MINDESTRESERVE, + GREATEST( + COALESCE(r.MENGE, 0) + - (COALESCE(r.MIN_SCHWELLENWERT, 0) + (COALESCE(r.VERBRAUCH_PRO_SOL, 0) * 7)), + 0 + ) AS VERKAUFBARE_MENGE, + r.PRIORITAET, + r.ABLAUFDATUM + FROM RESSOURCE r + INNER JOIN IST_GELAGERT_IN ig + ON r.RESSOURCE_ID = ig.RESSOURCE_ID + INNER JOIN LAGER l + ON ig.LAGER_ID = l.LAGER_ID + WHERE r.MIN_SCHWELLENWERT IS NOT NULL +) bp2 +LEFT JOIN RESSOURCEN_UEBERSCHUSS_BEWERTUNG rub + ON bp2.RESSOURCE_ID = rub.RESSOURCE_ID + AND bp2.LAGER_ID = rub.LAGER_ID +WHERE bp2.VERKAUFBARE_MENGE > 0 + AND ( + bp2.ABLAUFDATUM IS NULL + OR DATE(bp2.ABLAUFDATUM) >= CURRENT_DATE + ) +ORDER BY + CASE + WHEN LOWER(COALESCE(rub.STATUS, '')) = 'freigegeben' THEN 0 + WHEN bp2.PRIORITAET = 1 THEN 2 + ELSE 1 + END ASC, + bp2.VERKAUFBARE_MENGE DESC, + bp2.RESSOURCE_TYP ASC; diff --git a/sql/getActiveVehicles.sql b/sql/queries/general/getActiveVehicles.sql similarity index 100% rename from sql/getActiveVehicles.sql rename to sql/queries/general/getActiveVehicles.sql diff --git a/sql/getAllCitizens.sql b/sql/queries/general/getAllCitizens.sql similarity index 100% rename from sql/getAllCitizens.sql rename to sql/queries/general/getAllCitizens.sql diff --git a/sql/getAllCitizensByName.sql b/sql/queries/general/getAllCitizensByName.sql similarity index 100% rename from sql/getAllCitizensByName.sql rename to sql/queries/general/getAllCitizensByName.sql diff --git a/sql/getAllEmployees.sql b/sql/queries/general/getAllEmployees.sql similarity index 100% rename from sql/getAllEmployees.sql rename to sql/queries/general/getAllEmployees.sql diff --git a/sql/getAllLager.sql b/sql/queries/general/getAllLager.sql similarity index 100% rename from sql/getAllLager.sql rename to sql/queries/general/getAllLager.sql diff --git a/sql/getAvgWorkTimeByBeruf.sql b/sql/queries/general/getAvgWorkTimeByBeruf.sql similarity index 100% rename from sql/getAvgWorkTimeByBeruf.sql rename to sql/queries/general/getAvgWorkTimeByBeruf.sql diff --git a/sql/getBewohnerAtAddress.sql b/sql/queries/general/getBewohnerAtAddress.sql similarity index 100% rename from sql/getBewohnerAtAddress.sql rename to sql/queries/general/getBewohnerAtAddress.sql diff --git a/sql/getCitiesCount.sql b/sql/queries/general/getCitiesCount.sql similarity index 100% rename from sql/getCitiesCount.sql rename to sql/queries/general/getCitiesCount.sql diff --git a/sql/getCitiesWithKoords.sql b/sql/queries/general/getCitiesWithKoords.sql similarity index 100% rename from sql/getCitiesWithKoords.sql rename to sql/queries/general/getCitiesWithKoords.sql diff --git a/sql/getCitiesWithStats.sql b/sql/queries/general/getCitiesWithStats.sql similarity index 100% rename from sql/getCitiesWithStats.sql rename to sql/queries/general/getCitiesWithStats.sql diff --git a/sql/getCitiesWithoutEnergySource.sql b/sql/queries/general/getCitiesWithoutEnergySource.sql similarity index 100% rename from sql/getCitiesWithoutEnergySource.sql rename to sql/queries/general/getCitiesWithoutEnergySource.sql diff --git a/sql/getCitiesWithoutTransportConnection.sql b/sql/queries/general/getCitiesWithoutTransportConnection.sql similarity index 100% rename from sql/getCitiesWithoutTransportConnection.sql rename to sql/queries/general/getCitiesWithoutTransportConnection.sql diff --git a/sql/getCitizensCount.sql b/sql/queries/general/getCitizensCount.sql similarity index 100% rename from sql/getCitizensCount.sql rename to sql/queries/general/getCitizensCount.sql diff --git a/sql/getCurrentBithday.sql b/sql/queries/general/getCurrentBithday.sql similarity index 100% rename from sql/getCurrentBithday.sql rename to sql/queries/general/getCurrentBithday.sql diff --git a/sql/getCurrentEnergieLeistung.sql b/sql/queries/general/getCurrentEnergieLeistung.sql similarity index 100% rename from sql/getCurrentEnergieLeistung.sql rename to sql/queries/general/getCurrentEnergieLeistung.sql diff --git a/sql/getDepartmentResourceDependencies.sql b/sql/queries/general/getDepartmentResourceDependencies.sql similarity index 100% rename from sql/getDepartmentResourceDependencies.sql rename to sql/queries/general/getDepartmentResourceDependencies.sql diff --git a/sql/getDepartmentsWithLeaders.sql b/sql/queries/general/getDepartmentsWithLeaders.sql similarity index 100% rename from sql/getDepartmentsWithLeaders.sql rename to sql/queries/general/getDepartmentsWithLeaders.sql diff --git a/sql/getEmployeeCountByDepartment.sql b/sql/queries/general/getEmployeeCountByDepartment.sql similarity index 100% rename from sql/getEmployeeCountByDepartment.sql rename to sql/queries/general/getEmployeeCountByDepartment.sql diff --git a/sql/getEmployeeProfile.sql b/sql/queries/general/getEmployeeProfile.sql similarity index 100% rename from sql/getEmployeeProfile.sql rename to sql/queries/general/getEmployeeProfile.sql diff --git a/sql/getEnergySourcesByCity.sql b/sql/queries/general/getEnergySourcesByCity.sql similarity index 100% rename from sql/getEnergySourcesByCity.sql rename to sql/queries/general/getEnergySourcesByCity.sql diff --git a/sql/getFlotte.sql b/sql/queries/general/getFlotte.sql similarity index 100% rename from sql/getFlotte.sql rename to sql/queries/general/getFlotte.sql diff --git a/sql/getLagerVersorgungAtRisk.sql b/sql/queries/general/getLagerVersorgungAtRisk.sql similarity index 100% rename from sql/getLagerVersorgungAtRisk.sql rename to sql/queries/general/getLagerVersorgungAtRisk.sql diff --git a/sql/getLowTreibstoff.sql b/sql/queries/general/getLowTreibstoff.sql similarity index 100% rename from sql/getLowTreibstoff.sql rename to sql/queries/general/getLowTreibstoff.sql diff --git a/sql/getMissionsBericht.sql b/sql/queries/general/getMissionsBericht.sql similarity index 100% rename from sql/getMissionsBericht.sql rename to sql/queries/general/getMissionsBericht.sql diff --git a/sql/getMitarbeiterByBeruf.sql b/sql/queries/general/getMitarbeiterByBeruf.sql similarity index 100% rename from sql/getMitarbeiterByBeruf.sql rename to sql/queries/general/getMitarbeiterByBeruf.sql diff --git a/sql/getMitarbeiterRolle.sql b/sql/queries/general/getMitarbeiterRolle.sql similarity index 100% rename from sql/getMitarbeiterRolle.sql rename to sql/queries/general/getMitarbeiterRolle.sql diff --git a/sql/getResidentCountByAddress.sql b/sql/queries/general/getResidentCountByAddress.sql similarity index 100% rename from sql/getResidentCountByAddress.sql rename to sql/queries/general/getResidentCountByAddress.sql diff --git a/sql/getRessourceLog.sql b/sql/queries/general/getRessourceLog.sql similarity index 100% rename from sql/getRessourceLog.sql rename to sql/queries/general/getRessourceLog.sql diff --git a/sql/getVehiclesByStatus.sql b/sql/queries/general/getVehiclesByStatus.sql similarity index 100% rename from sql/getVehiclesByStatus.sql rename to sql/queries/general/getVehiclesByStatus.sql diff --git a/sql/updateMitarbeiterLogin.sql b/sql/queries/general/updateMitarbeiterLogin.sql similarity index 100% rename from sql/updateMitarbeiterLogin.sql rename to sql/queries/general/updateMitarbeiterLogin.sql diff --git a/sql/getRessourcenWithLager.sql b/sql/queries/shared/getRessourcenWithLager.sql similarity index 100% rename from sql/getRessourcenWithLager.sql rename to sql/queries/shared/getRessourcenWithLager.sql diff --git a/sql/getStorageResourceSummary.sql b/sql/queries/shared/getStorageResourceSummary.sql similarity index 100% rename from sql/getStorageResourceSummary.sql rename to sql/queries/shared/getStorageResourceSummary.sql diff --git a/sql/sqlOverview.txt b/sql/sqlOverview.txt index 010fb16..aa74223 100644 --- a/sql/sqlOverview.txt +++ b/sql/sqlOverview.txt @@ -1,35 +1,78 @@ -_______________________________________________________________ -getEnergySourcesByCity: -Zeigt welche Stadt von welcher Energiequelle versorgt wird -und wie viel Leistung die Quelle momentan + maximal liefert -_______________________________________________________________ -getDepartmentsWithLeaders.sql -Zeigt alle Abteilungen mit Leitung und Login / Welche Abteilungen gibt es und wer leitet sie? -_______________________________________________________________ -getDepartmentResourceDependencies.sql -Zeigt welche Abteilung mit welchen Ressourcen verknüpft/zugeordnet ist -_______________________________________________________________ -getEmployeeCountByDepartment.sql -Sie nimmt alle Abteilungen aus ABTEILUNG, verbindet dazu passende Mitarbeiter aus MITARBEITER, -zählt die Mitarbeiter pro Abteilung und sortiert die größte Abteilung nach oben. -_______________________________________________________________ -getCitiesWithoutEnergySource.sql -Die Abfrage zeigt Städte, die keiner Energiequelle zugeordnet sind. Das ist simpel -aber fachlich sehr stark, weil eine Mars-Stadt ohne Energieversorgung ein echtes Problem wäre. -_______________________________________________________________ -getResidentCountByAddress.sql -Die Abfrage zeigt, wie viele Bewohner an welcher Adresse wohnen. Das ist leicht, aber sinnvoll, -weil man damit sieht, welche Wohnbereiche stark belegt sind. -(Maybe auch cool wenn man Ressourcen trackt) - -_______________________________________________________________ -Lagerübersicht mit Ressourcenmenge -getStorageResourceSummary.sql -Die Abfrage zeigt pro Lager, wie viele verschiedene Ressourcen dort liegen -und wie viel Menge, Gewicht und Volumen zusammenkommen. Sehr passend für Ressourcenverwaltung. -COUNT = zählt Zeilen -SUM = addiert Zahlen - -_______________________________________________________________ -getResidentCountByCity.sql +SQL-Ordnerstruktur +================== +sql/queries/ +Normale SELECT-Abfragen fuer fachliche Auswertungen. + +sql/queries/bp1/ +Abfragen fuer den Businessprozess "Kritische Ressourcen ueberwachen und Nachschub ausloesen". + +- sql/queries/bp1/getRessourcesBelowMin.sql + Erkennt Ressourcen unter Mindestbestand und berechnet Fehlmenge, + Fehlmengen-Prozent und Handlungsprioritaet. + +- sql/queries/bp1/getRessourcesAtRisk.sql + Erkennt abgelaufene oder innerhalb von 30 Tagen ablaufende Ressourcen + und gibt Risikostatus sowie empfohlene Massnahme aus. + +- sql/queries/bp1/getNachschubanforderungen.sql + Bereitet Nachschubanforderungen fachlich vor und berechnet + Anforderungsmenge, Sicherheitsreserve, interne Verfuegbarkeit, + Anforderungsgrund und empfohlene Massnahme. + +sql/queries/bp2/ +Abfragen fuer den Businessprozess "Ueberschuessige Ressourcen an externe Unternehmen verkaufen". + +- sql/queries/bp2/getRessourcenUeberschuss.sql + Erkennt Ressourcen oberhalb der internen Mindestreserve und berechnet + die fachlich verkaufbare Menge. + +- sql/queries/bp2/getVerkaufspotenzial.sql + Bewertet moegliche Ueberschuesse mit vorhandenen Ueberschussbewertungen + und liefert Verkaufspotenzial-Status sowie empfohlene Massnahme. + +- sql/queries/bp2/getExterneAbgabeVorbereitung.sql + Zeigt vorbereitete externe Abgaben mit Unternehmen, Verkaufspositionen, + freigegebener Menge, Positionswert, Gesamtwert und Abgabe-Status. + +sql/queries/shared/ +Prozessuebergreifende Abfragen, die BP1 und BP2 fachlich stuetzen. + +- sql/queries/shared/getRessourcenWithLager.sql + Zeigt Ressourcen mit Lagerbezug. + +- sql/queries/shared/getStorageResourceSummary.sql + Zeigt Lageruebersichten mit Ressourcenanzahl, Gesamtmenge, Gewicht + und Volumen. + +sql/queries/general/ +Allgemeine Bestandsabfragen der WebApp, zum Beispiel fuer Dashboard, +Bewohner, Mitarbeitende, Fahrzeuge, Energie, Staedte und Abteilungen. + +sql/storedProcedure/ +Stored-Procedure-Versionen der SQL-Logik. + +- sql/storedProcedure/bp1/ + Procedures fuer BP1. + +- sql/storedProcedure/bp2/ + Procedures fuer BP2. + +- sql/storedProcedure/shared/ + Prozessuebergreifende Procedures. + +- sql/storedProcedure/general/ + Allgemeine Procedures der bestehenden WebApp. + +sql/build/ +Build- und Importskripte fuer Datenbankstrukturen und Beispieldaten. + +sql/sem2/ +Alte bzw. semesterbezogene Zusatznotizen. + +API-Hinweis +=========== + +API-Routing und Prisma-Anbindung werden separat gepflegt. Diese SQL-Struktur +beschreibt nur Ablage und fachliche Zuordnung der Dateien. Sie aendert keine +restApi-Pfadlogik. diff --git a/sql/storedProcedure/bp1/getNachschubanforderungen.sql b/sql/storedProcedure/bp1/getNachschubanforderungen.sql new file mode 100644 index 0000000..317617f --- /dev/null +++ b/sql/storedProcedure/bp1/getNachschubanforderungen.sql @@ -0,0 +1,127 @@ +DROP PROCEDURE IF EXISTS getNachschubanforderungen; +DELIMITER $$ + +CREATE PROCEDURE getNachschubanforderungen() +READS SQL DATA +BEGIN +SELECT + bp1.NACHSCHUBANFORDERUNG_ID, + bp1.RESSOURCE_ID, + bp1.RESSOURCE_TYP, + bp1.LAGER_ID, + bp1.LAGERTYP, + bp1.AKTUELLE_MENGE, + bp1.MENGE_EINHEIT, + bp1.MIN_SCHWELLENWERT, + bp1.VERBRAUCH_PRO_SOL, + bp1.SICHERHEITSPUFFER_7_SOL, + bp1.ANFORDERUNGSMENGE, + bp1.INTERN_VERFUEGBARE_MENGE, + CASE + WHEN bp1.IST_ABGELAUFEN = 1 AND bp1.IST_UNTER_MINDESTBESTAND = 1 + THEN 'ABGELAUFEN_UND_UNTER_MINDESTBESTAND' + WHEN bp1.IST_ABGELAUFEN = 1 + THEN 'ABGELAUFENER_BESTAND_ERSETZEN' + ELSE 'UNTER_MINDESTBESTAND' + END AS ANFORDERUNGSGRUND, + CASE + WHEN bp1.PRIORITAET = 1 + OR bp1.IST_ABGELAUFEN = 1 + OR bp1.INTERN_VERFUEGBARE_MENGE < bp1.ANFORDERUNGSMENGE + THEN 'HOCH' + WHEN bp1.PRIORITAET = 2 + THEN 'MITTEL' + ELSE 'NIEDRIG' + END AS ANFORDERUNGSPRIORITAET, + CASE + WHEN bp1.IST_ABGELAUFEN = 1 + THEN 'BESTAND_SPERREN_UND_ERSATZ_BESCHAFFEN' + WHEN bp1.INTERN_VERFUEGBARE_MENGE >= bp1.ANFORDERUNGSMENGE + THEN 'INTERNE_UMLAGERUNG_PRUEFEN' + ELSE 'EXTERNEN_NACHSCHUB_ANFORDERN' + END AS EMPFOHLENE_MASSNAHME +FROM ( + SELECT + CONCAT('NA-', LPAD(CAST(r.RESSOURCE_ID AS UNSIGNED), 4, '0'), '-', DATE_FORMAT(CURRENT_DATE, '%Y%m%d')) AS NACHSCHUBANFORDERUNG_ID, + r.RESSOURCE_ID, + r.R_TYP AS RESSOURCE_TYP, + ig.LAGER_ID, + l.LAGERTYP, + COALESCE(r.MENGE, 0) AS AKTUELLE_MENGE, + r.MENGE_EINHEIT, + r.MIN_SCHWELLENWERT, + r.VERBRAUCH_PRO_SOL, + COALESCE(r.VERBRAUCH_PRO_SOL, 0) * 7 AS SICHERHEITSPUFFER_7_SOL, + r.PRIORITAET, + CASE + WHEN r.MIN_SCHWELLENWERT IS NOT NULL + AND COALESCE(r.MENGE, 0) < r.MIN_SCHWELLENWERT + THEN 1 + ELSE 0 + END AS IST_UNTER_MINDESTBESTAND, + CASE + WHEN r.ABLAUFDATUM IS NOT NULL + AND DATE(r.ABLAUFDATUM) < CURRENT_DATE + THEN 1 + ELSE 0 + END AS IST_ABGELAUFEN, + CASE + WHEN r.ABLAUFDATUM IS NOT NULL + AND DATE(r.ABLAUFDATUM) < CURRENT_DATE + THEN GREATEST(COALESCE(r.MIN_SCHWELLENWERT, 0), COALESCE(r.MENGE, 0)) + WHEN r.MIN_SCHWELLENWERT IS NOT NULL + AND COALESCE(r.MENGE, 0) < r.MIN_SCHWELLENWERT + THEN GREATEST(r.MIN_SCHWELLENWERT - COALESCE(r.MENGE, 0), 0) + (COALESCE(r.VERBRAUCH_PRO_SOL, 0) * 7) + ELSE 0 + END AS ANFORDERUNGSMENGE, + GREATEST( + COALESCE(rt.NUTZBARE_GESAMTMENGE, 0) + - CASE + WHEN r.ABLAUFDATUM IS NOT NULL + AND DATE(r.ABLAUFDATUM) < CURRENT_DATE + THEN 0 + ELSE COALESCE(r.MENGE, 0) + END, + 0 + ) AS INTERN_VERFUEGBARE_MENGE + FROM RESSOURCE r + LEFT JOIN IST_GELAGERT_IN ig + ON r.RESSOURCE_ID = ig.RESSOURCE_ID + LEFT JOIN LAGER l + ON ig.LAGER_ID = l.LAGER_ID + LEFT JOIN ( + SELECT + R_TYP, + SUM( + CASE + WHEN ABLAUFDATUM IS NULL + OR DATE(ABLAUFDATUM) >= CURRENT_DATE + THEN COALESCE(MENGE, 0) + ELSE 0 + END + ) AS NUTZBARE_GESAMTMENGE + FROM RESSOURCE + GROUP BY R_TYP + ) rt + ON rt.R_TYP = r.R_TYP + WHERE ( + r.MIN_SCHWELLENWERT IS NOT NULL + AND COALESCE(r.MENGE, 0) < r.MIN_SCHWELLENWERT + ) + OR ( + r.ABLAUFDATUM IS NOT NULL + AND DATE(r.ABLAUFDATUM) < CURRENT_DATE + ) +) bp1 +WHERE bp1.ANFORDERUNGSMENGE > 0 +ORDER BY + CASE + WHEN bp1.IST_ABGELAUFEN = 1 THEN 0 + WHEN bp1.PRIORITAET = 1 THEN 1 + ELSE 2 + END ASC, + bp1.ANFORDERUNGSMENGE DESC, + bp1.RESSOURCE_TYP ASC; +END $$ + +DELIMITER ; diff --git a/sql/storedProcedure/bp1/getRessourcesAtRisk.sql b/sql/storedProcedure/bp1/getRessourcesAtRisk.sql new file mode 100644 index 0000000..589eaf4 --- /dev/null +++ b/sql/storedProcedure/bp1/getRessourcesAtRisk.sql @@ -0,0 +1,50 @@ +DROP PROCEDURE IF EXISTS getRessourcesAtRisk; +DELIMITER $$ + +CREATE PROCEDURE getRessourcesAtRisk() +READS SQL DATA +BEGIN +SELECT + r.RESSOURCE_ID, + r.R_TYP AS RESSOURCE_TYP, + COALESCE(r.MENGE, 0) AS AKTUELLE_MENGE, + r.MENGE_EINHEIT, + r.ABLAUFDATUM, + DATEDIFF(DATE(r.ABLAUFDATUM), CURRENT_DATE) AS TAGE_BIS_ABLAUF, + r.PRIORITAET, + ig.LAGER_ID, + l.LAGERTYP, + CASE + WHEN DATE(r.ABLAUFDATUM) < CURRENT_DATE THEN 'ABGELAUFEN' + WHEN DATE(r.ABLAUFDATUM) = CURRENT_DATE THEN 'LAEUFT_HEUTE_AB' + WHEN DATEDIFF(DATE(r.ABLAUFDATUM), CURRENT_DATE) <= 7 THEN 'LAEUFT_IN_7_TAGEN_AB' + ELSE 'LAEUFT_IN_30_TAGEN_AB' + END AS RISIKOSTATUS, + CASE + WHEN DATE(r.ABLAUFDATUM) < CURRENT_DATE THEN 'BESTAND_SPERREN_UND_ERSATZ_PRUEFEN' + WHEN r.PRIORITAET = 1 + OR DATEDIFF(DATE(r.ABLAUFDATUM), CURRENT_DATE) <= 7 + THEN 'BEVORZUGT_VERBRAUCHEN_ODER_ERSETZEN' + ELSE 'FEFO_VERBRAUCH_PLANEN' + END AS EMPFOHLENE_MASSNAHME +FROM RESSOURCE r +LEFT JOIN IST_GELAGERT_IN ig + ON r.RESSOURCE_ID = ig.RESSOURCE_ID +LEFT JOIN LAGER l + ON ig.LAGER_ID = l.LAGER_ID +WHERE r.ABLAUFDATUM IS NOT NULL + AND DATE(r.ABLAUFDATUM) <= DATE_ADD(CURRENT_DATE, INTERVAL 30 DAY) +ORDER BY + CASE + WHEN DATE(r.ABLAUFDATUM) < CURRENT_DATE THEN 0 + ELSE 1 + END ASC, + r.ABLAUFDATUM ASC, + CASE + WHEN r.PRIORITAET IS NULL THEN 99 + ELSE r.PRIORITAET + END ASC, + r.R_TYP ASC; +END $$ + +DELIMITER ; diff --git a/sql/storedProcedure/bp1/getRessourcesBelowMin.sql b/sql/storedProcedure/bp1/getRessourcesBelowMin.sql new file mode 100644 index 0000000..40eb2e7 --- /dev/null +++ b/sql/storedProcedure/bp1/getRessourcesBelowMin.sql @@ -0,0 +1,46 @@ +DROP PROCEDURE IF EXISTS getRessourcesBelowMin; +DELIMITER $$ + +CREATE PROCEDURE getRessourcesBelowMin() +READS SQL DATA +BEGIN +SELECT + r.RESSOURCE_ID, + r.R_TYP AS RESSOURCE_TYP, + COALESCE(r.MENGE, 0) AS AKTUELLE_MENGE, + r.MENGE_EINHEIT, + r.MIN_SCHWELLENWERT, + GREATEST(r.MIN_SCHWELLENWERT - COALESCE(r.MENGE, 0), 0) AS FEHLMENGE, + ROUND( + (GREATEST(r.MIN_SCHWELLENWERT - COALESCE(r.MENGE, 0), 0) / NULLIF(r.MIN_SCHWELLENWERT, 0)) * 100, + 2 + ) AS FEHLMENGE_PROZENT, + r.PRIORITAET, + ig.LAGER_ID, + l.LAGERTYP, + CASE + WHEN r.PRIORITAET = 1 + OR GREATEST(r.MIN_SCHWELLENWERT - COALESCE(r.MENGE, 0), 0) >= (r.MIN_SCHWELLENWERT * 0.5) + THEN 'SOFORT_PRUEFEN' + WHEN r.PRIORITAET = 2 + THEN 'HOCH' + ELSE 'MITTEL' + END AS HANDLUNGSPRIORITAET, + 'UNTER_MINDESTBESTAND' AS STATUS +FROM RESSOURCE r +LEFT JOIN IST_GELAGERT_IN ig + ON r.RESSOURCE_ID = ig.RESSOURCE_ID +LEFT JOIN LAGER l + ON ig.LAGER_ID = l.LAGER_ID +WHERE r.MIN_SCHWELLENWERT IS NOT NULL + AND COALESCE(r.MENGE, 0) < r.MIN_SCHWELLENWERT +ORDER BY + CASE + WHEN r.PRIORITAET IS NULL THEN 99 + ELSE r.PRIORITAET + END ASC, + FEHLMENGE DESC, + r.R_TYP ASC; +END $$ + +DELIMITER ; diff --git a/sql/storedProcedure/bp2/getExterneAbgabeVorbereitung.sql b/sql/storedProcedure/bp2/getExterneAbgabeVorbereitung.sql new file mode 100644 index 0000000..4da5496 --- /dev/null +++ b/sql/storedProcedure/bp2/getExterneAbgabeVorbereitung.sql @@ -0,0 +1,56 @@ +DROP PROCEDURE IF EXISTS getExterneAbgabeVorbereitung; +DELIMITER $$ + +CREATE PROCEDURE getExterneAbgabeVorbereitung() +READS SQL DATA +BEGIN +SELECT + rv.VERKAUF_ID, + rv.STATUS AS VERKAUF_STATUS, + rv.ERSTELLT_AM, + rv.WAEHRUNG, + rv.GESAMTWERT, + eu.UNTERNEHMEN_ID, + eu.NAME AS UNTERNEHMEN_NAME, + eu.BRANCHE, + eu.KONTAKT_NAME, + eu.KONTAKT_EMAIL, + rvp.VERKAUF_POSITION_ID, + rvp.RESSOURCE_ID, + r.R_TYP AS RESSOURCE_TYP, + rvp.LAGER_ID, + l.LAGERTYP, + rvp.MENGE AS ABGABE_MENGE, + rvp.EINHEIT, + rvp.EINZELPREIS, + rvp.POSITIONSWERT, + rub.BEWERTUNG_ID, + rub.VERKAUFBARE_MENGE AS FREIGEGEBENE_MENGE, + rub.STATUS AS BEWERTUNGSSTATUS, + CASE + WHEN LOWER(COALESCE(rv.STATUS, '')) IN ('vorbereitet', 'freigegeben') + AND rvp.MENGE <= COALESCE(rub.VERKAUFBARE_MENGE, rvp.MENGE) + THEN 'ABGABE_FACHLICH_VORBEREITET' + WHEN rvp.MENGE > COALESCE(rub.VERKAUFBARE_MENGE, 0) + THEN 'MENGE_PRUEFEN' + ELSE 'STATUS_PRUEFEN' + END AS ABGABE_STATUS, + rv.BEMERKUNG +FROM RESSOURCEN_VERKAUF rv +INNER JOIN EXTERNES_UNTERNEHMEN eu + ON rv.UNTERNEHMEN_ID = eu.UNTERNEHMEN_ID +INNER JOIN RESSOURCEN_VERKAUF_POSITION rvp + ON rv.VERKAUF_ID = rvp.VERKAUF_ID +INNER JOIN RESSOURCE r + ON rvp.RESSOURCE_ID = r.RESSOURCE_ID +INNER JOIN LAGER l + ON rvp.LAGER_ID = l.LAGER_ID +LEFT JOIN RESSOURCEN_UEBERSCHUSS_BEWERTUNG rub + ON rvp.BEWERTUNG_ID = rub.BEWERTUNG_ID +ORDER BY + rv.ERSTELLT_AM DESC, + rv.VERKAUF_ID ASC, + rvp.VERKAUF_POSITION_ID ASC; +END $$ + +DELIMITER ; diff --git a/sql/storedProcedure/bp2/getRessourcenUeberschuss.sql b/sql/storedProcedure/bp2/getRessourcenUeberschuss.sql new file mode 100644 index 0000000..b0589b5 --- /dev/null +++ b/sql/storedProcedure/bp2/getRessourcenUeberschuss.sql @@ -0,0 +1,70 @@ +DROP PROCEDURE IF EXISTS getRessourcenUeberschuss; +DELIMITER $$ + +CREATE PROCEDURE getRessourcenUeberschuss() +READS SQL DATA +BEGIN +SELECT + bp2.RESSOURCE_ID, + bp2.RESSOURCE_TYP, + bp2.LAGER_ID, + bp2.LAGERTYP, + bp2.AKTUELLE_MENGE, + bp2.MENGE_EINHEIT, + bp2.MIN_SCHWELLENWERT, + bp2.VERBRAUCH_PRO_SOL, + bp2.SICHERHEITSPUFFER_7_SOL, + bp2.MINDESTRESERVE, + bp2.VERKAUFBARE_MENGE, + ROUND((bp2.VERKAUFBARE_MENGE / NULLIF(bp2.AKTUELLE_MENGE, 0)) * 100, 2) AS VERKAUFBARE_MENGE_PROZENT, + bp2.PRIORITAET, + CASE + WHEN bp2.PRIORITAET = 1 THEN 'NUR_NACH_FREIGABE' + WHEN bp2.VERKAUFBARE_MENGE >= bp2.MINDESTRESERVE THEN 'DEUTLICHER_UEBERSCHUSS' + ELSE 'MOEGLICHER_UEBERSCHUSS' + END AS UEBERSCHUSS_STATUS, + CASE + WHEN bp2.PRIORITAET = 1 THEN 'KOLONIELEITUNG_PRUEFEN' + ELSE 'VERKAUFSPOTENZIAL_BEWERTEN' + END AS EMPFOHLENE_MASSNAHME +FROM ( + SELECT + r.RESSOURCE_ID, + r.R_TYP AS RESSOURCE_TYP, + ig.LAGER_ID, + l.LAGERTYP, + COALESCE(r.MENGE, 0) AS AKTUELLE_MENGE, + r.MENGE_EINHEIT, + r.MIN_SCHWELLENWERT, + r.VERBRAUCH_PRO_SOL, + COALESCE(r.VERBRAUCH_PRO_SOL, 0) * 7 AS SICHERHEITSPUFFER_7_SOL, + COALESCE(r.MIN_SCHWELLENWERT, 0) + (COALESCE(r.VERBRAUCH_PRO_SOL, 0) * 7) AS MINDESTRESERVE, + GREATEST( + COALESCE(r.MENGE, 0) + - (COALESCE(r.MIN_SCHWELLENWERT, 0) + (COALESCE(r.VERBRAUCH_PRO_SOL, 0) * 7)), + 0 + ) AS VERKAUFBARE_MENGE, + r.PRIORITAET, + r.ABLAUFDATUM + FROM RESSOURCE r + INNER JOIN IST_GELAGERT_IN ig + ON r.RESSOURCE_ID = ig.RESSOURCE_ID + INNER JOIN LAGER l + ON ig.LAGER_ID = l.LAGER_ID + WHERE r.MIN_SCHWELLENWERT IS NOT NULL +) bp2 +WHERE bp2.VERKAUFBARE_MENGE > 0 + AND ( + bp2.ABLAUFDATUM IS NULL + OR DATE(bp2.ABLAUFDATUM) >= CURRENT_DATE + ) +ORDER BY + CASE + WHEN bp2.PRIORITAET = 1 THEN 1 + ELSE 0 + END ASC, + bp2.VERKAUFBARE_MENGE DESC, + bp2.RESSOURCE_TYP ASC; +END $$ + +DELIMITER ; diff --git a/sql/storedProcedure/bp2/getVerkaufspotenzial.sql b/sql/storedProcedure/bp2/getVerkaufspotenzial.sql new file mode 100644 index 0000000..b5445d7 --- /dev/null +++ b/sql/storedProcedure/bp2/getVerkaufspotenzial.sql @@ -0,0 +1,73 @@ +DROP PROCEDURE IF EXISTS getVerkaufspotenzial; +DELIMITER $$ + +CREATE PROCEDURE getVerkaufspotenzial() +READS SQL DATA +BEGIN +SELECT + bp2.RESSOURCE_ID, + bp2.RESSOURCE_TYP, + bp2.LAGER_ID, + bp2.LAGERTYP, + bp2.AKTUELLE_MENGE, + bp2.MENGE_EINHEIT, + bp2.MINDESTRESERVE, + bp2.VERKAUFBARE_MENGE, + bp2.PRIORITAET, + rub.BEWERTUNG_ID, + rub.BEWERTUNGSDATUM, + rub.STATUS AS BEWERTUNGSSTATUS, + rub.BEGRUENDUNG, + CASE + WHEN LOWER(COALESCE(rub.STATUS, '')) = 'freigegeben' THEN 'BEREITS_FREIGEGEBEN' + WHEN bp2.PRIORITAET = 1 THEN 'KRITISCH_PRUEFEN' + WHEN bp2.VERKAUFBARE_MENGE >= bp2.MINDESTRESERVE THEN 'HOHES_VERKAUFSPOTENZIAL' + ELSE 'MITTLERES_VERKAUFSPOTENZIAL' + END AS VERKAUFSPOTENZIAL_STATUS, + CASE + WHEN LOWER(COALESCE(rub.STATUS, '')) = 'freigegeben' THEN 'EXTERNE_ABGABE_VORBEREITEN' + WHEN bp2.PRIORITAET = 1 THEN 'FREIGABE_DURCH_KOLONIELEITUNG_EINHOLEN' + ELSE 'UEBERSCHUSSBEWERTUNG_ANLEGEN' + END AS EMPFOHLENE_MASSNAHME +FROM ( + SELECT + r.RESSOURCE_ID, + r.R_TYP AS RESSOURCE_TYP, + ig.LAGER_ID, + l.LAGERTYP, + COALESCE(r.MENGE, 0) AS AKTUELLE_MENGE, + r.MENGE_EINHEIT, + COALESCE(r.MIN_SCHWELLENWERT, 0) + (COALESCE(r.VERBRAUCH_PRO_SOL, 0) * 7) AS MINDESTRESERVE, + GREATEST( + COALESCE(r.MENGE, 0) + - (COALESCE(r.MIN_SCHWELLENWERT, 0) + (COALESCE(r.VERBRAUCH_PRO_SOL, 0) * 7)), + 0 + ) AS VERKAUFBARE_MENGE, + r.PRIORITAET, + r.ABLAUFDATUM + FROM RESSOURCE r + INNER JOIN IST_GELAGERT_IN ig + ON r.RESSOURCE_ID = ig.RESSOURCE_ID + INNER JOIN LAGER l + ON ig.LAGER_ID = l.LAGER_ID + WHERE r.MIN_SCHWELLENWERT IS NOT NULL +) bp2 +LEFT JOIN RESSOURCEN_UEBERSCHUSS_BEWERTUNG rub + ON bp2.RESSOURCE_ID = rub.RESSOURCE_ID + AND bp2.LAGER_ID = rub.LAGER_ID +WHERE bp2.VERKAUFBARE_MENGE > 0 + AND ( + bp2.ABLAUFDATUM IS NULL + OR DATE(bp2.ABLAUFDATUM) >= CURRENT_DATE + ) +ORDER BY + CASE + WHEN LOWER(COALESCE(rub.STATUS, '')) = 'freigegeben' THEN 0 + WHEN bp2.PRIORITAET = 1 THEN 2 + ELSE 1 + END ASC, + bp2.VERKAUFBARE_MENGE DESC, + bp2.RESSOURCE_TYP ASC; +END $$ + +DELIMITER ; diff --git a/sql/storedProcedure/getActiveVehicles.sql b/sql/storedProcedure/general/getActiveVehicles.sql similarity index 100% rename from sql/storedProcedure/getActiveVehicles.sql rename to sql/storedProcedure/general/getActiveVehicles.sql diff --git a/sql/storedProcedure/getAllCitizens.sql b/sql/storedProcedure/general/getAllCitizens.sql similarity index 100% rename from sql/storedProcedure/getAllCitizens.sql rename to sql/storedProcedure/general/getAllCitizens.sql diff --git a/sql/storedProcedure/getAllCitizensByName.sql b/sql/storedProcedure/general/getAllCitizensByName.sql similarity index 100% rename from sql/storedProcedure/getAllCitizensByName.sql rename to sql/storedProcedure/general/getAllCitizensByName.sql diff --git a/sql/storedProcedure/getAllEmployees.sql b/sql/storedProcedure/general/getAllEmployees.sql similarity index 100% rename from sql/storedProcedure/getAllEmployees.sql rename to sql/storedProcedure/general/getAllEmployees.sql diff --git a/sql/storedProcedure/getAllLager.sql b/sql/storedProcedure/general/getAllLager.sql similarity index 100% rename from sql/storedProcedure/getAllLager.sql rename to sql/storedProcedure/general/getAllLager.sql diff --git a/sql/storedProcedure/getAvgWorkTimeByBeruf.sql b/sql/storedProcedure/general/getAvgWorkTimeByBeruf.sql similarity index 100% rename from sql/storedProcedure/getAvgWorkTimeByBeruf.sql rename to sql/storedProcedure/general/getAvgWorkTimeByBeruf.sql diff --git a/sql/storedProcedure/getBewohnerAtAddress.sql b/sql/storedProcedure/general/getBewohnerAtAddress.sql similarity index 100% rename from sql/storedProcedure/getBewohnerAtAddress.sql rename to sql/storedProcedure/general/getBewohnerAtAddress.sql diff --git a/sql/storedProcedure/getCitiesCount.sql b/sql/storedProcedure/general/getCitiesCount.sql similarity index 100% rename from sql/storedProcedure/getCitiesCount.sql rename to sql/storedProcedure/general/getCitiesCount.sql diff --git a/sql/storedProcedure/getCitiesWithKoords.sql b/sql/storedProcedure/general/getCitiesWithKoords.sql similarity index 100% rename from sql/storedProcedure/getCitiesWithKoords.sql rename to sql/storedProcedure/general/getCitiesWithKoords.sql diff --git a/sql/storedProcedure/getCitiesWithStats.sql b/sql/storedProcedure/general/getCitiesWithStats.sql similarity index 100% rename from sql/storedProcedure/getCitiesWithStats.sql rename to sql/storedProcedure/general/getCitiesWithStats.sql diff --git a/sql/storedProcedure/getCitiesWithoutEnergySource.sql b/sql/storedProcedure/general/getCitiesWithoutEnergySource.sql similarity index 100% rename from sql/storedProcedure/getCitiesWithoutEnergySource.sql rename to sql/storedProcedure/general/getCitiesWithoutEnergySource.sql diff --git a/sql/storedProcedure/getCitiesWithoutTransportConnection.sql b/sql/storedProcedure/general/getCitiesWithoutTransportConnection.sql similarity index 100% rename from sql/storedProcedure/getCitiesWithoutTransportConnection.sql rename to sql/storedProcedure/general/getCitiesWithoutTransportConnection.sql diff --git a/sql/storedProcedure/getCitizensCount.sql b/sql/storedProcedure/general/getCitizensCount.sql similarity index 100% rename from sql/storedProcedure/getCitizensCount.sql rename to sql/storedProcedure/general/getCitizensCount.sql diff --git a/sql/storedProcedure/getCurrentBithday.sql b/sql/storedProcedure/general/getCurrentBithday.sql similarity index 100% rename from sql/storedProcedure/getCurrentBithday.sql rename to sql/storedProcedure/general/getCurrentBithday.sql diff --git a/sql/storedProcedure/getCurrentEnergieLeistung.sql b/sql/storedProcedure/general/getCurrentEnergieLeistung.sql similarity index 100% rename from sql/storedProcedure/getCurrentEnergieLeistung.sql rename to sql/storedProcedure/general/getCurrentEnergieLeistung.sql diff --git a/sql/storedProcedure/getDepartmentResourceDependencies.sql b/sql/storedProcedure/general/getDepartmentResourceDependencies.sql similarity index 100% rename from sql/storedProcedure/getDepartmentResourceDependencies.sql rename to sql/storedProcedure/general/getDepartmentResourceDependencies.sql diff --git a/sql/storedProcedure/getDepartmentsWithLeaders.sql b/sql/storedProcedure/general/getDepartmentsWithLeaders.sql similarity index 100% rename from sql/storedProcedure/getDepartmentsWithLeaders.sql rename to sql/storedProcedure/general/getDepartmentsWithLeaders.sql diff --git a/sql/storedProcedure/getEmployeeCountByDepartment.sql b/sql/storedProcedure/general/getEmployeeCountByDepartment.sql similarity index 100% rename from sql/storedProcedure/getEmployeeCountByDepartment.sql rename to sql/storedProcedure/general/getEmployeeCountByDepartment.sql diff --git a/sql/storedProcedure/getEmployeeProfile.sql b/sql/storedProcedure/general/getEmployeeProfile.sql similarity index 100% rename from sql/storedProcedure/getEmployeeProfile.sql rename to sql/storedProcedure/general/getEmployeeProfile.sql diff --git a/sql/storedProcedure/getEnergySourcesByCity.sql b/sql/storedProcedure/general/getEnergySourcesByCity.sql similarity index 100% rename from sql/storedProcedure/getEnergySourcesByCity.sql rename to sql/storedProcedure/general/getEnergySourcesByCity.sql diff --git a/sql/storedProcedure/getFlotte.sql b/sql/storedProcedure/general/getFlotte.sql similarity index 100% rename from sql/storedProcedure/getFlotte.sql rename to sql/storedProcedure/general/getFlotte.sql diff --git a/sql/storedProcedure/getLagerVersorgungAtRisk.sql b/sql/storedProcedure/general/getLagerVersorgungAtRisk.sql similarity index 100% rename from sql/storedProcedure/getLagerVersorgungAtRisk.sql rename to sql/storedProcedure/general/getLagerVersorgungAtRisk.sql diff --git a/sql/storedProcedure/getLowTreibstoff.sql b/sql/storedProcedure/general/getLowTreibstoff.sql similarity index 100% rename from sql/storedProcedure/getLowTreibstoff.sql rename to sql/storedProcedure/general/getLowTreibstoff.sql diff --git a/sql/storedProcedure/getMissionsBericht.sql b/sql/storedProcedure/general/getMissionsBericht.sql similarity index 100% rename from sql/storedProcedure/getMissionsBericht.sql rename to sql/storedProcedure/general/getMissionsBericht.sql diff --git a/sql/storedProcedure/getMitarbeiterByBeruf.sql b/sql/storedProcedure/general/getMitarbeiterByBeruf.sql similarity index 100% rename from sql/storedProcedure/getMitarbeiterByBeruf.sql rename to sql/storedProcedure/general/getMitarbeiterByBeruf.sql diff --git a/sql/storedProcedure/getMitarbeiterRolle.sql b/sql/storedProcedure/general/getMitarbeiterRolle.sql similarity index 100% rename from sql/storedProcedure/getMitarbeiterRolle.sql rename to sql/storedProcedure/general/getMitarbeiterRolle.sql diff --git a/sql/storedProcedure/getResidentCountByAddress.sql b/sql/storedProcedure/general/getResidentCountByAddress.sql similarity index 100% rename from sql/storedProcedure/getResidentCountByAddress.sql rename to sql/storedProcedure/general/getResidentCountByAddress.sql diff --git a/sql/storedProcedure/getRessourceLog.sql b/sql/storedProcedure/general/getRessourceLog.sql similarity index 100% rename from sql/storedProcedure/getRessourceLog.sql rename to sql/storedProcedure/general/getRessourceLog.sql diff --git a/sql/storedProcedure/getVehiclesByStatus.sql b/sql/storedProcedure/general/getVehiclesByStatus.sql similarity index 100% rename from sql/storedProcedure/getVehiclesByStatus.sql rename to sql/storedProcedure/general/getVehiclesByStatus.sql diff --git a/sql/storedProcedure/updateMitarbeiterLogin.sql b/sql/storedProcedure/general/updateMitarbeiterLogin.sql similarity index 100% rename from sql/storedProcedure/updateMitarbeiterLogin.sql rename to sql/storedProcedure/general/updateMitarbeiterLogin.sql diff --git a/sql/storedProcedure/getRessourcesAtRisk.sql b/sql/storedProcedure/getRessourcesAtRisk.sql deleted file mode 100644 index d1e60fe..0000000 --- a/sql/storedProcedure/getRessourcesAtRisk.sql +++ /dev/null @@ -1,19 +0,0 @@ -DROP PROCEDURE IF EXISTS getRessourcesAtRisk; -DELIMITER $$ - -CREATE PROCEDURE getRessourcesAtRisk() -READS SQL DATA -BEGIN -SELECT - r.RESSOURCE_ID, - r.R_TYP AS ressource_typ, - r.ABLAUFDATUM, - ig.LAGER_ID -FROM RESSOURCE r -INNER JOIN IST_GELAGERT_IN ig - ON r.RESSOURCE_ID = ig.RESSOURCE_ID -WHERE r.ABLAUFDATUM BETWEEN CURRENT_DATE AND DATE_ADD(CURRENT_DATE, INTERVAL 30 DAY) -ORDER BY r.ABLAUFDATUM ASC; -END $$ - -DELIMITER ; diff --git a/sql/storedProcedure/getRessourcesBelowMin.sql b/sql/storedProcedure/getRessourcesBelowMin.sql deleted file mode 100644 index d327dac..0000000 --- a/sql/storedProcedure/getRessourcesBelowMin.sql +++ /dev/null @@ -1,21 +0,0 @@ -DROP PROCEDURE IF EXISTS getRessourcesBelowMin; -DELIMITER $$ - -CREATE PROCEDURE getRessourcesBelowMin() -READS SQL DATA -BEGIN -SELECT - r.RESSOURCE_ID, - r.R_TYP, - r.MENGE, - r.MIN_SCHWELLENWERT, - l.LAGERTYP -FROM RESSOURCE r -INNER JOIN IST_GELAGERT_IN ig - ON r.RESSOURCE_ID = ig.RESSOURCE_ID -INNER JOIN LAGER l - ON ig.LAGER_ID = l.LAGER_ID -WHERE r.MENGE < r.MIN_SCHWELLENWERT; -END $$ - -DELIMITER ; diff --git a/sql/storedProcedure/getRessourcenWithLager.sql b/sql/storedProcedure/shared/getRessourcenWithLager.sql similarity index 100% rename from sql/storedProcedure/getRessourcenWithLager.sql rename to sql/storedProcedure/shared/getRessourcenWithLager.sql diff --git a/sql/storedProcedure/getStorageResourceSummary.sql b/sql/storedProcedure/shared/getStorageResourceSummary.sql similarity index 100% rename from sql/storedProcedure/getStorageResourceSummary.sql rename to sql/storedProcedure/shared/getStorageResourceSummary.sql