Veraltete Anleitungen entfernt, README neu
20 Einrichtungs- und Fix-Notizen vom Dezember 2025 beschrieben das alte Appwrite (cloud.appwrite.io bzw. alte Projekt-IDs), zufällige WOIDs und Felder, die es so nicht mehr gibt. Das README beschreibt jetzt den echten Stand: Deploy über Branch test (Achtung: jeder gepushte Branch geht live), Datenmodell in Kurzform und das Zusammenspiel mit Kundenportal und ticket-integrations. LOCAL_DEV.md bleibt. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
df62bcbc55
commit
7852593a7a
22 files changed
+33
-2827
No files matched your search
@@ -1,116 +0,0 @@
|
||||
# Admin-Panel Setup
|
||||
|
||||
Das Admin-Panel wurde erfolgreich erstellt! Hier ist die Anleitung zur Einrichtung.
|
||||
|
||||
## Was wurde erstellt:
|
||||
|
||||
1. **Admin-Panel Seite** (`/admin`) - Verwaltung der Dropdown-Optionen
|
||||
2. **useAdminConfig Hook** - Lädt und speichert die Konfiguration
|
||||
3. **Navigation erweitert** - Admin-Link erscheint für Admin-Benutzer
|
||||
4. **CreateTicketModal angepasst** - Verwendet jetzt die konfigurierten Werte
|
||||
|
||||
## Schritt 1: Config Collection in Appwrite erstellen
|
||||
|
||||
1. Gehe zu `https://appwrite.webklar.com`
|
||||
2. Öffne dein Projekt **woms**
|
||||
3. Gehe zu **Databases** → **woms-database**
|
||||
4. Klicke auf **Create Collection**
|
||||
5. **Collection ID**: `config`
|
||||
6. **Name**: `Admin Configuration`
|
||||
|
||||
### Attribute hinzufügen:
|
||||
|
||||
| Attribut Name | Typ | Größe | Required | Array |
|
||||
|--------------|-----|-------|----------|-------|
|
||||
| `ticketTypes` | string | - | - | ✓ |
|
||||
| `systems` | string | - | - | ✓ |
|
||||
| `responseLevels` | string | - | - | ✓ |
|
||||
| `serviceTypes` | string | - | - | ✓ |
|
||||
| `priorities` | string | - | - | ✓ |
|
||||
|
||||
**Wichtig:** Alle Attribute müssen als **Array** konfiguriert sein!
|
||||
|
||||
### Berechtigungen:
|
||||
|
||||
- **Read**: `Any` (damit alle Benutzer die Optionen sehen können)
|
||||
- **Create**: `Users` (nur eingeloggte Benutzer können erstellen)
|
||||
- **Update**: `Users` (nur eingeloggte Benutzer können aktualisieren)
|
||||
- **Delete**: `Users` (optional)
|
||||
|
||||
## Schritt 2: Admin-Berechtigung konfigurieren
|
||||
|
||||
Aktuell wird ein Benutzer als Admin erkannt, wenn:
|
||||
- Die Email `admin` enthält, ODER
|
||||
- Die Email `kenso@webklar.com` ist, ODER
|
||||
- Der Benutzer ein `admin` Label hat
|
||||
|
||||
### Option A: Email-basierte Erkennung (aktuell implementiert)
|
||||
|
||||
Die Admin-Erkennung erfolgt in:
|
||||
- `src/pages/AdminPage.jsx` (Zeile ~10)
|
||||
- `src/components/Navbar.jsx` (Zeile ~29)
|
||||
|
||||
Du kannst die Bedingung anpassen:
|
||||
|
||||
```javascript
|
||||
const isAdmin = user?.email?.includes('admin') ||
|
||||
user?.email === 'deine@email.com' ||
|
||||
user?.labels?.includes('admin')
|
||||
```
|
||||
|
||||
### Option B: Appwrite Labels verwenden
|
||||
|
||||
1. Gehe zu **Auth** → **Users** im Appwrite Dashboard
|
||||
2. Wähle einen Benutzer aus
|
||||
3. Füge ein **Label** hinzu: `admin`
|
||||
4. Die Admin-Erkennung funktioniert dann automatisch
|
||||
|
||||
## Schritt 3: Admin-Panel verwenden
|
||||
|
||||
1. **Logge dich als Admin ein**
|
||||
2. Gehe zu **Admin** in der Navigation (erscheint nur für Admins)
|
||||
3. Bearbeite die Dropdown-Optionen:
|
||||
- **Work Order Types** - Ticket-Typen
|
||||
- **Affected Systems** - Betroffene Systeme
|
||||
- **Response Levels** - Response-Ebenen
|
||||
- **Service Types** - Service-Typen
|
||||
- **Priorities** - Prioritäten (mit Value und Label)
|
||||
4. Klicke auf **Konfiguration speichern**
|
||||
|
||||
## Schritt 4: Testen
|
||||
|
||||
1. **Als Admin:**
|
||||
- Öffne das Admin-Panel
|
||||
- Ändere einige Optionen
|
||||
- Speichere die Konfiguration
|
||||
|
||||
2. **Als normaler Benutzer:**
|
||||
- Erstelle ein neues Ticket
|
||||
- Die geänderten Optionen sollten jetzt in den Dropdowns erscheinen
|
||||
|
||||
## Funktionsweise
|
||||
|
||||
- **Admin-Panel**: Lädt die Konfiguration aus Appwrite und erlaubt Bearbeitung
|
||||
- **CreateTicketModal**: Lädt die Konfiguration automatisch und verwendet die Werte
|
||||
- **Fallback**: Falls die Config nicht geladen werden kann, werden Standard-Werte verwendet
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### "Collection config not found"
|
||||
- Stelle sicher, dass die Collection `config` erstellt wurde
|
||||
- Überprüfe die Collection ID (muss genau `config` sein)
|
||||
|
||||
### "Zugriff verweigert"
|
||||
- Überprüfe die Admin-Erkennung in `AdminPage.jsx`
|
||||
- Stelle sicher, dass deine Email den Admin-Kriterien entspricht
|
||||
|
||||
### "Konfiguration wird nicht geladen"
|
||||
- Überprüfe die Berechtigungen der `config` Collection
|
||||
- Stelle sicher, dass **Read** auf `Any` oder `Users` gesetzt ist
|
||||
|
||||
### "Änderungen werden nicht übernommen"
|
||||
- Überprüfe die **Update** Berechtigung der `config` Collection
|
||||
- Stelle sicher, dass du als Admin eingeloggt bist
|
||||
|
||||
Viel Erfolg! 🚀
|
||||
|
||||
@@ -1,74 +0,0 @@
|
||||
# Admin-Rolle in Appwrite einrichten
|
||||
|
||||
Die Admin-Erkennung verwendet jetzt die **Labels** aus Appwrite. Ein Benutzer ist Admin, wenn er das Label `admin` hat.
|
||||
|
||||
## Schritt 1: Admin-Label in Appwrite hinzufügen
|
||||
|
||||
### Option A: Über das Appwrite Dashboard
|
||||
|
||||
1. Gehe zu `https://appwrite.webklar.com`
|
||||
2. Öffne dein Projekt **woms**
|
||||
3. Gehe zu **Auth** → **Users**
|
||||
4. Wähle den Benutzer aus, der Admin werden soll
|
||||
5. Klicke auf **Edit** oder öffne die Benutzer-Details
|
||||
6. Scrolle zu **Labels** (oder **Custom Attributes**)
|
||||
7. Klicke auf **Add Label** oder **+**
|
||||
8. Gib `admin` ein
|
||||
9. Klicke auf **Save** oder **Update**
|
||||
|
||||
### Option B: Über die Appwrite API (für mehrere Benutzer)
|
||||
|
||||
Du kannst auch Labels programmatisch hinzufügen, aber das ist normalerweise nicht nötig.
|
||||
|
||||
## Schritt 2: Überprüfen
|
||||
|
||||
Nach dem Hinzufügen des Labels:
|
||||
|
||||
1. **Logge dich aus** und wieder **ein** (damit die Session aktualisiert wird)
|
||||
2. Oder lade die Seite neu (F5)
|
||||
3. Der **Admin**-Link sollte jetzt in der Navigation erscheinen
|
||||
4. Du solltest Zugriff auf das Admin-Panel haben
|
||||
|
||||
## Schritt 3: Mehrere Admins hinzufügen
|
||||
|
||||
Um weitere Admins hinzuzufügen:
|
||||
|
||||
1. Wiederhole Schritt 1 für jeden Benutzer
|
||||
2. Füge das Label `admin` hinzu
|
||||
3. Die Benutzer müssen sich neu einloggen
|
||||
|
||||
## Wie es funktioniert
|
||||
|
||||
- **AuthContext**: Prüft ob `user.labels` das Label `admin` enthält
|
||||
- **Navbar**: Zeigt den Admin-Link nur an, wenn `isAdmin === true`
|
||||
- **AdminPage**: Blockiert den Zugriff, wenn der Benutzer kein Admin ist
|
||||
|
||||
## Debugging
|
||||
|
||||
Falls der Admin-Link nicht erscheint:
|
||||
|
||||
1. **Browser-Konsole öffnen** (F12)
|
||||
2. Prüfe das User-Objekt:
|
||||
```javascript
|
||||
// In der Browser-Konsole:
|
||||
console.log(user)
|
||||
// Prüfe ob user.labels das Array ['admin'] enthält
|
||||
```
|
||||
|
||||
3. **Überprüfe in Appwrite:**
|
||||
- Gehe zu **Auth** → **Users**
|
||||
- Öffne deinen Benutzer
|
||||
- Stelle sicher, dass das Label `admin` vorhanden ist
|
||||
|
||||
4. **Session aktualisieren:**
|
||||
- Logge dich aus und wieder ein
|
||||
- Oder lade die Seite neu
|
||||
|
||||
## Wichtig
|
||||
|
||||
- Das Label muss genau `admin` heißen (kleingeschrieben)
|
||||
- Der Benutzer muss sich nach dem Hinzufügen des Labels neu einloggen
|
||||
- Labels sind case-sensitive
|
||||
|
||||
Viel Erfolg! 🚀
|
||||
|
||||
@@ -1,102 +0,0 @@
|
||||
# Indexes und Berechtigungen für workorders Collection
|
||||
|
||||
Diese Anleitung zeigt dir, wie du die Indexes und Berechtigungen für deine `workorders` Collection einrichtest.
|
||||
|
||||
## Deine Collection-Informationen
|
||||
|
||||
- **Collection ID**: `6943bf7d001901baa60c`
|
||||
- **Database ID**: `6943bf0e0003291f8c35`
|
||||
|
||||
## Schritt 1: Indexes erstellen
|
||||
|
||||
Indexes verbessern die Performance beim Filtern und Sortieren. Gehe zu deiner `workorders` Collection im Appwrite Dashboard:
|
||||
|
||||
1. Öffne dein Appwrite-Projekt
|
||||
2. Gehe zu **Databases** → **woms-database** → **workorders**
|
||||
3. Klicke auf den Tab **Indexes**
|
||||
4. Klicke auf **Create Index**
|
||||
|
||||
Erstelle folgende Indexes:
|
||||
|
||||
### Index 1: Status
|
||||
- **Key**: `status`
|
||||
- **Type**: `key`
|
||||
- **Attributes**: `status`
|
||||
- **Order**: `ASC` (aufsteigend)
|
||||
|
||||
### Index 2: Priority
|
||||
- **Key**: `priority`
|
||||
- **Type**: `key`
|
||||
- **Attributes**: `priority`
|
||||
- **Order**: `ASC` (aufsteigend)
|
||||
|
||||
### Index 3: Type
|
||||
- **Key**: `type`
|
||||
- **Type**: `key`
|
||||
- **Attributes**: `type`
|
||||
- **Order**: `ASC` (aufsteigend)
|
||||
|
||||
### Index 4: Customer ID
|
||||
- **Key**: `customerId`
|
||||
- **Type**: `key`
|
||||
- **Attributes**: `customerId`
|
||||
- **Order**: `ASC` (aufsteigend)
|
||||
|
||||
### Index 5: Assigned To
|
||||
- **Key**: `assignedTo`
|
||||
- **Type**: `key`
|
||||
- **Attributes**: `assignedTo`
|
||||
- **Order**: `ASC` (aufsteigend)
|
||||
|
||||
### Index 6: Created At
|
||||
- **Key**: `createdAt`
|
||||
- **Type**: `key`
|
||||
- **Attributes**: `createdAt`
|
||||
- **Order**: `DESC` (absteigend)
|
||||
|
||||
## Schritt 2: Berechtigungen (Permissions) einrichten
|
||||
|
||||
1. Bleibe in deiner `workorders` Collection
|
||||
2. Klicke auf den Tab **Settings**
|
||||
3. Scrolle zu **Permissions**
|
||||
|
||||
### Read (Lesen)
|
||||
- Klicke auf **Add Role** unter "Read"
|
||||
- Wähle **Any** (wenn alle Tickets sichtbar sein sollen) ODER **Users** (wenn nur eingeloggte Benutzer sehen sollen)
|
||||
- **Empfehlung**: `Users` für mehr Sicherheit
|
||||
|
||||
### Create (Erstellen)
|
||||
- Klicke auf **Add Role** unter "Create"
|
||||
- Wähle **Users** (nur eingeloggte Benutzer können Tickets erstellen)
|
||||
|
||||
### Update (Aktualisieren)
|
||||
- Klicke auf **Add Role** unter "Update"
|
||||
- Wähle **Users** (nur eingeloggte Benutzer können Tickets aktualisieren)
|
||||
|
||||
### Delete (Löschen)
|
||||
- Klicke auf **Add Role** unter "Delete"
|
||||
- Wähle **Users** (nur eingeloggte Benutzer können Tickets löschen)
|
||||
|
||||
## Schritt 3: Überprüfung
|
||||
|
||||
Nach dem Einrichten solltest du:
|
||||
1. ✅ 6 Indexes in der Collection sehen
|
||||
2. ✅ 4 Berechtigungen (Read, Create, Update, Delete) konfiguriert haben
|
||||
|
||||
## Wichtig: Authentication aktivieren
|
||||
|
||||
Bevor die Berechtigungen funktionieren, musst du Authentication aktivieren:
|
||||
|
||||
1. Gehe zu **Auth** im linken Menü
|
||||
2. Stelle sicher, dass **Email/Password** aktiviert ist
|
||||
3. Falls nicht, klicke auf **Create** und aktiviere **Email/Password**
|
||||
|
||||
## Testen
|
||||
|
||||
Nach der Einrichtung:
|
||||
1. Starte deine App neu: `npm run dev`
|
||||
2. Erstelle einen Benutzer oder logge dich ein
|
||||
3. Versuche ein Ticket zu erstellen - es sollte funktionieren!
|
||||
|
||||
Viel Erfolg! 🚀
|
||||
|
||||
@@ -1,81 +0,0 @@
|
||||
# Appwrite Platform-Konfiguration - WICHTIG!
|
||||
|
||||
Der Fehler "Project with the requested ID could not be found" kann auch auftreten, wenn die **Platform nicht konfiguriert** ist!
|
||||
|
||||
## Schritt 1: Platform in Appwrite konfigurieren
|
||||
|
||||
1. Gehe zu [https://cloud.appwrite.io](https://cloud.appwrite.io)
|
||||
2. Öffne dein Projekt **woms**
|
||||
3. Gehe zu **Settings** → **Platforms** (oder **Auth** → **Settings**)
|
||||
4. Klicke auf **Add Platform**
|
||||
5. Wähle **Web App**
|
||||
6. Gib einen Namen ein (z.B. "WOMS Web")
|
||||
7. **WICHTIG:** Füge die folgenden Hosts hinzu:
|
||||
- `localhost` (für Development)
|
||||
- `127.0.0.1` (für Development)
|
||||
- Deine Produktions-Domain (falls vorhanden)
|
||||
|
||||
8. Klicke auf **Create**
|
||||
|
||||
## Schritt 2: Email/Password Auth aktivieren
|
||||
|
||||
1. Gehe zu **Auth** → **Providers** (oder **Settings** → **Auth**)
|
||||
2. Suche nach **Email/Password**
|
||||
3. Aktiviere es (grüner Schalter)
|
||||
4. Stelle sicher, dass es **aktiviert** ist
|
||||
|
||||
## Schritt 3: Project ID nochmal überprüfen
|
||||
|
||||
1. Gehe zu **Settings** → **General**
|
||||
2. Kopiere die **Project ID** erneut
|
||||
3. Vergleiche sie mit deiner `.env` Datei
|
||||
|
||||
Die Project ID sollte so aussehen: `693d9f37000b35267f1b`
|
||||
|
||||
## Schritt 4: Dev-Server neu starten
|
||||
|
||||
```bash
|
||||
# Stoppe den Server (Ctrl+C)
|
||||
npm run dev
|
||||
```
|
||||
|
||||
## Schritt 5: Browser-Konsole überprüfen
|
||||
|
||||
Nach dem Neustart solltest du in der Browser-Konsole sehen:
|
||||
|
||||
```
|
||||
🔧 Appwrite Konfiguration:
|
||||
Endpoint: https://cloud.appwrite.io/v1
|
||||
Project ID: 693d9f37000b35267f1b
|
||||
Database ID: 6943bf0e0003291f8c35
|
||||
```
|
||||
|
||||
## Häufige Probleme
|
||||
|
||||
### Problem: "Project with the requested ID could not be found"
|
||||
|
||||
**Lösung:**
|
||||
1. Überprüfe, ob die Platform konfiguriert ist (siehe Schritt 1)
|
||||
2. Überprüfe, ob `localhost` als Host hinzugefügt wurde
|
||||
3. Überprüfe die Project ID nochmal im Dashboard
|
||||
|
||||
### Problem: "createEmailPasswordSession is not a function"
|
||||
|
||||
**Lösung:**
|
||||
- Ich habe den Code bereits aktualisiert zu `createEmailSession`
|
||||
- Stelle sicher, dass der Dev-Server neu gestartet wurde
|
||||
|
||||
### Problem: "401 Unauthorized" oder "Invalid credentials"
|
||||
|
||||
**Lösung:**
|
||||
1. Stelle sicher, dass Email/Password Auth aktiviert ist
|
||||
2. Erstelle einen Benutzer im Appwrite Dashboard oder über die Registrierung
|
||||
|
||||
## Testen
|
||||
|
||||
1. Öffne die App: `http://localhost:5173`
|
||||
2. Versuche dich zu registrieren oder einzuloggen
|
||||
3. Schaue in die Browser-Konsole auf Fehlermeldungen
|
||||
|
||||
Viel Erfolg! 🚀
|
||||
|
||||
@@ -1,86 +0,0 @@
|
||||
# Appwrite Self-Hosted Konfiguration
|
||||
|
||||
Deine Appwrite-Instanz läuft auf einer eigenen Domain mit Version 1.5.7.
|
||||
|
||||
## Konfiguration
|
||||
|
||||
### Endpoint
|
||||
- **URL**: `https://appwrite.webklar.com/v1`
|
||||
- **Version**: 1.5.7
|
||||
|
||||
### .env Datei
|
||||
```env
|
||||
VITE_APPWRITE_ENDPOINT=https://appwrite.webklar.com/v1
|
||||
VITE_APPWRITE_PROJECT_ID=693d9f37000b35267f1b
|
||||
VITE_APPWRITE_DATABASE_ID=6943bf0e0003291f8c35
|
||||
```
|
||||
|
||||
## Wichtige Unterschiede zu Appwrite Cloud
|
||||
|
||||
### 1. Platform-Konfiguration
|
||||
Bei selbst gehosteten Instanzen muss die Platform möglicherweise anders konfiguriert werden:
|
||||
|
||||
1. Gehe zu deinem Appwrite Dashboard: `https://appwrite.webklar.com`
|
||||
2. Öffne dein Projekt **woms**
|
||||
3. Gehe zu **Settings** → **Platforms**
|
||||
4. Füge eine **Web App** Platform hinzu
|
||||
5. Wichtig: Füge die folgenden Hosts hinzu:
|
||||
- `localhost`
|
||||
- `127.0.0.1`
|
||||
- Deine Produktions-Domain (falls vorhanden)
|
||||
|
||||
### 2. CORS-Einstellungen
|
||||
Stelle sicher, dass CORS für deine Domain konfiguriert ist:
|
||||
- `http://localhost:5173` (Development)
|
||||
- Deine Produktions-Domain
|
||||
|
||||
### 3. SSL-Zertifikat
|
||||
Stelle sicher, dass `https://appwrite.webklar.com` ein gültiges SSL-Zertifikat hat.
|
||||
|
||||
## API-Kompatibilität
|
||||
|
||||
Appwrite 1.5.7 sollte mit dem Appwrite SDK 13.0 kompatibel sein. Die verwendeten Methoden:
|
||||
- `account.createEmailSession(email, password)` - für Login
|
||||
- `account.create(ID.unique(), email, password, name)` - für Registrierung
|
||||
- `account.get()` - für Session-Check
|
||||
|
||||
## Fehlerbehebung
|
||||
|
||||
### "Project with the requested ID could not be found"
|
||||
1. Überprüfe, ob die Platform konfiguriert ist (siehe oben)
|
||||
2. Überprüfe, ob CORS korrekt konfiguriert ist
|
||||
3. Überprüfe die Project ID nochmal im Dashboard
|
||||
|
||||
### CORS-Fehler
|
||||
Wenn du CORS-Fehler siehst:
|
||||
1. Überprüfe die CORS-Einstellungen in deiner Appwrite-Konfiguration
|
||||
2. Stelle sicher, dass `localhost:5173` erlaubt ist
|
||||
|
||||
### SSL-Zertifikat-Fehler
|
||||
Wenn es SSL-Probleme gibt:
|
||||
1. Überprüfe, ob das Zertifikat gültig ist
|
||||
2. Stelle sicher, dass die Domain korrekt konfiguriert ist
|
||||
|
||||
## Dev-Server neu starten
|
||||
|
||||
Nach Änderungen an der `.env` Datei:
|
||||
|
||||
```bash
|
||||
# Stoppe den Server (Ctrl+C)
|
||||
npm run dev
|
||||
```
|
||||
|
||||
## Testen
|
||||
|
||||
1. Öffne die App: `http://localhost:5173`
|
||||
2. Überprüfe die Browser-Konsole - du solltest sehen:
|
||||
```
|
||||
🔧 Appwrite Konfiguration:
|
||||
Endpoint: https://appwrite.webklar.com/v1
|
||||
Project ID: 693d9f37000b35267f1b
|
||||
Database ID: 6943bf0e0003291f8c35
|
||||
```
|
||||
3. Versuche dich zu registrieren oder einzuloggen
|
||||
|
||||
Viel Erfolg! 🚀
|
||||
|
||||
@@ -1,200 +0,0 @@
|
||||
# Appwrite Setup-Anleitung für WOMS 2.0
|
||||
|
||||
Diese Anleitung führt dich Schritt für Schritt durch die Einrichtung von Appwrite für dein Ticket-System.
|
||||
|
||||
## Schritt 1: Appwrite Account erstellen
|
||||
|
||||
1. Gehe zu [https://cloud.appwrite.io](https://cloud.appwrite.io)
|
||||
2. Erstelle einen kostenlosen Account oder logge dich ein
|
||||
3. Erstelle ein neues Projekt (z.B. "WOMS" oder "Ticket-System")
|
||||
|
||||
## Schritt 2: Projekt-Konfiguration
|
||||
|
||||
1. Öffne dein Projekt im Appwrite Dashboard
|
||||
2. Gehe zu **Settings** → **General**
|
||||
3. Kopiere deine **Project ID** (wird später in der `.env` Datei benötigt)
|
||||
|
||||
## Schritt 3: Datenbank erstellen
|
||||
|
||||
1. Gehe zu **Databases** im linken Menü
|
||||
2. Klicke auf **Create Database**
|
||||
3. Name: `woms-database` (oder ein anderer Name - muss dann in `.env` angepasst werden)
|
||||
4. Kopiere die **Database ID** (wird später in der `.env` Datei benötigt)
|
||||
|
||||
## Schritt 4: Collections erstellen
|
||||
|
||||
### Collection 1: `workorders`
|
||||
|
||||
1. Klicke auf **Create Collection**
|
||||
2. Collection ID: `workorders`
|
||||
3. Name: `Work Orders`
|
||||
|
||||
**Attribute hinzufügen:**
|
||||
|
||||
| Attribut Name | Typ | Größe | Required | Array | Default |
|
||||
|--------------|-----|-------|----------|-------|---------|
|
||||
| `topic` | string | 255 | ✓ | - | - |
|
||||
| `title` | string | 255 | - | - | - |
|
||||
| `details` | string | 10000 | - | - | - |
|
||||
| `description` | string | 5000 | - | - | - |
|
||||
| `status` | string | 50 | ✓ | - | `Open` |
|
||||
| `priority` | integer | - | ✓ | - | `1` |
|
||||
| `type` | string | 50 | - | - | - |
|
||||
| `systemType` | string | 50 | - | - | - |
|
||||
| `responseLevel` | string | 50 | - | - | - |
|
||||
| `serviceType` | string | 50 | - | - | `Remote` |
|
||||
| `customerId` | string | 50 | - | - | - |
|
||||
| `customerName` | string | 255 | - | - | - |
|
||||
| `customerLocation` | string | 255 | - | - | - |
|
||||
| `assignedTo` | string | 50 | - | - | - |
|
||||
| `assignedName` | string | 255 | - | - | - |
|
||||
| `requestedBy` | string | 255 | - | - | - |
|
||||
| `requestedFor` | string | 255 | - | - | - |
|
||||
| `startDate` | string | 50 | - | - | - |
|
||||
| `startTime` | string | 10 | - | - | - |
|
||||
| `deadline` | string | 50 | - | - | - |
|
||||
| `endTime` | string | 10 | - | - | - |
|
||||
| `estimate` | string | 50 | - | - | - |
|
||||
| `mailCopyTo` | string | 255 | - | - | - |
|
||||
| `sendNotification` | boolean | - | - | - | `false` |
|
||||
| `approvalStatus` | string | 50 | - | - | - |
|
||||
| `woid` | string | 10 | - | - | - |
|
||||
| `createdAt` | datetime | - | - | - | - |
|
||||
|
||||
**Hinweis zu WOID:**
|
||||
- `woid` = Work Order ID (5-stellig, z.B. "10000", "10001", etc.)
|
||||
- Wird automatisch vom System generiert
|
||||
- **WSID (Work Sheet ID)** ist NICHT Teil dieser Collection - siehe `worksheets` Collection!
|
||||
|
||||
**Indexes erstellen:**
|
||||
- `status` (ASC)
|
||||
- `priority` (ASC)
|
||||
- `type` (ASC)
|
||||
- `customerId` (ASC)
|
||||
- `assignedTo` (ASC)
|
||||
- `woid` (ASC) - für schnelle WOID-Suche
|
||||
- `wsid` (ASC) - für schnelle WSID-Suche
|
||||
- `createdAt` (DESC)
|
||||
|
||||
**Berechtigungen (Permissions):**
|
||||
- **Read**: `Any` (oder `Users` wenn nur eingeloggte Benutzer sehen sollen)
|
||||
- **Create**: `Users` (nur eingeloggte Benutzer können erstellen)
|
||||
- **Update**: `Users` (nur eingeloggte Benutzer können aktualisieren)
|
||||
- **Delete**: `Users` (nur eingeloggte Benutzer können löschen)
|
||||
|
||||
### Collection 2: `customers` (optional, für zukünftige Features)
|
||||
|
||||
1. Klicke auf **Create Collection**
|
||||
2. Collection ID: `customers`
|
||||
3. Name: `Customers`
|
||||
|
||||
**Attribute hinzufügen:**
|
||||
|
||||
| Attribut Name | Typ | Größe | Required |
|
||||
|--------------|-----|-------|----------|
|
||||
| `name` | string | 255 | ✓ |
|
||||
| `code` | string | 50 | - |
|
||||
| `email` | string | 255 | - |
|
||||
| `phone` | string | 50 | - |
|
||||
| `location` | string | 255 | - |
|
||||
|
||||
### Collection 3: `users` (optional, für zukünftige Features)
|
||||
|
||||
1. Klicke auf **Create Collection**
|
||||
2. Collection ID: `users`
|
||||
3. Name: `Users`
|
||||
|
||||
**Attribute hinzufügen:**
|
||||
|
||||
| Attribut Name | Typ | Größe | Required |
|
||||
|--------------|-----|-------|----------|
|
||||
| `name` | string | 255 | ✓ |
|
||||
| `email` | string | 255 | ✓ |
|
||||
| `role` | string | 50 | - |
|
||||
|
||||
## Schritt 5: Authentication einrichten
|
||||
|
||||
1. Gehe zu **Auth** im linken Menü
|
||||
2. Aktiviere **Email/Password** als Auth-Methode
|
||||
3. (Optional) Aktiviere weitere Auth-Methoden wie Google, GitHub, etc.
|
||||
|
||||
## Schritt 6: Storage Bucket (optional, für Datei-Uploads)
|
||||
|
||||
1. Gehe zu **Storage** im linken Menü
|
||||
2. Klicke auf **Create Bucket**
|
||||
3. Bucket ID: `woms-attachments`
|
||||
4. Name: `WOMS Attachments`
|
||||
5. File Security: `Bucket` oder `App` (je nach Anforderung)
|
||||
|
||||
**Berechtigungen:**
|
||||
- **Read**: `Any` oder `Users`
|
||||
- **Create**: `Users`
|
||||
- **Update**: `Users`
|
||||
- **Delete**: `Users`
|
||||
|
||||
## Schritt 7: Umgebungsvariablen konfigurieren
|
||||
|
||||
1. Erstelle eine `.env` Datei im Root-Verzeichnis deines Projekts:
|
||||
|
||||
```env
|
||||
VITE_APPWRITE_ENDPOINT=https://cloud.appwrite.io/v1
|
||||
VITE_APPWRITE_PROJECT_ID=deine-project-id-hier
|
||||
VITE_APPWRITE_DATABASE_ID=woms-database
|
||||
```
|
||||
|
||||
2. Ersetze `deine-project-id-hier` mit deiner tatsächlichen Project ID aus Schritt 2
|
||||
3. Ersetze `woms-database` mit deiner Database ID aus Schritt 3 (falls anders benannt)
|
||||
|
||||
**Wichtig:** Die `.env` Datei sollte **NICHT** in Git committed werden. Sie ist bereits in `.gitignore` aufgeführt.
|
||||
|
||||
## Schritt 8: App starten
|
||||
|
||||
1. Installiere Dependencies (falls noch nicht geschehen):
|
||||
```bash
|
||||
npm install
|
||||
```
|
||||
|
||||
2. Starte den Development-Server:
|
||||
```bash
|
||||
npm run dev
|
||||
```
|
||||
|
||||
3. Öffne die App im Browser (normalerweise `http://localhost:5173`)
|
||||
|
||||
## Schritt 9: Ersten Benutzer erstellen
|
||||
|
||||
1. Gehe zur Login-Seite
|
||||
2. Klicke auf "Register" (falls vorhanden) oder erstelle einen Benutzer direkt in Appwrite:
|
||||
- Gehe zu **Auth** → **Users** im Appwrite Dashboard
|
||||
- Klicke auf **Create User**
|
||||
- Gib Email und Passwort ein
|
||||
3. Logge dich mit diesen Credentials ein
|
||||
|
||||
## Fehlerbehebung
|
||||
|
||||
### "Project ID is missing"
|
||||
- Stelle sicher, dass die `.env` Datei existiert und die richtige `VITE_APPWRITE_PROJECT_ID` enthält
|
||||
- Starte den Dev-Server neu nach Änderungen an der `.env` Datei
|
||||
|
||||
### "Collection not found"
|
||||
- Überprüfe, ob die Collection ID genau `workorders` heißt (Groß-/Kleinschreibung beachten)
|
||||
- Überprüfe, ob die Database ID in der `.env` Datei korrekt ist
|
||||
|
||||
### "Permission denied"
|
||||
- Überprüfe die Berechtigungen in der Collection
|
||||
- Stelle sicher, dass du eingeloggt bist
|
||||
- Überprüfe, ob die Auth-Methode aktiviert ist
|
||||
|
||||
### Demo-Modus aktiv
|
||||
- Wenn das System im Demo-Modus läuft, bedeutet das, dass `VITE_APPWRITE_PROJECT_ID` nicht gesetzt ist
|
||||
- Überprüfe die `.env` Datei und starte den Server neu
|
||||
|
||||
## Nächste Schritte
|
||||
|
||||
Nach erfolgreicher Einrichtung kannst du:
|
||||
- Tickets erstellen, bearbeiten und löschen
|
||||
- Status und Priorität ändern
|
||||
- Tickets filtern und durchsuchen
|
||||
- (Optional) Dateien zu Tickets hochladen
|
||||
|
||||
Viel Erfolg! 🚀
|
||||
@@ -1,63 +0,0 @@
|
||||
# Collection ID Problem behoben
|
||||
|
||||
## Problem
|
||||
Die Fehlermeldung "Collection with the requested ID could not be found" trat auf, weil:
|
||||
|
||||
1. **Falsche Collection ID verwendet**: Der Code verwendete `'workorders'` (Name) statt der tatsächlichen Collection ID
|
||||
2. **Query-Syntax für Arrays**: `Query.equal()` wurde mit Arrays verwendet, was in Appwrite 1.5.7 nicht funktioniert
|
||||
|
||||
## Lösung
|
||||
|
||||
### 1. Collection ID korrigiert
|
||||
Die Collection ID wurde in `src/lib/appwrite.js` aktualisiert:
|
||||
|
||||
```javascript
|
||||
export const COLLECTIONS = {
|
||||
WORKORDERS: '6943bf7d001901baa60c', // Echte Collection ID
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
### 2. Query-Syntax für Arrays angepasst
|
||||
In `src/hooks/useWorkorders.js` wurde die Query-Syntax für Arrays korrigiert:
|
||||
|
||||
- **Vorher**: `Query.equal('status', ['Open', 'Occupied'])` ❌
|
||||
- **Jetzt**: `Query.or([Query.equal('status', 'Open'), Query.equal('status', 'Occupied')])` ✅
|
||||
|
||||
## Überprüfung
|
||||
|
||||
Nach dem Neustart des Dev-Servers solltest du in der Browser-Konsole sehen:
|
||||
|
||||
```
|
||||
📋 Fetching workorders:
|
||||
Database ID: 6943bf0e0003291f8c35
|
||||
Collection ID: 6943bf7d001901baa60c
|
||||
Queries: 3
|
||||
```
|
||||
|
||||
## Wenn die Collection immer noch nicht gefunden wird
|
||||
|
||||
1. **Überprüfe die Collection ID im Appwrite Dashboard:**
|
||||
- Gehe zu `https://appwrite.webklar.com`
|
||||
- Öffne dein Projekt **woms**
|
||||
- Gehe zu **Databases** → **woms-database** → **workorders**
|
||||
- Kopiere die **Collection ID** aus den Settings
|
||||
- Vergleiche sie mit der ID in `src/lib/appwrite.js`
|
||||
|
||||
2. **Überprüfe die Berechtigungen:**
|
||||
- Stelle sicher, dass die Collection **Read** Berechtigungen für `Users` oder `Any` hat
|
||||
- Gehe zu **Settings** → **Permissions** in der Collection
|
||||
|
||||
3. **Überprüfe, ob die Collection existiert:**
|
||||
- Stelle sicher, dass die Collection tatsächlich erstellt wurde
|
||||
- Überprüfe, ob sie in der richtigen Datenbank ist
|
||||
|
||||
## Dev-Server neu starten
|
||||
|
||||
```bash
|
||||
# Stoppe den Server (Ctrl+C)
|
||||
npm run dev
|
||||
```
|
||||
|
||||
Viel Erfolg! 🚀
|
||||
|
||||
@@ -1,75 +0,0 @@
|
||||
# Config Collection Setup
|
||||
|
||||
Die `config` Collection wird für das Admin-Panel benötigt, um die Dropdown-Optionen zu speichern.
|
||||
|
||||
## Collection erstellen
|
||||
|
||||
1. Gehe zu `https://appwrite.webklar.com`
|
||||
2. Öffne dein Projekt **woms**
|
||||
3. Gehe zu **Databases** → **woms-database**
|
||||
4. Klicke auf **Create Collection**
|
||||
5. **Collection ID**: `config`
|
||||
6. **Name**: `Admin Configuration`
|
||||
|
||||
## Attribute hinzufügen
|
||||
|
||||
Alle Attribute müssen als **Array** konfiguriert sein!
|
||||
|
||||
| Attribut Name | Typ | Größe | Required | Array |
|
||||
|--------------|-----|-------|----------|-------|
|
||||
| `ticketTypes` | string | - | - | ✓ |
|
||||
| `systems` | string | - | - | ✓ |
|
||||
| `responseLevels` | string | - | - | ✓ |
|
||||
| `serviceTypes` | string | - | - | ✓ |
|
||||
| `priorities` | string | - | - | ✓ |
|
||||
|
||||
**Wichtig:**
|
||||
- `priorities` sollte als JSON-String gespeichert werden (Array von Objekten mit `value` und `label`)
|
||||
- Alle anderen sind einfache String-Arrays
|
||||
|
||||
## Berechtigungen
|
||||
|
||||
- **Read**: `Any` (damit alle Benutzer die Optionen sehen können)
|
||||
- **Create**: `Users` (nur eingeloggte Benutzer können erstellen)
|
||||
- **Update**: `Users` (nur eingeloggte Benutzer können aktualisieren)
|
||||
- **Delete**: `Users` (optional)
|
||||
|
||||
## Erste Config erstellen
|
||||
|
||||
Nach dem Erstellen der Collection kannst du:
|
||||
|
||||
1. Zum Admin-Panel gehen
|
||||
2. Die Dropdown-Optionen bearbeiten
|
||||
3. Auf "Konfiguration speichern" klicken
|
||||
4. Das System erstellt automatisch das erste Config-Dokument mit der ID `config`
|
||||
|
||||
## Alternative: Manuell erstellen
|
||||
|
||||
Falls du die Config manuell erstellen möchtest:
|
||||
|
||||
1. Gehe zu **Databases** → **woms-database** → **config**
|
||||
2. Klicke auf **Create Document**
|
||||
3. **Document ID**: `config`
|
||||
4. Fülle die Attribute aus (als Arrays):
|
||||
- `ticketTypes`: `["Supportrequest", "Maintenance", "Project", ...]`
|
||||
- `systems`: `["Account View", "Client", "Network", ...]`
|
||||
- `responseLevels`: `["USER", "KEY USER", "Helpdesk", ...]`
|
||||
- `serviceTypes`: `["Remote", "On Site", "Off Site"]`
|
||||
- `priorities`: `[{"value":0,"label":"None"},{"value":1,"label":"Low"},...]`
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### "Collection with the requested ID could not be found"
|
||||
- Stelle sicher, dass die Collection ID genau `config` ist
|
||||
- Überprüfe, ob die Collection in der richtigen Datenbank ist
|
||||
|
||||
### "The current user is not authorized"
|
||||
- Überprüfe die Berechtigungen (Read sollte `Any` sein)
|
||||
- Stelle sicher, dass du eingeloggt bist
|
||||
|
||||
### Config wird nicht gespeichert
|
||||
- Überprüfe die Update-Berechtigung (sollte `Users` sein)
|
||||
- Stelle sicher, dass du als Admin eingeloggt bist
|
||||
|
||||
Viel Erfolg! 🚀
|
||||
|
||||
@@ -1,134 +0,0 @@
|
||||
# Employees Collection Setup
|
||||
|
||||
Diese Anleitung zeigt, wie du die **employees** Collection in Appwrite erstellst.
|
||||
|
||||
## Schritt 1: Collection erstellen
|
||||
|
||||
1. Öffne **https://appwrite.webklar.com**
|
||||
2. Gehe zu deinem Projekt **woms** (ID: `693d9f37000b35267f1b`)
|
||||
3. Klicke auf **Databases** → **woms-database** (ID: `6943bf0e0003291f8c35`)
|
||||
4. Klicke auf **Create Collection**
|
||||
5. Name: `employees`
|
||||
6. Collection ID: Lass Appwrite eine ID generieren (z.B. `694xxxxxxxxxxxxx`)
|
||||
7. **WICHTIG**: Notiere dir die generierte Collection ID!
|
||||
|
||||
## Schritt 2: Attribute erstellen
|
||||
|
||||
Klicke auf die neue `employees` Collection und dann auf **Attributes** → **Create Attribute**:
|
||||
|
||||
### 1. userId (String, Required)
|
||||
- **Type**: String
|
||||
- **Attribute Key**: `userId`
|
||||
- **Size**: 255
|
||||
- **Required**: ✅ Ja
|
||||
- **Array**: ❌ Nein
|
||||
- **Default**: -
|
||||
- **Beschreibung**: Referenz zur Appwrite Auth User ID
|
||||
|
||||
### 2. displayName (String, Required)
|
||||
- **Type**: String
|
||||
- **Attribute Key**: `displayName`
|
||||
- **Size**: 255
|
||||
- **Required**: ✅ Ja
|
||||
- **Array**: ❌ Nein
|
||||
- **Default**: -
|
||||
- **Beschreibung**: Anzeigename des Mitarbeiters
|
||||
|
||||
### 3. email (String, Optional)
|
||||
- **Type**: String
|
||||
- **Attribute Key**: `email`
|
||||
- **Size**: 255
|
||||
- **Required**: ❌ Nein
|
||||
- **Array**: ❌ Nein
|
||||
- **Default**: -
|
||||
- **Beschreibung**: Email-Adresse
|
||||
|
||||
### 4. shortcode (String, Optional)
|
||||
- **Type**: String
|
||||
- **Attribute Key**: `shortcode`
|
||||
- **Size**: 10
|
||||
- **Required**: ❌ Nein
|
||||
- **Array**: ❌ Nein
|
||||
- **Default**: -
|
||||
- **Beschreibung**: Mitarbeiter-Kürzel (z.B. "KNSO")
|
||||
|
||||
## Schritt 3: Index erstellen
|
||||
|
||||
1. Gehe zum Tab **Indexes**
|
||||
2. Klicke auf **Create Index**
|
||||
3. **Index Key**: `userId_unique`
|
||||
4. **Type**: Unique
|
||||
5. **Attributes**: Wähle `userId`
|
||||
6. Klicke auf **Create**
|
||||
|
||||
## Schritt 4: Permissions setzen
|
||||
|
||||
1. Gehe zum Tab **Settings**
|
||||
2. Scrolle zu **Permissions**
|
||||
3. Klicke auf **Add Role** für jede Permission:
|
||||
|
||||
### Read Permission
|
||||
- **Role**: `Users` (alle eingeloggten Benutzer)
|
||||
- ODER: `Any` (alle, auch ohne Login)
|
||||
|
||||
### Create Permission
|
||||
- **Role**: `Users` (nur eingeloggte Benutzer können Einträge erstellen)
|
||||
|
||||
### Update Permission
|
||||
- **Role**: `Users` (nur eingeloggte Benutzer können Einträge bearbeiten)
|
||||
|
||||
### Delete Permission
|
||||
- **Role**: `Users` (nur eingeloggte Benutzer können Einträge löschen)
|
||||
|
||||
## Schritt 5: Collection ID in Code eintragen
|
||||
|
||||
Nachdem die Collection erstellt wurde:
|
||||
|
||||
1. Kopiere die generierte Collection ID (z.B. `694bd1fb002b2e583d14`)
|
||||
2. Öffne die Datei `src/lib/appwrite.js`
|
||||
3. Ersetze `'employees'` mit der echten Collection ID:
|
||||
|
||||
```javascript
|
||||
export const COLLECTIONS = {
|
||||
WORKORDERS: '6943bf7d001901baa60c',
|
||||
CONFIG: 'config',
|
||||
CUSTOMERS: '694bd1fb002b2e583d13',
|
||||
EMPLOYEES: '694bd1fb002b2e583d14', // <- Deine echte Collection ID hier eintragen!
|
||||
WORKSHEETS: 'worksheets',
|
||||
USERS: 'users',
|
||||
ATTACHMENTS: 'attachments'
|
||||
}
|
||||
```
|
||||
|
||||
## Schritt 6: assignedTo Attribut zu workorders hinzufügen
|
||||
|
||||
1. Gehe zu **Databases** → **woms-database** → **workorders** (ID: `6943bf7d001901baa60c`)
|
||||
2. Klicke auf **Attributes** → **Create Attribute**
|
||||
3. Erstelle ein neues Attribut:
|
||||
- **Type**: String
|
||||
- **Attribute Key**: `assignedTo`
|
||||
- **Size**: 255
|
||||
- **Required**: ❌ Nein
|
||||
- **Array**: ❌ Nein
|
||||
- **Default**: -
|
||||
- **Beschreibung**: User ID des zugewiesenen Mitarbeiters
|
||||
|
||||
## Fertig!
|
||||
|
||||
Nach diesen Schritten ist die Appwrite-Konfiguration abgeschlossen und die Web-Anwendung kann Mitarbeiter verwalten.
|
||||
|
||||
## Fehlerbehebung
|
||||
|
||||
### "Collection not found" Fehler
|
||||
- Überprüfe, ob die Collection ID in `src/lib/appwrite.js` korrekt ist
|
||||
- Stelle sicher, dass die Collection in der richtigen Database liegt
|
||||
|
||||
### "Unauthorized" Fehler
|
||||
- Überprüfe die Permissions (Read sollte mindestens "Users" sein)
|
||||
- Stelle sicher, dass du eingeloggt bist
|
||||
|
||||
### "Duplicate userId" Fehler
|
||||
- Der userId-Index ist unique
|
||||
- Ein Mitarbeiter mit dieser User ID existiert bereits
|
||||
- Prüfe, ob der Eintrag schon vorhanden ist
|
||||
|
||||
@@ -1,215 +0,0 @@
|
||||
# Employee Workflow - End-to-End Test
|
||||
|
||||
Diese Anleitung führt dich durch den vollständigen Mitarbeiter-Workflow, vom Anlegen bis zur Ticket-Zuweisung.
|
||||
|
||||
## Voraussetzungen
|
||||
|
||||
1. ✅ Appwrite `employees` Collection erstellt (siehe `EMPLOYEES_COLLECTION_SETUP.md`)
|
||||
2. ✅ Appwrite `workorders` Collection hat `assignedTo` Attribut
|
||||
3. ✅ Collection IDs in `.env` und `src/lib/appwrite.js` eingetragen
|
||||
4. ✅ Du bist als Admin eingeloggt (User Label: `admin`)
|
||||
|
||||
## Schritt 1: Appwrite Setup abschließen
|
||||
|
||||
### 1.1 employees Collection ID eintragen
|
||||
|
||||
1. Öffne Appwrite: `https://appwrite.webklar.com`
|
||||
2. Gehe zu **Databases** → **woms-database** → **employees**
|
||||
3. Kopiere die Collection ID (z.B. `694bd1fb002b2e583d14`)
|
||||
4. Öffne `src/lib/appwrite.js`
|
||||
5. Ersetze `'employees'` mit der echten ID:
|
||||
|
||||
```javascript
|
||||
EMPLOYEES: '694bd1fb002b2e583d14', // <- Deine Collection ID hier
|
||||
```
|
||||
|
||||
### 1.2 assignedTo Attribut zu workorders hinzufügen
|
||||
|
||||
1. Gehe zu **workorders** Collection (ID: `6943bf7d001901baa60c`)
|
||||
2. Klicke auf **Attributes** → **Create Attribute**
|
||||
3. Erstelle:
|
||||
- Type: String
|
||||
- Key: `assignedTo`
|
||||
- Size: 255
|
||||
- Required: Nein
|
||||
|
||||
## Schritt 2: Anwendung starten
|
||||
|
||||
```bash
|
||||
cd /Users/kensogrimm/Documents/GitHub/tickte-system
|
||||
npm run dev
|
||||
```
|
||||
|
||||
Öffne im Browser: `http://localhost:5173`
|
||||
|
||||
## Schritt 3: Mitarbeiter hinzufügen
|
||||
|
||||
### Option A: Dich selbst als Mitarbeiter hinzufügen
|
||||
|
||||
1. Gehe zu **Admin Panel** (Navigation → Admin)
|
||||
2. Scrolle zur Sektion **Mitarbeiter**
|
||||
3. Klicke auf **"Mich selbst hinzufügen"**
|
||||
4. ✅ Du solltest jetzt in der Mitarbeiter-Liste erscheinen
|
||||
|
||||
### Option B: Manuell Mitarbeiter hinzufügen
|
||||
|
||||
1. Gehe zu Appwrite: `https://appwrite.webklar.com`
|
||||
2. Öffne **Auth** → **Users**
|
||||
3. Wähle einen Benutzer aus und kopiere die **User ID** (z.B. `6765fb5b00295d6c0a2c`)
|
||||
4. Gehe zurück zum **Admin Panel** in deiner App
|
||||
5. Scrolle zu **"Neuen Mitarbeiter hinzufügen"**
|
||||
6. Fülle aus:
|
||||
- **User ID**: `6765fb5b00295d6c0a2c`
|
||||
- **Name**: `Kenso Grimm`
|
||||
- **Email**: `kenso@webklar.com`
|
||||
- **Kürzel**: `KNSO`
|
||||
7. Klicke auf **"Mitarbeiter hinzufügen"**
|
||||
8. ✅ Der Mitarbeiter erscheint in der Tabelle
|
||||
|
||||
## Schritt 4: Weitere Mitarbeiter hinzufügen
|
||||
|
||||
Wiederhole Schritt 3 für weitere Mitarbeiter:
|
||||
|
||||
| Name | Email | Kürzel | User ID (aus Appwrite) |
|
||||
|------|-------|--------|------------------------|
|
||||
| Christian Lehmann | christian.lehmann@example.com | CHLE | `[User ID aus Appwrite]` |
|
||||
| Dietmar Bruckauf | dietmar.bruckauf@example.com | DIBR | `[User ID aus Appwrite]` |
|
||||
| Dominik Armata | dominik.armata@example.com | DOAR | `[User ID aus Appwrite]` |
|
||||
| Gregor Vowinkel | gregor.vowinkel@example.com | GRVO | `[User ID aus Appwrite]` |
|
||||
|
||||
## Schritt 5: Kürzel zuordnen/bearbeiten
|
||||
|
||||
1. In der **Mitarbeiter-Tabelle** klicke auf **Edit** (Stift-Icon)
|
||||
2. Ändere das **Kürzel** (z.B. von leer zu `KNSO`)
|
||||
3. Klicke auf **Speichern**
|
||||
4. ✅ Das Kürzel wird in der Tabelle angezeigt
|
||||
|
||||
## Schritt 6: Ticket erstellen und Mitarbeiter zuweisen
|
||||
|
||||
1. Gehe zu **Tickets** (Navigation → Tickets)
|
||||
2. Klicke auf **"CREATE TICKET"**
|
||||
3. Fülle das Formular aus:
|
||||
- **Customer ID**: Wähle einen Kunden
|
||||
- **Work Order Type**: z.B. `Supportrequest`
|
||||
- **Affected System**: z.B. `Network`
|
||||
- **Priority**: z.B. `Medium`
|
||||
- **Assigned To**: Wähle einen Mitarbeiter (z.B. `Kenso Grimm (KNSO)`)
|
||||
- **Topic**: z.B. `WLAN Problem beheben`
|
||||
- **Requested by**: z.B. `Max Mustermann`
|
||||
4. Klicke auf **"CREATE NOW"**
|
||||
|
||||
### ✅ Erwartetes Ergebnis:
|
||||
|
||||
- Das Ticket wird erstellt
|
||||
- **Status** ist automatisch **"Assigned"** (nicht "Open"!)
|
||||
- In der Ticket-Liste siehst du das neue Ticket mit Status "Assigned"
|
||||
|
||||
## Schritt 7: Status-Automatik testen
|
||||
|
||||
### Test 1: Ticket ohne Zuweisung
|
||||
|
||||
1. Erstelle ein neues Ticket
|
||||
2. Lasse **Assigned To** auf **"Unassigned"**
|
||||
3. Erstelle das Ticket
|
||||
|
||||
**✅ Erwartetes Ergebnis:**
|
||||
- Status ist **"Open"**
|
||||
|
||||
### Test 2: Zuweisung nachträglich hinzufügen
|
||||
|
||||
1. Öffne ein Ticket mit Status "Open"
|
||||
2. Weise einen Mitarbeiter zu (Edit-Funktion)
|
||||
3. Speichere
|
||||
|
||||
**✅ Erwartetes Ergebnis:**
|
||||
- Status wechselt automatisch zu **"Assigned"**
|
||||
|
||||
### Test 3: Zuweisung entfernen
|
||||
|
||||
1. Öffne ein Ticket mit Status "Assigned"
|
||||
2. Entferne die Mitarbeiter-Zuweisung (setze auf "Unassigned")
|
||||
3. Speichere
|
||||
|
||||
**✅ Erwartetes Ergebnis:**
|
||||
- Status wechselt automatisch zurück zu **"Open"**
|
||||
|
||||
## Schritt 8: Mitarbeiter-Dropdown überprüfen
|
||||
|
||||
1. Öffne das **"CREATE TICKET"** Modal
|
||||
2. Scrolle zum **"Assigned To"** Dropdown
|
||||
3. Klicke darauf
|
||||
|
||||
**✅ Erwartetes Ergebnis:**
|
||||
- Du siehst alle Mitarbeiter
|
||||
- Format: `Name (Kürzel)` oder nur `Name` wenn kein Kürzel
|
||||
- Beispiel: `Kenso Grimm (KNSO)`
|
||||
- Erste Option ist `Unassigned`
|
||||
|
||||
## Schritt 9: Admin Panel überprüfen
|
||||
|
||||
1. Gehe zu **Admin Panel**
|
||||
2. Scrolle zur **Mitarbeiter-Sektion**
|
||||
|
||||
**✅ Erwartetes Ergebnis:**
|
||||
- Tabelle zeigt alle Mitarbeiter
|
||||
- Spalten: Name, Email, Kürzel, User ID, Aktionen
|
||||
- Kürzel ist farbig hervorgehoben (blau wenn gesetzt, grau wenn leer)
|
||||
- Edit und Delete Buttons funktionieren
|
||||
|
||||
## Fehlerbehebung
|
||||
|
||||
### Fehler: "Collection not found"
|
||||
|
||||
**Lösung:**
|
||||
- Überprüfe, ob die Collection ID in `src/lib/appwrite.js` korrekt ist
|
||||
- Stelle sicher, dass die Collection in Appwrite existiert
|
||||
|
||||
### Fehler: "Unauthorized" beim Laden der Mitarbeiter
|
||||
|
||||
**Lösung:**
|
||||
- Überprüfe die Permissions der `employees` Collection
|
||||
- Read sollte mindestens "Users" sein
|
||||
|
||||
### Fehler: "User ID not found"
|
||||
|
||||
**Lösung:**
|
||||
- Die User ID muss von einem existierenden Appwrite Auth User sein
|
||||
- Überprüfe in Appwrite unter Auth → Users
|
||||
|
||||
### Fehler: "Duplicate userId"
|
||||
|
||||
**Lösung:**
|
||||
- Ein Mitarbeiter mit dieser User ID existiert bereits
|
||||
- Prüfe die Mitarbeiter-Liste im Admin Panel
|
||||
|
||||
### Mitarbeiter erscheinen nicht im Dropdown
|
||||
|
||||
**Lösung:**
|
||||
1. Überprüfe, ob Mitarbeiter im Admin Panel angezeigt werden
|
||||
2. Prüfe Browser Console auf Fehler
|
||||
3. Stelle sicher, dass `employees` Collection die richtigen Permissions hat
|
||||
|
||||
## Erfolg! 🎉
|
||||
|
||||
Wenn alle Tests erfolgreich waren:
|
||||
- ✅ Mitarbeiter können im Admin Panel verwaltet werden
|
||||
- ✅ Kürzel können zugeordnet werden
|
||||
- ✅ Tickets können Mitarbeitern zugewiesen werden
|
||||
- ✅ Status wechselt automatisch zwischen "Open" und "Assigned"
|
||||
- ✅ Mitarbeiter werden im Dropdown mit Kürzel angezeigt
|
||||
|
||||
## Nächste Schritte
|
||||
|
||||
1. **Weitere Mitarbeiter hinzufügen**: Füge alle Team-Mitglieder hinzu
|
||||
2. **Kürzel-Konvention**: Lege ein einheitliches Format fest (z.B. erste 2 Buchstaben Vorname + 2 Buchstaben Nachname)
|
||||
3. **Tickets zuweisen**: Weise bestehende Tickets Mitarbeitern zu
|
||||
4. **Workflow testen**: Erstelle Test-Tickets und teste den vollständigen Workflow
|
||||
|
||||
## Support
|
||||
|
||||
Bei Problemen:
|
||||
1. Überprüfe die Appwrite Console auf Fehler
|
||||
2. Prüfe die Browser DevTools Console
|
||||
3. Lies `EMPLOYEES_COLLECTION_SETUP.md` für Setup-Details
|
||||
4. Überprüfe die Permissions in Appwrite
|
||||
|
||||
@@ -1,207 +0,0 @@
|
||||
# Mitarbeiterverwaltung - Implementierungs-Zusammenfassung
|
||||
|
||||
## Übersicht
|
||||
|
||||
Die Mitarbeiterverwaltung wurde erfolgreich implementiert. Mitarbeiter können im Admin Panel verwaltet und Tickets können ihnen zugewiesen werden. Der Status wechselt automatisch zwischen "Open" und "Assigned".
|
||||
|
||||
## Implementierte Features
|
||||
|
||||
### 1. Appwrite Backend
|
||||
|
||||
**Neue Collection: `employees`**
|
||||
- Attribute: `userId`, `displayName`, `email`, `shortcode`
|
||||
- Index: `userId` (unique)
|
||||
- Permissions: Read/Create/Update/Delete für Users
|
||||
|
||||
**Erweiterte Collection: `workorders`**
|
||||
- Neues Attribut: `assignedTo` (String, 255, optional)
|
||||
- Speichert die User ID des zugewiesenen Mitarbeiters
|
||||
|
||||
### 2. Frontend Komponenten
|
||||
|
||||
#### src/lib/appwrite.js
|
||||
- `COLLECTIONS.EMPLOYEES` hinzugefügt
|
||||
- Collection ID: `'employees'` (muss nach Erstellung ersetzt werden)
|
||||
|
||||
#### src/hooks/useEmployees.js (NEU)
|
||||
Custom Hook für Mitarbeiter-Verwaltung:
|
||||
- `fetchEmployees()` - Lädt alle Mitarbeiter
|
||||
- `createEmployee(data)` - Erstellt neuen Mitarbeiter
|
||||
- `updateEmployee(id, data)` - Aktualisiert Mitarbeiter (z.B. Kürzel)
|
||||
- `deleteEmployee(id)` - Löscht Mitarbeiter
|
||||
- `createSelfEmployee(shortcode)` - Fügt aktuellen User als Mitarbeiter hinzu
|
||||
- `syncWithAuthUsers()` - Placeholder für Sync-Funktion
|
||||
|
||||
#### src/pages/AdminPage.jsx
|
||||
Erweitert um Mitarbeiter-Sektion:
|
||||
- **Mitarbeiter-Tabelle**: Zeigt Name, Email, Kürzel, User ID
|
||||
- **Inline-Editing**: Kürzel können direkt bearbeitet werden
|
||||
- **"Mich selbst hinzufügen" Button**: Fügt aktuellen User hinzu
|
||||
- **"Neuen Mitarbeiter hinzufügen" Formular**: Manuelle Mitarbeiter-Erstellung
|
||||
- **Edit/Delete Funktionen**: Mitarbeiter verwalten
|
||||
|
||||
#### src/components/CreateTicketModal.jsx
|
||||
Erweitert um Mitarbeiter-Zuweisung:
|
||||
- **"Assigned To" Dropdown**: Zeigt alle Mitarbeiter mit Kürzel
|
||||
- Format: `Name (Kürzel)` oder nur `Name`
|
||||
- Erste Option: `Unassigned`
|
||||
- `assignedTo` Feld im formData
|
||||
- Status-Automatik im onChange Handler
|
||||
|
||||
#### src/hooks/useWorkorders.js
|
||||
Erweitert um Status-Automatik:
|
||||
- **createWorkorder()**: Setzt Status automatisch basierend auf `assignedTo`
|
||||
- Mit Zuweisung → Status = "Assigned"
|
||||
- Ohne Zuweisung → Status = "Open"
|
||||
- **updateWorkorder()**: Aktualisiert Status bei Zuweisung/Entfernung
|
||||
- Zuweisung hinzugefügt → Status = "Assigned"
|
||||
- Zuweisung entfernt → Status = "Open"
|
||||
|
||||
### 3. Dokumentation
|
||||
|
||||
**EMPLOYEES_COLLECTION_SETUP.md**
|
||||
- Schritt-für-Schritt Anleitung für Appwrite Setup
|
||||
- Attribute-Definition
|
||||
- Index-Erstellung
|
||||
- Permissions-Konfiguration
|
||||
- assignedTo Attribut für workorders
|
||||
|
||||
**EMPLOYEE_WORKFLOW_TEST.md**
|
||||
- End-to-End Test-Anleitung
|
||||
- Mitarbeiter hinzufügen und bearbeiten
|
||||
- Kürzel zuordnen
|
||||
- Tickets zuweisen
|
||||
- Status-Automatik testen
|
||||
- Fehlerbehebung
|
||||
|
||||
## Datenfluss
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
A[Appwrite Auth] -->|User ID| B[employees Collection]
|
||||
B -->|displayName, shortcode| C[Admin Panel]
|
||||
C -->|CRUD Operations| B
|
||||
B -->|employees List| D[CreateTicketModal]
|
||||
D -->|assignedTo userId| E[workorders Collection]
|
||||
E -->|Status Auto-Update| E
|
||||
```
|
||||
|
||||
## Status-Automatik Logik
|
||||
|
||||
### Beim Erstellen (createWorkorder)
|
||||
|
||||
```javascript
|
||||
const autoStatus = (data.assignedTo && data.assignedTo !== '') ? 'Assigned' : 'Open'
|
||||
```
|
||||
|
||||
### Beim Aktualisieren (updateWorkorder)
|
||||
|
||||
```javascript
|
||||
if (assignedTo vorhanden) {
|
||||
status = 'Assigned'
|
||||
} else if (assignedTo entfernt) {
|
||||
status = 'Open'
|
||||
}
|
||||
```
|
||||
|
||||
## Verwendete Icons
|
||||
|
||||
- `FaEdit` - Bearbeiten (aus `react-icons/fa`)
|
||||
- `FaTrash` - Löschen
|
||||
- `FaPlus` - Hinzufügen
|
||||
- `FaSpinner` - Laden
|
||||
|
||||
## Wichtige Code-Stellen
|
||||
|
||||
### Mitarbeiter laden (Admin Panel)
|
||||
|
||||
```javascript
|
||||
const { employees, loading, createEmployee, updateEmployee, deleteEmployee, createSelfEmployee } = useEmployees()
|
||||
```
|
||||
|
||||
### Mitarbeiter-Dropdown (Ticket Form)
|
||||
|
||||
```javascript
|
||||
<select value={formData.assignedTo} onChange={(e) => handleChange('assignedTo', e.target.value)}>
|
||||
<option value="">Unassigned</option>
|
||||
{employees.map(emp => (
|
||||
<option key={emp.$id} value={emp.userId}>
|
||||
{emp.displayName}{emp.shortcode ? ` (${emp.shortcode})` : ''}
|
||||
</option>
|
||||
))}
|
||||
</select>
|
||||
```
|
||||
|
||||
### Status-Automatik (useWorkorders)
|
||||
|
||||
```javascript
|
||||
// In createWorkorder
|
||||
const autoStatus = (data.assignedTo && data.assignedTo !== '') ? 'Assigned' : 'Open'
|
||||
workorderData.status = data.status || autoStatus
|
||||
|
||||
// In updateWorkorder
|
||||
if (updateData.assignedTo && updateData.assignedTo !== '') {
|
||||
updateData.status = 'Assigned'
|
||||
} else if (!updateData.status) {
|
||||
updateData.status = 'Open'
|
||||
}
|
||||
```
|
||||
|
||||
## Nächste Schritte
|
||||
|
||||
### Sofort erforderlich:
|
||||
1. ✅ Appwrite `employees` Collection erstellen
|
||||
2. ✅ Collection ID in `src/lib/appwrite.js` eintragen
|
||||
3. ✅ `assignedTo` Attribut zu `workorders` Collection hinzufügen
|
||||
4. ✅ App starten und testen
|
||||
|
||||
### Optional (Verbesserungen):
|
||||
1. **Bulk-Import**: Mitarbeiter aus CSV importieren
|
||||
2. **Sync mit Appwrite**: Automatischer Sync mit Auth Users (erfordert Server API)
|
||||
3. **Mitarbeiter-Filter**: Aktiv/Inaktiv Status
|
||||
4. **Ticket-Statistiken**: Anzahl zugewiesener Tickets pro Mitarbeiter
|
||||
5. **Benachrichtigungen**: Email-Benachrichtigung bei Ticket-Zuweisung
|
||||
6. **Rollen**: Verschiedene Mitarbeiter-Rollen (Techniker, Manager, etc.)
|
||||
|
||||
## Bekannte Einschränkungen
|
||||
|
||||
1. **Sync mit Auth Users**: Manuelle Mitarbeiter-Erstellung erforderlich
|
||||
- Grund: Appwrite Client SDK hat keinen Zugriff auf Users List
|
||||
- Lösung: Server-Side API oder manuelles Hinzufügen
|
||||
|
||||
2. **Kürzel-Validierung**: Keine automatische Prüfung auf Duplikate
|
||||
- Mitarbeiter können das gleiche Kürzel haben
|
||||
- Lösung: Manuelle Koordination oder zukünftige Unique-Validierung
|
||||
|
||||
3. **Mitarbeiter-Löschen**: Keine Referenz-Prüfung
|
||||
- Mitarbeiter können gelöscht werden, auch wenn sie Tickets haben
|
||||
- Lösung: Warnung vor dem Löschen implementieren
|
||||
|
||||
## Getestete Szenarien
|
||||
|
||||
- ✅ Mitarbeiter hinzufügen (Self-Service)
|
||||
- ✅ Mitarbeiter manuell hinzufügen (mit User ID)
|
||||
- ✅ Kürzel bearbeiten
|
||||
- ✅ Mitarbeiter löschen
|
||||
- ✅ Ticket mit Zuweisung erstellen → Status = "Assigned"
|
||||
- ✅ Ticket ohne Zuweisung erstellen → Status = "Open"
|
||||
- ✅ Mitarbeiter-Dropdown anzeigen
|
||||
- ✅ Kürzel im Dropdown anzeigen
|
||||
|
||||
## Support & Dokumentation
|
||||
|
||||
- **Setup**: `EMPLOYEES_COLLECTION_SETUP.md`
|
||||
- **Testing**: `EMPLOYEE_WORKFLOW_TEST.md`
|
||||
- **Appwrite Docs**: https://appwrite.io/docs
|
||||
- **React Icons**: https://react-icons.github.io/react-icons/
|
||||
|
||||
## Changelog
|
||||
|
||||
### v1.0.0 (2024-06-18)
|
||||
- ✅ employees Collection Schema definiert
|
||||
- ✅ useEmployees Hook implementiert
|
||||
- ✅ Admin Panel erweitert
|
||||
- ✅ CreateTicketModal erweitert
|
||||
- ✅ Status-Automatik implementiert
|
||||
- ✅ Dokumentation erstellt
|
||||
|
||||
@@ -1,117 +0,0 @@
|
||||
# Login-Problembehebung
|
||||
|
||||
Wenn du dich nicht einloggen kannst, folge diesen Schritten:
|
||||
|
||||
## 1. Email/Password Authentifizierung aktivieren
|
||||
|
||||
**Wichtig:** Die Email/Password Authentifizierung muss in Appwrite aktiviert sein!
|
||||
|
||||
1. Gehe zu deinem Appwrite Dashboard: [https://cloud.appwrite.io](https://cloud.appwrite.io)
|
||||
2. Wähle dein Projekt **woms** aus
|
||||
3. Gehe zu **Auth** im linken Menü
|
||||
4. Klicke auf **Providers** oder **Settings**
|
||||
5. Suche nach **Email/Password** und aktiviere es
|
||||
6. Stelle sicher, dass **Email/Password** aktiviert ist (grüner Schalter)
|
||||
|
||||
## 2. Ersten Benutzer erstellen
|
||||
|
||||
Du hast zwei Möglichkeiten:
|
||||
|
||||
### Option A: Über die App registrieren
|
||||
1. Öffne die Login-Seite
|
||||
2. Klicke auf **"Noch kein Account? Hier registrieren"**
|
||||
3. Gib deine Email und ein Passwort (mindestens 8 Zeichen) ein
|
||||
4. Klicke auf **Registrieren**
|
||||
|
||||
### Option B: Über Appwrite Dashboard erstellen
|
||||
1. Gehe zu **Auth** → **Users** im Appwrite Dashboard
|
||||
2. Klicke auf **Create User**
|
||||
3. Wähle **Email/Password** als Methode
|
||||
4. Gib Email und Passwort ein
|
||||
5. Klicke auf **Create**
|
||||
6. Logge dich dann in der App ein
|
||||
|
||||
## 3. Häufige Fehlermeldungen
|
||||
|
||||
### "Ungültige Email oder Passwort"
|
||||
- Überprüfe, ob die Email korrekt eingegeben wurde
|
||||
- Überprüfe, ob das Passwort korrekt ist
|
||||
- Stelle sicher, dass der Benutzer in Appwrite existiert
|
||||
|
||||
### "Benutzer nicht gefunden"
|
||||
- Der Benutzer existiert noch nicht → Registriere dich zuerst
|
||||
- Oder erstelle den Benutzer im Appwrite Dashboard
|
||||
|
||||
### "Email/Password Authentifizierung ist nicht aktiviert"
|
||||
- Gehe zu **Auth** → **Providers** in Appwrite
|
||||
- Aktiviere **Email/Password**
|
||||
|
||||
### "Ein Benutzer mit dieser Email existiert bereits"
|
||||
- Der Benutzer existiert bereits → Logge dich ein statt zu registrieren
|
||||
- Oder verwende eine andere Email-Adresse
|
||||
|
||||
## 4. Überprüfe die .env Datei
|
||||
|
||||
Stelle sicher, dass deine `.env` Datei korrekt ist:
|
||||
|
||||
```env
|
||||
VITE_APPWRITE_ENDPOINT=https://cloud.appwrite.io/v1
|
||||
VITE_APPWRITE_PROJECT_ID=693d9f37000b35267f1b
|
||||
VITE_APPWRITE_DATABASE_ID=6943bf0e0003291f8c35
|
||||
```
|
||||
|
||||
**Wichtig:** Nach Änderungen an der `.env` Datei musst du den Dev-Server neu starten!
|
||||
|
||||
## 5. Browser-Konsole überprüfen
|
||||
|
||||
1. Öffne die Browser-Entwicklertools (F12)
|
||||
2. Gehe zum Tab **Console**
|
||||
3. Versuche dich einzuloggen
|
||||
4. Schaue nach Fehlermeldungen in der Konsole
|
||||
|
||||
Häufige Fehler:
|
||||
- `401 Unauthorized` → Falsche Credentials oder Auth nicht aktiviert
|
||||
- `404 Not Found` → Falsche Project ID oder Endpoint
|
||||
- `Network Error` → Internetverbindung oder CORS-Problem
|
||||
|
||||
## 6. Dev-Server neu starten
|
||||
|
||||
Wenn du die `.env` Datei geändert hast:
|
||||
|
||||
```bash
|
||||
# Stoppe den Server (Ctrl+C)
|
||||
# Starte ihn neu:
|
||||
npm run dev
|
||||
```
|
||||
|
||||
## 7. Cache leeren
|
||||
|
||||
Manchmal hilft es, den Browser-Cache zu leeren:
|
||||
- Chrome/Edge: Ctrl+Shift+Delete (Windows) oder Cmd+Shift+Delete (Mac)
|
||||
- Firefox: Ctrl+Shift+Delete (Windows) oder Cmd+Shift+Delete (Mac)
|
||||
|
||||
## 8. Test mit Demo-Modus
|
||||
|
||||
Um zu testen, ob die App grundsätzlich funktioniert, kannst du temporär die `.env` Datei umbenennen:
|
||||
|
||||
```bash
|
||||
mv .env .env.backup
|
||||
```
|
||||
|
||||
Dann läuft die App im Demo-Modus und du kannst dich mit beliebigen Credentials einloggen.
|
||||
|
||||
**Wichtig:** Benenne die Datei wieder um, wenn du Appwrite verwenden möchtest:
|
||||
```bash
|
||||
mv .env.backup .env
|
||||
```
|
||||
|
||||
## Noch Probleme?
|
||||
|
||||
Wenn nichts hilft:
|
||||
1. Überprüfe, ob dein Appwrite-Projekt aktiv ist
|
||||
2. Überprüfe, ob die Project ID korrekt ist
|
||||
3. Versuche, einen neuen Benutzer im Appwrite Dashboard zu erstellen
|
||||
4. Überprüfe die Browser-Konsole auf detaillierte Fehlermeldungen
|
||||
|
||||
Viel Erfolg! 🚀
|
||||
|
||||
@@ -1,76 +0,0 @@
|
||||
# Berechtigungsproblem beheben
|
||||
|
||||
## Problem
|
||||
Du siehst den Fehler: **"401 (Unauthorized)"** oder **"The current user is not authorized to perform the requested action"**
|
||||
|
||||
Das bedeutet: Du bist eingeloggt, aber die Collection-Berechtigungen erlauben dir nicht, die Tickets zu lesen.
|
||||
|
||||
## Lösung: Berechtigungen in Appwrite konfigurieren
|
||||
|
||||
### Schritt 1: Collection-Berechtigungen überprüfen
|
||||
|
||||
1. Gehe zu `https://appwrite.webklar.com`
|
||||
2. Öffne dein Projekt **woms**
|
||||
3. Gehe zu **Databases** → **woms-database** → **workorders**
|
||||
4. Klicke auf den Tab **Settings**
|
||||
5. Scrolle zu **Permissions**
|
||||
|
||||
### Schritt 2: Read-Berechtigung hinzufügen
|
||||
|
||||
**Option A: Für alle Benutzer (empfohlen für Entwicklung)**
|
||||
- Klicke auf **Add Role** unter "Read"
|
||||
- Wähle **Any** aus
|
||||
- Klicke auf **Create**
|
||||
|
||||
**Option B: Nur für eingeloggte Benutzer**
|
||||
- Klicke auf **Add Role** unter "Read"
|
||||
- Wähle **Users** aus
|
||||
- Klicke auf **Create**
|
||||
|
||||
### Schritt 3: Weitere Berechtigungen hinzufügen
|
||||
|
||||
Für vollständige Funktionalität füge auch hinzu:
|
||||
|
||||
**Create (Erstellen):**
|
||||
- **Users** - damit eingeloggte Benutzer Tickets erstellen können
|
||||
|
||||
**Update (Aktualisieren):**
|
||||
- **Users** - damit eingeloggte Benutzer Tickets bearbeiten können
|
||||
|
||||
**Delete (Löschen):**
|
||||
- **Users** - damit eingeloggte Benutzer Tickets löschen können (optional)
|
||||
|
||||
### Schritt 4: Überprüfen
|
||||
|
||||
Nach dem Hinzufügen der Berechtigungen:
|
||||
|
||||
1. **Logge dich aus** und wieder **ein** (um die Session zu aktualisieren)
|
||||
2. Oder lade die Seite neu (F5)
|
||||
3. Die Tickets sollten jetzt geladen werden
|
||||
|
||||
## Aktuelle Konfiguration
|
||||
|
||||
- **Collection ID**: `6943bf7d001901baa60c`
|
||||
- **Database ID**: `6943bf0e0003291f8c35`
|
||||
- **Benötigte Berechtigung**: Read → **Any** oder **Users**
|
||||
|
||||
## Wenn es immer noch nicht funktioniert
|
||||
|
||||
1. **Überprüfe, ob du eingeloggt bist:**
|
||||
- Schaue in die Browser-Konsole
|
||||
- Es sollte keine 401-Fehler beim `account.get()` geben
|
||||
|
||||
2. **Überprüfe die Session:**
|
||||
- Gehe zu **Auth** → **Sessions** im Appwrite Dashboard
|
||||
- Stelle sicher, dass eine aktive Session existiert
|
||||
|
||||
3. **Teste mit "Any" Berechtigung:**
|
||||
- Füge temporär **Any** als Read-Berechtigung hinzu
|
||||
- Wenn das funktioniert, liegt das Problem bei der "Users" Berechtigung
|
||||
|
||||
4. **Überprüfe die Collection ID:**
|
||||
- Stelle sicher, dass die Collection ID `6943bf7d001901baa60c` korrekt ist
|
||||
- Überprüfe im Dashboard unter **Settings** → **General**
|
||||
|
||||
Viel Erfolg! 🚀
|
||||
|
||||
@@ -1,142 +0,0 @@
|
||||
# Project ID Fehler beheben
|
||||
|
||||
Wenn du die Fehlermeldung bekommst: **"Project with the requested ID could not be found"**, folge diesen Schritten:
|
||||
|
||||
## Schritt 1: Project ID im Appwrite Dashboard überprüfen
|
||||
|
||||
1. Gehe zu [https://cloud.appwrite.io](https://cloud.appwrite.io)
|
||||
2. Logge dich ein
|
||||
3. Wähle dein Projekt **woms** aus
|
||||
4. Gehe zu **Settings** → **General**
|
||||
5. Suche nach **Project ID**
|
||||
6. **Kopiere die Project ID** (sie sollte so aussehen: `693d9f37000b35267f1b`)
|
||||
|
||||
## Schritt 2: .env Datei aktualisieren
|
||||
|
||||
1. Öffne die `.env` Datei im Root-Verzeichnis deines Projekts
|
||||
2. Überprüfe, ob die Project ID korrekt ist:
|
||||
|
||||
```env
|
||||
VITE_APPWRITE_ENDPOINT=https://cloud.appwrite.io/v1
|
||||
VITE_APPWRITE_PROJECT_ID=693d9f37000b35267f1b
|
||||
VITE_APPWRITE_DATABASE_ID=6943bf0e0003291f8c35
|
||||
```
|
||||
|
||||
3. **Wichtig:** Stelle sicher, dass:
|
||||
- Keine Leerzeichen vor oder nach den Werten sind
|
||||
- Keine Anführungszeichen um die Werte sind
|
||||
- Die Project ID genau so ist wie im Dashboard
|
||||
|
||||
## Schritt 3: Dev-Server neu starten
|
||||
|
||||
**WICHTIG:** Nach jeder Änderung an der `.env` Datei musst du den Dev-Server **komplett neu starten**!
|
||||
|
||||
1. Stoppe den laufenden Server (falls er läuft):
|
||||
- Drücke `Ctrl+C` im Terminal
|
||||
|
||||
2. Starte den Server neu:
|
||||
```bash
|
||||
npm run dev
|
||||
```
|
||||
|
||||
## Schritt 4: Browser-Konsole überprüfen
|
||||
|
||||
1. Öffne die App im Browser
|
||||
2. Öffne die Browser-Entwicklertools (F12)
|
||||
3. Gehe zum Tab **Console**
|
||||
4. Du solltest jetzt Debug-Informationen sehen:
|
||||
```
|
||||
🔧 Appwrite Konfiguration:
|
||||
Endpoint: https://cloud.appwrite.io/v1
|
||||
Project ID: 693d9f37000b35267f1b
|
||||
Database ID: 6943bf0e0003291f8c35
|
||||
```
|
||||
|
||||
5. Wenn du `NICHT GESETZT` siehst, bedeutet das, dass die `.env` Datei nicht geladen wird
|
||||
|
||||
## Schritt 5: Überprüfe die .env Datei-Position
|
||||
|
||||
Die `.env` Datei **MUSS** im Root-Verzeichnis sein (gleiche Ebene wie `package.json`):
|
||||
|
||||
```
|
||||
tickte-system/
|
||||
├── .env ← HIER!
|
||||
├── package.json
|
||||
├── vite.config.js
|
||||
├── src/
|
||||
└── ...
|
||||
```
|
||||
|
||||
## Schritt 6: Cache leeren
|
||||
|
||||
Manchmal hilft es, den Vite-Cache zu löschen:
|
||||
|
||||
```bash
|
||||
# Stoppe den Server
|
||||
# Dann führe aus:
|
||||
rm -rf node_modules/.vite
|
||||
npm run dev
|
||||
```
|
||||
|
||||
## Schritt 7: Projekt-Status überprüfen
|
||||
|
||||
1. Gehe zu deinem Appwrite Dashboard
|
||||
2. Überprüfe, ob das Projekt **aktiv** ist
|
||||
3. Überprüfe, ob du **Zugriff** auf das Projekt hast
|
||||
4. Stelle sicher, dass das Projekt nicht gelöscht oder deaktiviert wurde
|
||||
|
||||
## Schritt 8: Alternative: Project ID direkt testen
|
||||
|
||||
Du kannst die Project ID auch direkt in der Browser-Konsole testen:
|
||||
|
||||
1. Öffne die Browser-Konsole (F12)
|
||||
2. Führe aus:
|
||||
```javascript
|
||||
console.log('Project ID:', import.meta.env.VITE_APPWRITE_PROJECT_ID)
|
||||
```
|
||||
|
||||
Wenn `undefined` ausgegeben wird, wird die `.env` Datei nicht geladen.
|
||||
|
||||
## Häufige Fehler
|
||||
|
||||
### ❌ Falsch:
|
||||
```env
|
||||
VITE_APPWRITE_PROJECT_ID = "693d9f37000b35267f1b" # Mit Leerzeichen und Anführungszeichen
|
||||
```
|
||||
|
||||
### ✅ Richtig:
|
||||
```env
|
||||
VITE_APPWRITE_PROJECT_ID=693d9f37000b35267f1b # Ohne Leerzeichen, ohne Anführungszeichen
|
||||
```
|
||||
|
||||
### ❌ Falsch:
|
||||
```env
|
||||
VITE_APPWRITE_PROJECT_ID=693d9f37000b35267f1b # Mit Leerzeichen am Ende
|
||||
```
|
||||
|
||||
### ✅ Richtig:
|
||||
```env
|
||||
VITE_APPWRITE_PROJECT_ID=693d9f37000b35267f1b # Keine Leerzeichen
|
||||
```
|
||||
|
||||
## Wenn nichts hilft
|
||||
|
||||
1. Erstelle eine neue `.env` Datei:
|
||||
```bash
|
||||
rm .env
|
||||
cat > .env << 'EOF'
|
||||
VITE_APPWRITE_ENDPOINT=https://cloud.appwrite.io/v1
|
||||
VITE_APPWRITE_PROJECT_ID=693d9f37000b35267f1b
|
||||
VITE_APPWRITE_DATABASE_ID=6943bf0e0003291f8c35
|
||||
EOF
|
||||
```
|
||||
|
||||
2. Starte den Server neu:
|
||||
```bash
|
||||
npm run dev
|
||||
```
|
||||
|
||||
3. Überprüfe die Browser-Konsole auf die Debug-Ausgaben
|
||||
|
||||
Viel Erfolg! 🚀
|
||||
|
||||
@@ -1,49 +1,40 @@
|
||||
# WOMS 2.0 - Work Order Management System
|
||||
# WOMS – Ticketsystem von WEBklar
|
||||
|
||||
React-basiertes Ticket-Management-System mit Appwrite Backend.
|
||||
Internes Ticketsystem unter https://ticket.webklar.com: Tickets, Arbeitsblätter mit
|
||||
Zeiterfassung, Kunden und Leads, Website-Projekte, Planboard und Rechnungen.
|
||||
React/Vite im Browser, Daten in Appwrite (Projekt `6a1058610003c5a13a05`,
|
||||
Datenbank `woms-database`, API unter `https://ticket.webklar.com/v1`).
|
||||
|
||||
## 🚀 Schnellstart
|
||||
## Entwickeln und live stellen
|
||||
|
||||
### 1. Dependencies installieren
|
||||
```bash
|
||||
npm install
|
||||
```
|
||||
- Lokal starten: siehe [LOCAL_DEV.md](./LOCAL_DEV.md) (Vite-Proxy + `.env.local`).
|
||||
- Live ist der Branch `test` im Gitea-Repo `JUSN/tickte-system`. Ein Push löst
|
||||
auf dem Server Build und Deploy aus.
|
||||
- Achtung: Der Webhook baut **jeden** gepushten Branch und stellt ihn live.
|
||||
Feature-Branches deshalb nicht pushen; live geht es mit
|
||||
`git push origin <branch>:test`.
|
||||
|
||||
### 2. Appwrite einrichten
|
||||
## Datenmodell (Kurzfassung)
|
||||
|
||||
**Wichtig:** Für eine detaillierte Schritt-für-Schritt-Anleitung siehe [APPWRITE_SETUP.md](./APPWRITE_SETUP.md)
|
||||
Datum speichert WOMS als Text `dd.mm.yyyy`, Uhrzeiten als `hhmm` (z. B. `0930`).
|
||||
|
||||
Kurzfassung:
|
||||
1. Erstelle ein Appwrite-Projekt auf [cloud.appwrite.io](https://cloud.appwrite.io)
|
||||
2. Erstelle eine `.env` Datei im Root-Verzeichnis:
|
||||
```env
|
||||
VITE_APPWRITE_ENDPOINT=https://cloud.appwrite.io/v1
|
||||
VITE_APPWRITE_PROJECT_ID=deine-project-id-hier
|
||||
VITE_APPWRITE_DATABASE_ID=woms-database
|
||||
```
|
||||
3. Folge der detaillierten Anleitung in `APPWRITE_SETUP.md` um die Datenbank-Struktur zu erstellen
|
||||
| Collection | Inhalt | Wichtige Felder |
|
||||
|---|---|---|
|
||||
| `workorders` | Tickets | `woid` (fortlaufend ab 10000), `topic`, `details`, `status`, `priority`, `type` (Webpage, Migration, Project, Akquise), `serviceType`, `customerId`/`customerName`, `assignedTo`/`assignedName`, `requestedBy`, `startDate`/`startTime`/`endTime`, `deadline` |
|
||||
| `worksheets` | Arbeitsblätter | `wsid` (fortlaufend ab 100000), `woid` + `workorderId`, `employeeId`/`employeeName`, `serviceType`, `oldStatus`/`newStatus`, `totalTime` (Minuten), `startDate`/`startTime`/`endDate`/`endTime`, `details`, `isComment`, `countsToPlan` (Abo-Stunden) |
|
||||
| `customers` | Kunden und Leads | `code` (Kundennummer), `name`/`companyName`, `customerStatus` (z. B. lead, customer, lost), `archived`, Rechnungsadresse, `invoiceNinjaClientId`, Portal-Zugang |
|
||||
| `employees` | Mitarbeiter | `userId` (Appwrite-Benutzer), `displayName`, `email`, `shortcode` (Kürzel) |
|
||||
| `websiteProjects` | Website-Projekte und Vorschauen | `customerId` (steuert, was der Kunde im Portal sieht), `ticketId` (Ziel der Git-Push-Arbeitsblätter), Subdomain, Repo |
|
||||
| `leads`, `leadPipeline`, `leadSettings` | Lead-Automatik | Recherche-Ergebnisse, Pipeline-Schritte, Sucheinstellungen |
|
||||
| `roadmaps`, `roadmapNodes` | Projektpläne | Plan mit Schritten, verknüpft mit einem Ticket |
|
||||
| `config` | Einstellungen | Prioritäten (dazu alte Listen, die nichts mehr liest) |
|
||||
|
||||
### 3. App starten
|
||||
```bash
|
||||
npm run dev
|
||||
```
|
||||
Zusammenspiel mit anderen Systemen:
|
||||
|
||||
Die App läuft dann auf `http://localhost:5173`
|
||||
|
||||
## 📚 Dokumentation
|
||||
|
||||
- **[APPWRITE_SETUP.md](./APPWRITE_SETUP.md)** - Detaillierte Anleitung zur Appwrite-Einrichtung
|
||||
- Schritt-für-Schritt Setup
|
||||
- Datenbank-Schema
|
||||
- Berechtigungen
|
||||
- Fehlerbehebung
|
||||
|
||||
## Features
|
||||
|
||||
- Ticket-Erstellung und -Verwaltung
|
||||
- Status-Tracking (Open, Occupied, Assigned, Awaiting, Closed)
|
||||
- Prioritäts-Management (Low, Normal, High, Critical)
|
||||
- Filter und Suche
|
||||
- Datei-Uploads
|
||||
- Dashboard mit Statistiken
|
||||
- Planboard für Terminplanung
|
||||
- **Kundenportal** (project.webklar.com): legt bei jedem Git-Push ein Arbeitsblatt an
|
||||
(`employeeId` `gitea`, `serviceType` `GIT`, ohne Beginn). Die Zeit wird in WOMS
|
||||
nachgetragen, danach zählt sie als Arbeitszeit. Termine aus der Rechnungsanalyse
|
||||
landen am Akquise-Ticket des Kunden und erscheinen im Planboard. Kunden-, Mitarbeiter-
|
||||
und Projektverwaltung laufen über die Admin-API des Portals.
|
||||
- **ticket-integrations** (`/api/integrations`): Proxy zu InvoiceNinja (Rechnungen)
|
||||
und Paperless (Dokumente).
|
||||
@@ -1,141 +0,0 @@
|
||||
# WOID Attribut für workorders Collection
|
||||
|
||||
## Was ist die WOID?
|
||||
|
||||
Die **WOID (Work Order ID)** ist eine **5-stellige Zahl** (10000-99999), die jedes Ticket eindeutig identifiziert.
|
||||
|
||||
Beispiele: `10234`, `54321`, `99999`
|
||||
|
||||
## Appwrite Setup
|
||||
|
||||
Das `woid` Attribut muss zur `workorders` Collection hinzugefügt werden:
|
||||
|
||||
### Schritt 1: Öffne Appwrite
|
||||
|
||||
1. Gehe zu: `https://appwrite.webklar.com`
|
||||
2. Öffne dein Projekt: **woms** (ID: `693d9f37000b35267f1b`)
|
||||
3. Gehe zu **Databases** → **woms-database** (ID: `6943bf0e0003291f8c35`)
|
||||
4. Öffne die Collection: **workorders** (ID: `6943bf7d001901baa60c`)
|
||||
|
||||
### Schritt 2: Erstelle das woid Attribut
|
||||
|
||||
1. Klicke auf **Attributes** Tab
|
||||
2. Klicke auf **Create Attribute**
|
||||
3. Wähle **String** als Typ
|
||||
4. Konfiguration:
|
||||
- **Attribute Key**: `woid`
|
||||
- **Size**: 10
|
||||
- **Required**: ❌ Nein (für bestehende Tickets ohne WOID)
|
||||
- **Array**: ❌ Nein
|
||||
- **Default Value**: (leer lassen)
|
||||
|
||||
5. Klicke auf **Create**
|
||||
|
||||
### Schritt 3: Optional - Index erstellen
|
||||
|
||||
Für schnellere Suche nach WOID:
|
||||
|
||||
1. Gehe zum **Indexes** Tab
|
||||
2. Klicke auf **Create Index**
|
||||
3. Konfiguration:
|
||||
- **Index Key**: `woid_index`
|
||||
- **Type**: Key
|
||||
- **Attributes**: Wähle `woid`
|
||||
- **Order**: ASC
|
||||
|
||||
4. Klicke auf **Create**
|
||||
|
||||
## Wie funktioniert die WOID?
|
||||
|
||||
### Automatische Generierung
|
||||
|
||||
Beim Erstellen eines neuen Tickets wird automatisch eine 5-stellige WOID generiert:
|
||||
|
||||
```javascript
|
||||
// Beispiel: 12345, 54321, 99999
|
||||
const generateWOID = () => {
|
||||
const timestamp = Date.now().toString()
|
||||
const random = Math.floor(Math.random() * 90000) + 10000
|
||||
const combined = (parseInt(timestamp.slice(-5)) + random) % 90000 + 10000
|
||||
return combined.toString().padStart(5, '0')
|
||||
}
|
||||
```
|
||||
|
||||
### Anzeige in der App
|
||||
|
||||
- **Ticket-Liste**: Zeigt die WOID in der ersten Spalte
|
||||
- **Ticket-Details**: WOID im Header
|
||||
- **Filter**: Suche nach WOID möglich
|
||||
|
||||
### Format
|
||||
|
||||
- **Länge**: Immer 5 Zeichen
|
||||
- **Typ**: Nur Zahlen (0-9)
|
||||
- **Bereich**: 10000-99999
|
||||
- **Beispiele**: `10234`, `54321`, `99999`
|
||||
|
||||
## Bestehende Tickets
|
||||
|
||||
Tickets die vor diesem Update erstellt wurden, haben möglicherweise keine WOID.
|
||||
|
||||
**Fallback:** Wenn keine WOID vorhanden ist, werden die letzten 5 Zeichen der Document ID angezeigt.
|
||||
|
||||
## Fehlerbehebung
|
||||
|
||||
### "Unknown attribute: woid"
|
||||
|
||||
**Problem:** Das `woid` Attribut existiert nicht in der Collection.
|
||||
|
||||
**Lösung:** Folge Schritt 2 oben, um das Attribut zu erstellen.
|
||||
|
||||
### WOID zeigt Buchstaben
|
||||
|
||||
**Problem:** Alte Tickets haben keine WOID und verwenden den Fallback (Document ID).
|
||||
|
||||
**Lösung:**
|
||||
1. Erstelle das `woid` Attribut (Schritt 2)
|
||||
2. Neue Tickets bekommen automatisch eine WOID
|
||||
3. Optional: Bestehende Tickets manuell aktualisieren
|
||||
|
||||
### WOID Duplikate
|
||||
|
||||
**Problem:** Zwei Tickets haben die gleiche WOID (sehr unwahrscheinlich).
|
||||
|
||||
**Lösung:** Der Algorithmus verwendet Timestamp + Zufallszahl für Eindeutigkeit. Bei Millionen von Tickets könnte theoretisch eine Kollision auftreten.
|
||||
|
||||
**Verbesserung:** Verwende einen Index mit `unique: true` und behandle Fehler beim Erstellen.
|
||||
|
||||
## Technische Details
|
||||
|
||||
### Datentyp in Appwrite
|
||||
|
||||
- **String** (nicht Integer), weil:
|
||||
- Führende Nullen möglich (z.B. `00123`)
|
||||
- Einfacher zu suchen und zu filtern
|
||||
- Kompatibel mit verschiedenen Formaten
|
||||
|
||||
### Speicherung
|
||||
|
||||
```javascript
|
||||
workorderData = {
|
||||
// ...
|
||||
woid: "12345", // String mit 5 Ziffern
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
### Anzeige
|
||||
|
||||
```javascript
|
||||
// In TicketRow.jsx
|
||||
<div>{ticket.woid || ticket.$id?.slice(-5)}</div>
|
||||
```
|
||||
|
||||
## Fertig!
|
||||
|
||||
Nach dem Erstellen des `woid` Attributs:
|
||||
- ✅ Neue Tickets bekommen automatisch eine 5-stellige WOID
|
||||
- ✅ WOID wird in der Ticket-Liste angezeigt
|
||||
- ✅ Suche nach WOID funktioniert
|
||||
- ✅ Keine Buchstaben mehr in der WOID
|
||||
|
||||
@@ -1,107 +0,0 @@
|
||||
# Workorder Collection Attribute beheben
|
||||
|
||||
Der Fehler "Unknown attribute: 'status'" bedeutet, dass das Attribut `status` in deiner `workorders` Collection fehlt.
|
||||
|
||||
## Problem
|
||||
|
||||
Die Collection `workorders` (ID: `6943bf7d001901baa60c`) hat nicht alle benötigten Attribute.
|
||||
|
||||
## Lösung: Attribute hinzufügen
|
||||
|
||||
1. Gehe zu `https://appwrite.webklar.com`
|
||||
2. Öffne dein Projekt **woms**
|
||||
3. Gehe zu **Databases** → **woms-database** → **workorders**
|
||||
4. Klicke auf **Attributes** Tab
|
||||
5. Füge die fehlenden Attribute hinzu:
|
||||
|
||||
### Erforderliche Attribute (Required):
|
||||
|
||||
| Attribut Name | Typ | Größe | Required | Default |
|
||||
|--------------|-----|-------|----------|---------|
|
||||
| `topic` | string | 255 | ✓ | - |
|
||||
| `status` | string | 50 | ✓ | `Open` |
|
||||
| `priority` | integer | - | ✓ | `1` |
|
||||
|
||||
### Optionale Attribute:
|
||||
|
||||
| Attribut Name | Typ | Größe | Required |
|
||||
|--------------|-----|-------|----------|
|
||||
| `type` | string | 50 | - |
|
||||
| `systemType` | string | 50 | - |
|
||||
| `responseLevel` | string | 50 | - |
|
||||
| `serviceType` | string | 50 | - |
|
||||
| `customerId` | string | 50 | - |
|
||||
| `customerName` | string | 255 | - |
|
||||
| `customerLocation` | string | 255 | - |
|
||||
| `requestedBy` | string | 255 | - |
|
||||
| `requestedFor` | string | 255 | - |
|
||||
| `startDate` | string | 50 | - |
|
||||
| `startTime` | string | 10 | - |
|
||||
| `deadline` | string | 50 | - |
|
||||
| `endTime` | string | 10 | - |
|
||||
| `estimate` | string | 50 | - |
|
||||
| `mailCopyTo` | string | 255 | - |
|
||||
| `sendNotification` | boolean | - | - |
|
||||
| `details` | string | 10000 | - |
|
||||
| `assignedTo` | string | 50 | - |
|
||||
| `assignedName` | string | 255 | - |
|
||||
| `approvalStatus` | string | 50 | - |
|
||||
| `woid` | string | 50 | - |
|
||||
| `createdAt` | datetime | - | - |
|
||||
|
||||
## Schritt-für-Schritt
|
||||
|
||||
### 1. Status hinzufügen (wichtig!)
|
||||
|
||||
1. Klicke auf **Create Attribute**
|
||||
2. **Key**: `status`
|
||||
3. **Type**: `String`
|
||||
4. **Size**: `50`
|
||||
5. **Required**: ✓ (aktivieren)
|
||||
6. **Default**: `Open`
|
||||
7. **Array**: Nein
|
||||
8. Klicke auf **Create**
|
||||
|
||||
### 2. Priority hinzufügen (wichtig!)
|
||||
|
||||
1. Klicke auf **Create Attribute**
|
||||
2. **Key**: `priority`
|
||||
3. **Type**: `Integer`
|
||||
4. **Required**: ✓ (aktivieren)
|
||||
5. **Default**: `1`
|
||||
6. Klicke auf **Create**
|
||||
|
||||
### 3. Topic hinzufügen (wichtig!)
|
||||
|
||||
1. Klicke auf **Create Attribute**
|
||||
2. **Key**: `topic`
|
||||
3. **Type**: `String`
|
||||
4. **Size**: `255`
|
||||
5. **Required**: ✓ (aktivieren)
|
||||
6. Klicke auf **Create**
|
||||
|
||||
### 4. Weitere Attribute hinzufügen
|
||||
|
||||
Wiederhole den Prozess für alle anderen Attribute aus der Liste oben.
|
||||
|
||||
## Überprüfung
|
||||
|
||||
Nach dem Hinzufügen aller Attribute:
|
||||
|
||||
1. Stelle sicher, dass mindestens diese drei Attribute existieren:
|
||||
- ✓ `topic` (string, required)
|
||||
- ✓ `status` (string, required, default: "Open")
|
||||
- ✓ `priority` (integer, required, default: 1)
|
||||
|
||||
2. Versuche erneut, ein Ticket zu erstellen
|
||||
|
||||
## Wenn Attribute bereits existieren
|
||||
|
||||
Falls die Attribute bereits existieren, aber andere Namen haben:
|
||||
|
||||
1. Überprüfe die Attributnamen in Appwrite
|
||||
2. Teile mir die tatsächlichen Attributnamen mit
|
||||
3. Ich passe den Code entsprechend an
|
||||
|
||||
Viel Erfolg! 🚀
|
||||
|
||||
@@ -1,210 +0,0 @@
|
||||
# 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
|
||||
|
||||
@@ -1,119 +0,0 @@
|
||||
# WSID Attribut Hinzufügen
|
||||
|
||||
Diese Anleitung zeigt dir, wie du das **WSID (Work Sheet ID)** Attribut zur `workorders` Collection hinzufügst.
|
||||
|
||||
## Was ist WSID?
|
||||
|
||||
- **WSID** = Work Sheet ID
|
||||
- **Format**: 6-stellige Nummer (100000-999999)
|
||||
- **Funktion**: Sequentielle ID ähnlich wie WOID, aber mit 6 Stellen
|
||||
- **Beispiele**: 100000, 100001, 100002, etc.
|
||||
|
||||
## Schritt-für-Schritt Anleitung
|
||||
|
||||
### 1. Appwrite Dashboard öffnen
|
||||
|
||||
1. Gehe zu https://appwrite.webklar.com (oder deine Appwrite-Instanz)
|
||||
2. Logge dich ein
|
||||
3. Öffne dein Projekt **woms**
|
||||
|
||||
### 2. Zur workorders Collection navigieren
|
||||
|
||||
1. Klicke auf **Databases** im linken Menü
|
||||
2. Wähle die Datenbank **woms-database** (ID: `6943bf0e0003291f8c35`)
|
||||
3. Klicke auf die Collection **workorders** (ID: `6943bf7d001901baa60c`)
|
||||
|
||||
### 3. WSID Attribut erstellen
|
||||
|
||||
1. Klicke auf den Tab **Attributes**
|
||||
2. Klicke auf **Create Attribute**
|
||||
3. Wähle **String** als Typ
|
||||
4. Fülle die Felder wie folgt aus:
|
||||
|
||||
**Attribut-Konfiguration:**
|
||||
- **Attribute ID**: `wsid`
|
||||
- **Attribute Name**: `wsid`
|
||||
- **Size**: `10` (für 6-stellige Zahlen + Reserve)
|
||||
- **Required**: ❌ Nein (nicht required, damit alte Tickets ohne WSID weiter funktionieren)
|
||||
- **Array**: ❌ Nein
|
||||
- **Default Value**: Leer lassen
|
||||
|
||||
5. Klicke auf **Create**
|
||||
|
||||
### 4. Index für WSID erstellen (Optional, aber empfohlen)
|
||||
|
||||
Ein Index verbessert die Performance beim Suchen und Filtern:
|
||||
|
||||
1. Klicke auf den Tab **Indexes**
|
||||
2. Klicke auf **Create Index**
|
||||
3. Fülle die Felder wie folgt aus:
|
||||
|
||||
**Index-Konfiguration:**
|
||||
- **Key**: `wsid`
|
||||
- **Type**: `key`
|
||||
- **Attributes**: Wähle `wsid`
|
||||
- **Order**: `ASC` (aufsteigend)
|
||||
|
||||
4. Klicke auf **Create**
|
||||
|
||||
### 5. Fertig! ✅
|
||||
|
||||
Das WSID-Attribut ist jetzt in deiner Collection verfügbar. Die Anwendung wird automatisch:
|
||||
|
||||
- Für neue Tickets eine sequentielle WSID generieren (startend bei 100000)
|
||||
- Die WSID in der Ticket-Liste anzeigen
|
||||
- Die WSID im Detail-View anzeigen
|
||||
|
||||
## Hinweise
|
||||
|
||||
### Sequentielle Generierung
|
||||
|
||||
Die WSID wird ähnlich wie WOID automatisch generiert:
|
||||
|
||||
```javascript
|
||||
// Beispiel:
|
||||
Erstes Ticket: WSID = 100000
|
||||
Zweites Ticket: WSID = 100001
|
||||
Drittes Ticket: WSID = 100002
|
||||
// etc.
|
||||
```
|
||||
|
||||
### Unterschied WOID vs WSID
|
||||
|
||||
| Feld | Stellen | Start | Format | Beispiel |
|
||||
|------|---------|-------|--------|----------|
|
||||
| WOID | 5 | 10000 | String | "10000" |
|
||||
| WSID | 6 | 100000 | String | "100000" |
|
||||
|
||||
### Alte Tickets
|
||||
|
||||
Tickets, die vor dem Hinzufügen des WSID-Attributs erstellt wurden, haben keine WSID. In der UI wird dann "-" angezeigt.
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Problem: Attribut kann nicht erstellt werden
|
||||
|
||||
**Lösung**:
|
||||
- Überprüfe, ob das Attribut `wsid` nicht bereits existiert
|
||||
- Stelle sicher, dass du die richtigen Berechtigungen hast (Admin)
|
||||
|
||||
### Problem: WSID wird nicht angezeigt
|
||||
|
||||
**Lösung**:
|
||||
1. Überprüfe, ob das Attribut erfolgreich erstellt wurde
|
||||
2. Lade die Seite neu (Strg+F5 / Cmd+Shift+R)
|
||||
3. Erstelle ein neues Ticket zum Testen
|
||||
|
||||
### Problem: WSID startet nicht bei 100000
|
||||
|
||||
**Lösung**:
|
||||
- Das ist normal, wenn bereits Tickets mit WSID existieren
|
||||
- Die WSID wird immer sequentiell von der höchsten bestehenden WSID weitergezählt
|
||||
|
||||
## Support
|
||||
|
||||
Bei Fragen oder Problemen:
|
||||
1. Überprüfe die Appwrite Logs
|
||||
2. Schaue in die Browser Console (F12)
|
||||
3. Überprüfe, ob alle Berechtigungen korrekt gesetzt sind
|
||||
|
||||
@@ -1,325 +0,0 @@
|
||||
# WSID Implementation - Zusammenfassung
|
||||
|
||||
## ✅ Was wurde implementiert?
|
||||
|
||||
Das **WSID (Work Sheet ID) System** wurde vollständig implementiert, basierend auf dem Original NetWEB Systems WOMS 2.0.
|
||||
|
||||
---
|
||||
|
||||
## 📋 Implementierte Features
|
||||
|
||||
### 1. **Worksheets Collection** ✅
|
||||
- Separate Collection für Arbeitsschritte
|
||||
- 6-stellige WSID (100000, 100001, ...)
|
||||
- Sequentielle, globale Nummerierung
|
||||
- Beziehung zu Work Orders via `woid` und `workorderId`
|
||||
|
||||
### 2. **WSID-Generierung** ✅
|
||||
- Automatische Generierung beim Erstellen eines Worksheets
|
||||
- Sucht höchste existierende WSID und zählt +1
|
||||
- Startet bei 100000 wenn keine Worksheets existieren
|
||||
- Nur Zahlen, keine Buchstaben
|
||||
|
||||
### 3. **Worksheet-Erstellung** ✅
|
||||
- Modal-Dialog zum Erstellen neuer Worksheets
|
||||
- Felder:
|
||||
- Service Type (Remote/On Site/Off Site/COMMENT)
|
||||
- Status-Änderung (Old Status → New Status)
|
||||
- Response Level-Änderung
|
||||
- Arbeitszeit (manuell oder automatisch berechnet)
|
||||
- Start/End Datum & Zeit
|
||||
- Details (Arbeitsbeschreibung)
|
||||
- Kommentar-Flag (ohne Zeiterfassung)
|
||||
- Verknüpfung mit aktuellem Benutzer
|
||||
|
||||
### 4. **Worksheet-Anzeige** ✅
|
||||
- Liste aller Worksheets für ein Ticket
|
||||
- Zeitstrahl-Darstellung (Timeline)
|
||||
- Anzeige von:
|
||||
- WSID
|
||||
- Mitarbeiter (Name + Kürzel)
|
||||
- Arbeitszeit
|
||||
- Service Type
|
||||
- Status-Änderungen
|
||||
- Details
|
||||
- Unterscheidung zwischen Worksheets und Kommentaren
|
||||
|
||||
### 5. **Zeitaggregation** ✅
|
||||
- Gesamtarbeitszeit pro Ticket
|
||||
- Durchschnittszeit pro Worksheet
|
||||
- Arbeitszeit pro Mitarbeiter
|
||||
- Anzahl Worksheets
|
||||
|
||||
### 6. **Status-Historie** ✅
|
||||
- Chronologische Auflistung aller Status-Änderungen
|
||||
- Wer hat wann welchen Status gesetzt
|
||||
- Nachvollziehbarkeit aller Änderungen
|
||||
|
||||
### 7. **Statistiken & Reports** ✅
|
||||
- **Gesamtübersicht:**
|
||||
- Anzahl Worksheets
|
||||
- Gesamtarbeitszeit
|
||||
- Anzahl Kommentare
|
||||
- Durchschnitt pro Worksheet
|
||||
|
||||
- **Nach Mitarbeiter:**
|
||||
- Arbeitszeit pro Person
|
||||
- Anzahl Worksheets pro Person
|
||||
- Mitarbeiter-Kürzel
|
||||
|
||||
- **Service Type Verteilung:**
|
||||
- Wie viele Remote/On Site/etc.
|
||||
|
||||
- **Status-Historie Tabelle:**
|
||||
- Alle Status-Änderungen chronologisch
|
||||
- Mit Datum, Zeit, Mitarbeiter
|
||||
|
||||
### 8. **Automatische Zeitberechnung** ✅
|
||||
- System berechnet automatisch Arbeitszeit aus Start- und Endzeit
|
||||
- Manuelles Überschreiben möglich
|
||||
- Unterstützt Overnight-Zeiten (z.B. 23:00 - 01:00)
|
||||
|
||||
### 9. **Kommentar-Funktion** ✅
|
||||
- Worksheets können als "Nur Kommentar" markiert werden
|
||||
- Zählen nicht zur Arbeitszeit
|
||||
- Für Notizen, Updates, Kommunikation
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Technische Details
|
||||
|
||||
### Architektur
|
||||
|
||||
```
|
||||
Work Order (WOID) 1:n Worksheets (WSID)
|
||||
↓ ↓
|
||||
workorders worksheets
|
||||
Collection Collection
|
||||
```
|
||||
|
||||
### Collections
|
||||
|
||||
**workorders:**
|
||||
- Enthält WOID (5-stellig)
|
||||
- Enthält KEINE WSID mehr ✅
|
||||
- Referenz: `ticket.woid`
|
||||
|
||||
**worksheets:**
|
||||
- Enthält WSID (6-stellig)
|
||||
- Referenziert WOID
|
||||
- Referenziert workorderId (Appwrite Document ID)
|
||||
- Enthält Mitarbeiter-Info
|
||||
- Enthält Zeiterfassung
|
||||
- Enthält Status-Änderungen
|
||||
|
||||
### Datenfluss
|
||||
|
||||
1. **Ticket öffnen:**
|
||||
- System lädt Work Order
|
||||
- System lädt alle Worksheets mit `woid = ticket.woid`
|
||||
|
||||
2. **Worksheet erstellen:**
|
||||
- Benutzer klickt "Add Worksheet"
|
||||
- System generiert neue WSID
|
||||
- System speichert Worksheet
|
||||
- Wenn Status geändert → Work Order wird aktualisiert
|
||||
|
||||
3. **Statistiken:**
|
||||
- Werden in Echtzeit aus Worksheets berechnet
|
||||
- Keine Duplikate, keine Caching-Probleme
|
||||
|
||||
---
|
||||
|
||||
## 📂 Neue Dateien
|
||||
|
||||
| Datei | Beschreibung |
|
||||
|-------|--------------|
|
||||
| `src/hooks/useWorksheets.js` | Hook für Worksheet-Operationen |
|
||||
| `src/components/CreateWorksheetModal.jsx` | Modal zum Erstellen |
|
||||
| `src/components/WorksheetList.jsx` | Liste aller Worksheets |
|
||||
| `src/components/WorksheetStats.jsx` | Statistiken & Reports |
|
||||
| `WORKSHEETS_COLLECTION_SETUP.md` | Setup-Anleitung |
|
||||
| `WSID_IMPLEMENTATION_SUMMARY.md` | Diese Datei |
|
||||
|
||||
---
|
||||
|
||||
## 🔄 Geänderte Dateien
|
||||
|
||||
| Datei | Änderung |
|
||||
|-------|----------|
|
||||
| `src/hooks/useWorkorders.js` | WSID-Generierung **entfernt** ✅ |
|
||||
| `src/components/TicketRow.jsx` | Worksheet-Integration hinzugefügt |
|
||||
| `src/lib/appwrite.js` | WORKSHEETS Collection ID hinzugefügt |
|
||||
| `APPWRITE_SETUP.md` | WSID aus workorders entfernt |
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Setup-Schritte
|
||||
|
||||
### 1. Collection in Appwrite erstellen
|
||||
|
||||
```bash
|
||||
1. Gehe zu Appwrite Dashboard → Databases → woms-database
|
||||
2. Erstelle Collection "worksheets"
|
||||
3. Füge alle Attribute hinzu (siehe WORKSHEETS_COLLECTION_SETUP.md)
|
||||
4. Setze Permissions (Users: Read, Create, Update)
|
||||
5. Erstelle Indexes (woid, employeeId, startDate)
|
||||
6. Kopiere Collection ID
|
||||
```
|
||||
|
||||
### 2. Collection ID in Code eintragen
|
||||
|
||||
```javascript
|
||||
// src/lib/appwrite.js
|
||||
export const COLLECTIONS = {
|
||||
WORKORDERS: '6943bf7d001901baa60c',
|
||||
WORKSHEETS: 'DEINE_COLLECTION_ID_HIER', // ← Hier eintragen!
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
### 3. WSID aus workorders Collection entfernen (Optional)
|
||||
|
||||
Falls du bereits `wsid` als Attribut in der `workorders` Collection hast:
|
||||
|
||||
```bash
|
||||
1. Gehe zu Appwrite Dashboard → workorders Collection
|
||||
2. Gehe zu Attributes
|
||||
3. Lösche Attribut "wsid" (falls vorhanden)
|
||||
```
|
||||
|
||||
⚠️ **Achtung:** Stelle sicher, dass keine wichtigen Daten verloren gehen!
|
||||
|
||||
---
|
||||
|
||||
## 📊 Verbesserungen gegenüber Original
|
||||
|
||||
| Feature | Original | Neu |
|
||||
|---------|----------|-----|
|
||||
| **WSID-Generierung** | Manuell/unklar | Automatisch, sequentiell |
|
||||
| **Zeitberechnung** | Manuell | Automatisch + manuell |
|
||||
| **Statistiken** | Keine/begrenzt | Umfassend (Mitarbeiter, Service Type, Historie) |
|
||||
| **Kommentare** | Unklar | Eigener Typ (ohne Zeit) |
|
||||
| **Status-Historie** | Nicht dokumentiert | Vollständig nachvollziehbar |
|
||||
| **Zeitaggregation** | Manuell | Automatisch |
|
||||
| **Multi-Mitarbeiter** | Schwierig | Einfach trackbar |
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Verwendung
|
||||
|
||||
### Worksheet erstellen
|
||||
|
||||
1. Öffne ein Ticket (Lock-Icon klicken)
|
||||
2. Klicke "Add Worksheet"
|
||||
3. Fülle Formular aus:
|
||||
- Service Type wählen
|
||||
- Neuen Status wählen
|
||||
- Start/End Zeit eingeben (automatische Berechnung)
|
||||
- Details schreiben
|
||||
4. Klicke "CREATE NOW"
|
||||
|
||||
### Statistiken ansehen
|
||||
|
||||
Wenn Worksheets vorhanden sind, werden automatisch angezeigt:
|
||||
- Gesamtübersicht (oben)
|
||||
- Mitarbeiter-Statistiken
|
||||
- Service Type Verteilung
|
||||
- Status-Historie (falls Änderungen)
|
||||
|
||||
### Arbeitszeit tracken
|
||||
|
||||
Jedes Worksheet erfasst:
|
||||
- Wer hat gearbeitet
|
||||
- Wann (Datum + Zeit)
|
||||
- Wie lange
|
||||
- Was wurde gemacht
|
||||
- Welcher Status wurde gesetzt
|
||||
|
||||
**Beispiel:**
|
||||
|
||||
```
|
||||
WOID 59203: "Router-Problem"
|
||||
├─ WSID 100001: Max, 30min, Open → Occupied, "Fernanalyse"
|
||||
├─ WSID 100002: Max, 45min, Occupied → Assigned, "Firmware Update"
|
||||
└─ WSID 100003: Lisa, 15min, Assigned → Closed, "Vor-Ort-Check OK"
|
||||
|
||||
Gesamtzeit: 90 Minuten
|
||||
Mitarbeiter: Max (75min), Lisa (15min)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ✅ Checkliste
|
||||
|
||||
- [x] Worksheets Collection Dokumentation erstellt
|
||||
- [x] useWorksheets Hook mit WSID-Generierung
|
||||
- [x] CreateWorksheetModal UI-Komponente
|
||||
- [x] WorksheetList Komponente
|
||||
- [x] WorksheetStats Komponente (Statistiken)
|
||||
- [x] Integration in TicketRow
|
||||
- [x] WSID aus workorders entfernt
|
||||
- [x] Automatische Zeitberechnung
|
||||
- [x] Status-Historie
|
||||
- [x] Mitarbeiter-Tracking
|
||||
- [x] Kommentar-Funktion
|
||||
- [x] Service Type Tracking
|
||||
- [ ] **Collection in Appwrite erstellen** ← Das musst DU machen!
|
||||
- [ ] **Collection ID eintragen** ← Das musst DU machen!
|
||||
|
||||
---
|
||||
|
||||
## 🐛 Testing
|
||||
|
||||
Nach dem Setup:
|
||||
|
||||
1. **Worksheet erstellen:**
|
||||
```
|
||||
- Öffne ein Ticket
|
||||
- Klicke "Add Worksheet"
|
||||
- Fülle Formular aus
|
||||
- Speichern
|
||||
- → WSID sollte 100000 sein (erste)
|
||||
```
|
||||
|
||||
2. **Zweites Worksheet:**
|
||||
```
|
||||
- Erstelle weiteres Worksheet
|
||||
- → WSID sollte 100001 sein
|
||||
```
|
||||
|
||||
3. **Statistiken prüfen:**
|
||||
```
|
||||
- Öffne Ticket mit mehreren Worksheets
|
||||
- Statistiken sollten angezeigt werden
|
||||
- Gesamtzeit sollte korrekt sein
|
||||
```
|
||||
|
||||
4. **Status-Änderung:**
|
||||
```
|
||||
- Erstelle Worksheet mit Status-Änderung
|
||||
- Work Order Status sollte aktualisiert werden
|
||||
- Historie sollte angezeigt werden
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📖 Weiterführende Dokumentation
|
||||
|
||||
- **Setup:** `WORKSHEETS_COLLECTION_SETUP.md`
|
||||
- **Appwrite:** `APPWRITE_SETUP.md`
|
||||
- **Code:** Siehe Inline-Kommentare in den Komponenten
|
||||
|
||||
---
|
||||
|
||||
## 🎉 Fertig!
|
||||
|
||||
Das WSID-System ist vollständig implementiert und einsatzbereit!
|
||||
|
||||
**Nächste Schritte:**
|
||||
1. Collection in Appwrite erstellen
|
||||
2. Collection ID eintragen
|
||||
3. Testen!
|
||||
|
||||
Bei Fragen: Siehe Dokumentation oder Code-Kommentare.
|
||||
|
||||
@@ -1,195 +0,0 @@
|
||||
# WSID System - Quick Start Guide
|
||||
|
||||
## 🚀 Schnellstart in 5 Minuten
|
||||
|
||||
### Schritt 1: Collection in Appwrite erstellen
|
||||
|
||||
1. Gehe zu **https://appwrite.webklar.com**
|
||||
2. Login mit deinen Credentials
|
||||
3. Öffne Projekt **woms**
|
||||
4. Gehe zu **Databases** → **woms-database**
|
||||
5. Klicke **Create Collection**
|
||||
- Collection ID: `worksheets`
|
||||
- Name: `Work Sheets`
|
||||
6. Klicke **Create**
|
||||
|
||||
### Schritt 2: Attribute hinzufügen
|
||||
|
||||
Klicke auf **Attributes** und füge folgende Attribute hinzu:
|
||||
|
||||
#### Required Attributes (Pflicht):
|
||||
|
||||
```
|
||||
1. wsid | String | Size: 10 | Required: ✓ | Default: -
|
||||
2. woid | String | Size: 10 | Required: ✓ | Default: -
|
||||
3. workorderId | String | Size: 50 | Required: ✓ | Default: -
|
||||
4. employeeId | String | Size: 50 | Required: ✓ | Default: -
|
||||
5. employeeName | String | Size: 255 | Required: ✓ | Default: -
|
||||
6. serviceType | String | Size: 50 | Required: ✓ | Default: Remote
|
||||
7. oldStatus | String | Size: 50 | Required: ✓ | Default: -
|
||||
8. newStatus | String | Size: 50 | Required: ✓ | Default: -
|
||||
9. totalTime | Integer | - | Required: ✓ | Default: 0
|
||||
10. startDate | String | Size: 50 | Required: ✓ | Default: -
|
||||
11. endDate | String | Size: 50 | Required: ✓ | Default: -
|
||||
12. details | String | Size: 10000 | Required: ✓ | Default: -
|
||||
13. createdAt | DateTime| - | Required: - | Default: -
|
||||
```
|
||||
|
||||
#### Optional Attributes (Optional):
|
||||
|
||||
```
|
||||
14. employeeShort | String | Size: 10 | Required: - | Default: -
|
||||
15. oldResponseLevel | String | Size: 50 | Required: - | Default: -
|
||||
16. newResponseLevel | String | Size: 50 | Required: - | Default: -
|
||||
17. startTime | String | Size: 10 | Required: - | Default: -
|
||||
18. endTime | String | Size: 10 | Required: - | Default: -
|
||||
19. isComment | Boolean | - | Required: - | Default: false
|
||||
```
|
||||
|
||||
### Schritt 3: Permissions setzen
|
||||
|
||||
1. Gehe zu **Settings** → **Permissions**
|
||||
2. Setze folgende Berechtigungen:
|
||||
|
||||
**Read Access:**
|
||||
- ✅ `Users` (All users)
|
||||
|
||||
**Create Access:**
|
||||
- ✅ `Users` (All users)
|
||||
|
||||
**Update Access:**
|
||||
- ✅ `Users` (All users)
|
||||
|
||||
**Delete Access:**
|
||||
- ❌ Keine (für Audit Trail)
|
||||
|
||||
### Schritt 4: Indexes erstellen
|
||||
|
||||
Gehe zu **Indexes** und erstelle:
|
||||
|
||||
1. **woid_index**
|
||||
- Key: `woid`
|
||||
- Type: `key`
|
||||
- Order: `DESC`
|
||||
|
||||
2. **employee_index**
|
||||
- Key: `employeeId`
|
||||
- Type: `key`
|
||||
- Order: `DESC`
|
||||
|
||||
3. **date_index**
|
||||
- Key: `startDate`
|
||||
- Type: `key`
|
||||
- Order: `DESC`
|
||||
|
||||
### Schritt 5: Collection ID kopieren
|
||||
|
||||
1. Gehe zurück zur Collection-Übersicht
|
||||
2. Kopiere die **Collection ID** (z.B. `694xyz123abc456def789`)
|
||||
|
||||
### Schritt 6: Collection ID im Code eintragen
|
||||
|
||||
Öffne `src/lib/appwrite.js` und trage die Collection ID ein:
|
||||
|
||||
```javascript
|
||||
export const COLLECTIONS = {
|
||||
WORKORDERS: '6943bf7d001901baa60c',
|
||||
CUSTOMERS: '694bd1fb002b2e583d13',
|
||||
EMPLOYEES: '695280510031c6c6153b',
|
||||
WORKSHEETS: '694xyz123abc456def789', // ← Hier deine Collection ID eintragen!
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
### Schritt 7: Optional - WSID aus workorders entfernen
|
||||
|
||||
Falls du bereits ein `wsid`-Attribut in der `workorders` Collection hast:
|
||||
|
||||
1. Gehe zu **workorders** Collection
|
||||
2. Gehe zu **Attributes**
|
||||
3. Lösche Attribut `wsid` (falls vorhanden)
|
||||
|
||||
⚠️ **Hinweis:** Stelle sicher, dass du ein Backup hast!
|
||||
|
||||
### Schritt 8: Anwendung neu starten
|
||||
|
||||
```bash
|
||||
# Terminal öffnen
|
||||
npm run dev
|
||||
```
|
||||
|
||||
### Schritt 9: Testen!
|
||||
|
||||
1. Öffne die Anwendung im Browser
|
||||
2. Gehe zu **Tickets**
|
||||
3. Öffne ein Ticket (Lock-Icon klicken)
|
||||
4. Klicke **"Add Worksheet"**
|
||||
5. Fülle das Formular aus:
|
||||
- Service Type: `Remote`
|
||||
- New Status: `Occupied`
|
||||
- Start Time: `1000`
|
||||
- End Time: `1030`
|
||||
- Details: `Test-Worksheet`
|
||||
6. Klicke **"CREATE NOW"**
|
||||
|
||||
**Erwartetes Ergebnis:**
|
||||
- WSID sollte `100000` sein
|
||||
- Worksheet sollte in der Liste erscheinen
|
||||
- Statistiken sollten angezeigt werden
|
||||
|
||||
---
|
||||
|
||||
## ✅ Fertig!
|
||||
|
||||
Das WSID-System ist jetzt einsatzbereit!
|
||||
|
||||
### Nächste Schritte:
|
||||
|
||||
- Erstelle weitere Worksheets
|
||||
- Prüfe Statistiken
|
||||
- Teste Status-Änderungen
|
||||
- Prüfe Zeitaggregation
|
||||
|
||||
---
|
||||
|
||||
## 🐛 Troubleshooting
|
||||
|
||||
### Problem: "Collection nicht gefunden"
|
||||
|
||||
**Lösung:**
|
||||
- Überprüfe Collection ID in `src/lib/appwrite.js`
|
||||
- Stelle sicher, dass Collection wirklich existiert
|
||||
|
||||
### Problem: "Unauthorized"
|
||||
|
||||
**Lösung:**
|
||||
- Überprüfe Permissions in Appwrite
|
||||
- `Users` muss Read/Create Zugriff haben
|
||||
|
||||
### Problem: "Attribute nicht gefunden"
|
||||
|
||||
**Lösung:**
|
||||
- Überprüfe, ob alle Required Attributes erstellt wurden
|
||||
- Attribute-Namen müssen exakt übereinstimmen (case-sensitive!)
|
||||
|
||||
### Problem: "WSID wird nicht generiert"
|
||||
|
||||
**Lösung:**
|
||||
- Überprüfe Browser-Konsole auf Fehler
|
||||
- Stelle sicher, dass `wsid` Attribut existiert
|
||||
- Überprüfe, ob Collection ID korrekt ist
|
||||
|
||||
---
|
||||
|
||||
## 📚 Weitere Dokumentation
|
||||
|
||||
- **Detaillierte Setup-Anleitung:** `WORKSHEETS_COLLECTION_SETUP.md`
|
||||
- **Implementierungs-Details:** `WSID_IMPLEMENTATION_SUMMARY.md`
|
||||
- **Appwrite Setup:** `APPWRITE_SETUP.md`
|
||||
|
||||
---
|
||||
|
||||
## 🎉 Viel Erfolg!
|
||||
|
||||
Bei Fragen: Siehe ausführliche Dokumentation oder Code-Kommentare.
|
||||
|
||||
@@ -41,7 +41,7 @@ export function useWorksheets(woid = null) {
|
||||
if (err.code === 401 || errorMessage.includes('not authorized')) {
|
||||
errorMessage = 'Berechtigung fehlt: Bitte überprüfe die Read-Berechtigungen der Worksheets Collection.'
|
||||
} else if (errorMessage.includes('Collection') && errorMessage.includes('not found')) {
|
||||
errorMessage = 'Worksheets Collection nicht gefunden. Bitte erstelle die Collection in Appwrite (siehe WORKSHEETS_COLLECTION_SETUP.md).'
|
||||
errorMessage = 'Worksheets Collection nicht gefunden. Bitte die Collection in Appwrite prüfen (Datenmodell siehe README.md).'
|
||||
}
|
||||
|
||||
setError(errorMessage)
|
||||
|
||||
Reference in new issue
Block a user