summaryrefslogtreecommitdiff
path: root/lib/rfq-last
diff options
context:
space:
mode:
Diffstat (limited to 'lib/rfq-last')
-rw-r--r--lib/rfq-last/service.ts5
-rw-r--r--lib/rfq-last/table/create-general-rfq-dialog.tsx108
2 files changed, 88 insertions, 25 deletions
diff --git a/lib/rfq-last/service.ts b/lib/rfq-last/service.ts
index 50a5c64c..d4efb81d 100644
--- a/lib/rfq-last/service.ts
+++ b/lib/rfq-last/service.ts
@@ -413,8 +413,9 @@ export async function createGeneralRfqAction(input: CreateGeneralRfqInput) {
prItem: null, // 일반견적에서는 PR 아이템 번호를 null로 설정
prNo: null, // 일반견적에서는 PR 번호를 null로 설정
- materialCode: item.itemCode,
- materialDescription: item.itemName,
+ materialCode: item.materialCode || item.itemCode, // SAP 자재코드 (없으면 자재그룹코드 사용)
+ materialCategory: item.itemCode, // 자재그룹코드
+ materialDescription: item.materialName || item.itemName, // SAP 자재명 (없으면 자재그룹명 사용)
quantity: item.quantity,
uom: item.uom,
diff --git a/lib/rfq-last/table/create-general-rfq-dialog.tsx b/lib/rfq-last/table/create-general-rfq-dialog.tsx
index 4ad21695..b46249f0 100644
--- a/lib/rfq-last/table/create-general-rfq-dialog.tsx
+++ b/lib/rfq-last/table/create-general-rfq-dialog.tsx
@@ -50,6 +50,8 @@ import { Separator } from "@/components/ui/separator"
import { createGeneralRfqAction, previewGeneralRfqCode } from "../service"
import { MaterialGroupSelectorDialogSingle } from "@/components/common/material/material-group-selector-dialog-single"
import { MaterialSearchItem } from "@/lib/material/material-group-service" // 단순 타입 임포트 목적
+import { MaterialSelectorDialogSingle } from "@/components/common/selectors/material/material-selector-dialog-single"
+import { MaterialSearchItem as SAPMaterialSearchItem } from "@/components/common/selectors/material/material-service"
import { ProjectSelector } from "@/components/ProjectSelector"
import {
PurchaseGroupCodeSingleSelector,
@@ -60,6 +62,8 @@ import {
const itemSchema = z.object({
itemCode: z.string().optional(),
itemName: z.string().min(1, "자재명을 입력해주세요"),
+ materialCode: z.string().optional(),
+ materialName: z.string().optional(),
quantity: z.number().min(1, "수량은 1 이상이어야 합니다"),
uom: z.string().min(1, "단위를 입력해주세요"),
remark: z.string().optional(),
@@ -99,23 +103,25 @@ export function CreateGeneralRfqDialog({ onSuccess }: CreateGeneralRfqDialogProp
const form = useForm<CreateGeneralRfqFormValues>({
resolver: zodResolver(createGeneralRfqSchema),
- defaultValues: {
- rfqType: "",
- rfqTitle: "",
- dueDate: undefined,
- picUserId: userId || undefined,
- projectId: undefined,
- remark: "",
- items: [
- {
- itemCode: "",
- itemName: "",
- quantity: 1,
- uom: "",
- remark: "",
- },
- ],
- },
+ defaultValues: {
+ rfqType: "",
+ rfqTitle: "",
+ dueDate: undefined,
+ picUserId: userId || undefined,
+ projectId: undefined,
+ remark: "",
+ items: [
+ {
+ itemCode: "",
+ itemName: "",
+ materialCode: "",
+ materialName: "",
+ quantity: 1,
+ uom: "",
+ remark: "",
+ },
+ ],
+ },
})
const { fields, append, remove } = useFieldArray({
@@ -195,6 +201,8 @@ export function CreateGeneralRfqDialog({ onSuccess }: CreateGeneralRfqDialogProp
{
itemCode: "",
itemName: "",
+ materialCode: "",
+ materialName: "",
quantity: 1,
uom: "",
remark: "",
@@ -208,7 +216,25 @@ export function CreateGeneralRfqDialog({ onSuccess }: CreateGeneralRfqDialogProp
}
const handleCancel = () => {
- form.reset()
+ form.reset({
+ rfqType: "",
+ rfqTitle: "",
+ dueDate: undefined,
+ picUserId: userId || undefined,
+ projectId: undefined,
+ remark: "",
+ items: [
+ {
+ itemCode: "",
+ itemName: "",
+ materialCode: "",
+ materialName: "",
+ quantity: 1,
+ uom: "",
+ remark: "",
+ },
+ ],
+ })
setOpen(false)
}
@@ -232,6 +258,8 @@ export function CreateGeneralRfqDialog({ onSuccess }: CreateGeneralRfqDialogProp
items: data.items as Array<{
itemCode: string;
itemName: string;
+ materialCode?: string;
+ materialName?: string;
quantity: number;
uom: string;
remark?: string;
@@ -275,6 +303,8 @@ export function CreateGeneralRfqDialog({ onSuccess }: CreateGeneralRfqDialogProp
append({
itemCode: "",
itemName: "",
+ materialCode: "",
+ materialName: "",
quantity: 1,
uom: "",
remark: "",
@@ -541,14 +571,14 @@ export function CreateGeneralRfqDialog({ onSuccess }: CreateGeneralRfqDialogProp
)}
</div>
- {/* 자재 선택 - 그리드 외부 */}
+ {/* 자재그룹 선택 - 그리드 외부 */}
<div className="mb-3">
<FormLabel className="text-xs">
자재그룹(자재그룹명) <span className="text-red-500">*</span>
</FormLabel>
<div className="mt-1">
<MaterialGroupSelectorDialogSingle
- triggerLabel="자재 선택"
+ triggerLabel="자재그룹 선택"
selectedMaterial={(() => {
const itemCode = form.watch(`items.${index}.itemCode`);
const itemName = form.watch(`items.${index}.itemName`);
@@ -565,9 +595,41 @@ export function CreateGeneralRfqDialog({ onSuccess }: CreateGeneralRfqDialogProp
form.setValue(`items.${index}.itemCode`, material?.materialGroupCode || '');
form.setValue(`items.${index}.itemName`, material?.materialGroupDescription || '');
}}
- placeholder="자재를 검색하세요..."
- title="자재 선택"
- description="원하는 자재를 검색하고 선택해주세요."
+ placeholder="자재그룹을 검색하세요..."
+ title="자재그룹 선택"
+ description="원하는 자재그룹을 검색하고 선택해주세요."
+ triggerVariant="outline"
+ />
+ </div>
+ </div>
+
+ {/* 자재코드 선택 - 그리드 외부 */}
+ <div className="mb-3">
+ <FormLabel className="text-xs">
+ 자재코드(자재명)
+ </FormLabel>
+ <div className="mt-1">
+ <MaterialSelectorDialogSingle
+ triggerLabel="자재코드 선택"
+ selectedMaterial={(() => {
+ const materialCode = form.watch(`items.${index}.materialCode`);
+ const materialName = form.watch(`items.${index}.materialName`);
+ if (materialCode && materialName) {
+ return {
+ materialCode: materialCode,
+ materialName: materialName,
+ displayText: `${materialCode} - ${materialName}`
+ } as SAPMaterialSearchItem;
+ }
+ return null;
+ })()}
+ onMaterialSelect={(material) => {
+ form.setValue(`items.${index}.materialCode`, material?.materialCode || '');
+ form.setValue(`items.${index}.materialName`, material?.materialName || '');
+ }}
+ placeholder="자재코드를 검색하세요..."
+ title="자재코드 선택"
+ description="원하는 자재코드를 검색하고 선택해주세요."
triggerVariant="outline"
/>
</div>