diff --git a/cosmogramme/sql/patch/patch_283.php b/cosmogramme/sql/patch/patch_283.php index 68e60df1c203e53dbe177b54da8074e5c09a685b..961cf2625edd2f76f1dc961f93d9d63caf135e60 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 18151876043317f6394f0e8ba09c1972cad2d0df..86dad0eae95f11045b01fb1053610af8735106e7 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 7c44d73010254396565f527b459a1276ccae98f2..d1a1b865fca21b7209a116262dcc491af991b113 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 a2d11c51821a5c14451f508a761de7a7817d87a2..5dadc2598e7aa2a31bcda8601216add2117966da 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 2a22690a71508db808d0b0dd036526127c425c9b..52d5b9513a10f3b6851b72c46b15279d2c133e22 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 78f93afe6214d489bcfe3b73342fba0f70a1468a..5ba14853bfb99dd305f6b6ae6d46d42a239d1762 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 dd93e5b2a79114db72d350d0d628729be2a311c6..b8a34004b39982580265989e57fa890340982df4 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 acc2b5253881df0b9d32fd5c450b78a3090d1b93..e842aa3b6047259680029845055f6bf788813fff 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'); + } + + }