CRM Dokumentation

For those who seek the ultimate escape
For those who seek the ultimate escape

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.

12
Moduler
8
Integrationer
87
Custom Functions
47
Workflows
36
Client Scripts

Vælg en sektion

Tilbage til forside

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

ModulTypeFormål
ClientsCustomKundestamdata. Bygger på Zohos Leads-modul, men records konverteres aldrig - Contacts-modulet er fjernet.
BookingsCustomDen centrale rejsesag. Bygger på Zohos Deals-modul. Indeholder PNR, finans-rollups, passager- og flyinformation.
OffersCustomTilbud knyttet til en Booking. En Booking kan have flere Offers. Har egen Canvas-view med taps for Offer Builder, Finance, Transactions m.m.
Generate InvoicesCustomHjælpemodul der fra et Offer opretter en række planlagte fakturaer (depositum, slutfaktura). Recorden sletter sig selv efter generering.
InvoicesCustomKundefakturaer. Oprettes altid med én varelinje så kunden ikke ser beregningsgrundlaget. Synkroniseres til e-conomic.
PaymentsCustomUniversel transaktionspost for bade kundeindbetalinger og leverandørudbetalinger. Linker simultant til Client, Supplier, Offer, Booking, Invoice og Supplier Payable.
SuppliersCustomLeverandørstamdata. Bygger på Zohos Vendors-modul.
Supplier PayablesCustomAggregeret leverandørgæld pr. kombination af Offer + Supplier + valuta. Oprettes automatisk når et Offer vindes.
ProductsCustomKatalog over rejseprodukter (fly, hoteller, transfers, oplevelser) som bruges som linjevarer i Offers.
TasksStandardOpgaver. Tilpasset med Client Name og Departure Date til at understøtte rejserelaterede påmindelser.
MeetingsStandardKalenderbegivenheder (Zoho Events). Anvendes til møder med klienter og leverandører.
CallsStandardTelefonopkaldslog. 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:

  1. En Client oprettes (eller findes), og en Booking oprettes som det centrale rejseunderlag.
  2. Et eller flere Offers udarbejdes i Quotation-stadiet. Det Offer kunden hælder mest mod sættes til In Order.
  3. 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.
  4. 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.
  5. Fakturaer markeres som "Sendt til kunden" -> automatisk sync til e-conomic. Selve bogføringen i e-conomic er manuel.
  6. Kunden betaler. Indbetalingen registreres i Payments enten enkeltvis eller via bank-CSV (uploadet til WorkDrive > Posteringer).
  7. Leverandøren betales. Medarbejder uploader bilaget; betaling godkendes via knappen "Register Payment - DKK" / "Mark as Booked" -> bogføres i e-conomic Kreditorfil.
  8. 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.
Betalingsbetingelser: Hvis der er mindre end 61 dage til afrejse, faktureres 100% straks. Ellers 30% depositum nu + 70% saldo 61 dage før afrejse. Logikken er implementeret i Client Script Get Info From OfferGenerate Invoices.
Tilbage til forside

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 modulFeltTypeTil modulForklaring
BookingsClientLookupClientsDen primære kunde på bookingen
OffersBookingLookupBookingsBookingen tilbuddet hører til
OffersClientLookupClientsKunden tilbuddet er rettet til (dobbelt-link via Booking)
Offers (subform)Product NameLookupProductsProdukt valgt på Offered Items-linjen
Offers (subform)SupplierLookupSuppliersLeverandør på Offered Items-linjen
InvoicesOfferLookupOffersTilbuddet fakturaen er beregnet ud fra
InvoicesBooking NameLookupBookingsBookingen fakturaen hører til
InvoicesClientLookupClientsKunden der faktureres
Invoices (subform)Product NameLookupProductsLinjevare (typisk én linje pr. faktura)
Generate InvoicesBookingLookupBookingsBookingen der genereres fakturaer for
Generate InvoicesOfferLookupOffersTilbuddet der danner grundlag
Generate InvoicesClientLookupClientsKunden
Supplier PayablesSupplierLookupSuppliersLeverandøren der skal betales
Supplier PayablesOfferLookupOffersDet tilbud betalingen knyttes til
PaymentsClientLookupClientsTilknyttet kunde
PaymentsSupplierLookupSuppliersTilknyttet leverandør
PaymentsOfferLookupOffersTilknyttet tilbud
PaymentsBookingLookupBookingsTilknyttet booking
PaymentsInvoiceLookupInvoicesTilknyttet faktura (ved kundeindbetaling)
PaymentsSupplier PayableLookupSupplier PayablesLeverandørgæld der afregnes
ClientsAssociated withLookup (selv)ClientsSelvreference til relateret kunde (ægtefælle/familie)
Clients (subform)OptionLookupProductsRejseudstyr kunden ejer (subform Travel Equipment)
ProductsSuppliersMulti-Select LookupSuppliersLeverandører der leverer produktet
SuppliersProductsMulti-Select LookupProductsProdukter leverandøren tilbyder (symmetrisk)
TasksRelated ToLookup (polymorft)Bookings / Offers / Invoices m.fl.Standard Zoho-relateret-til-felt
CallsRelated ToLookup (polymorft)Bookings / Offers m.fl.Standard Zoho-relateret-til-felt
MeetingsRelated ToLookup (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å modulFeltAggregerer fraBeregning
BookingsTotal Paid by ClientPaymentsSUM af kundeindbetalinger på bookingen
BookingsEstimated Cost / Estimated VAT / Estimated DBOffersSUM af tilbudsfelter
BookingsInvoiced Total Incl VATInvoicesSUM af fakturatotal
BookingsEarliest Invoice DateInvoicesMIN af Invoice Date
OffersTotal InvoicedInvoicesSUM af fakturatotal
OffersTotal CreditedInvoicesSUM hvor status = Credited
OffersAmount Paid by ClientPaymentsSUM af kundebetalinger
OffersFX Gain/LossPaymentsSUM af FX-differencer
InvoicesAmount PaidPaymentsSUM af tilknyttede betalinger
Supplier PayablesPaid AmountPaymentsSUM af leverandørbetalinger (DKK)
Supplier PayablesPaid Amount (Currency)PaymentsSUM i lokal valuta
ClientsMost Recent OfferOffersMAX af Offer-dato
ClientsEarliest First TripBookingsMIN af Departure Date
ClientsNext Upcoming Confirmed BookingBookingsMIN af Departure Date for Confirmed
Hub-rolle: Payments har Lookup til seks moduler samtidigt og er det eneste sted hvor man kan se det fulde transaktionsbillede. Dette gør Payments til det centrale auditeringspunkt for finans-flows.
Tilbage til forside

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 =.

TypeEndpointFaste felterDynamiske 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.

OperationEndpointTjek-felterOpdaterer 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.

OperationEndpointBeskrivelse
Hent PNRPOST https://api.farewise.dk/v30/flight/pnr/getSender 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 ID på Booking.
      • [Offer Number]/ - oprettet ved Offer-oprettelse. ID på Offer.
        • Scannet af AI/ - undermappe til AI-processerede bilag.
  • Posteringer/ - upload-zone for bank-CSV. CSV trigger automatisk oprettelse af Payment-records i Review Queue.
OperationBrugt fraBeskrivelse
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, fane Airports.
  • 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..., fane CRM 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).

