From 4c8df433d570a9227c63b405665e130c9058a904 Mon Sep 17 00:00:00 2001
From: Laurent Laffont <llaffont@afi-sa.fr>
Date: Wed, 27 May 2020 12:14:37 +0200
Subject: [PATCH] =?UTF-8?q?dev=20#111125=20drive=20SIGB=20compatibility:?=
 =?UTF-8?q?=20Orph=C3=A9e,=20V-Smart,=20Pergame?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 VERSIONS_WIP/111125                           |  1 +
 library/Class/CodifAnnexe.php                 | 11 ++++++--
 library/Class/Reservation.php                 | 16 ++++++++++--
 .../SIGB/Orphee/GetLstRsvResponseReader.php   |  8 +++++-
 .../Class/WebService/SIGB/Pergame/Service.php |  4 ++-
 .../WebService/SIGB/VSmart/BorrowerReader.php | 19 +++++++++-----
 .../Class/WebService/SIGB/OrpheeFixtures.php  | 12 ++++++---
 .../WebService/SIGB/OrpheeServiceTest.php     | 21 +++++++++++++++-
 .../Class/WebService/SIGB/PergameTest.php     | 14 +++++++++++
 .../Class/WebService/SIGB/VSmartTest.php      | 25 ++++++++++++++++++-
 10 files changed, 113 insertions(+), 18 deletions(-)
 create mode 100644 VERSIONS_WIP/111125

