diff --git a/VERSIONS_WIP/29968 b/VERSIONS_WIP/29968
new file mode 100644
index 0000000000000000000000000000000000000000..3225c771e85b5a850dfae8d9feaa7c5a868f6fc8
--- /dev/null
+++ b/VERSIONS_WIP/29968
@@ -0,0 +1,2 @@
+  - ticket #29968 : Ajout de la varibale DILICOM_PNB_MAX_LOAN_DURATION qui permet de limiter
+la durée des prêts Dilicom PNB.
\ No newline at end of file
diff --git a/library/Class/AdminVar.php b/library/Class/AdminVar.php
index 963c5629b7cb8137a9f9ae71e371690a36c16513..32a21ed209e254c2682024354ee637c3a59fc9f1 100644
--- a/library/Class/AdminVar.php
+++ b/library/Class/AdminVar.php
@@ -239,6 +239,7 @@ class Class_AdminVarLoader extends Storm_Model_Loader {
                    'DILICOM_PNB_FTP_SERVER' => Class_AdminVar_Meta::newDefault($this->_('Serveur FTP de diffusion des offres PNB Dilicom'))->bePrivate(),
                    'DILICOM_PNB_FTP_USER' => Class_AdminVar_Meta::newDefault($this->_('Utilisateur FTP de diffusion des offres PNB Dilicom'))->bePrivate(),
                    'DILICOM_PNB_FTP_PASS' => Class_AdminVar_Meta::newDefault($this->_('Mot de passe FTP de diffusion des offres PNB Dilicom'))->bePrivate(),
+                   'DILICOM_PNB_MAX_LOAN_DURATION' => Class_AdminVar_Meta::newDefault($this->_('Durée maximale (en jours) d\'un prêt PNB Dilicom'))->bePrivate(),
                    'MYCOW_EID' => Class_AdminVar_Meta::newDefault($this->_('Clé d\'identification MyCOW.EU pour le portail. Cette clé doit être fournie par MyCOW.EU. Elle active la ressource numérique dans le portail.'))->bePrivate(),
 
                    'ONEDTOUCH_URL' => Class_AdminVar_Meta::newDefault($this->_('Adresse du serveur OAI 1D touch'))->bePrivate(),
@@ -258,7 +259,7 @@ class Class_AdminVarLoader extends Storm_Model_Loader {
                    'KIDILANGUES_ID' => Class_AdminVar_Meta::newDefault($this->_('Clé d\'identification Kidilangues pour le portail. Cette clé doit être fournie par Kidilangues.'))->bePrivate(),
                    'KIDILANGUES_LOGIN' => Class_AdminVar_Meta::newDefault($this->_('Login du portail fourni par Kidilangues.'))->bePrivate(),
                    'KIDILANGUES_PWD' => Class_AdminVar_Meta::newDefault($this->_('Password du portail fourni par Kidilangues.'))->bePrivate(),
-                   
+
                    'PREMIERCHAPITRE_BIB_ID' => Class_Adminvar_Meta::newDefault($this->_('Clé d\'identification Premier-Chapitre de la bibliothèque. Cette clé doit être fournie par Premier-Chapitre.'))->bePrivate(),
                    'PREMIERCHAPITRE_BMID' => Class_Adminvar_Meta::newDefault($this->_('Login du portail fourni par Premier-Chapitre.'))->bePrivate(),
                    'PREMIERCHAPITRE_BMKEY' => Class_Adminvar_Meta::newDefault($this->_('Password du portail fourni par Premier-Chapitre'))->bePrivate(),
diff --git a/library/Class/Album/UsageConstraint.php b/library/Class/Album/UsageConstraint.php
index 475f54351aeeba0cd10b8f52c199f5935b792ec4..450c92e96f656e50ffb8298bb77209b9a1b64f06 100644
--- a/library/Class/Album/UsageConstraint.php
+++ b/library/Class/Album/UsageConstraint.php
@@ -70,7 +70,12 @@ class Class_Album_UsageConstraint extends Storm_Model_Abstract {
 
 
   public function getDuration() {
-    return (int)$this->getDatas()->get(self::DURATION);
+    $pnb_duration = (int)$this->getDatas()->get(self::DURATION);
+    $max_duration = (int)Class_AdminVar::get('DILICOM_PNB_MAX_LOAN_DURATION');
+    if (!$max_duration)
+      return $pnb_duration;
+
+    return min($max_duration, $pnb_duration);
   }
 
 
diff --git a/library/Class/WebService/BibNumerique/Dilicom/Hub.php b/library/Class/WebService/BibNumerique/Dilicom/Hub.php
index 4dd3f29f72d8a487a6e8d89805ce8609e5f17e8d..40286128d5a3196d6199af11b19778ed7499ae4f 100644
--- a/library/Class/WebService/BibNumerique/Dilicom/Hub.php
+++ b/library/Class/WebService/BibNumerique/Dilicom/Hub.php
@@ -88,7 +88,7 @@ class Class_WebService_BibNumerique_Dilicom_Hub extends Class_WebService_Abstrac
                                          'user_id' => $user->getId(),
                                          'ongoing' => true,
                                          'loan_date' => $this->startDate(),
-                                         'expected_return_date' => $this->endDate(),
+                                         'expected_return_date' => $this->endLoanDate($album),
                                          'record_origin_id' => $album->getIdOrigine()]);
     $loan->save();
 
@@ -98,7 +98,7 @@ class Class_WebService_BibNumerique_Dilicom_Hub extends Class_WebService_Abstrac
                                     'glnColl' => Class_AdminVar::get('DILICOM_PNB_GLN_COLLECTIVITE'),
                                     'loanerColl' => $user->getBibGLN(),
                                     'localization' => 'EX_SITU',
-                                    'loanEndDate' => urlencode($this->endDate()),
+                                    'loanEndDate' => urlencode($this->endLoanDate($album)),
                                     'ean13' => $album->getISBN(),
                                     'loanId' =>  $loan->getId(),
                                    ]);
