From 92840c2424987210f825a2a207f300b5faa21eb2 Mon Sep 17 00:00:00 2001 From: donpat1to Date: Thu, 23 Oct 2025 21:16:27 +0200 Subject: [PATCH] added license --- LICENSE-COMMERCIAL | 21 +++ README.md | 12 +- frontend/src/pages/Auth/Login.tsx | 4 +- frontend/src/pages/Help/Help.tsx | 243 ++++++++++++++++++------------ package-lock.json | 6 - 5 files changed, 178 insertions(+), 108 deletions(-) create mode 100644 LICENSE-COMMERCIAL delete mode 100644 package-lock.json diff --git a/LICENSE-COMMERCIAL b/LICENSE-COMMERCIAL new file mode 100644 index 0000000..b7c4e1f --- /dev/null +++ b/LICENSE-COMMERCIAL @@ -0,0 +1,21 @@ +COMMERCIAL LICENSE AGREEMENT +Copyright (c) 2025 Patrick Mahnke-Hartmann + +This software, "Schichtenplaner", is offered under a dual licensing model. + +1. Open-Source License + You may use this software under the terms of the MIT License + (see LICENSE file) for non-commercial, personal, or educational use. + +2. Commercial License + Commercial use of this software requires a separate paid license. + This includes, but is not limited to: + - Use in proprietary, for-profit, or internal business applications + - Use within paid services or SaaS offerings + - Integration into commercial software or distributions + +To obtain a commercial license, please contact: +📧 patrick@mahnke-hartmann.dev +or open an inquiry via GitHub: https://github.com/donpat1to/Schichtenplaner + +Without a valid commercial license, all commercial rights are reserved. diff --git a/README.md b/README.md index 73166a4..fee0b68 100644 --- a/README.md +++ b/README.md @@ -2,4 +2,14 @@ Aufteilung der Schichten unter Mitarbeitern -du knlich \ No newline at end of file +## 🧾 License + +This project uses a **dual license model**: + +- **Community Edition:** Licensed under [MIT](./LICENSE) for personal and non-commercial use. +- **Commercial Edition:** A [commercial license](./LICENSE-COMMERCIAL) is required for any for-profit or business use. + +To obtain a commercial license, contact: +📧 patrick@mahnke-hartmann.dev + +[![License: MIT & Commercial](https://img.shields.io/badge/license-MIT%20%7C%20Commercial-purple)](#license) diff --git a/frontend/src/pages/Auth/Login.tsx b/frontend/src/pages/Auth/Login.tsx index 50e154b..65c808d 100644 --- a/frontend/src/pages/Auth/Login.tsx +++ b/frontend/src/pages/Auth/Login.tsx @@ -119,7 +119,7 @@ const Login: React.FC = () => { }}>

Anmeldung

-
+
@@ -139,7 +139,7 @@ const Login: React.FC = () => { />
-
+
diff --git a/frontend/src/pages/Help/Help.tsx b/frontend/src/pages/Help/Help.tsx index 23b7d70..9ac7a8b 100644 --- a/frontend/src/pages/Help/Help.tsx +++ b/frontend/src/pages/Help/Help.tsx @@ -1,81 +1,46 @@ // frontend/src/pages/Help/Help.tsx -import React, { useState, useEffect } from 'react'; +import React from 'react'; const Help: React.FC = () => { - const [currentStage, setCurrentStage] = useState(0); - const [isAnimating, setIsAnimating] = useState(false); + const businessRules = [ + { rule: "Mitarbeiter werden nur Schichten zugewiesen, für die sie sich eingetragen haben", critical: true }, + { rule: "Maximal 1 Schicht pro Tag pro Mitarbeiter", critical: true }, + { rule: "Schichten haben Mindest- und Maximalkapazitäten", critical: true }, + { rule: "Trainees benötigen erfahrene Begleitung in jeder Schicht", critical: true }, + { rule: "Mitarbeiter, die nicht alleine arbeiten können, müssen Begleitung haben", critical: true }, + { rule: "Vertragslimits: Klein=1 Schicht/Woche, Groß=2 Schichten/Woche", critical: true }, + { rule: "Manager werden automatisch ihren bevorzugten Schichten zugewiesen", critical: false } + ]; - const algorithmStages = [ + const schedulingStages = [ { - title: "📊 Phase A: Reguläre Mitarbeiterplanung", - description: "Zuweisung aller Mitarbeiter außer Manager", - steps: [ - "Grundabdeckung: Mindestens 1 Mitarbeiter pro Schicht", - "Erfahrene Mitarbeiter werden bevorzugt", - "Verhindere 'Neu allein' Situationen", - "Fülle Schichten bis zur Zielbesetzung" - ], - color: "#3498db" + title: "1. Verfügbarkeitsprüfung", + description: "Nur Mitarbeiter, die sich für Schichten eingetragen haben (Verfügbarkeit 1 oder 2), werden berücksichtigt." }, { - title: "👑 Phase B: Manager-Einfügung", - description: "Manager wird seinen bevorzugten Schichten zugewiesen", - steps: [ - "Manager wird festen Schichten zugewiesen", - "Erfahrene Mitarbeiter werden zu Manager-Schichten hinzugefügt", - "Bei Problemen: Austausch oder Bewegung von Mitarbeitern", - "Fallback: Nicht-erfahrene als Backup" - ], - color: "#e74c3c" + title: "2. Modellaufbau", + description: "Das System erstellt ein mathematisches Modell mit allen Variablen und Constraints." }, { - title: "🔧 Phase C: Reparatur & Validierung", - description: "Probleme erkennen und automatisch beheben", - steps: [ - "Überbesetzte erfahrene Mitarbeiter identifizieren", - "Mitarbeiter-Pool für Neuverteilung erstellen", - "Priorisierte Zuweisung zu Problem-Schichten", - "Finale Validierung aller Geschäftsregeln" - ], - color: "#2ecc71" + title: "3. CP-SAT Optimierung", + description: "Google's Constraint Programming Solver findet die beste Zuordnung unter allen Regeln." }, { - title: "✅ Finale Prüfung", - description: "Zusammenfassung und Freigabe", - steps: [ - "Reparatur-Bericht generieren", - "Kritische vs. nicht-kritische Probleme klassifizieren", - "Veröffentlichungsstatus bestimmen", - "Benutzerfreundliche Zusammenfassung anzeigen" - ], - color: "#f39c12" + title: "4. Manager-Zuweisung", + description: "Manager werden automatisch ihren Wunschschichten (Verfügbarkeit 1) zugeordnet." + }, + { + title: "5. Validierung", + description: "Die Lösung wird auf Regelverletzungen geprüft und ein Bericht generiert." } ]; - const businessRules = [ - { rule: "Manager darf nicht allein arbeiten", critical: true }, - { rule: "Erfahrene mit canWorkAlone: false dürfen nicht allein arbeiten", critical: true }, - { rule: "Keine leeren Schichten", critical: true }, - { rule: "Keine 'Neu allein' Situationen", critical: true }, - { rule: "Manager sollte mit erfahrenem Mitarbeiter arbeiten", critical: false }, - { rule: "Vertragslimits einhalten", critical: true }, - { rule: "Nicht zu viele erfahrene Mitarbeiter in einer Schicht", critical: false } + const preferenceLevels = [ + { level: 1, label: "Bevorzugt", description: "Mitarbeiter möchte diese Schicht unbedingt arbeiten", color: "#27ae60" }, + { level: 2, label: "Verfügbar", description: "Mitarbeiter ist verfügbar für diese Schicht", color: "#f39c12" }, + { level: 3, label: "Nicht verfügbar", description: "Mitarbeiter kann diese Schicht nicht arbeiten", color: "#e74c3c" } ]; - useEffect(() => { - const interval = setInterval(() => { - if (isAnimating) { - setCurrentStage((prev) => (prev + 1) % algorithmStages.length); - } - }, 3000); - - return () => clearInterval(interval); - }, [isAnimating]); - - const toggleAnimation = () => { - setIsAnimating(!isAnimating); - }; - return (

❓ Hilfe & Support - Scheduling Algorithmus

@@ -89,7 +54,7 @@ const Help: React.FC = () => { boxShadow: '0 4px 6px rgba(0,0,0,0.1)', border: '1px solid #e0e0e0' }}> -

