-
setEditing({ ...editing, VENDOR_NAME: e.target.value })} className="col-span-2 h-10 px-3 rounded-lg border border-slate-200" />
+
setEditing({ ...editing, VENDOR_NAME: e.target.value })} className="col-span-2 h-10 px-3 rounded-lg border border-slate-200" />
setEditing({ ...editing, CONTACT: e.target.value })} className="h-10 px-3 rounded-lg border border-slate-200" />
setEditing({ ...editing, PHONE: e.target.value })} className="h-10 px-3 rounded-lg border border-slate-200" />
setEditing({ ...editing, BIZ_NO: e.target.value })} className="h-10 px-3 rounded-lg border border-slate-200" />
diff --git a/src/app/(main)/m/orders/page.tsx b/src/app/(main)/m/orders/page.tsx
index bea0049..012a622 100644
--- a/src/app/(main)/m/orders/page.tsx
+++ b/src/app/(main)/m/orders/page.tsx
@@ -1,8 +1,9 @@
"use client";
-import { useEffect, useState } from "react";
+import { useEffect, useState, useRef } from "react";
import Link from "next/link";
-import { Download } from "lucide-react";
+import { Download, Image as ImageIcon, X, Eye, Trash2 } from "lucide-react";
+import Swal from "sweetalert2";
import { downloadXlsx } from "@/lib/xlsx-export";
interface Order {
@@ -13,10 +14,22 @@ interface Order {
TOTAL_AMOUNT: number;
TOTAL_TAXFREE: number;
TOTAL_TAXABLE: number;
+ TOTAL_SUPPLY?: number;
+ TOTAL_VAT?: number;
COMPANY_NAME?: string;
}
+interface DetailLine {
+ OBJID: string; SEQ: number; ITEM_NAME: string; UNIT?: string;
+ UNIT_PRICE: number; QTY: number; IS_TAX_FREE: string;
+ SUPPLY_AMOUNT: number; VAT_AMOUNT: number; TOTAL_AMOUNT: number;
+ KIND: "ITEM" | "DELIVERY" | "CHARTER"; EXTRA_LABEL?: string; REMARK?: string;
+}
+interface Supplier {
+ NAME: string; CEO: string; BIZ_NO: string;
+ BANK_ACCOUNT: string; PHONE: string; EMAIL: string; ADDRESS: string;
+}
-const fmt = (n: number) => Number(n || 0).toLocaleString("ko-KR");
+const fmt = (n: number | string | undefined) => Number(n || 0).toLocaleString("ko-KR");
const STATUS_LABEL: Record
= {
REQUESTED: "출고요청", APPROVED: "출고완료", SHIPPED: "출고완료",
PAID: "입금완료", INVOICED: "계산서발행", CANCELLED: "취소",
@@ -33,6 +46,7 @@ const STATUS_COLOR: Record = {
export default function MyOrdersPage() {
const [orders, setOrders] = useState([]);
const [status, setStatus] = useState("");
+ const [detail, setDetail] = useState<{ order: Order & { CEO_NAME?: string; BIZ_NO?: string; PHONE?: string; ADDRESS?: string; EMAIL?: string; MEMO?: string }; items: DetailLine[]; supplier: Supplier } | null>(null);
const load = async () => {
const res = await fetch("/api/m/orders/list", {
@@ -45,20 +59,47 @@ export default function MyOrdersPage() {
useEffect(() => { load(); }, []); // eslint-disable-line react-hooks/exhaustive-deps
+ const openDetail = async (o: Order) => {
+ const res = await fetch("/api/m/orders/detail", {
+ method: "POST", headers: { "Content-Type": "application/json" },
+ body: JSON.stringify({ objid: o.OBJID }),
+ });
+ const j = await res.json();
+ if (j.success) setDetail({ order: j.order, items: j.items, supplier: j.supplier });
+ };
+
+ const cancelOrder = async (o: Order) => {
+ const ok = await Swal.fire({
+ icon: "warning", title: "주문을 취소하시겠습니까?",
+ text: o.ORDER_NO,
+ showCancelButton: true, confirmButtonText: "취소", cancelButtonText: "닫기",
+ confirmButtonColor: "#dc2626",
+ });
+ if (!ok.isConfirmed) return;
+ const res = await fetch("/api/m/orders/cancel", {
+ method: "POST", headers: { "Content-Type": "application/json" },
+ body: JSON.stringify({ objid: o.OBJID }),
+ });
+ const j = await res.json();
+ if (j.success) {
+ Swal.fire({ icon: "success", title: "취소되었습니다", timer: 1200, showConfirmButton: false });
+ setDetail(null);
+ load();
+ } else {
+ Swal.fire({ icon: "error", title: "취소 실패", text: j.message });
+ }
+ };
+
const onExport = () => {
if (orders.length === 0) return;
- downloadXlsx(
- "발주이력",
- orders,
- [
- { header: "발주번호", key: "ORDER_NO", width: 18 },
- { header: "발주일", key: "ORDER_DATE", width: 12 },
- { header: "면세", key: (r) => Number(r.TOTAL_TAXFREE), width: 14 },
- { header: "과세", key: (r) => Number(r.TOTAL_TAXABLE), width: 14 },
- { header: "합계", key: (r) => Number(r.TOTAL_AMOUNT), width: 14 },
- { header: "상태", key: (r) => STATUS_LABEL[String(r.STATUS)] || String(r.STATUS), width: 10 },
- ]
- );
+ downloadXlsx("발주이력", orders, [
+ { header: "발주번호", key: "ORDER_NO", width: 18 },
+ { header: "발주일", key: "ORDER_DATE", width: 12 },
+ { header: "면세", key: (r) => Number(r.TOTAL_TAXFREE), width: 14 },
+ { header: "과세", key: (r) => Number(r.TOTAL_TAXABLE), width: 14 },
+ { header: "합계", key: (r) => Number(r.TOTAL_AMOUNT), width: 14 },
+ { header: "상태", key: (r) => STATUS_LABEL[String(r.STATUS)] || String(r.STATUS), width: 10 },
+ ]);
};
return (
@@ -66,14 +107,11 @@ export default function MyOrdersPage() {
내 발주 이력
-
전체 {orders.length}건
+
전체 {orders.length}건 — 행을 누르면 거래명세표가 열려요
-