EndpointModelFelter
POST https://api.openai.com/v1/responsesgpt-5.4, temperature 0, max 500 tokensReturnerer 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.

TemplateBrugt fraOutput
Invoice PDF - Danish / EnglishKnap "Download faktura som PDF" på InvoiceFaktura_[invoice_no]_[booking_no].pdf -> WorkDrive
Offer PDF - Danish / EnglishKnap "Download tilbud som PDF" på OfferTilbud_[offer_no]_[booking_no].pdf -> WorkDrive
Credit Note PDF - Danish / EnglishCustom 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
OperationEndpointBrugt fra
Sync leverandørPOST https://80days.zrm.dk/api/zoho/sync/vendor/{id}Knap "Synkronisér leverandør til webapp"
Sync produktPOST https://80days.zrm.dk/api/zoho/sync/product/{id}Knap "Synkronisér produkt til webapp"
Link produkt-leverandørPOST https://80days.zrm.dk/api/zoho/sync/product_supplierBegge sync-knapper
Hent FX-kursGET https://80days.zrm.dk/api/fx/currencyCustom Function (Auto-remap betaling) ved oprettelse af ny Supplier Payable
Kendt forsinkelse: Der kan gå op til 30 minutter fra et nyt produkt eller en supplier-tilknytning er oprettet i CRM, til det er tilgængeligt i Offer-builderen på webappen. Skyldes bagvedliggende cache/sync.
Tilbage til forside

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

FeltTypeBeskrivelse
First NameSingle Line (med Salutation)Fornavn med titel-prefix
Last NameSingle LineEfternavn
Mobile NoPhoneMobilnummer (valideres via Validation Rule mod telefonregler)
Phone NoPhoneFastnetnummer (valideres)
EmailEmail (Unique)Unik e-mailadresse
Client StatusPicklistAktiv / inaktiv mv.
Inactive ReasonPicklistÃ…rsag til inaktivering
NewsletterCheckboxTilmeldt nyhedsbrev (trigger Email Notification ved tilvalg)
Email Opt OutCheckboxFrabedt sig e-mails
RemarksMulti-LineGenerelle noter
Luggage TagsMulti-LineTekst til bagagemærker
Birth DateDateFødselsdato
AnniversaryDateMærkedag
Client NoAuto-NumberSystemgenereret kundenummer
LanguagePicklistForetrukket kommunikationssprog
Client SourcePicklistKilde til kunden
Associated withLookup -> ClientsSelvreference til relateret kunde (ægtefælle/familie)
Last PurchaseDate/TimeSidste købsdato
Most Recent OfferRollup Summary (DateTime)Dato for nyeste tilbud
Notes from TWMulti-LineImporterede noter fra Travelwire
Next Upcoming Confirmed BookingRollup Summary (Date)Næste kommende Confirmed-booking

Address Information

FeltTypeBeskrivelse
StreetSingle LineAdresse linje 1
Street 2Single LineAdresse linje 2
Postal CodeSingle LinePostnummer (trigger autofill af City/Country på danske numre)
ProvinceSingle LineRegion/provins
CitySingle LineBy
CountrySingle LineLand

Show Travel Equipment

FeltTypeBeskrivelse
Show Travel EquipmentCheckboxStyrer 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.

FeltTypeBeskrivelse
BW1, BW2, BW3Single LineTW-felter (oprindelig betydning bevaret)
Serendipia vol.Single LineTW-tekstfelt
RejsebegerSingle LineTW-tekstfelt
AndletSingle LineTW-tekstfelt
S1Single LineTW-tekstfelt
Mismo1 ... Mismo4Single LineTW-mismo-felter
NoteMulti-LineTW-note

Travel Equipment (Subform)

KolonneTypeBeskrivelse
OptionLookup -> ProductsHvilken type rejseudstyr
ValueNumberAntal/størrelse

Systemfelter

