Files
tilbudgivern/docs/features/ORDRESTYRING_UPDATE_NOTES_STATUS.md
alexpolo1 bdb9e524db Implement manual and automated tests for auto-save countdown feature
- Added a comprehensive manual testing guide for the countdown functionality in `test_countdown_manual.md`.
- Developed a detailed Selenium test suite in `test_countdown_selenium.py` to verify countdown behavior, including server accessibility, login, countdown progression, and UI elements.
- Created a minimal Selenium test version in `test_countdown_selenium_minimal.py` for quick checks without complex setup.
- Introduced a verification script in `test_countdown_verification.py` to analyze code correctness, including server checks, build file existence, and countdown logic.
2025-11-14 11:28:58 +00:00

8.1 KiB

Ordrestyring Integration - Opdateret med Interne Noter og Status

Dato: 31. oktober 2025

Ændringer Implementeret

1. Interne Beregninger i Bemærkninger

Problem: Overhead og fortjeneste skulle ikke være synlige for kunde, men skulle stadig gemmes internt.

Løsning:

  • Genererer internalNotes med fuld kalkulation (overhead + fortjeneste)
  • Sendes i notes feltet til Ordrestyring (kun synligt internt)
  • Kunde beskrivelse viser KUN arbejde, materialer, subtotal, moms og total

Eksempel på interne noter:

INTERNE BEREGNINGER (kun synlig internt):

Subtotal (arbejde + materialer): 116.093,00 kr
Overhead (15%): 17.413,95 kr
Fortjeneste (20%): 23.218,60 kr
─────────────────────────────
Pris ex. moms: 156.725,55 kr
Moms (25%): 39.181,39 kr
Pris inkl. moms: 195.906,94 kr

Projektinfo:
- Projekt ID: 1
- Beregning ID: 1
- Oprettet: 2024-01-15T10:30:00Z
- Timepris: 580,00 kr/time
- Timer total: 85.5 timer

2. Automatisk Tilbudsstatus

Problem: Tilbud skulle automatisk få status "Tilbudsgiver Oprettet Tilbud" når de oprettes.

Løsning:

  • Ny metode getOfferStatusId(statusText) henter status ID fra Ordrestyring API
  • Søger efter "Tilbudsgiver Oprettet Tilbud" (case-insensitive)
  • Fallback til "Nyt tilbud" (ID: 999919) hvis status ikke findes
  • Status ID sendes med i createOffer mutation

GraphQL Mutation opdateret:

const input = {
  customerId: parseInt(customerId),
  description: quoteData.description,      // Til kunde (uden overhead/fortjeneste)
  notes: quoteData.internalNotes,          // Internt (med overhead/fortjeneste)
  statusId: statusId,                      // "Tilbudsgiver Oprettet Tilbud"
  lines: quoteData.materials.map(...)
};

3. Database Opdatering

Opdateret SQL:

UPDATE generated_quotes 
SET ordrestyring_offer_id = ?, 
    ordrestyring_offer_number = ?,
    ordrestyring_sent_at = NOW(),           -- Tidspunkt for afsendelse
    ordrestyring_status = ?                  -- Status tekst fra Ordrestyring
WHERE project_id = ? AND calculation_id = ?

Files Modificeret

1. ordrestyringQuoteService.js

Tilføjet:

  • internalNotes generering i generateDetailedQuoteDescription()
  • getOfferStatusId(statusText) metode
  • notes felt i createOffer mutation
  • statusId felt i createOffer mutation
  • Opdateret database query med status og tidspunkt

Ændringer:

// Før:
return {
  description,
  priceExVat,
  priceInclVat,
  ...
};

// Efter:
return {
  description,
  internalNotes,  // NYT
  priceExVat,
  priceInclVat,
  ...
};

2. ordrestyring.js (routes)

Opdateret /preview-description endpoint:

res.json({
  success: true,
  description: quoteData.description,
  internalNotes: quoteData.internalNotes,  // NYT - viser interne noter i preview
  priceExVat: quoteData.priceExVat,
  priceInclVat: quoteData.priceInclVat,
  materials: quoteData.materials
});

3. test_ordrestyring_integration.py

Opdateret preview output:

  • Viser nu både kunde beskrivelse OG interne noter
  • Tydeligt markeret hvad der er hvad
  • Lettere at verificere at overhead/fortjeneste ikke sendes til kunde

4. Dokumentation

Opdateret:

  • docs/ORDRESTYRING_GRAPHQL_INTEGRATION.md
  • Ny sektion om interne beregninger
  • Ny sektion om tilbudsstatus
  • Eksempler på notes vs description
  • Forklaring af status workflow

Workflow

1. Kunde opretter projekt
   ↓
2. Beregning laves (med overhead + fortjeneste)
   ↓
