// === Logen courier shipping label / invoice === function ShippingScreen({ orders, setOrders }) { const { PRODUCTS } = window.MOCK; const paidOrders = orders.filter(o => o.status === "paid"); const [selected, setSelected] = useState(new Set(paidOrders.map(o => o.id))); const [previewMode, setPreviewMode] = useState("table"); // table / labels const orderTotal = (o) => o.items.reduce((s, it) => { const p = PRODUCTS.find(x => x.id === it.pid); return s + (p ? p.price * it.qty : 0); }, 0); const itemsLabel = (o) => o.items.map(it => { const p = PRODUCTS.find(x => x.id === it.pid); return `${p?.name || it.pid} ${it.qty}개`; }).join(" + "); const toggleOne = (id) => { const s = new Set(selected); if (s.has(id)) s.delete(id); else s.add(id); setSelected(s); }; const toggleAll = () => { if (selected.size === paidOrders.length) setSelected(new Set()); else setSelected(new Set(paidOrders.map(o => o.id))); }; const selectedOrders = paidOrders.filter(o => selected.has(o.id)); const printNow = () => { window.print(); }; const downloadXlsx = () => { // Simulate Logen xlsx export const headers = ["수령인명", "수령인전화번호", "수령인우편번호", "수령인주소", "품목명", "수량", "박스수량", "운임구분", "배송메시지", "주문번호"]; const rows = selectedOrders.map(o => [ o.buyer, o.phone, o.zipcode, o.address, itemsLabel(o), o.items.reduce((s, it) => s + it.qty, 0), 1, "선불", o.memo || "", o.id ]); const csv = "\uFEFF" + [headers, ...rows].map(r => r.map(x => `"${String(x).replace(/"/g, '""')}"`).join(",")).join("\r\n"); const blob = new Blob([csv], { type: "text/csv;charset=utf-8;" }); const url = URL.createObjectURL(blob); const a = document.createElement("a"); a.href = url; a.download = `LOGEN_송장_${new Date().toISOString().slice(0, 10)}.csv`; a.click(); URL.revokeObjectURL(url); toast(`로젠 송장 양식 ${selectedOrders.length}건 다운로드 완료`); }; const markShipped = () => { setOrders(prev => prev.map(o => selected.has(o.id) ? { ...o, status: "shipped" } : o)); setSelected(new Set()); toast(`${selectedOrders.length}건 발송 처리되었습니다`); }; return ( <>
발송 대기 {paidOrders.length}건 · 로젠택배 표준 양식 (수령인/주소/연락처/품목/수량)
| 수령인명 | 전화번호 | 우편번호 | 주소 | 품목명 | 수량 | 운임 | 배송메시지 | 주문번호 | |
|---|---|---|---|---|---|---|---|---|---|
| toggleOne(o.id)} /> | {o.buyer} | {o.phone} | {o.zipcode} | {o.address} | {itemsLabel(o)} | {o.items.reduce((s, it) => s + it.qty, 0)} | 선불 | {o.memo || "-"} | {o.id} |