From 457ee676552448351793b29ed99c8059ad004b25 Mon Sep 17 00:00:00 2001
From: llaffont <llaffont@afi-sa.fr>
Date: Sat, 12 Dec 2015 11:48:07 +0100
Subject: [PATCH] dev #34308 refactoring to have multible PNB commands in one
 album : merge common usage constraints between items

---
 cosmogramme/sql/patch/patch_283.php           |  7 +++
 library/Class/Album.php                       |  5 ++
 library/Class/Album/Item.php                  |  5 ++
 library/Class/Album/UsageConstraint.php       |  2 +-
 library/Class/Loan/Pnb.php                    |  5 --
 .../WebService/BibNumerique/Dilicom/Hub.php   | 51 ++++++++++---------
 .../BibNumeriqueControllerDilicomTest.php     | 41 +++++++++------
 tests/db/UpgradeDBTest.php                    | 12 +++++
 8 files changed, 82 insertions(+), 46 deletions(-)

diff --git a/cosmogramme/sql/patch/patch_283.php b/cosmogramme/sql/patch/patch_283.php
index 68e60df1c20..961cf2625ed 100644
--- a/cosmogramme/sql/patch/patch_283.php
+++ b/cosmogramme/sql/patch/patch_283.php
@@ -16,4 +16,11 @@ try {
   }
 
   $adapter->query('alter table album_usage_constraints drop column album_id');
+}
+
+
+try {
+  $adapter->query('select order_line_id from loan_pnb');
+}  catch (Exception $e) {
+  $adapter->query('alter table loan_pnb add column order_line_id varchar(50)');
 }
\ No newline at end of file
diff --git a/library/Class/Album.php b/library/Class/Album.php
index 18151876043..86dad0eae95 100644
--- a/library/Class/Album.php
+++ b/library/Class/Album.php
@@ -1602,5 +1602,10 @@ class Class_Album extends Storm_Model_Abstract {
   public static function getPublicDomain() {
     return (new self())->_('Domaine public');
   }
+
+
+  public function getFirstAvailableItem() {
+    return $this->getItems()[0];
+  }
 }
 ?>
\ No newline at end of file
diff --git a/library/Class/Album/Item.php b/library/Class/Album/Item.php
index 7c44d730102..d1a1b865fca 100644
--- a/library/Class/Album/Item.php
+++ b/library/Class/Album/Item.php
@@ -58,6 +58,11 @@ class Class_Album_Item extends Storm_Model_Abstract {
   }
 
 
