diff --git a/app/Http/Controllers/CustomerController.php b/app/Http/Controllers/CustomerController.php index 7812906..8afb953 100644 --- a/app/Http/Controllers/CustomerController.php +++ b/app/Http/Controllers/CustomerController.php @@ -2,12 +2,15 @@ namespace App\Http\Controllers; +use App\Mail\NotifikasiCustomer; +use App\Mail\NotifikasiPembayaran; use App\Models\Karbohidrat; use App\Models\Order; use App\Models\OrderDetail; use Carbon\Carbon; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\Mail; use Illuminate\Support\Str; class CustomerController extends Controller @@ -255,7 +258,8 @@ class CustomerController extends Controller $payloadOrderDetail['jumlah'] = $value['jumlah']; $payloadOrderDetail['tgl_antar'] = $value['tgl']; $payloadOrderDetail['type'] = $value['kategoriPemesanan']; - $payloadOrderDetail['karbohidrat_id'] = $value['karbohidrat_id']; + $payloadOrderDetail['karbohidrat_id'] = $value['karbohidrat_id'] ?? null; + $payloadOrderDetail['catatan'] = $value['catatan'] ?? null; if($cart['jenis_menu'] === "paket"){ $payloadOrderDetail['master_paket_menu_id'] = $cart['id_menu']; }else{ @@ -265,7 +269,9 @@ class CustomerController extends Controller } } //code... - + if($order->email){ + Mail::to($order->email)->queue(new NotifikasiCustomer($order->nama_pemesan, $order->no_order, $order->total_harga)); + } DB::commit(); return response()->json([ 'status' => true, @@ -319,6 +325,9 @@ class CustomerController extends Controller // Update data order $order->update($payload); + if($order->email){ + Mail::to($order->email)->queue(new NotifikasiPembayaran($order->nama_pemesan, $order->no_order)); + } DB::commit(); session()->flash('payment_success', true); session()->flash('no_order', $noOrder); @@ -328,7 +337,6 @@ class CustomerController extends Controller ], 200); return back()->with('success', 'Bukti pembayaran berhasil diunggah.'); } catch (\Throwable $th) { - dd($th); DB::rollBack(); return response([ 'status' => false, diff --git a/app/Http/Controllers/PesananController.php b/app/Http/Controllers/PesananController.php index 3c9609a..b290dd9 100644 --- a/app/Http/Controllers/PesananController.php +++ b/app/Http/Controllers/PesananController.php @@ -2,12 +2,15 @@ namespace App\Http\Controllers; +use App\Mail\NotifikasiKonfirmasiPembayaran; use App\Models\Order; use App\Models\OrderDetail; +use Barryvdh\DomPDF\Facade\Pdf; use Carbon\Carbon; use Illuminate\Http\Request; use Illuminate\Support\Arr; use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\Mail; class PesananController extends Controller { @@ -86,6 +89,11 @@ class PesananController extends Controller $payload['note_dibatalkan'] = request('note_dibatalkan'); } $order->update($payload); + + if($order->email){ + Mail::to($order->email)->queue(new NotifikasiKonfirmasiPembayaran($order->nama_pemesan, $order->no_order, $order->total_harga)); + } + DB::connection('dbOrderGizi')->commit(); return response()->json([ 'status' => true, @@ -113,6 +121,10 @@ class PesananController extends Controller 'cara_pembayaran' => 'Billing' ]; $order->update($payload); + + if($order->email){ + Mail::to($order->email)->queue(new NotifikasiKonfirmasiPembayaran($order->nama_pemesan, $order->no_order, $order->total_harga)); + } DB::connection('dbOrderGizi')->commit(); return response()->json([ 'status' => true, @@ -239,6 +251,80 @@ class PesananController extends Controller 'data' => $data ]); } + + public function exportPekerjaan(){ + $startDate = request('start_date'); + $endDate = request('end_date'); + $now = Carbon::now()->format('Y-m-d H-i'); + $orderDetail = OrderDetail::with(['menu', 'paketMenu', 'order'])->whereHas('order', function($q){ + $q->where('status_order', 'Lunas'); + })->whereBetween('tgl_antar', [$startDate, $endDate])->get(); + $waktu_cetak = Carbon::now()->locale('id')->translatedFormat('d F Y'); + $startDateFormatted = Carbon::parse($startDate)->locale('id')->translatedFormat('d F Y'); + $endDateFormatted = Carbon::parse($endDate)->locale('id')->translatedFormat('d F Y'); + $data = [ + 'pekerjaan' => $orderDetail, + 'waktu_cetak' => $waktu_cetak, + 'startDate' => $startDateFormatted, + 'endDate' => $endDateFormatted + ]; + $pdf = Pdf::loadView('dashboard.pesanan.pekerjaan.pdf', $data); + return $pdf->stream("daftar-pesanan-{$now}.pdf"); + } + + + public function exportPending(){ + $startDate = Carbon::parse(request('start_date'))->startOfDay(); + $endDate = Carbon::parse(request('end_date'))->endOfDay(); + $order = Order::where('statusenabled', true) + ->whereBetween('entry_at', [$startDate, $endDate]) + ->with('orderDetail') + ->whereHas('orderDetail', function($q) { + $q->where('status_order', '!=', 'Selesai'); + }) + ->get(); + $startDateFormatted = Carbon::parse($startDate)->locale('id')->translatedFormat('d F Y'); + $endDateFormatted = Carbon::parse($endDate)->locale('id')->translatedFormat('d F Y'); + $waktu_cetak = Carbon::now()->locale('id')->translatedFormat('d F Y'); + + $data = [ + 'waktu_cetak' => $waktu_cetak, + 'orders' => $order, + 'startDate' => $startDateFormatted, + 'endDate' => $endDateFormatted + ]; + $pdf = Pdf::loadView('dashboard.pesanan.pending.pdf', $data); + + return $pdf->stream('laporan-pesanan-' . now()->format('Ymd-His') . '.pdf'); + } + + public function exportSelesai(){ + $startDate = Carbon::parse(request('start_date'))->startOfDay(); + $endDate = Carbon::parse(request('end_date'))->endOfDay(); + + $order = Order::where('statusenabled', true) + ->whereBetween('entry_at', [$startDate, $endDate]) + ->with('orderDetail') + ->whereHas('orderDetail') // hanya order yang punya detail + ->whereDoesntHave('orderDetail', function($q) { + $q->where('status_order', '!=', 'Selesai'); + }) + ->get(); + + $startDateFormatted = Carbon::parse($startDate)->locale('id')->translatedFormat('d F Y'); + $endDateFormatted = Carbon::parse($endDate)->locale('id')->translatedFormat('d F Y'); + $waktu_cetak = Carbon::now()->locale('id')->translatedFormat('d F Y'); + + $data = [ + 'waktu_cetak' => $waktu_cetak, + 'orders' => $order, + 'startDate' => $startDateFormatted, + 'endDate' => $endDateFormatted + ]; + $pdf = Pdf::loadView('dashboard.pesanan.selesai.pdf', $data); + + return $pdf->stream('laporan-pesanan-' . now()->format('Ymd-His') . '.pdf'); + } /** * Show the form for creating a new resource. */ diff --git a/app/Mail/NotifikasiCustomer.php b/app/Mail/NotifikasiCustomer.php new file mode 100644 index 0000000..5cad41a --- /dev/null +++ b/app/Mail/NotifikasiCustomer.php @@ -0,0 +1,73 @@ +pemesan = $pemesan; + $this->noOrder = $noOrder; + $this->total_harga = $total_harga; + } + + /** + * Get the message content definition. + */ + public function build(){ + return $this->subject('Konfirmasi Pesanan Anda')->html(" +
+

