Spaces:
Running
Running
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
);
|