File size: 7,267 Bytes
a3a6ded
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
-- ============================================================================
-- Database Schema for Sales, Returns & Credit Notes
-- PostgreSQL 14+
-- ============================================================================

-- Enable UUID extension
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

CREATE SCHEMA IF NOT EXISTS trans;

CREATE TABLE IF NOT EXISTS trans.branches (
    branch_id VARCHAR(26) PRIMARY KEY
);

CREATE TABLE IF NOT EXISTS trans.merchants (
    merchant_id VARCHAR(26) PRIMARY KEY
);

CREATE TABLE IF NOT EXISTS trans.customers (
    customer_id VARCHAR(26) PRIMARY KEY
);

CREATE TABLE IF NOT EXISTS trans.users (
    user_id VARCHAR(26) PRIMARY KEY
);

CREATE TABLE IF NOT EXISTS trans.catalogues (
    catalogue_id VARCHAR(26) PRIMARY KEY
);

-- =========================================================================
-- SALES ORDERS MODULE
-- ============================================================================

-- Sales Orders Table
CREATE TABLE trans.sales_orders (
    sales_order_id VARCHAR(26) PRIMARY KEY,
    order_number VARCHAR(50) UNIQUE NOT NULL,
    branch_id VARCHAR(26) NOT NULL,
    merchant_id VARCHAR(26) NOT NULL,
    order_date TIMESTAMP WITH TIME ZONE NOT NULL,
    status VARCHAR(20) NOT NULL CHECK (status IN ('draft', 'confirmed', 'processing', 'fulfilled', 'partially_fulfilled', 'cancelled', 'on_hold')),
    
    -- Customer Information
    customer_id VARCHAR(26) NOT NULL,
    customer_name VARCHAR(255) NOT NULL,
    customer_type VARCHAR(10) NOT NULL CHECK (customer_type IN ('b2b', 'b2c')),
    customer_phone VARCHAR(20),
    customer_email VARCHAR(255),
    customer_gstin VARCHAR(15),
    
    -- Financial Summary
    subtotal DECIMAL(12,2) NOT NULL DEFAULT 0,
    total_discount DECIMAL(12,2) NOT NULL DEFAULT 0,
    total_tax DECIMAL(12,2) NOT NULL DEFAULT 0,
    shipping_charges DECIMAL(12,2) NOT NULL DEFAULT 0,
    grand_total DECIMAL(12,2) NOT NULL DEFAULT 0,
    cgst DECIMAL(12,2) DEFAULT 0,
    sgst DECIMAL(12,2) DEFAULT 0,
    igst DECIMAL(12,2) DEFAULT 0,
    
    -- Payment Information
    payment_type VARCHAR(20) NOT NULL CHECK (payment_type IN ('prepaid', 'cod', 'credit', 'partial')),
    payment_status VARCHAR(20) NOT NULL CHECK (payment_status IN ('unpaid', 'partial', 'paid', 'refunded', 'overdue')),
    payment_method VARCHAR(50),
    payment_date TIMESTAMP WITH TIME ZONE,
    payment_reference VARCHAR(100),
    amount_paid DECIMAL(12,2) NOT NULL DEFAULT 0,
    amount_due DECIMAL(12,2) NOT NULL DEFAULT 0,
    credit_terms VARCHAR(50),
    credit_limit DECIMAL(12,2),
    
    -- Fulfillment Information
    fulfillment_status VARCHAR(20) NOT NULL CHECK (fulfillment_status IN ('pending', 'allocated', 'picked', 'packed', 'shipped', 'delivered')),
    expected_delivery_date DATE,
    actual_delivery_date DATE,
    
    -- Invoice Information
    invoice_id VARCHAR(26),
    invoice_number VARCHAR(50),
    invoice_date TIMESTAMP WITH TIME ZONE,
    invoice_pdf_url TEXT,
    
    -- Additional Information
    notes TEXT,
    internal_notes TEXT,
    
    -- Audit Fields
    created_by VARCHAR(26) NOT NULL,
    created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
    approved_by VARCHAR(26),
    approved_at TIMESTAMP WITH TIME ZONE,
    
    -- Metadata
    source VARCHAR(20) DEFAULT 'web',
    channel VARCHAR(50),
    tags TEXT[],
    version INTEGER NOT NULL DEFAULT 1,
    
    -- Foreign Keys
    CONSTRAINT fk_sales_order_branch FOREIGN KEY (branch_id) REFERENCES trans.branches(branch_id),
    CONSTRAINT fk_sales_order_merchant FOREIGN KEY (merchant_id) REFERENCES trans.merchants(merchant_id),
    CONSTRAINT fk_sales_order_customer FOREIGN KEY (customer_id) REFERENCES trans.customers(customer_id),
    CONSTRAINT fk_sales_order_created_by FOREIGN KEY (created_by) REFERENCES trans.users(user_id)
);

