From c3a9ea49c8aa2861a436b776527fbb12144069e6 Mon Sep 17 00:00:00 2001
From: Vinzent Broens <v.broens@adito.de>
Date: Wed, 27 Oct 2021 10:23:52 +0000
Subject: [PATCH] Service 2001297 serial action

---
 .../recordcontainers/jdito/onInsert.js        |   5 +-
 .../changedata/onActionProcess.js             | 122 +++++++++++++-----
 .../reopenticket/onActionProcess.js           |   8 +-
 .../returnticket/onActionProcess.js           |  17 ++-
 .../recordcontainers/db/onDBInsert.js         |  14 +-
 .../recordcontainers/db/onDBUpdate.js         |  19 +--
 .../_____LANGUAGE_EXTRA.aod                   |  18 +++
 .../_____LANGUAGE_de/_____LANGUAGE_de.aod     |  48 +++++--
 .../_____LANGUAGE_en/_____LANGUAGE_en.aod     |  18 +++
 9 files changed, 207 insertions(+), 62 deletions(-)

diff --git a/entity/ServiceEmail_entity/recordcontainers/jdito/onInsert.js b/entity/ServiceEmail_entity/recordcontainers/jdito/onInsert.js
index 082d2c305a..b8b01338db 100644
--- a/entity/ServiceEmail_entity/recordcontainers/jdito/onInsert.js
+++ b/entity/ServiceEmail_entity/recordcontainers/jdito/onInsert.js
@@ -196,7 +196,8 @@ if(returnedMsgAfterSend == true)
         "directionKeywordId" : $KeywordRegistry.activityDirection$outgoing(),
         "subject"            : infoText,
         "content"            : contentActivity,
-        "categoryKeywordId"  : $KeywordRegistry.activityCategory$mail()
+        "categoryKeywordId"  : $KeywordRegistry.activityCategory$mail(),
+        "responsibleContactId" : vars.get( "$param.ContactId_param")
     };
     var ActivityLink = ["Supportticket", ticketID];
 
@@ -296,7 +297,7 @@ if(returnedMsgAfterSend == true)
         "responsibleContactId" : vars.get( "$param.ContactId_param"),
         "subject"              : translate.text("EMAIL ERROR") + "!",
         "content"              : contentActivity,
-        "categoryKeywordId"    : $KeywordRegistry.activityCategory$mail() 
+        "categoryKeywordId"    : $KeywordRegistry.activityCategory$mail()
     };
     var ActivityLink = ["Supportticket", ticketID];
 
diff --git a/entity/SupportTicketMultiSelect_entity/entityfields/changedata/onActionProcess.js b/entity/SupportTicketMultiSelect_entity/entityfields/changedata/onActionProcess.js
index 41ee4231cb..cb9344c6c3 100644
--- a/entity/SupportTicketMultiSelect_entity/entityfields/changedata/onActionProcess.js
+++ b/entity/SupportTicketMultiSelect_entity/entityfields/changedata/onActionProcess.js
@@ -1,66 +1,126 @@
+import("system.question");
+import("system.logging");
+import("system.neon");
+import("Employee_lib");
 import("ActivityTask_lib");
+import("Sql_lib");
+import("Contact_lib");
+import("KeywordRegistry_basic");
+import("Keyword_lib");
 import("system.translate");
 import("system.tools");
-import("Util_lib");
-import("Sql_lib");
-import("system.neon");
 import("system.vars");
-import("KeywordRegistry_basic");
 
 var taskIDs= JSON.parse(vars.get("$param.TaskIds_param"));
+var taskIDsforStatus = JSON.parse(vars.get("$param.TaskIds_param"));
 var TaskfieldValues = {};
+var TaskfieldValueStatus = {};
 var TicketfieldValues = {};
