summaryrefslogtreecommitdiff
path: root/db/schema/agreementComments.ts
blob: 56631b1f49227b1de232bd514e9fefc11eef3422 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import { pgTable, text, timestamp, integer, varchar, boolean, jsonb } from 'drizzle-orm/pg-core';
import { relations } from 'drizzle-orm';
import { basicContract } from './basicContractDocumnet';
import { users } from './users';
import { vendors } from './vendors';

/**
 * GTC 기본 계약서 협의 코멘트 테이블
 * SHI와 Vendor 간의 계약서 협의 내용을 저장
 */
export const agreementComments = pgTable('agreement_comments', {
  id: integer("id").primaryKey().generatedAlwaysAsIdentity(),
  
  // 어떤 기본계약서에 대한 코멘트인지
  basicContractId: integer('basic_contract_id')
    .references(() => basicContract.id)
    .notNull(),
  
  // 작성자 구분 (SHI or Vendor)
  authorType: text('author_type').notNull(), // 'SHI' | 'Vendor'
  
  // 작성자 정보
  authorUserId: integer('author_user_id').references(() => users.id),
  authorVendorId: integer('author_vendor_id').references(() => vendors.id),
  authorName: varchar('author_name', { length: 255 }), // 선택적 작성자 이름
  
  // 코멘트 내용
  comment: text('comment').notNull(),
  
  // 첨부파일 정보 (JSON 배열로 저장)
  attachments: jsonb('attachments').$type<Array<{
    id: string;
    fileName: string;
    filePath: string;
    fileSize: number;
    uploadedAt: Date;
  }>>().default([]),
  
  // 상태 관리
  isDeleted: boolean('is_deleted').notNull().default(false),
  
  // 감사 정보
  createdAt: timestamp('created_at').defaultNow().notNull(),
  updatedAt: timestamp('updated_at').defaultNow().notNull(),
  deletedAt: timestamp('deleted_at'),
});

// Relations 정의
export const agreementCommentsRelations = relations(agreementComments, ({ one }) => ({
  basicContract: one(basicContract, {
    fields: [agreementComments.basicContractId],
    references: [basicContract.id],
  }),
  authorUser: one(users, {
    fields: [agreementComments.authorUserId],
    references: [users.id],
  }),
  authorVendor: one(vendors, {
    fields: [agreementComments.authorVendorId],
    references: [vendors.id],
  }),
}));

export type AgreementComment = typeof agreementComments.$inferSelect;
export type NewAgreementComment = typeof agreementComments.$inferInsert;