<?php
|
|
|
|
require_once('../../base/php/classDatabase.php');
|
|
require_once('../../outils/php/JsonLogicToSql5.php');
|
|
require_once('../../base/php/lib/cti/Database/Database2Factory.class.php');
|
|
require_once('../../base/php/lib/cti/Environnement/Environnement.class.php');
|
|
require_once('etudes/cardioInterventionnelle/EtudeCardioPost.php');
|
|
|
|
|
|
/**
|
|
* Classe executant les études
|
|
*
|
|
* Cette classe est limitée pour le moment au module PMSI.
|
|
* Pourrait être "multi" module en ajoutant un paramètre à la construction de la classe.
|
|
*
|
|
* Utilise JSONLogic pour décrire les règles
|
|
* @see https://jsonlogic.com/
|
|
*
|
|
* Converti le JSONLogic en SQL grâce à la classe JsonLogicToSql
|
|
* JsonLogicToSql5 -> PHP 5
|
|
* JsonLogicToSql -> PHP 7+
|
|
*/
|
|
class EtudeManager
|
|
{
|
|
/** @var JsonLogicToSql5 */
|
|
private $jsonLogic;
|
|
|
|
private $iCTI_connexion;
|
|
|
|
|
|
public function __construct()
|
|
{
|
|
$this->jsonLogic = new JsonLogicToSql5();
|
|
$this->iCTI_connexion = Database2Factory::getInstance(Environnement::PROVIDER_CTI);
|
|
}
|
|
|
|
/**
|
|
* Supprime les anciennes données uniquement si l'étude a une requête de "suppression"
|
|
*
|
|
* @param string $etude
|
|
* @return boolean
|
|
*/
|
|
public function clear($etude)
|
|
{
|
|
$res = $this->iCTI_connexion->query("SELECT * FROM pmsi.t_etude WHERE code = '$etude'");
|
|
if (!$res) {
|
|
echo "\r\n" . date("d/m/Y H:i:s") . "\t" . "Error" . "\t" . "Problème dans le clear de l'étude $etude";
|
|
return false;
|
|
}
|
|
|
|
$record = $this->iCTI_connexion->fetchAssoc($res);
|
|
if (!$record) {
|
|
echo "\r\n" . date("d/m/Y H:i:s") . "\t" . "WARNING" . "\t" . "L'étude $etude n'existe pas";
|
|
return false;
|
|
}
|
|
|
|
$clearCommand = $record["clear_request"];
|
|
|
|
if ($clearCommand !== "") {
|
|
$this->iCTI_connexion->query($clearCommand);
|
|
echo "\r\n" . date("d/m/Y H:i:s") . "\t" . "INFO" . "\t" . "Suppression effectuée pour l'étude $etude";
|
|
} else {
|
|
echo "\r\n" . date("d/m/Y H:i:s") . "\t" . "INFO" . "\t" . "Aucune suppression nécessaire pour l'étude $etude";
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Execute les règles pour une étude donnée
|
|
* Récupère la requête de base et joue successivement la requête avec les clauses where générées par le JSONLogic
|
|
* Les règles sont stockées au format JSONLogic dans la table t_etude_rules
|
|
*
|
|
* @param string $etude
|
|
* @return void
|
|
*/
|
|
public function execute($etude)
|
|
{
|
|
$rules = array();
|
|
$queries = array();
|
|
|
|
/**
|
|
* Récupération des éléments communs à l'étude (t_etude)
|
|
*/
|
|
$res = $this->iCTI_connexion->query("SELECT * FROM pmsi.t_etude WHERE code = '$etude'");
|
|
if (!$res) {
|
|
echo "\r\n" . date("d/m/Y H:i:s") . "\t" . "ERROR" . "\t" . "Problème dans l'exécution dans de l'étude $etude";
|
|
return;
|
|
}
|
|
|
|
$record = $this->iCTI_connexion->fetchAssoc($res);
|
|
if (!$record) {
|
|
echo "\r\n" . date("d/m/Y H:i:s") . "\t" . "WARNING" . "\t" . "L'étude $etude n'existe pas";
|
|
return;
|
|
}
|
|
|
|
$id = $record["oid"];
|
|
$baseCommand = $record["base_request"];
|
|
$postClass = $record["post_class"];
|
|
|
|
/**
|
|
* Récupération et interprétation des règles grace au JSONLogic
|
|
*/
|
|
$res = $this->iCTI_connexion->query("SELECT * FROM pmsi.t_etude_rule WHERE etude_id = '$id'");
|
|
while ($row = $this->iCTI_connexion->fetchAssoc($res)) {
|
|
array_push($rules, $this->jsonLogic->apply(json_decode($row["json"], true)));
|
|
}
|
|
|
|
/**
|
|
* Constitution des requêtes finales en remplacant le {{ where }} par la clause générées dynamiquement
|
|
* Si l'étude n'a pas de rules particulère on exécute la requête de base
|
|
*/
|
|
if (count($rules)) {
|
|
foreach ($rules as $rule) {
|
|
$queries[] = preg_replace("/{{\s?WHERE\s?}}/im", "\n WHERE 1 = 1 AND\n" . $rule, $baseCommand);
|
|
}
|
|
} else {
|
|
$queries[] = $baseCommand;
|
|
}
|
|
|
|
/**
|
|
* Execution des requêtes
|
|
*/
|
|
foreach ($queries as $query) {
|
|
$res = $this->iCTI_connexion->query($query);
|
|
if (!$res) {
|
|
echo "\r\n" . date("d/m/Y H:i:s") . "\t" . "ERROR" . "\t" . "Erreur lors de l'éxecution d'une règle pour l'étude $etude";
|
|
return;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Execution des post Traitement
|
|
*/
|
|
if ($postClass){
|
|
$etudePost = new $postClass;
|
|
$etudePost->execute();
|
|
}
|
|
echo "\r\n" . date("d/m/Y H:i:s") . "\t" . "Execution de l'étude $etude avec succès";
|
|
|
|
}
|
|
}
|