FeltTypeBeskrivelse
Client OwnerUserAnsvarlig medarbejder
Created BySingle LineOprettet af
Modified BySingle LineSidst ændret af
TravelWire IDSingle LineMigreret TW-reference
bookingPhoneCheckboxTelefon er booking-relevant
Earliest First TripRollup 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

FeltTypeBeskrivelse
Booking NoAuto-NumberSystemgenereret bookingnummer
Booking OwnerUserAnsvarlig sagsbehandler
Booking NameSingle LineVisningstitel - bygges automatisk som "Efternavn Fornavn, Destination, Måned Ã…r"
StagePicklistBooking-stadie - se stage-oversigten under Workflows
Travelwire StatusPicklistStatus overført fra Travelwire
Lost ReasonPicklistÃ…rsag hvis booking tabes
DestinationSingle LineDestination/IATA-kode - tvinges til store bogstaver via workflow
Traveling within EUCheckboxSættes automatisk via opslag i lufthavnsdatabasen
Departure DateDateAfrejsedato (trigger til auto-stadium "Traveling")
Travel TypePicklistRejsetype (privat, gruppe mv)
Luggage Tags TextMulti-LineFri tekst til bagagemærker

Contact Information

FeltTypeBeskrivelse
ClientLookup -> ClientsDen primære kunde
Client NoSingle LineKopi af kundens nummer (read-only)
Lead Source ChannelPicklistHvor leadet kom fra
MobilePhoneKontakt-mobil (read-only - synkroniseret fra Client)
PhonePhoneKontakt-fastnet (read-only)
EmailEmailKontakt-email (read-only)
LanguagePicklistForetrukket sprog (read-only)

Integration Fields

FeltTypeBeskrivelse
Safari Portal IDSingle LineReference til Safari Portal
PNR, PNR 02 ... PNR 10Single Line (10 felter)Passenger Name Records. Workflow trigger PNR-opslag via Amadeus. Felterne vises progressivt via Client Script.

Address

FeltTypeBeskrivelse
StreetSingle LineAdresse linje 1 - kopieres fra Client
Street 2Single LineAdresse linje 2
Postal CodeSingle LinePostnummer
CitySingle LineBy
CountrySingle LineLand
SalgstypePicklistNysalg 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).

FeltTypeBeskrivelse
Estimated CostRollup Summary (Currency)Estimerede omkostninger summeret fra Offers
Real CostRollup Summary (Currency)Faktiske leverandøromkostninger fra Payments
Cost DiffCurrencyDifferens mellem estimat og virkelighed
Estimated DBRollup Summary (Currency)Estimeret dækningsbidrag
Estimated DB %PercentEstimeret dækningsgrad
Real DB (Ex Real VAT)CurrencyRealiseret dækningsbidrag eksklusiv moms
Real DB %PercentRealiseret dækningsgrad
Invoiced Total Incl VATRollup Summary (Currency)Faktureret total inkl. moms
Invoiced Total Ex VATCurrencyFaktureret total eksklusiv moms
Estimated VATRollup Summary (Currency)Estimeret moms
Real VATCurrencyFaktisk moms (25% af DB hvis EU-rejse, ellers 0)
VAT DiffCurrencyMomsdifferens
Total Paid by ClientRollup Summary (Currency)Samlet kundeindbetaling
Outstanding BalanceCurrencyUdestående saldo (Invoiced minus Paid)

Finance (Migrated from Travelwire)

Historiske finansfelter migreret fra TW. Bevares som referencegrundlag.

FeltType
Invoice TotalCurrency
BalanceCurrency
Contribution AmountCurrency
Contribution MarginPercent

Booking Validation

FeltTypeBeskrivelse
Flight TicketsPicklistStatus på flybilletter
Luggage TagsPicklistStatus på bagagemærker
Cover LetterPicklistStatus på følgebrev
ItineraryPicklistStatus på rejseplan
Practical InformationPicklistStatus 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

FeltTypeBeskrivelse
Booking RemarksMulti-LineGenerelle noter - kopieres fra Client ved oprettelse

Hidden / System

FeltTypeBeskrivelse
SP url completionSingle LineSafari Portal URL-status
Lead TimeNumberDage fra oprettelse til afrejse
Workdrive IDSingle LineReference til WorkDrive-mappe
CurrencyPicklistValuta
Exchange RateDecimalValutakurs
Last Time2Date/TimeSeneste ankomsttid fra Flight Information
TravelWire IDSingle Line (Unique)Unik reference til migreret TW-post
Hide SectionsCheckboxStyrer skjul af sektioner i layout (Create=true, Edit=false)
Earliest Invoice DateRollup Summary (DateTime)Tidligste fakturadato
PasscountNumberAntal 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

FeltTypeBeskrivelse
Offer No.Auto-NumberSystemgenereret tilbudsnummer
Offer OwnerUserAnsvarlig konsulent
Offer StagePicklistQuotation -> In Order -> Issued (eller Cancelled / Inactive)
BookingLookup -> BookingsBookingen tilbuddet hører til
ClientLookup -> ClientsKunden tilbuddet er rettet til
DescriptionSingle LineKort beskrivelse
External RemarksMulti-LineEksterne bemærkninger (vises til kunde)
Internal RemarksMulti-LineInterne noter
RejsetypePicklistType rejse
Offer NoteRich TextLang formateret note

Offer Finance

FeltTypeBeskrivelse
CostCurrencySamlet kostpris
NetCurrencyNettoindtægt
Total CurrencySingle LineAktiv valuta for totalerne
Total Amount in CurrencyDecimalTotal 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

