Commit Graph

304 Commits

Author SHA1 Message Date
Christian
64e85da71c Fix: Use absolute URL for bulk rate update to avoid path resolution issues (v1.3.54) 2025-12-23 15:03:49 +01:00
Christian
641698be8b Fix: Bulk customer rate update using request body (v1.3.53)
Fixed API endpoint to accept JSON request body instead of query params:
- Added TModuleBulkRateUpdate Pydantic model
- Changed endpoint to accept request body
- Fixed parameter references to use request.customer_ids and request.hourly_rate
- Added migration for hourly_rate_updated and time_card_toggled event types

Resolves: 'Not Found' error and audit log constraint violations
2025-12-23 14:39:57 +01:00
Christian
246ad27fe3 Feature: Bulk customer hourly rate updates (v1.3.52)
Added bulk selection and update functionality for customer hourly rates:

Frontend (customers.html):
- Added checkbox column with select-all functionality
- Created bulk price update modal with customer list
- Implemented JavaScript for selection state management
- Shows selected count in UI badge
- Supports indeterminate state for partial selection

Backend (router.py):
- New POST /api/v1/timetracking/customers/bulk-update-rate endpoint
- Accepts {customer_ids: List[int], hourly_rate: float}
- Updates multiple customers in single SQL query
- Creates audit log entries for each updated customer
- Returns updated count

Use case: Select multiple customers and update hourly rate simultaneously
2025-12-23 14:31:10 +01:00
Christian
f8d9e0b252 Feature: Marker vTiger Timelog som faktureret (invoiced)
Når ordre eksporteres til e-conomic opdateres vTiger Timelog med:
- billed_via_thehub_id: Hub ordre ID (f.eks. 5)
- cf_timelog_invoiced: '1' (markér som faktureret)

Dette sikrer at timelogs i vTiger bliver markeret som fakturerede
og kan filtreres/rapporteres korrekt i vTiger.
2025-12-23 14:20:50 +01:00
Christian
0c0e589543 Fix: updateto.sh skal bruge docker-compose.prod.yml
KRITISK FIX: Serveren stoppede fordi updateto.sh brugte forkert compose fil

Problem:
- updateto.sh brugte 'docker-compose.yml' (dev version)
- Dev versionen har 'restart: unless-stopped'
- Production skal bruge 'docker-compose.prod.yml' med 'restart: always'
- Når server rebooter eller opdateres stopper containerne og starter ikke automatisk

Løsning:
- updateto.sh bruger nu '-f docker-compose.prod.yml' eksplicit
- Sikrer korrekt restart politik (always) anvendes
- Containerne vil nu starte automatisk efter reboot
2025-12-23 13:58:29 +01:00
Christian
acc78b03a3 UI: Vis Hub ordre ID i ordre detaljer efter eksport
- Tilføjet Hub ordre ID til success/info beskeder
- Viser at vTiger Timelog er opdateret med Hub ordre ID
- Gør det tydeligt at koblinger mellem Hub og vTiger er oprettet
2025-12-23 02:03:23 +01:00
Christian
807e7f6395 Feature: Opdater vTiger Timelog med Hub ordre ID efter eksport
- Tilføjet update_timelog_billed() metode til vtiger_sync.py
- Opdaterer billed_via_thehub_id felt i vTiger Timelog records
- Kaldes automatisk efter succesfuld e-conomic eksport
- Respekterer READ_ONLY og DRY_RUN safety flags
- Fejler ikke eksporten hvis vTiger update fejler (bare logger warning)
2025-12-23 01:44:14 +01:00
Christian
a2857f5e12 Fix: Tilføj case_number og Hub ordre nr til e-conomic
- Varetekst: Tilføj case_number tilbage (CC5784)
- Format: 'CC5784 / Arbejde konstant / 09.12.2025 - Marley'
- Tilføj Hub ordre nummer (TT-20251222-005) til otherReference felt
- otherReference vises som 'Øvrig ref' i e-conomic
2025-12-23 01:33:19 +01:00
Christian
0f97dda8cd Fix: Fjern timer/pris/total fra e-conomic varetekst
- Før: 'CC5784. 8.0 timer 1,200,- 9,600 / Arbejde konstant / 09.12.2025 - Marley'
- Nu: 'Arbejde konstant / 09.12.2025 - Marley'
- e-conomic viser timer og priser i egne kolonner, så det er overflødigt i teksten
2025-12-23 01:27:09 +01:00
Christian
3b8bae3186 Fix: Tilføj 'posted' status til tmodule_orders check constraint
- Database constraint tillod kun: draft, exported, sent, cancelled
- Code satte status til 'posted' efter e-conomic export
- Tilføjet 'posted' til check_status constraint
- Fixes: new row violates check constraint error
2025-12-23 01:22:47 +01:00
Christian
5c96639a79 Fix: Gør e-conomic product number konfigurerbar
BUG FIX:
- Hardcoded 'TIME001' eksisterer ikke i e-conomic
- Tilføjet TIMETRACKING_ECONOMIC_PRODUCT setting (default: '1000')
- Produkt nummer kan nu ændres via .env
- Fejl: Product 'TIME001' not found

