Handleiding Versie 5 template codes

Inhoud

1.0	Basis mogelijkheden
1.1	Merge-fields
1.2	Het opbouwen van een code
1.3 	Ophalen van gegevens uit lijsten
1.4	Lange codes korter maken
1.5	Het gebruik van verschillende formaten (.format)
1.5.1	Datatype Date
1.5.2	Datatype String
1.5.3	Datatype Number
1.5.4	Datatype Boolean
1.6	Plaatjes toevoegen
1.6.1	Word
1.6.2	Email
2.0	Geavanceerde mogelijkheden
2.1	Gebruik van if
2.2	V5 Template Utils
2.2.1	$func.util
2.2.2	$func.math6

1.0	Basis mogelijkheden

1.1	Merge-fields

Bij het samenstellen van brief, fax en herinnering templates, wordt gebruik gemaakt van ‘merge-fields’. Deze velden voegen bij het opstellen van de uiteindelijke correspondentie de gegevens samen aan de hand van de gegevens zoals ingevoerd in CRM.

Een merge-field maakt u aan op de volgende manier:
Open het bronbestand van uw template in Word. Plaats de cursor op de plaats waar u het veld wilt invoegen. Kies in uw standaard werkbalk ‘Invoegen / Insert’ en vervolgens ‘Veld / Field’ (zie afbeelding 1)

           Afbeelding 1	

                                     Afbeelding 2	

Een nieuw venster wordt geopend. Kies onder ‘Veldnaam / Fieldname’ voor ‘Merge-Field’ (zie afbeelding 2). U kunt onder ‘Veldeigenschappen, Veldnaam / Fieldproperties, Fieldname’ de door u gewenste code toevoegen. Kies vervolgens OK om het veld toe te voegen aan uw template.

Zo komt het vervolgens in MSword te staan: 

Om naderhand een merge-field te wijzigen dient u eenmaal te klikken op het merge-field en vervolgens met de rechtermuisknop te klikken en kies voor Veld Bewerken (zie afbeelding 3).

                                            Afbeelding 3	
Opmerking:
Sommige codes kunnen erg lang worden. MS Word toont echter in het scherm maar de eerste 40 karakters.
Door het veld te bewerken wordt de hele code getoond.
Een ander optie om de code in zijn geheel te bekijken is door rechtermuisknop te klikken en kies voor Andere veldweergave.

De code wordt dan zo weergegeven:
{MEGEFIELD $data.letter.relation.lastname \* MERGEFORMAT }	

In het document worden al de mogelijke codes weergegeven van het eerste niveau.
Dat wil zeggen, al de mogelijke gegevens van de contactpersoon en het bedrijf waar deze contactpersoon onder valt. Er wordt niet gekeken naar eventuele relaties van deze contactpersoon of het bedrijf.
De codes kunnen in de templates worden opgenomen. Deze codes worden tijdens het opstellen van de letter vervangen door de gegevens zoals ingevoerd op de relatiekaarten in uw relatiebeheer.

LET OP: Alle documenten dienen opgeslagen te worden in RTF formaat. Kies voor Bestand > Opslaan als. Achter het veld ‘Opslaan als’ kan er gekozen worden (middels het pulldown menu) voor ‘RTF-bestand (*.rtf)’.

1.2	Het opbouwen van een code

De basis van elk template ligt bij $data. Om er achter te komen welke mogelijkheden er zijn om verder te komen in de gegevens structuur kan er een .dump worden gemaakt. 

Code:	«$data.dump»	

Bij het mergen van het template (brief / e-mail) wordt dan ongeveer het volgende getoond:

## INFO ## 
dump      	: String (Een dump van beschikbare velden) 
format    	: String (Een dump van beschikbare formaten)  
 
## GEGEVENS ##
employeeInfo 	: Employee ([rela.employee | PK: systemid = 2253834])  
now     		: GregorianCalendar (13-12-2007 11:21:31)  
params              : HashMap ({})  
letter             	 : Letter ([rela.letter | PK: systemid = 7006619]: )  
companyInfo 	: V5CompanyInfo (nl.base.baseReports.v5.V5CompanyInfo@120)

Toelichting op Info:
dump      	: De optie dump is de optie die gebruikt is, maar wordt altijd weergegeven.
format    	: Een dump van beschikbare formaten die mogelijk zijn. (dit kan zijn. Toon alles in 
		  hoofdletters of juist alles in kleine letters. Hier komen we later op terug)

Toelichting op Gegevens:
employeeInfo 	: De gegevens van de gekoppelde medewerker
now     		: De huidige datum en tijd  
params             : Mogelijke parameters die meegegeven kunnen worden aan het rapport. Dit wordt bijna nooit 
		  gebruikt.
letter             	: Optie om alle gegevens van een brief op te halen 
companyInfo 	: Optie om alle bedrijfsgegevens op te halen. Deze bedrijfsgegevens kunnen worden 
		  gevonden bij Beheer > Instellingen > Beheer Bedrijfsgegevens.