diff --git a/VERSIONS_WIP/111125 b/VERSIONS_WIP/111125
new file mode 100644
index 00000000000..d3c367cfbca
--- /dev/null
+++ b/VERSIONS_WIP/111125
@@ -0,0 +1 @@
+ - ticket #111125 : compatibilité du module drive avec les SIGB: Orphée, V-Smart et Pergame
\ No newline at end of file
diff --git a/library/Class/CodifAnnexe.php b/library/Class/CodifAnnexe.php
index d31aae4660b..0acb850fcef 100644
--- a/library/Class/CodifAnnexe.php
+++ b/library/Class/CodifAnnexe.php
@@ -29,13 +29,20 @@ class CodifAnnexeLoader extends Storm_Model_Loader {
 
 
   public function findLibelleByCode($code) {
-    return (($annexe = Class_CodifAnnexe::findFirstBy(['code' => $code]))
-            || ($annexe = Class_CodifAnnexe::findFirstBy(['id_origine' => $code])))
+    return ($annexe = $this->findByCode($code))
       ? $annexe->getLibelle()
       : '';
   }
 
 
+  public function findByCode($code) {
+    if ($annexe = Class_CodifAnnexe::findFirstBy(['code' => $code]))
+      return $annexe;
+
+    return Class_CodifAnnexe::findFirstBy(['id_origine' => $code]);
+  }
+
+
   public function getMultiOptions() {
     $annexes = Class_CodifAnnexe::findAllBy(['invisible' => 0,
                                              'order' => 'libelle']);
diff --git a/library/Class/Reservation.php b/library/Class/Reservation.php
index be5ae832a45..40401e85dbf 100644
--- a/library/Class/Reservation.php
+++ b/library/Class/Reservation.php
@@ -59,14 +59,26 @@ class Class_Reservation extends Storm_Model_Abstract {
     if (isset($this->_notice))
       return $this->_notice;
 
-    if ($exemplaire = Class_Exemplaire::findFirstBy(['id_origine' => $this->getIdNoticeOrigine(),
-                                                     'order' => 'zone995 desc']))
+    if ($exemplaire = $this->getExemplaire())
       return $this->_notice = $exemplaire->getNotice();
 
     return null;
   }
 
 
+  public function getExemplaire() {
+    return Class_Exemplaire::findFirstBy(['id_origine' => $this->getIdNoticeOrigine(),
+                                          'order' => 'zone995 desc']);
+  }
+
+
+  public function getCodeBarres() {
+    return ($item = $this->getExemplaire())
+      ? $item->getCodeBarres()
+      : '';
+  }
+
+
   public function getDynamicRank() {
     If ($this->getRang() > 0)
       return $this->getRang();
diff --git a/library/Class/WebService/SIGB/Orphee/GetLstRsvResponseReader.php b/library/Class/WebService/SIGB/Orphee/GetLstRsvResponseReader.php
index 6c90e6c3c69..08bb473a21a 100644
--- a/library/Class/WebService/SIGB/Orphee/GetLstRsvResponseReader.php
+++ b/library/Class/WebService/SIGB/Orphee/GetLstRsvResponseReader.php
@@ -75,6 +75,7 @@ class Class_WebService_SIGB_Orphee_GetLstRsvResponseReader extends Class_WebServ
 
 
   public function endCb($data) {
+    $this->_current_reservation->setCodeBarre($data);
     $exemplaire_opac = Class_Exemplaire::getLoader()->findFirstBy(array('code_barres' => trim($data)));
     $this->_current_reservation->getExemplaire()->setExemplaireOPAC($exemplaire_opac);
   }
@@ -127,7 +128,12 @@ class Class_WebService_SIGB_Orphee_GetLstRsvResponseReader extends Class_WebServ
 
 
   public function endAnx_Nxt($data) {
-    $this->_current_reservation->setBibliotheque(Class_CodifAnnexe::findLibelleByCode($data));
+    if (!$annex = Class_CodifAnnexe::findByCode($data))
+      return;
+
+    $this->_current_reservation
+      ->setBibliotheque($annex->getLibelle())
+      ->setLocationId($annex->getIdBib());
   }
 }
 
diff --git a/library/Class/WebService/SIGB/Pergame/Service.php b/library/Class/WebService/SIGB/Pergame/Service.php
index 2ab21393823..8cd985eb4b2 100644
--- a/library/Class/WebService/SIGB/Pergame/Service.php
+++ b/library/Class/WebService/SIGB/Pergame/Service.php
@@ -109,7 +109,9 @@ class Class_WebService_SIGB_Pergame_Service extends Class_WebService_SIGB_Abstra
         ->setNoticeOPAC($reservation->getNotice())
         ->setBibliotheque($bib ? $bib->getLibelle() : '')
         ->setRang($reservation->getDynamicRank())
-        ->setEtat($reservation->getEtat());
+        ->setEtat($reservation->getEtat())
+        ->setCodeBarre($reservation->getCodeBarres())
+        ->setLocationId($reservation->getIdSite());
 
       if ($sigb_reservation->getEtat() === 'Disponible')
         $sigb_reservation->setWaitingToBePulled();
diff --git a/library/Class/WebService/SIGB/VSmart/BorrowerReader.php b/library/Class/WebService/SIGB/VSmart/BorrowerReader.php
index 21f92cd17b3..0534293b766 100644
--- a/library/Class/WebService/SIGB/VSmart/BorrowerReader.php
+++ b/library/Class/WebService/SIGB/VSmart/BorrowerReader.php
@@ -56,9 +56,11 @@ class Class_WebService_SIGB_VSmart_BorrowerReader {
    */
   public function getEmprunteurFromXML($xml) {
     $this->_emprunteur = Class_WebService_SIGB_Emprunteur::nullInstance();
-    $this->_xml_parser = Class_WebService_XMLParser::newInstance()
-                          ->setElementHandler($this)
-                          ->parse($xml);
+    $this->_xml_parser = Class_WebService_XMLParser::newInstance();
+
+    $this->_xml_parser
+      ->setElementHandler($this)
+      ->parse($xml);
 
     return $this->_emprunteur;
   }
@@ -198,10 +200,15 @@ class Class_WebService_SIGB_VSmart_BorrowerReader {
 
 
   public function _setExemplaireBib($data) {
-    if (!$libelle = Class_CodifAnnexe::findLibelleByCode(array_last(explode('/', $data))))
-      $libelle = $data;
+    if (!$annexe = Class_CodifAnnexe::findByCode(array_last(explode('/', $data))))
+      return $this->_current_exemplaire_operation->setBibliotheque($data);
+
+    $this->_current_exemplaire_operation
+      ->setBibliotheque($annexe->getLibelle());
 
-    $this->_current_exemplaire_operation->getExemplaire()->setBibliotheque($libelle);
+    if ($this->_xml_parser->inParents('Reservation'))
+      $this->_current_exemplaire_operation
+        ->setLocationId($annexe->getIdBib());
   }
 }
 
diff --git a/tests/library/Class/WebService/SIGB/OrpheeFixtures.php b/tests/library/Class/WebService/SIGB/OrpheeFixtures.php
index a70b3eca6ef..36967eedc27 100644
--- a/tests/library/Class/WebService/SIGB/OrpheeFixtures.php
+++ b/tests/library/Class/WebService/SIGB/OrpheeFixtures.php
@@ -662,7 +662,7 @@ renouvellement -->
       <rang>1</rang>    <!-- Rang du réservataire -->
     </document>
     <document>
-      <cb></cb>
+      <cb>678</cb>
       <no_ntc><![CDATA[975467778]]></no_ntc>
       <no_dmt><![CDATA[790]]></no_dmt>
       <date_fin><![CDATA[13/04/2019]]></date_fin>
@@ -672,9 +672,10 @@ renouvellement -->
       <editeur><![CDATA[Gallimard]]></editeur>
       <lib_sit><![CDATA[affectée]]></lib_sit>
       <sit><![CDATA[2]]></sit>
+      <anx_nxt>A3</anx_nxt>
     </document>
     <document>
-      <cb></cb>
+      <cb>679</cb>
       <no_ntc><![CDATA[975467779]]></no_ntc>
       <no_dmt><![CDATA[791]]></no_dmt>
       <sup><![CDATA[Livre]]></sup>
@@ -683,6 +684,7 @@ renouvellement -->
       <editeur><![CDATA[Gallimard]]></editeur>
       <lib_sit><![CDATA[affectée]]></lib_sit>
       <sit><![CDATA[2]]></sit>
+      <anx_nxt>A3</anx_nxt>
     </document>
   </documents>
 </datas> ';
@@ -752,7 +754,7 @@ renouvellement -->
     </document>
 
     <document>
-      <cb></cb>
+      <cb>678</cb>
       <no_ntc><![CDATA[975467778]]></no_ntc>
       <no_dmt><![CDATA[790]]></no_dmt>
       <sup><![CDATA[Livre]]></sup>
@@ -762,9 +764,10 @@ renouvellement -->
       <lib_sit><![CDATA[affectée]]></lib_sit>
       <date_fin><![CDATA[13/04/2019]]></date_fin>
       <sit><![CDATA[2]]></sit>
+      <anx_nxt>A3</anx_nxt>
     </document>
     <document>
-      <cb></cb>
+      <cb>679</cb>
       <no_ntc><![CDATA[975467779]]></no_ntc>
       <no_dmt><![CDATA[791]]></no_dmt>
       <sup><![CDATA[Livre]]></sup>
@@ -773,6 +776,7 @@ renouvellement -->
       <editeur><![CDATA[Gallimard]]></editeur>
       <lib_sit><![CDATA[affectée]]></lib_sit>
       <sit><![CDATA[2]]></sit>
+      <anx_nxt>A3</anx_nxt>
     </document>
   </documents>
 </datas> ';
diff --git a/tests/library/Class/WebService/SIGB/OrpheeServiceTest.php b/tests/library/Class/WebService/SIGB/OrpheeServiceTest.php
index b81fe8c145c..e9fa5a4818b 100644
--- a/tests/library/Class/WebService/SIGB/OrpheeServiceTest.php
+++ b/tests/library/Class/WebService/SIGB/OrpheeServiceTest.php
@@ -893,7 +893,8 @@ class OrpheeServiceGetInfoUserCarteHenryDupontTest extends OrpheeServiceTestCase
 
     $this->fixture('Class_CodifAnnexe', ['id' => 3,
                                          'id_origine' => 'A3',
-                                         'libelle' => 'Annecy Bonlieu']);
+                                         'libelle' => 'Annecy Bonlieu',
+                                         'id_bib' => 3]);
 
     $this->fixture('Class_CodifAnnexe', ['id' => 4,
                                          'id_origine' => 'R',
@@ -924,6 +925,12 @@ class OrpheeServiceGetInfoUserCarteHenryDupontTest extends OrpheeServiceTestCase
                                    'titre_principal' => 'Le Chemin',
                                    'auteur_principal' => 'Kyo'])]);
 
