- Created a new SQL migration for the sag_salgsvarer table to manage sales and purchase items. - Implemented a new HTML template for the Varekøb & Salg module, including summary cards and tables for sales and purchases. - Added JavaScript functions for loading and rendering order data dynamically. - Introduced a new backend search module for customers, contacts, hardware, and locations with autocomplete functionality. - Developed an email templates API for managing system and customer-specific email templates. - Created multiple migrations for Nextcloud instances, cache, audit logs, email templates, sag comments, hardware locations, and billing methods. - Enhanced the sag module with solutions, order lines, work types, and 2FA support for user authentication.
241 lines
6.4 KiB
Markdown
241 lines
6.4 KiB
Markdown
# Nextcloud-modul – BMC Hub
|
||
|
||
## 1. Formål og rolle i Hubben
|
||
Nextcloud-modulet gør det muligt at sælge, administrere og supportere kunders Nextcloud‑løsninger direkte i Hubben.
|
||
|
||
Hubben er styrende system. Nextcloud er et eksternt drifts‑ og brugersystem, som Hubben taler med direkte (ingen gateway).
|
||
|
||
## 2. Aktivering af modulet
|
||
Modulet er kontekstbaseret og aktiveres via tag:
|
||
|
||
- Når Firma, Kontakt eller Sag har tagget `nextcloud`, vises en Nextcloud‑fane i UI.
|
||
- Uden tag vises ingen Nextcloud‑funktioner.
|
||
|
||
## 3. Kunde → Nextcloud‑fane (overblik)
|
||
Fanen indeholder:
|
||
1. Drifts‑ og systeminformation (read‑only)
|
||
2. Handlinger relateret til brugere
|
||
3. Historik (hvad Hubben har gjort mod instansen)
|
||
|
||
Fanen må aldrig blokere kundevisningen, selv hvis Nextcloud er utilgængelig.
|
||
|
||
## 4. Systemstatus og driftsinformation
|
||
**Datakilde**: Nextcloud Serverinfo API
|
||
|
||
- `GET /ocs/v2.php/apps/serverinfo/api/v1/info`
|
||
- Direkte kald til Nextcloud
|
||
- Autentificeret
|
||
- Read‑only
|
||
- Cached i DB med global TTL = 5 min
|
||
|
||
### 4.1 Overblik
|
||
Vises øverst i fanen:
|
||
- Instans‑status (Online / Offline / Ukendt)
|
||
- Sidst opdateret
|
||
- Nextcloud‑version
|
||
- PHP‑version
|
||
- Database‑type og ‑version
|
||
|
||
### 4.2 Ressourceforbrug
|
||
Vises som simple værdier/badges:
|
||
- CPU
|
||
- Load average (1 / 5 / 15 min)
|
||
- Antal kerner
|
||
- RAM (total + brug i %)
|
||
- Disk (total + brug i % + fri plads)
|
||
|
||
Ved kritiske værdier vises advarsel.
|
||
|
||
### 4.3 Nextcloud‑nøgletal
|
||
Hvor API tillader det:
|
||
- Antal brugere
|
||
- Aktive brugere
|
||
- Antal filer
|
||
- Samlet datamængde
|
||
- Status på: database, cache/Redis, cron/background jobs
|
||
|
||
## 5. Handlinger i Nextcloud‑fanen
|
||
Knapper:
|
||
- Tilføj ny bruger
|
||
- Reset password
|
||
- Luk bruger
|
||
- Gensend guide
|
||
|
||
Alle handlinger:
|
||
- udføres direkte mod Nextcloud
|
||
- logges i Hub
|
||
- kan spores i historik
|
||
- kan knyttes til sag
|
||
|
||
## 6. Tilføj ny bruger (primær funktion)
|
||
|
||
### 6.1 Start af flow
|
||
- Ved “Tilføj ny bruger” oprettes automatisk en ny Sag
|
||
- Sagstype: **Nextcloud – Brugeroprettelse**
|
||
- Ingen Nextcloud‑handling udføres uden en sag
|
||
|
||
### 6.2 Sag – felter og logik
|
||
**Firma**
|
||
- Vælg eksisterende firma
|
||
- Hub slår tilknyttet Nextcloud‑instans op i DB og vælger automatisk
|
||
- Instans kan ikke ændres manuelt
|
||
|
||
**Kontaktperson**
|
||
- Vælg eksisterende kontakt eller opret ny
|
||
- Bruges til kommunikation, velkomstmail og ejerskab af sag
|
||
|
||
**Grupper**
|
||
- Multiselect
|
||
- Hentes live fra Nextcloud (OCS groups API)
|
||
- Kun gyldige grupper kan vælges
|
||
|
||
**Velkomstbrev**
|
||
- Checkbox: skal velkomstbrev sendes?
|
||
- Hvis ja: bruger oprettes, password genereres, guide + logininfo sendes
|
||
- Hvis nej: bruger oprettes uden mail, sag forbliver åben til manuel opfølgning
|
||
|
||
## 7. Øvrige handlinger
|
||
|
||
**Reset password**
|
||
- Vælg eksisterende Nextcloud‑bruger
|
||
- Nyt password genereres
|
||
- Valg: send mail til kontakt eller kun log i sag
|
||
|
||
**Luk bruger**
|
||
- Bruger deaktiveres i Nextcloud
|
||
- Data bevares
|
||
- Kræver eksplicit bekræftelse
|
||
- Logges i sag og historik
|
||
|
||
**Gensend guide**
|
||
- Gensender velkomstmail og guide
|
||
- Password ændres ikke
|
||
- Kan udføres uden ny sag, men logges
|
||
|
||
## 8. Arkitekturprincipper
|
||
- Hub ejer: firma, kontakt, sag, historik
|
||
- Nextcloud ejer: brugere, filer, rettigheder
|
||
- Integration er direkte (ingen gateway)
|
||
- Per‑instans auth ligger krypteret i DB
|
||
- Global DB‑cache (5 min) for read‑only statusdata
|
||
|
||
## 9. Logning og sporbarhed
|
||
For hver handling gemmes:
|
||
- tidspunkt
|
||
- handlingstype
|
||
- udførende bruger
|
||
- mål (bruger/instans)
|
||
- teknisk resultat (success/fejl)
|
||
|
||
Audit‑log er **separat pr. kunde**, med **manuel retention** og **tidsbaseret partitionering**.
|
||
|
||
## 10. Afgrænsninger (v1)
|
||
Modulet indeholder ikke:
|
||
- ændring af server‑konfiguration
|
||
- håndtering af apps
|
||
- ændring af kvoter
|
||
- direkte admin‑login
|
||
|
||
## 11. Klar til udvidelse
|
||
Modulet er designet til senere udvidelser:
|
||
- overvågning → automatisk sag
|
||
- historiske grafer
|
||
- offboarding‑flows
|
||
- kvote‑styring
|
||
- SLA‑rapportering
|
||
|
||
## 12. Sikkerhed og drift
|
||
- Credentials krypteres med `settings.NEXTCLOUD_ENCRYPTION_KEY`
|
||
- Safety switches: `NEXTCLOUD_READ_ONLY` og `NEXTCLOUD_DRY_RUN` (default true)
|
||
- Ingen credentials i UI eller logs
|
||
- TLS‑only base URLs
|
||
|
||
## 13. Backend‑struktur (plan)
|
||
Placering: `app/modules/nextcloud/`
|
||
- `backend/router.py`
|
||
- `backend/service.py`
|
||
- `backend/models.py`
|
||
|
||
Alle eksterne kald går via service‑laget, som:
|
||
- loader instans fra DB
|
||
- dekrypterer credentials
|
||
- bruger global DB‑cache (5 min)
|
||
- skriver audit‑log pr. kunde
|
||
|
||
## 14. Database‑model (plan)
|
||
|
||
### `nextcloud_instances`
|
||
- `customer_id` FK
|
||
- `base_url`
|
||
- `auth_type`
|
||
- `username`
|
||
- `password_encrypted`
|
||
- `is_enabled`, `disabled_at`
|
||
- `created_at`, `updated_at`, `deleted_at`
|
||
|
||
### `nextcloud_cache`
|
||
- `cache_key` (PK)
|
||
- `payload` (JSONB)
|
||
- `expires_at`
|
||
- `created_at`
|
||
|
||
### `nextcloud_audit_log`
|
||
- `customer_id`, `instance_id`
|
||
- `event_type`
|
||
- `request_meta`, `response_meta`
|
||
- `actor_user_id`
|
||
- `created_at`
|
||
|
||
Partitionering: månedlig range på `created_at`. Retention er manuel via admin‑UI.
|
||
|
||
## 15. API‑endpoints (v1)
|
||
|
||
### Instanser (admin)
|
||
- `GET /api/v1/nextcloud/instances`
|
||
- `POST /api/v1/nextcloud/instances`
|
||
- `PATCH /api/v1/nextcloud/instances/{id}`
|
||
- `POST /api/v1/nextcloud/instances/{id}/disable`
|
||
- `POST /api/v1/nextcloud/instances/{id}/enable`
|
||
- `POST /api/v1/nextcloud/instances/{id}/rotate-credentials`
|
||
|
||
### Status + grupper
|
||
- `GET /api/v1/nextcloud/instances/{id}/status`
|
||
- `GET /api/v1/nextcloud/instances/{id}/groups`
|
||
|
||
### Brugere (handlinger)
|
||
- `POST /api/v1/nextcloud/instances/{id}/users` (opret)
|
||
- `POST /api/v1/nextcloud/instances/{id}/users/{uid}/reset-password`
|
||
- `POST /api/v1/nextcloud/instances/{id}/users/{uid}/disable`
|
||
- `POST /api/v1/nextcloud/instances/{id}/users/{uid}/resend-guide`
|
||
|
||
Alle endpoints skal:
|
||
- validere `is_enabled = true`
|
||
- håndhæve kundeejerskab
|
||
- skrive audit‑log
|
||
- respektere `READ_ONLY`/`DRY_RUN`
|
||
|
||
## 16. UI‑krav (plan)
|
||
Nextcloud‑fanen i kundevisning skal vise:
|
||
- Systemstatus
|
||
- Nøgletal
|
||
- Handlinger
|
||
- Historik
|
||
|
||
Admin‑UI (Settings) skal give:
|
||
- Liste over instanser
|
||
- Enable/disable
|
||
- Rotation af credentials
|
||
- Retentionstyring af audit‑log pr. kunde
|
||
|
||
## 17. Migrations (plan)
|
||
1. `migrations/0XX_nextcloud_instances.sql`
|
||
2. `migrations/0XX_nextcloud_cache.sql`
|
||
3. `migrations/0XX_nextcloud_audit_log.sql` (partitioneret)
|
||
|
||
## 18. Næste skridt
|
||
1. Opret migrationsfiler
|
||
2. Implementer kryptering helper
|
||
3. Implementer service‑lag
|
||
4. Implementer routere og schemas
|
||
5. Implementer UI‑fanen + admin‑UI
|
||
6. Implementer audit‑log viewer/export |