diff --git a/VERSIONS_HOTLINE/#17242_send_mail_to_author_when_article_is_validated b/VERSIONS_HOTLINE/#17242_send_mail_to_author_when_article_is_validated new file mode 100644 index 0000000000000000000000000000000000000000..09c2bc8be43a41ebbf2e348b54d4f3f3545f2793 --- /dev/null +++ b/VERSIONS_HOTLINE/#17242_send_mail_to_author_when_article_is_validated @@ -0,0 +1,2 @@ +- ticket #17242: Workflow des articles. + - un email est envoyé au créateur de l'article quand celui-ci est validé. \ No newline at end of file diff --git a/application/modules/admin/controllers/CmsController.php b/application/modules/admin/controllers/CmsController.php index 87b479729933db8ad19dbb0e61b7eb6d24bda081..12a835d227b2b9837961f452c2164f51324c7ba5 100644 --- a/application/modules/admin/controllers/CmsController.php +++ b/application/modules/admin/controllers/CmsController.php @@ -269,6 +269,7 @@ class Admin_CmsController extends ZendAfi_Controller_Action { $post[$content_field] = Class_CmsUrlTransformer::forSaving($post['ckeditor_'.$content_field]); unset($post['ckeditor_'.$content_field]); } + return $article ->updateAttributes($post) ->save(); @@ -285,13 +286,22 @@ class Admin_CmsController extends ZendAfi_Controller_Action { protected function _notifyArticleChanged($article) { $this->_sendMailWhenUpdatedStatusToValidationPending($article); $this->_sendMailWhenUpdatedStatusToRefused($article); + $this->_sendMailWhenUpdatedStatusToValidated($article); } protected function _sendMailWhenUpdatedStatusToRefused($article) { if ($article->old_status != Class_Article::STATUS_REFUSED && $article->getStatus() == Class_Article::STATUS_REFUSED) { - $this->_sendMailToAuteur($article); + $this->_sendRefusedMailToAuteur($article); + } + } + + + protected function _sendMailWhenUpdatedStatusToValidated($article) { + if ($article->old_status != Class_Article::STATUS_VALIDATED && + $article->getStatus() == Class_Article::STATUS_VALIDATED) { + $this->_sendValidatedMailToAuteur($article); } } @@ -304,8 +314,8 @@ class Admin_CmsController extends ZendAfi_Controller_Action { } - protected function _sendMailToAuteur($article) { - $mail = new ZendAfi_Mail('utf8'); + protected function prepareMailForAuteur($article) { + $mail = new ZendAfi_Mail('utf8'); if(!$article->getAuteur()) { $this->_helper->notify('Mail non envoyé: article sans auteur'); return; @@ -315,22 +325,42 @@ class Admin_CmsController extends ZendAfi_Controller_Action { return; } - $body = $article->getRefusMessage(); - $body = str_replace('TITRE_ARTICLE', - $article->getTitre(), - $body); - $body = str_replace('URL_ARTICLE', - $this->view->absoluteUrl($article->getUrl(), null, true), - $body); + $mail->setFrom('no-reply@no-reply-afi.fr') + ->addTo($mail_address); + return $mail; + } + + + protected function prepareBodyMail($article, $message) { + $message = str_replace('TITRE_ARTICLE', $article->getTitre(), $message); + $message = str_replace('URL_ARTICLE', $this->view->absoluteUrl($article->getUrl(), null, true), $message); + return $message; + } + + + protected function _sendRefusedMailToAuteur($article) { + if(!$mail = $this->prepareMailForAuteur($article)) + return; + $body = $this->prepareBodyMail($article, $article->getRefusMessage()); + $this->sendPreparedMail($mail, '[Bokeh] Refus de l\'article '.$article->getTitre(), $body); + } + + + protected function sendPreparedMail($mail, $subject, $body) { + $mail->setSubject(quoted_printable_decode($subject)) + ->setBodyText($body,'utf-8',Zend_Mime::ENCODING_8BIT); - $mail - ->setFrom('no-reply@no-reply-afi.fr') - ->addTo($mail_address) - ->setSubject(quoted_printable_decode('[Bokeh] Refus de l\'article '.$article->getTitre())) - ->setBodyText($body,'utf-8',Zend_Mime::ENCODING_8BIT); if($this->_sendMail($mail)) - $this->_helper->notify('Mail envoyé à : '.$mail_address); + $this->_helper->notify('Mail envoyé à : '.$mail->getRecipients()[0]); + + } + + protected function _sendValidatedMailToAuteur($article) { + if(!$mail = $this->prepareMailForAuteur($article)) + return; + $body = $this->prepareBodyMail($article, $article->getValideMessage()); + $this->sendPreparedMail($mail, '[Bokeh] Validation de l\'article '.$article->getTitre(), $body); } diff --git a/library/Class/AdminVar.php b/library/Class/AdminVar.php index 875124191f1bdb3876b8939ec4494116cb926b90..a83af5a69c46e2325b8f78b7e0cfe6207c789584 100644 --- a/library/Class/AdminVar.php +++ b/library/Class/AdminVar.php @@ -307,6 +307,7 @@ 'WORKFLOW' => 'Activer ou désactiver la gestion des validations des articles<br />1 = Activé, Autre valeur = désactivé', 'WORKFLOW_TEXT_MAIL_ARTICLE_PENDING' => 'Contenu de l\'email de notification d\'article en attente de validation', 'WORKFLOW_TEXT_MAIL_ARTICLE_REFUSED' => 'Contenu de l\'email de notification de refus d\'un article à valider', + 'WORKFLOW_TEXT_MAIL_ARTICLE_VALIDATED' => 'Contenu de l\'email de notification de validation d\'un article', 'BIBNUM' => 'Activer ou désactiver la bibliothèque numérique<br />1 = Activé, Autre valeur = désactivé', 'FORMATIONS' => 'Activer ou désactiver le module formation<br />1 = Activé, Autre valeur = désactivé', 'VODECLIC_KEY' => 'Clé de sécurité Vodeclic', @@ -471,6 +472,16 @@ return static::get('WORKFLOW_TEXT_MAIL_ARTICLE_REFUSED'); } + + + public static function getWorkflowTextMailArticleValidated() { + if(!static::get('WORKFLOW_TEXT_MAIL_ARTICLE_VALIDATED')) + static::set('WORKFLOW_TEXT_MAIL_ARTICLE_VALIDATED', + 'L\'article TITRE_ARTICLE a été validé. URL_ARTICLE'); + + return static::get('WORKFLOW_TEXT_MAIL_ARTICLE_VALIDATED'); + } + } ?> diff --git a/library/Class/Article.php b/library/Class/Article.php index 181dd716caa6e108cfe7987d690926f9341b8bf6..b94da55dd75880ae60446e26993b60564c67d329 100644 --- a/library/Class/Article.php +++ b/library/Class/Article.php @@ -624,6 +624,13 @@ class Class_Article extends Storm_Model_Abstract { return Class_AdminVar::getWorkflowTextMailArticleRefused(); return parent::_get('refus_message'); } + + + public function getValideMessage() { + return Class_AdminVar::getWorkflowTextMailArticleValidated(); + } + + /** * @param string $langue * @return bool diff --git a/tests/application/modules/admin/controllers/CmsControllerTest.php b/tests/application/modules/admin/controllers/CmsControllerTest.php index d2e15f8e9a292db4c85687249fb25642d185fde6..bbc91430e8b70354c4b73d082a9bf9587a9fa582 100644 --- a/tests/application/modules/admin/controllers/CmsControllerTest.php +++ b/tests/application/modules/admin/controllers/CmsControllerTest.php @@ -1366,7 +1366,8 @@ abstract class CmsControllerWorkflowTestCase extends CmsControllerTestCase { Zend_Mail::setDefaultTransport($this->mock_transport); Class_Profil::getCurrentProfil()->setMailSite('laurent@afi-sa.fr'); - Class_AdminVar::getLoader()->newInstanceWithId('WORKFLOW')->setValeur('1'); + Class_AdminVar::newInstanceWithId('WORKFLOW')->setValeur('1'); + Class_AdminVar::newInstanceWithId('WORKFLOW_TEXT_MAIL_ARTICLE_VALIDATED')->setValeur(''); } } @@ -1391,8 +1392,6 @@ class CmsControllerNewsAddActionPostWithWorkflowTest extends CmsControllerWorkfl 'login' => 'l', 'password' => 'l', 'mail' => 'l@afi-sa.fr']);; - Class_AdminVar::getLoader()->newInstanceWithId('WORKFLOW')->setValeur('1'); - $this->fixture('Class_Article', ['id' => 18, 'id_user' => '', @@ -1400,19 +1399,44 @@ class CmsControllerNewsAddActionPostWithWorkflowTest extends CmsControllerWorkfl 'contenu' => 'September News', 'description' => '', 'status' =>'']); + } + + protected function postArticleValidated() { + $data = $this->_basePostDatas; + $data['status'] = Class_Article::STATUS_VALIDATED; + $this->postDispatch('/admin/cms/edit/id/18', $data); } /** @test */ public function statusShouldBeUpdated() { - $data = $this->_basePostDatas; - $data['status'] = Class_Article::STATUS_VALIDATED; - $this->postDispatch('/admin/cms/add/id_cat/23', $data); + $this->postArticleValidated(); $this->assertEquals(Class_Article::STATUS_VALIDATED, Class_Article::findFirstBy(['order' => 'id desc'])->getStatus()); } + /** @test */ + public function validatedNewsShouldSendMailToAuthor() { + $this->postArticleValidated(); + $this->assertEquals('l@afi-sa.fr',$this->mock_transport->getSentMails()[0]->getRecipients()[0]); + } + + + /** @test */ + public function sentMailToAuthorWhenNewsIsValidatedShouldContainsDefaultBody() { + $this->postArticleValidated(); + $this->assertEquals('L\'article Katsuhiro Otomo en dédicace ! a été validé. http://localhost'.BASE_URL.'/cms/articleview/id/18',quoted_printable_decode($this->mock_transport->getSentMails()[0]->getBodyText()->getContent())); + } + + + /** @test */ + public function sentMailToAuthorWhenNewsIsValidatedShouldContainsDefaultSubject() { + $this->postArticleValidated(); + $this->assertEquals('[Bokeh] Validation de l\'article Katsuhiro Otomo en dédicace !',quoted_printable_decode($this->mock_transport->getSentMails()[0]->getSubject())); + } + + /** @test */ public function statusAValiderUpdatedToSameStatusShouldNotSendMail() { Class_Article::find(18)->setStatus(Class_Article::STATUS_VALIDATION_PENDING)->save();