141 lines
5.4 KiB
JavaScript
141 lines
5.4 KiB
JavaScript
import pg from 'pg'
|
|
|
|
const { Pool } = pg
|
|
export const pool = new Pool({ connectionString: process.env.DATABASE_URL })
|
|
|
|
export async function initDb() {
|
|
await pool.query(`
|
|
CREATE TABLE IF NOT EXISTS cash_ups (
|
|
id SERIAL PRIMARY KEY,
|
|
session_date DATE NOT NULL UNIQUE,
|
|
created_by TEXT NOT NULL,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
status TEXT NOT NULL DEFAULT 'draft',
|
|
total_float_counted NUMERIC(10,2) NOT NULL DEFAULT 0,
|
|
total_cash_counted NUMERIC(10,2) NOT NULL DEFAULT 0,
|
|
notes TEXT,
|
|
submitted_at TIMESTAMPTZ,
|
|
submitted_by TEXT
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS denominations (
|
|
id SERIAL PRIMARY KEY,
|
|
cash_up_id INTEGER NOT NULL REFERENCES cash_ups(id) ON DELETE CASCADE,
|
|
count_type TEXT NOT NULL DEFAULT 'takings',
|
|
denomination_type TEXT NOT NULL,
|
|
denomination_value NUMERIC(10,2) NOT NULL,
|
|
quantity INTEGER,
|
|
value_entered NUMERIC(10,2),
|
|
total_amount NUMERIC(10,2) NOT NULL
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS card_machines (
|
|
id SERIAL PRIMARY KEY,
|
|
cash_up_id INTEGER NOT NULL REFERENCES cash_ups(id) ON DELETE CASCADE,
|
|
machine_name TEXT NOT NULL,
|
|
total_amount NUMERIC(10,2) NOT NULL DEFAULT 0,
|
|
amex_amount NUMERIC(10,2) NOT NULL DEFAULT 0,
|
|
visa_mc_amount NUMERIC(10,2) NOT NULL DEFAULT 0
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS payment_records (
|
|
id SERIAL PRIMARY KEY,
|
|
cash_up_id INTEGER REFERENCES cash_ups(id) ON DELETE SET NULL,
|
|
newbook_payment_id TEXT,
|
|
booking_id TEXT,
|
|
guest_name TEXT,
|
|
payment_date TIMESTAMPTZ NOT NULL,
|
|
payment_type TEXT,
|
|
payment_method TEXT,
|
|
transaction_method TEXT,
|
|
card_type TEXT,
|
|
amount NUMERIC(10,2) NOT NULL,
|
|
tendered NUMERIC(10,2),
|
|
processed_by TEXT,
|
|
synced_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS reconciliation (
|
|
id SERIAL PRIMARY KEY,
|
|
cash_up_id INTEGER NOT NULL REFERENCES cash_ups(id) ON DELETE CASCADE,
|
|
category TEXT NOT NULL,
|
|
banked_amount NUMERIC(10,2) NOT NULL,
|
|
reported_amount NUMERIC(10,2) NOT NULL,
|
|
variance NUMERIC(10,2) NOT NULL
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS daily_stats (
|
|
id SERIAL PRIMARY KEY,
|
|
business_date DATE NOT NULL UNIQUE,
|
|
gross_sales NUMERIC(10,2) NOT NULL DEFAULT 0,
|
|
debtors_creditors_balance NUMERIC(10,2) NOT NULL DEFAULT 0,
|
|
rooms_sold INTEGER NOT NULL DEFAULT 0,
|
|
total_people INTEGER NOT NULL DEFAULT 0,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
source TEXT NOT NULL DEFAULT 'manual'
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS sales_breakdown (
|
|
id SERIAL PRIMARY KEY,
|
|
business_date DATE NOT NULL,
|
|
category TEXT NOT NULL,
|
|
net_amount NUMERIC(10,2) NOT NULL
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS float_counts (
|
|
id SERIAL PRIMARY KEY,
|
|
count_type TEXT NOT NULL,
|
|
count_date TIMESTAMPTZ NOT NULL,
|
|
created_by TEXT NOT NULL,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
total_counted NUMERIC(10,2) NOT NULL DEFAULT 0,
|
|
total_receipts NUMERIC(10,2) NOT NULL DEFAULT 0,
|
|
target_amount NUMERIC(10,2) NOT NULL DEFAULT 0,
|
|
variance NUMERIC(10,2) NOT NULL DEFAULT 0,
|
|
notes TEXT
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS float_denominations (
|
|
id SERIAL PRIMARY KEY,
|
|
float_count_id INTEGER NOT NULL REFERENCES float_counts(id) ON DELETE CASCADE,
|
|
denomination_value NUMERIC(10,2) NOT NULL,
|
|
quantity INTEGER NOT NULL DEFAULT 0,
|
|
total_amount NUMERIC(10,2) NOT NULL
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS float_receipts (
|
|
id SERIAL PRIMARY KEY,
|
|
float_count_id INTEGER NOT NULL REFERENCES float_counts(id) ON DELETE CASCADE,
|
|
receipt_value NUMERIC(10,2) NOT NULL,
|
|
receipt_description TEXT
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS cash_count_attachments (
|
|
id SERIAL PRIMARY KEY,
|
|
cash_up_id INTEGER NOT NULL REFERENCES cash_ups(id) ON DELETE CASCADE,
|
|
file_name TEXT NOT NULL,
|
|
file_path TEXT NOT NULL,
|
|
file_size BIGINT NOT NULL,
|
|
mime_type TEXT NOT NULL,
|
|
uploaded_by TEXT NOT NULL,
|
|
uploaded_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS settings (
|
|
key TEXT PRIMARY KEY,
|
|
value TEXT NOT NULL
|
|
);
|
|
`)
|
|
|
|
// Seed default settings if not present (Newbook credentials live in the settings service)
|
|
await pool.query(`
|
|
INSERT INTO settings (key, value) VALUES
|
|
('default_report_days', '7'),
|
|
('petty_cash_float', '200.00'),
|
|
('sales_breakdown_columns', '[]'),
|
|
('change_tin_breakdown', '{"50.00":0,"20.00":0,"10.00":0,"5.00":0,"2.00":20,"1.00":20,"0.50":10,"0.20":10,"0.10":5,"0.05":5}')
|
|
ON CONFLICT (key) DO NOTHING
|
|
`)
|
|
}
|