Files
hpt_inventory/app/Http/Controllers/ReportController.php
2026-05-25 11:08:52 +07:00

1169 lines
59 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Enums\DateFormatEnum;
use App\Enums\RecordStatusEnum;
use App\Exports\DoctorPhysicianExport;
use App\Exports\DoctorSampleSourceExport;
use App\Exports\SummaryReportExport;
use App\Exports\VillageCoverageExport;
use App\Exports\FinancialReportExport;
use App\Helpers\Helpers;
use App\Http\Controllers\Helper\GlobalController;
use App\Http\Requests\SampleCreateRequest;
use App\Http\Requests\UpdateRequests\SampleUpdateRequest;
use App\Http\Resources\SampleResource;
use App\Models\BaseModel;
use App\Models\Invoice;
use App\Models\InvoiceDetail;
use App\Models\Physician;
use App\Models\Sample;
use App\Models\SampleSource;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Session;
use Maatwebsite\Excel\Facades\Excel;
class ReportController extends Controller
{
protected $model;
protected $sampleModel;
protected $invoiceDetailModel;
protected $baseLabId;
protected $labs;
protected $physicianModel;
protected $sampleSourceModel;
protected $base;
public function __construct(Invoice $invoiceModel, InvoiceDetail $invoiceDetailModel, Sample $sampleModel,
Physician $physicianModel, SampleSource $sampleSourceModel
){
$this->model = $invoiceModel;
$this->sampleModel = $sampleModel;
$this->invoiceDetailModel = $invoiceDetailModel;
$this->physicianModel = $physicianModel;
$this->sampleSourceModel = $sampleSourceModel;
$this->baseLabId = Session::get('base_lab_id');
$this->base = Session::get('base_lab');
$this->labs = parent::getAccessAbleLabs();
}
/**
* ======================================
* INVOICE REPORTS STARTED
*/
public function dailyInvoiceReport($date, $reportType = 'daily'){
try{
$reportPeriodCondition = $reportType != 'daily' ? ' DATE_FORMAT(inv.`invoice_date`, "%Y-%m")= "'.date('Y-m',strtotime($date)).'" ' : ' DATE(inv.`invoice_date`) = "'.$date.'"';
$arrData = array();
$arrData['report_period'] = $date;
$invoices = DB::select('
SELECT
inv.id as invoice_id,
ps.`id` AS physician_id,
ps.`name_en` AS physician_name,
lb.`name_en` AS lab,
p.`name_en` AS patient,
inv.`discount`,
inv.`total`,
inv.`gross_total`,
inv.`balance`,
inv.`invoice_date`,
req_test.req_tests
FROM `invoices` inv
INNER JOIN samples sp
ON sp.id =inv.`sample_id` AND sp.`lab_id` = inv.`lab_id`
INNER JOIN physicians ps
ON ps.`id` = sp.`physician_id` AND ps.`lab_id` = sp.`lab_id`
INNER JOIN `laboratories` lb
ON lb.`id` = sp.`lab_id`
INNER JOIN patients p
ON p.`id` = sp.`patient_id` AND p.`lab_id` = sp.`lab_id`
LEFT JOIN(
SELECT
tr.sample_id,
GROUP_CONCAT(t.name_en SEPARATOR ", ") AS req_tests
FROM `test_results` tr
INNER JOIN test_samples ts
ON ts.id = tr.test_sample_id
AND ts.lab_id = tr.lab_id
INNER JOIN tests t
ON t.id = ts.test_id
WHERE tr.lab_id = '.$this->baseLabId.'
AND tr.record_status_id = 1
GROUP BY tr.sample_id
)req_test
ON req_test.sample_id = sp.id
WHERE '.$reportPeriodCondition.'
AND inv.record_status_id = 1 AND sp.record_status_id = 1
AND inv.lab_id = '.$this->baseLabId);
$physicianArray = array();
foreach ($invoices as $row) {
$physicianArray[$row->physician_id]['physician_id'] = $row->physician_id;
$physicianArray[$row->physician_id]['physician_name'] = $row->physician_name;
$invoiceArray = array(
'id' => (string)$row->invoice_id,
'lab' => $row->lab,
'patient' => $row->patient,
'requested_tests' => (string) $row->req_tests,
'discount' => $row->discount,
'total_amount' => $row->total,
'net_amount' => $row->gross_total,
'owe_amount' => $row->balance
);
$physicianArray[$row->physician_id]['invoices'][] = $invoiceArray;
}
$arrData['report_data'] = $physicianArray;
return response()->json(['success'=> true , 'data' => $arrData]);
} catch (\Exception $e){
return response()->json(['success'=> false , 'errors' => $e->getMessage()]);
}
}
public function yearlyInvoiceReport($year){
try{
$arrData = array();
$arrData['report_period'] = $year;
$yearlyData = DB::select('
SELECT
DATE_FORMAT(inv.`invoice_date`, "%m") AS month_id,
DATE_FORMAT(inv.`invoice_date`, "%M") AS month_name,
SUM(1) AS total_invoices,
SUM(inv.`gross_total`) AS net_amount,
SUM(inv.`deposit`) AS paid_amount,
SUM(inv.`balance`) AS owe_amount
FROM `invoices` inv
INNER JOIN samples sp
ON sp.id =inv.`sample_id` AND sp.`lab_id` = inv.`lab_id`
INNER JOIN physicians ps
ON ps.`id` = sp.`physician_id` AND ps.`lab_id` = sp.`lab_id`
INNER JOIN `laboratories` lb
ON lb.`id` = sp.`lab_id`
INNER JOIN patients p
ON p.`id` = sp.`patient_id` AND p.`lab_id` = sp.`lab_id`
WHERE YEAR(inv.`invoice_date`) = '.$year.'
GROUP BY DATE_FORMAT(inv.`invoice_date`, "%M"), DATE_FORMAT(inv.`invoice_date`, "%m")
');
$yearlyInvoiceArray = array();
foreach ($yearlyData as $row) {
$invoiceArray = array(
'month_number' => (string)$row->month_id,
'month_name' => $row->month_name,
'total_invoice' => $row->total_invoices,
'total_net_amount' => $row->net_amount,
'total_paid_amount' => $row->paid_amount,
'total_owe_amount' => $row->owe_amount
);
$yearlyInvoiceArray[] = $invoiceArray;
}
$arrData['report_data'] = $yearlyInvoiceArray;
return response()->json(['success'=> true , 'data' => $arrData]);
} catch (\Exception $e){
return response()->json(['success'=> false , 'errors' => $e->getMessage()]);
}
}
/**
* ======================================
* INVOICE REPORTS ENDED
*/
/**
* ======================================
* SUMMARY REPORTS STARTED
*/
public function summaryReport(Request $request){
try{
if(!GlobalController::user_can(Auth::user()->role_id, ['generate_summary_report'])) return redirect(url('my-profile'));
$startDate = $request->start_date;
$endDate = $request->end_date;
$arrData = array();
$arrData['report_name'] = 'Summary Report';
$arrData['report_period_from'] = $startDate;
$arrData['report_period_to'] = $endDate;
$reportData = DB::select('
SELECT
st.`id` AS sample_type_id,
st.`name_en` AS sample_type,
-- ts.group_result as test_name,
ts.group_result,
-- t.`name_en` AS test_name,
SUM(IF(p.`gender` =1, 1, 0)) AS total_male_patient,
SUM(IF(p.`gender` =1, 0, 1)) AS total_female_patient,
SUM(1) AS total_patient
FROM samples s
INNER JOIN test_results tr
ON tr.`sample_id` = s.`id`
AND s.`lab_id` = tr.`lab_id`
INNER JOIN test_samples ts
ON ts.id = tr.`test_sample_id`
INNER JOIN tests t
ON t.`id` = ts.`test_id`
INNER JOIN sample_types st
ON st.`id` = ts.`sample_type_id`
INNER JOIN patients p
ON p.id = s.patient_id
WHERE s.`lab_id`= '.$this->baseLabId.'
AND tr.`record_status_id` = 1
AND s.`record_status_id` = 1
AND p.`record_status_id` = 1
AND ts.group_result IS NOT NULL AND ts.group_result <> ""
AND DATE(s.received_date) BETWEEN "'.date('Y-m-d', strtotime($startDate)).'" AND "'.date('Y-m-d', strtotime($endDate)).'"
GROUP BY st.`id`,
st.`name_en`,
ts.group_result,
t.`name_en`
-- order by st.weight, ts.weight asc
');
$summaryReportArray = array();
$summary4Export = array();
foreach ($reportData as $row) {
$summaryReportArray[$row->sample_type_id]['sample_type'] = $row->sample_type;
$arr = array(
'test_type' => $row->sample_type,
'group_result' => $row->group_result,
// 'test_name' => (string)$row->test_name,
'total_male_patient' => (int)$row->total_male_patient,
'total_female_patient' => (int)$row->total_female_patient,
'total_patient' => (int)$row->total_patient
);
$summaryReportArray[$row->sample_type_id]['test_name'][] = $arr;
$summary4Export[] = $arr;
}
$arrData['report_data'] = collect($summaryReportArray)->flatten(1)->toArray();
if($request->export) return $this->exportSummaryReport($summary4Export);
$arrData['sample_source_data'] = $this->getSummaryReportBySampleSource($startDate, $endDate);
$arrData['test_category_data'] = $this->getSummaryReportByTestCategory($startDate, $endDate);
$arrData['test_date_data'] = $this->getSummaryReportByReceiveDate($startDate, $endDate);
$arrData['performed_by'] = $this->getSummaryReportByPerformer($startDate, $endDate);
return view('aggregate_report', ['report_data' => $arrData, 'labSettings' => (object) $this->location()]);
} catch (\Exception $e){
return response()->json(['success'=> false , 'errors' => $e->getMessage()]);
}
}
function getSummaryReportByTestCategory($startDate, $endDate){
try{
$reportData = DB::select('
SELECT
ts.category,
SUM(IF(p.`gender` =1, 1, 0)) AS total_male_patient,
SUM(IF(p.`gender` =1, 0, 1)) AS total_female_patient,
SUM(1) AS total_patient
FROM samples s
INNER JOIN test_results tr
ON tr.`sample_id` = s.`id`
AND s.`lab_id` = tr.`lab_id`
INNER JOIN test_samples ts
ON ts.id = tr.`test_sample_id`
INNER JOIN tests t
ON t.`id` = ts.`test_id`
INNER JOIN sample_types st
ON st.`id` = ts.`sample_type_id`
INNER JOIN patients p
ON p.id = s.patient_id
WHERE s.`lab_id`= '.$this->baseLabId.'
AND tr.`record_status_id` = 1
AND s.`record_status_id` = 1
AND p.`record_status_id` = 1
AND ts.category IS NOT NULL AND ts.category <> ""
AND DATE(s.received_date) BETWEEN "'.date('Y-m-d', strtotime($startDate)).'" AND "'.date('Y-m-d', strtotime($endDate)).'"
GROUP BY
ts.category
');
$sampleSourceReportArray = array();
foreach ($reportData as $row) {
$arr = array(
//'test_type' => $row->sample_type,
'category' => $row->category,
'total_male_patient' => (int)$row->total_male_patient,
'total_female_patient' => (int)$row->total_female_patient,
'total_patient' => (int)$row->total_patient
);
$sampleSourceReportArray[] = $arr;
}
return $sampleSourceReportArray;
} catch (\Exception $e){
return [];
}
}
function getSummaryReportBySampleSource($startDate, $endDate){
try{
$sampleSourceData = DB::select('
SELECT
ss.`name_en` AS clinic_name,
SUM(IF(p.`gender` =1, 1, 0)) AS total_male_patient,
SUM(IF(p.`gender` =1, 0, 1)) AS total_female_patient,
SUM(1) AS total_patient
FROM samples s
INNER JOIN patients p
ON p.id = s.patient_id
AND p.`lab_id` = s.`lab_id`
INNER JOIN sample_sources ss
ON ss.id = s.`sample_source_id`
AND ss.`lab_id` = s.`lab_id`
WHERE s.`lab_id`= '.$this->baseLabId.'
AND s.`record_status_id` = 1
AND p.`record_status_id` = 1
AND DATE(s.received_date) BETWEEN "'.date('Y-m-d', strtotime($startDate)).'" AND "'.date('Y-m-d', strtotime($endDate)).'"
GROUP BY ss.`name_en`
');
$sampleSourceReportArray = array();
foreach ($sampleSourceData as $row) {
$arr = array(
'clinic_name' => (string)$row->clinic_name,
'total_male_patient' => (int)$row->total_male_patient,
'total_female_patient' => (int)$row->total_female_patient,
'total_patient' => (int)$row->total_patient
);
$sampleSourceReportArray[] = $arr;
}
return $sampleSourceReportArray;
} catch (\Exception $e){
return [];
}
}
function getSummaryReportByReceiveDate($startDate, $endDate){
try{
$sampleSourceData = DB::select('
SELECT
DATE_FORMAT(s.`received_date`, "%Y-%m-%d") AS received_date,
SUM(IF(p.`gender` =1, 1, 0)) AS total_male_patient,
SUM(IF(p.`gender` =1, 0, 1)) AS total_female_patient,
SUM(1) AS total_patient
FROM samples s
INNER JOIN patients p
ON p.id = s.patient_id
AND p.`lab_id` = s.`lab_id`
WHERE s.`lab_id`= '.$this->baseLabId.'
AND s.`record_status_id` = 1
AND p.`record_status_id` = 1
AND DATE(s.received_date) BETWEEN "'.date('Y-m-d', strtotime($startDate)).'" AND "'.date('Y-m-d', strtotime($endDate)).'"
GROUP BY DATE_FORMAT(s.`received_date`, "%Y-%m-%d")
ORDER BY s.`received_date`
');
$sampleSourceReportArray = array();
foreach ($sampleSourceData as $row) {
$arr = array(
'received_date' => (string)$row->received_date,
'total_male_patient' => (int)$row->total_male_patient,
'total_female_patient' => (int)$row->total_female_patient,
'total_patient' => (int)$row->total_patient
);
$sampleSourceReportArray[] = $arr;
}
return $sampleSourceReportArray;
} catch (\Exception $e){
return [];
}
}
function getSummaryReportByPerformer($startDate, $endDate){
try{
$sampleSourceData = DB::select('
SELECT
us.`name` AS performer_name,
SUM(IF(p.`gender` =1, 1, 0)) AS total_male_patient,
SUM(IF(p.`gender` =1, 0, 1)) AS total_female_patient,
SUM(1) AS total_patient
FROM samples s
INNER JOIN patients p ON p.id = s.patient_id AND p.`lab_id` = s.`lab_id`
INNER JOIN test_results AS tr ON s.id=tr.sample_id
INNER JOIN users AS us ON tr.performed_by=us.id
WHERE s.`lab_id`= '.$this->baseLabId.'
AND s.`record_status_id` = 1
AND p.`record_status_id` = 1
AND DATE(s.received_date) BETWEEN "'.date('Y-m-d', strtotime($startDate)).'" AND "'.date('Y-m-d', strtotime($endDate)).'"
GROUP BY us.`name`
');
$sampleSourceReportArray = array();
foreach ($sampleSourceData as $row) {
$arr = array(
'performer_name' => (string)$row->performer_name,
'total_male_patient' => (int)$row->total_male_patient,
'total_female_patient' => (int)$row->total_female_patient,
'total_patient' => (int)$row->total_patient
);
$sampleSourceReportArray[] = $arr;
}
return $sampleSourceReportArray;
} catch (\Exception $e){
return [];
}
}
/**
* ======================================
* SUMMARY REPORTS ENDED
*/
/**
* ======================================
* DOCTOR REPORTS STARTED
*/
public function doctorReport(Request $request){
try{
if(!GlobalController::user_can(Auth::user()->role_id, ['generate_doctor_report'])) return redirect(url('my-profile'));
$startDate = $request->start_date;
$endDate = $request->end_date;
$sampleSourceId = (isset($request->sample_source) && !empty($request->sample_source)) ? $request->sample_source : NULL;
$physicianId = (isset($request->physician) && !empty($request->physician)) ? $request->physician : NULL;
$arrData = array();
$arrData['report_name'] = 'Doctor Report';
$arrData['report_period_from'] = $startDate;
$arrData['report_period_to'] = $endDate;
$reportData = DB::select('
SELECT
ss.`name_en` AS sample_source_name,
SUM(1) AS total_exam,
SUM(tp.`total_price`) AS total_net_amount
FROM samples s
INNER JOIN patients p
ON p.id = s.patient_id
AND p.`lab_id` = s.`lab_id`
INNER JOIN sample_sources ss
ON ss.id = s.`sample_source_id`
AND ss.`lab_id` = s.`lab_id`
LEFT JOIN(
SELECT
s.id AS sample_id,
s.`lab_id`,
SUM(ts.`usd_price`) AS total_price
FROM samples s
INNER JOIN test_results r
ON r.`sample_id` = s.`id`
AND r.`lab_id` = s.`lab_id`
INNER JOIN test_samples ts
ON ts.`id` = r.`test_sample_id`
WHERE s.`record_status_id`=1
AND r.`record_status_id` =1
AND ts.`record_status_id` =1
GROUP BY s.`id`, s.`lab_id`
) tp ON tp.sample_id = s.id AND s.`lab_id` = tp.lab_id
WHERE s.`lab_id`= '.$this->baseLabId.'
AND s.`record_status_id` = 1
AND p.`record_status_id` = 1
AND DATE(s.received_date) BETWEEN "'.date('Y-m-d', strtotime($startDate)).'" AND "'.date('Y-m-d', strtotime($endDate)).'"
GROUP BY ss.`name_en`');
$doctorReportArray = array();
foreach ($reportData as $k=>$row) {
$arr = array(
'no' => $k+1,
'sample_source_name' => (string)$row->sample_source_name,
'total_exam' => (int)$row->total_exam,
'total_net_amount' => (float)$row->total_net_amount
);
$doctorReportArray[] = $arr;
}
if(empty($sampleSourceId) && empty($physicianId)){
$arrData['report_data'] = $doctorReportArray;
$arrData['report_id'] = 1;
if($request->export){
return $this->exportDoctorSampleBase($arrData['report_data']);
}
} elseif (!empty($sampleSourceId) && empty($physicianId)){
$arrData['report_data'] = $this->getDoctorReportGroupByPhysician($startDate, $endDate, $sampleSourceId);
$arrData['report_id'] = 2;
if($request->export){
return $this->exportDoctorPhysicianBase($arrData['report_data']);
}
}else{
$arrData['report_data'] = $this->getDoctorReportRawByPhysician($startDate, $endDate,$sampleSourceId, $physicianId);
$arrData['report_id'] = 3;
if($request->export){
return $this->exportDoctorRawBase($arrData['report_data']);
}
}
$printDoctorData = $this->getDoctorReportRawBySampleSource($startDate, $endDate, !empty($sampleSourceId) ? $sampleSourceId : 0 );
$printRawByPhysician = $this->getDoctorReportRawByPhysician($startDate, $endDate,$sampleSourceId, $physicianId);
//$printDoctorReportDetail = $this->getDoctorReportDetail($startDate, $endDate,$sampleSourceId, $physicianId);
$sampleSources = $this->sampleSourceModel::query()->where(['lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE])->get();
$physicians = $this->physicianModel::query()->where(['lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE])->get();
return view('doctor_report', ['report_data' => $arrData , 'sampleSources' => $sampleSources, 'physicians' => $physicians, 'labSettings' => (object) $this->location(), 'printDoctorData' => $printDoctorData, 'printRawByPhysician' => $printRawByPhysician]);
} catch (\Exception $e){
return response()->json(['success'=> false , 'errors' => $e->getMessage()]);
}
}
function getDoctorReportGroupByPhysician($startDate, $endDate, $sampleSourceId = null){
try{
$sampleSourceCondition = !is_null($sampleSourceId) ? ' AND s.sample_source_id='.$sampleSourceId :'';
$sampleSourceData = DB::select('
SELECT
ps.`name_en` AS physician_name,
SUM(1) AS total_exam,
SUM(tp.`total_price`) AS total_net_amount
FROM samples s
INNER JOIN patients p
ON p.id = s.patient_id
AND p.`lab_id` = s.`lab_id`
INNER JOIN sample_sources ss
ON ss.id = s.`sample_source_id`
AND ss.`lab_id` = s.`lab_id`
INNER JOIN physicians ps
ON ps.`id` = s.`physician_id`
LEFT JOIN(
SELECT
s.id AS sample_id,
s.`lab_id`,
SUM(ts.`usd_price`) AS total_price
FROM samples s
INNER JOIN test_results r
ON r.`sample_id` = s.`id`
AND r.`lab_id` = s.`lab_id`
INNER JOIN test_samples ts
ON ts.`id` = r.`test_sample_id`
WHERE s.`record_status_id`=1
AND r.`record_status_id` =1
AND ts.`record_status_id` =1
GROUP BY s.`id`, s.`lab_id`
) tp ON tp.sample_id = s.id AND s.`lab_id` = tp.lab_id
WHERE s.`lab_id`= '.$this->baseLabId.'
'.$sampleSourceCondition.'
AND s.`record_status_id` = 1
AND p.`record_status_id` = 1
AND DATE(s.received_date) BETWEEN "'.date('Y-m-d', strtotime($startDate)).'" AND "'.date('Y-m-d', strtotime($endDate)).'"
GROUP BY ps.`name_en`;
');
$physicianReportArray = array();
foreach ($sampleSourceData as $k=>$row) {
$arr = array(
'no' => $k+1,
'physician_name' => (string)$row->physician_name,
'total_exam' => (int)$row->total_exam,
'total_net_amount' => (float)$row->total_net_amount
);
$physicianReportArray[] = $arr;
}
return $physicianReportArray;
} catch (\Exception $e){
return [];
}
}
public function getDoctorReportRawByPhysician($startDate, $endDate, $sample_source='', $physicianId = null){
try{
$physicianCondition = !empty($physicianId) && $physicianId!='All' ? ' AND s.physician_id='.$physicianId :'';
$sample_sourceCondition = !empty($sample_source) ? ' AND ss.id='.$sample_source :'';
$rawTestByPhysician = DB::select('
SELECT
s.received_date as `invoice_date`,
ss.name_en as sample_source,
p.`name_en` AS patient,
s.`sample_number`,
-- req_test.req_tests AS test_name,
req_test.group_result as test_name,
ps.`name_en` AS physician_name,
tp.total_price AS total_amount,
tp.total_price AS total_net_amount
FROM samples s
INNER JOIN patients p
ON p.id = s.patient_id
AND p.`lab_id` = s.`lab_id`
INNER JOIN sample_sources ss
ON ss.id = s.`sample_source_id`
AND ss.`lab_id` = s.`lab_id`
INNER JOIN physicians ps
ON ps.`id` = s.`physician_id`
LEFT JOIN(
SELECT
s.id AS sample_id,
s.`lab_id`,
SUM(ts.`usd_price`) AS total_price
FROM samples s
INNER JOIN test_results r
ON r.`sample_id` = s.`id`
AND r.`lab_id` = s.`lab_id`
INNER JOIN test_samples ts
ON ts.`id` = r.`test_sample_id`
WHERE s.`record_status_id`=1
AND r.`record_status_id` =1
AND ts.`record_status_id` =1
GROUP BY s.`id`, s.`lab_id`
) tp ON tp.sample_id = s.id AND s.`lab_id` = tp.lab_id
LEFT JOIN(
SELECT
tr.sample_id,
GROUP_CONCAT(t.name_en SEPARATOR ", ") AS req_tests,
GROUP_CONCAT(DISTINCT CASE WHEN ts.lab_id = 22 THEN SUBSTR(ts.`group_result`, 1, 4) ELSE ts.`group_result` END SEPARATOR ", ") AS group_result
FROM `test_results` tr
INNER JOIN test_samples ts
ON ts.id = tr.test_sample_id
AND ts.lab_id = tr.lab_id
INNER JOIN tests t
ON t.id = ts.test_id
WHERE tr.lab_id = '.$this->baseLabId.'
AND tr.record_status_id = 1
AND ts.`record_status_id` =1
AND LENGTH(ts.`group_result`)>=1
GROUP BY tr.sample_id
)req_test
ON req_test.sample_id = s.id
WHERE s.`lab_id`= '.$this->baseLabId.'
'.$physicianCondition.'
AND s.`record_status_id` = 1
AND p.`record_status_id` = 1
and req_test.group_result is not null
'.$sample_sourceCondition.'
AND DATE(s.received_date) BETWEEN "'.date('Y-m-d', strtotime($startDate)).'" AND "'.date('Y-m-d', strtotime($endDate)).' order by s.received_date ASC "
');
$physicianReportArray = array();
foreach ($rawTestByPhysician as $row) {
$arr = array(
'date' => (string)date('d-M-Y',strtotime($row->invoice_date)),
'sample_source' => (string) $row->sample_source,
'patient' => (string)$row->patient,
'sample_number' => (string)$row->sample_number,
'test_name' => (string)$row->test_name,
'physician' => (string)$row->physician_name,
'total_amount' => (float)$row->total_amount,
'total_net_amount' => (float)$row->total_net_amount,
);
$physicianReportArray[] = $arr;
}
asort($physicianReportArray);
return $physicianReportArray;
} catch (\Exception $e){
return [];
}
}
public function getDoctorReportRawBySampleSource($startDate, $endDate, $sampleSourceId){
try{
$rawDoctorReportPrint = DB::select('
SELECT
s.received_date as `register_date`,
s.`sample_number`,
p.`name_en` AS patient,
ss.id sample_source_id,
ss.name_en as sample_source,
IF(p.gender=1, "M","F") as gender,
p.dob,
req_test.total_tests,
req_test.total_price AS total_price
FROM samples s
INNER JOIN patients p
ON p.id = s.patient_id
AND p.`lab_id` = s.`lab_id`
INNER JOIN sample_sources ss
ON ss.id = s.`sample_source_id`
AND ss.`lab_id` = s.`lab_id`
LEFT JOIN(
SELECT
tr.sample_id,
count(*) as total_tests,
SUM(ts.`usd_price`) AS total_price
FROM `test_results` tr
INNER JOIN test_samples ts
ON ts.id = tr.test_sample_id
AND ts.lab_id = tr.lab_id
INNER JOIN tests t
ON t.id = ts.test_id
WHERE tr.lab_id = '.$this->baseLabId.'
AND tr.record_status_id = 1
AND ts.`record_status_id` =1
AND LENGTH(ts.`group_result`)>=1
GROUP BY tr.sample_id
)req_test
ON req_test.sample_id = s.id
WHERE s.`lab_id`= '.$this->baseLabId.'
'.(!empty($sampleSourceId) ? 'AND s.sample_source_id='.$sampleSourceId:'').'
AND s.`record_status_id` = 1
AND p.`record_status_id` = 1
AND DATE(s.received_date) BETWEEN "'.date('Y-m-d', strtotime($startDate)).'" AND "'.date('Y-m-d', strtotime($endDate)).'"
');
$departmentArray = array();
foreach ($rawDoctorReportPrint as $row){
$departmentArray[$row->sample_source_id]['sample_source_id'] = $row->sample_source_id;
$departmentArray[$row->sample_source_id]['sample_source'] = $row->sample_source;
$testItemArray = array(
'register_date' => date('d/m/Y',strtotime($row->register_date)),
'sample_number' => $row->sample_number,
'patient' => $row->patient,
'gender' => $row->gender,
'age' => (string) Helpers::getAge($row->dob, $row->register_date),
'total_tests' => (integer) $row->total_tests,
'total_price' =>(float) $row->total_price
);
//dd($testItemArray);
$departmentArray[$row->sample_source_id]['data'][] = $testItemArray;
}
//dd($departmentArray);
return collect($departmentArray)->values();
return $rawDoctorReportPrint;
} catch (\Exception $e){
return [];
}
}
/**
* ======================================
* DOCTOR REPORTS ENDED
*/
/**
* ======================================
* FINANCIAL REPORTS ENDED
*/
public function financialReport(Request $request){
try{
if(!GlobalController::user_can(Auth::user()->role_id, ['generate_financial_report'])) return redirect(url('my-profile'));
$startDate = $request->start_date;
$endDate = $request->end_date;
$sampleSourceId = (isset($request->sample_source) && !empty($request->sample_source)) ? $request->sample_source : NULL;
$physicianId = (isset($request->physician) && !empty($request->physician)) ? $request->physician : NULL;
$arrData = array();
$arrData['report_name'] = 'Financial Report';
$arrData['report_period_from'] = $startDate;
$arrData['report_period_to'] = $endDate;
$financialReport = $this->getFinancialReport($startDate, $endDate,$sampleSourceId, $physicianId);
if($request->export){
return $this->exportFinancialReport($financialReport);
}
$sampleSources = $this->sampleSourceModel::query()->where(['lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE])->get();
$physicians = $this->physicianModel::query()->where(['lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE])->get();
return view('financial_report', ['report_data' => $arrData , 'sampleSources' => $sampleSources, 'physicians' => $physicians, 'labSettings' => (object) $this->location(), 'financialReport' => $financialReport]);
} catch (\Exception $e){
return response()->json(['success'=> false , 'errors' => $e->getMessage()]);
}
}
public function getFinancialReport($startDate, $endDate, $sample_source='', $physicianId = null){
try{
//\DB::enableQueryLog();
$physicianCondition = !empty($physicianId) && $physicianId!='All' ? ' AND s.physician_id='.$physicianId :'';
$sample_sourceCondition = !empty($sample_source) ? ' AND ss.id='.$sample_source :'';
$rawTestByPhysician = DB::select("
select
inv.`invoice_date`,
ss.`name_en` as sample_source,
p.`name_en` AS patient,
s.`sample_number`,
invd.test_name,
inv.exchange_rate,
ps.`name_en` AS physician_name,
sum(inv.total) AS total_amount,
sum(inv.gross_total) AS total_net_amount,
sum(inv.total) - SUM(inv.gross_total) as discount,
sum(ifnull(inv.deposit, 0)) as total_paid,
sum(ifnull(inv.bank_deposit,0)) as total_bank_paid,
-- sum(inv.gross_total) - SUM(inv.deposit) as total_owe,
sum(inv.balance) as total_owe
from invoices inv
inner join samples s on s.`id` = inv.`sample_id` and s.`lab_id` = inv.`lab_id` and s.`record_status_id` = 1
inner join patients p on p.`id` = s.`patient_id` and p.`lab_id` = s.`lab_id`
INNER JOIN sample_sources ss ON ss.id = s.`sample_source_id` AND ss.`lab_id` = s.`lab_id`
INNER JOIN physicians ps ON ps.`id` = s.`physician_id`
inner join (
select
inv.id,
group_concat(distinct invd.test_name SEPARATOR ', ') as test_name
from invoice_details invd
inner join invoices inv ON inv.id = invd.invoice_id
WHERE inv.`record_status_id` = 1
AND DATE(inv.invoice_date) BETWEEN '".date('Y-m-d', strtotime($startDate))."' AND '".date('Y-m-d', strtotime($endDate))."'
AND inv.lab_id= ".$this->baseLabId."
group by inv.id
)invd
on invd.id = inv.id
where inv.`record_status_id` = 1
".$physicianCondition."
".$sample_sourceCondition."
AND DATE(inv.invoice_date) BETWEEN '".date('Y-m-d', strtotime($startDate))."' AND '".date('Y-m-d', strtotime($endDate))."'
and inv.lab_id= ".$this->baseLabId."
group by inv.`invoice_date`,
ss.`name_en`,
p.`name_en`,
s.`sample_number`,
ps.`name_en`,
invd.test_name,
inv.exchange_rate
order by sample_number asc
");
//dd(\DB::getQueryLog());
$physicianReportArray = array();
$i = 1;
foreach ($rawTestByPhysician as $row) {
$arr = array(
'no' => strtotime($row->invoice_date),
'date' => (string)date('d-M-Y',strtotime($row->invoice_date)),
'sample_number' => (string)$row->sample_number,
'patient' => (string)$row->patient,
'test_name' => (string)$row->test_name,
'physician' => (string)$row->physician_name,
'exchange_rate' => @$row->exchange_rate,
'total_amount' => (float)$row->total_amount,
'total_discount' => (float)$row->discount,
'total_net_amount' => (float)$row->total_net_amount,
'total_paid' => (float)$row->total_paid,
'total_bank_paid' => (float)$row->total_bank_paid,
'total_owe' => (float)$row->total_owe,
);
$physicianReportArray[] = $arr;
$i++;
}
if(($sample_source=='-1' || empty($sample_source)) && empty($physicianId)){
$vaccinationReports = $this->getVaccinationReport($startDate, $endDate);
foreach ($vaccinationReports as $vaccinationReport) {
$arrVac = array(
'no' => strtotime($vaccinationReport->invoice_date),
'date' => (string)date('d-M-Y',strtotime($vaccinationReport->invoice_date)),
'sample_number' => (string)$vaccinationReport->sample_number,
'patient' => (string)$vaccinationReport->patient,
'test_name' => (string)$vaccinationReport->test_name,
'physician' => (string)$vaccinationReport->physician_name,
'exchange_rate' =>@$vaccinationReport->exchange_rate,
'total_amount' => (float)$vaccinationReport->total_amount,
'total_discount' => (float)$vaccinationReport->discount,
'total_net_amount' => (float)$vaccinationReport->total_net_amount,
'total_paid' => (float)$vaccinationReport->total_paid,
'total_bank_paid' => (float)$vaccinationReport->total_bank_paid,
'total_owe' => (float)$vaccinationReport->total_owe,
);
$physicianReportArray[] = $arrVac;
$i++;
}
}
if(($sample_source=='-2' || empty($sample_source)) && empty($physicianId)){
//$dialyReports = $this->getDailyReport($startDate, $endDate, $physicianId);
// if(Auth::id()==1){
$dialyReports = $this->getDailyReportV2($startDate, $endDate, $physicianId);
// }
$j=1;
foreach ($dialyReports as $vaccinationReport) {
$arrVac = array(
'no' => strtotime($vaccinationReport->invoice_date),
'date' => (string)date('d-M-Y',strtotime($vaccinationReport->invoice_date)),
'sample_number' => (string)$vaccinationReport->sample_number,
'patient' => (string)$vaccinationReport->patient,
'test_name' => (string)$vaccinationReport->test_name,
'physician' => (string)$vaccinationReport->physician_name,
'exchange_rate' => @$vaccinationReport->exchange_rate,
'total_amount' => (float)$vaccinationReport->total_amount,
'total_discount' => (float)$vaccinationReport->discount,
'total_net_amount' => (float)$vaccinationReport->total_net_amount,
'total_paid' => (float)$vaccinationReport->total_paid,
'total_bank_paid' => (float)$vaccinationReport->total_bank_paid,
'total_owe' => (float)$vaccinationReport->total_owe,
);
$physicianReportArray[] = $arrVac;
$j++;
}
}
// Sort the array
//usort($physicianReportArray, 'date_compare');
sort($physicianReportArray);
// dd($physicianReportArray);
return $physicianReportArray;
} catch (\Exception $e){
return [];
}
}
public function getDailyReport($startDate, $endDate, $physicianId = null){
try{
//\DB::enableQueryLog();
$physicianCondition = !empty($physicianId) && $physicianId!='All' ? ' AND s.physician_id='.$physicianId :'';
$rawTestByPhysician = DB::select("
select
inv.first_paid_date as `invoice_date`,
ss.`name_en` as sample_source,
p.`name_en` AS patient,
s.`sample_number`,
invd.test_name,
inv.exchange_rate,
ps.`name_en` AS physician_name,
sum(inv.total) AS total_amount,
sum(inv.gross_total) AS total_net_amount,
sum(inv.total) - SUM(inv.gross_total) as discount,
sum(ifnull(inv.deposit, 0)) as total_paid,
sum(ifnull(inv.bank_deposit,0)) as total_bank_paid,
-- sum(inv.gross_total) - SUM(inv.deposit) as total_owe,
sum(inv.balance) as total_owe
from invoices inv
inner join samples s on s.`id` = inv.`sample_id` and s.`lab_id` = inv.`lab_id` and s.`record_status_id` = 1
inner join patients p on p.`id` = s.`patient_id` and p.`lab_id` = s.`lab_id`
INNER JOIN sample_sources ss ON ss.id = s.`sample_source_id` AND ss.`lab_id` = s.`lab_id`
INNER JOIN physicians ps ON ps.`id` = s.`physician_id`
inner join (
select
inv.id,
group_concat(distinct invd.test_name SEPARATOR ', ') as test_name
from invoice_details invd
inner join invoices inv ON inv.id = invd.invoice_id
WHERE inv.`record_status_id` = 1
AND DATE(inv.first_paid_date) BETWEEN '".date('Y-m-d', strtotime($startDate))."' AND '".date('Y-m-d', strtotime($endDate))."'
AND inv.lab_id= ".$this->baseLabId."
group by inv.id
)invd
on invd.id = inv.id
where inv.`record_status_id` = 1
".$physicianCondition."
AND DATE(inv.first_paid_date) BETWEEN '".date('Y-m-d', strtotime($startDate))."' AND '".date('Y-m-d', strtotime($endDate))."'
and inv.lab_id= ".$this->baseLabId."
group by inv.`first_paid_date`,
ss.`name_en`,
p.`name_en`,
s.`sample_number`,
ps.`name_en`,
invd.test_name,
inv.exchange_rate
order by sample_number asc
");
return $rawTestByPhysician;
} catch (\Exception $e){
return [];
}
}
public function getDailyReportV2($startDate, $endDate, $physicianId = null){
try{
//\DB::enableQueryLog();
$physicianCondition = !empty($physicianId) && $physicianId!='All' ? ' AND s.physician_id='.$physicianId :'';
$rawTestByPhysician = DB::select("
select
r.repayment_date as `invoice_date`,
ss.`name_en` as sample_source,
p.`name_en` AS patient,
s.`sample_number`,
concat('Repayment for invoice ',inv.invoice_code) as test_name,
r.exchange_rate,
ps.`name_en` AS physician_name,
sum(r.cash_repayment_amount + r.bank_repayment_amount) AS total_amount,
sum(r.cash_repayment_amount + r.bank_repayment_amount) AS total_net_amount,
0 as discount,
sum(r.cash_repayment_amount) as total_paid,
sum(r.bank_repayment_amount) as total_bank_paid,
0 as total_owe
from repayments r
inner join invoices inv on inv.id = r.invoice_id and r.lab_id = inv.lab_id and inv.record_status_id = 1
inner join samples s on s.`id` = inv.`sample_id` and s.`lab_id` = inv.`lab_id` and s.`record_status_id` = 1
inner join patients p on p.`id` = s.`patient_id` and p.`lab_id` = s.`lab_id`
INNER JOIN sample_sources ss ON ss.id = s.`sample_source_id` AND ss.`lab_id` = s.`lab_id`
INNER JOIN physicians ps ON ps.`id` = s.`physician_id`
where r.`record_status_id` = 1
".$physicianCondition."
AND DATE(r.repayment_date) BETWEEN '".date('Y-m-d', strtotime($startDate))."' AND '".date('Y-m-d', strtotime($endDate))."'
and r.lab_id= ".$this->baseLabId."
group by r.`repayment_date`,
ss.`name_en`,
p.`name_en`,
s.`sample_number`,
ps.`name_en`,
r.exchange_rate,
inv.invoice_code
order by sample_number asc
");
return $rawTestByPhysician;
} catch (\Exception $e){
dd($e);
return [];
}
}
public function getVaccinationReport($startDate, $endDate){
try{
//\DB::enableQueryLog();
$rawTestByPhysician = DB::select("
SELECT
inv.vaccination_date AS `invoice_date`,
'Vaccination' AS sample_source,
p.`name_en` AS patient,
inv.invoice_code AS `sample_number`,
invd.test_name,
'' AS physician_name,
inv.exchange_rate,
SUM(inv.total) AS total_amount,
SUM(inv.gross_total) AS total_net_amount,
SUM(inv.total) - SUM(inv.gross_total) AS discount,
SUM(IFNULL(inv.deposit, 0)) AS total_paid,
SUM(IFNULL(inv.bank_deposit,0)) AS total_bank_paid,
SUM(inv.balance) AS total_owe
FROM vaccination_invoices inv
INNER JOIN patients p ON p.`id` = inv.`patient_id` AND p.`lab_id` = inv.`lab_id`
INNER JOIN (
SELECT
inv.id,
GROUP_CONCAT(DISTINCT m.name SEPARATOR ', ') AS test_name
FROM vaccination_invoice_details invd
INNER JOIN vaccination_invoices inv ON inv.id = invd.vac_invoice_id
INNER JOIN `medicine_items` mi ON mi.id = invd.medicine_item_id
INNER JOIN medicines m ON m.id = mi.medicine_id
WHERE inv.`record_status_id` = 1
AND DATE(inv.vaccination_date) BETWEEN '".date('Y-m-d', strtotime($startDate))."' AND '".date('Y-m-d', strtotime($endDate))."'
AND inv.lab_id= ".$this->baseLabId."
GROUP BY inv.id
)invd
ON invd.id = inv.id
WHERE inv.`record_status_id` = 1
AND DATE(inv.vaccination_date) BETWEEN '".date('Y-m-d', strtotime($startDate))."' AND '".date('Y-m-d', strtotime($endDate))."'
AND inv.lab_id= ".$this->baseLabId."
GROUP BY inv.`vaccination_date`,
p.`name_en`,
inv.invoice_code,
invd.test_name,
inv.exchange_rate
ORDER BY inv.invoice_code ASC
");
//dd(\DB::getQueryLog());
return $rawTestByPhysician;
} catch (\Exception $e){
return [];
}
}
/**
* =====================================
* EXPORT FUNCTION STARTED
*/
function exportDoctorSampleBase($arrData){
$data = $arrData;
$titleHeading = [
__('No'),
__('Sample Source'),
__('Exam'),
__('Net Amount'),
];
$export = new DoctorSampleSourceExport($data);
$export->setTitle(__('Doctor Report'));
$export->setTitleHeadingTable($titleHeading);
$dateTime = Carbon::now()->toDateTime()->format(DateFormatEnum::YmdHis);
$fileName = 'doctor_report_by_sample'.$dateTime.'.xlsx';
return Excel::download($export, $fileName);
}
function exportDoctorPhysicianBase($arrData){
$data = $arrData;
$titleHeading = [
__('No'),
__('Physician'),
__('Exam'),
__('Net Amount'),
];
$export = new DoctorPhysicianExport($data);
$export->setTitle(__('Doctor Report'));
$export->setTitleHeadingTable($titleHeading);
$dateTime = Carbon::now()->toDateTime()->format(DateFormatEnum::YmdHis);
$fileName = 'doctor_report_by_physician'.$dateTime.'.xlsx';
return Excel::download($export, $fileName);
}
function exportDoctorRawBase($arrData){
$data = $arrData;
$titleHeading = [
__('Date'),
__('Sample Source'),
__('Patient'),
__('Sample Number'),
__('Test Name'),
__('Physician'),
__('Total Amount'),
__('Net Amount'),
];
$export = new DoctorPhysicianExport($data);
$export->setTitle(__('Doctor Report'));
$export->setTitleHeadingTable($titleHeading);
$dateTime = Carbon::now()->toDateTime()->format(DateFormatEnum::YmdHis);
$fileName = 'doctor_report'.$dateTime.'.xlsx';
return Excel::download($export, $fileName);
}
function exportSummaryReport($arrData){
$data = $arrData;
$titleHeading = [
__('Sample Type'),
__('Test Type'),
__('Male Patient'),
__('Female Patient'),
__('Total Patient')
];
$export = new SummaryReportExport($data);
$export->setTitle(__('Summary Report by Test Type'));
$export->setTitleHeadingTable($titleHeading);
$dateTime = Carbon::now()->toDateTime()->format(DateFormatEnum::YmdHis);
$fileName = 'summary_report'.$dateTime.'.xlsx';
return Excel::download($export, $fileName);
}
function exportFinancialReport($arrData){
$data = $arrData;
$titleHeading = [
__('No'),
__('Invoice Date'),
__('Sample Number'),
__('Patient Name'),
__('Test Name'),
__('Physician'),
__('Exchange Rate'),
__('Total'),
__('Discount'),
__('Net Amount'),
__('Cash Pay'),
__('Bank Pay'),
__('Owe'),
];
$export = new FinancialReportExport($data);
$export->setTitle(__('Financial Report'));
$export->setTitleHeadingTable($titleHeading);
$dateTime = Carbon::now()->toDateTime()->format(DateFormatEnum::YmdHis);
$fileName = 'financial_report'.$dateTime.'.xlsx';
return Excel::download($export, $fileName);
}
}