FeltTypeBeskrivelse
Inv. CurrencySingle LineFakturavaluta
Original RateDecimalOprindelig kurs
Exch. Rate (10 DKK)DecimalKurs pr. 10 DKK (typisk JPY)
Latest Saved RateDecimalSenest gemte kurs
Full Amount in CurrencyDecimalFuldt beløb i fremmedvaluta
Exch. DiffDecimalKursforskel
PercentagePercentProcentmæssig forskel

Finance Data

FeltTypeBeskrivelse
Total InvoicedRollup Summary (Currency)Faktureret total fra tilknyttede Invoices
Total CreditedRollup Summary (Currency)Krediteret total
Amount Paid by ClientRollup Summary (Currency)Indbetalt af kunde
Invoice BalanceCurrencyUdestående fakturasaldo
FX Gain/LossRollup 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.
Record Locking: Offers læses efter at være blevet Issued/Won via Record Locking Configuration, så et faktureret tilbud ikke kan ændres efterfølgende.

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

FeltTypeBeskrivelse
Generated Invoice NoAuto-NumberSystemgenereret nummer
BookingLookup -> BookingsBookingen der genereres fakturaer for (read-only)
OfferLookup -> OffersTilbuddet der danner grundlag
Departure DateDateAfrejsedato (kopieret, read-only)
ClientLookup -> ClientsKunden (read-only)
CurrencyPicklistValuta
Exchange RateDecimalKurs

Address Information

Street, Street 2, Postal Code, City, Country - alle kopieret fra Client/Booking.

Invoices to Generate (Subform)

KolonneTypeBeskrivelse
PercentagePercentAndel af samlet beløb
AmountCurrencyBeløb (auto-beregnes fra Percentage og vice versa)
Due DateDateForfaldsdato
TypePicklistDeposit / Remaining balance / Full payment / Installment

Aggregate fields: Invoiced Amount (SUM), Total Amount, Balance (Formula).

Default-faktureringsplan: Når et Offer vælges, forudfylder Client Script (Get Info From Offer) subformet:
  • 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).
Balance skal være 0 før record kan gemmes (valideret onSave).

System Information

FeltTypeBeskrivelse
Updating FlagCheckboxLå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

FeltTypeBeskrivelse
SubjectSingle LineFaktura-emne
Invoice NoAuto-NumberSystemgenereret fakturanummer
Invoice DateDateFakturadato
TypePicklistDeposit / Final / Credit / Installment
Due DateDateForfaldsdato (default = Invoice Date + 10 dage)
StatusPicklistIssued / Paid / Partially Paid / Credited / Sent / Migrated from TW
DespotdueDateDepositum-forfaldsdato
OfferLookup -> OffersTilbudet fakturaen hører til
Booking NameLookup -> BookingsBookingen fakturaen hører til
Booking NoSingle LineTekstkopi af bookingnummer
DepositCurrencyDepositumbeløb
CurrencyPicklistFakturavaluta
Exchange RateDecimalValutakurs
Client LanguageSingle LineSprog (bestemmer Mail Merge-template)
RemarksSingle LineKort bemærkning
Internal RemarksMulti-LineInterne noter
DescriptionMulti-LineFakturabeskrivelse (auto-opdateres fra Offer-beskrivelse via workflow)
Full AmountCurrencyFuldt fakturabeløb (hentet fra Offer)
Amount PaidRollup Summary (Currency)Indbetalt beløb fra Payments

Address Information

FeltTypeBeskrivelse
ClientLookup -> ClientsKunden der faktureres
Billing StreetSingle LineFaktureringsadresse linje 1
Billing Street 2Single LineFaktureringsadresse linje 2
Billing CitySingle LineBy
Billing CodeSingle LinePostnummer
Billing CountrySingle LineLand
ExtraSingle LineEkstra 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

FeltTypeBeskrivelse
Invoice OwnerUserAnsvarlig
Offer DescriptionMulti-LineKopi af tilbudsbeskrivelse (opdateres via workflow)
Reminder TaskCheckboxIndikerer at påmindelses-opgave er oprettet
TW StatusPicklistTravelwire-status
Net / Gross / BalanceCurrencyBeregnede totaler
TravelWire IDSingle LineMigrationsreference

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

FeltTypeBeskrivelse
Transaction NoAuto-NumberSystemgenereret transaktionsnummer
Payment TypePicklistPayment from Client / Payment to Supplier / Credit Note
Payment StatusPicklistBooked / Paid / Pending / Unpaid / To be reviewed mv.
Approval StagesPicklistBlueprint-stadie i godkendelsesflowet
Appendix Number (e-conomic)NumberBilagsnummer i e-conomic (sat af Custom Function ved bogføring)
InvoiceLookup -> InvoicesTilknyttet faktura (kundeindbetaling)
Supplier PayableLookup -> Supplier PayablesLeverandørgæld der afregnes
CurrencyPicklistTransaktionsvaluta
Transaction CurrencySingle LineValuta som 3-bogstavs tekst (valideres via regex)
Bank AccountPicklistBankkonto (synkroniseres dagligt fra e-conomic)
Amount (DKK)CurrencyBeløb i DKK
Amount (Currency)DecimalBeløb i transaktionsvaluta
Amount (EUR) / Amount (USD)NumberSpecifik EUR-/USD-beløb hvis relevant
EUR to DKK Exchange RateDecimalEUR-til-DKK-kurs
USD to DKK Exchange RateDecimalUSD-til-DKK-kurs
FX RateDecimalAktiv FX-kurs
Certainty RateNumberVurderingsfaktor
Paid DateDateBetalingsdato
Proof of PaymentFile UploadBilag for betaling
NoteMulti-LineFri tekst (auto-sammensættes fra Tekst + Indbetaler + Supp. tekst)
VAT / MomsCurrencyMoms
Booking NoSingle LineTekstkopi af bookingnummer
Credit Note StatusPicklistKreditnota-status
Supplier Inv. NoSingle LineLeverandørens fakturanummer
Card Type / PAN / Reciept NoSingle LineFelter fra kortbetalinger

