I am completely new to Velocity Scripting and have been tasked with setting up German Salutation to auto populate. Can you tell me if this would work or what is wrong with it. My email will basically have a {{My.Salutation}} at the top that will pipe in the salutation based on the script token below. Thanks in advance for any help.
#if (${lead.Salutation} == "")
Sehr geehrte/r Frau/Herr ${lead.last_Name}
#elseif
(${lead.Salutation} == "Herr")
Sehr geehrter Herr ${lead.last_Name}
#elseif
(${lead.Salutation} == "Frau")
Sehr geehrte Frau ${lead.last_Name}
#elseif
(${lead.Salutation} == "Herr Dr.")
Sehr geehrter Herr Dr. ${lead.last_Name}
#elseif
(${lead.Salutation} == "Frau Dr.")
Sehr geehrte Frau Dr. ${lead.last_Name}
#elseif
(${lead.Salutation} == "Herr Prof.")
Sehr geehrter Herr Prof. ${lead.last_Name}
#elseif
(${lead.Salutation} == "Frau Prof.")
Sehr geehrte Frau Prof. ${lead.last_Name}
#elseif
(${lead.Salutation} == "Herr Prof. Dr.")
Sehr geehrter Herr Prof. Dr. ${lead.last_Name}
#elseif
(${lead.Salutation} == "Frau Prof. Dr.")
Sehr geehrte Frau Prof. Dr. ${lead.last_Name}
#end
So, just taking a cursory look at this, this script could be incredibly simplified to:
#set ($greetCheck = ${lead.Salutation})
#if ($greetCheck.contains('Herr'))
Sehr geehter $greetCheck ${lead.LastName}
#elseif ($greetCheck.contains('Frau'))
Sehr geehrte $greetCheck {lead.LastName}
#else
Sehr geehrte/r Frau/Herr ${lead.LastName}
#end
which should work just fine for you.
It's not really a contains, though. It's like a startsWith\b, which needs a regex. Plus unknown Salutations aren't necessarily supposed to be output.
You want to use a dictionary object, rather than a lot of conditions. Also looks there's a lot of repetition here:
So following the DRY (Don't Repeat Yourself) maxim, let's check only if the field starts with your interesting words, rather than a full match:
#set( $greetingsBySalutationStart = {
"Herr" : "Sehr geehrter",
"Frau" : "Sehr geehrte",
"$" : "Sehr geehrte/r Frau/Herr"
})
## ---- NO NEED TO TOUCH ANYTHING BELOW THIS LINE! ----
#set( $greeting = $greetingsBySalutationStart["$"] )
#foreach( $startPattern in $greetingsBySalutationStart.keySet() )
#if( $lead.Salutation.matches("^${startPattern}\b.*") )
#set( $greeting = "${greetingsBySalutationStart[$startPattern]} ${lead.Salutation}" )
#end
#end
${greeting} ${lead.LastName}
Notes:
Hi Sanford Whiteman
So does the start of this script check if the Salutation contains "Herr" or "Frau" or if it equals "Herr" or "Frau"? The reason Im asking is because our German forms actually have all 8 of the salutations mentioned above.
Thanks,
Gerard
The object at the top (the dictionary) is of *first words* in the salutation.
It's used in the code with a regex (pattern match) fixed to the start of the string. So "Herr" will match just "Herr," and also "Herr Prof," "Herr Dr." or "Herr Anything." But it won't (purposely) match "Herry" or "John Herr" -- those would use the default greeting.
Hi Sanford Whiteman,
For some reason I couldn't get that to work, it kept defaulting to the general salutation. I managed to get the version below to work. I based it off the documentation. It is certainly not nice looking and isn't following DRY principles but it works for the meantime.
##check if the Salutation is Herr
#if(${lead.Salutation} == "Herr")
##if the Salutation is Herr, use the salutation 'Sehr geehrter Herr'
#set($greeting = "Sehr geehrter Herr ${lead.LastName},")
##check is the Salutation is Frau
#elseif(${lead.Salutation} == "Frau")
##if female, use the salutation 'Sehr geehrte Frau'
#set($greeting = "Sehr geehrte Frau ${lead.LastName},")
##check if the Salutation is Herr Dr.
#elseif(${lead.Salutation} == "Herr Dr.")
##if the Salutation is Herr Dr., use the salutation 'Sehr geehrter Herr'
#set($greeting = "Sehr geehrter Herr Dr. ${lead.LastName},")
##check is the Salutation is Frau Dr.
#elseif(${lead.Salutation} == "Frau Dr.")
##if Frau Dr., use the salutation 'Sehr geehrte Frau Dr.'
#set($greeting = "Sehr geehrte Frau Dr. ${lead.LastName},")
##check is the Salutation is Herr Prof.
#elseif(${lead.Salutation} == "Herr Prof.")
##if Herr Prof., use the salutation 'Sehr geehrter Herr Prof.'
#set($greeting = "Sehr geehrter Herr Prof. ${lead.LastName},")
##check is the Salutation is Frau Prof.
#elseif(${lead.Salutation} == "Frau Prof.")
##if Frau Prof., use the salutation 'Sehr geehrte Frau Prof.'
#set($greeting = "Sehr geehrte Frau Prof. ${lead.LastName},")
##check is the Salutation is Herr Prof. Dr.
#elseif(${lead.Salutation} == "Herr Prof. Dr.")
##if Herr Prof. Dr., use the salutation 'Sehr geehrter Herr Prof. Dr.'
#set($greeting = "Sehr geehrter Herr Prof. Dr. ${lead.LastName},")
##check is the Salutation is Frau Prof. Dr.
#elseif(${lead.Salutation} == "Frau Prof. Dr.")
##if Frau Prof. Dr., use the salutation 'Sehr geehrte Frau Prof. Dr.'
#set($greeting = "Sehr geehrte Frau Prof. Dr. ${lead.LastName},")
#else
##otherwise, use this Salutation
#set($greeting = "Sehr geehrte/r Frau/Herr ${lead.FirstName},")
#end
##print the greeting and some content
${greeting}
My code was tested thoroughly against representative test values... can't really comment on this monstrosity but I hope you will give another try for cleaner code later.
Run this test:
#set( $testLead1 = {
"LastName" : "Namor",
"Salutation" : "Herr"
})
#set( $greetingsBySalutationStart = {
"Herr" : "Sehr geehrter",
"Frau" : "Sehr geehrte",
"$" : "Sehr geehrte/r Frau/Herr"
})
#set( $greeting = $greetingsBySalutationStart["$"] )
#foreach( $startPattern in $greetingsBySalutationStart.keySet() )
#if( $testLead1.Salutation.matches("^${startPattern}\b.*") )
#set( $greeting = "${greetingsBySalutationStart[$startPattern]} ${testLead1.Salutation}" )
#end
#end
${greeting} ${testLead1.LastName}
#set( $testLead2 = {
"LastName" : "Lastman",
"Salutation" : "Herr Dr."
})
#set( $greetingsBySalutationStart = {
"Herr" : "Sehr geehrter",
"Frau" : "Sehr geehrte",
"$" : "Sehr geehrte/r Frau/Herr"
})
#set( $greeting = $greetingsBySalutationStart["$"] )
#foreach( $startPattern in $greetingsBySalutationStart.keySet() )
#if( $testLead2.Salutation.matches("^${startPattern}\b.*") )
#set( $greeting = "${greetingsBySalutationStart[$startPattern]} ${testLead2.Salutation}" )
#end
#end
${greeting} ${testLead2.LastName}
#set( $testLead3 = {
"LastName" : "Whiteman",
"Salutation" : "Friar"
})
#set( $greetingsBySalutationStart = {
"Herr" : "Sehr geehrter",
"Frau" : "Sehr geehrte",
"$" : "Sehr geehrte/r Frau/Herr"
})
#set( $greeting = $greetingsBySalutationStart["$"] )
#foreach( $startPattern in $greetingsBySalutationStart.keySet() )
#if( $testLead3.Salutation.matches("^${startPattern}\b.*") )
#set( $greeting = "${greetingsBySalutationStart[$startPattern]} ${testLead3.Salutation}" )
#end
#end
${greeting} ${testLead3.LastName}
#set( $testLead4 = {
"LastName" : "Absent",
"Salutation" : ""
})
#set( $greetingsBySalutationStart = {
"Herr" : "Sehr geehrter",
"Frau" : "Sehr geehrte",
"$" : "Sehr geehrte/r Frau/Herr"
})
#set( $greeting = $greetingsBySalutationStart["$"] )
#foreach( $startPattern in $greetingsBySalutationStart.keySet() )
#if( $testLead4.Salutation.matches("^${startPattern}\b.*") )
#set( $greeting = "${greetingsBySalutationStart[$startPattern]} ${testLead4.Salutation}" )
#end
#end
${greeting} ${testLead4.LastName}
Expected (and observed on my primary instance) output:
Sehr geehrter Herr Namor
Sehr geehrter Herr Dr. Lastman
Sehr geehrte/r Frau/Herr Whiteman
Sehr geehrte/r Frau/Herr Absent