Opmerking: Bovenstaande $data.dump is vanuit een brief gemaakt. Vandaar dat er hier de optie ‘letter’ staat. Bij een $data.dump vanuit een email komt er in die plaats de optie ‘email’ te staan.

Aangezien we een brief willen maken kiezen we voor de optie ‘letter’. We willen immers gegevens (data) van de brief (letter) hebben. De code wordt dan als volgt:

Code:	«$data.letter.dump»	

Bij het mergen van het template (brief / e-mail) wordt dan ongeveer het volgende getoond:

## INFO ## 
dump                : String (Een dump van beschikbare velden)  
format              : String (Een dump van beschikbare formaten)  
 
## GERELATEERDE OBJECTEN ## 
employee            : Employee  
correctClass        : Letter  
project             : Project  
relation            : Relation

## GEGEVENS ## 
ledate              : GregorianCalendar (29-01-2008 13:30:00) Datum   
projectDescription  : String  
dutchDate           : String  
relationDescription : String  
employeeName        : String  
lesoort             : String (Arjen)  
leauteur            : String (AB) Auteur relatiecode        
letterno            : String (101597) Correspondentienummer Wordt automatisch gegenereerd 
lesubject           : String (Data dump) Onderwerp Wordt ook meegenomen in de brief als "betreft" veld 
leref               : String (AB/877468/101597) Referentie         	

Toelichting op gerelateerde objecten:
employee		: De gegevens van de gekoppelde medewerker
project	 		: De gegevens van het gekoppelde project
relation            		: De gegevens van de gekoppelde relatie

Toelichting op gegevens:  (Hier zijn enkele veelgebruikte codes toegelicht)
ledate			: Dit is de datum voluit geschreven bijvoorbeeld 01-01-2008 13:30:00)   
projectDescription  	: De project omschrijving van het gekoppelde project
dutchDate		: Dit is de datum zoals deze in het Nederlands wordt geschreven
employeeName	: De naam van de gekoppelde medewerker
leauteur	: Dit is de auteur van de brief. Deze kan worden ingesteld onder Beheer > Persoonlijke     instellingen > Persoonlijk > Persoonlijke gegevens > Veld: initialen        
letterno		: Correspondentie nummer
lesubject		: Het onderwerp van de brief
leref			: Dit is het referentie nummer van de brief. Deze wordt automatisch gegenereerd 

Eigenlijk kan je dit nu net zo zien alsof je een al aangemaakte brief hebt geopend bij Correspondentie > Brieven/E-mail. Als je met je muis over de velden heen gaat krijg je ook bovenstaande template codes te zien.

TIP: Bij het maken van een nieuwe brief template weet je soms niet zeker of de juiste code is gebruikt. Om dit te controleren maak je dan een nieuwe brief aan. Indien het scherm van de nieuwe brief nog niet is gesloten dan is er de knop: Selecteer een nieuwe template zichtbaar.

Van elke wonen, BOG-, A&LV- object, zoekopdracht, taxatierapport enz. daar wordt een project aan gekoppeld. Om bij de gegevens van deze te komen dient eerst het project opgevraagd te worden.

Code:	«$data.letter.project.dump»	

Bij het mergen van het template (brief / e-mail) wordt dan ongeveer het volgende getoond:

## INFO ## 
dump                : String (Een dump van beschikbare velden)  
format              : String (Een dump van beschikbare formaten)  
 
## GERELATEERDE OBJECTEN ## 
company             : Company  
employee            : Employee  
linkedEntity        : PersistentEntity  
extraFactuurRelation: Person  
project             : Project 
 
## GEGEVENS ## 
hoursWorked         : double  
pstatus             : String (Gereed)  
palert              : String (Pas op voor de hond)  

Toelichting op gerelateerde objecten:
Company		: De gegevens van het gekoppelde bedrijf aan het project  
employee 		: De gegevens van het gekoppelde bedrijf aan het project  
linkedEntity        	: Dit is de belangrijkste van om vanuit een project bij de gegevens van het object te 
			  komen.  

Toelichting op gegevens:  (Hier zijn enkele veelgebruikte codes toegelicht)
hoursWorked         	: Hoeveel uren er gekoppeld staan aan het gekoppelde project
pstatus             	: De status van het project.  
palert              		: Dit is het veld voor de altertekst van het project  

Zoals eerder aangegeven is, is het mogelijk om vanuit het project de gegevens op te halen van een wonen, BOG-, A&LV-object, zoekopdracht, taxatierapport enz. via linkedEntity.

Code:	«$data.letter.project.linkedEntity.dump»	

