<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
final class Version20260621000000 extends AbstractMigration
{
public function getDescription(): string
{
return 'Rebuild settlement and withdrawal accounting model';
}
public function up(Schema $schema): void
{
$this->addSql('DROP TABLE IF EXISTS receive_account');
$this->addSql('CREATE TABLE receive_account (id INT AUTO_INCREMENT NOT NULL, merchant_user_id INT DEFAULT NULL, proxy_user_id INT DEFAULT NULL, owner_type VARCHAR(20) NOT NULL, account_type VARCHAR(20) NOT NULL, account_name VARCHAR(80) NOT NULL, real_name VARCHAR(80) DEFAULT NULL, account_no VARCHAR(160) NOT NULL, bank_name VARCHAR(120) DEFAULT NULL, bank_branch VARCHAR(160) DEFAULT NULL, corporate TINYINT(1) NOT NULL, enabled TINYINT(1) NOT NULL, is_default TINYINT(1) NOT NULL, remark LONGTEXT DEFAULT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, INDEX IDX_RECEIVE_ACCOUNT_OWNER (owner_type, merchant_user_id, proxy_user_id), INDEX IDX_RECEIVE_ACCOUNT_TYPE (account_type, enabled, is_default), INDEX IDX_RECEIVE_ACCOUNT_MERCHANT (merchant_user_id), INDEX IDX_RECEIVE_ACCOUNT_PROXY (proxy_user_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB');
$this->addSql('ALTER TABLE receive_account ADD CONSTRAINT FK_RECEIVE_ACCOUNT_MERCHANT FOREIGN KEY (merchant_user_id) REFERENCES merchant_user (id)');
$this->addSql('ALTER TABLE receive_account ADD CONSTRAINT FK_RECEIVE_ACCOUNT_PROXY FOREIGN KEY (proxy_user_id) REFERENCES proxy_user (id)');
$this->addSql('CREATE TABLE owner_balance (id INT AUTO_INCREMENT NOT NULL, merchant_user_id INT DEFAULT NULL, proxy_user_id INT DEFAULT NULL, owner_type VARCHAR(20) NOT NULL, available_amount INT NOT NULL, frozen_amount INT NOT NULL, total_settled_amount INT NOT NULL, total_withdrawn_amount INT NOT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, UNIQUE INDEX UNIQ_OWNER_BALANCE_OWNER (owner_type, merchant_user_id, proxy_user_id), INDEX IDX_OWNER_BALANCE_OWNER (owner_type, merchant_user_id, proxy_user_id), INDEX IDX_OWNER_BALANCE_MERCHANT (merchant_user_id), INDEX IDX_OWNER_BALANCE_PROXY (proxy_user_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB');
$this->addSql('ALTER TABLE owner_balance ADD CONSTRAINT FK_OWNER_BALANCE_MERCHANT FOREIGN KEY (merchant_user_id) REFERENCES merchant_user (id)');
$this->addSql('ALTER TABLE owner_balance ADD CONSTRAINT FK_OWNER_BALANCE_PROXY FOREIGN KEY (proxy_user_id) REFERENCES proxy_user (id)');
$this->addSql('CREATE TABLE settlement_batch (id INT AUTO_INCREMENT NOT NULL, created_by_id INT DEFAULT NULL, batch_no VARCHAR(64) NOT NULL, name VARCHAR(80) NOT NULL, manual_settlement TINYINT(1) NOT NULL, include_pending_ledgers TINYINT(1) NOT NULL, advance_settlement TINYINT(1) NOT NULL, advance_ledger_count INT NOT NULL, total_amount INT NOT NULL, item_count INT NOT NULL, status VARCHAR(30) NOT NULL, remark LONGTEXT DEFAULT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, completed_at DATETIME DEFAULT NULL, UNIQUE INDEX UNIQ_SETTLEMENT_BATCH_NO (batch_no), INDEX IDX_SETTLEMENT_BATCH_STATUS (status, created_at), INDEX IDX_SETTLEMENT_BATCH_CREATED_BY (created_by_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB');
$this->addSql('ALTER TABLE settlement_batch ADD CONSTRAINT FK_SETTLEMENT_BATCH_CREATED_BY FOREIGN KEY (created_by_id) REFERENCES user (id)');
$this->addSql('CREATE TABLE settlement_item (id INT AUTO_INCREMENT NOT NULL, settlement_batch_id INT NOT NULL, account_ledger_id INT NOT NULL, merchant_user_id INT DEFAULT NULL, proxy_user_id INT DEFAULT NULL, owner_type VARCHAR(20) NOT NULL, amount INT NOT NULL, created_at DATETIME NOT NULL, INDEX IDX_SETTLEMENT_ITEM_BATCH (settlement_batch_id), INDEX IDX_SETTLEMENT_ITEM_LEDGER (account_ledger_id), INDEX IDX_SETTLEMENT_ITEM_OWNER (owner_type, merchant_user_id, proxy_user_id), INDEX IDX_SETTLEMENT_ITEM_MERCHANT (merchant_user_id), INDEX IDX_SETTLEMENT_ITEM_PROXY (proxy_user_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB');
$this->addSql('ALTER TABLE settlement_item ADD CONSTRAINT FK_SETTLEMENT_ITEM_BATCH FOREIGN KEY (settlement_batch_id) REFERENCES settlement_batch (id)');
$this->addSql('ALTER TABLE settlement_item ADD CONSTRAINT FK_SETTLEMENT_ITEM_LEDGER FOREIGN KEY (account_ledger_id) REFERENCES account_ledger (id)');
$this->addSql('ALTER TABLE settlement_item ADD CONSTRAINT FK_SETTLEMENT_ITEM_MERCHANT FOREIGN KEY (merchant_user_id) REFERENCES merchant_user (id)');
$this->addSql('ALTER TABLE settlement_item ADD CONSTRAINT FK_SETTLEMENT_ITEM_PROXY FOREIGN KEY (proxy_user_id) REFERENCES proxy_user (id)');
$this->addSql('CREATE TABLE withdraw_policy (id INT AUTO_INCREMENT NOT NULL, proxy_user_id INT DEFAULT NULL, merchant_user_id INT DEFAULT NULL, default_pay_channel_id INT DEFAULT NULL, name VARCHAR(80) NOT NULL, scope_type VARCHAR(20) NOT NULL, mode VARCHAR(20) NOT NULL, allow_manual_channel TINYINT(1) NOT NULL, allow_offline TINYINT(1) NOT NULL, enabled TINYINT(1) NOT NULL, min_amount INT NOT NULL, max_amount INT NOT NULL, daily_count_limit INT NOT NULL, daily_amount_limit INT NOT NULL, remark LONGTEXT DEFAULT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, INDEX IDX_WITHDRAW_POLICY_LOOKUP (scope_type, enabled, merchant_user_id, proxy_user_id), INDEX IDX_WITHDRAW_POLICY_PROXY (proxy_user_id), INDEX IDX_WITHDRAW_POLICY_MERCHANT (merchant_user_id), INDEX IDX_WITHDRAW_POLICY_CHANNEL (default_pay_channel_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB');
$this->addSql('ALTER TABLE withdraw_policy ADD CONSTRAINT FK_WITHDRAW_POLICY_PROXY FOREIGN KEY (proxy_user_id) REFERENCES proxy_user (id)');
$this->addSql('ALTER TABLE withdraw_policy ADD CONSTRAINT FK_WITHDRAW_POLICY_MERCHANT FOREIGN KEY (merchant_user_id) REFERENCES merchant_user (id)');
$this->addSql('ALTER TABLE withdraw_policy ADD CONSTRAINT FK_WITHDRAW_POLICY_CHANNEL FOREIGN KEY (default_pay_channel_id) REFERENCES pay_channel (id)');
$this->addSql('CREATE TABLE withdraw_order (id INT AUTO_INCREMENT NOT NULL, merchant_user_id INT DEFAULT NULL, proxy_user_id INT DEFAULT NULL, owner_balance_id INT DEFAULT NULL, receive_account_id INT DEFAULT NULL, withdraw_policy_id INT DEFAULT NULL, pay_channel_id INT DEFAULT NULL, payment_provider_id INT DEFAULT NULL, routing_policy_id INT DEFAULT NULL, created_by_id INT DEFAULT NULL, processed_by_id INT DEFAULT NULL, withdraw_no VARCHAR(64) NOT NULL, owner_type VARCHAR(20) NOT NULL, receiver_type VARCHAR(20) NOT NULL, receiver_snapshot JSON DEFAULT NULL, amount INT NOT NULL, status VARCHAR(30) NOT NULL, process_mode VARCHAR(20) DEFAULT NULL, offline_transfer_no VARCHAR(128) DEFAULT NULL, remark LONGTEXT DEFAULT NULL, failed_reason LONGTEXT DEFAULT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, submitted_at DATETIME DEFAULT NULL, completed_at DATETIME DEFAULT NULL, UNIQUE INDEX UNIQ_WITHDRAW_ORDER_NO (withdraw_no), INDEX IDX_WITHDRAW_ORDER_OWNER (owner_type, merchant_user_id, proxy_user_id), INDEX IDX_WITHDRAW_ORDER_STATUS (status, created_at), INDEX IDX_WITHDRAW_ORDER_MERCHANT (merchant_user_id), INDEX IDX_WITHDRAW_ORDER_PROXY (proxy_user_id), INDEX IDX_WITHDRAW_ORDER_BALANCE (owner_balance_id), INDEX IDX_WITHDRAW_ORDER_ACCOUNT (receive_account_id), INDEX IDX_WITHDRAW_ORDER_POLICY (withdraw_policy_id), INDEX IDX_WITHDRAW_ORDER_CHANNEL (pay_channel_id), INDEX IDX_WITHDRAW_ORDER_PROVIDER (payment_provider_id), INDEX IDX_WITHDRAW_ORDER_ROUTING (routing_policy_id), INDEX IDX_WITHDRAW_ORDER_CREATED_BY (created_by_id), INDEX IDX_WITHDRAW_ORDER_PROCESSED_BY (processed_by_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB');
$this->addSql('ALTER TABLE withdraw_order ADD CONSTRAINT FK_WITHDRAW_ORDER_MERCHANT FOREIGN KEY (merchant_user_id) REFERENCES merchant_user (id)');
$this->addSql('ALTER TABLE withdraw_order ADD CONSTRAINT FK_WITHDRAW_ORDER_PROXY FOREIGN KEY (proxy_user_id) REFERENCES proxy_user (id)');
$this->addSql('ALTER TABLE withdraw_order ADD CONSTRAINT FK_WITHDRAW_ORDER_BALANCE FOREIGN KEY (owner_balance_id) REFERENCES owner_balance (id)');
$this->addSql('ALTER TABLE withdraw_order ADD CONSTRAINT FK_WITHDRAW_ORDER_ACCOUNT FOREIGN KEY (receive_account_id) REFERENCES receive_account (id)');
$this->addSql('ALTER TABLE withdraw_order ADD CONSTRAINT FK_WITHDRAW_ORDER_POLICY FOREIGN KEY (withdraw_policy_id) REFERENCES withdraw_policy (id)');
$this->addSql('ALTER TABLE withdraw_order ADD CONSTRAINT FK_WITHDRAW_ORDER_CHANNEL FOREIGN KEY (pay_channel_id) REFERENCES pay_channel (id)');
$this->addSql('ALTER TABLE withdraw_order ADD CONSTRAINT FK_WITHDRAW_ORDER_PROVIDER FOREIGN KEY (payment_provider_id) REFERENCES payment_provider (id)');
$this->addSql('ALTER TABLE withdraw_order ADD CONSTRAINT FK_WITHDRAW_ORDER_ROUTING FOREIGN KEY (routing_policy_id) REFERENCES channel_routing_policy (id)');
$this->addSql('ALTER TABLE withdraw_order ADD CONSTRAINT FK_WITHDRAW_ORDER_CREATED_BY FOREIGN KEY (created_by_id) REFERENCES user (id)');
$this->addSql('ALTER TABLE withdraw_order ADD CONSTRAINT FK_WITHDRAW_ORDER_PROCESSED_BY FOREIGN KEY (processed_by_id) REFERENCES user (id)');
$this->addSql('CREATE TABLE withdraw_attempt (id INT AUTO_INCREMENT NOT NULL, withdraw_order_id INT NOT NULL, merchant_user_id INT DEFAULT NULL, proxy_user_id INT DEFAULT NULL, pay_channel_id INT DEFAULT NULL, payment_provider_id INT DEFAULT NULL, routing_policy_id INT DEFAULT NULL, attempt_no VARCHAR(64) NOT NULL, owner_type VARCHAR(20) NOT NULL, amount INT NOT NULL, receiver_type VARCHAR(20) NOT NULL, receiver_snapshot JSON DEFAULT NULL, channel_transfer_no VARCHAR(128) DEFAULT NULL, status VARCHAR(30) NOT NULL, failed_reason LONGTEXT DEFAULT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, success_at DATETIME DEFAULT NULL, UNIQUE INDEX UNIQ_WITHDRAW_ATTEMPT_NO (attempt_no), INDEX IDX_WITHDRAW_ATTEMPT_STATUS (status, created_at), INDEX IDX_WITHDRAW_ATTEMPT_ORDER (withdraw_order_id), INDEX IDX_WITHDRAW_ATTEMPT_MERCHANT (merchant_user_id), INDEX IDX_WITHDRAW_ATTEMPT_PROXY (proxy_user_id), INDEX IDX_WITHDRAW_ATTEMPT_CHANNEL (pay_channel_id), INDEX IDX_WITHDRAW_ATTEMPT_PROVIDER (payment_provider_id), INDEX IDX_WITHDRAW_ATTEMPT_ROUTING (routing_policy_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB');
$this->addSql('ALTER TABLE withdraw_attempt ADD CONSTRAINT FK_WITHDRAW_ATTEMPT_ORDER FOREIGN KEY (withdraw_order_id) REFERENCES withdraw_order (id)');
$this->addSql('ALTER TABLE withdraw_attempt ADD CONSTRAINT FK_WITHDRAW_ATTEMPT_MERCHANT FOREIGN KEY (merchant_user_id) REFERENCES merchant_user (id)');
$this->addSql('ALTER TABLE withdraw_attempt ADD CONSTRAINT FK_WITHDRAW_ATTEMPT_PROXY FOREIGN KEY (proxy_user_id) REFERENCES proxy_user (id)');
$this->addSql('ALTER TABLE withdraw_attempt ADD CONSTRAINT FK_WITHDRAW_ATTEMPT_CHANNEL FOREIGN KEY (pay_channel_id) REFERENCES pay_channel (id)');
$this->addSql('ALTER TABLE withdraw_attempt ADD CONSTRAINT FK_WITHDRAW_ATTEMPT_PROVIDER FOREIGN KEY (payment_provider_id) REFERENCES payment_provider (id)');
$this->addSql('ALTER TABLE withdraw_attempt ADD CONSTRAINT FK_WITHDRAW_ATTEMPT_ROUTING FOREIGN KEY (routing_policy_id) REFERENCES channel_routing_policy (id)');
$this->addSql('CREATE TABLE balance_ledger (id INT AUTO_INCREMENT NOT NULL, owner_balance_id INT NOT NULL, merchant_user_id INT DEFAULT NULL, proxy_user_id INT DEFAULT NULL, settlement_batch_id INT DEFAULT NULL, withdraw_order_id INT DEFAULT NULL, owner_type VARCHAR(20) NOT NULL, biz_type VARCHAR(30) NOT NULL, direction VARCHAR(20) NOT NULL, amount INT NOT NULL, available_before INT NOT NULL, available_after INT NOT NULL, frozen_before INT NOT NULL, frozen_after INT NOT NULL, remark LONGTEXT DEFAULT NULL, created_at DATETIME NOT NULL, INDEX IDX_BALANCE_LEDGER_OWNER (owner_type, merchant_user_id, proxy_user_id), INDEX IDX_BALANCE_LEDGER_BIZ (biz_type, created_at), INDEX IDX_BALANCE_LEDGER_BALANCE (owner_balance_id), INDEX IDX_BALANCE_LEDGER_MERCHANT (merchant_user_id), INDEX IDX_BALANCE_LEDGER_PROXY (proxy_user_id), INDEX IDX_BALANCE_LEDGER_BATCH (settlement_batch_id), INDEX IDX_BALANCE_LEDGER_WITHDRAW (withdraw_order_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB');
$this->addSql('ALTER TABLE balance_ledger ADD CONSTRAINT FK_BALANCE_LEDGER_BALANCE FOREIGN KEY (owner_balance_id) REFERENCES owner_balance (id)');
$this->addSql('ALTER TABLE balance_ledger ADD CONSTRAINT FK_BALANCE_LEDGER_MERCHANT FOREIGN KEY (merchant_user_id) REFERENCES merchant_user (id)');
$this->addSql('ALTER TABLE balance_ledger ADD CONSTRAINT FK_BALANCE_LEDGER_PROXY FOREIGN KEY (proxy_user_id) REFERENCES proxy_user (id)');
$this->addSql('ALTER TABLE balance_ledger ADD CONSTRAINT FK_BALANCE_LEDGER_BATCH FOREIGN KEY (settlement_batch_id) REFERENCES settlement_batch (id)');
$this->addSql('ALTER TABLE balance_ledger ADD CONSTRAINT FK_BALANCE_LEDGER_WITHDRAW FOREIGN KEY (withdraw_order_id) REFERENCES withdraw_order (id)');
}
public function down(Schema $schema): void
{
$this->addSql('DROP TABLE IF EXISTS balance_ledger');
$this->addSql('DROP TABLE IF EXISTS withdraw_attempt');
$this->addSql('DROP TABLE IF EXISTS withdraw_order');
$this->addSql('DROP TABLE IF EXISTS withdraw_policy');
$this->addSql('DROP TABLE IF EXISTS settlement_item');
$this->addSql('DROP TABLE IF EXISTS settlement_batch');
$this->addSql('DROP TABLE IF EXISTS owner_balance');
$this->addSql('DROP TABLE IF EXISTS receive_account');
}
}