Eigen Rapportsjablonen in upmesh maken

Rapporten
Bedrijfsaccount-beheer

In upmesh kun je op verschillende plaatsen rapporten maken: als Dagelijks bouwverslag, Ticketrapport of Projectrapport. Voor Dagelijks bouwverslagen en Ticketrapporten staan er al standaardrapporten voor je klaar. Als Firmenadmin kun je daarnaast in het Bedrijfsaccount-beheer eigen rapportsjablonen uploaden.

Om eigen rapporten te maken, heb je het volgende nodig:

  • MS Office of een ander programma waarmee .doc- of .docx-bestanden kunnen worden gemaakt

  • De documentatie en de variabelen uit het infogerecht onder https://app.upmesh.de/company/reportTemplates

  • De kennis over hoe deze informatie moet worden toegepast. Dat is precies wat wij je in deze handleiding leren.

Hoe werken de variabelen?

In de tabbladen "Ticketrapport", "Dagelijks bouwverslag" and "Projectrapport" vind je de variabelen die beschikbaar zijn voor het betreffende rapport. Ze zijn gesorteerd op categorie en tonen elk een beschrijving, een datatype en de schrijfwijze van de variabele.

Het datatype laat je zien of het gaat om een string (een tekst) die direct in het document kan worden ingevoegd, of dat er een speciale behandeling nodig is. Onder "Variabele" zie je het pad waarmee je de variabele kunt gebruiken.

Let op: Als er in dit pad een [] staat, betekent dit dat het om een array (een lijst) gaat. Om bijvoorbeeld de titel van een Ticket weer te geven, moet je ofwel vastleggen welk Ticket moet worden weergegeven, of alle Tickets doorlopen met een lus en telkens de titel afdrukken. Meer hierover in de sectie "For-lussen".

Datatypen en hoe ze worden gebruikt

Laten we eerst naar de datatypen kijken, waarbij we ervan uitgaan dat de variabele geen [] in het pad heeft.

Strings zijn tekst en kunnen zonder verdere voorbereiding worden ingevoegd. Je gebruikt ze door ze tussen twee accolades te zetten. De naam van het project zou er zo uit kunnen zien: {{project.title}}. De accolades geven aan dat het om een codefragment gaat dat tijdens het genereren van het rapport wordt vervangen.

Number variabelen (getallen) kun je op dezelfde manier invoegen als strings.

Date (datum) kun je eveneens als een string invoegen. Het resultaat ziet er dan echter zo uit: 2026-07-07T11:41:41.928Z. Het wordt mooier als je de codevoorbeelden uit het eerste tabblad van het infogerecht gebruikt. Hier vind je verschillende weergavevormen:

  • Datum inclusief tijd: {{ new Date( DATE-FIELD ).toLocaleString('de-DE') }}

  • Alleen de tijd van de datum: {{ new Date( DATE-FIELD ).toLocaleTimeString('de-DE') }}

  • Alleen de dag van de datum: {{ new Date( DATE-FIELD ).toLocaleDateString('de-DE') }}

  • Datum van vandaag: {{ new Date(new Date()).toLocaleDateString('de-DE') }}

Opmerking: MS Word vervangt de ingevoerde aanhalingstekens in het laatste haakje door andere, afhankelijk van de taalinstelling. Deze werken niet. Je herkent ze aan het feit dat ze anders van vorm zijn en dat het eerste aanhalingsteken onderaan staat in plaats van bovenaan. Het is daarom aan te raden om de aanhalingstekens te kopiëren en te plakken in plaats van ze opnieuw te typen.

"Null" betekent dat het type leeg kan zijn. Het type "Date | null" betekent ofwel een datum of leeg. Belangrijk: Zorg in dit geval met een IF-vraag dat de variabele aanwezig is voordat je deze gebruikt.