✅ Pesanan Berhasil!

+

Halo, {$this->pemesan},

+

Terima kasih telah melakukan pemesanan. Berikut detail pesanan Anda:

+ + + + + + + + + + + + + + + + + + +
No. Order{$this->noOrder}
Tanggal" . now()->format('d M Y H:i') . "
StatusMenunggu Pembayaran
Nominal Harus BayarRp ". number_format($this->total_harga, 0,',', '.') + ."
+ +

Silakan segera lakukan pembayaran ke rekening berikut:

+ + +

Jika Anda tidak merasa melakukan pesanan ini, abaikan email ini.

+ +
+

© " . date('Y') . " RSAB Harapan Kita

+
+ "); + } +} diff --git a/app/Mail/NotifikasiKonfirmasiPembayaran.php b/app/Mail/NotifikasiKonfirmasiPembayaran.php new file mode 100644 index 0000000..799922b --- /dev/null +++ b/app/Mail/NotifikasiKonfirmasiPembayaran.php @@ -0,0 +1,61 @@ +pemesan = $pemesan; + $this->noOrder = $noOrder; + $this->total_harga = $total_harga; + } + + /** + * Get the message content definition. + */ + public function build(){ + return $this->subject('Pembayaran Telah Dikonfirmasi')->html(" +
+

✅ Pembayaran Berhasil Diverifikasi

+

Halo, {$this->pemesan},

+

Pembayaran kamu untuk pesanan #{$this->noOrder} telah berhasil kami verifikasi.

+ + + + + + + + + + + + + + +
Nomor Order{$this->noOrder}
Total PembayaranRp " . number_format($this->total_harga, 0, ',', '.') . "
StatusPembayaran Diterima
+ +

Pesanan kamu sedang kami proses. Silakan tunggu pemberitahuan berikutnya untuk pengambilan makanan.

+ +
+

© " . date('Y') . " RSAB Harapan Kita

+
+ "); + } +} diff --git a/app/Mail/NotifikasiPembayaran.php b/app/Mail/NotifikasiPembayaran.php new file mode 100644 index 0000000..f792a63 --- /dev/null +++ b/app/Mail/NotifikasiPembayaran.php @@ -0,0 +1,47 @@ +pemesan = $pemesan; + $this->noOrder = $noOrder; + } + + /** + * Get the message content definition. + */ + public function build(){ + return $this->subject('Pembayaran Diterima - Menunggu Konfirmasi')->html(" +
+

Menunggu Konfirmasi Pembayaran

+

Halo, {$this->pemesan},

+

Kami telah menerima bukti pembayaran untuk pesanan kamu dengan nomor {$this->noOrder}.

+

Tim kami akan segera memverifikasi pembayaran tersebut.

+ +

Mohon tunggu konfirmasi selanjutnya dari admin. Kami akan kirimkan email ketika pembayaran telah diverifikasi.

+ +

Terima kasih telah melakukan pemesanan.

+ +
+

© " . date('Y') . " RSAB Harapan Kita

