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