- Introduced `ProductsModule` to manage product data, including read and write controllers. - Created database migrations for the `products`, `sales_requests`, `sales_orders`, `sales_invoices`, and related tables, including constraints and unique indexes. - Implemented validation for product fields such as code, name, unit, and brand with corresponding utility functions. - Developed service and repository layers for handling product and sales data operations. - Added unit tests for the products and sales services, repositories, and controllers to ensure functionality and correctness. - Updated application module to include the new `ProductsModule` and related sales modules for better organization.
253 lines
17 KiB
SQL
253 lines
17 KiB
SQL
CREATE TABLE "document_sequences" (
|
|
"prefix" varchar(8) NOT NULL,
|
|
"period" varchar(8) NOT NULL,
|
|
"last_value" integer NOT NULL,
|
|
CONSTRAINT "document_sequences_prefix_period_pk" PRIMARY KEY("prefix","period")
|
|
);
|
|
--> statement-breakpoint
|
|
CREATE TABLE "sales_requests" (
|
|
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
|
"code" varchar(32) NOT NULL,
|
|
"date" bigint NOT NULL,
|
|
"sales_person_id" uuid NOT NULL,
|
|
"branch_id" uuid NOT NULL,
|
|
"division_id" uuid NOT NULL,
|
|
"customer_id" uuid NOT NULL,
|
|
"address" text NOT NULL,
|
|
"latitude" double precision,
|
|
"longitude" double precision,
|
|
"notes" text,
|
|
"status" text DEFAULT 'draft' NOT NULL,
|
|
"created_at" bigint NOT NULL,
|
|
"updated_at" bigint NOT NULL,
|
|
"created_by" uuid NOT NULL,
|
|
"updated_by" uuid NOT NULL
|
|
);
|
|
--> statement-breakpoint
|
|
CREATE TABLE "sales_request_products" (
|
|
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
|
"sales_request_id" uuid NOT NULL,
|
|
"product_id" uuid NOT NULL,
|
|
"quantity" numeric(18, 4) NOT NULL,
|
|
"price" numeric(18, 4) NOT NULL
|
|
);
|
|
--> statement-breakpoint
|
|
CREATE TABLE "sales_request_images" (
|
|
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
|
"sales_request_id" uuid NOT NULL,
|
|
"url" varchar(2048) NOT NULL,
|
|
"description" varchar(255)
|
|
);
|
|
--> statement-breakpoint
|
|
CREATE TABLE "sales_orders" (
|
|
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
|
"code" varchar(32) NOT NULL,
|
|
"sales_request_id" uuid,
|
|
"date" bigint NOT NULL,
|
|
"sales_person_id" uuid NOT NULL,
|
|
"branch_id" uuid NOT NULL,
|
|
"division_id" uuid NOT NULL,
|
|
"customer_id" uuid NOT NULL,
|
|
"address" text NOT NULL,
|
|
"latitude" double precision,
|
|
"longitude" double precision,
|
|
"notes" text,
|
|
"status" text DEFAULT 'draft' NOT NULL,
|
|
"created_at" bigint NOT NULL,
|
|
"updated_at" bigint NOT NULL,
|
|
"created_by" uuid NOT NULL,
|
|
"updated_by" uuid NOT NULL
|
|
);
|
|
--> statement-breakpoint
|
|
CREATE TABLE "sales_order_products" (
|
|
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
|
"sales_order_id" uuid NOT NULL,
|
|
"product_id" uuid NOT NULL,
|
|
"quantity" numeric(18, 4) NOT NULL,
|
|
"price" numeric(18, 4) NOT NULL
|
|
);
|
|
--> statement-breakpoint
|
|
CREATE TABLE "sales_order_images" (
|
|
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
|
"sales_order_id" uuid NOT NULL,
|
|
"url" varchar(2048) NOT NULL,
|
|
"description" varchar(255)
|
|
);
|
|
--> statement-breakpoint
|
|
CREATE TABLE "packing_slips" (
|
|
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
|
"code" varchar(32) NOT NULL,
|
|
"sales_order_id" uuid,
|
|
"sales_order_number" varchar(32),
|
|
"date" bigint NOT NULL,
|
|
"customer_id" uuid NOT NULL,
|
|
"address" text NOT NULL,
|
|
"latitude" double precision,
|
|
"longitude" double precision,
|
|
"notes" text,
|
|
"status" text DEFAULT 'draft' NOT NULL,
|
|
"created_at" bigint NOT NULL,
|
|
"updated_at" bigint NOT NULL,
|
|
"created_by" uuid NOT NULL,
|
|
"updated_by" uuid NOT NULL
|
|
);
|
|
--> statement-breakpoint
|
|
CREATE TABLE "packing_slip_products" (
|
|
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
|
"packing_slip_id" uuid NOT NULL,
|
|
"product_id" uuid NOT NULL,
|
|
"quantity" numeric(18, 4) NOT NULL,
|
|
"price" numeric(18, 4) NOT NULL
|
|
);
|
|
--> statement-breakpoint
|
|
CREATE TABLE "sales_invoices" (
|
|
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
|
"code" varchar(32) NOT NULL,
|
|
"date" bigint NOT NULL,
|
|
"sales_person_id" uuid NOT NULL,
|
|
"branch_id" uuid NOT NULL,
|
|
"division_id" uuid NOT NULL,
|
|
"customer_id" uuid NOT NULL,
|
|
"sales_order_id" uuid,
|
|
"sales_order_code" varchar(32),
|
|
"packing_slip_id" uuid,
|
|
"packing_slip_code" varchar(32),
|
|
"balance" numeric(18, 4) NOT NULL,
|
|
"notes" text,
|
|
"status" text DEFAULT 'draft' NOT NULL,
|
|
"created_at" bigint NOT NULL,
|
|
"updated_at" bigint NOT NULL,
|
|
"created_by" uuid NOT NULL,
|
|
"updated_by" uuid NOT NULL
|
|
);
|
|
--> statement-breakpoint
|
|
CREATE TABLE "sales_invoice_products" (
|
|
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
|
"sales_invoice_id" uuid NOT NULL,
|
|
"product_id" uuid NOT NULL,
|
|
"quantity" numeric(18, 4) NOT NULL,
|
|
"price" numeric(18, 4) NOT NULL
|
|
);
|
|
--> statement-breakpoint
|
|
CREATE TABLE "sales_payments" (
|
|
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
|
"code" varchar(32) NOT NULL,
|
|
"date" bigint NOT NULL,
|
|
"notes" text,
|
|
"status" text DEFAULT 'draft' NOT NULL,
|
|
"created_at" bigint NOT NULL,
|
|
"updated_at" bigint NOT NULL,
|
|
"created_by" uuid NOT NULL,
|
|
"updated_by" uuid NOT NULL
|
|
);
|
|
--> statement-breakpoint
|
|
CREATE TABLE "sales_payment_images" (
|
|
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
|
"sales_payment_id" uuid NOT NULL,
|
|
"url" varchar(2048) NOT NULL,
|
|
"description" varchar(255)
|
|
);
|
|
--> statement-breakpoint
|
|
CREATE TABLE "sales_payment_invoices" (
|
|
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
|
"sales_payment_id" uuid NOT NULL,
|
|
"sales_invoice_id" uuid NOT NULL,
|
|
"amount" numeric(18, 4) NOT NULL
|
|
);
|
|
--> statement-breakpoint
|
|
ALTER TABLE "sales_requests" ADD CONSTRAINT "sales_requests_sales_person_id_employees_id_fk" FOREIGN KEY ("sales_person_id") REFERENCES "public"."employees"("id") ON DELETE restrict ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "sales_requests" ADD CONSTRAINT "sales_requests_branch_id_branches_id_fk" FOREIGN KEY ("branch_id") REFERENCES "public"."branches"("id") ON DELETE restrict ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "sales_requests" ADD CONSTRAINT "sales_requests_division_id_divisions_id_fk" FOREIGN KEY ("division_id") REFERENCES "public"."divisions"("id") ON DELETE restrict ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "sales_requests" ADD CONSTRAINT "sales_requests_customer_id_customers_id_fk" FOREIGN KEY ("customer_id") REFERENCES "public"."customers"("id") ON DELETE restrict ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "sales_requests" ADD CONSTRAINT "sales_requests_created_by_users_id_fk" FOREIGN KEY ("created_by") REFERENCES "public"."users"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "sales_requests" ADD CONSTRAINT "sales_requests_updated_by_users_id_fk" FOREIGN KEY ("updated_by") REFERENCES "public"."users"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "sales_request_products" ADD CONSTRAINT "sales_request_products_sales_request_id_sales_requests_id_fk" FOREIGN KEY ("sales_request_id") REFERENCES "public"."sales_requests"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "sales_request_products" ADD CONSTRAINT "sales_request_products_product_id_products_id_fk" FOREIGN KEY ("product_id") REFERENCES "public"."products"("id") ON DELETE restrict ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "sales_request_images" ADD CONSTRAINT "sales_request_images_sales_request_id_sales_requests_id_fk" FOREIGN KEY ("sales_request_id") REFERENCES "public"."sales_requests"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "sales_orders" ADD CONSTRAINT "sales_orders_sales_request_id_sales_requests_id_fk" FOREIGN KEY ("sales_request_id") REFERENCES "public"."sales_requests"("id") ON DELETE restrict ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "sales_orders" ADD CONSTRAINT "sales_orders_sales_person_id_employees_id_fk" FOREIGN KEY ("sales_person_id") REFERENCES "public"."employees"("id") ON DELETE restrict ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "sales_orders" ADD CONSTRAINT "sales_orders_branch_id_branches_id_fk" FOREIGN KEY ("branch_id") REFERENCES "public"."branches"("id") ON DELETE restrict ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "sales_orders" ADD CONSTRAINT "sales_orders_division_id_divisions_id_fk" FOREIGN KEY ("division_id") REFERENCES "public"."divisions"("id") ON DELETE restrict ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "sales_orders" ADD CONSTRAINT "sales_orders_customer_id_customers_id_fk" FOREIGN KEY ("customer_id") REFERENCES "public"."customers"("id") ON DELETE restrict ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "sales_orders" ADD CONSTRAINT "sales_orders_created_by_users_id_fk" FOREIGN KEY ("created_by") REFERENCES "public"."users"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "sales_orders" ADD CONSTRAINT "sales_orders_updated_by_users_id_fk" FOREIGN KEY ("updated_by") REFERENCES "public"."users"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "sales_order_products" ADD CONSTRAINT "sales_order_products_sales_order_id_sales_orders_id_fk" FOREIGN KEY ("sales_order_id") REFERENCES "public"."sales_orders"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "sales_order_products" ADD CONSTRAINT "sales_order_products_product_id_products_id_fk" FOREIGN KEY ("product_id") REFERENCES "public"."products"("id") ON DELETE restrict ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "sales_order_images" ADD CONSTRAINT "sales_order_images_sales_order_id_sales_orders_id_fk" FOREIGN KEY ("sales_order_id") REFERENCES "public"."sales_orders"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "packing_slips" ADD CONSTRAINT "packing_slips_sales_order_id_sales_orders_id_fk" FOREIGN KEY ("sales_order_id") REFERENCES "public"."sales_orders"("id") ON DELETE restrict ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "packing_slips" ADD CONSTRAINT "packing_slips_customer_id_customers_id_fk" FOREIGN KEY ("customer_id") REFERENCES "public"."customers"("id") ON DELETE restrict ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "packing_slips" ADD CONSTRAINT "packing_slips_created_by_users_id_fk" FOREIGN KEY ("created_by") REFERENCES "public"."users"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "packing_slips" ADD CONSTRAINT "packing_slips_updated_by_users_id_fk" FOREIGN KEY ("updated_by") REFERENCES "public"."users"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "packing_slip_products" ADD CONSTRAINT "packing_slip_products_packing_slip_id_packing_slips_id_fk" FOREIGN KEY ("packing_slip_id") REFERENCES "public"."packing_slips"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "packing_slip_products" ADD CONSTRAINT "packing_slip_products_product_id_products_id_fk" FOREIGN KEY ("product_id") REFERENCES "public"."products"("id") ON DELETE restrict ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "sales_invoices" ADD CONSTRAINT "sales_invoices_sales_person_id_employees_id_fk" FOREIGN KEY ("sales_person_id") REFERENCES "public"."employees"("id") ON DELETE restrict ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "sales_invoices" ADD CONSTRAINT "sales_invoices_branch_id_branches_id_fk" FOREIGN KEY ("branch_id") REFERENCES "public"."branches"("id") ON DELETE restrict ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "sales_invoices" ADD CONSTRAINT "sales_invoices_division_id_divisions_id_fk" FOREIGN KEY ("division_id") REFERENCES "public"."divisions"("id") ON DELETE restrict ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "sales_invoices" ADD CONSTRAINT "sales_invoices_customer_id_customers_id_fk" FOREIGN KEY ("customer_id") REFERENCES "public"."customers"("id") ON DELETE restrict ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "sales_invoices" ADD CONSTRAINT "sales_invoices_sales_order_id_sales_orders_id_fk" FOREIGN KEY ("sales_order_id") REFERENCES "public"."sales_orders"("id") ON DELETE restrict ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "sales_invoices" ADD CONSTRAINT "sales_invoices_packing_slip_id_packing_slips_id_fk" FOREIGN KEY ("packing_slip_id") REFERENCES "public"."packing_slips"("id") ON DELETE restrict ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "sales_invoices" ADD CONSTRAINT "sales_invoices_created_by_users_id_fk" FOREIGN KEY ("created_by") REFERENCES "public"."users"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "sales_invoices" ADD CONSTRAINT "sales_invoices_updated_by_users_id_fk" FOREIGN KEY ("updated_by") REFERENCES "public"."users"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "sales_invoice_products" ADD CONSTRAINT "sales_invoice_products_sales_invoice_id_sales_invoices_id_fk" FOREIGN KEY ("sales_invoice_id") REFERENCES "public"."sales_invoices"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "sales_invoice_products" ADD CONSTRAINT "sales_invoice_products_product_id_products_id_fk" FOREIGN KEY ("product_id") REFERENCES "public"."products"("id") ON DELETE restrict ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "sales_payments" ADD CONSTRAINT "sales_payments_created_by_users_id_fk" FOREIGN KEY ("created_by") REFERENCES "public"."users"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "sales_payments" ADD CONSTRAINT "sales_payments_updated_by_users_id_fk" FOREIGN KEY ("updated_by") REFERENCES "public"."users"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "sales_payment_images" ADD CONSTRAINT "sales_payment_images_sales_payment_id_sales_payments_id_fk" FOREIGN KEY ("sales_payment_id") REFERENCES "public"."sales_payments"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "sales_payment_invoices" ADD CONSTRAINT "sales_payment_invoices_sales_payment_id_sales_payments_id_fk" FOREIGN KEY ("sales_payment_id") REFERENCES "public"."sales_payments"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "sales_payment_invoices" ADD CONSTRAINT "sales_payment_invoices_sales_invoice_id_sales_invoices_id_fk" FOREIGN KEY ("sales_invoice_id") REFERENCES "public"."sales_invoices"("id") ON DELETE restrict ON UPDATE no action;--> statement-breakpoint
|
|
CREATE UNIQUE INDEX "sales_requests_code_unique" ON "sales_requests" USING btree ("code");
|
|
--> statement-breakpoint
|
|
CREATE UNIQUE INDEX "sales_orders_code_unique" ON "sales_orders" USING btree ("code");
|
|
--> statement-breakpoint
|
|
CREATE UNIQUE INDEX "packing_slips_code_unique" ON "packing_slips" USING btree ("code");
|
|
--> statement-breakpoint
|
|
CREATE UNIQUE INDEX "sales_invoices_code_unique" ON "sales_invoices" USING btree ("code");
|
|
--> statement-breakpoint
|
|
CREATE UNIQUE INDEX "sales_payments_code_unique" ON "sales_payments" USING btree ("code");
|
|
--> statement-breakpoint
|
|
INSERT INTO "privilege_keys" ("code", "label", "sort_order") VALUES
|
|
('SALES.REQUEST', 'Sales requests', 8),
|
|
('SALES.ORDER', 'Sales orders', 9),
|
|
('SALES.PACKING_SLIP', 'Packing slips', 10),
|
|
('SALES.INVOICE', 'Sales invoices', 11),
|
|
('SALES.PAYMENT', 'Sales payments', 12);
|
|
--> statement-breakpoint
|
|
ALTER TABLE "packing_slips" ADD COLUMN "sales_person_id" uuid;--> statement-breakpoint
|
|
ALTER TABLE "packing_slips" ADD COLUMN "branch_id" uuid;--> statement-breakpoint
|
|
ALTER TABLE "packing_slips" ADD COLUMN "division_id" uuid;--> statement-breakpoint
|
|
ALTER TABLE "sales_invoices" ADD COLUMN "address" text;--> statement-breakpoint
|
|
ALTER TABLE "sales_invoices" ADD COLUMN "latitude" double precision;--> statement-breakpoint
|
|
ALTER TABLE "sales_invoices" ADD COLUMN "longitude" double precision;--> statement-breakpoint
|
|
ALTER TABLE "sales_payments" ADD COLUMN "sales_person_id" uuid;--> statement-breakpoint
|
|
ALTER TABLE "sales_payments" ADD COLUMN "branch_id" uuid;--> statement-breakpoint
|
|
ALTER TABLE "sales_payments" ADD COLUMN "division_id" uuid;--> statement-breakpoint
|
|
ALTER TABLE "sales_payments" ADD COLUMN "customer_id" uuid;--> statement-breakpoint
|
|
ALTER TABLE "sales_payments" ADD COLUMN "address" text;--> statement-breakpoint
|
|
ALTER TABLE "sales_payments" ADD COLUMN "latitude" double precision;--> statement-breakpoint
|
|
ALTER TABLE "sales_payments" ADD COLUMN "longitude" double precision;--> statement-breakpoint
|
|
CREATE TABLE "packing_slip_images" (
|
|
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
|
"packing_slip_id" uuid NOT NULL,
|
|
"url" varchar(2048) NOT NULL,
|
|
"description" varchar(255)
|
|
);
|
|
--> statement-breakpoint
|
|
CREATE TABLE "sales_invoice_images" (
|
|
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
|
"sales_invoice_id" uuid NOT NULL,
|
|
"url" varchar(2048) NOT NULL,
|
|
"description" varchar(255)
|
|
);
|
|
--> statement-breakpoint
|
|
CREATE TABLE "sales_payment_products" (
|
|
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
|
"sales_payment_id" uuid NOT NULL,
|
|
"product_id" uuid NOT NULL,
|
|
"quantity" numeric(18, 4) NOT NULL,
|
|
"price" numeric(18, 4) NOT NULL
|
|
);
|
|
--> statement-breakpoint
|
|
ALTER TABLE "packing_slip_images" ADD CONSTRAINT "packing_slip_images_packing_slip_id_packing_slips_id_fk" FOREIGN KEY ("packing_slip_id") REFERENCES "public"."packing_slips"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "sales_invoice_images" ADD CONSTRAINT "sales_invoice_images_sales_invoice_id_sales_invoices_id_fk" FOREIGN KEY ("sales_invoice_id") REFERENCES "public"."sales_invoices"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "sales_payment_products" ADD CONSTRAINT "sales_payment_products_sales_payment_id_sales_payments_id_fk" FOREIGN KEY ("sales_payment_id") REFERENCES "public"."sales_payments"("id") ON DELETE cascade ON UPDATE no action;
|