From 87fbf15e2b44db1c97adb56938dd69c78354a0c5 Mon Sep 17 00:00:00 2001 From: bicochan Date: Tue, 22 Sep 2026 10:23:10 +0900 Subject: [PATCH 1/8] =?UTF-8?q?[as]=20feat:=20=EC=9E=AC=EC=9B=90=ED=98=91?= =?UTF-8?q?=EC=9D=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pages/fnrs-cnsltn/lib/button-config.ts | 1 - .../pages/fnrs-cnsltn/ui/fnrs-form-page.tsx | 5 + .../pbadms-sprt/ui/fnrs-shar-form-section.tsx | 98 ++++++++++++------- 3 files changed, 67 insertions(+), 37 deletions(-) diff --git a/apps/as/src/pages/fnrs-cnsltn/lib/button-config.ts b/apps/as/src/pages/fnrs-cnsltn/lib/button-config.ts index 3b0aca199..2c52dfa9d 100644 --- a/apps/as/src/pages/fnrs-cnsltn/lib/button-config.ts +++ b/apps/as/src/pages/fnrs-cnsltn/lib/button-config.ts @@ -51,7 +51,6 @@ const ROLE_STATUS_BUTTON_ACTIONS: Record(); const fnrsSharList = useWatch({ control, name: "fnrsSharList" }) ?? []; - const [uploadedFileName, setUploadedFileName] = useState( - () => initialSharAtchFiles?.[0]?.orgnlFileNm ?? "", + const [uploadedFile, setUploadedFile] = useState(() => + toInitialSharFile(initialSharAtchFiles?.[0]), ); + const { mutate: downloadByAtflId } = useDownloadAttachmentByAtflId(); const { data: masterTree = [], isLoading: isMasterLoading } = useFnrsSharSeMngTree(); const { data: acntgTree = [] } = useAcntgSeMngTree(); @@ -78,9 +95,13 @@ function FnrsSharFormSection({ initialSharTree, initialSharAtchFiles }: FnrsShar const isLoading = initialSharTree?.length ? false : isMasterLoading; const { uploadFileAsync, isUploading } = useTus({ - onSuccess: (atflCd) => { + onSuccess: (atflCd, atflId, _file, fileKey) => { if (!atflCd) return; setValue("fnrsCnsltnMng.sharAtchFileGroupId", atflCd, { shouldDirty: true }); + setUploadedFile((prev) => (prev?.fileKey === fileKey ? { ...prev, atflId } : prev)); + }, + onError: (_error, _file, fileKey) => { + setUploadedFile((prev) => (prev?.fileKey === fileKey ? null : prev)); }, }); const isSharUploading = Object.values(isUploading).some(Boolean); @@ -120,16 +141,32 @@ function FnrsSharFormSection({ initialSharTree, initialSharAtchFiles }: FnrsShar applySharList(draft); } - async function handleSharFileChange(event: React.ChangeEvent) { - const file = event.target.files?.[0]; + async function handleSharFileAdd(files: FileList | null) { + const file = files?.[0]; if (!file) return; const fileKey = createSharUploadKey(file); - setUploadedFileName(file.name); - await uploadFileAsync(file, { fileKey }); - event.target.value = ""; + setUploadedFile({ fileName: file.name, fileKey }); + + try { + await uploadFileAsync(file, { fileKey }); + } catch { + // onError callback handles cleanup + } } + const sharAtchFiles = uploadedFile + ? [ + { + fileKey: uploadedFile.fileKey, + fileName: uploadedFile.fileName, + onDownload: uploadedFile.atflId + ? () => downloadByAtflId(uploadedFile.atflId!) + : undefined, + }, + ] + : []; + if (isLoading) { return ( @@ -257,31 +294,20 @@ function FnrsSharFormSection({ initialSharTree, initialSharAtchFiles }: FnrsShar

첨부파일

-
- {isSharUploading && uploadedFileName ? ( - - {uploadedFileName} - - ) : ( - - )} - -
+ {!uploadedFile ? ( +

+ 총사업비 신청서(.hwp) 파일을 등록해주세요. +

+ ) : null} + void handleSharFileAdd(fileList)} + />
); From 0dd2111cb947c4d67f7c25dc0703183e4f7d458e Mon Sep 17 00:00:00 2001 From: bicochan Date: Tue, 22 Sep 2026 10:57:41 +0900 Subject: [PATCH 2/8] =?UTF-8?q?[as]=20refactor:=20=EC=9E=AC=EC=9B=90?= =?UTF-8?q?=ED=98=91=EC=9D=98=20=ED=8F=BC=20useWatch=20+=20Controller=20?= =?UTF-8?q?=EB=B0=A9=EC=8B=9D=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/attachments-form-section.tsx | 160 +++++++++--------- .../ui/business-cost-form-section.tsx | 115 ++++++------- .../ui/business-scale-form-section.tsx | 93 +++++----- .../pbadms-sprt/ui/checklist-form-section.tsx | 105 +++++------- .../pbadms-sprt/ui/fnrs-shar-form-section.tsx | 79 ++++----- 5 files changed, 243 insertions(+), 309 deletions(-) diff --git a/apps/as/src/widgets/pbadms-sprt/ui/attachments-form-section.tsx b/apps/as/src/widgets/pbadms-sprt/ui/attachments-form-section.tsx index 987c1d6ab..064691f14 100644 --- a/apps/as/src/widgets/pbadms-sprt/ui/attachments-form-section.tsx +++ b/apps/as/src/widgets/pbadms-sprt/ui/attachments-form-section.tsx @@ -1,7 +1,7 @@ "use client"; import { useEffect, useRef, useState } from "react"; -import { Controller, useFormContext } from "react-hook-form"; +import { useFormContext } from "react-hook-form"; import { useQueryClient } from "@tanstack/react-query"; import { Download } from "lucide-react"; @@ -78,7 +78,7 @@ function AttachmentsFormSection({ initialEsntlFiles, initialEtcFiles, }: AttachmentsFormSectionProps) { - const { control, getValues, setValue } = useFormContext(); + const { getValues, setValue } = useFormContext(); const queryClient = useQueryClient(); const [uploadedFiles, setUploadedFiles] = useState>({}); const [etcFiles, setEtcFiles] = useState([]); @@ -373,89 +373,83 @@ function AttachmentsFormSection({ return (
- ( -
-

필수 첨부파일

- - - - - - - - - - 파일명 - - 파일 확장자 - 파일첨부 - - - - {essentialFiles.length === 0 ? ( - - - 조회된 필수 첨부파일 항목이 없습니다. +
+

필수 첨부파일

+
+ + + + + + + + + 파일명 + + 파일 확장자 + 파일첨부 + + + + {essentialFiles.length === 0 ? ( + + + 조회된 필수 첨부파일 항목이 없습니다. + + + ) : ( + essentialFiles.map((file) => { + const atflCd = file.atchFileGroupId ?? ""; + + return ( + + +
+ {file.esntlAtchFileNm} + {atflCd ? ( + + ) : null} +
+
+ {file.esntlAtchFileRmrk} + + ({ + fileKey: item.fileKey, + fileName: item.file?.name ?? item.fileName, + onDownload: item.atflId + ? () => downloadByAtflId(item.atflId!) + : undefined, + }))} + inputId={`${file.esntlAtchFileId}-file-input`} + isUploadingByKey={isUploading} + accept={toFileAccept(file.esntlAtchFileRmrk) || undefined} + onAdd={(fileList) => + void handleEssentialFileUpload(file.esntlAtchFileId, fileList) + } + onRemove={(index) => + void removeEssentialFile(file.esntlAtchFileId, index) + } + />
- ) : ( - essentialFiles.map((file) => { - const atflCd = file.atchFileGroupId ?? ""; - - return ( - - -
- {file.esntlAtchFileNm} - {atflCd ? ( - - ) : null} -
-
- {file.esntlAtchFileRmrk} - - ({ - fileKey: item.fileKey, - fileName: item.file?.name ?? item.fileName, - onDownload: item.atflId - ? () => downloadByAtflId(item.atflId!) - : undefined, - }))} - inputId={`${file.esntlAtchFileId}-file-input`} - isUploadingByKey={isUploading} - accept={toFileAccept(file.esntlAtchFileRmrk) || undefined} - onAdd={(fileList) => - void handleEssentialFileUpload(file.esntlAtchFileId, fileList) - } - onRemove={(index) => - void removeEssentialFile(file.esntlAtchFileId, index) - } - /> - -
- ); - }) - )} -
-
-
- )} - /> + ); + }) + )} + + +
diff --git a/apps/as/src/widgets/pbadms-sprt/ui/business-cost-form-section.tsx b/apps/as/src/widgets/pbadms-sprt/ui/business-cost-form-section.tsx index dc50504a5..9bc5ce92d 100644 --- a/apps/as/src/widgets/pbadms-sprt/ui/business-cost-form-section.tsx +++ b/apps/as/src/widgets/pbadms-sprt/ui/business-cost-form-section.tsx @@ -1,7 +1,7 @@ "use client"; import { useEffect, useMemo } from "react"; -import { Controller, useFormContext, useWatch } from "react-hook-form"; +import { useFormContext, useWatch } from "react-hook-form"; import { SectionCollapsible } from "@/shared/ui"; import { Field } from "@/shared/ui/field"; @@ -31,6 +31,16 @@ interface BusinessCostFormData { type CostFieldKey = "bscPlanAmt" | "bgtRfltAmt" | "tstmDesignAmt"; +function isSameBizCstCodes( + current: BusinessCostFormData["bizCstList"], + next: BusinessCostFormData["bizCstList"], +) { + return ( + current.length === next.length && + current.every((item, index) => item.acntgSeCd === next[index]?.acntgSeCd) + ); +} + function BusinessCostFormSection() { const { control, setValue, getValues } = useFormContext(); const bizCstList = useWatch({ control, name: "bizCstList" }) ?? []; @@ -42,22 +52,22 @@ function BusinessCostFormSection() { useEffect(() => { if (costItems.length === 0) return; - const existingMap = new Map(getValues("bizCstList").map((item) => [item.acntgSeCd, item])); + const current = getValues("bizCstList") ?? []; + const existingMap = new Map(current.map((item) => [item.acntgSeCd, item])); + const next = costItems.map((item) => { + const existing = existingMap.get(item.code); + if (existing) return existing; - setValue( - "bizCstList", - costItems.map((item) => { - const existing = existingMap.get(item.code); - if (existing) return existing; + return { + acntgSeCd: item.code, + bscPlanAmt: 0, + bgtRfltAmt: 0, + tstmDesignAmt: 0, + }; + }); - return { - acntgSeCd: item.code, - bscPlanAmt: 0, - bgtRfltAmt: 0, - tstmDesignAmt: 0, - }; - }), - ); + if (isSameBizCstCodes(current, next)) return; + setValue("bizCstList", next); }, [costItems, getValues, setValue]); function handleCostChange(index: number, fieldKey: CostFieldKey, value: string) { @@ -119,58 +129,37 @@ function BusinessCostFormSection() {
- ( - - handleCostChange(idx, "bgtRfltAmt", e.target.value)} - readOnly={item.readonly} - aria-invalid={fieldState.invalid} - className={`text-right ${item.readonly ? "bg-muted" : ""}`} - /> - - )} - /> + + handleCostChange(idx, "bgtRfltAmt", e.target.value)} + readOnly={item.readonly} + className={`text-right ${item.readonly ? "bg-muted" : ""}`} + /> + - ( - - handleCostChange(idx, "bscPlanAmt", e.target.value)} - readOnly={item.readonly} - aria-invalid={fieldState.invalid} - className={`text-right ${item.readonly ? "bg-muted" : ""}`} - /> - - )} - /> + + handleCostChange(idx, "bscPlanAmt", e.target.value)} + readOnly={item.readonly} + className={`text-right ${item.readonly ? "bg-muted" : ""}`} + /> + - ( - - handleCostChange(idx, "tstmDesignAmt", e.target.value)} - readOnly={item.readonly} - aria-invalid={fieldState.invalid} - className={`text-right ${item.readonly ? "bg-muted" : ""}`} - /> - - )} - /> + + handleCostChange(idx, "tstmDesignAmt", e.target.value)} + readOnly={item.readonly} + className={`text-right ${item.readonly ? "bg-muted" : ""}`} + /> +
diff --git a/apps/as/src/widgets/pbadms-sprt/ui/business-scale-form-section.tsx b/apps/as/src/widgets/pbadms-sprt/ui/business-scale-form-section.tsx index 2bee5e104..de479a0cf 100644 --- a/apps/as/src/widgets/pbadms-sprt/ui/business-scale-form-section.tsx +++ b/apps/as/src/widgets/pbadms-sprt/ui/business-scale-form-section.tsx @@ -1,7 +1,7 @@ "use client"; import { useEffect, useMemo } from "react"; -import { Controller, useFormContext, useWatch } from "react-hook-form"; +import { useFormContext, useWatch } from "react-hook-form"; import { SectionCollapsible } from "@/shared/ui"; import { Field } from "@/shared/ui/field"; @@ -17,7 +17,7 @@ import { TableRow, } from "@common/components"; -import { buildCnstpScaleItems, recalculateBzScaleTotals } from "../lib/business-scale-form-utils"; +import { buildCnstpScaleItems, recalculateBzScaleTotals } from "../lib/business-scale-form-utils"; interface BusinessScaleFormData { bzScaleList: Array<{ @@ -31,6 +31,16 @@ interface BusinessScaleFormData { type ScaleFieldKey = "bscPl" | "budgetReflct" | "thtiDsgn"; +function isSameBzScaleCodes( + current: BusinessScaleFormData["bzScaleList"], + next: BusinessScaleFormData["bzScaleList"], +) { + return ( + current.length === next.length && + current.every((item, index) => item.cnstpSeCd === next[index]?.cnstpSeCd) + ); +} + function BusinessScaleFormSection() { const { control, setValue, getValues } = useFormContext(); const bzScaleList = useWatch({ control, name: "bzScaleList" }) ?? []; @@ -42,7 +52,8 @@ function BusinessScaleFormSection() { useEffect(() => { if (scaleItems.length === 0) return; - const existingMap = new Map(getValues("bzScaleList").map((item) => [item.cnstpSeCd, item])); + const current = getValues("bzScaleList") ?? []; + const existingMap = new Map(current.map((item) => [item.cnstpSeCd, item])); const next = scaleItems.map((item) => { const existing = existingMap.get(item.code); @@ -57,6 +68,7 @@ function BusinessScaleFormSection() { }; }); + if (isSameBzScaleCodes(current, next)) return; setValue("bzScaleList", recalculateBzScaleTotals(next, scaleItems)); }, [scaleItems, getValues, setValue]); @@ -112,58 +124,37 @@ function BusinessScaleFormSection() {
- ( - - handleScaleChange(idx, "bscPl", e.target.value)} - readOnly={item.readonly} - aria-invalid={fieldState.invalid} - className={`text-right ${item.readonly ? "bg-muted" : ""}`} - /> - - )} - /> + + handleScaleChange(idx, "bscPl", e.target.value)} + readOnly={item.readonly} + className={`text-right ${item.readonly ? "bg-muted" : ""}`} + /> + - ( - - handleScaleChange(idx, "budgetReflct", e.target.value)} - readOnly={item.readonly} - aria-invalid={fieldState.invalid} - className={`text-right ${item.readonly ? "bg-muted" : ""}`} - /> - - )} - /> + + handleScaleChange(idx, "budgetReflct", e.target.value)} + readOnly={item.readonly} + className={`text-right ${item.readonly ? "bg-muted" : ""}`} + /> + - ( - - handleScaleChange(idx, "thtiDsgn", e.target.value)} - readOnly={item.readonly} - aria-invalid={fieldState.invalid} - className={`text-right ${item.readonly ? "bg-muted" : ""}`} - /> - - )} - /> + + handleScaleChange(idx, "thtiDsgn", e.target.value)} + readOnly={item.readonly} + className={`text-right ${item.readonly ? "bg-muted" : ""}`} + /> +
diff --git a/apps/as/src/widgets/pbadms-sprt/ui/checklist-form-section.tsx b/apps/as/src/widgets/pbadms-sprt/ui/checklist-form-section.tsx index 1e4c324bb..0fb9e136a 100644 --- a/apps/as/src/widgets/pbadms-sprt/ui/checklist-form-section.tsx +++ b/apps/as/src/widgets/pbadms-sprt/ui/checklist-form-section.tsx @@ -1,18 +1,15 @@ "use client"; import { useEffect, useMemo, useState } from "react"; -import { Controller, useFormContext, useWatch } from "react-hook-form"; +import { useFormContext, useWatch } from "react-hook-form"; import { useQuery } from "@tanstack/react-query"; import { SectionCollapsible } from "@/shared/ui"; -import { Field, FieldLabel } from "@/shared/ui/field"; import { cklstMngService, type CklstTreeNode } from "@/entities/cklst"; import { useCodeList } from "@/entities/code"; import { Button, - RadioGroup, - RadioGroupItem, Skeleton, Table, TableBody, @@ -125,11 +122,21 @@ function ChecklistFormSection({ docSeComCd, fieldPrefix }: ChecklistFormSectionP } }, [checklistTabs, activeTab]); + function handleSelectChange(resultIdx: number, value: "Y" | "N") { + const currentList = getValues("cklstResultList") as CklstResultListItem[]; + const row = currentList[resultIdx]; + if (!row) return; + + const newList = [...currentList]; + newList[resultIdx] = { ...row, selected: value }; + setValue("cklstResultList", newList, { shouldDirty: true }); + } + function handleSelectAll(tabCode: string, value: "Y" | "N") { const tab = checklistTabs.find((t) => t.code === tabCode); if (!tab) return; - const currentList = getValues("cklstResultList"); + const currentList = getValues("cklstResultList") as CklstResultListItem[]; const newList = [...currentList]; tab.items @@ -141,7 +148,7 @@ function ChecklistFormSection({ docSeComCd, fieldPrefix }: ChecklistFormSectionP } }); - setValue("cklstResultList", newList); + setValue("cklstResultList", newList, { shouldDirty: true }); } const hasSelectedTaskCodes = Boolean(taskSeComCdArray?.length); @@ -234,6 +241,8 @@ function ChecklistFormSection({ docSeComCd, fieldPrefix }: ChecklistFormSectionP {tab.items.map((item) => { const resultIdx = cklstRvwSnIndexMap.get(item.cklstRvwSn) ?? -1; const showRadios = item.bchckUseYn === "Y"; + const selected = cklstResultList[resultIdx]?.selected; + const radioName = `check-${item.cklstRvwSn}`; return ( @@ -248,66 +257,30 @@ function ChecklistFormSection({ docSeComCd, fieldPrefix }: ChecklistFormSectionP {item.content} {showRadios && resultIdx >= 0 ? ( - ( - <> - - - - - - - - - - - - - - - - - - - - )} - /> + <> + + handleSelectChange(resultIdx, "Y")} + aria-label="예" + className="cursor-pointer" + /> + + + handleSelectChange(resultIdx, "N")} + aria-label="아니오" + className="cursor-pointer" + /> + + ) : null} ); diff --git a/apps/as/src/widgets/pbadms-sprt/ui/fnrs-shar-form-section.tsx b/apps/as/src/widgets/pbadms-sprt/ui/fnrs-shar-form-section.tsx index 5109dbfe7..baff36f8b 100644 --- a/apps/as/src/widgets/pbadms-sprt/ui/fnrs-shar-form-section.tsx +++ b/apps/as/src/widgets/pbadms-sprt/ui/fnrs-shar-form-section.tsx @@ -1,7 +1,7 @@ "use client"; import { useEffect, useMemo, useState } from "react"; -import { Controller, useFormContext, useWatch } from "react-hook-form"; +import { useFormContext, useWatch } from "react-hook-form"; import { getDefaultFileKey, useTus } from "@/shared/lib"; import { AttachmentFileField, SectionCollapsible } from "@/shared/ui"; @@ -78,6 +78,13 @@ function toInitialSharFile(file?: AtflMngClientResponseDto): SharUploadedFile | }; } +function isSameFnrsSharCodes(current: FnrsSharListItem[], next: FnrsSharListItem[]) { + return ( + current.length === next.length && + current.every((item, index) => item.fnrsSharSeCd === next[index]?.fnrsSharSeCd) + ); +} + function FnrsSharFormSection({ initialSharTree, initialSharAtchFiles }: FnrsSharFormSectionProps) { const { control, setValue, getValues } = useFormContext(); const fnrsSharList = useWatch({ control, name: "fnrsSharList" }) ?? []; @@ -117,6 +124,7 @@ function FnrsSharFormSection({ initialSharTree, initialSharAtchFiles }: FnrsShar : mergeFnrsSharTreeWithForm(sharTree, []); const withTotals = recalculateFnrsSharTotals(merged, sharItems); + if (isSameFnrsSharCodes(existing, withTotals)) return; setValue("fnrsSharList", withTotals); }, [sharItems, sharTree, initialSharTree, getValues, setValue]); @@ -226,40 +234,26 @@ function FnrsSharFormSection({ initialSharTree, initialSharAtchFiles }: FnrsShar {item.label} - ( - - handleSharChange(idx, "exstnAmt", e.target.value)} - readOnly={item.readonly} - aria-invalid={fieldState.invalid} - className={cn("text-right", item.readonly && "bg-muted")} - /> - - )} - /> + + handleSharChange(idx, "exstnAmt", e.target.value)} + readOnly={item.readonly} + className={cn("text-right", item.readonly && "bg-muted")} + /> + - ( - - handleSharChange(idx, "chgRqtAmt", e.target.value)} - readOnly={item.readonly} - aria-invalid={fieldState.invalid} - className={cn("text-right", item.readonly && "bg-muted")} - /> - - )} - /> + + handleSharChange(idx, "chgRqtAmt", e.target.value)} + readOnly={item.readonly} + className={cn("text-right", item.readonly && "bg-muted")} + /> +
@@ -270,19 +264,12 @@ function FnrsSharFormSection({ initialSharTree, initialSharAtchFiles }: FnrsShar
{calcDiffPercent(diff, data.exstnAmt || 0)}
- ( - - handleSharChange(idx, "rmrkCn", e.target.value)} - aria-invalid={fieldState.invalid} - /> - - )} - /> + + handleSharChange(idx, "rmrkCn", e.target.value)} + /> + ); From dc57a491dd72a12d7726893d86dfd8c1c56e4ef9 Mon Sep 17 00:00:00 2001 From: bicochan Date: Tue, 22 Sep 2026 15:02:36 +0900 Subject: [PATCH 3/8] =?UTF-8?q?[as]=20chore:=20=EC=9E=AC=EC=9B=90=ED=98=91?= =?UTF-8?q?=EC=9D=98=20=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/as/src/entities/elapr/index.ts | 1 + .../src/entities/elapr/lib/apln-validators.ts | 13 +++++++++++++ .../elapr/ui/elapr-apln-picker-grid.tsx | 8 +++++++- .../elapr/ui/elapr-doc-prgrs-picker-dialog.tsx | 7 +++++++ .../elapr/ui/elapr-tmplt-picker-dialog.tsx | 7 +++++++ .../model/fnrs-cnsltn-apply-payload-schema.ts | 2 +- .../pages/fnrs-cnsltn/ui/fnrs-form-page.tsx | 18 ++++++++++++++---- apps/as/src/shared/model/pbadms-sprt.ts | 2 +- .../ui/attachments-view-section.tsx | 13 +++++++------ .../pbadms-sprt/ui/fnrs-shar-form-section.tsx | 2 +- .../ui/splmnt-dmnd-form-section.tsx | 8 ++++++-- 11 files changed, 65 insertions(+), 16 deletions(-) diff --git a/apps/as/src/entities/elapr/index.ts b/apps/as/src/entities/elapr/index.ts index 777245649..2210dfc17 100644 --- a/apps/as/src/entities/elapr/index.ts +++ b/apps/as/src/entities/elapr/index.ts @@ -41,6 +41,7 @@ export { validateAllRowsForSave, validateAplnRow, validateAtrzOrder, + validateUniqueAtrzAprvr, validateUniqueSeqNo, } from "./lib/apln-validators"; export { diff --git a/apps/as/src/entities/elapr/lib/apln-validators.ts b/apps/as/src/entities/elapr/lib/apln-validators.ts index 8b75b4279..8ff1d997e 100644 --- a/apps/as/src/entities/elapr/lib/apln-validators.ts +++ b/apps/as/src/entities/elapr/lib/apln-validators.ts @@ -76,3 +76,16 @@ export function validateUniqueSeqNo(rows: ElaprAplnRow[]): string | null { } return null; } + +export function validateUniqueAtrzAprvr(rows: ElaprAplnRow[]): string | null { + const pairSet = new Set(); + for (const row of getVisibleRows(rows)) { + const atrz = row.atrzSeComCd?.trim(); + const aprvr = row.aprvrUuid?.trim(); + if (!atrz || !aprvr) continue; + const key = `${atrz}::${aprvr}`; + if (pairSet.has(key)) return "동일한 결재구분과 결재자가 중복됩니다."; + pairSet.add(key); + } + return null; +} diff --git a/apps/as/src/entities/elapr/ui/elapr-apln-picker-grid.tsx b/apps/as/src/entities/elapr/ui/elapr-apln-picker-grid.tsx index c8c84e1c6..f5a065ff6 100644 --- a/apps/as/src/entities/elapr/ui/elapr-apln-picker-grid.tsx +++ b/apps/as/src/entities/elapr/ui/elapr-apln-picker-grid.tsx @@ -17,7 +17,7 @@ import { } from "@common/components"; import { useElaprAplnPage } from "../api/queries"; -import { validateAplnRow } from "../lib/apln-validators"; +import { validateAplnRow, validateUniqueAtrzAprvr } from "../lib/apln-validators"; import { useAplnRows } from "../lib/use-apln-rows"; import { useDndSensors } from "../lib/use-dnd-sensors"; import type { ElaprApln } from "../model/elapr-apln-interface"; @@ -110,6 +110,12 @@ function ElaprAplnPickerGrid({ return; } + const duplicateError = validateUniqueAtrzAprvr(rows); + if (duplicateError) { + alert(duplicateError); + return; + } + commitEdit(row.rowKey); } diff --git a/apps/as/src/entities/elapr/ui/elapr-doc-prgrs-picker-dialog.tsx b/apps/as/src/entities/elapr/ui/elapr-doc-prgrs-picker-dialog.tsx index 0d9b5161e..ec235ec5e 100644 --- a/apps/as/src/entities/elapr/ui/elapr-doc-prgrs-picker-dialog.tsx +++ b/apps/as/src/entities/elapr/ui/elapr-doc-prgrs-picker-dialog.tsx @@ -17,6 +17,7 @@ import { getVisibleRows, validateAllRowsForSave, validateAtrzOrder, + validateUniqueAtrzAprvr, validateUniqueSeqNo, } from "../lib/apln-validators"; import { mapDocPrgrsToAplnRows } from "../lib/doc-prgrs-to-apln-rows"; @@ -90,6 +91,12 @@ function ElaprDocPrgrsPickerDialog({ return; } + const atrzAprvrError = validateUniqueAtrzAprvr(aplnRows); + if (atrzAprvrError) { + alert(atrzAprvrError); + return; + } + const visibleRows = getVisibleRows(aplnRows); onConfirm?.({ aplnRows: visibleRows }); diff --git a/apps/as/src/entities/elapr/ui/elapr-tmplt-picker-dialog.tsx b/apps/as/src/entities/elapr/ui/elapr-tmplt-picker-dialog.tsx index aa70932e9..b61672ef8 100644 --- a/apps/as/src/entities/elapr/ui/elapr-tmplt-picker-dialog.tsx +++ b/apps/as/src/entities/elapr/ui/elapr-tmplt-picker-dialog.tsx @@ -17,6 +17,7 @@ import { getVisibleRows, validateAllRowsForSave, validateAtrzOrder, + validateUniqueAtrzAprvr, validateUniqueSeqNo, } from "../lib/apln-validators"; import type { ElaprAplnRow } from "../model/elapr-apln-row-types"; @@ -106,6 +107,12 @@ function ElaprTmpltPickerDialog({ return; } + const atrzAprvrError = validateUniqueAtrzAprvr(aplnRows); + if (atrzAprvrError) { + alert(atrzAprvrError); + return; + } + const visibleRows = getVisibleRows(aplnRows); const payload: ElaprTmpltPickerConfirmPayload = { diff --git a/apps/as/src/entities/fnrs-cnsltn/model/fnrs-cnsltn-apply-payload-schema.ts b/apps/as/src/entities/fnrs-cnsltn/model/fnrs-cnsltn-apply-payload-schema.ts index 709ae9012..75b2a1804 100644 --- a/apps/as/src/entities/fnrs-cnsltn/model/fnrs-cnsltn-apply-payload-schema.ts +++ b/apps/as/src/entities/fnrs-cnsltn/model/fnrs-cnsltn-apply-payload-schema.ts @@ -65,7 +65,7 @@ export const fnrsCnsltnSplmntDmndItemSchema = z.object({ splmntArtclComCd: z.string().nullish(), splmntDmndCn: z.string().optional(), splmntDmndDt: z.string().optional(), - splmntDmndAtchFileGroupId: z.string().optional(), + splmntDmndAtchFileGroupId: z.string().nullish(), splmntCn: z.string().optional(), splmntPicNm: z.string().optional(), splmntCmptnDt: z.string().optional(), diff --git a/apps/as/src/pages/fnrs-cnsltn/ui/fnrs-form-page.tsx b/apps/as/src/pages/fnrs-cnsltn/ui/fnrs-form-page.tsx index 87a3dc4b0..cff36df8a 100644 --- a/apps/as/src/pages/fnrs-cnsltn/ui/fnrs-form-page.tsx +++ b/apps/as/src/pages/fnrs-cnsltn/ui/fnrs-form-page.tsx @@ -18,6 +18,7 @@ import { fnrsCnsltnMngService, } from "@/entities/fnrs-cnsltn"; import { useFnrsSharSeMngTree } from "@/entities/fnrs-shar-se"; +import { findCompletedPwrkDraft, usePwrkCnsltnMngByUpDocNo } from "@/entities/pwrk-cnsltn-mng"; import { AttachmentsFormSection, buildAcntgCostItems, @@ -35,7 +36,10 @@ import { } from "@/widgets/pbadms-sprt"; import { Button } from "@common/components"; -import { type FnrsCnsltnRegistFormData, fnrsCnsltnRegistSchema } from "../lib/fnrs-cnsltn-regist-schema"; +import { + type FnrsCnsltnRegistFormData, + fnrsCnsltnRegistSchema, +} from "../lib/fnrs-cnsltn-regist-schema"; import { buildFormPayload, getCreateDefaultValues, @@ -68,6 +72,12 @@ function FnrsFormPage({ mode, initialData, createDefaults }: FnrsFormPageProps) const isSplmntPrgrsStts = initialData?.detDto?.prgrsSttsComCd === "SL"; const fnrsCnsltnDocNo = initialData?.detDto?.fnrsCnsltnDocNo; + const { data: pwrkCnsltnData } = usePwrkCnsltnMngByUpDocNo( + fnrsCnsltnDocNo, + isSplmntPrgrsStts && Boolean(fnrsCnsltnDocNo), + ); + const hasCompletedDraft = Boolean(findCompletedPwrkDraft(pwrkCnsltnData)); + const { data: masterSharTree = [] } = useFnrsSharSeMngTree(); const { data: acntgTree = [] } = useAcntgSeMngTree(); const { data: essentialFiles = [] } = useEsntlAtchFileMngTree({ docSeComCd: "FNRS" }); @@ -126,7 +136,7 @@ function FnrsFormPage({ mode, initialData, createDefaults }: FnrsFormPageProps) (item) => !item.splmntCn || !item.splmntCn.trim(), ); if (hasEmptySplmntCn) { - alert("보완요청내용이 있습니다. 보완 완료내용을 입력해 주세요."); + alert("보완 요청 내용이 있습니다.\n보완 완료 내용을 입력해 주세요."); return; } @@ -305,7 +315,7 @@ function FnrsFormPage({ mode, initialData, createDefaults }: FnrsFormPageProps) ) : ( <> - {fnrsCnsltnDocNo ? ( + {hasCompletedDraft ? (
)} diff --git a/apps/as/src/widgets/pbadms-sprt/ui/fnrs-shar-form-section.tsx b/apps/as/src/widgets/pbadms-sprt/ui/fnrs-shar-form-section.tsx index baff36f8b..570c5ab7b 100644 --- a/apps/as/src/widgets/pbadms-sprt/ui/fnrs-shar-form-section.tsx +++ b/apps/as/src/widgets/pbadms-sprt/ui/fnrs-shar-form-section.tsx @@ -282,7 +282,7 @@ function FnrsSharFormSection({ initialSharTree, initialSharAtchFiles }: FnrsShar

첨부파일

{!uploadedFile ? ( -

+

총사업비 신청서(.hwp) 파일을 등록해주세요.

) : null} diff --git a/apps/as/src/widgets/pbadms-sprt/ui/splmnt-dmnd-form-section.tsx b/apps/as/src/widgets/pbadms-sprt/ui/splmnt-dmnd-form-section.tsx index 8fdbec031..2738e5c1f 100644 --- a/apps/as/src/widgets/pbadms-sprt/ui/splmnt-dmnd-form-section.tsx +++ b/apps/as/src/widgets/pbadms-sprt/ui/splmnt-dmnd-form-section.tsx @@ -5,7 +5,11 @@ import { Controller, useFormContext, useWatch } from "react-hook-form"; import { dayjs, getDefaultFileKey, useTus } from "@/shared/lib"; import { AttachmentFileField, SectionCollapsible } from "@/shared/ui"; -import { AttachmentDownloadLink, attachService, useDownloadAttachmentByAtflId } from "@/entities/attach"; +import { + AttachmentDownloadLink, + attachService, + useDownloadAttachmentByAtflId, +} from "@/entities/attach"; import { Badge, Table, @@ -292,7 +296,7 @@ function SplmntDmndFormSection({ readOnly = false }: SplmntDmndFormSectionProps) value={field.value ?? ""} onChange={field.onChange} onBlur={field.onBlur} - placeholder="보완완료 내용을 입력하세요." + placeholder="보완 완료 내용을 입력하세요." className="min-h-[6rem] !text-xl" /> )} From f00ce316485e0c6a1c542d4423025db2cb97703a Mon Sep 17 00:00:00 2001 From: bicochan Date: Tue, 22 Sep 2026 15:12:28 +0900 Subject: [PATCH 4/8] =?UTF-8?q?[as]=20refactor:=20zod=20=EC=8A=A4=ED=82=A4?= =?UTF-8?q?=EB=A7=88=20`.optional()`->=20`.nullish()`=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dcrag-to/model/dcrag-to-payload-schema.ts | 36 ++-- .../design-cnstn-apply-payload-schema.ts | 80 +++---- .../model/fnrs-cnsltn-apply-payload-schema.ts | 130 ++++++------ .../model/fnrs-cnsltn-payload-schema.ts | 4 +- .../model/instl-sncn-apply-payload-schema.ts | 118 +++++------ ...pwrk-cnsltn-doc-crt-rslt-payload-schema.ts | 2 +- .../pwrk-cnsltn-doc-evl-payload-schema.ts | 8 +- .../model/pwrk-cnsltn-mng-payload-schema.ts | 14 +- .../sewer-bsc-plan-apply-payload-schema.ts | 198 +++++++++--------- .../lib/design-cnstn-regist-schema.ts | 6 +- .../lib/fnrs-cnsltn-regist-schema.ts | 12 +- .../lib/pwrk-cnsltn-doc-evl-schema.ts | 2 +- .../lib/instl-sncn-regist-schema.ts | 2 +- .../instl-sncn/lib/save-payload-utils.ts | 5 +- .../lib/sewer-bsc-plan-regist-schema.ts | 18 +- 15 files changed, 319 insertions(+), 316 deletions(-) diff --git a/apps/as/src/entities/dcrag-to/model/dcrag-to-payload-schema.ts b/apps/as/src/entities/dcrag-to/model/dcrag-to-payload-schema.ts index 7ad5827c2..954b1f0af 100644 --- a/apps/as/src/entities/dcrag-to/model/dcrag-to-payload-schema.ts +++ b/apps/as/src/entities/dcrag-to/model/dcrag-to-payload-schema.ts @@ -2,35 +2,35 @@ import { z } from "zod"; /** 백엔드 DcRagFileInfoDto */ export const dcRagFileInfoSchema = z.object({ - fileId: z.string().optional(), - fileGroupId: z.string().optional(), - fileName: z.string().optional(), - physicalPath: z.string().optional(), - downloadUrl: z.string().optional(), - fileSize: z.number().optional(), - esntlAtchFileId: z.string().optional(), - esntlAtchFileNm: z.string().optional(), + fileId: z.string().nullish(), + fileGroupId: z.string().nullish(), + fileName: z.string().nullish(), + physicalPath: z.string().nullish(), + downloadUrl: z.string().nullish(), + fileSize: z.number().nullish(), + esntlAtchFileId: z.string().nullish(), + esntlAtchFileNm: z.string().nullish(), }); /** 백엔드 DcRagDocumentTransferRequestDto */ export const dcRagDocumentTransferRequestSchema = z.object({ fnrsCnsltnDocNo: z.string(), - taskSeComCd: z.string().optional(), - taskSeCdNm: z.string().optional(), - essentialFiles: z.array(dcRagFileInfoSchema).optional(), - etcFiles: z.array(dcRagFileInfoSchema).optional(), - callbackUrl: z.string().optional(), + taskSeComCd: z.string().nullish(), + taskSeCdNm: z.string().nullish(), + essentialFiles: z.array(dcRagFileInfoSchema).nullish(), + etcFiles: z.array(dcRagFileInfoSchema).nullish(), + callbackUrl: z.string().nullish(), }); /** 백엔드 DcRagDraftGenerateRequestDto */ export const dcRagDraftGenerateRequestSchema = z.object({ fnrsCnsltnDocNo: z.string(), pwrkCnsltnDocNo: z.string(), - crtDmndUuid: z.string().optional(), - essentialFiles: z.array(dcRagFileInfoSchema).optional(), - etcFiles: z.array(dcRagFileInfoSchema).optional(), - rqstrUuid: z.string().optional(), - callbackUrl: z.string().optional(), + crtDmndUuid: z.string().nullish(), + essentialFiles: z.array(dcRagFileInfoSchema).nullish(), + etcFiles: z.array(dcRagFileInfoSchema).nullish(), + rqstrUuid: z.string().nullish(), + callbackUrl: z.string().nullish(), }); /** 백엔드 DcRagCostVerifyRequestDto */ diff --git a/apps/as/src/entities/design-cnstn/model/design-cnstn-apply-payload-schema.ts b/apps/as/src/entities/design-cnstn/model/design-cnstn-apply-payload-schema.ts index 5b6c76b10..b4df4790b 100644 --- a/apps/as/src/entities/design-cnstn/model/design-cnstn-apply-payload-schema.ts +++ b/apps/as/src/entities/design-cnstn/model/design-cnstn-apply-payload-schema.ts @@ -2,68 +2,68 @@ import { z } from "zod"; /** 백엔드 DesignCnstnMngSaveRequestDto */ export const designCnstnMngSaveSchema = z.object({ - designCnstnDocNo: z.string().optional(), - admdstCd: z.string().optional(), - envoSeComCd: z.string().optional(), - taskSeComCd: z.string().optional(), - bizNm: z.string().optional(), - bizBgngYr: z.string().optional(), - bizEndYr: z.string().optional(), - bizCn: z.string().optional(), - aplcntNm: z.string().optional(), - aplcntMblTelno: z.string().optional(), - aplcntOgdpNm: z.string().optional(), - aplcntEmlAddr: z.string().optional(), - dsgnrNm: z.string().optional(), - dsgnrTelno: z.string().optional(), - dsgnrOgdpNm: z.string().optional(), - dsgnrEmlAddr: z.string().optional(), - atchFileGroupId: z.string().optional(), - prgrsSttsComCd: z.string().optional(), + designCnstnDocNo: z.string().nullish(), + admdstCd: z.string().nullish(), + envoSeComCd: z.string().nullish(), + taskSeComCd: z.string().nullish(), + bizNm: z.string().nullish(), + bizBgngYr: z.string().nullish(), + bizEndYr: z.string().nullish(), + bizCn: z.string().nullish(), + aplcntNm: z.string().nullish(), + aplcntMblTelno: z.string().nullish(), + aplcntOgdpNm: z.string().nullish(), + aplcntEmlAddr: z.string().nullish(), + dsgnrNm: z.string().nullish(), + dsgnrTelno: z.string().nullish(), + dsgnrOgdpNm: z.string().nullish(), + dsgnrEmlAddr: z.string().nullish(), + atchFileGroupId: z.string().nullish(), + prgrsSttsComCd: z.string().nullish(), }); /** 백엔드 DesignCnstnApplySaveRequestDto.BzScaleItem */ export const designCnstnBzScaleItemSchema = z.object({ - cnstpSeCd: z.string().optional(), - bscPl: z.number().optional(), - budgetReflct: z.number().optional(), - thtiDsgn: z.number().optional(), + cnstpSeCd: z.string().nullish(), + bscPl: z.number().nullish(), + budgetReflct: z.number().nullish(), + thtiDsgn: z.number().nullish(), }); /** 백엔드 DesignCnstnApplySaveRequestDto.BizCstItem */ export const designCnstnBizCstItemSchema = z.object({ - acntgSeCd: z.string().optional(), - bscPlanAmt: z.number().optional(), - bgtRfltAmt: z.number().optional(), - tstmDesignAmt: z.number().optional(), + acntgSeCd: z.string().nullish(), + bscPlanAmt: z.number().nullish(), + bgtRfltAmt: z.number().nullish(), + tstmDesignAmt: z.number().nullish(), }); /** 백엔드 DesignCnstnApplySaveRequestDto.EsntlAtchFileItem */ export const designCnstnEsntlAtchFileItemSchema = z.object({ - esntlAtchFileId: z.string().optional(), - atchFileGroupId: z.string().optional(), + esntlAtchFileId: z.string().nullish(), + atchFileGroupId: z.string().nullish(), }); /** 백엔드 DesignCnstnRvwOpnnSaveRequestDto */ export const designCnstnRvwOpnnSaveSchema = z.object({ designCnstnDocNo: z.string(), - rvwOpnnSn: z.number().optional(), - opnrSeComCd: z.string().optional(), - opnrNm: z.string().optional(), - rvwRsltCn: z.string().optional(), - rvwRsltAnmlyYn: z.string().optional(), - atchFileGroupId: z.string().optional(), + rvwOpnnSn: z.number().nullish(), + opnrSeComCd: z.string().nullish(), + opnrNm: z.string().nullish(), + rvwRsltCn: z.string().nullish(), + rvwRsltAnmlyYn: z.string().nullish(), + atchFileGroupId: z.string().nullish(), }); /** 백엔드 DesignCnstnApplySaveRequestDto */ export const designCnstnApplySaveSchema = z.object({ - techReViewSaveCd: z.string().optional(), - rvwStpCd: z.string().optional(), + techReViewSaveCd: z.string().nullish(), + rvwStpCd: z.string().nullish(), designCnstnMng: designCnstnMngSaveSchema, - bzScaleList: z.array(designCnstnBzScaleItemSchema).optional(), - bizCstList: z.array(designCnstnBizCstItemSchema).optional(), - esntlAtchFileList: z.array(designCnstnEsntlAtchFileItemSchema).optional(), - rvwOpnnList: z.array(designCnstnRvwOpnnSaveSchema).optional(), + bzScaleList: z.array(designCnstnBzScaleItemSchema).nullish(), + bizCstList: z.array(designCnstnBizCstItemSchema).nullish(), + esntlAtchFileList: z.array(designCnstnEsntlAtchFileItemSchema).nullish(), + rvwOpnnList: z.array(designCnstnRvwOpnnSaveSchema).nullish(), }); export type DesignCnstnMngSaveRequestDto = z.infer; diff --git a/apps/as/src/entities/fnrs-cnsltn/model/fnrs-cnsltn-apply-payload-schema.ts b/apps/as/src/entities/fnrs-cnsltn/model/fnrs-cnsltn-apply-payload-schema.ts index 75b2a1804..ee1041e17 100644 --- a/apps/as/src/entities/fnrs-cnsltn/model/fnrs-cnsltn-apply-payload-schema.ts +++ b/apps/as/src/entities/fnrs-cnsltn/model/fnrs-cnsltn-apply-payload-schema.ts @@ -2,52 +2,52 @@ import { z } from "zod"; /** 백엔드 FnrsCnsltnMngSaveRequestDto */ export const fnrsCnsltnMngSaveSchema = z.object({ - fnrsCnsltnDocNo: z.string().optional(), - admdstCd: z.string().optional(), - envoSeComCd: z.string().optional(), - taskSeComCd: z.string().optional(), - cfmtnBgtBizNo: z.string().optional(), - bgtAplyYr: z.string().optional(), - bizNm: z.string().optional(), - bizBgngYr: z.string().optional(), - bizEndYr: z.string().optional(), - bizCn: z.string().optional(), - aplcntNm: z.string().optional(), - aplcntMblTelno: z.string().optional(), - aplcntOgdpNm: z.string().optional(), - aplcntEmlAddr: z.string().optional(), - dsgnrNm: z.string().optional(), - dsgnrTelno: z.string().optional(), - dsgnrOgdpNm: z.string().optional(), - dsgnrEmlAddr: z.string().optional(), - atchFileGroupId: z.string().optional(), - sharAtchFileGroupId: z.string().optional(), - prgrsSttsComCd: z.string().optional(), - rtlztnFcltSeComCd: z.string().optional(), - rtlztnUsgSeComCd: z.string().optional(), + fnrsCnsltnDocNo: z.string().nullish(), + admdstCd: z.string().nullish(), + envoSeComCd: z.string().nullish(), + taskSeComCd: z.string().nullish(), + cfmtnBgtBizNo: z.string().nullish(), + bgtAplyYr: z.string().nullish(), + bizNm: z.string().nullish(), + bizBgngYr: z.string().nullish(), + bizEndYr: z.string().nullish(), + bizCn: z.string().nullish(), + aplcntNm: z.string().nullish(), + aplcntMblTelno: z.string().nullish(), + aplcntOgdpNm: z.string().nullish(), + aplcntEmlAddr: z.string().nullish(), + dsgnrNm: z.string().nullish(), + dsgnrTelno: z.string().nullish(), + dsgnrOgdpNm: z.string().nullish(), + dsgnrEmlAddr: z.string().nullish(), + atchFileGroupId: z.string().nullish(), + sharAtchFileGroupId: z.string().nullish(), + prgrsSttsComCd: z.string().nullish(), + rtlztnFcltSeComCd: z.string().nullish(), + rtlztnUsgSeComCd: z.string().nullish(), }); /** 백엔드 FnrsCnsltnApplySaveRequestDto.BzScaleItem */ export const fnrsCnsltnBzScaleItemSchema = z.object({ - cnstpSeCd: z.string().optional(), - bscPl: z.number().optional(), - budgetReflct: z.number().optional(), - thtiDsgn: z.number().optional(), + cnstpSeCd: z.string().nullish(), + bscPl: z.number().nullish(), + budgetReflct: z.number().nullish(), + thtiDsgn: z.number().nullish(), }); /** 백엔드 FnrsCnsltnApplySaveRequestDto.BizCstItem */ export const fnrsCnsltnBizCstItemSchema = z.object({ - acntgSeCd: z.string().optional(), - bscPlanAmt: z.number().optional(), - bgtRfltAmt: z.number().optional(), - tstmDesignAmt: z.number().optional(), + acntgSeCd: z.string().nullish(), + bscPlanAmt: z.number().nullish(), + bgtRfltAmt: z.number().nullish(), + tstmDesignAmt: z.number().nullish(), }); /** 백엔드 FnrsCnsltnApplySaveRequestDto.CklstResultItem */ export const fnrsCnsltnCklstResultItemSchema = z.object({ - cklstRvwSn: z.number().optional(), - cklstArtclSn: z.number().optional(), - cklstSn: z.number().optional(), + cklstRvwSn: z.number().nullish(), + cklstArtclSn: z.number().nullish(), + cklstSn: z.number().nullish(), rvwStpComCd: z.string().nullish(), selected: z.enum(["Y", "N"]).nullish(), picRvwCn: z.string().nullish(), @@ -55,58 +55,58 @@ export const fnrsCnsltnCklstResultItemSchema = z.object({ /** 백엔드 FnrsCnsltnApplySaveRequestDto.EsntlAtchFileItem */ export const fnrsCnsltnEsntlAtchFileItemSchema = z.object({ - esntlAtchFileId: z.string().optional(), - atchFileGroupId: z.string().optional(), + esntlAtchFileId: z.string().nullish(), + atchFileGroupId: z.string().nullish(), }); /** 백엔드 FnrsCnsltnApplySaveRequestDto.FnrsCnsltnSplmntDmndItem */ export const fnrsCnsltnSplmntDmndItemSchema = z.object({ splmntDmndSn: z.number().nullish(), splmntArtclComCd: z.string().nullish(), - splmntDmndCn: z.string().optional(), - splmntDmndDt: z.string().optional(), + splmntDmndCn: z.string().nullish(), + splmntDmndDt: z.string().nullish(), splmntDmndAtchFileGroupId: z.string().nullish(), - splmntCn: z.string().optional(), - splmntPicNm: z.string().optional(), - splmntCmptnDt: z.string().optional(), - splmntAtchFileGroupId: z.string().optional(), - cmptnYn: z.string().optional(), + splmntCn: z.string().nullish(), + splmntPicNm: z.string().nullish(), + splmntCmptnDt: z.string().nullish(), + splmntAtchFileGroupId: z.string().nullish(), + cmptnYn: z.string().nullish(), }); /** 백엔드 FnrsCnsltnRvwOpnnSaveRequestDto */ export const fnrsCnsltnRvwOpnnSaveSchema = z.object({ fnrsCnsltnDocNo: z.string(), - rvwOpnnSn: z.number().optional(), - opnrSeComCd: z.string().optional(), - opnrNm: z.string().optional(), - rvwRsltCn: z.string().optional(), - rvwRsltAnmlyYn: z.string().optional(), - atchFileGroupId: z.string().optional(), + rvwOpnnSn: z.number().nullish(), + opnrSeComCd: z.string().nullish(), + opnrNm: z.string().nullish(), + rvwRsltCn: z.string().nullish(), + rvwRsltAnmlyYn: z.string().nullish(), + atchFileGroupId: z.string().nullish(), }); /** 백엔드 FnrsCnsltnApplySaveRequestDto.FnrsSharItem */ export const fnrsSharItemSchema = z.object({ - fnrsSharSeCd: z.string().optional(), - exstnAmt: z.number().optional(), - chgRqtAmt: z.number().optional(), - ajmtAmt: z.number().optional(), - rmrkCn: z.string().optional(), - envoRmrkCn: z.string().optional(), + fnrsSharSeCd: z.string().nullish(), + exstnAmt: z.number().nullish(), + chgRqtAmt: z.number().nullish(), + ajmtAmt: z.number().nullish(), + rmrkCn: z.string().nullish(), + envoRmrkCn: z.string().nullish(), }); /** 백엔드 FnrsCnsltnApplySaveRequestDto */ export const fnrsCnsltnApplySaveSchema = z.object({ - techReViewSaveCd: z.string().optional(), - rvwStpCd: z.string().optional(), + techReViewSaveCd: z.string().nullish(), + rvwStpCd: z.string().nullish(), fnrsCnsltnMng: fnrsCnsltnMngSaveSchema, - bzScaleList: z.array(fnrsCnsltnBzScaleItemSchema).optional(), - bizCstList: z.array(fnrsCnsltnBizCstItemSchema).optional(), - cklstResultList: z.array(fnrsCnsltnCklstResultItemSchema).optional(), - cklstResultMap: z.record(z.array(fnrsCnsltnCklstResultItemSchema)).optional(), - esntlAtchFileList: z.array(fnrsCnsltnEsntlAtchFileItemSchema).optional(), - rvwOpnnList: z.array(fnrsCnsltnRvwOpnnSaveSchema).optional(), - splmntDmndList: z.array(fnrsCnsltnSplmntDmndItemSchema).optional(), - fnrsSharList: z.array(fnrsSharItemSchema).optional(), + bzScaleList: z.array(fnrsCnsltnBzScaleItemSchema).nullish(), + bizCstList: z.array(fnrsCnsltnBizCstItemSchema).nullish(), + cklstResultList: z.array(fnrsCnsltnCklstResultItemSchema).nullish(), + cklstResultMap: z.record(z.array(fnrsCnsltnCklstResultItemSchema)).nullish(), + esntlAtchFileList: z.array(fnrsCnsltnEsntlAtchFileItemSchema).nullish(), + rvwOpnnList: z.array(fnrsCnsltnRvwOpnnSaveSchema).nullish(), + splmntDmndList: z.array(fnrsCnsltnSplmntDmndItemSchema).nullish(), + fnrsSharList: z.array(fnrsSharItemSchema).nullish(), }); export type FnrsCnsltnMngSaveRequestDto = z.infer; diff --git a/apps/as/src/entities/fnrs-cnsltn/model/fnrs-cnsltn-payload-schema.ts b/apps/as/src/entities/fnrs-cnsltn/model/fnrs-cnsltn-payload-schema.ts index 82764bd3b..46d7ef6b8 100644 --- a/apps/as/src/entities/fnrs-cnsltn/model/fnrs-cnsltn-payload-schema.ts +++ b/apps/as/src/entities/fnrs-cnsltn/model/fnrs-cnsltn-payload-schema.ts @@ -2,12 +2,12 @@ import { z } from "zod"; /** 백엔드 FnrsExamineRequestDto */ export const fnrsExamineRequestSchema = z.object({ - prgrsSttsComCd: z.string().optional(), + prgrsSttsComCd: z.string().nullish(), }); /** 백엔드 EnvoActnReviewReqDto */ export const envoActnReviewReqSchema = z.object({ - specialRqstCn: z.string().optional(), + specialRqstCn: z.string().nullish(), }); export type FnrsExamineRequestDto = z.infer; diff --git a/apps/as/src/entities/instl-sncn/model/instl-sncn-apply-payload-schema.ts b/apps/as/src/entities/instl-sncn/model/instl-sncn-apply-payload-schema.ts index 8e6e17616..26913bffd 100644 --- a/apps/as/src/entities/instl-sncn/model/instl-sncn-apply-payload-schema.ts +++ b/apps/as/src/entities/instl-sncn/model/instl-sncn-apply-payload-schema.ts @@ -2,52 +2,52 @@ import { z } from "zod"; /** 백엔드 InstlSncnMngSaveRequestDto */ export const instlSncnMngSaveSchema = z.object({ - instlSncnDocNo: z.string().optional(), - admdstCd: z.string().optional(), - envoSeComCd: z.string().optional(), - sncnSeComCd: z.string().optional(), - taskSeComCd: z.string().optional(), - bgtBizCd: z.string().optional(), - bgtAplyYr: z.string().optional(), - bizNm: z.string().optional(), - bizBgngYr: z.string().optional(), - bizEndYr: z.string().optional(), - bizCn: z.string().optional(), - aplcntNm: z.string().optional(), - aplcntMblTelno: z.string().optional(), - aplcntOgdpNm: z.string().optional(), - aplcntEmlAddr: z.string().optional(), - dsgnrNm: z.string().optional(), - dsgnrTelno: z.string().optional(), - dsgnrOgdpNm: z.string().optional(), - dsgnrEmlAddr: z.string().optional(), - atchFileGroupId: z.string().optional(), - prgrsSttsComCd: z.string().optional(), - rtlztnFcltSeComCd: z.string().optional(), - rtlztnUsgSeComCd: z.string().optional(), + instlSncnDocNo: z.string().nullish(), + admdstCd: z.string().nullish(), + envoSeComCd: z.string().nullish(), + sncnSeComCd: z.string().nullish(), + taskSeComCd: z.string().nullish(), + bgtBizCd: z.string().nullish(), + bgtAplyYr: z.string().nullish(), + bizNm: z.string().nullish(), + bizBgngYr: z.string().nullish(), + bizEndYr: z.string().nullish(), + bizCn: z.string().nullish(), + aplcntNm: z.string().nullish(), + aplcntMblTelno: z.string().nullish(), + aplcntOgdpNm: z.string().nullish(), + aplcntEmlAddr: z.string().nullish(), + dsgnrNm: z.string().nullish(), + dsgnrTelno: z.string().nullish(), + dsgnrOgdpNm: z.string().nullish(), + dsgnrEmlAddr: z.string().nullish(), + atchFileGroupId: z.string().nullish(), + prgrsSttsComCd: z.string().nullish(), + rtlztnFcltSeComCd: z.string().nullish(), + rtlztnUsgSeComCd: z.string().nullish(), }); /** 백엔드 InstlSncnApplySaveRequestDto.BzScaleItem (diff는 API 미전송) */ export const instlSncnBzScaleItemSchema = z.object({ - cnstpSeCd: z.string().optional(), - bscPl: z.number().optional(), - budgetReflct: z.number().optional(), - thtiDsgn: z.number().optional(), + cnstpSeCd: z.string().nullish(), + bscPl: z.number().nullish(), + budgetReflct: z.number().nullish(), + thtiDsgn: z.number().nullish(), }); /** 백엔드 InstlSncnApplySaveRequestDto.BizCstItem */ export const instlSncnBizCstItemSchema = z.object({ - acntgSeCd: z.string().optional(), - bscPlanAmt: z.number().optional(), - bgtRfltAmt: z.number().optional(), - tstmDesignAmt: z.number().optional(), + acntgSeCd: z.string().nullish(), + bscPlanAmt: z.number().nullish(), + bgtRfltAmt: z.number().nullish(), + tstmDesignAmt: z.number().nullish(), }); /** 백엔드 InstlSncnApplySaveRequestDto.CklstResultItem */ export const instlSncnCklstResultItemSchema = z.object({ - cklstRvwSn: z.number().optional(), - cklstArtclSn: z.number().optional(), - cklstSn: z.number().optional(), + cklstRvwSn: z.number().nullish(), + cklstArtclSn: z.number().nullish(), + cklstSn: z.number().nullish(), rvwStpComCd: z.string().nullish(), selected: z.enum(["Y", "N"]).nullish(), picRvwCn: z.string().nullish(), @@ -55,47 +55,47 @@ export const instlSncnCklstResultItemSchema = z.object({ /** 백엔드 InstlSncnApplySaveRequestDto.EsntlAtchFileItem */ export const instlSncnEsntlAtchFileItemSchema = z.object({ - esntlAtchFileId: z.string().optional(), - atchFileGroupId: z.string().optional(), + esntlAtchFileId: z.string().nullish(), + atchFileGroupId: z.string().nullish(), }); /** 백엔드 InstlSncnRvwOpnnSaveRequestDto */ export const instlSncnRvwOpnnSaveSchema = z.object({ instlSncnDocNo: z.string(), - rvwOpnnSn: z.number().optional(), - opnrSeComCd: z.string().optional(), - opnrNm: z.string().optional(), - rvwRsltCn: z.string().optional(), - rvwRsltAnmlyYn: z.string().optional(), - atchFileGroupId: z.string().optional(), + rvwOpnnSn: z.number().nullish(), + opnrSeComCd: z.string().nullish(), + opnrNm: z.string().nullish(), + rvwRsltCn: z.string().nullish(), + rvwRsltAnmlyYn: z.string().nullish(), + atchFileGroupId: z.string().nullish(), }); /** 백엔드 InstlSncnApplySaveRequestDto.InstlSncnSplmntDmndItem */ export const instlSncnSplmntDmndItemSchema = z.object({ splmntDmndSn: z.number().nullish(), splmntArtclComCd: z.string().nullish(), - splmntDmndCn: z.string().optional(), - splmntDmndDt: z.string().optional(), - splmntDmndAtchFileGroupId: z.string().optional(), - splmntCn: z.string().optional(), - splmntPicNm: z.string().optional(), - splmntCmptnDt: z.string().optional(), - splmntAtchFileGroupId: z.string().optional(), - cmptnYn: z.string().optional(), + splmntDmndCn: z.string().nullish(), + splmntDmndDt: z.string().nullish(), + splmntDmndAtchFileGroupId: z.string().nullish(), + splmntCn: z.string().nullish(), + splmntPicNm: z.string().nullish(), + splmntCmptnDt: z.string().nullish(), + splmntAtchFileGroupId: z.string().nullish(), + cmptnYn: z.string().nullish(), }); /** 백엔드 InstlSncnApplySaveRequestDto */ export const instlSncnApplySaveSchema = z.object({ - techReViewSaveCd: z.string().optional(), - rvwStpCd: z.string().optional(), + techReViewSaveCd: z.string().nullish(), + rvwStpCd: z.string().nullish(), instlSncnMng: instlSncnMngSaveSchema, - bzScaleList: z.array(instlSncnBzScaleItemSchema).optional(), - bizCstList: z.array(instlSncnBizCstItemSchema).optional(), - cklstResultList: z.array(instlSncnCklstResultItemSchema).optional(), - cklstResultMap: z.record(z.array(instlSncnCklstResultItemSchema)).optional(), - esntlAtchFileList: z.array(instlSncnEsntlAtchFileItemSchema).optional(), - rvwOpnnList: z.array(instlSncnRvwOpnnSaveSchema).optional(), - splmntDmndList: z.array(instlSncnSplmntDmndItemSchema).optional(), + bzScaleList: z.array(instlSncnBzScaleItemSchema).nullish(), + bizCstList: z.array(instlSncnBizCstItemSchema).nullish(), + cklstResultList: z.array(instlSncnCklstResultItemSchema).nullish(), + cklstResultMap: z.record(z.array(instlSncnCklstResultItemSchema)).nullish(), + esntlAtchFileList: z.array(instlSncnEsntlAtchFileItemSchema).nullish(), + rvwOpnnList: z.array(instlSncnRvwOpnnSaveSchema).nullish(), + splmntDmndList: z.array(instlSncnSplmntDmndItemSchema).nullish(), }); export type InstlSncnMngSaveRequestDto = z.infer; diff --git a/apps/as/src/entities/pwrk-cnsltn-doc-crt-rslt/model/pwrk-cnsltn-doc-crt-rslt-payload-schema.ts b/apps/as/src/entities/pwrk-cnsltn-doc-crt-rslt/model/pwrk-cnsltn-doc-crt-rslt-payload-schema.ts index c9ed3b7e1..f2bf6ac24 100644 --- a/apps/as/src/entities/pwrk-cnsltn-doc-crt-rslt/model/pwrk-cnsltn-doc-crt-rslt-payload-schema.ts +++ b/apps/as/src/entities/pwrk-cnsltn-doc-crt-rslt/model/pwrk-cnsltn-doc-crt-rslt-payload-schema.ts @@ -4,7 +4,7 @@ import { z } from "zod"; export const pwrkCnsltnDocCrtRsltSaveRequestSchema = z.object({ crtDmndUuid: z.string().uuid(), pwrkCnsltnDocNo: z.string().min(1).max(100), - atchFileGroupId: z.string().max(30).optional(), + atchFileGroupId: z.string().max(30).nullish(), }); export type PwrkCnsltnDocCrtRsltSaveRequestDto = z.infer< diff --git a/apps/as/src/entities/pwrk-cnsltn-doc-evl/model/pwrk-cnsltn-doc-evl-payload-schema.ts b/apps/as/src/entities/pwrk-cnsltn-doc-evl/model/pwrk-cnsltn-doc-evl-payload-schema.ts index 5418c7c63..828d2ff6b 100644 --- a/apps/as/src/entities/pwrk-cnsltn-doc-evl/model/pwrk-cnsltn-doc-evl-payload-schema.ts +++ b/apps/as/src/entities/pwrk-cnsltn-doc-evl/model/pwrk-cnsltn-doc-evl-payload-schema.ts @@ -3,10 +3,10 @@ import { z } from "zod"; /** 백엔드 PwrkCnsltnDocEvlSaveRequestDto */ export const pwrkCnsltnDocEvlSaveRequestSchema = z.object({ pwrkCnsltnDocNo: z.string().min(1), - pwrkCnsltnDocEvlUuid: z.string().uuid().optional(), - pwrkCnsltnDocEvlCn: z.string().max(2000).optional(), - pwrkCnsltnDocEvlScr: z.number().optional(), - pwrkCnsltnDocEvlDt: z.string().optional(), + pwrkCnsltnDocEvlUuid: z.string().uuid().nullish(), + pwrkCnsltnDocEvlCn: z.string().max(2000).nullish(), + pwrkCnsltnDocEvlScr: z.number().nullish(), + pwrkCnsltnDocEvlDt: z.string().nullish(), }); export type PwrkCnsltnDocEvlSaveRequestDto = z.infer; diff --git a/apps/as/src/entities/pwrk-cnsltn-mng/model/pwrk-cnsltn-mng-payload-schema.ts b/apps/as/src/entities/pwrk-cnsltn-mng/model/pwrk-cnsltn-mng-payload-schema.ts index d12926429..228752faa 100644 --- a/apps/as/src/entities/pwrk-cnsltn-mng/model/pwrk-cnsltn-mng-payload-schema.ts +++ b/apps/as/src/entities/pwrk-cnsltn-mng/model/pwrk-cnsltn-mng-payload-schema.ts @@ -3,18 +3,18 @@ import { z } from "zod"; /** 백엔드 PwrkActnResultSubmitDto.ActnItemDto */ export const pwrkActnResultActnItemSchema = z.object({ rvwOpnnSn: z.number(), - actnRsltCn: z.string().optional(), - rfltYn: z.string().optional(), - atchFileGroupId: z.string().optional(), + actnRsltCn: z.string().nullish(), + rfltYn: z.string().nullish(), + atchFileGroupId: z.string().nullish(), }); /** 백엔드 PwrkActnResultSubmitDto */ export const pwrkActnResultSubmitSchema = z.object({ isSubmit: z.boolean(), - actnList: z.array(pwrkActnResultActnItemSchema).optional(), - totActnSummary: z.string().optional(), - muniDocNo: z.string().optional(), - pwrkAtchFileGroupId: z.string().optional(), + actnList: z.array(pwrkActnResultActnItemSchema).nullish(), + totActnSummary: z.string().nullish(), + muniDocNo: z.string().nullish(), + pwrkAtchFileGroupId: z.string().nullish(), }); export type PwrkActnResultSubmitDto = z.infer; diff --git a/apps/as/src/entities/sewer-bsc-plan/model/sewer-bsc-plan-apply-payload-schema.ts b/apps/as/src/entities/sewer-bsc-plan/model/sewer-bsc-plan-apply-payload-schema.ts index 6ad7af1ba..b0fafabc9 100644 --- a/apps/as/src/entities/sewer-bsc-plan/model/sewer-bsc-plan-apply-payload-schema.ts +++ b/apps/as/src/entities/sewer-bsc-plan/model/sewer-bsc-plan-apply-payload-schema.ts @@ -2,50 +2,50 @@ import { z } from "zod"; /** 백엔드 SewerBscPlanSaveRequestDto */ export const sewerBscPlanSaveSchema = z.object({ - sewerBscPlanDocNo: z.string().optional(), - admdstCd: z.string().optional(), - envoSeComCd: z.string().optional(), - sewerBscPlanSeComCd: z.string().optional(), - sewerBscPlanNm: z.string().optional(), - taskSeComCd: z.string().optional(), - prgrsSttsComCd: z.string().optional(), + sewerBscPlanDocNo: z.string().nullish(), + admdstCd: z.string().nullish(), + envoSeComCd: z.string().nullish(), + sewerBscPlanSeComCd: z.string().nullish(), + sewerBscPlanNm: z.string().nullish(), + taskSeComCd: z.string().nullish(), + prgrsSttsComCd: z.string().nullish(), }); /** 백엔드 SewerBscPlanDtlSaveRequestDto */ export const sewerBscPlanDtlSaveSchema = z.object({ - sewerBscPlanDocNo: z.string().optional(), - chgCycl: z.number().optional(), - aplcntNm: z.string().optional(), - aplcntMblTelno: z.string().optional(), - aplcntOgdpNm: z.string().optional(), - aplcntEmlAddr: z.string().optional(), - dsgnrNm: z.string().optional(), - dsgnrTelno: z.string().optional(), - dsgnrOgdpNm: z.string().optional(), - dsgnrEmlAddr: z.string().optional(), - planYr: z.string().optional(), - crtrYr: z.string().optional(), - bizOtlnCn: z.string().optional(), - frlvlGoalYr: z.string().optional(), - sclvlGoalYr: z.string().optional(), - thlvlGoalYr: z.string().optional(), - folvlGoalYr: z.string().optional(), - atchFileGroupId: z.string().optional(), + sewerBscPlanDocNo: z.string().nullish(), + chgCycl: z.number().nullish(), + aplcntNm: z.string().nullish(), + aplcntMblTelno: z.string().nullish(), + aplcntOgdpNm: z.string().nullish(), + aplcntEmlAddr: z.string().nullish(), + dsgnrNm: z.string().nullish(), + dsgnrTelno: z.string().nullish(), + dsgnrOgdpNm: z.string().nullish(), + dsgnrEmlAddr: z.string().nullish(), + planYr: z.string().nullish(), + crtrYr: z.string().nullish(), + bizOtlnCn: z.string().nullish(), + frlvlGoalYr: z.string().nullish(), + sclvlGoalYr: z.string().nullish(), + thlvlGoalYr: z.string().nullish(), + folvlGoalYr: z.string().nullish(), + atchFileGroupId: z.string().nullish(), }); /** 백엔드 SewerBscPlanApplySaveRequestDto.SewerBscPlanOtlnItem */ export const sewerBscPlanOtlnItemSchema = z.object({ - planStpNo: z.number().optional(), - sewerPlanPpltnCnt: z.number().optional(), - sewerPrcsPpltnCnt: z.number().optional(), - sewerPsplyRt: z.number().optional(), + planStpNo: z.number().nullish(), + sewerPlanPpltnCnt: z.number().nullish(), + sewerPrcsPpltnCnt: z.number().nullish(), + sewerPsplyRt: z.number().nullish(), }); /** 백엔드 SewerBscPlanApplySaveRequestDto.CklstResultItem */ export const sewerBscPlanCklstResultItemSchema = z.object({ - cklstRvwSn: z.number().optional(), - cklstArtclSn: z.number().optional(), - cklstSn: z.number().optional(), + cklstRvwSn: z.number().nullish(), + cklstArtclSn: z.number().nullish(), + cklstSn: z.number().nullish(), rvwStpComCd: z.string(), selected: z.enum(["Y", "N"]).nullish(), picRvwCn: z.string().nullish(), @@ -53,109 +53,109 @@ export const sewerBscPlanCklstResultItemSchema = z.object({ /** 백엔드 SewerBscPlanApplySaveRequestDto.SewerBscPlanFnrsCstItem */ export const sewerBscPlanFnrsCstItemSchema = z.object({ - planStpNo: z.number().optional(), - gvexpAmt: z.number().optional(), - lcexpAmt: z.number().optional(), - orgprBdchgAmt: z.number().optional(), - etcAmt: z.number().optional(), - sumAmt: z.number().optional(), + planStpNo: z.number().nullish(), + gvexpAmt: z.number().nullish(), + lcexpAmt: z.number().nullish(), + orgprBdchgAmt: z.number().nullish(), + etcAmt: z.number().nullish(), + sumAmt: z.number().nullish(), }); /** 백엔드 SewerBscPlanApplySaveRequestDto.SewerBscPlanSplmntDmndItem */ export const sewerBscPlanSplmntDmndItemSchema = z.object({ splmntDmndSn: z.number().nullish(), splmntArtclComCd: z.string().nullish(), - splmntDmndCn: z.string().optional(), - splmntDmndDt: z.string().optional(), - splmntDmndAtchFileGroupId: z.string().optional(), - splmntCn: z.string().optional(), - splmntPicNm: z.string().optional(), - splmntCmptnDt: z.string().optional(), - splmntAtchFileGroupId: z.string().optional(), - cmptnYn: z.string().optional(), + splmntDmndCn: z.string().nullish(), + splmntDmndDt: z.string().nullish(), + splmntDmndAtchFileGroupId: z.string().nullish(), + splmntCn: z.string().nullish(), + splmntPicNm: z.string().nullish(), + splmntCmptnDt: z.string().nullish(), + splmntAtchFileGroupId: z.string().nullish(), + cmptnYn: z.string().nullish(), }); /** 백엔드 SewerBscPlanApplySaveRequestDto.SewerBscPlanRvwOpnnItem */ export const sewerBscPlanRvwOpnnItemSchema = z.object({ - rvwOpnnSn: z.number().optional(), - opnrSeComCd: z.string().optional(), - opnrNm: z.string().optional(), - rvwRsltCn: z.string().optional(), - rvwRsltAnmlyYn: z.string().optional(), - atchFileGroupId: z.string().optional(), + rvwOpnnSn: z.number().nullish(), + opnrSeComCd: z.string().nullish(), + opnrNm: z.string().nullish(), + rvwRsltCn: z.string().nullish(), + rvwRsltAnmlyYn: z.string().nullish(), + atchFileGroupId: z.string().nullish(), }); /** 백엔드 SewerBscPlanApplySaveRequestDto.EsntlAtchFileItem */ export const sewerBscPlanEsntlAtchFileItemSchema = z.object({ - esntlAtchFileId: z.string().optional(), - atchFileGroupId: z.string().optional(), + esntlAtchFileId: z.string().nullish(), + atchFileGroupId: z.string().nullish(), }); /** 백엔드 SewerBscPlanApplySaveRequestDto.SewerBscPlanBizCstItem */ export const sewerBscPlanBizCstItemSchema = z.object({ - planStpNo: z.number().optional(), - acntgSeCd: z.string().optional(), - cstrnAmt: z.number().optional(), + planStpNo: z.number().nullish(), + acntgSeCd: z.string().nullish(), + cstrnAmt: z.number().nullish(), }); /** 백엔드 SewerBscPlanApplySaveRequestDto.SewerBscPlanTmplntDtlItem */ export const sewerBscPlanTmplntDtlItemSchema = z.object({ - planStpNo: z.number().optional(), - swtrmtFcltCd: z.string().optional(), - prcsZoneArea: z.number().optional(), - swtrmtPpltnCnt: z.number().optional(), - planSwqty: z.number().optional(), - fcltCpct: z.number().optional(), - sprsysDrtwPplLen: z.number().optional(), - sprsysExlnPplLen: z.number().optional(), - cbsysPplLen: z.number().optional(), - icptgPplLen: z.number().optional(), - drgCnt: z.number().optional(), - drtwRlyPumpCnt: z.number().optional(), - drtwPumpCnt: z.number().optional(), - exlnPumpCnt: z.number().optional(), + planStpNo: z.number().nullish(), + swtrmtFcltCd: z.string().nullish(), + prcsZoneArea: z.number().nullish(), + swtrmtPpltnCnt: z.number().nullish(), + planSwqty: z.number().nullish(), + fcltCpct: z.number().nullish(), + sprsysDrtwPplLen: z.number().nullish(), + sprsysExlnPplLen: z.number().nullish(), + cbsysPplLen: z.number().nullish(), + icptgPplLen: z.number().nullish(), + drgCnt: z.number().nullish(), + drtwRlyPumpCnt: z.number().nullish(), + drtwPumpCnt: z.number().nullish(), + exlnPumpCnt: z.number().nullish(), }); /** 백엔드 SewerBscPlanApplySaveRequestDto.SewerBscPlanTmplntItem */ export const sewerBscPlanTmplntItemSchema = z.object({ - swtrmtFcltCd: z.string().optional(), - atchFileGroupId: z.string().optional(), - sewerBscPlanTmplntDtlList: z.array(sewerBscPlanTmplntDtlItemSchema).optional(), + swtrmtFcltCd: z.string().nullish(), + atchFileGroupId: z.string().nullish(), + sewerBscPlanTmplntDtlList: z.array(sewerBscPlanTmplntDtlItemSchema).nullish(), }); /** 백엔드 SewerBscPlanApplySaveRequestDto.SewerBscPlanTmplntTmprStrgItem */ export const sewerBscPlanTmplntTmprStrgItemSchema = z.object({ - dtStrgDt: z.string().optional(), - swtrmtFcltCd: z.string().optional(), - prcsZoneArea: z.number().optional(), - swtrmtPpltnCnt: z.number().optional(), - planSwqty: z.number().optional(), - fcltCpct: z.number().optional(), - sprsysDrtwPplLen: z.number().optional(), - sprsysExlnPplLen: z.number().optional(), - cbsysPplLen: z.number().optional(), - icptgPplLen: z.number().optional(), - drgCnt: z.number().optional(), - drtwRlyPumpCnt: z.number().optional(), - drtwPumpCnt: z.number().optional(), - exlnPumpCnt: z.number().optional(), + dtStrgDt: z.string().nullish(), + swtrmtFcltCd: z.string().nullish(), + prcsZoneArea: z.number().nullish(), + swtrmtPpltnCnt: z.number().nullish(), + planSwqty: z.number().nullish(), + fcltCpct: z.number().nullish(), + sprsysDrtwPplLen: z.number().nullish(), + sprsysExlnPplLen: z.number().nullish(), + cbsysPplLen: z.number().nullish(), + icptgPplLen: z.number().nullish(), + drgCnt: z.number().nullish(), + drtwRlyPumpCnt: z.number().nullish(), + drtwPumpCnt: z.number().nullish(), + exlnPumpCnt: z.number().nullish(), }); /** 백엔드 SewerBscPlanApplySaveRequestDto */ export const sewerBscPlanApplySaveSchema = z.object({ - techReViewSaveCd: z.string().optional(), - rvwStpCd: z.string().optional(), + techReViewSaveCd: z.string().nullish(), + rvwStpCd: z.string().nullish(), sewerBscPlan: sewerBscPlanSaveSchema, sewerBscPlanDtl: sewerBscPlanDtlSaveSchema, - sewerBscPlanOtlnList: z.array(sewerBscPlanOtlnItemSchema).optional(), - cklstResultList: z.array(sewerBscPlanCklstResultItemSchema).optional(), - fnrsCstList: z.array(sewerBscPlanFnrsCstItemSchema).optional(), - splmntDmndList: z.array(sewerBscPlanSplmntDmndItemSchema).optional(), - rvwOpnnList: z.array(sewerBscPlanRvwOpnnItemSchema).optional(), - esntlAtchFileList: z.array(sewerBscPlanEsntlAtchFileItemSchema).optional(), - bizCstList: z.array(sewerBscPlanBizCstItemSchema).optional(), - sewerBscPlanTmplntList: z.array(sewerBscPlanTmplntItemSchema).optional(), - tmplntTmprStrgList: z.array(sewerBscPlanTmplntTmprStrgItemSchema).optional(), + sewerBscPlanOtlnList: z.array(sewerBscPlanOtlnItemSchema).nullish(), + cklstResultList: z.array(sewerBscPlanCklstResultItemSchema).nullish(), + fnrsCstList: z.array(sewerBscPlanFnrsCstItemSchema).nullish(), + splmntDmndList: z.array(sewerBscPlanSplmntDmndItemSchema).nullish(), + rvwOpnnList: z.array(sewerBscPlanRvwOpnnItemSchema).nullish(), + esntlAtchFileList: z.array(sewerBscPlanEsntlAtchFileItemSchema).nullish(), + bizCstList: z.array(sewerBscPlanBizCstItemSchema).nullish(), + sewerBscPlanTmplntList: z.array(sewerBscPlanTmplntItemSchema).nullish(), + tmplntTmprStrgList: z.array(sewerBscPlanTmplntTmprStrgItemSchema).nullish(), }); export type SewerBscPlanSaveRequestDto = z.infer; diff --git a/apps/as/src/pages/design-cnstn/lib/design-cnstn-regist-schema.ts b/apps/as/src/pages/design-cnstn/lib/design-cnstn-regist-schema.ts index 9cbcdc270..d0e4e894f 100644 --- a/apps/as/src/pages/design-cnstn/lib/design-cnstn-regist-schema.ts +++ b/apps/as/src/pages/design-cnstn/lib/design-cnstn-regist-schema.ts @@ -23,8 +23,8 @@ export const designCnstnRegistSchema = z.object({ .string() .min(1, "설계자 이메일은 필수입니다") .email("올바른 이메일 형식이 아닙니다"), - sido: z.string().optional(), - gugun: z.string().optional(), + sido: z.string().nullish(), + gugun: z.string().nullish(), }), bzScaleList: z.array( designCnstnBzScaleItemSchema.extend({ @@ -32,7 +32,7 @@ export const designCnstnRegistSchema = z.object({ bscPl: z.number(), budgetReflct: z.number(), thtiDsgn: z.number(), - diff: z.number().optional(), + diff: z.number().nullish(), }), ), esntlAtchFileList: z.array( diff --git a/apps/as/src/pages/fnrs-cnsltn/lib/fnrs-cnsltn-regist-schema.ts b/apps/as/src/pages/fnrs-cnsltn/lib/fnrs-cnsltn-regist-schema.ts index 5739c8e6e..b24547422 100644 --- a/apps/as/src/pages/fnrs-cnsltn/lib/fnrs-cnsltn-regist-schema.ts +++ b/apps/as/src/pages/fnrs-cnsltn/lib/fnrs-cnsltn-regist-schema.ts @@ -27,8 +27,8 @@ export const fnrsCnsltnRegistSchema = z.object({ .string() .min(1, "설계자 이메일은 필수입니다") .email("올바른 이메일 형식이 아닙니다"), - sido: z.string().optional(), - gugun: z.string().optional(), + sido: z.string().nullish(), + gugun: z.string().nullish(), }), bzScaleList: z.array( fnrsCnsltnBzScaleItemSchema.extend({ @@ -36,7 +36,7 @@ export const fnrsCnsltnRegistSchema = z.object({ bscPl: z.number(), budgetReflct: z.number(), thtiDsgn: z.number(), - diff: z.number().optional(), + diff: z.number().nullish(), }), ), bizCstList: z.array( @@ -52,8 +52,8 @@ export const fnrsCnsltnRegistSchema = z.object({ fnrsSharSeCd: z.string(), exstnAmt: z.number(), chgRqtAmt: z.number(), - ajmtAmt: z.number().optional(), - rmrkCn: z.string().optional(), + ajmtAmt: z.number().nullish(), + rmrkCn: z.string().nullish(), }), ), cklstResultList: z.array( @@ -74,7 +74,7 @@ export const fnrsCnsltnRegistSchema = z.object({ splmntDmndList: z.array( fnrsCnsltnSplmntDmndItemSchema.extend({ splmntArtclCdNm: z.string().nullish(), - splmntDmndAtchFileNm: z.string().optional(), + splmntDmndAtchFileNm: z.string().nullish(), }), ), privacyConsent: z.enum(["Y", "N"], { diff --git a/apps/as/src/pages/fnrs-cnsltn/lib/pwrk-cnsltn-doc-evl-schema.ts b/apps/as/src/pages/fnrs-cnsltn/lib/pwrk-cnsltn-doc-evl-schema.ts index 569c4f9c2..10e532a00 100644 --- a/apps/as/src/pages/fnrs-cnsltn/lib/pwrk-cnsltn-doc-evl-schema.ts +++ b/apps/as/src/pages/fnrs-cnsltn/lib/pwrk-cnsltn-doc-evl-schema.ts @@ -15,7 +15,7 @@ export const pwrkCnsltnDocEvlFormSchema = z.object({ required_error: "만족도를 선택해 주세요.", invalid_type_error: "만족도를 선택해 주세요.", }), - pwrkCnsltnDocEvlCn: z.string().max(2000).optional(), + pwrkCnsltnDocEvlCn: z.string().max(2000).nullish(), }); export type PwrkCnsltnDocEvlFormValues = z.infer; diff --git a/apps/as/src/pages/instl-sncn/lib/instl-sncn-regist-schema.ts b/apps/as/src/pages/instl-sncn/lib/instl-sncn-regist-schema.ts index befd61c4e..83cd21d3a 100644 --- a/apps/as/src/pages/instl-sncn/lib/instl-sncn-regist-schema.ts +++ b/apps/as/src/pages/instl-sncn/lib/instl-sncn-regist-schema.ts @@ -68,7 +68,7 @@ export const instlSncnRegistSchema = z.object({ splmntDmndList: z.array( instlSncnSplmntDmndItemSchema.extend({ splmntArtclCdNm: z.string().nullish(), - splmntDmndAtchFileNm: z.string().optional(), + splmntDmndAtchFileNm: z.string().nullish(), }), ), privacyConsent: z.enum(["Y", "N"], { diff --git a/apps/as/src/pages/instl-sncn/lib/save-payload-utils.ts b/apps/as/src/pages/instl-sncn/lib/save-payload-utils.ts index cd810c44b..93627f453 100644 --- a/apps/as/src/pages/instl-sncn/lib/save-payload-utils.ts +++ b/apps/as/src/pages/instl-sncn/lib/save-payload-utils.ts @@ -9,7 +9,10 @@ import type { ReviewStepCode, } from "@/entities/instl-sncn"; import { instlSncnApplySaveSchema } from "@/entities/instl-sncn"; -import { type SplmntDmndDialogConfirmPayload, toEsntlAtchFileSaveList } from "@/widgets/pbadms-sprt"; +import { + type SplmntDmndDialogConfirmPayload, + toEsntlAtchFileSaveList, +} from "@/widgets/pbadms-sprt"; import type { ChecklistFormState } from "../model/view-types"; diff --git a/apps/as/src/pages/sewer-bsc-plan/lib/sewer-bsc-plan-regist-schema.ts b/apps/as/src/pages/sewer-bsc-plan/lib/sewer-bsc-plan-regist-schema.ts index d130d0673..9d2dfc30a 100644 --- a/apps/as/src/pages/sewer-bsc-plan/lib/sewer-bsc-plan-regist-schema.ts +++ b/apps/as/src/pages/sewer-bsc-plan/lib/sewer-bsc-plan-regist-schema.ts @@ -16,9 +16,9 @@ import { export const sewerBscPlanRegistSchema = z.object({ sewerBscPlan: sewerBscPlanSaveSchema.extend({ sewerBscPlanNm: z.string().min(1, "기본계획명은 필수입니다"), - sewerBscPlanSeCdNm: z.string().optional(), - taskSeCdNm: z.string().optional(), - sido: z.string().optional(), + sewerBscPlanSeCdNm: z.string().nullish(), + taskSeCdNm: z.string().nullish(), + sido: z.string().nullish(), gugun: z.string().nullish(), }), sewerBscPlanDtl: sewerBscPlanDtlSaveSchema.extend({ @@ -61,7 +61,7 @@ export const sewerBscPlanRegistSchema = z.object({ sewerBscPlanTmplntItemSchema.extend({ swtrmtFcltCd: z.string(), swtrmtFcltNm: z.string().nullish(), - atchFileNm: z.string().optional(), + atchFileNm: z.string().nullish(), sewerBscPlanTmplntDtlList: z .array( sewerBscPlanTmplntDtlItemSchema.extend({ @@ -69,7 +69,7 @@ export const sewerBscPlanRegistSchema = z.object({ swtrmtFcltCd: z.string(), }), ) - .optional(), + .nullish(), }), ), cklstResultList: z.array( @@ -78,7 +78,7 @@ export const sewerBscPlanRegistSchema = z.object({ cklstArtclSn: z.number(), cklstRvwSn: z.number(), selected: z.enum(["Y", "N"]).nullish(), - picRvwCn: z.string().nullable().optional(), + picRvwCn: z.string().nullish(), }), ), esntlAtchFileList: z.array( @@ -90,9 +90,9 @@ export const sewerBscPlanRegistSchema = z.object({ splmntDmndList: z.array( sewerBscPlanSplmntDmndItemSchema.extend({ splmntArtclCdNm: z.string().nullish(), - splmntDmndAtchFileNm: z.string().optional(), - splmntAtchFileNm: z.string().optional(), - splmntAtchFileAtflId: z.string().optional(), + splmntDmndAtchFileNm: z.string().nullish(), + splmntAtchFileNm: z.string().nullish(), + splmntAtchFileAtflId: z.string().nullish(), }), ), privacyConsent: z.enum(["Y", "N"], { From a77246a1db32e0aef788ae103f9268f5909ee09c Mon Sep 17 00:00:00 2001 From: bicochan Date: Tue, 22 Sep 2026 15:39:06 +0900 Subject: [PATCH 5/8] =?UTF-8?q?[as]=20fix:=20=ED=83=80=EC=9E=85=20?= =?UTF-8?q?=EC=97=90=EB=9F=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../elapr/model/elapr-dmnd-interface.ts | 4 ++-- .../lib/design-cnstn-regist-schema.ts | 2 +- .../as/src/pages/design-cnstn/model/columns.tsx | 2 +- .../lib/fnrs-cnsltn-regist-schema.ts | 2 +- apps/as/src/pages/fnrs-cnsltn/model/columns.tsx | 2 +- .../instl-sncn/lib/instl-sncn-regist-schema.ts | 2 +- apps/as/src/pages/instl-sncn/model/columns.tsx | 2 +- .../sewer-bsc-plan/lib/fnrs-cst-form-utils.ts | 17 +++++++---------- .../ui/previous-plan-lookup-dialog.tsx | 2 +- .../ui/sections/tmplnt-form-section.tsx | 4 ++-- apps/as/src/shared/model/pbadms-sprt.ts | 14 +++++++------- .../pbadms-sprt/lib/can-edit-pbadms-doc.ts | 6 +++--- .../pbadms-sprt/lib/fnrs-shar-form-utils.ts | 4 ++-- .../pbadms-sprt/ui/splmnt-dmnd-form-section.tsx | 10 +++++++++- 14 files changed, 39 insertions(+), 34 deletions(-) diff --git a/apps/as/src/entities/elapr/model/elapr-dmnd-interface.ts b/apps/as/src/entities/elapr/model/elapr-dmnd-interface.ts index 5d05fd04b..3b0b0d7e5 100644 --- a/apps/as/src/entities/elapr/model/elapr-dmnd-interface.ts +++ b/apps/as/src/entities/elapr/model/elapr-dmnd-interface.ts @@ -7,8 +7,8 @@ export interface ElaprDmndSaveRequestDto { elaprDocNo: string; dmndTtl: string; dmndCn: string; - elaprCycl?: number; - docPrgrsSttsComCd?: string; + elaprCycl?: number | null; + docPrgrsSttsComCd?: string | null; elaprPrgrsSttsList?: ElaprPrgrsSttsSaveRequestDto[]; } diff --git a/apps/as/src/pages/design-cnstn/lib/design-cnstn-regist-schema.ts b/apps/as/src/pages/design-cnstn/lib/design-cnstn-regist-schema.ts index d0e4e894f..fbb6c9147 100644 --- a/apps/as/src/pages/design-cnstn/lib/design-cnstn-regist-schema.ts +++ b/apps/as/src/pages/design-cnstn/lib/design-cnstn-regist-schema.ts @@ -52,7 +52,7 @@ export function formatTaskSeComCdForApi(taskSeComCd: string[]): string { return taskSeComCd.join(","); } -export function parseTaskSeComCdFromApi(taskSeComCd?: string): string[] { +export function parseTaskSeComCdFromApi(taskSeComCd?: string | null): string[] { if (!taskSeComCd) return []; return taskSeComCd.split(",").filter(Boolean); } diff --git a/apps/as/src/pages/design-cnstn/model/columns.tsx b/apps/as/src/pages/design-cnstn/model/columns.tsx index 083bd08fe..429c209aa 100644 --- a/apps/as/src/pages/design-cnstn/model/columns.tsx +++ b/apps/as/src/pages/design-cnstn/model/columns.tsx @@ -72,7 +72,7 @@ function getBadgeColor(state: BadgeState) { } } -function formatOptional(value: string | undefined) { +function formatOptional(value: string | null | undefined) { return value?.trim() ? value : "-"; } diff --git a/apps/as/src/pages/fnrs-cnsltn/lib/fnrs-cnsltn-regist-schema.ts b/apps/as/src/pages/fnrs-cnsltn/lib/fnrs-cnsltn-regist-schema.ts index b24547422..f0dbd8ad2 100644 --- a/apps/as/src/pages/fnrs-cnsltn/lib/fnrs-cnsltn-regist-schema.ts +++ b/apps/as/src/pages/fnrs-cnsltn/lib/fnrs-cnsltn-regist-schema.ts @@ -88,7 +88,7 @@ export function formatTaskSeComCdForApi(taskSeComCd: string[]): string { return taskSeComCd.join(","); } -export function parseTaskSeComCdFromApi(taskSeComCd?: string): string[] { +export function parseTaskSeComCdFromApi(taskSeComCd?: string | null): string[] { if (!taskSeComCd) return []; return taskSeComCd.split(",").filter(Boolean); } diff --git a/apps/as/src/pages/fnrs-cnsltn/model/columns.tsx b/apps/as/src/pages/fnrs-cnsltn/model/columns.tsx index 2374b0c40..d033b290e 100644 --- a/apps/as/src/pages/fnrs-cnsltn/model/columns.tsx +++ b/apps/as/src/pages/fnrs-cnsltn/model/columns.tsx @@ -113,7 +113,7 @@ function getBadgeColor(state: BadgeState) { } } -function formatOptional(value: string | undefined) { +function formatOptional(value: string | null | undefined) { return value?.trim() ? value : "-"; } diff --git a/apps/as/src/pages/instl-sncn/lib/instl-sncn-regist-schema.ts b/apps/as/src/pages/instl-sncn/lib/instl-sncn-regist-schema.ts index 83cd21d3a..c7bd4d77c 100644 --- a/apps/as/src/pages/instl-sncn/lib/instl-sncn-regist-schema.ts +++ b/apps/as/src/pages/instl-sncn/lib/instl-sncn-regist-schema.ts @@ -82,7 +82,7 @@ export function formatTaskSeComCdForApi(taskSeComCd: string[]): string { return taskSeComCd.join(","); } -export function parseTaskSeComCdFromApi(taskSeComCd?: string): string[] { +export function parseTaskSeComCdFromApi(taskSeComCd?: string | null): string[] { if (!taskSeComCd) return []; return taskSeComCd.split(",").filter(Boolean); } diff --git a/apps/as/src/pages/instl-sncn/model/columns.tsx b/apps/as/src/pages/instl-sncn/model/columns.tsx index 11d51de65..f00d05720 100644 --- a/apps/as/src/pages/instl-sncn/model/columns.tsx +++ b/apps/as/src/pages/instl-sncn/model/columns.tsx @@ -114,7 +114,7 @@ function getBadgeColor(state: BadgeState) { } } -function formatOptional(value: string | undefined) { +function formatOptional(value: string | null | undefined) { return value?.trim() ? value : "-"; } diff --git a/apps/as/src/pages/sewer-bsc-plan/lib/fnrs-cst-form-utils.ts b/apps/as/src/pages/sewer-bsc-plan/lib/fnrs-cst-form-utils.ts index 57de61985..fde0f5ea4 100644 --- a/apps/as/src/pages/sewer-bsc-plan/lib/fnrs-cst-form-utils.ts +++ b/apps/as/src/pages/sewer-bsc-plan/lib/fnrs-cst-form-utils.ts @@ -1,14 +1,14 @@ import { type CostItemDef, roundAmount } from "@/widgets/pbadms-sprt"; -import { type BizCstMatrixItem,getAmt, PLAN_STEPS } from "./biz-cst-matrix-utils"; +import { type BizCstMatrixItem, getAmt, PLAN_STEPS } from "./biz-cst-matrix-utils"; export interface FnrsCstItem { planStpNo: number; - gvexpAmt?: number; - lcexpAmt?: number; - orgprBdchgAmt?: number; - etcAmt?: number; - sumAmt?: number; + gvexpAmt?: number | null; + lcexpAmt?: number | null; + orgprBdchgAmt?: number | null; + etcAmt?: number | null; + sumAmt?: number | null; } export interface FnrsCstStepRemaining { @@ -32,10 +32,7 @@ function getBizCstStepTotal( function sumFnrsCstLeaf(item: FnrsCstItem): number { return roundAmount( - (item.gvexpAmt ?? 0) + - (item.lcexpAmt ?? 0) + - (item.orgprBdchgAmt ?? 0) + - (item.etcAmt ?? 0), + (item.gvexpAmt ?? 0) + (item.lcexpAmt ?? 0) + (item.orgprBdchgAmt ?? 0) + (item.etcAmt ?? 0), ); } diff --git a/apps/as/src/pages/sewer-bsc-plan/ui/previous-plan-lookup-dialog.tsx b/apps/as/src/pages/sewer-bsc-plan/ui/previous-plan-lookup-dialog.tsx index 0d0d6f4a8..b2c854487 100644 --- a/apps/as/src/pages/sewer-bsc-plan/ui/previous-plan-lookup-dialog.tsx +++ b/apps/as/src/pages/sewer-bsc-plan/ui/previous-plan-lookup-dialog.tsx @@ -31,7 +31,7 @@ interface PreviousPlanLookupDialogProps { open: boolean; onOpenChange: (open: boolean) => void; /** 부모 폼 `sewerBscPlan.sido` 표시명 */ - initialSidoNm?: string; + initialSidoNm?: string | null; /** 부모 폼 `sewerBscPlan.gugun` 표시명 */ initialGugunNm?: string | null; } diff --git a/apps/as/src/pages/sewer-bsc-plan/ui/sections/tmplnt-form-section.tsx b/apps/as/src/pages/sewer-bsc-plan/ui/sections/tmplnt-form-section.tsx index 89b25aee9..51f59d559 100644 --- a/apps/as/src/pages/sewer-bsc-plan/ui/sections/tmplnt-form-section.tsx +++ b/apps/as/src/pages/sewer-bsc-plan/ui/sections/tmplnt-form-section.tsx @@ -214,8 +214,8 @@ function TmplntFacilityMatrix({ interface TmplntFacilityAttachmentsProps { facilityIndex: number; facilityName?: string; - atchFileGroupId?: string; - atchFileNm?: string; + atchFileGroupId?: string | null; + atchFileNm?: string | null; } function TmplntFacilityAttachments({ diff --git a/apps/as/src/shared/model/pbadms-sprt.ts b/apps/as/src/shared/model/pbadms-sprt.ts index 669e3a234..0d08874d5 100644 --- a/apps/as/src/shared/model/pbadms-sprt.ts +++ b/apps/as/src/shared/model/pbadms-sprt.ts @@ -205,14 +205,14 @@ export interface EsntlAtchFileSaveBase { export interface SplmntDmndSaveBase { splmntDmndSn?: number | null; splmntArtclComCd?: string | null; - splmntDmndCn?: string; - splmntDmndDt?: string; + splmntDmndCn?: string | null; + splmntDmndDt?: string | null; splmntDmndAtchFileGroupId?: string | null; - splmntCn?: string; - splmntPicNm?: string; - splmntCmptnDt?: string; - splmntAtchFileGroupId?: string; - cmptnYn?: string; + splmntCn?: string | null; + splmntPicNm?: string | null; + splmntCmptnDt?: string | null; + splmntAtchFileGroupId?: string | null; + cmptnYn?: string | null; } /** 검토의견 저장 공통 필드 (문서번호 제외) */ diff --git a/apps/as/src/widgets/pbadms-sprt/lib/can-edit-pbadms-doc.ts b/apps/as/src/widgets/pbadms-sprt/lib/can-edit-pbadms-doc.ts index ba626a08c..18efd5c67 100644 --- a/apps/as/src/widgets/pbadms-sprt/lib/can-edit-pbadms-doc.ts +++ b/apps/as/src/widgets/pbadms-sprt/lib/can-edit-pbadms-doc.ts @@ -1,8 +1,8 @@ interface CanEditPbadmsDocParams { docSeComCd: string; - prgrsSttsComCd: string | undefined; - rgtr: string | undefined; - loggedInUserUnqId: string | undefined; + prgrsSttsComCd?: string | null; + rgtr?: string | null; + loggedInUserUnqId?: string | null; } function canEditPbadmsDoc({ diff --git a/apps/as/src/widgets/pbadms-sprt/lib/fnrs-shar-form-utils.ts b/apps/as/src/widgets/pbadms-sprt/lib/fnrs-shar-form-utils.ts index d593d4aee..9f6959bbf 100644 --- a/apps/as/src/widgets/pbadms-sprt/lib/fnrs-shar-form-utils.ts +++ b/apps/as/src/widgets/pbadms-sprt/lib/fnrs-shar-form-utils.ts @@ -17,8 +17,8 @@ export interface FnrsSharListItem { fnrsSharSeCd: string; exstnAmt: number; chgRqtAmt: number; - ajmtAmt?: number; - rmrkCn?: string; + ajmtAmt?: number | null; + rmrkCn?: string | null; } export type FnrsSharTreeNode = FnrsSharSeMngTreeDto | FnrsSharBizCstTreeDto; diff --git a/apps/as/src/widgets/pbadms-sprt/ui/splmnt-dmnd-form-section.tsx b/apps/as/src/widgets/pbadms-sprt/ui/splmnt-dmnd-form-section.tsx index 2738e5c1f..711415a46 100644 --- a/apps/as/src/widgets/pbadms-sprt/ui/splmnt-dmnd-form-section.tsx +++ b/apps/as/src/widgets/pbadms-sprt/ui/splmnt-dmnd-form-section.tsx @@ -286,7 +286,15 @@ function SplmntDmndFormSection({ readOnly = false }: SplmntDmndFormSectionProps) {isRowReadOnly ? ( - {item.splmntCn || "-"} +
+
{item.splmntCn || "-"}
+ {item.splmntAtchFileGroupId ? ( + + ) : null} +
) : ( Date: Tue, 22 Sep 2026 16:21:13 +0900 Subject: [PATCH 6/8] =?UTF-8?q?[as]=20chore:=20=EB=B3=B4=EC=99=84=EC=9A=94?= =?UTF-8?q?=EC=B2=AD=20=EC=84=B9=EC=85=98=20=EC=B2=A8=EB=B6=80=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=20=EA=B4=80=EB=A0=A8=20=EC=BD=94=EB=93=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/components/pwrk-cnsltn-doc-evl-dialog.tsx | 3 ++- apps/as/src/pages/fnrs-cnsltn/ui/fnrs-form-page.tsx | 5 ++++- .../pbadms-sprt/ui/splmnt-dmnd-form-section.tsx | 11 +++++++---- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/apps/as/src/pages/fnrs-cnsltn/ui/components/pwrk-cnsltn-doc-evl-dialog.tsx b/apps/as/src/pages/fnrs-cnsltn/ui/components/pwrk-cnsltn-doc-evl-dialog.tsx index 3696faf7c..eac7aa947 100644 --- a/apps/as/src/pages/fnrs-cnsltn/ui/components/pwrk-cnsltn-doc-evl-dialog.tsx +++ b/apps/as/src/pages/fnrs-cnsltn/ui/components/pwrk-cnsltn-doc-evl-dialog.tsx @@ -113,7 +113,8 @@ function PwrkCnsltnDocEvlDialog({ open, pwrkCnsltnDocNo, onClose }: PwrkCnsltnDo