1: <?php
2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
32:
33:
34: interface projectNotificationImpl {
35:
36: function initialize();
37: function getPluginAppId();
38: function enableObject($enable = true);
39: function getAppMainViewItem();
40: function registerAppMenuHandler(&$obj);
41: function notify(&$apphandler);
42:
43: }
44:
45:
46: class projectNotification implements projectNotificationImpl {
47:
48: private $PLUGIN_APP_ID = PROJECT_APP;
49: private $instance;
50: private $enabled;
51: private $menuhandler;
52: private $action_list = array('default' =>
53: array(
54: 'update' => array('enabled' => 0,
55: 'message' => 'Task updated'),
56: 'insert' => array('enabled' => 0,
57: 'message' => 'Task created'),
58: 'comment_save' => array('enabled' => 0,
59: 'message' => 'Task commented'),
60: 'set_task_assignee' => array('enabled' => 0,
61: 'message' => 'Task assigned'),
62: 'change_task_status' => array('enabled' => 0,
63: 'message' => 'Task status changed')));
64: private $config_dir = '../lib/class/plugins/config/bmm_erp_notification';
65: private $config;
66:
67:
68: public function __construct (){
69: $this->instance = $this;
70: if (!file_exists($this->config_dir)) mkdir($this->config_dir,0770,true);
71: $this->config = "{$this->config_dir}/config.json";
72: $this->enabled = true;
73: $this->handler = 'project';
74: $this->appview = 'bmm_erp_notification_plugin';
75: $this->initialize();
76: }
77:
78: private function loadActionData($schema_name = null,$target_id = null){
79: $file = "{$this->config_dir}/{$schema_name}_{$target_id}_{$this->appview}.json";
80: if (file_exists($file) == true){
81: $this->action_list = json_decode(file_get_contents($file),true);
82: }else{
83: if (file_exists($this->config))
84: $this->action_list = json_decode(file_get_contents($this->config),true);
85: }
86: }
87:
88: private function writeActionData($schema_name,$target_id){
89: $file = "{$this->config_dir}/{$schema_name}_{$target_id}_{$this->appview}.json";
90: if (($f = fopen($file, "w") ) == false)
91: throw new Exception ("Failed to open $file for write");
92:
93: fwrite($f, json_encode($this->action_list));
94: fclose($f);
95: }
96:
97: public function initialize(){
98: $this->loadActionData();
99: }
100:
101: public function getPluginAppId(){
102: return $this->PLUGIN_APP_ID;
103: }
104:
105: public function enableObject($enable = true){
106: $this->enabled = $enable;
107: }
108:
109: public function getObjectStatus(){
110: return $this->enabled;
111: }
112:
113: public function getAppMainViewItem(){
114:
115: }
116:
117: public function registerAppMenuHandler(&$obj){
118:
119: }
120:
121: public function registerHttpRequestObjects(&$apphandler){
122: $apphandler->registerHttpRequestObjects(array(get_class($this->instance),$this->appview,"bmm_erp_notification_plugin","modifyEnabledActionList",$this->PLUGIN_APP_ID));
123: }
124:
125: public function modifyEnabledActionList(&$apphandler,$data_arr){
126: $project_key = empty($data_arr['project_key']) ? 'default' : $data_arr['project_key'];
127: $action = $data_arr['config_action'];
128: $enabled = $data_arr['enabled'] == true ? 1 : 0;
129: if ($project_key != 'default' && !isset($action_list[$project_key]))
130: $this->setCustomActionList($project_key);
131:
132: $this->action_list[$project_key][$action]['enabled'] = $enabled;
133: $this->writeActionData($apphandler->getSchemaName(),$project_key);
134: }
135:
136: private function setCustomActionList($project_key){
137: $action_list = $this->action_list;
138: $action_list[$project_key] = $action_list['default'];
139: array_merge($this->action_list,$action_list);
140: }
141:
142: public function configurationView(&$actionhandler,$project_key = 'default'){
143: echo "
144: <script type=\"text/javascript\">
145: function bmm_erp_notification_modify_action_list(e,action,project_key){
146: get_dom_element('ajaxload').style.visibility = 'visible';
147: var enabled = e.checked;
148: JSONSearchObject = {
149: 'project_key':project_key,
150: 'config_action':action,
151: 'enabled':enabled,
152: 'appnr':{$this->PLUGIN_APP_ID}
153: };
154:
155: ajax_reqobj.createAjaxRequest('bmm_erp_notification_plugin','bmm_erp_notification_plugin', JSON.stringify(JSONSearchObject),bmm_erp_notification_processHttpRetrieveRequest);
156: }
157:
158: function bmm_erp_notification_processHttpRetrieveRequest(rq_data){
159: get_dom_element('ajaxload').style.visibility = 'hidden';
160: }
161: </script>
162: <div style=\"float:left;width:900px;margin-top:5px\">
163: <span style=\"font-weight:bold\">Notification events for project</span><br>
164: <table style=\"border:0px solid #fff\">";
165:
166: $project_key = empty($project_key) ? 'default' : $project_key;
167: $project_indx_key = !isset($this->action_list[$project_key]) ? 'default' : $project_key;
168:
169: echo "
170: <tr>
171: <th style=\"font-size:14px\">Action</th>
172: <th style=\"font-size:14px;width:60px\">Enabled</td>
173: </tr>";
174:
175: foreach (array_keys($this->action_list[$project_indx_key]) as $action){
176: $enabled = $this->action_list[$project_indx_key][$action]['enabled'] ? "checked = 'checked'" : null;
177: echo "
178: <tr>
179: <td style=\"font-size:13px;background-color:#fff\">$action</td>
180: <td style=\"background-color:#fff\">
181: <input type=\"checkbox\" onClick=\"javascript:bmm_erp_notification_modify_action_list(this,'$action','$project_key')\" $enabled >
182: </td>
183: </tr>";
184: }
185: echo "
186: </table>
187: </div>";
188: }
189:
190: public function notify(&$actionhandler){
191:
192: $mainhandler = $actionhandler->getMainObject();
193: $dataobject = $actionhandler->getDataObject();
194: $project_key = $mainhandler->getProjectKey();
195: $action = $actionhandler->getActionParam('action');
196: $action_list = (array)$this->action_list;
197: $target_id = $mainhandler->getAppTargetId();
198:
199: $this->loadActionData($mainhandler->getSchemaName(),$target_id);
200: if (isset($action_list[$target_id][$action]) && $action_list[$target_id][$action]['enabled'])
201: $notification_message = $action_list[$target_id][$action]['message'];
202: elseif (isset($action_list['default'][$action]) && $action_list['default'][$action]['enabled'])
203: $notification_message = $action_list['default'][$action]['message'];
204: else
205: return 0;
206:
207: $status = $mainhandler->getStatusListKey('PROJECT_TASK',$mainhandler->taskhandler->getTaskStatus());
208: $params_arr = array('notification_message' => $notification_message,
209: 'project_name' => $mainhandler->getProjectName(),
210: 'project_area' => $dataobject->componenthandler->getComponentNameVerById($dataobject->getTaskComponentVersionId()),
211: 'task_key' => $dataobject->getTaskKey(),
212: 'task_name' => $dataobject->getTaskName(),
213: 'task_status' => $status,
214: 'task_owner' => $dataobject->getTaskOwnerName(),
215: 'task_assignee' => $dataobject->getTaskAssigneeName());
216: $this->sendEmailNotification($mainhandler,$this->getNotifyUserList($mainhandler),$params_arr);
217: }
218:
219: private function getNotifyUserList(&$mainhandler){
220: $uid_list_arr = array();
221: $dataobj = $mainhandler;
222: $i = 0;
223: while(1){
224: $accobj = $dataobj->getAppAccessObjByIndx($i);
225: if ( !is_object($accobj) ) break;
226: if ($accobj->getAccessPermTargetType() == 'group'){
227: $data_arr = $dataobj->getGroupUserlist($accobj->getIdentId());
228: if (is_array($data_arr))
229: foreach(array_keys($data_arr) as $key)
230: array_push($uid_list_arr,$data_arr[$key][0]);
231: }else{
232: array_push($uid_list_arr,$accobj->getIdentId());
233: }
234: $i++;
235: }
236: return array_unique($uid_list_arr);
237: }
238:
239: private function sendEmailNotification(&$mainhandler,$user_list_arr,$params_arr){
240: foreach (array_keys($user_list_arr) as $key){
241: $uid = $user_list_arr[$key][0];
242: $user_data = $mainhandler->getUserDataById($uid);
243: if (isset($user_data[0])){
244: $user_name = $user_data[2];
245: $user_email = $user_data[4];
246: $this->send($mainhandler,$user_name,$user_email,$params_arr);
247: }
248:
249: }
250: }
251:
252: private function getEmailMessage(&$mainhandler,$params_arr){
253: $msg = "
254: <html>
255: <body>
256: <b>{$params_arr['notification_message']}</b><br><br>
257: Project name: {$params_arr['project_name']}<br>
258: Project area: {$params_arr['project_area']}<br><br>
259: Task key: {$params_arr['task_key']}<br>
260: Task name: {$params_arr['task_name']}<br>
261: Task status: {$params_arr['task_status']}<br>
262: Task owner: {$params_arr['task_owner']}<br>
263: Task assignee: {$params_arr['task_assignee']}<br><br>
264: URL: {$mainhandler->getApplicationUrl()}/?page=manage&handler=project_task&action=retrieve&sbid={$params_arr['task_key']}<br>
265:
266: </body>
267: </html>";
268: return $msg;
269: }
270:
271: private function send(&$mainhandler,$user_name,$to,$params_arr){
272:
273: $hostname = exec('hostname -f');
274: $message = $this->getEmailMessage($mainhandler,$params_arr);
275: $subject = "status change: {$params_arr['task_key']}";
276: $headers = "From: $hostname \r\n".
277: "Reply-To: NO-REPLY \r\n".
278: "Content-type: text/html\r\n";
279:
280:
281: $mail_sent = mail( $to, $subject, $message, $headers );
282: }
283: }
284: