需要在 NetSuite Workflow 期间提示用户输入文本
Need to prompt user for text during NetSuite Workflow
业务逻辑:当审批人拒绝费用报告时,必须向创建者发送一封电子邮件。此电子邮件必须包含拒绝原因。
现有设置:已设置多状态工作流,通过两个单独的审批发送费用报表。每个审批人都可以批准或拒绝工作流。拒绝工作流将其发送回提交状态以供创建者更正。我的任务是获取拒绝文本并创建外发电子邮件。
明显的解决方案被拒绝:
- 发送电子邮件工作流操作 -- 此 WF 操作仅允许发送样板电子邮件(带有一些参数化)。不能从用户的角度定制任何东西。
- Workflow Action Script-- 此脚本上下文 不允许 使用 JavaScript 对话演示,例如 window.confirm() 或 window.prompt()。工作流操作面板中有类似的弹出窗口,但仅适用于 confirm() 或 alert()——没有 prompt()。不幸的是,Workflow Action 脚本的技术要求和限制被可怕地记录下来,所以这个结果是在花了几天时间研究和编写脚本后才知道的。
- 在支出报告上添加一个跟踪字段,在拒绝报告之前必须填写该字段。但是,这需要解锁记录,这是审计关注的问题。它还必须针对适当的状态使其可见和隐藏,并且只能与一组操作按钮相邻。
- 新状态不是结束状态,因此电子邮件生成不会像结束状态那样自动生成。我们只想要类似的功能。
我看到的唯一其他可能性是定位新页面,例如 Suitelet。但是,我只需要来自用户的一个字符串。 Suitelet 似乎有些过分,而且它使返回正确报告的工作流程更加复杂。
任何人可能拥有的任何见解或想法都是最有帮助的。
好吧,我已经尝试了其他几种解决方案,其中 none 似乎有效:
- 将状态退出触发器重定向(通过 WFA 脚本中的 nlapiSetRedirectURL())到 Suitelet,该 Suitelet 采用从用户输入拒绝文本的工作流传递的参数;然后重定向到费用报告。这失败了,因为报告状态实际上并没有改变。
- 做同样的事情,但是从新状态的进入触发器开始。需要一些更详细的参数处理,但这也不起作用。显然,从 UI 体验的任何部分重定向都会取消工作流转换。
- 在工作流操作上设置 "User Interface" 上下文也不起作用;重定向仍然会终止转换。
- nlapiTriggerWorkflow() 函数似乎也没有效果,即使在操作上设置了 UI 上下文。没有生成错误或调试文本。
用户可能只需要接受手动行为,例如添加注释和发送罐装电子邮件。这似乎是一个主要的功能漏洞,无论是有意还是无意。请注意,有确认和显示消息操作,但没有提示。那为什么不呢?没有细节,我猜就是处理它。
最终解决方案:
- 脚本运行的独立工作流状态。工作流上的新按钮重定向到这个新状态。
- 这些特殊状态下的工作流操作脚本具有根据它们在工作流中的位置更改的参数设置。此脚本重定向到 suitelet(下一个),它中断工作流转换并使项目保持相同状态。
- 一个 suitelet,它在文本区域中获取用户文本,以及一个 non-submit 操作按钮。不想使用提交按钮,因为那样会重新加载同一页面,创建一个额外的步骤。
- 从 suitelet 按钮事件中获取参数的客户端脚本,创建 e-mail,并重定向回原始记录(与以前处于相同的工作流状态)。
当然这是不雅的。用户必须按下一个按钮来创建 e-mail,然后按下一个单独的按钮以转换到正确的状态。它满足了用户的需求,但要求他们记住按一个按钮创建 e-mail 原因文本,然后按另一个按钮实际拒绝记录。
需要这个复杂的解决方案是因为 NetSuite 设计中的所有障碍:
- 无法提示输入来自 server-side WF 动作脚本的文本。我们可以 confirm() 给出 Y/N (确定/取消)答案,但不知何故字符串 returns 是不允许的。
- 如果 WF 操作脚本重定向到另一个页面,则无法完成转换。
- Suitelet 提交按钮会重新加载同一页面,因此我们需要一个客户端脚本来完成最后的 e-mail 创建工作。
特征孔多大?
工作流有一个限制,它不能接受用户的输入。因此,我们需要继续为这种情况定制解决方案。我已经在多个 NetSuite 项目中实现了这一点。这是有效的解决方案
(1) 有一个调用 suitelet 的工作流动作脚本。请参阅下面的脚本示例以了解工作流操作脚本
define(['N/record','N/runtime','N/redirect'],
function (record,runtime,redirect){
function callSuitelet(context)
{
try {
var currentRecord = context.newRecord;
var vendorId = currentRecord.id;
var vendorNumber = currentRecord.getValue('entityid');
redirect.toSuitelet({
scriptId: 'customscript_call_rejection_reason',
deploymentId: 'customdeploy_call_rejection_reason',
parameters: {'recid':vendorId,'vbTransactionNo':vendorNumber, trantype: context.newRecord.type}
});
}
catch (err) {
log.error("Error while calling Suitelet", err);
throw err;
}
}
return {
onAction: callSuitelet
};
});
(2) 设计一个 suiteLet 来捕获“拒绝原因”
(a) 在 suitelet 表单上添加一个字段,标记为“拒绝原因”(FieldType.TEXTAREA)
(b) 添加一个“提交”按钮,将数据添加到交易记录中
(c) 单击“提交”按钮后,将 suitelet 重定向回交易记录
这应该可以解决上述问题
业务逻辑:当审批人拒绝费用报告时,必须向创建者发送一封电子邮件。此电子邮件必须包含拒绝原因。
现有设置:已设置多状态工作流,通过两个单独的审批发送费用报表。每个审批人都可以批准或拒绝工作流。拒绝工作流将其发送回提交状态以供创建者更正。我的任务是获取拒绝文本并创建外发电子邮件。
明显的解决方案被拒绝:
- 发送电子邮件工作流操作 -- 此 WF 操作仅允许发送样板电子邮件(带有一些参数化)。不能从用户的角度定制任何东西。
- Workflow Action Script-- 此脚本上下文 不允许 使用 JavaScript 对话演示,例如 window.confirm() 或 window.prompt()。工作流操作面板中有类似的弹出窗口,但仅适用于 confirm() 或 alert()——没有 prompt()。不幸的是,Workflow Action 脚本的技术要求和限制被可怕地记录下来,所以这个结果是在花了几天时间研究和编写脚本后才知道的。
- 在支出报告上添加一个跟踪字段,在拒绝报告之前必须填写该字段。但是,这需要解锁记录,这是审计关注的问题。它还必须针对适当的状态使其可见和隐藏,并且只能与一组操作按钮相邻。
- 新状态不是结束状态,因此电子邮件生成不会像结束状态那样自动生成。我们只想要类似的功能。
我看到的唯一其他可能性是定位新页面,例如 Suitelet。但是,我只需要来自用户的一个字符串。 Suitelet 似乎有些过分,而且它使返回正确报告的工作流程更加复杂。
任何人可能拥有的任何见解或想法都是最有帮助的。
好吧,我已经尝试了其他几种解决方案,其中 none 似乎有效:
- 将状态退出触发器重定向(通过 WFA 脚本中的 nlapiSetRedirectURL())到 Suitelet,该 Suitelet 采用从用户输入拒绝文本的工作流传递的参数;然后重定向到费用报告。这失败了,因为报告状态实际上并没有改变。
- 做同样的事情,但是从新状态的进入触发器开始。需要一些更详细的参数处理,但这也不起作用。显然,从 UI 体验的任何部分重定向都会取消工作流转换。
- 在工作流操作上设置 "User Interface" 上下文也不起作用;重定向仍然会终止转换。
- nlapiTriggerWorkflow() 函数似乎也没有效果,即使在操作上设置了 UI 上下文。没有生成错误或调试文本。
用户可能只需要接受手动行为,例如添加注释和发送罐装电子邮件。这似乎是一个主要的功能漏洞,无论是有意还是无意。请注意,有确认和显示消息操作,但没有提示。那为什么不呢?没有细节,我猜就是处理它。
最终解决方案:
- 脚本运行的独立工作流状态。工作流上的新按钮重定向到这个新状态。
- 这些特殊状态下的工作流操作脚本具有根据它们在工作流中的位置更改的参数设置。此脚本重定向到 suitelet(下一个),它中断工作流转换并使项目保持相同状态。
- 一个 suitelet,它在文本区域中获取用户文本,以及一个 non-submit 操作按钮。不想使用提交按钮,因为那样会重新加载同一页面,创建一个额外的步骤。
- 从 suitelet 按钮事件中获取参数的客户端脚本,创建 e-mail,并重定向回原始记录(与以前处于相同的工作流状态)。
当然这是不雅的。用户必须按下一个按钮来创建 e-mail,然后按下一个单独的按钮以转换到正确的状态。它满足了用户的需求,但要求他们记住按一个按钮创建 e-mail 原因文本,然后按另一个按钮实际拒绝记录。
需要这个复杂的解决方案是因为 NetSuite 设计中的所有障碍:
- 无法提示输入来自 server-side WF 动作脚本的文本。我们可以 confirm() 给出 Y/N (确定/取消)答案,但不知何故字符串 returns 是不允许的。
- 如果 WF 操作脚本重定向到另一个页面,则无法完成转换。
- Suitelet 提交按钮会重新加载同一页面,因此我们需要一个客户端脚本来完成最后的 e-mail 创建工作。
特征孔多大?
工作流有一个限制,它不能接受用户的输入。因此,我们需要继续为这种情况定制解决方案。我已经在多个 NetSuite 项目中实现了这一点。这是有效的解决方案 (1) 有一个调用 suitelet 的工作流动作脚本。请参阅下面的脚本示例以了解工作流操作脚本
define(['N/record','N/runtime','N/redirect'],
function (record,runtime,redirect){
function callSuitelet(context)
{
try {
var currentRecord = context.newRecord;
var vendorId = currentRecord.id;
var vendorNumber = currentRecord.getValue('entityid');
redirect.toSuitelet({
scriptId: 'customscript_call_rejection_reason',
deploymentId: 'customdeploy_call_rejection_reason',
parameters: {'recid':vendorId,'vbTransactionNo':vendorNumber, trantype: context.newRecord.type}
});
}
catch (err) {
log.error("Error while calling Suitelet", err);
throw err;
}
}
return {
onAction: callSuitelet
};
});
(2) 设计一个 suiteLet 来捕获“拒绝原因” (a) 在 suitelet 表单上添加一个字段,标记为“拒绝原因”(FieldType.TEXTAREA) (b) 添加一个“提交”按钮,将数据添加到交易记录中 (c) 单击“提交”按钮后,将 suitelet 重定向回交易记录
这应该可以解决上述问题