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
|
- Lokal starten: siehe [LOCAL_DEV.md](./LOCAL_DEV.md) (Vite-Proxy + `.env.local`).
|
||||||
```bash
|
- Live ist der Branch `test` im Gitea-Repo `JUSN/tickte-system`. Ein Push löst
|
||||||
npm install
|
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:
|
| Collection | Inhalt | Wichtige Felder |
|
||||||
1. Erstelle ein Appwrite-Projekt auf [cloud.appwrite.io](https://cloud.appwrite.io)
|
|---|---|---|
|
||||||
2. Erstelle eine `.env` Datei im Root-Verzeichnis:
|
| `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` |
|
||||||
```env
|
| `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) |
|
||||||
VITE_APPWRITE_ENDPOINT=https://cloud.appwrite.io/v1
|
| `customers` | Kunden und Leads | `code` (Kundennummer), `name`/`companyName`, `customerStatus` (z. B. lead, customer, lost), `archived`, Rechnungsadresse, `invoiceNinjaClientId`, Portal-Zugang |
|
||||||
VITE_APPWRITE_PROJECT_ID=deine-project-id-hier
|
| `employees` | Mitarbeiter | `userId` (Appwrite-Benutzer), `displayName`, `email`, `shortcode` (Kürzel) |
|
||||||
VITE_APPWRITE_DATABASE_ID=woms-database
|
| `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 |
|
||||||
3. Folge der detaillierten Anleitung in `APPWRITE_SETUP.md` um die Datenbank-Struktur zu erstellen
|
| `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
|
Zusammenspiel mit anderen Systemen:
|
||||||
```bash
|
|
||||||
npm run dev
|
|
||||||
```
|
|
||||||
|
|
||||||
Die App läuft dann auf `http://localhost:5173`
|
- **Kundenportal** (project.webklar.com): legt bei jedem Git-Push ein Arbeitsblatt an
|
||||||
|
(`employeeId` `gitea`, `serviceType` `GIT`, ohne Beginn). Die Zeit wird in WOMS
|
||||||
## 📚 Dokumentation
|
nachgetragen, danach zählt sie als Arbeitszeit. Termine aus der Rechnungsanalyse
|
||||||
|
landen am Akquise-Ticket des Kunden und erscheinen im Planboard. Kunden-, Mitarbeiter-
|
||||||
- **[APPWRITE_SETUP.md](./APPWRITE_SETUP.md)** - Detaillierte Anleitung zur Appwrite-Einrichtung
|
und Projektverwaltung laufen über die Admin-API des Portals.
|
||||||
- Schritt-für-Schritt Setup
|
- **ticket-integrations** (`/api/integrations`): Proxy zu InvoiceNinja (Rechnungen)
|
||||||
- Datenbank-Schema
|
und Paperless (Dokumente).
|
||||||
- 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
|
|
||||||
@@ -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')) {
|
if (err.code === 401 || errorMessage.includes('not authorized')) {
|
||||||
errorMessage = 'Berechtigung fehlt: Bitte überprüfe die Read-Berechtigungen der Worksheets Collection.'
|
errorMessage = 'Berechtigung fehlt: Bitte überprüfe die Read-Berechtigungen der Worksheets Collection.'
|
||||||
} else if (errorMessage.includes('Collection') && errorMessage.includes('not found')) {
|
} 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)
|
setError(errorMessage)
|
||||||
|
|||||||
Reference in new issue
Block a user