From 41f6590608794a68d3fcd0d852dea2730005abd1 Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Sat, 25 May 2019 13:32:38 +0200 Subject: [PATCH] IDEMPIERE-3977 Allow context variables on subject and message when processing alerts (FHCA-967) --- .../oracle/201905241859_IDEMPIERE-3977.sql | 19 ++++++++++ .../201905241859_IDEMPIERE-3977.sql | 12 +++++++ .../src/org/compiere/util/Env.java | 4 +-- .../org/compiere/server/AlertProcessor.java | 35 ++++++++++++------- 4 files changed, 56 insertions(+), 14 deletions(-) create mode 100644 migration/i6.2/oracle/201905241859_IDEMPIERE-3977.sql create mode 100644 migration/i6.2/postgresql/201905241859_IDEMPIERE-3977.sql diff --git a/migration/i6.2/oracle/201905241859_IDEMPIERE-3977.sql b/migration/i6.2/oracle/201905241859_IDEMPIERE-3977.sql new file mode 100644 index 0000000000..1b16836ecf --- /dev/null +++ b/migration/i6.2/oracle/201905241859_IDEMPIERE-3977.sql @@ -0,0 +1,19 @@ +SET SQLBLANKLINES ON +SET DEFINE OFF + +-- IDEMPIERE-3977 Allow context variables on subject and message when processing alerts (FHCA-967) +-- May 24, 2019, 6:58:25 PM CEST +UPDATE AD_Column SET FieldLength=255,Updated=TO_DATE('2019-05-24 18:58:25','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=9077 +; + +-- May 24, 2019, 6:58:27 PM CEST +-- ALTER TABLE AD_Alert MODIFY AlertSubject NVARCHAR2(255); +ALTER TABLE AD_Alert ADD Tmp_AlertSubject NVARCHAR2(255); +UPDATE AD_Alert SET Tmp_AlertSubject = AlertSubject; +ALTER TABLE AD_Alert MODIFY Tmp_AlertSubject NVARCHAR2(255) NOT NULL; +ALTER TABLE AD_Alert DROP COLUMN AlertSubject; +ALTER TABLE AD_Alert RENAME COLUMN Tmp_AlertSubject TO AlertSubject; + +SELECT register_migration_script('201905241859_IDEMPIERE-3977.sql') FROM dual +; + diff --git a/migration/i6.2/postgresql/201905241859_IDEMPIERE-3977.sql b/migration/i6.2/postgresql/201905241859_IDEMPIERE-3977.sql new file mode 100644 index 0000000000..1a66e4af01 --- /dev/null +++ b/migration/i6.2/postgresql/201905241859_IDEMPIERE-3977.sql @@ -0,0 +1,12 @@ +-- IDEMPIERE-3977 Allow context variables on subject and message when processing alerts (FHCA-967) +-- May 24, 2019, 6:58:25 PM CEST +UPDATE AD_Column SET FieldLength=255,Updated=TO_TIMESTAMP('2019-05-24 18:58:25','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=9077 +; + +-- May 24, 2019, 6:58:27 PM CEST +INSERT INTO t_alter_column values('ad_alert','AlertSubject','VARCHAR(255)',null,null) +; + +SELECT register_migration_script('201905241859_IDEMPIERE-3977.sql') FROM dual +; + diff --git a/org.adempiere.base/src/org/compiere/util/Env.java b/org.adempiere.base/src/org/compiere/util/Env.java index 9670df6fa8..e065e3ae55 100644 --- a/org.adempiere.base/src/org/compiere/util/Env.java +++ b/org.adempiere.base/src/org/compiere/util/Env.java @@ -1666,7 +1666,7 @@ public final class Env String foreignTable = colToken.getReferenceTableName(); if (v != null) { if (format != null && format.length() > 0) { - if (v instanceof Integer && (Integer) v > 0 && !Util.isEmpty(foreignTable)) { + if (v instanceof Integer && (Integer) v >= 0 && (!Util.isEmpty(foreignTable) || token.equalsIgnoreCase(po.get_TableName()+"_ID"))){ int tblIndex = format.indexOf("."); String tableName = null; if (tblIndex > 0) @@ -1674,7 +1674,7 @@ public final class Env else tableName = foreignTable; MTable table = MTable.get(ctx, tableName); - if (table != null && tableName.equalsIgnoreCase(foreignTable)) { + if (table != null && (tableName.equalsIgnoreCase(foreignTable) || tableName.equalsIgnoreCase(po.get_TableName()))) { String columnName = tblIndex > 0 ? format.substring(tblIndex + 1) : format; MColumn column = table.getColumn(columnName); if (column != null) { diff --git a/org.adempiere.server/src/main/server/org/compiere/server/AlertProcessor.java b/org.adempiere.server/src/main/server/org/compiere/server/AlertProcessor.java index f10b8979f0..0bf3b09930 100644 --- a/org.adempiere.server/src/main/server/org/compiere/server/AlertProcessor.java +++ b/org.adempiere.server/src/main/server/org/compiere/server/AlertProcessor.java @@ -36,6 +36,7 @@ import org.compiere.model.MAttachment; import org.compiere.model.MClient; import org.compiere.model.MNote; import org.compiere.model.MSysConfig; +import org.compiere.model.MSystem; import org.compiere.model.MUser; import org.compiere.util.CLogger; import org.compiere.util.DB; @@ -132,8 +133,12 @@ public class AlertProcessor extends AdempiereServer return false; if (log.isLoggable(Level.INFO)) log.info("" + alert); - StringBuffer message = new StringBuffer(alert.getAlertMessage()) - .append(Env.NL); + MSystem system = MSystem.get(Env.getCtx()); + MClient client = MClient.get(Env.getCtx()); + // parse variables from Client, then from System + String alertMessage = Env.parseVariable(alert.getAlertMessage(), client, null, true); + alertMessage = Env.parseVariable(alertMessage, system, null, true); + StringBuffer message = new StringBuffer(alertMessage).append(Env.NL); // boolean valid = true; boolean processed = false; @@ -228,12 +233,15 @@ public class AlertProcessor extends AdempiereServer // // Report footer - Date Generated DateFormat df = DisplayType.getDateFormat(DisplayType.DateTime, language); - message.append("\n\n"); + message.append(Env.NL).append(Env.NL); message.append(Msg.translate(language, "Date")).append(" : ") .append(df.format(new Timestamp(System.currentTimeMillis()))); Collection users = alert.getRecipientUsers(); - int countMail = notifyUsers(users, alert.getAlertSubject(), message.toString(), attachments); + // parse variables from Client, then from System + String alertSubject = Env.parseVariable(alert.getAlertSubject(), client, null, true); + alertSubject = Env.parseVariable(alertSubject, system, null, true); + int countMail = notifyUsers(users, alertSubject, message.toString(), attachments); // IDEMPIERE-2864 for(File attachment : attachments) @@ -260,7 +268,8 @@ public class AlertProcessor extends AdempiereServer for (int user_id : users) { MUser user = MUser.get(getCtx(), user_id); if (user.isNotificationEMail()) { - if (m_client.sendEMailAttachments (user_id, subject, message, attachments)) + String messageHTML = message.replaceAll(Env.NL, "
"); + if (m_client.sendEMailAttachments (user_id, subject, messageHTML, attachments, true)) { countMail++; } @@ -276,15 +285,17 @@ public class AlertProcessor extends AdempiereServer MNote note = new MNote(getCtx(), AD_Message_ID, user_id, trx.getTrxName()); note.setClientOrg(m_model.getAD_Client_ID(), m_model.getAD_Org_ID()); note.setTextMsg(message); + note.setDescription(subject); note.saveEx(); - // Attachment - MAttachment attachment = new MAttachment (getCtx(), MNote.Table_ID, note.getAD_Note_ID(), trx.getTrxName()); - attachment.setClientOrg(m_model.getAD_Client_ID(), m_model.getAD_Org_ID()); - for (File f : attachments) { - attachment.addEntry(f); + if (attachments.size() > 0) { + // Attachment + MAttachment attachment = new MAttachment (getCtx(), MNote.Table_ID, note.getAD_Note_ID(), trx.getTrxName()); + attachment.setClientOrg(m_model.getAD_Client_ID(), m_model.getAD_Org_ID()); + for (File f : attachments) { + attachment.addEntry(f); + } + attachment.saveEx(); } - attachment.setTextMsg(message); - attachment.saveEx(); countMail++; trx.commit(); } catch (Throwable e) {