+
+ "); + } +} diff --git a/composer.json b/composer.json index f75565d..ceae8c3 100644 --- a/composer.json +++ b/composer.json @@ -7,8 +7,10 @@ "license": "MIT", "require": { "php": "^8.2", + "barryvdh/laravel-dompdf": "^3.1", "laravel/framework": "^12.0", - "laravel/tinker": "^2.10.1" + "laravel/tinker": "^2.10.1", + "phpoffice/phpspreadsheet": "^4.5" }, "require-dev": { "fakerphp/faker": "^1.23", diff --git a/composer.lock b/composer.lock index 5a8f211..4bf5e89 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,85 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "88970a0117c062eed55fa8728fc43833", + "content-hash": "696ae0d1187bc1634529f1760a11ffd0", "packages": [ + { + "name": "barryvdh/laravel-dompdf", + "version": "v3.1.1", + "source": { + "type": "git", + "url": "https://github.com/barryvdh/laravel-dompdf.git", + "reference": "8e71b99fc53bb8eb77f316c3c452dd74ab7cb25d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/barryvdh/laravel-dompdf/zipball/8e71b99fc53bb8eb77f316c3c452dd74ab7cb25d", + "reference": "8e71b99fc53bb8eb77f316c3c452dd74ab7cb25d", + "shasum": "" + }, + "require": { + "dompdf/dompdf": "^3.0", + "illuminate/support": "^9|^10|^11|^12", + "php": "^8.1" + }, + "require-dev": { + "larastan/larastan": "^2.7|^3.0", + "orchestra/testbench": "^7|^8|^9|^10", + "phpro/grumphp": "^2.5", + "squizlabs/php_codesniffer": "^3.5" + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "PDF": "Barryvdh\\DomPDF\\Facade\\Pdf", + "Pdf": "Barryvdh\\DomPDF\\Facade\\Pdf" + }, + "providers": [ + "Barryvdh\\DomPDF\\ServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Barryvdh\\DomPDF\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Barry vd. Heuvel", + "email": "barryvdh@gmail.com" + } + ], + "description": "A DOMPDF Wrapper for Laravel", + "keywords": [ + "dompdf", + "laravel", + "pdf" + ], + "support": { + "issues": "https://github.com/barryvdh/laravel-dompdf/issues", + "source": "https://github.com/barryvdh/laravel-dompdf/tree/v3.1.1" + }, + "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2025-02-13T15:07:54+00:00" + }, { "name": "brick/math", "version": "0.13.1", @@ -135,6 +212,85 @@ ], "time": "2024-02-09T16:56:22+00:00" }, + { + "name": "composer/pcre", + "version": "3.3.2", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<1.11.10" + }, + "require-dev": { + "phpstan/phpstan": "^1.12 || ^2", + "phpstan/phpstan-strict-rules": "^1 || ^2", + "phpunit/phpunit": "^8 || ^9" + }, + "type": "library", + "extra": { + "phpstan": { + "includes": [ + "extension.neon" + ] + }, + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Pcre\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "keywords": [ + "PCRE", + "preg", + "regex", + "regular expression" + ], + "support": { + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.3.2" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2024-11-12T16:29:46+00:00" + }, { "name": "dflydev/dot-access-data", "version": "v3.0.3", @@ -378,6 +534,161 @@ ], "time": "2024-02-05T11:56:58+00:00" }, + { + "name": "dompdf/dompdf", + "version": "v3.1.0", + "source": { + "type": "git", + "url": "https://github.com/dompdf/dompdf.git", + "reference": "a51bd7a063a65499446919286fb18b518177155a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dompdf/dompdf/zipball/a51bd7a063a65499446919286fb18b518177155a", + "reference": "a51bd7a063a65499446919286fb18b518177155a", + "shasum": "" + }, + "require": { + "dompdf/php-font-lib": "^1.0.0", + "dompdf/php-svg-lib": "^1.0.0", + "ext-dom": "*", + "ext-mbstring": "*", + "masterminds/html5": "^2.0", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "ext-gd": "*", + "ext-json": "*", + "ext-zip": "*", + "mockery/mockery": "^1.3", + "phpunit/phpunit": "^7.5 || ^8 || ^9 || ^10 || ^11", + "squizlabs/php_codesniffer": "^3.5", + "symfony/process": "^4.4 || ^5.4 || ^6.2 || ^7.0" + }, + "suggest": { + "ext-gd": "Needed to process images", + "ext-gmagick": "Improves image processing performance", + "ext-imagick": "Improves image processing performance", + "ext-zlib": "Needed for pdf stream compression" + }, + "type": "library", + "autoload": { + "psr-4": { + "Dompdf\\": "src/" + }, + "classmap": [ + "lib/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1" + ], + "authors": [ + { + "name": "The Dompdf Community", + "homepage": "https://github.com/dompdf/dompdf/blob/master/AUTHORS.md" + } + ], + "description": "DOMPDF is a CSS 2.1 compliant HTML to PDF converter", + "homepage": "https://github.com/dompdf/dompdf", + "support": { + "issues": "https://github.com/dompdf/dompdf/issues", + "source": "https://github.com/dompdf/dompdf/tree/v3.1.0" + }, + "time": "2025-01-15T14:09:04+00:00" + }, + { + "name": "dompdf/php-font-lib", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/dompdf/php-font-lib.git", + "reference": "6137b7d4232b7f16c882c75e4ca3991dbcf6fe2d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dompdf/php-font-lib/zipball/6137b7d4232b7f16c882c75e4ca3991dbcf6fe2d", + "reference": "6137b7d4232b7f16c882c75e4ca3991dbcf6fe2d", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "symfony/phpunit-bridge": "^3 || ^4 || ^5 || ^6" + }, + "type": "library", + "autoload": { + "psr-4": { + "FontLib\\": "src/FontLib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1-or-later" + ], + "authors": [ + { + "name": "The FontLib Community", + "homepage": "https://github.com/dompdf/php-font-lib/blob/master/AUTHORS.md" + } + ], + "description": "A library to read, parse, export and make subsets of different types of font files.", + "homepage": "https://github.com/dompdf/php-font-lib", + "support": { + "issues": "https://github.com/dompdf/php-font-lib/issues", + "source": "https://github.com/dompdf/php-font-lib/tree/1.0.1" + }, + "time": "2024-12-02T14:37:59+00:00" + }, + { + "name": "dompdf/php-svg-lib", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/dompdf/php-svg-lib.git", + "reference": "eb045e518185298eb6ff8d80d0d0c6b17aecd9af" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dompdf/php-svg-lib/zipball/eb045e518185298eb6ff8d80d0d0c6b17aecd9af", + "reference": "eb045e518185298eb6ff8d80d0d0c6b17aecd9af", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^7.1 || ^8.0", + "sabberworm/php-css-parser": "^8.4" + }, + "require-dev": { + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Svg\\": "src/Svg" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-or-later" + ], + "authors": [ + { + "name": "The SvgLib Community", + "homepage": "https://github.com/dompdf/php-svg-lib/blob/master/AUTHORS.md" + } + ], + "description": "A library to read, parse and export to PDF SVG files.", + "homepage": "https://github.com/dompdf/php-svg-lib", + "support": { + "issues": "https://github.com/dompdf/php-svg-lib/issues", + "source": "https://github.com/dompdf/php-svg-lib/tree/1.0.0" + }, + "time": "2024-04-29T13:26:35+00:00" + }, { "name": "dragonmantank/cron-expression", "version": "v3.4.0", @@ -2006,6 +2317,258 @@ ], "time": "2024-12-08T08:18:47+00:00" }, + { + "name": "maennchen/zipstream-php", + "version": "3.1.2", + "source": { + "type": "git", + "url": "https://github.com/maennchen/ZipStream-PHP.git", + "reference": "aeadcf5c412332eb426c0f9b4485f6accba2a99f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/aeadcf5c412332eb426c0f9b4485f6accba2a99f", + "reference": "aeadcf5c412332eb426c0f9b4485f6accba2a99f", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "ext-zlib": "*", + "php-64bit": "^8.2" + }, + "require-dev": { + "brianium/paratest": "^7.7", + "ext-zip": "*", + "friendsofphp/php-cs-fixer": "^3.16", + "guzzlehttp/guzzle": "^7.5", + "mikey179/vfsstream": "^1.6", + "php-coveralls/php-coveralls": "^2.5", + "phpunit/phpunit": "^11.0", + "vimeo/psalm": "^6.0" + }, + "suggest": { + "guzzlehttp/psr7": "^2.4", + "psr/http-message": "^2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "ZipStream\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paul Duncan", + "email": "pabs@pablotron.org" + }, + { + "name": "Jonatan Männchen", + "email": "jonatan@maennchen.ch" + }, + { + "name": "Jesse Donat", + "email": "donatj@gmail.com" + }, + { + "name": "András Kolesár", + "email": "kolesar@kolesar.hu" + } + ], + "description": "ZipStream is a library for dynamically streaming dynamic zip files from PHP without writing to the disk at all on the server.", + "keywords": [ + "stream", + "zip" + ], + "support": { + "issues": "https://github.com/maennchen/ZipStream-PHP/issues", + "source": "https://github.com/maennchen/ZipStream-PHP/tree/3.1.2" + }, + "funding": [ + { + "url": "https://github.com/maennchen", + "type": "github" + } + ], + "time": "2025-01-27T12:07:53+00:00" + }, + { + "name": "markbaker/complex", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/MarkBaker/PHPComplex.git", + "reference": "95c56caa1cf5c766ad6d65b6344b807c1e8405b9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/MarkBaker/PHPComplex/zipball/95c56caa1cf5c766ad6d65b6344b807c1e8405b9", + "reference": "95c56caa1cf5c766ad6d65b6344b807c1e8405b9", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "dev-master", + "phpcompatibility/php-compatibility": "^9.3", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "squizlabs/php_codesniffer": "^3.7" + }, + "type": "library", + "autoload": { + "psr-4": { + "Complex\\": "classes/src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Baker", + "email": "mark@lange.demon.co.uk" + } + ], + "description": "PHP Class for working with complex numbers", + "homepage": "https://github.com/MarkBaker/PHPComplex", + "keywords": [ + "complex", + "mathematics" + ], + "support": { + "issues": "https://github.com/MarkBaker/PHPComplex/issues", + "source": "https://github.com/MarkBaker/PHPComplex/tree/3.0.2" + }, + "time": "2022-12-06T16:21:08+00:00" + }, + { + "name": "markbaker/matrix", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/MarkBaker/PHPMatrix.git", + "reference": "728434227fe21be27ff6d86621a1b13107a2562c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/MarkBaker/PHPMatrix/zipball/728434227fe21be27ff6d86621a1b13107a2562c", + "reference": "728434227fe21be27ff6d86621a1b13107a2562c", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "dev-master", + "phpcompatibility/php-compatibility": "^9.3", + "phpdocumentor/phpdocumentor": "2.*", + "phploc/phploc": "^4.0", + "phpmd/phpmd": "2.*", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "sebastian/phpcpd": "^4.0", + "squizlabs/php_codesniffer": "^3.7" + }, + "type": "library", + "autoload": { + "psr-4": { + "Matrix\\": "classes/src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Baker", + "email": "mark@demon-angel.eu" + } + ], + "description": "PHP Class for working with matrices", + "homepage": "https://github.com/MarkBaker/PHPMatrix", + "keywords": [ + "mathematics", + "matrix", + "vector" + ], + "support": { + "issues": "https://github.com/MarkBaker/PHPMatrix/issues", + "source": "https://github.com/MarkBaker/PHPMatrix/tree/3.0.1" + }, + "time": "2022-12-02T22:17:43+00:00" + }, + { + "name": "masterminds/html5", + "version": "2.10.0", + "source": { + "type": "git", + "url": "https://github.com/Masterminds/html5-php.git", + "reference": "fcf91eb64359852f00d921887b219479b4f21251" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/fcf91eb64359852f00d921887b219479b4f21251", + "reference": "fcf91eb64359852f00d921887b219479b4f21251", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8 || ^9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Masterminds\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matt Butcher", + "email": "technosophos@gmail.com" + }, + { + "name": "Matt Farina", + "email": "matt@mattfarina.com" + }, + { + "name": "Asmir Mustafic", + "email": "goetas@gmail.com" + } + ], + "description": "An HTML5 parser and serializer.", + "homepage": "http://masterminds.github.io/html5-php", + "keywords": [ + "HTML5", + "dom", + "html", + "parser", + "querypath", + "serializer", + "xml" + ], + "support": { + "issues": "https://github.com/Masterminds/html5-php/issues", + "source": "https://github.com/Masterminds/html5-php/tree/2.10.0" + }, + "time": "2025-07-25T09:04:22+00:00" + }, { "name": "monolog/monolog", "version": "3.9.0", @@ -2507,6 +3070,112 @@ ], "time": "2025-05-08T08:14:37+00:00" }, + { + "name": "phpoffice/phpspreadsheet", + "version": "4.5.0", + "source": { + "type": "git", + "url": "https://github.com/PHPOffice/PhpSpreadsheet.git", + "reference": "2ea9786632e6fac1aee601b6e426bcc723d8ce13" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/2ea9786632e6fac1aee601b6e426bcc723d8ce13", + "reference": "2ea9786632e6fac1aee601b6e426bcc723d8ce13", + "shasum": "" + }, + "require": { + "composer/pcre": "^1||^2||^3", + "ext-ctype": "*", + "ext-dom": "*", + "ext-fileinfo": "*", + "ext-gd": "*", + "ext-iconv": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-simplexml": "*", + "ext-xml": "*", + "ext-xmlreader": "*", + "ext-xmlwriter": "*", + "ext-zip": "*", + "ext-zlib": "*", + "maennchen/zipstream-php": "^2.1 || ^3.0", + "markbaker/complex": "^3.0", + "markbaker/matrix": "^3.0", + "php": "^8.1", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0", + "psr/simple-cache": "^1.0 || ^2.0 || ^3.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "dev-main", + "dompdf/dompdf": "^2.0 || ^3.0", + "friendsofphp/php-cs-fixer": "^3.2", + "mitoteam/jpgraph": "^10.3", + "mpdf/mpdf": "^8.1.1", + "phpcompatibility/php-compatibility": "^9.3", + "phpstan/phpstan": "^1.1 || ^2.0", + "phpstan/phpstan-deprecation-rules": "^1.0 || ^2.0", + "phpstan/phpstan-phpunit": "^1.0 || ^2.0", + "phpunit/phpunit": "^10.5", + "squizlabs/php_codesniffer": "^3.7", + "tecnickcom/tcpdf": "^6.5" + }, + "suggest": { + "dompdf/dompdf": "Option for rendering PDF with PDF Writer", + "ext-intl": "PHP Internationalization Functions", + "mitoteam/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers", + "mpdf/mpdf": "Option for rendering PDF with PDF Writer", + "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer" + }, + "type": "library", + "autoload": { + "psr-4": { + "PhpOffice\\PhpSpreadsheet\\": "src/PhpSpreadsheet" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Maarten Balliauw", + "homepage": "https://blog.maartenballiauw.be" + }, + { + "name": "Mark Baker", + "homepage": "https://markbakeruk.net" + }, + { + "name": "Franck Lefevre", + "homepage": "https://rootslabs.net" + }, + { + "name": "Erik Tilt" + }, + { + "name": "Adrien Crivelli" + } + ], + "description": "PHPSpreadsheet - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine", + "homepage": "https://github.com/PHPOffice/PhpSpreadsheet", + "keywords": [ + "OpenXML", + "excel", + "gnumeric", + "ods", + "php", + "spreadsheet", + "xls", + "xlsx" + ], + "support": { + "issues": "https://github.com/PHPOffice/PhpSpreadsheet/issues", + "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/4.5.0" + }, + "time": "2025-07-24T05:15:59+00:00" + }, { "name": "phpoption/phpoption", "version": "1.9.3", @@ -3271,6 +3940,72 @@ }, "time": "2025-06-25T14:20:11+00:00" }, + { + "name": "sabberworm/php-css-parser", + "version": "v8.9.0", + "source": { + "type": "git", + "url": "https://github.com/MyIntervals/PHP-CSS-Parser.git", + "reference": "d8e916507b88e389e26d4ab03c904a082aa66bb9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/MyIntervals/PHP-CSS-Parser/zipball/d8e916507b88e389e26d4ab03c904a082aa66bb9", + "reference": "d8e916507b88e389e26d4ab03c904a082aa66bb9", + "shasum": "" + }, + "require": { + "ext-iconv": "*", + "php": "^5.6.20 || ^7.0.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" + }, + "require-dev": { + "phpunit/phpunit": "5.7.27 || 6.5.14 || 7.5.20 || 8.5.41", + "rawr/cross-data-providers": "^2.0.0" + }, + "suggest": { + "ext-mbstring": "for parsing UTF-8 CSS" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "9.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Sabberworm\\CSS\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Raphael Schweikert" + }, + { + "name": "Oliver Klee", + "email": "github@oliverklee.de" + }, + { + "name": "Jake Hotson", + "email": "jake.github@qzdesign.co.uk" + } + ], + "description": "Parser for CSS Files written in PHP", + "homepage": "https://www.sabberworm.com/blog/2010/6/10/php-css-parser", + "keywords": [ + "css", + "parser", + "stylesheet" + ], + "support": { + "issues": "https://github.com/MyIntervals/PHP-CSS-Parser/issues", + "source": "https://github.com/MyIntervals/PHP-CSS-Parser/tree/v8.9.0" + }, + "time": "2025-07-11T13:20:48+00:00" + }, { "name": "symfony/clock", "version": "v7.3.0", diff --git a/config/database.php b/config/database.php index 56a1849..c3004ca 100644 --- a/config/database.php +++ b/config/database.php @@ -85,11 +85,11 @@ return [ 'pgsql' => [ 'driver' => 'pgsql', 'url' => env('DB_URL'), - 'host' => env('DB_HOST', '127.0.0.1'), - 'port' => env('DB_PORT', '5432'), - 'database' => env('DB_DATABASE', 'laravel'), - 'username' => env('DB_USERNAME', 'root'), - 'password' => env('DB_PASSWORD', ''), + 'host' => env('DB_HOST_ORDER_GIZI', '127.0.0.1'), + 'port' => env('DB_PORT_ORDER_GIZI', '5432'), + 'database' => env('DB_DATABASE_ORDER_GIZI', 'laravel'), + 'username' => env('DB_USERNAME_ORDER_GIZI', 'root'), + 'password' => env('DB_PASSWORD_ORDER_GIZI', ''), 'charset' => env('DB_CHARSET', 'utf8'), 'prefix' => '', 'prefix_indexes' => true, diff --git a/config/queue.php b/config/queue.php index f022e81..1b945dd 100644 --- a/config/queue.php +++ b/config/queue.php @@ -36,7 +36,7 @@ return [ 'database' => [ 'driver' => 'database', - 'connection' => env('DB_QUEUE_CONNECTION'), + 'connection' => env('DB_CONNECTION_ORDER_GIZI'), 'table' => env('DB_QUEUE_TABLE', 'jobs'), 'queue' => env('DB_QUEUE', 'default'), 'retry_after' => (int) env('DB_QUEUE_RETRY_AFTER', 90), diff --git a/public/gambar/qris.jpg b/public/gambar/qris.jpg new file mode 100644 index 0000000..d5d0d0f Binary files /dev/null and b/public/gambar/qris.jpg differ diff --git a/public/js/checkout/index.js b/public/js/checkout/index.js index 442c28c..200ae39 100644 --- a/public/js/checkout/index.js +++ b/public/js/checkout/index.js @@ -7,6 +7,16 @@ let order_id = sessionStorage.getItem('order_id') || '[]'; // EVENT ON LOAD // ======================= document.addEventListener('DOMContentLoaded', () => { + const checkCart = JSON.parse(sessionStorage.getItem('cart') || '[]'); + const validChart = checkCart.length > 0 && checkCart.every(item => + Array.isArray(item.pesanan) && + item.pesanan.length > 0 + ); + if(!validChart){ + window.location.href ='/'; + return + } + $("#cartButton").addClass('d-none'); $("#no_order_result").val(order_id) let currentStep = 0; @@ -57,7 +67,7 @@ document.addEventListener('DOMContentLoaded', () => { } } - + if (!sessionStorage.getItem('order_id')) { await submitOrderToServer(); // async function simpan ke server @@ -241,105 +251,114 @@ function renderCartSummary() { const countDate = pesananList.length; pesananHTML += ` -
-
+
+
- -
- -
+ +
+ +
- - ${item.apakah_someday ? `` : ` -
- -
`} + +
+ +
- -
- + + ${(karhohidrats || []).map(k => ` + + `).join('')} + +
`} - ${ - item.apakah_someday - ? ( - item.apakah_menu_siang && item.apakah_menu_sore - ? ` - - - ` - : item.apakah_menu_siang - ? `` + +
+ -
+ ) + } + +
- -
-
- - - -
-
+ +
+
+ + + +
+
- -
- ${countDate > 1 - ? `` - : ''} -
+ +
+ ${countDate > 1 + ? `` + : '' + } +
+ +
+
-
- `; }); const itemHTML = `
+
${item.nama_menu}
-
${item.nama_menu}
@@ -356,15 +375,15 @@ function renderCartSummary() { ${item.kalori ? `
Kalori: ${item.kalori} kkal
` : ''} -
Silakan isi tanggal pemesanan dan pilih karbohidrat yang diinginkan
+
Silakan isi tanggal pemesanan, catatan pemesanan (opsional) dan pilih karbohidrat yang diinginkan
${pesananHTML} - +
' - +
Total: Rp ${itemTotal.toLocaleString('id-ID')}
@@ -422,7 +441,6 @@ function onKategoriChange(itemId, index, isToday) { const kategori = selectEl.value; let now = new Date(); let jam = now.getHours(); - console.log(isToday); if (kategori === "Makan Siang" && isToday && jam >= 10) { batasLewat = true; @@ -554,6 +572,8 @@ function validateCartBeforeSubmit() { let errorMessage = ""; cart.forEach((item, index) => { + console.log(item.apakah_someday); + const pesananList = item.pesanan || []; pesananList.forEach((pesanan, i) => { if (!pesanan.tgl) { @@ -565,7 +585,7 @@ function validateCartBeforeSubmit() { } else if (!pesanan.jumlah || pesanan.jumlah <= 0) { isValid = false; errorMessage = `Jumlah harus lebih dari 0 pada item "${item.nama_menu}" (baris ${i + 1})`; - }else if(!pesanan.karbohidrat_id){ + }else if(!pesanan.karbohidrat_id && !item?.apakah_someday){ isValid = false; errorMessage = `Karbohidrat belum diisi pada item "${item.nama_menu}" (baris ${i + 1})` } @@ -582,7 +602,9 @@ function hitungTotalHarga(){ let total =0; cart.forEach(item => { - const harga = biodata.jenis_customer === "Karyawan RSAB Harapan Kita" ? item.harga_karyawan || 0 : item.harga_public || 0 + const harga = biodata.jenis_customer === "Karyawan RSAB Harapan Kita" ? item.harga_karyawan : item.harga_public || 0 + console.log(harga); + const itemTotal = item.pesanan?.reduce((sum, p) => sum + (p.jumlah * harga), 0); total += itemTotal }) @@ -619,9 +641,9 @@ function initFlatpickrTersedia(item, i) { const totalMenitFlatSekarang = jamFlat * 60 + menitFlat; const menitBatasFlat = 13 * 60; - + const lewatBatasNormal = totalMenitFlatSekarang >= menitBatasFlat; - + // Ambil string tgl_tersedia dan ubah jadi array tanggal lengkap const dayNumbers = (item.tgl_tersedia || "") .split(',') @@ -650,7 +672,8 @@ function initFlatpickrTersedia(item, i) { availableDates.push(fullDateStr); } else { const selisihHari = Math.floor((fullDate - now) / (1000 * 60 * 60 * 24)); - + console.log(selisihHari); + if (selisihHari >= 1 || (selisihHari === 1 && !lewatBatasNormal)) { availableDates.push(fullDateStr); } @@ -659,6 +682,7 @@ function initFlatpickrTersedia(item, i) { } + let minTanggal = 'today'; // Jika item adalah someday dan waktu sekarang sudah lewat 13:00 @@ -669,23 +693,15 @@ function initFlatpickrTersedia(item, i) { } - - if(!item.apakah_someday){ - availableDates = availableDates.filter(dateStr => { - const dateObj = new Date(dateStr); - const selisihHari = Math.floor((dateObj - now) / (1000 * 60 * 60 * 24)); - return selisihHari >= 1 || (selisihHari === 1 && !lewatBatasNormal); - }); - } - flatpickr(`#tanggal-${item.id}-${i}`, { dateFormat: "Y-m-d", - ...(item?.apakah_someday ? { minDate: minTanggal,} : {enable : availableDates}), + ...(item?.apakah_someday ? {minDate: minTanggal} : {enable:availableDates}), defaultDate: item.pesanan[i]?.tgl || null, onChange: function(selectedDates, dateStr) { onTanggalChange(item.id, i, dateStr); } - }); + }); + } function increment(itemId, index) { @@ -708,6 +724,7 @@ function decrement(itemId, index) { } + function toggleBuktiPembayaran() { const metode = document.getElementById("cara_pembayaran").value; const buktiSection = document.getElementById("bukti_section"); @@ -717,9 +734,11 @@ function toggleBuktiPembayaran() { if (metode === "billing") { buktiSection.style.display = "none"; buktiInput.required = false; + $("#modalActionMethodBillingOrder").modal('show') } else { buktiSection.style.display = "block"; buktiInput.required = true; + $("#modalActionMethodBillingOrder").modal('hide') } } @@ -741,3 +760,39 @@ function validateTanggalPemesanan(item, tglDipilih) { return { valid: true }; } + +function notedOrder(id, i) { + const cart = JSON.parse(sessionStorage.getItem('cart') || '[]'); + const item = cart.find(item => item.id === id); + const note = item?.pesanan?.[i]?.catatan || ''; + + $("#note_order").val(note); + $("#submitNote").data('id', id).data('index', i); + $("#notedPOrder").modal('show'); +} + + +document.querySelectorAll('.auto-expand').forEach(function(textarea){ + textarea.addEventListener('input', function () { + this.style.height = 'auto'; + this.style.height = this.scrollHeight + 'px'; + }); +}) + +document.getElementById('submitNote').addEventListener('click', function(e){ + e.preventDefault() + const id = $(this).data('id') + const index = $(this).data('index') + const noted = $("#note_order").val() + const cart = JSON.parse(sessionStorage.getItem('cart') || '[]'); + const item =cart.find(item => item.id === id) + console.log(id, index, item); + + if(item && item.pesanan && item.pesanan[index]){ + item.pesanan[index].catatan = noted + sessionStorage.setItem('cart', JSON.stringify(cart)); + $("#notedPOrder").modal('hide') + }else{ + alert('gagal menyimpan catatan') + } +}); diff --git a/public/js/order_guest/index.js b/public/js/order_guest/index.js index e999588..d8c9e54 100644 --- a/public/js/order_guest/index.js +++ b/public/js/order_guest/index.js @@ -376,7 +376,7 @@ id_menu :idMenu, nama_menu : $("#cathering_order_name").text(), harga_karyawan : parseRupiahToNumber($("#cathering_order_price_karyawan").text()), - harga_kp : parseRupiahToNumber($("#cathering_order_price_keluarga_pasien").text()), + harga_public : parseRupiahToNumber($("#cathering_order_price_public").text()), foto: resultFoto, jenis_menu: $('#cathering_order_jenis_menu').text(), deskripsi:$("#cathering_order_deskripsi").text(), diff --git a/public/js/pekerjaan/_init.js b/public/js/pekerjaan/_init.js index 48e92e2..5b40f3f 100644 --- a/public/js/pekerjaan/_init.js +++ b/public/js/pekerjaan/_init.js @@ -3,3 +3,5 @@ const datatablePekerjaan = $("#datatablePekerjaan") const modalDetailOrder = document.getElementById('modalDetailOrder'); const modalActionOrder = document.getElementById('modalActionApproveOrder'); + +const modalExport = document.getElementById('modalExportPekerjaan'); diff --git a/public/js/pekerjaan/action.js b/public/js/pekerjaan/action.js index 4bd7401..1eb0c3c 100644 --- a/public/js/pekerjaan/action.js +++ b/public/js/pekerjaan/action.js @@ -106,3 +106,7 @@ document.getElementById('formActionApproveOrder').addEventListener('submit', fun }); }); }); + +function exportPekerjaan(){ + new bootstrap.Modal(modalExport).show() +} diff --git a/public/js/pesanan_pending/_init.js b/public/js/pesanan_pending/_init.js index d82324a..0b8a2de 100644 --- a/public/js/pesanan_pending/_init.js +++ b/public/js/pesanan_pending/_init.js @@ -10,3 +10,6 @@ const formActionApproveBillingOrder = $("#formActionApproveBillingOrder") const modalActionProgressOrder = document.getElementById('modalActionProgressOrder') const formActionProgressOrder = $("#formActionProgressOrder") + + +const modalExport = document.getElementById('modalExportPending'); diff --git a/public/js/pesanan_pending/action.js b/public/js/pesanan_pending/action.js index 2807b50..b9dea08 100644 --- a/public/js/pesanan_pending/action.js +++ b/public/js/pesanan_pending/action.js @@ -143,3 +143,7 @@ function approveProgress(order_id){ new bootstrap.Modal(modalActionProgressOrder).show(); fetchDetailOrder(order_id) } + +function exportPending(){ + new bootstrap.Modal(modalExport).show(); +} diff --git a/public/js/pesanan_selesai/_init.js b/public/js/pesanan_selesai/_init.js index 362e0b4..ba22bf3 100644 --- a/public/js/pesanan_selesai/_init.js +++ b/public/js/pesanan_selesai/_init.js @@ -2,3 +2,5 @@ const datatableSelesai = $("#datatablePesananSelesai") const modalActionSelesaiOrder = document.getElementById('modalActionSelesaiOrder') const formActionSelesaiOrder = $("#formActionSelesaiOrder") + +const modalExport = document.getElementById('modalExportSelesai') diff --git a/public/js/pesanan_selesai/detail_order.js b/public/js/pesanan_selesai/detail_order.js index f870816..f2612bf 100644 --- a/public/js/pesanan_selesai/detail_order.js +++ b/public/js/pesanan_selesai/detail_order.js @@ -106,3 +106,7 @@ function orderSelesai(order_id){ new bootstrap.Modal(modalActionSelesaiOrder).show(); fetchDetailOrder(order_id) } + +function exportSelesai(){ + new bootstrap.Modal(modalExport).show(); +} diff --git a/resources/views/dashboard/pesanan/pekerjaan/index.blade.php b/resources/views/dashboard/pesanan/pekerjaan/index.blade.php index d8a5a06..e9c08bd 100644 --- a/resources/views/dashboard/pesanan/pekerjaan/index.blade.php +++ b/resources/views/dashboard/pesanan/pekerjaan/index.blade.php @@ -9,20 +9,34 @@
-
-
Pekerjaan
-
- - - - -
+
+ +
+ Pekerjaan +
+ + +
+ + + + +
+ + + + +
+
+
@@ -31,6 +45,7 @@ @include('dashboard.pesanan.pekerjaan.modal.detail') @include('dashboard.pesanan.pekerjaan.modal.action') + @include('dashboard.pesanan.pekerjaan.modal.export') diff --git a/resources/views/dashboard/pesanan/pekerjaan/modal/export.blade.php b/resources/views/dashboard/pesanan/pekerjaan/modal/export.blade.php new file mode 100644 index 0000000..45cf30e --- /dev/null +++ b/resources/views/dashboard/pesanan/pekerjaan/modal/export.blade.php @@ -0,0 +1,43 @@ + + diff --git a/resources/views/dashboard/pesanan/pekerjaan/pdf.blade.php b/resources/views/dashboard/pesanan/pekerjaan/pdf.blade.php new file mode 100644 index 0000000..644e32e --- /dev/null +++ b/resources/views/dashboard/pesanan/pekerjaan/pdf.blade.php @@ -0,0 +1,170 @@ + + + + + Daftar Pesanan + + + + +
+

