diff --git a/src/app/(main)/m/admin/invoices/page.tsx b/src/app/(main)/m/admin/invoices/page.tsx index 3d284fd..29d48d0 100644 --- a/src/app/(main)/m/admin/invoices/page.tsx +++ b/src/app/(main)/m/admin/invoices/page.tsx @@ -21,8 +21,8 @@ interface Order { interface Customer { USER_ID: string; USER_NAME: string } const fmt = (n: number) => Number(n || 0).toLocaleString("ko-KR"); +// 계산서 발행 대상 — 입금완료(PAID) 이후만. 출고완료(APPROVED)/출고요청 은 노출 안 함. const STATUS_LABEL: Record = { - APPROVED: "출고완료", PAID: "입금완료", INVOICED: "계산서발행", }; @@ -54,7 +54,8 @@ export default function InvoicesPage() { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({}), }); const rows = ((await res.json()).RESULTLIST ?? []) as Order[]; - setAll(rows.filter((o) => ["APPROVED", "PAID", "INVOICED"].includes(o.STATUS))); + // 입금완료(PAID) + 계산서발행(INVOICED) 만 표시. 출고완료(APPROVED) 는 발행 대상 아님. + setAll(rows.filter((o) => ["PAID", "INVOICED"].includes(o.STATUS))); }, []); useEffect(() => { loadAll(); loadCustomers(); }, [loadAll, loadCustomers]); @@ -96,8 +97,9 @@ export default function InvoicesPage() { }, [list]); const issue = async () => { - const targets = list.filter((o) => selected.has(o.OBJID) && !o.INVOICE_NO); - if (targets.length === 0) return Swal.fire({ icon: "warning", title: "발행 대상 없음", text: "이미 발행된 건은 제외됩니다." }); + // 발행 가능 = 선택됨 + 입금완료(PAID) + 아직 미발행 (INVOICE_NO 없음) + const targets = list.filter((o) => selected.has(o.OBJID) && o.STATUS === "PAID" && !o.INVOICE_NO); + if (targets.length === 0) return Swal.fire({ icon: "warning", title: "발행 대상 없음", text: "입금완료된 미발행 건만 발행할 수 있습니다." }); const sum = targets.reduce((a, o) => a + Number(o.TOTAL_AMOUNT), 0); const r = await Swal.fire({ icon: "question", diff --git a/src/app/api/m/orders/invoice/route.ts b/src/app/api/m/orders/invoice/route.ts index 3c7d34a..0b6560a 100644 --- a/src/app/api/m/orders/invoice/route.ts +++ b/src/app/api/m/orders/invoice/route.ts @@ -22,10 +22,11 @@ export async function POST(req: NextRequest) { for (const id of objids) { lastNum++; const invNo = prefix + String(lastNum).padStart(4, "0"); + // 계산서 발행은 입금완료(PAID) 건만 허용 await execute( `UPDATE momo_orders SET status='INVOICED', invoice_no=$2, invoice_date=CURRENT_DATE, update_date=NOW() - WHERE objid=$1 AND status IN ('APPROVED','PAID')`, + WHERE objid=$1 AND status = 'PAID'`, [id, invNo] ); }