DataInterface = $DataInterface; } /** * Get media */ public function reportGet($User, $patientID, $visitID) { $userID = $User->ID; // patient $statement = $this->DataInterface->DatabaseConnection->prepare( "SELECT patient.* FROM patient WHERE ID = :fk_patient" ); $statement->bindParam(':fk_patient', $patientID); // Error check if(!$statement->execute()) { return ['result' => 'ERROR', 'reason' => 'internal_error', 'message' => 'Database error', 'data' => $statement->errorInfo()]; } $patient = $statement->fetchAll(\PDO::FETCH_ASSOC)[0]; // visit $statement = $this->DataInterface->DatabaseConnection->prepare( "SELECT area, markers FROM visit WHERE ID = :fk_visit" ); $statement->bindParam(':fk_visit', $visitID); // Error check if(!$statement->execute()) { return ['result' => 'ERROR', 'reason' => 'internal_error', 'message' => 'Database error', 'data' => $statement->errorInfo()]; } $data = $statement->fetchAll(\PDO::FETCH_ASSOC)[0]; // media $statement = $this->DataInterface->DatabaseConnection->prepare( "SELECT * FROM media WHERE fk_visit = :fk_visit" ); $statement->bindParam(':fk_visit', $visitID); // Error check if(!$statement->execute()) { return ['result' => 'ERROR', 'reason' => 'internal_error', 'message' => 'Database error', 'data' => $statement->errorInfo()]; } $media = $statement->fetchAll(\PDO::FETCH_ASSOC); foreach($media as &$m) { $m['metrics'] = json_decode($m['metrics']); // measures $statement = $this->DataInterface->DatabaseConnection->prepare( "SELECT * FROM measure WHERE fk_media = :fk_media" ); $statement->bindParam(':fk_media', $m['ID']); // Error check if(!$statement->execute()) { return ['result' => 'ERROR', 'reason' => 'internal_error', 'message' => 'Database error', 'data' => $statement->errorInfo()]; } $m['measure'] = $statement->fetchAll(\PDO::FETCH_ASSOC); foreach($m['measure'] as &$measure) { $measure['points'] = json_decode($measure['points']); $measure['computation'] = json_decode($measure['computation']); } } // Abacus $statement = $this->DataInterface->DatabaseConnection->prepare( "SELECT DISTINCT name FROM abacus ORDER BY name" ); // Error check if(!$statement->execute()) { return ['result' => 'ERROR', 'reason' => 'internal_error', 'message' => 'Database error', 'data' => $statement->errorInfo()]; } $abacus = $statement->fetchAll(\PDO::FETCH_ASSOC); // Recipient $statement = $this->DataInterface->DatabaseConnection->prepare( "SELECT * FROM recipient WHERE fk_user = :fk_user ORDER BY email" ); $statement->bindParam(':fk_user', $userID); // Error check if(!$statement->execute()) { return ['result' => 'ERROR', 'reason' => 'internal_error', 'message' => 'Database error', 'data' => $statement->errorInfo()]; } $recipient = $statement->fetchAll(\PDO::FETCH_ASSOC); // PACS $statement = $this->DataInterface->DatabaseConnection->prepare( "SELECT data FROM settings_pacs WHERE fk_physician = $userID" ); if(!$statement->execute()) { return ['result' => 'ERROR', 'reason' => 'internal_error', 'message' => 'Database error', 'data' => $statement->errorInfo()]; } $pacs = json_decode($statement->fetchAll(\PDO::FETCH_ASSOC)[0]['data']); return [ 'result' => 'OK', 'patient' => $patient, 'area' => $data['area'], 'markers' => json_decode($data['markers']), 'media' => $media, 'recipient' => $recipient, 'pacs' => $pacs, 'abacus' => $abacus ]; } /** * */ public function reportMailAddPost($User, $data) { $userID = $User->ID; $statement = $this->DataInterface->DatabaseConnection->prepare( "INSERT INTO recipient(ID, email, fk_user) VALUES(0, :email, :fk_user)" ); $statement->bindParam(':email', $data['email']); $statement->bindParam(':fk_user', $userID); // Error check if(!$statement->execute()) { return ['result' => 'ERROR', 'reason' => 'internal_error', 'message' => 'Database error', 'data' => $statement->errorInfo()]; } $emailID = $this->DataInterface->DatabaseConnection->lastInsertId(); return [ 'result' => 'OK', 'ID' => $emailID ]; } /** * */ public function reportMailDeletePost($User, $data) { $userID = $User->ID; $statement = $this->DataInterface->DatabaseConnection->prepare( "DELETE FROM recipient WHERE ID = :ID" ); $statement->bindParam(':ID', $data['ID']); // Error check if(!$statement->execute()) { return ['result' => 'ERROR', 'reason' => 'internal_error', 'message' => 'Database error', 'data' => $statement->errorInfo()]; } return [ 'result' => 'OK' ]; } /** * */ protected function generateMeasureText($lang, &$measureList, $M, &$imt_value, &$imt_count) { if($M['type']=='imt') { $measureList[] = ($this->tr($lang, 'imt_avg').': '.number_format($M['computation']->imt_mean, 3)).' mm, '. ($this->tr($lang, 'imt_max').': '.number_format($M['computation']->imt_max, 3)).' mm'; $imt_value+=$M['computation']->imt_mean; $imt_count++; } else if($M['type']=='plaque') { $measureList[] = ($this->tr($lang, 'plaque').': '.round($M['computation']->plaque_area*100)/100).' mm², '. ($this->tr($lang, 'thk_max').': '.round($M['computation']->plaque_max_thickness*10)/10).' mm'; } else if($M['type']=='area') { $measureList[] = ($this->tr($lang, 'surface').': '.round($M['computation']->surface*100)/100).' mm²'; } else if($M['type']=='thickness') { $measureList[] = ($this->tr($lang, 'thk').': '.round($M['computation']->distance*10)/10).' mm'; } else if($M['type']=='plaque_thickness') { $measureList[] = ($this->tr($lang, 'thk_plaque').': '.round($M['computation']->distance*10)/10).' mm'; } else if($M['type']=='diameter') { $measureList[] = ($this->tr($lang, 'diameter').': '.round($M['computation']->distance*10)/10).' mm'; } } /** * */ protected function generateImageCell($lang, $side, $visit, $visitID, $markers, $media, $ID, &$imt_value, &$imt_count, $mode) { $M = null; for($i=0; $inot found'; } // segment $incidence = array_key_exists('incidence', $M)?(' ('.$this->tr($lang, $M['incidence']).')'):''; $segmentName = $this->tr($lang, $visit['area'].'_'.$side.'_'.$M['location']).' '.$incidence; $segmentImage = '../../storage/area/area_'.$visit['area'].'_'.($side=='right'?'R':'L').'_'.$M['location'].'.png'; $segmentLayer = ImageWorkshop::initFromPath($segmentImage); for($mk=0; $mklocation==$side) { $segmentLayer->addLayerOnTop($markers[$visit['markers'][$mk]->type], $visit['markers'][$mk]->x, $visit['markers'][$mk]->y); } } ob_start(); imagejpeg($segmentLayer->getResult(), null, 100); $segmentBase64 = ob_get_contents(); ob_end_clean(); $segmentBase64 = 'data:image/jpeg;base64,'.base64_encode($segmentBase64); // image $frame = 0; for($measure=0; $measurevect_adventitia); $p++) { imageline($mImage, $Mm['computation']->vect_adventitia[$p]->x, $Mm['computation']->vect_adventitia[$p]->y, $Mm['computation']->vect_adventitia[$p]->x+1, $Mm['computation']->vect_adventitia[$p]->y, $green); } for($p=0; $pvect_intima); $p++) { imageline($mImage, $Mm['computation']->vect_intima[$p]->x, $Mm['computation']->vect_intima[$p]->y, $Mm['computation']->vect_intima[$p]->x+1, $Mm['computation']->vect_intima[$p]->y, $orange); } } else if($Mm['type']=='plaque') { for($p=0; $plongeantPlaque)-1; $p++) { imageline($mImage, $Mm['computation']->longeantPlaque[$p]->x, $Mm['computation']->longeantPlaque[$p]->y, $Mm['computation']->longeantPlaque[$p+1]->x, $Mm['computation']->longeantPlaque[$p+1]->y, $orange); } for($p=0; $pptsTrouvesFin)-1; $p++) { imageline($mImage, $Mm['computation']->ptsTrouvesFin[$p]->x, $Mm['computation']->ptsTrouvesFin[$p]->y, $Mm['computation']->ptsTrouvesFin[$p+1]->x, $Mm['computation']->ptsTrouvesFin[$p+1]->y, $green); } imageline($mImage, $Mm['computation']->longeantPlaque[0]->x, $Mm['computation']->longeantPlaque[0]->y, $Mm['computation']->ptsTrouvesFin[0]->x, $Mm['computation']->ptsTrouvesFin[0]->y, $green); imageline($mImage, $Mm['computation']->longeantPlaque[count($Mm['computation']->longeantPlaque)-1]->x, $Mm['computation']->longeantPlaque[count($Mm['computation']->longeantPlaque)-1]->y, $Mm['computation']->ptsTrouvesFin[count($Mm['computation']->ptsTrouvesFin)-1]->x, $Mm['computation']->ptsTrouvesFin[count($Mm['computation']->ptsTrouvesFin)-1]->y, $green); } else if($Mm['type']=='area') { for($p=0; $px, $Mm['points'][$p]->y, $Mm['points'][$p+1]->x, $Mm['points'][$p+1]->y, $green); } imageline($mImage, $Mm['points'][0]->x, $Mm['points'][0]->y, $Mm['points'][count($Mm['points'])-1]->x, $Mm['points'][count($Mm['points'])-1]->y, $green); for($p=0; $px, $Mm['points'][$p]->y, 10, 10, $orange); } } else if($Mm['type']=='diameter' || $Mm['type']=='thickness' || $Mm['type']=='plaque_thickness') { imageline($mImage, $Mm['points'][0]->x, $Mm['points'][0]->y, $Mm['points'][1]->x, $Mm['points'][1]->y, $green); imageline($mImage, $Mm['points'][0]->x, $Mm['points'][0]->y, $Mm['points'][1]->x, $Mm['points'][1]->y, $green); imagefilledellipse($mImage, $Mm['points'][0]->x, $Mm['points'][0]->y, 10, 10, $orange); imagefilledellipse($mImage, $Mm['points'][1]->x, $Mm['points'][1]->y, 10, 10, $orange); } } ob_start(); imagejpeg($mImage); $imageData = ob_get_contents(); ob_end_clean(); $imageBase64 = 'data:image/jpeg;base64,'.base64_encode($imageData); imagedestroy($mImage); //$imageBase64 = 'data:image/' . pathinfo(parse_url($path, PHP_URL_PATH), PATHINFO_EXTENSION) . ';base64,' . base64_encode(file_get_contents($path)); // measures $measureList = []; foreach($M['measure'] as $Mm) { if($frame==intval($Mm['frame']) && $Mm['type']!='calibration') { $this->generateMeasureText($lang, $measureList, $Mm, $imt_value, $imt_count); } } // layout if($mode == '2R') { return ''. ''. ''. ''. '
'.$segmentName.'
'.implode('
',$measureList).'
'. ''. '

'.$this->tr($lang, $side).'

'. ''; } if($mode == '2L') { return ''. ''. '

'.$this->tr($lang, $side).'

'. ''. '
'.$segmentName.'
'.implode('
',$measureList).'
'. ''. ''. ''; } if($mode == '6R') { return ''. ''. '
'.$segmentName.'
'.implode('
',$measureList).'
'. ''; } if($mode == '6L') { return ''. '
'.$segmentName.'
'.implode('
',$measureList).'
'. ''. ''; } } /** * */ public function reportPdfMailPost($User, $data) { $userID = $User->ID; // report $res = $this->reportPdfDownloadPost($User, $data); if($res['result']=='ERROR') { return $res; } foreach($data['emails'] as $email) { $res = $this->DataInterface->sendMail($User->email, $email, $data['subject'], $data['message'], '../../storage/report/'.$res['filename']); if($res['result']=='ERROR') { return $res; } } return [ 'result' => 'OK', 'report' => $res ]; } /** * */ public function reportPdfPACSPost($User, $data) { $userID = $User->ID; // report $res = $this->reportPdfDownloadPost($User, $data); if($res['result']=='ERROR') { return $res; } $reportPath = '../../storage/report/'.$res['filename']; $dicomPath = $reportPath.'.dcm'; // PACS $statement = $this->DataInterface->DatabaseConnection->prepare( "SELECT data FROM settings_pacs WHERE fk_physician = $userID" ); if(!$statement->execute()) { return ['result' => 'ERROR', 'reason' => 'internal_error', 'message' => 'Database error', 'data' => $statement->errorInfo()]; } $pacs = json_decode($statement->fetchAll(\PDO::FETCH_ASSOC)[0]['data']); // convert to dicom // if comming from a DICOM study, then use existing ID/UID from with this: // ' +st '.$aDicomFile. $patientName = $res['patient']['lastname'].'^'.$res['patient']['firstname']; $patientID = $res['patient']['patientID']; $patientBirth = str_replace('-','',$res['patient']['birthDate']); $patientSex = $res['patient']['gender']; $studyDate = str_replace('-','',$res['visit']['visitDate']); $cmdLine = 'pdf2dcm '.$reportPath.' '.$dicomPath. ' +pn "'.$patientName.'" +pi "'.$patientID.'" +pb '.$patientBirth.' +ps '.$patientSex. ' -k StudyDate="'.$studyDate.'" '. ' -v 2>&1'; $output=null; $retval=null; exec($cmdLine, $output, $retval); if($retval !== 0 || count($output)<1) { return [ 'result' => 'ERROR', 'cmdLine' => $cmdLine, 'output' => $output, 'retval' => $retval ]; } // send $cmdLine = 'storescu '.$pacs->serverAddress.' '.$pacs->queryPort.' '.$dicomPath.' -aet '.$pacs->callingAET.' -aec '.$pacs->calledAET. ' -v 2>&1'; $output=null; $retval=null; exec($cmdLine, $output, $retval); if($retval !== 0 || count($output)<1) { return [ 'result' => 'ERROR', 'cmdLine' => $cmdLine, 'output' => $output, 'retval' => $retval ]; } unlink($dicomPath); return [ 'result' => 'OK', 'report' => $res, 'cmdLine' => $cmdLine ]; } /** * */ public function reportPdfDownloadPost($User, $data) { $userID = $User->ID; $visitID = $data['visitID']; $lang = $data['lang']; $reportType = $data['type']; $mediaList = $data['mediaList']; // style $style = '.page-break { page-break-after: always; } '. 'h1 { width: 100%; margin: 0 0 16px 0; padding: 0; text-align: center; } '. 'h3 { width: 100%; margin: 0 0 16px 0; padding: 0; text-align: center; } '. '.footer { position: fixed; bottom: 0; width: 100%; text-align: center; }'. '.blue { color: rgb(0,0,255); }'. '.grid { border-collapse: collapse; } .grid td { border: 1px solid black; text-align: center; }'; // user $statement = $this->DataInterface->DatabaseConnection->prepare( "SELECT * FROM user, organization WHERE organization.fk_user = user.ID AND user.ID = $userID" ); if(!$statement->execute()) { return ['result' => 'ERROR', 'reason' => 'internal_error', 'message' => 'Database error', 'data' => $statement->errorInfo()]; } $user = $statement->fetchAll(\PDO::FETCH_ASSOC)[0]; // patient $statement = $this->DataInterface->DatabaseConnection->prepare( "SELECT * FROM patient, visit WHERE visit.fk_patient = patient.ID AND visit.ID = $visitID" ); if(!$statement->execute()) { return ['result' => 'ERROR', 'reason' => 'internal_error', 'message' => 'Database error', 'data' => $statement->errorInfo()]; } $patient = $statement->fetchAll(\PDO::FETCH_ASSOC)[0]; // visit $statement = $this->DataInterface->DatabaseConnection->prepare( "SELECT area, markers, visitDate FROM visit WHERE ID = :fk_visit" ); $statement->bindParam(':fk_visit', $visitID); if(!$statement->execute()) { return ['result' => 'ERROR', 'reason' => 'internal_error', 'message' => 'Database error', 'data' => $statement->errorInfo()]; } $visit = $statement->fetchAll(\PDO::FETCH_ASSOC)[0]; $visit['markers'] = json_decode($visit['markers']); // media $str = implode(',',$mediaList); $statement = $this->DataInterface->DatabaseConnection->prepare( "SELECT ID, side, location, filename, metrics FROM media WHERE ID IN ($str)" ); if(!$statement->execute()) { return ['result' => 'ERROR', 'reason' => 'internal_error', 'message' => 'Database error', 'data' => $statement->errorInfo()]; } $media = $statement->fetchAll(\PDO::FETCH_ASSOC); foreach($media as &$m) { $m['metrics'] = json_decode($m['metrics']); // measures $statement = $this->DataInterface->DatabaseConnection->prepare( "SELECT * FROM measure WHERE fk_media = :fk_media ORDER BY ID" ); $statement->bindParam(':fk_media', $m['ID']); if(!$statement->execute()) { return ['result' => 'ERROR', 'reason' => 'internal_error', 'message' => 'Database error', 'data' => $statement->errorInfo()]; } $m['measure'] = $statement->fetchAll(\PDO::FETCH_ASSOC); foreach($m['measure'] as &$_measure) { $_measure['points'] = json_decode($_measure['points']); $_measure['computation'] = json_decode($_measure['computation']); } } // organization $statement = $this->DataInterface->DatabaseConnection->prepare( "SELECT * FROM organization WHERE fk_user = $userID" ); if(!$statement->execute()) { return ['result' => 'ERROR', 'reason' => 'internal_error', 'message' => 'Database error', 'data' => $statement->errorInfo()]; } $organization = $statement->fetchAll(\PDO::FETCH_ASSOC)[0]; $org_name = $organization['name']; $org_address = $organization['address'].' '.$organization['zip'].' '.$organization['city'].' - '.$organization['phone']; // markers $markers = [ "plaque" => ImageWorkshop::initFromPath('../../storage/marker/plaque.png'), "stenose" => ImageWorkshop::initFromPath('../../storage/marker/stenose.png'), "occlusion" => ImageWorkshop::initFromPath('../../storage/marker/occlusion.png') ]; // IMT $imt_value_right = 0; $imt_count_right = 0; $imt_value_left = 0; $imt_count_left = 0; // 1st page $pics = ''; if($reportType==2) { $pics .= $this->generateImageCell($lang, 'right', $visit, $visitID, $markers, $media, $mediaList[0], $imt_value_right, $imt_count_right, '2R'); $pics .= $this->generateImageCell($lang, 'left', $visit, $visitID, $markers, $media, $mediaList[1], $imt_value_left, $imt_count_left, '2L'); } else { $pics .= ''.''; $pics .= $this->generateImageCell($lang, 'right', $visit, $visitID, $markers, $media, $mediaList[0], $imt_value_right, $imt_count_right, '6R'); $pics .= $this->generateImageCell($lang, 'left', $visit, $visitID, $markers, $media, $mediaList[3], $imt_value_left, $imt_count_left, '6L'); $pics .= ''; $pics .= ''.''; $pics .= $this->generateImageCell($lang, 'right', $visit, $visitID, $markers, $media, $mediaList[1], $imt_value_right, $imt_count_right, '6R'); $pics .= $this->generateImageCell($lang, 'left', $visit, $visitID, $markers, $media, $mediaList[4], $imt_value_left, $imt_count_left, '6L'); $pics .= ''; $pics .= ''.''; $pics .= $this->generateImageCell($lang, 'right', $visit, $visitID, $markers, $media, $mediaList[2], $imt_value_right, $imt_count_right, '6R'); $pics .= $this->generateImageCell($lang, 'left', $visit, $visitID, $markers, $media, $mediaList[5], $imt_value_left, $imt_count_left, '6L'); $pics .= ''; } $pics .= '
'; $brand = 'data:image/' . pathinfo(parse_url('../../storage/logo/logo-48.png', PHP_URL_PATH), PATHINFO_EXTENSION) . ';base64,' . base64_encode(file_get_contents('../../storage/logo/logo-48.png')); $page1 = '
'. //'

'.$this->tr($lang, $reportType==2?'title2':'title6').'

'. '

'.$org_name.'

'. '

'.$org_address.'

'. ''. ''. ''. ''. '
'.$this->tr($lang, 'patientID').':'.$patient['patientID'].''.$this->tr($lang, 'patientName').':'.$patient['lastname'].' '.$patient['firstname'].'
'.$this->tr($lang, 'patientBirth').':'.$this->trDate($lang, $patient['birthDate']).''.$this->tr($lang, 'visitID').':'.$patient['number'].'
'.$this->tr($lang, 'institution').':'.$user['name'].''.$this->tr($lang, 'physician').':'.$user['lastname'].' '.$user['firstname'].'
'. $pics. ''. '
'; // 2nd page if($imt_count_left>0 && $imt_count_right>0) { $password = strtoupper(substr($patient['firstname'], 0, 1)).strtoupper(substr($patient['lastname'], 0, 1)).substr($patient['birthDate'],0,4); if($imt_count_left>0) { $imt_value_left /= $imt_count_left; } if($imt_count_right>0) { $imt_value_right /= $imt_count_right; } $abacus_name = ''; $abacus_gender = $patient['gender']; if($data['abacus']=='PARC') { $abacus_name = 'Europe, France, 30-79 years, PARC 2009 (Mean)'; } else if($data['abacus']=='ARIC_CAUCASIAN') { $abacus_name = 'USA, 35-85 years, Caucasian, ARIC 1993 (R+L). Extrapolated values below 45 and over 65'; } else if($data['abacus']=='ARIC_AFRICAN') { $abacus_name = 'USA, 35-85 years, African American, ARIC 1993 (R+L). Extrapolated values below 45 and over 65'; } // graph layout $graph_layout = ''; $abacusTable = ''; if($data['abacus']=='PARC') { // no matter the side $statement = $this->DataInterface->DatabaseConnection->prepare( "SELECT data FROM abacus WHERE name = '$abacus_name' AND sex = '$abacus_gender'" ); if(!$statement->execute()) { return ['result' => 'ERROR', 'reason' => 'internal_error', 'message' => 'Database error', 'data' => $statement->errorInfo()]; } $abacus_raw_data = json_decode($statement->fetchAll(\PDO::FETCH_ASSOC)[0]['data']); $abacus_data = []; foreach($abacus_raw_data as $raw_data) { $abacus_data[$raw_data->age] = [$raw_data->min, $raw_data->mean, $raw_data->max]; } // ref values $abacusTable .= ''.$this->tr($lang, 'age').''.$this->tr($lang, '25percent').''.$this->tr($lang, '50percent').''.$this->tr($lang, '75percent').''; foreach($abacus_data as $age => $values) { $abacusTable .= ''.$age.''; foreach($values as $value) { $abacusTable .= ''.$value.''; } $abacusTable .= ''; } // imt value $imt_value = $imt_value_left + $imt_value_right; if($imt_value_left>0 && $imt_value_right>0) { $imt_value /= 2.0; } // graph $graph_layout .= ''; } else if($data['abacus']=='ARIC_CAUCASIAN' || $data['abacus']=='ARIC_AFRICAN') { // right $statement = $this->DataInterface->DatabaseConnection->prepare( "SELECT data FROM abacus WHERE name = '$abacus_name' AND sex = '$abacus_gender' AND side = 'right'" ); if(!$statement->execute()) { return ['result' => 'ERROR', 'reason' => 'internal_error', 'message' => 'Database error', 'data' => $statement->errorInfo()]; } $abacus_raw_data = json_decode($statement->fetchAll(\PDO::FETCH_ASSOC)[0]['data']); $abacus_data_right = []; foreach($abacus_raw_data as $raw_data) { $abacus_data_right[$raw_data->age] = [$raw_data->min, $raw_data->mean, $raw_data->max]; } // left $statement = $this->DataInterface->DatabaseConnection->prepare( "SELECT data FROM abacus WHERE name = '$abacus_name' AND sex = '$abacus_gender' AND side = 'left'" ); if(!$statement->execute()) { return ['result' => 'ERROR', 'reason' => 'internal_error', 'message' => 'Database error', 'data' => $statement->errorInfo()]; } $abacus_raw_data = json_decode($statement->fetchAll(\PDO::FETCH_ASSOC)[0]['data']); $abacus_data_left = []; foreach($abacus_raw_data as $raw_data) { $abacus_data_left[$raw_data->age] = [$raw_data->min, $raw_data->mean, $raw_data->max]; } // ref values $abacusTable .= ''.$this->tr($lang, 'age').''.$this->tr($lang, '25percent').''.$this->tr($lang, '50percent').''.$this->tr($lang, '75percent').''; $abacusTable .= 'RLRLRL'; for($i=0; $i'; $val_right = $abacus_data_right[$k]; $val_left = $abacus_data_left[$k]; for($v=0; $v'; $abacusTable .= ''.$val_left[$v].''; } $abacusTable .= ''; } // graph $graph_layout .= ''; $graph_layout .= ''; $graph_layout .= '
'; $graph_layout .= ''; $graph_layout .= ''; $graph_layout .= ''; $graph_layout .= '
'; } $page2 = '
'. '

'.$this->tr($lang, 'p2_title').' ('.$this->tr($lang, $patient['gender']).')

'. ''. $abacusTable. '
'. '

'.$this->tr($lang, $data['abacus']).'

'. '

'. $graph_layout. '

'. '
'.$this->tr($lang, 'indications').'
'. '

'.$data['indications'].'

'. '
'.$this->tr($lang, 'clinical').'
'. '

'.$data['clinical'].'

'. '
'.$this->tr($lang, 'report').'
'. '

'.$data['report'].'

'. '

'.$this->tr($lang, 'disclaimer').'

'. ''. '
'; } // 3rd page $page3 = '
'. '

'.$this->tr($lang, 'p3_title').'

'. '

'.$this->tr($lang, 'p3_subtitle1').'

'. '

'.$this->tr($lang, 'p3_text1').'

'. '

'.$this->tr($lang, 'p3_subtitle2').'

'. '

'.$this->tr($lang, 'p3_text2').'

'. '

'.$this->tr($lang, 'p3_subtitle3').'

'. '

'.$this->tr($lang, 'p3_text3').'

'. '

'.$this->tr($lang, 'p3_subtitle4').'

'. '

'.$this->tr($lang, 'p3_text4').'

'. '

'.$this->tr($lang, 'p3_subtitle5').'

'. '

'.$this->tr($lang, 'p3_text5').'

'. ''. '
'; $html = ''.$page1.$page2.$page3.''; //file_put_contents('test.html', $html); $filename = $patient['lastname'].' '.$patient['firstname'].'-'.$visitID; $filename = str_replace(' ','_',$filename); $options = new \Dompdf\Options(); $options->set('isRemoteEnabled', false); $dompdf = new \Dompdf\Dompdf($options); $dompdf->loadHtml($html, 'UTF-8'); $dompdf->setPaper('A4', 'portrait'); $dompdf->render(); //$dompdf->get_canvas()->get_cpdf()->setEncryption($password, $password); $baseDir = '../../storage/report/'; \Tools\FS::mkpath($baseDir); $path = $baseDir.$filename.'.pdf'; file_put_contents($path, $dompdf->output()); $reportBase64 = base64_encode(file_get_contents($path)); return [ 'result' => 'OK', 'data' => $data, 'media' => $media, 'password' => $password, 'base64' => $reportBase64, 'filename' => $filename.'.pdf', 'patient' => $patient, 'visit' => $visit ]; } public function tr($lang, $item) { return array_key_exists($item, DataInterface::$translation[$lang])?DataInterface::$translation[$lang][$item]:'?'.$item.'?'; } public function trDate($lang, $date) { if($lang=='fr') { $t = explode('-', $date); return $t[2].'/'.$t[1].'/'.$t[0]; } return $date; } protected function generateGraph2($abacus, $plot_offset, $lang, $imt_value, $birth) { $width = 450; $height = 300; $margin = 40; $margin2 = 20; $today = date("Y-m-d"); $diff = date_diff(date_create($birth), date_create($today)); $patientAge = $diff->y; $png_image = imagecreate($width+$margin+$margin+$margin2, $height+$margin); imagecolorallocate($png_image, 255, 255, 255); imageantialias($png_image, true); //imagesetthickness($png_image, 2); $white = imagecolorallocate($png_image, 255, 255, 255); $black = imagecolorallocate($png_image, 0, 0, 0); $red = imagecolorallocate($png_image, 255, 0, 0); $green = imagecolorallocate($png_image, 0, 128, 0); $blue = imagecolorallocate($png_image, 0, 0, 128); // scale $yr = 125 - 40; $yr2 = $yr / 5 * 2; $xr = 90 - 20; $xr2 = $xr / 5; // Y => 30 / 29 => 34 => 33 $val = 0.4; imageline($png_image, $margin2+$margin, 0, $margin2+$margin, $height, $black); for($i=0; $i<=$yr2; $i++) { $y = $height - (($height-0)/$yr2 * $i); $offset = ($i%2)?2:5; imageline($png_image, $margin2+$margin-$offset, 0+$y, $margin2+$margin+$offset, 0+$y, $black); if(!($i%2) && $i<$yr2-1) { imagestring($png_image, 2, $margin2+$margin-32, $y-6, number_format($val,2), $black); $val+=0.05; } } // X $age = 20; imageline($png_image, $margin2+$margin, $height, $margin2+$width+$margin, $height, $black); for($i=0; $i<=$xr2; $i++) { $x = ($width-0)/$xr2 * $i; $offset = ($i%2)?2:5; imageline($png_image, $margin2+$margin+$x, $height-$offset, $margin2+$margin+$x, $height+$offset, $black); if(!($i%2)) { imagestring($png_image, 2, $margin2+$margin+$x-6, $height+6, $age, $black); $age+=10; } } // 25% $tab = []; foreach($abacus as $age => $values) { $tab[] = $values[0]; } for($i=0; $itr($lang, '25percent')); // 50% $tab = []; foreach($abacus as $age => $values) { $tab[] = $values[1]; } imagesetstyle($png_image, array($black, $black, $black, $black, $black, $black, $black, $black, $black, $black, $white, $white, $white, $white, $white, $white, $white, $white, $white, $white)); for($i=0; $itr($lang, '50percent')); // 75% $tab = []; foreach($abacus as $age => $values) { $tab[] = $values[2]; } for($i=0; $itr($lang, '75percent')); // value $x = $margin+($width/($xr) * ($patientAge-20)); $y = $height - ( $height / $yr * ($imt_value*100-40) ); imagefilledellipse($png_image, $margin2+$x, $y, 9, 9, $blue); imagettftext($png_image, 10, 0, $margin2+$x + 6, $y + 5, $blue, './arial.ttf', number_format($imt_value,3)); // legends imagettftext($png_image, 10, 0, $width/2+5, $height+32, $black, './arial.ttf', 'Age (y)'); imagettftext($png_image, 10, 90, 10, $height/2-5, $black, './arial.ttf', 'IMT (mm)'); ob_start(); imagepng($png_image); $data = ob_get_contents(); ob_end_clean(); $res = 'data:image/png;base64,'.base64_encode($data); imagedestroy($png_image); return $res; } protected function generateGraph($ABQ, $abacus, $lang, $imt_value_left, $imt_value_right, $birth) { $width = 450; $height = 300; $margin = 40; $today = date("Y-m-d"); $diff = date_diff(date_create($birth), date_create($today)); $patientAge = $diff->y; $png_image = imagecreate($width+$margin+$margin, $height+$margin); imagecolorallocate($png_image, 255, 255, 255); imageantialias($png_image, true); //imagesetthickness($png_image, 2); $white = imagecolorallocate($png_image, 255, 255, 255); $black = imagecolorallocate($png_image, 0, 0, 0); $red = imagecolorallocate($png_image, 255, 0, 0); $green = imagecolorallocate($png_image, 0, 128, 0); $blue = imagecolorallocate($png_image, 0, 0, 128); // value $imt_value = $imt_value_left + $imt_value_right; if($imt_value_left>0 && $imt_value_right>0) { $imt_value /= 2.0; } // Y $val = 0.4; imageline($png_image, $margin, 0, $margin, $height, $black); for($i=0; $i<=30; $i++) { $y = $height - (($height-0)/30 * $i); $offset = ($i%2)?2:5; imageline($png_image, $margin-$offset, 0+$y, $margin+$offset, 0+$y, $black); if(!($i%2) && $i<29) { imagestring($png_image, 2, $margin-32, $y-6, number_format($val,2), $black); $val+=0.05; } } // $yr = 115 - 40; if($ABQ=='PARC') { // X $age = 20; imageline($png_image, $margin, $height, $width+$margin, $height, $black); for($i=0; $i<=12; $i++) { $x = ($width-0)/12 * $i; $offset = ($i%2)?2:5; imageline($png_image, $margin+$x, $height-$offset, $margin+$x, $height+$offset, $black); if(!($i%2)) { imagestring($png_image, 2, $margin+$x-6, $height+6, $age, $black); $age+=10; } } // 25% $tab = []; foreach($abacus as $age => $values) { $tab[] = $values[0]; } for($i=0; $itr($lang, '25percent')); // 50% $tab = []; foreach($abacus as $age => $values) { $tab[] = $values[1]; } imagesetstyle($png_image, array($black, $black, $black, $black, $black, $black, $black, $black, $black, $black, $white, $white, $white, $white, $white, $white, $white, $white, $white, $white)); for($i=0; $itr($lang, '50percent')); // 75% $tab = []; foreach($abacus as $age => $values) { $tab[] = $values[2]; } for($i=0; $itr($lang, '75percent')); // value $x = $margin+($width/(80-20) * ($patientAge-20)); $y = $height - ( $height / $yr * ($imt_value*100-40) ); imagefilledellipse($png_image, $x, $y, 9, 9, $blue); imagettftext($png_image, 10, 0, $x + 6, $y + 5, $blue, './arial.ttf', number_format($imt_value,3)); } else if($ABQ=='VITA') { // X $age = 35; imageline($png_image, $margin, $height, $width+$margin, $height, $black); for($i=0; $i<=12; $i++) { $x = ($width-0)/12 * $i; $offset = ($i%2)?2:5; imageline($png_image, $margin+$x, $height-$offset, $margin+$x, $height+$offset, $black); if(!($i%2)) { imagestring($png_image, 2, $margin+$x-6, $height+6, $age, $black); $age+=5; } } // 20% $tab = []; foreach($abacus as $age => $values) { $tab[] = $values[0]; } for($i=0; $itr($lang, '20percent')); // 80% $tab = []; foreach($abacus as $age => $values) { $tab[] = $values[1]; } for($i=0; $itr($lang, '80percent')); // value $x = $margin+($width/(65-35) * ($patientAge-35)); $y = $height - ( $height / $yr * ($imt_value*100-40) ); imagefilledellipse($png_image, $x, $y, 9, 9, $blue); imagettftext($png_image, 10, 0, $x + 6, $y + 5, $blue, './arial.ttf', number_format($imt_value,3)); } ob_start(); imagepng($png_image); $data = ob_get_contents(); ob_end_clean(); $res = 'data:image/png;base64,'.base64_encode($data); imagedestroy($png_image); return $res; } } }