📋 Validierungs Regeln

+

📋 Geschäftsregeln

{businessRules.map((rule, index) => (
{ color: rule.critical ? '#e74c3c' : '#f39c12', fontWeight: 'bold' }}> - {rule.critical ? 'KRITISCH' : 'WARNUNG'} + {rule.critical ? 'HART' : 'WEICH'}
))}
- {/* Algorithm Explanation */} + {/* Scheduling Process */}
{ boxShadow: '0 4px 6px rgba(0,0,0,0.1)', border: '1px solid #e0e0e0' }}> -

🎯 Wie der Algorithmus funktioniert

+

⚙️ Scheduling-Prozess

-
-
-

🏗️ Phasen-basierter Ansatz

-

Der Algorithmus arbeitet in klar definierten Phasen, um komplexe Probleme schrittweise zu lösen und Stabilität zu gewährleisten.

-
-
+
+ {schedulingStages.map((stage, index) => ( +
+
+ {index + 1} +
+
+

{stage.title}

+

{stage.description}

+
+
+ ))} +
+ {/* Preference Levels */}
-

💡 Tipps für beste Ergebnisse

-
    -
  • Stellen Sie sicher, dass alle Mitarbeiter ihre Verfügbarkeit eingetragen haben
  • -
  • Überprüfen Sie die Vertragstypen (klein = 1 Schicht/Woche, groß = 2 Schichten/Woche)
  • -
  • Markieren Sie erfahrene Mitarbeiter, die alleine arbeiten können
  • -
  • Planen Sie Manager-Verfügbarkeit im Voraus
  • -
-
- - +
+ {preferenceLevels.map((pref) => ( +
+
+ Level {pref.level}: {pref.label} +
+ {pref.description} +
+ ))} +
+
+ + {/* Tips */} +
+

💡 Best Practices für erfolgreiches Scheduling

+
+
+

Vor dem Scheduling

+
    +
  • Stellen Sie sicher, dass alle Mitarbeiter ihre Verfügbarkeit eingetragen haben
  • +
  • Überprüfen Sie die Mitarbeiterprofile (Trainee/Erfahren, Alleinarbeit möglich)
  • +
  • Bestätigen Sie die Vertragstypen und Schichtanforderungen
  • +
+
+
+

Nach dem Scheduling

+
    +
  • Prüfen Sie den Lösungsbericht auf Verletzungen
  • +
  • Kontrollieren Sie unterbesetzte Schichten
  • +
  • Validieren Sie Trainee-Betreuung und Alleinarbeits-Regeln
  • +
+
+
+
+ + {/* Technical Info */} +
+

🔧 Technische Informationen

+

+ Lösungsalgorithmus: Google OR-Tools CP-SAT Solver • + Fallback: TypeScript-basierter Solver • + Maximale Laufzeit: 105 Sekunden +

+
); }; diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index b49a6a1..0000000 --- a/package-lock.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "Schichtenplaner", - "lockfileVersion": 3, - "requires": true, - "packages": {} -}