Compare commits

..

No commits in common. "main" and "feature/sag-tidsforbrug-v1" have entirely different histories.

734 changed files with 16414 additions and 156613 deletions

View File

@ -2,8 +2,6 @@
# POSTGRESQL DATABASE - Local Development
# =====================================================
DATABASE_URL=postgresql://bmc_hub:bmc_hub@postgres:5432/bmc_hub
HUB_BASE_URL=https://hub.bmcnetworks.dk
MOBILE_RECORDER_PROVISIONING_TOKEN=replace-with-a-long-random-service-token
# Database credentials (bruges af docker-compose)
POSTGRES_USER=bmc_hub
@ -11,12 +9,6 @@ POSTGRES_PASSWORD=bmc_hub
POSTGRES_DB=bmc_hub
POSTGRES_PORT=5433 # Changed from 5432 to avoid conflicts with other services
# Public website content administration API
WEBSITE_CONTENT_API_URL=https://isp.bmcnetworks.dk/api/admin-content.php
WEBSITE_CONTENT_API_HOST_HEADER=ct.bmcnetworks.dk
WEBSITE_CONTENT_API_TOKEN=
WEBSITE_CONTENT_API_TIMEOUT_SECONDS=20
# =====================================================
# API CONFIGURATION
# =====================================================
@ -24,16 +16,6 @@ API_HOST=0.0.0.0
API_PORT=8001 # Changed from 8000 to avoid conflicts with other services
ENABLE_RELOAD=false # Set to true for live code reload (causes log spam in Docker)
# Customer default economics (used as fallback defaults in customer detail)
CUSTOMER_DEFAULT_MARGIN_PERCENT=20.0
CUSTOMER_DEFAULT_INVOICE_FEE=49.0
CUSTOMER_DEFAULT_HOURLY_RATE=1200.0
# FirmaAPI (CVR company lookup)
FIRMAAPI_BASE_URL=https://firmaapi.dk/api/v1
FIRMAAPI_API_KEY=
FIRMAAPI_TIMEOUT_SECONDS=12
# =====================================================
# SECURITY
# =====================================================
@ -77,57 +59,6 @@ ECONOMIC_AGREEMENT_GRANT_TOKEN=your_agreement_grant_token_here
# 🚨 SAFETY SWITCHES - Beskytter mod utilsigtede ændringer
ECONOMIC_READ_ONLY=true # Set to false ONLY after testing
ECONOMIC_DRY_RUN=true # Set to false ONLY when ready for production writes
# =====================================================
# ALSO Cloud Marketplace Integration (Optional)
# =====================================================
ALSO_ENABLED=false
ALSO_API_BASE_URL=
ALSO_API_KEY=
ALSO_API_SECRET=
ALSO_TIMEOUT_SECONDS=20
# 🚨 SAFETY SWITCHES - Beskytter mod utilsigtede importer/sync
ALSO_READ_ONLY=true
ALSO_DRY_RUN=true
# =====================================================
# FedEx Integration (Optional)
# =====================================================
FEDEX_ENABLED=false
FEDEX_API_KEY=
FEDEX_API_SECRET=
FEDEX_ACCOUNT_NUMBER=
FEDEX_BASE_URL=
FEDEX_TIMEOUT_SECONDS=20
# 🚨 SAFETY SWITCHES - Beskytter mod utilsigtede forsendelser
FEDEX_READ_ONLY=true
FEDEX_DRY_RUN=true
# =====================================================
# Shipmondo Integration (Optional)
# Opret API-bruger og API-nøgle i Shipmondo under Indstillinger > API.
# Brug https://sandbox.shipmondo.com/api/public/v3 til sandbox.
# =====================================================
SHIPMONDO_ENABLED=false
SHIPMONDO_API_BASE_URL=https://app.shipmondo.com/api/public/v3
SHIPMONDO_API_USER=
SHIPMONDO_API_KEY=
SHIPMONDO_TIMEOUT_SECONDS=30
SHIPMONDO_SENDER_NAME=BMC Networks
SHIPMONDO_SENDER_ATTENTION=
SHIPMONDO_SENDER_ADDRESS1=
SHIPMONDO_SENDER_ADDRESS2=
SHIPMONDO_SENDER_POSTAL_CODE=
SHIPMONDO_SENDER_CITY=
SHIPMONDO_SENDER_COUNTRY_CODE=DK
SHIPMONDO_SENDER_EMAIL=
SHIPMONDO_SENDER_PHONE=
# Start sikkert: drafts er tilladt, men booking er blokeret.
SHIPMONDO_READ_ONLY=true
SHIPMONDO_DRY_RUN=true
# =====================================================
# Nextcloud Integration (Optional)
# =====================================================
@ -138,20 +69,6 @@ NEXTCLOUD_CACHE_TTL_SECONDS=300
# Generate a Fernet key: python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"
NEXTCLOUD_ENCRYPTION_KEY=
# =====================================================
# Links / Endpoints Module (Optional)
# =====================================================
LINKS_MODULE_ENABLED=false
LINKS_READ_ONLY=true
LINKS_DRY_RUN=true
LINKS_DEAD_LINK_CHECK_ENABLED=true
LINKS_DEAD_LINK_CHECK_INTERVAL_MINUTES=60
LINKS_CHECK_TIMEOUT_SECONDS=5
# Vaultwarden (Bitwarden-compatible)
VAULTWARDEN_BASE_URL=
VAULTWARDEN_API_TOKEN=
# =====================================================
# vTiger Cloud Integration (Required for Subscriptions)
# =====================================================
@ -178,7 +95,6 @@ IMAP_USERNAME=your_email@gmail.com
IMAP_PASSWORD=your_app_password
IMAP_USE_SSL=true
IMAP_FOLDER=INBOX
IMAP_TEST_FOLDER=BMC_TEST # Shared test inbox for all mail scenarios
IMAP_READ_ONLY=true # Safety: READ-ONLY mode
# Microsoft Graph API (Alternative to IMAP - for Office365/Outlook)
@ -195,12 +111,8 @@ EMAIL_RULES_AUTO_PROCESS=false
EMAIL_AI_ENABLED=false
EMAIL_AUTO_CLASSIFY=false
EMAIL_AI_CONFIDENCE_THRESHOLD=0.7
EMAIL_REQUIRE_MANUAL_APPROVAL=true
EMAIL_AUTO_CREATE_CASES_FROM_EMAIL=false
EMAIL_MAX_FETCH_PER_RUN=50
EMAIL_PROCESS_ALLOW_FOLDER_OVERRIDE=true
EMAIL_PROCESS_INTERVAL_MINUTES=5
EMAIL_WORKFLOWS_ENABLED=true
EMAIL_WORKFLOW_AUTORUN_ENABLED=false
EMAIL_MAX_UPLOAD_SIZE_MB=50
ALLOWED_EXTENSIONS=.pdf,.jpg,.jpeg,.png,.gif,.doc,.docx,.xls,.xlsx,.zip
ALLOWED_EXTENSIONS=.pdf,.jpg,.jpeg,.png,.gif,.doc,.docx,.xls,.xlsx,.zip

View File

@ -24,7 +24,6 @@ GITHUB_REPO=ct/bmc_hub
# POSTGRESQL DATABASE - Production
# =====================================================
DATABASE_URL=postgresql://bmc_hub_prod:CHANGE_THIS_PASSWORD@postgres:5432/bmc_hub_prod
HUB_BASE_URL=https://hub.bmcnetworks.dk
# Database credentials (bruges af docker-compose/podman-compose)
POSTGRES_USER=bmc_hub_prod
@ -45,16 +44,6 @@ API_HOST=0.0.0.0
API_PORT=8000
API_RELOAD=false
# Customer default economics (used as fallback defaults in customer detail)
CUSTOMER_DEFAULT_MARGIN_PERCENT=20.0
CUSTOMER_DEFAULT_INVOICE_FEE=49.0
CUSTOMER_DEFAULT_HOURLY_RATE=1200.0
# FirmaAPI (CVR company lookup)
FIRMAAPI_BASE_URL=https://firmaapi.dk/api/v1
FIRMAAPI_API_KEY=
FIRMAAPI_TIMEOUT_SECONDS=12
# =====================================================
# SECURITY - Production
# =====================================================
@ -87,69 +76,3 @@ ECONOMIC_AGREEMENT_GRANT_TOKEN=your_production_grant_here
# VIGTIGT: Brug kun 'true' eller 'false' uden kommentarer på samme linje
ECONOMIC_READ_ONLY=true
ECONOMIC_DRY_RUN=true
# =====================================================
# ALSO Cloud Marketplace Integration - Production (Optional)
# =====================================================
ALSO_ENABLED=false
ALSO_API_BASE_URL=
ALSO_API_KEY=
ALSO_API_SECRET=
ALSO_TIMEOUT_SECONDS=20
# 🚨 SAFETY SWITCHES
# Start ALTID med begge sat til true i ny production deployment!
ALSO_READ_ONLY=true
ALSO_DRY_RUN=true
# =====================================================
# FedEx Integration - Production
# =====================================================
FEDEX_ENABLED=false
FEDEX_API_KEY=
FEDEX_API_SECRET=
FEDEX_ACCOUNT_NUMBER=
FEDEX_BASE_URL=
FEDEX_TIMEOUT_SECONDS=20
# 🚨 SAFETY SWITCHES
# Start ALTID med begge sat til true i ny production deployment!
FEDEX_READ_ONLY=true
FEDEX_DRY_RUN=true
# =====================================================
# Shipmondo Integration - Production
# =====================================================
SHIPMONDO_ENABLED=false
SHIPMONDO_API_BASE_URL=https://app.shipmondo.com/api/public/v3
SHIPMONDO_API_USER=
SHIPMONDO_API_KEY=
SHIPMONDO_TIMEOUT_SECONDS=30
SHIPMONDO_SENDER_NAME=BMC Networks
SHIPMONDO_SENDER_ATTENTION=
SHIPMONDO_SENDER_ADDRESS1=
SHIPMONDO_SENDER_ADDRESS2=
SHIPMONDO_SENDER_POSTAL_CODE=
SHIPMONDO_SENDER_CITY=
SHIPMONDO_SENDER_COUNTRY_CODE=DK
SHIPMONDO_SENDER_EMAIL=
SHIPMONDO_SENDER_PHONE=
# Start ALTID med begge sat til true.
SHIPMONDO_READ_ONLY=true
SHIPMONDO_DRY_RUN=true
# =====================================================
# Links / Endpoints Module - Production (Optional)
# =====================================================
# Start disabled; enable after migration + validation
LINKS_MODULE_ENABLED=false
LINKS_READ_ONLY=true
LINKS_DRY_RUN=true
LINKS_DEAD_LINK_CHECK_ENABLED=true
LINKS_DEAD_LINK_CHECK_INTERVAL_MINUTES=60
LINKS_CHECK_TIMEOUT_SECONDS=5
# Vaultwarden (Bitwarden-compatible)
VAULTWARDEN_BASE_URL=
VAULTWARDEN_API_TOKEN=

View File

