Commit 0e77417d authored by Laurent's avatar Laurent

Merge branch 'hotline#82630_minsoc_probleme_d_import_de_notices_et_exemplaires' into 'hotline'

hotline #82630 add record deduplication on 010 per integration site

See merge request !3182
parents a80ce5c3 d9f4058b
Pipeline #7916 passed with stage
in 37 minutes and 49 seconds
- ticket #82630 : Ajout du dédoublonnage des notices sur le champ 001 par site.
\ No newline at end of file
......@@ -23,7 +23,8 @@
require_once('NoticeIntegrationTest.php');
abstract class KohaRecordIntegrationTestCase extends NoticeIntegrationTestCase {
protected $_storm_default_to_volatile = true;
protected $_sigb = Class_IntBib::COM_KOHA;
public function getProfilDonnees() {
return Class_IntProfilDonnees::forKoha()->getRawAttributes();
......@@ -32,6 +33,7 @@ abstract class KohaRecordIntegrationTestCase extends NoticeIntegrationTestCase {
class KohaRecordIntegrationBadUnimarcTest extends KohaRecordIntegrationTestCase {
public function setUp() {
parent::setUp();
......@@ -174,7 +176,7 @@ class KohaRecordIntegrationFacetPresseTest extends KohaRecordIntegrationTestCase
]);
Class_CosmoVar::setValueOf('mode_doublon', '1');
Class_CosmoVar::setValueOf('mode_doublon', Class_CosmoVar::DOUBLE_SEARCH_ALPHA_KEY);
$this->loadNotice('unimarc_koha_okapi');
}
......@@ -216,7 +218,7 @@ class KohaRecordIntegrationFacetPresseTest extends KohaRecordIntegrationTestCase
/** @test */
public function facettesShouldContainsT2AndHANNE0001AndHMOIS0001AndJOUR0001() {
$this->assertEquals('HANNE0001 HMOIS0001 HJOUR0001 T2 B1 YMEDSTMAR',
$this->assertEquals('HANNE0001 HMOIS0001 HJOUR0001 Lfre T2 B1 YMEDSTMAR',
Class_Notice::find(1)
->updateFacetsFromExemplaires()
->getFacettes());
......@@ -225,7 +227,7 @@ class KohaRecordIntegrationFacetPresseTest extends KohaRecordIntegrationTestCase
/** @test */
public function facettesForRecord25ShouldContainsT2AndHANNE0001AndHMOIS0001() {
$this->assertEquals('HANNE0001 HMOIS0007 HJOUR0006 T2 B1 YMEDSTMAR',
$this->assertEquals('HANNE0001 HMOIS0007 HJOUR0006 Lfre T2 B1 YMEDSTMAR',
Class_Notice::find(25)
->updateFacetsFromExemplaires()
->getFacettes());
......@@ -556,3 +558,56 @@ class KohaRecordIntegrationBdMilleniumWithAuthorityTest extends KohaRecordIntegr
]));
}
}
class KohaRecordIntegrationDeduplicateTest extends KohaRecordIntegrationTestCase {
public function setUp() {
parent::setUp();
Class_CosmoVar::setValueOf('mode_doublon', Class_CosmoVar::DOUBLE_SEARCH_NONE);
$this->loadRecordsFromFile('unimarc_mementos');
$this->fixture('Class_IntBib',
['id' => 2,
'nom' => 'My other library',
'nom_court' => 'MOL',
'mail' => '',
'qualite' => 10,
'dernier_ajout' => '2015-01-01',
'ecart_ajouts' => '0',
'date_mail' => '',
'sigb' => $this->_sigb,
'planif_mode' => 'r',
'comm_sigb' => 0,
'comm_params' => 'N']);
$this->loadRecordsFromFile('unimarc_mementos', 2);
$this->loadRecordsFromFile('unimarc_mementos');
}
/** @test */
public function numberOfRecordsShouldBeSix() {
$this->assertEquals(6, Class_Notice::countBy([]));
}
/** @test */
public function firstIntBibShouldHaveFourItems() {
$this->assertEquals(4, Class_Exemplaire::countBy(['id_int_bib' => 1]));
}
/** @test */
public function secondIntBibShouldHaveTwoItems() {
$this->assertEquals(4, Class_Exemplaire::countBy(['id_int_bib' => 2]));
}
/** @test */
public function recordOnFirstIntBibWithId397126ShouldHaveTwoItems() {
$this->assertEquals(2, Class_Exemplaire::countBy(['id_int_bib' => 2,
'id_origine' => 397126]));
}
}
\ No newline at end of file
......@@ -39,7 +39,7 @@ abstract class TestFixtures {
abstract class ModelTestCase extends PHPUnit_Framework_TestCase {
use Storm_Test_THelpers;
protected $_storm_default_to_volatile = false;
protected $_storm_default_to_volatile = true;
protected function _buildTableMock($model, $methods) {
$table = $this->getMock('Storm_Model_Table'.$model,$methods);
......
......@@ -28,7 +28,8 @@ abstract class NoticeIntegrationTestCase extends ModelTestCase {
protected
$notice_sgbd,
$_mock_sql,
$_insert_increment;
$_insert_increment,
$_sigb = Class_IntBib::COM_PERGAME;
public function getProfilDonnees() {
......@@ -95,19 +96,14 @@ abstract class NoticeIntegrationTestCase extends ModelTestCase {
'unicite_code_barres' => Class_CosmoVar::UNIQ_BARCODE_ONLY,
'champs_sup' => '',
'ean_345' => ''])
->setListeCache(['nature_docs'=> "1:Collection\r\n2:Dataset\r\n3:Event\r\n4:Image",
'types_docs' => "0:non identifié\r\n1:livres\r\n2:périodiques\r\n3:disques\r\n4:DVD\r\n5:cédéroms\r\n8:articles cms\r\n9:fils rss\r\n10:sites internet\r\n100:Livre Numérique\r\n101:Diaporamas\r\n102:Type doc\r\n103:OAI\r\n104:Type doc\r\n105:Formation Vodéclic\r\n106:Livres Numériques\r\n107:Vidéos à la demande\r\n108:Tout apprendre\r\n109:Enregistrement audio\r\n110:Numérique Premium"]);
Class_Notice::beVolatile();
Class_Exemplaire::beVolatile();
Class_CodifCentreInteret::beVolatile();
Class_CodifAuteur::beVolatile();
Class_CodifMatiere::beVolatile();
Class_CodifGenre::beVolatile();
Class_CodifDewey::beVolatile();
Class_CodifPcdm4::beVolatile();
Class_Notice_SerialArticles::beVolatile();
Class_CosmoVar::beVolatile();
->setListeCache(['nature_docs'=> "1:Collection\r\n2:Dataset\r\n3:Event\r\n4:Image"]);
Codif_Langue::getInstance()
->setCodif(['fre' => ['id_langue' => 'fre',
'libelle' => 'français']]);
$this->fixture('Class_CodifLangue',
['id' => 'fre', 'libelle' => 'Français']);
$this->fixture('Class_IntBib',
['id' => 1,
......@@ -118,12 +114,12 @@ abstract class NoticeIntegrationTestCase extends ModelTestCase {
'dernier_ajout' => '2015-01-01',
'ecart_ajouts' => '0',
'date_mail' => '',
'sigb' => 1,
'sigb' => $this->_sigb,
'planif_mode' => 'r',
'comm_sigb' => 0,
'comm_params' => 'N']);
$this->notice_sgbd=new notice_unimarc();
$this->notice_sgbd = new notice_unimarc();
$this->setupProfilDonnees();
}
......@@ -133,9 +129,13 @@ abstract class NoticeIntegrationTestCase extends ModelTestCase {
}
public function loadNoticeFromString($unimarc) {
public function loadNoticeFromString($unimarc, $id_bib = 1) {
$this->notice_integration = new notice_integration();
$this->notice_integration->setParamsIntegration(1, 0, isset($this->_profil_donnees['id_profil']) ? $this->_profil_donnees['id_profil'] : 1);
$this->notice_integration->setParamsIntegration($id_bib,
0,
isset($this->_profil_donnees['id_profil'])
? $this->_profil_donnees['id_profil']
: 1);
$this->_service_runner = $this->mock()
->whenCalled('run')
......@@ -147,12 +147,14 @@ abstract class NoticeIntegrationTestCase extends ModelTestCase {
}
public function loadRecordsFromFile($filename) {
public function loadRecordsFromFile($filename, $id_bib = 1) {
$contents = file_get_contents(dirname(__FILE__) . "/" . $filename . '.txt');
array_map([$this, 'loadNoticeFromString'],
array_map(function($content) use ($id_bib)
{
return $this->loadNoticeFromString($content, $id_bib);
},
preg_split('/'.chr(30).chr(29).'/', $contents));
}
}
......@@ -160,6 +162,11 @@ abstract class NoticeIntegrationTestCase extends ModelTestCase {
class NoticeIntegrationLollipopGeneratedNoticeRecordTest extends NoticeIntegrationTestCase {
public function getProfilDonnees() {
return Class_IntProfilDonnees::forNanook()->getRawAttributes();
}
public function setUp() {
parent::setUp();
......
02549cam a2200493 4500001000700000010002000007090001100027099007000038100004100108101000800149102000700157200047900164205001800643210007900661212000900740215002300749225002600772609003300798609003300831609002800864609003300892609002700925609003900952609002200991609003301013610000901046610002601055610001501081610003201096610002001128610002501148610002101173610002601194610002601220611000901246710015301255711011301408711009901521801004801620003004701668461004101715995012301756995017601879397126 a2110879467bbr. a397126 tOUVRAGEyTRAVAILEMPLOIbBiblibre Biblibrec2004-06-16d2019-07-08 a19951204d1995 m h0frey50 ba0 afre aFR1 aMémento de contrôleh11Ciles risques chimiquesbOUVRAGEeréglementationsf[Ministère du travail, de l'emploi et de la formation professionnelle], Direction de l'administration générale et de la modernisation des services, Mission centrale d'appui et de coordination des SDTE ; Institut national du travail, de l'emploi et de la formation professionnelle ; Direction des relations du travail, Sous-direction des conditions de travail, hygiène en milieu de travail CT4 a2e éd., 1995 aPariscDirection des relation du travaild1995e07-AubenasgImpr. Lienhart a1995 a183 p.d21 x 30 cm aMémento de contrôle 938318aInspection du travail 939796aContrôle de l'emploi 937715aProduit chimique 9208621aSubstance dangereuse 937355aRéglementation 939470aProduit phytopharmaceutique 941890aEtiquetage 942250aInstallation classée a1995 aInstallation classée aEtiquetage aProduit phytopharmaceutique aRéglementation aSubstance dangereuse aProduit chimique aContrôle de l'emploi aInspection du travail a1995 312498113aFrancebMission centrale d'appui et de coordination des services déconcentrés du travail, de l'emploi et de la formation professionnelle 311863926aFrancebSous-direction des conditions de travail et de la protection contre les risques du travail 312006950aInstitut national du travail, de l'emploi et de la formation professionnellecFrance 0aFRbFR-751131015c19951204gAFNOR2intermrchttp://catalogue.bnf.fr/ark:/12148/cb35782347w 0034333559tMémento de contrôle.v11 10203052018-07-029351579bINTEFPcINTEFPeINTEFPfINTEFP351579i2018-07-02k0124-03o0rOUVRAGEs012403y2018-07-02 0010203052019-07-089371539bTRAVARAcTRAVARAeTRAVARASfTRAVARA19079136hENSALLEi2019-07-08kDARA VII 12o0qFACTUELrOUVRAGEsDARA_VII_12_000000000000000y2019-07-0802426cam a2200481 4500001000700000010002000007090001100027099008600038100004100124101000800165102000700173200047600180205001800656210007900674212000900753215002300762225002600785609003300811609003300844609002800877609003300905609002700938609003900965609002201004609003301026610000901059610002601068610001501094610003201109610002001141610002501161610002101186610002601207610002601233611000901259710015301268711011301421711009901534801005001633003004701683461004101730995017301771439408 a2110879467bbr. a439408 tOUVRAGEyTRAVAILEMPLOIbBiblibre BiblibreaAngelique BACHc2019-07-08d2019-07-08 a19951204d1988 m||h0frey50 ba0 afre aFR1 aMémento de contrôleh11Ailes risques chimiquesbOUVRAGEeMéthodologief[Ministère du travail, de l'emploi et de la formation professionnelle], Direction de l'administration générale et de la modernisation des services, Mission centrale d'appui et de coordination des SDTE ; Institut national du travail, de l'emploi et de la formation professionnelle ; Direction des relations du travail, Sous-direction des conditions de travail, hygiène en milieu de travail CT4 a2e éd., 1995 aPariscDirection des relation du travaild1988e07-AubenasgImpr. Lienhart a1988 a183 p.d21 x 30 cm aMémento de contrôle 938318aInspection du travail 939796aContrôle de l'emploi 937715aProduit chimique 9208621aSubstance dangereuse 937355aRéglementation 939470aProduit phytopharmaceutique 941890aEtiquetage 942250aInstallation classée a1988 aInstallation classée aEtiquetage aProduit phytopharmaceutique aRéglementation aSubstance dangereuse aProduit chimique aContrôle de l'emploi aInspection du travail a1988 312498113aFrancebMission centrale d'appui et de coordination des services déconcentrés du travail, de l'emploi et de la formation professionnelle 311863926aFrancebSous-direction des conditions de travail et de la protection contre les risques du travail 312006950aInstitut national du travail, de l'emploi et de la formation professionnellecFrance 0aFRbFR-751131015c2019-07-08gAFNOR2intermrchttp://catalogue.bnf.fr/ark:/12148/cb35782347w 0034333559tMémento de contrôle.v11 10203052019-07-089371541bTRAVARAcTRAVARAeTRAVARASfTRAVARA19079137hENSALLEi2019-07-08kDARA VII 12o0qFACTUELrOUVRAGEsDARA_VII_12_000000000000000y2019-07-0802149cam a2200445 4500001000700000010002000007090001100027099008600038100004100124101000800165102000700173200032200180210005700502212000900559215002300568330014400591410003600735609003300771609003300804609002800837609003300865609002700898609003900925609002200964609003300986610000901019610002601028610001501054610003201069610002001101610002501121610002101146610002601167610002601193611000901219710015301228711009901381801005001480995017301530439409 a2110879467bbr. a439409 tOUVRAGEyTRAVAILEMPLOIbBiblibre BiblibreaAngelique BACHc2019-07-08d2019-07-09 a19951204d1988 m||h0frey50 ba0 afre aFR1 aMémento de contrôleh11Biles risques chimiquesbOUVRAGEeNotions de basef[Ministère du travail, de l'emploi et de la formation professionnelle], Direction des relations du travail, Mission centrale d'appui et de coordination des SETE ; Institut national du travail, de l'emploi et de la formation professionnelle aPariscDirection des relation du travaild1988e g  a1988 a183 p.d21 x 30 cm aCollection de documents pratiques de synthèse (par profession ou par thème) destinés aux agents de contrôle de l'Inspection du Travail. 950178tMémento de contrôlev  938318aInspection du travail 939796aContrôle de l'emploi 937715aProduit chimique 9208621aSubstance dangereuse 937355aRéglementation 939470aProduit phytopharmaceutique 941890aEtiquetage 942250aInstallation classée a1988 aInstallation classée aEtiquetage aProduit phytopharmaceutique aRéglementation aSubstance dangereuse aProduit chimique aContrôle de l'emploi aInspection du travail a1988 312498113aFrancebMission centrale d'appui et de coordination des services déconcentrés du travail, de l'emploi et de la formation professionnelle 312006950aInstitut national du travail, de l'emploi et de la formation professionnellecFrance 0aFRbFR-751131015c2019-07-09gAFNOR2intermrc 10203052019-07-089371542bTRAVARAcTRAVARAeTRAVARASfTRAVARA19079138hENSALLEi2019-07-08kDARA VII 12o0qFACTUELrOUVRAGEsDARA_VII_12_000000000000000y2019-07-08
\ No newline at end of file
......@@ -311,7 +311,9 @@ class Class_IntBib extends Storm_Model_Abstract {
public function isPergame() {
return in_array($this->getSigb(), [1, 13]);
return in_array($this->getSigb(),
[static::SIGB_PERGAME,
static::SIGB_NANOOK]);
}
......
......@@ -49,28 +49,30 @@ class Class_Notice_DoubleFinder {
protected function _buildStrategy() {
$strategy_name = $this->_strategyName();
return $this->_strategy = $this->_chooseStrategy();
}
protected function _chooseStrategy() {
$library_limit = ($this->_barcode_uniq_mode == Class_CosmoVar::UNIQ_BARCODE_WITHIN_LIBRARY)
? (int) $this->_library->getId()
: null;
$this->_strategy = new $strategy_name($library_limit);
}
protected function _strategyName() {
if ($this->_profil
&& ($this->_profil->isFormatDublinCore() || $this->_profil->isBibliondemand()))
return 'Class_Notice_DoubleFinder_BarcodeStrategy';
return new Class_Notice_DoubleFinder_BarcodeStrategy($library_limit);
if (($this->_double_mode == Class_CosmoVar::DOUBLE_SEARCH_NONE)
&& $this->_library->isPergame())
return 'Class_Notice_DoubleFinder_NoDedupStrategy';
return new Class_Notice_DoubleFinder_GlobalNoDedupStrategy($library_limit);
if ($this->_double_mode == Class_CosmoVar::DOUBLE_SEARCH_NONE)
return new Class_Notice_DoubleFinder_NoDedupStrategy($this->_library->getId());
if ($this->_double_mode == Class_CosmoVar::DOUBLE_SEARCH_ALPHA_KEY)
return 'Class_Notice_DoubleFinder_AlphaKeyStrategy';
return new Class_Notice_DoubleFinder_AlphaKeyStrategy($library_limit);
return 'Class_Notice_DoubleFinder_IdsStrategy';
return new Class_Notice_DoubleFinder_IdsStrategy($library_limit);
}
......@@ -203,7 +205,7 @@ class Class_Notice_DoubleFinder_BarcodeStrategy extends Class_Notice_DoubleFinde
class Class_Notice_DoubleFinder_NoDedupStrategy extends Class_Notice_DoubleFinder_Strategy {
class Class_Notice_DoubleFinder_GlobalNoDedupStrategy extends Class_Notice_DoubleFinder_Strategy {
public function find($data) {
$this->_id = null;
$this->_data = $data;
......@@ -250,7 +252,8 @@ class Class_Notice_DoubleFinder_NoDedupStrategy extends Class_Notice_DoubleFinde
if ($this->_data->gettype_doc() != $item->getTypeDoc())
return false;
if ($this->_data->getid_origine() != $item->getIdOrigine()) {
if (!empty($this->_data->getid_origine())
&& ($this->_data->getid_origine() != $item->getIdOrigine())) {
$item->delete();
return false;
}
......@@ -261,6 +264,7 @@ class Class_Notice_DoubleFinder_NoDedupStrategy extends Class_Notice_DoubleFinde
abstract class Class_Notice_DoubleFinder_KeysStrategy extends Class_Notice_DoubleFinder_Strategy {
public function find($data) {
$this->_id = null;
......@@ -327,4 +331,14 @@ class Class_Notice_DoubleFinder_AlphaKeyStrategy extends Class_Notice_DoubleFind
protected function _recordAttributes() {
return [ ['clef_alpha', $this->_data->getclef_alpha()] ];
}
}
class Class_Notice_DoubleFinder_NoDedupStrategy extends Class_Notice_DoubleFinder_GlobalNoDedupStrategy {
protected function _findByIdOrigine() {
return $this->_getRecordIdByItem(['id_origine' => $this->_data->getid_origine(),
'id_int_bib' => $this->_library_limit]);
}
}
\ No newline at end of file
......@@ -128,12 +128,13 @@ class Class_WebService_Lastfm extends Class_WebService_Abstract {
public function getMorceaux($titre, $auteur) {
$album=$this->getAlbum($titre,$auteur);
if(!$album) return false;
if (!$album = $this->getAlbum($titre,$auteur))
return false;
$data = $this->httpGet($album['url']);
$dom = new Zend_Dom_Query($data);
$elements = $dom->queryXpath('//td[@class="chartlist-name"]//span/a');
$elements = $dom->queryXpath('//td[@class="chartlist-name"]/a');
if (!$elements->count())
return ['nb_resultats' => 0];
......
......@@ -133,6 +133,7 @@ abstract class DoubleFinderWithRecordMatchingTestCase extends DoubleFinderTestCa
class DoubleFinderWithExistingItemTest extends DoubleFinderWithRecordMatchingTestCase {
protected $_data = ['type_doc' => Class_TypeDoc::LIVRE,
'statut_exemplaires' => ['nb_ex' => 1],
......@@ -230,6 +231,7 @@ class DoubleFinderWithExistingItemInAnotherLibraryTest extends DoubleFinderTestC
class DoubleFinderWithExistingItemAndNoDedupModeTest extends DoubleFinderWithRecordMatchingTestCase {
protected $_data = ['type_doc' => Class_TypeDoc::LIVRE,
'statut_exemplaires' => ['nb_ex' => 1],
......@@ -252,6 +254,7 @@ class DoubleFinderWithExistingItemAndNoDedupModeTest extends DoubleFinderWithRec
class DoubleFinderWithExistingIdOrigneNoDedupModeDefaultTest extends DoubleFinderTestCase {
protected $_data = ['type_doc' => Class_TypeDoc::LIVRE,
'id_origine' => '88903'];
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment