diff options
Diffstat (limited to 'db')
| -rw-r--r-- | db/schema/index.ts | 5 | ||||
| -rw-r--r-- | db/schema/risks/risks.ts | 105 |
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 |