Connected to

FeltTypeBeskrivelse
ClientLookup -> ClientsTilknyttet kunde
SupplierLookup -> SuppliersTilknyttet leverandør
OfferLookup -> OffersTilknyttet tilbud
BookingLookup -> BookingsTilknyttet booking

System Information

FeltTypeBeskrivelse
Currency MatchCheckboxMarkor for valuta-match med bankkonto
Workdrive File IDSingle LineWorkDrive-fil-reference
Paid in CurrencySingle LineBetalt i (valuta-tekst)
Tekst / Indbetaler / Supp. tekst til modtagerSingle/Multi-LineBankimport-felter
PoP SentCheckboxProof of Payment afsendt til leverandør
RETROFIT_SPCheckboxMarkor for retrofit Supplier Payables-link (migration)
TravelWire IDSingle Line (Unique)Migrationsreference
Manuel oprettelse begrænset: Client Script på Create-siden tvinger Payment Type til "Credit Note" - alle andre typer skal komme via automatiske flows (CSV-upload eller workflow på Invoice). Reverse Payment-knappen er kun synlig for Administrator / Finance.
Kendt UI-skævhed: Feltet "Amount (DKK)" skifter ikke navn når man vælger anden valuta, men værdien tolkes i valgte valuta. En popup advarer brugeren herom.

Suppliers

Leverandørstamdata. Bygger på Zohos Vendors-modul.

Supplier Information

FeltTypeBeskrivelse
Supplier NameSingle LineLeverandørens navn - tvinges til store bogstaver
NameSingle LineKontaktpersons navn
Supplier CodeSingle Line (Unique)Unik leverandørkode - tvinges til store bogstaver
EmailEmailEmail
PhonePhoneTelefon
FaxPhoneFax
Supplier ActiveCheckboxAktiv markering
ProductsMulti-Select Lookup -> ProductsProdukter denne leverandør leverer (symmetrisk relation)
Currency (CCY)PicklistForetrukken valuta
Payment MethodPicklistBetalingsmetode (bank, kort, andet)
RemarksSingle LineBemærkninger
TravelWire IDSingle LineMigrationsreference

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

FeltTypeBeskrivelse
Supplier PayableAuto-NumberSystemgenereret nummer
StatusPicklistPending Payment / Partially Paid / Paid in Full / Cancelled
SupplierLookup -> SuppliersLeverandøren der skal betales
OfferLookup -> OffersTilbuddet betalingen knyttes til
Cost CurrencySingle LineKostpris-valuta
Booked FX RateDecimalBogført valutakurs (bevares ved efterfølgende update)
Booked FX Rate DateDateDato for bogføringskursen

Payment Overview

FeltTypeBeskrivelse
Quoted AmountCurrencyTilbudt/forventet beløb til leverandør
Quoted Amount (Local)Formula (String)Visning i lokal valuta
Paid AmountRollup Summary (Currency)Allerede betalt beløb (DKK)
Paid Amount (Currency)Rollup Summary (Decimal)Betalt beløb i fremmedvaluta
BalanceCurrencyResterende saldo (Quoted minus Paid)
Reason for Diff.Single LineForklaring 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

FeltTypeBeskrivelse
Product NameSingle LineProduktets visningsnavn - tvinges til store bogstaver
Product CodeSingle Line (Unique)Unik produktkode - tvinges til store bogstaver
TypePicklistFly / hotel / transfer / oplevelse mv.
Product ActiveCheckboxAktiv markering
DescriptionMulti-LineBeskrivelse
HiddenCheckboxSkjul fra lister
CarrierPicklistFlyselskab/leverandør-paraply
City / City 2Single LinePrimær/sekundær by
WebLinkURLLink til leverandør-side
Debit TypePicklistBogføringskonto-type

Financial

FeltTypeBeskrivelse
VATCheckboxMomsbelagt
ccy.PicklistValuta
Sales acctPicklistSalgs-bogføringskonto
Cost acctPicklistOmkostnings-bogføringskonto
PriceCurrencyStandardpris

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).

Sync til 80days webapp: Knappen "Synkroniser produkt til webapp" pusher produktet og dets supplier-relations til 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.
Tilbage til forside

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

Map Client Data - OnChangeField onChange

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);
}
Address InformationField onChange

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);
Set Booking Name - ClientField onChange

Trigger: Field onChange: Client

Formål: Bygger Booking Name som "Efternavn Fornavn, Destination, Måned Ã…r" ved valg af kunde.

Set Booking Name - Departure DateField onChange

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' });
Destination In All CapsField onChange

Trigger: Field onChange: Destination

Formål: Tvinger destinationsfeltet til store bogstaver.

var upperValue = value.toUpperCase();
ZDK.Page.getField("Dest").setValue(upperValue);
Set Booking Name - DestinationField onChange

Trigger: Field onChange: Destination

Formål: Opdaterer Booking Name med ny destination i samme format.

Set Booking Name And Set As Read-OnlyPage onLoad

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);
}
Client Data Fields - LabelPage onLoad

Trigger: Page onLoad

Formål: Låser Language, Phone, Client Number, Mobile og Email som read-only og henter værdier fra Client.

Show PNR FieldsPage onLoad

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);
}
Hide Sections - OnLoadPage onLoad

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

