Add consignment_detail table for consignment inventory

Separate table linked to product — keeps product table clean
when most items are not consignment. Tracks consignor (account),
commission percentage, min price, and agreement date.
33 tests passing.
This commit is contained in:
Ryan Moon
2026-03-27 18:27:35 -05:00
parent 1132e0999b
commit a782b2098f
4 changed files with 1661 additions and 0 deletions

View File

@@ -0,0 +1,15 @@
CREATE TABLE "consignment_detail" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"product_id" uuid NOT NULL,
"company_id" uuid NOT NULL,
"consignor_account_id" uuid NOT NULL,
"commission_percent" numeric(5, 2) NOT NULL,
"min_price" numeric(10, 2),
"agreement_date" date,
"notes" text,
"is_active" boolean DEFAULT true NOT NULL,
"created_at" timestamp with time zone DEFAULT now() NOT NULL
);
--> statement-breakpoint
ALTER TABLE "consignment_detail" ADD CONSTRAINT "consignment_detail_product_id_product_id_fk" FOREIGN KEY ("product_id") REFERENCES "public"."product"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
ALTER TABLE "consignment_detail" ADD CONSTRAINT "consignment_detail_company_id_company_id_fk" FOREIGN KEY ("company_id") REFERENCES "public"."company"("id") ON DELETE no action ON UPDATE no action;

File diff suppressed because it is too large Load Diff

View File

@@ -43,6 +43,13 @@
"when": 1774653515690,
"tag": "0005_add_products_units_receipts",
"breakpoints": true
},
{
"idx": 6,
"version": "7",
"when": 1774653924179,
"tag": "0006_add_consignment",
"breakpoints": true
}
]
}

View File

@@ -166,6 +166,26 @@ 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),
companyId: uuid('company_id')
.notNull()
.references(() => companies.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