PageRenderTime 60ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 1ms

/class.xmodtif.inc

https://github.com/jcplat/console-seolan
PHP | 2176 lines | 1984 code | 79 blank | 113 comment | 402 complexity | eebb76002582b2a3971ed6957c3c1918 MD5 | raw file
Possible License(s): LGPL-2.0, LGPL-2.1, GPL-3.0, Apache-2.0, BSD-3-Clause

Large files files are truncated, but you can click here to view the full file

  1. <?php
  2. class XModTif extends XModTable{
  3. public $submodmax=20;
  4. public $oiddc; // oid de la ressource en cours
  5. public $NSURI; // NS principal des XML TiF
  6. public $prefixSQL; // Prefix SQL sur les tables du module (TiF1_, TiF2_ ...)
  7. public $alreadyexport=array();
  8. public $structparam=array(); // Paramètres sur la structure des granules => renseigner dans prepareParam
  9. public $idlist=array();
  10. public $acttype=''; // Indique le type d'import en cours (ACVS, GITD...)
  11. public $tzrns='';
  12. private $_cache=array(); // Cache du module
  13. public $TiFTables=array("CAPAGLOB","DMULTIMEDIA","DCONTACT","DADRESSE","DPERSONNE","DMOYENCOM","INFOLEG","DCLASSEMENT","DGEOLOC","ZONES",
  14. "DPOINT","DCOOR","DENV","DCARTE","DACCES","DPERIODE","DDATE","DJOURS","JOURS","HORAIRES","DCLIENTELES","DCLIENT",
  15. "USAGE","DMODERESA","CAPACAPA","CAPASUP","DCAPAPREST","DCAPAUNIT","DDISP","DOFFREPRESTA","DPRESTA","DTARIF",
  16. "DDESCRCOMP","DITI","DPLANNING","DPRESTAPLA","JOURPLA","PRESTLIEE");
  17. public $withCodeAttr=array('table' => array('DC'),
  18. 'target' => array('LS_Communes','LS_ZoneNoms','LS_Pays'));
  19. // Propriétés ACVS
  20. public $ACVSUrl='http://www.acvsnet.net/SI-ACVS/WebServices';
  21. public $ACVSFile='ACVSWebServices.asmx';
  22. public $ACVSFileWSDL='ACVSWebServices.asmx?WSDL';
  23. public $ACVSNSUri='http://www.acvsnet.net/tif3acvs/';
  24. public $ACVSEnvUris='xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"';
  25. public $ACVSLogin;
  26. public $ACVSPwd;
  27. public $ACVSFilter;
  28. // Propriétés GITD
  29. public $GITDUrl='http://extranet.hautes-alpes.net/publication?WSDL';
  30. public $GITDUrlDomain='http://webservice.hautes-alpes.net';
  31. public $GITDLogin;
  32. public $GITDPwd;
  33. public $GITDFilter;
  34. // Propriétés SITRA
  35. public $SITRANSUri='';
  36. public $SITRADirs='';
  37. public $SITRAExportFileRegex='/^\([0-9]+\)_ListeOI_([a-z]+)_([0-9]{8}_[0-9]{6})\.xml$/i';
  38. public $SITRADelFileRegex='/^\([0-9]+\)_DEL_ListeOI_([0-9]{8}_[0-9]{6})\.xml$/i';
  39. public $SITRAImagesFileRegex='/^\([0-9]+\)_ImagesOI_([0-9]{8}_[0-9]{6})\.zip$/i';
  40. public $SITRASelectionsFileRegex='/^\([0-9]+\)_Selections_([0-9]{8}_[0-9]{6})\.xml$/i';
  41. function __construct($ar=NULL){
  42. parent::__construct($ar);
  43. if(in_array('ACVS',$this->type)) $this->TiFTables[]="MODESPAIEMENT";
  44. }
  45. /// securite des fonctions accessibles par le web
  46. function secGroups($function, $group=NULL) {
  47. $g=array();
  48. $g['importNomenclature']=array('admin');
  49. $g['ACVSImport']=array('rwv','admin','none');
  50. $g['GITDImport']=array('rwv','admin','none');
  51. $g['GITDCheckService']=array('none');
  52. $g['SITRAImport']=array('rwv','admin','none');
  53. $g['exportTiF']=array('rwv','admin','none');
  54. if(isset($g[$function])) {
  55. if(!empty($group)) return in_array($group, $g[$function]);
  56. return $g[$function];
  57. }
  58. return parent::secGroups($function,$group);
  59. }
  60. public function initOptions() {
  61. parent::initOptions();
  62. $this->_options->setOpt('Prefix SQL des tables', 'prefixSQL', 'text');
  63. $this->_options->setOpt('Type de la structure', 'type', 'multiplelist', array('values' => array('','ACVS','GITD','SITRA'),
  64. 'labels' => array('---','ACVS','GITD','SITRA')));
  65. $this->_options->setOpt('ACVS : Login', 'ACVSLogin', 'text');
  66. $this->_options->setOpt('ACVS : Password', 'ACVSPwd', 'text');
  67. $this->_options->setOpt('ACVS : Filtre', 'ACVSFilter', 'text', array('rows' => 6,'cols' => 80));
  68. $this->_options->setOpt('GITD : Login', 'GITDLogin', 'text');
  69. $this->_options->setOpt('GITD : Password', 'GITDPwd', 'text');
  70. $this->_options->setOpt('GITD : Filtre', 'GITDFilter', 'text', array('rows' => 6,'cols' => 80));
  71. $this->_options->setOpt('SITRA : Répertoires', 'SITRADirs', 'text', array('rows' => 6,'cols' => 80));
  72. }
  73. protected function _actionlist(&$my) {
  74. parent::_actionlist($my);
  75. $myclass=get_class($this);
  76. $moid=$this->_moid;
  77. $o1=new XModuleAction($this,'deletewithtable',XLabels::getSysLabel('xmodtif','deletewithtable','text'),
  78. 'class='.$myclass.'&moid='.$moid.'&_function=delete&template=proc.html&withtable=1');
  79. $o1->needsconfirm=true;
  80. $my['deletewithtable']=$o1;
  81. }
  82. /// Suppression de tous les modules lié à TiF
  83. function delete($ar){
  84. global $XSHELL;
  85. $p=new XParam($ar,array('tplentry' => ''));
  86. $withtable=$p->get('withtable');
  87. if(!empty($withtable)){
  88. $tplentry=$p->get('tplentry');
  89. $message=parent::delete(array('tplentry' => TZR_RETURN_DATA));
  90. $rs=selectQuery('select MOID from MODULES where MPARAM like "%<field name=\"table\" type=\"%\"><value>'.
  91. '<![CDATA['.$this->prefixSQL.'%]]></value></field>%" order by MOID');
  92. while($rs && ($ors=$rs->fetch())){
  93. $mod=XModule::objectFactory($ors['MOID']);
  94. $message.=$mod->delete(array('tplentry'=>TZR_RETURN_DATA));
  95. }
  96. $rs=selectQuery('select BTAB from BASEBASE where BTAB LIKE "'.$this->prefixSQL.'LS_%"');
  97. while($rs && ($ors=$rs->fetch())){
  98. $xbase=XDataSource::objectFactoryHelper8('BCLASS=XDSTable&SPECS='.$ors['BTAB']);
  99. $ret=$xbase->procDeleteDataSource(array('tplentry' => TZR_RETURN_DATA));
  100. $message.=$ret['message'];
  101. }
  102. return XShell::toScreen2($tplentry,'message',$message);
  103. }else{
  104. return parent::delete($ar);
  105. }
  106. }
  107. /// Efface toutes les fiches liés à la ressource
  108. function del($ar) {
  109. $p=new XParam($ar,array());
  110. $oid=$p->get('_selected');
  111. $selectedok=$p->get('_selectedok');
  112. if(($selectedok!='ok') || empty($oid)) $oid=$p->get('oid');
  113. if(!is_array($oid)) $oid=array($oid => 1);
  114. if(!empty($oid)){
  115. $oid=array_keys($oid);
  116. $oid_list = '"'.implode('","',$oid).'"';
  117. foreach($this->TiFTables as $table) {
  118. updateQuery('delete from '.$this->prefixSQL.$table.' where tzr_dc in ('.$oid_list.')');
  119. }
  120. updateQuery('delete from '.$this->xset->getTable().' where KOID in ('.$oid_list.')');
  121. }
  122. }
  123. /// Prepare les paramètres des différents granules pour l'import/export
  124. function prepareParam(){
  125. if(empty($this->_cache['gparam-'.$this->acttype])){
  126. $gparam=array();
  127. //--- DC
  128. $gparam['dc']=array(
  129. 'DC' => array(
  130. 'balisegroup' => NULL,
  131. 'balises' => array(
  132. 'DublinCore' => array(
  133. 'table' => 'DC','delNS' => false,'oidfield' => 'dc:identifier',
  134. 'updfield' => 'dcterms:modified',
  135. 'ar' => array('tzr_type' => $this->acttype),
  136. 'notexport' => array('ModePaiement','ObservationModePaiement',
  137. 'ObservationModePaiement',
  138. 'CapacitesGlobales')))));
  139. //--- Multimedia
  140. $gparam['mu']=array('MU' => array('balisegroup' => 'Multimedia',
  141. 'balises' => array('DetailMultimedia' => array('table' => 'DMULTIMEDIA','fssm' => 'tzr_lie',
  142. 'notexport' => array('URL_url','URL_img')))));
  143. //--- Contact
  144. $param=array('MC' => array('balisegroup' => 'MoyensCommunications',
  145. 'balises' => array('DetailMoyenCom' => array('table' => 'DMOYENCOM','fssm' => 'tzr_lie'))));
  146. $param=array('PE' => array('balisegroup' => 'Personnes',
  147. 'balises' => array('DetailPersonne' => array('table' => 'DPERSONNE','fssm' => 'tzr_lie','ssm' => $param))));
  148. $param=array('AD' => array('balisegroup' => 'Adresses',
  149. 'balises' => array('DetailAdresse' => array('table' => 'DADRESSE','fssm' => 'tzr_lie','ssm' => $param))));
  150. $gparam['co']=array('CO' => array('balisegroup' => 'Contacts',
  151. 'balises' => array('DetailContact' => array('table' => 'DCONTACT','fssm' => 'tzr_lie','ssm' => $param))));
  152. $param=array('CT' => array('balisegroup' => 'Contact',
  153. 'balises' => array('DetailContact' => array('table' => 'DCONTACT','fssm' => 'tzr_lie','ssm' => $param))));
  154. $gparam['sg']=array('SG' => array('balisegroup' => NULL,
  155. 'balises' => array('StructureGestion' => array('table' => 'STRGESTION','fssm' => 'tzr_lie','ssm' => $param))));
  156. $gparam['si']=array('SI' => array('balisegroup' => NULL,
  157. 'balises' => array('StructureInformation' => array('table' => 'STRINFO','fssm' => 'tzr_lie','ssm' => $param))));
  158. //--- Informations légales
  159. $gparam['il']=array('IL' => array('balisegroup' => NULL,
  160. 'balises' => array('InformationsLegales' => array('table' => 'INFOLEG','fssm' => 'tzr_lie'))));
  161. //--- Classement
  162. $gparam['cl']=array('Classement' => array('balisegroup' => 'Classements',
  163. 'balises' => array('DetailClassement' => array('table' => 'DCLASSEMENT','fssm' => 'tzr_lie'))));
  164. //--- Geoloc
  165. $param=array('CO' => array('balisegroup' => 'Coordonnees',
  166. 'balises' => array('DetailCoordonnees' => array('table' => 'DCOOR','fssm' => 'tzr_lie'))),
  167. 'EN' => array('balisegroup' => 'Environnements',
  168. 'balises' => array('DetailEnvironnement' => array('table' => 'DENV','fssm' => 'tzr_lie'))),
  169. 'CA' => array('balisegroup' => 'Cartes',
  170. 'balises' => array('DetailCarte' => array('table' => 'DCARTE','fssm' => 'tzr_lie'))),
  171. 'AC' => array('balisegroup' => 'Acces',
  172. 'balises' => array('DetailAcces' => array('table' => 'DACCES','fssm' => 'tzr_lie'))),
  173. 'MU' => array('balisegroup' => 'Multimedia',
  174. 'balises' => array('DetailMultimedia' => array('table' => 'DMULTIMEDIA','fssm' => 'tzr_lie',
  175. 'ar' => array('tzr_ispoint' => 1)))));
  176. $param=array('PO' => array('balisegroup' => 'Points',
  177. 'balises' => array('DetailPoint' => array('table' => 'DPOINT','fssm' => 'tzr_lie','ssm' => $param))));
  178. $param=array('ZO' => array('balisegroup' => NULL,
  179. 'balises' => array('Zone' => array('table' => 'ZONES','fssm' => 'tzr_lie','ssm' => $param))));
  180. $gparam['ge']=array('GE' => array('balisegroup' => 'Geolocalisations',
  181. 'balises' => array('DetailGeolocalisation' => array('table' => 'DGEOLOC','fssm' => 'tzr_lie',
  182. 'ssm' => $param))));
  183. //--- Periode
  184. $param=array('HO' => array('balisegroup' => NULL,
  185. 'balises' => array('Horaires' => array('table' => 'HORAIRES','fssm' => 'tzr_lie'))));
  186. $param=array('JO' => array('balisegroup' => NULL,
  187. 'balises' => array('Jour' => array('table' => 'JOURS','fssm' => 'tzr_lie','ssm' => $param))));
  188. $param=array('DJ' => array('balisegroup' => 'Jours',
  189. 'balises' => array('DetailJours' => array('table' => 'DJOURS','fssm' => 'tzr_lie','ssm' => $param))));
  190. $param=array('DA' => array('balisegroup' => 'Dates',
  191. 'balises' => array('DetailDates' => array('table' => 'DDATE','fssm' => 'tzr_lie','ssm' => $param))));
  192. $gparam['pe']=array('PE' => array('balisegroup' => 'Periodes',
  193. 'balises' => array('DetailPeriode' => array('table' => 'DPERIODE','fssm' => 'tzr_lie','ssm' => $param))));
  194. //--- Clientele
  195. $param=array('DC' => array('balisegroup' => NULL,
  196. 'balises' => array('DetailClient' => array('table' => 'DCLIENT','fssm' => 'tzr_lie'))));
  197. $gparam['cli']=array('CL' => array('balisegroup' => 'Clienteles',
  198. 'balises' => array('DetailClienteles' => array('table' => 'DCLIENTELES','fssm' => 'tzr_lie',
  199. 'ssm' => $param))));
  200. //--- Langues
  201. $gparam['la']=array('LA' => array('balisegroup' => 'Langues',
  202. 'balises' => array('Usage' => array('table' => 'USAGE','fssm' => 'tzr_lie'),
  203. 'ListeLangues' => array('table' => 'LISTELANGUES','fssm' => 'tzr_lie'))));
  204. //--- Mode resa
  205. $gparam['mr']=array('MO' => array('balisegroup' => 'ModesReservations',
  206. 'balises' => array('DetailModeReservation' => array('table' => 'DMODERESA','fssm' => 'tzr_lie',
  207. 'ssm' => $gparam['co']))));
  208. //--- Capacité sup
  209. $gparam['cs']=array('CS' => array('balisegroup' => NULL,
  210. 'balises' => array('Capacite' => array('table' => 'CAPACAPA','fssm' => 'tzr_lie','direct' => true),
  211. 'Superficie' => array('table' => 'CAPASUP','fssm' => 'tzr_lie','direct' => true))));
  212. //--- Capacité presta
  213. $gparam['cp']=array('CP' => array('balisegroup' => 'CapacitesPrestations',
  214. 'balises' => array('DetailCapacitePrestation' => array('table' => 'DCAPAPREST','fssm' => 'tzr_lie',
  215. 'ssm' => $gparam['cs']))));
  216. //--- Capacité unité
  217. $param=array('DD' => array('balisegroup' => 'Dispositions',
  218. 'balises' => array('DetailDisposition' => array('table' => 'DDISP','fssm' => 'tzr_lie'))));
  219. $gparam['cu']=array('CU' => array('balisegroup' => 'CapacitesUnites',
  220. 'balises' => array('DetailCapaciteUnite' => array('table' => 'DCAPAUNIT','fssm' => 'tzr_lie',
  221. 'ssm' => $param))));
  222. //--- Offre presta
  223. $oparamcu=$gparam['cu'];
  224. $oparamcp=$gparam['cp'];
  225. $oparamcp['CP']['balisegroup']=$oparamcu['CU']['balisegroup']=NULL;
  226. $oparamcp['CP']['balises']['DetailCapacitePrestation']['ar']=$oparamcu['CU']['balises']['DetailCapaciteUnite']['ar']=
  227. array('tzr_ispresta' => 1);
  228. $param=array('PR' => array('balisegroup' => NULL,
  229. 'balises' => array('DetailPrestation' => array('table' => 'DPRESTA','fssm' => 'tzr_lie','ssm' => $gparam['mr'],
  230. 'linkparam' => array('DetailCapaciteUnite' => $oparamcu,
  231. 'DetailCapacitePrestation' => $oparamcp)))));
  232. $gparam['op']=array('OP' => array('balisegroup' => 'OffresPrestations',
  233. 'balises' => array('DetailOffrePrestation' => array('table' => 'DOFFREPRESTA','fssm' => 'tzr_lie',
  234. 'ssm' => $param))));
  235. //--- Tarif
  236. $oparamcl=$gparam['cli']['CL']['balises']['DetailClienteles']['ssm'];
  237. $oparampr=$gparam['op']['OP']['balises']['DetailOffrePrestation']['ssm'];
  238. $oparampe=$gparam['pe'];
  239. $oparampe['PE']['balisegroup']=$oparampr['PR']['balisegroup']=$oparamcl['DC']['balisegroup']=NULL;
  240. $oparampe['PE']['balises']['DetailPeriode']['ar']=$oparampr['PR']['balises']['DetailPrestation']['ar']=
  241. $oparamcl['DC']['balises']['DetailClient']['ar']=array('tzr_istarif' => 1);
  242. $oparampe['PE']['balises']['DetailPeriode']['fssm']=$oparampr['PR']['balises']['DetailPrestation']['fssm']=
  243. $oparamcl['DC']['balises']['DetailClient']['fssm']=NULL;
  244. $gparam['ta']=array('TA' => array('balisegroup' => 'DetailTarifs',
  245. 'balises' => array('DetailTarif' => array('table' => 'DTARIF','fssm' => 'tzr_lie',
  246. 'linkparam' => array('DetailClient' => $oparamcl,
  247. 'DetailPrestation' => $oparampr,
  248. 'DetailPeriode' => $oparampe)))));
  249. //--- Descr comp
  250. $gparam['desc']=array('DE' => array('balisegroup' => 'DescriptionsComplementaires',
  251. 'balises' => array('DetailDescriptionComplementaire' => array('table' => 'DDESCRCOMP',
  252. 'fssm' => 'tzr_lie'))));
  253. //--- Itinieraire
  254. $oparamzo=$gparam['ge']['GE']['balises']['DetailGeolocalisation']['ssm'];
  255. $oparamzo['ZO']['balisegroup']=NULL;
  256. $oparamzo['ZO']['balises']['Zone']['ar']=array('tzr_isiti' => 1);
  257. $gparam['it']=array('IT' => array('balisegroup' => 'Itineraires',
  258. 'balises' => array('DetailItineraire' => array('table' => 'DITI','fssm' => 'tzr_lie',
  259. 'linkparam' => array('Zone' => $oparamzo)))));;
  260. //--- Planning
  261. $param=array('JP' => array('balisegroup' => NULL,
  262. 'balises' => array('JourPlanning' => array('table' => 'JOURPLA','fssm' => 'tzr_lie'))));
  263. $oparampr['PR']['balises']['DetailPrestation']['ar']=array('tzr_isprestapla' => 1);
  264. $param=array('PP' => array('balisegroup' => 'PrestationsPlanning',
  265. 'balises' => array('DetailPrestationPlanning' => array('table' => 'DPRESTAPLA','fssm' => 'tzr_lie',
  266. 'ssm' => $param,
  267. 'linkparam' => array('DetailPrestation' => $oparampr)))));
  268. $oparampe['PE']['balises']['DetailPeriode']['ar']=array('tzr_ispla' => 1);
  269. $gparam['pla']=array('PL' => array('balisegroup' => 'Plannings',
  270. 'balises' => array('DetailPlanning' => array('table' => 'DPLANNING','fssm' => 'tzr_lie','ssm' => $param,
  271. 'linkparam' => array('DetailPeriode' => $oparampe)))));
  272. //--- Prestations liées
  273. $gparam['pliee']=array('PL' => array('balisegroup' => 'PrestationsLiees',
  274. 'balises' => array('DetailPrestationLiee' => array('table' => 'PRESTLIEE','fssm' => 'tzr_lie'))));
  275. $this->_cache['gparam-'.$this->acttype]=$gparam;
  276. }
  277. $this->structparam=$this->_cache['gparam-'.$this->acttype];
  278. }
  279. /// Importe une chaine/fichier au format TiF
  280. function _import($ar=NULL){
  281. $p=new XParam($ar,NULL);
  282. $file=$p->get('file');
  283. $limit=$p->get('limit');
  284. $xmlstring=$p->get('xmlstring');
  285. if(!empty($xmlstring)) $sxml=$xmlstring;
  286. else $sxml=file_get_contents($file);
  287. $idlist=array();
  288. $dom = new DOMDocument();
  289. $dom->preserveWhiteSpace=false;
  290. $dom->validateOnParse = true;
  291. $dom->loadXML($sxml);
  292. $this->xpath=new DOMXpath($dom);
  293. $this->xpath->registerNamespace('dc','http://purl.org/dc/elements/1.1/');
  294. $this->xpath->registerNamespace('dcterms', 'http://purl.org/dc/terms/');
  295. if(!empty($this->NSURI)){
  296. $this->xpath->registerNamespace('tzrns',$this->NSURI);
  297. $this->tzrns='tzrns:';
  298. }else{
  299. $this->tzrns='';
  300. }
  301. $this->prepareParam();
  302. $ois=$this->xpath->query('/'.$this->tzrns.'OI');
  303. if($ois->length==0)
  304. $ois=$this->xpath->query('/ListeOI/'.$this->tzrns.'OI');
  305. foreach($ois as $i => $oi){
  306. $oiddc=$this->importDC($oi); // DublinCore
  307. XLogs::notice('ModTif::_import', "import $oiddc");
  308. if(!empty($oiddc)){
  309. $this->oiddc=$oiddc;
  310. $this->importMultimedia($oi,$oiddc); // Multimédia
  311. $this->importContacts($oi,$oiddc); // Contacts (Adresses - Personnes - Moyens de communications)
  312. $this->importStructuresGestion($oi,$oiddc); // Structures gestion (Contacts)
  313. $this->importStructuresInformation($oi,$oiddc); // Structures information (Contacts)
  314. $this->importInfosLegales($oi,$oiddc); // Informations légales
  315. $this->importClassements($oi,$oiddc); // Classements
  316. $this->importGeolocs($oi,$oiddc); // Geolocalisation (Zones - Points - Coords - Envs - Cartes - Acces - Multimédia)
  317. $this->importPeriodes($oi,$oiddc); // Periodes (Dates - Details jours - Jours - Horaires)
  318. $this->importClienteles($oi,$oiddc); // Clientèles (Details client)
  319. $this->importUsages($oi,$oiddc); // Usages/Langues
  320. $this->importModesResa($oi,$oiddc); // Modes de réservation
  321. $this->importCapacites($oi,$oiddc); // Capacités
  322. $this->importOffresPresta($oi,$oiddc); // Offres de prestation (Prestations)
  323. $this->importTarifs($oi,$oiddc); // Tarifs et modes de paiement
  324. $this->importDescrComp($oi,$oiddc); // Descriptions complémentaires
  325. $this->importItineraires($oi,$oiddc); // Itinéraires
  326. $this->importPlannings($oi,$oiddc); // Plannings (Presta planning - Jour planning)
  327. $this->importPresationsLiees($oi,$oiddc); // Prestations liées
  328. $this->importOther($oi,$oiddc); // Fonction à personnaliser
  329. if(!empty($limit) && $limit<=$i) break;
  330. }
  331. }
  332. unset($dom,$xmlstring,$sxml,$ois);
  333. }
  334. function importDC($oi){
  335. $this->idlist=array();
  336. $dc=$this->xpath->query($this->tzrns.'DublinCore',$oi);
  337. if($dc->length>0){
  338. $dc=$dc->item(0);
  339. $oiddc=$this->analyseDC($dc,NULL,$this->structparam['dc']['DC']['balises']['DublinCore']);
  340. if(!empty($this->structparam['dc']['DC']['balises']['DublinCore']['ssm'])) $this->analyseQuery($dc,$this->structparam['dc']['DC']['balises']['DublinCore']['ssm'],$oiddc);
  341. }
  342. unset($dc);
  343. return $oiddc;
  344. }
  345. function importMultimedia(&$oi,$oiddc){
  346. $this->analyseQuery($oi,$this->structparam['mu'],$oiddc);
  347. }
  348. function importContacts(&$oi,$oiddc){
  349. $this->analyseQuery($oi,$this->structparam['co'],$oiddc);
  350. }
  351. function importStructuresGestion(&$oi,$oiddc){
  352. $this->analyseQuery($oi,$this->structparam['sg'],$oiddc);
  353. }
  354. function importStructuresInformation(&$oi,$oiddc){
  355. $this->analyseQuery($oi,$this->structparam['si'],$oiddc);
  356. }
  357. function importInfosLegales(&$oi,$oiddc){
  358. $this->analyseQuery($oi,$this->structparam['il'],$oiddc);
  359. }
  360. function importClassements(&$oi,$oiddc){
  361. $this->analyseQuery($oi,$this->structparam['cl'],$oiddc);
  362. }
  363. function importGeolocs(&$oi,$oiddc){
  364. $this->analyseQuery($oi,$this->structparam['ge'],$oiddc);
  365. }
  366. function importPeriodes(&$oi,$oiddc){
  367. $this->analyseQuery($oi,$this->structparam['pe'],$oiddc);
  368. }
  369. function importClienteles(&$oi,$oiddc){
  370. $this->analyseQuery($oi,$this->structparam['cli'],$oiddc);
  371. }
  372. function importUsages(&$oi,$oiddc){
  373. $this->analyseQuery($oi,$this->structparam['la'],$oiddc);
  374. }
  375. function importModesResa(&$oi,$oiddc){
  376. $this->analyseQuery($oi,$this->structparam['mr'],$oiddc);
  377. }
  378. function importCapacites(&$oi,$oiddc){
  379. $capa=$this->xpath->query($this->tzrns.'Capacites',$oi);
  380. if($capa->length>0){
  381. $capa=$capa->item(0);
  382. // Capacité globale
  383. $capaglob=$this->xpath->query($this->tzrns.'CapacitesGlobales',$capa);
  384. if($capaglob->length>0){
  385. $capaglob=$capaglob->item(0);
  386. $param=array('table' => 'CAPAGLOB','fssm' => 'tzr_lie');
  387. $oid=$this->analyseDC($capaglob,$oiddc,$param);
  388. $xset=XDataSource::objectFactoryHelper8('BCLASS=XDSTable&SPECS='.$this->prefixSQL.'DC');
  389. $xset->procEdit(array('oid' => $oiddc,'CapacitesGlobales' => $oid,'_nolog' => true));
  390. $this->analyseQuery($capaglob,$this->structparam['cs'],$oid);
  391. }
  392. // Capacités prestations
  393. $this->analyseQuery($capa,$this->structparam['cp'],$oiddc);
  394. // Capacités unités
  395. $this->analyseQuery($capa,$this->structparam['cu'],$oiddc);
  396. }
  397. }
  398. function importOffresPresta(&$oi,$oiddc){
  399. $this->analyseQuery($oi,$this->structparam['op'],$oiddc);
  400. }
  401. function importTarifs(&$oi,$oiddc){
  402. // Modes de paiement
  403. $mp=$this->xpath->query($this->tzrns.'Tarifs/'.$this->tzrns.'ModesPaiement',$oi);
  404. if($mp->length>0){
  405. $mp=$mp->item(0);
  406. $mdps=$this->xpath->query($this->tzrns.'ModePaiement',$mp);
  407. $xset=XDataSource::objectFactoryHelper8('BCLASS=XDSTable&SPECS='.$this->prefixSQL.'DC');
  408. $xsetmp=XDataSource::objectFactoryHelper8('BCLASS=XDSTable&SPECS='.$xset->desc['ModePaiement']->target);
  409. $ar2=array();
  410. foreach($mdps as $mpd){
  411. $oidmp=$xset->desc['ModePaiement']->target.':'.str_replace('.','-',$mpd->getAttribute('type'));
  412. $xsetmp->procInput(array('newoid' => $oidmp,'_nolog' => true,
  413. 'code' => $mpd->getAttribute('type'),'libelle' => $mpd->textContent));
  414. $ar2['ModePaiement'][]=$oidmp;
  415. }
  416. $obs=$this->xpath->query($this->tzrns.'ObservationModePaiement',$mp);
  417. if($obs->length>0) $ar2['ObservationModePaiement']=$obs->item(0)->textContent;
  418. $ar2['oid']=$oiddc;
  419. $ar2['_nolog']=true;
  420. $xset->procEdit($ar2);
  421. }
  422. unset($mp,$mdps,$mdp,$ar2,$obs);
  423. // Tarifs
  424. $ta=$this->xpath->query($this->tzrns.'Tarifs',$oi);
  425. if($ta->length>0){
  426. $ta=$ta->item(0);
  427. $this->analyseQuery($ta,$this->structparam['ta'],$oiddc);
  428. }
  429. unset($ta);
  430. }
  431. function importDescrComp(&$oi,$oiddc){
  432. $this->analyseQuery($oi,$this->structparam['desc'],$oiddc);
  433. }
  434. function importItineraires(&$oi,$oiddc){
  435. $this->analyseQuery($oi,$this->structparam['it'],$oiddc);
  436. }
  437. function importPlannings(&$oi,$oiddc){
  438. $this->analyseQuery($oi,$this->structparam['pla'],$oiddc);
  439. }
  440. function importPresationsLiees(&$oi,$oiddc){
  441. $this->analyseQuery($oi,$this->structparam['pliee'],$oiddc);
  442. }
  443. function importOther(&$oi,$oiddc){
  444. }
  445. /// Requete un noeud et prepare son analyse
  446. function analyseQuery(&$base,$params,$oidssm){
  447. if(isset($params['balises'])) $params=array($params);
  448. $oids=array();
  449. foreach($params as $param){
  450. $balisegrp=$param['balisegroup'];
  451. $balises=$param['balises'];
  452. if(!empty($balisegrp)){
  453. $dc=$this->xpath->query($this->tzrns.$balisegrp,$base);
  454. if($dc->length>0){
  455. $dc=$dc->item(0);
  456. $idref=$dc->getAttribute('idref');
  457. $id=$dc->getAttribute('id');
  458. if(!empty($idref)){
  459. foreach($this->idlist[$idref]['idlist'] as $i => $myid){
  460. $oids[]=$this->addReference($myid,$oidssm,$this->idlist[$idref]['fssmlist'][$i]);
  461. }
  462. }else{
  463. foreach($balises as $balise => $data){
  464. $details=$this->xpath->query($this->tzrns.$balise,$dc);
  465. foreach($details as $i => $detail){
  466. if(!empty($id)){
  467. $idd=$detail->getAttribute('id');
  468. if(empty($idd)){
  469. $idd=$id.'-tzr'.$i;
  470. $detail->setAttribute('id',$idd);
  471. }
  472. $this->idlist[$id]['idlist'][]=$idd;
  473. $this->idlist[$id]['fssmlist'][]=$data['fssm'];
  474. }
  475. $oid=$this->analyseDC($detail,$oidssm,$data);
  476. $oids[]=$oid;
  477. if(!empty($data['ssm'])) $this->analyseQuery($detail,$data['ssm'],$oid);
  478. }
  479. }
  480. }
  481. }
  482. }else{
  483. foreach($balises as $balise => $data){
  484. $details=$this->xpath->query($this->tzrns.$balise,$base);
  485. foreach($details as $detail){
  486. $oid=$this->analyseDC($detail,$oidssm,$data);
  487. $oids[]=$oid;
  488. if(!empty($data['ssm'])) $this->analyseQuery($detail,$data['ssm'],$oid);
  489. }
  490. }
  491. }
  492. }
  493. unset($dc,$details,$detail,$data);
  494. return $oids;
  495. }
  496. /// Insere les données en base dans le cas d'un objet faisant référence à un autre
  497. private function addReference($idref,$oidssm,$fssm){
  498. if(!empty($idref) && !empty($this->idlist[$idref])){
  499. if(!empty($oidssm) && !empty($fssm)){
  500. $ar=array('oid' => $this->idlist[$idref]['oid']);
  501. $ar[$fssm]=$this->idlist[$idref]['data'][$fssm];
  502. if(is_array($ar[$fssm])){
  503. $ar[$fssm][]=$oidssm;
  504. }else{
  505. $ar[$fssm]=array($ar[$fssm],$oidssm);
  506. }
  507. $table=Kernel::getTable($this->idlist[$idref]['oid']);
  508. if(XSystem::tableExists($table)){
  509. $xset=XDataSource::objectFactoryHelper8('BCLASS=XDSTable&SPECS='.$table);
  510. $ar['_nolog']=true;
  511. $xset->procEdit($ar);
  512. }
  513. }
  514. return $this->idlist[$idref]['oid'];
  515. }
  516. return false;
  517. }
  518. /// Analyse un noeud et insere en base
  519. private function analyseDC(&$dc,$oidssm=NULL,&$param=array()){
  520. $table=$param['table'];
  521. if(empty($table)) return;
  522. $forceedit=false;
  523. $id=$dc->getAttribute('id');
  524. $idref=$dc->getAttribute('idref');
  525. $ar=isset($param['ar'])?$param['ar']:array();
  526. $fssm=isset($param['fssm'])?$param['fssm']:NULL;
  527. $delNS=isset($param['delNS'])?$param['delNS']:true;
  528. $direct=isset($param['direct'])?$param['direct']:false;
  529. $oidfield=isset($param['oidfield'])?$param['oidfield']:NULL;
  530. $updfield=isset($param['updfield'])?$param['updfield']:'';
  531. $linkparam=isset($param['linkparam'])?$param['linkparam']:array();
  532. if($direct) $items=array($dc);
  533. else $items=$dc->childNodes;
  534. // Génération du KOID
  535. if(Kernel::getTable($oidssm)==$this->prefixSQL.$table){
  536. $ar['oid']=$oidssm;
  537. $forceedit=true;
  538. }elseif(!empty($param['oid'])){
  539. $ar['newoid']=$newoid=$param['oid'];
  540. }elseif($oidfield){
  541. if(strpos($this->acttype,'SITRA')===0 && strpos($oidfield,':')){
  542. $oidfield=$this->xpath->query(substr($oidfield,strpos($oidfield,':')+1),$dc);
  543. }else{
  544. $oidfield=$this->xpath->query($oidfield,$dc);
  545. }
  546. if($oidfield->length>0){
  547. $oidfield=$oidfield->item(0)->textContent;
  548. $ar['newoid']=$newoid=$this->prefixSQL.$table.':'.preg_replace('/[^a-z0-9_-]/i','_',$oidfield);
  549. }
  550. }
  551. if(empty($newoid)){
  552. $ar['newoid']=$newoid=XDataSource::getNewBasicOID($this->prefixSQL.$table);
  553. }
  554. XLogs::notice('ModTif::analyseDC', "import oid:{$ar['oid']}, newoid:$newoid");
  555. // Verification du dernier update. Si doit etre mis à jour, on efface pour mieux reinserer
  556. if(!empty($updfield)){
  557. if(strpos($this->acttype,'SITRA')===0 && strpos($updfield,':')){
  558. $updbal=$this->xpath->query(substr($updfield,strpos($updfield,':')+1),$dc);
  559. }else{
  560. $updbal=$this->xpath->query($updfield,$dc);
  561. }
  562. if($updbal->length>0){
  563. $updfield=str_replace(':','__',$updfield);
  564. $updvalue=$this->xset->desc[$updfield]->post_edit($updbal->item(0)->textContent);
  565. $updvalue=$updvalue->raw;
  566. $rs=selectQuery('select '.$updfield.' as UPD from '.$this->prefixSQL.$table.' where KOID="'.$newoid.'"');
  567. $ors=&$rs->fetch();
  568. $rs->CloseCursor();
  569. if(!empty($ors['UPD'])){
  570. if($ors['UPD']>=$updvalue) {
  571. XLogs::notice('ModTif::analyseDC', "import $newoid not imported {$ors['UPD']} >= $updvalue");
  572. return false;
  573. }
  574. elseif($this->prefixSQL.$table==$this->table) {
  575. XLogs::notice('ModTif::analyseDC', "delete $newoid");
  576. $this->del(array('oid' => $newoid,'_nolog' => true));
  577. }
  578. }
  579. }
  580. }
  581. // Dans le cas d'une référence, on recupère les données
  582. if(!empty($idref)){
  583. $ret['oid']=$this->addReference($idref,$oidssm,$fssm);
  584. }else{
  585. if((!$dc->hasChildNodes() && !$dc->hasAttributes() && !$direct) || !XSystem::tableExists($this->prefixSQL.$table)) return false;
  586. $xset=XDataSource::objectFactoryHelper8('BCLASS=XDSTable&SPECS='.$this->prefixSQL.$table);
  587. $hasData=false;
  588. // Traite les eventuels attributs de la balise source à enregistrer
  589. foreach($dc->attributes as $dcatt => $i){
  590. if(isset($xset->desc['att_'.$dcatt])){
  591. $hasData=true;
  592. $att='att_'.$dcatt;
  593. $value=$dc->getAttribute($dcatt);
  594. $ar[$att]=$this->getAttributeValue($xset,$att,$value,$dc);
  595. }
  596. }
  597. // Parcours les enfants
  598. foreach($items as $item){
  599. $hasData=true;
  600. if($delNS){
  601. list($ns,$field)=explode(':',$item->tagName);
  602. if(empty($field)) $field=$ns;
  603. }else{
  604. $field=str_replace(':','__',$item->tagName);
  605. // Patch pour DC de sitra qui n'utilise pas les espaces de noms
  606. if(strpos($this->acttype,'SITRA')===0){
  607. if(!isset($xset->desc[$field])){
  608. if(isset($xset->desc['dc__'.$field])) $field='dc__'.$field;
  609. elseif(isset($xset->desc['dcterms__'.$field])) $field='dcterms__'.$field;
  610. }
  611. }
  612. }
  613. if(isset($xset->desc[$field])){
  614. $xfield=&$xset->desc[$field];
  615. $ftype=$xfield->ftype;
  616. switch($ftype){
  617. case 'XFileDef': // Tente de recupérer le fichier pour le mettre en local, sinon utilise un champ url
  618. $file=TZR_TMP_DIR.'TiF'.uniqid();
  619. $content=file_get_contents($item->textContent);
  620. if(!empty($content)){
  621. file_put_contents($file,$content);
  622. unset($content);
  623. $mimeClasse=XMimeTypes::getInstance();
  624. $mime=$mimeClasse->get_file_type($file);
  625. if($mimeClasse->isImage($mime)){
  626. $ar[$field.'_img']='';
  627. $_FILES[$field.'_img']['tmp_name']=$file;
  628. $_FILES[$field.'_img']['type']=$mime;
  629. $_FILES[$field.'_img']['name']=$item->textContent;
  630. $_FILES[$field.'_img']['size']=filesize($file);
  631. }else{
  632. $ar[$field]='';
  633. $_FILES[$field]['tmp_name']=$file;
  634. $_FILES[$field]['type']=$mime;
  635. $_FILES[$field]['name']=$item->textContent;
  636. $_FILES[$field]['size']=filesize($file);
  637. }
  638. }
  639. $ar[$field.'_url']['url']=$item->textContent;
  640. break;
  641. case 'XUrlDef':
  642. $ar[$field]['url']=$item->textContent;
  643. break;
  644. case 'XLinkDef':
  645. if(strpos($xset->desc[$field]->target,$this->prefixSQL.'LS_')===0){
  646. $code=$item->getAttribute('code');
  647. if(empty($code)) $code=$item->getAttribute('type');
  648. $code=$this->getFormatCode($code);
  649. if(!empty($code)){
  650. $rs=selectQuery('select KOID from '.$xset->desc[$field]->target.' where code="'.$code.'"');
  651. if($rs && $rs->rowCount()==0){
  652. $codeoid=$xset->desc[$field]->target.':'.str_replace('.','-',$code);
  653. $libelle=$item->getAttribute('libelle');
  654. if(empty($libelle)) $libelle=$item->textContent;
  655. $xsettmp=XDataSource::objectFactoryHelper8('BCLASS=XDSTable&SPECS='.$xset->desc[$field]->target);
  656. $xsettmp->procInput(array('newoid' => $codeoid,'code' => $code,'libelle' => $libelle,'_nolog' => true));
  657. }else{
  658. $ors=$rs->fetch();
  659. $codeoid=$ors['KOID'];
  660. }
  661. $rs->CloseCursor();
  662. if($xset->desc[$field]->multivalued) $ar[$field][]=$codeoid;
  663. else $ar[$field]=$codeoid;
  664. }
  665. }elseif(!empty($linkparam[$field])){
  666. $oids=$this->analyseQuery($item->parentNode,$linkparam[$field],$newoid);
  667. if(!$xset->desc[$field]->multivalued) $oids=$oids[0];
  668. $ar[$field]=$oids;
  669. }
  670. break;
  671. case 'XTextDef':
  672. if(!empty($ar[$field])) $ar[$field].="\n\n".$item->textContent;
  673. else $ar[$field]=$item->textContent;
  674. break;
  675. case 'XBoolDef':
  676. if($item->textContent=='O') $ar[$field]=1;
  677. else $ar[$field]=0;
  678. break;
  679. case 'XDateTimeDef':
  680. $parts=preg_split('@[\ ]@',$item->textContent);
  681. if(!empty($parts[1]) && preg_match('@^[0-9]{2}:[0-9]{2}$@',$parts[1]))
  682. $ar[$field]=array('date' => $parts[0],'hour' => $parts[1].":00");
  683. else
  684. $ar[$field]=$item->textContent;
  685. break;
  686. default:
  687. if($xset->desc[$field]->multivalued){
  688. if(empty($ar[$field])) $ar[$field]=$item->textContent;
  689. else $ar[$field].=','.$item->textContent;
  690. }else{
  691. if(!empty($item->textContent)) $ar[$field]=$item->textContent;
  692. }
  693. break;
  694. }
  695. // Traite les eventuels attributs à enregistrer
  696. $ord=$xset->desc[$field]->forder+1;
  697. for($i=$ord;$i<count($xset->desc);$i++){
  698. if(preg_match("/^att_".$field."_(.*)$/",$xset->orddesc[$i],$ret)){
  699. $att=$xset->orddesc[$i];
  700. $atttype=$xset->desc[$att]->ftype;
  701. $value=$item->getAttribute($ret[1]);
  702. $ar[$att]=$this->getAttributeValue($xset,$att,$value,$item);
  703. }else{
  704. break;
  705. }
  706. }
  707. // Boucle pour forcer les champs numériques à NULL s'ils ne sont pas renseignés (car sinon 0, et c'est pas bien)
  708. foreach($xset->desc as $fn => &$f){
  709. if($f->ftype=='XRealDef' && !isset($ar[$fn])) $ar[$fn]='';
  710. }
  711. }
  712. }
  713. if($hasData){
  714. $ar['_nolog']=true;
  715. $ar['tzr_dc']=$this->oiddc;
  716. if($forceedit){
  717. XLogs::notice('ModTif::analyseDC', "update {$ar['oid']}");
  718. $xset->procEdit($ar);
  719. $ret['oid']=$ar['oid'];
  720. }else{
  721. // Renseigne l'oid du module parent si necessaire
  722. if(!empty($oidssm) && !empty($fssm)) $ar[$fssm]=$oidssm;
  723. XLogs::notice('ModTif::analyseDC', "insert $newoid");
  724. $ret=$xset->procInput($ar);
  725. }
  726. }
  727. }
  728. // Enregistre les données si la balise à un identifiant
  729. if(!empty($id)){
  730. $this->idlist[$id]=array('oid' => $ret['oid'],'data' => $ar);
  731. }
  732. unset($ar,$items);
  733. return $ret['oid'];
  734. }
  735. /// Recupere une valeur TZR d'un attribut
  736. function getAttributeValue(&$xset,$att,$value,&$item){
  737. $atttype=$xset->desc[$att]->ftype;
  738. switch($atttype){
  739. case 'XLinkDef':
  740. if(strpos($xset->desc[$att]->target,$this->prefixSQL.'LS_')===0){
  741. if(!empty($value)){
  742. $code=$this->getFormatCode($value);
  743. $rs=selectQuery('select KOID from '.$xset->desc[$att]->target.' where code="'.$code.'"');
  744. if($rs && $rs->rowCount()==0){
  745. $value=$xset->desc[$att]->target.':'.str_replace('.','-',$code);
  746. $libelle=$item->getAttribute('libelle');
  747. if(empty($libelle)) $libelle=$item->textContent;
  748. $libelle=$libelle;
  749. $xsettmp=XDataSource::objectFactoryHelper8('BCLASS=XDSTable&SPECS='.$xset->desc[$att]->target);
  750. $xsettmp->procInput(array('newoid' => $value,'code' => $code,'libelle' => $libelle,'_nolog' => true));
  751. }else{
  752. $ors=$rs->fetch();
  753. $value=$ors['KOID'];
  754. }
  755. $rs->closeCursor();
  756. }
  757. }else{
  758. if(!empty($value)) $value=$xset->desc[$att]->target.':'.preg_replace('/([^a-z0-9_-]+)/','-',$value);
  759. }
  760. break;
  761. case 'XBoolDef':
  762. if(strtolower($value)=='o') $value=1;
  763. else $value=0;
  764. break;
  765. default:
  766. break;
  767. }
  768. return $value;
  769. }
  770. /// Formate un code du thésaurus en xx.xx.xx...
  771. function getFormatCode($code){
  772. $acode=explode('.',$code);
  773. $code=array();
  774. foreach($acode as $tmp) $code[]=sprintf("%02d",$tmp);
  775. return implode('.',$code);
  776. }
  777. /**
  778. Fonction pour retourner un resultat plat sur une ressource
  779. Exemple de $list=array('DCONTACT' => array('filter' => 'RaisonSociale="LES RAILLES"',
  780. 'fields' => array('Sigle' => "Sig",'RaisonSociale' => "RS"),
  781. 'sstables' => array('DADRESSE' => array('fields' => array('Adr1' => 'adr'),'all' => true,
  782. 'order' => 'Adr1 DESC','pagesize' => 5)))
  783. filter : filter sql / fields : liste des champs à recupérer (clé=champ TiF, valeur=champ destination)
  784. order : ordre / pagesize : nombre d'éléments à recuperer
  785. **/
  786. function getFlatEntry($oid,$list,&$targetxset,$alloids=array()){
  787. $lang_data=XShell::getLangData();
  788. $ret=array();
  789. if(!is_array($oid)) $oid=array($oid);
  790. if(empty($alloids)) $alloids=$oid;
  791. foreach($list as $table => $param){
  792. $p=new XParam($param,array('filter' => '','pagesize' => 1,'all' => false,'sstables' => array(),'fields' => array(),'ssmfield' => 'tzr_lie',
  793. 'order' => 'tzr_lie,UPD desc','multivalued' => array(),'format' => array(),'pageseparator' => array(),
  794. 'concatseparator' => array(),'boolcond' => array(),'increment' => array(),'ifempty' => array()));
  795. if(strpos($table,':')!==false) // requête multiple sur la même table
  796. $table = substr($table,strpos($table,':')+1);
  797. $table=$this->prefixSQL.$table;
  798. $all=$p->get('all');
  799. $eval=$p->get('eval');
  800. $order=$p->get('order');
  801. $filter=$p->get('filter');
  802. $fields=$p->get('fields');
  803. $format=$p->get('format');
  804. // Tableau de champs qui ne sont a traiter que si le champ de destination est vide
  805. $ifempty=$p->get('ifempty');
  806. // Champ faisant le lien entre l'objet parent et l'objet fils (tzr_lie par defaut)
  807. $ssmfield=$p->get('ssmfield');
  808. $sstables=$p->get('sstables');
  809. // Nombre d'objet à traier (1 par defaut)
  810. $pagesize=$p->get('pagesize');
  811. $increment=$p->get('increment');
  812. $multivalued=$p->get('multivalued');
  813. // Separateur à utiliser dans le cas ou on concatene plusieurs objets dans le meme champ de destination
  814. $pageseparator=$p->get('pageseparator');
  815. // Separateur à utiliser dans le cas ou on concatene plusieurs champ d'un même objet dans le meme champ de destination
  816. $concatseparator=$p->get('concatseparator');
  817. // Tableau des champs => champs cible dans le cas d'un lien sur un objet
  818. $xlinktargetf=$p->get('xlinktargetf');
  819. $oidlies=array();
  820. $lastpage=array();
  821. if($all) $oid=$alloids;
  822. if($table==$this->table){
  823. $q='select * from '.$table.' where LANG="'.$lang_data.'" AND KOID="'.$oid[0].'"';
  824. $order='';
  825. $ret['oid']=$ret['newoid']=str_replace($this->prefixSQL.'DC',$targetxset->getTable(),$oid[0]);
  826. }else{
  827. $q='select * from '.$table.' where LANG="'.$lang_data.'" AND '.$ssmfield.' IN("'.implode('", "',$oid).'")';
  828. if(!empty($filter)) $q.=' AND '.$filter;
  829. }
  830. $xset=XDataSource::objectFactoryHelper8('BCLASS=XDSTable&SPECS='.$table);
  831. $options=array();
  832. foreach($xlinktargetf as $f=>$targetf){
  833. $options[$f]=array('target_fields' => $targetf, 'nocache' => 1);
  834. }
  835. $br=$xset->browse(array(
  836. 'select' => $q,
  837. 'order' => $order,
  838. 'tplentry' => TZR_RETURN_DATA,
  839. 'selectedfields' => array_keys($fields),
  840. 'options' => $options,
  841. 'nocount' => 1
  842. ));
  843. foreach($br['lines_oid'] as $i => $actoid){
  844. if($i==$pagesize) break;
  845. foreach($fields as $f => $newf){
  846. if(!empty($ret[$newf]) && in_array($f,$ifempty)) continue;
  847. if(in_array($newf,$increment)) $newf=$newf.($i+1);
  848. if($f=='oid')
  849. $value = $br['lines_oid'][$i];
  850. else
  851. $value=$this->getValueForInput($br['lines_o'.$f][$i],$xset->desc[$f],$targetxset->desc[$newf]);
  852. if(is_array($value)){
  853. if(empty($ret[$newf])) $ret[$newf]=array();
  854. $ret[$newf]=array_merge($ret[$newf],$value);
  855. }else{
  856. if(!empty($eval[$f])) $value=eval('return '.$eval[$f]);
  857. if($targetxset->desc[$newf]->ftype=='XBoolDef' && $ret[$newf]!=1) $ret[$newf]=$value;
  858. elseif($targetxset->desc[$newf]->ftype=='XGeodesicCoordinatesDef' && !empty($ret[$newf])) $ret[$newf].=';'.$value;
  859. else{
  860. // Formate la valeur si besoin
  861. if(!empty($format[$f])) $value=sprintf($format[$f],$value);
  862. if(empty($ret[$newf])) $ret[$newf]='';
  863. elseif(!empty($value)){
  864. // Ajoute le separateur suite à un changement d'objet ou pour une simple concat de champ sur un meme objet
  865. if($lastpage[$newf]!=$i){
  866. if(!empty($pageseparator[$newf])) $sep=$pageseparator[$newf];
  867. elseif($targetxset->desc[$newf]->ftype=='XTextDef') $sep="\r\n";
  868. elseif($targetxset->desc[$newf]->ftype=='XShortTextDef') $sep=', ';
  869. else $sep='';
  870. $value=$sep.$value;
  871. }else{
  872. if(!array_key_exists($newf,$concatseparator)) $concatseparator[$newf]=' ';
  873. $value=$concatseparator[$newf].$value;
  874. }
  875. }
  876. $ret[$newf].=$value;
  877. }
  878. }
  879. if(!empty($ret[$newf])) $lastpage[$newf]=$i;
  880. }
  881. $oidlies[]=$actoid;
  882. }
  883. unset($br,$param);
  884. // Recupere les sous tables
  885. if(!empty($sstables)) {
  886. if($table!=$this->table) {
  887. $ssalloids = selectQuery('select KOID from '.$table.' '.
  888. 'where tzr_lie IN("'.implode('","',$alloids).'")')
  889. ->fetchAll(PDO::FETCH_COLUMN);
  890. }
  891. $ret2=$this->getFlatEntry($oidlies,$sstables,$targetxset,$ssalloids);
  892. }
  893. if(!empty($ret2)) $ret=array_merge($ret,$ret2);
  894. }
  895. return $ret;
  896. }
  897. /// Transforme la valeur du champ source en valeur à passer à un procInput pour la champ destination
  898. function getValueForInput($value,$f,$targetf){
  899. global $DATA_DIR;
  900. if($targetf->ftype=='XTextDef' || $targetf->ftype=='XShortTextDef'){
  901. return $value->text;
  902. }
  903. if($targetf->ftype=='XBoolDef' && $f->ftype!='XBoolDef'){
  904. if((empty($targetf->boolcond) && !empty($value->raw)) || (!empty($targetf->boolcond) && in_array($value->raw,$targetf->boolcond)))
  905. return 1;
  906. else
  907. return 2;
  908. }
  909. switch($targetf->ftype){
  910. case 'XGeodesicCoordinatesDef':
  911. return str_replace(',','.',$value->raw);
  912. break;
  913. }
  914. switch($f->ftype){
  915. case 'XLinkDef':
  916. return explode('||',$value->raw);
  917. break;
  918. case 'XImageDef':
  919. $tmp_name=TZR_TMP_DIR.uniqid();
  920. copy($value->filename,$tmp_name);
  921. return $tmp_name;
  922. break;
  923. default:
  924. return $value->raw;
  925. break;
  926. }
  927. }
  928. /// Fonction pour checker l'état du webservice de ACVS
  929. function ACVSCheckService($ar=NULL){
  930. $p=new XParam($ar,NULL);
  931. $filter=$p->get('ACVSFilter');
  932. if(empty($filter)) $filter=$this->ACVSFilter;
  933. $idsql=array();
  934. ini_set('soap.wsdl_cache_enabled', 0);
  935. $soap=new SoapClient($this->ACVSUrl.'/'.$this->ACVSFileWSDL,array('exceptions' => false));
  936. $header=$this->ACVSParamGetHeader();
  937. $params=XSystem::xml2array($filter);
  938. foreach($params as $param){
  939. $param=$this->ACVSParamGetSearchOnlyIdPrestation($param);
  940. $request='<?xml version="1.0" encoding="utf-8"?>';
  941. $request.='<soap:Envelope '.$this->ACVSEnvUris.'>';
  942. $request.=$header.$param;
  943. $request.='</soap:Envelope>';
  944. $xmlidlist=$soap->__doRequest($request,$this->ACVSUrl.'/'.$this->ACVSFile,$this->ACVSUrl.'/SearchOnlyIdPrestation',1);
  945. if(get_class($xmlidlist)=='SoapFault') die('false');
  946. $dom=new DOMDocument();
  947. $dom->loadXML($xmlidlist);
  948. $ids=$dom->getElementsByTagName('idPrestation');
  949. if(empty($ids) || $ids->length==0 || empty($ids->item(0)->textContent)) die('false');
  950. }
  951. die('true');
  952. }
  953. /// Procédure d'import depuis le webservice d'ACVS
  954. function ACVSImport(/*$ar=NULL*/$sched, $o, $more) {
  955. $this->NSURI=$this->ACVSNSUri;
  956. $filter=$this->ACVSFilter;
  957. $message='';
  958. ini_set('soap.wsdl_cache_enabled', 0);
  959. $soap=new SoapClient($this->ACVSUrl.'/'.$this->ACVSFileWSDL,array('exceptions' => false));
  960. $header=$this->ACVSParamGetHeader();
  961. $params=XSystem::xml2array($filter);
  962. foreach($params as $rechname => $tzrparam){
  963. $this->acttype='ACVS ('.$rechname.')';
  964. $param=$this->ACVSParamGetSearchOnlyIdPrestation($tzrparam);
  965. $request='<?xml version="1.0" encoding="utf-8"?>';
  966. $request.='<soap:Envelope '.$this->ACVSEnvUris.'>';
  967. $request.=$header.$param;
  968. $request.='</soap:Envelope>';
  969. $xmlidlist=$soap->__doRequest($request,$this->ACVSUrl.'/'.$this->ACVSFile,$this->ACVSUrl.'/SearchOnlyIdPrestation',1);
  970. $dom=new DOMDocument();
  971. $dom->loadXML($xmlidlist);
  972. $fault=$dom->getElementsByTagName('faultstring');
  973. if($fault->length>0){
  974. if(!empty($this->reportto)){
  975. $GLOBALS['XUSER']->sendMail2User('TiF : Erreur import ACVS',"L'interrogation saop a retourné l'erreur suivante : \n".
  976. $fault->item(0)->textContent,$this->reportto);
  977. }
  978. return "L'interrogation saop a retourné l'erreur suivante : \n".$fault->item(0)->textContent;
  979. }
  980. $ids=$dom->getElementsByTagName('idPrestation');
  981. foreach($ids as $i => $id){
  982. $dom2=new DOMDocument();
  983. $param=$this->ACVSParamGetGetPrestationTIF(array('idPrestation' => $id->textContent));
  984. $request='<?xml version="1.0" encoding="utf-8"?>';
  985. $request.='<soap:Envelope '.$this->ACVSEnvUris.'>';
  986. $request.=$header.$param;
  987. $request.='</soap:Envelope>';
  988. $tif=$soap->__doRequest($request,$this->ACVSUrl.'/'.$this->ACVSFile,$this->ACVSUrl.'/GetPrestationTIF',1);
  989. $dom2->loadXML($tif);
  990. $tif=$dom2->getElementsByTagName('xmlTif');
  991. if($tif->length>0)
  992. $this->_import(array('xmlstring' => '<?xml version="1.0"?>'.$tif->item(0)->textContent));
  993. }
  994. // Suppression des élémenents qui ne sont pas dans l'import
  995. $param=$this->ACVSParamGetSearchOnlyIdPrestation($tzrparam,true);
  996. $request='<?xml version="1.0" encoding="utf-8"?>';
  997. $request.='<soap:Envelope '.$this->ACVSEnvUris.'>';
  998. $request.=$header.$param;
  999. $request.='</soap:Envelope>';
  1000. $xmlidlist=$soap->__doRequest($request,$this->ACVSUrl.'/'.$this->ACVSFile,$this->ACVSUrl.'/SearchOnlyIdPrestation',1);
  1001. $dom=new DOMDocument();
  1002. $dom->loadXML($xmlidlist);
  1003. $ids=$dom->getElementsByTagName('idPrestation');
  1004. $idsql=array();
  1005. foreach($ids as $i => $id)
  1006. $idsql[]='ACVS'.$id->textContent;
  1007. if(empty($idsql)){
  1008. $mail='La requete "'.$rechname.'" n\'a retournée aucun enregistrement.';
  1009. if(!empty($this->reportto))
  1010. $GLOBALS['XUSER']->sendMail2User('TiF : Erreur import ACVS',$mail,$this->reportto);
  1011. $message.=$mail."\n";
  1012. }
  1013. $rs=selectQuery('select KOID from '.$this->table.' where tzr_type="'.$this->acttype.'" and '.
  1014. 'dc__identifier not in ("'.implode('","',$idsql).'")');
  1015. while($rs && ($ors=$rs->fetch()))
  1016. $this->del(array('oid' => $ors['KOID'],'_nolog' => true));
  1017. $rs->CloseCursor();
  1018. }
  1019. return $message;
  1020. }
  1021. /// Prepare l'entete des requètes Soap d'ACVS (identification)
  1022. function ACVSParamGetHeader(){
  1023. $ret='<soap:Header><AuthHeader xmlns="'.$this->ACVSUrl.'">';
  1024. $ret.='<Login>'.$this->ACVSLogin.'</Login><Password>'.$this->ACVSPwd.'</Password>';
  1025. $ret.='</AuthHeader></soap:Header>';
  1026. return $ret;
  1027. }
  1028. /// Prepare le xml pour la fonction SearchOnlyIdPrestation du Soap ACVS
  1029. function ACVSParamGetSearchOnlyIdPrestation($parameters=array(),$nodate=false){
  1030. $ret='<soap:Body><SearchOnlyIdPrestation xmlns="'.$this->ACVSUrl.'">';
  1031. $defaults=array('' => array('libPrestation','criteres','majApresLe'),
  1032. '-1' => array('triEvenement','bMonth1','bMonth2','bMonth3','bMonth4','bMonth5','bMonth6',
  1033. 'bMonth7','bMonth8','bMonth9','bMonth10','bMonth11','bMonth12','bWeekEnd','idAnneeExercice',
  1034. 'dayBorneInfOuverture','dayBorneSupOuverture','bCritereA','bCritereB','bCritereC','bCritereD',
  1035. 'bCritereE','bCritereF','bCritereG','bCritereH'));
  1036. if($nodate) unset($parameters['majApresLe']);
  1037. foreach($defaults as $default => $balises){
  1038. foreach($balises as $balise){
  1039. if(isset($parameters[$balise])){
  1040. if($balise=='majApresLe'){
  1041. if(preg_match("/[0-9]{4}-[0-9]{2}-[0-9]{2}/",$parameters[$balise]))
  1042. $ret.='<'.$balise.'>'.$parameters[$balise].'</'.$balise.'>';
  1043. else
  1044. $ret.='<'.$balise.'>'.date('Y-m-d',strtotime($parameters[$balise])).'</'.$balise.'>';
  1045. }else{
  1046. $ret.='<'.$balise.'>'.$parameters[$balise].'</'.$balise.'>';
  1047. }
  1048. }else{
  1049. $ret.='<'.$balise.'>'.$default.'</'.$balise.'>';
  1050. }
  1051. }
  1052. }
  1053. $ret.='</SearchOnlyIdPrestation></soap:Body>';
  1054. return $ret;
  1055. }
  1056. /// Prepare le xml pour la fonction GetPrestationTIF du Soap ACVS
  1057. function ACVSParamGetGetPrestationTIF($parameters = array()){
  1058. $ret='<soap:Body><GetPrestationTIF xmlns="'.$this->ACVSUrl.'">';
  1059. if(isset($parameters['idPrestation'])) $ret.='<idPrestation>'.$parameters['idPrestation'].'</idPrestation>';
  1060. else $ret.='<idPrestation>-1</idPrestation>';
  1061. $ret.='</GetPrestationTIF></soap:Body>';
  1062. return $ret;
  1063. }
  1064. /// Fonction pour checker l'état du webservice de GITD (avec die pour rq)
  1065. function GITDCheckService($ar=NULL){
  1066. $ret=$this->GITDCheckService2($ar);
  1067. if($ret) die('true');
  1068. else die('false');
  1069. }
  1070. /// Fonction pour checker l'état du webservice de GITD (retourne true ou false)
  1071. function GITDCheckService2($ar=NULL){
  1072. $filter=$this->GITDFilter;
  1073. ini_set('soap.wsdl_cache_enabled', 0);
  1074. $soap=new SoapClient($this->GITDUrl,array('exceptions' => false));
  1075. $params=XSystem::xml2array($filter);
  1076. foreach($params as $param){
  1077. $rep=$soap->executeQueryN(array('arg0' => $this->GITDLogin,'arg1' => $this->GITDPwd,'arg2' => $

Large files files are truncated, but you can click here to view the full file