Map Client Data, Set Booking Name (DepDate + Dest), Set Readonly Fields, Show PNR Fields, Show Sections On LoadGenbrug

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

Identisk med Clone PageGenbrug

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

Fields (Client Number readonly)Page onLoad

Trigger: Page onLoad

Formål: Låser Client Number på detaljebilledet.

Show PNR FieldsPage onLoad

Trigger: Page onLoad

Formål: Skjuler tomme PNR_2..PNR_10 - viser kun de udfyldte plus næste tomme.

Clients - Create Page

Autofill City From Postal CodeField onChange

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");
    }
}
Hide / Show Travel EquipmentPage onLoad

Trigger: Page onLoad

Formål: Skjuler subform-kolonnerne i "Rejseudstyr" + styre-checkboxen ved oprettelse.

Set Default FieldsPage onLoad

Trigger: Page onLoad

Formål: Sætter Country = "Denmark" som default.

Generate Invoices - Create Page

Get Info From Offer (onChange + onLoad)Field/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" }
    ]);
}
Check User SettingsPage onLoad

Trigger: Page onLoad

Formål: Verificerer at brugerens datoformat er "DD-MM-YYYY". Hvis ikke, vises advarsel og brugeren sendes tilbage.

Read-Only FieldsPage onLoad

Trigger: Page onLoad

Formål: Låser Total Amount, Booking, Client og Departure Date - værdier kommer fra Offer/Booking.

Balance Must Be 0Page onSave

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;
Adjusting Amounts (subform)Subform onCellChange

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.

New Row Is InstallmentSubform onCellChange

Trigger: Subform onCellChange (ny række)

Formål: Sætter Type til "Installment" automatisk for tilføjede rækker.

Generate Invoices - Detail Page

Redirect Back To OfferPage onLoad

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)

Booking Finds ClientField onChange

Trigger: Field onChange: Booking

Formål: Når Booking vælges og Client er tom, hentes Client fra Booking automatisk.

Currency InformationField onChange

Trigger: Field onChange: Currency

Formål: Viser advarsel om at beløb angives i valgte valuta selvom feltnavnet er "Amount (DKK)".

Pull Booking And Offer (from Invoice)Field onChange

Trigger: Field onChange: Invoice

Formål: Henter Booking, Offer og Grand Total fra Invoice og udfylder på betalingen.

Check User Settings (Wizard)Wizard onLoad

Trigger: Wizard onLoad

Formål: Validerer brugerens datoformat (DD-MM-YYYY) - omdirigerer ved fejl.

Default ValuesWizard onLoad

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)

Default TabPage onLoad

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

Currency Info MessageField onChange

Trigger: Field onChange: Currency

Formål: Samme advarsel som i Wizard-versionen om feltlabel-vs-værdi.

Pull Amount From InvoiceField onChange

Trigger: Field onChange: Invoice

Formål: Henter Grand Total fra Invoice og kopierer til Amount.

Pull Information From OfferField onChange / Page onLoad

Trigger: Field onChange: Offer (og onLoad fra URL-parameter)

Formål: Slår Booking og Client op via Offer -> Deal -> Lead.

Allow Only Credit NotesField onChange

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!');
Hide Fields And Read-Only FieldsPage onLoad

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

Get Rates (Blueprint Before Transition)Blueprint

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();
}
Bank Account On Before UpdateField onBeforeUpdate

Trigger: Field onBeforeUpdate: Bank Account

Formål: Advarer om at browseren skal refreshes så bagvedliggende beregninger genkøres.

Approval PagePage onLoad

Trigger: Page onLoad

Formål: Hvis Amount Currency er tom, gøres feltet skrivbart så det kan udfyldes under godkendelse.

Products - Create Page

Product Code + Product Name All Caps (onChange + onType)Field

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

Supplier Code + Supplier Name All Caps (onChange + onType)Field

Trigger: Field onChange + onType: Supplier Code, Supplier Name

Formål: Tvinger Supplier Code og Supplier Name til store bogstaver.

Tilbage til forside

6. Workflows

Workflow-regler grupperet pr. modul og dernæst pr. trigger-type. Farvekodning:

Bemærkning om kildemateriale: Workflow-PDF-eksporterne paginerede kun de første regler pr. modul. Resterende regler er identificeret via det samlede oversigtsbillede, hvor trigger-type og handlingstælling er kendt, men de detaljerede filter-betingelser kun kan udledes af reglens navn. Disse er markeret "kondition ikke synlig i materialet".

Bookings

Ved Oprettelse

PNR Info - CreateOpret

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.

Get RemarksOpret

Betingelse: Alle bookings.

Handling: Custom Function (Overfør bemærkninger) - kopierer klientens Remarks til bookingen.

Copy Address Information - CreateOpret

Betingelse: Client IS NOT EMPTY AND Street IS EMPTY.

Handling: Custom Function (Kopier adresse fra klient).

Opret Booking Workdrive-mappeOpret

Betingelse: Workdrive ID IS EMPTY.

Handling: Custom Function (Opret booking Workdrive-mappe) - opretter dedikeret mappe og gemmer ID.

Combine Info TextOpret

Betingelse: Kondition ikke synlig i materialet.

Handling: 1 action - sandsynligvis Custom Function der samler infotekstfelter.

Booking Name - CreateOpret

Handling: Sætter standardiseret booking-navn ud fra klient, destination og dato.

Booking RetentionOpret

Handling: Custom Function (Sæt Salgstype) - vurderer Nysalg / Gensalg ud fra klientens tidligere rejser.

Traveling in EU - CreateOpret

Handling: Custom Function (EU-tjek på lufthavnsdatabase) - slår destination op i Zoho Sheet og sætter Traveling within EU.

