mirror of
https://github.com/R0m1k3/LogiFlow.git
synced 2026-10-11 17:27:31 +02:00
336 lines
14 KiB
TypeScript
336 lines
14 KiB
TypeScript
import { pgTable, index, check, serial, integer, timestamp, varchar, numeric, boolean, date, text, jsonb, json, unique, foreignKey, primaryKey } from "drizzle-orm/pg-core"
|
|
import { sql } from "drizzle-orm"
|
|
|
|
|
|
|
|
export const deliveries = pgTable("deliveries", {
|
|
id: serial().primaryKey().notNull(),
|
|
orderId: integer("order_id"),
|
|
supplierId: integer("supplier_id").notNull(),
|
|
groupId: integer("group_id").notNull(),
|
|
deliveredDate: timestamp("delivered_date", { mode: 'string' }),
|
|
quantity: integer().notNull(),
|
|
unit: varchar().notNull(),
|
|
status: varchar().default('planned').notNull(),
|
|
createdBy: varchar("created_by").notNull(),
|
|
createdAt: timestamp("created_at", { mode: 'string' }).defaultNow(),
|
|
updatedAt: timestamp("updated_at", { mode: 'string' }).defaultNow(),
|
|
blNumber: varchar("bl_number"),
|
|
blAmount: numeric("bl_amount", { precision: 10, scale: 2 }),
|
|
invoiceReference: varchar("invoice_reference"),
|
|
invoiceAmount: numeric("invoice_amount", { precision: 10, scale: 2 }),
|
|
reconciled: boolean().default(false),
|
|
scheduledDate: date("scheduled_date").notNull(),
|
|
notes: text(),
|
|
validatedAt: timestamp("validated_at", { mode: 'string' }),
|
|
}, (table) => [
|
|
index("idx_deliveries_bl_number").using("btree", table.blNumber.asc().nullsLast().op("text_ops")),
|
|
index("idx_deliveries_group_id").using("btree", table.groupId.asc().nullsLast().op("int4_ops")),
|
|
index("idx_deliveries_invoice_ref").using("btree", table.invoiceReference.asc().nullsLast().op("text_ops")),
|
|
index("idx_deliveries_status").using("btree", table.status.asc().nullsLast().op("text_ops")),
|
|
check("deliveries_status_check_fixed", sql`(status)::text = ANY ((ARRAY['planned'::character varying, 'delivered'::character varying])::text[])`),
|
|
]);
|
|
|
|
export const orders = pgTable("orders", {
|
|
id: serial().primaryKey().notNull(),
|
|
supplierId: integer("supplier_id").notNull(),
|
|
groupId: integer("group_id").notNull(),
|
|
plannedDate: date("planned_date").notNull(),
|
|
quantity: integer(),
|
|
unit: varchar(),
|
|
status: varchar().default('pending').notNull(),
|
|
createdBy: varchar("created_by").notNull(),
|
|
createdAt: timestamp("created_at", { mode: 'string' }).defaultNow(),
|
|
updatedAt: timestamp("updated_at", { mode: 'string' }).defaultNow(),
|
|
notes: text(),
|
|
}, (table) => [
|
|
index("idx_orders_group_id").using("btree", table.groupId.asc().nullsLast().op("int4_ops")),
|
|
index("idx_orders_status").using("btree", table.status.asc().nullsLast().op("text_ops")),
|
|
check("orders_status_check", sql`(status)::text = ANY ((ARRAY['pending'::character varying, 'planned'::character varying, 'delivered'::character varying])::text[])`),
|
|
]);
|
|
|
|
export const groups = pgTable("groups", {
|
|
id: serial().primaryKey().notNull(),
|
|
name: varchar().notNull(),
|
|
color: varchar().notNull(),
|
|
createdAt: timestamp("created_at", { mode: 'string' }).defaultNow(),
|
|
updatedAt: timestamp("updated_at", { mode: 'string' }).defaultNow(),
|
|
nocodbConfigId: integer("nocodb_config_id"),
|
|
nocodbTableId: varchar("nocodb_table_id"),
|
|
nocodbTableName: varchar("nocodb_table_name"),
|
|
invoiceColumnName: varchar("invoice_column_name").default('Ref Facture'),
|
|
});
|
|
|
|
export const sessions = pgTable("sessions", {
|
|
sid: varchar().primaryKey().notNull(),
|
|
sess: jsonb().notNull(),
|
|
expire: timestamp({ mode: 'string' }).notNull(),
|
|
}, (table) => [
|
|
index("IDX_session_expire").using("btree", table.expire.asc().nullsLast().op("timestamp_ops")),
|
|
]);
|
|
|
|
export const suppliers = pgTable("suppliers", {
|
|
id: serial().primaryKey().notNull(),
|
|
name: varchar().notNull(),
|
|
contact: varchar(),
|
|
phone: varchar(),
|
|
createdAt: timestamp("created_at", { mode: 'string' }).defaultNow(),
|
|
updatedAt: timestamp("updated_at", { mode: 'string' }).defaultNow(),
|
|
hasDlc: boolean("has_dlc").default(false),
|
|
});
|
|
|
|
export const userGroups = pgTable("user_groups", {
|
|
userId: varchar("user_id").notNull(),
|
|
groupId: integer("group_id").notNull(),
|
|
createdAt: timestamp("created_at", { mode: 'string' }).defaultNow(),
|
|
});
|
|
|
|
export const publicities = pgTable("publicities", {
|
|
id: serial().primaryKey().notNull(),
|
|
pubNumber: varchar("pub_number", { length: 255 }).notNull(),
|
|
designation: text().notNull(),
|
|
startDate: date("start_date").notNull(),
|
|
endDate: date("end_date").notNull(),
|
|
year: integer().notNull(),
|
|
createdBy: varchar("created_by", { length: 255 }).notNull(),
|
|
createdAt: timestamp("created_at", { mode: 'string' }).default(sql`CURRENT_TIMESTAMP`),
|
|
updatedAt: timestamp("updated_at", { mode: 'string' }).default(sql`CURRENT_TIMESTAMP`),
|
|
}, (table) => [
|
|
index("idx_publicities_start_date").using("btree", table.startDate.asc().nullsLast().op("date_ops")),
|
|
index("idx_publicities_year").using("btree", table.year.asc().nullsLast().op("int4_ops")),
|
|
]);
|
|
|
|
export const session = pgTable("session", {
|
|
sid: varchar().primaryKey().notNull(),
|
|
sess: json().notNull(),
|
|
expire: timestamp({ precision: 6, mode: 'string' }).notNull(),
|
|
});
|
|
|
|
export const users = pgTable("users", {
|
|
id: varchar().primaryKey().notNull(),
|
|
email: varchar(),
|
|
firstName: varchar("first_name"),
|
|
lastName: varchar("last_name"),
|
|
profileImageUrl: varchar("profile_image_url"),
|
|
role: varchar().default('employee').notNull(),
|
|
createdAt: timestamp("created_at", { mode: 'string' }).defaultNow(),
|
|
updatedAt: timestamp("updated_at", { mode: 'string' }).defaultNow(),
|
|
password: varchar(),
|
|
username: varchar(),
|
|
passwordChanged: boolean("password_changed").default(false),
|
|
name: varchar({ length: 255 }),
|
|
}, (table) => [
|
|
unique("users_email_unique").on(table.email),
|
|
unique("users_username_key").on(table.username),
|
|
]);
|
|
|
|
export const roles = pgTable("roles", {
|
|
id: serial().primaryKey().notNull(),
|
|
name: varchar({ length: 100 }).notNull(),
|
|
displayName: varchar("display_name", { length: 200 }).notNull(),
|
|
description: text(),
|
|
color: varchar({ length: 20 }).default('#6b7280'),
|
|
isSystem: boolean("is_system").default(false),
|
|
isActive: boolean("is_active").default(true),
|
|
createdAt: timestamp("created_at", { mode: 'string' }).default(sql`CURRENT_TIMESTAMP`),
|
|
updatedAt: timestamp("updated_at", { mode: 'string' }).default(sql`CURRENT_TIMESTAMP`),
|
|
}, (table) => [
|
|
unique("roles_name_key").on(table.name),
|
|
]);
|
|
|
|
export const permissions = pgTable("permissions", {
|
|
id: serial().primaryKey().notNull(),
|
|
name: varchar({ length: 100 }).notNull(),
|
|
displayName: varchar("display_name", { length: 200 }).notNull(),
|
|
description: text(),
|
|
category: varchar({ length: 50 }).notNull(),
|
|
action: varchar({ length: 50 }).notNull(),
|
|
resource: varchar({ length: 50 }).notNull(),
|
|
createdAt: timestamp("created_at", { mode: 'string' }).default(sql`CURRENT_TIMESTAMP`),
|
|
isSystem: boolean("is_system").default(false),
|
|
updatedAt: timestamp("updated_at", { mode: 'string' }).default(sql`CURRENT_TIMESTAMP`),
|
|
}, (table) => [
|
|
unique("permissions_name_key").on(table.name),
|
|
]);
|
|
|
|
export const nocodbConfig = pgTable("nocodb_config", {
|
|
id: serial().primaryKey().notNull(),
|
|
name: varchar().notNull(),
|
|
baseUrl: varchar("base_url").notNull(),
|
|
apiToken: varchar("api_token").notNull(),
|
|
description: text(),
|
|
isActive: boolean("is_active").default(true),
|
|
createdBy: varchar("created_by").notNull(),
|
|
createdAt: timestamp("created_at", { mode: 'string' }).defaultNow(),
|
|
updatedAt: timestamp("updated_at", { mode: 'string' }).defaultNow(),
|
|
projectId: varchar("project_id"),
|
|
});
|
|
|
|
export const customerOrders = pgTable("customer_orders", {
|
|
id: serial().primaryKey().notNull(),
|
|
orderTaker: varchar("order_taker").notNull(),
|
|
customerName: varchar("customer_name").notNull(),
|
|
customerPhone: varchar("customer_phone").notNull(),
|
|
productDesignation: text("product_designation").notNull(),
|
|
productReference: varchar("product_reference"),
|
|
gencode: varchar(),
|
|
status: varchar().default('En attente de Commande').notNull(),
|
|
deposit: numeric({ precision: 10, scale: 2 }).default('0.00'),
|
|
isPromotionalPrice: boolean("is_promotional_price").default(false),
|
|
customerNotified: boolean("customer_notified").default(false),
|
|
groupId: integer("group_id").notNull(),
|
|
createdBy: varchar("created_by").notNull(),
|
|
createdAt: timestamp("created_at", { mode: 'string' }).defaultNow(),
|
|
updatedAt: timestamp("updated_at", { mode: 'string' }).defaultNow(),
|
|
supplierId: integer("supplier_id"),
|
|
quantity: integer().default(1).notNull(),
|
|
customerEmail: varchar("customer_email", { length: 255 }),
|
|
notes: text(),
|
|
});
|
|
|
|
export const dlcProducts = pgTable("dlc_products", {
|
|
id: serial().primaryKey().notNull(),
|
|
productName: varchar("product_name", { length: 255 }).notNull(),
|
|
expiryDate: date("expiry_date").notNull(),
|
|
dateType: varchar("date_type", { length: 10 }).notNull(),
|
|
quantity: integer().notNull(),
|
|
unit: varchar({ length: 50 }).notNull(),
|
|
supplierId: integer("supplier_id").notNull(),
|
|
location: varchar({ length: 255 }).notNull(),
|
|
status: varchar({ length: 20 }).default('en_cours').notNull(),
|
|
notes: text(),
|
|
alertThreshold: integer("alert_threshold").default(3).notNull(),
|
|
validatedAt: timestamp("validated_at", { mode: 'string' }),
|
|
validatedBy: varchar("validated_by", { length: 255 }),
|
|
groupId: integer("group_id").notNull(),
|
|
createdBy: varchar("created_by", { length: 255 }).notNull(),
|
|
createdAt: timestamp("created_at", { mode: 'string' }).defaultNow().notNull(),
|
|
updatedAt: timestamp("updated_at", { mode: 'string' }).defaultNow().notNull(),
|
|
gencode: varchar(),
|
|
name: varchar({ length: 255 }),
|
|
dlcDate: date("dlc_date"),
|
|
productCode: varchar("product_code", { length: 255 }),
|
|
description: text(),
|
|
}, (table) => [
|
|
index("idx_dlc_products_expiry_date").using("btree", table.expiryDate.asc().nullsLast().op("date_ops")),
|
|
index("idx_dlc_products_group_id").using("btree", table.groupId.asc().nullsLast().op("int4_ops")),
|
|
index("idx_dlc_products_status").using("btree", table.status.asc().nullsLast().op("text_ops")),
|
|
index("idx_dlc_products_supplier_id").using("btree", table.supplierId.asc().nullsLast().op("int4_ops")),
|
|
foreignKey({
|
|
columns: [table.supplierId],
|
|
foreignColumns: [suppliers.id],
|
|
name: "dlc_products_supplier_id_fkey"
|
|
}),
|
|
foreignKey({
|
|
columns: [table.validatedBy],
|
|
foreignColumns: [users.id],
|
|
name: "dlc_products_validated_by_fkey"
|
|
}),
|
|
foreignKey({
|
|
columns: [table.groupId],
|
|
foreignColumns: [groups.id],
|
|
name: "dlc_products_group_id_fkey"
|
|
}),
|
|
foreignKey({
|
|
columns: [table.createdBy],
|
|
foreignColumns: [users.id],
|
|
name: "dlc_products_created_by_fkey"
|
|
}),
|
|
check("dlc_products_date_type_check", sql`(date_type)::text = ANY ((ARRAY['dlc'::character varying, 'ddm'::character varying, 'dluo'::character varying])::text[])`),
|
|
check("dlc_products_status_check", sql`(status)::text = ANY ((ARRAY['en_cours'::character varying, 'expires_soon'::character varying, 'expires'::character varying, 'valides'::character varying])::text[])`),
|
|
]);
|
|
|
|
export const tasks = pgTable("tasks", {
|
|
id: serial().primaryKey().notNull(),
|
|
title: text().notNull(),
|
|
description: text(),
|
|
status: text().default('pending').notNull(),
|
|
priority: text().default('medium').notNull(),
|
|
dueDate: timestamp("due_date", { mode: 'string' }),
|
|
groupId: integer("group_id").notNull(),
|
|
createdBy: text("created_by").notNull(),
|
|
createdAt: timestamp("created_at", { mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),
|
|
updatedAt: timestamp("updated_at", { mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),
|
|
completedAt: timestamp("completed_at", { mode: 'string' }),
|
|
assignedTo: text("assigned_to").default(').notNull(),
|
|
completedBy: varchar("completed_by", { length: 255 }),
|
|
}, (table) => [
|
|
foreignKey({
|
|
columns: [table.completedBy],
|
|
foreignColumns: [users.id],
|
|
name: "tasks_completed_by_fkey"
|
|
}),
|
|
foreignKey({
|
|
columns: [table.groupId],
|
|
foreignColumns: [groups.id],
|
|
name: "tasks_group_id_fkey"
|
|
}),
|
|
foreignKey({
|
|
columns: [table.createdBy],
|
|
foreignColumns: [users.id],
|
|
name: "tasks_created_by_fkey"
|
|
}),
|
|
check("tasks_status_check", sql`status = ANY (ARRAY['pending'::text, 'in_progress'::text, 'completed'::text, 'cancelled'::text])`),
|
|
check("tasks_priority_check", sql`priority = ANY (ARRAY['low'::text, 'medium'::text, 'high'::text, 'urgent'::text])`),
|
|
]);
|
|
|
|
export const publicityParticipations = pgTable("publicity_participations", {
|
|
publicityId: integer("publicity_id").notNull(),
|
|
groupId: integer("group_id").notNull(),
|
|
createdAt: timestamp("created_at", { mode: 'string' }).default(sql`CURRENT_TIMESTAMP`),
|
|
}, (table) => [
|
|
foreignKey({
|
|
columns: [table.publicityId],
|
|
foreignColumns: [publicities.id],
|
|
name: "publicity_participations_publicity_id_fkey"
|
|
}).onDelete("cascade"),
|
|
foreignKey({
|
|
columns: [table.groupId],
|
|
foreignColumns: [groups.id],
|
|
name: "publicity_participations_group_id_fkey"
|
|
}).onDelete("cascade"),
|
|
primaryKey({ columns: [table.publicityId, table.groupId], name: "publicity_participations_pkey"}),
|
|
]);
|
|
|
|
export const rolePermissions = pgTable("role_permissions", {
|
|
roleId: integer("role_id").notNull(),
|
|
permissionId: integer("permission_id").notNull(),
|
|
createdAt: timestamp("created_at", { mode: 'string' }).default(sql`CURRENT_TIMESTAMP`),
|
|
}, (table) => [
|
|
index("idx_role_permissions_permission_id").using("btree", table.permissionId.asc().nullsLast().op("int4_ops")),
|
|
index("idx_role_permissions_role_id").using("btree", table.roleId.asc().nullsLast().op("int4_ops")),
|
|
foreignKey({
|
|
columns: [table.roleId],
|
|
foreignColumns: [roles.id],
|
|
name: "role_permissions_role_id_fkey"
|
|
}).onDelete("cascade"),
|
|
foreignKey({
|
|
columns: [table.permissionId],
|
|
foreignColumns: [permissions.id],
|
|
name: "role_permissions_permission_id_fkey"
|
|
}).onDelete("cascade"),
|
|
primaryKey({ columns: [table.roleId, table.permissionId], name: "role_permissions_pkey"}),
|
|
]);
|
|
|
|
export const userRoles = pgTable("user_roles", {
|
|
userId: varchar("user_id", { length: 255 }).notNull(),
|
|
roleId: integer("role_id").notNull(),
|
|
assignedBy: varchar("assigned_by", { length: 255 }).notNull(),
|
|
assignedAt: timestamp("assigned_at", { mode: 'string' }).default(sql`CURRENT_TIMESTAMP`),
|
|
}, (table) => [
|
|
index("idx_user_roles_assigned_by").using("btree", table.assignedBy.asc().nullsLast().op("text_ops")),
|
|
index("idx_user_roles_role_id").using("btree", table.roleId.asc().nullsLast().op("int4_ops")),
|
|
index("idx_user_roles_user_id").using("btree", table.userId.asc().nullsLast().op("text_ops")),
|
|
foreignKey({
|
|
columns: [table.userId],
|
|
foreignColumns: [users.id],
|
|
name: "user_roles_user_id_fkey"
|
|
}).onDelete("cascade"),
|
|
foreignKey({
|
|
columns: [table.roleId],
|
|
foreignColumns: [roles.id],
|
|
name: "user_roles_role_id_fkey"
|
|
}).onDelete("cascade"),
|
|
primaryKey({ columns: [table.userId, table.roleId], name: "user_roles_pkey"}),
|
|
]);
|