summaryrefslogtreecommitdiff
path: root/db
diff options
context:
space:
mode:
Diffstat (limited to 'db')
-rw-r--r--db/schema/index.ts5
-rw-r--r--db/schema/risks/risks.ts105
2 files changed, 109 insertions, 1 deletions
diff --git a/db/schema/index.ts b/db/schema/index.ts
index 6f0f11d6..5b712b40 100644
--- a/db/schema/index.ts
+++ b/db/schema/index.ts
@@ -55,4 +55,7 @@ export * from './ECC/ecc';
export * from './knox/employee'; // 임직원
export * from './knox/organization'; // 조직도
export * from './knox/titles'; // 직급
-export * from './knox/approvals'; // Knox 결재 - eVCP 에서 상신한 결재를 저장 \ No newline at end of file
+export * from './knox/approvals'; // Knox 결재 - eVCP 에서 상신한 결재를 저장
+
+// === Risks 스키마 ===
+export * from './risks/risks'; \ No newline at end of file
diff --git a/db/schema/risks/risks.ts b/db/schema/risks/risks.ts
new file mode 100644
index 00000000..7be18776
--- /dev/null
+++ b/db/schema/risks/risks.ts
@@ -0,0 +1,105 @@
+/* IMPORT */
+import {
+ boolean,
+ integer,
+ pgSchema,
+ serial,
+ text,
+ timestamp,
+ varchar,
+} from 'drizzle-orm/pg-core';
+import { eq, relations } from 'drizzle-orm';
+import { users } from '../users';
+import { vendors } from '../vendors';
+
+// ----------------------------------------------------------------------------------------------------
+
+/* TABLE SCHEMATA */
+const risksSchema = pgSchema('risks');
+const riskEvents = risksSchema.table('risk_events', {
+ id: serial('id').primaryKey(),
+ vendorId: integer('vendor_id')
+ .notNull()
+ .references(() => vendors.id, { onDelete: 'cascade' }),
+ provider: varchar('provider', { length: 128 }).notNull(),
+ eventType: varchar('event_type', { length: 50 }).notNull(),
+ content: text('content'),
+ eventStatus: boolean('event_status').default(true).notNull(),
+ managerId: integer('manager_id')
+ .references(() => users.id, { onDelete: 'set null' }),
+ adminComment: text('admin_comment'),
+ occuredAt: timestamp('occurred_at').defaultNow().notNull(),
+ createdAt: timestamp('created_at').defaultNow().notNull(),
+ updatedAt: timestamp('updated_at').defaultNow().notNull(),
+ createdBy: integer('created_by')
+ .references(() => users.id, { onDelete: 'set null' }),
+ updatedBy: integer('updated_by')
+ .references(() => users.id, { onDelete: 'set null' }),
+});
+
+// ----------------------------------------------------------------------------------------------------
+
+/* VIEWS */
+const risksView = risksSchema.view('risks_view').as((qb) =>
+ qb
+ .select({
+ id: riskEvents.id,
+ eventType: riskEvents.eventType,
+ vendorId: riskEvents.vendorId,
+ vendorCode: vendors.vendorCode,
+ vendorName: vendors.vendorName,
+ businessNumber: vendors.taxId,
+ provider: riskEvents.provider,
+ content: riskEvents.content,
+ eventStatus: riskEvents.eventStatus,
+ managerId: riskEvents.managerId,
+ managerName: users.name,
+ adminComment: riskEvents.adminComment,
+ occuredAt: riskEvents.occuredAt,
+ })
+ .from(riskEvents)
+ .leftJoin(vendors, eq(vendors.id, riskEvents.vendorId))
+ .leftJoin(users, eq(users.id, riskEvents.managerId))
+);
+
+// ----------------------------------------------------------------------------------------------------
+
+/* RELATIONS */
+const riskEventsRelations = relations(riskEvents, ({ one }) => ({
+ vendor: one(vendors, {
+ fields: [riskEvents.vendorId],
+ references: [vendors.id],
+ }),
+ manager: one(users, {
+ fields: [riskEvents.managerId],
+ references: [users.id],
+ }),
+ createdByUser: one(users, {
+ fields: [riskEvents.createdBy],
+ references: [users.id],
+ }),
+ updatedByUser: one(users, {
+ fields: [riskEvents.updatedBy],
+ references: [users.id],
+ }),
+}));
+
+// ----------------------------------------------------------------------------------------------------
+
+/* TYPES */
+type RiskEvents = typeof riskEvents.$inferSelect;
+type NewRiskEvents = typeof riskEvents.$inferInsert;
+type RisksView = typeof risksView.$inferSelect;
+
+// ----------------------------------------------------------------------------------------------------
+
+/* Export */
+export {
+ risksSchema,
+ risksView,
+ riskEvents,
+ riskEventsRelations,
+ type NewRiskEvents,
+ type RiskEvents,
+ type RisksView,
+}; \ No newline at end of file