summaryrefslogtreecommitdiff
path: root/db
diff options
context:
space:
mode:
authorjoonhoekim <26rote@gmail.com>2025-08-18 07:04:44 +0000
committerjoonhoekim <26rote@gmail.com>2025-08-18 07:04:44 +0000
commit13bc512bf26618d5c040fd9b19cc0afd7af7c55b (patch)
tree093af881e71f8c73b2a35c3f3a0e89658293c26c /db
parent14e81ffb5ebe0941d36a3be44e29990a18026a99 (diff)
(고건) 리스크 관리 테이블 내 등급 정보 추가
Diffstat (limited to 'db')
-rw-r--r--db/schema/risks/risks.ts169
1 files changed, 165 insertions, 4 deletions
diff --git a/db/schema/risks/risks.ts b/db/schema/risks/risks.ts
index 7be18776..0a4366d6 100644
--- a/db/schema/risks/risks.ts
+++ b/db/schema/risks/risks.ts
@@ -8,7 +8,7 @@ import {
timestamp,
varchar,
} from 'drizzle-orm/pg-core';
-import { eq, relations } from 'drizzle-orm';
+import { eq, relations, sql } from 'drizzle-orm';
import { users } from '../users';
import { vendors } from '../vendors';
@@ -40,8 +40,9 @@ const riskEvents = risksSchema.table('risk_events', {
// ----------------------------------------------------------------------------------------------------
/* VIEWS */
-const risksView = risksSchema.view('risks_view').as((qb) =>
- qb
+const risksView = risksSchema.view('risks_view').as((qb) => {
+
+ return qb
.select({
id: riskEvents.id,
eventType: riskEvents.eventType,
@@ -51,6 +52,166 @@ const risksView = risksSchema.view('risks_view').as((qb) =>
businessNumber: vendors.taxId,
provider: riskEvents.provider,
content: riskEvents.content,
+ prevRatingTotal: sql`
+ CASE
+ WHEN ${riskEvents.eventType} = '종합등급' THEN
+ COALESCE((
+ SELECT content
+ FROM ${risksSchema}.risk_events re2
+ WHERE re2.vendor_id = ${riskEvents.vendorId}
+ AND re2.event_type = '종합등급'
+ AND re2.occurred_at < ${riskEvents.occuredAt}
+ ORDER BY re2.occurred_at DESC
+ LIMIT 1
+ ), '-')
+ ELSE
+ COALESCE((
+ SELECT content
+ FROM ${risksSchema}.risk_events re2
+ WHERE re2.vendor_id = ${riskEvents.vendorId}
+ AND re2.event_type = '종합등급'
+ AND re2.occurred_at <= ${riskEvents.occuredAt}
+ ORDER BY re2.occurred_at DESC
+ LIMIT 1
+ ), '-')
+ END
+ `.as('prev_rating_total'),
+ curRatingTotal: sql`
+ CASE
+ WHEN ${riskEvents.eventType} = '종합등급' THEN
+ ${riskEvents.content}
+ ELSE
+ COALESCE((
+ SELECT content
+ FROM ${risksSchema}.risk_events re2
+ WHERE re2.vendor_id = ${riskEvents.vendorId}
+ AND re2.event_type = '종합등급'
+ AND re2.occurred_at <= ${riskEvents.occuredAt}
+ ORDER BY re2.occurred_at DESC
+ LIMIT 1
+ ), '-')
+ END
+ `.as('cur_rating_total'),
+ prevRatingCredit: sql`
+ CASE
+ WHEN ${riskEvents.eventType} = '신용등급' THEN
+ COALESCE((
+ SELECT content
+ FROM ${risksSchema}.risk_events re2
+ WHERE re2.vendor_id = ${riskEvents.vendorId}
+ AND re2.event_type = '신용등급'
+ AND re2.occurred_at < ${riskEvents.occuredAt}
+ ORDER BY re2.occurred_at DESC
+ LIMIT 1
+ ), '-')
+ ELSE
+ COALESCE((
+ SELECT content
+ FROM ${risksSchema}.risk_events re2
+ WHERE re2.vendor_id = ${riskEvents.vendorId}
+ AND re2.event_type = '신용등급'
+ AND re2.occurred_at <= ${riskEvents.occuredAt}
+ ORDER BY re2.occurred_at DESC
+ LIMIT 1
+ ), '-')
+ END
+ `.as('prev_rating_credit'),
+ curRatingCredit: sql`
+ CASE
+ WHEN ${riskEvents.eventType} = '신용등급' THEN
+ ${riskEvents.content}
+ ELSE
+ COALESCE((
+ SELECT content
+ FROM ${risksSchema}.risk_events re2
+ WHERE re2.vendor_id = ${riskEvents.vendorId}
+ AND re2.event_type = '신용등급'
+ AND re2.occurred_at <= ${riskEvents.occuredAt}
+ ORDER BY re2.occurred_at DESC
+ LIMIT 1
+ ), '-')
+ END
+ `.as('cur_rating_credit'),
+ prevRatingCashflow: sql`
+ CASE
+ WHEN ${riskEvents.eventType} = '현금흐름등급' THEN
+ COALESCE((
+ SELECT content
+ FROM ${risksSchema}.risk_events re2
+ WHERE re2.vendor_id = ${riskEvents.vendorId}
+ AND re2.event_type = '현금흐름등급'
+ AND re2.occurred_at < ${riskEvents.occuredAt}
+ ORDER BY re2.occurred_at DESC
+ LIMIT 1
+ ), '-')
+ ELSE
+ COALESCE((
+ SELECT content
+ FROM ${risksSchema}.risk_events re2
+ WHERE re2.vendor_id = ${riskEvents.vendorId}
+ AND re2.event_type = '현금흐름등급'
+ AND re2.occurred_at <= ${riskEvents.occuredAt}
+ ORDER BY re2.occurred_at DESC
+ LIMIT 1
+ ), '-')
+ END
+ `.as('prev_rating_cashflow'),
+ curRatingCashflow: sql`
+ CASE
+ WHEN ${riskEvents.eventType} = '현금흐름등급' THEN
+ ${riskEvents.content}
+ ELSE
+ COALESCE((
+ SELECT content
+ FROM ${risksSchema}.risk_events re2
+ WHERE re2.vendor_id = ${riskEvents.vendorId}
+ AND re2.event_type = '현금흐름등급'
+ AND re2.occurred_at <= ${riskEvents.occuredAt}
+ ORDER BY re2.occurred_at DESC
+ LIMIT 1
+ ), '-')
+ END
+ `.as('cur_rating_cashflow'),
+ prevRatingWatch: sql`
+ CASE
+ WHEN ${riskEvents.eventType} = 'WATCH등급' THEN
+ COALESCE((
+ SELECT content
+ FROM ${risksSchema}.risk_events re2
+ WHERE re2.vendor_id = ${riskEvents.vendorId}
+ AND re2.event_type = 'WATCH등급'
+ AND re2.occurred_at < ${riskEvents.occuredAt}
+ ORDER BY re2.occurred_at DESC
+ LIMIT 1
+ ), '-')
+ ELSE
+ COALESCE((
+ SELECT content
+ FROM ${risksSchema}.risk_events re2
+ WHERE re2.vendor_id = ${riskEvents.vendorId}
+ AND re2.event_type = 'WATCH등급'
+ AND re2.occurred_at <= ${riskEvents.occuredAt}
+ ORDER BY re2.occurred_at DESC
+ LIMIT 1
+ ), '-')
+ END
+ `.as('prev_rating_watch'),
+ curRatingWatch: sql`
+ CASE
+ WHEN ${riskEvents.eventType} = 'WATCH등급' THEN
+ ${riskEvents.content}
+ ELSE
+ COALESCE((
+ SELECT content
+ FROM ${risksSchema}.risk_events re2
+ WHERE re2.vendor_id = ${riskEvents.vendorId}
+ AND re2.event_type = 'WATCH등급'
+ AND re2.occurred_at <= ${riskEvents.occuredAt}
+ ORDER BY re2.occurred_at DESC
+ LIMIT 1
+ ), '-')
+ END
+ `.as('cur_rating_watch'),
eventStatus: riskEvents.eventStatus,
managerId: riskEvents.managerId,
managerName: users.name,
@@ -60,7 +221,7 @@ const risksView = risksSchema.view('risks_view').as((qb) =>
.from(riskEvents)
.leftJoin(vendors, eq(vendors.id, riskEvents.vendorId))
.leftJoin(users, eq(users.id, riskEvents.managerId))
-);
+});
// ----------------------------------------------------------------------------------------------------