diff --git a/src/app/(main)/m/admin/orders/page.tsx b/src/app/(main)/m/admin/orders/page.tsx index 7a410ad..a905c70 100644 --- a/src/app/(main)/m/admin/orders/page.tsx +++ b/src/app/(main)/m/admin/orders/page.tsx @@ -35,7 +35,6 @@ const fmt = (n: number | string | undefined | null) => const STATUS_LABEL: Record = { REQUESTED: "출고요청", APPROVED: "출고완료", - SHIPPED: "출고완료", PAID: "입금완료", INVOICED: "계산서발행", CANCELLED: "취소", @@ -43,7 +42,6 @@ const STATUS_LABEL: Record = { const STATUS_COLOR: Record = { REQUESTED: "bg-amber-100 text-amber-700 border-amber-200", APPROVED: "bg-blue-100 text-blue-700 border-blue-200", - SHIPPED: "bg-cyan-100 text-cyan-700 border-cyan-200", PAID: "bg-emerald-100 text-emerald-700 border-emerald-200", INVOICED: "bg-violet-100 text-violet-700 border-violet-200", CANCELLED: "bg-slate-100 text-slate-500 border-slate-200", @@ -725,7 +723,7 @@ function StatementPreview({ )} - {(order.STATUS === "APPROVED" || order.STATUS === "SHIPPED" || order.STATUS === "PAID") && ( + {(order.STATUS === "APPROVED" || order.STATUS === "PAID") && (
출고 완료 {order.APPROVE_DATE && `— ${order.APPROVE_DATE}`} diff --git a/src/app/(main)/m/admin/payments/page.tsx b/src/app/(main)/m/admin/payments/page.tsx index ed0fbfa..8ddc881 100644 --- a/src/app/(main)/m/admin/payments/page.tsx +++ b/src/app/(main)/m/admin/payments/page.tsx @@ -1,21 +1,56 @@ "use client"; -import { useEffect, useState } from "react"; +import { useEffect, useState, useCallback } from "react"; +import { RefreshCcw } from "lucide-react"; import Swal from "sweetalert2"; interface Order { OBJID: string; ORDER_NO: string; ORDER_DATE: string; COMPANY_NAME: string; STATUS: string; TOTAL_AMOUNT: number; PAID_AMOUNT: number } const fmt = (n: number) => Number(n || 0).toLocaleString("ko-KR"); const STATUS_LABEL: Record = { APPROVED: "출고완료", PAID: "입금완료", INVOICED: "계산서발행" }; +const pad = (n: number) => String(n).padStart(2, "0"); +const todayStr = () => { const d = new Date(); return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`; }; +const monthStartStr = () => { const d = new Date(); return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-01`; }; + +// 입금상태 필터: 전체 / 입금 전(APPROVED) / 입금완료(PAID, INVOICED) +type PayFilter = "" | "UNPAID" | "PAID"; + export default function PaymentsPage() { const [list, setList] = useState([]); + const [loading, setLoading] = useState(false); - const load = async () => { - const res = await fetch("/api/m/orders/list", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({}) }); - const all = ((await res.json()).RESULTLIST ?? []) as Order[]; - setList(all.filter((o) => ["APPROVED", "PAID", "INVOICED"].includes(o.STATUS))); - }; - useEffect(() => { load(); }, []); + const [keyword, setKeyword] = useState(""); + const [dateFrom, setDateFrom] = useState(monthStartStr()); + const [dateTo, setDateTo] = useState(todayStr()); + const [payFilter, setPayFilter] = useState(""); + + const load = useCallback(async () => { + setLoading(true); + try { + const res = await fetch("/api/m/orders/list", { + method: "POST", headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + dateFrom: dateFrom || undefined, + dateTo: dateTo || undefined, + keyword: keyword || undefined, + }), + }); + const all = ((await res.json()).RESULTLIST ?? []) as Order[]; + // 출고완료 이후만 (대기/취소 제외) + 상태 필터 + const filtered = all.filter((o) => { + if (!["APPROVED", "PAID", "INVOICED"].includes(o.STATUS)) return false; + if (payFilter === "UNPAID" && o.STATUS !== "APPROVED") return false; + if (payFilter === "PAID" && o.STATUS === "APPROVED") return false; + return true; + }); + setList(filtered); + } finally { + setLoading(false); + } + }, [dateFrom, dateTo, keyword, payFilter]); + + // 최초 1회만 자동 로드. 검색 조건 변경은 [조회] 버튼으로 + useEffect(() => { load(); }, []); // eslint-disable-line const onPay = async (o: Order) => { const remain = Number(o.TOTAL_AMOUNT) - Number(o.PAID_AMOUNT || 0); @@ -41,12 +76,56 @@ export default function PaymentsPage() { const paidCnt = list.filter((o) => o.STATUS !== "APPROVED").length; return ( -
+

입금 관리

출고완료 후 거래처 입금 등록 — 완납 시 상태가 입금완료로 자동 변경됩니다.

+ {/* 검색 영역 — 모바일 1열 / sm 2열 / lg 5열 */} +
+
+
+ + setDateFrom(e.target.value)} + className="w-full h-9 px-2 rounded-lg border border-slate-200 text-sm" /> +
+
+ + setDateTo(e.target.value)} + className="w-full h-9 px-2 rounded-lg border border-slate-200 text-sm" /> +
+
+ + +
+
+ + setKeyword(e.target.value)} + onKeyDown={(e) => e.key === "Enter" && load()} + placeholder="검색어" + className="w-full h-9 px-2 rounded-lg border border-slate-200 text-sm" /> +
+
+ + +
+
+
+ {/* 요약 카드 */}
@@ -67,7 +146,7 @@ export default function PaymentsPage() {
{list.length === 0 ? (
- 출고완료 건이 없습니다. + {loading ? "조회 중..." : "조회 결과가 없습니다."}
) : list.map((o) => { const remain = Number(o.TOTAL_AMOUNT) - Number(o.PAID_AMOUNT || 0); @@ -125,7 +204,7 @@ export default function PaymentsPage() { {list.length === 0 ? ( - 출고완료 건이 없습니다. + {loading ? "조회 중..." : "조회 결과가 없습니다."} ) : list.map((o) => { const remain = Number(o.TOTAL_AMOUNT) - Number(o.PAID_AMOUNT || 0); return ( diff --git a/src/app/(main)/m/dashboard/page.tsx b/src/app/(main)/m/dashboard/page.tsx index bd2cea1..f6a5794 100644 --- a/src/app/(main)/m/dashboard/page.tsx +++ b/src/app/(main)/m/dashboard/page.tsx @@ -17,13 +17,12 @@ const pad = (n: number) => String(n).padStart(2, "0"); const todayISO = () => { const d = new Date(); return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`; }; const firstOfMonthISO = () => { const d = new Date(); return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-01`; }; const STATUS_LABEL: Record = { - REQUESTED: "출고요청", APPROVED: "출고완료", SHIPPED: "출고완료", + REQUESTED: "출고요청", APPROVED: "출고완료", PAID: "입금완료", INVOICED: "계산서발행", CANCELLED: "취소", }; const STATUS_COLOR: Record = { REQUESTED: "bg-amber-100 text-amber-700", APPROVED: "bg-blue-100 text-blue-700", - SHIPPED: "bg-cyan-100 text-cyan-700", INVOICED: "bg-violet-100 text-violet-700", PAID: "bg-emerald-100 text-emerald-700", CANCELLED: "bg-slate-100 text-slate-500", diff --git a/src/app/(main)/m/orders/page.tsx b/src/app/(main)/m/orders/page.tsx index 412d76f..3f1c4c9 100644 --- a/src/app/(main)/m/orders/page.tsx +++ b/src/app/(main)/m/orders/page.tsx @@ -31,13 +31,12 @@ interface Supplier { const fmt = (n: number | string | undefined) => Number(n || 0).toLocaleString("ko-KR"); const STATUS_LABEL: Record = { - REQUESTED: "출고요청", APPROVED: "출고완료", SHIPPED: "출고완료", + REQUESTED: "출고요청", APPROVED: "출고완료", PAID: "입금완료", INVOICED: "계산서발행", CANCELLED: "취소", }; const STATUS_COLOR: Record = { REQUESTED: "bg-amber-100 text-amber-700", APPROVED: "bg-blue-100 text-blue-700", - SHIPPED: "bg-cyan-100 text-cyan-700", INVOICED: "bg-violet-100 text-violet-700", PAID: "bg-emerald-100 text-emerald-700", CANCELLED: "bg-slate-100 text-slate-500",