You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
178 lines
7.2 KiB
178 lines
7.2 KiB
CREATE DATABASE IF NOT EXISTS otb_billing |
|
CHARACTER SET utf8mb4 |
|
COLLATE utf8mb4_unicode_ci; |
|
|
|
USE otb_billing; |
|
|
|
SET FOREIGN_KEY_CHECKS=0; |
|
|
|
DROP TABLE IF EXISTS audit_log; |
|
DROP TABLE IF EXISTS payments; |
|
DROP TABLE IF EXISTS invoice_items; |
|
DROP TABLE IF EXISTS invoices; |
|
DROP TABLE IF EXISTS services; |
|
DROP TABLE IF EXISTS clients; |
|
|
|
SET FOREIGN_KEY_CHECKS=1; |
|
|
|
CREATE TABLE clients ( |
|
id INT UNSIGNED NOT NULL AUTO_INCREMENT, |
|
client_code VARCHAR(50) NOT NULL, |
|
company_name VARCHAR(255) NOT NULL, |
|
contact_name VARCHAR(255) DEFAULT NULL, |
|
email VARCHAR(255) DEFAULT NULL, |
|
phone VARCHAR(50) DEFAULT NULL, |
|
status ENUM('lead','active','inactive','suspended') NOT NULL DEFAULT 'active', |
|
notes TEXT DEFAULT NULL, |
|
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
|
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, |
|
PRIMARY KEY (id), |
|
UNIQUE KEY uq_clients_client_code (client_code), |
|
KEY idx_clients_company_name (company_name), |
|
KEY idx_clients_status (status) |
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; |
|
|
|
CREATE TABLE services ( |
|
id INT UNSIGNED NOT NULL AUTO_INCREMENT, |
|
client_id INT UNSIGNED NOT NULL, |
|
service_code VARCHAR(50) NOT NULL, |
|
service_name VARCHAR(255) NOT NULL, |
|
service_type ENUM('hosting','rpc','explorer','node','ipfs','consulting','other') NOT NULL DEFAULT 'other', |
|
billing_cycle ENUM('one_time','monthly','quarterly','yearly','manual') NOT NULL DEFAULT 'monthly', |
|
status ENUM('pending','active','suspended','cancelled') NOT NULL DEFAULT 'pending', |
|
currency_code VARCHAR(16) NOT NULL DEFAULT 'CAD', |
|
recurring_amount DECIMAL(18,8) NOT NULL DEFAULT 0.00000000, |
|
start_date DATE DEFAULT NULL, |
|
end_date DATE DEFAULT NULL, |
|
description TEXT DEFAULT NULL, |
|
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
|
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, |
|
PRIMARY KEY (id), |
|
UNIQUE KEY uq_services_service_code (service_code), |
|
KEY idx_services_client_id (client_id), |
|
KEY idx_services_status (status), |
|
CONSTRAINT fk_services_client |
|
FOREIGN KEY (client_id) REFERENCES clients(id) |
|
ON DELETE RESTRICT |
|
ON UPDATE CASCADE |
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; |
|
|
|
CREATE TABLE invoices ( |
|
id INT UNSIGNED NOT NULL AUTO_INCREMENT, |
|
client_id INT UNSIGNED NOT NULL, |
|
service_id INT UNSIGNED DEFAULT NULL, |
|
invoice_number VARCHAR(50) NOT NULL, |
|
currency_code VARCHAR(16) NOT NULL DEFAULT 'CAD', |
|
subtotal_amount DECIMAL(18,8) NOT NULL DEFAULT 0.00000000, |
|
tax_amount DECIMAL(18,8) NOT NULL DEFAULT 0.00000000, |
|
total_amount DECIMAL(18,8) NOT NULL DEFAULT 0.00000000, |
|
amount_paid DECIMAL(18,8) NOT NULL DEFAULT 0.00000000, |
|
status ENUM('draft','pending','paid','partial','overdue','cancelled') NOT NULL DEFAULT 'draft', |
|
quote_fiat_amount DECIMAL(18,8) DEFAULT NULL, |
|
quote_fiat_currency VARCHAR(16) DEFAULT NULL, |
|
quote_expires_at DATETIME DEFAULT NULL, |
|
oracle_snapshot LONGTEXT DEFAULT NULL, |
|
issued_at DATETIME DEFAULT NULL, |
|
due_at DATETIME DEFAULT NULL, |
|
paid_at DATETIME DEFAULT NULL, |
|
notes TEXT DEFAULT NULL, |
|
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
|
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, |
|
PRIMARY KEY (id), |
|
UNIQUE KEY uq_invoices_invoice_number (invoice_number), |
|
KEY idx_invoices_client_id (client_id), |
|
KEY idx_invoices_service_id (service_id), |
|
KEY idx_invoices_status (status), |
|
KEY idx_invoices_due_at (due_at), |
|
CONSTRAINT fk_invoices_client |
|
FOREIGN KEY (client_id) REFERENCES clients(id) |
|
ON DELETE RESTRICT |
|
ON UPDATE CASCADE, |
|
CONSTRAINT fk_invoices_service |
|
FOREIGN KEY (service_id) REFERENCES services(id) |
|
ON DELETE SET NULL |
|
ON UPDATE CASCADE |
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; |
|
|
|
CREATE TABLE invoice_items ( |
|
id INT UNSIGNED NOT NULL AUTO_INCREMENT, |
|
invoice_id INT UNSIGNED NOT NULL, |
|
line_number INT UNSIGNED NOT NULL DEFAULT 1, |
|
item_type ENUM('service','setup','credit','discount','manual','other') NOT NULL DEFAULT 'service', |
|
description VARCHAR(255) NOT NULL, |
|
quantity DECIMAL(18,4) NOT NULL DEFAULT 1.0000, |
|
unit_amount DECIMAL(18,8) NOT NULL DEFAULT 0.00000000, |
|
line_total DECIMAL(18,8) NOT NULL DEFAULT 0.00000000, |
|
currency_code VARCHAR(16) NOT NULL DEFAULT 'CAD', |
|
service_id INT UNSIGNED DEFAULT NULL, |
|
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
|
PRIMARY KEY (id), |
|
KEY idx_invoice_items_invoice_id (invoice_id), |
|
KEY idx_invoice_items_service_id (service_id), |
|
CONSTRAINT fk_invoice_items_invoice |
|
FOREIGN KEY (invoice_id) REFERENCES invoices(id) |
|
ON DELETE CASCADE |
|
ON UPDATE CASCADE, |
|
CONSTRAINT fk_invoice_items_service |
|
FOREIGN KEY (service_id) REFERENCES services(id) |
|
ON DELETE SET NULL |
|
ON UPDATE CASCADE |
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; |
|
|
|
CREATE TABLE payments ( |
|
id INT UNSIGNED NOT NULL AUTO_INCREMENT, |
|
invoice_id INT UNSIGNED NOT NULL, |
|
client_id INT UNSIGNED NOT NULL, |
|
payment_method ENUM( |
|
'square', |
|
'etransfer', |
|
'crypto_etho', |
|
'crypto_egaz', |
|
'crypto_alt', |
|
'cash', |
|
'other' |
|
) NOT NULL, |
|
payment_currency VARCHAR(16) NOT NULL, |
|
payment_amount DECIMAL(18,8) NOT NULL DEFAULT 0.00000000, |
|
cad_value_at_payment DECIMAL(18,8) DEFAULT NULL, |
|
exchange_rate_note VARCHAR(255) DEFAULT NULL, |
|
reference VARCHAR(255) DEFAULT NULL, |
|
sender_name VARCHAR(255) DEFAULT NULL, |
|
txid VARCHAR(255) DEFAULT NULL, |
|
wallet_address VARCHAR(255) DEFAULT NULL, |
|
confirmations INT UNSIGNED DEFAULT NULL, |
|
confirmation_required INT UNSIGNED DEFAULT NULL, |
|
payment_status ENUM('pending','confirmed','failed','reversed') NOT NULL DEFAULT 'confirmed', |
|
received_at DATETIME DEFAULT NULL, |
|
notes TEXT DEFAULT NULL, |
|
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
|
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, |
|
PRIMARY KEY (id), |
|
KEY idx_payments_invoice_id (invoice_id), |
|
KEY idx_payments_client_id (client_id), |
|
KEY idx_payments_method (payment_method), |
|
KEY idx_payments_status (payment_status), |
|
KEY idx_payments_txid (txid), |
|
CONSTRAINT fk_payments_invoice |
|
FOREIGN KEY (invoice_id) REFERENCES invoices(id) |
|
ON DELETE RESTRICT |
|
ON UPDATE CASCADE, |
|
CONSTRAINT fk_payments_client |
|
FOREIGN KEY (client_id) REFERENCES clients(id) |
|
ON DELETE RESTRICT |
|
ON UPDATE CASCADE |
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; |
|
|
|
CREATE TABLE audit_log ( |
|
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, |
|
entity_type ENUM('client','service','invoice','payment','system') NOT NULL, |
|
entity_id INT UNSIGNED DEFAULT NULL, |
|
action VARCHAR(100) NOT NULL, |
|
actor VARCHAR(100) NOT NULL DEFAULT 'system', |
|
details TEXT DEFAULT NULL, |
|
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
|
PRIMARY KEY (id), |
|
KEY idx_audit_entity (entity_type, entity_id), |
|
KEY idx_audit_action (action), |
|
KEY idx_audit_created_at (created_at) |
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|