From 985d536ff1e0cda71f7449c5359e7ac78f998d3c Mon Sep 17 00:00:00 2001
From: Vinzent Broens <v.broens@adito.de>
Date: Wed, 27 Oct 2021 14:05:44 +0000
Subject: [PATCH] Service 2001481 mosaico

---
 .../ServiceEmail_entity.aod                   |  7 ++++
 entity/ServiceEmail_entity/afterUiInit.js     |  6 +--
 .../choosetexttoforward/onValueChange.js      | 13 +++---
 .../document_template/onValueChange.js        | 14 ++++---
 .../email_body_content/displayValueProcess.js | 11 +++++
 .../email_body_content/valueProcess.js        |  3 +-
 entity/ServiceEmail_entity/onValidation.js    | 34 ++++++++++++++-
 .../_____LANGUAGE_de/_____LANGUAGE_de.aod     | 19 ++++++---
 .../ServiceEmailEdit_view.aod                 |  9 +++-
 .../ServiceForwardEmailEdit_view.aod          | 13 +++++-
 .../_____PREFERENCES_PROJECT.aod              |  5 ++-
 process/ServiceEmail_lib/process.js           | 41 +++++++++++--------
 12 files changed, 129 insertions(+), 46 deletions(-)
 create mode 100644 entity/ServiceEmail_entity/entityfields/email_body_content/displayValueProcess.js

diff --git a/entity/ServiceEmail_entity/ServiceEmail_entity.aod b/entity/ServiceEmail_entity/ServiceEmail_entity.aod
index 320cc965fd7..6b682e03726 100644
--- a/entity/ServiceEmail_entity/ServiceEmail_entity.aod
+++ b/entity/ServiceEmail_entity/ServiceEmail_entity.aod
@@ -40,6 +40,7 @@
       <title>Email content</title>
       <contentType>HTML</contentType>
       <valueProcess>%aditoprj%/entity/ServiceEmail_entity/entityfields/email_body_content/valueProcess.js</valueProcess>
+      <displayValueProcess>%aditoprj%/entity/ServiceEmail_entity/entityfields/email_body_content/displayValueProcess.js</displayValueProcess>
     </entityField>
     <entityField>
       <name>BINDATA</name>
@@ -279,6 +280,12 @@
       <name>RequestorContactId_param</name>
       <expose v="true" />
     </entityParameter>
+    <entityField>
+      <name>textbox</name>
+      <title>Input</title>
+      <contentType>HTML</contentType>
+      <htmlEditorFeatures>BASIC</htmlEditorFeatures>
+    </entityField>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
diff --git a/entity/ServiceEmail_entity/afterUiInit.js b/entity/ServiceEmail_entity/afterUiInit.js
index 457c932e3ae..8be3a41be16 100644
--- a/entity/ServiceEmail_entity/afterUiInit.js
+++ b/entity/ServiceEmail_entity/afterUiInit.js
@@ -93,7 +93,7 @@ if(vars.get("$param.TicketCode_param"))
 // SIGNATURE
 if(vars.exists("$param.SignatureId_param") && vars.get("$param.SignatureId_param")) 
 {
-     vars.set("$field.signature", getSignatureContent(vars.get("$param.SignatureId_param")));
+     vars.set("$field.signature", ServiceMailUtils.getSignatureContent(vars.get("$param.SignatureId_param")));
 }
   
 // INITIAL BODY HISTORY
