From b84ed2d03be8a857e4717896550f546e99a42ba8 Mon Sep 17 00:00:00 2001
From: Laurent Laffont <llaffont@afi-sa.fr>
Date: Mon, 7 May 2018 15:22:14 +0200
Subject: [PATCH] dev #74958 record integration: record id for items can now be
 other than 001. Add screen configuration in data profile

---
 .../controllers/DataProfileControllerTest.php | 35 +++++++++++++++++++
 .../php/classes/classe_notice_marc21.php      |  1 +
 .../tests/php/classes/marc21_952_items.txt    |  1 +
 library/Class/IntProfilDonnees.php            | 16 +++++++++
 library/Class/ProfilePrefs.php                | 25 +++++++++++++
 .../Class/ProfileSerializer/UnimarcRecord.php | 12 ++++++-
 library/ZendAfi/Form/Cosmo/DataProfile.php    | 19 ++++++++--
 7 files changed, 106 insertions(+), 3 deletions(-)
 create mode 100644 cosmogramme/tests/php/classes/marc21_952_items.txt

diff --git a/cosmogramme/cosmozend/tests/application/modules/cosmo/controllers/DataProfileControllerTest.php b/cosmogramme/cosmozend/tests/application/modules/cosmo/controllers/DataProfileControllerTest.php
index 814143a8fd7..fca511096d4 100644
--- a/cosmogramme/cosmozend/tests/application/modules/cosmo/controllers/DataProfileControllerTest.php
+++ b/cosmogramme/cosmozend/tests/application/modules/cosmo/controllers/DataProfileControllerTest.php
@@ -28,6 +28,8 @@ abstract class Cosmo_DataProfileControllerTestCase extends CosmoControllerTestCa
 
     Class_IntProfilDonnees::forKoha()
       ->setId(56)
+      ->setItemField(Class_IntProfilDonnees::FIELD_ITEM_ID_ORIGINE, ['zone' => '999',
+                                                                     'champ' => 'c'])
       ->save();
 
     Class_IntProfilDonnees::forNanook()
@@ -342,6 +344,18 @@ class Cosmo_DataProfileControllerEditUnimarcKohaTest extends Cosmo_DataProfileCo
   }
 
 
+  /** @test */
+  public function multiInputItemIdOrigineShouldBePresent() {
+    $this->assertXPath('//form//div[@id="multi_inputs_item_id_origine"]');
+  }
+
+
+  /** @test */
+  public function scriptShouldSetMutiInputsItemIdOrigineTo999dollarC() {
+    $this->assertXPathContentContains('//script', 'values:{"id_origine_zone":["999"],"id_origine_champ":["c"]}');
+  }
+
+
   /** @test */
   public function multiInputInteretZoneShouldBePresent() {
     $this->assertXPath('//form//div[@id="multi_inputs_interests"]');
@@ -399,6 +413,7 @@ class Cosmo_DataProfileControllerPostEditUnimarcKohaFileFormatTest extends Cosmo
              'format' => Class_IntProfilDonnees::FORMAT_UNIMARC,
              'xml_balise_abonne' => 'subscribers',
              'xml_abonne_IDABON' => 'id',
+             'item_zone'=> '996',
              'champ_code_barres'=> 'f',
              'champ_cote' => 'k',
              'champ_type_doc' => 'x',
@@ -409,6 +424,8 @@ class Cosmo_DataProfileControllerPostEditUnimarcKohaFileFormatTest extends Cosmo
              'champ_availability' => 't',
              'url_zone' => [0 => '932'],
              'url_champ' => [0 => 'n'],
+             'id_origine_zone' => [0 => '999'],
+             'id_origine_champ' => [0 => 'c'],
              'rejet_periodiques' => 1,
              'id_article_periodique' => 1,
              'nouveaute_format' => 4,
@@ -449,6 +466,12 @@ class Cosmo_DataProfileControllerPostEditUnimarcKohaFileFormatTest extends Cosmo
   }
 
 
+  /** @test */
+  public function itemZoneShouldBe996() {
+    $this->assertEquals('996', $this->_koha->getItemZone());
+  }
+
+
   /** @test */
   public function champsCodeBarresShouldBeF() {
     $this->assertEquals('f', $this->_koha->getBarCode());
@@ -473,6 +496,18 @@ class Cosmo_DataProfileControllerPostEditUnimarcKohaFileFormatTest extends Cosmo
   }
 
 
