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.
Het record
Section titled “Het record”| 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()enx.isTextual(). - Datums lees je als milliseconden sinds 1970 (
new Date(flight.date)maakt er een datum van). - Velden met meerdere waarden zijn alleen leesbaar.
Velden
Section titled “Velden”| 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. |
Meldingen bij een record
Section titled “Meldingen bij een record”| 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.
Datums
Section titled “Datums”| Functie | Voorbeeld |
|---|---|
formatDate(d) |
16/05/2026 |
formatDateTime(d) |
16/05/2026 14:32 |
formatTime(d) |
14:32 |
formatJsonDate(d) |
2026-05-16 |
Logboek
Section titled “Logboek”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() .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.
Rollen
Section titled “Rollen”| 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.
Records dupliceren
Section titled “Records dupliceren”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.
Queries
Section titled “Queries”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 eerstconst 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.
Per module
Section titled “Per module”| 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) |
Valkuilen
Section titled “Valkuilen”- Geen
returnbovenaan in een veldscript. De laatste expressie is het resultaat;returnmag 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.