131 lines
4.6 KiB
TypeScript
131 lines
4.6 KiB
TypeScript
import {
|
|
boolean,
|
|
doublePrecision,
|
|
integer,
|
|
jsonb,
|
|
pgTable,
|
|
text,
|
|
timestamp,
|
|
uniqueIndex
|
|
} from 'drizzle-orm/pg-core';
|
|
|
|
export const users = pgTable(
|
|
'users',
|
|
{
|
|
id: text('id').primaryKey(),
|
|
name: text('name').notNull(),
|
|
email: text('email').notNull(),
|
|
passwordHash: text('password_hash').notNull(),
|
|
systemRole: text('system_role').default('user').notNull(),
|
|
image: text('image'),
|
|
activeOrganizationId: text('active_organization_id'),
|
|
createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
|
|
updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull()
|
|
},
|
|
(table) => ({
|
|
emailIdx: uniqueIndex('users_email_idx').on(table.email)
|
|
})
|
|
);
|
|
|
|
export const organizations = pgTable(
|
|
'organizations',
|
|
{
|
|
id: text('id').primaryKey(),
|
|
name: text('name').notNull(),
|
|
slug: text('slug').notNull(),
|
|
imageUrl: text('image_url'),
|
|
plan: text('plan').default('free').notNull(),
|
|
createdBy: text('created_by').notNull(),
|
|
createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
|
|
updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull()
|
|
},
|
|
(table) => ({
|
|
slugIdx: uniqueIndex('organizations_slug_idx').on(table.slug)
|
|
})
|
|
);
|
|
|
|
export const memberships = pgTable('memberships', {
|
|
id: text('id').primaryKey(),
|
|
userId: text('user_id').notNull(),
|
|
organizationId: text('organization_id').notNull(),
|
|
role: text('role').default('user').notNull(),
|
|
businessRole: text('business_role').default('viewer').notNull(),
|
|
permissions: text('permissions').array().default([]).notNull(),
|
|
createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
|
|
updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull()
|
|
});
|
|
|
|
export const products = pgTable('products', {
|
|
id: integer('id').primaryKey().generatedAlwaysAsIdentity(),
|
|
organizationId: text('organization_id').notNull(),
|
|
name: text('name').notNull(),
|
|
category: text('category').notNull(),
|
|
description: text('description').notNull(),
|
|
photoUrl: text('photo_url').notNull(),
|
|
price: doublePrecision('price').notNull(),
|
|
createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
|
|
updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull()
|
|
});
|
|
|
|
export const msOptions = pgTable(
|
|
'ms_options',
|
|
{
|
|
id: text('id').primaryKey(),
|
|
organizationId: text('organization_id').notNull(),
|
|
category: text('category').notNull(),
|
|
code: text('code').notNull(),
|
|
label: text('label').notNull(),
|
|
value: text('value'),
|
|
parentId: text('parent_id'),
|
|
sortOrder: integer('sort_order').default(0).notNull(),
|
|
isActive: boolean('is_active').default(true).notNull(),
|
|
metadata: jsonb('metadata'),
|
|
deletedAt: timestamp('deleted_at', { withTimezone: true }),
|
|
createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
|
|
updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull()
|
|
},
|
|
(table) => ({
|
|
organizationCategoryCodeIdx: uniqueIndex('ms_options_org_category_code_idx').on(
|
|
table.organizationId,
|
|
table.category,
|
|
table.code
|
|
)
|
|
})
|
|
);
|
|
|
|
export const documentSequences = pgTable(
|
|
'document_sequences',
|
|
{
|
|
id: text('id').primaryKey(),
|
|
organizationId: text('organization_id').notNull(),
|
|
branchId: text('branch_id').default('').notNull(),
|
|
documentType: text('document_type').notNull(),
|
|
prefix: text('prefix').notNull(),
|
|
period: text('period').notNull(),
|
|
currentNumber: integer('current_number').default(0).notNull(),
|
|
paddingLength: integer('padding_length').default(3).notNull(),
|
|
isActive: boolean('is_active').default(true).notNull(),
|
|
createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
|
|
updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull()
|
|
},
|
|
(table) => ({
|
|
organizationDocumentPeriodBranchIdx: uniqueIndex(
|
|
'document_sequences_org_doc_period_branch_idx'
|
|
).on(table.organizationId, table.documentType, table.period, table.branchId)
|
|
})
|
|
);
|
|
|
|
export const trAuditLogs = pgTable('tr_audit_logs', {
|
|
id: text('id').primaryKey(),
|
|
organizationId: text('organization_id').notNull(),
|
|
branchId: text('branch_id'),
|
|
userId: text('user_id').notNull(),
|
|
entityType: text('entity_type').notNull(),
|
|
entityId: text('entity_id').notNull(),
|
|
action: text('action').notNull(),
|
|
beforeData: jsonb('before_data'),
|
|
afterData: jsonb('after_data'),
|
|
requestId: text('request_id'),
|
|
createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull()
|
|
});
|