Skip to content
Snippets Groups Projects
Commit b14bfb19 authored by S.Listl's avatar S.Listl
Browse files

Bulkmail and Bulkmailrecipient

parent 183aba15
No related branches found
No related tags found
No related merge requests found
Showing
with 174 additions and 77 deletions
......@@ -9,6 +9,7 @@
<column name="BULKMAIL_ID" type="CHAR(36)"/>
<column name="CONTACT_ID" type="CHAR(36)"/>
<column name="STATUS" type="CHAR(36)"/>
<column name="SENTDATE" type="DATETIME"/>
</createTable>
</changeSet>
</databaseChangeLog>
......@@ -7,6 +7,7 @@
<constraints primaryKey="true" primaryKeyName="PK_BULKMAIL_BULKMAILID"/>
</column>
<column name="DOCUMENTTEMPLATE_ID" type="CHAR(36)"/>
<column name="STATUS" type="CHAR(36)"/>
<column name="DESCRIPTION" type="NVARCHAR(500)"/>
<column name="SENDER" type="NVARCHAR(50)"/>
<column name="NAME" type="NVARCHAR(50)"/>
......
......@@ -9852,6 +9852,20 @@
<title></title>
<description></description>
</entityFieldDb>
<entityFieldDb>
<name>STATUS</name>
<dbName></dbName>
<primaryKey v="false" />
<columnType v="1" />
<size v="36" />
<scale v="0" />
<notNull v="false" />
<isUnique v="false" />
<index v="false" />
<documentation></documentation>
<title></title>
<description></description>
</entityFieldDb>
</entityFields>
</entityDb>
<entityDb>
......@@ -9928,6 +9942,20 @@
<title></title>
<description></description>
</entityFieldDb>
<entityFieldDb>
<name>SENTDATE</name>
<dbName></dbName>
<primaryKey v="false" />
<columnType v="93" />
<size v="29" />
<scale v="9" />
<notNull v="false" />
<isUnique v="false" />
<index v="false" />
<documentation></documentation>
<title></title>
<description></description>
</entityFieldDb>
</entityFields>
</entityDb>
</entities>
......
......@@ -19,7 +19,6 @@
<consumer>Contacts</consumer>
<linkedContextProcess>%aditoprj%/entity/BulkMailRecipient_entity/entityfields/contact_id/linkedContextProcess.js</linkedContextProcess>
<mandatory v="true" />
<displayValueProcess>%aditoprj%/entity/BulkMailRecipient_entity/entityfields/contact_id/displayValueProcess.js</displayValueProcess>
</entityField>
<entityField>
<name>STATUS</name>
......@@ -87,6 +86,13 @@
<entityField>
<name>ORGANISATION_ID</name>
</entityField>
<entityField>
<name>SENTDATE</name>
<title>Date</title>
<contentType>DATE</contentType>
<resolution>MINUTE</resolution>
<outputFormat>dd.MM.yyyy HH:mm</outputFormat>
</entityField>
</entityFields>
<recordContainers>
<dbRecordContainer>
......@@ -94,6 +100,7 @@
<alias>Data_alias</alias>
<fromClauseProcess>%aditoprj%/entity/BulkMailRecipient_entity/recordcontainers/db/fromClauseProcess.js</fromClauseProcess>
<conditionProcess>%aditoprj%/entity/BulkMailRecipient_entity/recordcontainers/db/conditionProcess.js</conditionProcess>
<orderClauseProcess>%aditoprj%/entity/BulkMailRecipient_entity/recordcontainers/db/orderClauseProcess.js</orderClauseProcess>
<linkInformation>
<linkInformation>
<name>6cfe0097-5d5a-4ca1-a0fc-021ffb47013a</name>
......@@ -147,6 +154,14 @@
<name>STATUS.displayValue</name>
<expression>%aditoprj%/entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js</expression>
</dbRecordFieldMapping>
<dbRecordFieldMapping>
<name>SENTDATE.value</name>
<recordfield>BULKMAILRECIPIENT.SENTDATE</recordfield>
</dbRecordFieldMapping>
<dbRecordFieldMapping>
<name>CONTACT_ID.displayValue</name>
<expression>%aditoprj%/entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/contact_id.displayvalue/expression.js</expression>
</dbRecordFieldMapping>
</recordFieldMappings>
</dbRecordContainer>
</recordContainers>
......
import("system.result");
import("system.vars");
import("Contact_lib");
import("system.neon");
result.string(ContactUtils.getFullTitleByContactId(vars.getString("$field.CONTACT_ID")));
\ No newline at end of file
import("Contact_lib");
import("system.result");
result.string(ContactUtils.getResolvingDisplaySubSql("BULKMAILRECIPIENT.CONTACT_ID"));
\ No newline at end of file
import("system.neon");
import("system.vars");
import("Bulkmail_lib");
BulkMailUtils.sendBulkMail(vars.get("$field.BULKMAILID"));
\ No newline at end of file
BulkMailUtils.sendBulkMail(vars.get("$field.BULKMAILID"));
neon.refreshAll(); //to refresh the status in the recipient table
\ No newline at end of file
import("system.translate");
import("system.vars");
import("system.result");
import("system.tools");
var selectedRole = vars.get("$field.ROLE");
var roles = [];
var allRoles = tools.getAllRoles([tools.ROLE_INTERNAL, tools.ROLE_PROJECT, tools.ROLE_XMPP]);
var excludeRoles = {
"INTERNAL_GROUPWARE" : true,
"INTERNAL_SNMP" : true,
"INTERNAL_DESIGNER" : true,
"INTERNAL_TECHNICAL" : true
};
if (tools.existUsers(vars.get("$param.UserTitle_param")))
{
var userRoles = tools.getRoles(vars.get("$param.UserTitle_param"));
for (let i in userRoles)
excludeRoles[userRoles[i]] = true;
}
for (let roleId in allRoles)
if (!excludeRoles[roleId] || roleId == selectedRole)
roles.push([roleId, translate.text(allRoles[roleId][0])]);
import("system.translate");
import("system.vars");
import("system.result");
import("system.tools");
var selectedRole = vars.get("$field.ROLE");
var roles = [];
var allRoles = tools.getAllRoles([tools.ROLE_INTERNAL, tools.ROLE_PROJECT, tools.ROLE_XMPP]);
var excludeRoles = {
"INTERNAL_GROUPWARE" : true,
"INTERNAL_SNMP" : true,
"INTERNAL_DESIGNER" : true,
"INTERNAL_TECHNICAL" : true,
"INTERNAL_EVERYONE" : true
};
if (tools.existUsers(vars.get("$param.UserTitle_param")))
{
var userRoles = tools.getRoles(vars.get("$param.UserTitle_param"));
for (let i in userRoles)
excludeRoles[userRoles[i]] = true;
}
for (let roleId in allRoles)
if (!excludeRoles[roleId] || roleId == selectedRole)
roles.push([roleId, translate.text(allRoles[roleId][0])]);
result.object(roles);
\ No newline at end of file
......@@ -10,12 +10,11 @@ if (userTitle && tools.existUsers(userTitle))
var existsObj = {};
tools.getRoles(userTitle).forEach(function (role)
{
if (!this[role])
if (!this[role] && role != "INTERNAL_EVERYONE")
{
roles.push([role, role]);
this[role] = true;
}
}, existsObj);
}
result.object(roles);
\ No newline at end of file
......@@ -304,6 +304,7 @@
<element>CONTACT_ID.value</element>
<element>CONTACT_ID.displayValue</element>
<element>DEPARTMENT.value</element>
<element>CONFIRM_PASSWORD.value</element>
</recordFields>
</jDitoRecordContainer>
</recordContainers>
......
import("system.logging");
import("Attribute_lib");
import("system.vars");
import("system.result");
......@@ -31,7 +32,8 @@ users = users.map(function (user)
user[tools.DESCRIPTION],
user[tools.PARAMS][tools.CONTACTID],
ContactUtils.getTitleByContactId(user[tools.PARAMS][tools.CONTACTID]), //TODO: get the names more efficiently
user[tools.PARAMS].department
user[tools.PARAMS].department,
""
];
});
......
......@@ -4245,6 +4245,15 @@
<entry>
<key>Header</key>
</entry>
<entry>
<key>Open admin view</key>
</entry>
<entry>
<key>Sender address</key>
</entry>
<entry>
<key>Send</key>
</entry>
</keyValueMap>
<font name="Dialog" style="0" size="11" />
<sqlModels>
......
......@@ -30,6 +30,14 @@
<key>Maximal</key>
<value></value>
</entry>
<entry>
<key>Sender address</key>
<value>Senderadresse</value>
</entry>
<entry>
<key>Failed</key>
<value>Fehlgeschlagen</value>
</entry>
<entry>
<key>SalesprojectPhase</key>
<value>Phase</value>
......@@ -69,6 +77,10 @@
<key>Object selection</key>
<value>Objektauswahl</value>
</entry>
<entry>
<key>Send</key>
<value>Senden</value>
</entry>
<entry>
<key>CONFIRMED</key>
<value>Gelesen</value>
......@@ -3643,6 +3655,10 @@
<entry>
<key>Zeigt wie viele Vertriebsprojekte in den einzelnen Vertriebsphasen sind. </key>
</entry>
<entry>
<key>Pending</key>
<value>Ausstehend</value>
</entry>
<entry>
<key>Hierarchy</key>
<value>Hierarchie</value>
......
......@@ -4294,6 +4294,15 @@
<entry>
<key>Header</key>
</entry>
<entry>
<key>Open admin view</key>
</entry>
<entry>
<key>Sender address</key>
</entry>
<entry>
<key>Send</key>
</entry>
</keyValueMap>
<font name="Dialog" style="0" size="11" />
</language>
......@@ -28,6 +28,10 @@
<name>f311e8da-4139-48bd-a792-6df572dce7ad</name>
<entityField>STATUS</entityField>
</neonTableColumn>
<neonTableColumn>
<name>ef020654-6f4e-4ef8-9597-10062fc3f5bd</name>
<entityField>SENTDATE</entityField>
</neonTableColumn>
</columns>
</tableViewTemplate>
</children>
......
<?xml version="1.0" encoding="UTF-8"?>
<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
<name>BulkMail_lib</name>
<name>Bulkmail_lib</name>
<majorModelMode>DISTRIBUTED</majorModelMode>
<process>%aditoprj%/process/Bulkmail_lib/process.js</process>
<alias>Data_alias</alias>
......
import("system.vars");
import("KeywordRegistry_basic");
import("Sql_lib");
import("system.db");
......@@ -9,9 +10,11 @@ function BulkMailUtils () {}
BulkMailUtils.sendBulkMail = function (pBulkMailId)
{
var templateId = db.cell(SqlCondition.begin()
//TODO: Mailbridge, Werbesperre beachten
var [templateId, subject, sender] = db.array(db.ROW, SqlCondition.begin()
.andPrepare("BULKMAIL.BULKMAILID", pBulkMailId)
.buildSql("select DOCUMENTTEMPLATE_ID from BULKMAIL", "1=2")
.buildSql("select DOCUMENTTEMPLATE_ID, SUBJECT, SENDER from BULKMAIL", "1=2")
);
var template = DocumentTemplate.loadTemplate(templateId);
var emailSender;
......@@ -24,26 +27,34 @@ BulkMailUtils.sendBulkMail = function (pBulkMailId)
var successIds = [];
var failedIds = [];
var mails = template.getReplacedEmailsByContactIds(recipientData.map(function (e) {return e[0];}));
var sentDate = vars.get("$sys.date");
var mails = template.getReplacedEmailsByContactIds(recipientData.map(function (e) {return e[1];}));
for (let i = 0, l = recipientData.length; i < l; i++)
{
let isSuccess = false;
let contactId = recipientData[i][1];
let email = mails[contactId];
email.toRecipients = [recipientData[i][1]];
email.sender = emailSender;
let isSuccess = email.send();
if (email !== undefined)
{
email.toRecipients = [recipientData[i][1]];
email.sender = emailSender;
email.subject = subject;
email.sender = sender;
isSuccess = email.send();
}
if (isSuccess)
successIds.push(recipientData[i][0]); //set the recipient status to 'sent'
else
failedIds.push(recipientData[i][0]); //set the recipient status to 'failed'
}
db.updateData("BULKMAILRECIPIENT", ["STATUS"], null, [$KeywordRegistry.bulkMailSentStatus$sent()],
db.updateData("BULKMAILRECIPIENT", ["STATUS", "SENTDATE"], null, [$KeywordRegistry.bulkMailSentStatus$sent(), sentDate],
SqlCondition.begin()
.andIn("BULKMAILRECIPIENT.BULKMAILRECIPIENTID", successIds)
.build("1=2")
);
db.updateData("BULKMAILRECIPIENT", ["STATUS"], null, [$KeywordRegistry.bulkMailSentStatus$failed()],
db.updateData("BULKMAILRECIPIENT", ["STATUS", "SENTDATE"], null, [$KeywordRegistry.bulkMailSentStatus$failed(), sentDate],
SqlCondition.begin()
.andIn("BULKMAILRECIPIENT.BULKMAILRECIPIENTID", failedIds)
.build("1=2")
......
......@@ -197,37 +197,37 @@ Email.prototype.send = function ()
{
var ENCODING = "UTF-8";
var mailId;
try
{
mailId = mail.newMail();
}
catch(ex)
{
//TODO: fix this dirty workaround [waiting for #1038963], since newMail causes an error on the first call after a user logged in
logging.log(ex);
util.sleep(1500);
mailId = mail.newMail();
}
if (this.toRecipients.length)
mail.addRecipients(mailId, mail.RECIPIENT_TO, this.toRecipients);
if (this.ccRecipients.length)
mail.addRecipients(mailId, mail.RECIPIENT_CC, this.ccRecipients);
if (this.bccRecipients.length)
mail.addRecipients(mailId, mail.RECIPIENT_BCC, this.bccRecipients);
if (this.subject)
mail.setSubject(mailId, this.subject, ENCODING);
if (this.body)
mail.addText(mailId, this.body, "text/html", ENCODING, null);
else
mail.addText(mailId, "", "text/html", ENCODING, null);
try
{
try
{
mailId = mail.newMail();
}
catch(ex)
{
//TODO: fix this dirty workaround [waiting for #1038963], since newMail causes an error on the first call after a user logged in
logging.log(ex);
util.sleep(1500);
mailId = mail.newMail();
}
if (this.toRecipients.length)
mail.addRecipients(mailId, mail.RECIPIENT_TO, this.toRecipients);
if (this.ccRecipients.length)
mail.addRecipients(mailId, mail.RECIPIENT_CC, this.ccRecipients);
if (this.bccRecipients.length)
mail.addRecipients(mailId, mail.RECIPIENT_BCC, this.bccRecipients);
if (this.subject)
mail.setSubject(mailId, this.subject, ENCODING);
if (this.body)
mail.addText(mailId, this.body, "text/html", ENCODING, null);
else
mail.addText(mailId, "", "text/html", ENCODING, null);
mail.sendMail(mailId);
return true;
}
......
......@@ -7,6 +7,6 @@
<aditoDataPath>$PROJECTHOME/data</aditoDataPath>
<loginUser>admin</loginUser>
<autoLogin v="false" />
<aditoDebug>SIMPLE | JDITO</aditoDebug>
<aditoDebug>TRACE</aditoDebug>
<enableJDitoDebug v="true" />
</system>
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