From a782b2098fee897e3b57ec4a677b6ee74c2e1a63 Mon Sep 17 00:00:00 2001 From: Ryan Moon Date: Fri, 27 Mar 2026 18:27:35 -0500 Subject: [PATCH] Add consignment_detail table for consignment inventory MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- .../db/migrations/0006_add_consignment.sql | 15 + .../src/db/migrations/meta/0006_snapshot.json | 1619 +++++++++++++++++ .../src/db/migrations/meta/_journal.json | 7 + packages/backend/src/db/schema/inventory.ts | 20 + 4 files changed, 1661 insertions(+) create mode 100644 packages/backend/src/db/migrations/0006_add_consignment.sql create mode 100644 packages/backend/src/db/migrations/meta/0006_snapshot.json diff --git a/packages/backend/src/db/migrations/0006_add_consignment.sql b/packages/backend/src/db/migrations/0006_add_consignment.sql new file mode 100644 index 0000000..b1f52bb --- /dev/null +++ b/packages/backend/src/db/migrations/0006_add_consignment.sql @@ -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; \ No newline at end of file diff --git a/packages/backend/src/db/migrations/meta/0006_snapshot.json b/packages/backend/src/db/migrations/meta/0006_snapshot.json new file mode 100644 index 0000000..64fa9ab --- /dev/null +++ b/packages/backend/src/db/migrations/meta/0006_snapshot.json @@ -0,0 +1,1619 @@ +{ + "id": "abfc70fb-ef22-4b58-8964-8249cc32416b", + "prevId": "c7d24a4e-be5c-47ab-b743-ceafcfead0e3", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.category": { + "name": "category", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "company_id": { + "name": "company_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "parent_id": { + "name": "parent_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sort_order": { + "name": "sort_order", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "is_active": { + "name": "is_active", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "category_company_id_company_id_fk": { + "name": "category_company_id_company_id_fk", + "tableFrom": "category", + "tableTo": "company", + "columnsFrom": [ + "company_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.consignment_detail": { + "name": "consignment_detail", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "product_id": { + "name": "product_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "company_id": { + "name": "company_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "consignor_account_id": { + "name": "consignor_account_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "commission_percent": { + "name": "commission_percent", + "type": "numeric(5, 2)", + "primaryKey": false, + "notNull": true + }, + "min_price": { + "name": "min_price", + "type": "numeric(10, 2)", + "primaryKey": false, + "notNull": false + }, + "agreement_date": { + "name": "agreement_date", + "type": "date", + "primaryKey": false, + "notNull": false + }, + "notes": { + "name": "notes", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "is_active": { + "name": "is_active", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "consignment_detail_product_id_product_id_fk": { + "name": "consignment_detail_product_id_product_id_fk", + "tableFrom": "consignment_detail", + "tableTo": "product", + "columnsFrom": [ + "product_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "consignment_detail_company_id_company_id_fk": { + "name": "consignment_detail_company_id_company_id_fk", + "tableFrom": "consignment_detail", + "tableTo": "company", + "columnsFrom": [ + "company_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.inventory_unit": { + "name": "inventory_unit", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "product_id": { + "name": "product_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "company_id": { + "name": "company_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "location_id": { + "name": "location_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "serial_number": { + "name": "serial_number", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "condition": { + "name": "condition", + "type": "item_condition", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'new'" + }, + "status": { + "name": "status", + "type": "unit_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'available'" + }, + "purchase_date": { + "name": "purchase_date", + "type": "date", + "primaryKey": false, + "notNull": false + }, + "purchase_cost": { + "name": "purchase_cost", + "type": "numeric(10, 2)", + "primaryKey": false, + "notNull": false + }, + "notes": { + "name": "notes", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "legacy_id": { + "name": "legacy_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "inventory_unit_product_id_product_id_fk": { + "name": "inventory_unit_product_id_product_id_fk", + "tableFrom": "inventory_unit", + "tableTo": "product", + "columnsFrom": [ + "product_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "inventory_unit_company_id_company_id_fk": { + "name": "inventory_unit_company_id_company_id_fk", + "tableFrom": "inventory_unit", + "tableTo": "company", + "columnsFrom": [ + "company_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "inventory_unit_location_id_location_id_fk": { + "name": "inventory_unit_location_id_location_id_fk", + "tableFrom": "inventory_unit", + "tableTo": "location", + "columnsFrom": [ + "location_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.price_history": { + "name": "price_history", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "product_id": { + "name": "product_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "company_id": { + "name": "company_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "previous_price": { + "name": "previous_price", + "type": "numeric(10, 2)", + "primaryKey": false, + "notNull": false + }, + "new_price": { + "name": "new_price", + "type": "numeric(10, 2)", + "primaryKey": false, + "notNull": true + }, + "previous_min_price": { + "name": "previous_min_price", + "type": "numeric(10, 2)", + "primaryKey": false, + "notNull": false + }, + "new_min_price": { + "name": "new_min_price", + "type": "numeric(10, 2)", + "primaryKey": false, + "notNull": false + }, + "reason": { + "name": "reason", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "changed_by": { + "name": "changed_by", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "price_history_product_id_product_id_fk": { + "name": "price_history_product_id_product_id_fk", + "tableFrom": "price_history", + "tableTo": "product", + "columnsFrom": [ + "product_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "price_history_company_id_company_id_fk": { + "name": "price_history_company_id_company_id_fk", + "tableFrom": "price_history", + "tableTo": "company", + "columnsFrom": [ + "company_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.product_supplier": { + "name": "product_supplier", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "product_id": { + "name": "product_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "supplier_id": { + "name": "supplier_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "supplier_sku": { + "name": "supplier_sku", + "type": "varchar(100)", + "primaryKey": false, + "notNull": false + }, + "is_preferred": { + "name": "is_preferred", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "product_supplier_product_id_product_id_fk": { + "name": "product_supplier_product_id_product_id_fk", + "tableFrom": "product_supplier", + "tableTo": "product", + "columnsFrom": [ + "product_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "product_supplier_supplier_id_supplier_id_fk": { + "name": "product_supplier_supplier_id_supplier_id_fk", + "tableFrom": "product_supplier", + "tableTo": "supplier", + "columnsFrom": [ + "supplier_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.product": { + "name": "product", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "company_id": { + "name": "company_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "location_id": { + "name": "location_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "sku": { + "name": "sku", + "type": "varchar(100)", + "primaryKey": false, + "notNull": false + }, + "upc": { + "name": "upc", + "type": "varchar(100)", + "primaryKey": false, + "notNull": false + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "brand": { + "name": "brand", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "model": { + "name": "model", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "category_id": { + "name": "category_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "is_serialized": { + "name": "is_serialized", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "is_rental": { + "name": "is_rental", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "is_dual_use_repair": { + "name": "is_dual_use_repair", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "price": { + "name": "price", + "type": "numeric(10, 2)", + "primaryKey": false, + "notNull": false + }, + "min_price": { + "name": "min_price", + "type": "numeric(10, 2)", + "primaryKey": false, + "notNull": false + }, + "rental_rate_monthly": { + "name": "rental_rate_monthly", + "type": "numeric(10, 2)", + "primaryKey": false, + "notNull": false + }, + "qty_on_hand": { + "name": "qty_on_hand", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "qty_reorder_point": { + "name": "qty_reorder_point", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "is_active": { + "name": "is_active", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "legacy_id": { + "name": "legacy_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "product_company_id_company_id_fk": { + "name": "product_company_id_company_id_fk", + "tableFrom": "product", + "tableTo": "company", + "columnsFrom": [ + "company_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "product_location_id_location_id_fk": { + "name": "product_location_id_location_id_fk", + "tableFrom": "product", + "tableTo": "location", + "columnsFrom": [ + "location_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "product_category_id_category_id_fk": { + "name": "product_category_id_category_id_fk", + "tableFrom": "product", + "tableTo": "category", + "columnsFrom": [ + "category_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.stock_receipt": { + "name": "stock_receipt", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "company_id": { + "name": "company_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "location_id": { + "name": "location_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "product_id": { + "name": "product_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "supplier_id": { + "name": "supplier_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "inventory_unit_id": { + "name": "inventory_unit_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "qty": { + "name": "qty", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 1 + }, + "cost_per_unit": { + "name": "cost_per_unit", + "type": "numeric(10, 2)", + "primaryKey": false, + "notNull": true + }, + "total_cost": { + "name": "total_cost", + "type": "numeric(10, 2)", + "primaryKey": false, + "notNull": true + }, + "received_date": { + "name": "received_date", + "type": "date", + "primaryKey": false, + "notNull": true + }, + "received_by": { + "name": "received_by", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "invoice_number": { + "name": "invoice_number", + "type": "varchar(100)", + "primaryKey": false, + "notNull": false + }, + "notes": { + "name": "notes", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "stock_receipt_company_id_company_id_fk": { + "name": "stock_receipt_company_id_company_id_fk", + "tableFrom": "stock_receipt", + "tableTo": "company", + "columnsFrom": [ + "company_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "stock_receipt_location_id_location_id_fk": { + "name": "stock_receipt_location_id_location_id_fk", + "tableFrom": "stock_receipt", + "tableTo": "location", + "columnsFrom": [ + "location_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "stock_receipt_product_id_product_id_fk": { + "name": "stock_receipt_product_id_product_id_fk", + "tableFrom": "stock_receipt", + "tableTo": "product", + "columnsFrom": [ + "product_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "stock_receipt_supplier_id_supplier_id_fk": { + "name": "stock_receipt_supplier_id_supplier_id_fk", + "tableFrom": "stock_receipt", + "tableTo": "supplier", + "columnsFrom": [ + "supplier_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "stock_receipt_inventory_unit_id_inventory_unit_id_fk": { + "name": "stock_receipt_inventory_unit_id_inventory_unit_id_fk", + "tableFrom": "stock_receipt", + "tableTo": "inventory_unit", + "columnsFrom": [ + "inventory_unit_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.supplier": { + "name": "supplier", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "company_id": { + "name": "company_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "contact_name": { + "name": "contact_name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "email": { + "name": "email", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "phone": { + "name": "phone", + "type": "varchar(50)", + "primaryKey": false, + "notNull": false + }, + "website": { + "name": "website", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "account_number": { + "name": "account_number", + "type": "varchar(100)", + "primaryKey": false, + "notNull": false + }, + "payment_terms": { + "name": "payment_terms", + "type": "varchar(100)", + "primaryKey": false, + "notNull": false + }, + "notes": { + "name": "notes", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "is_active": { + "name": "is_active", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "supplier_company_id_company_id_fk": { + "name": "supplier_company_id_company_id_fk", + "tableFrom": "supplier", + "tableTo": "company", + "columnsFrom": [ + "company_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.user": { + "name": "user", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "company_id": { + "name": "company_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "email": { + "name": "email", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "password_hash": { + "name": "password_hash", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "first_name": { + "name": "first_name", + "type": "varchar(100)", + "primaryKey": false, + "notNull": true + }, + "last_name": { + "name": "last_name", + "type": "varchar(100)", + "primaryKey": false, + "notNull": true + }, + "role": { + "name": "role", + "type": "user_role", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'staff'" + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "user_company_id_company_id_fk": { + "name": "user_company_id_company_id_fk", + "tableFrom": "user", + "tableTo": "company", + "columnsFrom": [ + "company_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "user_email_unique": { + "name": "user_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.company": { + "name": "company", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "phone": { + "name": "phone", + "type": "varchar(50)", + "primaryKey": false, + "notNull": false + }, + "email": { + "name": "email", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "timezone": { + "name": "timezone", + "type": "varchar(100)", + "primaryKey": false, + "notNull": true, + "default": "'America/Chicago'" + }, + "notes": { + "name": "notes", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.location": { + "name": "location", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "company_id": { + "name": "company_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "address": { + "name": "address", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "phone": { + "name": "phone", + "type": "varchar(50)", + "primaryKey": false, + "notNull": false + }, + "email": { + "name": "email", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "timezone": { + "name": "timezone", + "type": "varchar(100)", + "primaryKey": false, + "notNull": false + }, + "is_active": { + "name": "is_active", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "location_company_id_company_id_fk": { + "name": "location_company_id_company_id_fk", + "tableFrom": "location", + "tableTo": "company", + "columnsFrom": [ + "company_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.account_processor_link": { + "name": "account_processor_link", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "account_id": { + "name": "account_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "company_id": { + "name": "company_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "processor": { + "name": "processor", + "type": "payment_processor", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "processor_customer_id": { + "name": "processor_customer_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "is_active": { + "name": "is_active", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "account_processor_link_account_id_account_id_fk": { + "name": "account_processor_link_account_id_account_id_fk", + "tableFrom": "account_processor_link", + "tableTo": "account", + "columnsFrom": [ + "account_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "account_processor_link_company_id_company_id_fk": { + "name": "account_processor_link_company_id_company_id_fk", + "tableFrom": "account_processor_link", + "tableTo": "company", + "columnsFrom": [ + "company_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.account": { + "name": "account", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "company_id": { + "name": "company_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "account_number": { + "name": "account_number", + "type": "varchar(50)", + "primaryKey": false, + "notNull": false + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "email": { + "name": "email", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "phone": { + "name": "phone", + "type": "varchar(50)", + "primaryKey": false, + "notNull": false + }, + "address": { + "name": "address", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "billing_mode": { + "name": "billing_mode", + "type": "billing_mode", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'consolidated'" + }, + "notes": { + "name": "notes", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "is_active": { + "name": "is_active", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "legacy_id": { + "name": "legacy_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "legacy_source": { + "name": "legacy_source", + "type": "varchar(50)", + "primaryKey": false, + "notNull": false + }, + "migrated_at": { + "name": "migrated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "account_company_id_company_id_fk": { + "name": "account_company_id_company_id_fk", + "tableFrom": "account", + "tableTo": "company", + "columnsFrom": [ + "company_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.member": { + "name": "member", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "account_id": { + "name": "account_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "company_id": { + "name": "company_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "first_name": { + "name": "first_name", + "type": "varchar(100)", + "primaryKey": false, + "notNull": true + }, + "last_name": { + "name": "last_name", + "type": "varchar(100)", + "primaryKey": false, + "notNull": true + }, + "date_of_birth": { + "name": "date_of_birth", + "type": "date", + "primaryKey": false, + "notNull": false + }, + "is_minor": { + "name": "is_minor", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "email": { + "name": "email", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "phone": { + "name": "phone", + "type": "varchar(50)", + "primaryKey": false, + "notNull": false + }, + "notes": { + "name": "notes", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "legacy_id": { + "name": "legacy_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "member_account_id_account_id_fk": { + "name": "member_account_id_account_id_fk", + "tableFrom": "member", + "tableTo": "account", + "columnsFrom": [ + "account_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "member_company_id_company_id_fk": { + "name": "member_company_id_company_id_fk", + "tableFrom": "member", + "tableTo": "company", + "columnsFrom": [ + "company_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": { + "public.item_condition": { + "name": "item_condition", + "schema": "public", + "values": [ + "new", + "excellent", + "good", + "fair", + "poor" + ] + }, + "public.unit_status": { + "name": "unit_status", + "schema": "public", + "values": [ + "available", + "sold", + "rented", + "in_repair", + "retired" + ] + }, + "public.user_role": { + "name": "user_role", + "schema": "public", + "values": [ + "admin", + "manager", + "staff", + "technician", + "instructor" + ] + }, + "public.billing_mode": { + "name": "billing_mode", + "schema": "public", + "values": [ + "consolidated", + "split" + ] + }, + "public.payment_processor": { + "name": "payment_processor", + "schema": "public", + "values": [ + "stripe", + "global_payments" + ] + } + }, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/packages/backend/src/db/migrations/meta/_journal.json b/packages/backend/src/db/migrations/meta/_journal.json index 60686b1..3a023ca 100644 --- a/packages/backend/src/db/migrations/meta/_journal.json +++ b/packages/backend/src/db/migrations/meta/_journal.json @@ -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 } ] } \ No newline at end of file diff --git a/packages/backend/src/db/schema/inventory.ts b/packages/backend/src/db/schema/inventory.ts index 086ebee..df6e46a 100644 --- a/packages/backend/src/db/schema/inventory.ts +++ b/packages/backend/src/db/schema/inventory.ts @@ -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