diff --git a/apps/as/src/entities/design-cnstn/api/design-cnstn-mng-service.ts b/apps/as/src/entities/design-cnstn/api/design-cnstn-mng-service.ts index 3fc3e52ae..39ff512a9 100644 --- a/apps/as/src/entities/design-cnstn/api/design-cnstn-mng-service.ts +++ b/apps/as/src/entities/design-cnstn/api/design-cnstn-mng-service.ts @@ -4,9 +4,11 @@ import type { PageResponse } from "@/shared/model"; import type { DesignCnstnApplySaveRequestDto, + DesignCnstnMngSaveRequestDto, +} from "../model/design-cnstn-apply-payload-schema"; +import type { DesignCnstnMngDetResponseDto, DesignCnstnMngResponseDto, - DesignCnstnMngSaveRequestDto, DesignCnstnMngSearchDto, DesignCnstnMngService, DesignCnstnMngUpdateRequestDto, diff --git a/apps/as/src/entities/design-cnstn/api/design-cnstn-rvw-opnn-service.ts b/apps/as/src/entities/design-cnstn/api/design-cnstn-rvw-opnn-service.ts index 514a0423f..ddfc3d885 100644 --- a/apps/as/src/entities/design-cnstn/api/design-cnstn-rvw-opnn-service.ts +++ b/apps/as/src/entities/design-cnstn/api/design-cnstn-rvw-opnn-service.ts @@ -2,10 +2,10 @@ import { client } from "@/shared/api"; import { ENDPOINT } from "@/shared/config"; import type { PageResponse } from "@/shared/model"; +import type { DesignCnstnRvwOpnnSaveRequestDto } from "../model/design-cnstn-apply-payload-schema"; import type { DesignCnstnRvwOpnnId, DesignCnstnRvwOpnnResponseDto, - DesignCnstnRvwOpnnSaveRequestDto, DesignCnstnRvwOpnnSearchDto, DesignCnstnRvwOpnnService, DesignCnstnRvwOpnnUpdateRequestDto, diff --git a/apps/as/src/entities/design-cnstn/api/queries.ts b/apps/as/src/entities/design-cnstn/api/queries.ts index c98a5ad15..7a04eb8d8 100644 --- a/apps/as/src/entities/design-cnstn/api/queries.ts +++ b/apps/as/src/entities/design-cnstn/api/queries.ts @@ -18,11 +18,13 @@ import type { import type { DesignCnstnApplySaveRequestDto, DesignCnstnMngSaveRequestDto, + DesignCnstnRvwOpnnSaveRequestDto, +} from "../model/design-cnstn-apply-payload-schema"; +import type { DesignCnstnMngSearchDto, DesignCnstnMngUpdateRequestDto, } from "../model/design-cnstn-mng-interface"; import type { - DesignCnstnRvwOpnnSaveRequestDto, DesignCnstnRvwOpnnSearchDto, DesignCnstnRvwOpnnUpdateRequestDto, } from "../model/design-cnstn-rvw-opnn-interface"; diff --git a/apps/as/src/entities/design-cnstn/index.ts b/apps/as/src/entities/design-cnstn/index.ts index cad262c32..b09702d6e 100644 --- a/apps/as/src/entities/design-cnstn/index.ts +++ b/apps/as/src/entities/design-cnstn/index.ts @@ -63,23 +63,33 @@ export type { } from "./model/design-cnstn-esntl-atch-file-interface"; export type { AtflMngClientResponseDto, - BizCstItem, BizCstTreeDto, BizSclTreeDto, - BzScaleItem, - DesignCnstnApplySaveRequestDto, DesignCnstnMngDetResponseDto, DesignCnstnMngResponseDto, - DesignCnstnMngSaveRequestDto, DesignCnstnMngSearchDto, DesignCnstnMngService, DesignCnstnMngUpdateRequestDto, DesignCnstnRvwOpnnResponseDto, - DesignCnstnRvwOpnnSaveRequestDto, ElaprDocPrgrsClientResponseDto, - EsntlAtchFileItem, EsntlAtchFileMngTreeResponseDto, } from "./model/design-cnstn-mng-interface"; +export type { + BizCstItem, + BzScaleItem, + DesignCnstnApplySaveRequestDto, + DesignCnstnMngSaveRequestDto, + DesignCnstnRvwOpnnSaveRequestDto, + EsntlAtchFileItem, +} from "./model/design-cnstn-apply-payload-schema"; +export { + designCnstnApplySaveSchema, + designCnstnBizCstItemSchema, + designCnstnBzScaleItemSchema, + designCnstnEsntlAtchFileItemSchema, + designCnstnMngSaveSchema, + designCnstnRvwOpnnSaveSchema, +} from "./model/design-cnstn-apply-payload-schema"; export type { DesignCnstnRvwOpnnId, DesignCnstnRvwOpnnSearchDto, 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 new file mode 100644 index 000000000..5b6c76b10 --- /dev/null +++ b/apps/as/src/entities/design-cnstn/model/design-cnstn-apply-payload-schema.ts @@ -0,0 +1,74 @@ +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(), +}); + +/** 백엔드 DesignCnstnApplySaveRequestDto.BzScaleItem */ +export const designCnstnBzScaleItemSchema = z.object({ + cnstpSeCd: z.string().optional(), + bscPl: z.number().optional(), + budgetReflct: z.number().optional(), + thtiDsgn: z.number().optional(), +}); + +/** 백엔드 DesignCnstnApplySaveRequestDto.BizCstItem */ +export const designCnstnBizCstItemSchema = z.object({ + acntgSeCd: z.string().optional(), + bscPlanAmt: z.number().optional(), + bgtRfltAmt: z.number().optional(), + tstmDesignAmt: z.number().optional(), +}); + +/** 백엔드 DesignCnstnApplySaveRequestDto.EsntlAtchFileItem */ +export const designCnstnEsntlAtchFileItemSchema = z.object({ + esntlAtchFileId: z.string().optional(), + atchFileGroupId: z.string().optional(), +}); + +/** 백엔드 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(), +}); + +/** 백엔드 DesignCnstnApplySaveRequestDto */ +export const designCnstnApplySaveSchema = z.object({ + techReViewSaveCd: z.string().optional(), + rvwStpCd: z.string().optional(), + designCnstnMng: designCnstnMngSaveSchema, + bzScaleList: z.array(designCnstnBzScaleItemSchema).optional(), + bizCstList: z.array(designCnstnBizCstItemSchema).optional(), + esntlAtchFileList: z.array(designCnstnEsntlAtchFileItemSchema).optional(), + rvwOpnnList: z.array(designCnstnRvwOpnnSaveSchema).optional(), +}); + +export type DesignCnstnMngSaveRequestDto = z.infer; +export type BzScaleItem = z.infer; +export type BizCstItem = z.infer; +export type EsntlAtchFileItem = z.infer; +export type DesignCnstnRvwOpnnSaveRequestDto = z.infer; +export type DesignCnstnApplySaveRequestDto = z.infer; diff --git a/apps/as/src/entities/design-cnstn/model/design-cnstn-mng-interface.ts b/apps/as/src/entities/design-cnstn/model/design-cnstn-mng-interface.ts index 1ee2be991..bc4949eb3 100644 --- a/apps/as/src/entities/design-cnstn/model/design-cnstn-mng-interface.ts +++ b/apps/as/src/entities/design-cnstn/model/design-cnstn-mng-interface.ts @@ -1,22 +1,12 @@ -import type { - BizCstSaveBase, - BzScaleSaveBase, - EsntlAtchFileSaveBase, - PageableParams, - PageResponse, - PbadmsApplySaveHeader, - PbadmsMngDetResponseBase, -} from "@/shared/model"; +import type { PageableParams, PageResponse, PbadmsMngDetResponseBase } from "@/shared/model"; import type { - DesignCnstnRvwOpnnResponseDto, - DesignCnstnRvwOpnnSaveRequestDto, -} from "./design-cnstn-rvw-opnn-interface"; + DesignCnstnApplySaveRequestDto, + DesignCnstnMngSaveRequestDto, +} from "./design-cnstn-apply-payload-schema"; +import type { DesignCnstnRvwOpnnResponseDto } from "./design-cnstn-rvw-opnn-interface"; -export type { - DesignCnstnRvwOpnnResponseDto, - DesignCnstnRvwOpnnSaveRequestDto, -} from "./design-cnstn-rvw-opnn-interface"; +export type { DesignCnstnRvwOpnnResponseDto } from "./design-cnstn-rvw-opnn-interface"; export type { AtflMngClientResponseDto, BizCstTreeDto, @@ -25,28 +15,6 @@ export type { EsntlAtchFileMngTreeResponseDto, } from "@/shared/model"; -/** 백엔드 DesignCnstnMngSaveRequestDto */ -export interface DesignCnstnMngSaveRequestDto { - designCnstnDocNo?: string; - admdstCd?: string; - envoSeComCd?: string; - taskSeComCd?: string; - bizNm?: string; - bizBgngYr?: string; - bizEndYr?: string; - bizCn?: string; - aplcntNm?: string; - aplcntMblTelno?: string; - aplcntOgdpNm?: string; - aplcntEmlAddr?: string; - dsgnrNm?: string; - dsgnrTelno?: string; - dsgnrOgdpNm?: string; - dsgnrEmlAddr?: string; - atchFileGroupId?: string; - prgrsSttsComCd?: string; -} - /** 백엔드 DesignCnstnMngUpdateRequestDto */ export type DesignCnstnMngUpdateRequestDto = Omit; @@ -88,30 +56,12 @@ interface DesignCnstnMngResponseExtension { export type DesignCnstnMngResponseDto = Omit & DesignCnstnMngResponseExtension; -/** 백엔드 DesignCnstnApplySaveRequestDto.BzScaleItem */ -export type BzScaleItem = BzScaleSaveBase; - -/** 백엔드 DesignCnstnApplySaveRequestDto.BizCstItem */ -export type BizCstItem = BizCstSaveBase; - -/** 백엔드 DesignCnstnApplySaveRequestDto.EsntlAtchFileItem */ -export type EsntlAtchFileItem = EsntlAtchFileSaveBase; - /** 백엔드 DesignCnstnMngDetResponseDto */ export type DesignCnstnMngDetResponseDto = PbadmsMngDetResponseBase< DesignCnstnMngResponseDto, DesignCnstnRvwOpnnResponseDto >; -/** 백엔드 DesignCnstnApplySaveRequestDto */ -export interface DesignCnstnApplySaveRequestDto extends PbadmsApplySaveHeader { - designCnstnMng: DesignCnstnMngSaveRequestDto; - bzScaleList?: BzScaleItem[]; - bizCstList?: BizCstItem[]; - esntlAtchFileList?: EsntlAtchFileItem[]; - rvwOpnnList?: DesignCnstnRvwOpnnSaveRequestDto[]; -} - /** Controller public 메서드명·시그니처와 동일 */ export interface DesignCnstnMngService { findPage(searchDto: DesignCnstnMngSearchDto): Promise>; diff --git a/apps/as/src/entities/design-cnstn/model/design-cnstn-rvw-opnn-interface.ts b/apps/as/src/entities/design-cnstn/model/design-cnstn-rvw-opnn-interface.ts index 8b9841ee6..56cc7b94c 100644 --- a/apps/as/src/entities/design-cnstn/model/design-cnstn-rvw-opnn-interface.ts +++ b/apps/as/src/entities/design-cnstn/model/design-cnstn-rvw-opnn-interface.ts @@ -1,22 +1,13 @@ import type { PageableParams, PageResponse, RvwOpnnResponseExtension } from "@/shared/model"; +import type { DesignCnstnRvwOpnnSaveRequestDto } from "./design-cnstn-apply-payload-schema"; + /** 백엔드 DesignCnstnRvwOpnnId */ export interface DesignCnstnRvwOpnnId { designCnstnMng: string; rvwOpnnSn: number; } -/** 백엔드 DesignCnstnRvwOpnnSaveRequestDto */ -export interface DesignCnstnRvwOpnnSaveRequestDto { - designCnstnDocNo: string; - rvwOpnnSn?: number; - opnrSeComCd?: string; - opnrNm?: string; - rvwRsltCn?: string; - rvwRsltAnmlyYn?: string; - atchFileGroupId?: string; -} - /** 백엔드 DesignCnstnRvwOpnnUpdateRequestDto */ export interface DesignCnstnRvwOpnnUpdateRequestDto { opnrSeComCd?: string; diff --git a/apps/as/src/entities/fnrs-cnsltn/api/fnrs-cnsltn-service.ts b/apps/as/src/entities/fnrs-cnsltn/api/fnrs-cnsltn-service.ts index b48e5a059..ffac5eb4a 100644 --- a/apps/as/src/entities/fnrs-cnsltn/api/fnrs-cnsltn-service.ts +++ b/apps/as/src/entities/fnrs-cnsltn/api/fnrs-cnsltn-service.ts @@ -3,12 +3,14 @@ import { ENDPOINT } from "@/shared/config"; import type { PageResponse } from "@/shared/model"; import type { - DocPrgrsUpdateRequestDto, FnrsCnsltnApplySaveRequestDto, + FnrsCnsltnMngSaveRequestDto, +} from "../model/fnrs-cnsltn-apply-payload-schema"; +import type { + DocPrgrsUpdateRequestDto, FnrsCnsltnFileVrfcRsltResponseDto, FnrsCnsltnMngDetResponseDto, FnrsCnsltnMngResponseDto, - FnrsCnsltnMngSaveRequestDto, FnrsCnsltnMngSearchDto, FnrsCnsltnMngService, FnrsCnsltnMngUpdateRequestDto, diff --git a/apps/as/src/entities/fnrs-cnsltn/api/queries.ts b/apps/as/src/entities/fnrs-cnsltn/api/queries.ts index 357aa58c0..e136bd59f 100644 --- a/apps/as/src/entities/fnrs-cnsltn/api/queries.ts +++ b/apps/as/src/entities/fnrs-cnsltn/api/queries.ts @@ -1,9 +1,11 @@ import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import type { - DocPrgrsUpdateRequestDto, FnrsCnsltnApplySaveRequestDto, FnrsCnsltnMngSaveRequestDto, +} from "../model/fnrs-cnsltn-apply-payload-schema"; +import type { + DocPrgrsUpdateRequestDto, FnrsCnsltnMngSearchDto, FnrsCnsltnMngUpdateRequestDto, } from "../model/fnrs-cnsltn-interface"; diff --git a/apps/as/src/entities/fnrs-cnsltn/index.ts b/apps/as/src/entities/fnrs-cnsltn/index.ts index 176101dbe..1fba74291 100644 --- a/apps/as/src/entities/fnrs-cnsltn/index.ts +++ b/apps/as/src/entities/fnrs-cnsltn/index.ts @@ -17,31 +17,44 @@ export { } from "./api/queries"; export type { AtflMngClientResponseDto, - BizCstItem, BizCstTreeDto, BizSclTreeDto, - BzScaleItem, - CklstResultItem, CklstRvwRsltTreeDto, DocPrgrsUpdateRequestDto, ElaprDocPrgrsClientResponseDto, - EsntlAtchFileItem, EsntlAtchFileMngTreeResponseDto, - FnrsCnsltnApplySaveRequestDto, FnrsCnsltnFileVrfcRsltResponseDto, FnrsCnsltnMngDetResponseDto, FnrsCnsltnMngResponseDto, - FnrsCnsltnMngSaveRequestDto, FnrsCnsltnMngSearchDto, FnrsCnsltnMngService, FnrsCnsltnMngUpdateRequestDto, FnrsCnsltnRvwOpnnResponseDto, - FnrsCnsltnRvwOpnnSaveRequestDto, - FnrsCnsltnSplmntDmndItem, FnrsCnsltnSplmntDmndResponseDto, - FnrsSharItem, RagIndexingInfoDto, } from "./model/fnrs-cnsltn-interface"; +export type { + BizCstItem, + BzScaleItem, + CklstResultItem, + EsntlAtchFileItem, + FnrsCnsltnApplySaveRequestDto, + FnrsCnsltnMngSaveRequestDto, + FnrsCnsltnRvwOpnnSaveRequestDto, + FnrsCnsltnSplmntDmndItem, + FnrsSharItem, +} from "./model/fnrs-cnsltn-apply-payload-schema"; +export { + fnrsCnsltnApplySaveSchema, + fnrsCnsltnBizCstItemSchema, + fnrsCnsltnBzScaleItemSchema, + fnrsCnsltnCklstResultItemSchema, + fnrsCnsltnEsntlAtchFileItemSchema, + fnrsCnsltnMngSaveSchema, + fnrsCnsltnRvwOpnnSaveSchema, + fnrsCnsltnSplmntDmndItemSchema, + fnrsSharItemSchema, +} from "./model/fnrs-cnsltn-apply-payload-schema"; export type { EnvoActnReviewReqDto, FnrsExamineRequestDto, 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 new file mode 100644 index 000000000..709ae9012 --- /dev/null +++ b/apps/as/src/entities/fnrs-cnsltn/model/fnrs-cnsltn-apply-payload-schema.ts @@ -0,0 +1,120 @@ +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(), +}); + +/** 백엔드 FnrsCnsltnApplySaveRequestDto.BzScaleItem */ +export const fnrsCnsltnBzScaleItemSchema = z.object({ + cnstpSeCd: z.string().optional(), + bscPl: z.number().optional(), + budgetReflct: z.number().optional(), + thtiDsgn: z.number().optional(), +}); + +/** 백엔드 FnrsCnsltnApplySaveRequestDto.BizCstItem */ +export const fnrsCnsltnBizCstItemSchema = z.object({ + acntgSeCd: z.string().optional(), + bscPlanAmt: z.number().optional(), + bgtRfltAmt: z.number().optional(), + tstmDesignAmt: z.number().optional(), +}); + +/** 백엔드 FnrsCnsltnApplySaveRequestDto.CklstResultItem */ +export const fnrsCnsltnCklstResultItemSchema = z.object({ + cklstRvwSn: z.number().optional(), + cklstArtclSn: z.number().optional(), + cklstSn: z.number().optional(), + rvwStpComCd: z.string().nullish(), + selected: z.enum(["Y", "N"]).nullish(), + picRvwCn: z.string().nullish(), +}); + +/** 백엔드 FnrsCnsltnApplySaveRequestDto.EsntlAtchFileItem */ +export const fnrsCnsltnEsntlAtchFileItemSchema = z.object({ + esntlAtchFileId: z.string().optional(), + atchFileGroupId: z.string().optional(), +}); + +/** 백엔드 FnrsCnsltnApplySaveRequestDto.FnrsCnsltnSplmntDmndItem */ +export const fnrsCnsltnSplmntDmndItemSchema = 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(), +}); + +/** 백엔드 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(), +}); + +/** 백엔드 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(), +}); + +/** 백엔드 FnrsCnsltnApplySaveRequestDto */ +export const fnrsCnsltnApplySaveSchema = z.object({ + techReViewSaveCd: z.string().optional(), + rvwStpCd: z.string().optional(), + 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(), +}); + +export type FnrsCnsltnMngSaveRequestDto = z.infer; +export type BzScaleItem = z.infer; +export type BizCstItem = z.infer; +export type CklstResultItem = z.infer; +export type EsntlAtchFileItem = z.infer; +export type FnrsCnsltnSplmntDmndItem = z.infer; +export type FnrsCnsltnRvwOpnnSaveRequestDto = z.infer; +export type FnrsSharItem = z.infer; +export type FnrsCnsltnApplySaveRequestDto = z.infer; diff --git a/apps/as/src/entities/fnrs-cnsltn/model/fnrs-cnsltn-interface.ts b/apps/as/src/entities/fnrs-cnsltn/model/fnrs-cnsltn-interface.ts index 2165ff49e..07d3983e9 100644 --- a/apps/as/src/entities/fnrs-cnsltn/model/fnrs-cnsltn-interface.ts +++ b/apps/as/src/entities/fnrs-cnsltn/model/fnrs-cnsltn-interface.ts @@ -1,21 +1,20 @@ import type { AtflMngClientResponseDto, - BizCstSaveBase, - BzScaleSaveBase, - CklstResultSaveBase, DocPrgrsUpdateRequestDto, - EsntlAtchFileSaveBase, PageableParams, PageResponse, - PbadmsApplySaveHeader, PbadmsMngDetResponseBase, RvwOpnnResponseExtension, - RvwOpnnSaveBase, SplmntDmndResponseExtension, - SplmntDmndSaveBase, } from "@/shared/model"; import type { FnrsSharBizCstTreeDto } from "@/entities/fnrs-shar-se"; +import type { + FnrsCnsltnApplySaveRequestDto, + FnrsCnsltnMngSaveRequestDto, + FnrsCnsltnRvwOpnnSaveRequestDto, + FnrsCnsltnSplmntDmndItem, +} from "./fnrs-cnsltn-apply-payload-schema"; import type { EnvoActnReviewReqDto, FnrsExamineRequestDto, @@ -31,33 +30,6 @@ export type { EsntlAtchFileMngTreeResponseDto, } from "@/shared/model"; -/** 백엔드 FnrsCnsltnMngSaveRequestDto */ -export interface FnrsCnsltnMngSaveRequestDto { - fnrsCnsltnDocNo?: string; - admdstCd?: string; - envoSeComCd?: string; - taskSeComCd?: string; - cfmtnBgtBizNo?: string; - bgtAplyYr?: string; - bizNm?: string; - bizBgngYr?: string; - bizEndYr?: string; - bizCn?: string; - aplcntNm?: string; - aplcntMblTelno?: string; - aplcntOgdpNm?: string; - aplcntEmlAddr?: string; - dsgnrNm?: string; - dsgnrTelno?: string; - dsgnrOgdpNm?: string; - dsgnrEmlAddr?: string; - atchFileGroupId?: string; - sharAtchFileGroupId?: string; - prgrsSttsComCd?: string; - rtlztnFcltSeComCd?: string; - rtlztnUsgSeComCd?: string; -} - /** 백엔드 FnrsCnsltnMngUpdateRequestDto */ export type FnrsCnsltnMngUpdateRequestDto = Omit; @@ -110,34 +82,6 @@ interface FnrsCnsltnMngResponseExtension { export type FnrsCnsltnMngResponseDto = Omit & FnrsCnsltnMngResponseExtension; -export type BzScaleItem = BzScaleSaveBase; - -export type BizCstItem = BizCstSaveBase; - -export interface CklstResultItem extends CklstResultSaveBase { - selected?: string; -} - -export type EsntlAtchFileItem = EsntlAtchFileSaveBase; - -export type FnrsCnsltnSplmntDmndItem = SplmntDmndSaveBase; - -/** 백엔드 FnrsCnsltnApplySaveRequestDto.FnrsSharItem */ -export interface FnrsSharItem { - fnrsSharSeCd?: string; - exstnAmt?: number; - chgRqtAmt?: number; - ajmtAmt?: number; - rmrkCn?: string; - envoRmrkCn?: string; -} - -/** 백엔드 FnrsCnsltnRvwOpnnSaveRequestDto */ -export interface FnrsCnsltnRvwOpnnSaveRequestDto extends RvwOpnnSaveBase { - fnrsCnsltnDocNo: string; - rvwOpnnSn: number; -} - /** 백엔드 FnrsCnsltnRvwOpnnResponseDto */ export type FnrsCnsltnRvwOpnnResponseDto = Partial< Pick @@ -170,19 +114,6 @@ export type FnrsCnsltnMngDetResponseDto = PbadmsMngDetResponseBase< ragIndexingInfo?: RagIndexingInfoDto | null; }; -/** 백엔드 FnrsCnsltnApplySaveRequestDto */ -export interface FnrsCnsltnApplySaveRequestDto extends PbadmsApplySaveHeader { - fnrsCnsltnMng: FnrsCnsltnMngSaveRequestDto; - bzScaleList?: BzScaleItem[]; - bizCstList?: BizCstItem[]; - cklstResultList?: CklstResultItem[]; - cklstResultMap?: Record; - esntlAtchFileList?: EsntlAtchFileItem[]; - rvwOpnnList?: FnrsCnsltnRvwOpnnSaveRequestDto[]; - splmntDmndList?: FnrsCnsltnSplmntDmndItem[]; - fnrsSharList?: FnrsSharItem[]; -} - /** 백엔드 FnrsCnsltnFileVrfcRsltResponseDto */ export interface FnrsCnsltnFileVrfcRsltResponseDto { fileSeComCd?: string; diff --git a/apps/as/src/entities/instl-sncn/api/instl-sncn-service.ts b/apps/as/src/entities/instl-sncn/api/instl-sncn-service.ts index 2bef72628..4c442a3da 100644 --- a/apps/as/src/entities/instl-sncn/api/instl-sncn-service.ts +++ b/apps/as/src/entities/instl-sncn/api/instl-sncn-service.ts @@ -2,13 +2,15 @@ import { client } from "@/shared/api"; import { ENDPOINT } from "@/shared/config"; import type { PageResponse } from "@/shared/model"; +import type { + InstlSncnApplySaveRequestDto, + InstlSncnMngSaveRequestDto, +} from "../model/instl-sncn-apply-payload-schema"; import type { AdstZoneResponseDto, DocPrgrsUpdateRequestDto, - InstlSncnApplySaveRequestDto, InstlSncnMngDetResponse, InstlSncnMngResponseDto, - InstlSncnMngSaveRequestDto, InstlSncnMngSearchParams, InstlSncnMngService, InstlSncnMngUpdateRequestDto, diff --git a/apps/as/src/entities/instl-sncn/api/queries.ts b/apps/as/src/entities/instl-sncn/api/queries.ts index f9d94dbff..278277668 100644 --- a/apps/as/src/entities/instl-sncn/api/queries.ts +++ b/apps/as/src/entities/instl-sncn/api/queries.ts @@ -3,9 +3,11 @@ import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { ENDPOINT } from "@/shared/config"; import type { - DocPrgrsUpdateRequestDto, InstlSncnApplySaveRequestDto, InstlSncnMngSaveRequestDto, +} from "../model/instl-sncn-apply-payload-schema"; +import type { + DocPrgrsUpdateRequestDto, InstlSncnMngSearchParams, InstlSncnMngUpdateRequestDto, } from "../model/instl-sncn-interface"; diff --git a/apps/as/src/entities/instl-sncn/index.ts b/apps/as/src/entities/instl-sncn/index.ts index 946e756f1..ebeb5021b 100644 --- a/apps/as/src/entities/instl-sncn/index.ts +++ b/apps/as/src/entities/instl-sncn/index.ts @@ -19,18 +19,30 @@ export { type ElaprDocPrgrsClientResponseDto, type EsntlAtchFileMngTreeResponseDto, INSTL_SNCN_REGISTER_SELECTION_KEY, - type InstlSncnApplySaveRequestDto, - type InstlSncnBizCstSaveRequestDto, - type InstlSncnBzScaleSaveDto, - type InstlSncnCklstResultSaveDto, - type InstlSncnEsntlAtchFileSaveDto, type InstlSncnMngDetResponse, type InstlSncnMngResponseDto, - type InstlSncnMngSaveRequestDto, type InstlSncnMngSearchParams, type InstlSncnRvwOpnnResponseDto, - type InstlSncnRvwOpnnSaveRequestDto, type InstlSncnSplmntDmndResponseDto, - type InstlSncnSplmntDmndSaveDto, type ReviewStepCode, } from "./model/instl-sncn-interface"; +export type { + InstlSncnApplySaveRequestDto, + InstlSncnBizCstSaveRequestDto, + InstlSncnBzScaleSaveDto, + InstlSncnCklstResultSaveDto, + InstlSncnEsntlAtchFileSaveDto, + InstlSncnMngSaveRequestDto, + InstlSncnRvwOpnnSaveRequestDto, + InstlSncnSplmntDmndSaveDto, +} from "./model/instl-sncn-apply-payload-schema"; +export { + instlSncnApplySaveSchema, + instlSncnBizCstItemSchema, + instlSncnBzScaleItemSchema, + instlSncnCklstResultItemSchema, + instlSncnEsntlAtchFileItemSchema, + instlSncnMngSaveSchema, + instlSncnRvwOpnnSaveSchema, + instlSncnSplmntDmndItemSchema, +} from "./model/instl-sncn-apply-payload-schema"; 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 new file mode 100644 index 000000000..8e6e17616 --- /dev/null +++ b/apps/as/src/entities/instl-sncn/model/instl-sncn-apply-payload-schema.ts @@ -0,0 +1,108 @@ +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(), +}); + +/** 백엔드 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(), +}); + +/** 백엔드 InstlSncnApplySaveRequestDto.BizCstItem */ +export const instlSncnBizCstItemSchema = z.object({ + acntgSeCd: z.string().optional(), + bscPlanAmt: z.number().optional(), + bgtRfltAmt: z.number().optional(), + tstmDesignAmt: z.number().optional(), +}); + +/** 백엔드 InstlSncnApplySaveRequestDto.CklstResultItem */ +export const instlSncnCklstResultItemSchema = z.object({ + cklstRvwSn: z.number().optional(), + cklstArtclSn: z.number().optional(), + cklstSn: z.number().optional(), + rvwStpComCd: z.string().nullish(), + selected: z.enum(["Y", "N"]).nullish(), + picRvwCn: z.string().nullish(), +}); + +/** 백엔드 InstlSncnApplySaveRequestDto.EsntlAtchFileItem */ +export const instlSncnEsntlAtchFileItemSchema = z.object({ + esntlAtchFileId: z.string().optional(), + atchFileGroupId: z.string().optional(), +}); + +/** 백엔드 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(), +}); + +/** 백엔드 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(), +}); + +/** 백엔드 InstlSncnApplySaveRequestDto */ +export const instlSncnApplySaveSchema = z.object({ + techReViewSaveCd: z.string().optional(), + rvwStpCd: z.string().optional(), + 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(), +}); + +export type InstlSncnMngSaveRequestDto = z.infer; +export type InstlSncnBzScaleSaveDto = z.infer; +export type InstlSncnBizCstSaveRequestDto = z.infer; +export type InstlSncnCklstResultSaveDto = z.infer; +export type InstlSncnEsntlAtchFileSaveDto = z.infer; +export type InstlSncnRvwOpnnSaveRequestDto = z.infer; +export type InstlSncnSplmntDmndSaveDto = z.infer; +export type InstlSncnApplySaveRequestDto = z.infer; diff --git a/apps/as/src/entities/instl-sncn/model/instl-sncn-interface.ts b/apps/as/src/entities/instl-sncn/model/instl-sncn-interface.ts index a5e4ce791..1eea8c4c9 100644 --- a/apps/as/src/entities/instl-sncn/model/instl-sncn-interface.ts +++ b/apps/as/src/entities/instl-sncn/model/instl-sncn-interface.ts @@ -1,24 +1,24 @@ import type { AtflMngClientResponseDto, - BizCstSaveBase, BizCstTreeDto, BizSclTreeDto, - BzScaleSaveBase, - CklstResultSaveBase, DocPrgrsUpdateRequestDto, ElaprDocPrgrsClientResponseDto, EsntlAtchFileMngTreeResponseDto, - EsntlAtchFileSaveBase, PageableParams, PageResponse, - PbadmsApplySaveHeader, PbadmsMngDetResponseBase, RvwOpnnResponseExtension, - RvwOpnnSaveBase, SplmntDmndResponseExtension, - SplmntDmndSaveBase, } from "@/shared/model"; +import type { + InstlSncnApplySaveRequestDto, + InstlSncnMngSaveRequestDto, + InstlSncnRvwOpnnSaveRequestDto, + InstlSncnSplmntDmndSaveDto, +} from "./instl-sncn-apply-payload-schema"; + export type { AtflMngClientResponseDto, BizCstTreeDto, @@ -41,189 +41,48 @@ export const INSTL_SNCN_REGISTER_SELECTION_KEY = "instlSncnRegisterSelection"; /** 백엔드 InstlSncnMngSearchDto + Pageable */ export interface InstlSncnMngSearchParams extends PageableParams { - /** 설치인가문서번호 */ instlSncnDocNo?: string; - /** 행정구역코드 */ admdstCd?: string; - /** 환경청구분공통코드 */ envoSeComCd?: string; - /** 업무구분공통코드 */ taskSeComCd?: string; - /** 예산사업코드 */ bgtBizCd?: string; - /** 예산신청연도 */ bgtAplyYr?: string; - /** 사업명 */ bizNm?: string; - /** 사업시작연도 */ bizBgngYr?: string; - /** 사업종료연도 */ bizEndYr?: string; - /** 사업내용 */ bizCn?: string; - /** 신청자명 */ aplcntNm?: string; - /** 신청자휴대전화번호 */ aplcntMblTelno?: string; - /** 신청자소속명 */ aplcntOgdpNm?: string; - /** 신청자이메일주소 */ aplcntEmlAddr?: string; - /** 설계자명 */ dsgnrNm?: string; - /** 설계자전화번호 */ dsgnrTelno?: string; - /** 설계자소속명 */ dsgnrOgdpNm?: string; - /** 설계자이메일주소 */ dsgnrEmlAddr?: string; - /** 첨부파일그룹아이디 */ atchFileGroupId?: string; - /** 진행상태공통코드 */ prgrsSttsComCd?: string; } -/** 설치인가관리 저장 요청 DTO */ -export interface InstlSncnMngSaveRequestDto { - /** 설치인가문서번호 */ - instlSncnDocNo?: string; - /** 행정구역코드 */ - admdstCd?: string; - /** 환경청구분공통코드 */ - envoSeComCd?: string; - /** 인가구분공통코드 */ - sncnSeComCd: string; - /** 업무구분공통코드 */ - taskSeComCd: string; - /** 예산사업코드 */ - bgtBizCd?: string; - /** 예산신청연도 */ - bgtAplyYr?: string; - /** 사업명 */ - bizNm: string; - /** 사업시작연도 */ - bizBgngYr: string; - /** 사업종료연도 */ - bizEndYr: string; - /** 사업내용 */ - bizCn: string; - /** 신청자명 */ - aplcntNm?: string; - /** 신청자휴대전화번호 */ - aplcntMblTelno?: string; - /** 신청자소속명 */ - aplcntOgdpNm?: string; - /** 신청자이메일주소 */ - aplcntEmlAddr?: string; - /** 설계자명 */ - dsgnrNm: string; - /** 설계자전화번호 */ - dsgnrTelno: string; - /** 설계자소속명 */ - dsgnrOgdpNm: string; - /** 설계자이메일주소 */ - dsgnrEmlAddr: string; - /** 첨부파일그룹아이디 */ - atchFileGroupId?: string; - /** 진행상태공통코드 */ - prgrsSttsComCd?: string; - /** 재이용시설구분공통코드 */ - rtlztnFcltSeComCd?: string; - /** 재이용용도구분공통코드 */ - rtlztnUsgSeComCd?: string; -} - -/** 설치인가관리 수정 요청 DTO */ +/** 백엔드 InstlSncnMngUpdateRequestDto */ export type InstlSncnMngUpdateRequestDto = InstlSncnMngSaveRequestDto; -/** 설치인가관리 응답 DTO */ -export interface InstlSncnMngResponseDto extends InstlSncnMngSaveRequestDto { - /** 설치인가문서번호 (필수로 재정의) */ +/** 백엔드 InstlSncnMngResponseDto */ +export type InstlSncnMngResponseDto = InstlSncnMngSaveRequestDto & { instlSncnDocNo: string; - /** 환경청구분공통코드명 */ envoSeCdNm: string; - /** 인가구분공통코드명 */ sncnSeCdNm: string; - /** 업무구분공통코드명 */ taskSeCdNm: string; - /** 진행상태공통코드명 */ prgrsSttsCdNm: string; - /** 기술검토회신이력여부 */ techRplyHstryYn: "Y" | "N"; - /** 재이용시설구분공통코드명 */ rtlztnFcltSeComNm: string; - /** 재이용용도구분공통코드명 */ rtlztnUsgSeComNm: string; - /** 등록일시 */ regDt: string; - /** 등록자 UUID */ rgtr: string; - /** 등록자명 */ rgtrNm: string; - /** 수정 일시 */ mdfcnDt: string; - /** 시도 */ sido: string; - /** 구군 */ gugun: string; -} - -/** 설치인가 신청 - 사업규모 저장 DTO(배열 원소) */ -export interface InstlSncnBzScaleSaveDto extends BzScaleSaveBase { - /** 공종구분코드 */ - cnstpSeCd: string; - /** 기본계획수량 */ - bscPl: number; - /** 예산반영수량 */ - budgetReflct: number; - /** 금회설계수량 */ - thtiDsgn: number; - /** 증감(C-B) — 클라이언트 계산용, API 미전송 */ - diff?: number; -} - -/** 설치인가 신청 - 총사업비 저장 DTO(배열 원소) */ -export interface InstlSncnBizCstSaveRequestDto extends BizCstSaveBase { - /** 회계구분코드 */ - acntgSeCd: string; - /** 기본계획금액 */ - bscPlanAmt: number; - /** 예산반영금액 */ - bgtRfltAmt: number; - /** 금회설계금액 */ - tstmDesignAmt: number; -} - -/** 설치인가 신청 - 체크리스트 결과 저장 DTO(배열 원소) */ -export interface InstlSncnCklstResultSaveDto extends CklstResultSaveBase { - /** 점검표일련번호 */ - cklstSn: number; - /** 점검표항목일련번호 */ - cklstArtclSn: number; - /** 점검표검토일련번호 */ - cklstRvwSn: number; - /** 선택값(Y/N/null) */ - selected: "Y" | "N" | null; - /** 담당자검토내용(기술검토의견) */ - picRvwCn?: string | null; -} - -/** 설치인가 신청 - 필수첨부파일 저장 DTO(배열 원소) */ -export interface InstlSncnEsntlAtchFileSaveDto extends EsntlAtchFileSaveBase { - /** 필수첨부파일아이디 */ - esntlAtchFileId: string; - /** 첨부파일그룹아이디 */ - atchFileGroupId: string; -} - -/** 설치인가검토의견 저장 요청 DTO */ -export interface InstlSncnRvwOpnnSaveRequestDto extends RvwOpnnSaveBase { - /** 설치인가문서번호 */ - instlSncnDocNo: string; -} - -/** 설치인가 보완요구 저장 DTO(배열 원소) */ -export type InstlSncnSplmntDmndSaveDto = SplmntDmndSaveBase; +}; /** 설치인가 보완요구 응답 DTO */ export type InstlSncnSplmntDmndResponseDto = InstlSncnSplmntDmndSaveDto & @@ -231,26 +90,6 @@ export type InstlSncnSplmntDmndResponseDto = InstlSncnSplmntDmndSaveDto & instlSncnDocNo?: string; }; -/** 설치인가 신청 - 통합 저장 요청 DTO */ -export interface InstlSncnApplySaveRequestDto extends PbadmsApplySaveHeader { - /** 설치인가관리 정보 */ - instlSncnMng: InstlSncnMngSaveRequestDto; - /** 사업규모 목록 */ - bzScaleList?: InstlSncnBzScaleSaveDto[]; - /** 총사업비 목록 */ - bizCstList?: InstlSncnBizCstSaveRequestDto[]; - /** 체크리스트 검토결과 목록 */ - cklstResultList?: InstlSncnCklstResultSaveDto[]; - /** 체크리스트 검토결과 맵 (rvwStpComCd -> 목록) */ - cklstResultMap?: Record; - /** 필수첨부파일 목록 */ - esntlAtchFileList?: InstlSncnEsntlAtchFileSaveDto[]; - /** 검토의견 목록 */ - rvwOpnnList?: InstlSncnRvwOpnnSaveRequestDto[]; - /** 보완요구 목록 */ - splmntDmndList?: InstlSncnSplmntDmndSaveDto[]; -} - export type ReviewStepCode = "LOCAL" | "ENV" | "KECO"; /** 설치인가검토의견 응답 DTO */ 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 2980cfffb..6ad7af1ba 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 @@ -47,7 +47,7 @@ export const sewerBscPlanCklstResultItemSchema = z.object({ cklstArtclSn: z.number().optional(), cklstSn: z.number().optional(), rvwStpComCd: z.string(), - selected: z.string().optional(), + selected: z.enum(["Y", "N"]).nullish(), picRvwCn: z.string().nullish(), }); 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 3eecde578..9cbcdc270 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 @@ -1,7 +1,13 @@ import { z } from "zod"; +import { + designCnstnBzScaleItemSchema, + designCnstnEsntlAtchFileItemSchema, + designCnstnMngSaveSchema, +} from "@/entities/design-cnstn"; + export const designCnstnRegistSchema = z.object({ - designCnstnMng: z.object({ + designCnstnMng: designCnstnMngSaveSchema.extend({ bizNm: z.string().min(1, "사업명은 필수입니다"), bizBgngYr: z.string().min(1, "사업시작연도는 필수입니다"), bizEndYr: z.string().min(1, "사업종료연도는 필수입니다"), @@ -17,27 +23,11 @@ export const designCnstnRegistSchema = z.object({ .string() .min(1, "설계자 이메일은 필수입니다") .email("올바른 이메일 형식이 아닙니다"), - aplcntNm: z.string().optional(), - aplcntMblTelno: z.string().optional(), - aplcntOgdpNm: z.string().optional(), - aplcntEmlAddr: z.string().optional(), - designCnstnDocNo: z.string().optional(), - admdstCd: z.string().optional(), - envoSeComCd: z.string().optional(), - prgrsSttsComCd: z.string().optional(), - atchFileGroupId: z.string().optional(), - envoSeCdNm: z.string().optional(), - taskSeCdNm: z.string().optional(), - prgrsSttsCdNm: z.string().optional(), sido: z.string().optional(), gugun: z.string().optional(), - regDt: z.string().optional(), - rgtr: z.string().optional(), - rgtrNm: z.string().optional(), - mdfcnDt: z.string().optional(), }), bzScaleList: z.array( - z.object({ + designCnstnBzScaleItemSchema.extend({ cnstpSeCd: z.string(), bscPl: z.number(), budgetReflct: z.number(), @@ -46,7 +36,7 @@ export const designCnstnRegistSchema = z.object({ }), ), esntlAtchFileList: z.array( - z.object({ + designCnstnEsntlAtchFileItemSchema.extend({ esntlAtchFileId: z.string(), atchFileGroupId: z.string(), }), diff --git a/apps/as/src/pages/design-cnstn/lib/form-data-mapper.ts b/apps/as/src/pages/design-cnstn/lib/form-data-mapper.ts index 3150bfaa7..326f6e237 100644 --- a/apps/as/src/pages/design-cnstn/lib/form-data-mapper.ts +++ b/apps/as/src/pages/design-cnstn/lib/form-data-mapper.ts @@ -1,9 +1,13 @@ import type { IUserInfo } from "@/shared/store"; -import type { DesignCnstnMngDetResponseDto } from "@/entities/design-cnstn"; +import { + type DesignCnstnApplySaveRequestDto, + designCnstnApplySaveSchema, + type DesignCnstnMngDetResponseDto, +} from "@/entities/design-cnstn"; import { toEsntlAtchFileSaveList } from "@/widgets/pbadms-sprt"; import type { DesignCnstnRegistFormData } from "./design-cnstn-regist-schema"; -import { parseTaskSeComCdFromApi } from "./design-cnstn-regist-schema"; +import { formatTaskSeComCdForApi, parseTaskSeComCdFromApi } from "./design-cnstn-regist-schema"; export function mapDetailToFormData(data: DesignCnstnMngDetResponseDto): DesignCnstnRegistFormData { const detDto = data.detDto; @@ -33,15 +37,8 @@ export function mapDetailToFormData(data: DesignCnstnMngDetResponseDto): DesignC envoSeComCd: detDto.envoSeComCd, prgrsSttsComCd: detDto.prgrsSttsComCd, atchFileGroupId: detDto.atchFileGroupId ?? "", - envoSeCdNm: detDto.envoSeCdNm, - taskSeCdNm: detDto.taskSeCdNm, - prgrsSttsCdNm: detDto.prgrsSttsCdNm, sido: detDto.sido, gugun: detDto.gugun, - regDt: detDto.regDt, - rgtr: detDto.rgtr, - rgtrNm: detDto.rgtrNm, - mdfcnDt: detDto.mdfcnDt, }, bzScaleList: bizSclList.map((item) => ({ cnstpSeCd: item.cnstpSeCd, @@ -90,3 +87,20 @@ export function getCreateDefaultValues( privacyConsent: "N", }; } + +export function buildFormPayload( + data: DesignCnstnRegistFormData, + prgrsSttsComCd: "CV" | "CT", + options: { isEditMode: boolean; docNo?: string }, +): DesignCnstnApplySaveRequestDto { + return designCnstnApplySaveSchema.parse({ + designCnstnMng: { + ...data.designCnstnMng, + taskSeComCd: formatTaskSeComCdForApi(data.designCnstnMng.taskSeComCd), + designCnstnDocNo: options.isEditMode ? options.docNo : undefined, + prgrsSttsComCd, + }, + bzScaleList: data.bzScaleList, + esntlAtchFileList: data.esntlAtchFileList, + }); +} diff --git a/apps/as/src/pages/design-cnstn/lib/save-payload-utils.ts b/apps/as/src/pages/design-cnstn/lib/save-payload-utils.ts index 48da7a731..625ff0486 100644 --- a/apps/as/src/pages/design-cnstn/lib/save-payload-utils.ts +++ b/apps/as/src/pages/design-cnstn/lib/save-payload-utils.ts @@ -4,6 +4,7 @@ import type { DesignCnstnApplySaveRequestDto, DesignCnstnMngDetResponseDto, } from "@/entities/design-cnstn"; +import { designCnstnApplySaveSchema } from "@/entities/design-cnstn"; import { toEsntlAtchFileSaveList } from "@/widgets/pbadms-sprt"; import type { ReviewStepCode } from "../model/view-types"; @@ -30,11 +31,11 @@ export function buildSavePayload( throw new Error("상세 정보(detDto)가 없습니다."); } - return { + return designCnstnApplySaveSchema.parse({ designCnstnMng: { ...detDto, prgrsSttsComCd }, bzScaleList: toBzScaleSaveDto(data.bizSclList ?? []), esntlAtchFileList: toEsntlAtchFileSaveList(data.esntlFileList), - }; + }); } export function buildTechReviewPayload( @@ -45,10 +46,10 @@ export function buildTechReviewPayload( reviewOpinionFormData?: ReviewOpinionGetFormDataResult | null, opnrNm?: string, ): DesignCnstnApplySaveRequestDto { - return { + return designCnstnApplySaveSchema.parse({ ...buildSavePayload(data, prgrsSttsComCd), techReViewSaveCd, rvwStpCd: reviewStep, rvwOpnnList: toRvwOpnnSaveDto(data, reviewOpinionFormData, opnrNm), - }; + }); } diff --git a/apps/as/src/pages/design-cnstn/ui/design-form-page.tsx b/apps/as/src/pages/design-cnstn/ui/design-form-page.tsx index 041e1d812..7e0519db1 100644 --- a/apps/as/src/pages/design-cnstn/ui/design-form-page.tsx +++ b/apps/as/src/pages/design-cnstn/ui/design-form-page.tsx @@ -11,7 +11,6 @@ import { useQueryClient } from "@tanstack/react-query"; import { useAlertStore, useUserStore } from "@/shared/lib"; import { SectionCollapsibleGroup, SectionCollapsibleToggle } from "@/shared/ui"; import { - type DesignCnstnApplySaveRequestDto, designCnstnKeys, type DesignCnstnMngDetResponseDto, designCnstnMngService, @@ -27,12 +26,12 @@ import { } from "@/widgets/pbadms-sprt"; import { Button } from "@common/components"; +import { type DesignCnstnRegistFormData, designCnstnRegistSchema } from "../lib/design-cnstn-regist-schema"; import { - type DesignCnstnRegistFormData, - designCnstnRegistSchema, - formatTaskSeComCdForApi, -} from "../lib/design-cnstn-regist-schema"; -import { getCreateDefaultValues, mapDetailToFormData } from "../lib/form-data-mapper"; + buildFormPayload, + getCreateDefaultValues, + mapDetailToFormData, +} from "../lib/form-data-mapper"; import { PROGRESS_STATUS_COLUMNS } from "../model/columns"; import { BasicInfoFormSection } from "./sections/basic-info-form-section"; @@ -68,29 +67,18 @@ function DesignFormPage({ mode, initialData, createDefaults }: DesignFormPagePro : getCreateDefaultValues(userInfo, createDefaults), }); - function buildFormPayload( - data: DesignCnstnRegistFormData, - prgrsSttsComCd: "CV" | "CT", - ): DesignCnstnApplySaveRequestDto { - const { taskSeComCd: formTaskSeComCd, ...designCnstnMngRest } = data.designCnstnMng; - - return { - designCnstnMng: { - ...designCnstnMngRest, - taskSeComCd: formatTaskSeComCdForApi(formTaskSeComCd), - designCnstnDocNo: isEditMode ? initialData?.detDto?.designCnstnDocNo : undefined, - prgrsSttsComCd, - }, - bzScaleList: data.bzScaleList, - esntlAtchFileList: data.esntlAtchFileList, - }; + function createFormPayload(data: DesignCnstnRegistFormData, prgrsSttsComCd: "CV" | "CT") { + return buildFormPayload(data, prgrsSttsComCd, { + isEditMode, + docNo: initialData?.detDto?.designCnstnDocNo, + }); } async function submitForm( data: DesignCnstnRegistFormData, prgrsSttsComCd: "CV" | "CT", ): Promise { - return designCnstnMngService.saveApply(buildFormPayload(data, prgrsSttsComCd)); + return designCnstnMngService.saveApply(createFormPayload(data, prgrsSttsComCd)); } async function onSave(data: DesignCnstnRegistFormData) { 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 21668e8b8..5739c8e6e 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 @@ -1,14 +1,22 @@ import { z } from "zod"; +import { + fnrsCnsltnBizCstItemSchema, + fnrsCnsltnBzScaleItemSchema, + fnrsCnsltnCklstResultItemSchema, + fnrsCnsltnEsntlAtchFileItemSchema, + fnrsCnsltnMngSaveSchema, + fnrsCnsltnSplmntDmndItemSchema, + fnrsSharItemSchema, +} from "@/entities/fnrs-cnsltn"; + export const fnrsCnsltnRegistSchema = z.object({ - fnrsCnsltnMng: z.object({ + fnrsCnsltnMng: fnrsCnsltnMngSaveSchema.extend({ bizNm: z.string().min(1, "사업명은 필수입니다"), bizBgngYr: z.string().min(1, "사업시작연도는 필수입니다"), bizEndYr: z.string().min(1, "사업종료연도는 필수입니다"), bizCn: z.string().min(1, "사업내용은 필수입니다"), taskSeComCd: z.array(z.string()).min(1, "구분은 필수입니다"), - cfmtnBgtBizNo: z.string().optional(), - bgtAplyYr: z.string().optional(), dsgnrNm: z.string().min(1, "설계자 이름은 필수입니다"), dsgnrTelno: z .string() @@ -19,30 +27,11 @@ export const fnrsCnsltnRegistSchema = z.object({ .string() .min(1, "설계자 이메일은 필수입니다") .email("올바른 이메일 형식이 아닙니다"), - aplcntNm: z.string().optional(), - aplcntMblTelno: z.string().optional(), - aplcntOgdpNm: z.string().optional(), - aplcntEmlAddr: z.string().optional(), - fnrsCnsltnDocNo: z.string().optional(), - admdstCd: z.string().optional(), - envoSeComCd: z.string().optional(), - rtlztnFcltSeComCd: z.string().optional(), - rtlztnUsgSeComCd: z.string().optional(), - prgrsSttsComCd: z.string().optional(), - atchFileGroupId: z.string().optional(), - sharAtchFileGroupId: z.string().optional(), - envoSeCdNm: z.string().optional(), - taskSeCdNm: z.string().optional(), - prgrsSttsCdNm: z.string().optional(), sido: z.string().optional(), gugun: z.string().optional(), - regDt: z.string().optional(), - rgtr: z.string().optional(), - rgtrNm: z.string().optional(), - mdfcnDt: z.string().optional(), }), bzScaleList: z.array( - z.object({ + fnrsCnsltnBzScaleItemSchema.extend({ cnstpSeCd: z.string(), bscPl: z.number(), budgetReflct: z.number(), @@ -51,7 +40,7 @@ export const fnrsCnsltnRegistSchema = z.object({ }), ), bizCstList: z.array( - z.object({ + fnrsCnsltnBizCstItemSchema.extend({ acntgSeCd: z.string(), bscPlanAmt: z.number(), bgtRfltAmt: z.number(), @@ -59,7 +48,7 @@ export const fnrsCnsltnRegistSchema = z.object({ }), ), fnrsSharList: z.array( - z.object({ + fnrsSharItemSchema.extend({ fnrsSharSeCd: z.string(), exstnAmt: z.number(), chgRqtAmt: z.number(), @@ -68,37 +57,24 @@ export const fnrsCnsltnRegistSchema = z.object({ }), ), cklstResultList: z.array( - z.object({ + fnrsCnsltnCklstResultItemSchema.extend({ cklstSn: z.number(), cklstArtclSn: z.number(), cklstRvwSn: z.number(), - rvwStpComCd: z.string().nullish(), - selected: z.enum(["Y", "N"]).nullable(), + selected: z.enum(["Y", "N"]).nullish(), picRvwCn: z.string().nullish(), }), ), esntlAtchFileList: z.array( - z.object({ + fnrsCnsltnEsntlAtchFileItemSchema.extend({ esntlAtchFileId: z.string(), atchFileGroupId: z.string(), }), ), splmntDmndList: z.array( - z.object({ - splmntDmndSn: z.number().nullish(), - splmntArtclComCd: z.string().nullish(), + fnrsCnsltnSplmntDmndItemSchema.extend({ splmntArtclCdNm: z.string().nullish(), - splmntDmndCn: z.string().optional(), - splmntDmndDt: z.string().optional(), - splmntDmndAtchFileGroupId: z.string().optional(), splmntDmndAtchFileNm: z.string().optional(), - splmntCn: z.string().optional(), - splmntPicNm: z.string().optional(), - splmntCmptnDt: z.string().optional(), - splmntAtchFileGroupId: z.string().optional(), - splmntAtchFileNm: z.string().optional(), - splmntAtchFileAtflId: z.string().optional(), - cmptnYn: z.string().optional(), }), ), privacyConsent: z.enum(["Y", "N"], { diff --git a/apps/as/src/pages/fnrs-cnsltn/lib/form-data-mapper.ts b/apps/as/src/pages/fnrs-cnsltn/lib/form-data-mapper.ts index 09e4817f5..1e5c6902d 100644 --- a/apps/as/src/pages/fnrs-cnsltn/lib/form-data-mapper.ts +++ b/apps/as/src/pages/fnrs-cnsltn/lib/form-data-mapper.ts @@ -1,9 +1,21 @@ import type { IUserInfo } from "@/shared/store"; -import type { FnrsCnsltnMngDetResponseDto } from "@/entities/fnrs-cnsltn"; -import { mapFnrsSharDetToFormList, toEsntlAtchFileSaveList } from "@/widgets/pbadms-sprt"; +import { + type FnrsCnsltnApplySaveRequestDto, + fnrsCnsltnApplySaveSchema, + type FnrsCnsltnMngDetResponseDto, +} from "@/entities/fnrs-cnsltn"; +import { + type CostItemDef, + type FnrsSharItemDef, + mapFnrsSharDetToFormList, + recalculateFnrsSharTotals, + toEsntlAtchFileSaveList, + toFnrsSharSaveList, + validateBizCstSharBalance, +} from "@/widgets/pbadms-sprt"; import type { FnrsCnsltnRegistFormData } from "./fnrs-cnsltn-regist-schema"; -import { parseTaskSeComCdFromApi } from "./fnrs-cnsltn-regist-schema"; +import { formatTaskSeComCdForApi, parseTaskSeComCdFromApi } from "./fnrs-cnsltn-regist-schema"; function mapSelectedValue(value?: string | null): "Y" | "N" | null { if (value === "Y" || value === "N") return value; @@ -47,15 +59,8 @@ export function mapDetailToFormData(data: FnrsCnsltnMngDetResponseDto): FnrsCnsl prgrsSttsComCd: detDto.prgrsSttsComCd, atchFileGroupId: detDto.atchFileGroupId ?? "", sharAtchFileGroupId: detDto.sharAtchFileGroupId ?? "", - envoSeCdNm: detDto.envoSeCdNm, - taskSeCdNm: detDto.taskSeCdNm, - prgrsSttsCdNm: detDto.prgrsSttsCdNm, sido: detDto.sido, gugun: detDto.gugun, - regDt: detDto.regDt, - rgtr: detDto.rgtr, - rgtrNm: detDto.rgtrNm, - mdfcnDt: detDto.mdfcnDt, }, bzScaleList: bizSclList.map((item) => ({ cnstpSeCd: item.cnstpSeCd, @@ -94,8 +99,6 @@ export function mapDetailToFormData(data: FnrsCnsltnMngDetResponseDto): FnrsCnsl splmntPicNm: item.splmntPicNm ?? "", splmntCmptnDt: item.splmntCmptnDt ?? "", splmntAtchFileGroupId: item.splmntAtchFileGroupId ?? "", - splmntAtchFileNm: item.splmntAtchFileInfo?.orgnlFileNm ?? "", - splmntAtchFileAtflId: item.splmntAtchFileInfo?.atflId ?? "", cmptnYn: item.cmptnYn, })) ?? [], privacyConsent: "Y", @@ -146,3 +149,46 @@ export function getCreateDefaultValues( privacyConsent: "N", }; } + +export function buildFormPayload( + data: FnrsCnsltnRegistFormData, + prgrsSttsComCd: string, + options: { + isEditMode: boolean; + docNo?: string; + sharItems: FnrsSharItemDef[]; + costItems: CostItemDef[]; + }, +): FnrsCnsltnApplySaveRequestDto | { validationMessage: string } { + const withTotals = recalculateFnrsSharTotals(data.fnrsSharList, options.sharItems); + const validationMessage = validateBizCstSharBalance( + data.bizCstList, + withTotals, + options.sharItems, + options.costItems, + ); + if (validationMessage) { + return { validationMessage }; + } + + return fnrsCnsltnApplySaveSchema.parse({ + fnrsCnsltnMng: { + ...data.fnrsCnsltnMng, + taskSeComCd: formatTaskSeComCdForApi(data.fnrsCnsltnMng.taskSeComCd), + fnrsCnsltnDocNo: options.isEditMode ? options.docNo : undefined, + prgrsSttsComCd, + }, + bzScaleList: data.bzScaleList, + bizCstList: data.bizCstList, + fnrsSharList: toFnrsSharSaveList(withTotals), + cklstResultList: data.cklstResultList.map((item) => ({ + ...item, + selected: item.selected ?? undefined, + })), + esntlAtchFileList: data.esntlAtchFileList, + splmntDmndList: data.splmntDmndList.map((item) => ({ + ...item, + ...(prgrsSttsComCd !== "SV" && prgrsSttsComCd !== "ST" && { cmptnYn: "Y" }), + })), + }); +} diff --git a/apps/as/src/pages/fnrs-cnsltn/lib/save-payload-utils.ts b/apps/as/src/pages/fnrs-cnsltn/lib/save-payload-utils.ts index 39ebd7582..c4d7d5d88 100644 --- a/apps/as/src/pages/fnrs-cnsltn/lib/save-payload-utils.ts +++ b/apps/as/src/pages/fnrs-cnsltn/lib/save-payload-utils.ts @@ -10,6 +10,7 @@ import type { FnrsCnsltnMngResponseDto, FnrsCnsltnSplmntDmndItem, } from "@/entities/fnrs-cnsltn"; +import { fnrsCnsltnApplySaveSchema } from "@/entities/fnrs-cnsltn"; import type { PwrkCnsltnCnsltnResponseDto } from "@/entities/pwrk-cnsltn-mng"; import { mapFnrsSharDetToFormList, @@ -61,14 +62,14 @@ export function buildSavePayload( const cklstResultList = data.cklstResultList ?? []; const esntlFileList = data.esntlFileList ?? []; - return { + return fnrsCnsltnApplySaveSchema.parse({ fnrsCnsltnMng: { ...detDto, prgrsSttsComCd }, bzScaleList: toBzScaleSaveDto(bizSclList), bizCstList: toBizCstSaveDto(bizCstList), cklstResultList: toCklstSaveDto(cklstResultList, checklistFormState, reviewStep), esntlAtchFileList: toEsntlAtchFileSaveList(esntlFileList), fnrsSharList: toFnrsSharSaveList(mapFnrsSharDetToFormList(data.fnrsSharList ?? [])), - }; + }); } export function buildTechReviewReplyPayload( @@ -80,12 +81,12 @@ export function buildTechReviewReplyPayload( reviewOpinionFormData?: ReviewOpinionGetFormDataResult | null, opnrNm?: string, ): FnrsCnsltnApplySaveRequestDto { - return { + return fnrsCnsltnApplySaveSchema.parse({ ...buildSavePayload(data, checklistFormState, reviewStep, prgrsSttsComCd), techReViewSaveCd, rvwStpCd: reviewStep, rvwOpnnList: toRvwOpnnSaveDto(data, reviewOpinionFormData, opnrNm), - }; + }); } export function buildSupplementReqPayload( @@ -107,10 +108,10 @@ export function buildSupplementReqPayload( cmptnYn: "N", })); - return { + return fnrsCnsltnApplySaveSchema.parse({ ...buildSavePayload(data, checklistFormState, "LOCAL", "SL"), splmntDmndList: [...existingItems, ...newItems], - }; + }); } export function buildFileSplmntReqPayload( @@ -124,10 +125,10 @@ export function buildFileSplmntReqPayload( cmptnYn: "N", })); - return { + return fnrsCnsltnApplySaveSchema.parse({ ...buildSavePayload(data, checklistFormState, "LOCAL", "SL"), splmntDmndList: [...newItems], - }; + }); } export function buildRvwRsltSplmntReqPayload( @@ -144,10 +145,10 @@ export function buildRvwRsltSplmntReqPayload( cmptnYn: "N", })); - return { + return fnrsCnsltnApplySaveSchema.parse({ ...buildSavePayload(data, checklistFormState, "LOCAL", "SL"), splmntDmndList: [...existingItems, ...newItems], - }; + }); } export function toSplmntDmndSaveItem(item: FnrsCnsltnSplmntDmndItem): FnrsCnsltnSplmntDmndItem { @@ -169,21 +170,21 @@ export function buildSupplementSubmitPayload( data: FnrsCnsltnMngDetResponseDto, checklistFormState: ChecklistFormState, ): FnrsCnsltnApplySaveRequestDto { - return { + return fnrsCnsltnApplySaveSchema.parse({ ...buildSavePayload(data, checklistFormState, "LOCAL", "SL"), - splmntDmndList: data.splmntDmndList, - }; + splmntDmndList: (data.splmntDmndList ?? []).map(toSplmntDmndSaveItem), + }); } export function buildTechReviewPayload( det: FnrsCnsltnMngResponseDto, cklstResultList: CklstResultItem[], ): FnrsCnsltnApplySaveRequestDto { - return { + return fnrsCnsltnApplySaveSchema.parse({ fnrsCnsltnMng: { ...det, prgrsSttsComCd: "ER" }, bzScaleList: [], bizCstList: [], cklstResultList, esntlAtchFileList: [], - }; + }); } 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 cac88ea86..28a9a0a51 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 @@ -13,7 +13,6 @@ import { SectionCollapsibleGroup, SectionCollapsibleToggle } from "@/shared/ui"; import { useAcntgSeMngTree } from "@/entities/acntg"; import { useEsntlAtchFileMngTree } from "@/entities/esntl"; import { - type FnrsCnsltnApplySaveRequestDto, fnrsCnsltnKeys, type FnrsCnsltnMngDetResponseDto, fnrsCnsltnMngService, @@ -32,19 +31,16 @@ import { isFormEsntlAtchComplete, PrivacyConsentSection, ProgressStatusSection, - recalculateFnrsSharTotals, SplmntDmndFormSection, - toFnrsSharSaveList, - validateBizCstSharBalance, } from "@/widgets/pbadms-sprt"; import { Button } from "@common/components"; +import { type FnrsCnsltnRegistFormData, fnrsCnsltnRegistSchema } from "../lib/fnrs-cnsltn-regist-schema"; import { - type FnrsCnsltnRegistFormData, - fnrsCnsltnRegistSchema, - formatTaskSeComCdForApi, -} from "../lib/fnrs-cnsltn-regist-schema"; -import { getCreateDefaultValues, mapDetailToFormData } from "../lib/form-data-mapper"; + buildFormPayload, + getCreateDefaultValues, + mapDetailToFormData, +} from "../lib/form-data-mapper"; import { PROGRESS_STATUS_COLUMNS } from "../model/columns"; import { PwrkCnsltnDocMngDialog } from "./components/pwrk-cnsltn-doc-mng-dialog"; @@ -89,54 +85,25 @@ function FnrsFormPage({ mode, initialData, createDefaults }: FnrsFormPageProps) : getCreateDefaultValues(userInfo, createDefaults), }); - function buildFormPayload( - data: FnrsCnsltnRegistFormData, - prgrsSttsComCd: string, - ): FnrsCnsltnApplySaveRequestDto | undefined { - const withTotals = recalculateFnrsSharTotals(data.fnrsSharList, sharItems); - const validationMessage = validateBizCstSharBalance( - data.bizCstList, - withTotals, + function createFormPayload(data: FnrsCnsltnRegistFormData, prgrsSttsComCd: string) { + const result = buildFormPayload(data, prgrsSttsComCd, { + isEditMode, + docNo: initialData?.detDto?.fnrsCnsltnDocNo, sharItems, costItems, - ); - if (validationMessage) { - alert(validationMessage); + }); + if ("validationMessage" in result) { + alert(result.validationMessage); return undefined; } - - const { taskSeComCd: formTaskSeComCd, ...fnrsCnsltnMngRest } = data.fnrsCnsltnMng; - - return { - fnrsCnsltnMng: { - ...fnrsCnsltnMngRest, - taskSeComCd: formatTaskSeComCdForApi(formTaskSeComCd), - fnrsCnsltnDocNo: isEditMode ? initialData?.detDto?.fnrsCnsltnDocNo : undefined, - prgrsSttsComCd, - }, - bzScaleList: data.bzScaleList, - bizCstList: data.bizCstList, - fnrsSharList: toFnrsSharSaveList(withTotals), - cklstResultList: data.cklstResultList.map((item) => ({ - ...item, - selected: item.selected ?? undefined, - })), - esntlAtchFileList: data.esntlAtchFileList, - splmntDmndList: data.splmntDmndList.map( - // eslint-disable-next-line @typescript-eslint/no-unused-vars - ({ splmntAtchFileNm, splmntAtchFileAtflId, splmntDmndAtchFileNm, ...item }) => ({ - ...item, - ...(prgrsSttsComCd !== "SV" && prgrsSttsComCd !== "ST" && { cmptnYn: "Y" }), - }), - ), - }; + return result; } async function submitForm( data: FnrsCnsltnRegistFormData, prgrsSttsComCd: "SV" | "ST", ): Promise { - const payload = buildFormPayload(data, prgrsSttsComCd); + const payload = createFormPayload(data, prgrsSttsComCd); if (!payload) return undefined; return fnrsCnsltnMngService.saveApply(payload); } @@ -146,7 +113,7 @@ function FnrsFormPage({ mode, initialData, createDefaults }: FnrsFormPageProps) if (!beforePrgrsSttsComCd) return undefined; const docNo = initialData?.detDto?.fnrsCnsltnDocNo; - const payload = buildFormPayload(data, beforePrgrsSttsComCd); + const payload = createFormPayload(data, beforePrgrsSttsComCd); if (!docNo || !payload) return undefined; return fnrsCnsltnMngService.submitSupplement(docNo, payload); diff --git a/apps/as/src/pages/instl-sncn/lib/form-data-mapper.ts b/apps/as/src/pages/instl-sncn/lib/form-data-mapper.ts index 4dfdf8685..5a3797918 100644 --- a/apps/as/src/pages/instl-sncn/lib/form-data-mapper.ts +++ b/apps/as/src/pages/instl-sncn/lib/form-data-mapper.ts @@ -1,9 +1,13 @@ import type { IUserInfo } from "@/shared/store/user-store"; -import type { InstlSncnMngDetResponse } from "@/entities/instl-sncn"; +import { + type InstlSncnApplySaveRequestDto, + instlSncnApplySaveSchema, + type InstlSncnMngDetResponse, +} from "@/entities/instl-sncn"; import { toEsntlAtchFileSaveList } from "@/widgets/pbadms-sprt"; import type { InstlSncnRegistFormData } from "./instl-sncn-regist-schema"; -import { parseTaskSeComCdFromApi } from "./instl-sncn-regist-schema"; +import { formatTaskSeComCdForApi, parseTaskSeComCdFromApi } from "./instl-sncn-regist-schema"; function mapSelectedValue(value?: string | null): "Y" | "N" | null { if (value === "Y" || value === "N") return value; @@ -16,12 +20,12 @@ export function mapDetailToFormData(data: InstlSncnMngDetResponse): InstlSncnReg return { instlSncnMng: { instlSncnDocNo: detDto.instlSncnDocNo, - bizNm: detDto.bizNm, - bizBgngYr: detDto.bizBgngYr, - bizEndYr: detDto.bizEndYr, - bizCn: detDto.bizCn, + bizNm: detDto.bizNm ?? "", + bizBgngYr: detDto.bizBgngYr ?? "", + bizEndYr: detDto.bizEndYr ?? "", + bizCn: detDto.bizCn ?? "", taskSeComCd: parseTaskSeComCdFromApi(detDto.taskSeComCd), - sncnSeComCd: detDto.sncnSeComCd, + sncnSeComCd: detDto.sncnSeComCd ?? "", dsgnrNm: detDto.dsgnrNm ?? "", dsgnrTelno: detDto.dsgnrTelno ?? "", dsgnrOgdpNm: detDto.dsgnrOgdpNm ?? "", @@ -38,16 +42,8 @@ export function mapDetailToFormData(data: InstlSncnMngDetResponse): InstlSncnReg atchFileGroupId: detDto.atchFileGroupId ?? "", rtlztnFcltSeComCd: detDto.rtlztnFcltSeComCd ?? "", rtlztnUsgSeComCd: detDto.rtlztnUsgSeComCd ?? "", - envoSeCdNm: detDto.envoSeCdNm, - sncnSeCdNm: detDto.sncnSeCdNm, - taskSeCdNm: detDto.taskSeCdNm, - prgrsSttsCdNm: detDto.prgrsSttsCdNm, sido: detDto.sido, gugun: detDto.gugun, - regDt: detDto.regDt, - rgtr: detDto.rgtr, - rgtrNm: detDto.rgtrNm, - mdfcnDt: detDto.mdfcnDt, }, bzScaleList: bizSclList.map((item) => ({ cnstpSeCd: item.cnstpSeCd, @@ -85,8 +81,6 @@ export function mapDetailToFormData(data: InstlSncnMngDetResponse): InstlSncnReg splmntPicNm: item.splmntPicNm ?? "", splmntCmptnDt: item.splmntCmptnDt ?? "", splmntAtchFileGroupId: item.splmntAtchFileGroupId ?? "", - splmntAtchFileNm: item.splmntAtchFileInfo?.orgnlFileNm ?? "", - splmntAtchFileAtflId: item.splmntAtchFileInfo?.atflId ?? "", cmptnYn: item.cmptnYn, })) ?? [], privacyConsent: "Y", @@ -132,3 +126,29 @@ export function getCreateDefaultValues( privacyConsent: "N", }; } + +export function buildFormPayload( + data: InstlSncnRegistFormData, + prgrsSttsComCd: "SV" | "ST" | "TE", + options: { isEditMode: boolean; docNo?: string }, +): InstlSncnApplySaveRequestDto { + return instlSncnApplySaveSchema.parse({ + instlSncnMng: { + ...data.instlSncnMng, + instlSncnDocNo: options.isEditMode ? options.docNo : undefined, + taskSeComCd: formatTaskSeComCdForApi(data.instlSncnMng.taskSeComCd), + prgrsSttsComCd, + }, + bzScaleList: data.bzScaleList, + bizCstList: data.bizCstList, + cklstResultList: data.cklstResultList.map((item) => ({ + ...item, + selected: item.selected ?? undefined, + })), + esntlAtchFileList: data.esntlAtchFileList, + splmntDmndList: data.splmntDmndList.map((item) => ({ + ...item, + ...(prgrsSttsComCd === "TE" ? { cmptnYn: "Y" } : null), + })), + }); +} 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 755d3df63..befd61c4e 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 @@ -1,7 +1,16 @@ import { z } from "zod"; +import { + instlSncnBizCstItemSchema, + instlSncnBzScaleItemSchema, + instlSncnCklstResultItemSchema, + instlSncnEsntlAtchFileItemSchema, + instlSncnMngSaveSchema, + instlSncnSplmntDmndItemSchema, +} from "@/entities/instl-sncn"; + export const instlSncnRegistSchema = z.object({ - instlSncnMng: z.object({ + instlSncnMng: instlSncnMngSaveSchema.extend({ bizNm: z.string().min(1, "사업명은 필수입니다"), bizBgngYr: z.string().min(1, "사업시작연도는 필수입니다"), bizEndYr: z.string().min(1, "사업종료연도는 필수입니다"), @@ -18,32 +27,13 @@ export const instlSncnRegistSchema = z.object({ .string() .min(1, "설계자 이메일은 필수입니다") .email("올바른 이메일 형식이 아닙니다"), - bgtBizCd: z.string().optional(), - bgtAplyYr: z.string().optional(), - aplcntNm: z.string().optional(), - aplcntMblTelno: z.string().optional(), - aplcntOgdpNm: z.string().optional(), - aplcntEmlAddr: z.string().optional(), instlSncnDocNo: z.string().nullish(), - admdstCd: z.string().optional(), - envoSeComCd: z.string().optional(), prgrsSttsComCd: z.string().nullish(), - atchFileGroupId: z.string().optional(), - rtlztnFcltSeComCd: z.string().optional(), - rtlztnUsgSeComCd: z.string().optional(), - envoSeCdNm: z.string().nullish(), - sncnSeCdNm: z.string().nullish(), - taskSeCdNm: z.string().nullish(), - prgrsSttsCdNm: z.string().nullish(), sido: z.string().nullish(), gugun: z.string().nullish(), - regDt: z.string().nullish(), - rgtr: z.string().nullish(), - rgtrNm: z.string().nullish(), - mdfcnDt: z.string().nullish(), }), bzScaleList: z.array( - z.object({ + instlSncnBzScaleItemSchema.extend({ cnstpSeCd: z.string(), bscPl: z.number(), budgetReflct: z.number(), @@ -52,7 +42,7 @@ export const instlSncnRegistSchema = z.object({ }), ), bizCstList: z.array( - z.object({ + instlSncnBizCstItemSchema.extend({ acntgSeCd: z.string(), bscPlanAmt: z.number(), bgtRfltAmt: z.number(), @@ -60,37 +50,25 @@ export const instlSncnRegistSchema = z.object({ }), ), cklstResultList: z.array( - z.object({ + instlSncnCklstResultItemSchema.extend({ cklstSn: z.number(), cklstArtclSn: z.number(), cklstRvwSn: z.number(), rvwStpComCd: z.string(), - selected: z.enum(["Y", "N"]).nullable(), + selected: z.enum(["Y", "N"]).nullish(), picRvwCn: z.string().nullish(), }), ), esntlAtchFileList: z.array( - z.object({ + instlSncnEsntlAtchFileItemSchema.extend({ esntlAtchFileId: z.string(), atchFileGroupId: z.string(), }), ), splmntDmndList: z.array( - z.object({ - splmntDmndSn: z.number().nullish(), - splmntArtclComCd: z.string().nullish(), + instlSncnSplmntDmndItemSchema.extend({ splmntArtclCdNm: z.string().nullish(), - splmntDmndCn: z.string().optional(), - splmntDmndDt: z.string().optional(), - splmntDmndAtchFileGroupId: z.string().optional(), splmntDmndAtchFileNm: z.string().optional(), - splmntCn: z.string().optional(), - splmntPicNm: z.string().optional(), - splmntCmptnDt: z.string().optional(), - splmntAtchFileGroupId: z.string().optional(), - splmntAtchFileNm: z.string().optional(), - splmntAtchFileAtflId: z.string().optional(), - cmptnYn: z.string().optional(), }), ), 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 f2d647aea..cd810c44b 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 @@ -8,6 +8,7 @@ import type { InstlSncnSplmntDmndSaveDto, ReviewStepCode, } from "@/entities/instl-sncn"; +import { instlSncnApplySaveSchema } from "@/entities/instl-sncn"; import { type SplmntDmndDialogConfirmPayload, toEsntlAtchFileSaveList } from "@/widgets/pbadms-sprt"; import type { ChecklistFormState } from "../model/view-types"; @@ -23,7 +24,6 @@ export function toBzScaleSaveDto(bizSclList: BizSclTreeDto[]): InstlSncnBzScaleS bscPl: node.bscPlanQty, budgetReflct: node.bgtRfltQty, thtiDsgn: node.tstmDesignQty, - diff: node.tstmDesignQty - node.bgtRfltQty, })); } @@ -46,13 +46,13 @@ export function buildSavePayload( ): InstlSncnApplySaveRequestDto { const { detDto, bizSclList, bizCstList, cklstResultList = [], esntlFileList } = data; - return { + return instlSncnApplySaveSchema.parse({ instlSncnMng: { ...detDto, prgrsSttsComCd }, bzScaleList: toBzScaleSaveDto(bizSclList), bizCstList: toBizCstSaveDto(bizCstList), cklstResultList: toCklstSaveDto(cklstResultList, checklistFormState, reviewStep), esntlAtchFileList: toEsntlAtchFileSaveList(esntlFileList), - }; + }); } export function buildTechReviewReplyPayload( @@ -64,12 +64,12 @@ export function buildTechReviewReplyPayload( reviewOpinionFormData?: ReviewOpinionFormData | null, opnrNm?: string, ): InstlSncnApplySaveRequestDto { - return { + return instlSncnApplySaveSchema.parse({ ...buildSavePayload(data, checklistFormState, reviewStep, prgrsSttsComCd), techReViewSaveCd, rvwStpCd: reviewStep, rvwOpnnList: toRvwOpnnSaveDto(data, reviewOpinionFormData, opnrNm), - }; + }); } export function buildSupplementReqPayload( @@ -91,10 +91,10 @@ export function buildSupplementReqPayload( cmptnYn: "N", })); - return { + return instlSncnApplySaveSchema.parse({ ...buildSavePayload(data, checklistFormState, "LOCAL", "SL"), splmntDmndList: [...existingItems, ...newItems], - }; + }); } export function toSplmntDmndSaveItem(item: InstlSncnSplmntDmndSaveDto): InstlSncnSplmntDmndSaveDto { diff --git a/apps/as/src/pages/instl-sncn/ui/instl-form-page.tsx b/apps/as/src/pages/instl-sncn/ui/instl-form-page.tsx index a52c9776d..d8510664f 100644 --- a/apps/as/src/pages/instl-sncn/ui/instl-form-page.tsx +++ b/apps/as/src/pages/instl-sncn/ui/instl-form-page.tsx @@ -12,7 +12,6 @@ import { useAlertStore, useUserStore } from "@/shared/lib"; import { SectionCollapsibleGroup, SectionCollapsibleToggle } from "@/shared/ui"; import { useEsntlAtchFileMngTree } from "@/entities/esntl"; import { - type InstlSncnApplySaveRequestDto, instlSncnKeys, type InstlSncnMngDetResponse, instlSncnService, @@ -31,12 +30,8 @@ import { } from "@/widgets/pbadms-sprt"; import { Button } from "@common/components"; -import { getCreateDefaultValues, mapDetailToFormData } from "../lib/form-data-mapper"; -import { - formatTaskSeComCdForApi, - type InstlSncnRegistFormData, - instlSncnRegistSchema, -} from "../lib/instl-sncn-regist-schema"; +import { buildFormPayload, getCreateDefaultValues, mapDetailToFormData } from "../lib/form-data-mapper"; +import { type InstlSncnRegistFormData, instlSncnRegistSchema } from "../lib/instl-sncn-regist-schema"; import { PROGRESS_STATUS_COLUMNS } from "../model/columns"; import { BasicInfoFormSection } from "./sections/basic-info-form-section"; @@ -72,47 +67,24 @@ function InstlFormPage({ mode, initialData, createDefaults }: InstlFormPageProps : getCreateDefaultValues(userInfo, createDefaults), }); - function buildFormPayload( - data: InstlSncnRegistFormData, - prgrsSttsComCd: "SV" | "ST" | "TE", - ): InstlSncnApplySaveRequestDto { - const { taskSeComCd: formTaskSeComCd, ...instlSncnMngRest } = data.instlSncnMng; - - return { - instlSncnMng: { - ...instlSncnMngRest, - instlSncnDocNo: isEditMode ? initialData?.detDto.instlSncnDocNo : undefined, - taskSeComCd: formatTaskSeComCdForApi(formTaskSeComCd), - prgrsSttsComCd, - }, - bzScaleList: data.bzScaleList, - bizCstList: data.bizCstList, - cklstResultList: data.cklstResultList.map((item) => ({ - ...item, - selected: item.selected, - })), - esntlAtchFileList: data.esntlAtchFileList, - splmntDmndList: data.splmntDmndList.map( - // eslint-disable-next-line @typescript-eslint/no-unused-vars - ({ splmntAtchFileNm, splmntAtchFileAtflId, splmntDmndAtchFileNm, ...item }) => ({ - ...item, - ...(prgrsSttsComCd === "TE" ? { cmptnYn: "Y" } : null), - }), - ), - }; + function createFormPayload(data: InstlSncnRegistFormData, prgrsSttsComCd: "SV" | "ST" | "TE") { + return buildFormPayload(data, prgrsSttsComCd, { + isEditMode, + docNo: initialData?.detDto.instlSncnDocNo, + }); } async function submitForm( data: InstlSncnRegistFormData, prgrsSttsComCd: "SV" | "ST", ): Promise { - return instlSncnService.saveApply(buildFormPayload(data, prgrsSttsComCd)); + return instlSncnService.saveApply(createFormPayload(data, prgrsSttsComCd)); } async function submitSupplementForm(data: InstlSncnRegistFormData): Promise { const docNo = initialData?.detDto.instlSncnDocNo; if (!docNo) return undefined; - return instlSncnService.submitSupplement(docNo, buildFormPayload(data, "TE")); + return instlSncnService.submitSupplement(docNo, createFormPayload(data, "TE")); } async function onSplmntCmptn(data: InstlSncnRegistFormData) { diff --git a/apps/as/src/pages/sewer-bsc-plan/lib/payload-utils.ts b/apps/as/src/pages/sewer-bsc-plan/lib/payload-utils.ts index 07224c8ef..df63265a4 100644 --- a/apps/as/src/pages/sewer-bsc-plan/lib/payload-utils.ts +++ b/apps/as/src/pages/sewer-bsc-plan/lib/payload-utils.ts @@ -3,6 +3,7 @@ import type { SewerBscPlanDetResponseDto, SewerBscPlanSplmntDmndItem, } from "@/entities/sewer-bsc-plan"; +import { sewerBscPlanApplySaveSchema } from "@/entities/sewer-bsc-plan"; import { type SplmntDmndDialogConfirmPayload, toEsntlAtchFileSaveList } from "@/widgets/pbadms-sprt"; import type { ChecklistFormState, ReviewStepCode } from "../model/view-types"; @@ -26,7 +27,7 @@ export function buildSavePayload( const cklstResultRows = data.cklstResultRows ?? []; const esntlFileList = data.esntlFileList ?? []; - return { + return sewerBscPlanApplySaveSchema.parse({ sewerBscPlan: { sewerBscPlanDocNo: detDto.sewerBscPlanDocNo, admdstCd: detDto.admdstCd, @@ -99,7 +100,7 @@ export function buildSavePayload( })), cklstResultList: toCklstSaveDto(cklstResultRows, checklistFormState, reviewStep), esntlAtchFileList: toEsntlAtchFileSaveList(esntlFileList), - }; + }); } export function buildTechReviewReplyPayload( @@ -111,12 +112,12 @@ export function buildTechReviewReplyPayload( reviewOpinionFormData?: ReviewOpinionGetFormDataResult | null, opnrNm?: string, ): SewerBscPlanApplySaveRequestDto { - return { + return sewerBscPlanApplySaveSchema.parse({ ...buildSavePayload(data, checklistFormState, reviewStep, prgrsSttsComCd), techReViewSaveCd, rvwStpCd: reviewStep, rvwOpnnList: toRvwOpnnSaveDto(data, reviewOpinionFormData, opnrNm), - }; + }); } export function buildSupplementReqPayload( @@ -136,10 +137,10 @@ export function buildSupplementReqPayload( cmptnYn: "N", })); - return { + return sewerBscPlanApplySaveSchema.parse({ ...buildSavePayload(data, checklistFormState, "LOCAL", "SL"), splmntDmndList: [...existingItems, ...newItems], - }; + }); } export function toSplmntDmndSaveItem(item: SewerBscPlanSplmntDmndItem): SewerBscPlanSplmntDmndItem { 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 416b1f401..d130d0673 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 @@ -77,7 +77,7 @@ export const sewerBscPlanRegistSchema = z.object({ cklstSn: z.number(), cklstArtclSn: z.number(), cklstRvwSn: z.number(), - selected: z.enum(["Y", "N"]).nullable(), + selected: z.enum(["Y", "N"]).nullish(), picRvwCn: z.string().nullable().optional(), }), ), diff --git a/apps/as/src/widgets/pbadms-sprt/lib/checklist-form-utils.ts b/apps/as/src/widgets/pbadms-sprt/lib/checklist-form-utils.ts index 52ad49f7a..bb4aae07d 100644 --- a/apps/as/src/widgets/pbadms-sprt/lib/checklist-form-utils.ts +++ b/apps/as/src/widgets/pbadms-sprt/lib/checklist-form-utils.ts @@ -22,7 +22,7 @@ interface CklstResultListItem { cklstArtclSn: number; cklstRvwSn: number; rvwStpComCd?: string | null; - selected: "Y" | "N" | null; + selected?: "Y" | "N" | null; picRvwCn?: string | null; } 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 4b9866877..1e4c324bb 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 @@ -30,7 +30,7 @@ import { buildChecklistTabs, normalizeTaskSeComCdArray, syncCklstResultListFromTree, -} from "../lib/checklist-form-utils"; +} from "../lib/checklist-form-utils"; type FieldPrefix = "fnrsCnsltnMng" | "instlSncnMng" | "designCnstnMng" | "sewerBscPlan"; @@ -39,7 +39,7 @@ interface CklstResultListItem { cklstArtclSn: number; cklstRvwSn: number; rvwStpComCd: string; - selected: "Y" | "N" | null; + selected?: "Y" | "N" | null; picRvwCn?: string | null; }