Prospect to Customer Conversion Flow
Oversigt over konverteringsprocessen fra Salg til Kunde
flowchart TD
Start([Start: convertToCustomer]) --> Verify{Skip Market<br/>Verification?}
Verify -->|No| MarketVerify[Verify Prospect Delivery<br/>with Market Service]
Verify -->|Yes| PrepareData
MarketVerify --> PrepareData
PrepareData[Prepare Customer Data<br/>from Prospect] --> FindCustomer{Find Existing Customer}
FindCustomer --> CheckAltNo{Has alternative_<br/>customer_number?}
CheckAltNo -->|Yes| SearchAltNo[Search by<br/>alternative_customer_number]
CheckAltNo -->|No| CheckCustNo
SearchAltNo --> CustomerFound{Found?}
CheckCustNo{Has customer_<br/>number?} -->|Yes| SearchCustNo[Search by<br/>customer_number]
CheckCustNo -->|No| CheckCVR
SearchCustNo --> CreateWithNo[Create new Customer<br/>with given customer_number]
CheckCVR{Has CVR?} -->|Yes| CheckDummyCVR{Is Dummy CVR?<br/>11111111/00000000}
CheckCVR -->|No| CheckCPR
CheckDummyCVR -->|Yes| NewCustomer[New Customer Instance]
CheckDummyCVR -->|No| SearchCVR[Search by CVR]
SearchCVR --> CustomerFound
CheckCPR{Has CPR?<br/>birthdate + last 4} --> CheckDummyCPR{Is Dummy CPR?<br/>1111/0000/xxxx}
CheckDummyCPR -->|Yes| NewCustomer
CheckDummyCPR -->|No| SearchCPR[Search by<br/>birthdate + cpr_last_four]
SearchCPR --> CustomerFound
CustomerFound -->|Found| ExistingCustomer[Use Existing Customer]
CustomerFound -->|Not Found| NewCustomer
CreateWithNo --> NewCustomer
ExistingCustomer --> UpdateCustomer{Update Customer Data}
NewCustomer --> UpdateCustomer
UpdateCustomer --> IsNew{Is New<br/>Customer?}
IsNew -->|Yes| GenerateNo[Generate customer_number<br/>Generate password<br/>Set newsletter preference]
IsNew -->|No| KeepExisting[Keep existing<br/>customer_number & password]
GenerateNo --> UpdateFields
KeepExisting --> UpdateFields[Update fields if dummy/null:<br/>- CPR if dummy<br/>- CVR if dummy/null<br/>- Alternative CPR if dummy<br/>- industry_code if null<br/>- customer_type if null]
UpdateFields --> SaveCustomer[Save Customer]
SaveCustomer --> HandleAddress
HandleAddress{Handle Address} --> CheckDAR{Same DAR<br/>reference?}
CheckDAR -->|Yes & Customer exists| ReuseAddr[Reuse Customer's<br/>existing address]
CheckDAR -->|No| CreateAddr[Create new Address]
ReuseAddr --> CheckAltAddr
CreateAddr --> CheckAltAddr
CheckAltAddr{Has alternative_<br/>address in sale?} -->|Yes| CreateAltAddr[Create new Alternative<br/>Address record]
CheckAltAddr -->|No| NoAltAddr[No alternative address]
CreateAltAddr --> DecideAgreement
NoAltAddr --> DecideAgreement
DecideAgreement{Decide Agreement} --> CheckAgrNo{agreement.number<br/>value?}
CheckAgrNo -->|null| CreateNewAgr
CheckAgrNo -->|'new'| CreateNewAgr
CheckAgrNo -->|'use_latest'| HasAgreements{Customer has<br/>agreements?}
CheckAgrNo -->|specific number| AgrExists{Agreement<br/>exists?}
HasAgreements -->|Yes| ReuseLatest[Reuse latest<br/>standard agreement]
HasAgreements -->|No| CreateNewAgr
AgrExists -->|Yes| ReuseSpecific[Reuse specific<br/>agreement]
AgrExists -->|No| CreateNewAgr[Create New Agreement]
CreateNewAgr --> SetReminderNew{Set reminder_template}
SetReminderNew -->|'use_latest'| UseConfig[Use config default]
SetReminderNew -->|Other| UseSale[Use from sale or config]
UseConfig --> NewAgrData[New Agreement Data:<br/>- billing_interval<br/>- binding_period<br/>- payment_term<br/>- billing_type<br/>- reminder_template<br/>etc.]
UseSale --> NewAgrData
NewAgrData --> UseAltAddr{Has alternative_<br/>address?}
UseAltAddr -->|Yes| SetBillingAlt[Set billing address to<br/>alternative address]
UseAltAddr -->|No| SetBillingMain[Set billing address to<br/>main address]
SetBillingAlt --> AddToAgreement
SetBillingMain --> AddToAgreement
ReuseLatest --> KeepAgrSettings[Keep existing<br/>agreement settings<br/>including reminder_template]
ReuseSpecific --> KeepAgrSettings
KeepAgrSettings --> AddToAgreement[Add to Agreement:<br/>- Subscriptions<br/>- Collection Subscriptions<br/>- Delivery<br/>- Product Timeline]
AddToAgreement --> CheckBank{Should create<br/>bank account?}
CheckBank -->|Customer has no<br/>bank accounts &<br/>sale has bank data| CreateBank[Create Bank Account]
CheckBank -->|Customer already<br/>has bank account| SkipBank[Skip bank account]
CheckBank -->|No bank data<br/>in sale| SkipBank
CreateBank --> CopyLogs
SkipBank --> CopyLogs[Copy logs from<br/>prospect to customer]
CopyLogs --> MarkTransferred[Mark prospect as<br/>transferred_at = now]
MarkTransferred --> FireEvents[Fire Events:<br/>- ConvertedToCustomer<br/>- CustomerCreatedEvent]
FireEvents --> End([Return Customer])
style Start fill:#e1f5e1
style End fill:#e1f5e1
style NewCustomer fill:#ffe1e1
style ExistingCustomer fill:#e1e5ff
style CreateNewAgr fill:#fff4e1
style ReuseLatest fill:#e1f5ff
style ReuseSpecific fill:#e1f5ff
Nøgleregler
Kunde-matching (prioriteret rækkefølge)
- alternative_customer_number → firstOrNew
- customer_number → firstOrNew (opretter ny med dette nummer hvis ikke fundet)
- CVR (ikke dummy) → firstOrNew
- CPR (ikke dummy) → firstOrNew
- Dummy-værdier → Opret altid ny kunde
Dummy-værdier
- CVR dummy:
11111111, 00000000 - CPR dummy:
1111, 0000, xxxx, null - Fødselsdato dummy:
111111, 000000, xxxxxx, null
Aftale-logik
- Ny aftale oprettes hvis:
null, 'new', kunde har ingen aftaler, eller specifikt nummer ikke findes - Aftale genbruges hvis:
'use_latest' eller specifikt eksisterende aftalenummer - Ved genbrug: reminder_template og andre indstillinger forbliver uændrede
- Ved ny aftale: reminder_template sættes fra salg eller config
Adresse-logik
- Hovedadresse genbruges kun hvis samme DAR-reference
- Alternativ adresse oprettes altid som ny record hvis angivet i salg
- Ved ny aftale: Alternativ adresse bruges som billing-adresse
- Ved genbrugt aftale: Alternativ adresse oprettes men bruges ikke
Bankkonto
- Oprettes kun hvis kunde IKKE har nogen bankkonti og salget har bankdata
- Eksisterende bankkonti genbruges altid