From 8b7b4c19bfe9d4bd4518ef8a311eb7713c92c469 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?ANDRE=20s=C3=A9bastien?= <sandre@afi-sa.fr>
Date: Mon, 31 May 2021 17:20:12 +0200
Subject: [PATCH] Photline#134505 : PNB dilicom : add mandatory field ReaderId
 for guest user

---
 VERSIONS_HOTLINE/134505                       |  1 +
 .../WebService/BibNumerique/Dilicom/Hub.php   | 23 ++++++++--
 tests/fixtures/DilicomFixtures.php            |  2 +-
 .../PnbDilicom/PnbDilicomDisplayTest.php      | 44 ++++++++++++++-----
 4 files changed, 55 insertions(+), 15 deletions(-)
 create mode 100644 VERSIONS_HOTLINE/134505

diff --git a/VERSIONS_HOTLINE/134505 b/VERSIONS_HOTLINE/134505
new file mode 100644
index 00000000000..f5b389e081f
--- /dev/null
+++ b/VERSIONS_HOTLINE/134505
@@ -0,0 +1 @@
+ - ticket #134505 : PNB Dilicom : rendre le prết possible pour les comptes invités
\ 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 46dca862962..2860f948510 100644
--- a/library/Class/WebService/BibNumerique/Dilicom/Hub.php
+++ b/library/Class/WebService/BibNumerique/Dilicom/Hub.php
@@ -170,9 +170,9 @@ class Class_WebService_BibNumerique_Dilicom_Hub extends Class_WebService_Abstrac
                                     array_filter(['glnLoaner' => $user->getBibGLN(),
                                                   'UserInfo.year' => $this->getPhpCommand()->rand(1900, 2000),
                                                   'UserInfo.gender' => (1 == ($value = $this->getPhpCommand()->rand(1, 2))) ? 'F': 'H',
-                                                  'DRMinfo.readerPass' => base64_encode($this->getPhpCommand()->hash('sha256', $user->getIdabon(), true)) ,
-                                                  'DRMinfo.readerHint' => $this->_('Merci de saisir votre numero de carte'),
-                                                  'DRMinfo.ReaderId' => $user->getIdabon(),
+                                                  'DRMinfo.readerPass' => base64_encode($this->getPhpCommand()->hash('sha256', $this->_getReaderId($user), true)),
+                                                  'DRMinfo.readerHint' => $this->_getReaderHint($user),
+                                                  'DRMinfo.ReaderId' => $this->_getReaderId($user),
                                                   'DRMinfo.extendUrl' => Class_Url::absolute(['module' => 'opac',
                                                                                               'controller' => 'bib-numerique',
                                                                                               'action' => 'extends-pnb-loan',
@@ -189,6 +189,7 @@ class Class_WebService_BibNumerique_Dilicom_Hub extends Class_WebService_Abstrac
                                                                                         'action' => 'return-pnb-loan',
                                                                                         'loan_id' => $loan->getId()],null,true)
                                                   ]));
+
     if (!$response) {
       $loan->delete();
       return $this->_error($this->_('Emprunt impossible. Le service "loanBook" n\'a rien renvoyé.'));
@@ -219,6 +220,20 @@ class Class_WebService_BibNumerique_Dilicom_Hub extends Class_WebService_Abstrac
   }
 
 
+  protected function _getReaderId($user) {
+    return $user->isAbonne()
+      ? $user->getIdabon()
+      : $user->getLogin();
+  }
+
+
+  protected function _getReaderHint($user) {
+    return $user->isAbonne()
+      ? $this->_('Merci de saisir votre numero de carte')
+      : $this->_('Merci de saisir votre identifiant de connexion renseigné lors de votre inscription');
+  }
+
+
   public function listUserAgents($filter = null) {
     $options = [];
     if ($filter == static::FILTER_LCP)
@@ -619,4 +634,4 @@ class Class_WebService_BibNumerique_Dilicom_Hub extends Class_WebService_Abstrac
 
     return $this->_now;
   }
-}
\ No newline at end of file
+}
diff --git a/tests/fixtures/DilicomFixtures.php b/tests/fixtures/DilicomFixtures.php
index ace18c53364..b460dfa6381 100644
--- a/tests/fixtures/DilicomFixtures.php
+++ b/tests/fixtures/DilicomFixtures.php
@@ -218,4 +218,4 @@ class DilicomFixtures {
                            'items' => [$item]])
                 ->addAuthor('Raphaël Draï');
   }
