CRM Dokumentation
Teknisk dokumentation af 80days' Zoho CRM-opsætning - moduler, relationer, integrationer, workflows, custom functions og client scripts. 80days er en Hellerup-baseret rejsevirksomhed, der i 2025 migrerede fra Travelwire til Zoho CRM. Systemet bygger på en bevidst tilpasset Zoho-model, hvor Leads aldrig konverteres, og hele rejseforløbet fra første kundekontakt til afsluttende regnskab håndteres i én sammenhængende kæde.
Vælg en sektion
Systemoversigt
Modul-tabel, integrationer som kort-grid, og det overordnede booking-til-betaling-flow.
Modulrelationer
Lookup-felter og Rollup Summary-relationer på tværs af alle moduler.
Integrationer
e-conomic (POST + PUT/GET), Amadeus, WorkDrive, Zoho Sheet, OpenAI, Mail Merge, Flow, webapp.
Moduler
Detaljeret feltdokumentation pr. modul - Clients, Bookings, Offers, Invoices, Payments m.fl.
Client Scripts
JavaScript der kører i browseren - trigger, formål og kodeuddrag pr. side.
Workflows
Workflow-regler pr. modul, grupperet efter Ved Oprettelse / Redigering / Scheduled.
Aktivitetsmoduler
Tasks, Meetings, Calls samt stage-oversigter for Booking, Offer og Supplier Payable.
1. Systemoversigt
Systemet består af ni custom-moduler omkring den centrale Booking-record, tre standard-aktivitetsmoduler samt en række eksterne integrationer. Den overordnede dataflow går fra Clients -> Bookings -> Offers -> Generate Invoices -> Invoices + Supplier Payables -> Payments.
Moduler
| Modul | Type | Formål |
|---|---|---|
| Clients | Custom | Kundestamdata. Bygger på Zohos Leads-modul, men records konverteres aldrig - Contacts-modulet er fjernet. |
| Bookings | Custom | Den centrale rejsesag. Bygger på Zohos Deals-modul. Indeholder PNR, finans-rollups, passager- og flyinformation. |
| Offers | Custom | Tilbud knyttet til en Booking. En Booking kan have flere Offers. Har egen Canvas-view med taps for Offer Builder, Finance, Transactions m.m. |
| Generate Invoices | Custom | Hjælpemodul der fra et Offer opretter en række planlagte fakturaer (depositum, slutfaktura). Recorden sletter sig selv efter generering. |
| Invoices | Custom | Kundefakturaer. Oprettes altid med én varelinje så kunden ikke ser beregningsgrundlaget. Synkroniseres til e-conomic. |
| Payments | Custom | Universel transaktionspost for bade kundeindbetalinger og leverandørudbetalinger. Linker simultant til Client, Supplier, Offer, Booking, Invoice og Supplier Payable. |
| Suppliers | Custom | Leverandørstamdata. Bygger på Zohos Vendors-modul. |
| Supplier Payables | Custom | Aggregeret leverandørgæld pr. kombination af Offer + Supplier + valuta. Oprettes automatisk når et Offer vindes. |
| Products | Custom | Katalog over rejseprodukter (fly, hoteller, transfers, oplevelser) som bruges som linjevarer i Offers. |
| Tasks | Standard | Opgaver. Tilpasset med Client Name og Departure Date til at understøtte rejserelaterede påmindelser. |
| Meetings | Standard | Kalenderbegivenheder (Zoho Events). Anvendes til møder med klienter og leverandører. |
| Calls | Standard | Telefonopkaldslog. Bruger Zoho-standardlayout med betingede sektioner for Outgoing/Incoming. |
Integrationer
e-conomic
Bogføring af kundefakturaer, kundebetalinger, kreditnotaer og leverandørbetalinger. Daglig kontoplans-sync.
Amadeus (Farewise)
Henter passager- og flyinformation fra PNR-numre på Bookings.
Zoho WorkDrive
Auto-oprettede booking- og offer-mappestrukturer, lager for PDF-bilag og "Scannet af AI"-undermapper.
Zoho Sheet
Lufthavnsdatabase til EU-check og daglig faktura-eksport.
OpenAI
AI-baseret parsing af fritekst-adresser til strukturerede felter på Clients.
Mail Merge
Templates til faktura-, tilbuds- og kreditnota-PDF'er på dansk og engelsk.
Zoho Flow
Asynkron upload af WorkDrive-bilag til e-conomic vouchers.
80days webapp
Intern web-app (80days.zrm.dk) for produkt- og leverandør-sync samt FX-marginer.
Booking-til-betaling-flow
Det forretningsmæssige forløb følger en fast sekvens:
- En Client oprettes (eller findes), og en Booking oprettes som det centrale rejseunderlag.
- Et eller flere Offers udarbejdes i Quotation-stadiet. Det Offer kunden hælder mest mod sættes til In Order.
- Sælger trykker Create Invoices -> Generate Invoices-recorden opretter de planlagte fakturaer (30/70-split eller 100% afhængigt af tid til afrejse) og sletter sig selv.
- Workflow sætter Offer til Issued og Booking til Confirmed automatisk. Workflow "Offer Won - Update Payables" opretter én Supplier Payable pr. leverandør på Offer'et.
- Fakturaer markeres som "Sendt til kunden" -> automatisk sync til e-conomic. Selve bogføringen i e-conomic er manuel.
- Kunden betaler. Indbetalingen registreres i Payments enten enkeltvis eller via bank-CSV (uploadet til WorkDrive > Posteringer).
- Leverandøren betales. Medarbejder uploader bilaget; betaling godkendes via knappen "Register Payment - DKK" / "Mark as Booked" -> bogføres i e-conomic Kreditorfil.
- På Departure Date rykker Booking automatisk til Traveling (kun hvis stadiet i forvejen er Confirmed). Når sidste Time2 i Flight Information rammes, rykker den til Completed.
2. Modulrelationer
Datamodellen er hub-and-spoke omkring Bookings. Payments er den universelle pengestrøm-node og linker simultant til seks andre moduler. Nedenstående tabel viser alle Lookup- og Multi-Select Lookup-felter mellem moduler.
| Fra modul | Felt | Type | Til modul | Forklaring |
|---|---|---|---|---|
| Bookings | Client | Lookup | Clients | Den primære kunde på bookingen |
| Offers | Booking | Lookup | Bookings | Bookingen tilbuddet hører til |
| Offers | Client | Lookup | Clients | Kunden tilbuddet er rettet til (dobbelt-link via Booking) |
| Offers (subform) | Product Name | Lookup | Products | Produkt valgt på Offered Items-linjen |
| Offers (subform) | Supplier | Lookup | Suppliers | Leverandør på Offered Items-linjen |
| Invoices | Offer | Lookup | Offers | Tilbuddet fakturaen er beregnet ud fra |
| Invoices | Booking Name | Lookup | Bookings | Bookingen fakturaen hører til |
| Invoices | Client | Lookup | Clients | Kunden der faktureres |
| Invoices (subform) | Product Name | Lookup | Products | Linjevare (typisk én linje pr. faktura) |
| Generate Invoices | Booking | Lookup | Bookings | Bookingen der genereres fakturaer for |
| Generate Invoices | Offer | Lookup | Offers | Tilbuddet der danner grundlag |
| Generate Invoices | Client | Lookup | Clients | Kunden |
| Supplier Payables | Supplier | Lookup | Suppliers | Leverandøren der skal betales |
| Supplier Payables | Offer | Lookup | Offers | Det tilbud betalingen knyttes til |
| Payments | Client | Lookup | Clients | Tilknyttet kunde |
| Payments | Supplier | Lookup | Suppliers | Tilknyttet leverandør |
| Payments | Offer | Lookup | Offers | Tilknyttet tilbud |
| Payments | Booking | Lookup | Bookings | Tilknyttet booking |
| Payments | Invoice | Lookup | Invoices | Tilknyttet faktura (ved kundeindbetaling) |
| Payments | Supplier Payable | Lookup | Supplier Payables | Leverandørgæld der afregnes |
| Clients | Associated with | Lookup (selv) | Clients | Selvreference til relateret kunde (ægtefælle/familie) |
| Clients (subform) | Option | Lookup | Products | Rejseudstyr kunden ejer (subform Travel Equipment) |
| Products | Suppliers | Multi-Select Lookup | Suppliers | Leverandører der leverer produktet |
| Suppliers | Products | Multi-Select Lookup | Products | Produkter leverandøren tilbyder (symmetrisk) |
| Tasks | Related To | Lookup (polymorft) | Bookings / Offers / Invoices m.fl. | Standard Zoho-relateret-til-felt |
| Calls | Related To | Lookup (polymorft) | Bookings / Offers m.fl. | Standard Zoho-relateret-til-felt |
| Meetings | Related To | Lookup (polymorft) | Bookings / Offers m.fl. | Standard Zoho-relateret-til-felt |
Rollup Summary-relationer
Følgende Rollup Summary-felter aggregerer data fra én modul til en anden:
| På modul | Felt | Aggregerer fra | Beregning |
|---|---|---|---|
| Bookings | Total Paid by Client | Payments | SUM af kundeindbetalinger på bookingen |
| Bookings | Estimated Cost / Estimated VAT / Estimated DB | Offers | SUM af tilbudsfelter |
| Bookings | Invoiced Total Incl VAT | Invoices | SUM af fakturatotal |
| Bookings | Earliest Invoice Date | Invoices | MIN af Invoice Date |
| Offers | Total Invoiced | Invoices | SUM af fakturatotal |
| Offers | Total Credited | Invoices | SUM hvor status = Credited |
| Offers | Amount Paid by Client | Payments | SUM af kundebetalinger |
| Offers | FX Gain/Loss | Payments | SUM af FX-differencer |
| Invoices | Amount Paid | Payments | SUM af tilknyttede betalinger |
| Supplier Payables | Paid Amount | Payments | SUM af leverandørbetalinger (DKK) |
| Supplier Payables | Paid Amount (Currency) | Payments | SUM i lokal valuta |
| Clients | Most Recent Offer | Offers | MAX af Offer-dato |
| Clients | Earliest First Trip | Bookings | MIN af Departure Date |
| Clients | Next Upcoming Confirmed Booking | Bookings | MIN af Departure Date for Confirmed |
3. Integrationer
Systemet har otte aktive integrationer ud til eksterne systemer. Den tungeste integration er e-conomic, der modtager alle kunde- og leverandørposteringer. De fleste integrationer er implementeret som Deluge Custom Functions, der kaldes fra workflows eller knapper.
e-conomic
e-conomic er 80days' regnskabssystem. Integrationen sender automatisk posteringer fra Zoho CRM ind i e-conomic's journaler, vedhæfter bilag og synkroniserer kontoplanen.
Dataflow
- Kundefakturaer: Når en Invoice markeres "Sendt til kunden" trigger workflow Book Immediately -> Custom Function (Bogfør kundefaktura i e-conomic) -> POST til journal 4. PDF genereres via Mail Merge og uploades som bilag.
- Kundebetalinger: Workflow på Payment Type "Payment from Client" -> Custom Function (Bogfør kundebetaling) -> POST til journal 6. Bilag fra WorkDrive uploades asynkront via Zoho Flow.
- Kreditnotaer: Workflow på Payment Type "Credit Note" -> samme funktion som kundebetaling men positivt fortegn -> POST til journal 6.
- Leverandørbetalinger: Når bruger trykker "Register Payment - DKK" på Payment med type "Payment to Supplier" -> Custom Function (Bogfør leverandørbetaling) -> POST til journal 7. DKK-beløb genberegnes fra e-conomic's exchangeRate hvis valuta != DKK.
- Kontoplan-sync: Scheduled function (Synkronisér bankkonti fra e-conomic) henter dagligt konti 5800-5850 fra e-conomic og opdaterer global picklist "Bank Account" i CRM.
e-conomic Oprettelse (POST)
Posteringer som oprettes i e-conomic via POST. Faste værdier markeret med =.
| Type | Endpoint | Faste felter | Dynamiske felter |
|---|---|---|---|
| Kundefaktura | POST /journals/4/vouchers |
journalNumber = 4, kontotyper: 1010 (med moms) / 1015 (uden moms), modkonto = customer 1, VAT-konto = 6902 | amount (Grand Total minus VAT), accountingYear (fra Invoice Date), text "[invoice_no] / [client] / [MMMyy] / [booking_no]", VAT-amount, currency |
| Kundebetaling / Kreditnota | POST /journals/6/vouchers |
journalNumber = 6, contraAccount = bankkonto (EUR=5812, USD=5814, DKK=5815) | amount (negativt for indbetaling, positivt for kreditnota), accountingYear, paid date, appendix number (org variable), invoice ref |
| Leverandørbetaling | POST /journals/7/vouchers |
journalNumber = 7, kreditorkonto = 1310, VAT-konto = 6903 | amount (negativt mod bankkonto, positivt mod kreditor), bank account number, accountingYear, paid date, currency |
| Bilag-upload | POST /journals/{n}/vouchers/{id}/attachment |
connection = "economic" | PDF fra Mail Merge eller fil fra WorkDrive (sidstnævnte via Zoho Flow async) |
e-conomic Løbende synkronisering (PUT / GET)
Felter der læses tilbage og opdaterer CRM, samt change-detection.
| Operation | Endpoint | Tjek-felter | Opdaterer i CRM |
|---|---|---|---|
| Hent kontoplan | GET /accounts?filter=accountNumber$gte:5800$and:accountNumber$lte:5850 |
accountNumber, name | Global picklist "Bank Account" via PATCH til CRM settings |
| Hent regnskabsår | GET /accounting-years |
fromDate, toDate | Vælger korrekt accountingYear på POST |
| Hent FX-kurs | GET /currencies/{code}/exchange-rate |
exchangeRate på paid date | Amount (DKK) på Payment |
| Sweep manglende bilag | GET /journals/{6|7}/vouchers?pagesize=1000 |
attachment.pages == 0 | Trigger re-upload via Zoho Flow webhook (recovery-job Sweep Economic Attachments) |
Amadeus (via Farewise)
Henter passager- og flydata fra PNR-numre på Bookings. Implementeret som Custom Function Hent PNR Info (standalone), kaldt fra workflows på PNR-felter og fra knappen "Opdater PNR" på Booking.
| Operation | Endpoint | Beskrivelse |
|---|---|---|
| Hent PNR | POST https://api.farewise.dk/v30/flight/pnr/get | Sender PNR-nummer, får passager-array og flight-segments-array tilbage. Sorteres efter departureDate. |
Felter der opdateres på Booking
- Subform Passenger Information: Passenger (navn), Type (ADT/CHD/INF), Age, Date of Birth, Sex.
- Subform Flight Information: Carrier, Flight No, Time1/City1 (afgang), Time2/City2 (ankomst), kabineklasse (F=First, C=Business, W=Premium Economy, M=Economy).
- Feltet Last Time2 sættes til seneste ankomsttid - bruges som trigger for stage-overgangen til Completed.
Booking har 10 PNR-felter (PNR, PNR 02 ... PNR 10) så flere flysegmenter kan tilknyttes samme rejse. Workflows er splittet i to regler ("PNR Info 1" og "PNR Info 2") pga. Zohos grænse for trigger-felter pr. regel.
Zoho WorkDrive
WorkDrive holder al filbaseret dokumentation - bilag til e-conomic-posteringer, PDF-fakturaer, Proof of Payment-bilag og kundeindbetalings-CSVer.
Mappestruktur
- Bilag/ (rod)
- [Booking Name]/ - oprettet automatisk ved booking-oprettelse via Custom Function (Opret booking Workdrive-mappe). ID gemmes på feltet
Workdrive IDpå Booking.- [Offer Number]/ - oprettet ved Offer-oprettelse. ID på Offer.
- Scannet af AI/ - undermappe til AI-processerede bilag.
- [Offer Number]/ - oprettet ved Offer-oprettelse. ID på Offer.
- [Booking Name]/ - oprettet automatisk ved booking-oprettelse via Custom Function (Opret booking Workdrive-mappe). ID gemmes på feltet
- Posteringer/ - upload-zone for bank-CSV. CSV trigger automatisk oprettelse af Payment-records i Review Queue.
| Operation | Brugt fra | Beskrivelse |
|---|---|---|
zoho.workdrive.createFolder() | Workflow på Booking + Offer (oprettelse) | Opretter mapper med booking/offer-navn |
zoho.workdrive.uploadFile() | Mail Merge-buttons, Custom Function (Generer kreditnota PDF) | Uploader PDF til relevant mappe |
Zoho Sheet
To Zoho Sheet-baserede integrationspunkter:
Lufthavnsdatabasen
- Resource:
hbze023ca7c06f3ef4184bc6e4b44bb8473e3, faneAirports. - Kolonner: Lufthavnskode (IATA), Lufthavnsnavn, Land, EU (TRUE/FALSE).
- Brugt af Custom Function (EU Check): når feltet Destination på Booking opdateres, slås IATA-koden op og Traveling within EU sættes.
- Vedligeholdes manuelt - opdateres ikke automatisk. Kontakt support@zrm.dk for redigeringsadgang.
Daglig faktura-eksport
- Resource:
mferl46c8d0..., faneCRM Invoices. - Scheduled Custom Function (Daglig synkronisering af fakturaer) sletter eksisterende rækker og indsætter alle Invoices via COQL (batches af 1000-2000 records).
- Felter: id, Subject, Invoice No, Invoice Number, Invoice Date.
OpenAI Responses API
Bruges til at parse fritekst-adresser på Clients til strukturerede felter. Implementeret i Custom Function (AI-parser adresse).
| Endpoint | Model | Felter |
|---|---|---|
POST https://api.openai.com/v1/responses | gpt-5.4, temperature 0, max 500 tokens | Returnerer JSON med City_Name, Street, State, Zip, Country |
System prompt indeholder land-specifikke regler for Japan, Maldiverne, Seychellerne, UAE, USA, UK m.fl. samt oversættelse fra danske/tyske/franske landenavne til engelsk.
Zoho Mail Merge
Bruger Zohos indbyggede Mail Merge til at generere PDF-dokumenter. Templates findes på dansk og engelsk og vælges baseret på klientens sprog.
| Template | Brugt fra | Output |
|---|---|---|
| Invoice PDF - Danish / English | Knap "Download faktura som PDF" på Invoice | Faktura_[invoice_no]_[booking_no].pdf -> WorkDrive |
| Offer PDF - Danish / English | Knap "Download tilbud som PDF" på Offer | Tilbud_[offer_no]_[booking_no].pdf -> WorkDrive |
| Credit Note PDF - Danish / English | Custom Function (Generer kreditnota PDF) | Kreditnota-PDF -> WorkDrive |
Endpoint-mønster: POST /crm/v8/{module}/{id}/actions/download_mail_merge
Zoho Flow
Bruges som asynkron broker mellem Zoho WorkDrive og e-conomic's vouchers attachment-endpoint. Når en Payment har Workdrive File ID sat, sender Custom Function (Bogfør leverandørbetaling) et POST-kald til en Zoho Flow webhook med voucher-ID + WorkDrive-fil-ID, og Flow tager sig af download + re-upload til e-conomic.
Dette flow er også det Custom Function (Sweep e-conomic vouchers) bruger til at reparere posteringer hvor attachment mangler.
80days webapp
Intern web-applikation på 80days.zrm.dk som holder:
- Synkroniserede produkter og leverandører fra CRM (brugt af Offer Builder på websitet)
- FX-marginer (currency markup) - administreret via et separat "Currency Markup Admin"-værktøj tilgået via mailet link
| Operation | Endpoint | Brugt fra |
|---|---|---|
| Sync leverandør | POST https://80days.zrm.dk/api/zoho/sync/vendor/{id} | Knap "Synkronisér leverandør til webapp" |
| Sync produkt | POST https://80days.zrm.dk/api/zoho/sync/product/{id} | Knap "Synkronisér produkt til webapp" |
| Link produkt-leverandør | POST https://80days.zrm.dk/api/zoho/sync/product_supplier | Begge sync-knapper |
| Hent FX-kurs | GET https://80days.zrm.dk/api/fx/currency | Custom Function (Auto-remap betaling) ved oprettelse af ny Supplier Payable |
4. Moduler
Detaljeret feltdokumentation pr. modul. Felter er gengivet med visningsnavne fra layout-editoren (ikke API-navne). Sektionerne følger Zoho-layoutets struktur. Lookup-felter angiver malmodulet.
Clients
Kundestamdata. Bygger på Zohos Leads-modul, men records konverteres aldrig - i 80days-modellen er Contacts-modulet helt fjernet, og det er Lead-modulet der fungerer som varigt kunderegister. Alle bookinger og tilbud refererer hertil via Lookup.
Client Information
| Felt | Type | Beskrivelse |
|---|---|---|
| First Name | Single Line (med Salutation) | Fornavn med titel-prefix |
| Last Name | Single Line | Efternavn |
| Mobile No | Phone | Mobilnummer (valideres via Validation Rule mod telefonregler) |
| Phone No | Phone | Fastnetnummer (valideres) |
| Email (Unique) | Unik e-mailadresse | |
| Client Status | Picklist | Aktiv / inaktiv mv. |
| Inactive Reason | Picklist | Ã…rsag til inaktivering |
| Newsletter | Checkbox | Tilmeldt nyhedsbrev (trigger Email Notification ved tilvalg) |
| Email Opt Out | Checkbox | Frabedt sig e-mails |
| Remarks | Multi-Line | Generelle noter |
| Luggage Tags | Multi-Line | Tekst til bagagemærker |
| Birth Date | Date | Fødselsdato |
| Anniversary | Date | Mærkedag |
| Client No | Auto-Number | Systemgenereret kundenummer |
| Language | Picklist | Foretrukket kommunikationssprog |
| Client Source | Picklist | Kilde til kunden |
| Associated with | Lookup -> Clients | Selvreference til relateret kunde (ægtefælle/familie) |
| Last Purchase | Date/Time | Sidste købsdato |
| Most Recent Offer | Rollup Summary (DateTime) | Dato for nyeste tilbud |
| Notes from TW | Multi-Line | Importerede noter fra Travelwire |
| Next Upcoming Confirmed Booking | Rollup Summary (Date) | Næste kommende Confirmed-booking |
Address Information
| Felt | Type | Beskrivelse |
|---|---|---|
| Street | Single Line | Adresse linje 1 |
| Street 2 | Single Line | Adresse linje 2 |
| Postal Code | Single Line | Postnummer (trigger autofill af City/Country på danske numre) |
| Province | Single Line | Region/provins |
| City | Single Line | By |
| Country | Single Line | Land |
Show Travel Equipment
| Felt | Type | Beskrivelse |
|---|---|---|
| Show Travel Equipment | Checkbox | Styrer om subform "Rejseudstyr" vises (skjult ved Create) |
Felter fra Travelwire
Bevidst grupperet sektion til migreret data, som de stadig kan være brug for at slå op.
| Felt | Type | Beskrivelse |
|---|---|---|
| BW1, BW2, BW3 | Single Line | TW-felter (oprindelig betydning bevaret) |
| Serendipia vol. | Single Line | TW-tekstfelt |
| Rejsebeger | Single Line | TW-tekstfelt |
| Andlet | Single Line | TW-tekstfelt |
| S1 | Single Line | TW-tekstfelt |
| Mismo1 ... Mismo4 | Single Line | TW-mismo-felter |
| Note | Multi-Line | TW-note |
Travel Equipment (Subform)
| Kolonne | Type | Beskrivelse |
|---|---|---|
| Option | Lookup -> Products | Hvilken type rejseudstyr |
| Value | Number | Antal/størrelse |
Systemfelter
| Felt | Type | Beskrivelse |
|---|---|---|
| Client Owner | User | Ansvarlig medarbejder |
| Created By | Single Line | Oprettet af |
| Modified By | Single Line | Sidst ændret af |
| TravelWire ID | Single Line | Migreret TW-reference |
| bookingPhone | Checkbox | Telefon er booking-relevant |
| Earliest First Trip | Rollup Summary (DateTime) | Tidligste første rejse-dato |
Bookings
Den centrale rejsesag. Bygger på Zohos Deals-modul. Indeholder finansoverblik (Rollup Summaries fra Offers, Invoices og Payments), PNR-information, passager- og fly-subforms samt status på rejseproduktion (flybilletter, bagagemærker, følgebrev mv).
Booking Information
| Felt | Type | Beskrivelse |
|---|---|---|
| Booking No | Auto-Number | Systemgenereret bookingnummer |
| Booking Owner | User | Ansvarlig sagsbehandler |
| Booking Name | Single Line | Visningstitel - bygges automatisk som "Efternavn Fornavn, Destination, Måned Ã…r" |
| Stage | Picklist | Booking-stadie - se stage-oversigten under Workflows |
| Travelwire Status | Picklist | Status overført fra Travelwire |
| Lost Reason | Picklist | Ã…rsag hvis booking tabes |
| Destination | Single Line | Destination/IATA-kode - tvinges til store bogstaver via workflow |
| Traveling within EU | Checkbox | Sættes automatisk via opslag i lufthavnsdatabasen |
| Departure Date | Date | Afrejsedato (trigger til auto-stadium "Traveling") |
| Travel Type | Picklist | Rejsetype (privat, gruppe mv) |
| Luggage Tags Text | Multi-Line | Fri tekst til bagagemærker |
Contact Information
| Felt | Type | Beskrivelse |
|---|---|---|
| Client | Lookup -> Clients | Den primære kunde |
| Client No | Single Line | Kopi af kundens nummer (read-only) |
| Lead Source Channel | Picklist | Hvor leadet kom fra |
| Mobile | Phone | Kontakt-mobil (read-only - synkroniseret fra Client) |
| Phone | Phone | Kontakt-fastnet (read-only) |
| Kontakt-email (read-only) | ||
| Language | Picklist | Foretrukket sprog (read-only) |
Integration Fields
| Felt | Type | Beskrivelse |
|---|---|---|
| Safari Portal ID | Single Line | Reference til Safari Portal |
| PNR, PNR 02 ... PNR 10 | Single Line (10 felter) | Passenger Name Records. Workflow trigger PNR-opslag via Amadeus. Felterne vises progressivt via Client Script. |
Address
| Felt | Type | Beskrivelse |
|---|---|---|
| Street | Single Line | Adresse linje 1 - kopieres fra Client |
| Street 2 | Single Line | Adresse linje 2 |
| Postal Code | Single Line | Postnummer |
| City | Single Line | By |
| Country | Single Line | Land |
| Salgstype | Picklist | Nysalg eller Gensalg - sættes automatisk baseret på klientens tidligere rejser |
Finance
Aktive økonomi-felter. Rollups aggregerer fra Offers, Invoices og Payments. Felter med "Rollup Summary" beregnes af platformen; øvrige beregnes af Custom Function (Genberegn økonomi-felter på Booking).
| Felt | Type | Beskrivelse |
|---|---|---|
| Estimated Cost | Rollup Summary (Currency) | Estimerede omkostninger summeret fra Offers |
| Real Cost | Rollup Summary (Currency) | Faktiske leverandøromkostninger fra Payments |
| Cost Diff | Currency | Differens mellem estimat og virkelighed |
| Estimated DB | Rollup Summary (Currency) | Estimeret dækningsbidrag |
| Estimated DB % | Percent | Estimeret dækningsgrad |
| Real DB (Ex Real VAT) | Currency | Realiseret dækningsbidrag eksklusiv moms |
| Real DB % | Percent | Realiseret dækningsgrad |
| Invoiced Total Incl VAT | Rollup Summary (Currency) | Faktureret total inkl. moms |
| Invoiced Total Ex VAT | Currency | Faktureret total eksklusiv moms |
| Estimated VAT | Rollup Summary (Currency) | Estimeret moms |
| Real VAT | Currency | Faktisk moms (25% af DB hvis EU-rejse, ellers 0) |
| VAT Diff | Currency | Momsdifferens |
| Total Paid by Client | Rollup Summary (Currency) | Samlet kundeindbetaling |
| Outstanding Balance | Currency | Udestående saldo (Invoiced minus Paid) |
Finance (Migrated from Travelwire)
Historiske finansfelter migreret fra TW. Bevares som referencegrundlag.
| Felt | Type |
|---|---|
| Invoice Total | Currency |
| Balance | Currency |
| Contribution Amount | Currency |
| Contribution Margin | Percent |
Booking Validation
| Felt | Type | Beskrivelse |
|---|---|---|
| Flight Tickets | Picklist | Status på flybilletter |
| Luggage Tags | Picklist | Status på bagagemærker |
| Cover Letter | Picklist | Status på følgebrev |
| Itinerary | Picklist | Status på rejseplan |
| Practical Information | Picklist | Status på praktisk info-pakke |
Passenger Information (Subform)
Passenger, Type (ADT/CHD/INF), Date of Birth, Age, Sex. Udfyldes automatisk af Custom Function (Hent PNR Info).
Flight Information (Subform)
Carrier, Flight No, Time1 (afgang), City1, Time2 (ankomst), City2. Udfyldes automatisk af Custom Function (Hent PNR Info). Sidste Time2 sættes på toplevel-feltet Last Time2 og bruges som trigger for auto-Complete.
Remarks
| Felt | Type | Beskrivelse |
|---|---|---|
| Booking Remarks | Multi-Line | Generelle noter - kopieres fra Client ved oprettelse |
Hidden / System
| Felt | Type | Beskrivelse |
|---|---|---|
| SP url completion | Single Line | Safari Portal URL-status |
| Lead Time | Number | Dage fra oprettelse til afrejse |
| Workdrive ID | Single Line | Reference til WorkDrive-mappe |
| Currency | Picklist | Valuta |
| Exchange Rate | Decimal | Valutakurs |
| Last Time2 | Date/Time | Seneste ankomsttid fra Flight Information |
| TravelWire ID | Single Line (Unique) | Unik reference til migreret TW-post |
| Hide Sections | Checkbox | Styrer skjul af sektioner i layout (Create=true, Edit=false) |
| Earliest Invoice Date | Rollup Summary (DateTime) | Tidligste fakturadato |
| Passcount | Number | Antal passagerer |
Systemfelter
Booking Owner, Created By, Modified By.
Offers
Tilbud knyttet til en Booking. En Booking kan have flere Offers (Quotation, In Order, Issued). Linjer ligger i subformet Offered Items med leverandørpriser, kostpris, markup og DB-beregninger. Modulet har en dedikeret Canvas-view (Offer Canvas v2) med tabs for Offer Builder, Supplier Payables, Finance, Transactions, Attachments, Timeline og Finance Balance.
Offer Information
| Felt | Type | Beskrivelse |
|---|---|---|
| Offer No. | Auto-Number | Systemgenereret tilbudsnummer |
| Offer Owner | User | Ansvarlig konsulent |
| Offer Stage | Picklist | Quotation -> In Order -> Issued (eller Cancelled / Inactive) |
| Booking | Lookup -> Bookings | Bookingen tilbuddet hører til |
| Client | Lookup -> Clients | Kunden tilbuddet er rettet til |
| Description | Single Line | Kort beskrivelse |
| External Remarks | Multi-Line | Eksterne bemærkninger (vises til kunde) |
| Internal Remarks | Multi-Line | Interne noter |
| Rejsetype | Picklist | Type rejse |
| Offer Note | Rich Text | Lang formateret note |
Offer Finance
| Felt | Type | Beskrivelse |
|---|---|---|
| Cost | Currency | Samlet kostpris |
| Net | Currency | Nettoindtægt |
| Total Currency | Single Line | Aktiv valuta for totalerne |
| Total Amount in Currency | Decimal | Total i fremmedvaluta |
Offered Items (Subform)
Hver linje på tilbuddet. Indeholder Hidden (checkbox), Product Name (Lookup -> Products), Product Description, Supplier (Lookup -> Suppliers), Units, UnitCost, TotalCost, Markup(%), UnitPrice, TotalPrice, LocalCost, CostCur, Profit, Profit(%), VAT, VAT Price, TotalPrice+VAT.
Aggregate fields: VAT DKK, Total, Profit DKK, Profit %.
Exchange Rate
| Felt | Type | Beskrivelse |
|---|---|---|
| Inv. Currency | Single Line | Fakturavaluta |
| Original Rate | Decimal | Oprindelig kurs |
| Exch. Rate (10 DKK) | Decimal | Kurs pr. 10 DKK (typisk JPY) |
| Latest Saved Rate | Decimal | Senest gemte kurs |
| Full Amount in Currency | Decimal | Fuldt beløb i fremmedvaluta |
| Exch. Diff | Decimal | Kursforskel |
| Percentage | Percent | Procentmæssig forskel |
Finance Data
| Felt | Type | Beskrivelse |
|---|---|---|
| Total Invoiced | Rollup Summary (Currency) | Faktureret total fra tilknyttede Invoices |
| Total Credited | Rollup Summary (Currency) | Krediteret total |
| Amount Paid by Client | Rollup Summary (Currency) | Indbetalt af kunde |
| Invoice Balance | Currency | Udestående fakturasaldo |
| FX Gain/Loss | Rollup Summary (Currency) | Valutakurs-gevinst/tab |
Canvas View (Offer Canvas v2)
Offers har en avanceret Canvas-baseret detail-side som default. Headeren viser: Offer No., Description, Offer Stage (badge), Booking-link, samt knapperne "Upload Appendix" og "View Offer as PDF". Tabs:
- Offer Builder - Interaktiv tabel-editor for Offered Items. Sidekort med Cost, Net, VAT, Total, Profit. Handlinger: Add Row, Copy from Existing Offer, Show exchange rate, Save Offer.
- Supplier Payables - Liste over relaterede Supplier Payables med Status-badge, Balance, Paid Amount, Quoted Amount.
- Finance - Underlister Invoices + Client Payments. Sidekort med Total Invoiced, Total Credited, Amount Paid by Client, Invoice Balance.
- Transactions - Alle Payments knyttet til tilbuddet med Approval Stages, Transaction No, Payment Type, beløb i bade DKK og lokal valuta.
- Attachments - Vedhæftede filer (standard).
- Timeline - Audit-historik samt workflow- og funktions-trigger-events.
- Finance Balance - Tabel-overblik over alle ind- og udgående beløb med samlet Balance.
Systemfelter
Created By, Modified By, Offer Owner, Workdrive ID, Booking ID (tekstkopi), Currency, Exchange Rate, TravelWire ID, SP (Safari Portal-flag).
Generate Invoices
Hjælpemodul der fra et Offer opretter en række planlagte fakturaer i Invoices-modulet via en subform-definition. Recorden sletter sig selv efter generering. Så modulet er reelt en "engangs-form" der kun lever et øjeblik.
Generate Invoice Information
| Felt | Type | Beskrivelse |
|---|---|---|
| Generated Invoice No | Auto-Number | Systemgenereret nummer |
| Booking | Lookup -> Bookings | Bookingen der genereres fakturaer for (read-only) |
| Offer | Lookup -> Offers | Tilbuddet der danner grundlag |
| Departure Date | Date | Afrejsedato (kopieret, read-only) |
| Client | Lookup -> Clients | Kunden (read-only) |
| Currency | Picklist | Valuta |
| Exchange Rate | Decimal | Kurs |
Address Information
Street, Street 2, Postal Code, City, Country - alle kopieret fra Client/Booking.
Invoices to Generate (Subform)
| Kolonne | Type | Beskrivelse |
|---|---|---|
| Percentage | Percent | Andel af samlet beløb |
| Amount | Currency | Beløb (auto-beregnes fra Percentage og vice versa) |
| Due Date | Date | Forfaldsdato |
| Type | Picklist | Deposit / Remaining balance / Full payment / Installment |
Aggregate fields: Invoiced Amount (SUM), Total Amount, Balance (Formula).
- Hvis < 61 dage til afrejse: 1 linje på 100% (Type = Full payment, Due Date = i dag + 4 dage).
- Hvis >= 61 dage: 2 linjer - 30% Deposit (Due Date = i dag + 4) + 70% Remaining balance (Due Date = Departure Date - 61).
System Information
| Felt | Type | Beskrivelse |
|---|---|---|
| Updating Flag | Checkbox | Låsning under subform-update (forhindrer infinite loop i onCellChange) |
Invoices
Kundefakturaer. Oprettes typisk via Generate Invoices-flowet og kobles til et Offer/Booking. Synkroniseres til e-conomic ved status "Sendt til kunden". Oprettes altid med ÉN varelinje så kunden ikke kan se beregningsgrundlaget.
Invoice Information
| Felt | Type | Beskrivelse |
|---|---|---|
| Subject | Single Line | Faktura-emne |
| Invoice No | Auto-Number | Systemgenereret fakturanummer |
| Invoice Date | Date | Fakturadato |
| Type | Picklist | Deposit / Final / Credit / Installment |
| Due Date | Date | Forfaldsdato (default = Invoice Date + 10 dage) |
| Status | Picklist | Issued / Paid / Partially Paid / Credited / Sent / Migrated from TW |
| Despotdue | Date | Depositum-forfaldsdato |
| Offer | Lookup -> Offers | Tilbudet fakturaen hører til |
| Booking Name | Lookup -> Bookings | Bookingen fakturaen hører til |
| Booking No | Single Line | Tekstkopi af bookingnummer |
| Deposit | Currency | Depositumbeløb |
| Currency | Picklist | Fakturavaluta |
| Exchange Rate | Decimal | Valutakurs |
| Client Language | Single Line | Sprog (bestemmer Mail Merge-template) |
| Remarks | Single Line | Kort bemærkning |
| Internal Remarks | Multi-Line | Interne noter |
| Description | Multi-Line | Fakturabeskrivelse (auto-opdateres fra Offer-beskrivelse via workflow) |
| Full Amount | Currency | Fuldt fakturabeløb (hentet fra Offer) |
| Amount Paid | Rollup Summary (Currency) | Indbetalt beløb fra Payments |
Address Information
| Felt | Type | Beskrivelse |
|---|---|---|
| Client | Lookup -> Clients | Kunden der faktureres |
| Billing Street | Single Line | Faktureringsadresse linje 1 |
| Billing Street 2 | Single Line | Faktureringsadresse linje 2 |
| Billing City | Single Line | By |
| Billing Code | Single Line | Postnummer |
| Billing Country | Single Line | Land |
| Extra | Single Line | Ekstra adresse-info |
Invoiced Items (Subform)
S.NO, Product Name (Lookup -> Products), Description, Quantity, List Price, Amount (Formula).
Aggregate fields: Total Amount, Total Discount, Grand Total, VAT/Moms.
I praksis kun én linje pr. faktura - kunden må ikke kunne se kalkulationsgrundlaget.
System Information
| Felt | Type | Beskrivelse |
|---|---|---|
| Invoice Owner | User | Ansvarlig |
| Offer Description | Multi-Line | Kopi af tilbudsbeskrivelse (opdateres via workflow) |
| Reminder Task | Checkbox | Indikerer at påmindelses-opgave er oprettet |
| TW Status | Picklist | Travelwire-status |
| Net / Gross / Balance | Currency | Beregnede totaler |
| TravelWire ID | Single Line | Migrationsreference |
Payments
Universel transaktionspost. Én record kan være bade en kundeindbetaling (linket til Invoice + Client) eller en leverandørudbetaling (linket til Supplier Payable + Supplier). Modulet er det centrale auditpunkt fordi det linker direkte til seks andre moduler.
Payment Information
| Felt | Type | Beskrivelse |
|---|---|---|
| Transaction No | Auto-Number | Systemgenereret transaktionsnummer |
| Payment Type | Picklist | Payment from Client / Payment to Supplier / Credit Note |
| Payment Status | Picklist | Booked / Paid / Pending / Unpaid / To be reviewed mv. |
| Approval Stages | Picklist | Blueprint-stadie i godkendelsesflowet |
| Appendix Number (e-conomic) | Number | Bilagsnummer i e-conomic (sat af Custom Function ved bogføring) |
| Invoice | Lookup -> Invoices | Tilknyttet faktura (kundeindbetaling) |
| Supplier Payable | Lookup -> Supplier Payables | Leverandørgæld der afregnes |
| Currency | Picklist | Transaktionsvaluta |
| Transaction Currency | Single Line | Valuta som 3-bogstavs tekst (valideres via regex) |
| Bank Account | Picklist | Bankkonto (synkroniseres dagligt fra e-conomic) |
| Amount (DKK) | Currency | Beløb i DKK |
| Amount (Currency) | Decimal | Beløb i transaktionsvaluta |
| Amount (EUR) / Amount (USD) | Number | Specifik EUR-/USD-beløb hvis relevant |
| EUR to DKK Exchange Rate | Decimal | EUR-til-DKK-kurs |
| USD to DKK Exchange Rate | Decimal | USD-til-DKK-kurs |
| FX Rate | Decimal | Aktiv FX-kurs |
| Certainty Rate | Number | Vurderingsfaktor |
| Paid Date | Date | Betalingsdato |
| Proof of Payment | File Upload | Bilag for betaling |
| Note | Multi-Line | Fri tekst (auto-sammensættes fra Tekst + Indbetaler + Supp. tekst) |
| VAT / Moms | Currency | Moms |
| Booking No | Single Line | Tekstkopi af bookingnummer |
| Credit Note Status | Picklist | Kreditnota-status |
| Supplier Inv. No | Single Line | Leverandørens fakturanummer |
| Card Type / PAN / Reciept No | Single Line | Felter fra kortbetalinger |
Connected to
| Felt | Type | Beskrivelse |
|---|---|---|
| Client | Lookup -> Clients | Tilknyttet kunde |
| Supplier | Lookup -> Suppliers | Tilknyttet leverandør |
| Offer | Lookup -> Offers | Tilknyttet tilbud |
| Booking | Lookup -> Bookings | Tilknyttet booking |
System Information
| Felt | Type | Beskrivelse |
|---|---|---|
| Currency Match | Checkbox | Markor for valuta-match med bankkonto |
| Workdrive File ID | Single Line | WorkDrive-fil-reference |
| Paid in Currency | Single Line | Betalt i (valuta-tekst) |
| Tekst / Indbetaler / Supp. tekst til modtager | Single/Multi-Line | Bankimport-felter |
| PoP Sent | Checkbox | Proof of Payment afsendt til leverandør |
| RETROFIT_SP | Checkbox | Markor for retrofit Supplier Payables-link (migration) |
| TravelWire ID | Single Line (Unique) | Migrationsreference |
Suppliers
Leverandørstamdata. Bygger på Zohos Vendors-modul.
Supplier Information
| Felt | Type | Beskrivelse |
|---|---|---|
| Supplier Name | Single Line | Leverandørens navn - tvinges til store bogstaver |
| Name | Single Line | Kontaktpersons navn |
| Supplier Code | Single Line (Unique) | Unik leverandørkode - tvinges til store bogstaver |
| Phone | Phone | Telefon |
| Fax | Phone | Fax |
| Supplier Active | Checkbox | Aktiv markering |
| Products | Multi-Select Lookup -> Products | Produkter denne leverandør leverer (symmetrisk relation) |
| Currency (CCY) | Picklist | Foretrukken valuta |
| Payment Method | Picklist | Betalingsmetode (bank, kort, andet) |
| Remarks | Single Line | Bemærkninger |
| TravelWire ID | Single Line | Migrationsreference |
Address Information
Street, City, Province, Postal Code, Country.
Systemfelter
Supplier Owner, Created By, Modified By, samt sammensat Address-felt.
Supplier Payables
Aggregeret leverandørgæld pr. kombination af Offer + Supplier + valuta. Oprettes automatisk af Custom Function (Opret/opdater Supplier Payables) når et Offer vindes. Dækkes af én eller flere Payments. Bruges ikke som "kontrollerende myndighed" - status må gerne overstyres manuelt ved fx kursdifferencer.
Supplier Payable Information
| Felt | Type | Beskrivelse |
|---|---|---|
| Supplier Payable | Auto-Number | Systemgenereret nummer |
| Status | Picklist | Pending Payment / Partially Paid / Paid in Full / Cancelled |
| Supplier | Lookup -> Suppliers | Leverandøren der skal betales |
| Offer | Lookup -> Offers | Tilbuddet betalingen knyttes til |
| Cost Currency | Single Line | Kostpris-valuta |
| Booked FX Rate | Decimal | Bogført valutakurs (bevares ved efterfølgende update) |
| Booked FX Rate Date | Date | Dato for bogføringskursen |
Payment Overview
| Felt | Type | Beskrivelse |
|---|---|---|
| Quoted Amount | Currency | Tilbudt/forventet beløb til leverandør |
| Quoted Amount (Local) | Formula (String) | Visning i lokal valuta |
| Paid Amount | Rollup Summary (Currency) | Allerede betalt beløb (DKK) |
| Paid Amount (Currency) | Rollup Summary (Decimal) | Betalt beløb i fremmedvaluta |
| Balance | Currency | Resterende saldo (Quoted minus Paid) |
| Reason for Diff. | Single Line | Forklaring på differens mellem quoted og paid |
Systemfelter
Supplier Payable Owner, Created By, Modified By, Currency, Exchange Rate, Unique (konstrueret nøglefelt for at undgå dubletter).
Products
Katalog over rejseprodukter (fly, hoteller, transfers, oplevelser) som bruges som linjevarer i Offers og Invoices. Symmetrisk koblet til Suppliers via Multi-Select Lookup.
Product Information
| Felt | Type | Beskrivelse |
|---|---|---|
| Product Name | Single Line | Produktets visningsnavn - tvinges til store bogstaver |
| Product Code | Single Line (Unique) | Unik produktkode - tvinges til store bogstaver |
| Type | Picklist | Fly / hotel / transfer / oplevelse mv. |
| Product Active | Checkbox | Aktiv markering |
| Description | Multi-Line | Beskrivelse |
| Hidden | Checkbox | Skjul fra lister |
| Carrier | Picklist | Flyselskab/leverandør-paraply |
| City / City 2 | Single Line | Primær/sekundær by |
| WebLink | URL | Link til leverandør-side |
| Debit Type | Picklist | Bogføringskonto-type |
Financial
| Felt | Type | Beskrivelse |
|---|---|---|
| VAT | Checkbox | Momsbelagt |
| ccy. | Picklist | Valuta |
| Sales acct | Picklist | Salgs-bogføringskonto |
| Cost acct | Picklist | Omkostnings-bogføringskonto |
| Price | Currency | Standardpris |
Mailing
Name, Address, Email, Street, Phone, City Name, Fax, Zip, Province, Country.
Systemfelter
Product Owner, Created By, Modified By, category, Option1, TravelWire ID, samt Suppliers (Multi-Select Lookup -> Suppliers).
80days.zrm.dk så det er tilgængeligt i Offer Builder på websitet. Der kan gå op til 30 minutter før ændringer er synlige.
5. Client Scripts
Client Scripts er JavaScript der kører i brugerens browser ved page load, field change eller form submit. De bruges til progressive disclosure af felter, auto-populering fra relaterede records og enkelte hardvalideringer. Bemærk at flere bookings-scripts er identiske mellem Clone Page og Edit Page - de er markeret som genbrug.
Bookings - Create Page
Trigger: Field onChange: Client
Formål: Henter Language og Phone fra Client-recorden og overfører dem til Booking. Genbruges på Clone Page og Edit Page.
clientField = ZDK.Page.getField("Kunde").getValue();
if (clientField != null) {
let clientRec = ZDK.Apps.CRM.Leads.fetchById(clientField.id);
ZDK.Page.getField("Language").setValue(clientRec.Language);
ZDK.Page.getField("Phone").setValue(clientRec.Phone);
}
Trigger: Field onChange: Client
Formål: Trækker adressen (Street, Street 2, Postal Code, City, Country) fra Client og udfylder Booking-adressefelter.
client_data = ZDK.Apps.CRM.Leads.fetchById(value.id);
ZDK.Page.getField("Address").setValue(client_data.Street);
ZDK.Page.getField("Postal_Code").setValue(client_data.Zip_Code);
ZDK.Page.getField("City").setValue(client_data.City);
ZDK.Page.getField("Country").setValue(client_data.Country);
Trigger: Field onChange: Client
Formål: Bygger Booking Name som "Efternavn Fornavn, Destination, Måned Ã…r" ved valg af kunde.
Trigger: Field onChange: Departure Date
Formål: Genopbygger Booking Name med ny måned/år når afrejsedato ændres. Hvis navnet allerede har 3 dele bevares destination.
let parts = depDateField.split("-");
let date = new Date(parseInt(parts[2],10), parseInt(parts[1],10)-1, parseInt(parts[0],10));
monthYear = date.toLocaleDateString('en-US', { month: 'long', year: 'numeric' });
Trigger: Field onChange: Destination
Formål: Tvinger destinationsfeltet til store bogstaver.
var upperValue = value.toUpperCase();
ZDK.Page.getField("Dest").setValue(upperValue);
Trigger: Field onChange: Destination
Formål: Opdaterer Booking Name med ny destination i samme format.
Trigger: Page onLoad
Formål: Gør Booking Name read-only og forudfylder navnet med "Efternavn Fornavn" hvis Client allerede er valgt.
ZDK.Page.getField("Deal_Name").setReadOnly(true);
let clientField = ZDK.Page.getField("Kunde").getValue();
if (clientField != null) {
let eventRec = ZDK.Apps.CRM.Leads.fetchById(clientField.id);
bookingName = eventRec.Last_Name + " " + eventRec.First_Name;
ZDK.Page.getField("Deal_Name").setValue(bookingName);
}
Trigger: Page onLoad
Formål: Låser Language, Phone, Client Number, Mobile og Email som read-only og henter værdier fra Client.
Trigger: Page onLoad (og onChange på PNR-felter)
Formål: Progressiv disclosure - viser kun næste PNR-felt når alle foregående er udfyldt. Op til 10 PNR-felter. Genbruges på Clone/Edit/Detail.
for (var i = 1; i < fields.length; i++) {
var show = true;
for (var j = 0; j < i; j++) {
var val = ZDK.Page.getField(fields[j]).getValue();
if (!val || !String(val).trim()) { show = false; break; }
}
setVis(fields[i], show);
}
Trigger: Page onLoad
Formål: Sætter checkbox "Hide Sections" til true ved oprettelse, så avancerede sektioner skjules på nye records. Clone/Edit/Detail sætter den til false.
Bookings - Clone Page
Disse scripts er identiske med dem på Edit Page (samme implementation deles). Forskellen ift. Create Page er at Booking Name ikke overskrives hvis det allerede afviger fra klientnavnet, og "Hide Sections" sættes til false så alle sektioner vises.
Bookings - Edit Page
De 5 scripts (Map Client Data, Set Booking Name DepDate, Set Booking Name Dest, Set Readonly Fields, Show PNR Fields onChange + onLoad, Show Sections On Load) er installeret i samme version som på Clone Page.
Bookings - Detail Page
Trigger: Page onLoad
Formål: Låser Client Number på detaljebilledet.
Trigger: Page onLoad
Formål: Skjuler tomme PNR_2..PNR_10 - viser kun de udfyldte plus næste tomme.
Clients - Create Page
Trigger: Field onChange: Postal Code
Formål: Slår postnummer op i indlejret tabel (Danmark, Færøerne, Grønland) og udfylder City + Country automatisk.
if (zipCodeMap[zipCode] != null) {
cityField.setValue(zipCodeMap[zipCode]);
if (zipCode >= 3900 && zipCode <= 3999 || zipCode == 2412) {
countryField.setValue("Grønland");
} else if (zipCode >= 100 && zipCode <= 970) {
countryField.setValue("Færøerne");
} else {
countryField.setValue("Danmark");
}
}
Trigger: Page onLoad
Formål: Skjuler subform-kolonnerne i "Rejseudstyr" + styre-checkboxen ved oprettelse.
Trigger: Page onLoad
Formål: Sætter Country = "Denmark" som default.
Generate Invoices - Create Page
Trigger: Field onChange: Offer / Page onLoad (læser offer_id fra URL)
Formål: Henter Total Amount og valuta fra Offer; slår Booking og Client op via Offer -> Deal -> Lead; forudfylder faktureringsplanen i subform "Invoices To Generate".
if (diff_days < 61) {
ZDK.Page.getSubform("Invoices_to_Generate").setValues([{
"Percentage": 100, "Amount": grand_total,
"Due_Date": today_plus_4_formatted, "Type": "Full payment"
}]);
} else {
ZDK.Page.getSubform("Invoices_to_Generate").setValues([
{ "Percentage": 30, "Amount": grand_total * 0.3,
"Due_Date": today_plus_4_formatted, "Type": "Deposit" },
{ "Percentage": 70, "Amount": grand_total * 0.7,
"Due_Date": dep_minus_61_formatted, "Type": "Remaining balance" }
]);
}
Trigger: Page onLoad
Formål: Verificerer at brugerens datoformat er "DD-MM-YYYY". Hvis ikke, vises advarsel og brugeren sendes tilbage.
Trigger: Page onLoad
Formål: Låser Total Amount, Booking, Client og Departure Date - værdier kommer fra Offer/Booking.
Trigger: Page onSave
Formål: Hardvalidering - blokerer gem hvis Balance != 0.
balance = ZDK.Page.getField("Balance").getValue();
if (balance != 0) {
ZDK.Client.showMessage('The balance must be 0. If you need to invoice another amount, please go back and update your Offer accordingly :)', { type: 'error' });
return false;
}
return true;
Trigger: Subform onCellChange: Percentage / Amount
Formål: Holder Amount og Percentage synkroniseret; justerer den anden række så summen rammer Total Amount (balance = 0). Bruger Updating Flag for at undgå loop.
Trigger: Subform onCellChange (ny række)
Formål: Sætter Type til "Installment" automatisk for tilføjede rækker.
Generate Invoices - Detail Page
Trigger: Page onLoad
Formål: Detaljebilledet skal ikke ses - brugeren sendes straks tilbage til det relaterede Offer.
offer_id = ZDK.Page.getField("Offer").getValue().id.toString();
ZDK.Client.navigateTo('record_detail', { module: 'Offers', record_id: offer_id }, '_self');
Manuel Customer Payment - Create Page (Wizard)
Trigger: Field onChange: Booking
Formål: Når Booking vælges og Client er tom, hentes Client fra Booking automatisk.
Trigger: Field onChange: Currency
Formål: Viser advarsel om at beløb angives i valgte valuta selvom feltnavnet er "Amount (DKK)".
Trigger: Field onChange: Invoice
Formål: Henter Booking, Offer og Grand Total fra Invoice og udfylder på betalingen.
Trigger: Wizard onLoad
Formål: Validerer brugerens datoformat (DD-MM-YYYY) - omdirigerer ved fejl.
Trigger: Wizard onLoad
Formål: Forudfylder Payment Type = "Payment from Client" (låset), Paid Date = i dag, låser Approval Stages.
Offers - Detail Page (Canvas)
Trigger: Page onLoad
Formål: Hvis Offer Stage = "Invoiced" aktiveres "Payables"-tabben automatisk ved load.
stage = ZDK.Page.getField("Stage").getValue();
if (stage == "Invoiced") {
ZDK.UI.getElementByID("payables_tab").setActive();
}
Payments - Create Page
Trigger: Field onChange: Currency
Formål: Samme advarsel som i Wizard-versionen om feltlabel-vs-værdi.
Trigger: Field onChange: Invoice
Formål: Henter Grand Total fra Invoice og kopierer til Amount.
Trigger: Field onChange: Offer (og onLoad fra URL-parameter)
Formål: Slår Booking og Client op via Offer -> Deal -> Lead.
Trigger: Field onChange: Payment Type
Formål: Tvinger Payment Type tilbage til "Credit Note" - manuel oprettelse er kun tilladt for kreditnotaer.
ZDK.Page.getField("Payment_Type").setValue("Credit Note");
ZDK.Client.showAlert('Payments must come through appendix uploads. Users are only allowed to use this module for Credit Note creation.', 'Automatic flows are in progress..', 'Got it!');
Trigger: Page onLoad
Formål: Skjuler Appendix Number og VAT/Moms; låser Offer, Booking, Client. Hvis Payment Type = Credit Note: gør Invoice/Amount/Paid Date obligatoriske.
Payments - Detail Page
Trigger: Blueprint beforeTransition
Formål: Hvis transition-navn indeholder "USD" eller "EUR" kaldes server-funktionen "GetFXRate" og kursen gemmes på record.
var name = transition.name.toUpperCase();
if (name.includes("USD")) {
var get_fx_rate = ZDK.Apps.CRM.Functions.execute("GetFXRate", { "currency": "USD", "date": null });
record_data.USD_to_DKK_Exchange_Rate = get_fx_rate.details.output;
record_data.__update();
}
Trigger: Field onBeforeUpdate: Bank Account
Formål: Advarer om at browseren skal refreshes så bagvedliggende beregninger genkøres.
Trigger: Page onLoad
Formål: Hvis Amount Currency er tom, gøres feltet skrivbart så det kan udfyldes under godkendelse.
Products - Create Page
Trigger: Field onChange + onType: Product Code, Product Name
Formål: Tvinger Product Code og Product Name til store bogstaver bade mens brugeren skriver og efter indtastning.
Suppliers - Create Page
Trigger: Field onChange + onType: Supplier Code, Supplier Name
Formål: Tvinger Supplier Code og Supplier Name til store bogstaver.
6. Workflows
Workflow-regler grupperet pr. modul og dernæst pr. trigger-type. Farvekodning:
- Opret = Ved Oprettelse
- Rediger = Ved Redigering
- Begge = Ved Oprettelse ELLER Redigering
- Scheduled = Tidsbaseret
- Disabled = Deaktiveret regel
Bookings
Ved Oprettelse
Betingelse: Mindst ét af PNR, PNR 02 ... PNR 10 er udfyldt.
Handling: Custom Function (Hent PNR Info) - kalder Amadeus og udfylder passager- og fly-subforms.
Betingelse: Alle bookings.
Handling: Custom Function (Overfør bemærkninger) - kopierer klientens Remarks til bookingen.
Betingelse: Client IS NOT EMPTY AND Street IS EMPTY.
Handling: Custom Function (Kopier adresse fra klient).
Betingelse: Workdrive ID IS EMPTY.
Handling: Custom Function (Opret booking Workdrive-mappe) - opretter dedikeret mappe og gemmer ID.
Betingelse: Kondition ikke synlig i materialet.
Handling: 1 action - sandsynligvis Custom Function der samler infotekstfelter.
Handling: Sætter standardiseret booking-navn ud fra klient, destination og dato.
Handling: Custom Function (Sæt Salgstype) - vurderer Nysalg / Gensalg ud fra klientens tidligere rejser.
Handling: Custom Function (EU-tjek på lufthavnsdatabase) - slår destination op i Zoho Sheet og sætter Traveling within EU.
Ved Redigering
Trigger: Når PNR, PNR 02, 03, 04 eller 05 ændres.
Handling: Custom Function (Hent PNR Info).
Trigger: Når PNR 06, 07, 08, 09 eller 10 ændres.
Handling: Custom Function (Hent PNR Info). Reglen er splittet fra PNR Info 1 pga. Zohos grænse for trigger-felter.
Trigger: Når Safari Portal ID ændres.
Handling:
- Hvis ID IS NOT EMPTY: Field Update - sæt SP url
- Hvis ID IS EMPTY: Field Update - nulstil SP url
Trigger: Når Client ændres.
Handling: Custom Function (Kopier adresse fra klient) - genkopierer adressen.
Handling: Opdaterer booking-navnet når relevante felter ændres.
Handling: Custom Function (Forhindre manuelle Stage-skift) - hvis bruger uden for whitelist sætter Stage = Confirmed/Traveling/Completed, rulles ændringen tilbage og notifikationsmail sendes.
Handling: Field Update der sætter Salgstype-feltet. Navnet "TEMP_" indikerer at det er en midlertidig hjælperegel - kandidat til oprydning.
Handling: 2 actions - opdaterer EU-flag når destination eller relaterede felter ændres.
Handling: Field Update - flytter tabte bookings til Archived-stadiet.
Ved Oprettelse ELLER Redigering
Betingelse: Client IS NOT EMPTY.
Handling: Custom Function (Sæt Klient ID som tekst) - skriver lookup-ID som tekst på bookingen til brug i Mail Merge.
Scheduled
Trigger: 10 dage før Departure Date, 08:00.
Betingelse: Stage NOT IN (Leads, Planning, Lost, Archived) AND Owner != 80days.
Handling: Opret Task "Contact customer at destination".
Trigger: 1 dag efter Departure Date. Opfølgningsopgave dagen efter ankomst.
Trigger: Hhv. 30, 28, 14 og 7 dage før Departure Date.
Handling: Opretter forberedelses- og slutbetalingsopgaver i optakten til afrejse.
Trigger: På Departure Date.
Handling: Field Update Stage = "Traveling". Bemærk: trigger kun aktiv hvis stadiet i forvejen er Confirmed.
Trigger: På Last Time2 (hjemkomst).
Handling: Follow-up opgave til ejer.
Trigger: På Last Time2.
Handling: Field Update Stage = "Completed". Trigger virker kun hvis stadiet er Confirmed eller Traveling.
Trigger: Rollup Summary fields modified.
Handling: Custom Function (Genberegn økonomi-felter på Booking) - kalder ned i standalone.CalcFinanceFields. Lead Time-beregningen sker via Custom Function (Beregn lead time).
Clients
Ved Redigering
Trigger: Newsletter checkbox tilvalgt.
Handling: Email Notification (Add Client To Newsletter).
Trigger: Street, Street 2, Postal Code, City eller Country ændres.
Handling: Custom Function (Push adresse til relaterede records) - skubber adressen ud på alle relaterede Bookings og Invoices.
Scheduled
Trigger: 120 dage efter Most Recent Offer, 06:00.
Betingelse: Client Status IS Active AND Client Owner IS NOT Rikkey.
Handling: Opret Task "Client ${name} - 120 days since last activity".
Offers
Ved Oprettelse ELLER Redigering
Betingelse: Workdrive ID IS EMPTY.
Handling: Custom Function (Opret Workdrive-mappestruktur til tilbud) - opretter offer-undermappe + "Scannet af AI"-undermappe.
Handling: Custom Function (Opdater fakturabeskrivelse på fakturaer) - itererer alle tilknyttede Invoices og opdaterer Offer Description-feltet.
Betingelse: Booking ID IS EMPTY.
Handling: Custom Function (Synkroniser Booking-nummer til Offer).
Ved Redigering
Betingelse: Offer Stage IS "In Order" eller "Issued".
Handling: Custom Function (Opret/opdater Supplier Payables) - opretter én Payable pr. leverandør på tilbuddet.
Scheduled (Rollup Summary)
Trigger: Rollup-felter ændres: Total Cost, Paid to Suppliers, Total Invoiced, Amount Paid by Client, Total Credited.
Handling: Alle fem regler kalder samme Custom Function (Genberegn økonomi-felter på tilbud) - et "fan-in"-mønster der konsoliderer rollup-driven recalc.
Invoices
Ved Oprettelse
Betingelse: Booking Name IS EMPTY.
Handling: Custom Function (Hent booking fra tilbud) - finder bookingen via Offer og sætter Booking Name. Hvis bookingens Stage = Planning eller Leads, rykkes den automatisk til Confirmed.
Betingelse: Due Date IS EMPTY.
Handling: Custom Function (Fakturadato + 10 dage).
Handling: Custom Function (Bogfør kundefaktura i e-conomic) - opretter journal 4-postering med PDF-bilag fra Mail Merge.
Ved Redigering
Betingelse: Reminder Task ændres til "selected". Filter: Invoice Owner IS NOT 80days.
Handling: Opret Task "Invoice is not sent?".
Ved Oprettelse ELLER Redigering
Handling: Custom Function (Hent fuldt beløb fra tilbud) - sætter Full Amount-feltet fra Offer-totalen.
Scheduled (Rollup Summary)
Trigger: Amount Paid (Rollup) modificeres.
Handling: Custom Function (Skift status til Betalt / Partially Paid) - sammenligner Amount Paid mod Grand Total.
Payments
Ved Oprettelse
Betingelse: Payment Type = "Payment to Supplier" AND Payment Status = "Paid".
Handling: Custom Function (Opret FX gevinst/tab-record) - kladde, hardcoded test-ID.
Betingelse: Offer IS NOT EMPTY AND Supplier IS NOT EMPTY AND Supplier Payable IS EMPTY.
Handling: Custom Function (Auto-remap betaling til korrekt Supplier Payable).
Betingelse: Payment Type = "Credit Note".
Handling: Custom Function (Markér faktura som krediteret).
Betingelse: Payment Type = "Credit Note".
Handling: Custom Function (Generer kreditnota PDF via Mail Merge).
Handling: Custom Function (Bogfør kundebetaling i e-conomic).
Handling: Email Notification til Lotte om ny kreditnota.
Handling: Custom Function der henter felter fra det tilknyttede tilbud.
Ved Redigering
Trigger: Bank Account ændres.
Handling: Custom Function (Match valuta mod bankkonto og send Proof of Payment).
Trigger: Supplier eller Offer ændres.
Handling: Custom Function (Auto-remap betaling til korrekt Supplier Payable).
Trigger: Supplier Payable ændres.
Handling: Custom Function (Auto-beløb hvis tomt).
Trigger: Amount (Currency) ændres.
Handling: Custom Function (Genberegn DKK-beløb via Payable-kurs).
Trigger: Offer ændres.
Handling: Custom Function (Udled booking og klient fra tilbud).
Scheduled
Trigger: 4 timer efter Created Time.
Betingelse: Approval Stages = "To be reviewed" AND Payment Type = "Payment to Supplier".
Handling: Email Notification (Review Transaction) + opret Task "Review Transaction No. ${trans_no}".
Generate Invoices
Ved Oprettelse
Handling:
- Field Update: Sæt tilhørende Offer til "Invoiced".
- Custom Function (Generer fakturaer): opretter de faktiske Invoice-records ud fra subform "Invoices to Generate", sætter moms proportionalt, og sletter til sidst Generate-recorden.
Supplier Payables
Ved Redigering
Trigger: Balance <= DKK 0,00.
Handling: Field Update Status = "Paid in Full".
Scheduled (Rollup Summary)
Trigger: Paid Amount (Rollup) ændres.
Handling: Custom Function (Genberegn balance og status på Supplier Payable) - sætter Status til Pending Payment / Partially Paid / Paid in Full afhængigt af forholdet.
Tasks
Ved Oprettelse
Betingelse: Due Date IS EMPTY.
Handling: Field Update - sæt Due Date = i dag.
Handling: Custom Function (Udfyld klientnavn og afgangsdato på Task) - henter felter fra parent record så de er synlige i task-listen.
7. Aktivitetsmoduler
Standard Zoho-moduler tilpasset til 80days. Disse tre moduler bruges på tværs af Bookings, Offers, Invoices og Payments via det polymorfe Related To-felt.
Opgaver (Tasks)
Standard Zoho Tasks-modul. Tilpasset 80days med klientnavn og afrejsedato så man kan filtrere på rejserelaterede opgaver i listevisninger og kalendere. Mange opgaver oprettes automatisk via Bookings' scheduled workflows (30/28/14/7 dage før afrejse, dagen efter, hjemkomst).
Task Information
| Felt | Type | Beskrivelse |
|---|---|---|
| Task Owner | User | Ansvarlig medarbejder |
| Subject | Single Line | Opgavens emne |
| Due Date | Date | Forfaldsdato (default = i dag hvis ikke angivet) |
| Contact Name | Lookup | Standard kontakt-lookup |
| Related To | Lookup (polymorft) | Booking / Offer / Invoice mv. |
| Client Name | Single Line | Kundenavn (tekstkopi - udfyldes via Custom Function) |
| Departure Date | Date | Afrejsedato (kopieret fra parent record) |
| Status | Picklist | Not Started / In Progress / Completed mv. |
| Priority | Picklist | Prioritet |
| Repeat | Single Line | Gentagelsesregel |
| Closed Time | Date/Time | Tidspunkt for lukning |
Description Information
| Felt | Type | Beskrivelse |
|---|---|---|
| Description | Multi-Line | Beskrivelse |
| TravelWire ID | Single Line (Unique) | Migrationsreference |
Systemfelter
Task Owner, Created By, Modified By, Closed Time.
Møder (Meetings)
Standard Zoho Events-modul. Bruges til at planlægge møder med klienter og leverandører - online via Zoom/Teams eller fysisk på kontoret.
Meeting Information
| Felt | Type | Beskrivelse |
|---|---|---|
| Title | Single Line | Mødets titel |
| Meeting Venue | Picklist | Type af møde (online, på kontoret mv.) |
| Location | Single Line | Fysisk eller virtuel adresse |
| Provider | Picklist | Online-mødeudbyder (Zoom, Teams mv.) |
| All day | Checkbox | Heldagsbegivenhed |
| From | Date/Time | Start |
| To | Date/Time | Slut |
| Host | User | Vært (svarer til Owner) |
| Related To | Lookup (polymorft) | Relateret record |
| Participants | Single Line | Deltagere |
| Participants Reminder | Single Line | Påmindelse til deltagere |
Meeting Additional Information
| Felt | Type | Beskrivelse |
|---|---|---|
| Description | Multi-Line | Beskrivelse |
| Repeat | Single Line | Gentagelse |
| Reminder | Single Line | Påmindelse |
Opkald (Calls)
Standard Zoho Calls-modul. Logger ind- og udgående telefonsamtaler med klienter og leverandører. Bruger conditional sections der vises eller skjules afhængigt af Call Type.
Call Information
| Felt | Type | Beskrivelse |
|---|---|---|
| Contact Name | Lookup | Kontaktperson opkaldet vedrører |
| Related To | Lookup (polymorft) | Relateret record (Booking/Offer mv.) |
| Call Type | Picklist | Outbound / Inbound / Missed |
| Outgoing Call Status | Picklist | Status på udgående opkald |
| Call Start Time | Date/Time | Start-tidspunkt |
| Call Duration | Single Line | Varighed |
| Call Owner | User | Den der ringede |
| Subject | Single Line | Emne |
| Voice Recording | URL | Link til lydoptagelse |
Purpose Of Outgoing Call (Conditional)
| Felt | Type | Beskrivelse |
|---|---|---|
| Call Purpose | Picklist | Formål med opkaldet |
| Call Agenda | Single Line | Agenda |
Outcome Of Outgoing Call (Conditional)
| Felt | Type | Beskrivelse |
|---|---|---|
| Call Result | Picklist | Resultat |
| Description | Multi-Line | Beskrivelse af samtalen |
Reason For Incoming Call (Conditional)
| Felt | Type | Beskrivelse |
|---|---|---|
| Description | Multi-Line | Beskrivelse af det indkommende opkald |
Sektionerne "Purpose / Outcome / Reason" styres via conditional layout og vises baseret på Call Type og Outgoing Call Status.
Booking Stages
Booking-recordens stadie-flow er det centrale styringsmønster i hele systemet. Happy path: Lead -> Planning -> Confirmed -> Traveling -> Completed. Side-spor er Lost og Archived.
| Stadie | Betydning | Automation |
|---|---|---|
| Lead | Ny booking, ikke bekræftet endnu | Ingen |
| Planning | Tilbud er under udarbejdelse | Ingen |
| Confirmed | Kunden har bekræftet rejsen og første faktura er udstedt | Sættes automatisk når "Create Invoices" trykkes på ét af bookingens Offers |
| Traveling | Kunden er på rejse | Sættes når Departure Date rammes - kræver at stadiet i forvejen er "Confirmed" |
| Completed | Rejsen er slut og kunden er hjemme | Sættes når sidste Time2 i Flight Information rammes - kræver at stadiet er "Confirmed" eller "Traveling" |
| Lost | Kunden har sagt nej | Manuel - kræver Lost Reason på tilbuddet |
| Archived | Arkiveret | Manuel |
Offer Stages
| Stadie | Betydning | Automation |
|---|---|---|
| Quotation | Nyt tilbud, stadig kladde (tæller ikke med i statistik) | Ingen |
| In Order | Tilbuddet vi tror mest på | Ingen - rent visuelt |
| Issued | Kunden har bekræftet rejsen og fakturaen er udstedt | Sættes automatisk når "Create Invoices"-knappen trykkes. Record læses via Record Locking efter dette punkt. |
| Cancelled | Kunden har sagt nej | Manuel |
| Inactive | Arkiveret tilbud | Manuel |
Supplier Payable Status
| Status | Betydning | Automation |
|---|---|---|
| Pending Payment | SP oprettet, ingen betalinger registreret | Ingen |
| Partially Paid | Leverandør delvist betalt | Sættes automatisk ved første betaling hvis beløb < Quoted Amount. Må gerne sættes manuelt til Paid in Full ved kursdifferencer. |
| Paid in Full | Fuldt betalt | Sættes automatisk når Paid Amount >= Quoted Amount |
| Cancelled | SP annulleret (leverandør trukket sig efter fakturering) | Manuel |