File size: 13,388 Bytes
86ac4e1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9d905d6
 
 
86ac4e1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
-- ==========================================================
-- Nomoosh — Supabase-compatible PostgreSQL schema
-- Run this in the Supabase SQL Editor (Dashboard → SQL → New Query)
-- ==========================================================

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

-- ==========================================================
-- 1. ONBOARDING / MASTER DATA
-- ==========================================================

-- Accounts (Restaurant Owner / Admin)
CREATE TABLE IF NOT EXISTS accounts (
    id            SERIAL PRIMARY KEY,
    supabase_uid  TEXT UNIQUE,                     -- links to auth.users.id
    name          VARCHAR(25) NOT NULL,
    email         VARCHAR(255) UNIQUE,
    mob_number    VARCHAR(16) UNIQUE,
    profile_pic   TEXT,
    created_at    TIMESTAMPTZ DEFAULT now(),
    updated_at    TIMESTAMPTZ DEFAULT now()
);

-- Restaurant Location
CREATE TABLE IF NOT EXISTS rest_location (
    id        SERIAL PRIMARY KEY,
    street    TEXT NOT NULL,
    locality  TEXT NOT NULL,
    city      TEXT NOT NULL,
    pincode   TEXT NOT NULL,
    landmark  TEXT,
    latitude  TEXT NOT NULL DEFAULT '0',
    longitude TEXT NOT NULL DEFAULT '0'
);

-- Bank Details
CREATE TABLE IF NOT EXISTS bank_details (
    id         SERIAL PRIMARY KEY,
    pan        TEXT,
    bank_name  TEXT,
    account_holder TEXT,
    account_no TEXT,
    ifsc       TEXT,
    upi        TEXT
);

-- Restaurants (Master)
CREATE TABLE IF NOT EXISTS restaurants (
    id                  SERIAL PRIMARY KEY,
    name                VARCHAR(100) NOT NULL,
    accounts_id         INT NOT NULL UNIQUE,
    location_id         INT NOT NULL UNIQUE,
    bank_id             INT UNIQUE,
    rating              REAL,
    rating_by_no_of_people INT,
    mob_number          VARCHAR(16) NOT NULL DEFAULT '',
    description         TEXT,

    FOREIGN KEY (accounts_id) REFERENCES accounts(id),
    FOREIGN KEY (location_id) REFERENCES rest_location(id),
    FOREIGN KEY (bank_id)     REFERENCES bank_details(id)
);

-- Cuisines (pre-seeded below)
CREATE TABLE IF NOT EXISTS cuisines (
    id      SERIAL PRIMARY KEY,
    cuisine VARCHAR(50) NOT NULL UNIQUE
);

-- Restaurant ↔ Cuisines
CREATE TABLE IF NOT EXISTS rest_cuisines (
    restaurant_id INT NOT NULL,
    cuisine_id    INT NOT NULL,
    PRIMARY KEY (restaurant_id, cuisine_id),
    FOREIGN KEY (restaurant_id) REFERENCES restaurants(id) ON DELETE CASCADE,
    FOREIGN KEY (cuisine_id)    REFERENCES cuisines(id)
);

-- Menu
CREATE TABLE IF NOT EXISTS menu (
    id                       SERIAL PRIMARY KEY,
    restaurant_id            INT NOT NULL,
    dish_name                VARCHAR(100) NOT NULL,
    type_maincourse          TEXT,
    quantity                 TEXT,
    price                    INT NOT NULL DEFAULT 0,
    category_veg             BOOLEAN,
    availability             BOOLEAN DEFAULT TRUE NOT NULL,
    preperation_time         INTERVAL,
    image_link               TEXT,
    description              TEXT,
    customizability          BOOLEAN DEFAULT FALSE NOT NULL,
    order_freq               TEXT,
    serving_for_no_of_people INT,
    rating                   REAL,
    rating_by_no_of_people   INT,
    cuisine                  VARCHAR(50),
    category                 TEXT,
    variant_name             TEXT DEFAULT 'Regular',

    FOREIGN KEY (restaurant_id) REFERENCES restaurants(id) ON DELETE CASCADE
);

