diff --git a/Modules/Internal/Http/Controllers/Api/Linksehat/PaymentController.php b/Modules/Internal/Http/Controllers/Api/Linksehat/PaymentController.php index 28cb05a0..b49adb17 100644 --- a/Modules/Internal/Http/Controllers/Api/Linksehat/PaymentController.php +++ b/Modules/Internal/Http/Controllers/Api/Linksehat/PaymentController.php @@ -10,6 +10,12 @@ use Illuminate\Http\Request; use Illuminate\Routing\Controller; use Modules\Internal\Transformers\LinksehatPaymentResource; +use Carbon\Carbon; + +use Maatwebsite\Excel\Facades\Excel; +use Box\Spout\Reader\Common\Creator\ReaderEntityFactory; +use Box\Spout\Writer\Common\Creator\WriterEntityFactory; + class PaymentController extends Controller { /** @@ -133,4 +139,165 @@ class PaymentController extends Controller { // } + + public function generateExcel(Request $request){ + Helper::setCustomPHPIniSettings(); + + $file_name = 'Data Report Appointment'; + // Membuat penulis entitas Spout + $writer = WriterEntityFactory::createXLSXWriter(); + // Membuka penulis untuk menulis ke file + $writer->openToFile(public_path('files/Report-Appointment.xlsx')); + $headerArray = [ + 'Faskes Name', + 'Tanggal Bayar', + 'Tanggal Konsultasi', + 'Id Pemesanan', + 'Kode Pemesanan', + 'Dokter', + 'Pasien', + 'Email', + 'Tipe', + 'Metode Pembayaran', + 'Jenis Benefit', + 'Total Transfer', + 'Konsultasi', + 'Komisi', + 'Biaya Admin', + 'Status', + ]; + // Sheet 1 + $writer->getCurrentSheet()->setName('Data'); + $headers_map_to_table_fields = $headerArray; + $headerRow = WriterEntityFactory::createRowFromArray($headers_map_to_table_fields); + $writer->addRow($headerRow); + + $dataReportPayment = Appointment::query() + ->where('sPaymentStatus', 'settlement') + ->with(['healthCare', 'healthCare.commission', 'detail', 'user', 'doctor', 'doctor.user']); + + if (($request->has('appointment_start') || $request->has('appointment_end')) + && !empty($request->appointment_start) + && !empty($request->appointment_end) + ) { + $dataReportPayment = $dataReportPayment->where(function($q) use ($request) { + $q->where('dCreateOn', '>=', $request->appointment_start) + ->where('dCreateOn', '<=', $request->appointment_end); + }); + } + + $dataReportPayment = $dataReportPayment->get(); // Pastikan get() dipanggil setelah semua filter + + foreach ($dataReportPayment as $index => $row){ + $jenisTelekonsul = '-'; + switch ($row->nIDJenisBooking) { + case 1: + $jenisTelekonsul = 'Rawat Jalan'; + break; + case 2: + $jenisTelekonsul = 'Telekonsul'; + break; + case 3: + $jenisTelekonsul = 'Chat Sekarang'; + break; + } + + $jenisPayment = '-'; + switch ($row->sPaymentMethod) { + case 1: + $jenisPayment = 'Pribadi'; + break; + case 2: + $jenisPayment = 'On-site payment'; + break; + case 3: + $jenisPayment = 'OVO'; + break; + case 4: + $jenisPayment = 'Benefit Insurance'; + break; + case 5: + $jenisPayment = 'Voucher'; + break; + } + + $sStatus = '-'; + switch ($row->sStatus) { + case 0: + $sStatus = 'Menunggu Pembayaran'; + break; + case 1: + $sStatus = 'Pembayaran Terkonfirmasi'; + break; + case 2: + $sStatus = 'Ditolak'; + break; + case 3: + $sStatus = 'Dibatalkan'; + break; + case 4: + $sStatus = 'Expired'; + break; + } + + $paymentDetail = $row->detail->sPaymentDetails; + $grossAmount = 0; + if ($paymentDetail) { + $grossAmount = $paymentDetail['gross_amount'] ?? 0; + } + $consulPrice = (float) $grossAmount - $row->nAdminFee; + if ($row->nIDJenisBooking == 3) { // Telekonsultasi Sekarang + $consulPrice = $consulPrice * (100 - $row->healthCare->commission->nCommissionATC) / 100; + } else if ($row->nIDJenisBooking == 2) { // Telekonsultasi + $consulPrice = $consulPrice * (100 - $row->healthCare->commission->nCommissionTC) / 100; + } else { // Walk In + $consulPrice = $consulPrice * (100 - $row->healthCare->commission->nCommission) / 100; + } + + $komisiPrice = $consulPrice; + if ($row->nIDJenisBooking == 3) { // Telekonsultasi Sekarang + $komisiPrice = $komisiPrice * ($row->healthCare->commission->nCommissionATC) / 100; + } else if ($row->nIDJenisBooking == 2) { // Telekonsultasi + $komisiPrice = $komisiPrice * ($row->healthCare->commission->nCommissionTC) / 100; + } else { // Walk In + $komisiPrice = $komisiPrice * ($row->healthCare->commission->nCommission) / 100; + } + + // dd($row->healthCare->commission->nCommissionTC); + + if ($row->doctor->user){ + $firstNameDokter = $row->doctor->user->sFirstName . ' ' . $row->doctor->user->sLastName; + } else { + $firstNameDokter = $row->doctor->sIDDOkter ? $row->doctor->sIDDOkter : '-'; + } + + $rowData = [ + $row->healthCare->sHealthCare, // nama faskes + Carbon::parse($row->dCreateOn)->format('Y-m-d H:i:s'), // tanggal bayar + $row->detail->dTanggalAppointment, + $row->nID, + $row->sBookingCode, + $firstNameDokter, + $row->user->sFirstName. ' ' . $row->user->sLastName, + $row->user->sEmail, + $jenisTelekonsul, + $jenisPayment, + '-', // Jenis Benefit, as per original code + $grossAmount, + $consulPrice, + $komisiPrice, + $row->nAdminFee, // Biaya admin + $row->sPaymentStatus, // Status + ]; + + $row = WriterEntityFactory::createRowFromArray($rowData); + $writer->addRow($row); + } + + $writer->close(); + return Helper::responseJson([ + 'file_name' => "Data Request Log " . date('Y-m-d h:i:s'), + "file_url" => url('files/Report-Appointment.xlsx') + ]); + } } diff --git a/Modules/Internal/Routes/api.php b/Modules/Internal/Routes/api.php index c0a19526..a348d893 100644 --- a/Modules/Internal/Routes/api.php +++ b/Modules/Internal/Routes/api.php @@ -69,6 +69,7 @@ Route::prefix('internal')->group(function () { Route::post('verify-email', [AuthController::class, 'verifyEmail'])->name('verify-email'); Route::get('linksehat/payments', [PaymentController::class, 'index']); + Route::get('linksehat/payments/generate-excel', [PaymentController::class, 'generateExcel']); Route::middleware('auth:sanctum')->group(function () {