Files
FHC-Core/application/libraries/MessageLib.php
T
Paolo 0db611ed27 - Added new config entry in mail config file called enable_debug
- If enable_debug is true then info about the mail are logged into the CI error logs
- Fixed queries to get sent and received messages with Recipient_model, now messages for which a notice email was not sent are retrieved and messages are sorted by insertamum
- CL/Messages_model:
	- Before setting a message as read check if a record is already present
	- If the recipient is a prestudent then in table tbl_msg_message oe_kurzbz is set with the ou of the prestudent
	- The sender id (person_id) now is get from the currently logged user also when replying
- MessageLib->_sendNoticeEmails checks that the message was sent only from FAS (NOT from infocenter)
2020-02-18 15:19:58 +01:00

886 lines
31 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* Messaging Library for FH-Complete
*/
class MessageLib
{
// Config entries
const CFG_SYSTEM_PERSON_ID = 'system_person_id';
const CFG_SEND_IMMEDIATELY = 'send_immediately';
const CFG_MESSAGE_SERVER = 'message_server';
const CFG_MESSAGE_HTML_VIEW_URL = 'message_html_view_url';
const CFG_OU_RECEIVERS = 'ou_receivers';
const CFG_OU_RECEIVERS_NO_NOTICE = 'ou_receivers_no_notice';
const CFG_OU_RECEIVERS_PRIVATE = 'ou_receivers_private';
const CFG_REDIRECT_VIEW_MESSAGE_URL = 'redirect_view_message_url';
// Templates names
const NOTICE_TEMPLATE_HTML = 'MessageMailHTML';
const NOTICE_TEMPLATE_TXT = 'MessageMailTXT';
const NOTICE_TEMPLATE_FALLBACK_HTML = 'templates/mailHTML';
const NOTICE_TEMPLATE_FALLBACK_TXT = 'templates/mailTXT';
const EMAIL_KONTAKT_TYPE = 'email'; // Email kontakt type
const SENT_INFO_NEWLINE = '\n'; // tbl_msg_recipient->sentInfo separator
const ALT_OE = 'infocenter'; // alternative organisation unit when no one is found for a presetudent
private $_ci;
/**
* Constructor
*/
public function __construct()
{
// Get code igniter instance
$this->_ci =& get_instance();
// Loads message configuration
$this->_ci->config->load('message');
// Loads VorlageLib
$this->_ci->load->library('VorlageLib');
// Loads Mail library
$this->_ci->load->library('MailLib');
// Loads message models
$this->_ci->load->model('system/Message_model', 'MessageModel');
$this->_ci->load->model('system/MsgStatus_model', 'MsgStatusModel');
$this->_ci->load->model('system/Recipient_model', 'RecipientModel');
$this->_ci->load->model('system/Attachment_model', 'AttachmentModel');
}
//------------------------------------------------------------------------------------------------------------------
// Public methods
/**
* Returns the specified message for a specified person
*/
public function getMessage($msg_id, $person_id)
{
if (!is_numeric($msg_id)) return error('The given message id is not valid', MSG_ERR_INVALID_MSG_ID);
if (!is_numeric($person_id)) return error('The given person id is not valid', MSG_ERR_INVALID_RECIPIENTS);
return $this->_ci->RecipientModel->getMessage($msg_id, $person_id);
}
/**
* Sends a message to persons ($receiversPersonId)
*/
public function sendMessageUser(
$receiversPersonId, $subject, $body, // Required parameters
$sender_id = null, $senderOU = null, $relationmessage_id = null, $priority = MSG_PRIORITY_NORMAL, $multiPartMime = true
)
{
// Retrieves receiver id and checks that is valid
$receivers = $this->_getReceiversByPersonId($receiversPersonId);
if (isError($receivers)) return $receivers;
// Send the message and return the result
return $this->_sendMessage($receivers, null, $subject, $body, $sender_id, $senderOU, $relationmessage_id, $priority, $multiPartMime);
}
/**
* Sends a message to persons ($receiversPersonId)
*/
public function sendMessageUserTemplate(
$receiversPersonId, $vorlage, $parseData, // Required parameters
$orgform = null, $sender_id = null, $senderOU = null, $relationmessage_id = null, $priority = MSG_PRIORITY_NORMAL, $multiPartMime = true
)
{
// Loads template data
$templateResult = $this->_ci->vorlagelib->loadVorlagetext($vorlage, $senderOU, $orgform, getUserLanguage());
if (hasData($templateResult)) // if a template is found
{
$template = getData($templateResult)[0]; // template object
// Parses template subject
$subject = parseText($template->subject, $parseData);
// Parses template text
$body = parseText($template->text, $parseData);
return $this->sendMessageUser(
$receiversPersonId, $subject, $body, $sender_id, $senderOU, $relationmessage_id, $priority, $multiPartMime
);
}
elseif (isError($templateResult)) // if an error occured
{
return $templateResult; // return it
}
else // if a template was not found
{
return error('Template was not found', MSG_ERR_INVALID_TEMPLATE);
}
}
/**
* Sends a message to all the persons that are enabled to read messages for the given organisation unit ($receiversOU)
*/
public function sendMessageOU(
$receiversOU, $subject, $body, // Required parameters
$sender_id = null, $senderOU = null, $relationmessage_id = null, $priority = MSG_PRIORITY_NORMAL, $multiPartMime = true
)
{
// If the recipient is an organisation unit that would be possible to send the same message (same message id)
// to the entire organisation unit (one to many functionality)
// In this case the receiver id is a the one present in message configuration
$receiver = new stdClass();
$receiver->person_id = $this->_ci->config->item(self::CFG_SYSTEM_PERSON_ID);
$receivers = success(array($receiver));
// Send the message and return the result
return $this->_sendMessage($receivers, $receiversOU, $subject, $body, $sender_id, $senderOU, $relationmessage_id, $priority, $multiPartMime);
}
//------------------------------------------------------------------------------------------------------------------
// Public methods called by a job
/**
* Gets all NOT sent messages from DB and sends for each of them the notice email
* Does not return anything, it logs info and errors on CI logs and in tbl_msg_recipient table
* Wrapper for _sendNoticeEmail.
*/
public function sendAllEmailNotices($numberToSent, $numberPerTimeRange, $emailTimeRange, $emailFromSystem)
{
// Overrides MailLib configs with the given parameters
$this->_ci->maillib->overrideConfigs($numberToSent, $numberPerTimeRange, $emailTimeRange, $emailFromSystem);
// Retrieves a certain amount of NOT sent messages, the amount is given by maillib->email_number_to_sent
$messagesResult = $this->_ci->RecipientModel->getMessages(
self::EMAIL_KONTAKT_TYPE,
null,
$this->_ci->maillib->getEmailNumberToSent()
);
if (isError($messagesResult)) terminateWithError(getData($messagesResult)); // If an error occurred then log it and terminate
$sendNotice = $this->_sendNoticeEmails(getData($messagesResult));
if (isError($sendNotice)) terminateWithError(getData($sendNotice)); // If an error occurred then log it and terminate
}
//------------------------------------------------------------------------------------------------------------------
// Public methods used by to build the GUI to write messages to user/s
/**
* Retrieves message vars from view vw_msg_vars_person
*/
public function getMessageVarsPerson()
{
// Retrieves message vars from view vw_msg_vars_person
$messageVarsPerson = $this->_ci->MessageModel->getMessageVarsPerson();
if (isSuccess($messageVarsPerson)) // if everything is ok
{
$variablesArray = array();
$tmpVariablesArray = getData($messageVarsPerson);
// Starts from 1 to skip the first element which is person_id
for ($i = 1; $i < count($tmpVariablesArray); $i++)
{
$variablesArray['{'.str_replace(' ', '_', strtolower($tmpVariablesArray[$i])).'}'] = $tmpVariablesArray[$i];
}
return success($variablesArray);
}
return $messageVarsPerson; // otherwise returns the error
}
/**
* Retrieves message vars from view vw_msg_vars
*/
public function getMessageVarsPrestudent()
{
// Retrieves message vars from view vw_msg_vars
$messageVars = $this->_ci->MessageModel->getMessageVars();
if (isSuccess($messageVars)) // if everything is ok
{
$variablesArray = array();
$tmpVariablesArray = getData($messageVars);
// Starts from 1 to skip the first element which is person_id
for ($i = 1; $i < count($tmpVariablesArray); $i++)
{
$variablesArray['{'.str_replace(' ', '_', strtolower($tmpVariablesArray[$i])).'}'] = $tmpVariablesArray[$i];
}
return success($variablesArray);
}
return $messageVars; // otherwise returns the error
}
/**
* Retrieves organisation units for each role that a user plays inside that organisation unit
*/
public function getOeKurzbz($sender_id)
{
$this->_ci->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel');
// Retrieves organisation units for a user from database
$benutzer = $this->_ci->BenutzerfunktionModel->getByPersonId($sender_id);
if (isSuccess($benutzer)) // if everything is ok
{
$ouArray = array();
// Copies organisation units in $ouArray array
foreach (getData($benutzer) as $val) $ouArray[] = $val->oe_kurzbz;
return success($ouArray);
}
return $benutzer; // otherwise returns the error
}
//------------------------------------------------------------------------------------------------------------------
// Public methods used by REST API
/**
* Return all messages, including the latest status for specified user. It don´t returns Attachments.
* The sender organisation unit may be specified to filter messages
*/
public function getMessagesByUID($uid, $senderOU = null, $all = false)
{
if (isEmptyString($uid)) return error('The given message id is not valid', MSG_ERR_INVALID_MSG_ID);
return $this->_ci->RecipientModel->getMessagesByUID($uid, $senderOU, $all);
}
/**
* Return all messages, including the latest status for specified user. It does not return attachments
* The sender organisation unit may be specified to filter messages
*/
public function getMessagesByPerson($person_id, $senderOU = null, $all = false)
{
if (!is_numeric($person_id)) return error('The given message id is not valid', MSG_ERR_INVALID_MSG_ID);
return $this->_ci->RecipientModel->getMessagesByPerson($person_id, $senderOU, $all);
}
/**
* Get all sent messages from a person identified by person_id
* The sender organisation unit may be specified to filter messages
*/
public function getSentMessagesByPerson($person_id, $senderOU = null, $all = false)
{
if (!is_numeric($person_id)) return error('The given message id is not valid', MSG_ERR_INVALID_MSG_ID);
return $this->_ci->MessageModel->getMessagesByPerson($person_id, $senderOU, $all);
}
/**
* Retrieves a message by its token
* If a message is found with the given token then this message is set as read
*/
public function getMessageByToken($token)
{
if (isEmptyString($token)) return error('The given token is not valid', MSG_ERR_INVALID_TOKEN);
$messageTokenResult = $this->_ci->RecipientModel->getMessageByToken($token);
if (hasData($messageTokenResult))
{
// Searches for a status that is NOT unread
$found = false;
foreach (getData($messageTokenResult) as $message)
{
if ($message->status > MSG_STATUS_UNREAD)
{
$found = true;
break;
}
}
// If NOT found then insert the read status
if (!$found)
{
$uid = null;
if (!isEmptyString($messageTokenResult[0]->uid))
{
$uid = $messageTokenResult[0]->uid;
}
$statusData = array(
'message_id' => getData($messageTokenResult)[0]->message_id,
'person_id' => getData($messageTokenResult)[0]->receiver_id,
'status' => MSG_STATUS_READ,
'insertvon' => $uid
);
$messageTokenResultIns = $this->_ci->MsgStatusModel->insert($statusData);
// If an error occured while writing on data base, then return it
if (isError($messageTokenResultIns)) $messageTokenResult = $messageTokenResultIns;
}
}
return $messageTokenResult;
}
/**
* Counts the unread messages for the given user
* The sender organisation unit may be specified to filter messages
*/
public function getCountUnreadMessages($person_id, $senderOU = null)
{
if (!is_numeric($person_id)) return error('The given person id is not valid', MSG_ERR_INVALID_RECIPIENTS);
return $this->_ci->RecipientModel->getCountUnreadMessages($person_id, $senderOU);
}
/**
* Change the message status of the given message specified by message_id and person_id, using the given status
* NOTE: it performs an insert NOT an update
*/
public function updateMessageStatus($message_id, $person_id, $status)
{
if (!is_numeric($message_id)) return error('The given message id is not valid', MSG_ERR_INVALID_MSG_ID);
if (!is_numeric($person_id)) return error('The given person id is not valid', MSG_ERR_INVALID_RECIPIENTS);
if (!is_numeric($status)) return error('The given status is not valid', MSG_ERR_INVALID_STATUS_ID);
$this->_ci->MsgStatusModel->resetQuery(); // Reset an eventually already buit query
// Searches if the status is already present
$updMessageStatusResult = $this->_ci->MsgStatusModel->load(array($message_id, $person_id, $status));
if (!hasData($updMessageStatusResult)) // if not found
{
// Insert the new status
$statusKey = array(
'message_id' => $message_id,
'person_id' => $person_id,
'status' => $status
);
$updMessageStatusResult = $this->_ci->MsgStatusModel->insert($statusKey);
}
return $updMessageStatusResult;
}
//------------------------------------------------------------------------------------------------------------------
// Private methods
/**
*
*/
private function _getSender($sender_id)
{
// By default the sender is defined in message configuration
$sender = success($this->_ci->config->item(self::CFG_SYSTEM_PERSON_ID));
if ($sender_id != null) // if it was given as parameter
{
if (is_numeric($sender_id)) // if it valid -> it is a number
{
$sender = success($sender_id); // return it as a success object
}
else
{
// Otherwise returns an error
$sender = error('The given sender is not valid', MSG_ERR_INVALID_SENDER);
}
}
return $sender;
}
/**
* Checks if the given receiver ids belong to persons in database
*/
private function _getReceiversByPersonId($receiver_id)
{
$this->_ci->load->model('person/Person_model', 'PersonModel');
// Reset an eventually already buit query
$this->_ci->PersonModel->resetQuery();
// Get only this columns
$this->_ci->PersonModel->addSelect('person_id');
// Loads from database the person by its person_id
$personResult = $this->_ci->PersonModel->load($receiver_id);
if (hasData($personResult)) // if data are retrieved
{
return $personResult; // return them
}
else // otherwise an error occurred (blocking error or data not found)
{
return error('The given person id is not valid', MSG_ERR_INVALID_RECIPIENTS);
}
}
/**
* Save a new message in DB
*/
private function _saveMessage($sender_id, $senderOU, $receiver_id, $receiverOU, $subject, $body, $priority, $relationmessage_id)
{
// Starts database transaction
$this->_ci->db->trans_start(false);
$this->_ci->load->model('person/Benutzer_model', 'BenutzerModel');
$uid = null;
$benutzerDB = $this->_ci->BenutzerModel->loadWhere(array('person_id' => $sender_id));
if (hasData($benutzerDB))
{
$uid = getData($benutzerDB)[0]->uid;
}
// Store message information in tbl_msg_message
$messageData = array(
'person_id' => $sender_id,
'subject' => $subject,
'body' => $body,
'priority' => $priority,
'relationmessage_id' => $relationmessage_id,
'oe_kurzbz' => $senderOU
);
$saveMessageResult = $this->_ci->MessageModel->insert($messageData);
if (isSuccess($saveMessageResult))
{
$messageId = getData($saveMessageResult); // Gets the message id generated by database
// Store message information in tbl_msg_recipient
$recipientData = array(
'person_id' => $receiver_id,
'message_id' => $messageId,
'token' => generateToken(),
'oe_kurzbz' => $receiverOU
);
$saveMessageResult = $this->_ci->RecipientModel->insert($recipientData);
if (isSuccess($saveMessageResult))
{
// Store message information in tbl_msg_status
$statusData = array(
'message_id' => $messageId,
'person_id' => $receiver_id,
'status' => MSG_STATUS_UNREAD,
'insertvon' => $uid
);
$saveMessageResult = $this->_ci->MsgStatusModel->insert($statusData);
}
}
$this->_ci->db->trans_complete(); // Ends database transaction
// If the transaction failed...
if ($this->_ci->db->trans_status() === false || isError($saveMessageResult))
{
$this->_ci->db->trans_rollback(); // ...then rollback
}
else // otherwise commit...
{
$this->_ci->db->trans_commit();
$saveMessageResult = success($messageId); // ...and returns the message id
}
return $saveMessageResult;
}
/**
* Set the message as sent successfully by setting columns 'sent' and 'sentinfo' of table tbl_msg_recipient
* sent column is set with date of delivery
* sentinfo is set to null
*/
private function _setSentSuccess($message_id, $receiver_id)
{
return $this->_ci->RecipientModel->update(array($receiver_id, $message_id), array('sent' => 'NOW()', 'sentinfo' => null));
}
/**
* Set the message as sent with error by setting columns 'sent' and 'sentinfo' of table tbl_msg_recipient
* Stores the type of error in 'sentinfo' column keeping en eventual previous error
* sent column is set to null
*/
private function _setSentError($message_id, $receiver_id, $sentInfo, $prevSentInfo)
{
if (!isEmptyString($prevSentInfo))
{
$sentInfo .= self::SENT_INFO_NEWLINE.$prevSentInfo;
}
return $this->_ci->RecipientModel->update(array($receiver_id, $message_id), array('sent' => null, 'sentinfo' => $sentInfo));
}
/**
* Returns the notice body. Tries to use the template present in database and then falling back
* on the one present in filesystem. If both fail then an error is returned
*/
private function _getNoticeBody($dbEmailNoticeTemplate, $fsEmailNoticeTemplate, $viewMessageLink, $subject, $body)
{
$noticeBody = null; // pessimistic expectation
if (!isEmptyString($dbEmailNoticeTemplate))
{
$noticeBody = parseText(
$dbEmailNoticeTemplate,
array(
'href' => $viewMessageLink,
'subject' => $subject,
'body' => $body
)
);
}
else
{
$noticeBody = parseText(
$fsEmailNoticeTemplate,
array(
'href' => $viewMessageLink,
'subject' => $subject,
'body' => $body
)
);
}
if (isEmptyString($noticeBody)) return error('An error occurred while generating the notice body');
return success($noticeBody);
}
/**
* Sends notice emails to the recipient of a message
*/
private function _sendNoticeEmails($messageIds)
{
// Retrieves the messages information using the given message ids array
$messagesResult = $this->_ci->RecipientModel->getMessagesById($messageIds);
if (isError($messagesResult)) return $messageRecipientResult; // if an error occured then return it
if (!hasData($messagesResult)) return error('No data found with the given message ids'); // if no data found then return an error
$messages = array(); // all the worked messages will be added here
// Loops through $messagesResult and stores data about a message in $message
foreach (getData($messagesResult) as $message)
{
// If the recipient organisation unit is in the list of organisation units that do not receive notice emails
if (array_search($message->receiver_ou, $this->_ci->config->item(self::CFG_OU_RECEIVERS_NO_NOTICE)))
{
// Then there is no need to send a notice email to this organisation unit
}
else // otherwise tries to retrieve the right email contact for the message recipient
{
$message->receiverContact = null; // by default set the recipient contact as null
// If the message was sent to an organisation unit then retrives degree program email
if ($message->receiver_id == $this->_ci->config->item(self::CFG_SYSTEM_PERSON_ID) && !isEmptyString($message->receiver_ou))
{
$this->_ci->load->model('organisation/Studiengang_model', 'StudiengangModel');
$studiengangResult = $this->_ci->StudiengangModel->loadWhere(array('oe_kurzbz' => $message->receiver_ou));
if (isError($studiengangResult)) return $studiengangResult; // if an error occured then return it
// Use the degree program email
if (hasData($studiengangResult)) $message->receiverContact = getData($studiengangResult)[0]->email;
}
// If message was sent from FAS and NOT from infocenter
elseif (!isEmptyString($message->sender_ou)
&& !array_search($message->sender_ou, $this->_ci->config->item(self::CFG_OU_RECEIVERS_NO_NOTICE)))
{
// If the recipient organisation unit is NOT in the list of organisation units that sent only to private emails
if (array_search($message->receiver_ou, $this->_ci->config->item(self::CFG_OU_RECEIVERS_PRIVATE)) === false)
{
$this->_ci->load->model('person/Benutzer_model', 'BenutzerModel');
// And the receiver has an active account for the given organisation unit
$benutzerResult = $this->_ci->BenutzerModel->getActiveUserByPersonIdAndOrganisationUnit($message->receiver_id, $message->sender_ou);
if (isError($benutzerResult)) return $benutzerResult; // if an error occured then return it
// Use the uid + domain email
if (hasData($benutzerResult)) $message->receiverContact = getData($benutzerResult)[0]->uid .'@'.DOMAIN;
}
// Otherwise try with the private email
if (isEmptyString($message->receiverContact))
{
$privateEmailResult = $this->_getPrivateEmail($message->receiver_id);
if (isError($privateEmailResult)) return $privateEmailResult; // if an error occured then return it
// Use the private email
if (hasData($privateEmailResult)) $message->receiverContact = getData($privateEmailResult);
}
}
else // the recipient is a person
{
$this->_ci->load->model('person/Benutzer_model', 'BenutzerModel');
// The recipient has an active account
$benutzerResult = $this->_ci->BenutzerModel->loadWhere(array('person_id' => $message->receiver_id, 'aktiv' => true));
if (isError($benutzerResult)) return $benutzerResult; // if an error occured then return it
// If the user is present and active
if (hasData($benutzerResult))
{
$this->_ci->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
$mitarbeiterResult = $this->_ci->MitarbeiterModel->loadWhere(array('mitarbeiter_uid' => getData($benutzerResult)[0]->uid));
if (isError($mitarbeiterResult)) return $mitarbeiterResult; // if an error occured then return it
// If employee
if (hasData($mitarbeiterResult))
{
$message->receiverContact = getData($benutzerResult)[0]->uid .'@'.DOMAIN; // Use the uid + domain email
}
else // ...otherwise...
{
$this->_ci->load->model('crm/Prestudent_model', 'PrestudentModel');
// ...try to get all the prestudent for this receiver
$prestudentResults = $this->_ci->PrestudentModel->getOrganisationunitsByPersonId($message->receiver_id);
if (isError($prestudentResults)) return $prestudentResults; // if an error occured then return it
// If there are presetudent
if (hasData($prestudentResults))
{
$inArray = true;
$organisationUnits = getData($prestudentResults);
// Look if any of the organization units of this prestudent are in the list of the
// organization units that will not send the notice email to the internal account
foreach ($organisationUnits as $organisationUnit)
{
// If the recipient organisation unit is NOT in the list of organisation units that sent only to private emails
if (array_search($organisationUnit, $this->_ci->config->item(self::CFG_OU_RECEIVERS_PRIVATE)) === false)
{
$inArray = false;
break;
}
}
// If the recipient prestudent organization unit is not in in the list of the
// organization units that will not send the notice email to the internal account
if (!$inArray)
{
// Then use the private email
$privateEmailResult = $this->_getPrivateEmail($message->receiver_id);
if (isError($privateEmailResult)) return $privateEmailResult; // if an error occured then return it
if (hasData($privateEmailResult)) $message->receiverContact = getData($privateEmailResult);
}
else // Use the most recent UID + domain
{
$this->_ci->BenutzerModel->resetQuery();
$this->_ci->BenutzerModel->addOrder('updateamum', 'DESC');
$this->_ci->BenutzerModel->addOrder('insertamum', 'DESC');
$benutzerResult = $this->_ci->BenutzerModel->loadWhere(array('person_id' => $message->receiver_id));
if (isError($benutzerResult)) return $benutzerResult; // if an error occured then return it
$message->receiverContact = getData($benutzerResult)[0]->uid .'@'.DOMAIN; // Use the uid + domain email
}
}
}
}
else // otherwise use the private email
{
$privateEmailResult = $this->_getPrivateEmail($message->receiver_id);
if (isError($privateEmailResult)) return $privateEmailResult; // if an error occured then return it
// Use the private email
if (hasData($privateEmailResult)) $message->receiverContact = getData($privateEmailResult);
}
}
}
$messages[] = $message; // add new message to be noticed into the messages array
}
return $this->_sendNoticeEmail($messages);
}
/**
*
*/
private function _getPrivateEmail($person_id)
{
$this->_ci->load->model('person/Kontakt_model', 'KontaktModel');
$getPrivateEmail = $this->_ci->KontaktModel->getContactByPersonId($person_id, self::EMAIL_KONTAKT_TYPE);
if (hasData($getPrivateEmail)) return success(getData($getPrivateEmail)[0]->kontakt);
else return success();
return $getPrivateEmail;
}
/**
* Core method to send one or more email notices for one or more messages
*/
private function _sendNoticeEmail($messages)
{
// Prefix for all links that will be subsequently generated
$prefixLink = $this->_ci->config->item(self::CFG_MESSAGE_SERVER).$this->_ci->config->item(self::CFG_MESSAGE_HTML_VIEW_URL);
// Loads all the needed templates for HTML and plain text. Main templates from database, fallback templates from file system
$dbEmailNoticeTemplateHTML = $this->_loadDbNoticeEmailTemplate(self::NOTICE_TEMPLATE_HTML);
$dbEmailNoticeTemplateTXT = $this->_loadDbNoticeEmailTemplate(self::NOTICE_TEMPLATE_TXT);
$fsEmailNoticeTemplateHTML = $this->_loadFsNoticeEmailTemplate(self::NOTICE_TEMPLATE_FALLBACK_HTML);
$fsEmailNoticeTemplateTXT = $this->_loadFsNoticeEmailTemplate(self::NOTICE_TEMPLATE_FALLBACK_TXT);
// Loops through all the messages to be sent
foreach ($messages as $messageData)
{
// Checks if this person has a valid email address where to send the notice email
if (!isEmptyString($messageData->receiverContact))
{
// Create a link to the controller to view the message using a token
$viewMessageLink = $prefixLink.$messageData->token;
// Generates notice email body in HTML format
$noticeHTMLBody = $this->_getNoticeBody(
$dbEmailNoticeTemplateHTML, $fsEmailNoticeTemplateHTML, $viewMessageLink, $messageData->subject, $messageData->body
);
// If an error occured during the generation then the error itself is returned
if (isError($noticeHTMLBody)) return $noticeHTMLBody;
// Generates notice email body in plain text format
$noticeTXTBody = $this->_getNoticeBody(
$dbEmailNoticeTemplateTXT, $fsEmailNoticeTemplateTXT, $viewMessageLink, $messageData->subject, $messageData->body
);
// If an error occured during the generation then the error itself is returned
if (isError($noticeTXTBody)) return $noticeTXTBody;
// Sending email
$sent = $this->_ci->maillib->send(
null,
$messageData->receiverContact,
$messageData->subject,
getData($noticeHTMLBody),
null,
null,
null,
getData($noticeTXTBody)
);
// If errors occurred while sending the email
if (!$sent)
{
// Set in database why this email is NOT going to be send
$sse = $this->_setSentError(
$messageData->message_id,
$messageData->receiver_id,
'An error occurred while sending the notice email',
$messageData->sentinfo
);
// If database error occurred then return it, otherwise return a logic error
return isError($sse) ? $sse : error('An error occurred while sending the notice email');
}
else // success!
{
// Set in database that the notice email was succesfully sent
$sss = $this->_setSentSuccess($messageData->message_id, $messageData->receiver_id);
if (isError($sss)) return $sss; // If database error occurred then return it
}
}
}
return success('Notice emails sent successfully');
}
/**
* Sends new message core method, may be wrapped by other methods.
* If success then returns an array of successfully saved message ids
*/
private function _sendMessage(
$receivers, $receiversOU, $subject, $body, $sender_id, $senderOU, $relationmessage_id, $priority, $multiPartMime
)
{
// Checks if sender is fine
$sender = $this->_getSender($sender_id);
if (!hasData($sender)) return $sender;
// Checks if the sender and receiver organisation unit are valid
if (($receiversOU != null && !$this->_ouExists($receiversOU)) || ($senderOU != null && !$this->_ouExists($senderOU)))
{
return error('The given organisation unit is not valid', MSG_ERR_INVALID_OU);
}
// Checks subjects
if (isEmptyString($subject)) return error('The given subject is an empty string', MSG_ERR_INVALID_SUBJECT);
// Checks body
if (isEmptyString($body)) return error('The given body is an empty string', MSG_ERR_INVALID_BODY);
$savedMessages = array(); // This array contains all the message ids of the saved messages
// Looping on receivers
foreach (getData($receivers) as $receiver)
{
// Save message in database
$saveMessageResult = $this->_saveMessage(
getData($sender), $senderOU, $receiver->person_id, $receiversOU, $subject, $body, $priority, $relationmessage_id
);
if (isSuccess($saveMessageResult)) // If successfully saved
{
$savedMessages[] = getData($saveMessageResult); // store the message id of the saved message
}
else
{
return $saveMessageResult; // If an error occured while saving
}
}
// If the system is configured to send messages immediately
if ($this->_ci->config->item(self::CFG_SEND_IMMEDIATELY) === true)
{
// Looping through saved messages ids
foreach ($savedMessages as $message_id)
{
// Send message notice via email!
$sendNotice = $this->_sendNoticeEmails(array($message_id));
// If an error occurred then return it
if (isError($sendNotice)) return $sendNotice;
}
}
return success($savedMessages);
}
/**
* Checks if the given organisation unit exists in database
*/
private function _ouExists($ou)
{
$this->_ci->load->model('organisation/Organisationseinheit_model', 'OrganisationseinheitModel');
// Reset an eventually already buit query
$this->_ci->OrganisationseinheitModel->resetQuery();
// Get only this columns
$this->_ci->OrganisationseinheitModel->addSelect('oe_kurzbz');
// Retrieves the given organisation unit from database
$ouResults = $this->_ci->OrganisationseinheitModel->loadWhere(array('oe_kurzbz' => $ou));
return hasData($ouResults);
}
/**
* Loads a the specified template from database
* Returns null if not found or on failure
*/
private function _loadDbNoticeEmailTemplate($dbTemplateName)
{
$emailNoticeTemplate = null;
$vorlageResult = $this->_ci->vorlagelib->loadVorlagetext($dbTemplateName);
if (hasData($vorlageResult))
{
$emailNoticeTemplate = getData($vorlageResult)[0]->text;
}
return $emailNoticeTemplate;
}
/**
* Loads a the specified template from database
*/
private function _loadFsNoticeEmailTemplate($fsTemplateName)
{
return $this->_ci->load->view($fsTemplateName, null, true);
}
}