@ -258,32 +258,6 @@ crontab -e
## 🔄 Opdatering til Ny Version
### Valg Af Update-metode
| Situation | Brug metode | Hvorfor |
|---|---|---|
| Små kodeændringer i `app/*` eller `main.py` | `./update_fast.sh --ref <ref>` | Hurtig update uden ny release-tag/pakke |
| Ændringer i `migrations/*` | `./updateto.sh <version>` | Kræver kontrolleret release + migrations-flow |
| Ændringer i `requirements.txt` eller `Dockerfile` | `./updateto.sh <version>` | Kræver fuld image-build og versionsstyring |
| Ændringer i `docker-compose*.yml`, scripts eller `.env` | `./updateto.sh <version>` | Drift/infra-konfiguration skal deployes fuldt |
| Når du er i tvivl | `./updateto.sh <version>` | Sikreste og mest forudsigelige metode |
Hurtig start for fast mode:
```bash
# Tjek først scope
./update_fast.sh --ref main --dry-run --allow-prod
# Kør update
./update_fast.sh --ref <commit-eller-tag> --allow-prod
```
Rollback i fast mode:
```bash
./update_fast.sh --rollback <backup-id> --allow-prod
```
### På din Mac:
```bash

View File

@ -7,7 +7,6 @@ RUN apt-get update && apt-get install -y \
curl \
git \
libpq-dev \
libzbar0 \
gcc \
g++ \
python3-dev \

View File

@ -1,29 +0,0 @@
# Release Notes v2.2.81
Dato: 2026-05-04
## Fixes
- Kontakter: Stabiliseret paginering i `/api/v1/contacts` ved at tilfoeje deterministisk tie-break (`ORDER BY ... , c.id`).
- Kontakter: Fjernet skrøbelig frontend query-key short-circuit i kontaktlisten, som kunne medfoere at listen ikke blev genindlaest korrekt efter afbrudte requests.
- Telefoni: Rettet datofilter i `/api/v1/telefoni/calls` saa `date_to` er inklusiv hele dagen.
- Telefoni: Validerer nu tydeligt `date_from`/`date_to` format (`YYYY-MM-DD`) med 422 ved ugyldig input.
- Deployment: `updateto.sh` bruger nu dynamiske containernavne baseret paa `STACK_NAME` i stedet for hardcoded `-prod`.
## Beroerte filer
- `app/contacts/backend/router_simple.py`
- `app/contacts/frontend/contacts.html`
- `app/modules/telefoni/backend/router.py`
- `updateto.sh`
- `VERSION`
## Drift
Hvis stacken koerer som `v2`, deploy med:
```bash
sudo -iu bmcadmin
cd /srv/podman/bmc_hub_v2
./updateto.sh v2.2.81
```

View File

@ -1,21 +0,0 @@
# Release Notes v2.2.82
Dato: 2026-05-04
## Hotfix
- `updateto.sh` fjerner nu automatisk `STACK_NAME` fra `.env` inden startup.
- `updateto.sh` vaelger automatisk `STACK_NAME=v2` i `/srv/podman/bmc_hub_v2` (ellers `prod`).
## Hvorfor
Nogle prod-deployments crashede API ved startup med:
- `ValidationError: STACK_NAME Extra inputs are not permitted`
Aarsagen var, at `STACK_NAME` laa i `.env` og blev indlaest af FastAPI Settings.
## Berort fil
- `updateto.sh`
- `VERSION`

View File

@ -1,14 +0,0 @@
# Release Notes v2.2.83
Dato: 2026-05-04
## Hotfix
- `updateto.sh` loader nu `.env` sikkert uden `source`.
- Deploy fejler ikke laengere med shell-fejl som fx `Hub: command not found` ved ugyldige tekstlinjer i `.env`.
- Scriptet giver nu tydelig linjenummer-fejl ved ugyldige `.env` linjer.
## Berorte filer
- `updateto.sh`
- `VERSION`

View File

@ -1,13 +0,0 @@
# Release Notes v2.2.84
Dato: 2026-05-04
## Hotfix
- Rettet logikfejl i `updateto.sh` hvor `podman-compose up -d` kunne blive sprunget over efter successfuld build.
- Scriptet bygger nu foerst, og starter derefter stacken i et separat trin med korrekt fejlhaandtering.
## Berorte filer
- `updateto.sh`
- `VERSION`

View File

@ -1,15 +0,0 @@
# Release Notes v2.2.85
Dato: 2026-05-04
## Hotfix
- Telefoni-siden (`/telefoni`) rendrer nu seneste opkald server-side ved page load (SSR fallback).
- Dette sikrer, at brugeren ser opkald med det samme, selv hvis browserens JS/rendering/filter-state fejler eller er cachet.
- Klient-side `loadCalls()` koerer stadig bagefter og opdaterer tabellen som foer.
## Berorte filer
- `app/modules/telefoni/frontend/views.py`
- `app/modules/telefoni/templates/log.html`
- `VERSION`

View File

@ -1,13 +0,0 @@
# Release Notes v2.2.86
Dato: 2026-05-04
## Hotfix
- Rettet Telefoni UI race-condition hvor server-renderede kald blev vist ved page load, men kunne blive overskrevet med tom liste efter ca. 1 sekund af foerste JS-refresh.
- Siden bevarer nu initialt viste kald, hvis foerste API-refresh uden aktive filtre returnerer tomt.
## Berorte filer
- `app/modules/telefoni/templates/log.html`
- `VERSION`

View File

@ -1,14 +0,0 @@
# Release Notes v2.2.87
Dato: 2026-05-05
## Hotfix
- Telefoni: Foerste auto-load ignorerer nu browser-restored filterfelter (dato/user/uden sag).
- Dette forhindrer at opkald vises ved load og derefter forsvinder efter ca. 1 sekund.
- Filtre aktiveres stadig normalt ved brugerens egen interaktion.
## Berorte filer
- `app/modules/telefoni/templates/log.html`
- `VERSION`

View File

@ -1,19 +0,0 @@
# v2.3.1 — 16. maj 2026
## Fix: contacts pagination and company enrichment
- **Hotfix:** Contacts showing too few rows (contacts pagination bug)
- **Fix:** File `app/contacts/backend/router_simple.py` to stabilize pagination and company enrichment
## Contacts list
- Fixed bug where contacts list showed too few rows (pagination issue)
- Stabilized company enrichment data for contacts
## File changed
- `app/contacts/backend/router_simple.py`
## Affected versions
- v2.3.1

View File

@ -1,5 +0,0 @@
# RELEASE_NOTES_v2.3.2
**Date:** 16. maj 2026
**Summary:** Telefoni page no longer appears empty due to SSR fallback rows in `app/modules/telefoni/templates/log.html`

View File

@ -1,16 +0,0 @@
# Release Notes: v2.3.3
**Date:** 16. maj 2026
## New Features
### Telefoni Status Banner
A new status banner was added to `app/modules/telefoni/templates/log.html` to show explicit load/error/ready states:
- **`telefoni_status == "error"`** → "Telefoni: Error" with "Failed to load telefoni data."
- **`telefoni_status == "loading"`** → "Telefoni: Loading..." with "Fetching telefoni data."
- **`telefoni_status == "ready"`** → "Telefoni: Ready" with "Telefoni data loaded successfully."
- **default (no status)** → "Telefoni: No data" with a stronger fallback message: "Telefoni is not available. Try again later or check the network."
This improves visibility of telefoni data availability and provides clearer error messages.

View File

@ -1,12 +0,0 @@
# Release Notes: v2.3.4 — 16. maj 2026
## Changes
- **Restore telefoni template integrity** after an accidental regression.
- **Add explicit telefoniStatus load/error/empty/success banner** to improve user feedback.
- File: `app/modules/telefoni/templates/log.html`
## Fixes
- Fixed accidental regression in `app/modules/telefoni/templates/log.html` that corrupted template integrity.
- Added explicit `telefoniStatus` load/error/empty/success banner to improve user feedback.

View File

@ -1,17 +0,0 @@
# Release Notes - BMC Hub v2.3.5
**Release Date:** 16. maj 2026
**Release Tag:** `v2.3.5`
## Hotfix
- Restored `app/modules/telefoni/templates/log.html` from known good state (`v2.3.2`) after template corruption in `v2.3.4`.
- Fixes production issue where `/telefoni` rendered blank.
## Affected File
- `app/modules/telefoni/templates/log.html`
## Notes
- This is a corrective patch release intended to be deployed immediately.

View File

@ -1,6 +0,0 @@
# Release Notes v2.3.6 — 16. maj 2026
## Telefoni Callback Fix
- telefoni callbacks now use both env and DB whitelist
- added internal 172.16.0.0/12 fallback acceptance
- added migration `migrations/186_telefoni_ip_whitelist_setting.sql`

View File

@ -1,10 +0,0 @@
# Release Notes: v2.3.7
**Date:** 16. maj 2026
## Changes
- fallback to mission_call_state when telefoni_opkald is empty
- legacy rows shown read-only in telefoni UI
## Files changed
- app/modules/telefoni/backend/router.py
- app/modules/telefoni/templates/log.html

View File

@ -1,9 +0,0 @@
# Release Notes: v2.3.8
**Date:** 16. maj 2026
## Summary
- Added secure read-only SQL Console page under /settings/sql
- Added superadmin-protected execute endpoint /settings/sql/execute (SELECT/WITH only)
- Added SQL Console nav link in settings
- Added preset query buttons for telefoni/mission diagnostics
- files: app/settings/backend/views.py, app/settings/frontend/sql_console.html, app/settings/frontend/settings.html

View File

@ -1,23 +0,0 @@
# Release Notes - BMC Hub v2.3
**Release Date:** 16. maj 2026
**Release Tag:** `v2.3`
**Gitea:** https://g.bmcnetworks.dk/ct/bmc_hub/releases/tag/v2.3
## Highlights
- Added Service Contract Report page with customer and contract selection.
- Implemented bug reporting feature with screenshot support.
## Included Commits (since v2.2.99)
- `a36e3e7` - feat: Add Service Contract Report page with customer and contract selection
- `770f822` - feat: Implement bug reporting feature with screenshot support
- `71f6372` - feat: Implement bug reporting feature with screenshot support
## Notes
- This release is tagged from the `main` branch.
- e-conomic safety switches must remain enabled in production:
- `ECONOMIC_READ_ONLY=true`
- `ECONOMIC_DRY_RUN=true`

View File

@ -1,64 +0,0 @@
# Release Notes: v2.5.0
**Dato:** 18. august 2026
## Overblik
Version 2.5 samler den store omlægning af sager, tidsregistrering og bundmenuen samt nye arbejdsgange for kontakter, abonnementer, lokationer, netværk, leverandørdata og fakturakontrol.
## Sager og tidsregistrering
- Timeren fortsætter korrekt efter sideskift og genindlæsning.
- En medarbejder kan kun have én aktiv timer, men flere pausede timere.
- Aktive, pausede og afsluttede timere kan åbnes og håndteres fra bundmenuen.
- Afsluttede timere kan registreres som fakturering, klippekort, abonnement eller intern tid.
- Arbejdstid kan klassificeres, blandt andet som support, udvikling og vedligehold.
- Fanen **Tidsforbrug** på en sag viser og håndterer timere, som tilhører sagen.
- Den aktive timer vises på den tilhørende sag på tværs af sagens faner.
- Timervisning og dialogen **Skift sag** er gjort mere kompakt og viser tydeligere sag, kunde, kontakt, status og tidsforbrug.
- Sagsfiltre, herunder hastesager, sender nu til de rigtige filtrerede visninger.
- Advarsel og bekræftelse ved lukning af en sag uden registreret tid.
## Bundmenu og sidepaneler
- Timer-, besked-, opgave-, note- og sagsfordelingsvisninger er omarbejdet og bruger pladsen bedre.
- Valgt fane og åben/lukket tilstand bevares under navigation.
- Beskeder har individuelle læse- og kvitteringsstatusser pr. bruger.
- Lederadgang til medarbejdertimere er strammet op, og almindelige brugere ser kun egne timere.
- Timerkonvertering åbner som en særskilt arbejdsgang og virker direkte fra timerfanen.
- Links fra bundmenuen bruger de kanoniske sagssider.
## Kontakter og kundehistorik
- Dublerede kontakter kan flettes med relaterede sager, samtaler, e-mails og historik.
- Kontaktsøgning foreslår automatisk brugerens navn i de relevante arbejdsgange.
- Samlet kontakt- og aktivitetshistorik bevares ved fletning.
## Abonnement, drift og rapportering
- Abonnement er en tydelig sagstype og en selvstændig arbejdsgang på sagen.
- Tidsregistrering understøtter udvikling og vedligehold som rapporterbare typer.
- Data kan rapporteres på tværs af sager, medarbejdere, arbejdstyper og afregningsformer.
## Øvrige større forbedringer
- Udvidet lokations-, krydsfelt-, vægudtags- og UISP/netværksoverblik.
- Forbedret migrationscenter og sagsoprettelse fra migreringsdata.
- Udvidet AnyDesk-integration og administration af leverandørers e-maildomæner.
- Oprettelse af produkter fra ALSO-importlinjer.
- Forbedringer til leverandørfakturaer og fakturafejlfinder.
- Sikkerhedsrettelser til ejerskabskontrol, lederadgang og visning af brugeroprettet indhold.
## Databaseændringer
Releasen indeholder de nødvendige migrationer til timer-, besked-, kontakt-, lokations-, abonnements- og integrationsfunktionerne. Migrationerne køres ved normal opstart/deploy.
## Verifikation
- Målrettede sags- og danske UI-tests: **26 bestået**.
- Samlet `tests/`-suite: **104 bestået, 7 kendte test-isoleringsfejl** i ældre databaseafhængige tests.
- Python-kompilering, JavaScript-syntakskontrol og applikationens health-check er bestået.
## Tilbageførsel
Tilstanden før bundmenu- og timergennemgangen er bevaret i branch `checkpoint-before-bottom-bar-review-20260817` på commit `88f7cec`.

View File

@ -1,34 +0,0 @@
# Release Notes: v2.5.1
**Dato:** 18. august 2026
## Overblik
Version 2.5.1 retter de vigtigste fejl fundet efter 2.5-udgivelsen i tidsregistrering, VoIP og oprettelse af nye sager.
## Tidsregistrering
- Manuel tidsregistrering bruger nu den indtastede lokale dato og tid uden utilsigtet tidszoneforskydning.
- Flere medarbejdere kan vælges i samme registrering, og der oprettes én tidsregistrering under hver valgt medarbejder.
- Medarbejdervælgeren viser sagens tilgængelige brugere tydeligt og er adskilt fra live tracking.
- Registreringer, der krydser midnat, får korrekt slutdato.
- Sagsvisningen leveres uden browsercache, så de seneste ændringer i tidsregistreringen vises med det samme.
## VoIP
- Ved et ukendt telefonnummer kan en ny kontakt knyttes til et valgt firma direkte i VoIP-popupen.
- De viste åbne sager kan åbnes og knyttes direkte til opkaldet.
- Click-to-call accepterer nu en godkendt bruger på Hubens lokale eller interne adresse, selv når en proxy skjuler klientens lokale IP-adresse.
- VoIP-klientens cacheversion er opdateret.
## Opret ny sag
- Når et firma vælges først, hentes og vises firmaets kontaktpersoner automatisk.
- Kontaktsøgningen afgrænses til det valgte firmas kontakter og søger på navn, rolle, e-mail og telefon.
- Fjernes firmaet, skifter kontaktfeltet tilbage til den globale kontaktsøgning.
- Det er fortsat muligt at vælge flere kontaktpersoner på sagen.
## Verifikation
- Målrettede tests for sager, tidsregistrering og VoIP: **36 bestået**.
- Python- og diff-kontrol samt lokal API-health-check er gennemført.

View File

@ -1,34 +0,0 @@
# Release Notes: v2.6.0
**Dato:** 25. august 2026
## Overblik
Version 2.6.0 udvider BMC Hub med Shipmondo-forsendelser, en samlet afregningsgang for tidskøen og en mere robust produktintegration. Sagsvisningen har samtidig fået forbedret historik og arbejdsgange omkring produkter og forsendelser.
## Shipmondo
- Ny Shipmondo-integration med produktoversigt, lokale bookingkladder, afsendelse, tracking og PDF-labels.
- Forsendelser knyttes til sag, kunde og kontakt og gemmes med pakker, status og API-resultat.
- Sikker standardopsætning med integrationen deaktiveret samt `read-only` og `dry-run` aktiveret.
- Nye miljøindstillinger og Docker-konfiguration til API-adgang og afsenderoplysninger.
## Tidskø og afregning
- Valgte tidsregistreringer kan forhåndsvalideres og afregnes samlet.
- Understøttelse af ordrekladde, klippekort og ikke-fakturerbar afregning uden at blande betalingsmetoder.
- Oprettede ordrekladder og afregningsoplysninger spores direkte på tidsregistreringerne, så dobbeltbehandling undgås.
- Kundeidentifikation prioriterer sagens virksomhed og håndterer ældre trackingdata som fallback.
## Produkter og sager
- Produktdata fra API Gateway normaliseres på tværs af leverandørernes forskellige feltnavne og payload-formater.
- Produktsøgning, sortering og import er gjort mere robust ved manglende eller indlejrede data.
- Købs- og salgslinjer kan oprettes atomisk på en sag fra én produkthandling.
- Sagsdetaljen og historikken viser flere relevante handlinger og tidsstempler.
## Verifikation
- Målrettede tests for sager, tidskø, produkter og Shipmondo: **45 bestået**.
- Python-kompilering og diff-kontrol er gennemført.
- Den samlede vedligeholdte testsuite har 131 beståede og 7 eksisterende fejl i databaseafhængige eller andre ikke-berørte moduler.

View File

@ -1,21 +0,0 @@
# Release Notes: v2.6.1
**Dato:** 25. august 2026
## Overblik
Version 2.6.1 retter genkørsel af fem ældre migrationer, som produktionsserverens schema-detektion korrekt fandt, men som ikke var fuldt idempotente.
## Databasemigrationer
- Settings- og ticket-triggers fjernes sikkert, før de genoprettes.
- `sag_salgsvarer` oprettes fra rod-migrationerne, hvis den modul-lokale grundmigration ikke tidligere er kørt.
- Produkt-, leverandørfaktura- og sporbarhedskolonner kan derefter tilføjes sikkert.
- Ticket-views med udvidede tabelkolonner genskabes sikkert ved genkørsel.
- Den forældede unikke CVR-regel er fjernet i overensstemmelse med den nuværende datamodel, hvor flere kundeposter må dele CVR-nummer.
## Verifikation
- De fem berørte migrationer er kørt samlet mod lokal PostgreSQL: **5 bestået**.
- Hele sættet er derefter genkørt: **5 bestået**, hvilket bekræfter idempotens.
- Diff-kontrol er gennemført.

View File

@ -1,19 +0,0 @@
# Release Notes: v2.6.2
**Dato:** 25. august 2026
## Overblik
Version 2.6.2 retter udgående opkald fra kontakt-popupen på en sag.
## Telefoni
- En manglende afsluttende klamme i SMS-eventlisteneren gjorde den tilhørende JavaScript-blok ugyldig.
- Click-to-call-funktionen indlæses nu korrekt igen.
- Ring-knappen bruger fortsat kontaktens mobilnummer som førstevalg og telefonnummeret som fallback.
## Verifikation
- JavaScript-syntakskontrol bestået for den berørte blok.
- Sag-modulets tests: **31 bestået**.
- Diff-kontrol gennemført.

View File

@ -1,25 +0,0 @@
# Release Notes: v2.7.0
**Dato:** 25. august 2026
## Overblik
Version 2.7.0 gør linkede telefonopkald og AnyDesk-sessioner synlige i både sagens tidsregistrering og samlede historik.
## Tidsregistrering
- Ny oversigt over linkede opkald og AnyDesk-sessioner på sagen.
- Aktiviteter viser type, tidspunkt, varighed, kontakt/nummer og medarbejder.
- Aktiviteterne vises som kildedata og opretter ikke automatisk fakturerbar tid.
## Historik
- Linkede indgående og udgående opkald indgår som selvstændige historikhændelser.
- Linkede AnyDesk-sessioner indgår med status, varighed og ansvarlig medarbejder.
- Historik med undersager inkluderer også aktiviteter linket til undersagerne.
## Verifikation
- Sag-modul: **33 bestået**.
- Telefoni: **5 bestået**.
- Python-kompilering og diff-kontrol gennemført.

View File

@ -1,20 +0,0 @@
# Release Notes: v2.7.1
**Dato:** 25. august 2026
## Overblik
Version 2.7.1 retter linkning og varighed for ældre telefonopkald fra Mission Control.
## Telefoni
- Ældre opkald fra `mission_call_state` flyttes til den almindelige telefonilog, når en kontakt eller sag linkes.
- Alle linkede opkald bliver dermed synlige på sagen samt i Tidregistrering og Historik.
- Den stabile eksterne call-id og kildetype sendes med ved linkning.
- Forsinkede afslutningshændelser kan ikke længere skabe varigheder på flere måneder.
- Eksisterende urimelige varigheder over 12 timer skjules som ukendt varighed.
## Verifikation
- Telefoni- og sag-tests: **41 bestået**.
- Python-kompilering og diff-kontrol gennemført.

View File

@ -1,30 +0,0 @@
# BMC Hub v2.7.2
## CRM
- Kunde- og kontaktkort har nye faner til direkte relaterede sager og e-mails.
- Kontaktsøgning understøtter navn i flere rækkefølger, firma, titel, afdeling, e-mail og normaliserede telefonnumre.
- Kontakter kan oprettes eller opdateres fra Outlook `.msg`/`.eml` med godkendelse før lagring.
- CVR fra mails valideres gennem den eksisterende FirmaAPI-integration, og eksisterende virksomheder genbruges.
- Leverandørservice kan administreres direkte fra kundens økonomiske oplysninger.
## Sager og telefoni
- Nye sager forvælger den aktuelle bruger som ansvarlig.
- Kontaktkort på sager har direkte handlinger til opkald og SMS.
- Opkald startet fra en sag knyttes til sagen og vises i opkaldshistorikken.
- Firmaet i sagens topområde linker direkte til kundekortet.
## Abonnementer
- Udvidet aftale-, faktureringskalender- og ændringsflow.
- Nye migreringer til første fakturalinjer, periodisering og integritetskontrol.
## Websiteindhold
- Nyt administrationsmodul til kundereferencer og driftsinformation.
- Rettighedsstyret visning og redigering samt website-endpoints til indhold og logoer.
## Verifikation
- Målrettede CRM-, sag-, telefoni-, abonnements- og website-tests er kørt før release.

View File

@ -1,18 +0,0 @@
# BMC Hub v2.8.0
## Ny sag
- Redesignet, mere fokuseret oprettelsesflow med kompakte typevalg og progressive paneler.
- Browser-kladdesystem, hurtigskabeloner, tagvælger og tastaturgenvej til oprettelse.
- Duplikatindsigt for kunde og valgt kontakt samt arbejdsbelastning for ansvarlig medarbejder.
- Brand- og type-tagforslag ud fra sagens titel og beskrivelse.
## Interne beskeder
- Nyt, mere overskueligt beskedflow mellem medarbejdere.
- Understøttelse af korte telefonbeskeder med valgfri kontaktperson og tilbageringningsnummer.
## Database
- Kør `migrations/238_case_create_templates.sql`.
- Kør `migrations/239_internal_phone_messages.sql`.

View File

@ -1,39 +0,0 @@
# BMC Hub v2.8.1
## Planner
- Nyt Planner-modul til fordeling af sager og overblik over teamets kapacitet.
- Dag-, uge- og månedsvisning med planlagte blokke, registreret tid og ekstern travl tid.
- Drag-and-drop af sager med kompakt forhåndsvisning, 15-minutters placering og håndterbare standardblokke.
- Bredere sagsoversigt og forbedret pladsudnyttelse i kalenderen.
- Kalender og Planlægger er samlet i en Kalender-undermenu.
## Systemlog og drift
- Ny administrativ systemlog til telefoni, e-mail og øvrige integrationshændelser.
- Udvidet hændelseslogning og adgangskontrol i indstillingerne.
## AI og fakturaskabeloner
- Rettet AI Auto-generer i Template Builder.
- Tilføjet manglende `OWN_CVR`-konfiguration og validering af Ollama-fejl.
- Ollama fakturaudtræk tvinges til struktureret JSON.
- GUI'en viser nu den konkrete AI-fejl i stedet for en generisk fejlbesked.
## Integrationer og brugerflade
- Forbedringer til telefoni, e-mail og ALSO Cloud-integrationerne.
- Mindre rettelser til login, indstillinger og den fælles navigation.
- Fremtidige udviklingsplaner har fået et fast dokumentationsområde.
## Database
- Kør `migrations/240_planner.sql`.
- Kør `migrations/241_system_event_log.sql`.
## Verifikation
- Planner: 8 tests bestået.
- Samlet testsuite: 271 bestået, 1 sprunget over.
- Fire eksisterende tests kræver databaseinitialisering eller har forældede invoice-history mocks.
- Python- og JavaScript-syntakskontrol bestået.

View File

@ -1,11 +0,0 @@
# BMC Hub v2.8.10
## Gem e-conomic-ordrenummer
- Gemmer `economic_draft_id` fra det eksisterende eksportflow som kladdens e-conomic-ordrenummer.
- Audit-eventet `export_success` indeholder dermed det faktiske nummer i stedet for `null`.
- Bevarer understøttelse af de øvrige eksisterende feltnavne i eksportsvaret.
## Verifikation
- Regressionstest dækker mapping fra `economic_draft_id` til e-conomic-ordrenummer.

View File

@ -1,6 +0,0 @@
# BMC Hub v2.8.11
## Ordreoverskrift
- Ordrekladder oprettet fra ALSO-abonnementer får overskriften `Abonnementer`.
- Eksisterende åbne abonnementskladder får samme overskrift, når der tilføjes flere godkendte linjer.

View File

@ -1,21 +0,0 @@
# BMC Hub v2.8.12
## Eksportkvittering og afstemning
- Gemmer e-conomic-kunde, valuta, layout, nettobeløb, request, response, ekstern reference, oprettede varer og brugeren, der eksporterede.
- Sender den interne idempotency-reference med ordrekladden til e-conomic.
- En ordre kan ikke længere markeres som eksporteret, bogført eller betalt uden et e-conomic-ordrenummer.
- Eksisterende poster i den ugyldige kombination flyttes til `uncertain`, så de skal afstemmes før en eventuel ny eksport.
- Gemmer og viser den seneste eksportfejl.
## Ordrevisning
- Viser kundenavn sammen med Hub-ID og e-conomic-kundenummer.
- Viser en kompakt eksportkvittering med ordrenummer, periode, valuta, layout, nettobeløb, bruger og reference.
- Viser eksporthistorik som læsbare beskrivelser i stedet for rå JSON.
- Skjuler fakturanummer indtil bogføring og skjuler tvungen geneksport efter gennemført eksport.
- Retter eksisterende ALSO-abonnementskladder til titlen `Abonnementer`.
## Installation
- Kør migration `245_ordre_export_receipt.sql` før applikationen opdateres.

View File

@ -1,13 +0,0 @@
# BMC Hub v2.8.14
## ALSO ordrekladder og e-conomic-reference
- Bruger Hub-ordre-ID som `Eksternt ID` ved eksport til e-conomic.
- Efterlader `Tekst 1` tom for nye ALSO-genererede ordrekladder.
- Tilføjer perioden fra CSV-feltet `Actual Charge Interval` til varelinjens beskrivelse.
- Migration 247 rydder den tidligere systemtekst og opdaterer eksisterende, ikke-eksporterede ALSO-ordrekladder med perioden.
- Bevarer den tidligere eksportreference ved afstemning af allerede påbegyndte eksportforsøg.
## Opgradering
Kør `migrations/247_also_order_external_id.sql` efter deployment. Migrationen ændrer kun ALSO-ordrekladder med status `pending`; eksporterede ordre ændres ikke.

View File

@ -1,11 +0,0 @@
# BMC Hub v2.8.15
## ALSO-perioder på ordrelinjer
- Viser perioden fra `Actual Charge Interval` på en ny linje under produktnavnet.
- Migration 248 retter eksisterende, ikke-eksporterede ALSO-ordrekladder.
- Allerede eksporterede ordre ændres ikke.
## Opgradering
Kør `migrations/248_also_order_period_line_break.sql` efter deployment.

View File

@ -1,9 +0,0 @@
# BMC Hub v2.8.16
## Flerlinjede ordrebeskrivelser
- Viser ordrelinjens produkt og ALSO-periode på separate linjer i både opret- og detaljevisningen.
- Bruger et kompakt tekstområde ved redigering, så linjeskiftet bevares ved gem og eksport til e-conomic.
- Viser linjeskift i forhåndsvisningen af en e-conomic-opdatering.
Der følger ingen ny databasemigration med denne release.

View File

@ -1,13 +0,0 @@
# BMC Hub v2.8.2
## AI Template Builder
- Rettet fejl når Ollama returnerer fakturabeløb som tekst i stedet for numerisk JSON.
- Understøtter nu både danske beløbsformater som `1.471,20 DKK` og engelske formater som `1471.20`.
- Ugyldige eller tomme beløb håndteres uden at afbryde AI-analysen.
- Tilføjet regressionstest for beløbsnormalisering.
## Verifikation
- Regressionstest: 2 bestået.
- Python-syntaks og diff-kontrol bestået.

View File

@ -1,38 +0,0 @@
# BMC Hub v2.8.3
## Internetforbindelser og abonnementer
- Ny hurtig oprettelse med særskilte flows for fysisk forbindelse, delt hovedfiber og BMCnet.
- Delt hovedfiber oprettes med BMC Networks som ejer og uden produkt, abonnement eller abonnementssag.
- BMCnet opretter og forbinder kunde, internetprodukt, abonnement og delt hovedforbindelse i ét flow.
- Kundens adresse bruges til tolerant forslag af delt hovedforbindelse, inklusive mindre staveforskelle.
- Forenklet BMCnet-formular, hvor tekniske værdier arves og kun et valgfrit notefelt vises.
- Forbedret overblik over delte hovedforbindelser, BMCnet-kunder, kapacitet og økonomi.
## Leverandørfakturaer
- Hybrid fakturaudtræk kombinerer tekst, layout og AI med kontrolleret fallback.
- Forbedret udtræk af danske beløb, fakturafelter og varelinjer fra forskellige leverandørformater.
- Template Builder viser fundne data tydeligere og håndterer AI-fejl mere robust.
- Internetfakturaer kan behandles og følges i internetforbindelsesmodulet.
## E-mail og arbejdsgange
- Forenklet valg af mailtype og arbejdsflow med tydeligere handlinger.
- Leverandørfaktura-flow kan registrere internetfakturaer til efterfølgende behandling.
- Forbedret leverandør- og kundematch samt mere kompakt visning af avancerede oplysninger.
## Sager, kontakter og brugerflade
- Kontakter fra andre virksomheder markeres tydeligt på en sag.
- Kontakter kan oprettes direkte fra kontaktsøgningen, også når søgningen ikke giver resultat.
- Bugrapporter bruger en hurtigere og mere stabil lokal indsamling af relevant sideinformation.
- Rettelser til ALSO Cloud-søgning, fælles navigation og øvrige betjeningsdetaljer.
- Plan for AI-baseret kundestemning og sikker fakturabehandling er gemt under `fremtidige planer`.
## Verifikation
- 279 tests bestået og 1 sprunget over.
- Fire kendte, ikke-release-relaterede tests fejler fortsat: tre forældede invoice-error mocks og én databaseafhængig deaktiveringstest.
- Nye regressionstests for hybrid fakturaudtræk og hurtig oprettelse af internetforbindelser består.
- Python- og JavaScript-syntaks samt diff-kontrol bestået.

View File

@ -1,13 +0,0 @@
# BMC Hub v2.8.4
## e-conomic ordreeksport
- Ordremodulet arver nu de globale `ECONOMIC_READ_ONLY` og `ECONOMIC_DRY_RUN`, når de valgfrie `ORDRE_ECONOMIC_*`-indstillinger ikke er defineret.
- Eksplicitte ordreindstillinger har fortsat førsteprioritet.
- Sikker standard bevares: uden eksplicit konfiguration er eksport stadig read-only/dry-run.
## Verifikation
- Regressionstest for både global fallback og eksplicit ordreoverride består.
- Relevante faktura- og internettests består.
- Python-syntaks og diff-kontrol består.

View File

@ -1,13 +0,0 @@
# BMC Hub v2.8.5
## e-conomic ordreeksport
- Henter kundens standardopsætning fra e-conomic før oprettelse af en ordrekladde.
- Medsender obligatoriske betalingsbetingelser, modtageroplysninger og momszone.
- Bruger kundens valuta og adresseoplysninger fra e-conomic.
- Viser e-conomics konkrete valideringsfejl i stedet for kun HTTP-status 400.
## Verifikation
- 9 relevante regressionstests består.
- Python-syntaks og diff-kontrol består.

View File

@ -1,13 +0,0 @@
# BMC Hub v2.8.6
## e-conomic ordreeksport
- Bruger kundens gyldige standardlayout fra e-conomic i stedet for et ugyldigt lokalt standardnummer.
- Kontrollerer produktnumre mod e-conomic inden eksport.
- Ukendte lokale produktnumre eksporteres som fritekstlinjer uden ugyldig produktreference.
- Bevarer produktreferencen, når produktet findes i e-conomic.
## Verifikation
- Fokuserede regressionstests består.
- Python-syntaks og diff-kontrol består.

View File

@ -1,21 +0,0 @@
# BMC Hub v2.8.7
## Varer, priser og e-conomic
- Nyt varekatalog med importkontrol, låste e-conomic-koblinger og synkroniseringsstatus.
- Lokale prisregler, særskilte prisrettigheder og bevarelse af priser på gemte kladder.
- Kontrol af varer og priser før ordreeksport samt afstemning efter usikre eksportforsøg.
- Ændring af eksisterende kunder og varer i e-conomic kræver en begrundet anmodning og godkendelse fra en anden bruger med særskilt rettighed.
- Direkte ekstern skrivning er begrænset til oprettelse af kunder, varer og ordrekladder; godkendte kunde- og vareændringer har en særskilt adgangskontrol.
## Installation
- Kør migration `242_economic_product_integration.sql` og derefter `243_economic_four_eyes_changes.sql` før aktivering af den nye version.
- Migrationerne tilføjer tabeller, felter, indeks, constraints og rettigheder. Eksisterende varenumre kobles ikke automatisk.
- Tilknyt og kontrollér aftalen via **Indstillinger → Varer, priser og synkronisering**, før forbindelsen aktiveres. Se `docs/ECONOMIC_PRODUCT_CATALOG.md`.
## Verifikation
- 69 fokuserede tests består, inklusive seks lokale databasetests med rollback og uden eksterne e-conomic-skrivninger.
- Isoleret browsertest består for varekobling, decimalpriser, livscyklus, prisregler og eksportfanen uden JavaScript-fejl.
- Python- og JavaScript-syntakskontrol samt diff-kontrol består.

View File

@ -1,17 +0,0 @@
# BMC Hub v2.8.8
## Rettelse af adgang til e-conomic-varekataloget
- Tildeler de nye e-conomic-rettigheder til den eksisterende `Administrators`-gruppe.
- Retter fejlen `Missing required permission: economic.catalog.view` for almindelige administratorer.
- Andre grupper og brugere får ikke nye rettigheder automatisk.
## Ordreeksport
- Stopper eksporten før afsendelse, hvis et varenummer ikke findes i e-conomic.
- Viser de manglende varenumre og sender ikke længere prislinjer uden den produktreference, som e-conomic kræver.
## Installation
- Kør migration `244_economic_permissions_backfill.sql` efter migration 242 og 243.
- Migrationen er idempotent og ændrer kun gruppens koblinger til eksisterende rettigheder.

View File

@ -1,14 +0,0 @@
# BMC Hub v2.8.9
## Produktoprettelse ved ordreeksport
- Hvis en ordrelinjes vare ikke findes i e-conomic, åbnes et forhåndsvindue før eksport.
- Vinduet viser varenummer, navn, salgspris, EAN/stregkode, beskrivelse og varegruppe for hver vare, der skal oprettes.
- Brugeren vælger eller kontrollerer varegruppen og godkender samlet med **Opret varer og eksportér**.
- Før godkendelsen udføres kun opslag. Efter godkendelsen oprettes de viste varer og derefter ordrekladden.
- Vareoprettelse kræver fortsat rettigheden `economic.catalog.manage`; ordreeksport kræver `economic.documents.export`.
## Verifikation
- Regressionstest dækker den præcise e-conomic-payload med pris, EAN, beskrivelse og varegruppe.
- Python- og JavaScript-syntakskontrol samt diff-kontrol består.

View File

@ -22,34 +22,6 @@ cd /srv/podman/bmc_hub_v1.0
./updateto.sh v1.3.16
```
## Fast small update (kode-only, uden ny release tag)
Brug denne metode til meget små ændringer i `app/*` eller `main.py`, hvor du ikke vil lave en fuld release-pakke.
```bash
ssh bmcadmin@172.16.31.183
cd /srv/podman/bmc_hub_v1.0
# Download/refresh fast update script
curl -O https://g.bmcnetworks.dk/ct/bmc_hub/raw/branch/main/update_fast.sh
chmod +x update_fast.sh
# Tjek først hvad der ændres (anbefalet)
./update_fast.sh --ref main --dry-run --allow-prod
# Kør fast update (eksempel: specifik commit)
./update_fast.sh --ref 08f4097 --allow-prod
```
Vigtigt:
- `update_fast.sh` er kun til kode/templates/static ændringer i fast scope.
- Hvis der er ændringer i migrationer, dependencies, docker/compose eller env: brug `./updateto.sh`.
- Rollback kan køres med backup-id:
```bash
./update_fast.sh --rollback 20260517-142155 --allow-prod
```
## Manuel deployment (hvis scriptet ikke virker)
```bash

Some files were not shown because too many files have changed in this diff Show More