PupaClic commited on
Commit
a3a6ded
·
1 Parent(s): a45f424

docs: add postgres database schema for sales orders module

Browse files

Add initial database schema documentation for sales orders, including tables for orders, items, addresses, shipments and documents. The schema supports core e-commerce transaction functionality with proper relationships and constraints.

Files changed (1) hide show
  1. POSTGRES_DB.md +205 -0
POSTGRES_DB.md ADDED
@@ -0,0 +1,205 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ -- ============================================================================
2
+ -- Database Schema for Sales, Returns & Credit Notes
3
+ -- PostgreSQL 14+
4
+ -- ============================================================================
5
+
6
+ -- Enable UUID extension
7
+ CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
8
+
9
+ CREATE SCHEMA IF NOT EXISTS trans;
10
+
11
+ CREATE TABLE IF NOT EXISTS trans.branches (
12
+ branch_id VARCHAR(26) PRIMARY KEY
13
+ );
14
+
15
+ CREATE TABLE IF NOT EXISTS trans.merchants (
16
+ merchant_id VARCHAR(26) PRIMARY KEY
17
+ );
18
+
19
+ CREATE TABLE IF NOT EXISTS trans.customers (
20
+ customer_id VARCHAR(26) PRIMARY KEY
21
+ );
22
+
23
+ CREATE TABLE IF NOT EXISTS trans.users (
24
+ user_id VARCHAR(26) PRIMARY KEY
25
+ );
26
+
27
+ CREATE TABLE IF NOT EXISTS trans.catalogues (
28
+ catalogue_id VARCHAR(26) PRIMARY KEY
29
+ );
30
+
31
+ -- =========================================================================
32
+ -- SALES ORDERS MODULE
33
+ -- ============================================================================
34
+
35
+ -- Sales Orders Table
36
+ CREATE TABLE trans.sales_orders (
37
+ sales_order_id VARCHAR(26) PRIMARY KEY,
38
+ order_number VARCHAR(50) UNIQUE NOT NULL,
39
+ branch_id VARCHAR(26) NOT NULL,
40
+ merchant_id VARCHAR(26) NOT NULL,
41
+ order_date TIMESTAMP WITH TIME ZONE NOT NULL,
42
+ status VARCHAR(20) NOT NULL CHECK (status IN ('draft', 'confirmed', 'processing', 'fulfilled', 'partially_fulfilled', 'cancelled', 'on_hold')),
43
+
44
+ -- Customer Information
45
+ customer_id VARCHAR(26) NOT NULL,
46
+ customer_name VARCHAR(255) NOT NULL,
47
+ customer_type VARCHAR(10) NOT NULL CHECK (customer_type IN ('b2b', 'b2c')),
48
+ customer_phone VARCHAR(20),
49
+ customer_email VARCHAR(255),
50
+ customer_gstin VARCHAR(15),
51
+
52
+ -- Financial Summary
53
+ subtotal DECIMAL(12,2) NOT NULL DEFAULT 0,
54
+ total_discount DECIMAL(12,2) NOT NULL DEFAULT 0,
55
+ total_tax DECIMAL(12,2) NOT NULL DEFAULT 0,
56
+ shipping_charges DECIMAL(12,2) NOT NULL DEFAULT 0,
57
+ grand_total DECIMAL(12,2) NOT NULL DEFAULT 0,
58
+ cgst DECIMAL(12,2) DEFAULT 0,
59
+ sgst DECIMAL(12,2) DEFAULT 0,
60
+ igst DECIMAL(12,2) DEFAULT 0,
61
+
62
+ -- Payment Information
63
+ payment_type VARCHAR(20) NOT NULL CHECK (payment_type IN ('prepaid', 'cod', 'credit', 'partial')),
64
+ payment_status VARCHAR(20) NOT NULL CHECK (payment_status IN ('unpaid', 'partial', 'paid', 'refunded', 'overdue')),
65
+ payment_method VARCHAR(50),
66
+ payment_date TIMESTAMP WITH TIME ZONE,
67
+ payment_reference VARCHAR(100),
68
+ amount_paid DECIMAL(12,2) NOT NULL DEFAULT 0,
69
+ amount_due DECIMAL(12,2) NOT NULL DEFAULT 0,
70
+ credit_terms VARCHAR(50),
71
+ credit_limit DECIMAL(12,2),
72
+
73
+ -- Fulfillment Information
74
+ fulfillment_status VARCHAR(20) NOT NULL CHECK (fulfillment_status IN ('pending', 'allocated', 'picked', 'packed', 'shipped', 'delivered')),
75
+ expected_delivery_date DATE,
76
+ actual_delivery_date DATE,
77
+
78
+ -- Invoice Information
79
+ invoice_id VARCHAR(26),
80
+ invoice_number VARCHAR(50),
81
+ invoice_date TIMESTAMP WITH TIME ZONE,
82
+ invoice_pdf_url TEXT,
83
+
84
+ -- Additional Information
85
+ notes TEXT,
86
+ internal_notes TEXT,
87
+
88
+ -- Audit Fields
89
+ created_by VARCHAR(26) NOT NULL,
90
+ created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
91
+ updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
92
+ approved_by VARCHAR(26),
93
+ approved_at TIMESTAMP WITH TIME ZONE,
94
+
95
+ -- Metadata
96
+ source VARCHAR(20) DEFAULT 'web',
97
+ channel VARCHAR(50),
98
+ tags TEXT[],
99
+ version INTEGER NOT NULL DEFAULT 1,
100
+
101
+ -- Foreign Keys
102
+ CONSTRAINT fk_sales_order_branch FOREIGN KEY (branch_id) REFERENCES trans.branches(branch_id),
103
+ CONSTRAINT fk_sales_order_merchant FOREIGN KEY (merchant_id) REFERENCES trans.merchants(merchant_id),
104
+ CONSTRAINT fk_sales_order_customer FOREIGN KEY (customer_id) REFERENCES trans.customers(customer_id),
105
+ CONSTRAINT fk_sales_order_created_by FOREIGN KEY (created_by) REFERENCES trans.users(user_id)
106
+ );
107
+
108
+ -- Sales Order Items Table
109
+ CREATE TABLE trans.sales_order_items (
110
+ id VARCHAR(26) PRIMARY KEY,
111
+ sales_order_id VARCHAR(26) NOT NULL,
112
+
113
+ -- Product Information
114
+ sku VARCHAR(50) NOT NULL,
115
+ product_id VARCHAR(26) NOT NULL,
116
+ product_name VARCHAR(255) NOT NULL,
117
+ item_type VARCHAR(20) NOT NULL CHECK (item_type IN ('product', 'service')),
118
+
119
+ -- Quantity and Pricing
120
+ quantity INTEGER NOT NULL CHECK (quantity > 0),
121
+ unit_price DECIMAL(10,2) NOT NULL,
122
+ tax_percent DECIMAL(5,2) NOT NULL DEFAULT 0,
123
+ discount_percent DECIMAL(5,2) NOT NULL DEFAULT 0,
124
+ line_total DECIMAL(12,2) NOT NULL,
125
+
126
+ -- Tax Information
127
+ hsn_code VARCHAR(10),
128
+ uom VARCHAR(20) NOT NULL,
129
+
130
+ -- Traceability
131
+ batch_no VARCHAR(50),
132
+ serials TEXT[],
133
+
134
+ -- Service Specific
135
+ staff_id VARCHAR(26),
136
+ staff_name VARCHAR(255),
137
+
138
+ -- Additional
139
+ remarks TEXT,
140
+
141
+ -- Audit
142
+ created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
143
+
144
+ -- Foreign Keys
145
+ CONSTRAINT fk_sales_order_item_order FOREIGN KEY (sales_order_id) REFERENCES trans.sales_orders(sales_order_id) ON DELETE CASCADE,
146
+ CONSTRAINT fk_sales_order_item_product FOREIGN KEY (product_id) REFERENCES trans.catalogues(catalogue_id)
147
+ );
148
+
149
+ -- Sales Order Addresses Table
150
+ CREATE TABLE trans.sales_order_addresses (
151
+ id VARCHAR(26) PRIMARY KEY,
152
+ sales_order_id VARCHAR(26) NOT NULL,
153
+ address_type VARCHAR(20) NOT NULL CHECK (address_type IN ('billing', 'shipping')),
154
+
155
+ line1 VARCHAR(255) NOT NULL,
156
+ line2 VARCHAR(255),
157
+ city VARCHAR(100) NOT NULL,
158
+ state VARCHAR(100) NOT NULL,
159
+ postal_code VARCHAR(20) NOT NULL,
160
+ country VARCHAR(100) NOT NULL DEFAULT 'India',
161
+ landmark VARCHAR(255),
162
+
163
+ created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
164
+
165
+ CONSTRAINT fk_sales_order_address FOREIGN KEY (sales_order_id) REFERENCES trans.sales_orders(sales_order_id) ON DELETE CASCADE
166
+ );
167
+
168
+ -- Sales Order Shipments Table
169
+ CREATE TABLE trans.sales_order_shipments (
170
+ shipment_id VARCHAR(26) PRIMARY KEY,
171
+ sales_order_id VARCHAR(26) NOT NULL,
172
+
173
+ carrier VARCHAR(100),
174
+ tracking_number VARCHAR(100),
175
+ awb_number VARCHAR(100),
176
+ shipping_method VARCHAR(50),
177
+
178
+ dispatch_date TIMESTAMP WITH TIME ZONE,
179
+ expected_delivery_date DATE,
180
+ actual_delivery_date DATE,
181
+
182
+ status VARCHAR(20) CHECK (status IN ('pending', 'picked', 'in_transit', 'out_for_delivery', 'delivered', 'failed')),
183
+
184
+ created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
185
+ updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
186
+
187
+ CONSTRAINT fk_sales_order_shipment FOREIGN KEY (sales_order_id) REFERENCES trans.sales_orders(sales_order_id) ON DELETE CASCADE
188
+ );
189
+
190
+ -- Sales Order Documents Table
191
+ CREATE TABLE trans.sales_order_documents (
192
+ id VARCHAR(26) PRIMARY KEY,
193
+ sales_order_id VARCHAR(26) NOT NULL,
194
+
195
+ filename VARCHAR(255) NOT NULL,
196
+ file_url TEXT NOT NULL,
197
+ document_type VARCHAR(50) NOT NULL,
198
+ file_size INTEGER,
199
+ mime_type VARCHAR(100),
200
+
201
+ uploaded_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
202
+ uploaded_by VARCHAR(26),
203
+
204
+ CONSTRAINT fk_sales_order_document FOREIGN KEY (sales_order_id) REFERENCES trans.sales_orders(sales_order_id) ON DELETE CASCADE
205
+ );