需要在NetSuite Workflow期间提示用户输入文本

时间:2018-01-09 21:44:14

标签: javascript workflow netsuite

业务逻辑:当审批者拒绝费用报表时,必须向创建者发送电子邮件。该电子邮件必须包含拒绝的原因。

现有设置:已经设置了多状态工作流程,通过两次单独的批准发送费用报告。每个审批人都可以批准或拒绝工作流程。拒绝工作流将其发送回提交状态以供创建者进行更正。我的任务是获取拒绝文本并创建传出电子邮件。

明显的解决方案遭到拒绝:

  • 发送电子邮件工作流操作 - 此WF操作仅允许发送样板电子邮件(带有一些参数化)。从用户的角度来看,没有什么可以定制的。
  • 工作流程操作脚本 - 此脚本上下文不允许使用JavaScript对话框演示文稿,例如window.confirm()或window.prompt()。工作流操作面板中有弹出式窗口,但仅适用于confirm()或alert() - 没有提示符()。遗憾的是,工作流程动作脚本的技术要求和限制都记录在案,因此只有花了几天研究和编写脚本后才能学习到这一结果。
  • 在费用报表上添加跟踪字段,必须填写该报表字段才能拒绝报表。但是,这需要解锁记录,这是审计问题的一个问题。它也必须在适当的状态下可见并隐藏,并且只能与一组操作按钮相邻。
  • 新状态不是最终状态,因此电子邮件生成不像自动终端状态那样自动生成。我们只想要类似的功能。

我看到的唯一其他可能性是定位新页面,例如Suitelet。但是,我只需要来自用户的单个字符串。 Suitelet看起来有点过分,加上它会使工作流程变得更加复杂,无法返回正确的报告。

任何人可能拥有的任何洞察力或想法都将是最有帮助的。

3 个答案:

答案 0 :(得分:0)

好吧,我已经尝试了其他一些解决方案,但这些解决方案似乎都不起作用:

  1. 在状态退出触发器上重定向(通过WFA脚本中的nlapiSetRedirectURL())到Suitelet,该套件获取从用户输入拒绝文本的工作流传递的参数;然后重定向到费用报告。这会失败,因为报告状态实际上并未更改。
  2. 做同样的事情,但是从新状态的Entry触发器开始。需要一些更详细的参数处理,但这也不起作用。显然,从UI体验的任何部分重定向都会取消工作流转换。
  3. 设置"用户界面"工作流操作的上下文也不起作用;重定向仍然会导致过渡。
  4. 即使在操作上设置了UI上下文,nlapiTriggerWorkflow()函数似乎也没有效果。没有生成错误或调试文本。
  5. 用户可能只需接受手动行为,例如添加备注和发送预设电子邮件。这似乎是一个重要的特征漏洞,无论是有意还是无意。请注意,有一个确认和一个显示消息操作,但没有提示。那为什么不呢?没有细节,只是处理它我想。

答案 1 :(得分:0)

最终解决方案:

  • 脚本运行的单独工作流状态。工作流上的新按钮会重定向到此新状态。
  • 处于这些特殊状态的工作流操作脚本,其参数设置根据工作流的位置而更改。此脚本重定向到suitelet(下一个),它会中断工作流转换并使项目保持相同状态。
  • 一个在文本区域中获取用户文本的套件,以及一个非提交操作按钮。不想使用提交按钮,因为它会重新加载同一页面,从而创建一个额外的步骤。
  • 一个客户端脚本,它从套件按钮事件中获取参数,创建电子邮件,并重定向回原始记录(与之前处于相同的工作流状态)。

当然这是不优雅的。用户必须按下按钮才能创建电子邮件,并使用单独的按钮切换到正确的状态。它满足了用户的需求,但要求他们记住按一个按钮创建电子邮件原因文本,另一个按钮实际拒绝记录。

对这种复杂解决方案的需求是因为NetSuite设计中的所有障碍:

  • 无法从服务器端WF操作脚本提示输入文本。我们可以确认()给出一个Y / N(确定/取消)答案,但不允许以某种方式返回字符串。
  • 如果WF操作脚本重定向到另一个页面,则无法完成转换。
  • Suitelet提交按钮重新加载同一页面,因此我们需要一个客户端脚本来完成最终的电子邮件创建工作。

功能漏洞多少?

答案 2 :(得分:0)

工作流有一个限制,它不能接受用户的输入。因此,我们需要针对这种情况继续定制解决方案。我已经在多个 NetSuite 项目中实现了这一点。这是有效的解决方案 (1) 有一个工作流动作脚本来调用套件。有关工作流动作脚本,请参阅下面的脚本示例

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) 在套件表单上添加一个字段,标记为“拒绝原因” (FieldType.TEXTAREA) (b) 添加“提交”按钮,将数据添加到交易记录中 (c) 点击“提交”按钮后,将套件重定向回交易记录

这应该可以解决上面提到的问题