Daftar Pesanan

+ @if($startDate === $endDate) +
Periode: {{ $startDate }}
+ @else +
Periode: {{ $startDate }} - {{ $endDate }}
+ @endif +
RSAB Harapan Kita
+
+ +
+ Dicetak pada: {{ $waktu_cetak }} +
+ + + + + + + + + + + + + + + + + @forelse ($pekerjaan as $i => $row) + + + + + + + + + + + + @empty + + + + @endforelse + +
NoNama PemesanStatus OrderTanggal AntarWaktu PemesananMenuKeteranganJumlahHarga Satuan (Rp)
{{ $i + 1 }} + {{ $row['order']['nama_pemesan'] ?? '-' }} + @if (!empty($row['order']['jenis_customer'])) +
({{ $row['order']['jenis_customer'] }}) + @endif +
{{ $row['status_order'] ?? '-' }} + {{ isset($row['tgl_antar']) + ? \Carbon\Carbon::parse($row['tgl_antar'])->locale('id')->translatedFormat('d F Y') + : '-' }} + {{ $row['type'] ?? '-' }}{{ $row['menu']['nama_menu'] ?? '-' }} + @php + $jenis = strtolower($row['order']['jenis_customer'] ?? ''); + @endphp + @if ($jenis === 'keluarga pasien / penunggu pasien') + Nama Pasien: {{ $row['order']['nama_pasien'] ?? '-' }}
+ Ruang: {{ $row['order']['ruang_perawatan'] ?? '-' }} / {{ $row['order']['no_kamar_perawatan'] ?? '-' }}
+ Kelas: {{ $row['order']['kelas_perawatan'] ?? '-' }} + @elseif ($jenis === 'masyarakat umum') + {{ $row['order']['alamat'] ?? '-' }} + @elseif ($jenis === 'karyawan rsab harapan kita') + Bagian: {{ $row['order']['bagian_instalasi'] ?? '-' }}
+ Ext: {{ $row['order']['no_ekstensien'] ?? '-' }} + @else + - + @endif +
{{ $row['jumlah'] ?? 0 }}{{ number_format($row['harga_satuan'], 0, ',', '.') }}
Tidak ada data
+ + + + + diff --git a/resources/views/dashboard/pesanan/pending/index.blade.php b/resources/views/dashboard/pesanan/pending/index.blade.php index 40cac4e..e980ebe 100644 --- a/resources/views/dashboard/pesanan/pending/index.blade.php +++ b/resources/views/dashboard/pesanan/pending/index.blade.php @@ -11,6 +11,10 @@
Pesanan Pending
+
+
@@ -22,6 +26,8 @@ placeholder="Pilih tanggal" readonly>
+
+
@@ -32,6 +38,7 @@ @include('dashboard.pesanan.pending.modal.action') @include('dashboard.pesanan.pending.modal.confirmBilling') @include('dashboard.pesanan.pending.modal.actionProgressPesanan') +@include('dashboard.pesanan.pending.modal.export') diff --git a/resources/views/dashboard/pesanan/pending/modal/export.blade.php b/resources/views/dashboard/pesanan/pending/modal/export.blade.php new file mode 100644 index 0000000..7b1baff --- /dev/null +++ b/resources/views/dashboard/pesanan/pending/modal/export.blade.php @@ -0,0 +1,43 @@ + + diff --git a/resources/views/dashboard/pesanan/pending/pdf.blade.php b/resources/views/dashboard/pesanan/pending/pdf.blade.php new file mode 100644 index 0000000..d0e2d77 --- /dev/null +++ b/resources/views/dashboard/pesanan/pending/pdf.blade.php @@ -0,0 +1,162 @@ + + + + + Laporan Pesanan + + + + +
+

