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>&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;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"&gt;
+&lt;Header&gt;
+&lt;Sender&gt;
+&lt;SenderIdentifier&gt;&lt;SenderIDType&gt;06&lt;/SenderIDType&gt;&lt;IDValue&gt;3025599000108&lt;/IDValue&gt;&lt;/SenderIdentifier&gt;
+&lt;SenderName&gt;SERVEUR DILICOM - PNB NUMERIQUE&lt;/SenderName&gt;&lt;/Sender&gt;
+&lt;Addressee&gt;&lt;AddresseeIdentifier&gt;&lt;AddresseeIDType&gt;06&lt;/AddresseeIDType&gt;&lt;IDValue&gt;3056033030009&lt;/IDValue&gt;&lt;/AddresseeIdentifier&gt;&lt;/Addressee&gt;
+&lt;SentDateTime&gt;20210228T0811Z&lt;/SentDateTime&gt;
+&lt;/Header&gt;
+&lt;Product&gt;
+&lt;RecordReference&gt;PRODUCT_ID:1064381&lt;/RecordReference&gt;
+&lt;NotificationType&gt;03&lt;/NotificationType&gt;
+&lt;ProductIdentifier&gt;
+&lt;ProductIDType&gt;03&lt;/ProductIDType&gt;
+&lt;IDValue&gt;3663608514965&lt;/IDValue&gt;
+&lt;/ProductIdentifier&gt;
+&lt;ProductIdentifier&gt;
+&lt;ProductIDType&gt;01&lt;/ProductIDType&gt;
+&lt;IDTypeName&gt;PRODUCT_ID&lt;/IDTypeName&gt;
+&lt;IDValue&gt;1064381&lt;/IDValue&gt;
+&lt;/ProductIdentifier&gt;
+&lt;DescriptiveDetail&gt;
+&lt;ProductComposition&gt;00&lt;/ProductComposition&gt;
+&lt;ProductForm&gt;ED&lt;/ProductForm&gt;
+&lt;ProductFormDetail&gt;E101&lt;/ProductFormDetail&gt;
+&lt;EpubTechnicalProtection&gt;03&lt;/EpubTechnicalProtection&gt;
+&lt;EpubUsageConstraint&gt;
+&lt;EpubUsageType&gt;04&lt;/EpubUsageType&gt;
+&lt;EpubUsageStatus&gt;02&lt;/EpubUsageStatus&gt;
+&lt;EpubUsageLimit&gt;
+&lt;Quantity&gt;6&lt;/Quantity&gt;
+&lt;EpubUsageUnit&gt;06&lt;/EpubUsageUnit&gt;
+&lt;/EpubUsageLimit&gt;
+&lt;/EpubUsageConstraint&gt;
+&lt;EpubUsageConstraint&gt;
+&lt;EpubUsageType&gt;05&lt;/EpubUsageType&gt;
+&lt;EpubUsageStatus&gt;01&lt;/EpubUsageStatus&gt;
+&lt;/EpubUsageConstraint&gt;
+&lt;EpubUsageConstraint&gt;
+&lt;EpubUsageType&gt;03&lt;/EpubUsageType&gt;
+&lt;EpubUsageStatus&gt;03&lt;/EpubUsageStatus&gt;
+&lt;/EpubUsageConstraint&gt;
+&lt;EpubUsageConstraint&gt;
+&lt;EpubUsageType&gt;02&lt;/EpubUsageType&gt;
+&lt;EpubUsageStatus&gt;03&lt;/EpubUsageStatus&gt;
+&lt;/EpubUsageConstraint&gt;
+&lt;EpubUsageConstraint&gt;
+&lt;EpubUsageType&gt;06&lt;/EpubUsageType&gt;
+&lt;EpubUsageStatus&gt;02&lt;/EpubUsageStatus&gt;
+&lt;EpubUsageLimit&gt;
+&lt;Quantity&gt;1&lt;/Quantity&gt;
+&lt;EpubUsageUnit&gt;07&lt;/EpubUsageUnit&gt;
+&lt;/EpubUsageLimit&gt;
+&lt;EpubUsageLimit&gt;
+&lt;Quantity&gt;12&lt;/Quantity&gt;
+&lt;EpubUsageUnit&gt;14&lt;/EpubUsageUnit&gt;
+&lt;/EpubUsageLimit&gt;
+&lt;EpubUsageLimit&gt;
+&lt;Quantity&gt;999999&lt;/Quantity&gt;
+&lt;EpubUsageUnit&gt;10&lt;/EpubUsageUnit&gt;
+&lt;/EpubUsageLimit&gt;
+&lt;/EpubUsageConstraint&gt;
+&lt;EpubUsageConstraint&gt;
+&lt;EpubUsageType&gt;07&lt;/EpubUsageType&gt;
+&lt;EpubUsageStatus&gt;02&lt;/EpubUsageStatus&gt;
+&lt;EpubUsageLimit&gt;
+&lt;Quantity&gt;999999&lt;/Quantity&gt;
+&lt;EpubUsageUnit&gt;14&lt;/EpubUsageUnit&gt;
+&lt;/EpubUsageLimit&gt;
+&lt;/EpubUsageConstraint&gt;
+&lt;TitleDetail&gt;
+&lt;TitleType&gt;01&lt;/TitleType&gt;
+&lt;TitleElement&gt;
+&lt;TitleElementLevel&gt;01&lt;/TitleElementLevel&gt;
+&lt;TitleText&gt;Sombres étoiles&lt;/TitleText&gt;
+&lt;/TitleElement&gt;
+&lt;/TitleDetail&gt;
+&lt;Contributor&gt;
+&lt;SequenceNumber&gt;1&lt;/SequenceNumber&gt;
+&lt;ContributorRole&gt;A01&lt;/ContributorRole&gt;
+&lt;NameIdentifier&gt;
+&lt;NameIDType&gt;01&lt;/NameIDType&gt;
+&lt;IDTypeName&gt;AUTEUR_ID&lt;/IDTypeName&gt;
+&lt;IDValue&gt;131897&lt;/IDValue&gt;
+&lt;/NameIdentifier&gt;
+&lt;PersonName&gt;Malorie Blackman&lt;/PersonName&gt;
+&lt;NamesBeforeKey&gt;Malorie&lt;/NamesBeforeKey&gt;
+&lt;KeyNames&gt;Blackman&lt;/KeyNames&gt;
+&lt;/Contributor&gt;
+&lt;Language&gt;
+&lt;LanguageRole&gt;01&lt;/LanguageRole&gt;
+&lt;LanguageCode&gt;fre&lt;/LanguageCode&gt;
+&lt;/Language&gt;
+&lt;Extent&gt;
+&lt;ExtentType&gt;08&lt;/ExtentType&gt;
+&lt;ExtentValue&gt;416&lt;/ExtentValue&gt;
+&lt;ExtentUnit&gt;03&lt;/ExtentUnit&gt;
+&lt;/Extent&gt;
+&lt;Extent&gt;
+&lt;ExtentType&gt;22&lt;/ExtentType&gt;
+&lt;ExtentValue&gt;3308&lt;/ExtentValue&gt;
+&lt;ExtentUnit&gt;18&lt;/ExtentUnit&gt;
+&lt;/Extent&gt;
+&lt;Subject&gt;
+&lt;SubjectSchemeIdentifier&gt;29&lt;/SubjectSchemeIdentifier&gt;
+&lt;SubjectSchemeVersion&gt;DILICOM10&lt;/SubjectSchemeVersion&gt;
+&lt;SubjectCode&gt;3756&lt;/SubjectCode&gt;
+&lt;SubjectHeadingText&gt;Policiers, thriller&lt;/SubjectHeadingText&gt;
+&lt;/Subject&gt;
+&lt;Subject&gt;
+&lt;SubjectSchemeIdentifier&gt;24&lt;/SubjectSchemeIdentifier&gt;
+&lt;SubjectSchemeName&gt;Numilog&lt;/SubjectSchemeName&gt;
+&lt;SubjectCode&gt;128&lt;/SubjectCode&gt;
+&lt;/Subject&gt;
+&lt;Subject&gt;
+&lt;SubjectSchemeIdentifier&gt;01&lt;/SubjectSchemeIdentifier&gt;
+&lt;SubjectSchemeName&gt;DEWEY&lt;/SubjectSchemeName&gt;
+&lt;SubjectCode&gt;800&lt;/SubjectCode&gt;
+&lt;/Subject&gt;
+&lt;/DescriptiveDetail&gt;
+&lt;CollateralDetail&gt;
+&lt;TextContent&gt;
+&lt;TextType&gt;02&lt;/TextType&gt;
+&lt;ContentAudience&gt;00&lt;/ContentAudience&gt;
+&lt;Text&gt;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...&lt;/Text&gt;
+&lt;/TextContent&gt;
+&lt;TextContent&gt;
+&lt;TextType&gt;03&lt;/TextType&gt;
+&lt;ContentAudience&gt;00&lt;/ContentAudience&gt;
+&lt;Text&gt;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...&lt;/Text&gt;
+&lt;/TextContent&gt;
+&lt;TextContent&gt;
+&lt;TextType&gt;14&lt;/TextType&gt;
+&lt;ContentAudience&gt;00&lt;/ContentAudience&gt;
+&lt;Text&gt;http://excerpts.numilog.com/books/9782745983930.epub&lt;/Text&gt;
+&lt;/TextContent&gt;
+&lt;SupportingResource&gt;
+&lt;ResourceContentType&gt;15&lt;/ResourceContentType&gt;
+&lt;ContentAudience&gt;00&lt;/ContentAudience&gt;
+&lt;ResourceMode&gt;04&lt;/ResourceMode&gt;
+&lt;ResourceVersion&gt;
+&lt;ResourceForm&gt;02&lt;/ResourceForm&gt;
+&lt;ResourceVersionFeature&gt;
+&lt;ResourceVersionFeatureType&gt;04&lt;/ResourceVersionFeatureType&gt;
+&lt;FeatureValue&gt;9782745983930.epub&lt;/FeatureValue&gt;
+&lt;/ResourceVersionFeature&gt;
+&lt;ResourceVersionFeature&gt;
+&lt;ResourceVersionFeatureType&gt;01&lt;/ResourceVersionFeatureType&gt;
+&lt;FeatureValue&gt;E101&lt;/FeatureValue&gt;
+&lt;/ResourceVersionFeature&gt;
+&lt;ResourceLink&gt;http://excerpts.numilog.com/books/9782745983930.epub&lt;/ResourceLink&gt;
+&lt;/ResourceVersion&gt;
+&lt;/SupportingResource&gt;
+&lt;SupportingResource&gt;
+&lt;ResourceContentType&gt;01&lt;/ResourceContentType&gt;
+&lt;ContentAudience&gt;00&lt;/ContentAudience&gt;
+&lt;ResourceMode&gt;03&lt;/ResourceMode&gt;
+&lt;ResourceVersion&gt;
+&lt;ResourceForm&gt;01&lt;/ResourceForm&gt;
+&lt;ResourceLink&gt;http://couverture.numilog.com/9782745993250.jpg&lt;/ResourceLink&gt;
+&lt;/ResourceVersion&gt;
+&lt;/SupportingResource&gt;
+&lt;/CollateralDetail&gt;
+&lt;PublishingDetail&gt;
+&lt;Publisher&gt;
+&lt;PublishingRole&gt;01&lt;/PublishingRole&gt;
+&lt;PublisherName&gt;Editions Milan&lt;/PublisherName&gt;
+&lt;/Publisher&gt;
+&lt;PublishingStatus&gt;04&lt;/PublishingStatus&gt;
+&lt;PublishingDate&gt;
+&lt;PublishingDateRole&gt;01&lt;/PublishingDateRole&gt;
+&lt;Date&gt;2017-09-13&lt;/Date&gt;
+&lt;/PublishingDate&gt;
+&lt;PublishingDate&gt;
+&lt;PublishingDateRole&gt;09&lt;/PublishingDateRole&gt;
+&lt;Date&gt;2017-07-05&lt;/Date&gt;
+&lt;/PublishingDate&gt;
+&lt;SalesRestriction&gt;
+&lt;SalesRestrictionType&gt;06&lt;/SalesRestrictionType&gt;
+&lt;/SalesRestriction&gt;
+&lt;/PublishingDetail&gt;
+&lt;RelatedMaterial&gt;
+&lt;RelatedProduct&gt;
+&lt;ProductRelationCode&gt;13&lt;/ProductRelationCode&gt;
+&lt;ProductIdentifier&gt;
+&lt;ProductIDType&gt;03&lt;/ProductIDType&gt;
+&lt;IDValue&gt;9782745983930&lt;/IDValue&gt;
+&lt;/ProductIdentifier&gt;
+&lt;/RelatedProduct&gt;
+&lt;RelatedProduct&gt;
+&lt;ProductRelationCode&gt;31&lt;/ProductRelationCode&gt;
+&lt;ProductIdentifier&gt;
+&lt;ProductIDType&gt;15&lt;/ProductIDType&gt;
+&lt;IDValue&gt;9782745993250&lt;/IDValue&gt;
+&lt;/ProductIdentifier&gt;
+&lt;/RelatedProduct&gt;
+&lt;/RelatedMaterial&gt;
+&lt;/Product&gt;
+&lt;/ONIXMessage&gt;</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));
   }