+var obj_toolsUser = tools.getCurrentUser()[tools.PARAMS];
+var activityContent = [];
+var ChangeCounter = 0;
+var removedIds;
 
 ///  PRIORITY
 if(vars.exists("$field.PRIORITY") && (vars.get("$field.PRIORITY") != "" ))
 {
     TaskfieldValues["PRIORITY"] = vars.get("$field.PRIORITY");
+    activityContent += translate.text("Priority changed to") + ": " + KeywordUtils.getViewValue($KeywordRegistry.taskPriority(), vars.get("$field.PRIORITY"));
 }
 /// STATUS
 if(vars.exists("$field.STATUS") && (vars.get("$field.STATUS") != "" ))
 {
-    TaskfieldValues["STATUS"] = vars.get("$field.STATUS");
-    TicketfieldValues["DATE_EDIT_STATUS"] = vars.get("$sys.date");
-    if(vars.get("$field.STATUS") == $KeywordRegistry.taskStatus$unassigned())
+    if (vars.get("$field.STATUS") != $KeywordRegistry.taskStatus$ended())
     {
-        TicketfieldValues["EDITOR_CONTACT_ID"] = "";
+        // Check whether one of the selected Tickets has the status "ended" and removes them from the selection
+        var endedTicketIds = new SqlBuilder ()
+                            .select("TASK.TASKID")
+                            .from("TASK")
+                            .where("TASK.TASKID",taskIDs,SqlBuilder.IN())
+                            .and("TASK.STATUS",$KeywordRegistry.taskStatus$ended())
+                            .arrayColumn();
+        if(endedTicketIds)
+        {
+           for each (endedTicketId in endedTicketIds)
+           {
+               var index = taskIDsforStatus.indexOf(endedTicketId);
+               if (index > -1)
+               {
+                   removedIds = taskIDsforStatus.splice(index, 1);
+                   ChangeCounter += 1;
+               }
+           }
+        } 
+        TaskfieldValueStatus["STATUS"] = vars.get("$field.STATUS");
+        TicketfieldValues["DATE_EDIT_STATUS"] = vars.get("$sys.date");
     }
-    if(vars.get("field.STATUS") == $KeywordRegistry.taskStatus$ended())
+    else
     {
-        TicketfieldValues["DATE_END"] = vars.get("$sys.date");
-        TicketfieldValues["CONCLUSION"] = vars.get("$field.CONCLUSION");
-        
-        var obj_toolsUser = tools.getCurrentUser()[tools.PARAMS];
-        
-        //insert Activity
-        DataPreset =
+        if(vars.get("$field.STATUS") == $KeywordRegistry.taskStatus$unassigned())
+        {
+            TicketfieldValues["EDITOR_CONTACT_ID"] = "";
+        }
+        if(vars.get("field.STATUS") == $KeywordRegistry.taskStatus$ended())
+        {
+            TicketfieldValues["DATE_END"] = vars.get("$sys.date");
+            TicketfieldValues["CONCLUSION"] = vars.get("$field.CONCLUSION");
+        }
+        if(activityContent != "")
         {
-            "directionKeywordId" : $KeywordRegistry.activityDirection$internal(),
-            "subject"            : translate.text("Ticket returned"),
-            "content"            : translate.text("Ticket returned to pool") + ". "
-                                   +"\n"+  translate.text("Original editor") + ": " + vars.get( "$field.EDITOR_CONTACT_ID") 
-                                   +"\n"+ translate.text("Returned by") + ": "+ obj_toolsUser[tools.FIRSTNAME] +" "+ obj_toolsUser[tools.LASTNAME],
-            "categoryKeywordId"  : $KeywordRegistry.activityCategory$sys() 
-        };
-        var ActivityLink = ["Supportticket", ticketID];
+            activityContent += " / "
+        }
+        activityContent += translate.text("Status changed to") + ": " + KeywordUtils.getViewValue($KeywordRegistry.taskStatus(), vars.get("$field.STATUS"));
         
-        ActivityUtils.insertNewActivity(DataPreset, [ActivityLink]);
-    }
+        TaskfieldValue["STATUS"] = vars.get("$field.STATUS");
+        TicketfieldValues["DATE_EDIT_STATUS"] = vars.get("$sys.date");
+    }   
 } 
 ///  EDITOR
 if(vars.exists("$field.EDITOR_CONTACT_ID") && (vars.get("$field.EDITOR_CONTACT_ID") != "" ))
 {
     TicketfieldValues["EDITOR_CONTACT_ID"] = vars.get("$field.EDITOR_CONTACT_ID");
+    if(activityContent != "")
+    {
+        activityContent += " / "
+    }
+    activityContent += translate.text("Editor changed to") + ": " + ContactUtils.getFullTitleByContactId(vars.get("$field.EDITOR_CONTACT_ID"),false);
+
 }
 /// CATEGORY
 if(vars.exists("$field.CATEGORY") && (vars.get("$field.CATEGORY") != "" ))
 {
-    TicketfieldValues["CATEGORY"] = vars.get("$field.CATEGORY");      
+    TicketfieldValues["CATEGORY"] = vars.get("$field.CATEGORY");   
+    if(activityContent != "")
+    {
+        activityContent += " / "
+    }
+    activityContent += translate.text("Category changed to") + ": " + KeywordUtils.getViewValue($KeywordRegistry.ticketCategory(), vars.get("$field.CATEGORY"));
+
 } 
 
 /// UPDATE TICKET & TASK
