-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsupabase-schema.sql
More file actions
170 lines (157 loc) · 6.92 KB
/
Copy pathsupabase-schema.sql
File metadata and controls
170 lines (157 loc) · 6.92 KB
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
-- ============================================
-- China Global Study — Supabase Schema Setup
-- Run this ENTIRE script in: Supabase Dashboard → SQL Editor → New Query → Paste → Run
-- ============================================
-- Enable UUID extension
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
-- ============================================
-- 1. UNIVERSITIES (Partnered institutions)
-- ============================================
CREATE TABLE IF NOT EXISTS universities (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
name TEXT NOT NULL,
city TEXT NOT NULL,
province TEXT DEFAULT '',
china_ranking INTEGER,
scholarship_percentage INTEGER DEFAULT 0,
instruction_languages TEXT[] DEFAULT ARRAY['English'],
intake_seasons TEXT[] DEFAULT ARRAY['Fall'],
is_featured BOOLEAN DEFAULT FALSE,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- ============================================
-- 2. PROGRAMS (The core entity — program at a university)
-- ============================================
CREATE TABLE IF NOT EXISTS programs (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
university_id UUID REFERENCES universities(id) ON DELETE CASCADE,
title TEXT NOT NULL,
degree_level TEXT DEFAULT 'Master',
field_of_study TEXT DEFAULT '',
tuition_cny INTEGER DEFAULT 0,
dorm_fee_cny INTEGER DEFAULT 0,
service_fee_cny INTEGER DEFAULT 0,
total_fee_cny INTEGER DEFAULT 0,
total_fee_mad DECIMAL DEFAULT 0,
scholarship_percentage INTEGER DEFAULT 0,
duration_years DECIMAL DEFAULT 1,
intake_season TEXT DEFAULT 'Fall',
status TEXT DEFAULT 'Available' CHECK (status IN ('Available', 'Expired', 'Full')),
requirements TEXT DEFAULT '',
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- ============================================
-- 3. APPLICANTS
-- ============================================
CREATE TABLE IF NOT EXISTS applicants (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
full_name TEXT NOT NULL,
email TEXT DEFAULT '',
phone TEXT DEFAULT '',
nationality TEXT DEFAULT '',
passport_number TEXT DEFAULT '',
application_id TEXT DEFAULT '',
notes TEXT DEFAULT '',
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- ============================================
-- 4. APPLICATIONS (Pipeline — links applicant to program)
-- ============================================
CREATE TABLE IF NOT EXISTS applications (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
applicant_id UUID REFERENCES applicants(id) ON DELETE CASCADE,
program_id UUID REFERENCES programs(id) ON DELETE SET NULL,
custom_university TEXT,
custom_program TEXT,
status TEXT DEFAULT 'Inquiry' CHECK (status IN ('Inquiry', 'Documents Collecting', 'Submitted', 'Under Review', 'Accepted', 'Visa Processing', 'Enrolled', 'Rejected')),
priority TEXT DEFAULT 'Medium' CHECK (priority IN ('Low', 'Medium', 'High')),
payment_status TEXT DEFAULT 'Unpaid' CHECK (payment_status IN ('Unpaid', 'Partial', 'Paid')),
amount_paid_cny INTEGER DEFAULT 0,
notes TEXT DEFAULT '',
status_updated_at TIMESTAMPTZ DEFAULT NOW(),
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- ============================================
-- 5. DOCUMENTS (Per application tracking)
-- ============================================
CREATE TABLE IF NOT EXISTS documents (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
application_id UUID REFERENCES applications(id) ON DELETE CASCADE,
document_type TEXT NOT NULL,
label TEXT DEFAULT '',
status TEXT DEFAULT 'Pending' CHECK (status IN ('Pending', 'Received', 'Verified', 'Expired')),
notes TEXT DEFAULT '',
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- ============================================
-- 6. CITY GUIDES (Editable, pre-seeded)
-- ============================================
CREATE TABLE IF NOT EXISTS city_guides (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
city_name TEXT NOT NULL,
province TEXT DEFAULT '',
description TEXT DEFAULT '',
population TEXT DEFAULT '',
climate TEXT DEFAULT '',
cost_of_living TEXT DEFAULT '',
essential_apps JSONB DEFAULT '[]'::JSONB,
accommodation_info TEXT DEFAULT '',
transportation TEXT DEFAULT '',
image_url TEXT DEFAULT '',
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- ============================================
-- 7. TASKS (Global + per-applicant tags)
-- ============================================
CREATE TABLE IF NOT EXISTS tasks (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
title TEXT NOT NULL,
description TEXT DEFAULT '',
is_completed BOOLEAN DEFAULT FALSE,
category TEXT DEFAULT 'General' CHECK (category IN ('Pre-Departure', 'Arrival', 'Documentation', 'General')),
priority TEXT DEFAULT 'Medium' CHECK (priority IN ('Low', 'Medium', 'High')),
due_date DATE,
applicant_tags UUID[] DEFAULT NULL,
sort_order INTEGER DEFAULT 0,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- ============================================
-- 8. SETTINGS (Single row for app config)
-- ============================================
CREATE TABLE IF NOT EXISTS settings (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
agent_name TEXT DEFAULT '',
agency_id TEXT DEFAULT '',
email TEXT DEFAULT '',
phone TEXT DEFAULT '',
bio TEXT DEFAULT '',
theme TEXT DEFAULT 'obsidian',
mad_exchange_rate DECIMAL DEFAULT 1.38,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- ============================================
-- ROW LEVEL SECURITY (Disable for simplicity — single admin dashboard)
-- ============================================
ALTER TABLE universities ENABLE ROW LEVEL SECURITY;
ALTER TABLE programs ENABLE ROW LEVEL SECURITY;
ALTER TABLE applicants ENABLE ROW LEVEL SECURITY;
ALTER TABLE applications ENABLE ROW LEVEL SECURITY;
ALTER TABLE documents ENABLE ROW LEVEL SECURITY;
ALTER TABLE city_guides ENABLE ROW LEVEL SECURITY;
ALTER TABLE tasks ENABLE ROW LEVEL SECURITY;
ALTER TABLE settings ENABLE ROW LEVEL SECURITY;
-- Allow all operations for anon (single admin, no auth)
CREATE POLICY "Allow all for anon" ON universities FOR ALL USING (true) WITH CHECK (true);
CREATE POLICY "Allow all for anon" ON programs FOR ALL USING (true) WITH CHECK (true);
CREATE POLICY "Allow all for anon" ON applicants FOR ALL USING (true) WITH CHECK (true);
CREATE POLICY "Allow all for anon" ON applications FOR ALL USING (true) WITH CHECK (true);
CREATE POLICY "Allow all for anon" ON documents FOR ALL USING (true) WITH CHECK (true);
CREATE POLICY "Allow all for anon" ON city_guides FOR ALL USING (true) WITH CHECK (true);
CREATE POLICY "Allow all for anon" ON tasks FOR ALL USING (true) WITH CHECK (true);
CREATE POLICY "Allow all for anon" ON settings FOR ALL USING (true) WITH CHECK (true);
-- ============================================
-- DONE! Your database is now ready.
-- ============================================
-- If you are updating an existing database, run these commands:
-- ALTER TABLE applications ADD COLUMN IF NOT EXISTS payment_status TEXT DEFAULT 'Unpaid' CHECK (payment_status IN ('Unpaid', 'Partial', 'Paid'));
-- ALTER TABLE applications ADD COLUMN IF NOT EXISTS amount_paid_cny INTEGER DEFAULT 0;