import { pgTable, uuid, varchar, text, timestamp, boolean, integer, numeric, date, pgEnum, } from 'drizzle-orm/pg-core' import { locations } from './stores.js' export const categories = pgTable('category', { id: uuid('id').primaryKey().defaultRandom(), parentId: uuid('parent_id'), name: varchar('name', { length: 255 }).notNull(), description: text('description'), sortOrder: integer('sort_order').notNull().default(0), isActive: boolean('is_active').notNull().default(true), createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(), updatedAt: timestamp('updated_at', { withTimezone: true }).notNull().defaultNow(), }) export const suppliers = pgTable('supplier', { id: uuid('id').primaryKey().defaultRandom(), name: varchar('name', { length: 255 }).notNull(), contactName: varchar('contact_name', { length: 255 }), email: varchar('email', { length: 255 }), phone: varchar('phone', { length: 50 }), website: varchar('website', { length: 255 }), accountNumber: varchar('account_number', { length: 100 }), paymentTerms: varchar('payment_terms', { length: 100 }), notes: text('notes'), isActive: boolean('is_active').notNull().default(true), createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(), updatedAt: timestamp('updated_at', { withTimezone: true }).notNull().defaultNow(), }) // NOTE: item_condition and unit_status pgEnums replaced by lookup tables. // See lookups.ts for inventory_unit_status and item_condition tables. // Columns below use varchar referencing the lookup slug. export const taxCategoryEnum = pgEnum('tax_category', ['goods', 'service', 'exempt']) export const products = pgTable('product', { id: uuid('id').primaryKey().defaultRandom(), locationId: uuid('location_id').references(() => locations.id), sku: varchar('sku', { length: 100 }), upc: varchar('upc', { length: 100 }), name: varchar('name', { length: 255 }).notNull(), description: text('description'), brand: varchar('brand', { length: 255 }), model: varchar('model', { length: 255 }), categoryId: uuid('category_id').references(() => categories.id), isSerialized: boolean('is_serialized').notNull().default(false), isRental: boolean('is_rental').notNull().default(false), isDualUseRepair: boolean('is_dual_use_repair').notNull().default(false), isConsumable: boolean('is_consumable').notNull().default(false), taxCategory: taxCategoryEnum('tax_category').notNull().default('goods'), price: numeric('price', { precision: 10, scale: 2 }), minPrice: numeric('min_price', { precision: 10, scale: 2 }), rentalRateMonthly: numeric('rental_rate_monthly', { precision: 10, scale: 2 }), qtyOnHand: integer('qty_on_hand').notNull().default(0), qtyReorderPoint: integer('qty_reorder_point'), isActive: boolean('is_active').notNull().default(true), legacyId: varchar('legacy_id', { length: 255 }), createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(), updatedAt: timestamp('updated_at', { withTimezone: true }).notNull().defaultNow(), }) export const inventoryUnits = pgTable('inventory_unit', { id: uuid('id').primaryKey().defaultRandom(), productId: uuid('product_id') .notNull() .references(() => products.id), locationId: uuid('location_id').references(() => locations.id), serialNumber: varchar('serial_number', { length: 255 }), condition: varchar('condition', { length: 100 }).notNull().default('new'), status: varchar('status', { length: 100 }).notNull().default('available'), purchaseDate: date('purchase_date'), purchaseCost: numeric('purchase_cost', { precision: 10, scale: 2 }), notes: text('notes'), legacyId: varchar('legacy_id', { length: 255 }), createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(), }) export const productSuppliers = pgTable('product_supplier', { id: uuid('id').primaryKey().defaultRandom(), productId: uuid('product_id') .notNull() .references(() => products.id), supplierId: uuid('supplier_id') .notNull() .references(() => suppliers.id), supplierSku: varchar('supplier_sku', { length: 100 }), isPreferred: boolean('is_preferred').notNull().default(false), createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(), }) export type Category = typeof categories.$inferSelect export type CategoryInsert = typeof categories.$inferInsert export type Supplier = typeof suppliers.$inferSelect export type SupplierInsert = typeof suppliers.$inferInsert export const stockReceipts = pgTable('stock_receipt', { id: uuid('id').primaryKey().defaultRandom(), locationId: uuid('location_id').references(() => locations.id), productId: uuid('product_id') .notNull() .references(() => products.id), supplierId: uuid('supplier_id').references(() => suppliers.id), inventoryUnitId: uuid('inventory_unit_id').references(() => inventoryUnits.id), qty: integer('qty').notNull().default(1), costPerUnit: numeric('cost_per_unit', { precision: 10, scale: 2 }).notNull(), totalCost: numeric('total_cost', { precision: 10, scale: 2 }).notNull(), receivedDate: date('received_date').notNull(), receivedBy: uuid('received_by'), invoiceNumber: varchar('invoice_number', { length: 100 }), notes: text('notes'), createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(), }) export const priceHistory = pgTable('price_history', { id: uuid('id').primaryKey().defaultRandom(), productId: uuid('product_id') .notNull() .references(() => products.id), previousPrice: numeric('previous_price', { precision: 10, scale: 2 }), newPrice: numeric('new_price', { precision: 10, scale: 2 }).notNull(), previousMinPrice: numeric('previous_min_price', { precision: 10, scale: 2 }), newMinPrice: numeric('new_min_price', { precision: 10, scale: 2 }), reason: text('reason'), changedBy: uuid('changed_by'), createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(), }) export type PriceHistory = typeof priceHistory.$inferSelect export type StockReceipt = typeof stockReceipts.$inferSelect export type StockReceiptInsert = typeof stockReceipts.$inferInsert export const consignmentDetails = pgTable('consignment_detail', { id: uuid('id').primaryKey().defaultRandom(), productId: uuid('product_id') .notNull() .references(() => products.id), consignorAccountId: uuid('consignor_account_id').notNull(), commissionPercent: numeric('commission_percent', { precision: 5, scale: 2 }).notNull(), minPrice: numeric('min_price', { precision: 10, scale: 2 }), agreementDate: date('agreement_date'), notes: text('notes'), isActive: boolean('is_active').notNull().default(true), createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(), }) export type ConsignmentDetail = typeof consignmentDetails.$inferSelect export type ConsignmentDetailInsert = typeof consignmentDetails.$inferInsert export type Product = typeof products.$inferSelect export type ProductInsert = typeof products.$inferInsert export type InventoryUnit = typeof inventoryUnits.$inferSelect export type InventoryUnitInsert = typeof inventoryUnits.$inferInsert export type ProductSupplier = typeof productSuppliers.$inferSelect