// === 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}건 · 로젠택배 표준 양식 (수령인/주소/연락처/품목/수량)

0 && selected.size === paidOrders.length} onChange={toggleAll} /> 전체 선택 ({selected.size}/{paidOrders.length})
로젠택배 운임구분: 선불 · 박스 1박스 기본
{paidOrders.length === 0 ? (
발송 대기 중인 주문이 없습니다
결제완료 상태의 주문이 여기에 표시됩니다
) : previewMode === "table" ? (
{paidOrders.map(o => ( ))}
수령인명 전화번호 우편번호 주소 품목명 수량 운임 배송메시지 주문번호
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}
) : (
{selectedOrders.map(o => )}
)}
{/* Print-only labels */}
{selectedOrders.map(o => (
))}
); } function InvoiceLabel({ order, itemsLabel }) { return (
LOGEN
로젠택배 주식회사 · 1588-9988
운임: 선불
받는분
{order.buyer}   {order.phone}
주소
[{order.zipcode}] {order.address}
품목
{itemsLabel}
주문번호
{order.id}
{order.memo && <>
메시지
{order.memo}
}
보내는분: 스마트팜 (02-1234-5678) · 서울시 송파구 위례성대로 1
{/* Fake barcode */} {[...Array(28)].map((_, i) => ( 0.5 ? 1.5 : 2.5} height="32" fill="black" /> ))}
); } window.ShippingScreen = ShippingScreen;