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

Attribute usage fix

parent f9692bef
No related branches found
No related tags found
No related merge requests found
import("system.vars");
import("Attribute_lib");
var attributeId = vars.get("$field.AB_ATTRIBUTE_ID");
var objectType = vars.get("$field.OBJECT_TYPE");
var data = vars.get("$local.rowdata");
var objectType = data["OBJECT_TYPE.value"];
AttributeUsageUtil.deleteChildrenUsages(attributeId, objectType);
\ No newline at end of file
import("system.vars");
import("Attribute_lib");
var attributeId = vars.get("$field.AB_ATTRIBUTE_ID");
var objectType = vars.get("$field.OBJECT_TYPE");
var data = vars.get("$local.rowdata");
var attributeId = data["AB_ATTRIBUTE_ID.value"];
var objectType = data["OBJECT_TYPE.value"];
AttributeUsageUtil.insertChildrenUsages(attributeId, objectType);
AttributeUsageUtil.removeDuplicates(attributeId);
\ No newline at end of file
import("system.vars");
import("Attribute_lib");
var attributeId = vars.get("$field.AB_ATTRIBUTE_ID");
var data = vars.get("$local.rowdata");
var attributeId = data["AB_ATTRIBUTEUSAGE.AB_ATTRIBUTE_ID"];
var oldObjectType = vars.get("$context.originalObjectType");
var newObjectType = vars.get("$field.OBJECT_TYPE");
var newObjectType = data["AB_ATTRIBUTEUSAGE.OBJECT_TYPE"];
AttributeUsageUtil.updateChildrenUsages(attributeId, oldObjectType, newObjectType);
AttributeUsageUtil.removeDuplicates(attributeId);
\ No newline at end of file
import("system.logging");
import("Context_lib");
import("system.util");
import("system.datetime");
......@@ -822,10 +823,17 @@ AttributeUsageUtil.updateChildrenUsages = function (pAttributeId, pOldObjectType
var table = "AB_ATTRIBUTEUSAGE";
var sqlSelect = "select AB_ATTRIBUTEID, AB_ATTRIBUTEUSAGEID, "
+ " (select count(*) from AB_ATTRIBUTEUSAGE where AB_ATTRIBUTEUSAGE.AB_ATTRIBUTE_ID = AB_ATTRIBUTE.AB_ATTRIBUTEID and OBJECT_TYPE = '"
+ pNewObjectType + "') = 0"
+ " from AB_ATTRIBUTE left join AB_ATTRIBUTEUSAGE on AB_ATTRIBUTEID = AB_ATTRIBUTE_ID and OBJECT_TYPE = '" + pOldObjectType + "'";
var countSubQuery = SqlCondition.begin()
.andPrepare("AB_ATTRIBUTEUSAGE.OBJECT_TYPE", pNewObjectType)
.and("AB_ATTRIBUTEUSAGE.AB_ATTRIBUTE_ID = AB_ATTRIBUTE.AB_ATTRIBUTEID")
.buildSql("select count(*) from AB_ATTRIBUTEUSAGE");
var sqlSelect = SqlBuilder.begin()
.select(["AB_ATTRIBUTEID", "AB_ATTRIBUTEUSAGEID", countSubQuery])
.from("AB_ATTRIBUTE")
.leftJoin("AB_ATTRIBUTEUSAGE", SqlCondition.begin()
.andPrepare("AB_ATTRIBUTEUSAGE.OBJECT_TYPE", pOldObjectType)
.and("AB_ATTRIBUTEID = AB_ATTRIBUTE_ID"));
var updateCond = SqlCondition.begin();
......@@ -845,11 +853,13 @@ AttributeUsageUtil.updateChildrenUsages = function (pAttributeId, pOldObjectType
var condition = SqlCondition.begin()
.andPrepare("AB_ATTRIBUTE.ATTRIBUTE_TYPE", $AttributeTypes.COMBOVALUE, "# != ?")
.andPrepare("AB_ATTRIBUTE.ATTRIBUTE_PARENT_ID", pAttributeId);
var attributes = db.table(condition.buildSql(sqlSelect));
var query = sqlSelect.where(condition);
var attributes = db.table(query.build());
logging.log(JSON.stringify(attributes, null, "\t"))
attributes.forEach(function (row)
{
if (row[1] && row[2] != "true")
if (row[1] && row[2] != "0")
deleteCond.orPrepare("AB_ATTRIBUTEUSAGE.AB_ATTRIBUTEUSAGEID", row[1]);
else if (row[1])
updateCond.orPrepare("AB_ATTRIBUTEUSAGE.AB_ATTRIBUTEUSAGEID", row[1]);
......
import("system.util");
import("Contact_lib");
import("system.datetime");
import("system.neon");
import("Employee_lib");
import("system.vars");
import("KeywordRegistry_basic");
import("Sql_lib");
import("system.db");
import("DocumentTemplate_lib");
import("Communication_lib");
import("Email_lib");
import("system.process");
import("system.notification");
/**
* functions for bulk mails
*/
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 {String} [pUser=currentUser] User that will get the notification, if null (not undefined!), no notification
* will be created.
*/
BulkMailUtils.sendBulkMailOnServer = function (pBulkMailId, pUser)
{
if (pUser === undefined)
pUser = EmployeeUtils.getCurrentUserId();
process.execute("sendBulkMail_serverProcess",
{
bulkMailId : pBulkMailId,
user : pUser || ""
}
);
}
/**
* Sends a bulk mail. You should only call this function on the server because it
* can take some time to execute, use BulkMailUtils.sendBulkMailOnServer instead.
*
* @param {String} pBulkMailId id of the bulk mail
*
* @return {Object} count of sucessful and failed mails
*/
BulkMailUtils.sendBulkMail = function (pBulkMailId)
{
var [templateId, subject, emailSender] = db.array(db.ROW, SqlCondition.begin()
.andPrepare("BULKMAIL.BULKMAILID", pBulkMailId)
.buildSql("select DOCUMENTTEMPLATE_ID, SUBJECT, SENDER from BULKMAIL", "1=2")
);
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 contactIds = recipientData.map(function (e) {return e[1];});
var successIds = [];
var failedIds = [];
var sentDate = vars.get("$sys.date");
var mails = template.getReplacedEmailsByContactIds(contactIds);
var subjectTemplate = new DocumentTemplate(subject, DocumentTemplate.types.PLAIN);
var subjects = subjectTemplate.getReplacedContentByContactIds(contactIds);
for (let i = 0, l = recipientData.length; i < l; i++)
{
let isSuccess = false;
let contactId = recipientData[i][1];
let email = mails[contactId];
if (email !== undefined && recipientData[i][2])
{
email.toRecipients = [recipientData[i][2]];
email.sender = emailSender;
email.subject = subjects[contactId];
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", "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"));
return {
sucessful : successIds.length,
failed : failedIds.length
};
}
BulkMailUtils.openAddRecipientView = function (pContactIds)
{
var params = {
"ContactIds_param" : pContactIds
};
neon.openContext("BulkMailAddRecipients", "BulkMailAddRecipientsEdit_view", null, neon.OPERATINGSTATE_NEW, params);
}
/**
* deletes all bulk mail recipients that have a commrestriction for emails
*
* @param {String} pBulkMailId
*/
BulkMailUtils.removeCommRestrictionRecipients = function (pBulkMailId)
{
var recipientIds = db.array(db.COLUMN, SqlBuilder.begin()
.select("BULKMAILRECIPIENTID")
.from("BULKMAILRECIPIENT")
.join("CONTACT", SqlCondition.begin()
.and("BULKMAILRECIPIENT.CONTACT_ID = CONTACT.CONTACTID")
.andSqlCondition(ContactUtils.getCommRestrictionCondition($KeywordRegistry.communicationMediumCampaign$mail())))
.where(SqlCondition.begin()
.andPrepare("BULKMAILRECIPIENT.BULKMAIL_ID", pBulkMailId))
.build());
if (recipientIds.length)
{
db.deleteData("BULKMAILRECIPIENT", SqlCondition.begin()
.andIn("BULKMAILRECIPIENT.BULKMAILRECIPIENTID", recipientIds)
.build("1=2"));
}
}
/**
* adds recipients to a bulkmail
*
* @param {String} pBulkMailId bulk mail id
* @param {String[]} pContactIds contact ids of the recipients
*/
BulkMailUtils.addRecipients = function (pBulkMailId, pContactIds)
{
var columns = [
"BULKMAILRECIPIENTID",
"BULKMAIL_ID",
"CONTACT_ID",
"STATUS"
];
var inserts = [];
for (let i = 0, l = pContactIds.length; i < l; i++)
{
inserts.push(["BULKMAILRECIPIENT", columns, null, [util.getNewUUID(), pBulkMailId, pContactIds[i], $KeywordRegistry.bulkMailRecipientStatus$pending()]]);
}
db.inserts(inserts);
}
/**
* Loads the document template of a bulk mail. If the bulk mail itself has a
* template, it is preferred over the documentTemplate-id.
*
* @param {String} pBulkMailId bulkmail id
* @param {String} pDocumentTemplateId documentTemplate id
*
* @return {DocumentTemplate} the document template, null if no content was found.
*/
BulkMailUtils.getBulkMailTemplate = function (pBulkMailId, pDocumentTemplateId)
{
var template = DocumentTemplate.loadTemplate(pBulkMailId, "BULKMAIL");
if (!template.type)
template = DocumentTemplate.loadTemplate(pDocumentTemplateId);
return template;
}
BulkMailUtils.isRecipient = function (pBulkMailId, pContactId)
{
return db.cell(SqlCondition.begin()
.andPrepare("BULKMAILRECIPIENT.CONTACT_ID", pContactId)
.andPrepare("BULKMAILRECIPIENT.BULKMAIL_ID", pBulkMailId)
.buildSql("select count(*) from BULKMAILRECIPIENT") //TODO: is there a way exists could be used?
) != "0";
}
function SerialLetterUtils () {}
/**
* adds recipients to a serial letter
*
* @param {String} pSerialLetterId serial letter id
* @param {String[]} pContactIds contact ids of the recipients
*/
SerialLetterUtils.addRecipients = function (pSerialLetterId, pContactIds)
{
var columns = [
"LETTERRECIPIENTID",
"SERIALLETTER_ID",
"CONTACT_ID"
];
var inserts = [];
for (let i = 0, l = pContactIds.length; i < l; i++)
{
inserts.push(["LETTERRECIPIENT", columns, null, [util.getNewUUID(), pSerialLetterId, pContactIds[i]]]);
}
db.inserts(inserts);
}
SerialLetterUtils.openAddRecipientView = function (pContactIds)
{
var params = {
"ContactIds_param" : pContactIds
};
neon.openContext("SerialLetterAddRecipients", "SerialLetterAddRecipientsEdit_view", null, neon.OPERATINGSTATE_NEW, params);
}
/**
* executes a server process that builds a serial letter
*
* @param {String} pSerialLetterId serial letter id
* @param {String[]} [pRecipientIds] Letter recipient ids of that should be used.
* If omitted, all recipients of the letter will be used.
*/
SerialLetterUtils.buildSerialLetter = function (pSerialLetterId, pRecipientIds)
{
process.execute("buildSerialLetter_serverProcess", {
"serialLetterId" : pSerialLetterId,
"recipientIds" : JSON.stringify(pRecipientIds)
});
}
SerialLetterUtils.isRecipient = function (pSerialLetterId, pContactId)
{
return db.cell(SqlCondition.begin()
.andPrepare("LETTERRECIPIENT.CONTACT_ID", pContactId)
.andPrepare("LETTERRECIPIENT.SERIALLETTER_ID", pSerialLetterId)
.buildSql("select count(*) from LETTERRECIPIENT") //TODO: is there a way exists could be used?
) != "0";
import("system.util");
import("Contact_lib");
import("system.datetime");
import("system.neon");
import("Employee_lib");
import("system.vars");
import("KeywordRegistry_basic");
import("Sql_lib");
import("system.db");
import("DocumentTemplate_lib");
import("Communication_lib");
import("Email_lib");
import("system.process");
import("system.notification");
/**
* functions for bulk mails
*/
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 {String} [pUser=currentUser] User that will get the notification, if null (not undefined!), no notification
* will be created.
*/
BulkMailUtils.sendBulkMailOnServer = function (pBulkMailId, pUser)
{
if (pUser === undefined)
pUser = EmployeeUtils.getCurrentUserId();
process.execute("sendBulkMail_serverProcess",
{
bulkMailId : pBulkMailId,
user : pUser || ""
}
);
}
/**
* Sends a bulk mail. You should only call this function on the server because it
* can take some time to execute, use BulkMailUtils.sendBulkMailOnServer instead.
*
* @param {String} pBulkMailId id of the bulk mail
*
* @return {Object} count of sucessful and failed mails
*/
BulkMailUtils.sendBulkMail = function (pBulkMailId)
{
var [templateId, subject, emailSender] = db.array(db.ROW, SqlCondition.begin()
.andPrepare("BULKMAIL.BULKMAILID", pBulkMailId)
.buildSql("select DOCUMENTTEMPLATE_ID, SUBJECT, SENDER from BULKMAIL", "1=2")
);
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 contactIds = recipientData.map(function (e) {return e[1];});
var successIds = [];
var failedIds = [];
var sentDate = vars.get("$sys.date");
var mails = template.getReplacedEmailsByContactIds(contactIds);
var subjectTemplate = new DocumentTemplate(subject, DocumentTemplate.types.PLAIN);
var subjects = subjectTemplate.getReplacedContentByContactIds(contactIds);
for (let i = 0, l = recipientData.length; i < l; i++)
{
let isSuccess = false;
let contactId = recipientData[i][1];
let email = mails[contactId];
if (email !== undefined && recipientData[i][2])
{
email.toRecipients = [recipientData[i][2]];
email.sender = emailSender;
email.subject = subjects[contactId];
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", "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"));
return {
sucessful : successIds.length,
failed : failedIds.length
};
}
BulkMailUtils.openAddRecipientView = function (pContactIds)
{
var params = {
"ContactIds_param" : pContactIds
};
neon.openContext("BulkMailAddRecipients", "BulkMailAddRecipientsEdit_view", null, neon.OPERATINGSTATE_NEW, params);
}
/**
* deletes all bulk mail recipients that have a commrestriction for emails
*
* @param {String} pBulkMailId
*/
BulkMailUtils.removeCommRestrictionRecipients = function (pBulkMailId)
{
var recipientIds = db.array(db.COLUMN, SqlBuilder.begin()
.select("BULKMAILRECIPIENTID")
.from("BULKMAILRECIPIENT")
.join("CONTACT", SqlCondition.begin()
.and("BULKMAILRECIPIENT.CONTACT_ID = CONTACT.CONTACTID")
.andSqlCondition(ContactUtils.getCommRestrictionCondition($KeywordRegistry.communicationMediumCampaign$mail())))
.where(SqlCondition.begin()
.andPrepare("BULKMAILRECIPIENT.BULKMAIL_ID", pBulkMailId))
.build());
if (recipientIds.length)
{
db.deleteData("BULKMAILRECIPIENT", SqlCondition.begin()
.andIn("BULKMAILRECIPIENT.BULKMAILRECIPIENTID", recipientIds)
.build("1=2"));
}
}
/**
* adds recipients to a bulkmail
*
* @param {String} pBulkMailId bulk mail id
* @param {String[]} pContactIds contact ids of the recipients
*/
BulkMailUtils.addRecipients = function (pBulkMailId, pContactIds)
{
var columns = [
"BULKMAILRECIPIENTID",
"BULKMAIL_ID",
"CONTACT_ID",
"STATUS"
];
var inserts = [];
for (let i = 0, l = pContactIds.length; i < l; i++)
{
inserts.push(["BULKMAILRECIPIENT", columns, null, [util.getNewUUID(), pBulkMailId, pContactIds[i], $KeywordRegistry.bulkMailRecipientStatus$pending()]]);
}
db.inserts(inserts);
}
/**
* Loads the document template of a bulk mail. If the bulk mail itself has a
* template, it is preferred over the documentTemplate-id.
*
* @param {String} pBulkMailId bulkmail id
* @param {String} pDocumentTemplateId documentTemplate id
*
* @return {DocumentTemplate} the document template, null if no content was found.
*/
BulkMailUtils.getBulkMailTemplate = function (pBulkMailId, pDocumentTemplateId)
{
var template = DocumentTemplate.loadTemplate(pBulkMailId, "BULKMAIL");
if (!template.type)
template = DocumentTemplate.loadTemplate(pDocumentTemplateId);
return template;
}
BulkMailUtils.isRecipient = function (pBulkMailId, pContactId)
{
return db.cell(SqlCondition.begin()
.andPrepare("BULKMAILRECIPIENT.CONTACT_ID", pContactId)
.andPrepare("BULKMAILRECIPIENT.BULKMAIL_ID", pBulkMailId)
.buildSql("select count(*) from BULKMAILRECIPIENT") //TODO: is there a way exists could be used?
) != "0";
}
function SerialLetterUtils () {}
/**
* adds recipients to a serial letter
*
* @param {String} pSerialLetterId serial letter id
* @param {String[]} pContactIds contact ids of the recipients
*/
SerialLetterUtils.addRecipients = function (pSerialLetterId, pContactIds)
{
var columns = [
"LETTERRECIPIENTID",
"SERIALLETTER_ID",
"CONTACT_ID"
];
var inserts = [];
for (let i = 0, l = pContactIds.length; i < l; i++)
{
inserts.push(["LETTERRECIPIENT", columns, null, [util.getNewUUID(), pSerialLetterId, pContactIds[i]]]);
}
db.inserts(inserts);
}
SerialLetterUtils.openAddRecipientView = function (pContactIds)
{
var params = {
"ContactIds_param" : pContactIds
};
neon.openContext("SerialLetterAddRecipients", "SerialLetterAddRecipientsEdit_view", null, neon.OPERATINGSTATE_NEW, params);
}
/**
* executes a server process that builds a serial letter
*
* @param {String} pSerialLetterId serial letter id
* @param {String[]} [pRecipientIds] Letter recipient ids of that should be used.
* If omitted, all recipients of the letter will be used.
*/
SerialLetterUtils.buildSerialLetter = function (pSerialLetterId, pRecipientIds)
{
process.execute("buildSerialLetter_serverProcess", {
"serialLetterId" : pSerialLetterId,
"recipientIds" : JSON.stringify(pRecipientIds)
});
}
SerialLetterUtils.isRecipient = function (pSerialLetterId, pContactId)
{
return db.cell(SqlCondition.begin()
.andPrepare("LETTERRECIPIENT.CONTACT_ID", pContactId)
.andPrepare("LETTERRECIPIENT.SERIALLETTER_ID", pSerialLetterId)
.buildSql("select count(*) from LETTERRECIPIENT") //TODO: is there a way exists could be used?
) != "0";
}
\ No newline at end of file
......@@ -835,25 +835,20 @@ SqlBuilder.prototype.having = function (pCondition)
SqlBuilder.prototype._getClause = function (pElement, pPrefix, pAutoJoin)
{
var preparedValues = [];
if (pElement instanceof SqlBuilder || pElement instanceof SqlCondition)
if (typeof pElement !== "string")
{
pElement = _getElement(pElement);
}
else if (typeof pElement !== "string" && pElement.length !== undefined) //array
{
if (pAutoJoin)
if (pElement.length !== undefined && pAutoJoin) //array of fields
{
for (let i = 0, l = pElement.length; i < l; i++)
{
if (pElement[i] instanceof SqlBuilder)
pElement[i] = _getElement(pElement);
if (typeof pElement[i] !== "string")
pElement[i] = _getElement(pElement[i]);
}
pElement = pElement.join(", ");
}
else
{
preparedValues = preparedValues.concat(pElement[1]);
pElement = pElement[0];
pElement = _getElement(pElement);
}
}
......@@ -864,9 +859,10 @@ SqlBuilder.prototype._getClause = function (pElement, pPrefix, pAutoJoin)
function _getElement (element)
{
element = element.build();
if (element instanceof SqlBuilder || element instanceof SqlCondition)
element = element.build();
preparedValues = preparedValues.concat(element[1]);
if (element instanceof SqlBuilder)
if (element instanceof SqlBuilder || pAutoJoin)
return "(" + element[0] + ")";
return element[0];
}
......
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