diff --git a/app/Http/Controllers/PesananController.php b/app/Http/Controllers/PesananController.php index 963a9be..47311bb 100644 --- a/app/Http/Controllers/PesananController.php +++ b/app/Http/Controllers/PesananController.php @@ -3,7 +3,9 @@ namespace App\Http\Controllers; use App\Models\Order; +use Carbon\Carbon; use Illuminate\Http\Request; +use Illuminate\Support\Facades\DB; class PesananController extends Controller { @@ -24,6 +26,36 @@ class PesananController extends Controller return $data; } + public function actionOrder(Request $request, string $order_id){ + DB::connection('dbOrderGizi')->beginTransaction(); + try { + $order = Order::where('order_id', $order_id)->first(); + $action = $request->query('action'); + $payload = [ + 'pegawai_id_confirm_order' => auth()->user()->id, + 'pegawai_name_confirm_order' => auth()->user()->full_name, + 'pegawai_at_confirm_order' => Carbon::now(), + 'status_order' => $action ?? 'Dibatalkan', + ]; + if(!$action){ + $payload['note_dibatalkan'] = request('note_dibatalkan'); + } + $order->update($payload); + DB::connection('dbOrderGizi')->commit(); + return response()->json([ + 'status' => true, + 'message' => $action ? 'Konfirmasi Order Gizi telah disetujui!' : 'Konfirmasi Order Gizi telah dibatalkan' + ]); + } catch (\Throwable $th) { + DB::connection('dbOrderGizi')->rollBack(); + return response()->json([ + 'status' => false, + 'message' => 'Gagal melakukan Konfirmasi Order Gizi' + ]); + //throw $th; + } + } + /** * Show the form for creating a new resource. */ diff --git a/app/Models/Order.php b/app/Models/Order.php index 3e2ae75..0cd63a0 100644 --- a/app/Models/Order.php +++ b/app/Models/Order.php @@ -33,6 +33,7 @@ class Order extends Model 'tinggi_badan', 'berat_badan', 'ruang_perawatan', - 'bagian_instalasi' + 'bagian_instalasi', + 'note_dibatalkan' ]; } diff --git a/config/queue.php b/config/queue.php index 116bd8d..f022e81 100644 --- a/config/queue.php +++ b/config/queue.php @@ -86,7 +86,7 @@ return [ */ 'batching' => [ - 'database' => env('DB_CONNECTION', 'sqlite'), + 'database' => env('DB_CONNECTION_ORDER_GIZI', 'sqlite'), 'table' => 'job_batches', ], @@ -105,7 +105,7 @@ return [ 'failed' => [ 'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'), - 'database' => env('DB_CONNECTION', 'sqlite'), + 'database' => env('DB_CONNECTION_ORDER_GIZI', 'sqlite'), 'table' => 'failed_jobs', ], diff --git a/public/assets/css/demo.css b/public/assets/css/demo.css index b47f2e8..90d2ef6 100644 --- a/public/assets/css/demo.css +++ b/public/assets/css/demo.css @@ -120,3 +120,10 @@ background-color: #584ce0; } +.swal2-container { + z-index: 9999 !important; +} + +.swal2-backdrop-show { + z-index: 9998 !important; +} diff --git a/public/js/pesanan_pending/_init.js b/public/js/pesanan_pending/_init.js index 33fbb83..54470ed 100644 --- a/public/js/pesanan_pending/_init.js +++ b/public/js/pesanan_pending/_init.js @@ -1 +1,6 @@ const datatablePending = $("#datatablePesananPending") + +const modalActionOrder = document.getElementById("modalActionOrder") +const formActionOrder = $("#formActionOrder") +const containerCancel = document.getElementById("note_dibatalkan") +const noteCancelTextArea = document.getElementById("textarea_note_dibatalkan") diff --git a/public/js/pesanan_pending/action.js b/public/js/pesanan_pending/action.js new file mode 100644 index 0000000..580dc78 --- /dev/null +++ b/public/js/pesanan_pending/action.js @@ -0,0 +1,85 @@ +function approveOrder(e) { + const data = $(e).data(); + const form = document.getElementById('formActionOrder'); + const img = document.getElementById('imageConfirmActionOrder'); + $("#confirmActionOrder").text('Konfirmasi Pembayaran '+ data.nama_pemesan + ' / ' + data.no_order) + containerCancel.classList.add('d-none'); + // Set gambar bukti bayar + if (data.bukti_bayar) { + img.src = `/storage/${data.bukti_bayar}`; + img.classList.remove('d-none'); + } else { + img.classList.add('d-none'); + img.src = ''; + $("#tidak_ada_bukti_pembayaran").text('Pembayaran Menggunakan Billing') + } + + // Set action form + form.setAttribute('action', `/dashboard/pending/action/${data.order_id}?action=Lunas`); + + // Tampilkan modal + new bootstrap.Modal(modalActionOrder).show(); +} + +document.getElementById('formActionOrder').addEventListener('submit', function (e) { + e.preventDefault(); + + const form = this; + const actionUrl = form.getAttribute('action'); + const formData = new FormData(form); + + fetch(actionUrl, { + method: 'POST', + headers: { + 'X-CSRF-TOKEN': document.querySelector('input[name="_token"]').value, + }, + body: formData + }).then(async (res) => { + const data = await res.json(); + + if (res.status) { + const handler = function () { + Swal.fire({ + icon: 'success', + title: 'Berhasil', + text: data.message || 'Status berhasil diubah!', + timer: 2000, + showConfirmButton: false, + backdrop: true, + }); + + datatablePending.bootstrapTable('refresh'); + modalActionOrder.removeEventListener('hidden.bs.modal', handler); // ✅ pakai DOM + }; + + modalActionOrder.addEventListener('hidden.bs.modal', handler); // ✅ pakai DOM + bootstrap.Modal.getInstance(modalActionOrder).hide(); // ✅ pakai instance + } else { + throw new Error(data.message || 'Terjadi kesalahan saat mengubah status.'); + } + }).catch(err => { + console.error(err); + Swal.fire({ + icon: 'error', + title: 'Gagal', + text: err.message || 'Terjadi kesalahan pada server.', + }); + }); +}); + + +function rejectOrder(e){ + document.getElementById('imageConfirmActionOrder').classList.add('d-none') + containerCancel.classList.remove('d-none'); + const data = $(e).data(); + new bootstrap.Modal(modalActionOrder).show(); + $("#confirmActionOrder").text('Batalkan Pembayaran '+ data.nama_pemesan + ' / ' + data.no_order) + formActionOrder.attr('action', `/dashboard/pending/action/${data.order_id}`); + $("#textarea_note_dibatalkan").val('') +} + + +noteCancelTextArea.addEventListener('input', function () { + this.style.height = 'auto'; // Reset height dulu + this.style.height = this.scrollHeight + 'px'; // Set height sesuai isi +}); diff --git a/public/js/pesanan_pending/dt.js b/public/js/pesanan_pending/dt.js index 3cf11a3..7fa4485 100644 --- a/public/js/pesanan_pending/dt.js +++ b/public/js/pesanan_pending/dt.js @@ -24,51 +24,49 @@ title: "Action", field:'order_id', formatter: function(value, row) { - const rowData = row; // jika butuh ID atau status dari baris - return ` -
- - - ${row?.status_order === "Lunas" ? '' : ` - + ` + + } + if(row?.status_order !== "Lunas"){ + buttons += ` + - - `} - + + ` + } + if(row?.status_order === "Lunas"){ + buttons += ` + + ` + } + + return ` +
+ ${buttons}
`; - }, - hozAlign: "center", - headerSort: false + } }, { title: "No.Order", - field:'no_order' + field:'no_order', + sortable: true, }, - { - title: "Pemesan", - field:'nama_pemesan', - }, - { - title: "Kategori Customer", - field: 'jenis_customer' - }, - { - title: "Total Harga Pesanan", - field:'total_harga', - formatter: function(value, row){ - return 'Rp ' + parseInt(row.total_harga).toLocaleString('id-ID') - } - }, - { + { title: "Status Pembayaran", field: 'status_order', + sortable: true, formatter: function(value, row) { const status = value; let badgeClass = 'bg-secondary'; @@ -78,12 +76,36 @@ badgeClass = 'bg-primary'; } else if (status === "Lunas" || status === "Sudah Bayar") { badgeClass = 'bg-success'; + } else if(status === "Dibatalkan"){ + badgeClass = 'bg-danger'; } - - return `${status}`; + return ` + ${status} + ${status === 'Dibatalkan' && row.note_dibatalkan ? ` +
+ ${row.note_dibatalkan} +
+ ` : ''} + `; + } + }, + { + title: "Pemesan", + field:'nama_pemesan', + sortable: true, + }, + { + title: "Kategori Customer", + field: 'jenis_customer', + sortable: true, + }, + { + title: "Total Harga Pesanan", + field:'total_harga', + formatter: function(value, row){ + return 'Rp ' + parseInt(row.total_harga).toLocaleString('id-ID') } } - ], }); diff --git a/resources/views/dashboard/layouts/main.blade.php b/resources/views/dashboard/layouts/main.blade.php index 0316bd2..19b6a2c 100644 --- a/resources/views/dashboard/layouts/main.blade.php +++ b/resources/views/dashboard/layouts/main.blade.php @@ -42,6 +42,8 @@ + + @@ -53,7 +55,7 @@ {{-- Bootstrap --}} {{-- Swal alert --}} - + {{-- Toast js --}} diff --git a/resources/views/dashboard/partials/sidenav.blade.php b/resources/views/dashboard/partials/sidenav.blade.php index 27002a6..a8cf2de 100644 --- a/resources/views/dashboard/partials/sidenav.blade.php +++ b/resources/views/dashboard/partials/sidenav.blade.php @@ -28,20 +28,20 @@ - - - -
+@include('dashboard.pesanan.pending.modal.action') + + @endsection diff --git a/resources/views/dashboard/pesanan/pending/modal/action.blade.php b/resources/views/dashboard/pesanan/pending/modal/action.blade.php new file mode 100644 index 0000000..a45668e --- /dev/null +++ b/resources/views/dashboard/pesanan/pending/modal/action.blade.php @@ -0,0 +1,36 @@ + + diff --git a/routes/web.php b/routes/web.php index ff2cd52..1d0ed03 100644 --- a/routes/web.php +++ b/routes/web.php @@ -18,12 +18,12 @@ Route::post('/login', [AuthController::class, 'authanticate']); Route::resource('/dashboard/menu', MenuController::class); Route::group(['middleware' => ['auth']], function(){ - Route::get('/dashboard', [DashboardController::class, 'index']); Route::group(['prefix' => 'dashboard'], function(){ Route::get('/', [DashboardController::class, 'index']); Route::resource('/klasifikasi-menu', KlasifikasiMenuController::class); Route::get('/pending', [PesananController::class, 'index']); Route::get('datatable/pending', [PesananController::class, 'getDataPending']); + Route::put('/pending/action/{order_id}', [PesananController::class, 'actionOrder']); }); Route::post('/logout', [AuthController::class, 'logout']); });