-- Sales Order Items Table
CREATE TABLE trans.sales_order_items (
    id VARCHAR(26) PRIMARY KEY,
    sales_order_id VARCHAR(26) NOT NULL,
    
    -- Product Information
    sku VARCHAR(50) NOT NULL,
    product_id VARCHAR(26) NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    item_type VARCHAR(20) NOT NULL CHECK (item_type IN ('product', 'service')),
    
    -- Quantity and Pricing
    quantity INTEGER NOT NULL CHECK (quantity > 0),
    unit_price DECIMAL(10,2) NOT NULL,
    tax_percent DECIMAL(5,2) NOT NULL DEFAULT 0,
    discount_percent DECIMAL(5,2) NOT NULL DEFAULT 0,
    line_total DECIMAL(12,2) NOT NULL,
    
    -- Tax Information
    hsn_code VARCHAR(10),
    uom VARCHAR(20) NOT NULL,
    
    -- Traceability
    batch_no VARCHAR(50),
    serials TEXT[],
    
    -- Service Specific
    staff_id VARCHAR(26),
    staff_name VARCHAR(255),
    
    -- Additional
    remarks TEXT,
    
    -- Audit
    created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
    
    -- Foreign Keys
    CONSTRAINT fk_sales_order_item_order FOREIGN KEY (sales_order_id) REFERENCES trans.sales_orders(sales_order_id) ON DELETE CASCADE,
    CONSTRAINT fk_sales_order_item_product FOREIGN KEY (product_id) REFERENCES trans.catalogues(catalogue_id)
);

-- Sales Order Addresses Table
CREATE TABLE trans.sales_order_addresses (
    id VARCHAR(26) PRIMARY KEY,
    sales_order_id VARCHAR(26) NOT NULL,
    address_type VARCHAR(20) NOT NULL CHECK (address_type IN ('billing', 'shipping')),
    
    line1 VARCHAR(255) NOT NULL,
    line2 VARCHAR(255),
    city VARCHAR(100) NOT NULL,
    state VARCHAR(100) NOT NULL,
    postal_code VARCHAR(20) NOT NULL,
    country VARCHAR(100) NOT NULL DEFAULT 'India',
    landmark VARCHAR(255),
    
    created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
    
    CONSTRAINT fk_sales_order_address FOREIGN KEY (sales_order_id) REFERENCES trans.sales_orders(sales_order_id) ON DELETE CASCADE
);

-- Sales Order Shipments Table
CREATE TABLE trans.sales_order_shipments (
    shipment_id VARCHAR(26) PRIMARY KEY,
    sales_order_id VARCHAR(26) NOT NULL,
    
    carrier VARCHAR(100),
    tracking_number VARCHAR(100),
    awb_number VARCHAR(100),
    shipping_method VARCHAR(50),
    
    dispatch_date TIMESTAMP WITH TIME ZONE,
    expected_delivery_date DATE,
    actual_delivery_date DATE,
    
    status VARCHAR(20) CHECK (status IN ('pending', 'picked', 'in_transit', 'out_for_delivery', 'delivered', 'failed')),
    
    created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
    
    CONSTRAINT fk_sales_order_shipment FOREIGN KEY (sales_order_id) REFERENCES trans.sales_orders(sales_order_id) ON DELETE CASCADE
);

-- Sales Order Documents Table
CREATE TABLE trans.sales_order_documents (
    id VARCHAR(26) PRIMARY KEY,
    sales_order_id VARCHAR(26) NOT NULL,
    
    filename VARCHAR(255) NOT NULL,
    file_url TEXT NOT NULL,
    document_type VARCHAR(50) NOT NULL,
    file_size INTEGER,
    mime_type VARCHAR(100),
    
    uploaded_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
    uploaded_by VARCHAR(26),
    
    CONSTRAINT fk_sales_order_document FOREIGN KEY (sales_order_id) REFERENCES trans.sales_orders(sales_order_id) ON DELETE CASCADE
);