Ga naar inhoud

Script-referentie

Scripts in Tabbr zijn JavaScript (ES2022) die op de server draait. Deze pagina somt op wat je ter beschikking hebt. Een inleiding vind je in Scripts, hooks en acties.

Naam Waar Wat
<entiteit> (bv. flight, person, signup) overal Het record waarvoor het script draait.
current hooks Hetzelfde record.
original onUpdate() Het record zoals het was vóór de wijziging.
  • Velden lees en schrijf je met hun naam (hoofdletterongevoelig) of hun ingebouwde eigenschap: flight.startField, flight['Passagier/instructeur'].
  • Een verwijzing kan je volgen: flight.toestel.soort, signup.activity.date.
  • Een veld dat vrije tekst toelaat, test je met x.isEntity() en x.isTextual().
  • Datums lees je als milliseconden sinds 1970 (new Date(flight.date) maakt er een datum van).
  • Velden met meerdere waarden zijn alleen leesbaar.
Functie Geeft
textField(record, 'Naam') De tekstwaarde van een veld.
integerField(record, 'Naam'), decimalField(…) Een getal.
boolField(record, 'Naam') true / false.
dateField(record, 'Naam') Een Date, of null.
fieldIs(record, 'Naam', waarde) Of het veld die waarde heeft.
Functie Wat
addErrorMessage(record, 'tekst') Een rode melding.
addWarningMessage(record, 'tekst') Een oranje melding.
addInfoMessage(record, 'tekst') Een blauwe melding.

Meldingen blokkeren het bewaren niet. Wil je dat wel, gebruik dan een throw in een berekening.

Functie Voorbeeld
formatDate(d) 16/05/2026
formatDateTime(d) 16/05/2026 14:32
formatTime(d) 14:32
formatJsonDate(d) 2026-05-16

console.info(), console.debug(), console.warn(), console.error(), console.trace() — met tekst en waarden: console.info('Aanrekenen', flight.aanrekenen).

Functie Wat
sendEmailByTemplate(sjabloon, persoon, record?) Een sjabloon naar een persoon, volgens zijn voorkeur.
sendEmailByTemplateToExternalUser(sjabloon, naam, e-mail, record?) Naar iemand zonder account.
sendMailTemplate(mailTemplate) Een e-mailrecord versturen (ontvangers = berekende groepen).
mailUtils.newMail() Een e-mail zonder sjabloon (zie hieronder).
mailUtils.newMail()
.from('Zweefclub De Wolken', '[email protected]')
.replyToCurrentUser('[email protected]')
.subject('Nieuwe aanvraag')
.htmlContent(`Er is een nieuwe aanvraag van ${current.aanvrager.firstname}.`)
.send()

Ook .cc(), .bcc() en .replyTo(). E-mails vertrekken pas als het bewaren gelukt is.

Functie Wat
hasAnyRole(persoon, 'INSTRUCTEUR') Of de persoon de rol heeft.
hasAnyRole(persoon, ['STARTLEIDER', 'INSTRUCTEUR']) Of de persoon één van de rollen heeft.

jobUtils.triggerJobForEntity('Naam van het jobtype', record) start een job voor het record, na het bewaren.

duplicateEntity(record, { 'Geldig tot': '2028-08-20' }) maakt een kopie met andere waarden voor de velden die je opgeeft, en geeft het id van de kopie. De hooks van de kopie draaien gewoon.

Met de querytaal haal je andere records op. Ze is beschikbaar als de module Conformiteit actief is.

// alle vluchten van deze piloot dit jaar, de recentste eerst
const vluchten = select().from('flight')
.where(and(
filter('piloot', EQ, flight.piloot),
filter('date', GTE, new Date(new Date().getFullYear(), 0, 1)),
))
.orderBy(order('start', 'desc'))
.limit(50)
.execute()
// hoeveel lidmaatschappen had deze persoon vorig seizoen?
count().from('membership')
.where(and(filter('owner', EQ, membership.owner), filter('season', EQ, `${membership.season - 1}`)))
.execute()
Begin Geeft
select().from(entiteit) Records.
count().from(entiteit) Een aantal.
sum(veld).from(…), max(veld).from(…) Een som, een maximum.
project(veld).from(…) De waarden van één veld.

Daarna .where(…), .orderBy(order(veld, 'asc' | 'desc')), .limit(n), .offset(n), en tot slot .execute() (of .executeFirst() voor één record).

Voorwaarden: filter(veld, OPERATOR, waarde), gecombineerd met and(…) en or(…). Een veld van een gerelateerd record schrijf je als 'activity:date'. Operators: EQ, NEQ, GT, GTE, LT, LTE, IN, HAS_ANY, IS_NULL, IS_NOT_NULL, IS_EMPTY, IS_NOT_EMPTY.

Module Extra
Vluchten (in de rekenwijze) billingService.createBillingRecordForFlight(persoon, rekeningtype, categorie, omschrijving, bedrag), billingService.deleteBillingRecordsForFlight()
Conformiteit statsCalculator.calculateStats(stat), complianceFileCalculator.recalculateComplianceFilesForPerson(persoon)
Officiële documenten hasAnyOfficialDocument(persoon, types), documentType(naam)
Form form.prepareQuestionnaireResponseForPerson(persoon)
  • Geen return bovenaan in een veldscript. De laatste expressie is het resultaat; return mag wel binnen een functie.
  • Een tikfout in een veldnaam geeft null, zonder fout.
  • Een fout in een hook blokkeert het bewaren niet: ze wordt een melding bij het record.
  • onDelete() wordt momenteel niet uitgevoerd bij een echte verwijdering.
  • Velden wijzigen in een actie wordt niet bewaard: gebruik een hook of een berekening.