+  public function getOrderLineId() {
+    return $this->getUsageConstraints()->getAvailabilityConstraint()->getOrderLineId();
+  }
+
+
   public function setOrderLineId($order_id) {
     $this
       ->getUsageConstraints()
diff --git a/library/Class/Album/UsageConstraint.php b/library/Class/Album/UsageConstraint.php
index a2d11c51821..5dadc2598e7 100644
--- a/library/Class/Album/UsageConstraint.php
+++ b/library/Class/Album/UsageConstraint.php
@@ -206,7 +206,7 @@ class Class_Album_UsageConstraint extends Storm_Model_Abstract {
 
 
   protected function findItemDoIfNone($closure, $return_value) {
-    if(!$item = Class_Album_Item::findFirstBy(['album_id' => $this->getAlbum()->getId()]))
+    if(!$item = $this->getItem())
       return $return_value;
 
     return $closure($item);
diff --git a/library/Class/Loan/Pnb.php b/library/Class/Loan/Pnb.php
index 2a22690a715..52d5b9513a1 100644
--- a/library/Class/Loan/Pnb.php
+++ b/library/Class/Loan/Pnb.php
@@ -126,10 +126,5 @@ class Class_Loan_Pnb extends Storm_Model_Abstract {
   public function getType() {
     return '';
   }
-
-
-  public function getOrderLineId() {
-    return $this->getAlbum()->getUsageConstraints()->getLoanOrderLineId();
-  }
 }
 ?>
\ No newline at end of file
diff --git a/library/Class/WebService/BibNumerique/Dilicom/Hub.php b/library/Class/WebService/BibNumerique/Dilicom/Hub.php
index 78f93afe621..5ba14853bfb 100644
--- a/library/Class/WebService/BibNumerique/Dilicom/Hub.php
+++ b/library/Class/WebService/BibNumerique/Dilicom/Hub.php
@@ -30,23 +30,20 @@ class Class_WebService_BibNumerique_Dilicom_Hub extends Class_WebService_Abstrac
   protected $_now;
 
 
-  public function getLoanStatus($album) {
-    $content = json_decode($this->dilicomCall('getLoanStatus',
-                                              ['orderLineId[0]' => $this->getOrderLineId($album)]));
-
-    return $content;
+  public function getLoanStatus($item) {
+    return json_decode($this->dilicomCall('getLoanStatus',
+                                          ['orderLineId[0]' => $item->getOrderLineId()]));
   }
 
 
-  public function updateStatus($album) {
-    $content = $this->getLoanStatus($album);
+  public function updateItemStatus($item) {
+    $content = $this->getLoanStatus($item);
 
     if (isset($content->loanResponseLine[0])) {
       $simultaneous_users_remaining = $content->loanResponseLine[0]->nus1;
-      $item = $album->getItems()[0];
 
-      $item->setLoanCount($album->getUsageConstraints()->getLoanMaxNumberOfUsers() - $simultaneous_users_remaining);
-      $item->setQuantity($album->getUsageConstraints()->getLoanQuantity() - $content->loanResponseLine[0]->nta);
+      $item->setLoanCount($item->getUsageConstraints()->getLoanMaxNumberOfUsers() - $simultaneous_users_remaining);
+      $item->setQuantity($item->getUsageConstraints()->getLoanQuantity() - $content->loanResponseLine[0]->nta);
       $item->save();
     }
 
@@ -54,6 +51,11 @@ class Class_WebService_BibNumerique_Dilicom_Hub extends Class_WebService_Abstrac
   }
 
 
+  public function updateStatus($album) {
+    array_map([$this, 'updateItemStatus'], $album->getItems());
+  }
+
+
   /** @return int number of updated loans */
   public function updateLoansReturnDate($loans) {
     if (!$loans)
@@ -128,13 +130,15 @@ class Class_WebService_BibNumerique_Dilicom_Hub extends Class_WebService_Abstrac
 
     $this->updateStatus($album);
 
-    if (!$album->getUsageConstraints()->hasSimultaneousLoanRemaining())
+    $item = $album->getFirstAvailableItem();
+
+    if (!$item->getUsageConstraints()->hasSimultaneousLoanRemaining())
       return (object) ['returnMessage' => [$this->_('Emprunt impossible. Le nombre d\'emprunts simultanés est atteint.')]];
 
-    if (!$album->getUsageConstraints()->hasAvailableQuantity())
+    if (!$item->getUsageConstraints()->hasAvailableQuantity())
       return (object) ['returnMessage' => [$this->_('Emprunt impossible. Le nombre d\'emprunts disponible est épuisé.')]];
 
-    if (!$album->getUsageConstraints()->isAValidOffer())
+    if (!$item->getUsageConstraints()->isAValidOffer())
       return (object) ['returnMessage' => [$this->_('Emprunt impossible. L\'emprunt du document n\'est plus disponible.')]];
 
     $quota = (int)Class_AdminVar::getValueOrDefault('DILICOM_PNB_MAX_LOAN_PER_USER');
@@ -145,17 +149,18 @@ class Class_WebService_BibNumerique_Dilicom_Hub extends Class_WebService_Abstrac
     $loan = Class_Loan_Pnb::newInstance(['subscriber_id' => $user->getIdabon(),
                                          'user_id' => $user->getId(),
                                          'loan_date' => $this->startDate(),
-                                         'expected_return_date' => $this->endLoanDate($album),
-                                         'record_origin_id' => $album->getIdOrigine()]);
+                                         'expected_return_date' => $this->endLoanDate($item),
+                                         'record_origin_id' => $album->getIdOrigine(),
+                                         'order_line_id' => $item->getOrderLineId()]);
     $loan->save();
 
     $response = $this->dilicomCall('loanBook',
-                                   ['orderLineId' => $this->getOrderLineId($album),
+                                   ['orderLineId' => $item->getOrderLineId(),
                                     'accessMedium' => 'DOWNLOAD',
                                     'glnColl' => Class_AdminVar::get('DILICOM_PNB_GLN_COLLECTIVITE'),
                                     'loanerColl' => $user->getBibGLN(),
                                     'localization' => 'EX_SITU',
-                                    'loanEndDate' => urlencode($this->endLoanDate($album)),
+                                    'loanEndDate' => urlencode($this->endLoanDate($item)),
                                     'ean13' => $album->getISBN(),
                                     'loanId' =>  $loan->getId(),
                                    ]);
@@ -175,8 +180,9 @@ class Class_WebService_BibNumerique_Dilicom_Hub extends Class_WebService_Abstrac
 
   public function consultBook($album, $ip_address, $user) {
     $this->_now = $this->getCurrentTime();
+    $item = $album->getFirstAvailableItem();
     return $this->dilicomCall('consultBook',
-                              ['orderLineId' => $this->getOrderLineId($album),
+                              ['orderLineId' => $item->getOrderLineId(),
                                'accessMedium' => 'STREAMING',
                                'localization' => 'IN_SITU',
                                'consultEndDate' => urlencode($this->endConsultDate()),
@@ -197,14 +203,9 @@ class Class_WebService_BibNumerique_Dilicom_Hub extends Class_WebService_Abstrac
   }
 
 
-  public function getOrderLineId($album) {
-    return $album->getUsageConstraints()->getLoanOrderLineId();
-  }
-
-
-  public function endLoanDate($album) {
+  public function endLoanDate($item) {
     return $this->iso8601($this->_now +
-                          $album->getUsageConstraints()->getLoanDuration() * 3600 * 24);
+                          $item->getUsageConstraints()->getLoanDuration() * 3600 * 24);
   }
 
 
diff --git a/tests/application/modules/opac/controllers/BibNumeriqueControllerDilicomTest.php b/tests/application/modules/opac/controllers/BibNumeriqueControllerDilicomTest.php
index dd93e5b2a79..b8a34004b39 100644
--- a/tests/application/modules/opac/controllers/BibNumeriqueControllerDilicomTest.php
+++ b/tests/application/modules/opac/controllers/BibNumeriqueControllerDilicomTest.php
@@ -60,21 +60,25 @@ abstract class BibNumeriqueContollerDilicomTestCase extends AbstractControllerTe
                                                              ['id' => 1,
                                                               'album_id' => 3,
                                                               'loan_count' => 2,
-                                                              'quantity' => 4])],
-                                  'usage_constraints' => [$this->fixture('Class_Album_UsageConstraint',
-                                                                         ['id' => 1,
-                                                                          'album_id' => 3,
-                                                                          'usage_type' => Class_Album_UsageConstraint::LOAN_CONSTRAINT,
-                                                                          Class_Album_UsageConstraint::MAX_NB_OF_USERS => 40,
-                                                                          Class_Album_Usageconstraint::QUANTITY => 50,
-                                                                          Class_Album_UsageConstraint::DURATION => '100']),
-                                                          $this->fixture('Class_Album_UsageConstraint',
-                                                                         ['id' => 2,
-                                                                          'album_id' => 3,
-                                                                          'usage_type' => Class_Album_UsageConstraint::AVAILABILITY_CONSTRAINT,
-                                                                          Class_Album_UsageConstraint::ORDER_LINE_ID => 'x321',
-                                                                          Class_Album_UsageConstraint::DURATION => '100',
-                                                                          Class_Album_UsageConstraint::ORDER_DATE => '2015-04-01 00:00:00'])]]);
+                                                              'quantity' => 4,
+                                                              'usage_constraints' => [$this->fixture('Class_Album_UsageConstraint',
+                                                                                                     ['id' => 1,
+                                                                                                      'album_id' => 3,
+                                                                                                      'usage_type' => Class_Album_UsageConstraint::LOAN_CONSTRAINT,
+                                                                                                      Class_Album_UsageConstraint::MAX_NB_OF_USERS => 40,
+                                                                                                      Class_Album_Usageconstraint::QUANTITY => 50,
+                                                                                                      Class_Album_UsageConstraint::DURATION => '100']),
+                                                                                      $this->fixture('Class_Album_UsageConstraint',
+                                                                                                     ['id' => 2,
+                                                                                                      'album_id' => 3,
+                                                                                                      'usage_type' => Class_Album_UsageConstraint::AVAILABILITY_CONSTRAINT,
+                                                                                                      Class_Album_UsageConstraint::ORDER_LINE_ID => 'x321',
+                                                                                                      Class_Album_UsageConstraint::DURATION => '100',
+                                                                                                      Class_Album_UsageConstraint::ORDER_DATE => '2015-04-01 00:00:00'])
+                                                              ]
+                                                             ]
+                                    )]
+                                 ]);
 
     RessourcesNumeriquesFixtures::activateDilicom();
 
