From fc8fb55fd64ecc99a5481ee0e896436729a47dcf Mon Sep 17 00:00:00 2001
From: Martin Groppe <m.groppe@adito.de>
Date: Tue, 24 Aug 2021 07:46:10 +0000
Subject: [PATCH] M 1083557 bulkmail analysis filters

---
 entity/BulkMail_entity/BulkMail_entity.aod    | 23 ++++++
 .../filterConditionProcess.js                 |  5 ++
 .../opener_filter/filterConditionProcess.js   |  5 ++
 .../filterConditionProcess.js                 |  5 ++
 .../_____LANGUAGE_de/_____LANGUAGE_de.aod     | 12 ++++
 process/BulkmailAnalysis_lib/process.js       | 70 +++++++++++++++++++
 6 files changed, 120 insertions(+)
 create mode 100644 entity/BulkMail_entity/recordcontainers/db/filterextensions/clickcount_filter/filterConditionProcess.js
 create mode 100644 entity/BulkMail_entity/recordcontainers/db/filterextensions/opener_filter/filterConditionProcess.js
 create mode 100644 entity/BulkMail_entity/recordcontainers/db/filterextensions/uniqueclickcount_filter/filterConditionProcess.js

diff --git a/entity/BulkMail_entity/BulkMail_entity.aod b/entity/BulkMail_entity/BulkMail_entity.aod
index 35cd4068f6..fc3aa7f965 100644
--- a/entity/BulkMail_entity/BulkMail_entity.aod
+++ b/entity/BulkMail_entity/BulkMail_entity.aod
@@ -712,6 +712,29 @@
           <readonly v="true" />
         </linkInformation>
       </linkInformation>
+      <filterExtensions>
+        <filterExtension>
+          <name>Opener_Filter</name>
+          <title>Opener rate (in %)</title>
+          <contentType>NUMBER</contentType>
+          <filterConditionProcess>%aditoprj%/entity/BulkMail_entity/recordcontainers/db/filterextensions/opener_filter/filterConditionProcess.js</filterConditionProcess>
+          <filtertype>BASIC</filtertype>
+        </filterExtension>
+        <filterExtension>
+          <name>ClickCount_Filter</name>
+          <title>Click rate (in %)</title>
+          <contentType>NUMBER</contentType>
+          <filterConditionProcess>%aditoprj%/entity/BulkMail_entity/recordcontainers/db/filterextensions/clickcount_filter/filterConditionProcess.js</filterConditionProcess>
+          <filtertype>BASIC</filtertype>
+        </filterExtension>
+        <filterExtension>
+          <name>UniqueClickCount_Filter</name>
+          <title>Unique click rate (in %)</title>
+          <contentType>NUMBER</contentType>
+          <filterConditionProcess>%aditoprj%/entity/BulkMail_entity/recordcontainers/db/filterextensions/uniqueclickcount_filter/filterConditionProcess.js</filterConditionProcess>
+          <filtertype>BASIC</filtertype>
+        </filterExtension>
+      </filterExtensions>
     </dbRecordContainer>
   </recordContainers>
 </entity>
diff --git a/entity/BulkMail_entity/recordcontainers/db/filterextensions/clickcount_filter/filterConditionProcess.js b/entity/BulkMail_entity/recordcontainers/db/filterextensions/clickcount_filter/filterConditionProcess.js
new file mode 100644
index 0000000000..32b0843ef7
--- /dev/null
+++ b/entity/BulkMail_entity/recordcontainers/db/filterextensions/clickcount_filter/filterConditionProcess.js
@@ -0,0 +1,5 @@
+import("system.vars");
+import("system.result");
+import("BulkmailAnalysis_lib");
+
+result.string(BulkMailAnalysisUtils.getPercentageFilterCondition(BulkMailAnalysisSql.countSelects.CLICKCOUNT, vars.get("$local.rawvalue"), vars.get("$local.comparison")));
diff --git a/entity/BulkMail_entity/recordcontainers/db/filterextensions/opener_filter/filterConditionProcess.js b/entity/BulkMail_entity/recordcontainers/db/filterextensions/opener_filter/filterConditionProcess.js
new file mode 100644
index 0000000000..550c2dae9a
--- /dev/null
+++ b/entity/BulkMail_entity/recordcontainers/db/filterextensions/opener_filter/filterConditionProcess.js
@@ -0,0 +1,5 @@
+import("system.vars");
+import("system.result");
+import("BulkmailAnalysis_lib");
+
+result.string(BulkMailAnalysisUtils.getPercentageFilterCondition(BulkMailAnalysisSql.countSelects.OPENERCOUNT, vars.get("$local.rawvalue"), vars.get("$local.comparison")));
diff --git a/entity/BulkMail_entity/recordcontainers/db/filterextensions/uniqueclickcount_filter/filterConditionProcess.js b/entity/BulkMail_entity/recordcontainers/db/filterextensions/uniqueclickcount_filter/filterConditionProcess.js
new file mode 100644
index 0000000000..4364b7085e
--- /dev/null
+++ b/entity/BulkMail_entity/recordcontainers/db/filterextensions/uniqueclickcount_filter/filterConditionProcess.js
@@ -0,0 +1,5 @@
+import("system.vars");
+import("system.result");
+import("BulkmailAnalysis_lib");
+
+result.string(BulkMailAnalysisUtils.getPercentageFilterCondition(BulkMailAnalysisSql.countSelects.UNIQUECLICKCOUNT, vars.get("$local.rawvalue"), vars.get("$local.comparison")));
diff --git a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
index fdd7e1d874..6c831218bd 100644
--- a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
+++ b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
@@ -54,6 +54,10 @@
       <key>decrease priority</key>
       <value>Priorität verringern</value>
     </entry>
+    <entry>
+      <key>Click rate (in \%)</key>
+      <value>Klickrate in Prozent</value>
+    </entry>
     <entry>
       <key>Move selection up</key>
       <value>Auswahl nach oben verschieben</value>
@@ -74,6 +78,10 @@
       <key>Redirect needs a full URL with http/https</key>
       <value>Für die Weiterleitung wird eine vollständige URL mit http/https benötigt</value>
     </entry>
+    <entry>
+      <key>Opener rate (in \%)</key>
+      <value>Öffnungsrate in Prozent</value>
+    </entry>
     <entry>
       <key>My Bulkmails</key>
       <value>Meine Serienmails</value>
@@ -2354,6 +2362,10 @@
       <key>Contracts</key>
       <value>Verträge</value>
     </entry>
+    <entry>
+      <key>Unique click rate (in \%)</key>
+      <value>Unique Klickrate in Prozent</value>
+    </entry>
     <entry>
       <key>Contact Owner</key>
       <value>Besitzer</value>
diff --git a/process/BulkmailAnalysis_lib/process.js b/process/BulkmailAnalysis_lib/process.js
index 0831ae1ed2..0f1c8d0462 100644
--- a/process/BulkmailAnalysis_lib/process.js
+++ b/process/BulkmailAnalysis_lib/process.js
@@ -1,3 +1,4 @@
+import("system.SQLTYPES");
 import("KeywordRegistry_basic");
 import("Sql_lib");
 
@@ -106,8 +107,77 @@ BulkMailAnalysisSql.prototype.buildSelect = function()
     return sql
 }
 
+/**
+ * a static Utility class for BulkMailAnalysis
+ * 
+ * Do not create an instance of this!
+ * @class
+ */
+function BulkMailAnalysisUtils() {}
+
+/*
+ * returns a sql condition for a filterextension that evaluates the percentage of bulkmailanalysis counts compared to received mails
+ *
+ * @param {String} pCountSelect count from BulkMailAnalysisSql.countSelects that defines what gets counted
+ * @param {Number} pRawValue value that is filtered for 
+ * @param {String} pComparison comparison operator
+ * @return {String} the resulting condition
+ */
+ 
+BulkMailAnalysisUtils.getPercentageFilterCondition = function (pCountSelect, pRawValue, pComparison)
+{
+    pRawValue = pRawValue / 100;
+    var idcolumn = "BULKMAIL.BULKMAILID";
 
+    var receivedCountSql = new BulkMailAnalysisSql()
+                            .bulkMailIdField(idcolumn)
+                            .setSelects(BulkMailAnalysisSql.countSelects.RECEIVEDCOUNT)
+                            .buildSelect();
+                            
+    var bulkMailAnalysisSql = new BulkMailAnalysisSql()
+                            .bulkMailIdField(idcolumn)
+                            .setSelects(pCountSelect+"/"+BulkMailAnalysisSql.countSelects.RECEIVEDCOUNT)
+                            .buildSelect();
+                            
+    var caseWhen =  SqlBuilder.caseWhen(receivedCountSql, 0, SqlBuilder.NOT_EQUAL(), SQLTYPES.FLOAT)
+                        .then(bulkMailAnalysisSql)
+                        .elseValue(0)
+                        .toString();
+                        
+    var resultSqlCond;
 
+    switch (pComparison)
+    {
+        case "EQUAL":
+            resultSqlCond = newWhere(caseWhen, pRawValue, SqlBuilder.EQUAL(), SQLTYPES.FLOAT);
+            break;
+        case "GREATER":
+            resultSqlCond = newWhere(caseWhen, pRawValue, SqlBuilder.GREATER(), SQLTYPES.FLOAT);
+            break;
+        case "LESS":
+            resultSqlCond = newWhere(caseWhen, pRawValue, SqlBuilder.LESS(), SQLTYPES.FLOAT);
+            break;
+        case "GREATER_OR_EQUAL":
+            resultSqlCond = newWhere(caseWhen, pRawValue, SqlBuilder.GREATER_OR_EQUAL(), SQLTYPES.FLOAT);
+            break;
+        case "LESS_OR_EQUAL":
+            resultSqlCond = newWhere(caseWhen, pRawValue, SqlBuilder.LESS_OR_EQUAL(), SQLTYPES.FLOAT);
+            break;
+        case "NOT_EQUAL":
+            resultSqlCond = newWhere(caseWhen, pRawValue, SqlBuilder.NOT_EQUAL(), SQLTYPES.FLOAT);
+            break;
+        case "ISNULL":
+            resultSqlCond = newWhere(caseWhen, 0, SqlBuilder.EQUAL(), SQLTYPES.FLOAT);
+            break;
+        case "ISNOTNULL":
+            resultSqlCond = newWhere(caseWhen, 0, SqlBuilder.NOT_EQUAL(), SQLTYPES.FLOAT);
+            break;
+        default:
+            resultSqlCond = "1=2";
+    }
+    
+    return resultSqlCond;
+}
 /*
  * Defines the subselects used for the bulkmailanalysiscounts
  * 
-- 
GitLab