From 2ded9dcc3968b7fff3e29a128d327df6b77923ab Mon Sep 17 00:00:00 2001 From: joonhoekim <26rote@gmail.com> Date: Mon, 7 Jul 2025 08:59:50 +0000 Subject: (김준회) 벤더 상세페이지 - 신용평가정보 조회 (nonsap oracle db) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/oracle-db/nonsap/services/creditService.ts | 215 +++++++++++++++++++++++++ 1 file changed, 215 insertions(+) create mode 100644 lib/oracle-db/nonsap/services/creditService.ts (limited to 'lib/oracle-db/nonsap/services/creditService.ts') diff --git a/lib/oracle-db/nonsap/services/creditService.ts b/lib/oracle-db/nonsap/services/creditService.ts new file mode 100644 index 00000000..60e4f287 --- /dev/null +++ b/lib/oracle-db/nonsap/services/creditService.ts @@ -0,0 +1,215 @@ +'use server'; + +import { oracleKnex, getOracleConnection } from "@/lib/oracle-db/db"; +import { readFileSync } from "fs"; +import { join } from "path"; +import creditServiceMapping from "./creditServiceMapping.json"; + +// SQL 파일 읽기 +const getCreditQuerySQL = () => { + const sqlPath = join(process.cwd(), "lib/oracle-db/nonsap/services/creditServiceQuery.sql"); + return readFileSync(sqlPath, "utf8"); +}; + +// 신용평가사 코드 변환 함수 +const convertCreditGbToCode = (creditGb: string): string => { + // 이미 1글자 코드인 경우 그대로 반환 + if (creditGb.length === 1 && creditServiceMapping.hasOwnProperty(creditGb)) { + return creditGb; + } + + // 한글 이름인 경우 코드로 변환 + const code = creditServiceMapping[creditGb as keyof typeof creditServiceMapping]; + if (code && typeof code === "string" && code.length === 1) { + return code; + } + + throw new Error(`유효하지 않은 신용평가사 코드: ${creditGb}`); +}; + + + +// 방법 1: knex.raw() 사용 (네임드 바인드 변수) +// reno: 사업자번호, credit_gb: 신용평가사 코드 +export const getCreditInfo = async (reno: string, credit_gb: string) => { + const query = getCreditQuerySQL(); + const creditGbCode = convertCreditGbToCode(credit_gb); + + const result = await oracleKnex.raw(query, { + reno: reno, + credit_gb: creditGbCode + }); + + // Oracle knex raw 결과에서 실제 rows 추출 + const rows = Array.isArray(result) ? result : result.rows || []; + + return rows; + + // UI 테스트용 목업 데이터 (필요시 주석 해제) + // const mockData = getMockCreditData(reno, credit_gb); + // return [mockData]; +}; + +// 방법 2: oracledb 직접 사용 (네임드 바인드 변수) +// reno: 사업자번호, credit_gb: 신용평가사 코드 +export const getCreditInfoWithOracleDb = async (reno: string, credit_gb: string) => { + + const connection = await getOracleConnection(); + + try { + const query = getCreditQuerySQL(); + const creditGbCode = convertCreditGbToCode(credit_gb); + + const result = await connection.execute(query, { + reno: reno, + credit_gb: creditGbCode + }); + + return result.rows || []; + } finally { + await connection.close(); + } + + // UI 테스트용 목업 데이터 (필요시 주석 해제) + // const mockData = getMockCreditData(reno, credit_gb); + // return [mockData]; +}; + +// 편의 함수: 신용평가사 코드 목록 조회 +export const getCreditServiceCodes = async () => { + const codes = Object.keys(creditServiceMapping).filter(key => key.length === 1); + return codes.map(code => ({ + code: code, + name: creditServiceMapping[code as keyof typeof creditServiceMapping] + })); +}; + +// 편의 함수: 신용평가사 이름 목록 조회 +export const getCreditServiceNames = async () => { + const names = Object.keys(creditServiceMapping).filter(key => key.length > 1); + return names.map(name => ({ + name: name, + code: creditServiceMapping[name as keyof typeof creditServiceMapping] + })); +}; + +// 임시 테스트 데이터 +const getMockCreditData = (reno: string, credit_gb: string) => { + return { + RESNO: reno, + EENTNM: "SAMPLE COMPANY LTD", + OPEDT: "2005.03.15", + REPR_NM: "홍길동", + TYSCALE: "중소기업", + RELCMP: "독립회사", + ADR: "서울특별시 강남구 테헤란로 123", + LISTYN: "비상장", + GOODSNM: "전자부품제조", + TELNO: "02-1234-5678", + FAXNO: "02-1234-5679", + FSTRDRT: "15.2", + + // 매출순위 + MO_1: "현대중공업", + MO_4: "27", + MO_2: "대우조선해양", + MO_5: "25", + MO_3: "삼성물산", + MO_6: "21", + + // 매입순위 + MI_1: "안전세관", + MI_4: "152", + MI_2: "부산세관", + MI_5: "84", + MI_3: "포디어션푸드(주)", + MI_6: "4", + + // 지분관계 + GIBUN_RL_1: "Kongsberg Maritime", + LSH_STK_RATE1: "100", + GIBUN_RL_2: "", + LSH_STK_RATE2: "0", + GIBUN_RL_3: "", + LSH_STK_RATE3: "0", + + // 기타 정보 + HAPGYE: "228", + NOTICE: "", + NOTICE_DT: "", + HPGBNCR_TY: "정상", + FCLOSDT: "", + LASTGRD: "BBB+", + DECISION: "A", + FRISKRV: "R-2", + EXPIRE_GB: "", + FWATCHD: "정상", + SUVDT: "2021.04.26", + ESETDTT: "2020.12.31", + + // 재무년월 + bs_dt0: "20.12.31", + bs_dt1: "19.12.31", + bs_dt2: "18.12.31", + + // 재무현황 - 총자산 + bs59_0: "63,307", + bs59_1: "63,307", + bs59_2: "62,216", + + // 재무현황 - 부채총계 + bs91_0: "27,660", + bs91_1: "36,196", + bs91_2: "23,205", + + // 재무현황 - 자본총계 + bs113_0: "125,474", + bs113_1: "142,804", + bs113_2: "89,251", + + // 재무현황 - 매출액 + pl01_0: "36,247", + pl01_1: "34,866", + pl01_2: "39,011", + + // 재무현황 - 영업이익 + pl27_0: "6,425", + pl27_1: "7,140", + pl27_2: "5,389", + + // 재무현황 - 당기순이익 + pl71_0: "5,286", + pl71_1: "5,761", + pl71_2: "4,325", + + // 재무비율 - 부채비율 + TR0053: "55.3", + TR0052: "0", + TR0051: "59.5", + + // 재무비율 - 차입금의존도 + TR0513: "0", + TR0512: "0", + TR0511: "0", + + // 재무비율 - 영업이익율 + TR0523: "5.1", + TR0522: "5", + TR0521: "6", + + // 재무비율 - 순이익율 + TR0103: "4.2", + TR0102: "4", + TR0101: "4.8", + + // 재무비율 - 매출액증가율 + TR0223: "-19.1", + TR0222: "59.3", + TR0221: "-13.9", + + // 재무비율 - 유동비율 + TR0013: "194.4", + TR0012: "172.7", + TR0011: "230.8" + }; +}; \ No newline at end of file -- cgit v1.2.3