211 lines
6.2 KiB
Markdown
211 lines
6.2 KiB
Markdown
# Worksheets Collection Setup
|
|
|
|
## 📋 Was ist ein Worksheet (WSID)?
|
|
|
|
Ein **Worksheet** ist ein **Arbeitsschritt-Eintrag** für einen Work Order (Ticket). Jedes Mal, wenn ein Techniker an einem Ticket arbeitet, wird ein neues Worksheet erstellt.
|
|
|
|
### Unterschied: WOID vs WSID
|
|
|
|
| Konzept | Beschreibung | Beispiel |
|
|
|---------|--------------|----------|
|
|
| **WOID** (Work Order ID) | Das Haupt-Ticket | 59203 |
|
|
| **WSID** (Work Sheet ID) | Einzelner Arbeitsschritt | 100001 |
|
|
|
|
**Beziehung:** Ein WOID kann **viele WSIDs** haben (1:n)
|
|
|
|
### Beispiel aus der Praxis:
|
|
|
|
```
|
|
Ticket WOID 59203: "Router-Problem bei Kunde XYZ"
|
|
|
|
├── WSID 100001 (29.12.2025, 10:00-10:30, Max M.)
|
|
│ └── "Fernanalyse durchgeführt, Router neu gestartet"
|
|
│ Status: Open → Occupied
|
|
│
|
|
├── WSID 100002 (29.12.2025, 14:00-14:45, Max M.)
|
|
│ └── "Firmware Update durchgeführt"
|
|
│ Status: Occupied → Assigned
|
|
│
|
|
└── WSID 100003 (30.12.2025, 09:00-09:15, Lisa S.)
|
|
└── "Vor-Ort-Check: Alles funktioniert"
|
|
Status: Assigned → Closed
|
|
```
|
|
|
|
**Gesamtarbeitszeit für WOID 59203:** 30 + 45 + 15 = **90 Minuten**
|
|
|
|
---
|
|
|
|
## 🔧 Appwrite Collection einrichten
|
|
|
|
### Collection erstellen
|
|
|
|
1. Gehe zu **Appwrite Dashboard** → **Databases** → `woms-database`
|
|
2. Klicke auf **Create Collection**
|
|
3. **Collection ID:** `worksheets`
|
|
4. **Name:** `Work Sheets`
|
|
|
|
### Attribute hinzufügen
|
|
|
|
| Attribut Name | Typ | Größe | Required | Array | Default | Beschreibung |
|
|
|--------------|-----|-------|----------|-------|---------|--------------|
|
|
| `wsid` | string | 10 | ✓ | - | - | Work Sheet ID (6-stellig, z.B. "100000") |
|
|
| `woid` | string | 10 | ✓ | - | - | Verknüpfter Work Order (z.B. "59203") |
|
|
| `workorderId` | string | 50 | ✓ | - | - | Appwrite Document ID des Work Orders |
|
|
| `employeeId` | string | 50 | ✓ | - | - | ID des Mitarbeiters (aus Auth) |
|
|
| `employeeName` | string | 255 | ✓ | - | - | Name des Mitarbeiters |
|
|
| `employeeShort` | string | 10 | - | - | - | Kürzel (z.B. "KNSO") |
|
|
| `serviceType` | string | 50 | ✓ | - | `Remote` | Remote/On Site/Off Site/COMMENT |
|
|
| `oldStatus` | string | 50 | ✓ | - | - | Status vorher |
|
|
| `newStatus` | string | 50 | ✓ | - | - | Status nachher |
|
|
| `oldResponseLevel` | string | 50 | - | - | - | Response Level vorher |
|
|
| `newResponseLevel` | string | 50 | - | - | - | Response Level nachher |
|
|
| `totalTime` | integer | - | ✓ | - | `0` | Arbeitszeit in Minuten |
|
|
| `startDate` | string | 50 | ✓ | - | - | Startdatum (dd.mm.yyyy) |
|
|
| `startTime` | string | 10 | - | - | - | Startzeit (hhmm) |
|
|
| `endDate` | string | 50 | ✓ | - | - | Enddatum (dd.mm.yyyy) |
|
|
| `endTime` | string | 10 | - | - | - | Endzeit (hhmm) |
|
|
| `details` | string | 10000 | ✓ | - | - | Beschreibung der Arbeit |
|
|
| `isComment` | boolean | - | - | - | `false` | Nur Kommentar (keine Arbeitszeit) |
|
|
| `createdAt` | datetime | - | - | - | - | Erstellungszeitpunkt |
|
|
|
|
### Permissions einrichten
|
|
|
|
1. Gehe zu **Settings** → **Permissions**
|
|
2. Setze folgende Berechtigungen:
|
|
|
|
**Read Access:**
|
|
- ✅ `Users` (Alle eingeloggten Benutzer können Worksheets lesen)
|
|
|
|
**Create Access:**
|
|
- ✅ `Users` (Alle eingeloggten Benutzer können Worksheets erstellen)
|
|
|
|
**Update Access:**
|
|
- ✅ `Users` (Eigene Worksheets können bearbeitet werden)
|
|
|
|
**Delete Access:**
|
|
- ❌ Keine (Worksheets sollten nicht gelöscht werden - Audit Trail!)
|
|
|
|
### Indexes erstellen
|
|
|
|
Für bessere Performance:
|
|
|
|
1. **Index 1: woid_index**
|
|
- Key: `woid`
|
|
- Type: `key`
|
|
- Order: `DESC`
|
|
- → Schnelles Finden aller Worksheets für einen Work Order
|
|
|
|
2. **Index 2: employee_index**
|
|
- Key: `employeeId`
|
|
- Type: `key`
|
|
- Order: `DESC`
|
|
- → Schnelles Finden aller Worksheets eines Mitarbeiters
|
|
|
|
3. **Index 3: date_index**
|
|
- Key: `startDate`
|
|
- Type: `key`
|
|
- Order: `DESC`
|
|
- → Zeitbasierte Abfragen
|
|
|
|
---
|
|
|
|
## 🎯 WSID-Generierung
|
|
|
|
### Regeln:
|
|
- **6-stellige Zahlen** (100000, 100001, 100002, ...)
|
|
- **Global eindeutig** (über alle Work Orders hinweg)
|
|
- **Sequentiell aufsteigend**
|
|
- **Nur Zahlen**, keine Buchstaben
|
|
|
|
### Algorithmus:
|
|
1. Finde höchste existierende WSID in der Datenbank
|
|
2. Addiere +1
|
|
3. Falls keine WSID existiert: Starte bei 100000
|
|
|
|
---
|
|
|
|
## 📊 Verbesserungen gegenüber dem Original
|
|
|
|
### 1. Automatische Zeitberechnung
|
|
- System berechnet `totalTime` aus `startTime` und `endTime`
|
|
- Manuelles Überschreiben möglich
|
|
|
|
### 2. Arbeitszeit-Aggregation
|
|
- Gesamtarbeitszeit pro WOID wird automatisch berechnet
|
|
- Anzeige: "Gesamt: 90 Minuten (3 Worksheets)"
|
|
|
|
### 3. Status-Historie
|
|
- Komplette Historie: Wer hat wann welchen Status gesetzt?
|
|
- Nachvollziehbarkeit
|
|
|
|
### 4. Kommentar-Funktion
|
|
- Worksheets mit `isComment = true` zählen keine Arbeitszeit
|
|
- Reine Notizen/Updates
|
|
|
|
### 5. Mitarbeiter-Zuordnung
|
|
- Jedes Worksheet ist einem Mitarbeiter zugeordnet
|
|
- Report: Wer hat wie viel Zeit investiert?
|
|
|
|
---
|
|
|
|
## 🔗 Integration in Work Orders
|
|
|
|
### Beim Anzeigen eines Tickets:
|
|
```javascript
|
|
// Work Order laden
|
|
const workorder = await getWorkorder(woid)
|
|
|
|
// Alle Worksheets zu diesem Work Order laden
|
|
const worksheets = await getWorksheets(woid)
|
|
|
|
// Gesamtarbeitszeit berechnen
|
|
const totalMinutes = worksheets.reduce((sum, ws) => sum + ws.totalTime, 0)
|
|
```
|
|
|
|
### Beim Erstellen eines Worksheets:
|
|
1. Aktuellen Work Order Status holen
|
|
2. Worksheet-Formular anzeigen (mit aktuellem Status als "old status")
|
|
3. Worksheet speichern
|
|
4. Work Order Status aktualisieren (auf "new status")
|
|
|
|
---
|
|
|
|
## 📝 Workflow-Beispiel
|
|
|
|
**Techniker Max öffnet Ticket 59203:**
|
|
|
|
1. Klickt auf "Add Worksheet"
|
|
2. System füllt aus:
|
|
- WOID: 59203
|
|
- Old Status: "Open"
|
|
- Employee: "Max Müller" (aus Login)
|
|
- Datum: heute
|
|
3. Max trägt ein:
|
|
- Service Type: "Remote"
|
|
- New Status: "Occupied"
|
|
- Start: 10:00, End: 10:30 (→ automatisch 30 min)
|
|
- Details: "Router neu gestartet"
|
|
4. System generiert WSID: 100001
|
|
5. Work Order Status wird auf "Occupied" aktualisiert
|
|
|
|
---
|
|
|
|
## ✅ Checkliste
|
|
|
|
- [ ] Collection `worksheets` in Appwrite erstellt
|
|
- [ ] Alle Attribute hinzugefügt
|
|
- [ ] Permissions konfiguriert
|
|
- [ ] Indexes erstellt
|
|
- [ ] Collection ID in `.env` / `appwrite.js` eingetragen
|
|
|
|
---
|
|
|
|
## 🚀 Nächste Schritte
|
|
|
|
Nach dem Setup:
|
|
1. `useWorksheets.js` Hook implementieren
|
|
2. `CreateWorksheetModal.jsx` Komponente erstellen
|
|
3. Worksheet-Liste in Ticket-Details einbauen
|
|
4. Zeitaggregation implementieren
|
|
|