@@ -358,6 +362,13 @@ class BibNumeriqueControllerDilicomLoanBookActionTest extends BibNumeriqueContol
   }
 
 
+  /** @test */
+  public function bokehLoanOrderLineIdShouldBe() {
+    $loan = Class_Loan_Pnb::findFirstBy(['record_origin_id' => 'Dilicom-88817216']);
+    $this->assertEquals('x321', $loan->getOrderLineId());
+  }
+
+
   /** @test */
   public function loanUrlShouldHaveBeenSaved() {
     $this->assertEquals('https://pnb-dilicom.centprod.com/v2//link/3025594195810/LOAN/WIKI001/9782021153057-NUMOIY0785CYO0IGCV83DE9DOAOC1Y1O.do', Class_Loan_Pnb::findFirstBy(['record_origin_id' => 'Dilicom-88817216'])->getLoanLink());
diff --git a/tests/db/UpgradeDBTest.php b/tests/db/UpgradeDBTest.php
index acc2b525388..e842aa3b604 100644
--- a/tests/db/UpgradeDBTest.php
+++ b/tests/db/UpgradeDBTest.php
@@ -313,6 +313,10 @@ class UpgradeDB_283_Test extends UpgradeDBTestCase {
       $this->query("ALTER TABLE album_usage_constraints add column album_id int");
     } catch(Exception $e) {}
 
+    try {
+      $this->query("ALTER TABLE loan_pnb drop column order_line_id");
+    } catch(Exception $e) {}
+
 
     $this->query('insert into album(titre) values("test")');
     static::$album_id = $this->query('select id from album order by id desc limit 1')->fetch()['id'];
@@ -348,4 +352,12 @@ class UpgradeDB_283_Test extends UpgradeDBTestCase {
                                      . 'where item_id=' . static::$item_id )->fetch(),
                         'item id: ' . static::$item_id);
   }
+
+
+  /** @test */
+  public function loanPnbShouldHaveColumnOrderLineId() {
+    $this->assertColumn('loan_pnb', 'order_line_id');
+  }
+
+
 }
-- 
GitLab