diff options
| author | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-11-19 06:15:43 +0000 |
|---|---|---|
| committer | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-11-19 06:15:43 +0000 |
| commit | c92bd1b8caa6ddabe6acee42018262febd5d91fb (patch) | |
| tree | 833a62c9577894b0f77d3677d4d0274e1cb99385 /lib/basic-contract/service.ts | |
| parent | 9bf5b15734cdf87a02c68b2d2a25046a0678a037 (diff) | |
(임수민) 기본계약 코멘트, 법무검토 수정
Diffstat (limited to 'lib/basic-contract/service.ts')
| -rw-r--r-- | lib/basic-contract/service.ts | 128 |
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 { // 세션 확인 |