-newWhere("TASK.TASKID",taskIDs,SqlBuilder.IN()).updateFields(TaskfieldValues);
-newWhere("TICKET.TASK_ID",taskIDs,SqlBuilder.IN()).updateFields(TicketfieldValues);
-
+if (taskIDsforStatus)
+{
+    newWhereIfSet("TASK.TASKID",taskIDsforStatus,SqlBuilder.IN()).updateFields(TaskfieldValueStatus);
+}
+if (taskIDs)
+{
+    newWhereIfSet("TASK.TASKID",taskIDs,SqlBuilder.IN()).updateFields(TaskfieldValues);
+    newWhereIfSet("TICKET.TASK_ID",taskIDs,SqlBuilder.IN()).updateFields(TicketfieldValues);
+}
 
-neon.openContext("SupportTicket", "SupportTicketFilter_view", null, neon.OPERATINGSTATE_SEARCH, null);
\ No newline at end of file
+/// Message to user, if status change was skipped
+if (ChangeCounter > 1)
+{
+    question.showMessage(translate.withArguments("You tried to change the status of \"%0\" tickets from 'ended' to another status.", [ChangeCounter]) 
+                                                + " " + translate.text("The status-change of these tickets was skipped. Any other changes were carried out.")
+                                                + " " + translate.text("To re-open tickets, please use the corresponding action."), question.INFORMATION, translate.text("Status changes skipped!"));
+}
+if (ChangeCounter == 1)
+{
+    question.showMessage(translate.text("You tried to change the status of a ticket from 'ended' to another status.")
+                                                + " " + translate.text("The status-change of these tickets was skipped. Any other changes were carried out.")
+                                                + " " + translate.text("To re-open tickets, please use the corresponding action."), question.INFORMATION, translate.text("Status change skipped!"));
+}
+neon.closeImage(vars.get("$sys.currentimage"), true)
+neon.refresh();
diff --git a/entity/SupportTicket_entity/entityfields/reopenticket/onActionProcess.js b/entity/SupportTicket_entity/entityfields/reopenticket/onActionProcess.js
index fe5cf5667d..c65098d31c 100644
--- a/entity/SupportTicket_entity/entityfields/reopenticket/onActionProcess.js
+++ b/entity/SupportTicket_entity/entityfields/reopenticket/onActionProcess.js
@@ -1,3 +1,4 @@
+import("Employee_lib");
 import("Context_lib");
 import("ActivityTask_lib");
 import("system.translate");
@@ -22,10 +23,9 @@ var obj_toolsUser = tools.getCurrentUser()[tools.PARAMS],
 var DataPreset =
     {
         "directionKeywordId" : $KeywordRegistry.activityDirection$internal(),
-        "subject"            : translate.text("Ticket reopen"), 
-        "content"            : translate.text("Ticket was reopen by") + ": "+ obj_toolsUser[tools.FIRSTNAME] +" "
-                               + obj_toolsUser[tools.LASTNAME],
-        "categoryKeywordId"  : $KeywordRegistry.activityCategory$sys() 
+        "subject"            : translate.text("Ticket reopen"),
+        "categoryKeywordId"  : $KeywordRegistry.activityCategory$sys(),
+        "responsibleContactId" : EmployeeUtils.getCurrentContactId()
     }
     var ActivityLink = [ContextUtils.getCurrentContextId(), ticketID];
 
