Introduces a new database layer to persist CSV transaction data in MariaDB, enabling both invoicing and sales reporting queries. This replaces the previous file-to-file-only processing. Changes: - Add sqlx, tokio, toml, anyhow, bigdecimal dependencies to Cargo.toml - Create config module for TOML-based configuration (database credentials) - Create db module with connection pool, models, and repository - Create commands module with 'import' subcommand for CSV ingestion - Refactor main.rs to use subcommand architecture (import/generate) - Add migration SQL file for manual database schema creation Schema (3 tables): - customers: customer_number, card_report_group (1=fleet, 3/4=retail) - cards: card_number, card_type, customer_id (nullable for anonymous) - transactions: full transaction data with FK to cards/customers Usage: cargo run -- import <csv-file> # Import to database cargo run -- generate <csv> <dir> # Generate HTML invoices (unchanged) Configuration: cp config.example.toml config.toml # Edit with database credentials mysql < migrations/001_initial_schema.sql # Create database first
53 lines
2.1 KiB
SQL
53 lines
2.1 KiB
SQL
-- Initial schema for rusty-petroleum
|
|
-- Run this against your MariaDB database before importing data
|
|
|
|
CREATE DATABASE IF NOT EXISTS rusty_petroleum;
|
|
USE rusty_petroleum;
|
|
|
|
CREATE TABLE IF NOT EXISTS customers (
|
|
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
|
customer_number VARCHAR(50) NOT NULL UNIQUE,
|
|
card_report_group TINYINT UNSIGNED NOT NULL DEFAULT 0,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
INDEX idx_customer_number (customer_number)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
CREATE TABLE IF NOT EXISTS cards (
|
|
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
|
card_number VARCHAR(50) NOT NULL UNIQUE,
|
|
card_type VARCHAR(50),
|
|
customer_id INT UNSIGNED NULL,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
INDEX idx_card_number (card_number),
|
|
INDEX idx_customer_id (customer_id),
|
|
FOREIGN KEY (customer_id) REFERENCES customers(id) ON DELETE SET NULL
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
CREATE TABLE IF NOT EXISTS transactions (
|
|
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
|
transaction_date DATETIME NOT NULL,
|
|
batch_number VARCHAR(20) NOT NULL,
|
|
amount DECIMAL(10,2) NOT NULL,
|
|
volume DECIMAL(10,3) NOT NULL,
|
|
price DECIMAL(8,4) NOT NULL,
|
|
quality_code INT NOT NULL,
|
|
quality_name VARCHAR(50) NOT NULL,
|
|
station VARCHAR(20) NOT NULL,
|
|
terminal VARCHAR(10) NOT NULL,
|
|
pump VARCHAR(10) NOT NULL,
|
|
receipt VARCHAR(20) NOT NULL,
|
|
control_number VARCHAR(20),
|
|
card_id INT UNSIGNED NOT NULL,
|
|
customer_id INT UNSIGNED NULL,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
INDEX idx_transaction_date (transaction_date),
|
|
INDEX idx_batch_number (batch_number),
|
|
INDEX idx_card_id (card_id),
|
|
INDEX idx_customer_id (customer_id),
|
|
INDEX idx_station (station),
|
|
FOREIGN KEY (card_id) REFERENCES cards(id),
|
|
FOREIGN KEY (customer_id) REFERENCES customers(id) ON DELETE SET NULL
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|