diff --git a/.liquibase/Data_alias/basic/2019.1.4/BulkMail/create_bulkmail.xml b/.liquibase/Data_alias/basic/2019.1.4/BulkMail/create_bulkmail.xml index ba2bdc4fb1d1e794b0e24d2da6d1ac2de7ae22fa..aeab847c94b732991397ea433804c7be13cd2d4d 100644 --- a/.liquibase/Data_alias/basic/2019.1.4/BulkMail/create_bulkmail.xml +++ b/.liquibase/Data_alias/basic/2019.1.4/BulkMail/create_bulkmail.xml @@ -12,6 +12,9 @@ <column name="SENDER" type="NVARCHAR(50)"/> <column name="NAME" type="NVARCHAR(50)"/> <column name="SUBJECT" type="NVARCHAR(100)"/> + <column name="CREATEACTIVITIES" type="TINYINT"/> + <column name="TESTING_CONTACT_ID" type="CHAR(36)"/> + <column name="TESTING_EMAIL_ADDRESS" type="NVARCHAR(50)"/> </createTable> </changeSet> </databaseChangeLog> diff --git a/aliasDefinition/Data_alias/Data_alias.aod b/aliasDefinition/Data_alias/Data_alias.aod index 9f69a2a6b646c616ec03bd7e00fdb12a9c9d96f7..1e250138137283bfec0313782447a8334a4faf15 100644 --- a/aliasDefinition/Data_alias/Data_alias.aod +++ b/aliasDefinition/Data_alias/Data_alias.aod @@ -9564,6 +9564,48 @@ <title></title> <description></description> </entityFieldDb> + <entityFieldDb> + <name>CREATEACTIVITIES</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="5" /> + <size v="5" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>TESTING_CONTACT_ID</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> + <entityFieldDb> + <name>TESTING_EMAIL_ADDRESS</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> </entityFields> </entityDb> <entityDb> diff --git a/entity/AnyContact_entity/AnyContact_entity.aod b/entity/AnyContact_entity/AnyContact_entity.aod index 723c34d97f90b021cd0a75b4df7773754bc1c1fb..6f36172e79513e874e73272cc1ccdc7eabe2aec3 100644 --- a/entity/AnyContact_entity/AnyContact_entity.aod +++ b/entity/AnyContact_entity/AnyContact_entity.aod @@ -56,6 +56,18 @@ <fieldName>AnyContacts</fieldName> <isConsumer v="false" /> </entityDependency> + <entityDependency> + <name>aca9e52c-9138-4ef1-b039-1efeb3deb822</name> + <entityName>BulkMailTesting_entity</entityName> + <fieldName>Contacts</fieldName> + <isConsumer v="false" /> + </entityDependency> + <entityDependency> + <name>bbd2bf84-7cad-4156-b736-32749949f97c</name> + <entityName>BulkMail_entity</entityName> + <fieldName>Contacts</fieldName> + <isConsumer v="false" /> + </entityDependency> </dependencies> </entityProvider> <entityField> diff --git a/entity/Attribute_entity/recordcontainers/jdito/onDelete.js b/entity/Attribute_entity/recordcontainers/jdito/onDelete.js index 046b1dca18f622ac02623b1f82cb419c9d0d5d81..7368edfb0952b1e71b18ab71f9925a8a4e3df075 100644 --- a/entity/Attribute_entity/recordcontainers/jdito/onDelete.js +++ b/entity/Attribute_entity/recordcontainers/jdito/onDelete.js @@ -14,21 +14,21 @@ var attributeId = vars.get("$field.UID"); var childIds = AttributeUtil.getAllChildren(attributeId).concat(attributeId); condition = SqlCondition.begin() - .and("AB_ATTRIBUTEUSAGE.AB_ATTRIBUTE_ID in ('" + childIds.join("','") + "')") + .andIn("AB_ATTRIBUTEUSAGE.AB_ATTRIBUTE_ID", childIds) .build(); //delete all entries in AB_ATTRIBUTEUSAGE belonging to the attribute to avoid unrelated entries db.deleteData("AB_ATTRIBUTEUSAGE", condition); condition = SqlCondition.begin() - .and("AB_ATTRIBUTERELATION.AB_ATTRIBUTE_ID in ('" + childIds.join("','") + "')") + .andIn("AB_ATTRIBUTERELATION.AB_ATTRIBUTE_ID", childIds) .build(); //delete all entries in AB_ATTRIBUTERELATION for the attributes db.deleteData("AB_ATTRIBUTERELATION", condition); condition = SqlCondition.begin() - .and("AB_ATTRIBUTE.AB_ATTRIBUTEID in ('" + childIds.join("','") + "')") + .andIn("AB_ATTRIBUTE.AB_ATTRIBUTEID", childIds) .build(); //delete all attribute children diff --git a/entity/BulkMailAddRecipients_entity/recordcontainers/jdito/onInsert.js b/entity/BulkMailAddRecipients_entity/recordcontainers/jdito/onInsert.js index d47a0319721d5b49a4e57fcce24ca7009dd1fc34..e1544b133d51a8aa459dc86d1135c68d29ad18f1 100644 --- a/entity/BulkMailAddRecipients_entity/recordcontainers/jdito/onInsert.js +++ b/entity/BulkMailAddRecipients_entity/recordcontainers/jdito/onInsert.js @@ -4,4 +4,4 @@ import("system.vars"); var contactIds = JSON.parse(vars.getString("$field.recipientContactIds")); var bulkMailId = vars.get("$field.BULKMAIL_ID"); -BulkMailUtils.addRecipients(bulkMailId, contactIds); +BulkMailUtils.addRecipients(bulkMailId, contactIds); \ No newline at end of file diff --git a/entity/BulkMailStatusChart_entity/BulkMailStatusChart_entity.aod b/entity/BulkMailStatusChart_entity/BulkMailStatusChart_entity.aod index 95ce38d165808b3a1b9ed7274caf934580778f27..fbcdd8dd9bd296ecb6d66f763651a557a5420d72 100644 --- a/entity/BulkMailStatusChart_entity/BulkMailStatusChart_entity.aod +++ b/entity/BulkMailStatusChart_entity/BulkMailStatusChart_entity.aod @@ -3,6 +3,9 @@ <name>BulkMailStatusChart_entity</name> <majorModelMode>DISTRIBUTED</majorModelMode> <title>Recipient status</title> + <siblings> + <element>BulkMailRecipient_entity</element> + </siblings> <titlePlural>Recipient status</titlePlural> <recordContainer>jdito</recordContainer> <entityFields> diff --git a/entity/BulkMailTesting_entity/BulkMailTesting_entity.aod b/entity/BulkMailTesting_entity/BulkMailTesting_entity.aod new file mode 100644 index 0000000000000000000000000000000000000000..c52f6e47d0cf91b2228879ca13486123ec953cfa --- /dev/null +++ b/entity/BulkMailTesting_entity/BulkMailTesting_entity.aod @@ -0,0 +1,61 @@ +<?xml version="1.0" encoding="UTF-8"?> +<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.10" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.10"> + <name>BulkMailTesting_entity</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <siblings> + <element>BulkMail_entity</element> + </siblings> + <recordContainer>jdito</recordContainer> + <entityFields> + <entityProvider> + <name>#PROVIDER</name> + </entityProvider> + <entityField> + <name>UID</name> + </entityField> + <entityField> + <name>TESTING_CONTACT_ID</name> + <title>Testing contact</title> + <consumer>Contacts</consumer> + <linkedContext>AnyContact</linkedContext> + <valueProcess>%aditoprj%/entity/BulkMailTesting_entity/entityfields/testing_contact_id/valueProcess.js</valueProcess> + <displayValueProcess>%aditoprj%/entity/BulkMailTesting_entity/entityfields/testing_contact_id/displayValueProcess.js</displayValueProcess> + </entityField> + <entityField> + <name>TESTING_EMAIL_ADDRESS</name> + <title>Recipient address</title> + <valueProcess>%aditoprj%/entity/BulkMailTesting_entity/entityfields/testing_email_address/valueProcess.js</valueProcess> + </entityField> + <entityField> + <name>SAVESETTINGS</name> + <title>Save settings</title> + <contentType>BOOLEAN</contentType> + <dropDownProcess>%aditoprj%/entity/BulkMailTesting_entity/entityfields/savesettings/dropDownProcess.js</dropDownProcess> + </entityField> + <entityParameter> + <name>BulkMailId_param</name> + <expose v="true" /> + <mandatory v="true" /> + </entityParameter> + <entityConsumer> + <name>Contacts</name> + <dependency> + <name>dependency</name> + <entityName>AnyContact_entity</entityName> + <fieldName>#PROVIDER</fieldName> + </dependency> + </entityConsumer> + </entityFields> + <recordContainers> + <jDitoRecordContainer> + <name>jdito</name> + <jDitoRecordAlias>Data_alias</jDitoRecordAlias> + <onInsert>%aditoprj%/entity/BulkMailTesting_entity/recordcontainers/jdito/onInsert.js</onInsert> + <recordFieldMappings> + <jDitoRecordFieldMapping> + <name>UID.value</name> + </jDitoRecordFieldMapping> + </recordFieldMappings> + </jDitoRecordContainer> + </recordContainers> +</entity> diff --git a/entity/BulkMailTesting_entity/entityfields/savesettings/dropDownProcess.js b/entity/BulkMailTesting_entity/entityfields/savesettings/dropDownProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..ea87f0cb35f482786bbea6794140e8926fca3935 --- /dev/null +++ b/entity/BulkMailTesting_entity/entityfields/savesettings/dropDownProcess.js @@ -0,0 +1,7 @@ +import("system.translate"); +import("system.result"); + +result.object([ + ["1", translate.text("Yes")], + ["0", translate.text("No")], +]); \ No newline at end of file diff --git a/entity/BulkMailTesting_entity/entityfields/testing_contact_id/displayValueProcess.js b/entity/BulkMailTesting_entity/entityfields/testing_contact_id/displayValueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..3cfd8a80f6d4914aa8636462e5fa8aaa63cb702e --- /dev/null +++ b/entity/BulkMailTesting_entity/entityfields/testing_contact_id/displayValueProcess.js @@ -0,0 +1,5 @@ +import("system.vars"); +import("system.result"); +import("Contact_lib"); + +result.string(ContactUtils.getTitleByContactId(vars.get("$field.TESTING_CONTACT_ID"))); \ No newline at end of file diff --git a/entity/BulkMailTesting_entity/entityfields/testing_contact_id/valueProcess.js b/entity/BulkMailTesting_entity/entityfields/testing_contact_id/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..49dff7de739727af391d894fa9afd4d63d0a5f0c --- /dev/null +++ b/entity/BulkMailTesting_entity/entityfields/testing_contact_id/valueProcess.js @@ -0,0 +1,15 @@ +import("Sql_lib"); +import("system.db"); +import("Employee_lib"); +import("system.vars"); +import("system.result"); + +var contactId = db.cell(SqlCondition.begin() + .andPrepareVars("BULKMAIL.BULKMAILID", "$param.BulkMailId_param") + .buildSql("select TESTING_CONTACT_ID from BULKMAIL") +); +if (!contactId) + contactId = EmployeeUtils.getCurrentContactId(); + +if (vars.get("$this.value") == null) + result.string(contactId); \ No newline at end of file diff --git a/entity/BulkMailTesting_entity/entityfields/testing_email_address/valueProcess.js b/entity/BulkMailTesting_entity/entityfields/testing_email_address/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..261b02cb666e2bdeb75a544dd1ad646dece04c1e --- /dev/null +++ b/entity/BulkMailTesting_entity/entityfields/testing_email_address/valueProcess.js @@ -0,0 +1,12 @@ +import("Sql_lib"); +import("system.db"); +import("Employee_lib"); +import("system.vars"); +import("system.result"); + +var email = db.cell(SqlCondition.begin() + .andPrepareVars("BULKMAIL.BULKMAILID", "$param.BulkMailId_param") + .buildSql("select TESTING_EMAIL_ADDRESS from BULKMAIL") +); +if (vars.get("$this.value") == null) + result.string(email); \ No newline at end of file diff --git a/entity/BulkMailTesting_entity/recordcontainers/jdito/onInsert.js b/entity/BulkMailTesting_entity/recordcontainers/jdito/onInsert.js new file mode 100644 index 0000000000000000000000000000000000000000..a2489e0b7b3772dbf08cb0cf881774f3bc0193c4 --- /dev/null +++ b/entity/BulkMailTesting_entity/recordcontainers/jdito/onInsert.js @@ -0,0 +1,16 @@ +import("Sql_lib"); +import("system.db"); +import("Bulkmail_lib"); +import("system.vars"); + +var testingContact = vars.get("$field.TESTING_CONTACT_ID"); +var testingEmail = vars.get("$field.TESTING_EMAIL_ADDRESS"); +var bulkMailId = vars.get("$param.BulkMailId_param"); + +BulkMailUtils.sendBulkMailOnServer(bulkMailId, [[testingContact, testingEmail]]); + +if (vars.get("$field.SAVESETTINGS") == "1") +{ + db.updateData("BULKMAIL", ["TESTING_CONTACT_ID", "TESTING_EMAIL_ADDRESS"], null, [testingContact, testingEmail], + SqlCondition.equals("BULKMAIL.BULKMAILID", bulkMailId)); +} \ No newline at end of file diff --git a/entity/BulkMail_entity/BulkMail_entity.aod b/entity/BulkMail_entity/BulkMail_entity.aod index 8515c20fd9547767d32b95b3ce2cb92f4430b9a3..f2ff471f468f88ef8f003010182d8ba2bb003f08 100644 --- a/entity/BulkMail_entity/BulkMail_entity.aod +++ b/entity/BulkMail_entity/BulkMail_entity.aod @@ -186,6 +186,28 @@ <onActionProcess>%aditoprj%/entity/BulkMail_entity/entityfields/testmail/onActionProcess.js</onActionProcess> <iconId>VAADIN:CLIPBOARD_CHECK</iconId> </entityActionField> + <entityField> + <name>TESTING_CONTACT_ID</name> + <title>Testing contact</title> + <consumer>Contacts</consumer> + <linkedContext>AnyContact</linkedContext> + </entityField> + <entityField> + <name>TESTING_EMAIL_ADDRESS</name> + <title>Recipient address</title> + </entityField> + <entityParameter> + <name>SendTestMail_param</name> + <expose v="true" /> + </entityParameter> + <entityConsumer> + <name>Contacts</name> + <dependency> + <name>dependency</name> + <entityName>AnyContact_entity</entityName> + <fieldName>#PROVIDER</fieldName> + </dependency> + </entityConsumer> </entityFields> <recordContainers> <dbRecordContainer> @@ -253,6 +275,22 @@ <name>STATUS.displayValue</name> <expression>%aditoprj%/entity/BulkMail_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js</expression> </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>CREATEACTIVITIES.value</name> + <recordfield>BULKMAIL.CREATEACTIVITIES</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>TESTING_CONTACT_ID.value</name> + <recordfield>BULKMAIL.TESTING_CONTACT_ID</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>TESTING_EMAIL_ADDRESS.value</name> + <recordfield>BULKMAIL.TESTING_EMAIL_ADDRESS</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>TESTING_CONTACT_ID.displayValue</name> + <expression>%aditoprj%/entity/BulkMail_entity/recordcontainers/db/recordfieldmappings/testing_contact_id.displayvalue/expression.js</expression> + </dbRecordFieldMapping> </recordFieldMappings> </dbRecordContainer> </recordContainers> diff --git a/entity/BulkMail_entity/entityfields/testmail/onActionProcess.js b/entity/BulkMail_entity/entityfields/testmail/onActionProcess.js index 9dcf990316b9b824b8377fc6f18a362be936f684..e388a53ee6f1dd001a55727837a83cd302bfd1d7 100644 --- a/entity/BulkMail_entity/entityfields/testmail/onActionProcess.js +++ b/entity/BulkMail_entity/entityfields/testmail/onActionProcess.js @@ -1,4 +1,17 @@ +import("system.neon"); +import("system.db"); +import("Employee_lib"); import("system.vars"); import("Bulkmail_lib"); -BulkMailUtils.sendBulkMailOnServer(vars.get("$field.BULKMAILID")); \ No newline at end of file +var testingContact = vars.get("$field.TESTING_CONTACT_ID"); +var testingEmail = vars.get("$field.TESTING_EMAIL_ADDRESS"); + +if (testingContact && testingEmail) + BulkMailUtils.sendBulkMailOnServer(vars.get("$field.BULKMAILID"), [[testingContact, testingEmail]]); +else + neon.openContext("BulkMailTesting", "BulkMailTesting_view", null, neon.OPERATINGSTATE_NEW, { + "BulkMailId_param" : vars.get("$field.BULKMAILID") + }); + + diff --git a/entity/BulkMail_entity/recordcontainers/db/recordfieldmappings/testing_contact_id.displayvalue/expression.js b/entity/BulkMail_entity/recordcontainers/db/recordfieldmappings/testing_contact_id.displayvalue/expression.js new file mode 100644 index 0000000000000000000000000000000000000000..11979e350e55cd52f6940d5ded3a206a89448002 --- /dev/null +++ b/entity/BulkMail_entity/recordcontainers/db/recordfieldmappings/testing_contact_id.displayvalue/expression.js @@ -0,0 +1,4 @@ +import("Contact_lib"); +import("system.result"); + +result.string(ContactUtils.getResolvingDisplaySubSql("BULKMAIL.TESTING_CONTACT_ID")); \ No newline at end of file diff --git a/neonContext/BulkMailTesting/BulkMailTesting.aod b/neonContext/BulkMailTesting/BulkMailTesting.aod new file mode 100644 index 0000000000000000000000000000000000000000..bd41c66175b414b5760d29f1ac787d6658501b30 --- /dev/null +++ b/neonContext/BulkMailTesting/BulkMailTesting.aod @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8"?> +<neonContext xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.0" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonContext/1.1.0"> + <name>BulkMailTesting</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <entity>BulkMailTesting_entity</entity> + <references> + <neonViewReference> + <name>5ed51616-707d-4418-b63a-2e884f903cb3</name> + <view>BulkMailTesting_view</view> + </neonViewReference> + </references> +</neonContext> diff --git a/neonView/BulkMailPreview_view/BulkMailPreview_view.aod b/neonView/BulkMailPreview_view/BulkMailPreview_view.aod index bd3f635140211001485e5f0458d86cf2620525b6..a253dad73d0189accb53314fdaf9a03ff7d204bb 100644 --- a/neonView/BulkMailPreview_view/BulkMailPreview_view.aod +++ b/neonView/BulkMailPreview_view/BulkMailPreview_view.aod @@ -49,6 +49,22 @@ </entityFieldLink> </fields> </genericViewTemplate> + <genericViewTemplate> + <name>Testing</name> + <showDrawer v="true" /> + <drawerCaption>Testing</drawerCaption> + <entityField>#ENTITY</entityField> + <fields> + <entityFieldLink> + <name>ea406803-6189-4de0-aa41-f09f7e1b2336</name> + <entityField>TESTING_CONTACT_ID</entityField> + </entityFieldLink> + <entityFieldLink> + <name>f8963199-c89b-48e5-a92c-8f655c05acab</name> + <entityField>TESTING_EMAIL_ADDRESS</entityField> + </entityFieldLink> + </fields> + </genericViewTemplate> <neonViewReference> <name>6def3a7a-c9a0-4f2d-a36f-e53a631d8261</name> <entityField>RecipientStatusChart</entityField> diff --git a/neonView/BulkMailTesting_view/BulkMailTesting_view.aod b/neonView/BulkMailTesting_view/BulkMailTesting_view.aod new file mode 100644 index 0000000000000000000000000000000000000000..6fee3e30ccdab6233676b7af3d8242fad0e5f2fa --- /dev/null +++ b/neonView/BulkMailTesting_view/BulkMailTesting_view.aod @@ -0,0 +1,32 @@ +<?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.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.2"> + <name>BulkMailTesting_view</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <isSmall v="true" /> + <layout> + <boxLayout> + <name>layout</name> + </boxLayout> + </layout> + <children> + <genericViewTemplate> + <name>Generic</name> + <editMode v="true" /> + <entityField>#ENTITY</entityField> + <fields> + <entityFieldLink> + <name>d99dbdae-54cf-432c-8aba-ccb220d330b9</name> + <entityField>TESTING_CONTACT_ID</entityField> + </entityFieldLink> + <entityFieldLink> + <name>43ce58eb-76c8-4b6d-9aa7-1b63d5415895</name> + <entityField>TESTING_EMAIL_ADDRESS</entityField> + </entityFieldLink> + <entityFieldLink> + <name>7d83d5ca-52a9-4770-894d-d91d81e3ca14</name> + <entityField>SAVESETTINGS</entityField> + </entityFieldLink> + </fields> + </genericViewTemplate> + </children> +</neonView> diff --git a/process/Bulkmail_lib/process.js b/process/Bulkmail_lib/process.js index d143652488115d6ebd2f2bc51e718b0ff6b75721..c0a668abd2340c4e49c001d287ed175996531116 100644 --- a/process/Bulkmail_lib/process.js +++ b/process/Bulkmail_lib/process.js @@ -22,18 +22,18 @@ function BulkMailUtils () {} * Executes a process to send bulk mails on the server and creates a notification when finished. * * @param {String} pBulkMailId id of the bulk mail - * @param {Array} [pRecipients=bulkMailRecipients] overwrite the recipients (e.g. for testing) + * @param {Array} [pTestRecipients] overwrite the recipients (e.g. for testing) * @param {String} [pUser=currentUser] User that will get the notification, if null (not undefined!), no notification * will be created. */ -BulkMailUtils.sendBulkMailOnServer = function (pBulkMailId, pRecipients, pUser) +BulkMailUtils.sendBulkMailOnServer = function (pBulkMailId, pTestRecipients, pUser) { if (pUser === undefined) pUser = EmployeeUtils.getCurrentUserId(); process.execute("sendBulkMail_serverProcess", { bulkMailId : pBulkMailId, - recipients : JSON.stringify(pRecipients), + testRecipients : JSON.stringify(pTestRecipients), user : pUser || "" } ); @@ -44,11 +44,11 @@ BulkMailUtils.sendBulkMailOnServer = function (pBulkMailId, pRecipients, pUser) * can take some time to execute, use BulkMailUtils.sendBulkMailOnServer instead. * * @param {String} pBulkMailId id of the bulk mail - * @param {Array} [pRecipients=bulkMailRecipients] overwrite the recipients (e.g. for testing) + * @param {Array} [pTestRecipients] overwrite the recipients (e.g. for testing) * * @return {Object} count of sucessful and failed mails */ -BulkMailUtils.sendBulkMail = function (pBulkMailId, pRecipients) +BulkMailUtils.sendBulkMail = function (pBulkMailId, pTestRecipients) { var [templateId, subject, emailSender] = db.array(db.ROW, SqlCondition.begin() .andPrepare("BULKMAIL.BULKMAILID", pBulkMailId) @@ -56,17 +56,28 @@ BulkMailUtils.sendBulkMail = function (pBulkMailId, pRecipients) ); var template = BulkMailUtils.getBulkMailTemplate(pBulkMailId, templateId); - var sql = SqlBuilder.begin() - .select("BULKMAILRECIPIENTID, BULKMAILRECIPIENT.CONTACT_ID, (" + CommUtil.getStandardSubSqlMail() + ")") - .from("BULKMAILRECIPIENT") - .join("CONTACT", "BULKMAILRECIPIENT.CONTACT_ID = CONTACT.CONTACTID") - .where(SqlCondition.begin() - .andPrepare("BULKMAILRECIPIENT.BULKMAIL_ID", pBulkMailId) - .andPrepare("BULKMAILRECIPIENT.STATUS", $KeywordRegistry.bulkMailRecipientStatus$sent(), "# != ?") - .andSqlCondition(ContactUtils.getCommRestrictionCondition($KeywordRegistry.communicationMediumCampaign$mail(), true))) - .build(); - - var recipientData = db.table(sql); + var sql = SqlBuilder.begin(); + var recipientData; + if (pTestRecipients) + { + recipientData = pTestRecipients.map(function (row) + { + return ["", row[0], row[1]]; + }); + } + else + { + recipientData = db.table(SqlBuilder.begin() + .select("BULKMAILRECIPIENTID, BULKMAILRECIPIENT.CONTACT_ID, (" + CommUtil.getStandardSubSqlMail() + ")") + .from("CONTACT") + .join("BULKMAILRECIPIENT", "BULKMAILRECIPIENT.CONTACT_ID = CONTACT.CONTACTID") + .where(SqlCondition.begin() + .andPrepare("BULKMAILRECIPIENT.BULKMAIL_ID", pBulkMailId) + .andPrepare("BULKMAILRECIPIENT.STATUS", $KeywordRegistry.bulkMailRecipientStatus$sent(), "# != ?") + .andSqlCondition(ContactUtils.getCommRestrictionCondition($KeywordRegistry.communicationMediumCampaign$mail(), true))) + .build() + ); + } var contactIds = recipientData.map(function (e) {return e[1];}); var successIds = []; var failedIds = []; @@ -89,24 +100,25 @@ BulkMailUtils.sendBulkMail = function (pBulkMailId, pRecipients) 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' + if (recipientData[i][0]) //set the recipient status to 'sent' or 'failed' + Array.prototype.push.call(isSuccess ? successIds : failedIds, recipientData[i][0]); } - db.updateData("BULKMAILRECIPIENT", ["STATUS", "SENTDATE"], null, [$KeywordRegistry.bulkMailRecipientStatus$sent(), sentDate], - SqlCondition.begin() - .andIn("BULKMAILRECIPIENT.BULKMAILRECIPIENTID", successIds) - .build("1=2") - ); - db.updateData("BULKMAILRECIPIENT", ["STATUS", "SENTDATE"], null, [$KeywordRegistry.bulkMailRecipientStatus$failed(), sentDate], - SqlCondition.begin() - .andIn("BULKMAILRECIPIENT.BULKMAILRECIPIENTID", failedIds) - .build("1=2") - ); - - db.updateData("BULKMAIL", ["STATUS"], null, [$KeywordRegistry.bulkMailStatus$sent()], - SqlCondition.equals("BULKMAIL.BULKMAILID", pBulkMailId, "1=2")); + if (successIds.length > 0) + db.updateData("BULKMAILRECIPIENT", ["STATUS", "SENTDATE"], null, [$KeywordRegistry.bulkMailRecipientStatus$sent(), sentDate], + SqlCondition.begin() + .andIn("BULKMAILRECIPIENT.BULKMAILRECIPIENTID", successIds) + .build("1=2") + ); + if (failedIds.length > 0) + db.updateData("BULKMAILRECIPIENT", ["STATUS", "SENTDATE"], null, [$KeywordRegistry.bulkMailRecipientStatus$failed(), sentDate], + SqlCondition.begin() + .andIn("BULKMAILRECIPIENT.BULKMAILRECIPIENTID", failedIds) + .build("1=2") + ); + + if (!pTestRecipients) //if its just a test run, don't set the status to sent + db.updateData("BULKMAIL", ["STATUS"], null, [$KeywordRegistry.bulkMailStatus$sent()], + SqlCondition.equals("BULKMAIL.BULKMAILID", pBulkMailId, "1=2")); return { sucessful : successIds.length, @@ -216,6 +228,11 @@ BulkMailUtils.filterNewRecipients = function (pBulkMailId, pContactIds) return db.array(db.COLUMN, query); } +BulkMailUtils.openBulkMail = function (pBulkMailId) +{ + neon.openContext("BulkMail", "BulkMailMain_view", [pBulkMailId], neon.OPERATINGSTATE_NEW, null); +} + function SerialLetterUtils () {} /** diff --git a/process/Sql_lib/process.js b/process/Sql_lib/process.js index d2f616b53c0e5f39acbf4bf17523802821450438..12b84dc591b54f10fd9f8f3326697eb7353b17fa 100644 --- a/process/Sql_lib/process.js +++ b/process/Sql_lib/process.js @@ -889,8 +889,7 @@ SqlBuilder.prototype.build = function () this._where, this._groupBy, this._having, - this._orderBy, - this._unions + this._orderBy ]).concat(this._unions); for (let i = 0, l = allParts.length; i < l; i++) diff --git a/process/sendBulkMail_serverProcess/process.js b/process/sendBulkMail_serverProcess/process.js index 89c76bc2898eecb6a7e6772566e775a8e3eed78c..6a68f3deaaa3dc0b3ef04025b4d395920228145f 100644 --- a/process/sendBulkMail_serverProcess/process.js +++ b/process/sendBulkMail_serverProcess/process.js @@ -10,10 +10,10 @@ import("system.notification"); var startTime = datetime.date(); var bulkMailId = vars.get("$local.bulkMailId"); var user = vars.get("$local.user"); -var recipients = JSON.parse(vars.get("$local.recipients")); -var res = BulkMailUtils.sendBulkMail(bulkMailId, recipients); +var testRecipients = JSON.parse(vars.get("$local.testRecipients")); +var res = BulkMailUtils.sendBulkMail(bulkMailId, testRecipients); -if (user) +if (user && !testRecipients) { var mailName = db.cell(SqlCondition.begin() .andPrepare("BULKMAIL.BULKMAILID", bulkMailId)