Skip to content
Snippets Groups Projects
Commit 59f526f3 authored by Sebastian Listl's avatar Sebastian Listl :speech_balloon:
Browse files

Merge branch 'm_2000554_dashboard_erweiterung' into '2021.2'

M 2000554 dashboard erweiterung

See merge request xrm/basic!1627
parents 601a5e5e 48f6d1b6
No related branches found
No related tags found
No related merge requests found
Showing
with 260 additions and 11 deletions
...@@ -29,11 +29,37 @@ ...@@ -29,11 +29,37 @@
<name>BulkMailId_param</name> <name>BulkMailId_param</name>
<expose v="true" /> <expose v="true" />
</entityParameter> </entityParameter>
<entityConsumer>
<name>Contacts</name>
<dependency>
<name>dependency</name>
<entityName>AnyContact_entity</entityName>
<fieldName>#PROVIDER</fieldName>
</dependency>
</entityConsumer>
<entityConsumer>
<name>BulkMails</name>
<dependency>
<name>dependency</name>
<entityName>BulkMail_entity</entityName>
<fieldName>#PROVIDER</fieldName>
</dependency>
</entityConsumer>
<entityConsumer>
<name>Campaigns</name>
<dependency>
<name>dependency</name>
<entityName>Campaign_entity</entityName>
<fieldName>Campaigns</fieldName>
</dependency>
</entityConsumer>
</entityFields> </entityFields>
<recordContainers> <recordContainers>
<jDitoRecordContainer> <jDitoRecordContainer>
<name>jDito</name> <name>jDito</name>
<jDitoRecordAlias>Data_alias</jDitoRecordAlias> <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
<isFilterable v="true" />
<isSortable v="true" />
<contentProcess>%aditoprj%/entity/BulkMailAnalysisOpeningHourChart_entity/recordcontainers/jdito/contentProcess.js</contentProcess> <contentProcess>%aditoprj%/entity/BulkMailAnalysisOpeningHourChart_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
<recordFieldMappings> <recordFieldMappings>
<jDitoRecordFieldMapping> <jDitoRecordFieldMapping>
...@@ -55,6 +81,35 @@ ...@@ -55,6 +81,35 @@
<name>Y.value</name> <name>Y.value</name>
</jDitoRecordFieldMapping> </jDitoRecordFieldMapping>
</recordFieldMappings> </recordFieldMappings>
<filterExtensions>
<filterExtension>
<name>SendDate_filter</name>
<title>Send Date</title>
<contentType>DATE</contentType>
<filtertype>BASIC</filtertype>
</filterExtension>
<filterExtension>
<name>Contact_filter</name>
<title>Contact</title>
<useConsumer v="true" />
<consumer>Contacts</consumer>
<filtertype>BASIC</filtertype>
</filterExtension>
<filterExtension>
<name>BulkMail_filter</name>
<title>Bulk Mail</title>
<useConsumer v="true" />
<consumer>BulkMails</consumer>
<filtertype>BASIC</filtertype>
</filterExtension>
<filterExtension>
<name>Campaign_filter</name>
<title>Campaign</title>
<useConsumer v="true" />
<consumer>Campaigns</consumer>
<filtertype>BASIC</filtertype>
</filterExtension>
</filterExtensions>
</jDitoRecordContainer> </jDitoRecordContainer>
</recordContainers> </recordContainers>
</entity> </entity>
import("JditoFilter_lib");
import("system.translate"); import("system.translate");
import("system.result"); import("system.result");
import("system.db"); import("system.db");
...@@ -7,7 +8,7 @@ import("system.datetime"); ...@@ -7,7 +8,7 @@ import("system.datetime");
var dataArray = new Array(24).fill(0); var dataArray = new Array(24).fill(0);
newSelect("WEBLINK_CLICK.DATE_OPENED") var sql = newSelect("WEBLINK_CLICK.DATE_OPENED")
.from("MAIL_RUN") .from("MAIL_RUN")
.join("MAIL_LOG","MAIL_LOG.MAIL_RUN_ID = MAIL_RUN.MAIL_RUNID") .join("MAIL_LOG","MAIL_LOG.MAIL_RUN_ID = MAIL_RUN.MAIL_RUNID")
.join("WEBLINK_CLICK","MAIL_LOG.OPENER_LINK_CLICK_ID = WEBLINK_CLICK.WEBLINK_CLICKID") .join("WEBLINK_CLICK","MAIL_LOG.OPENER_LINK_CLICK_ID = WEBLINK_CLICK.WEBLINK_CLICKID")
...@@ -15,7 +16,20 @@ newSelect("WEBLINK_CLICK.DATE_OPENED") ...@@ -15,7 +16,20 @@ newSelect("WEBLINK_CLICK.DATE_OPENED")
.and("MAIL_RUN.OBJECT_TYPE","bulkmail") .and("MAIL_RUN.OBJECT_TYPE","bulkmail")
.and("MAIL_LOG.OPENER_LINK_CLICK_ID is not null") .and("MAIL_LOG.OPENER_LINK_CLICK_ID is not null")
.andIfSet("MAIL_RUN.OBJECT_ROWID", "$param.BulkMailId_param") .andIfSet("MAIL_RUN.OBJECT_ROWID", "$param.BulkMailId_param")
.arrayColumn()
var filter = vars.get("$local.filter");
if (filter.filter && !(new FilterConditionGroup(filter.filter).isEmpty()))
{
sql.leftJoin("BULKMAIL",newWhere("BULKMAIL.BULKMAILID = MAIL_RUN.OBJECT_ROWID").and("MAIL_RUN.OBJECT_TYPE","Bulkmail"));
sql.and(JditoFilterUtils.getSqlCondition(filter.filter, "MAIL_RUN", null, {
"#EXTENSION.BulkMail_filter.BulkMail_filter#TEXT": "BULKMAIL.BULKMAILID",
"#EXTENSION.Campaign_filter.Campaign_filter#TEXT": "BULKMAIL.CAMPAIGN_ID",
"#EXTENSION.Contact_filter.Contact_filter#TEXT": "MAIL_LOG.CONTACT_ID",
"#EXTENSION.SendDate_filter.SendDate_filter#DATE": "MAIL_LOG.DATE_SEND"
}));
}
sql.arrayColumn()
.forEach(function (pDate) .forEach(function (pDate)
{ {
var hour = new Date(datetime.localTimestamp(pDate)).getHours(); var hour = new Date(datetime.localTimestamp(pDate)).getHours();
......
...@@ -25,11 +25,36 @@ ...@@ -25,11 +25,36 @@
<name>BulkMailId_param</name> <name>BulkMailId_param</name>
<expose v="true" /> <expose v="true" />
</entityParameter> </entityParameter>
<entityConsumer>
<name>Contacts</name>
<dependency>
<name>dependency</name>
<entityName>AnyContact_entity</entityName>
<fieldName>#PROVIDER</fieldName>
</dependency>
</entityConsumer>
<entityConsumer>
<name>BulkMails</name>
<dependency>
<name>dependency</name>
<entityName>BulkMail_entity</entityName>
<fieldName>#PROVIDER</fieldName>
</dependency>
</entityConsumer>
<entityConsumer>
<name>Campaigns</name>
<dependency>
<name>dependency</name>
<entityName>Campaign_entity</entityName>
<fieldName>Campaigns</fieldName>
</dependency>
</entityConsumer>
</entityFields> </entityFields>
<recordContainers> <recordContainers>
<jDitoRecordContainer> <jDitoRecordContainer>
<name>jDito</name> <name>jDito</name>
<jDitoRecordAlias>Data_alias</jDitoRecordAlias> <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
<isFilterable v="true" />
<contentProcess>%aditoprj%/entity/BulkMailAnalysisStatusFunnelChart_entity/recordcontainers/jdito/contentProcess.js</contentProcess> <contentProcess>%aditoprj%/entity/BulkMailAnalysisStatusFunnelChart_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
<recordFieldMappings> <recordFieldMappings>
<jDitoRecordFieldMapping> <jDitoRecordFieldMapping>
...@@ -42,6 +67,38 @@ ...@@ -42,6 +67,38 @@
<name>statusCount.value</name> <name>statusCount.value</name>
</jDitoRecordFieldMapping> </jDitoRecordFieldMapping>
</recordFieldMappings> </recordFieldMappings>
<filterExtensions>
<filterExtension>
<name>SendDate_filter</name>
<title>Send Date</title>
<contentType>DATE</contentType>
<filtertype>BASIC</filtertype>
</filterExtension>
<filterExtension>
<name>Contact_filter</name>
<title>Contact</title>
<contentType>TEXT</contentType>
<useConsumer v="true" />
<consumer>Contacts</consumer>
<filtertype>BASIC</filtertype>
</filterExtension>
<filterExtension>
<name>BulkMail_filter</name>
<title>Bulk Mail</title>
<contentType>TEXT</contentType>
<useConsumer v="true" />
<consumer>BulkMails</consumer>
<filtertype>BASIC</filtertype>
</filterExtension>
<filterExtension>
<name>Campaign_filter</name>
<title>Campaign</title>
<contentType>TEXT</contentType>
<useConsumer v="true" />
<consumer>Campaigns</consumer>
<filtertype>BASIC</filtertype>
</filterExtension>
</filterExtensions>
</jDitoRecordContainer> </jDitoRecordContainer>
</recordContainers> </recordContainers>
</entity> </entity>
...@@ -4,7 +4,8 @@ import("Sql_lib"); ...@@ -4,7 +4,8 @@ import("Sql_lib");
import("system.result"); import("system.result");
import("system.vars"); import("system.vars");
import("KeywordRegistry_basic"); import("KeywordRegistry_basic");
import("BulkmailAnalysis_lib") import("BulkmailAnalysis_lib");
import("JditoFilter_lib");
var statusArray = ["Recipients","Received","Openers","Klicks","Unsubscribes"]; var statusArray = ["Recipients","Received","Openers","Klicks","Unsubscribes"];
...@@ -18,15 +19,35 @@ var bulkMailAnalysisSql = new BulkMailAnalysisSql() ...@@ -18,15 +19,35 @@ var bulkMailAnalysisSql = new BulkMailAnalysisSql()
]); ]);
if (vars.get("$param.BulkMailId_param")) if (vars.get("$param.BulkMailId_param"))
{
bulkMailAnalysisSql.bulkMailId(vars.get("$param.BulkMailId_param")); bulkMailAnalysisSql.bulkMailId(vars.get("$param.BulkMailId_param"));
}
var sql = bulkMailAnalysisSql.buildSelect();
var filter = vars.get("$local.filter");
if (filter.filter && !(new FilterConditionGroup(filter.filter).isEmpty()))
{
sql.leftJoin("BULKMAIL",newWhere("BULKMAIL.BULKMAILID = MAIL_RUN.OBJECT_ROWID").and("MAIL_RUN.OBJECT_TYPE","Bulkmail"));
sql.and(JditoFilterUtils.getSqlCondition(filter.filter, "MAIL_RUN", null, {
"#EXTENSION.BulkMail_filter.BulkMail_filter#TEXT": "BULKMAIL.BULKMAILID",
"#EXTENSION.Campaign_filter.Campaign_filter#TEXT": "BULKMAIL.CAMPAIGN_ID",
"#EXTENSION.Contact_filter.Contact_filter#TEXT": "MAIL_LOG.CONTACT_ID",
"#EXTENSION.SendDate_filter.SendDate_filter#DATE": "MAIL_LOG.DATE_SEND"
}));
}
var amounts = sql.arrayRow();
var res = statusArray.map(function(status, position){
return [status, translate.text(status), amounts[position]];
});
var nonEmptyStatus = res.filter(function([pStatus, pDescription, pAmount])
{
return pAmount != 0;
var amounts = bulkMailAnalysisSql.buildSelect().arrayRow();
var res = statusArray.map(function(status,position){
return [status,translate.text(status),amounts[position]]
}); });
if(nonEmptyStatus.length == 0)
{
res = [];
}
result.object(res); result.object(res);
\ No newline at end of file
...@@ -56,6 +56,10 @@ ...@@ -56,6 +56,10 @@
<name>BulkMailId_param</name> <name>BulkMailId_param</name>
<expose v="true" /> <expose v="true" />
</entityParameter> </entityParameter>
<entityActionField>
<name>openStatusFunnel</name>
<onActionProcess>%aditoprj%/entity/BulkMailAnalysis_entity/entityfields/openstatusfunnel/onActionProcess.js</onActionProcess>
</entityActionField>
</entityFields> </entityFields>
<recordContainers> <recordContainers>
<jDitoRecordContainer> <jDitoRecordContainer>
......
import("system.neon");
neon.openContext("BulkMailAnalysisStatusFunnelChart", null, null, neon.OPERATINGSTATE_SEARCH, null);
\ No newline at end of file
...@@ -642,6 +642,19 @@ ...@@ -642,6 +642,19 @@
<name>OnlyActive_param</name> <name>OnlyActive_param</name>
<expose v="true" /> <expose v="true" />
</entityParameter> </entityParameter>
<entityParameter>
<name>OnlyCampaignsWithBulkmail_param</name>
<expose v="true" />
</entityParameter>
<entityProvider>
<name>CampaignsWithBulkMail</name>
<children>
<entityParameter>
<name>OnlyCampaignsWithBulkmail_param</name>
<valueProcess>%aditoprj%/entity/Campaign_entity/entityfields/campaignswithbulkmail/children/showonlycampaignswithbulkmail_param/valueProcess.js</valueProcess>
</entityParameter>
</children>
</entityProvider>
</entityFields> </entityFields>
<recordContainers> <recordContainers>
<dbRecordContainer> <dbRecordContainer>
......
import("system.result");
result.string(true);
\ No newline at end of file
...@@ -24,5 +24,9 @@ if(Utils.toBoolean(vars.get("$param.OnlyActive_param"))) ...@@ -24,5 +24,9 @@ if(Utils.toBoolean(vars.get("$param.OnlyActive_param")))
.where("CAMPAIGNSTEP.CAMPAIGN_ID = CAMPAIGN.CAMPAIGNID") .where("CAMPAIGNSTEP.CAMPAIGN_ID = CAMPAIGN.CAMPAIGNID")
,vars.get("$sys.date"),SqlBuilder.GREATER_OR_EQUAL(),SQLTYPES.DATE) ,vars.get("$sys.date"),SqlBuilder.GREATER_OR_EQUAL(),SQLTYPES.DATE)
} }
if(Utils.toBoolean(vars.get("$param.OnlyCampaignsWithBulkmail_param")))
{
cond.and(null, newSelect("BULKMAIL.BULKMAILID").from("BULKMAIL").where("BULKMAIL.CAMPAIGN_ID = CAMPAIGN.CAMPAIGNID"), SqlBuilder.EXISTS())
}
result.string(cond.toString()); result.string(cond.toString());
\ No newline at end of file
...@@ -8,5 +8,9 @@ ...@@ -8,5 +8,9 @@
<name>41286619-75fb-43a8-b293-0a1c4d5d47f6</name> <name>41286619-75fb-43a8-b293-0a1c4d5d47f6</name>
<view>BulkMailAnalysisOpeningHourChart_view</view> <view>BulkMailAnalysisOpeningHourChart_view</view>
</neonViewReference> </neonViewReference>
<neonViewReference>
<name>ae50e992-b06a-4d1e-98d5-af3a51f1b9c1</name>
<view>BulkMailAnalysisFilterableOpeningHourChart_view</view>
</neonViewReference>
</references> </references>
</neonContext> </neonContext>
...@@ -2,11 +2,16 @@ ...@@ -2,11 +2,16 @@
<neonContext xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonContext/1.1.1"> <neonContext xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonContext/1.1.1">
<name>BulkMailAnalysisStatusFunnelChart</name> <name>BulkMailAnalysisStatusFunnelChart</name>
<majorModelMode>DISTRIBUTED</majorModelMode> <majorModelMode>DISTRIBUTED</majorModelMode>
<filterView>BulkMailAnalysisFilterableStatusFunnelChart_view</filterView>
<entity>BulkMailAnalysisStatusFunnelChart_entity</entity> <entity>BulkMailAnalysisStatusFunnelChart_entity</entity>
<references> <references>
<neonViewReference> <neonViewReference>
<name>a0dfc680-e935-40cb-972d-fa8b758d2346</name> <name>a0dfc680-e935-40cb-972d-fa8b758d2346</name>
<view>BulkMailAnalysisStatusFunnelChart_view</view> <view>BulkMailAnalysisStatusFunnelChart_view</view>
</neonViewReference> </neonViewReference>
<neonViewReference>
<name>633d47ad-64fa-4521-b509-c28c8d7298ff</name>
<view>BulkMailAnalysisFilterableStatusFunnelChart_view</view>
</neonViewReference>
</references> </references>
</neonContext> </neonContext>
<?xml version="1.0" encoding="UTF-8"?>
<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.8">
<name>BulkMailAnalysisFilterableOpeningHourChart_view</name>
<majorModelMode>DISTRIBUTED</majorModelMode>
<filterable v="true" />
<dashletConfigurations>
<neonDashletConfiguration>
<name>BulkMailOpeningHourChart</name>
<title>Bulk Mail Opening Hours</title>
<description>Shows the opening hours of bulk mail recipients.</description>
<fragment>BulkMailAnalysisOpeningHourChart/filter</fragment>
<singleton v="true" />
<storeRoles>
<element>PROJECT_Marketing</element>
</storeRoles>
<icon>VAADIN:CHART</icon>
<categories>
<neonDashletCategory>
<name>marketing</name>
<title>Marketing</title>
</neonDashletCategory>
</categories>
</neonDashletConfiguration>
</dashletConfigurations>
<layout>
<boxLayout>
<name>layout</name>
</boxLayout>
</layout>
<children>
<multiDataChartViewTemplate>
<name>MultiDataChart</name>
<chartType>AREA</chartType>
<xAxis>X</xAxis>
<yAxis>Y</yAxis>
<categoryField>CATEGORY</categoryField>
</multiDataChartViewTemplate>
</children>
</neonView>
<?xml version="1.0" encoding="UTF-8"?>
<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.8">
<name>BulkMailAnalysisFilterableStatusFunnelChart_view</name>
<majorModelMode>DISTRIBUTED</majorModelMode>
<filterable v="true" />
<layout>
<boxLayout>
<name>layout</name>
</boxLayout>
</layout>
<children>
<singleDataChartViewTemplate>
<name>statusFunnel</name>
<chartType>FUNNEL</chartType>
<xAxis>statusDescription</xAxis>
<yAxis>statusCount</yAxis>
</singleDataChartViewTemplate>
</children>
</neonView>
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.8"> <neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.8">
<name>BulkMailAnalysisScoreCard_view</name> <name>BulkMailAnalysisScoreCard_view</name>
<majorModelMode>DISTRIBUTED</majorModelMode> <majorModelMode>DISTRIBUTED</majorModelMode>
<filterable v="true" /> <filterable v="false" />
<dashletConfigurations> <dashletConfigurations>
<neonDashletConfiguration> <neonDashletConfiguration>
<name>bulkMailKeyFigures</name> <name>bulkMailKeyFigures</name>
...@@ -31,6 +31,14 @@ ...@@ -31,6 +31,14 @@
<children> <children>
<scoreCardViewTemplate> <scoreCardViewTemplate>
<name>scoreCard</name> <name>scoreCard</name>
<fieldActions>
<element>openStatusFunnel</element>
<element>openStatusFunnel</element>
<element>openStatusFunnel</element>
<element>openStatusFunnel</element>
<element>openStatusFunnel</element>
<element>openStatusFunnel</element>
</fieldActions>
<fields> <fields>
<entityFieldLink> <entityFieldLink>
<name>d07101f9-dd9a-4f92-a809-8e7e6113bdd6</name> <name>d07101f9-dd9a-4f92-a809-8e7e6113bdd6</name>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment