progress pesanan
This commit is contained in:
parent
9dcbfe87fd
commit
7306d80565
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
namespace App\Http\Controllers;
|
namespace App\Http\Controllers;
|
||||||
|
|
||||||
|
use App\Models\Karbohidrat;
|
||||||
use App\Models\Order;
|
use App\Models\Order;
|
||||||
use App\Models\OrderDetail;
|
use App\Models\OrderDetail;
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
@ -12,6 +13,7 @@ use Illuminate\Support\Str;
|
|||||||
class CustomerController extends Controller
|
class CustomerController extends Controller
|
||||||
{
|
{
|
||||||
public function index(){
|
public function index(){
|
||||||
|
|
||||||
$payload = [
|
$payload = [
|
||||||
'title' => 'Halaman Utama'
|
'title' => 'Halaman Utama'
|
||||||
];
|
];
|
||||||
@ -79,7 +81,7 @@ class CustomerController extends Controller
|
|||||||
->select('dmph.master_menu_id', 'dmph.tgl_harian')
|
->select('dmph.master_menu_id', 'dmph.tgl_harian')
|
||||||
->get()
|
->get()
|
||||||
->groupBy('master_menu_id');
|
->groupBy('master_menu_id');
|
||||||
|
|
||||||
// Step 3: Gabungkan data menu + klasifikasi
|
// Step 3: Gabungkan data menu + klasifikasi
|
||||||
$result = collect($paginated->items())->map(function ($menu) use ($klasifikasi, $dmph) {
|
$result = collect($paginated->items())->map(function ($menu) use ($klasifikasi, $dmph) {
|
||||||
return [
|
return [
|
||||||
@ -190,8 +192,10 @@ class CustomerController extends Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function checkout(){
|
public function checkout(){
|
||||||
|
$karbohidrat = Karbohidrat::where('statusenabled', true)->select('karbohidrat_id', 'nama_karbohidrat')->get();
|
||||||
$payload = [
|
$payload = [
|
||||||
'title' => 'Checkout '
|
'title' => 'Checkout ',
|
||||||
|
'karbohidrat' => $karbohidrat
|
||||||
];
|
];
|
||||||
return view('guest.checkout.checkout_payment', $payload);
|
return view('guest.checkout.checkout_payment', $payload);
|
||||||
}
|
}
|
||||||
@ -224,7 +228,8 @@ class CustomerController extends Controller
|
|||||||
'bagian_instalasi' => $biodataResult['bagian_instalasi'],
|
'bagian_instalasi' => $biodataResult['bagian_instalasi'],
|
||||||
'no_ekstensien' => $biodataResult['no_ekstensien'],
|
'no_ekstensien' => $biodataResult['no_ekstensien'],
|
||||||
'total_harga' => $totalHarga,
|
'total_harga' => $totalHarga,
|
||||||
'status_order' => "Belum Bayar"
|
'status_order' => "Belum Bayar",
|
||||||
|
'email' => $biodataResult['email'],
|
||||||
];
|
];
|
||||||
$order = Order::create($payloadOrder);
|
$order = Order::create($payloadOrder);
|
||||||
foreach ($dataCart as $cart) {
|
foreach ($dataCart as $cart) {
|
||||||
@ -237,6 +242,7 @@ class CustomerController extends Controller
|
|||||||
$payloadOrderDetail['jumlah'] = $value['jumlah'];
|
$payloadOrderDetail['jumlah'] = $value['jumlah'];
|
||||||
$payloadOrderDetail['tgl_antar'] = $value['tgl'];
|
$payloadOrderDetail['tgl_antar'] = $value['tgl'];
|
||||||
$payloadOrderDetail['type'] = $value['kategoriPemesanan'];
|
$payloadOrderDetail['type'] = $value['kategoriPemesanan'];
|
||||||
|
$payloadOrderDetail['karbohidrat_id'] = $value['karbohidrat_id'];
|
||||||
if($cart['jenis_menu'] === "paket"){
|
if($cart['jenis_menu'] === "paket"){
|
||||||
$payloadOrderDetail['master_paket_menu_id'] = $cart['id_menu'];
|
$payloadOrderDetail['master_paket_menu_id'] = $cart['id_menu'];
|
||||||
}else{
|
}else{
|
||||||
@ -267,17 +273,23 @@ class CustomerController extends Controller
|
|||||||
$noOrder = request('no_order_result');
|
$noOrder = request('no_order_result');
|
||||||
$evidence = request()->file('bukti_pembayaran');
|
$evidence = request()->file('bukti_pembayaran');
|
||||||
|
|
||||||
|
$caraPembayaran = request('cara_pembayaran');
|
||||||
$order = Order::where('no_order', $noOrder)->first();
|
$order = Order::where('no_order', $noOrder)->first();
|
||||||
// Simpan file ke storage
|
// Simpan file ke storage
|
||||||
$path = $evidence->store('bukti_pembayaran', 'public');
|
$payload = [
|
||||||
|
'tgl_pembayaran' => Carbon::now()
|
||||||
|
];
|
||||||
|
if($caraPembayaran === "transfer"){
|
||||||
|
$path = $evidence->store('bukti_pembayaran', 'public');
|
||||||
|
$payload['bukti_pembayaran'] = $path;
|
||||||
|
$payload['cara_pembayaran'] = 'Transfer';
|
||||||
|
$payload['status_order'] = 'Menunggu Konfirmasi Pembayaran';
|
||||||
|
}else{
|
||||||
|
$payload['cara_pembayaran'] = 'Billing';
|
||||||
|
$payload['status_order'] = 'Menunggu Konfirmasi Pembayaran Via Billing';
|
||||||
|
}
|
||||||
// Update data order
|
// Update data order
|
||||||
$order->update([
|
$order->update($payload);
|
||||||
'bukti_pembayaran' => $path,
|
|
||||||
'cara_pembayaran' => 'Transfer',
|
|
||||||
'tgl_pembayaran' => Carbon::now(),
|
|
||||||
'status_order' => "Menunggu Konfirmasi Pembayaran"
|
|
||||||
]);
|
|
||||||
|
|
||||||
DB::commit();
|
DB::commit();
|
||||||
session()->flash('payment_success', true);
|
session()->flash('payment_success', true);
|
||||||
|
|||||||
@ -127,4 +127,9 @@ class KarbohidratController extends Controller
|
|||||||
$data = Karbohidrat::where('statusenabled', true)->get();
|
$data = Karbohidrat::where('statusenabled', true)->get();
|
||||||
return $data;
|
return $data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function option(){
|
||||||
|
$data = Karbohidrat::where('statusenabled', true)->select('karbohidrat_id', 'nama_karbohidrat')->get();
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -28,6 +28,7 @@ class PesananController extends Controller
|
|||||||
->where('o.statusenabled', true)
|
->where('o.statusenabled', true)
|
||||||
->select(
|
->select(
|
||||||
'o.order_id',
|
'o.order_id',
|
||||||
|
'o.entry_at',
|
||||||
'o.no_order',
|
'o.no_order',
|
||||||
'o.nama_pemesan',
|
'o.nama_pemesan',
|
||||||
'o.jenis_customer',
|
'o.jenis_customer',
|
||||||
@ -37,7 +38,7 @@ class PesananController extends Controller
|
|||||||
'o.note_dibatalkan',
|
'o.note_dibatalkan',
|
||||||
'od.status_order as detail_status_order'
|
'od.status_order as detail_status_order'
|
||||||
)->get()->groupBy('order_id');
|
)->get()->groupBy('order_id');
|
||||||
|
|
||||||
$grouped = $orders->map(function($items){
|
$grouped = $orders->map(function($items){
|
||||||
$first = $items->first();
|
$first = $items->first();
|
||||||
$totalDetail = $items->count();
|
$totalDetail = $items->count();
|
||||||
@ -45,6 +46,7 @@ class PesananController extends Controller
|
|||||||
$progress = $totalDetail > 0 ? round(($selesaiDetail / $totalDetail) * 100) : 0;
|
$progress = $totalDetail > 0 ? round(($selesaiDetail / $totalDetail) * 100) : 0;
|
||||||
return [
|
return [
|
||||||
'order_id' => $first->order_id,
|
'order_id' => $first->order_id,
|
||||||
|
'entry_at' => $first->entry_at,
|
||||||
'no_order' => $first->no_order,
|
'no_order' => $first->no_order,
|
||||||
'nama_pemesan' => $first->nama_pemesan,
|
'nama_pemesan' => $first->nama_pemesan,
|
||||||
'jenis_customer' => $first->jenis_customer,
|
'jenis_customer' => $first->jenis_customer,
|
||||||
@ -56,6 +58,9 @@ class PesananController extends Controller
|
|||||||
'selesai_detail' => $selesaiDetail,
|
'selesai_detail' => $selesaiDetail,
|
||||||
'note_dibatalkan' => $first->note_dibatalkan,
|
'note_dibatalkan' => $first->note_dibatalkan,
|
||||||
];
|
];
|
||||||
|
})
|
||||||
|
->filter(function($item){
|
||||||
|
return $item['total_detail'] > 0 && $item['total_detail'] != $item['selesai_detail'];
|
||||||
})->values();
|
})->values();
|
||||||
return response()->json([
|
return response()->json([
|
||||||
'status' => true,
|
'status' => true,
|
||||||
@ -138,8 +143,63 @@ class PesananController extends Controller
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function indexSelesai()
|
||||||
|
{
|
||||||
|
$payload = [
|
||||||
|
'title' => 'Pesanan Selesai'
|
||||||
|
];
|
||||||
|
return view('dashboard.pesanan.selesai.index', $payload);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function getDataSelesai(){
|
||||||
|
$orders = DB::connection('dbOrderGizi')->table('public.order as o')
|
||||||
|
->leftJoin('public.order_detail as od', 'od.order_id', '=', 'o.order_id')
|
||||||
|
->where(['o.statusenabled' => true])
|
||||||
|
->select(
|
||||||
|
'o.order_id',
|
||||||
|
'o.entry_at',
|
||||||
|
'o.no_order',
|
||||||
|
'o.nama_pemesan',
|
||||||
|
'o.jenis_customer',
|
||||||
|
'o.total_harga',
|
||||||
|
'o.status_order',
|
||||||
|
'o.bukti_pembayaran',
|
||||||
|
'o.note_dibatalkan',
|
||||||
|
'od.status_order as detail_status_order'
|
||||||
|
)->get()->groupBy('order_id');
|
||||||
|
|
||||||
|
$grouped = $orders->map(function($items){
|
||||||
|
$first = $items->first();
|
||||||
|
$totalDetail = $items->count();
|
||||||
|
$selesaiDetail = $items->where('detail_status_order', 'Selesai')->count();
|
||||||
|
$progress = $totalDetail > 0 ? round(($selesaiDetail / $totalDetail) * 100) : 0;
|
||||||
|
return [
|
||||||
|
'order_id' => $first->order_id,
|
||||||
|
'entry_at' => $first->entry_at,
|
||||||
|
'no_order' => $first->no_order,
|
||||||
|
'nama_pemesan' => $first->nama_pemesan,
|
||||||
|
'jenis_customer' => $first->jenis_customer,
|
||||||
|
'total_harga' => $first->total_harga,
|
||||||
|
'status_order' => $first->status_order,
|
||||||
|
'bukti_pembayaran' => $first->bukti_pembayaran,
|
||||||
|
'progress' => $progress,
|
||||||
|
'total_detail' => $totalDetail,
|
||||||
|
'selesai_detail' => $selesaiDetail,
|
||||||
|
'note_dibatalkan' => $first->note_dibatalkan,
|
||||||
|
];
|
||||||
|
})
|
||||||
|
->filter(function($item){
|
||||||
|
return $item['total_detail'] > 0 && $item['total_detail'] === $item['selesai_detail'];
|
||||||
|
})
|
||||||
|
->values();
|
||||||
|
|
||||||
|
return response()->json([
|
||||||
|
'status' => true,
|
||||||
|
'rows' => $grouped->values(),
|
||||||
|
'total' => $grouped->count()
|
||||||
|
]);
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* Show the form for creating a new resource.
|
* Show the form for creating a new resource.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -34,9 +34,13 @@ class Order extends Model
|
|||||||
'berat_badan',
|
'berat_badan',
|
||||||
'ruang_perawatan',
|
'ruang_perawatan',
|
||||||
'bagian_instalasi',
|
'bagian_instalasi',
|
||||||
'note_dibatalkan'
|
'note_dibatalkan',
|
||||||
|
'email'
|
||||||
];
|
];
|
||||||
|
|
||||||
|
protected $cast = [
|
||||||
|
'tgl_pembayaran' => 'datetime'
|
||||||
|
];
|
||||||
|
|
||||||
public function orderDetail(){
|
public function orderDetail(){
|
||||||
return $this->hasMany(OrderDetail::class, 'order_id')->with('paketMenu', 'menu');
|
return $this->hasMany(OrderDetail::class, 'order_id')->with('paketMenu', 'menu');
|
||||||
|
|||||||
@ -21,10 +21,12 @@ class OrderDetail extends Model
|
|||||||
'tgl_antar',
|
'tgl_antar',
|
||||||
'type',
|
'type',
|
||||||
'order_id',
|
'order_id',
|
||||||
'status_order'
|
'status_order',
|
||||||
|
'karbohidrat_id'
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public function menu(){
|
public function menu(){
|
||||||
return $this->belongsTo(Menu::class, 'master_menu_id', 'master_menu_id')->select('master_menu_id', 'nama_menu', 'foto');
|
return $this->belongsTo(Menu::class, 'master_menu_id', 'master_menu_id')->select('master_menu_id', 'nama_menu', 'foto');
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,3 +1,4 @@
|
|||||||
|
|
||||||
async function submitOrderToServer(){
|
async function submitOrderToServer(){
|
||||||
const totalHarga = hitungTotalHarga();
|
const totalHarga = hitungTotalHarga();
|
||||||
|
|
||||||
@ -91,10 +92,8 @@ async function submitOrderToServer(){
|
|||||||
confirmButtonText: 'Berhasil!',
|
confirmButtonText: 'Berhasil!',
|
||||||
confirmButtonColor: '#28a745'
|
confirmButtonColor: '#28a745'
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
window.location.href = "/success-page"; // ganti dengan rute sukses milikmu
|
window.location.href = "/success-page"; // kehalaman success
|
||||||
});
|
});
|
||||||
|
|
||||||
; // redirect atau reset step
|
|
||||||
} else {
|
} else {
|
||||||
alert(result.message || "Terjadi kesalahan.");
|
alert(result.message || "Terjadi kesalahan.");
|
||||||
}
|
}
|
||||||
|
|||||||
@ -11,18 +11,16 @@ document.addEventListener('DOMContentLoaded', () => {
|
|||||||
$("#cartButton").addClass('d-none');
|
$("#cartButton").addClass('d-none');
|
||||||
$("#no_order_result").val(order_id)
|
$("#no_order_result").val(order_id)
|
||||||
let currentStep = 0;
|
let currentStep = 0;
|
||||||
let cart = JSON.parse(sessionStorage.getItem('cart') || '[]');
|
|
||||||
// Redirect jika cart kosong
|
|
||||||
if (cart.length === 0) {
|
|
||||||
window.location.href = "/";
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Setup button step
|
// Setup button step
|
||||||
document.querySelectorAll('.next-step').forEach(btn => {
|
document.querySelectorAll('.next-step').forEach(btn => {
|
||||||
btn.addEventListener('click', async () => {
|
btn.addEventListener('click', async () => {
|
||||||
|
let cart = JSON.parse(sessionStorage.getItem('cart') || '[]');
|
||||||
|
|
||||||
|
if (cart.length === 0) {
|
||||||
|
window.location.href = "/";
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (currentStep === 0){
|
if (currentStep === 0){
|
||||||
if(!validateStepOne()) return
|
if(!validateStepOne()) return
|
||||||
isiKonfirmasi();
|
isiKonfirmasi();
|
||||||
@ -33,7 +31,26 @@ document.addEventListener('DOMContentLoaded', () => {
|
|||||||
alert(errorMessage);
|
alert(errorMessage);
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if (!sessionStorage.getItem('order_id')) {
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let checkout_biodata = JSON.parse(sessionStorage.getItem('checkout_biodata') || '{}');
|
||||||
|
|
||||||
|
if (!checkout_biodata.nama_pemesan) {
|
||||||
|
window.location.href = "/";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!sessionStorage.getItem('order_id')) {
|
||||||
await submitOrderToServer(); // async function simpan ke server
|
await submitOrderToServer(); // async function simpan ke server
|
||||||
}
|
}
|
||||||
currentStep++;
|
currentStep++;
|
||||||
@ -46,6 +63,11 @@ document.addEventListener('DOMContentLoaded', () => {
|
|||||||
|
|
||||||
document.querySelectorAll('.prev-step').forEach(btn => {
|
document.querySelectorAll('.prev-step').forEach(btn => {
|
||||||
btn.addEventListener('click', () => {
|
btn.addEventListener('click', () => {
|
||||||
|
let cart = JSON.parse(sessionStorage.getItem('cart') || '[]');
|
||||||
|
if (cart.length === 0) {
|
||||||
|
window.location.href = "/";
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (currentStep > 0) {
|
if (currentStep > 0) {
|
||||||
currentStep--;
|
currentStep--;
|
||||||
showStep(currentStep);
|
showStep(currentStep);
|
||||||
@ -121,6 +143,7 @@ if (typeof checkout_biodata === 'object') {
|
|||||||
$('#kelas_perawatan').val(checkout_biodata.kelas_perawatan);
|
$('#kelas_perawatan').val(checkout_biodata.kelas_perawatan);
|
||||||
$('#bagian_instalasi').val(checkout_biodata.bagian_instalasi);
|
$('#bagian_instalasi').val(checkout_biodata.bagian_instalasi);
|
||||||
$('#no_ekstensien').val(checkout_biodata.no_ekstensien);
|
$('#no_ekstensien').val(checkout_biodata.no_ekstensien);
|
||||||
|
$('#email').val(checkout_biodata.email);
|
||||||
}
|
}
|
||||||
|
|
||||||
function isiKonfirmasi() {
|
function isiKonfirmasi() {
|
||||||
@ -138,6 +161,7 @@ function isiKonfirmasi() {
|
|||||||
kelas_perawatan: $('#kelas_perawatan').val(),
|
kelas_perawatan: $('#kelas_perawatan').val(),
|
||||||
bagian_instalasi: $('#bagian_instalasi').val(),
|
bagian_instalasi: $('#bagian_instalasi').val(),
|
||||||
no_ekstensien: $('#no_ekstensien').val(),
|
no_ekstensien: $('#no_ekstensien').val(),
|
||||||
|
email: $('#email').val(),
|
||||||
};
|
};
|
||||||
|
|
||||||
sessionStorage.setItem('checkout_biodata', JSON.stringify(biodata));
|
sessionStorage.setItem('checkout_biodata', JSON.stringify(biodata));
|
||||||
@ -150,9 +174,6 @@ function isiKonfirmasi() {
|
|||||||
// =======================
|
// =======================
|
||||||
function renderCartSummary() {
|
function renderCartSummary() {
|
||||||
const container = document.getElementById('checkout_cart_summary');
|
const container = document.getElementById('checkout_cart_summary');
|
||||||
let now = new Date();
|
|
||||||
let today = now.toISOString().split('T')[0];
|
|
||||||
let isAfter12 = now.getHours() >= 12;
|
|
||||||
container.innerHTML = '';
|
container.innerHTML = '';
|
||||||
let totalKeseluruhan = 0;
|
let totalKeseluruhan = 0;
|
||||||
let carts = JSON.parse(sessionStorage.getItem('cart') || '[]');
|
let carts = JSON.parse(sessionStorage.getItem('cart') || '[]');
|
||||||
@ -162,36 +183,88 @@ function renderCartSummary() {
|
|||||||
let pesananHTML = '';
|
let pesananHTML = '';
|
||||||
let countDate = pesananList.length;
|
let countDate = pesananList.length;
|
||||||
|
|
||||||
pesananList.forEach((p, i) => {
|
item?.pesanan.forEach((p, i) => {
|
||||||
let isTodayAndLate = p.tgl === today && isAfter12
|
let selectedDate = new Date(p.tgl);
|
||||||
|
|
||||||
|
let now = new Date();
|
||||||
|
let jam = now.getHours();
|
||||||
|
let isToday = selectedDate.toDateString() === now.toDateString();
|
||||||
|
|
||||||
|
let disableSiang = isToday && jam >= 10;
|
||||||
|
let disableSore = isToday && jam >= 13;
|
||||||
pesananHTML += `
|
pesananHTML += `
|
||||||
<div class="row g-2 align-items-center mb-2" data-item-id="${item.id}" data-index="${i}">
|
<div class="row g-2 align-items-center mb-2" data-item-id="${item.id}" data-index="${i}">
|
||||||
<div class="col-12 col-md-5">
|
<div class="col-6 col-md-3">
|
||||||
<input type="date" class="form-control form-control-sm tanggal-input" min="${today}" value="${p.tgl}"
|
<input type="text"
|
||||||
onchange="onTanggalChange(${item.id}, ${i})">
|
class="form-control form-control-sm tanggal-input"
|
||||||
|
id="tanggal-${item.id}-${i}"
|
||||||
|
readonly>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div class="col-12 col-md-3">
|
<div class="col-6 col-md-3">
|
||||||
<select class="form-select form-select-sm kategori-pemesanan-input"
|
<select class="form-select form-select-sm karbohidrat-input" onchange="onKarbohidratChange(${item.id}, ${i})">
|
||||||
onchange="onKategoriChange(${item.id}, ${i})">
|
<option value="">Pilih Karbohidrat</option>
|
||||||
<option value="" ${!p.kategoriPemesanan ? 'selected' : ''}>Kategori Pemesanan</option>
|
${(karhohidrats || []).map(item =>
|
||||||
<option value="Same Day" ${p.kategoriPemesanan === 'Same Day' ? 'selected' : ''} ${isTodayAndLate ? 'disabled' : ''}>Same Day</option>
|
`<option value="${item?.karbohidrat_id}" ${p.karbohidrat_id === item?.karbohidrat_id ? 'selected' : ''}>${item?.nama_karbohidrat}</option>`
|
||||||
<option value="Menu Normal" ${p.kategoriPemesanan === 'Menu Normal' ? 'selected' : ''} >Menu Normal
|
).join(' ')}
|
||||||
</option>
|
</select>
|
||||||
</select>
|
|
||||||
</div>
|
</div>
|
||||||
|
<div class="col-12 col-md-3">
|
||||||
|
<select class="form-select form-select-sm kategori-pemesanan-input"
|
||||||
|
data-item-id="${item.id}"
|
||||||
|
data-index="${i}"
|
||||||
|
onchange="onKategoriChange(${item.id}, ${i}, ${isToday})"
|
||||||
|
onfocus="this.dataset.previousValue = this.value"
|
||||||
|
${item?.apakah_menu_siang || item?.apakah_menu_sore ? '' : 'disabled'}>
|
||||||
|
|
||||||
|
${item?.apakah_someday
|
||||||
|
? (
|
||||||
|
item?.apakah_menu_siang && item?.apakah_menu_sore
|
||||||
|
? `
|
||||||
|
<option value="Makan Siang" ${p?.kategoriPemesanan === 'Makan Siang' ? 'selected' : ''} ${disableSiang ? 'disabled' : ''}>Makan Siang</option>
|
||||||
|
<option value="Makan Sore" ${p?.kategoriPemesanan === 'Makan Sore' ? 'selected' : ''} ${disableSore ? 'disabled' : ''}>Makan Sore</option>
|
||||||
|
`
|
||||||
|
: item?.apakah_menu_siang
|
||||||
|
? `<option value="Makan Siang" selected ${disableSiang ? 'disabled' : ''}>Makan Siang</option>`
|
||||||
|
: item?.apakah_menu_sore
|
||||||
|
? `<option value="Makan Sore" selected ${disableSore ? 'disabled' : ''}>Makan Sore</option>`
|
||||||
|
: `<option value="" disabled selected>Tidak tersedia</option>`
|
||||||
|
)
|
||||||
|
: (
|
||||||
|
item?.apakah_menu_siang && item?.apakah_menu_sore
|
||||||
|
? `
|
||||||
|
<option value="Makan Siang" ${p?.kategoriPemesanan === 'Makan Siang' ? 'selected' : ''}>Makan Siang</option>
|
||||||
|
<option value="Makan Sore" ${p?.kategoriPemesanan === 'Makan Sore' ? 'selected' : ''}>Makan Sore</option>
|
||||||
|
`
|
||||||
|
: item?.apakah_menu_siang
|
||||||
|
? `<option value="Makan Siang" selected>Makan Siang</option>`
|
||||||
|
: item?.apakah_menu_sore
|
||||||
|
? `<option value="Makan Sore" selected>Makan Sore</option>`
|
||||||
|
: `<option value="" disabled selected>Tidak tersedia</option>`
|
||||||
|
)
|
||||||
|
}
|
||||||
|
</select>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<div class="col-6 col-md-2">
|
<div class="col-6 col-md-2">
|
||||||
<input type="number" class="form-control form-control-sm jumlah-input" value="${p.jumlah}"
|
<input type="number" class="form-control form-control-sm jumlah-input" value="${p.jumlah}"
|
||||||
onchange="onJumlahChange(${item.id}, ${i})">
|
onchange="onJumlahChange(${item.id}, ${i})">
|
||||||
</div>
|
</div>
|
||||||
<div class="col-6 col-md-2 text-end">
|
<div class="col-6 col-md-1 text-end">
|
||||||
<button type="button" class="btn btn-sm btn-danger w-100 w-md-auto"
|
<button type="button" class="btn btn-sm btn-danger w-100 w-md-auto"
|
||||||
onclick="removeOrderDate(${item.id}, ${i}, ${countDate})">
|
onclick="removeOrderDate(${item.id}, ${i}, ${countDate})">
|
||||||
<i class="fa-solid fa-trash"></i>
|
<i class="fa-solid fa-trash"></i>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>`;
|
</div>`;
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
const harga = checkout_biodata.jenis_customer === 'Karyawan RSAB Harapan Kita' ? item.harga_karyawan || 0 :
|
const harga = checkout_biodata.jenis_customer === 'Karyawan RSAB Harapan Kita' ? item.harga_karyawan || 0 :
|
||||||
item.harga_kp || 0;
|
item.harga_kp || 0;
|
||||||
@ -213,10 +286,26 @@ function renderCartSummary() {
|
|||||||
<h5 class="card-title">${item.nama_menu}</h5>
|
<h5 class="card-title">${item.nama_menu}</h5>
|
||||||
<div class="text-muted small">Rp ${parseInt(harga).toLocaleString('id-ID')}</div>
|
<div class="text-muted small">Rp ${parseInt(harga).toLocaleString('id-ID')}</div>
|
||||||
<p class="card-text text-muted small mb-3">${item.deskripsi || ''}</p>
|
<p class="card-text text-muted small mb-3">${item.deskripsi || ''}</p>
|
||||||
|
|
||||||
|
<div class="mb-2 small text-muted">
|
||||||
|
<i class="fa fa-calendar-check me-1"></i>
|
||||||
|
${
|
||||||
|
item.apakah_someday
|
||||||
|
? 'Tersedia setiap hari (Senin - Minggu) '
|
||||||
|
: (item.tgl_tersedia
|
||||||
|
? `Tersedia pada tanggal: ${item.tgl_tersedia}`
|
||||||
|
: 'Tidak ada info tanggal tersedia'
|
||||||
|
)
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
<div class="mb-2 small text-muted">
|
||||||
|
<i class="fa fa-utensils me-1"></i>
|
||||||
|
Menu: <strong>${item.apakah_someday ? 'Someday' : 'Menu Normal'}</strong>
|
||||||
|
</div>
|
||||||
${pesananHTML}
|
${pesananHTML}
|
||||||
<div class="mt-3 d-flex justify-content-between align-items-center">
|
<div class="mt-3 d-flex justify-content-between align-items-center">
|
||||||
<button type="button" class="btn btn-sm btn-outline-success"
|
<button type="button" class="btn btn-sm btn-outline-success"
|
||||||
onclick="addOrderDate(${item.id})">+ Tambah Tanggal</button>
|
onclick="addOrderDate(${item.id}, ${item?.apakah_menu_sore})">+ Tambah Tanggal</button>
|
||||||
<div><strong>Total:</strong> <span class="text-success">Rp
|
<div><strong>Total:</strong> <span class="text-success">Rp
|
||||||
${itemTotal.toLocaleString('id-ID')}</span></div>
|
${itemTotal.toLocaleString('id-ID')}</span></div>
|
||||||
|
|
||||||
@ -226,6 +315,9 @@ function renderCartSummary() {
|
|||||||
</div>
|
</div>
|
||||||
</div>`;
|
</div>`;
|
||||||
container.insertAdjacentHTML('beforeend', itemHTML);
|
container.insertAdjacentHTML('beforeend', itemHTML);
|
||||||
|
pesananList.forEach((p, i) => {
|
||||||
|
initFlatpickrTersedia(item, i);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
container.insertAdjacentHTML('beforeend', `
|
container.insertAdjacentHTML('beforeend', `
|
||||||
<div class="text-end mt-4">
|
<div class="text-end mt-4">
|
||||||
@ -257,22 +349,58 @@ function onTanggalChange(itemId, index) {
|
|||||||
renderCartSummary();
|
renderCartSummary();
|
||||||
}
|
}
|
||||||
|
|
||||||
function onKategoriChange(itemId, index) {
|
function onKarbohidratChange(itemId, index){
|
||||||
let cart = JSON.parse(sessionStorage.getItem('cart') || '[]');
|
let cart = JSON.parse(sessionStorage.getItem('cart') || '[]');
|
||||||
const kategori = $(`[data-item-id='${itemId}'][data-index='${index}'] .kategori-pemesanan-input`).val();
|
const input = document.querySelector(`div[data-item-id='${itemId}'][data-index='${index}'] .karbohidrat-input`);
|
||||||
cart.find(item => item.id === itemId).pesanan[index].kategoriPemesanan = kategori;
|
cart.find(item => item.id === itemId).pesanan[index].karbohidrat_id = parseInt(input.value);
|
||||||
sessionStorage.setItem('cart', JSON.stringify(cart));
|
sessionStorage.setItem('cart', JSON.stringify(cart));
|
||||||
renderCartSummary();
|
renderCartSummary();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function onKategoriChange(itemId, index, isToday) {
|
||||||
|
let cart = JSON.parse(sessionStorage.getItem('cart') || '[]');
|
||||||
|
const selectEl = document.querySelector(`.kategori-pemesanan-input[data-item-id='${itemId}'][data-index='${index}']`);
|
||||||
|
const kategori = selectEl.value;
|
||||||
|
let now = new Date();
|
||||||
|
let jam = now.getHours();
|
||||||
|
console.log(isToday);
|
||||||
|
|
||||||
|
if (kategori === "Makan Siang" && isToday && jam >= 10) {
|
||||||
|
batasLewat = true;
|
||||||
|
alert("Pemesanan Makan Siang hanya bisa dilakukan sebelum jam 10:00.");
|
||||||
|
} else if (kategori === "Makan Sore" && isToday && jam >= 15) {
|
||||||
|
batasLewat = true;
|
||||||
|
alert("Pemesanan Makan Sore hanya bisa dilakukan sebelum jam 13:00.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (batasLewat) {
|
||||||
|
// Kembalikan ke value sebelumnya
|
||||||
|
const previous = selectEl.dataset.previousValue || '';
|
||||||
|
selectEl.value = previous;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const item = cart.find(item => item.id === itemId);
|
||||||
|
if (item && item.pesanan && item.pesanan[index]) {
|
||||||
|
item.pesanan[index].kategoriPemesanan = kategori;
|
||||||
|
sessionStorage.setItem('cart', JSON.stringify(cart));
|
||||||
|
renderCartSummary();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// =======================
|
// =======================
|
||||||
// TAMBAH / HAPUS PESANAN
|
// TAMBAH / HAPUS PESANAN
|
||||||
// =======================
|
// =======================
|
||||||
function addOrderDate(itemId) {
|
function addOrderDate(itemId, sore) {
|
||||||
let cart = JSON.parse(sessionStorage.getItem('cart') || '[]');
|
let cart = JSON.parse(sessionStorage.getItem('cart') || '[]');
|
||||||
const item = cart.find(i => i.id === itemId);
|
const item = cart.find(i => i.id === itemId);
|
||||||
if (item && Array.isArray(item.pesanan)) {
|
if (item && Array.isArray(item.pesanan)) {
|
||||||
item.pesanan.push({ tgl: '', jumlah: 1, kategoriPemesanan: '' });
|
item.pesanan.push({
|
||||||
|
tgl: '',
|
||||||
|
jumlah: 1,
|
||||||
|
kategoriPemesanan: sore ? 'Makan Sore' : 'Makan Siang'
|
||||||
|
});
|
||||||
sessionStorage.setItem('cart', JSON.stringify(cart));
|
sessionStorage.setItem('cart', JSON.stringify(cart));
|
||||||
renderCartSummary();
|
renderCartSummary();
|
||||||
}
|
}
|
||||||
@ -293,7 +421,7 @@ function removeOrderDate(itemId, index, count) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function removeCartItem(itemId){
|
function removeCartItem(itemId){
|
||||||
let cart = JSON.parse(sessionStorage.getItem('cart') || '[]');
|
let cart = JSON.parse(sessionStorage.getItem('cart') || '[]');
|
||||||
cart = cart.filter(i => i.id !== itemId);
|
cart = cart.filter(i => i.id !== itemId);
|
||||||
sessionStorage.setItem('cart', JSON.stringify(cart));
|
sessionStorage.setItem('cart', JSON.stringify(cart));
|
||||||
@ -331,7 +459,6 @@ function validateStepOne() {
|
|||||||
const selected = jenisCustomer.value;
|
const selected = jenisCustomer.value;
|
||||||
if (selected === 'Karyawan RSAB Harapan Kita') {
|
if (selected === 'Karyawan RSAB Harapan Kita') {
|
||||||
const bagian = document.getElementById('bagian_instalasi').value.trim();
|
const bagian = document.getElementById('bagian_instalasi').value.trim();
|
||||||
const ekstension = document.getElementById('no_ekstensien').value.trim();
|
|
||||||
if (!bagian) {
|
if (!bagian) {
|
||||||
alert('Silakan lengkapi data karyawan.');
|
alert('Silakan lengkapi data karyawan.');
|
||||||
return false;
|
return false;
|
||||||
@ -368,6 +495,9 @@ function validateCartBeforeSubmit() {
|
|||||||
} else if (!pesanan.jumlah || pesanan.jumlah <= 0) {
|
} else if (!pesanan.jumlah || pesanan.jumlah <= 0) {
|
||||||
isValid = false;
|
isValid = false;
|
||||||
errorMessage = `Jumlah harus lebih dari 0 pada item "${item.nama_menu}" (baris ${i + 1})`;
|
errorMessage = `Jumlah harus lebih dari 0 pada item "${item.nama_menu}" (baris ${i + 1})`;
|
||||||
|
}else if(!pesanan.karbohidrat_id){
|
||||||
|
isValid = false;
|
||||||
|
errorMessage = `Karbohidrat belum diisi pada item "${item.nama_menu}" (baris ${i + 1})`
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@ -385,7 +515,6 @@ function hitungTotalHarga(){
|
|||||||
const harga = biodata.jenis_customer === "Karyawan RSAB Harapan Kita" ? item.harga_karyawan || 0 : item.harga_kp || 0
|
const harga = biodata.jenis_customer === "Karyawan RSAB Harapan Kita" ? item.harga_karyawan || 0 : item.harga_kp || 0
|
||||||
const itemTotal = item.pesanan?.reduce((sum, p) => sum + (p.jumlah * harga), 0);
|
const itemTotal = item.pesanan?.reduce((sum, p) => sum + (p.jumlah * harga), 0);
|
||||||
total += itemTotal
|
total += itemTotal
|
||||||
|
|
||||||
})
|
})
|
||||||
|
|
||||||
return total;
|
return total;
|
||||||
@ -413,3 +542,107 @@ function copyNoOrder() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function initFlatpickrTersedia(item, i) {
|
||||||
|
const now = new Date();
|
||||||
|
const jamFlat = now.getHours();
|
||||||
|
const menitFlat = now.getMinutes();
|
||||||
|
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(',')
|
||||||
|
.map(s => s.trim())
|
||||||
|
.filter(s => s !== '' && !isNaN(s))
|
||||||
|
.map(s => parseInt(s));
|
||||||
|
|
||||||
|
// Generate tanggal dalam format YYYY-MM-DD untuk 3 bulan ke depan
|
||||||
|
let availableDates = [];
|
||||||
|
const bulanKeDepan = 3;
|
||||||
|
|
||||||
|
for (let bulanOffset = 0; bulanOffset < bulanKeDepan; bulanOffset++) {
|
||||||
|
const baseDate = new Date(now.getFullYear(), now.getMonth() + bulanOffset, 1);
|
||||||
|
const year = baseDate.getFullYear();
|
||||||
|
const month = String(baseDate.getMonth() + 1).padStart(2, '0');
|
||||||
|
|
||||||
|
dayNumbers.forEach(day => {
|
||||||
|
const dayStr = String(day).padStart(2, '0');
|
||||||
|
const fullDateStr = `${year}-${month}-${dayStr}`;
|
||||||
|
const fullDate = new Date(`${fullDateStr}T00:00:00`);
|
||||||
|
|
||||||
|
// Jika bukan menu someday, cek aturan H-1 dan jam batas
|
||||||
|
if (item.apakah_someday) {
|
||||||
|
availableDates.push(fullDateStr);
|
||||||
|
} else {
|
||||||
|
const selisihHari = Math.floor((fullDate - now) / (1000 * 60 * 60 * 24));
|
||||||
|
if (selisihHari >= 1 || (selisihHari === 1 && !lewatBatasNormal)) {
|
||||||
|
availableDates.push(fullDateStr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
let minTanggal = 'today';
|
||||||
|
|
||||||
|
// Jika item adalah someday dan waktu sekarang sudah lewat 13:00
|
||||||
|
if (item?.apakah_someday && totalMenitFlatSekarang >= 13 * 60) {
|
||||||
|
const besok = new Date(now);
|
||||||
|
besok.setDate(now.getDate() + 1);
|
||||||
|
minTanggal = besok.toISOString().split("T")[0]; // format YYYY-MM-DD
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
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}),
|
||||||
|
defaultDate: item.pesanan[i]?.tgl || null,
|
||||||
|
onChange: function(selectedDates, dateStr) {
|
||||||
|
onTanggalChange(item.id, i, dateStr);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function toggleBuktiPembayaran() {
|
||||||
|
const metode = document.getElementById("cara_pembayaran").value;
|
||||||
|
const buktiSection = document.getElementById("bukti_section");
|
||||||
|
const buktiInput = document.getElementById("bukti_pembayaran");
|
||||||
|
|
||||||
|
if (metode === "billing") {
|
||||||
|
buktiSection.style.display = "none";
|
||||||
|
buktiInput.required = false;
|
||||||
|
} else {
|
||||||
|
buktiSection.style.display = "block";
|
||||||
|
buktiInput.required = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function validateTanggalPemesanan(item, tglDipilih) {
|
||||||
|
const now = new Date();
|
||||||
|
const jam = now.getHours();
|
||||||
|
const menit = now.getMinutes();
|
||||||
|
const totalMenit = jam * 60 + menit;
|
||||||
|
const batasWaktu = 13 * 60;
|
||||||
|
const tglSekarang = now.toISOString().split("T")[0];
|
||||||
|
|
||||||
|
if (item.apakah_someday && totalMenit >= batasWaktu && tglDipilih === tglSekarang) {
|
||||||
|
return {
|
||||||
|
valid: false,
|
||||||
|
message: `Maaf, Anda tidak bisa memilih hari ini (${tglDipilih}) untuk menu sameday karena sudah lewat jam 13:00`
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return { valid: true };
|
||||||
|
}
|
||||||
|
|||||||
@ -51,7 +51,7 @@
|
|||||||
html += `</div></div>`;
|
html += `</div></div>`;
|
||||||
return containerGuest.html(html);
|
return containerGuest.html(html);
|
||||||
|
|
||||||
}
|
}
|
||||||
let params = new URLSearchParams({
|
let params = new URLSearchParams({
|
||||||
page: filter.page || 1,
|
page: filter.page || 1,
|
||||||
per_page: filter.per_page || 12,
|
per_page: filter.per_page || 12,
|
||||||
@ -60,12 +60,12 @@
|
|||||||
}).toString();
|
}).toString();
|
||||||
|
|
||||||
containerGuest.html('<p class="text-muted">Memuat data....</p>');
|
containerGuest.html('<p class="text-muted">Memuat data....</p>');
|
||||||
|
|
||||||
|
|
||||||
fetch(`/datamenu?${params}`)
|
fetch(`/datamenu?${params}`)
|
||||||
.then(res => res.json())
|
.then(res => res.json())
|
||||||
.then(res => {
|
.then(res => {
|
||||||
|
|
||||||
if (!res.status){
|
if (!res.status){
|
||||||
return containerGuest.html('<p class="text-danger">Gagal Memuat Data...</p>');
|
return containerGuest.html('<p class="text-danger">Gagal Memuat Data...</p>');
|
||||||
}
|
}
|
||||||
@ -114,14 +114,14 @@
|
|||||||
: menu.apakah_menu_siang
|
: menu.apakah_menu_siang
|
||||||
? `<i class="fa fa-sun me-1 text-warning"></i> Tersedia untuk makan siang`
|
? `<i class="fa fa-sun me-1 text-warning"></i> Tersedia untuk makan siang`
|
||||||
: menu.apakah_menu_sore
|
: menu.apakah_menu_sore
|
||||||
? `<i class="fa fa-moon me-1 text-primary"></i> Tersedia untuk makan sore`
|
? `<i class="fa fa-sun me-1 text-info"></i> Tersedia untuk makan sore`
|
||||||
: `<i class="fa fa-ban me-1 text-danger"></i> Tidak tersedia untuk waktu makan apapun`
|
: `<i class="fa fa-ban me-1 text-danger"></i> Tidak tersedia untuk waktu makan apapun`
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="text-muted small">
|
<div class="text-muted small">
|
||||||
${
|
${
|
||||||
menu.apakah_someday
|
menu.apakah_someday
|
||||||
? `<span class="badge bg-success ms-2 tx" title="Tersedia setiap hari">Menu Someday</span>
|
? `<span class="badge bg-success ms-2 tx" title="Tersedia setiap hari">Menu Someday</span>
|
||||||
`
|
`
|
||||||
: `<span class="badge bg-warning text-dark ms-2" title="Hanya tersedia di tanggal tertentu">Menu Normal</span>
|
: `<span class="badge bg-warning text-dark ms-2" title="Hanya tersedia di tanggal tertentu">Menu Normal</span>
|
||||||
@ -152,7 +152,7 @@
|
|||||||
? `<span class="badge bg-secondary">+${(menu.klasifikasiMenu.length - 2)} lainnya</span>`
|
? `<span class="badge bg-secondary">+${(menu.klasifikasiMenu.length - 2)} lainnya</span>`
|
||||||
: ''}
|
: ''}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Tombol Order -->
|
<!-- Tombol Order -->
|
||||||
<div class="d-flex p-2 mt-auto">
|
<div class="d-flex p-2 mt-auto">
|
||||||
<button class="btn btn-outline-success w-50 me-2"
|
<button class="btn btn-outline-success w-50 me-2"
|
||||||
@ -164,7 +164,12 @@
|
|||||||
data-jenis_menu="${menu.jenis_menu}"
|
data-jenis_menu="${menu.jenis_menu}"
|
||||||
data-deskripsi="${menu.deskripsi}"
|
data-deskripsi="${menu.deskripsi}"
|
||||||
data-klasifikasi_menu="${(menu.klasifikasiMenu || []).map(tag => tag.nama_kategori_diet).join(', ')}"
|
data-klasifikasi_menu="${(menu.klasifikasiMenu || []).map(tag => tag.nama_kategori_diet).join(', ')}"
|
||||||
data-foto="${menu.foto}">
|
data-tgl_tersedia="${(menu.dmph || []).map(tgl => tgl.tgl_harian).join(', ')}"
|
||||||
|
data-foto="${menu.foto}"
|
||||||
|
data-apakah_menu_sore="${menu.apakah_menu_sore}"
|
||||||
|
data-apakah_menu_siang="${menu.apakah_menu_siang}"
|
||||||
|
data-apakah_someday="${menu.apakah_someday}"
|
||||||
|
>
|
||||||
<i class="fa-solid fa-circle-info"></i> Detail
|
<i class="fa-solid fa-circle-info"></i> Detail
|
||||||
</button>
|
</button>
|
||||||
<button class="btn btn-success w-50"
|
<button class="btn btn-success w-50"
|
||||||
@ -176,7 +181,12 @@
|
|||||||
data-jenis_menu="${menu.jenis_menu}"
|
data-jenis_menu="${menu.jenis_menu}"
|
||||||
data-deskripsi="${menu.deskripsi}"
|
data-deskripsi="${menu.deskripsi}"
|
||||||
data-klasifikasi_menu="${(menu.klasifikasiMenu || []).map(tag => tag.nama_kategori_diet).join(', ')}"
|
data-klasifikasi_menu="${(menu.klasifikasiMenu || []).map(tag => tag.nama_kategori_diet).join(', ')}"
|
||||||
data-foto="${menu.foto}">
|
data-tgl_tersedia="${(menu.dmph || []).map(tgl => tgl.tgl_harian).join(', ')}"
|
||||||
|
data-foto="${menu.foto}"
|
||||||
|
data-apakah_menu_sore="${menu.apakah_menu_sore}"
|
||||||
|
data-apakah_menu_siang="${menu.apakah_menu_siang}"
|
||||||
|
data-apakah_someday="${menu.apakah_someday}"
|
||||||
|
>
|
||||||
<i class="fas fa-shopping-cart me-1"></i> Order
|
<i class="fas fa-shopping-cart me-1"></i> Order
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
@ -282,7 +292,7 @@
|
|||||||
let idMenu = parseInt(idText.replace(/[^\d]/g, ''), 10);
|
let idMenu = parseInt(idText.replace(/[^\d]/g, ''), 10);
|
||||||
let foto = $('#cathering_order_photo').attr('src')
|
let foto = $('#cathering_order_photo').attr('src')
|
||||||
let resultFoto = foto.replace('/gambar', '');
|
let resultFoto = foto.replace('/gambar', '');
|
||||||
|
|
||||||
let namaMenu = $("#cathering_order_name").text();
|
let namaMenu = $("#cathering_order_name").text();
|
||||||
|
|
||||||
let existingItem = cart.find(item => item.id_menu === idMenu && item.nama_menu === namaMenu);
|
let existingItem = cart.find(item => item.id_menu === idMenu && item.nama_menu === namaMenu);
|
||||||
@ -319,13 +329,12 @@
|
|||||||
function saveItem(e){
|
function saveItem(e){
|
||||||
let cart = JSON.parse(sessionStorage.getItem('cart') || '[]');
|
let cart = JSON.parse(sessionStorage.getItem('cart') || '[]');
|
||||||
|
|
||||||
const now = new Date();
|
|
||||||
const todayFormatted = now.getFullYear() + '-' + (now.getMonth() + 1).toString().padStart(2, '0') + '-' + now.getDate().toString().padStart(2, '0')
|
|
||||||
|
|
||||||
const orders = [{
|
const orders = [{
|
||||||
tgl: todayFormatted,
|
tgl: '',
|
||||||
jumlah: 1,
|
jumlah: 1,
|
||||||
kategoriPemesanan: ''
|
kategoriPemesanan: $(e).data('apakah_menu_sore') ? 'Makan Sore' : 'Makan Siang'
|
||||||
}];
|
}];
|
||||||
|
|
||||||
let idMenu = $(e).data('id');
|
let idMenu = $(e).data('id');
|
||||||
@ -350,6 +359,10 @@
|
|||||||
foto: $(e).data('foto'),
|
foto: $(e).data('foto'),
|
||||||
jenis_menu: $(e).data('jenis_menu'),
|
jenis_menu: $(e).data('jenis_menu'),
|
||||||
deskripsi: $(e).data('deskripsi'),
|
deskripsi: $(e).data('deskripsi'),
|
||||||
|
apakah_menu_siang: $(e).data('apakah_menu_siang'),
|
||||||
|
apakah_menu_sore: $(e).data('apakah_menu_sore'),
|
||||||
|
apakah_someday: $(e).data('apakah_someday'),
|
||||||
|
tgl_tersedia: $(e).data('tgl_tersedia'),
|
||||||
pesanan : orders
|
pesanan : orders
|
||||||
}
|
}
|
||||||
cart.push(orderItem)
|
cart.push(orderItem)
|
||||||
|
|||||||
@ -8,7 +8,7 @@ function fetchDetailOrder(order_id){
|
|||||||
const detailHTML = (data?.order_detail || []).map(detail => {
|
const detailHTML = (data?.order_detail || []).map(detail => {
|
||||||
return `
|
return `
|
||||||
<div class="col-md-12 mb-3">
|
<div class="col-md-12 mb-3">
|
||||||
<div class="card shadow-sm">
|
<div class="card shadow-sm border-0">
|
||||||
<div class="row g-0">
|
<div class="row g-0">
|
||||||
<div class="col-md-5 d-flex align-items-center p-2">
|
<div class="col-md-5 d-flex align-items-center p-2">
|
||||||
<img src="/gambar/${detail?.menu?.foto || 'default.jpg'}" alt="Foto Menu" class="img-fluid rounded shadow" style="max-height: 120px; width: auto;">
|
<img src="/gambar/${detail?.menu?.foto || 'default.jpg'}" alt="Foto Menu" class="img-fluid rounded shadow" style="max-height: 120px; width: auto;">
|
||||||
@ -43,31 +43,51 @@ function fetchDetailOrder(order_id){
|
|||||||
|
|
||||||
const html = `
|
const html = `
|
||||||
<div class="row mt-3">
|
<div class="row mt-3">
|
||||||
<!-- Bagian Kiri: Gambar Bukti Pembayaran -->
|
<!-- Bagian Kiri: Gambar Bukti Pembayaran -->
|
||||||
<div class="col-md-4 text-center mb-3 mb-md-0">
|
<div class="col-md-4 text-center mb-3 mb-md-0">
|
||||||
<img src="/storage/${data.bukti_pembayaran || 'gambar/default.jpg'}" alt="Bukti Pembayaran" class="img-fluid rounded shadow" style="max-height: 170px; width: auto;">
|
<img src="/storage/${data.bukti_pembayaran || 'gambar/default.jpg'}" alt="Bukti Pembayaran" class="img-fluid rounded shadow" style="max-height: 170px; width: auto;">
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Bagian Kanan: Informasi Pemesan -->
|
|
||||||
<div class="col-md-8">
|
|
||||||
<div class="mb-2">
|
|
||||||
<h5 class="mb-0">Nama Pemesan: <span class="text-primary" id="nama_pemesan">${data.nama_pemesan}</span></h5>
|
|
||||||
<small class="text-muted">Jenis Customer: <span id="jenis_customer">${data.jenis_customer}</span></small>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="mb-2">
|
<!-- Bagian Kanan: Informasi Pemesan -->
|
||||||
<p class="mb-1">No Order: <strong id="no_order">${data.no_order}</strong></p>
|
<div class="col-md-8">
|
||||||
<p class="mb-1">Type Pembayaran: <strong id="no_order">${data.cara_pembayaran}</strong></p>
|
<div class="card shadow-sm border-0">
|
||||||
<p class="mb-1">Tanggal Pembayaran: <span id="tgl_pembayaran">${data.tgl_pembayaran || '-'}</span></p>
|
<div class="card-body">
|
||||||
<p class="mb-1">Total Harga: <strong id="total_harga">Rp ${parseInt(data.total_harga).toLocaleString('id-ID')}</strong></p>
|
<h5 class="mb-0">Nama Pemesan: <span class="text-primary" id="nama_pemesan">${data.nama_pemesan}</span></h5>
|
||||||
</div>
|
<small class="text-muted">Jenis Customer: <span id="jenis_customer">${data.jenis_customer}</span></small>
|
||||||
|
|
||||||
<div class="mt-3">
|
|
||||||
<label class="form-label">Status Saat Ini:</label>
|
|
||||||
<span class="badge text-dark ${data?.status_order === 'Lunas' ? 'bg-success' : 'bg-warning'}" id="status_order">${data.status_order}</span>
|
${data?.jenis_customer === 'Keluarga Pasien / Penunggu Pasien' ?
|
||||||
|
`<div class="mb-2">
|
||||||
|
<p class="mb-1">Nama Pasien: <strong id="no_order">${data.nama_pasien}</strong></p>
|
||||||
|
<p class="mb-1">Nomor Kamar Perawatan: <strong id="no_order">${data.no_kamar_perawatan}</strong></p>
|
||||||
|
<p class="mb-1">Ruang Perawatan: <strong id="no_order">${data.kelas_perawatan}</strong></p>
|
||||||
|
<p class="mb-1">Kelas Perawatan: <strong id="no_order">${data.ruang_perawatan}</strong></p>
|
||||||
|
</div>`: `
|
||||||
|
<div class="mb-2">
|
||||||
|
<p class="mb-1">Bagian /Instalasi: <strong id="no_order">${data.bagian_instalasi}</strong></p>
|
||||||
|
<p class="mb-1">Ekstensien yang bisa di Hubungi: <strong id="no_order">${data.no_ekstensien}</strong></p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
`}
|
||||||
|
|
||||||
|
|
||||||
|
<div class="mb-2">
|
||||||
|
<p class="mb-1">No Order: <strong id="no_order">${data.no_order}</strong></p>
|
||||||
|
<p class="mb-1">Type Pembayaran: <strong id="no_order">${data.cara_pembayaran}</strong></p>
|
||||||
|
<p class="mb-1">Tanggal Pembayaran: <span id="tgl_pembayaran">${data.tgl_pembayaran || '-'}</span></p>
|
||||||
|
<p class="mb-1">Total Harga: <strong id="total_harga">Rp ${parseInt(data.total_harga).toLocaleString('id-ID')}</strong></p>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mt-3">
|
||||||
|
<label class="form-label">Status Saat Ini:</label>
|
||||||
|
<span class="badge text-dark ${data?.status_order === 'Lunas' ? 'bg-success' : 'bg-warning'}" id="status_order">${data.status_order}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
|
|
||||||
<hr class="my-4">
|
<hr class="my-4">
|
||||||
|
|
||||||
@ -84,7 +104,7 @@ function fetchDetailOrder(order_id){
|
|||||||
const id = this.dataset.id;
|
const id = this.dataset.id;
|
||||||
const isChecked = this.checked;
|
const isChecked = this.checked;
|
||||||
const newStatus = isChecked ? 'Selesai' : 'Pending';
|
const newStatus = isChecked ? 'Selesai' : 'Pending';
|
||||||
|
|
||||||
// Update badge UI
|
// Update badge UI
|
||||||
const badge = document.getElementById(`status_badge_${id}`);
|
const badge = document.getElementById(`status_badge_${id}`);
|
||||||
if (badge) {
|
if (badge) {
|
||||||
|
|||||||
@ -124,18 +124,32 @@
|
|||||||
field:'nama_pemesan',
|
field:'nama_pemesan',
|
||||||
sortable: true,
|
sortable: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Kategori Customer",
|
|
||||||
field: 'jenis_customer',
|
|
||||||
sortable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: "Total Harga Pesanan",
|
title: "Total Harga Pesanan",
|
||||||
field:'total_harga',
|
field:'total_harga',
|
||||||
formatter: function(value, row){
|
formatter: function(value, row){
|
||||||
return 'Rp ' + parseInt(row.total_harga).toLocaleString('id-ID')
|
return 'Rp ' + parseInt(row.total_harga).toLocaleString('id-ID')
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Tgl Pemesanan",
|
||||||
|
formatter: function(value, row) {
|
||||||
|
if (!row?.entry_at) return '-';
|
||||||
|
const date = new Date(row.entry_at);
|
||||||
|
return date.toLocaleString('id-ID', {
|
||||||
|
day: '2-digit',
|
||||||
|
month: 'short', // Bisa diganti 'long' kalau mau 'Juli' bukan 'Jul'
|
||||||
|
year: 'numeric',
|
||||||
|
hour: '2-digit',
|
||||||
|
minute: '2-digit',
|
||||||
|
hour12: false // pakai format 24 jam
|
||||||
|
});
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Kategori Customer",
|
||||||
|
field: 'jenis_customer',
|
||||||
|
sortable: true,
|
||||||
}
|
}
|
||||||
|
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
|
|||||||
4
public/js/pesanan_selesai/_init.js
Normal file
4
public/js/pesanan_selesai/_init.js
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
const datatableSelesai = $("#datatablePesananSelesai")
|
||||||
|
|
||||||
|
const modalActionSelesaiOrder = document.getElementById('modalActionSelesaiOrder')
|
||||||
|
const formActionSelesaiOrder = $("#formActionSelesaiOrder")
|
||||||
108
public/js/pesanan_selesai/detail_order.js
Normal file
108
public/js/pesanan_selesai/detail_order.js
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
function fetchDetailOrder(order_id){
|
||||||
|
fetch(`/dashboard/pending/action-progress-order/${order_id}`)
|
||||||
|
.then(res => res.json())
|
||||||
|
.then(res => {
|
||||||
|
const data = res;
|
||||||
|
document.getElementById('pesanan_container').innerHTML =''
|
||||||
|
// Generate HTML untuk order_detail
|
||||||
|
const detailHTML = (data?.order_detail || []).map(detail => {
|
||||||
|
return `
|
||||||
|
<div class="col-md-12 mb-3">
|
||||||
|
<div class="card shadow-sm border-0">
|
||||||
|
<div class="row g-0">
|
||||||
|
<div class="col-md-5 d-flex align-items-center p-2">
|
||||||
|
<img src="/gambar/${detail?.menu?.foto || 'default.jpg'}" alt="Foto Menu" class="img-fluid rounded shadow" style="max-height: 120px; width: auto;">
|
||||||
|
</div>
|
||||||
|
<div class="col-md-5 p-2">
|
||||||
|
<p class="mb-1">Nama Menu: <strong>${detail?.menu?.nama_menu || '-'}</strong></p>
|
||||||
|
<p class="mb-1">Jumlah: <span>${detail?.jumlah || 0}</span></p>
|
||||||
|
<p class="mb-1">Tanggal Pesan: <span>${detail?.tgl_antar || 0}</span></p>
|
||||||
|
<p class="mb-1">Harga: <strong>Rp ${parseInt(detail?.harga_satuan || 0).toLocaleString('id-ID')}</strong></p>
|
||||||
|
<p class="mb-1">Status Pesanan:
|
||||||
|
<span class="badge text-dark ${detail?.status_order === 'Selesai' ? 'bg-success' : 'bg-warning'}"
|
||||||
|
id="status_badge_${detail.order_detail_id}">
|
||||||
|
${detail?.status_order}
|
||||||
|
</span>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
}).join('');
|
||||||
|
|
||||||
|
const html = `
|
||||||
|
<div class="row mt-4">
|
||||||
|
<!-- Gambar Bukti Pembayaran -->
|
||||||
|
<div class="col-md-4 text-center mb-3 mb-md-0">
|
||||||
|
<div class="border rounded shadow-sm p-2 bg-light">
|
||||||
|
<img src="/storage/${data.bukti_pembayaran || 'gambar/default.jpg'}"
|
||||||
|
alt="Bukti Pembayaran"
|
||||||
|
class="img-fluid rounded"
|
||||||
|
style="max-height: 170px; width: auto;">
|
||||||
|
<div class="text-muted small mt-2">Bukti Pembayaran</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Informasi Pemesan -->
|
||||||
|
<div class="col-md-8">
|
||||||
|
<div class="card shadow-sm border-0">
|
||||||
|
<div class="card-body">
|
||||||
|
<h5 class="card-title text-primary mb-1">${data.nama_pemesan}</h5>
|
||||||
|
<p class="text-muted mb-2">Jenis Customer: <strong>${data.jenis_customer}</strong></p>
|
||||||
|
|
||||||
|
${data?.jenis_customer === 'Keluarga Pasien / Penunggu Pasien' ? `
|
||||||
|
<div class="mb-2">
|
||||||
|
<p class="mb-1">Nama Pasien: <strong>${data.nama_pasien}</strong></p>
|
||||||
|
<p class="mb-1">Nomor Kamar: <strong>${data.no_kamar_perawatan}</strong></p>
|
||||||
|
<p class="mb-1">Ruang Perawatan: <strong>${data.ruang_perawatan}</strong></p>
|
||||||
|
<p class="mb-1">Kelas Perawatan: <strong>${data.kelas_perawatan}</strong></p>
|
||||||
|
</div>` : `
|
||||||
|
<div class="mb-2">
|
||||||
|
<p class="mb-1">Bagian / Instalasi: <strong>${data.bagian_instalasi}</strong></p>
|
||||||
|
<p class="mb-1">Ekstensien: <strong>${data.no_ekstensien || '-'}</strong></p>
|
||||||
|
</div>`}
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<div class="mb-2">
|
||||||
|
<p class="mb-1">No Order: <strong>${data.no_order}</strong></p>
|
||||||
|
<p class="mb-1">Tipe Pembayaran: <strong>${data.cara_pembayaran}</strong></p>
|
||||||
|
<p class="mb-1">Tanggal Pembayaran: <strong>${data.tgl_pembayaran || '-'}</strong></p>
|
||||||
|
<p class="mb-1">Total Harga: <strong>Rp ${parseInt(data.total_harga).toLocaleString('id-ID')}</strong></p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mt-3">
|
||||||
|
<label class="form-label fw-semibold">Status Saat Ini:</label><br>
|
||||||
|
<span class="badge ${data?.status_order === 'Lunas' ? 'bg-success' : 'bg-warning'} text-dark">
|
||||||
|
${data.status_order}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<hr class="my-4">
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
${detailHTML}
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
|
||||||
|
document.getElementById('pesanan_container').innerHTML = html;
|
||||||
|
|
||||||
|
})
|
||||||
|
.catch(err => {
|
||||||
|
document.getElementById('pesanan_container').innerHTML = '<p class="text-danger">Terjadi kesalahan saat memuat data.</p>';
|
||||||
|
console.error(err);
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function orderSelesai(order_id){
|
||||||
|
new bootstrap.Modal(modalActionSelesaiOrder).show();
|
||||||
|
fetchDetailOrder(order_id)
|
||||||
|
}
|
||||||
134
public/js/pesanan_selesai/dt.js
Normal file
134
public/js/pesanan_selesai/dt.js
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
|
||||||
|
datatableSelesai.bootstrapTable({
|
||||||
|
url: "/dashboard/datatable/selesai",
|
||||||
|
showColumns: true,
|
||||||
|
showColumnsToggleAll: true,
|
||||||
|
showRefresh: true,
|
||||||
|
sortable: true,
|
||||||
|
search: true,
|
||||||
|
searchOnEnterKey: false,
|
||||||
|
searchHighlight: true,
|
||||||
|
pagination: true,
|
||||||
|
serverSide:true,
|
||||||
|
pageSize: 10,
|
||||||
|
pageList: [10, 20, 30, 40, 50, 100, 200],
|
||||||
|
cookie: true,
|
||||||
|
cookieIdTable: "table_rma_ssc_id",
|
||||||
|
icons: {
|
||||||
|
refresh: "fas fa-sync-alt", // atau ganti ke icon lain
|
||||||
|
columns: "fas fa-th-large"
|
||||||
|
},
|
||||||
|
|
||||||
|
columns: [
|
||||||
|
{
|
||||||
|
title: "Action",
|
||||||
|
field:'order_id',
|
||||||
|
formatter: function(value, row) {
|
||||||
|
let buttons = ''
|
||||||
|
if(row?.status_order === "Lunas"){
|
||||||
|
buttons += `
|
||||||
|
<button class="btn btn-sm btn-warning text-dark" onclick="orderSelesai('${row.order_id}')">
|
||||||
|
<i class="fa fa-utensils me-1"></i>
|
||||||
|
</button>
|
||||||
|
`
|
||||||
|
}
|
||||||
|
|
||||||
|
return `
|
||||||
|
<div class="d-flex space-x">
|
||||||
|
${buttons}
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
title: "No.Order",
|
||||||
|
field: 'no_order',
|
||||||
|
sortable: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Status Pembayaran",
|
||||||
|
field: 'status_order',
|
||||||
|
sortable: true,
|
||||||
|
formatter: function(value, row) {
|
||||||
|
const status = value;
|
||||||
|
let badgeClass = 'bg-secondary';
|
||||||
|
if (status === "Belum Bayar") {
|
||||||
|
badgeClass = 'bg-warning text-dark';
|
||||||
|
} else if (status === "Menunggu Konfirmasi Pembayaran") {
|
||||||
|
badgeClass = 'bg-primary';
|
||||||
|
} else if (status === "Lunas" || status === "Sudah Bayar") {
|
||||||
|
badgeClass = 'bg-success text-dark';
|
||||||
|
} else if(status === "Dibatalkan"){
|
||||||
|
badgeClass = 'bg-danger';
|
||||||
|
}
|
||||||
|
return `
|
||||||
|
<span class="badge ${badgeClass} px-3 py-1">${status}</span>
|
||||||
|
${status === 'Dibatalkan' && row.note_dibatalkan ? `
|
||||||
|
<div class="text-danger small mt-1">
|
||||||
|
<i class="fa fa-info-circle"></i> ${row.note_dibatalkan}
|
||||||
|
</div>
|
||||||
|
` : ''}
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Status Pesanan",
|
||||||
|
formatter: function(value, row) {
|
||||||
|
const progress = parseInt(row.progress) || 0;
|
||||||
|
const total = row.total_detail || 0;
|
||||||
|
const selesai = row.selesai_detail || 0;
|
||||||
|
|
||||||
|
return `
|
||||||
|
<div class="text-center">
|
||||||
|
<div class="progress" style="height: 18px;">
|
||||||
|
<div class="progress-bar bg-success" role="progressbar"
|
||||||
|
style="width: ${progress}%;"
|
||||||
|
aria-valuenow="${progress}" aria-valuemin="0" aria-valuemax="100">
|
||||||
|
${progress}%
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<small class="text-muted">${selesai} / ${total} selesai</small>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
},
|
||||||
|
sortable: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Pemesan",
|
||||||
|
field:'nama_pemesan',
|
||||||
|
sortable: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Tgl Pemesanan",
|
||||||
|
field: 'entry_at',
|
||||||
|
formatter: function(value, row) {
|
||||||
|
if (!row?.entry_at) return '-';
|
||||||
|
|
||||||
|
const date = new Date(row.entry_at);
|
||||||
|
return date.toLocaleString('id-ID', {
|
||||||
|
day: '2-digit',
|
||||||
|
month: 'short', // Bisa diganti 'long' kalau mau 'Juli' bukan 'Jul'
|
||||||
|
year: 'numeric',
|
||||||
|
hour: '2-digit',
|
||||||
|
minute: '2-digit',
|
||||||
|
hour12: false // pakai format 24 jam
|
||||||
|
});
|
||||||
|
},
|
||||||
|
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')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
],
|
||||||
|
});
|
||||||
@ -62,8 +62,8 @@
|
|||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<!-- User interface -->
|
<!-- User interface -->
|
||||||
<li class="menu-item">
|
<li class="menu-item {{ Request::is('dashboard/selesai') ? 'active' : '' }}">
|
||||||
<a href="/selesai" class="menu-link">
|
<a href="/dashboard/selesai" class="menu-link">
|
||||||
<i class="menu-icon tf-icons bx bx-box"></i>
|
<i class="menu-icon tf-icons bx bx-box"></i>
|
||||||
<div data-i18n="User interface">Pesanan Selesai</div>
|
<div data-i18n="User interface">Pesanan Selesai</div>
|
||||||
</a>
|
</a>
|
||||||
|
|||||||
26
resources/views/dashboard/pesanan/selesai/index.blade.php
Normal file
26
resources/views/dashboard/pesanan/selesai/index.blade.php
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
@extends('dashboard.layouts.main')
|
||||||
|
|
||||||
|
@section('body_main')
|
||||||
|
<div class="container-xxl flex-grow-1 container-p-y">
|
||||||
|
<!-- Breadcrumb -->
|
||||||
|
<h4 class="fw-bold py-3 mb-4">
|
||||||
|
<span class="text-muted fw-light">Dashboard /</span> Pesanan Selesai
|
||||||
|
</h4>
|
||||||
|
|
||||||
|
<!-- Card Master Menu -->
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-header d-flex justify-content-between align-items-center">
|
||||||
|
<h5 class="mb-0">Pesanan Selesai</h5>
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<table class="table" id="datatablePesananSelesai"></table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@include('dashboard.pesanan.selesai.modal.actionPesananSelesai')
|
||||||
|
|
||||||
|
<script src="{{ ver('/js/pesanan_selesai/_init.js') }}"></script>
|
||||||
|
<script src="{{ ver('/js/pesanan_selesai/dt.js') }}"></script>
|
||||||
|
<script src="{{ ver('/js/pesanan_selesai/detail_order.js') }}"></script>
|
||||||
|
@endsection
|
||||||
@ -0,0 +1,32 @@
|
|||||||
|
<!-- Modal -->
|
||||||
|
<div class="modal fade" id="modalActionSelesaiOrder" tabindex="-1" aria-hidden="true">
|
||||||
|
<div class="modal-dialog modal-lg modal-dialog-centered">
|
||||||
|
<div class="modal-content">
|
||||||
|
|
||||||
|
<!-- Modal Header -->
|
||||||
|
<div class="modal-header">
|
||||||
|
<h5 class="modal-title fs-5">Aksi Selesai Pesanan</h1>
|
||||||
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Modal Form -->
|
||||||
|
<form method="POST" id="formActionSelesaiOrder">
|
||||||
|
@csrf
|
||||||
|
@method('put')
|
||||||
|
<div class="modal-body">
|
||||||
|
<div class="container" id="pesanan_container"></div>
|
||||||
|
<!-- Tempatkan ini di layout HTML -->
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Modal Footer -->
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Tutup</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
@ -73,7 +73,7 @@
|
|||||||
const harga = parseInt(item.harga_satuan);
|
const harga = parseInt(item.harga_satuan);
|
||||||
const jumlah = parseInt(item.jumlah);
|
const jumlah = parseInt(item.jumlah);
|
||||||
const total = harga * jumlah;
|
const total = harga * jumlah;
|
||||||
console.log(item);
|
console.log(item);
|
||||||
itemHTML += `
|
itemHTML += `
|
||||||
<div class="card mb-2 shadow-sm">
|
<div class="card mb-2 shadow-sm">
|
||||||
<div class="row g-0">
|
<div class="row g-0">
|
||||||
@ -130,9 +130,9 @@
|
|||||||
<div class="fw-semibold text-secondary mb-1">Status</div>
|
<div class="fw-semibold text-secondary mb-1">Status</div>
|
||||||
<span class="badge
|
<span class="badge
|
||||||
${data?.status_order === "Menunggu Konfirmasi Pembayaran"
|
${data?.status_order === "Menunggu Konfirmasi Pembayaran"
|
||||||
? 'bg-primary'
|
? 'bg-primary'
|
||||||
: data?.status_order === "Belum Bayar"
|
: data?.status_order === "Belum Bayar"
|
||||||
? "bg-warning"
|
? "bg-warning"
|
||||||
: "bg-success"}">
|
: "bg-success"}">
|
||||||
${data?.status_order}
|
${data?.status_order}
|
||||||
</span>
|
</span>
|
||||||
@ -190,15 +190,20 @@
|
|||||||
<h6>Total Seluruh Pesanan: <strong class="text-success">Rp ${parseInt(data?.total_harga).toLocaleString('id-ID')}</strong></h6>
|
<h6>Total Seluruh Pesanan: <strong class="text-success">Rp ${parseInt(data?.total_harga).toLocaleString('id-ID')}</strong></h6>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
${data?.status_order === "Belum Bayar"
|
${data?.status_order === "Belum Bayar"
|
||||||
? `<div class="text-center mb-4">
|
? `<div class="text-center mb-4">
|
||||||
<button class="btn btn-warning fw-bold text-dark">Belum Melakukan Pembayaran</button>
|
<button class="btn btn-warning fw-bold text-dark">Belum Melakukan Pembayaran</button>
|
||||||
</div>` :
|
</div>` :
|
||||||
`<div class="text-center mb-4">
|
data?.bukti_bayar ? `
|
||||||
<h6 class="fw-semibold mb-2">Bukti Pembayaran</h6>
|
<div class="text-center mb-4">
|
||||||
<img src="/storage/${data?.bukti_bayar}" alt="Bukti Pembayaran" class="img-fluid rounded shadow-sm" style="max-width: 300px;">
|
<h6 class="fw-semibold mb-2">Bukti Pembayaran</h6>
|
||||||
</div>`}
|
<img src="/storage/${data?.bukti_bayar}" alt="Bukti Pembayaran" class="img-fluid rounded shadow-sm" style="max-width: 300px;">
|
||||||
|
</div>
|
||||||
|
` :`
|
||||||
|
<div class="text-center mb-4">
|
||||||
|
<button class="btn btn-success fw-bold">Pembayaran VIA Billing</button>
|
||||||
|
</div>
|
||||||
|
`}
|
||||||
<div class="text-center">
|
<div class="text-center">
|
||||||
<a href="/" class="btn btn-outline-success btn-sm px-4 rounded-pill">
|
<a href="/" class="btn btn-outline-success btn-sm px-4 rounded-pill">
|
||||||
<i class="fa fa-arrow-left me-1"></i> Kembali ke Beranda
|
<i class="fa fa-arrow-left me-1"></i> Kembali ke Beranda
|
||||||
@ -206,10 +211,6 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
`
|
`
|
||||||
container.html(html);
|
container.html(html);
|
||||||
})
|
})
|
||||||
|
|||||||
@ -46,6 +46,9 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
<script>
|
||||||
|
const karhohidrats = {!! json_encode($karbohidrat) !!}
|
||||||
|
</script>
|
||||||
<script src="{{ ver('/js/checkout/index.js') }}"></script>
|
<script src="{{ ver('/js/checkout/index.js') }}"></script>
|
||||||
<script src="{{ ver('/js/checkout/action.js') }}"></script>
|
<script src="{{ ver('/js/checkout/action.js') }}"></script>
|
||||||
|
|
||||||
|
|||||||
@ -45,6 +45,10 @@
|
|||||||
<label class="form-label">No. Whatsapp</label>
|
<label class="form-label">No. Whatsapp</label>
|
||||||
<input type="number" class="form-control" name="no_whatsapp" id="no_whatsapp" required>
|
<input type="number" class="form-control" name="no_whatsapp" id="no_whatsapp" required>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="col-md-12">
|
||||||
|
<label class="form-label">Email</label>
|
||||||
|
<input type="email" class="form-control" name="email" id="email" required>
|
||||||
|
</div>
|
||||||
{{-- <div class="col-md-6">
|
{{-- <div class="col-md-6">
|
||||||
<label class="form-label">Tanggal Lahir</label>
|
<label class="form-label">Tanggal Lahir</label>
|
||||||
<input type="date" class="form-control" name="tanggal_lahir" id="tanggal_lahir">
|
<input type="date" class="form-control" name="tanggal_lahir" id="tanggal_lahir">
|
||||||
@ -57,7 +61,7 @@
|
|||||||
<label class="form-label">Berat Badan</label>
|
<label class="form-label">Berat Badan</label>
|
||||||
<input type="number" class="form-control" name="berat_badan" id="berat_badan">
|
<input type="number" class="form-control" name="berat_badan" id="berat_badan">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
{{-- Pasien --}}
|
{{-- Pasien --}}
|
||||||
<div class="col-md-6 pasien">
|
<div class="col-md-6 pasien">
|
||||||
|
|||||||
@ -3,11 +3,8 @@
|
|||||||
|
|
||||||
{{-- Ringkasan Pesanan --}}
|
{{-- Ringkasan Pesanan --}}
|
||||||
<h6 class="fw-bold mb-3">Pesanan Gizi</h6>
|
<h6 class="fw-bold mb-3">Pesanan Gizi</h6>
|
||||||
<div class="alert alert-info py-2 px-3 small" role="alert">
|
|
||||||
<div class="fw-bold">Kategori Pemesanan</div>
|
|
||||||
<div><span class="fw-semibold">Menu Same Day:</span> Dipesan pada hari yang sama setelah pukul 10.00 WIB</div>
|
|
||||||
<div><span class="fw-semibold">Menu Normal:</span> Dipesan minimal H-1 sebelum hari penyajian</div>
|
|
||||||
</div>
|
|
||||||
<div id="checkout_cart_summary">
|
<div id="checkout_cart_summary">
|
||||||
{{-- Akan diisi oleh JavaScript --}}
|
{{-- Akan diisi oleh JavaScript --}}
|
||||||
</div>
|
</div>
|
||||||
@ -17,4 +14,40 @@
|
|||||||
<button type="button" class="btn btn-secondary prev-step">Sebelumnya</button>
|
<button type="button" class="btn btn-secondary prev-step">Sebelumnya</button>
|
||||||
<button type="button" class="btn btn-success next-step" id="btnSimpanPemesanan">Lanjutkan</button>
|
<button type="button" class="btn btn-success next-step" id="btnSimpanPemesanan">Lanjutkan</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="alert alert-info py-3 px-4 small border-start border-4 border-primary mt-3" role="alert">
|
||||||
|
<div class="fw-bold mb-2">
|
||||||
|
<i class="fa fa-info-circle me-1"></i>Informasi Penting
|
||||||
|
</div>
|
||||||
|
<ul class="mb-0 ps-3">
|
||||||
|
<li>
|
||||||
|
<strong>Menu Normal:</strong> Dipesan maksimal H-1 sebelum pukul <strong>13.00 WIB</strong>.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<strong>Menu Same Day:</strong> Dipesan pada hari yang sama setelah pukul <strong>13.00 WIB</strong>.
|
||||||
|
<ul class="ps-3 mt-1">
|
||||||
|
<li><strong>Makan Siang:</strong> maksimal pukul <strong>10.00 WIB</strong></li>
|
||||||
|
<li><strong>Makan Sore:</strong> maksimal pukul <strong>13.00 WIB</strong></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Pemesanan tidak dapat dibatalkan dan tidak ada pengembalian uang.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Pengambilan makanan dilakukan sendiri di <strong>Instalasi Gizi (Ruang Distribusi Makan)</strong>:
|
||||||
|
<ul class="ps-3 mt-1">
|
||||||
|
<li>Siang: <strong>12.00 – 13.00 WIB</strong></li>
|
||||||
|
<li>Sore: <strong>16.00 – 17.00 WIB</strong></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Jenis karbohidrat dapat dipilih sesuai pilihan yang tersedia.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Butuh bantuan? Hubungi WhatsApp <strong>Instalasi Gizi</strong>:
|
||||||
|
<a href="https://wa.me/08815611382 " target="_blank">08815611382 </a> <br>
|
||||||
|
<small class="text-muted">Jam kerja: 08.00 – 15.00 WIB</small>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -75,21 +75,27 @@
|
|||||||
|
|
||||||
|
|
||||||
<div class="row justify-content-center mt-4">
|
<div class="row justify-content-center mt-4">
|
||||||
<div class="col-md-8">
|
<div class="mb-3">
|
||||||
|
<label for="cara_pembayaran" class="form-label fw-semibold">Metode Pembayaran</label>
|
||||||
|
<select class="form-select" id="cara_pembayaran" name="cara_pembayaran" onchange="toggleBuktiPembayaran()">
|
||||||
|
<option value="transfer">Transfer Bank</option>
|
||||||
|
<option value="billing">Billing RS</option>
|
||||||
|
</select>
|
||||||
<input type="hidden" id="no_order_result" name="no_order_result">
|
<input type="hidden" id="no_order_result" name="no_order_result">
|
||||||
<label for="bukti_pembayaran" class="form-label fw-semibold">Upload Bukti Pembayaran</label>
|
</div>
|
||||||
|
|
||||||
|
<div id="bukti_section">
|
||||||
|
<label for="bukti_pembayaran" class="form-label fw-semibold">Upload Bukti Pembayaran</label>
|
||||||
<div class="card p-3 border-dashed position-relative text-center shadow-sm">
|
<div class="card p-3 border-dashed position-relative text-center shadow-sm">
|
||||||
<input type="file" class="form-control position-absolute top-0 start-0 opacity-0 w-100 h-100"
|
<input type="file" class="form-control position-absolute top-0 start-0 opacity-0 w-100 h-100"
|
||||||
id="bukti_pembayaran" name="bukti_pembayaran" accept="image/*" required onchange="previewBuktiPembayaran()">
|
id="bukti_pembayaran" name="bukti_pembayaran" accept="image/*" onchange="previewBuktiPembayaran()">
|
||||||
<div id="preview_text" class="text-muted" required>
|
<div id="preview_text" class="text-muted">
|
||||||
Klik atau drag file ke sini untuk upload<br>
|
Klik atau drag file ke sini untuk upload<br>
|
||||||
<small>Format: JPG, PNG | Max: 2MB</small>
|
<small>Format: JPG, PNG | Max: 2MB</small>
|
||||||
</div>
|
</div>
|
||||||
<img id="bukti_preview" class="img-fluid rounded mt-3 d-none" style="max-height: 300px; object-fit: contain;" />
|
<img id="bukti_preview" class="img-fluid rounded mt-3 d-none" style="max-height: 300px; object-fit: contain;" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@ -29,6 +29,7 @@ Route::group(['middleware' => ['auth']], function(){
|
|||||||
|
|
||||||
Route::resource('/karbohidrat', KarbohidratController::class);
|
Route::resource('/karbohidrat', KarbohidratController::class);
|
||||||
Route::get('/datatable/karbohidrat', [KarbohidratController::class, 'datatable']);
|
Route::get('/datatable/karbohidrat', [KarbohidratController::class, 'datatable']);
|
||||||
|
Route::get('/option/karbohidrat', [KarbohidratController::class, 'option']);
|
||||||
|
|
||||||
Route::resource('/menu', MenuController::class);
|
Route::resource('/menu', MenuController::class);
|
||||||
Route::get('/datatable/menu', [MenuController::class, 'datatable']);
|
Route::get('/datatable/menu', [MenuController::class, 'datatable']);
|
||||||
@ -40,7 +41,8 @@ Route::group(['middleware' => ['auth']], function(){
|
|||||||
Route::get('/pending/action-progress-order/{order_id}', [PesananController::class, 'getDataOrderDetail']);
|
Route::get('/pending/action-progress-order/{order_id}', [PesananController::class, 'getDataOrderDetail']);
|
||||||
Route::post('/pending/update-detail-status/{order_id}', [PesananController::class, 'updateDetailStatusOrder']);
|
Route::post('/pending/update-detail-status/{order_id}', [PesananController::class, 'updateDetailStatusOrder']);
|
||||||
|
|
||||||
|
Route::get('/selesai', [PesananController::class, 'indexSelesai']);
|
||||||
|
Route::get('datatable/selesai', [PesananController::class, 'getDataSelesai']);
|
||||||
});
|
});
|
||||||
|
|
||||||
Route::post('/logout', [AuthController::class, 'logout']);
|
Route::post('/logout', [AuthController::class, 'logout']);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user