Skip to content
Snippets Groups Projects

Hotline #15762 corrupted unimarc record

Merged Patrick Barroca requested to merge hotline_#15762-corrupted-unimarc-record into hotline_6.52
Compare and
+ 212
109
Preferences
Compare changes
Files
@@ -18,9 +18,6 @@
* along with AFI-OPAC 2.0; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
/////////////////////////////////////////////////////////////////////////////////////
// NOTICE D'INTEGRATION
/////////////////////////////////////////////////////////////////////////////////////
require_once("classe_isbn.php");
require_once("classe_indexation.php");
@@ -28,8 +25,7 @@ require_once("classe_unimarc.php");
require_once("classe_codif_matiere.php");
require_once("classe_codif_langue.php");
class notice_integration
{
class notice_integration {
private $id_profil; // Id du profil de données initialisé
private $format; // Format de fichier 0=unimarc
private $id_article_periodique; // Mode d'indentification des articles de periodiques
@@ -51,24 +47,18 @@ class notice_integration
private $mode_doublon; // Mode de dédoublonnage (tous identifiants ou clef alpha prioritaire)
private $url_site; // Url d'origine du site opac
private $flag_koha=false; // flag pour réentrance des notices de periodiques koha
/** @category testing */
protected $_service_runner;
// ----------------------------------------------------------------
// Constructeur
// ----------------------------------------------------------------
function __construct()
{
// Classe d'indexation
public function __construct() {
$this->indexation=new indexation();
$this->filtrer_fulltext=getVariable("filtrer_fulltext");
$this->mode_doublon=getVariable("mode_doublon");
$this->notice_sgbd=new notice_unimarc();
}
// ----------------------------------------------------------------
// Init du format
// ----------------------------------------------------------------
function setParamsIntegration($id_bib,$type_operation,$id_profil,$type_doc_force="")
{
global $sql;
@@ -273,11 +263,8 @@ class notice_integration
return $this->notice;
}
// ----------------------------------------------------------------
// Traitement notice homogene
// ----------------------------------------------------------------
public function traiteHomogene($id_notice,$isbn,$ean,$id_commerciale,$no_request)
{
public function traiteHomogene($id_notice, $isbn, $ean, $id_commerciale, $no_request) {
global $sql;
// Appel du service
$args["isbn"]=$isbn;
@@ -463,16 +450,11 @@ class notice_integration
}
// ----------------------------------------------------------------
// Cherche dans la base fusionnée
// ----------------------------------------------------------------
private function chercheNotice()
{
private function chercheNotice() {
global $sql;
$id_bib = $this->id_bib;
if(!$this->mode_doublon)
{
if(!$this->mode_doublon) {
$isbn10=$this->notice["isbn10"];
$isbn13=$this->notice["isbn13"];
$ean=$this->notice["ean"];
@@ -573,6 +555,7 @@ class notice_integration
// Traitement des facettes
$this->traiteFacettes();
$notice = Class_Notice::newInstance($this->noticeToDBEnreg($this->notice));
$notice->save();
$this->statut=1;
@@ -580,8 +563,8 @@ class notice_integration
}
public function noticeToDBEnreg(&$notice) {
$enreg= [
public function noticeToDBEnreg() {
return [
"type_doc" => $this->notice["type_doc"],
"alpha_titre" => $this->notice["alpha_titre"],
"alpha_auteur" => $this->notice["alpha_auteur"],
@@ -612,102 +595,100 @@ class notice_integration
"cote" => $this->notice["cote"],
"unimarc" => $this->notice["unimarc"],
"date_maj" => dateDuJour(2) ];
return $enreg;
}
// ----------------------------------------------------------------
// MAJ notice (remplacement si homogeneisation)
// ----------------------------------------------------------------
private function updateNotice($id_notice,$qualite)
{
private function updateNotice($id_notice, $qualite) {
global $sql;
$notice_enreg=$sql->fetchEnreg("select qualite,unimarc,facettes from notices where id_notice=$id_notice");
$this->notice["qualite"]=$notice_enreg['qualite'];
$notice_enreg = $sql->fetchEnreg("select qualite,unimarc,facettes from notices where id_notice=$id_notice");
$this->notice["qualite"] = $notice_enreg['qualite'];
$unimarc=$notice_enreg['unimarc'];
$this->notice["facette"]=$notice_enreg['facettes'];
$this->notice["facette"] = $notice_enreg['facettes'];
// Test qualite
if($qualite >= $this->notice["qualite"])
{
$this->notice["qualite"]=$qualite;
$this->statut=5;
}
elseif($qualite < $this->notice["qualite"]) $this->statut=4;
else
{
$this->notice["qualite"]=$qualite;
$this->statut=3;
if ($qualite >= $this->notice["qualite"]) {
$this->notice["qualite"] = $qualite;
$this->statut = 5;
} else {
$this->statut=4;
}
// Si la notice n'a pas de titre on substitue par celle de la base en forcant a une qualite inferieure
if( !$this->notice["titre_princ"] ) $this->statut=4;
if( !$this->notice["titre_princ"])
$this->statut=4;
// Zones forcees
$this->notice_sgbd->ouvrirNotice($unimarc,0);
$champs_forces=$this->notice_sgbd->getChampsForces();
if($champs_forces and $champs_forces != $this->notice["champs_forces"])
{
// On sauvegarde les données propres à la bib
$id_origine=$this->notice["id_origine"];
$qualite=$this->notice["qualite"];
$statut_exemplaires = $this->notice["statut_exemplaires"];
$exemplaires = $this->notice["exemplaires"];
$warnings=$this->notice["warnings"];
// Merge champs forces
if($this->notice["champs_forces"])$new=array_merge_recursive($champs_forces,$this->notice["champs_forces"]);
else $new = $champs_forces;
// Si la notice de la base est de meilleure qualite on la prend
if($this->statut==5) $this->notice_sgbd->ouvrirNotice($this->notice["unimarc"],0);
// Fusion des champs forces
$champs_forces=array();
foreach($new as $zone => $valeurs)
{
$zone=substr($zone,1); // on retire le Z qui sert au array_merge_recursive
$this->notice_sgbd->delete_field($zone); // On supprime l'ancienne zone
// si champ matiere on dedoublonne directement
if(substr($zone,0,1)=="6")
{
$champs=array_unique($valeurs);
$champs_forces[$zone]=$champs;
}
// sinon on decoupe les elements on les dedoublonne et on les remet dans 1 seule zone
else
{
$champs=array();
foreach($valeurs as $valeur) $champs=array_merge($champs,$this->notice_sgbd->getValeursBloc($valeur));
$champs=array_unique($champs);
$champs_forces[$zone][]=$this->notice_sgbd->makeZoneByValeurs(substr($valeurs[0],0,2),"a",$champs);
}
}
// On remet les nouvelles zones
foreach($champs_forces as $zone => $valeurs)
{
foreach($valeurs as $valeur) $this->notice_sgbd->add_zone($zone,$valeur);
}
$this->notice["unimarc"]=$this->notice_sgbd->update();
// On reprend les titres et les matieres
$this->notice=$this->notice_sgbd->getNoticeIntegration();
$this->notice["statut_exemplaires"] = $statut_exemplaires;
$this->notice["exemplaires"] = $exemplaires;
$this->notice["warnings"] = $warnings;
$this->notice["qualite"]=$qualite;
$this->notice["id_origine"]=$id_origine;
$this->statut=3;
}
// Recup des facettes
// $this->notice["facettes"]=$sql->fetchOne("select facettes from notices where id_notice=$id_notice");
if($this->statut == 4) return $id_notice;
$this->notice_sgbd->ouvrirNotice($unimarc, 0);
$champs_forces = $this->notice_sgbd->getChampsForces();
$id_origine = $this->notice["id_origine"];
$qualite = $this->notice["qualite"];
$statut_exemplaires = $this->notice["statut_exemplaires"];
$exemplaires = $this->notice["exemplaires"];
$warnings = $this->notice["warnings"];
// Si la notice de la base est de meilleure qualite on la prend
if ($this->statut==5)
$this->notice_sgbd->ouvrirNotice($this->notice["unimarc"],0);
$this->updateForcedZones($champs_forces, $this->notice["champs_forces"]);
$this->notice = $this->notice_sgbd->getNoticeIntegration();
$this->notice["statut_exemplaires"] = $statut_exemplaires;
$this->notice["exemplaires"] = $exemplaires;
$this->notice["warnings"] = $warnings;
$this->notice["qualite"] = $qualite;
$this->notice["id_origine"] = $id_origine;
if($this->statut == 4)
return $id_notice;
$this->traiteFacettes();
// Qualité égale ou zones forcees : on update
$sql->update("update notices set @SET@ Where id_notice=$id_notice", $this->noticeToDBEnreg($data));
$sql->update("update notices set @SET@ Where id_notice=$id_notice",
$this->noticeToDBEnreg($data));
return $id_notice;
}
protected function updateForcedZones($existing, $current) {
if (!$existing || $existing == $current)
return;
$new = ($current) ?
array_merge_recursive($existing, $current) :
$existing;
// Fusion des champs forces
$champs_forces = [];
foreach ($new as $zone => $valeurs) {
$zone = substr($zone, 1); // on retire le Z qui sert au array_merge_recursive
$this->notice_sgbd->delete_field($zone); // On supprime l'ancienne zone
// si champ matiere on dedoublonne directement
if ('6' == substr($zone, 0, 1)) {
$champs = array_unique($valeurs);
$champs_forces[$zone] = $champs;
continue;
}
// sinon on decoupe les elements on les dedoublonne et on les remet dans 1 seule zone
$champs=array();
foreach($valeurs as $valeur)
$champs = array_merge($champs, $this->notice_sgbd->getValeursBloc($valeur));
$champs = array_unique($champs);
$champs_forces[$zone][] = $this->notice_sgbd->makeZoneByValeurs(substr($valeurs[0],0,2),"a",$champs);
}
// On remet les nouvelles zones
foreach($champs_forces as $zone => $valeurs)
foreach($valeurs as $valeur)
$this->notice_sgbd->add_zone($zone,$valeur);
$this->statut = 3;
}
// --------------------------------------------------------------------------------
// Suppression de notice (ne supprime pas l'enreg notice)
// --------------------------------------------------------------------------------