billing frontend for mariadb. setup as otb_billing for outsidethebox.top accounting. also involved with outsidethedb
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.
 
 
 

174 lines
7.1 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',
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;