+    $ex_singe_bleu = $this->fixture(
+      'Class_Exemplaire',
+      ['id' => 33,
+       'code_barres' => '678',
+       'id_bib' => 3]);
+
 
     $this->_search_client
       ->whenCalled('GetInfoUserCarte')
@@ -967,6 +974,18 @@ class OrpheeServiceGetInfoUserCarteHenryDupontTest extends OrpheeServiceTestCase
   }
 
 
+  /** @test */
+  public function firstWaitingToBePulledHoldShouldHaveLocationId3ForBonlieu() {
+    $this->assertEquals(3, $this->emprunteur->getHoldsWaitingToBePulled()[0]->getLocationId());
+  }
+
+
+  /** @test */
+  public function firstWaitingToBePulledHoldItemBarcodeShouldBe678() {
+    $this->assertEquals(678, $this->emprunteur->getHoldsWaitingToBePulled()[0]->getCodeBarre());
+  }
+
+
   /** @test */
   public function getIdShouldAnswer100753() {
     $this->assertEquals('100753', $this->emprunteur->getId());
diff --git a/tests/library/Class/WebService/SIGB/PergameTest.php b/tests/library/Class/WebService/SIGB/PergameTest.php
index 28733de981d..bea15690a1f 100644
--- a/tests/library/Class/WebService/SIGB/PergameTest.php
+++ b/tests/library/Class/WebService/SIGB/PergameTest.php
@@ -231,6 +231,13 @@ class PergameServiceGetEmprunteurTest extends PergameTestCase {
   }
 
 
+  /** @test */
+  public function firstReservationCodeBarreShouldBeC25() {
+    $this->assertEquals('C-25', $this->_first_reservation->getCodeBarre());
+  }
+
+
+
   /** @test */
   public function firstReservationRangShouldBeTwo() {
     $this->assertEquals(2, $this->_first_reservation->getRang());
@@ -248,6 +255,13 @@ class PergameServiceGetEmprunteurTest extends PergameTestCase {
     $this->assertFalse($this->_first_reservation->isWaitingToBePulled());
   }
 
+
+  /** @test */
+  public function firstReservationLocationIdShouldBeTwo() {
+    $this->assertEquals(2, $this->_first_reservation->getLocationId());
+  }
+
+
   /** @test */
   public function secondReservationEtatShouldBeDisponible() {
     $this->assertEquals('Disponible',
diff --git a/tests/library/Class/WebService/SIGB/VSmartTest.php b/tests/library/Class/WebService/SIGB/VSmartTest.php
index 4000fc706df..ff85655aca6 100644
--- a/tests/library/Class/WebService/SIGB/VSmartTest.php
+++ b/tests/library/Class/WebService/SIGB/VSmartTest.php
@@ -30,7 +30,12 @@ abstract class  VSmartServiceTestCase extends ModelTestCase {
     $this->fixture('Class_CodifAnnexe',
                    ['id' => 2,
                     'id_origine' => 'AVER',
-                    'libelle' => 'Avermes']);
+                    'libelle' => 'Avermes',
+                    'id_bib' => 3]);
+
+    $this->fixture('Class_Bib',
+                   ['id' => 3,
+                    'libelle' => 'Bib avermes']);
   }
 }
 
@@ -408,6 +413,24 @@ class VSmartServiceWithEmprunteurFranckTest extends  VSmartServiceTestCase {
   }
 
 
+  /**
+   * @depends reservationAtZero
+   * @test
+   */
+  public function firstReservationLocationIdShouldBeThree($reservation) {
+    $this->assertEquals(3, $reservation->getLocationId());
+  }
+
+
+  /**
+   * @depends reservationAtZero
+   * @test
+   */
+  public function firstReservationBarCodeShouldBe32272073521608($reservation) {
+    $this->assertEquals(32272073521608, $reservation->getCodeBarre());
+  }
+
+
   /**
    * @depends reservationAtZero
    * @test
-- 
GitLab