# **Datenbank und Analytik-Funktionen**

Dieser Abschnitt konzentriert sich auf die Struktur der Datenbank sowie die Analyse- und Prognosefunktionen, die im Projekt verwendet werden.

---

## **1. Datenbankstruktur**

Das Datenbankschema wurde mit **Drizzle ORM** definiert und basiert auf SQLite. Die wichtigsten Tabellen und ihre Zwecke sind:

### **1.1. Tabellenübersicht**

#### **`user`**
- Speichert Benutzerinformationen.
- Enthält Rollen wie „admin“ oder „guest“ zur Verwaltung von Berechtigungen.

| **Feld**         | **Typ**    | **Beschreibung**                           |
|-------------------|------------|-------------------------------------------|
| `id`             | `text`     | Eindeutige ID des Benutzers.              |
| `github_id`      | `integer`  | ID des Benutzers aus dem OAuth-Dienst.    |
| `name`           | `text`     | Benutzername.                             |
| `displayName`    | `text`     | Angezeigter Name.                         |
| `email`          | `text`     | E-Mail-Adresse.                           |
| `role`           | `text`     | Benutzerrolle, Standardwert: „guest“.     |

---

#### **`printer`**
- Beschreibt verfügbare Drucker und deren Status.

| **Feld**         | **Typ**    | **Beschreibung**                           |
|-------------------|------------|-------------------------------------------|
| `id`             | `text`     | Eindeutige Drucker-ID.                    |
| `name`           | `text`     | Name des Druckers.                        |
| `description`    | `text`     | Beschreibung oder Spezifikationen.        |
| `status`         | `integer`  | Betriebsstatus (0 = inaktiv, 1 = aktiv).  |

---

#### **`printJob`**
- Speichert Informationen zu Druckaufträgen.

| **Feld**             | **Typ**       | **Beschreibung**                                       |
|-----------------------|---------------|-------------------------------------------------------|
| `id`                 | `text`        | Eindeutige Auftrags-ID.                               |
| `printerId`          | `text`        | Verweis auf die ID des Druckers.                     |
| `userId`             | `text`        | Verweis auf die ID des Benutzers.                    |
| `startAt`            | `integer`     | Startzeit des Druckauftrags (Unix-Timestamp).        |
| `durationInMinutes`  | `integer`     | Dauer des Druckauftrags in Minuten.                  |
| `comments`           | `text`        | Zusätzliche Kommentare.                              |
| `aborted`            | `integer`     | 1 = Abgebrochen, 0 = Erfolgreich abgeschlossen.      |
| `abortReason`        | `text`        | Grund für den Abbruch (falls zutreffend).            |

---

#### **`session`**
- Verwaltert Benutzer-Sitzungen und Ablaufzeiten.

| **Feld**         | **Typ**    | **Beschreibung**                           |
|-------------------|------------|-------------------------------------------|
| `id`             | `text`     | Eindeutige Sitzungs-ID.                   |
| `user_id`        | `text`     | Verweis auf die ID des Benutzers.         |
| `expires_at`     | `integer`  | Zeitpunkt, wann die Sitzung abläuft.      |

---

### **1.2. Relationen**
- `printer` → `printJob`: Druckaufträge sind an spezifische Drucker gebunden.
- `user` → `printJob`: Druckaufträge werden Benutzern zugewiesen.
- `user` → `session`: Sitzungen verknüpfen Benutzer mit Login-Details.

---

## **2. Analytik-Funktionen**

Das Projekt bietet verschiedene Analytik- und Prognosetools, um die Druckernutzung und Fehler zu überwachen.

### **2.1. Fehlerratenanalyse**
- Funktion: `calculatePrinterErrorRate` (in `src/utils/analytics/error-rate.ts`).
- Berechnet die prozentuale Fehlerrate für jeden Drucker basierend auf abgebrochenen Aufträgen.

Beispielausgabe:
```json
[
  { "name": "Drucker 1", "errorRate": 5.2 },
  { "name": "Drucker 2", "errorRate": 3.7 }
]
```

---

### **2.2. Abbruchgründe**
- Funktion: `calculateAbortReasonsCount` (in `src/utils/analytics/errors.ts`).
- Zählt die Häufigkeit der Abbruchgründe aus der Tabelle `printJob`.

Beispielausgabe:
```json
[
  { "abortReason": "Materialmangel", "count": 10 },
  { "abortReason": "Düsenverstopfung", "count": 7 }
]
```

---

### **2.3. Nutzung und Prognosen**
#### Nutzung:
- Funktion: `calculatePrinterUtilization` (in `src/utils/analytics/utilization.ts`).
- Berechnet die Nutzung der Drucker in Prozent.

Beispielausgabe:
```json
{ "printerId": "1", "utilizationPercentage": 85 }
```

#### Prognosen:
- Funktion: `forecastPrinterUsage` (in `src/utils/analytics/forecast.ts`).
- Nutzt historische Daten, um die erwartete Druckernutzung für kommende Tage/Wochen zu schätzen.

Beispielausgabe:
```json
[
  { "day": 1, "usageMinutes": 300 },
  { "day": 2, "usageMinutes": 200 }
]
```

---

### **2.4. Druckvolumen**
- Funktion: `calculatePrintVolumes` (in `src/utils/analytics/volume.ts`).
- Vergleicht die Anzahl der abgeschlossenen Druckaufträge für heute, diese Woche und diesen Monat.

Beispielausgabe:
```json
{
  "today": 15,
  "thisWeek": 90,
  "thisMonth": 300
}
```

---

## **3. Datenbankinitialisierung**
Die Datenbank wird über Skripte in der `package.json` initialisiert:
```bash
pnpm run db:clean       # Datenbank und Migrationsordner löschen
pnpm run db:generate    # Neues Schema generieren
pnpm run db:migrate     # Migrationsskripte ausführen
```

Nächster Schritt: [=> Bereitstellungsdetails und Best Practices](./Bereitstellungsdetails.md)