-- Restaurant Timing (open/close per day per shift)
CREATE TABLE IF NOT EXISTS rest_timing (
    id            SERIAL PRIMARY KEY,
    restaurant_id INT NOT NULL,
    day           VARCHAR(9) NOT NULL,
    open_time     TIME NOT NULL,
    close_time    TIME NOT NULL,

    FOREIGN KEY (restaurant_id) REFERENCES restaurants(id) ON DELETE CASCADE
);

-- Restaurant Media
CREATE TABLE IF NOT EXISTS rest_media (
    id            SERIAL PRIMARY KEY,
    restaurant_id INT NOT NULL,
    image_link    TEXT NOT NULL,
    exterior      BOOLEAN DEFAULT FALSE NOT NULL,
    interior      BOOLEAN DEFAULT FALSE NOT NULL,
    lavatory      BOOLEAN DEFAULT FALSE NOT NULL,
    kitchen       BOOLEAN DEFAULT FALSE NOT NULL,
    video         BOOLEAN DEFAULT FALSE NOT NULL,

    FOREIGN KEY (restaurant_id) REFERENCES restaurants(id) ON DELETE CASCADE
);

-- Customer Feedback
CREATE TABLE IF NOT EXISTS customer_feedback (
    id             SERIAL PRIMARY KEY,
    customer_id    INT NOT NULL,
    restaurant_id  INT NOT NULL,
    food           INT CHECK (food BETWEEN 1 AND 5),
    staff_behavior INT CHECK (staff_behavior BETWEEN 1 AND 5),
    hygiene        INT CHECK (hygiene BETWEEN 1 AND 5),
    optional       TEXT,

    FOREIGN KEY (restaurant_id) REFERENCES restaurants(id) ON DELETE CASCADE
);

-- ==========================================================
-- 2. TEMP / DRAFT TABLES (ONBOARDING FLOW)
-- ==========================================================

CREATE TABLE IF NOT EXISTS temp (
    user_id         INT PRIMARY KEY,
    restaurant_name VARCHAR(100),
    owner_name      VARCHAR(25),
    owner_email     VARCHAR(255),
    owner_mobile    VARCHAR(16),
    street          TEXT,
    locality        TEXT,
    city            TEXT,
    pincode         TEXT,
    landmark        TEXT,
    latitude        TEXT,
    longitude       TEXT,
    bank_name       TEXT,
    account_no      TEXT,
    ifsc            TEXT,
    upi             TEXT,
    rest_mob_number VARCHAR(16),
    description     TEXT,
    pan             TEXT,
    account_holder  TEXT,

    FOREIGN KEY (user_id) REFERENCES accounts(id) ON DELETE CASCADE
);

CREATE TABLE IF NOT EXISTS temp_media (
    id       SERIAL PRIMARY KEY,
    user_id  INT NOT NULL,
    file_link TEXT NOT NULL,
    exterior BOOLEAN DEFAULT FALSE NOT NULL,
    interior BOOLEAN DEFAULT FALSE NOT NULL,
    kitchen  BOOLEAN DEFAULT FALSE NOT NULL,
    menu     BOOLEAN DEFAULT FALSE NOT NULL,
    video    BOOLEAN DEFAULT FALSE NOT NULL,

    FOREIGN KEY (user_id) REFERENCES temp(user_id) ON DELETE CASCADE
);

CREATE TABLE IF NOT EXISTS temp_menu (
    id                       SERIAL PRIMARY KEY,
    user_id                  INT NOT NULL,
    dish_name                VARCHAR(100) NOT NULL,
    type_maincourse          TEXT,
    quantity                 TEXT,
    price                    INT NOT NULL DEFAULT 0,
    category_veg             BOOLEAN,
    availability             BOOLEAN DEFAULT TRUE NOT NULL,
    preperation_time         INTERVAL,
    image_link               TEXT,
    description              TEXT,
    customizability          BOOLEAN DEFAULT FALSE NOT NULL,
    serving_for_no_of_people INT,
    cuisine                  VARCHAR(50),
    category                 TEXT,
    variant_name             TEXT DEFAULT 'Regular',

    FOREIGN KEY (user_id) REFERENCES temp(user_id) ON DELETE CASCADE
);

