From 510269c9ee0db2cc4dfcaaa63dfa9b9cfde6be28 Mon Sep 17 00:00:00 2001 From: Muhammad Fajar Date: Mon, 4 Sep 2023 11:07:12 +0700 Subject: [PATCH 1/2] export excel livechat --- .../Controllers/Api/LivechatController.php | 146 ++++++++++++------ Modules/Internal/Routes/api.php | 5 +- app/Models/OLDLMS/Appointment.php | 36 ++--- .../src/pages/Report/Livechat/List.tsx | 57 +++++-- 4 files changed, 158 insertions(+), 86 deletions(-) diff --git a/Modules/Internal/Http/Controllers/Api/LivechatController.php b/Modules/Internal/Http/Controllers/Api/LivechatController.php index c31ef217..a9f87680 100644 --- a/Modules/Internal/Http/Controllers/Api/LivechatController.php +++ b/Modules/Internal/Http/Controllers/Api/LivechatController.php @@ -5,9 +5,14 @@ namespace Modules\Internal\Http\Controllers\Api; use App\Helpers\Helper; use App\Models\OLDLMS\Livechat; use Illuminate\Contracts\Support\Renderable; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Http\Request; use Illuminate\Routing\Controller; +use Illuminate\Support\Carbon; +use Illuminate\Support\Facades\Storage; use Modules\Internal\Transformers\LivechatResource; +use PhpOffice\PhpSpreadsheet\Spreadsheet; +use PhpOffice\PhpSpreadsheet\Writer\Xlsx; class LivechatController extends Controller { @@ -17,19 +22,19 @@ class LivechatController extends Controller */ public function index(Request $request) { - $startDate = $request->startDate; - $endDate = $request->endDate; + $startDate = $request->startDate; + $endDate = $request->endDate; $livechat = Livechat::with('doctor.user', 'doctor.speciality', 'appointment.appointmentDetail', 'healthCare') ->where('nIDAppointment', '!=', null) ->where('nIDAppointment', '!=', ''); - - if ($startDate){ + + if ($startDate) { $livechat = $livechat->where('dCreateOn', '>=', $startDate); } - if ($endDate){ + if ($endDate) { $livechat = $livechat->where('dCreateOn', '<=', $endDate); } @@ -38,24 +43,6 @@ class LivechatController extends Controller return response()->json(Helper::paginateResources(LivechatResource::collection($livechat))); } - /** - * Show the form for creating a new resource. - * @return Renderable - */ - public function create() - { - return view('internal::create'); - } - - /** - * Store a newly created resource in storage. - * @param Request $request - * @return Renderable - */ - public function store(Request $request) - { - } - /** * Show the specified resource. * @param int $id @@ -70,34 +57,95 @@ class LivechatController extends Controller return response()->json(new LivechatResource($livechat)); } - /** - * Show the form for editing the specified resource. - * @param int $id - * @return Renderable - */ - public function edit($id) + public function export(Request $request) { - return view('internal::edit'); - } + $startDate = $request->has('startDate') ? $request->input('startDate') : ''; + $endDate = $request->has('endDate') ? $request->input('endDate') : ''; - /** - * Update the specified resource in storage. - * @param Request $request - * @param int $id - * @return Renderable - */ - public function update(Request $request, $id) - { - // - } + $liveChats = Livechat::with('user:nID,sFirstName,sLastName,sEmail,sPhone', 'doctor:nID,nIDSpesialis,nIDUser', 'doctor.user:nID,sFirstName,sLastName', 'appointment:nID,sPaymentStatus', 'appointment.appointmentDetail:nID,nIDAppointment,dTanggalAppointment,tTimeAppointment', 'healthCare:nID,sHealthCare') + ->where(function (Builder $query) use ($startDate, $endDate) { + $query->where('nIDAppointment', '!=', null); + $query->where('nIDAppointment', '!=', ''); + if ($startDate) { + $query->where('dCreateOn', '>=', $startDate); + } + if ($endDate) { + $query->where('dCreateOn', '<=', $endDate); + } + }) + ->get(['nId', 'nIDUser', 'nIDDokter', 'nIDHealthCare', 'nIDAppointment', 'sStatus', 'sMediaDokter', 'sMedia']); - /** - * Remove the specified resource from storage. - * @param int $id - * @return Renderable - */ - public function destroy($id) - { - // + $headers = [ + ['value' => 'No', 'cell' => 'A1', 'mergeCell' => true, 'mergeToCell' => 'A2'], + ['value' => 'Nama Dokter', 'cell' => 'B1', 'mergeCell' => true, 'mergeToCell' => 'B2'], + ['value' => 'Nama Pasien', 'cell' => 'C1', 'mergeCell' => true, 'mergeToCell' => 'C2'], + ['value' => 'No Telepon Pasien', 'cell' => 'D1', 'mergeCell' => true, 'mergeToCell' => 'D2'], + ['value' => 'Email Pasien', 'cell' => 'E1', 'mergeCell' => true, 'mergeToCell' => 'E2'], + ['value' => 'Faskes', 'cell' => 'F1', 'mergeCell' => true, 'mergeToCell' => 'F2'], + ['value' => 'Tanggal Appointment', 'cell' => 'G1', 'mergeCell' => true, 'mergeToCell' => 'G2'], + ['value' => 'Chat Via App/Website', 'cell' => 'H1', 'mergeCell' => true, 'mergeToCell' => 'I1'], + ['value' => 'Pasien', 'cell' => 'H2', 'mergeCell' => false, 'mergeToCell' => ''], + ['value' => 'Dokter', 'cell' => 'I2', 'mergeCell' => false, 'mergeToCell' => ''], + ['value' => 'Status Appointment', 'cell' => 'J1', 'mergeCell' => true, 'mergeToCell' => 'J2'], + ]; + + $spreadsheet = new Spreadsheet(); + $sheet = $spreadsheet->getActiveSheet(); + + foreach ($headers as $header) { + $sheet->setCellValue($header['cell'], $header['value']); + + if ($header['mergeCell'] === true) { + $sheet->mergeCells($header['cell'] . ':' . $header['mergeToCell']); + } + + $sheet->getStyle($header['cell'])->getFont()->setBold(true); + $sheet->getStyle($header['cell'])->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER)->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER); + } + + $startFrom = 3; + foreach ($liveChats as $indexLiveChat => $liveChat) { + $sheet->setCellValue('A' . $startFrom, $indexLiveChat + 1); + $sheet->setCellValue('B' . $startFrom, $liveChat->doctor->user->full_name ?? '-'); + $sheet->setCellValue('C' . $startFrom, $liveChat->user->full_name ?? '-'); + $sheet->setCellValue('D' . $startFrom, preg_replace('/(\d{3})(\d{4})(\d{3})/', '$1 $2 $3', $liveChat->user->sPhone) ?? '-'); + $sheet->setCellValue('E' . $startFrom, $liveChat->user->sEmail ?? '-'); + $sheet->setCellValue('F' . $startFrom, $liveChat->healthCare->sHealthCare ?? '-'); + $sheet->setCellValue('G' . $startFrom, Carbon::parse($liveChat->appointment->appointmentDetail->dTanggalAppointment)->format('d-m-Y') . ' ' . $liveChat->appointment->appointmentDetail->tTimeAppointment ?? '-'); + $sheet->setCellValue('H' . $startFrom, $liveChat->sMedia ?? '-'); + $sheet->setCellValue('I' . $startFrom, $liveChat->sMediaDokter ?? '-'); + $sheet->setCellValue('J' . $startFrom, $liveChat->appointment->paymentStatus ?? '-'); + $startFrom++; + } + + foreach (['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'] as $header) { + if ($header === 'A') { + $spreadsheet->getActiveSheet()->getColumnDimension($header)->setWidth(35, 'px'); + } elseif ($header === 'H' || $header === 'I') { + $spreadsheet->getActiveSheet()->getColumnDimension($header)->setWidth(100, 'px'); + } else { + $spreadsheet->getActiveSheet()->getColumnDimension($header)->setAutoSize(true); + } + } + + $spreadsheet->getActiveSheet()->getStyle('A3:A' . $startFrom)->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER)->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER); + + $sheet->getDefaultRowDimension()->setRowHeight(-1); + $sheet->setTitle('Live Chat Report'); + + $writer = new Xlsx($spreadsheet); + ob_start(); + $writer->save('php://output'); + $content = ob_get_contents(); + ob_end_clean(); + + $fileName = 'result-' . now()->getPreciseTimestamp(3) . '-livechat-report.xlsx'; + Storage::disk('public')->put('temp/' . $fileName, $content); + + $fileUrl = url('storage/temp/' . $fileName); + + return Helper::responseJson([ + "file_url" => $fileUrl + ]); } } diff --git a/Modules/Internal/Routes/api.php b/Modules/Internal/Routes/api.php index 5c97e890..d55c5f42 100644 --- a/Modules/Internal/Routes/api.php +++ b/Modules/Internal/Routes/api.php @@ -152,6 +152,7 @@ Route::prefix('internal')->group(function () { Route::get('search-specialities', [SpecialityController::class, 'searchSpeciality']); Route::resource('organizations', OrganizationController::class); Route::resource('appointments', AppointmentController::class); + Route::get('live-chat/export', [LivechatController::class, 'export']); Route::resource('live-chat', LivechatController::class); Route::get('prescription', [PrescriptionController::class, 'index']); Route::get('prescription/{id}', [PrescriptionController::class, 'index']); @@ -161,8 +162,8 @@ Route::prefix('internal')->group(function () { Route::resource('doctors', DoctorController::class); Route::post('generate-log/{member_id}', [CorporateMemberController::class, 'generateLog']); - Route::controller(ClaimRequestController::class)->group(function(){ - Route::post('files-mcu','filesMcu'); + Route::controller(ClaimRequestController::class)->group(function () { + Route::post('files-mcu', 'filesMcu'); }); Route::get('claim-requests', [ClaimRequestController::class, 'index'])->name('claim-requests.index'); Route::post('claim-requests/{id}/approve', [ClaimRequestController::class, 'approve'])->name('claim-requests.approve'); diff --git a/app/Models/OLDLMS/Appointment.php b/app/Models/OLDLMS/Appointment.php index 32801ab7..7326025d 100644 --- a/app/Models/OLDLMS/Appointment.php +++ b/app/Models/OLDLMS/Appointment.php @@ -70,7 +70,7 @@ class Appointment extends Model 'dUpdateOn', 'dDeleteOn', ]; - + protected $appends = [ 'status_name', 'payment_method', @@ -86,7 +86,7 @@ class Appointment extends Model }, ); } - + protected function paymentStatus(): Attribute { @@ -109,7 +109,7 @@ class Appointment extends Model protected function type(): Attribute { return Attribute::make( - get: function($value) { + get: function ($value) { return $this->nIDJenisBookingNames[$this->nIDJenisBooking] ?? '-'; } ); @@ -118,16 +118,14 @@ class Appointment extends Model protected function shareKonsultasi(): Attribute { return Attribute::make( - get: function() { + get: function () { $consulPrice = ((float) $this->detail->sPaymentDetails['gross_amount'] ?? 0) - $this->nAdminFee; - if ( $this->nIDJenisBooking == 3 ) { // Telekonsultasi Sekarang - return $consulPrice * (100-$this->healthCare->commission->nCommissionATC) / 100; - } - else if ( $this->nIDJenisBooking == 2 ) { // Telekonsultasi - return $consulPrice * (100-$this->healthCare->commission->nCommissionTC) / 100; - } - else { // Walk In - return $consulPrice * (100-$this->healthCare->commission->nCommission) / 100; + if ($this->nIDJenisBooking == 3) { // Telekonsultasi Sekarang + return $consulPrice * (100 - $this->healthCare->commission->nCommissionATC) / 100; + } else if ($this->nIDJenisBooking == 2) { // Telekonsultasi + return $consulPrice * (100 - $this->healthCare->commission->nCommissionTC) / 100; + } else { // Walk In + return $consulPrice * (100 - $this->healthCare->commission->nCommission) / 100; } } ); @@ -136,16 +134,14 @@ class Appointment extends Model protected function shareKomisi(): Attribute { return Attribute::make( - get: function() { + get: function () { $consulPrice = ((float) $this->detail->sPaymentDetails['gross_amount'] ?? 0) - $this->nAdminFee; - if ( $this->nIDJenisBooking == 3 ) { // Telekonsultasi Sekarang - return $consulPrice * ($this->healthCare->commission->nCommissionATC) / 100; - } - else if ( $this->nIDJenisBooking == 2 ) { // Telekonsultasi + if ($this->nIDJenisBooking == 3) { // Telekonsultasi Sekarang + return $consulPrice * ($this->healthCare->commission->nCommissionATC) / 100; + } else if ($this->nIDJenisBooking == 2) { // Telekonsultasi return $consulPrice * ($this->healthCare->commission->nCommissionTC) / 100; - } - else { // Walk In - return $consulPrice * ($this->healthCare->commission->nCommission) / 100; + } else { // Walk In + return $consulPrice * ($this->healthCare->commission->nCommission) / 100; } } ); diff --git a/frontend/dashboard/src/pages/Report/Livechat/List.tsx b/frontend/dashboard/src/pages/Report/Livechat/List.tsx index 02f56133..f320f0a2 100644 --- a/frontend/dashboard/src/pages/Report/Livechat/List.tsx +++ b/frontend/dashboard/src/pages/Report/Livechat/List.tsx @@ -188,7 +188,13 @@ export default function List() { - @@ -397,6 +403,27 @@ export default function List() { setDataTableData(response.data); }; + const exportExcel = async () => { + var filter = Object.fromEntries([...searchParams.entries()]); + + await axios + .get('live-chat/export', { params: filter }) + .then((res) => { + enqueueSnackbar('Data berhasil di Export', { + variant: 'success', + anchorOrigin: { horizontal: 'right', vertical: 'top' }, + }); + + document.location.href = res.data.data.file_url; + }) + .catch((err) => + enqueueSnackbar('Data Gagal di Export', { + variant: 'error', + anchorOrigin: { horizontal: 'right', vertical: 'top' }, + }) + ); + }; + // const applyFilter = async (searchFilter: string) => { // await loadDataTableData({ search: searchFilter }); // setSearchParams({ search: searchFilter }); @@ -485,20 +512,20 @@ export default function List() { {/* - Tanggal Booking - - - Tanggal Appointment - - - Faskes - - - Nama Dokter - - - Spesialisasi - */} + Tanggal Booking + + + Tanggal Appointment + + + Faskes + + + Nama Dokter + + + Spesialisasi + */} Pasien From 05f26145f8dae67f38fa394a67cec83d15cc1542 Mon Sep 17 00:00:00 2001 From: Muhammad Fajar Date: Mon, 4 Sep 2023 11:15:41 +0700 Subject: [PATCH 2/2] update appointmentDetail null export --- Modules/Internal/Http/Controllers/Api/LivechatController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Internal/Http/Controllers/Api/LivechatController.php b/Modules/Internal/Http/Controllers/Api/LivechatController.php index a9f87680..2f71ede3 100644 --- a/Modules/Internal/Http/Controllers/Api/LivechatController.php +++ b/Modules/Internal/Http/Controllers/Api/LivechatController.php @@ -111,7 +111,7 @@ class LivechatController extends Controller $sheet->setCellValue('D' . $startFrom, preg_replace('/(\d{3})(\d{4})(\d{3})/', '$1 $2 $3', $liveChat->user->sPhone) ?? '-'); $sheet->setCellValue('E' . $startFrom, $liveChat->user->sEmail ?? '-'); $sheet->setCellValue('F' . $startFrom, $liveChat->healthCare->sHealthCare ?? '-'); - $sheet->setCellValue('G' . $startFrom, Carbon::parse($liveChat->appointment->appointmentDetail->dTanggalAppointment)->format('d-m-Y') . ' ' . $liveChat->appointment->appointmentDetail->tTimeAppointment ?? '-'); + $sheet->setCellValue('G' . $startFrom, isset($liveChat->appointment->appointmentDetail) ? Carbon::parse($liveChat->appointment->appointmentDetail->dTanggalAppointment)->format('d-m-Y') . ' ' . $liveChat->appointment->appointmentDetail->tTimeAppointment : '-'); $sheet->setCellValue('H' . $startFrom, $liveChat->sMedia ?? '-'); $sheet->setCellValue('I' . $startFrom, $liveChat->sMediaDokter ?? '-'); $sheet->setCellValue('J' . $startFrom, $liveChat->appointment->paymentStatus ?? '-');