3. Final Review → "Send til Ordrestyring"
   ↓
4. generateDetailedQuoteDescription()
   - Genererer kunde beskrivelse (uden overhead/fortjeneste)
   - Genererer interne noter (med overhead/fortjeneste)
   ↓
5. getOfferStatusId("Tilbudsgiver Oprettet Tilbud")
   - Henter korrekt status ID fra Ordrestyring
   ↓
6. createOffer mutation sendes:
   {
     description: "ARBEJDE DER UDFØRES...",  // Til kunde
     notes: "INTERNE BEREGNINGER...",        // Kun internt
     statusId: 999926,                        // Tilbudsgiver Oprettet Tilbud
     lines: [materialer...]
   }
   ↓
7. Tilbud oprettet i Ordrestyring
   - Kunde ser beskrivelse uden overhead/fortjeneste
   - Interne medarbejdere kan åbne "noter" og se fuld kalkulation
   - Status: "Tilbudsgiver Oprettet Tilbud"
   ↓
8. Reference gemt i lokal database
   - ordrestyring_offer_id
   - ordrestyring_offer_number
   - ordrestyring_sent_at (NOW())
   - ordrestyring_status ("Tilbudsgiver Oprettet Tilbud")

Test

Test Script Opdateret

python3 test_ordrestyring_integration.py

Output inkluderer nu:

================================================================================
KUNDE BESKRIVELSE:
================================================================================
Tilbud på udskiftning af tag...

ARBEJDE DER UDFØRES:
...

PRISSPECIFIKATION:
Arbejdsløn: 49.590,00 kr
Materialer: 66.503,00 kr
─────────────────────────────
Subtotal: 116.093,00 kr
Moms (25%): 39.181,39 kr
─────────────────────────────
SAMLET PRIS EKS. MOMS: 156.725,55 kr
INKL. MOMS (25%): 195.906,94 kr
================================================================================

================================================================================
INTERNE NOTER (kun synlige internt):
================================================================================
INTERNE BEREGNINGER (kun synlig internt):

Subtotal (arbejde + materialer): 116.093,00 kr
Overhead (15%): 17.413,95 kr
Fortjeneste (20%): 23.218,60 kr
─────────────────────────────
...
================================================================================

Fordele

1. Transparens Internt

Alle interne medarbejdere kan se fuld kalkulation
Overhead og fortjeneste gemmes i Ordrestyring
Historik bevares for senere analyse

2. Professionalitet Eksternt

Kunde ser kun relevante priser
Ingen forvirring om overhead/fortjeneste
Rent og professionelt tilbudsformat

3. Automatisering

Status sættes automatisk ved oprettelse
Ingen manuel intervention nødvendig
Konsistent status naming

4. Fejlhåndtering

Fallback til "Nyt tilbud" hvis custom status ikke findes
Logger alle status operationer
Graceful degradation

Verificering

Check i Ordrestyring:

  1. Tilbud oprettet:

    • Status: "Tilbudsgiver Oprettet Tilbud" ✓
    • Kunde beskrivelse uden overhead ✓
  2. Åbn "Noter" tab:

    • Interne beregninger synlige ✓
    • Overhead (15%) vist ✓
    • Fortjeneste (20%) vist ✓
    • Projekt info vist ✓
  3. Lokal database:

    SELECT 
      ordrestyring_offer_id,
      ordrestyring_offer_number,
      ordrestyring_status,
      ordrestyring_sent_at
    FROM generated_quotes
    WHERE project_id = 1;
    

    Forventet:

    • offer_id: 12345
    • offer_number: "TIL-2024-00123"
    • status: "Tilbudsgiver Oprettet Tilbud"
    • sent_at: 2024-10-31 14:30:00

Næste Skridt

  1. Test med rigtige data fra Røsevangen projekt
  2. Verificer status vises korrekt i Ordrestyring UI
  3. Test status opdatering workflow
  4. Frontend integration (FinalReview knap)
  5. Production deployment

Konfiguration

Ingen environment variables nødvendige - bruger eksisterende:

ORDRESTYRING_GRAPHQL_URL=https://graphql.ordrestyring.dk/graphql
ORDRESTYRING_API_KEY=cRD7xfeoiGh1OhzV

Sikkerhed

Interne noter sendes til Ordrestyring, men er kun synlige internt
Ingen overhead/fortjeneste i kunde-synlig beskrivelse
Status ID hentes dynamisk (ikke hardcoded)
Alle fejl logges med fuld context

Konklusion

Interne beregninger gemmes nu i bemærkninger
Status "Tilbudsgiver Oprettet Tilbud" sættes automatisk
Fuld transparens internt, professional præsentation eksternt
Klar til produktion


Implementeret: 31. oktober 2025
Status: PRODUCTION READY
Backend: Komplet implementeret
Frontend: Afventer integration