# Projekt: iServ Softwarebestell-System

## Projektübersicht
Entwicklung eines webbasierten Systems zur Verwaltung von Softwarebestellungen für iServ-Schulserver. Schulen bestellen Software über ein Webformular, die Bestellungen werden intern geprüft/bearbeitet/genehmigt und anschließend als ausgefülltes PDF an iServ übermittelt.

---

## Anforderungen

### Funktionale Anforderungen

#### 1. Webformular (Frontend)
- **Basis:** Bereits vorhandenes HTML-Formular (`Softwarebestellung-v2.htm`)
- **Felder:**
  - Name der Schule (Pflichtfeld)
  - Checkbox: Software noch nicht von iServ paketiert (Pflichtfeld)
  - Software-Grunddaten: Name, Version, Hersteller, Website, ISBN (optional)
  - Bezugsquelle: Radio-Buttons (Kostenfreier Download / Kundenserver / Datenträger)
  - Lizenzierung: Radio-Buttons (Keine / Lizenzschlüssel / Hardware-Dongle / Lizenzserver)
- **Aktion beim Absenden:**
  - Daten in Datenbank speichern
  - E-Mail-Ticket erstellen
  - Bestätigung an Absender

#### 2. Backend / Datenverwaltung

##### Datenbank-Schema
```sql
CREATE TABLE bestellungen (
    id INT AUTO_INCREMENT PRIMARY KEY,
    schul_name VARCHAR(255) NOT NULL,
    status ENUM('neu', 'in_pruefung', 'korrektur_notwendig', 'genehmigt', 'abgelehnt') DEFAULT 'neu',
    
    -- Software-Daten
    software_name VARCHAR(255) NOT NULL,
    version VARCHAR(100) NOT NULL,
    hersteller VARCHAR(255) NOT NULL,
    hersteller_website VARCHAR(500) NOT NULL,
    isbn VARCHAR(50),
    
    -- Bezug
    software_quelle ENUM('downloadFree', 'downloadCustomer', 'physicalMedia') NOT NULL,
    download_pfad TEXT,
    
    -- Lizenzierung
    lizenz_typ ENUM('noLicense', 'licenseKey', 'licenseHardware', 'licenseServer') NOT NULL,
    lizenzschluessel TEXT,
    lizenzserver_anmerkungen TEXT,
    
    -- Metadaten
    erstellt_am TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    bearbeitet_am TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    bearbeitet_von VARCHAR(100),
    notizen TEXT,
    
    INDEX idx_status (status),
    INDEX idx_schule (schul_name),
    INDEX idx_erstellt (erstellt_am)
);

-- Optional: Änderungshistorie
CREATE TABLE bestellungen_historie (
    id INT AUTO_INCREMENT PRIMARY KEY,
    bestellung_id INT NOT NULL,
    aenderung_von VARCHAR(100),
    aenderung_am TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    feld VARCHAR(100),
    alter_wert TEXT,
    neuer_wert TEXT,
    FOREIGN KEY (bestellung_id) REFERENCES bestellungen(id) ON DELETE CASCADE
);
```

##### Admin-Interface (Web-basiert)
- **Übersicht:** Liste aller Bestellungen mit Filter (Status, Datum, Schule)
- **Detailansicht:** Bestellung anzeigen + bearbeiten
- **Funktionen:**
  - Status ändern
  - Felder korrigieren
  - Notizen hinzufügen
  - Änderungshistorie anzeigen
  - PDF generieren & preview
  - PDF per E-Mail an iServ senden

#### 3. PDF-Generierung
- **Input:** Daten aus Datenbank
- **Output:** Ausgefülltes iServ-Formular (`Informationen_Softwarepaket_RZ.pdf`)
- **Methode:** 
  - Option A: PDF mit TCPDF/FPDF von Grund auf erstellen (Layout nachbauen)
  - Option B: PDF-Template mit Formularfeldern befüllen (benötigt PDF mit interaktiven Feldern)
- **Felder entsprechend Original-PDF:**
  - Checkbox: Software noch nicht von iServ paketiert
  - Name der Software
  - Versionsnummer
  - Hersteller
  - Hersteller-Website
  - ISBN
  - Bezug: Checkboxen + Textfelder
  - Lizenzierung: Checkboxen + Textfelder

#### 4. E-Mail-Integration
- **Beim Formular-Absenden:**
  - An: Internes Ticket-System (konfigurierbare Adresse)
  - Betreff: "Neue Softwarebestellung: [Software-Name] - [Schul-Name]"
  - Inhalt: Alle Formulardaten + Link zum Admin-Interface
  
- **Bei Genehmigung:**
  - An: iServ (konfigurierbare Adresse)
  - Betreff: "Softwarepaketierung: [Software-Name]"
  - Anhang: Ausgefülltes PDF
  - CC: Besteller (Schule)

---

## Technischer Stack