LØSNING:
Tilføj til .env: TIMETRACKING_ECONOMIC_PRODUCT=XXXX
hvor XXXX er dit produkt nummer for konsulentimer i e-conomic
2025-12-23 01:11:58 +01:00
Christian
05d2ac9356 Fix: Gør e-conomic layout konfigurerbar (layout 21 er historisk)
BUG FIX:
- Hardcoded layout 21 fejler med 'Layout 21 is historic'
- Tilføjet TIMETRACKING_ECONOMIC_LAYOUT setting (default: 19)
- Layout 19 er standard dansk faktura layout
- Kan nu ændres via .env uden kode-ændringer

ERROR: e-conomic API error - layout: Layout '21' is historic
LØSNING: Brug layout 19 eller andet aktivt layout nummer
2025-12-23 01:04:44 +01:00
Christian
a98a5784b7 Fix: Return single order object ved cancel_order (ikke list)
BUG FIX:
- execute_query returnerer list, men TModuleOrder(**updated) forventede dict
- TypeError: argument after ** must be a mapping, not list
- Changed til updated[0] for at få første row
- Dette er den SIDSTE execute_query/execute_query_single bug i order_service.py

ERROR: TModuleOrder() argument after ** must be a mapping, not list
  → return TModuleOrder(**updated)
  → updated er list, skal være dict
2025-12-23 00:46:38 +01:00
Christian
776f7a52ad Fix: Tilføj manglende kolonner til tmodule_order_lines
CRITICAL BUG FIX:
- case_contact, time_date, is_travel manglede i tmodule_order_lines tabel
- Forårsagede SQL fejl ved order creation INSERT
- Opdateret migration 031 til at tilføje alle manglende kolonner
- Applied direkte på production DB

ERROR: column 'case_contact' does not exist
  → INSERT INTO tmodule_order_lines ... case_contact, time_date, is_travel
2025-12-23 00:33:28 +01:00
Christian
0fdf4549d6 Fix: Tilføj RETURNING id til order INSERT statements
CRITICAL BUG FIX:
- execute_insert() kalder cursor.fetchone() men INSERT havde ingen RETURNING clause
- Forårsagede '500: no results to fetch' ved order oprettelse
- Tilføjet RETURNING id til:
  * tmodule_orders INSERT (linje 222)
  * tmodule_order_lines INSERT (linje 240)
- Opdateret database.py docstring til at gøre RETURNING requirement klart

ERROR: ProgrammingError - no results to fetch
  → INSERT INTO tmodule_orders ... VALUES (...)
  → Manglede RETURNING id
2025-12-23 00:29:25 +01:00
Christian
718de1a6bd Fix: Remove hourly_rate query from customers table (kolonne eksisterer ikke)
BUG FIX:
- _get_hourly_rate() tried to query hourly_rate from customers table
- customers table har ikke hourly_rate kolonne
- Forårsagede '500: no results to fetch' fejl ved order oprettelse
- Changed execute_query_single → execute_query for tmodule_customers check
- Removed hub customer rate check (ikke relevant)
- Falls back til default rate fra settings

ERROR: SELECT hourly_rate FROM customers WHERE id = 512
       → column 'hourly_rate' does not exist
2025-12-23 00:23:01 +01:00
Christian
152670b4b2 Fix: Tilføj manglende is_travel og hourly_rate kolonner til tmodule_times
CRITICAL BUG FIX:
- Approval endpoint fejlede fordi is_travel kolonne ikke eksisterede i DB
- Koden referenced is_travel men migration var aldrig kørt
- Tilføjet is_travel (BOOLEAN DEFAULT false)
- Tilføjet hourly_rate (DECIMAL(10,2)) til times tabel
- Testet: Approval virker nu korrekt (entry 1225 godkendt)

