-- +goose Up CREATE TABLE tasks ( id TEXT PRIMARY KEY, source TEXT NOT NULL CHECK (source IN ('MANUAL', 'EXCEL', 'ERP')), source_ref TEXT, title TEXT NOT NULL, goods_id TEXT NOT NULL, sku_color TEXT NOT NULL, sku_size TEXT NOT NULL, quantity INTEGER NOT NULL CHECK (quantity > 0 AND typeof(quantity) = 'integer'), max_total_price TEXT NOT NULL CHECK ( max_total_price <> '' AND max_total_price NOT GLOB '*[^0-9.]*' AND length(max_total_price) - length(replace(max_total_price, '.', '')) <= 1 AND max_total_price <> '.' AND (instr(max_total_price, '.') = 0 OR ( instr(max_total_price, '.') > 1 AND length(max_total_price) > instr(max_total_price, '.') )) ), reference_asset_id TEXT, status TEXT NOT NULL CHECK (status IN ( 'DRAFT', 'PENDING', 'CLAIMED', 'RUNNING', 'WAITING_CONFIRMATION', 'PENDING_RETRIAL', 'AUTHORIZED', 'ORDERING', 'WAITING_PAYMENT', 'RECONCILIATION_REQUIRED', 'NEEDS_MANUAL', 'SUCCEEDED', 'CANCELED' )), version INTEGER NOT NULL DEFAULT 1 CHECK (version > 0 AND typeof(version) = 'integer'), created_at TEXT NOT NULL, updated_at TEXT NOT NULL ); CREATE TABLE spec_trials ( id TEXT PRIMARY KEY, task_id TEXT NOT NULL REFERENCES tasks(id), attempt INTEGER NOT NULL CHECK (attempt > 0 AND typeof(attempt) = 'integer'), product_title TEXT NOT NULL, selected_color TEXT NOT NULL, selected_size TEXT NOT NULL, unit_price TEXT NOT NULL CHECK ( unit_price <> '' AND unit_price NOT GLOB '*[^0-9.]*' AND length(unit_price) - length(replace(unit_price, '.', '')) <= 1 AND unit_price <> '.' AND (instr(unit_price, '.') = 0 OR ( instr(unit_price, '.') > 1 AND length(unit_price) > instr(unit_price, '.') )) ), total_price TEXT NOT NULL CHECK ( total_price <> '' AND total_price NOT GLOB '*[^0-9.]*' AND length(total_price) - length(replace(total_price, '.', '')) <= 1 AND total_price <> '.' AND (instr(total_price, '.') = 0 OR ( instr(total_price, '.') > 1 AND length(total_price) > instr(total_price, '.') )) ), evidence_sha256 TEXT NOT NULL, created_at TEXT NOT NULL, UNIQUE (task_id, attempt), UNIQUE (task_id, id) ); CREATE TABLE order_authorizations ( id TEXT PRIMARY KEY, task_id TEXT NOT NULL REFERENCES tasks(id), spec_trial_id TEXT NOT NULL REFERENCES spec_trials(id), version INTEGER NOT NULL CHECK (version > 0 AND typeof(version) = 'integer'), goods_id TEXT NOT NULL, sku_color TEXT NOT NULL, sku_size TEXT NOT NULL, quantity INTEGER NOT NULL CHECK (quantity > 0 AND typeof(quantity) = 'integer'), authorized_unit_price TEXT NOT NULL CHECK ( authorized_unit_price <> '' AND authorized_unit_price NOT GLOB '*[^0-9.]*' AND length(authorized_unit_price) - length(replace(authorized_unit_price, '.', '')) <= 1 AND authorized_unit_price <> '.' AND (instr(authorized_unit_price, '.') = 0 OR ( instr(authorized_unit_price, '.') > 1 AND length(authorized_unit_price) > instr(authorized_unit_price, '.') )) ), total_price_cap TEXT NOT NULL CHECK ( total_price_cap <> '' AND total_price_cap NOT GLOB '*[^0-9.]*' AND length(total_price_cap) - length(replace(total_price_cap, '.', '')) <= 1 AND total_price_cap <> '.' AND (instr(total_price_cap, '.') = 0 OR ( instr(total_price_cap, '.') > 1 AND length(total_price_cap) > instr(total_price_cap, '.') )) ), note TEXT, status TEXT NOT NULL CHECK (status IN ( 'PENDING_DELIVERY', 'DELIVERED', 'ACKNOWLEDGED', 'EXECUTING', 'FENCED', 'CONSUMED', 'SUPERSEDED', 'EXPIRED' )), created_by TEXT NOT NULL, created_at TEXT NOT NULL, expires_at TEXT NOT NULL, UNIQUE (task_id, version), UNIQUE (task_id, id), FOREIGN KEY (task_id, spec_trial_id) REFERENCES spec_trials(task_id, id) ); CREATE TABLE order_submissions ( id TEXT PRIMARY KEY, task_id TEXT NOT NULL REFERENCES tasks(id), authorization_id TEXT NOT NULL REFERENCES order_authorizations(id), command_id TEXT NOT NULL, dry_run_id TEXT NOT NULL, status TEXT NOT NULL CHECK (status IN ( 'FENCED', 'SUBMITTED', 'RECONCILIATION_REQUIRED', 'MANUAL_RESOLVED' )), verified_unit_price TEXT NOT NULL CHECK ( verified_unit_price <> '' AND verified_unit_price NOT GLOB '*[^0-9.]*' AND length(verified_unit_price) - length(replace(verified_unit_price, '.', '')) <= 1 AND verified_unit_price <> '.' AND (instr(verified_unit_price, '.') = 0 OR ( instr(verified_unit_price, '.') > 1 AND length(verified_unit_price) > instr(verified_unit_price, '.') )) ), quantity_read INTEGER NOT NULL CHECK (quantity_read > 0 AND typeof(quantity_read) = 'integer'), confirm_page_amount TEXT NOT NULL CHECK ( confirm_page_amount <> '' AND confirm_page_amount NOT GLOB '*[^0-9.]*' AND length(confirm_page_amount) - length(replace(confirm_page_amount, '.', '')) <= 1 AND confirm_page_amount <> '.' AND (instr(confirm_page_amount, '.') = 0 OR ( instr(confirm_page_amount, '.') > 1 AND length(confirm_page_amount) > instr(confirm_page_amount, '.') )) ), created_at TEXT NOT NULL, resolved_at TEXT, UNIQUE (authorization_id), UNIQUE (command_id), FOREIGN KEY (task_id, authorization_id) REFERENCES order_authorizations(task_id, id) ); -- +goose Down DROP TABLE order_submissions; DROP TABLE order_authorizations; DROP TABLE spec_trials; DROP TABLE tasks;