Laporan Pesanan Pending

+ @if($startDate === $endDate) +
Periode: {{ $startDate }}
+ @else +
Periode: {{ $startDate }} - {{ $endDate }}
+ @endif +
RSAB Harapan Kita
+
+ +
+ Dicetak pada: {{ $waktu_cetak }} +
+ + + + + + + + + + + + + + + + + @php $no = 1; @endphp + @forelse ($orders as $order) + @foreach ($order->orderDetail as $i => $detail) + + + + + + + + + + + + @endforeach + @empty + + + + @endforelse + + + +
NoNo OrderNama PemesanMenuStatus OrderJumlahHarga Satuan (Rp)Tanggal AntarWaktu
{{ $i === 0 ? $no++ : '' }}{{ $i === 0 ? $order->no_order : '' }} + @if ($i === 0) + {{ $order->nama_pemesan }} + @if ($order->jenis_customer) +
({{ $order->jenis_customer }}) + @endif + @endif +
{{ $detail->menu->nama_menu ?? '-' }}{{ $detail->status_order ?? '-' }}{{ $detail->jumlah }}{{ number_format($detail->harga_satuan, 0, ',', '.') }} + {{ $detail->tgl_antar + ? \Carbon\Carbon::parse($detail->tgl_antar)->locale('id')->translatedFormat('d F Y') + : '-' }} + {{ $detail->type }}
Tidak ada data pesanan
+ + + + + diff --git a/resources/views/dashboard/pesanan/selesai/index.blade.php b/resources/views/dashboard/pesanan/selesai/index.blade.php index 4b3ce6e..4d5197d 100644 --- a/resources/views/dashboard/pesanan/selesai/index.blade.php +++ b/resources/views/dashboard/pesanan/selesai/index.blade.php @@ -11,6 +11,10 @@
Pesanan Selesai
+
+
@@ -22,6 +26,8 @@ placeholder="Pilih tanggal" readonly>
+
+
@@ -30,6 +36,7 @@
@include('dashboard.pesanan.selesai.modal.actionPesananSelesai') +@include('dashboard.pesanan.selesai.modal.export') diff --git a/resources/views/dashboard/pesanan/selesai/modal/export.blade.php b/resources/views/dashboard/pesanan/selesai/modal/export.blade.php new file mode 100644 index 0000000..3e318cb --- /dev/null +++ b/resources/views/dashboard/pesanan/selesai/modal/export.blade.php @@ -0,0 +1,43 @@ + + diff --git a/resources/views/dashboard/pesanan/selesai/pdf.blade.php b/resources/views/dashboard/pesanan/selesai/pdf.blade.php new file mode 100644 index 0000000..94b74a1 --- /dev/null +++ b/resources/views/dashboard/pesanan/selesai/pdf.blade.php @@ -0,0 +1,162 @@ + + + + + Laporan Pesanan + + + + +
+

Laporan Pesanan Selesai

+ @if($startDate === $endDate) +
Periode: {{ $startDate }}
+ @else +
Periode: {{ $startDate }} - {{ $endDate }}
+ @endif +
RSAB Harapan Kita
+
+ +
+ Dicetak pada: {{ $waktu_cetak }} +
+ + + + + + + + + + + + + + + + + @php $no = 1; @endphp + @forelse ($orders as $order) + @foreach ($order->orderDetail as $i => $detail) + + + + + + + + + + + + @endforeach + @empty + + + + @endforelse + + + +
NoNo OrderNama PemesanMenuStatus OrderJumlahHarga Satuan (Rp)Tanggal AntarWaktu
{{ $i === 0 ? $no++ : '' }}{{ $i === 0 ? $order->no_order : '' }} + @if ($i === 0) + {{ $order->nama_pemesan }} + @if ($order->jenis_customer) +
({{ $order->jenis_customer }}) + @endif + @endif +
{{ $detail->menu->nama_menu ?? '-' }}{{ $detail->status_order ?? '-' }}{{ $detail->jumlah }}{{ number_format($detail->harga_satuan, 0, ',', '.') }} + {{ $detail->tgl_antar + ? \Carbon\Carbon::parse($detail->tgl_antar)->locale('id')->translatedFormat('d F Y') + : '-' }} + {{ $detail->type }}
Tidak ada data pesanan
+ + + + + diff --git a/resources/views/guest/checkout/checkout_payment.blade.php b/resources/views/guest/checkout/checkout_payment.blade.php index 0b9b672..cbc5d74 100644 --- a/resources/views/guest/checkout/checkout_payment.blade.php +++ b/resources/views/guest/checkout/checkout_payment.blade.php @@ -46,6 +46,8 @@
+ @include('guest.checkout.modal.noteOrder') + @include('guest.checkout.modal.confirmPaymentBilling') diff --git a/resources/views/guest/checkout/modal/confirmPaymentBilling.blade.php b/resources/views/guest/checkout/modal/confirmPaymentBilling.blade.php new file mode 100644 index 0000000..43a2980 --- /dev/null +++ b/resources/views/guest/checkout/modal/confirmPaymentBilling.blade.php @@ -0,0 +1,36 @@ + + diff --git a/resources/views/guest/checkout/modal/noteOrder.blade.php b/resources/views/guest/checkout/modal/noteOrder.blade.php new file mode 100644 index 0000000..27263a1 --- /dev/null +++ b/resources/views/guest/checkout/modal/noteOrder.blade.php @@ -0,0 +1,28 @@ + diff --git a/resources/views/guest/checkout/step/step3.blade.php b/resources/views/guest/checkout/step/step3.blade.php index 3b7701a..4d7c591 100644 --- a/resources/views/guest/checkout/step/step3.blade.php +++ b/resources/views/guest/checkout/step/step3.blade.php @@ -4,7 +4,7 @@
- Pembayaran
@@ -15,63 +15,63 @@
Detail Pembayaran
-
    - -
  • -
    - No Order -
    -
    - -
    - -
    + +
