From 928a71d6f9715ce7283e39b65e2c21406a42ee05 Mon Sep 17 00:00:00 2001
From: efalcy <efalcy@git-test.afi-sa.fr>
Date: Fri, 14 Jun 2013 15:05:30 +0000
Subject: [PATCH] Numilog : correction parser Dublin core pour les dates +
 ajout des matieres

---
 .../BibNumerique/LivreNumerique.php           |  8 ---
 .../Numilog/LivresNumeriquesReader.php        |  2 -
 .../BibNumerique/RessourceNumerique.php       | 28 ++++++++-
 library/Class/WebService/DublinCoreParser.php |  7 ++-
 library/Class/WebService/OAI.php              |  1 -
 tests/fixtures/numilog_catalogue.xml          | 32 ++++++++++
 .../library/Class/WebService/NumilogTest.php  | 60 ++++++++++++++++++-
 7 files changed, 122 insertions(+), 16 deletions(-)

diff --git a/library/Class/WebService/BibNumerique/LivreNumerique.php b/library/Class/WebService/BibNumerique/LivreNumerique.php
index baed437de44..6a33b432613 100644
--- a/library/Class/WebService/BibNumerique/LivreNumerique.php
+++ b/library/Class/WebService/BibNumerique/LivreNumerique.php
@@ -23,14 +23,6 @@ class Class_WebService_BibNumerique_LivreNumerique extends Class_WebService_BibN
 	protected $_record;
 	protected $_titre;
 
