Add MCU report QR

This commit is contained in:
sas.fajri
2026-05-22 09:24:19 +07:00
parent f20b50f478
commit 6849757e22

View File

@@ -70,25 +70,29 @@ class MedicalCheckupReportPdf extends FPDF
class Medical_checkup_report extends MY_Controller
{
const QR_GAP_FROM_FOOTER_MM = 5.0;
const QR_SIZE_MM = 22.0;
public function __construct()
{
parent::__construct();
$this->db_onedev = $this->load->database('onedev', true);
$this->load->library('Generateqrreport');
}
public function index()
{
$this->sys_ok([
'message' => 'Use /tools/medical_checkup_report/pdf?T_OrderHeaderID=<id>&username=<username>'
'message' => 'Use /tools/medical_checkup_report/pdf?T_OrderHeaderGroupResultDetailsT_OrderDetailID=<id>&username=<username>'
]);
}
public function pdf()
{
try {
$orderHeaderId = intval($this->input->get('T_OrderHeaderID', true));
if ($orderHeaderId <= 0) {
$this->sys_error('T_OrderHeaderID mandatory');
$orderDetailId = intval($this->input->get('T_OrderHeaderGroupResultDetailsT_OrderDetailID', true));
if ($orderDetailId <= 0) {
$this->sys_error('T_OrderHeaderGroupResultDetailsT_OrderDetailID mandatory');
return;
}
@@ -97,6 +101,14 @@ class Medical_checkup_report extends MY_Controller
$printBy = 'ADMIN';
}
$reportContext = $this->get_report_context($orderDetailId);
if (!$reportContext) {
$this->sys_error('Mapping order detail / group result tidak ditemukan');
return;
}
$orderHeaderId = intval($reportContext['order_header_id']);
$header = $this->get_header_data($orderHeaderId);
if (!$header) {
$this->sys_error('Data order tidak ditemukan');
@@ -106,6 +118,11 @@ class Medical_checkup_report extends MY_Controller
$rows = $this->get_result_rows($orderHeaderId);
$saran = $this->get_saran($orderHeaderId);
$branch = $this->get_default_branch();
$verifyUrl = $this->get_verify_url(
$orderHeaderId,
intval($reportContext['group_result_id']),
intval($reportContext['test_id'])
);
require_once APPPATH . 'third_party/fpdf/fpdf.php';
@@ -185,10 +202,15 @@ class Medical_checkup_report extends MY_Controller
$pdf->Ln(4);
$this->render_result_rows($pdf, $rows, $saran);
$tempQrPath = $this->render_last_page_qr($pdf, $verifyUrl);
header('Content-Type: application/pdf');
header('Content-Disposition: inline; filename="medical_checkup_report_' . $orderHeaderId . '.pdf"');
echo $pdf->Output('S');
$output = $pdf->Output('S');
if ($tempQrPath !== '') {
@unlink($tempQrPath);
}
echo $output;
} catch (Exception $exc) {
$this->sys_error($exc->getMessage());
}
@@ -293,6 +315,61 @@ class Medical_checkup_report extends MY_Controller
return trim((string)$row['saran']);
}
private function get_report_context($orderDetailId)
{
$sql = "SELECT
ogd.T_OrderHeaderGroupResultDetailsT_OrderHeaderID AS order_header_id,
ogr.T_OrderHeaderGroupResultGroup_ResultID AS group_result_id,
od.T_OrderDetailT_TestID AS test_id
FROM t_orderheader_group_result_details ogd
JOIN t_orderheader_group_result ogr
ON ogr.T_OrderHeaderGroupResultID = ogd.T_OrderHeaderGroupResultDetailsT_OrderHeaderGroupResultID
AND ogr.T_OrderHeaderGroupResultIsActive = 'Y'
JOIN t_orderdetail od
ON od.T_OrderDetailID = ogd.T_OrderHeaderGroupResultDetailsT_OrderDetailID
AND od.T_OrderDetailIsActive = 'Y'
WHERE ogd.T_OrderHeaderGroupResultDetailsT_OrderDetailID = ?
AND ogd.T_OrderHeaderGroupResultDetailsIsActive = 'Y'
LIMIT 1";
$qry = $this->db_onedev->query($sql, [$orderDetailId]);
if (!$qry) {
return false;
}
$row = $qry->row_array();
if (!$row) {
return false;
}
return $row;
}
private function get_verify_url($orderHeaderId, $groupResultId, $testId)
{
$sql = "SELECT IFNULL(QR_PrintOutVerifyURL, '') AS verify_url
FROM one_lab.qr_printout
WHERE QR_PrintOutT_OrderHeaderID = ?
AND QR_PrintOutGroup_ResultID = ?
AND QR_PrintOutT_TestID = ?
AND QR_PrintOutIsActive = 1
AND IFNULL(QR_PrintOutVerifyURL, '') <> ''
ORDER BY QR_PrintOutID DESC
LIMIT 1";
$qry = $this->db_onedev->query($sql, [$orderHeaderId, $groupResultId, $testId]);
if (!$qry) {
return '';
}
$row = $qry->row_array();
if (!$row) {
return '';
}
return trim((string)$row['verify_url']);
}
private function render_result_rows($pdf, $rows, $saran = '')
{
$left = 14;
@@ -571,6 +648,45 @@ class Medical_checkup_report extends MY_Controller
}
}
private function render_last_page_qr($pdf, $verifyUrl)
{
$verifyUrl = trim((string)$verifyUrl);
if ($verifyUrl === '') {
return '';
}
$tempQrPath = $this->generate_temp_qr_file($verifyUrl);
if ($tempQrPath === '') {
return '';
}
$footerTopY = $pdf->GetPageHeight() - 18.0;
$qrBottomY = $footerTopY - self::QR_GAP_FROM_FOOTER_MM;
$qrTopY = $qrBottomY - self::QR_SIZE_MM;
if ($pdf->GetY() > $qrTopY) {
$pdf->AddPage();
}
$pdf->Image($tempQrPath, 14, $qrTopY, self::QR_SIZE_MM, self::QR_SIZE_MM, 'PNG');
return $tempQrPath;
}
private function generate_temp_qr_file($verifyUrl)
{
$tempQrPath = rtrim(sys_get_temp_dir(), DIRECTORY_SEPARATOR)
. DIRECTORY_SEPARATOR
. 'medical_checkup_report_qr_'
. md5($verifyUrl . microtime(true))
. '.png';
$isSaved = $this->generateqrreport->generateQRImageFile($verifyUrl, $tempQrPath, 4, 'H');
if (!$isSaved || !file_exists($tempQrPath)) {
return '';
}
return $tempQrPath;
}
private function safe_text($text)
{
$text = (string)$text;