2708885fa0ce212ca84455d2c8bb6e3bd9d34bb4
[ldapsaisie.git] / public_html / includes / addons / LSaddons.supann.php
1 <?php
2 /*******************************************************************************
3  * Copyright (C) 2007 Easter-eggs
4  * http://ldapsaisie.labs.libre-entreprise.org
5  *
6  * Author: See AUTHORS file in top-level directory.
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License version 2
10  * as published by the Free Software Foundation.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
20
21 ******************************************************************************/
22
23 // Messages d'erreur
24
25 // Support
26 LSerror :: defineError('SUPANN_SUPPORT_01',
27   _("SUPANN Support : The constant %{const} is not defined.")
28 );
29 LSerror :: defineError('SUPANN_SUPPORT_02',
30   _("SUPANN Support : The LSobject type %{type} does not exist. Can't work with entities..")
31 );
32 LSerror :: defineError('SUPANN_SUPPORT_03',
33   _("SUPANN Support : The global array %{array} is not defined.")
34 );
35
36 // Autres erreurs
37 LSerror :: defineError('SUPANN_01',
38   _("SUPANN Support : The attribute %{dependency} is missing. Unable to forge the attribute %{attr}.")
39 );
40 LSerror :: defineError('SUPANN_02',
41   _("SUPANN Support : Can't get the basedn of entities. Unable to forge the attribute %{attr}.")
42 );
43
44  /**
45   * Verification du support SUPANN par ldapSaisie
46   *
47   * @author Benjamin Renard <brenard@easter-eggs.com>
48   *
49   * @retval boolean true si SUPANN est pleinement supporté, false sinon
50   */
51   function LSaddon_supann_support() {
52     $retval = true;
53
54     $MUST_DEFINE_CONST= array(
55       'LS_SUPANN_LASTNAME_ATTR',
56       'LS_SUPANN_FIRSTNAME_ATTR',
57       'LS_SUPANN_LSOBJECT_ENTITE_TYPE',
58       'LS_SUPANN_LSOBJECT_ENTITE_FORMAT_SHORTNAME',
59       'LS_SUPANN_ETABLISSEMENT_UAI',
60       'LS_SUPANN_ETABLISSEMENT_DN'
61     );
62
63     foreach($MUST_DEFINE_CONST as $const) {
64       if ( (!defined($const)) || (constant($const) == "")) {
65         LSerror :: addErrorCode('SUPANN_SUPPORT_01',$const);
66         $retval=false;
67       }
68     }
69
70     $MUST_DEFINE_ARRAY= array(
71       'supannNomenclatures',
72     );
73     foreach($MUST_DEFINE_ARRAY as $array) {
74       if ( !isset($GLOBALS[$array]) || !is_array($GLOBALS[$array])) {
75         LSerror :: addErrorCode('SUPANN_SUPPORT_03',$array);
76         $retval=false;
77       }
78     }
79
80     if ( defined('LS_SUPANN_LSOBJECT_ENTITE_TYPE') ) {
81       if ( ! LSsession :: loadLSobject( LS_SUPANN_LSOBJECT_ENTITE_TYPE ) ) {
82         LSerror :: addErrorCode('SUPANN_SUPPORT_02', LS_SUPANN_LSOBJECT_ENTITE_TYPE);
83       }
84     }
85
86     return $retval;
87   }
88
89 /***********************************************************************
90  * Fonctions de génération de valeurs d'attributs
91  **********************************************************************/
92
93  /**
94   * Generation du displayName
95   *
96   * @author Benjamin Renard <brenard@easter-eggs.com>
97   *
98   * @param[in] $ldapObject L'objet ldap
99   *
100   * @retval string Le displayName ou false si il y a un problème durant la génération
101   */
102   function generate_displayName($ldapObject) {
103     if ( get_class($ldapObject -> attrs[ LS_SUPANN_LASTNAME_ATTR ]) != 'LSattribute' ) {
104       LSerror :: addErrorCode('SUPANN_01',array('dependency' => LS_SUPANN_LASTNAME_ATTR, 'attr' => 'cn'));
105       return;
106     }
107     if ( get_class($ldapObject -> attrs[ LS_SUPANN_FIRSTNAME_ATTR ]) != 'LSattribute' ) {
108       LSerror :: addErrorCode('SUPANN_01',array('dependency' => LS_SUPANN_FIRSTNAME_ATTR, 'attr' => 'cn'));
109       return;
110     }
111
112     $noms = $ldapObject -> attrs[ LS_SUPANN_LASTNAME_ATTR ] -> getValue();
113     $prenoms = $ldapObject -> attrs[ LS_SUPANN_FIRSTNAME_ATTR ] -> getValue();
114
115     return ($prenoms[0].' '.$noms[0]);
116   }
117
118  /**
119   * Generation du CN
120   *
121   * @author Benjamin Renard <brenard@easter-eggs.com>
122   *
123   * @param[in] $ldapObject L'objet ldap
124   *
125   * @retval string Le CN ou false si il y a un problème durant la génération
126   */
127   function generate_cn($ldapObject) {
128     if ( get_class($ldapObject -> attrs[ LS_SUPANN_LASTNAME_ATTR ]) != 'LSattribute' ) {
129       LSerror :: addErrorCode('SUPANN_01',array('dependency' => LS_SUPANN_LASTNAME_ATTR, 'attr' => 'cn'));
130       return;
131     }
132     if ( get_class($ldapObject -> attrs[ LS_SUPANN_FIRSTNAME_ATTR ]) != 'LSattribute' ) {
133       LSerror :: addErrorCode('SUPANN_01',array('dependency' => LS_SUPANN_FIRSTNAME_ATTR, 'attr' => 'cn'));
134       return;
135     }
136
137     $noms = $ldapObject -> attrs[ LS_SUPANN_LASTNAME_ATTR ] -> getValue();
138     $prenoms = $ldapObject -> attrs[ LS_SUPANN_FIRSTNAME_ATTR ] -> getValue();
139
140     return (withoutAccents($noms[0]).' '.withoutAccents($prenoms[0]));
141   }
142
143  /**
144   * Generation des valeurs de l'attribut eduPersonOrgUnitDN à partir des
145   * valeurs de l'attribut supannEntiteAffectation.
146   *
147   * @author Benjamin Renard <brenard@easter-eggs.com>
148   *
149   * @param[in] $ldapObject L'objet ldap
150   *
151   * @retval array Les valeurs de l'attribut eduPersonOrgUnitDN ou false
152   *               si il y a un problème durant la génération
153   */
154   function generate_eduPersonOrgUnitDN($ldapObject) {
155     if ( get_class($ldapObject -> attrs[ 'supannEntiteAffectation' ]) != 'LSattribute' ) {
156       LSerror :: addErrorCode('SUPANN_01',array('dependency' => 'supannEntiteAffectation', 'attr' => 'eduPersonOrgUnitDN'));
157       return;
158     }
159
160     $affectations = $ldapObject -> attrs[ 'supannEntiteAffectation' ] -> getUpdateData();
161
162     $basedn=LSconfig :: get('LSobjects.'.LS_SUPANN_LSOBJECT_ENTITE_TYPE.'.container_dn').','.LSsession::getTopDn();
163     if ($basedn=="") {
164       LSerror :: addErrorCode('SUPANN_02','eduPersonOrgUnitDN');
165       return;
166     }
167
168     $retval=array();
169     foreach ($affectations as $aff) {
170       $retval[]="supannCodeEntite=".$aff.",$basedn";
171     }
172
173     return $retval;
174   }
175
176  /**
177   * Generation de la valeur de l'attribut eduPersonPrimaryOrgUnitDN
178   * à partir de la valeur de l'attribut supannEntiteAffectationPrincipale.
179   *
180   * @author Benjamin Renard <brenard@easter-eggs.com>
181   *
182   * @param[in] $ldapObject L'objet ldap
183   *
184   * @retval array La valeur de l'attribut eduPersonPrimaryOrgUnitDN
185   *               ou false si il y a un problème durant la génération
186   */
187   function generate_eduPersonPrimaryOrgUnitDN($ldapObject) {
188     if ( get_class($ldapObject -> attrs[ 'supannEntiteAffectationPrincipale' ]) != 'LSattribute' ) {
189       LSerror :: addErrorCode('SUPANN_01',array('dependency' => 'supannEntiteAffectationPrincipale', 'attr' => 'eduPersonPrimaryOrgUnitDN'));
190       return;
191     }
192
193     $affectations = $ldapObject -> attrs[ 'supannEntiteAffectationPrincipale' ] -> getUpdateData();
194
195     $basedn=LSconfig :: get('LSobjects.'.LS_SUPANN_LSOBJECT_ENTITE_TYPE.'.container_dn').','.LSsession::getTopDn();
196     if ($basedn=="") {
197       LSerror :: addErrorCode('SUPANN_02','eduPersonPrimaryOrgUnitDN');
198       return;
199     }
200
201     $retval=array();
202     foreach ($affectations as $aff) {
203       $retval[]="supannCodeEntite=".$aff.",$basedn";
204     }
205
206     return $retval;
207   }
208
209  /**
210   * Generation de la valeur de l'attribut eduPersonOrgDN
211   * à partir de la valeur de l'attribut supannEtablissement.
212   *
213   * La valeur sera LS_SUPANN_ETABLISSEMENT_DN si l'attribut supannEtablissement
214   * vaut {UAI}LS_SUPANN_ETABLISSEMENT_UAI.
215   *
216   * @author Benjamin Renard <brenard@easter-eggs.com>
217   *
218   * @param[in] $ldapObject L'objet ldap
219   *
220   * @retval array La valeur de l'attribut eduPersonOrgDN ou false
221   *               si il y a un problème durant la génération
222   */
223   function generate_eduPersonOrgDN($ldapObject) {
224     if ( get_class($ldapObject -> attrs[ 'supannEtablissement' ]) != 'LSattribute' ) {
225       LSerror :: addErrorCode('SUPANN_01',array('dependency' => 'supannEtablissement', 'attr' => 'eduPersonOrgDN'));
226       return;
227     }
228
229     $eta = $ldapObject -> attrs[ 'supannEtablissement' ] -> getUpdateData();
230
231     $retval=array();
232     if ($eta[0] == '{UAI}'.LS_SUPANN_ETABLISSEMENT_UAI) {
233         $retval[] = LS_SUPANN_ETABLISSEMENT_DN;
234     }
235
236     return $retval;
237   }
238
239 /***********************************************************************
240  * Fonction de parsing des valeurs spécifiques SUPANN
241  **********************************************************************/
242
243  /**
244   * Parse une valeur a etiquette SUPANN
245   *
246   * Exemple de valeur :
247   *
248   *    {SUPANN}S410
249   *
250   * @param[in] $val La valeur
251   *
252   * @retval array Un tableau cle->valeur contenant label et value ou False
253   **/
254   function supannParseLabeledValue($value) {
255     if (preg_match('/^\{([^\}]*)\}(.*)$/',$value,$m)) {
256       return array(
257         'label'=>$m[1],
258         'value'=>$m[2]
259       );
260     }
261     return;
262   }
263
264  /**
265   * Parse une valeur composite SUPANN
266   *
267   * Exemple de valeur :
268   *
269   *    [key1=value][key2=value][key3=value]
270   *
271   * @author Benjamin Renard <brenard@easter-eggs.com>
272   *
273   * @param[in] $val La valeur composite
274   *
275   * @retval array Un tableau contenant key->value ou false en cas d'erreur
276   **/
277   function supannParseCompositeValue($val) {
278     if (preg_match_all('/\[([^=]*)=([^\]]*)\]/',$val,$matches)) {
279       $parseValue=array();
280       for($i=0;$i<count($matches[0]);$i++) {
281         $parseValue[$matches[1][$i]]=$matches[2][$i];
282       }
283       return $parseValue;
284     }
285     return;
286   }
287
288 /***********************************************************************
289  * Fonctions relatives aux entités
290  **********************************************************************/
291
292  /**
293   * Retourne le nom court d'une entite en fonction de son identifiant
294   *
295   * @param[in] $id L'identifiant de l'entite (supannCodeEntite)
296   *
297   * @retval string Le nom de l'entite
298   **/
299   function supanGetEntiteNameById($id) {
300     if (LSsession::loadLSobject(LS_SUPANN_LSOBJECT_ENTITE_TYPE)) {
301       $type=LS_SUPANN_LSOBJECT_ENTITE_TYPE;
302       $e = new $type();
303       $list=$e -> listObjectsName("(supannCodeEntite=$id)",NULL,array(),LS_SUPANN_LSOBJECT_ENTITE_FORMAT_SHORTNAME);
304       if (count($list)==1) {
305         return array_pop($list);
306       }
307     }
308     return getFData(__("Entity %{id} (unrecognized)"),$id);
309   }
310
311  /**
312   * Valide l'ID d'une entite
313   *
314   * @param[in] $id L'identifiant de l'entite (supannCodeEntite)
315   *
316   * @retval boolean True si une entité avec cet ID existe, False sinon
317   **/
318   function supannValidateEntityId($id) {
319         if (LSsession::loadLSobject(LS_SUPANN_LSOBJECT_ENTITE_TYPE)) {
320       $type=LS_SUPANN_LSOBJECT_ENTITE_TYPE;
321       $e = new $type();
322       $list=$e -> listObjectsName("(supannCodeEntite=$id)");
323       if (count($list)==1) {
324         return true;
325       }
326     }
327     return false;
328   }
329
330  /**
331   * Cherche des entités répond au pattern de recherche passé en paramètres
332   * et retourne un tableau mettant en relation leur identifiant et leur nom
333   * d'affichage.
334   *
335   * @param[in] $pattern string Le pattern de recherche
336   *
337   * @retval array Tableau du résultat de la recherche mettant en relation
338   *               l'identifiant des entités trouvés avec leur nom d'affichage.
339   **/
340   function supannSearchEntityByPattern($pattern) {
341                 $retval=array();
342                 if (LSsession::loadLSclass('LSsearch')) {
343                         $search=new LSsearch(
344                                 LS_SUPANN_LSOBJECT_ENTITE_TYPE,
345                                 'SUPANN:supannSearchEntityByPattern',
346                                 array(
347                                         'pattern' => $pattern,
348                                         'attributes' => array('supannCodeEntite'),
349                                         'sizelimit' => 10,
350                                 )
351                         );
352                         $search -> run();
353                 
354                         foreach($search -> getSearchEntries() as $e) {
355                                 $code=$e->get('supannCodeEntite');
356                                 if (is_array($code)) $code=$code[0];
357                                 $retval[$code]=$e->displayName;
358                         }
359                 }
360                 return $retval;
361   }
362
363
364 /***********************************************************************
365  * Fonctions relatives aux nomenclatures
366  **********************************************************************/
367
368  /**
369   * Vérifie si une valeur et son étiquette sont valide pour une table donnée
370   *
371   * @param[in] $table La table de nomenclature
372   * @param[in] $label L'étiquette de la valeur
373   * @param[in] $value La valeur
374   *
375   * @retval booleab True si valide, False sinon
376   **/
377   function supannValidateNomenclatureValue($table,$label,$value) {
378         $label=strtoupper($label);
379     if (isset($GLOBALS['supannNomenclatures'][$label]) &&
380         isset($GLOBALS['supannNomenclatures'][$label][$table]) &&
381         isset($GLOBALS['supannNomenclatures'][$label][$table][$value])) {
382           return true;
383         }
384         return false;
385   }
386
387  /**
388   * Retourne le label d'une valeur en fonction de la table de nomenclature
389   * et de l'étiquette de la valeur.
390   *
391   * @param[in] $table La table de nomenclature
392   * @param[in] $label L'étiquette de la valeur
393   * @param[in] $value La valeur
394   *
395   * @retval array Le label de la valeur. En cas de valeur nor-reconnue, retourne
396   *               la valeur en spécifiant qu'elle n'est pas reconnue.
397   **/
398   function supannGetNomenclatureLabel($table,$label,$value) {
399         if (supannValidateNomenclatureValue($table,$label,$value)) {
400       $label=strtoupper($label);
401           return $GLOBALS['supannNomenclatures'][$label][$table][$value];
402         }
403         return getFData(__("%{value} (unrecognized value)"),$value);
404   }
405
406  /**
407   * Retourne les valeurs possibles d'une table de nomenclature
408   *
409   * @param[in] $table La table de nomenclature
410   *
411   * @retval array Tableau contenant les valeurs possibles de la table
412   *               de nomenclature
413   **/
414   function supannGetNomenclatureTable($table) {
415           $retval=array();
416           foreach($GLOBALS['supannNomenclatures'] as $label => $tables) {
417                   if (isset($GLOBALS['supannNomenclatures'][$label][$table])) {
418                           $retval[$label]=$GLOBALS['supannNomenclatures'][$label][$table];
419                   }
420           }
421           return $retval;
422   }
423