-	public static function createLivreNumeriqueFromRecord($record) {
-		$livre = new Class_WebService_BibNumerique_LivreNumerique();
-		$livre -> setRecord($record);
-		return $livre;
-	}
-
-
-
 
 	public function getBaseUrl(){
 		return Class_WebService_BibNumerique_Numilog::BASE_URL;
diff --git a/library/Class/WebService/BibNumerique/Numilog/LivresNumeriquesReader.php b/library/Class/WebService/BibNumerique/Numilog/LivresNumeriquesReader.php
index a7232d75344..f086d696236 100644
--- a/library/Class/WebService/BibNumerique/Numilog/LivresNumeriquesReader.php
+++ b/library/Class/WebService/BibNumerique/Numilog/LivresNumeriquesReader.php
@@ -33,8 +33,6 @@ class Class_WebService_BibNumerique_Numilog_LivresNumeriquesReader extends Class
 		$records=$this->_xml_parser->parseListRecordsRessourcesNumeriqueXML($xml);
 		$this->livres = [];
 		foreach($records as $record) {
-//			$livre = Class_WebService_BibNumerique_LivreNumerique::createLivreNumeriqueFromRecord($record);
-			//		$livre->setRecord($record);
 			$this->livres[]=$record;
 		}
 		$this->_total_count = sizeof($this->livres);
diff --git a/library/Class/WebService/BibNumerique/RessourceNumerique.php b/library/Class/WebService/BibNumerique/RessourceNumerique.php
index 753d4617a5b..2c8022f76d5 100644
--- a/library/Class/WebService/BibNumerique/RessourceNumerique.php
+++ b/library/Class/WebService/BibNumerique/RessourceNumerique.php
@@ -33,7 +33,7 @@
 	protected $_trailers = array();
 	protected $_photos = array();
 	protected $_editeur;
-
+	protected $_matieres = [];
 	public function setId($id) {
 		$this->_id = $id;
 		return $this;
@@ -177,6 +177,30 @@
 	}
 
 
+	public function addMatiere($matiere_libelle) {
+		$this->_matieres[] = $matiere_libelle;
+	}
+
+
+	public function importMatieres($album) {
+		$ids=[];
+		$indexation = new Class_Indexation();
+		foreach ($this->_matieres as $matiere_libelle) { 
+			if ( $matiere=Class_CodifMatiere::findFirstBy(['libelle' => $matiere_libelle])) {
+				$ids[]=$matiere->getId();
+				continue;
+			}
+
+			$matiere= new Class_CodifMatiere();
+			$matiere->setLibelle($matiere_libelle);
+			$matiere->setCodeAlpha($indexation->alphaMaj($matiere_libelle));
+			$matiere->save();
+			$ids[]=$matiere->getId();
+		
+		}
+		if ($ids)
+			$album->setMatiere(implode(';',$ids));
+	}
 
 
 	public function import() {
@@ -191,7 +215,7 @@
 			->setUrlOrigine($this->getBaseUrl())
 			->setCategorie($categorie);
 		
-
+		$this->importMatieres($album);
 		$this->fillAlbum($album);
 		
 		$this->updateRessourceNumeriqueNotes($album);
diff --git a/library/Class/WebService/DublinCoreParser.php b/library/Class/WebService/DublinCoreParser.php
index 726ddbc1b49..5372764064d 100644
--- a/library/Class/WebService/DublinCoreParser.php
+++ b/library/Class/WebService/DublinCoreParser.php
@@ -136,9 +136,14 @@ class Class_WebService_DublinCoreParser {
 		$this->assign_data_to('editeur');
 	}
 
+	protected function end_dc_subject($parser) {
+		$this->ressource_numerique->addMatiere($this->current_data);
+	}
 
 	protected function end_dc_date($parser) {
-		$this->ressource_numerique->setYear(explode('-',$this->current_data)[0]);
+		$date = $this->current_data;
+		if (strlen($date)>4)
+			$this->ressource_numerique->setYear(substr($date,0,4));
 		$this->assign_data_to('date');
 	}
 
diff --git a/library/Class/WebService/OAI.php b/library/Class/WebService/OAI.php
index 0374dbfd72f..bc799d19c6f 100644
--- a/library/Class/WebService/OAI.php
+++ b/library/Class/WebService/OAI.php
@@ -132,7 +132,6 @@ class Class_WebService_OAI extends Class_WebService_Abstract {
 		$parser = new Class_WebService_DublinCoreParser();
 		$parser->acceptVisitor($this);
 		$parser->parseRessourcesNumeriques($xml_data);
-		xdebug_break();
 		return $parser->getRecordsRessourceNumeriques();
 	}
 
diff --git a/tests/fixtures/numilog_catalogue.xml b/tests/fixtures/numilog_catalogue.xml
index cc38d130657..557c14a24e3 100644
--- a/tests/fixtures/numilog_catalogue.xml
+++ b/tests/fixtures/numilog_catalogue.xml
@@ -47,6 +47,38 @@
 </oai_dc:dc>
 </metadata>
 </record>
+<record>
+<header>
+<identifier>oai:numilog.com:9782212540147</identifier>
+<datestamp>2010-12-17T15:59:42Z</datestamp>
+</header>
+<metadata>
+<oai_dc:dc xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:oai_dc="http://www.openarchives.org/OAI/2.0/oai_dc/">
+<dc:identifier>oai:numilog.com:9782212540147</dc:identifier>
+<dc:title><![CDATA[Stress et burnout au travail]]></dc:title>
+<dc:creator><![CDATA[Elisabeth Grebot]]></dc:creator>
+<dc:publisher><![CDATA[Editions d'Organisation]]></dc:publisher>
+<dc:date>20110707</dc:date>
+<dc:description><![CDATA[<h4>Stressé, harcelé, "burnouté"&nbsp;? 
+<br />26 questionnaires pour faire le point</h4>
+
+<p><strong>Trois salariés français sur quatre se disent stressés. Il est aujourd'hui reconnu que le travail est une source de stress. Mais que désigne le stress exactement&nbsp;? Pourquoi survient-il&nbsp;? Quand devient-il nocif&nbsp;?</strong></p>
+
+<p>Ce guide dresse un état des lieux du stress au travail&nbsp;: ce qu'il est, ce qu'il n'est pas, ses manifestations, son coût pour l'entreprise, l'individu et la société... Il propose au lecteur un ensemble de questionnaires pour identifier son profil de stressé et l'invite notamment à distinguer le stress professionnel géré sainement de celui qui conduit au <em>burnout</em> ou au harcèlement moral.</p>
+
+<p>À l'entreprise, il suggère des pistes d'action pour mettre en place des modes d'organisation favorables à la santé physique et mentale des salariés. Au salarié stressé, il prescrit diverses techniques individuelles pour modérer son stress&nbsp;: la relaxation, l'exposition, la restructuration cognitive, etc.</p>]]></dc:description>
+<dc:subject>Psychologie</dc:subject>
+<dc:subject>Métiers et Formations</dc:subject>
+<dc:subject>Management</dc:subject>
+<dc:language>fre</dc:language>
+<dc:rights xml:lang="fre">sous droits</dc:rights>
+<dc:rights xml:lang="eng">right protected</dc:rights>
+<dc:format>application/PDF</dc:format>
+<dc:relation>http://www.numilog.com/bibliotheque/agglo-sqy/fiche_livre.asp?idprod=67312</dc:relation>
+</oai_dc:dc>
+</metadata>
+</record>
+
 <record>
 <header>
 <identifier>oai:numilog.com:9782234074385</identifier>
diff --git a/tests/library/Class/WebService/NumilogTest.php b/tests/library/Class/WebService/NumilogTest.php
index 54e6cf531f4..73a6f5c5061 100644
--- a/tests/library/Class/WebService/NumilogTest.php
+++ b/tests/library/Class/WebService/NumilogTest.php
@@ -43,9 +43,26 @@ class NumilogTest extends Storm_Test_ModelTestCase{
 		Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Album')
 		  ->whenCalled('save')
 			->answers(true)
+		  ->whenCalled('delete')
+			->answers(true)
 		  ->whenCalled('findFirstBy')
 			->answers(null);
 
+		Storm_Test_ObjectWrapper::onLoaderOfModel('Class_CodifMatiere')
+		  ->whenCalled('save')
+			->answers(true)
+		  ->whenCalled('findFirstBy')
+			->with(['libelle'=>'Management'])
+			->answers(Class_CodifMatiere::newInstanceWithId('132'))
+		  ->whenCalled('findFirstBy')
+			->with(['libelle'=>'Métiers et Formations'])
+			->answers(Class_CodifMatiere::newInstanceWithId('133'))
+		  ->whenCalled('findFirstBy')
+			->with(['libelle'=>'Psychologie'])
+			->answers(Class_CodifMatiere::newInstanceWithId('134'));
+
+
+
 		$this->_numilog = new Class_WebService_BibNumerique_Numilog();
 		
 		Class_WebService_BibNumerique_Numilog::setDefaultHttpClient($this->_http_client);
@@ -55,6 +72,8 @@ class NumilogTest extends Storm_Test_ModelTestCase{
 		xdebug_break();
 		$this->_first_album = $this->_numilog->getAlbums()[0];
 		$this->_second_album = $this->_numilog->getAlbums()[1];
+		$this->_third_album = $this->_numilog->getAlbums()[2];
+
 	}
 
 
@@ -68,8 +87,8 @@ class NumilogTest extends Storm_Test_ModelTestCase{
 
 
 	/** @test */
-	public function numberfLivresShouldBe70OnFirstPage() {
-		$this->assertEquals(70, count($this->_numilog->loadPage(1)->getRessourcesNumeriques()));
+	public function numberfLivresShouldBe71OnFirstPage() {
+		$this->assertEquals(71, count($this->_numilog->loadPage(1)->getRessourcesNumeriques()));
 	}
 
 
@@ -97,6 +116,43 @@ class NumilogTest extends Storm_Test_ModelTestCase{
 	}
 	
 
+
+	/** @test */
+	public function thirdAlbumDescriptionShouldBeSet()  {
+	$this->assertEquals("<h4>Stressé, harcelé, \"burnouté\"&nbsp;? 
+<br />26 questionnaires pour faire le point</h4>
+
+<p><strong>Trois salariés français sur quatre se disent stressés. Il est aujourd'hui reconnu que le travail est une source de stress. Mais que désigne le stress exactement&nbsp;? Pourquoi survient-il&nbsp;? Quand devient-il nocif&nbsp;?</strong></p>
+
+<p>Ce guide dresse un état des lieux du stress au travail&nbsp;: ce qu'il est, ce qu'il n'est pas, ses manifestations, son coût pour l'entreprise, l'individu et la société... Il propose au lecteur un ensemble de questionnaires pour identifier son profil de stressé et l'invite notamment à distinguer le stress professionnel géré sainement de celui qui conduit au <em>burnout</em> ou au harcèlement moral.</p>
+
+<p>À l'entreprise, il suggère des pistes d'action pour mettre en place des modes d'organisation favorables à la santé physique et mentale des salariés. Au salarié stressé, il prescrit diverses techniques individuelles pour modérer son stress&nbsp;: la relaxation, l'exposition, la restructuration cognitive, etc.</p>",$this->_third_album->getDescription());
+
+	}
+
+
+  /** @test */
+	public function thirdAlbumShouldBeValid() {
+		$this->assertTrue($this->_third_album->isValid(),implode(',',$this->_third_album->getErrors()));
+
+	}
+
+
+
+
+  /** @test */
+	public function thirdAlbumShouldHaveMatierePsychologie() {
+		$this->assertEquals('134;133;132',$this->_third_album->getMatiere());
+
+	}
+
+	/** @test */
+	public function thirdAlbumShouldBeSaved() {
+
+		$this->assertTrue(Class_Album::methodHasBeenCalledWithParams('save',[$this->_third_album]));
+	}
+
+
 	/** @test */
 	public function firstAlbumIdLangueShouldBeFre() {
 		$this->assertEquals('fre',$this->_first_album->getIdLangue());
-- 
GitLab