+  /** @test */
+  public function idOrigineZoneShouldBe999() {
+    $this->assertEquals('999', $this->_koha->getIdOrigineZone());
+  }
+
+
+  /** @test */
+  public function idOrigineFieldShouldBeC() {
+    $this->assertEquals('c', $this->_koha->getIdOrigineField());
+  }
+
+
   /** @test */
   public function serialsRejectShouldBeOne() {
     $this->assertEquals(1, $this->_koha->getRejetPeriodiques());
diff --git a/cosmogramme/php/classes/classe_notice_marc21.php b/cosmogramme/php/classes/classe_notice_marc21.php
index 609e459cf8a..4d6bc1fc62e 100644
--- a/cosmogramme/php/classes/classe_notice_marc21.php
+++ b/cosmogramme/php/classes/classe_notice_marc21.php
@@ -88,6 +88,7 @@ class notice_marc21 extends notice_unimarc {
     $this->map["801"]["a"]="b";
     $this->map["995"]="*";
     $this->map["952"]="*";
+    $this->map["999"]="*";
     parent::__construct();
   }
 
diff --git a/cosmogramme/tests/php/classes/marc21_952_items.txt b/cosmogramme/tests/php/classes/marc21_952_items.txt
new file mode 100644
index 00000000000..2c7a9777bf3
--- /dev/null
+++ b/cosmogramme/tests/php/classes/marc21_952_items.txt
@@ -0,0 +1 @@
+03168nas a2200541 a 4500001000700000003000400007005001700011008004100028010000600069020001500075040001300090043001200103100000700115245019700122260009500319300002100414300003300435490001200468504005300480600006500533610005500598651007300653700002500726700002700751773011400778830004100892856010200933856010301035942001501138955006101153999001301214952017101227952007501398952007501473952007501548952007501623952007501698952007501773952007501848952007501923952007601998952007602074952007602150952007602226952009302302952008402395952014702479681614Ost20180430102806.0950727s1993    sp       bc  s001 0 spa    a   a8477533865  aDLCcDLC  ae-sp---  axx00aArchivo de Joaquín Costabinventario de los documentos conservados en el Archivo Histórico Provincial de Huescacautores, María Rivas Palá (dirección), Jesús Paraíso Gros, ... [et al.].  a[Zaragoza] :bDiputación General de Aragón, Departamento de Cultura y Educación,c1993.  a199 p. ;c24 cm.  a106 p.bil. col. y n.c32 cm1 aUNEDv5  aIncludes bibliographical references and indexes. 4aCosta y Martínez, Joaquín,d1846-1911xArchivesxCatalogs.20aArchivo Histórico Provincial de HuescaxCatalogs, 0aHuesca (Spain : Province)xHistoryxSourcesxBibliographyxCatalogs.1 aRivas Palá, María.1 aParaíso Gros, Jesús.  aAgua, medio ambiente y desarrollo en el siglo XXI : México desde una perspectiva global y regionalw14052955 0aColección Archivos de Aragón ;v5.  uhttp://demo-kobli.bage.es:8080/intranet-tmpl/prog/local_repository/documents/1.pngyVer documento  uhttp://demo-kobli.bage.es:8080/intranet-tmpl/prog/local_repository/documents/1.pngyVer Documento2  2udccBKs1  axh01 to hlcd 7-27-95; lk19 04-29-96; lk03 to sl 04-30-96  c567d567  00102udc407091aorexborexcSTAFFd2011-05-20l3p121215r2015-04-07s2015-04-07t1v54.00w2011-05-20yBKzEl libro se encuentra perdido desde hace años. Prueba  00102lcc407092aorexborexd2011-05-24r2011-05-24w2011-05-24yBK  00102udc407093aorexborexd2012-02-29r2012-02-29w2012-02-29yBK  00102udc407094aorexborexd2012-02-29r2012-02-29w2012-02-29yBK  00102udc407095aorexborexd2012-02-29r2012-02-29w2012-02-29yBK  00102udc407096aorexborexd2012-02-29r2012-02-29w2012-02-29yBK  00102udc407097aorexborexd2012-02-29r2012-02-29w2012-02-29yBK  00102udc407098aorexborexd2012-02-29r2012-02-29w2012-02-29yBK  00102udc407099aorexborexd2012-02-29r2012-02-29w2012-02-29yBK  00102udc4070910aorexborexd2012-02-29r2012-02-29w2012-02-29yBK  00102udc4070911aorexborexd2012-02-29r2012-02-29w2012-02-29yBK  00102udc4070912aorexborexd2012-02-29r2012-02-29w2012-02-29yBK  00102udc4070913aorexborexd2012-02-29r2012-02-29w2012-02-29yBK  00102udc40686070914aorexborexcCHILDd2012-04-10o860r2012-04-10w2012-04-10yBK  00102udc4070915aorexborexd2013-02-11r2013-02-11w2013-02-11yBKzPrueba  00102lcc406SG03801453384791 A S811 M70916aOrexbOrexcCHILDd2013-02-20oSG 380.1453384791 As811mp2013-9999r2013-02-20w2013-02-20yBK
\ No newline at end of file
diff --git a/library/Class/IntProfilDonnees.php b/library/Class/IntProfilDonnees.php
index 017aabdf9c1..f9d76381eb6 100644
--- a/library/Class/IntProfilDonnees.php
+++ b/library/Class/IntProfilDonnees.php
@@ -274,6 +274,7 @@ class Class_IntProfilDonnees extends Storm_Model_Abstract {
     FIELD_ITEM_ANNEXE = 'champ_annexe',
     FIELD_ITEM_AVAILABILITY = 'champ_availability',
     FIELD_ITEM_URL = 'champ_url',
+    FIELD_ITEM_ID_ORIGINE = 'champ_id_origine',
     PROFILE_FIELDS = 'champs',
     PROFILE_DOC_TYPES = 'type_doc',
     PROFILE_NOVELTY = 'jours',
@@ -917,6 +918,11 @@ class Class_IntProfilDonnees extends Storm_Model_Abstract {
   }
 
 
+  public function getItemZone() {
+    return $this->getProfilePrefs()->getItemZone();
+  }
+
+
   public function getAvailability() {
     return $this->getProfilePrefs()->getItemAvailability();
   }
@@ -932,6 +938,16 @@ class Class_IntProfilDonnees extends Storm_Model_Abstract {
   }
 
 
+  public function getIdOrigineZone() {
+    return $this->getProfilePrefs()->getItemIdOrigine()['id_origine_zone'][0];
+  }
+
+
+  public function getIdOrigineField() {
+    return $this->getProfilePrefs()->getItemIdOrigine()['id_origine_champ'][0];
+  }
+
+
   public function getNoveltyFormat() {
     return $this->getProfilePrefs()->getItemNoveltyFormat();
   }
diff --git a/library/Class/ProfilePrefs.php b/library/Class/ProfilePrefs.php
index 7408619c4bf..0d788f0c539 100644
--- a/library/Class/ProfilePrefs.php
+++ b/library/Class/ProfilePrefs.php
@@ -151,6 +151,31 @@ class Class_ProfilePrefs extends Class_Entity {
   }
 
 
+  public function getItemIdOrigine() {
+    $id_origine_zone = $this->getItemIdOrigineZone();
+    $id_origine_champ = $this->getItemIdOrigineChamp();
+
+    return ['id_origine_zone' => [$id_origine_zone],
+            'id_origine_champ' => [$id_origine_champ]];
+  }
+
+
+  public function getItemIdOrigineZone() {
+    return $this->getItemIdOriginePrefs()['zone'];
+  }
+
+
+  public function getItemIdOrigineChamp() {
+    return $this->getItemIdOriginePrefs()['champ'];
+  }
+
+
+  public function getItemIdOriginePrefs() {
+    return $this->getItemPrefs()[Class_IntProfilDonnees::FIELD_ITEM_ID_ORIGINE];
+  }
+
+
+
   public function getItemNoveltyFormat() {
     return $this->getItemNoveltyPrefs()[Class_IntProfilDonnees::NOVELTY_FORMAT];
   }
diff --git a/library/Class/ProfileSerializer/UnimarcRecord.php b/library/Class/ProfileSerializer/UnimarcRecord.php
index 0d2d3b55ab7..1bf6d6a7db8 100644
--- a/library/Class/ProfileSerializer/UnimarcRecord.php
+++ b/library/Class/ProfileSerializer/UnimarcRecord.php
@@ -53,6 +53,7 @@ class Class_ProfileSerializer_UnimarcRecord extends Class_ProfileSerializer_Abst
       ->populateItemNoveltyDays()
       ->populateItemNoveltyValeurs()
       ->populateItemDocTypes(['label' => 'label', 'zone' => 'zone_995'])
+      ->populateItemIdOrigine()
       ->populateItemUrl()
       ->populateInterests();
   }
@@ -65,7 +66,10 @@ class Class_ProfileSerializer_UnimarcRecord extends Class_ProfileSerializer_Abst
 
 
   protected function _extractRecords() {
-    return array_merge($this->_extractDocTypes(), $this->_extractItemFields(), $this->_extractItemUrl());
+    return array_merge($this->_extractDocTypes(),
+                       $this->_extractItemFields(),
+                       $this->_extractItemIdOrigine(),
+                       $this->_extractItemUrl());
   }
 
 
@@ -110,6 +114,12 @@ class Class_ProfileSerializer_UnimarcRecord extends Class_ProfileSerializer_Abst
   }
 
 