@@ -120,7 +120,7 @@ class Class_WebService_BibNumerique_Dilicom_Hub extends Class_WebService_Abstrac
                               ['orderLineId' => $this->getOrderLineId($album),
                                'accessMedium' => 'STREAMING',
                                'localization' => 'IN_SITU',
-                               'consultEndDate' => urlencode($this->endDate()),
+                               'consultEndDate' => urlencode($this->endConsultDate()),
                                'ean13' => $album->getISBN(),
                                'ipAddress' => $ip_address,
                                'glnColl' => Class_AdminVar::get('DILICOM_PNB_GLN_COLLECTIVITE'),
@@ -143,7 +143,13 @@ class Class_WebService_BibNumerique_Dilicom_Hub extends Class_WebService_Abstrac
   }
 
 
-  public function endDate() {
+  public function endLoanDate($album) {
+    return $this->iso8601($this->_now +
+                          $album->getUsageConstraints()->getLoanDuration() * 3600 * 24);
+  }
+
+
+  public function endConsultDate() {
     return $this->iso8601($this->_now + 3600);
   }
 
diff --git a/tests/application/modules/opac/controllers/BibNumeriqueControllerDilicomTest.php b/tests/application/modules/opac/controllers/BibNumeriqueControllerDilicomTest.php
index e22616c58ddc401eb95d2792990d782c9e175daa..378db9bf458ea09ca17beafca962c5722bb9ee72 100644
--- a/tests/application/modules/opac/controllers/BibNumeriqueControllerDilicomTest.php
+++ b/tests/application/modules/opac/controllers/BibNumeriqueControllerDilicomTest.php
@@ -33,6 +33,8 @@ abstract class BibNumeriqueContollerDilicomTestCase extends AbstractControllerTe
                    ['id' => 1,
                     'gln' => '2345889']);
 
