From 7852593a7aa1af7784b7064c68ce388b10b2a3a7 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 27 Sep 2026 14:41:57 +0000 Subject: [PATCH] Veraltete Anleitungen entfernt, README neu MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- ADMIN_PANEL_SETUP.md | 116 ------------ ADMIN_ROLE_SETUP.md | 74 -------- APPWRITE_INDEXES_PERMISSIONS.md | 102 ---------- APPWRITE_PLATFORM_SETUP.md | 81 -------- APPWRITE_SELF_HOSTED.md | 86 --------- APPWRITE_SETUP.md | 200 -------------------- COLLECTION_ID_FIX.md | 63 ------- CONFIG_COLLECTION_SETUP.md | 75 -------- EMPLOYEES_COLLECTION_SETUP.md | 134 ------------- EMPLOYEE_WORKFLOW_TEST.md | 215 --------------------- IMPLEMENTATION_SUMMARY.md | 207 -------------------- LOGIN_TROUBLESHOOTING.md | 117 ------------ PERMISSIONS_FIX.md | 76 -------- PROJECT_ID_FIX.md | 142 -------------- README.md | 73 ++++--- WOID_ATTRIBUTE_SETUP.md | 141 -------------- WORKORDER_ATTRIBUTES_FIX.md | 107 ----------- WORKSHEETS_COLLECTION_SETUP.md | 210 --------------------- WSID_ATTRIBUTE_SETUP.md | 119 ------------ WSID_IMPLEMENTATION_SUMMARY.md | 325 -------------------------------- WSID_QUICKSTART.md | 195 ------------------- src/hooks/useWorksheets.js | 2 +- 22 files changed, 33 insertions(+), 2827 deletions(-) delete mode 100644 ADMIN_PANEL_SETUP.md delete mode 100644 ADMIN_ROLE_SETUP.md delete mode 100644 APPWRITE_INDEXES_PERMISSIONS.md delete mode 100644 APPWRITE_PLATFORM_SETUP.md delete mode 100644 APPWRITE_SELF_HOSTED.md delete mode 100644 APPWRITE_SETUP.md delete mode 100644 COLLECTION_ID_FIX.md delete mode 100644 CONFIG_COLLECTION_SETUP.md delete mode 100644 EMPLOYEES_COLLECTION_SETUP.md delete mode 100644 EMPLOYEE_WORKFLOW_TEST.md delete mode 100644 IMPLEMENTATION_SUMMARY.md delete mode 100644 LOGIN_TROUBLESHOOTING.md delete mode 100644 PERMISSIONS_FIX.md delete mode 100644 PROJECT_ID_FIX.md delete mode 100644 WOID_ATTRIBUTE_SETUP.md delete mode 100644 WORKORDER_ATTRIBUTES_FIX.md delete mode 100644 WORKSHEETS_COLLECTION_SETUP.md delete mode 100644 WSID_ATTRIBUTE_SETUP.md delete mode 100644 WSID_IMPLEMENTATION_SUMMARY.md delete mode 100644 WSID_QUICKSTART.md diff --git a/ADMIN_PANEL_SETUP.md b/ADMIN_PANEL_SETUP.md deleted file mode 100644 index 9d65795..0000000 --- a/ADMIN_PANEL_SETUP.md +++ /dev/null @@ -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! 🚀 - diff --git a/ADMIN_ROLE_SETUP.md b/ADMIN_ROLE_SETUP.md deleted file mode 100644 index ac54b26..0000000 --- a/ADMIN_ROLE_SETUP.md +++ /dev/null @@ -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! 🚀 - diff --git a/APPWRITE_INDEXES_PERMISSIONS.md b/APPWRITE_INDEXES_PERMISSIONS.md deleted file mode 100644 index 056eb84..0000000 --- a/APPWRITE_INDEXES_PERMISSIONS.md +++ /dev/null @@ -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! 🚀 - diff --git a/APPWRITE_PLATFORM_SETUP.md b/APPWRITE_PLATFORM_SETUP.md deleted file mode 100644 index e5a859b..0000000 --- a/APPWRITE_PLATFORM_SETUP.md +++ /dev/null @@ -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! 🚀 - diff --git a/APPWRITE_SELF_HOSTED.md b/APPWRITE_SELF_HOSTED.md deleted file mode 100644 index ea16ee4..0000000 --- a/APPWRITE_SELF_HOSTED.md +++ /dev/null @@ -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! 🚀 - diff --git a/APPWRITE_SETUP.md b/APPWRITE_SETUP.md deleted file mode 100644 index c66e4a1..0000000 --- a/APPWRITE_SETUP.md +++ /dev/null @@ -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! 🚀 diff --git a/COLLECTION_ID_FIX.md b/COLLECTION_ID_FIX.md deleted file mode 100644 index 2b012f7..0000000 --- a/COLLECTION_ID_FIX.md +++ /dev/null @@ -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! 🚀 - diff --git a/CONFIG_COLLECTION_SETUP.md b/CONFIG_COLLECTION_SETUP.md deleted file mode 100644 index 5ad9cfd..0000000 --- a/CONFIG_COLLECTION_SETUP.md +++ /dev/null @@ -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! 🚀 - diff --git a/EMPLOYEES_COLLECTION_SETUP.md b/EMPLOYEES_COLLECTION_SETUP.md deleted file mode 100644 index ac4495e..0000000 --- a/EMPLOYEES_COLLECTION_SETUP.md +++ /dev/null @@ -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 - diff --git a/EMPLOYEE_WORKFLOW_TEST.md b/EMPLOYEE_WORKFLOW_TEST.md deleted file mode 100644 index fd44a02..0000000 --- a/EMPLOYEE_WORKFLOW_TEST.md +++ /dev/null @@ -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 - diff --git a/IMPLEMENTATION_SUMMARY.md b/IMPLEMENTATION_SUMMARY.md deleted file mode 100644 index 69b0c97..0000000 --- a/IMPLEMENTATION_SUMMARY.md +++ /dev/null @@ -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 - -``` - -### 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 - diff --git a/LOGIN_TROUBLESHOOTING.md b/LOGIN_TROUBLESHOOTING.md deleted file mode 100644 index da470a1..0000000 --- a/LOGIN_TROUBLESHOOTING.md +++ /dev/null @@ -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! 🚀 - diff --git a/PERMISSIONS_FIX.md b/PERMISSIONS_FIX.md deleted file mode 100644 index 858a6f6..0000000 --- a/PERMISSIONS_FIX.md +++ /dev/null @@ -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! 🚀 - diff --git a/PROJECT_ID_FIX.md b/PROJECT_ID_FIX.md deleted file mode 100644 index 80c1dd8..0000000 --- a/PROJECT_ID_FIX.md +++ /dev/null @@ -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! 🚀 - diff --git a/README.md b/README.md index d80fb1c..5c37060 100644 --- a/README.md +++ b/README.md @@ -1,49 +1,40 @@ -# WOMS 2.0 - Work Order Management System +# WOMS – Ticketsystem von WEBklar -React-basiertes Ticket-Management-System mit Appwrite Backend. +Internes Ticketsystem unter https://ticket.webklar.com: Tickets, Arbeitsblätter mit +Zeiterfassung, Kunden und Leads, Website-Projekte, Planboard und Rechnungen. +React/Vite im Browser, Daten in Appwrite (Projekt `6a1058610003c5a13a05`, +Datenbank `woms-database`, API unter `https://ticket.webklar.com/v1`). -## 🚀 Schnellstart +## Entwickeln und live stellen -### 1. Dependencies installieren -```bash -npm install -``` +- Lokal starten: siehe [LOCAL_DEV.md](./LOCAL_DEV.md) (Vite-Proxy + `.env.local`). +- Live ist der Branch `test` im Gitea-Repo `JUSN/tickte-system`. Ein Push löst + auf dem Server Build und Deploy aus. +- Achtung: Der Webhook baut **jeden** gepushten Branch und stellt ihn live. + Feature-Branches deshalb nicht pushen; live geht es mit + `git push origin :test`. -### 2. Appwrite einrichten +## Datenmodell (Kurzfassung) -**Wichtig:** Für eine detaillierte Schritt-für-Schritt-Anleitung siehe [APPWRITE_SETUP.md](./APPWRITE_SETUP.md) +Datum speichert WOMS als Text `dd.mm.yyyy`, Uhrzeiten als `hhmm` (z. B. `0930`). -Kurzfassung: -1. Erstelle ein Appwrite-Projekt auf [cloud.appwrite.io](https://cloud.appwrite.io) -2. Erstelle eine `.env` Datei im Root-Verzeichnis: -```env -VITE_APPWRITE_ENDPOINT=https://cloud.appwrite.io/v1 -VITE_APPWRITE_PROJECT_ID=deine-project-id-hier -VITE_APPWRITE_DATABASE_ID=woms-database -``` -3. Folge der detaillierten Anleitung in `APPWRITE_SETUP.md` um die Datenbank-Struktur zu erstellen +| Collection | Inhalt | Wichtige Felder | +|---|---|---| +| `workorders` | Tickets | `woid` (fortlaufend ab 10000), `topic`, `details`, `status`, `priority`, `type` (Webpage, Migration, Project, Akquise), `serviceType`, `customerId`/`customerName`, `assignedTo`/`assignedName`, `requestedBy`, `startDate`/`startTime`/`endTime`, `deadline` | +| `worksheets` | Arbeitsblätter | `wsid` (fortlaufend ab 100000), `woid` + `workorderId`, `employeeId`/`employeeName`, `serviceType`, `oldStatus`/`newStatus`, `totalTime` (Minuten), `startDate`/`startTime`/`endDate`/`endTime`, `details`, `isComment`, `countsToPlan` (Abo-Stunden) | +| `customers` | Kunden und Leads | `code` (Kundennummer), `name`/`companyName`, `customerStatus` (z. B. lead, customer, lost), `archived`, Rechnungsadresse, `invoiceNinjaClientId`, Portal-Zugang | +| `employees` | Mitarbeiter | `userId` (Appwrite-Benutzer), `displayName`, `email`, `shortcode` (Kürzel) | +| `websiteProjects` | Website-Projekte und Vorschauen | `customerId` (steuert, was der Kunde im Portal sieht), `ticketId` (Ziel der Git-Push-Arbeitsblätter), Subdomain, Repo | +| `leads`, `leadPipeline`, `leadSettings` | Lead-Automatik | Recherche-Ergebnisse, Pipeline-Schritte, Sucheinstellungen | +| `roadmaps`, `roadmapNodes` | Projektpläne | Plan mit Schritten, verknüpft mit einem Ticket | +| `config` | Einstellungen | Prioritäten (dazu alte Listen, die nichts mehr liest) | -### 3. App starten -```bash -npm run dev -``` +Zusammenspiel mit anderen Systemen: -Die App läuft dann auf `http://localhost:5173` - -## 📚 Dokumentation - -- **[APPWRITE_SETUP.md](./APPWRITE_SETUP.md)** - Detaillierte Anleitung zur Appwrite-Einrichtung - - Schritt-für-Schritt Setup - - Datenbank-Schema - - Berechtigungen - - Fehlerbehebung - -## Features - -- Ticket-Erstellung und -Verwaltung -- Status-Tracking (Open, Occupied, Assigned, Awaiting, Closed) -- Prioritäts-Management (Low, Normal, High, Critical) -- Filter und Suche -- Datei-Uploads -- Dashboard mit Statistiken -- Planboard für Terminplanung +- **Kundenportal** (project.webklar.com): legt bei jedem Git-Push ein Arbeitsblatt an + (`employeeId` `gitea`, `serviceType` `GIT`, ohne Beginn). Die Zeit wird in WOMS + nachgetragen, danach zählt sie als Arbeitszeit. Termine aus der Rechnungsanalyse + landen am Akquise-Ticket des Kunden und erscheinen im Planboard. Kunden-, Mitarbeiter- + und Projektverwaltung laufen über die Admin-API des Portals. +- **ticket-integrations** (`/api/integrations`): Proxy zu InvoiceNinja (Rechnungen) + und Paperless (Dokumente). diff --git a/WOID_ATTRIBUTE_SETUP.md b/WOID_ATTRIBUTE_SETUP.md deleted file mode 100644 index a8c3107..0000000 --- a/WOID_ATTRIBUTE_SETUP.md +++ /dev/null @@ -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 -
{ticket.woid || ticket.$id?.slice(-5)}
-``` - -## 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 - diff --git a/WORKORDER_ATTRIBUTES_FIX.md b/WORKORDER_ATTRIBUTES_FIX.md deleted file mode 100644 index 4b415d8..0000000 --- a/WORKORDER_ATTRIBUTES_FIX.md +++ /dev/null @@ -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! 🚀 - diff --git a/WORKSHEETS_COLLECTION_SETUP.md b/WORKSHEETS_COLLECTION_SETUP.md deleted file mode 100644 index 20c0084..0000000 --- a/WORKSHEETS_COLLECTION_SETUP.md +++ /dev/null @@ -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 - diff --git a/WSID_ATTRIBUTE_SETUP.md b/WSID_ATTRIBUTE_SETUP.md deleted file mode 100644 index 7547941..0000000 --- a/WSID_ATTRIBUTE_SETUP.md +++ /dev/null @@ -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 - diff --git a/WSID_IMPLEMENTATION_SUMMARY.md b/WSID_IMPLEMENTATION_SUMMARY.md deleted file mode 100644 index 8fd0407..0000000 --- a/WSID_IMPLEMENTATION_SUMMARY.md +++ /dev/null @@ -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. - diff --git a/WSID_QUICKSTART.md b/WSID_QUICKSTART.md deleted file mode 100644 index 52ca41d..0000000 --- a/WSID_QUICKSTART.md +++ /dev/null @@ -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. - diff --git a/src/hooks/useWorksheets.js b/src/hooks/useWorksheets.js index 87fee32..b9969fd 100644 --- a/src/hooks/useWorksheets.js +++ b/src/hooks/useWorksheets.js @@ -41,7 +41,7 @@ export function useWorksheets(woid = null) { if (err.code === 401 || errorMessage.includes('not authorized')) { errorMessage = 'Berechtigung fehlt: Bitte überprüfe die Read-Berechtigungen der Worksheets Collection.' } else if (errorMessage.includes('Collection') && errorMessage.includes('not found')) { - errorMessage = 'Worksheets Collection nicht gefunden. Bitte erstelle die Collection in Appwrite (siehe WORKSHEETS_COLLECTION_SETUP.md).' + errorMessage = 'Worksheets Collection nicht gefunden. Bitte die Collection in Appwrite prüfen (Datenmodell siehe README.md).' } setError(errorMessage)