CREATE TABLE IF NOT EXISTS temp_rest_timing (
    id       SERIAL PRIMARY KEY,
    user_id  INT NOT NULL,
    day      VARCHAR(9) NOT NULL,
    open_time TIME NOT NULL,
    close_time TIME NOT NULL,

    FOREIGN KEY (user_id) REFERENCES temp(user_id) ON DELETE CASCADE
);

CREATE TABLE IF NOT EXISTS temp_rest_cuisines (
    user_id    INT NOT NULL,
    cuisine_id INT NOT NULL,
    PRIMARY KEY (user_id, cuisine_id),
    FOREIGN KEY (user_id)    REFERENCES temp(user_id) ON DELETE CASCADE,
    FOREIGN KEY (cuisine_id) REFERENCES cuisines(id)
);

-- ==========================================================
-- 3. CORE APPLICATION (TRANSACTIONAL)
-- ==========================================================

CREATE TABLE IF NOT EXISTS restaurant_tables (
    id            UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    restaurant_id INT NOT NULL,
    number        VARCHAR(50) NOT NULL,
    FOREIGN KEY (restaurant_id) REFERENCES restaurants(id) ON DELETE CASCADE
);

DO $$ BEGIN
    CREATE TYPE session_status AS ENUM ('active','payment_pending','completed','expired');
EXCEPTION
    WHEN duplicate_object THEN null;
END $$;

CREATE TABLE IF NOT EXISTS sessions (
    id            UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    table_id      UUID NOT NULL,
    restaurant_id INT NOT NULL,
    status        session_status DEFAULT 'active',
    created_at    TIMESTAMPTZ DEFAULT now(),
    expires_at    TIMESTAMPTZ,
    payment_lock      BOOLEAN DEFAULT FALSE,
    payment_locked_by TEXT,
    payment_lock_at   TIMESTAMPTZ,
    FOREIGN KEY (table_id)      REFERENCES restaurant_tables(id),
    FOREIGN KEY (restaurant_id) REFERENCES restaurants(id)
);

DO $$ BEGIN
    CREATE TYPE participant_role AS ENUM ('guest','host');
EXCEPTION
    WHEN duplicate_object THEN null;
END $$;

CREATE TABLE IF NOT EXISTS participants (
    id                 UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    session_id         UUID NOT NULL,
    device_fingerprint VARCHAR(255),
    joined_at          TIMESTAMPTZ DEFAULT now(),
    last_active_at     TIMESTAMPTZ DEFAULT now(),
    role               participant_role DEFAULT 'guest',
    FOREIGN KEY (session_id) REFERENCES sessions(id)
);

CREATE TABLE IF NOT EXISTS carts (
    id         UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    session_id UUID NOT NULL UNIQUE,
    version    INT DEFAULT 1,
    updated_at TIMESTAMPTZ DEFAULT now(),
    FOREIGN KEY (session_id) REFERENCES sessions(id)
);

CREATE TABLE IF NOT EXISTS cart_items (
    id           UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    cart_id      UUID NOT NULL,
    menu_item_id INT NOT NULL,
    quantity     INT DEFAULT 1,
    added_by     UUID,
    notes        TEXT,
    created_at   TIMESTAMPTZ DEFAULT now(),
    FOREIGN KEY (cart_id)      REFERENCES carts(id) ON DELETE CASCADE,
    FOREIGN KEY (menu_item_id) REFERENCES menu(id),
    FOREIGN KEY (added_by)     REFERENCES participants(id)
);

DO $$ BEGIN
    CREATE TYPE order_status AS ENUM ('pending','paid','failed');
EXCEPTION
    WHEN duplicate_object THEN null;
END $$;

