From 903478ce59f5c5f665163c2ed3762a4364d54606 Mon Sep 17 00:00:00 2001 From: DevSoftTech Server Date: Tue, 18 Aug 2026 13:09:03 +0530 Subject: [PATCH] Add OPD patient list report with refer by --- app/Config/Routes.php | 3 + app/Controllers/Report.php | 92 ++++++++++++++++++ app/Views/report/opd_patient_list_report.php | 96 +++++++++++++++++++ .../report/opd_patient_list_report_table.php | 44 +++++++++ app/Views/report/opd_total_report.php | 5 + 5 files changed, 240 insertions(+) create mode 100644 app/Views/report/opd_patient_list_report.php create mode 100644 app/Views/report/opd_patient_list_report_table.php diff --git a/app/Config/Routes.php b/app/Config/Routes.php index ef432b4..9f9943e 100644 --- a/app/Config/Routes.php +++ b/app/Config/Routes.php @@ -1045,6 +1045,9 @@ $routes->get('Report/collection_report', 'Report::collection_report', ['filter' $routes->get('Report/report_opd_total', 'Report::report_opd_total', ['filter' => $reportsCollectionFilter]); $routes->get('Report/opd_total_data/(:segment)/(:segment)/(:segment)/(:segment)', 'Report::opd_total_data/$1/$2/$3/$4', ['filter' => $reportsCollectionFilter]); $routes->get('Report/opd_total_data/(:segment)/(:segment)/(:segment)/(:segment)/(:num)', 'Report::opd_total_data/$1/$2/$3/$4/$5', ['filter' => $reportsCollectionFilter]); +$routes->get('Report/report_opd_patient_list', 'Report::report_opd_patient_list', ['filter' => $reportsCollectionFilter]); +$routes->get('Report/opd_patient_list_data/(:segment)/(:segment)/(:segment)', 'Report::opd_patient_list_data/$1/$2/$3', ['filter' => $reportsCollectionFilter]); +$routes->get('Report/opd_patient_list_data/(:segment)/(:segment)/(:segment)/(:num)', 'Report::opd_patient_list_data/$1/$2/$3/$4', ['filter' => $reportsCollectionFilter]); $routes->get('Report/report_total_payment_app_show/(:segment)/(:segment)/(:segment)', 'Report::report_total_payment_app_show/$1/$2/$3', ['filter' => $reportsCollectionFilter]); $routes->get('Report/report_total_payment_app_show/(:segment)/(:segment)/(:segment)/(:num)', 'Report::report_total_payment_app_show/$1/$2/$3/$4', ['filter' => $reportsCollectionFilter]); $routes->get('Report/report_total_payment_app_show/(:segment)/(:segment)/(:segment)/(:segment)', 'Report::report_total_payment_app_show/$1/$2/$3/$4', ['filter' => $reportsCollectionFilter]); diff --git a/app/Controllers/Report.php b/app/Controllers/Report.php index c35bf9e..ea8aa35 100644 --- a/app/Controllers/Report.php +++ b/app/Controllers/Report.php @@ -58,6 +58,98 @@ class Report extends BaseController ]); } + public function report_opd_patient_list() + { + $doctors = $this->db->table('doctor_master') + ->select('id, p_fname') + ->where('active', 1) + ->orderBy('p_fname', 'ASC') + ->get() + ->getResult(); + + $referBys = $this->db->table('patient_master') + ->select('referby') + ->where('referby IS NOT NULL', null, false) + ->where("TRIM(referby) != ''", null, false) + ->where("TRIM(referby) != '0'", null, false) + ->groupBy('referby') + ->orderBy('referby', 'ASC') + ->get() + ->getResult(); + + return view('report/opd_patient_list_report', [ + 'doctors' => $doctors, + 'refer_bys' => $referBys, + ]); + } + + public function opd_patient_list_data( + string $dateRange, + string $doctorId = '0', + string $referBy = '0', + int $output = 0 + ) { + [$minRange, $maxRange] = $this->parseDateRangeDateOnly($dateRange); + + $builder = $this->db->table('opd_master o') + ->select('o.opd_id, o.opd_code, o.P_name, p.p_code, o.apointment_date, o.doc_name, p.referby') + ->select('o.opd_fee_desc, o.opd_fee_amount, o.payment_mode, o.running_opd') + ->join('patient_master p', 'p.id = o.p_id', 'left') + ->where("DATE(o.apointment_date) BETWEEN '{$minRange}' AND '{$maxRange}'", null, false) + ->where('(o.payment_mode > 0 OR COALESCE(o.running_opd,0)=1)', null, false) + ->orderBy('o.apointment_date', 'ASC') + ->orderBy('o.opd_id', 'ASC'); + + $doctorIdValue = (int) $doctorId; + if ($doctorIdValue > 0) { + $builder->where('o.doc_id', $doctorIdValue); + } + + $referByValue = trim((string) urldecode($referBy)); + if ($referByValue !== '' && $referByValue !== '0' && strtolower($referByValue) !== 'all') { + $builder->where('p.referby', $referByValue); + } + + $rows = $builder->get()->getResult(); + $content = view('report/opd_patient_list_report_table', [ + 'rows' => $rows, + 'min_range' => $minRange, + 'max_range' => $maxRange, + ]); + + if ($output === 1) { + ExportExcel($content, 'OPD_Patient_List_' . date('YmdHis')); + return $this->response->setBody(''); + } + + if ($output === 2) { + $mpdfTempDir = WRITEPATH . 'cache' . DIRECTORY_SEPARATOR . 'mpdf'; + if (! is_dir($mpdfTempDir)) { + mkdir($mpdfTempDir, 0755, true); + } + + $mpdf = new Mpdf([ + 'tempDir' => $mpdfTempDir, + 'format' => 'A4-L', + 'margin_top' => 8, + 'margin_bottom' => 8, + 'margin_left' => 8, + 'margin_right' => 8, + ]); + $pdfHtml = '' + . '

OPD Patient List

' . $content; + $mpdf->WriteHTML($pdfHtml); + + $fileName = 'OPD_Patient_List_' . date('Ymd_His') . '.pdf'; + return $this->response + ->setHeader('Content-Type', 'application/pdf') + ->setHeader('Content-Disposition', 'inline; filename="' . $fileName . '"') + ->setBody($mpdf->Output($fileName, 'S')); + } + + return $this->response->setBody($content); + } + public function opd_total_data( string $dateRange, string $doctorId = '0', diff --git a/app/Views/report/opd_patient_list_report.php b/app/Views/report/opd_patient_list_report.php new file mode 100644 index 0000000..3e47fad --- /dev/null +++ b/app/Views/report/opd_patient_list_report.php @@ -0,0 +1,96 @@ + +
+
+
+
OPD Patient List
+ +
+
+
+
+ +
+ + +
+
+
+ + +
+
+ + +
+
+ +
+ + + +
+
+
+ +
+
+
Select filters and click Show.
+
+
+
+ + diff --git a/app/Views/report/opd_patient_list_report_table.php b/app/Views/report/opd_patient_list_report_table.php new file mode 100644 index 0000000..f729938 --- /dev/null +++ b/app/Views/report/opd_patient_list_report_table.php @@ -0,0 +1,44 @@ + +

OPD Date Range: to

+ +
No OPD patient records found for the selected filters.
+ + + + + + + + + + + + + + + + + $row) : ?> + + + + + + + + + + + + + +
#OPD CodePatient NamePatient CodeOPD DateDoctorRefer ByFee TypeFee
opd_code ?? '')) ?>P_name ?? '')) ?>p_code ?? '')) ?>apointment_date ?? '')) ?>doc_name ?? '')) ?>referby ?? '')) ?>opd_fee_desc ?? '')) ?>opd_fee_amount ?? 0), 2)) ?>
+ diff --git a/app/Views/report/opd_total_report.php b/app/Views/report/opd_total_report.php index 9d97000..caeca86 100644 --- a/app/Views/report/opd_total_report.php +++ b/app/Views/report/opd_total_report.php @@ -52,6 +52,7 @@ $feeTypes = $fee_types ?? []; + @@ -107,6 +108,10 @@ $feeTypes = $fee_types ?? []; window.open(buildQuery() + '/2', '_blank'); }); + document.getElementById('open_opd_patient_list').addEventListener('click', function() { + load_form('', 'OPD Patient List'); + }); + $('.select2').select2({ theme: 'bootstrap4', width: '100%'