Update Primayan Medicare report search and layout

This commit is contained in:
Iqbal
2026-05-11 11:36:13 +07:00
parent 21a909aacb
commit d96e439b2a
2 changed files with 66 additions and 38 deletions

View File

@@ -7,11 +7,9 @@ use App\Models\Corporate;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Routing\Controller; use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
use Illuminate\Support\Facades\Storage; use Illuminate\Support\Facades\Storage;
use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx; use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
use PhpOffice\PhpSpreadsheet\Style\Alignment; use PhpOffice\PhpSpreadsheet\Style\Alignment;
use PhpOffice\PhpSpreadsheet\Style\Border; use PhpOffice\PhpSpreadsheet\Style\Border;
use PhpOffice\PhpSpreadsheet\Style\Fill; use PhpOffice\PhpSpreadsheet\Style\Fill;
@@ -62,6 +60,8 @@ class PrimayanMedicareController extends Controller
$query->orWhere('members.name', 'like', "%" . $search . "%") $query->orWhere('members.name', 'like', "%" . $search . "%")
->orWhere('members.member_id', 'like', "%" . $search . "%") ->orWhere('members.member_id', 'like', "%" . $search . "%")
->orWhere('claim_requests.code', 'like', "%" . $search . "%") ->orWhere('claim_requests.code', 'like', "%" . $search . "%")
->orWhere('request_logs.code', 'like', "%" . $search . "%")
->orWhere('claims.code', 'like', "%" . $search . "%")
->orWhere('corporate_employees.nik', 'like', "%" . $search . "%"); ->orWhere('corporate_employees.nik', 'like', "%" . $search . "%");
}); });
}) })
@@ -173,6 +173,8 @@ class PrimayanMedicareController extends Controller
$query->orWhere('members.name', 'like', "%" . $search . "%") $query->orWhere('members.name', 'like', "%" . $search . "%")
->orWhere('members.member_id', 'like', "%" . $search . "%") ->orWhere('members.member_id', 'like', "%" . $search . "%")
->orWhere('claim_requests.code', 'like', "%" . $search . "%") ->orWhere('claim_requests.code', 'like', "%" . $search . "%")
->orWhere('request_logs.code', 'like', "%" . $search . "%")
->orWhere('claims.code', 'like', "%" . $search . "%")
->orWhere('corporate_employees.nik', 'like', "%" . $search . "%"); ->orWhere('corporate_employees.nik', 'like', "%" . $search . "%");
}); });
}) })
@@ -226,8 +228,8 @@ class PrimayanMedicareController extends Controller
mkdir(storage_path('app/public/temp'), 0755, true); mkdir(storage_path('app/public/temp'), 0755, true);
} }
$writer = WriterEntityFactory::createXLSXWriter(); $spreadsheet = new Spreadsheet();
$writer->openToFile($filePath); $sheet = $spreadsheet->getActiveSheet();
$serviceCodeMap = [ $serviceCodeMap = [
'OP' => 'Outpatient', 'OP' => 'Outpatient',
@@ -258,40 +260,55 @@ class PrimayanMedicareController extends Controller
'Excess Paid', 'Excess Paid',
'Status', 'Status',
]; ];
$headerRow = WriterEntityFactory::createRowFromArray($headers);
$writer->addRow($headerRow);
$sheet->fromArray($headers, null, 'A1');
$sheet->getStyle('A1:Q1')->applyFromArray([
'font' => [
'bold' => true,
],
'alignment' => [
'horizontal' => Alignment::HORIZONTAL_CENTER,
]
]);
$rowIndex = 2;
$no = 1; $no = 1;
foreach ($results as $row) { foreach ($results as $item) {
$serviceCode = $row->service_code ?? '-'; $serviceCode = $item->service_code ?? '-';
$serviceName = $serviceCodeMap[$serviceCode] ?? $serviceCode; $serviceName = $serviceCodeMap[$serviceCode] ?? $serviceCode;
$rowData = [ $rowData = [
$no++, $no++,
($row->claim_code && $row->log_code) ($item->claim_code && $item->log_code)
? $row->claim_code . ' / ' . $row->log_code ? $item->claim_code . ' / ' . $item->log_code
: ($row->claim_code ?? $row->log_code ?? $row->request_code ?? '-'), : ($item->claim_code ?? $item->log_code ?? $item->request_code ?? '-'),
$row->member_name ?? '-', $item->member_name ?? '-',
$row->member_number ?? '-', $item->member_number ?? '-',
$row->nik ?? '-', $item->nik ?? '-',
$row->birth_date ?? '-', $item->birth_date ?? '-',
$row->gender ?? '-', $item->gender ?? '-',
$row->plan_code ?? '-', $item->plan_code ?? '-',
$row->benefit_name ?? $row->benefit_desc ?? '-', $item->benefit_name ?? $item->benefit_desc ?? '-',
$serviceName, $serviceName,
$row->provider_name ?? '-', $item->provider_name ?? '-',
$row->request_date ?? '-', $item->request_date ?? '-',
$row->amount_incurred ?? 0, $item->amount_incurred ?? 0,
$row->amount_approved ?? 0, $item->amount_approved ?? 0,
$row->amount_not_approved ?? 0, $item->amount_not_approved ?? 0,
$row->excess_paid ?? 0, $item->excess_paid ?? 0,
$row->status ?? '-', $item->status ?? '-',
]; ];
$dataRow = WriterEntityFactory::createRowFromArray($rowData);
$writer->addRow($dataRow); $sheet->fromArray($rowData, null, 'A' . $rowIndex);
$rowIndex++;
} }
$writer->close(); foreach (range('A', 'Q') as $col) {
$sheet->getColumnDimension($col)->setAutoSize(true);
}
$writer = new Xlsx($spreadsheet);
$writer->save($filePath);
return Helper::responseJson([ return Helper::responseJson([
'file_name' => 'Primayan Medicare List ' . now()->format('Y-m-d H:i:s'), 'file_name' => 'Primayan Medicare List ' . now()->format('Y-m-d H:i:s'),
@@ -333,8 +350,15 @@ class PrimayanMedicareController extends Controller
// Header Date Range (Row 1) // Header Date Range (Row 1)
$dateRange = now()->startOfMonth()->format('j F') . ' - ' . now()->format('j F Y'); $dateRange = now()->startOfMonth()->format('j F') . ' - ' . now()->format('j F Y');
$sheet->setCellValue('A1', strtoupper($dateRange)); $sheet->setCellValue('A1', strtoupper($dateRange));
$sheet->mergeCells('A1:G1'); $sheet->mergeCells('A1:B1');
$sheet->getStyle('A1')->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER); $sheet->getStyle('A1')->applyFromArray([
'font' => [
'bold' => true,
],
'alignment' => [
'horizontal' => Alignment::HORIZONTAL_CENTER,
]
]);
// Table Headers (Row 3) // Table Headers (Row 3)
$headers = ['Code RS', 'Branch Code', 'Total Benefit', 'Deposit 10%', 'Pemakaian Benefit Obat & Rujukan', 'Pemakaian Telekonsultasi', 'Sisa Deposit']; $headers = ['Code RS', 'Branch Code', 'Total Benefit', 'Deposit 10%', 'Pemakaian Benefit Obat & Rujukan', 'Pemakaian Telekonsultasi', 'Sisa Deposit'];
@@ -353,6 +377,9 @@ class PrimayanMedicareController extends Controller
'allBorders' => [ 'allBorders' => [
'borderStyle' => Border::BORDER_THIN, 'borderStyle' => Border::BORDER_THIN,
] ]
],
'alignment' => [
'horizontal' => Alignment::HORIZONTAL_CENTER,
] ]
]); ]);