RODSAG:
- User kunne ikke godkende timer fordi SQL fejlede med 'column does not exist'
- Dette forklarer hvorfor 0 entries nogensinde er blevet approved i systemet
2025-12-23 00:16:32 +01:00
Christian
0205516422 Cleanup: Fjernet duplikat order check i cancel_order 2025-12-22 22:20:20 +01:00
Christian
dd23312731 Fix: Flere steder i order_service brugte execute_query_single forkert 2025-12-22 17:13:10 +01:00
Christian
0d9af55dfc Fix: Timetracking ordre generering brugte execute_query_single i stedet for execute_query 2025-12-22 16:57:52 +01:00
Christian
3628cbd9fe Fix: Kontakt detail viser nu relaterede firmaer i Firmaer fanen 2025-12-22 16:40:49 +01:00
Christian
d2c7a8a624 Fix: SQL ambiguous column error i contacts søgning - prefikseret med c. 2025-12-22 16:04:49 +01:00
Christian
9fe17e7f85 Fix: Tilføjet company_count og company_names til contacts API med JOIN 2025-12-22 15:48:21 +01:00
Christian
ba0a2fd160 Fix: Ændret debug endpoint path for at undgå conflict 2025-12-22 15:43:47 +01:00
Christian
bd2de09076 Add: Debug endpoint for contact-company links 2025-12-22 15:35:26 +01:00
Christian
5bb6e73a26 Fix: Contacts query skulle returnere alle rækker ikke kun én 2025-12-22 15:29:28 +01:00
Christian
e4b940009f Feature: Auto-create customers from vTiger accounts when linking contacts 2025-12-22 15:20:29 +01:00
Christian
e541758c44 Add: Sync diagnostics endpoint for troubleshooting contact linking 2025-12-22 15:14:31 +01:00
Christian
6d949d7060 Refactor: Komplet omskrivning af kontakt sync med simpel logik 2025-12-22 15:05:40 +01:00
Christian
0fb404dff5 Fix: Rettet indentation fejl i kontakt linking kode 2025-12-22 14:41:44 +01:00
Christian
0b8a4ff5d0 Debug: Rettet debug logging counter for kontakter 2025-12-22 14:36:55 +01:00
Christian
82ecfda404 Debug: Tilføjet logging af account_id værdier for kontakter 2025-12-22 14:34:07 +01:00
Christian
6398a7ca5f Debug: Ændret logging level for kontakt linking fejl (debug → info) 2025-12-22 14:25:41 +01:00
Christian
ddcf64ae78 Fix: Tjek for duplicate vtiger_id før update (undgår constraint violation) 2025-12-22 14:15:17 +01:00
Christian
0b6d286332 Debug: Tilføjet bedre logging til vTiger matching for at identificere problem 2025-12-22 14:13:44 +01:00
Christian
64935b5808 Fix: Tilføjet pagination til kontakter + forbedret relation linking 2025-12-22 13:24:41 +01:00
Christian
62fc3cb4dd Fix: Check for existing customer by CVR også (undgå duplicate key error) 2025-12-22 13:18:36 +01:00
Christian
198c6c56f4 Fix: Truncate country code til max 2 chars (ISO format) 2025-12-22 13:17:03 +01:00
Christian
4042c466f8 Fix: Rettet podman logs syntax og tilføjet sync commands til output 2025-12-22 13:15:13 +01:00
Christian
6917bbff68 Fix: Opdateret guide - download script fra Gitea i stedet for git pull 2025-12-22 13:13:45 +01:00
Christian
c08ebedaf5 Add: Quick update guide til første deployment af updateto.sh 2025-12-22 13:12:06 +01:00
Christian
bcd7f7384a Add: Deployment script med server validation check 2025-12-22 13:07:32 +01:00
Christian
a9f5714662 Feature: Omstruktureret sync - e-conomic er nu primær kilde, vTiger linker bagefter 2025-12-22 13:02:24 +01:00
Christian
e5dc0f64d3 Fix: Rettet vTiger pagination - bruger ID-baseret filtering i stedet for LIMIT OFFSET 2025-12-22 12:59:12 +01:00
Christian
94781227b2 Fix: Implementeret pagination i vTiger sync for at hente ALLE kunder (batch size 200) 2025-12-22 12:53:11 +01:00
Christian
af6e868828 Fix: Tilføjet manglende VTIGER_ENABLED og ECONOMIC_ENABLED fields i Settings 2025-12-22 11:44:13 +01:00
Christian
187b72238d Fix: Fjernet LIMIT fra vTiger sync for at hente ALLE kunder og kontakter 2025-12-22 11:39:07 +01:00
Christian
e8be92d187 Fix: CVR unique constraint - tillad multiple kunder uden CVR nummer 2025-12-22 11:35:16 +01:00
Christian
41f7ae991c Fix: Rettet test-economic endpoint - fjernet ikke-eksisterende get_self() kald 2025-12-22 11:17:36 +01:00
Christian
7fd596612c Feature: Tilføjet /api/v1/system/test-economic endpoint til at teste e-conomic API forbindelse 2025-12-22 11:15:16 +01:00