Ved Redigering

PNR Info 1 - Edit (PNR, PNR 02-05)Rediger

Trigger: Når PNR, PNR 02, 03, 04 eller 05 ændres.

Handling: Custom Function (Hent PNR Info).

PNR Info 2 - Edit (PNR 06-10)Rediger

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.

Update SP URLRediger

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
Copy Address Information - EditsRediger

Trigger: Når Client ændres.

Handling: Custom Function (Kopier adresse fra klient) - genkopierer adressen.

Booking Name - EditRediger

Handling: Opdaterer booking-navnet når relevante felter ændres.

Booking Stage CheckRediger

Handling: Custom Function (Forhindre manuelle Stage-skift) - hvis bruger uden for whitelist sætter Stage = Confirmed/Traveling/Completed, rulles ændringen tilbage og notifikationsmail sendes.

TEMP_set_salgs_typeRediger

Handling: Field Update der sætter Salgstype-feltet. Navnet "TEMP_" indikerer at det er en midlertidig hjælperegel - kandidat til oprydning.

Traveling in EU - EditRediger

Handling: 2 actions - opdaterer EU-flag når destination eller relaterede felter ændres.

Lost to ArchiveRediger

Handling: Field Update - flytter tabte bookings til Archived-stadiet.

Ved Oprettelse ELLER Redigering

Set Client IDBegge

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

AutoTask: Arrival Reminder - 10 days beforeDisabled

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".

AutoTask: Arrival Reminder - 1 day afterScheduled

Trigger: 1 dag efter Departure Date. Opfølgningsopgave dagen efter ankomst.

AutoTask: 30 / 28 / 14 / 7 days before departureScheduled

Trigger: Hhv. 30, 28, 14 og 7 dage før Departure Date.

Handling: Opretter forberedelses- og slutbetalingsopgaver i optakten til afrejse.

Set to Traveling on Departure DateScheduled

Trigger: På Departure Date.

Handling: Field Update Stage = "Traveling". Bemærk: trigger kun aktiv hvis stadiet i forvejen er Confirmed.

AutoTask: Did the customer have a nice tripScheduled

Trigger: På Last Time2 (hjemkomst).

Handling: Follow-up opgave til ejer.

Auto Complete at Last Time2Scheduled

Trigger: På Last Time2.

Handling: Field Update Stage = "Completed". Trigger virker kun hvis stadiet er Confirmed eller Traveling.

Calculate Key Numbers - 1 + 2 / Lead Time CalculationScheduled

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

Enroll Client To Newsletter MailRediger

Trigger: Newsletter checkbox tilvalgt.

Handling: Email Notification (Add Client To Newsletter).

Push Address Info from ClientRediger

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

AutoTask: 120 days since last offerScheduled

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

Create Offer Workdrive FolderBegge

Betingelse: Workdrive ID IS EMPTY.

Handling: Custom Function (Opret Workdrive-mappestruktur til tilbud) - opretter offer-undermappe + "Scannet af AI"-undermappe.

Update Generated Invoices - Offer DescriptionBegge

Handling: Custom Function (Opdater fakturabeskrivelse på fakturaer) - itererer alle tilknyttede Invoices og opdaterer Offer Description-feltet.

Fetch Booking IDBegge

Betingelse: Booking ID IS EMPTY.

Handling: Custom Function (Synkroniser Booking-nummer til Offer).

Ved Redigering

Offer Won - Update PayablesRediger

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)

Financial Updates (5 regler)Scheduled

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

Attach and Update BookingOpret

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.

Default Due DateOpret

Betingelse: Due Date IS EMPTY.

Handling: Custom Function (Fakturadato + 10 dage).

Book ImmediatelyOpret

Handling: Custom Function (Bogfør kundefaktura i e-conomic) - opretter journal 4-postering med PDF-bilag fra Mail Merge.

Ved Redigering

AutoTask: Remind to send InvoiceDisabled

Betingelse: Reminder Task ændres til "selected". Filter: Invoice Owner IS NOT 80days.

Handling: Opret Task "Invoice is not sent?".

Ved Oprettelse ELLER Redigering

Full AmountBegge

Handling: Custom Function (Hent fuldt beløb fra tilbud) - sætter Full Amount-feltet fra Offer-totalen.

Scheduled (Rollup Summary)

Change Status to PaidScheduled

Trigger: Amount Paid (Rollup) modificeres.

Handling: Custom Function (Skift status til Betalt / Partially Paid) - sammenligner Amount Paid mod Grand Total.

Payments

Ved Oprettelse

Generate FX Gain/Loss RecordDisabled

Betingelse: Payment Type = "Payment to Supplier" AND Payment Status = "Paid".

Handling: Custom Function (Opret FX gevinst/tab-record) - kladde, hardcoded test-ID.

Auto Map Supplier PayableOpret

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).

New Credit NoteDisabled

Betingelse: Payment Type = "Credit Note".

Handling: Custom Function (Markér faktura som krediteret).

Auto Create Credit Note PDFDisabled

Betingelse: Payment Type = "Credit Note".

Handling: Custom Function (Generer kreditnota PDF via Mail Merge).

New Customer PaymentOpret

Handling: Custom Function (Bogfør kundebetaling i e-conomic).

New Credit Note - Email LotteDisabled

Handling: Email Notification til Lotte om ny kreditnota.

Info from OfferOpret

Handling: Custom Function der henter felter fra det tilknyttede tilbud.

Ved Redigering

Check for match in Currencies with Bank AccountRediger

Trigger: Bank Account ændres.

Handling: Custom Function (Match valuta mod bankkonto og send Proof of Payment).