CREATE TABLE IF NOT EXISTS orders (
    id             UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    session_id     UUID NOT NULL,
    total_amount   DECIMAL(10,2) NOT NULL,
    status         order_status DEFAULT 'pending',
    transaction_id VARCHAR(255),
    created_at     TIMESTAMPTZ DEFAULT now(),
    FOREIGN KEY (session_id) REFERENCES sessions(id)
);

CREATE TABLE IF NOT EXISTS order_items (
    id            UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    order_id      UUID NOT NULL,
    menu_item_id  INT NOT NULL,
    quantity      INT NOT NULL,
    price_at_time DECIMAL(10,2) NOT NULL,
    FOREIGN KEY (order_id)     REFERENCES orders(id) ON DELETE CASCADE,
    FOREIGN KEY (menu_item_id) REFERENCES menu(id)
);

-- ==========================================================
-- 4. PAYMENTS
-- ==========================================================

DO $$ BEGIN
    CREATE TYPE payment_status AS ENUM ('initiated','success','failed','refunded');
EXCEPTION
    WHEN duplicate_object THEN null;
END $$;

DO $$ BEGIN
    CREATE TYPE payment_method AS ENUM ('upi','card','wallet','net_banking','cash');
EXCEPTION
    WHEN duplicate_object THEN null;
END $$;

CREATE TABLE IF NOT EXISTS payments (
    id                     UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    order_id               UUID NOT NULL,
    participant_id         UUID NOT NULL,
    amount                 DECIMAL(10,2) NOT NULL,
    method                 payment_method NOT NULL,
    status                 payment_status DEFAULT 'initiated',
    gateway_transaction_id VARCHAR(255),
    gateway_response       JSONB,
    created_at             TIMESTAMPTZ DEFAULT now(),
    updated_at             TIMESTAMPTZ DEFAULT now(),
    FOREIGN KEY (order_id)       REFERENCES orders(id) ON DELETE CASCADE,
    FOREIGN KEY (participant_id) REFERENCES participants(id)
);

-- ==========================================================
-- 5. SEED: Cuisines
-- ==========================================================
INSERT INTO cuisines (cuisine) VALUES
  ('North Indian'),('South Indian'),('Chinese'),('Fast Food'),('Biryani'),
  ('Pizza'),('Bakery'),('Street Food'),('Burger'),('Mughlai'),
  ('Momos'),('Sandwich'),('Fresh Veggie'),('Kebab'),('Ice Cream'),
  ('Cafe'),('Healthy Food'),('Italian'),('Continental'),('Lebanese'),
  ('Salad'),('Shawarma'),('Gujarati'),('Andhra'),('Waffle'),
  ('Coffee'),('Rajasthani'),('Wraps'),('Mexican'),('Bengali'),
  ('Sushi'),('Lucknowi'),('Goan'),('Assamese'),('American'),
  ('Mandi'),('Chettinad'),('Mishti'),('Bar Food'),('Malwani'),
  ('Odia'),('Japanese'),('Finger Food'),('Korean'),('North Eastern'),
  ('Thai'),('Steak'),('Frozen Yogurt'),('Panini'),('Parsi'),
  ('Sichuan'),('Iranian'),('Grilled Chicken'),('French'),('Raw Meats'),
  ('Drinks Only'),('Vietnamese'),('Liquor'),('Greek'),('Himachali'),
  ('Bohri'),('Garhwali'),('Cantonese'),('Malaysian'),('Belgian'),
  ('British'),('African'),('Spanish'),('Manipur'),('Egyptian')
ON CONFLICT (cuisine) DO NOTHING;

-- ==========================================================
-- 6. SUPABASE STORAGE (run these manually in Dashboard)
-- ==========================================================
-- 1. Go to Supabase Dashboard → Storage → Create bucket
--    Name: restaurant-media   |  Public: ON
--
-- 2. Add a Storage Policy (allow uploads via service key):
--    INSERT policy: Allowed for service_role
--    SELECT policy: Allowed for everyone (public read)
--
-- These are NOT SQL commands — do them through the Dashboard UI.