setMessage('Pas implémenté');
return $this->KO;
}
protected function modifier($data, $msg_OK = null, $msg_KO = null) {
$this->setMessage('Pas implémenté');
return $this->KO;
}
protected function supprimer(&$data, $msg_OK, $msg_KO) {
$this->setMessage('Pas implémenté');
return $this->KO;
}
/**
* Mapping des correspondances entre PEC (id) et avis (code) :
* 2- Refusé pour pièce(s) manquante(s) ou inexploitable(s) => 7- Pas d'avis suite à déclaration d'incomplétude
* 3- Refusé pour autre motif => 5- Autre
* 4- Refusée pour information(s) manquante(s) => 5- Autre
* 5- Refusée après déclaration d'incomplétude du dossier => 7- Pas d'avis suite à déclaration d'incomplétude
* 6- Refusée car ne relève pas de la compétence du service => 5- Autre
*/
const MAPPING_PEC_AVIS = array(
'2' => '7',
'3' => '5',
'4' => '5',
'5' => '7',
'6' => '5',
);
/**
* Surcharge pour redéfinir le chemin du fichier de log
*/
function addToLog($message, $type = DEBUG_MODE, $method = '', $task_id = '') {
$logger = logger::instance();
$logger->log($method." ".(!empty($task_id) ? "task [$task_id] " : '').$this->log_prefix.$message, $type);
$prefix = sprintf(
"\t%11s\t%-25s\t%11s\t%25s\t",
$logger->types_to_show[$type],
(strlen($method) > 24 ? (substr($method, 0, 24).'…') : substr($method, 0, 25)),
(! empty($task_id) ? "task [$task_id] " : ''),
$this->log_prefix);
foreach(explode("\n", $message) as $line) {
$logger->log_to_file("task.log", $prefix.$line);
}
}
/**
* Renvoie le nom de la classe du 'processeur' permettant de traiter la tâche spécifiée.
*
* @param $tache La tâche à traiter.
*
* @return Array & Callable Une fonction appelable, pour traiter la tâche
*
* @throw InvalidArgumentException Lorsque que le type de tâche n'est pas supporté/invalide
*/
protected function _getProcessorFromTache($tache) {
switch($tache->getVal('type')) {
case 'create_DI_for_consultation': return array($this, 'create_DI_for_consultation');
case 'create_DI': return array($this, 'create_DI');
case 'add_piece': return array($this, 'add_piece');
case 'pec_metier_consultation': return array($this, 'pec_metier_consultation');
case 'avis_consultation': return array($this, 'avis_consultation');
case 'create_message': return array($this, 'create_message');
}
$task_id = $tache->getVal('task');
throw new InvalidArgumentException(sprintf(
__("Type de tâche '%s' non supporté"), $tache->getVal('type')));
}
/**
* Traite toutes les tâches, éventuellement seulement celles spécifiées par un type.
*
* @param string $statut Un statut de tâche à traiter
* @param string $type Un type de tâche à traiter
*
* @return Array Un tableau contenant le récapitulatif des traitements
*
* @throw RuntimeException Lorsqu'il y a un échec pendant le traitement d'une tâche
*/
public function traitement(array $requestData) {
try {
$this->addToLog('request data = '.var_export($requestData, true), VERBOSE_MODE, __METHOD__);
$statut = isset($requestData['statut']) ? $requestData['statut'] : task::STATUS_NEW;
$type = isset($requestData['type']) ? $requestData['type'] : '';
$category = isset($requestData['category']) ? $requestData['category'] : '';
$platau_actors_set = isset($requestData['platau_actors_set']) ? $requestData['platau_actors_set'] : null;
$this->log_prefix = '';
$this->addToLog(
'statut = '.var_export($statut, true).', '.
'type = '.var_export($type, true).', '.
'category = '.var_export($category, true).', '.
'platau_actors_set = '.var_export($platau_actors_set, true), VERBOSE_MODE, __METHOD__);
// vérification de la disponibilité du stockage des documents (GED en général)
if (! $this->f->storage->is_service_available()) {
$err_msg = __("Service de stockage des documents indisponible");
$this->addToLog(__METHOD__."(): $err_msg", DEBUG_MODE, __METHOD__);
throw new Exception($err_msg);
}
// construit le filtre SQL (clause WHERE)
$filtreSQL = "stream = 'input' AND json_payload <> '{}'";
$filtreSQL .= sprintf(" AND state = '%s'", $this->f->db->escapeSimple($statut));;
if (! empty($type)) {
$filtreSQL .= sprintf(" AND type = '%s'", $this->f->db->escapeSimple($type));
}
if (empty($category) === false) {
$filtreSQL .= sprintf(" AND category = '%s'", $this->f->db->escapeSimple($category));
}
if (! empty($platau_actors_set) || $platau_actors_set === 0) {
$this->log_prefix = "[actors set: ".var_export($platau_actors_set, true)."] ";
$platau_actors_filepath = dirname(dirname(__DIR__)).'/dyn/platau_actors.inc.php';
if (! file_exists($platau_actors_filepath)) {
$err_msg = __("Fichier de configuration des acteurs non trouvé.");
$this->addToLog(__METHOD__."(): $err_msg", DEBUG_MODE, __METHOD__);
throw new Exception($err_msg);
}
$platau_actors_sets = include $platau_actors_filepath;
if (! empty($platau_actors_sets)) {
if (isset($platau_actors_sets[$platau_actors_set]) && ! empty($platau_actors_sets[$platau_actors_set])) {
$filtreSQL .= " AND regexp_replace(json_payload, '(?'external_uids'->>'acteur' IN ('".
implode("','", $platau_actors_sets[$platau_actors_set]).
"')";
}
}
}
// exécution de la requête
$sql = sprintf('SELECT task FROM '.DB_PREFIXE.'task %s ORDER BY task ASC',
! empty($filtreSQL) ? "WHERE $filtreSQL" : '');
$this->addToLog(__METHOD__."(): sql query: $sql", VERBOSE_MODE, __METHOD__);
$qres = $this->f->get_all_results_from_db_query($sql, array( "origin" => __METHOD__));
if ($qres['code'] == 'KO') {
$err_msg = sprintf(__("erreur SQL sur la table '%s': %s"), 'task', $qres['message']);
$this->addToLog(__METHOD__."(): $err_msg", DEBUG_MODE, __METHOD__);
throw new Exception($err_msg);
}
$this->addToLog(__METHOD__."(): sql result count: ".$qres['row_count'], VERBOSE_MODE, __METHOD__);
// stocke le résultat et les succès/échecs
$success = array();
$failures = array();
// pour chaque tâche
foreach ($qres['result'] as $result) {
$task_id = $result['task'];
$tache = $this->f->findObjectById('task', $task_id);
$desc = $this->_getTacheDesc($tache);
$this->addToLog('task: '.$desc, VERBOSE_MODE, __METHOD__, $task_id);
$type = $tache->getVal('type');
// si l'état de la tâche n'est pas 'new' (ou le statut spécifié) on ignore la
// tâche, car elle a probablement été traitée par un autre processus en parallèle.
// Cela n'est pas souhaitable, pour des raisons de non-garantie de l'ordre des
// requêtes, mais qui peut arriver à cause d'un mauvais paramétrage du déclenchement
// de ce traitement
if (($task_state = $tache->getVal('state')) != $statut) {
$this->addToLog("ignorée (son état est '$task_state' != '$statut')",
VERBOSE_MODE, __METHOD__, $task_id);
continue;
}
// selon le type de la tâche invoquer un "processeur"
// qui réalisera le traitement de cette tâche
// stocker les succès et les échecs
if (empty($type)) {
$this->_setTaskState($tache, task::STATUS_INVALID);
$failures[$desc] = "Attribut 'type' vide";
}
else {
$processorCallable = $this->_getProcessorFromTache($tache);
if (isset($processorCallable[0]) != $this) {
$processorClass = $processorCallable[0].'.class.php';
$processorClassPath = PROJECT_ROOT.'/obj/'.$processorClass;
if (file_exists($processorClassPath)) {
require_once $processorClassPath;
$processor = new $processorName($this->f, $this->APILogger);
$processorMethod = isset($processorCallable[1]) ? $processorCallable[1] : 'process';
$processorCallable = array($processor, $processorMethod);
}
}
if (is_callable($processorCallable)) {
$this->_setTaskState($tache, task::STATUS_PENDING);
$result = array();
try {
$result = call_user_func_array($processorCallable, array($tache));
}
catch(Exception $exception) {
$result['error'] = get_class($exception).' : '.$exception->getMessage();
}
if (isset($result['error']) && ! empty($result['error'])) {
$this->_setTaskState($tache, task::STATUS_ERROR);
$failures[$desc] = $result['error'];
}
elseif ($result === false) {
$this->_setTaskState($tache, task::STATUS_ERROR);
$failures[$desc] = 'erreur';
}
else {
if ($type == 'create_DI') {
$this->_setTaskStateAndObjId($tache, task::STATUS_DONE, $result['dossier']);
} else {
$this->_setTaskState($tache, task::STATUS_DONE);
}
$success_message = 'succès';
if (is_array($result) && isset($result['message'])) {
$success_message = $result['message'];
}
$success[$desc] = $success_message;
}
}
else {
$this->_setTaskState($tache, task::STATUS_INVALID);
$failures[$desc] = "Processeur '".var_export($processorCallable, true)."' invalide pour la tâche '$desc'";
}
}
}
// s'il y a eu des échecs de traitements
if (! empty($failures)) {
$this->addToLog("il y a eu des échecs de traitements", DEBUG_MODE, __METHOD__);
// renvoyer un code HTTP adapté ainsi que les erreurs rencontrées
$errorMsg = "Les tâches suivantes ont rencontrées un échec pendant leur traitement :\n";
foreach($failures as $tacheDesc => $error) {
$this->addToLog("* $tacheDesc => $error", DEBUG_MODE, __METHOD__);
$errorMsg .= " - $tacheDesc: $error\n";
}
if(! empty($success)) {
$errorMsg .= "\nLes tâches suivantes ont été traitées avec succès :\n";
foreach($success as $tacheDesc => $msg) {
$this->addToLog("* $tacheDesc => $msg", DEBUG_MODE, __METHOD__);
$errorMsg .= " - $tacheDesc: $msg\n";
}
}
throw new RuntimeException($errorMsg);
}
// si tout s'est bien passé :
// renvoyer un code HTTP adapté et le résultat obtenu (un tableau)
$this->addToLog("succès des traitements", VERBOSE_MODE, __METHOD__);
if (! empty($success)) {
$this->setMessage(implode('\n', array_map(
function($desc, $msg) { return $desc.' : '.$msg; },
array_keys($success), $success)));
}
return $this->OK;
}
catch(InvalidArgumentException $exc) {
$this->setMessage($exc->getMessage());
return $this->BAD_DATA;
}
catch(Exception $exc) {
$this->setMessage($exc->getMessage());
return $this->KO;
}
}
/**
* Renvoie une description textuelle d'une tâche (composée de son ID, son type et le dossier).
*
* @param $tache La tâche concernée
*
* @return string la description textuelle de la tâche
*/
protected function _getTacheDesc($tache) {
return '['.$tache->getVal('task').'] '.$tache->getVal('type').' '.$tache->getVal('dossier');
}
/**
* Met à jours l'état d'une tâche.
*
* @param $tache La tâche concernée
*
* @return taskProcessorDemande
*/
protected function _setTaskState($tache, string $statut) {
$tache->update_task(array('val' => array('state' => $statut)));
return $this;
}
/**
* Met à jours l'état et le champ object_id d'une tâche.
*
* @param $tache La tâche concernée
* @param $statut Le statut de la tâche
* @param $dossier Le numéro de dossier lié à la tâche
*
* @return taskProcessorDemande
*/
protected function _setTaskStateAndObjId($tache, string $statut, $dossier) {
$tache->update_task(array('val' => array('state' => $statut), 'object_id' => $dossier));
return $this;
}
/**
* Traite les tâches de type 'creation_DI'.
*
* @param $tache La tâche à traiter
*
* @return Array|false Un tableau contenant le résultat du traitement, false en cas d'erreur
*
* @throw InvalidArgumentException En cas de donnée utilisateur invalide ou manquante
* @throw RuntimeException En cas d'erreur BDD
*/
protected function create_DI_for_consultation($tache) {
$task_id = $tache->getVal('task');
// TODO code présent dans create_DI_for_consultation, voir si on peut factoriser
$this->addToLog("Décode le json", VERBOSE_MODE, __METHOD__, $task_id);
$request_data = json_decode($tache->getVal('json_payload'), true);
if (json_last_error() !== JSON_ERROR_NONE) {
throw new InvalidArgumentException(sprintf(
__("échec du décodage JSON (%s)"),
json_last_error_msg()));
}
$request_data['source_depot'] = PLATAU;
if ($tache->getVal('category') === PORTAL) {
//
$request_data['source_depot'] = PORTAL;
}
$dossier_info = $this->add_new_demande($tache, $request_data);
$dossier_instruction_id = $dossier_info['dossier_instruction_id'];
$dossier_libelle = $dossier_info['dossier_libelle'];
//
if (isset($request_data['consultation']) === true
&& is_array($request_data['consultation']) === true
&& count($request_data['consultation']) > 0) {
//
$valF = $request_data['consultation'];
$inst_ce = $this->f->get_inst__om_dbform(array(
"obj" => "consultation_entrante",
"idx" => ']',
));
$valF['consultation_entrante'] = '';
$valF['dossier'] = $dossier_instruction_id;
$add = $inst_ce->ajouter($this->adapt_payload_values($inst_ce->table, $valF));
$message = $inst_ce->msg;
if ($add === false) {
throw new RuntimeException(__("Erreur lors de la création de la consultation entrante.").' '.
sprintf(__("Détail: %s"), strip_tags(str_replace('
', '. ', $message))));
}
}
// Ajout des données techniques dans le dossier d'instruction
$dt_values = $this->prepare_donnees_techniques_data($request_data);
if (count($dt_values) > 0) {
$inst_dt_empty = $this->f->get_inst__om_dbform(array(
"obj" => "donnees_techniques",
"idx" => 0,
));
$id_dt = $inst_dt_empty->get_id_by_dossier($dossier_instruction_id);
$inst_dt = $this->f->get_inst__om_dbform(array(
"obj" => "donnees_techniques",
"idx" => $id_dt,
));
$valF = array_combine($inst_dt->champs, $inst_dt->val);
$valF = array_merge($valF, $dt_values);
$inst_dt->setParameter('maj', 1);
$edit = $inst_dt->modifier($this->adapt_payload_values($inst_dt->table, $valF));
$message = $inst_dt->msg;
if ($edit === false) {
throw new RuntimeException(sprintf(
"%s %s",
sprintf(__("Erreur lors de la modification des données techniques du dossier d'instruction %s."), $dossier_libelle),
sprintf(__("Détail: %s"), strip_tags(str_replace('
', '. ', $message)))
));
}
}
return array(
"message" => sprintf(
__("dossier instruction '%s' créé"),
$dossier_libelle
),
);
}
/**
* Traite les tâches de type 'create_DI'.
*
* @param $tache La tâche à traiter
*
* @return Array|false Un tableau contenant le résultat du traitement, false en cas d'erreur
*
* @throw InvalidArgumentException En cas de donnée utilisateur invalide ou manquante
* @throw RuntimeException En cas d'erreur BDD
*/
protected function create_DI($tache) {
$task_id = $tache->getVal('task');
// TODO code présent dans create_DI_for_consultation, voir si on peut factoriser
$this->addToLog("Décode le json", VERBOSE_MODE, __METHOD__, $task_id);
$request_data = json_decode($tache->getVal('json_payload'), true);
if (json_last_error() !== JSON_ERROR_NONE) {
throw new InvalidArgumentException(sprintf(
__("échec du décodage JSON (%s)"),
json_last_error_msg()));
}
$request_data['type_task'] = 'create_DI';
$request_data['source_depot'] = PLATAU;
if ($tache->getVal('category') === PORTAL) {
//
$request_data['source_depot'] = PORTAL;
}
$dossier_info = $this->add_new_demande($tache, $request_data);
$dossier_instruction_id = $dossier_info['dossier_instruction_id'];
$dossier_libelle = $dossier_info['dossier_libelle'];
// Ajout des données techniques dans le dossier d'instruction
$dt_values = $this->prepare_donnees_techniques_data($request_data);
if (count($dt_values) > 0) {
$inst_dt_empty = $this->f->get_inst__om_dbform(array(
"obj" => "donnees_techniques",
"idx" => 0,
));
$id_dt = $inst_dt_empty->get_id_by_dossier($dossier_instruction_id);
$inst_dt = $this->f->get_inst__om_dbform(array(
"obj" => "donnees_techniques",
"idx" => $id_dt,
));
$valF = array_combine($inst_dt->champs, $inst_dt->val);
$valF = array_merge($valF, $dt_values);
$inst_dt->setParameter('maj', 1);
$edit = $inst_dt->modifier($this->adapt_payload_values($inst_dt->table, $valF));
$message = $inst_dt->msg;
if ($edit === false) {
throw new RuntimeException(sprintf(
"%s %s",
sprintf(__("Erreur lors de la modification des données techniques du dossier d'instruction %s."), $dossier_libelle),
sprintf(__("Détail: %s"), strip_tags(str_replace('
', '. ', $message)))
));
}
}
return array(
"message" => sprintf(
__("dossier instruction '%s' créé"),
$dossier_libelle
),
"dossier" => $dossier_instruction_id,
);
}
/**
* Permet d'ajouter la demande à partir d'une tâche entrante.
*
* @param $tache La tâche à traiter.
* @param $request_data Le payload de la tâche décodé.
*
* @return Array Un tableau contenant l'identifiant du dossier et sont libellé.
* @throw InvalidArgumentException En cas de donnée utilisateur invalide ou manquante
*/
protected function add_new_demande($tache, $request_data) {
global $_POST;
// TODO gérer l'ajout de demande sur existant
// (on ne connait pas le format des données arrivant)
$task_id = $tache->getVal('task');
// ajout d'une nouvelle demande
// retraitement spécifique des données de la nouvelle demande
$this->addToLog("Prépare les données de la nouvelle demande", VERBOSE_MODE, __METHOD__, $task_id);
$demande_values = $this->prepare_new_demande_data($request_data, $task_id);
// retraitement commun des données de la demande
$this->addToLog("Prépare les données de la demande", VERBOSE_MODE, __METHOD__, $task_id);
$demande_values = $this->prepare_demande_data($request_data, $demande_values, $task_id);
// vérification des externals UUIDs
if (! isset($request_data['external_uids']) || empty($request_data['external_uids'])) {
throw new InvalidArgumentException(sprintf(
__("Aucune valeur pour le paramètre '%s'"),
'external_uids'));
}
// utilisation d'un faux $_POST pour stocker les demandeurs de la demande
$_POST = array();
// Récupération du type de la demande
$inst_demande_type = null;
if (isset($demande_values['demande_type']) === true
&& empty($demande_values['demande_type']) === false) {
//
$inst_demande_type = $this->f->get_inst__om_dbform(array(
"obj" => "demande_type",
"idx" => $demande_values['demande_type'],
));
}
// Récupération du dossier d'autorisation s'il s'agit d'une demande sur existant
$inst_da = null;
if (isset($demande_values['dossier_autorisation']) === true
&& empty($demande_values['dossier_autorisation']) === false) {
//
$inst_da = $this->f->get_inst__om_dbform(array(
"obj" => "dossier_autorisation",
"idx" => $demande_values['dossier_autorisation'],
));
}
// Vérification du type de demande pour la gestion de l'adresse du terrain
// et des demandeurs
$create_all_demandeurs = true;
$create_only_others_demandeurs = false;
$get_exists_demandeurs = false;
if ($inst_demande_type !== null) {
// En cas de dépôt sur dossier existant
if (intval($inst_demande_type->getVal('demande_nature')) === 2) {
// L'adresse du terrain est récupérée depuis l'autorisation
if ($inst_da !== null) {
foreach ($inst_da->champs as $field) {
if (strpos($field, "terrain_") === 0) {
$demande_values[$field] = $inst_da->getVal($field);
}
}
}
// Gestion des demandeurs
if ($inst_demande_type->getVal('dossier_instruction_type') === null
|| $inst_demande_type->getVal('dossier_instruction_type') === '') {
// Si la demande n'ajoute pas de dossier d'instruction, alors
// aucun demandeur n'est ajouté
$create_all_demandeurs = false;
} else {
// Si la demande ajoute une nouveau dossier d'instruction, alors
// par défaut récupère les demandeurs du DA
$get_exists_demandeurs = true;
switch ($inst_demande_type->getVal('contraintes')) {
// Récupération des demandeurs sans modification avec ajout
case 'avec_r_sm_aa':
$create_all_demandeurs = false;
$create_only_others_demandeurs = true;
break;
// Récupération des demandeurs sans modification ni ajout
case 'avec_r_sma':
$create_all_demandeurs = false;
break;
// Sans récupération des demandeurs
case 'sans_recup':
$get_exists_demandeurs = false;
break;
}
}
}
}
// Ajout des demandeurs (même le principal)
// ou ajout des demandeurs (excepté le principal)
if ($create_all_demandeurs === true
|| $create_only_others_demandeurs === true) {
//
$this->addToLog("Créé les demandeurs", VERBOSE_MODE, __METHOD__, $task_id);
if (! isset($request_data['demandeur']) && ! empty($request_data['demandeur'])) {
throw new InvalidArgumentException(sprintf(
__("Aucune valeur pour le paramètre '%s'"),
'demandeur'));
}
foreach ($request_data["demandeur"] as $d_index => $demandeur_valeurs) {
if (! isset($demandeur_valeurs['type_demandeur']) ||
empty($demandeur_valeurs['type_demandeur'])) {
throw new InvalidArgumentException(sprintf(
__("Aucun type pour le demandeur '%s'"), $d_index));
}
$demandeur_type = $demandeur_valeurs['type_demandeur'];
// La gestion du demandeur principal se fait seulement dans le cas
// d'ajout de tout les demandeurs
if ($create_all_demandeurs === true
&& isset($demandeur_valeurs["${demandeur_type}_principal"])
&& $demandeur_valeurs["${demandeur_type}_principal"] === 't') {
//
$demandeur_type = "${demandeur_type}_principal";
$demandeur_valeurs['type_demandeur'] = $demandeur_type;
}
$demandeur_id = $this->creation_demandeur(
$demandeur_type, $demandeur_valeurs, $demande_values['om_collectivite']);
if (isset($_POST[$demandeur_type]) === false) {
$_POST[$demandeur_type] = array();
}
$_POST[$demandeur_type][] = $demandeur_id;
}
}
// Récupération des demandeurs du dossier d'autorisation
if ($get_exists_demandeurs === true) {
// Récupère la liste des demandeurs
$list_demandeur = $inst_da->get_list_demandeur('dossier_autorisation', $inst_da->getVal($inst_da->clePrimaire));
foreach ($list_demandeur as $demandeur_valeurs) {
$demandeur_type = $demandeur_valeurs['type_demandeur'];
// Gestion du demandeur principal
if ($demandeur_valeurs["petitionnaire_principal"] === 't') {
// Si dans la récupération des demandeur il y a un principal
// et que la nouvelle demande apporte un nouveau principal,
// alors le principal existant n'est pas récupéré
if (isset($_POST["${demandeur_type}_principal"]) === true) {
continue;
}
// Sinon le principal existant est récupéré
$demandeur_type = "${demandeur_type}_principal";
}
$_POST[$demandeur_type][] = $demandeur_valeurs['demandeur'];
}
}
//
$demande_values['source_depot'] = PLATAU;
if (isset($request_data['source_depot']) === true
&& $request_data['source_depot'] !== ''
&& $request_data['source_depot'] !== null) {
//
$demande_values['source_depot'] = $request_data['source_depot'];
}
$demande_values['etat_transmission_platau'] = 'non_transmissible';
if (isset($demande_values['source_depot']) === true
&& ($demande_values['source_depot'] == PLATAU
|| $demande_values['source_depot'] == PORTAL)) {
//
$demande_values['etat_transmission_platau'] = 'transmissible';
}
// création de l'objet demande
$demande = $this->f->get_inst__om_dbform(array(
"obj" => "demande",
"idx" => "]",
));
// Prise en compte des faux POST
$this->f->submitted_post_value = array();
$this->f->set_submitted_value();
$demande->getPostedValues();
$this->addToLog("Ajoute la demande", VERBOSE_MODE, __METHOD__, $task_id);
if ($demande->ajouter($this->adapt_payload_values($demande->table, $demande_values)) === false) {
throw new RuntimeException(__("Erreur lors de la création de la demande."));
}
elseif ($demande->correct === false) {
throw new RuntimeException(
__("Erreur lors de la création de la demande.").' '.
sprintf(__("Détail: %s"), strip_tags(str_replace('
', '. ', $demande->msg))));
}
$dossier_info = array();
$dossier_instruction_id = $demande->getVal('dossier_instruction');
$dossier_autorisation_id = $demande->getVal('dossier_autorisation');
$instruction_recepisse_id = $demande->getVal('instruction_recepisse');
$this->addToLog("DI créé: '$dossier_instruction_id'", VERBOSE_MODE, __METHOD__, $task_id);
if (empty($di_inst = $this->f->findObjectById('dossier', $dossier_instruction_id))) {
throw new RuntimeException(
"Erreur après la création du DI: dossier '$dossier_instruction_id' non-trouvé");
}
$dossier_libelle = $di_inst->getVal('dossier_libelle');
$this->addToLog("Libellé: '$dossier_libelle'", VERBOSE_MODE, __METHOD__, $task_id);
$dossier_info['dossier_instruction_id'] = $dossier_instruction_id;
$dossier_info['dossier_libelle'] = $dossier_libelle;
$dossier_info['instruction_recepisse_id'] = $instruction_recepisse_id;
//
$objects = $tache->get_objects_by_task_type($tache->getVal('type'), $tache->getVal('stream'));
if (is_array($request_data['external_uids']) === true) {
//
foreach ($request_data['external_uids'] as $object => $external_uid) {
// Dans le cas d'un dossier sur existant, si le dossier d'autorisation est
// présent dans les externals UID, alors on ne le traite pas
if ($object === 'dossier_autorisation'
&& isset($request_data['demande']["type_demande"]) === true
&& $request_data['demande']["type_demande"] !== 'initial') {
//
continue;
}
// Gestion de l'identifiant de l'objet
$object_id = $object == 'dossier_autorisation' ? $dossier_autorisation_id : $dossier_instruction_id;
// Dans le cas où la demande ne créée pas de nouveau dossier d'instruction
// l'identifiant est une instruction
if ($instruction_recepisse_id !== null
&& $instruction_recepisse_id !== '') {
//
$inst_demande_type = $this->f->get_inst__om_dbform(array(
"obj" => "demande_type",
"idx" => $demande->getVal('demande_type'),
));
if ($inst_demande_type->getVal('dossier_instruction_type') === null
|| $inst_demande_type->getVal('dossier_instruction_type') === '') {
//
$object_id = $instruction_recepisse_id;
}
}
//
if (in_array($object, $objects) === true
|| ($object === 'code-suivi')) {
//
$inst_lien = $this->f->get_inst__om_dbform(array(
"obj" => "lien_id_interne_uid_externe",
"idx" => ']',
));
if ($inst_lien->is_exists($object, $dossier_instruction_id, $external_uid, $dossier_instruction_id) === false) {
//
$valF = array(
'lien_id_interne_uid_externe' => '',
'object' => $object,
'object_id' => $object_id,
'external_uid' => $external_uid,
'dossier' => $dossier_instruction_id,
'category' => $tache->getVal('category'),
);
$add = $inst_lien->ajouter($this->adapt_payload_values($inst_lien->table, $valF));
$message = $inst_lien->msg;
if ($add === false) {
throw new RuntimeException(
__("Erreur lors de la création des liens de la demande.").' '.
sprintf(__("Détail: %s"), strip_tags(str_replace('
', '. ', $message))));
}
}
}
}
}
return $dossier_info;
}
/**
* Traite les tâches de type 'add_piece'.
*
* @param $tache La tâche à traiter
*
* @return Array|false Un tableau contenant le résultat du traitement, false en cas d'erreur
*
* @throw InvalidArgumentException Si le DA existe déjà ou si le numéro dossier est invalide
* @throw RuntimeException En cas d'erreur BDD
*/
protected function add_piece($tache) {
$task_id = $tache->getVal('task');
$this->addToLog("Décode le json", VERBOSE_MODE, __METHOD__, $task_id);
$request_data = json_decode($tache->getVal('json_payload'), true);
if (json_last_error() !== JSON_ERROR_NONE) {
throw new InvalidArgumentException("échec du décodage JSON (".json_last_error_msg().')');
}
// vérification de la présence des externals UUIDs
if (! isset($request_data['external_uids']) || empty($request_data['external_uids'])) {
throw new InvalidArgumentException(__(
"Aucune valeur pour l'external_uids"));
}
//
$collectiviteId = null;
if ($tache->getVal('category') !== PORTAL) {
// vérification de la présence du numéro de dossier
if(! isset($request_data['external_uids']['dossier']) ||
empty($request_data['external_uids']['dossier'])) {
throw new InvalidArgumentException(__("L'attribut external_uids.dossier n'est pas présent."));
}
// récupération de l'identifiant de collectivité
$collectiviteId = $this->get_collectivite_id_from_acteur_or_collectivite($request_data, $task_id);
}
// il faut que le dossier existe pour qu'on puis ajouter la pièce
$this->addToLog("Vérification de l'existance du dossier", VERBOSE_MODE, __METHOD__, $task_id);
// Comme la numérotation du dossier peut être différente entre le numéro de dossier openads et le numéro
// de dossier envoyé par Plat'AU on se base sur l'external uid pour vérifier si le dossier existe
// On instancie l'objet lien_id_interne_uid_externe
$inst_lien = $this->f->get_inst__om_dbform(array(
"obj" => "lien_id_interne_uid_externe",
"idx" => 0,
));
// instanciation d'un document numérisé "vide"
$this->addToLog("\tInitialise une instance de 'document_numerise'", VERBOSE_MODE, __METHOD__, $task_id);
$document_numerise = $this->f->get_inst__om_dbform(array(
"obj" => "document_numerise",
"idx" => "]",
));
// retraitement spécifique des données de la nouvelle pièce
$this->addToLog("Prépare les données de la nouvelle piece", VERBOSE_MODE, __METHOD__, $task_id);
$attachment_values = $this->prepare_attachment_data(
$request_data, $document_numerise, $inst_lien, $collectiviteId, $tache->getVal('category'), $task_id);
// Permet de spécifier que l'ajout de la pièce s'effectue à partir d'une tâche input
$_POST['external_uid_piece'] = $request_data['external_uids']['piece'];
$this->addToLog("Ajoute la pièce", VERBOSE_MODE, __METHOD__, $task_id);
$this->addToLog("Valeurs:\n---\n".var_export($attachment_values, true)."\n---\n", VERBOSE_MODE, __METHOD__, $task_id);
if ($document_numerise->ajouter($this->adapt_payload_values($document_numerise->table, $attachment_values)) === false) {
throw new RuntimeException(
__("Erreur lors de la création de la pièce.").' '.
sprintf(__("Détail: %s"), strip_tags(str_replace('
', '. ', $document_numerise->msg))));
}
elseif ($document_numerise->correct === false) {
throw new RuntimeException(
__("Erreur lors de la création de la pièce.").' '.
sprintf(__("Détail: %s"), strip_tags(str_replace('
', '. ', $document_numerise->msg))));
}
$document_numerise_id = $document_numerise->getVal('document_numerise');
$this->addToLog("pièce créée: '$document_numerise_id'", VERBOSE_MODE, __METHOD__, $task_id);
//
$objects = $tache->get_objects_by_task_type($tache->getVal('type'), $tache->getVal('stream'));
if (is_array($request_data['external_uids']) === true) {
//
foreach ($request_data['external_uids'] as $object => $external_uid) {
//
if (in_array($object, $objects) === true) {
//
$inst_lien = $this->f->get_inst__om_dbform(array(
"obj" => "lien_id_interne_uid_externe",
"idx" => ']',
));
if ($inst_lien->is_exists($object, $document_numerise_id, $external_uid, $attachment_values['dossier']) === false) {
//
$valF = array(
'lien_id_interne_uid_externe' => '',
'object' => $object,
'object_id' => $document_numerise_id,
'external_uid' => $external_uid,
'dossier' => $attachment_values['dossier'],
'category' => $tache->getVal('category'),
);
$add = $inst_lien->ajouter($this->adapt_payload_values($inst_lien->table, $valF));
$message = $inst_lien->msg;
if ($add === false) {
throw new RuntimeException(
__("Erreur lors de la création de la pièce.").' '.
sprintf(__("Détail: %s"), strip_tags(str_replace('
', '. ', $message))));
}
}
}
}
}
return array(
"message" => sprintf(
__("pièce : '%s' créée sur le dossier d'instruction '%s'"),
$document_numerise_id,
$attachment_values['dossier']
),
);
}
/**
* Traite les tâches de type 'pec_metier_consultation'.
*
* @param $tache La tâche à traiter
*
* @return Array|false Un tableau contenant le résultat du traitement, false en cas d'erreur
*
* @throw InvalidArgumentException En cas de donnée utilisateur invalide ou manquante
* @throw RuntimeException En cas d'erreur BDD
*/
protected function pec_metier_consultation($tache) {
$task_id = $tache->getVal('task');
$this->addToLog("Décode le json", VERBOSE_MODE, __METHOD__, $task_id);
$request_data = json_decode($tache->getVal('json_payload'), true);
if (json_last_error() !== JSON_ERROR_NONE) {
throw new InvalidArgumentException(
sprintf(__("échec du décodage JSON (%s)"), json_last_error_msg()));
}
// vérification de la présence des externals UUIDs
if (! isset($request_data['external_uids']) || empty($request_data['external_uids'])) {
throw new InvalidArgumentException(__("Aucune valeur pour l'external_uids"));
}
// On instancie l'objet lien_id_interne_uid_externe
$inst_lien = $this->f->get_inst__om_dbform(array(
"obj" => "lien_id_interne_uid_externe",
"idx" => 0,
));
$dossier_id = $inst_lien->get_id_dossier_from_external_uid_without_collectivite(
$request_data['external_uids']['dossier']
);
if (empty($dossier_id) === true) {
throw new InvalidArgumentException(sprintf(
__("Le dossier %s n'existe pas."),
$request_data['external_uids']['dossier']
));
}
$consultation_id = $inst_lien->get_id_consultation_from_external_uid(
$request_data['external_uids']['consultation'],
$dossier_id
);
if (empty($consultation_id) === true) {
throw new InvalidArgumentException(sprintf(
__("La consultation %s n'existe pas."),
$request_data['external_uids']['consultation']
));
}
//
$inst_consultation = $this->f->get_inst__om_dbform(array(
"obj" => "consultation",
"idx" => $consultation_id,
));
$valF = array();
foreach($inst_consultation->champs as $id => $champ) {
$valF[$champ] = $inst_consultation->val[$id];
}
if (isset($request_data['document_numerise']) === true
&& empty($request_data['document_numerise']) === false) {
// Récupération du document
$file = $this->f->storage->get($request_data['document_numerise']['uid']);
if ($file === null || $file === OP_FAILURE) {
throw new RuntimeException(sprintf(
__("Erreur lors de la récupération du document %s."),
$request_data['document_numerise']['uid']
));
}
// Préparation des métadonnées du document
$new_metadata = $inst_consultation->getMetadata('fichier_pec');
$metadata = array_merge($file['metadata'], $new_metadata);
// On précise par le dernier paramètre qu'on est sur une pec
$metadata['filename'] = $inst_consultation->generate_filename($request_data['document_numerise']['uid'], null, null, true);
// Si le document est stocké dans le stockage alternatif
if (strpos($request_data['document_numerise']['uid'], $this->f->storage::ALTFS_SEP) !== false) {
// Création du document dans le stockage principal
$uid = $this->f->storage->create($file['file_content'], $metadata, "from_content");
if ($uid === null || $uid === OP_FAILURE) {
throw new RuntimeException(sprintf(
__("Erreur lors de la création du document %s depuis le stockage alternatif vers le stockage principal."),
$request_data['document_numerise']['uid']
));
}
// Suppression du document dans le stockage alternatif
$delete = $this->f->storage->delete($request_data['document_numerise']['uid']);
if ($delete === null || $delete === OP_FAILURE) {
throw new RuntimeException(sprintf(
__("Erreur lors de la suppression du document %s du stockage alternatif."),
$request_data['document_numerise']['uid']
));
}
} else {
$uid = $this->f->storage->update_metadata($request_data['document_numerise']['uid'], $metadata);
if ($uid === null || $uid === OP_FAILURE) {
throw new RuntimeException(sprintf(
__("Erreur lors de la mise à jour du document %s."),
$request_data['document_numerise']['uid']
));
}
}
// Modification de l'uid passé à document_numerise
$valF['fichier_pec'] = $uid;
}
$valF['date_reception'] = $request_data['pec_metier']['date_reception'];
$statut = $request_data['pec_metier']['statut_pec_metier'];
if (isset($statut) === true && $statut !== '2' && in_array($statut, array_keys(self::MAPPING_PEC_AVIS))) {
$inst_pec = $this->f->get_inst__om_dbform(array(
"obj" => "pec_metier",
"idx" => $statut,
));
$valF['date_retour'] = $request_data['pec_metier']['date_pec_metier'];
$valF['motif_pec'] = sprintf(
"%s
%s",
$inst_pec->getVal('libelle'),
$request_data['pec_metier']['texte_observations']
);
$valF['avis_consultation'] = $this->get_avis_consultation_id_by_code(self::MAPPING_PEC_AVIS[$statut]);
if ($valF['avis_consultation'] === false) {
throw new InvalidArgumentException(sprintf(
__("échec de la récupération de l'identifiant de l'avis de consultation depuis le code '%s'."),
self::MAPPING_PEC_AVIS[$statut]
));
}
}
if ($statut === '2') {
$inst_pec = $this->f->get_inst__om_dbform(array(
"obj" => "pec_metier",
"idx" => $request_data['pec_metier']['statut_pec_metier'],
));
//
$valF['date_retour'] = $request_data['pec_metier']['date_pec_metier'];
//
$types_pieces_manquantes = array();
if (empty($request_data['pec_metier']['types_pieces_manquantes']) === false) {
$inst_dn = $this->f->get_inst__om_dbform(array(
"obj" => "document_numerise",
"idx" => 0,
));
foreach ($request_data['pec_metier']['types_pieces_manquantes'] as $dnt_code) {
$dnt_idx = $inst_dn->get_document_numerise_type_id_by_code($dnt_code);
$inst_dnt = $this->f->get_inst__om_dbform(array(
"obj" => "document_numerise_type",
"idx" => $dnt_idx,
));
$inst_dossier = $this->f->get_inst__om_dbform(array(
"obj" => "dossier",
"idx" => $dossier_id,
));
$dit_id = $inst_dossier->getVal('dossier_instruction_type');
$types_pieces_manquantes[] = $inst_dn->get_libelle_piece_avec_nomenclature($inst_dnt->getVal('libelle'), $dnt_idx, $dit_id);
}
}
$valF['motif_pec'] = sprintf(
"%s%s%s",
$inst_pec->getVal('libelle'),
$request_data['pec_metier']['texte_observations'] !== '' ? sprintf('
%s', $request_data['pec_metier']['texte_observations']) : '',
$types_pieces_manquantes !== array() ? sprintf("
%s :
* %s", __("Pièces manquantes"), implode('
* ', $types_pieces_manquantes)) : ''
);
$valF['avis_consultation'] = $this->get_avis_consultation_id_by_code('7');
if ($valF['avis_consultation'] === false) {
throw new InvalidArgumentException(sprintf(
__("échec de la récupération de l'identifiant de l'avis de consultation depuis le code '%s'."),
self::MAPPING_PEC_AVIS[$statut]
));
}
}
if (isset($statut) === true && ($statut === '8')) {
$inst_pec = $this->f->get_inst__om_dbform(array(
"obj" => "pec_metier",
"idx" => $statut,
));
//
$valF['date_retour'] = $request_data['pec_metier']['date_pec_metier'];
//
$types_pieces_manquantes = array();
if (empty($request_data['pec_metier']['types_pieces_manquantes']) === false) {
$inst_dn = $this->f->get_inst__om_dbform(array(
"obj" => "document_numerise",
"idx" => 0,
));
foreach ($request_data['pec_metier']['types_pieces_manquantes'] as $dnt_code) {
$dnt_idx = $inst_dn->get_document_numerise_type_id_by_code($dnt_code);
$inst_dnt = $this->f->get_inst__om_dbform(array(
"obj" => "document_numerise_type",
"idx" => $dnt_idx,
));
$inst_dossier = $this->f->get_inst__om_dbform(array(
"obj" => "dossier",
"idx" => $dossier_id,
));
$dit_id = $inst_dossier->getVal('dossier_instruction_type');
$types_pieces_manquantes[] = $inst_dn->get_libelle_piece_avec_nomenclature($inst_dnt->getVal('libelle'), $dnt_idx, $dit_id);
}
}
$valF['motif_pec'] = sprintf(
"%s%s%s",
$inst_pec->getVal('libelle'),
$request_data['pec_metier']['texte_observations'] !== '' ? sprintf('
%s', $request_data['pec_metier']['texte_observations']) : '',
$types_pieces_manquantes !== array() ? sprintf("
%s :
* %s", __("Pièces manquantes"), implode('
* ', $types_pieces_manquantes)) : ''
);
}
// On set la paramètre maj à 100 pour utiliser l'action 100 "retour_consultation"
// qui permet de mettre à jour la consultation et quelle soit "non lu"
$inst_consultation->setParameter("maj", 100);
$edit = $inst_consultation->modifier($this->adapt_payload_values($inst_consultation->table, $valF));
$message = $inst_consultation->msg;
if ($edit === false) {
throw new RuntimeException(sprintf(
"%s %s",
sprintf(__("Erreur lors de la mise à jour de la consultation %s."), $consultation_id),
sprintf(__("Détail: %s"), strip_tags(str_replace('
', '. ', $message)))
));
}
//
$objects = $tache->get_objects_by_task_type($tache->getVal('type'), $tache->getVal('stream'));
if (is_array($request_data['external_uids']) === true) {
//
foreach ($request_data['external_uids'] as $object => $external_uid) {
//
if (in_array($object, $objects) === true) {
//
$inst_lien = $this->f->get_inst__om_dbform(array(
"obj" => "lien_id_interne_uid_externe",
"idx" => ']',
));
if ($inst_lien->is_exists($object, $consultation_id, $external_uid, $dossier_id) === false) {
//
$valF = array(
'lien_id_interne_uid_externe' => '',
'object' => $object,
'object_id' => $consultation_id,
'external_uid' => $external_uid,
'dossier' => $dossier_id,
'category' => $tache->getVal('category'),
);
$add = $inst_lien->ajouter($this->adapt_payload_values($inst_lien->table, $valF));
$message = $inst_lien->msg;
if ($add === false) {
throw new RuntimeException(sprintf(
"%s %s",
sprintf(__("Erreur lors de la sauvegarde des uid externes pour la prise en compte métier de la consultation %s."), $consultation_id),
sprintf(__("Détail: %s"), strip_tags(str_replace('
', '. ', $message)))
));
}
}
}
}
}
return array(
"message" => sprintf(
__("Consultation : '%s' mise à jour sur le dossier '%s'"),
$consultation_id,
$dossier_id
),
);
}
/**
* Traite les tâches de type 'avis_consultation'.
*
* @param $tache La tâche à traiter
*
* @return Array|false Un tableau contenant le résultat du traitement, false en cas d'erreur
*
* @throw InvalidArgumentException En cas de donnée utilisateur invalide ou manquante
* @throw RuntimeException En cas d'erreur BDD
*/
protected function avis_consultation($tache) {
$task_id = $tache->getVal('task');
$this->addToLog("Décode le json", VERBOSE_MODE, __METHOD__, $task_id);
$request_data = json_decode($tache->getVal('json_payload'), true);
if (json_last_error() !== JSON_ERROR_NONE) {
throw new InvalidArgumentException(
sprintf(__("échec du décodage JSON (%s)"), json_last_error_msg()));
}
// vérification de la présence des externals UUIDs
if (! isset($request_data['external_uids']) || empty($request_data['external_uids'])) {
throw new InvalidArgumentException(__("Aucune valeur pour l'external_uids"));
}
// On instancie l'objet lien_id_interne_uid_externe
$inst_lien = $this->f->get_inst__om_dbform(array(
"obj" => "lien_id_interne_uid_externe",
"idx" => 0,
));
$dossier_id = $inst_lien->get_id_dossier_from_external_uid_without_collectivite(
$request_data['external_uids']['dossier']
);
if (empty($dossier_id) === true) {
throw new InvalidArgumentException(sprintf(
__("Le dossier %s n'existe pas."),
$request_data['external_uids']['dossier']
));
}
$consultation_id = $inst_lien->get_id_consultation_from_external_uid(
$request_data['external_uids']['consultation'],
$dossier_id
);
if (empty($consultation_id) === true) {
throw new InvalidArgumentException(sprintf(
__("La consultation %s n'existe pas."),
$request_data['external_uids']['consultation']
));
}
//
$inst_consultation = $this->f->get_inst__om_dbform(array(
"obj" => "consultation",
"idx" => $consultation_id,
));
$valF = array();
foreach($inst_consultation->champs as $id => $champ) {
$valF[$champ] = $inst_consultation->val[$id];
}
$valF['date_retour'] = $request_data['avis']['date_avis'];
$valF['texte_fondement_avis'] = $request_data['avis']['texte_fondement_avis'];
$valF['texte_avis'] = $request_data['avis']['texte_avis'];
$valF['texte_hypotheses'] = $request_data['avis']['texte_hypotheses'];
$valF['nom_auteur'] = $request_data['avis']['nom_auteur'];
$valF['prenom_auteur'] = $request_data['avis']['prenom_auteur'];
$valF['qualite_auteur'] = $request_data['avis']['qualite_auteur'];
if (isset($request_data['document_numerise']) === true
&& empty($request_data['document_numerise']) === false) {
// Récupération du document
$file = $this->f->storage->get($request_data['document_numerise']['uid']);
if ($file === null || $file === OP_FAILURE) {
throw new RuntimeException(sprintf(
__("Erreur lors de la récupération du document %s."),
$request_data['document_numerise']['uid']
));
}
// Préparation des métadonnées du document
$new_metadata = $inst_consultation->getMetadata('fichier');
$metadata = array_merge($file['metadata'], $new_metadata);
$metadata['filename'] = $inst_consultation->generate_filename($request_data['document_numerise']['uid']);
// Si le document est stocké dans le stockage alternatif
if (strpos($request_data['document_numerise']['uid'], $this->f->storage::ALTFS_SEP) !== false) {
// Création du document dans le stockage principal
$uid = $this->f->storage->create($file['file_content'], $metadata, "from_content");
if ($uid === null || $uid === OP_FAILURE) {
throw new RuntimeException(sprintf(
__("Erreur lors de la création du document %s depuis le stockage alternatif vers le stockage principal."),
$request_data['document_numerise']['uid']
));
}
// Suppression du document dans le stockage alternatif
$delete = $this->f->storage->delete($request_data['document_numerise']['uid']);
if ($delete === null || $delete === OP_FAILURE) {
throw new RuntimeException(sprintf(
__("Erreur lors de la suppression du document %s du stockage alternatif."),
$request_data['document_numerise']['uid']
));
}
} else {
$uid = $this->f->storage->update_metadata($request_data['document_numerise']['uid'], $metadata);
if ($uid === null || $uid === OP_FAILURE) {
throw new RuntimeException(sprintf(
__("Erreur lors de la mise à jour du document %s."),
$request_data['document_numerise']['uid']
));
}
}
// Modification de l'uid passé à document_numerise
$valF['fichier'] = $uid;
}
$valF['avis_consultation'] = $this->get_avis_consultation_id_by_code($request_data['avis']['avis_consultation']);
if ($valF['avis_consultation'] === false) {
throw new InvalidArgumentException(sprintf(
__("échec de la récupération de l'identifiant de l'avis de consultation depuis le code '%s'."),
$request_data['avis']['avis_consultation']
));
}
$this->addToLog("Valeurs:\n---\n".var_export($valF, true)."\n---\n", VERBOSE_MODE, __METHOD__, $task_id);
// On set la paramètre maj à 100 pour utiliser l'action 100 "retour_consultation"
// qui permet de mettre à jour la consultation et quelle soit "non lu"
$inst_consultation->setParameter("maj", 100);
$edit = $inst_consultation->modifier($this->adapt_payload_values($inst_consultation->table, $valF));
$message = $inst_consultation->msg;
if ($edit === false) {
throw new RuntimeException(sprintf(
"%s %s",
sprintf(__("Erreur lors de la mise à jour de la consultation %s."), $consultation_id),
sprintf(__("Détail: %s"), strip_tags(str_replace('
', '. ', $message)))
));
}
//
$objects = $tache->get_objects_by_task_type($tache->getVal('type'), $tache->getVal('stream'));
if (is_array($request_data['external_uids']) === true) {
//
foreach ($request_data['external_uids'] as $object => $external_uid) {
//
if (in_array($object, $objects) === true) {
//
$inst_lien = $this->f->get_inst__om_dbform(array(
"obj" => "lien_id_interne_uid_externe",
"idx" => ']',
));
if ($inst_lien->is_exists($object, $consultation_id, $external_uid, $dossier_id) === false) {
//
$valF = array(
'lien_id_interne_uid_externe' => '',
'object' => $object,
'object_id' => $consultation_id,
'external_uid' => $external_uid,
'dossier' => $dossier_id,
'category' => $tache->getVal('category'),
);
$add = $inst_lien->ajouter($this->adapt_payload_values($inst_lien->table, $valF));
$message = $inst_lien->msg;
if ($add === false) {
throw new RuntimeException(sprintf(
"%s %s",
sprintf(__("Erreur lors de la sauvegarde des uid externes pour l'avis de la consultation %s."), $consultation_id),
sprintf(__("Détail: %s"), strip_tags(str_replace('
', '. ', $message)))
));
}
}
}
}
}
return array(
"message" => sprintf(
__("Consultation : '%s' mise à jour sur le dossier '%s'"),
$consultation_id,
$dossier_id
),
);
}
/**
*
*/
protected function create_message($tache) {
$task_id = $tache->getVal('task');
// Récupère et decode le json
// TODO code présent dans creéate_DI et create_DI_for_consultation, voir si on peut factoriser
$this->addToLog("Décode le json", VERBOSE_MODE, __METHOD__, $task_id);
$request_data = json_decode($tache->getVal('json_payload'), true);
if (json_last_error() !== JSON_ERROR_NONE) {
throw new InvalidArgumentException(sprintf(
__("échec du décodage JSON (%s)"),
json_last_error_msg()));
}
// Vérification de la présence des externals UIDS
if (! isset($request_data['external_uids']) || empty($request_data['external_uids'])) {
throw new InvalidArgumentException(sprintf(
__("Aucune valeur pour le paramètre '%s'"),
'external_uids'));
}
// Vérification de la présence de l'uid du dossier
if (! isset($request_data['external_uids']['dossier']) || empty($request_data['external_uids']['dossier'])) {
throw new InvalidArgumentException(__("L'attribut external_uids.dossier n'est pas présent."));
}
// Récupération de l'id du dossier
$inst_lien = $this->f->get_inst__om_dbform(array(
"obj" => "lien_id_interne_uid_externe",
"idx" => ']',
));
$external_uid = $request_data['external_uids']['dossier'];
$idDossier = $inst_lien->get_id_dossier_from_external_uid_without_collectivite($external_uid);
if (empty($idDossier)) {
throw new InvalidArgumentException(
sprintf(
__("Échec de l'obtention du dossier %s"),
$external_uid
)
);
}
// Vérifie qu'il y a bien un message a ajouter
if (! isset($request_data['message']) || empty($request_data['message'])) {
throw new InvalidArgumentException(__("L'attribut external_uids.message n'est pas présent."));
}
// Récupération du paramétrage du message
$parametres = array('type', 'contenu', 'categorie');
foreach ($parametres as $parametre) {
${$parametre} = isset($request_data['message'][$parametre]) ?
$request_data['message'][$parametre] :
null;
}
// Ajout du message au dossier
$inst_dossier_message = $this->f->get_inst__om_dbform(array(
"obj" => "dossier_message",
"idx" => ']',
));
$dossier_message_val = array(
'dossier' => $idDossier,
'type' => $type,
'emetteur' => $this->f->get_connected_user_login_name(),
'login' => $_SESSION['login'],
'date_emission' => date('Y-m-d H:i:s'),
'contenu' => $contenu,
'categorie' => $categorie
);
$add = $inst_dossier_message->add_notification_message($dossier_message_val);
// Si une erreur se produit pendant l'ajout
if ($add !== true) {
throw new RuntimeException(__("Le message de notification n'a pas pu être ajouté."));
}
}
/**
* Ré-organise les données reçues pour qu'elles puissent être utilisées en tant que
* paramètre de la méthode document_numerise::ajouter().
*
* @param array $request_data données reçues
* @param object $inst_doc_num instance de document_numerise
* @param object $inst_lien instance de lien_id_interne_uid_externe
* @param int $collectiviteId identifiant de la collectivité du dossier de la pièce
* @param string $category catégorie de la tâche
*
* @return array données ré-organisées
*
* @throw InvalidArgumentException Lorsque une donnée utilisateur est invalide ou manquante
* @throw RuntimeException En cas d'échec lors du traitement du document
*/
protected function prepare_attachment_data(array $request_data, $inst_doc_num, $inst_lien,
$collectiviteId, $category = PLATAU,
$task_id = null) {
$this->addToLog("\tRempli une instance de 'document_numerise'", VERBOSE_MODE, __METHOD__, $task_id);
$attachment_values = array();
$this->addToLog("\tRempli un tableau qui contiendra les données ".
"de la piece", VERBOSE_MODE, __METHOD__, $task_id);
foreach ($inst_doc_num->champs as $value) {
$attachment_values[$value] = null;
if (isset($request_data['document_numerise'][$value])) {
$attachment_values[$value] = $request_data['document_numerise'][$value];
}
if($value == 'document_numerise_type'
&& isset($request_data['document_numerise']['document_numerise_type_code'])) {
//
$attachment_values["document_numerise_type"] = $inst_doc_num->get_document_numerise_type_id_by_code($request_data['document_numerise']['document_numerise_type_code']);
if($attachment_values['document_numerise_type'] === false
|| empty($attachment_values['document_numerise_type']) === true) {
//
throw new InvalidArgumentException(sprintf(
__("Le type de pièce avec le code %s n'existe pas"),
$request_data['document_numerise']['document_numerise_type_code']
));
}
}
}
// sélectionne la référence externe la plus pertinente
// - dossier_consultation: si spécifiée
// - dossier: sinon
if ($category === PLATAU) {
$ref_external_uid = $request_data['external_uids']['dossier'];
$type_external_uid = 'dossier';
$err_external_uid = __("Le dossier %s n'existe pas.");
if(isset($request_data['external_uids']['dossier_consultation']) &&
! empty($request_data['external_uids']['dossier_consultation'])) {
//
$ref_external_uid = $request_data['external_uids']['dossier_consultation'];
$type_external_uid = 'dossier_consultation';
$err_external_uid = __("La consultation %s n'existe pas.");
}
} elseif ($category === PORTAL) {
$ref_external_uid = $request_data['external_uids']['demande'];
$type_external_uid = 'demande';
$err_external_uid = __("Le dossier %s n'existe pas.");
}
// récupération de l'id dossier openADS à partir de l'uid externe
if ($collectiviteId !== null) {
$attachment_values['dossier'] = $inst_lien->get_id_dossier_from_external_uid($ref_external_uid, $collectiviteId, $type_external_uid);
} else {
$attachment_values['dossier'] = $inst_lien->get_id_dossier_from_external_uid_without_collectivite($ref_external_uid, $type_external_uid);
}
//
if (empty($attachment_values['dossier']) === true) {
if ($collectiviteId !== null) {
$attachment_values['dossier'] = $inst_lien->get_id_dossier_from_external_uid($ref_external_uid, $collectiviteId, $type_external_uid, 'dossier');
} else {
$attachment_values['dossier'] = $inst_lien->get_id_dossier_from_external_uid_without_collectivite($ref_external_uid, $type_external_uid, 'dossier');
}
}
//
if (empty($attachment_values['dossier']) === true) {
throw new InvalidArgumentException(sprintf($err_external_uid, $ref_external_uid));
}
// Renomme le fichier si l'option est activée
if ($this->f->is_option_renommage_document_numerise_tache_enabled() === true) {
//
$extension = '';
$pos_extension = strpos($attachment_values['nom_fichier'], ".");
if ($pos_extension !== false) {
$extension = strtolower(substr($attachment_values['nom_fichier'], $pos_extension));
}
$attachment_values['nom_fichier'] = $inst_doc_num->generate_filename($attachment_values['date_creation'], $attachment_values["document_numerise_type"], $extension, $attachment_values['dossier']);
}
// Si le document est enregistré dans un alternate filestorage
if (isset($attachment_values['uid']) === true
&& empty($attachment_values['uid']) !== true) {
// Récupération du document
$file = $this->f->storage->get($attachment_values['uid']);
if ($file === null || $file === OP_FAILURE) {
throw new RuntimeException(sprintf(
__("Erreur lors de la récupération du document %s."),
$attachment_values['uid']
));
}
// Préparation des métadonnées du document
$inst_doc_num->valF["dossier"] = $attachment_values['dossier'];
$inst_doc_num->valF["date_creation"] = $file['metadata']['date_creation'];
$inst_doc_num->valF["document_numerise_type"] = $attachment_values["document_numerise_type"];
$inst_doc_num->valF["nom_fichier"] = $file['metadata']['filename'];
// Renomme le fichier si l'option est activée
if ($this->f->is_option_renommage_document_numerise_tache_enabled() === true) {
$extension = '';
$pos_extension = strpos($file['metadata']['filename'], ".");
if ($pos_extension !== false) {
$extension = strtolower(substr($file['metadata']['filename'], $pos_extension));
}
$inst_doc_num->valF["nom_fichier"] = $inst_doc_num->generate_filename($file['metadata']['date_creation'], $attachment_values["document_numerise_type"], $extension, $attachment_values['dossier']);
}
$new_metadata = $inst_doc_num->getMetadata('uid');
$metadata = array_merge($file['metadata'], $new_metadata);
// Si le document est stocké dans le stockage alternatif
if (strpos($attachment_values['uid'], $this->f->storage::ALTFS_SEP) !== false) {
// Création du document dans le stockage principal
$uid = $this->f->storage->create($file['file_content'], $metadata, "from_content");
if ($uid === null || $uid === OP_FAILURE) {
throw new RuntimeException(sprintf(
__("Erreur lors de la création du document %s depuis le stockage alternatif vers le stockage principal."),
$attachment_values['uid']
));
}
// Suppression du document dans le stockage alternatif
$delete = $this->f->storage->delete($attachment_values['uid']);
if ($delete === null || $delete === OP_FAILURE) {
throw new RuntimeException(sprintf(
__("Erreur lors de la suppression du document %s du stockage alternatif."),
$attachment_values['uid']
));
}
} else {
$uid = $this->f->storage->update_metadata($attachment_values['uid'], $metadata);
if ($uid === null || $uid === OP_FAILURE) {
throw new RuntimeException(sprintf(
__("Erreur lors de la mise à jour du document %s."),
$attachment_values['uid']
));
}
}
// Modification de l'uid passé à document_numerise
$attachment_values['uid'] = $uid;
}
return $attachment_values;
}
/**
* Ré-organise les données reçues pour qu'elles puissent être utilisées en tant que
* paramètre de la méthode demander::ajouter().
* Les données traitées dans cette méthode ne concernent que les données spécifiques
* lors d'une nouvelle demande.
* Celle-ci est complétée par la méthode 'prepare_demande_data()'.
*
* @param Array $request_data données reçues
*
* @return Array données ré-organisées
*/
protected function prepare_new_demande_data(array $request_data, $task_id = null) {
$this->addToLog("\tInitialise une instance de 'demande'", VERBOSE_MODE, __METHOD__, $task_id);
$demande_values = array();
$demande = $this->f->get_inst__om_dbform(array(
"obj" => "demande",
"idx" => "]",
));
$this->addToLog("\tRempli un tableau qui contiendra les données ".
"de la demande", VERBOSE_MODE, __METHOD__, $task_id);
foreach ($demande->champs as $value) {
$demande_values[$value] = null;
if (isset($request_data['dossier'][$value])) {
$demande_values[$value] = $request_data['dossier'][$value];
}
}
// si le DA est spécifié, mais que la version est 0, alors on supprime le DA
// sinon cela va faire boguer la création du dossier (recherchant le DA inexistant)
//if(! $this->f->is_option_dossier_saisie_numero_complet_enabled()) {
if (isset($demande_values['dossier_autorisation']) && (
! isset($demande_values['version']) || $demande_values['version'] == '0')) {
$demande_values['dossier_autorisation'] = null;
}
//}
// Le code du type détaillé de dossier d'autorisation est renseigné donc
// l'identifiant est récupéré depuis celui-ci
if (isset($request_data['dossier']["dossier_autorisation_type_detaille_code"]) === true
&& $request_data['dossier']["dossier_autorisation_type_detaille_code"] !== ''
&& $request_data['dossier']["dossier_autorisation_type_detaille_code"] !== true) {
//
$this->addToLog("\tObtient le DAtd à partir de la valeur fournie "."'".$request_data['dossier']["dossier_autorisation_type_detaille_code"]."'", VERBOSE_MODE, __METHOD__, $task_id);
$demande_values['dossier_autorisation_type_detaille'] = ($this->get_dossier_autorisation_type_detaille($request_data['dossier']["dossier_autorisation_type_detaille_code"]));
}
// Dans le cas où un dossier initial est renseigné
if (isset($request_data['demande']['dossier_initial']) === true
&& $request_data['demande']['dossier_initial'] !== ''
&& $request_data['demande']['dossier_initial'] !== null) {
//
$this->addToLog(
sprintf(__("Récupère l'identifiant type détaillé du dossier d'autorisation à partir du dossier d'instruction initial '%s'"), $request_data['demande']['dossier_initial']),
VERBOSE_MODE
);
// Récupération du type détaillé de dossier d'autorisation depuis le dossier initial
$demande_values['dossier_autorisation_type_detaille'] = $this->get_dossier_autorisation_type_detaille(null, $request_data['demande']['dossier_initial']);
// Indique le numéro du dossier d'instruction dans les valeurs de la demande
$demande_values['dossier_instruction'] = $request_data['demande']['dossier_initial'];
}
// si l'option de saisie du numéro complet est activée
if($this->f->is_option_dossier_saisie_numero_complet_enabled() &&
isset($request_data['dossier']['dossier'])) {
$demande_values['num_doss_complet'] = $request_data['dossier']['dossier'];
$this->addToLog("num_doss_complet = '".$demande_values['num_doss_complet']."'", VERBOSE_MODE, __METHOD__, $task_id);
}
return $demande_values;
}
/**
* Ré-organise les données reçues pour qu'elles puissent être utilisées en tant que
* paramètre de la méthode demander::ajouter().
* Les données traitées dans cette méthode ne concernent que les données "communes"
* lors d'une nouvelle demande ou d'une demande sur existant.
* Celle-ci est complétée par la méthode 'prepare_new_demande_data()'.
*
* @param Array $request_data données reçues
*
* @return Array données ré-organisées
*
* @throw InvalidArgumentException En cas de donnée utilisateur invalide ou manquante
*/
protected function prepare_demande_data(array $request_data, array $demande_values,
$task_id = null) {
// numéro de dossier
$this->ensure_numero_dossier($request_data);
// références cadastrales
if (isset($request_data["dossier"]['terrain_references_cadastrales']) &&
! empty($request_data["dossier"]['terrain_references_cadastrales'])) {
// TODO vérifier le format
$demande_values['terrain_references_cadastrales'] = strtoupper(
$request_data["dossier"]['terrain_references_cadastrales']);
}
// date demande
$demande_values['date_demande'] = (new DateTime())->format('d/m/Y');
if (isset($request_data['dossier']['date_demande']) &&
! empty($request_data['dossier']['date_demande'])) {
// TODO vérifier le format
$demande_values['date_demande'] = $request_data['dossier']['date_demande'];
}
// collectivité
$collectiviteId = $this->get_collectivite_id_from_acteur_or_collectivite($request_data, $task_id);
$demande_values['om_collectivite'] = $collectiviteId;
// commune
if ($this->f->is_option_dossier_commune_enabled()) {
// si le code insee n'est pas fourni
if (! isset($request_data['dossier']['insee']) ||
empty($request_data['dossier']['insee'])) {
throw new InvalidArgumentException(sprintf(__(
"Le paramètre '%s' est obligatoire"), 'dossier/insee'));
}
$insee = $request_data['dossier']['insee'];
$this->addToLog("code INSEE '$insee'", VERBOSE_MODE, __METHOD__, $task_id);
// récupère la commune à partir du code insee
$commune = $this->get_commune_from_insee($insee);
if (empty($commune)) {
throw new InvalidArgumentException(sprintf(__(
"Impossible de trouver la commune pour le code INSEE '%s'"), $insee));
}
$this->addToLog("commune '$commune'", VERBOSE_MODE, __METHOD__, $task_id);
$demande_values['commune'] = $commune;
}
// Valeurs par défaut
$type_demande = 'initial';
if (isset($request_data['demande']["type_demande"]) === true
&& empty($request_data['demande']["type_demande"]) !== true) {
//
$type_demande = $request_data['demande']["type_demande"];
}
$etat_dossier_initial = null;
// Dans le cas d'une demande sur dossier existant, le dossier initial doit être
// renseigné
if ($type_demande !== 'initial') {
if (isset($request_data['demande']['dossier_initial']) === false
|| empty($request_data['demande']['dossier_initial']) === true) {
//
throw new InvalidArgumentException(sprintf(
__("Le dossier d'instruction initial doit être renseigné dans les informations du dossier.")
));
}
$inst_dossier = $this->f->get_inst__om_dbform(array(
"obj" => "dossier",
"idx" => $request_data['demande']['dossier_initial'],
));
// Récupération du dossier d'autorisation
$id_da = $inst_dossier->getVal('dossier_autorisation');
if (is_null($id_da) === true) {
throw new InvalidArgumentException(sprintf(
__("Le dossier d'autorisation du dossier d'instruction initial %s n'existe pas."),
$request_data['demande']['dossier_initial']
));
}
$demande_values['dossier_autorisation'] = $id_da;
// Récupération de l'état du dossier initial
$etat_dossier_initial = $inst_dossier->getVal('etat');
}
// demande type
$demande_values['demande_type'] = $this->get_demande_type(
$demande_values,
intval($demande_values['dossier_autorisation_type_detaille']),
$collectiviteId,
$type_demande,
$etat_dossier_initial
);
// version
if ($type_demande === 'initial') {
//
$demande_values['version'] = '0';
if (isset($request_data['dossier']['version']) === true
&& empty($request_data['dossier']['version']) === false) {
//
$demande_values['version'] = $request_data['dossier']['version'];
}
}
// suffixe
if (isset($demande_values['dossier_suffixe'])) {
$matches = array();
if(preg_match('/^(?P[A-Z]\+(?P[0-9]\+)$/', $demande_values['dossier_suffixe'], $matches)) {
$demande_values['numerotation_suffixe'] = $matches['suffixe'];
$demande_values['numerotation_num_suffixe'] = $matches['numero'];
}
}
elseif (! isset($demande_values['numerotation_suffixe'])
|| ! isset($demande_values['numerotation_num_suffixe'])) {
if (! isset($request_data['dossier']['dossier'])
|| empty($request_data['dossier']['dossier'])) {
$this->addToLog("".
"Dossier suffixe vide et aucun numéro de dossier fourni. ".
"Détail: ".var_export($request_data, true), VERBOSE_MODE, __METHOD__, $task_id);
}
// un numéro de dossier est défini
else {
// numéro de dossier
$ref_num_dossier = $request_data['dossier']['dossier'];
// si l'option 'code_entité' est activée pour la collectivité
if ($this->f->is_option_om_collectivite_entity_enabled($collectiviteId)) {
// si le code entité n'est pas défini ou vide
if ($this->f->get_collectivite_code_entite($collectiviteId) === null) {
// affiche un message d'alerte
$err_msg = sprintf(
__("Paramètre '%s' manquant ou vide pour la collectivité '%s'"),
'code_entite',
$collectiviteId);
$this->addToLog("$err_msg", VERBOSE_MODE, __METHOD__, $task_id);
}
// si le code entité est défini et non-vide
else {
// supprime le code entité du numéro de dossier
$ref_num_dossier = preg_replace('/'.$this->f->get_collectivite_code_entite($collectiviteId).'$/', '', $ref_num_dossier);
}
}
// utilisation du parsing du numéro de dossier
$num_urba = $this->f->numerotation_urbanisme($ref_num_dossier);
// si le suffixe est défini
if (isset($num_urba['di']['suffixe']) && isset($num_urba['di']['num_suffixe'])) {
$demande_values['numerotation_suffixe'] = $num_urba['di']['suffixe'];
$demande_values['numerotation_num_suffixe'] = $num_urba['di']['num_suffixe'];
}
}
}
// dépôt électronique
$demande_values['depot_electronique'] = (
isset($request_data['dossier']['depot_electronique']) &&
$request_data['dossier']['depot_electronique'] === 't');
// parcelle temporaire
$demande_values['parcelle_temporaire'] = (
isset($request_data['dossier']['parcelle_temporaire']) &&
$request_data['dossier']['parcelle_temporaire'] === 't');
return $demande_values;
}
/**
* Prépare les données techniques réceptionnées pour qu'elle puissent être
* utilisées avec la méthode modifier.
*
* @param array $request_data Données réceptionnées
* @return array Données préparées
*/
protected function prepare_donnees_techniques_data(array $request_data) {
$dt_values = array();
if (isset($request_data['donnees_techniques']) === true
&& is_array($request_data['donnees_techniques']) === true
&& count($request_data['donnees_techniques']) > 0) {
//
foreach ($request_data['donnees_techniques'] as $key => $value) {
if ($key !== "donnees_techniques"
&& $key !== "cerfa") {
//
$dt_values[$key] = $value;
}
}
}
return $dt_values;
}
/**
* Récupère l'identifiant d'une collectivité à partir d'un acteur ou d'un libellé.
*
* @param array $request_data donnée utilisateurs reçues
*
* @return int L'identifiant de la collectivité
*
* @throw InvalidArgumentException lorsqu'aucune collectivité ne correspond à un acteur
* @throw InvalidArgumentException lorsque ni l'acteur ni la collectivité n'ont été spécifiés
*/
protected function get_collectivite_id_from_acteur_or_collectivite(array $request_data,
$task_id = null) {
$collectiviteId = null;
if (isset($request_data['external_uids']['acteur']) &&
! empty($request_data['external_uids']['acteur'])) {
$acteurId = $request_data['external_uids']['acteur'];
$collectiviteId = $this->get_collectivite_id_from_acteur($acteurId);
if (empty($collectiviteId)) {
throw new InvalidArgumentException(sprintf(__(
"Impossible de trouver le service correspondant à l'acteur '%s'"), $acteurId));
}
$this->addToLog("acteur: '$acteurId' => collectivite '$collectiviteId'",
VERBOSE_MODE, __METHOD__, $task_id);
}
elseif (isset($request_data['dossier']['om_collectivite']) &&
! empty($request_data['dossier']['om_collectivite'])) {
$collectiviteId = $this->get_collectivite_id(intval($request_data['dossier']["om_collectivite"]));
$this->addToLog("collectivite '$collectiviteId'", VERBOSE_MODE, __METHOD__, $task_id);
}
elseif (isset($request_data['dossier']['insee']) &&
! empty($request_data['dossier']['insee'])) {
$collectiviteId = $this->get_collectivite_id_from_insee($request_data['dossier']["insee"]);
$this->addToLog("collectivite '$collectiviteId'", VERBOSE_MODE, __METHOD__, $task_id);
}
if (empty($collectiviteId)) {
throw new InvalidArgumentException(sprintf(__(
"Le paramètre %s est obligatoire."), "'acteur' (ou 'om_collectivite')"));
}
return $collectiviteId;
}
/**
* Cette methode prend le type de demandeur et ces valeurs pour le créer
* et renvoie l'identifiant du demandeur créé ou false en cas d'erreur
*
* @param string $demandeur_type Le type de demandeur
* @param array $demandeur_valeur Les valeurs renseignés du demandeur
* @param int $collectiviteId L'identifiant de la collectivité
*
* @return int L'identifiant du demandeur
*
* @throw InvalidArgumentException Lorsque 'om_collectivite' est manquant
* @throw RuntimeException En cas d'échec lors de l'ajout du demandeur
*/
protected function creation_demandeur(string $demandeur_type, array $demandeur_valeur,
int $collectiviteId) {
// récupère une instance "vide"
$demandeur = $this->f->get_inst__om_dbform(array(
"obj" => "demandeur",
"idx" => "]",
));
// stocke les valeurs du demandeur, ré-organisées pour qu'elles puissent être fournies
// en tant qu'argument à la méthode demandeur::ajouter().
$valAuto = array();
// initialisation des valeurs à null
foreach($demandeur->champs as $value) {
$valAuto[$value] = null;
}
// récupération des valeurs
foreach ($demandeur_valeur as $colonne => $valeur) {
$valAuto[$colonne] = $valeur;
}
// traitement spécifique pour la civilité
if (isset($demandeur_valeur['particulier_civilite']) &&
! empty($demandeur_valeur['particulier_civilite'])) {
$valAuto['particulier_civilite'] = $this->get_civilite($demandeur_valeur['particulier_civilite']);
}
if (isset($demandeur_valeur['personne_morale_civilite']) &&
! empty($demandeur_valeur['personne_morale_civilite'])) {
$valAuto['personne_morale_civilite'] = $this->get_civilite($demandeur_valeur['personne_morale_civilite']);
}
// collectivité
if (empty($collectiviteId)) {
throw new InvalidArgumentException(sprintf(
__("Le paramètre %s est obligatoire pour les données du demandeur."),
"'acteur' (ou 'om_collectivite')"));
}
$valAuto['om_collectivite'] = $collectiviteId;
// traitement spécifique pour la fréquence
if (isset($demandeur_valeur['frequent']) && ! empty($demandeur_valeur['frequent'])) {
$valAuto['frequent'] = $demandeur_valeur["frequent"] == 'f';
}
// traitement spécifique pour la qualité
$valAuto['qualite'] = 'particulier';
if (isset($demandeur_valeur['qualite']) && ! empty($demandeur_valeur['qualite'])) {
$valAuto['qualite'] = str_replace(' ', '_', $demandeur_valeur['qualite']);
}
// traitement spécifique pour le type ==> TODO WHY ???
$valAuto['type_demandeur'] = str_replace("_principal", "", $demandeur_type);
// ajout du demandeur en BDD
if ($demandeur->ajouter($this->adapt_payload_values($demandeur->table, $valAuto)) === false) {
throw new RuntimeException(__("Échec lors de l'ajout du demandeur"));
}
// renvoie l'identifiant technique en BDD du demandeur créé
return $demandeur->valF['demandeur'];
}
/**
* Renvoie l'identifiant en BDD d'une collectivité à partir de son libellé ou de son ID.
* Stocke l'info en cache et l'utilise ensuite si elle existe.
*
* @param string|int $collectivite Libellé ou ID de la collectivité
*
* @return int L'identifiant de la collectivité en BDD
*/
protected function get_collectivite_id(string $collectivite) {
if (! isset($this->cacheCollectivites[$collectivite])) {
$om_collectivite = $this->f->getSingleSqlValue(
'om_collectivite', 'om_collectivite', 'om_collectivite.libelle', $collectivite);
$this->cacheCollectivites[$collectivite] = $om_collectivite;
}
return $this->cacheCollectivites[$collectivite];
}
/**
* Renvoi l'identifiant d'une collectivité à partir de la valeur de l'acteur (om_parametre).
*
* @param $acteurId string L'identifiant de l'acteur (valeur de om_parametre)
*
* @return int|null L'identifiant de la collectivité correspondante, ou null si non trouvée
*
* @throw RuntimeException En cas d'erreur BDD
*/
protected function get_collectivite_id_from_acteur(string $acteurId) {
$om_collectivite = null;
foreach(array(
'acteur_service_consulte',
'acteur_guichet_unique',
'acteur_service_instructeur',
'acteur_autorite_competente'
) as $acteur_key) {
$qres = $this->f->get_one_result_from_db_query(
sprintf(
'SELECT
om_collectivite
FROM
%1$som_parametre
WHERE
libelle = \'platau_%2$s\'
AND valeur = \'%3$s\'',
DB_PREFIXE,
$acteur_key,
$this->f->db->escapeSimple($acteurId)
),
array(
"origin" => __METHOD__,
"force_return" => true,
)
);
if ($qres["code"] !== "OK") {
throw new RuntimeException(sprintf(
__("Échec à l'exécution de la requête SQL de sélection d'un service ".
"pour l'acteur '%s'"), $acteurId));
}
$om_collectivite = $qres["result"];
if (! empty($om_collectivite)) {
break;
}
}
return $om_collectivite;
}
protected function get_collectivite_id_from_insee(string $insee) {
$qres = $this->f->get_one_result_from_db_query(
sprintf(
'SELECT
om_collectivite.om_collectivite
FROM
%1$som_parametre
INNER JOIN %1$som_collectivite
ON om_parametre.om_collectivite = om_collectivite.om_collectivite
WHERE
om_parametre.libelle = \'insee\'
AND om_parametre.valeur = \'%2$s\'',
DB_PREFIXE,
$this->f->db->escapeSimple($insee)
),
array(
"origin" => __METHOD__,
"force_return" => true,
)
);
if ($qres["code"] !== "OK") {
throw new RuntimeException(sprintf(
__("Échec à l'exécution de la requête SQL de sélection d'une collectivité/d'un service depuis le code INSEE '%s'"),
$insee
));
}
return $qres["result"];
}
/**
* Renvoi le code INSEE d'une collectivité.
*
* @param $collectiviteId int L'identifiant de la collectivite
*
* @return int|null Le code INSEE de la collectivité, ou null si non trouvé
*
* @throw RuntimeException En cas d'erreur BDD
*/
protected function get_code_insee_for_collectivite(int $collectiviteId) {
$qres = $this->f->get_one_result_from_db_query(
sprintf(
'SELECT
valeur
FROM
%1$som_parametre
WHERE
libelle = \'insee\'
AND om_collectivie = %2$d',
DB_PREFIXE,
intval($collectiviteId)
),
array(
"origin" => __METHOD__,
"force_return" => true,
)
);
if ($qres["code"] !== "OK") {
throw new RuntimeException(sprintf(
__("Échec à l'exécution de la requête SQL de sélection du code INSEE ".
"de la collectivité '%s'"), $collectiviteId));
}
return $qres["result"];
}
/**
* Renvoi le code commune à partir d'un code INSEE
*
* @param $insee int Le code INSEE
*
* @return string|null Le code de la commune, ou null si non trouvé
*
* @throw RuntimeException En cas d'erreur BDD
*/
protected function get_commune_from_insee(string $insee) {
$today = (new Datetime())->format('Y-m-d');
$qres = $this->f->get_one_result_from_db_query(
sprintf(
'SELECT
commune
FROM
%1$scommune
WHERE
com = \'%2$s\'
AND (
om_validite_debut IS NULL
OR om_validite_debut <= TO_DATE(\'%3$s\', \'YYYY-MM-DD\')
)
AND (
commune.om_validite_fin IS NULL
OR om_validite_fin > TO_DATE(\'%3$s\', \'YYYY-MM-DD\')
)
ORDER BY
om_validite_fin DESC NULLS FIRST,
om_validite_debut DESC NULLS FIRST
LIMIT 1',
DB_PREFIXE,
$this->f->db->escapeSimple($insee),
$this->f->db->escapeSimple($today)
),
array(
"origin" => __METHOD__,
"force_return" => true,
)
);
if ($qres["code"] !== "OK") {
throw new RuntimeException(sprintf(
__("Échec à l'exécution de la requête SQL de sélection d'idenfiant commune ".
"à partir du code INSEE '%s'"), $insee));
}
return $qres["result"];
}
/**
* Renvoie l'identifiant en BDD d'une civilité à partir de son libellé ou de son ID.
*
* @param string|int $civilite Libellé ou ID de la civilité
*
* @return int L'identifiant de la civilité en BDD
*/
protected function get_civilite(string $civilite) {
return $this->f->getSingleSqlValue(
'civilite', 'civilite', 'civilite.libelle', $civilite);
}
/**
* Vérifie que le numéro de dossier est défini et conforme à la réglementation
*
* @param array Tableau des valeurs courantes de la demande
*
* @return array Tableau contenant les clés 'di' et 'da' avec le numéro de dossier correspondant
*
* @throw InvalidArgumentException Lorsque une donnée utilisateur est invalide ou manquante
*/
protected function ensure_numero_dossier(array $demande_values) {
$num_matches = array('di' => null, 'da' => null);
// s'il manque la clé 'dossier' alors que l'option
// 'saisie complète numéro dossier' est activée
if($this->f->is_option_dossier_saisie_numero_complet_enabled() &&
(! isset($demande_values['dossier']['dossier']) ||
empty($demande_values['dossier']['dossier']))) {
throw new InvalidArgumentException(sprintf(
__("Le paramètre '%s' est obligatoire"), 'dossier/dossier'));
}
// sinon, si on a la clé 'dossier' qui est bien définie
elseif(isset($demande_values['dossier']['dossier']) &&
! empty($demande_values['dossier']['dossier'])) {
/*
* On relache cette contrainte pour le cas ou les DA/DI sont non-règlementaires
*
// si le numéro de dossier n'est pas conforme à la numérotation
$num_matches = $this->f->numerotation_urbanisme($demande_values['dossier']['dossier']);
if (empty($num_matches['da']) || empty($num_matches['di'])) {
throw new InvalidArgumentException(sprintf(
__("La valeur '%s' du paramètre '%s' n'est pas valide"),
$demande_values['dossier']['dossier'], 'dossier/dossier'));
}*/
}
return $num_matches;
}
/**
* [get_datd_values_by_id description]
* @param int $datd_id [description]
* @return [type] [description]
*/
protected function get_datd_values_by_id(int $datd_id) {
//
$inst_datd = $this->f->get_inst__om_dbform(array(
"obj" => "dossier_autorisation_type_detaille",
"idx" => $datd_id,
));
$val = array();
$val = array_combine($inst_datd->champs, $inst_datd->val);
foreach ($val as $key => $value) {
$val[$key] = strip_tags($value);
}
return $val;
}
/**
* Renvoie l'identifiant en BDD d'une demande type à partir de plusieurs paramètres.
*
* @param array $demande_values Tableau des valeurs courantes de la demande
* @param int $datd_id Identifiant du type de dossier d'autorisation détaillé.
* @param int $collectiviteId Identifiant de la collectivité courante
* @param string $type_demande Type de la demande, par défaut "initial"
* @param string|null $etat_dossier_initial Identifiant de l'état du dossier initial, s'il s'agit d'une demande sur dossier existant
*
* @return int L'identifiant de la demande type en BDD
*
* @throw InvalidArgumentException Lorsque le paramètrage des types de demande n'est pas défini
*/
protected function get_demande_type(array $demande_values, int $datd_id, int $collectiviteId, string $type_demande = 'initial', string $etat_dossier_initial = null) {
// Récupère le code du datd
$get_datd_values_by_id = array();
$get_datd_values_by_id = $this->get_datd_values_by_id($datd_id);
$datd_code = $get_datd_values_by_id['code'];
// Compose le nom du paramètre
$type_demande_param = sprintf('%s_%s_%s', 'platau_type_demande', $type_demande, $datd_code);
// Récupère les paramètres de la collectivité
$param_collectivite = $this->f->getCollectivite($collectiviteId);
// Récupère le paramètre dans la collectivité du dossier
$type_demande_code = null;
if (is_array($param_collectivite) === true
&& isset($param_collectivite[$type_demande_param]) === true) {
//
$type_demande_code = $param_collectivite[$type_demande_param];
}
if (empty($type_demande_code) === true) {
throw new InvalidArgumentException(sprintf(
__("Le paramètre '%s' n'est pas défini pour la collectivité/le service dont l'identifiant est %d"),
$type_demande_param, $param_collectivite['om_collectivite_idx']));
}
// Récupère l'identifiant du type de la demande
$condition_etat = "";
if ($etat_dossier_initial !== null
&& $etat_dossier_initial !== "") {
// Dans le cas où il s'agit d'une demande sur dossier existant, on récupère
// l'état du dossier initial
$condition_etat = sprintf('
AND demande_type.demande_type IN (
SELECT DISTINCT
demande_type
FROM
%1$slien_demande_type_etat
WHERE
etat = \'%2$s\'
)',
DB_PREFIXE,
$etat_dossier_initial
);
}
$qres = $this->f->get_one_result_from_db_query(
sprintf(
'SELECT
demande_type.demande_type
FROM
%1$sdemande_type
WHERE
demande_type.code = \'%2$s\'
AND demande_type.dossier_autorisation_type_detaille = %3$s
%4$s
',
DB_PREFIXE,
$this->f->db->escapeSimple($type_demande_code),
intval($datd_id),
$condition_etat
),
array(
"origin" => __METHOD__,
"force_return" => true,
)
);
if ($qres["code"] !== "OK") {
throw new InvalidArgumentException($qres["message"]);
}
$demande_type_id = $qres["result"];
if (empty($demande_type_id) === true) {
throw new InvalidArgumentException(sprintf(
__("Le type de demande avec le code '%s' et le type de dossier d'autorisation détaillé '%s' n'existe pas."),
$type_demande_code,
$datd_id
));
}
return $demande_type_id;
}
/**
* Renvoie l'identifiant en BDD du DAtd à partir de son code.
*
* @param string $datd_code Code du type de dossier d'autorisation detaillé
*
* @return int L'identifiant du DAtd en BDD
*/
protected function get_dossier_autorisation_type_detaille(string $datd_code = null, string $dossier = null) {
if ($datd_code !== null) {
return $this->f->getSingleSqlValue(
'dossier_autorisation_type_detaille', 'dossier_autorisation_type_detaille',
'dossier_autorisation_type_detaille.code', $datd_code);
}
if ($dossier !== null) {
$dossier_autorisation = $this->f->getSingleSqlValue(
'dossier', 'dossier_autorisation',
'dossier.dossier', $dossier);
return $this->f->getSingleSqlValue(
'dossier_autorisation', 'dossier_autorisation_type_detaille',
'dossier_autorisation.dossier_autorisation', $dossier_autorisation);
}
}
/**
* Récupère l'identifiant de l'avis de consultation depuis son code.
*
* @param string $ac_code Code de l'avis de consultation
* @return mixed Identifant de l'avis de consultation |false
*/
protected function get_avis_consultation_id_by_code($ac_code) {
$qres = $this->f->get_one_result_from_db_query(
sprintf(
'SELECT
avis_consultation
FROM
%1$savis_consultation
WHERE
code = \'%2$s\'
',
DB_PREFIXE,
$this->f->db->escapeSimple($ac_code)
),
array(
"origin" => __METHOD__,
"force_return" => true,
)
);
if ($qres["code"] !== "OK") {
return false;
}
return $qres["result"];
}
/**
* Effectue différent traitement sur les valeurs de la payload pour les adapter
* au valeur attendue dans openADS.
*
* Les méthodes de traitements utilisées sont :
* - truncate_value_from_field_max_size()
* - correct_date_format()
*
* @param string $table Table en base de données où seront stockées les valeurs.
* @param array $field_tab Tableau des valeurs.
* @return array Tableau des valeurs, dont certaines tronquées.
*/
protected function adapt_payload_values(string $table, array $field_tab) {
// Récupère le type de chacun des champs pour déterminer le-s traitement-s à appliquer
$fields_type = $this->get_table_fields_type($table, $field_tab);
if ($fields_type['code'] === 'KO') {
$this->setMessage(__("Erreur lors de la récupération des informations sur les colonnes en base de données"));
return $this->KO;
}
// Filtre les éléments par type
$fields_by_type = array();
foreach ($fields_type['result'] as $field) {
$fields_by_type[$field['data_type']][$field['column_name']] = $field;
$fields_by_type[$field['data_type']][$field['column_name']]['value'] = $field_tab[$field['column_name']];
}
// Tri des champs particulier
// Le champs date_depot_mairie est renseigné dans la payload dans la partie utilisé pour
// l'ajout de demande. Ce champs n'appartiens pas à la table demande. Il correspond au
// champs depot_initial de la table dossier_autorisation. Pour éviter des erreurs liées
// à ce champs, on l'ajoute à la main dans le tableau en tant que date.
if (isset($field_tab['date_depot_mairie'])) {
$fields_by_type['date']['date_depot_mairie'] = array('value' => $field_tab['date_depot_mairie']);
}
// Effectue les traitements selon le type de champs et met à jour les valeur du tableau
if (isset($fields_by_type['character varying'])) {
$field_tab = array_merge($field_tab, $this->truncate_value_from_field_max_size($fields_by_type['character varying']));
}
if (isset($fields_by_type['date'])) {
$field_tab = array_merge($field_tab, $this->correct_date_format($fields_by_type['date']));
}
return $field_tab;
}
/**
* Récupère en base de données les informations de chaque champ et renvoie le résultat.
*
* @param string $table Table en base de données où seront stockées les valeurs.
* @param array $field_tab Tableau des valeurs.
* @return array Résultat de la requête
*/
protected function get_table_fields_type(string $table, array $field_tab) {
// Récupère les informations de chaque champ, en base de données
$res = $this->f->get_all_results_from_db_query(
sprintf(
'SELECT
column_name,
character_maximum_length,
data_type
FROM
INFORMATION_SCHEMA.COLUMNS
WHERE
column_name IN (\'%1$s\')
AND (table_name = \'%2$s\');',
implode('\', \'', array_keys($field_tab)),
$table
),
array(
"origin" => __METHOD__,
"force_return" => true,
)
);
return $res;
}
/**
* Découpe les valeurs du tableau passé en paramètre à la taille max du champ
* en base de données.
*
* @param array $field_tab Tableau des valeurs.
* @return array Tableau des valeurs, dont certaines tronquées.
*/
protected function truncate_value_from_field_max_size(array $field_tab) {
$corrected_fields = array();
// Tronque les valeurs
foreach ($field_tab as $field_name => $field_info) {
$corrected_fields[$field_name] = mb_substr($field_info['value'], 0, $field_info["character_maximum_length"]);
}
// Retourne le nouveau tableau avec les valeurs tronquées
return $corrected_fields;
}
/**
* Formate les valeurs du tableau passé en paramètre pour que l'année de chacune des dates
* non vide possède 4 caractères.
* Les dates attendues doivent être au format : AAAA-MM-JJ avec entre 1 et 4 A.
*
* @param array $field_tab Tableau des valeurs.
* @return array Tableau des valeurs, avec des dates ayant des années sur 4 caractères.
*/
protected function correct_date_format(array $field_tab) {
$corrected_fields = array();
// Ajoute des 0 en début de date pour que l'année soit toujours sur 4 caractères
foreach ($field_tab as $field_name => $field_info) {
// Ne corrige que les dates ayant été remplie et n'étant pas au format DD/MM/YYYY.
// Les dates au format DD/MM/YYYY ne sont pas issues de la payload mais sont calculées
// par l'application (normalement). Elles n'ont donc pas besoin de correction.
if (! empty($field_info['value']) && preg_match('/[0-9]{2}\/[0-9]{2}\/[0-9]{4}/', $field_info['value']) !== 1) {
// Découpe la valeur en YYYY, MM et DD
$truncated_date = explode('-', $field_info['value']);
// Si la date n'a pas le format voulu utilise une date par défaut.
// Sinon complète l'année, le mois et le jour avec des 0 pour s'assurer que
// le format attendu est correct.
// Si malgré l'ajout des 0 la date n'est toujours pas correcte, utilise la
// date par défaut
$default_date = "0001-01-01";
$is_date_ok = false;
if (is_array($truncated_date) && count($truncated_date) === 3) {
$is_date_ok = true;
for ($i = 0; $i < 3; $i++) {
// pour l'annèe on compléte sur 4 caractère et pour le mois/jour sur 2
$pad_length = $i === 0 ? 4 : 2;
$truncated_date[$i] = str_pad($truncated_date[$i], $pad_length, "0", STR_PAD_LEFT);
// Vérifie si le résultat obtenu ne contiens que des 0. Si c'est le cas, la
// date est marqué comme invalide et la date par défaut sera utilisée.
if (preg_match('/^0{0,4}$/', $truncated_date[$i]) === 1) {
$is_date_ok = false;
break;
}
}
}
$corrected_fields[$field_name] = $is_date_ok ?
implode("-", $truncated_date)
: $default_date;
}
}
// Retourne le nouveau tableau avec les dates corrigées
return $corrected_fields;
}
}