jandanielcz/simona

用于指定何时以及向谁发送通知的简单语言。

1.1.1 2017-03-08 12:48 UTC

This package is not auto-updated.

Last update: 2024-09-28 20:30:37 UTC


README

用于指定何时以及向谁发送通知的简单语言。

目的

对于一项(项目管理/IS/KB混合)边项目,我需要一个灵活但简单的配置方式来决定用户何时会收到他们的任务通知。

例如

  • 如果任务尚未完成,则在一周和3天前通知负责的用户。
  • 如果任务延误一天,则通知主管。
  • 如果任务延误超过3天,则通知所有管理员。

然后我可以每天晚上检查所有最近和未来的任务,处理这些规则并发送电子邮件。

示例

在一周前通知负责的用户

(1):[responsible];

如果任务延误一天,则通知主管

(-1!):[supervisor];

如果任务延误超过3天,则通知所有管理员。

(-3..!):@admins;

我们可以组合规则以创建简单的升级场景

(7):[responsible];
(1!):[responsible];
(-1..!):[responsible];
(-2!):[supervisor],@admins;
(-3!):tom@example.org;

不以 ( 开头且紧随 ; 后有空格的行可用来注释。

(7):[responsible];
(1!):[responsible];
(-1..!):[responsible];      keep bugging him :)
(-2!):[supervisor],@admins; 

Tom from example corp. wants to know about it since 2017-01. Adam.
(-3!):tom@example.org;

规则元素

  1. 时间窗口定义
  2. ! 仅在任务未解决时发送通知
  3. : 分隔符
  4. 以逗号分隔的接收者列表,对于我的使用,我决定使用
    • 特定的电子邮件 dan@example.org
    • 与任务的关系 [responsible]
    • 用户组 @itdept
    • 其他 plain_string (未使用)
  5. 尾部 ;

每个规则应单独一行。

间隔指定

对于通知的定义,Simone使用任务日期的天数来定义天数

                     
                    Day of task
        ...3  2  1  0 -1 -2 -3 -4...
--------------------|--------------------time-->
                                         
(..!)   ...X  X  X  X  X  X  X  X        every day until done
(2..-1)       X  X  X  X
(0..!)              X  X  X...           until done
(3)        X                             once

负数表示任务应在历史中完成。

错误

如果行以 ( 开头,则被视为规则且无效规则,应向用户报告。其他所有行在处理时均被忽略。

PHP 使用

基本使用

$rc = new RulesCollection();
$rc->parse('(1):a;');
$rc->whoToNotify(1, false); // $daysToTask, $isTaskCompleted?

// returns ['a']

与接收者类型一起使用

$rc = new RulesCollection();
$rc->parse('(1):[a],@allUsers;');
$rc->setRecipientReducer(['\JanDanielCz\Simona\RecipientUtils','groupRelMailPlainReducer']);
$rc->whoToNotify(1, false); // $daysToTask, $isTaskCompleted?

/* 
returns [
    'group' => ['allUsers'],
    'rel' => ['a'],
    'mail' => [],
    'plain' => []
    ];
*/

您可以创建自己的reducer以对接收者进行排序并引入任何特殊的接收者语法。

限制

在接收者定义内部的空间在通过 preg_replace('/\s+/', '', $string) 解析之前被删除,欢迎提供更好的正则表达式的pull request。