From 0e539710c0d9cb268e4a1526dc8b80a5e69d591c Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Tue, 2 Jun 2026 15:28:38 +0200 Subject: [PATCH] feat: Add password reset functionality with request and reset forms feat: Implement price list import feature with preview and apply options feat: Create price rules management page with CRUD operations feat: Develop quotes management page with itemized quotes and status tracking feat: Introduce organization registration page for new users feat: Build suppliers management page with detailed supplier information feat: Create users management page for inviting and managing roles chore: Add TypeScript configuration for improved type checking chore: Set up Vite configuration for development server and API proxy chore: Add Vite environment type definitions for better TypeScript support --- .env.example | 7 + .gitignore | 5 + BETRIEB.md | 97 + Cargo.lock | 6042 +++++++++++++++ Cargo.toml | 12 + FENSTERKONZEPT.md | 58 + IMPLEMENTIERUNGSPLAN.md | 181 + INSTALL.md | 395 + PLANUNG.md | 2334 ++++++ README.md | 76 + backend/Cargo.toml | 25 + backend/Dockerfile | 13 + .../company-migrations/0001_company_base.sql | 80 + .../0002_activity_price_invoice_rules.sql | 360 + .../0003_customer_details.sql | 45 + .../0004_item_price_history.sql | 22 + .../0005_numbered_activities.sql | 9 + .../0006_update_number_range_prefixes.sql | 22 + backend/company-migrations/0007_quotes.sql | 82 + .../company-migrations/0008_invoice_links.sql | 19 + .../company-migrations/0009_price_imports.sql | 71 + .../0010_communications_documents.sql | 153 + .../company-migrations/0011_user_settings.sql | 9 + .../0012_item_supplier_prices.sql | 28 + .../migrations/20260521170000_public_core.sql | 94 + .../20260521171000_public_auth_sessions.sql | 68 + .../20260521172000_public_onboarding.sql | 61 + ...60521173000_communication_test_records.sql | 9 + .../20260521174000_registration_terms.sql | 2 + .../20260601190000_security_operations.sql | 23 + backend/src/api.rs | 6903 +++++++++++++++++ backend/src/crypto_at_rest.rs | 54 + backend/src/main.rs | 472 ++ backend/src/models.rs | 210 + deploy/nginx-companytool.conf | 32 + desktop-client/Cargo.toml | 20 + desktop-client/companytool-client.toml | 3 + desktop-client/src/main.rs | 6792 ++++++++++++++++ docker-compose.yml | 33 + images/icons/companytool-logo.png | Bin 0 -> 63147 bytes images/icons/logo.png | Bin 0 -> 1149079 bytes scripts/api-onboarding-test.mjs | 495 ++ scripts/communication-test.mjs | 258 + scripts/dev-seed.mjs | 130 + scripts/schema-migration-test.mjs | 92 + scripts/standard-check.sh | 26 + scripts/ws-smoke-test.mjs | 139 + shared-protocol/Cargo.toml | 14 + shared-protocol/src/lib.rs | 202 + test-zugang | 6 + web-frontend/index.html | 13 + web-frontend/package-lock.json | 1463 ++++ web-frontend/package.json | 21 + web-frontend/public/companytool-logo.png | Bin 0 -> 63147 bytes web-frontend/src/App.vue | 399 + web-frontend/src/api.ts | 51 + web-frontend/src/auth.ts | 44 + web-frontend/src/components/FormStatus.vue | 10 + web-frontend/src/components/PageHeader.vue | 15 + web-frontend/src/components/SearchSelect.vue | 75 + web-frontend/src/main.ts | 6 + web-frontend/src/number-ranges.ts | 17 + web-frontend/src/realtime.ts | 179 + web-frontend/src/router.ts | 105 + web-frontend/src/styles.css | 788 ++ web-frontend/src/types.ts | 348 + web-frontend/src/user-settings.ts | 32 + web-frontend/src/utils.ts | 4 + .../src/views/AcceptInvitationPage.vue | 32 + web-frontend/src/views/ActivitiesPage.vue | 39 + .../src/views/AdminRegistrationDetailPage.vue | 64 + .../src/views/AdminRegistrationsPage.vue | 56 + web-frontend/src/views/ApiConnectorsPage.vue | 31 + .../src/views/CashDiscountTermsPage.vue | 107 + .../src/views/ChangeInitialPasswordPage.vue | 69 + web-frontend/src/views/CommunicationsPage.vue | 112 + web-frontend/src/views/CustomersPage.vue | 171 + web-frontend/src/views/DashboardPage.vue | 32 + web-frontend/src/views/DocumentsPage.vue | 147 + .../src/views/IncomingInvoicesPage.vue | 38 + web-frontend/src/views/ItemsPage.vue | 67 + web-frontend/src/views/LoginPage.vue | 122 + web-frontend/src/views/NumberRangesPage.vue | 91 + .../src/views/OrganizationSetupPage.vue | 115 + .../src/views/OutgoingInvoicesPage.vue | 82 + web-frontend/src/views/PasswordResetPage.vue | 44 + web-frontend/src/views/PriceImportsPage.vue | 51 + web-frontend/src/views/PriceRulesPage.vue | 98 + web-frontend/src/views/QuotesPage.vue | 133 + web-frontend/src/views/RegisterPage.vue | 52 + web-frontend/src/views/SuppliersPage.vue | 98 + web-frontend/src/views/UsersPage.vue | 134 + web-frontend/src/vite-env.d.ts | 2 + web-frontend/tsconfig.json | 17 + web-frontend/vite.config.ts | 25 + 95 files changed, 31882 insertions(+) create mode 100644 .env.example create mode 100644 .gitignore create mode 100644 BETRIEB.md create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 FENSTERKONZEPT.md create mode 100644 IMPLEMENTIERUNGSPLAN.md create mode 100644 INSTALL.md create mode 100644 PLANUNG.md create mode 100644 README.md create mode 100644 backend/Cargo.toml create mode 100644 backend/Dockerfile create mode 100644 backend/company-migrations/0001_company_base.sql create mode 100644 backend/company-migrations/0002_activity_price_invoice_rules.sql create mode 100644 backend/company-migrations/0003_customer_details.sql create mode 100644 backend/company-migrations/0004_item_price_history.sql create mode 100644 backend/company-migrations/0005_numbered_activities.sql create mode 100644 backend/company-migrations/0006_update_number_range_prefixes.sql create mode 100644 backend/company-migrations/0007_quotes.sql create mode 100644 backend/company-migrations/0008_invoice_links.sql create mode 100644 backend/company-migrations/0009_price_imports.sql create mode 100644 backend/company-migrations/0010_communications_documents.sql create mode 100644 backend/company-migrations/0011_user_settings.sql create mode 100644 backend/company-migrations/0012_item_supplier_prices.sql create mode 100644 backend/migrations/20260521170000_public_core.sql create mode 100644 backend/migrations/20260521171000_public_auth_sessions.sql create mode 100644 backend/migrations/20260521172000_public_onboarding.sql create mode 100644 backend/migrations/20260521173000_communication_test_records.sql create mode 100644 backend/migrations/20260521174000_registration_terms.sql create mode 100644 backend/migrations/20260601190000_security_operations.sql create mode 100644 backend/src/api.rs create mode 100644 backend/src/crypto_at_rest.rs create mode 100644 backend/src/main.rs create mode 100644 backend/src/models.rs create mode 100644 deploy/nginx-companytool.conf create mode 100644 desktop-client/Cargo.toml create mode 100644 desktop-client/companytool-client.toml create mode 100644 desktop-client/src/main.rs create mode 100644 docker-compose.yml create mode 100644 images/icons/companytool-logo.png create mode 100644 images/icons/logo.png create mode 100644 scripts/api-onboarding-test.mjs create mode 100644 scripts/communication-test.mjs create mode 100644 scripts/dev-seed.mjs create mode 100644 scripts/schema-migration-test.mjs create mode 100644 scripts/standard-check.sh create mode 100644 scripts/ws-smoke-test.mjs create mode 100644 shared-protocol/Cargo.toml create mode 100644 shared-protocol/src/lib.rs create mode 100644 test-zugang create mode 100644 web-frontend/index.html create mode 100644 web-frontend/package-lock.json create mode 100644 web-frontend/package.json create mode 100644 web-frontend/public/companytool-logo.png create mode 100644 web-frontend/src/App.vue create mode 100644 web-frontend/src/api.ts create mode 100644 web-frontend/src/auth.ts create mode 100644 web-frontend/src/components/FormStatus.vue create mode 100644 web-frontend/src/components/PageHeader.vue create mode 100644 web-frontend/src/components/SearchSelect.vue create mode 100644 web-frontend/src/main.ts create mode 100644 web-frontend/src/number-ranges.ts create mode 100644 web-frontend/src/realtime.ts create mode 100644 web-frontend/src/router.ts create mode 100644 web-frontend/src/styles.css create mode 100644 web-frontend/src/types.ts create mode 100644 web-frontend/src/user-settings.ts create mode 100644 web-frontend/src/utils.ts create mode 100644 web-frontend/src/views/AcceptInvitationPage.vue create mode 100644 web-frontend/src/views/ActivitiesPage.vue create mode 100644 web-frontend/src/views/AdminRegistrationDetailPage.vue create mode 100644 web-frontend/src/views/AdminRegistrationsPage.vue create mode 100644 web-frontend/src/views/ApiConnectorsPage.vue create mode 100644 web-frontend/src/views/CashDiscountTermsPage.vue create mode 100644 web-frontend/src/views/ChangeInitialPasswordPage.vue create mode 100644 web-frontend/src/views/CommunicationsPage.vue create mode 100644 web-frontend/src/views/CustomersPage.vue create mode 100644 web-frontend/src/views/DashboardPage.vue create mode 100644 web-frontend/src/views/DocumentsPage.vue create mode 100644 web-frontend/src/views/IncomingInvoicesPage.vue create mode 100644 web-frontend/src/views/ItemsPage.vue create mode 100644 web-frontend/src/views/LoginPage.vue create mode 100644 web-frontend/src/views/NumberRangesPage.vue create mode 100644 web-frontend/src/views/OrganizationSetupPage.vue create mode 100644 web-frontend/src/views/OutgoingInvoicesPage.vue create mode 100644 web-frontend/src/views/PasswordResetPage.vue create mode 100644 web-frontend/src/views/PriceImportsPage.vue create mode 100644 web-frontend/src/views/PriceRulesPage.vue create mode 100644 web-frontend/src/views/QuotesPage.vue create mode 100644 web-frontend/src/views/RegisterPage.vue create mode 100644 web-frontend/src/views/SuppliersPage.vue create mode 100644 web-frontend/src/views/UsersPage.vue create mode 100644 web-frontend/src/vite-env.d.ts create mode 100644 web-frontend/tsconfig.json create mode 100644 web-frontend/vite.config.ts diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..cc0bf05 --- /dev/null +++ b/.env.example @@ -0,0 +1,7 @@ +DATABASE_URL=postgres://companytool:companytool@localhost:5432/companytool +BACKEND_BIND=127.0.0.1:8080 +VITE_WS_URL=ws://localhost:8080/ws +COMPANYTOOL_DATA_KEY_ID=dev-data-key-v1 +COMPANYTOOL_DATA_KEY_BASE64=BwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwc= +COMPANYTOOL_EMAIL_TRANSPORT=outbox +COMPANYTOOL_DOCUMENT_STORAGE_DIR=storage/documents diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7ecdc26 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +/target/ +/web-frontend/node_modules/ +/web-frontend/dist/ +.env + diff --git a/BETRIEB.md b/BETRIEB.md new file mode 100644 index 0000000..94dcec4 --- /dev/null +++ b/BETRIEB.md @@ -0,0 +1,97 @@ +# Betrieb + +## Authentifizierung + +- Passwörter werden mit Argon2id gehasht. +- Initialpasswörter erzwingen `must_change_password`. +- Passwort-Reset erfolgt über kurzlebige Tokens aus `password_reset_tokens`. +- Firmen-Einladungen verwenden Tokens aus `user_invitations.token_hash`. +- Nach Passwort-Reset werden bestehende Sessions widerrufen. + +## E-Mail + +E-Mail-Inhalte werden in `email_outbox` verschlüsselt gespeichert. Im +Entwicklungsmodus werden Tokens zusätzlich in API-Antworten ausgegeben. Im +Produktivbetrieb werden keine Passwörter oder Tokens in API-Antworten geliefert. + +Transportmodi: + +- `COMPANYTOOL_EMAIL_TRANSPORT=outbox`: nur verschlüsselte Ablage in PostgreSQL. +- `COMPANYTOOL_EMAIL_TRANSPORT=file`: zusätzliche Zustellung als JSON-Datei in + `COMPANYTOOL_EMAIL_FILE_DIR`. + +SMTP kann später als weiterer Transport hinter demselben Outbox-Modell ergänzt +werden. + +## Verschlüsselungsschlüssel + +Produktiv müssen gesetzt sein: + +```env +COMPANYTOOL_DATA_KEY_ID=prod-data-key-v1 +COMPANYTOOL_DATA_KEY_BASE64=<32-byte-key-base64> +``` + +Der Key muss außerhalb der Datenbank gesichert werden. Ohne diesen Key können +verschlüsselte Firmen-, Dokument- und Kommunikationsdaten nicht wiederhergestellt +werden. + +Key-Rotation ist vorbereitet über `*_key_id`-Spalten. Ablauf: + +1. neuen Key als `COMPANYTOOL_DATA_KEY_ID` bereitstellen +2. neue Schreibvorgänge mit neuem Key speichern +3. Re-Encryption-Job für alte Datensätze implementieren und ausführen +4. alten Key erst nach verifiziertem Backup entfernen + +## Backup und Restore + +PostgreSQL: + +```bash +pg_dump --format=custom --file=companytool.dump "$DATABASE_URL" +pg_restore --clean --if-exists --dbname "$DATABASE_URL" companytool.dump +``` + +Dokumente: + +```bash +tar -C storage -czf companytool-documents.tar.gz documents +tar -C storage -xzf companytool-documents.tar.gz +``` + +Für einzelne Firmen müssen das jeweilige `company_*`-Schema und der passende +Ordner unter `storage/documents/` gemeinsam gesichert werden. + +## Docker + +Nur PostgreSQL: + +```bash +docker compose up -d postgres +``` + +PostgreSQL und Backend: + +```bash +docker compose --profile backend up -d +``` + +## TLS und Reverse Proxy + +Das Backend bleibt intern auf HTTP/WSS hinter einem Reverse Proxy. Öffentlich +muss ausschließlich HTTPS/WSS erreichbar sein. Ein nginx-Beispiel liegt unter: + +```text +deploy/nginx-companytool.conf +``` + +## Lokale Einzelkunden-Installation + +Für lokale Installationen bleibt `dev_bootstrap-local` als Entwicklungs- und +Installationshelfer vorgesehen. Ein späteres Installationsprogramm soll: + +- PostgreSQL-Verbindung prüfen +- lokale Firma anlegen +- ersten Besitzer anlegen +- Backend- und Client-Konfiguration schreiben +- Dokumentenordner und Schlüsseldatei vorbereiten diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..f18cab2 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,6042 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "ab_glyph" +version = "0.2.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01c0457472c38ea5bd1c3b5ada5e368271cb550be7a4ca4a0b4634e9913f6cc2" +dependencies = [ + "ab_glyph_rasterizer", + "owned_ttf_parser", +] + +[[package]] +name = "ab_glyph_rasterizer" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "366ffbaa4442f4684d91e2cd7c5ea7c4ed8add41959a31447066e279e432b618" + +[[package]] +name = "accesskit" +version = "0.16.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99b76d84ee70e30a4a7e39ab9018e2b17a6a09e31084176cc7c0b2dec036ba45" + +[[package]] +name = "accesskit_atspi_common" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5393c75d4666f580f4cac0a968bc97c36076bb536a129f28210dac54ee127ed" +dependencies = [ + "accesskit", + "accesskit_consumer", + "atspi-common", + "serde", + "thiserror 1.0.69", + "zvariant", +] + +[[package]] +name = "accesskit_consumer" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a12dc159d52233c43d9fe5415969433cbdd52c3d6e0df51bda7d447427b9986" +dependencies = [ + "accesskit", + "immutable-chunkmap", +] + +[[package]] +name = "accesskit_macos" +version = "0.17.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfc6c1ecd82053d127961ad80a8beaa6004fb851a3a5b96506d7a6bd462403f6" +dependencies = [ + "accesskit", + "accesskit_consumer", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", + "once_cell", +] + +[[package]] +name = "accesskit_unix" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be7f5cf6165be10a54b2655fa2e0e12b2509f38ed6fc43e11c31fdb7ee6230bb" +dependencies = [ + "accesskit", + "accesskit_atspi_common", + "async-channel", + "async-executor", + "async-task", + "atspi", + "futures-lite", + "futures-util", + "serde", + "zbus", +] + +[[package]] +name = "accesskit_windows" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "974e96c347384d9133427167fb8a58c340cb0496988dacceebdc1ed27071023b" +dependencies = [ + "accesskit", + "accesskit_consumer", + "paste", + "static_assertions", + "windows 0.58.0", + "windows-core 0.58.0", +] + +[[package]] +name = "accesskit_winit" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aea3522719f1c44564d03e9469a8e2f3a98b3a8a880bd66d0789c6b9c4a669dd" +dependencies = [ + "accesskit", + "accesskit_macos", + "accesskit_unix", + "accesskit_windows", + "raw-window-handle", + "winit", +] + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "aead" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" +dependencies = [ + "crypto-common", + "generic-array", +] + +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "aes-gcm" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1" +dependencies = [ + "aead", + "aes", + "cipher", + "ctr", + "ghash", + "subtle", +] + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "getrandom 0.3.4", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "android-activity" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f2a1bb052857d5dd49572219344a7332b31b76405648eabac5bc68978251bcd" +dependencies = [ + "android-properties", + "bitflags 2.11.1", + "cc", + "jni", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys 0.6.0+11769913", + "num_enum", + "thiserror 2.0.18", +] + +[[package]] +name = "android-properties" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anyhow" +version = "1.0.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" + +[[package]] +name = "arboard" +version = "3.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0348a1c054491f4bfe6ab86a7b6ab1e44e45d899005de92f58b3df180b36ddaf" +dependencies = [ + "clipboard-win", + "log", + "objc2 0.6.4", + "objc2-app-kit 0.3.2", + "objc2-foundation 0.3.2", + "parking_lot", + "percent-encoding", + "windows-sys 0.60.2", + "x11rb", +] + +[[package]] +name = "argon2" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c3610892ee6e0cbce8ae2700349fcf8f98adb0dbfbee85aec3c9179d29cc072" +dependencies = [ + "base64ct", + "blake2", + "cpufeatures", + "password-hash", +] + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "as-raw-xcb-connection" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" + +[[package]] +name = "ash" +version = "0.38.0+1.3.281" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb44936d800fea8f016d7f2311c6a4f97aebd5dc86f09906139ec848cf3a46f" +dependencies = [ + "libloading", +] + +[[package]] +name = "async-broadcast" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" +dependencies = [ + "event-listener", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-channel" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "pin-project-lite", + "slab", +] + +[[package]] +name = "async-fs" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8034a681df4aed8b8edbd7fbe472401ecf009251c8b40556b304567052e294c5" +dependencies = [ + "async-lock", + "blocking", + "futures-lite", +] + +[[package]] +name = "async-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" +dependencies = [ + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix 1.1.4", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-lock" +version = "3.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" +dependencies = [ + "event-listener", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-process" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" +dependencies = [ + "async-channel", + "async-io", + "async-lock", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener", + "futures-lite", + "rustix 1.1.4", +] + +[[package]] +name = "async-recursion" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "async-signal" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52b5aaafa020cf5053a01f2a60e8ff5dccf550f0f77ec54a4e47285ac2bab485" +dependencies = [ + "async-io", + "async-lock", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix 1.1.4", + "signal-hook-registry", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + +[[package]] +name = "async-trait" +version = "0.1.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "atoi" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" +dependencies = [ + "num-traits", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "atspi" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be534b16650e35237bb1ed189ba2aab86ce65e88cc84c66f4935ba38575cecbf" +dependencies = [ + "atspi-common", + "atspi-connection", + "atspi-proxies", +] + +[[package]] +name = "atspi-common" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1909ed2dc01d0a17505d89311d192518507e8a056a48148e3598fef5e7bb6ba7" +dependencies = [ + "enumflags2", + "serde", + "static_assertions", + "zbus", + "zbus-lockstep", + "zbus-lockstep-macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "atspi-connection" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "430c5960624a4baaa511c9c0fcc2218e3b58f5dbcc47e6190cafee344b873333" +dependencies = [ + "atspi-common", + "atspi-proxies", + "futures-lite", + "zbus", +] + +[[package]] +name = "atspi-proxies" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e6c5de3e524cf967569722446bcd458d5032348554d9a17d7d72b041ab7496" +dependencies = [ + "atspi-common", + "serde", + "zbus", + "zvariant", +] + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "axum" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" +dependencies = [ + "async-trait", + "axum-core", + "base64", + "bytes", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sha1", + "sync_wrapper", + "tokio", + "tokio-tungstenite", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "axum-core" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http", + "http-body", + "http-body-util", + "mime", + "pin-project-lite", + "rustversion", + "sync_wrapper", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64ct" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" + +[[package]] +name = "bit-set" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0481a0e032742109b1133a095184ee93d88f3dc9e0d28a5d033dc77a073f44f" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2c54ff287cfc0a34f38a6b832ea1bd8e448a330b3e40a50859e6488bee07f22" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" +dependencies = [ + "serde_core", +] + +[[package]] +name = "blake2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" +dependencies = [ + "digest", +] + +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block2" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" +dependencies = [ + "objc2 0.5.2", +] + +[[package]] +name = "blocking" +version = "1.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" +dependencies = [ + "async-channel", + "async-task", + "futures-io", + "futures-lite", + "piper", +] + +[[package]] +name = "bumpalo" +version = "3.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" + +[[package]] +name = "bytemuck" +version = "1.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "byteorder-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" + +[[package]] +name = "bytes" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" + +[[package]] +name = "calloop" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" +dependencies = [ + "bitflags 2.11.1", + "log", + "polling", + "rustix 0.38.44", + "slab", + "thiserror 1.0.69", +] + +[[package]] +name = "calloop" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dbf9978365bac10f54d1d4b04f7ce4427e51f71d61f2fe15e3fed5166474df7" +dependencies = [ + "bitflags 2.11.1", + "polling", + "rustix 1.1.4", + "slab", + "tracing", +] + +[[package]] +name = "calloop-wayland-source" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95a66a987056935f7efce4ab5668920b5d0dac4a7c99991a67395f13702ddd20" +dependencies = [ + "calloop 0.13.0", + "rustix 0.38.44", + "wayland-backend", + "wayland-client", +] + +[[package]] +name = "calloop-wayland-source" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "138efcf0940a02ebf0cc8d1eff41a1682a46b431630f4c52450d6265876021fa" +dependencies = [ + "calloop 0.14.4", + "rustix 1.1.4", + "wayland-backend", + "wayland-client", +] + +[[package]] +name = "cc" +version = "1.2.62" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1dce859f0832a7d088c4f1119888ab94ef4b5d6795d1ce05afb7fe159d79f98" +dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "cfg_aliases" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "cgl" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ced0551234e87afee12411d535648dd89d2e7f34c78b753395567aff3d447ff" +dependencies = [ + "libc", +] + +[[package]] +name = "chrono" +version = "0.4.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" +dependencies = [ + "iana-time-zone", + "js-sys", + "num-traits", + "serde", + "wasm-bindgen", + "windows-link", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + +[[package]] +name = "clipboard-win" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bde03770d3df201d4fb868f2c9c59e66a3e4e2bd06692a0fe701e7103c7e84d4" +dependencies = [ + "error-code", +] + +[[package]] +name = "codespan-reporting" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" +dependencies = [ + "termcolor", + "unicode-width", +] + +[[package]] +name = "com" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e17887fd17353b65b1b2ef1c526c83e26cd72e74f598a8dc1bee13a48f3d9f6" +dependencies = [ + "com_macros", +] + +[[package]] +name = "com_macros" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d375883580a668c7481ea6631fc1a8863e33cc335bf56bfad8d7e6d4b04b13a5" +dependencies = [ + "com_macros_support", + "proc-macro2", + "syn 1.0.109", +] + +[[package]] +name = "com_macros_support" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad899a1087a9296d5644792d7cb72b8e34c1bec8e7d4fbc002230169a6e8710c" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "companytool-backend" +version = "0.1.0" +dependencies = [ + "anyhow", + "argon2", + "axum", + "base64", + "chrono", + "companytool-shared-protocol", + "dotenvy", + "futures-util", + "rand_core 0.6.4", + "serde", + "serde_json", + "sha2", + "sqlx", + "tokio", + "tower-http", + "tracing", + "tracing-subscriber", + "uuid", +] + +[[package]] +name = "companytool-desktop-client" +version = "0.1.0" +dependencies = [ + "anyhow", + "companytool-shared-protocol", + "eframe", + "egui", + "futures-util", + "image", + "reqwest", + "serde", + "serde_json", + "tokio", + "tokio-tungstenite", + "toml", + "url", +] + +[[package]] +name = "companytool-shared-protocol" +version = "0.1.0" +dependencies = [ + "aes-gcm", + "base64", + "chrono", + "rand_core 0.6.4", + "serde", + "serde_json", + "uuid", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core-graphics" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" +dependencies = [ + "bitflags 1.3.2", + "core-foundation 0.9.4", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" +dependencies = [ + "bitflags 1.3.2", + "core-foundation 0.9.4", + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "217698eaf96b4a3f0bc4f3662aaa55bdf913cd54d7204591faa790070c6d0853" + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-queue" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "typenum", +] + +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher", +] + +[[package]] +name = "cursor-icon" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730d5e1732f" + +[[package]] +name = "data-encoding" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8" + +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "dispatch2" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" +dependencies = [ + "bitflags 2.11.1", + "objc2 0.6.4", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "dlib" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab8ecd87370524b461f8557c119c405552c396ed91fc0a8eec68679eab26f94a" +dependencies = [ + "libloading", +] + +[[package]] +name = "document-features" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" +dependencies = [ + "litrs", +] + +[[package]] +name = "dotenvy" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" + +[[package]] +name = "downcast-rs" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + +[[package]] +name = "dpi" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" + +[[package]] +name = "ecolor" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "775cfde491852059e386c4e1deb4aef381c617dc364184c6f6afee99b87c402b" +dependencies = [ + "bytemuck", + "emath", +] + +[[package]] +name = "eframe" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ac2645a9bf4826eb4e91488b1f17b8eaddeef09396706b2f14066461338e24f" +dependencies = [ + "ahash", + "bytemuck", + "document-features", + "egui", + "egui-wgpu", + "egui-winit", + "egui_glow", + "glow 0.14.2", + "glutin", + "glutin-winit", + "image", + "js-sys", + "log", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", + "parking_lot", + "percent-encoding", + "raw-window-handle", + "static_assertions", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "web-time", + "winapi", + "windows-sys 0.52.0", + "winit", +] + +[[package]] +name = "egui" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53eafabcce0cb2325a59a98736efe0bf060585b437763f8c476957fb274bb974" +dependencies = [ + "accesskit", + "ahash", + "emath", + "epaint", + "log", + "nohash-hasher", +] + +[[package]] +name = "egui-wgpu" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d00fd5d06d8405397e64a928fa0ef3934b3c30273ea7603e3dc4627b1f7a1a82" +dependencies = [ + "ahash", + "bytemuck", + "document-features", + "egui", + "epaint", + "log", + "thiserror 1.0.69", + "type-map", + "web-time", + "wgpu", + "winit", +] + +[[package]] +name = "egui-winit" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a9c430f4f816340e8e8c1b20eec274186b1be6bc4c7dfc467ed50d57abc36c6" +dependencies = [ + "accesskit_winit", + "ahash", + "arboard", + "egui", + "log", + "raw-window-handle", + "smithay-clipboard", + "web-time", + "webbrowser", + "winit", +] + +[[package]] +name = "egui_glow" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e39bccc683cd43adab530d8f21a13eb91e80de10bcc38c3f1c16601b6f62b26" +dependencies = [ + "ahash", + "bytemuck", + "egui", + "glow 0.14.2", + "log", + "memoffset", + "wasm-bindgen", + "web-sys", + "winit", +] + +[[package]] +name = "either" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" +dependencies = [ + "serde", +] + +[[package]] +name = "emath" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1fe0049ce51d0fb414d029e668dd72eb30bc2b739bf34296ed97bd33df544f3" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "endi" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099" + +[[package]] +name = "enumflags2" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" +dependencies = [ + "enumflags2_derive", + "serde", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "epaint" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a32af8da821bd4f43f2c137e295459ee2e1661d87ca8779dfa0eaf45d870e20f" +dependencies = [ + "ab_glyph", + "ahash", + "bytemuck", + "ecolor", + "emath", + "epaint_default_fonts", + "log", + "nohash-hasher", + "parking_lot", +] + +[[package]] +name = "epaint_default_fonts" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "483440db0b7993cf77a20314f08311dbe95675092405518c0677aa08c151a3ea" + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "error-code" +version = "3.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dea2df4cf52843e0452895c455a1a2cfbb842a1e7329671acf418fdc53ed4c59" + +[[package]] +name = "etcetera" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" +dependencies = [ + "cfg-if", + "home", + "windows-sys 0.48.0", +] + +[[package]] +name = "event-listener" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener", + "pin-project-lite", +] + +[[package]] +name = "fastrand" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" + +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[package]] +name = "flate2" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "flume" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" +dependencies = [ + "futures-core", + "futures-sink", + "spin", +] + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures-channel" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" + +[[package]] +name = "futures-executor" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-intrusive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" +dependencies = [ + "futures-core", + "lock_api", + "parking_lot", +] + +[[package]] +name = "futures-io" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" + +[[package]] +name = "futures-lite" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[package]] +name = "futures-macro" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "futures-sink" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" + +[[package]] +name = "futures-task" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" + +[[package]] +name = "futures-util" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +dependencies = [ + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "gethostname" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8" +dependencies = [ + "rustix 1.1.4", + "windows-link", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi 5.3.0", + "wasip2", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" +dependencies = [ + "cfg-if", + "libc", + "r-efi 6.0.0", + "wasip2", + "wasip3", +] + +[[package]] +name = "ghash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" +dependencies = [ + "opaque-debug", + "polyval", +] + +[[package]] +name = "gl_generator" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" +dependencies = [ + "khronos_api", + "log", + "xml-rs", +] + +[[package]] +name = "glow" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd348e04c43b32574f2de31c8bb397d96c9fcfa1371bd4ca6d8bdc464ab121b1" +dependencies = [ + "js-sys", + "slotmap", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "glow" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d51fa363f025f5c111e03f13eda21162faeacb6911fe8caa0c0349f9cf0c4483" +dependencies = [ + "js-sys", + "slotmap", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "glutin" +version = "0.32.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12124de845cacfebedff80e877bb37b5b75c34c5a4c89e47e1cdd67fb6041325" +dependencies = [ + "bitflags 2.11.1", + "cfg_aliases 0.2.1", + "cgl", + "dispatch2", + "glutin_egl_sys", + "glutin_glx_sys", + "glutin_wgl_sys", + "libloading", + "objc2 0.6.4", + "objc2-app-kit 0.3.2", + "objc2-core-foundation", + "objc2-foundation 0.3.2", + "once_cell", + "raw-window-handle", + "wayland-sys", + "windows-sys 0.52.0", + "x11-dl", +] + +[[package]] +name = "glutin-winit" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85edca7075f8fc728f28cb8fbb111a96c3b89e930574369e3e9c27eb75d3788f" +dependencies = [ + "cfg_aliases 0.2.1", + "glutin", + "raw-window-handle", + "winit", +] + +[[package]] +name = "glutin_egl_sys" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c4680ba6195f424febdc3ba46e7a42a0e58743f2edb115297b86d7f8ecc02d2" +dependencies = [ + "gl_generator", + "windows-sys 0.52.0", +] + +[[package]] +name = "glutin_glx_sys" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7bb2938045a88b612499fbcba375a77198e01306f52272e692f8c1f3751185" +dependencies = [ + "gl_generator", + "x11-dl", +] + +[[package]] +name = "glutin_wgl_sys" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c4ee00b289aba7a9e5306d57c2d05499b2e5dc427f84ac708bd2c090212cf3e" +dependencies = [ + "gl_generator", +] + +[[package]] +name = "gpu-alloc" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" +dependencies = [ + "bitflags 2.11.1", + "gpu-alloc-types", +] + +[[package]] +name = "gpu-alloc-types" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" +dependencies = [ + "bitflags 2.11.1", +] + +[[package]] +name = "gpu-allocator" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdd4240fc91d3433d5e5b0fc5b67672d771850dc19bbee03c1381e19322803d7" +dependencies = [ + "log", + "presser", + "thiserror 1.0.69", + "winapi", + "windows 0.52.0", +] + +[[package]] +name = "gpu-descriptor" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b89c83349105e3732062a895becfc71a8f921bb71ecbbdd8ff99263e3b53a0ca" +dependencies = [ + "bitflags 2.11.1", + "gpu-descriptor-types", + "hashbrown 0.15.5", +] + +[[package]] +name = "gpu-descriptor-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" +dependencies = [ + "bitflags 2.11.1", +] + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "hashlink" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" +dependencies = [ + "hashbrown 0.15.5", +] + +[[package]] +name = "hassle-rs" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af2a7e73e1f34c48da31fb668a907f250794837e08faa144fd24f0b8b741e890" +dependencies = [ + "bitflags 2.11.1", + "com", + "libc", + "libloading", + "thiserror 1.0.69", + "widestring", + "winapi", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hexf-parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" + +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "home" +version = "0.5.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "http" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6299f016b246a94207e63da54dbe807655bf9e00044f73ded42c3ac5305fbcca" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" +dependencies = [ + "http", + "hyper", + "hyper-util", + "rustls", + "tokio", + "tokio-rustls", + "tower-service", + "webpki-roots 1.0.7", +] + +[[package]] +name = "hyper-util" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" +dependencies = [ + "base64", + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core 0.62.2", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "icu_collections" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" +dependencies = [ + "displaydoc", + "potential_utf", + "utf8_iter", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" + +[[package]] +name = "icu_properties" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" + +[[package]] +name = "icu_provider" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "image" +version = "0.25.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104" +dependencies = [ + "bytemuck", + "byteorder-lite", + "moxcms", + "num-traits", + "png", +] + +[[package]] +name = "immutable-chunkmap" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3e98b1520e49e252237edc238a39869da9f3241f2ec19dc788c1d24694d1e4" +dependencies = [ + "arrayvec", +] + +[[package]] +name = "indexmap" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +dependencies = [ + "equivalent", + "hashbrown 0.17.1", + "serde", + "serde_core", +] + +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "generic-array", +] + +[[package]] +name = "ipnet" +version = "2.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "jni" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5efd9a482cf3a427f00d6b35f14332adc7902ce91efb778580e180ff90fa3498" +dependencies = [ + "cfg-if", + "combine", + "jni-macros", + "jni-sys 0.4.1", + "log", + "simd_cesu8", + "thiserror 2.0.18", + "walkdir", + "windows-link", +] + +[[package]] +name = "jni-macros" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a00109accc170f0bdb141fed3e393c565b6f5e072365c3bd58f5b062591560a3" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "simd_cesu8", + "syn 2.0.117", +] + +[[package]] +name = "jni-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" +dependencies = [ + "jni-sys 0.4.1", +] + +[[package]] +name = "jni-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn 2.0.117", +] + +[[package]] +name = "jobserver" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +dependencies = [ + "getrandom 0.3.4", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67df7112613f8bfd9150013a0314e196f4800d3201ae742489d999db2f979f08" +dependencies = [ + "cfg-if", + "futures-util", + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "khronos-egl" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76" +dependencies = [ + "libc", + "libloading", + "pkg-config", +] + +[[package]] +name = "khronos_api" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin", +] + +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + +[[package]] +name = "libc" +version = "0.2.186" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" + +[[package]] +name = "libloading" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" +dependencies = [ + "cfg-if", + "windows-link", +] + +[[package]] +name = "libm" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" + +[[package]] +name = "libredox" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e02f3bb43d335493c96bf3fd3a321600bf6bd07ed34bc64118e9293bdffea46c" +dependencies = [ + "bitflags 2.11.1", + "libc", + "plain", + "redox_syscall 0.7.5", +] + +[[package]] +name = "libsqlite3-sys" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" +dependencies = [ + "pkg-config", + "vcpkg", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "litemap" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" + +[[package]] +name = "litrs" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" + +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "matchers" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" +dependencies = [ + "regex-automata", +] + +[[package]] +name = "matchit" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" + +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest", +] + +[[package]] +name = "memchr" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" + +[[package]] +name = "memmap2" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "714098028fe011992e1c3962653c96b2d578c4b4bce9036e15ff220319b1e0e3" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "metal" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ecfd3296f8c56b7c1f6fbac3c71cefa9d78ce009850c45000015f206dc7fa21" +dependencies = [ + "bitflags 2.11.1", + "block", + "core-graphics-types", + "foreign-types", + "log", + "objc", + "paste", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "moxcms" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb85c154ba489f01b25c0d36ae69a87e4a1c73a72631fc6c0eb6dde34a73e44b" +dependencies = [ + "num-traits", + "pxfm", +] + +[[package]] +name = "naga" +version = "22.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bd5a652b6faf21496f2cfd88fc49989c8db0825d1f6746b1a71a6ede24a63ad" +dependencies = [ + "arrayvec", + "bit-set", + "bitflags 2.11.1", + "cfg_aliases 0.1.1", + "codespan-reporting", + "hexf-parse", + "indexmap", + "log", + "rustc-hash 1.1.0", + "spirv", + "termcolor", + "thiserror 1.0.69", + "unicode-xid", +] + +[[package]] +name = "ndk" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" +dependencies = [ + "bitflags 2.11.1", + "jni-sys 0.3.1", + "log", + "ndk-sys 0.6.0+11769913", + "num_enum", + "raw-window-handle", + "thiserror 1.0.69", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.5.0+25.2.9519653" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691" +dependencies = [ + "jni-sys 0.3.1", +] + +[[package]] +name = "ndk-sys" +version = "0.6.0+11769913" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" +dependencies = [ + "jni-sys 0.3.1", +] + +[[package]] +name = "nix" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" +dependencies = [ + "bitflags 2.11.1", + "cfg-if", + "cfg_aliases 0.2.1", + "libc", + "memoffset", +] + +[[package]] +name = "nohash-hasher" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" + +[[package]] +name = "nu-ansi-term" +version = "0.50.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "num-bigint-dig" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7" +dependencies = [ + "lazy_static", + "libm", + "num-integer", + "num-iter", + "num-traits", + "rand 0.8.6", + "smallvec", + "zeroize", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_enum" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", +] + +[[package]] +name = "objc-sys" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" + +[[package]] +name = "objc2" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" +dependencies = [ + "objc-sys", + "objc2-encode", +] + +[[package]] +name = "objc2" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" +dependencies = [ + "objc2-encode", +] + +[[package]] +name = "objc2-app-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" +dependencies = [ + "bitflags 2.11.1", + "block2", + "libc", + "objc2 0.5.2", + "objc2-core-data", + "objc2-core-image", + "objc2-foundation 0.2.2", + "objc2-quartz-core", +] + +[[package]] +name = "objc2-app-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" +dependencies = [ + "bitflags 2.11.1", + "objc2 0.6.4", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation 0.3.2", +] + +[[package]] +name = "objc2-cloud-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" +dependencies = [ + "bitflags 2.11.1", + "block2", + "objc2 0.5.2", + "objc2-core-location", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-contacts" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889" +dependencies = [ + "block2", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-core-data" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" +dependencies = [ + "bitflags 2.11.1", + "block2", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +dependencies = [ + "bitflags 2.11.1", + "dispatch2", + "objc2 0.6.4", +] + +[[package]] +name = "objc2-core-graphics" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" +dependencies = [ + "bitflags 2.11.1", + "dispatch2", + "objc2 0.6.4", + "objc2-core-foundation", + "objc2-io-surface", +] + +[[package]] +name = "objc2-core-image" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" +dependencies = [ + "block2", + "objc2 0.5.2", + "objc2-foundation 0.2.2", + "objc2-metal", +] + +[[package]] +name = "objc2-core-location" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781" +dependencies = [ + "block2", + "objc2 0.5.2", + "objc2-contacts", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-foundation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" +dependencies = [ + "bitflags 2.11.1", + "block2", + "dispatch", + "libc", + "objc2 0.5.2", +] + +[[package]] +name = "objc2-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" +dependencies = [ + "bitflags 2.11.1", + "objc2 0.6.4", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-io-surface" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" +dependencies = [ + "bitflags 2.11.1", + "objc2 0.6.4", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-link-presentation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398" +dependencies = [ + "block2", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-metal" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" +dependencies = [ + "bitflags 2.11.1", + "block2", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" +dependencies = [ + "bitflags 2.11.1", + "block2", + "objc2 0.5.2", + "objc2-foundation 0.2.2", + "objc2-metal", +] + +[[package]] +name = "objc2-symbols" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc" +dependencies = [ + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" +dependencies = [ + "bitflags 2.11.1", + "block2", + "objc2 0.5.2", + "objc2-cloud-kit", + "objc2-core-data", + "objc2-core-image", + "objc2-core-location", + "objc2-foundation 0.2.2", + "objc2-link-presentation", + "objc2-quartz-core", + "objc2-symbols", + "objc2-uniform-type-identifiers", + "objc2-user-notifications", +] + +[[package]] +name = "objc2-uniform-type-identifiers" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be26273bfe" +dependencies = [ + "block2", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-user-notifications" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" +dependencies = [ + "bitflags 2.11.1", + "block2", + "objc2 0.5.2", + "objc2-core-location", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + +[[package]] +name = "orbclient" +version = "0.3.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a570f6bca41d29acb2139229a7c873ec99bc9a313bd10804081d89bfac8ff329" +dependencies = [ + "libc", + "libredox", +] + +[[package]] +name = "ordered-stream" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" +dependencies = [ + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "owned_ttf_parser" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36820e9051aca1014ddc75770aab4d68bc1e9e632f0f5627c4086bc216fb583b" +dependencies = [ + "ttf-parser", +] + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.5.18", + "smallvec", + "windows-link", +] + +[[package]] +name = "password-hash" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "346f04948ba92c43e8469c1ee6736c7563d71012b17d40745260fe106aac2166" +dependencies = [ + "base64ct", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "pin-project" +version = "1.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2466b2336ed02bcdca6b294417127b90ec92038d1d5c4fbeac971a922e0e0924" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c96395f0a926bc13b1c17622aaddda1ecb55d49c8f1bf9777e4d877800a43f8b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "piper" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] + +[[package]] +name = "pkcs1" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" +dependencies = [ + "der", + "pkcs8", + "spki", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "pkg-config" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" + +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" + +[[package]] +name = "png" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" +dependencies = [ + "bitflags 2.11.1", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "polling" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix 1.1.4", + "windows-sys 0.61.2", +] + +[[package]] +name = "polyval" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" +dependencies = [ + "cfg-if", + "cpufeatures", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "potential_utf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" +dependencies = [ + "zerovec", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "presser" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa" + +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn 2.0.117", +] + +[[package]] +name = "proc-macro-crate" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +dependencies = [ + "toml_edit 0.25.11+spec-1.1.0", +] + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "profiling" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d595e54a326bc53c1c197b32d295e14b169e3cfeaa8dc82b529f947fba6bcf5" + +[[package]] +name = "pxfm" +version = "0.1.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0c5ccf5294c6ccd63a74f1565028353830a9c2f5eb0c682c355c471726a6e3f" + +[[package]] +name = "quick-xml" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eff6510e86862b57b210fd8cbe8ed3f0d7d600b9c2863cd4549a2e033c66e956" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "quick-xml" +version = "0.39.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdcc8dd4e2f670d309a5f0e83fe36dfdc05af317008fea29144da1a2ac858e5e" +dependencies = [ + "memchr", +] + +[[package]] +name = "quinn" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" +dependencies = [ + "bytes", + "cfg_aliases 0.2.1", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash 2.1.2", + "rustls", + "socket2", + "thiserror 2.0.18", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "434b42fec591c96ef50e21e886936e66d3cc3f737104fdb9b737c40ffb94c098" +dependencies = [ + "bytes", + "getrandom 0.3.4", + "lru-slab", + "rand 0.9.4", + "ring", + "rustc-hash 2.1.2", + "rustls", + "rustls-pki-types", + "slab", + "thiserror 2.0.18", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" +dependencies = [ + "cfg_aliases 0.2.1", + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.60.2", +] + +[[package]] +name = "quote" +version = "1.0.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "rand" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.5", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.5", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.17", +] + +[[package]] +name = "rand_core" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" +dependencies = [ + "getrandom 0.3.4", +] + +[[package]] +name = "raw-window-handle" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" + +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.11.1", +] + +[[package]] +name = "redox_syscall" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4666a1a60d8412eab19d94f6d13dcc9cea0a5ef4fdf6a5db306537413c661b1b" +dependencies = [ + "bitflags 2.11.1", +] + +[[package]] +name = "regex-automata" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" + +[[package]] +name = "renderdoc-sys" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" + +[[package]] +name = "reqwest" +version = "0.12.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" +dependencies = [ + "base64", + "bytes", + "futures-core", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-rustls", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots 1.0.7", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.17", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rsa" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8573f03f5883dcaebdfcf4725caa1ecb9c15b2ef50c43a07b816e06799bb12d" +dependencies = [ + "const-oid", + "digest", + "num-bigint-dig", + "num-integer", + "num-traits", + "pkcs1", + "pkcs8", + "rand_core 0.6.4", + "signature", + "spki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustc-hash" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "0.38.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +dependencies = [ + "bitflags 2.11.1", + "errno", + "libc", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustix" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +dependencies = [ + "bitflags 2.11.1", + "errno", + "libc", + "linux-raw-sys 0.12.1", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls" +version = "0.23.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef86cd5876211988985292b91c96a8f2d298df24e75989a43a3c73f2d4d8168b" +dependencies = [ + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pki-types" +version = "1.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9" +dependencies = [ + "web-time", + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "ryu" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sctk-adwaita" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6277f0217056f77f1d8f49f2950ac6c278c0d607c45f5ee99328d792ede24ec" +dependencies = [ + "ab_glyph", + "log", + "memmap2", + "smithay-client-toolkit 0.19.2", + "tiny-skia", +] + +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serde_json" +version = "1.0.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_path_to_error" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" +dependencies = [ + "itoa", + "serde", + "serde_core", +] + +[[package]] +name = "serde_repr" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +dependencies = [ + "errno", + "libc", +] + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core 0.6.4", +] + +[[package]] +name = "simd-adler32" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" + +[[package]] +name = "simd_cesu8" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94f90157bb87cddf702797c5dadfa0be7d266cdf49e22da2fcaa32eff75b2c33" +dependencies = [ + "rustc_version", + "simdutf8", +] + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "slotmap" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdd58c3c93c3d278ca835519292445cb4b0d4dc59ccfdf7ceadaab3f8aeb4038" +dependencies = [ + "version_check", +] + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +dependencies = [ + "serde", +] + +[[package]] +name = "smithay-client-toolkit" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016" +dependencies = [ + "bitflags 2.11.1", + "calloop 0.13.0", + "calloop-wayland-source 0.3.0", + "cursor-icon", + "libc", + "log", + "memmap2", + "rustix 0.38.44", + "thiserror 1.0.69", + "wayland-backend", + "wayland-client", + "wayland-csd-frame", + "wayland-cursor", + "wayland-protocols", + "wayland-protocols-wlr", + "wayland-scanner", + "xkeysym", +] + +[[package]] +name = "smithay-client-toolkit" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0512da38f5e2b31201a93524adb8d3136276fa4fe4aafab4e1f727a82b534cc0" +dependencies = [ + "bitflags 2.11.1", + "calloop 0.14.4", + "calloop-wayland-source 0.4.1", + "cursor-icon", + "libc", + "log", + "memmap2", + "rustix 1.1.4", + "thiserror 2.0.18", + "wayland-backend", + "wayland-client", + "wayland-csd-frame", + "wayland-cursor", + "wayland-protocols", + "wayland-protocols-experimental", + "wayland-protocols-misc", + "wayland-protocols-wlr", + "wayland-scanner", + "xkeysym", +] + +[[package]] +name = "smithay-clipboard" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71704c03f739f7745053bde45fa203a46c58d25bc5c4efba1d9a60e9dba81226" +dependencies = [ + "libc", + "smithay-client-toolkit 0.20.0", + "wayland-backend", +] + +[[package]] +name = "smol_str" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead" +dependencies = [ + "serde", +] + +[[package]] +name = "socket2" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[package]] +name = "spirv" +version = "0.3.0+sdk-1.3.268.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" +dependencies = [ + "bitflags 2.11.1", +] + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "sqlx" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fefb893899429669dcdd979aff487bd78f4064e5e7907e4269081e0ef7d97dc" +dependencies = [ + "sqlx-core", + "sqlx-macros", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", +] + +[[package]] +name = "sqlx-core" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6798b1838b6a0f69c007c133b8df5866302197e404e8b6ee8ed3e3a5e68dc6" +dependencies = [ + "base64", + "bytes", + "chrono", + "crc", + "crossbeam-queue", + "either", + "event-listener", + "futures-core", + "futures-intrusive", + "futures-io", + "futures-util", + "hashbrown 0.15.5", + "hashlink", + "indexmap", + "log", + "memchr", + "once_cell", + "percent-encoding", + "rustls", + "serde", + "serde_json", + "sha2", + "smallvec", + "thiserror 2.0.18", + "tokio", + "tokio-stream", + "tracing", + "url", + "uuid", + "webpki-roots 0.26.11", +] + +[[package]] +name = "sqlx-macros" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2d452988ccaacfbf5e0bdbc348fb91d7c8af5bee192173ac3636b5fb6e6715d" +dependencies = [ + "proc-macro2", + "quote", + "sqlx-core", + "sqlx-macros-core", + "syn 2.0.117", +] + +[[package]] +name = "sqlx-macros-core" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19a9c1841124ac5a61741f96e1d9e2ec77424bf323962dd894bdb93f37d5219b" +dependencies = [ + "dotenvy", + "either", + "heck", + "hex", + "once_cell", + "proc-macro2", + "quote", + "serde", + "serde_json", + "sha2", + "sqlx-core", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", + "syn 2.0.117", + "tokio", + "url", +] + +[[package]] +name = "sqlx-mysql" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa003f0038df784eb8fecbbac13affe3da23b45194bd57dba231c8f48199c526" +dependencies = [ + "atoi", + "base64", + "bitflags 2.11.1", + "byteorder", + "bytes", + "chrono", + "crc", + "digest", + "dotenvy", + "either", + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "generic-array", + "hex", + "hkdf", + "hmac", + "itoa", + "log", + "md-5", + "memchr", + "once_cell", + "percent-encoding", + "rand 0.8.6", + "rsa", + "serde", + "sha1", + "sha2", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror 2.0.18", + "tracing", + "uuid", + "whoami", +] + +[[package]] +name = "sqlx-postgres" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db58fcd5a53cf07c184b154801ff91347e4c30d17a3562a635ff028ad5deda46" +dependencies = [ + "atoi", + "base64", + "bitflags 2.11.1", + "byteorder", + "chrono", + "crc", + "dotenvy", + "etcetera", + "futures-channel", + "futures-core", + "futures-util", + "hex", + "hkdf", + "hmac", + "home", + "itoa", + "log", + "md-5", + "memchr", + "once_cell", + "rand 0.8.6", + "serde", + "serde_json", + "sha2", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror 2.0.18", + "tracing", + "uuid", + "whoami", +] + +[[package]] +name = "sqlx-sqlite" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2d12fe70b2c1b4401038055f90f151b78208de1f9f89a7dbfd41587a10c3eea" +dependencies = [ + "atoi", + "chrono", + "flume", + "futures-channel", + "futures-core", + "futures-executor", + "futures-intrusive", + "futures-util", + "libsqlite3-sys", + "log", + "percent-encoding", + "serde", + "serde_urlencoded", + "sqlx-core", + "thiserror 2.0.18", + "tracing", + "url", + "uuid", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strict-num" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" + +[[package]] +name = "stringprep" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" +dependencies = [ + "unicode-bidi", + "unicode-normalization", + "unicode-properties", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "tempfile" +version = "3.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" +dependencies = [ + "fastrand", + "getrandom 0.4.2", + "once_cell", + "rustix 1.1.4", + "windows-sys 0.61.2", +] + +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl 2.0.18", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "thread_local" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "tiny-skia" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83d13394d44dae3207b52a326c0c85a8bf87f1541f23b0d143811088497b09ab" +dependencies = [ + "arrayref", + "arrayvec", + "bytemuck", + "cfg-if", + "log", + "tiny-skia-path", +] + +[[package]] +name = "tiny-skia-path" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c9e7fc0c2e86a30b117d0462aa261b72b7a99b7ebd7deb3a14ceda95c5bdc93" +dependencies = [ + "arrayref", + "bytemuck", + "strict-num", +] + +[[package]] +name = "tinystr" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe" +dependencies = [ + "bytes", + "libc", + "mio", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-macros" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edc5f74e248dc973e0dbb7b74c7e0d6fcc301c694ff50049504004ef4d0cdcd9" +dependencies = [ + "futures-util", + "log", + "tokio", + "tungstenite", +] + +[[package]] +name = "toml" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime 0.6.11", + "toml_edit 0.22.27", +] + +[[package]] +name = "toml_datetime" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_datetime" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.22.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime 0.6.11", + "toml_write", + "winnow 0.7.15", +] + +[[package]] +name = "toml_edit" +version = "0.25.11+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b59c4d22ed448339746c59b905d24568fcbb3ab65a500494f7b8c3e97739f2b" +dependencies = [ + "indexmap", + "toml_datetime 1.1.1+spec-1.1.0", + "toml_parser", + "winnow 1.0.3", +] + +[[package]] +name = "toml_parser" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" +dependencies = [ + "winnow 1.0.3", +] + +[[package]] +name = "toml_write" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" + +[[package]] +name = "tower" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-http" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" +dependencies = [ + "bitflags 2.11.1", + "bytes", + "futures-util", + "http", + "http-body", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", + "tracing", + "url", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex-automata", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "ttf-parser" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" + +[[package]] +name = "tungstenite" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18e5b8366ee7a95b16d32197d0b2604b43a0be89dc5fac9f8e96ccafbaedda8a" +dependencies = [ + "byteorder", + "bytes", + "data-encoding", + "http", + "httparse", + "log", + "rand 0.8.6", + "sha1", + "thiserror 1.0.69", + "utf-8", +] + +[[package]] +name = "type-map" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb30dbbd9036155e74adad6812e9898d03ec374946234fbcebd5dfc7b9187b90" +dependencies = [ + "rustc-hash 2.1.2", +] + +[[package]] +name = "typenum" +version = "1.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de" + +[[package]] +name = "uds_windows" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f6fb2847f6742cd76af783a2a2c49e9375d0a111c7bef6f71cd9e738c72d6e" +dependencies = [ + "memoffset", + "tempfile", + "windows-sys 0.61.2", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-normalization" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-properties" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d" + +[[package]] +name = "unicode-segmentation" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c" + +[[package]] +name = "unicode-width" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "universal-hash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" +dependencies = [ + "crypto-common", + "subtle", +] + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "uuid" +version = "1.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76" +dependencies = [ + "getrandom 0.4.2", + "js-sys", + "serde_core", + "wasm-bindgen", +] + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.3+wasi-0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" +dependencies = [ + "wit-bindgen 0.57.1", +] + +[[package]] +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" +dependencies = [ + "wit-bindgen 0.51.0", +] + +[[package]] +name = "wasite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" + +[[package]] +name = "wasm-bindgen" +version = "0.2.121" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49ace1d07c165b0864824eee619580c4689389afa9dc9ed3a4c75040d82e6790" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96492d0d3ffba25305a7dc88720d250b1401d7edca02cc3bcd50633b424673b8" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.121" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e68e6f4afd367a562002c05637acb8578ff2dea1943df76afb9e83d177c8578" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.121" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d95a9ec35c64b2a7cb35d3fead40c4238d0940c86d107136999567a4703259f2" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.117", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.121" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4e0100b01e9f0d03189a92b96772a1fb998639d981193d7dbab487302513441" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-encoder" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" +dependencies = [ + "leb128fmt", + "wasmparser", +] + +[[package]] +name = "wasm-metadata" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +dependencies = [ + "anyhow", + "indexmap", + "wasm-encoder", + "wasmparser", +] + +[[package]] +name = "wasmparser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags 2.11.1", + "hashbrown 0.15.5", + "indexmap", + "semver", +] + +[[package]] +name = "wayland-backend" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2857dd20b54e916ec7253b3d6b4d5c4d7d4ca2c33c2e11c6c76a99bd8744755d" +dependencies = [ + "cc", + "downcast-rs", + "rustix 1.1.4", + "scoped-tls", + "smallvec", + "wayland-sys", +] + +[[package]] +name = "wayland-client" +version = "0.31.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "645c7c96bb74690c3189b5c9cb4ca1627062bb23693a4fad9d8c3de958260144" +dependencies = [ + "bitflags 2.11.1", + "rustix 1.1.4", + "wayland-backend", + "wayland-scanner", +] + +[[package]] +name = "wayland-csd-frame" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" +dependencies = [ + "bitflags 2.11.1", + "cursor-icon", + "wayland-backend", +] + +[[package]] +name = "wayland-cursor" +version = "0.31.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a52d18780be9b1314328a3de5f930b73d2200112e3849ca6cb11822793fb34d" +dependencies = [ + "rustix 1.1.4", + "wayland-client", + "xcursor", +] + +[[package]] +name = "wayland-protocols" +version = "0.32.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "563a85523cade2429938e790815fd7319062103b9f4a2dc806e9b53b95982d8f" +dependencies = [ + "bitflags 2.11.1", + "wayland-backend", + "wayland-client", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-experimental" +version = "20250721.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40a1f863128dcaaec790d7b4b396cc9b9a7a079e878e18c47e6c2d2c5a8dcbb1" +dependencies = [ + "bitflags 2.11.1", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-misc" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e9567599ef23e09b8dad6e429e5738d4509dfc46b3b21f32841a304d16b29c8" +dependencies = [ + "bitflags 2.11.1", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-plasma" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b6d8cf1eb2c1c31ed1f5643c88a6e53538129d4af80030c8cabd1f9fa884d91" +dependencies = [ + "bitflags 2.11.1", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-wlr" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb04e52f7836d7c7976c78ca0250d61e33873c34156a2a1fc9474828ec268234" +dependencies = [ + "bitflags 2.11.1", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-scanner" +version = "0.31.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c324a910fd86ebdc364a3e61ec1f11737d3b1d6c273c0239ee8ff4bc0d24b4a" +dependencies = [ + "proc-macro2", + "quick-xml 0.39.4", + "quote", +] + +[[package]] +name = "wayland-sys" +version = "0.31.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8eab23fefc9e41f8e841df4a9c707e8a8c4ed26e944ef69297184de2785e3be" +dependencies = [ + "dlib", + "log", + "once_cell", + "pkg-config", +] + +[[package]] +name = "web-sys" +version = "0.3.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b572dff8bcf38bad0fa19729c89bb5748b2b9b1d8be70cf90df697e3a8f32aa" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webbrowser" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fc95580916af1e68ff6a7be07446fc5db73ebf71cf092de939bbf5f7e189f72" +dependencies = [ + "core-foundation 0.10.1", + "jni", + "log", + "ndk-context", + "objc2 0.6.4", + "objc2-foundation 0.3.2", + "url", + "web-sys", +] + +[[package]] +name = "webpki-roots" +version = "0.26.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" +dependencies = [ + "webpki-roots 1.0.7", +] + +[[package]] +name = "webpki-roots" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52f5ee44c96cf55f1b349600768e3ece3a8f26010c05265ab73f945bb1a2eb9d" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "wgpu" +version = "22.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d1c4ba43f80542cf63a0a6ed3134629ae73e8ab51e4b765a67f3aa062eb433" +dependencies = [ + "arrayvec", + "cfg_aliases 0.1.1", + "document-features", + "js-sys", + "log", + "parking_lot", + "profiling", + "raw-window-handle", + "smallvec", + "static_assertions", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "wgpu-core", + "wgpu-hal", + "wgpu-types", +] + +[[package]] +name = "wgpu-core" +version = "22.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0348c840d1051b8e86c3bcd31206080c5e71e5933dabd79be1ce732b0b2f089a" +dependencies = [ + "arrayvec", + "bit-vec", + "bitflags 2.11.1", + "cfg_aliases 0.1.1", + "document-features", + "indexmap", + "log", + "naga", + "once_cell", + "parking_lot", + "profiling", + "raw-window-handle", + "rustc-hash 1.1.0", + "smallvec", + "thiserror 1.0.69", + "wgpu-hal", + "wgpu-types", +] + +[[package]] +name = "wgpu-hal" +version = "22.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6bbf4b4de8b2a83c0401d9e5ae0080a2792055f25859a02bf9be97952bbed4f" +dependencies = [ + "android_system_properties", + "arrayvec", + "ash", + "bitflags 2.11.1", + "cfg_aliases 0.1.1", + "core-graphics-types", + "glow 0.13.1", + "glutin_wgl_sys", + "gpu-alloc", + "gpu-allocator", + "gpu-descriptor", + "hassle-rs", + "js-sys", + "khronos-egl", + "libc", + "libloading", + "log", + "metal", + "naga", + "ndk-sys 0.5.0+25.2.9519653", + "objc", + "once_cell", + "parking_lot", + "profiling", + "raw-window-handle", + "renderdoc-sys", + "rustc-hash 1.1.0", + "smallvec", + "thiserror 1.0.69", + "wasm-bindgen", + "web-sys", + "wgpu-types", + "winapi", +] + +[[package]] +name = "wgpu-types" +version = "22.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc9d91f0e2c4b51434dfa6db77846f2793149d8e73f800fa2e41f52b8eac3c5d" +dependencies = [ + "bitflags 2.11.1", + "js-sys", + "web-sys", +] + +[[package]] +name = "whoami" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d4a4db5077702ca3015d3d02d74974948aba2ad9e12ab7df718ee64ccd7e97d" +dependencies = [ + "libredox", + "wasite", +] + +[[package]] +name = "widestring" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72069c3113ab32ab29e5584db3c6ec55d416895e60715417b5b883a357c3e471" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" +dependencies = [ + "windows-core 0.52.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" +dependencies = [ + "windows-core 0.58.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-core" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" +dependencies = [ + "windows-implement 0.58.0", + "windows-interface 0.58.0", + "windows-result 0.2.0", + "windows-strings 0.1.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement 0.60.2", + "windows-interface 0.59.3", + "windows-link", + "windows-result 0.4.1", + "windows-strings 0.5.1", +] + +[[package]] +name = "windows-implement" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "windows-interface" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result 0.2.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + +[[package]] +name = "winit" +version = "0.30.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6755fa58a9f8350bd1e472d4c3fcc25f824ec358933bba33306d0b63df5978d" +dependencies = [ + "ahash", + "android-activity", + "atomic-waker", + "bitflags 2.11.1", + "block2", + "bytemuck", + "calloop 0.13.0", + "cfg_aliases 0.2.1", + "concurrent-queue", + "core-foundation 0.9.4", + "core-graphics", + "cursor-icon", + "dpi", + "js-sys", + "libc", + "memmap2", + "ndk", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", + "objc2-ui-kit", + "orbclient", + "percent-encoding", + "pin-project", + "raw-window-handle", + "redox_syscall 0.4.1", + "rustix 0.38.44", + "sctk-adwaita", + "smithay-client-toolkit 0.19.2", + "smol_str", + "tracing", + "unicode-segmentation", + "wasm-bindgen", + "wasm-bindgen-futures", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-protocols-plasma", + "web-sys", + "web-time", + "windows-sys 0.52.0", + "x11-dl", + "x11rb", + "xkbcommon-dl", +] + +[[package]] +name = "winnow" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0592e1c9d151f854e6fd382574c3a0855250e1d9b2f99d9281c6e6391af352f1" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +dependencies = [ + "wit-bindgen-rust-macro", +] + +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + +[[package]] +name = "wit-bindgen-core" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" +dependencies = [ + "anyhow", + "heck", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" +dependencies = [ + "anyhow", + "heck", + "indexmap", + "prettyplease", + "syn 2.0.117", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn 2.0.117", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" +dependencies = [ + "anyhow", + "bitflags 2.11.1", + "indexmap", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +dependencies = [ + "anyhow", + "id-arena", + "indexmap", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] + +[[package]] +name = "writeable" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "x11rb" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414" +dependencies = [ + "as-raw-xcb-connection", + "gethostname", + "libc", + "libloading", + "once_cell", + "rustix 1.1.4", + "x11rb-protocol", +] + +[[package]] +name = "x11rb-protocol" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd" + +[[package]] +name = "xcursor" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bec9e4a500ca8864c5b47b8b482a73d62e4237670e5b5f1d6b9e3cae50f28f2b" + +[[package]] +name = "xdg-home" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec1cdab258fb55c0da61328dc52c8764709b249011b2cad0454c72f0bf10a1f6" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "xkbcommon-dl" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" +dependencies = [ + "bitflags 2.11.1", + "dlib", + "log", + "once_cell", + "xkeysym", +] + +[[package]] +name = "xkeysym" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" + +[[package]] +name = "xml-rs" +version = "0.8.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ae8337f8a065cfc972643663ea4279e04e7256de865aa66fe25cec5fb912d3f" + +[[package]] +name = "yoke" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", + "synstructure", +] + +[[package]] +name = "zbus" +version = "4.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb97012beadd29e654708a0fdb4c84bc046f537aecfde2c3ee0a9e4b4d48c725" +dependencies = [ + "async-broadcast", + "async-executor", + "async-fs", + "async-io", + "async-lock", + "async-process", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "enumflags2", + "event-listener", + "futures-core", + "futures-sink", + "futures-util", + "hex", + "nix", + "ordered-stream", + "rand 0.8.6", + "serde", + "serde_repr", + "sha1", + "static_assertions", + "tracing", + "uds_windows", + "windows-sys 0.52.0", + "xdg-home", + "zbus_macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zbus-lockstep" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca2c5dceb099bddaade154055c926bb8ae507a18756ba1d8963fd7b51d8ed1d" +dependencies = [ + "zbus_xml", + "zvariant", +] + +[[package]] +name = "zbus-lockstep-macros" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "709ab20fc57cb22af85be7b360239563209258430bccf38d8b979c5a2ae3ecce" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", + "zbus-lockstep", + "zbus_xml", + "zvariant", +] + +[[package]] +name = "zbus_macros" +version = "4.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "267db9407081e90bbfa46d841d3cbc60f59c0351838c4bc65199ecd79ab1983e" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.117", + "zvariant_utils", +] + +[[package]] +name = "zbus_names" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b9b1fef7d021261cc16cba64c351d291b715febe0fa10dc3a443ac5a5022e6c" +dependencies = [ + "serde", + "static_assertions", + "zvariant", +] + +[[package]] +name = "zbus_xml" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab3f374552b954f6abb4bd6ce979e6c9b38fb9d0cd7cc68a7d796e70c9f3a233" +dependencies = [ + "quick-xml 0.30.0", + "serde", + "static_assertions", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zerocopy" +version = "0.8.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "zerofrom" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" + +[[package]] +name = "zerotrie" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" + +[[package]] +name = "zvariant" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2084290ab9a1c471c38fc524945837734fbf124487e105daec2bb57fd48c81fe" +dependencies = [ + "endi", + "enumflags2", + "serde", + "static_assertions", + "zvariant_derive", +] + +[[package]] +name = "zvariant_derive" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73e2ba546bda683a90652bac4a279bc146adad1386f25379cf73200d2002c449" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.117", + "zvariant_utils", +] + +[[package]] +name = "zvariant_utils" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c51bcff7cc3dbb5055396bcf774748c3dab426b4b8659046963523cee4808340" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..7e06ce1 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,12 @@ +[workspace] +members = [ + "backend", + "desktop-client", + "shared-protocol", +] +resolver = "2" + +[workspace.package] +edition = "2021" +license = "UNLICENSED" + diff --git a/FENSTERKONZEPT.md b/FENSTERKONZEPT.md new file mode 100644 index 0000000..423b427 --- /dev/null +++ b/FENSTERKONZEPT.md @@ -0,0 +1,58 @@ +# Fensterkonzept + +Die Anwendung ist nach dem Login fensterbasiert. Das Dashboard bleibt die +Hauptfläche und zeigt Status, Live-Verbindung und zusammenfassende Daten. Alle +fachlichen Arbeitsbereiche öffnen als eigene Fenster. + +## Grundregeln + +- Vor dem Login sind nur Login und Registrierung sichtbar. +- Nach dem Login bleibt das Dashboard die Basisansicht. +- Navigationseinträge außer Dashboard öffnen ein Fenster. +- Ein bereits geöffnetes Fenster wird fokussiert, nicht doppelt geöffnet. +- Fenster können geschlossen und später erneut geöffnet werden. +- Fenster behalten pro Benutzer Position, Größe und Reihenfolge, soweit der + jeweilige Client das technisch unterstützt. +- Offene Listenfenster müssen auf Live-Events reagieren und ihre Daten + aktualisieren oder als veraltet markieren. + +## Einheitliche Fensteraktionen + +- `Öffnen`: Fenster wird erzeugt oder, falls vorhanden, fokussiert. +- `Fokussieren`: Fenster erhält die höchste Z-Reihenfolge. +- `Schließen`: Fenster wird aus der Arbeitsfläche entfernt. +- `Verschieben`: Fensterposition wird geändert. +- `Größe ändern`: Fensterabmessungen werden geändert. +- `Aktualisieren`: Fenster lädt seine Daten neu oder reagiert auf ein + Backend-Event. + +## Webclient + +- Fenster werden über der Dashboard-Fläche dargestellt. +- Position und Größe sind per Maus oder Pointer veränderbar. +- Fensterstatus wird im `localStorage` pro Benutzer gespeichert. +- Wiederherstellung erfolgt nach Login oder Reload. + +## Desktopclient + +- Fenster verwenden native `egui::Window`-Instanzen. +- Benutzerrechte, Firmendaten und Freischaltungen sind als Fenster umgesetzt. +- Weitere fachliche Module folgen demselben Muster. + +## Live-Updates + +Backend-Änderungen erzeugen Events über die bestehende Socket-Verbindung. Clients +verwenden diese Events, um offene Fenster zu aktualisieren oder deren Status auf +`Aktualisiert` zu setzen. + +Für Phase 2 genügt ein gemeinsamer Live-Event-Store pro Client. Fachliche +Module können später gezielt nach Entity-Typ filtern. + +## Parallelbearbeitung und Konflikte + +- Schreibvorgänge laufen immer über das Backend. +- Das Backend entscheidet final über Berechtigungen und Datenstand. +- Bei konkurrierenden Änderungen wird zunächst eine frische Liste geladen. +- Für spätere fachliche Datensätze wird ein Versionsfeld oder `updated_at` + benötigt, damit Konflikte vor dem Speichern erkennbar sind. + diff --git a/IMPLEMENTIERUNGSPLAN.md b/IMPLEMENTIERUNGSPLAN.md new file mode 100644 index 0000000..2f2faf7 --- /dev/null +++ b/IMPLEMENTIERUNGSPLAN.md @@ -0,0 +1,181 @@ +# Implementierungsplan + +Dieser Plan beschreibt die konkrete technische Umsetzung. Die fachlichen +Grundentscheidungen stehen in `PLANUNG.md`; Installations- und Betriebsdetails +stehen in `INSTALL.md`. + +## Leitlinien + +- Backend zuerst dort stabilisieren, wo mehrere Clients dieselben Funktionen + nutzen. +- Gemeinsame Datenverträge und Rechte werden vor UI-Komfortfunktionen umgesetzt. +- Webclient und Desktopclient sollen dieselben Backend-Endpunkte verwenden. +- Alles außer dem Dashboard wird in Fenstern bearbeitet. +- Neue fachliche Funktionen bekommen eigene atomare Rechte. +- Bestehende Firmenschemas müssen bei Backend-Start idempotent nachgezogen + werden. +- Benutzer sichtbare Texte verwenden echte Umlaute. + +## Phase 1: Fundament Stabilisieren + +Ziel: Login, Firma, Benutzerrechte, Fensterkonzept und Live-Aktualisierung sind +verlässlich testbar. + +- [x] PostgreSQL-Grundschema und Firmenschema-Migrationen anlegen +- [x] Dev-Bootstrap für lokale Benutzer/Firma ohne E-Mail-Versand +- [x] Webclient auf Vue umstellen +- [x] Desktopclient-Konfiguration für Backend-URL +- [x] Logo in Webclient und Desktopclient verwenden +- [x] Benutzerrechte-Fenster im Webclient +- [x] Benutzerrechte-Fenster im Desktopclient +- [x] Rollenänderungen über Backend-Endpunkt speichern +- [x] Atomare Rechte initial anlegen +- [x] Bestehende aktive Firmenschemas beim Backend-Start nachziehen +- [x] Echte Session-/Auth-Tokens einführen statt temporärer User-ID im Header +- [x] Aktuelle Firma explizit auswählen und in Requests mitsenden +- [x] Backend-Rechteprüfung für jeden geschützten Endpunkt zentralisieren +- [x] Rollen auf Rechte abbilden und nicht nur Rollen anzeigen +- [x] Live-Events für Benutzer-/Rollenänderungen an alle Clients senden +- [x] Automatisierten API-Test für Rollenänderung ergänzen +- [x] Webclient-Build/Typprüfung für Benutzerrechte-Fenster ergänzen +- [x] Desktopclient-Build/Typprüfung für Benutzerrechte-Fenster ergänzen + +## Phase 2: Fenster- und Clientmodell + +Ziel: Die Anwendung verhält sich konsequent fensterbasiert und aktualisiert +offene Fenster bei Änderungen. + +- [x] Webclient öffnet angemeldete Arbeitsbereiche als Fenster +- [x] Desktopclient öffnet Benutzerrechte als Fenster +- [x] Gemeinsames Fensterkonzept dokumentieren +- [x] Webclient-Fenster verschiebbar machen +- [x] Webclient-Fenstergröße änderbar machen +- [x] Webclient-Fensterstatus pro Benutzer lokal speichern +- [x] Desktopclient-Fenster für Firmendaten ergänzen +- [x] Desktopclient-Fenster für Freischaltung ergänzen +- [x] Einheitliche Fensteraktionen definieren: Öffnen, Schließen, Fokussieren, + Aktualisieren +- [x] Live-Update-Store im Webclient für Stammdaten einführen +- [x] Live-Update-Store im Desktopclient für Stammdaten einführen +- [x] Konfliktverhalten bei paralleler Bearbeitung definieren + +## Phase 3: Stammdaten + +Ziel: Kunden, Lieferanten, Artikel und Aktivitäten sind als erste fachliche +Objekte vollständig nutzbar. + +- [x] Datenmodell Kunden finalisieren +- [x] Migration Kunden erstellen +- [x] Backend-CRUD Kunden implementieren +- [x] Web-Fenster Kundenliste und Kundendetail implementieren +- [x] Desktop-Fenster Kundenliste und Kundendetail implementieren +- [x] Kundenrabatt und Skonto beim Kunden ablegen +- [x] Datenmodell Lieferanten finalisieren +- [x] Migration Lieferanten erstellen +- [x] Backend-CRUD Lieferanten implementieren +- [x] Lieferanten-Skonto ablegen +- [x] Datenmodell Artikel finalisieren +- [x] Migration Artikel erstellen +- [x] Backend-CRUD Artikel implementieren +- [x] Artikelpreise historisieren +- [x] Datenmodell Aktivitäten finalisieren +- [x] Migration Aktivitäten erstellen +- [x] Backend-CRUD Aktivitäten implementieren +- [x] Web-Fenster für Lieferanten, Artikel und Aktivitäten implementieren +- [x] Desktop-Fenster für Lieferanten, Artikel und Aktivitäten implementieren +- [x] Live-Events für Stammdatenänderungen senden + +## Phase 4: Angebote und Rechnungen + +Ziel: Angebote und Rechnungen bilden den ersten produktiven Arbeitsablauf. + +- [x] Nummernkreise für Angebote und Rechnungen produktionsreif machen +- [x] Nummernkreise für Kunden, Lieferanten, Artikel und Aktivitäten anbinden +- [x] Nummernkreis-Verwaltung im Webclient und Desktopclient bereitstellen +- [x] Datenmodell Angebote finalisieren +- [x] Backend-CRUD Angebote implementieren +- [x] Angebotspositionen nur aus vorhandenen Artikeln erlauben +- [x] Positionspreis pro Angebot individuell überschreibbar machen +- [x] Web-Fenster Angebot erstellen +- [x] Desktop-Fenster Angebot erstellen +- [x] Angebot zu Ausgangsrechnung umwandeln +- [x] Datenmodell Ausgangsrechnungen finalisieren +- [x] Rechnungspositionen nur aus vorhandenen Artikeln erlauben +- [x] Positionspreis pro Rechnung individuell überschreibbar machen +- [x] Kundenrabatt und Skonto automatisch vorschlagen +- [x] Rechnung revisionssicher abschließen +- [x] Storno-/Korrekturrechnung vorbereiten +- [x] Datenmodell Eingangsrechnungen finalisieren +- [x] Eingangsrechnungen Lieferanten zuordnen +- [x] Lieferanten-Skonto berücksichtigen +- [x] Web-Fenster Ausgangs- und Eingangsrechnungen erstellen +- [x] Desktop-Fenster Ausgangs- und Eingangsrechnungen erstellen + +## Phase 5: Import und Preisaktualisierung + +Ziel: Artikellisten und externe APIs aktualisieren Preise nachvollziehbar. + +- [x] Importformat CSV definieren +- [x] Importformat Excel prüfen und als spätere Erweiterung zurückstellen +- [x] Importvorschau im Backend vorbereiten +- [x] Preislistenimport mit Mapping speichern +- [x] Preisänderungen historisieren +- [x] Preisregeln je Lieferant/Quelle definieren +- [x] API-Connector-Grundstruktur anlegen +- [x] Externe Preis-API-Konfiguration verschlüsselt speichern +- [x] Manueller Preisabgleich +- [x] Geplanter Preisabgleich vorbereiten: Intervall und letzter Abgleich werden gespeichert +- [x] Live-Update an offene Angebots-/Rechnungsfenster senden +- [x] Native-Client-Fenster für Preislisten, Preis-APIs und Preisregeln anbinden + +## Phase 6: Kommunikation und Dokumente + +Ziel: Kommunikation, Dokumente und Historie werden je Firma verwaltet. + +- [x] Datenmodell Kommunikation finalisieren +- [x] Kommunikation Kunden/Lieferanten/Vorgängen/Rechnungen zuordnen +- [x] Dokumentenspeicher-Layout festlegen +- [x] Dokumenten-Metadaten verschlüsselt speichern +- [x] Upload-Endpunkt implementieren +- [x] Download-Endpunkt implementieren +- [x] Rechteprüfung für Dokumentzugriff +- [x] Audit-Log für Dokumentzugriffe +- [x] Web-Fenster für Kommunikation und Dokumente anbinden + +## Phase 7: Sicherheit und Betrieb + +Ziel: Öffentlicher Server und lokale Installation sind trennbar und sicher +betreibbar. + +- [x] Produktives Authentifizierungskonzept implementieren +- [x] Passwort-Reset implementieren +- [x] Einladung mit sicherem Token statt Passwortanzeige implementieren +- [x] E-Mail-Outbox und produktiven Datei-Transport anbinden +- [x] Dev-Ausgabe für E-Mail-Inhalte klar vom Produktivbetrieb trennen +- [x] Mandantenschema-Erzeugung transaktional absichern +- [x] Verschlüsselungsschlüssel-Konzept für Betrieb dokumentieren +- [x] Schlüsselrotation planen +- [x] Backup/Restore je Firma dokumentieren +- [x] Docker-Setup für Backend erweitern +- [x] Reverse-Proxy/TLS-Beispiel bereitstellen +- [x] Installationsprogramm für lokale Einzelkunden-Version planen + +## Phase 8: Qualitätssicherung + +Ziel: Kernabläufe sind reproduzierbar testbar. + +- [x] API-Onboarding-Test erweitern: Registrierung, Freischaltung, Login, + Rechteänderung +- [x] Kommunikationstest um Live-Events für fachliche Daten erweitern +- [x] Migrationstest für bestehende Firmenschemas +- [x] Rechteprüfung negativ testen +- [x] Webclient-Build und Typprüfung in Standardcheck aufnehmen +- [x] Desktopclient-Headless-Tests erweitern +- [x] Datenbank-Testsetup dokumentieren +- [x] Testdaten-Seed für lokale Entwicklung anlegen + +## Aktueller Nächster Schritt + +1. Optimierungen und Fehlerbehebungen priorisieren. +2. Benutzereinstellungen für die Navigation sind umgesetzt: scrollbar, + oder einklappbare Gruppen je Benutzer. diff --git a/INSTALL.md b/INSTALL.md new file mode 100644 index 0000000..1d61b54 --- /dev/null +++ b/INSTALL.md @@ -0,0 +1,395 @@ +# Installation + +Diese Anleitung beschreibt die Installation einer lokalen Company-Tool-Instanz +mit PostgreSQL und Backend. Sie ist so aufgebaut, dass sie später als Grundlage +für Installationen bei Organisationen verwendet werden kann. + +## Voraussetzungen + +Für eine lokale Installation werden benötigt: + +- PostgreSQL 16 oder neuer +- Rust/Cargo +- Node.js 24 oder neuer, für Webfrontend und Kommunikationstests + +Optional: + +- Docker oder Podman, wenn PostgreSQL als Container laufen soll + +## PostgreSQL per Docker Compose + +Im Projekt liegt eine vorbereitete PostgreSQL-Konfiguration. + +```bash +docker compose up -d postgres +``` + +Die Standardwerte sind: + +- Host: `localhost` +- Port: `5432` +- Datenbank: `companytool` +- Benutzer: `companytool` +- Passwort: `companytool` + +Danach `.env` anlegen: + +```bash +cp .env.example .env +``` + +Verbindung prüfen: + +```bash +psql "postgres://companytool:companytool@localhost:5432/companytool" -c "select 1;" +``` + +## PostgreSQL manuell anlegen + +Falls PostgreSQL bereits auf einem Server installiert ist, kann die Datenbank +manuell angelegt werden. + +Als PostgreSQL-Admin ausführen: + +```sql +create user companytool with password 'companytool'; +create database companytool owner companytool; +``` + +Empfohlene produktive Anpassungen: + +- eigenes starkes Passwort verwenden +- Datenbank nur aus dem internen Netz erreichbar machen +- PostgreSQL-Backups einrichten +- Zugriff über Firewall einschränken + +Beispiel mit sicherem Passwort: + +```sql +create user companytool with password ''; +create database companytool owner companytool; +``` + +Dann `.env` anpassen: + +```env +DATABASE_URL=postgres://companytool:@localhost:5432/companytool +BACKEND_BIND=127.0.0.1:8080 +VITE_WS_URL=ws://localhost:8080/ws +``` + +## Backend starten + +```bash +cargo run -p companytool-backend +``` + +Beim Start führt das Backend aktuell die Basistabelle für den Testdatensatz +automatisch aus und legt bei Bedarf einen ersten Datensatz an. Die SQLx- +Migrationen unter `backend/migrations/` werden beim Backend-Start automatisch +ausgeführt. + +Health-Check: + +```bash +curl http://127.0.0.1:8080/health +``` + +Erwartete Antwort: + +```json +{"status":"ok"} +``` + +## Verschlüsselte Kommunikation testen + +Backend in einem Terminal starten: + +```bash +cargo run -p companytool-backend +``` + +In einem zweiten Terminal: + +```bash +node scripts/communication-test.mjs +``` + +Der Test prüft: + +- zwei echte WebSocket-Clients +- `hello`/`hello_ack`-Handshake +- eigener AES-256-GCM-Session-Key pro Client +- verschlüsselter Snapshot vom Backend +- verschlüsselte `subscribe`- und `ping`-Nachrichten +- verschlüsseltes `pong`-Event an beide Clients +- keine fachlichen Klartextmarker in den Rohframes + +Erwartetes Ergebnis: + +```text +client-a handshake, encrypted snapshot and subscribe ok +client-b handshake, encrypted snapshot and subscribe ok +encrypted multi-client communication test ok +``` + +## Onboarding-API testen + +Mit laufendem Backend: + +```bash +node scripts/api-onboarding-test.mjs http://127.0.0.1:8080 +``` + +Der Test legt eine Organization-Registrierung an, lädt Liste und Detail, +schaltet die Organization frei, testet den Login mit Initialpasswort, speichert +Firmendaten, prüft Rechte-Negativfälle, lädt einen weiteren User ein und prüft +die Rechteänderung. + +## Schema-Migration testen + +Mit laufendem Backend und PostgreSQL: + +```bash +node scripts/schema-migration-test.mjs http://127.0.0.1:8080 +``` + +Der Test legt eine Firma an, führt die Mandantenschema-Provisionierung erneut +aus und prüft, dass Nummernkreise, Rollen und spätere Tabellen wie +Kommunikation weiterhin funktionieren. Dadurch werden idempotente +Mandantenmigrationen früh erkannt. + +## Live-Events testen + +Mit laufendem Backend und PostgreSQL kann der Kommunikationstest zusätzlich +eine fachliche Änderung über die REST-API auslösen: + +```bash +node scripts/communication-test.mjs ws://127.0.0.1:8080/ws http://127.0.0.1:8080 +``` + +Der Test prüft dann neben Handshake, Verschlüsselung und Ping/Pong auch, dass +eine neu angelegte Aktivität als verschlüsseltes `record_changed`-Event bei +zwei verbundenen Clients ankommt. + +## Standardcheck + +Der Standardcheck bündelt die schnellen Prüfungen ohne laufendes Backend: + +```bash +bash scripts/standard-check.sh +``` + +Enthalten sind: + +- Rust-Formatprüfung +- `cargo check --workspace` +- Headless-Unit-Tests des Desktopclients +- Syntaxprüfung der Node-Testskripte +- Webfrontend-Build inklusive Vue/TypeScript-Prüfung + +## Lokale Testdaten anlegen + +Mit laufendem Backend kann ein reproduzierbarer Entwicklungsdatensatz erzeugt +werden: + +```bash +node scripts/dev-seed.mjs http://127.0.0.1:8080 +``` + +Das Skript nutzt den Dev-Bootstrap, legt eine Firma, einen Admin-Zugang, +Skonto, Kunde, Lieferant, Artikel und Aktivität an und gibt die Zugangsdaten +als JSON aus. Der Endpunkt ist nur im Entwicklungsbetrieb vorgesehen. + +## Kommunikation ohne PostgreSQL testen + +Falls PostgreSQL noch nicht eingerichtet ist, kann nur die +Kommunikationsschicht getestet werden. + +Terminal 1: + +```bash +COMMUNICATION_TEST_MODE=1 cargo run -p companytool-backend +``` + +Terminal 2: + +```bash +node scripts/communication-test.mjs +``` + +Dieser Modus ist nur für Entwicklung und Tests gedacht. + +## Webfrontend starten + +```bash +cd web-frontend +npm install +npm run dev +``` + +Standard-URL: + +```text +http://localhost:5175/ +``` + +Im Entwicklungsbetrieb leitet Vite `/api` und `/ws` standardmäßig an +`http://127.0.0.1:8080` weiter. Wenn das Backend auf einem anderen Port läuft, +wird die Zieladresse so gesetzt: + +```bash +VITE_BACKEND_ORIGIN=http://127.0.0.1:18084 npm run dev +``` + +### Lokalen Testzugang ohne E-Mail anlegen + +Im Entwicklungsbuild ist auf der Login-Seite ein Dev-Bootstrap verfügbar. Damit +wird eine lokale Testfirma mit erstem User angelegt. Das Initialpasswort wird +direkt in der Oberfläche angezeigt, weil auf Entwicklungsrechnern kein +E-Mail-Versand vorausgesetzt wird. + +Alternativ per API: + +```bash +curl -s -X POST http://127.0.0.1:8080/api/v1/dev/bootstrap-local \ + -H 'Content-Type: application/json' \ + -d '{"organization_name":"Lokale Testfirma","email":"admin@example.test"}' +``` + +Produktiv ist dieser Endpunkt nicht vorgesehen. Er ist nur im Debug-Build oder +mit `COMPANYTOOL_DEV_MODE=1` aktiv. + +## Desktopclient starten + +Der native Client liest seine Server-Konfiguration aus: + +```text +desktop-client/companytool-client.toml +``` + +Minimaler Inhalt: + +```toml +[server] +api_base_url = "http://localhost:8080" +ws_url = "ws://localhost:8080/ws" +``` + +API- und WebSocket-URL können überschrieben werden: + +```bash +cargo run -p companytool-desktop-client -- --api-url http://127.0.0.1:8080 --ws-url ws://127.0.0.1:8080/ws +``` + +Oder mit expliziter Config-Datei: + +```bash +cargo run -p companytool-desktop-client -- --config /pfad/companytool-client.toml +``` + +Alternativ per Umgebungsvariablen: + +```bash +COMPANYTOOL_CLIENT_CONFIG=/pfad/companytool-client.toml cargo run -p companytool-desktop-client +COMPANYTOOL_API_BASE_URL=http://127.0.0.1:8080 cargo run -p companytool-desktop-client +COMPANYTOOL_WS_URL=ws://127.0.0.1:8080/ws cargo run -p companytool-desktop-client +``` + +Start mit Standardkonfiguration: + +```bash +cargo run -p companytool-desktop-client +``` + +## Nativen Client testen + +Der native Client hat Headless-Tests. Dabei wird kein Fenster geöffnet. + +### Kommunikation + +Backend starten: + +```bash +COMMUNICATION_TEST_MODE=1 cargo run -p companytool-backend +``` + +Test ausführen: + +```bash +cargo run -p companytool-desktop-client -- --communication-test +``` + +Optional gegen eine andere WebSocket-URL oder Config-Datei: + +```bash +cargo run -p companytool-desktop-client -- --communication-test --ws-url ws://127.0.0.1:18081/ws +cargo run -p companytool-desktop-client -- --communication-test --config /pfad/companytool-client.toml +``` + +Erwartetes Ergebnis: + +```text +native client communication test ok +``` + +### Registrierung + +Für den Registrierungstest muss das Backend mit PostgreSQL laufen: + +```bash +cargo run -p companytool-backend +``` + +Test ausführen: + +```bash +cargo run -p companytool-desktop-client -- --registration-test --api-url http://127.0.0.1:8080 +``` + +Optional können Firmenname und E-Mail gesetzt werden: + +```bash +cargo run -p companytool-desktop-client -- --registration-test --api-url http://127.0.0.1:8080 --organization-name "Beispiel GmbH" --email admin@example.org +``` + +Erwartetes Ergebnis: + +```text +native client registration test ok +``` + +## Hinweise für Organisations-Installationen + +Für Installationen bei Organisationen gelten zusätzlich: + +- produktiv nur HTTPS/WSS verwenden +- PostgreSQL-Passwort individuell vergeben +- `.env` nicht an Dritte weitergeben +- regelmäßige Datenbank-Backups einrichten +- Zugriff auf PostgreSQL nicht öffentlich freigeben +- Backend hinter Reverse Proxy betreiben +- Zertifikate für lokale oder öffentliche Nutzung sauber einrichten +- spätere Versionen werden genau eine Organisation pro lokaler Installation + unterstützen + +## Fehlerbehebung + +PostgreSQL nicht erreichbar: + +```bash +pg_isready -h localhost -p 5432 +``` + +Backend kann Datenbank nicht öffnen: + +- `DATABASE_URL` in `.env` prüfen +- PostgreSQL-Dienst prüfen +- Benutzer, Passwort und Datenbanknamen prüfen + +Port bereits belegt: + +```bash +BACKEND_BIND=127.0.0.1:18080 cargo run -p companytool-backend +node scripts/communication-test.mjs ws://127.0.0.1:18080/ws +``` diff --git a/PLANUNG.md b/PLANUNG.md new file mode 100644 index 0000000..e4e1fa4 --- /dev/null +++ b/PLANUNG.md @@ -0,0 +1,2334 @@ +# Planung Firmen-Software + +Stand: 2026-05-22 + +## Zielbild + +Die Software wird als mehrplatzfähiges Firmensystem geplant: + +- lokaler Betrieb mit eigenem Server bei einer Firma +- öffentlicher SaaS-Betrieb mit vielen Firmen auf einer Instanz +- Backend in Rust +- PostgreSQL als Datenbank +- Kommunikation zwischen Clients und Backend per WebSocket für Live-Daten +- zusätzliche REST-API für externe Zugriffe, Importe und Integrationen +- Webfrontend für Browser +- nativer Desktopclient für Linux, Windows und macOS +- gleiche fachliche Funktionen in Webclient und Desktopclient +- Live-Aktualisierung der UI, wenn Backend-Daten geändert werden +- verschlüsselte Kommunikation zwischen Clients und Backend +- Offline-Fähigkeit im Desktopclient +- automatische Updates für den Desktopclient + +## Begriffe + +Der Begriff `Kunde` wird nur für Kunden einer Firma verwendet, also z.B. für +Rechnungsempfänger. + +Für die Betreiber-/Mandantenebene wird stattdessen `Firma` verwendet. Eine Firma +ist die Organisation, die das System nutzt und ein eigenes PostgreSQL-Schema +bekommt. + +Technische Begriffe: + +- `Firma`: fachlicher Mandant, also Nutzerorganisation des Systems +- `organization`: technischer Name für eine Firma in Code, API und Datenbank +- `Firmenschema`: PostgreSQL-Schema einer Firma, z.B. `company_` +- `User`: globaler Benutzeraccount in `public` +- `Kunde`: Kunde einer Firma innerhalb eines Firmenschemas +- `Vorgang`: fachlicher Sammelbegriff für Aktivität, Aufgabe, Wiedervorlage, + Termin oder interne Bearbeitung mit Bezug zu Kunden, Lieferanten, Dokumenten + oder Belegen +- `activity`: technischer Name für einen Vorgang in Code, API und Datenbank + +Namensregel: + +- Tabellen, Spalten, API-Felder und Code-Bezeichner sind englisch. +- Die UI zeigt deutsche Begriffe und Labels. +- Deutsche UI-Texte, Fehlermeldungen und Dokumentation verwenden echte Umlaute + (`ä`, `ö`, `ü`, `Ä`, `Ö`, `Ü`) und `ß`. ASCII-Umschreibungen wie `ae`, + `oe`, `ue` oder `ss` werden nur in technischen Bezeichnern verwendet, wenn + das nötig ist. +- Beispiel: Datenbank/API `organization`, UI `Firma`. + +## Mandantenmodell + +Jede Firma bekommt ein eigenes PostgreSQL-Schema. Das trennt operative Daten im +SaaS-Betrieb klar voneinander und funktioniert gleichzeitig für lokale +Einzelfirmen-Installationen. + +Wichtige Entscheidung: + +- In `public` liegen nur globale Daten, die für Login und Firmenzuordnung + notwendig sind. +- Alle fachlichen Daten, Rollen, Rechte, Einstellungen, Nummernkreise und Logs + liegen im jeweiligen Firmenschema. +- Ein User kann mehreren Firmen zugeordnet sein. +- Eine Firma verwaltet nicht mehrere weitere Firmen/Mandanten in derselben + Installation. + +### `public`-Schema + +`public` bleibt bewusst klein. + +Geplante Tabellen: + +- `users` +- `organizations` +- `user_organizations` +- `organization_domains`, optional für SaaS-Subdomains +- `auth_identities`, für Passwortlogin, SSO und externe Identity Provider +- `sessions` oder `refresh_tokens` + +Nicht in `public`: + +- Rollen +- Rechte +- Audit-Log +- Fachmodule +- Nummernkreise +- API-Zugangsdaten +- Firmeneinstellungen + +Diese Daten gehören in das jeweilige Firmenschema. + +### Firmenschema + +Schema-Namensvorschlag: + +- `company_` + +`organization_id` ist eine technische, nicht sprechende Kennung. Schema-Namen +enthalten keine Firmennamen. + +Geplante Tabellen je Firmenschema: + +- `roles` +- `permissions` +- `role_permissions` +- `user_roles` +- `settings` +- `number_ranges` +- `audit_log` +- `customers` +- `suppliers` +- `contacts` +- `addresses` +- `items` +- `item_price_sources` +- `item_prices` +- `price_rules` +- `customer_price_terms` +- `supplier_price_terms` +- `cash_discount_terms` +- `stock_movements` +- `quotes` +- `quote_versions` +- `quote_items` +- `incoming_invoices` +- `incoming_invoice_items` +- `outgoing_invoices` +- `outgoing_invoice_items` +- `communications` +- `activities` +- `activity_links` +- `tasks` +- `document_templates` +- `documents` +- `document_versions` +- `imports` +- `import_mappings` +- `api_connectors` +- `webhooks` + +### Mandantenauflösung + +Vorgeschlagener Ablauf: + +1. User meldet sich global an. +2. Backend liest aus `public.user_organizations`, welchen Firmen der User zugeordnet ist. +3. Falls der User mehrere Firmen hat, wählt er eine aktive Firma aus. +4. Backend erstellt ein Token oder eine Session mit aktiver `organization_id`. +5. Jeder REST-Request und jede WebSocket-Verbindung wird gegen diese aktive Firma + geprüft. +6. Datenbankzugriffe setzen kontrolliert das passende Firmenschema. + +Für den öffentlichen Betrieb kann zusätzlich eine Subdomain genutzt werden: + +- `firma-a.example.com` +- `firma-b.example.com` + +Die Subdomain darf aber nur eine Vorauswahl sein. Die finale Berechtigung kommt +aus `public.user_organizations`. + +## Betriebsarten + +### Eigener Server bei einer Firma + +- eine Backend-Instanz +- eine PostgreSQL-Datenbank +- genau eine Firma +- optional mehrere User +- dieselbe Mandantenarchitektur wie im SaaS-Betrieb +- Installation per Docker Compose, Systemdienst oder Installationsprogramm +- keine öffentliche Selbstregistrierung +- Firmenschema wird während Installation oder beim ersten Start erzeugt +- erster Firmen-User wird während Installation oder Erstkonfiguration angelegt + +Die lokale Version soll bewusst nur eine Firma verwalten können. Dadurch bleibt +die lokale Installation einfacher, nutzt intern aber trotzdem dieselbe +Firmenschema-Architektur wie der öffentliche Server. + +### Öffentlicher SaaS-Server + +- Betrieb durch uns +- eine oder mehrere Backend-Instanzen +- zentrale PostgreSQL-Datenbank +- viele Firmen, jeweils eigenes Schema +- TLS zwingend +- Backup, Monitoring, Rate-Limits und Mandantentrennung zwingend +- Benutzer können mehreren Firmen zugeordnet sein +- öffentliche Registrierung möglich +- Freischaltung neuer Firmen erfolgt durch einen Administrator +- vor Freischaltung ist kein produktiver Zugriff auf das Firmenschema möglich + +## Registrierung und Freischaltung + +### Öffentliche Registrierung + +Für den öffentlichen Server gibt es eine Registrierungsmaske. + +Pflichtangaben: + +- Firmenname +- E-Mail-Adresse + +Ablauf: + +1. Interessent gibt Firmenname und E-Mail-Adresse ein. +2. Server legt einen globalen User in `public.users` an, falls die E-Mail noch + nicht existiert. +3. Server legt einen Firmeneintrag in `public.organizations` mit Status `pending_approval` + an. +4. Server legt die Zuordnung in `public.user_organizations` an. +5. Server erzeugt das Firmenschema entweder sofort im gesperrten Zustand oder + erst nach Freischaltung. Bevorzugt: Schema erst nach Admin-Freischaltung + erzeugen, damit abgelehnte Registrierungen keine operativen Strukturen + hinterlassen. +6. Ein Administrator prüft und schaltet die Firma frei. +7. Bei Freischaltung erzeugt das Backend das Firmenschema, Basistabellen, + Standardrollen, Standardrechte und Grundeinstellungen. +8. Server erzeugt ein zufälliges Initialpasswort. +9. Server sendet eine E-Mail an die registrierte Adresse. +10. User meldet sich mit E-Mail-Adresse und Initialpasswort an. +11. Beim ersten Login muss das Passwort sofort geändert werden. +12. Danach kann der User Firmendaten, Einstellungen, Nummernkreise, Vorlagen und + weitere Stammdaten festlegen. + +Die E-Mail-Adresse ist der Username. + +### Admin-Freischaltung + +Neue Firmenregistrierungen stehen in einer Admin-Oberfläche. + +Admin-Aktionen: + +- Registrierung ansehen +- Firma freischalten +- Registrierung ablehnen +- E-Mail erneut senden +- Firmenschema-Erstellung erneut versuchen, falls ein technischer Fehler auftrat + +Statusmodell für `public.organizations`: + +- `pending_approval` +- `approved` +- `active` +- `rejected` +- `suspended` + +Vorgeschlagene Bedeutung: + +- `pending_approval`: Registrierung eingegangen, aber noch nicht freigegeben +- `approved`: durch Admin freigegeben, technische Anlage läuft oder steht bevor +- `active`: Firma ist nutzbar +- `rejected`: Registrierung wurde abgelehnt +- `suspended`: Firma wurde nachträglich gesperrt + +### Initialpasswort und Passwortwechsel + +Initialpasswörter werden zufällig erzeugt und per E-Mail versendet. + +Sicherheitsregeln: + +- Passwort wird nie im Klartext gespeichert. +- Passwort-Hash liegt in `public.users.password_hash`. +- User bekommt Status `must_change_password`. +- Beim ersten Login sind nur Passwortänderung und Logout erlaubt. +- Initialpasswort sollte zeitlich ablaufen. +- Nach erfolgreicher Änderung wird `must_change_password` entfernt. + +Optional spätere Verbesserung: + +- Statt Klartextpasswort per E-Mail wird ein einmaliger Set-Password-Link + verschickt. Das ist sicherer, aber der aktuell geplante Ablauf ist: + zufälliges Passwort per E-Mail. + +### User zur Firma einladen + +Ein berechtigter Firmen-User kann weitere User einladen. + +Ablauf: + +1. Firmen-User gibt neue E-Mail-Adresse ein. +2. Backend prüft Recht, z.B. `users.invite`. +3. Falls die E-Mail in `public.users` noch nicht existiert, wird ein globaler + User angelegt. +4. Backend legt oder aktualisiert `public.user_organizations`. +5. Im Firmenschema werden die gewünschten Rollen in `user_roles` vergeben. +6. Backend erzeugt ein zufälliges Initialpasswort oder ein neues Initialpasswort, + falls der User noch kein aktives Passwort für diese Installation hat. +7. Backend setzt `must_change_password`. +8. Backend sendet eine Einladung per E-Mail. +9. Eingeladener User meldet sich mit E-Mail und Initialpasswort an. +10. Passwortänderung ist beim ersten Login zwingend. + +Wenn ein User bereits in einer anderen Firma aktiv ist, darf dessen bestehendes +Passwort nicht ungefragt überschrieben werden. In diesem Fall sollte die +Einladung als Firmenzuordnung erfolgen und der User sich mit seinem bestehenden +Login anmelden. Für diesen Fall kann die Einladung einen Hinweis statt eines +neuen Passworts senden. + +### Lokale Erstinstallation + +Für lokale Installationen wird ein eigener Erstkonfigurationsprozess geplant. + +Ablauf: + +1. Installation richtet Backend und PostgreSQL ein. +2. Beim ersten Start erkennt das Backend, dass keine Firma existiert. +3. Setup-Maske fragt Firmenname, Admin-E-Mail und Initialpasswort ab oder erzeugt + ein zufälliges Passwort. +4. Backend erstellt genau eine Firma und genau ein Firmenschema. +5. Admin-User wird als `owner` zugeordnet. +6. Danach wird der Setup-Modus dauerhaft deaktiviert. + +Eine zweite Firma darf in der lokalen Version nicht angelegt werden. + +## Sicherheit + +Mindestanforderungen: + +- TLS für öffentlichen Betrieb +- Zertifikatsverwaltung über Reverse Proxy, z.B. Caddy, Traefik oder Nginx +- zusätzliche sessionbasierte Nutzdatenverschlüsselung oberhalb von HTTPS/WSS +- keine fachlichen Nutzdaten unverschlüsselt über das Netzwerk +- keine fachlichen Nutzdaten unverschlüsselt in PostgreSQL +- Passwort-Hashing mit Argon2id oder vergleichbar +- Zwei-Faktor-Authentifizierung +- Single Sign-On +- rollenbasierte Rechte +- Rechte pro atomarer Aktion mit Lesen, Schreiben und Löschen +- firmenschema-bewusste Datenbankzugriffe +- Audit-Log je Firmenschema +- sichere Speicherung von API-Zugangsdaten +- Backups und Restore-Konzept je Firma +- Schutz gegen unautorisierte WebSocket-Abos +- Initialpasswörter laufen ab +- Passwortwechsel beim ersten Login erzwingen +- Admin-Freischaltung für SaaS-Registrierungen + +## Kommunikation und Verschlüsselung + +### Grundsatz + +Alle produktiven Verbindungen zwischen Client und Backend müssen verschlüsselt +sein. + +Protokolle: + +- REST über HTTPS +- WebSocket über WSS + +Unverschlüsselte Verbindungen sind nicht vorgesehen. Das gilt auch für lokale +Installationen. Für Entwicklung können gesonderte Debug-Schalter existieren, sie +dürfen aber nicht Teil des produktiven Betriebs sein. + +Zusätzlich zu HTTPS/WSS werden fachliche Nutzdaten auf Anwendungsebene +verschlüsselt. TLS schützt den Transportkanal, die Anwendungsschicht- +Verschlüsselung schützt die eigentlichen Payloads innerhalb der Session. + +Grundsatz: + +- keine fachlichen Nutzdaten werden unverschlüsselt übertragen +- keine fachlichen Nutzdaten werden unverschlüsselt in PostgreSQL gespeichert +- Metadaten werden nur dann unverschlüsselt gespeichert, wenn sie technisch für + Routing, Login, Rechteprüfung, Indizes oder Betrieb zwingend notwendig sind +- Klartext existiert nur kurzzeitig im Backend-Prozessspeicher während der + Verarbeitung + +### Sessionbasierte Nutzdatenverschlüsselung + +Für jede angemeldete Client-Session wird ein eigener Session-Schlüssel +ausgehandelt oder vom Backend sicher bereitgestellt. + +Ziel: + +- REST-Payloads zusätzlich zu HTTPS verschlüsseln +- WebSocket-Payloads zusätzlich zu WSS verschlüsseln +- Replay und Manipulation über AEAD-Verfahren verhindern +- Session-Schlüssel beim Logout, Passwortwechsel, User-Sperre oder Ablauf + ungültig machen + +Empfohlenes Verfahren: + +- asymmetrischer Schlüsselaustausch beim Login oder bei Firmenauswahl +- danach symmetrische Verschlüsselung pro Session +- AEAD-Verfahren, z.B. AES-256-GCM oder XChaCha20-Poly1305 +- jede Nachricht bekommt Nonce und Authentifizierungstag +- Nonces dürfen pro Session-Schlüssel nie wiederverwendet werden +- Protokollversion und Nachrichtentyp werden als Additional Authenticated Data + einbezogen + +Abstraktes Nachrichtenformat: + +```json +{ + "enc": "v1", + "kid": "session-key-id", + "nonce": "...", + "ciphertext": "...", + "tag": "..." +} +``` + +Für WebSocket bedeutet das: + +- `hello` und Schlüsselaushandlung laufen vor verschlüsselten Fachnachrichten +- danach sind Subscribe-, Command- und Event-Payloads verschlüsselt +- technische Hüllfelder dürfen sichtbar bleiben, soweit sie für Routing nötig + sind, z.B. `enc`, `kid`, `nonce` + +Für REST bedeutet das: + +- Authentifizierung und Sessionaufbau laufen über HTTPS +- fachliche Request- und Response-Bodies werden danach verschlüsselt +- Datei-Uploads werden ebenfalls clientseitig oder vor Speicherung verschlüsselt + +### Datenbankverschlüsselung + +PostgreSQL speichert keine fachlichen Nutzdaten im Klartext. + +Geplantes Modell: + +- feld- oder dokumentbasierte Verschlüsselung auf Anwendungsebene +- PostgreSQL sieht für fachliche Felder nur Ciphertext +- je Firma eigener Data Encryption Key +- je Datensatz oder je Feld eigene Nonce +- AEAD mit Authentifizierungstag +- Schlüsselmaterial liegt nicht im Firmenschema +- Master-Key kommt aus Server-Konfiguration, Secret Store oder später HSM/KMS + +Schlüsselhierarchie: + +1. Master Key, außerhalb der Datenbank +2. Firmenschlüssel pro Firma +3. optional Bereichs- oder Tabellenschlüssel +4. Datensatzverschlüsselung mit eigener Nonce + +Konsequenzen: + +- Volltextsuche auf verschlüsselten Feldern ist nicht direkt möglich +- Sortierung und Filterung auf verschlüsselten Klartextwerten ist eingeschränkt +- für benötigte Suche braucht es bewusst geplante Such-/Indexwerte +- solche Suchwerte dürfen keine sensiblen Klartexte enthalten +- Logs, Audit-Log und Change-Log dürfen keine entschlüsselten Nutzdaten enthalten + +Pragmatische Einordnung: + +- Passwörter werden nicht verschlüsselt, sondern gehasht. +- technische IDs, Statuswerte, Sequenzen und Foreign Keys können als notwendige + Metadaten unverschlüsselt bleiben, wenn sie für Betrieb, Routing, + Rechteprüfung und referenzielle Integrität nötig sind. +- besonders sensible Inhalte wie Adressen, Kommunikationsdaten, Rechnungsinhalte, + Dokumentmetadaten, API-Secrets und Preise werden verschlüsselt gespeichert. + +### Öffentlicher Server + +Der öffentliche Server läuft hinter einem Reverse Proxy. + +Empfohlene Aufgaben des Reverse Proxy: + +- TLS-Terminierung +- Zertifikatsverwaltung +- HTTP-zu-HTTPS-Redirect +- Weiterleitung von WebSocket-Upgrades +- Rate-Limits für Login und Registrierung +- Request-Größenlimits für Uploads +- Security Header + +Geeignete Optionen: + +- Caddy +- Traefik +- Nginx + +Empfehlung für den Start: + +- Caddy oder Traefik, weil automatische Zertifikatsverwaltung einfacher ist. + +Backend-intern: + +- Backend lauscht nur im internen Netz oder auf localhost. +- Extern erreichbar ist nur der Reverse Proxy. +- Der Reverse Proxy leitet an das Backend weiter. + +### Zertifikate + +Öffentlicher SaaS-Betrieb: + +- Zertifikate automatisch per ACME/Let's Encrypt +- automatische Erneuerung +- TLS mindestens Version 1.2, bevorzugt TLS 1.3 +- HSTS nach stabiler Domain- und Zertifikatskonfiguration aktivieren + +Lokaler Betrieb: + +- ebenfalls HTTPS/WSS +- möglich über selbstsigniertes Zertifikat oder lokale Zertifizierungsstelle +- Installationsprogramm kann ein lokales Zertifikat erzeugen +- Desktopclient muss lokale Zertifikate sauber vertrauen können + +Für lokale Installationen muss das Installationsprogramm die Zertifikatsfrage +lösen, z.B. durch lokale Zertifizierungsstelle, Zertifikatimport oder klaren +Administrationsdialog. + +### REST-Kommunikation + +REST wird für zustandsändernde Befehle, Dateiübertragungen und externe +Integrationen verwendet. + +Eigenschaften: + +- JSON als Standardformat +- HTTPS verpflichtend im SaaS-Betrieb +- Bearer Token im `Authorization`-Header +- API-Version im Pfad, z.B. `/api/v1/...` +- fachliche Request- und Response-Bodies werden nach Sessionaufbau zusätzlich + verschlüsselt +- idempotente Endpunkte dort, wo Wiederholungen realistisch sind +- Request-ID pro Anfrage für Logging und Fehlersuche + +Beispiel-Header: + +```text +Authorization: Bearer +X-Request-Id: +``` + +### WebSocket-Kommunikation + +WebSocket wird für Live-Updates, Subscriptions und schnelle UI-Aktualisierung +verwendet. + +Öffentlicher Betrieb: + +- ausschließlich `wss://` +- WebSocket-Verbindung erst nach Login und Firmenauswahl +- Authentifizierung über kurzlebigen Socket-Token oder Access Token +- aktive Firma ist im Token oder in der Socket-Startnachricht festgelegt +- jede Subscription wird gegen Rechte geprüft + +Empfohlener Verbindungsaufbau: + +1. Client meldet sich per REST an. +2. Client wählt aktive Firma. +3. Backend gibt Access Token und optional separaten kurzlebigen WebSocket-Token. +4. Client öffnet `wss://server/ws`. +5. Client sendet eine `hello`-Nachricht mit Token und gewünschter Protokollversion. +6. Backend prüft Token, Firma, Userstatus und Rechte. +7. Backend bestätigt mit `hello_ack`. +8. Client abonniert Topics. + +Beispielnachrichten: + +```json +{ + "type": "hello", + "protocol_version": 1, + "token": "" +} +``` + +```json +{ + "type": "subscribe", + "topic": "customers", + "since_sequence": 12345 +} +``` + +```json +{ + "type": "event", + "topic": "customers", + "sequence": 12346, + "operation": "updated", + "entity_id": "..." +} +``` + +### Token und Sessions + +Geplantes Modell: + +- Access Token kurzlebig +- Refresh Token länger gültig, aber serverseitig widerrufbar +- Refresh Token wird nur gehasht gespeichert +- WebSocket-Token optional separat und sehr kurzlebig +- Passwortwechsel, User-Deaktivierung oder Firmen-Sperre widerrufen Sessions + +Für den Webclient: + +- Access Token möglichst nur im Speicher halten +- Refresh Token bevorzugt als `HttpOnly`, `Secure`, `SameSite` Cookie +- bei reinem API-Betrieb alternativ sichere Token-Speicherung bewusst festlegen + +Für den Desktopclient: + +- Refresh Token im Betriebssystem-Keychain speichern +- Linux: Secret Service/KWallet, falls verfügbar +- Windows: Credential Manager oder DPAPI +- macOS: Keychain +- keine Tokens im Klartext in Konfigurationsdateien + +### Nachrichtenintegrität und Replay-Schutz + +TLS schützt Transport und Integrität auf Verbindungsebene. Zusätzlich sollen +kritische Operationen nachvollziehbar und wiederholungssicher sein. + +Maßnahmen: + +- Request-ID pro REST-Anfrage +- serverseitige Idempotency Keys für kritische POST-Aktionen, z.B. + Rechnungserstellung +- monoton steigende `sequence` im `change_log` +- WebSocket-Events enthalten `sequence` +- Clients können nach Reconnect ab einer bekannten `sequence` nachladen + +### E-Mail-Kommunikation + +System-E-Mails werden über eine Outbox versendet. + +Anwendungsfälle: + +- Initialpasswort nach Admin-Freischaltung +- Einladung neuer Firmen-User +- später Passwort-Reset +- später 2FA-/Sicherheitsbenachrichtigungen + +Sicherheitsanforderungen: + +- SMTP-Zugangsdaten nicht im Firmenschema im Klartext speichern +- zentrale SMTP-Konfiguration für SaaS-Betrieb +- lokale SMTP-Konfiguration für lokale Installation möglich +- Versandversuche und Fehler in `public.email_outbox` protokollieren + +### API-Zugangsdaten von Lieferanten + +Lieferanten-API-Zugangsdaten liegen im Firmenschema, müssen aber verschlüsselt +gespeichert werden. + +Geplantes Modell: + +- Verschlüsselung vor Speicherung in PostgreSQL +- Master-Key aus Server-Konfiguration oder Secret Store +- je Firma optional abgeleiteter Schlüssel +- Rotation des Master-Keys später einplanen +- Secrets nie im Audit-Log oder Change-Log im Klartext speichern + +### Webhooks + +Ausgehende Webhooks müssen signiert werden. + +Anforderungen: + +- HTTPS-Ziel-URLs bevorzugen +- HMAC-Signatur pro Webhook +- Timestamp im Signaturmaterial +- Retry mit Backoff +- Dead-Letter-Status nach wiederholtem Fehler +- kein Mitsenden sensibler Secrets + +### Lokales Netzwerk und Server-Erkennung + +Für den nativen Desktopclient müssen lokale Server auffindbar oder konfigurierbar +sein. + +Optionen: + +- manuelle Server-URL +- gespeicherte Serverprofile +- spätere automatische LAN-Erkennung + +Empfehlung für den Start: + +- manuelle Server-URL +- klare Anzeige, ob Verbindung verschlüsselt ist +- Warnung bei Zertifikats- oder Vertrauensproblemen + +### Fehlerfälle und Reconnect + +Clients müssen robuste Verbindungslogik haben. + +Vorgaben: + +- automatischer Reconnect mit Backoff +- Token-Refresh vor erneutem WebSocket-Aufbau +- nach Reconnect Sync über `since_sequence` +- sichtbarer Offline-/Verbindungsstatus in der UI +- keine stillschweigenden Datenverluste bei abgebrochenen Schreiboperationen + +## Rollen und Rechte + +Es gibt feste Standardrollen. Die Rechte selbst sind granular aufgebaut. + +Rechtemodell: + +- jedes fachliche Atom bekommt eigene Rechte +- mindestens `read`, `write`, `delete` +- Rechte werden im Firmenschema gespeichert +- feste Rollen bündeln Rechte +- die erste Person einer Firma ist der Besitzer (`owner`) und erhält beim + Anlegen der Firma alle initial vorgesehenen Rollen/Rechte +- nur der Besitzer darf Benutzer einladen und Rollen/Rechte für andere Benutzer + vergeben oder ändern +- alle weiteren Firmenbenutzer erhalten Rechte nicht automatisch, sondern erst + durch manuelle Freischaltung im Admin-Fenster `Benutzerrechte` +- jede größere Funktion bekommt eigene atomare Rechte, z.B. Kunden, + Lieferanten, Artikel, Angebote, Eingangsrechnungen, Ausgangsrechnungen, + Aktivitäten, Kommunikation, Preislistenimporte, Preis-API-Abgleiche, + Einstellungen, Benutzerverwaltung, Nummernkreise, Dokumente, Berichte und + Audit-Log + +Beispielrollen: + +- `owner` +- `admin` +- `sales` +- `accounting` +- `purchasing` +- `warehouse` +- `viewer` + +Beispielrechte: + +- `customers.read` +- `customers.write` +- `customers.delete` +- `activities.read` +- `activities.write` +- `activities.delete` +- `quotes.read` +- `quotes.write` +- `quotes.delete` +- `outgoing_invoices.read` +- `outgoing_invoices.write` +- `outgoing_invoices.delete` +- `items.read` +- `items.write` +- `items.delete` +- `price_rules.write` +- `imports.write` +- `settings.write` + +## Fachmodule + +### Dashboard + +Die Startmaske ist ein Dashboard mit Übersicht über laufende und offene Vorgänge. + +Inhalte: + +- offene Angebote +- fällige Aufgaben +- offene Eingangsrechnungen +- offene Ausgangsrechnungen +- aktuelle Importläufe +- Preisänderungen +- Warnungen aus Lagerbestand oder Preisberechnung +- offene/fällige Vorgänge +- Wiedervorlagen + +### Kunden + +Verwaltung von Firmen- und Privatkunden der jeweiligen Firma. + +Geplante Daten: + +- Kundennummer +- Name/Firma +- Kundentyp +- Rechnungsadresse +- Lieferadresse +- Ansprechpartner +- Kommunikationsdaten +- Zahlungsbedingungen +- Standardrabatt +- Skonto-Regel, falls abweichend von den Firmeneinstellungen +- USt-IdNr. +- Notizen +- Status + +### Lieferanten + +Verwaltung von Bezugsquellen und Einkaufskonditionen. + +Geplante Daten: + +- Lieferantennummer +- Name/Firma +- Adressen +- Ansprechpartner +- Zahlungsbedingungen +- Skonto-Regel, falls vom Lieferanten vorgegeben +- Artikelreferenzen +- Preislistenquellen +- API-Zugangsdaten + +### Artikel und Lager + +Zentrale Artikelverwaltung mit Preisberechnung und Lagerbestand. + +Geplante Daten: + +- Artikelnummer +- Bezeichnung +- Beschreibung +- Einheit +- Einkaufspreis +- Verkaufspreis +- Steuersatz +- Lieferant +- Herstellerartikelnummer +- EAN/GTIN +- Preisgültigkeit +- Lagerbestand +- Mindestbestand +- Lagerbewegungen + +Preisberechnung: + +- Einkaufspreis fest festlegen +- Einkaufspreis aus Quelle übernehmen +- Einkaufspreis mal Multiplikator +- Staffelpreise +- kundenspezifische Preise +- kundenbezogener Standardrabatt +- positionsbezogener Sonderpreis oder Sonderrabatt +- Skonto-Regeln für Zahlung innerhalb definierter Fristen +- Projektpreise +- Rundungsregeln +- Preisgültigkeit +- Preisänderungshistorie + +Preis- und Zahlungsbedingungen: + +- Kunden können einen festen Standardrabatt erhalten. +- Lieferanten können eigene Skonto- und Zahlungsbedingungen haben. +- Firmeneinstellungen definieren Standard-Skonto und Standard-Zahlungsziele. +- Kunden- oder Lieferanteneinstellungen überschreiben die Firmenstandards. +- Rechnungspositionen übernehmen zunächst den aktuellen Artikelpreis und die + anwendbaren Rabattregeln. +- Der Einzelpreis einer Rechnungsposition darf manuell überschrieben werden, + z.B. wegen Sonderabsprachen, Kulanz oder Spezialrabatt. +- Preisüberschreibungen müssen als solche gespeichert werden, inkl. optionalem + Grund und User. + +Geplante Tabellen: + +- `customer_price_terms`: kundenspezifische Rabatte und Preisbedingungen +- `supplier_price_terms`: lieferantenspezifische Einkaufs-/Zahlungsbedingungen +- `cash_discount_terms`: Skonto-Regeln mit Prozent, Frist und Gültigkeit + +`cash_discount_terms` ist bewusst eine eigene Tabelle, damit Firmeneinstellung, +Kunde, Lieferant und später ggf. einzelne Belege auf dieselben strukturierten +Skonto-Regeln verweisen können. + +### Angebote + +Angebote erstellen, versionieren, verwalten und in Rechnungen überführen. + +Geplante Funktionen: + +- frei konfigurierbarer Angebotsnummernkreis +- Kunde auswählen +- Positionen aus Artikeln oder Freitext +- Rabatte +- Steuern +- Zahlungs-/Lieferbedingungen +- Status: Entwurf, in Freigabe, freigegeben, gesendet, angenommen, abgelehnt, abgelaufen +- Angebotsversionen +- Angebotsvorlagen je Firma +- optionaler Freigabeprozess je nach Firmeneinstellung +- E-Mail-Versand aus dem System +- PDF-Erzeugung +- Umwandlung in Ausgangsrechnung + +### Ausgangsrechnungen + +Rechnungen an Kunden. + +Geplante Funktionen: + +- aus Angebot erzeugen +- direkt erstellen +- frei konfigurierbarer Rechnungsnummernkreis mit Pflicht-Platzhalter für Counter +- Positionen ausschließlich mit Artikelreferenz +- keine freien Text-/Freipositionen in Ausgangsrechnungen +- aktueller Artikelpreis wird beim Hinzufügen übernommen +- Einzelpreis und Rabatt pro Rechnungsposition dürfen überschrieben werden +- kundenbezogener Standardrabatt wird vorgeschlagen +- Skonto aus Firmeneinstellung oder Kundenregel wird vorgeschlagen +- Steuern passend für Deutschland +- Preisüberschreibungen mit Grund und User nachvollziehbar speichern +- Zahlungsstatus +- Mahnstatus +- PDF-Erzeugung +- revisionssichere Ablage nach Erstellung +- spätere Erweiterung für DATEV oder E-Rechnung möglich, aber nicht in der ersten Stufe + +### Eingangsrechnungen + +Rechnungen von Lieferanten. + +Geplante Funktionen: + +- Lieferant zuordnen +- Rechnungsdaten erfassen +- Positionen erfassen +- Dokument/PDF ablegen +- Zahlungsstatus +- Zahlungsziel und Skonto aus Lieferantenregel vorschlagen +- Kostenstellen oder Projekte, falls später benötigt +- Abgleich mit Artikeln und Lieferantenpreisen +- revisionssichere Ablage + +### Kommunikation, Vorgänge, Aufgaben und Wiedervorlagen + +Keine direkte E-Mail- oder Telefonie-Synchronisation in der ersten Stufe. + +Begriffliche Entscheidung: + +- UI-Hauptbegriff: `Vorgänge` +- technischer Name: `activities` +- `Aktivität` bleibt als Typ oder Kategorie möglich, ist aber als Hauptbegriff + zu unscharf + +Ein Vorgang beschreibt etwas, das fachlich passiert ist, gerade passiert oder +geplant ist. Dadurch lassen sich Kommunikationsnotizen, Aufgaben, Termine, +Wiedervorlagen und Bearbeitungsschritte in einer gemeinsamen Timeline anzeigen. + +Geplante Vorgangstypen: + +- E-Mail-Notiz +- Telefonnotiz +- interne Notiz +- Aufgabe +- Wiedervorlage +- Kalendertermin +- Systemereignis, z.B. Angebot angenommen oder Rechnung erstellt +- manueller Bearbeitungsschritt, z.B. Rückfrage geklärt + +Geplante Daten: + +- Titel +- Beschreibung/Notiz +- Vorgangstyp +- Status: offen, in Bearbeitung, erledigt, storniert +- Priorität: niedrig, normal, hoch, kritisch +- Fälligkeitsdatum +- Start-/Endzeit für Termine +- zuständiger User +- erstellt von +- erledigt von +- Tags/Kategorien +- Sichtbarkeit, z.B. intern oder für alle berechtigten User +- Bezug auf Kunde, Lieferant, Kontakt, Angebot, Rechnung, Artikel, Dokument oder Importlauf +- versionierte Anhänge +- technische Systemquelle, falls automatisch erzeugt + +Verknüpfungen: + +- Ein Vorgang kann mehrere Bezüge haben, z.B. Kunde + Angebot + Dokument. +- Bezüge werden nicht als viele optionale Spalten modelliert, sondern über eine + Link-Tabelle. +- Beispiel: `activity_links(activity_id, entity_type, entity_id)`. + +Live-Verhalten: + +- neue oder geänderte Vorgänge erzeugen WebSocket-Events +- Dashboard zeigt offene/fällige Vorgänge +- Detailmasken zeigen eine Timeline der zugehörigen Vorgänge +- erledigte Vorgänge bleiben nachvollziehbar erhalten + +Abgrenzung zu `communications`: + +- `communications` speichert strukturierte Kommunikation, sobald echte + E-Mail-/Telefonie-Integration oder Nachrichtenarchivierung implementiert wird. +- `activities` bildet die nutzbare Timeline und Aufgaben-/Wiedervorlagefunktion + schon in der ersten Stufe ab. +- In der ersten Stufe können E-Mail- und Telefonnotizen direkt als Vorgänge + geführt werden. + +### Dokumente und Vorlagen + +Dokumente werden auf dem Filesystem gespeichert. Metadaten und Versionen liegen in +PostgreSQL. + +Geplante Funktionen: + +- PDF-Ablage +- Uploads +- versionierte Anhänge +- editierbare Dokumentvorlagen +- Vorlagen je Firma +- Verknüpfung mit Kunden, Lieferanten, Angeboten und Rechnungen + +Keine Volltextsuche in Dokumenten in der ersten Stufe. + +## Artikelpreislisten und APIs + +### Dateiimport + +Unterstützte erste Formate: + +- CSV +- XML +- JSON + +XLSX bleibt eine mögliche spätere Erweiterung. + +Import-Pipeline: + +1. Datei hochladen +2. Format erkennen oder manuell auswählen +3. Spalten/Felder zu Zielfeldern mappen +4. Vorschau und Validierung +5. Import ausführen +6. Importbericht speichern +7. Einkaufspreise aktualisieren +8. Verkaufspreise neu berechnen +9. betroffene Clients per WebSocket informieren + +### Frei konfigurierbare Preislisten + +Da Lieferantenpreislisten frei konfigurierbar sein sollen, braucht das System +Mapping-Vorlagen: + +- Lieferant +- Format +- Feldzuordnung +- Identifikationsfeld, z.B. EAN, Artikelnummer oder Herstellerartikelnummer +- Währungsfeld +- Preisfeld +- Mengen-/Staffelfeld +- Gültigkeitsdatum +- Konfliktregel + +### Frei konfigurierbare API-Connectoren + +Geplante Connector-Konfiguration: + +- Lieferant +- Basis-URL +- Authentifizierung +- Header +- Query-Parameter +- Abrufintervall +- Request-Template +- Response-Mapping +- Fehlerprotokoll +- Testabruf + +Komplexere APIs werden wahrscheinlich dennoch einzelne Spezialadapter brauchen. +Die freie Konfiguration sollte daher einfache REST/JSON- und REST/XML-Fälle +abdecken, aber nicht als vollständiger Ersatz für jede Lieferanten-API geplant +werden. + +## Rechnungen, Steuern und Archivierung + +Zielmarkt ist Deutschland. + +Erste Stufe: + +- deutsche Steuersätze +- Steuerwerte so erfassen, dass eine spätere Übertragung oder Auswertung für + Elster möglich ist +- frei konfigurierbare Nummernkreise +- Nummernkreis muss mindestens einen Counter-Platzhalter enthalten +- Rechnungen nach Erstellung unveränderlich behandeln +- Korrekturen über Storno/Korrekturrechnung statt Bearbeitung finaler Rechnung + +Spätere Ausbaustufen: + +- DATEV-Export +- XRechnung +- ZUGFeRD +- direkte Buchhaltungsintegration + +## Backend-Architektur + +Vorgeschlagene Hauptbereiche: + +- Authentifizierung +- öffentliche Registrierung +- Admin-Freischaltung von Firmen +- SSO +- 2FA +- Firmenauswahl +- User-Einladungen +- E-Mail-Outbox +- Key-Management +- Session-Schlüsselverwaltung +- Payload-Verschlüsselung für REST und WebSocket +- Datenbankverschlüsselung auf Anwendungsebene +- Firmenschema-Auflösung +- rollenbasierte Autorisierung +- Migrationen für `public` +- Migrationen je Firmenschema +- REST-API +- WebSocket-Verbindungsverwaltung +- Event-Bus für Live-Updates +- Fachmodule +- Dateiimport +- API-Connectoren +- Dokumenterzeugung +- Dokumentablage im Filesystem +- Audit-Logging je Firmenschema +- Webhooks + +## Socket-Kommunikation + +Clients verbinden sich nach Login und Firmenauswahl mit dem Backend. + +Das Socket-Protokoll ist versioniert. Jede Verbindung beginnt mit einer +`hello`-Nachricht. Ohne gültige Authentifizierung und bestätigte Protokollversion +werden keine Subscriptions angenommen. + +Beispiele für Topics: + +- `dashboard` +- `customers` +- `suppliers` +- `items` +- `stock` +- `quotes` +- `incoming_invoices` +- `outgoing_invoices` +- `communications` +- `tasks` +- `imports` + +Beispiele für Server-Events: + +- `snapshot` +- `created` +- `updated` +- `deleted` +- `price_recalculated` +- `stock_changed` +- `import_finished` +- `invoice_created_from_quote` +- `task_due` + +Wichtig: + +- jede WebSocket-Verbindung muss authentifiziert sein +- jede Verbindung hat genau eine aktive Firma +- jede Verbindung hat eine bestätigte Protokollversion +- jede Verbindung hat nach dem Handshake einen Session-Schlüssel für + verschlüsselte Payloads +- jede Nachricht wird gegen Rechte im Firmenschema geprüft +- Events gehen nur an berechtigte User derselben Firma +- Clients müssen verlorene Verbindungen erkennen und neu synchronisieren können +- für Offline-Desktopclients braucht es einen Änderungslog oder Sync-Endpunkt +- Events enthalten eine `sequence` für Reconnect und Offline-Sync +- schreibende Aktionen laufen bevorzugt über REST, Events informieren danach alle + betroffenen Clients + +## REST-API und Webhooks + +Zusätzlich zum WebSocket-Protokoll wird eine REST-API geplant. + +Einsatz: + +- öffentliche Registrierung im SaaS-Betrieb +- Admin-Freischaltung neuer Firmen +- Login +- Passwortwechsel beim ersten Login +- Firmenauswahl +- User-Einladungen +- CRUD-Operationen +- Dateiimport +- Dokumentdownload +- externe Integrationen +- Export vorhandener Daten + +Webhooks: + +- je Firma konfigurierbar +- Signatur je Webhook +- Retry-Strategie +- Ereignisse wie Angebot angenommen, Rechnung erstellt, Import abgeschlossen + +Vorgeschlagene erste REST-Endpunkte: + +- `POST /api/registration/organization` +- `GET /api/admin/organization-registrations` +- `GET /api/admin/organization-registrations/{id}` +- `POST /api/admin/organization-registrations/{id}/approve` +- `POST /api/admin/organization-registrations/{id}/reject` +- `POST /api/admin/organization-registrations/{id}/resend-initial-email` +- `POST /api/admin/organization-registrations/{id}/retry-provisioning` +- `POST /api/auth/login` +- `POST /api/auth/change-initial-password` +- `GET /api/auth/organizations` +- `POST /api/auth/select-organization` +- `GET /api/organizations/current/setup` +- `PUT /api/organizations/current/setup` +- `POST /api/organizations/current/invitations` +- `POST /api/organizations/current/invitations/{id}/resend` +- `GET /api/organizations/current/users` +- `PATCH /api/organizations/current/users/{user_id}/roles` +- `POST /api/organizations/current/users/{user_id}/disable` + +Alle produktiven REST-Endpunkte werden versioniert, z.B. unter `/api/v1/...`. +Kritische POST-Endpunkte wie Rechnungserstellung oder Angebotsumwandlung sollen +Idempotency Keys unterstützen. + +## Desktop-Offline-Konzept + +Offline-Fähigkeit ist sinnvoll und wird eingeplant. + +Vorgeschlagener Ansatz: + +- lokaler Cache im Desktopclient +- lokale SQLite-Datenbank oder eingebetteter Speicher +- schreibende Offline-Aktionen zuerst nur für ausgewählte Bereiche erlauben +- Sync beim Wiederverbinden +- Konfliktstrategie pro Modul + +Empfohlene erste Offline-Stufe: + +- Lesen zuletzt synchronisierter Daten +- Vorgänge und Timelines anzeigen +- neue Notizen/Vorgangsentwürfe lokal speichern +- Aufgaben/Wiedervorlagen anzeigen +- Entwürfe lokal speichern +- keine finale Rechnungserstellung offline + +Finale Rechnungen sollten wegen Nummernkreis, Revisionssicherheit und +Mehrbenutzerbetrieb nur online erstellt werden. + +## Frontend-Planung + +Webclient und Desktopclient sollen denselben fachlichen Umfang bekommen. + +### Fensterbasiertes Arbeitsmodell + +Die Anwendung wird fensterbasiert geplant. User sollen mehrere Arbeitskontexte +parallel offen halten können, z.B. Rechnung, Artikelliste, Kundendetail und +Vorgangstimeline. + +Grundsätze: + +- Listen, Detailfenster, Suchdialoge und Auswahlfelder sind eigene Fenster oder + fensterähnliche Arbeitsbereiche. +- Mehrere Fenster können gleichzeitig geöffnet sein. +- Änderungen in einem Fenster müssen andere offene Fenster sofort erreichen. +- Auswahlfelder und Suchdialoge dürfen keine veralteten Daten anzeigen. +- Ein Fenster darf lokale Eingaben nicht verlieren, wenn im Hintergrund Daten + aktualisiert werden. +- Bei Konflikten muss der User nachvollziehbar entscheiden können, ob lokale + Änderungen beibehalten, neu geladen oder zusammengeführt werden. + +Beispiel: + +1. User erstellt eine Ausgangsrechnung. +2. Beim Hinzufügen einer Position fehlt ein Artikel oder der Preis ist falsch. +3. User öffnet parallel Artikelfenster oder Vorgangsfenster. +4. User legt den Artikel/Vorgang an oder korrigiert den Preis. +5. Das Rechnungsfenster erhält sofort ein Live-Event. +6. Artikel und Vorgang sind ohne Neuladen in der Rechnung auswählbar. + +Technische Anforderungen: + +- Jede Datenänderung erzeugt ein fachliches Live-Event mit Entity-Typ, ID, + Änderungsart und Versions-/Sequenznummer. +- Frontends führen zentrale Stores/Caches je Firma, z.B. für Artikel, Kunden, + Vorgänge und Preisregeln. +- Fenster abonnieren die Store-Änderungen statt eigene isolierte Listen zu + halten. +- Auswahlkomponenten aktualisieren ihre Ergebnislisten bei Store-Updates. +- Auswahlkomponenten für große Stammdatenmengen, z.B. Kunden, Lieferanten und + Artikel, zeigen nicht pauschal alle Datensätze an. Sie bieten eine Suche nach + Nummer und Name und begrenzen die sichtbaren Treffer. +- Bei großen Listen werden nur betroffene Datensätze aktualisiert, nicht die + komplette Maske neu gerendert. +- Detailfenster vergleichen `updated_at` oder eine Versionsnummer, bevor lokale + Änderungen gespeichert werden. +- WebSocket-Reconnect nutzt `since_sequence`, damit verpasste Änderungen + nachgeladen werden. + +Erste betroffene Bereiche: + +- Artikel- und Preisauswahl in Rechnungen und Angeboten +- Vorgänge/Timelines in Kunden-, Lieferanten-, Artikel- und Belegfenstern +- Kunden- und Lieferantenauswahl in Belegen +- Benutzer- und Rechteänderungen in offenen Einstellungsfenstern +- Importfortschritt und Preisneuberechnung + +Gemeinsame Kernmasken: + +- öffentliche Registrierungsmaske, nur SaaS +- Admin-Maske für Firmenfreischaltungen, nur Betreiber/Admin +- Login +- erzwungener Passwortwechsel +- Firmenauswahl +- Dashboard +- Kunden +- Lieferanten +- Artikel +- Lager +- Angebote +- Ausgangsrechnungen +- Eingangsrechnungen +- Kommunikation +- Vorgänge +- Aufgaben/Wiedervorlagen +- Dokumente +- Einstellungen +- Benutzerverwaltung und Einladungen +- Importassistent + +Benutzereinstellungen: + +- Benutzereinstellungen werden je Firma und je Benutzer gespeichert. +- Die Werte werden wie andere fachliche Einstellungen verschlüsselt abgelegt. +- Erste Einstellung: Navigationsdarstellung mit den Modi `scroll` und + `groups`. +- Standard ist `scroll`, damit alle Menüpunkte auch bei kleinen Fenstern + erreichbar bleiben. + +## Erste UI-Seiten: Organization und User + +Die ersten UI-Seiten bilden den Onboarding-Flow ab. Fachlich geht es um eine +Firma, technisch um `organization`. + +### Seite: Öffentliche Registrierung + +Ziel: + +- Eine neue Organization für den öffentlichen SaaS-Betrieb registrieren. +- Einen ersten User mit E-Mail-Adresse vormerken. +- Noch kein produktiver Zugriff vor Admin-Freischaltung. + +Route: + +- Web: `/register` +- Desktop: nicht erforderlich für öffentliche SaaS-Registrierung in der ersten + Stufe + +Felder: + +- `organization_name`, UI-Label `Firmenname` +- `email`, UI-Label `E-Mail-Adresse` +- `accept_terms`, UI-Label `Nutzungsbedingungen akzeptieren`, falls später nötig + +Validierung: + +- Firmenname ist Pflichtfeld +- Firmenname mindestens 2 Zeichen +- E-Mail ist Pflichtfeld +- E-Mail muss formal gültig sein +- Absenden mehrfach verhindern, solange Request läuft + +Primäre Aktion: + +- `Registrierung absenden` + +API: + +- `POST /api/v1/registration/organization` + +Request: + +```json +{ + "organization_name": "Muster GmbH", + "email": "admin@example.com" +} +``` + +Erfolgszustand: + +- UI zeigt, dass die Registrierung eingegangen ist. +- Hinweis: Freischaltung erfolgt durch Administrator. +- Kein Login-Link mit Zugriff suggerieren. + +Fehlerzustände: + +- E-Mail bereits registriert und bereits aktiver User +- Organization mit ähnlichem Namen existiert bereits +- Registrierung bereits offen +- Server nicht erreichbar +- Validierungsfehler + +Sicherheits-/Betriebshinweise: + +- Rate-Limit serverseitig +- keine Auskunft, ob eine E-Mail bereits bei einer anderen Firma aktiv ist +- Fehlermeldungen allgemein genug halten, um User Enumeration zu vermeiden + +### Seite: Admin-Liste Registrierungen + +Ziel: + +- Betreiber-Admin sieht neue Organization-Registrierungen. +- Admin kann prüfen, freischalten oder ablehnen. + +Route: + +- Web: `/admin/organization-registrations` +- Desktop: später optional, erste Stufe Web + +Tabelle: + +- Firmenname +- E-Mail-Adresse +- Status +- Eingegangen am +- Entschieden am +- Entschieden von + +Filter: + +- offen +- freigeschaltet +- abgelehnt +- gesperrt + +Aktionen: + +- Details öffnen +- Freischalten +- Ablehnen +- E-Mail erneut senden, falls bereits freigeschaltet +- technischen Anlageversuch wiederholen + +API: + +- `GET /api/v1/admin/organization-registrations` + +### Seite: Admin-Detail Registrierung + +Ziel: + +- Eine einzelne Registrierung prüfen und entscheiden. + +Route: + +- Web: `/admin/organization-registrations/:id` + +Angezeigte Daten: + +- Firmenname +- E-Mail-Adresse +- Status +- Zeitstempel +- technische Organization-ID, falls schon erzeugt +- Schema-Name, falls schon erzeugt +- Fehler der Schema-Erstellung, falls vorhanden + +Aktionen: + +- `Freischalten` +- `Ablehnen` +- `Zurück zur Liste` +- `Einladungs-E-Mail erneut senden` +- `Schema-Erstellung wiederholen` + +Freischalten: + +- erzeugt oder aktiviert `public.organizations` +- erzeugt `company_` +- erzeugt Basistabellen, Standardrollen und Standardrechte +- ordnet ersten User als `owner` zu +- erzeugt Initialpasswort +- setzt `must_change_password` +- legt E-Mail in `public.email_outbox` + +Ablehnen: + +- setzt Status `rejected` +- speichert optional internen Entscheidungsvermerk +- erzeugt kein Firmenschema + +API: + +- `GET /api/v1/admin/organization-registrations/{id}` +- `POST /api/v1/admin/organization-registrations/{id}/approve` +- `POST /api/v1/admin/organization-registrations/{id}/reject` +- `POST /api/v1/admin/organization-registrations/{id}/resend-initial-email` +- `POST /api/v1/admin/organization-registrations/{id}/retry-provisioning` + +### Seite: Erster Login mit Initialpasswort + +Ziel: + +- Der erste User meldet sich mit E-Mail und Initialpasswort an. +- Danach muss sofort das Passwort geändert werden. + +Route: + +- Web: `/login` +- Desktop: Login-Dialog im nativen Client + +Felder: + +- `email`, UI-Label `E-Mail-Adresse` +- `password`, UI-Label `Passwort` + +API: + +- `POST /api/v1/auth/login` + +Besondere Zustände: + +- `must_change_password = true`: UI leitet direkt zur Passwortänderung weiter +- Organization noch nicht aktiv: UI zeigt neutralen Hinweis +- Initialpasswort abgelaufen: UI zeigt Hinweis auf erneute Einladung oder Support + +### Seite: Passwort beim ersten Login ändern + +Ziel: + +- User ersetzt Initialpasswort durch eigenes Passwort. + +Route: + +- Web: `/change-initial-password` +- Desktop: eigener Dialog direkt nach Login + +Felder: + +- `current_password`, UI-Label `Aktuelles Passwort` +- `new_password`, UI-Label `Neues Passwort` +- `new_password_confirm`, UI-Label `Neues Passwort wiederholen` + +Validierung: + +- neues Passwort erfüllt Passwortrichtlinie +- Wiederholung stimmt überein +- neues Passwort darf nicht dem Initialpasswort entsprechen + +API: + +- `POST /api/v1/auth/change-initial-password` + +Erfolgszustand: + +- `must_change_password` wird entfernt +- Sessions mit altem Passwortstatus werden ungültig +- User wird zur Organization-Auswahl oder direkt ins Dashboard geleitet + +### Seite: Organization-Grunddaten nach erstem Login + +Ziel: + +- Der erste User ergänzt nach Freischaltung die Stammdaten der Firma. + +Route: + +- Web: `/setup/organization` +- Desktop: Setup-Dialog nach Login + +Felder erste Stufe: + +- Firmenname +- Rechtsform +- Straße und Hausnummer +- PLZ +- Ort +- Land +- USt-IdNr., optional +- E-Mail der Firma +- Telefonnummer, optional +- Standard-Steuersatz +- Standard-Zahlungsziel + +API: + +- `GET /api/v1/organizations/current/setup` +- `PUT /api/v1/organizations/current/setup` + +Erfolgszustand: + +- Organization-Setup wird als abgeschlossen markiert +- User gelangt zum Dashboard + +### Seite: User für Organization anlegen/einladen + +Ziel: + +- Ein berechtigter Firmen-User lädt weitere User ein. + +Route: + +- Web: `/settings/users` +- Desktop: `Benutzerrechte` + +Felder Einladung: + +- `email`, UI-Label `E-Mail-Adresse` +- `roles`, UI-Label `Rollen` + +Aktionen: + +- `Einladung senden` +- `Einladung erneut senden` +- `User deaktivieren` +- `Rollen ändern` + +API: + +- `GET /api/v1/organizations/current/users` +- `POST /api/v1/organizations/current/invitations` +- `PATCH /api/v1/organizations/current/users/{user_id}/roles` +- `POST /api/v1/organizations/current/invitations/{id}/resend` +- `PATCH /api/v1/organizations/current/users/{user_id}/roles` +- `POST /api/v1/organizations/current/users/{user_id}/disable` + +Besonderheiten: + +- Existierender globaler User bekommt keine Passwortüberschreibung. +- Neuer User bekommt Initialpasswort und `must_change_password`. +- Rollen werden im Firmenschema gespeichert. + +### UI-Zustände und Komponenten + +Gemeinsame Zustände: + +- `idle` +- `validating` +- `submitting` +- `success` +- `error` + +Wiederverwendbare Komponenten: + +- Formularfeld mit Validierungsfehler +- Passwortfeld +- Statushinweis +- Tabellenliste mit Filter +- Bestätigungsdialog +- Fehlerbanner + +Texte: + +- UI-Texte deutsch +- technische IDs nur in Admin-Detailseiten anzeigen +- keine internen Schema- oder Security-Details auf öffentlichen Seiten + +### Erste Implementierungsreihenfolge UI + +1. Öffentliche Registrierungsseite +2. Login-Seite +3. Passwortänderung beim ersten Login +4. Admin-Liste Registrierungen +5. Admin-Detail mit Freischalten/Ablehnen +6. Organization-Grunddaten-Setup +7. Benutzerverwaltung mit Einladungen + +## Erster Datenmodell-Entwurf + +Dieser Abschnitt ist noch kein finales SQL-Schema, aber die Grundlage für die +ersten Migrationen. + +### `public.users` + +Globale Benutzeraccounts. + +Felder: + +- `id` +- `email` +- `display_name` +- `password_hash`, nullable bei reinem SSO-Account +- `is_active` +- `must_change_password` +- `initial_password_expires_at` +- `created_at` +- `updated_at` +- `last_login_at` + +### `public.organizations` + +Globale Firmenliste zur Zuordnung von Usern zu Firmenschemas. + +Felder: + +- `id` +- `display_name` +- `schema_name` +- `status` +- `registration_email` +- `approved_by_user_id` +- `approved_at` +- `rejected_by_user_id` +- `rejected_at` +- `rejection_reason` +- `created_at` +- `updated_at` + +Der `schema_name` muss eindeutig sein und darf nur vom Backend erzeugt werden. +Vor der Admin-Freischaltung kann `schema_name` leer bleiben, wenn das +Firmenschema erst nach Freigabe erzeugt wird. + +### `public.user_organizations` + +Zuordnung von Usern zu Firmen. + +Felder: + +- `user_id` +- `organization_id` +- `status` +- `invited_by_user_id` +- `invited_at` +- `accepted_at` +- `created_at` +- `updated_at` + +Rollen werden hier bewusst nicht gespeichert. Die eigentlichen Rollen liegen im +Firmenschema. + +Mögliche Statuswerte: + +- `pending_invitation` +- `active` +- `disabled` + +### `public.auth_identities` + +Verknüpfung von Usern mit Login-Methoden. + +Felder: + +- `id` +- `user_id` +- `provider` +- `provider_subject` +- `email_at_provider` +- `created_at` +- `updated_at` + +Beispiele für `provider`: + +- `password` +- `oidc` +- `saml` +- `microsoft` +- `google` + +### `public.refresh_tokens` + +Session-/Token-Verwaltung. + +Felder: + +- `id` +- `user_id` +- `organization_id`, nullable solange keine Firma gewählt ist +- `token_hash` +- `expires_at` +- `revoked_at` +- `revoked_reason` +- `user_agent` +- `created_ip` +- `created_at` + +### `public.socket_tokens` + +Kurzlebige Tokens für WebSocket-Verbindungen. Diese Tabelle ist optional, wenn +Socket-Tokens als signierte, sehr kurzlebige Tokens ohne serverseitige Speicherung +umgesetzt werden. + +Felder: + +- `id` +- `user_id` +- `organization_id` +- `token_hash` +- `expires_at` +- `used_at` +- `revoked_at` +- `created_at` + +### `public.session_keys` + +Metadaten zu aktiven Session-Schlüsseln. Rohes Schlüsselmaterial darf nicht im +Klartext in PostgreSQL gespeichert werden. + +Felder: + +- `id` +- `user_id` +- `organization_id` +- `key_id` +- `wrapped_key`, falls serverseitige Wiederaufnahme nötig ist +- `algorithm` +- `created_at` +- `expires_at` +- `revoked_at` + +Wenn Session-Schlüssel nur im Arbeitsspeicher gehalten werden, kann diese Tabelle +entfallen oder nur Widerrufs-/Audit-Metadaten enthalten. + +### `public.idempotency_keys` + +Schutz gegen doppelte Ausführung kritischer REST-Aktionen. + +Felder: + +- `id` +- `user_id` +- `organization_id` +- `key` +- `request_hash` +- `response_status` +- `response_body_json` +- `expires_at` +- `created_at` + +### Verschlüsselte Fachfelder + +Für fachliche Tabellen wird ein einheitliches Muster verwendet. + +Mögliche Feldstruktur: + +- `*_ciphertext` +- `*_nonce` +- `*_tag` +- `*_key_id` + +Alternativ kann ein JSONB- oder BYTEA-Container genutzt werden: + +- `encrypted_payload` +- `encryption_meta` + +Entscheidungskriterium: + +- einzelne verschlüsselte Felder sind besser, wenn Teile eines Datensatzes + getrennt aktualisiert werden +- ein verschlüsselter Payload-Container ist einfacher, wenn Datensätze meistens + komplett gelesen und geschrieben werden + +### `public.organization_registration_requests` + +Optional separate Tabelle für SaaS-Registrierungen. Wenn die Registrierung direkt +in `public.organizations` abgebildet wird, ist diese Tabelle nicht zwingend nötig. + +Felder: + +- `id` +- `organization_name` +- `email` +- `status` +- `organization_id` +- `requested_at` +- `decided_by_user_id` +- `decided_at` +- `decision_note` + +Vorteil einer separaten Tabelle: + +- abgelehnte Registrierungen bleiben nachvollziehbar +- `public.organizations` enthält nur Firmen, die technisch angelegt werden sollen +- Admin-Freischaltung ist sauberer auditierbar + +### `public.user_invitations` + +Einladungen von Firmen-Usern an neue oder bestehende User. + +Felder: + +- `id` +- `organization_id` +- `email` +- `invited_by_user_id` +- `status` +- `expires_at` +- `accepted_at` +- `created_user_id` +- `created_at` + +Mögliche Statuswerte: + +- `pending` +- `accepted` +- `expired` +- `revoked` + +### `public.email_outbox` + +Queue für systemseitige E-Mails. + +Felder: + +- `id` +- `recipient_email` +- `template` +- `payload_json` +- `status` +- `attempt_count` +- `last_error` +- `send_after` +- `sent_at` +- `created_at` + +Verwendung: + +- Initialpasswort nach Admin-Freischaltung +- Einladung neuer Firmen-User +- erneuter Versand durch Administrator +- spätere Passwort-Reset-Mails + +### `company_*.settings` + +Firmeneinstellungen. + +Felder: + +- `key` +- `value_json` +- `updated_by_user_id` +- `updated_at` + +Beispiele: + +- Freigabeprozess für Angebote aktiv +- Standard-Steuersatz +- Standard-Zahlungsbedingungen +- Dokumentvorlage für Angebote +- Dokumentvorlage für Rechnungen + +### `company_*.roles` + +Feste Standardrollen, aber je Firma gespeichert, damit Rechte später erweitert +oder angepasst werden können. + +Felder: + +- `id` +- `code` +- `name` +- `description` +- `is_system_role` +- `created_at` +- `updated_at` + +### `company_*.permissions` + +Atomare Rechte. + +Felder: + +- `id` +- `code` +- `description` + +Beispiele: + +- `customers.read` +- `customers.write` +- `customers.delete` +- `quotes.approve` +- `invoices.finalize` +- `settings.write` + +### `company_*.role_permissions` + +Zuordnung von Rollen zu Rechten. + +Felder: + +- `role_id` +- `permission_id` + +### `company_*.user_roles` + +Zuordnung globaler User zu Rollen in dieser Firma. + +Felder: + +- `user_id` +- `role_id` +- `created_at` + +Der `user_id` verweist logisch auf `public.users.id`. Ein echter Foreign Key über +Schemas hinweg ist möglich, muss aber bewusst entschieden werden. + +### `company_*.number_ranges` + +Konfigurierbare Nummernkreise. + +Felder: + +- `id` +- `code` +- `pattern` +- `counter_value` +- `counter_padding` +- `reset_rule` +- `is_active` +- `updated_at` + +Regeln: + +- `pattern` muss einen Counter-Platzhalter enthalten. +- Counter-Erhöhung muss transaktional und konkurrenzsicher erfolgen. +- Finale Rechnungsnummern dürfen nach Vergabe nicht wiederverwendet werden. +- Standardformat ist ein Präfix plus neunstelliger, gruppierter Zähler: + `K000.000.001`, `L000.000.001`, `I000.000.001`, + `A000.000.001`, `R000.000.001`. +- Standard-Nummernkreise: + `customers = K{counter}`, `suppliers = L{counter}`, + `items = I{counter}`, `activities = A{counter}`, + `outgoing_invoices = R{counter}`. +- Ergänzende Nummernkreise nach gleichem Prinzip: + `incoming_invoices = ER{counter}`, `quotes = AN{counter}`. + +### `company_*.audit_log` + +Revisions- und Nachvollziehbarkeitslog. + +Felder: + +- `id` +- `actor_user_id` +- `action` +- `entity_type` +- `entity_id` +- `before_json` +- `after_json` +- `created_at` + +Für sehr große Installationen kann dieses Log später partitioniert werden. + +### `company_*.change_log` + +Grundlage für Live-Updates und Offline-Synchronisation. + +Felder: + +- `id` +- `sequence` +- `entity_type` +- `entity_id` +- `operation` +- `payload_json` +- `created_at` +- `created_by_user_id` + +Nutzung: + +- WebSocket-Events werden daraus erzeugt oder darauf gespiegelt. +- Desktopclients können seit ihrer letzten `sequence` Änderungen nachladen. +- Offline-Sync wird dadurch planbar. + +### `company_*.documents` und `company_*.document_versions` + +Metadaten für Dateien auf dem Filesystem. + +`documents`: + +- `id` +- `entity_type` +- `entity_id` +- `title` +- `current_version_id` +- `created_at` +- `created_by_user_id` + +`document_versions`: + +- `id` +- `document_id` +- `version_number` +- `storage_path` +- `mime_type` +- `sha256` +- `size_bytes` +- `created_at` +- `created_by_user_id` + +## Implementierungsreihenfolge + +Empfohlene Reihenfolge für die nächsten Entwicklungsschritte: + +1. `public`-Migrationen für User, Firmen und Zuordnungen +2. SaaS-Registrierung mit Status `pending_approval` +3. Admin-Freischaltung und Backend-Service zur Firmenschema-Erstellung +4. Mailversand für Initialpasswort und Einladungen +5. Firmenschema-Basismigrationen für Rollen, Rechte, Settings, Nummernkreise, + Audit-Log und Change-Log +6. Login ohne SSO, aber mit Architektur für spätere Provider +7. erzwungener Passwortwechsel beim ersten Login +8. Firmenauswahl nach Login +9. User-Einladung in bestehende Firma +10. mandantenbewusste REST- und WebSocket-Basisschicht +11. erstes Fachmodul `customers` +12. Live-Update für `customers` +13. Dashboard-Grundlage +14. Artikelmodul und CSV-Import + +SSO, 2FA, Desktop-Offline und automatische Updates sind wichtig, sollten aber nach +der mandantenfähigen Grundarchitektur kommen. Andernfalls müssten sie später +gegen eine noch instabile Daten- und Sessionstruktur gebaut werden. + +## TODOs + +### Erledigte Planungsentscheidungen + +- [x] SaaS-Betrieb mit vielen Firmen auf einer Instanz +- [x] öffentlicher Server wird selbst betrieben +- [x] jede Firma bekommt eigenes PostgreSQL-Schema +- [x] `public` enthält nur globale User- und Firmenzuordnung +- [x] Rollen, Rechte und Einstellungen liegen im Firmenschema +- [x] ein User kann mehreren Firmen angehören +- [x] Zielmarkt erste Stufe: Deutschland +- [x] REST-API zusätzlich zum WebSocket-Protokoll +- [x] Webhooks einplanen +- [x] Desktopclient mit Offline-Fähigkeit +- [x] automatische Desktopclient-Updates einplanen +- [x] Dokumente im Filesystem, Metadaten in PostgreSQL +- [x] öffentliche Registrierung für SaaS +- [x] Admin-Freischaltung neuer Firmen +- [x] Registrierung mit Firmenname und E-Mail-Adresse +- [x] E-Mail-Adresse ist Username +- [x] Initialpasswort per E-Mail +- [x] Passwortwechsel beim ersten Login verpflichtend +- [x] neue Firmen-User werden per Einladung hinzugefügt +- [x] lokale Version erlaubt genau eine Firma +- [x] SaaS-Kommunikation ausschließlich über HTTPS/WSS +- [x] lokale produktive Kommunikation ebenfalls ausschließlich über HTTPS/WSS +- [x] Reverse Proxy übernimmt TLS-Terminierung +- [x] WebSocket-Protokoll wird versioniert +- [x] WebSocket-Verbindungen werden per Token authentifiziert +- [x] Webhooks werden signiert +- [x] fachliche Payloads werden zusätzlich zu HTTPS/WSS sessionbasiert verschlüsselt +- [x] fachliche Daten werden in PostgreSQL nicht im Klartext gespeichert +- [x] pro Firma wird ein eigener Datenschlüssel geplant +- [x] technischer Mandantenname ist `organization` +- [x] Schema-Namenskonvention ist `company_` + +### Architektur + +- [x] Alle tabellen/namen sind englisch, werden aber in der UI deutsch angezeigt +- [x] endgültigen Namen für Mandantenobjekt festlegen: `Firma`, `Organisation` oder `Company`: organization +- [x] Schema-Namenskonvention final festlegen: company_ +- [ ] `public`-Tabellen detailliert entwerfen +- [ ] Firmenschema-Tabellen detailliert entwerfen +- [ ] Migrationsstrategie für neue und bestehende Firmenschemas festlegen: erst am schluss nötig +- [ ] sichere Kapselung für firmenschema-bewusste Datenbankzugriffe entwerfen +- [ ] Socket-Protokoll versionieren +- [ ] REST-API-Versionierung festlegen +- [ ] Event-Topics und Berechtigungsprüfung definieren +- [ ] Fehler- und Reconnect-Verhalten für Clients definieren +- [ ] fensterbasiertes Live-Refresh- und Store-Konzept final spezifizieren +- [ ] Offline-Sync-Strategie für Desktopclient spezifizieren +- [ ] SaaS-Onboarding-Flow final spezifizieren +- [ ] lokale Erstinstallation final spezifizieren +- [ ] E-Mail-Versandarchitektur festlegen +- [ ] Token-Modell final festlegen: JWT, opaque Tokens oder Hybrid +- [ ] WebSocket-Handshake final spezifizieren +- [ ] Idempotency-Key-Strategie für kritische REST-Aktionen festlegen +- [ ] Secret-Verschlüsselung für Lieferanten-API-Zugangsdaten spezifizieren +- [ ] Reconnect- und `since_sequence`-Sync formal spezifizieren +- [ ] lokale Zertifikatsstrategie final festlegen +- [ ] Debug-/Entwicklungsmodus klar vom produktiven Verschlüsselungsmodell trennen +- [ ] Session-Key-Aushandlung final spezifizieren +- [ ] AEAD-Algorithmus final auswählen +- [ ] Schlüsselhierarchie für Master Key, Firmenschlüssel und Session-Schlüssel spezifizieren +- [ ] Key-Rotation und Re-Encryption-Konzept planen +- [ ] Such-/Indexstrategie für verschlüsselte Daten planen +- [ ] festlegen, welche technischen Metadaten unverschlüsselt bleiben dürfen + +### Backend + +- [ ] öffentliche Registrierungs-API implementieren +- [ ] Admin-Freischaltungs-API implementieren +- [ ] Organization-Registration-Detail-API implementieren +- [ ] Initial-E-Mail erneut senden implementieren +- [ ] Provisioning-Retry implementieren +- [ ] Admin-Oberfläche für Registrierungsfreigaben anbinden +- [ ] Initialpasswort-Erzeugung implementieren +- [ ] E-Mail-Outbox implementieren +- [ ] Passwortwechsel beim ersten Login erzwingen +- [ ] User-Einladungen implementieren +- [ ] lokalen Setup-Modus für genau eine Firma implementieren +- [ ] Authentifizierung implementieren +- [ ] SSO-Provider-Konzept festlegen +- [ ] 2FA-Verfahren festlegen +- [ ] Firmenauswahl nach Login implementieren +- [ ] Rollen- und Rechtesystem im Firmenschema implementieren +- [ ] Firmenschema-Erstellung implementieren +- [ ] Public-Migrationen implementieren +- [ ] Firmenschema-Migrationen implementieren +- [ ] Live-Event-Bus je Firma einbauen +- [ ] Audit-Logging je Firmenschema ergänzen +- [ ] Datei-Upload und Dokumentablage implementieren +- [ ] PDF-Erzeugung evaluieren +- [ ] REST-API-Grundstruktur implementieren +- [ ] Webhook-Versand implementieren +- [ ] HTTPS/WSS-Betrieb hinter Reverse Proxy dokumentieren +- [ ] Access-/Refresh-Token-Handling implementieren +- [ ] WebSocket-Token oder WebSocket-Auth implementieren +- [ ] WebSocket-Handshake mit Protokollversion implementieren +- [ ] Live-Event-Typen je Entity definieren +- [ ] `since_sequence`-Nachlade-API für verpasste Live-Events implementieren +- [ ] Idempotency Keys für kritische POST-Endpunkte implementieren +- [ ] Verschlüsselung gespeicherter API-Secrets implementieren +- [ ] Session-Key-Verwaltung implementieren +- [ ] REST-Payload-Verschlüsselung implementieren +- [ ] WebSocket-Payload-Verschlüsselung implementieren +- [ ] Datenbank-Verschlüsselungsservice implementieren +- [ ] Firmenschlüssel-Erzeugung bei Firmenschema-Anlage implementieren +- [ ] Entschlüsselung in Logs, Audit-Log und Change-Log verhindern + +### Datenmodell + +- [ ] Firmenmodell in `public` detaillieren +- [ ] User- und Firmenzuordnung detaillieren +- [ ] Registrierungsanforderungen detaillieren +- [ ] User-Einladungen detaillieren +- [ ] E-Mail-Outbox detaillieren +- [ ] Passwortstatus und Initialpasswort-Ablauf detaillieren +- [ ] Refresh-Token-Modell detaillieren +- [ ] Socket-Token-Modell detaillieren +- [ ] Session-Key-Metadaten detaillieren +- [ ] Idempotency-Key-Modell detaillieren +- [ ] verschlüsselte Feldstruktur festlegen +- [ ] unverschlüsselte technische Metadaten je Tabelle festlegen +- [ ] Such-/Indexfelder für verschlüsselte Daten modellieren +- [ ] Rollenmodell detaillieren +- [ ] Rechtemodell detaillieren +- [ ] Kundenmodell detaillieren +- [ ] Lieferantenmodell detaillieren +- [ ] Artikelmodell detaillieren +- [ ] Kundenpreisbedingungsmodell (`customer_price_terms`) detaillieren +- [ ] Lieferantenpreisbedingungsmodell (`supplier_price_terms`) detaillieren +- [ ] Skonto-Regelmodell (`cash_discount_terms`) detaillieren +- [ ] Lagerbewegungsmodell detaillieren +- [ ] Angebotsmodell detaillieren +- [ ] Angebotsversionsmodell detaillieren +- [ ] Ausgangsrechnungsmodell detaillieren +- [ ] Rechnungspositionsmodell mit Artikelpflicht und Preisüberschreibung detaillieren +- [ ] Eingangsrechnungsmodell detaillieren +- [ ] Kommunikationsmodell detaillieren +- [ ] Vorgangsmodell (`activities`) detaillieren +- [ ] Vorgangsverknüpfungen (`activity_links`) detaillieren +- [ ] Aufgaben-/Wiedervorlagemodell detaillieren +- [ ] Dokument- und Dokumentversionsmodell detaillieren +- [ ] Preisquellen- und Preisregelmodell detaillieren +- [ ] Rabatt- und Skonto-Vererbungsregeln definieren +- [ ] Importmapping-Modell detaillieren + +### Artikelimporte und Preise + +- [ ] Beispielpreislisten sammeln +- [ ] CSV-Import als ersten Importweg implementieren +- [ ] XML-Import planen +- [ ] JSON-Import planen +- [ ] Spalten-/Feldmapping definieren +- [ ] Importvalidierung definieren +- [ ] Importhistorie definieren +- [ ] Preisneuberechnung nach Import spezifizieren +- [ ] Staffelpreise modellieren +- [ ] kundenspezifische Preise modellieren +- [ ] Projektpreise modellieren +- [ ] Lieferanten-API-Connector-Schnittstelle entwerfen +- [ ] Grenzen frei konfigurierbarer API-Connectoren dokumentieren + +### Frontends + +- [ ] gemeinsames UI-Konzept für Web und Desktop definieren +- [ ] Login-Flow für beide Clients planen +- [ ] Firmenauswahl planen +- [ ] öffentliche Registrierungsseite planen +- [ ] Admin-Liste für Organization-Registrierungen planen +- [ ] Admin-Detail für Organization-Freischaltung planen +- [ ] Passwortänderung beim ersten Login planen +- [ ] Organization-Grunddaten-Setup planen +- [ ] Benutzerverwaltung und Einladungen planen +- [ ] Dashboard entwerfen +- [ ] Kundenmaske entwerfen +- [ ] Lieferantenmaske entwerfen +- [ ] Artikelmaske entwerfen +- [ ] Lagermaske entwerfen +- [ ] Angebotsmaske mit Versionierung entwerfen +- [ ] Rechnungsmasken entwerfen +- [ ] Artikelpflicht und Preisüberschreibung in Rechnungsmasken entwerfen +- [ ] Kommunikationsverlauf entwerfen +- [ ] Vorgangstimeline entwerfen +- [ ] Vorgangsmaske mit Typen, Status, Priorität und Verknüpfungen entwerfen +- [ ] Aufgaben-/Wiedervorlagemaske entwerfen +- [ ] Dokumentverwaltung entwerfen +- [ ] Importassistent entwerfen +- [ ] Live-Refresh-Verhalten je Maske festlegen +- [ ] fensterübergreifende Aktualisierung von Listen, Suchdialogen und Auswahlfeldern planen +- [ ] Konfliktverhalten bei parallelen Fensteränderungen planen +- [ ] Offline-Verhalten im Desktopclient je Maske festlegen +- [ ] sichere Token-Speicherung im Desktopclient planen +- [ ] sichere Session-Key-Speicherung im Desktopclient planen +- [ ] Verschlüsselung des lokalen Offline-Caches planen +- [ ] Verbindungsstatus und TLS-Warnungen im Desktopclient planen +- [ ] Update-Mechanismus für Desktopclient auswählen + +### Betrieb + +- [ ] Docker-Setup für Backend und PostgreSQL erweitern +- [ ] TLS/Reverse-Proxy-Konzept für öffentlichen Betrieb definieren +- [ ] Zertifikatsstrategie festlegen +- [ ] Caddy, Traefik oder Nginx als Startoption auswählen +- [ ] lokale Zertifikatserzeugung für Installationsprogramm planen +- [ ] Security Header und HTTPS-Redirect konfigurieren +- [ ] Backup- und Restore-Konzept je Firma erstellen +- [ ] Logging und Monitoring planen +- [ ] Konfiguration für lokalen und öffentlichen Betrieb trennen +- [ ] Update-Strategie für Backend festlegen +- [ ] Update-Strategie für Desktopclient festlegen +- [ ] Dateisystem-Speicherlayout für Dokumente definieren +- [ ] Speicherquoten je Firma planen + +### Rechtliches und Buchhaltung + +- [ ] deutsche Steuerlogik detaillieren +- [ ] Elster-relevante Datenfelder identifizieren +- [ ] Revisionssichere Rechnungsablage konzipieren +- [ ] Storno-/Korrekturrechnungsprozess definieren +- [ ] Nummernkreisregeln und Platzhalter definieren +- [ ] spätere DATEV-Erweiterung vorbereiten +- [ ] spätere E-Rechnungs-Erweiterung vorbereiten + +## Nächster sinnvoller Schritt + +Als nächstes sollte das Datenmodell für `public` und das Firmenschema konkretisiert +werden. Besonders wichtig sind: + +1. `users`, `organizations`, `user_organizations` und Login/SSO/2FA +2. Rollen und atomare Rechte im Firmenschema +3. Nummernkreise und revisionssichere Rechnungen +4. Änderungslog für Live-Updates und spätere Offline-Synchronisation diff --git a/README.md b/README.md new file mode 100644 index 0000000..c4990a8 --- /dev/null +++ b/README.md @@ -0,0 +1,76 @@ +# Company Tool + +Mehrprojekt-Struktur für eine firmeninterne Software mit Rust-Backend, PostgreSQL, +Webfrontend und klassischem Desktopclient. + +## Projekte + +- `backend/`: Rust-Backend mit PostgreSQL-Anbindung und WebSocket-Kommunikation +- `web-frontend/`: Browserbasiertes Frontend mit Vue 3, Vite und TypeScript +- `desktop-client/`: Nativer Client für Linux, Windows und macOS mit egui/eframe +- `shared-protocol/`: Gemeinsame Rust-Typen für Socket-Nachrichten + +## Kommunikation + +Das Backend stellt einen WebSocket unter `ws://localhost:8080/ws` bereit. Die +Verbindung beginnt mit einem `hello`-Handshake. Danach werden fachliche +Nachrichten als AES-256-GCM-verschlüsselte Envelopes übertragen. + +## PostgreSQL starten + +Ausführliche Installationsschritte stehen in [INSTALL.md](INSTALL.md). +Betriebsnotizen zu Schlüsseln, E-Mail, Backup und TLS stehen in +[BETRIEB.md](BETRIEB.md). + +```bash +cp .env.example .env +docker compose up -d postgres +``` + +## Backend starten + +```bash +cargo run -p companytool-backend +``` + +## Kommunikation testen + +In einem Terminal Backend starten, dann in einem zweiten Terminal: + +```bash +COMMUNICATION_TEST_MODE=1 cargo run -p companytool-backend +``` + +```bash +node scripts/communication-test.mjs +``` + +Optional gegen eine andere URL: + +```bash +node scripts/communication-test.mjs ws://localhost:8080/ws +``` + +Der Test öffnet zwei Clients, führt den verschlüsselten Handshake aus, +entschlüsselt Snapshots, sendet eine verschlüsselte Ping-Nachricht und prüft, ob +beide Clients ein verschlüsseltes Pong-Event erhalten. + +## Webfrontend starten + +```bash +cd web-frontend +npm install +npm run dev +``` + +## Desktopclient starten + +```bash +cargo run -p companytool-desktop-client +``` + +Mit explizitem Backend: + +```bash +cargo run -p companytool-desktop-client -- --api-url http://127.0.0.1:8080 --ws-url ws://127.0.0.1:8080/ws +``` diff --git a/backend/Cargo.toml b/backend/Cargo.toml new file mode 100644 index 0000000..88cd023 --- /dev/null +++ b/backend/Cargo.toml @@ -0,0 +1,25 @@ +[package] +name = "companytool-backend" +version = "0.1.0" +edition.workspace = true +license.workspace = true + +[dependencies] +anyhow = "1" +argon2 = "0.5" +axum = { version = "0.7", features = ["ws"] } +base64 = "0.22" +chrono = { version = "0.4", features = ["serde"] } +companytool-shared-protocol = { path = "../shared-protocol" } +dotenvy = "0.15" +futures-util = "0.3" +rand_core = { version = "0.6", features = ["getrandom"] } +serde = { version = "1", features = ["derive"] } +serde_json = "1" +sha2 = "0.10" +sqlx = { version = "0.8", features = ["runtime-tokio-rustls", "postgres", "uuid", "chrono"] } +tokio = { version = "1", features = ["macros", "rt-multi-thread", "signal", "sync"] } +tower-http = { version = "0.6", features = ["cors", "trace"] } +tracing = "0.1" +tracing-subscriber = { version = "0.3", features = ["env-filter"] } +uuid = { version = "1", features = ["v4"] } diff --git a/backend/Dockerfile b/backend/Dockerfile new file mode 100644 index 0000000..abfc751 --- /dev/null +++ b/backend/Dockerfile @@ -0,0 +1,13 @@ +FROM rust:1-bookworm AS builder +WORKDIR /app +COPY . . +RUN cargo build --release -p companytool-backend + +FROM debian:bookworm-slim +RUN apt-get update \ + && apt-get install -y --no-install-recommends ca-certificates \ + && rm -rf /var/lib/apt/lists/* +WORKDIR /app +COPY --from=builder /app/target/release/companytool-backend /usr/local/bin/companytool-backend +EXPOSE 8080 +CMD ["companytool-backend"] diff --git a/backend/company-migrations/0001_company_base.sql b/backend/company-migrations/0001_company_base.sql new file mode 100644 index 0000000..f23daf2 --- /dev/null +++ b/backend/company-migrations/0001_company_base.sql @@ -0,0 +1,80 @@ +-- Template migration for each organization schema. +-- Replace {schema} with the real schema name, e.g. company_. + +create table if not exists {schema}.settings ( + key text primary key, + value_ciphertext bytea not null, + value_nonce bytea not null, + value_key_id text not null, + updated_by_user_id uuid, + updated_at timestamptz not null default now() +); + +create table if not exists {schema}.roles ( + id uuid primary key, + code text not null unique, + name text not null, + description text, + is_system_role boolean not null default true, + created_at timestamptz not null default now(), + updated_at timestamptz not null default now() +); + +create table if not exists {schema}.permissions ( + id uuid primary key, + code text not null unique, + description text +); + +create table if not exists {schema}.role_permissions ( + role_id uuid not null references {schema}.roles(id) on delete cascade, + permission_id uuid not null references {schema}.permissions(id) on delete cascade, + primary key (role_id, permission_id) +); + +create table if not exists {schema}.user_roles ( + user_id uuid not null, + role_id uuid not null references {schema}.roles(id) on delete cascade, + created_at timestamptz not null default now(), + primary key (user_id, role_id) +); + +create table if not exists {schema}.number_ranges ( + id uuid primary key, + code text not null unique, + pattern text not null, + counter_value bigint not null default 0, + counter_padding integer not null default 0, + reset_rule text, + is_active boolean not null default true, + updated_at timestamptz not null default now(), + constraint number_ranges_pattern_has_counter check (position('{counter}' in pattern) > 0) +); + +create table if not exists {schema}.audit_log ( + id uuid primary key, + actor_user_id uuid, + action text not null, + entity_type text not null, + entity_id uuid, + before_ciphertext bytea, + before_nonce bytea, + before_key_id text, + after_ciphertext bytea, + after_nonce bytea, + after_key_id text, + created_at timestamptz not null default now() +); + +create table if not exists {schema}.change_log ( + id uuid primary key, + sequence bigserial not null unique, + entity_type text not null, + entity_id uuid not null, + operation text not null, + payload_ciphertext bytea not null, + payload_nonce bytea not null, + payload_key_id text not null, + created_at timestamptz not null default now(), + created_by_user_id uuid +); diff --git a/backend/company-migrations/0002_activity_price_invoice_rules.sql b/backend/company-migrations/0002_activity_price_invoice_rules.sql new file mode 100644 index 0000000..7017954 --- /dev/null +++ b/backend/company-migrations/0002_activity_price_invoice_rules.sql @@ -0,0 +1,360 @@ +-- Template migration for each organization schema. +-- Replace {schema} with the real schema name, e.g. company_. + +create table if not exists {schema}.customers ( + id uuid primary key, + customer_number text unique, + name_ciphertext bytea not null, + name_nonce bytea not null, + name_key_id text not null, + status text not null default 'active', + created_at timestamptz not null default now(), + updated_at timestamptz not null default now(), + constraint customers_status_valid check (status in ('active', 'inactive', 'blocked')) +); + +create table if not exists {schema}.suppliers ( + id uuid primary key, + supplier_number text unique, + name_ciphertext bytea not null, + name_nonce bytea not null, + name_key_id text not null, + status text not null default 'active', + created_at timestamptz not null default now(), + updated_at timestamptz not null default now(), + constraint suppliers_status_valid check (status in ('active', 'inactive', 'blocked')) +); + +create table if not exists {schema}.items ( + id uuid primary key, + item_number text not null unique, + name_ciphertext bytea not null, + name_nonce bytea not null, + name_key_id text not null, + unit text not null default 'Stk', + tax_rate numeric(7, 4) not null default 19.0, + default_purchase_price numeric(14, 4), + default_sales_price numeric(14, 4), + status text not null default 'active', + created_at timestamptz not null default now(), + updated_at timestamptz not null default now(), + constraint items_status_valid check (status in ('active', 'inactive', 'blocked')), + constraint items_tax_rate_non_negative check (tax_rate >= 0), + constraint items_default_purchase_price_non_negative check ( + default_purchase_price is null or default_purchase_price >= 0 + ), + constraint items_default_sales_price_non_negative check ( + default_sales_price is null or default_sales_price >= 0 + ) +); + +create table if not exists {schema}.cash_discount_terms ( + id uuid primary key, + code text not null unique, + name text not null, + discount_percent numeric(7, 4) not null, + discount_days integer not null, + net_days integer, + valid_from date, + valid_until date, + is_default_customer_term boolean not null default false, + is_default_supplier_term boolean not null default false, + is_active boolean not null default true, + created_at timestamptz not null default now(), + updated_at timestamptz not null default now(), + constraint cash_discount_terms_percent_valid check ( + discount_percent >= 0 and discount_percent <= 100 + ), + constraint cash_discount_terms_days_valid check ( + discount_days >= 0 and (net_days is null or net_days >= discount_days) + ), + constraint cash_discount_terms_valid_range check ( + valid_until is null or valid_from is null or valid_until >= valid_from + ) +); + +create unique index if not exists idx_cash_discount_terms_default_customer + on {schema}.cash_discount_terms (is_default_customer_term) + where is_default_customer_term; + +create unique index if not exists idx_cash_discount_terms_default_supplier + on {schema}.cash_discount_terms (is_default_supplier_term) + where is_default_supplier_term; + +create table if not exists {schema}.customer_price_terms ( + id uuid primary key, + customer_id uuid not null references {schema}.customers(id) on delete cascade, + standard_discount_percent numeric(7, 4) not null default 0, + cash_discount_term_id uuid references {schema}.cash_discount_terms(id), + valid_from date, + valid_until date, + is_active boolean not null default true, + created_at timestamptz not null default now(), + updated_at timestamptz not null default now(), + constraint customer_price_terms_discount_valid check ( + standard_discount_percent >= 0 and standard_discount_percent <= 100 + ), + constraint customer_price_terms_valid_range check ( + valid_until is null or valid_from is null or valid_until >= valid_from + ) +); + +create index if not exists idx_customer_price_terms_customer_active + on {schema}.customer_price_terms (customer_id, is_active, valid_from, valid_until); + +create table if not exists {schema}.supplier_price_terms ( + id uuid primary key, + supplier_id uuid not null references {schema}.suppliers(id) on delete cascade, + standard_discount_percent numeric(7, 4) not null default 0, + cash_discount_term_id uuid references {schema}.cash_discount_terms(id), + payment_days integer, + valid_from date, + valid_until date, + is_active boolean not null default true, + created_at timestamptz not null default now(), + updated_at timestamptz not null default now(), + constraint supplier_price_terms_discount_valid check ( + standard_discount_percent >= 0 and standard_discount_percent <= 100 + ), + constraint supplier_price_terms_payment_days_valid check ( + payment_days is null or payment_days >= 0 + ), + constraint supplier_price_terms_valid_range check ( + valid_until is null or valid_from is null or valid_until >= valid_from + ) +); + +create index if not exists idx_supplier_price_terms_supplier_active + on {schema}.supplier_price_terms (supplier_id, is_active, valid_from, valid_until); + +create table if not exists {schema}.activities ( + id uuid primary key, + activity_type text not null, + title_ciphertext bytea not null, + title_nonce bytea not null, + title_key_id text not null, + body_ciphertext bytea, + body_nonce bytea, + body_key_id text, + status text not null default 'open', + priority text not null default 'normal', + due_at timestamptz, + starts_at timestamptz, + ends_at timestamptz, + assigned_to_user_id uuid, + created_by_user_id uuid, + completed_by_user_id uuid, + completed_at timestamptz, + visibility text not null default 'internal', + system_source text, + created_at timestamptz not null default now(), + updated_at timestamptz not null default now(), + constraint activities_type_valid check ( + activity_type in ( + 'email_note', + 'phone_note', + 'internal_note', + 'task', + 'follow_up', + 'calendar_event', + 'system_event', + 'work_step' + ) + ), + constraint activities_status_valid check ( + status in ('open', 'in_progress', 'done', 'cancelled') + ), + constraint activities_priority_valid check ( + priority in ('low', 'normal', 'high', 'critical') + ), + constraint activities_visibility_valid check ( + visibility in ('internal', 'organization') + ), + constraint activities_body_encryption_complete check ( + ( + body_ciphertext is null + and body_nonce is null + and body_key_id is null + ) + or ( + body_ciphertext is not null + and body_nonce is not null + and body_key_id is not null + ) + ), + constraint activities_time_range_valid check ( + ends_at is null or starts_at is null or ends_at >= starts_at + ) +); + +create index if not exists idx_activities_status_due + on {schema}.activities (status, due_at); + +create index if not exists idx_activities_assigned_status + on {schema}.activities (assigned_to_user_id, status); + +create table if not exists {schema}.activity_links ( + activity_id uuid not null references {schema}.activities(id) on delete cascade, + entity_type text not null, + entity_id uuid not null, + created_at timestamptz not null default now(), + primary key (activity_id, entity_type, entity_id), + constraint activity_links_entity_type_valid check ( + entity_type in ( + 'customer', + 'supplier', + 'contact', + 'quote', + 'outgoing_invoice', + 'incoming_invoice', + 'item', + 'document', + 'import' + ) + ) +); + +create index if not exists idx_activity_links_entity + on {schema}.activity_links (entity_type, entity_id); + +create table if not exists {schema}.outgoing_invoices ( + id uuid primary key, + invoice_number text unique, + customer_id uuid not null references {schema}.customers(id), + status text not null default 'draft', + cash_discount_term_id uuid references {schema}.cash_discount_terms(id), + issued_at date, + due_at date, + created_by_user_id uuid, + created_at timestamptz not null default now(), + updated_at timestamptz not null default now(), + finalized_at timestamptz, + constraint outgoing_invoices_status_valid check ( + status in ('draft', 'finalized', 'sent', 'paid', 'cancelled', 'overdue') + ) +); + +create index if not exists idx_outgoing_invoices_customer_status + on {schema}.outgoing_invoices (customer_id, status); + +create table if not exists {schema}.outgoing_invoice_items ( + id uuid primary key, + invoice_id uuid not null references {schema}.outgoing_invoices(id) on delete cascade, + line_number integer not null, + item_id uuid not null references {schema}.items(id), + description_ciphertext bytea, + description_nonce bytea, + description_key_id text, + quantity numeric(14, 4) not null, + unit_price numeric(14, 4) not null, + original_unit_price numeric(14, 4), + discount_percent numeric(7, 4) not null default 0, + price_overridden boolean not null default false, + price_override_reason_ciphertext bytea, + price_override_reason_nonce bytea, + price_override_reason_key_id text, + price_overridden_by_user_id uuid, + price_overridden_at timestamptz, + tax_rate numeric(7, 4) not null, + created_at timestamptz not null default now(), + updated_at timestamptz not null default now(), + unique (invoice_id, line_number), + constraint outgoing_invoice_items_quantity_positive check (quantity > 0), + constraint outgoing_invoice_items_unit_price_non_negative check (unit_price >= 0), + constraint outgoing_invoice_items_original_price_non_negative check ( + original_unit_price is null or original_unit_price >= 0 + ), + constraint outgoing_invoice_items_discount_valid check ( + discount_percent >= 0 and discount_percent <= 100 + ), + constraint outgoing_invoice_items_tax_rate_non_negative check (tax_rate >= 0), + constraint outgoing_invoice_items_description_encryption_complete check ( + ( + description_ciphertext is null + and description_nonce is null + and description_key_id is null + ) + or ( + description_ciphertext is not null + and description_nonce is not null + and description_key_id is not null + ) + ), + constraint outgoing_invoice_items_override_reason_encryption_complete check ( + ( + price_override_reason_ciphertext is null + and price_override_reason_nonce is null + and price_override_reason_key_id is null + ) + or ( + price_override_reason_ciphertext is not null + and price_override_reason_nonce is not null + and price_override_reason_key_id is not null + ) + ), + constraint outgoing_invoice_items_override_complete check ( + ( + price_overridden = false + and price_overridden_by_user_id is null + and price_overridden_at is null + ) + or ( + price_overridden = true + and price_overridden_by_user_id is not null + and price_overridden_at is not null + ) + ) +); + +create index if not exists idx_outgoing_invoice_items_item + on {schema}.outgoing_invoice_items (item_id); + +create table if not exists {schema}.incoming_invoices ( + id uuid primary key, + invoice_number text, + supplier_id uuid not null references {schema}.suppliers(id), + status text not null default 'draft', + cash_discount_term_id uuid references {schema}.cash_discount_terms(id), + invoice_date date, + due_at date, + created_by_user_id uuid, + created_at timestamptz not null default now(), + updated_at timestamptz not null default now(), + constraint incoming_invoices_status_valid check ( + status in ('draft', 'received', 'approved', 'paid', 'cancelled', 'overdue') + ) +); + +create index if not exists idx_incoming_invoices_supplier_status + on {schema}.incoming_invoices (supplier_id, status); + +create table if not exists {schema}.incoming_invoice_items ( + id uuid primary key, + invoice_id uuid not null references {schema}.incoming_invoices(id) on delete cascade, + line_number integer not null, + item_id uuid references {schema}.items(id), + description_ciphertext bytea, + description_nonce bytea, + description_key_id text, + quantity numeric(14, 4) not null, + unit_price numeric(14, 4) not null, + tax_rate numeric(7, 4) not null, + created_at timestamptz not null default now(), + updated_at timestamptz not null default now(), + unique (invoice_id, line_number), + constraint incoming_invoice_items_quantity_positive check (quantity > 0), + constraint incoming_invoice_items_unit_price_non_negative check (unit_price >= 0), + constraint incoming_invoice_items_tax_rate_non_negative check (tax_rate >= 0), + constraint incoming_invoice_items_description_encryption_complete check ( + ( + description_ciphertext is null + and description_nonce is null + and description_key_id is null + ) + or ( + description_ciphertext is not null + and description_nonce is not null + and description_key_id is not null + ) + ) +); diff --git a/backend/company-migrations/0003_customer_details.sql b/backend/company-migrations/0003_customer_details.sql new file mode 100644 index 0000000..c12213a --- /dev/null +++ b/backend/company-migrations/0003_customer_details.sql @@ -0,0 +1,45 @@ +-- Additional encrypted customer fields for organization schemas. + +alter table {schema}.customers + add column if not exists details_ciphertext bytea, + add column if not exists details_nonce bytea, + add column if not exists details_key_id text; + +alter table {schema}.customers + drop constraint if exists customers_details_encryption_complete; + +alter table {schema}.customers + add constraint customers_details_encryption_complete check ( + ( + details_ciphertext is null + and details_nonce is null + and details_key_id is null + ) + or ( + details_ciphertext is not null + and details_nonce is not null + and details_key_id is not null + ) + ); + +alter table {schema}.suppliers + add column if not exists details_ciphertext bytea, + add column if not exists details_nonce bytea, + add column if not exists details_key_id text; + +alter table {schema}.suppliers + drop constraint if exists suppliers_details_encryption_complete; + +alter table {schema}.suppliers + add constraint suppliers_details_encryption_complete check ( + ( + details_ciphertext is null + and details_nonce is null + and details_key_id is null + ) + or ( + details_ciphertext is not null + and details_nonce is not null + and details_key_id is not null + ) + ); diff --git a/backend/company-migrations/0004_item_price_history.sql b/backend/company-migrations/0004_item_price_history.sql new file mode 100644 index 0000000..9da9979 --- /dev/null +++ b/backend/company-migrations/0004_item_price_history.sql @@ -0,0 +1,22 @@ +-- Template migration for each organization schema. +-- Replace {schema} with the real schema name, e.g. company_. + +create table if not exists {schema}.item_price_history ( + id uuid primary key, + item_id uuid not null references {schema}.items(id) on delete cascade, + purchase_price numeric(14, 4), + sales_price numeric(14, 4), + source text not null default 'manual', + valid_from timestamptz not null default now(), + created_by_user_id uuid, + created_at timestamptz not null default now(), + constraint item_price_history_purchase_price_non_negative check ( + purchase_price is null or purchase_price >= 0 + ), + constraint item_price_history_sales_price_non_negative check ( + sales_price is null or sales_price >= 0 + ) +); + +create index if not exists idx_item_price_history_item_valid_from + on {schema}.item_price_history (item_id, valid_from desc); diff --git a/backend/company-migrations/0005_numbered_activities.sql b/backend/company-migrations/0005_numbered_activities.sql new file mode 100644 index 0000000..29ba3dc --- /dev/null +++ b/backend/company-migrations/0005_numbered_activities.sql @@ -0,0 +1,9 @@ +-- Template migration for each organization schema. +-- Replace {schema} with the real schema name, e.g. company_. + +alter table {schema}.activities + add column if not exists activity_number text; + +create unique index if not exists idx_activities_activity_number + on {schema}.activities (activity_number) + where activity_number is not null; diff --git a/backend/company-migrations/0006_update_number_range_prefixes.sql b/backend/company-migrations/0006_update_number_range_prefixes.sql new file mode 100644 index 0000000..b0612e7 --- /dev/null +++ b/backend/company-migrations/0006_update_number_range_prefixes.sql @@ -0,0 +1,22 @@ +-- Template migration for each organization schema. +-- Replace {schema} with the real schema name, e.g. company_. + +update {schema}.number_ranges +set pattern = 'KU{counter}', updated_at = now() +where code = 'customers'; + +update {schema}.number_ranges +set pattern = 'LI{counter}', updated_at = now() +where code = 'suppliers'; + +update {schema}.number_ranges +set pattern = 'AR{counter}', updated_at = now() +where code = 'items'; + +update {schema}.number_ranges +set pattern = 'AK{counter}', updated_at = now() +where code = 'activities'; + +update {schema}.number_ranges +set pattern = 'AR{counter}', updated_at = now() +where code = 'outgoing_invoices'; diff --git a/backend/company-migrations/0007_quotes.sql b/backend/company-migrations/0007_quotes.sql new file mode 100644 index 0000000..dff091e --- /dev/null +++ b/backend/company-migrations/0007_quotes.sql @@ -0,0 +1,82 @@ +-- Template migration for each organization schema. +-- Replace {schema} with the real schema name, e.g. company_. + +create table if not exists {schema}.quotes ( + id uuid primary key, + quote_number text not null unique, + customer_id uuid not null references {schema}.customers(id), + status text not null default 'draft', + valid_until date, + cash_discount_term_id uuid references {schema}.cash_discount_terms(id), + customer_discount_percent numeric(7, 4) not null default 0, + notes_ciphertext bytea, + notes_nonce bytea, + notes_key_id text, + created_by_user_id uuid, + created_at timestamptz not null default now(), + updated_at timestamptz not null default now(), + constraint quotes_status_valid check ( + status in ('draft', 'sent', 'accepted', 'rejected', 'expired', 'cancelled') + ), + constraint quotes_customer_discount_valid check ( + customer_discount_percent >= 0 and customer_discount_percent <= 100 + ), + constraint quotes_notes_encryption_complete check ( + ( + notes_ciphertext is null + and notes_nonce is null + and notes_key_id is null + ) + or ( + notes_ciphertext is not null + and notes_nonce is not null + and notes_key_id is not null + ) + ) +); + +create index if not exists idx_quotes_customer_status + on {schema}.quotes (customer_id, status); + +create table if not exists {schema}.quote_items ( + id uuid primary key, + quote_id uuid not null references {schema}.quotes(id) on delete cascade, + line_number integer not null, + item_id uuid not null references {schema}.items(id), + description_ciphertext bytea, + description_nonce bytea, + description_key_id text, + quantity numeric(14, 4) not null, + unit_price numeric(14, 4) not null, + original_unit_price numeric(14, 4), + discount_percent numeric(7, 4) not null default 0, + price_overridden boolean not null default false, + tax_rate numeric(7, 4) not null, + created_at timestamptz not null default now(), + updated_at timestamptz not null default now(), + unique (quote_id, line_number), + constraint quote_items_quantity_positive check (quantity > 0), + constraint quote_items_unit_price_non_negative check (unit_price >= 0), + constraint quote_items_original_price_non_negative check ( + original_unit_price is null or original_unit_price >= 0 + ), + constraint quote_items_discount_valid check ( + discount_percent >= 0 and discount_percent <= 100 + ), + constraint quote_items_tax_rate_non_negative check (tax_rate >= 0), + constraint quote_items_description_encryption_complete check ( + ( + description_ciphertext is null + and description_nonce is null + and description_key_id is null + ) + or ( + description_ciphertext is not null + and description_nonce is not null + and description_key_id is not null + ) + ) +); + +create index if not exists idx_quote_items_item + on {schema}.quote_items (item_id); diff --git a/backend/company-migrations/0008_invoice_links.sql b/backend/company-migrations/0008_invoice_links.sql new file mode 100644 index 0000000..5943808 --- /dev/null +++ b/backend/company-migrations/0008_invoice_links.sql @@ -0,0 +1,19 @@ +-- Template migration for each organization schema. +-- Replace {schema} with the real schema name, e.g. company_. + +alter table {schema}.outgoing_invoices + add column if not exists source_quote_id uuid references {schema}.quotes(id); + +alter table {schema}.outgoing_invoices + add column if not exists customer_discount_percent numeric(7, 4) not null default 0; + +alter table {schema}.outgoing_invoices + drop constraint if exists outgoing_invoices_customer_discount_valid; + +alter table {schema}.outgoing_invoices + add constraint outgoing_invoices_customer_discount_valid check ( + customer_discount_percent >= 0 and customer_discount_percent <= 100 + ); + +create index if not exists idx_outgoing_invoices_source_quote + on {schema}.outgoing_invoices (source_quote_id); diff --git a/backend/company-migrations/0009_price_imports.sql b/backend/company-migrations/0009_price_imports.sql new file mode 100644 index 0000000..ea7876a --- /dev/null +++ b/backend/company-migrations/0009_price_imports.sql @@ -0,0 +1,71 @@ +-- Template migration for each organization schema. +-- Replace {schema} with the real schema name, e.g. company_. + +create table if not exists {schema}.imports ( + id uuid primary key, + import_type text not null, + source_name text not null, + status text not null default 'previewed', + total_rows integer not null default 0, + applied_rows integer not null default 0, + error_rows integer not null default 0, + created_by_user_id uuid, + created_at timestamptz not null default now(), + finished_at timestamptz, + constraint imports_type_valid check (import_type in ('price_list', 'api_price_sync')), + constraint imports_status_valid check (status in ('previewed', 'applied', 'failed')) +); + +create table if not exists {schema}.import_mappings ( + id uuid primary key, + code text not null unique, + name text not null, + delimiter text not null default ';', + item_number_column text not null default 'item_number', + name_column text not null default 'name', + unit_column text not null default 'unit', + tax_rate_column text not null default 'tax_rate', + purchase_price_column text not null default 'purchase_price', + sales_price_column text not null default 'sales_price', + is_default boolean not null default false, + created_at timestamptz not null default now(), + updated_at timestamptz not null default now() +); + +create unique index if not exists idx_import_mappings_default + on {schema}.import_mappings (is_default) + where is_default; + +create table if not exists {schema}.price_rules ( + id uuid primary key, + code text not null unique, + name text not null, + source_type text not null default 'import', + source_id uuid, + markup_percent numeric(7, 4) not null default 0, + rounding_mode text not null default 'none', + is_active boolean not null default true, + created_at timestamptz not null default now(), + updated_at timestamptz not null default now(), + constraint price_rules_source_type_valid check (source_type in ('import', 'api', 'supplier')), + constraint price_rules_markup_valid check (markup_percent >= -100 and markup_percent <= 1000), + constraint price_rules_rounding_mode_valid check (rounding_mode in ('none', 'cent', 'five_cent', 'ten_cent', 'whole')) +); + +create table if not exists {schema}.api_connectors ( + id uuid primary key, + code text not null unique, + name text not null, + connector_type text not null, + config_ciphertext bytea not null, + config_nonce bytea not null, + config_key_id text not null, + is_active boolean not null default true, + sync_interval_minutes integer, + last_sync_at timestamptz, + created_at timestamptz not null default now(), + updated_at timestamptz not null default now(), + constraint api_connectors_interval_valid check ( + sync_interval_minutes is null or sync_interval_minutes > 0 + ) +); diff --git a/backend/company-migrations/0010_communications_documents.sql b/backend/company-migrations/0010_communications_documents.sql new file mode 100644 index 0000000..d3b7dd5 --- /dev/null +++ b/backend/company-migrations/0010_communications_documents.sql @@ -0,0 +1,153 @@ +-- Template migration for each organization schema. +-- Replace {schema} with the real schema name, e.g. company_. + +create table if not exists {schema}.communications ( + id uuid primary key, + communication_type text not null, + direction text not null, + subject_ciphertext bytea not null, + subject_nonce bytea not null, + subject_key_id text not null, + body_ciphertext bytea, + body_nonce bytea, + body_key_id text, + status text not null default 'open', + occurred_at timestamptz, + created_by_user_id uuid, + created_at timestamptz not null default now(), + updated_at timestamptz not null default now(), + constraint communications_type_valid check ( + communication_type in ('email', 'phone', 'letter', 'meeting', 'internal_note') + ), + constraint communications_direction_valid check ( + direction in ('inbound', 'outbound', 'internal') + ), + constraint communications_status_valid check ( + status in ('open', 'done', 'archived') + ), + constraint communications_body_encryption_complete check ( + ( + body_ciphertext is null + and body_nonce is null + and body_key_id is null + ) + or ( + body_ciphertext is not null + and body_nonce is not null + and body_key_id is not null + ) + ) +); + +create index if not exists idx_communications_type_status + on {schema}.communications (communication_type, status, occurred_at desc); + +create table if not exists {schema}.communication_links ( + communication_id uuid not null references {schema}.communications(id) on delete cascade, + entity_type text not null, + entity_id uuid not null, + created_at timestamptz not null default now(), + primary key (communication_id, entity_type, entity_id), + constraint communication_links_entity_type_valid check ( + entity_type in ( + 'customer', + 'supplier', + 'activity', + 'quote', + 'outgoing_invoice', + 'incoming_invoice', + 'item', + 'document' + ) + ) +); + +create index if not exists idx_communication_links_entity + on {schema}.communication_links (entity_type, entity_id); + +create table if not exists {schema}.documents ( + id uuid primary key, + title_ciphertext bytea not null, + title_nonce bytea not null, + title_key_id text not null, + description_ciphertext bytea, + description_nonce bytea, + description_key_id text, + status text not null default 'active', + created_by_user_id uuid, + created_at timestamptz not null default now(), + updated_at timestamptz not null default now(), + constraint documents_status_valid check (status in ('active', 'archived', 'deleted')), + constraint documents_description_encryption_complete check ( + ( + description_ciphertext is null + and description_nonce is null + and description_key_id is null + ) + or ( + description_ciphertext is not null + and description_nonce is not null + and description_key_id is not null + ) + ) +); + +create table if not exists {schema}.document_versions ( + id uuid primary key, + document_id uuid not null references {schema}.documents(id) on delete cascade, + version_no integer not null, + file_name_ciphertext bytea not null, + file_name_nonce bytea not null, + file_name_key_id text not null, + content_type_ciphertext bytea not null, + content_type_nonce bytea not null, + content_type_key_id text not null, + file_size bigint not null, + storage_path text not null, + checksum_sha256 text not null, + uploaded_by_user_id uuid, + created_at timestamptz not null default now(), + unique (document_id, version_no), + constraint document_versions_file_size_valid check (file_size >= 0) +); + +create index if not exists idx_document_versions_document_version + on {schema}.document_versions (document_id, version_no desc); + +create table if not exists {schema}.document_links ( + document_id uuid not null references {schema}.documents(id) on delete cascade, + entity_type text not null, + entity_id uuid not null, + created_at timestamptz not null default now(), + primary key (document_id, entity_type, entity_id), + constraint document_links_entity_type_valid check ( + entity_type in ( + 'customer', + 'supplier', + 'activity', + 'communication', + 'quote', + 'outgoing_invoice', + 'incoming_invoice', + 'item' + ) + ) +); + +create index if not exists idx_document_links_entity + on {schema}.document_links (entity_type, entity_id); + +create table if not exists {schema}.document_audit_log ( + id uuid primary key, + document_id uuid not null references {schema}.documents(id) on delete cascade, + version_id uuid references {schema}.document_versions(id) on delete set null, + action text not null, + user_id uuid, + created_at timestamptz not null default now(), + constraint document_audit_log_action_valid check ( + action in ('upload', 'download', 'archive') + ) +); + +create index if not exists idx_document_audit_log_document + on {schema}.document_audit_log (document_id, created_at desc); diff --git a/backend/company-migrations/0011_user_settings.sql b/backend/company-migrations/0011_user_settings.sql new file mode 100644 index 0000000..15d5592 --- /dev/null +++ b/backend/company-migrations/0011_user_settings.sql @@ -0,0 +1,9 @@ +create table if not exists {schema}.user_settings ( + user_id uuid not null, + key text not null, + value_ciphertext bytea not null, + value_nonce bytea not null, + value_key_id text not null, + updated_at timestamptz not null default now(), + primary key (user_id, key) +); diff --git a/backend/company-migrations/0012_item_supplier_prices.sql b/backend/company-migrations/0012_item_supplier_prices.sql new file mode 100644 index 0000000..1f0167f --- /dev/null +++ b/backend/company-migrations/0012_item_supplier_prices.sql @@ -0,0 +1,28 @@ +alter table {schema}.items + add column if not exists manufacturer_code text; + +create table if not exists {schema}.item_supplier_prices ( + id uuid primary key, + item_id uuid not null references {schema}.items(id) on delete cascade, + supplier_id uuid not null references {schema}.suppliers(id) on delete cascade, + external_item_number text not null, + purchase_price numeric(14, 4) not null, + currency text not null default 'EUR', + is_preferred boolean not null default false, + valid_from date, + valid_until date, + source text not null default 'manual', + created_at timestamptz not null default now(), + updated_at timestamptz not null default now(), + constraint item_supplier_prices_purchase_price_non_negative check (purchase_price >= 0), + constraint item_supplier_prices_currency_valid check (char_length(currency) = 3), + constraint item_supplier_prices_valid_range check ( + valid_until is null or valid_from is null or valid_until >= valid_from + ) +); + +create unique index if not exists idx_item_supplier_prices_supplier_external + on {schema}.item_supplier_prices (supplier_id, external_item_number); + +create index if not exists idx_item_supplier_prices_item + on {schema}.item_supplier_prices (item_id, purchase_price); diff --git a/backend/migrations/20260521170000_public_core.sql b/backend/migrations/20260521170000_public_core.sql new file mode 100644 index 0000000..b8137d5 --- /dev/null +++ b/backend/migrations/20260521170000_public_core.sql @@ -0,0 +1,94 @@ +create table if not exists users ( + id uuid primary key, + email text not null unique, + display_name_ciphertext bytea, + display_name_nonce bytea, + display_name_key_id text, + password_hash text, + is_active boolean not null default true, + must_change_password boolean not null default false, + initial_password_expires_at timestamptz, + created_at timestamptz not null default now(), + updated_at timestamptz not null default now(), + last_login_at timestamptz, + constraint users_email_lowercase check (email = lower(email)), + constraint users_display_name_encryption_complete check ( + ( + display_name_ciphertext is null + and display_name_nonce is null + and display_name_key_id is null + ) + or ( + display_name_ciphertext is not null + and display_name_nonce is not null + and display_name_key_id is not null + ) + ) +); + +create table if not exists organizations ( + id uuid primary key, + display_name_ciphertext bytea, + display_name_nonce bytea, + display_name_key_id text, + schema_name text unique, + status text not null default 'pending_approval', + registration_email text not null, + setup_completed_at timestamptz, + approved_by_user_id uuid references users(id), + approved_at timestamptz, + rejected_by_user_id uuid references users(id), + rejected_at timestamptz, + rejection_reason text, + created_at timestamptz not null default now(), + updated_at timestamptz not null default now(), + constraint organizations_status_valid check ( + status in ('pending_approval', 'approved', 'active', 'rejected', 'suspended') + ), + constraint organizations_registration_email_lowercase check (registration_email = lower(registration_email)), + constraint organizations_schema_name_valid check ( + schema_name is null or schema_name ~ '^company_[a-z0-9_]+$' + ), + constraint organizations_display_name_encryption_complete check ( + ( + display_name_ciphertext is null + and display_name_nonce is null + and display_name_key_id is null + ) + or ( + display_name_ciphertext is not null + and display_name_nonce is not null + and display_name_key_id is not null + ) + ) +); + +create table if not exists user_organizations ( + user_id uuid not null references users(id) on delete cascade, + organization_id uuid not null references organizations(id) on delete cascade, + status text not null default 'pending_invitation', + invited_by_user_id uuid references users(id), + invited_at timestamptz, + accepted_at timestamptz, + created_at timestamptz not null default now(), + updated_at timestamptz not null default now(), + primary key (user_id, organization_id), + constraint user_organizations_status_valid check ( + status in ('pending_invitation', 'active', 'disabled') + ) +); + +create table if not exists organization_domains ( + id uuid primary key, + organization_id uuid not null references organizations(id) on delete cascade, + domain text not null unique, + is_primary boolean not null default false, + created_at timestamptz not null default now(), + constraint organization_domains_domain_lowercase check (domain = lower(domain)) +); + +create index if not exists idx_user_organizations_organization_id + on user_organizations (organization_id); + +create index if not exists idx_organizations_status + on organizations (status); diff --git a/backend/migrations/20260521171000_public_auth_sessions.sql b/backend/migrations/20260521171000_public_auth_sessions.sql new file mode 100644 index 0000000..060e1cf --- /dev/null +++ b/backend/migrations/20260521171000_public_auth_sessions.sql @@ -0,0 +1,68 @@ +create table if not exists auth_identities ( + id uuid primary key, + user_id uuid not null references users(id) on delete cascade, + provider text not null, + provider_subject text not null, + email_at_provider text, + created_at timestamptz not null default now(), + updated_at timestamptz not null default now(), + unique (provider, provider_subject) +); + +create table if not exists refresh_tokens ( + id uuid primary key, + user_id uuid not null references users(id) on delete cascade, + organization_id uuid references organizations(id) on delete cascade, + token_hash text not null unique, + expires_at timestamptz not null, + revoked_at timestamptz, + revoked_reason text, + user_agent text, + created_ip text, + created_at timestamptz not null default now() +); + +create table if not exists socket_tokens ( + id uuid primary key, + user_id uuid not null references users(id) on delete cascade, + organization_id uuid not null references organizations(id) on delete cascade, + token_hash text not null unique, + expires_at timestamptz not null, + used_at timestamptz, + revoked_at timestamptz, + created_at timestamptz not null default now() +); + +create table if not exists session_keys ( + id uuid primary key, + user_id uuid not null references users(id) on delete cascade, + organization_id uuid not null references organizations(id) on delete cascade, + key_id text not null unique, + wrapped_key bytea, + algorithm text not null, + created_at timestamptz not null default now(), + expires_at timestamptz not null, + revoked_at timestamptz +); + +create table if not exists idempotency_keys ( + id uuid primary key, + user_id uuid not null references users(id) on delete cascade, + organization_id uuid references organizations(id) on delete cascade, + key text not null, + request_hash text not null, + response_status integer, + response_body_json jsonb, + expires_at timestamptz not null, + created_at timestamptz not null default now(), + unique (user_id, organization_id, key) +); + +create index if not exists idx_refresh_tokens_user_id + on refresh_tokens (user_id); + +create index if not exists idx_socket_tokens_user_organization + on socket_tokens (user_id, organization_id); + +create index if not exists idx_session_keys_user_organization + on session_keys (user_id, organization_id); diff --git a/backend/migrations/20260521172000_public_onboarding.sql b/backend/migrations/20260521172000_public_onboarding.sql new file mode 100644 index 0000000..58f13af --- /dev/null +++ b/backend/migrations/20260521172000_public_onboarding.sql @@ -0,0 +1,61 @@ +create table if not exists organization_registration_requests ( + id uuid primary key, + organization_name_ciphertext bytea not null, + organization_name_nonce bytea not null, + organization_name_key_id text not null, + email text not null, + status text not null default 'pending_approval', + organization_id uuid references organizations(id), + requested_at timestamptz not null default now(), + decided_by_user_id uuid references users(id), + decided_at timestamptz, + decision_note text, + constraint organization_registration_requests_email_lowercase check (email = lower(email)), + constraint organization_registration_requests_status_valid check ( + status in ('pending_approval', 'approved', 'active', 'rejected', 'suspended') + ) +); + +create table if not exists user_invitations ( + id uuid primary key, + organization_id uuid not null references organizations(id) on delete cascade, + email text not null, + invited_by_user_id uuid not null references users(id), + status text not null default 'pending', + expires_at timestamptz not null, + accepted_at timestamptz, + created_user_id uuid references users(id), + created_at timestamptz not null default now(), + constraint user_invitations_email_lowercase check (email = lower(email)), + constraint user_invitations_status_valid check ( + status in ('pending', 'accepted', 'expired', 'revoked') + ) +); + +create table if not exists email_outbox ( + id uuid primary key, + recipient_email text not null, + template text not null, + payload_ciphertext bytea not null, + payload_nonce bytea not null, + payload_key_id text not null, + status text not null default 'pending', + attempt_count integer not null default 0, + last_error text, + send_after timestamptz not null default now(), + sent_at timestamptz, + created_at timestamptz not null default now(), + constraint email_outbox_recipient_email_lowercase check (recipient_email = lower(recipient_email)), + constraint email_outbox_status_valid check ( + status in ('pending', 'sending', 'sent', 'failed') + ) +); + +create index if not exists idx_organization_registration_requests_status + on organization_registration_requests (status, requested_at); + +create index if not exists idx_user_invitations_organization_status + on user_invitations (organization_id, status); + +create index if not exists idx_email_outbox_status_send_after + on email_outbox (status, send_after); diff --git a/backend/migrations/20260521173000_communication_test_records.sql b/backend/migrations/20260521173000_communication_test_records.sql new file mode 100644 index 0000000..f5dab6c --- /dev/null +++ b/backend/migrations/20260521173000_communication_test_records.sql @@ -0,0 +1,9 @@ +create table if not exists records ( + id uuid primary key, + title text not null, + updated_at timestamptz not null +); + +insert into records (id, title, updated_at) +select '00000000-0000-0000-0000-000000000001'::uuid, 'Erster Datensatz', now() +where not exists (select 1 from records); diff --git a/backend/migrations/20260521174000_registration_terms.sql b/backend/migrations/20260521174000_registration_terms.sql new file mode 100644 index 0000000..694503b --- /dev/null +++ b/backend/migrations/20260521174000_registration_terms.sql @@ -0,0 +1,2 @@ +alter table organization_registration_requests + add column if not exists terms_accepted_at timestamptz; diff --git a/backend/migrations/20260601190000_security_operations.sql b/backend/migrations/20260601190000_security_operations.sql new file mode 100644 index 0000000..bb11fa0 --- /dev/null +++ b/backend/migrations/20260601190000_security_operations.sql @@ -0,0 +1,23 @@ +alter table user_invitations + add column if not exists token_hash text, + add column if not exists accepted_by_user_id uuid references users(id); + +create unique index if not exists idx_user_invitations_token_hash + on user_invitations (token_hash) + where token_hash is not null; + +create table if not exists password_reset_tokens ( + id uuid primary key, + user_id uuid not null references users(id) on delete cascade, + token_hash text not null unique, + expires_at timestamptz not null, + used_at timestamptz, + created_at timestamptz not null default now() +); + +create index if not exists idx_password_reset_tokens_user + on password_reset_tokens (user_id, expires_at); + +alter table email_outbox + add column if not exists subject text, + add column if not exists delivered_via text; diff --git a/backend/src/api.rs b/backend/src/api.rs new file mode 100644 index 0000000..91c93b5 --- /dev/null +++ b/backend/src/api.rs @@ -0,0 +1,6903 @@ +use argon2::{ + password_hash::{rand_core::OsRng, PasswordHash, PasswordHasher, PasswordVerifier, SaltString}, + Argon2, +}; +use axum::{ + extract::{Path, State}, + http::{HeaderMap, StatusCode}, + response::{IntoResponse, Response}, + Json, +}; +use base64::{engine::general_purpose::STANDARD as BASE64_STANDARD, Engine}; +use chrono::{DateTime, Utc}; +use companytool_shared_protocol::{RecordSummary, ServerMessage}; +use rand_core::RngCore; +use serde::{Deserialize, Serialize}; +use serde_json::json; +use sha2::{Digest, Sha256}; +use sqlx::{PgPool, Postgres, Row, Transaction}; +use std::{env, path::PathBuf}; +use uuid::Uuid; + +use crate::{crypto_at_rest::DataCrypto, AppState}; + +#[derive(Debug, Deserialize)] +pub struct RegisterOrganizationRequest { + pub organization_name: String, + pub email: String, + #[serde(default, alias = "terms_accepted")] + pub accept_terms: bool, +} + +#[derive(Debug, Deserialize)] +pub struct DevBootstrapLocalRequest { + pub organization_name: String, + pub email: String, +} + +#[derive(Debug, Deserialize)] +pub struct LoginRequest { + pub email: String, + pub password: String, +} + +#[derive(Debug, Deserialize)] +pub struct SelectOrganizationRequest { + pub organization_id: Uuid, +} + +#[derive(Debug, Deserialize)] +pub struct ChangeInitialPasswordRequest { + pub email: String, + pub current_password: String, + pub new_password: String, + pub new_password_confirm: String, +} + +#[derive(Debug, Deserialize)] +pub struct RequestPasswordResetRequest { + pub email: String, +} + +#[derive(Debug, Deserialize)] +pub struct ResetPasswordRequest { + pub token: String, + pub new_password: String, + pub new_password_confirm: String, +} + +#[derive(Debug, Deserialize)] +pub struct AcceptInvitationRequest { + pub token: String, + pub new_password: String, + pub new_password_confirm: String, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct OrganizationSetupRequest { + pub display_name: String, + pub legal_form: Option, + pub street: String, + pub postal_code: String, + pub city: String, + pub country: String, + pub vat_id: Option, + pub email: String, + pub phone: Option, + pub default_tax_rate: String, + pub default_payment_days: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct UserNavigationSettings { + pub mode: String, +} + +#[derive(Debug, Deserialize)] +pub struct NumberRangeRequest { + pub pattern: String, + pub counter_value: i64, + pub counter_padding: i32, + pub reset_rule: Option, + pub is_active: bool, +} + +#[derive(Debug, Serialize)] +pub struct NumberRangeResponse { + pub id: Uuid, + pub code: String, + pub pattern: String, + pub counter_value: i64, + pub counter_padding: i32, + pub reset_rule: Option, + pub is_active: bool, +} + +#[derive(Debug, Serialize)] +pub struct NextNumberResponse { + pub code: String, + pub number: String, +} + +#[derive(Debug, Deserialize)] +pub struct InviteUserRequest { + pub email: String, + #[serde(default)] + pub roles: Vec, +} + +#[derive(Debug, Deserialize)] +pub struct UpdateUserRolesRequest { + pub roles: Vec, +} + +#[derive(Debug, Clone, Default, Serialize, Deserialize)] +pub struct CustomerDetails { + pub street: String, + pub postal_code: String, + pub city: String, + pub country: String, + pub email: String, + pub phone: String, +} + +#[derive(Debug, Deserialize)] +pub struct CustomerRequest { + pub customer_number: String, + pub name: String, + pub status: String, + pub details: CustomerDetails, + pub standard_discount_percent: String, + pub cash_discount_term_id: Option, +} + +#[derive(Debug, Serialize)] +pub struct CustomerResponse { + pub id: Uuid, + pub customer_number: String, + pub name: String, + pub status: String, + pub details: CustomerDetails, + pub standard_discount_percent: String, + pub cash_discount_term_id: Option, +} + +#[derive(Debug, Deserialize)] +pub struct SupplierRequest { + pub supplier_number: String, + pub name: String, + pub status: String, + pub details: CustomerDetails, + pub standard_discount_percent: String, + pub cash_discount_term_id: Option, + pub payment_days: Option, +} + +#[derive(Debug, Serialize)] +pub struct SupplierResponse { + pub id: Uuid, + pub supplier_number: String, + pub name: String, + pub status: String, + pub details: CustomerDetails, + pub standard_discount_percent: String, + pub cash_discount_term_id: Option, + pub payment_days: Option, +} + +#[derive(Debug, Deserialize)] +pub struct ItemRequest { + pub item_number: String, + pub name: String, + pub unit: String, + pub tax_rate: String, + pub default_purchase_price: Option, + pub default_sales_price: Option, + pub status: String, +} + +#[derive(Debug, Serialize)] +pub struct ItemResponse { + pub id: Uuid, + pub item_number: String, + pub name: String, + pub unit: String, + pub tax_rate: String, + pub default_purchase_price: Option, + pub default_sales_price: Option, + pub status: String, +} + +#[derive(Debug, Serialize)] +pub struct ItemPriceHistoryResponse { + pub id: Uuid, + pub item_id: Uuid, + pub purchase_price: Option, + pub sales_price: Option, + pub source: String, + pub valid_from: DateTime, + pub created_by_user_id: Option, + pub created_at: DateTime, +} + +#[derive(Debug, Deserialize)] +pub struct CashDiscountTermRequest { + pub code: String, + pub name: String, + pub discount_percent: String, + pub discount_days: i32, + pub net_days: Option, + pub valid_from: Option, + pub valid_until: Option, + pub is_default_customer_term: bool, + pub is_default_supplier_term: bool, + pub is_active: bool, +} + +#[derive(Debug, Serialize)] +pub struct CashDiscountTermResponse { + pub id: Uuid, + pub code: String, + pub name: String, + pub discount_percent: String, + pub discount_days: i32, + pub net_days: Option, + pub valid_from: Option, + pub valid_until: Option, + pub is_default_customer_term: bool, + pub is_default_supplier_term: bool, + pub is_active: bool, +} + +#[derive(Debug, Deserialize)] +pub struct QuoteItemRequest { + pub item_id: Uuid, + pub description: String, + pub quantity: String, + pub unit_price: String, + pub original_unit_price: Option, + pub discount_percent: String, + pub tax_rate: String, +} + +#[derive(Debug, Deserialize)] +pub struct QuoteRequest { + pub quote_number: String, + pub customer_id: Uuid, + pub status: String, + pub valid_until: Option, + pub cash_discount_term_id: Option, + pub customer_discount_percent: String, + pub notes: String, + pub items: Vec, +} + +#[derive(Debug, Serialize)] +pub struct QuoteItemResponse { + pub id: Uuid, + pub line_number: i32, + pub item_id: Uuid, + pub description: String, + pub quantity: String, + pub unit_price: String, + pub original_unit_price: Option, + pub discount_percent: String, + pub tax_rate: String, + pub price_overridden: bool, +} + +#[derive(Debug, Serialize)] +pub struct QuoteResponse { + pub id: Uuid, + pub quote_number: String, + pub customer_id: Uuid, + pub status: String, + pub valid_until: Option, + pub cash_discount_term_id: Option, + pub customer_discount_percent: String, + pub notes: String, + pub items: Vec, +} + +#[derive(Debug, Deserialize)] +pub struct OutgoingInvoiceItemRequest { + pub item_id: Uuid, + pub description: String, + pub quantity: String, + pub unit_price: String, + pub original_unit_price: Option, + pub discount_percent: String, + pub tax_rate: String, +} + +#[derive(Debug, Deserialize)] +pub struct OutgoingInvoiceRequest { + pub invoice_number: String, + pub customer_id: Uuid, + pub status: String, + pub cash_discount_term_id: Option, + pub customer_discount_percent: String, + pub issued_at: Option, + pub due_at: Option, + pub source_quote_id: Option, + pub items: Vec, +} + +#[derive(Debug, Serialize)] +pub struct OutgoingInvoiceItemResponse { + pub id: Uuid, + pub line_number: i32, + pub item_id: Uuid, + pub description: String, + pub quantity: String, + pub unit_price: String, + pub original_unit_price: Option, + pub discount_percent: String, + pub tax_rate: String, + pub price_overridden: bool, +} + +#[derive(Debug, Serialize)] +pub struct OutgoingInvoiceResponse { + pub id: Uuid, + pub invoice_number: String, + pub customer_id: Uuid, + pub status: String, + pub cash_discount_term_id: Option, + pub customer_discount_percent: String, + pub issued_at: Option, + pub due_at: Option, + pub source_quote_id: Option, + pub finalized_at: Option>, + pub items: Vec, +} + +#[derive(Debug, Deserialize)] +pub struct IncomingInvoiceItemRequest { + pub item_id: Option, + pub description: String, + pub quantity: String, + pub unit_price: String, + pub tax_rate: String, +} + +#[derive(Debug, Deserialize)] +pub struct IncomingInvoiceRequest { + pub invoice_number: String, + pub supplier_id: Uuid, + pub status: String, + pub cash_discount_term_id: Option, + pub invoice_date: Option, + pub due_at: Option, + pub items: Vec, +} + +#[derive(Debug, Serialize)] +pub struct IncomingInvoiceItemResponse { + pub id: Uuid, + pub line_number: i32, + pub item_id: Option, + pub description: String, + pub quantity: String, + pub unit_price: String, + pub tax_rate: String, +} + +#[derive(Debug, Serialize)] +pub struct IncomingInvoiceResponse { + pub id: Uuid, + pub invoice_number: String, + pub supplier_id: Uuid, + pub status: String, + pub cash_discount_term_id: Option, + pub invoice_date: Option, + pub due_at: Option, + pub items: Vec, +} + +#[derive(Debug, Deserialize)] +pub struct PriceListImportRequest { + pub source_name: String, + pub content: String, + pub delimiter: Option, +} + +#[derive(Debug, Serialize)] +pub struct PriceListImportPreview { + pub rows: Vec, + pub total_rows: usize, + pub valid_rows: usize, + pub error_rows: usize, +} + +#[derive(Debug, Clone, Serialize)] +pub struct PriceListImportRow { + pub row_number: usize, + pub item_number: String, + pub name: String, + pub unit: String, + pub tax_rate: String, + pub purchase_price: Option, + pub sales_price: Option, + pub action: String, + pub error: Option, +} + +#[derive(Debug, Serialize)] +pub struct PriceListImportApplyResponse { + pub import_id: Uuid, + pub applied_rows: usize, + pub error_rows: usize, +} + +#[derive(Debug, Deserialize)] +pub struct ApiConnectorRequest { + pub code: String, + pub name: String, + pub connector_type: String, + pub config: serde_json::Value, + pub is_active: bool, + pub sync_interval_minutes: Option, +} + +#[derive(Debug, Serialize)] +pub struct ApiConnectorResponse { + pub id: Uuid, + pub code: String, + pub name: String, + pub connector_type: String, + pub config: serde_json::Value, + pub is_active: bool, + pub sync_interval_minutes: Option, + pub last_sync_at: Option>, +} + +#[derive(Debug, Deserialize)] +pub struct PriceRuleRequest { + pub code: String, + pub name: String, + pub source_type: String, + pub source_id: Option, + pub markup_percent: String, + pub rounding_mode: String, + pub is_active: bool, +} + +#[derive(Debug, Serialize)] +pub struct PriceRuleResponse { + pub id: Uuid, + pub code: String, + pub name: String, + pub source_type: String, + pub source_id: Option, + pub markup_percent: String, + pub rounding_mode: String, + pub is_active: bool, +} + +#[derive(Debug, Clone, Deserialize, Serialize)] +pub struct EntityLinkRequest { + pub entity_type: String, + pub entity_id: Uuid, +} + +#[derive(Debug, Deserialize)] +pub struct CommunicationRequest { + pub communication_type: String, + pub direction: String, + pub subject: String, + pub body: String, + pub status: String, + pub occurred_at: Option, + #[serde(default)] + pub links: Vec, +} + +#[derive(Debug, Serialize)] +pub struct CommunicationResponse { + pub id: Uuid, + pub communication_type: String, + pub direction: String, + pub subject: String, + pub body: String, + pub status: String, + pub occurred_at: Option>, + pub links: Vec, +} + +#[derive(Debug, Deserialize)] +pub struct DocumentUploadRequest { + pub title: String, + pub description: String, + pub file_name: String, + pub content_type: String, + pub content_base64: String, + #[serde(default)] + pub links: Vec, +} + +#[derive(Debug, Serialize)] +pub struct DocumentVersionResponse { + pub id: Uuid, + pub version_no: i32, + pub file_name: String, + pub content_type: String, + pub file_size: i64, + pub checksum_sha256: String, + pub created_at: DateTime, +} + +#[derive(Debug, Serialize)] +pub struct DocumentResponse { + pub id: Uuid, + pub title: String, + pub description: String, + pub status: String, + pub latest_version: Option, + pub links: Vec, +} + +#[derive(Debug, Serialize)] +pub struct DocumentDownloadResponse { + pub document_id: Uuid, + pub version_id: Uuid, + pub file_name: String, + pub content_type: String, + pub content_base64: String, +} + +#[derive(Debug, Serialize)] +pub struct DocumentAuditLogResponse { + pub id: Uuid, + pub document_id: Uuid, + pub version_id: Option, + pub action: String, + pub user_id: Option, + pub created_at: DateTime, +} + +#[derive(Debug, Deserialize)] +pub struct ActivityRequest { + #[serde(default)] + pub activity_number: Option, + pub activity_type: String, + pub title: String, + pub body: String, + pub status: String, + pub priority: String, + pub due_at: Option>, +} + +#[derive(Debug, Serialize)] +pub struct ActivityResponse { + pub id: Uuid, + pub activity_number: Option, + pub activity_type: String, + pub title: String, + pub body: String, + pub status: String, + pub priority: String, + pub due_at: Option>, +} + +#[derive(Debug, Serialize)] +pub struct OrganizationRegistrationListItem { + pub id: Uuid, + pub organization_name: String, + pub email: String, + pub status: String, + pub requested_at: DateTime, + pub decided_at: Option>, + pub decided_by_user_id: Option, +} + +#[derive(Debug, Serialize)] +pub struct OrganizationRegistrationDetail { + pub id: Uuid, + pub organization_name: String, + pub email: String, + pub status: String, + pub organization_id: Option, + pub schema_name: Option, + pub requested_at: DateTime, + pub decided_at: Option>, + pub decided_by_user_id: Option, + pub decision_note: Option, + pub provisioning_error: Option, +} + +#[derive(Debug, Serialize)] +pub struct OrganizationUserResponse { + pub user_id: Uuid, + pub email: String, + pub status: String, + pub roles: Vec, +} + +pub async fn dev_bootstrap_local( + State(state): State, + Json(payload): Json, +) -> Result, ApiError> { + if !dev_mode_enabled() { + return Err(ApiError::forbidden("Dev-Bootstrap ist nicht aktiv")); + } + + let db = state.db()?; + let organization_name = payload.organization_name.trim(); + let email = normalize_email(&payload.email)?; + + if organization_name.len() < 2 { + return Err(ApiError::bad_request("Firmenname ist zu kurz")); + } + + let user_id = ensure_user(db, &email).await?; + let organization_id = Uuid::new_v4(); + let schema_name = company_schema_name(organization_id); + let encrypted_name = state.crypto.encrypt(&organization_name.to_string())?; + let initial_password = generate_initial_password(); + let password_hash = hash_password(&initial_password)?; + + let mut tx = db.begin().await?; + sqlx::query( + r#" + insert into organizations ( + id, display_name_ciphertext, display_name_nonce, display_name_key_id, + schema_name, status, registration_email, approved_at, setup_completed_at + ) values ($1, $2, $3, $4, $5, 'active', $6, now(), now()) + "#, + ) + .bind(organization_id) + .bind(encrypted_name.ciphertext) + .bind(encrypted_name.nonce) + .bind(encrypted_name.key_id) + .bind(&schema_name) + .bind(&email) + .execute(&mut *tx) + .await?; + + sqlx::query( + r#" + insert into user_organizations (user_id, organization_id, status, accepted_at) + values ($1, $2, 'active', now()) + on conflict (user_id, organization_id) do update set + status = 'active', + accepted_at = coalesce(user_organizations.accepted_at, now()), + updated_at = now() + "#, + ) + .bind(user_id) + .bind(organization_id) + .execute(&mut *tx) + .await?; + + sqlx::query( + r#" + update users + set password_hash = $2, + must_change_password = false, + initial_password_expires_at = null, + updated_at = now() + where id = $1 + "#, + ) + .bind(user_id) + .bind(password_hash) + .execute(&mut *tx) + .await?; + + provision_company_schema_tx(&mut tx, &schema_name).await?; + assign_all_roles_tx(&mut tx, &schema_name, user_id).await?; + tx.commit().await?; + + Ok(Json(json!({ + "organization_id": organization_id, + "schema_name": schema_name, + "user_id": user_id, + "email": email, + "password": initial_password, + "dev_mode": true + }))) +} + +pub async fn register_organization( + State(state): State, + Json(payload): Json, +) -> Result, ApiError> { + let db = state.db()?; + let organization_name = payload.organization_name.trim(); + let email = normalize_email(&payload.email)?; + + if organization_name.len() < 2 { + return Err(ApiError::bad_request("Firmenname ist zu kurz")); + } + + if !payload.accept_terms { + return Err(ApiError::bad_request( + "Nutzungsbedingungen müssen akzeptiert werden", + )); + } + + let existing_open: Option = sqlx::query_scalar( + "select id from organization_registration_requests where email = $1 and status = 'pending_approval' limit 1", + ) + .bind(&email) + .fetch_optional(db) + .await?; + + if existing_open.is_some() { + return Err(ApiError::conflict( + "Es gibt bereits eine offene Registrierung", + )); + } + + let user_id = ensure_user(db, &email).await?; + let encrypted_name = state.crypto.encrypt(&organization_name.to_string())?; + let registration_id = Uuid::new_v4(); + + sqlx::query( + r#" + insert into organization_registration_requests ( + id, + organization_name_ciphertext, + organization_name_nonce, + organization_name_key_id, + email, + terms_accepted_at + ) values ($1, $2, $3, $4, $5, now()) + "#, + ) + .bind(registration_id) + .bind(encrypted_name.ciphertext) + .bind(encrypted_name.nonce) + .bind(encrypted_name.key_id) + .bind(&email) + .execute(db) + .await?; + + Ok(Json(json!({ + "id": registration_id, + "user_id": user_id, + "status": "pending_approval" + }))) +} + +pub async fn list_organization_registrations( + State(state): State, +) -> Result>, ApiError> { + let db = state.db()?; + let rows = sqlx::query( + r#" + select id, organization_name_ciphertext, organization_name_nonce, organization_name_key_id, + email, status, requested_at, decided_at, decided_by_user_id + from organization_registration_requests + order by requested_at desc + "#, + ) + .fetch_all(db) + .await?; + + let mut items = Vec::with_capacity(rows.len()); + for row in rows { + items.push(OrganizationRegistrationListItem { + id: row.get("id"), + organization_name: decrypt_string( + &state.crypto, + row.get("organization_name_ciphertext"), + row.get("organization_name_nonce"), + row.get("organization_name_key_id"), + )?, + email: row.get("email"), + status: row.get("status"), + requested_at: row.get("requested_at"), + decided_at: row.get("decided_at"), + decided_by_user_id: row.get("decided_by_user_id"), + }); + } + + Ok(Json(items)) +} + +pub async fn get_organization_registration( + State(state): State, + Path(id): Path, +) -> Result, ApiError> { + Ok(Json(load_registration_detail(&state, id).await?)) +} + +pub async fn approve_organization_registration( + State(state): State, + Path(id): Path, +) -> Result, ApiError> { + let db = state.db()?; + let row = load_registration_row(db, id).await?; + let email: String = row.get("email"); + let organization_name = decrypt_string( + &state.crypto, + row.get("organization_name_ciphertext"), + row.get("organization_name_nonce"), + row.get("organization_name_key_id"), + )?; + + let user_id = ensure_user(db, &email).await?; + let organization_id = row + .try_get::, _>("organization_id") + .ok() + .flatten() + .unwrap_or_else(Uuid::new_v4); + let schema_name = company_schema_name(organization_id); + let encrypted_name = state.crypto.encrypt(&organization_name)?; + + let mut tx = db.begin().await?; + sqlx::query( + r#" + insert into organizations ( + id, display_name_ciphertext, display_name_nonce, display_name_key_id, + schema_name, status, registration_email, approved_at + ) values ($1, $2, $3, $4, $5, 'active', $6, now()) + on conflict (id) do update set + status = 'active', + schema_name = excluded.schema_name, + approved_at = coalesce(organizations.approved_at, now()), + updated_at = now() + "#, + ) + .bind(organization_id) + .bind(encrypted_name.ciphertext) + .bind(encrypted_name.nonce) + .bind(encrypted_name.key_id) + .bind(&schema_name) + .bind(&email) + .execute(&mut *tx) + .await?; + + sqlx::query( + r#" + insert into user_organizations (user_id, organization_id, status, accepted_at) + values ($1, $2, 'active', now()) + on conflict (user_id, organization_id) do update set + status = 'active', + accepted_at = coalesce(user_organizations.accepted_at, now()), + updated_at = now() + "#, + ) + .bind(user_id) + .bind(organization_id) + .execute(&mut *tx) + .await?; + + sqlx::query( + r#" + update organization_registration_requests + set status = 'active', organization_id = $2, decided_at = now() + where id = $1 + "#, + ) + .bind(id) + .bind(organization_id) + .execute(&mut *tx) + .await?; + + let initial_password = generate_initial_password(); + let password_hash = hash_password(&initial_password)?; + sqlx::query( + r#" + update users + set password_hash = $2, + must_change_password = true, + initial_password_expires_at = now() + interval '7 days', + updated_at = now() + where id = $1 + "#, + ) + .bind(user_id) + .bind(password_hash) + .execute(&mut *tx) + .await?; + + provision_company_schema_tx(&mut tx, &schema_name).await?; + assign_all_roles_tx(&mut tx, &schema_name, user_id).await?; + tx.commit().await?; + enqueue_initial_password_email(&state.crypto, db, &email, &initial_password).await?; + emit_change(&state, "Benutzer eingeladen"); + + let mut response = json!({ + "id": id, + "organization_id": organization_id, + "schema_name": schema_name, + "status": "active" + }); + if dev_mode_enabled() { + response["dev_initial_password"] = json!(initial_password); + } + Ok(Json(response)) +} + +pub async fn reject_organization_registration( + State(state): State, + Path(id): Path, +) -> Result, ApiError> { + let db = state.db()?; + sqlx::query( + "update organization_registration_requests set status = 'rejected', decided_at = now() where id = $1", + ) + .bind(id) + .execute(db) + .await?; + + Ok(Json(json!({ "id": id, "status": "rejected" }))) +} + +pub async fn resend_initial_email( + State(state): State, + Path(id): Path, +) -> Result, ApiError> { + let db = state.db()?; + let detail = load_registration_detail(&state, id).await?; + let password = generate_initial_password(); + let user_id = ensure_user(db, &detail.email).await?; + let password_hash = hash_password(&password)?; + + sqlx::query( + r#" + update users + set password_hash = $2, + must_change_password = true, + initial_password_expires_at = now() + interval '7 days', + updated_at = now() + where id = $1 + "#, + ) + .bind(user_id) + .bind(password_hash) + .execute(db) + .await?; + enqueue_initial_password_email(&state.crypto, db, &detail.email, &password).await?; + + let mut response = json!({ "queued": true }); + if dev_mode_enabled() { + response["dev_initial_password"] = json!(password); + } + Ok(Json(response)) +} + +pub async fn retry_provisioning( + State(state): State, + Path(id): Path, +) -> Result, ApiError> { + let db = state.db()?; + let detail = load_registration_detail(&state, id).await?; + let organization_id = detail + .organization_id + .ok_or_else(|| ApiError::bad_request("Registrierung ist noch nicht freigeschaltet"))?; + let schema_name = detail + .schema_name + .unwrap_or_else(|| company_schema_name(organization_id)); + provision_company_schema(db, &schema_name).await?; + + Ok(Json( + json!({ "schema_name": schema_name, "provisioned": true }), + )) +} + +pub async fn login( + State(state): State, + Json(payload): Json, +) -> Result, ApiError> { + let db = state.db()?; + let email = normalize_email(&payload.email)?; + let row = sqlx::query( + "select id, password_hash, must_change_password from users where email = $1 and is_active = true", + ) + .bind(&email) + .fetch_optional(db) + .await? + .ok_or_else(|| ApiError::unauthorized("Login fehlgeschlagen"))?; + + let password_hash: Option = row.get("password_hash"); + let Some(password_hash) = password_hash else { + return Err(ApiError::unauthorized("Login fehlgeschlagen")); + }; + verify_password(&payload.password, &password_hash)?; + + let user_id: Uuid = row.get("id"); + sqlx::query("update users set last_login_at = now(), updated_at = now() where id = $1") + .bind(user_id) + .execute(db) + .await?; + + let orgs = sqlx::query( + r#" + select o.id, o.schema_name, o.status + from organizations o + join user_organizations uo on uo.organization_id = o.id + where uo.user_id = $1 and uo.status = 'active' + order by o.created_at + "#, + ) + .bind(user_id) + .fetch_all(db) + .await?; + + let organizations = orgs + .into_iter() + .map(|row| { + json!({ + "id": row.get::("id"), + "schema_name": row.get::, _>("schema_name"), + "status": row.get::("status") + }) + }) + .collect::>(); + let selected_organization_id = organizations + .first() + .and_then(|organization| organization.get("id")) + .and_then(|value| serde_json::from_value::(value.clone()).ok()); + let access_token = create_session_token(db, user_id, selected_organization_id).await?; + + Ok(Json(json!({ + "user_id": user_id, + "access_token": access_token, + "organization_id": selected_organization_id, + "must_change_password": row.get::("must_change_password"), + "organizations": organizations + }))) +} + +pub async fn change_initial_password( + State(state): State, + Json(payload): Json, +) -> Result, ApiError> { + validate_new_password(&payload.new_password, &payload.new_password_confirm)?; + + let db = state.db()?; + let email = normalize_email(&payload.email)?; + let row = + sqlx::query("select id, password_hash from users where email = $1 and is_active = true") + .bind(&email) + .fetch_optional(db) + .await? + .ok_or_else(|| ApiError::unauthorized("Login fehlgeschlagen"))?; + let password_hash: Option = row.get("password_hash"); + verify_password( + &payload.current_password, + password_hash.as_deref().unwrap_or_default(), + )?; + let new_hash = hash_password(&payload.new_password)?; + + sqlx::query( + r#" + update users + set password_hash = $2, + must_change_password = false, + initial_password_expires_at = null, + updated_at = now() + where id = $1 + "#, + ) + .bind(row.get::("id")) + .bind(new_hash) + .execute(db) + .await?; + + Ok(Json(json!({ "changed": true }))) +} + +pub async fn request_password_reset( + State(state): State, + Json(payload): Json, +) -> Result, ApiError> { + let db = state.db()?; + let email = normalize_email(&payload.email)?; + let user_id = + sqlx::query_scalar::<_, Uuid>("select id from users where email=$1 and is_active=true") + .bind(&email) + .fetch_optional(db) + .await?; + + let mut dev_reset_token = None; + if let Some(user_id) = user_id { + let token = generate_token(); + let token_hash = hash_token(&token); + sqlx::query( + r#" + insert into password_reset_tokens (id, user_id, token_hash, expires_at) + values ($1,$2,$3,now() + interval '30 minutes') + "#, + ) + .bind(Uuid::new_v4()) + .bind(user_id) + .bind(&token_hash) + .execute(db) + .await?; + enqueue_password_reset_email(&state.crypto, db, &email, &token).await?; + if dev_mode_enabled() { + dev_reset_token = Some(token); + } + } + + let mut response = json!({ "queued": true }); + if let Some(token) = dev_reset_token { + response["dev_reset_token"] = json!(token); + } + Ok(Json(response)) +} + +pub async fn reset_password( + State(state): State, + Json(payload): Json, +) -> Result, ApiError> { + validate_new_password(&payload.new_password, &payload.new_password_confirm)?; + let db = state.db()?; + let token_hash = hash_token(&payload.token); + let row = sqlx::query( + r#" + select id, user_id + from password_reset_tokens + where token_hash=$1 and used_at is null and expires_at > now() + "#, + ) + .bind(&token_hash) + .fetch_optional(db) + .await? + .ok_or_else(|| ApiError::bad_request("Reset-Token ist ungültig oder abgelaufen"))?; + let reset_id: Uuid = row.get("id"); + let user_id: Uuid = row.get("user_id"); + let new_hash = hash_password(&payload.new_password)?; + let mut tx = db.begin().await?; + sqlx::query( + r#" + update users + set password_hash=$2, must_change_password=false, + initial_password_expires_at=null, updated_at=now() + where id=$1 + "#, + ) + .bind(user_id) + .bind(new_hash) + .execute(&mut *tx) + .await?; + sqlx::query("update password_reset_tokens set used_at=now() where id=$1") + .bind(reset_id) + .execute(&mut *tx) + .await?; + sqlx::query( + "update refresh_tokens set revoked_at=now(), revoked_reason='password_reset' where user_id=$1 and revoked_at is null", + ) + .bind(user_id) + .execute(&mut *tx) + .await?; + tx.commit().await?; + Ok(Json(json!({ "changed": true }))) +} + +pub async fn accept_invitation( + State(state): State, + Json(payload): Json, +) -> Result, ApiError> { + validate_new_password(&payload.new_password, &payload.new_password_confirm)?; + let db = state.db()?; + let token_hash = hash_token(&payload.token); + let row = sqlx::query( + r#" + select id, organization_id, email, created_user_id + from user_invitations + where token_hash=$1 and status='pending' and expires_at > now() + "#, + ) + .bind(&token_hash) + .fetch_optional(db) + .await? + .ok_or_else(|| ApiError::bad_request("Einladung ist ungültig oder abgelaufen"))?; + let invitation_id: Uuid = row.get("id"); + let organization_id: Uuid = row.get("organization_id"); + let email: String = row.get("email"); + let user_id: Uuid = row + .get::, _>("created_user_id") + .unwrap_or_else(Uuid::new_v4); + let password_hash = hash_password(&payload.new_password)?; + + let mut tx = db.begin().await?; + sqlx::query( + r#" + update users + set password_hash=$2, must_change_password=false, + initial_password_expires_at=null, updated_at=now() + where id=$1 + "#, + ) + .bind(user_id) + .bind(password_hash) + .execute(&mut *tx) + .await?; + sqlx::query( + r#" + update user_organizations + set status='active', accepted_at=now(), updated_at=now() + where user_id=$1 and organization_id=$2 + "#, + ) + .bind(user_id) + .bind(organization_id) + .execute(&mut *tx) + .await?; + sqlx::query( + r#" + update user_invitations + set status='accepted', accepted_at=now(), accepted_by_user_id=$2 + where id=$1 + "#, + ) + .bind(invitation_id) + .bind(user_id) + .execute(&mut *tx) + .await?; + tx.commit().await?; + Ok(Json(json!({ + "accepted": true, + "email": email, + "organization_id": organization_id + }))) +} + +pub async fn auth_organizations( + headers: HeaderMap, + State(state): State, +) -> Result>, ApiError> { + let db = state.db()?; + let auth = require_auth(db, &headers).await?; + let rows = sqlx::query( + r#" + select o.id, o.schema_name, o.status + from organizations o + join user_organizations uo on uo.organization_id = o.id + where uo.user_id = $1 and uo.status = 'active' + order by o.created_at + "#, + ) + .bind(auth.user_id) + .fetch_all(db) + .await?; + Ok(Json( + rows.into_iter() + .map(|row| { + json!({ + "id": row.get::("id"), + "schema_name": row.get::, _>("schema_name"), + "status": row.get::("status") + }) + }) + .collect(), + )) +} + +pub async fn select_organization( + headers: HeaderMap, + State(state): State, + Json(payload): Json, +) -> Result, ApiError> { + let db = state.db()?; + let auth = require_auth(db, &headers).await?; + let context = + load_context_for_user_and_organization(db, auth.user_id, payload.organization_id).await?; + update_session_organization(db, &headers, context.organization_id).await?; + Ok(Json(json!({ + "selected": true, + "organization_id": context.organization_id, + "schema_name": context.schema_name + }))) +} + +pub async fn get_organization_setup( + headers: HeaderMap, + State(state): State, +) -> Result, ApiError> { + let db = state.db()?; + let context = require_permission(db, &headers, "settings.read").await?; + let sql = format!( + r#" + select value_ciphertext, value_nonce, value_key_id + from {schema}.settings + where key = 'organization_setup' + "#, + schema = context.schema_name + ); + let setup = match sqlx::query(&sql).fetch_optional(db).await? { + Some(row) => Some(state.crypto.decrypt::( + row.get("value_ciphertext"), + row.get("value_nonce"), + row.get("value_key_id"), + )?), + None => None, + }; + + Ok(Json(json!({ + "organization_id": context.organization_id, + "schema_name": context.schema_name, + "setup": setup + }))) +} + +pub async fn put_organization_setup( + headers: HeaderMap, + State(state): State, + Json(payload): Json, +) -> Result, ApiError> { + let db = state.db()?; + let context = require_permission(db, &headers, "settings.write").await?; + let organization_id = context.organization_id; + let encrypted_name = state.crypto.encrypt(&payload.display_name)?; + let encrypted_settings = state.crypto.encrypt(&payload)?; + + sqlx::query( + r#" + update organizations + set display_name_ciphertext = $2, + display_name_nonce = $3, + display_name_key_id = $4, + setup_completed_at = coalesce(setup_completed_at, now()), + updated_at = now() + where id = $1 + "#, + ) + .bind(organization_id) + .bind(encrypted_name.ciphertext) + .bind(encrypted_name.nonce) + .bind(encrypted_name.key_id) + .execute(db) + .await?; + + let schema_name = context.schema_name; + let sql = format!( + r#" + insert into {schema}.settings (key, value_ciphertext, value_nonce, value_key_id) + values ('organization_setup', $1, $2, $3) + on conflict (key) do update set + value_ciphertext = excluded.value_ciphertext, + value_nonce = excluded.value_nonce, + value_key_id = excluded.value_key_id, + updated_at = now() + "#, + schema = schema_name + ); + sqlx::query(&sql) + .bind(encrypted_settings.ciphertext) + .bind(encrypted_settings.nonce) + .bind(encrypted_settings.key_id) + .execute(db) + .await?; + + emit_change(&state, "Firmendaten geändert"); + Ok(Json(json!({ "saved": true }))) +} + +pub async fn get_user_navigation_settings( + headers: HeaderMap, + State(state): State, +) -> Result, ApiError> { + let db = state.db()?; + let context = require_auth(db, &headers).await?; + ensure_safe_schema_name(&context.schema_name)?; + let sql = format!( + r#" + select value_ciphertext, value_nonce, value_key_id + from {schema}.user_settings + where user_id = $1 and key = 'navigation' + "#, + schema = context.schema_name + ); + let settings = match sqlx::query(&sql) + .bind(context.user_id) + .fetch_optional(db) + .await? + { + Some(row) => state.crypto.decrypt::( + row.get("value_ciphertext"), + row.get("value_nonce"), + row.get("value_key_id"), + )?, + None => default_user_navigation_settings(), + }; + Ok(Json(normalize_user_navigation_settings(settings)?)) +} + +pub async fn put_user_navigation_settings( + headers: HeaderMap, + State(state): State, + Json(payload): Json, +) -> Result, ApiError> { + let db = state.db()?; + let context = require_auth(db, &headers).await?; + ensure_safe_schema_name(&context.schema_name)?; + let settings = normalize_user_navigation_settings(payload)?; + let encrypted = state.crypto.encrypt(&settings)?; + let sql = format!( + r#" + insert into {schema}.user_settings (user_id, key, value_ciphertext, value_nonce, value_key_id) + values ($1, 'navigation', $2, $3, $4) + on conflict (user_id, key) do update set + value_ciphertext = excluded.value_ciphertext, + value_nonce = excluded.value_nonce, + value_key_id = excluded.value_key_id, + updated_at = now() + "#, + schema = context.schema_name + ); + sqlx::query(&sql) + .bind(context.user_id) + .bind(encrypted.ciphertext) + .bind(encrypted.nonce) + .bind(encrypted.key_id) + .execute(db) + .await?; + Ok(Json(settings)) +} + +pub async fn list_number_ranges( + headers: HeaderMap, + State(state): State, +) -> Result>, ApiError> { + let db = state.db()?; + let context = require_permission(db, &headers, "number_ranges.read").await?; + let sql = format!( + r#" + select id, code, pattern, counter_value, counter_padding, reset_rule, is_active + from {schema}.number_ranges + order by code + "#, + schema = context.schema_name + ); + let rows = sqlx::query(&sql).fetch_all(db).await?; + Ok(Json(rows.into_iter().map(number_range_from_row).collect())) +} + +pub async fn update_number_range( + headers: HeaderMap, + State(state): State, + Path(code): Path, + Json(payload): Json, +) -> Result, ApiError> { + validate_number_range(&payload)?; + let db = state.db()?; + let context = require_permission(db, &headers, "number_ranges.write").await?; + let sql = format!( + r#" + update {schema}.number_ranges + set pattern=$2, counter_value=$3, counter_padding=$4, + reset_rule=$5, is_active=$6, updated_at=now() + where code=$1 + returning id, code, pattern, counter_value, counter_padding, reset_rule, is_active + "#, + schema = context.schema_name + ); + let row = sqlx::query(&sql) + .bind(code) + .bind(payload.pattern.trim()) + .bind(payload.counter_value) + .bind(payload.counter_padding) + .bind( + payload + .reset_rule + .as_deref() + .filter(|value| !value.trim().is_empty()), + ) + .bind(payload.is_active) + .fetch_optional(db) + .await? + .ok_or_else(|| ApiError::not_found("Nummernkreis nicht gefunden"))?; + emit_change(&state, "Nummernkreis geändert"); + Ok(Json(number_range_from_row(row))) +} + +pub async fn generate_next_number( + headers: HeaderMap, + State(state): State, + Path(code): Path, +) -> Result, ApiError> { + ensure_known_number_range_code(&code)?; + let db = state.db()?; + let context = require_permission(db, &headers, number_range_write_permission(&code)).await?; + let number = next_number(db, &context.schema_name, &code).await?; + Ok(Json(NextNumberResponse { code, number })) +} + +pub async fn list_customers( + headers: HeaderMap, + State(state): State, +) -> Result>, ApiError> { + let db = state.db()?; + let context = require_permission(db, &headers, "customers.read").await?; + let sql = format!( + r#" + select c.id, c.customer_number, c.name_ciphertext, c.name_nonce, c.name_key_id, + c.status, c.details_ciphertext, c.details_nonce, c.details_key_id, + coalesce(terms.standard_discount_percent, 0)::text standard_discount_percent, + terms.cash_discount_term_id + from {schema}.customers c + left join lateral ( + select standard_discount_percent, cash_discount_term_id + from {schema}.customer_price_terms + where customer_id = c.id and is_active = true + order by updated_at desc + limit 1 + ) terms on true + order by c.updated_at desc, c.customer_number + "#, + schema = context.schema_name + ); + let rows = sqlx::query(&sql).fetch_all(db).await?; + let mut customers = Vec::with_capacity(rows.len()); + for row in rows { + customers.push(customer_from_row(&state.crypto, row)?); + } + Ok(Json(customers)) +} + +pub async fn create_customer( + headers: HeaderMap, + State(state): State, + Json(payload): Json, +) -> Result, ApiError> { + let mut payload = payload; + validate_customer_request(&payload)?; + let db = state.db()?; + let context = require_permission(db, &headers, "customers.write").await?; + payload.customer_number = next_number_if_blank( + db, + &context.schema_name, + "customers", + &payload.customer_number, + ) + .await?; + let customer_id = Uuid::new_v4(); + let encrypted_name = state.crypto.encrypt(&payload.name.trim().to_string())?; + let encrypted_details = state.crypto.encrypt(&payload.details)?; + let sql = format!( + r#" + insert into {schema}.customers ( + id, customer_number, name_ciphertext, name_nonce, name_key_id, status, + details_ciphertext, details_nonce, details_key_id + ) values ($1, $2, $3, $4, $5, $6, $7, $8, $9) + "#, + schema = context.schema_name + ); + sqlx::query(&sql) + .bind(customer_id) + .bind(payload.customer_number.trim()) + .bind(encrypted_name.ciphertext) + .bind(encrypted_name.nonce) + .bind(encrypted_name.key_id) + .bind(&payload.status) + .bind(encrypted_details.ciphertext) + .bind(encrypted_details.nonce) + .bind(encrypted_details.key_id) + .execute(db) + .await?; + save_customer_terms(db, &context.schema_name, customer_id, &payload).await?; + emit_change(&state, "Kunde angelegt"); + Ok(Json(customer_response(customer_id, payload))) +} + +pub async fn update_customer( + headers: HeaderMap, + State(state): State, + Path(customer_id): Path, + Json(payload): Json, +) -> Result, ApiError> { + validate_customer_request(&payload)?; + let db = state.db()?; + let context = require_permission(db, &headers, "customers.write").await?; + let encrypted_name = state.crypto.encrypt(&payload.name.trim().to_string())?; + let encrypted_details = state.crypto.encrypt(&payload.details)?; + let sql = format!( + r#" + update {schema}.customers + set customer_number = customer_number, name_ciphertext = $3, name_nonce = $4, + name_key_id = $5, status = $6, details_ciphertext = $7, + details_nonce = $8, details_key_id = $9, updated_at = now() + where id = $1 + "#, + schema = context.schema_name + ); + let result = sqlx::query(&sql) + .bind(customer_id) + .bind(payload.customer_number.trim()) + .bind(encrypted_name.ciphertext) + .bind(encrypted_name.nonce) + .bind(encrypted_name.key_id) + .bind(&payload.status) + .bind(encrypted_details.ciphertext) + .bind(encrypted_details.nonce) + .bind(encrypted_details.key_id) + .execute(db) + .await?; + if result.rows_affected() == 0 { + return Err(ApiError::not_found("Kunde nicht gefunden")); + } + save_customer_terms(db, &context.schema_name, customer_id, &payload).await?; + emit_change(&state, "Kunde geändert"); + Ok(Json(customer_response(customer_id, payload))) +} + +pub async fn delete_customer( + headers: HeaderMap, + State(state): State, + Path(customer_id): Path, +) -> Result, ApiError> { + let db = state.db()?; + let context = require_permission(db, &headers, "customers.delete").await?; + let sql = format!( + "update {schema}.customers set status = 'inactive', updated_at = now() where id = $1", + schema = context.schema_name + ); + let result = sqlx::query(&sql).bind(customer_id).execute(db).await?; + if result.rows_affected() == 0 { + return Err(ApiError::not_found("Kunde nicht gefunden")); + } + emit_change(&state, "Kunde deaktiviert"); + Ok(Json(json!({ "deleted": true, "id": customer_id }))) +} + +pub async fn list_suppliers( + headers: HeaderMap, + State(state): State, +) -> Result>, ApiError> { + let db = state.db()?; + let context = require_permission(db, &headers, "suppliers.read").await?; + let sql = format!( + r#" + select s.id, s.supplier_number, s.name_ciphertext, s.name_nonce, s.name_key_id, + s.status, s.details_ciphertext, s.details_nonce, s.details_key_id, + coalesce(terms.standard_discount_percent, 0)::text standard_discount_percent, + terms.cash_discount_term_id, terms.payment_days + from {schema}.suppliers s + left join lateral ( + select standard_discount_percent, cash_discount_term_id, payment_days + from {schema}.supplier_price_terms + where supplier_id = s.id and is_active = true + order by updated_at desc limit 1 + ) terms on true + order by s.updated_at desc, s.supplier_number + "#, + schema = context.schema_name + ); + let rows = sqlx::query(&sql).fetch_all(db).await?; + let mut suppliers = Vec::with_capacity(rows.len()); + for row in rows { + suppliers.push(supplier_from_row(&state.crypto, row)?); + } + Ok(Json(suppliers)) +} + +pub async fn create_supplier( + headers: HeaderMap, + State(state): State, + Json(payload): Json, +) -> Result, ApiError> { + validate_supplier_request(&payload)?; + let db = state.db()?; + let context = require_permission(db, &headers, "suppliers.write").await?; + let supplier_id = Uuid::new_v4(); + let mut payload = payload; + payload.supplier_number = next_number_if_blank( + db, + &context.schema_name, + "suppliers", + &payload.supplier_number, + ) + .await?; + write_supplier( + db, + &state.crypto, + &context.schema_name, + supplier_id, + &payload, + true, + ) + .await?; + save_supplier_terms(db, &context.schema_name, supplier_id, &payload).await?; + emit_change(&state, "Lieferant angelegt"); + Ok(Json(supplier_response(supplier_id, payload))) +} + +pub async fn update_supplier( + headers: HeaderMap, + State(state): State, + Path(supplier_id): Path, + Json(payload): Json, +) -> Result, ApiError> { + validate_supplier_request(&payload)?; + let db = state.db()?; + let context = require_permission(db, &headers, "suppliers.write").await?; + write_supplier( + db, + &state.crypto, + &context.schema_name, + supplier_id, + &payload, + false, + ) + .await?; + save_supplier_terms(db, &context.schema_name, supplier_id, &payload).await?; + emit_change(&state, "Lieferant geändert"); + Ok(Json(supplier_response(supplier_id, payload))) +} + +pub async fn delete_supplier( + headers: HeaderMap, + State(state): State, + Path(supplier_id): Path, +) -> Result, ApiError> { + let db = state.db()?; + let context = require_permission(db, &headers, "suppliers.delete").await?; + set_record_inactive(db, &context.schema_name, "suppliers", supplier_id).await?; + emit_change(&state, "Lieferant deaktiviert"); + Ok(Json(json!({ "deleted": true, "id": supplier_id }))) +} + +pub async fn list_cash_discount_terms( + headers: HeaderMap, + State(state): State, +) -> Result>, ApiError> { + let db = state.db()?; + let context = require_permission(db, &headers, "cash_discount_terms.read").await?; + let sql = format!( + r#" + select id, code, name, discount_percent::text discount_percent, + discount_days, net_days, valid_from::text valid_from, + valid_until::text valid_until, is_default_customer_term, + is_default_supplier_term, is_active + from {schema}.cash_discount_terms + order by is_active desc, code + "#, + schema = context.schema_name + ); + let rows = sqlx::query(&sql).fetch_all(db).await?; + Ok(Json( + rows.into_iter().map(cash_discount_term_from_row).collect(), + )) +} + +pub async fn create_cash_discount_term( + headers: HeaderMap, + State(state): State, + Json(payload): Json, +) -> Result, ApiError> { + validate_cash_discount_term(&payload)?; + let db = state.db()?; + let context = require_permission(db, &headers, "cash_discount_terms.write").await?; + let term_id = Uuid::new_v4(); + write_cash_discount_term(db, &context.schema_name, term_id, &payload, true).await?; + emit_change(&state, "Skonto-Regel angelegt"); + Ok(Json(cash_discount_term_response(term_id, payload))) +} + +pub async fn update_cash_discount_term( + headers: HeaderMap, + State(state): State, + Path(term_id): Path, + Json(payload): Json, +) -> Result, ApiError> { + validate_cash_discount_term(&payload)?; + let db = state.db()?; + let context = require_permission(db, &headers, "cash_discount_terms.write").await?; + write_cash_discount_term(db, &context.schema_name, term_id, &payload, false).await?; + emit_change(&state, "Skonto-Regel geändert"); + Ok(Json(cash_discount_term_response(term_id, payload))) +} + +pub async fn delete_cash_discount_term( + headers: HeaderMap, + State(state): State, + Path(term_id): Path, +) -> Result, ApiError> { + let db = state.db()?; + let context = require_permission(db, &headers, "cash_discount_terms.delete").await?; + let sql = format!( + r#" + update {schema}.cash_discount_terms + set is_active = false, + is_default_customer_term = false, + is_default_supplier_term = false, + updated_at = now() + where id = $1 + "#, + schema = context.schema_name + ); + let result = sqlx::query(&sql).bind(term_id).execute(db).await?; + ensure_changed(result.rows_affected(), "Skonto-Regel nicht gefunden")?; + emit_change(&state, "Skonto-Regel deaktiviert"); + Ok(Json(json!({ "deleted": true, "id": term_id }))) +} + +pub async fn list_quotes( + headers: HeaderMap, + State(state): State, +) -> Result>, ApiError> { + let db = state.db()?; + let context = require_permission(db, &headers, "quotes.read").await?; + let sql = format!( + r#" + select id, quote_number, customer_id, status, valid_until::text valid_until, + cash_discount_term_id, customer_discount_percent::text customer_discount_percent, + notes_ciphertext, notes_nonce, notes_key_id + from {schema}.quotes + order by updated_at desc, quote_number + "#, + schema = context.schema_name + ); + let rows = sqlx::query(&sql).fetch_all(db).await?; + let mut quotes = Vec::with_capacity(rows.len()); + for row in rows { + let quote_id = row.get("id"); + quotes.push(quote_from_row(db, &state.crypto, &context.schema_name, row, quote_id).await?); + } + Ok(Json(quotes)) +} + +pub async fn create_quote( + headers: HeaderMap, + State(state): State, + Json(payload): Json, +) -> Result, ApiError> { + let db = state.db()?; + let context = require_permission(db, &headers, "quotes.write").await?; + let quote_id = Uuid::new_v4(); + let mut payload = payload; + apply_customer_terms_to_quote(db, &context.schema_name, &mut payload).await?; + validate_quote_request(&payload)?; + payload.quote_number = + next_number_if_blank(db, &context.schema_name, "quotes", &payload.quote_number).await?; + write_quote(db, &state.crypto, &context, quote_id, &payload, true).await?; + emit_change(&state, "Angebot angelegt"); + Ok(Json(quote_response(quote_id, payload))) +} + +pub async fn update_quote( + headers: HeaderMap, + State(state): State, + Path(quote_id): Path, + Json(payload): Json, +) -> Result, ApiError> { + let db = state.db()?; + let context = require_permission(db, &headers, "quotes.write").await?; + let mut payload = payload; + apply_customer_terms_to_quote(db, &context.schema_name, &mut payload).await?; + validate_quote_request(&payload)?; + write_quote(db, &state.crypto, &context, quote_id, &payload, false).await?; + emit_change(&state, "Angebot geändert"); + Ok(Json(quote_response(quote_id, payload))) +} + +pub async fn delete_quote( + headers: HeaderMap, + State(state): State, + Path(quote_id): Path, +) -> Result, ApiError> { + let db = state.db()?; + let context = require_permission(db, &headers, "quotes.delete").await?; + let sql = format!( + "update {schema}.quotes set status='cancelled', updated_at=now() where id=$1", + schema = context.schema_name + ); + let result = sqlx::query(&sql).bind(quote_id).execute(db).await?; + ensure_changed(result.rows_affected(), "Angebot nicht gefunden")?; + emit_change(&state, "Angebot storniert"); + Ok(Json(json!({ "deleted": true, "id": quote_id }))) +} + +pub async fn convert_quote_to_outgoing_invoice( + headers: HeaderMap, + State(state): State, + Path(quote_id): Path, +) -> Result, ApiError> { + let db = state.db()?; + let context = require_permission(db, &headers, "quotes.convert_to_invoice").await?; + let quote = load_quote_by_id(db, &state.crypto, &context.schema_name, quote_id).await?; + let invoice_id = Uuid::new_v4(); + let invoice = OutgoingInvoiceRequest { + invoice_number: next_number(db, &context.schema_name, "outgoing_invoices").await?, + customer_id: quote.customer_id, + status: "draft".to_string(), + cash_discount_term_id: quote.cash_discount_term_id, + customer_discount_percent: quote.customer_discount_percent.clone(), + issued_at: None, + due_at: None, + source_quote_id: Some(quote.id), + items: quote + .items + .iter() + .map(|item| OutgoingInvoiceItemRequest { + item_id: item.item_id, + description: item.description.clone(), + quantity: item.quantity.clone(), + unit_price: item.unit_price.clone(), + original_unit_price: item.original_unit_price.clone(), + discount_percent: item.discount_percent.clone(), + tax_rate: item.tax_rate.clone(), + }) + .collect(), + }; + validate_outgoing_invoice_request(&invoice)?; + write_outgoing_invoice(db, &state.crypto, &context, invoice_id, &invoice, true).await?; + emit_change(&state, "Angebot in Rechnung umgewandelt"); + Ok(Json(outgoing_invoice_response(invoice_id, invoice, None))) +} + +pub async fn list_outgoing_invoices( + headers: HeaderMap, + State(state): State, +) -> Result>, ApiError> { + let db = state.db()?; + let context = require_permission(db, &headers, "outgoing_invoices.read").await?; + let sql = format!( + r#" + select id, invoice_number, customer_id, status, cash_discount_term_id, + customer_discount_percent::text customer_discount_percent, + issued_at::text issued_at, due_at::text due_at, source_quote_id, finalized_at + from {schema}.outgoing_invoices + order by updated_at desc, invoice_number + "#, + schema = context.schema_name + ); + let rows = sqlx::query(&sql).fetch_all(db).await?; + let mut invoices = Vec::with_capacity(rows.len()); + for row in rows { + let invoice_id = row.get("id"); + invoices.push( + outgoing_invoice_from_row(db, &state.crypto, &context.schema_name, row, invoice_id) + .await?, + ); + } + Ok(Json(invoices)) +} + +pub async fn create_outgoing_invoice( + headers: HeaderMap, + State(state): State, + Json(payload): Json, +) -> Result, ApiError> { + let db = state.db()?; + let context = require_permission(db, &headers, "outgoing_invoices.write").await?; + let invoice_id = Uuid::new_v4(); + let mut payload = payload; + apply_customer_terms_to_outgoing_invoice(db, &context.schema_name, &mut payload).await?; + validate_outgoing_invoice_request(&payload)?; + payload.invoice_number = next_number_if_blank( + db, + &context.schema_name, + "outgoing_invoices", + &payload.invoice_number, + ) + .await?; + write_outgoing_invoice(db, &state.crypto, &context, invoice_id, &payload, true).await?; + emit_change(&state, "Ausgangsrechnung angelegt"); + Ok(Json(outgoing_invoice_response(invoice_id, payload, None))) +} + +pub async fn update_outgoing_invoice( + headers: HeaderMap, + State(state): State, + Path(invoice_id): Path, + Json(payload): Json, +) -> Result, ApiError> { + let db = state.db()?; + let context = require_permission(db, &headers, "outgoing_invoices.write").await?; + ensure_outgoing_invoice_editable(db, &context.schema_name, invoice_id).await?; + let mut payload = payload; + apply_customer_terms_to_outgoing_invoice(db, &context.schema_name, &mut payload).await?; + validate_outgoing_invoice_request(&payload)?; + write_outgoing_invoice(db, &state.crypto, &context, invoice_id, &payload, false).await?; + emit_change(&state, "Ausgangsrechnung geändert"); + Ok(Json(outgoing_invoice_response(invoice_id, payload, None))) +} + +pub async fn delete_outgoing_invoice( + headers: HeaderMap, + State(state): State, + Path(invoice_id): Path, +) -> Result, ApiError> { + let db = state.db()?; + let context = require_permission(db, &headers, "outgoing_invoices.delete").await?; + ensure_outgoing_invoice_editable(db, &context.schema_name, invoice_id).await?; + let sql = format!( + "update {schema}.outgoing_invoices set status='cancelled', updated_at=now() where id=$1", + schema = context.schema_name + ); + let result = sqlx::query(&sql).bind(invoice_id).execute(db).await?; + ensure_changed(result.rows_affected(), "Ausgangsrechnung nicht gefunden")?; + emit_change(&state, "Ausgangsrechnung storniert"); + Ok(Json(json!({ "deleted": true, "id": invoice_id }))) +} + +pub async fn finalize_outgoing_invoice( + headers: HeaderMap, + State(state): State, + Path(invoice_id): Path, +) -> Result, ApiError> { + let db = state.db()?; + let context = require_permission(db, &headers, "invoices.finalize").await?; + let sql = format!( + r#" + update {schema}.outgoing_invoices + set status='finalized', finalized_at=coalesce(finalized_at, now()), updated_at=now() + where id=$1 and finalized_at is null + "#, + schema = context.schema_name + ); + let result = sqlx::query(&sql).bind(invoice_id).execute(db).await?; + ensure_changed( + result.rows_affected(), + "Rechnung nicht gefunden oder bereits abgeschlossen", + )?; + emit_change(&state, "Ausgangsrechnung abgeschlossen"); + Ok(Json(json!({ "finalized": true, "id": invoice_id }))) +} + +pub async fn list_incoming_invoices( + headers: HeaderMap, + State(state): State, +) -> Result>, ApiError> { + let db = state.db()?; + let context = require_permission(db, &headers, "incoming_invoices.read").await?; + let sql = format!( + r#" + select id, invoice_number, supplier_id, status, cash_discount_term_id, + invoice_date::text invoice_date, due_at::text due_at + from {schema}.incoming_invoices + order by updated_at desc, invoice_number + "#, + schema = context.schema_name + ); + let rows = sqlx::query(&sql).fetch_all(db).await?; + let mut invoices = Vec::with_capacity(rows.len()); + for row in rows { + let invoice_id = row.get("id"); + invoices.push( + incoming_invoice_from_row(db, &state.crypto, &context.schema_name, row, invoice_id) + .await?, + ); + } + Ok(Json(invoices)) +} + +pub async fn create_incoming_invoice( + headers: HeaderMap, + State(state): State, + Json(payload): Json, +) -> Result, ApiError> { + let db = state.db()?; + let context = require_permission(db, &headers, "incoming_invoices.write").await?; + let invoice_id = Uuid::new_v4(); + let mut payload = payload; + apply_supplier_terms_to_incoming_invoice(db, &context.schema_name, &mut payload).await?; + payload.invoice_number = next_number_if_blank( + db, + &context.schema_name, + "incoming_invoices", + &payload.invoice_number, + ) + .await?; + validate_incoming_invoice_request(&payload)?; + write_incoming_invoice(db, &state.crypto, &context, invoice_id, &payload, true).await?; + emit_change(&state, "Eingangsrechnung angelegt"); + Ok(Json(incoming_invoice_response(invoice_id, payload))) +} + +pub async fn update_incoming_invoice( + headers: HeaderMap, + State(state): State, + Path(invoice_id): Path, + Json(payload): Json, +) -> Result, ApiError> { + let db = state.db()?; + let context = require_permission(db, &headers, "incoming_invoices.write").await?; + let mut payload = payload; + apply_supplier_terms_to_incoming_invoice(db, &context.schema_name, &mut payload).await?; + validate_incoming_invoice_request(&payload)?; + write_incoming_invoice(db, &state.crypto, &context, invoice_id, &payload, false).await?; + emit_change(&state, "Eingangsrechnung geändert"); + Ok(Json(incoming_invoice_response(invoice_id, payload))) +} + +pub async fn delete_incoming_invoice( + headers: HeaderMap, + State(state): State, + Path(invoice_id): Path, +) -> Result, ApiError> { + let db = state.db()?; + let context = require_permission(db, &headers, "incoming_invoices.delete").await?; + let sql = format!( + "update {schema}.incoming_invoices set status='cancelled', updated_at=now() where id=$1", + schema = context.schema_name + ); + let result = sqlx::query(&sql).bind(invoice_id).execute(db).await?; + ensure_changed(result.rows_affected(), "Eingangsrechnung nicht gefunden")?; + emit_change(&state, "Eingangsrechnung storniert"); + Ok(Json(json!({ "deleted": true, "id": invoice_id }))) +} + +pub async fn preview_price_list_import( + headers: HeaderMap, + State(state): State, + Json(payload): Json, +) -> Result, ApiError> { + let db = state.db()?; + let context = require_permission(db, &headers, "price_lists.import").await?; + let rows = parse_price_list_rows(db, &context.schema_name, &payload).await?; + let valid_rows = rows.iter().filter(|row| row.error.is_none()).count(); + let error_rows = rows.len().saturating_sub(valid_rows); + Ok(Json(PriceListImportPreview { + total_rows: rows.len(), + valid_rows, + error_rows, + rows, + })) +} + +pub async fn apply_price_list_import( + headers: HeaderMap, + State(state): State, + Json(payload): Json, +) -> Result, ApiError> { + let db = state.db()?; + let context = require_permission(db, &headers, "price_lists.import").await?; + let rows = parse_price_list_rows(db, &context.schema_name, &payload).await?; + let valid_rows = rows + .iter() + .filter(|row| row.error.is_none()) + .cloned() + .collect::>(); + let import_id = Uuid::new_v4(); + let insert_import = format!( + r#" + insert into {schema}.imports ( + id, import_type, source_name, status, total_rows, applied_rows, + error_rows, created_by_user_id, finished_at + ) values ($1, 'price_list', $2, 'applied', $3, $4, $5, $6, now()) + "#, + schema = context.schema_name + ); + sqlx::query(&insert_import) + .bind(import_id) + .bind(payload.source_name.trim()) + .bind(rows.len() as i32) + .bind(valid_rows.len() as i32) + .bind((rows.len() - valid_rows.len()) as i32) + .bind(context.user_id) + .execute(db) + .await?; + + for row in &valid_rows { + upsert_imported_item(db, &state.crypto, &context, import_id, row).await?; + } + + emit_change(&state, "Preislistenimport abgeschlossen"); + Ok(Json(PriceListImportApplyResponse { + import_id, + applied_rows: valid_rows.len(), + error_rows: rows.len() - valid_rows.len(), + })) +} + +pub async fn list_api_connectors( + headers: HeaderMap, + State(state): State, +) -> Result>, ApiError> { + let db = state.db()?; + let context = require_permission(db, &headers, "price_apis.sync").await?; + let sql = format!( + r#" + select id, code, name, connector_type, config_ciphertext, config_nonce, + config_key_id, is_active, sync_interval_minutes, last_sync_at + from {schema}.api_connectors + order by name + "#, + schema = context.schema_name + ); + let rows = sqlx::query(&sql).fetch_all(db).await?; + let mut connectors = Vec::with_capacity(rows.len()); + for row in rows { + connectors.push(api_connector_from_row(&state.crypto, row)?); + } + Ok(Json(connectors)) +} + +pub async fn create_api_connector( + headers: HeaderMap, + State(state): State, + Json(payload): Json, +) -> Result, ApiError> { + validate_api_connector_request(&payload)?; + let db = state.db()?; + let context = require_permission(db, &headers, "price_apis.sync").await?; + let connector_id = Uuid::new_v4(); + write_api_connector( + db, + &state.crypto, + &context.schema_name, + connector_id, + &payload, + true, + ) + .await?; + emit_change(&state, "Preis-API-Connector angelegt"); + Ok(Json(api_connector_response(connector_id, payload, None))) +} + +pub async fn update_api_connector( + headers: HeaderMap, + State(state): State, + Path(connector_id): Path, + Json(payload): Json, +) -> Result, ApiError> { + validate_api_connector_request(&payload)?; + let db = state.db()?; + let context = require_permission(db, &headers, "price_apis.sync").await?; + write_api_connector( + db, + &state.crypto, + &context.schema_name, + connector_id, + &payload, + false, + ) + .await?; + emit_change(&state, "Preis-API-Connector geändert"); + Ok(Json(api_connector_response(connector_id, payload, None))) +} + +pub async fn delete_api_connector( + headers: HeaderMap, + State(state): State, + Path(connector_id): Path, +) -> Result, ApiError> { + let db = state.db()?; + let context = require_permission(db, &headers, "price_apis.sync").await?; + let sql = format!( + "update {schema}.api_connectors set is_active=false, updated_at=now() where id=$1", + schema = context.schema_name + ); + let result = sqlx::query(&sql).bind(connector_id).execute(db).await?; + ensure_changed(result.rows_affected(), "API-Connector nicht gefunden")?; + emit_change(&state, "Preis-API-Connector deaktiviert"); + Ok(Json(json!({ "deleted": true, "id": connector_id }))) +} + +pub async fn sync_api_connector( + headers: HeaderMap, + State(state): State, + Path(connector_id): Path, +) -> Result, ApiError> { + let db = state.db()?; + let context = require_permission(db, &headers, "price_apis.sync").await?; + let select_sql = format!( + r#" + select id, code, name, connector_type, config_ciphertext, config_nonce, + config_key_id, is_active, sync_interval_minutes, last_sync_at + from {schema}.api_connectors + where id=$1 and is_active=true + "#, + schema = context.schema_name + ); + let row = sqlx::query(&select_sql) + .bind(connector_id) + .fetch_optional(db) + .await? + .ok_or_else(|| ApiError::not_found("API-Connector nicht gefunden oder inaktiv"))?; + let connector = api_connector_from_row(&state.crypto, row)?; + let mut applied_rows = 0usize; + let mut error_rows = 0usize; + + if let Some(content) = connector + .config + .get("price_list_csv") + .and_then(|value| value.as_str()) + .filter(|value| !value.trim().is_empty()) + { + let payload = PriceListImportRequest { + source_name: format!("api:{}", connector.code), + content: content.to_string(), + delimiter: connector + .config + .get("delimiter") + .and_then(|value| value.as_str()) + .map(ToString::to_string), + }; + let rows = parse_price_list_rows(db, &context.schema_name, &payload).await?; + let valid_rows = rows + .iter() + .filter(|row| row.error.is_none()) + .cloned() + .collect::>(); + let import_id = Uuid::new_v4(); + let insert_import = format!( + r#" + insert into {schema}.imports ( + id, import_type, source_name, status, total_rows, applied_rows, + error_rows, created_by_user_id, finished_at + ) values ($1, 'api_price_sync', $2, 'applied', $3, $4, $5, $6, now()) + "#, + schema = context.schema_name + ); + sqlx::query(&insert_import) + .bind(import_id) + .bind(&payload.source_name) + .bind(rows.len() as i32) + .bind(valid_rows.len() as i32) + .bind((rows.len() - valid_rows.len()) as i32) + .bind(context.user_id) + .execute(db) + .await?; + + for row in &valid_rows { + upsert_imported_item(db, &state.crypto, &context, import_id, row).await?; + } + applied_rows = valid_rows.len(); + error_rows = rows.len() - valid_rows.len(); + } + + let update_sql = format!( + "update {schema}.api_connectors set last_sync_at=now(), updated_at=now() where id=$1 and is_active=true", + schema = context.schema_name + ); + let result = sqlx::query(&update_sql) + .bind(connector_id) + .execute(db) + .await?; + ensure_changed( + result.rows_affected(), + "API-Connector nicht gefunden oder inaktiv", + )?; + emit_change(&state, "Preis-API-Abgleich ausgeführt"); + Ok(Json(json!({ + "synced": true, + "id": connector_id, + "applied_rows": applied_rows, + "error_rows": error_rows + }))) +} + +pub async fn list_price_rules( + headers: HeaderMap, + State(state): State, +) -> Result>, ApiError> { + let db = state.db()?; + let context = require_permission(db, &headers, "price_rules.write").await?; + let sql = format!( + r#" + select id, code, name, source_type, source_id, markup_percent::text markup_percent, + rounding_mode, is_active + from {schema}.price_rules + order by name + "#, + schema = context.schema_name + ); + let rows = sqlx::query(&sql).fetch_all(db).await?; + Ok(Json(rows.into_iter().map(price_rule_from_row).collect())) +} + +pub async fn create_price_rule( + headers: HeaderMap, + State(state): State, + Json(payload): Json, +) -> Result, ApiError> { + validate_price_rule_request(&payload)?; + let db = state.db()?; + let context = require_permission(db, &headers, "price_rules.write").await?; + let rule_id = Uuid::new_v4(); + write_price_rule(db, &context.schema_name, rule_id, &payload, true).await?; + emit_change(&state, "Preisregel angelegt"); + Ok(Json(price_rule_response(rule_id, payload))) +} + +pub async fn update_price_rule( + headers: HeaderMap, + State(state): State, + Path(rule_id): Path, + Json(payload): Json, +) -> Result, ApiError> { + validate_price_rule_request(&payload)?; + let db = state.db()?; + let context = require_permission(db, &headers, "price_rules.write").await?; + write_price_rule(db, &context.schema_name, rule_id, &payload, false).await?; + emit_change(&state, "Preisregel geändert"); + Ok(Json(price_rule_response(rule_id, payload))) +} + +pub async fn delete_price_rule( + headers: HeaderMap, + State(state): State, + Path(rule_id): Path, +) -> Result, ApiError> { + let db = state.db()?; + let context = require_permission(db, &headers, "price_rules.write").await?; + let sql = format!( + "update {schema}.price_rules set is_active=false, updated_at=now() where id=$1", + schema = context.schema_name + ); + let result = sqlx::query(&sql).bind(rule_id).execute(db).await?; + ensure_changed(result.rows_affected(), "Preisregel nicht gefunden")?; + emit_change(&state, "Preisregel deaktiviert"); + Ok(Json(json!({ "deleted": true, "id": rule_id }))) +} + +pub async fn list_communications( + headers: HeaderMap, + State(state): State, +) -> Result>, ApiError> { + let db = state.db()?; + let context = require_permission(db, &headers, "communication.read").await?; + let sql = format!( + r#" + select id, communication_type, direction, subject_ciphertext, subject_nonce, + subject_key_id, body_ciphertext, body_nonce, body_key_id, status, occurred_at + from {schema}.communications + where status <> 'archived' + order by coalesce(occurred_at, updated_at) desc + "#, + schema = context.schema_name + ); + let rows = sqlx::query(&sql).fetch_all(db).await?; + let mut records = Vec::with_capacity(rows.len()); + for row in rows { + records.push(communication_from_row(db, &state.crypto, &context.schema_name, row).await?); + } + Ok(Json(records)) +} + +pub async fn create_communication( + headers: HeaderMap, + State(state): State, + Json(payload): Json, +) -> Result, ApiError> { + validate_communication_request(&payload)?; + let db = state.db()?; + let context = require_permission(db, &headers, "communication.write").await?; + let communication_id = Uuid::new_v4(); + write_communication( + db, + &state.crypto, + &context, + communication_id, + &payload, + true, + ) + .await?; + emit_change(&state, "Kommunikation gespeichert"); + get_communication_by_id(db, &state.crypto, &context.schema_name, communication_id).await +} + +pub async fn update_communication( + headers: HeaderMap, + State(state): State, + Path(communication_id): Path, + Json(payload): Json, +) -> Result, ApiError> { + validate_communication_request(&payload)?; + let db = state.db()?; + let context = require_permission(db, &headers, "communication.write").await?; + write_communication( + db, + &state.crypto, + &context, + communication_id, + &payload, + false, + ) + .await?; + emit_change(&state, "Kommunikation geändert"); + get_communication_by_id(db, &state.crypto, &context.schema_name, communication_id).await +} + +pub async fn delete_communication( + headers: HeaderMap, + State(state): State, + Path(communication_id): Path, +) -> Result, ApiError> { + let db = state.db()?; + let context = require_permission(db, &headers, "communication.write").await?; + let sql = format!( + "update {schema}.communications set status='archived', updated_at=now() where id=$1", + schema = context.schema_name + ); + let result = sqlx::query(&sql).bind(communication_id).execute(db).await?; + ensure_changed(result.rows_affected(), "Kommunikation nicht gefunden")?; + emit_change(&state, "Kommunikation archiviert"); + Ok(Json(json!({ "deleted": true, "id": communication_id }))) +} + +pub async fn list_documents( + headers: HeaderMap, + State(state): State, +) -> Result>, ApiError> { + let db = state.db()?; + let context = require_permission(db, &headers, "documents.read").await?; + let sql = format!( + r#" + select id, title_ciphertext, title_nonce, title_key_id, + description_ciphertext, description_nonce, description_key_id, status + from {schema}.documents + where status <> 'deleted' + order by updated_at desc + "#, + schema = context.schema_name + ); + let rows = sqlx::query(&sql).fetch_all(db).await?; + let mut documents = Vec::with_capacity(rows.len()); + for row in rows { + documents.push(document_from_row(db, &state.crypto, &context.schema_name, row).await?); + } + Ok(Json(documents)) +} + +pub async fn upload_document( + headers: HeaderMap, + State(state): State, + Json(payload): Json, +) -> Result, ApiError> { + validate_document_upload_request(&payload)?; + let db = state.db()?; + let context = require_permission(db, &headers, "documents.write").await?; + let content = BASE64_STANDARD + .decode(payload.content_base64.trim()) + .map_err(|_| ApiError::bad_request("Dateiinhalt ist kein gültiges Base64"))?; + if content.len() > 20 * 1024 * 1024 { + return Err(ApiError::bad_request("Datei ist größer als 20 MB")); + } + let document_id = Uuid::new_v4(); + let version_id = Uuid::new_v4(); + let encrypted_content = state.crypto.encrypt(&content)?; + let checksum = Sha256::digest(&content) + .iter() + .map(|byte| format!("{byte:02x}")) + .collect::(); + let storage_path = document_storage_path(&context.schema_name, document_id, version_id)?; + if let Some(parent) = storage_path.parent() { + tokio::fs::create_dir_all(parent).await?; + } + tokio::fs::write( + &storage_path, + serde_json::to_vec(&json!({ + "ciphertext": BASE64_STANDARD.encode(encrypted_content.ciphertext), + "nonce": BASE64_STANDARD.encode(encrypted_content.nonce), + "key_id": encrypted_content.key_id + }))?, + ) + .await?; + + let title = state.crypto.encrypt(&payload.title.trim().to_string())?; + let description = encrypted_optional_string(&state.crypto, &payload.description)?; + let file_name = state + .crypto + .encrypt(&payload.file_name.trim().to_string())?; + let content_type = state + .crypto + .encrypt(&payload.content_type.trim().to_string())?; + let insert_document = format!( + r#" + insert into {schema}.documents ( + id, title_ciphertext, title_nonce, title_key_id, + description_ciphertext, description_nonce, description_key_id, created_by_user_id + ) values ($1,$2,$3,$4,$5,$6,$7,$8) + "#, + schema = context.schema_name + ); + sqlx::query(&insert_document) + .bind(document_id) + .bind(title.ciphertext) + .bind(title.nonce) + .bind(title.key_id) + .bind(description.as_ref().map(|value| value.ciphertext.clone())) + .bind(description.as_ref().map(|value| value.nonce.clone())) + .bind(description.as_ref().map(|value| value.key_id.clone())) + .bind(context.user_id) + .execute(db) + .await?; + + let insert_version = format!( + r#" + insert into {schema}.document_versions ( + id, document_id, version_no, file_name_ciphertext, file_name_nonce, + file_name_key_id, content_type_ciphertext, content_type_nonce, + content_type_key_id, file_size, storage_path, checksum_sha256, uploaded_by_user_id + ) values ($1,$2,1,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12) + "#, + schema = context.schema_name + ); + sqlx::query(&insert_version) + .bind(version_id) + .bind(document_id) + .bind(file_name.ciphertext) + .bind(file_name.nonce) + .bind(file_name.key_id) + .bind(content_type.ciphertext) + .bind(content_type.nonce) + .bind(content_type.key_id) + .bind(content.len() as i64) + .bind(storage_path.to_string_lossy().to_string()) + .bind(checksum) + .bind(context.user_id) + .execute(db) + .await?; + write_document_links(db, &context.schema_name, document_id, &payload.links).await?; + insert_document_audit( + db, + &context.schema_name, + document_id, + Some(version_id), + "upload", + context.user_id, + ) + .await?; + emit_change(&state, "Dokument hochgeladen"); + get_document_by_id(db, &state.crypto, &context.schema_name, document_id).await +} + +pub async fn download_document( + headers: HeaderMap, + State(state): State, + Path(document_id): Path, +) -> Result, ApiError> { + let db = state.db()?; + let context = require_permission(db, &headers, "documents.read").await?; + let sql = format!( + r#" + select id, document_id, version_no, file_name_ciphertext, file_name_nonce, + file_name_key_id, content_type_ciphertext, content_type_nonce, + content_type_key_id, file_size, storage_path, checksum_sha256, created_at + from {schema}.document_versions + where document_id=$1 + order by version_no desc + limit 1 + "#, + schema = context.schema_name + ); + let row = sqlx::query(&sql) + .bind(document_id) + .fetch_optional(db) + .await? + .ok_or_else(|| ApiError::not_found("Dokument nicht gefunden"))?; + let version_id: Uuid = row.get("id"); + let file_name = state.crypto.decrypt( + &row.get::, _>("file_name_ciphertext"), + &row.get::, _>("file_name_nonce"), + &row.get::("file_name_key_id"), + )?; + let content_type = state.crypto.decrypt( + &row.get::, _>("content_type_ciphertext"), + &row.get::, _>("content_type_nonce"), + &row.get::("content_type_key_id"), + )?; + let storage_path = row.get::("storage_path"); + let envelope = tokio::fs::read(&storage_path).await?; + let envelope = serde_json::from_slice::(&envelope)?; + let ciphertext = envelope + .get("ciphertext") + .and_then(|value| value.as_str()) + .ok_or_else(|| ApiError::internal("Dokumentenspeicher ist beschädigt".to_string())) + .and_then(|value| { + BASE64_STANDARD + .decode(value) + .map_err(|_| ApiError::internal("Dokumentenspeicher ist beschädigt".to_string())) + })?; + let nonce = envelope + .get("nonce") + .and_then(|value| value.as_str()) + .ok_or_else(|| ApiError::internal("Dokumentenspeicher ist beschädigt".to_string())) + .and_then(|value| { + BASE64_STANDARD + .decode(value) + .map_err(|_| ApiError::internal("Dokumentenspeicher ist beschädigt".to_string())) + })?; + let key_id = envelope + .get("key_id") + .and_then(|value| value.as_str()) + .ok_or_else(|| ApiError::internal("Dokumentenspeicher ist beschädigt".to_string()))?; + let content: Vec = state.crypto.decrypt(&ciphertext, &nonce, key_id)?; + insert_document_audit( + db, + &context.schema_name, + document_id, + Some(version_id), + "download", + context.user_id, + ) + .await?; + Ok(Json(DocumentDownloadResponse { + document_id, + version_id, + file_name, + content_type, + content_base64: BASE64_STANDARD.encode(content), + })) +} + +pub async fn delete_document( + headers: HeaderMap, + State(state): State, + Path(document_id): Path, +) -> Result, ApiError> { + let db = state.db()?; + let context = require_permission(db, &headers, "documents.write").await?; + let sql = format!( + "update {schema}.documents set status='deleted', updated_at=now() where id=$1", + schema = context.schema_name + ); + let result = sqlx::query(&sql).bind(document_id).execute(db).await?; + ensure_changed(result.rows_affected(), "Dokument nicht gefunden")?; + insert_document_audit( + db, + &context.schema_name, + document_id, + None, + "archive", + context.user_id, + ) + .await?; + emit_change(&state, "Dokument archiviert"); + Ok(Json(json!({ "deleted": true, "id": document_id }))) +} + +pub async fn list_document_audit_log( + headers: HeaderMap, + State(state): State, + Path(document_id): Path, +) -> Result>, ApiError> { + let db = state.db()?; + let context = require_permission(db, &headers, "documents.read").await?; + let sql = format!( + r#" + select id, document_id, version_id, action, user_id, created_at + from {schema}.document_audit_log + where document_id=$1 + order by created_at desc + "#, + schema = context.schema_name + ); + let rows = sqlx::query(&sql).bind(document_id).fetch_all(db).await?; + Ok(Json( + rows.into_iter() + .map(|row| DocumentAuditLogResponse { + id: row.get("id"), + document_id: row.get("document_id"), + version_id: row.get("version_id"), + action: row.get("action"), + user_id: row.get("user_id"), + created_at: row.get("created_at"), + }) + .collect(), + )) +} + +pub async fn list_items( + headers: HeaderMap, + State(state): State, +) -> Result>, ApiError> { + let db = state.db()?; + let context = require_permission(db, &headers, "items.read").await?; + let sql = format!( + r#" + select id, item_number, name_ciphertext, name_nonce, name_key_id, unit, + tax_rate::text tax_rate, default_purchase_price::text default_purchase_price, + default_sales_price::text default_sales_price, status + from {schema}.items order by updated_at desc, item_number + "#, + schema = context.schema_name + ); + let rows = sqlx::query(&sql).fetch_all(db).await?; + let mut items = Vec::with_capacity(rows.len()); + for row in rows { + items.push(item_from_row(&state.crypto, row)?); + } + Ok(Json(items)) +} + +pub async fn create_item( + headers: HeaderMap, + State(state): State, + Json(payload): Json, +) -> Result, ApiError> { + validate_item_request(&payload)?; + let db = state.db()?; + let context = require_permission(db, &headers, "items.write").await?; + let item_id = Uuid::new_v4(); + let mut payload = payload; + payload.item_number = + next_number_if_blank(db, &context.schema_name, "items", &payload.item_number).await?; + write_item( + db, + &state.crypto, + &context.schema_name, + item_id, + &payload, + true, + ) + .await?; + record_item_price_history(db, &context.schema_name, item_id, &payload, context.user_id).await?; + emit_change(&state, "Artikel angelegt"); + Ok(Json(item_response(item_id, payload))) +} + +pub async fn update_item( + headers: HeaderMap, + State(state): State, + Path(item_id): Path, + Json(payload): Json, +) -> Result, ApiError> { + validate_item_request(&payload)?; + let db = state.db()?; + let context = require_permission(db, &headers, "items.write").await?; + write_item( + db, + &state.crypto, + &context.schema_name, + item_id, + &payload, + false, + ) + .await?; + record_item_price_history(db, &context.schema_name, item_id, &payload, context.user_id).await?; + emit_change(&state, "Artikel geändert"); + Ok(Json(item_response(item_id, payload))) +} + +pub async fn list_item_price_history( + headers: HeaderMap, + State(state): State, + Path(item_id): Path, +) -> Result>, ApiError> { + let db = state.db()?; + let context = require_permission(db, &headers, "items.read").await?; + let sql = format!( + r#" + select id, item_id, purchase_price::text purchase_price, + sales_price::text sales_price, source, valid_from, + created_by_user_id, created_at + from {schema}.item_price_history + where item_id = $1 + order by valid_from desc, created_at desc + "#, + schema = context.schema_name + ); + let rows = sqlx::query(&sql).bind(item_id).fetch_all(db).await?; + Ok(Json( + rows.into_iter().map(item_price_history_from_row).collect(), + )) +} + +pub async fn delete_item( + headers: HeaderMap, + State(state): State, + Path(item_id): Path, +) -> Result, ApiError> { + let db = state.db()?; + let context = require_permission(db, &headers, "items.delete").await?; + set_record_inactive(db, &context.schema_name, "items", item_id).await?; + emit_change(&state, "Artikel deaktiviert"); + Ok(Json(json!({ "deleted": true, "id": item_id }))) +} + +pub async fn list_activities( + headers: HeaderMap, + State(state): State, +) -> Result>, ApiError> { + let db = state.db()?; + let context = require_permission(db, &headers, "activities.read").await?; + let sql = format!( + r#" + select id, activity_number, activity_type, title_ciphertext, title_nonce, title_key_id, + body_ciphertext, body_nonce, body_key_id, status, priority, due_at + from {schema}.activities order by updated_at desc, due_at + "#, + schema = context.schema_name + ); + let rows = sqlx::query(&sql).fetch_all(db).await?; + let mut activities = Vec::with_capacity(rows.len()); + for row in rows { + activities.push(activity_from_row(&state.crypto, row)?); + } + Ok(Json(activities)) +} + +pub async fn create_activity( + headers: HeaderMap, + State(state): State, + Json(payload): Json, +) -> Result, ApiError> { + validate_activity_request(&payload)?; + let db = state.db()?; + let context = require_permission(db, &headers, "activities.write").await?; + let activity_id = Uuid::new_v4(); + let mut payload = payload; + if payload + .activity_number + .as_deref() + .unwrap_or("") + .trim() + .is_empty() + { + payload.activity_number = Some(next_number(db, &context.schema_name, "activities").await?); + } + write_activity(db, &state.crypto, &context, activity_id, &payload, true).await?; + emit_change(&state, "Aktivität angelegt"); + Ok(Json(activity_response(activity_id, payload))) +} + +pub async fn update_activity( + headers: HeaderMap, + State(state): State, + Path(activity_id): Path, + Json(payload): Json, +) -> Result, ApiError> { + validate_activity_request(&payload)?; + let db = state.db()?; + let context = require_permission(db, &headers, "activities.write").await?; + write_activity(db, &state.crypto, &context, activity_id, &payload, false).await?; + emit_change(&state, "Aktivität geändert"); + Ok(Json(activity_response(activity_id, payload))) +} + +pub async fn delete_activity( + headers: HeaderMap, + State(state): State, + Path(activity_id): Path, +) -> Result, ApiError> { + let db = state.db()?; + let context = require_permission(db, &headers, "activities.delete").await?; + let sql = format!( + "update {schema}.activities set status = 'cancelled', updated_at = now() where id = $1", + schema = context.schema_name + ); + let result = sqlx::query(&sql).bind(activity_id).execute(db).await?; + ensure_changed(result.rows_affected(), "Aktivität nicht gefunden")?; + emit_change(&state, "Aktivität storniert"); + Ok(Json(json!({ "deleted": true, "id": activity_id }))) +} + +pub async fn list_users( + headers: HeaderMap, + State(state): State, +) -> Result>, ApiError> { + let db = state.db()?; + let context = require_permission(db, &headers, "users.read").await?; + let organization_id = context.organization_id; + let schema_name = context.schema_name; + let rows = sqlx::query( + r#" + select u.id, u.email, uo.status + from users u + join user_organizations uo on uo.user_id = u.id + where uo.organization_id = $1 + order by u.email + "#, + ) + .bind(organization_id) + .fetch_all(db) + .await?; + + let mut response = Vec::with_capacity(rows.len()); + for row in rows { + let user_id: Uuid = row.get("id"); + let roles_sql = format!( + "select r.code from {schema}.roles r join {schema}.user_roles ur on ur.role_id = r.id where ur.user_id = $1 order by r.code", + schema = schema_name + ); + let roles = sqlx::query_scalar::<_, String>(&roles_sql) + .bind(user_id) + .fetch_all(db) + .await?; + + response.push(OrganizationUserResponse { + user_id, + email: row.get("email"), + status: row.get("status"), + roles, + }); + } + + Ok(Json(response)) +} + +pub async fn invite_user( + headers: HeaderMap, + State(state): State, + Json(payload): Json, +) -> Result, ApiError> { + let db = state.db()?; + let context = require_permission(db, &headers, "users.invite").await?; + require_owner(db, &context.schema_name, context.user_id).await?; + let organization_id = context.organization_id; + let actor_user_id = context.user_id; + let schema_name = context.schema_name; + let email = normalize_email(&payload.email)?; + let user_id = ensure_user(db, &email).await?; + let invitation_token = generate_token(); + let invitation_token_hash = hash_token(&invitation_token); + + sqlx::query( + r#" + update users + set must_change_password = true, + initial_password_expires_at = now() + interval '7 days', + updated_at = now() + where id = $1 and password_hash is null + "#, + ) + .bind(user_id) + .execute(db) + .await?; + + sqlx::query( + r#" + insert into user_organizations (user_id, organization_id, status, invited_by_user_id, invited_at) + values ($1, $2, 'pending_invitation', $3, now()) + on conflict (user_id, organization_id) do update set + invited_by_user_id = excluded.invited_by_user_id, + invited_at = now(), + updated_at = now() + "#, + ) + .bind(user_id) + .bind(organization_id) + .bind(actor_user_id) + .execute(db) + .await?; + + let invitation_id = Uuid::new_v4(); + sqlx::query( + r#" + insert into user_invitations ( + id, organization_id, email, invited_by_user_id, expires_at, created_user_id, token_hash + ) values ($1, $2, $3, $4, now() + interval '7 days', $5, $6) + "#, + ) + .bind(invitation_id) + .bind(organization_id) + .bind(&email) + .bind(actor_user_id) + .bind(user_id) + .bind(invitation_token_hash) + .execute(db) + .await?; + + let roles = if payload.roles.is_empty() { + vec!["viewer".to_string()] + } else { + payload.roles + }; + for role in roles { + assign_role(db, &schema_name, user_id, &role).await?; + } + enqueue_invitation_email( + &state.crypto, + db, + &email, + &invitation_token, + organization_id, + ) + .await?; + + let mut response = json!({ + "id": invitation_id, + "user_id": user_id + }); + if dev_mode_enabled() { + response["dev_invitation_token"] = json!(invitation_token); + } + Ok(Json(response)) +} + +pub async fn update_user_roles( + headers: HeaderMap, + State(state): State, + Path(user_id): Path, + Json(payload): Json, +) -> Result, ApiError> { + let db = state.db()?; + let context = require_permission(db, &headers, "users.roles.write").await?; + require_owner(db, &context.schema_name, context.user_id).await?; + let organization_id = context.organization_id; + let actor_user_id = context.user_id; + let schema_name = context.schema_name; + + if payload.roles.is_empty() { + return Err(ApiError::bad_request( + "Mindestens eine Rolle ist erforderlich", + )); + } + + let member_exists: Option = sqlx::query_scalar( + "select user_id from user_organizations where organization_id = $1 and user_id = $2 limit 1", + ) + .bind(organization_id) + .bind(user_id) + .fetch_optional(db) + .await?; + + if member_exists.is_none() { + return Err(ApiError::not_found("Benutzer ist nicht Teil dieser Firma")); + } + + if user_id == actor_user_id && !payload.roles.iter().any(|role| role == "owner") { + return Err(ApiError::bad_request( + "Der Besitzer kann sich die Besitzerrolle nicht selbst entziehen", + )); + } + + replace_user_roles(db, &schema_name, user_id, &payload.roles).await?; + emit_change(&state, "Benutzerrechte geändert"); + + Ok(Json(json!({ + "saved": true, + "user_id": user_id, + "roles": payload.roles + }))) +} + +pub async fn disable_user( + headers: HeaderMap, + State(state): State, + Path(user_id): Path, +) -> Result, ApiError> { + let db = state.db()?; + let context = require_permission(db, &headers, "users.disable").await?; + require_owner(db, &context.schema_name, context.user_id).await?; + + if user_id == context.user_id { + return Err(ApiError::bad_request( + "Der Besitzer kann sich nicht selbst deaktivieren", + )); + } + + let result = sqlx::query( + r#" + update user_organizations + set status = 'disabled', updated_at = now() + where organization_id = $1 and user_id = $2 + "#, + ) + .bind(context.organization_id) + .bind(user_id) + .execute(db) + .await?; + + if result.rows_affected() == 0 { + return Err(ApiError::not_found("Benutzer ist nicht Teil dieser Firma")); + } + + emit_change(&state, "Benutzer deaktiviert"); + Ok(Json(json!({ "disabled": true, "user_id": user_id }))) +} + +fn validate_customer_request(payload: &CustomerRequest) -> Result<(), ApiError> { + if payload.name.trim().len() < 2 { + return Err(ApiError::bad_request("Kundenname ist zu kurz")); + } + if !["active", "inactive", "blocked"].contains(&payload.status.as_str()) { + return Err(ApiError::bad_request("Ungültiger Kundenstatus")); + } + let discount = payload + .standard_discount_percent + .parse::() + .map_err(|_| ApiError::bad_request("Ungültiger Kundenrabatt"))?; + if !(0.0..=100.0).contains(&discount) { + return Err(ApiError::bad_request( + "Kundenrabatt muss zwischen 0 und 100 liegen", + )); + } + Ok(()) +} + +fn customer_response(customer_id: Uuid, payload: CustomerRequest) -> CustomerResponse { + CustomerResponse { + id: customer_id, + customer_number: payload.customer_number.trim().to_string(), + name: payload.name.trim().to_string(), + status: payload.status, + details: payload.details, + standard_discount_percent: payload.standard_discount_percent, + cash_discount_term_id: payload.cash_discount_term_id, + } +} + +fn customer_from_row( + crypto: &DataCrypto, + row: sqlx::postgres::PgRow, +) -> Result { + let details = match row.get::>, _>("details_ciphertext") { + Some(ciphertext) => crypto.decrypt::( + &ciphertext, + &row.get::, _>("details_nonce"), + &row.get::("details_key_id"), + )?, + None => CustomerDetails::default(), + }; + Ok(CustomerResponse { + id: row.get("id"), + customer_number: row + .get::, _>("customer_number") + .unwrap_or_default(), + name: crypto.decrypt( + &row.get::, _>("name_ciphertext"), + &row.get::, _>("name_nonce"), + &row.get::("name_key_id"), + )?, + status: row.get("status"), + details, + standard_discount_percent: row.get("standard_discount_percent"), + cash_discount_term_id: row.get("cash_discount_term_id"), + }) +} + +async fn save_customer_terms( + db: &PgPool, + schema_name: &str, + customer_id: Uuid, + payload: &CustomerRequest, +) -> Result<(), ApiError> { + ensure_safe_schema_name(schema_name)?; + let deactivate_sql = format!( + "update {schema}.customer_price_terms set is_active = false, updated_at = now() where customer_id = $1 and is_active = true", + schema = schema_name + ); + sqlx::query(&deactivate_sql) + .bind(customer_id) + .execute(db) + .await?; + let insert_sql = format!( + r#" + insert into {schema}.customer_price_terms ( + id, customer_id, standard_discount_percent, cash_discount_term_id + ) values ($1, $2, $3::numeric, $4) + "#, + schema = schema_name + ); + sqlx::query(&insert_sql) + .bind(Uuid::new_v4()) + .bind(customer_id) + .bind(payload.standard_discount_percent.trim()) + .bind(payload.cash_discount_term_id) + .execute(db) + .await?; + Ok(()) +} + +fn validate_supplier_request(payload: &SupplierRequest) -> Result<(), ApiError> { + if payload.name.trim().len() < 2 { + return Err(ApiError::bad_request("Lieferantenname ist erforderlich")); + } + validate_status(&payload.status)?; + validate_percent(&payload.standard_discount_percent, "Lieferantenrabatt")?; + if payload.payment_days.is_some_and(|days| days < 0) { + return Err(ApiError::bad_request( + "Zahlungsziel darf nicht negativ sein", + )); + } + Ok(()) +} + +async fn write_supplier( + db: &PgPool, + crypto: &DataCrypto, + schema_name: &str, + supplier_id: Uuid, + payload: &SupplierRequest, + insert: bool, +) -> Result<(), ApiError> { + let name = crypto.encrypt(&payload.name.trim().to_string())?; + let details = crypto.encrypt(&payload.details)?; + let sql = if insert { + format!( + r#"insert into {schema}.suppliers ( + id, supplier_number, name_ciphertext, name_nonce, name_key_id, status, + details_ciphertext, details_nonce, details_key_id + ) values ($1,$2,$3,$4,$5,$6,$7,$8,$9)"#, + schema = schema_name + ) + } else { + format!( + r#"update {schema}.suppliers set supplier_number=supplier_number, name_ciphertext=$3, + name_nonce=$4, name_key_id=$5, status=$6, details_ciphertext=$7, + details_nonce=$8, details_key_id=$9, updated_at=now() where id=$1"#, + schema = schema_name + ) + }; + let result = sqlx::query(&sql) + .bind(supplier_id) + .bind(payload.supplier_number.trim()) + .bind(name.ciphertext) + .bind(name.nonce) + .bind(name.key_id) + .bind(&payload.status) + .bind(details.ciphertext) + .bind(details.nonce) + .bind(details.key_id) + .execute(db) + .await?; + if !insert { + ensure_changed(result.rows_affected(), "Lieferant nicht gefunden")?; + } + Ok(()) +} + +async fn save_supplier_terms( + db: &PgPool, + schema_name: &str, + supplier_id: Uuid, + payload: &SupplierRequest, +) -> Result<(), ApiError> { + let deactivate = format!( + "update {schema}.supplier_price_terms set is_active=false, updated_at=now() where supplier_id=$1 and is_active=true", + schema = schema_name + ); + sqlx::query(&deactivate) + .bind(supplier_id) + .execute(db) + .await?; + let insert = format!( + r#"insert into {schema}.supplier_price_terms ( + id, supplier_id, standard_discount_percent, cash_discount_term_id, payment_days + ) values ($1,$2,$3::numeric,$4,$5)"#, + schema = schema_name + ); + sqlx::query(&insert) + .bind(Uuid::new_v4()) + .bind(supplier_id) + .bind(payload.standard_discount_percent.trim()) + .bind(payload.cash_discount_term_id) + .bind(payload.payment_days) + .execute(db) + .await?; + Ok(()) +} + +async fn apply_customer_terms_to_quote( + db: &PgPool, + schema_name: &str, + payload: &mut QuoteRequest, +) -> Result<(), ApiError> { + if let Some((discount, cash_discount_term_id)) = + load_customer_terms(db, schema_name, payload.customer_id).await? + { + if payload.customer_discount_percent.trim().is_empty() + || payload.customer_discount_percent.trim() == "0" + || payload.customer_discount_percent.trim() == "0.00" + { + payload.customer_discount_percent = discount; + } + if payload.cash_discount_term_id.is_none() { + payload.cash_discount_term_id = cash_discount_term_id; + } + } + Ok(()) +} + +async fn apply_customer_terms_to_outgoing_invoice( + db: &PgPool, + schema_name: &str, + payload: &mut OutgoingInvoiceRequest, +) -> Result<(), ApiError> { + if let Some((discount, cash_discount_term_id)) = + load_customer_terms(db, schema_name, payload.customer_id).await? + { + if payload.customer_discount_percent.trim().is_empty() + || payload.customer_discount_percent.trim() == "0" + || payload.customer_discount_percent.trim() == "0.00" + { + payload.customer_discount_percent = discount; + } + if payload.cash_discount_term_id.is_none() { + payload.cash_discount_term_id = cash_discount_term_id; + } + } + Ok(()) +} + +async fn apply_supplier_terms_to_incoming_invoice( + db: &PgPool, + schema_name: &str, + payload: &mut IncomingInvoiceRequest, +) -> Result<(), ApiError> { + if payload.cash_discount_term_id.is_none() { + payload.cash_discount_term_id = + load_supplier_cash_discount_term(db, schema_name, payload.supplier_id).await?; + } + Ok(()) +} + +async fn load_customer_terms( + db: &PgPool, + schema_name: &str, + customer_id: Uuid, +) -> Result)>, ApiError> { + ensure_safe_schema_name(schema_name)?; + let sql = format!( + r#" + select standard_discount_percent::text standard_discount_percent, + cash_discount_term_id + from {schema}.customer_price_terms + where customer_id=$1 and is_active=true + order by updated_at desc + limit 1 + "#, + schema = schema_name + ); + Ok(sqlx::query(&sql) + .bind(customer_id) + .fetch_optional(db) + .await? + .map(|row| { + ( + row.get("standard_discount_percent"), + row.get("cash_discount_term_id"), + ) + })) +} + +async fn load_supplier_cash_discount_term( + db: &PgPool, + schema_name: &str, + supplier_id: Uuid, +) -> Result, ApiError> { + ensure_safe_schema_name(schema_name)?; + let sql = format!( + r#" + select cash_discount_term_id + from {schema}.supplier_price_terms + where supplier_id=$1 and is_active=true + order by updated_at desc + limit 1 + "#, + schema = schema_name + ); + Ok(sqlx::query_scalar::<_, Option>(&sql) + .bind(supplier_id) + .fetch_optional(db) + .await? + .flatten()) +} + +fn supplier_from_row( + crypto: &DataCrypto, + row: sqlx::postgres::PgRow, +) -> Result { + let details = match row.get::>, _>("details_ciphertext") { + Some(ciphertext) => crypto.decrypt::( + &ciphertext, + &row.get::, _>("details_nonce"), + &row.get::("details_key_id"), + )?, + None => CustomerDetails::default(), + }; + Ok(SupplierResponse { + id: row.get("id"), + supplier_number: row + .get::, _>("supplier_number") + .unwrap_or_default(), + name: crypto.decrypt( + &row.get::, _>("name_ciphertext"), + &row.get::, _>("name_nonce"), + &row.get::("name_key_id"), + )?, + status: row.get("status"), + details, + standard_discount_percent: row.get("standard_discount_percent"), + cash_discount_term_id: row.get("cash_discount_term_id"), + payment_days: row.get("payment_days"), + }) +} + +fn supplier_response(id: Uuid, payload: SupplierRequest) -> SupplierResponse { + SupplierResponse { + id, + supplier_number: payload.supplier_number.trim().to_string(), + name: payload.name.trim().to_string(), + status: payload.status, + details: payload.details, + standard_discount_percent: payload.standard_discount_percent, + cash_discount_term_id: payload.cash_discount_term_id, + payment_days: payload.payment_days, + } +} + +fn validate_cash_discount_term(payload: &CashDiscountTermRequest) -> Result<(), ApiError> { + if payload.code.trim().is_empty() || payload.name.trim().len() < 2 { + return Err(ApiError::bad_request( + "Code und Name der Skonto-Regel sind erforderlich", + )); + } + validate_percent(&payload.discount_percent, "Skonto")?; + if payload.discount_days < 0 { + return Err(ApiError::bad_request( + "Skontotage dürfen nicht negativ sein", + )); + } + if let Some(net_days) = payload.net_days { + if net_days < payload.discount_days { + return Err(ApiError::bad_request( + "Netto-Zahlungsziel darf nicht kleiner als die Skontofrist sein", + )); + } + } + Ok(()) +} + +async fn write_cash_discount_term( + db: &PgPool, + schema_name: &str, + term_id: Uuid, + payload: &CashDiscountTermRequest, + insert: bool, +) -> Result<(), ApiError> { + ensure_safe_schema_name(schema_name)?; + if payload.is_default_customer_term { + let sql = format!( + "update {schema}.cash_discount_terms set is_default_customer_term=false, updated_at=now() where id <> $1", + schema = schema_name + ); + sqlx::query(&sql).bind(term_id).execute(db).await?; + } + if payload.is_default_supplier_term { + let sql = format!( + "update {schema}.cash_discount_terms set is_default_supplier_term=false, updated_at=now() where id <> $1", + schema = schema_name + ); + sqlx::query(&sql).bind(term_id).execute(db).await?; + } + + let sql = if insert { + format!( + r#" + insert into {schema}.cash_discount_terms ( + id, code, name, discount_percent, discount_days, net_days, + valid_from, valid_until, is_default_customer_term, + is_default_supplier_term, is_active + ) values ($1,$2,$3,$4::numeric,$5,$6,$7::date,$8::date,$9,$10,$11) + "#, + schema = schema_name + ) + } else { + format!( + r#" + update {schema}.cash_discount_terms + set code=$2, name=$3, discount_percent=$4::numeric, + discount_days=$5, net_days=$6, valid_from=$7::date, + valid_until=$8::date, is_default_customer_term=$9, + is_default_supplier_term=$10, is_active=$11, updated_at=now() + where id=$1 + "#, + schema = schema_name + ) + }; + let result = sqlx::query(&sql) + .bind(term_id) + .bind(payload.code.trim()) + .bind(payload.name.trim()) + .bind(payload.discount_percent.trim()) + .bind(payload.discount_days) + .bind(payload.net_days) + .bind( + payload + .valid_from + .as_deref() + .filter(|value| !value.is_empty()), + ) + .bind( + payload + .valid_until + .as_deref() + .filter(|value| !value.is_empty()), + ) + .bind(payload.is_default_customer_term) + .bind(payload.is_default_supplier_term) + .bind(payload.is_active) + .execute(db) + .await?; + if !insert { + ensure_changed(result.rows_affected(), "Skonto-Regel nicht gefunden")?; + } + Ok(()) +} + +fn cash_discount_term_response( + id: Uuid, + payload: CashDiscountTermRequest, +) -> CashDiscountTermResponse { + CashDiscountTermResponse { + id, + code: payload.code.trim().to_string(), + name: payload.name.trim().to_string(), + discount_percent: payload.discount_percent.trim().to_string(), + discount_days: payload.discount_days, + net_days: payload.net_days, + valid_from: payload.valid_from, + valid_until: payload.valid_until, + is_default_customer_term: payload.is_default_customer_term, + is_default_supplier_term: payload.is_default_supplier_term, + is_active: payload.is_active, + } +} + +fn cash_discount_term_from_row(row: sqlx::postgres::PgRow) -> CashDiscountTermResponse { + CashDiscountTermResponse { + id: row.get("id"), + code: row.get("code"), + name: row.get("name"), + discount_percent: row.get("discount_percent"), + discount_days: row.get("discount_days"), + net_days: row.get("net_days"), + valid_from: row.get("valid_from"), + valid_until: row.get("valid_until"), + is_default_customer_term: row.get("is_default_customer_term"), + is_default_supplier_term: row.get("is_default_supplier_term"), + is_active: row.get("is_active"), + } +} + +fn validate_quote_request(payload: &QuoteRequest) -> Result<(), ApiError> { + validate_status_choice( + &payload.status, + &[ + "draft", + "sent", + "accepted", + "rejected", + "expired", + "cancelled", + ], + "Ungültiger Angebotsstatus", + )?; + validate_percent(&payload.customer_discount_percent, "Kundenrabatt")?; + if payload.items.is_empty() { + return Err(ApiError::bad_request( + "Ein Angebot braucht mindestens eine Position", + )); + } + for item in &payload.items { + validate_number(&item.quantity, "Menge")?; + if item.quantity.parse::().unwrap_or(0.0) <= 0.0 { + return Err(ApiError::bad_request("Menge muss größer als 0 sein")); + } + validate_number(&item.unit_price, "Positionspreis")?; + validate_number(&item.tax_rate, "Steuersatz")?; + validate_percent(&item.discount_percent, "Positionsrabatt")?; + if let Some(original_price) = &item.original_unit_price { + validate_number(original_price, "Originalpreis")?; + } + } + Ok(()) +} + +async fn write_quote( + db: &PgPool, + crypto: &DataCrypto, + context: &AuthContext, + quote_id: Uuid, + payload: &QuoteRequest, + insert: bool, +) -> Result<(), ApiError> { + ensure_safe_schema_name(&context.schema_name)?; + ensure_customer_exists(db, &context.schema_name, payload.customer_id).await?; + for item in &payload.items { + ensure_item_exists(db, &context.schema_name, item.item_id).await?; + } + let notes = if payload.notes.trim().is_empty() { + None + } else { + Some(crypto.encrypt(&payload.notes)?) + }; + let sql = if insert { + format!( + r#" + insert into {schema}.quotes ( + id, quote_number, customer_id, status, valid_until, + cash_discount_term_id, customer_discount_percent, + notes_ciphertext, notes_nonce, notes_key_id, created_by_user_id + ) values ($1,$2,$3,$4,$5::date,$6,$7::numeric,$8,$9,$10,$11) + "#, + schema = context.schema_name + ) + } else { + format!( + r#" + update {schema}.quotes + set quote_number=quote_number, customer_id=$3, status=$4, valid_until=$5::date, + cash_discount_term_id=$6, customer_discount_percent=$7::numeric, + notes_ciphertext=$8, notes_nonce=$9, notes_key_id=$10, + updated_at=now() + where id=$1 + "#, + schema = context.schema_name + ) + }; + let result = sqlx::query(&sql) + .bind(quote_id) + .bind(payload.quote_number.trim()) + .bind(payload.customer_id) + .bind(&payload.status) + .bind( + payload + .valid_until + .as_deref() + .filter(|value| !value.is_empty()), + ) + .bind(payload.cash_discount_term_id) + .bind(payload.customer_discount_percent.trim()) + .bind(notes.as_ref().map(|field| field.ciphertext.clone())) + .bind(notes.as_ref().map(|field| field.nonce.clone())) + .bind(notes.as_ref().map(|field| field.key_id.clone())) + .bind(context.user_id) + .execute(db) + .await?; + if !insert { + ensure_changed(result.rows_affected(), "Angebot nicht gefunden")?; + let delete_sql = format!( + "delete from {schema}.quote_items where quote_id=$1", + schema = context.schema_name + ); + sqlx::query(&delete_sql).bind(quote_id).execute(db).await?; + } + write_quote_items(db, crypto, &context.schema_name, quote_id, &payload.items).await +} + +async fn write_quote_items( + db: &PgPool, + crypto: &DataCrypto, + schema_name: &str, + quote_id: Uuid, + items: &[QuoteItemRequest], +) -> Result<(), ApiError> { + ensure_safe_schema_name(schema_name)?; + let sql = format!( + r#" + insert into {schema}.quote_items ( + id, quote_id, line_number, item_id, description_ciphertext, + description_nonce, description_key_id, quantity, unit_price, + original_unit_price, discount_percent, price_overridden, tax_rate + ) values ($1,$2,$3,$4,$5,$6,$7,$8::numeric,$9::numeric,$10::numeric,$11::numeric,$12,$13::numeric) + "#, + schema = schema_name + ); + for (index, item) in items.iter().enumerate() { + let description = if item.description.trim().is_empty() { + None + } else { + Some(crypto.encrypt(&item.description)?) + }; + let price_overridden = item + .original_unit_price + .as_ref() + .is_some_and(|original| original.trim() != item.unit_price.trim()); + sqlx::query(&sql) + .bind(Uuid::new_v4()) + .bind(quote_id) + .bind((index + 1) as i32) + .bind(item.item_id) + .bind(description.as_ref().map(|field| field.ciphertext.clone())) + .bind(description.as_ref().map(|field| field.nonce.clone())) + .bind(description.as_ref().map(|field| field.key_id.clone())) + .bind(item.quantity.trim()) + .bind(item.unit_price.trim()) + .bind(item.original_unit_price.as_deref()) + .bind(item.discount_percent.trim()) + .bind(price_overridden) + .bind(item.tax_rate.trim()) + .execute(db) + .await?; + } + Ok(()) +} + +async fn ensure_customer_exists( + db: &PgPool, + schema_name: &str, + customer_id: Uuid, +) -> Result<(), ApiError> { + let sql = format!( + "select exists(select 1 from {schema}.customers where id=$1 and status='active')", + schema = schema_name + ); + if sqlx::query_scalar::<_, bool>(&sql) + .bind(customer_id) + .fetch_one(db) + .await? + { + Ok(()) + } else { + Err(ApiError::bad_request( + "Kunde ist nicht vorhanden oder inaktiv", + )) + } +} + +async fn ensure_item_exists(db: &PgPool, schema_name: &str, item_id: Uuid) -> Result<(), ApiError> { + let sql = format!( + "select exists(select 1 from {schema}.items where id=$1 and status='active')", + schema = schema_name + ); + if sqlx::query_scalar::<_, bool>(&sql) + .bind(item_id) + .fetch_one(db) + .await? + { + Ok(()) + } else { + Err(ApiError::bad_request( + "Artikel ist nicht vorhanden oder inaktiv", + )) + } +} + +fn quote_response(id: Uuid, payload: QuoteRequest) -> QuoteResponse { + QuoteResponse { + id, + quote_number: payload.quote_number.trim().to_string(), + customer_id: payload.customer_id, + status: payload.status, + valid_until: payload.valid_until, + cash_discount_term_id: payload.cash_discount_term_id, + customer_discount_percent: payload.customer_discount_percent, + notes: payload.notes, + items: payload + .items + .into_iter() + .enumerate() + .map(|(index, item)| { + let price_overridden = item + .original_unit_price + .as_ref() + .is_some_and(|original| original.trim() != item.unit_price.trim()); + QuoteItemResponse { + id: Uuid::new_v4(), + line_number: (index + 1) as i32, + item_id: item.item_id, + description: item.description, + quantity: item.quantity, + unit_price: item.unit_price, + original_unit_price: item.original_unit_price, + discount_percent: item.discount_percent, + tax_rate: item.tax_rate, + price_overridden, + } + }) + .collect(), + } +} + +async fn quote_from_row( + db: &PgPool, + crypto: &DataCrypto, + schema_name: &str, + row: sqlx::postgres::PgRow, + quote_id: Uuid, +) -> Result { + let notes = match row.get::>, _>("notes_ciphertext") { + Some(ciphertext) => crypto.decrypt::( + &ciphertext, + &row.get::, _>("notes_nonce"), + &row.get::("notes_key_id"), + )?, + None => String::new(), + }; + Ok(QuoteResponse { + id: quote_id, + quote_number: row.get("quote_number"), + customer_id: row.get("customer_id"), + status: row.get("status"), + valid_until: row.get("valid_until"), + cash_discount_term_id: row.get("cash_discount_term_id"), + customer_discount_percent: row.get("customer_discount_percent"), + notes, + items: load_quote_items(db, crypto, schema_name, quote_id).await?, + }) +} + +async fn load_quote_items( + db: &PgPool, + crypto: &DataCrypto, + schema_name: &str, + quote_id: Uuid, +) -> Result, ApiError> { + ensure_safe_schema_name(schema_name)?; + let sql = format!( + r#" + select id, line_number, item_id, description_ciphertext, description_nonce, + description_key_id, quantity::text quantity, unit_price::text unit_price, + original_unit_price::text original_unit_price, + discount_percent::text discount_percent, tax_rate::text tax_rate, + price_overridden + from {schema}.quote_items + where quote_id=$1 + order by line_number + "#, + schema = schema_name + ); + let rows = sqlx::query(&sql).bind(quote_id).fetch_all(db).await?; + let mut items = Vec::with_capacity(rows.len()); + for row in rows { + let description = match row.get::>, _>("description_ciphertext") { + Some(ciphertext) => crypto.decrypt::( + &ciphertext, + &row.get::, _>("description_nonce"), + &row.get::("description_key_id"), + )?, + None => String::new(), + }; + items.push(QuoteItemResponse { + id: row.get("id"), + line_number: row.get("line_number"), + item_id: row.get("item_id"), + description, + quantity: row.get("quantity"), + unit_price: row.get("unit_price"), + original_unit_price: row.get("original_unit_price"), + discount_percent: row.get("discount_percent"), + tax_rate: row.get("tax_rate"), + price_overridden: row.get("price_overridden"), + }); + } + Ok(items) +} + +async fn load_quote_by_id( + db: &PgPool, + crypto: &DataCrypto, + schema_name: &str, + quote_id: Uuid, +) -> Result { + ensure_safe_schema_name(schema_name)?; + let sql = format!( + r#" + select id, quote_number, customer_id, status, valid_until::text valid_until, + cash_discount_term_id, customer_discount_percent::text customer_discount_percent, + notes_ciphertext, notes_nonce, notes_key_id + from {schema}.quotes + where id=$1 + "#, + schema = schema_name + ); + let row = sqlx::query(&sql) + .bind(quote_id) + .fetch_optional(db) + .await? + .ok_or_else(|| ApiError::not_found("Angebot nicht gefunden"))?; + quote_from_row(db, crypto, schema_name, row, quote_id).await +} + +fn validate_outgoing_invoice_request(payload: &OutgoingInvoiceRequest) -> Result<(), ApiError> { + validate_status_choice( + &payload.status, + &["draft", "finalized", "sent", "paid", "cancelled", "overdue"], + "Ungültiger Rechnungsstatus", + )?; + validate_percent(&payload.customer_discount_percent, "Kundenrabatt")?; + if payload.items.is_empty() { + return Err(ApiError::bad_request( + "Eine Rechnung braucht mindestens eine Position", + )); + } + for item in &payload.items { + validate_number(&item.quantity, "Menge")?; + if item.quantity.parse::().unwrap_or(0.0) <= 0.0 { + return Err(ApiError::bad_request("Menge muss größer als 0 sein")); + } + validate_number(&item.unit_price, "Positionspreis")?; + validate_number(&item.tax_rate, "Steuersatz")?; + validate_percent(&item.discount_percent, "Positionsrabatt")?; + if let Some(original_price) = &item.original_unit_price { + validate_number(original_price, "Originalpreis")?; + } + } + Ok(()) +} + +async fn write_outgoing_invoice( + db: &PgPool, + crypto: &DataCrypto, + context: &AuthContext, + invoice_id: Uuid, + payload: &OutgoingInvoiceRequest, + insert: bool, +) -> Result<(), ApiError> { + ensure_safe_schema_name(&context.schema_name)?; + ensure_customer_exists(db, &context.schema_name, payload.customer_id).await?; + for item in &payload.items { + ensure_item_exists(db, &context.schema_name, item.item_id).await?; + } + let sql = if insert { + format!( + r#" + insert into {schema}.outgoing_invoices ( + id, invoice_number, customer_id, status, cash_discount_term_id, + customer_discount_percent, issued_at, due_at, source_quote_id, created_by_user_id + ) values ($1,$2,$3,$4,$5,$6::numeric,$7::date,$8::date,$9,$10) + "#, + schema = context.schema_name + ) + } else { + format!( + r#" + update {schema}.outgoing_invoices + set invoice_number=invoice_number, customer_id=$3, status=$4, cash_discount_term_id=$5, + customer_discount_percent=$6::numeric, issued_at=$7::date, + due_at=$8::date, source_quote_id=$9, updated_at=now() + where id=$1 + "#, + schema = context.schema_name + ) + }; + let result = sqlx::query(&sql) + .bind(invoice_id) + .bind(payload.invoice_number.trim()) + .bind(payload.customer_id) + .bind(&payload.status) + .bind(payload.cash_discount_term_id) + .bind(payload.customer_discount_percent.trim()) + .bind( + payload + .issued_at + .as_deref() + .filter(|value| !value.is_empty()), + ) + .bind(payload.due_at.as_deref().filter(|value| !value.is_empty())) + .bind(payload.source_quote_id) + .bind(context.user_id) + .execute(db) + .await?; + if !insert { + ensure_changed(result.rows_affected(), "Ausgangsrechnung nicht gefunden")?; + let delete_sql = format!( + "delete from {schema}.outgoing_invoice_items where invoice_id=$1", + schema = context.schema_name + ); + sqlx::query(&delete_sql) + .bind(invoice_id) + .execute(db) + .await?; + } + write_outgoing_invoice_items(db, crypto, context, invoice_id, &payload.items).await +} + +async fn write_outgoing_invoice_items( + db: &PgPool, + crypto: &DataCrypto, + context: &AuthContext, + invoice_id: Uuid, + items: &[OutgoingInvoiceItemRequest], +) -> Result<(), ApiError> { + let sql = format!( + r#" + insert into {schema}.outgoing_invoice_items ( + id, invoice_id, line_number, item_id, description_ciphertext, + description_nonce, description_key_id, quantity, unit_price, + original_unit_price, discount_percent, price_overridden, + price_overridden_by_user_id, price_overridden_at, tax_rate + ) values ($1,$2,$3,$4,$5,$6,$7,$8::numeric,$9::numeric,$10::numeric,$11::numeric,$12,$13,$14,$15::numeric) + "#, + schema = context.schema_name + ); + for (index, item) in items.iter().enumerate() { + let description = if item.description.trim().is_empty() { + None + } else { + Some(crypto.encrypt(&item.description)?) + }; + let price_overridden = item + .original_unit_price + .as_ref() + .is_some_and(|original| original.trim() != item.unit_price.trim()); + sqlx::query(&sql) + .bind(Uuid::new_v4()) + .bind(invoice_id) + .bind((index + 1) as i32) + .bind(item.item_id) + .bind(description.as_ref().map(|field| field.ciphertext.clone())) + .bind(description.as_ref().map(|field| field.nonce.clone())) + .bind(description.as_ref().map(|field| field.key_id.clone())) + .bind(item.quantity.trim()) + .bind(item.unit_price.trim()) + .bind(item.original_unit_price.as_deref()) + .bind(item.discount_percent.trim()) + .bind(price_overridden) + .bind(if price_overridden { + Some(context.user_id) + } else { + None + }) + .bind(if price_overridden { + Some(Utc::now()) + } else { + None + }) + .bind(item.tax_rate.trim()) + .execute(db) + .await?; + } + Ok(()) +} + +fn outgoing_invoice_response( + id: Uuid, + payload: OutgoingInvoiceRequest, + finalized_at: Option>, +) -> OutgoingInvoiceResponse { + OutgoingInvoiceResponse { + id, + invoice_number: payload.invoice_number.trim().to_string(), + customer_id: payload.customer_id, + status: payload.status, + cash_discount_term_id: payload.cash_discount_term_id, + customer_discount_percent: payload.customer_discount_percent, + issued_at: payload.issued_at, + due_at: payload.due_at, + source_quote_id: payload.source_quote_id, + finalized_at, + items: payload + .items + .into_iter() + .enumerate() + .map(|(index, item)| { + let price_overridden = item + .original_unit_price + .as_ref() + .is_some_and(|original| original.trim() != item.unit_price.trim()); + OutgoingInvoiceItemResponse { + id: Uuid::new_v4(), + line_number: (index + 1) as i32, + item_id: item.item_id, + description: item.description, + quantity: item.quantity, + unit_price: item.unit_price, + original_unit_price: item.original_unit_price, + discount_percent: item.discount_percent, + tax_rate: item.tax_rate, + price_overridden, + } + }) + .collect(), + } +} + +async fn outgoing_invoice_from_row( + db: &PgPool, + crypto: &DataCrypto, + schema_name: &str, + row: sqlx::postgres::PgRow, + invoice_id: Uuid, +) -> Result { + Ok(OutgoingInvoiceResponse { + id: invoice_id, + invoice_number: row + .get::, _>("invoice_number") + .unwrap_or_default(), + customer_id: row.get("customer_id"), + status: row.get("status"), + cash_discount_term_id: row.get("cash_discount_term_id"), + customer_discount_percent: row.get("customer_discount_percent"), + issued_at: row.get("issued_at"), + due_at: row.get("due_at"), + source_quote_id: row.get("source_quote_id"), + finalized_at: row.get("finalized_at"), + items: load_outgoing_invoice_items(db, crypto, schema_name, invoice_id).await?, + }) +} + +async fn load_outgoing_invoice_items( + db: &PgPool, + crypto: &DataCrypto, + schema_name: &str, + invoice_id: Uuid, +) -> Result, ApiError> { + ensure_safe_schema_name(schema_name)?; + let sql = format!( + r#" + select id, line_number, item_id, description_ciphertext, description_nonce, + description_key_id, quantity::text quantity, unit_price::text unit_price, + original_unit_price::text original_unit_price, + discount_percent::text discount_percent, tax_rate::text tax_rate, + price_overridden + from {schema}.outgoing_invoice_items + where invoice_id=$1 + order by line_number + "#, + schema = schema_name + ); + let rows = sqlx::query(&sql).bind(invoice_id).fetch_all(db).await?; + let mut items = Vec::with_capacity(rows.len()); + for row in rows { + let description = match row.get::>, _>("description_ciphertext") { + Some(ciphertext) => crypto.decrypt::( + &ciphertext, + &row.get::, _>("description_nonce"), + &row.get::("description_key_id"), + )?, + None => String::new(), + }; + items.push(OutgoingInvoiceItemResponse { + id: row.get("id"), + line_number: row.get("line_number"), + item_id: row.get("item_id"), + description, + quantity: row.get("quantity"), + unit_price: row.get("unit_price"), + original_unit_price: row.get("original_unit_price"), + discount_percent: row.get("discount_percent"), + tax_rate: row.get("tax_rate"), + price_overridden: row.get("price_overridden"), + }); + } + Ok(items) +} + +async fn ensure_outgoing_invoice_editable( + db: &PgPool, + schema_name: &str, + invoice_id: Uuid, +) -> Result<(), ApiError> { + ensure_safe_schema_name(schema_name)?; + let sql = format!( + "select finalized_at from {schema}.outgoing_invoices where id=$1", + schema = schema_name + ); + let finalized_at = sqlx::query_scalar::<_, Option>>(&sql) + .bind(invoice_id) + .fetch_optional(db) + .await? + .ok_or_else(|| ApiError::not_found("Ausgangsrechnung nicht gefunden"))?; + if finalized_at.is_some() { + Err(ApiError::bad_request( + "Abgeschlossene Rechnungen dürfen nicht geändert werden", + )) + } else { + Ok(()) + } +} + +fn validate_incoming_invoice_request(payload: &IncomingInvoiceRequest) -> Result<(), ApiError> { + validate_status_choice( + &payload.status, + &[ + "draft", + "received", + "approved", + "paid", + "cancelled", + "overdue", + ], + "Ungültiger Eingangsrechnungsstatus", + )?; + if payload.invoice_number.trim().is_empty() { + return Err(ApiError::bad_request( + "Rechnungsnummer des Lieferanten fehlt", + )); + } + if payload.items.is_empty() { + return Err(ApiError::bad_request( + "Eine Eingangsrechnung braucht mindestens eine Position", + )); + } + for item in &payload.items { + validate_number(&item.quantity, "Menge")?; + if item.quantity.parse::().unwrap_or(0.0) <= 0.0 { + return Err(ApiError::bad_request("Menge muss größer als 0 sein")); + } + validate_number(&item.unit_price, "Positionspreis")?; + validate_number(&item.tax_rate, "Steuersatz")?; + } + Ok(()) +} + +async fn write_incoming_invoice( + db: &PgPool, + crypto: &DataCrypto, + context: &AuthContext, + invoice_id: Uuid, + payload: &IncomingInvoiceRequest, + insert: bool, +) -> Result<(), ApiError> { + ensure_supplier_exists(db, &context.schema_name, payload.supplier_id).await?; + for item in &payload.items { + if let Some(item_id) = item.item_id { + ensure_item_exists(db, &context.schema_name, item_id).await?; + } + } + let sql = if insert { + format!( + r#" + insert into {schema}.incoming_invoices ( + id, invoice_number, supplier_id, status, cash_discount_term_id, + invoice_date, due_at, created_by_user_id + ) values ($1,$2,$3,$4,$5,$6::date,$7::date,$8) + "#, + schema = context.schema_name + ) + } else { + format!( + r#" + update {schema}.incoming_invoices + set invoice_number=invoice_number, supplier_id=$3, status=$4, + cash_discount_term_id=$5, invoice_date=$6::date, + due_at=$7::date, updated_at=now() + where id=$1 + "#, + schema = context.schema_name + ) + }; + let result = sqlx::query(&sql) + .bind(invoice_id) + .bind(payload.invoice_number.trim()) + .bind(payload.supplier_id) + .bind(&payload.status) + .bind(payload.cash_discount_term_id) + .bind( + payload + .invoice_date + .as_deref() + .filter(|value| !value.is_empty()), + ) + .bind(payload.due_at.as_deref().filter(|value| !value.is_empty())) + .bind(context.user_id) + .execute(db) + .await?; + if !insert { + ensure_changed(result.rows_affected(), "Eingangsrechnung nicht gefunden")?; + let delete_sql = format!( + "delete from {schema}.incoming_invoice_items where invoice_id=$1", + schema = context.schema_name + ); + sqlx::query(&delete_sql) + .bind(invoice_id) + .execute(db) + .await?; + } + write_incoming_invoice_items(db, crypto, &context.schema_name, invoice_id, &payload.items).await +} + +async fn write_incoming_invoice_items( + db: &PgPool, + crypto: &DataCrypto, + schema_name: &str, + invoice_id: Uuid, + items: &[IncomingInvoiceItemRequest], +) -> Result<(), ApiError> { + ensure_safe_schema_name(schema_name)?; + let sql = format!( + r#" + insert into {schema}.incoming_invoice_items ( + id, invoice_id, line_number, item_id, description_ciphertext, + description_nonce, description_key_id, quantity, unit_price, tax_rate + ) values ($1,$2,$3,$4,$5,$6,$7,$8::numeric,$9::numeric,$10::numeric) + "#, + schema = schema_name + ); + for (index, item) in items.iter().enumerate() { + let description = if item.description.trim().is_empty() { + None + } else { + Some(crypto.encrypt(&item.description)?) + }; + sqlx::query(&sql) + .bind(Uuid::new_v4()) + .bind(invoice_id) + .bind((index + 1) as i32) + .bind(item.item_id) + .bind(description.as_ref().map(|field| field.ciphertext.clone())) + .bind(description.as_ref().map(|field| field.nonce.clone())) + .bind(description.as_ref().map(|field| field.key_id.clone())) + .bind(item.quantity.trim()) + .bind(item.unit_price.trim()) + .bind(item.tax_rate.trim()) + .execute(db) + .await?; + } + Ok(()) +} + +fn incoming_invoice_response(id: Uuid, payload: IncomingInvoiceRequest) -> IncomingInvoiceResponse { + IncomingInvoiceResponse { + id, + invoice_number: payload.invoice_number.trim().to_string(), + supplier_id: payload.supplier_id, + status: payload.status, + cash_discount_term_id: payload.cash_discount_term_id, + invoice_date: payload.invoice_date, + due_at: payload.due_at, + items: payload + .items + .into_iter() + .enumerate() + .map(|(index, item)| IncomingInvoiceItemResponse { + id: Uuid::new_v4(), + line_number: (index + 1) as i32, + item_id: item.item_id, + description: item.description, + quantity: item.quantity, + unit_price: item.unit_price, + tax_rate: item.tax_rate, + }) + .collect(), + } +} + +async fn incoming_invoice_from_row( + db: &PgPool, + crypto: &DataCrypto, + schema_name: &str, + row: sqlx::postgres::PgRow, + invoice_id: Uuid, +) -> Result { + Ok(IncomingInvoiceResponse { + id: invoice_id, + invoice_number: row + .get::, _>("invoice_number") + .unwrap_or_default(), + supplier_id: row.get("supplier_id"), + status: row.get("status"), + cash_discount_term_id: row.get("cash_discount_term_id"), + invoice_date: row.get("invoice_date"), + due_at: row.get("due_at"), + items: load_incoming_invoice_items(db, crypto, schema_name, invoice_id).await?, + }) +} + +async fn load_incoming_invoice_items( + db: &PgPool, + crypto: &DataCrypto, + schema_name: &str, + invoice_id: Uuid, +) -> Result, ApiError> { + ensure_safe_schema_name(schema_name)?; + let sql = format!( + r#" + select id, line_number, item_id, description_ciphertext, description_nonce, + description_key_id, quantity::text quantity, unit_price::text unit_price, + tax_rate::text tax_rate + from {schema}.incoming_invoice_items + where invoice_id=$1 + order by line_number + "#, + schema = schema_name + ); + let rows = sqlx::query(&sql).bind(invoice_id).fetch_all(db).await?; + let mut items = Vec::with_capacity(rows.len()); + for row in rows { + let description = match row.get::>, _>("description_ciphertext") { + Some(ciphertext) => crypto.decrypt::( + &ciphertext, + &row.get::, _>("description_nonce"), + &row.get::("description_key_id"), + )?, + None => String::new(), + }; + items.push(IncomingInvoiceItemResponse { + id: row.get("id"), + line_number: row.get("line_number"), + item_id: row.get("item_id"), + description, + quantity: row.get("quantity"), + unit_price: row.get("unit_price"), + tax_rate: row.get("tax_rate"), + }); + } + Ok(items) +} + +async fn ensure_supplier_exists( + db: &PgPool, + schema_name: &str, + supplier_id: Uuid, +) -> Result<(), ApiError> { + ensure_safe_schema_name(schema_name)?; + let sql = format!( + "select exists(select 1 from {schema}.suppliers where id=$1 and status='active')", + schema = schema_name + ); + if sqlx::query_scalar::<_, bool>(&sql) + .bind(supplier_id) + .fetch_one(db) + .await? + { + Ok(()) + } else { + Err(ApiError::bad_request( + "Lieferant ist nicht vorhanden oder inaktiv", + )) + } +} + +async fn parse_price_list_rows( + db: &PgPool, + schema_name: &str, + payload: &PriceListImportRequest, +) -> Result, ApiError> { + ensure_safe_schema_name(schema_name)?; + let delimiter = payload + .delimiter + .as_deref() + .filter(|value| !value.is_empty()) + .unwrap_or(";"); + let mut lines = payload + .content + .lines() + .filter(|line| !line.trim().is_empty()); + let header = lines + .next() + .ok_or_else(|| ApiError::bad_request("CSV-Datei enthält keine Kopfzeile"))?; + let headers = split_csv_line(header, delimiter); + let required = [ + "item_number", + "name", + "unit", + "tax_rate", + "purchase_price", + "sales_price", + ]; + for column in required { + if !headers.iter().any(|header| header == column) { + return Err(ApiError::bad_request(&format!( + "CSV-Spalte fehlt: {column}" + ))); + } + } + let mut rows = Vec::new(); + for (index, line) in lines.enumerate() { + let values = split_csv_line(line, delimiter); + let value = |name: &str| -> String { + headers + .iter() + .position(|header| header == name) + .and_then(|position| values.get(position)) + .cloned() + .unwrap_or_default() + }; + let row_number = index + 2; + let item_number = value("item_number"); + let name = value("name"); + let unit = value("unit"); + let tax_rate = value("tax_rate"); + let purchase_price = empty_string_to_none(value("purchase_price")); + let sales_price = empty_string_to_none(value("sales_price")); + let mut error = None; + if item_number.trim().is_empty() { + error = Some("Artikelnummer fehlt".to_string()); + } else if name.trim().is_empty() { + error = Some("Bezeichnung fehlt".to_string()); + } else if tax_rate.parse::().is_err() { + error = Some("Steuersatz ist ungültig".to_string()); + } else if purchase_price + .as_ref() + .is_some_and(|price| price.parse::().is_err()) + { + error = Some("Einkaufspreis ist ungültig".to_string()); + } else if sales_price + .as_ref() + .is_some_and(|price| price.parse::().is_err()) + { + error = Some("Verkaufspreis ist ungültig".to_string()); + } + let action = if item_number_exists(db, schema_name, &item_number).await? { + "update" + } else { + "create" + }; + rows.push(PriceListImportRow { + row_number, + item_number, + name, + unit: if unit.trim().is_empty() { + "Stk".to_string() + } else { + unit + }, + tax_rate, + purchase_price, + sales_price, + action: action.to_string(), + error, + }); + } + Ok(rows) +} + +fn split_csv_line(line: &str, delimiter: &str) -> Vec { + line.split(delimiter) + .map(|value| value.trim().trim_matches('"').to_string()) + .collect() +} + +fn empty_string_to_none(value: String) -> Option { + if value.trim().is_empty() { + None + } else { + Some(value) + } +} + +async fn item_number_exists( + db: &PgPool, + schema_name: &str, + item_number: &str, +) -> Result { + let sql = format!( + "select exists(select 1 from {schema}.items where item_number=$1)", + schema = schema_name + ); + Ok(sqlx::query_scalar::<_, bool>(&sql) + .bind(item_number.trim()) + .fetch_one(db) + .await?) +} + +async fn upsert_imported_item( + db: &PgPool, + crypto: &DataCrypto, + context: &AuthContext, + import_id: Uuid, + row: &PriceListImportRow, +) -> Result<(), ApiError> { + let item_id = match find_item_id_by_number(db, &context.schema_name, &row.item_number).await? { + Some(item_id) => { + let name = crypto.encrypt(&row.name)?; + let sql = format!( + r#" + update {schema}.items + set name_ciphertext=$2, name_nonce=$3, name_key_id=$4, + unit=$5, tax_rate=$6::numeric, + default_purchase_price=$7::numeric, + default_sales_price=$8::numeric, + status='active', updated_at=now() + where id=$1 + "#, + schema = context.schema_name + ); + sqlx::query(&sql) + .bind(item_id) + .bind(name.ciphertext) + .bind(name.nonce) + .bind(name.key_id) + .bind(row.unit.trim()) + .bind(row.tax_rate.trim()) + .bind(row.purchase_price.as_deref()) + .bind(row.sales_price.as_deref()) + .execute(db) + .await?; + item_id + } + None => { + let item_id = Uuid::new_v4(); + let name = crypto.encrypt(&row.name)?; + let sql = format!( + r#" + insert into {schema}.items ( + id, item_number, name_ciphertext, name_nonce, name_key_id, + unit, tax_rate, default_purchase_price, default_sales_price, status + ) values ($1,$2,$3,$4,$5,$6,$7::numeric,$8::numeric,$9::numeric,'active') + "#, + schema = context.schema_name + ); + sqlx::query(&sql) + .bind(item_id) + .bind(row.item_number.trim()) + .bind(name.ciphertext) + .bind(name.nonce) + .bind(name.key_id) + .bind(row.unit.trim()) + .bind(row.tax_rate.trim()) + .bind(row.purchase_price.as_deref()) + .bind(row.sales_price.as_deref()) + .execute(db) + .await?; + item_id + } + }; + record_item_price_history_with_source( + db, + &context.schema_name, + item_id, + row.purchase_price.as_deref(), + row.sales_price.as_deref(), + &format!("import:{import_id}"), + context.user_id, + ) + .await +} + +async fn find_item_id_by_number( + db: &PgPool, + schema_name: &str, + item_number: &str, +) -> Result, ApiError> { + let sql = format!( + "select id from {schema}.items where item_number=$1", + schema = schema_name + ); + Ok(sqlx::query_scalar::<_, Uuid>(&sql) + .bind(item_number.trim()) + .fetch_optional(db) + .await?) +} + +fn validate_api_connector_request(payload: &ApiConnectorRequest) -> Result<(), ApiError> { + if payload.code.trim().is_empty() || payload.name.trim().len() < 2 { + return Err(ApiError::bad_request("Code und Name sind erforderlich")); + } + if payload.connector_type.trim().is_empty() { + return Err(ApiError::bad_request("Connector-Typ fehlt")); + } + if payload + .sync_interval_minutes + .is_some_and(|minutes| minutes <= 0) + { + return Err(ApiError::bad_request( + "Synchronisationsintervall ist ungültig", + )); + } + Ok(()) +} + +async fn write_api_connector( + db: &PgPool, + crypto: &DataCrypto, + schema_name: &str, + connector_id: Uuid, + payload: &ApiConnectorRequest, + insert: bool, +) -> Result<(), ApiError> { + ensure_safe_schema_name(schema_name)?; + let config = crypto.encrypt(&payload.config)?; + let sql = if insert { + format!( + r#" + insert into {schema}.api_connectors ( + id, code, name, connector_type, config_ciphertext, config_nonce, + config_key_id, is_active, sync_interval_minutes + ) values ($1,$2,$3,$4,$5,$6,$7,$8,$9) + "#, + schema = schema_name + ) + } else { + format!( + r#" + update {schema}.api_connectors + set code=$2, name=$3, connector_type=$4, config_ciphertext=$5, + config_nonce=$6, config_key_id=$7, is_active=$8, + sync_interval_minutes=$9, updated_at=now() + where id=$1 + "#, + schema = schema_name + ) + }; + let result = sqlx::query(&sql) + .bind(connector_id) + .bind(payload.code.trim()) + .bind(payload.name.trim()) + .bind(payload.connector_type.trim()) + .bind(config.ciphertext) + .bind(config.nonce) + .bind(config.key_id) + .bind(payload.is_active) + .bind(payload.sync_interval_minutes) + .execute(db) + .await?; + if !insert { + ensure_changed(result.rows_affected(), "API-Connector nicht gefunden")?; + } + Ok(()) +} + +fn api_connector_response( + id: Uuid, + payload: ApiConnectorRequest, + last_sync_at: Option>, +) -> ApiConnectorResponse { + ApiConnectorResponse { + id, + code: payload.code, + name: payload.name, + connector_type: payload.connector_type, + config: payload.config, + is_active: payload.is_active, + sync_interval_minutes: payload.sync_interval_minutes, + last_sync_at, + } +} + +fn api_connector_from_row( + crypto: &DataCrypto, + row: sqlx::postgres::PgRow, +) -> Result { + Ok(ApiConnectorResponse { + id: row.get("id"), + code: row.get("code"), + name: row.get("name"), + connector_type: row.get("connector_type"), + config: crypto.decrypt( + &row.get::, _>("config_ciphertext"), + &row.get::, _>("config_nonce"), + &row.get::("config_key_id"), + )?, + is_active: row.get("is_active"), + sync_interval_minutes: row.get("sync_interval_minutes"), + last_sync_at: row.get("last_sync_at"), + }) +} + +fn validate_price_rule_request(payload: &PriceRuleRequest) -> Result<(), ApiError> { + if payload.code.trim().is_empty() || payload.name.trim().len() < 2 { + return Err(ApiError::bad_request("Code und Name sind erforderlich")); + } + if !matches!(payload.source_type.trim(), "import" | "api" | "supplier") { + return Err(ApiError::bad_request("Quellentyp ist ungültig")); + } + if !matches!( + payload.rounding_mode.trim(), + "none" | "cent" | "five_cent" | "ten_cent" | "whole" + ) { + return Err(ApiError::bad_request("Rundungsmodus ist ungültig")); + } + validate_number(&payload.markup_percent, "Aufschlag")?; + let markup = payload + .markup_percent + .trim() + .parse::() + .map_err(|_| ApiError::bad_request("Aufschlag ist ungültig"))?; + if !(-100.0..=1000.0).contains(&markup) { + return Err(ApiError::bad_request( + "Aufschlag muss zwischen -100 und 1000 Prozent liegen", + )); + } + Ok(()) +} + +async fn write_price_rule( + db: &PgPool, + schema_name: &str, + rule_id: Uuid, + payload: &PriceRuleRequest, + insert: bool, +) -> Result<(), ApiError> { + ensure_safe_schema_name(schema_name)?; + let sql = if insert { + format!( + r#" + insert into {schema}.price_rules ( + id, code, name, source_type, source_id, markup_percent, rounding_mode, is_active + ) values ($1,$2,$3,$4,$5,$6::numeric,$7,$8) + "#, + schema = schema_name + ) + } else { + format!( + r#" + update {schema}.price_rules + set code=$2, name=$3, source_type=$4, source_id=$5, + markup_percent=$6::numeric, rounding_mode=$7, is_active=$8, + updated_at=now() + where id=$1 + "#, + schema = schema_name + ) + }; + let result = sqlx::query(&sql) + .bind(rule_id) + .bind(payload.code.trim()) + .bind(payload.name.trim()) + .bind(payload.source_type.trim()) + .bind(payload.source_id) + .bind(payload.markup_percent.trim()) + .bind(payload.rounding_mode.trim()) + .bind(payload.is_active) + .execute(db) + .await?; + if !insert { + ensure_changed(result.rows_affected(), "Preisregel nicht gefunden")?; + } + Ok(()) +} + +fn price_rule_response(id: Uuid, payload: PriceRuleRequest) -> PriceRuleResponse { + PriceRuleResponse { + id, + code: payload.code, + name: payload.name, + source_type: payload.source_type, + source_id: payload.source_id, + markup_percent: payload.markup_percent, + rounding_mode: payload.rounding_mode, + is_active: payload.is_active, + } +} + +fn price_rule_from_row(row: sqlx::postgres::PgRow) -> PriceRuleResponse { + PriceRuleResponse { + id: row.get("id"), + code: row.get("code"), + name: row.get("name"), + source_type: row.get("source_type"), + source_id: row.get("source_id"), + markup_percent: row.get("markup_percent"), + rounding_mode: row.get("rounding_mode"), + is_active: row.get("is_active"), + } +} + +fn validate_communication_request(payload: &CommunicationRequest) -> Result<(), ApiError> { + validate_status_choice( + &payload.communication_type, + &["email", "phone", "letter", "meeting", "internal_note"], + "Kommunikationstyp ist ungültig", + )?; + validate_status_choice( + &payload.direction, + &["inbound", "outbound", "internal"], + "Richtung ist ungültig", + )?; + validate_status_choice( + &payload.status, + &["open", "done", "archived"], + "Kommunikationsstatus ist ungültig", + )?; + if payload.subject.trim().len() < 2 { + return Err(ApiError::bad_request("Betreff ist erforderlich")); + } + validate_entity_links(&payload.links, &communication_link_entity_types()) +} + +fn validate_document_upload_request(payload: &DocumentUploadRequest) -> Result<(), ApiError> { + if payload.title.trim().len() < 2 { + return Err(ApiError::bad_request("Dokumenttitel ist erforderlich")); + } + if payload.file_name.trim().len() < 2 { + return Err(ApiError::bad_request("Dateiname ist erforderlich")); + } + if payload.content_type.trim().is_empty() { + return Err(ApiError::bad_request("Content-Type ist erforderlich")); + } + validate_entity_links(&payload.links, &document_link_entity_types()) +} + +fn communication_link_entity_types() -> [&'static str; 8] { + [ + "customer", + "supplier", + "activity", + "quote", + "outgoing_invoice", + "incoming_invoice", + "item", + "document", + ] +} + +fn document_link_entity_types() -> [&'static str; 8] { + [ + "customer", + "supplier", + "activity", + "communication", + "quote", + "outgoing_invoice", + "incoming_invoice", + "item", + ] +} + +fn validate_entity_links(links: &[EntityLinkRequest], allowed: &[&str]) -> Result<(), ApiError> { + for link in links { + if !allowed.contains(&link.entity_type.as_str()) { + return Err(ApiError::bad_request("Bezugstyp ist ungültig")); + } + } + Ok(()) +} + +fn encrypted_optional_string( + crypto: &DataCrypto, + value: &str, +) -> Result, ApiError> { + if value.trim().is_empty() { + Ok(None) + } else { + Ok(Some(crypto.encrypt(&value.trim().to_string())?)) + } +} + +async fn write_communication( + db: &PgPool, + crypto: &DataCrypto, + context: &AuthContext, + communication_id: Uuid, + payload: &CommunicationRequest, + insert: bool, +) -> Result<(), ApiError> { + ensure_safe_schema_name(&context.schema_name)?; + let subject = crypto.encrypt(&payload.subject.trim().to_string())?; + let body = encrypted_optional_string(crypto, &payload.body)?; + let sql = if insert { + format!( + r#" + insert into {schema}.communications ( + id, communication_type, direction, subject_ciphertext, subject_nonce, + subject_key_id, body_ciphertext, body_nonce, body_key_id, status, + occurred_at, created_by_user_id + ) values ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11::timestamptz,$12) + "#, + schema = context.schema_name + ) + } else { + format!( + r#" + update {schema}.communications + set communication_type=$2, direction=$3, subject_ciphertext=$4, + subject_nonce=$5, subject_key_id=$6, body_ciphertext=$7, + body_nonce=$8, body_key_id=$9, status=$10, + occurred_at=$11::timestamptz, updated_at=now() + where id=$1 + "#, + schema = context.schema_name + ) + }; + let result = sqlx::query(&sql) + .bind(communication_id) + .bind(payload.communication_type.trim()) + .bind(payload.direction.trim()) + .bind(subject.ciphertext) + .bind(subject.nonce) + .bind(subject.key_id) + .bind(body.as_ref().map(|value| value.ciphertext.clone())) + .bind(body.as_ref().map(|value| value.nonce.clone())) + .bind(body.as_ref().map(|value| value.key_id.clone())) + .bind(payload.status.trim()) + .bind(payload.occurred_at.as_deref()) + .bind(context.user_id) + .execute(db) + .await?; + if !insert { + ensure_changed(result.rows_affected(), "Kommunikation nicht gefunden")?; + } + write_communication_links(db, &context.schema_name, communication_id, &payload.links).await +} + +async fn write_communication_links( + db: &PgPool, + schema_name: &str, + communication_id: Uuid, + links: &[EntityLinkRequest], +) -> Result<(), ApiError> { + ensure_safe_schema_name(schema_name)?; + let delete_sql = format!( + "delete from {schema}.communication_links where communication_id=$1", + schema = schema_name + ); + sqlx::query(&delete_sql) + .bind(communication_id) + .execute(db) + .await?; + let insert_sql = format!( + "insert into {schema}.communication_links (communication_id, entity_type, entity_id) values ($1,$2,$3) on conflict do nothing", + schema = schema_name + ); + for link in links { + sqlx::query(&insert_sql) + .bind(communication_id) + .bind(link.entity_type.trim()) + .bind(link.entity_id) + .execute(db) + .await?; + } + Ok(()) +} + +async fn write_document_links( + db: &PgPool, + schema_name: &str, + document_id: Uuid, + links: &[EntityLinkRequest], +) -> Result<(), ApiError> { + ensure_safe_schema_name(schema_name)?; + let delete_sql = format!( + "delete from {schema}.document_links where document_id=$1", + schema = schema_name + ); + sqlx::query(&delete_sql) + .bind(document_id) + .execute(db) + .await?; + let insert_sql = format!( + "insert into {schema}.document_links (document_id, entity_type, entity_id) values ($1,$2,$3) on conflict do nothing", + schema = schema_name + ); + for link in links { + sqlx::query(&insert_sql) + .bind(document_id) + .bind(link.entity_type.trim()) + .bind(link.entity_id) + .execute(db) + .await?; + } + Ok(()) +} + +async fn get_communication_by_id( + db: &PgPool, + crypto: &DataCrypto, + schema_name: &str, + communication_id: Uuid, +) -> Result, ApiError> { + let sql = format!( + r#" + select id, communication_type, direction, subject_ciphertext, subject_nonce, + subject_key_id, body_ciphertext, body_nonce, body_key_id, status, occurred_at + from {schema}.communications + where id=$1 + "#, + schema = schema_name + ); + let row = sqlx::query(&sql) + .bind(communication_id) + .fetch_optional(db) + .await? + .ok_or_else(|| ApiError::not_found("Kommunikation nicht gefunden"))?; + Ok(Json( + communication_from_row(db, crypto, schema_name, row).await?, + )) +} + +async fn communication_from_row( + db: &PgPool, + crypto: &DataCrypto, + schema_name: &str, + row: sqlx::postgres::PgRow, +) -> Result { + let id: Uuid = row.get("id"); + Ok(CommunicationResponse { + id, + communication_type: row.get("communication_type"), + direction: row.get("direction"), + subject: crypto.decrypt( + &row.get::, _>("subject_ciphertext"), + &row.get::, _>("subject_nonce"), + &row.get::("subject_key_id"), + )?, + body: decrypt_optional_string(crypto, &row, "body")?.unwrap_or_default(), + status: row.get("status"), + occurred_at: row.get("occurred_at"), + links: load_links( + db, + schema_name, + "communication_links", + "communication_id", + id, + ) + .await?, + }) +} + +fn decrypt_optional_string( + crypto: &DataCrypto, + row: &sqlx::postgres::PgRow, + prefix: &str, +) -> Result, ApiError> { + let ciphertext_column = format!("{prefix}_ciphertext"); + let nonce_column = format!("{prefix}_nonce"); + let key_column = format!("{prefix}_key_id"); + let ciphertext = row.get::>, _>(ciphertext_column.as_str()); + let nonce = row.get::>, _>(nonce_column.as_str()); + let key_id = row.get::, _>(key_column.as_str()); + match (ciphertext, nonce, key_id) { + (Some(ciphertext), Some(nonce), Some(key_id)) => { + Ok(Some(crypto.decrypt(&ciphertext, &nonce, &key_id)?)) + } + _ => Ok(None), + } +} + +async fn load_links( + db: &PgPool, + schema_name: &str, + table: &str, + id_column: &str, + id: Uuid, +) -> Result, ApiError> { + ensure_safe_schema_name(schema_name)?; + let sql = format!( + "select entity_type, entity_id from {schema}.{table} where {id_column}=$1 order by entity_type", + schema = schema_name + ); + let rows = sqlx::query(&sql).bind(id).fetch_all(db).await?; + Ok(rows + .into_iter() + .map(|row| EntityLinkRequest { + entity_type: row.get("entity_type"), + entity_id: row.get("entity_id"), + }) + .collect()) +} + +async fn get_document_by_id( + db: &PgPool, + crypto: &DataCrypto, + schema_name: &str, + document_id: Uuid, +) -> Result, ApiError> { + let sql = format!( + r#" + select id, title_ciphertext, title_nonce, title_key_id, + description_ciphertext, description_nonce, description_key_id, status + from {schema}.documents + where id=$1 + "#, + schema = schema_name + ); + let row = sqlx::query(&sql) + .bind(document_id) + .fetch_optional(db) + .await? + .ok_or_else(|| ApiError::not_found("Dokument nicht gefunden"))?; + Ok(Json(document_from_row(db, crypto, schema_name, row).await?)) +} + +async fn document_from_row( + db: &PgPool, + crypto: &DataCrypto, + schema_name: &str, + row: sqlx::postgres::PgRow, +) -> Result { + let id: Uuid = row.get("id"); + Ok(DocumentResponse { + id, + title: crypto.decrypt( + &row.get::, _>("title_ciphertext"), + &row.get::, _>("title_nonce"), + &row.get::("title_key_id"), + )?, + description: decrypt_optional_string(crypto, &row, "description")?.unwrap_or_default(), + status: row.get("status"), + latest_version: latest_document_version(db, crypto, schema_name, id).await?, + links: load_links(db, schema_name, "document_links", "document_id", id).await?, + }) +} + +async fn latest_document_version( + db: &PgPool, + crypto: &DataCrypto, + schema_name: &str, + document_id: Uuid, +) -> Result, ApiError> { + let sql = format!( + r#" + select id, version_no, file_name_ciphertext, file_name_nonce, file_name_key_id, + content_type_ciphertext, content_type_nonce, content_type_key_id, + file_size, checksum_sha256, created_at + from {schema}.document_versions + where document_id=$1 + order by version_no desc + limit 1 + "#, + schema = schema_name + ); + let Some(row) = sqlx::query(&sql) + .bind(document_id) + .fetch_optional(db) + .await? + else { + return Ok(None); + }; + Ok(Some(DocumentVersionResponse { + id: row.get("id"), + version_no: row.get("version_no"), + file_name: crypto.decrypt( + &row.get::, _>("file_name_ciphertext"), + &row.get::, _>("file_name_nonce"), + &row.get::("file_name_key_id"), + )?, + content_type: crypto.decrypt( + &row.get::, _>("content_type_ciphertext"), + &row.get::, _>("content_type_nonce"), + &row.get::("content_type_key_id"), + )?, + file_size: row.get("file_size"), + checksum_sha256: row.get("checksum_sha256"), + created_at: row.get("created_at"), + })) +} + +fn document_storage_path( + schema_name: &str, + document_id: Uuid, + version_id: Uuid, +) -> Result { + ensure_safe_schema_name(schema_name)?; + let base = env::var("COMPANYTOOL_DOCUMENT_STORAGE_DIR") + .unwrap_or_else(|_| "storage/documents".to_string()); + Ok(PathBuf::from(base) + .join(schema_name) + .join(document_id.to_string()) + .join(format!("{version_id}.json"))) +} + +async fn insert_document_audit( + db: &PgPool, + schema_name: &str, + document_id: Uuid, + version_id: Option, + action: &str, + user_id: Uuid, +) -> Result<(), ApiError> { + ensure_safe_schema_name(schema_name)?; + let sql = format!( + "insert into {schema}.document_audit_log (id, document_id, version_id, action, user_id) values ($1,$2,$3,$4,$5)", + schema = schema_name + ); + sqlx::query(&sql) + .bind(Uuid::new_v4()) + .bind(document_id) + .bind(version_id) + .bind(action) + .bind(user_id) + .execute(db) + .await?; + Ok(()) +} + +fn validate_item_request(payload: &ItemRequest) -> Result<(), ApiError> { + if payload.name.trim().len() < 2 { + return Err(ApiError::bad_request("Artikelname ist erforderlich")); + } + validate_status(&payload.status)?; + validate_number(&payload.tax_rate, "Steuersatz")?; + if let Some(price) = &payload.default_purchase_price { + validate_number(price, "Einkaufspreis")?; + } + if let Some(price) = &payload.default_sales_price { + validate_number(price, "Verkaufspreis")?; + } + Ok(()) +} + +async fn write_item( + db: &PgPool, + crypto: &DataCrypto, + schema_name: &str, + item_id: Uuid, + payload: &ItemRequest, + insert: bool, +) -> Result<(), ApiError> { + let name = crypto.encrypt(&payload.name.trim().to_string())?; + let sql = if insert { + format!( + r#"insert into {schema}.items (id,item_number,name_ciphertext,name_nonce,name_key_id,unit,tax_rate,default_purchase_price,default_sales_price,status) + values ($1,$2,$3,$4,$5,$6,$7::numeric,$8::numeric,$9::numeric,$10)"#, + schema = schema_name + ) + } else { + format!( + r#"update {schema}.items set item_number=item_number,name_ciphertext=$3,name_nonce=$4,name_key_id=$5,unit=$6,tax_rate=$7::numeric, + default_purchase_price=$8::numeric,default_sales_price=$9::numeric,status=$10,updated_at=now() where id=$1"#, + schema = schema_name + ) + }; + let result = sqlx::query(&sql) + .bind(item_id) + .bind(payload.item_number.trim()) + .bind(name.ciphertext) + .bind(name.nonce) + .bind(name.key_id) + .bind(payload.unit.trim()) + .bind(payload.tax_rate.trim()) + .bind(payload.default_purchase_price.as_deref()) + .bind(payload.default_sales_price.as_deref()) + .bind(&payload.status) + .execute(db) + .await?; + if !insert { + ensure_changed(result.rows_affected(), "Artikel nicht gefunden")?; + } + Ok(()) +} + +fn item_response(id: Uuid, payload: ItemRequest) -> ItemResponse { + ItemResponse { + id, + item_number: payload.item_number, + name: payload.name, + unit: payload.unit, + tax_rate: payload.tax_rate, + default_purchase_price: payload.default_purchase_price, + default_sales_price: payload.default_sales_price, + status: payload.status, + } +} + +fn item_from_row( + crypto: &DataCrypto, + row: sqlx::postgres::PgRow, +) -> Result { + Ok(ItemResponse { + id: row.get("id"), + item_number: row.get("item_number"), + name: crypto.decrypt( + &row.get::, _>("name_ciphertext"), + &row.get::, _>("name_nonce"), + &row.get::("name_key_id"), + )?, + unit: row.get("unit"), + tax_rate: row.get("tax_rate"), + default_purchase_price: row.get("default_purchase_price"), + default_sales_price: row.get("default_sales_price"), + status: row.get("status"), + }) +} + +async fn record_item_price_history( + db: &PgPool, + schema_name: &str, + item_id: Uuid, + payload: &ItemRequest, + user_id: Uuid, +) -> Result<(), ApiError> { + record_item_price_history_with_source( + db, + schema_name, + item_id, + payload.default_purchase_price.as_deref(), + payload.default_sales_price.as_deref(), + "manual", + user_id, + ) + .await +} + +async fn record_item_price_history_with_source( + db: &PgPool, + schema_name: &str, + item_id: Uuid, + purchase_price: Option<&str>, + sales_price: Option<&str>, + source: &str, + user_id: Uuid, +) -> Result<(), ApiError> { + ensure_safe_schema_name(schema_name)?; + let sql = format!( + r#" + insert into {schema}.item_price_history ( + id, item_id, purchase_price, sales_price, source, created_by_user_id + ) values ($1, $2, $3::numeric, $4::numeric, $5, $6) + "#, + schema = schema_name + ); + sqlx::query(&sql) + .bind(Uuid::new_v4()) + .bind(item_id) + .bind(purchase_price) + .bind(sales_price) + .bind(source) + .bind(user_id) + .execute(db) + .await?; + Ok(()) +} + +fn item_price_history_from_row(row: sqlx::postgres::PgRow) -> ItemPriceHistoryResponse { + ItemPriceHistoryResponse { + id: row.get("id"), + item_id: row.get("item_id"), + purchase_price: row.get("purchase_price"), + sales_price: row.get("sales_price"), + source: row.get("source"), + valid_from: row.get("valid_from"), + created_by_user_id: row.get("created_by_user_id"), + created_at: row.get("created_at"), + } +} + +fn validate_activity_request(payload: &ActivityRequest) -> Result<(), ApiError> { + if payload.title.trim().len() < 2 { + return Err(ApiError::bad_request("Titel der Aktivität ist zu kurz")); + } + if ![ + "email_note", + "phone_note", + "internal_note", + "task", + "follow_up", + "calendar_event", + "system_event", + "work_step", + ] + .contains(&payload.activity_type.as_str()) + { + return Err(ApiError::bad_request("Ungültiger Aktivitätstyp")); + } + if !["open", "in_progress", "done", "cancelled"].contains(&payload.status.as_str()) { + return Err(ApiError::bad_request("Ungültiger Aktivitätsstatus")); + } + if !["low", "normal", "high", "critical"].contains(&payload.priority.as_str()) { + return Err(ApiError::bad_request("Ungültige Priorität")); + } + Ok(()) +} + +async fn write_activity( + db: &PgPool, + crypto: &DataCrypto, + context: &AuthContext, + activity_id: Uuid, + payload: &ActivityRequest, + insert: bool, +) -> Result<(), ApiError> { + let title = crypto.encrypt(&payload.title.trim().to_string())?; + let body = if payload.body.trim().is_empty() { + None + } else { + Some(crypto.encrypt(&payload.body)?) + }; + let sql = if insert { + format!( + r#"insert into {schema}.activities (id,activity_number,activity_type,title_ciphertext,title_nonce,title_key_id,body_ciphertext,body_nonce,body_key_id,status,priority,due_at,created_by_user_id) + values ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13)"#, + schema = context.schema_name + ) + } else { + format!( + r#"update {schema}.activities set activity_number=activity_number,activity_type=$3,title_ciphertext=$4,title_nonce=$5,title_key_id=$6,body_ciphertext=$7,body_nonce=$8,body_key_id=$9,status=$10,priority=$11,due_at=$12,created_by_user_id=coalesce(created_by_user_id,$13),updated_at=now() where id=$1"#, + schema = context.schema_name + ) + }; + let result = sqlx::query(&sql) + .bind(activity_id) + .bind( + payload + .activity_number + .as_deref() + .map(str::trim) + .filter(|value| !value.is_empty()), + ) + .bind(&payload.activity_type) + .bind(title.ciphertext) + .bind(title.nonce) + .bind(title.key_id) + .bind(body.as_ref().map(|field| field.ciphertext.clone())) + .bind(body.as_ref().map(|field| field.nonce.clone())) + .bind(body.as_ref().map(|field| field.key_id.clone())) + .bind(&payload.status) + .bind(&payload.priority) + .bind(payload.due_at) + .bind(context.user_id) + .execute(db) + .await?; + if !insert { + ensure_changed(result.rows_affected(), "Aktivität nicht gefunden")?; + } + Ok(()) +} + +fn activity_response(id: Uuid, payload: ActivityRequest) -> ActivityResponse { + ActivityResponse { + id, + activity_number: payload.activity_number, + activity_type: payload.activity_type, + title: payload.title, + body: payload.body, + status: payload.status, + priority: payload.priority, + due_at: payload.due_at, + } +} + +fn activity_from_row( + crypto: &DataCrypto, + row: sqlx::postgres::PgRow, +) -> Result { + let body = match row.get::>, _>("body_ciphertext") { + Some(ciphertext) => crypto.decrypt::( + &ciphertext, + &row.get::, _>("body_nonce"), + &row.get::("body_key_id"), + )?, + None => String::new(), + }; + Ok(ActivityResponse { + id: row.get("id"), + activity_number: row.get("activity_number"), + activity_type: row.get("activity_type"), + title: crypto.decrypt( + &row.get::, _>("title_ciphertext"), + &row.get::, _>("title_nonce"), + &row.get::("title_key_id"), + )?, + body, + status: row.get("status"), + priority: row.get("priority"), + due_at: row.get("due_at"), + }) +} + +async fn set_record_inactive( + db: &PgPool, + schema_name: &str, + table: &str, + id: Uuid, +) -> Result<(), ApiError> { + let sql = + format!("update {schema_name}.{table} set status='inactive', updated_at=now() where id=$1"); + let result = sqlx::query(&sql).bind(id).execute(db).await?; + ensure_changed(result.rows_affected(), "Datensatz nicht gefunden") +} + +fn ensure_changed(rows_affected: u64, message: &str) -> Result<(), ApiError> { + if rows_affected == 0 { + Err(ApiError::not_found(message)) + } else { + Ok(()) + } +} + +fn validate_status(status: &str) -> Result<(), ApiError> { + if ["active", "inactive", "blocked"].contains(&status) { + Ok(()) + } else { + Err(ApiError::bad_request("Ungültiger Status")) + } +} + +fn validate_status_choice(value: &str, allowed: &[&str], message: &str) -> Result<(), ApiError> { + if allowed.contains(&value) { + Ok(()) + } else { + Err(ApiError::bad_request(message)) + } +} + +fn validate_number(value: &str, field: &str) -> Result<(), ApiError> { + let parsed = value + .parse::() + .map_err(|_| ApiError::bad_request(&format!("Ungültiger Wert: {field}")))?; + if parsed < 0.0 { + Err(ApiError::bad_request(&format!( + "{field} darf nicht negativ sein" + ))) + } else { + Ok(()) + } +} + +fn validate_percent(value: &str, field: &str) -> Result<(), ApiError> { + let parsed = value + .parse::() + .map_err(|_| ApiError::bad_request(&format!("Ungültiger Wert: {field}")))?; + if (0.0..=100.0).contains(&parsed) { + Ok(()) + } else { + Err(ApiError::bad_request(&format!( + "{field} muss zwischen 0 und 100 liegen" + ))) + } +} + +fn validate_number_range(payload: &NumberRangeRequest) -> Result<(), ApiError> { + if !payload.pattern.contains("{counter}") { + return Err(ApiError::bad_request( + "Muster muss den Platzhalter {counter} enthalten", + )); + } + if payload.counter_value < 0 { + return Err(ApiError::bad_request("Zähler darf nicht negativ sein")); + } + if !(1..=18).contains(&payload.counter_padding) { + return Err(ApiError::bad_request( + "Zählerlänge muss zwischen 1 und 18 liegen", + )); + } + Ok(()) +} + +fn number_range_from_row(row: sqlx::postgres::PgRow) -> NumberRangeResponse { + NumberRangeResponse { + id: row.get("id"), + code: row.get("code"), + pattern: row.get("pattern"), + counter_value: row.get("counter_value"), + counter_padding: row.get("counter_padding"), + reset_rule: row.get("reset_rule"), + is_active: row.get("is_active"), + } +} + +async fn next_number_if_blank( + db: &PgPool, + schema_name: &str, + code: &str, + current_value: &str, +) -> Result { + if current_value.trim().is_empty() { + next_number(db, schema_name, code).await + } else { + Ok(current_value.trim().to_string()) + } +} + +fn ensure_known_number_range_code(code: &str) -> Result<(), ApiError> { + if [ + "customers", + "suppliers", + "items", + "activities", + "quotes", + "outgoing_invoices", + "incoming_invoices", + "documents", + "price_lists", + "communications", + ] + .contains(&code) + { + Ok(()) + } else { + Err(ApiError::bad_request("Unbekannter Nummernkreis")) + } +} + +fn number_range_write_permission(code: &str) -> &'static str { + match code { + "customers" => "customers.write", + "suppliers" => "suppliers.write", + "items" => "items.write", + "activities" => "activities.write", + "quotes" => "quotes.write", + "outgoing_invoices" => "outgoing_invoices.write", + "incoming_invoices" => "incoming_invoices.write", + "documents" => "documents.write", + "price_lists" => "price_lists.write", + "communications" => "communications.write", + _ => "number_ranges.write", + } +} + +async fn next_number(db: &PgPool, schema_name: &str, code: &str) -> Result { + ensure_safe_schema_name(schema_name)?; + let sql = format!( + r#" + update {schema}.number_ranges + set counter_value = counter_value + 1, + updated_at = now() + where code = $1 and is_active = true + returning pattern, counter_value, counter_padding + "#, + schema = schema_name + ); + let row = sqlx::query(&sql) + .bind(code) + .fetch_optional(db) + .await? + .ok_or_else(|| ApiError::bad_request("Nummernkreis fehlt oder ist inaktiv"))?; + Ok(format_number( + row.get("pattern"), + row.get("counter_value"), + row.get("counter_padding"), + )) +} + +fn format_number(pattern: String, counter_value: i64, counter_padding: i32) -> String { + let padded = format!( + "{:0width$}", + counter_value, + width = counter_padding.max(1) as usize + ); + let grouped = padded + .as_bytes() + .rchunks(3) + .rev() + .map(|chunk| std::str::from_utf8(chunk).unwrap_or_default()) + .collect::>() + .join("."); + pattern.replace("{counter}", &grouped) +} + +async fn load_registration_detail( + state: &AppState, + id: Uuid, +) -> Result { + let db = state.db()?; + let row = sqlx::query( + r#" + select r.id, r.organization_name_ciphertext, r.organization_name_nonce, + r.organization_name_key_id, r.email, r.status, r.organization_id, + r.requested_at, r.decided_by_user_id, r.decided_at, r.decision_note, + o.schema_name + from organization_registration_requests r + left join organizations o on o.id = r.organization_id + where r.id = $1 + "#, + ) + .bind(id) + .fetch_optional(db) + .await? + .ok_or_else(|| ApiError::not_found("Registrierung nicht gefunden"))?; + + Ok(OrganizationRegistrationDetail { + id: row.get("id"), + organization_name: decrypt_string( + &state.crypto, + row.get("organization_name_ciphertext"), + row.get("organization_name_nonce"), + row.get("organization_name_key_id"), + )?, + email: row.get("email"), + status: row.get("status"), + organization_id: row.get("organization_id"), + schema_name: row.get("schema_name"), + requested_at: row.get("requested_at"), + decided_at: row.get("decided_at"), + decided_by_user_id: row.get("decided_by_user_id"), + decision_note: row.get("decision_note"), + provisioning_error: None, + }) +} + +async fn load_registration_row(db: &PgPool, id: Uuid) -> Result { + sqlx::query("select * from organization_registration_requests where id = $1") + .bind(id) + .fetch_optional(db) + .await? + .ok_or_else(|| ApiError::not_found("Registrierung nicht gefunden")) +} + +async fn ensure_user(db: &PgPool, email: &str) -> Result { + if let Some(id) = sqlx::query_scalar::<_, Uuid>("select id from users where email = $1") + .bind(email) + .fetch_optional(db) + .await? + { + return Ok(id); + } + + let id = Uuid::new_v4(); + sqlx::query("insert into users (id, email) values ($1, $2)") + .bind(id) + .bind(email) + .execute(db) + .await?; + Ok(id) +} + +#[derive(Debug, Clone)] +struct AuthContext { + user_id: Uuid, + organization_id: Uuid, + schema_name: String, +} + +async fn create_session_token( + db: &PgPool, + user_id: Uuid, + organization_id: Option, +) -> Result { + let token = generate_token(); + let token_hash = hash_token(&token); + sqlx::query( + r#" + insert into refresh_tokens (id, user_id, organization_id, token_hash, expires_at) + values ($1, $2, $3, $4, now() + interval '30 days') + "#, + ) + .bind(Uuid::new_v4()) + .bind(user_id) + .bind(organization_id) + .bind(token_hash) + .execute(db) + .await?; + Ok(token) +} + +async fn require_auth(db: &PgPool, headers: &HeaderMap) -> Result { + let token_hash = bearer_token(headers) + .map(hash_token) + .ok_or_else(|| ApiError::unauthorized("Anmeldung erforderlich"))?; + let row = sqlx::query( + r#" + select rt.user_id, rt.organization_id, o.schema_name + from refresh_tokens rt + join organizations o on o.id = rt.organization_id + join user_organizations uo on uo.organization_id = o.id and uo.user_id = rt.user_id + where rt.token_hash = $1 + and rt.revoked_at is null + and rt.expires_at > now() + and o.status = 'active' + and uo.status = 'active' + limit 1 + "#, + ) + .bind(token_hash) + .fetch_optional(db) + .await? + .ok_or_else(|| ApiError::unauthorized("Session ist ungültig oder abgelaufen"))?; + + let user_id: Uuid = row.get("user_id"); + let organization_id = row + .get::, _>("organization_id") + .ok_or_else(|| ApiError::bad_request("Keine Firma ausgewählt"))?; + let schema_name = row + .get::, _>("schema_name") + .unwrap_or_else(|| company_schema_name(organization_id)); + + Ok(AuthContext { + user_id, + organization_id, + schema_name, + }) +} + +async fn require_permission( + db: &PgPool, + headers: &HeaderMap, + permission_code: &str, +) -> Result { + let context = require_auth(db, headers).await?; + if user_has_permission(db, &context.schema_name, context.user_id, permission_code).await? { + Ok(context) + } else { + Err(ApiError::forbidden("Berechtigung fehlt")) + } +} + +async fn load_context_for_user_and_organization( + db: &PgPool, + user_id: Uuid, + organization_id: Uuid, +) -> Result { + let row = sqlx::query( + r#" + select o.id organization_id, o.schema_name + from organizations o + join user_organizations uo on uo.organization_id = o.id + where o.status = 'active' + and uo.status = 'active' + and uo.user_id = $1 + and o.id = $2 + limit 1 + "#, + ) + .bind(user_id) + .bind(organization_id) + .fetch_optional(db) + .await? + .ok_or_else(|| ApiError::forbidden("Kein Zugriff auf diese Firma"))?; + + Ok(AuthContext { + user_id, + organization_id: row.get("organization_id"), + schema_name: row + .get::, _>("schema_name") + .unwrap_or_else(|| company_schema_name(organization_id)), + }) +} + +async fn update_session_organization( + db: &PgPool, + headers: &HeaderMap, + organization_id: Uuid, +) -> Result<(), ApiError> { + let token_hash = bearer_token(headers) + .map(hash_token) + .ok_or_else(|| ApiError::unauthorized("Anmeldung erforderlich"))?; + sqlx::query("update refresh_tokens set organization_id = $2 where token_hash = $1") + .bind(token_hash) + .bind(organization_id) + .execute(db) + .await?; + Ok(()) +} + +fn bearer_token(headers: &HeaderMap) -> Option<&str> { + headers + .get("authorization") + .and_then(|value| value.to_str().ok()) + .and_then(|value| value.strip_prefix("Bearer ")) + .filter(|value| !value.trim().is_empty()) +} + +fn emit_change(state: &AppState, title: &str) { + let _ = state.events.send(ServerMessage::RecordChanged { + record: RecordSummary { + id: Uuid::new_v4(), + title: title.to_string(), + updated_at: Utc::now(), + }, + }); +} + +async fn enqueue_initial_password_email( + crypto: &DataCrypto, + db: &PgPool, + email: &str, + password: &str, +) -> Result<(), ApiError> { + enqueue_email( + crypto, + db, + email, + "initial_password", + "Company Tool Initialpasswort", + json!({ + "email": email, + "initial_password": password + }), + ) + .await +} + +async fn enqueue_password_reset_email( + crypto: &DataCrypto, + db: &PgPool, + email: &str, + token: &str, +) -> Result<(), ApiError> { + enqueue_email( + crypto, + db, + email, + "password_reset", + "Company Tool Passwort zurücksetzen", + json!({ + "email": email, + "reset_token": token + }), + ) + .await +} + +async fn enqueue_invitation_email( + crypto: &DataCrypto, + db: &PgPool, + email: &str, + token: &str, + organization_id: Uuid, +) -> Result<(), ApiError> { + enqueue_email( + crypto, + db, + email, + "invitation", + "Company Tool Einladung", + json!({ + "email": email, + "invitation_token": token, + "organization_id": organization_id + }), + ) + .await +} + +async fn enqueue_email( + crypto: &DataCrypto, + db: &PgPool, + email: &str, + template: &str, + subject: &str, + payload_value: serde_json::Value, +) -> Result<(), ApiError> { + let payload = crypto.encrypt(&payload_value)?; + let email_id = Uuid::new_v4(); + sqlx::query( + r#" + insert into email_outbox ( + id, recipient_email, template, subject, payload_ciphertext, payload_nonce, payload_key_id + ) values ($1, $2, $3, $4, $5, $6, $7) + "#, + ) + .bind(email_id) + .bind(email) + .bind(template) + .bind(subject) + .bind(&payload.ciphertext) + .bind(&payload.nonce) + .bind(&payload.key_id) + .execute(db) + .await?; + deliver_email_if_configured(db, email_id, email, template, subject, &payload_value).await?; + Ok(()) +} + +async fn deliver_email_if_configured( + db: &PgPool, + email_id: Uuid, + email: &str, + template: &str, + subject: &str, + payload: &serde_json::Value, +) -> Result<(), ApiError> { + let transport = env::var("COMPANYTOOL_EMAIL_TRANSPORT").unwrap_or_else(|_| { + if dev_mode_enabled() { + "dev_outbox".to_string() + } else { + "outbox".to_string() + } + }); + match transport.as_str() { + "file" | "dev_file" => { + let dir = env::var("COMPANYTOOL_EMAIL_FILE_DIR") + .unwrap_or_else(|_| "storage/email-outbox".to_string()); + tokio::fs::create_dir_all(&dir).await?; + let path = PathBuf::from(dir).join(format!("{email_id}.json")); + tokio::fs::write( + path, + serde_json::to_vec_pretty(&json!({ + "id": email_id, + "recipient_email": email, + "template": template, + "subject": subject, + "payload": payload, + "created_at": Utc::now() + }))?, + ) + .await?; + sqlx::query( + "update email_outbox set status='sent', delivered_via=$2, sent_at=now() where id=$1", + ) + .bind(email_id) + .bind(transport) + .execute(db) + .await?; + } + "outbox" | "dev_outbox" => {} + other => { + sqlx::query( + "update email_outbox set status='failed', last_error=$2, attempt_count=attempt_count+1 where id=$1", + ) + .bind(email_id) + .bind(format!("Unbekannter E-Mail-Transport: {other}")) + .execute(db) + .await?; + } + } + Ok(()) +} + +async fn provision_company_schema(db: &PgPool, schema_name: &str) -> Result<(), ApiError> { + let mut tx = db.begin().await?; + provision_company_schema_tx(&mut tx, schema_name).await?; + tx.commit().await?; + Ok(()) +} + +async fn provision_company_schema_tx( + tx: &mut Transaction<'_, Postgres>, + schema_name: &str, +) -> Result<(), ApiError> { + ensure_safe_schema_name(schema_name)?; + sqlx::query(&format!("create schema if not exists {schema_name}")) + .execute(&mut **tx) + .await?; + + for template in [ + include_str!("../company-migrations/0001_company_base.sql"), + include_str!("../company-migrations/0002_activity_price_invoice_rules.sql"), + include_str!("../company-migrations/0003_customer_details.sql"), + include_str!("../company-migrations/0004_item_price_history.sql"), + include_str!("../company-migrations/0005_numbered_activities.sql"), + include_str!("../company-migrations/0006_update_number_range_prefixes.sql"), + include_str!("../company-migrations/0007_quotes.sql"), + include_str!("../company-migrations/0008_invoice_links.sql"), + include_str!("../company-migrations/0009_price_imports.sql"), + include_str!("../company-migrations/0010_communications_documents.sql"), + include_str!("../company-migrations/0011_user_settings.sql"), + include_str!("../company-migrations/0012_item_supplier_prices.sql"), + ] { + let sql = template + .lines() + .filter(|line| !line.trim_start().starts_with("--")) + .collect::>() + .join("\n") + .replace("{schema}", schema_name); + for statement in split_sql_statements(&sql) { + let statement = statement.trim(); + if !statement.is_empty() && !statement.starts_with("--") { + sqlx::query(statement).execute(&mut **tx).await?; + } + } + } + + seed_roles_and_permissions_tx(tx, schema_name).await?; + seed_number_ranges_tx(tx, schema_name).await?; + seed_import_mappings_tx(tx, schema_name).await?; + Ok(()) +} + +fn default_user_navigation_settings() -> UserNavigationSettings { + UserNavigationSettings { + mode: "scroll".to_string(), + } +} + +fn normalize_user_navigation_settings( + settings: UserNavigationSettings, +) -> Result { + let mode = match settings.mode.trim().to_lowercase().as_str() { + "scroll" | "compact" => "scroll".to_string(), + "groups" => "groups".to_string(), + _ => { + return Err(ApiError::bad_request("Ungültige Navigationseinstellung")); + } + }; + Ok(UserNavigationSettings { mode }) +} + +fn split_sql_statements(sql: &str) -> Vec { + let mut statements = Vec::new(); + let mut current = String::new(); + let mut in_single_quote = false; + let mut chars = sql.chars().peekable(); + + while let Some(ch) = chars.next() { + if ch == '\'' { + current.push(ch); + if in_single_quote && chars.peek() == Some(&'\'') { + current.push(chars.next().unwrap_or('\'')); + } else { + in_single_quote = !in_single_quote; + } + } else if ch == ';' && !in_single_quote { + statements.push(current.trim().to_string()); + current.clear(); + } else { + current.push(ch); + } + } + + if !current.trim().is_empty() { + statements.push(current.trim().to_string()); + } + + statements +} + +pub async fn sync_all_company_schemas(db: &PgPool) -> anyhow::Result<()> { + let rows = sqlx::query("select id, schema_name from organizations where status = 'active'") + .fetch_all(db) + .await?; + + for row in rows { + let organization_id: Uuid = row.get("id"); + let schema_name = row + .get::, _>("schema_name") + .unwrap_or_else(|| company_schema_name(organization_id)); + provision_company_schema(db, &schema_name) + .await + .map_err(|error| anyhow::anyhow!(error.message))?; + } + + Ok(()) +} + +async fn seed_roles_and_permissions_tx( + tx: &mut Transaction<'_, Postgres>, + schema_name: &str, +) -> Result<(), ApiError> { + ensure_safe_schema_name(schema_name)?; + for (code, name) in ROLE_SEEDS { + let sql = format!( + "insert into {schema}.roles (id, code, name, is_system_role) values ($1, $2, $3, true) on conflict (code) do nothing", + schema = schema_name + ); + sqlx::query(&sql) + .bind(Uuid::new_v4()) + .bind(code) + .bind(name) + .execute(&mut **tx) + .await?; + } + + for code in PERMISSION_SEEDS { + let sql = format!( + "insert into {schema}.permissions (id, code) values ($1, $2) on conflict (code) do nothing", + schema = schema_name + ); + sqlx::query(&sql) + .bind(Uuid::new_v4()) + .bind(code) + .execute(&mut **tx) + .await?; + } + + assign_role_permissions_tx(tx, schema_name).await?; + Ok(()) +} + +async fn seed_number_ranges_tx( + tx: &mut Transaction<'_, Postgres>, + schema_name: &str, +) -> Result<(), ApiError> { + ensure_safe_schema_name(schema_name)?; + for (code, pattern) in NUMBER_RANGE_SEEDS { + let sql = format!( + r#" + insert into {schema}.number_ranges ( + id, code, pattern, counter_value, counter_padding, reset_rule, is_active + ) values ($1, $2, $3, 0, 9, null, true) + on conflict (code) do nothing + "#, + schema = schema_name + ); + sqlx::query(&sql) + .bind(Uuid::new_v4()) + .bind(code) + .bind(pattern) + .execute(&mut **tx) + .await?; + } + Ok(()) +} + +async fn seed_import_mappings_tx( + tx: &mut Transaction<'_, Postgres>, + schema_name: &str, +) -> Result<(), ApiError> { + ensure_safe_schema_name(schema_name)?; + let sql = format!( + r#" + insert into {schema}.import_mappings ( + id, code, name, delimiter, item_number_column, name_column, unit_column, + tax_rate_column, purchase_price_column, sales_price_column, is_default + ) values ( + $1, 'default_price_list_csv', 'Standard-Preislisten-CSV', ';', + 'item_number', 'name', 'unit', 'tax_rate', 'purchase_price', 'sales_price', true + ) + on conflict (code) do nothing + "#, + schema = schema_name + ); + sqlx::query(&sql) + .bind(Uuid::new_v4()) + .execute(&mut **tx) + .await?; + Ok(()) +} + +const NUMBER_RANGE_SEEDS: &[(&str, &str)] = &[ + ("items", "AR{counter}"), + ("activities", "AK{counter}"), + ("outgoing_invoices", "AR{counter}"), + ("incoming_invoices", "ER{counter}"), + ("customers", "KU{counter}"), + ("suppliers", "LI{counter}"), + ("quotes", "AN{counter}"), +]; + +const ROLE_SEEDS: &[(&str, &str)] = &[ + ("owner", "Besitzer"), + ("admin", "Admin"), + ("sales", "Vertrieb"), + ("accounting", "Buchhaltung"), + ("viewer", "Lesen"), +]; + +const PERMISSION_SEEDS: &[&str] = &[ + "users.read", + "users.invite", + "users.roles.write", + "users.disable", + "settings.read", + "settings.write", + "number_ranges.read", + "number_ranges.write", + "customers.read", + "customers.write", + "customers.delete", + "customer_discounts.write", + "suppliers.read", + "suppliers.write", + "suppliers.delete", + "supplier_cash_discounts.write", + "cash_discount_terms.read", + "cash_discount_terms.write", + "cash_discount_terms.delete", + "items.read", + "items.write", + "items.delete", + "item_prices.write", + "price_lists.import", + "price_apis.sync", + "price_rules.write", + "quotes.read", + "quotes.write", + "quotes.delete", + "quotes.convert_to_invoice", + "outgoing_invoices.read", + "outgoing_invoices.write", + "outgoing_invoices.delete", + "invoices.finalize", + "incoming_invoices.read", + "incoming_invoices.write", + "incoming_invoices.delete", + "activities.read", + "activities.write", + "activities.delete", + "communication.read", + "communication.write", + "documents.read", + "documents.write", + "reports.read", + "audit_log.read", +]; + +const ADMIN_PERMISSIONS: &[&str] = &[ + "users.read", + "users.invite", + "settings.read", + "settings.write", + "number_ranges.read", + "number_ranges.write", + "customers.read", + "customers.write", + "customers.delete", + "customer_discounts.write", + "suppliers.read", + "suppliers.write", + "suppliers.delete", + "supplier_cash_discounts.write", + "cash_discount_terms.read", + "cash_discount_terms.write", + "cash_discount_terms.delete", + "items.read", + "items.write", + "items.delete", + "item_prices.write", + "price_lists.import", + "price_apis.sync", + "price_rules.write", + "quotes.read", + "quotes.write", + "quotes.delete", + "quotes.convert_to_invoice", + "outgoing_invoices.read", + "outgoing_invoices.write", + "outgoing_invoices.delete", + "invoices.finalize", + "incoming_invoices.read", + "incoming_invoices.write", + "incoming_invoices.delete", + "activities.read", + "activities.write", + "activities.delete", + "communication.read", + "communication.write", + "documents.read", + "documents.write", + "reports.read", + "audit_log.read", +]; + +const SALES_PERMISSIONS: &[&str] = &[ + "customers.read", + "customers.write", + "customer_discounts.write", + "cash_discount_terms.read", + "items.read", + "item_prices.write", + "quotes.read", + "quotes.write", + "quotes.convert_to_invoice", + "outgoing_invoices.read", + "outgoing_invoices.write", + "invoices.finalize", + "activities.read", + "activities.write", + "communication.read", + "communication.write", + "documents.read", + "documents.write", +]; + +const ACCOUNTING_PERMISSIONS: &[&str] = &[ + "customers.read", + "suppliers.read", + "items.read", + "quotes.read", + "outgoing_invoices.read", + "outgoing_invoices.write", + "invoices.finalize", + "incoming_invoices.read", + "incoming_invoices.write", + "customer_discounts.write", + "supplier_cash_discounts.write", + "cash_discount_terms.read", + "activities.read", + "activities.write", + "communication.read", + "documents.read", + "documents.write", + "reports.read", +]; + +const VIEWER_PERMISSIONS: &[&str] = &[ + "settings.read", + "customers.read", + "suppliers.read", + "cash_discount_terms.read", + "items.read", + "quotes.read", + "outgoing_invoices.read", + "incoming_invoices.read", + "activities.read", + "communication.read", + "documents.read", + "reports.read", +]; + +async fn assign_role_permissions_tx( + tx: &mut Transaction<'_, Postgres>, + schema_name: &str, +) -> Result<(), ApiError> { + for (role, permissions) in [ + ("owner", PERMISSION_SEEDS), + ("admin", ADMIN_PERMISSIONS), + ("sales", SALES_PERMISSIONS), + ("accounting", ACCOUNTING_PERMISSIONS), + ("viewer", VIEWER_PERMISSIONS), + ] { + for permission in permissions { + let sql = format!( + r#" + insert into {schema}.role_permissions (role_id, permission_id) + select r.id, p.id + from {schema}.roles r + cross join {schema}.permissions p + where r.code = $1 and p.code = $2 + on conflict (role_id, permission_id) do nothing + "#, + schema = schema_name + ); + sqlx::query(&sql) + .bind(role) + .bind(permission) + .execute(&mut **tx) + .await?; + } + } + Ok(()) +} + +async fn assign_role( + db: &PgPool, + schema_name: &str, + user_id: Uuid, + role_code: &str, +) -> Result<(), ApiError> { + ensure_safe_schema_name(schema_name)?; + let sql = format!( + r#" + insert into {schema}.user_roles (user_id, role_id) + select $1, id from {schema}.roles where code = $2 + on conflict (user_id, role_id) do nothing + "#, + schema = schema_name + ); + sqlx::query(&sql) + .bind(user_id) + .bind(role_code) + .execute(db) + .await?; + Ok(()) +} + +async fn assign_role_tx( + tx: &mut Transaction<'_, Postgres>, + schema_name: &str, + user_id: Uuid, + role_code: &str, +) -> Result<(), ApiError> { + ensure_safe_schema_name(schema_name)?; + let sql = format!( + r#" + insert into {schema}.user_roles (user_id, role_id) + select $1, id from {schema}.roles where code = $2 + on conflict (user_id, role_id) do nothing + "#, + schema = schema_name + ); + sqlx::query(&sql) + .bind(user_id) + .bind(role_code) + .execute(&mut **tx) + .await?; + Ok(()) +} + +async fn assign_all_roles_tx( + tx: &mut Transaction<'_, Postgres>, + schema_name: &str, + user_id: Uuid, +) -> Result<(), ApiError> { + for role in ["owner", "admin", "sales", "accounting", "viewer"] { + assign_role_tx(tx, schema_name, user_id, role).await?; + } + Ok(()) +} + +async fn replace_user_roles( + db: &PgPool, + schema_name: &str, + user_id: Uuid, + roles: &[String], +) -> Result<(), ApiError> { + ensure_safe_schema_name(schema_name)?; + for role in roles { + ensure_role_exists(db, schema_name, role).await?; + } + + let delete_sql = format!( + "delete from {schema}.user_roles where user_id = $1", + schema = schema_name + ); + sqlx::query(&delete_sql).bind(user_id).execute(db).await?; + + for role in roles { + assign_role(db, schema_name, user_id, role).await?; + } + Ok(()) +} + +async fn ensure_role_exists( + db: &PgPool, + schema_name: &str, + role_code: &str, +) -> Result<(), ApiError> { + ensure_safe_schema_name(schema_name)?; + let sql = format!( + "select id from {schema}.roles where code = $1 limit 1", + schema = schema_name + ); + let exists: Option = sqlx::query_scalar(&sql) + .bind(role_code) + .fetch_optional(db) + .await?; + + if exists.is_some() { + Ok(()) + } else { + Err(ApiError::bad_request(&format!( + "Unbekannte Rolle: {role_code}" + ))) + } +} + +async fn require_owner(db: &PgPool, schema_name: &str, user_id: Uuid) -> Result<(), ApiError> { + if user_has_role(db, schema_name, user_id, "owner").await? { + Ok(()) + } else { + Err(ApiError::forbidden( + "Nur der Besitzer darf Benutzerrechte verwalten", + )) + } +} + +async fn user_has_role( + db: &PgPool, + schema_name: &str, + user_id: Uuid, + role_code: &str, +) -> Result { + ensure_safe_schema_name(schema_name)?; + let sql = format!( + r#" + select exists( + select 1 + from {schema}.roles r + join {schema}.user_roles ur on ur.role_id = r.id + where ur.user_id = $1 and r.code = $2 + ) + "#, + schema = schema_name + ); + let has_role = sqlx::query_scalar::<_, bool>(&sql) + .bind(user_id) + .bind(role_code) + .fetch_one(db) + .await?; + Ok(has_role) +} + +async fn user_has_permission( + db: &PgPool, + schema_name: &str, + user_id: Uuid, + permission_code: &str, +) -> Result { + ensure_safe_schema_name(schema_name)?; + let sql = format!( + r#" + select exists( + select 1 + from {schema}.user_roles ur + join {schema}.role_permissions rp on rp.role_id = ur.role_id + join {schema}.permissions p on p.id = rp.permission_id + where ur.user_id = $1 and p.code = $2 + ) + "#, + schema = schema_name + ); + let has_permission = sqlx::query_scalar::<_, bool>(&sql) + .bind(user_id) + .bind(permission_code) + .fetch_one(db) + .await?; + Ok(has_permission) +} + +fn company_schema_name(organization_id: Uuid) -> String { + format!("company_{}", organization_id.simple()) +} + +fn ensure_safe_schema_name(schema_name: &str) -> Result<(), ApiError> { + if schema_name + .chars() + .all(|char| char.is_ascii_lowercase() || char.is_ascii_digit() || char == '_') + && schema_name.starts_with("company_") + { + Ok(()) + } else { + Err(ApiError::bad_request("Ungültiger Schema-Name")) + } +} + +fn decrypt_string( + crypto: &DataCrypto, + ciphertext: Vec, + nonce: Vec, + key_id: String, +) -> Result { + Ok(crypto.decrypt(&ciphertext, &nonce, &key_id)?) +} + +fn normalize_email(email: &str) -> Result { + let email = email.trim().to_lowercase(); + if email.contains('@') && email.len() >= 5 { + Ok(email) + } else { + Err(ApiError::bad_request("Ungültige E-Mail-Adresse")) + } +} + +fn validate_new_password(password: &str, password_confirm: &str) -> Result<(), ApiError> { + if password != password_confirm { + return Err(ApiError::bad_request( + "Neue Passwörter stimmen nicht überein", + )); + } + if password.len() < 12 { + return Err(ApiError::bad_request( + "Neues Passwort muss mindestens 12 Zeichen lang sein", + )); + } + if !password.chars().any(|ch| ch.is_ascii_lowercase()) + || !password.chars().any(|ch| ch.is_ascii_uppercase()) + || !password.chars().any(|ch| ch.is_ascii_digit()) + { + return Err(ApiError::bad_request( + "Neues Passwort muss Kleinbuchstaben, Großbuchstaben und Zahlen enthalten", + )); + } + Ok(()) +} + +fn dev_mode_enabled() -> bool { + cfg!(debug_assertions) || env::var("COMPANYTOOL_DEV_MODE").as_deref() == Ok("1") +} + +fn generate_initial_password() -> String { + let mut bytes = [0_u8; 18]; + rand_core::OsRng.fill_bytes(&mut bytes); + base64_url(&bytes) +} + +fn generate_token() -> String { + let mut bytes = [0_u8; 32]; + rand_core::OsRng.fill_bytes(&mut bytes); + base64_url(&bytes) +} + +fn hash_token(token: &str) -> String { + let digest = Sha256::digest(token.as_bytes()); + base64_url(&digest) +} + +fn base64_url(bytes: &[u8]) -> String { + use base64::{engine::general_purpose::URL_SAFE_NO_PAD, Engine}; + URL_SAFE_NO_PAD.encode(bytes) +} + +fn hash_password(password: &str) -> Result { + let salt = SaltString::generate(&mut OsRng); + Ok(Argon2::default() + .hash_password(password.as_bytes(), &salt) + .map_err(|error| ApiError::internal(error.to_string()))? + .to_string()) +} + +fn verify_password(password: &str, hash: &str) -> Result<(), ApiError> { + let parsed_hash = + PasswordHash::new(hash).map_err(|_| ApiError::unauthorized("Login fehlgeschlagen"))?; + Argon2::default() + .verify_password(password.as_bytes(), &parsed_hash) + .map_err(|_| ApiError::unauthorized("Login fehlgeschlagen")) +} + +pub struct ApiError { + status: StatusCode, + message: String, +} + +impl ApiError { + pub(crate) fn bad_request(message: &str) -> Self { + Self { + status: StatusCode::BAD_REQUEST, + message: message.to_string(), + } + } + + fn unauthorized(message: &str) -> Self { + Self { + status: StatusCode::UNAUTHORIZED, + message: message.to_string(), + } + } + + fn forbidden(message: &str) -> Self { + Self { + status: StatusCode::FORBIDDEN, + message: message.to_string(), + } + } + + fn not_found(message: &str) -> Self { + Self { + status: StatusCode::NOT_FOUND, + message: message.to_string(), + } + } + + fn conflict(message: &str) -> Self { + Self { + status: StatusCode::CONFLICT, + message: message.to_string(), + } + } + + fn internal(message: String) -> Self { + Self { + status: StatusCode::INTERNAL_SERVER_ERROR, + message, + } + } +} + +impl IntoResponse for ApiError { + fn into_response(self) -> Response { + (self.status, Json(json!({ "message": self.message }))).into_response() + } +} + +impl From for ApiError { + fn from(error: sqlx::Error) -> Self { + Self::internal(error.to_string()) + } +} + +impl From for ApiError { + fn from(error: anyhow::Error) -> Self { + Self::internal(error.to_string()) + } +} + +impl From for ApiError { + fn from(error: std::io::Error) -> Self { + Self::internal(error.to_string()) + } +} + +impl From for ApiError { + fn from(error: serde_json::Error) -> Self { + Self::internal(error.to_string()) + } +} diff --git a/backend/src/crypto_at_rest.rs b/backend/src/crypto_at_rest.rs new file mode 100644 index 0000000..72564dc --- /dev/null +++ b/backend/src/crypto_at_rest.rs @@ -0,0 +1,54 @@ +use base64::{engine::general_purpose::STANDARD, Engine}; +use companytool_shared_protocol::crypto::SessionKey; +use serde::{de::DeserializeOwned, Serialize}; +use tracing::warn; + +#[derive(Clone)] +pub struct DataCrypto { + key: SessionKey, +} + +pub struct EncryptedField { + pub ciphertext: Vec, + pub nonce: Vec, + pub key_id: String, +} + +impl DataCrypto { + pub fn from_env() -> Self { + let key_id = std::env::var("COMPANYTOOL_DATA_KEY_ID") + .unwrap_or_else(|_| "dev-data-key-v1".to_string()); + let key_base64 = std::env::var("COMPANYTOOL_DATA_KEY_BASE64").unwrap_or_else(|_| { + warn!("COMPANYTOOL_DATA_KEY_BASE64 fehlt; verwende nur für Entwicklung geeigneten festen Schlüssel"); + STANDARD.encode([7_u8; 32]) + }); + let key = SessionKey::from_base64(key_id, &key_base64).expect("valid data encryption key"); + + Self { key } + } + + pub fn encrypt(&self, value: &T) -> anyhow::Result { + let envelope = self.key.encrypt(value)?; + Ok(EncryptedField { + ciphertext: STANDARD.decode(envelope.ciphertext)?, + nonce: STANDARD.decode(envelope.nonce)?, + key_id: envelope.key_id, + }) + } + + pub fn decrypt( + &self, + ciphertext: &[u8], + nonce: &[u8], + key_id: &str, + ) -> anyhow::Result { + let envelope = companytool_shared_protocol::EncryptedEnvelope { + enc: "aes-256-gcm-v1".to_string(), + key_id: key_id.to_string(), + nonce: STANDARD.encode(nonce), + ciphertext: STANDARD.encode(ciphertext), + }; + + Ok(self.key.decrypt(&envelope)?) + } +} diff --git a/backend/src/main.rs b/backend/src/main.rs new file mode 100644 index 0000000..9485d82 --- /dev/null +++ b/backend/src/main.rs @@ -0,0 +1,472 @@ +mod api; +mod crypto_at_rest; +mod models; + +use std::{env, net::SocketAddr}; + +use anyhow::Context; +use axum::{ + extract::{ + ws::{Message, WebSocket, WebSocketUpgrade}, + State, + }, + response::IntoResponse, + routing::{get, patch, post}, + Json, Router, +}; +use chrono::Utc; +use companytool_shared_protocol::{ + crypto::SessionKey, ClientMessage, HelloAckMessage, ProtocolErrorMessage, RecordSummary, + ServerMessage, WireMessage, PROTOCOL_VERSION, +}; +use crypto_at_rest::DataCrypto; +use futures_util::{SinkExt, StreamExt}; +use sqlx::{PgPool, Row}; +use tokio::sync::broadcast; +use tower_http::{cors::CorsLayer, trace::TraceLayer}; +use tracing::{info, warn}; +use uuid::Uuid; + +#[derive(Clone)] +struct AppState { + db: Option, + crypto: DataCrypto, + events: broadcast::Sender, +} + +impl AppState { + fn db(&self) -> Result<&PgPool, api::ApiError> { + self.db + .as_ref() + .ok_or_else(|| api::ApiError::bad_request("Datenbank ist im Testmodus nicht aktiv")) + } +} + +#[tokio::main] +async fn main() -> anyhow::Result<()> { + dotenvy::dotenv().ok(); + tracing_subscriber::fmt() + .with_env_filter(tracing_subscriber::EnvFilter::from_default_env()) + .init(); + + let communication_test_mode = env::var("COMMUNICATION_TEST_MODE").as_deref() == Ok("1"); + let bind: SocketAddr = env::var("BACKEND_BIND") + .unwrap_or_else(|_| "127.0.0.1:8080".to_string()) + .parse() + .context("BACKEND_BIND ist keine gültige Adresse")?; + + let db = if communication_test_mode { + warn!("COMMUNICATION_TEST_MODE aktiv: backend startet ohne datenbank"); + None + } else { + let database_url = + env::var("DATABASE_URL").context("DATABASE_URL fehlt, siehe .env.example")?; + let db = PgPool::connect(&database_url).await?; + migrate(&db).await?; + Some(db) + }; + + let (events, _) = broadcast::channel(256); + let state = AppState { + db, + crypto: DataCrypto::from_env(), + events, + }; + let app = Router::new() + .route("/health", get(health)) + .route("/ws", get(ws_handler)) + .route( + "/api/v1/dev/bootstrap-local", + post(api::dev_bootstrap_local), + ) + .route( + "/api/v1/registration/organization", + post(api::register_organization), + ) + .route( + "/api/v1/admin/organization-registrations", + get(api::list_organization_registrations), + ) + .route( + "/api/v1/admin/organization-registrations/:id", + get(api::get_organization_registration), + ) + .route( + "/api/v1/admin/organization-registrations/:id/approve", + post(api::approve_organization_registration), + ) + .route( + "/api/v1/admin/organization-registrations/:id/reject", + post(api::reject_organization_registration), + ) + .route( + "/api/v1/admin/organization-registrations/:id/resend-initial-email", + post(api::resend_initial_email), + ) + .route( + "/api/v1/admin/organization-registrations/:id/retry-provisioning", + post(api::retry_provisioning), + ) + .route("/api/v1/auth/login", post(api::login)) + .route( + "/api/v1/auth/change-initial-password", + post(api::change_initial_password), + ) + .route( + "/api/v1/auth/request-password-reset", + post(api::request_password_reset), + ) + .route("/api/v1/auth/reset-password", post(api::reset_password)) + .route( + "/api/v1/auth/accept-invitation", + post(api::accept_invitation), + ) + .route("/api/v1/auth/organizations", get(api::auth_organizations)) + .route( + "/api/v1/auth/select-organization", + post(api::select_organization), + ) + .route( + "/api/v1/organizations/current/setup", + get(api::get_organization_setup).put(api::put_organization_setup), + ) + .route( + "/api/v1/users/me/settings/navigation", + get(api::get_user_navigation_settings).put(api::put_user_navigation_settings), + ) + .route("/api/v1/number-ranges", get(api::list_number_ranges)) + .route( + "/api/v1/number-ranges/:code/next", + axum::routing::post(api::generate_next_number), + ) + .route( + "/api/v1/number-ranges/:code", + axum::routing::put(api::update_number_range), + ) + .route( + "/api/v1/customers", + get(api::list_customers).post(api::create_customer), + ) + .route( + "/api/v1/customers/:customer_id", + axum::routing::put(api::update_customer).delete(api::delete_customer), + ) + .route( + "/api/v1/suppliers", + get(api::list_suppliers).post(api::create_supplier), + ) + .route( + "/api/v1/suppliers/:supplier_id", + axum::routing::put(api::update_supplier).delete(api::delete_supplier), + ) + .route("/api/v1/items", get(api::list_items).post(api::create_item)) + .route( + "/api/v1/items/:item_id/prices", + get(api::list_item_price_history), + ) + .route( + "/api/v1/items/:item_id", + axum::routing::put(api::update_item).delete(api::delete_item), + ) + .route( + "/api/v1/cash-discount-terms", + get(api::list_cash_discount_terms).post(api::create_cash_discount_term), + ) + .route( + "/api/v1/cash-discount-terms/:term_id", + axum::routing::put(api::update_cash_discount_term) + .delete(api::delete_cash_discount_term), + ) + .route( + "/api/v1/quotes", + get(api::list_quotes).post(api::create_quote), + ) + .route( + "/api/v1/quotes/:quote_id", + axum::routing::put(api::update_quote).delete(api::delete_quote), + ) + .route( + "/api/v1/quotes/:quote_id/convert-to-invoice", + post(api::convert_quote_to_outgoing_invoice), + ) + .route( + "/api/v1/outgoing-invoices", + get(api::list_outgoing_invoices).post(api::create_outgoing_invoice), + ) + .route( + "/api/v1/outgoing-invoices/:invoice_id", + axum::routing::put(api::update_outgoing_invoice).delete(api::delete_outgoing_invoice), + ) + .route( + "/api/v1/outgoing-invoices/:invoice_id/finalize", + post(api::finalize_outgoing_invoice), + ) + .route( + "/api/v1/incoming-invoices", + get(api::list_incoming_invoices).post(api::create_incoming_invoice), + ) + .route( + "/api/v1/incoming-invoices/:invoice_id", + axum::routing::put(api::update_incoming_invoice).delete(api::delete_incoming_invoice), + ) + .route( + "/api/v1/imports/price-list/preview", + post(api::preview_price_list_import), + ) + .route( + "/api/v1/imports/price-list/apply", + post(api::apply_price_list_import), + ) + .route( + "/api/v1/api-connectors", + get(api::list_api_connectors).post(api::create_api_connector), + ) + .route( + "/api/v1/api-connectors/:connector_id", + axum::routing::put(api::update_api_connector).delete(api::delete_api_connector), + ) + .route( + "/api/v1/api-connectors/:connector_id/sync", + post(api::sync_api_connector), + ) + .route( + "/api/v1/price-rules", + get(api::list_price_rules).post(api::create_price_rule), + ) + .route( + "/api/v1/price-rules/:rule_id", + axum::routing::put(api::update_price_rule).delete(api::delete_price_rule), + ) + .route( + "/api/v1/activities", + get(api::list_activities).post(api::create_activity), + ) + .route( + "/api/v1/activities/:activity_id", + axum::routing::put(api::update_activity).delete(api::delete_activity), + ) + .route( + "/api/v1/communications", + get(api::list_communications).post(api::create_communication), + ) + .route( + "/api/v1/communications/:communication_id", + axum::routing::put(api::update_communication).delete(api::delete_communication), + ) + .route( + "/api/v1/documents", + get(api::list_documents).post(api::upload_document), + ) + .route( + "/api/v1/documents/:document_id/download", + get(api::download_document), + ) + .route( + "/api/v1/documents/:document_id/audit-log", + get(api::list_document_audit_log), + ) + .route( + "/api/v1/documents/:document_id", + axum::routing::delete(api::delete_document), + ) + .route( + "/api/v1/organizations/current/invitations", + post(api::invite_user), + ) + .route("/api/v1/organizations/current/users", get(api::list_users)) + .route( + "/api/v1/organizations/current/users/:user_id/roles", + patch(api::update_user_roles), + ) + .route( + "/api/v1/organizations/current/users/:user_id/disable", + post(api::disable_user), + ) + .with_state(state) + .layer(CorsLayer::permissive()) + .layer(TraceLayer::new_for_http()); + + let listener = tokio::net::TcpListener::bind(bind).await?; + info!("backend lauscht auf http://{bind}"); + axum::serve(listener, app) + .with_graceful_shutdown(shutdown_signal()) + .await?; + + Ok(()) +} + +async fn health() -> Json { + Json(serde_json::json!({ "status": "ok" })) +} + +async fn ws_handler(ws: WebSocketUpgrade, State(state): State) -> impl IntoResponse { + ws.on_upgrade(move |socket| handle_socket(socket, state)) +} + +async fn handle_socket(socket: WebSocket, state: AppState) { + let (mut sender, mut receiver) = socket.split(); + let mut events = state.events.subscribe(); + let mut session_key: Option = None; + + loop { + tokio::select! { + Some(Ok(message)) = receiver.next() => { + if let Message::Text(text) = message { + if let Some(new_session_key) = handle_client_wire_message(&text, &state, &mut sender, session_key.as_ref()).await { + if let Ok(snapshot) = load_snapshot(state.db.as_ref()).await { + if send_encrypted_server_message( + &mut sender, + &new_session_key, + ServerMessage::Snapshot { records: snapshot }, + ).await.is_err() { + break; + } + } + session_key = Some(new_session_key); + } + } + } + Ok(event) = events.recv() => { + if let Some(active_session_key) = session_key.as_ref() { + if let Err(error) = send_encrypted_server_message(&mut sender, active_session_key, event).await { + warn!(%error, "server message konnte nicht gesendet werden"); + break; + } + } + } + else => break, + } + } +} + +async fn handle_client_wire_message( + text: &str, + state: &AppState, + sender: &mut futures_util::stream::SplitSink, + session_key: Option<&SessionKey>, +) -> Option { + match serde_json::from_str::(text) { + Ok(WireMessage::Hello(hello)) => { + if hello.protocol_version != PROTOCOL_VERSION { + let _ = send_wire_error(sender, "nicht unterstützte Protokollversion").await; + return None; + } + + match SessionKey::from_base64(hello.key_id.clone(), &hello.session_key) { + Ok(new_session_key) => { + let ack = WireMessage::HelloAck(HelloAckMessage { + protocol_version: PROTOCOL_VERSION, + key_id: hello.key_id, + }); + if send_wire_message(sender, ack).await.is_err() { + return None; + } + Some(new_session_key) + } + Err(error) => { + let _ = + send_wire_error(sender, &format!("ungültiger Session-Key: {error}")).await; + None + } + } + } + Ok(WireMessage::Encrypted(envelope)) => { + let Some(active_session_key) = session_key else { + let _ = send_wire_error(sender, "verschlüsselte Nachricht vor hello").await; + return None; + }; + + match active_session_key.decrypt::(&envelope) { + Ok(message) => handle_client_message(message, state).await, + Err(error) => { + let _ = send_wire_error( + sender, + &format!("Nachricht konnte nicht entschlüsselt werden: {error}"), + ) + .await; + } + } + None + } + Ok(WireMessage::HelloAck(_) | WireMessage::Error(_)) => None, + Err(error) => { + let _ = send_wire_error(sender, &format!("ungültige Wire-Nachricht: {error}")).await; + None + } + } +} + +async fn handle_client_message(message: ClientMessage, state: &AppState) { + match message { + ClientMessage::Ping => { + let _ = state.events.send(ServerMessage::Pong); + } + ClientMessage::Subscribe { topic } => { + info!(%topic, "client hat topic abonniert"); + } + } +} + +async fn send_encrypted_server_message( + sender: &mut futures_util::stream::SplitSink, + session_key: &SessionKey, + message: ServerMessage, +) -> anyhow::Result<()> { + let envelope = session_key.encrypt(&message)?; + send_wire_message(sender, WireMessage::Encrypted(envelope)).await +} + +async fn send_wire_error( + sender: &mut futures_util::stream::SplitSink, + message: &str, +) -> anyhow::Result<()> { + send_wire_message( + sender, + WireMessage::Error(ProtocolErrorMessage { + message: message.to_string(), + }), + ) + .await +} + +async fn send_wire_message( + sender: &mut futures_util::stream::SplitSink, + message: WireMessage, +) -> anyhow::Result<()> { + let text = serde_json::to_string(&message)?; + sender.send(Message::Text(text)).await?; + Ok(()) +} + +async fn migrate(db: &PgPool) -> anyhow::Result<()> { + sqlx::migrate!("./migrations").run(db).await?; + api::sync_all_company_schemas(db).await?; + Ok(()) +} + +async fn load_snapshot(db: Option<&PgPool>) -> anyhow::Result> { + let Some(db) = db else { + return Ok(vec![RecordSummary { + id: Uuid::nil(), + title: "Kommunikationstest-Datensatz".to_string(), + updated_at: Utc::now(), + }]); + }; + + let rows = sqlx::query("select id, title, updated_at from records order by updated_at desc") + .fetch_all(db) + .await?; + + Ok(rows + .into_iter() + .map(|row| RecordSummary { + id: row.get("id"), + title: row.get("title"), + updated_at: row.get("updated_at"), + }) + .collect()) +} + +async fn shutdown_signal() { + let _ = tokio::signal::ctrl_c().await; +} diff --git a/backend/src/models.rs b/backend/src/models.rs new file mode 100644 index 0000000..ead542b --- /dev/null +++ b/backend/src/models.rs @@ -0,0 +1,210 @@ +#![allow(dead_code)] + +use chrono::{DateTime, Utc}; +use serde::{Deserialize, Serialize}; +use uuid::Uuid; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, sqlx::Type)] +#[sqlx(type_name = "text", rename_all = "snake_case")] +#[serde(rename_all = "snake_case")] +pub enum OrganizationStatus { + PendingApproval, + Approved, + Active, + Rejected, + Suspended, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, sqlx::Type)] +#[sqlx(type_name = "text", rename_all = "snake_case")] +#[serde(rename_all = "snake_case")] +pub enum UserOrganizationStatus { + PendingInvitation, + Active, + Disabled, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, sqlx::Type)] +#[sqlx(type_name = "text", rename_all = "snake_case")] +#[serde(rename_all = "snake_case")] +pub enum RegistrationStatus { + PendingApproval, + Approved, + Active, + Rejected, + Suspended, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, sqlx::Type)] +#[sqlx(type_name = "text", rename_all = "snake_case")] +#[serde(rename_all = "snake_case")] +pub enum InvitationStatus { + Pending, + Accepted, + Expired, + Revoked, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, sqlx::Type)] +#[sqlx(type_name = "text", rename_all = "snake_case")] +#[serde(rename_all = "snake_case")] +pub enum EmailOutboxStatus { + Pending, + Sending, + Sent, + Failed, +} + +#[derive(Debug, Clone, Serialize, Deserialize, sqlx::FromRow)] +pub struct User { + pub id: Uuid, + pub email: String, + pub display_name_ciphertext: Option>, + pub display_name_nonce: Option>, + pub display_name_key_id: Option, + pub password_hash: Option, + pub is_active: bool, + pub must_change_password: bool, + pub initial_password_expires_at: Option>, + pub created_at: DateTime, + pub updated_at: DateTime, + pub last_login_at: Option>, +} + +#[derive(Debug, Clone, Serialize, Deserialize, sqlx::FromRow)] +pub struct Organization { + pub id: Uuid, + pub display_name_ciphertext: Option>, + pub display_name_nonce: Option>, + pub display_name_key_id: Option, + pub schema_name: Option, + pub status: OrganizationStatus, + pub registration_email: String, + pub setup_completed_at: Option>, + pub approved_by_user_id: Option, + pub approved_at: Option>, + pub rejected_by_user_id: Option, + pub rejected_at: Option>, + pub rejection_reason: Option, + pub created_at: DateTime, + pub updated_at: DateTime, +} + +#[derive(Debug, Clone, Serialize, Deserialize, sqlx::FromRow)] +pub struct UserOrganization { + pub user_id: Uuid, + pub organization_id: Uuid, + pub status: UserOrganizationStatus, + pub invited_by_user_id: Option, + pub invited_at: Option>, + pub accepted_at: Option>, + pub created_at: DateTime, + pub updated_at: DateTime, +} + +#[derive(Debug, Clone, Serialize, Deserialize, sqlx::FromRow)] +pub struct AuthIdentity { + pub id: Uuid, + pub user_id: Uuid, + pub provider: String, + pub provider_subject: String, + pub email_at_provider: Option, + pub created_at: DateTime, + pub updated_at: DateTime, +} + +#[derive(Debug, Clone, Serialize, Deserialize, sqlx::FromRow)] +pub struct RefreshToken { + pub id: Uuid, + pub user_id: Uuid, + pub organization_id: Option, + pub token_hash: String, + pub expires_at: DateTime, + pub revoked_at: Option>, + pub revoked_reason: Option, + pub user_agent: Option, + pub created_ip: Option, + pub created_at: DateTime, +} + +#[derive(Debug, Clone, Serialize, Deserialize, sqlx::FromRow)] +pub struct SocketToken { + pub id: Uuid, + pub user_id: Uuid, + pub organization_id: Uuid, + pub token_hash: String, + pub expires_at: DateTime, + pub used_at: Option>, + pub revoked_at: Option>, + pub created_at: DateTime, +} + +#[derive(Debug, Clone, Serialize, Deserialize, sqlx::FromRow)] +pub struct SessionKeyRecord { + pub id: Uuid, + pub user_id: Uuid, + pub organization_id: Uuid, + pub key_id: String, + pub wrapped_key: Option>, + pub algorithm: String, + pub created_at: DateTime, + pub expires_at: DateTime, + pub revoked_at: Option>, +} + +#[derive(Debug, Clone, Serialize, Deserialize, sqlx::FromRow)] +pub struct IdempotencyKey { + pub id: Uuid, + pub user_id: Uuid, + pub organization_id: Option, + pub key: String, + pub request_hash: String, + pub response_status: Option, + pub response_body_json: Option, + pub expires_at: DateTime, + pub created_at: DateTime, +} + +#[derive(Debug, Clone, Serialize, Deserialize, sqlx::FromRow)] +pub struct OrganizationRegistrationRequest { + pub id: Uuid, + pub organization_name_ciphertext: Vec, + pub organization_name_nonce: Vec, + pub organization_name_key_id: String, + pub email: String, + pub status: RegistrationStatus, + pub organization_id: Option, + pub requested_at: DateTime, + pub decided_by_user_id: Option, + pub decided_at: Option>, + pub decision_note: Option, +} + +#[derive(Debug, Clone, Serialize, Deserialize, sqlx::FromRow)] +pub struct UserInvitation { + pub id: Uuid, + pub organization_id: Uuid, + pub email: String, + pub invited_by_user_id: Uuid, + pub status: InvitationStatus, + pub expires_at: DateTime, + pub accepted_at: Option>, + pub created_user_id: Option, + pub created_at: DateTime, +} + +#[derive(Debug, Clone, Serialize, Deserialize, sqlx::FromRow)] +pub struct EmailOutboxItem { + pub id: Uuid, + pub recipient_email: String, + pub template: String, + pub payload_ciphertext: Vec, + pub payload_nonce: Vec, + pub payload_key_id: String, + pub status: EmailOutboxStatus, + pub attempt_count: i32, + pub last_error: Option, + pub send_after: DateTime, + pub sent_at: Option>, + pub created_at: DateTime, +} diff --git a/deploy/nginx-companytool.conf b/deploy/nginx-companytool.conf new file mode 100644 index 0000000..e411674 --- /dev/null +++ b/deploy/nginx-companytool.conf @@ -0,0 +1,32 @@ +server { + listen 443 ssl http2; + server_name companytool.example.com; + + ssl_certificate /etc/letsencrypt/live/companytool.example.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/companytool.example.com/privkey.pem; + ssl_protocols TLSv1.2 TLSv1.3; + + location / { + proxy_pass http://127.0.0.1:8080; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto https; + } + + location /ws { + proxy_pass http://127.0.0.1:8080/ws; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header Host $host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto https; + } +} + +server { + listen 80; + server_name companytool.example.com; + return 301 https://$host$request_uri; +} diff --git a/desktop-client/Cargo.toml b/desktop-client/Cargo.toml new file mode 100644 index 0000000..201992d --- /dev/null +++ b/desktop-client/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "companytool-desktop-client" +version = "0.1.0" +edition.workspace = true +license.workspace = true + +[dependencies] +anyhow = "1" +companytool-shared-protocol = { path = "../shared-protocol" } +eframe = "0.29" +egui = "0.29" +futures-util = "0.3" +image = { version = "0.25", default-features = false, features = ["png"] } +reqwest = { version = "0.12", default-features = false, features = ["json", "rustls-tls"] } +serde = { version = "1", features = ["derive"] } +serde_json = "1" +tokio = { version = "1", features = ["rt-multi-thread", "sync"] } +tokio-tungstenite = "0.24" +toml = "0.8" +url = "2" diff --git a/desktop-client/companytool-client.toml b/desktop-client/companytool-client.toml new file mode 100644 index 0000000..aca7c6b --- /dev/null +++ b/desktop-client/companytool-client.toml @@ -0,0 +1,3 @@ +[server] +api_base_url = "http://localhost:8080" +ws_url = "ws://localhost:8080/ws" diff --git a/desktop-client/src/main.rs b/desktop-client/src/main.rs new file mode 100644 index 0000000..2dd48e0 --- /dev/null +++ b/desktop-client/src/main.rs @@ -0,0 +1,6792 @@ +use std::{ + collections::HashSet, + path::{Path, PathBuf}, + sync::mpsc::{self, Receiver}, + time::Duration, +}; + +use companytool_shared_protocol::{ + crypto::SessionKey, ClientMessage, HelloMessage, RecordSummary, ServerMessage, WireMessage, + PROTOCOL_VERSION, +}; +use eframe::egui; +use futures_util::{SinkExt, StreamExt}; +use serde::{Deserialize, Serialize}; + +const DEFAULT_CONFIG_PATH: &str = "desktop-client/companytool-client.toml"; +const DEFAULT_API_BASE_URL: &str = "http://localhost:8080"; +const DEFAULT_WS_URL: &str = "ws://localhost:8080/ws"; +const LOGO_BYTES: &[u8] = include_bytes!("../../images/icons/companytool-logo.png"); + +fn main() -> eframe::Result<()> { + let args = std::env::args().collect::>(); + let config = + ClientConfig::load(resolve_config_path(&args).as_deref()).unwrap_or_else(|error| { + eprintln!("client config konnte nicht geladen werden: {error}"); + eprintln!("verwende standardkonfiguration"); + ClientConfig::default() + }); + let api_base_url = resolve_api_base_url(&args, &config); + let ws_url = resolve_ws_url(&args, &config); + + if args.iter().any(|arg| arg == "--communication-test") { + match run_headless_communication_test(&ws_url) { + Ok(()) => { + println!("native client communication test ok"); + return Ok(()); + } + Err(error) => { + eprintln!("native client communication test failed: {error}"); + std::process::exit(1); + } + } + } + + if args.iter().any(|arg| arg == "--registration-test") { + match run_headless_registration_test(&args, &api_base_url) { + Ok(()) => { + println!("native client registration test ok"); + return Ok(()); + } + Err(error) => { + eprintln!("native client registration test failed: {error}"); + std::process::exit(1); + } + } + } + + let options = eframe::NativeOptions { + viewport: egui::ViewportBuilder::default() + .with_inner_size([1280.0, 720.0]) + .with_min_inner_size([1100.0, 650.0]) + .with_icon(eframe::icon_data::from_png_bytes(LOGO_BYTES).unwrap_or_default()), + ..Default::default() + }; + eframe::run_native( + "Company Tool", + options, + Box::new(|cc| { + Ok(Box::new(CompanyToolApp::new( + &api_base_url, + &ws_url, + &cc.egui_ctx, + ))) + }), + ) +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +struct ClientConfig { + server: ServerConfig, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +struct ServerConfig { + #[serde(default = "default_api_base_url")] + api_base_url: String, + #[serde(default = "default_ws_url")] + ws_url: String, +} + +impl Default for ClientConfig { + fn default() -> Self { + Self { + server: ServerConfig { + api_base_url: DEFAULT_API_BASE_URL.to_string(), + ws_url: DEFAULT_WS_URL.to_string(), + }, + } + } +} + +fn default_api_base_url() -> String { + DEFAULT_API_BASE_URL.to_string() +} + +fn default_ws_url() -> String { + DEFAULT_WS_URL.to_string() +} + +impl ClientConfig { + fn load(path: Option<&Path>) -> anyhow::Result { + let Some(path) = path else { + return Ok(Self::default()); + }; + + if !path.exists() { + return Ok(Self::default()); + } + + let content = std::fs::read_to_string(path)?; + let config = toml::from_str(&content)?; + Ok(config) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn missing_config_uses_defaults() { + let config = ClientConfig::load(Some(Path::new("/tmp/companytool-missing-config.toml"))) + .expect("missing config should use defaults"); + + assert_eq!(config.server.api_base_url, DEFAULT_API_BASE_URL); + assert_eq!(config.server.ws_url, DEFAULT_WS_URL); + } + + #[test] + fn config_file_overrides_server_urls() { + let path = std::env::temp_dir().join(format!( + "companytool-client-test-{}.toml", + std::process::id() + )); + std::fs::write( + &path, + r#" +[server] +api_base_url = "http://127.0.0.1:18087" +ws_url = "ws://127.0.0.1:18087/ws" +"#, + ) + .expect("write test config"); + + let config = ClientConfig::load(Some(&path)).expect("config should load"); + let _ = std::fs::remove_file(&path); + + assert_eq!(config.server.api_base_url, "http://127.0.0.1:18087"); + assert_eq!(config.server.ws_url, "ws://127.0.0.1:18087/ws"); + } + + #[test] + fn command_line_urls_override_config() { + let config = ClientConfig::default(); + let args = vec![ + "companytool-desktop-client".to_string(), + "--api-url".to_string(), + "http://example.test:8081".to_string(), + "--ws-url".to_string(), + "ws://example.test:8081/ws".to_string(), + ]; + + assert_eq!( + resolve_api_base_url(&args, &config), + "http://example.test:8081" + ); + assert_eq!(resolve_ws_url(&args, &config), "ws://example.test:8081/ws"); + } +} + +fn resolve_config_path(args: &[String]) -> Option { + if let Some(path) = args + .iter() + .position(|arg| arg == "--config") + .and_then(|index| args.get(index + 1)) + { + return Some(PathBuf::from(path)); + } + + if let Ok(path) = std::env::var("COMPANYTOOL_CLIENT_CONFIG") { + return Some(PathBuf::from(path)); + } + + Some(PathBuf::from(DEFAULT_CONFIG_PATH)) +} + +fn resolve_ws_url(args: &[String], config: &ClientConfig) -> String { + args.iter() + .position(|arg| arg == "--ws-url") + .and_then(|index| args.get(index + 1)) + .cloned() + .or_else(|| std::env::var("COMPANYTOOL_WS_URL").ok()) + .unwrap_or_else(|| config.server.ws_url.clone()) +} + +fn resolve_api_base_url(args: &[String], config: &ClientConfig) -> String { + args.iter() + .position(|arg| arg == "--api-url") + .and_then(|index| args.get(index + 1)) + .cloned() + .or_else(|| std::env::var("COMPANYTOOL_API_BASE_URL").ok()) + .unwrap_or_else(|| config.server.api_base_url.clone()) +} + +fn arg_value(args: &[String], name: &str) -> Option { + args.iter() + .position(|arg| arg == name) + .and_then(|index| args.get(index + 1)) + .cloned() +} + +fn run_headless_registration_test(args: &[String], api_base_url: &str) -> anyhow::Result<()> { + let organization_name = arg_value(args, "--organization-name") + .unwrap_or_else(|| "Native Client Test GmbH".to_string()); + let email = arg_value(args, "--email").unwrap_or_else(|| { + format!( + "native-client-test-{}@example.test", + std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .map(|duration| duration.as_secs()) + .unwrap_or_default() + ) + }); + + let runtime = tokio::runtime::Runtime::new()?; + let response = runtime + .block_on(register_organization( + api_base_url, + organization_name, + email.clone(), + true, + )) + .map_err(anyhow::Error::msg)?; + + anyhow::ensure!( + !response.id.trim().is_empty(), + "registrierung lieferte keine id" + ); + println!( + "registration id={} status={} email={}", + response.id, response.status, email + ); + Ok(()) +} + +fn run_headless_communication_test(ws_url: &str) -> anyhow::Result<()> { + let receiver = spawn_socket_client(ws_url); + let mut saw_snapshot = false; + let mut saw_pong = false; + let deadline = std::time::Instant::now() + Duration::from_secs(5); + + while std::time::Instant::now() < deadline { + match receiver.recv_timeout(Duration::from_millis(250)) { + Ok(ServerMessage::Snapshot { records }) => { + anyhow::ensure!(!records.is_empty(), "snapshot hatte keine datensaetze"); + saw_snapshot = true; + } + Ok(ServerMessage::Pong) => { + saw_pong = true; + } + Ok(ServerMessage::Error { message }) => { + anyhow::bail!(message); + } + Ok(ServerMessage::RecordChanged { .. }) => {} + Err(mpsc::RecvTimeoutError::Timeout) => {} + Err(error) => anyhow::bail!(error), + } + + if saw_snapshot && saw_pong { + return Ok(()); + } + } + + anyhow::bail!("timeout: snapshot={saw_snapshot}, pong={saw_pong}") +} + +fn spawn_socket_client(ws_url: &str) -> Receiver { + let (sender, receiver) = mpsc::channel(); + let url = ws_url.to_string(); + + std::thread::spawn(move || { + let runtime = tokio::runtime::Runtime::new().expect("tokio runtime"); + runtime.block_on(async move { + match tokio_tungstenite::connect_async(&url).await { + Ok((stream, _)) => { + let (mut write, mut read) = stream.split(); + let session_key = SessionKey::generate(); + let hello = WireMessage::Hello(HelloMessage { + protocol_version: PROTOCOL_VERSION, + key_id: session_key.key_id().to_string(), + session_key: session_key.to_base64(), + }); + + if let Ok(text) = serde_json::to_string(&hello) { + let _ = write + .send(tokio_tungstenite::tungstenite::Message::Text(text)) + .await; + } + + while let Some(Ok(message)) = read.next().await { + if let Ok(text) = message.to_text() { + match serde_json::from_str::(text) { + Ok(WireMessage::HelloAck(_)) => { + send_encrypted_client_message( + &mut write, + &session_key, + ClientMessage::Subscribe { + topic: "records".to_string(), + }, + ) + .await; + send_encrypted_client_message( + &mut write, + &session_key, + ClientMessage::Ping, + ) + .await; + } + Ok(WireMessage::Encrypted(envelope)) => { + if let Ok(server_message) = + session_key.decrypt::(&envelope) + { + let _ = sender.send(server_message); + } + } + Ok(WireMessage::Error(error)) => { + let _ = sender.send(ServerMessage::Error { + message: error.message, + }); + } + Ok(WireMessage::Hello(_)) | Err(_) => {} + } + } + } + } + Err(error) => { + let _ = sender.send(ServerMessage::Error { + message: format!("Verbindung fehlgeschlagen: {error}"), + }); + } + } + }); + }); + + receiver +} + +async fn send_encrypted_client_message( + write: &mut futures_util::stream::SplitSink< + tokio_tungstenite::WebSocketStream< + tokio_tungstenite::MaybeTlsStream, + >, + tokio_tungstenite::tungstenite::Message, + >, + session_key: &SessionKey, + message: ClientMessage, +) { + if let Ok(envelope) = session_key.encrypt(&message) { + if let Ok(text) = serde_json::to_string(&WireMessage::Encrypted(envelope)) { + let _ = write + .send(tokio_tungstenite::tungstenite::Message::Text(text)) + .await; + } + } +} + +fn apply_app_style(ctx: &egui::Context) { + let mut style = (*ctx.style()).clone(); + style.visuals = egui::Visuals::light(); + style.visuals.window_fill = background_color(); + style.visuals.panel_fill = background_color(); + style.visuals.extreme_bg_color = egui::Color32::from_rgb(255, 255, 255); + style.visuals.window_stroke = egui::Stroke::new(1.0, egui::Color32::from_rgb(198, 216, 218)); + style.visuals.widgets.noninteractive.bg_fill = egui::Color32::from_rgb(238, 248, 246); + style.visuals.widgets.noninteractive.fg_stroke = + egui::Stroke::new(1.0, egui::Color32::from_rgb(23, 32, 38)); + style.visuals.override_text_color = None; + style.visuals.widgets.inactive.rounding = 6.0.into(); + style.visuals.widgets.inactive.bg_fill = accent_soft_color(); + style.visuals.widgets.inactive.fg_stroke = + egui::Stroke::new(1.0, egui::Color32::from_rgb(23, 32, 38)); + style.visuals.widgets.inactive.bg_stroke = egui::Stroke::new(1.0, accent_soft_color()); + style.visuals.widgets.hovered.rounding = 6.0.into(); + style.visuals.widgets.hovered.bg_fill = egui::Color32::from_rgb(199, 235, 230); + style.visuals.widgets.hovered.fg_stroke = + egui::Stroke::new(1.0, egui::Color32::from_rgb(23, 32, 38)); + style.visuals.widgets.hovered.bg_stroke = egui::Stroke::new(1.0, accent_color()); + style.visuals.widgets.active.rounding = 6.0.into(); + style.visuals.widgets.active.bg_fill = accent_color(); + style.visuals.widgets.active.fg_stroke = egui::Stroke::new(1.0, egui::Color32::WHITE); + style.visuals.widgets.active.bg_stroke = egui::Stroke::new(1.0, accent_color()); + ctx.set_style(style); +} + +fn background_color() -> egui::Color32 { + egui::Color32::from_rgb(246, 250, 249) +} + +fn surface_color() -> egui::Color32 { + egui::Color32::from_rgb(255, 255, 255) +} + +fn accent_color() -> egui::Color32 { + egui::Color32::from_rgb(17, 138, 127) +} + +fn accent_dark_color() -> egui::Color32 { + egui::Color32::from_rgb(16, 84, 92) +} + +fn accent_soft_color() -> egui::Color32 { + egui::Color32::from_rgb(222, 244, 240) +} + +fn muted_text_color() -> egui::Color32 { + egui::Color32::from_rgb(90, 106, 114) +} + +fn load_logo_texture(ctx: &egui::Context) -> Option { + let image = image::load_from_memory(LOGO_BYTES).ok()?.to_rgba8(); + let size = [image.width() as usize, image.height() as usize]; + let pixels = image.into_raw(); + Some(ctx.load_texture( + "companytool-logo", + egui::ColorImage::from_rgba_unmultiplied(size, &pixels), + egui::TextureOptions::LINEAR, + )) +} + +fn brand(ui: &mut egui::Ui, logo: Option<&egui::TextureHandle>) { + ui.horizontal(|ui| { + if let Some(logo) = logo { + ui.add(egui::Image::new((logo.id(), egui::vec2(34.0, 34.0))).rounding(6.0)); + } else { + let (rect, _) = ui.allocate_exact_size(egui::vec2(34.0, 34.0), egui::Sense::hover()); + ui.painter().rect_filled(rect, 6.0, accent_color()); + } + ui.vertical(|ui| { + ui.label(egui::RichText::new("Company Tool").strong()); + ui.label( + egui::RichText::new("Organisationen") + .color(muted_text_color()) + .size(13.0), + ); + }); + }); +} + +fn nav_group_label(ui: &mut egui::Ui, label: &str) { + ui.add_space(12.0); + ui.label( + egui::RichText::new(label) + .color(muted_text_color()) + .size(11.0) + .strong(), + ); +} + +fn page_header(ui: &mut egui::Ui, title: &str, description: &str) { + ui.heading(egui::RichText::new(title).size(28.0).strong()); + ui.add_space(4.0); + ui.label(egui::RichText::new(description).color(muted_text_color())); + ui.add_space(18.0); +} + +fn panel(ui: &mut egui::Ui, add_contents: impl FnOnce(&mut egui::Ui)) { + egui::Frame::none() + .fill(surface_color()) + .stroke(egui::Stroke::new( + 1.0, + egui::Color32::from_rgb(217, 225, 228), + )) + .rounding(8.0) + .inner_margin(egui::Margin::same(18.0)) + .show(ui, |ui| { + add_contents(ui); + }); + ui.add_space(18.0); +} + +fn window_minimize_control(ui: &mut egui::Ui) -> bool { + let mut clicked = false; + ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { + if ui.add_sized([34.0, 26.0], egui::Button::new("_")).clicked() { + clicked = true; + } + }); + clicked +} + +fn sidebar_action_button(label: &str) -> egui::Button<'static> { + egui::Button::new( + egui::RichText::new(label.to_string()) + .color(egui::Color32::WHITE) + .strong(), + ) + .fill(accent_dark_color()) + .stroke(egui::Stroke::NONE) + .rounding(6.0) +} + +fn primary_action_button(label: &str) -> egui::Button<'static> { + egui::Button::new( + egui::RichText::new(label.to_string()) + .color(egui::Color32::WHITE) + .strong(), + ) + .fill(accent_color()) + .stroke(egui::Stroke::NONE) + .rounding(6.0) +} + +fn form_row(ui: &mut egui::Ui, label: &str, add_field: impl FnOnce(&mut egui::Ui)) { + ui.vertical(|ui| { + ui.label( + egui::RichText::new(label) + .color(egui::Color32::from_rgb(67, 82, 88)) + .strong() + .size(14.0), + ); + ui.add_space(3.0); + ui.scope(|ui| { + ui.set_width(ui.available_width().min(680.0)); + add_field(ui); + }); + }); + ui.add_space(10.0); +} + +macro_rules! master_detail { + ($ui:expr, $left:block, $right:block $(,)?) => {{ + let _ = $ui; + $left + $right + }}; +} + +fn cash_discount_combo( + ui: &mut egui::Ui, + id: &str, + selected_id: &mut Option, + terms: &[CashDiscountTerm], +) { + let selected_text = selected_id + .as_ref() + .and_then(|id| terms.iter().find(|term| &term.id == id)) + .map(|term| format!("{} - {}", term.code, term.name)) + .unwrap_or_else(|| "Keine".to_string()); + egui::ComboBox::from_id_salt(id) + .selected_text(selected_text) + .show_ui(ui, |ui| { + ui.selectable_value(selected_id, None, "Keine"); + for term in terms.iter().filter(|term| term.is_active) { + ui.selectable_value( + selected_id, + Some(term.id.clone()), + format!("{} - {}", term.code, term.name), + ); + } + }); +} + +fn matches_number_or_name(number: &str, name: &str, query: &str) -> bool { + let query = query.trim().to_lowercase(); + query.is_empty() + || number.to_lowercase().contains(&query) + || name.to_lowercase().contains(&query) +} + +fn number_or_pending(number: &str) -> &str { + if number.trim().is_empty() { + "wird automatisch vergeben" + } else { + number + } +} + +fn customer_combo( + ui: &mut egui::Ui, + selected_id: &mut String, + customers: &[Customer], + search: &mut String, +) { + let selected_text = customers + .iter() + .find(|customer| customer.id == *selected_id) + .map(|customer| format!("{} - {}", customer.customer_number, customer.name)) + .unwrap_or_else(|| "Bitte wählen".to_string()); + egui::ComboBox::from_id_salt("quote_customer") + .selected_text(selected_text) + .show_ui(ui, |ui| { + ui.text_edit_singleline(search); + ui.separator(); + ui.selectable_value(selected_id, String::new(), "Bitte wählen"); + for customer in customers + .iter() + .filter(|customer| customer.status == "active") + .filter(|customer| { + matches_number_or_name(&customer.customer_number, &customer.name, search) + }) + .take(20) + { + ui.selectable_value( + selected_id, + customer.id.clone(), + format!("{} - {}", customer.customer_number, customer.name), + ); + } + }); +} + +fn item_combo(ui: &mut egui::Ui, selected_id: &mut String, items: &[Item], search: &mut String) { + let selected_text = items + .iter() + .find(|item| item.id == *selected_id) + .map(|item| format!("{} - {}", item.item_number, item.name)) + .unwrap_or_else(|| "Bitte wählen".to_string()); + egui::ComboBox::from_id_salt("quote_item") + .selected_text(selected_text) + .show_ui(ui, |ui| { + ui.text_edit_singleline(search); + ui.separator(); + ui.selectable_value(selected_id, String::new(), "Bitte wählen"); + for item in items + .iter() + .filter(|item| item.status == "active") + .filter(|item| matches_number_or_name(&item.item_number, &item.name, search)) + .take(20) + { + ui.selectable_value( + selected_id, + item.id.clone(), + format!("{} - {}", item.item_number, item.name), + ); + } + }); +} + +fn supplier_combo( + ui: &mut egui::Ui, + selected_id: &mut String, + suppliers: &[Supplier], + search: &mut String, +) { + let selected_text = suppliers + .iter() + .find(|supplier| supplier.id == *selected_id) + .map(|supplier| format!("{} - {}", supplier.supplier_number, supplier.name)) + .unwrap_or_else(|| "Bitte wählen".to_string()); + egui::ComboBox::from_id_salt("invoice_supplier") + .selected_text(selected_text) + .show_ui(ui, |ui| { + ui.text_edit_singleline(search); + ui.separator(); + ui.selectable_value(selected_id, String::new(), "Bitte wählen"); + for supplier in suppliers + .iter() + .filter(|supplier| supplier.status == "active") + .filter(|supplier| { + matches_number_or_name(&supplier.supplier_number, &supplier.name, search) + }) + .take(20) + { + ui.selectable_value( + selected_id, + supplier.id.clone(), + format!("{} - {}", supplier.supplier_number, supplier.name), + ); + } + }); +} + +fn apply_quote_item_defaults(line: &mut QuoteItemForm, items: &[Item]) { + if let Some(item) = items.iter().find(|item| item.id == line.item_id) { + line.description = item.name.clone(); + line.unit_price = item + .default_sales_price + .clone() + .unwrap_or_else(|| "0".to_string()); + line.original_unit_price = item.default_sales_price.clone(); + line.tax_rate = item.tax_rate.clone(); + } +} + +fn invoice_items_editor( + ui: &mut egui::Ui, + lines: &mut Vec, + items: &[Item], + item_search: &mut String, +) { + ui.add_space(8.0); + ui.horizontal(|ui| { + ui.heading("Positionen"); + if ui.button("Position hinzufügen").clicked() { + lines.push(OutgoingInvoiceItemForm::default()); + } + }); + let mut remove_index = None; + let can_remove = lines.len() > 1; + for (index, line) in lines.iter_mut().enumerate() { + ui.separator(); + ui.label(format!("Position {}", index + 1)); + form_row(ui, "Artikel", |ui| { + item_combo(ui, &mut line.item_id, items, item_search) + }); + if ui.button("Artikelwerte übernehmen").clicked() { + if let Some(item) = items.iter().find(|item| item.id == line.item_id) { + line.description = item.name.clone(); + line.unit_price = item + .default_sales_price + .clone() + .unwrap_or_else(|| "0".to_string()); + line.original_unit_price = item.default_sales_price.clone(); + line.tax_rate = item.tax_rate.clone(); + } + } + form_row(ui, "Beschreibung", |ui| { + ui.text_edit_singleline(&mut line.description); + }); + egui::Grid::new(format!("outgoing_invoice_item_fields_{index}")) + .num_columns(2) + .spacing([14.0, 8.0]) + .show(ui, |ui| { + ui.label("Menge"); + ui.text_edit_singleline(&mut line.quantity); + ui.end_row(); + ui.label("Preis"); + ui.text_edit_singleline(&mut line.unit_price); + ui.end_row(); + ui.label("Rabatt %"); + ui.text_edit_singleline(&mut line.discount_percent); + ui.end_row(); + ui.label("Steuer %"); + ui.text_edit_singleline(&mut line.tax_rate); + ui.end_row(); + }); + if can_remove && ui.button("Entfernen").clicked() { + remove_index = Some(index); + } + } + if let Some(index) = remove_index { + lines.remove(index); + } +} + +fn incoming_invoice_items_editor( + ui: &mut egui::Ui, + lines: &mut Vec, + items: &[Item], + item_search: &mut String, +) { + ui.add_space(8.0); + ui.horizontal(|ui| { + ui.heading("Positionen"); + if ui.button("Position hinzufügen").clicked() { + lines.push(IncomingInvoiceItemForm::default()); + } + }); + let mut remove_index = None; + let can_remove = lines.len() > 1; + for (index, line) in lines.iter_mut().enumerate() { + ui.separator(); + ui.label(format!("Position {}", index + 1)); + let mut selected = line.item_id.clone().unwrap_or_default(); + form_row(ui, "Artikel", |ui| { + item_combo(ui, &mut selected, items, item_search) + }); + line.item_id = if selected.is_empty() { + None + } else { + Some(selected) + }; + form_row(ui, "Beschreibung", |ui| { + ui.text_edit_singleline(&mut line.description); + }); + egui::Grid::new(format!("incoming_invoice_item_fields_{index}")) + .num_columns(2) + .spacing([14.0, 8.0]) + .show(ui, |ui| { + ui.label("Menge"); + ui.text_edit_singleline(&mut line.quantity); + ui.end_row(); + ui.label("Preis"); + ui.text_edit_singleline(&mut line.unit_price); + ui.end_row(); + ui.label("Steuer %"); + ui.text_edit_singleline(&mut line.tax_rate); + ui.end_row(); + }); + if can_remove && ui.button("Entfernen").clicked() { + remove_index = Some(index); + } + } + if let Some(index) = remove_index { + lines.remove(index); + } +} + +fn number_range_label(code: &str) -> &'static str { + match code { + "items" => "Artikel", + "activities" => "Aktivitäten", + "outgoing_invoices" => "Rechnungen", + "incoming_invoices" => "Eingangsrechnungen", + "customers" => "Kunden", + "suppliers" => "Lieferanten", + "quotes" => "Angebote", + _ => "Nummernkreis", + } +} + +fn role_checkboxes(ui: &mut egui::Ui, roles: &mut Vec) { + ui.vertical(|ui| { + for (code, label) in available_roles() { + let mut enabled = roles.iter().any(|role| role == code); + if ui.checkbox(&mut enabled, label).changed() { + if enabled { + roles.push(code.to_string()); + } else { + roles.retain(|role| role != code); + } + } + } + }); +} + +fn available_roles() -> [(&'static str, &'static str); 5] { + [ + ("owner", "Besitzer"), + ("admin", "Admin"), + ("sales", "Vertrieb"), + ("accounting", "Buchhaltung"), + ("viewer", "Lesen"), + ] +} + +fn normalized_roles(roles: &[String]) -> Vec { + let mut normalized = roles + .iter() + .filter(|role| available_roles().iter().any(|(code, _)| code == role)) + .cloned() + .collect::>(); + normalized.sort(); + normalized.dedup(); + if normalized.is_empty() { + normalized.push("viewer".to_string()); + } + normalized +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "snake_case")] +enum NavigationMode { + Scroll, + Groups, +} + +impl Default for NavigationMode { + fn default() -> Self { + Self::Scroll + } +} + +impl NavigationMode { + fn label(self) -> &'static str { + match self { + Self::Scroll => "Scrollbar", + Self::Groups => "Gruppen einklappen", + } + } + + fn button_height(self) -> f32 { + 36.0 + } +} + +struct CompanyToolApp { + api_base_url: String, + ws_url: String, + receiver: Receiver, + logo_texture: Option, + login_sender: mpsc::Sender, + login_receiver: Receiver, + registration_sender: mpsc::Sender, + registration_receiver: Receiver, + dev_bootstrap_sender: mpsc::Sender, + dev_bootstrap_receiver: Receiver, + user_admin_sender: mpsc::Sender, + user_admin_receiver: Receiver, + admin_sender: mpsc::Sender, + admin_receiver: Receiver, + records: Vec, + status: String, + live_revision: u64, + live_update_status: String, + navigation_mode: NavigationMode, + navigation_settings_status: String, + minimized_windows: HashSet<&'static str>, + view: AppView, + authenticated_email: Option, + access_token: Option, + selected_organization_id: Option, + login_email: String, + login_password: String, + login_status: String, + login_pending: bool, + dev_organization_name: String, + dev_email: String, + dev_status: String, + dev_pending: bool, + dev_credentials: Option, + organization_name: String, + registration_email: String, + accept_terms: bool, + registration_status: String, + registration_pending: bool, + users: Vec, + users_status: String, + users_pending: bool, + saving_user_id: Option, + invite_email: String, + invite_roles: Vec, + users_window_open: bool, + organization_setup: OrganizationSetupForm, + organization_setup_status: String, + organization_setup_pending: bool, + organization_setup_window_open: bool, + number_ranges: Vec, + number_range_form: NumberRangeForm, + selected_number_range_code: Option, + number_ranges_status: String, + number_ranges_window_open: bool, + registrations: Vec, + registrations_status: String, + registrations_pending: bool, + admin_registrations_window_open: bool, + customers: Vec, + customer_form: CustomerForm, + selected_customer_id: Option, + customers_status: String, + customers_pending: bool, + customers_window_open: bool, + suppliers: Vec, + supplier_form: SupplierForm, + selected_supplier_id: Option, + suppliers_status: String, + suppliers_window_open: bool, + cash_discount_terms: Vec, + cash_discount_term_form: CashDiscountTermForm, + selected_cash_discount_term_id: Option, + cash_discount_terms_status: String, + cash_discount_terms_window_open: bool, + items: Vec, + item_form: ItemForm, + selected_item_id: Option, + item_price_history: Vec, + items_status: String, + items_window_open: bool, + quotes: Vec, + quote_form: QuoteForm, + selected_quote_id: Option, + quotes_status: String, + quotes_window_open: bool, + outgoing_invoices: Vec, + outgoing_invoice_form: OutgoingInvoiceForm, + selected_outgoing_invoice_id: Option, + outgoing_invoices_status: String, + outgoing_invoices_window_open: bool, + incoming_invoices: Vec, + incoming_invoice_form: IncomingInvoiceForm, + selected_incoming_invoice_id: Option, + incoming_invoices_status: String, + incoming_invoices_window_open: bool, + activities: Vec, + activity_form: ActivityForm, + selected_activity_id: Option, + activities_status: String, + activities_window_open: bool, + price_import_form: PriceListImportForm, + price_import_preview: Option, + price_import_status: String, + price_import_window_open: bool, + api_connectors: Vec, + api_connector_form: ApiConnectorForm, + selected_api_connector_id: Option, + api_connectors_status: String, + api_connectors_window_open: bool, + price_rules: Vec, + price_rule_form: PriceRuleForm, + selected_price_rule_id: Option, + price_rules_status: String, + price_rules_window_open: bool, + customer_lookup_search: String, + supplier_lookup_search: String, + item_lookup_search: String, + customer_list_search: String, + supplier_list_search: String, + item_list_search: String, + activity_list_search: String, + quote_list_search: String, + outgoing_invoice_list_search: String, + incoming_invoice_list_search: String, +} + +impl CompanyToolApp { + fn new(api_base_url: &str, ws_url: &str, ctx: &egui::Context) -> Self { + let (login_sender, login_receiver) = mpsc::channel(); + let (registration_sender, registration_receiver) = mpsc::channel(); + let (dev_bootstrap_sender, dev_bootstrap_receiver) = mpsc::channel(); + let (user_admin_sender, user_admin_receiver) = mpsc::channel(); + let (admin_sender, admin_receiver) = mpsc::channel(); + + Self { + api_base_url: api_base_url.to_string(), + ws_url: ws_url.to_string(), + receiver: spawn_socket_client(ws_url), + logo_texture: load_logo_texture(ctx), + login_sender, + login_receiver, + registration_sender, + registration_receiver, + dev_bootstrap_sender, + dev_bootstrap_receiver, + user_admin_sender, + user_admin_receiver, + admin_sender, + admin_receiver, + records: Vec::new(), + status: "Verbinde...".to_string(), + live_revision: 0, + live_update_status: "Keine Live-Änderung empfangen.".to_string(), + navigation_mode: NavigationMode::Scroll, + navigation_settings_status: String::new(), + minimized_windows: HashSet::new(), + view: AppView::Login, + authenticated_email: None, + access_token: None, + selected_organization_id: None, + login_email: String::new(), + login_password: String::new(), + login_status: String::new(), + login_pending: false, + dev_organization_name: "Lokale Testfirma".to_string(), + dev_email: "admin@example.test".to_string(), + dev_status: String::new(), + dev_pending: false, + dev_credentials: None, + organization_name: String::new(), + registration_email: String::new(), + accept_terms: false, + registration_status: String::new(), + registration_pending: false, + users: Vec::new(), + users_status: "Noch keine Benutzer geladen.".to_string(), + users_pending: false, + saving_user_id: None, + invite_email: String::new(), + invite_roles: vec!["viewer".to_string()], + users_window_open: false, + organization_setup: OrganizationSetupForm::default(), + organization_setup_status: String::new(), + organization_setup_pending: false, + organization_setup_window_open: false, + number_ranges: Vec::new(), + number_range_form: NumberRangeForm::default(), + selected_number_range_code: None, + number_ranges_status: "Noch keine Nummernkreise geladen.".to_string(), + number_ranges_window_open: false, + registrations: Vec::new(), + registrations_status: "Noch keine Registrierungen geladen.".to_string(), + registrations_pending: false, + admin_registrations_window_open: false, + customers: Vec::new(), + customer_form: CustomerForm::default(), + selected_customer_id: None, + customers_status: "Noch keine Kunden geladen.".to_string(), + customers_pending: false, + customers_window_open: false, + suppliers: Vec::new(), + supplier_form: SupplierForm::default(), + selected_supplier_id: None, + suppliers_status: "Noch keine Lieferanten geladen.".to_string(), + suppliers_window_open: false, + cash_discount_terms: Vec::new(), + cash_discount_term_form: CashDiscountTermForm::default(), + selected_cash_discount_term_id: None, + cash_discount_terms_status: "Noch keine Skonto-Regeln geladen.".to_string(), + cash_discount_terms_window_open: false, + items: Vec::new(), + item_form: ItemForm::default(), + selected_item_id: None, + item_price_history: Vec::new(), + items_status: "Noch keine Artikel geladen.".to_string(), + items_window_open: false, + quotes: Vec::new(), + quote_form: QuoteForm::default(), + selected_quote_id: None, + quotes_status: "Noch keine Angebote geladen.".to_string(), + quotes_window_open: false, + outgoing_invoices: Vec::new(), + outgoing_invoice_form: OutgoingInvoiceForm::default(), + selected_outgoing_invoice_id: None, + outgoing_invoices_status: "Noch keine Ausgangsrechnungen geladen.".to_string(), + outgoing_invoices_window_open: false, + incoming_invoices: Vec::new(), + incoming_invoice_form: IncomingInvoiceForm::default(), + selected_incoming_invoice_id: None, + incoming_invoices_status: "Noch keine Eingangsrechnungen geladen.".to_string(), + incoming_invoices_window_open: false, + activities: Vec::new(), + activity_form: ActivityForm::default(), + selected_activity_id: None, + activities_status: "Noch keine Aktivitäten geladen.".to_string(), + activities_window_open: false, + price_import_form: PriceListImportForm::default(), + price_import_preview: None, + price_import_status: "Noch keine Preisliste geprüft.".to_string(), + price_import_window_open: false, + api_connectors: Vec::new(), + api_connector_form: ApiConnectorForm::default(), + selected_api_connector_id: None, + api_connectors_status: "Noch keine Preis-APIs geladen.".to_string(), + api_connectors_window_open: false, + price_rules: Vec::new(), + price_rule_form: PriceRuleForm::default(), + selected_price_rule_id: None, + price_rules_status: "Noch keine Preisregeln geladen.".to_string(), + price_rules_window_open: false, + customer_lookup_search: String::new(), + supplier_lookup_search: String::new(), + item_lookup_search: String::new(), + customer_list_search: String::new(), + supplier_list_search: String::new(), + item_list_search: String::new(), + activity_list_search: String::new(), + quote_list_search: String::new(), + outgoing_invoice_list_search: String::new(), + incoming_invoice_list_search: String::new(), + } + } + + fn drain_messages(&mut self) { + while let Ok(message) = self.receiver.try_recv() { + match message { + ServerMessage::Snapshot { records } => { + self.records = records; + self.status = "Verbunden".to_string(); + } + ServerMessage::RecordChanged { record } => { + self.live_revision += 1; + self.live_update_status = + format!("Live-Änderung {}: {}", self.live_revision, record.title); + if let Some(existing) = + self.records.iter_mut().find(|item| item.id == record.id) + { + *existing = record; + } else { + self.records.insert(0, record); + } + self.status = "Aktualisiert".to_string(); + if self.customers_window_open { + self.load_customers(); + } + if self.suppliers_window_open { + self.load_suppliers(); + } + if self.cash_discount_terms_window_open + || self.customers_window_open + || self.suppliers_window_open + { + self.load_cash_discount_terms(); + } + if self.items_window_open { + self.load_items(); + if let Some(item_id) = self.selected_item_id.clone() { + self.load_item_price_history(item_id); + } + } + if self.quotes_window_open { + self.load_quotes(); + self.load_customers(); + self.load_items(); + } + if self.outgoing_invoices_window_open { + self.load_outgoing_invoices(); + self.load_customers(); + self.load_items(); + } + if self.incoming_invoices_window_open { + self.load_incoming_invoices(); + self.load_suppliers(); + self.load_items(); + } + if self.activities_window_open { + self.load_activities(); + } + if self.api_connectors_window_open { + self.load_api_connectors(); + } + if self.price_rules_window_open { + self.load_price_rules(); + } + if self.price_import_window_open && self.price_import_preview.is_some() { + self.preview_price_import(); + } + } + ServerMessage::Pong => { + self.status = "Backend erreichbar".to_string(); + } + ServerMessage::Error { message } => { + self.status = message; + } + } + } + + while let Ok(result) = self.login_receiver.try_recv() { + self.login_pending = false; + match result { + Ok(response) => { + self.authenticated_email = Some(self.login_email.trim().to_string()); + self.access_token = Some(response.access_token.clone()); + self.selected_organization_id = + response.organization_id.clone().or_else(|| { + response + .organizations + .first() + .map(|organization| organization.id.clone()) + }); + self.login_password.clear(); + self.load_user_navigation_settings(); + let organization_text = match response.organizations.first() { + Some(organization) => format!( + "{} Organization(en), aktiv: {} ({})", + response.organizations.len(), + organization + .schema_name + .as_deref() + .unwrap_or(&organization.id), + organization.status + ), + None => "keine aktive Organization".to_string(), + }; + self.login_status = if response.must_change_password { + format!( + "Login erfolgreich für {}. Passwortänderung ist erforderlich. {}.", + response.user_id, organization_text + ) + } else { + format!( + "Login erfolgreich für {}. {}.", + response.user_id, organization_text + ) + }; + self.view = AppView::Status; + } + Err(message) => { + self.login_status = message; + } + } + } + + while let Ok(result) = self.registration_receiver.try_recv() { + self.registration_pending = false; + self.registration_status = match result { + Ok(response) => format!( + "Registrierung eingegangen. Status: {}, ID: {}", + response.status, response.id + ), + Err(message) => message, + }; + } + + while let Ok(result) = self.dev_bootstrap_receiver.try_recv() { + self.dev_pending = false; + match result { + Ok(response) => { + self.login_email = response.email.clone(); + self.login_password = response.password.clone(); + self.dev_status = "Testfirma und User wurden angelegt.".to_string(); + self.dev_credentials = Some(response); + } + Err(message) => { + self.dev_status = message; + self.dev_credentials = None; + } + } + } + + while let Ok(event) = self.user_admin_receiver.try_recv() { + match event { + UserAdminEvent::UsersLoaded(result) => { + self.users_pending = false; + match result { + Ok(users) => { + self.users = users; + self.users_status = if self.users.is_empty() { + "Keine Benutzer vorhanden.".to_string() + } else { + "Benutzer geladen.".to_string() + }; + } + Err(message) => { + self.users.clear(); + self.users_status = message; + } + } + } + UserAdminEvent::InvitationSent(result) => { + self.users_pending = false; + match result { + Ok(message) => { + self.users_status = message; + self.invite_email.clear(); + self.load_users(); + } + Err(message) => { + self.users_status = message; + } + } + } + UserAdminEvent::RolesSaved { user_id, result } => { + self.saving_user_id = None; + match result { + Ok(()) => { + self.users_status = "Benutzerrechte gespeichert.".to_string(); + self.load_users(); + } + Err(message) => { + self.users_status = format!("{user_id}: {message}"); + } + } + } + } + } + + while let Ok(event) = self.admin_receiver.try_recv() { + match event { + AdminEvent::NavigationSettingsLoaded(result) => match result { + Ok(settings) => { + self.navigation_mode = settings.mode; + self.navigation_settings_status = String::new(); + } + Err(message) => { + self.navigation_settings_status = message; + } + }, + AdminEvent::NavigationSettingsSaved(result) => match result { + Ok(settings) => { + self.navigation_mode = settings.mode; + self.navigation_settings_status = "Menü gespeichert.".to_string(); + } + Err(message) => { + self.navigation_settings_status = message; + } + }, + AdminEvent::OrganizationSetupSaved(result) => { + self.organization_setup_pending = false; + self.organization_setup_status = match result { + Ok(()) => "Firmendaten gespeichert.".to_string(), + Err(message) => message, + }; + } + AdminEvent::OrganizationSetupLoaded(result) => { + self.organization_setup_pending = false; + match result { + Ok(Some(setup)) => { + self.organization_setup = setup; + self.organization_setup_status = "Firmendaten geladen.".to_string(); + } + Ok(None) => { + self.organization_setup_status = + "Noch keine Firmendaten gespeichert.".to_string(); + } + Err(message) => { + self.organization_setup_status = message; + } + } + } + AdminEvent::RegistrationsLoaded(result) => { + self.registrations_pending = false; + match result { + Ok(registrations) => { + self.registrations = registrations; + self.registrations_status = if self.registrations.is_empty() { + "Keine Registrierungen vorhanden.".to_string() + } else { + "Registrierungen geladen.".to_string() + }; + } + Err(message) => { + self.registrations.clear(); + self.registrations_status = message; + } + } + } + AdminEvent::RegistrationActionDone(result) => { + self.registrations_pending = false; + self.registrations_status = match result { + Ok(message) => message, + Err(message) => message, + }; + self.load_registrations(); + } + AdminEvent::NumberRangesLoaded(result) => match result { + Ok(records) => { + self.number_ranges = records; + self.number_ranges_status = "Nummernkreise geladen.".to_string(); + } + Err(message) => self.number_ranges_status = message, + }, + AdminEvent::NumberRangeSaved(result) => match result { + Ok(record) => { + self.selected_number_range_code = Some(record.code.clone()); + self.number_range_form = NumberRangeForm::from(&record); + self.number_ranges_status = "Nummernkreis gespeichert.".to_string(); + self.load_number_ranges(); + } + Err(message) => self.number_ranges_status = message, + }, + AdminEvent::NextNumberReserved { code, result } => match result { + Ok(number) => self.apply_reserved_number(&code, number), + Err(message) => self.set_number_status(&code, message), + }, + AdminEvent::CustomersLoaded(result) => { + self.customers_pending = false; + match result { + Ok(customers) => { + self.customers = customers; + self.customers_status = "Kunden geladen.".to_string(); + } + Err(message) => { + self.customers_status = message; + } + } + } + AdminEvent::CustomerSaved(result) => { + self.customers_pending = false; + match result { + Ok(customer) => { + self.selected_customer_id = Some(customer.id.clone()); + self.customer_form = CustomerForm::from(&customer); + self.customers_status = "Kunde gespeichert.".to_string(); + self.load_customers(); + } + Err(message) => { + self.customers_status = message; + } + } + } + AdminEvent::CustomerDeleted(result) => { + self.customers_pending = false; + self.customers_status = match result { + Ok(()) => "Kunde deaktiviert.".to_string(), + Err(message) => message, + }; + self.load_customers(); + } + AdminEvent::SuppliersLoaded(result) => match result { + Ok(records) => { + self.suppliers = records; + self.suppliers_status = "Lieferanten geladen.".to_string(); + } + Err(message) => self.suppliers_status = message, + }, + AdminEvent::SupplierSaved(result) => match result { + Ok(record) => { + self.selected_supplier_id = Some(record.id.clone()); + self.supplier_form = SupplierForm::from(&record); + self.suppliers_status = "Lieferant gespeichert.".to_string(); + self.load_suppliers(); + } + Err(message) => self.suppliers_status = message, + }, + AdminEvent::SupplierDeleted(result) => { + self.suppliers_status = result + .map(|_| "Lieferant deaktiviert.".to_string()) + .unwrap_or_else(|message| message); + self.load_suppliers(); + } + AdminEvent::CashDiscountTermsLoaded(result) => match result { + Ok(records) => { + self.cash_discount_terms = records; + self.cash_discount_terms_status = "Skonto-Regeln geladen.".to_string(); + } + Err(message) => self.cash_discount_terms_status = message, + }, + AdminEvent::CashDiscountTermSaved(result) => match result { + Ok(record) => { + self.selected_cash_discount_term_id = Some(record.id.clone()); + self.cash_discount_term_form = CashDiscountTermForm::from(&record); + self.cash_discount_terms_status = "Skonto-Regel gespeichert.".to_string(); + self.load_cash_discount_terms(); + } + Err(message) => self.cash_discount_terms_status = message, + }, + AdminEvent::CashDiscountTermDeleted(result) => { + self.cash_discount_terms_status = result + .map(|_| "Skonto-Regel deaktiviert.".to_string()) + .unwrap_or_else(|message| message); + self.load_cash_discount_terms(); + } + AdminEvent::ItemsLoaded(result) => match result { + Ok(records) => { + self.items = records; + self.items_status = "Artikel geladen.".to_string(); + } + Err(message) => self.items_status = message, + }, + AdminEvent::ItemSaved(result) => match result { + Ok(record) => { + self.selected_item_id = Some(record.id.clone()); + self.item_form = ItemForm::from(&record); + self.items_status = "Artikel gespeichert.".to_string(); + self.load_items(); + self.load_item_price_history(record.id); + } + Err(message) => self.items_status = message, + }, + AdminEvent::ItemPriceHistoryLoaded(result) => match result { + Ok(records) => self.item_price_history = records, + Err(message) => self.items_status = message, + }, + AdminEvent::ItemDeleted(result) => { + self.items_status = result + .map(|_| "Artikel deaktiviert.".to_string()) + .unwrap_or_else(|message| message); + self.load_items(); + } + AdminEvent::QuotesLoaded(result) => match result { + Ok(records) => { + self.quotes = records; + self.quotes_status = "Angebote geladen.".to_string(); + } + Err(message) => self.quotes_status = message, + }, + AdminEvent::QuoteSaved(result) => match result { + Ok(record) => { + self.selected_quote_id = Some(record.id.clone()); + self.quote_form = QuoteForm::from(&record); + self.quotes_status = "Angebot gespeichert.".to_string(); + self.load_quotes(); + } + Err(message) => self.quotes_status = message, + }, + AdminEvent::QuoteDeleted(result) => { + self.quotes_status = result + .map(|_| "Angebot storniert.".to_string()) + .unwrap_or_else(|message| message); + self.load_quotes(); + } + AdminEvent::OutgoingInvoicesLoaded(result) => match result { + Ok(records) => { + self.outgoing_invoices = records; + self.outgoing_invoices_status = "Ausgangsrechnungen geladen.".to_string(); + } + Err(message) => self.outgoing_invoices_status = message, + }, + AdminEvent::OutgoingInvoiceSaved(result) => match result { + Ok(record) => { + self.selected_outgoing_invoice_id = Some(record.id.clone()); + self.outgoing_invoice_form = OutgoingInvoiceForm::from(&record); + self.outgoing_invoices_status = "Ausgangsrechnung gespeichert.".to_string(); + self.load_outgoing_invoices(); + } + Err(message) => self.outgoing_invoices_status = message, + }, + AdminEvent::OutgoingInvoiceDeleted(result) => { + self.outgoing_invoices_status = result + .map(|_| "Ausgangsrechnung storniert.".to_string()) + .unwrap_or_else(|message| message); + self.load_outgoing_invoices(); + } + AdminEvent::OutgoingInvoiceFinalized(result) => { + self.outgoing_invoices_status = result + .map(|_| "Ausgangsrechnung abgeschlossen.".to_string()) + .unwrap_or_else(|message| message); + self.load_outgoing_invoices(); + } + AdminEvent::IncomingInvoicesLoaded(result) => match result { + Ok(records) => { + self.incoming_invoices = records; + self.incoming_invoices_status = "Eingangsrechnungen geladen.".to_string(); + } + Err(message) => self.incoming_invoices_status = message, + }, + AdminEvent::IncomingInvoiceSaved(result) => match result { + Ok(record) => { + self.selected_incoming_invoice_id = Some(record.id.clone()); + self.incoming_invoice_form = IncomingInvoiceForm::from(&record); + self.incoming_invoices_status = "Eingangsrechnung gespeichert.".to_string(); + self.load_incoming_invoices(); + } + Err(message) => self.incoming_invoices_status = message, + }, + AdminEvent::IncomingInvoiceDeleted(result) => { + self.incoming_invoices_status = result + .map(|_| "Eingangsrechnung storniert.".to_string()) + .unwrap_or_else(|message| message); + self.load_incoming_invoices(); + } + AdminEvent::ActivitiesLoaded(result) => match result { + Ok(records) => { + self.activities = records; + self.activities_status = "Aktivitäten geladen.".to_string(); + } + Err(message) => self.activities_status = message, + }, + AdminEvent::ActivitySaved(result) => match result { + Ok(record) => { + self.selected_activity_id = Some(record.id.clone()); + self.activity_form = ActivityForm::from(&record); + self.activities_status = "Aktivität gespeichert.".to_string(); + self.load_activities(); + } + Err(message) => self.activities_status = message, + }, + AdminEvent::ActivityDeleted(result) => { + self.activities_status = result + .map(|_| "Aktivität storniert.".to_string()) + .unwrap_or_else(|message| message); + self.load_activities(); + } + AdminEvent::PriceImportPreviewed(result) => match result { + Ok(preview) => { + self.price_import_status = format!( + "Vorschau: {} gültig, {} Fehler.", + preview.valid_rows, preview.error_rows + ); + self.price_import_preview = Some(preview); + } + Err(message) => self.price_import_status = message, + }, + AdminEvent::PriceImportApplied(result) => match result { + Ok(response) => { + self.price_import_status = format!( + "Import {}: {} Zeilen übernommen, {} Fehler.", + response.import_id, response.applied_rows, response.error_rows + ); + self.load_items(); + self.preview_price_import(); + } + Err(message) => self.price_import_status = message, + }, + AdminEvent::ApiConnectorsLoaded(result) => match result { + Ok(records) => { + self.api_connectors = records; + self.api_connectors_status = "Preis-APIs geladen.".to_string(); + } + Err(message) => self.api_connectors_status = message, + }, + AdminEvent::ApiConnectorSaved(result) => match result { + Ok(record) => { + self.selected_api_connector_id = Some(record.id.clone()); + self.api_connector_form = ApiConnectorForm::from(&record); + self.api_connectors_status = "Preis-API gespeichert.".to_string(); + self.load_api_connectors(); + } + Err(message) => self.api_connectors_status = message, + }, + AdminEvent::ApiConnectorDeleted(result) => { + self.api_connectors_status = result + .map(|_| "Preis-API deaktiviert.".to_string()) + .unwrap_or_else(|message| message); + self.load_api_connectors(); + } + AdminEvent::ApiConnectorSynced(result) => match result { + Ok(response) => { + self.api_connectors_status = format!( + "Abgleich {} ausgeführt: {} Zeilen übernommen, {} Fehler.", + &response.id[..response.id.len().min(8)], + response.applied_rows, + response.error_rows + ); + if !response.synced { + self.api_connectors_status = + "Abgleich wurde nicht bestätigt.".to_string(); + } + self.load_api_connectors(); + self.load_items(); + } + Err(message) => self.api_connectors_status = message, + }, + AdminEvent::PriceRulesLoaded(result) => match result { + Ok(records) => { + self.price_rules = records; + self.price_rules_status = "Preisregeln geladen.".to_string(); + } + Err(message) => self.price_rules_status = message, + }, + AdminEvent::PriceRuleSaved(result) => match result { + Ok(record) => { + self.selected_price_rule_id = Some(record.id.clone()); + self.price_rule_form = PriceRuleForm::from(&record); + self.price_rules_status = "Preisregel gespeichert.".to_string(); + self.load_price_rules(); + } + Err(message) => self.price_rules_status = message, + }, + AdminEvent::PriceRuleDeleted(result) => { + self.price_rules_status = result + .map(|_| "Preisregel deaktiviert.".to_string()) + .unwrap_or_else(|message| message); + self.load_price_rules(); + } + } + } + } + + fn submit_login(&mut self) { + let email = self.login_email.trim().to_string(); + let password = self.login_password.clone(); + + if !email.contains('@') { + self.login_status = "E-Mail-Adresse ist ungültig.".to_string(); + return; + } + + if password.is_empty() { + self.login_status = "Passwort fehlt.".to_string(); + return; + } + + self.login_pending = true; + self.login_status = "Melde an...".to_string(); + + let api_base_url = self.api_base_url.clone(); + let sender = self.login_sender.clone(); + + std::thread::spawn(move || { + let runtime = tokio::runtime::Runtime::new().expect("tokio runtime"); + runtime.block_on(async move { + let result = login_user(&api_base_url, email, password).await; + let _ = sender.send(result); + }); + }); + } + + fn logout(&mut self) { + self.authenticated_email = None; + self.access_token = None; + self.selected_organization_id = None; + self.navigation_mode = NavigationMode::Scroll; + self.navigation_settings_status.clear(); + self.login_password.clear(); + self.login_status = "Abgemeldet.".to_string(); + self.view = AppView::Login; + } + + fn load_user_navigation_settings(&mut self) { + let Some(token) = self.access_token.clone() else { + return; + }; + let base = self.api_base_url.clone(); + let sender = self.admin_sender.clone(); + std::thread::spawn(move || { + let rt = tokio::runtime::Runtime::new().expect("tokio runtime"); + rt.block_on(async move { + let result = get_user_navigation_settings(&base, &token).await; + let _ = sender.send(AdminEvent::NavigationSettingsLoaded(result)); + }); + }); + } + + fn save_navigation_mode(&mut self, mode: NavigationMode) { + let Some(token) = self.access_token.clone() else { + return; + }; + self.navigation_mode = mode; + self.navigation_settings_status = "Speichere Menü...".to_string(); + let base = self.api_base_url.clone(); + let sender = self.admin_sender.clone(); + std::thread::spawn(move || { + let rt = tokio::runtime::Runtime::new().expect("tokio runtime"); + rt.block_on(async move { + let result = + put_user_navigation_settings(&base, &token, UserNavigationSettings { mode }) + .await; + let _ = sender.send(AdminEvent::NavigationSettingsSaved(result)); + }); + }); + } + + fn submit_dev_bootstrap(&mut self) { + let organization_name = self.dev_organization_name.trim().to_string(); + let email = self.dev_email.trim().to_string(); + + if organization_name.len() < 2 { + self.dev_status = "Firmenname ist zu kurz.".to_string(); + return; + } + if !email.contains('@') { + self.dev_status = "E-Mail-Adresse ist ungültig.".to_string(); + return; + } + + self.dev_pending = true; + self.dev_status = "Lege lokale Testfirma an...".to_string(); + self.dev_credentials = None; + + let api_base_url = self.api_base_url.clone(); + let sender = self.dev_bootstrap_sender.clone(); + + std::thread::spawn(move || { + let runtime = tokio::runtime::Runtime::new().expect("tokio runtime"); + runtime.block_on(async move { + let result = dev_bootstrap_local(&api_base_url, organization_name, email).await; + let _ = sender.send(result); + }); + }); + } + + fn submit_registration(&mut self) { + let organization_name = self.organization_name.trim().to_string(); + let email = self.registration_email.trim().to_string(); + + if organization_name.len() < 2 { + self.registration_status = "Firmenname ist zu kurz.".to_string(); + return; + } + + if !email.contains('@') { + self.registration_status = "E-Mail-Adresse ist ungültig.".to_string(); + return; + } + + if !self.accept_terms { + self.registration_status = "Nutzungsbedingungen müssen akzeptiert werden.".to_string(); + return; + } + + self.registration_pending = true; + self.registration_status = "Sende Registrierung...".to_string(); + + let api_base_url = self.api_base_url.clone(); + let sender = self.registration_sender.clone(); + let accept_terms = self.accept_terms; + + std::thread::spawn(move || { + let runtime = tokio::runtime::Runtime::new().expect("tokio runtime"); + runtime.block_on(async move { + let result = + register_organization(&api_base_url, organization_name, email, accept_terms) + .await; + let _ = sender.send(result); + }); + }); + } + + fn load_users(&mut self) { + self.users_pending = true; + self.users_status = "Lade Benutzer...".to_string(); + let Some(access_token) = self.access_token.clone() else { + self.users_status = "Anmeldung erforderlich.".to_string(); + return; + }; + let api_base_url = self.api_base_url.clone(); + let sender = self.user_admin_sender.clone(); + + std::thread::spawn(move || { + let runtime = tokio::runtime::Runtime::new().expect("tokio runtime"); + runtime.block_on(async move { + let result = list_users(&api_base_url, &access_token).await; + let _ = sender.send(UserAdminEvent::UsersLoaded(result)); + }); + }); + } + + fn invite_user(&mut self) { + let email = self.invite_email.trim().to_string(); + if !email.contains('@') { + self.users_status = "E-Mail-Adresse ist ungültig.".to_string(); + return; + } + + self.users_pending = true; + self.users_status = "Sende Einladung...".to_string(); + let Some(access_token) = self.access_token.clone() else { + self.users_status = "Anmeldung erforderlich.".to_string(); + return; + }; + let api_base_url = self.api_base_url.clone(); + let roles = normalized_roles(&self.invite_roles); + let sender = self.user_admin_sender.clone(); + + std::thread::spawn(move || { + let runtime = tokio::runtime::Runtime::new().expect("tokio runtime"); + runtime.block_on(async move { + let result = invite_organization_user(&api_base_url, &access_token, email, roles) + .await + .map(|_| "Einladung angelegt.".to_string()); + let _ = sender.send(UserAdminEvent::InvitationSent(result)); + }); + }); + } + + fn save_user_roles(&mut self, user_id: String, roles: Vec) { + self.saving_user_id = Some(user_id.clone()); + self.users_status = "Speichere Benutzerrechte...".to_string(); + let Some(access_token) = self.access_token.clone() else { + self.users_status = "Anmeldung erforderlich.".to_string(); + return; + }; + let api_base_url = self.api_base_url.clone(); + let sender = self.user_admin_sender.clone(); + + std::thread::spawn(move || { + let runtime = tokio::runtime::Runtime::new().expect("tokio runtime"); + runtime.block_on(async move { + let result = update_user_roles( + &api_base_url, + &access_token, + &user_id, + normalized_roles(&roles), + ) + .await; + let _ = sender.send(UserAdminEvent::RolesSaved { user_id, result }); + }); + }); + } + + fn save_organization_setup(&mut self) { + self.organization_setup_pending = true; + self.organization_setup_status = "Speichere Firmendaten...".to_string(); + let Some(access_token) = self.access_token.clone() else { + self.organization_setup_pending = false; + self.organization_setup_status = "Anmeldung erforderlich.".to_string(); + return; + }; + let api_base_url = self.api_base_url.clone(); + let payload = self.organization_setup.clone(); + let sender = self.admin_sender.clone(); + + std::thread::spawn(move || { + let runtime = tokio::runtime::Runtime::new().expect("tokio runtime"); + runtime.block_on(async move { + let result = save_organization_setup(&api_base_url, &access_token, payload).await; + let _ = sender.send(AdminEvent::OrganizationSetupSaved(result)); + }); + }); + } + + fn load_organization_setup(&mut self) { + self.organization_setup_pending = true; + self.organization_setup_status = "Lade Firmendaten...".to_string(); + let Some(access_token) = self.access_token.clone() else { + self.organization_setup_pending = false; + self.organization_setup_status = "Anmeldung erforderlich.".to_string(); + return; + }; + let api_base_url = self.api_base_url.clone(); + let sender = self.admin_sender.clone(); + + std::thread::spawn(move || { + let runtime = tokio::runtime::Runtime::new().expect("tokio runtime"); + runtime.block_on(async move { + let result = load_organization_setup(&api_base_url, &access_token).await; + let _ = sender.send(AdminEvent::OrganizationSetupLoaded(result)); + }); + }); + } + + fn load_registrations(&mut self) { + self.registrations_pending = true; + self.registrations_status = "Lade Registrierungen...".to_string(); + let api_base_url = self.api_base_url.clone(); + let sender = self.admin_sender.clone(); + + std::thread::spawn(move || { + let runtime = tokio::runtime::Runtime::new().expect("tokio runtime"); + runtime.block_on(async move { + let result = list_registrations(&api_base_url).await; + let _ = sender.send(AdminEvent::RegistrationsLoaded(result)); + }); + }); + } + + fn approve_registration(&mut self, registration_id: String) { + self.registrations_pending = true; + self.registrations_status = "Schalte Registrierung frei...".to_string(); + let api_base_url = self.api_base_url.clone(); + let sender = self.admin_sender.clone(); + + std::thread::spawn(move || { + let runtime = tokio::runtime::Runtime::new().expect("tokio runtime"); + runtime.block_on(async move { + let result = approve_registration(&api_base_url, ®istration_id) + .await + .map(|response| { + format!( + "Freigeschaltet. Initialpasswort: {}", + response.dev_initial_password + ) + }); + let _ = sender.send(AdminEvent::RegistrationActionDone(result)); + }); + }); + } + + fn load_customers(&mut self) { + self.customers_pending = true; + let Some(access_token) = self.access_token.clone() else { + self.customers_status = "Anmeldung erforderlich.".to_string(); + self.customers_pending = false; + return; + }; + let api_base_url = self.api_base_url.clone(); + let sender = self.admin_sender.clone(); + std::thread::spawn(move || { + let runtime = tokio::runtime::Runtime::new().expect("tokio runtime"); + runtime.block_on(async move { + let result = list_customers(&api_base_url, &access_token).await; + let _ = sender.send(AdminEvent::CustomersLoaded(result)); + }); + }); + } + + fn new_customer(&mut self) { + self.selected_customer_id = None; + self.customer_form = CustomerForm::default(); + self.customers_status = "Kundennummer wird reserviert.".to_string(); + self.reserve_next_number("customers"); + } + + fn save_customer(&mut self) { + self.customers_pending = true; + let Some(access_token) = self.access_token.clone() else { + self.customers_status = "Anmeldung erforderlich.".to_string(); + self.customers_pending = false; + return; + }; + let api_base_url = self.api_base_url.clone(); + let customer_id = self.selected_customer_id.clone(); + let form = self.customer_form.clone(); + let sender = self.admin_sender.clone(); + std::thread::spawn(move || { + let runtime = tokio::runtime::Runtime::new().expect("tokio runtime"); + runtime.block_on(async move { + let result = save_customer(&api_base_url, &access_token, customer_id, form).await; + let _ = sender.send(AdminEvent::CustomerSaved(result)); + }); + }); + } + + fn deactivate_customer(&mut self) { + let Some(customer_id) = self.selected_customer_id.clone() else { + return; + }; + let Some(access_token) = self.access_token.clone() else { + self.customers_status = "Anmeldung erforderlich.".to_string(); + return; + }; + self.customers_pending = true; + let api_base_url = self.api_base_url.clone(); + let sender = self.admin_sender.clone(); + std::thread::spawn(move || { + let runtime = tokio::runtime::Runtime::new().expect("tokio runtime"); + runtime.block_on(async move { + let result = delete_customer(&api_base_url, &access_token, &customer_id).await; + let _ = sender.send(AdminEvent::CustomerDeleted(result)); + }); + }); + } + + fn load_suppliers(&mut self) { + self.spawn_master_load("/api/v1/suppliers", |result| { + AdminEvent::SuppliersLoaded(result) + }); + } + + fn load_number_ranges(&mut self) { + self.spawn_master_load("/api/v1/number-ranges", |result| { + AdminEvent::NumberRangesLoaded(result) + }); + } + + fn load_cash_discount_terms(&mut self) { + self.spawn_master_load("/api/v1/cash-discount-terms", |result| { + AdminEvent::CashDiscountTermsLoaded(result) + }); + } + + fn load_items(&mut self) { + self.spawn_master_load("/api/v1/items", |result| AdminEvent::ItemsLoaded(result)); + } + + fn load_item_price_history(&mut self, item_id: String) { + let path = format!("/api/v1/items/{item_id}/prices"); + self.spawn_owned_master_load(path, |result| AdminEvent::ItemPriceHistoryLoaded(result)); + } + + fn load_activities(&mut self) { + self.spawn_master_load("/api/v1/activities", |result| { + AdminEvent::ActivitiesLoaded(result) + }); + } + + fn load_quotes(&mut self) { + self.spawn_master_load("/api/v1/quotes", |result| AdminEvent::QuotesLoaded(result)); + } + + fn load_outgoing_invoices(&mut self) { + self.spawn_master_load("/api/v1/outgoing-invoices", |result| { + AdminEvent::OutgoingInvoicesLoaded(result) + }); + } + + fn load_incoming_invoices(&mut self) { + self.spawn_master_load("/api/v1/incoming-invoices", |result| { + AdminEvent::IncomingInvoicesLoaded(result) + }); + } + + fn reserve_next_number(&mut self, code: &'static str) { + let Some(access_token) = self.access_token.clone() else { + self.set_number_status(code, "Anmeldung erforderlich.".to_string()); + return; + }; + let api_base_url = self.api_base_url.clone(); + let sender = self.admin_sender.clone(); + std::thread::spawn(move || { + let runtime = tokio::runtime::Runtime::new().expect("tokio runtime"); + runtime.block_on(async move { + let result = reserve_next_number(&api_base_url, &access_token, code).await; + let _ = sender.send(AdminEvent::NextNumberReserved { + code: code.to_string(), + result, + }); + }); + }); + } + + fn apply_reserved_number(&mut self, code: &str, number: String) { + match code { + "customers" => { + if self.selected_customer_id.is_none() { + self.customer_form.customer_number = number; + self.customers_status = "Neue Kundennummer reserviert.".to_string(); + } + } + "suppliers" => { + if self.selected_supplier_id.is_none() { + self.supplier_form.supplier_number = number; + self.suppliers_status = "Neue Lieferantennummer reserviert.".to_string(); + } + } + "items" => { + if self.selected_item_id.is_none() { + self.item_form.item_number = number; + self.items_status = "Neue Artikelnummer reserviert.".to_string(); + } + } + "activities" => { + if self.selected_activity_id.is_none() { + self.activity_form.activity_number = Some(number); + self.activities_status = "Neue Aktivitätsnummer reserviert.".to_string(); + } + } + "quotes" => { + if self.selected_quote_id.is_none() { + self.quote_form.quote_number = number; + self.quotes_status = "Neue Angebotsnummer reserviert.".to_string(); + } + } + "outgoing_invoices" => { + if self.selected_outgoing_invoice_id.is_none() { + self.outgoing_invoice_form.invoice_number = number; + self.outgoing_invoices_status = "Neue Rechnungsnummer reserviert.".to_string(); + } + } + "incoming_invoices" => { + if self.selected_incoming_invoice_id.is_none() { + self.incoming_invoice_form.invoice_number = number; + self.incoming_invoices_status = + "Neue Eingangsrechnungsnummer reserviert.".to_string(); + } + } + _ => {} + } + } + + fn set_number_status(&mut self, code: &str, message: String) { + match code { + "customers" => self.customers_status = message, + "suppliers" => self.suppliers_status = message, + "items" => self.items_status = message, + "activities" => self.activities_status = message, + "quotes" => self.quotes_status = message, + "outgoing_invoices" => self.outgoing_invoices_status = message, + "incoming_invoices" => self.incoming_invoices_status = message, + _ => self.number_ranges_status = message, + } + } + + fn load_api_connectors(&mut self) { + self.spawn_master_load("/api/v1/api-connectors", |result| { + AdminEvent::ApiConnectorsLoaded(result) + }); + } + + fn load_price_rules(&mut self) { + self.spawn_master_load("/api/v1/price-rules", |result| { + AdminEvent::PriceRulesLoaded(result) + }); + } + + fn spawn_master_load(&mut self, path: &'static str, event: F) + where + T: for<'de> Deserialize<'de> + Send + 'static, + F: FnOnce(Result, String>) -> AdminEvent + Send + 'static, + { + let Some(access_token) = self.access_token.clone() else { + return; + }; + let api_base_url = self.api_base_url.clone(); + let sender = self.admin_sender.clone(); + std::thread::spawn(move || { + let runtime = tokio::runtime::Runtime::new().expect("tokio runtime"); + runtime.block_on(async move { + let result = list_master_records(&api_base_url, &access_token, path).await; + let _ = sender.send(event(result)); + }); + }); + } + + fn spawn_owned_master_load(&mut self, path: String, event: F) + where + T: for<'de> Deserialize<'de> + Send + 'static, + F: FnOnce(Result, String>) -> AdminEvent + Send + 'static, + { + let Some(access_token) = self.access_token.clone() else { + return; + }; + let api_base_url = self.api_base_url.clone(); + let sender = self.admin_sender.clone(); + std::thread::spawn(move || { + let runtime = tokio::runtime::Runtime::new().expect("tokio runtime"); + runtime.block_on(async move { + let result = list_master_records(&api_base_url, &access_token, &path).await; + let _ = sender.send(event(result)); + }); + }); + } + + fn save_supplier(&mut self) { + let Some(token) = self.access_token.clone() else { + return; + }; + let base = self.api_base_url.clone(); + let id = self.selected_supplier_id.clone(); + let form = self.supplier_form.clone(); + let sender = self.admin_sender.clone(); + std::thread::spawn(move || { + let rt = tokio::runtime::Runtime::new().expect("tokio runtime"); + rt.block_on(async move { + let _ = sender.send(AdminEvent::SupplierSaved( + save_master_record(&base, &token, "/api/v1/suppliers", id, form).await, + )); + }); + }); + } + + fn save_cash_discount_term(&mut self) { + let Some(token) = self.access_token.clone() else { + return; + }; + let base = self.api_base_url.clone(); + let id = self.selected_cash_discount_term_id.clone(); + let form = self.cash_discount_term_form.clone(); + let sender = self.admin_sender.clone(); + std::thread::spawn(move || { + let rt = tokio::runtime::Runtime::new().expect("tokio runtime"); + rt.block_on(async move { + let _ = sender.send(AdminEvent::CashDiscountTermSaved( + save_master_record(&base, &token, "/api/v1/cash-discount-terms", id, form) + .await, + )); + }); + }); + } + + fn save_number_range(&mut self) { + let Some(token) = self.access_token.clone() else { + return; + }; + let Some(code) = self.selected_number_range_code.clone() else { + return; + }; + let base = self.api_base_url.clone(); + let form = self.number_range_form.clone(); + let sender = self.admin_sender.clone(); + std::thread::spawn(move || { + let rt = tokio::runtime::Runtime::new().expect("tokio runtime"); + rt.block_on(async move { + let path = format!("/api/v1/number-ranges/{code}"); + let _ = sender.send(AdminEvent::NumberRangeSaved( + save_master_record_without_id(&base, &token, &path, form).await, + )); + }); + }); + } + + fn save_item(&mut self) { + let Some(token) = self.access_token.clone() else { + return; + }; + let base = self.api_base_url.clone(); + let id = self.selected_item_id.clone(); + let form = self.item_form.clone(); + let sender = self.admin_sender.clone(); + std::thread::spawn(move || { + let rt = tokio::runtime::Runtime::new().expect("tokio runtime"); + rt.block_on(async move { + let _ = sender.send(AdminEvent::ItemSaved( + save_master_record(&base, &token, "/api/v1/items", id, form).await, + )); + }); + }); + } + + fn save_activity(&mut self) { + let Some(token) = self.access_token.clone() else { + return; + }; + let base = self.api_base_url.clone(); + let id = self.selected_activity_id.clone(); + let form = self.activity_form.clone(); + let sender = self.admin_sender.clone(); + std::thread::spawn(move || { + let rt = tokio::runtime::Runtime::new().expect("tokio runtime"); + rt.block_on(async move { + let _ = sender.send(AdminEvent::ActivitySaved( + save_master_record(&base, &token, "/api/v1/activities", id, form).await, + )); + }); + }); + } + + fn preview_price_import(&mut self) { + let Some(token) = self.access_token.clone() else { + self.price_import_status = "Anmeldung erforderlich.".to_string(); + return; + }; + let base = self.api_base_url.clone(); + let form = self.price_import_form.clone(); + let sender = self.admin_sender.clone(); + self.price_import_status = "Prüfe Preisliste...".to_string(); + std::thread::spawn(move || { + let rt = tokio::runtime::Runtime::new().expect("tokio runtime"); + rt.block_on(async move { + let _ = sender.send(AdminEvent::PriceImportPreviewed( + post_master_record(&base, &token, "/api/v1/imports/price-list/preview", form) + .await, + )); + }); + }); + } + + fn apply_price_import(&mut self) { + let Some(token) = self.access_token.clone() else { + self.price_import_status = "Anmeldung erforderlich.".to_string(); + return; + }; + let base = self.api_base_url.clone(); + let form = self.price_import_form.clone(); + let sender = self.admin_sender.clone(); + self.price_import_status = "Importiere Preisliste...".to_string(); + std::thread::spawn(move || { + let rt = tokio::runtime::Runtime::new().expect("tokio runtime"); + rt.block_on(async move { + let _ = sender.send(AdminEvent::PriceImportApplied( + post_master_record(&base, &token, "/api/v1/imports/price-list/apply", form) + .await, + )); + }); + }); + } + + fn save_api_connector(&mut self) { + let Some(token) = self.access_token.clone() else { + self.api_connectors_status = "Anmeldung erforderlich.".to_string(); + return; + }; + let Ok(payload) = self.api_connector_form.payload() else { + self.api_connectors_status = "Konfiguration ist kein gültiges JSON.".to_string(); + return; + }; + let base = self.api_base_url.clone(); + let id = self.selected_api_connector_id.clone(); + let sender = self.admin_sender.clone(); + self.api_connectors_status = "Speichere Preis-API...".to_string(); + std::thread::spawn(move || { + let rt = tokio::runtime::Runtime::new().expect("tokio runtime"); + rt.block_on(async move { + let _ = sender.send(AdminEvent::ApiConnectorSaved( + save_master_record(&base, &token, "/api/v1/api-connectors", id, payload).await, + )); + }); + }); + } + + fn sync_api_connector(&mut self) { + let Some(token) = self.access_token.clone() else { + self.api_connectors_status = "Anmeldung erforderlich.".to_string(); + return; + }; + let Some(id) = self.selected_api_connector_id.clone() else { + return; + }; + let base = self.api_base_url.clone(); + let sender = self.admin_sender.clone(); + self.api_connectors_status = "Führe Preisabgleich aus...".to_string(); + std::thread::spawn(move || { + let rt = tokio::runtime::Runtime::new().expect("tokio runtime"); + rt.block_on(async move { + let path = format!("/api/v1/api-connectors/{id}/sync"); + let _ = sender.send(AdminEvent::ApiConnectorSynced( + post_master_record(&base, &token, &path, serde_json::json!({})).await, + )); + }); + }); + } + + fn save_price_rule(&mut self) { + let Some(token) = self.access_token.clone() else { + self.price_rules_status = "Anmeldung erforderlich.".to_string(); + return; + }; + let base = self.api_base_url.clone(); + let id = self.selected_price_rule_id.clone(); + let mut form = self.price_rule_form.clone(); + if form + .source_id + .as_deref() + .is_some_and(|value| value.trim().is_empty()) + { + form.source_id = None; + } + let sender = self.admin_sender.clone(); + self.price_rules_status = "Speichere Preisregel...".to_string(); + std::thread::spawn(move || { + let rt = tokio::runtime::Runtime::new().expect("tokio runtime"); + rt.block_on(async move { + let _ = sender.send(AdminEvent::PriceRuleSaved( + save_master_record(&base, &token, "/api/v1/price-rules", id, form).await, + )); + }); + }); + } + + fn save_quote(&mut self) { + let Some(token) = self.access_token.clone() else { + return; + }; + let base = self.api_base_url.clone(); + let id = self.selected_quote_id.clone(); + let form = self.quote_form.clone(); + let sender = self.admin_sender.clone(); + std::thread::spawn(move || { + let rt = tokio::runtime::Runtime::new().expect("tokio runtime"); + rt.block_on(async move { + let _ = sender.send(AdminEvent::QuoteSaved( + save_master_record(&base, &token, "/api/v1/quotes", id, form).await, + )); + }); + }); + } + + fn save_outgoing_invoice(&mut self) { + let Some(token) = self.access_token.clone() else { + return; + }; + let base = self.api_base_url.clone(); + let id = self.selected_outgoing_invoice_id.clone(); + let form = self.outgoing_invoice_form.clone(); + let sender = self.admin_sender.clone(); + std::thread::spawn(move || { + let rt = tokio::runtime::Runtime::new().expect("tokio runtime"); + rt.block_on(async move { + let _ = sender.send(AdminEvent::OutgoingInvoiceSaved( + save_master_record(&base, &token, "/api/v1/outgoing-invoices", id, form).await, + )); + }); + }); + } + + fn save_incoming_invoice(&mut self) { + let Some(token) = self.access_token.clone() else { + return; + }; + let base = self.api_base_url.clone(); + let id = self.selected_incoming_invoice_id.clone(); + let form = self.incoming_invoice_form.clone(); + let sender = self.admin_sender.clone(); + std::thread::spawn(move || { + let rt = tokio::runtime::Runtime::new().expect("tokio runtime"); + rt.block_on(async move { + let _ = sender.send(AdminEvent::IncomingInvoiceSaved( + save_master_record(&base, &token, "/api/v1/incoming-invoices", id, form).await, + )); + }); + }); + } + + fn delete_supplier(&mut self) { + if let Some(id) = self.selected_supplier_id.clone() { + self.spawn_master_delete("/api/v1/suppliers", id, AdminEvent::SupplierDeleted); + } + } + fn delete_cash_discount_term(&mut self) { + if let Some(id) = self.selected_cash_discount_term_id.clone() { + self.spawn_master_delete( + "/api/v1/cash-discount-terms", + id, + AdminEvent::CashDiscountTermDeleted, + ); + } + } + fn delete_item(&mut self) { + if let Some(id) = self.selected_item_id.clone() { + self.spawn_master_delete("/api/v1/items", id, AdminEvent::ItemDeleted); + } + } + fn delete_quote(&mut self) { + if let Some(id) = self.selected_quote_id.clone() { + self.spawn_master_delete("/api/v1/quotes", id, AdminEvent::QuoteDeleted); + } + } + fn delete_outgoing_invoice(&mut self) { + if let Some(id) = self.selected_outgoing_invoice_id.clone() { + self.spawn_master_delete( + "/api/v1/outgoing-invoices", + id, + AdminEvent::OutgoingInvoiceDeleted, + ); + } + } + fn finalize_outgoing_invoice(&mut self) { + let Some(token) = self.access_token.clone() else { + return; + }; + let Some(id) = self.selected_outgoing_invoice_id.clone() else { + return; + }; + let base = self.api_base_url.clone(); + let sender = self.admin_sender.clone(); + std::thread::spawn(move || { + let rt = tokio::runtime::Runtime::new().expect("tokio runtime"); + rt.block_on(async move { + let path = format!("/api/v1/outgoing-invoices/{id}/finalize"); + let _ = sender.send(AdminEvent::OutgoingInvoiceFinalized( + post_empty_action(&base, &token, &path).await, + )); + }); + }); + } + fn delete_incoming_invoice(&mut self) { + if let Some(id) = self.selected_incoming_invoice_id.clone() { + self.spawn_master_delete( + "/api/v1/incoming-invoices", + id, + AdminEvent::IncomingInvoiceDeleted, + ); + } + } + fn delete_activity(&mut self) { + if let Some(id) = self.selected_activity_id.clone() { + self.spawn_master_delete("/api/v1/activities", id, AdminEvent::ActivityDeleted); + } + } + fn delete_api_connector(&mut self) { + if let Some(id) = self.selected_api_connector_id.clone() { + self.spawn_master_delete( + "/api/v1/api-connectors", + id, + AdminEvent::ApiConnectorDeleted, + ); + } + } + fn delete_price_rule(&mut self) { + if let Some(id) = self.selected_price_rule_id.clone() { + self.spawn_master_delete("/api/v1/price-rules", id, AdminEvent::PriceRuleDeleted); + } + } + + fn open_dashboard(&mut self) { + self.view = AppView::Status; + } + + fn open_outgoing_invoices_window(&mut self) { + self.restore_window("outgoing_invoices"); + self.outgoing_invoices_window_open = true; + self.load_outgoing_invoices(); + self.load_customers(); + self.load_items(); + } + + fn open_quotes_window(&mut self) { + self.restore_window("quotes"); + self.quotes_window_open = true; + self.load_quotes(); + self.load_customers(); + self.load_items(); + } + + fn open_incoming_invoices_window(&mut self) { + self.restore_window("incoming_invoices"); + self.incoming_invoices_window_open = true; + self.load_incoming_invoices(); + self.load_suppliers(); + self.load_items(); + } + + fn open_customers_window(&mut self) { + self.restore_window("customers"); + self.customers_window_open = true; + self.load_customers(); + self.load_cash_discount_terms(); + } + + fn open_suppliers_window(&mut self) { + self.restore_window("suppliers"); + self.suppliers_window_open = true; + self.load_suppliers(); + self.load_cash_discount_terms(); + } + + fn open_items_window(&mut self) { + self.restore_window("items"); + self.items_window_open = true; + self.load_items(); + } + + fn open_activities_window(&mut self) { + self.restore_window("activities"); + self.activities_window_open = true; + self.load_activities(); + } + + fn open_price_import_window(&mut self) { + self.restore_window("price_imports"); + self.price_import_window_open = true; + } + + fn open_price_rules_window(&mut self) { + self.restore_window("price_rules"); + self.price_rules_window_open = true; + self.load_price_rules(); + } + + fn open_api_connectors_window(&mut self) { + self.restore_window("api_connectors"); + self.api_connectors_window_open = true; + self.load_api_connectors(); + } + + fn open_organization_setup_window(&mut self) { + self.restore_window("organization_setup"); + self.organization_setup_window_open = true; + self.load_organization_setup(); + } + + fn open_users_window(&mut self) { + self.restore_window("users"); + self.users_window_open = true; + if self.users.is_empty() { + self.load_users(); + } + } + + fn open_number_ranges_window(&mut self) { + self.restore_window("number_ranges"); + self.number_ranges_window_open = true; + self.load_number_ranges(); + } + + fn open_cash_discount_terms_window(&mut self) { + self.restore_window("cash_discount_terms"); + self.cash_discount_terms_window_open = true; + self.load_cash_discount_terms(); + } + + fn open_admin_registrations_window(&mut self) { + self.restore_window("admin_registrations"); + self.admin_registrations_window_open = true; + if self.registrations.is_empty() { + self.load_registrations(); + } + } + + fn minimize_window(&mut self, key: &'static str) { + self.minimized_windows.insert(key); + } + + fn restore_window(&mut self, key: &'static str) { + self.minimized_windows.remove(key); + } + + fn window_is_minimized(&self, key: &'static str) -> bool { + self.minimized_windows.contains(key) + } + + fn clear_minimized_if_closed(&mut self, key: &'static str, open: bool) { + if !open { + self.minimized_windows.remove(key); + } + } + + fn nav_dropdown( + &mut self, + ui: &mut egui::Ui, + label: &str, + items: &[(&str, fn(&mut CompanyToolApp))], + add_top_space: bool, + ) { + if add_top_space { + ui.add_space(12.0); + } + ui.scope(|ui| { + let visuals = ui.visuals_mut(); + visuals.widgets.inactive.bg_fill = accent_soft_color(); + visuals.widgets.inactive.fg_stroke = egui::Stroke::new(1.0, accent_dark_color()); + visuals.widgets.hovered.bg_fill = egui::Color32::from_rgb(199, 235, 230); + visuals.widgets.hovered.fg_stroke = egui::Stroke::new(1.0, accent_dark_color()); + visuals.widgets.active.bg_fill = accent_soft_color(); + visuals.widgets.active.fg_stroke = egui::Stroke::new(1.0, accent_dark_color()); + visuals.widgets.open.bg_fill = accent_soft_color(); + visuals.widgets.open.fg_stroke = egui::Stroke::new(1.0, accent_dark_color()); + ui.set_min_width(200.0); + ui.menu_button( + egui::RichText::new(label) + .color(accent_dark_color()) + .strong(), + |ui| { + let visuals = ui.visuals_mut(); + visuals.widgets.inactive.bg_fill = surface_color(); + visuals.widgets.inactive.fg_stroke = + egui::Stroke::new(1.0, accent_dark_color()); + visuals.widgets.hovered.bg_fill = accent_soft_color(); + visuals.widgets.hovered.fg_stroke = egui::Stroke::new(1.0, accent_dark_color()); + visuals.widgets.active.bg_fill = accent_color(); + visuals.widgets.active.fg_stroke = egui::Stroke::new(1.0, egui::Color32::WHITE); + ui.set_min_width(220.0); + for (item_label, action) in items { + let (rect, response) = ui.allocate_exact_size( + egui::vec2(ui.available_width(), 24.0), + egui::Sense::click(), + ); + let active = response.hovered() || response.has_focus(); + let bg = if active { + accent_dark_color() + } else { + surface_color() + }; + let fg = if active { + egui::Color32::WHITE + } else { + accent_dark_color() + }; + ui.painter().rect_filled(rect, 4.0, bg); + ui.painter().text( + rect.left_center() + egui::vec2(8.0, 0.0), + egui::Align2::LEFT_CENTER, + *item_label, + egui::FontId::proportional(13.0), + fg, + ); + if response.clicked() { + action(self); + ui.close_menu(); + } + } + }, + ); + }); + } + + fn render_taskbar(&mut self, ui: &mut egui::Ui) { + ui.horizontal_wrapped(|ui| { + self.taskbar_button(ui, "users", self.users_window_open, "Benutzerrechte"); + self.taskbar_button( + ui, + "organization_setup", + self.organization_setup_window_open, + "Firmendaten", + ); + self.taskbar_button( + ui, + "number_ranges", + self.number_ranges_window_open, + "Nummernkreise", + ); + self.taskbar_button( + ui, + "admin_registrations", + self.admin_registrations_window_open, + "Freischaltung", + ); + self.taskbar_button(ui, "customers", self.customers_window_open, "Kunden"); + self.taskbar_button(ui, "suppliers", self.suppliers_window_open, "Lieferanten"); + self.taskbar_button(ui, "items", self.items_window_open, "Artikel"); + self.taskbar_button( + ui, + "price_imports", + self.price_import_window_open, + "Preislisten", + ); + self.taskbar_button( + ui, + "api_connectors", + self.api_connectors_window_open, + "Preis-APIs", + ); + self.taskbar_button( + ui, + "price_rules", + self.price_rules_window_open, + "Preisregeln", + ); + self.taskbar_button( + ui, + "cash_discount_terms", + self.cash_discount_terms_window_open, + "Skonto", + ); + self.taskbar_button(ui, "quotes", self.quotes_window_open, "Angebote"); + self.taskbar_button( + ui, + "outgoing_invoices", + self.outgoing_invoices_window_open, + "Ausgangsrechnungen", + ); + self.taskbar_button( + ui, + "incoming_invoices", + self.incoming_invoices_window_open, + "Eingangsrechnungen", + ); + self.taskbar_button(ui, "activities", self.activities_window_open, "Aktivitäten"); + }); + } + + fn taskbar_button(&mut self, ui: &mut egui::Ui, key: &'static str, open: bool, label: &str) { + if !open { + return; + } + let minimized = self.window_is_minimized(key); + let button = egui::Button::new( + egui::RichText::new(label) + .color(if minimized { + accent_dark_color() + } else { + egui::Color32::WHITE + }) + .size(12.0) + .strong(), + ) + .fill(if minimized { + accent_soft_color() + } else { + accent_dark_color() + }) + .rounding(6.0); + if ui.add_sized([170.0, 30.0], button).clicked() { + self.restore_window(key); + } + } + + fn spawn_master_delete(&mut self, path: &'static str, id: String, event: F) + where + F: FnOnce(EmptyResult) -> AdminEvent + Send + 'static, + { + let Some(token) = self.access_token.clone() else { + return; + }; + let base = self.api_base_url.clone(); + let sender = self.admin_sender.clone(); + std::thread::spawn(move || { + let rt = tokio::runtime::Runtime::new().expect("tokio runtime"); + rt.block_on(async move { + let _ = sender.send(event(delete_master_record(&base, &token, path, &id).await)); + }); + }); + } +} + +impl eframe::App for CompanyToolApp { + fn update(&mut self, ctx: &egui::Context, _: &mut eframe::Frame) { + apply_app_style(ctx); + self.drain_messages(); + ctx.request_repaint_after(std::time::Duration::from_millis(250)); + + egui::SidePanel::left("navigation") + .exact_width(244.0) + .frame(egui::Frame::side_top_panel(&ctx.style()).fill(surface_color())) + .show(ctx, |ui| { + ui.add_space(10.0); + brand(ui, self.logo_texture.as_ref()); + ui.add_space(20.0); + + let nav_height = if self.authenticated_email.is_some() { + (ui.available_height() - 170.0).max(180.0) + } else { + ui.available_height() + }; + let nav_button_height = self.navigation_mode.button_height(); + + egui::ScrollArea::vertical() + .id_salt("navigation_menu") + .max_height(nav_height) + .auto_shrink([false, false]) + .show(ui, |ui| { + if self.authenticated_email.is_some() { + if self.navigation_mode == NavigationMode::Groups { + self.nav_dropdown( + ui, + "Vorgänge", + &[ + ("Dashboard", CompanyToolApp::open_dashboard), + ( + "Ausgangsrechnungen", + CompanyToolApp::open_outgoing_invoices_window, + ), + ("Angebote", CompanyToolApp::open_quotes_window), + ( + "Eingangsrechnungen", + CompanyToolApp::open_incoming_invoices_window, + ), + ], + false, + ); + self.nav_dropdown( + ui, + "Stammdaten", + &[ + ("Kunden", CompanyToolApp::open_customers_window), + ("Lieferanten", CompanyToolApp::open_suppliers_window), + ("Artikel", CompanyToolApp::open_items_window), + ("Aktivitäten", CompanyToolApp::open_activities_window), + ], + true, + ); + self.nav_dropdown( + ui, + "Arbeitsdaten", + &[("Preislisten", CompanyToolApp::open_price_import_window)], + true, + ); + self.nav_dropdown( + ui, + "Einstellungen", + &[ + ("Preisregeln", CompanyToolApp::open_price_rules_window), + ("Preis-APIs", CompanyToolApp::open_api_connectors_window), + ( + "Firmendaten", + CompanyToolApp::open_organization_setup_window, + ), + ("Benutzerrechte", CompanyToolApp::open_users_window), + ( + "Nummernkreise", + CompanyToolApp::open_number_ranges_window, + ), + ("Skonto", CompanyToolApp::open_cash_discount_terms_window), + ( + "Freischaltung", + CompanyToolApp::open_admin_registrations_window, + ), + ], + true, + ); + } else { + nav_group_label(ui, "Vorgänge"); + self.nav_button(ui, AppView::Status, "Dashboard"); + if ui + .add_sized( + [200.0, nav_button_height], + sidebar_action_button("Ausgangsrechnungen"), + ) + .clicked() + { + self.open_outgoing_invoices_window(); + } + if ui + .add_sized( + [200.0, nav_button_height], + sidebar_action_button("Angebote"), + ) + .clicked() + { + self.open_quotes_window(); + } + if ui + .add_sized( + [200.0, nav_button_height], + sidebar_action_button("Eingangsrechnungen"), + ) + .clicked() + { + self.open_incoming_invoices_window(); + } + + nav_group_label(ui, "Stammdaten"); + if ui + .add_sized( + [200.0, nav_button_height], + sidebar_action_button("Kunden"), + ) + .clicked() + { + self.open_customers_window(); + } + if ui + .add_sized( + [200.0, nav_button_height], + sidebar_action_button("Lieferanten"), + ) + .clicked() + { + self.open_suppliers_window(); + } + if ui + .add_sized( + [200.0, nav_button_height], + sidebar_action_button("Artikel"), + ) + .clicked() + { + self.open_items_window(); + } + if ui + .add_sized( + [200.0, nav_button_height], + sidebar_action_button("Aktivitäten"), + ) + .clicked() + { + self.open_activities_window(); + } + + nav_group_label(ui, "Arbeitsdaten"); + if ui + .add_sized( + [200.0, nav_button_height], + sidebar_action_button("Preislisten"), + ) + .clicked() + { + self.open_price_import_window(); + } + + nav_group_label(ui, "Einstellungen"); + if ui + .add_sized( + [200.0, nav_button_height], + sidebar_action_button("Preisregeln"), + ) + .clicked() + { + self.open_price_rules_window(); + } + if ui + .add_sized( + [200.0, nav_button_height], + sidebar_action_button("Preis-APIs"), + ) + .clicked() + { + self.open_api_connectors_window(); + } + if ui + .add_sized( + [200.0, nav_button_height], + sidebar_action_button("Firmendaten"), + ) + .clicked() + { + self.open_organization_setup_window(); + } + if ui + .add_sized( + [200.0, nav_button_height], + sidebar_action_button("Benutzerrechte"), + ) + .clicked() + { + self.open_users_window(); + } + if ui + .add_sized( + [200.0, nav_button_height], + sidebar_action_button("Nummernkreise"), + ) + .clicked() + { + self.open_number_ranges_window(); + } + if ui + .add_sized( + [200.0, nav_button_height], + sidebar_action_button("Skonto"), + ) + .clicked() + { + self.open_cash_discount_terms_window(); + } + if ui + .add_sized( + [200.0, nav_button_height], + sidebar_action_button("Freischaltung"), + ) + .clicked() + { + self.open_admin_registrations_window(); + } + } + } else { + self.nav_button(ui, AppView::Login, "Login"); + self.nav_button(ui, AppView::Register, "Registrierung"); + } + }); + + if let Some(email) = self.authenticated_email.clone() { + ui.add_space(22.0); + ui.separator(); + ui.add_space(12.0); + let mut selected_mode = self.navigation_mode; + ui.scope(|ui| { + let visuals = ui.visuals_mut(); + visuals.widgets.inactive.bg_fill = accent_soft_color(); + visuals.widgets.inactive.fg_stroke = + egui::Stroke::new(1.0, accent_dark_color()); + visuals.widgets.hovered.bg_fill = egui::Color32::from_rgb(199, 235, 230); + visuals.widgets.hovered.fg_stroke = + egui::Stroke::new(1.0, accent_dark_color()); + visuals.widgets.active.bg_fill = accent_soft_color(); + visuals.widgets.active.fg_stroke = + egui::Stroke::new(1.0, accent_dark_color()); + visuals.widgets.open.bg_fill = accent_soft_color(); + visuals.widgets.open.fg_stroke = + egui::Stroke::new(1.0, accent_dark_color()); + egui::ComboBox::from_id_salt("navigation_mode") + .selected_text( + egui::RichText::new(selected_mode.label()) + .color(accent_dark_color()) + .strong(), + ) + .show_ui(ui, |ui| { + let visuals = ui.visuals_mut(); + visuals.widgets.inactive.bg_fill = surface_color(); + visuals.widgets.inactive.fg_stroke = + egui::Stroke::new(1.0, accent_dark_color()); + visuals.widgets.hovered.bg_fill = accent_soft_color(); + visuals.widgets.hovered.fg_stroke = + egui::Stroke::new(1.0, accent_dark_color()); + visuals.widgets.active.bg_fill = accent_color(); + visuals.widgets.active.fg_stroke = + egui::Stroke::new(1.0, egui::Color32::WHITE); + ui.selectable_value( + &mut selected_mode, + NavigationMode::Scroll, + egui::RichText::new(NavigationMode::Scroll.label()) + .color(accent_dark_color()) + .strong(), + ); + ui.selectable_value( + &mut selected_mode, + NavigationMode::Groups, + egui::RichText::new(NavigationMode::Groups.label()) + .color(accent_dark_color()) + .strong(), + ); + }); + }); + if selected_mode != self.navigation_mode { + self.save_navigation_mode(selected_mode); + } + if !self.navigation_settings_status.is_empty() { + ui.label( + egui::RichText::new(&self.navigation_settings_status) + .color(muted_text_color()) + .size(12.0), + ); + } + ui.add_space(8.0); + ui.label( + egui::RichText::new(email) + .color(muted_text_color()) + .size(13.0) + .strong(), + ); + ui.add_space(8.0); + if ui + .add_sized([180.0, 34.0], sidebar_action_button("Abmelden")) + .clicked() + { + self.logout(); + } + } + }); + + egui::TopBottomPanel::bottom("window_taskbar") + .exact_height(46.0) + .frame(egui::Frame::side_top_panel(&ctx.style()).fill(surface_color())) + .show(ctx, |ui| { + ui.add_space(6.0); + self.render_taskbar(ui); + }); + + egui::CentralPanel::default() + .frame(egui::Frame::central_panel(&ctx.style()).fill(background_color())) + .show(ctx, |ui| { + ui.add_space(12.0); + egui::ScrollArea::vertical().show(ui, |ui| match self.view { + AppView::Login => self.login_view(ui), + AppView::Status => self.status_view(ui), + AppView::Register => self.registration_view(ui), + }); + }); + + macro_rules! managed_window { + ($key:literal, $field:ident, $title:literal, $body:expr $(, $method:ident($($arg:expr),*))* $(,)?) => { + if self.$field && !self.window_is_minimized($key) { + let mut open = self.$field; + let mut minimize = false; + let screen = ctx.screen_rect(); + let window_area = egui::Rect::from_min_max( + screen.min, + egui::pos2(screen.max.x, screen.max.y - 46.0), + ); + egui::Window::new($title) + .open(&mut open) + .collapsible(false) + .constrain_to(window_area) + $( + .$method($($arg),*) + )* + .show(ctx, |ui| { + if window_minimize_control(ui) { + minimize = true; + } + egui::ScrollArea::vertical().show(ui, |ui| $body(self, ui)); + }); + self.$field = open; + self.clear_minimized_if_closed($key, open); + if minimize { + self.minimize_window($key); + } + } + }; + } + + managed_window!( + "users", + users_window_open, + "Benutzerrechte", + |app: &mut CompanyToolApp, ui| app.users_view(ui), + min_width(760.0), + default_width(900.0), + default_height(620.0), + resizable(true) + ); + managed_window!( + "organization_setup", + organization_setup_window_open, + "Firmendaten", + |app: &mut CompanyToolApp, ui| app.organization_setup_view(ui), + min_width(760.0), + default_width(900.0), + default_height(620.0), + resizable(true) + ); + managed_window!( + "number_ranges", + number_ranges_window_open, + "Nummernkreise", + |app: &mut CompanyToolApp, ui| app.number_ranges_view(ui), + min_width(760.0), + default_width(900.0), + default_height(620.0), + resizable(true) + ); + managed_window!( + "admin_registrations", + admin_registrations_window_open, + "Freischaltung", + |app: &mut CompanyToolApp, ui| app.registrations_view(ui), + min_width(760.0), + default_width(900.0), + default_height(620.0), + resizable(true) + ); + managed_window!( + "customers", + customers_window_open, + "Kunden", + |app: &mut CompanyToolApp, ui| app.customers_view(ui), + min_width(820.0), + default_width(980.0), + default_height(700.0), + resizable(true) + ); + managed_window!( + "suppliers", + suppliers_window_open, + "Lieferanten", + |app: &mut CompanyToolApp, ui| app.suppliers_view(ui), + default_width(980.0) + ); + managed_window!( + "items", + items_window_open, + "Artikel", + |app: &mut CompanyToolApp, ui| app.items_view(ui), + default_width(900.0) + ); + managed_window!( + "price_imports", + price_import_window_open, + "Preislisten", + |app: &mut CompanyToolApp, ui| app.price_imports_view(ui), + default_width(980.0), + default_height(720.0) + ); + managed_window!( + "api_connectors", + api_connectors_window_open, + "Preis-APIs", + |app: &mut CompanyToolApp, ui| app.api_connectors_view(ui), + default_width(980.0), + default_height(720.0) + ); + managed_window!( + "price_rules", + price_rules_window_open, + "Preisregeln", + |app: &mut CompanyToolApp, ui| app.price_rules_view(ui), + default_width(940.0), + default_height(680.0) + ); + managed_window!( + "cash_discount_terms", + cash_discount_terms_window_open, + "Skonto", + |app: &mut CompanyToolApp, ui| app.cash_discount_terms_view(ui), + default_width(900.0) + ); + managed_window!( + "quotes", + quotes_window_open, + "Angebote", + |app: &mut CompanyToolApp, ui| app.quotes_view(ui), + default_width(1080.0), + default_height(760.0) + ); + managed_window!( + "outgoing_invoices", + outgoing_invoices_window_open, + "Rechnungen", + |app: &mut CompanyToolApp, ui| app.outgoing_invoices_view(ui), + default_width(1080.0), + default_height(760.0) + ); + managed_window!( + "incoming_invoices", + incoming_invoices_window_open, + "Eingangsrechnungen", + |app: &mut CompanyToolApp, ui| app.incoming_invoices_view(ui), + default_width(1080.0), + default_height(760.0) + ); + managed_window!( + "activities", + activities_window_open, + "Aktivitäten", + |app: &mut CompanyToolApp, ui| app.activities_view(ui), + default_width(900.0) + ); + } +} + +impl CompanyToolApp { + fn nav_button(&mut self, ui: &mut egui::Ui, view: AppView, label: &str) { + let selected = self.view == view; + let button = egui::Button::new( + egui::RichText::new(label) + .color(if selected { + accent_dark_color() + } else { + egui::Color32::WHITE + }) + .strong(), + ) + .fill(if selected { + accent_soft_color() + } else { + accent_dark_color() + }) + .stroke(egui::Stroke::NONE) + .rounding(6.0); + + if ui + .add_sized([200.0, self.navigation_mode.button_height()], button) + .clicked() + { + self.view = view; + } + ui.add_space(4.0); + } + + fn login_view(&mut self, ui: &mut egui::Ui) { + page_header(ui, "Login", "Anmeldung mit E-Mail-Adresse und Passwort."); + + panel(ui, |ui| { + ui.set_max_width(620.0); + form_row(ui, "E-Mail-Adresse", |ui| { + ui.text_edit_singleline(&mut self.login_email); + }); + form_row(ui, "Passwort", |ui| { + ui.add(egui::TextEdit::singleline(&mut self.login_password).password(true)); + }); + + ui.add_space(12.0); + let submit = ui.add_enabled(!self.login_pending, primary_action_button("Einloggen")); + if submit.clicked() { + self.submit_login(); + } + + if !self.login_status.is_empty() { + ui.add_space(10.0); + ui.label(egui::RichText::new(&self.login_status).color(muted_text_color())); + } + }); + + panel(ui, |ui| { + ui.set_max_width(620.0); + ui.heading("Dev-Bootstrap"); + ui.label( + egui::RichText::new( + "Lokale Testfirma mit erstem User anlegen, ohne E-Mail-Versand.", + ) + .color(muted_text_color()), + ); + ui.add_space(10.0); + form_row(ui, "Firmenname", |ui| { + ui.text_edit_singleline(&mut self.dev_organization_name); + }); + form_row(ui, "E-Mail-Adresse", |ui| { + ui.text_edit_singleline(&mut self.dev_email); + }); + let submit = ui.add_enabled( + !self.dev_pending, + primary_action_button("Testfirma und User anlegen"), + ); + if submit.clicked() { + self.submit_dev_bootstrap(); + } + if !self.dev_status.is_empty() { + ui.add_space(10.0); + ui.label(egui::RichText::new(&self.dev_status).color(muted_text_color())); + } + if let Some(credentials) = &self.dev_credentials { + ui.add_space(10.0); + ui.monospace(format!("Login: {}", credentials.email)); + ui.monospace(format!("Passwort: {}", credentials.password)); + ui.monospace(format!("User: {}", credentials.user_id)); + ui.monospace(format!("Firma: {}", credentials.organization_id)); + ui.monospace(format!("Schema: {}", credentials.schema_name)); + ui.monospace(format!("Dev-Modus: {}", credentials.dev_mode)); + } + }); + } + + fn status_view(&mut self, ui: &mut egui::Ui) { + page_header( + ui, + "Dashboard", + "Übersicht über Backend-Verbindung und aktuelle Vorgänge.", + ); + + panel(ui, |ui| { + ui.horizontal(|ui| { + ui.vertical(|ui| { + ui.heading("Live-Verbindung"); + ui.label(egui::RichText::new(&self.status).color(muted_text_color())); + }); + ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { + ui.monospace(&self.ws_url); + }); + }); + }); + + panel(ui, |ui| { + ui.heading("Aktuelle Datensätze"); + ui.add_space(10.0); + egui::Grid::new("records") + .striped(true) + .spacing([28.0, 8.0]) + .show(ui, |ui| { + ui.strong("Titel"); + ui.strong("Aktualisiert"); + ui.end_row(); + + for record in &self.records { + ui.label(&record.title); + ui.label(record.updated_at.to_rfc3339()); + ui.end_row(); + } + }); + }); + } + + fn registration_view(&mut self, ui: &mut egui::Ui) { + page_header( + ui, + "Firma registrieren", + "Neue Organization für den SaaS-Betrieb vormerken.", + ); + + panel(ui, |ui| { + ui.set_max_width(620.0); + form_row(ui, "Firmenname", |ui| { + ui.text_edit_singleline(&mut self.organization_name); + }); + form_row(ui, "E-Mail-Adresse", |ui| { + ui.text_edit_singleline(&mut self.registration_email); + }); + ui.checkbox(&mut self.accept_terms, "Nutzungsbedingungen akzeptieren"); + ui.add_space(12.0); + + let submit = ui.add_enabled( + !self.registration_pending, + primary_action_button("Registrierung absenden"), + ); + if submit.clicked() { + self.submit_registration(); + } + + if !self.registration_status.is_empty() { + ui.add_space(10.0); + ui.label(egui::RichText::new(&self.registration_status).color(muted_text_color())); + } + }); + } + + fn users_view(&mut self, ui: &mut egui::Ui) { + page_header( + ui, + "Benutzerrechte", + "Benutzer einladen und Rollen verwalten.", + ); + + panel(ui, |ui| { + ui.set_max_width(720.0); + form_row(ui, "E-Mail-Adresse", |ui| { + ui.text_edit_singleline(&mut self.invite_email); + }); + ui.label( + egui::RichText::new("Rollen") + .strong() + .color(muted_text_color()), + ); + role_checkboxes(ui, &mut self.invite_roles); + ui.add_space(12.0); + ui.horizontal(|ui| { + if ui + .add_enabled( + !self.users_pending, + primary_action_button("Einladung senden"), + ) + .clicked() + { + self.invite_user(); + } + if ui + .add_enabled(!self.users_pending, egui::Button::new("Benutzer laden")) + .clicked() + { + self.load_users(); + } + }); + ui.add_space(10.0); + ui.label(egui::RichText::new(&self.users_status).color(muted_text_color())); + ui.label(egui::RichText::new(&self.live_update_status).color(muted_text_color())); + }); + + panel(ui, |ui| { + ui.heading("Benutzerliste"); + ui.add_space(10.0); + if self.users.is_empty() { + ui.label(egui::RichText::new(&self.users_status).color(muted_text_color())); + return; + } + + ui.horizontal(|ui| { + ui.add_sized( + [220.0, 22.0], + egui::Label::new(egui::RichText::new("E-Mail").strong()), + ); + ui.add_sized( + [80.0, 22.0], + egui::Label::new(egui::RichText::new("Status").strong()), + ); + ui.add_sized( + [300.0, 22.0], + egui::Label::new(egui::RichText::new("Rollen").strong()), + ); + ui.add_sized( + [100.0, 22.0], + egui::Label::new(egui::RichText::new("Aktion").strong()), + ); + }); + ui.separator(); + + for index in 0..self.users.len() { + ui.horizontal(|ui| { + ui.add_sized([220.0, 24.0], egui::Label::new(&self.users[index].email)); + ui.add_sized([80.0, 24.0], egui::Label::new(&self.users[index].status)); + ui.vertical(|ui| { + ui.set_min_width(300.0); + role_checkboxes(ui, &mut self.users[index].roles); + }); + let user_id = self.users[index].user_id.clone(); + let roles = self.users[index].roles.clone(); + let saving = self.saving_user_id.as_deref() == Some(user_id.as_str()); + if ui + .add_enabled(!saving, egui::Button::new("Speichern")) + .clicked() + { + self.save_user_roles(user_id, roles); + } + }); + ui.add_space(6.0); + ui.separator(); + ui.add_space(6.0); + } + }); + } + + fn organization_setup_view(&mut self, ui: &mut egui::Ui) { + page_header( + ui, + "Firmendaten", + "Stammdaten der aktiven Organization erfassen.", + ); + panel(ui, |ui| { + ui.set_max_width(720.0); + form_row(ui, "Firmenname", |ui| { + ui.text_edit_singleline(&mut self.organization_setup.display_name); + }); + form_row(ui, "Rechtsform", |ui| { + ui.text_edit_singleline(&mut self.organization_setup.legal_form); + }); + form_row(ui, "Straße und Hausnummer", |ui| { + ui.text_edit_singleline(&mut self.organization_setup.street); + }); + form_row(ui, "PLZ", |ui| { + ui.text_edit_singleline(&mut self.organization_setup.postal_code); + }); + form_row(ui, "Ort", |ui| { + ui.text_edit_singleline(&mut self.organization_setup.city); + }); + form_row(ui, "Land", |ui| { + ui.text_edit_singleline(&mut self.organization_setup.country); + }); + form_row(ui, "USt-IdNr.", |ui| { + ui.text_edit_singleline(&mut self.organization_setup.vat_id); + }); + form_row(ui, "E-Mail der Firma", |ui| { + ui.text_edit_singleline(&mut self.organization_setup.email); + }); + form_row(ui, "Telefon", |ui| { + ui.text_edit_singleline(&mut self.organization_setup.phone); + }); + form_row(ui, "Standard-Steuersatz", |ui| { + ui.text_edit_singleline(&mut self.organization_setup.default_tax_rate); + }); + form_row(ui, "Standard-Zahlungsziel", |ui| { + ui.text_edit_singleline(&mut self.organization_setup.default_payment_days); + }); + if ui + .add_enabled( + !self.organization_setup_pending, + primary_action_button("Firmendaten speichern"), + ) + .clicked() + { + self.save_organization_setup(); + } + if !self.organization_setup_status.is_empty() { + ui.add_space(10.0); + ui.label( + egui::RichText::new(&self.organization_setup_status).color(muted_text_color()), + ); + } + ui.label(egui::RichText::new(&self.live_update_status).color(muted_text_color())); + }); + } + + fn registrations_view(&mut self, ui: &mut egui::Ui) { + page_header( + ui, + "Freischaltungen", + "Offene und entschiedene Organization-Registrierungen.", + ); + panel(ui, |ui| { + if ui + .add_enabled( + !self.registrations_pending, + primary_action_button("Aktualisieren"), + ) + .clicked() + { + self.load_registrations(); + } + ui.add_space(10.0); + ui.label(egui::RichText::new(&self.registrations_status).color(muted_text_color())); + ui.label(egui::RichText::new(&self.live_update_status).color(muted_text_color())); + }); + + panel(ui, |ui| { + ui.heading("Registrierungen"); + ui.add_space(10.0); + if self.registrations.is_empty() { + ui.label(egui::RichText::new(&self.registrations_status).color(muted_text_color())); + return; + } + + egui::Grid::new("registrations_grid") + .striped(true) + .spacing([18.0, 8.0]) + .show(ui, |ui| { + ui.strong("Firma"); + ui.strong("E-Mail"); + ui.strong("Status"); + ui.strong("Eingegangen"); + ui.strong("Aktion"); + ui.end_row(); + + for registration in self.registrations.clone() { + ui.label(registration.organization_name); + ui.label(registration.email); + ui.label(registration.status.clone()); + ui.label(registration.requested_at); + if ui + .add_enabled( + !self.registrations_pending + && registration.status == "pending_approval", + egui::Button::new("Freischalten"), + ) + .clicked() + { + self.approve_registration(registration.id); + } + ui.end_row(); + } + }); + }); + } + + fn number_ranges_view(&mut self, ui: &mut egui::Ui) { + page_header( + ui, + "Nummernkreise", + "Individuelle Nummern für Stammdaten, Angebote und Rechnungen.", + ); + master_detail!( + ui, + { + panel(ui, |ui| { + ui.set_min_width(280.0); + for range in self.number_ranges.clone() { + if ui + .selectable_label( + self.selected_number_range_code.as_deref() == Some(&range.code), + format!( + "{} {} {}", + number_range_label(&range.code), + range.pattern, + &range.id[..range.id.len().min(8)] + ), + ) + .clicked() + { + self.selected_number_range_code = Some(range.code.clone()); + self.number_range_form = NumberRangeForm::from(&range); + } + } + }); + }, + { + panel(ui, |ui| { + ui.set_min_width(520.0); + form_row(ui, "Muster", |ui| { + ui.text_edit_singleline(&mut self.number_range_form.pattern); + }); + form_row(ui, "Zählerstand", |ui| { + ui.add( + egui::DragValue::new(&mut self.number_range_form.counter_value) + .range(0..=i64::MAX), + ); + }); + form_row(ui, "Zählerlänge", |ui| { + ui.add( + egui::DragValue::new(&mut self.number_range_form.counter_padding) + .range(1..=18), + ); + }); + form_row(ui, "Reset-Regel", |ui| { + ui.text_edit_singleline( + self.number_range_form + .reset_rule + .get_or_insert(String::new()), + ); + }); + ui.checkbox(&mut self.number_range_form.is_active, "Aktiv"); + ui.label("Das Muster muss {counter} enthalten."); + if ui + .add_enabled( + self.selected_number_range_code.is_some(), + primary_action_button("Speichern"), + ) + .clicked() + { + self.save_number_range(); + } + ui.label(&self.number_ranges_status); + }); + }, + ); + } + + fn customers_view(&mut self, ui: &mut egui::Ui) { + page_header(ui, "Kunden", "Kundenstamm, Rabatt und Kontaktdaten."); + master_detail!( + ui, + { + panel(ui, |ui| { + ui.set_min_width(250.0); + ui.horizontal(|ui| { + ui.heading("Kundenliste"); + if ui.button("Neu").clicked() { + self.new_customer(); + } + }); + ui.add_space(8.0); + ui.text_edit_singleline(&mut self.customer_list_search); + ui.add_space(6.0); + let filtered_customers: Vec = self + .customers + .iter() + .filter(|customer| { + matches_number_or_name( + &customer.customer_number, + &customer.name, + &self.customer_list_search, + ) + }) + .cloned() + .collect(); + for customer in filtered_customers { + if ui + .selectable_label( + self.selected_customer_id.as_deref() == Some(&customer.id), + format!("{} {}", customer.customer_number, customer.name), + ) + .clicked() + { + self.selected_customer_id = Some(customer.id.clone()); + self.customer_form = CustomerForm::from(&customer); + } + } + if self.customers.is_empty() { + ui.label("Keine Kunden vorhanden."); + } else if self.customers.iter().all(|customer| { + !matches_number_or_name( + &customer.customer_number, + &customer.name, + &self.customer_list_search, + ) + }) { + ui.label("Keine Treffer."); + } + }); + }, + { + panel(ui, |ui| { + ui.set_min_width(480.0); + form_row(ui, "Kundennummer", |ui| { + ui.label(number_or_pending(&self.customer_form.customer_number)); + }); + form_row(ui, "Name", |ui| { + ui.text_edit_singleline(&mut self.customer_form.name); + }); + form_row(ui, "Status", |ui| { + egui::ComboBox::from_id_salt("customer_status") + .selected_text(&self.customer_form.status) + .show_ui(ui, |ui| { + ui.selectable_value( + &mut self.customer_form.status, + "active".to_string(), + "Aktiv", + ); + ui.selectable_value( + &mut self.customer_form.status, + "inactive".to_string(), + "Inaktiv", + ); + ui.selectable_value( + &mut self.customer_form.status, + "blocked".to_string(), + "Gesperrt", + ); + }); + }); + form_row(ui, "Standardrabatt %", |ui| { + ui.text_edit_singleline(&mut self.customer_form.standard_discount_percent); + }); + let terms = self.cash_discount_terms.clone(); + form_row(ui, "Skonto-Regel", |ui| { + cash_discount_combo( + ui, + "customer_cash_discount", + &mut self.customer_form.cash_discount_term_id, + &terms, + ); + }); + form_row(ui, "Straße", |ui| { + ui.text_edit_singleline(&mut self.customer_form.details.street); + }); + form_row(ui, "PLZ", |ui| { + ui.text_edit_singleline(&mut self.customer_form.details.postal_code); + }); + form_row(ui, "Ort", |ui| { + ui.text_edit_singleline(&mut self.customer_form.details.city); + }); + form_row(ui, "Land", |ui| { + ui.text_edit_singleline(&mut self.customer_form.details.country); + }); + form_row(ui, "E-Mail", |ui| { + ui.text_edit_singleline(&mut self.customer_form.details.email); + }); + form_row(ui, "Telefon", |ui| { + ui.text_edit_singleline(&mut self.customer_form.details.phone); + }); + ui.horizontal(|ui| { + if ui + .add_enabled( + !self.customers_pending, + primary_action_button("Speichern"), + ) + .clicked() + { + self.save_customer(); + } + if ui + .add_enabled( + !self.customers_pending && self.selected_customer_id.is_some(), + egui::Button::new("Deaktivieren"), + ) + .clicked() + { + self.deactivate_customer(); + } + }); + ui.add_space(8.0); + ui.label(egui::RichText::new(&self.customers_status).color(muted_text_color())); + }); + }, + ); + } + + fn suppliers_view(&mut self, ui: &mut egui::Ui) { + page_header( + ui, + "Lieferanten", + "Lieferantenstamm und Zahlungskonditionen.", + ); + master_detail!( + ui, + { + panel(ui, |ui| { + ui.set_min_width(250.0); + if ui.button("Neuer Lieferant").clicked() { + self.selected_supplier_id = None; + self.supplier_form = SupplierForm::default(); + self.suppliers_status = "Lieferantennummer wird reserviert.".to_string(); + self.reserve_next_number("suppliers"); + } + ui.text_edit_singleline(&mut self.supplier_list_search); + ui.add_space(6.0); + let filtered_suppliers: Vec = self + .suppliers + .iter() + .filter(|supplier| { + matches_number_or_name( + &supplier.supplier_number, + &supplier.name, + &self.supplier_list_search, + ) + }) + .cloned() + .collect(); + for supplier in filtered_suppliers { + if ui + .selectable_label( + self.selected_supplier_id.as_deref() == Some(&supplier.id), + format!("{} {}", supplier.supplier_number, supplier.name), + ) + .clicked() + { + self.selected_supplier_id = Some(supplier.id.clone()); + self.supplier_form = SupplierForm::from(&supplier); + } + } + }); + }, + { + panel(ui, |ui| { + ui.set_min_width(480.0); + form_row(ui, "Lieferantennummer", |ui| { + ui.label(number_or_pending(&self.supplier_form.supplier_number)); + }); + form_row(ui, "Name", |ui| { + ui.text_edit_singleline(&mut self.supplier_form.name); + }); + form_row(ui, "Rabatt %", |ui| { + ui.text_edit_singleline(&mut self.supplier_form.standard_discount_percent); + }); + let terms = self.cash_discount_terms.clone(); + form_row(ui, "Skonto-Regel", |ui| { + cash_discount_combo( + ui, + "supplier_cash_discount", + &mut self.supplier_form.cash_discount_term_id, + &terms, + ); + }); + form_row(ui, "Zahlungsziel Tage", |ui| { + ui.add( + egui::DragValue::new(self.supplier_form.payment_days.get_or_insert(14)) + .range(0..=365), + ); + }); + form_row(ui, "Straße", |ui| { + ui.text_edit_singleline(&mut self.supplier_form.details.street); + }); + form_row(ui, "Ort", |ui| { + ui.text_edit_singleline(&mut self.supplier_form.details.city); + }); + ui.horizontal(|ui| { + if ui.button("Speichern").clicked() { + self.save_supplier(); + } + if ui + .add_enabled( + self.selected_supplier_id.is_some(), + egui::Button::new("Deaktivieren"), + ) + .clicked() + { + self.delete_supplier(); + } + }); + ui.label(&self.suppliers_status); + }); + }, + ); + } + + fn items_view(&mut self, ui: &mut egui::Ui) { + page_header(ui, "Artikel", "Artikelstamm und Standardpreise."); + master_detail!( + ui, + { + panel(ui, |ui| { + ui.set_min_width(250.0); + if ui.button("Neuer Artikel").clicked() { + self.selected_item_id = None; + self.item_form = ItemForm::default(); + self.items_status = "Artikelnummer wird reserviert.".to_string(); + self.reserve_next_number("items"); + } + ui.text_edit_singleline(&mut self.item_list_search); + ui.add_space(6.0); + let filtered_items: Vec = self + .items + .iter() + .filter(|item| { + matches_number_or_name( + &item.item_number, + &item.name, + &self.item_list_search, + ) + }) + .cloned() + .collect(); + for item in filtered_items { + if ui + .selectable_label( + self.selected_item_id.as_deref() == Some(&item.id), + format!("{} {}", item.item_number, item.name), + ) + .clicked() + { + self.selected_item_id = Some(item.id.clone()); + self.item_form = ItemForm::from(&item); + self.load_item_price_history(item.id); + } + } + }); + }, + { + panel(ui, |ui| { + ui.set_min_width(440.0); + form_row(ui, "Artikelnummer", |ui| { + ui.label(number_or_pending(&self.item_form.item_number)); + }); + form_row(ui, "Bezeichnung", |ui| { + ui.text_edit_singleline(&mut self.item_form.name); + }); + form_row(ui, "Einheit", |ui| { + ui.text_edit_singleline(&mut self.item_form.unit); + }); + form_row(ui, "Steuersatz %", |ui| { + ui.text_edit_singleline(&mut self.item_form.tax_rate); + }); + form_row(ui, "Einkaufspreis", |ui| { + ui.text_edit_singleline(&mut self.item_form.default_purchase_price); + }); + form_row(ui, "Verkaufspreis", |ui| { + ui.text_edit_singleline(&mut self.item_form.default_sales_price); + }); + ui.horizontal(|ui| { + if ui.button("Speichern").clicked() { + self.save_item(); + } + if ui + .add_enabled( + self.selected_item_id.is_some(), + egui::Button::new("Deaktivieren"), + ) + .clicked() + { + self.delete_item(); + } + }); + ui.label(&self.items_status); + ui.add_space(12.0); + ui.heading("Preishistorie"); + if self.item_price_history.is_empty() { + ui.label("Noch keine Preisänderung vorhanden."); + } + for entry in &self.item_price_history { + ui.horizontal(|ui| { + ui.label(&entry.valid_from); + ui.label(format!("ID {}", &entry.id[..entry.id.len().min(8)])); + ui.label(format!( + "EK {}", + entry.purchase_price.as_deref().unwrap_or("-") + )); + ui.label(format!( + "VK {}", + entry.sales_price.as_deref().unwrap_or("-") + )); + ui.label(&entry.source); + ui.label(format!( + "Item {}", + &entry.item_id[..entry.item_id.len().min(8)] + )); + ui.label(format!("Erfasst {}", entry.created_at)); + if let Some(user_id) = &entry.created_by_user_id { + ui.label(format!("User {}", &user_id[..user_id.len().min(8)])); + } + }); + } + }); + }, + ); + } + + fn price_imports_view(&mut self, ui: &mut egui::Ui) { + page_header( + ui, + "Preislistenimport", + "CSV-Preislisten prüfen und Artikelpreise historisiert übernehmen.", + ); + panel(ui, |ui| { + form_row(ui, "Quelle", |ui| { + ui.text_edit_singleline(&mut self.price_import_form.source_name); + }); + form_row(ui, "Trennzeichen", |ui| { + ui.text_edit_singleline( + self.price_import_form + .delimiter + .get_or_insert(";".to_string()), + ); + }); + form_row(ui, "CSV-Inhalt", |ui| { + ui.add( + egui::TextEdit::multiline(&mut self.price_import_form.content) + .desired_rows(12) + .desired_width(860.0), + ); + }); + ui.horizontal(|ui| { + if ui.button("Vorschau").clicked() { + self.preview_price_import(); + } + if ui.button("Importieren").clicked() { + self.apply_price_import(); + } + }); + ui.label(&self.price_import_status); + }); + if let Some(preview) = &self.price_import_preview { + panel(ui, |ui| { + ui.heading("Vorschau"); + ui.label(format!( + "{} Zeilen, {} gültig, {} Fehler", + preview.total_rows, preview.valid_rows, preview.error_rows + )); + ui.separator(); + egui::Grid::new("price_import_preview_grid") + .striped(true) + .show(ui, |ui| { + ui.label("Zeile"); + ui.label("Aktion"); + ui.label("Artikelnummer"); + ui.label("Name"); + ui.label("Einheit"); + ui.label("Steuer"); + ui.label("EK"); + ui.label("VK"); + ui.label("Fehler"); + ui.end_row(); + for row in &preview.rows { + ui.label(row.row_number.to_string()); + ui.label(&row.action); + ui.label(&row.item_number); + ui.label(&row.name); + ui.label(&row.unit); + ui.label(&row.tax_rate); + ui.label(row.purchase_price.as_deref().unwrap_or("-")); + ui.label(row.sales_price.as_deref().unwrap_or("-")); + ui.label(row.error.as_deref().unwrap_or("-")); + ui.end_row(); + } + }); + }); + } + } + + fn api_connectors_view(&mut self, ui: &mut egui::Ui) { + page_header( + ui, + "Preis-APIs", + "Externe Preisquellen konfigurieren und manuell abgleichen.", + ); + master_detail!( + ui, + { + panel(ui, |ui| { + ui.set_min_width(260.0); + if ui.button("Neue Preis-API").clicked() { + self.selected_api_connector_id = None; + self.api_connector_form = ApiConnectorForm::default(); + } + for connector in self.api_connectors.clone() { + if ui + .selectable_label( + self.selected_api_connector_id.as_deref() == Some(&connector.id), + format!("{} {}", connector.code, connector.name), + ) + .clicked() + { + self.selected_api_connector_id = Some(connector.id.clone()); + self.api_connector_form = ApiConnectorForm::from(&connector); + } + if let Some(last_sync_at) = &connector.last_sync_at { + ui.label( + egui::RichText::new(format!("zuletzt: {last_sync_at}")) + .color(muted_text_color()) + .size(12.0), + ); + } + } + }); + }, + { + panel(ui, |ui| { + ui.set_min_width(560.0); + form_row(ui, "Code", |ui| { + ui.text_edit_singleline(&mut self.api_connector_form.code); + }); + form_row(ui, "Name", |ui| { + ui.text_edit_singleline(&mut self.api_connector_form.name); + }); + form_row(ui, "Typ", |ui| { + ui.text_edit_singleline(&mut self.api_connector_form.connector_type); + }); + form_row(ui, "Intervall Minuten", |ui| { + ui.add( + egui::DragValue::new( + self.api_connector_form + .sync_interval_minutes + .get_or_insert(1440), + ) + .range(1..=525_600), + ); + }); + ui.checkbox(&mut self.api_connector_form.is_active, "Aktiv"); + form_row(ui, "Konfiguration JSON", |ui| { + ui.add( + egui::TextEdit::multiline(&mut self.api_connector_form.config) + .desired_rows(10) + .desired_width(520.0), + ); + }); + ui.horizontal(|ui| { + if ui.button("Speichern").clicked() { + self.save_api_connector(); + } + if ui + .add_enabled( + self.selected_api_connector_id.is_some(), + egui::Button::new("Abgleichen"), + ) + .clicked() + { + self.sync_api_connector(); + } + if ui + .add_enabled( + self.selected_api_connector_id.is_some(), + egui::Button::new("Deaktivieren"), + ) + .clicked() + { + self.delete_api_connector(); + } + }); + ui.label(&self.api_connectors_status); + }); + }, + ); + } + + fn price_rules_view(&mut self, ui: &mut egui::Ui) { + page_header( + ui, + "Preisregeln", + "Aufschläge und Rundung je Preisquelle festlegen.", + ); + master_detail!( + ui, + { + panel(ui, |ui| { + ui.set_min_width(260.0); + if ui.button("Neue Preisregel").clicked() { + self.selected_price_rule_id = None; + self.price_rule_form = PriceRuleForm::default(); + } + for rule in self.price_rules.clone() { + if ui + .selectable_label( + self.selected_price_rule_id.as_deref() == Some(&rule.id), + format!("{} {}", rule.code, rule.name), + ) + .clicked() + { + self.selected_price_rule_id = Some(rule.id.clone()); + self.price_rule_form = PriceRuleForm::from(&rule); + } + } + }); + }, + { + panel(ui, |ui| { + ui.set_min_width(520.0); + form_row(ui, "Code", |ui| { + ui.text_edit_singleline(&mut self.price_rule_form.code); + }); + form_row(ui, "Name", |ui| { + ui.text_edit_singleline(&mut self.price_rule_form.name); + }); + form_row(ui, "Quellentyp", |ui| { + egui::ComboBox::from_id_salt("price_rule_source_type") + .selected_text(&self.price_rule_form.source_type) + .show_ui(ui, |ui| { + ui.selectable_value( + &mut self.price_rule_form.source_type, + "import".to_string(), + "Import", + ); + ui.selectable_value( + &mut self.price_rule_form.source_type, + "api".to_string(), + "API", + ); + ui.selectable_value( + &mut self.price_rule_form.source_type, + "supplier".to_string(), + "Lieferant", + ); + }); + }); + form_row(ui, "Quell-ID", |ui| { + ui.text_edit_singleline( + self.price_rule_form.source_id.get_or_insert(String::new()), + ); + }); + form_row(ui, "Aufschlag %", |ui| { + ui.text_edit_singleline(&mut self.price_rule_form.markup_percent); + }); + form_row(ui, "Rundung", |ui| { + egui::ComboBox::from_id_salt("price_rule_rounding") + .selected_text(&self.price_rule_form.rounding_mode) + .show_ui(ui, |ui| { + for (code, label) in [ + ("none", "Keine"), + ("cent", "Cent"), + ("five_cent", "5 Cent"), + ("ten_cent", "10 Cent"), + ("whole", "Ganze Beträge"), + ] { + ui.selectable_value( + &mut self.price_rule_form.rounding_mode, + code.to_string(), + label, + ); + } + }); + }); + ui.checkbox(&mut self.price_rule_form.is_active, "Aktiv"); + ui.horizontal(|ui| { + if ui.button("Speichern").clicked() { + self.save_price_rule(); + } + if ui + .add_enabled( + self.selected_price_rule_id.is_some(), + egui::Button::new("Deaktivieren"), + ) + .clicked() + { + self.delete_price_rule(); + } + }); + ui.label(&self.price_rules_status); + }); + }, + ); + } + + fn cash_discount_terms_view(&mut self, ui: &mut egui::Ui) { + page_header( + ui, + "Skonto", + "Zahlungsbedingungen für Kunden, Lieferanten und Belege.", + ); + master_detail!( + ui, + { + panel(ui, |ui| { + ui.set_min_width(250.0); + if ui.button("Neue Skonto-Regel").clicked() { + self.selected_cash_discount_term_id = None; + self.cash_discount_term_form = CashDiscountTermForm::default(); + } + for term in self.cash_discount_terms.clone() { + if ui + .selectable_label( + self.selected_cash_discount_term_id.as_deref() == Some(&term.id), + format!("{} {}", term.code, term.name), + ) + .clicked() + { + self.selected_cash_discount_term_id = Some(term.id.clone()); + self.cash_discount_term_form = CashDiscountTermForm::from(&term); + } + } + }); + }, + { + panel(ui, |ui| { + ui.set_min_width(520.0); + form_row(ui, "Code", |ui| { + ui.text_edit_singleline(&mut self.cash_discount_term_form.code); + }); + form_row(ui, "Name", |ui| { + ui.text_edit_singleline(&mut self.cash_discount_term_form.name); + }); + form_row(ui, "Skonto %", |ui| { + ui.text_edit_singleline(&mut self.cash_discount_term_form.discount_percent); + }); + form_row(ui, "Skontofrist Tage", |ui| { + ui.add( + egui::DragValue::new(&mut self.cash_discount_term_form.discount_days) + .range(0..=365), + ); + }); + form_row(ui, "Nettoziel Tage", |ui| { + ui.add( + egui::DragValue::new( + self.cash_discount_term_form.net_days.get_or_insert(30), + ) + .range(0..=365), + ); + }); + form_row(ui, "Gültig ab", |ui| { + ui.text_edit_singleline( + self.cash_discount_term_form + .valid_from + .get_or_insert(String::new()), + ); + }); + form_row(ui, "Gültig bis", |ui| { + ui.text_edit_singleline( + self.cash_discount_term_form + .valid_until + .get_or_insert(String::new()), + ); + }); + ui.checkbox( + &mut self.cash_discount_term_form.is_default_customer_term, + "Standard für Kunden", + ); + ui.checkbox( + &mut self.cash_discount_term_form.is_default_supplier_term, + "Standard für Lieferanten", + ); + ui.checkbox(&mut self.cash_discount_term_form.is_active, "Aktiv"); + ui.horizontal(|ui| { + if ui.button("Speichern").clicked() { + self.save_cash_discount_term(); + } + if ui + .add_enabled( + self.selected_cash_discount_term_id.is_some(), + egui::Button::new("Deaktivieren"), + ) + .clicked() + { + self.delete_cash_discount_term(); + } + }); + ui.label(&self.cash_discount_terms_status); + }); + }, + ); + } + + fn quotes_view(&mut self, ui: &mut egui::Ui) { + page_header( + ui, + "Angebote", + "Angebote mit festen Artikelpositionen und individuellen Preisen.", + ); + master_detail!( + ui, + { + panel(ui, |ui| { + ui.set_min_width(300.0); + if ui.button("Neues Angebot").clicked() { + self.selected_quote_id = None; + self.quote_form = QuoteForm::default(); + self.quotes_status = "Angebotsnummer wird reserviert.".to_string(); + self.reserve_next_number("quotes"); + } + ui.text_edit_singleline(&mut self.quote_list_search); + ui.add_space(6.0); + let quote_query = self.quote_list_search.trim().to_lowercase(); + let filtered_quotes: Vec = self + .quotes + .iter() + .filter(|quote| { + let customer = self + .customers + .iter() + .find(|customer| customer.id == quote.customer_id) + .map(|customer| customer.name.as_str()) + .unwrap_or("-"); + quote_query.is_empty() + || format!("{} {} {}", quote.quote_number, customer, quote.status) + .to_lowercase() + .contains("e_query) + }) + .cloned() + .collect(); + for quote in filtered_quotes { + let customer = self + .customers + .iter() + .find(|customer| customer.id == quote.customer_id) + .map(|customer| customer.name.as_str()) + .unwrap_or("-"); + if ui + .selectable_label( + self.selected_quote_id.as_deref() == Some("e.id), + format!("{} {} {}", quote.quote_number, customer, quote.status), + ) + .clicked() + { + self.selected_quote_id = Some(quote.id.clone()); + self.quote_form = QuoteForm::from("e); + } + } + }); + }, + { + panel(ui, |ui| { + ui.set_min_width(680.0); + form_row(ui, "Angebotsnummer", |ui| { + ui.label(number_or_pending(&self.quote_form.quote_number)); + }); + form_row(ui, "Kunde", |ui| { + customer_combo( + ui, + &mut self.quote_form.customer_id, + &self.customers, + &mut self.customer_lookup_search, + ); + }); + form_row(ui, "Status", |ui| { + egui::ComboBox::from_id_salt("quote_status") + .selected_text(&self.quote_form.status) + .show_ui(ui, |ui| { + for (code, label) in [ + ("draft", "Entwurf"), + ("sent", "Gesendet"), + ("accepted", "Angenommen"), + ("rejected", "Abgelehnt"), + ("expired", "Abgelaufen"), + ("cancelled", "Storniert"), + ] { + ui.selectable_value( + &mut self.quote_form.status, + code.to_string(), + label, + ); + } + }); + }); + form_row(ui, "Gültig bis", |ui| { + ui.text_edit_singleline( + self.quote_form.valid_until.get_or_insert(String::new()), + ); + }); + form_row(ui, "Kundenrabatt %", |ui| { + ui.text_edit_singleline(&mut self.quote_form.customer_discount_percent); + }); + form_row(ui, "Notizen", |ui| { + ui.text_edit_multiline(&mut self.quote_form.notes); + }); + ui.add_space(8.0); + ui.horizontal(|ui| { + ui.heading("Positionen"); + if ui.button("Position hinzufügen").clicked() { + self.quote_form.items.push(QuoteItemForm::default()); + } + }); + let mut remove_index = None; + let items = self.items.clone(); + let can_remove_quote_item = self.quote_form.items.len() > 1; + for (index, line) in self.quote_form.items.iter_mut().enumerate() { + ui.separator(); + ui.label(format!("Position {}", index + 1)); + form_row(ui, "Artikel", |ui| { + item_combo(ui, &mut line.item_id, &items, &mut self.item_lookup_search); + }); + if ui.button("Artikelwerte übernehmen").clicked() { + apply_quote_item_defaults(line, &items); + } + form_row(ui, "Beschreibung", |ui| { + ui.text_edit_singleline(&mut line.description); + }); + egui::Grid::new(format!("quote_item_fields_{index}")) + .num_columns(2) + .spacing([14.0, 8.0]) + .show(ui, |ui| { + ui.label("Menge"); + ui.text_edit_singleline(&mut line.quantity); + ui.end_row(); + ui.label("Preis"); + ui.text_edit_singleline(&mut line.unit_price); + ui.end_row(); + ui.label("Original"); + ui.text_edit_singleline( + line.original_unit_price.get_or_insert(String::new()), + ); + ui.end_row(); + ui.label("Rabatt %"); + ui.text_edit_singleline(&mut line.discount_percent); + ui.end_row(); + ui.label("Steuer %"); + ui.text_edit_singleline(&mut line.tax_rate); + ui.end_row(); + }); + if can_remove_quote_item && ui.button("Position entfernen").clicked() { + remove_index = Some(index); + } + } + if let Some(index) = remove_index { + self.quote_form.items.remove(index); + } + ui.add_space(10.0); + ui.horizontal(|ui| { + if ui.button("Speichern").clicked() { + self.save_quote(); + } + if ui + .add_enabled( + self.selected_quote_id.is_some(), + egui::Button::new("Stornieren"), + ) + .clicked() + { + self.delete_quote(); + } + }); + ui.label(&self.quotes_status); + }); + }, + ); + } + + fn outgoing_invoices_view(&mut self, ui: &mut egui::Ui) { + page_header( + ui, + "Rechnungen", + "Ausgangsrechnungen erstellen und abschließen.", + ); + master_detail!( + ui, + { + panel(ui, |ui| { + ui.set_min_width(300.0); + if ui.button("Neue Rechnung").clicked() { + self.selected_outgoing_invoice_id = None; + self.outgoing_invoice_form = OutgoingInvoiceForm::default(); + self.outgoing_invoices_status = + "Rechnungsnummer wird reserviert.".to_string(); + self.reserve_next_number("outgoing_invoices"); + } + ui.text_edit_singleline(&mut self.outgoing_invoice_list_search); + ui.add_space(6.0); + let invoice_query = self.outgoing_invoice_list_search.trim().to_lowercase(); + let filtered_invoices: Vec = self + .outgoing_invoices + .iter() + .filter(|invoice| { + let customer = self + .customers + .iter() + .find(|customer| customer.id == invoice.customer_id) + .map(|customer| customer.name.as_str()) + .unwrap_or("-"); + invoice_query.is_empty() + || format!( + "{} {} {}", + invoice.invoice_number, customer, invoice.status + ) + .to_lowercase() + .contains(&invoice_query) + }) + .cloned() + .collect(); + for invoice in filtered_invoices { + let customer = self + .customers + .iter() + .find(|customer| customer.id == invoice.customer_id) + .map(|customer| customer.name.as_str()) + .unwrap_or("-"); + if ui + .selectable_label( + self.selected_outgoing_invoice_id.as_deref() == Some(&invoice.id), + format!( + "{} {} {}{}", + invoice.invoice_number, + customer, + invoice.status, + invoice + .finalized_at + .as_deref() + .map(|_| " abgeschlossen") + .unwrap_or("") + ), + ) + .clicked() + { + self.selected_outgoing_invoice_id = Some(invoice.id.clone()); + self.outgoing_invoice_form = OutgoingInvoiceForm::from(&invoice); + } + } + }); + }, + { + panel(ui, |ui| { + ui.set_min_width(680.0); + form_row(ui, "Rechnungsnummer", |ui| { + ui.label(number_or_pending( + &self.outgoing_invoice_form.invoice_number, + )); + }); + form_row(ui, "Kunde", |ui| { + customer_combo( + ui, + &mut self.outgoing_invoice_form.customer_id, + &self.customers, + &mut self.customer_lookup_search, + ); + }); + form_row(ui, "Status", |ui| { + ui.text_edit_singleline(&mut self.outgoing_invoice_form.status); + }); + form_row(ui, "Ausgestellt", |ui| { + ui.text_edit_singleline( + self.outgoing_invoice_form + .issued_at + .get_or_insert(String::new()), + ); + }); + form_row(ui, "Fällig", |ui| { + ui.text_edit_singleline( + self.outgoing_invoice_form + .due_at + .get_or_insert(String::new()), + ); + }); + form_row(ui, "Kundenrabatt %", |ui| { + ui.text_edit_singleline( + &mut self.outgoing_invoice_form.customer_discount_percent, + ); + }); + invoice_items_editor( + ui, + &mut self.outgoing_invoice_form.items, + &self.items, + &mut self.item_lookup_search, + ); + ui.horizontal(|ui| { + if ui.button("Speichern").clicked() { + self.save_outgoing_invoice(); + } + if ui + .add_enabled( + self.selected_outgoing_invoice_id.is_some(), + egui::Button::new("Abschließen"), + ) + .clicked() + { + self.finalize_outgoing_invoice(); + } + if ui + .add_enabled( + self.selected_outgoing_invoice_id.is_some(), + egui::Button::new("Stornieren"), + ) + .clicked() + { + self.delete_outgoing_invoice(); + } + }); + ui.label(&self.outgoing_invoices_status); + }); + }, + ); + } + + fn incoming_invoices_view(&mut self, ui: &mut egui::Ui) { + page_header(ui, "Eingangsrechnungen", "Lieferantenrechnungen erfassen."); + master_detail!( + ui, + { + panel(ui, |ui| { + ui.set_min_width(300.0); + if ui.button("Neue Eingangsrechnung").clicked() { + self.selected_incoming_invoice_id = None; + self.incoming_invoice_form = IncomingInvoiceForm::default(); + self.incoming_invoices_status = + "Eingangsrechnungsnummer wird reserviert.".to_string(); + self.reserve_next_number("incoming_invoices"); + } + ui.text_edit_singleline(&mut self.incoming_invoice_list_search); + ui.add_space(6.0); + let invoice_query = self.incoming_invoice_list_search.trim().to_lowercase(); + let filtered_invoices: Vec = self + .incoming_invoices + .iter() + .filter(|invoice| { + let supplier = self + .suppliers + .iter() + .find(|supplier| supplier.id == invoice.supplier_id) + .map(|supplier| supplier.name.as_str()) + .unwrap_or("-"); + invoice_query.is_empty() + || format!( + "{} {} {}", + invoice.invoice_number, supplier, invoice.status + ) + .to_lowercase() + .contains(&invoice_query) + }) + .cloned() + .collect(); + for invoice in filtered_invoices { + let supplier = self + .suppliers + .iter() + .find(|supplier| supplier.id == invoice.supplier_id) + .map(|supplier| supplier.name.as_str()) + .unwrap_or("-"); + if ui + .selectable_label( + self.selected_incoming_invoice_id.as_deref() == Some(&invoice.id), + format!( + "{} {} {}", + invoice.invoice_number, supplier, invoice.status + ), + ) + .clicked() + { + self.selected_incoming_invoice_id = Some(invoice.id.clone()); + self.incoming_invoice_form = IncomingInvoiceForm::from(&invoice); + } + } + }); + }, + { + panel(ui, |ui| { + ui.set_min_width(680.0); + form_row(ui, "Rechnungsnummer", |ui| { + ui.label(number_or_pending( + &self.incoming_invoice_form.invoice_number, + )); + }); + form_row(ui, "Lieferant", |ui| { + supplier_combo( + ui, + &mut self.incoming_invoice_form.supplier_id, + &self.suppliers, + &mut self.supplier_lookup_search, + ); + }); + form_row(ui, "Status", |ui| { + ui.text_edit_singleline(&mut self.incoming_invoice_form.status); + }); + form_row(ui, "Datum", |ui| { + ui.text_edit_singleline( + self.incoming_invoice_form + .invoice_date + .get_or_insert(String::new()), + ); + }); + form_row(ui, "Fällig", |ui| { + ui.text_edit_singleline( + self.incoming_invoice_form + .due_at + .get_or_insert(String::new()), + ); + }); + incoming_invoice_items_editor( + ui, + &mut self.incoming_invoice_form.items, + &self.items, + &mut self.item_lookup_search, + ); + ui.horizontal(|ui| { + if ui.button("Speichern").clicked() { + self.save_incoming_invoice(); + } + if ui + .add_enabled( + self.selected_incoming_invoice_id.is_some(), + egui::Button::new("Stornieren"), + ) + .clicked() + { + self.delete_incoming_invoice(); + } + }); + ui.label(&self.incoming_invoices_status); + }); + }, + ); + } + + fn activities_view(&mut self, ui: &mut egui::Ui) { + page_header(ui, "Aktivitäten", "Aufgaben und Notizen."); + master_detail!( + ui, + { + panel(ui, |ui| { + ui.set_min_width(250.0); + if ui.button("Neue Aktivität").clicked() { + self.selected_activity_id = None; + self.activity_form = ActivityForm::default(); + self.activities_status = "Aktivitätsnummer wird reserviert.".to_string(); + self.reserve_next_number("activities"); + } + ui.text_edit_singleline(&mut self.activity_list_search); + ui.add_space(6.0); + let filtered_activities: Vec = self + .activities + .iter() + .filter(|record| { + matches_number_or_name( + record + .activity_number + .as_deref() + .unwrap_or(&record.activity_type), + &record.title, + &self.activity_list_search, + ) + }) + .cloned() + .collect(); + for record in filtered_activities { + if ui + .selectable_label( + self.selected_activity_id.as_deref() == Some(&record.id), + format!( + "{} {}", + record + .activity_number + .as_deref() + .unwrap_or(&record.activity_type), + record.title + ), + ) + .clicked() + { + self.selected_activity_id = Some(record.id.clone()); + self.activity_form = ActivityForm::from(&record); + } + } + }); + }, + { + panel(ui, |ui| { + ui.set_min_width(450.0); + form_row(ui, "Titel", |ui| { + ui.text_edit_singleline(&mut self.activity_form.title); + }); + form_row(ui, "Aktivitätsnummer", |ui| { + ui.label(number_or_pending( + self.activity_form.activity_number.as_deref().unwrap_or(""), + )); + }); + form_row(ui, "Typ", |ui| { + ui.text_edit_singleline(&mut self.activity_form.activity_type); + }); + form_row(ui, "Status", |ui| { + ui.text_edit_singleline(&mut self.activity_form.status); + }); + form_row(ui, "Priorität", |ui| { + ui.text_edit_singleline(&mut self.activity_form.priority); + }); + form_row(ui, "Beschreibung", |ui| { + ui.text_edit_multiline(&mut self.activity_form.body); + }); + ui.horizontal(|ui| { + if ui.button("Speichern").clicked() { + self.save_activity(); + } + if ui + .add_enabled( + self.selected_activity_id.is_some(), + egui::Button::new("Stornieren"), + ) + .clicked() + { + self.delete_activity(); + } + }); + ui.label(&self.activities_status); + }); + }, + ); + } +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +enum AppView { + Login, + Status, + Register, +} + +type RegistrationResult = Result; +type LoginResult = Result; +type DevBootstrapResult = Result; +type UsersResult = Result, String>; +type RegistrationsResult = Result, String>; +type NumberRangesResult = Result, String>; +type CustomersResult = Result, String>; +type SuppliersResult = Result, String>; +type CashDiscountTermsResult = Result, String>; +type ItemsResult = Result, String>; +type ItemPriceHistoryResult = Result, String>; +type QuotesResult = Result, String>; +type OutgoingInvoicesResult = Result, String>; +type IncomingInvoicesResult = Result, String>; +type ActivitiesResult = Result, String>; +type ApiConnectorsResult = Result, String>; +type PriceRulesResult = Result, String>; +type EmptyResult = Result<(), String>; + +#[derive(Debug, Clone)] +enum UserAdminEvent { + UsersLoaded(UsersResult), + InvitationSent(Result), + RolesSaved { + user_id: String, + result: EmptyResult, + }, +} + +#[derive(Debug, Clone)] +enum AdminEvent { + NavigationSettingsLoaded(Result), + NavigationSettingsSaved(Result), + OrganizationSetupSaved(EmptyResult), + OrganizationSetupLoaded(Result, String>), + RegistrationsLoaded(RegistrationsResult), + RegistrationActionDone(Result), + NumberRangesLoaded(NumberRangesResult), + NumberRangeSaved(Result), + NextNumberReserved { + code: String, + result: Result, + }, + CustomersLoaded(CustomersResult), + CustomerSaved(Result), + CustomerDeleted(EmptyResult), + SuppliersLoaded(SuppliersResult), + SupplierSaved(Result), + SupplierDeleted(EmptyResult), + CashDiscountTermsLoaded(CashDiscountTermsResult), + CashDiscountTermSaved(Result), + CashDiscountTermDeleted(EmptyResult), + ItemsLoaded(ItemsResult), + ItemSaved(Result), + ItemDeleted(EmptyResult), + ItemPriceHistoryLoaded(ItemPriceHistoryResult), + QuotesLoaded(QuotesResult), + QuoteSaved(Result), + QuoteDeleted(EmptyResult), + OutgoingInvoicesLoaded(OutgoingInvoicesResult), + OutgoingInvoiceSaved(Result), + OutgoingInvoiceDeleted(EmptyResult), + OutgoingInvoiceFinalized(EmptyResult), + IncomingInvoicesLoaded(IncomingInvoicesResult), + IncomingInvoiceSaved(Result), + IncomingInvoiceDeleted(EmptyResult), + ActivitiesLoaded(ActivitiesResult), + ActivitySaved(Result), + ActivityDeleted(EmptyResult), + PriceImportPreviewed(Result), + PriceImportApplied(Result), + ApiConnectorsLoaded(ApiConnectorsResult), + ApiConnectorSaved(Result), + ApiConnectorDeleted(EmptyResult), + ApiConnectorSynced(Result), + PriceRulesLoaded(PriceRulesResult), + PriceRuleSaved(Result), + PriceRuleDeleted(EmptyResult), +} + +#[derive(Debug, Clone, Deserialize)] +struct LoginResponse { + user_id: String, + access_token: String, + organization_id: Option, + must_change_password: bool, + organizations: Vec, +} + +#[derive(Debug, Clone, Deserialize)] +struct LoginOrganization { + id: String, + schema_name: Option, + status: String, +} + +#[derive(Debug, Serialize)] +struct LoginRequest { + email: String, + password: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +struct UserNavigationSettings { + mode: NavigationMode, +} + +#[derive(Debug, Clone, Deserialize)] +struct DevBootstrapResponse { + organization_id: String, + schema_name: String, + user_id: String, + email: String, + password: String, + dev_mode: bool, +} + +#[derive(Debug, Serialize)] +struct DevBootstrapRequest { + organization_name: String, + email: String, +} + +#[derive(Debug, Clone, Deserialize)] +struct RegistrationResponse { + id: String, + status: String, +} + +#[derive(Debug, Serialize)] +struct RegistrationRequest { + organization_name: String, + email: String, + accept_terms: bool, +} + +#[derive(Debug, Clone, Deserialize)] +struct OrganizationUser { + user_id: String, + email: String, + status: String, + roles: Vec, +} + +#[derive(Debug, Serialize)] +struct InviteUserRequest { + email: String, + roles: Vec, +} + +#[derive(Debug, Serialize)] +struct UpdateUserRolesRequest { + roles: Vec, +} + +#[derive(Debug, Clone, Deserialize, Serialize)] +struct OrganizationSetupForm { + display_name: String, + legal_form: String, + street: String, + postal_code: String, + city: String, + country: String, + vat_id: String, + email: String, + phone: String, + default_tax_rate: String, + default_payment_days: String, +} + +#[derive(Debug, Clone, Deserialize)] +struct OrganizationSetupResponse { + setup: Option, +} + +impl Default for OrganizationSetupForm { + fn default() -> Self { + Self { + display_name: String::new(), + legal_form: String::new(), + street: String::new(), + postal_code: String::new(), + city: String::new(), + country: "Deutschland".to_string(), + vat_id: String::new(), + email: String::new(), + phone: String::new(), + default_tax_rate: "19".to_string(), + default_payment_days: "14".to_string(), + } + } +} + +#[derive(Debug, Clone, Deserialize)] +struct OrganizationRegistration { + id: String, + organization_name: String, + email: String, + status: String, + requested_at: String, +} + +#[derive(Debug, Clone, Deserialize)] +struct ApproveRegistrationResponse { + dev_initial_password: String, +} + +#[derive(Debug, Clone, Deserialize)] +struct NumberRange { + id: String, + code: String, + pattern: String, + counter_value: i64, + counter_padding: i32, + reset_rule: Option, + is_active: bool, +} + +#[derive(Debug, Clone, Deserialize)] +struct NextNumberResponse { + number: String, +} + +#[derive(Debug, Clone, Serialize)] +struct NumberRangeForm { + pattern: String, + counter_value: i64, + counter_padding: i32, + reset_rule: Option, + is_active: bool, +} + +impl Default for NumberRangeForm { + fn default() -> Self { + Self { + pattern: "{counter}".to_string(), + counter_value: 0, + counter_padding: 9, + reset_rule: None, + is_active: true, + } + } +} + +impl From<&NumberRange> for NumberRangeForm { + fn from(value: &NumberRange) -> Self { + Self { + pattern: value.pattern.clone(), + counter_value: value.counter_value, + counter_padding: value.counter_padding, + reset_rule: value.reset_rule.clone(), + is_active: value.is_active, + } + } +} + +#[derive(Debug, Clone, Default, Deserialize, Serialize)] +struct CustomerDetails { + street: String, + postal_code: String, + city: String, + country: String, + email: String, + phone: String, +} + +#[derive(Debug, Clone, Deserialize)] +struct Customer { + id: String, + customer_number: String, + name: String, + status: String, + details: CustomerDetails, + standard_discount_percent: String, + cash_discount_term_id: Option, +} + +#[derive(Debug, Clone, Serialize)] +struct CustomerForm { + customer_number: String, + name: String, + status: String, + details: CustomerDetails, + standard_discount_percent: String, + cash_discount_term_id: Option, +} + +impl Default for CustomerForm { + fn default() -> Self { + Self { + customer_number: String::new(), + name: String::new(), + status: "active".to_string(), + details: CustomerDetails { + country: "Deutschland".to_string(), + ..Default::default() + }, + standard_discount_percent: "0".to_string(), + cash_discount_term_id: None, + } + } +} + +impl From<&Customer> for CustomerForm { + fn from(customer: &Customer) -> Self { + Self { + customer_number: customer.customer_number.clone(), + name: customer.name.clone(), + status: customer.status.clone(), + details: customer.details.clone(), + standard_discount_percent: customer.standard_discount_percent.clone(), + cash_discount_term_id: customer.cash_discount_term_id.clone(), + } + } +} + +#[derive(Debug, Clone, Deserialize)] +struct Supplier { + id: String, + supplier_number: String, + name: String, + status: String, + details: CustomerDetails, + standard_discount_percent: String, + cash_discount_term_id: Option, + payment_days: Option, +} + +#[derive(Debug, Clone, Serialize)] +struct SupplierForm { + supplier_number: String, + name: String, + status: String, + details: CustomerDetails, + standard_discount_percent: String, + cash_discount_term_id: Option, + payment_days: Option, +} + +impl Default for SupplierForm { + fn default() -> Self { + Self { + supplier_number: String::new(), + name: String::new(), + status: "active".to_string(), + details: CustomerDetails { + country: "Deutschland".to_string(), + ..Default::default() + }, + standard_discount_percent: "0".to_string(), + cash_discount_term_id: None, + payment_days: Some(14), + } + } +} +impl From<&Supplier> for SupplierForm { + fn from(value: &Supplier) -> Self { + Self { + supplier_number: value.supplier_number.clone(), + name: value.name.clone(), + status: value.status.clone(), + details: value.details.clone(), + standard_discount_percent: value.standard_discount_percent.clone(), + cash_discount_term_id: value.cash_discount_term_id.clone(), + payment_days: value.payment_days, + } + } +} + +#[derive(Debug, Clone, Deserialize)] +struct CashDiscountTerm { + id: String, + code: String, + name: String, + discount_percent: String, + discount_days: i32, + net_days: Option, + valid_from: Option, + valid_until: Option, + is_default_customer_term: bool, + is_default_supplier_term: bool, + is_active: bool, +} + +#[derive(Debug, Clone, Serialize)] +struct CashDiscountTermForm { + code: String, + name: String, + discount_percent: String, + discount_days: i32, + net_days: Option, + valid_from: Option, + valid_until: Option, + is_default_customer_term: bool, + is_default_supplier_term: bool, + is_active: bool, +} + +impl Default for CashDiscountTermForm { + fn default() -> Self { + Self { + code: String::new(), + name: String::new(), + discount_percent: "2".to_string(), + discount_days: 10, + net_days: Some(30), + valid_from: None, + valid_until: None, + is_default_customer_term: false, + is_default_supplier_term: false, + is_active: true, + } + } +} + +impl From<&CashDiscountTerm> for CashDiscountTermForm { + fn from(value: &CashDiscountTerm) -> Self { + Self { + code: value.code.clone(), + name: value.name.clone(), + discount_percent: value.discount_percent.clone(), + discount_days: value.discount_days, + net_days: value.net_days, + valid_from: value.valid_from.clone(), + valid_until: value.valid_until.clone(), + is_default_customer_term: value.is_default_customer_term, + is_default_supplier_term: value.is_default_supplier_term, + is_active: value.is_active, + } + } +} + +#[derive(Debug, Clone, Deserialize)] +struct Item { + id: String, + item_number: String, + name: String, + unit: String, + tax_rate: String, + default_purchase_price: Option, + default_sales_price: Option, + status: String, +} + +#[derive(Debug, Clone, Deserialize)] +struct ItemPriceHistory { + id: String, + item_id: String, + purchase_price: Option, + sales_price: Option, + source: String, + valid_from: String, + created_by_user_id: Option, + created_at: String, +} +#[derive(Debug, Clone, Serialize)] +struct ItemForm { + item_number: String, + name: String, + unit: String, + tax_rate: String, + default_purchase_price: String, + default_sales_price: String, + status: String, +} +impl Default for ItemForm { + fn default() -> Self { + Self { + item_number: String::new(), + name: String::new(), + unit: "Stk".to_string(), + tax_rate: "19".to_string(), + default_purchase_price: "0".to_string(), + default_sales_price: "0".to_string(), + status: "active".to_string(), + } + } +} +impl From<&Item> for ItemForm { + fn from(value: &Item) -> Self { + Self { + item_number: value.item_number.clone(), + name: value.name.clone(), + unit: value.unit.clone(), + tax_rate: value.tax_rate.clone(), + default_purchase_price: value.default_purchase_price.clone().unwrap_or_default(), + default_sales_price: value.default_sales_price.clone().unwrap_or_default(), + status: value.status.clone(), + } + } +} + +#[derive(Debug, Clone, Deserialize)] +struct Quote { + id: String, + quote_number: String, + customer_id: String, + status: String, + valid_until: Option, + cash_discount_term_id: Option, + customer_discount_percent: String, + notes: String, + items: Vec, +} + +#[derive(Debug, Clone, Deserialize)] +#[allow(dead_code)] +struct QuoteItem { + id: String, + line_number: i32, + item_id: String, + description: String, + quantity: String, + unit_price: String, + original_unit_price: Option, + discount_percent: String, + tax_rate: String, + price_overridden: bool, +} + +#[derive(Debug, Clone, Serialize)] +struct QuoteForm { + quote_number: String, + customer_id: String, + status: String, + valid_until: Option, + cash_discount_term_id: Option, + customer_discount_percent: String, + notes: String, + items: Vec, +} + +#[derive(Debug, Clone, Serialize)] +struct QuoteItemForm { + item_id: String, + description: String, + quantity: String, + unit_price: String, + original_unit_price: Option, + discount_percent: String, + tax_rate: String, +} + +impl Default for QuoteForm { + fn default() -> Self { + Self { + quote_number: String::new(), + customer_id: String::new(), + status: "draft".to_string(), + valid_until: None, + cash_discount_term_id: None, + customer_discount_percent: "0".to_string(), + notes: String::new(), + items: vec![QuoteItemForm::default()], + } + } +} + +impl Default for QuoteItemForm { + fn default() -> Self { + Self { + item_id: String::new(), + description: String::new(), + quantity: "1".to_string(), + unit_price: "0".to_string(), + original_unit_price: None, + discount_percent: "0".to_string(), + tax_rate: "19".to_string(), + } + } +} + +impl From<&Quote> for QuoteForm { + fn from(value: &Quote) -> Self { + Self { + quote_number: value.quote_number.clone(), + customer_id: value.customer_id.clone(), + status: value.status.clone(), + valid_until: value.valid_until.clone(), + cash_discount_term_id: value.cash_discount_term_id.clone(), + customer_discount_percent: value.customer_discount_percent.clone(), + notes: value.notes.clone(), + items: value.items.iter().map(QuoteItemForm::from).collect(), + } + } +} + +impl From<&QuoteItem> for QuoteItemForm { + fn from(value: &QuoteItem) -> Self { + Self { + item_id: value.item_id.clone(), + description: value.description.clone(), + quantity: value.quantity.clone(), + unit_price: value.unit_price.clone(), + original_unit_price: value.original_unit_price.clone(), + discount_percent: value.discount_percent.clone(), + tax_rate: value.tax_rate.clone(), + } + } +} + +#[derive(Debug, Clone, Deserialize)] +struct OutgoingInvoice { + id: String, + invoice_number: String, + customer_id: String, + status: String, + cash_discount_term_id: Option, + customer_discount_percent: String, + issued_at: Option, + due_at: Option, + source_quote_id: Option, + finalized_at: Option, + items: Vec, +} + +#[derive(Debug, Clone, Deserialize)] +#[allow(dead_code)] +struct OutgoingInvoiceItem { + id: String, + line_number: i32, + item_id: String, + description: String, + quantity: String, + unit_price: String, + original_unit_price: Option, + discount_percent: String, + tax_rate: String, + price_overridden: bool, +} + +#[derive(Debug, Clone, Serialize)] +struct OutgoingInvoiceForm { + invoice_number: String, + customer_id: String, + status: String, + cash_discount_term_id: Option, + customer_discount_percent: String, + issued_at: Option, + due_at: Option, + source_quote_id: Option, + items: Vec, +} + +#[derive(Debug, Clone, Serialize)] +struct OutgoingInvoiceItemForm { + item_id: String, + description: String, + quantity: String, + unit_price: String, + original_unit_price: Option, + discount_percent: String, + tax_rate: String, +} + +impl Default for OutgoingInvoiceForm { + fn default() -> Self { + Self { + invoice_number: String::new(), + customer_id: String::new(), + status: "draft".to_string(), + cash_discount_term_id: None, + customer_discount_percent: "0".to_string(), + issued_at: None, + due_at: None, + source_quote_id: None, + items: vec![OutgoingInvoiceItemForm::default()], + } + } +} + +impl Default for OutgoingInvoiceItemForm { + fn default() -> Self { + Self { + item_id: String::new(), + description: String::new(), + quantity: "1".to_string(), + unit_price: "0".to_string(), + original_unit_price: None, + discount_percent: "0".to_string(), + tax_rate: "19".to_string(), + } + } +} + +impl From<&OutgoingInvoice> for OutgoingInvoiceForm { + fn from(value: &OutgoingInvoice) -> Self { + Self { + invoice_number: value.invoice_number.clone(), + customer_id: value.customer_id.clone(), + status: value.status.clone(), + cash_discount_term_id: value.cash_discount_term_id.clone(), + customer_discount_percent: value.customer_discount_percent.clone(), + issued_at: value.issued_at.clone(), + due_at: value.due_at.clone(), + source_quote_id: value.source_quote_id.clone(), + items: value + .items + .iter() + .map(OutgoingInvoiceItemForm::from) + .collect(), + } + } +} + +impl From<&OutgoingInvoiceItem> for OutgoingInvoiceItemForm { + fn from(value: &OutgoingInvoiceItem) -> Self { + Self { + item_id: value.item_id.clone(), + description: value.description.clone(), + quantity: value.quantity.clone(), + unit_price: value.unit_price.clone(), + original_unit_price: value.original_unit_price.clone(), + discount_percent: value.discount_percent.clone(), + tax_rate: value.tax_rate.clone(), + } + } +} + +#[derive(Debug, Clone, Deserialize)] +struct IncomingInvoice { + id: String, + invoice_number: String, + supplier_id: String, + status: String, + cash_discount_term_id: Option, + invoice_date: Option, + due_at: Option, + items: Vec, +} + +#[derive(Debug, Clone, Deserialize)] +#[allow(dead_code)] +struct IncomingInvoiceItem { + id: String, + line_number: i32, + item_id: Option, + description: String, + quantity: String, + unit_price: String, + tax_rate: String, +} + +#[derive(Debug, Clone, Serialize)] +struct IncomingInvoiceForm { + invoice_number: String, + supplier_id: String, + status: String, + cash_discount_term_id: Option, + invoice_date: Option, + due_at: Option, + items: Vec, +} + +#[derive(Debug, Clone, Serialize)] +struct IncomingInvoiceItemForm { + item_id: Option, + description: String, + quantity: String, + unit_price: String, + tax_rate: String, +} + +impl Default for IncomingInvoiceForm { + fn default() -> Self { + Self { + invoice_number: String::new(), + supplier_id: String::new(), + status: "received".to_string(), + cash_discount_term_id: None, + invoice_date: None, + due_at: None, + items: vec![IncomingInvoiceItemForm::default()], + } + } +} + +impl Default for IncomingInvoiceItemForm { + fn default() -> Self { + Self { + item_id: None, + description: String::new(), + quantity: "1".to_string(), + unit_price: "0".to_string(), + tax_rate: "19".to_string(), + } + } +} + +impl From<&IncomingInvoice> for IncomingInvoiceForm { + fn from(value: &IncomingInvoice) -> Self { + Self { + invoice_number: value.invoice_number.clone(), + supplier_id: value.supplier_id.clone(), + status: value.status.clone(), + cash_discount_term_id: value.cash_discount_term_id.clone(), + invoice_date: value.invoice_date.clone(), + due_at: value.due_at.clone(), + items: value + .items + .iter() + .map(IncomingInvoiceItemForm::from) + .collect(), + } + } +} + +impl From<&IncomingInvoiceItem> for IncomingInvoiceItemForm { + fn from(value: &IncomingInvoiceItem) -> Self { + Self { + item_id: value.item_id.clone(), + description: value.description.clone(), + quantity: value.quantity.clone(), + unit_price: value.unit_price.clone(), + tax_rate: value.tax_rate.clone(), + } + } +} + +#[derive(Debug, Clone, Deserialize)] +struct Activity { + id: String, + activity_number: Option, + activity_type: String, + title: String, + body: String, + status: String, + priority: String, + due_at: Option, +} +#[derive(Debug, Clone, Serialize)] +struct ActivityForm { + activity_number: Option, + activity_type: String, + title: String, + body: String, + status: String, + priority: String, + due_at: Option, +} +impl Default for ActivityForm { + fn default() -> Self { + Self { + activity_number: None, + activity_type: "task".to_string(), + title: String::new(), + body: String::new(), + status: "open".to_string(), + priority: "normal".to_string(), + due_at: None, + } + } +} +impl From<&Activity> for ActivityForm { + fn from(value: &Activity) -> Self { + Self { + activity_number: value.activity_number.clone(), + activity_type: value.activity_type.clone(), + title: value.title.clone(), + body: value.body.clone(), + status: value.status.clone(), + priority: value.priority.clone(), + due_at: value.due_at.clone(), + } + } +} + +#[derive(Debug, Clone, Serialize)] +struct PriceListImportForm { + source_name: String, + content: String, + delimiter: Option, +} + +impl Default for PriceListImportForm { + fn default() -> Self { + Self { + source_name: "Preisliste.csv".to_string(), + content: "item_number;name;unit;tax_rate;purchase_price;sales_price\nAR-IMPORT-1;Importartikel;Stk;19;10.00;25.00".to_string(), + delimiter: Some(";".to_string()), + } + } +} + +#[derive(Debug, Clone, Deserialize)] +struct PriceListImportPreview { + rows: Vec, + total_rows: usize, + valid_rows: usize, + error_rows: usize, +} + +#[derive(Debug, Clone, Deserialize)] +struct PriceListImportRow { + row_number: usize, + item_number: String, + name: String, + unit: String, + tax_rate: String, + purchase_price: Option, + sales_price: Option, + action: String, + error: Option, +} + +#[derive(Debug, Clone, Deserialize)] +struct PriceListImportApplyResponse { + import_id: String, + applied_rows: usize, + error_rows: usize, +} + +#[derive(Debug, Clone, Deserialize)] +struct ApiConnector { + id: String, + code: String, + name: String, + connector_type: String, + config: serde_json::Value, + is_active: bool, + sync_interval_minutes: Option, + last_sync_at: Option, +} + +#[derive(Debug, Clone)] +struct ApiConnectorForm { + code: String, + name: String, + connector_type: String, + config: String, + is_active: bool, + sync_interval_minutes: Option, +} + +#[derive(Debug, Clone, Serialize)] +struct ApiConnectorPayload { + code: String, + name: String, + connector_type: String, + config: serde_json::Value, + is_active: bool, + sync_interval_minutes: Option, +} + +impl Default for ApiConnectorForm { + fn default() -> Self { + Self { + code: String::new(), + name: String::new(), + connector_type: "generic_price_api".to_string(), + config: "{\n \"base_url\": \"https://example.invalid\",\n \"api_key\": \"dev\"\n}" + .to_string(), + is_active: true, + sync_interval_minutes: Some(1440), + } + } +} + +impl ApiConnectorForm { + fn payload(&self) -> Result { + Ok(ApiConnectorPayload { + code: self.code.clone(), + name: self.name.clone(), + connector_type: self.connector_type.clone(), + config: serde_json::from_str(self.config.trim().if_empty("{}"))?, + is_active: self.is_active, + sync_interval_minutes: self.sync_interval_minutes, + }) + } +} + +trait EmptyStrFallback { + fn if_empty<'a>(&'a self, fallback: &'a str) -> &'a str; +} + +impl EmptyStrFallback for str { + fn if_empty<'a>(&'a self, fallback: &'a str) -> &'a str { + if self.is_empty() { + fallback + } else { + self + } + } +} + +impl From<&ApiConnector> for ApiConnectorForm { + fn from(value: &ApiConnector) -> Self { + Self { + code: value.code.clone(), + name: value.name.clone(), + connector_type: value.connector_type.clone(), + config: serde_json::to_string_pretty(&value.config) + .unwrap_or_else(|_| "{}".to_string()), + is_active: value.is_active, + sync_interval_minutes: value.sync_interval_minutes, + } + } +} + +#[derive(Debug, Clone, Deserialize)] +struct ApiConnectorSyncResponse { + synced: bool, + id: String, + applied_rows: usize, + error_rows: usize, +} + +#[derive(Debug, Clone, Deserialize)] +struct PriceRule { + id: String, + code: String, + name: String, + source_type: String, + source_id: Option, + markup_percent: String, + rounding_mode: String, + is_active: bool, +} + +#[derive(Debug, Clone, Serialize)] +struct PriceRuleForm { + code: String, + name: String, + source_type: String, + source_id: Option, + markup_percent: String, + rounding_mode: String, + is_active: bool, +} + +impl Default for PriceRuleForm { + fn default() -> Self { + Self { + code: String::new(), + name: String::new(), + source_type: "import".to_string(), + source_id: None, + markup_percent: "0.00".to_string(), + rounding_mode: "none".to_string(), + is_active: true, + } + } +} + +impl From<&PriceRule> for PriceRuleForm { + fn from(value: &PriceRule) -> Self { + Self { + code: value.code.clone(), + name: value.name.clone(), + source_type: value.source_type.clone(), + source_id: value.source_id.clone(), + markup_percent: value.markup_percent.clone(), + rounding_mode: value.rounding_mode.clone(), + is_active: value.is_active, + } + } +} + +async fn login_user(api_base_url: &str, email: String, password: String) -> LoginResult { + let url = format!("{}/api/v1/auth/login", api_base_url.trim_end_matches('/')); + let response = reqwest::Client::new() + .post(url) + .json(&LoginRequest { email, password }) + .send() + .await + .map_err(|error| format!("Login fehlgeschlagen: {error}"))?; + + let status = response.status(); + let text = response + .text() + .await + .map_err(|error| format!("Antwort konnte nicht gelesen werden: {error}"))?; + + if !status.is_success() { + let message = serde_json::from_str::(&text) + .ok() + .and_then(|value| { + value + .get("message") + .and_then(|item| item.as_str()) + .map(str::to_string) + }) + .unwrap_or_else(|| format!("HTTP {status}")); + return Err(message); + } + + serde_json::from_str(&text).map_err(|error| format!("Antwort ist ungültig: {error}")) +} + +async fn get_user_navigation_settings( + api_base_url: &str, + access_token: &str, +) -> Result { + let url = format!( + "{}/api/v1/users/me/settings/navigation", + api_base_url.trim_end_matches('/') + ); + let response = reqwest::Client::new() + .get(url) + .bearer_auth(access_token) + .send() + .await + .map_err(|error| format!("Menüeinstellung konnte nicht geladen werden: {error}"))?; + + let status = response.status(); + let text = response + .text() + .await + .map_err(|error| format!("Antwort konnte nicht gelesen werden: {error}"))?; + + if !status.is_success() { + return Err(error_message_from_response(status, &text)); + } + + serde_json::from_str(&text).map_err(|error| format!("Antwort ist ungültig: {error}")) +} + +async fn put_user_navigation_settings( + api_base_url: &str, + access_token: &str, + settings: UserNavigationSettings, +) -> Result { + let url = format!( + "{}/api/v1/users/me/settings/navigation", + api_base_url.trim_end_matches('/') + ); + let response = reqwest::Client::new() + .put(url) + .bearer_auth(access_token) + .json(&settings) + .send() + .await + .map_err(|error| format!("Menüeinstellung konnte nicht gespeichert werden: {error}"))?; + + let status = response.status(); + let text = response + .text() + .await + .map_err(|error| format!("Antwort konnte nicht gelesen werden: {error}"))?; + + if !status.is_success() { + return Err(error_message_from_response(status, &text)); + } + + serde_json::from_str(&text).map_err(|error| format!("Antwort ist ungültig: {error}")) +} + +async fn dev_bootstrap_local( + api_base_url: &str, + organization_name: String, + email: String, +) -> DevBootstrapResult { + let url = format!( + "{}/api/v1/dev/bootstrap-local", + api_base_url.trim_end_matches('/') + ); + let response = reqwest::Client::new() + .post(url) + .json(&DevBootstrapRequest { + organization_name, + email, + }) + .send() + .await + .map_err(|error| format!("Dev-Bootstrap fehlgeschlagen: {error}"))?; + + let status = response.status(); + let text = response + .text() + .await + .map_err(|error| format!("Antwort konnte nicht gelesen werden: {error}"))?; + + if !status.is_success() { + let message = serde_json::from_str::(&text) + .ok() + .and_then(|value| { + value + .get("message") + .and_then(|item| item.as_str()) + .map(str::to_string) + }) + .unwrap_or_else(|| format!("HTTP {status}")); + return Err(message); + } + + serde_json::from_str(&text).map_err(|error| format!("Antwort ist ungültig: {error}")) +} + +async fn register_organization( + api_base_url: &str, + organization_name: String, + email: String, + accept_terms: bool, +) -> RegistrationResult { + let url = format!( + "{}/api/v1/registration/organization", + api_base_url.trim_end_matches('/') + ); + let response = reqwest::Client::new() + .post(url) + .json(&RegistrationRequest { + organization_name, + email, + accept_terms, + }) + .send() + .await + .map_err(|error| format!("Registrierung fehlgeschlagen: {error}"))?; + + let status = response.status(); + let text = response + .text() + .await + .map_err(|error| format!("Antwort konnte nicht gelesen werden: {error}"))?; + + if !status.is_success() { + let message = serde_json::from_str::(&text) + .ok() + .and_then(|value| { + value + .get("message") + .and_then(|item| item.as_str()) + .map(str::to_string) + }) + .unwrap_or_else(|| format!("HTTP {status}")); + return Err(message); + } + + serde_json::from_str(&text).map_err(|error| format!("Antwort ist ungültig: {error}")) +} + +async fn list_users(api_base_url: &str, access_token: &str) -> UsersResult { + let url = format!( + "{}/api/v1/organizations/current/users", + api_base_url.trim_end_matches('/') + ); + let response = reqwest::Client::new() + .get(url) + .bearer_auth(access_token) + .send() + .await + .map_err(|error| format!("Benutzer konnten nicht geladen werden: {error}"))?; + + let status = response.status(); + let text = response + .text() + .await + .map_err(|error| format!("Antwort konnte nicht gelesen werden: {error}"))?; + + if !status.is_success() { + return Err(error_message_from_response(status, &text)); + } + + serde_json::from_str(&text).map_err(|error| format!("Antwort ist ungültig: {error}")) +} + +async fn invite_organization_user( + api_base_url: &str, + access_token: &str, + email: String, + roles: Vec, +) -> EmptyResult { + let url = format!( + "{}/api/v1/organizations/current/invitations", + api_base_url.trim_end_matches('/') + ); + let response = reqwest::Client::new() + .post(url) + .bearer_auth(access_token) + .json(&InviteUserRequest { email, roles }) + .send() + .await + .map_err(|error| format!("Einladung fehlgeschlagen: {error}"))?; + + let status = response.status(); + let text = response + .text() + .await + .map_err(|error| format!("Antwort konnte nicht gelesen werden: {error}"))?; + + if status.is_success() { + Ok(()) + } else { + Err(error_message_from_response(status, &text)) + } +} + +async fn update_user_roles( + api_base_url: &str, + access_token: &str, + user_id: &str, + roles: Vec, +) -> EmptyResult { + let url = format!( + "{}/api/v1/organizations/current/users/{}/roles", + api_base_url.trim_end_matches('/'), + user_id + ); + let response = reqwest::Client::new() + .patch(url) + .bearer_auth(access_token) + .json(&UpdateUserRolesRequest { roles }) + .send() + .await + .map_err(|error| format!("Benutzerrechte konnten nicht gespeichert werden: {error}"))?; + + let status = response.status(); + let text = response + .text() + .await + .map_err(|error| format!("Antwort konnte nicht gelesen werden: {error}"))?; + + if status.is_success() { + Ok(()) + } else { + Err(error_message_from_response(status, &text)) + } +} + +async fn save_organization_setup( + api_base_url: &str, + access_token: &str, + payload: OrganizationSetupForm, +) -> EmptyResult { + let url = format!( + "{}/api/v1/organizations/current/setup", + api_base_url.trim_end_matches('/') + ); + let response = reqwest::Client::new() + .put(url) + .bearer_auth(access_token) + .json(&payload) + .send() + .await + .map_err(|error| format!("Firmendaten konnten nicht gespeichert werden: {error}"))?; + + let status = response.status(); + let text = response + .text() + .await + .map_err(|error| format!("Antwort konnte nicht gelesen werden: {error}"))?; + + if status.is_success() { + Ok(()) + } else { + Err(error_message_from_response(status, &text)) + } +} + +async fn load_organization_setup( + api_base_url: &str, + access_token: &str, +) -> Result, String> { + let url = format!( + "{}/api/v1/organizations/current/setup", + api_base_url.trim_end_matches('/') + ); + let response = reqwest::Client::new() + .get(url) + .bearer_auth(access_token) + .send() + .await + .map_err(|error| format!("Firmendaten konnten nicht geladen werden: {error}"))?; + + let status = response.status(); + let text = response + .text() + .await + .map_err(|error| format!("Antwort konnte nicht gelesen werden: {error}"))?; + + if !status.is_success() { + return Err(error_message_from_response(status, &text)); + } + + let data = serde_json::from_str::(&text) + .map_err(|error| format!("Antwort ist ungültig: {error}"))?; + Ok(data.setup) +} + +async fn list_registrations(api_base_url: &str) -> RegistrationsResult { + let url = format!( + "{}/api/v1/admin/organization-registrations", + api_base_url.trim_end_matches('/') + ); + let response = reqwest::Client::new() + .get(url) + .send() + .await + .map_err(|error| format!("Registrierungen konnten nicht geladen werden: {error}"))?; + + let status = response.status(); + let text = response + .text() + .await + .map_err(|error| format!("Antwort konnte nicht gelesen werden: {error}"))?; + + if !status.is_success() { + return Err(error_message_from_response(status, &text)); + } + + serde_json::from_str(&text).map_err(|error| format!("Antwort ist ungültig: {error}")) +} + +async fn approve_registration( + api_base_url: &str, + registration_id: &str, +) -> Result { + let url = format!( + "{}/api/v1/admin/organization-registrations/{}/approve", + api_base_url.trim_end_matches('/'), + registration_id + ); + let response = reqwest::Client::new() + .post(url) + .json(&serde_json::json!({})) + .send() + .await + .map_err(|error| format!("Freischaltung fehlgeschlagen: {error}"))?; + + let status = response.status(); + let text = response + .text() + .await + .map_err(|error| format!("Antwort konnte nicht gelesen werden: {error}"))?; + + if !status.is_success() { + return Err(error_message_from_response(status, &text)); + } + + serde_json::from_str(&text).map_err(|error| format!("Antwort ist ungültig: {error}")) +} + +async fn list_customers(api_base_url: &str, access_token: &str) -> CustomersResult { + let url = format!("{}/api/v1/customers", api_base_url.trim_end_matches('/')); + let response = reqwest::Client::new() + .get(url) + .bearer_auth(access_token) + .send() + .await + .map_err(|error| format!("Kunden konnten nicht geladen werden: {error}"))?; + let status = response.status(); + let text = response + .text() + .await + .map_err(|error| format!("Antwort konnte nicht gelesen werden: {error}"))?; + if !status.is_success() { + return Err(error_message_from_response(status, &text)); + } + serde_json::from_str(&text).map_err(|error| format!("Antwort ist ungültig: {error}")) +} + +async fn save_customer( + api_base_url: &str, + access_token: &str, + customer_id: Option, + payload: CustomerForm, +) -> Result { + let client = reqwest::Client::new(); + let response = if let Some(customer_id) = customer_id { + client + .put(format!( + "{}/api/v1/customers/{}", + api_base_url.trim_end_matches('/'), + customer_id + )) + .bearer_auth(access_token) + .json(&payload) + .send() + .await + } else { + client + .post(format!( + "{}/api/v1/customers", + api_base_url.trim_end_matches('/') + )) + .bearer_auth(access_token) + .json(&payload) + .send() + .await + } + .map_err(|error| format!("Kunde konnte nicht gespeichert werden: {error}"))?; + let status = response.status(); + let text = response + .text() + .await + .map_err(|error| format!("Antwort konnte nicht gelesen werden: {error}"))?; + if !status.is_success() { + return Err(error_message_from_response(status, &text)); + } + serde_json::from_str(&text).map_err(|error| format!("Antwort ist ungültig: {error}")) +} + +async fn delete_customer(api_base_url: &str, access_token: &str, customer_id: &str) -> EmptyResult { + let response = reqwest::Client::new() + .delete(format!( + "{}/api/v1/customers/{}", + api_base_url.trim_end_matches('/'), + customer_id + )) + .bearer_auth(access_token) + .send() + .await + .map_err(|error| format!("Kunde konnte nicht deaktiviert werden: {error}"))?; + let status = response.status(); + let text = response + .text() + .await + .map_err(|error| format!("Antwort konnte nicht gelesen werden: {error}"))?; + if status.is_success() { + Ok(()) + } else { + Err(error_message_from_response(status, &text)) + } +} + +async fn list_master_records Deserialize<'de>>( + api_base_url: &str, + access_token: &str, + path: &str, +) -> Result, String> { + let response = reqwest::Client::new() + .get(format!("{}{}", api_base_url.trim_end_matches('/'), path)) + .bearer_auth(access_token) + .send() + .await + .map_err(|error| format!("Daten konnten nicht geladen werden: {error}"))?; + let status = response.status(); + let text = response + .text() + .await + .map_err(|error| format!("Antwort konnte nicht gelesen werden: {error}"))?; + if !status.is_success() { + return Err(error_message_from_response(status, &text)); + } + serde_json::from_str(&text).map_err(|error| format!("Antwort ist ungültig: {error}")) +} + +async fn save_master_record Deserialize<'de>>( + api_base_url: &str, + access_token: &str, + path: &str, + id: Option, + payload: P, +) -> Result { + let client = reqwest::Client::new(); + let request = if let Some(id) = id { + client.put(format!( + "{}{}/{}", + api_base_url.trim_end_matches('/'), + path, + id + )) + } else { + client.post(format!("{}{}", api_base_url.trim_end_matches('/'), path)) + }; + let response = request + .bearer_auth(access_token) + .json(&payload) + .send() + .await + .map_err(|error| format!("Datensatz konnte nicht gespeichert werden: {error}"))?; + let status = response.status(); + let text = response + .text() + .await + .map_err(|error| format!("Antwort konnte nicht gelesen werden: {error}"))?; + if !status.is_success() { + return Err(error_message_from_response(status, &text)); + } + serde_json::from_str(&text).map_err(|error| format!("Antwort ist ungültig: {error}")) +} + +async fn save_master_record_without_id Deserialize<'de>>( + api_base_url: &str, + access_token: &str, + path: &str, + payload: P, +) -> Result { + let response = reqwest::Client::new() + .put(format!("{}{}", api_base_url.trim_end_matches('/'), path)) + .bearer_auth(access_token) + .json(&payload) + .send() + .await + .map_err(|error| format!("Datensatz konnte nicht gespeichert werden: {error}"))?; + let status = response.status(); + let text = response + .text() + .await + .map_err(|error| format!("Antwort konnte nicht gelesen werden: {error}"))?; + if !status.is_success() { + return Err(error_message_from_response(status, &text)); + } + serde_json::from_str(&text).map_err(|error| format!("Antwort ist ungültig: {error}")) +} + +async fn post_master_record Deserialize<'de>>( + api_base_url: &str, + access_token: &str, + path: &str, + payload: P, +) -> Result { + let response = reqwest::Client::new() + .post(format!("{}{}", api_base_url.trim_end_matches('/'), path)) + .bearer_auth(access_token) + .json(&payload) + .send() + .await + .map_err(|error| format!("Aktion konnte nicht ausgeführt werden: {error}"))?; + let status = response.status(); + let text = response + .text() + .await + .map_err(|error| format!("Antwort konnte nicht gelesen werden: {error}"))?; + if !status.is_success() { + return Err(error_message_from_response(status, &text)); + } + serde_json::from_str(&text).map_err(|error| format!("Antwort ist ungültig: {error}")) +} + +async fn reserve_next_number( + api_base_url: &str, + access_token: &str, + code: &str, +) -> Result { + let path = format!("/api/v1/number-ranges/{code}/next"); + let response: NextNumberResponse = + post_master_record(api_base_url, access_token, &path, serde_json::json!({})).await?; + Ok(response.number) +} + +async fn post_empty_action(api_base_url: &str, access_token: &str, path: &str) -> EmptyResult { + let response = reqwest::Client::new() + .post(format!("{}{}", api_base_url.trim_end_matches('/'), path)) + .bearer_auth(access_token) + .json(&serde_json::json!({})) + .send() + .await + .map_err(|error| format!("Aktion konnte nicht ausgeführt werden: {error}"))?; + let status = response.status(); + let text = response + .text() + .await + .map_err(|error| format!("Antwort konnte nicht gelesen werden: {error}"))?; + if status.is_success() { + Ok(()) + } else { + Err(error_message_from_response(status, &text)) + } +} + +async fn delete_master_record( + api_base_url: &str, + access_token: &str, + path: &str, + id: &str, +) -> EmptyResult { + let response = reqwest::Client::new() + .delete(format!( + "{}{}/{}", + api_base_url.trim_end_matches('/'), + path, + id + )) + .bearer_auth(access_token) + .send() + .await + .map_err(|error| format!("Datensatz konnte nicht deaktiviert werden: {error}"))?; + let status = response.status(); + let text = response + .text() + .await + .map_err(|error| format!("Antwort konnte nicht gelesen werden: {error}"))?; + if status.is_success() { + Ok(()) + } else { + Err(error_message_from_response(status, &text)) + } +} + +fn error_message_from_response(status: reqwest::StatusCode, text: &str) -> String { + serde_json::from_str::(text) + .ok() + .and_then(|value| { + value + .get("message") + .and_then(|item| item.as_str()) + .map(str::to_string) + }) + .unwrap_or_else(|| format!("HTTP {status}")) +} diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..f4f64fa --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,33 @@ +services: + postgres: + image: postgres:16 + environment: + POSTGRES_USER: companytool + POSTGRES_PASSWORD: companytool + POSTGRES_DB: companytool + ports: + - "5432:5432" + volumes: + - companytool-postgres:/var/lib/postgresql/data + + backend: + build: + context: . + dockerfile: backend/Dockerfile + profiles: + - backend + depends_on: + - postgres + environment: + DATABASE_URL: postgres://companytool:companytool@postgres:5432/companytool + BACKEND_BIND: 0.0.0.0:8080 + COMPANYTOOL_EMAIL_TRANSPORT: outbox + COMPANYTOOL_DOCUMENT_STORAGE_DIR: /var/lib/companytool/documents + ports: + - "8080:8080" + volumes: + - companytool-documents:/var/lib/companytool/documents + +volumes: + companytool-postgres: + companytool-documents: diff --git a/images/icons/companytool-logo.png b/images/icons/companytool-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..0f73f7f09fa49c8e8f5ff349143af8ec451a4bcf GIT binary patch literal 63147 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 XAh|r4A&)U>00000NkvXXu0mjfdy{^_ literal 0 HcmV?d00001 diff --git a/images/icons/logo.png b/images/icons/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..3f403eb708dc686c2804f7146d6045061c11d9a6 GIT binary patch literal 1149079 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

p1^RPH|@7B7KD4*g_C68KAO|x@efjASKPd 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�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%0AO$i4AyQK5tmZ^ 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%0D;mTO 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 gUQlp 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 z�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

avZjyAFbK=Blh)tC&c72oxD6 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

!jEA??Fl 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íy*?nRk0)yP7) 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

V$um&(+ReF4Ot4Jp;k@~~nzGLT^4?%at@4*OE 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˹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 bBJ%$S!znu1m&s`F00000NkvXXu0mjfldgh# literal 0 HcmV?d00001 diff --git a/scripts/api-onboarding-test.mjs b/scripts/api-onboarding-test.mjs new file mode 100644 index 0000000..c65fd24 --- /dev/null +++ b/scripts/api-onboarding-test.mjs @@ -0,0 +1,495 @@ +#!/usr/bin/env node + +const baseUrl = process.argv[2] ?? process.env.API_BASE_URL ?? "http://127.0.0.1:8080"; +const email = `admin+${Date.now()}@example.com`; + +async function request(method, path, body, token, options = {}) { + const response = await fetch(`${baseUrl}${path}`, { + method, + headers: { + "Content-Type": "application/json", + ...(token ? { Authorization: `Bearer ${token}` } : {}), + }, + body: body === undefined ? undefined : JSON.stringify(body), + }); + const text = await response.text(); + const data = text ? parseResponseBody(text) : {}; + const expectedStatus = options.expectedStatus; + + if (expectedStatus !== undefined) { + if (response.status !== expectedStatus) { + throw new Error(`${method} ${path} expected ${expectedStatus}, got ${response.status}: ${JSON.stringify(data)}`); + } + return data; + } + + if (!response.ok) { + throw new Error(`${method} ${path} failed: ${response.status} ${JSON.stringify(data)}`); + } + + return data; +} + +function parseResponseBody(text) { + try { + return JSON.parse(text); + } catch { + return { message: text }; + } +} + +function assert(condition, message) { + if (!condition) throw new Error(message); +} + +async function main() { + console.log(`testing onboarding api via ${baseUrl}`); + + const registration = await request("POST", "/api/v1/registration/organization", { + organization_name: "Muster GmbH", + email, + accept_terms: true, + }); + assert(registration.id, "registration id missing"); + console.log(`registered ${registration.id}`); + + const registrations = await request("GET", "/api/v1/admin/organization-registrations"); + assert( + registrations.some((item) => item.id === registration.id), + "registration not found in list", + ); + + const detail = await request( + "GET", + `/api/v1/admin/organization-registrations/${registration.id}`, + ); + assert(detail.organization_name === "Muster GmbH", "organization name did not decrypt"); + assert(detail.email === email, "registration email mismatch"); + + const approval = await request( + "POST", + `/api/v1/admin/organization-registrations/${registration.id}/approve`, + ); + assert(approval.organization_id, "organization id missing"); + assert(approval.schema_name?.startsWith("company_"), "schema name missing"); + assert(approval.dev_initial_password, "dev initial password missing"); + console.log(`approved ${approval.organization_id}`); + + const login = await request("POST", "/api/v1/auth/login", { + email, + password: approval.dev_initial_password, + }); + assert(login.must_change_password === true, "must_change_password should be true"); + assert(login.access_token, "access token missing"); + assert(login.organization_id, "selected organization missing"); + assert(login.organizations.length >= 1, "login organizations missing"); + const token = login.access_token; + + const selected = await request( + "POST", + "/api/v1/auth/select-organization", + { organization_id: login.organization_id }, + token, + ); + assert(selected.selected === true, "organization was not selected"); + + const users = await request("GET", "/api/v1/organizations/current/users", undefined, token); + assert(users.length >= 1, "users list is empty"); + assert(users.some((user) => user.email === email), "owner user missing"); + + const setup = await request("PUT", "/api/v1/organizations/current/setup", { + display_name: "Muster GmbH", + legal_form: "GmbH", + street: "Musterstrasse 1", + postal_code: "12345", + city: "Musterstadt", + country: "Deutschland", + vat_id: "", + email: "info@example.com", + phone: "", + default_tax_rate: "19", + default_payment_days: "14", + }, token); + assert(setup.saved === true, "organization setup was not saved"); + + const loadedSetup = await request("GET", "/api/v1/organizations/current/setup", undefined, token); + assert(loadedSetup.setup?.display_name === "Muster GmbH", "organization setup was not loaded"); + assert(loadedSetup.setup?.street === "Musterstrasse 1", "organization setup street mismatch"); + + const numberRanges = await request("GET", "/api/v1/number-ranges", undefined, token); + assert(numberRanges.some((range) => range.code === "customers" && range.pattern === "KU{counter}"), "customer number range missing"); + assert(numberRanges.some((range) => range.code === "items" && range.pattern === "AR{counter}"), "item number range missing"); + assert(numberRanges.some((range) => range.code === "activities" && range.pattern === "AK{counter}"), "activity number range missing"); + assert(numberRanges.some((range) => range.code === "outgoing_invoices" && range.pattern === "AR{counter}"), "invoice number range missing"); + + const cashDiscountTerm = await request("POST", "/api/v1/cash-discount-terms", { + code: "2-10-30", + name: "2 % Skonto bei Zahlung innerhalb von 10 Tagen", + discount_percent: "2.00", + discount_days: 10, + net_days: 30, + valid_from: null, + valid_until: null, + is_default_customer_term: true, + is_default_supplier_term: true, + is_active: true, + }, token); + assert(cashDiscountTerm.id, "cash discount term id missing"); + const cashDiscountTerms = await request("GET", "/api/v1/cash-discount-terms", undefined, token); + assert(cashDiscountTerms.some((term) => term.id === cashDiscountTerm.id), "cash discount term missing"); + + const createdCustomer = await request("POST", "/api/v1/customers", { + customer_number: "", + name: "Beispielkunde GmbH", + status: "active", + details: { + street: "Kundenstraße 4", + postal_code: "54321", + city: "Kundenstadt", + country: "Deutschland", + email: "kunde@example.com", + phone: "01234 56789", + }, + standard_discount_percent: "5.50", + cash_discount_term_id: cashDiscountTerm.id, + }, token); + assert(createdCustomer.id, "customer id missing"); + assert(/^KU\d{3}\.\d{3}\.\d{3}$/.test(createdCustomer.customer_number), "customer number was not generated"); + + const customers = await request("GET", "/api/v1/customers", undefined, token); + const listedCustomer = customers.find((customer) => customer.id === createdCustomer.id); + assert(listedCustomer?.name === "Beispielkunde GmbH", "customer name was not loaded"); + assert(listedCustomer?.details.city === "Kundenstadt", "customer details were not loaded"); + assert(listedCustomer?.standard_discount_percent.startsWith("5.5"), "customer discount missing"); + assert(listedCustomer?.cash_discount_term_id === cashDiscountTerm.id, "customer cash discount missing"); + + const updatedCustomer = await request("PUT", `/api/v1/customers/${createdCustomer.id}`, { + ...createdCustomer, + name: "Beispielkunde AG", + standard_discount_percent: "7.00", + }, token); + assert(updatedCustomer.name === "Beispielkunde AG", "customer update failed"); + + const supplier = await request("POST", "/api/v1/suppliers", { + supplier_number: "", + name: "Beispiellieferant GmbH", + status: "active", + details: { street: "Lieferweg 1", postal_code: "10115", city: "Berlin", country: "Deutschland", email: "lieferant@example.com", phone: "" }, + standard_discount_percent: "2.00", + cash_discount_term_id: cashDiscountTerm.id, + payment_days: 30, + }, token); + assert(/^LI\d{3}\.\d{3}\.\d{3}$/.test(supplier.supplier_number), "supplier number was not generated"); + const suppliers = await request("GET", "/api/v1/suppliers", undefined, token); + assert(suppliers.some((record) => record.id === supplier.id && record.details.city === "Berlin"), "supplier CRUD failed"); + assert(suppliers.some((record) => record.id === supplier.id && record.cash_discount_term_id === cashDiscountTerm.id), "supplier cash discount missing"); + + const item = await request("POST", "/api/v1/items", { + item_number: "", + name: "Montagestunde", + unit: "Std", + tax_rate: "19", + default_purchase_price: "40.00", + default_sales_price: "85.00", + status: "active", + }, token); + assert(/^AR\d{3}\.\d{3}\.\d{3}$/.test(item.item_number), "item number was not generated"); + const updatedItem = await request("PUT", `/api/v1/items/${item.id}`, { ...item, default_sales_price: "95.00" }, token); + assert(updatedItem.default_sales_price === "95.00", "item update failed"); + const priceHistory = await request("GET", `/api/v1/items/${item.id}/prices`, undefined, token); + assert(priceHistory.length >= 2, "item price history missing"); + assert(priceHistory.some((entry) => entry.sales_price?.startsWith("95")), "updated item price history missing"); + + const priceListContent = [ + "item_number;name;unit;tax_rate;purchase_price;sales_price", + "IMP-100;Importartikel;Stk;19;10.00;25.00", + `${item.item_number};Montagestunde Import;Std;19;42.00;99.00`, + ].join("\n"); + const importPreview = await request("POST", "/api/v1/imports/price-list/preview", { + source_name: "api-test-price-list.csv", + delimiter: ";", + content: priceListContent, + }, token); + assert(importPreview.total_rows === 2, "price import preview row count mismatch"); + assert(importPreview.valid_rows === 2, "price import preview valid rows mismatch"); + assert(importPreview.rows.some((row) => row.item_number === "IMP-100" && row.action === "create"), "price import create action missing"); + assert(importPreview.rows.some((row) => row.item_number === item.item_number && row.action === "update"), "price import update action missing"); + + const importApply = await request("POST", "/api/v1/imports/price-list/apply", { + source_name: "api-test-price-list.csv", + delimiter: ";", + content: priceListContent, + }, token); + assert(importApply.import_id, "price import id missing"); + assert(importApply.applied_rows === 2, "price import applied rows mismatch"); + assert(importApply.error_rows === 0, "price import errors mismatch"); + + const importedItems = await request("GET", "/api/v1/items", undefined, token); + assert(importedItems.some((record) => record.item_number === "IMP-100" && record.name === "Importartikel"), "imported item missing"); + const reloadedItem = importedItems.find((record) => record.id === item.id); + assert(reloadedItem?.default_sales_price?.startsWith("99"), "imported item price update missing"); + const importedPriceHistory = await request("GET", `/api/v1/items/${item.id}/prices`, undefined, token); + assert(importedPriceHistory.some((entry) => entry.source.startsWith("import:") && entry.sales_price?.startsWith("99")), "import price history missing"); + + const connector = await request("POST", "/api/v1/api-connectors", { + code: "demo_price_api", + name: "Demo Preis API", + connector_type: "demo", + config: { + base_url: "https://example.test/api", + token: "secret", + delimiter: ";", + price_list_csv: [ + "item_number;name;unit;tax_rate;purchase_price;sales_price", + "IMP-100;Importartikel API;Stk;19;11.00;27.00", + ].join("\n"), + }, + is_active: true, + sync_interval_minutes: 60, + }, token); + assert(connector.id, "api connector id missing"); + assert(connector.config?.token === "secret", "api connector config roundtrip failed"); + const connectors = await request("GET", "/api/v1/api-connectors", undefined, token); + assert(connectors.some((record) => record.id === connector.id && record.config?.base_url === "https://example.test/api"), "api connector list missing"); + const connectorSync = await request("POST", `/api/v1/api-connectors/${connector.id}/sync`, {}, token); + assert(connectorSync.synced === true, "api connector sync failed"); + assert(connectorSync.applied_rows === 1, "api connector price sync did not apply rows"); + const syncedItems = await request("GET", "/api/v1/items", undefined, token); + assert(syncedItems.some((record) => record.item_number === "IMP-100" && record.default_sales_price?.startsWith("27")), "api connector price update missing"); + const deletedConnector = await request("DELETE", `/api/v1/api-connectors/${connector.id}`, undefined, token); + assert(deletedConnector.deleted === true, "api connector deactivate failed"); + + const priceRule = await request("POST", "/api/v1/price-rules", { + code: "standard_import_markup", + name: "Standardaufschlag Import", + source_type: "import", + source_id: null, + markup_percent: "25.00", + rounding_mode: "cent", + is_active: true, + }, token); + assert(priceRule.id, "price rule id missing"); + const priceRules = await request("GET", "/api/v1/price-rules", undefined, token); + assert(priceRules.some((record) => record.id === priceRule.id && record.markup_percent.startsWith("25")), "price rule list missing"); + const updatedPriceRule = await request("PUT", `/api/v1/price-rules/${priceRule.id}`, { + ...priceRule, + markup_percent: "30.00", + rounding_mode: "five_cent", + }, token); + assert(updatedPriceRule.rounding_mode === "five_cent", "price rule update failed"); + const deletedPriceRule = await request("DELETE", `/api/v1/price-rules/${priceRule.id}`, undefined, token); + assert(deletedPriceRule.deleted === true, "price rule deactivate failed"); + + const quote = await request("POST", "/api/v1/quotes", { + quote_number: "", + customer_id: createdCustomer.id, + status: "draft", + valid_until: null, + cash_discount_term_id: cashDiscountTerm.id, + customer_discount_percent: "7.00", + notes: "Erstes Testangebot.", + items: [{ + item_id: item.id, + description: "Montagestunde mit Sonderpreis", + quantity: "2.00", + unit_price: "90.00", + original_unit_price: "95.00", + discount_percent: "0.00", + tax_rate: "19.00", + }], + }, token); + assert(/^AN\d{3}\.\d{3}\.\d{3}$/.test(quote.quote_number), "quote number was not generated"); + assert(quote.items.length === 1, "quote item missing"); + assert(quote.items[0].price_overridden === true, "quote price override missing"); + + const quotes = await request("GET", "/api/v1/quotes", undefined, token); + assert(quotes.some((record) => record.id === quote.id && record.notes.includes("Testangebot")), "quote was not loaded"); + const updatedQuote = await request("PUT", `/api/v1/quotes/${quote.id}`, { + ...quote, + status: "sent", + items: quote.items.map((line) => ({ ...line, quantity: "3.00" })), + }, token); + assert(updatedQuote.status === "sent", "quote update failed"); + const convertedInvoice = await request("POST", `/api/v1/quotes/${quote.id}/convert-to-invoice`, undefined, token); + assert(/^AR\d{3}\.\d{3}\.\d{3}$/.test(convertedInvoice.invoice_number), "converted invoice number missing"); + assert(convertedInvoice.source_quote_id === quote.id, "converted invoice quote link missing"); + assert(convertedInvoice.items.length === 1, "converted invoice item missing"); + const invoices = await request("GET", "/api/v1/outgoing-invoices", undefined, token); + assert(invoices.some((record) => record.id === convertedInvoice.id), "outgoing invoice was not loaded"); + const finalized = await request("POST", `/api/v1/outgoing-invoices/${convertedInvoice.id}/finalize`, undefined, token); + assert(finalized.finalized === true, "outgoing invoice finalize failed"); + const deletedQuote = await request("DELETE", `/api/v1/quotes/${quote.id}`, undefined, token); + assert(deletedQuote.deleted === true, "quote cancel failed"); + + const incomingInvoice = await request("POST", "/api/v1/incoming-invoices", { + invoice_number: "EXT-10001", + supplier_id: supplier.id, + status: "received", + cash_discount_term_id: cashDiscountTerm.id, + invoice_date: null, + due_at: null, + items: [{ + item_id: item.id, + description: "Einkauf Montagestunde", + quantity: "1.00", + unit_price: "40.00", + tax_rate: "19.00", + }], + }, token); + assert(incomingInvoice.id, "incoming invoice id missing"); + assert(incomingInvoice.cash_discount_term_id === cashDiscountTerm.id, "incoming invoice cash discount missing"); + const incomingInvoices = await request("GET", "/api/v1/incoming-invoices", undefined, token); + assert(incomingInvoices.some((record) => record.id === incomingInvoice.id), "incoming invoice was not loaded"); + const deletedIncomingInvoice = await request("DELETE", `/api/v1/incoming-invoices/${incomingInvoice.id}`, undefined, token); + assert(deletedIncomingInvoice.deleted === true, "incoming invoice cancel failed"); + + const deletedItem = await request("DELETE", `/api/v1/items/${item.id}`, undefined, token); + assert(deletedItem.deleted === true, "item deactivate failed"); + + const deletedSupplier = await request("DELETE", `/api/v1/suppliers/${supplier.id}`, undefined, token); + assert(deletedSupplier.deleted === true, "supplier deactivate failed"); + + const deletedCustomer = await request("DELETE", `/api/v1/customers/${createdCustomer.id}`, undefined, token); + assert(deletedCustomer.deleted === true, "customer deactivate failed"); + + const activity = await request("POST", "/api/v1/activities", { + activity_number: null, + activity_type: "task", + title: "Angebot prüfen", + body: "Preise mit Kunde abstimmen.", + status: "open", + priority: "high", + due_at: null, + }, token); + assert(/^AK\d{3}\.\d{3}\.\d{3}$/.test(activity.activity_number), "activity number was not generated"); + const activities = await request("GET", "/api/v1/activities", undefined, token); + assert(activities.some((record) => record.id === activity.id && record.body.includes("Preise")), "activity CRUD failed"); + const deletedActivity = await request("DELETE", `/api/v1/activities/${activity.id}`, undefined, token); + assert(deletedActivity.deleted === true, "activity cancel failed"); + + const communication = await request("POST", "/api/v1/communications", { + communication_type: "email", + direction: "outbound", + subject: "Rückfrage zum Angebot", + body: "Kunde bittet um aktualisierte Dokumente.", + status: "open", + occurred_at: null, + links: [{ entity_type: "customer", entity_id: createdCustomer.id }], + }, token); + assert(communication.id, "communication id missing"); + assert(communication.subject === "Rückfrage zum Angebot", "communication subject mismatch"); + assert(communication.links.some((link) => link.entity_id === createdCustomer.id), "communication link missing"); + const communications = await request("GET", "/api/v1/communications", undefined, token); + assert(communications.some((record) => record.id === communication.id), "communication list missing"); + + const documentContent = Buffer.from("Dokumentinhalt für Phase 6", "utf8").toString("base64"); + const documentRecord = await request("POST", "/api/v1/documents", { + title: "Testdokument", + description: "Dokument für Phase 6", + file_name: "phase-6.txt", + content_type: "text/plain", + content_base64: documentContent, + links: [{ entity_type: "communication", entity_id: communication.id }], + }, token); + assert(documentRecord.id, "document id missing"); + assert(documentRecord.latest_version?.file_name === "phase-6.txt", "document metadata missing"); + const documents = await request("GET", "/api/v1/documents", undefined, token); + assert(documents.some((record) => record.id === documentRecord.id), "document list missing"); + const downloadedDocument = await request("GET", `/api/v1/documents/${documentRecord.id}/download`, undefined, token); + assert(downloadedDocument.content_base64 === documentContent, "document download content mismatch"); + const auditLog = await request("GET", `/api/v1/documents/${documentRecord.id}/audit-log`, undefined, token); + assert(auditLog.some((entry) => entry.action === "upload"), "document upload audit missing"); + assert(auditLog.some((entry) => entry.action === "download"), "document download audit missing"); + const deletedDocument = await request("DELETE", `/api/v1/documents/${documentRecord.id}`, undefined, token); + assert(deletedDocument.deleted === true, "document archive failed"); + + const invitedEmail = `user+${Date.now()}@example.com`; + const invitation = await request("POST", "/api/v1/organizations/current/invitations", { + email: invitedEmail, + roles: ["viewer"], + }, token); + assert(invitation.id, "invitation id missing"); + assert(invitation.dev_invitation_token, "dev invitation token missing"); + + const invitedUsers = await request("GET", "/api/v1/organizations/current/users", undefined, token); + const invitedUser = invitedUsers.find((user) => user.user_id === invitation.user_id); + assert(invitedUser, "invited user missing"); + const acceptedInvitation = await request("POST", "/api/v1/auth/accept-invitation", { + token: invitation.dev_invitation_token, + new_password: "InvitePass123", + new_password_confirm: "InvitePass123", + }); + assert(acceptedInvitation.accepted === true, "invitation accept failed"); + const invitedLogin = await request("POST", "/api/v1/auth/login", { + email: invitedEmail, + password: "InvitePass123", + }); + assert(invitedLogin.access_token, "invited user login failed"); + assert(invitedLogin.organization_id, "invited user selected organization missing"); + const invitedToken = invitedLogin.access_token; + + await request( + "POST", + "/api/v1/auth/select-organization", + { organization_id: invitedLogin.organization_id }, + invitedToken, + ); + + const deniedCustomerWrite = await request("POST", "/api/v1/customers", { + customer_number: "", + name: "Nicht erlaubt GmbH", + status: "active", + details: { + street: "Sperrweg 1", + postal_code: "12345", + city: "Teststadt", + country: "Deutschland", + email: "nicht-erlaubt@example.test", + phone: "", + }, + standard_discount_percent: "0", + cash_discount_term_id: null, + }, invitedToken, { expectedStatus: 403 }); + assert(deniedCustomerWrite.message === "Berechtigung fehlt", "viewer customer write was not forbidden"); + + const deniedRoleWrite = await request( + "PATCH", + `/api/v1/organizations/current/users/${invitation.user_id}/roles`, + { roles: ["admin"] }, + invitedToken, + { expectedStatus: 403 }, + ); + assert(deniedRoleWrite.message === "Berechtigung fehlt", "viewer role write was not forbidden"); + + await request( + "PATCH", + `/api/v1/organizations/current/users/${invitation.user_id}/roles`, + { roles: ["sales", "viewer"] }, + token, + ); + const updatedUsers = await request("GET", "/api/v1/organizations/current/users", undefined, token); + const updatedUser = updatedUsers.find((user) => user.user_id === invitation.user_id); + assert(updatedUser.roles.includes("sales"), "role change was not saved"); + + const resetRequest = await request("POST", "/api/v1/auth/request-password-reset", { email }); + assert(resetRequest.queued === true, "password reset request failed"); + assert(resetRequest.dev_reset_token, "dev reset token missing"); + const resetPassword = await request("POST", "/api/v1/auth/reset-password", { + token: resetRequest.dev_reset_token, + new_password: "ResetPass123", + new_password_confirm: "ResetPass123", + }); + assert(resetPassword.changed === true, "password reset failed"); + const resetLogin = await request("POST", "/api/v1/auth/login", { + email, + password: "ResetPass123", + }); + assert(resetLogin.access_token, "login after password reset failed"); + + console.log("onboarding api test ok"); +} + +main().catch((error) => { + console.error(error); + process.exit(1); +}); diff --git a/scripts/communication-test.mjs b/scripts/communication-test.mjs new file mode 100644 index 0000000..997b510 --- /dev/null +++ b/scripts/communication-test.mjs @@ -0,0 +1,258 @@ +#!/usr/bin/env node + +import { webcrypto } from "node:crypto"; +import assert from "node:assert/strict"; + +const wsUrl = process.argv[2] ?? process.env.WS_URL ?? "ws://localhost:8080/ws"; +const apiBaseUrl = process.argv[3] ?? process.env.API_BASE_URL; +const protocolVersion = 1; + +const encoder = new TextEncoder(); +const decoder = new TextDecoder(); + +function bytesToBase64(bytes) { + return Buffer.from(bytes).toString("base64"); +} + +function base64ToBytes(value) { + return Buffer.from(value, "base64"); +} + +async function createSession() { + const key = await webcrypto.subtle.generateKey( + { name: "AES-GCM", length: 256 }, + true, + ["encrypt", "decrypt"], + ); + const rawKey = await webcrypto.subtle.exportKey("raw", key); + + return { + key, + keyId: webcrypto.randomUUID(), + exportedKey: bytesToBase64(new Uint8Array(rawKey)), + }; +} + +async function encryptMessage(session, message) { + const nonce = webcrypto.getRandomValues(new Uint8Array(12)); + const plaintext = encoder.encode(JSON.stringify(message)); + const ciphertext = await webcrypto.subtle.encrypt( + { name: "AES-GCM", iv: nonce }, + session.key, + plaintext, + ); + + return { + enc: `aes-256-gcm-v${protocolVersion}`, + key_id: session.keyId, + nonce: bytesToBase64(nonce), + ciphertext: bytesToBase64(new Uint8Array(ciphertext)), + }; +} + +async function decryptMessage(session, envelope) { + const plaintext = await webcrypto.subtle.decrypt( + { name: "AES-GCM", iv: base64ToBytes(envelope.nonce) }, + session.key, + base64ToBytes(envelope.ciphertext), + ); + + return JSON.parse(decoder.decode(plaintext)); +} + +function waitForOpen(socket) { + return new Promise((resolve, reject) => { + socket.addEventListener("open", resolve, { once: true }); + socket.addEventListener("error", reject, { once: true }); + }); +} + +function waitForRawMessage(socket, timeoutMs = 5000) { + return new Promise((resolve, reject) => { + const timeout = setTimeout(() => { + socket.removeEventListener("message", onMessage); + reject(new Error(`timeout after ${timeoutMs}ms`)); + }, timeoutMs); + + function onMessage(event) { + clearTimeout(timeout); + resolve(String(event.data)); + } + + socket.addEventListener("message", onMessage, { once: true }); + }); +} + +async function waitForDecryptedType(client, expectedType, timeoutMs = 5000) { + const deadline = Date.now() + timeoutMs; + + while (Date.now() < deadline) { + const raw = await waitForRawMessage(client.socket, Math.max(100, deadline - Date.now())); + const wire = JSON.parse(raw); + + assert.equal(wire.type, "encrypted", `${client.name}: expected encrypted wire message`); + assert.equal(wire.payload.key_id, client.session.keyId, `${client.name}: key id mismatch`); + assertNoPlaintext(raw, client.name); + + const message = await decryptMessage(client.session, wire.payload); + if (message.type === expectedType) { + return message; + } + } + + throw new Error(`${client.name}: did not receive ${expectedType}`); +} + +async function waitForRecordChanged(client, expectedTitle, timeoutMs = 5000) { + const deadline = Date.now() + timeoutMs; + + while (Date.now() < deadline) { + const message = await waitForDecryptedType( + client, + "record_changed", + Math.max(100, deadline - Date.now()), + ); + if (!expectedTitle || message.payload.record?.title === expectedTitle) { + return message; + } + } + + throw new Error(`${client.name}: did not receive record_changed ${expectedTitle}`); +} + +function assertNoPlaintext(raw, clientName) { + for (const forbidden of ["snapshot", "record_changed", "Erster Datensatz", "records"]) { + assert.equal( + raw.includes(forbidden), + false, + `${clientName}: raw frame leaked plaintext marker ${forbidden}`, + ); + } +} + +async function connectClient(name) { + const session = await createSession(); + const socket = new WebSocket(wsUrl); + + await waitForOpen(socket); + socket.send(JSON.stringify({ + type: "hello", + payload: { + protocol_version: protocolVersion, + key_id: session.keyId, + session_key: session.exportedKey, + }, + })); + + const ack = JSON.parse(await waitForRawMessage(socket)); + assert.equal(ack.type, "hello_ack", `${name}: expected hello_ack`); + assert.equal(ack.payload.protocol_version, protocolVersion, `${name}: protocol mismatch`); + assert.equal(ack.payload.key_id, session.keyId, `${name}: ack key mismatch`); + + const client = { name, socket, session }; + const snapshot = await waitForDecryptedType(client, "snapshot"); + assert.ok(Array.isArray(snapshot.payload.records), `${name}: snapshot records missing`); + + await sendEncrypted(client, { + type: "subscribe", + payload: { topic: "records" }, + }); + + return client; +} + +async function sendEncrypted(client, message) { + const envelope = await encryptMessage(client.session, message); + client.socket.send(JSON.stringify({ type: "encrypted", payload: envelope })); +} + +function closeClient(client) { + if (client.socket.readyState === WebSocket.OPEN) { + client.socket.close(); + } +} + +async function request(method, path, body, token) { + const response = await fetch(`${apiBaseUrl}${path}`, { + method, + headers: { + "Content-Type": "application/json", + ...(token ? { Authorization: `Bearer ${token}` } : {}), + }, + body: body === undefined ? undefined : JSON.stringify(body), + }); + const text = await response.text(); + const data = text ? JSON.parse(text) : {}; + + if (!response.ok) { + throw new Error(`${method} ${path} failed: ${response.status} ${JSON.stringify(data)}`); + } + + return data; +} + +async function createLiveEventViaApi() { + const email = `live-event-${Date.now()}@example.test`; + const bootstrap = await request("POST", "/api/v1/dev/bootstrap-local", { + organization_name: "Live Event Test GmbH", + email, + }); + const login = await request("POST", "/api/v1/auth/login", { + email, + password: bootstrap.password, + }); + const token = login.access_token; + await request("POST", "/api/v1/auth/select-organization", { + organization_id: login.organization_id, + }, token); + + await request("POST", "/api/v1/activities", { + activity_number: null, + activity_type: "task", + title: "Live-Event testen", + body: "Änderung muss an alle Clients gehen.", + status: "open", + priority: "normal", + due_at: null, + }, token); +} + +async function main() { + console.log(`testing encrypted communication via ${wsUrl}`); + + const clientA = await connectClient("client-a"); + console.log("client-a handshake, encrypted snapshot and subscribe ok"); + + const clientB = await connectClient("client-b"); + console.log("client-b handshake, encrypted snapshot and subscribe ok"); + + await sendEncrypted(clientA, { type: "ping" }); + const [pongA, pongB] = await Promise.all([ + waitForDecryptedType(clientA, "pong"), + waitForDecryptedType(clientB, "pong"), + ]); + + assert.equal(pongA.type, "pong"); + assert.equal(pongB.type, "pong"); + assert.notEqual(clientA.session.keyId, clientB.session.keyId, "clients must use different keys"); + + if (apiBaseUrl) { + console.log(`testing api-triggered live event via ${apiBaseUrl}`); + const waitA = waitForRecordChanged(clientA, "Aktivität angelegt"); + const waitB = waitForRecordChanged(clientB, "Aktivität angelegt"); + await createLiveEventViaApi(); + await Promise.all([waitA, waitB]); + console.log("api-triggered live event reached both clients"); + } + + closeClient(clientA); + closeClient(clientB); + + console.log("encrypted multi-client communication test ok"); + process.exit(0); +} + +main().catch((error) => { + console.error(error); + process.exit(1); +}); diff --git a/scripts/dev-seed.mjs b/scripts/dev-seed.mjs new file mode 100644 index 0000000..4b0ead6 --- /dev/null +++ b/scripts/dev-seed.mjs @@ -0,0 +1,130 @@ +#!/usr/bin/env node + +const baseUrl = process.argv[2] ?? process.env.API_BASE_URL ?? "http://127.0.0.1:8080"; +const stamp = Date.now(); +const email = process.env.DEV_SEED_EMAIL ?? `seed-admin-${stamp}@example.test`; + +async function request(method, path, body, token) { + const response = await fetch(`${baseUrl}${path}`, { + method, + headers: { + "Content-Type": "application/json", + ...(token ? { Authorization: `Bearer ${token}` } : {}), + }, + body: body === undefined ? undefined : JSON.stringify(body), + }); + const text = await response.text(); + const data = text ? JSON.parse(text) : {}; + + if (!response.ok) { + throw new Error(`${method} ${path} failed: ${response.status} ${JSON.stringify(data)}`); + } + + return data; +} + +function assert(condition, message) { + if (!condition) throw new Error(message); +} + +async function main() { + console.log(`creating development seed data via ${baseUrl}`); + + const bootstrap = await request("POST", "/api/v1/dev/bootstrap-local", { + organization_name: `Seed Firma ${stamp}`, + email, + }); + assert(bootstrap.password, "dev bootstrap password missing"); + + const login = await request("POST", "/api/v1/auth/login", { + email, + password: bootstrap.password, + }); + const token = login.access_token; + assert(token, "login token missing"); + + await request("POST", "/api/v1/auth/select-organization", { + organization_id: login.organization_id, + }, token); + + const cashDiscountTerm = await request("POST", "/api/v1/cash-discount-terms", { + code: `SEED-${stamp}`, + name: "2 % Skonto, 30 Tage netto", + discount_percent: "2.00", + discount_days: 10, + net_days: 30, + valid_from: null, + valid_until: null, + is_default_customer_term: true, + is_default_supplier_term: true, + is_active: true, + }, token); + + const customer = await request("POST", "/api/v1/customers", { + customer_number: "", + name: "Seed Kunde GmbH", + status: "active", + details: { + street: "Kundenweg 10", + postal_code: "60311", + city: "Frankfurt", + country: "Deutschland", + email: "kunde@example.test", + phone: "", + }, + standard_discount_percent: "5.00", + cash_discount_term_id: cashDiscountTerm.id, + }, token); + + const supplier = await request("POST", "/api/v1/suppliers", { + supplier_number: "", + name: "Seed Lieferant GmbH", + status: "active", + details: { + street: "Lieferstraße 8", + postal_code: "10115", + city: "Berlin", + country: "Deutschland", + email: "lieferant@example.test", + phone: "", + }, + standard_discount_percent: "0.00", + cash_discount_term_id: cashDiscountTerm.id, + payment_days: 30, + }, token); + + const item = await request("POST", "/api/v1/items", { + item_number: "", + name: "Seed Montagestunde", + unit: "Std", + tax_rate: "19.00", + default_purchase_price: "40.00", + default_sales_price: "85.00", + status: "active", + }, token); + + const activity = await request("POST", "/api/v1/activities", { + activity_number: null, + activity_type: "task", + title: "Seed Aktivität", + body: "Testdaten für lokale Entwicklung.", + status: "open", + priority: "normal", + due_at: null, + }, token); + + console.log(JSON.stringify({ + email, + password: bootstrap.password, + organization_id: login.organization_id, + customer_number: customer.customer_number, + supplier_number: supplier.supplier_number, + item_number: item.item_number, + activity_number: activity.activity_number, + }, null, 2)); +} + +main().catch((error) => { + console.error(error); + process.exit(1); +}); diff --git a/scripts/schema-migration-test.mjs b/scripts/schema-migration-test.mjs new file mode 100644 index 0000000..98f31df --- /dev/null +++ b/scripts/schema-migration-test.mjs @@ -0,0 +1,92 @@ +#!/usr/bin/env node + +const baseUrl = process.argv[2] ?? process.env.API_BASE_URL ?? "http://127.0.0.1:8080"; +const email = `schema-migration-${Date.now()}@example.test`; + +async function request(method, path, body, token) { + const response = await fetch(`${baseUrl}${path}`, { + method, + headers: { + "Content-Type": "application/json", + ...(token ? { Authorization: `Bearer ${token}` } : {}), + }, + body: body === undefined ? undefined : JSON.stringify(body), + }); + const text = await response.text(); + const data = text ? JSON.parse(text) : {}; + + if (!response.ok) { + throw new Error(`${method} ${path} failed: ${response.status} ${JSON.stringify(data)}`); + } + + return data; +} + +function assert(condition, message) { + if (!condition) throw new Error(message); +} + +async function main() { + console.log(`testing schema migration idempotency via ${baseUrl}`); + + const registration = await request("POST", "/api/v1/registration/organization", { + organization_name: "Migrationstest GmbH", + email, + accept_terms: true, + }); + + const approval = await request( + "POST", + `/api/v1/admin/organization-registrations/${registration.id}/approve`, + ); + assert(approval.schema_name, "schema name missing after approval"); + + const retry = await request( + "POST", + `/api/v1/admin/organization-registrations/${registration.id}/retry-provisioning`, + ); + assert(retry.provisioned === true, "retry provisioning did not report success"); + assert(retry.schema_name === approval.schema_name, "retry provisioning schema mismatch"); + + const login = await request("POST", "/api/v1/auth/login", { + email, + password: approval.dev_initial_password, + }); + const token = login.access_token; + await request("POST", "/api/v1/auth/select-organization", { + organization_id: login.organization_id, + }, token); + + const ranges = await request("GET", "/api/v1/number-ranges", undefined, token); + for (const code of ["customers", "suppliers", "items", "activities", "outgoing_invoices", "incoming_invoices", "quotes"]) { + assert(ranges.some((range) => range.code === code), `number range missing after retry: ${code}`); + } + + const users = await request("GET", "/api/v1/organizations/current/users", undefined, token); + const owner = users.find((user) => user.email === email); + assert(owner?.roles.includes("owner"), "owner role missing after retry"); + assert(owner?.roles.includes("admin"), "admin role missing after retry"); + + const communication = await request("POST", "/api/v1/communications", { + communication_type: "internal_note", + direction: "internal", + subject: "Migrationstest", + body: "Kommunikationstabellen sind vorhanden.", + status: "open", + occurred_at: null, + links: [], + }, token); + assert(communication.id, "communication insert failed after retry"); + + const navigationSettings = await request("PUT", "/api/v1/users/me/settings/navigation", { + mode: "groups", + }, token); + assert(navigationSettings.mode === "groups", "navigation user setting was not saved"); + + console.log("schema migration idempotency test ok"); +} + +main().catch((error) => { + console.error(error); + process.exit(1); +}); diff --git a/scripts/standard-check.sh b/scripts/standard-check.sh new file mode 100644 index 0000000..735acf1 --- /dev/null +++ b/scripts/standard-check.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" + +cd "$ROOT_DIR" + +echo "== Rust format ==" +cargo fmt --all -- --check + +echo "== Rust workspace check ==" +cargo check --workspace + +echo "== Desktopclient headless unit tests ==" +cargo test -p companytool-desktop-client + +echo "== Node script syntax ==" +node --check scripts/api-onboarding-test.mjs +node --check scripts/communication-test.mjs +node --check scripts/dev-seed.mjs +node --check scripts/schema-migration-test.mjs + +echo "== Webfrontend build and type check ==" +npm --prefix web-frontend run build + +echo "standard check ok" diff --git a/scripts/ws-smoke-test.mjs b/scripts/ws-smoke-test.mjs new file mode 100644 index 0000000..265de10 --- /dev/null +++ b/scripts/ws-smoke-test.mjs @@ -0,0 +1,139 @@ +#!/usr/bin/env node + +import { webcrypto } from "node:crypto"; + +const wsUrl = process.argv[2] ?? process.env.WS_URL ?? "ws://localhost:8080/ws"; +const protocolVersion = 1; + +const encoder = new TextEncoder(); +const decoder = new TextDecoder(); + +function bytesToBase64(bytes) { + return Buffer.from(bytes).toString("base64"); +} + +function base64ToBytes(value) { + return Buffer.from(value, "base64"); +} + +async function createSession() { + const key = await webcrypto.subtle.generateKey( + { name: "AES-GCM", length: 256 }, + true, + ["encrypt", "decrypt"], + ); + const rawKey = await webcrypto.subtle.exportKey("raw", key); + + return { + key, + keyId: webcrypto.randomUUID(), + exportedKey: bytesToBase64(new Uint8Array(rawKey)), + }; +} + +async function encryptMessage(session, message) { + const nonce = webcrypto.getRandomValues(new Uint8Array(12)); + const plaintext = encoder.encode(JSON.stringify(message)); + const ciphertext = await webcrypto.subtle.encrypt( + { name: "AES-GCM", iv: nonce }, + session.key, + plaintext, + ); + + return { + enc: `aes-256-gcm-v${protocolVersion}`, + key_id: session.keyId, + nonce: bytesToBase64(nonce), + ciphertext: bytesToBase64(new Uint8Array(ciphertext)), + }; +} + +async function decryptMessage(session, envelope) { + const plaintext = await webcrypto.subtle.decrypt( + { name: "AES-GCM", iv: base64ToBytes(envelope.nonce) }, + session.key, + base64ToBytes(envelope.ciphertext), + ); + + return JSON.parse(decoder.decode(plaintext)); +} + +function waitForOpen(socket) { + return new Promise((resolve, reject) => { + socket.addEventListener("open", resolve, { once: true }); + socket.addEventListener("error", reject, { once: true }); + }); +} + +function waitForMessage(socket, timeoutMs = 5000) { + return new Promise((resolve, reject) => { + const timeout = setTimeout(() => { + socket.removeEventListener("message", onMessage); + reject(new Error(`timeout after ${timeoutMs}ms`)); + }, timeoutMs); + + function onMessage(event) { + clearTimeout(timeout); + resolve(JSON.parse(event.data)); + } + + socket.addEventListener("message", onMessage, { once: true }); + }); +} + +async function main() { + const session = await createSession(); + const socket = new WebSocket(wsUrl); + + console.log(`connecting ${wsUrl}`); + await waitForOpen(socket); + console.log("socket open"); + + socket.send(JSON.stringify({ + type: "hello", + payload: { + protocol_version: protocolVersion, + key_id: session.keyId, + session_key: session.exportedKey, + }, + })); + + const ack = await waitForMessage(socket); + if (ack.type !== "hello_ack") { + throw new Error(`expected hello_ack, got ${JSON.stringify(ack)}`); + } + console.log(`hello_ack protocol=${ack.payload.protocol_version} key=${ack.payload.key_id}`); + + const firstEncrypted = await waitForMessage(socket); + if (firstEncrypted.type !== "encrypted") { + throw new Error(`expected encrypted snapshot, got ${JSON.stringify(firstEncrypted)}`); + } + const snapshot = await decryptMessage(session, firstEncrypted.payload); + console.log(`decrypted first server message: ${snapshot.type}`); + + const subscribe = await encryptMessage(session, { + type: "subscribe", + payload: { topic: "records" }, + }); + socket.send(JSON.stringify({ type: "encrypted", payload: subscribe })); + console.log("sent encrypted subscribe"); + + const ping = await encryptMessage(session, { type: "ping" }); + socket.send(JSON.stringify({ type: "encrypted", payload: ping })); + + const pongEnvelope = await waitForMessage(socket); + if (pongEnvelope.type !== "encrypted") { + throw new Error(`expected encrypted pong, got ${JSON.stringify(pongEnvelope)}`); + } + const pong = await decryptMessage(session, pongEnvelope.payload); + console.log(`decrypted ping response: ${pong.type}`); + + socket.close(); + console.log("communication smoke test ok"); +} + +main().catch((error) => { + console.error(error); + process.exit(1); +}); + diff --git a/shared-protocol/Cargo.toml b/shared-protocol/Cargo.toml new file mode 100644 index 0000000..ee192c0 --- /dev/null +++ b/shared-protocol/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "companytool-shared-protocol" +version = "0.1.0" +edition.workspace = true +license.workspace = true + +[dependencies] +aes-gcm = "0.10" +base64 = "0.22" +chrono = { version = "0.4", features = ["serde"] } +rand_core = { version = "0.6", features = ["getrandom"] } +serde = { version = "1", features = ["derive"] } +serde_json = "1" +uuid = { version = "1", features = ["serde", "v4"] } diff --git a/shared-protocol/src/lib.rs b/shared-protocol/src/lib.rs new file mode 100644 index 0000000..45477f0 --- /dev/null +++ b/shared-protocol/src/lib.rs @@ -0,0 +1,202 @@ +use chrono::{DateTime, Utc}; +use serde::{Deserialize, Serialize}; +use uuid::Uuid; + +pub const PROTOCOL_VERSION: u16 = 1; +pub const SESSION_KEY_BYTES: usize = 32; +pub const AES_GCM_NONCE_BYTES: usize = 12; + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(tag = "type", content = "payload", rename_all = "snake_case")] +pub enum WireMessage { + Hello(HelloMessage), + HelloAck(HelloAckMessage), + Encrypted(EncryptedEnvelope), + Error(ProtocolErrorMessage), +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct HelloMessage { + pub protocol_version: u16, + pub key_id: String, + pub session_key: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct HelloAckMessage { + pub protocol_version: u16, + pub key_id: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct EncryptedEnvelope { + pub enc: String, + pub key_id: String, + pub nonce: String, + pub ciphertext: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ProtocolErrorMessage { + pub message: String, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(tag = "type", content = "payload", rename_all = "snake_case")] +pub enum ClientMessage { + Subscribe { topic: String }, + Ping, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(tag = "type", content = "payload", rename_all = "snake_case")] +pub enum ServerMessage { + Snapshot { records: Vec }, + RecordChanged { record: RecordSummary }, + Pong, + Error { message: String }, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct RecordSummary { + pub id: Uuid, + pub title: String, + pub updated_at: DateTime, +} + +pub mod crypto { + use aes_gcm::{ + aead::{Aead, AeadCore, KeyInit, OsRng}, + Aes256Gcm, Key, Nonce, + }; + use base64::{engine::general_purpose::STANDARD, Engine}; + use rand_core::RngCore; + use serde::{de::DeserializeOwned, Serialize}; + + use crate::{EncryptedEnvelope, AES_GCM_NONCE_BYTES, PROTOCOL_VERSION, SESSION_KEY_BYTES}; + + #[derive(Debug)] + pub enum CryptoError { + InvalidBase64(base64::DecodeError), + InvalidKeyLength(usize), + InvalidNonceLength(usize), + Serialize(serde_json::Error), + Deserialize(serde_json::Error), + Encrypt, + Decrypt, + } + + impl std::fmt::Display for CryptoError { + fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::InvalidBase64(error) => write!(formatter, "invalid base64: {error}"), + Self::InvalidKeyLength(length) => write!(formatter, "invalid key length: {length}"), + Self::InvalidNonceLength(length) => { + write!(formatter, "invalid nonce length: {length}") + } + Self::Serialize(error) => write!(formatter, "serialize failed: {error}"), + Self::Deserialize(error) => write!(formatter, "deserialize failed: {error}"), + Self::Encrypt => write!(formatter, "encryption failed"), + Self::Decrypt => write!(formatter, "decryption failed"), + } + } + } + + impl std::error::Error for CryptoError {} + + #[derive(Debug, Clone)] + pub struct SessionKey { + key_id: String, + key: [u8; SESSION_KEY_BYTES], + } + + impl SessionKey { + pub fn generate() -> Self { + let mut key = [0_u8; SESSION_KEY_BYTES]; + OsRng.fill_bytes(&mut key); + + Self { + key_id: uuid::Uuid::new_v4().to_string(), + key, + } + } + + pub fn from_base64(key_id: String, value: &str) -> Result { + let decoded = STANDARD.decode(value).map_err(CryptoError::InvalidBase64)?; + if decoded.len() != SESSION_KEY_BYTES { + return Err(CryptoError::InvalidKeyLength(decoded.len())); + } + + let mut key = [0_u8; SESSION_KEY_BYTES]; + key.copy_from_slice(&decoded); + + Ok(Self { key_id, key }) + } + + pub fn key_id(&self) -> &str { + &self.key_id + } + + pub fn to_base64(&self) -> String { + STANDARD.encode(self.key) + } + + pub fn encrypt(&self, value: &T) -> Result { + let cipher = Aes256Gcm::new(Key::::from_slice(&self.key)); + let nonce = Aes256Gcm::generate_nonce(&mut OsRng); + let plaintext = serde_json::to_vec(value).map_err(CryptoError::Serialize)?; + let ciphertext = cipher + .encrypt(&nonce, plaintext.as_ref()) + .map_err(|_| CryptoError::Encrypt)?; + + Ok(EncryptedEnvelope { + enc: format!("aes-256-gcm-v{PROTOCOL_VERSION}"), + key_id: self.key_id.clone(), + nonce: STANDARD.encode(nonce), + ciphertext: STANDARD.encode(ciphertext), + }) + } + + pub fn decrypt( + &self, + envelope: &EncryptedEnvelope, + ) -> Result { + let nonce_bytes = STANDARD + .decode(&envelope.nonce) + .map_err(CryptoError::InvalidBase64)?; + if nonce_bytes.len() != AES_GCM_NONCE_BYTES { + return Err(CryptoError::InvalidNonceLength(nonce_bytes.len())); + } + + let ciphertext = STANDARD + .decode(&envelope.ciphertext) + .map_err(CryptoError::InvalidBase64)?; + let cipher = Aes256Gcm::new(Key::::from_slice(&self.key)); + let plaintext = cipher + .decrypt(Nonce::from_slice(&nonce_bytes), ciphertext.as_ref()) + .map_err(|_| CryptoError::Decrypt)?; + + serde_json::from_slice(&plaintext).map_err(CryptoError::Deserialize) + } + } +} + +#[cfg(test)] +mod tests { + use super::{crypto::SessionKey, ClientMessage}; + + #[test] + fn session_key_encrypts_and_decrypts_client_message() { + let session_key = SessionKey::generate(); + let message = ClientMessage::Subscribe { + topic: "customers".to_string(), + }; + + let envelope = session_key.encrypt(&message).expect("encrypt message"); + let decrypted = session_key + .decrypt::(&envelope) + .expect("decrypt message"); + + assert_eq!(decrypted, message); + } +} diff --git a/test-zugang b/test-zugang new file mode 100644 index 0000000..bc0b2fb --- /dev/null +++ b/test-zugang @@ -0,0 +1,6 @@ +Login: admin@example.test +Passwort: 4FjYIivIPzbATWAUxN4KSmc0 +User: 43477791-1b8e-4307-adee-ec70d2a79a93 +Firma: ceb30710-10a5-4ad8-a63d-24b859652ad3 +Schema: company_ceb3071010a54ad8a63d24b859652ad3 +Dev-Modus: true \ No newline at end of file diff --git a/web-frontend/index.html b/web-frontend/index.html new file mode 100644 index 0000000..4f0dea0 --- /dev/null +++ b/web-frontend/index.html @@ -0,0 +1,13 @@ + + + + + + + Company Tool + + +

+ + + diff --git a/web-frontend/package-lock.json b/web-frontend/package-lock.json new file mode 100644 index 0000000..f88f2b1 --- /dev/null +++ b/web-frontend/package-lock.json @@ -0,0 +1,1463 @@ +{ + "name": "companytool-web-frontend", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "companytool-web-frontend", + "version": "0.1.0", + "dependencies": { + "vite": "^6.0.0", + "vue": "^3.5.0", + "vue-router": "^4.5.0" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^5.2.0", + "typescript": "^5.7.0", + "vue-tsc": "^2.2.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.3.tgz", + "integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.4.tgz", + "integrity": "sha512-F5QXMSiFebS9hKZj02XhWLLnRpJ3B3AROP0tWbFBSj+6kCbg5m9j5JoHKd4mmSVy5mS/IMQloYgYxCuJC0fxEQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.4.tgz", + "integrity": "sha512-GxxTKApUpzRhof7poWvCJHRF51C67u1R7D6DiluBE8wKU1u5GWE8t+v81JvJYtbawoBFX1hLv5Ei4eVjkWokaw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.4.tgz", + "integrity": "sha512-tua0TaJxMOB1R0V0RS1jFZ/RpURFDJIOR2A6jWwQeawuFyS4gBW+rntLRaQd0EQ4bd6Vp44Z2rXW+YYDBsj6IA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.4.tgz", + "integrity": "sha512-CSKq7MsP+5PFIcydhAiR1K0UhEI1A2jWXVKHPCBZ151yOutENwvnPocgVHkivu2kviURtCEB6zUQw0vs8RrhMg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.4.tgz", + "integrity": "sha512-+O8OkVdyvXMtJEciu2wS/pzm1IxntEEQx3z5TAVy4l32G0etZn+RsA48ARRrFm6Ri8fvqPQfgrvNxSjKAbnd3g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.4.tgz", + "integrity": "sha512-Iw3oMskH3AfNuhU0MSN7vNbdi4me/NiYo2azqPz/Le16zHSa+3RRmliCMWWQmh4lcndccU40xcJuTYJZxNo/lw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.4.tgz", + "integrity": "sha512-EIPRXTVQpHyF8WOo219AD2yEltPehLTcTMz2fn6JsatLYSzQf00hj3rulF+yauOlF9/FtM2WpkT/hJh/KJFGhA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.4.tgz", + "integrity": "sha512-J3Yh9PzzF1Ovah2At+lHiGQdsYgArxBbXv/zHfSyaiFQEqvNv7DcW98pCrmdjCZBrqBiKrKKe2V+aaSGWuBe/w==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.4.tgz", + "integrity": "sha512-BFDEZMYfUvLn37ONE1yMBojPxnMlTFsdyNoqncT0qFq1mAfllL+ATMMJd8TeuVMiX84s1KbcxcZbXInmcO2mRg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.4.tgz", + "integrity": "sha512-pc9EYOSlOgdQ2uPl1o9PF6/kLSgaUosia7gOuS8mB69IxJvlclko1MECXysjs5ryez1/5zjYqx3+xYU0TU6R1A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.4.tgz", + "integrity": "sha512-NxnomyxYerDh5n4iLrNa+sH+Z+U4BMEE46V2PgQ/hoB909i8gV1M5wPojWg9fk1jWpO3IQnOs20K4wyZuFLEFQ==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.4.tgz", + "integrity": "sha512-nbJnQ8a3z1mtmrwImCYhc6BGpThAyYVRQxw9uKSKG4wR6aAYno9sVjJ0zaZcW9BPJX1GbrDPf+SvdWjgTuDmnw==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.4.tgz", + "integrity": "sha512-2EU6acNrQLd8tYvo/LXW535wupT3m6fo7HKo6lr7ktQoItxTyOL1ZCR/GfGCuXl2vR+zmfI6eRXkSemafv+iVg==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.4.tgz", + "integrity": "sha512-WeBtoMuaMxiiIrO2IYP3xs6GMWkJP2C0EoT8beTLkUPmzV1i/UcOSVw1d5r9KBODtHKilG5yFxsGRnBbK3wJ4A==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.4.tgz", + "integrity": "sha512-FJHFfqpKUI3A10WrWKiFbBZ7yVbGT4q4B5o1qKFFojqpaYoh9LrQgqWCmmcxQzVSXYtyB5bzkXrYzlHTs21MYA==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.4.tgz", + "integrity": "sha512-mcEl6CUT5IAUmQf1m9FYSmVqCJlpQ8r8eyftFUHG8i9OhY7BkBXSUdnLH5DOf0wCOjcP9v/QO93zpmF1SptCCw==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.4.tgz", + "integrity": "sha512-ynt3JxVd2w2buzoKDWIyiV1pJW93xlQic1THVLXilz429oijRpSHivZAgp65KBu+cMcgf1eVVjdnTLvPxgCuoQ==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.4.tgz", + "integrity": "sha512-Boiz5+MsaROEWDf+GGEwF8VMHGhlUoQMtIPjOgA5fv4osupqTVnJteQNKJwUcnUog2G55jYXH7KZFFiJe0TEzQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.4.tgz", + "integrity": "sha512-+qfSY27qIrFfI/Hom04KYFw3GKZSGU4lXus51wsb5EuySfFlWRwjkKWoE9emgRw/ukoT4Udsj4W/+xxG8VbPKg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.4.tgz", + "integrity": "sha512-VpTfOPHgVXEBeeR8hZ2O0F3aSso+JDWqTWmTmzcQKted54IAdUVbxE+j/MVxUsKa8L20HJhv3vUezVPoquqWjA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.4.tgz", + "integrity": "sha512-IPOsh5aRYuLv/nkU51X10Bf75Bsf6+gZdx1X+QP5QM6lIJFHHqbHLG0uJn/hWthzo13UAc2umiUorqZy3axoZg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.4.tgz", + "integrity": "sha512-4QzE9E81OohJ/HKzHhsqU+zcYYojVOXlFMs1DdyMT6qXl/niOH7AVElmmEdUNHHS/oRkc++d5k6Vy85zFs0DEw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.4.tgz", + "integrity": "sha512-zTPgT1YuHHcd+Tmx7h8aml0FWFVelV5N54oHow9SLj+GfoDy/huQ+UV396N/C7KpMDMiPspRktzM1/0r1usYEA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.4.tgz", + "integrity": "sha512-DRS4G7mi9lJxqEDezIkKCaUIKCrLUUDCUaCsTPCi/rtqaC6D/jjwslMQyiDU50Ka0JKpeXeRBFBAXwArY52vBw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.4.tgz", + "integrity": "sha512-QVTUovf40zgTqlFVrKA1uXMVvU2QWEFWfAH8Wdc48IxLvrJMQVMBRjuQyUpzZCDkakImib9eVazbWlC6ksWtJw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", + "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@volar/language-core": { + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.15.tgz", + "integrity": "sha512-3VHw+QZU0ZG9IuQmzT68IyN4hZNd9GchGPhbD9+pa8CVv7rnoOZwo7T8weIbrRmihqy3ATpdfXFnqRrfPVK6CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/source-map": "2.4.15" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.15.tgz", + "integrity": "sha512-CPbMWlUN6hVZJYGcU/GSoHu4EnCHiLaXI9n8c9la6RaI9W5JHX+NqG+GSQcB0JdC2FIBLdZJwGsfKyBB71VlTg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@volar/typescript": { + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.15.tgz", + "integrity": "sha512-2aZ8i0cqPGjXb4BhkMsPYDkkuc2ZQ6yOpqwAuNwUoncELqoy5fRgOQtLR9gB0g902iS0NAkvpIzs27geVyVdPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.15", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.34", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.34.tgz", + "integrity": "sha512-s9cLyK5mLcvZ4Agva5QgRsQyLKvts9WbU9DB6NqiZkkGEdwmcEiylj5Jbwkp680drF/NNCV8OlAJSe+yMLxaJw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.3", + "@vue/shared": "3.5.34", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.34", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.34.tgz", + "integrity": "sha512-EbF/T++k0e2MMZlJsBhzK8Sgwt0HcIPOhzn1CTB/lv6sQcyk+OWf8YeiLxZp3ro7MbbLcAfAJ6sEvjFWuNgUCw==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.34", + "@vue/shared": "3.5.34" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.34", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.34.tgz", + "integrity": "sha512-D/ihr6uZeIt6r+pVZf46RWT1fAsLFMbUP7k8G1VkiiWexriED9GrX3echHd4Abbt17zjlfiFJ8z7a3BxZOPNjg==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.3", + "@vue/compiler-core": "3.5.34", + "@vue/compiler-dom": "3.5.34", + "@vue/compiler-ssr": "3.5.34", + "@vue/shared": "3.5.34", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.14", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.34", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.34.tgz", + "integrity": "sha512-cDtTHKibkThKGHH1SP+WdccquNRYQDFH6rRjQCqT9G2ltFAfoR5pUftpab/z+aM5mW9HLLVQW7hfKKQe/1GBeQ==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.34", + "@vue/shared": "3.5.34" + } + }, + "node_modules/@vue/compiler-vue2": { + "version": "2.7.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz", + "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==", + "dev": true, + "license": "MIT", + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz", + "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", + "license": "MIT" + }, + "node_modules/@vue/language-core": { + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.12.tgz", + "integrity": "sha512-IsGljWbKGU1MZpBPN+BvPAdr55YPkj2nB/TBNGNC32Vy2qLG25DYu/NBN2vNtZqdRbTRjaoYrahLrToim2NanA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.15", + "@vue/compiler-dom": "^3.5.0", + "@vue/compiler-vue2": "^2.7.16", + "@vue/shared": "^3.5.0", + "alien-signals": "^1.0.3", + "minimatch": "^9.0.3", + "muggle-string": "^0.4.1", + "path-browserify": "^1.0.1" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.34", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.34.tgz", + "integrity": "sha512-y9XDjCEuBp+98k+UL5dbYkh57AHU4o6cxZedOPXw3bmrZZYLQsVHguGurq7hVrPCSrQtrnz1f9dssyFr+dMXfQ==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.34" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.34", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.34.tgz", + "integrity": "sha512-mKeBYvu8tcMSLhypAHBmriUFfWXKTCF/23Z4jiCoYK3UtWepkliViNLuR90V9XOyD62mUxs9p1jsrpK3CCGIzw==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.34", + "@vue/shared": "3.5.34" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.34", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.34.tgz", + "integrity": "sha512-e8kZzERmCwUnBRVsgSQlAfrfU2rGoy0FFKPBXSlfEjc/O3KfA7QP0t1/2ZylrbchjmIKB4dPTd07A6WPr0eOrg==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.34", + "@vue/runtime-core": "3.5.34", + "@vue/shared": "3.5.34", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.34", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.34.tgz", + "integrity": "sha512-nHxmJoTrKsmrkbILRhkC9gY1G3moZbJTqCzDd7DOOzG5KH9oeJ0Unqrff5f9v0pW//jES05ZkJcNtfE8JjOIew==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.34", + "@vue/shared": "3.5.34" + }, + "peerDependencies": { + "vue": "3.5.34" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.34", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.34.tgz", + "integrity": "sha512-24uqU4OIiX29ryC3MeWid/Xf2fa2EFRUVLb77nRhk+UrTVrh/XiGtFAFmJBAtBRbjwNdsPRP+jj/OL27Eg1NDA==", + "license": "MIT" + }, + "node_modules/alien-signals": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-1.0.13.tgz", + "integrity": "sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true, + "license": "MIT" + }, + "node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/rollup": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.4.tgz", + "integrity": "sha512-WHeFSbZYsPu3+bLoNRUuAO+wavNlocOPf3wSHTP7hcFKVnJeWsYlCDbr3mTS14FCizf9ccIxXA8sGL8zKeQN3g==", + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.60.4", + "@rollup/rollup-android-arm64": "4.60.4", + "@rollup/rollup-darwin-arm64": "4.60.4", + "@rollup/rollup-darwin-x64": "4.60.4", + "@rollup/rollup-freebsd-arm64": "4.60.4", + "@rollup/rollup-freebsd-x64": "4.60.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.60.4", + "@rollup/rollup-linux-arm-musleabihf": "4.60.4", + "@rollup/rollup-linux-arm64-gnu": "4.60.4", + "@rollup/rollup-linux-arm64-musl": "4.60.4", + "@rollup/rollup-linux-loong64-gnu": "4.60.4", + "@rollup/rollup-linux-loong64-musl": "4.60.4", + "@rollup/rollup-linux-ppc64-gnu": "4.60.4", + "@rollup/rollup-linux-ppc64-musl": "4.60.4", + "@rollup/rollup-linux-riscv64-gnu": "4.60.4", + "@rollup/rollup-linux-riscv64-musl": "4.60.4", + "@rollup/rollup-linux-s390x-gnu": "4.60.4", + "@rollup/rollup-linux-x64-gnu": "4.60.4", + "@rollup/rollup-linux-x64-musl": "4.60.4", + "@rollup/rollup-openbsd-x64": "4.60.4", + "@rollup/rollup-openharmony-arm64": "4.60.4", + "@rollup/rollup-win32-arm64-msvc": "4.60.4", + "@rollup/rollup-win32-ia32-msvc": "4.60.4", + "@rollup/rollup-win32-x64-gnu": "4.60.4", + "@rollup/rollup-win32-x64-msvc": "4.60.4", + "fsevents": "~2.3.2" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/vite": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.2.tgz", + "integrity": "sha512-2N/55r4JDJ4gdrCvGgINMy+HH3iRpNIz8K6SFwVsA+JbQScLiC+clmAxBgwiSPgcG9U15QmvqCGWzMbqda5zGQ==", + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vscode-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/vue": { + "version": "3.5.34", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.34.tgz", + "integrity": "sha512-WdLBG9gm02OgJIG9axd5Hpx0TFLdzVgfG2evFFu8Rur5O/IoGc5cMjnjh3tPL6GnRGsYvUhBSKVPYVcxRKpMCA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.34", + "@vue/compiler-sfc": "3.5.34", + "@vue/runtime-dom": "3.5.34", + "@vue/server-renderer": "3.5.34", + "@vue/shared": "3.5.34" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-router": { + "version": "4.6.4", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.6.4.tgz", + "integrity": "sha512-Hz9q5sa33Yhduglwz6g9skT8OBPii+4bFn88w6J+J4MfEo4KRRpmiNG/hHHkdbRFlLBOqxN8y8gf2Fb0MTUgVg==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^6.6.4" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/vue-tsc": { + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.2.12.tgz", + "integrity": "sha512-P7OP77b2h/Pmk+lZdJ0YWs+5tJ6J2+uOQPo7tlBnY44QqQSPYvS0qVT4wqDJgwrZaLe47etJLLQRFia71GYITw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/typescript": "2.4.15", + "@vue/language-core": "2.2.12" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": ">=5.0.0" + } + } + } +} diff --git a/web-frontend/package.json b/web-frontend/package.json new file mode 100644 index 0000000..26db008 --- /dev/null +++ b/web-frontend/package.json @@ -0,0 +1,21 @@ +{ + "name": "companytool-web-frontend", + "version": "0.1.0", + "private": true, + "type": "module", + "scripts": { + "dev": "vite --host 0.0.0.0", + "build": "vue-tsc --noEmit && vite build", + "preview": "vite preview --host 0.0.0.0" + }, + "dependencies": { + "vue": "^3.5.0", + "vue-router": "^4.5.0", + "vite": "^6.0.0" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^5.2.0", + "typescript": "^5.7.0", + "vue-tsc": "^2.2.0" + } +} diff --git a/web-frontend/public/companytool-logo.png b/web-frontend/public/companytool-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..0f73f7f09fa49c8e8f5ff349143af8ec451a4bcf GIT binary patch literal 63147 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 XAh|r4A&)U>00000NkvXXu0mjfdy{^_ literal 0 HcmV?d00001 diff --git a/web-frontend/src/App.vue b/web-frontend/src/App.vue new file mode 100644 index 0000000..ec5e100 --- /dev/null +++ b/web-frontend/src/App.vue @@ -0,0 +1,399 @@ + + + diff --git a/web-frontend/src/api.ts b/web-frontend/src/api.ts new file mode 100644 index 0000000..5644af5 --- /dev/null +++ b/web-frontend/src/api.ts @@ -0,0 +1,51 @@ +import type { ApiResult } from "./types"; +import { authState } from "./auth"; + +const apiBaseUrl = import.meta.env.VITE_API_BASE_URL ?? ""; + +export function apiGet(path: string): Promise> { + return apiRequest("GET", path); +} + +export function apiPost(path: string, body: unknown): Promise> { + return apiRequest("POST", path, body); +} + +export function apiPut(path: string, body: unknown): Promise> { + return apiRequest("PUT", path, body); +} + +export function apiPatch(path: string, body: unknown): Promise> { + return apiRequest("PATCH", path, body); +} + +export function apiDelete(path: string): Promise> { + return apiRequest("DELETE", path); +} + +async function apiRequest(method: string, path: string, body?: unknown): Promise> { + try { + const response = await fetch(`${apiBaseUrl}${path}`, { + method, + headers: { + "Content-Type": "application/json", + ...(authState.session?.accessToken ? { Authorization: `Bearer ${authState.session.accessToken}` } : {}) + }, + body: body === undefined ? undefined : JSON.stringify(body) + }); + + const text = await response.text(); + const data = text ? JSON.parse(text) : {}; + + if (!response.ok) { + return { ok: false, message: data.message ?? `HTTP ${response.status}` }; + } + + return { ok: true, data }; + } catch (error) { + return { + ok: false, + message: error instanceof Error ? error.message : "Unbekannter Fehler" + }; + } +} diff --git a/web-frontend/src/auth.ts b/web-frontend/src/auth.ts new file mode 100644 index 0000000..142d3af --- /dev/null +++ b/web-frontend/src/auth.ts @@ -0,0 +1,44 @@ +import { reactive } from "vue"; +import type { AuthSession } from "./types"; + +const authStorageKey = "companytool.auth"; + +export const authState = reactive<{ + session: AuthSession | null; +}>({ + session: loadAuthSession() +}); + +export function setAuthSession(session: AuthSession) { + authState.session = session; + window.localStorage.setItem(authStorageKey, JSON.stringify(session)); +} + +export function updateAuthSession(partial: Partial) { + if (!authState.session) return; + setAuthSession({ ...authState.session, ...partial }); +} + +export function clearAuthSession() { + authState.session = null; + window.localStorage.removeItem(authStorageKey); +} + +function loadAuthSession(): AuthSession | null { + try { + const raw = window.localStorage.getItem(authStorageKey); + if (!raw) return null; + const session = JSON.parse(raw) as Partial; + if (!session.email || !session.userId) return null; + if (!session.accessToken) return null; + return { + email: session.email, + userId: session.userId, + accessToken: session.accessToken, + organizationId: session.organizationId ?? null, + mustChangePassword: session.mustChangePassword === true + }; + } catch { + return null; + } +} diff --git a/web-frontend/src/components/FormStatus.vue b/web-frontend/src/components/FormStatus.vue new file mode 100644 index 0000000..b4e4979 --- /dev/null +++ b/web-frontend/src/components/FormStatus.vue @@ -0,0 +1,10 @@ + + + diff --git a/web-frontend/src/components/PageHeader.vue b/web-frontend/src/components/PageHeader.vue new file mode 100644 index 0000000..9474d1c --- /dev/null +++ b/web-frontend/src/components/PageHeader.vue @@ -0,0 +1,15 @@ + + + diff --git a/web-frontend/src/components/SearchSelect.vue b/web-frontend/src/components/SearchSelect.vue new file mode 100644 index 0000000..3f812fb --- /dev/null +++ b/web-frontend/src/components/SearchSelect.vue @@ -0,0 +1,75 @@ + + + diff --git a/web-frontend/src/main.ts b/web-frontend/src/main.ts new file mode 100644 index 0000000..ad69c6b --- /dev/null +++ b/web-frontend/src/main.ts @@ -0,0 +1,6 @@ +import { createApp } from "vue"; +import "./styles.css"; +import App from "./App.vue"; +import { router } from "./router"; + +createApp(App).use(router).mount("#app"); diff --git a/web-frontend/src/number-ranges.ts b/web-frontend/src/number-ranges.ts new file mode 100644 index 0000000..68267e6 --- /dev/null +++ b/web-frontend/src/number-ranges.ts @@ -0,0 +1,17 @@ +import { apiPost } from "./api"; + +type NextNumberResponse = { + code: string; + number: string; +}; + +export async function reserveNextNumber(code: string): Promise { + const result = await apiPost(`/api/v1/number-ranges/${encodeURIComponent(code)}/next`, {}); + return result.ok ? result.data.number : null; +} + +export function matchesObjectSearch(number: string | null | undefined, title: string | null | undefined, query: string) { + const needle = query.trim().toLowerCase(); + if (!needle) return true; + return `${number ?? ""} ${title ?? ""}`.toLowerCase().includes(needle); +} diff --git a/web-frontend/src/realtime.ts b/web-frontend/src/realtime.ts new file mode 100644 index 0000000..b0812e0 --- /dev/null +++ b/web-frontend/src/realtime.ts @@ -0,0 +1,179 @@ +import { reactive } from "vue"; +import type { + ClientMessage, + EncryptedEnvelope, + RecordSummary, + ServerMessage, + SessionCrypto, + WireMessage +} from "./types"; + +const protocolVersion = 1; +export const wsUrl = import.meta.env.VITE_WS_URL ?? "ws://localhost:8080/ws"; + +export const connectionState = reactive<{ + records: RecordSummary[]; + status: string; +}>({ + records: [], + status: "Nicht verbunden" +}); + +export const liveUpdateState = reactive<{ + revision: number; + lastTitle: string; + lastUpdatedAt: string | null; +}>({ + revision: 0, + lastTitle: "", + lastUpdatedAt: null +}); + +let connectionStarted = false; +let reconnectTimer: number | undefined; + +export function ensureConnection() { + if (connectionStarted) return; + connectionStarted = true; + connect(); +} + +export function stopConnection() { + connectionStarted = false; + if (reconnectTimer !== undefined) { + window.clearTimeout(reconnectTimer); + reconnectTimer = undefined; + } + connectionState.records = []; + connectionState.status = "Nicht verbunden"; +} + +function connect() { + const socket = new WebSocket(wsUrl); + let session: SessionCrypto | null = null; + + socket.addEventListener("open", async () => { + session = await createSessionCrypto(); + connectionState.status = "Handshake..."; + socket.send(JSON.stringify({ + type: "hello", + payload: { + protocol_version: protocolVersion, + key_id: session.keyId, + session_key: session.exportedKey + } + } satisfies WireMessage)); + }); + + socket.addEventListener("message", async (event) => { + const wireMessage = JSON.parse(event.data) as WireMessage; + if (wireMessage.type === "hello_ack") { + connectionState.status = "Verbunden"; + if (session) { + const envelope = await encryptMessage(session, { + type: "subscribe", + payload: { topic: "records" } + }); + socket.send(JSON.stringify({ type: "encrypted", payload: envelope } satisfies WireMessage)); + } + return; + } + + if (wireMessage.type === "encrypted" && session) { + const message = await decryptMessage(session, wireMessage.payload); + applyMessage(message); + return; + } + + if (wireMessage.type === "error") { + connectionState.status = wireMessage.payload.message; + } + }); + + socket.addEventListener("close", () => { + connectionStarted = false; + connectionState.status = "Verbindung getrennt, neuer Versuch..."; + reconnectTimer = window.setTimeout(ensureConnection, 1500); + }); + + socket.addEventListener("error", () => { + connectionState.status = "Socket-Fehler"; + }); +} + +async function createSessionCrypto(): Promise { + const key = await crypto.subtle.generateKey({ name: "AES-GCM", length: 256 }, true, [ + "encrypt", + "decrypt" + ]); + const rawKey = await crypto.subtle.exportKey("raw", key); + + return { + key, + keyId: crypto.randomUUID(), + exportedKey: bytesToBase64(new Uint8Array(rawKey)) + }; +} + +async function encryptMessage(session: SessionCrypto, message: ClientMessage) { + const nonce = crypto.getRandomValues(new Uint8Array(12)); + const encoded = new TextEncoder().encode(JSON.stringify(message)); + const ciphertext = await crypto.subtle.encrypt({ name: "AES-GCM", iv: nonce }, session.key, encoded); + + return { + enc: `aes-256-gcm-v${protocolVersion}`, + key_id: session.keyId, + nonce: bytesToBase64(nonce), + ciphertext: bytesToBase64(new Uint8Array(ciphertext)) + } satisfies EncryptedEnvelope; +} + +async function decryptMessage(session: SessionCrypto, envelope: EncryptedEnvelope): Promise { + const plaintext = await crypto.subtle.decrypt( + { name: "AES-GCM", iv: base64ToBytes(envelope.nonce) }, + session.key, + base64ToBytes(envelope.ciphertext) + ); + return JSON.parse(new TextDecoder().decode(plaintext)) as T; +} + +function bytesToBase64(bytes: Uint8Array) { + let binary = ""; + bytes.forEach((byte) => { + binary += String.fromCharCode(byte); + }); + return btoa(binary); +} + +function base64ToBytes(value: string) { + const binary = atob(value); + const bytes = new Uint8Array(binary.length); + for (let index = 0; index < binary.length; index += 1) { + bytes[index] = binary.charCodeAt(index); + } + return bytes; +} + +function applyMessage(message: ServerMessage) { + if (message.type === "snapshot") { + connectionState.records = message.payload.records; + connectionState.status = "Verbunden"; + } + + if (message.type === "record_changed") { + const index = connectionState.records.findIndex((record) => record.id === message.payload.record.id); + if (index >= 0) { + connectionState.records[index] = message.payload.record; + } else { + connectionState.records.unshift(message.payload.record); + } + connectionState.status = "Aktualisiert"; + liveUpdateState.revision += 1; + liveUpdateState.lastTitle = message.payload.record.title; + liveUpdateState.lastUpdatedAt = message.payload.record.updated_at; + } + + if (message.type === "error") { + connectionState.status = message.payload.message; + } +} diff --git a/web-frontend/src/router.ts b/web-frontend/src/router.ts new file mode 100644 index 0000000..25b8781 --- /dev/null +++ b/web-frontend/src/router.ts @@ -0,0 +1,105 @@ +import { createRouter, createWebHistory } from "vue-router"; +import { authState } from "./auth"; +import DashboardPage from "./views/DashboardPage.vue"; +import LoginPage from "./views/LoginPage.vue"; +import RegisterPage from "./views/RegisterPage.vue"; +import ChangeInitialPasswordPage from "./views/ChangeInitialPasswordPage.vue"; +import PasswordResetPage from "./views/PasswordResetPage.vue"; +import AcceptInvitationPage from "./views/AcceptInvitationPage.vue"; +import AdminRegistrationsPage from "./views/AdminRegistrationsPage.vue"; +import AdminRegistrationDetailPage from "./views/AdminRegistrationDetailPage.vue"; +import OrganizationSetupPage from "./views/OrganizationSetupPage.vue"; +import UsersPage from "./views/UsersPage.vue"; +import CustomersPage from "./views/CustomersPage.vue"; +import SuppliersPage from "./views/SuppliersPage.vue"; +import ItemsPage from "./views/ItemsPage.vue"; +import ActivitiesPage from "./views/ActivitiesPage.vue"; +import CashDiscountTermsPage from "./views/CashDiscountTermsPage.vue"; +import NumberRangesPage from "./views/NumberRangesPage.vue"; +import QuotesPage from "./views/QuotesPage.vue"; +import OutgoingInvoicesPage from "./views/OutgoingInvoicesPage.vue"; +import IncomingInvoicesPage from "./views/IncomingInvoicesPage.vue"; +import PriceImportsPage from "./views/PriceImportsPage.vue"; +import ApiConnectorsPage from "./views/ApiConnectorsPage.vue"; +import PriceRulesPage from "./views/PriceRulesPage.vue"; +import CommunicationsPage from "./views/CommunicationsPage.vue"; +import DocumentsPage from "./views/DocumentsPage.vue"; + +export const publicRoutes = [ + { path: "/login", label: "Login" }, + { path: "/register", label: "Registrierung" }, + { path: "/password-reset", label: "Passwort zurücksetzen" }, + { path: "/accept-invitation", label: "Einladung annehmen" } +]; + +export const privateRoutes = [ + { path: "/", label: "Dashboard", group: "Vorgänge" }, + { path: "/outgoing-invoices", label: "Ausgangsrechnungen", group: "Vorgänge" }, + { path: "/quotes", label: "Angebote", group: "Vorgänge" }, + { path: "/incoming-invoices", label: "Eingangsrechnungen", group: "Vorgänge" }, + { path: "/master-data/customers", label: "Kunden", group: "Stammdaten" }, + { path: "/master-data/suppliers", label: "Lieferanten", group: "Stammdaten" }, + { path: "/master-data/items", label: "Artikel", group: "Stammdaten" }, + { path: "/activities", label: "Aktivitäten", group: "Stammdaten" }, + { path: "/imports/price-lists", label: "Preislisten", group: "Arbeitsdaten" }, + { path: "/communications", label: "Kommunikation", group: "Arbeitsdaten" }, + { path: "/documents", label: "Dokumente", group: "Arbeitsdaten" }, + { path: "/settings/price-rules", label: "Preisregeln", group: "Einstellungen" }, + { path: "/settings/api-connectors", label: "Preis-APIs", group: "Einstellungen" }, + { path: "/setup/organization", label: "Firmendaten", group: "Einstellungen" }, + { path: "/settings/users", label: "Benutzerrechte", group: "Einstellungen" }, + { path: "/settings/number-ranges", label: "Nummernkreise", group: "Einstellungen" }, + { path: "/settings/cash-discount-terms", label: "Skonto", group: "Einstellungen" }, + { path: "/admin/organization-registrations", label: "Freischaltung", group: "Einstellungen" } +]; + +export const router = createRouter({ + history: createWebHistory(), + routes: [ + { path: "/", component: DashboardPage, meta: { requiresAuth: true } }, + { path: "/login", component: LoginPage, meta: { publicOnly: true } }, + { path: "/register", component: RegisterPage, meta: { publicOnly: true } }, + { path: "/password-reset", component: PasswordResetPage, meta: { publicOnly: true } }, + { path: "/accept-invitation", component: AcceptInvitationPage, meta: { publicOnly: true } }, + { + path: "/change-initial-password", + component: ChangeInitialPasswordPage, + meta: { requiresAuth: true, passwordChange: true } + }, + { + path: "/admin/organization-registrations", + component: AdminRegistrationsPage, + meta: { requiresAuth: true } + }, + { + path: "/admin/organization-registrations/:id", + component: AdminRegistrationDetailPage, + meta: { requiresAuth: true } + }, + { path: "/setup/organization", component: OrganizationSetupPage, meta: { requiresAuth: true } }, + { path: "/settings/users", component: UsersPage, meta: { requiresAuth: true } }, + { path: "/settings/number-ranges", component: NumberRangesPage, meta: { requiresAuth: true } }, + { path: "/master-data/customers", component: CustomersPage, meta: { requiresAuth: true } }, + { path: "/master-data/suppliers", component: SuppliersPage, meta: { requiresAuth: true } }, + { path: "/master-data/items", component: ItemsPage, meta: { requiresAuth: true } }, + { path: "/settings/cash-discount-terms", component: CashDiscountTermsPage, meta: { requiresAuth: true } }, + { path: "/quotes", component: QuotesPage, meta: { requiresAuth: true } }, + { path: "/outgoing-invoices", component: OutgoingInvoicesPage, meta: { requiresAuth: true } }, + { path: "/incoming-invoices", component: IncomingInvoicesPage, meta: { requiresAuth: true } }, + { path: "/imports/price-lists", component: PriceImportsPage, meta: { requiresAuth: true } }, + { path: "/settings/api-connectors", component: ApiConnectorsPage, meta: { requiresAuth: true } }, + { path: "/settings/price-rules", component: PriceRulesPage, meta: { requiresAuth: true } }, + { path: "/communications", component: CommunicationsPage, meta: { requiresAuth: true } }, + { path: "/documents", component: DocumentsPage, meta: { requiresAuth: true } }, + { path: "/activities", component: ActivitiesPage, meta: { requiresAuth: true } }, + { path: "/:pathMatch(.*)*", redirect: "/login" } + ] +}); + +router.beforeEach((to) => { + const session = authState.session; + if (!session && to.meta.requiresAuth) return "/login"; + if (session?.mustChangePassword && !to.meta.passwordChange) return "/change-initial-password"; + if (session && to.meta.publicOnly) return "/"; + return true; +}); diff --git a/web-frontend/src/styles.css b/web-frontend/src/styles.css new file mode 100644 index 0000000..d1f087d --- /dev/null +++ b/web-frontend/src/styles.css @@ -0,0 +1,788 @@ +:root { + color: #172026; + background: #f6faf9; + font-family: + Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", + sans-serif; +} + +* { + box-sizing: border-box; +} + +body { + margin: 0; +} + +button, +input, +select, +textarea { + font: inherit; +} + +button { + background: #118a7f; + border: 1px solid #118a7f; + border-radius: 6px; + color: #ffffff; + cursor: pointer; + font-weight: 700; + min-height: 38px; + padding: 8px 13px; +} + +button.secondary { + background: #ffffff; + border-color: #c9d3d6; + color: #26343b; +} + +button:disabled { + cursor: not-allowed; + opacity: 0.58; +} + +button:hover { + filter: brightness(0.96); +} + +a { + color: #118a7f; + text-decoration: none; +} + +code { + background: #e8edef; + border: 1px solid #ccd6d9; + border-radius: 6px; + color: #26343b; + padding: 4px 7px; + overflow-wrap: anywhere; +} + +.app-shell { + display: grid; + grid-template-columns: 244px minmax(0, 1fr); + height: 100vh; + min-height: 0; + overflow: hidden; +} + +.sidebar { + background: #ffffff; + border-right: 1px solid #dbe3e6; + display: flex; + flex-direction: column; + min-height: 0; + padding: 22px 16px; +} + +.brand { + align-items: center; + display: flex; + flex-shrink: 0; + gap: 10px; + margin-bottom: 26px; +} + +.brand-mark { + background: #ffffff; + border-radius: 6px; + display: block; + height: 34px; + object-fit: contain; + width: 34px; +} + +.brand strong, +.brand span { + display: block; +} + +.brand span { + color: #6a787d; + font-size: 13px; +} + +.brand strong { + color: #172026; +} + +.nav { + display: grid; + gap: 0; + min-height: 0; + overflow-y: auto; + padding-right: 4px; +} + +.nav-group-title { + color: #6a787d; + font-size: 11px; + font-weight: 800; + letter-spacing: 0; + margin: 0 0 0 0; +} + +.nav-link + .nav-link { + margin-top: 4px; +} + +.nav-link + .nav-group-title { + margin-top: 12px; +} + +.nav-link { + border-radius: 6px; + color: #334349; + font-weight: 650; + line-height: 1.2; + padding: 9px 10px; +} + +.nav-button { + background: #10545c; + border: 1px solid #10545c; + color: #eefbf8; + font-size: 12px; + font-weight: 500; + min-height: 36px; + padding: 8px 10px; + text-align: center; +} + +.nav-button:hover { + background: #118a7f; + border-color: #118a7f; + color: #ffffff; +} + +.nav-button.active { + background: #def4f0; + border-color: #def4f0; + color: #10545c; + font-weight: 500; +} + +.nav-groups { + overflow: visible; +} + +.nav-group-toggle { + align-items: center; + background: #f4f7f8; + border-color: #d8e2e5; + color: #334349; + display: flex; + font-size: 12px; + justify-content: space-between; + margin-top: 0; + min-height: 32px; + padding: 6px 9px; + width: 100%; +} + +.nav-dropdown { + position: relative; +} + +.nav-groups .nav-dropdown:not(:first-child) { + margin-top: 12px; +} + +.nav-dropdown-menu { + background: #ffffff; + border: 1px solid #cfd9dc; + border-radius: 6px; + box-shadow: 0 14px 34px rgb(28 43 48 / 16%); + display: grid; + gap: 2px; + left: 0; + min-width: 190px; + padding: 6px; + position: absolute; + top: calc(100% + 4px); + z-index: 80; +} + +.nav-dropdown-menu .nav-link { + font-size: 13px; + font-weight: 750; + line-height: 1.2; + min-height: 30px; + padding: 6px 8px; + white-space: nowrap; +} + +.nav-link.active, +.nav-link:hover { + background: #def4f0; + color: #10545c; +} + +.session-box { + border-top: 1px solid #dbe3e6; + display: grid; + flex-shrink: 0; + gap: 10px; + margin-top: 22px; + padding-top: 16px; +} + +.session-box span { + color: #435258; + font-size: 13px; + font-weight: 700; + overflow-wrap: anywhere; +} + +.session-box button { + background: #10545c; + border-color: #10545c; + color: #eefbf8; + font-size: 12px; + font-weight: 500; + min-height: 34px; + width: 100%; +} + +.settings-field { + gap: 5px; +} + +.settings-field span, +.session-box small { + color: #65757b; + font-size: 12px; + font-weight: 700; +} + +.settings-field select { + background: #10545c; + border: 1px solid #10545c; + border-radius: 6px; + color: #ffffff; + font-size: 12px; + min-height: 34px; + padding: 4px 8px; +} + +.main { + overflow: auto; + min-width: 0; + padding: 28px 28px 64px; + position: relative; +} + +.app-window { + background: #ffffff; + border: 1px solid #cfd9dc; + border-radius: 8px; + box-shadow: 0 18px 50px rgb(28 43 48 / 18%); + overflow: hidden; + position: fixed; +} + +.app-window-title { + align-items: center; + background: #eef8f6; + border-bottom: 1px solid #dbe3e6; + cursor: move; + display: flex; + justify-content: space-between; + padding: 9px 12px; + touch-action: none; +} + +.app-window-actions { + display: flex; + gap: 6px; +} + +.app-window-body { + height: calc(100% - 49px); + overflow: auto; + padding: 18px; +} + +.app-window-resize { + border-bottom: 12px solid #8fa0a6; + border-left: 12px solid transparent; + bottom: 5px; + cursor: nwse-resize; + height: 0; + position: absolute; + right: 5px; + touch-action: none; + width: 0; +} + +.icon-button { + min-height: 30px; + padding: 2px 10px; +} + +.taskbar { + align-items: center; + background: #ffffff; + border-top: 1px solid #cfd9dc; + bottom: 0; + display: flex; + gap: 8px; + left: 244px; + min-height: 48px; + overflow-x: auto; + padding: 7px 12px; + position: fixed; + right: 0; + z-index: 2000; +} + +.taskbar-button { + background: #10545c; + border-color: #10545c; + color: #ffffff; + flex: 0 0 auto; + font-size: 12px; + font-weight: 600; + min-height: 32px; + max-width: 220px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.taskbar-button.minimized { + background: #def4f0; + border-color: #c8ebe6; + color: #10545c; +} + +.page-header { + align-items: flex-start; + display: flex; + justify-content: space-between; + margin-bottom: 18px; +} + +.page-header h1 { + font-size: 28px; + line-height: 1.15; + margin: 0 0 6px; +} + +.page-header p, +.muted { + color: #65757b; + margin: 0; +} + +.panel { + background: #ffffff; + border: 1px solid #d9e1e4; + border-radius: 8px; + margin-bottom: 18px; + padding: 18px; +} + +.panel.compact { + padding: 15px 18px; +} + +.sub-panel { + border-top: 1px solid #dbe3e6; + display: grid; + gap: 8px; + margin-top: 18px; + padding-top: 16px; +} + +.sub-panel h2 { + font-size: 18px; + margin: 0; +} + +.data-row { + align-items: center; + border: 1px solid #dbe3e6; + border-radius: 6px; + display: grid; + gap: 8px; + grid-template-columns: minmax(180px, 1.2fr) repeat(3, minmax(70px, 0.6fr)); + padding: 9px 10px; +} + +.data-row small { + color: #65757b; +} + +.quote-line { + border: 1px solid #dbe3e6; + border-radius: 8px; + display: grid; + gap: 12px; + grid-template-columns: repeat(4, minmax(120px, 1fr)); + padding: 12px; +} + +.form-panel { + max-width: 720px; +} + +.form-panel.wide { + max-width: 1040px; +} + +.workspace-split { + display: grid; + gap: 16px; + grid-template-columns: 280px minmax(420px, 1fr); +} + +.list-panel, +.detail-panel { + margin-bottom: 0; +} + +.list-row { + align-items: flex-start; + background: #ffffff; + border: 1px solid transparent; + color: #26343b; + display: grid; + font-weight: 400; + gap: 3px; + margin-bottom: 5px; + padding: 10px; + text-align: left; + width: 100%; +} + +.list-row:hover, +.list-row.selected { + background: #def4f0; + border-color: #c6d9d8; + filter: none; +} + +.list-row strong { + font-size: 13px; +} + +.list-row span { + font-weight: 650; +} + +.list-row small { + color: #65757b; +} + +.split-row, +.section-title, +.button-row, +.form-actions { + align-items: center; + display: flex; + gap: 12px; +} + +.split-row, +.section-title { + justify-content: space-between; +} + +.section-title { + margin-bottom: 14px; +} + +.section-title h2, +.split-row h2 { + font-size: 18px; + margin: 0 0 4px; +} + +form { + display: grid; + gap: 14px; +} + +.form-grid { + display: grid; + gap: 14px; + grid-template-columns: repeat(2, minmax(0, 1fr)); +} + +.field { + display: grid; + gap: 6px; +} + +.field span, +.check-row span { + color: #435258; + font-size: 14px; + font-weight: 700; +} + +input, +select, +textarea { + background: #ffffff; + border: 1px solid #cbd5d9; + border-radius: 6px; + color: #172026; + min-height: 38px; + padding: 8px 10px; + width: 100%; +} + +.readonly-value { + align-items: center; + background: #f6faf9; + border: 1px solid #cbd5d9; + border-radius: 6px; + color: #172026; + display: flex; + min-height: 38px; + padding: 8px 10px; +} + +.list-search { + margin-bottom: 10px; +} + +textarea { + resize: vertical; +} + +.field.full-width { + grid-column: 1 / -1; +} + +select[multiple] { + min-height: 128px; +} + +.search-select { + display: grid; + gap: 8px; +} + +.search-select-current { + color: #435258; + font-size: 13px; +} + +.search-select-options { + border: 1px solid #dbe3e6; + border-radius: 6px; + display: grid; + gap: 4px; + max-height: 220px; + overflow: auto; + padding: 6px; +} + +.search-option { + background: #ffffff; + border: 1px solid transparent; + color: #26343b; + display: grid; + gap: 2px; + min-height: 0; + padding: 7px 8px; + text-align: left; +} + +.search-option span { + color: #65757b; + font-size: 12px; +} + +.search-option strong { + font-size: 13px; +} + +.search-option:hover, +.search-option.selected { + background: #def4f0; + border-color: #c6d9d8; + filter: none; +} + +.check-row { + align-items: center; + display: flex; + gap: 9px; +} + +.check-row input { + min-height: 16px; + width: 16px; +} + +.check-row.compact { + gap: 6px; +} + +.check-row.compact span { + font-size: 13px; +} + +.role-checks { + align-items: center; + display: flex; + flex-wrap: wrap; + gap: 8px 12px; +} + +.form-actions, +.button-row { + flex-wrap: wrap; + margin-top: 4px; +} + +.form-status { + border-radius: 6px; + display: block; + min-height: 20px; + padding: 0; +} + +.form-status.info, +.form-status.success, +.form-status.error { + padding: 10px 12px; +} + +.form-status.info { + background: #eef8f6; + color: #334349; +} + +.form-status.success { + background: #e6f4ea; + color: #1f5d38; +} + +.form-status.error { + background: #fdeceb; + color: #8a2521; +} + +.data-table { + border: 1px solid #e0e7ea; + border-radius: 8px; + display: grid; + overflow: hidden; +} + +.data-table.two-cols { + grid-template-columns: minmax(0, 1fr) 220px; +} + +.data-table.registrations { + grid-template-columns: minmax(140px, 1.2fr) minmax(170px, 1fr) 140px 180px; +} + +.data-table.users { + grid-template-columns: minmax(180px, 1fr) 140px minmax(260px, 1.2fr) 130px; +} + +.data-table > * { + border-bottom: 1px solid #edf1f3; + min-width: 0; + padding: 12px 14px; +} + +.table-head { + background: #eef8f6; + color: #526268; + font-size: 13px; + font-weight: 800; + text-transform: uppercase; +} + +.status-pill { + background: #def4f0; + border-radius: 999px; + color: #118a7f; + display: inline-block; + font-size: 13px; + font-weight: 800; + height: 28px; + line-height: 28px; + margin: 8px 12px; + padding: 0 10px; +} + +.detail-grid { + display: grid; + grid-template-columns: 180px minmax(0, 1fr); + margin: 0 0 16px; +} + +.detail-grid dt, +.detail-grid dd { + border-bottom: 1px solid #edf1f3; + margin: 0; + padding: 10px 0; +} + +.detail-grid dt { + color: #65757b; + font-weight: 800; +} + +.empty { + background: #f7f9fa; + border: 1px dashed #cbd5d9; + border-radius: 8px; + color: #65757b; + margin: 0; + padding: 18px; +} + +@media (max-width: 860px) { + .app-shell { + grid-template-columns: 1fr; + height: auto; + min-height: 100vh; + overflow: visible; + } + + .sidebar { + border-bottom: 1px solid #dbe3e6; + border-right: 0; + max-height: none; + } + + .nav { + grid-template-columns: repeat(2, minmax(0, 1fr)); + overflow-y: visible; + } + + .main { + padding: 18px; + } + + .taskbar { + left: 0; + } + + .form-grid, + .workspace-split, + .data-table.two-cols, + .data-table.registrations, + .data-table.users, + .detail-grid { + grid-template-columns: 1fr; + } + + .split-row, + .section-title { + align-items: flex-start; + flex-direction: column; + } +} diff --git a/web-frontend/src/types.ts b/web-frontend/src/types.ts new file mode 100644 index 0000000..4f8fde0 --- /dev/null +++ b/web-frontend/src/types.ts @@ -0,0 +1,348 @@ +export type ApiResult = + | { ok: true; data: T } + | { ok: false; message: string }; + +export type OrganizationRegistration = { + id: string; + organization_name?: string; + email: string; + status: string; + requested_at: string; + decided_at?: string | null; + decided_by_user_id?: string | null; +}; + +export type OrganizationRegistrationDetail = OrganizationRegistration & { + organization_id?: string | null; + schema_name?: string | null; + provisioning_error?: string | null; + decision_note?: string | null; +}; + +export type OrganizationUser = { + user_id: string; + email: string; + status: string; + roles: string[]; +}; + +export type Customer = { + id: string; + customer_number: string; + name: string; + status: string; + details: { + street: string; + postal_code: string; + city: string; + country: string; + email: string; + phone: string; + }; + standard_discount_percent: string; + cash_discount_term_id?: string | null; +}; + +export type Supplier = Omit & { + supplier_number: string; + payment_days?: number | null; +}; + +export type Item = { + id: string; + item_number: string; + name: string; + unit: string; + tax_rate: string; + default_purchase_price?: string | null; + default_sales_price?: string | null; + status: string; +}; + +export type ItemPriceHistory = { + id: string; + item_id: string; + purchase_price?: string | null; + sales_price?: string | null; + source: string; + valid_from: string; + created_by_user_id?: string | null; + created_at: string; +}; + +export type CashDiscountTerm = { + id: string; + code: string; + name: string; + discount_percent: string; + discount_days: number; + net_days?: number | null; + valid_from?: string | null; + valid_until?: string | null; + is_default_customer_term: boolean; + is_default_supplier_term: boolean; + is_active: boolean; +}; + +export type Activity = { + id: string; + activity_number?: string | null; + activity_type: string; + title: string; + body: string; + status: string; + priority: string; + due_at?: string | null; +}; + +export type NumberRange = { + id: string; + code: string; + pattern: string; + counter_value: number; + counter_padding: number; + reset_rule?: string | null; + is_active: boolean; +}; + +export type QuoteItem = { + id?: string; + line_number?: number; + item_id: string; + description: string; + quantity: string; + unit_price: string; + original_unit_price?: string | null; + discount_percent: string; + tax_rate: string; + price_overridden?: boolean; +}; + +export type Quote = { + id: string; + quote_number: string; + customer_id: string; + status: string; + valid_until?: string | null; + cash_discount_term_id?: string | null; + customer_discount_percent: string; + notes: string; + items: QuoteItem[]; +}; + +export type OutgoingInvoiceItem = QuoteItem; + +export type OutgoingInvoice = { + id: string; + invoice_number: string; + customer_id: string; + status: string; + cash_discount_term_id?: string | null; + customer_discount_percent: string; + issued_at?: string | null; + due_at?: string | null; + source_quote_id?: string | null; + finalized_at?: string | null; + items: OutgoingInvoiceItem[]; +}; + +export type IncomingInvoiceItem = { + id?: string; + line_number?: number; + item_id?: string | null; + description: string; + quantity: string; + unit_price: string; + tax_rate: string; +}; + +export type IncomingInvoice = { + id: string; + invoice_number: string; + supplier_id: string; + status: string; + cash_discount_term_id?: string | null; + invoice_date?: string | null; + due_at?: string | null; + items: IncomingInvoiceItem[]; +}; + +export type PriceListImportRow = { + row_number: number; + item_number: string; + name: string; + unit: string; + tax_rate: string; + purchase_price?: string | null; + sales_price?: string | null; + action: string; + error?: string | null; +}; + +export type PriceListImportPreview = { + rows: PriceListImportRow[]; + total_rows: number; + valid_rows: number; + error_rows: number; +}; + +export type PriceListImportApplyResponse = { + import_id: string; + applied_rows: number; + error_rows: number; +}; + +export type ApiConnector = { + id: string; + code: string; + name: string; + connector_type: string; + config: Record; + is_active: boolean; + sync_interval_minutes?: number | null; + last_sync_at?: string | null; +}; + +export type PriceRule = { + id: string; + code: string; + name: string; + source_type: "import" | "api" | "supplier"; + source_id?: string | null; + markup_percent: string; + rounding_mode: "none" | "cent" | "five_cent" | "ten_cent" | "whole"; + is_active: boolean; +}; + +export type EntityLink = { + entity_type: string; + entity_id: string; +}; + +export type Communication = { + id: string; + communication_type: string; + direction: string; + subject: string; + body: string; + status: string; + occurred_at?: string | null; + links: EntityLink[]; +}; + +export type DocumentVersion = { + id: string; + version_no: number; + file_name: string; + content_type: string; + file_size: number; + checksum_sha256: string; + created_at: string; +}; + +export type DocumentRecord = { + id: string; + title: string; + description: string; + status: string; + latest_version?: DocumentVersion | null; + links: EntityLink[]; +}; + +export type DocumentDownload = { + document_id: string; + version_id: string; + file_name: string; + content_type: string; + content_base64: string; +}; + +export type DocumentAuditLogEntry = { + id: string; + document_id: string; + version_id?: string | null; + action: string; + user_id?: string | null; + created_at: string; +}; + +export type LoginResponse = { + user_id: string; + access_token: string; + organization_id?: string | null; + must_change_password: boolean; + organizations: Array<{ + id: string; + schema_name?: string | null; + status: string; + }>; +}; + +export type AuthSession = { + email: string; + userId: string; + accessToken: string; + organizationId?: string | null; + mustChangePassword: boolean; +}; + +export type NavigationMode = "scroll" | "groups"; + +export type UserNavigationSettings = { + mode: NavigationMode; +}; + +export type RecordSummary = { + id: string; + title: string; + updated_at: string; +}; + +export type ServerMessage = + | { type: "snapshot"; payload: { records: RecordSummary[] } } + | { type: "record_changed"; payload: { record: RecordSummary } } + | { type: "pong" } + | { type: "error"; payload: { message: string } }; + +export type ClientMessage = + | { type: "subscribe"; payload: { topic: string } } + | { type: "ping" }; + +export type WireMessage = + | { type: "hello"; payload: HelloMessage } + | { type: "hello_ack"; payload: HelloAckMessage } + | { type: "encrypted"; payload: EncryptedEnvelope } + | { type: "error"; payload: { message: string } }; + +export type HelloMessage = { + protocol_version: number; + key_id: string; + session_key: string; +}; + +export type HelloAckMessage = { + protocol_version: number; + key_id: string; +}; + +export type EncryptedEnvelope = { + enc: string; + key_id: string; + nonce: string; + ciphertext: string; +}; + +export type SessionCrypto = { + keyId: string; + key: CryptoKey; + exportedKey: string; +}; + +export type DevBootstrapResponse = { + organization_id: string; + schema_name: string; + user_id: string; + email: string; + password: string; + dev_mode: boolean; +}; diff --git a/web-frontend/src/user-settings.ts b/web-frontend/src/user-settings.ts new file mode 100644 index 0000000..a9b4289 --- /dev/null +++ b/web-frontend/src/user-settings.ts @@ -0,0 +1,32 @@ +import { reactive } from "vue"; +import { apiGet, apiPut } from "./api"; +import type { NavigationMode, UserNavigationSettings } from "./types"; + +export const userSettings = reactive({ + navigationMode: "scroll" as NavigationMode, + status: "", + loaded: false +}); + +export async function loadUserSettings() { + const result = await apiGet("/api/v1/users/me/settings/navigation"); + userSettings.loaded = true; + if (result.ok) { + userSettings.navigationMode = result.data.mode; + userSettings.status = ""; + } else { + userSettings.status = result.message; + } +} + +export async function saveNavigationMode(mode: NavigationMode) { + userSettings.navigationMode = mode; + userSettings.status = "Speichere Menü..."; + const result = await apiPut("/api/v1/users/me/settings/navigation", { mode }); + if (result.ok) { + userSettings.navigationMode = result.data.mode; + userSettings.status = "Menü gespeichert."; + } else { + userSettings.status = result.message; + } +} diff --git a/web-frontend/src/utils.ts b/web-frontend/src/utils.ts new file mode 100644 index 0000000..ee49cc5 --- /dev/null +++ b/web-frontend/src/utils.ts @@ -0,0 +1,4 @@ +export function formatDate(value?: string | null) { + if (!value) return "-"; + return new Date(value).toLocaleString("de-DE"); +} diff --git a/web-frontend/src/views/AcceptInvitationPage.vue b/web-frontend/src/views/AcceptInvitationPage.vue new file mode 100644 index 0000000..f4fbdd9 --- /dev/null +++ b/web-frontend/src/views/AcceptInvitationPage.vue @@ -0,0 +1,32 @@ + + + diff --git a/web-frontend/src/views/ActivitiesPage.vue b/web-frontend/src/views/ActivitiesPage.vue new file mode 100644 index 0000000..8b7093f --- /dev/null +++ b/web-frontend/src/views/ActivitiesPage.vue @@ -0,0 +1,39 @@ + +