From 1c55fb8f4e7103719764fdcb9f9000a499f85ca1 Mon Sep 17 00:00:00 2001
From: Alex Arnaud <alex.arnaud@biblibre.com>
Date: Thu, 9 Jul 2015 14:08:47 +0200
Subject: [PATCH] dev #24821 - Users are notified of the documents that are
 waiting to be pulled

---
 library/Class/Users.php                       | 14 +++++++++-
 library/Class/WebService/SIGB/Reservation.php |  2 ++
 tests/library/Class/UsersTest.php             | 28 ++++++++++++++++++-
 3 files changed, 42 insertions(+), 2 deletions(-)

diff --git a/library/Class/Users.php b/library/Class/Users.php
index 74186575e3f..6ae2bb51906 100644
--- a/library/Class/Users.php
+++ b/library/Class/Users.php
@@ -1129,6 +1129,11 @@ class Class_Users extends Storm_Model_Abstract {
 	}
 
 
+	public function countWaitingToBePulled() {
+		return count($this->getEmprunteur()->getHoldsWaitingToBePulled());
+	}
+
+
 	public function getFicheSigb($user = null) {
 		if ($user === null)
 			$user = $this; // compatibilité
@@ -1547,7 +1552,14 @@ class Class_Users extends Storm_Model_Abstract {
 																 '',
 																 'Vous avez %d document en retard.',
 																 'Vous avez %d documents en retard.',
-																 $this->getNbEmpruntsRetard()));
+																 $this->getNbEmpruntsRetard()))
+			->_notifyOn($notifiable,
+									$this->countWaitingToBePulled(),
+									$this->_plural($this->countWaitingToBePulled(),
+																 '',
+																 'Vous avez %d document en attente de retrait.',
+																 'Vous avez %d documents en attente de retrait.',
+																 $this->countWaitingToBePulled()));
 	}
 
 
diff --git a/library/Class/WebService/SIGB/Reservation.php b/library/Class/WebService/SIGB/Reservation.php
index 70d981d4e5b..642faf7b6e7 100644
--- a/library/Class/WebService/SIGB/Reservation.php
+++ b/library/Class/WebService/SIGB/Reservation.php
@@ -53,6 +53,7 @@ class Class_WebService_SIGB_Reservation extends Class_WebService_SIGB_Exemplaire
 
 	public function setPickupLocationLabel($pickup_location_label) {
 		$this->pickup_location_label = $pickup_location_label;
+		return $this;
 	}
 
 
@@ -75,6 +76,7 @@ class Class_WebService_SIGB_Reservation extends Class_WebService_SIGB_Exemplaire
 
 	public function setWaitingToBePulled() {
 		$this->waiting_to_be_pulled = true;
+		return $this;
 	}
 
 
diff --git a/tests/library/Class/UsersTest.php b/tests/library/Class/UsersTest.php
index 13d7f722d01..ea28a37f0ce 100644
--- a/tests/library/Class/UsersTest.php
+++ b/tests/library/Class/UsersTest.php
@@ -645,6 +645,14 @@ class UsersFicheAbonneTest extends ModelTestCase {
 			->beAbonneSIGB()
 			->setDateFin('2020-02-02');
 
+		$this->laurent = Class_Users::getLoader()
+			->newInstanceWithId(77)
+			->setLogin('laurent')
+			->setIdSite(5)
+			->setIdabon(124)
+			->beAbonneSIGB()
+			->setDateFin('2016-12-31');
+
 		$this->pret_potter = Class_WebService_SIGB_Emprunt::newInstanceWithEmptyExemplaire()
 			->setTitre('Harry Potter')
 			->setDateRetour('23/05/2022');
@@ -658,18 +666,36 @@ class UsersFicheAbonneTest extends ModelTestCase {
 			->setDateRetour('23/05/2002');
 
 		$this->reservation_alien = Class_WebService_SIGB_Reservation::newInstanceWithEmptyExemplaire()->setTitre('Alien');
+		$this->reservation_guerre_et_paix = Class_WebService_SIGB_Reservation::newInstanceWithEmptyExemplaire()->setTitre('Guerre et paix')
+			->setPickupLocationLabel('my location')
+			->setWaitingToBePulled();
+		$this->reservation_autre_histoire = Class_WebService_SIGB_Reservation::newInstanceWithEmptyExemplaire()->setTitre('Une autre histoire')
+			->setPickupLocationLabel('other location')
+			->setWaitingToBePulled();
 
 		$this->webservice
 			->whenCalled('getEmprunteur')
 			->with($this->amadou)
 			->answers(Class_WebService_SIGB_Emprunteur::newInstance()
 								->empruntsAddAll(array($this->pret_potter, $this->pret_alice, $this->pret_alien))
-								->reservationsAddAll(array($this->reservation_alien)));
+								->reservationsAddAll(array($this->reservation_alien)))
+			->whenCalled('getEmprunteur')
+			->with($this->laurent)
+			->answers(Class_WebService_SIGB_Emprunteur::newInstance()
+								->reservationsAddAll(array($this->reservation_alien, $this->reservation_guerre_et_paix, $this->reservation_autre_histoire)));
 
 
 	}
 
 
+	/** @test */
+	public function laurentNotificationShouldContainsVousAvez2DocumentEnAttente() {
+		$this->laurent->registerNotificationsOn($this->_notifiable);
+		$this->assertEquals(['Vous avez 2 documents en attente de retrait.'],
+												$this->_notifications);
+	}
+
+
 	/** @test */
 	public function patrickNotificationsShouldContainsAbonnementExpireDans1Jour() {
 		$this->patrick->setDateFin(date('Y-m-d', mktime(0, 0, 0, date('m'), date('d') + 1, date('Y'))));
-- 
GitLab