diff --git a/frontend/components/order/OrderItemRepeaterTable.tsx b/frontend/components/order/OrderItemRepeaterTable.tsx index 19e31502..dd38ee5a 100644 --- a/frontend/components/order/OrderItemRepeaterTable.tsx +++ b/frontend/components/order/OrderItemRepeaterTable.tsx @@ -27,7 +27,7 @@ interface OrderItemRepeaterTableProps { // 수주 등록 전용 컬럼 설정 (고정) const ORDER_COLUMNS: RepeaterColumnConfig[] = [ { - field: "id", + field: "item_number", label: "품번", editable: false, width: "120px", @@ -36,14 +36,20 @@ const ORDER_COLUMNS: RepeaterColumnConfig[] = [ field: "item_name", label: "품명", editable: false, - width: "200px", + width: "180px", }, { - field: "item_number", - label: "품목번호", + field: "specification", + label: "규격", editable: false, width: "150px", }, + { + field: "material", + label: "재질", + editable: false, + width: "120px", + }, { field: "quantity", label: "수량", @@ -71,18 +77,11 @@ const ORDER_COLUMNS: RepeaterColumnConfig[] = [ }, { field: "delivery_date", - label: "납품일", + label: "납기일", type: "date", editable: true, width: "130px", }, - { - field: "note", - label: "비고", - type: "text", - editable: true, - width: "200px", - }, ]; // 수주 등록 전용 계산 공식 (고정) @@ -104,19 +103,20 @@ export function OrderItemRepeaterTable({ // 고정 설정 (수주 등록 전용) sourceTable="item_info" sourceColumns={[ - "id", - "item_name", "item_number", + "item_name", + "specification", + "material", "unit", "selling_price", ]} - sourceSearchFields={["item_name", "id", "item_number"]} + sourceSearchFields={["item_name", "item_number", "specification"]} modalTitle="품목 검색 및 선택" modalButtonText="품목 검색" multiSelect={true} columns={ORDER_COLUMNS} calculationRules={ORDER_CALCULATION_RULES} - uniqueField="id" + uniqueField="item_number" // 외부에서 제어 가능한 prop value={value} diff --git a/frontend/components/order/OrderRegistrationModal.tsx b/frontend/components/order/OrderRegistrationModal.tsx index 7a454cc1..adfee1b2 100644 --- a/frontend/components/order/OrderRegistrationModal.tsx +++ b/frontend/components/order/OrderRegistrationModal.tsx @@ -39,12 +39,28 @@ export function OrderRegistrationModal({ // 입력 방식 const [inputMode, setInputMode] = useState("customer_first"); + // 판매 유형 (국내/해외) + const [salesType, setSalesType] = useState("domestic"); + + // 단가 기준 (기준단가/거래처별단가) + const [priceType, setPriceType] = useState("standard"); + // 폼 데이터 const [formData, setFormData] = useState({ customerCode: "", customerName: "", + contactPerson: "", + deliveryDestination: "", + deliveryAddress: "", deliveryDate: "", memo: "", + // 무역 정보 (해외 판매 시) + incoterms: "", + paymentTerms: "", + currency: "KRW", + portOfLoading: "", + portOfDischarge: "", + hsCode: "", }); // 선택된 품목 목록 @@ -70,13 +86,32 @@ export function OrderRegistrationModal({ setIsSaving(true); // 수주 등록 API 호출 - const response = await apiClient.post("/orders", { + const orderData: any = { inputMode, + salesType, + priceType, customerCode: formData.customerCode, + contactPerson: formData.contactPerson, + deliveryDestination: formData.deliveryDestination, + deliveryAddress: formData.deliveryAddress, deliveryDate: formData.deliveryDate, items: selectedItems, memo: formData.memo, - }); + }; + + // 해외 판매 시 무역 정보 추가 + if (salesType === "export") { + orderData.tradeInfo = { + incoterms: formData.incoterms, + paymentTerms: formData.paymentTerms, + currency: formData.currency, + portOfLoading: formData.portOfLoading, + portOfDischarge: formData.portOfDischarge, + hsCode: formData.hsCode, + }; + } + + const response = await apiClient.post("/orders", orderData); if (response.data.success) { toast.success("수주가 등록되었습니다"); @@ -107,11 +142,22 @@ export function OrderRegistrationModal({ // 폼 초기화 const resetForm = () => { setInputMode("customer_first"); + setSalesType("domestic"); + setPriceType("standard"); setFormData({ customerCode: "", customerName: "", + contactPerson: "", + deliveryDestination: "", + deliveryAddress: "", deliveryDate: "", memo: "", + incoterms: "", + paymentTerms: "", + currency: "KRW", + portOfLoading: "", + portOfDischarge: "", + hsCode: "", }); setSelectedItems([]); }; @@ -133,55 +179,129 @@ export function OrderRegistrationModal({
- {/* 입력 방식 선택 */} -
- - + {/* 상단 셀렉트 박스 3개 */} +
+ {/* 입력 방식 */} +
+ + +
+ + {/* 판매 유형 */} +
+ + +
+ + {/* 단가 기준 */} +
+ + +
- {/* 입력 방식에 따른 동적 폼 */} + {/* 거래처 정보 (항상 표시) */} {inputMode === "customer_first" && ( -
- {/* 거래처 검색 */} -
- - { - setFormData({ - ...formData, - customerCode: code || "", - customerName: fullData?.customer_name || "", - }); - }} - /> +
+
+ 🏢 + 거래처 정보
- {/* 납품일 */} -
- - - setFormData({ ...formData, deliveryDate: e.target.value }) - } - className="h-8 text-xs sm:h-10 sm:text-sm" - /> +
+ {/* 거래처 */} +
+ + { + setFormData({ + ...formData, + customerCode: code || "", + customerName: fullData?.customer_name || "", + }); + }} + /> +
+ + {/* 담당자 */} +
+ + + setFormData({ ...formData, contactPerson: e.target.value }) + } + className="h-8 text-xs sm:h-10 sm:text-sm" + /> +
+ + {/* 납품처 */} +
+ + + setFormData({ ...formData, deliveryDestination: e.target.value }) + } + className="h-8 text-xs sm:h-10 sm:text-sm" + /> +
+ + {/* 납품장소 */} +
+ + + setFormData({ ...formData, deliveryAddress: e.target.value }) + } + className="h-8 text-xs sm:h-10 sm:text-sm" + /> +
)} @@ -228,6 +348,140 @@ export function OrderRegistrationModal({
)} + {/* 무역 정보 (해외 판매 시에만 표시) */} + {salesType === "export" && ( +
+
+ 🌏 + 무역 정보 +
+ +
+ {/* 인코텀즈 */} +
+ + +
+ + {/* 결제 조건 */} +
+ + +
+ + {/* 통화 */} +
+ + +
+
+ +
+ {/* 선적항 */} +
+ + + setFormData({ ...formData, portOfLoading: e.target.value }) + } + className="h-8 text-xs sm:h-10 sm:text-sm" + /> +
+ + {/* 도착항 */} +
+ + + setFormData({ ...formData, portOfDischarge: e.target.value }) + } + className="h-8 text-xs sm:h-10 sm:text-sm" + /> +
+ + {/* HS Code */} +
+ + + setFormData({ ...formData, hsCode: e.target.value }) + } + className="h-8 text-xs sm:h-10 sm:text-sm" + /> +
+
+
+ )} + {/* 메모 */}