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:
15
packages/backend/src/db/migrations/0006_add_consignment.sql
Normal file
15
packages/backend/src/db/migrations/0006_add_consignment.sql
Normal 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;
|
||||||
1619
packages/backend/src/db/migrations/meta/0006_snapshot.json
Normal file
1619
packages/backend/src/db/migrations/meta/0006_snapshot.json
Normal file
File diff suppressed because it is too large
Load Diff
@@ -43,6 +43,13 @@
|
|||||||
"when": 1774653515690,
|
"when": 1774653515690,
|
||||||
"tag": "0005_add_products_units_receipts",
|
"tag": "0005_add_products_units_receipts",
|
||||||
"breakpoints": true
|
"breakpoints": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idx": 6,
|
||||||
|
"version": "7",
|
||||||
|
"when": 1774653924179,
|
||||||
|
"tag": "0006_add_consignment",
|
||||||
|
"breakpoints": true
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -166,6 +166,26 @@ export type PriceHistory = typeof priceHistory.$inferSelect
|
|||||||
export type StockReceipt = typeof stockReceipts.$inferSelect
|
export type StockReceipt = typeof stockReceipts.$inferSelect
|
||||||
export type StockReceiptInsert = typeof stockReceipts.$inferInsert
|
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 Product = typeof products.$inferSelect
|
||||||
export type ProductInsert = typeof products.$inferInsert
|
export type ProductInsert = typeof products.$inferInsert
|
||||||
export type InventoryUnit = typeof inventoryUnits.$inferSelect
|
export type InventoryUnit = typeof inventoryUnits.$inferSelect
|
||||||
|
|||||||
Reference in New Issue
Block a user