diff --git a/VERSIONS_HOTLINE/140322 b/VERSIONS_HOTLINE/140322 new file mode 100644 index 0000000000000000000000000000000000000000..334efa0363437fc5ffac30c27b9b1fc68580cce0 --- /dev/null +++ b/VERSIONS_HOTLINE/140322 @@ -0,0 +1 @@ + - ticket #140322 : Réservations calendaire : Correction de la prise en charge du paramétrage de plusieurs codes de types de documents. \ No newline at end of file diff --git a/application/modules/opac/controllers/RechercheController.php b/application/modules/opac/controllers/RechercheController.php index e532a1dc8de2e0316b57d3f584285bc2459043e2..63e0facddf78783d53c253aa1c0e625cb414721f 100644 --- a/application/modules/opac/controllers/RechercheController.php +++ b/application/modules/opac/controllers/RechercheController.php @@ -123,7 +123,7 @@ class RechercheController extends ZendAfi_Controller_Action { ->injectInto($criteres_recherche); $criteres_recherche = (new Class_CriteresRecherche_AxesParam)->fromParamArray($params) - ->injectInto($criteres_recherche); + ->injectInto($criteres_recherche); } if ($should_redirect) { @@ -880,9 +880,11 @@ class RechercheController extends ZendAfi_Controller_Action { if ($this->_request->isPost() && $form->isValid($this->_request->getPost())) { - return $this->_redirect($this->view->absoluteUrl(['action' => 'reservationajax', - 'render' => null, - 'code_annexe' => $this->_request->getPost('code_annexe')])); + return $this->_redirect($this->view->url(['module' => 'opac', + 'controller' => 'recherche', + 'action' => 'reservationajax', + 'render' => null, + 'code_annexe' => $this->_request->getPost('code_annexe')])); } $html = []; diff --git a/library/Class/WebService/SIGB/AbstractRESTService.php b/library/Class/WebService/SIGB/AbstractRESTService.php index 6c8b03fdb6f4100ded19771daadf4c3d84e30d4a..f2af41d2e3694be46f3ede5f05c0bfb2d1864d64 100644 --- a/library/Class/WebService/SIGB/AbstractRESTService.php +++ b/library/Class/WebService/SIGB/AbstractRESTService.php @@ -20,6 +20,9 @@ */ abstract class Class_WebService_SIGB_AbstractRESTService extends Class_WebService_SIGB_AbstractService { + + protected static $_should_throw_error = false; + protected $_server_root; protected $_web_client; protected $_has_network_error = false; @@ -129,11 +132,21 @@ abstract class Class_WebService_SIGB_AbstractRESTService extends Class_WebServic */ protected function _withClientDo($options, $closure) { $url = $this->buildQueryURL($options); - try { + $web_client = $this->getWebClient(); + + $response_closure = function($closure, $url) + { $response = $closure($this->getWebClient(), $url); $this->log($this); $this->_has_network_error = false; return $response; + }; + + if (static::$_should_throw_error) + return $response_closure($closure, $url); + + try { + return $response_closure($closure, $url); } catch (Exception $e) { $this->logError($url, $e->getMessage()); $this->_has_network_error = true; @@ -171,7 +184,6 @@ abstract class Class_WebService_SIGB_AbstractRESTService extends Class_WebServic public function httpGetNotice($params, $reader) { $xml = $this->httpGet($params); - if ($notice = $reader->getNoticeFromXML($xml)) $this->cacheNotice($notice); @@ -332,4 +344,9 @@ abstract class Class_WebService_SIGB_AbstractRESTService extends Class_WebServic protected function _getErrorFromCode($error_code, $default_message) { return $default_message; } + + + public static function shouldThrowError($should) { + static::$_should_throw_error = $should; + } } \ No newline at end of file diff --git a/library/Class/WebService/SIGB/Koha.php b/library/Class/WebService/SIGB/Koha.php index f3b0c7b64a1dcda0f3154206ccf97124b3d5a857..c67a04f72c0c80d3a9565a5fe085298a5e5b984d 100644 --- a/library/Class/WebService/SIGB/Koha.php +++ b/library/Class/WebService/SIGB/Koha.php @@ -54,7 +54,7 @@ class Class_WebService_SIGB_Koha { $service ->setCodificationDisponibilites(Class_WebService_SIGB_Abstract::decodeMapping($params['Codification_disponibilites'])) ->setWithdrawnMapping(Class_WebService_SIGB_Abstract::decodeMapping($params['withdrawn_mapping'])) - ->setGroupedHoldsITypes(array_filter(explode("\n", $params['grouped_holds_itypes']))) + ->setGroupedHoldsITypes(static::_extractGroupedHoldsItypes($params)) ->setBundledHoldsMinimalDuration($params['bundled_holds_minimal_duration']) ->setBundledHoldsMaximalDuration($params['bundled_holds_maximal_duration']); @@ -70,4 +70,10 @@ class Class_WebService_SIGB_Koha { public static function reset() { static::$services = []; } + + + protected static function _extractGroupedHoldsItypes($params) { + return array_filter(explode("\n", + $params['grouped_holds_itypes'])); + } } diff --git a/library/Class/WebService/SIGB/Koha/GetRecordsResponseReader.php b/library/Class/WebService/SIGB/Koha/GetRecordsResponseReader.php index ad31261f821576f02a8706ab4f5b3fcacdbb14c9..33d1452fb92fee2e2dd5274a2b902a6f3e07cd86 100644 --- a/library/Class/WebService/SIGB/Koha/GetRecordsResponseReader.php +++ b/library/Class/WebService/SIGB/Koha/GetRecordsResponseReader.php @@ -152,7 +152,13 @@ class Class_WebService_SIGB_Koha_GetRecordsResponseReader { if (!$this->_hasChild('itype', $this->_xml_item)) return $this; - if (in_array((string)$this->_xml_item->itype, $this->_grouped_holds_itypes)) + $itype = strtolower(trim((string) $this->_xml_item->itype)); + $itypes = array_map(function($itype) + { + return strtolower(trim((string) $itype)); + }, $this->_grouped_holds_itypes); + + if (in_array($itype, $itypes)) $this->_item->doRequiresCalendarHold(); return $this; diff --git a/library/Class/WebService/SIGB/Koha/Service.php b/library/Class/WebService/SIGB/Koha/Service.php index 037087058f432405b750baf74792f886630d249a..eb8492f2d2b5cedc4da4ab2f6cf664bc31493325 100644 --- a/library/Class/WebService/SIGB/Koha/Service.php +++ b/library/Class/WebService/SIGB/Koha/Service.php @@ -33,10 +33,6 @@ class Class_WebService_SIGB_Koha_Service extends Class_WebService_SIGB_AbstractR $_bundled_holds_minimal_duration = 0, $_bundled_holds_maximal_duration = 0; - public static function newInstance() { - return new static(); - } - public static function getService($params) { return static::newInstance() diff --git a/tests/application/modules/AbstractControllerTestCase.php b/tests/application/modules/AbstractControllerTestCase.php index 3f041ba0b648733b9d7c79ceb6d25cd8b8555c24..b1f1e9e17521eff60c089d52eb6a29ec8d829d47 100644 --- a/tests/application/modules/AbstractControllerTestCase.php +++ b/tests/application/modules/AbstractControllerTestCase.php @@ -215,6 +215,7 @@ abstract class AbstractControllerTestCase extends Zend_Test_PHPUnit_ControllerTe Class_Codification::reset(); ZendAfi_Acl_AdminControllerRoles::reset(); Intonation_Library_Record::reset(); + Class_WebService_SIGB_AbstractRESTService::shouldThrowError(false); } diff --git a/tests/application/modules/opac/controllers/RechercheControllerReservationTest.php b/tests/application/modules/opac/controllers/RechercheControllerReservationTest.php index 4d5159defc6b6e325adf66a4df7a83509d2ccea4..c8e741d2c0f4d1479d6c2a254333f84997b093e8 100644 --- a/tests/application/modules/opac/controllers/RechercheControllerReservationTest.php +++ b/tests/application/modules/opac/controllers/RechercheControllerReservationTest.php @@ -106,7 +106,7 @@ class RechercheControllerReservationPickupAjaxActionPostTest 'id_origine' => 12, 'code_annexe' => '36']); - $this->assertRedirectTo(Class_Url::absolute('/recherche/reservationajax/code_annexe/36')); + $this->assertRedirectTo('/recherche/reservationajax/code_annexe/36'); } @@ -1392,4 +1392,96 @@ class RechercheControllerReservationPickupAjaxAndNotifyByMailEnabledTest public function mailBodyShouldContainsContent($content) { $this->assertContains($content,quoted_printable_decode(current($this->_sent_mails)->getBodyHtml(true))); } +} + + + + +require_once 'tests/fixtures/KohaFixtures.php'; + +class RechercheControllerReservationWithWebServiceKohaAndItypesTest + extends AbstractControllerTestCase { + + protected $_storm_default_to_volatile = true; + + + public function setUp() { + parent::setUp(); + + Class_WebService_SIGB_AbstractRESTService::shouldThrowError(true); + + $koha_service_params = ['url_serveur' => 'http://bib.valensol.net', + 'grouped_holds_itypes' => " PRET_MALLE + OUT +PRET_GLACIERE +PRET_VALISE", + 'bundled_holds_minimal_duration' => 30, + 'bundled_holds_maximal_duration' => 60, + 'id_bib' => 1, + 'type' => 5]; + + $bib = $this->fixture('Class_IntBib', + ['id' => 1, + 'comm_sigb' => Class_IntBib::COM_KOHA, + 'comm_params' => $koha_service_params]); + + $http_client = $this + ->mock() + + ->whenCalled('open_url') + ->with('http://bib.valensol.net?service=GetRecords') + ->answers(KohaFixtures::getRecordsWithGroupHoldsItypes()) + + ->beStrict(); + + Class_WebService_SIGB_Koha::getService($koha_service_params) + ->setWebClient($http_client); + + $record = + $this->fixture('Class_Notice', + ['id' => 8890, + 'titre_principal' => 'Elementaire mon cher polar', + 'auteur_principal' => 'Conan Doyle']); + + $this->fixture('Class_Exemplaire', + ['id' => 456, + 'code_barres' => 5360246264, + 'id_int_bib' => 1, + 'notice' => $record]); + + $this->fixture('Class_CodifAnnexe', + ['id' => 3, + 'code' => 'VS', + 'id_origine' => 'VS', + 'libelle' => 'Cran', + 'no_pickup' => '0']); + + Class_CosmoVar::setValueOf('site_retrait_resa', 1); + + $user = $this->fixture('Class_Users', + ['id' => 1, + 'login' => 'jajm', + 'password' => 'secret', + 'int_bib' => $bib, + 'idabon' => '395749' + ]); + + ZendAfi_Auth::getInstance()->logUser($user); + } + + + /** @test */ + public function reservationAjaxWithItemRequiringCalendarHoldShouldRedirectToReservationCalendarAjaxWithoutException() { + $this->postDispatch('/recherche/reservation-pickup-ajax/id_bib/1/copy_id/456/code_annexe/VS', + ['code_annexe' => 'VS']); + + $this->assertRedirectTo('/recherche/reservationajax/id_bib/1/copy_id/456/code_annexe/VS'); + } + + + /** @test */ + public function dispatchReservationajaxShouldRenderCalendar() { + $this->dispatch('/recherche/reservationajax/id_bib/1/copy_id/456/code_annexe/VS'); + $this->assertRedirectTo('/recherche/reservation-calendar-ajax/id_bib/1/copy_id/456/code_annexe/VS'); + } } \ No newline at end of file diff --git a/tests/fixtures/KohaFixtures.php b/tests/fixtures/KohaFixtures.php index 209008aed3a3078db531128ed77291ba18b18ae1..7d68fa69889be34370e21dd54aa660802af9fbc3 100644 --- a/tests/fixtures/KohaFixtures.php +++ b/tests/fixtures/KohaFixtures.php @@ -895,7 +895,7 @@ class KohaFixtures { } - public static function xmlLookupPatronLaure() { + public static function xmlLookupPatronLaure() { return '<?xml version="1.0" encoding="ISO-8859-1" ?> <LookupPatron> <id>572</id> @@ -903,24 +903,23 @@ class KohaFixtures { } - - public static function xmlAuthenticatePatronOk() { + public static function xmlAuthenticatePatronOk() { return '<?xml version="1.0" encoding="UTF-8" ?> <AuthenticatePatron> <id>96138</id> </AuthenticatePatron>'; - } + } - public static function xmlAuthenticatePatronLostCard() { - return '<?xml version="1.0" encoding="UTF-8" ?> + public static function xmlAuthenticatePatronLostCard() { + return '<?xml version="1.0" encoding="UTF-8" ?> <AuthenticatePatron> <code>PatronLostCard</code> </AuthenticatePatron>'; - } + } - public static function xmlGetPatronInfoLaure() { + public static function xmlGetPatronInfoLaure() { return '<?xml version="1.0" encoding="UTF-8" ?> <GetPatronInfo> <category_type>A</category_type> @@ -1052,11 +1051,11 @@ class KohaFixtures { <sort1>10</sort1> <sex></sex> </GetPatronInfo>'; - } + } - public static function xmlGetPatronInfoLaureLoans() { - return '<?xml version="1.0" encoding="UTF-8" ?> + public static function xmlGetPatronInfoLaureLoans() { + return '<?xml version="1.0" encoding="UTF-8" ?> <GetPatronInfo> <category_type>A</category_type> <categorycode>INDIVIDU</categorycode> @@ -1092,17 +1091,17 @@ class KohaFixtures { <sort1>10</sort1> <sex></sex> </GetPatronInfo>'; - } + } - public static function xmlGetPatronLaureIssuesHistoryError() { - return ''; - } + public static function xmlGetPatronLaureIssuesHistoryError() { + return ''; + } - public static function jsonGetPatronLaureIssueHistoryFourItems() { - return '[ + public static function jsonGetPatronLaureIssueHistoryFourItems() { + return '[ { "itemnumber" : 89658, "booksellerid" : null, @@ -1515,11 +1514,11 @@ class KohaFixtures { "booksellerid" : null, "itemnumber" : 104955 }]'; - } + } - public static function jsonGetPatronLaureIssueHistoryMoreThan20() { - return '[ + public static function jsonGetPatronLaureIssueHistoryMoreThan20() { + return '[ { "itemnumber" : 89658, "booksellerid" : null, @@ -3685,43 +3684,42 @@ class KohaFixtures { } ]'; - } + } - public static function xmlLookupPatronJeanAndre() { - return '<?xml version="1.0" encoding="UTF-8" ?> + public static function xmlLookupPatronJeanAndre() { + return '<?xml version="1.0" encoding="UTF-8" ?> <LookupPatron> <id>419</id> </LookupPatron>'; - } - + } - public static function xmlLookupPatronDebarred() { - return '<?xml version="1.0" encoding="UTF-8" ?> + public static function xmlLookupPatronDebarred() { + return '<?xml version="1.0" encoding="UTF-8" ?> <LookupPatron> <id>420</id> </LookupPatron>'; - } + } - public static function xmlLookupPatronLisianne() { - return '<?xml version="1.0" encoding="UTF-8" ?> + public static function xmlLookupPatronLisianne() { + return '<?xml version="1.0" encoding="UTF-8" ?> <LookupPatron> <id>16186</id> </LookupPatron>'; - } + } - public static function xmlLookupPatronJamesBond() { - return '<?xml version="1.0" encoding="UTF-8" ?> + public static function xmlLookupPatronJamesBond() { + return '<?xml version="1.0" encoding="UTF-8" ?> <LookupPatron> <id>007</id> </LookupPatron>'; - } + } - public static function xmlGetPatronInfoDupont() { + public static function xmlGetPatronInfoDupont() { return '<?xml version="1.0" encoding="UTF-8" ?> <GetPatronInfo> <category_type>A</category_type> @@ -3764,11 +3762,11 @@ class KohaFixtures { <reservefee>0.000000</reservefee> </GetPatronInfo>'; - } + } - public static function xmlGetPatronInfoJeanAndre() { - return '<?xml version="1.0" encoding="UTF-8" ?> + public static function xmlGetPatronInfoJeanAndre() { + return '<?xml version="1.0" encoding="UTF-8" ?> <GetPatronInfo> <category_type>A</category_type> <categorycode>ADUEXT</categorycode> @@ -3794,11 +3792,11 @@ class KohaFixtures { <sort1>CSP5</sort1> <sex>M</sex> </GetPatronInfo>'; - } + } - public static function xmlGetPatronInfoJeanAndreLoans() { - return '<?xml version="1.0" encoding="UTF-8" ?> + public static function xmlGetPatronInfoJeanAndreLoans() { + return '<?xml version="1.0" encoding="UTF-8" ?> <GetPatronInfo> <category_type>A</category_type> <categorycode>ADUEXT</categorycode> @@ -3902,11 +3900,11 @@ class KohaFixtures { </loan> </loans> </GetPatronInfo>'; - } + } - public static function xmlGetPatronInfoJamesBond() { - return '<?xml version="1.0" encoding="UTF-8" ?> + public static function xmlGetPatronInfoJamesBond() { + return '<?xml version="1.0" encoding="UTF-8" ?> <GetPatronInfo> <borrowernumber>007</borrowernumber> <cardnumber>007</cardnumber> @@ -4009,12 +4007,12 @@ class KohaFixtures { <loans> </loans> </GetPatronInfo>' - ; - } + ; + } - public static function xmlGetRecordsElementaireMonCherPolar () { - return + public static function xmlGetRecordsElementaireMonCherPolar () { + return '<?xml version="1.0" encoding="ISO-8859-1" ?> <GetRecords> <record> @@ -4114,11 +4112,11 @@ class KohaFixtures { </items> </record> </GetRecords>'; - } + } - public static function elementaireMonCherPolarHolds() { - return + public static function elementaireMonCherPolarHolds() { + return '{ "holds": [ { @@ -4192,11 +4190,11 @@ class KohaFixtures { } ] }'; - } + } - public static function xmlGetRecordsWithTransfert () { - return '<?xml version="1.0" encoding="UTF-8" ?> + public static function xmlGetRecordsWithTransfert () { + return '<?xml version="1.0" encoding="UTF-8" ?> <GetRecords> <record> <itemtype>LIVR</itemtype> @@ -4369,11 +4367,11 @@ class KohaFixtures { </record> </GetRecords> '; - } + } - public static function xmlGetRecordsWithOnLoan () { - return - '<?xml version="1.0" encoding="ISO-8859-1" ?> + + public static function xmlGetRecordsWithOnLoan () { + return '<?xml version="1.0" encoding="ISO-8859-1" ?> <GetRecords> <record> <biblioitemnumber>1</biblioitemnumber> @@ -4464,10 +4462,11 @@ class KohaFixtures { </items> </record> </GetRecords>'; - } + } + - public static function xmlGetPatronInfoDebarred() { - return '<?xml version="1.0" encoding="UTF-8" ?> + public static function xmlGetPatronInfoDebarred() { + return '<?xml version="1.0" encoding="UTF-8" ?> <GetPatronInfo> <privacy_guarantor_checkouts>0</privacy_guarantor_checkouts> <updated_on>2019-02-18 09:26:19</updated_on> @@ -4524,11 +4523,11 @@ class KohaFixtures { <login_attempts>0</login_attempts> </GetPatronInfo> '; - } + } - public static function xmlGetPatronInfoDebarredWithDate() { - return '<?xml version="1.0" encoding="UTF-8" ?> + public static function xmlGetPatronInfoDebarredWithDate() { + return '<?xml version="1.0" encoding="UTF-8" ?> <GetPatronInfo> <privacy_guarantor_checkouts>0</privacy_guarantor_checkouts> <updated_on>2019-02-18 09:26:19</updated_on> @@ -4585,11 +4584,11 @@ class KohaFixtures { <login_attempts>0</login_attempts> </GetPatronInfo> '; - } + } - public static function xmlGetRecord2046() { - return '<?xml version="1.0" encoding="UTF-8" ?> + public static function xmlGetRecord2046() { + return '<?xml version="1.0" encoding="UTF-8" ?> <GetRecords> <record> <reserves> @@ -5329,5 +5328,230 @@ class KohaFixtures { </record> </GetRecords> '; - } -} + } + + + public static function getRecordsWithGroupHoldsItypes() { + return '<?xml version="1.0" encoding="UTF-8" ?> +<GetRecords> + <record> + <itemtype>OUTIL</itemtype> + <cn_sort></cn_sort> + <reserves> + </reserves> + <items> + <item> + <holdingbranch>VITRE</holdingbranch> + <dateaccessioned>2018-04-18</dateaccessioned> + <replacementpricedate>2018-04-18</replacementpricedate> + <barcode>5360246264</barcode> + <location>FPROA</location> + <withdrawn>0</withdrawn> + <homebranch>VITRE</homebranch> + <timestamp>2021-09-14 11:23:43</timestamp> + <homebranchname>Vitré - Médiathèque Madame de Sévigné</homebranchname> + <itemlost>0</itemlost> + <holdingbranchname>Vitré - Médiathèque Madame de Sévigné</holdingbranchname> + <notforloan>0</notforloan> + <datelastseen>2021-09-14</datelastseen> + <itemnumber>191100</itemnumber> + <onloan>2021-10-26</onloan> + <issues>15</issues> + <renewals>5</renewals> + <replacementprice>229.25</replacementprice> + <damaged>0</damaged> + <biblioitemnumber>179788</biblioitemnumber> + <biblionumber>179788</biblionumber> + <cn_sort>ARLEANE_CUBETTO1</cn_sort> + <itemcallnumber>ARLEANE-CUBETTO1</itemcallnumber> + <datelastborrowed>2021-09-14</datelastborrowed> + <permanent_location>FPROA</permanent_location> + <itype>OUT</itype> + </item> + <item> + <itemlost>0</itemlost> + <holdingbranchname>Vitré - Médiathèque Madame de Sévigné</holdingbranchname> + <notforloan>0</notforloan> + <itemnumber>191217</itemnumber> + <datelastseen>2020-01-09</datelastseen> + <issues>7</issues> + <renewals>7</renewals> + <holdingbranch>VITRE</holdingbranch> + <dateaccessioned>2018-04-19</dateaccessioned> + <replacementpricedate>2018-04-19</replacementpricedate> + <barcode>5360246513</barcode> + <location>FPROA</location> + <withdrawn>0</withdrawn> + <homebranch>VITRE</homebranch> + <timestamp>2021-08-30 14:53:45</timestamp> + <homebranchname>Vitré - Médiathèque Madame de Sévigné</homebranchname> + <cn_sort>ARLEANE_CUBETTO2</cn_sort> + <datelastborrowed>2019-12-12</datelastborrowed> + <itemcallnumber>ARLEANE-CUBETTO2</itemcallnumber> + <permanent_location>FPROA</permanent_location> + <itype>OUT</itype> + <replacementprice>229.25</replacementprice> + <damaged>0</damaged> + <biblionumber>179788</biblionumber> + <biblioitemnumber>179788</biblioitemnumber> + </item> + </items> + <publishercode>Primo Toys</publishercode> + <biblionumber>179788</biblionumber> + <biblioitemnumber>179788</biblioitemnumber> + <issues> + <issue> + <lastreneweddate>2018-10-04 00:00:00</lastreneweddate> + <issue_id>1883862</issue_id> + <biblionumber>179788</biblionumber> + <timestamp>2018-10-09 18:50:12</timestamp> + <barcode>5360246513</barcode> + <onsite_checkout>0</onsite_checkout> + <branchcode>VITRE</branchcode> + <issuedate>2018-08-31 16:21:49</issuedate> + <renewals>1</renewals> + <title>Cubetto Playset 1 - touch, program, play</title> + <date_due>2018-10-25 23:59:00</date_due> + <auto_renew>0</auto_renew> + <itemnumber>191217</itemnumber> + <returndate>2018-10-09 18:50:12</returndate> + </issue> + </issues> + <place>London</place> + <timestamp>2021-09-15 01:10:07</timestamp> + <publicationyear>2016</publicationyear> + <pages>2 coffrets (Kit robot + Kit Tapis)</pages> + <totalissues>22</totalissues> + <size>14 x 26 x 27 cm</size> + <url>https://www.primotoys.com/fr/</url> +<marcxml><?xml version="1.0" encoding="UTF-8"?> +<record + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.loc.gov/MARC21/slim http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd" + xmlns="http://www.loc.gov/MARC21/slim"> + + <leader>01230 2200241 4500</leader> + <controlfield tag="001">119018</controlfield> + <datafield tag="010" ind1=" " ind2=" "> + <subfield code="a">291409650X</subfield> + <subfield code="d">30.00 EUR</subfield> + </datafield> + <datafield tag="035" ind1=" " ind2=" "> + <subfield code="a">SMH_12290</subfield> + </datafield> + <datafield tag="035" ind1=" " ind2=" "> + <subfield code="a">AG-0174-00172383</subfield> + </datafield> + <datafield tag="090" ind1=" " ind2=" "> + <subfield code="a">119018</subfield> + </datafield> + <datafield tag="091" ind1=" " ind2=" "> + <subfield code="a">0</subfield> + </datafield> + <datafield tag="099" ind1=" " ind2=" "> + <subfield code="t">OUTIL</subfield> + <subfield code="c">2010-08-31</subfield> + <subfield code="d">2021-04-25</subfield> + </datafield> + <datafield tag="100" ind1=" " ind2=" "> + <subfield code="a">20210625d2006 frey50 </subfield> + </datafield> + <datafield tag="101" ind1=" " ind2=" "> + <subfield code="a">fre</subfield> + </datafield> + <datafield tag="102" ind1=" " ind2=" "> + <subfield code="a">FR</subfield> + </datafield> + <datafield tag="200" ind1=" " ind2=" "> + <subfield code="a">Les trois Zouloulais</subfield> + <subfield code="f">texte Florence-Jenner Metz</subfield> + <subfield code="g">illustrations de Stéphane Henrich</subfield> + <subfield code="b">IF</subfield> + <subfield code="e">[Kamishibaï]</subfield> [99/600] + </datafield> + <datafield tag="210" ind1=" " ind2=" "> + <subfield code="a">Strasbourg</subfield> + <subfield code="c">Callicéphale</subfield> + <subfield code="d">2006</subfield> + </datafield> + <datafield tag="215" ind1=" " ind2=" "> + <subfield code="c">1 kamishibaï de 16 pl.</subfield> + <subfield code="d">27 x 37 cm</subfield> + <subfield code="a">ill. en coul.</subfield> + </datafield> + <datafield tag="300" ind1=" " ind2=" "> + <subfield code="a">Nécessite un butaï pour la lecture.</subfield> + </datafield> + <datafield tag="330" ind1=" " ind2=" "> + <subfield code="a">Lorsque Zoré, le sorcier de la tribu des Zouloulais, décide de partir regagner ses pouvoirs auprès de ses ancêtres, il doit trouver quelqu\'un capable de protéger le village durant son absence, de lutter contre les mauvais esprits et les fléaux des vents. 14 planches : une face dessinée, l\'autre pour le texte, permettent de présenter le dessin au spectateur alors que le récitant narre l\'histoire.</subfield> + </datafield> + <datafield tag="700" ind1=" " ind2="1"> + <subfield code="a">Jenner-Metz</subfield> + <subfield code="b">Florence</subfield> + <subfield code="4">070</subfield> + <subfield code="3">13774643</subfield> + </datafield> + <datafield tag="702" ind1=" " ind2="1"> + <subfield code="a">Henrich</subfield> + <subfield code="b">Stéphane</subfield> + <subfield code="4">440</subfield> + <subfield code="3">13630025</subfield> + </datafield> + <datafield tag="856" ind1=" " ind2=" "> + <subfield code="u">https://www.callicephale.fr/wp-content/uploads/2017/05/wkm_57f247329ca4a.pdf</subfield> + </datafield> + <datafield tag="995" ind1=" " ind2=" "> + <subfield code="2">0</subfield> + <subfield code="3">0</subfield> + <subfield code="5">2010-08-31</subfield> + <subfield code="9">96090</subfield> + <subfield code="b">VITRE</subfield> + <subfield code="c">VITRE</subfield> + <subfield code="e">FPROA</subfield> + <subfield code="f">5360143266</subfield> + <subfield code="i">30.00</subfield> + <subfield code="j">0</subfield> + <subfield code="k">ARLEANE-KAM1</subfield> + <subfield code="m">2012-06-20</subfield> + <subfield code="o">0</subfield> + <subfield code="r">NOUT</subfield> + <subfield code="x">ARLEANE_KAM1</subfield> + <subfield code="z">0</subfield> + <subfield code="q">ADULTE</subfield> + <subfield code="s">Achat</subfield> + <subfield code="t">KAM</subfield> + </datafield> + <datafield tag="995" ind1=" " ind2=" "> + <subfield code="2">0</subfield> + <subfield code="3">0</subfield> + <subfield code="5">2009-05-07</subfield> + <subfield code="9">321318</subfield> + <subfield code="b">SMH</subfield> + <subfield code="c">SMH</subfield> + <subfield code="e">JEU</subfield> + <subfield code="f">1061773530018</subfield> + <subfield code="i">29.50</subfield> + <subfield code="j">0</subfield> + <subfield code="k">E JEN</subfield> + <subfield code="m">2021-06-28</subfield> + <subfield code="o">3</subfield> + <subfield code="r">NOUT</subfield> + <subfield code="x">E_JEN</subfield> + <subfield code="z">0</subfield> + <subfield code="g">ACHAT</subfield> + <subfield code="q">JEUNESSE</subfield> + </datafield> +</record> +</marcxml> + </record> +</GetRecords> +'; + } + + public static function holdTitleResponseWithItemHoldsItypeOut() { + return '<?xml version="1.0" encoding="UTF-8" ?> +<HoldItem> + <pickup_location>Vitré - Médiathèque Madame de Sévigné</pickup_location> +</HoldItem>'; + } +} \ No newline at end of file