summaryrefslogtreecommitdiff
path: root/lib/basic-contract/service.ts
diff options
context:
space:
mode:
authordujinkim <dujin.kim@dtsolution.co.kr>2025-11-19 06:15:43 +0000
committerdujinkim <dujin.kim@dtsolution.co.kr>2025-11-19 06:15:43 +0000
commitc92bd1b8caa6ddabe6acee42018262febd5d91fb (patch)
tree833a62c9577894b0f77d3677d4d0274e1cb99385 /lib/basic-contract/service.ts
parent9bf5b15734cdf87a02c68b2d2a25046a0678a037 (diff)
(임수민) 기본계약 코멘트, 법무검토 수정
Diffstat (limited to 'lib/basic-contract/service.ts')
-rw-r--r--lib/basic-contract/service.ts128
1 files changed, 128 insertions, 0 deletions
diff --git a/lib/basic-contract/service.ts b/lib/basic-contract/service.ts
index eb3d49f5..55ac149e 100644
--- a/lib/basic-contract/service.ts
+++ b/lib/basic-contract/service.ts
@@ -2784,6 +2784,134 @@ export async function requestLegalReviewAction(
}
}
+/**
+ * SSLVW 데이터로부터 법무검토 상태 업데이트
+ * @param sslvwData 선택된 SSLVW 데이터 배열
+ * @param selectedContractIds 선택된 계약서 ID 배열
+ * @returns 성공 여부 및 메시지
+ */
+export async function updateLegalReviewStatusFromSSLVW(
+ sslvwData: Array<{ VEND_CD?: string; PRGS_STAT_DSC?: string; [key: string]: any }>,
+ selectedContractIds: number[]
+): Promise<{ success: boolean; message: string; updatedCount: number; errors: string[] }> {
+ try {
+ console.log(`[updateLegalReviewStatusFromSSLVW] SSLVW 데이터로부터 법무검토 상태 업데이트 시작`)
+
+ if (!sslvwData || sslvwData.length === 0) {
+ return {
+ success: false,
+ message: 'SSLVW 데이터가 없습니다.',
+ updatedCount: 0,
+ errors: []
+ }
+ }
+
+ if (!selectedContractIds || selectedContractIds.length === 0) {
+ return {
+ success: false,
+ message: '선택된 계약서가 없습니다.',
+ updatedCount: 0,
+ errors: []
+ }
+ }
+
+ // 선택된 계약서 정보 조회
+ const selectedContracts = await db
+ .select({
+ id: basicContractView.id,
+ vendorCode: basicContractView.vendorCode,
+ legalReviewStatus: basicContractView.legalReviewStatus
+ })
+ .from(basicContractView)
+ .where(inArray(basicContractView.id, selectedContractIds))
+
+ let updatedCount = 0
+ const errors: string[] = []
+
+ // 각 SSLVW 데이터에 대해 처리
+ for (const sslvwItem of sslvwData) {
+ const vendorCode = sslvwItem.VEND_CD || sslvwItem.vendorCode
+ const prgsStatDsc = sslvwItem.PRGS_STAT_DSC || sslvwItem.prgsStatDsc
+
+ if (!vendorCode || !prgsStatDsc) {
+ errors.push(`벤더코드 또는 상태 정보가 없습니다: ${JSON.stringify(sslvwItem)}`)
+ continue
+ }
+
+ // 해당 벤더의 선택된 계약서들 찾기
+ const contractsToUpdate = selectedContracts.filter(contract =>
+ contract.vendorCode === vendorCode
+ )
+
+ if (contractsToUpdate.length === 0) {
+ console.log(`벤더 ${vendorCode}의 선택된 계약서가 없음`)
+ continue
+ }
+
+ // PRGS_STAT_DSC를 legalWorks.status로 매핑
+ const statusMapping: Record<string, string> = {
+ '신규등록': '신규등록',
+ '검토요청': '검토요청',
+ '담당자배정': '담당자배정',
+ '검토중': '검토중',
+ '답변완료': '답변완료',
+ '재검토요청': '재검토요청',
+ '보류': '보류',
+ '취소': '취소'
+ }
+
+ const mappedStatus = statusMapping[prgsStatDsc] || prgsStatDsc
+
+ // 각 계약서의 legalWorks 상태 업데이트
+ for (const contract of contractsToUpdate) {
+ try {
+ const updateResult = await db
+ .update(legalWorks)
+ .set({
+ status: mappedStatus,
+ updatedAt: new Date()
+ })
+ .where(eq(legalWorks.basicContractId, contract.id))
+ .returning({ id: legalWorks.id })
+
+ if (updateResult.length > 0) {
+ console.log(`법무작업 상태 업데이트: 계약서 ${contract.id}, 상태 ${mappedStatus}`)
+ updatedCount++
+ } else {
+ console.log(`법무작업 레코드 없음: 계약서 ${contract.id}`)
+ errors.push(`계약서 ${contract.id}: 법무작업 레코드가 없습니다`)
+ }
+ } catch (contractError) {
+ console.error(`계약서 ${contract.id} 상태 업데이트 실패:`, contractError)
+ errors.push(`계약서 ${contract.id}: 업데이트 실패`)
+ }
+ }
+ }
+
+ const message = updatedCount > 0
+ ? `${updatedCount}건의 계약서 법무검토 상태가 업데이트되었습니다.`
+ : '업데이트된 계약서가 없습니다.'
+
+ console.log(`[updateLegalReviewStatusFromSSLVW] 완료: ${message}`)
+
+ return {
+ success: updatedCount > 0,
+ message,
+ updatedCount,
+ errors
+ }
+
+ } catch (error) {
+ console.error('[updateLegalReviewStatusFromSSLVW] 오류:', error)
+ return {
+ success: false,
+ message: '법무검토 상태 업데이트 중 오류가 발생했습니다.',
+ updatedCount: 0,
+ errors: [error instanceof Error ? error.message : '알 수 없는 오류']
+ }
+ }
+}
+
export async function resendContractsAction(contractIds: number[]) {
try {
// 세션 확인