93 lines
3.0 KiB
SQL
93 lines
3.0 KiB
SQL
CREATE DATABASE IF NOT EXISTS argent_shard_01
|
|
CHARACTER SET utf8mb4 COLLATE utf8mb4_uca1400_ai_ci;
|
|
USE argent_shard_01;
|
|
|
|
CREATE TABLE ledger_statuses (
|
|
status_id TINYINT PRIMARY KEY,
|
|
name VARCHAR(20) UNIQUE NOT NULL
|
|
);
|
|
|
|
CREATE TABLE ledger (
|
|
entry_id BINARY(16) NOT NULL,
|
|
batch_id BINARY(16) NOT NULL,
|
|
user_id BINARY(16) NOT NULL,
|
|
group_id BINARY(16) DEFAULT NULL,
|
|
category_id INT,
|
|
amount DECIMAL(15, 2) NOT NULL,
|
|
currency_code CHAR(3) NOT NULL,
|
|
description VARCHAR(255),
|
|
status_id TINYINT DEFAULT '1',
|
|
created_at DATETIME NOT NULL,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
|
|
PRIMARY KEY (user_id, entry_id),
|
|
FOREIGN KEY (status_id) REFERENCES ledger_statuses(status_id),
|
|
INDEX (batch_id),
|
|
INDEX (group_id),
|
|
INDEX (status_id)
|
|
);
|
|
|
|
CREATE TABLE user_balances (
|
|
user_id BINARY(16) NOT NULL,
|
|
currency_code CHAR(3) NOT NULL,
|
|
total_confirmed DECIMAL(15, 2) DEFAULT 0.00,
|
|
total_pending DECIMAL(15, 2) DEFAULT 0.00,
|
|
PRIMARY KEY (user_id, currency_code)
|
|
);
|
|
|
|
INSERT INTO ledger_statuses (status_id, name) VALUES
|
|
(1, 'proposed'),
|
|
(2, 'ratified'),
|
|
(3, 'disputed'),
|
|
(4, 'settled');
|
|
|
|
DELIMITER //
|
|
CREATE TRIGGER after_ledger_insert
|
|
AFTER INSERT ON ledger
|
|
FOR EACH ROW
|
|
BEGIN
|
|
IF NEW.status_id = 1 THEN
|
|
UPDATE user_balances
|
|
SET total_pending = total_pending + NEW.amount
|
|
WHERE user_id = NEW.user_id AND currency_code = NEW.currency_code;
|
|
ELSEIF NEW.status_id IN (2, 4) THEN
|
|
UPDATE user_balances
|
|
SET total_confirmed = total_confirmed + NEW.amount
|
|
WHERE user_id = NEW.user_id AND currency_code = NEW.currency_code;
|
|
END IF;
|
|
END //
|
|
CREATE TRIGGER after_ledger_update
|
|
AFTER UPDATE ON ledger
|
|
FOR EACH ROW
|
|
BEGIN
|
|
IF OLD.status_id = 1 THEN
|
|
UPDATE user_balances SET total_pending = total_pending - OLD.amount
|
|
WHERE user_id = OLD.user_id AND currency_code = OLD.currency_code;
|
|
ELSEIF OLD.status_id IN (2, 4) THEN
|
|
UPDATE user_balances SET total_confirmed = total_confirmed - OLD.amount
|
|
WHERE user_id = OLD.user_id AND currency_code = OLD.currency_code;
|
|
END IF;
|
|
IF NEW.status_id = 1 THEN
|
|
UPDATE user_balances SET total_pending = total_pending + NEW.amount
|
|
WHERE user_id = NEW.user_id AND currency_code = NEW.currency_code;
|
|
ELSEIF NEW.status_id IN (2, 4) THEN
|
|
UPDATE user_balances SET total_confirmed = total_confirmed + NEW.amount
|
|
WHERE user_id = NEW.user_id AND currency_code = NEW.currency_code;
|
|
END IF;
|
|
END //
|
|
CREATE TRIGGER after_ledger_delete
|
|
AFTER DELETE ON ledger
|
|
FOR EACH ROW
|
|
BEGIN
|
|
IF OLD.status_id = 1 THEN
|
|
UPDATE user_balances SET total_pending = total_pending - OLD.amount
|
|
WHERE user_id = OLD.user_id AND currency_code = OLD.currency_code;
|
|
ELSEIF OLD.status_id IN (2, 4) THEN
|
|
UPDATE user_balances SET total_confirmed = total_confirmed - OLD.amount
|
|
WHERE user_id = OLD.user_id AND currency_code = OLD.currency_code;
|
|
END IF;
|
|
END //
|
|
DELIMITER ;
|
|
|
|
|