View File

@@ -90,8 +90,8 @@ export default function List() {
return ( return (
<form style={{ width: '100%' }}> <form style={{ width: '100%' }}>
<Grid container spacing={2} sx={{ justifyContent: 'space-between', alignItems: 'center' }}> <Grid container spacing={2} sx={{ alignItems: 'center' }}>
<Grid item md={2}> <Grid item xs={12} md={2.4}>
<TextField <TextField
id="search-input" id="search-input"
ref={searchInput} ref={searchInput}
@@ -118,7 +118,7 @@ export default function List() {
/> />
</Grid> </Grid>
<Grid item md={2}> <Grid item xs={12} md={2}>
<FormControl fullWidth> <FormControl fullWidth>
<InputLabel>Status</InputLabel> <InputLabel>Status</InputLabel>
<Select <Select
@@ -146,7 +146,7 @@ export default function List() {
</FormControl> </FormControl>
</Grid> </Grid>
<Grid item md={2}> <Grid item xs={12} md={2}>
<FormControl fullWidth> <FormControl fullWidth>
<InputLabel>Provider</InputLabel> <InputLabel>Provider</InputLabel>
<Select <Select
@@ -172,7 +172,7 @@ export default function List() {
</FormControl> </FormControl>
</Grid> </Grid>
<Grid item md={2}> <Grid item xs={12} md={2}>
<LocalizationProvider dateAdapter={AdapterDateFns}> <LocalizationProvider dateAdapter={AdapterDateFns}>
<DesktopDatePicker <DesktopDatePicker
value={searchParams.get('start_date') || null} value={searchParams.get('start_date') || null}
@@ -196,7 +196,7 @@ export default function List() {
</LocalizationProvider> </LocalizationProvider>
</Grid> </Grid>
<Grid item md={2}> <Grid item xs={12} md={2}>
<LocalizationProvider dateAdapter={AdapterDateFns}> <LocalizationProvider dateAdapter={AdapterDateFns}>
<DesktopDatePicker <DesktopDatePicker
value={searchParams.get('end_date') || null} value={searchParams.get('end_date') || null}
@@ -220,11 +220,12 @@ export default function List() {
</LocalizationProvider> </LocalizationProvider>
</Grid> </Grid>
<Grid item md={1}> <Grid item xs={12} md={1.6}>
<LoadingButton <LoadingButton
variant="outlined" variant="outlined"
startIcon={<UploadIcon />} startIcon={<UploadIcon />}
sx={{ p: 1.8 }} fullWidth
sx={{ height: '56px' }}
onClick={handleExportClick} onClick={handleExportClick}
loading={exportLoading} loading={exportLoading}
> >