migrations/Version20260621000000.php line 1

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace DoctrineMigrations;
  4. use Doctrine\DBAL\Schema\Schema;
  5. use Doctrine\Migrations\AbstractMigration;
  6. final class Version20260621000000 extends AbstractMigration
  7. {
  8.     public function getDescription(): string
  9.     {
  10.         return 'Rebuild settlement and withdrawal accounting model';
  11.     }
  12.     public function up(Schema $schema): void
  13.     {
  14.         $this->addSql('DROP TABLE IF EXISTS receive_account');
  15.         $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');
  16.         $this->addSql('ALTER TABLE receive_account ADD CONSTRAINT FK_RECEIVE_ACCOUNT_MERCHANT FOREIGN KEY (merchant_user_id) REFERENCES merchant_user (id)');
  17.         $this->addSql('ALTER TABLE receive_account ADD CONSTRAINT FK_RECEIVE_ACCOUNT_PROXY FOREIGN KEY (proxy_user_id) REFERENCES proxy_user (id)');
  18.         $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');
  19.         $this->addSql('ALTER TABLE owner_balance ADD CONSTRAINT FK_OWNER_BALANCE_MERCHANT FOREIGN KEY (merchant_user_id) REFERENCES merchant_user (id)');
  20.         $this->addSql('ALTER TABLE owner_balance ADD CONSTRAINT FK_OWNER_BALANCE_PROXY FOREIGN KEY (proxy_user_id) REFERENCES proxy_user (id)');
  21.         $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');
  22.         $this->addSql('ALTER TABLE settlement_batch ADD CONSTRAINT FK_SETTLEMENT_BATCH_CREATED_BY FOREIGN KEY (created_by_id) REFERENCES user (id)');
  23.         $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');
  24.         $this->addSql('ALTER TABLE settlement_item ADD CONSTRAINT FK_SETTLEMENT_ITEM_BATCH FOREIGN KEY (settlement_batch_id) REFERENCES settlement_batch (id)');
  25.         $this->addSql('ALTER TABLE settlement_item ADD CONSTRAINT FK_SETTLEMENT_ITEM_LEDGER FOREIGN KEY (account_ledger_id) REFERENCES account_ledger (id)');
  26.         $this->addSql('ALTER TABLE settlement_item ADD CONSTRAINT FK_SETTLEMENT_ITEM_MERCHANT FOREIGN KEY (merchant_user_id) REFERENCES merchant_user (id)');
  27.         $this->addSql('ALTER TABLE settlement_item ADD CONSTRAINT FK_SETTLEMENT_ITEM_PROXY FOREIGN KEY (proxy_user_id) REFERENCES proxy_user (id)');
  28.         $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');
  29.         $this->addSql('ALTER TABLE withdraw_policy ADD CONSTRAINT FK_WITHDRAW_POLICY_PROXY FOREIGN KEY (proxy_user_id) REFERENCES proxy_user (id)');
  30.         $this->addSql('ALTER TABLE withdraw_policy ADD CONSTRAINT FK_WITHDRAW_POLICY_MERCHANT FOREIGN KEY (merchant_user_id) REFERENCES merchant_user (id)');
  31.         $this->addSql('ALTER TABLE withdraw_policy ADD CONSTRAINT FK_WITHDRAW_POLICY_CHANNEL FOREIGN KEY (default_pay_channel_id) REFERENCES pay_channel (id)');
  32.         $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');
  33.         $this->addSql('ALTER TABLE withdraw_order ADD CONSTRAINT FK_WITHDRAW_ORDER_MERCHANT FOREIGN KEY (merchant_user_id) REFERENCES merchant_user (id)');
  34.         $this->addSql('ALTER TABLE withdraw_order ADD CONSTRAINT FK_WITHDRAW_ORDER_PROXY FOREIGN KEY (proxy_user_id) REFERENCES proxy_user (id)');
  35.         $this->addSql('ALTER TABLE withdraw_order ADD CONSTRAINT FK_WITHDRAW_ORDER_BALANCE FOREIGN KEY (owner_balance_id) REFERENCES owner_balance (id)');
  36.         $this->addSql('ALTER TABLE withdraw_order ADD CONSTRAINT FK_WITHDRAW_ORDER_ACCOUNT FOREIGN KEY (receive_account_id) REFERENCES receive_account (id)');
  37.         $this->addSql('ALTER TABLE withdraw_order ADD CONSTRAINT FK_WITHDRAW_ORDER_POLICY FOREIGN KEY (withdraw_policy_id) REFERENCES withdraw_policy (id)');
  38.         $this->addSql('ALTER TABLE withdraw_order ADD CONSTRAINT FK_WITHDRAW_ORDER_CHANNEL FOREIGN KEY (pay_channel_id) REFERENCES pay_channel (id)');
  39.         $this->addSql('ALTER TABLE withdraw_order ADD CONSTRAINT FK_WITHDRAW_ORDER_PROVIDER FOREIGN KEY (payment_provider_id) REFERENCES payment_provider (id)');
  40.         $this->addSql('ALTER TABLE withdraw_order ADD CONSTRAINT FK_WITHDRAW_ORDER_ROUTING FOREIGN KEY (routing_policy_id) REFERENCES channel_routing_policy (id)');
  41.         $this->addSql('ALTER TABLE withdraw_order ADD CONSTRAINT FK_WITHDRAW_ORDER_CREATED_BY FOREIGN KEY (created_by_id) REFERENCES user (id)');
  42.         $this->addSql('ALTER TABLE withdraw_order ADD CONSTRAINT FK_WITHDRAW_ORDER_PROCESSED_BY FOREIGN KEY (processed_by_id) REFERENCES user (id)');
  43.         $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');
  44.         $this->addSql('ALTER TABLE withdraw_attempt ADD CONSTRAINT FK_WITHDRAW_ATTEMPT_ORDER FOREIGN KEY (withdraw_order_id) REFERENCES withdraw_order (id)');
  45.         $this->addSql('ALTER TABLE withdraw_attempt ADD CONSTRAINT FK_WITHDRAW_ATTEMPT_MERCHANT FOREIGN KEY (merchant_user_id) REFERENCES merchant_user (id)');
  46.         $this->addSql('ALTER TABLE withdraw_attempt ADD CONSTRAINT FK_WITHDRAW_ATTEMPT_PROXY FOREIGN KEY (proxy_user_id) REFERENCES proxy_user (id)');
  47.         $this->addSql('ALTER TABLE withdraw_attempt ADD CONSTRAINT FK_WITHDRAW_ATTEMPT_CHANNEL FOREIGN KEY (pay_channel_id) REFERENCES pay_channel (id)');
  48.         $this->addSql('ALTER TABLE withdraw_attempt ADD CONSTRAINT FK_WITHDRAW_ATTEMPT_PROVIDER FOREIGN KEY (payment_provider_id) REFERENCES payment_provider (id)');
  49.         $this->addSql('ALTER TABLE withdraw_attempt ADD CONSTRAINT FK_WITHDRAW_ATTEMPT_ROUTING FOREIGN KEY (routing_policy_id) REFERENCES channel_routing_policy (id)');
  50.         $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');
  51.         $this->addSql('ALTER TABLE balance_ledger ADD CONSTRAINT FK_BALANCE_LEDGER_BALANCE FOREIGN KEY (owner_balance_id) REFERENCES owner_balance (id)');
  52.         $this->addSql('ALTER TABLE balance_ledger ADD CONSTRAINT FK_BALANCE_LEDGER_MERCHANT FOREIGN KEY (merchant_user_id) REFERENCES merchant_user (id)');
  53.         $this->addSql('ALTER TABLE balance_ledger ADD CONSTRAINT FK_BALANCE_LEDGER_PROXY FOREIGN KEY (proxy_user_id) REFERENCES proxy_user (id)');
  54.         $this->addSql('ALTER TABLE balance_ledger ADD CONSTRAINT FK_BALANCE_LEDGER_BATCH FOREIGN KEY (settlement_batch_id) REFERENCES settlement_batch (id)');
  55.         $this->addSql('ALTER TABLE balance_ledger ADD CONSTRAINT FK_BALANCE_LEDGER_WITHDRAW FOREIGN KEY (withdraw_order_id) REFERENCES withdraw_order (id)');
  56.     }
  57.     public function down(Schema $schema): void
  58.     {
  59.         $this->addSql('DROP TABLE IF EXISTS balance_ledger');
  60.         $this->addSql('DROP TABLE IF EXISTS withdraw_attempt');
  61.         $this->addSql('DROP TABLE IF EXISTS withdraw_order');
  62.         $this->addSql('DROP TABLE IF EXISTS withdraw_policy');
  63.         $this->addSql('DROP TABLE IF EXISTS settlement_item');
  64.         $this->addSql('DROP TABLE IF EXISTS settlement_batch');
  65.         $this->addSql('DROP TABLE IF EXISTS owner_balance');
  66.         $this->addSql('DROP TABLE IF EXISTS receive_account');
  67.     }
  68. }