Booleans kunnen slechts één van de twee waarden hebben: true of false (waar of onwaar). Als je ze als een string gebruikt, wordt precies deze waarde afgedrukt. Met een IF-statement kun je de weergave wijzigen; bijvoorbeeld drukt {{IF $ticket.archived}}gearchiveerd{{END-IF}} het woord "gearchiveerd" af als ticket.archived true is.

Objecten worden ofwel als "object" aangegeven of worden weergegeven met accolades en verdere variabelen daarin. De tags in het Ticketrapport zijn bijvoorbeeld een Object Array: {tagName: string; groupName: string; color: string }[].

Een object bevat altijd meer informatie. Als je het als een string uitvoert, wordt het in hetzelfde formaat weergegeven als het datatype, maar dan met ingevulde gegevens. Een Tag zou er zo uit kunnen zien: {tagName: Tag, groupName: Groep, color: #ffffff }. Deze weergave kan je helpen bij het testen en bij het oplossen van fouten. Let op: Hierbij worden niet altijd alle eigenschappen van een object getoond als deze niet zijn ingevuld.

Om in dit voorbeeld de naam van de Tag weer te geven, kun je {{ $t.tagName}} schrijven, mits je eerder t als een enkele Tag hebt gedefinieerd (zie de secties "For-lussen" en "Variabelen & Berekeningen").

IF & END-IF

IF-vragen zeggen tegen upmesh: "Als X, doe dan Y." Ze beginnen altijd met IF en eindigen met END-IF. In het eerste accolade na de IF staat de voorwaarde (als X), en tussen de accolades van IF en END-IF staat wat er moet gebeuren (doe dan Y).

Als de END-IF wordt vergeten, mislukt het genereren van het rapport. Het is het beste om direct na de IF ook al de END-IF te schrijven voordat je iets anders doet. Zo vergeet je het niet.

Voorbeeld:

{{IF project.title === 'upmesh'}}
{{project.title}}
{{END-IF}}

Dit betekent: "Als de projectnaam 'upmesh' is, schrijf dan de projectnaam op deze plek in het rapport."

Het tegenovergestelde is ook mogelijk:

{{IF project.title !== 'upmesh'}}
{{project.title}}
{{END-IF}}

Dit betekent: "Als de projectnaam niet 'upmesh' is, schrijf dan de projectnaam op deze plek in het rapport."

In lijsten kan het er zo uitzien:

{{IF Array(custom.Projecten).toString().includes('upmesh')}}Ja{{END-IF}}
{{IF Array(custom.Projecten).toString().includes('upmesh')== false}}Nee{{END-IF}}

Als het aangepaste lijstveld "Projecten" de waarde "upmesh" bevat, schrijft upmesh "Ja" op deze plek in het rapport. Bevat het veld de waarde "upmesh" niet, dan schrijft upmesh "Nee".

IF-vragen zijn absoluut noodzakelijk bij variabelen die null kunnen zijn of niet aanwezig kunnen zijn, omdat het genereren van het rapport anders mislukt:

{{IF tickets[0]}}
{{tickets[0]}}
{{END-IF}}

Dit betekent: "Als er minstens één Ticket aanwezig is, druk deze dan af."

{{IF tickets[0] && tickets[0].assignee}}
{{tickets[0].assignee}}
{{END-IF}}

Dit betekent: "Als er minstens één Ticket aanwezig is en deze een toegewezen medewerker heeft, druk deze dan af."

Omdat een nieuw rapport bij het opslaan op de achtergrond wordt gecontroleerd met een klein testproject, kan een vergeten IF-statement al bij het opslaan tot foutmeldingen leiden. Dit hoeft echter niet altijd het geval te zijn; vooral ingebedde IF-statements vallen vaak pas later op. In het geval van twijfel kun je beter een IF-vraag te veel dan te weinig inbouwen.

For-lussen

For-lussen dienen om lijsten door te lopen. Ze zeggen tegen upmesh: "Doe X voor elk element van deze lijst."

{{FOR ticket IN tickets}}
#{{$ticket.ticketNumber}} {{$ticket.title}}
{{END-FOR ticket}}

Deze lus loopt door de Tickets en maakt daarbij een nieuwe variabele aan met de naam ticket, die het huidige lijstelement bevat. Omdat het een eigen variabele is, moet je een $ voor de naam zetten als je deze gebruikt. In het voorbeeld worden het Ticketnummer en de titel afgedrukt.

De lus eindigt met END-FOR. Het opgeven van ticket in de END-FOR is optioneel, maar maakt het geheel overzichtelijker wanneer er meerdere FOR-lussen in elkaar zijn genest, bijvoorbeeld wanneer je binnen een Ticket-lus een andere lus maakt om de Tags van het individuele Ticket door te lopen.

Ontbreekt de END-FOR, dan mislukt het rapport. Het beste is om direct na de FOR x IN y ook al de END-FOR te schrijven en pas daarna te bepalen wat er met de elementen moet gebeuren.

Variabelen & Berekeningen

Je kunt ook eigen JavaScript-snippets maken en uitvoeren in een rapport. Deze worden niet afgedrukt, maar worden gebruikt om functies of constanten te definiëren die je op andere plaatsen in het rapport kunt gebruiken.

Dit werkt als volgt:

{{EXEC
MIJN_CONSTANTE = 3;
}}

Alles wat tussen {{EXEC en }} staat, wordt deel van het codefragment. Je kunt dit gebied ook gebruiken om berekeningen uit te voeren, een goed voorbeeld hiervan is de schaling van afbeeldingen in de volgende sectie.

Afbeeldingen invoegen

Afbeeldingen zijn objecten in het formaat { width: number; height: number; data: string | ArrayBuffer; extension: string}. width en height geven de breedte en hoogte van de afbeelding aan. Als je deze waarden verandert, wordt de afbeelding in een ander formaat afgedrukt. data bevat de afbeeldingsgegevens, extension geeft de bestandsextensie aan.

Je voegt afbeeldingen in door IMAGE in de accolades vóór de variabelenaam te schrijven, bijvoorbeeld {{ IMAGE $ticket.plan.large}} (ervan uitgaande dat je ticket eerder als een specifiek Ticket hebt gedefinieerd, zie sectie "For-lussen"). Dit drukt het Bouwtekening in volledige grootte af.

Als de afbeelding kleiner moet zijn, kun je het object eerst naar een variabele kopiëren en vervolgens height en width aanpassen. Een voorbeeld van een dergelijke berekening:

{{FOR ticket IN tickets}}
{{IF $ticket.plan.large}} 
{{EXEC 
targetHeight = 7;
scaled = targetHeight / $ticket.plan.large.height;
targetWidth = $ticket.plan.large.width * scaled;
newImage = { width:targetWidth,height:targetHeight,data:$ticket.plan.large.data, extension:$ticket.plan.large.extension }; 
}}
{{IMAGE newImage}} 
{{END-IF}} 
{{END-FOR ticket}}

Elementen combineren

Je kunt al deze elementen nu combineren om een rapport te maken. Je kunt meerdere IF-vragen in elkaar nestelen, meerdere For-lussen in elkaar nestelen of ook IF en FOR met elkaar combineren.

Het is aan te bevelen om het rapport stukje bij beetje op te bouwen en tussendoor steeds opnieuw te testen. Dit vergemakkelijkt het oplossen van fouten, want je kunt beter afgrenzen waar de fout zou kunnen liggen als je weet wat er sinds de laatste test is veranderd.

De opmaak van variabelen, dus tekstkleur, tekstgrootte en lettertype, wordt overgebracht naar het ingevulde rapport. Nu is het aan jou om je eigen rapport te maken en zo te formatteren als je het nodig hebt.

Was dit artikel nuttig?

Nog geen upmesh-account?

Probeer upmesh gratis: bouwdocumentatie, gebreken, plannen en bouwdagboek in één app — in de browser, op je smartphone en offline.