function PP_CreateSession() {
global $config;
$hash = sha1(rand(1111, 9999));
if (!empty($_SESSION['hash'])) {
$_SESSION['hash'] = $_SESSION['hash'];
$time = $_SERVER['REQUEST_TIME'];
if (isset($_SESSION['last_activity']) && ($time - $_SESSION['last_activity']) > $config->session_time) {
session_unset();
session_destroy();
session_start();
$_SESSION['hash'] = $hash;
}
$_SESSION['last_activity'] = $time;
return $_SESSION['hash'];
}
$_SESSION['hash'] = $hash;
return $hash;
}
function PP_DestroySession($hash = 0, $id_utente = 0){
global $config;
if (!empty($hash)) {
$hash = PP_Secure($hash);
session_unset();
session_destroy();
$query = "DELETE FROM " . T_SESSIONI . " WHERE hash = :hash";
$par = array("hash" => $hash);
$config->database->query($query, $par);
}
if (!empty($id_utente)) {
$id_utente = PP_Secure($id_utente);
session_unset();
session_destroy();
$query = "DELETE FROM " . T_SESSIONI . " WHERE id_utente = :id_utente";
$par = array("id_utente" => $id_utente);
$config->database->query($query, $par);
}
return true;
}
function PP_CheckSession($hash = '', $require_login = false) {
global $config;
if (!isset($_SESSION['hash']) || empty($_SESSION['hash'])) {
return false;
}
if (empty($hash)) {
return false;
}
if ($hash == $_SESSION['hash']) {
if(!$require_login){
return true;
}else{
$query = "SELECT id_utente FROM " . T_SESSIONI . " WHERE hash = :hash LIMIT 1";
$par = array("hash" => $hash);
$query_sql = $config->database->query($query, $par);
if (count($query_sql) > 0 && $query_sql[0]['id_utente'] > 0 && !empty($_SESSION['id_utente']) && $query_sql[0]['id_utente'] == $_SESSION['id_utente']) {
if($config->utente == null){
$config->utente = PP_GetUtente($query_sql[0]['id_utente']);
}
return true;
}
}
}
return false;
}
function PP_GetIP() {
$ipaddress = '';
if (getenv('HTTP_CLIENT_IP'))
$ipaddress = getenv('HTTP_CLIENT_IP');
else if(getenv('HTTP_X_FORWARDED_FOR'))
$ipaddress = getenv('HTTP_X_FORWARDED_FOR');
else if(getenv('HTTP_X_FORWARDED'))
$ipaddress = getenv('HTTP_X_FORWARDED');
else if(getenv('HTTP_FORWARDED_FOR'))
$ipaddress = getenv('HTTP_FORWARDED_FOR');
else if(getenv('HTTP_FORWARDED'))
$ipaddress = getenv('HTTP_FORWARDED');
else if(getenv('REMOTE_ADDR'))
$ipaddress = getenv('REMOTE_ADDR');
else
$ipaddress = 'UNKNOWN';
return $ipaddress;
}
function PP_Secure($string, $censored_words = 1, $br = true, $strip = 0) {
global $config;
$string = trim($string);
$string = PP_CleanString($string);
//$string = mysqli_real_escape_string($config->db, $string);
//$string = htmlspecialchars($string, ENT_QUOTES);
if ($br == true) {
$string = str_replace('\r\n', "
", $string);
$string = str_replace('\n\r', "
", $string);
$string = str_replace('\r', "
", $string);
$string = str_replace('\n', "
", $string);
} else {
$string = str_replace('\r\n', "", $string);
$string = str_replace('\n\r', "", $string);
$string = str_replace('\r', "", $string);
$string = str_replace('\n', "", $string);
}
if ($strip == 1) {
$string = stripslashes($string);
}
//$string = str_replace('&#', '', $string);
/* if ($censored_words == 1) {
global $config;
$censored_words = @explode(",", $config['censored_words']);
foreach ($censored_words as $censored_word) {
$censored_word = trim($censored_word);
$string = str_replace($censored_word, '****', $string);
}
} */
return $string;
}
function PP_CleanString($string) {
return $string = preg_replace("/?[a-z0-9]+;/i","", $string);
}
function PP_PrintIfKeyExist($array, $key){
if(array_key_exists($key, $array)) {
return $array[$key];
}
return null;
}
function PP_Implode($glue, $array){
return !empty($array) ? implode($glue, $array) : '';
}
function PP_ArrayType($array){
if(array_keys($array) !== range(0, count($array) - 1))
return "associative";
else
return "sequential";
}
function PP_SearchComune($data){
global $config;
if(strlen($data['term']) >= 2){
$query = "SELECT id as id, comune as label, id as value FROM " . T_COMUNI . " WHERE comune LIKE '%{$data['term']}%'";
$comuni = $config->database->query($query, array());
return $comuni;
}else{
return null;
}
}
function PP_GetComuneById($id){
global $config;
$query = "SELECT * FROM " . T_COMUNI . " WHERE id = :id";
$par = array("id" => $id);
$comuni = $config->database->query($query, $par);
if(count($comuni) == 1){
return $comuni[0];
}
return null;
}
function PP_TempoDueCifre($tempo){
if(intval($tempo) < 10){
$tempo = '0'.$tempo;
}
return $tempo;
}
function PP_db2viewDate($date){
if(empty($date))
return null;
return date("d/m/Y", strtotime($date));
}
function PP_view2dbDate($date){
if(empty($date))
return null;
return date("Y-m-d", strtotime(str_replace('/', '-', $date)));
}
function PP_db2viewDatetime($date){
if(empty($date))
return null;
return date("d/m/Y H:i:s", strtotime($date));
}
function PP_view2dbDatetime($date){
if(empty($date))
return null;
return date("Y-m-d H:i:s", strtotime(str_replace('/', '-', $date)));
}
/* function PP_db2viewDatetime($date){
if(empty($date))
return null;
return date("Y-m-d\TH:i:s", strtotime($date));
}
function PP_view2dbDatetime($date){
if(empty($date))
return null;
return date("Y-m-d H:i:s", strtotime($date));
} */
function PP_SearchInArray($array, $field, $value) {
foreach ($array as &$row) {
if ($row[$field] === $value) {
return $row;
}
}
return null;
}
function PP_IsJson($string) {
$result = json_decode($string);
if(json_last_error() === JSON_ERROR_NONE){
return true;
}else{
return false;
}
}
function PP_UrlfyString($string){
return preg_replace('/[^a-zA-Z0-9_-]+/', '-', strtolower($string));
}
function PP_SecureFilePath($path){
$nome_file = explode(".", $path);
$ext = array_pop($nome_file);
$nome_file = implode(".", $nome_file);
$path = PP_CartellaUpload().$nome_file.'.'.$ext;
$i = 1;
while(file_exists(ABSPATH.$path)){
$path = PP_CartellaUpload().$nome_file.'_'.$i.'.'.$ext;
$i++;
}
return $path;
}
/******** ELEMENTI ********/
function PP_SelectPicker($id, $value_obj, $null_text = 'Seleziona un valore', $elements, $label = '', $text_key = null, $value_key = null, $multiple = ''){
$value_set = PP_PrintIfKeyExist($value_obj, $id);
$name = $multiple == '' ? $id : $id.'[]';
$select = '
';
return $select;
}
function PP_Checkbox($id, $value_obj, $elements, $label = ''){
$checkbox = '
';
$value_set = PP_PrintIfKeyExist($value_obj, $id);
foreach($elements as $key => $item){
$checked = '';
if(is_array($value_set) && in_array($key, $value_set)){
$checked = "checked";
}
$checkbox.= "
$item
";
}
return $checkbox;
}
function PP_Radioinput($id, $value_obj, $elements, $label = ''){
$checkbox = '
';
$value_set = PP_PrintIfKeyExist($value_obj, $id);
foreach($elements as $key => $item){
$checked = '';
if(PP_ArrayType($elements) == "sequential"){
$key = $item;
}
if(is_array($value_set) && in_array($key, $value_set)){
$checked = "checked";
}
$checkbox.= "
$item
";
}
return $checkbox;
}
function PP_Textbox($type, $id, $label = '', $placeholder = '', $value_obj = null, $readonly = '', $step = '', $min = '', $max = ''){
if($type == 'datetime-local')
$value = PP_db2viewDatetime(PP_PrintIfKeyExist($value_obj,$id));
else
$value = PP_PrintIfKeyExist($value_obj,$id);
$textbox = '';
return $textbox;
}
function PP_Filebox($id, $label = '', $value_obj = null, $multiple="", $ext = ""){
$filebox = '';
if(!empty($value_obj[$id])){
foreach($value_obj[$id] as $path){
$filename = explode("/", $path);
$filename = $filename[count($filename) - 1];
$filebox.= '
'.$filename.'';
}
}
$filebox.= '
';
return $filebox;
}
function PP_Textarea($id, $label = '', $value_obj = null, $rows=5){
$textarea = '';
$textarea = '';
return $textarea;
}
function PP_Imagebox($id, $value_obj = null){
$imgsrc = (PP_PrintIfKeyExist($value_obj,$id)) ? PATH.PP_PrintIfKeyExist($value_obj,$id) : PATH.'img/default-product-img.png';
$imagebox = '
';
return $imagebox;
}
/****PDF*******/
function PP_GeneraPDF($content, $filename, $termini_condizioni = false, $firma = false){
// create new PDF document
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
// set document information
/* $pdf->SetCreator(PDF_CREATOR);
$pdf->SetAuthor('Zen Technology');
$pdf->SetTitle('Zen Technology');
$pdf->SetSubject('Viale Italia 70, 96011,
Augusta (SR)'); */
$title = "Zen Technology";
$address = "Viale Italia 70, 96011, Augusta (SR)\nTel +39 0931 992613 info@zentechnology.it";
// set default header data
$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, $title, $address, array(0,0,0), array(0,0,0));
$pdf->setFooterData(array(0,0,0), array(0,0,0));
// set header and footer fonts
$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
// set default monospaced font
$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
// set margins
$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
// set auto page breaks
$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
// set image scale factor
$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
// set some language-dependent strings (optional)
if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
require_once(dirname(__FILE__).'/lang/eng.php');
$pdf->setLanguageArray($l);
}
// ---------------------------------------------------------
// set default font subsetting mode
$pdf->setFontSubsetting(true);
// Set font
// dejavusans is a UTF-8 Unicode font, if you only need to
// print standard ASCII chars, you can use core fonts like
// helvetica or times to reduce file size.
$pdf->SetFont('dejavusans', '', 14, '', true);
// Add a page
// This method has several options, check the source code documentation for more information.
$pdf->AddPage();
// set text shadow effect
//$pdf->setTextShadow(array('enabled'=>true, 'depth_w'=>0.2, 'depth_h'=>0.2, 'color'=>array(196,196,196), 'opacity'=>1, 'blend_mode'=>'Normal'));
// Print text using writeHTMLCell()
$pdf->writeHTML($content, true, false, true, false, '');
// ---------------------------------------------------------
if($termini_condizioni){
$pdf->AddPage();
ob_start();
include(ABSPATH.'doc/template/termini-condizioni.php');
$content_termini_condizioni = ob_get_contents();
ob_end_clean();
//$content_termini_condizioni = file_get_contents(ABSPATH.'doc/template/termini-condizioni.php');
$pdf->writeHTML($content_termini_condizioni, true, false, true, false, '');
}
// Close and output PDF document
// This method has several options, check the source code documentation for more information.
$pdf->Output(ABSPATH.'doc/archivio/'.$filename.'.pdf', 'F');
ob_end_clean();
return true;
}
function PP_CaricaFirma($data){
global $config;
if(!empty($data['firma'])){
$firma = $data['firma'];
$firma = str_replace('data:image/png;base64,', '', $firma);
$firma = str_replace(' ', '+', $firma);
$firma = base64_decode($firma);
file_put_contents(ABSPATH.'doc/firma/firma.png', $firma);
return true;
}
return false;
}
function PP_CartellaUpload(){
$y = date('Y');
$m = date('m');
$path = ABSPATH.'upload/'.$y;
if(!is_dir($path)){
mkdir($path);
}
$path = ABSPATH.'upload/'.$y.'/'.$m;
if(!is_dir($path)){
mkdir($path);
}
$path = 'upload/'.$y.'/'.$m.'/';
return $path;
}
/*** EMAIL ****/
function PP_SendMail($mailobj, $marketing = false){
$mail = new PHPMailer();
$mail->IsSMTP();
$mail->Mailer = "smtp";
$mail->SMTPAuth = true;
/* $mail->SMTPSecure = "tls";
$mail->Port = 587;
$mail->Host = "smtp.gmail.com";
$mail->Username = "prenotaposti@gmail.com";
$mail->Password = "seagaldeniro"; */
$mail->SMTPSecure = "ssl";
$mail->Port = 465;
$mail->Host = "smtps.aruba.it";
$mail->Username = "info@prenotaposti.it";
$mail->Password = "seagaldeniro";
$mail->IsHTML(true);
foreach($mailobj['to'] as $email){
$mail->AddAddress($email);
}
/* if(!isset($mailobj['nodebug'])){
$mail->addBCC("xxx@gmail.com");
} */
$mail->SetFrom("info@zentechnology.it", "ZenTechnology");
//$mail->AddReplyTo("info@prenotaposti.it", "ZenTechnology");
if(isset($mailobj['attachment']))
$mail->AddAttachment($mailobj['attachment'], 'documentazione.pdf');
$mail->Subject =$mailobj['subject'];
$template = file_get_contents(PATH."class/mail/template_mail.html");
$template = str_replace("##content##", $mailobj['content'], $template);
if($marketing){
$template = str_replace("##unsubscribe##", "
Non vuoi più ricevere queste comunicazioni?
unsubscribe", $template);
}else{
$template = str_replace("##unsubscribe##", "", $template);
}
$mail->MsgHTML($template);
if(!$mail->Send()) {
return $mail->ErrorInfo;;
} else {
return true;
}
}
/***NOTIFICHE***/
function PP_CreaNotifica($data){
global $config;
$id_mittente = PP_Secure(PP_PrintIfKeyExist($data, 'id_mittente'));
$id_destinatario = PP_Secure(PP_PrintIfKeyExist($data, 'id_destinatario'));
$titolo = PP_Secure(PP_PrintIfKeyExist($data, 'titolo'));
$contenuto = PP_Secure(PP_PrintIfKeyExist($data, 'contenuto'));
$tipo = PP_Secure(PP_PrintIfKeyExist($data, 'tipo'));
$link = PP_Secure(PP_PrintIfKeyExist($data, 'link'));
$id_univoco = PP_PrintIfKeyExist($data, 'id_univoco') != '' ? PP_PrintIfKeyExist($data, 'id_univoco') : 0;
$data_notifica = PP_PrintIfKeyExist($data, 'data_notifica') != '' ? PP_PrintIfKeyExist($data, 'data_notifica') : date("Y-m-d");
$query = "INSERT INTO " . T_NOTIFICHE . " (id_mittente, id_destinatario, titolo, contenuto, data_notifica, tipo, link, id_univoco)
VALUES (:id_mittente, :id_destinatario, :titolo, :contenuto, :data_notifica, :tipo, :link, :id_univoco)";
$par = array("id_mittente" => $id_mittente, "id_destinatario" => $id_destinatario, "titolo" => $titolo, "contenuto" => $contenuto, "data_notifica" => $data_notifica, "tipo" => $tipo, "link" => $link, "id_univoco" => $id_univoco);
if($config->database->query($query, $par)){
return $config->database->lastInsertId();
}
return 0;
}
function PP_NotificaLetta($data){
global $config;
$id_utente = $config->utente['id'];
$query = "UPDATE " . T_NOTIFICHE . " SET data_lettura = '".date("Y-m-d H:i:s")."' WHERE data_notifica <= '".date("Y-m-d")."' AND id_destinatario = :id_destinatario";
$par = array("id_destinatario" => $id_utente);
if($config->database->query($query, $par)){
return true;
}
return false;
}
function PP_GetNotifiche($data){
global $config;
$query_where = null;
$par = array();
if(isset($data['id_destinatario'])){
$query_where[] = ' id_destinatario = :id_destinatario ';
$par["id_destinatario"] = $data['id_destinatario'];
}else{
$query_where[] = ' id_destinatario = :id_destinatario ';
$par["id_destinatario"] = $_SESSION['id_utente'];
}
$query_where[] = ' data_notifica <= "'.date("Y-m-d").'"';
if($query_where){
$query_where = " WHERE ".implode(" AND ", $query_where);
}
$query = "SELECT * FROM " . T_NOTIFICHE . " $query_where ORDER BY id DESC";
$notifiche = $config->database->query($query, $par);
return $notifiche;
}
/**PARAMETRI**/
function PP_GetParametri($data){
global $config;
$query_where = null;
if(!empty($data['gruppo'])){
$query_where[] = " gruppo = '".PP_Secure($data['gruppo'])."' ";
}
if($query_where){
$query_where = " WHERE ".implode(" AND ", $query_where);
}
$query = "SELECT gruppo, valore, campo FROM " . T_PARAMETRI . " $query_where";
$query = $config->database->query($query, array());
$parametri = [];
foreach($query as $p){
if(!isset($parametri[$p["gruppo"]])){
$parametri[$p["gruppo"]] = [];
}
$parametri[$p["gruppo"]][$p['valore']] = $p['campo'];
}
return $parametri;
}
function PP_AggiornaParametriInline($data){
global $config;
$update_query = "{$data['campo']} = '{$data['valore']}'";
$query = "UPDATE " . T_PARAMETRI . " SET $update_query WHERE id = {$data['id']}";
if($config->database->query($query, array())){
return $data['id'];
}
return null;
}
function PP_AggiungiParametro($data){
global $config;
$query = "INSERT INTO " . T_PARAMETRI . " (gruppo) VALUES ('nuovo_gruppo')";
$config->database->query($query, array());
return true;
}
function PP_EliminaParametri($data){
global $config;
$query_where = [];
if(!empty($data['id'])){
$query_where[] = ' id = '.$data['id'];
}
if(count($query_where) > 0){
$query = "DELETE FROM " . T_PARAMETRI . " WHERE ".implode(" AND ", $query_where);
$config->database->query($query, array());
return true;
}
return false;
}
function PP_GetUnitaOperative(){
global $config;
$query = "SELECT * FROM " . T_UNITA_OPERATIVE . " ";
$query = $config->database->query($query, array());
return $query;
}
?>
/******* FUNZIONI UTENTE **************/
function PP_AggiornaUtente($data){
global $config;
$id_utente = $config->utente['id'];
$var_tecniche = array('f', 'hash', 'password', 're_password', 'ruolo');
$query_update = array();
foreach($data as $key=>$value){
if(!in_array($key, $var_tecniche)){
array_push($query_update, " $key = '".PP_Secure($value)."' ");
}
}
if(!empty($data['password'])){
if($data['password'] == $data['re_password'] && PP_PasswordSecure($data['password'])){
$password = md5($data['password']);
array_push($query_update, " password = '$password' ");
}else{
return false;
}
}
if($query_update){
$query_update = " SET ".implode(", ", $query_update);
}
$query = "UPDATE " . T_UTENTI . " $query_update WHERE id = $id_utente";
$par = array("id"=>$id_utente);
if($config->database->query($query, $par) > 0){
return true;
}
return false;
}
function PP_Login($data){
global $config;
if(empty($data['email'])){
return false;
}
if(empty($data['password'])){
return false;
}
$email = PP_Secure($data['email']);
$password = PP_Secure($data['password']);
$md5password = md5($password);
/*Inutile perchè setto la password direttamente lato cli
if(isset($_COOKIE["remember_password"]) && isset($_COOKIE["remember_email"]) && $_COOKIE["remember_email"] == $data['email'] && !isset($data['password'])) {
$md5password = md5($_COOKIE["remember_password"]);
}else{
$md5password = md5($password);
} */
$query = "SELECT * FROM " . T_UTENTI . " WHERE email = :email AND password = :password LIMIT 1";
$par = array("email" => $email, "password" => $md5password);
$query_sql = $config->database->query($query, $par);
if (count($query_sql) > 0 && !empty($query_sql[0]['id'])) {
$query_sql = $query_sql[0];
$data_creazione = date('Y-m-d H:i:s');
$ip = PP_GetIP();
PP_DestroySession($data['hash']);
session_start();
if(!empty($data["remember"])) {
setcookie ("remember_email", $email, time() + $config->cookie_time, "/");
setcookie ("remember_password", $password, time() + $config->cookie_time, "/");
} else {
if(isset($_COOKIE["remember_email"])) {
setcookie ("remember_email", "", 0, "/");
setcookie ("remember_password", "", 0, "/");
}
}
$_SESSION['hash'] = $data['hash'];
$_SESSION['id_utente'] = $query_sql['id'];
$query = "INSERT INTO " . T_SESSIONI . " (id_utente, hash, data_creazione, ip) VALUES (:id_utente, :hash, :data_creazione, :ip)";
$par = array("id_utente" => $query_sql['id'], "hash" => $data['hash'], "data_creazione" => $data_creazione, "ip" => $ip);
$config->database->query($query, $par);
$query = "UPDATE " . T_UTENTI . " SET data_ultimo_accesso = :data_creazione WHERE id = :id";
$par = array("data_creazione" => $data_creazione, "id" => $query_sql['id']);
$config->database->query($query, $par);
return true;
}
return false;
}
function PP_Logout(){
global $config;
if(!empty($_SESSION['hash']) && !empty($_SESSION['id_utente'])){
PP_DestroySession($_SESSION['hash'], $_SESSION['id_utente']);
}else{
session_unset();
session_destroy();
}
return true;
}
function PP_Loggato(){
global $config;
if(!empty($_SESSION['id_utente']) && !empty($_SESSION['hash'])){
$query = "SELECT * FROM " . T_SESSIONI . " WHERE hash = :hash AND id_utente = :id_utente LIMIT 1";
$par = array("hash" => $_SESSION['hash'], "id_utente" => $_SESSION['id_utente']);
$query_sql = $config->database->query($query, $par);
if (count($query_sql) > 0 && !empty($query_sql[0]['id'])) {
return true;
}
}
return false;
}
function PP_PaginaVisitabile($pagina){
global $config;
$pagine_visitabili = ['', 'login', 'logout'];
if(in_array($pagina, $pagine_visitabili))
return true;
foreach($config->utente['menu'] as $menu){
if(isset($menu->link)){
if(is_array($menu->link)){
foreach($menu->link as $submenu){
if($submenu->link == $pagina)
return true;
}
}else{
if($menu->link == $pagina)
return true;
}
}
}
return false;
}
function PP_EmailExist($email){
global $config;
$email = PP_Secure($email);
$query = "SELECT id, email FROM " . T_UTENTI . " WHERE email = :email LIMIT 1";
$par = array("email" => $email);
$query_sql = $config->database->query($query, $par);
if (count($query_sql) > 0 && !empty($query_sql[0]['email']) && $query_sql[0]['email'] == $email) {
return $query_sql['id'];
}
return false;
}
function PP_GetUtente($id){
global $config;
$id = PP_Secure($id);
$query = "SELECT t.*, tu.nome as ruolo, tu.menu FROM " . T_UTENTI . " t
LEFT JOIN " .T_UTENTI_RUOLI. " tu ON t.id_ruolo = tu.id WHERE t.id = :id LIMIT 1";
$par = array("id" => $id);
$utente = $config->database->query($query, $par);
if(count($utente) == 1){
$utente = $utente[0];
if($utente['id_ruolo'] == 1){
$utente["medici"] = PP_GetMediciAssegnati(array("id_paziente" => $id));
$utente["medici"] = PP_GetPazientiAssegnati(array("id_medico" => $id));
}
if($utente['id_ruolo'] == 2){
$utente["pazienti"] = PP_GetPazientiAssegnati(array("id_medico" => $id));
}
if($utente['id_ruolo'] == 3){
$utente["medici"] = PP_GetMediciAssegnati(array("id_paziente" => $id));
}
$notifiche = PP_GetNotifiche(array("id_destinatario"=>$id));
$utente['notifiche'] = $notifiche;
$utente['menu'] = json_decode($utente['menu']);
return $utente;
}
return null;
}
function PP_GetRuoliUtenti(){
global $config;
$query = "SELECT * FROM " . T_UTENTI_RUOLI;
$ruoli = $config->database->query($query, array());
return $ruoli;
}
function PP_EliminaUtente($data){
global $config;
$query_where = array();
$par = array();
if(!empty($data['id'])){
$query_where[] = ' id = :id ';
$par['id'] = $data['id'];
}
if($query_where){
$query = "DELETE FROM " . T_UTENTI . " WHERE ".implode(" AND ", $query_where);
$config->database->query($query, $par);
/* if(!empty($data['id'])){
//Rimozione ricorsiva di attivita, posti, fasce, prenotazioni
$attivita = PP_AttivitaUtente($data['id']);
PP_EliminaAttivita(array("id_utente" => $data['id']), true);
foreach($attivita as $a){
PP_EliminaPosto(array("id_attivita" => $a['id']), true);
PP_EliminaTempo(array("id_attivita" => $a['id']), true);
PP_EliminaPrenotazione(array("id_attivita" => $a['id']), true);
}
PP_EliminaPrenotazione(array("id_utente" => $data['id']), true);
} */
return true;
}
return false;
}
function PP_GetListaUtenti(){
global $config;
$query = "SELECT u.id, u.email, u.nome, u.cognome, DATE_FORMAT(u.data_creazione, '%d/%m/%Y %H:%i:%s'), ur.ruolo
FROM " . T_UTENTI . " u JOIN ". T_UTENTI_RUOLI." ur ON u.id_ruolo = ur.id";
$utenti = $config->database->query($query, array());
/* $utenti = [];
while($utente = mysqli_fetch_array($query, MYSQLI_NUM)){
$utenti[]= $utente;
} */
return $utenti;
}
function PP_PasswordSecure($password){
if(strlen($password) >= 4){
return true;
}
return false;
}
?>
/******* FUNZIONI PAZIENTI **************/
function PP_GetMediciAssegnati($data){
global $config;
$query_where = null;
if(!empty($data['id_paziente']) && empty($config->utente)){
$query_where[] = " pm.id_paziente = '".PP_Secure($data['id_paziente'])."' ";
}else{
$query_where[] = " pm.id_paziente = '".PP_Secure($config->utente['id'])."' ";
}
if($query_where){
$query_where = " WHERE ".implode(" AND ", $query_where);
}
$query = "SELECT u.* FROM " . T_PAZIENTI_MEDICI . " pm
LEFT JOIN " . T_UTENTI . " u ON u.id = pm.id_medico $query_where";
$medici = $config->database->query($query, array());
return $medici;
}
function PP_GetPrenotazioniPaziente($data = null){
global $config;
$id_paziente = $config->utente['id'];
$query_where[] = " p.id_paziente = $id_paziente ";
if(!empty($data['id'])){
$query_where[] = " p.id = '".PP_Secure($data['id'])."' ";
}
if($query_where){
$query_where = " WHERE ".implode(" AND ", $query_where);
}
$query = "SELECT pd.*, p.id as id_prenotazione, p.data_prenotazione, p.data_creazione, p.id_stato, ps.colore,
motivazione.valore as motivazione, allegati.valore as allegati, CONCAT(u.nome, ' ', u.cognome) as nome_medico
FROM " . T_PRENOTAZIONI . " p
LEFT JOIN " . T_UTENTI . " u ON p.id_medico = u.id
LEFT JOIN " . T_PRENOTAZIONI_DISPONIBILITA . " pd ON p.id_disponibilita = pd.id
LEFT JOIN " . T_PRENOTAZIONI_STATI . " ps ON p.id_stato = ps.id
LEFT JOIN " . T_PRENOTAZIONI_DETTAGLI . " motivazione ON motivazione.id_prenotazione = p.id AND motivazione.campo = 'motivazione'
LEFT JOIN " . T_PRENOTAZIONI_DETTAGLI . " allegati ON allegati.id_prenotazione = p.id AND allegati.campo = 'allegati'
$query_where ORDER BY p.data_prenotazione DESC";
$prenotazioni = $config->database->query($query, array());
return $prenotazioni;
}
function PP_GetPrenotazioniDisponibilita($data = null){
global $config;
$id_paziente = $config->utente['id'];
$query_where[] = " pm.id_paziente = {$config->utente['id']} ";
if(!empty($data['giorno_settimana'])){
$query_where[] = " pd.giorno_settimana = ".PP_Secure($data['giorno_settimana'])." ";
}
if($query_where){
$query_where = " WHERE ".implode(" AND ", $query_where);
}
$query_join = "";
if(!empty($data['data_prenotazione'])){
$query_join = " AND p.data_prenotazione = '".PP_Secure($data['data_prenotazione'])."' ";
}
$query = "SELECT pd.*, p.id_stato, ps.colore FROM " . T_PRENOTAZIONI_DISPONIBILITA . " pd
LEFT JOIN " . T_PAZIENTI_MEDICI . " pm ON pd.id_medico = pm.id_medico
LEFT JOIN " . T_PRENOTAZIONI . " p ON p.id_disponibilita = pd.id $query_join
LEFT JOIN " . T_PRENOTAZIONI_STATI . " ps ON p.id_stato = ps.id $query_where ";
$disponibilita = $config->database->query($query, array());
return $disponibilita;
}
function PP_Prenotabile($data){
global $config;
$id_paziente = $config->utente['id'];
$query_where[] = " id_paziente = $id_paziente ";
if(!empty($data['data_prenotazione'])){
$query_where[] = " data_prenotazione = '".PP_Secure($data['data_prenotazione'])."' ";
}
if(!empty($data['id_medico'])){
$query_where[] = " id_medico = ".PP_Secure($data['id_medico'])." ";
}
if($query_where){
$query_where = " WHERE ".implode(" AND ", $query_where);
}
$query_join = "";
$query = "SELECT * FROM " . T_PRENOTAZIONI . " $query_where ";
$query = $config->database->query($query, array());
if(count($query) > 0){
return false;
}
return true;
}
function PP_SalvaPrenotazione($data, $files){
global $config;
if(empty($data['data_prenotazione']) || empty($data['id_medico']) || empty($data['id_disponibilita']) || !PP_Prenotabile($data)){
return false;
}
$id_paziente = $config->utente['id'];
$id_medico = PP_Secure($data['id_medico']);
$id_disponibilita = PP_Secure($data['id_disponibilita']);
$data_prenotazione = PP_Secure($data['data_prenotazione']);
$query = "INSERT INTO " . T_PRENOTAZIONI. " (id_paziente, id_medico, id_disponibilita, data_prenotazione, id_stato)
VALUES ($id_paziente, $id_medico, $id_disponibilita, '$data_prenotazione', 2)";
$config->database->query($query, array());
$id_prenotazione = $config->database->lastInsertId();
if($id_prenotazione > 0){
$var_tecniche = array('id_paziente', 'data_prenotazione', 'id_medico', 'id_disponibilita', 'f', 'hash');
$query_dettagli = '';
$keys = [];
foreach($data as $key=>$value){
if(!in_array($key, $var_tecniche) && $value != ''){
if(is_array($value)){
$value = json_encode($value);
}
$query_dettagli.= " ($id_prenotazione, '$key', '$value'),";
$keys[] = "'".$key."'";
}
}
if(strlen($query_dettagli)>0){
//Cancello le chiavi da aggiornare
$query_rimuovi_dettagli = "DELETE FROM ".T_PRENOTAZIONI_DETTAGLI."
WHERE id_prenotazione = $id_prenotazione AND campo IN (".implode(",", $keys).")";
$config->database->query($query_rimuovi_dettagli, array());
$query_dettagli = substr($query_dettagli, 0, strlen($query_dettagli) - 1);
$query_dettagli = "INSERT INTO " . T_PRENOTAZIONI_DETTAGLI. " (id_prenotazione, campo, valore) VALUES ".$query_dettagli.";";
$config->database->query($query_dettagli, array());
}
//Salvo i files
if($files){
//Scorro i files allegati
foreach($files as $key => $value){
$n_files = count($value["name"]);
$paths = [];
for($i=0; $i<$n_files; $i++){
$path = PP_SecureFilePath($value["name"][$i]);
move_uploaded_file($value["tmp_name"][$i],ABSPATH.$path);
$paths[]= $path;
}
//Mantengo quelli esistenti
$query_files = "SELECT * FROM " .T_PRENOTAZIONI_DETTAGLI. " WHERE id_prenotazione = $id_prenotazione";
$dettagli_prenotazione = $config->database->query($query_files, array());
if(isset($dettagli_prenotazione[$key]) && is_array($dettagli_prenotazione[$key])){
$paths = array_merge($paths, $dettagli_prenotazione[$key]);
}
$query_rimuovi_dettagli = "DELETE FROM ".T_PRENOTAZIONI_DETTAGLI."
WHERE id_prenotazione = $id_prenotazione AND campo IN ('$key')";
$config->database->query($query_rimuovi_dettagli, array());
$query_dettagli = "INSERT INTO " . T_PRENOTAZIONI_DETTAGLI. " (id_prenotazione, campo, valore)
VALUES ($id_prenotazione, '$key', '".json_encode($paths)."');";
$config->database->query($query_dettagli, array());
}
}
PP_CreaNotifica(array('id_mittente' => $id_paziente,
'id_destinatario' => $id_medico,
'titolo' => 'Prenotazione da confermare',
'contenuto' => 'Nuova prenotazione per giorno '.PP_db2viewDate($data_prenotazione),
'tipo' => 'fas fa-exclamation-circle',
'link' => 'calendario_prenotazioni/'.$data_prenotazione
));
return true;
}
return false;
}
function PP_EliminaPrenotazionePaziente($data = null){
global $config;
if(empty($data['id'])){
return false;
}
$id = PP_Secure($data['id']);
$prenotazione = PP_GetPrenotazioniPaziente(array("id"=>$id));
if(count($prenotazione) > 0){
$prenotazione = $prenotazione[0];
$id_paziente = $config->utente['id'];
$id_medico = $prenotazione['id_medico'];
$data_prenotazione = $prenotazione['data_prenotazione'];
$query = "DELETE FROM ". T_PRENOTAZIONI ." WHERE id = $id AND id_paziente = $id_paziente";
if($config->database->query($query, array())){
PP_CreaNotifica(array('id_mittente' => $id_paziente,
'id_destinatario' => $id_medico,
'titolo' => 'Prenotazione annullata',
'contenuto' => 'Prenotazione per giorno '.PP_db2viewDate($data_prenotazione).' annullata',
'tipo' => 'fas fa-exclamation-circle',
'link' => 'calendario_prenotazioni/'.$data_prenotazione
));
return true;
}
}
return false;
}
function PP_GetDiariClinici($data = null){
global $config;
$query_where = null;
$query_where[] = " id_paziente = {$config->utente['id']} ";
if(!empty($data['data_diario_clinico'])){
$query_where[] = " data_diario_clinico = '".PP_Secure($data['data_diario_clinico'])."' ";
}
if($query_where){
$query_where = " WHERE ".implode(" AND ", $query_where);
}
$query = "SELECT * FROM " . T_DIARI_CLINICI . " $query_where";
$query = $config->database->query($query, array());
$diari_clinici = [];
foreach($query as $diario_clinico){
if(!isset($diari_clinici[$diario_clinico["id_paziente"]])){
$diari_clinici[$diario_clinico["id_paziente"]] = [];
}
if(!isset($diari_clinici[$diario_clinico["id_paziente"]][$diario_clinico["data_diario_clinico"]])){
$diari_clinici[$diario_clinico["id_paziente"]][$diario_clinico["data_diario_clinico"]] = [];
}
if(PP_IsJson($diario_clinico["valore"])){
$diario_clinico["valore"] = json_decode($diario_clinico["valore"]);
}
$diari_clinici[$diario_clinico["id_paziente"]][$diario_clinico["data_diario_clinico"]][$diario_clinico["campo"]] = $diario_clinico["valore"];
}
return $diari_clinici;
}
function PP_SalvaDiarioClinico($data, $files){
global $config;
if(empty($data['data_diario_clinico'])){
return false;
}
$id_paziente = $config->utente['id'];
$data_diario_clinico = PP_Secure($data['data_diario_clinico']);
$var_tecniche = array('id_paziente', 'data_diario_clinico', 'f', 'hash');
$query_dettagli = '';
$keys = [];
foreach($data as $key=>$value){
if(!in_array($key, $var_tecniche) && $value != ''){
if(is_array($value)){
$value = json_encode($value);
}
$query_dettagli.= " ($id_paziente, '$data_diario_clinico', '$key', '$value'),";
$keys[] = "'".$key."'";
}
}
if(strlen($query_dettagli)>0){
//Cancello le chiavi da aggiornare
$query_rimuovi_dettagli = "DELETE FROM ".T_DIARI_CLINICI."
WHERE id_paziente = $id_paziente AND data_diario_clinico = '$data_diario_clinico' AND campo IN (".implode(",", $keys).")";
$config->database->query($query_rimuovi_dettagli, array());
$query_dettagli = substr($query_dettagli, 0, strlen($query_dettagli) - 1);
$query_dettagli = "INSERT INTO " . T_DIARI_CLINICI. " (id_paziente, data_diario_clinico, campo, valore) VALUES ".$query_dettagli.";";
$config->database->query($query_dettagli, array());
}
//Salvo i files
if($files){
//Scorro i files allegati
foreach($files as $key => $value){
$n_files = count($value["name"]);
$paths = [];
for($i=0; $i<$n_files; $i++){
$path = PP_SecureFilePath($value["name"][$i]);
move_uploaded_file($value["tmp_name"][$i],ABSPATH.$path);
$paths[]= $path;
}
//Mantengo quelli esistenti
$diario_clinico = PP_GetDiariClinici(array('data_diario_clinico' => $data['data_diario_clinico']));
if($diario_clinico){
$diario_clinico = $diario_clinico[$id_paziente][$data['data_diario_clinico']];
}
if(isset($diario_clinico[$key]) && is_array($diario_clinico[$key])){
$paths = array_merge($paths, $diario_clinico[$key]);
}
$query_rimuovi_dettagli = "DELETE FROM ".T_DIARI_CLINICI."
WHERE id_paziente = $id_paziente AND data_diario_clinico = '$data_diario_clinico' AND campo IN ('$key')";
$config->database->query($query_rimuovi_dettagli, array());
$query_dettagli = "INSERT INTO " . T_DIARI_CLINICI. " (id_paziente, data_diario_clinico, campo, valore)
VALUES ($id_paziente, '$data_diario_clinico', '$key', '".json_encode($paths)."');";
$config->database->query($query_dettagli, array());
}
}
return true;
}
function PP_EliminaFileDiarioClinico($data){
global $config;
$query_where = [];
if(empty($data['campo']) || empty($data['path']) || empty($data['data_diario_clinico'])){
return false;
}
$id_paziente = $config->utente['id'];
$data_diario_clinico = PP_Secure($data['data_diario_clinico']);
$campo = PP_Secure($data['campo']);
$path = PP_Secure($data['path']);
$query = "SELECT valore FROM " . T_DIARI_CLINICI ."
WHERE id_paziente = $id_paziente AND data_diario_clinico = '$data_diario_clinico' AND campo = '$campo'";
$files = $config->database->query($query, array());
if(count($files) > 0){
$files = $files[0];
$files = json_decode($files['valore']);
if (($key = array_search($path, $files)) !== false) {
unlink(ABSPATH.$files[$key]);
array_splice($files, $key, 1);
}
if(count($files) > 0){
$files = json_encode($files);
$query = "UPDATE " . T_DIARI_CLINICI . " SET valore = '$files'
WHERE id_paziente = $id_paziente AND data_diario_clinico = '$data_diario_clinico' AND campo = '$campo' ";
$config->database->query($query, array());
}else{
$query = "DELETE FROM " . T_DIARI_CLINICI . "
WHERE id_paziente = $id_paziente AND data_diario_clinico = '$data_diario_clinico' AND campo = '$campo' ";
$config->database->query($query, array());
}
return true;
}
return false;
}
function PP_ConfermaTerapia($data = null){
global $config;
if(empty($data['id_calendario']) || empty($data['id_terapia'])){
return false;
}
$terapia = PP_GetTerapiePaziente(array("id" => PP_Secure($data['id_terapia'])));
if(count($terapia) > 0){
$query = "UPDATE " . T_TERAPIE_CALENDARI . " SET esito = 1, data_esito='".date("Y-m-d H:i:s")."' WHERE id = '".PP_Secure($data['id_calendario'])."' ";
if($config->database->query($query, array())){
if(!empty($data['id_notifica'])){
//Rimuovo la notifica
$query = "DELETE FROM ".T_NOTIFICHE." WHERE id = ".$data['id_notifica'];
$config->database->query($query, array());
}
return true;
}
}
return false;
}
/***** VISITE *****/
function PP_GetVisitePaziente($data = null){
global $config;
$id_paziente = $config->utente['id'];
$query_where[] = " v.id_paziente = :id_paziente ";
$par["id_paziente"] = $id_paziente;
if(!empty($data['id'])){
$query_where[] = " v.id = :id ";
$par["id"] = $data['id'];
}
if($query_where){
$query_where = " WHERE ".implode(" AND ", $query_where);
}
$query = "SELECT v.id as id_visita, v.id_paziente, v.id_tipologia, v.data_visita, v.data_creazione, CONCAT(u.nome, ' ', u.cognome) as nome_medico,
v.id_stato, vs.nome as nome_stato, vs.colore, v.dati,
(SELECT COUNT(*) FROM " . T_VISITE . " WHERE DATE(data_visita) = DATE(v.data_visita) AND data_visita < v.data_visita AND id_paziente != v.id_paziente AND id_stato = 2) as coda
FROM " . T_VISITE . " v
LEFT JOIN " . T_UTENTI . " u ON v.id_medico = u.id
LEFT JOIN " . T_VISITE_STATI . " vs ON v.id_stato = vs.id
$query_where ORDER BY v.data_visita DESC, v.id_stato DESC";
$visite = $config->database->query($query, $par);
foreach($visite as $k=>$v){
$visite[$k]["dati"] = json_decode($v["dati"],JSON_OBJECT_AS_ARRAY);
$visite[$k]["start"] = date("Y-m-d\TH:i:s",strtotime($v["data_visita"]));
$visite[$k]["end"] = date("Y-m-d\TH:i:s",strtotime($v["data_visita"]." +30 minutes"));
$visite[$k]["title"] = $v["nome_medico"];
$visite[$k]["color"] = $config->colori[$v["colore"]];
$visite[$k]["giorno"] = date("m/d/Y",strtotime($v["data_visita"]));
$visite[$k]["ora"] =date("H:i",strtotime($v["data_visita"]));
}
return $visite;
}
?>
/******* FUNZIONI MEDICI **************/
function PP_GetPazienti($data = null){
global $config;
$query_where = null;
if(!empty($data['id_medico'])){
$query_where[] = " pm.id_medico = '".PP_Secure($data['id_medico'])."' ";
}
if(!empty($data['id_paziente'])){
$query_where[] = " u.id = '".PP_Secure($data['id_paziente'])."' AND u.id_ruolo = 3 ";
}
if($query_where){
$query_where = " WHERE ".implode(" AND ", $query_where);
}
$query = "SELECT u.*, CONCAT(u.nome, ' ', u.cognome) as nome_paziente FROM
" . T_PAZIENTI_MEDICI . " pm
RIGHT JOIN " . T_UTENTI . " u ON u.id = pm.id_paziente
$query_where";
$pazienti = $config->database->query($query, array());
if(!empty($data['id_paziente']) && count($pazienti) == 1){
$query_dettagli = "SELECT * FROM
" . T_PAZIENTI_DETTAGLI . " WHERE id_paziente = ".PP_Secure($data['id_paziente']);
$dettagli_paziente = $config->database->query($query_dettagli, array());
foreach($dettagli_paziente as $d){
$pazienti[0][$d['campo']] = $d['valore'];
}
}
return $pazienti;
}
function OLD_PP_GetPazientiUfa($data = null){
global $config;
$query_where = null;
if(!empty($data['id_medico'])){
$query_where[] = " pm.id_medico = '".PP_Secure($data['id_medico'])."' ";
}
if(!empty($data['id_paziente'])){
$query_where[] = " u.id = '".PP_Secure($data['id_paziente'])."' AND u.id_ruolo = 3 ";
}
if($query_where){
$query_where = " WHERE ".implode(" AND ", $query_where);
}
$query = "select paz.pazienti_nome as nome, paz.pazienti_cognome as cognome, paz.pazienti_datanascita as data_nascita,
CONCAT(paz.pazienti_nome, ' ', paz.pazienti_cognome) as nome_paziente, CONCAT('UFA_', paz.pazienti_codice) as id, d.diagnosi_descrizione as diagnosi,
prot.protocolli_descrizioneprotocol as protocollo_terapeutico
from
pazienti paz
inner join associazione ass
on paz.pazienti_codice = ass.pazienti_codice
inner join protocolli prot
on ass.associazione_codiceprotocollo = prot.protocolli_codiceprotocollo
inner join diagnosi d
on ass.associazione_codicediagnosi = d.diagnosi_codice
where
paz.pazienti_codice = :id_paziente
limit 1";
$pazienti = $config->database_ext->query($query, array("id_paziente" => $data['id_paziente']));
/*if(!empty($data['id_paziente']) && count($pazienti) == 1){
$query_dettagli = "SELECT * FROM
" . T_PAZIENTI_DETTAGLI . " WHERE id_paziente = ".PP_Secure($data['id_paziente']);
$dettagli_paziente = $config->database->query($query_dettagli, array());
foreach($dettagli_paziente as $d){
$pazienti[0][$d['campo']] = $d['valore'];
}
}*/
return $pazienti;
}
function PP_SalvaPaziente($data = null){
global $config;
if(empty($data['nome']) || empty($data['cognome']) || empty($data['email']) || empty($data['data_nascita'])){
return null;
}
$par_paziente = array(
'nome' => PP_Secure($data['nome']),
'cognome' => PP_Secure($data['cognome']),
'email' => PP_Secure($data['email']),
'password' => md5('ciao'),
'data_nascita' => PP_Secure($data['data_nascita']),
'codice_fiscale' => PP_Secure(strtoupper($data['codice_fiscale'])),
'sesso' => PP_Secure($data['sesso']),
'luogo_nascita' => PP_Secure($data['luogo_nascita']),
'telefono' => PP_Secure($data['telefono']),
'indirizzo' => PP_Secure($data['indirizzo']),
'citta' => PP_Secure($data['citta']),
// NUOVI CAMPI
'medico_base' => PP_Secure($data['medico_base']),
'contatto_emergenza' => PP_Secure($data['contatto_emergenza']),
'esenzione_ticket' => PP_Secure($data['esenzione_ticket']),
'allergie' => PP_Secure($data['allergie']),
'terapie_incorso' => PP_Secure($data['terapie_incorso']),
'abitudini_vita' => PP_Secure($data['abitudini_vita'])
);
$query_paziente = "INSERT INTO " . T_UTENTI. "
(id_ruolo, nome, cognome, email, password, data_nascita, codice_fiscale, sesso, luogo_nascita, telefono, indirizzo, citta, medico_base, contatto_emergenza, esenzione_ticket, allergie, terapie_incorso, abitudini_vita) VALUES
(3, :nome, :cognome, :email, :password, :data_nascita, :codice_fiscale, :sesso, :luogo_nascita, :telefono, :indirizzo, :citta, :medico_base, :contatto_emergenza, :esenzione_ticket, :allergie, :terapie_incorso, :abitudini_vita)";
$config->database->query($query_paziente, $par_paziente);
$id_paziente = $config->database->lastInsertId();
if( $id_paziente > 0){
$par_paziente_medico = !empty($data['id_medico']) ? array('id_medico' => $data['id_medico'], 'id_paziente' => $id_paziente) : array('id_medico' => $config->utente['id'], 'id_paziente' => $id_paziente);
$query_paziente_medico = "INSERT INTO " . T_PAZIENTI_MEDICI. "
(id_medico, id_paziente) VALUES (:id_medico, :id_paziente)";
$config->database->query($query_paziente_medico, $par_paziente_medico);
$par_paziente_dettagli = array_diff_key($data, $par_paziente);
$par_paziente_dettagli = array_diff_key($par_paziente_dettagli, $par_paziente_medico);
$values = array();
foreach($par_paziente_dettagli as $k => $v){
array_push($values, "($id_paziente, '".$k."', '".$v."')");
}
$values = implode(",", $values);
$query_paziente_dettagli = "INSERT INTO " . T_PAZIENTI_DETTAGLI. "
(id_paziente, campo, valore) VALUES $values;";
$config->database->query($query_paziente_dettagli, array());
$paziente = PP_GetPazienti(array("id_paziente" => $id_paziente));
if(count($paziente) == 1){
return $paziente;
}
}
return null;
}
function PP_ModificaPaziente($data = null){
global $config;
if(empty($data['id_paziente']) || empty($data['nome']) || empty($data['cognome']) || empty($data['email']) || empty($data['data_nascita'])){
return null;
}
$id_paziente = $data['id_paziente'];
$par_paziente = array(
'id_paziente' => $id_paziente,
'nome' => PP_Secure($data['nome']),
'cognome' => PP_Secure($data['cognome']),
'email' => PP_Secure($data['email']),
'data_nascita' => PP_Secure($data['data_nascita']),
'codice_fiscale' => PP_Secure(strtoupper($data['codice_fiscale'])),
'sesso' => PP_Secure($data['sesso']),
'luogo_nascita' => PP_Secure($data['luogo_nascita']),
'telefono' => PP_Secure($data['telefono']),
'indirizzo' => PP_Secure($data['indirizzo']),
'citta' => PP_Secure($data['citta']),
// NUOVI CAMPI
'medico_base' => PP_Secure($data['medico_base']),
'contatto_emergenza' => PP_Secure($data['contatto_emergenza']),
'esenzione_ticket' => PP_Secure($data['esenzione_ticket']),
'allergie' => PP_Secure($data['allergie']),
'terapie_incorso' => PP_Secure($data['terapie_incorso']),
'abitudini_vita' => PP_Secure($data['abitudini_vita'])
);
$query_paziente = "UPDATE " . T_UTENTI. " SET
nome = :nome, cognome = :cognome, email = :email, data_nascita = :data_nascita,
codice_fiscale = :codice_fiscale, sesso = :sesso, luogo_nascita = :luogo_nascita,
telefono = :telefono, indirizzo = :indirizzo, citta = :citta,
medico_base = :medico_base, contatto_emergenza = :contatto_emergenza, esenzione_ticket = :esenzione_ticket,
allergie = :allergie, terapie_incorso = :terapie_incorso, abitudini_vita = :abitudini_vita
WHERE id = :id_paziente";
$config->database->query($query_paziente, $par_paziente);
$par_reset = array("id_paziente" => $id_paziente);
$query_reset = "DELETE FROM " . T_PAZIENTI_DETTAGLI. " WHERE id_paziente = :id_paziente";
$config->database->query($query_reset, $par_reset);
$par_paziente_dettagli = array_diff_key($data, $par_paziente);
foreach($par_paziente_dettagli as $k => $v){
if($v!=''){
$query_paziente_dettagli = "INSERT INTO " . T_PAZIENTI_DETTAGLI. "
(id_paziente, campo, valore) VALUES (:id_paziente, :campo, :valore);";
$config->database->query($query_paziente_dettagli, array("id_paziente" => $id_paziente, "campo" => $k, "valore" => $v));
}
}
$paziente = PP_GetPazienti(array("id_paziente" => $id_paziente));
if(count($paziente) > 0){
return $paziente;
}
return null;
}
function PP_EliminaPaziente($data = null){
global $config;
if(empty($data['id_paziente'])){
return null;
}
$par = array("id_paziente" => $data['id_paziente']);
$query = "DELETE FROM " . T_UTENTI. " WHERE id = :id_paziente";
$config->database->query($query, $par);
$query = "DELETE FROM " . T_PAZIENTI_MEDICI. " WHERE id_paziente = :id_paziente";
$config->database->query($query, $par);
$par = array("id_paziente" => $data['id_paziente']);
$query = "DELETE FROM " . T_PAZIENTI_DETTAGLI. " WHERE id_paziente = :id_paziente";
$config->database->query($query, $par);
}
function PP_GetPazientiAssegnati($data = null){
global $config;
$query_where = null;
if(!empty($data['id_medico']) && empty($config->utente)){
$query_where[] = " pm.id_medico = '".PP_Secure($data['id_medico'])."' ";
}else{
$query_where[] = " pm.id_medico = '".PP_Secure($config->utente['id'])."' ";
}
if(!empty($data['id_paziente'])){
$query_where[] = " u.id = '".PP_Secure($data['id_paziente'])."' ";
}
if($query_where){
$query_where = " WHERE ".implode(" AND ", $query_where);
}
$query = "SELECT u.*, CONCAT(u.nome, ' ', u.cognome) as nome_paziente FROM " . T_PAZIENTI_MEDICI . " pm
RIGHT JOIN " . T_UTENTI . " u ON u.id = pm.id_paziente $query_where";
$pazienti = $config->database->query($query, array());
/*$query = "select CONCAT(paz.pazienti_nome, ' ', paz.pazienti_cognome) as nome_paziente, CONCAT('UFA_', paz.pazienti_codice) as id
from
pazienti paz
inner join associazione ass
on paz.pazienti_codice = ass.pazienti_codice
inner join protocolli prot
on ass.associazione_codiceprotocollo = prot.protocolli_codiceprotocollo
where
prot.protocolli_dispensazione = true;";
$pazienti_ufa = $config->database_ext->query($query, array());*/
return $pazienti;
}
function PP_GetFasceOrarie($data = null){
global $config;
$id_medico = $config->utente['id'];
$query_where[] = " pd.id_medico = $id_medico ";
if(!empty($data['giorno_settimana'])){
$query_where[] = " pd.giorno_settimana = ".PP_Secure($data['giorno_settimana'])." ";
}
if($query_where){
$query_where = " WHERE ".implode(" AND ", $query_where);
}
$query_join = "";
if(!empty($data['data_prenotazione'])){
$query_join = " AND p.data_prenotazione = '".PP_Secure($data['data_prenotazione'])."' ";
}
$query = "SELECT pd.*, p.id_stato, ps.colore FROM " . T_PRENOTAZIONI_DISPONIBILITA . " pd
LEFT JOIN " . T_PRENOTAZIONI . " p ON p.id_disponibilita = pd.id $query_join
LEFT JOIN " . T_PRENOTAZIONI_STATI . " ps ON p.id_stato = ps.id $query_where ";
$query = $config->database->query($query, array());
$fasce = [];
foreach($query as $d){
$key = PP_TempoDueCifre($d['ora_inizio']).":".PP_TempoDueCifre($d['minuto_inizio'])." - ".PP_TempoDueCifre($d['ora_fine']).":".PP_TempoDueCifre($d['minuto_fine']);
if(!isset($fasce[$key])){
$fasce[$key] = [];
}
array_push($fasce[$key], $d);
}
return $fasce;
}
function PP_SalvaFasciaOraria($data = null){
global $config;
if(empty($data['ora_inizio']) || empty($data['ora_fine']) || empty($data['giorni_settimana'])){
return false;
}
$id_medico = $config->utente['id'];
$ora_inizio = PP_Secure($data['ora_inizio']);
$minuto_inizio = PP_Secure($data['minuto_inizio']);
$ora_fine = PP_Secure($data['ora_fine']);
$minuto_fine = PP_Secure($data['minuto_fine']);
if(PP_IsJson($data['giorni_settimana']))
$giorni_settimana = json_decode($data['giorni_settimana']);
//Verifico se salvabile
$query = "SELECT id, STR_TO_DATE(CONCAT(ora_inizio,':', minuto_inizio), '%H:%i') as orario_inizio_limite,
STR_TO_DATE(CONCAT(ora_fine,':', minuto_fine), '%H:%i') as orario_fine_limite,
STR_TO_DATE('$ora_inizio:$minuto_inizio', '%H:%i') as orario_inizio,
STR_TO_DATE('$ora_fine:$minuto_fine', '%H:%i') as orario_fine
FROM ".T_PRENOTAZIONI_DISPONIBILITA." WHERE id_medico = $id_medico AND giorno_settimana in (".implode(",",$giorni_settimana).")
HAVING (orario_inizio > orario_inizio_limite AND orario_inizio < orario_fine_limite) OR
(orario_fine > orario_inizio_limite AND orario_fine < orario_fine_limite) OR
(orario_inizio < orario_inizio_limite AND orario_fine > orario_fine_limite) OR
(orario_inizio < orario_inizio_limite AND orario_fine >= orario_fine_limite) OR
(orario_inizio <= orario_inizio_limite AND orario_fine > orario_fine_limite)";
$query = $config->database->query($query, array());
if(count($query) > 0)
return false;
$query_insert = array();
if(is_array($giorni_settimana)){
foreach($giorni_settimana as $giorno_settimana){
array_push($query_insert, " ($id_medico, $giorno_settimana, $ora_inizio, $minuto_inizio, $ora_fine, $minuto_fine) ");
}
if(count($query_insert) > 0){
$query_insert = " VALUES ".implode(" , ", $query_insert).";";
$query = "INSERT INTO " . T_PRENOTAZIONI_DISPONIBILITA. " (id_medico, giorno_settimana, ora_inizio, minuto_inizio, ora_fine, minuto_fine) $query_insert";
$config->database->query($query, array());
return true;
}
}
return false;
}
function PP_EliminaFasciaOraria($data = null){
global $config;
if(empty($data['id'])){
return false;
}
$id = PP_Secure($data['id']);
$id_medico = $config->utente['id'];
$query = "DELETE FROM ". T_PRENOTAZIONI_DISPONIBILITA ." WHERE id in($id) AND id_medico = $id_medico";
if($config->database->query($query, array())){
return true;
}
return false;
}
function PP_GetPrenotazioniMedico($data = null){
global $config;
$id_medico = $config->utente['id'];
$query_where[] = " p.id_medico = $id_medico ";
if(!empty($data['data_prenotazione'])){
$query_where[] = " p.data_prenotazione = '".PP_Secure($data['data_prenotazione'])."' ";
}
if(!empty($data['data_inizio'])){
$query_where[] = " p.data_prenotazione >= '".PP_Secure($data['data_inizio'])."' ";
}
if(!empty($data['data_fine'])){
$query_where[] = " p.data_prenotazione <= '".PP_Secure($data['data_fine'])."' ";
}
if(!empty($data['id'])){
$query_where[] = " p.id = '".PP_Secure($data['id'])."' ";
}
if($query_where){
$query_where = " WHERE ".implode(" AND ", $query_where);
}
$query = "SELECT pd.*, p.id as id_prenotazione, p.id_paziente, p.data_prenotazione, p.data_creazione, p.id_stato, ps.colore,
motivazione.valore as motivazione, allegati.valore as allegati, CONCAT(u.nome, ' ', u.cognome) as nome_paziente
FROM " . T_PRENOTAZIONI . " p
LEFT JOIN " . T_UTENTI . " u ON p.id_paziente = u.id
LEFT JOIN " . T_PRENOTAZIONI_DISPONIBILITA . " pd ON p.id_disponibilita = pd.id
LEFT JOIN " . T_PRENOTAZIONI_STATI . " ps ON p.id_stato = ps.id
LEFT JOIN " . T_PRENOTAZIONI_DETTAGLI . " motivazione ON motivazione.id_prenotazione = p.id AND motivazione.campo = 'motivazione'
LEFT JOIN " . T_PRENOTAZIONI_DETTAGLI . " allegati ON allegati.id_prenotazione = p.id AND allegati.campo = 'allegati'
$query_where ORDER BY p.id_stato DESC";
$query = $config->database->query($query, array());
$prenotazioni = [];
foreach($query as $p){
$p['allegati'] = json_decode($p['allegati']);
array_push($prenotazioni, $p);
}
return $prenotazioni;
}
function PP_GetPrenotazioniMedicoSettimana($data = null){
global $config;
$id_medico = $config->utente['id'];
$query_where[] = " pd.id_medico = $id_medico ";
if(!empty($data['giorno_settimana'])){
$query_where[] = " pd.giorno_settimana = '".PP_Secure($data['giorno_settimana'])."' ";
}
if($query_where){
$query_where = " WHERE ".implode(" AND ", $query_where);
}
$query = "SELECT pd.*, p.id as id_prenotazione, p.id_paziente, p.data_prenotazione, p.data_creazione, p.id_stato, ps.colore,
motivazione.valore as motivazione, allegati.valore as allegati, CONCAT(u.nome, ' ', u.cognome) as nome_paziente
FROM " . T_PRENOTAZIONI_DISPONIBILITA . " pd
LEFT JOIN " . T_PRENOTAZIONI . " p ON p.id_disponibilita = pd.id AND p.data_prenotazione >= '".PP_Secure($data['data_inizio'])."' AND p.data_prenotazione <= '".PP_Secure($data['data_fine'])."'
LEFT JOIN " . T_UTENTI . " u ON p.id_paziente = u.id
LEFT JOIN " . T_PRENOTAZIONI_STATI . " ps ON p.id_stato = ps.id
LEFT JOIN " . T_PRENOTAZIONI_DETTAGLI . " motivazione ON motivazione.id_prenotazione = p.id AND motivazione.campo = 'motivazione'
LEFT JOIN " . T_PRENOTAZIONI_DETTAGLI . " allegati ON allegati.id_prenotazione = p.id AND allegati.campo = 'allegati'
$query_where ORDER BY pd.giorno_settimana, pd.ora_inizio, pd.minuto_inizio";
$query = $config->database->query($query, array());
$prenotazioni = [];
foreach($query as $p){
$p['allegati'] = json_decode($p['allegati']);
array_push($prenotazioni, $p);
}
return $prenotazioni;
}
function PP_ConfermaPrenotazione($data = null){
global $config;
if(empty($data['id'])){
return false;
}
$id_medico = $config->utente['id'];
$query_where[] = " id_medico = $id_medico ";
if(!empty($data['id'])){
$query_where[] = " id = '".PP_Secure($data['id'])."' ";
}
if($query_where){
$query_where = " WHERE ".implode(" AND ", $query_where);
}
$query = "UPDATE " . T_PRENOTAZIONI . " SET id_stato = 3 $query_where";
if($config->database->query($query, array())){
$prenotazione = PP_GetPrenotazioniMedico(array('id' => PP_Secure($data['id'])));
if(count($prenotazione) > 0){
$prenotazione = $prenotazione[0];
PP_CreaNotifica(array('id_mittente' => $id_medico,
'id_destinatario' => $prenotazione['id_paziente'],
'titolo' => 'Prenotazione confermata',
'contenuto' => 'La prenotazione per giorno '.PP_db2viewDate($prenotazione['data_prenotazione']).' dalle '.PP_TempoDueCifre($prenotazione['ora_inizio']).':'.PP_TempoDueCifre($prenotazione['minuto_inizio']).' alle '.PP_TempoDueCifre($prenotazione['ora_fine']).':'.PP_TempoDueCifre($prenotazione['minuto_fine']).' è stata confermata',
'tipo' => 'far fa-check-circle',
'link' => 'le_mie_prenotazioni'
));
return true;
}
}
return false;
}
function PP_EliminaPrenotazioneMedico($data = null){
global $config;
if(empty($data['id'])){
return false;
}
$id = PP_Secure($data['id']);
$motivazione = '';
if(isset($data['motivazione'])){
$motivazione = $data['motivazione'];
}
$prenotazione = PP_GetPrenotazioniMedico(array("id"=>$id));
if(count($prenotazione) > 0){
$prenotazione = $prenotazione[0];
$id_medico = $config->utente['id'];
$id_paziente = $prenotazione['id_paziente'];
$data_prenotazione = $prenotazione['data_prenotazione'];
//Elimino allegati e dettagli
if(isset($prenotazione["allegati"])){
foreach($prenotazione["allegati"] as $allegato){
unlink(ABSPATH.$allegato);
}
}
$query = "DELETE FROM ". T_PRENOTAZIONI_DETTAGLI ." WHERE id_prenotazione = $id";
$config->database->query($query, array());
$query = "DELETE FROM ". T_PRENOTAZIONI ." WHERE id = $id AND id_medico = $id_medico";
if($config->database->query($query, array())){
PP_CreaNotifica(array('id_mittente' => $id_medico,
'id_destinatario' => $id_paziente,
'titolo' => 'Prenotazione annullata',
'contenuto' => 'Prenotazione per giorno '.PP_db2viewDate($data_prenotazione).' annullata con il seguente motivo: '.$motivazione,
'tipo' => 'fas fa-exclamation-circle',
'link' => 'le-mie-prenotazioni'
));
return true;
}
}
return false;
}
function PP_GetDiariCliniciPaziente($data){
global $config;
$query_where = null;
$query_where[] = " pm.id_medico = {$config->utente['id']} ";
if(!empty($data['id_paziente'])){
$query_where[] = " d.id_paziente = ".PP_Secure($data['id_paziente'])." ";
}
if(!empty($data['data_inizio'])){
$query_where[] = " d.data_diario_clinico >= '".PP_Secure($data['data_inizio'])."' ";
}
if(!empty($data['data_fine'])){
$query_where[] = " d.data_diario_clinico <= '".PP_Secure($data['data_fine'])."' ";
}
if($query_where){
$query_where = " WHERE ".implode(" AND ", $query_where);
}
$query = "SELECT * FROM " . T_DIARI_CLINICI . " d
JOIN " . T_PAZIENTI_MEDICI . " pm ON d.id_paziente = pm.id_paziente $query_where ORDER BY d.data_diario_clinico ASC";
$query = $config->database->query($query, array());
$diari_clinici = [];
foreach($query as $diario_clinico){
$valore = $diario_clinico["valore"];
if(!isset($diari_clinici[$diario_clinico["campo"]])){
$diari_clinici[$diario_clinico["campo"]] = [];
}
if(PP_IsJson($valore)){
$valore = json_decode($valore);
}
/* if(in_array('valori_'.$diario_clinico["campo"], array_keys($config->parametri))){
$valore = $config->parametri['valori_'.$diario_clinico["campo"]][$valore];
} */
$diari_clinici[$diario_clinico["campo"]][$diario_clinico["data_diario_clinico"]] = $valore;
}
return $diari_clinici;
}
function PP_GetTerapiePaziente($data = null){
global $config;
if(!empty($data['id_paziente'])){
$id_medico = empty($data['id_medico']) ? $config->utente['id'] : $data['id_medico'];
$query_where[] = " t.id_paziente = ".PP_Secure($data['id_paziente'])." ";
$query_where[] = " t.id_medico = $id_medico ";
}
if(empty($data['id_paziente'])){
$id_paziente = $config->utente['id'];
$query_where[] = " t.id_paziente = $id_paziente";
}
if(!empty($data['id'])){
$query_where[] = " t.id = ".PP_Secure($data['id'])." ";
}
if(!empty($data['data_notifica'])){
$query_where[] = " tc.data_notifica = '".PP_Secure($data['data_notifica'])."' ";
}
if($query_where){
$query_where = " WHERE ".implode(" AND ", $query_where);
}
$query = "SELECT t.*, tc.id as id_calendario, tc.data_notifica, tc.esito, tc.data_esito FROM " . T_TERAPIE . " t
LEFT JOIN " . T_UTENTI . " u ON t.id_paziente = u.id
LEFT JOIN " .T_TERAPIE_CALENDARI." tc ON tc.id_terapia = t.id $query_where ORDER BY t.id DESC, tc.id ASC";
$query = $config->database->query($query, array());
$terapie = [];
foreach($query as $t){
if(!isset($terapie[$t['id']])){
$terapie[$t['id']] = $t;
$terapie[$t['id']]['calendario'] = [];
array_push($terapie[$t['id']]['calendario'], array("id_calendario" => $t["id_calendario"], "data_notifica" => $t["data_notifica"], "esito" => $t["esito"], "data_esito" => $t["data_esito"]));
}else{
array_push($terapie[$t['id']]['calendario'], array("id_calendario" => $t["id_calendario"], "data_notifica" => $t["data_notifica"], "esito" => $t["esito"], "data_esito" => $t["data_esito"]));
}
}
$terapie = array_values($terapie);
return $terapie;
}
function OLD_PP_GetTerapiePazienteUfa($data = null){
global $config;
$query = "select dos.dosaggi_id as id,
dos.dosaggi_codicepaziente,
dos.dosaggi_numeroassociazione,
dos.dosaggi_ciclo,
dos.dosaggi_giorno as frequenza,
'D' as unita_misura_frequenza,
dos.dosaggi_datasomministrazione as data_inizio,
dos.dosaggi_datasomministrazione + INTERVAL '30 days' as data_fine,
dos.dosaggi_creatinina, -- in realtà è l'ordine di somministrazione
farm.farmaci_codice,
farm.farmaci_descrizione as farmaco,
dos.dosaggi_doseprevista as quantita,
LOWER(farm.farmaci_unitadimisura) as unita_misura_quantita,
formfarm.formefarmaceutiche_codice,
formfarm.formefarmaceutiche_descrizione,
tab.tabelle_codice,
tab.tabelle_descrizione
from
dosaggi dos
inner join farmaci farm
on dos.dosaggi_codicefarmaco = farm.farmaci_codice
inner join formefarmaceutiche formfarm
on dos.dosaggi_codiceforma = formfarm.formefarmaceutiche_codice
inner join tabelle tab
on dos.dosaggi_tr_somministrazione = tab.tabelle_tipo
and dos.dosaggi_codicesomministrazione = tab.tabelle_codice
where
dos.dosaggi_codicepaziente = :id_paziente
and dos.dosaggi_numeroassociazione = 6
order by
dos.dosaggi_numeroassociazione ,
dos.dosaggi_ciclo ,
dos.dosaggi_giorno,
dos.dosaggi_creatinina;";
/*$query = "SELECT t.*, tc.id as id_calendario, tc.data_notifica, tc.esito, tc.data_esito FROM " . T_TERAPIE . " t
LEFT JOIN " . T_UTENTI . " u ON t.id_paziente = u.id
LEFT JOIN " .T_TERAPIE_CALENDARI." tc ON tc.id_terapia = t.id $query_where ORDER BY t.id DESC, tc.id ASC";*/
$query = $config->database_ext->query($query, array("id_paziente" => $data['id_paziente']));
$terapie = [];
foreach($query as $t){
if(!isset($terapie[$t['id']])){
$terapie[$t['id']] = $t;
$terapie[$t['id']]['calendario'] = array();
for($i = 1; $i<=28; $i++){
$date = date_create($t['data_inizio']);
date_add($date, date_interval_create_from_date_string(($i-1)." days"));
$esito = $date >= date_create() ? 0 : 1;
$date = date_format($date, "Y-m-d");
array_push($terapie[$t['id']]['calendario'], array("id_calendario" => $t['id']."_".$i, "data_notifica" => $date, "esito" => $esito, "data_esito" => $date));
}
//$terapie[$t['id']]['calendario'] = [];
//array_push($terapie[$t['id']]['calendario'], array("id_calendario" => $t["id_calendario"], "data_notifica" => $t["data_notifica"], "esito" => $t["esito"], "data_esito" => $t["data_esito"]));
}
//else{
// array_push($terapie[$t['id']]['calendario'], array("id_calendario" => $t["id_calendario"], "data_notifica" => $t["data_notifica"], "esito" => $t["esito"], "data_esito" => $t["data_esito"]));
//}
}
$terapie = array_values($terapie);
return $terapie;
}
function PP_SalvaTerapia($data = null){
global $config;
if(empty($data['id_paziente']) || empty($data['farmaco']) || empty($data['quantita']) || empty($data['unita_misura_quantita']) ||
empty($data['data_inizio']) || (empty($data['data_fine']) && empty($data['durata']) && empty($data['unita_misura_durata']))){
return null;
}
if(!(empty($data['data_inizio'])) && !(empty($data['data_fine'])) && date("Y-m-d",strtotime($data['data_inizio'])) > date("Y-m-d",strtotime($data['data_fine']))){
return null;
}
$id_medico = empty($data['id_medico']) ? $config->utente['id'] : $data['id_medico'];
$id_paziente = PP_Secure($data['id_paziente']);
$farmaco = PP_Secure($data['farmaco']);
$quantita = PP_Secure($data['quantita']) != '' ? PP_Secure($data['quantita']) : 0;
$unita_misura_quantita = PP_Secure($data['unita_misura_quantita']);
$data_inizio = PP_Secure($data['data_inizio']);
$data_fine = PP_Secure($data['data_fine']) != '' ? "'".PP_Secure($data['data_fine'])."'" : "NULL" ;
$durata = empty($data['durata']) ? 0 : PP_Secure($data['durata']);
$unita_misura_durata = PP_Secure($data['unita_misura_durata']);
$frequenza = PP_Secure($data['frequenza']) != '' ? PP_Secure($data['frequenza']) : 0;
$unita_misura_frequenza = PP_Secure($data['unita_misura_frequenza']);
$stomaco_pieno = PP_PrintIfKeyExist($data, 'stomaco_pieno') != '' ? 1 : 0;
$note = PP_Secure($data['note']);
$id_ufa = empty($data['id_ufa']) ? "NULL" : "'".PP_Secure($data['id_ufa'])."'" ;
$query = "INSERT INTO " . T_TERAPIE. "
(id_medico, id_paziente, farmaco, quantita, unita_misura_quantita, data_inizio, data_fine, durata, unita_misura_durata, frequenza, unita_misura_frequenza, stomaco_pieno, note, id_ufa) VALUES
(:id_medico, :id_paziente, :farmaco, :quantita, :unita_misura_quantita, :data_inizio, $data_fine, :durata, :unita_misura_durata, :frequenza, :unita_misura_frequenza, :stomaco_pieno, :note, $id_ufa)";
$config->database->query($query, array("id_medico" => $id_medico,
"id_paziente" => $id_paziente,
"farmaco" => $farmaco,
"quantita" => $quantita,
"unita_misura_quantita" => $unita_misura_quantita,
"data_inizio" => $data_inizio,
"durata" => $durata,
"unita_misura_durata" => $unita_misura_durata,
"frequenza" => $frequenza,
"unita_misura_frequenza" => $unita_misura_frequenza,
"stomaco_pieno" => $stomaco_pieno,
"note" => $note));
$id_terapia = $config->database->lastInsertId();
if( $id_terapia > 0){
$terapia = PP_GetTerapiePaziente(array("id" => $id_terapia, "id_paziente" => $id_paziente, "id_medico" => $id_medico));
if(count($terapia) > 0){
$terapia = $terapia[0];
//Genero il calendario delle terapie e estraggo nuovamente la terapia
if(PP_GeneraCalendarioTerapia(array('terapia' => $terapia))){
$terapia = PP_GetTerapiePaziente(array("id" => $id_terapia, "id_paziente" => $id_paziente, "id_medico" => $id_medico));
$terapia = $terapia[0];
$durata = ($terapia["durata"] > 0) ? " per ".$terapia["durata"]." ".$config->parametri["unita_misura_durata"][$terapia["unita_misura_durata"]] : " al ".PP_db2viewDate($terapia["data_fine"]);
PP_CreaNotifica(array('id_mittente' => $id_medico,
'id_destinatario' => $id_paziente,
'titolo' => 'Nuova terapia assegnata',
'contenuto' => ''.$terapia["farmaco"].' dal '.PP_db2viewDate($terapia["data_inizio"]).' '.$durata,
'tipo' => 'fas fa-notes-medical',
'link' => 'le_mie_terapie'
));
//Genero tutte le notifiche
foreach($terapia["calendario"] as $c){
$contenuto_notifica = "Confermi di aver assunto la dose di ".$terapia['quantita']." ".$terapia['unita_misura_quantita']." di ".$terapia['farmaco']." programmata per oggi?
";
PP_CreaNotifica(array('id_mittente' => $terapia['id_medico'],
'id_destinatario' => $terapia['id_paziente'],
'titolo' => 'Terapia del giorno',
'contenuto' => $contenuto_notifica,
'data_notifica' => $c['data_notifica'],
'tipo' => 'fas fa-notes-medical',
'link' => 'le_mie_terapie',
'id_univoco' => $terapia['id']
));
}
}
return $terapia ;
}
}
return null;
}
function PP_GeneraCalendarioTerapia($data = null){
global $config;
if(empty($data['terapia'])){
return false;
}
$terapia = $data['terapia'];
$query_insert = [];
if(!isset($terapia['data_fine'])){
$terapia['data_fine'] = date('Y-m-d', strtotime("+".$terapia['durata']." ".$terapia['unita_misura_durata'], strtotime($terapia['data_inizio'])));
}
$intervallo = '';
switch($terapia['unita_misura_frequenza']){
case 'H':
$intervallo = 'P0DT'.$terapia['frequenza'].'H';
break;
case 'D':
$intervallo = 'P'.$terapia['frequenza'].'D';
break;
case 'W':
$intervallo = 'P'.(intval($terapia['frequenza'])*7).'D';
break;
case 'M':
$intervallo = 'P'.$terapia['frequenza'].'M';
break;
}
$periodo_terapia = new DatePeriod(new DateTime($terapia['data_inizio']), new DateInterval($intervallo),new DateTime($terapia['data_fine']));
foreach ($periodo_terapia as $key => $value) {
array_push($query_insert, "(".$terapia['id'].", '".$value->format('Y-m-d')."', 0)");
}
if(count($query_insert) > 0){
$query_insert = implode(" , ", $query_insert);
$query = "INSERT INTO ".T_TERAPIE_CALENDARI." (id_terapia, data_notifica, esito) VALUES $query_insert";
$config->database->query($query, array());
return true;
}
return false;
}
function PP_EliminaTerapia($data = null){
global $config;
if(empty($data['id'])){
return false;
}
$id = PP_Secure($data['id']);
$id_medico = $config->utente['id'];
$query = "DELETE FROM ". T_TERAPIE ." WHERE id IN ($id) AND id_medico = $id_medico";
if($config->database->query($query, array())){
//Cancello i calendari e le notifiche programmate
$query = "DELETE FROM ". T_TERAPIE_CALENDARI ." WHERE id_terapia IN ($id)";
$config->database->query($query, array());
$query = "DELETE FROM ". T_NOTIFICHE ." WHERE titolo = 'Terapia del giorno' AND id_univoco IN ($id)";
$config->database->query($query, array());
return true;
}
return false;
}
/******VISITE******/
function PP_GetVisiteMedico($data = null){
global $config;
$id_medico = $config->utente['id'];
$query_where[] = " v.id_medico = $id_medico ";
if(!empty($data['data_prenotazione'])){
$query_where[] = " DATE(v.data_visita) = '".PP_Secure($data['data_prenotazione'])."' ";
}
if(!empty($data['data_inizio'])){
$query_where[] = " v.data_visita >= '".PP_Secure($data['data_inizio'])."' ";
}
if(!empty($data['data_fine'])){
$query_where[] = " v.data_visita <= '".PP_Secure($data['data_fine'])."' ";
}
if(!empty($data['id'])){
$query_where[] = " v.id = '".PP_Secure($data['id'])."' ";
}
if($query_where){
$query_where = " WHERE ".implode(" AND ", $query_where);
}
$query = "SELECT v.id as id_visita, v.id_paziente, v.data_visita, v.data_creazione, v.id_tipologia, p.campo as tipologia,
CONCAT(u.nome, ' ', u.cognome) as nome_paziente,
v.id_stato, vs.nome as nome_stato, vs.colore, v.dati, v.allegati, v.id_ufa
FROM " . T_VISITE . " v
LEFT JOIN " . T_UTENTI . " u ON v.id_paziente = u.id
LEFT JOIN " . T_VISITE_STATI . " vs ON v.id_stato = vs.id
LEFT JOIN " . T_PARAMETRI . " p ON p.valore = v.id_tipologia AND p.gruppo = 'tipologie_visite'
$query_where ORDER BY v.data_visita, v.id_stato DESC";
$query = $config->database->query($query, array());
$visite = [];
foreach($query as $p){
$data_visita = date("Y-m-d", strtotime($p["data_visita"]));
if(!isset($visite[$data_visita]))
$visite[$data_visita] = [];
$p["dati"] = json_decode($p["dati"],JSON_OBJECT_AS_ARRAY);
$p["allegati"] = json_decode($p["allegati"],JSON_OBJECT_AS_ARRAY);
array_push($visite[$data_visita], $p);
}
return $visite;
}
function PP_GetVisite($data = null){
global $config;
$id_medico = empty($data['id_medico']) ? $config->utente['id'] : $data['id_medico'];
$query_where[] = " v.id_medico = :id_medico ";
$par["id_medico"] = $id_medico;
if(!empty($data['id'])){
$query_where[] = " v.id = :id ";
$par["id"] = $data['id'];
}
if(!empty($data['id_paziente'])){
$query_where[] = " v.id_paziente = :id_paziente ";
$par["id_paziente"] = $data['id_paziente'];
}
if($query_where){
$query_where = " WHERE ".implode(" AND ", $query_where);
}
$query = "SELECT v.id as id_visita, v.id_paziente, v.data_visita, v.id_tipologia, p.campo as tipologia,
v.data_creazione, CONCAT(u.nome, ' ', u.cognome) as nome_paziente,
v.id_stato, vs.nome as nome_stato, vs.colore, v.dati, v.allegati, v.id_ufa
FROM " . T_VISITE . " v
LEFT JOIN " . T_UTENTI . " u ON v.id_paziente = u.id
LEFT JOIN " . T_VISITE_STATI . " vs ON v.id_stato = vs.id
LEFT JOIN " . T_PARAMETRI . " p ON p.valore = v.id_tipologia AND p.gruppo = 'tipologie_visite'
$query_where ORDER BY v.data_visita, v.id_stato DESC";
$visite = $config->database->query($query, $par);
foreach($visite as $k=>$v){
$visite[$k]["dati"] = json_decode($v["dati"],JSON_OBJECT_AS_ARRAY);
$visite[$k]["allegati"] = json_decode($v["allegati"],JSON_OBJECT_AS_ARRAY);
}
return $visite;
}
function PP_ChiamaPazienteVisita($data = null){
global $config;
if(empty($data['id_visita']) || empty($data['id_paziente'])){
return false;
}
$id_medico = $config->utente['id'];
$query = "UPDATE " . T_VISITE . " SET id_stato = 4 WHERE id_stato = 3 AND id_medico = :id_medico";
$par = array("id_medico" => $id_medico);
if($config->database->query($query, $par) > 0){
$query = "UPDATE " . T_VISITE . " SET id_stato = 3 WHERE id = :id_visita AND id_paziente = :id_paziente AND id_medico = :id_medico";
$par = array("id_visita" => $data['id_visita'], "id_paziente" => $data['id_paziente'], "id_medico" => $id_medico);
if($config->database->query($query, $par) > 0){
$contenuto_notifica = "Attenzione è il tuo turno di visita";
PP_CreaNotifica(array('id_mittente' => $id_medico,
'id_destinatario' => $data['id_paziente'],
'titolo' => 'Turno di visita',
'contenuto' => $contenuto_notifica,
'tipo' => 'fas fa-bell',
'link' => 'le_mie_visite',
'id_univoco' => $data['id_visita']
));
return true;
}
}
return false;
}
function PP_AnnullaVisita($data = null){
global $config;
if(empty($data['id_visita'])){
return false;
}
$id_medico = $config->utente['id'];
$visita = PP_GetVisite(array("id" => $data['id_visita']));
if(count($visita) == 1){
$visita = $visita[0];
$query = "DELETE FROM " . T_VISITE . " WHERE id = :id_visita AND id_medico = :id_medico";
$par = array("id_visita" => $data['id_visita'], "id_medico" => $id_medico);
if($config->database->query($query, $par) > 0){
$contenuto_notifica = "Attenzione la visita prevista per il ".PP_db2viewDate($visita["data_visita"])." è stata annullata";
PP_CreaNotifica(array('id_mittente' => $id_medico,
'id_destinatario' => $visita['id_paziente'],
'titolo' => 'Visita annullata',
'contenuto' => $contenuto_notifica,
'tipo' => 'fas fa-bell',
'link' => 'le_mie_visite',
));
return true;
}
}
return false;
}
function PP_SalvaVisita($data = null, $files = null){
global $config;
if(empty($data['id_paziente']) || empty($data['data_visita'])){
return null;
}
$data['dati'] = json_encode(array("unita_operativa" => $data['unita_operativa'], "stanza" => $data['stanza'], "note" => $data['note']));
$id_medico = empty($data['id_medico']) ? $config->utente['id'] : $data['id_medico'];
$id_ufa = empty($data['id_ufa']) ? "NULL" : "'".PP_Secure($data['id_ufa'])."'" ;
//Salvo i files
if($files){
//Scorro i files allegati
foreach($files as $key => $value){
$n_files = count($value["name"]);
$paths = [];
for($i=0; $i<$n_files; $i++){
$path = PP_SecureFilePath($value["name"][$i]);
move_uploaded_file($value["tmp_name"][$i],ABSPATH.$path);
$paths[]= $path;
}
$data["allegati"] = json_encode($paths);
}
}else{
$data["allegati"] = null;
}
$query = "INSERT INTO " . T_VISITE. "
(id_medico, id_paziente, id_tipologia, data_visita, dati, allegati, id_ufa) VALUES
(:id_medico, :id_paziente, :id_tipologia, :data_visita, :dati, :allegati, $id_ufa)";
$par = array("id_medico" => $id_medico, "id_paziente" => $data["id_paziente"], "id_tipologia" => $data["id_tipologia"],
"data_visita" => $data["data_visita"], "allegati" => $data["allegati"], "dati" => $data["dati"]);
$config->database->query($query, $par);
$id_visita = $config->database->lastInsertId();
if( $id_visita > 0){
$visita = PP_GetVisite(array("id" => $id_visita, "id_paziente" => $data["id_paziente"], "id_medico" => $id_medico));
if(count($visita) > 0){
$visita = $visita[0];
$medico = PP_GetMedico($par);
PP_CreaNotifica(array('id_mittente' => $id_medico,
'id_destinatario' => $data["id_paziente"],
'titolo' => 'Nuova visita assegnata',
'contenuto' => 'Visita assegnata da '.$medico['nome'].' '.$medico['cognome'].' per il '.PP_db2viewDate($visita["data_visita"]),
'tipo' => 'fas fa-stethoscope',
'link' => 'le_mie_visite'
));
return $visita ;
}
}
return null;
}
function PP_AssociaVisitaTerapia($data = null){
global $config;
if(empty($data['id_visita']) || empty($data['id_terapia'])){
return null;
}
$query = "INSERT INTO visite_terapie
(id_visita, id_terapia) VALUES
(:id_visita, :id_terapia)";
$par = array("id_visita" => $data["id_visita"], "id_terapia" => $data["id_terapia"]);
$config->database->query($query, $par);
}
/******* DATI MEDICO **********/
function PP_GetMedico($data = null){
global $config;
if(empty($data['id_medico'])) {
return null;
}
$query = " SELECT * FROM ".T_UTENTI." WHERE id = :id_medico LIMIT 1";
$par = array("id_medico" => $data["id_medico"]);
$medico = $config->database->query($query, $par);
return $medico[0];
}
/******* EQUIPE **********/
function PP_GetEquipe($data = null){
global $config;
$id_medico = $config->utente['id'];
$query_where = " SELECT id_equipe FROM ".T_EQUIPE_MEDICI." WHERE id_medico = :id_medico ";
$par["id_medico"] = $id_medico;
if(!empty($data['id_equipe'])){
$query_where = " SELECT id_equipe FROM ".T_EQUIPE_MEDICI." WHERE id_medico = :id_medico AND id_equipe = :id_equipe ";
$par["id_equipe"] = $data['id_equipe'];
}else{
if(!empty($data['id_paziente'])){
$query_where = " SELECT ep.id_equipe FROM ".T_EQUIPE_PAZIENTI." ep
LEFT JOIN ".T_EQUIPE_MEDICI." em ON ep.id_equipe = em.id_equipe WHERE em.id_medico = :id_medico AND ep.id_paziente = :id_paziente ";
$par["id_paziente"] = $data['id_paziente'];
}
}
$query = "SELECT e.id as id_equipe, e.data_creazione, e.data_modifica, em.id_medico, em.id_ordine, ep.id_paziente,
e.nome as nome_equipe, CONCAT(um.nome, ' ', um.cognome) as nome_medico, CONCAT(up.nome, ' ', up.cognome) as nome_paziente
FROM ".T_EQUIPE_MEDICI." em
LEFT JOIN ".T_EQUIPE_PAZIENTI." ep ON em.id_equipe = ep.id_equipe
LEFT JOIN ".T_EQUIPE." e ON e.id = em.id_equipe AND e.id = ep.id_equipe
LEFT JOIN ".T_UTENTI." um on um.id = em.id_medico
LEFT JOIN ".T_UTENTI." up on up.id = ep.id_paziente
WHERE e.id IN ($query_where)
ORDER BY e.id, ep.id_paziente, em.id_ordine";
$query = $config->database->query($query, $par);
$equipe = [];
foreach($query as $e){
if(!isset($equipe[$e['id_equipe']])){
$equipe[$e['id_equipe']] = [];
$equipe[$e['id_equipe']]['id_equipe'] = $e['id_equipe'];
$equipe[$e['id_equipe']]['nome_equipe'] = $e['nome_equipe'];
$equipe[$e['id_equipe']]['data_creazione'] = $e['data_creazione'];
$equipe[$e['id_equipe']]['data_modifica'] = $e['data_modifica'];
$equipe[$e['id_equipe']]['medici'] = [];
$equipe[$e['id_equipe']]['pazienti'] = [];
}
if(!isset($equipe[$e['id_equipe']]['medici'][$e['id_ordine']])){
$equipe[$e['id_equipe']]['medici'][$e['id_ordine']] = [];
}
if(!isset($equipe[$e['id_equipe']]['medici'][$e['id_ordine']][$e['id_medico']])){
$equipe[$e['id_equipe']]['medici'][$e['id_ordine']][$e['id_medico']] = [];
$equipe[$e['id_equipe']]['medici'][$e['id_ordine']][$e['id_medico']]['id_medico'] = $e['id_medico'];
$equipe[$e['id_equipe']]['medici'][$e['id_ordine']][$e['id_medico']]['nome_medico'] = $e['nome_medico'];
$equipe[$e['id_equipe']]['medici'][$e['id_ordine']][$e['id_medico']]['id_ordine'] = $e['id_ordine'];
}
if(!isset($equipe[$e['id_equipe']]['pazienti'][$e['id_paziente']])){
$equipe[$e['id_equipe']]['pazienti'][$e['id_paziente']] = [];
$equipe[$e['id_equipe']]['pazienti'][$e['id_paziente']]['id_paziente'] = $e['id_paziente'];
$equipe[$e['id_equipe']]['pazienti'][$e['id_paziente']]['nome_paziente'] = $e['nome_paziente'];
}
}
return $equipe;
}
function PP_GetDettagliEquipe($data = null){
global $config;
$id_medico = $config->utente['id'];
if(!empty($data['id_equipe']) && !empty($data['id_paziente'])){
$query = "SELECT dati FROM ".T_EQUIPE_PAZIENTI." WHERE id_equipe = :id_equipe AND id_paziente = :id_paziente";
$par = array("id_equipe" => $data['id_equipe'], "id_paziente" => $data['id_paziente']);
$dettagli_equipe = $config->database->query($query, $par);
if(count($dettagli_equipe) > 0){
$dettagli_equipe = $dettagli_equipe[0];
if(PP_IsJson($dettagli_equipe['dati'])){
$dettagli_equipe = json_decode($dettagli_equipe['dati']);
return $dettagli_equipe;
}
}
}
return null;
}
function PP_SalvaEquipe($data = null){
global $config;
}
function PP_ModificaEquipe($data = null){
global $config;
}
function PP_EliminaEquipe($data = null){
global $config;
}
/*********************************
* PROTOCOLLI DI CRONICITA
*********************************/
/**
* Ottiene i TEMPLATE di protocollo (modelli generici).
* Usato per popolare la modale di assegnazione.
*
* @param array $data Può contenere 'id_protocollo_template'
* @return array Lista di template
*/
function PP_GetProtocolliTemplate($data = null){
global $config;
$id_medico = $config->utente['id'];
$query_where = array();
$par = array("id_medico" => $id_medico);
$query_where[] = " pct.id_medico_creatore = :id_medico ";
if(!empty($data['id_protocollo_template'])){
$query_where[] = " pct.id = :id_protocollo_template ";
$par["id_protocollo_template"] = PP_Secure($data['id_protocollo_template']);
}
if($query_where){ $query_where = " WHERE ".implode(" AND ", $query_where); }
$query_str = "SELECT
pct.id as id_protocollo_template, pct.nome_protocollo, pct.descrizione, pct.durata_giorni_default,
pcpt.id as id_prestazione_template, pcpt.tipo_prestazione, pcpt.nome_prestazione,
pcpt.descrizione_prestazione, pcpt.schedulazione_tipo,
pcpt.schedulazione_giorni_da_inizio, pcpt.schedulazione_frequenza_n,
pcpt.schedulazione_frequenza_unit, pcpt.schedulazione_durata_n,
pcpt.schedulazione_durata_unit
FROM ".T_PROTOCOLLI_CRONICITA_TEMPLATE." pct
LEFT JOIN ".T_PROTOCOLLI_CRONICITA_PRESTAZIONI_TEMPLATE." pcpt ON pct.id = pcpt.id_protocollo_template
$query_where
ORDER BY pct.nome_protocollo ASC, pcpt.id ASC";
$query = $config->database->query($query_str, $par);
$templates = [];
foreach($query as $row){
$id_template = $row['id_protocollo_template'];
if(!isset($templates[$id_template])){
$templates[$id_template] = [
'id_protocollo_template' => $id_template,
'nome_protocollo' => $row['nome_protocollo'],
'descrizione' => $row['descrizione'],
'durata_giorni_default' => $row['durata_giorni_default'],
'prestazioni' => []
];
}
if(!empty($row['id_prestazione_template'])){
// Aggiungi la prestazione solo se ha un ID
$templates[$id_template]['prestazioni'][$row['id_prestazione_template']] = $row;
}
}
foreach ($templates as $id_template => $template) {
$templates[$id_template]['prestazioni'] = array_values($template['prestazioni']);
}
return array_values($templates);
}
/**
* Salva un NUOVO template di protocollo (modello generico).
*
* @param array $data Dati del template (include 'prestazioni' come JSON string)
* @return array|null Il template salvato o null
*/
function PP_SalvaProtocolloTemplate($data = null){
global $config;
if(empty($data['nome_protocollo'])){
return null;
}
$id_medico = $config->utente['id'];
$par_template = [
'id_medico_creatore' => $id_medico,
'nome_protocollo' => PP_Secure($data['nome_protocollo']),
'descrizione' => PP_Secure($data['descrizione']),
'durata_giorni_default' => PP_Secure($data['durata_giorni_default'])
];
$query_template = "INSERT INTO ".T_PROTOCOLLI_CRONICITA_TEMPLATE."
(id_medico_creatore, nome_protocollo, descrizione, durata_giorni_default) VALUES
(:id_medico_creatore, :nome_protocollo, :descrizione, :durata_giorni_default)";
$config->database->query($query_template, $par_template);
$id_protocollo_template = $config->database->lastInsertId();
if( $id_protocollo_template > 0 ){
// Decodifica l'array di prestazioni inviato dal JS
$prestazioni = json_decode($data['prestazioni'], true);
if(!empty($prestazioni) && is_array($prestazioni)){
foreach($prestazioni as $prestazione){
$par_prestazione = [
'id_protocollo_template' => $id_protocollo_template,
'tipo_prestazione' => PP_Secure($prestazione['tipo_prestazione']),
'nome_prestazione' => PP_Secure($prestazione['nome_prestazione']),
'descrizione_prestazione' => PP_Secure($prestazione['descrizione_prestazione']),
'schedulazione_tipo' => PP_Secure($prestazione['schedulazione_tipo']),
'schedulazione_giorni_da_inizio' => 0,
'schedulazione_frequenza_n' => 0,
'schedulazione_frequenza_unit' => '',
'schedulazione_durata_n' => 0,
'schedulazione_durata_unit' => ''
];
if ($prestazione['schedulazione_tipo'] == 'ONE_OFF') {
$par_prestazione['schedulazione_giorni_da_inizio'] = (int)$prestazione['schedulazione_giorni_da_inizio'];
} else if ($prestazione['schedulazione_tipo'] == 'RECURRING') {
$par_prestazione['schedulazione_frequenza_n'] = (int)$prestazione['schedulazione_frequenza_n'];
$par_prestazione['schedulazione_frequenza_unit'] = PP_Secure($prestazione['schedulazione_frequenza_unit']);
$par_prestazione['schedulazione_durata_n'] = (int)$prestazione['schedulazione_durata_n'];
$par_prestazione['schedulazione_durata_unit'] = PP_Secure($prestazione['schedulazione_durata_unit']);
}
$query_prestazione = "INSERT INTO ".T_PROTOCOLLI_CRONICITA_PRESTAZIONI_TEMPLATE."
(id_protocollo_template, tipo_prestazione, nome_prestazione, descrizione_prestazione,
schedulazione_tipo, schedulazione_giorni_da_inizio,
schedulazione_frequenza_n, schedulazione_frequenza_unit,
schedulazione_durata_n, schedulazione_durata_unit)
VALUES
(:id_protocollo_template, :tipo_prestazione, :nome_prestazione, :descrizione_prestazione,
:schedulazione_tipo, :schedulazione_giorni_da_inizio,
:schedulazione_frequenza_n, :schedulazione_frequenza_unit,
:schedulazione_durata_n, :schedulazione_durata_unit)";
$config->database->query($query_prestazione, $par_prestazione);
}
}
$template_creato = PP_GetProtocolliTemplate(array("id_protocollo_template" => $id_protocollo_template));
if(count($template_creato) == 1){
return $template_creato[0];
}
}
return null;
}
/**
* ASSEGNA un template a un paziente, creando l'ISTANZA e GENERANDO le prestazioni.
* Chiamata dalla modale in 'protocolli_cronicita.php'.
*
* @param array $data Deve contenere: id_protocollo_template, data_inizio, id_paziente
* @return array L'istanza creata
*/
function PP_AssegnaProtocolloTemplate($data = null){
global $config;
if(empty($data['id_protocollo_template']) || empty($data['data_inizio']) || empty($data['id_paziente'])){
return null;
}
$id_medico = $config->utente['id'];
$id_protocollo_template = PP_Secure($data['id_protocollo_template']);
$data_inizio_protocollo_str = PP_Secure($data['data_inizio']);
$id_paziente_sec = PP_Secure($data['id_paziente']);
$template_data = PP_GetProtocolliTemplate(array("id_protocollo_template" => $id_protocollo_template));
if(count($template_data) == 0){ return null; }
$template = $template_data[0];
// 1. Crea l'ISTANZA del protocollo
$par_istanza = [
'id_paziente' => $id_paziente_sec,
'id_medico' => $id_medico,
'id_protocollo_template' => $id_protocollo_template,
'nome_protocollo' => $template['nome_protocollo'],
'descrizione' => $template['descrizione'],
'durata_giorni' => $template['durata_giorni_default'],
'data_inizio_protocollo' => $data_inizio_protocollo_str
];
$query_istanza = "INSERT INTO " . T_PROTOCOLLI_CRONICITA . "
(id_paziente, id_medico, id_protocollo_template, nome_protocollo, descrizione, durata_giorni, data_inizio_protocollo)
VALUES (:id_paziente, :id_medico, :id_protocollo_template, :nome_protocollo, :descrizione, :durata_giorni, :data_inizio_protocollo)";
$config->database->query($query_istanza, $par_istanza);
$id_protocollo_istanza = $config->database->lastInsertId();
if($id_protocollo_istanza > 0){
// 2. Cicla su ogni REGOLA di prestazione del template
foreach($template['prestazioni'] as $prestazione_template){
$start_date_protocollo = new DateTime($data_inizio_protocollo_str);
$prestazioni_da_creare = [];
$tipo_schedulazione = $prestazione_template['schedulazione_tipo'];
if ($tipo_schedulazione == 'ONE_OFF') {
$giorni_da_inizio = (int)$prestazione_template['schedulazione_giorni_da_inizio'];
$data_calcolata = clone $start_date_protocollo;
$data_calcolata->modify("+$giorni_da_inizio days");
$prestazioni_da_creare[] = $data_calcolata;
} else if ($tipo_schedulazione == 'RECURRING') {
$freq_n = (int)$prestazione_template['schedulazione_frequenza_n'];
$freq_unit = $prestazione_template['schedulazione_frequenza_unit'];
$dur_n = (int)$prestazione_template['schedulazione_durata_n'];
$dur_unit = $prestazione_template['schedulazione_durata_unit'];
if ($freq_n <= 0 || $dur_n <= 0) continue;
$data_fine_totale = clone $start_date_protocollo;
$data_fine_totale->modify("+$dur_n $dur_unit");
$data_corrente = clone $start_date_protocollo;
if ($freq_unit == 'MONTH') {
while ($data_corrente < $data_fine_totale) {
$giorni_nel_mese = (int)$data_corrente->format('t');
$intervallo_giorni = floor($giorni_nel_mese / $freq_n);
if ($intervallo_giorni == 0) $intervallo_giorni = 1;
for ($i = 0; $i < $freq_n; $i++) {
$giorni_aggiuntivi = $i * $intervallo_giorni;
$data_prestazione = clone $data_corrente;
$data_prestazione->modify('first day of this month');
$data_prestazione->modify("+$giorni_aggiuntivi days");
if ($data_prestazione < $data_fine_totale) {
$prestazioni_da_creare[] = $data_prestazione;
}
}
$data_corrente->modify('first day of next month');
}
}
// Aggiungere logica per 'WEEK', 'DAY' se necessario
}
// 3. Inserisci le prestazioni calcolate
foreach($prestazioni_da_creare as $data_inizio_prestazione) {
// *** INIZIO CORREZIONE ***
// Rimuoviamo data_fine dai parametri
$par_prestazione_istanza = [
'id_protocollo' => $id_protocollo_istanza,
'tipo_prestazione' => $prestazione_template['tipo_prestazione'],
'nome_prestazione' => $prestazione_template['nome_prestazione'],
'descrizione_prestazione' => $prestazione_template['descrizione_prestazione'],
'data_inizio' => $data_inizio_prestazione->format('Y-m-d'),
'stato' => 'non prenotato'
];
// Scriviamo NULL direttamente nella query per bypassare il binding errato
$data_fine_sql_val = "NULL";
$query_prestazione_istanza = "INSERT INTO " . T_PROTOCOLLI_CRONICITA_PRESTAZIONI . "
(id_protocollo, tipo_prestazione, nome_prestazione, descrizione_prestazione, data_inizio, data_fine, stato)
VALUES
(:id_protocollo, :tipo_prestazione, :nome_prestazione, :descrizione_prestazione, :data_inizio, $data_fine_sql_val, :stato)";
$config->database->query($query_prestazione_istanza, $par_prestazione_istanza);
// *** FINE CORREZIONE ***
}
}
// Ritorna l'istanza appena creata e popolata
$protocollo_creato = PP_GetProtocolliCronicita(array("id_protocollo" => $id_protocollo_istanza));
if(count($protocollo_creato) == 1){
return $protocollo_creato[0];
}
}
return null;
}
/**
* MODIFICA un template di protocollo esistente.
* Rimuove e ricrea tutte le prestazioni.
*
* @param array $data Dati da modificare, deve contenere 'id_protocollo_template'
* @return array|null Il protocollo modificato o null
*/
function PP_ModificaProtocolloTemplate($data = null){
global $config;
if(empty($data['id_protocollo_template']) || empty($data['nome_protocollo'])){
return null;
}
$id_protocollo_template = PP_Secure($data['id_protocollo_template']);
$id_medico = $config->utente['id'];
// 1. Verifica che il medico sia il proprietario del template
$query_check = "SELECT id FROM " . T_PROTOCOLLI_CRONICITA_TEMPLATE . " WHERE id = :id_protocollo AND id_medico_creatore = :id_medico";
$check = $config->database->query($query_check, ["id_protocollo" => $id_protocollo_template, "id_medico" => $id_medico]);
if(count($check) == 0){
return null; // Non trovato o non autorizzato
}
// 2. Aggiorna i dati principali del Template
$par_template = [
'id_protocollo_template' => $id_protocollo_template,
'nome_protocollo' => PP_Secure($data['nome_protocollo']),
'descrizione' => PP_Secure($data['descrizione']),
'durata_giorni_default' => PP_Secure($data['durata_giorni_default'])
];
$query_update = "UPDATE " . T_PROTOCOLLI_CRONICITA_TEMPLATE . " SET
nome_protocollo = :nome_protocollo,
descrizione = :descrizione,
durata_giorni_default = :durata_giorni_default
WHERE id = :id_protocollo_template";
$config->database->query($query_update, $par_template);
$par_reset = ["id_protocollo_template" => $id_protocollo_template];
// 3. Elimina le vecchie prestazioni (Figlio)
$query_reset_prestazioni = "DELETE FROM " . T_PROTOCOLLI_CRONICITA_PRESTAZIONI_TEMPLATE . " WHERE id_protocollo_template = :id_protocollo_template";
$config->database->query($query_reset_prestazioni, $par_reset);
// 4. Reinserisci le prestazioni (come in PP_SalvaProtocolloTemplate)
$prestazioni = json_decode($data['prestazioni'], true);
if(!empty($prestazioni) && is_array($prestazioni)){
foreach($prestazioni as $prestazione){
$par_prestazione = [
'id_protocollo_template' => $id_protocollo_template,
'tipo_prestazione' => PP_Secure($prestazione['tipo_prestazione']),
'nome_prestazione' => PP_Secure($prestazione['nome_prestazione']),
'descrizione_prestazione' => PP_Secure($prestazione['descrizione_prestazione']),
'schedulazione_tipo' => PP_Secure($prestazione['schedulazione_tipo']),
'schedulazione_giorni_da_inizio' => null,
'schedulazione_frequenza_n' => null,
'schedulazione_frequenza_unit' => null,
'schedulazione_durata_n' => null,
'schedulazione_durata_unit' => null
];
if ($prestazione['schedulazione_tipo'] == 'ONE_OFF') {
$par_prestazione['schedulazione_giorni_da_inizio'] = (int)$prestazione['schedulazione_giorni_da_inizio'];
} else if ($prestazione['schedulazione_tipo'] == 'RECURRING') {
$par_prestazione['schedulazione_frequenza_n'] = (int)$prestazione['schedulazione_frequenza_n'];
$par_prestazione['schedulazione_frequenza_unit'] = PP_Secure($prestazione['schedulazione_frequenza_unit']);
$par_prestazione['schedulazione_durata_n'] = (int)$prestazione['schedulazione_durata_n'];
$par_prestazione['schedulazione_durata_unit'] = PP_Secure($prestazione['schedulazione_durata_unit']);
}
$query_prestazione = "INSERT INTO T_PROTOCOLLI_CRONICITA_PRESTAZIONI_TEMPLATE
(id_protocollo_template, tipo_prestazione, nome_prestazione, descrizione_prestazione,
schedulazione_tipo, schedulazione_giorni_da_inizio,
schedulazione_frequenza_n, schedulazione_frequenza_unit,
schedulazione_durata_n, schedulazione_durata_unit)
VALUES
(:id_protocollo_template, :tipo_prestazione, :nome_prestazione, :descrizione_prestazione,
:schedulazione_tipo, :schedulazione_giorni_da_inizio,
:schedulazione_frequenza_n, :schedulazione_frequenza_unit,
:schedulazione_durata_n, :schedulazione_durata_unit)";
$config->database->query($query_prestazione, $par_prestazione);
}
}
// Ritorna il protocollo modificato
$protocollo_modificato = PP_GetProtocolliTemplate(array("id_protocollo_template" => $id_protocollo_template));
if(count($protocollo_modificato) == 1){
return $protocollo_modificato[0];
}
return null;
}
/**
* ELIMINA un template di protocollo.
* Non elimina le istanze già assegnate ai pazienti.
*
* @param array $data Deve contenere 'id_protocollo_template'
* @return boolean True se eliminato, false altrimenti
*/
function PP_EliminaProtocolloTemplate($data = null){
global $config;
if(empty($data['id_protocollo_template'])){
return false;
}
$id_protocollo_template = PP_Secure($data['id_protocollo_template']);
$id_medico = $config->utente['id'];
$par_protocollo = ["id_protocollo_template" => $id_protocollo_template];
$par_check = ["id_protocollo_template" => $id_protocollo_template, "id_medico" => $id_medico];
// 1. Elimina le prestazioni (Figlio)
$query_prestazioni = "DELETE FROM " . T_PROTOCOLLI_CRONICITA_PRESTAZIONI_TEMPLATE . " WHERE id_protocollo_template = :id_protocollo_template";
$config->database->query($query_prestazioni, $par_protocollo);
// 2. Elimina il template (Padre, con controllo sul medico)
$query_protocollo = "DELETE FROM " . T_PROTOCOLLI_CRONICITA_TEMPLATE . " WHERE id = :id_protocollo_template AND id_medico_creatore = :id_medico";
if($config->database->query($query_protocollo, $par_check)){
return true;
}
return false;
}
/**
* Ottiene uno o più protocolli di cronicità per il medico o paziente.
*
* @param array $data Può contenere 'id_protocollo', 'id_paziente'
* @return array Lista di protocolli con dettagli e prestazioni
*/
function PP_GetProtocolliCronicita($data = null){
global $config;
$id_medico = $config->utente['id'];
$query_where = array();
$par = array("id_medico" => $id_medico);
$query_where[] = " pc.id_medico = :id_medico ";
if(!empty($data['id_paziente'])){
$query_where[] = " pc.id_paziente = :id_paziente ";
$par["id_paziente"] = PP_Secure($data['id_paziente']);
}
if(!empty($data['id_protocollo'])){
$query_where[] = " pc.id = :id_protocollo ";
$par["id_protocollo"] = PP_Secure($data['id_protocollo']);
}
if($query_where){
$query_where = " WHERE ".implode(" AND ", $query_where);
}
// Query per estrarre tutto in modo piatto, simile a PP_GetEquipe
$query_str = "SELECT
pc.id as id_protocollo, pc.id_paziente, pc.id_medico, pc.data_creazione,
pc.nome_protocollo, pc.descrizione, pc.durata_giorni, pc.data_inizio_protocollo,
CONCAT(u_paz.nome, ' ', u_paz.cognome) as nome_paziente,
pcp.id as id_prestazione, pcp.tipo_prestazione, pcp.nome_prestazione,
pcp.descrizione_prestazione, pcp.data_inizio, pcp.data_fine, pcp.stato
FROM " . T_PROTOCOLLI_CRONICITA . " pc
LEFT JOIN " . T_UTENTI . " u_paz ON pc.id_paziente = u_paz.id
LEFT JOIN " . T_PROTOCOLLI_CRONICITA_PRESTAZIONI . " pcp ON pc.id = pcp.id_protocollo
$query_where
ORDER BY pc.data_creazione DESC, pcp.data_inizio ASC";
$query = $config->database->query($query_str, $par);
$protocolli = [];
foreach($query as $row){
$id_protocollo = $row['id_protocollo'];
// Inizializza il protocollo se non esiste
if(!isset($protocolli[$id_protocollo])){
$protocolli[$id_protocollo] = [
'id_protocollo' => $id_protocollo,
'id_paziente' => $row['id_paziente'],
'id_medico' => $row['id_medico'],
'data_creazione' => $row['data_creazione'],
'nome_paziente' => $row['nome_paziente'],
'nome_protocollo'=> $row['nome_protocollo'],
'descrizione' => $row['descrizione'],
'durata_giorni' => $row['durata_giorni'],
'data_inizio_protocollo' => $row['data_inizio_protocollo'],
'prestazioni' => []
];
}
// Aggiunge le prestazioni
if(!empty($row['id_prestazione']) && !isset($protocolli[$id_protocollo]['prestazioni'][$row['id_prestazione']])){
$prestazione = [
'id_prestazione' => $row['id_prestazione'],
'tipo_prestazione' => $row['tipo_prestazione'],
'nome_prestazione' => $row['nome_prestazione'],
'descrizione_prestazione' => $row['descrizione_prestazione'],
'data_inizio' => $row['data_inizio'],
'data_fine' => $row['data_fine'],
'stato' => $row['stato']
];
$protocolli[$id_protocollo]['prestazioni'][$row['id_prestazione']] = $prestazione;
}
}
// Riorganizza le prestazioni come array indicizzato
foreach ($protocolli as $id_protocollo => $protocollo) {
$protocolli[$id_protocollo]['prestazioni'] = array_values($protocollo['prestazioni']);
}
return array_values($protocolli); // Ritorna un array non associativo
}
/**
* Salva un nuovo protocollo di cronicità.
* $data deve contenere:
* - id_paziente
* - durata (dettaglio)
* - note (dettaglio)
* - prestazioni (array di prestazioni)
*
* @param array $data Dati del protocollo
* @return array|null Il protocollo salvato o null in caso di fallimento
*/
function PP_SalvaProtocolloCronicita($data = null){
global $config;
// Controllo campi obbligatori
if(empty($data['id_paziente'])){
return null;
}
if(is_array($data['id_paziente'])){
$data['id_paziente'] = $data['id_paziente'][0];
}
$id_medico = $config->utente['id'];
$par_protocollo = [
'id_paziente' => PP_Secure($data['id_paziente']),
'id_medico' => $id_medico,
'nome_protocollo' => PP_Secure($data['nome_protocollo']),
'descrizione' => PP_Secure($data['descrizione']),
'durata_giorni' => PP_Secure($data['durata_giorni']),
'data_inizio_protocollo' => PP_Secure($data['data_inizio_protocollo']),
];
// 1. Inserisci il protocollo principale
$query_protocollo = "INSERT INTO " . T_PROTOCOLLI_CRONICITA . "
(id_paziente, id_medico, nome_protocollo, descrizione, durata_giorni, data_inizio_protocollo) VALUES (:id_paziente, :id_medico, :nome_protocollo, :descrizione. :durata_giorni, :data_inizio_protocollo)";
$config->database->query($query_protocollo, $par_protocollo);
$id_protocollo = $config->database->lastInsertId();
if( $id_protocollo > 0 ){
/* // 2. Inserisci i dettagli (durata, note, ecc.) - Stile EAV
// Rimuove chiavi già usate e 'prestazioni' per isolare i dettagli
$par_dettagli = array_diff_key($data, $par_protocollo, ['prestazioni' => '']);
$values_dettagli = [];
foreach($par_dettagli as $campo => $valore){
if(!empty($valore)){
$campo_sec = PP_Secure($campo);
$valore_sec = PP_Secure($valore);
array_push($values_dettagli, "($id_protocollo, '$campo_sec', '$valore_sec')");
}
}
if(count($values_dettagli) > 0){
$values_dettagli_str = implode(",", $values_dettagli);
$query_dettagli = "INSERT INTO " . T_PROTOCOLLI_CRONICITA_DETTAGLI . "
(id_protocollo, campo, valore) VALUES $values_dettagli_str;";
$config->database->query($query_dettagli, array());
} */
// 3. Inserisci le prestazioni
if(!empty($data['prestazioni']) && is_array($data['prestazioni'])){
foreach($data['prestazioni'] as $prestazione){
$par_prestazione = [
'id_protocollo' => $id_protocollo,
'tipo_prestazione' => PP_Secure($prestazione['tipo_prestazione']),
'nome_prestazione' => PP_Secure($prestazione['nome_prestazione']),
'descrizione_prestazione' => PP_Secure($prestazione['descrizione_prestazione']),
'data_inizio' => PP_Secure($prestazione['data_inizio']),
'data_fine' => !empty($prestazione['data_fine']) ? PP_Secure($prestazione['data_fine']) : null,
'stato' => 'non prenotato' // Stato di default
];
$query_prestazione = "INSERT INTO " . T_PROTOCOLLI_CRONICITA_PRESTAZIONI . "
(id_protocollo, tipo_prestazione, nome_prestazione, descrizione_prestazione, data_inizio, data_fine, stato)
VALUES
(:id_protocollo, :tipo_prestazione, :nome_prestazione, :descrizione_prestazione, :data_inizio, :data_fine, :stato)";
$config->database->query($query_prestazione, $par_prestazione);
}
}
// Ritorna il protocollo appena creato
$protocollo_creato = PP_GetProtocolliCronicita(array("id_protocollo" => $id_protocollo));
if(count($protocollo_creato) == 1){
return $protocollo_creato[0];
}
}
return null;
}
/**
* Modifica un protocollo di cronicità esistente.
* Rimuove e ricrea tutti i dettagli e le prestazioni.
*
* @param array $data Dati da modificare, deve contenere 'id_protocollo'
* @return array|null Il protocollo modificato o null in caso di fallimento
*/
function PP_ModificaProtocolloCronicita($data = null){
global $config;
if(empty($data['id_protocollo'])){
return null;
}
$id_protocollo = PP_Secure($data['id_protocollo']);
$id_medico = $config->utente['id'];
// 1. Verifica che il medico sia il proprietario del protocollo
$query_check = "SELECT id FROM " . T_PROTOCOLLI_CRONICITA . " WHERE id = :id_protocollo AND id_medico = :id_medico";
$check = $config->database->query($query_check, ["id_protocollo" => $id_protocollo, "id_medico" => $id_medico]);
if(count($check) == 0){
return null; // Non trovato o non autorizzato
}
// 2. Aggiorna data modifica (se la tabella la prevede)
// $query_update = "UPDATE " . T_PROTOCOLLI_CRONICITA . " SET data_modifica = NOW() WHERE id = :id_protocollo";
// $config->database->query($query_update, ["id_protocollo" => $id_protocollo]);
$par_reset = ["id_protocollo" => $id_protocollo];
// 3. Elimina i vecchi dettagli (stile PP_ModificaPaziente)
/* $query_reset_dettagli = "DELETE FROM " . T_PROTOCOLLI_CRONICITA_DETTAGLI . " WHERE id_protocollo = :id_protocollo";
$config->database->query($query_reset_dettagli, $par_reset); */
// 4. Elimina le vecchie prestazioni
$query_reset_prestazioni = "DELETE FROM " . T_PROTOCOLLI_CRONICITA_PRESTAZIONI . " WHERE id_protocollo = :id_protocollo";
$config->database->query($query_reset_prestazioni, $par_reset);
// 5. Reinserisci i dettagli
$par_esclusi = ['id_protocollo' => '', 'id_paziente' => '', 'id_medico' => '', 'prestazioni' => ''];
/* $par_dettagli = array_diff_key($data, $par_esclusi);
$values_dettagli = [];
foreach($par_dettagli as $campo => $valore){
if(!empty($valore)){
$campo_sec = PP_Secure($campo);
$valore_sec = PP_Secure($valore);
array_push($values_dettagli, "($id_protocollo, '$campo_sec', '$valore_sec')");
}
}
if(count($values_dettagli) > 0){
$values_dettagli_str = implode(",", $values_dettagli);
$query_dettagli = "INSERT INTO " . T_PROTOCOLLI_CRONICITA_DETTAGLI . "
(id_protocollo, campo, valore) VALUES $values_dettagli_str;";
$config->database->query($query_dettagli, array());
}
*/
// 6. Reinserisci le prestazioni
if(!empty($data['prestazioni']) && is_array($data['prestazioni'])){
foreach($data['prestazioni'] as $prestazione){
$par_prestazione = [
'id_protocollo' => $id_protocollo,
'tipo_prestazione' => PP_Secure($prestazione['tipo_prestazione']),
'nome_prestazione' => PP_Secure($prestazione['nome_prestazione']),
'descrizione_prestazione' => PP_Secure($prestazione['descrizione_prestazione']),
'data_inizio' => PP_Secure($prestazione['data_inizio']),
'data_fine' => !empty($prestazione['data_fine']) ? PP_Secure($prestazione['data_fine']) : null,
// Se lo stato viene passato, lo uso, altrimenti default
'stato' => !empty($prestazione['stato']) ? PP_Secure($prestazione['stato']) : 'non prenotato'
];
$query_prestazione = "INSERT INTO " . T_PROTOCOLLI_CRONICITA_PRESTAZIONI . "
(id_protocollo, tipo_prestazione, nome_prestazione, descrizione_prestazione, data_inizio, data_fine, stato)
VALUES
(:id_protocollo, :tipo_prestazione, :nome_prestazione, :descrizione_prestazione, :data_inizio, :data_fine, :stato)";
$config->database->query($query_prestazione, $par_prestazione);
}
}
// Ritorna il protocollo modificato
$protocollo_modificato = PP_GetProtocolliCronicita(array("id_protocollo" => $id_protocollo));
if(count($protocollo_modificato) == 1){
return $protocollo_modificato[0];
}
return null;
}
/**
* Elimina un protocollo di cronicità e tutti i suoi dettagli e prestazioni.
*
* @param array $data Deve contenere 'id_protocollo'
* @return boolean True se eliminato, false altrimenti
*/
function PP_EliminaProtocolloCronicita($data = null){
global $config;
if(empty($data['id_protocollo'])){
return false;
}
$id_protocollo = PP_Secure($data['id_protocollo']);
$id_medico = $config->utente['id'];
$par_protocollo = ["id_protocollo" => $id_protocollo];
$par_check = ["id_protocollo" => $id_protocollo, "id_medico" => $id_medico];
// 1. Elimina le prestazioni (Figlio)
$query_prestazioni = "DELETE FROM " . T_PROTOCOLLI_CRONICITA_PRESTAZIONI . " WHERE id_protocollo = :id_protocollo";
$config->database->query($query_prestazioni, $par_protocollo);
// 2. Elimina i dettagli (Figlio)
/* $query_dettagli = "DELETE FROM " . T_PROTOCOLLI_CRONICITA_DETTAGLI . " WHERE id_protocollo = :id_protocollo";
$config->database->query($query_dettagli, $par_protocollo); */
// 3. Elimina il protocollo (Padre, con controllo sul medico)
$query_protocollo = "DELETE FROM " . T_PROTOCOLLI_CRONICITA . " WHERE id = :id_protocollo AND id_medico = :id_medico";
if($config->database->query($query_protocollo, $par_check)){
return true;
}
return false;
}
/**
* Modifica lo stato di una singola prestazione di un protocollo.
* Es: da 'non prenotato' a 'prenotato' o 'effettuato'.
*
* @param array $data Deve contenere 'id_prestazione' e 'stato'
* @return boolean True se aggiornato, false altrimenti
*/
function PP_ModificaStatoPrestazioneProtocollo($data = null){
global $config;
if(empty($data['id_prestazione']) || empty($data['stato'])){
return false;
}
$id_medico = $config->utente['id'];
$par = [
'id_prestazione' => PP_Secure($data['id_prestazione']),
'stato' => PP_Secure($data['stato']),
'id_medico' => $id_medico
];
// Aggiorna lo stato solo se la prestazione appartiene a un protocollo del medico loggato
$query = "UPDATE " . T_PROTOCOLLI_CRONICITA_PRESTAZIONI . " pcp
JOIN " . T_PROTOCOLLI_CRONICITA . " pc ON pcp.id_protocollo = pc.id
SET pcp.stato = :stato
WHERE pcp.id = :id_prestazione AND pc.id_medico = :id_medico";
if($config->database->query($query, $par)){
return true;
}
return false;
}
/**
* Salva una *singola* prestazione per un protocollo di cronicità esistente.
* Usato dalla modale "Aggiungi Prestazione".
*
* @param array $data Dati prestazione (id_protocollo, tipo_prestazione, nome_prestazione, etc.)
* @return array|null La prestazione salvata o null
*/
function PP_SalvaPrestazioneProtocollo($data = null){
global $config;
// Controllo campi
if(empty($data['id_protocollo']) || empty($data['tipo_prestazione']) || empty($data['nome_prestazione']) || empty($data['data_inizio'])){
return null;
}
$id_medico = $config->utente['id'];
// Verifica che il medico sia il proprietario del protocollo
$query_check = "SELECT id FROM " . T_PROTOCOLLI_CRONICITA . " WHERE id = :id_protocollo AND id_medico = :id_medico";
$check = $config->database->query($query_check, ["id_protocollo" => $data['id_protocollo'], "id_medico" => $id_medico]);
if(count($check) == 0){
return null; // Non trovato o non autorizzato
}
// Rimuoviamo data_fine dai parametri di base
$par_prestazione = [
'id_protocollo' => PP_Secure($data['id_protocollo']),
'tipo_prestazione' => PP_Secure($data['tipo_prestazione']),
'nome_prestazione' => PP_Secure($data['nome_prestazione']),
'descrizione_prestazione' => PP_Secure($data['descrizione_prestazione']),
'data_inizio' => PP_Secure($data['data_inizio']),
'stato' => 'non prenotato' // Stato di default
];
// Gestiamo data_fine separatamente per inserire NULL o il parametro
$data_fine_sql_val = "NULL";
if (!empty($data['data_fine'])) {
// Se la data c'è, la aggiungiamo ai parametri e usiamo il placeholder
$data_fine_sql_val = ":data_fine";
$par_prestazione['data_fine'] = PP_Secure($data['data_fine']);
}
$query_prestazione = "INSERT INTO " . T_PROTOCOLLI_CRONICITA_PRESTAZIONI . "
(id_protocollo, tipo_prestazione, nome_prestazione, descrizione_prestazione, data_inizio, data_fine, stato)
VALUES
(:id_protocollo, :tipo_prestazione, :nome_prestazione, :descrizione_prestazione, :data_inizio, $data_fine_sql_val, :stato)";
$config->database->query($query_prestazione, $par_prestazione);
$id_prestazione = $config->database->lastInsertId();
if($id_prestazione > 0) {
// Ritorna la prestazione appena creata
$query_get = "SELECT * FROM " . T_PROTOCOLLI_CRONICITA_PRESTAZIONI . " WHERE id = :id_prestazione";
$prestazione = $config->database->query($query_get, ["id_prestazione" => $id_prestazione]);
return $prestazione[0];
}
return null;
}
/**
* Elimina una singola prestazione di un protocollo.
*
* @param array $data Deve contenere 'id_prestazione'
* @return boolean True se eliminata, false altrimenti
*/
function PP_EliminaPrestazioneProtocollo($data = null){
global $config;
if(empty($data['id_prestazione'])){
return false;
}
$id_medico = $config->utente['id'];
$par = [
'id_prestazione' => PP_Secure($data['id_prestazione']),
'id_medico' => $id_medico
];
// Elimina la prestazione solo se il medico è il proprietario del protocollo padre
$query = "DELETE pcp FROM " . T_PROTOCOLLI_CRONICITA_PRESTAZIONI . " pcp
JOIN " . T_PROTOCOLLI_CRONICITA . " pc ON pcp.id_protocollo = pc.id
WHERE pcp.id = :id_prestazione AND pc.id_medico = :id_medico";
if($config->database->query($query, $par)){
return true;
}
return false;
}
function PP_ModificaStepIstanzaPaziente($data) {
global $config;
// Aggiorniamo la prestazione, la data prevista e la priorità dello step specifico
$q = "UPDATE pdta_pazienti_steps
SET id_prestazione_catalogo = :id_prest,
data_prevista = :data_p,
priorita = :prio
WHERE id = :id_step";
return $config->database->query($q, [
'id_prest' => intval($data['id_prestazione']),
'data_p' => PP_Secure($data['data_prevista']),
'prio' => PP_Secure($data['priorita']),
'id_step' => intval($data['id_step'])
]);
}
?>
function PP_GetMessaggi($data = null){
global $config;
$where = null;
$id_utente = $config->utente["id"];
$where[] = " (m.id_mittente = $id_utente OR m.id_destinatario = $id_utente) ";
if(!empty($data['id'])){
$where[] = " m.id = {$data['id']} ";
}
if(!empty($data['id_utente'])){
$where[] = " (m.id_mittente = {$data['id_utente']} OR m.id_destinatario = {$data['id_utente']}) ";
}
if(count($where) > 0){
$where = " WHERE ".implode(" AND ", $where);
}
$query = "SELECT m.*, IF(m.id_mittente = $id_utente, m.id_destinatario, m.id_mittente) as id_chat,
CONCAT(u.nome, ' ', u.cognome) as mittente, CONCAT(u2.nome, ' ', u2.cognome) as destinatario, m.allegati
FROM " . T_MESSAGGI . " m
LEFT JOIN " .T_UTENTI. " u ON u.id = m.id_mittente
LEFT JOIN " .T_UTENTI. " u2 ON u2.id = m.id_destinatario
$where ORDER BY id_chat, data_creazione ASC";
$query = $config->database->query($query, array());
$messaggi = [];
foreach($query as $messaggio){
$messaggio['allegati'] = json_decode($messaggio['allegati']);
if(!isset($messaggi[$messaggio['id_chat']])){
$messaggi[$messaggio['id_chat']] = array();
}
array_push($messaggi[$messaggio['id_chat']], $messaggio);
}
return $messaggi;
}
function PP_SalvaMessaggio($data = null){
global $config;
$columns = ['id_destinatario', 'id_mittente', 'testo', 'letto', 'allegati'];
$keys = [];
$values = [];
/* if(!empty($files['files']['name'])){
$data['allegati'] = [];
foreach($files['files']['name'] as $key=>$value){
$path = PP_SecureFilePath($value);
if(move_uploaded_file($files['files']["tmp_name"][$key],ABSPATH.$path))
$data['allegati'][] = $path;
}
$data['allegati'] = json_encode($data['allegati']);
} */
$data['id_mittente'] = $config->utente['id'];
if(empty($data['id_destinatario'])){
return false;
}
foreach($data as $key=>$value){
if(in_array($key, $columns) && $value != ''){
$keys[] = $key;
$values[] = "'".$value."'";
}
}
$query = "INSERT INTO ".T_MESSAGGI." (".implode(",", $keys).")
VALUES (".implode(",", $values).")";
$config->database->query($query, array());
$id_messaggio = $config->database->lastInsertId();
//Invio la notifica
PP_CreaNotifica(array('id_mittente'=>$config->utente['id'],
'id_destinatario'=>$data['id_destinatario'],
'titolo'=>'Nuovo messaggio da '.$config->utente['nome'].' '.$config->utente['cognome'],
'contenuto'=>$data['testo'],
'tipo'=>'fa fa-envelope',
'link'=>'messaggi'));
if($id_messaggio > 0){
$messaggio = PP_GetMessaggi(array("id" => $id_messaggio));
return $messaggio[$data['id_destinatario']][0];
}
return false;
}
function PP_EliminaMessaggio($data){
global $config;
if(empty($data['id'])){
return false;
}
$messaggio = PP_GetMessaggi($data);
if(!empty($messaggio[0]['allegati'])){
foreach($messaggio[0]['allegati'] as $allegato){
unlink(ABSPATH.$allegato);
}
}
$query = "DELETE FROM " . T_MESSAGGI . " WHERE id = {$data['id']}";
$config->database->query($query, array());
return true;
}
function PP_ImportanteMessaggio($data){
global $config;
if(empty($data['id'])){
return false;
}
if(!isset($data['importante'])){
return false;
}
$query = "UPDATE " . T_MESSAGGI . " SET importante = {$data['importante']} WHERE id = {$data['id']}";
$config->database->query($query, array());
return true;
}
?>