-}
\ No newline at end of file
+}
diff --git a/tests/scenarios/PnbDilicom/PnbDilicomDisplayTest.php b/tests/scenarios/PnbDilicom/PnbDilicomDisplayTest.php
index 8cb1743bd08..323ed497a5e 100644
--- a/tests/scenarios/PnbDilicom/PnbDilicomDisplayTest.php
+++ b/tests/scenarios/PnbDilicom/PnbDilicomDisplayTest.php
@@ -862,40 +862,64 @@ class PnbDilicomDisplayBibNumeriqueControllerLoanBookActionGuestWithOtherGuestsL
     parent::setUp();
     $this->setParams(10007);
     $this->_params['loanEndDate'] = '2014-08-10T14:14:14+0200';
-    $this->_params['DRMinfo.ReaderId'] = null;
+    $this->_params['DRMinfo.ReaderId'] = 'guest';
+    $this->_params['DRMinfo.readerPass'] = 'aGFzaDI1Nmd1ZXN0';
+    $this->_params['DRMinfo.readerHint'] = 'Merci de saisir votre identifiant de connexion renseigné lors de votre inscription';
 
-    foreach(range(1, 6) as $i)
+    foreach (range(1, 6) as $i)
       $this->fixture('Class_Loan_Pnb',
-                     ['id' => 10000+$i,
-                      'user_id' => 10000+$i,
+                     ['id' => 10000 + $i,
+                      'user_id' => 10000 + $i,
                       'subscriber_id' => '',
                       'record_origin_id' => '',
                       'expected_return_date' => '2022-06-01']);
 
     $this->_http
       ->whenCalled('open_url')
-      ->with(static::BASE_TEST_URL.'getEndedLoans?login=afi-bib&password=secretPassword&glnContractor=123456789&loanId%5B0%5D=10001&loanId%5B1%5D=10002&loanId%5B2%5D=10003&loanId%5B3%5D=10004&loanId%5B4%5D=10005&loanId%5B5%5D=10006',
-             ['auth' => [ 'user' => 'afi-bib',
+      ->with(static::BASE_TEST_URL . 'getEndedLoans?login=afi-bib&password=secretPassword&glnContractor=123456789&loanId%5B0%5D=10001&loanId%5B1%5D=10002&loanId%5B2%5D=10003&loanId%5B3%5D=10004&loanId%5B4%5D=10005&loanId%5B5%5D=10006',
+             ['auth' => ['user' => 'afi-bib',
                          'password' => 'secretPassword']])
       ->answers(DilicomFixtures::getEndedLoansResponse())
 
       ->whenCalled('open_url')
-      ->with(static::BASE_TEST_URL.'getLoanStatus?login=afi-bib&password=secretPassword&glnContractor=123456789&orderLineId%5B0%5D=x321&returnEndedLoan=0',
-             ['auth' => [ 'user' => 'afi-bib',
+      ->with(static::BASE_TEST_URL . 'getLoanStatus?login=afi-bib&password=secretPassword&glnContractor=123456789&orderLineId%5B0%5D=x321&returnEndedLoan=0',
+             ['auth' => ['user' => 'afi-bib',
                          'password' => 'secretPassword']])
       ->answers(DilicomFixtures::getLoanStatusResponse())
 
       ->whenCalled('open_url')
-      ->with(static::BASE_TEST_URL.'loanBook?login=afi-bib&password=secretPassword&glnContractor=123456789&glnLoaner=2345889&'.http_build_query( array_filter($this->_params)),
-             ['auth' => [ 'user' => 'afi-bib',
+      ->with(static::BASE_TEST_URL
+             . 'loanBook?login=afi-bib&password=secretPassword&glnContractor=123456789&glnLoaner=2345889&'
+             . http_build_query(array_filter($this->_params)),
+             ['auth' => ['user' => 'afi-bib',
                          'password' => 'secretPassword']])
       ->answers(DilicomFixtures::loanBookResponse())
       ;
 
+    $php_command = $this->mock()
+                        ->whenCalled('hash')
+                        ->answers('hash256guest')
+
+                        ->whenCalled('rand')
+                        ->with(1, 2)
+                        ->answers(2)
+
+                        ->whenCalled('rand')
+                        ->with(1900, 2000)
+                        ->answers(1930);
+
+    Class_WebService_BibNumerique_Dilicom_Hub::setPhpCommand($php_command);
+
     $this->dispatch('/bib-numerique/loan-book/id/3');
   }
 
 
+  public function tearDown() {
+    Class_WebService_BibNumerique_Dilicom_Hub::setPhpCommand(null);
+    parent::tearDown();
+  }
+
+
   /** @test */
   public function shouldBeAbleToLoan() {
     $this->assertNotNull(Class_Loan_Pnb::find(10007));
-- 
GitLab