Bij het mergen van het template (brief / e-mail) wordt dan ongeveer het volgende getoond:
## GERELATEERDE OBJECTEN ## 
address             : Address  
notaris             : Company  
accountManager      : Employee  
residential         : ObjectRes  
verkoperPartner     : Person  
koperPartner        : Person  
relation            : Relation  
verkoper            : Relation  
koper               : Relation  
aankopendMakelaar   : Relation  

## GEGEVENS ## 
lisstreet           : String (Oberonlaan) Straatnaam van het object. 
liststrnr           : String (4) Huisnummer van het object
lisstrnrex        : String (a) Huisnummer toevoeging van het object
liszipcode          : String (1562 ZV) Postcode van het object. 
liscity             : String (KROMMENIE) Vestigingsplaats van het object 
listxtalg           : String () Platte onopgemaakte tekst 
totalLivingSurface  : int  
pshdescr            : String (Oberonlaan 4, 1562 ZV Krommenie)  
liscomdesc          : String (Onwijs gave woning!) Korte commerciele omschrijving 
lissttrdate         : Timestamp (1970-01-01 01:00:00.0) Status : Transactiedatum 
lissttrans          : Timestamp (2007-12-14 00:00:00.0) Transportdatum
lisdatobv           : Timestamp (2008-01-31 00:00:00.0) Datum ontbindende voorwaarde 	

Toelichting op gerelateerde objecten:
Address		: De adresgegevens van het object. (met .format in diverse formaten op te vragen)  
Notaris			 : De gegevens van de gekoppelde notaris 
accountManager	: Gegevens van de gekoppelde accountmanager 
residential		: Hier staan nog een aantal gegevens van het object zelf
verkoperPartner	: Gegevens van de partner van de verkoper
koperPartner		: Gegevens van de partner van de koper
relation		: Gegevens van de gekoppelde relatie
verkoper		: Gegevens van de verkoper
koper			: Gegevens van de koper
aankopendMakelaar	: Gegevens van de aankopend makelaar

Toelichting op gegevens:  (Hier zijn enkele veelgebruikte codes toegelicht)
Lisstreet		: Straatnaam van het object. 
liststrnr		: Huisnummer van het object
lisstrnrex		: Huisnummer toevoeging van het object
Liszipcode		: Postcode van het object. 
liscity			: Plaatsnaam van het object 
listxtalg		: De aanbiedingstekst van het object
totalLivingSurface	: Totale woonoppervlak
pshdescr		: project omschrijving van het object
liscomdesc		: Korte commerciele omschrijving. 
Lissttrdate		: Transactiedatum 
Lissttrans		: Transportdatum
Lisdatobv		: Datum ontbindende voorwaarde

Eigenlijk kan je dit nu net zo zien alsof je een woon, BOG- of A&LV-object hebt geopend. Als je met je muis over de velden heen gaat krijg je ook bovenstaande template codes te zien.

1.3 	Ophalen van gegevens uit lijsten

In de voorgaande voorbeelden van de .dump functie daar komen eigenlijk ook lijsten in voor maar die zijn met opzet niet in het voorbeeld opgenomen aangezien gegevens ophalen van een lijst net iets anders werkt. Bij de vorige codes werden gegevens opgevraagd van een enkel veld. Lijsten bevatten meerdere velden/gegevens, zo kan een object meerdere verdiepingen hebben of zijn er meerdere kadasters ingevoerd, meerdere brieven enz.

Hieronder staan een aantal lijsten welke naar voren komen bij een dump van een wonen object:
## LIJSTEN ## 
priceHistory        : List  
bieding             : List  
kadaster            : List  
media               : List  
responses           : List  
floors              : List  
hours               : List  
tasks               : List  
agendas             : List  
letters             : List  	

Toelichting op de lijsten:
priceHistory		: Gegevens van de prijs historie
bieding		: Gegevens van de biedingen op het object
kadaster		: Hiermee zijn de kadastrale gegevens op te halen
media			: Hiermee zijn de foto’s op te halen
responses		: Dit zijn de responses gekoppeld aan het object
floors			: Hiermee zijn de gegevens van verdiepingen op te halen
hours			: Hiermee zijn de gekoppelde uren mee op te halen
tasks			: Hiermee zijn de gekoppelde taken mee op te halen
agendas		: Hiermee zijn de gekoppelde agendapunten mee op te halen
letters			: Hiermee zijn de gekoppelde brieven/e-mails mee op te halen

In onderstaand voorbeeld wordt uitgelegd hoe de gegevens van elke (foreach) verdiepingen opgehaald kunnen worden.
Code:	«#foreach ($etage in $data.letter.project»
«$etage.dump»
«#end»	