Change in SupplierRediger

Trigger: Supplier eller Offer ændres.

Handling: Custom Function (Auto-remap betaling til korrekt Supplier Payable).

Set Amount - From Supplier Payable FX RateDisabled

Trigger: Supplier Payable ændres.

Handling: Custom Function (Auto-beløb hvis tomt).

Amount Currency ChangedRediger

Trigger: Amount (Currency) ændres.

Handling: Custom Function (Genberegn DKK-beløb via Payable-kurs).

Change in OfferRediger

Trigger: Offer ændres.

Handling: Custom Function (Udled booking og klient fra tilbud).

Scheduled

Transactions Review ReminderScheduled

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

Generate and Self-DeleteOpret

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

Paid in FullRediger

Trigger: Balance <= DKK 0,00.

Handling: Field Update Status = "Paid in Full".

Scheduled (Rollup Summary)

Update BalanceScheduled

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

No Due DateOpret

Betingelse: Due Date IS EMPTY.

Handling: Field Update - sæt Due Date = i dag.

Get Client Name and Departure DateOpret

Handling: Custom Function (Udfyld klientnavn og afgangsdato på Task) - henter felter fra parent record så de er synlige i task-listen.

Tilbage til forside

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

FeltTypeBeskrivelse
Task OwnerUserAnsvarlig medarbejder
SubjectSingle LineOpgavens emne
Due DateDateForfaldsdato (default = i dag hvis ikke angivet)
Contact NameLookupStandard kontakt-lookup
Related ToLookup (polymorft)Booking / Offer / Invoice mv.
Client NameSingle LineKundenavn (tekstkopi - udfyldes via Custom Function)
Departure DateDateAfrejsedato (kopieret fra parent record)
StatusPicklistNot Started / In Progress / Completed mv.
PriorityPicklistPrioritet
RepeatSingle LineGentagelsesregel
Closed TimeDate/TimeTidspunkt for lukning

Description Information

FeltTypeBeskrivelse
DescriptionMulti-LineBeskrivelse
TravelWire IDSingle 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

FeltTypeBeskrivelse
TitleSingle LineMødets titel
Meeting VenuePicklistType af møde (online, på kontoret mv.)
LocationSingle LineFysisk eller virtuel adresse
ProviderPicklistOnline-mødeudbyder (Zoom, Teams mv.)
All dayCheckboxHeldagsbegivenhed
FromDate/TimeStart
ToDate/TimeSlut
HostUserVært (svarer til Owner)
Related ToLookup (polymorft)Relateret record
ParticipantsSingle LineDeltagere
Participants ReminderSingle LinePåmindelse til deltagere

Meeting Additional Information

FeltTypeBeskrivelse
DescriptionMulti-LineBeskrivelse
RepeatSingle LineGentagelse
ReminderSingle LinePå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

FeltTypeBeskrivelse
Contact NameLookupKontaktperson opkaldet vedrører
Related ToLookup (polymorft)Relateret record (Booking/Offer mv.)
Call TypePicklistOutbound / Inbound / Missed
Outgoing Call StatusPicklistStatus på udgående opkald
Call Start TimeDate/TimeStart-tidspunkt
Call DurationSingle LineVarighed
Call OwnerUserDen der ringede
SubjectSingle LineEmne
Voice RecordingURLLink til lydoptagelse

Purpose Of Outgoing Call (Conditional)

FeltTypeBeskrivelse
Call PurposePicklistFormål med opkaldet
Call AgendaSingle LineAgenda

Outcome Of Outgoing Call (Conditional)

FeltTypeBeskrivelse
Call ResultPicklistResultat
DescriptionMulti-LineBeskrivelse af samtalen

Reason For Incoming Call (Conditional)

FeltTypeBeskrivelse
DescriptionMulti-LineBeskrivelse 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.

Lead Planning Confirmed Traveling Completed Lost Archived
StadieBetydningAutomation
LeadNy booking, ikke bekræftet endnuIngen
PlanningTilbud er under udarbejdelseIngen
ConfirmedKunden har bekræftet rejsen og første faktura er udstedtSættes automatisk når "Create Invoices" trykkes på ét af bookingens Offers
TravelingKunden er på rejseSættes når Departure Date rammes - kræver at stadiet i forvejen er "Confirmed"
CompletedRejsen er slut og kunden er hjemmeSættes når sidste Time2 i Flight Information rammes - kræver at stadiet er "Confirmed" eller "Traveling"
LostKunden har sagt nejManuel - kræver Lost Reason på tilbuddet
ArchivedArkiveretManuel

Offer Stages

Quotation In Order Issued Cancelled Inactive
StadieBetydningAutomation
QuotationNyt tilbud, stadig kladde (tæller ikke med i statistik)Ingen
In OrderTilbuddet vi tror mest påIngen - rent visuelt
IssuedKunden har bekræftet rejsen og fakturaen er udstedtSættes automatisk når "Create Invoices"-knappen trykkes. Record læses via Record Locking efter dette punkt.
CancelledKunden har sagt nejManuel
InactiveArkiveret tilbudManuel

Supplier Payable Status

Pending Payment Partially Paid Paid in Full Cancelled
StatusBetydningAutomation
Pending PaymentSP oprettet, ingen betalinger registreretIngen
Partially PaidLeverandør delvist betaltSættes automatisk ved første betaling hvis beløb < Quoted Amount. Må gerne sættes manuelt til Paid in Full ved kursdifferencer.
Paid in FullFuldt betaltSættes automatisk når Paid Amount >= Quoted Amount
CancelledSP annulleret (leverandør trukket sig efter fakturering)Manuel