/[openfoncier]/trunk/obj/electronicsignature.class.php
ViewVC logotype

Contents of /trunk/obj/electronicsignature.class.php

Parent Directory Parent Directory | Revision Log Revision Log


Revision 14064 - (show annotations)
Thu Feb 16 22:52:47 2023 UTC (23 months, 2 weeks ago) by softime
File size: 17074 byte(s)
chore(branch): fusion de la branche d'intégration 5.16.0-develop dans le trunk

1 <?php
2 /**
3 * Contient la définition des classes 'electronicsignature' et 'electronicsignature_base'.
4 */
5
6 if (defined('PATH_OPENMAIRIE') !== true) {
7 define('PATH_OPENMAIRIE', '../core/');
8 }
9 require_once PATH_OPENMAIRIE."om_logger.class.php";
10
11 /**
12 * Abstracteur du parapheur
13 */
14 class electronicsignature {
15
16 /**
17 * Configuration du connecteur parapheur.
18 * @var array
19 */
20 var $conf = null;
21
22 /**
23 * Instance du connecteur parapheur.
24 * @var object
25 */
26 var $electronicsignature = null;
27
28 /**
29 * Liste des clés obligatoire pour les parapheurs.
30 * @var array
31 */
32 const DATA_KEYS = array(
33 "om_utilisateur_email",
34 "om_utilisateur_nom",
35 "signataire_arrete_email",
36 "signataire_arrete_nom",
37 "signataire_arrete_prenom",
38 "dossier"
39 );
40
41 /**
42 * Liste des clés obligatoire pour les métadonnées des documents d'instruction.
43 * @var array
44 */
45 const DOSSIER_METADATA = array(
46 "mimetype",
47 "filename",
48 "url_di",
49 "titre_document"
50 );
51
52 /**
53 * Liste des clés obligatoire pour l'annulation l'envoi en signature des documents d'instruction.
54 * @var array
55 */
56 const CANCEL_DATA_KEYS = array(
57 "id_parapheur_signature"
58 );
59
60
61 /**
62 * Instancie le connecteur parapheur depuis la collectivité transmise et la
63 * configuration.
64 *
65 * Liste des paramètres :
66 * - *conf_name* nom de la configuration à récupérer, par défaut 'electronicsignature-default'
67 * - *collectivite_idx* identifiant de la collectivité
68 * - collectivite_multi_idx identifiant de la collectivité de niveau 2
69 *
70 * @param array $params Liste des paramètres.
71 */
72 public function __construct(array $params) {
73 //
74 if (file_exists("../dyn/electronicsignature.inc.php") === false) {
75 throw new electronicsignature_configuration_exception(__("Aucun fichier de configuration pour la signature électronique."));
76 }
77 include("../dyn/electronicsignature.inc.php");
78 if (isset($conf) === false) {
79 throw new electronicsignature_configuration_exception(__("Aucune configuration pour la signature électronique."));
80 }
81 $this->conf = $conf;
82 //
83 if (isset($params['conf_name']) === true) {
84 $this->conf = $this->conf[$params['conf_name']];
85 } else {
86 $this->conf = $this->conf['electronicsignature-default'];
87 }
88 //
89 if (isset($params['collectivite_idx']) === true
90 && $this->get_conf('unexpected_collectivite') !== null
91 && in_array($params['collectivite_idx'], $this->get_conf('unexpected_collectivite')) === true) {
92 //
93 throw new electronicsignature_configuration_exception(__("Aucun parapheur configuré pour la collectivité."));
94 }
95 //
96 if (isset($params['collectivite_idx']) === true
97 && $this->get_conf($params['collectivite_idx']) !== null) {
98 //
99 $this->conf = $this->conf[$params['collectivite_idx']];
100 }
101 elseif (isset($params['collectivite_multi_idx']) === true
102 && $this->get_conf($params['collectivite_multi_idx']) !== null) {
103 //
104 $this->conf = $this->conf[$params['collectivite_multi_idx']];
105 } else {
106 throw new electronicsignature_configuration_exception(__("Aucun parapheur configuré pour la collectivité."));
107 }
108
109 //
110 if ($this->get_conf('path') === null) {
111 throw new electronicsignature_configuration_exception(__("Le chemin vers le connecteur du parapheur n'est pas configuré."));
112 }
113 //
114 if ($this->get_conf('connector') === null) {
115 throw new electronicsignature_configuration_exception(__("Le nom du connecteur du parapheur n'est pas configuré."));
116 }
117 //
118 $connector = sprintf(
119 '%s_%s',
120 get_class($this),
121 $this->get_conf('connector')
122 );
123 require_once $this->conf['path'].$connector.'.class.php';
124 $this->electronicsignature = new $connector($this->get_conf());
125 }
126
127 /**
128 * Détruit la ressource instanciée dans le constructeur.
129 */
130 public function __destruct() {
131 //
132 if (is_null($this->electronicsignature) === false) {
133 unset($this->electronicsignature);
134 }
135 }
136
137 /**
138 * Accesseur pour récupérer la configuration complète du connecteur parapheur
139 * ou une partie de celle-ci.
140 *
141 * @param string $params Attribut de la configuration.
142 * @return mixed Le tableau de configuration complet ou la valeur
143 * d'une entrée du tableau de configuration.
144 */
145 public function get_conf($params = null) {
146 if ($params === null) {
147 return $this->conf;
148 }
149 if (is_string($params) === true
150 && is_array($this->conf) === true) {
151 //
152 if (array_key_exists($params, $this->conf) === true) {
153 return $this->conf[$params];
154 }
155 }
156 if (is_array($params) === true
157 && is_array($this->conf) === true
158 && count($params) === 2
159 && array_key_exists($params[0], $this->conf) === true
160 && is_array($this->conf[$params[0]]) === true
161 && array_key_exists($params[1], $this->conf[$params[0]]) === true) {
162 //
163 return $this->conf[$params[0]][$params[1]];
164 }
165 return null;
166 }
167
168 /**
169 * Appelle la méthode de même nom du connecteur parapheur.
170 * Permet de transmettre un document à signer.
171 *
172 * @param array $data Liste des paramètres (dépend du connecteur).
173 * @param string $file_content Contenu du document à signer.
174 * @param array $dossier_metadata Métadonnées du dossier d'instruction.
175 * @param array $optional_data Paramètres spécifique au connecteur.
176 * @return array Tableau de résultat retourné par le
177 * connecteur parapheur, sinon retourne une exception.
178 */
179 public function send_for_signature(array $data, string $file_content, array $dossier_metadata, array $optional_data = null) {
180 //
181 if (is_array($data) === false
182 || empty($data) === true) {
183 //
184 throw new electronicsignature_parameter_exception();
185 }
186
187 $missed_data_keys = array();
188 foreach (self::DATA_KEYS as $data_key) {
189 // Construire une liste des clés manquantes
190 if (! isset($data[$data_key])) {
191 $missed_data_keys[] = $data_key;
192 }
193 }
194 if (! empty($missed_data_keys)) {
195 throw new electronicsignature_connector_exception(
196 __("Certains paramètres nécessaires à l'envoi en signature sont manquantes : ").implode(', ', $missed_data_keys)
197 );
198 }
199
200 $missed_metadata_keys = array();
201 foreach (self::DOSSIER_METADATA as $data_key) {
202 // Construire une liste des clés manquantes
203 if (! isset($data[$data_key])) {
204 $missed_metadata_keys[] = $data_key;
205 }
206 }
207 if (! empty($missed_data_keys)) {
208 throw new electronicsignature_connector_exception(
209 __("Certaines métadonnées nécessaires à l'envoi en signature sont manquantes : ").implode(', ', $missed_data_keys)
210 );
211 }
212
213 if (empty($file_content) === true) {
214 //
215 throw new electronicsignature_parameter_exception(__("Contenu du fichier absent."));
216 }
217
218 //
219 $es = $this->electronicsignature;
220 if (is_null($es) === true) {
221 return false;
222 }
223 //
224 return $es->send_for_signature($data, $file_content, $dossier_metadata, $optional_data);
225 }
226
227 /**
228 * Appelle la méthode de même nom du connecteur parapheur.
229 * Permet d'annuler la transmission du document à signer.
230 *
231 * @param array $data Liste des paramètres (dépend du connecteur).
232 * @return array Tableau de résultat retourné par le
233 * connecteur parapheur, sinon retourne une exception.
234 */
235 public function cancel_send_for_signature(array $data) {
236 //
237 //
238 if (is_array($data) === false
239 || empty($data) === true) {
240 //
241 throw new electronicsignature_parameter_exception();
242 }
243
244 $missed_data_keys = array();
245 foreach (self::CANCEL_DATA_KEYS as $data_key) {
246 // Construire une liste des clés manquantes
247 if (! isset($data[$data_key])) {
248 $missed_data_keys[] = $data_key;
249 }
250 }
251 if (! empty($missed_data_keys)) {
252 throw new electronicsignature_connector_exception(
253 __("Certains paramètres nécessaires à l'annulation de l'envoi en signature sont manquants : ").implode(', ', $missed_data_keys)
254 );
255 }
256
257 //
258 $es = $this->electronicsignature;
259 if (is_null($es) === true) {
260 return false;
261 }
262 //
263 return $es->cancel_send_for_signature($data);
264 }
265
266
267 /**
268 * Appelle la méthode de même nom du connecteur parapheur.
269 * Permet de récupérer le statut d'un parapheur.
270 *
271 * @param array $data Liste des paramètres (dépend du connecteur).
272 * @return array Tableau de résultat retourné par le
273 * connecteur parapheur, sinon retourne une exception.
274 */
275 public function get_signature_status(array $data) {
276 //
277 if (is_array($data) === false
278 || empty($data) === true) {
279 //
280 throw new electronicsignature_parameter_exception();
281 }
282
283 //
284 $es = $this->electronicsignature;
285 if (is_null($es) === true) {
286 return false;
287 }
288 //
289 return $es->get_signature_status($data);
290 }
291
292 /**
293 * Appelle la méthode de même nom du connecteur parapheur.
294 * Permet de récupérer le document signé.
295 *
296 * @param array $data Liste des paramètres (dépend du connecteur).
297 * @return array Tableau de résultat retourné par le
298 * connecteur parapheur, sinon retourne une exception.
299 */
300 public function get_signed_document(array $data) {
301 //
302 if (is_array($data) === false
303 || empty($data) === true) {
304 //
305 throw new electronicsignature_parameter_exception();
306 }
307
308 //
309 $es = $this->electronicsignature;
310 if (is_null($es) === true) {
311 return false;
312 }
313 //
314 return $es->get_signed_document($data);
315 }
316
317 }
318
319 /**
320 * Classe parente de tous les connecteurs parapheur
321 */
322 class electronicsignature_base {
323
324 /**
325 * Configuration du connecteur parapheur.
326 * @var array
327 */
328 var $conf = null;
329
330 /**
331 * Instancie le connecteur parapheur selon la configuration.
332 *
333 * @param array $conf Configuration du connecteur.
334 */
335 public function __construct(array $conf) {
336 $this->conf = $conf;
337 }
338
339 /**
340 * Accesseur pour récupérer la configuration complète du connecteur parapheur
341 * ou une partie de celle-ci.
342 *
343 * @param string $params Attribut de la configuration.
344 * @return mixed Le tableau de configuration complet ou la valeur
345 * d'une entrée du tableau de configuration.
346 */
347 protected function get_conf($params = null) {
348 if ($params === null) {
349 return $this->conf;
350 }
351 if (is_string($params) === true
352 && is_array($this->conf) === true) {
353 //
354 if (array_key_exists($params, $this->conf) === true) {
355 return $this->conf[$params];
356 }
357 }
358 if (is_array($params) === true
359 && is_array($this->conf) === true
360 && count($params) === 2
361 && array_key_exists($params[0], $this->conf) === true
362 && is_array($this->conf[$params[0]]) === true
363 && array_key_exists($params[1], $this->conf[$params[0]]) === true) {
364 //
365 return $this->conf[$params[0]][$params[1]];
366 }
367 return null;
368 }
369
370 /**
371 * Doit être implémentée par des classe dérivées.
372 * Permet de transmettre un document à signer.
373 *
374 * @param array $data Liste des paramètres (dépend du connecteur).
375 * @param string $file_content Contenu du document à signer.
376 * @param array $dossier_metadata Métadonnées du dossier d'instruction.
377 * @param array $optional_data Paramètres spécifique au connecteur.
378 * @return array Tableau de résultat retourné par le
379 * connecteur parapheur, sinon retourne une exception.
380 */
381 protected function send_for_signature(array $data, string $file_content, array $dossier_metadata, array $optional_data = null) {
382 //
383 throw new electronicsignature_connector_method_not_implemented_exception();
384 }
385
386 /**
387 * Doit être implémentée par des classe dérivées.
388 * Permet d'annuler la transmission du document à signer.
389 *
390 * @param array $data Liste des paramètres (dépend du connecteur).
391 * @return array Tableau de résultat retourné par le
392 * connecteur parapheur, sinon retourne une exception.
393 */
394 protected function cancel_send_for_signature(array $data) {
395 //
396 throw new electronicsignature_connector_method_not_implemented_exception();
397 }
398
399
400 /**
401 * Doit être implémentée par des classe dérivées.
402 * Permet de récupérer le statut d'un parapheur.
403 *
404 * @param array $data Liste des paramètres (dépend du connecteur).
405 * @return array Tableau de résultat retourné par le
406 * connecteur parapheur, sinon retourne une exception.
407 */
408 protected function get_signature_status(array $data) {
409 //
410 throw new electronicsignature_connector_method_not_implemented_exception();
411 }
412
413 /**
414 * Doit être implémentée par des classe dérivées.
415 * Permet de récupérer le document signé.
416 *
417 * @param array $data Liste des paramètres (dépend du connecteur).
418 * @return array Tableau de résultat retourné par le
419 * connecteur parapheur, sinon retourne une exception.
420 */
421 protected function get_signed_document(array $data) {
422 //
423 throw new electronicsignature_connector_method_not_implemented_exception();
424 }
425
426 }
427
428 /**
429 * Classe gérant les erreurs
430 */
431 class electronicsignature_exception extends Exception {
432
433 public function __construct($message = "", $code = 0, Exception $previous = null) {
434 parent::__construct($message, $code, $previous);
435 logger::instance()->writeErrorLogToFile();
436 logger::instance()->cleanLog();
437 }
438
439 protected function add_to_log($code, $message) {
440 logger::instance()->log(sprintf(
441 "Electronic Signature Connector - Error code : %s -> %s",
442 $code,
443 $message
444 ));
445 }
446 }
447
448 class electronicsignature_configuration_exception extends electronicsignature_exception {
449
450 public function __construct($message = null) {
451 $ret = trim(sprintf(
452 '%s %s %s',
453 __('Erreur de configuration du parapheur.'),
454 __('Veuillez contacter votre administrateur.'),
455 $message
456 ));
457 parent::__construct($ret);
458 }
459 }
460
461 class electronicsignature_parameter_exception extends electronicsignature_exception {
462
463 public function __construct($message = null) {
464 $ret = trim(sprintf(
465 '%s %s %s',
466 __("Les paramètres d'appel au parapheur ne sont pas valides."),
467 __('Veuillez contacter votre administrateur.'),
468 $message
469 ));
470 parent::__construct($ret);
471 }
472 }
473
474 class electronicsignature_connector_exception extends electronicsignature_exception {
475
476 public function __construct($message = null, $code = null) {
477 // Log de l'erreur technique
478 $this->add_to_log($code, $message);
479 // Log utilisateur
480 $ret = trim(sprintf(
481 '%s %s %s',
482 __('Erreur du parapheur.'),
483 __('Veuillez contacter votre administrateur.'),
484 $message
485 ));
486 parent::__construct($ret);
487 }
488 }
489
490 class electronicsignature_connector_method_not_implemented_exception extends electronicsignature_exception {
491
492 public function __construct($message = null) {
493 $ret = trim(sprintf(
494 '%s %s %s',
495 __("La méthode n'est pas implémentée dans le connecteur."),
496 __('Veuillez contacter votre administrateur.'),
497 $message
498 ));
499 parent::__construct($ret);
500 }
501 }

Properties

Name Value
svn:executable *

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26