Ter verduidelijking; hier staat dus eigenlijk voor elke (#foreach) etage die gevonden wordt in data.letter.project.linkedEntity.floors. In dit voorbeeld staat etage, maar daar kan net zo goed verdieping komen te staan. Deze kan zelf verzonnen worden.
Vervolgens dienen alle codes voor de etages wel te beginnen met $etage. Omdat er gezocht wordt over elke verdieping die het systeem tegen komt moet er ook aangegeven worden waar gestopt moet worden met zoeken. Die wordt aangegeven door #end.

Hieronder staan een aantal lijsten welke naar voren komen bij een dump van een wonen object:
## GEGEVENS ## 
flodescr            : String (Begane grond) Etage omschrijving
floroomnr           : String (1) Etage aantal kamers 
flosleep            : String (0) Etage aantal slaapkamers    
woonkamertype       : String (000100000000)
keukentype          : String (10000)	

Toelichting op gegevens:  (Hier zijn enkele veelgebruikte codes toegelicht)
flodescr			: Omschrijving van de etage
floroomnr		: Aantal kamers 
flosleep			: Aantal slaapkamers    
woonkamertype		: Type woonkamer
keukentype		: Type keuken
1.4	Lange codes korter maken 

Wanneer bepaalde informatie heel diep in het systeem zit kunnen bovenstaande codes erg lang worden. Dit terwijl alleen het laatste gedeelte achter de punt steeds verschillend is. Hiervoor kan de "Set" gebruikt worden. 
In bovenstaande voorbeelden («$data.letter.project.linkedEntity.dump») werd de code ook steeds langer, het is natuurlijk erg vervelend als je deze telkens opnieuw moet in typen.

Hieronder een voorbeeld voor het verkrijgen van de datum van een brief op 2 verschillende manieren.

Voorbeeld 1: 
«$data.letter.ledate»

Voorbeeld 2:
«#set ($letter = $data.letter)»
«$letter.ledate»	

Beide geven de datum van de brief. Alleen in voorbeeld 2 hoeft data. niet meegenomen te worden. Het kan voorkomen dat de code echter zo lang wordt dat het aan te bevelen is gebruik te maken van de #set. 
Voor het woord ‘letter’ kan zelf een woord worden verzonnen waarmee gemakkelijker kan worden gewerkt.

Voorbeeld 3:
«#set ($brief = $data.letter)»
«$brief.ledate»	

Hier is er voor het woord ‘brief’, maar doet precies hetzelfde als voorbeeld 2. Elke code kan nu begonnen worden met $brief.

Hieronder nog een voorbeeld voor het verkrijgen van de straatnaam van een object in een brief op 2 verschillende manieren.

Voorbeeld 1: 
«$data.letter.project.linkedEntity.lisstr»

Voorbeeld 2:
«#set ($object = $data.letter.project.lin»
«$object.lisstreet»	

1.5	Het gebruik van verschillende formaten (.format)

Eerder in deze handleiding kwam de optie .format ter sprake. Met een .format is het mogelijk om een veld of datum in een ander formaat weer te geven. 
Er zijn verschillende soorten data:
-	Velden waar alleen een datum ingevuld kan worden heet het datatype “date”. 
-	Velden waar enkel getallen ingevoerd mag worden heet het datatype: “number”.
-	Velden waar een vinkje kan worden gezet of waar de keuze ja/nee is daar heet het datatype:”Boolean”.
-	Alle overige velden daarvan is het datatype: “String”.

Hieronder worden de verschillende datatypes uitgelegd en welk formaat er aan toe kan worden gevoegd.

1.5.1	Datatype Date

Als het veld dat je wilt gebruiken type veld “datum” is dan wordt een datum standaard weergegeven als 01:01:2008 00:00. Door achter de code voor desbetreffende datum .format te zetten kan de datum worden aangepast naar 01-01-2008 of 1 januari 2008. 
Velden kunnen bijvoorbeeld worden weergegeven in allemaal hoofdletters of juist allemaal kleine letter.

Om bijvoorbeeld de datum van een brief weer te geven wordt deze code gebruikt: ·
Code:	«$data.letter.ledate»	

De uitkomst zal zijn: 31-01-2008 12:10. Echter dit formaat is niet gebruikelijk om boven aan een brief te zetten. Om er achter te komen welke formaten (format) er bestaan voor de datum zet je achter de code .format.

Code:	«$data.letter.ledate.format»	

Het resultaat van de beschikbare formaten:

FORMATS: [yearmonth, longdate, fulldate, hour, fulldatetime, date, time, default, DAY, month, englishdate, longdatetime, year, day, week, yearmonth, longdate, fulldate, hour, fulldatetime, date, time, default, DAY, month, englishdate, longdatetime, year, day, week]	

Een voorbeeld voluit geschreven:
Code:	«$data.letter.ledate.format.date»	

De uitkomst zal zijn: 31-01-2008

Het resultaat per formaat:

FORMATS: 
yearmonth
longdate
fulldate 
hour 
fulldatetime 
date 
time 
default 
DAY 
month
englishdate
longdatetime
year
day
week	UITGESCHREVEN:
2008-01
31 januari 2008
donderdag, 31 januari 2008
11
donderdag, 31 januari 2008 11:49
31-01-2008
11:49
31-01-2008 11:49
donderdag
1
01-31-2008
31 januari 2008 11:49
2008
31
5	

1.5.2	Datatype String

Het datatype String bevat veelal tekst, plaatsnamen is hiervan een voorbeeld. Hieronder wordt aan de hand van het voorbeeld om het bedrijfsadres van de medewerker die de brief aanmaakt op te vragen. De volgende code dient te worden gebruikt:

Code:	«$data.letter.employee.ocity»	

De uitkomst zal zijn: AMSTERDAM

Echter kan het zijn dat je de plaatsnaam in een ander formaat in de brief wilt gebruiken. Om de verschillende beschikbare formaten op te vragen zet je dan wederom .format achter de code:

Code:	«$data.letter.employee.ocity.format»	

Het resultaat van de beschikbare formaten: 

FORMATS: [uppercase, default, lbl, lowercase, properplus, original, proper]

Een voorbeeld voluit geschreven:

Code:	«$data.letter.employee.ocity.format.prope»	

De uitkomst zal zijn: Amsterdam

Het resultaat per formaat:

FORMATS 	UITLEG	UITGESCHREVEN	
Uppercase	Schrijft alle karakters in hoofdletters.	ALPHEN AAN DEN RIJN	
lowercase	Schrijft alle karakters in kleine letters.	alphen aan den rijn	
lbl	Haal de spaties weg aan de uiteinden en voeg een spatie toe aan het einde.	ALPHEN AAN DEN RIJN 	
default	Dit is de standaard schrijfwijze (dus ook zonder .format).	ALPHEN AAN DEN RIJN	
properplus	Schrijft de eerste letter met een hoofdletter en de rest in kleine letters.	Alphen aan den rijn	
proper 	 Maak de eerste letter van alle woorden (gescheiden door spaties) een hoofdletter en de rest wordt met kleine letters geschreven.	Alphen Aan Den Rijn	

1.5.3	Datatype Number

Als het veld enkel getallen mag bevatten is het datatype number. Voor dit datatype bestaan momenteel 2 verschillende formats.

In onderstaand voorbeeld wordt uitgegaan van de prijs van een object; in dit geval staat er 250.000,00

nozero 
Deze format haalt alle nullen achter de komma weg en als er niks meer achter de komma staat, de komma ook weg.

Code:	«$data.letter.project.linkedEntity.lissal»	

De uitkomst zal zijn: 250.000

dutchtext 
Deze format zet een getal om naar tekst  (in hoofdletters) en negeert cijfers achter de komma

Code:	«$data.letter.project.linkedEntity.lissal»	

De uitkomst zal zijn: TWEEHONDERDVIJFTIGDUIZEND

1.5.4	Datatype Boolean

Velden waar een vinkje kan worden gezet of waar de keuze ja/nee is daar heet het datatype:”Boolean”.

Onderstaand voorbeeld is de code van het vinkje dat gezet kan worden bij een object (tabblad Adres / algemeen) recreatiewoning:

Code:	«$data.letter.project.linkedEntity.recrea»	

Aangezien het vinkje niet is aangevinkt is de uitkomst: nee

1.6	Plaatjes toevoegen 

Het is ook mogelijk om een plaatje toe te voegen aan een word document of een e-mail. Echter zit er wel een verschil in de codes die gebruikt dienen te worden tussen een plaatje in een Word document en een plaatje in een e-mail.

1.6.1	Word

Plaatje toevoegen op basis van de hoogte en breedte: $func.util.getRTFImage($var, width, height). Hiermee kan je het plaatje aanpassen naar het gewenste formaat.
$var 		De code waar het plaatje gezocht moet worden
Widht		De breedte van het plaatje
Height		De hoogte van het plaatje

Voorbeeld om de hoofdfoto van een object op te halen in een brief gekoppeld aan het project. De breedte is hierbij 80 pixels en de hoogte 60 pixels:

Code:	«$util.getRTFImage($data.letter.project.l»	

Resultaat:

Plaatje toevoegen op basis van de hoogte: $func.util.getRTFImageByHeight($var, height). 
Hiermee wordt het plaatje op basis van de opgegeven hoogte in het document geplaatst. Het plaatje wordt niet in de breedte aangepast. Voorbeeld om de hoofdfoto van een object op te halen in een brief gekoppeld aan het project. De hoogte  is hierbij is 30 pixels: ·
Code:	«$func.util.getRTFImageByHeight($data.let»	

Resultaat:

Plaatje toevoegen op basis van de breedte: $func.util.getRTFImageByWidth($var, width). 
Hiermee wordt het plaatje op basis van de opgegeven breedte  in het document geplaatst. Het plaatje wordt niet in de hoogte aangepast. Voorbeeld om de hoofdfoto van een object op te halen in een brief gekoppeld aan het project. De breedte   is hierbij is 40 pixels: ·
Code:	«$func.util.getRTFImageByWidth($data.lett»	

Resultaat:

De codes om een hoofdfoto te gebruiken in een brief zijn in vergelijking tot de overige foto’s redelijk makkelijk. De hoofdfoto is namelijk altijd de eerste foto en het systeem zal ook altijd de eerste foto gebruiken die hij tegen komt. 
Om de overige foto’s ook te kunnen tonen in een brief dient er gebruik te worden gemaakt van een zogenoemde teller. In het begin van elke code wordt dan de teller op ‘0’ gezet en aan het einde wordt er telkens 1 bij opgeteld.

In de tabel hieronder worden 14 foto’s van het object getoond. Als eerst wordt de code korter gemaakt met een #set, want anders moet $data.letter.project.linkedEntity telkens opnieuw worden geschreven. Het korter maken van de code is: #set ($object = $data.letter.project.linkedEntity). 
In het eerste vakje van de tabel komt de hoofdfoto, deze code is net zoals eerder is uitgelegd met de $func.util.getRTFImage($var, width, height) code.

In het tweede vakje van de tabel wordt er eerst een teller aangemaakt met de code: #set($teller=0). Aangezien de foto’s in een lijstje staan gaan we ervoor zorgen dat er gezocht wordt naar alle foto’s in het lijstje. Dit gebeurd met de volgende code: #foreach($media in $object.media). (let op: als er gebruik wordt gemaakt van een #foreach om te zoeken dient er ook aangegeven te worden waar er gestopt dient te worden (#end) met zoeken. Helemaal onderaan het vakje staat de code #end. Daar zal worden gestopt met zoeken.
Omdat we niet weten hoeveel foto’s er bij het object zijn ingevoerd, maar dat we wel de 2e foto van het object  willen zien gaan we een vergelijking maken met de code: #if($func.util.equals($teller, 1)). (let op: als er een #if staat dient deze ook te worden afgesloten met een #end) Deze code zegt eigenlijk; als het nummer van de foto in het lijstje gelijk is aan nummer 1 ga dan verder. Zo niet dan kan de volgende code worden genegeerd. Wordt er wel een foto 2 gevonden dan volgt de volgende code: $func.util.getRTFImage($media, 80, 60). 
Nu willen we ook graag de omschrijving van de foto tonen, dat kan met de volgende code worden gedaan: $media.mediatitle.
Als laatste stap dient de teller te worden opgehoogd met 1, zodoende weten we voor de volgende foto dat deze foto 2 is. Dit doen we met de code: #set ($teller = $teller + 1).

«#set ($object = $data.letter.project.lin»

«$func.util.getRTFImage($object, 80, 60)»

«$media.mediatitle»	
«#set($teller=0)#foreach($media in $objec»«#if($func.util.equals($teller, 1))»«$func.util.getRTFImage($media, 80, 60)»

«$media.mediatitle»«#end #set ($teller = $teller + 1) #end»	
«#set($teller=0)#foreach($media in $objec»«#if($func.util.equals($teller, 2))»«$func.util.getRTFImage($media, 80, 60)» 

«$media.mediatitle»«#end #set ($teller = $teller + 1) #end»	
«#set($teller=0)#foreach ($media in $obje»«#if($func.util.equals($teller, 3))»«$func.util.getRTFImage($media, 80, 60)» 

«$media.mediatitle»«#end #set ($teller = $teller + 1) #end»	
«#set($teller=0)#foreach($media in $objec»«#if($func.util.equals($teller, 4))»«$func.util.getRTFImage($media, 80, 60)» 

«$media.mediatitle»«#end #set ($teller = $teller + 1) #end»	

«#set($teller=0)#foreach($media in $objec»«#if($func.util.equals($teller, 5))»«$func.util.getRTFImage($media, 80, 60)»

«$media.mediatitle»«#end #set ($teller = $teller + 1) #end»	
«#set($teller=0)#foreach($media in $objec»«#if ($func.util.equals($teller, 6))»«$func.util.getRTFImage($media, 80, 60)» 

«$media.mediatitle»«#end #set ($teller = $teller + 1) #end»	
«#set($teller=0)#foreach($media in $objec»«#if ($func.util.equals($teller, 7))»«$func.util.getRTFImage($media, 80, 60)» 

«$media.mediatitle»«#end #set ($teller = $teller + 1) #end»	
«#set($teller=0)#foreach($media in $objec»«#if ($func.util.equals($teller, 8))»«$func.util.getRTFImage($media, 80, 60)» 

«$media.mediatitle»«#end #set ($teller = $teller + 1) #end»	
«#set($teller=0)#foreach($media in $objec»«#if ($func.util.equals($teller, 9))»«$func.util.getRTFImage($media, 80, 60)» 

«$media.mediatitle»«#end #set ($teller = $teller + 1) #end»	

«#set($teller=0)#foreach($media in $objec»«#if($func.util.equals($teller, 10))»«$func.util.getRTFImage($media, 80, 60)»

«$media.mediatitle»«#end #set ($teller = $teller + 1) #end»	
«#set($teller=0)#foreach($media in $objec»«#if ($func.util.equals($teller, 11))»«$func.util.getRTFImage($media, 80, 60)» 

«$media.mediatitle»«#end #set ($teller = $teller + 1) #end»	
«#set($teller=0)#foreach($media in $objec»«#if ($func.util.equals($teller, 12))»«$func.util.getRTFImage($media, 80, 60)» 

«$media.mediatitle»«#end #set ($teller = $teller + 1) #end»	
«#set($teller=0)#foreach($media in $objec»«#if ($util.equals($teller, 13))»«$func.util.getRTFImage($media, 80, 60)» 

«$media.mediatitle»«#end #set ($teller = $teller + 1) #end»	
«#set($teller=0)#foreach($media in $objec»«#if ($func.util.equals($teller, 14))»«$func.util.getRTFImage($media, 80, 60)» 

«$media.mediatitle»«#end #set ($teller = $teller + 1) #end»	

Plaatje van het bedrijfslogo toevoegen: $data.companyInfo.logo. 
Hiermee wordt het bedrijfslogo in het document geplaatst (300 * 60 pixels). Een bedrijfslogo kan worden geupload onder kopje Beheer > Instellingen > Systeem > Beheer Bedrijfsgegevens.

Code:	«$data.companyInfo.logo»	

Resultaat:

1.6.2	Email

Om een plaatje in een email toe te voegen bestaan er diverse mogelijkheden, echter zal hier enkel de internetURL worden uitgelegd omdat deze de meest toegankelijke is en middels de widht en height aangepast kan worden naar elk gewenst formaat.

Om de internetURL toe te voegen in een email (email is gekoppeld aan een object) kan de volgende code worden gebruikt:

LET OP: deze codes kunnen het beste in het template worden gezet door eerst op de knop ‘Code’ te klikken van de editor. 

Code:	#set ($object = $data.email.project.linkedEntity) #set ($teller=0) #foreach ($media in $object.media) #if ($util.equals($teller, 0)) <img width="100" height="75" border="0" src="$media.internetURL" /> <br />
$media.mediatitle #end #set ($teller = $teller + 1)  #end	

Toelichting op de code:
Als eerst wordt de code korter gemaakt door een #set te gebruiken ( #set ($object = $data.email.project.linkedEntity) ) vervolgens dient er weer geteld te worden en te beginnen met de teller op nul te zetten: #set ($teller=0). 
 Nu gaan we de hele lijst doorzoeken naar alle foto’s die het object bevat: #foreach ($media in $object.media) (let op: deze code dient ook weer afgesloten te worden met een #end )
Aangezien we de eerste foto willen zien in de email zorgen we ervoor dat de teller hier alleen foto 0 toont. Dit kan met de code: ($util.equals($teller, 0))
Omdat een e-mail altijd opgemaakt wordt in HTML code kan nu niet direct  de internetURL worden aangeroepen. Dit moet nu op de volgende manier: <img width="100" height="75" border="0" src="$media.internetURL" alt="" />
In deze is er gekozen om de breedte (width) van 100 pixels mee te geven aan de foto en een hoogte (height) van 75 pixels. Tevens willen we alleen de foto zien en geen rand er om heen (border=”0”). Hierna plaatsen we een enter met de code: <br />. 
Bij een foto kan ook een omschrijving worden ingevuld en met de code: $media.mediatitle wordt deze onder de foto geplaatst.
Als laatste wordt de teller met 1 opgehoogd voor de volgende foto: #set ($teller = $teller + 1)

Resultaat:

Bij alle volgende foto’s kan dezelfde code worden gebruikt, echter dient dan alleen het nummertje van de teller te worden opgehoogd met 1: #if ($util.equals($teller, 1)) >> #if ($util.equals($teller, 2)) enz. enz.

2.0	Geavanceerde mogelijkheden

2.1	Gebruik van if 

Het is ook mogelijk om gebruik te maken van een #if constructie. Hierbij kan je bijvoorbeeld eerst controleren of een veld leeg is (of een bepaalde waarde bevat), zo ja doe dan A, zo niet (#else) doe dan B.

In onderstaand voorbeeld wordt er eerst gecontroleerd of de gekoppelde relatie aan een brief geen e-mail adres heeft. Klopt dat, dan komt er de tekst ‘u wordt per post op de hoogte gehouden’. Klopt het niet, dus de relatie heeft wel een e-mail adres dan komt er de tekst: ‘u wordt per e-mail op de hoogte gehouden + het desbetreffende e-mail adres’.

Code:	«#if ($func.util.isEmpty($data.letter.rel»  u wordt per post op de hoogte gehouden«#else» u wordt per e-mail op de hoogte gehouden ( «$data.letter.relation.email» )«#end»	

Met een uitroepteken voor de func.util kan er worden aangegeven of er gekeken moet worden of het veld niet leeg is.

Code:	«#if (!$func.util.isEmpty($data.letter.re» tekst «#else» tekst «#end»	

2.2	V5 Template Utils

Voor de versie 5 template code zijn ook een aantal functies (utils) gemaakt. Om erachter te komen welke functies er beschikbaar zijn kan gebruikt gemaakt worden van:

Code:	«$func.dump()»	

Hieronder worden een aantal veelgebruikte utils toegelicht.

2.2.1	$func.util

Namespace $func.util 
              boolean $func.util.isEmptyOrZero (Object)  
             boolean $func.util.equals (Object, Object) 
             boolean $func.util.contains (Object, Object) 
           DataProxy $func.util.count (Object) 
             boolean $func.util.isEmpty (Object) 
           DataProxy $func.util.replace (Object, Object, Object) 
           ArrayList $func.util.split (DataProxy, String) 
              String $func.util.toLowerCase (Object) 
              String $func.util.toUpperCase (Object) 
                List $func.util.keySet (DataProxy) 
                void $func.util.sort (List, String, boolean) 	

boolean $func.util.isEmptyOrZero (Object)

Het kan ook zijn dat je wilt controleren of een veld niet leeg is of een 0 bevat. Hieronder staat de code om de prijs van een object. Als er een koopprijs is ingevuld dan wordt deze getoond, anders wordt de huurprijs getoond (indien deze is ingevuld).

Code:	«#if(!$util.isEmptyOrZero($data.letter.pr»«€ $data.letter.project.linkedEntity.liss»«#end»«#if(!$util.isEmptyOrZero($data.letter.pr»«€ $object.lisrentpr $object.lisrentcon»«#end»«#if(!$util.isEmptyOrZero($data.letter.pr» «$data.letter.project.linkedEntity.lissal»«#end»	

2.2.2	$func.math

Met de optie $func.math kan er gerekend worden met de waarde uit verschillende velden:

Namespace $func.math 
           DataProxy $func.math.add (Object, Object) 
           DataProxy $func.math.min (Object, Object) 
           Number $func.math.getNumber (Object) 
           Object $func.math.divide (Object, Object) 
           Object $func.math.multiply (Object, Object) 
           boolean $func.math.isLess (Object, Object) 
           DataProxy $func.math.percentage (Object, Object) 
           DataProxy $func.math.minimum (Object, Object) 
           boolean $func.math.isBigger (Object, Object) 
           DataProxy $func.math.maximum (Object, Object)	

Algemene utility methodes 
$bool = $func.util.equals($var1, $var2) - Deze methode geeft ja terug als deze vars geformat in het template gelijk zouden zijn. Subtiel onderscheid, een double 2.0 is niet gelijk aan een integer 2.0, dus die zijn wel gelijk geformat in het template. Anders nee. 
$bool = $func.util.isEmpty($var) - Als de var leeg is of niet bestaat dan ja, anders nee 
$bool = $func.util.isEmptyOrZero($var) - Als de var leeg is of niet bestaat of 0 dan ja, anders nee 
$bool = $func.util.isTrue($var) - Als var is true of <> 0 dan ja, anders nee

Het resultaat wordt onderverdeeld in een aantal groepen:
Namespace 		$func.data
Namespace 		$func.email 
Namespace 		$func.util
DataProxy 		$func.util.now ()
Namespace 		$func.math

Deze worden hier onder per groep uitgelegd:

  $func.data

  Namespace $func.data 
           DataProxy $func.data.load (String, Object) 
                List $func.data.search (Map) 
                void $func.data.checkSecurity (Class) 	

$func.email

  Namespace $func.email 
                void $func.email.send (Map) 	

 $func.util.now ()

DataProxy $func.util.now () 
             String $func.util.glue (List, String) 
             String $func.util.lbl (Object) 
             String $func.util.proper (Object) 
             DataProxy $func.util.sum (List, String) 
             List $func.util.groupBy (List, String) 
             boolean $func.util.isLess (Object, Object) 
             boolean $func.util.isTrue (Object) 
             boolean $func.util.isBigger (Object, Object) 
             String $func.util.properFirst (Object) 
             boolean $func.util.isEmptyOrZero (Object) 
             String $func.util.getRTFImage (DataProxy, int, int) 
             String $func.util.getRTFImageByHeight (DataProxy, int) 
             String $func.util.getRTFImageByWidth (DataProxy, int) 
             List $func.util.makeNewList (List, String) 
             DataProxy $func.util.avg (List, String) 
             DataProxy $func.util.escapeForHTMLFormValue (DataProxy) 
             DataProxy $func.util.dateAdd (DataProxy, String, int)