From 814698a6787e3b5313a0e8664f0ac0511d091735 Mon Sep 17 00:00:00 2001 From: llaffont <llaffont@git-test.afi-sa.fr> Date: Tue, 22 Jan 2013 17:35:13 +0000 Subject: [PATCH] =?UTF-8?q?Ajout=20r=C3=A9servation=20par=20mail=20SIGB=20?= =?UTF-8?q?Dynix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- library/Class/CodifAnnexe.php | 11 +- library/Class/Exemplaire.php | 53 +++++--- .../Class/WebService/SIGB/Dynix/Service.php | 45 ++++++- .../SIGB/Dynix/TitleInfoResponseReader.php | 3 +- library/ZendAfi/Mail.php | 4 + .../Class/WebService/SIGB/DynixTest.php | 118 ++++++++++++++++-- 6 files changed, 201 insertions(+), 33 deletions(-) diff --git a/library/Class/CodifAnnexe.php b/library/Class/CodifAnnexe.php index 932cc473073..a5b6b8727d6 100644 --- a/library/Class/CodifAnnexe.php +++ b/library/Class/CodifAnnexe.php @@ -26,15 +26,20 @@ class Class_CodifAnnexe extends Storm_Model_Abstract { protected $_table_name = 'codif_annexe'; protected $_table_primary = 'id_annexe'; - public static function getLoader() { - return self::getLoaderFor(__CLASS__); - } + protected $_belongs_to = [ + 'bib' => ['model' => 'Class_Bib', + 'referenced_in' => 'id_bib'], + 'int_bib' => ['through' => 'bib']]; public static function findAllByPickup() { return self::getLoader()->findAllBy(array('no_pickup' => '0', 'order' => 'libelle')); } + + public function getMailIntBib() { + return $this->getIntBib()->getMail(); + } } ?> diff --git a/library/Class/Exemplaire.php b/library/Class/Exemplaire.php index 6154773f65f..6b1398a62a8 100644 --- a/library/Class/Exemplaire.php +++ b/library/Class/Exemplaire.php @@ -23,25 +23,22 @@ class Class_Exemplaire extends Storm_Model_Abstract { protected $_table_name = 'exemplaires'; protected $_table_primary = 'id'; - protected $_belongs_to = array( - 'notice' => array('model' => 'Class_Notice', - 'referenced_in' => 'id_notice'), + protected $_belongs_to = [ + 'notice' => ['model' => 'Class_Notice', + 'referenced_in' => 'id_notice'], - 'bib' => array('model' => 'Class_Bib', - 'referenced_in' => 'id_bib'), + 'bib' => ['model' => 'Class_Bib', + 'referenced_in' => 'id_bib'], - 'album' => array('model' => 'Class_Album', - 'referenced_in' => 'id_origine')); + 'album' => ['model' => 'Class_Album', + 'referenced_in' => 'id_origine'], - protected $_default_attribute_values = array('id_origine' => null, - 'code_barres' => null); - - protected $_sigb_exemplaire; + 'int_bib' => ['through' => 'bib']]; + protected $_default_attribute_values = ['id_origine' => null, + 'code_barres' => null]; - public static function getLoader() { - return self::getLoaderFor(__CLASS__); - } + protected $_sigb_exemplaire; public function isPrete() { @@ -50,10 +47,10 @@ class Class_Exemplaire extends Storm_Model_Abstract { public function getPret() { - return Class_Pret::getLoader()->findFirstBy(array('id_site' => $this->getIdBib(), - 'id_notice_origine' => $this->getIdOrigine(), - 'code_barres' => $this->getCodeBarres(), - 'EN_COURS' => 1)); + return Class_Pret::getLoader()->findFirstBy(['id_site' => $this->getIdBib(), + 'id_notice_origine' => $this->getIdOrigine(), + 'code_barres' => $this->getCodeBarres(), + 'EN_COURS' => 1]); } @@ -81,6 +78,26 @@ class Class_Exemplaire extends Storm_Model_Abstract { public function getTitrePrincipal() { return $this->getNotice()->getTitrePrincipal(); } + + + public function getAuteurPrincipal() { + return $this->getNotice()->getAuteurPrincipal(); + } + + + public function getEditeur() { + return $this->getNotice()->getEditeur(); + } + + + public function getCollection() { + return $this->getNotice()->getCollection(); + } + + + public function getMailIntBib() { + return $this->getIntBib()->getMail(); + } } ?> \ No newline at end of file diff --git a/library/Class/WebService/SIGB/Dynix/Service.php b/library/Class/WebService/SIGB/Dynix/Service.php index 743efa47ce3..a7e48902d2d 100644 --- a/library/Class/WebService/SIGB/Dynix/Service.php +++ b/library/Class/WebService/SIGB/Dynix/Service.php @@ -92,11 +92,48 @@ class Class_Webservice_SIGB_Dynix_Service extends Class_WebService_SIGB_Abstract public function reserverExemplaire($user, $exemplaire, $code_annexe){ + if (!$sigb_exemplaire = $this->getExemplaire($exemplaire->getIdOrigine(), + $exemplaire->getCodeBarres())) { + return ['statut' => false, 'Erreur de communication: exemplaire non trouvé']; + } + + if ($sigb_exemplaire->getDisponibilite() !== Class_WebService_SIGB_Exemplaire::DISPO_LIBRE) + return $this->_userHttpAction($user, + 'createMyHold', + ['titleKey' => $exemplaire->getIdOrigine(), + 'pickupLibraryID' => $code_annexe]); + + return $this->_reserverParMail($user, $exemplaire, $code_annexe); + } - return $this->_userHttpAction($user, - 'createMyHold', - ['titleKey' => $exemplaire->getIdOrigine(), - 'pickupLibraryID' => $code_annexe]); + + protected function _reserverParMail($user, $exemplaire, $code_annexe) { + $mail = new ZendAfi_Mail(); + try { + $annexe = Class_CodifAnnexe::findFirstBy(['code' => $code_annexe]); + $mail->setFrom($exemplaire->getMailIntBib()) + ->addTo($annexe->getMailIntBib()) + ->setSubject('Demande de Reservation') + ->setBodyHTML($this->_buildMailBody($user, $exemplaire, $annexe)) + ->send(); + } catch (Exception $e) { + return ['statut' => false, 'erreur' => $e->getMessage()]; + } + return ['statut' => true, 'erreur' => '']; + } + + + protected function _buildMailBody($user, $exemplaire, $annexe) { + $content = "Bonjour,\n\n"; + $content .= sprintf("%s, %s (N° : %s) désire réserver le document suivant : \n", + $user->getNom(), $user->getPrenom(), $user->getIdabon()); + $content .= "Titre : ".$exemplaire->getTitrePrincipal()."\n"; + $content .= "Auteur : ".$exemplaire->getAuteurPrincipal()."\n"; + $content .= "Editeur : ".$exemplaire->getEditeur()."\n"; + $content .= "Collection : ".$exemplaire->getCollection()."\n\n"; + $content .= "Lieu de retrait : ".$annexe->getLibelle()."\n"; + $content .= "Adresse e-mail : ".$user->getMail(); + return $content; } diff --git a/library/Class/WebService/SIGB/Dynix/TitleInfoResponseReader.php b/library/Class/WebService/SIGB/Dynix/TitleInfoResponseReader.php index a6e28cdfbfe..9dd80911c12 100644 --- a/library/Class/WebService/SIGB/Dynix/TitleInfoResponseReader.php +++ b/library/Class/WebService/SIGB/Dynix/TitleInfoResponseReader.php @@ -165,8 +165,9 @@ class Class_WebService_SIGB_Dynix_TitleInfoResponseReader extends Class_WebServi $this->_current_location_id == $data) $this->_current_exemplaire->setDisponibiliteLibre(); - if (in_array($data, $this->_emplacements_non_reservable)) + if (in_array($data, $this->_emplacements_non_reservable)) { $this->_current_exemplaire->setReservable(false); + } } diff --git a/library/ZendAfi/Mail.php b/library/ZendAfi/Mail.php index 751994dd21f..e3ae925f9ea 100644 --- a/library/ZendAfi/Mail.php +++ b/library/ZendAfi/Mail.php @@ -20,6 +20,10 @@ */ class ZendAfi_Mail extends Zend_Mail { + public function __construct($charset = 'utf8') { + parent::__construct($charset); + } + public function addTo($email, $name='') { $validator = new Zend_Validate_EmailAddress(); $mails = array_filter(preg_split('/\s*[,;]\s*/', $email), diff --git a/tests/library/Class/WebService/SIGB/DynixTest.php b/tests/library/Class/WebService/SIGB/DynixTest.php index aa5aadb92cb..e205bb3cf73 100644 --- a/tests/library/Class/WebService/SIGB/DynixTest.php +++ b/tests/library/Class/WebService/SIGB/DynixTest.php @@ -379,7 +379,7 @@ class DynixGetEmprunteurManuLarcinetTest extends DynixTestCase { -class DynixOperationsTestTest extends DynixTestCase { +abstract class DynixOperationsTestCase extends DynixTestCase { protected $_manu; public function setUp() { @@ -396,37 +396,53 @@ class DynixOperationsTestTest extends DynixTestCase { ->beStrict(); $this->_manu = Class_Users::newInstanceWithId(3, ['login' => '0917036', - 'password' => 'secret']); + 'password' => 'secret', + 'nom' => 'Skywalker', + 'prenom' => 'Luc', + 'mail' => 'lsky@gmail.com']); + } +} + +class DynixOperationsTest extends DynixOperationsTestCase { /** @test */ public function successfulReservationShouldReturnStatutTrue() { + $this->_mock_web_client + ->whenCalled('open_url') + ->with('http://www.infocom94.fr:8080/capcvm/rest/standard/lookupTitleInfo?clientID=SymWS&titleID=233823&includeItemInfo=true&includeAvailabilityInfo=true') + ->answers(DynixFixtures::xmlLookupTitleInfoLeCombatOrdinaire()); + $this->_mock_web_client ->whenCalled('open_url') - ->with('http://www.infocom94.fr:8080/capcvm/rest/patron/createMyHold?clientID=SymWS&sessionToken=497e6380-69fb-4850-b552-40dede41f0b5&titleKey=231595&pickupLibraryID=ALFMEDA') + ->with('http://www.infocom94.fr:8080/capcvm/rest/patron/createMyHold?clientID=SymWS&sessionToken=497e6380-69fb-4850-b552-40dede41f0b5&titleKey=233823&pickupLibraryID=ALFMEDA') ->answers('163144'); $this->assertEquals(['statut' => true, 'erreur' => ''], $this->_service->reserverExemplaire($this->_manu, - Class_Exemplaire::newInstance() - ->setIdOrigine('231595'), + Class_Exemplaire::newInstanceWithId(5, ['id_origine' => '233823']), 'ALFMEDA')); } /** @test */ public function reservationWithFaultShouldReturnStatutFalseWithErrorMessage() { + $this->_mock_web_client + ->whenCalled('open_url') + ->with('http://www.infocom94.fr:8080/capcvm/rest/standard/lookupTitleInfo?clientID=SymWS&titleID=233823&includeItemInfo=true&includeAvailabilityInfo=true') + ->answers(DynixFixtures::xmlLookupTitleInfoLeCombatOrdinaire()); + $this->_mock_web_client ->whenCalled('open_url') - ->with('http://www.infocom94.fr:8080/capcvm/rest/patron/createMyHold?clientID=SymWS&sessionToken=497e6380-69fb-4850-b552-40dede41f0b5&titleKey=231596&pickupLibraryID=CRETBUS') + ->with('http://www.infocom94.fr:8080/capcvm/rest/patron/createMyHold?clientID=SymWS&sessionToken=497e6380-69fb-4850-b552-40dede41f0b5&titleKey=233823&pickupLibraryID=CRETBUS') ->answers(DynixFixtures::createMyHoldFaultXML()); $this->assertEquals(['statut' => false, 'erreur' => 'Vous ne pouvez plus emprunter, adressez-vous au bibliothécaire'], $this->_service->reserverExemplaire($this->_manu, Class_Exemplaire::newInstance() - ->setIdOrigine('231596'), + ->setIdOrigine('233823'), 'CRETBUS')); } @@ -481,4 +497,92 @@ class DynixOperationsTestTest extends DynixTestCase { } } + + + +class DynixReservationByMailForAvailableDocTest extends DynixOperationsTestCase { + public function setUp() { + parent::setUp(); + $this->_mock_web_client + ->whenCalled('open_url') + ->with('http://www.infocom94.fr:8080/capcvm/rest/standard/lookupTitleInfo?clientID=SymWS&titleID=233823&includeItemInfo=true&includeAvailabilityInfo=true') + ->answers(DynixFixtures::xmlLookupTitleInfoLeCombatOrdinaire()); + + $this->_mock_web_client + ->whenCalled('open_url') + ->with('http://www.infocom94.fr:8080/capcvm/rest/patron/createMyHold?clientID=SymWS&sessionToken=497e6380-69fb-4850-b552-40dede41f0b5&titleKey=233823&pickupLibraryID=ALFMEDA') + ->never(); + + + $this->mock_transport = new MockMailTransport(); + Zend_Mail::setDefaultTransport($this->mock_transport); + + + $exemplaire = Class_Exemplaire::newInstanceWithId(5, ['code_barres' => '00580317', + 'id_origine' => '233823', + 'notice' => Class_Notice::newInstanceWithId(5) + ->setTitrePrincipal('Le combat ordinaire')]); + + $bib_creteil = Class_Bib::newInstanceWithId(2, + ['int_bib' => Class_IntBib::newInstanceWithId(2, + ['mail' => 'creteil@plaine.fr'])]); + + $exemplaire->setBib($bib_creteil); + + + + $bib_limeil = Class_Bib::newInstanceWithId(4, + ['int_bib' => Class_IntBib::newInstanceWithId(4, + ['mail' => 'limeil@plaine.fr'])]); + Storm_Test_ObjectWrapper::onLoaderOfModel('Class_CodifAnnexe') + ->whenCalled('findFirstBy') + ->with(['code' => 'ALFMEDA']) + ->answers(Class_CodifAnnexe::newInstanceWithId(4, ['bib' => $bib_limeil, + 'libelle' => 'Limeil'])); + + + $this->retour = $this->_service->reserverExemplaire($this->_manu, + $exemplaire, + 'ALFMEDA'); + $this->mail = $this->mock_transport->sent_mail; + } + + + /** @test */ + public function retourStatutShouldHaveNoError() { + $this->assertEquals(['statut' => true, 'erreur' => ''], + $this->retour); + } + + + + /** @test */ + public function mailSubjectShouldBeDemandeDeReservation() { + $this->assertEquals('Demande de Reservation', $this->mail->getSubject()); + } + + + /** @test */ + public function mailFromShouldBeCreteil() { + $this->assertEquals('creteil@plaine.fr', $this->mail->getFrom()); + } + + + /** @test */ + public function mailToShouldBeLimeil() { + $this->assertContains('limeil@plaine.fr', $this->mail->getRecipients()); + } + + + /** @test */ + public function mailContentShouldContainsUserInfoAndTitre() { + $content = quoted_printable_decode($this->mail->getBodyHtml()->getContent()); + $this->assertContains('Titre : Le combat ordinaire', $content); + $this->assertContains('Lieu de retrait : Limeil', $content); + $this->assertContains('Adresse e-mail : lsky@gmail.com', $content); + $this->assertContains('Skywalker, Luc', $content); + } +} + + ?> \ No newline at end of file -- GitLab