Newer
Older
<?php
/******************************************************************************
BATCH PROCESS EVENT STACK
Processes events from table event_stack
2 - Merge template for each recipient / event
3 - Prepare e-mail and add to e-mail stack
******************************************************************************/
/* begin */
// load the config and prepare to process

Cyril Vazquez
committed
$state = 'LOAD_NOTIFICATIONS';
/**********************************************************************/
/* LOAD_NOTIFICATIONS */
/* Load notification defsidentified with notification id */
/**********************************************************************/
case 'LOAD_NOTIFICATIONS':
$logger->write('Loading configuration for notification id '.$notificationId, 'INFO');
$notification = $notifications_controler->getByNotificationId($notificationId);
if ($notification === false) {
Bt_exitBatch(1, "Notification '".$notificationId."' not found");
}
if ($notification->is_enabled === 'N') {
Bt_exitBatch(100, "Notification '".$notificationId."' is disabled");
}
$state = 'LOAD_EVENTS';
break;
/**********************************************************************/
/* LOAD_EVENTS */
/* Checking if the stack has notifications to proceed */
/**********************************************************************/
case 'LOAD_EVENTS':
$logger->write('Loading events for notification sid '.$notification->notification_sid, 'INFO');
$events = $events_controler->getEventsByNotificationSid($notification->notification_sid);
$totalEventsToProcess = count($events);
$currentEvent = 0;
if ($totalEventsToProcess === 0) {
Bt_exitBatch(0, 'No event to process');
}
$logger->write($totalEventsToProcess.' events to process', 'INFO');
$tmpNotifs = array();
$state = 'MERGE_EVENT';
break;
/**********************************************************************/
/* MERGE_EVENT */
/* Process event stack to get recipients */
/**********************************************************************/
case 'MERGE_EVENT':
foreach ($events as $event) {
$logger->write("Getting recipients using diffusion type '".$notification->diffusion_type."'", 'INFO');
// Diffusion type specific recipients
$recipients = array();
$recipients = $diffusion_type_controler->getRecipients($notification, $event);
// Diffusion type specific res_id
$logger->write("Getting document ids using diffusion type '".$notification->diffusion_type."'", 'INFO');
$res_id = false;
if ($event->table_name == $coll_table || $event->table_name == $coll_view) {
$res_id = $event->record_id;
} else {
$res_id = $diffusion_type_controler->getResId($notification, $event);
}
$event->res_id = $res_id;
//Attach Mode ?
if (!empty($notification->attachfor_type) || $notification->attachfor_type != null) {
$attachMode = true;
$logger->write('The document will be attached for each recipient', 'INFO');
} else {
$attachMode = false;
$logger->write($nbRecipients.' recipients found, checking active and absences', 'INFO');
if ($notification->diffusion_type === 'dest_entity') {
for ($i = 0; $i < $nbRecipients; ++$i) {
$recipient = $recipients[$i];
$entity_id = $recipient->entity_id;
$logger->write('Recipient entity '.$entity_id, 'INFO');
$db = new Database();
$query = 'SELECT param_value_int FROM parameters WHERE id = ?';
$stmt = $db -> query($query, array('user_quota'));
if (($recipient->enabled == 'N' AND $stmt -> fetchColumn() == 0) || $recipient->mail == '') {
$logger->write($entity_id.' is disabled or mail is invalid, this notification will not be send', 'INFO');
unset($recipients[$i]);
continue;
}
if (!isset($tmpNotifs[$entity_id])) {
$tmpNotifs[$entity_id]['recipient'] = $recipient;
}
$tmpNotifs[$entity_id]['events'][] = $event;
} else {
for ($i = 0; $i < $nbRecipients; ++$i) {
$recipient = $recipients[$i];
$user_id = $recipient->user_id;
$logger->write('Recipient '.$user_id, 'INFO');
$db = new Database();
$query = 'SELECT param_value_int FROM parameters WHERE id = ?';
$stmt = $db -> query($query, array('user_quota'));
if (($recipient->status == 'SPD' AND $stmt -> fetchColumn() == 0) || $recipient->status == 'DEL') {
$logger->write($user_id.' is disabled or deleted, this notification will not be send', 'INFO');
unset($recipients[$i]);
continue;
}
if (!isset($tmpNotifs[$user_id])) {
$tmpNotifs[$user_id]['recipient'] = $recipient;
}
$tmpNotifs[$user_id]['events'][] = $event;
if (count($recipients) === 0) {
$logger->write('No recipient found', 'WARNING');
$events_controler->commitEvent($event->event_stack_sid, 'INFO: no recipient found');
}
}
$totalNotificationsToProcess = count($tmpNotifs);
$logger->write($totalNotificationsToProcess.' notifications to process', 'INFO');
switch ($notification->notification_mode) {
case 'EMAIL':
$state = 'FILL_EMAIL_STACK';
break;
case 'RSS':
$state = 'FILL_RSS_STACK';
break;
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
/**********************************************************************/
/* FILL_EMAIL_STACK */
/* Merge template and fill notif_email_stack */
/**********************************************************************/
case 'FILL_EMAIL_STACK':
foreach ($tmpNotifs as $user_id => $tmpNotif) {
// Merge template with data and style
$logger->write('Merging template #'.$notification->template_id
.' ('.count($tmpNotif['events']).' events) for user '.$user_id, 'INFO');
$params = array(
'recipient' => $tmpNotif['recipient'],
'events' => $tmpNotif['events'],
'notification' => $notification,
'maarchUrl' => $maarchUrl,
'maarchApps' => $maarchApps,
'coll_id' => $coll_id,
'res_table' => $coll_table,
'res_view' => $coll_view,
);
$html = $templates_controler->merge($notification->template_id, $params, 'content');
if (strlen($html) === 0) {
foreach ($tmpNotif['events'] as $event) {
$events_controler->commitEvent($event->event_stack_sid, 'FAILED: Error when merging template');
}
Bt_exitBatch(8, 'Could not merge template with the data');
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
// Prepare e-mail for stack
$sender = (string) $mailerParams->mailfrom;
$recipient_mail = $tmpNotif['recipient']->mail;
$subject = $notification->description;
$html = $func->protect_string_db($html, '', 'no');
$html = str_replace('&', '&', $html);
$html = str_replace('&', '#and#', $html);
// Attachments
$attachments = array();
if ($attachMode) {
$logger->write('Adding attachments', 'INFO');
foreach ($tmpNotif['events'] as $event) {
// Check if event is related to document in collection
if ($event->res_id != '') {
$query = 'SELECT '
.'ds.path_template ,'
.'mlb.path, '
.'mlb.filename '
.'FROM '.$coll_view.' mlb LEFT JOIN docservers ds ON mlb.docserver_id = ds.docserver_id '
.'WHERE mlb.res_id = ?';
$stmt = Bt_doQuery($db, $query, array($event->res_id));
$path_parts = $stmt->fetchObject();
$path = $path_parts->path_template.str_replace('#', '/', $path_parts->path).$path_parts->filename;
$path = str_replace('//', '/', $path);
$path = str_replace('\\', '/', $path);
$attachments[] = $path;
}
$logger->write('Adding e-mail to email stack', 'INFO');
if ($_SESSION['config']['databasetype'] == 'ORACLE') {
$query = "DECLARE
vString notif_email_stack.html_body%type;
BEGIN
vString := '".$html."';
INSERT INTO "._NOTIF_EMAIL_STACK_TABLE_NAME."
(sender, recipient, subject, html_body, charset, attachments, module)
VALUES (?, ?, ?, vString, ?, '".implode(',', $attachments)."', 'notifications');
END;";
$arrayPDO = array($sender, $recipient_mail, $subject, $mailerParams->charset);
if (count($attachments) > 0) {
$query = 'INSERT INTO '._NOTIF_EMAIL_STACK_TABLE_NAME
.' (sender, recipient, subject, html_body, charset, attachments, module) '
."VALUES (?, ?, ?, ?, ?, '".implode(',', $attachments)."', 'notifications')";
} else {
$query = 'INSERT INTO '._NOTIF_EMAIL_STACK_TABLE_NAME
.' (sender, recipient, subject, html_body, charset, module) '
."VALUES (?, ?, ?, ?, ?, 'notifications')";
}
$arrayPDO = array($sender, $recipient_mail, $subject, $html, $mailerParams->charset);
//$logger->write('SQL query:' . $query, 'DEBUG');
$db2->query($query, $arrayPDO);
foreach ($tmpNotif['events'] as $event) {
$events_controler->commitEvent($event->event_stack_sid, 'SUCCESS');
}
}
$logger->write('End of process', 'INFO');
Bt_logInDataBase(