diff --git a/app/Http/Controllers/CustomerController.php b/app/Http/Controllers/CustomerController.php index fe5487c..d99d18e 100644 --- a/app/Http/Controllers/CustomerController.php +++ b/app/Http/Controllers/CustomerController.php @@ -300,6 +300,7 @@ class CustomerController extends Controller $payloadOrderDetail['karbohidrat_id'] = $value['karbohidrat_id'] ?? null; $payloadOrderDetail['catatan'] = $value['catatan'] ?? null; $payloadOrderDetail['master_menu_id'] = $cart['id_menu']; + $payloadOrderDetail['total_kalori'] = $value['resultKalori'] ?? ($cart['kalori'] ?? null); OrderDetail::create($payloadOrderDetail); } } @@ -407,6 +408,7 @@ class CustomerController extends Controller ->table('public.order as o') ->leftJoin('public.order_detail as od', 'od.order_id', '=', 'o.order_id') ->leftJoin('public.master_menu as mm', 'mm.master_menu_id', '=', 'od.master_menu_id') + ->leftJoin('public.menu_mcu as mcu', 'mcu.menu_mcu_id', '=', 'od.menu_mcu_id') ->where('o.no_order', 'ILIKE', '%' . $noOrder . '%') ->select( 'o.*', @@ -416,7 +418,8 @@ class CustomerController extends Controller 'od.harga_satuan', 'od.status_order as status_order_detail', 'od.catatan', - 'mm.nama_menu as nama_item', + 'od.total_kalori', + DB::raw('COALESCE(mm.nama_menu, mcu.nama_mcu) as nama_item'), 'mm.foto as foto' ) ->get(); @@ -460,7 +463,8 @@ class CustomerController extends Controller 'jumlah' => $item->jumlah, 'harga_satuan' => $item->harga_satuan, 'status_order' => $item->status_order_detail, - 'catatan' => $item->catatan ?? '-' + 'catatan' => $item->catatan ?? '-', + 'total_kalori' => $item->total_kalori // tambahkan field tambahan jika diperlukan ]; })->values(), @@ -487,6 +491,7 @@ class CustomerController extends Controller DB::connection('dbOrderGizi')->beginTransaction(); $today = now()->toDateString(); $jumlahHariIni = Order::whereDate('entry_at', $today)->count(); + $priceMcu = MasterMcu::where('menu_mcu_id', request('paket_mcu'))->first(); $urutan = $jumlahHariIni + 1; $noOrder = 'TX/CT/GIZI/' . now()->year .'/'. now()->month .'/' . now()->day .'/MCU/' . Str::random(6) .'/' . str_pad($urutan, 4, '0', STR_PAD_LEFT); $payload = [ @@ -499,17 +504,20 @@ class CustomerController extends Controller 'no_wa' => request('no_hp') ?? null, 'tinggi_badan' => request('tinggi_badan') ?? null, 'berat_badan' => request('berat_badan') ?? null, - 'status_order' =>'Menunggu Konfirmasi Pesanan MCU' + 'status_order' =>'Menunggu Konfirmasi Pesanan MCU', + 'total_harga' => $priceMcu ? $priceMcu->harga : null, + 'cara_pembayaran' =>'MCU', ]; $order = Order::create($payload); + $payloadDetail = [ 'order_id' => $order->order_id, 'jumlah' => 1, 'tgl_antar' => request('tgl_mcu'), 'menu_mcu_id' => request('paket_mcu'), 'jam_layanan' => request('jam_layanan'), - 'cara_pembayaran' => 'MCU', - 'status_order' =>'Menunggu Konfirmasi' + 'status_order' =>'Pending', + 'harga_satuan' => $priceMcu ? $priceMcu->harga : null, ]; OrderDetail::create($payloadDetail); diff --git a/app/Http/Controllers/PesananController.php b/app/Http/Controllers/PesananController.php index 5313e07..8a80cec 100644 --- a/app/Http/Controllers/PesananController.php +++ b/app/Http/Controllers/PesananController.php @@ -136,7 +136,6 @@ class PesananController extends Controller 'pegawai_name_confirm_order' => auth()->user()->full_name, 'pegawai_at_confirm_order' => Carbon::now(), 'status_order' => 'Lunas', - 'cara_pembayaran' => 'Billing' ]; if($request->hasFile('evidence_medical_record')){ $file = $request->file('evidence_medical_record'); @@ -264,7 +263,7 @@ class PesananController extends Controller } public function getPekerjaan(){ - $data = OrderDetail::with(['menu', 'paketMenu', 'order', 'karbohidrat'])->whereHas('order', function($q){ + $data = OrderDetail::with(['menu', 'masterMcu', 'order', 'karbohidrat'])->whereHas('order', function($q){ $q->where('status_order', 'Lunas'); }); $tanggal = request('tanggal'); @@ -288,7 +287,7 @@ class PesananController extends Controller } public function getPekerjaanDetail($order_detail_id){ - $data = OrderDetail::where('order_detail_id', $order_detail_id)->with(['order', 'menu', 'paketMenu'])->first(); + $data = OrderDetail::where('order_detail_id', $order_detail_id)->with(['order', 'menu', 'masterMcu'])->first(); return response()->json([ 'status' => true, 'data' => $data @@ -301,7 +300,7 @@ class PesananController extends Controller $type_customer = request('type_customer'); $type = request('type'); - $orderDetail = OrderDetail::with(['menu', 'paketMenu', 'order', 'karbohidrat'])->whereHas('order', function($q) use($type_customer){ + $orderDetail = OrderDetail::with(['menu', 'masterMcu', 'order', 'karbohidrat'])->whereHas('order', function($q) use($type_customer){ $q->where('status_order', 'Lunas'); if($type_customer !== 'all'){ $q->where('jenis_customer', $type_customer); @@ -338,18 +337,18 @@ class PesananController extends Controller $sheet = $spreadsheet->getActiveSheet(); $sheet->setCellValue('A1', "Menu Pesanan dari {$startDateFormatted} sampai {$endDateFormatted}"); - $sheet->mergeCells('A1:K1'); + $sheet->mergeCells('A1:L1'); $sheet->getStyle('A1')->getFont()->setBold(true)->setSize(14); $sheet->getStyle('A1')->getAlignment()->setHorizontal('center'); $sheet->setCellValue('A2', "Waktu Cetak: {$waktu_cetak}"); - $sheet->mergeCells('A2:K2'); + $sheet->mergeCells('A2:L2'); $sheet->getStyle('A2')->getAlignment()->setHorizontal('center'); // Header tabel - $headers = ["No", "Nomor Order", "Nama Pemesan", "Jenis Customer", "Status Pesanan", "Menu Pesanan", "Karbohidrat", "Jumlah", "Tanggal Antar", "Waktu Makan", "Catatan"]; + $headers = ["No", "Nomor Order", "Nama Pemesan", "Jenis Customer", "Status Pesanan", "Menu Pesanan", "Karbohidrat", "Total Kalori (kal)", "Jumlah", "Tanggal Antar", "Waktu Makan / Jam Layanan", "Catatan"]; $sheet->fromArray($headers, null, 'A4'); - $sheet->getStyle('A4:K4')->applyFromArray([ + $sheet->getStyle('A4:L4')->applyFromArray([ 'font' => ['bold' => true], 'alignment' => ['horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER], 'borders' => [ @@ -358,9 +357,9 @@ class PesananController extends Controller ] ] ]); - $sheet->getStyle('A4:K4')->getFont()->setBold(true); - $sheet->getStyle('A4:K4')->getAlignment()->setHorizontal('center'); - $sheet->getStyle('A4:K4')->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN); + $sheet->getStyle('A4:L4')->getFont()->setBold(true); + $sheet->getStyle('A4:L4')->getAlignment()->setHorizontal('center'); + $sheet->getStyle('A4:L4')->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN); // Isi data $row = 5; foreach ($orderDetail as $index => $item) { @@ -369,25 +368,26 @@ class PesananController extends Controller $sheet->setCellValue("C{$row}", $item?->order?->nama_pemesan); $sheet->setCellValue("D{$row}", $item?->order?->jenis_customer); $sheet->setCellValue("E{$row}", $item?->status_order ?? "-"); - $sheet->setCellValue("F{$row}", $item?->menu?->nama_menu ?? '-'); + $sheet->setCellValue("F{$row}", $item?->menu?->nama_menu ?? $item?->masterMcu?->nama_mcu); $karbohidratNama = $item?->karbohidrat?->nama_karbohidrat ?? '-'; $karbohidratNilai = $item?->karbohidrat?->nilai_kalori ?? '-'; $sheet->setCellValue("G{$row}", $karbohidratNama . ($karbohidratNilai !== '-' ? " ({$karbohidratNilai} kal)" : '')); - $sheet->setCellValue("H{$row}", $item?->jumlah ?? '-'); - $sheet->setCellValue("I{$row}", $item?->tgl_antar ? Carbon::parse($item->tgl_antar)->translatedFormat('d F Y') : "Tanggal Antar"); - $sheet->setCellValue("J{$row}", $item?->type ?? "-"); - $sheet->setCellValue("K{$row}", $item?->catatan ?? "-"); + $sheet->setCellValue("H{$row}", $item?->total_kalori ?? '-'); + $sheet->setCellValue("I{$row}", $item?->jumlah ?? '-'); + $sheet->setCellValue("J{$row}", $item?->tgl_antar ? Carbon::parse($item->tgl_antar)->translatedFormat('d F Y') : "Tanggal Antar"); + $sheet->setCellValue("K{$row}", $item?->type ?? $item->jam_layanan); + $sheet->setCellValue("L{$row}", $item?->catatan ?? "-"); // Border tiap baris - $sheet->getStyle("A{$row}:K{$row}")->getBorders()->getAllBorders() + $sheet->getStyle("A{$row}:L{$row}")->getBorders()->getAllBorders() ->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN); $row++; } // Auto size kolom - foreach(range('A', 'K') as $col){ + foreach(range('A', 'L') as $col){ $sheet->getColumnDimension($col)->setAutoSize(true); } $lastRow = $row - 1; - $sheet->setAutoFilter("A4:K{$lastRow}"); + $sheet->setAutoFilter("A4:L{$lastRow}"); // Download file $fileName = 'menu-pesanan' . now()->format('Ymd-His') . '.xlsx'; $writer = new Xlsx($spreadsheet); @@ -409,7 +409,7 @@ class PesananController extends Controller $type_customer = request('type_customer'); $query = Order::where('statusenabled', true) ->whereBetween('entry_at', [$startDate, $endDate]) - ->whereIn('status_order', ['Menunggu Konfirmasi Pembayaran', 'Menunggu Konfirmasi Pembayaran Via Billing']); + ->whereIn('status_order', ['Menunggu Konfirmasi Pembayaran', 'Menunggu Konfirmasi Pembayaran Via Billing', 'Menunggu Konfirmasi Pesanan MCU']); if($type_customer !== 'all'){ $query->where('jenis_customer', $type_customer); } @@ -449,18 +449,18 @@ class PesananController extends Controller $sheet = $spreadsheet->getActiveSheet(); $sheet->setCellValue('A1', "Laporan Pesanan dari {$startDateFormatted} sampai {$endDateFormatted}"); - $sheet->mergeCells('A1:P1'); + $sheet->mergeCells('A1:R1'); $sheet->getStyle('A1')->getFont()->setBold(true)->setSize(14); $sheet->getStyle('A1')->getAlignment()->setHorizontal('center'); $sheet->setCellValue('A2', "Waktu Cetak: {$waktu_cetak}"); - $sheet->mergeCells('A2:P2'); + $sheet->mergeCells('A2:R2'); $sheet->getStyle('A2')->getAlignment()->setHorizontal('center'); // Header tabel - $headers = ["No", "Nomor Order", "Nama Pemesan", "Jenis Customer", "Status Pembayaran", "Jenis Kelamin", "NO.HP/WA", "Email" , "Cara Pembayaran", "Tanggal Pesan", "Harga Total", "Menu Pesanan", "Jumlah", "Status Pesanan", "Tanggal Antar", "Waktu Makan", "Catatan"]; + $headers = ["No", "Nomor Order", "Nama Pemesan", "Jenis Customer", "Status Pembayaran", "Jenis Kelamin", "NO.HP/WA", "Email" , "Cara Pembayaran", "Tanggal Pesan", "Harga Total", "Menu Pesanan", "Total Kalori", "Jumlah", "Status Pesanan", "Tanggal Antar", "Waktu Makan / Jam Layanan", "Catatan"]; $sheet->fromArray($headers, null, 'A4'); - $sheet->getStyle('A4:Q4')->applyFromArray([ + $sheet->getStyle('A4:R4')->applyFromArray([ 'font' => ['bold' => true], 'alignment' => ['horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER], 'borders' => [ @@ -469,9 +469,9 @@ class PesananController extends Controller ] ] ]); - $sheet->getStyle('A4:Q4')->getFont()->setBold(true); - $sheet->getStyle('A4:Q4')->getAlignment()->setHorizontal('center'); - $sheet->getStyle('A4:Q4')->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN); + $sheet->getStyle('A4:R4')->getFont()->setBold(true); + $sheet->getStyle('A4:R4')->getAlignment()->setHorizontal('center'); + $sheet->getStyle('A4:R4')->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN); // Isi data $row = 5; @@ -489,14 +489,15 @@ class PesananController extends Controller $sheet->setCellValue("J{$row}", Carbon::parse($item->entry_at)->translatedFormat('d F Y H:i')); $sheet->setCellValue("K{$row}", $item->total_harga); - $sheet->setCellValue("L{$row}", $detail?->menu?->nama_menu ?? '-'); - $sheet->setCellValue("M{$row}", $detail?->jumlah ?? '-'); - $sheet->setCellValue("N{$row}", $detail?->status_order ?? "-"); - $sheet->setCellValue("O{$row}", $detail?->tgl_antar ? Carbon::parse($item->tgl_antar)->translatedFormat('d F Y') : "Tanggal Antar"); - $sheet->setCellValue("P{$row}", $detail?->type ?? "-"); - $sheet->setCellValue("Q{$row}", $detail?->catatan ?? "-"); + $sheet->setCellValue("L{$row}", $detail?->menu?->nama_menu ?? $detail?->masterMcu?->nama_mcu); + $sheet->setCellValue("M{$row}", $detail?->total_kalori ?? '-'); + $sheet->setCellValue("N{$row}", $detail?->jumlah ?? '-'); + $sheet->setCellValue("O{$row}", $detail?->status_order ?? "-"); + $sheet->setCellValue("P{$row}", $detail?->tgl_antar ? Carbon::parse($item->tgl_antar)->translatedFormat('d F Y') : "Tanggal Antar"); + $sheet->setCellValue("Q{$row}", $detail?->type ?? $detail->jam_layanan); + $sheet->setCellValue("R{$row}", $detail?->catatan ?? "-"); // Border tiap baris - $sheet->getStyle("A{$row}:Q{$row}")->getBorders()->getAllBorders() + $sheet->getStyle("A{$row}:R{$row}")->getBorders()->getAllBorders() ->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN); $row++; @@ -504,11 +505,11 @@ class PesananController extends Controller } // Auto size kolom - foreach(range('A', 'Q') as $col){ + foreach(range('A', 'R') as $col){ $sheet->getColumnDimension($col)->setAutoSize(true); } $lastRow = $row - 1; - $sheet->setAutoFilter("A4:Q{$lastRow}"); + $sheet->setAutoFilter("A4:R{$lastRow}"); // Download file $fileName = $title . now()->format('Ymd-His') . '.xlsx'; $writer = new Xlsx($spreadsheet); @@ -682,18 +683,18 @@ class PesananController extends Controller $sheet = $spreadsheet->getActiveSheet(); $sheet->setCellValue('A1', "Laporan Pesanan dari {$startDateFormatted} sampai {$endDateFormatted}"); - $sheet->mergeCells('A1:P1'); + $sheet->mergeCells('A1:Q1'); $sheet->getStyle('A1')->getFont()->setBold(true)->setSize(14); $sheet->getStyle('A1')->getAlignment()->setHorizontal('center'); $sheet->setCellValue('A2', "Waktu Cetak: {$waktu_cetak}"); - $sheet->mergeCells('A2:P2'); + $sheet->mergeCells('A2:Q2'); $sheet->getStyle('A2')->getAlignment()->setHorizontal('center'); // Header tabel - $headers = ["No", "Nomor Order", "Nama Pemesan", "Jenis Customer", "Jenis Kelamin", "NO.HP/WA", "Email" , "Cara Pembayaran", "Tanggal Pesan", "Harga Total", "Menu Pesanan", "Jumlah", "Status Pesanan", "Tanggal Antar", "Waktu Makan", "Catatan"]; + $headers = ["No", "Nomor Order", "Nama Pemesan", "Jenis Customer", "Jenis Kelamin", "NO.HP/WA", "Email" , "Cara Pembayaran", "Tanggal Pesan", "Harga Total", "Menu Pesanan", "Total Kalori (kal)", "Jumlah", "Status Pesanan", "Tanggal Antar", "Waktu Makan / Jam Layanan", "Catatan"]; $sheet->fromArray($headers, null, 'A4'); - $sheet->getStyle('A4:P4')->applyFromArray([ + $sheet->getStyle('A4:Q4')->applyFromArray([ 'font' => ['bold' => true], 'alignment' => ['horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER], 'borders' => [ @@ -702,9 +703,9 @@ class PesananController extends Controller ] ] ]); - $sheet->getStyle('A4:P4')->getFont()->setBold(true); - $sheet->getStyle('A4:P4')->getAlignment()->setHorizontal('center'); - $sheet->getStyle('A4:P4')->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN); + $sheet->getStyle('A4:Q4')->getFont()->setBold(true); + $sheet->getStyle('A4:Q4')->getAlignment()->setHorizontal('center'); + $sheet->getStyle('A4:Q4')->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN); // Isi data $row = 5; @@ -721,14 +722,15 @@ class PesananController extends Controller $sheet->setCellValue("I{$row}", Carbon::parse($item->entry_at)->translatedFormat('d F Y H:i')); $sheet->setCellValue("J{$row}", $item->total_harga); - $sheet->setCellValue("K{$row}", $detail?->menu?->nama_menu ?? '-'); - $sheet->setCellValue("L{$row}", $detail?->jumlah ?? '-'); - $sheet->setCellValue("M{$row}", $detail?->status_order ?? "-"); - $sheet->setCellValue("N{$row}", $detail?->tgl_antar ? Carbon::parse($item->tgl_antar)->translatedFormat('d F Y') : "Tanggal Antar"); - $sheet->setCellValue("O{$row}", $detail?->type ?? "-"); - $sheet->setCellValue("P{$row}", $detail?->catatan ?? "-"); + $sheet->setCellValue("K{$row}", $detail?->menu?->nama_menu ?? $detail?->masterMcu?->nama_mcu); + $sheet->setCellValue("L{$row}", $detail?->total_kalori ?? '-'); + $sheet->setCellValue("M{$row}", $detail?->jumlah ?? '-'); + $sheet->setCellValue("N{$row}", $detail?->status_order ?? "-"); + $sheet->setCellValue("O{$row}", $detail?->tgl_antar ? Carbon::parse($item->tgl_antar)->translatedFormat('d F Y') : "-"); + $sheet->setCellValue("P{$row}", $detail?->type ?? $detail->jam_layanan); + $sheet->setCellValue("Q{$row}", $detail?->catatan ?? "-"); // Border tiap baris - $sheet->getStyle("A{$row}:P{$row}")->getBorders()->getAllBorders() + $sheet->getStyle("A{$row}:Q{$row}")->getBorders()->getAllBorders() ->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN); $row++; @@ -736,11 +738,11 @@ class PesananController extends Controller } // Auto size kolom - foreach(range('A', 'P') as $col){ + foreach(range('A', 'Q') as $col){ $sheet->getColumnDimension($col)->setAutoSize(true); } $lastRow = $row - 1; - $sheet->setAutoFilter("A4:P{$lastRow}"); + $sheet->setAutoFilter("A4:Q{$lastRow}"); // Download file $fileName = 'laporan-pesanan-' . now()->format('Ymd-His') . '.xlsx'; $writer = new Xlsx($spreadsheet); @@ -958,6 +960,15 @@ class PesananController extends Controller 'total' => $grouped->count() ]); } + + public function downloadLabel(){ + $data = request('data'); + $dataArray = explode(',', $data); + $orderDetail = OrderDetail::whereIn('order_detail_id', $dataArray)->with(['masterMcu', 'menu', 'order'])->get(); + $pdf = Pdf::loadView('dashboard.label.multi', compact('orderDetail')); + + return $pdf->stream('label_.pdf'); + } /** * Show the form for creating a new resource. */ diff --git a/app/Models/Order.php b/app/Models/Order.php index e9ab8fe..a570412 100644 --- a/app/Models/Order.php +++ b/app/Models/Order.php @@ -38,7 +38,7 @@ class Order extends Model 'email', 'alamat', 'medical_record', - 'evidence_medical_record' + 'evidence_medical_record', ]; protected $cast = [ @@ -47,6 +47,6 @@ class Order extends Model ]; public function orderDetail(){ - return $this->hasMany(OrderDetail::class, 'order_id')->with('paketMenu', 'menu'); + return $this->hasMany(OrderDetail::class, 'order_id')->with('masterMcu', 'menu'); } } diff --git a/app/Models/OrderDetail.php b/app/Models/OrderDetail.php index 6560000..3fab338 100644 --- a/app/Models/OrderDetail.php +++ b/app/Models/OrderDetail.php @@ -15,7 +15,7 @@ class OrderDetail extends Model 'modified_at', 'statusenabled', 'master_menu_id', - 'paket_mcu_id', + 'menu_mcu_id', 'harga_satuan', 'jumlah', 'tgl_antar', @@ -24,7 +24,8 @@ class OrderDetail extends Model 'status_order', 'karbohidrat_id', 'catatan', - 'jam_layanan' + 'jam_layanan', + 'total_kalori' ]; @@ -38,4 +39,7 @@ class OrderDetail extends Model public function order(){ return $this->belongsTo(Order::class, 'order_id', 'order_id'); } + public function masterMcu(){ + return $this->belongsTo(MasterMcu::class, 'menu_mcu_id', 'menu_mcu_id'); + } } diff --git a/composer.json b/composer.json index ceae8c3..4375997 100644 --- a/composer.json +++ b/composer.json @@ -8,6 +8,7 @@ "require": { "php": "^8.2", "barryvdh/laravel-dompdf": "^3.1", + "barryvdh/laravel-snappy": "^1.0", "laravel/framework": "^12.0", "laravel/tinker": "^2.10.1", "phpoffice/phpspreadsheet": "^4.5" diff --git a/composer.lock b/composer.lock index 4bf5e89..e0b5412 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "696ae0d1187bc1634529f1760a11ffd0", + "content-hash": "9d83b6a45b530b893999cf984c08fde5", "packages": [ { "name": "barryvdh/laravel-dompdf", @@ -83,6 +83,84 @@ ], "time": "2025-02-13T15:07:54+00:00" }, + { + "name": "barryvdh/laravel-snappy", + "version": "v1.0.4", + "source": { + "type": "git", + "url": "https://github.com/barryvdh/laravel-snappy.git", + "reference": "5b8668e4a54be630973fd309b4cb1abe75a8afbb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/barryvdh/laravel-snappy/zipball/5b8668e4a54be630973fd309b4cb1abe75a8afbb", + "reference": "5b8668e4a54be630973fd309b4cb1abe75a8afbb", + "shasum": "" + }, + "require": { + "illuminate/filesystem": "^9|^10|^11|^12", + "illuminate/support": "^9|^10|^11|^12", + "knplabs/knp-snappy": "^1.4.4", + "php": "^8.1" + }, + "require-dev": { + "orchestra/testbench": "^7|^8|^9|^10" + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "PDF": "Barryvdh\\Snappy\\Facades\\SnappyPdf", + "SnappyImage": "Barryvdh\\Snappy\\Facades\\SnappyImage" + }, + "providers": [ + "Barryvdh\\Snappy\\ServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "Barryvdh\\Snappy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Barry vd. Heuvel", + "email": "barryvdh@gmail.com" + } + ], + "description": "Snappy PDF/Image for Laravel", + "keywords": [ + "image", + "laravel", + "pdf", + "snappy", + "wkhtmltoimage", + "wkhtmltopdf" + ], + "support": { + "issues": "https://github.com/barryvdh/laravel-snappy/issues", + "source": "https://github.com/barryvdh/laravel-snappy/tree/v1.0.4" + }, + "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2025-02-24T15:20:06+00:00" + }, { "name": "brick/math", "version": "0.13.1", @@ -1365,6 +1443,73 @@ ], "time": "2025-02-03T10:55:03+00:00" }, + { + "name": "knplabs/knp-snappy", + "version": "v1.5.1", + "source": { + "type": "git", + "url": "https://github.com/KnpLabs/snappy.git", + "reference": "3dd138e9e47de91cd2e056c5e6e1a0dd72547ee7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/KnpLabs/snappy/zipball/3dd138e9e47de91cd2e056c5e6e1a0dd72547ee7", + "reference": "3dd138e9e47de91cd2e056c5e6e1a0dd72547ee7", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^2.0||^3.0", + "symfony/process": "^5.0||^6.0||^7.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.0", + "pedrotroller/php-cs-custom-fixer": "^2.19", + "phpstan/phpstan": "^1.0.0", + "phpstan/phpstan-phpunit": "^1.0.0", + "phpunit/phpunit": "^8.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Knp\\Snappy\\": "src/Knp/Snappy" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "KNP Labs Team", + "homepage": "http://knplabs.com" + }, + { + "name": "Symfony Community", + "homepage": "http://github.com/KnpLabs/snappy/contributors" + } + ], + "description": "PHP library allowing thumbnail, snapshot or PDF generation from a url or a html page. Wrapper for wkhtmltopdf/wkhtmltoimage.", + "homepage": "http://github.com/KnpLabs/snappy", + "keywords": [ + "knp", + "knplabs", + "pdf", + "snapshot", + "thumbnail", + "wkhtmltopdf" + ], + "support": { + "issues": "https://github.com/KnpLabs/snappy/issues", + "source": "https://github.com/KnpLabs/snappy/tree/v1.5.1" + }, + "time": "2025-01-06T16:53:26+00:00" + }, { "name": "laravel/framework", "version": "v12.20.0", diff --git a/config/snappy.php b/config/snappy.php new file mode 100644 index 0000000..cc28fbc --- /dev/null +++ b/config/snappy.php @@ -0,0 +1,52 @@ + [ + 'enabled' => true, + 'binary' => env('WKHTML_PDF_BINARY', '/usr/local/bin/wkhtmltopdf'), + 'timeout' => false, + 'options' => [], + 'env' => [], + ], + + 'image' => [ + 'enabled' => true, + 'binary' => env('WKHTML_IMG_BINARY', '/usr/local/bin/wkhtmltoimage'), + 'timeout' => false, + 'options' => [], + 'env' => [], + ], + +]; diff --git a/public/gambar/1VhHxJmuroGL7z6.jpg b/public/gambar/1VhHxJmuroGL7z6.jpg new file mode 100644 index 0000000..8d6d04c Binary files /dev/null and b/public/gambar/1VhHxJmuroGL7z6.jpg differ diff --git a/public/gambar/3Y3Ez9eazDjltwU.jpg b/public/gambar/3Y3Ez9eazDjltwU.jpg new file mode 100644 index 0000000..f2484da Binary files /dev/null and b/public/gambar/3Y3Ez9eazDjltwU.jpg differ diff --git a/public/gambar/608,577,598,602,606.pdf b/public/gambar/608,577,598,602,606.pdf new file mode 100644 index 0000000..c0481fa Binary files /dev/null and b/public/gambar/608,577,598,602,606.pdf differ diff --git a/public/gambar/6cphK0gBVbdDpy7.jpg b/public/gambar/6cphK0gBVbdDpy7.jpg new file mode 100644 index 0000000..f7d8215 Binary files /dev/null and b/public/gambar/6cphK0gBVbdDpy7.jpg differ diff --git a/public/gambar/BDyQv2C3ZJstYk5.jpg b/public/gambar/BDyQv2C3ZJstYk5.jpg new file mode 100644 index 0000000..98d1c32 Binary files /dev/null and b/public/gambar/BDyQv2C3ZJstYk5.jpg differ diff --git a/public/gambar/BcQLFyCRKbD7fGm.jpg b/public/gambar/BcQLFyCRKbD7fGm.jpg new file mode 100644 index 0000000..65c49f2 Binary files /dev/null and b/public/gambar/BcQLFyCRKbD7fGm.jpg differ diff --git a/public/gambar/BhVLQcmU0pVMzQ5.jpg b/public/gambar/BhVLQcmU0pVMzQ5.jpg new file mode 100644 index 0000000..524daf2 Binary files /dev/null and b/public/gambar/BhVLQcmU0pVMzQ5.jpg differ diff --git a/public/gambar/DA1gXOOK4cMnL65.jpg b/public/gambar/DA1gXOOK4cMnL65.jpg new file mode 100644 index 0000000..ce2830e Binary files /dev/null and b/public/gambar/DA1gXOOK4cMnL65.jpg differ diff --git a/public/gambar/DX8Ev2haNMqhqgq.jpg b/public/gambar/DX8Ev2haNMqhqgq.jpg new file mode 100644 index 0000000..37dc734 Binary files /dev/null and b/public/gambar/DX8Ev2haNMqhqgq.jpg differ diff --git a/public/gambar/EcyHylUTMAVohMF.jpg b/public/gambar/EcyHylUTMAVohMF.jpg new file mode 100644 index 0000000..8d6d04c Binary files /dev/null and b/public/gambar/EcyHylUTMAVohMF.jpg differ diff --git a/public/gambar/MIBkGAo6Wsv5U8J.jpg b/public/gambar/MIBkGAo6Wsv5U8J.jpg new file mode 100644 index 0000000..a664e84 Binary files /dev/null and b/public/gambar/MIBkGAo6Wsv5U8J.jpg differ diff --git a/public/gambar/NWj9s7XJsEznf32.jpg b/public/gambar/NWj9s7XJsEznf32.jpg new file mode 100644 index 0000000..4acf3d8 Binary files /dev/null and b/public/gambar/NWj9s7XJsEznf32.jpg differ diff --git a/public/gambar/Nmq2csw3jlvDbFn.jpg b/public/gambar/Nmq2csw3jlvDbFn.jpg new file mode 100644 index 0000000..ff5288c Binary files /dev/null and b/public/gambar/Nmq2csw3jlvDbFn.jpg differ diff --git a/public/gambar/OfSOkI4v8QOFLDQ.jpg b/public/gambar/OfSOkI4v8QOFLDQ.jpg new file mode 100644 index 0000000..1fe92ed Binary files /dev/null and b/public/gambar/OfSOkI4v8QOFLDQ.jpg differ diff --git a/public/gambar/Ukd0oblLPOj2gGk.jpg b/public/gambar/Ukd0oblLPOj2gGk.jpg new file mode 100644 index 0000000..bb812ac Binary files /dev/null and b/public/gambar/Ukd0oblLPOj2gGk.jpg differ diff --git a/public/gambar/V47AjynduyGYBKJ.jpg b/public/gambar/V47AjynduyGYBKJ.jpg new file mode 100644 index 0000000..a1877fb Binary files /dev/null and b/public/gambar/V47AjynduyGYBKJ.jpg differ diff --git a/public/gambar/ZyRXajWB3BFyCIJ.jpg b/public/gambar/ZyRXajWB3BFyCIJ.jpg new file mode 100644 index 0000000..d7fdf6b Binary files /dev/null and b/public/gambar/ZyRXajWB3BFyCIJ.jpg differ diff --git a/public/gambar/c8RrP9pmbFQ5wPd.jpg b/public/gambar/c8RrP9pmbFQ5wPd.jpg new file mode 100644 index 0000000..ab98a02 Binary files /dev/null and b/public/gambar/c8RrP9pmbFQ5wPd.jpg differ diff --git a/public/gambar/cG1OGeEi5XzhUOK.jpg b/public/gambar/cG1OGeEi5XzhUOK.jpg new file mode 100644 index 0000000..7d8f1d1 Binary files /dev/null and b/public/gambar/cG1OGeEi5XzhUOK.jpg differ diff --git a/public/gambar/clLvziFQZnHVnMq.jpg b/public/gambar/clLvziFQZnHVnMq.jpg new file mode 100644 index 0000000..891abf5 Binary files /dev/null and b/public/gambar/clLvziFQZnHVnMq.jpg differ diff --git a/public/gambar/d8ASQ3mkBbAkjPR.jpg b/public/gambar/d8ASQ3mkBbAkjPR.jpg new file mode 100644 index 0000000..65c49f2 Binary files /dev/null and b/public/gambar/d8ASQ3mkBbAkjPR.jpg differ diff --git a/public/gambar/dAVbOJQeJnGogUg.jpg b/public/gambar/dAVbOJQeJnGogUg.jpg new file mode 100644 index 0000000..98d1c32 Binary files /dev/null and b/public/gambar/dAVbOJQeJnGogUg.jpg differ diff --git a/public/gambar/m0UEA7GZ3eqH6yZ.jpg b/public/gambar/m0UEA7GZ3eqH6yZ.jpg new file mode 100644 index 0000000..322ca31 Binary files /dev/null and b/public/gambar/m0UEA7GZ3eqH6yZ.jpg differ diff --git a/public/gambar/sKEpPVmmXHGH42e.jpg b/public/gambar/sKEpPVmmXHGH42e.jpg new file mode 100644 index 0000000..7502f24 Binary files /dev/null and b/public/gambar/sKEpPVmmXHGH42e.jpg differ diff --git a/public/gambar/sjFBBFhx2wpSuE8.jpg b/public/gambar/sjFBBFhx2wpSuE8.jpg new file mode 100644 index 0000000..c42d79b Binary files /dev/null and b/public/gambar/sjFBBFhx2wpSuE8.jpg differ diff --git a/public/gambar/teCc2Q88QGhBUQL.jpg b/public/gambar/teCc2Q88QGhBUQL.jpg new file mode 100644 index 0000000..7502f24 Binary files /dev/null and b/public/gambar/teCc2Q88QGhBUQL.jpg differ diff --git a/public/gambar/ui9A9mjwVaZq2hj.jpg b/public/gambar/ui9A9mjwVaZq2hj.jpg new file mode 100644 index 0000000..013d276 Binary files /dev/null and b/public/gambar/ui9A9mjwVaZq2hj.jpg differ diff --git a/public/gambar/vajeyxcmaRf6JR3.jpg b/public/gambar/vajeyxcmaRf6JR3.jpg new file mode 100644 index 0000000..f4729a6 Binary files /dev/null and b/public/gambar/vajeyxcmaRf6JR3.jpg differ diff --git a/public/gambar/yugmkzUNtvyoKXG.jpg b/public/gambar/yugmkzUNtvyoKXG.jpg new file mode 100644 index 0000000..bb812ac Binary files /dev/null and b/public/gambar/yugmkzUNtvyoKXG.jpg differ diff --git a/public/gambar/zc8vn0ZMLirPaAJ.jpg b/public/gambar/zc8vn0ZMLirPaAJ.jpg new file mode 100644 index 0000000..deacad0 Binary files /dev/null and b/public/gambar/zc8vn0ZMLirPaAJ.jpg differ diff --git a/public/js/checkout/action.js b/public/js/checkout/action.js index 2dc891d..ab6e249 100644 --- a/public/js/checkout/action.js +++ b/public/js/checkout/action.js @@ -65,6 +65,11 @@ async function submitOrderToServer(){ $("#checkoutFormFinal").on('submit', async function(e){ e.preventDefault() + const buttonSubmit = $(this).find('button[type="submit"]') + if(buttonSubmit.prop('disabled')) return; + buttonSubmit.prop('disabled', true) + .html('Memproses...') + const cara_pembayaran = document.getElementById('cara_pembayaran').value; const bukti_pembayaran = document.querySelector('input[name="bukti_pembayaran"]').value; @@ -74,6 +79,7 @@ async function submitOrderToServer(){ text: 'Silahkan upload bukti pembayaran jika metode yang dipakai transfer.', icon: 'warning', }) + buttonSubmit.prop('disabled', false).html('Selesaikan Pesanan'); return; } @@ -81,6 +87,12 @@ async function submitOrderToServer(){ const form = this; const formData = new FormData(form); + const clearSession = () => { + sessionStorage.removeItem('cart'); + sessionStorage.removeItem('checkout_biodata'); + sessionStorage.removeItem('order_id'); + sessionStorage.removeItem('time_order'); + }; try { const response = await fetch('/finish-checkout', { @@ -95,11 +107,7 @@ async function submitOrderToServer(){ if (result.status) { // ✅ Hapus sessionStorage di client - sessionStorage.removeItem('cart'); - sessionStorage.removeItem('checkout_biodata'); - sessionStorage.removeItem('order_id'); - sessionStorage.removeItem('time_order'); - + clearSession() Swal.fire({ title: 'Pesanan Berhasil!', text: 'Terima kasih, pesanan Anda sedang kami siapkan.', @@ -110,10 +118,7 @@ async function submitOrderToServer(){ window.location.href = "/success-page"; // kehalaman success }); } else { - sessionStorage.removeItem('cart'); - sessionStorage.removeItem('checkout_biodata'); - sessionStorage.removeItem('order_id'); - sessionStorage.removeItem('time_order'); + clearSession() Swal.fire({ title: 'Gagal!', text: result.message, @@ -124,11 +129,10 @@ async function submitOrderToServer(){ }); } } catch (err) { - sessionStorage.removeItem('cart'); - sessionStorage.removeItem('checkout_biodata'); - sessionStorage.removeItem('order_id'); - sessionStorage.removeItem('time_order'); + clearSession() console.error(err); alert("Terjadi kesalahan saat mengirim data."); + }finally{ + buttonSubmit.prop('disabled', false).html('Selesaikan Pesanan'); } }) diff --git a/public/js/checkout/index.js b/public/js/checkout/index.js index 8b67931..ef33bc0 100644 --- a/public/js/checkout/index.js +++ b/public/js/checkout/index.js @@ -31,67 +31,78 @@ document.addEventListener('DOMContentLoaded', () => { // Setup button step document.querySelectorAll('.next-step').forEach(btn => { btn.addEventListener('click', async () => { + const btnLoad = btn; + btnLoad.disabled = true; + btnLoad.innerHTML = 'Memproses...'; let cart = JSON.parse(sessionStorage.getItem('cart') || '[]'); - - if (cart.length === 0) { + try { + if (cart.length === 0) { window.location.href = "/"; return; } if (currentStep === 0){ - if(!validateStepOne()) return - isiKonfirmasi(); - currentStep++; showStep(currentStep); - }else if(currentStep === 1){ - const {isValid, errorMessage} =validateCartBeforeSubmit(); - if (!isValid) { - Swal.fire({ - title: 'Perhatian!', - text: errorMessage, + if(!validateStepOne()) return + isiKonfirmasi(); + currentStep++; showStep(currentStep); + }else if(currentStep === 1){ + const {isValid, errorMessage} =validateCartBeforeSubmit(); + if (!isValid) { + Swal.fire({ + title: 'Perhatian!', + text: errorMessage, + icon: 'warning', + confirmButtonText: 'Oke' + }) + return + } + let checkout_biodata = JSON.parse(sessionStorage.getItem('checkout_biodata') || '{}'); + + if (!checkout_biodata.nama_pemesan) { + Swal.fire({ + title: 'Biodata Belum Terisi!', + text: 'Lakukan Pengisian biodata terlebih dahulu.', icon: 'warning', - confirmButtonText: 'Oke' - }) - return - } - let checkout_biodata = JSON.parse(sessionStorage.getItem('checkout_biodata') || '{}'); + confirmButtonText: 'oke!', + }).then(() => { + window.location.href = "/checkout"; + }); + return + } + let cart = JSON.parse(sessionStorage.getItem('cart') || '[]'); + for (const item of cart) { + for (const p of item.pesanan) { + const result = validateTanggalPemesanan(item, p.tgl); - if (!checkout_biodata.nama_pemesan) { - Swal.fire({ - title: 'Biodata Belum Terisi!', - text: 'Lakukan Pengisian biodata terlebih dahulu.', - icon: 'warning', - confirmButtonText: 'oke!', - }).then(() => { - window.location.href = "/checkout"; - }); - return - } - let cart = JSON.parse(sessionStorage.getItem('cart') || '[]'); - for (const item of cart) { - for (const p of item.pesanan) { - const result = validateTanggalPemesanan(item, p.tgl); - - if (!result.valid) { - alert(result.message); - return; // hentikan di sini, tidak lanjut + if (!result.valid) { + alert(result.message); + return; // hentikan di sini, tidak lanjut + } } } - } - if (!sessionStorage.getItem('order_id')) { - await submitOrderToServer(); // async function simpan ke server + if (!sessionStorage.getItem('order_id')) { + await submitOrderToServer(); // async function simpan ke server - } + } - time_order = sessionStorage.getItem('time_order') - orderDate = new Date(time_order); - deadline = new Date(orderDate.getTime() + 10 * 60 * 1000) - updateCountdown() - currentStep++; - showStep(currentStep) - }else if(currentStep === 2){ - renderCartSummary() + time_order = sessionStorage.getItem('time_order') + orderDate = new Date(time_order); + deadline = new Date(orderDate.getTime() + 10 * 60 * 1000) + updateCountdown() + currentStep++; + showStep(currentStep) + }else if(currentStep === 2){ + renderCartSummary() + } + } catch (error) { + console.error(error); + Swal.fire('Error', 'Terjadi kesalahan, silakan coba lagi.', 'error'); + }finally{ + btnLoad.disabled = false; + btnLoad.innerHTML = 'Selanjutnya'; } + }); }); @@ -313,9 +324,7 @@ function renderCartSummary() { const disableSore = isToday && jam >= 13; const countDate = pesananList.length; - if(checkout_biodata.jenis_customer === 'Karyawan RSAB Harapan Kita'){ - $("#karywan").re - } + pesananHTML += `