@@ -102,7 +102,7 @@ if(vars.exists("$param.SignatureId_param") && vars.get("$param.SignatureId_param
 var initialEmailBodyRaw = "";
 
 // set body as last activity. if does not exist take the ticket description
-let mostRecentActivityBodyPart = getBodyHistoryFromActivity(null, ticketID, "mostRecent",
+let mostRecentActivityBodyPart = ServiceMailUtils.getBodyHistoryFromActivity(null, ticketID, "mostRecent",
                             vars.get("$param.From_param"),vars.get("$param.SenderEmail_param"));
 
 if(mostRecentActivityBodyPart)
@@ -111,7 +111,7 @@ if(mostRecentActivityBodyPart)
 }
 else
 {
-    initialEmailBodyRaw =  getBodyHistory(
+    initialEmailBodyRaw =  ServiceMailUtils.getBodyHistory(
                                 vars.get("$param.From_param"), // from
                                 vars.get("$param.SenderEmail_param"), // sender
                                 vars.get("$param.TicketSubject_param"), //subject
diff --git a/entity/ServiceEmail_entity/entityfields/choosetexttoforward/onValueChange.js b/entity/ServiceEmail_entity/entityfields/choosetexttoforward/onValueChange.js
index 82b8c69f934..2f2f66c4965 100644
--- a/entity/ServiceEmail_entity/entityfields/choosetexttoforward/onValueChange.js
+++ b/entity/ServiceEmail_entity/entityfields/choosetexttoforward/onValueChange.js
@@ -1,3 +1,4 @@
+import("Util_lib");
 import("ServiceEmail_lib");
 import("system.datetime");
 import("system.vars");
@@ -11,7 +12,7 @@ let choosenValue = vars.get("$field.chooseTextToForward");
 
 if(choosenValue == "originalTicket")
 {
-   emailBodyHystoryText =  getBodyHistory(
+   emailBodyHystoryText =  ServiceMailUtils.getBodyHistory(
                         vars.get("$param.From_param"), // from
                         vars.get("$param.SenderEmail_param"), // sender
                         vars.get("$param.TicketSubject_param"), //subject
@@ -22,7 +23,7 @@ if(choosenValue == "originalTicket")
 } 
 else if(choosenValue == "allActivities") 
 {                               
-    emailBodyHystoryText = getBodyHistoryForAllActivities(
+    emailBodyHystoryText = ServiceMailUtils.getBodyHistoryForAllActivities(
                                 vars.get("$param.TicketId_param"), vars.get("$param.TaskId_param"),// ticketID, taskID, 
                                 "intern", // kind
                                 vars.get("$param.From_param"), vars.get("$param.SenderEmail_param"),  //from, sender,
@@ -32,14 +33,10 @@ else if(choosenValue == "allActivities")
 } 
 else if(choosenValue != "")
 {  // one specific activityId
-    emailBodyHystoryText = getBodyHistoryFromActivity(choosenValue, null,"intern",
+    emailBodyHystoryText = ServiceMailUtils.getBodyHistoryFromActivity(choosenValue, null,"intern",
                                     vars.get("$param.From_param"), vars.get("$param.SenderEmail_param"));
 }
 
 vars.set("$field.emailHistoryRaw", emailBodyHystoryText);
-
-// create complete Email and set the body
-vars.set("$field.EMAIL_BODY_CONTENT",  
-    createBodyEmail(vars.get("$field.choosenDocTemplateRow"), vars.get("$field.signature"), emailBodyHystoryText) );
-    
+vars.set("$field.EMAIL_BODY_CONTENT", ServiceMailUtils.createBodyEmail(null, vars.get("$field.signature"), vars.get("$field.emailHistoryRaw")));
  
\ No newline at end of file
diff --git a/entity/ServiceEmail_entity/entityfields/document_template/onValueChange.js b/entity/ServiceEmail_entity/entityfields/document_template/onValueChange.js
index 2228438d46b..93694984a4b 100644
--- a/entity/ServiceEmail_entity/entityfields/document_template/onValueChange.js
+++ b/entity/ServiceEmail_entity/entityfields/document_template/onValueChange.js
@@ -8,14 +8,18 @@ var documentTemplateContent = DocumentTemplateUtils.getTemplate(vars.get("$local
     
 ///REPLACE CONTENT WITH PLACEHOLDERS   
 let contactId = vars.get("$param.ContactId_param");
+var template = new DocumentTemplate(util.encodeBase64String(documentTemplateContent), DocumentTemplate.types.HTML, undefined, true)
 if(contactId != undefined && contactId != null && contactId != "")
 {
-      var template = new DocumentTemplate(util.encodeBase64String(documentTemplateContent), DocumentTemplate.types.HTML, undefined, true)
-      documentTemplateContent = template.getReplacedContentByContactId(contactId, false, true);
+    documentTemplateContent = template.getReplacedContentByContactId(contactId);
 
-} 
+}
+else
+{
+    documentTemplateContent = template.toString();
+}
 vars.set("$field.choosenDocTemplateRow", documentTemplateContent);
 
-vars.set("$field.EMAIL_BODY_CONTENT", 
-        createBodyEmail(documentTemplateContent, vars.get("$field.signature"), vars.get("$field.emailHistoryRaw")));   
+vars.set("$field.textbox", 
+        ServiceMailUtils.createBodyEmail(documentTemplateContent));   
     
\ No newline at end of file
diff --git a/entity/ServiceEmail_entity/entityfields/email_body_content/displayValueProcess.js b/entity/ServiceEmail_entity/entityfields/email_body_content/displayValueProcess.js
new file mode 100644
index 00000000000..96b4a1caacf
--- /dev/null
+++ b/entity/ServiceEmail_entity/entityfields/email_body_content/displayValueProcess.js
@@ -0,0 +1,11 @@
+import("system.result");
+import("Util_lib");
+import("system.neon");
+import("system.vars");
+
+if (vars.get("$sys.viewmode") == neon.FRAME_VIEWMODE_DATASET && vars.get("$field.textbox")) 
+{        
+    var preview = vars.get("$field.EMAIL_BODY_CONTENT")
+    preview = StringUtils.replaceAll(preview.toString(), "{@Service@}", vars.get("$field.textbox"));
+        result.string(preview);
+}
\ No newline at end of file
diff --git a/entity/ServiceEmail_entity/entityfields/email_body_content/valueProcess.js b/entity/ServiceEmail_entity/entityfields/email_body_content/valueProcess.js
index 4e0bc459e31..4ce6957e402 100644
--- a/entity/ServiceEmail_entity/entityfields/email_body_content/valueProcess.js
+++ b/entity/ServiceEmail_entity/entityfields/email_body_content/valueProcess.js
@@ -1,3 +1,4 @@
+import("Util_lib");
 import("system.result");
 import("ServiceEmail_lib");
 import("system.neon");
@@ -11,7 +12,7 @@ if( vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW )
     {
         if(vars.get("$param.InitializeBody_param") == "true")
         {
-           result.string(createBodyEmail(null, vars.get("$field.signature"), vars.get("$field.emailHistoryRaw"))); 
+           result.string(ServiceMailUtils.createBodyEmail(null, vars.get("$field.signature"), vars.get("$field.emailHistoryRaw"))); 
             vars.set("$param.InitializeBody_param", "false");
         }
     }
diff --git a/entity/ServiceEmail_entity/onValidation.js b/entity/ServiceEmail_entity/onValidation.js
index fbfb40d8866..8fda035b9fa 100644
--- a/entity/ServiceEmail_entity/onValidation.js
+++ b/entity/ServiceEmail_entity/onValidation.js
@@ -56,7 +56,39 @@ else
 {
     result.string(errorText);
 }
-    
+
+// CHECK if at least one mail-address is added
+
+var recipientsTo = vars.get("$field.Recipients_TO.insertedRows");
+var recipientsCC = vars.get("$field.Recipients_CC.insertedRows");
+var recipientsBCC = vars.get("$field.Recipients_BCC.insertedRows");
+var gate = false;
+
+recipientsTo.forEach(function(recipient)
+{
+    if (recipient.email_address != "")
+    {
+        gate = true;
+    }
+});
+recipientsCC.forEach(function(recipient)
+{
+    if (recipient.email_address != "")
+    {
+        gate = true;
+    }
+});
+recipientsBCC.forEach(function(recipient)
+{
+    if (recipient.email_address != "")
+    {
+        gate = true;
+    }
+});
+if (!gate)
+{
+    result.string(translate.text("You have to add at least one recipient."));
+}
 
 
     
diff --git a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
index d26ab6e78d8..5556566e197 100644
--- a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
+++ b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
@@ -37,6 +37,10 @@
       <key>Open in mosaico</key>
       <value>In Mosaico öffnen</value>
     </entry>
+    <entry>
+      <key>You have to add at least one recipient.</key>
+      <value>Sie müssen mindestens einen Empfänger eintragen.</value>
+    </entry>
     <entry>
       <key>To re-opening tickets, please use the corresponding action.</key>
       <value>Nutzen Sie bitte die entsprechende Aktion, um Tickets wiederzueröffnen.</value>
@@ -145,7 +149,7 @@
       <key>Template</key>
     </entry>
     <entry>
-      <key>Use all serviceticket categories</key>
+      <key>Use all service ticket categories</key>
       <value>Alle Serviceticket Kategorien verwenden</value>
     </entry>
     <entry>
@@ -377,7 +381,7 @@
       <value>Keine Werbung</value>
     </entry>
     <entry>
-      <key>Contact &amp; Serviceticket</key>
+      <key>Contact &amp; Service ticket</key>
       <value>Kontakt &amp; Serviceticket</value>
     </entry>
     <entry>
@@ -14185,11 +14189,11 @@ Bitte Datumseingabe prüfen</value>
       <key>2</key>
     </entry>
     <entry>
-      <key>Serviceticket category</key>
+      <key>Service ticket category</key>
       <value>Serviceticket-Kategorie</value>
     </entry>
     <entry>
-      <key>Serviceticket categories</key>
+      <key>Service ticket categories</key>
       <value>Serviceticket-Kategorien</value>
     </entry>
     <entry>
@@ -14549,20 +14553,23 @@ Bitte Datumseingabe prüfen</value>
       <key>New Service ticket</key>
     </entry>
     <entry>
-      <key>Service ticket category</key>
+      <key>Serviceticket category</key>
       <value>Serviceticket-Kategorie</value>
     </entry>
     <entry>
       <key>Use all service ticket categories</key>
     </entry>
     <entry>
-      <key>Contact &amp; Service ticket</key>
+      <key>Contact &amp; Serviceticket</key>
       <value>Kontakt &amp; Serviceticket</value>
     </entry>
     <entry>
       <key>Service ticket categories</key>
       <value>Serviceticket-Kategorien</value>
     </entry>
+    <entry>
+      <key>Use all serviceticket categories</key>
+    </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
 </language>
diff --git a/neonView/ServiceEmailEdit_view/ServiceEmailEdit_view.aod b/neonView/ServiceEmailEdit_view/ServiceEmailEdit_view.aod
index e4e3564fe10..4de1652b73a 100644
--- a/neonView/ServiceEmailEdit_view/ServiceEmailEdit_view.aod
+++ b/neonView/ServiceEmailEdit_view/ServiceEmailEdit_view.aod
@@ -71,13 +71,18 @@
           <name>889a816a-d489-42c5-87ca-504c48d5ae3f</name>
           <entityField>chooseTextToForward</entityField>
         </entityFieldLink>
+        <entityFieldLink>
+          <name>e2470001-5d27-452f-83ec-2fb7131dc163</name>
+          <entityField>textbox</entityField>
+        </entityFieldLink>
       </fields>
     </genericViewTemplate>
     <genericViewTemplate>
       <name>ContentEmail</name>
-      <editMode v="true" />
-      <hideEmptyFields v="true" />
+      <editMode v="false" />
+      <hideEmptyFields v="false" />
       <entityField>#ENTITY</entityField>
+      <isEditable v="false" />
       <fields>
         <entityFieldLink>
           <name>78a3d546-f2ed-4798-8aa9-72e56df3b0b3</name>
diff --git a/neonView/ServiceForwardEmailEdit_view/ServiceForwardEmailEdit_view.aod b/neonView/ServiceForwardEmailEdit_view/ServiceForwardEmailEdit_view.aod
index 2107a0c59fc..52f68ef001b 100644
--- a/neonView/ServiceForwardEmailEdit_view/ServiceForwardEmailEdit_view.aod
+++ b/neonView/ServiceForwardEmailEdit_view/ServiceForwardEmailEdit_view.aod
@@ -69,7 +69,18 @@
           <entityField>chooseTextToForward</entityField>
         </entityFieldLink>
         <entityFieldLink>
-          <name>5a6feff6-22b1-4358-b1f6-0073114d4a3b</name>
+          <name>ad1b9985-3b8a-4793-8534-57ea9c9f3e63</name>
+          <entityField>textbox</entityField>
+        </entityFieldLink>
+      </fields>
+    </genericViewTemplate>
+    <genericViewTemplate>
+      <name>ContentEmail</name>
+      <hideEmptyFields v="false" />
+      <isEditable v="false" />
+      <fields>
+        <entityFieldLink>
+          <name>d53c5a09-2834-4f13-98a1-01faa45b06bc</name>
           <entityField>EMAIL_BODY_CONTENT</entityField>
         </entityFieldLink>
       </fields>
diff --git a/preferences/_____PREFERENCES_PROJECT/_____PREFERENCES_PROJECT.aod b/preferences/_____PREFERENCES_PROJECT/_____PREFERENCES_PROJECT.aod
index b82552621a3..a8160a1096c 100644
--- a/preferences/_____PREFERENCES_PROJECT/_____PREFERENCES_PROJECT.aod
+++ b/preferences/_____PREFERENCES_PROJECT/_____PREFERENCES_PROJECT.aod
@@ -56,7 +56,7 @@
       <intervall v="5000" />
       <bridgeMode v="3" />
       <flagMode v="2" />
-      <process>mailbridge</process>
+      <process>mailbridge_service</process>
       <errorProcess></errorProcess>
       <attachmentHandling>ALL</attachmentHandling>
     </mailbridgeMailserver>
@@ -105,6 +105,7 @@
     <customStringProperty>
       <name>bulkmail.baseReplacementURL</name>
       <description>Base url for replacement of redirectlinks in bulkmails</description>
+      <property></property>
     </customStringProperty>
   </customConfigProperties>
   <customProperties>
@@ -218,10 +219,12 @@
     <customStringProperty>
       <name>bulkmail.user</name>
       <description>Title of the useraccount that is used to send bulkmails</description>
+      <property>mailbridgeDev</property>
     </customStringProperty>
     <customStringProperty>
       <name>mosaico.url</name>
       <description>Url of the Mosaico Email Editor</description>
+      <property>https://mosaico.xrm-service.dev.c2.adito.cloud</property>
     </customStringProperty>
   </customProperties>
 </preferences>
diff --git a/process/ServiceEmail_lib/process.js b/process/ServiceEmail_lib/process.js
index 5fc836f7868..b95659af157 100644
--- a/process/ServiceEmail_lib/process.js
+++ b/process/ServiceEmail_lib/process.js
@@ -7,13 +7,20 @@ import("system.translate");
 import("system.vars");
 import("DocumentTemplate_lib")
 
-
+/**
+ * Provides functions for ServiceMail.
+ * 
+ * Do not create an instance of this!
+ * 
+ * @class
+ */
+function ServiceMailUtils () {}
 /**
  *  @description   Creates the header for the Text history
  *  
  *  @return     Header as a string
  */
-function headerTextHistory()
+ServiceMailUtils.headerTextHistory = function ()
 {
     var textForBody ="<hr>";
     textForBody +=" <p>-----"+ translate.text("Original message") +"----- </p>";
@@ -33,10 +40,10 @@ function headerTextHistory()
  *  
  *  @return     string with the original message, send date and time
  */
-function getBodyHistory(pTo,pSender,pSubject,pTicketCode,pTicketID, pTaskID)
+ServiceMailUtils.getBodyHistory = function(pTo,pSender,pSubject,pTicketCode,pTicketID, pTaskID)
 {
     //add Subject and From
-    var textForBody  = headerTextHistory(); 
+    var textForBody  = ServiceMailUtils.headerTextHistory(); 
 
     if(!pTaskID)
     {
@@ -100,7 +107,7 @@ function getBodyHistory(pTo,pSender,pSubject,pTicketCode,pTicketID, pTaskID)
  *  
  *  @return     string with the original message, send date and time
  */    
-function getBodyHistoryFromActivity(pActivityID, pTicketID, pKind, pTo, pSender)
+ServiceMailUtils.getBodyHistoryFromActivity = function(pActivityID, pTicketID, pKind, pTo, pSender)
 {
     var activityInfo = [];
     
@@ -130,7 +137,7 @@ function getBodyHistoryFromActivity(pActivityID, pTicketID, pKind, pTo, pSender)
     if(activityInfo && activityInfo.length > 0)
     {
         
-        var textForBody  = headerTextHistory(); 
+        var textForBody  = ServiceMailUtils.headerTextHistory(); 
         
         textForBody +="<p>";
         
@@ -197,14 +204,14 @@ function getBodyHistoryFromActivity(pActivityID, pTicketID, pKind, pTo, pSender)
  *  
  *  @return     string with the original message, send date and time
  */ 
-function getBodyHistoryForAllActivities(pTicketID, pTaskID, pKind, pTo, pSender, pSubject, pTicketCode)
+ServiceMailUtils.getBodyHistoryForAllActivities = function(pTicketID, pTaskID, pKind, pTo, pSender, pSubject, pTicketCode)
 {
     
     // first original ticket
     var textForBody = "";
     
     // get original erst
-    textForBody += getBodyHistory(pTo,pSender,pSubject,pTicketCode,pTicketID, pTaskID)
+    textForBody += ServiceMailUtils.getBodyHistory(pTo,pSender,pSubject,pTicketCode,pTicketID, pTaskID)
     
     var allActivities = newSelect("ACTIVITYID")
             .from("ACTIVITY")
@@ -217,7 +224,7 @@ function getBodyHistoryForAllActivities(pTicketID, pTaskID, pKind, pTo, pSender,
             
     allActivities.forEach(function(activityId)
     { 
-         textForBody += getBodyHistoryFromActivity(activityId, null, pKind, pTo,pSender);
+         textForBody += ServiceMailUtils.getBodyHistoryFromActivity(activityId, null, pKind, pTo,pSender);
     });     
     
     return textForBody;
@@ -231,7 +238,7 @@ function getBodyHistoryForAllActivities(pTicketID, pTaskID, pKind, pTo, pSender,
  *  
  *  @return     string the signature
  */ 
-function getSignatureContent(pSignatureID)
+ServiceMailUtils.getSignatureContent = function(pSignatureID)
 {
     let dokumentTemplateId = newSelect("SIGNATURE_DOCUMENTTEMPLATE_ID")
         .from("MAILSIGNATURE")
@@ -267,7 +274,7 @@ function getSignatureContent(pSignatureID)
  *  
  *  @return     string the signature without placeholder
  */ 
-function getSignatureWithoutPlaceholder(pDocumentContent)
+ServiceMailUtils.getSignatureWithoutPlaceholder = function(pDocumentContent)
 {
 // 
     ///DELETE PLACEHOLDERS    
@@ -285,23 +292,23 @@ function getSignatureWithoutPlaceholder(pDocumentContent)
 /**
  *  @description   create the email body for the answer email
  *  
- *  @param {String}      pDocumentTemplate the documenttemplate used to create the first part of the mail
+ *  @param {String}      pDocumanteTemplate the documenttemplate used to create the first part of the mail
  *  @param {String}      pSignature the signature to be added below the documentTemplate
- *  @param {String}      phistoryEmailText the original mail added at the bottom of the mail
+ *  @param {String}      pHistoryEmailText the original mail added at the bottom of the mail
  *  
  *  @return     string the signature without placeholder
  */ 
-function createBodyEmail(pDocumanteTemplate, pSignature, pHistoryEmailText)
+ServiceMailUtils.createBodyEmail = function(pDocumanteTemplate, pSignature, pHistoryEmailText)
 {
     var emailBody = "";
     
     if(pDocumanteTemplate)
     {
-        emailBody = "<p>" + pDocumanteTemplate + "</p>" ;
+        emailBody = pDocumanteTemplate ;
     }
     else
     {
-         emailBody = "<br/><br/>";  // place to write
+         emailBody = "";  // place to write
     }
     
     if(pSignature)
@@ -309,8 +316,6 @@ function createBodyEmail(pDocumanteTemplate, pSignature, pHistoryEmailText)
         emailBody += pSignature ;
     }
     
-    emailBody += "</br>"
-    
     if(pHistoryEmailText)
     {
         emailBody += pHistoryEmailText ;
-- 
GitLab