- + +
+
Bank
+
Bank BCA
+
- -
  • - Bank - Bank BCA -
  • + +
    +
    Nama Rek.
    +
    RSAB Harapan Kita
    +
    - -
  • - Nama Rek. - RSAB Harapan Kita -
  • - - -
  • -
    - No.Rek -
    -
    - -
    - 1234-5678-9101 +
    + 1234-5678-9101 +
  • - - -
  • - Nominal - -
  • + +
    +
    Nominal
    +
    Rp 0
    +
    + + +
    +
    Waktu Pembayaran
    +
    +
    + +
    +
    - -
  • - Waktu Pembayaran - -
  • -

    Mohon untuk melakukan pembayaran sebelum batas waktu yang tertera, lalu unggah bukti pembayaran sebagai konfirmasi.

    diff --git a/resources/views/guest/layout_mail.blade.php b/resources/views/guest/layout_mail.blade.php new file mode 100644 index 0000000..8626944 --- /dev/null +++ b/resources/views/guest/layout_mail.blade.php @@ -0,0 +1,25 @@ +
    +

    ✅ Pembayaran Berhasil Diverifikasi

    +

    Halo, {$this->nama},

    +

    Pembayaran kamu untuk pesanan #{$this->no_order} telah berhasil kami verifikasi.

    + + + + + + + + + + + + + + +
    Nomor Order{$this->no_order}
    Total PembayaranRp " . number_format($this->total_harga, 0, ',', '.') . "
    StatusPembayaran Diterima
    + +

    Pesanan kamu sedang kami proses. Silakan tunggu pemberitahuan berikutnya untuk pengambilan makanan.

    + +
    +

    © " . date('Y') . " RSAB Harapan Kita

    +
    diff --git a/resources/views/mail/notifikasi-customer.blade.php b/resources/views/mail/notifikasi-customer.blade.php new file mode 100644 index 0000000..de9a155 --- /dev/null +++ b/resources/views/mail/notifikasi-customer.blade.php @@ -0,0 +1,12 @@ + +# Introduction + +The body of your message. + + +Button Text + + +Thanks,
    +{{ config('app.name') }} +
    diff --git a/routes/web.php b/routes/web.php index e4fa830..2a93925 100644 --- a/routes/web.php +++ b/routes/web.php @@ -8,6 +8,8 @@ use App\Http\Controllers\KarbohidratController; use App\Http\Controllers\KlasifikasiMenuController; use App\Http\Controllers\MenuController; use App\Http\Controllers\PesananController; +use App\Mail\NotifikasiCustomer; +use Illuminate\Support\Facades\Mail; use Illuminate\Support\Facades\Route; @@ -43,16 +45,19 @@ Route::group(['middleware' => ['auth']], function(){ Route::get('/pending', [PesananController::class, 'index']); Route::get('datatable/pending', [PesananController::class, 'getDataPending']); + Route::post('pending/export', [PesananController::class, 'exportPending']); Route::put('/pending/action/{order_id}', [PesananController::class, 'actionOrder']); Route::put('/pending/action-billing/{order_id}', [PesananController::class, 'actionOrderViaBilling']); Route::get('/pending/action-progress-order/{order_id}', [PesananController::class, 'getDataOrderDetail']); Route::post('/pending/update-detail-status/{order_id}', [PesananController::class, 'updateDetailStatusOrder']); Route::get('/selesai', [PesananController::class, 'indexSelesai']); + Route::post('/selesai/export', [PesananController::class, 'exportSelesai']); Route::get('datatable/selesai', [PesananController::class, 'getDataSelesai']); Route::get('/pekerjaan', [PesananController::class, 'pekerjaan']); Route::get('datatable/pekerjaan', [PesananController::class, 'getPekerjaan']); + Route::post('pekerjaan/export', [PesananController::class, 'exportPekerjaan']); Route::get('/pekerjaan/detail/{id}', [PesananController::class, 'getPekerjaanDetail']); }); @@ -69,3 +74,10 @@ Route::get('/success-page', [CustomerController::class, 'success']); Route::get('/check-order', [CustomerController::class, 'checkOrder']); Route::get('/check-order/search', [CustomerController::class, 'searchOrder']); +// Route::get('/send-mail', function(){ +// Mail::to('skyjok14@gmail.com')->queue(new NotifikasiCustomer('Test')); +// }); + +Route::get('/dumy', function(){ + return view('guest.layout_mail'); +});