progress testing
@ -8,6 +8,7 @@ use App\Models\Karbohidrat;
|
||||
use App\Models\Order;
|
||||
use App\Models\OrderDetail;
|
||||
use Carbon\Carbon;
|
||||
use Carbon\CarbonPeriod;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Mail;
|
||||
@ -28,39 +29,37 @@ class CustomerController extends Controller
|
||||
$search = request('search');
|
||||
$jenis_menu = request('jenis_menu');
|
||||
$perPage = request()->get('per_page', 12);
|
||||
$filters = explode(',', request('filters')); //
|
||||
return self::menuOrder($search, $jenis_menu, $perPage, $filters);
|
||||
$tanggal_awal = (int) request('tanggal_awal');
|
||||
$tanggal_akhir = (int) request('tanggal_akhir');
|
||||
|
||||
return self::menuOrder($search, $jenis_menu, $perPage, $tanggal_awal, $tanggal_akhir);
|
||||
}
|
||||
|
||||
|
||||
private static function menuOrder($search = null, $jenis_menu = null, $perPage, $filters = [])
|
||||
private static function menuOrder($search = null, $jenis_menu = null, $perPage, $tanggal_awal = null, $tanggal_akhir = null)
|
||||
{
|
||||
$filterCollection = collect($filters);
|
||||
$includeSameday = $filterCollection->contains('someday');
|
||||
$includeNormal = $filterCollection->contains('normal');
|
||||
|
||||
$menuMapping = [
|
||||
'menu1' => ['1', '11', '21'],
|
||||
'menu2' => ['2', '12', '22'],
|
||||
'menu3' => ['3', '13', '23'],
|
||||
'menu4' => ['4', '14', '24'],
|
||||
'menu5' => ['5', '15', '25'],
|
||||
'menu6' => ['6', '16', '26'],
|
||||
'menu7' => ['7', '17', '27'],
|
||||
'menu8' => ['8', '18', '28'],
|
||||
'menu9' => ['9', '19', '29'],
|
||||
'menu10' => ['10', '20', '30'],
|
||||
'menu31' => ['31'],
|
||||
];
|
||||
|
||||
$payload = [];
|
||||
foreach ($menuMapping as $menuKey => $values) {
|
||||
if ($filterCollection->contains($menuKey)) {
|
||||
$payload = array_merge($payload, $values);
|
||||
$payloadHari = [];
|
||||
if (!empty($tanggal_awal) && !empty($tanggal_akhir)) {
|
||||
if ($tanggal_awal > 0 && $tanggal_akhir >= $tanggal_awal) {
|
||||
$payloadHari = range($tanggal_awal, $tanggal_akhir);
|
||||
}
|
||||
}
|
||||
$payload = array_unique($payload);
|
||||
// Step 1: Ambil menu_id yang sesuai tanggal
|
||||
$menuIdTanggalValid = [];
|
||||
|
||||
if (!empty($payloadHari)) {
|
||||
$menuIdTanggalValid = DB::connection('dbOrderGizi')
|
||||
->table('public.detail_menu_paket_harian')
|
||||
->whereIn('tgl_harian', $payloadHari)
|
||||
->pluck('master_menu_id')
|
||||
->unique()
|
||||
->toArray();
|
||||
// Jika tidak ada menu di tanggal tersebut, return kosong langsung
|
||||
if (empty($menuIdTanggalValid)) {
|
||||
return self::emptyMenuResponse($perPage);
|
||||
}
|
||||
}
|
||||
// Step 2: Query menu
|
||||
$menuQuery = DB::connection('dbOrderGizi')
|
||||
->table('public.master_menu as mn')
|
||||
->where('mn.statusenabled', true);
|
||||
@ -73,38 +72,31 @@ class CustomerController extends Controller
|
||||
$menuQuery->where('mn.nama_menu', 'ILIKE', '%' . $search . '%');
|
||||
}
|
||||
|
||||
if ($includeSameday && !$includeNormal) {
|
||||
$menuQuery->where('mn.apakah_someday', true);
|
||||
} elseif (!$includeSameday && $includeNormal) {
|
||||
$menuQuery->where('mn.apakah_someday', false);
|
||||
}
|
||||
if (!empty($payload)) {
|
||||
$menuQuery->whereExists(function ($q) use ($payload) {
|
||||
$q->select(DB::raw(1))
|
||||
->from('public.detail_menu_paket_harian as dmph')
|
||||
->whereRaw('dmph.master_menu_id = mn.master_menu_id')
|
||||
->whereIn('dmph.tgl_harian', $payload);
|
||||
});
|
||||
if (!empty($menuIdTanggalValid)) {
|
||||
$menuQuery->whereIn('mn.master_menu_id', $menuIdTanggalValid);
|
||||
}
|
||||
$paginated = $menuQuery->select(
|
||||
'mn.master_menu_id',
|
||||
'mn.nama_menu',
|
||||
'mn.foto',
|
||||
'mn.jenis_menu',
|
||||
'mn.harga_public',
|
||||
'mn.harga_karyawan',
|
||||
'mn.harga_keluarga_pasien',
|
||||
'mn.status',
|
||||
'mn.deskripsi',
|
||||
'mn.apakah_someday',
|
||||
'mn.apakah_menu_siang',
|
||||
'mn.apakah_menu_sore',
|
||||
)->paginate($perPage);
|
||||
|
||||
$paginated = $menuQuery
|
||||
->select(
|
||||
'mn.master_menu_id',
|
||||
'mn.nama_menu',
|
||||
'mn.foto',
|
||||
'mn.jenis_menu',
|
||||
'mn.harga_public',
|
||||
'mn.harga_karyawan',
|
||||
'mn.harga_keluarga_pasien',
|
||||
'mn.status',
|
||||
'mn.deskripsi',
|
||||
'mn.apakah_someday',
|
||||
'mn.apakah_menu_siang',
|
||||
'mn.apakah_menu_sore',
|
||||
)
|
||||
->paginate($perPage);
|
||||
$menuIds = collect($paginated->items())->pluck('master_menu_id')->toArray();
|
||||
|
||||
if (empty($menuIds)) {
|
||||
return self::emptyMenuResponse($perPage);
|
||||
}
|
||||
|
||||
// Step 3: Relasi data tambahan
|
||||
$klasifikasi = DB::connection('dbOrderGizi')
|
||||
->table('public.klasifikasi_menu_diet as kmd')
|
||||
->join('public.kategori_diet as kd', 'kd.kategori_diet_id', '=', 'kmd.kategori_diet_id')
|
||||
@ -116,9 +108,6 @@ class CustomerController extends Controller
|
||||
$dmph = DB::connection('dbOrderGizi')
|
||||
->table('public.detail_menu_paket_harian as dmph')
|
||||
->whereIn('dmph.master_menu_id', $menuIds)
|
||||
->when(!empty($payload), function ($query) use ($payload) {
|
||||
$query->whereIn('dmph.tgl_harian', $payload);
|
||||
})
|
||||
->select('dmph.master_menu_id', 'dmph.tgl_harian')
|
||||
->get()
|
||||
->groupBy('master_menu_id');
|
||||
@ -129,8 +118,10 @@ class CustomerController extends Controller
|
||||
->select('kmk.master_menu_id', 'k.kalori_id', 'k.nilai_kalori')
|
||||
->get()
|
||||
->groupBy('master_menu_id');
|
||||
|
||||
|
||||
// Step 4: Transform response
|
||||
$result = collect($paginated->items())->map(function ($menu) use ($klasifikasi, $dmph, $kkal) {
|
||||
|
||||
return [
|
||||
'master_menu_id' => $menu->master_menu_id,
|
||||
'nama' => $menu->nama_menu,
|
||||
@ -152,7 +143,7 @@ class CustomerController extends Controller
|
||||
})->values() : [],
|
||||
'dmph' => isset($dmph[$menu->master_menu_id]) ? $dmph[$menu->master_menu_id]->map(function ($item) {
|
||||
return [
|
||||
'tgl_harian' => $item->tgl_harian,
|
||||
'tgl_harian' => $item->tgl_harian
|
||||
];
|
||||
})->values() : [],
|
||||
'kalori' => isset($kkal[$menu->master_menu_id]) ? $kkal[$menu->master_menu_id]->map(function ($item) {
|
||||
@ -176,6 +167,22 @@ class CustomerController extends Controller
|
||||
]);
|
||||
}
|
||||
|
||||
private static function emptyMenuResponse($perPage)
|
||||
{
|
||||
return response()->json([
|
||||
'status' => true,
|
||||
'message' => 'Tidak ada menu ditemukan',
|
||||
'data' => [
|
||||
'data' => [],
|
||||
'current_page' => 1,
|
||||
'last_page' => 1,
|
||||
'per_page' => $perPage,
|
||||
'total' => 0,
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// paket do komen dulu
|
||||
// private static function dataPaketMenuOrder($search = null, $perPage){
|
||||
|
||||
@ -280,7 +280,7 @@ class MenuController extends Controller
|
||||
'kmk.kalori_id',
|
||||
'k.nilai_kalori'
|
||||
)
|
||||
->get()->groupBy('master_menu_id');
|
||||
->orderBy('mn.entry_at', 'desc')->get()->groupBy('master_menu_id');
|
||||
|
||||
$grouped = $data->map(function($items){
|
||||
$first = $items->first();
|
||||
|
||||
BIN
public/gambar/8dY9w9VBXYg2aR4.jpeg
Normal file
|
After Width: | Height: | Size: 51 KiB |
BIN
public/gambar/GPhScYOLRXhCNuZ.jpg
Normal file
|
After Width: | Height: | Size: 154 KiB |
BIN
public/gambar/IY690j402Rjs4M3.jpg
Normal file
|
After Width: | Height: | Size: 163 KiB |
BIN
public/gambar/kf0NqtLWFSnPcV5.jpg
Normal file
|
After Width: | Height: | Size: 98 KiB |
BIN
public/gambar/nPwsfRiIqPlWPmG.jpg
Normal file
|
After Width: | Height: | Size: 154 KiB |
BIN
public/gambar/txkrSnBJAeGRYz4.jpg
Normal file
|
After Width: | Height: | Size: 154 KiB |
BIN
public/gambar/uFq7WBhHan3G8Uo.jpg
Normal file
|
After Width: | Height: | Size: 65 KiB |
@ -316,10 +316,10 @@ function renderCartSummary() {
|
||||
${item.apakah_someday ? `` : `
|
||||
<div class="col-12 col-md-3">
|
||||
<select class="form-select form-select-sm karbohidrat-input" onchange="onKarbohidratChange(${item.id}, ${i})">
|
||||
<option value="">Pilih Karbohidrat</option>
|
||||
<option disabled selected>Pilih Karbohidrat</option>
|
||||
${(karhohidrats || []).map(k => `
|
||||
<option value="${k.karbohidrat_id}" ${p.karbohidrat_id === k.karbohidrat_id ? 'selected' : ''}>
|
||||
${k.nama_karbohidrat} (${k.nilai_kalori} kkal)
|
||||
${k.nama_karbohidrat} ${k.nilai_kalori ? `(${k.nilai_kalori} kkal)` : ''}
|
||||
</option>
|
||||
`).join('')}
|
||||
</select>
|
||||
@ -395,8 +395,7 @@ function renderCartSummary() {
|
||||
const itemHTML = `
|
||||
<div class="card mb-3 shadow-sm position-relative">
|
||||
<div class="d-flex flex-column flex-md-row">
|
||||
<button type="button" class="btn btn-sm btn-outline-danger position-absolute top-0 end-0 m-2"
|
||||
onclick="removeCartItem(${item.id})">
|
||||
<button type="button" class="btn btn-sm btn-outline-danger position-absolute top-0 end-0 m-2" onClick="removeCartItem(${item.id})" style="z-index:1;">
|
||||
Hapus
|
||||
</button>
|
||||
<div class="p-2 d-flex justify-content-center align-items-center" style="flex: 0 0 300px;">
|
||||
@ -421,14 +420,14 @@ function renderCartSummary() {
|
||||
${item.kalori
|
||||
? `<div class="mb-2 small text-muted"><i class="fa-solid fa-bolt me-1"></i> Kalori: <strong>${item.kalori} kkal</strong></div>`
|
||||
: ''}
|
||||
<div class="mb-2 small text-muted"><strong>Silakan isi tanggal pemesanan, catatan pemesanan (opsional) dan pilih karbohidrat yang diinginkan</strong></div>
|
||||
<div class="mb-2 small text-muted"><strong>Silahkan isi tanggal pemesanan, pilih karbohidrat dan catatan pemesanan (opsional) yang diinginkan</strong></div>
|
||||
${pesananHTML}
|
||||
|
||||
<div class="mt-3 d-flex justify-content-between align-items-center flex-wrap gap-2">
|
||||
<button class="btn btn-sm btn-outline-success"
|
||||
onclick="addOrderDate(${item.id}, ${item.apakah_menu_sore})">
|
||||
+ Tambah Tanggal
|
||||
</button>'
|
||||
</button>
|
||||
|
||||
<div><strong>Total:</strong> <span class="text-success">Rp ${itemTotal.toLocaleString('id-ID')}</span></div>
|
||||
</div>
|
||||
@ -688,16 +687,17 @@ function initFlatpickrTersedia(item, i) {
|
||||
const menitBatasFlat = 13 * 60;
|
||||
|
||||
const lewatBatasNormal = totalMenitFlatSekarang >= menitBatasFlat;
|
||||
|
||||
const tglString = Array.isArray(item?.tgl_tersedia)
|
||||
? item?.tgl_tersedia.join(',') // kalau array → gabung jadi string
|
||||
: String(item?.tgl_tersedia);
|
||||
// Ambil string tgl_tersedia dan ubah jadi array tanggal lengkap
|
||||
const dayNumbers = (item.tgl_tersedia || "")
|
||||
const dayNumbers = (tglString || "")
|
||||
.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;
|
||||
|
||||
@ -99,8 +99,8 @@ function initSelectize(formElement) {
|
||||
|
||||
formElement.querySelectorAll('.money').forEach(input => {
|
||||
input.addEventListener('input', function () {
|
||||
let angka = this.value.replace(/[^0-9]/g, '');
|
||||
this.value = formatAngka(angka);
|
||||
let angka = this.value.replace(/[^0-9]/g, '');
|
||||
this.value = formatAngka(angka);
|
||||
});
|
||||
});
|
||||
|
||||
@ -131,12 +131,27 @@ document.addEventListener('DOMContentLoaded', function () {
|
||||
const money = document.querySelectorAll('.money')
|
||||
|
||||
money.forEach(input => {
|
||||
input.addEventListener('input', function(){
|
||||
let angka = this.value.replace(/[^0-9]/g, '');
|
||||
this.value = formatAngka(angka)
|
||||
})
|
||||
})
|
||||
input.addEventListener('input', function () {
|
||||
// Simpan posisi kursor awal
|
||||
let start = this.selectionStart;
|
||||
console.log(start);
|
||||
|
||||
let end = this.selectionEnd;
|
||||
|
||||
// Ambil angka saja
|
||||
let angka = this.value.replace(/[^0-9]/g, '');
|
||||
let formatted = formatAngka(angka);
|
||||
|
||||
// Hitung perbedaan panjang string sebelum dan sesudah format
|
||||
let selisih = formatted.length - this.value.length;
|
||||
|
||||
// Update value
|
||||
this.value = formatted;
|
||||
|
||||
// Pulihkan posisi kursor (geser sesuai perubahan panjang)
|
||||
this.setSelectionRange(start + selisih, end + selisih);
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
@ -362,9 +377,10 @@ function editMasterMenu(e) {
|
||||
kalori: JSON.parse(decodeURIComponent(el.data('kalori') || '[]')),
|
||||
kategori_diet: JSON.parse(decodeURIComponent(el.data('kategori_diet') || '[]')),
|
||||
};
|
||||
console.log(dataOld);
|
||||
|
||||
|
||||
if(el.data('foto')){
|
||||
document.getElementById('gambar_old').classList.remove('d-none')
|
||||
document.getElementById('gambar_old').setAttribute('href', `/gambar/${el.data('foto')}`)
|
||||
}
|
||||
// Set value ke input form
|
||||
$("#nama_edit").val(dataOld.nama_menu);
|
||||
$("#harga_public_edit").val(dataOld.harga_public);
|
||||
|
||||
@ -29,6 +29,7 @@
|
||||
buttons += `
|
||||
<button class="btn btn-sm btn-primary me-2" onclick="editMasterMenu(this)" data-master_menu_id="${row.master_menu_id}"
|
||||
data-nama="${row?.nama_menu}"
|
||||
data-foto="${row?.foto}"
|
||||
data-harga_public="${row?.harga_public}"
|
||||
data-harga_karyawan="${row?.harga_karyawan}"
|
||||
data-jenis_menu="${row?.jenis_menu}"
|
||||
|
||||
@ -7,7 +7,7 @@ $(document).ready(function(){
|
||||
per_page: 12,
|
||||
}
|
||||
|
||||
fetchMenu(filterState, getActiveFilters())
|
||||
fetchMenu(filterState)
|
||||
|
||||
$('#tabJenisMenu .nav-link').on('click', function(e){
|
||||
e.preventDefault();
|
||||
@ -16,9 +16,12 @@ $(document).ready(function(){
|
||||
|
||||
$(this).closest('.nav-link').removeClass('text-black').addClass('active text-success');
|
||||
|
||||
|
||||
datePicker.clear();
|
||||
document.getElementById('tanggalTerpilihLabel').classList.add('d-none'); // Sembunyikan label
|
||||
document.getElementById('tanggalTerpilihLabel').textContent = '';
|
||||
document.getElementById('resetTanggal').classList.add('d-none');
|
||||
filterState.jenis_menu = jenis
|
||||
fetchMenu(filterState, getActiveFilters())
|
||||
fetchMenu(filterState)
|
||||
})
|
||||
|
||||
let searchTimout;
|
||||
@ -28,7 +31,7 @@ $(document).ready(function(){
|
||||
|
||||
searchTimout = setTimeout(() => {
|
||||
filterState.search = keyword;
|
||||
fetchMenu(filterState, getActiveFilters())
|
||||
fetchMenu(filterState)
|
||||
}, 300)
|
||||
})
|
||||
})
|
||||
@ -36,27 +39,6 @@ $(document).ready(function(){
|
||||
function changePerPage(select) {
|
||||
const newPerPage = parseInt(select.value);
|
||||
filterState.per_page = newPerPage
|
||||
fetchMenu(filterState, getActiveFilters())
|
||||
fetchMenu(filterState)
|
||||
}
|
||||
|
||||
|
||||
const menuAvailable = document.getElementById('menu_available')
|
||||
document.querySelectorAll('[data-filter-menu]').forEach(btn => {
|
||||
btn.addEventListener('click', function(){
|
||||
this.classList.toggle('active')
|
||||
const normalBtns = document.querySelectorAll('[data-filter-menu="normal"]');
|
||||
const normalIsActive = Array.from(normalBtns).some(btn => btn.classList.contains('active'));
|
||||
|
||||
if(normalIsActive){
|
||||
menuAvailable.classList.remove('d-none')
|
||||
}else{
|
||||
menuAvailable.classList.add('d-none')
|
||||
}
|
||||
|
||||
fetchMenu(filterState, getActiveFilters())
|
||||
})
|
||||
})
|
||||
function getActiveFilters() {
|
||||
return Array.from(document.querySelectorAll('[data-filter-menu].active'))
|
||||
.map(btn => btn.dataset.filterMenu);
|
||||
}
|
||||
@ -7,10 +7,12 @@
|
||||
|
||||
|
||||
|
||||
function fetchMenu(filter = {}, activeFilters = []) {
|
||||
|
||||
function fetchMenu(filter = {}) {
|
||||
|
||||
const containerGuest = $("#order_guest_id");
|
||||
$("#tanggal-filter").removeClass('d-none');
|
||||
if(filter.jenis_menu === "konsultasi"){
|
||||
$("#tanggal-filter").addClass('d-none');
|
||||
const jadwalList = [
|
||||
{
|
||||
nama_dokter: "dr. Andi exp, Sp.A",
|
||||
@ -54,19 +56,16 @@
|
||||
|
||||
}
|
||||
|
||||
if (activeFilters.length > 0) {
|
||||
filter.filters = activeFilters.join(',');
|
||||
}
|
||||
|
||||
|
||||
let params = new URLSearchParams({
|
||||
page: filter.page || 1,
|
||||
per_page: filter.per_page || 12,
|
||||
search: filter.search || '',
|
||||
jenis_menu: filter.jenis_menu || '',
|
||||
filters: filter.filters
|
||||
|
||||
tanggal_awal: filter.tanggal_awal || '',
|
||||
tanggal_akhir: filter.tanggal_akhir || '',
|
||||
}).toString();
|
||||
|
||||
|
||||
containerGuest.html('<p class="text-muted">Memuat data....</p>');
|
||||
|
||||
|
||||
@ -98,14 +97,12 @@
|
||||
`);
|
||||
}
|
||||
|
||||
|
||||
|
||||
let html = '<div class="container"><div class="row row-cols-2 row-cols-sm-2 row-cols-md-3 row-cols-lg-4 g-3">';
|
||||
menus.forEach(menu => {
|
||||
menus?.forEach(menu => {
|
||||
|
||||
html += `
|
||||
<div class="col-12 col-sm-6 col-md-4 col-lg-3 mb-2">
|
||||
<div class="card h-100 shadow-sm p-2 rounded-4">
|
||||
<div class="card h-100 shadow-sm p-2 rounded-4 mb-3">
|
||||
<!-- Gambar Makanan -->
|
||||
<img src="gambar/${menu.foto || '3.jpeg'}"
|
||||
class="rounded shadow-sm object-fit-cover w-100" height="150px"
|
||||
|
||||
@ -50,7 +50,7 @@
|
||||
<div class="col-md-4">
|
||||
<div class="card border-0 shadow-sm bg-light-warning text-warning">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title mb-1"><i class="bx bx-time-five me-1"></i> Belum Selesai</h5>
|
||||
<h5 class="card-title mb-1"><i class="bx bx-time-five me-1"></i> Konfirmasi Pesanan</h5>
|
||||
<h2 class="fw-bold mb-1" id="pesanan_waiting">8</h2>
|
||||
<small>Menunggu Konfirmasi / Pembayaran</small>
|
||||
</div>
|
||||
@ -73,9 +73,9 @@
|
||||
<div class="col-md-4">
|
||||
<div class="card border-0 shadow-sm bg-light-secondary text-secondary">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title mb-1"><i class="bx bx-box me-1"></i> Pesanan Pending</h5>
|
||||
<h5 class="card-title mb-1"><i class="bx bx-box me-1"></i>Pesanan Lunas, Menunggu Pengambilan</h5>
|
||||
<h2 class="fw-bold mb-1" id="pesanan_belum_diambil">5</h2>
|
||||
<small>Lunas tapi belum diambil</small>
|
||||
<small>Pembayaran sudah lunas, namun pesanan belum diambil karena tanggal pengambilan belum sesuai. </small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -83,9 +83,9 @@
|
||||
<div class="col-md-4">
|
||||
<div class="card border-0 shadow-sm bg-light-success text-success">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title mb-1"><i class="bx bx-check-square me-1"></i> Pesanan Diambil</h5>
|
||||
<h5 class="card-title mb-1"><i class="bx bx-check-square me-1"></i> Pesanan Selesai</h5>
|
||||
<h2 class="fw-bold mb-1" id="pesanan_diambil">10</h2>
|
||||
<small>Pemesan sudah ambil makanannya</small>
|
||||
<small>Pemesan makanan sudah ambil</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -66,7 +66,7 @@
|
||||
|
||||
<div class="col-md-12">
|
||||
<div class="mb-3">
|
||||
<label>Foto</label>
|
||||
<label>Foto Produk</label>
|
||||
<input type="file" name="data[0][foto]" accept="image/*" class="form-control" required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -59,8 +59,10 @@
|
||||
|
||||
<div class="col-md-12">
|
||||
<div class="mb-3">
|
||||
<label>Foto</label>
|
||||
<label>Foto Produk</label>
|
||||
<input type="file" name="foto" accept="image/*" class="form-control">
|
||||
<a class="btn btn-sm btn-primary mt-2 d-none" id="gambar_old" target="_blank">Foto Produk Saat Ini</a><br/>
|
||||
<small class="text-muted">Foto produk lama akan tetap digunakan jika Anda tidak mengunggah foto produk baru.</small>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
@ -61,16 +61,11 @@
|
||||
<!-- Components -->
|
||||
<li class="menu-header small text-uppercase"><span class="menu-header-text">Order</span></li>
|
||||
<!-- Cards -->
|
||||
<li class="menu-item {{ Request::is('dashboard/pekerjaan') ? 'active' : '' }}">
|
||||
<a href="/dashboard/pekerjaan" class="menu-link">
|
||||
<i class="menu-icon tf-icons bx bx-collection"></i>
|
||||
<div data-i18n="Basic">Pekerjaan</div>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="menu-item {{ Request::is('dashboard/pending') ? 'active' : '' }}">
|
||||
<a href="/dashboard/pending" class="menu-link">
|
||||
<i class="menu-icon tf-icons bx bx-collection"></i>
|
||||
<div data-i18n="Basic">Pesanan Pending</div>
|
||||
<div data-i18n="Basic">Konfirmasi Pesanan</div>
|
||||
</a>
|
||||
</li>
|
||||
<!-- User interface -->
|
||||
@ -80,5 +75,13 @@
|
||||
<div data-i18n="User interface">Pesanan Selesai</div>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="menu-header small text-uppercase"><span class="menu-header-text">Verifikasi Makanan</span></li>
|
||||
<li class="menu-item {{ Request::is('dashboard/pekerjaan') ? 'active' : '' }}">
|
||||
<a href="/dashboard/pekerjaan" class="menu-link">
|
||||
<i class="menu-icon tf-icons bx bx-collection"></i>
|
||||
<div data-i18n="Basic">Verifikasi Makanan</div>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</aside>
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
<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> Pekerjaan
|
||||
<span class="text-muted fw-light">Dashboard /</span> Verifikasi Makanan
|
||||
</h4>
|
||||
|
||||
<!-- Card Master Menu -->
|
||||
@ -12,14 +12,14 @@
|
||||
<div class="card-header d-flex justify-content-between align-items-center flex-wrap gap-2">
|
||||
<!-- Judul Kiri -->
|
||||
<h5 class="mb-0">
|
||||
Pekerjaan <strong id="confirm_pekerjaan_time"></strong>
|
||||
Verifikasi Makanan <strong id="confirm_pekerjaan_time"></strong>
|
||||
</h5>
|
||||
|
||||
<!-- Kanan: Tombol Export + Input Tanggal -->
|
||||
<div class="d-flex align-items-center gap-2">
|
||||
<!-- Tombol Export -->
|
||||
<button type="button" class="btn btn-sm btn-primary" id="buttonLabel" onclick="labelDownload()" disabled>
|
||||
<i class="fa-solid fa-qrcode"></i> Download Label
|
||||
<i class="fa-solid fa-qrcode"></i> Cetak Label
|
||||
</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary" onclick="exportPekerjaan()">
|
||||
<i class="fa fa-download me-1"></i> Export
|
||||
|
||||
@ -4,13 +4,13 @@
|
||||
<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 Pending
|
||||
<span class="text-muted fw-light">Dashboard /</span> Konfirmasi Pesanan
|
||||
</h4>
|
||||
|
||||
<!-- Card Master Menu -->
|
||||
<div class="card">
|
||||
<div class="card-header d-flex justify-content-between align-items-center">
|
||||
<h5 class="mb-0">Pesanan Pending <strong id="confirm_date_pesanan_pending"></strong></h5>
|
||||
<h5 class="mb-0">Konfirmasi Pesanan <strong id="confirm_date_pesanan_pending"></strong></h5>
|
||||
<div class="d-flex align-items-center gap-2">
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary" onclick="exportPending()">
|
||||
<i class="fa fa-download me-1"></i> Export
|
||||
|
||||
@ -83,7 +83,7 @@
|
||||
<body>
|
||||
|
||||
<div class="header">
|
||||
<h2>Laporan Pesanan Pending</h2>
|
||||
<h2>Laporan Konfirmasi Pesanan</h2>
|
||||
@if ($startDate === $endDate)
|
||||
<div class="sub-title">Periode: {{ $startDate }}</div>
|
||||
@else
|
||||
|
||||
@ -19,35 +19,51 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row g-2 m-2">
|
||||
<!-- Filter Kategori Ketersediaan -->
|
||||
<div class="row ms-1" id="tanggal-filter">
|
||||
<div class="col-12 mb-2">
|
||||
<h6 class="fw-bold text-muted">Ketersediaan Menu</h6>
|
||||
<div class="d-flex flex-wrap gap-2">
|
||||
<button type="button" class="btn btn-outline-success btn-sm rounded" data-filter-menu="someday">Tersedia Setiap Hari</button>
|
||||
<button type="button" class="btn btn-outline-primary btn-sm rounded" data-filter-menu="normal">Tersedia di Tanggal Tertentu</button>
|
||||
</div>
|
||||
</div>
|
||||
<h6 class="fw-bold text-muted mb-1">
|
||||
Pilih Tanggal Makanan
|
||||
<a tabindex="0" class="ms-1 text-decoration-none" role="button" data-bs-toggle="popover" data-bs-trigger="focus"
|
||||
title="Panduan"
|
||||
data-bs-content="Pilih rentang tanggal untuk melihat daftar menu yang tersedia pada tanggal tersebut.">
|
||||
<i class="fa fa-info-circle text-secondary"></i>
|
||||
</a>
|
||||
</h6>
|
||||
|
||||
<!-- Filter Kategori Menu -->
|
||||
<div class="col-12 mt-3 d-none" id="menu_available">
|
||||
<h6 class="fw-bold text-muted">Menu</h6>
|
||||
<div class="d-flex flex-wrap gap-2">
|
||||
<button type="button" class="btn btn-outline-secondary btn-sm" data-filter-menu="menu1">Menu 1</button>
|
||||
<button type="button" class="btn btn-outline-secondary btn-sm" data-filter-menu="menu2">Menu 2</button>
|
||||
<button type="button" class="btn btn-outline-secondary btn-sm" data-filter-menu="menu3">Menu 3</button>
|
||||
<button type="button" class="btn btn-outline-secondary btn-sm" data-filter-menu="menu4">Menu 4</button>
|
||||
<button type="button" class="btn btn-outline-secondary btn-sm" data-filter-menu="menu5">Menu 5</button>
|
||||
<button type="button" class="btn btn-outline-secondary btn-sm" data-filter-menu="menu6">Menu 6</button>
|
||||
<button type="button" class="btn btn-outline-secondary btn-sm" data-filter-menu="menu7">Menu 7</button>
|
||||
<button type="button" class="btn btn-outline-secondary btn-sm" data-filter-menu="menu8">Menu 8</button>
|
||||
<button type="button" class="btn btn-outline-secondary btn-sm" data-filter-menu="menu9">Menu 9</button>
|
||||
<button type="button" class="btn btn-outline-secondary btn-sm" data-filter-menu="menu10">Menu 10</button>
|
||||
<button type="button" class="btn btn-outline-secondary btn-sm" data-filter-menu="menu31">Menu 31</button>
|
||||
<div class="input-group input-group-sm mb-2" style="max-width: 350px;">
|
||||
<span class="input-group-text bg-white px-2">
|
||||
<i class="fa fa-calendar-alt text-primary"></i>
|
||||
</span>
|
||||
|
||||
<input type="text"
|
||||
id="tanggal"
|
||||
class="form-control form-control-sm tanggal-input"
|
||||
readonly
|
||||
placeholder="Contoh: 7 - 10 Agustus 2025"
|
||||
title="Klik untuk membuka kalender"
|
||||
style="font-size: 0.85rem; padding: 0.3rem 0.5rem;">
|
||||
|
||||
<!-- Tombol X di sebelah input -->
|
||||
<button type="button" id="resetTanggal"
|
||||
class="btn btn-sm btn-light border d-none"
|
||||
title="Reset Tanggal">
|
||||
<i class="fa fa-times text-muted"></i>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="tanggalTerpilihLabel"
|
||||
class="bg-light border text-dark mt-1 d-none rounded px-2 py-1"
|
||||
style="font-size: 0.75rem; word-wrap: break-word; overflow-wrap: break-word;">
|
||||
<i class="fa fa-calendar-check text-success me-1"></i>
|
||||
<span id="labelTanggalText">Menampilkan menu...</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div id="order_guest_id"></div>
|
||||
<div id="floatingCartButton"
|
||||
class="cart-floating bg-success text-white rounded d-none shadow-lg"
|
||||
@ -73,4 +89,58 @@
|
||||
<script src="{{ ver('/js/order_guest/register.js') }}"></script>
|
||||
<script src="{{ ver('/js/order_guest/functions.js') }}"></script>
|
||||
<script src="{{ ver('/js/order_guest/index.js') }}"></script>
|
||||
<script>
|
||||
const datePicker = flatpickr("#tanggal", {
|
||||
dateFormat: "Y-m-d",
|
||||
mode: "range",
|
||||
onChange: function (selectedDates, dateStr) {
|
||||
const label = document.getElementById('tanggalTerpilihLabel');
|
||||
const resetBtn = document.getElementById('resetTanggal');
|
||||
|
||||
if (selectedDates.length === 2) {
|
||||
const [start, end] = selectedDates;
|
||||
const startDay = start.getDate();
|
||||
const endDay = end.getDate();
|
||||
|
||||
if (start.getTime() === end.getTime()) {
|
||||
label.textContent = `Menampilkan menu tersedia untuk tanggal: ${formatTanggal(start)}`;
|
||||
} else {
|
||||
label.textContent = `Menampilkan menu tersedia dari ${formatTanggal(start)} hingga ${formatTanggal(end)}`;
|
||||
}
|
||||
const activeFilter = document.querySelector('#tabJenisMenu .nav-link.active')?.dataset?.filter || null;
|
||||
// Baru kirim ke fetchMenu jika dua tanggal sudah dipilih
|
||||
fetchMenu({ jenis_menu: activeFilter, tanggal_awal: startDay, tanggal_akhir: endDay });
|
||||
|
||||
label.classList.remove('d-none');
|
||||
resetBtn.classList.remove('d-none');
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
function formatTanggal(dateObj) {
|
||||
const bulan = [
|
||||
"Januari", "Februari", "Maret", "April", "Mei", "Juni",
|
||||
"Juli", "Agustus", "September", "Oktober", "November", "Desember"
|
||||
];
|
||||
const d = dateObj.getDate();
|
||||
const m = bulan[dateObj.getMonth()];
|
||||
const y = dateObj.getFullYear();
|
||||
return `${d} ${m} ${y}`;
|
||||
}
|
||||
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
document.querySelectorAll('[data-bs-toggle="popover"]').forEach(el => new bootstrap.Popover(el));
|
||||
});
|
||||
|
||||
document.getElementById('resetTanggal').addEventListener('click', function() {
|
||||
const activeFilter = document.querySelector('#tabJenisMenu .nav-link.active')?.dataset?.filter || null;
|
||||
datePicker.clear(); // Reset tanggal
|
||||
document.getElementById('tanggalTerpilihLabel').classList.add('d-none'); // Sembunyikan label
|
||||
document.getElementById('tanggalTerpilihLabel').textContent = '';
|
||||
document.getElementById('resetTanggal').classList.add('d-none');
|
||||
fetchMenu({ jenis_menu: activeFilter, tanggal_awal: null, tanggal_akhir: null, });
|
||||
|
||||
});
|
||||
|
||||
</script>
|
||||
@endsection
|
||||
|
||||