+    Class_AdminVar::set('DILICOM_PNB_MAX_LOAN_DURATION', 0);
+
     $logged_user = $this->fixture('Class_Users',
                                   ['id' => 6,
                                    'nom'=>'Pito',
@@ -65,6 +67,7 @@ abstract class BibNumeriqueContollerDilicomTestCase extends AbstractControllerTe
                                                                           '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',
                                                                           'order_line_id' => 'x321']),
                                                           $this->fixture('Class_Album_UsageConstraint',
                                                                          ['id' => 2,
@@ -183,7 +186,7 @@ class BibNumeriqueControllerDilicomLoanBookActionTest extends BibNumeriqueContol
 
     $this->_http
       ->whenCalled('open_url')
-      ->with('https://pnb-test.centprod.com/v2/pnb-numerique/json/loanBook?glnContractor=123456789&orderLineId=x321&accessMedium=DOWNLOAD&glnColl=afi-bib&loanerColl=2345889&localization=EX_SITU&loanEndDate=2014-05-02T15%3A14%3A14%2B0200&ean13=435465&loanId=1')
+      ->with('https://pnb-test.centprod.com/v2/pnb-numerique/json/loanBook?glnContractor=123456789&orderLineId=x321&accessMedium=DOWNLOAD&glnColl=afi-bib&loanerColl=2345889&localization=EX_SITU&loanEndDate=2014-08-10T14%3A14%3A14%2B0200&ean13=435465&loanId=1')
       ->answers(DilicomFixtures::loanBookResponse())
       ->beStrict();
 
@@ -216,9 +219,11 @@ class BibNumeriqueControllerDilicomLoanBookActionErrorsTest extends BibNumerique
     parent::setUp();
     $_SERVER['HTTP_REFERER'] = '/viewnotice/id/3';
 
+    Class_AdminVar::set('DILICOM_PNB_MAX_LOAN_DURATION', 10);
+
     $this->_http
       ->whenCalled('open_url')
-      ->with('https://pnb-test.centprod.com/v2/pnb-numerique/json/loanBook?glnContractor=123456789&orderLineId=x321&accessMedium=DOWNLOAD&glnColl=afi-bib&loanerColl=2345889&localization=EX_SITU&loanEndDate=2014-05-02T15%3A14%3A14%2B0200&ean13=435465&loanId=1')
+      ->with('https://pnb-test.centprod.com/v2/pnb-numerique/json/loanBook?glnContractor=123456789&orderLineId=x321&accessMedium=DOWNLOAD&glnColl=afi-bib&loanerColl=2345889&localization=EX_SITU&loanEndDate=2014-05-12T14%3A14%3A14%2B0200&ean13=435465&loanId=1')
       ->answers(DilicomFixtures::loanBookErrorResponse())
       ->beStrict();
 
diff --git a/tests/library/Class/WebService/Dilicom/PNBOffersParserTest.php b/tests/library/Class/WebService/Dilicom/PNBOffersParserTest.php
index 938ce6ca17b5cff71430a288cca05a4c8e1a8a49..fae8ec30035cbd47a95c18a795fad18190fd536e 100644
--- a/tests/library/Class/WebService/Dilicom/PNBOffersParserTest.php
+++ b/tests/library/Class/WebService/Dilicom/PNBOffersParserTest.php
@@ -20,11 +20,13 @@
  */
 
 
-class DilicomPNBOfferParserTest extends Storm_Test_ModelTestCase {
+abstract class DilicomPNBOfferParserTestCase extends Storm_Test_ModelTestCase {
+  protected $_xml;
+
   public function setUp() {
     parent::setUp();
     $xmlpath = realpath(dirname(__FILE__)) . '/fixtures/full_pnb_666_20150220T150017Z.xml';
-    $xml = file_get_contents($xmlpath);
+    $this->_xml = file_get_contents($xmlpath);
 
     $this->_http_client = Storm_Test_ObjectWrapper::mock()
                                                     ->whenCalled('open_url')
@@ -35,7 +37,19 @@ class DilicomPNBOfferParserTest extends Storm_Test_ModelTestCase {
 
     Class_Album_UsageConstraint::setTimeSource(new TimeSourceForTest('2014-05-02 14:14:14'));
 
-    $this->_books = Class_WebService_BibNumerique_Dilicom_PNBOffersFile::booksFromXML($xml);
+    $this->fixture('Class_AdminVar', ['id' => 'DILICOM_PNB_MAX_LOAN_DURATION',
+                                      'valeur' => '']);
+  }
+}
+
+
+
+
+class DilicomPNBOfferParserTest extends DilicomPNBOfferParserTestCase {
+  public function setUp() {
+    parent::setUp();
+
+    $this->_books = Class_WebService_BibNumerique_Dilicom_PNBOffersFile::booksFromXML($this->_xml);
   }
 
   public function tearDown() {
@@ -235,4 +249,25 @@ class DilicomPNBOfferParserTest extends Storm_Test_ModelTestCase {
   }
 
 }
+
+
+
+
+class DilicomPNBOfferParserWithLoanDurationVariableTest extends DilicomPNBOfferParserTestCase {
+  public function setUp() {
+    parent::setUp();
+    Class_AdminVar::set('DILICOM_PNB_MAX_LOAN_DURATION', '21');
+
+    $this->_books = Class_WebService_BibNumerique_Dilicom_PNBOffersFile::booksFromXML($this->_xml);
+  }
+
+
+  /**
+   * @test
+   */
+  public function firstAlbumLoanDurationShouldBe21() {
+    $album = $this->_books[0]->import();
+    $this->assertEquals(21, $album->getUsageConstraints()->getLoanDuration());
+  }
+}
 ?>
\ No newline at end of file