+  protected function _extractItemIdOrigine() {
+    return [Class_IntProfilDonnees::FIELD_ITEM_ID_ORIGINE => ['zone' => $this->_datas['id_origine_zone'][0],
+                                                              'champ' => $this->_datas['id_origine_champ'][0]]];
+  }
+
+
   protected function _extractItemFields() {
     return array_intersect_key($this->_datas, Class_IntProfilDonnees::getItemFields());
   }
diff --git a/library/ZendAfi/Form/Cosmo/DataProfile.php b/library/ZendAfi/Form/Cosmo/DataProfile.php
index 1723b195ed3..7984958e224 100644
--- a/library/ZendAfi/Form/Cosmo/DataProfile.php
+++ b/library/ZendAfi/Form/Cosmo/DataProfile.php
@@ -222,7 +222,9 @@ class ZendAfi_Form_Cosmo_DataProfile extends ZendAfi_Form {
     return $this
       ->addElement('text',
                    'item_zone',
-                   ['label' => $this->_('Zone des exemplaires')])
+                   ['label' => $this->_('Zone des exemplaires'),
+                    'validators' => ['int']])
+
       ->addElement('select',
                    'champ_code_barres',
                    ['label' => $this->_('Prendre le champ code-barres en'),
@@ -240,13 +242,20 @@ class ZendAfi_Form_Cosmo_DataProfile extends ZendAfi_Form {
                                  ['name' => 'url_champ', 'label' => $this->_('champ')]],
                     'fixed' => true])
 
+      ->addElement('multiInput',
+                   'item_id_origine',
+                   ['label' => $this->_('Prendre l\'identifiant pour les webservices en (si différent de la zone 001)'),
+                    'fields' => [['name' => 'id_origine_zone', 'label' => $this->_('Zone')],
+                                 ['name' => 'id_origine_champ', 'label' => $this->_('champ')]],
+                    'fixed' => true])
+
       ->_addElementsWithAllFields($elements_with_all_fields)
 
       ->addDisplayGroup(array_merge(['item_zone',
                                      'champ_code_barres',
                                      'champ_cote'],
                                     array_keys($elements_with_all_fields),
-                                    ['item_url']),
+                                    ['item_url', 'item_id_origine']),
                         'item_group',
                         ['legend' => $this->_('Champs exemplaires')]);
   }
@@ -444,6 +453,12 @@ class ZendAfi_Form_Cosmo_DataProfile extends ZendAfi_Form {
   }
 
 
+  public function populateItemIdOrigine() {
+    $this->item_id_origine->setValues($this->_profile_prefs->getItemIdOrigine());
+    return $this;
+  }
+
+
   public function populateInterests() {
     $this->interests->setValues($this->_profile_prefs->getInterests());
     return $this;
-- 
GitLab