diff --git a/VERSIONS_HOTLINE/129450 b/VERSIONS_HOTLINE/129450 new file mode 100644 index 0000000000000000000000000000000000000000..7286583f304f7605ef2b8505b025add00a97d437 --- /dev/null +++ b/VERSIONS_HOTLINE/129450 @@ -0,0 +1 @@ + - ticket #129450 : PNB Dilicom : Correction du calcul de nombre de jours restant quand la contrainte de durée de validité de l'offre est infinie (Un nombre ne contenant que des neufs, à partir de quatre 9999) \ No newline at end of file diff --git a/library/Class/Album/Item.php b/library/Class/Album/Item.php index f831d0a3a9aa897a9fadb9dc33d580d370c74829..8a269343fb55cd79d511226911996733bed17aa3 100644 --- a/library/Class/Album/Item.php +++ b/library/Class/Album/Item.php @@ -98,6 +98,10 @@ class Class_Album_Item extends Storm_Model_Abstract { return $this->getUsageConstraints()->getLoanOrderDate(); } + public function isDilicomInfinite($value) { + return (new Class_Album_UsageConstraint())->isDilicomInfinite($value); + } + public function getLocalLoanCount() { return Class_Loan_Pnb::countByOrderLineId($this->getOrderLineId()); diff --git a/library/Class/Album/UsageConstraint.php b/library/Class/Album/UsageConstraint.php index ae1f1b21e0ac540f4d19cfc7756c9081227a7a3b..cf4d05b70757a9a750b9b0b98f55064eb12570a2 100644 --- a/library/Class/Album/UsageConstraint.php +++ b/library/Class/Album/UsageConstraint.php @@ -221,8 +221,15 @@ class Class_Album_UsageConstraint extends Storm_Model_Abstract { } + public function isDilicomInfinite($value){ + return preg_match('/^9{4,}$/', $value); + } + + public function isAValidOffer() { - return $this->getEndDate() > date(DATE_ISO8601, $this->getCurrentTime()); + return ($this->isDilicomInfinite($this->getDuration())) + ? true + : $this->getEndDate() > date(DATE_ISO8601, $this->getCurrentTime()); } diff --git a/library/Class/Album/UsageConstraints.php b/library/Class/Album/UsageConstraints.php index 65f6e8f8465ddc5a20b46dfebc07fe9866303792..ca2b9b35131770bd632d1a1e29f599b947ae8826 100644 --- a/library/Class/Album/UsageConstraints.php +++ b/library/Class/Album/UsageConstraints.php @@ -165,6 +165,9 @@ class Class_Album_UsageConstraints extends Storm_Model_Collection_Abstract { public function isAvailable() { - return $this->getAvailabilityRemainingDaysBeforeEndDate() >= $this->getLoanDuration(); + $availabity_constraint = $this->getAvailabilityConstraint(); + return $availabity_constraint->isDilicomInfinite($this->getAvailabilityDuration()) + ? true + : $this->getAvailabilityRemainingDaysBeforeEndDate() >= $this->getLoanDuration(); } } \ No newline at end of file diff --git a/library/Class/TableDescription/PNBItemsRenderer.php b/library/Class/TableDescription/PNBItemsRenderer.php index d66e6c085415d71e46ca2985379b6e9006186925..29a32a186742f480cf2b0e2140e44afc22163cd2 100644 --- a/library/Class/TableDescription/PNBItemsRenderer.php +++ b/library/Class/TableDescription/PNBItemsRenderer.php @@ -67,7 +67,7 @@ class Class_TableDescription_PNBItemsRenderer { public function quantityOrInfinite($value) { - return $this->isInfinite($value) + return $this->_item->isDilicomInfinite($value) ? '∞' : $value; } @@ -109,11 +109,6 @@ class Class_TableDescription_PNBItemsRenderer { public function isInfiniteLoan() { - return $this->isInfinite($this->_item->getLoanQuantity()); - } - - - public function isInfinite($value) { - return preg_match('/^9{4,}$/', $value); + return $this->_item->isDilicomInfinite($this->_item->getLoanQuantity()); } } diff --git a/tests/fixtures/diffusion_pnb_3056309900005_20201014T050431Z.xml b/tests/fixtures/diffusion_pnb_3056309900005_20201014T050431Z.xml index 6ae637258762975bfe717af3cd8f2c141848da96..4311bb5ebde3567b3877320fc9d85e7e65f10916 100644 --- a/tests/fixtures/diffusion_pnb_3056309900005_20201014T050431Z.xml +++ b/tests/fixtures/diffusion_pnb_3056309900005_20201014T050431Z.xml @@ -260,5 +260,237 @@ xsi:noNamespaceSchemaLocation="https://pnb-dilicom.centprod.com/notices_onix/sch </usage> <returnStatus>OK</returnStatus> </orderLine> + </offer> + <offer> + <notice><?xml version="1.0" encoding="UTF-8"?><ONIXMessage release="3.0" xmlns="http://www.editeur.org/onix/3.0/reference" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.editeur.org/onix/3.0/reference https://pnb-dilicom.centprod.com/notices_onix/schema_onix/ONIX_BookProduct_3.0_reference.xsd"> +<Header> +<Sender> +<SenderIdentifier><SenderIDType>06</SenderIDType><IDValue>3025599000108</IDValue></SenderIdentifier> +<SenderName>SERVEUR DILICOM - PNB NUMERIQUE</SenderName></Sender> +<Addressee><AddresseeIdentifier><AddresseeIDType>06</AddresseeIDType><IDValue>3056033030009</IDValue></AddresseeIdentifier></Addressee> +<SentDateTime>20210228T0811Z</SentDateTime> +</Header> +<Product> +<RecordReference>PRODUCT_ID:1064381</RecordReference> +<NotificationType>03</NotificationType> +<ProductIdentifier> +<ProductIDType>03</ProductIDType> +<IDValue>3663608514965</IDValue> +</ProductIdentifier> +<ProductIdentifier> +<ProductIDType>01</ProductIDType> +<IDTypeName>PRODUCT_ID</IDTypeName> +<IDValue>1064381</IDValue> +</ProductIdentifier> +<DescriptiveDetail> +<ProductComposition>00</ProductComposition> +<ProductForm>ED</ProductForm> +<ProductFormDetail>E101</ProductFormDetail> +<EpubTechnicalProtection>03</EpubTechnicalProtection> +<EpubUsageConstraint> +<EpubUsageType>04</EpubUsageType> +<EpubUsageStatus>02</EpubUsageStatus> +<EpubUsageLimit> +<Quantity>6</Quantity> +<EpubUsageUnit>06</EpubUsageUnit> +</EpubUsageLimit> +</EpubUsageConstraint> +<EpubUsageConstraint> +<EpubUsageType>05</EpubUsageType> +<EpubUsageStatus>01</EpubUsageStatus> +</EpubUsageConstraint> +<EpubUsageConstraint> +<EpubUsageType>03</EpubUsageType> +<EpubUsageStatus>03</EpubUsageStatus> +</EpubUsageConstraint> +<EpubUsageConstraint> +<EpubUsageType>02</EpubUsageType> +<EpubUsageStatus>03</EpubUsageStatus> +</EpubUsageConstraint> +<EpubUsageConstraint> +<EpubUsageType>06</EpubUsageType> +<EpubUsageStatus>02</EpubUsageStatus> +<EpubUsageLimit> +<Quantity>1</Quantity> +<EpubUsageUnit>07</EpubUsageUnit> +</EpubUsageLimit> +<EpubUsageLimit> +<Quantity>12</Quantity> +<EpubUsageUnit>14</EpubUsageUnit> +</EpubUsageLimit> +<EpubUsageLimit> +<Quantity>999999</Quantity> +<EpubUsageUnit>10</EpubUsageUnit> +</EpubUsageLimit> +</EpubUsageConstraint> +<EpubUsageConstraint> +<EpubUsageType>07</EpubUsageType> +<EpubUsageStatus>02</EpubUsageStatus> +<EpubUsageLimit> +<Quantity>999999</Quantity> +<EpubUsageUnit>14</EpubUsageUnit> +</EpubUsageLimit> +</EpubUsageConstraint> +<TitleDetail> +<TitleType>01</TitleType> +<TitleElement> +<TitleElementLevel>01</TitleElementLevel> +<TitleText>Sombres étoiles</TitleText> +</TitleElement> +</TitleDetail> +<Contributor> +<SequenceNumber>1</SequenceNumber> +<ContributorRole>A01</ContributorRole> +<NameIdentifier> +<NameIDType>01</NameIDType> +<IDTypeName>AUTEUR_ID</IDTypeName> +<IDValue>131897</IDValue> +</NameIdentifier> +<PersonName>Malorie Blackman</PersonName> +<NamesBeforeKey>Malorie</NamesBeforeKey> +<KeyNames>Blackman</KeyNames> +</Contributor> +<Language> +<LanguageRole>01</LanguageRole> +<LanguageCode>fre</LanguageCode> +</Language> +<Extent> +<ExtentType>08</ExtentType> +<ExtentValue>416</ExtentValue> +<ExtentUnit>03</ExtentUnit> +</Extent> +<Extent> +<ExtentType>22</ExtentType> +<ExtentValue>3308</ExtentValue> +<ExtentUnit>18</ExtentUnit> +</Extent> +<Subject> +<SubjectSchemeIdentifier>29</SubjectSchemeIdentifier> +<SubjectSchemeVersion>DILICOM10</SubjectSchemeVersion> +<SubjectCode>3756</SubjectCode> +<SubjectHeadingText>Policiers, thriller</SubjectHeadingText> +</Subject> +<Subject> +<SubjectSchemeIdentifier>24</SubjectSchemeIdentifier> +<SubjectSchemeName>Numilog</SubjectSchemeName> +<SubjectCode>128</SubjectCode> +</Subject> +<Subject> +<SubjectSchemeIdentifier>01</SubjectSchemeIdentifier> +<SubjectSchemeName>DEWEY</SubjectSchemeName> +<SubjectCode>800</SubjectCode> +</Subject> +</DescriptiveDetail> +<CollateralDetail> +<TextContent> +<TextType>02</TextType> +<ContentAudience>00</ContentAudience> +<Text>Nous sommes au xxiie siècle. Dans l'espace, les guerres de clans font rage, et le danger est partout. Pourtant, même perdue dans les étoiles, l'étincelle de l'amour peut naître...</Text> +</TextContent> +<TextContent> +<TextType>03</TextType> +<ContentAudience>00</ContentAudience> +<Text>Nous sommes au xxiie siècle. Dans l'espace, les guerres de clans font rage, et le danger est partout. Pourtant, même perdue dans les étoiles, l'étincelle de l'amour peut naître...</Text> +</TextContent> +<TextContent> +<TextType>14</TextType> +<ContentAudience>00</ContentAudience> +<Text>http://excerpts.numilog.com/books/9782745983930.epub</Text> +</TextContent> +<SupportingResource> +<ResourceContentType>15</ResourceContentType> +<ContentAudience>00</ContentAudience> +<ResourceMode>04</ResourceMode> +<ResourceVersion> +<ResourceForm>02</ResourceForm> +<ResourceVersionFeature> +<ResourceVersionFeatureType>04</ResourceVersionFeatureType> +<FeatureValue>9782745983930.epub</FeatureValue> +</ResourceVersionFeature> +<ResourceVersionFeature> +<ResourceVersionFeatureType>01</ResourceVersionFeatureType> +<FeatureValue>E101</FeatureValue> +</ResourceVersionFeature> +<ResourceLink>http://excerpts.numilog.com/books/9782745983930.epub</ResourceLink> +</ResourceVersion> +</SupportingResource> +<SupportingResource> +<ResourceContentType>01</ResourceContentType> +<ContentAudience>00</ContentAudience> +<ResourceMode>03</ResourceMode> +<ResourceVersion> +<ResourceForm>01</ResourceForm> +<ResourceLink>http://couverture.numilog.com/9782745993250.jpg</ResourceLink> +</ResourceVersion> +</SupportingResource> +</CollateralDetail> +<PublishingDetail> +<Publisher> +<PublishingRole>01</PublishingRole> +<PublisherName>Editions Milan</PublisherName> +</Publisher> +<PublishingStatus>04</PublishingStatus> +<PublishingDate> +<PublishingDateRole>01</PublishingDateRole> +<Date>2017-09-13</Date> +</PublishingDate> +<PublishingDate> +<PublishingDateRole>09</PublishingDateRole> +<Date>2017-07-05</Date> +</PublishingDate> +<SalesRestriction> +<SalesRestrictionType>06</SalesRestrictionType> +</SalesRestriction> +</PublishingDetail> +<RelatedMaterial> +<RelatedProduct> +<ProductRelationCode>13</ProductRelationCode> +<ProductIdentifier> +<ProductIDType>03</ProductIDType> +<IDValue>9782745983930</IDValue> +</ProductIdentifier> +</RelatedProduct> +<RelatedProduct> +<ProductRelationCode>31</ProductRelationCode> +<ProductIdentifier> +<ProductIDType>15</ProductIDType> +<IDValue>9782745993250</IDValue> +</ProductIdentifier> +</RelatedProduct> +</RelatedMaterial> +</Product> +</ONIXMessage></notice> + <orderLine> + <orderId>4341845q1</orderId> + <orderIdColl>2017PNB1</orderIdColl> + <orderLineId>59ccba6cd9a6e97e81adfc09</orderLineId> + <orderDate>2017-09-28T11:01:32.653+02:00</orderDate> + <ean13>3663608514965</ean13> + <quantity>1</quantity> + <usage> + <loanTerms> + <loanMaxDuration> + <value>12</value> + <unit>MONTH</unit> + </loanMaxDuration> + <nbLoans>999999</nbLoans> + <loanNbSimultaneousUsers>1</loanNbSimultaneousUsers> + <consultNbSimultaneousUsersInSitu>0</consultNbSimultaneousUsersInSitu> + <consultNbSimultaneousUsersExSitu>0</consultNbSimultaneousUsersExSitu> + </loanTerms> + <userRights> + <printing>PROHIBITED</printing> + <copyAndPaste>PROHIBITED</copyAndPaste> + <nbAllowedDevices>6</nbAllowedDevices> + </userRights> + <collRights> + <offerValidity> + <value>999999</value> + <unit>MONTH</unit> + </offerValidity> + </collRights> + </usage> + <returnStatus>OK</returnStatus> + </orderLine> </offer> </pnbOffers> diff --git a/tests/scenarios/PnbDilicom/PnbDilicomTest.php b/tests/scenarios/PnbDilicom/PnbDilicomTest.php index e9894f6c5b5601c9236bb3931b48b6a7475f632b..2f94f875c55e9bfd8cae8d73fe8c0d799922fe89 100644 --- a/tests/scenarios/PnbDilicom/PnbDilicomTest.php +++ b/tests/scenarios/PnbDilicom/PnbDilicomTest.php @@ -2089,8 +2089,8 @@ class PnbDilicomOffersParserDelayLoanTest extends ModelTestCase { /** @test */ - public function numberOfBooksShouldBeOne() { - $this->assertEquals(1, count($this->_books)); + public function numberOfBooksShouldBeTwo() { + $this->assertEquals(2, count($this->_books)); } @@ -2105,9 +2105,45 @@ class PnbDilicomOffersParserDelayLoanTest extends ModelTestCase { /** * @depends firstAlbumShouldBeLaPlaneteDesChats * @test */ - public function firstAlbumUsageConstraintsShouldBeAValidOffer(array $items) { - $this->assertTrue($items[0]->getUsageConstraints()->isAValidOffer()); + public function whenDateBeforeEndDatefirstAlbumUsageConstraintsShouldBeAValidOffer(array $items) { + Class_Album_UsageConstraint::setTimeSource(new TimeSourceForTest('2021-02-25 14:14:14')); + $this->assertTrue($items[0]->getUsageConstraints()->isAValidOffer()); } + + + /** + * @depends firstAlbumShouldBeLaPlaneteDesChats + * @test */ + public function whenDateValidityIsOverfirstAlbumUsageConstraintsShouldNotBeAValidOffer(array $items) { + Class_Album_UsageConstraint::setTimeSource(new TimeSourceForTest('2030-10-14 15:00:14')); + $this->assertFalse($items[0]->getUsageConstraints()->isAValidOffer()); + } + + + /** @test */ + public function secondAlbumShouldBeSombresEtoiles() { + $album = $this->_books[1]->import(); + $this->assertEquals('Sombres étoiles', $album->getTitre()); + $item = $album->getItems()[0]; + return $item; + } + + + /** + * @depends secondAlbumShouldBeSombresEtoiles + * @test */ + public function inyear9999secondAlbumItemShouldBeAValidOffer($item) { + Class_Album_UsageConstraint::setTimeSource(new TimeSourceForTest('9999-08-24 14:14:14')); + $this->assertTrue($item->getUsageConstraints()->isAValidOffer()); + } + + /** + * @depends secondAlbumShouldBeSombresEtoiles + * @test */ + public function secondAlbumIsAvailableShouldTrue($item) { + $this->assertTrue($item->getUsageConstraints()->isAvailable()); + } + } @@ -2151,8 +2187,8 @@ class PnbDilicomOffersValidityUpdateFromXmlTest extends ModelTestCase { /** @test */ - public function numberOfAlbumsShouldBeOne() { - $this->assertEquals(1, count($this->_albums)); + public function numberOfAlbumsShouldBeTwo() { + $this->assertEquals(2, count($this->_albums)); }