From 11f3fad1f7c530af2886313ca67612d576e9761e Mon Sep 17 00:00:00 2001 From: Paolo Date: Fri, 14 Feb 2020 19:17:09 +0100 Subject: [PATCH] Changed logic to send notice email to a message recipient --- application/config/message.php | 5 + application/libraries/MessageLib.php | 265 +++++++++++++----- application/models/CL/Messages_model.php | 3 +- application/models/person/Benutzer_model.php | 15 + application/models/person/Kontakt_model.php | 41 ++- application/models/system/Recipient_model.php | 88 ++---- 6 files changed, 261 insertions(+), 156 deletions(-) diff --git a/application/config/message.php b/application/config/message.php index b13fbe8b9..c719b65cb 100644 --- a/application/config/message.php +++ b/application/config/message.php @@ -12,7 +12,12 @@ $config['message_html_view_url'] = '/system/messages/ViewMessage/toHTML/'; // Change this to CIS Server (https://cis.example.com/index.ci.php) if you are sending Messages from Vilesci $config['message_server'] = site_url(); +// Organisation unit function that are allowed to read messages for the organisation unit $config['ou_receivers'] = array('ass'); +// Organisation units that will never receive notice emails +$config['ou_receivers_no_notice'] = array('infocenter'); +// Organisation units that will not send the notice email to the internal account, but to the private one +$config['ou_receivers_private'] = array('eac', 'ewu', 'scs'); $config['message_redirect_url'] = array(); $config['message_redirect_url']['fallback'] = site_url('system/messages/ViewMessage/writeReply'); diff --git a/application/libraries/MessageLib.php b/application/libraries/MessageLib.php index 5be444243..6e8c40a0a 100644 --- a/application/libraries/MessageLib.php +++ b/application/libraries/MessageLib.php @@ -13,6 +13,8 @@ class MessageLib 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 @@ -24,6 +26,8 @@ class MessageLib 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; /** @@ -47,11 +51,6 @@ class MessageLib $this->_ci->load->model('system/MsgStatus_model', 'MsgStatusModel'); $this->_ci->load->model('system/Recipient_model', 'RecipientModel'); $this->_ci->load->model('system/Attachment_model', 'AttachmentModel'); - - // Loads extra models - $this->_ci->load->model('person/Person_model', 'PersonModel'); - $this->_ci->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel'); - $this->_ci->load->model('organisation/Organisationseinheit_model', 'OrganisationseinheitModel'); } //------------------------------------------------------------------------------------------------------------------ @@ -219,6 +218,8 @@ class MessageLib */ 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 @@ -388,6 +389,8 @@ class MessageLib */ private function _getReceiversByPersonId($receiver_id) { + $this->_ci->load->model('person/Person_model', 'PersonModel'); + // Reset an eventually already buit query $this->_ci->PersonModel->resetQuery(); @@ -543,32 +546,137 @@ class MessageLib */ private function _sendOneNotice($message_id) { - // Get the message and related data (sender, recipient, etc...) - $messageResult = $this->_ci->RecipientModel->getMessages( - self::EMAIL_KONTAKT_TYPE, - $message_id - ); - - if (isError($messageResult)) return $messageResult; // if an error occured then return it + // Retrieves the message information by message_id + $messageResult = $this->_ci->RecipientModel->getMessageById($message_id); + if (isError($messageResult)) return $messageRecipientResult; // if an error occured then return it if (!hasData($messageResult)) return error('No data found with the given message id'); // if no data found then return an error - // If the message was sent to an organisation unit, then retrives the allowed people to receive the notice email for that organisation unit - $messages = getData($messageResult); - if (count($messages) == 1 - && $messages[0]->receiver_id == $this->_ci->config->item(self::CFG_SYSTEM_PERSON_ID) - && !isEmptyString($messages[0]->oe_kurzbz)) + // Contains the message info + $message = getData($messageResult)[0]; + + // 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))) { - $messageResult = $this->_ci->RecipientModel->getMessagesToSentToOE( - $messages[0]->oe_kurzbz, - $this->_ci->config->item(MessageLib::CFG_OU_RECEIVERS), - self::EMAIL_KONTAKT_TYPE - ); + return success('There is no need to send a notice email to this organisation unit'); } - if (isError($messageResult)) return $messageResult; - if (!hasData($messageResult)) return error('It is not possible to retrieve the recipient for this message: '.$message_id); + $message->receiverContact = null; // by default set the recipient contact as null - return $this->_sendNotice(getData($messageResult)); + // 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 + elseif (!isEmptyString($message->sender_ou)) + { + // 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 ($message->receiverContact == null) + { + $this->_ci->load->model('person/Kontakt_model', 'KontaktModel'); + + $kontaktResult = $this->_ci->KontaktModel->getContactByPersonId($person_id, self::EMAIL_KONTAKT_TYPE); + if (isError($kontaktResult)) return $kontaktResult; // if an error occured then return it + + // Use the private email + if (hasData($kontaktResult)) $message->receiverContact = getData($kontaktResult)[0]->kontakt; + } + } + else + { + $this->_ci->load->model('person/Benutzer_model', 'BenutzerModel'); + + // 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)) + { + $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; + } + else + { + $this->_ci->load->model('crm/Prestudent_model', 'PrestudentModel'); + + $prestudentResults = $this->_ci->PrestudentModel->getOrganisationunitsByPersonId($message->receiver_id); + if (isError($prestudentResults)) return $prestudentResults; // if an error occured then return it + + $inArray = true; + + if (hasData($prestudentResults)) + { + $organisationUnits = getData($prestudentResults); + + 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($message->receiver_ou, $this->_ci->config->item(self::CFG_OU_RECEIVERS_PRIVATE)) === false) + { + $inArray = false; + break; + } + } + + if (!$inArray) + { + $this->_ci->load->model('person/Kontakt_model', 'KontaktModel'); + + $kontaktResult = $this->_ci->KontaktModel->getContactByPersonId($message->receiver_id, self::EMAIL_KONTAKT_TYPE); + if (isError($kontaktResult)) return $kontaktResult; // if an error occured then return it + + // Use the private email + if (hasData($kontaktResult)) $message->receiverContact = getData($kontaktResult)[0]->kontakt; + } + else + { + + } + } + } + } + else // use the private email + { + $this->_ci->load->model('person/Kontakt_model', 'KontaktModel'); + + $kontaktResult = $this->_ci->KontaktModel->getContactByPersonId($message->receiver_id, self::EMAIL_KONTAKT_TYPE); + if (isError($kontaktResult)) return $kontaktResult; // if an error occured then return it + + // Use the private email + if (hasData($kontaktResult)) $message->receiverContact = getData($kontaktResult)[0]->kontakt; + } + } + + var_dump_to_error_log($message); + + return $this->_sendNotice(array($message)); } /** @@ -589,71 +697,71 @@ class MessageLib foreach ($messagesResult as $messageData) { // Checks if this person has a valid email address where to send the notice email - if (isEmptyString($messageData->receiver) && isEmptyString($messageData->employeecontact)) + // NOTE: this is a NON blocking error! + if (isEmptyString($messageData->receiverContact)) { // Set in database why this email is NOT going to be send $sse = $this->_setSentError( $messageData->message_id, $messageData->receiver_id, - 'This person does not have an email account', + 'This person or organization unit does not have an email account', $messageData->sentinfo ); // If database error occurred then return it if (isError($sse)) return $sse; - - continue; // Skip the rest, continue with the next one } - - // Create a link to the controller to view the message using a token - $viewMessageLink = $prefixLink.$messageData->token; - - // Generates notice email body in HTML and plain text version. - // If an error occured during the generation then the error itself is returned - $noticeHTMLBody = $this->_getNoticeBody( - $dbEmailNoticeTemplateHTML, $fsEmailNoticeTemplateHTML, $viewMessageLink, $messageData->subject, $messageData->body - ); - if (isError($noticeHTMLBody)) return $noticeHTMLBody; - $noticeTXTBody = $this->_getNoticeBody( - $dbEmailNoticeTemplateTXT, $fsEmailNoticeTemplateTXT, $viewMessageLink, $messageData->subject, $messageData->body - ); - if (isError($noticeTXTBody)) return $noticeTXTBody; - - // If an employeecontact contact is present then use it, otherwise use the personal contacts - $receiverContact = $messageData->receiver; - if (!isEmptyString($messageData->employeecontact)) $receiverContact = $messageData->employeecontact.'@'.DOMAIN; - - // Sending email - $sent = $this->_ci->maillib->send( - null, - $receiverContact, - $messageData->subject, - getData($noticeHTMLBody), - null, - null, - null, - getData($noticeTXTBody) - ); - - // If errors occurred while sending the email - if (!$sent) + else { - // 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 email', - $messageData->sentinfo + // 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 database error occurred then return it, otherwise return a logic error - return isError($sse) ? $sse : error('An error occurred while sending the 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 + // 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 + } } } @@ -710,6 +818,9 @@ class MessageLib { // Send message notice via email! $sendNotice = $this->_sendOneNotice($message_id); + + var_dump_to_error_log($sendNotice); + // If an error occurred then return it if (isError($sendNotice)) return $sendNotice; } @@ -723,6 +834,8 @@ class MessageLib */ 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 diff --git a/application/models/CL/Messages_model.php b/application/models/CL/Messages_model.php index cf5ccd141..e2c5c34c2 100644 --- a/application/models/CL/Messages_model.php +++ b/application/models/CL/Messages_model.php @@ -21,7 +21,6 @@ class Messages_model extends CI_Model '; const NO_AUTH_UID = 'online'; // hard coded uid if no authentication is performed - const ALT_OE = 'infocenter'; // alternative organisation unit when no one is found for a presetudent // Recipients types const TYPE_PERSONS = 'persons'; @@ -91,7 +90,7 @@ class Messages_model extends CI_Model { $ouOptions .= sprintf( "\n".'', - is_numeric($ou->prestudent_id) ? $ou->oe_kurzbz : self::ALT_OE, + is_numeric($ou->prestudent_id) ? $ou->oe_kurzbz : MessageLib::ALT_OE, $ou->bezeichnung . (is_numeric($ou->prestudent_id) ? '' : ' *') ); } diff --git a/application/models/person/Benutzer_model.php b/application/models/person/Benutzer_model.php index dc5b95779..a21811bb4 100644 --- a/application/models/person/Benutzer_model.php +++ b/application/models/person/Benutzer_model.php @@ -18,4 +18,19 @@ class Benutzer_model extends DB_Model return $this->loadWhere(array('person_id' => $person_id, 'aktiv' => true)); } + /** + * + */ + public function getActiveUserByPersonIdAndOrganisationUnit($person_id, $oe_kurzbz) + { + $sql = 'SELECT b.uid + FROM public.tbl_benutzer b + JOIN public.tbl_prestudent ps USING (person_id) + JOIN public.tbl_studiengang sg USING (studiengang_kz) + WHERE ps.person_id = ? + AND sg.oe_kurzbz = ? + AND b.aktiv = TRUE'; + + return $this->execQuery($sql, array($person_id, $oe_kurzbz)); + } } diff --git a/application/models/person/Kontakt_model.php b/application/models/person/Kontakt_model.php index 88a44cbc8..3f27604e8 100644 --- a/application/models/person/Kontakt_model.php +++ b/application/models/person/Kontakt_model.php @@ -8,17 +8,17 @@ class Kontakt_model extends DB_Model public function __construct() { parent::__construct(); - $this->dbTable = "public.tbl_kontakt"; - $this->pk = "kontakt_id"; + $this->dbTable = 'public.tbl_kontakt'; + $this->pk = 'kontakt_id'; } - + public function getWholeKontakt($kontakt_id, $person_id = null, $kontakttyp = null) { $result = null; - - $this->addJoin("public.tbl_standort", "standort_id", "LEFT"); - $this->addJoin("public.tbl_firma", "firma_id", "LEFT"); - + + $this->addJoin('public.tbl_standort', 'standort_id', 'LEFT'); + $this->addJoin('public.tbl_firma', 'firma_id', 'LEFT'); + if (isset($kontakt_id)) { $result = $this->load($kontakt_id); @@ -26,22 +26,37 @@ class Kontakt_model extends DB_Model else { $parametersArray = array(); - + if (!is_null($person_id)) { - $parametersArray["person_id"] = $person_id; + $parametersArray['person_id'] = $person_id; } if (!is_null($kontakttyp)) { - $parametersArray["kontakttyp"] = $kontakttyp; + $parametersArray['kontakttyp'] = $kontakttyp; } - + if (count($parametersArray) > 0) { $result = $this->loadWhere($parametersArray); } } - + return $result; } -} \ No newline at end of file + + /** + * + */ + public function getContactByPersonId($person_id, $kontakttyp) + { + $sql = 'SELECT kontakt + FROM public.tbl_kontakt + WHERE zustellung = TRUE + AND person_id = ? + AND kontakttyp = ? + ORDER BY updateamum, insertamum'; + + return $this->execQuery($sql, array($person_id, $kontakttyp)); + } +} diff --git a/application/models/system/Recipient_model.php b/application/models/system/Recipient_model.php index 8e2e46513..65884dcb7 100644 --- a/application/models/system/Recipient_model.php +++ b/application/models/system/Recipient_model.php @@ -378,71 +378,6 @@ class Recipient_model extends DB_Model return $this->execQuery($sql, array($person_id, $functions, $person_id)); } - /** - * Get all the messages to sent to an organisation unit - */ - public function getMessagesToSentToOE($oe_kurzbz, $functions, $kontaktType) - { - // Messages sent to a person that belongs to the recipient organisation unit - $sql = 'SELECT mm.message_id, - mm.subject, - mm.body, - mrou.person_id as receiver_id, - mrou.sentinfo, - mrou.token, - mrou.oe_kurzbz, - ks.kontakt as sender, - kr.kontakt as receiver, - mu.mitarbeiter_uid as employeeContact, - mb.mitarbeiter_uid as senderemployeeContact - FROM public.tbl_benutzer b - JOIN ( - SELECT uid, oe_kurzbz - FROM public.tbl_benutzerfunktion - WHERE (datum_von IS NULL OR datum_von <= NOW()) - AND (datum_bis IS NULL OR datum_bis >= NOW()) - AND funktion_kurzbz IN ? - ) bf ON (bf.uid = b.uid) - JOIN public.tbl_msg_recipient mrou ON (mrou.oe_kurzbz = bf.oe_kurzbz) - JOIN public.tbl_msg_message mm ON (mm.message_id = mrou.message_id) - JOIN public.tbl_msg_status ms ON (ms.message_id = mrou.message_id AND ms.person_id = mrou.person_id) - JOIN public.tbl_person pr ON (pr.person_id = mm.person_id) - LEFT JOIN ( - SELECT person_id, kontakt FROM public.tbl_kontakt WHERE zustellung = true AND kontakttyp = ? - ) ks ON (ks.person_id = mm.person_id) - LEFT JOIN ( - SELECT person_id, kontakt FROM public.tbl_kontakt WHERE zustellung = true AND kontakttyp = ? - ) kr ON (kr.person_id = mrou.person_id) - LEFT JOIN ( - SELECT b.person_id, - m.mitarbeiter_uid - FROM public.tbl_benutzer b INNER JOIN public.tbl_mitarbeiter m ON(b.uid = m.mitarbeiter_uid) - WHERE b.aktiv = TRUE - ) mu ON (mu.person_id = mrou.person_id) - LEFT JOIN ( - SELECT b.person_id, - m.mitarbeiter_uid - FROM public.tbl_benutzer b INNER JOIN public.tbl_mitarbeiter m ON(b.uid = m.mitarbeiter_uid) - WHERE b.aktiv = TRUE - ) mb ON (mb.person_id = mm.person_id) - WHERE bf.oe_kurzbz = ? - AND mrou.sent IS NULL - AND mrou.sentinfo IS NULL - GROUP BY mm.message_id, - mm.subject, - mm.body, - mrou.person_id, - mrou.sentinfo, - mrou.token, - mrou.oe_kurzbz, - ks.kontakt, - kr.kontakt, - mu.mitarbeiter_uid, - mb.mitarbeiter_uid'; - - return $this->execQuery($sql, array($functions, $kontaktType, $kontaktType, $oe_kurzbz)); - } - /** * Gets all the sent message by the given person */ @@ -483,4 +418,27 @@ class Recipient_model extends DB_Model return $this->execQuery($sql, array($person_id)); } + + /** + * + */ + public function getMessageById($message_id) + { + $sql = 'SELECT mm.message_id, + mm.person_id AS sender_id, + mm.subject, + mm.body, + mm.relationmessage_id, + mm.oe_kurzbz AS sender_ou, + mr.person_id AS receiver_id, + mr.token, + mr.sent, + mr.sentinfo, + mr.oe_kurzbz AS receiver_ou + FROM public.tbl_msg_message mm + JOIN public.tbl_msg_recipient mr ON (mr.message_id = mm.message_id) + WHERE mm.message_id = ?'; + + return $this->execQuery($sql, array($message_id)); + } }