### Empfohlen
```
Frontend:      HTML5, CSS3, Vanilla JavaScript (bereits vorhanden)
Backend:       PHP 8.x
Datenbank:     PostgreSQL (oder MySQL/MariaDB)
PDF:           TCPDF oder FPDF-Library
Webserver:     Apache/Nginx mit mod_php oder PHP-FPM
E-Mail:        PHPMailer oder Symfony Mailer
Session:       PHP Sessions für Admin-Login
```

### Optional
```
Framework:     Slim PHP / Laravel (wenn größeres Projekt)
Auth:          Einfaches Login-System (Benutzername/Passwort)
Logging:       Monolog für Fehler-/Änderungs-Logs
```

---

## Projekt-Struktur

```
softwarebestellung/
├── public/                      # Öffentlich zugänglich
│   ├── index.php               # Formular-Frontend (umbenannt von .html)
│   ├── submit.php              # Formular-Verarbeitung
│   ├── css/
│   │   └── style.css
│   └── js/
│       └── form.js
│
├── admin/                       # Passwort-geschützt
│   ├── index.php               # Übersicht Bestellungen
│   ├── detail.php              # Bestellung bearbeiten
│   ├── login.php               # Admin-Login
│   └── logout.php
│
├── includes/                    # PHP-Backend-Logik
│   ├── config.php              # Konfiguration (DB, E-Mail, Pfade)
│   ├── database.php            # DB-Verbindung + Queries
│   ├── email.php               # E-Mail-Funktionen
│   ├── pdf_generator.php       # PDF-Erstellung
│   └── auth.php                # Authentication
│
├── templates/                   # HTML-Templates (wenn MVC-Ansatz)
│   ├── header.php
│   ├── footer.php
│   └── admin_layout.php
│
├── vendor/                      # Composer Dependencies
│   └── (TCPDF, PHPMailer, etc.)
│
├── data/                        # Daten (außerhalb public!)
│   ├── pdfs/                   # Generierte PDFs (temporär)
│   └── logs/                   # Log-Dateien
│
├── sql/
│   ├── schema.sql              # DB-Schema
│   └── seed.sql                # Test-Daten (optional)
│
├── composer.json                # PHP-Dependencies
└── README.md                    # Projekt-Dokumentation
```

---

## Entwicklungs-Phasen

### Phase 1: Basis-Setup (Priorität HOCH)
- [ ] Datenbank-Schema erstellen
- [ ] Formular: POST an PHP-Backend
- [ ] Daten in DB speichern
- [ ] E-Mail-Ticket bei Neubestellung
- [ ] Admin-Login (einfach, hart-codiert)
- [ ] Admin: Bestellungen anzeigen (Liste + Detail)

### Phase 2: Bearbeitungsfunktionen (Priorität HOCH)
- [ ] Admin: Bestellung bearbeiten (Formular)
- [ ] Status-Änderungen
- [ ] Notizen hinzufügen
- [ ] Änderungs-Historie (optional aber sinnvoll)

### Phase 3: PDF-Generierung (Priorität HOCH)
- [ ] TCPDF-Integration
- [ ] Layout des iServ-Formulars nachbauen
- [ ] Daten aus DB ins PDF schreiben
- [ ] Download-Funktion im Admin-Interface
- [ ] Automatischer E-Mail-Versand mit PDF an iServ

### Phase 4: Verbesserungen (Priorität MITTEL)
- [ ] Erweiterte Suche/Filter im Admin-Interface
- [ ] Statistiken (z.B. "Häufigste Software-Anfragen")
- [ ] PDF-Preview vor Versand
- [ ] Konfigurier­bare E-Mail-Templates
- [ ] Besseres Rechte-Management (mehrere Admin-Accounts)

### Phase 5: Optional (Nice-to-Have)
- [ ] REST-API für externe Systeme
- [ ] Automatische Duplikat-Erkennung (Software schon bestellt?)
- [ ] Anhänge hochladen (z.B. Lizenz-Dokumente)
- [ ] Dashboard mit Metriken
- [ ] Export (Excel/CSV)

---

## Sicherheits-Anforderungen

1. **SQL-Injection:** Prepared Statements verwenden (PDO)
2. **XSS:** Alle Ausgaben escapen (`htmlspecialchars()`)
3. **CSRF:** CSRF-Tokens bei Formularen
4. **Admin-Zugang:** 
   - Passwort-geschützt (bcrypt-Hash)
   - Session-Timeout
   - HTTPS erzwingen (in Produktion)
5. **Dateien:** PDFs außerhalb öffentlichem Webroot oder mit Access-Control
6. **Eingabe-Validierung:** Serverseitig alle Felder prüfen
7. **E-Mail:** Header-Injection verhindern

---

## Konfigurations-Beispiel (config.php)

```php
<?php
// Datenbank
define('DB_HOST', 'localhost');
define('DB_NAME', 'softwarebestellung');
define('DB_USER', 'dein_user');
define('DB_PASS', 'dein_passwort');
define('DB_TYPE', 'pgsql'); // oder 'mysql'

// E-Mail
define('MAIL_TICKET_TO', 'tickets@example.com');
define('MAIL_ISERV_TO', 'software@iserv.de');
define('MAIL_FROM', 'noreply@example.com');
define('MAIL_FROM_NAME', 'Softwarebestell-System');

// SMTP (falls benötigt)
define('SMTP_HOST', 'smtp.example.com');
define('SMTP_PORT', 587);
define('SMTP_USER', 'smtp_user');
define('SMTP_PASS', 'smtp_pass');

// Admin
define('ADMIN_USER', 'admin');
define('ADMIN_PASS_HASH', '$2y$10$...'); // bcrypt Hash

// Pfade
define('BASE_PATH', __DIR__ . '/../');
define('PDF_OUTPUT_PATH', BASE_PATH . 'data/pdfs/');
define('LOG_PATH', BASE_PATH . 'data/logs/');

// Sonstiges
define('TIMEZONE', 'Europe/Berlin');
date_default_timezone_set(TIMEZONE);
```

---

## Test-Szenarien

1. **Neue Bestellung erstellen**
   - Formular ausfüllen → Absenden
   - Prüfen: Eintrag in DB vorhanden?
   - Prüfen: E-Mail erhalten?

2. **Bestellung bearbeiten**
   - Admin-Login → Bestellung öffnen
   - Feld ändern (z.B. Versionsnummer korrigieren)
   - Speichern → Prüfen: Änderung in DB?
   - Optional: Historie prüfen

3. **PDF generieren**
   - Status auf "genehmigt" setzen
   - PDF generieren
   - Prüfen: Alle Felder korrekt befüllt?
   - Layout korrekt?

4. **E-Mail an iServ**
   - PDF generieren → Senden
   - Prüfen: E-Mail mit PDF-Anhang erhalten?
   - CC an Schule gesendet?

5. **Fehlerszenarien**
   - Fehlende Pflichtfelder → Fehlermeldung?
   - Ungültige URL → Validierung greift?
   - Doppel-Submit → Verhindert?

---

## Deployment-Hinweise

### Entwicklung
```bash
# PostgreSQL DB erstellen
createdb softwarebestellung
psql softwarebestellung < sql/schema.sql

# Composer installieren (falls noch nicht vorhanden)
curl -sS https://getcomposer.org/installer | php
php composer.phar install

# PHP-Dev-Server starten (nur für Tests!)
php -S localhost:8000 -t public/
```

### Produktion
- Apache/Nginx VirtualHost einrichten
- HTTPS-Zertifikat (Let's Encrypt)
- `data/` Verzeichnis außerhalb DocumentRoot
- PHP.ini: `display_errors = Off`, `log_errors = On`
- Cronjob für alte PDFs löschen (nach X Tagen)
- Backup-Strategie für Datenbank

---

## Offene Fragen (vor Start klären)

1. **PDF-Original:** Ist das PDF interaktiv (Formularfelder) oder Scan?
   → Bestimmt Methode der PDF-Befüllung

2. **Authentication:** Reicht ein Admin-Account oder mehrere Benutzer?
   → Beeinflusst Rechte-System

3. **E-Mail-Server:** SMTP-Zugang vorhanden oder PHP mail() ausreichend?

4. **Hosting:** Eigener Server (SSH-Zugang) oder Shared Hosting?
   → Bestimmt Deployment-Methode

5. **Datenschutz:** DSGVO-Anforderungen? Löschfristen?
   → Beeinflusst Datenhaltung/Archivierung

6. **Backups:** Automatisiert oder manuell?

---

## Kontakt / Übergabe

**Entwickler:** eblok (Linux-Systemadministrator)  
**Besonderheiten:**
- Bash-Scripting-Erfahrung (User-Management, Server-Automation)
- PostgreSQL-Kenntnisse
- Bevorzugte Sprache: Deutsch
- Fokus: Elegante, wartbare Lösungen

**Zu beachten:**
- Code gut kommentieren (Deutsch OK)
- Best Practices einhalten
- Skalierbarkeit mitdenken
- Dokumentation erstellen

---

## Zeitplan (Schätzung)

| Phase | Aufwand | Dauer |
|-------|---------|-------|
| Phase 1 | 8-12h | 2-3 Tage |
| Phase 2 | 6-8h | 1-2 Tage |
| Phase 3 | 8-10h | 2-3 Tage |
| Testing | 4-6h | 1 Tag |
| **Gesamt** | **26-36h** | **~1 Woche** |

*Bei Teilzeit-Entwicklung entsprechend verlängern*

---

## Erfolgs-Kriterien

✅ Schulen können Software bestellen (Formular funktioniert)  
✅ Bestellungen landen in Datenbank + E-Mail  
✅ Admin kann Bestellungen bearbeiten (Web-Interface)  
✅ PDF wird korrekt generiert (alle Felder befüllt)  
✅ E-Mail mit PDF an iServ funktioniert und kopie zu uns  
✅ System ist sicher (SQL-Injection, XSS, etc. verhindert)  
✅ Code ist wartbar dokumentiert  

---

**Viel Erfolg bei der Umsetzung! 🚀**