diff --git a/entity/SupportTicket_entity/entityfields/returnticket/onActionProcess.js b/entity/SupportTicket_entity/entityfields/returnticket/onActionProcess.js
index 98516b9aa7..4f2b2c1fff 100644
--- a/entity/SupportTicket_entity/entityfields/returnticket/onActionProcess.js
+++ b/entity/SupportTicket_entity/entityfields/returnticket/onActionProcess.js
@@ -16,10 +16,23 @@ else
 {
     var str_taskId = vars.get("$field.TASK_ID");
     var ContactId = EmployeeUtils.getCurrentContactId(); 
-    newWhere("TASK.TASKID",str_taskId).updateFields({
+    
+    newWhere("TASK.TASKID",str_taskId).updateFields(
+    {
         "STATUS" : $KeywordRegistry.taskStatus$inProgress()
     });
-    newWhere("TICKET.TASK_ID",str_taskId).updateFields({
+    // Set DATE_BEGIN, if not yet set.
+    if (!vars.get("$field.DATE_BEGIN"))
+    {
+        newWhere("TICKET.TASK_ID",str_taskId).updateFields(
+        {
+            "DATE_BEGIN"        : vars.get("$sys.date")
+        })
+    }
+    
+    newWhere("TICKET.TASK_ID",str_taskId).updateFields(
+    {
+        "DATE_EDIT_STATUS"  : vars.get("$sys.date"),
         "EDITOR_CONTACT_ID" : ContactId
     });
     neon.refresh();
diff --git a/entity/SupportTicket_entity/recordcontainers/db/onDBInsert.js b/entity/SupportTicket_entity/recordcontainers/db/onDBInsert.js
index bbefca4cd2..af0d6b6281 100644
--- a/entity/SupportTicket_entity/recordcontainers/db/onDBInsert.js
+++ b/entity/SupportTicket_entity/recordcontainers/db/onDBInsert.js
@@ -1,3 +1,4 @@
+import("Employee_lib");
 import("Context_lib");
 import("Sql_lib");
 import("system.translate");
@@ -58,10 +59,11 @@ if( actionName == "duplicateTicket")
     {
         "directionKeywordId" : $KeywordRegistry.activityDirection$internal(),
         "subject"            : translate.text("Ticket duplicated (duplicate)"),
-        "content"            : translate.text("Ticket created through duplication by") + ': '
-                               + obj_toolsUser[tools.FIRSTNAME] +" "+ obj_toolsUser[tools.LASTNAME] + ". "
+        "content"            : translate.text("Ticket created through duplication") + ". "
                                + translate.text("Ticket number of the original ticket") + ': ' + codeold,  
-        "categoryKeywordId"  : $KeywordRegistry.activityCategory$sys() 
+        "categoryKeywordId"  : $KeywordRegistry.activityCategory$sys(),
+        "responsibleContactId" : EmployeeUtils.getCurrentContactId()
+        
     }
     var ActivityLink = [ContextUtils.getCurrentContextId(), ticketID];
 
@@ -72,10 +74,10 @@ if( actionName == "duplicateTicket")
     {
         "directionKeywordId" : $KeywordRegistry.activityDirection$internal(),
         "subject"            : translate.text("Ticket duplicated (original)"),
-        "content"            : translate.text("Ticket was duplicated by") + ': '+ obj_toolsUser[tools.FIRSTNAME] +" "
-                               + obj_toolsUser[tools.LASTNAME] + ". "
+        "content"            : translate.text("Ticket was duplicated") + ". "
                                + translate.text("Ticket number of the created ticket") + ': ' + code,
-        "categoryKeywordId"  : $KeywordRegistry.activityCategory$sys() 
+        "categoryKeywordId"  : $KeywordRegistry.activityCategory$sys(), 
+        "responsibleContactId" : EmployeeUtils.getCurrentContactId()
     }
     var ActivityLink = [ContextUtils.getCurrentContextId(), ticketIDold];
 
diff --git a/entity/SupportTicket_entity/recordcontainers/db/onDBUpdate.js b/entity/SupportTicket_entity/recordcontainers/db/onDBUpdate.js
index 58ba8d1829..2bacab3ce0 100644
--- a/entity/SupportTicket_entity/recordcontainers/db/onDBUpdate.js
+++ b/entity/SupportTicket_entity/recordcontainers/db/onDBUpdate.js
@@ -1,3 +1,5 @@
+import("Contact_lib");
+import("Employee_lib");
 import("Context_lib");
 import("ActivityTask_lib");
 import("system.datetime");
@@ -63,11 +65,12 @@ if( vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT)
         {
             "directionKeywordId" : $KeywordRegistry.activityDirection$internal(),
             "subject"            : translate.text("Ticket resubmitted"),
-            "content"            : translate.text("Ticket resubmitted by") + ': '+ obj_toolsUser[tools.FIRSTNAME] +" "
-                                   + obj_toolsUser[tools.LASTNAME] + ". "
-                                   + translate.text("New date due") + ": " 
-                                   + datetime.toDate(vars.get("$field.TASK_MATURITY_DATE"), "dd.MM.yyyy"),
-            "categoryKeywordId"  : $KeywordRegistry.activityCategory$sys() 
+            "content"            : translate.text("New date due") + ": " 
+                                   + datetime.toDate(vars.get("$field.TASK_MATURITY_DATE"), "dd.MM.yyyy") + " "
+                                   + translate.text("Editor changed to") + ": " 
+                                   + ContactUtils.getFullTitleByContactId(vars.get("$field.TICKET_EDITOR_CONTACT_ID"),false),
+            "categoryKeywordId"  : $KeywordRegistry.activityCategory$sys(),
+            "responsibleContactId" : EmployeeUtils.getCurrentContactId()
         }
         var ActivityLink = [ContextUtils.getCurrentContextId(), ticketID];
         
@@ -85,9 +88,9 @@ if( vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT)
             "directionKeywordId" : $KeywordRegistry.activityDirection$internal(),
             "subject"            : translate.text("Ticket returned"),
             "content"            : translate.text("Ticket returned to pool") + ". "
-                                   +"\n"+  translate.text("Original editor") + ": " + vars.get( "$field.TICKET_EDITOR_CONTACT_ID.displayValue") 
-                                   +"\n"+ translate.text("Returned by") + ": "+ obj_toolsUser[tools.FIRSTNAME] +" "+ obj_toolsUser[tools.LASTNAME],
-            "categoryKeywordId"  : $KeywordRegistry.activityCategory$sys() 
+                                   +"\n"+  translate.text("Original editor") + ": " + vars.get( "$field.TICKET_EDITOR_CONTACT_ID.displayValue"),
+            "categoryKeywordId"  : $KeywordRegistry.activityCategory$sys(),
+            "responsibleContactId" : EmployeeUtils.getCurrentContactId()
         }
         var ActivityLink = [ContextUtils.getCurrentContextId(), ticketID];
         
diff --git a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
index 598cfd20b5..e0a47e7366 100644
--- a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
+++ b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
@@ -11111,15 +11111,33 @@
     <entry>
       <key>Mailing to customer</key>
     </entry>
+    <entry>
+      <key>You tried to change the status of \"%0\" tickets from 'ended' to another status.</key>
+    </entry>
+    <entry>
+      <key>The status-change of these tickets was skipped. Any other changes were carried out.</key>
+    </entry>
+    <entry>
+      <key>To re-opening tickets, please use the corresponding action.</key>
+    </entry>
     <entry>
       <key>Create only person</key>
     </entry>
+    <entry>
+      <key>Status change skipped!</key>
+    </entry>
     <entry>
       <key>Slave administration '%0' is '%1'</key>
     </entry>
     <entry>
       <key>The file did not contain any data</key>
     </entry>
+    <entry>
+      <key>You tried to change the status of a ticket from 'ended' to another status.</key>
+    </entry>
+    <entry>
+      <key>Status changes skipped!</key>
+    </entry>
     <entry>
       <key>Slave administration</key>
     </entry>
diff --git a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
index 07ddc7bfcd..d26ab6e78d 100644
--- a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
+++ b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
@@ -14,9 +14,17 @@
       <key>Slave administration</key>
       <value>Slave Verwaltung</value>
     </entry>
+    <entry>
+      <key>The status-change of these tickets was skipped. Any other changes were carried out.</key>
+      <value>Die Statusänderungen dieser Tickets wurden übersprungen. Alle anderen Änderungen wurden durchgeführt.</value>
+    </entry>
     <entry>
       <key>Ticket was reopen by</key>
     </entry>
+    <entry>
+      <key>You tried to change the status of a ticket from 'ended' to another status.</key>
+      <value>Sie haben versucht den Status eines Tickets von 'abgeschlossen zu einem anderen Status zu ändern.</value>
+    </entry>
     <entry>
       <key>Create new campaign step</key>
       <value>Neue Kampagnenstufe erstellen</value>
@@ -29,6 +37,10 @@
       <key>Open in mosaico</key>
       <value>In Mosaico öffnen</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>
+    </entry>
     <entry>
       <key>Single (Service/Internal)</key>
       <value>Einzel (Service/Intern)</value>
@@ -45,6 +57,10 @@
       <key>Single (Service/All)</key>
       <value>Einzel (Service/Alle)</value>
     </entry>
+    <entry>
+      <key>You tried to change the status of \"%0\" tickets from 'ended' to another status.</key>
+      <value>Sie haben versucht den Status von \"%0\" Tickets von 'abgeschlossen zu einem anderen Status zu ändern.</value>
+    </entry>
     <entry>
       <key>Ticket was duplicated by</key>
       <value>Ticket wurde dupliziert. Anwender</value>
@@ -129,7 +145,7 @@
       <key>Template</key>
     </entry>
     <entry>
-      <key>Use all service ticket categories</key>
+      <key>Use all serviceticket categories</key>
       <value>Alle Serviceticket Kategorien verwenden</value>
     </entry>
     <entry>
@@ -361,7 +377,7 @@
       <value>Keine Werbung</value>
     </entry>
     <entry>
-      <key>Contact &amp; Service ticket</key>
+      <key>Contact &amp; Serviceticket</key>
       <value>Kontakt &amp; Serviceticket</value>
     </entry>
     <entry>
@@ -12502,6 +12518,10 @@ Bitte Datumseingabe prüfen</value>
     <entry>
       <key>per mail</key>
     </entry>
+    <entry>
+      <key>Status change skipped!</key>
+      <value>Statusänderung übersprungen!</value>
+    </entry>
     <entry>
       <key>Send digital Advertisingmaterials &amp; complete Workflow Task</key>
     </entry>
@@ -14165,12 +14185,12 @@ Bitte Datumseingabe prüfen</value>
       <key>2</key>
     </entry>
     <entry>
-      <key>Service ticket category</key>
-      <value>Serviceticket Kategorie</value>
+      <key>Serviceticket category</key>
+      <value>Serviceticket-Kategorie</value>
     </entry>
     <entry>
-      <key>Service ticket categories</key>
-      <value>Serviceticket Kategorien</value>
+      <key>Serviceticket categories</key>
+      <value>Serviceticket-Kategorien</value>
     </entry>
     <entry>
       <key>Service tickets</key>
@@ -14437,6 +14457,10 @@ Bitte Datumseingabe prüfen</value>
     <entry>
       <key>Employees for Employee groups</key>
     </entry>
+    <entry>
+      <key>Status changes skipped!</key>
+      <value>Statusänderungen übersprungen!</value>
+    </entry>
     <entry>
       <key>Last Click</key>
     </entry>
@@ -14525,13 +14549,19 @@ Bitte Datumseingabe prüfen</value>
       <key>New Service ticket</key>
     </entry>
     <entry>
-      <key>Serviceticket category</key>
+      <key>Service ticket category</key>
+      <value>Serviceticket-Kategorie</value>
     </entry>
     <entry>
-      <key>Serviceticket categories</key>
+      <key>Use all service ticket categories</key>
     </entry>
     <entry>
-      <key>Contact &amp; Serviceticket</key>
+      <key>Contact &amp; Service ticket</key>
+      <value>Kontakt &amp; Serviceticket</value>
+    </entry>
+    <entry>
+      <key>Service ticket categories</key>
+      <value>Serviceticket-Kategorien</value>
     </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
diff --git a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
index 3dd33ba156..f06ac690be 100644
--- a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
+++ b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
@@ -11231,6 +11231,24 @@
     <entry>
       <key>Service ticket categories</key>
     </entry>
+    <entry>
+      <key>You tried to change the status of \"%0\" tickets from 'ended' to another status.</key>
+    </entry>
+    <entry>
+      <key>The status-change of these tickets was skipped. Any other changes were carried out.</key>
+    </entry>
+    <entry>
+      <key>To re-opening tickets, please use the corresponding action.</key>
+    </entry>
+    <entry>
+      <key>Status change skipped!</key>
+    </entry>
+    <entry>
+      <key>You tried to change the status of a ticket from 'ended' to another status.</key>
+    </entry>
+    <entry>
+      <key>Status changes skipped!</key>
+    </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
 </language>
-- 
GitLab