From 8ba9c650e899a37eae6b69db9e22f3a1f2303c60 Mon Sep 17 00:00:00 2001 From: taekyoungc Date: Fri, 19 Jun 2026 21:23:55 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EC=A0=84=ED=99=94=EC=A0=91=EC=88=98=20?= =?UTF-8?q?=EA=B4=80=EB=A6=AC=20=E2=80=94=20=EC=A0=91=EC=88=98=20=EB=A6=AC?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=BB=AC=EB=9F=BC=20=EB=B3=B4=EA=B0=95?= =?UTF-8?q?=C2=B7=ED=97=A4=EB=8D=94=20=EC=A0=95=EB=A0=AC,=20=EB=B0=B0?= =?UTF-8?q?=EB=8B=AC=EC=9D=BC=20=EC=88=98=EC=A0=95=20=EC=A0=80=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 접수 리스트에 접수일/배달일/금액 컬럼 추가, 헤더 클릭 정렬(번호·접수일·배달일·판매소·금액·상태, 오름/내림 토글) - 우측 상세에서 배달일을 date 입력으로 수정 가능, 저장 시 so_delivery_date 변경 반영 Co-Authored-By: Claude Opus 4.8 --- app/Controllers/Bag.php | 10 +++- app/Views/bag/order_phone_manage.php | 87 ++++++++++++++++++++-------- 2 files changed, 71 insertions(+), 26 deletions(-) diff --git a/app/Controllers/Bag.php b/app/Controllers/Bag.php index c3ec581..08844a5 100644 --- a/app/Controllers/Bag.php +++ b/app/Controllers/Bag.php @@ -7242,10 +7242,16 @@ SQL; $sumAmt += $amount; } - $orderModel->update($soIdx, [ + $orderUpdate = [ 'so_total_qty' => $sumQty, 'so_total_amount' => $sumAmt, - ]); + ]; + // 배달일 수정 — 입력값이 유효한 날짜면 변경 반영(수정일자로 변경 처리) + $deliveryDate = trim((string) ($this->request->getPost('so_delivery_date') ?? '')); + if (preg_match('/^\d{4}-\d{2}-\d{2}$/', $deliveryDate) === 1) { + $orderUpdate['so_delivery_date'] = $deliveryDate; + } + $orderModel->update($soIdx, $orderUpdate); $db->transComplete(); diff --git a/app/Views/bag/order_phone_manage.php b/app/Views/bag/order_phone_manage.php index e472783..3fabbf6 100644 --- a/app/Views/bag/order_phone_manage.php +++ b/app/Views/bag/order_phone_manage.php @@ -22,28 +22,15 @@ - - - - + + + + + + - - - - - - - - - - - - - - - - +
번호판매소접수일상태번호접수일배달일판매소금액상태
전화 주문 데이터가 없습니다.
@@ -65,7 +52,9 @@
결제수단 -
주소 -
접수일 -
-
배달일 -
+
배달일 + +
상태 -
@@ -136,8 +125,14 @@ t('detail-payment', order ? order.so_payment_type : ''); t('detail-shop-addr', order ? order.ds_addr : ''); t('detail-order-date', order ? order.so_order_date : ''); - t('detail-delivery-date', order ? order.so_delivery_date : ''); t('detail-status', order ? ((order.so_status === 'cancelled') ? '취소' : '정상') : ''); + // 배달일 — 수정 가능한 date 입력 + var dd = document.getElementById('detail-delivery-date-input'); + if (dd) { + var v = order && order.so_delivery_date ? String(order.so_delivery_date) : ''; + dd.value = /^\d{4}-\d{2}-\d{2}/.test(v) ? v.slice(0, 10) : ''; + dd.disabled = !order || order.so_status === 'cancelled'; + } } function calcRow(tr) { @@ -241,12 +236,54 @@ recalcTotals(); } + // ── 접수 리스트 렌더 + 헤더 클릭 정렬 ────────────────────────── + let sortKey = 'so_idx', sortDir = 'desc', selectedId = null; + const esc = (s) => String(s == null ? '' : s).replace(/[&<>]/g, (c) => ({ '&': '&', '<': '<', '>': '>' }[c])); + + function rowHtml(o) { + const cancelled = o.so_status === 'cancelled'; + const dDate = o.so_delivery_date ? String(o.so_delivery_date).slice(0, 10) : ''; + return ` + ${o.so_idx} + ${esc(o.so_order_date)} + ${esc(dDate)} + ${esc(o.so_ds_name)} + ${nf(o.so_total_amount || 0)} + ${cancelled ? '취소' : '정상'} + `; + } + + function renderList() { + const th = document.querySelector('.sort-th[data-sort="' + sortKey + '"]'); + const type = th ? th.dataset.type : 'str'; + const arr = orders.slice().sort((a, b) => { + let va = a[sortKey], vb = b[sortKey]; + if (type === 'num') { va = Number(va || 0); vb = Number(vb || 0); return sortDir === 'asc' ? va - vb : vb - va; } + va = String(va || ''); vb = String(vb || ''); + return sortDir === 'asc' ? va.localeCompare(vb, 'ko') : vb.localeCompare(va, 'ko'); + }); + listBody.innerHTML = arr.length + ? arr.map(rowHtml).join('') + : '전화 주문 데이터가 없습니다.'; + document.querySelectorAll('.sort-th .sort-ind').forEach((s) => { s.textContent = ''; }); + if (th) th.querySelector('.sort-ind').textContent = sortDir === 'asc' ? ' ▲' : ' ▼'; + } + + document.querySelectorAll('.sort-th').forEach((th) => { + th.addEventListener('click', () => { + const k = th.dataset.sort; + if (sortKey === k) { sortDir = sortDir === 'asc' ? 'desc' : 'asc'; } else { sortKey = k; sortDir = 'asc'; } + renderList(); + }); + }); + listBody?.addEventListener('click', (e) => { const tr = e.target.closest('.order-list-row'); if (!tr) return; + selectedId = tr.dataset.orderId; listBody.querySelectorAll('.order-list-row').forEach((row) => row.classList.remove('bg-blue-100')); tr.classList.add('bg-blue-100'); - renderDetail(tr.dataset.orderId); + renderDetail(selectedId); }); detailBody?.addEventListener('input', (e) => { @@ -268,10 +305,12 @@ } }); + renderList(); const firstRow = listBody?.querySelector('.order-list-row'); if (firstRow) { + selectedId = firstRow.dataset.orderId; firstRow.classList.add('bg-blue-100'); - renderDetail(firstRow.dataset.orderId); + renderDetail(selectedId); } })();