migrations/Version20251216053601.php line 1

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace DoctrineMigrations;
  4. use App\DBAL\Types\TransactionBucketType;
  5. use Doctrine\DBAL\Schema\Schema;
  6. use Doctrine\Migrations\AbstractMigration;
  7. /**
  8.  * Auto-generated Migration: Please modify to your needs!
  9.  */
  10. final class Version20251216053601 extends AbstractMigration
  11. {
  12.     private const COLORS = [
  13.         '006400' => 'Green',
  14.         'cdad00' => 'Gold',
  15.         'eeee00' => 'Yellow',
  16.         'ffa500' => 'Orange',
  17.         'ff0000' => 'Red',
  18.         'ffc0cb' => 'Pink',
  19.         '0000ff' => 'Blue',
  20.         'a020f0' => 'Purple',
  21.         '000000' => 'Black',
  22.         '00ffff' => 'Aqua',
  23.         '00ff00' => 'Lime',
  24.         '999999' => 'Grey',
  25.         '8b4513' => 'Brown',
  26.         'dad0fb' => 'Violet',
  27.         'aa4069' => 'Ruby',
  28.     ];
  29.     private const TRANSACTION_COLORS = [
  30.         '006400' => 'Green',
  31.         'eeee00' => 'Yellow',
  32.         'ffa500' => 'Orange',
  33.         'ff0000' => 'Red',
  34.         'ffc0cb' => 'Pink',
  35.         '0000ff' => 'Blue',
  36.         'a020f0' => 'Purple',
  37.         '00ffff' => 'Aqua',
  38.         '00ff00' => 'Lime',
  39.         '999999' => 'Grey',
  40.         'dad0fb' => 'Violet',
  41.         'aa4069' => 'Ruby',
  42.         '000000' => 'Black',
  43.         '06dd90' => 'Loan',
  44.     ];
  45.     private const BUCKET_BY_HEX = [
  46.         '00ffff' => TransactionBucketType::SAVED,   // Aqua
  47.         '0000ff' => TransactionBucketType::AT_RISK// Blue
  48.         'eeee00' => TransactionBucketType::LOST,    // Yellow
  49.         'ffa500' => TransactionBucketType::LOST,    // Orange
  50.     ];
  51.     public function getDescription(): string
  52.     {
  53.         return '';
  54.     }
  55.     public function up(Schema $schema): void
  56.     {
  57.         // this up() migration is auto-generated, please modify it to your needs
  58.         $this->addSql('CREATE TABLE customer_status_color (id INT AUTO_INCREMENT NOT NULL, name VARCHAR(255) NOT NULL, description VARCHAR(255) DEFAULT NULL, color VARCHAR(6) DEFAULT NULL, sort_order INT DEFAULT NULL, INDEX idx_name (name), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB');
  59.         $this->addSql('CREATE TABLE customer_transaction_color (id INT AUTO_INCREMENT NOT NULL, name VARCHAR(255) NOT NULL, color VARCHAR(6) DEFAULT NULL, bucket ENUM(\'late\', \'at_risk\', \'lost\', \'saved\') DEFAULT NULL COMMENT \'(DC2Type:TransactionBucket)\', sort_order INT DEFAULT NULL, INDEX idx_name (name), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB');
  60.         $this->addSql('CREATE TABLE user_join_color (user_id INT NOT NULL, color_id INT NOT NULL, INDEX IDX_4873FDA8A76ED395 (user_id), INDEX IDX_4873FDA87ADA1FB5 (color_id), PRIMARY KEY(user_id, color_id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB');
  61.         $this->addSql('CREATE TABLE user_color (id INT AUTO_INCREMENT NOT NULL, name VARCHAR(255) NOT NULL, color VARCHAR(6) DEFAULT NULL, sort_order INT DEFAULT NULL, INDEX idx_name (name), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB');
  62.         $this->addSql('ALTER TABLE user_join_color ADD CONSTRAINT FK_4873FDA8A76ED395 FOREIGN KEY (user_id) REFERENCES user (id) ON DELETE CASCADE');
  63.         $this->addSql('ALTER TABLE user_join_color ADD CONSTRAINT FK_4873FDA87ADA1FB5 FOREIGN KEY (color_id) REFERENCES user_color (id) ON DELETE CASCADE');
  64.         $this->addSql('ALTER TABLE customer_status_log ADD color_id INT DEFAULT NULL');
  65.         $this->addSql('ALTER TABLE customer_status_log ADD CONSTRAINT FK_AC993CE57ADA1FB5 FOREIGN KEY (color_id) REFERENCES customer_status_color (id) ON DELETE SET NULL');
  66.         $this->addSql('CREATE INDEX IDX_AC993CE57ADA1FB5 ON customer_status_log (color_id)');
  67.         $this->addSql('ALTER TABLE customer_transaction ADD color_id INT DEFAULT NULL');
  68.         $this->addSql('ALTER TABLE customer_transaction ADD CONSTRAINT FK_717C2ED97ADA1FB5 FOREIGN KEY (color_id) REFERENCES customer_transaction_color (id) ON DELETE SET NULL');
  69.         $this->addSql('CREATE INDEX IDX_717C2ED97ADA1FB5 ON customer_transaction (color_id)');
  70.         $colorIdByHex = [];
  71.         $id 1;
  72.         $sort 1;
  73.         foreach (self::COLORS as $hex => $name) {
  74.             $colorIdByHex[strtolower((string) $hex)] = $id;
  75.             $this->addSql('INSERT INTO user_color (id, name, color, sort_order) VALUES (:id, :name, :color, :sort_order)', [
  76.                 'id' => $id++,
  77.                 'name' => $name,
  78.                 'color' => strtolower((string) $hex),
  79.                 'sort_order' => $sort++,
  80.             ]);
  81.         }
  82.         $sort 1;
  83.         foreach (self::TRANSACTION_COLORS as $hex => $name) {
  84.             $bucket = isset(self::BUCKET_BY_HEX[$hex])
  85.                 ? self::BUCKET_BY_HEX[$hex]
  86.                 : null;
  87.             $this->addSql('INSERT INTO customer_transaction_color (name, color, bucket, sort_order) VALUES (:name, :color, :bucket, :sort_order)', [
  88.                 'name' => $name,
  89.                 'color' => strtolower((string) $hex),
  90.                 'bucket' => $bucket,
  91.                 'sort_order' => $sort++,
  92.             ]);
  93.         }
  94.         $sort 1;
  95.         foreach (self::COLORS as $hex => $name) {
  96.             $this->addSql('INSERT INTO customer_status_color (name, description, color, sort_order) VALUES (:name, :description, :color, :sort_order)', [
  97.                 'name' => $name,
  98.                 'description' => null// or 'TBD'
  99.                 'color' => strtolower((string) $hex),
  100.                 'sort_order' => $sort++,
  101.             ]);
  102.         }
  103.         $this->addSql('
  104.             UPDATE customer_transaction ct
  105.             JOIN customer_transaction_color ctc
  106.               ON LOWER(ctc.color) COLLATE utf8mb4_unicode_ci
  107.                = LOWER(ct.color) COLLATE utf8mb4_unicode_ci
  108.             SET ct.color_id = ctc.id
  109.             WHERE ct.color IS NOT NULL AND ct.color <> ""
  110.         ');
  111.         $this->addSql('
  112.             UPDATE customer_status_log csl
  113.             JOIN customer_status_color csc
  114.               ON LOWER(csc.color) COLLATE utf8mb4_unicode_ci
  115.                = LOWER(csl.color) COLLATE utf8mb4_unicode_ci
  116.             SET csl.color_id = csc.id
  117.             WHERE csl.color IS NOT NULL AND csl.color <> ""
  118.         ');
  119.         $users $this->connection->fetchAllAssociative('SELECT id, colors FROM user WHERE colors IS NOT NULL AND colors <> "a:0:{}"');
  120.         foreach ($users as $user) {
  121.             $userId $user['id'];
  122.             $colorsArray unserialize($user['colors']);
  123.             if (!\is_array($colorsArray)) {
  124.                 continue;
  125.             }
  126.             foreach ($colorsArray as $colorHex) {
  127.                 // Normalize: handle "006400" or 999999
  128.                 if (\is_int($colorHex)) {
  129.                     $colorHex str_pad((string) $colorHex6'0', \STR_PAD_LEFT);
  130.                 } else {
  131.                     $colorHex strtolower(trim((string) $colorHex));
  132.                     $colorHex str_pad($colorHex6'0', \STR_PAD_LEFT);
  133.                 }
  134.                 if (!isset($colorIdByHex[$colorHex])) {
  135.                     // If unexpected color appears, you can either skip or insert it dynamically.
  136.                     continue;
  137.                 }
  138.                 $this->addSql(
  139.                     'INSERT IGNORE INTO user_join_color (user_id, color_id) VALUES (?, ?)',
  140.                     [$userId$colorIdByHex[$colorHex]]
  141.                 );
  142.             }
  143.         }
  144.         $this->addSql('ALTER TABLE customer_status_log DROP color');
  145.         $this->addSql('ALTER TABLE customer_transaction DROP color');
  146.         $this->addSql('ALTER TABLE user DROP colors');
  147.     }
  148.     public function down(Schema $schema): void
  149.     {
  150.         // this down() migration is auto-generated, please modify it to your needs
  151.         $this->addSql('ALTER TABLE customer_status_log DROP FOREIGN KEY FK_AC993CE57ADA1FB5');
  152.         $this->addSql('ALTER TABLE customer_transaction DROP FOREIGN KEY FK_717C2ED97ADA1FB5');
  153.         $this->addSql('ALTER TABLE user_join_color DROP FOREIGN KEY FK_4873FDA8A76ED395');
  154.         $this->addSql('ALTER TABLE user_join_color DROP FOREIGN KEY FK_4873FDA87ADA1FB5');
  155.         $this->addSql('DROP TABLE customer_status_color');
  156.         $this->addSql('DROP TABLE customer_transaction_color');
  157.         $this->addSql('DROP TABLE user_join_color');
  158.         $this->addSql('DROP TABLE user_color');
  159.         $this->addSql('DROP INDEX IDX_AC993CE57ADA1FB5 ON customer_status_log');
  160.         $this->addSql('ALTER TABLE customer_status_log ADD color VARCHAR(6) DEFAULT NULL COLLATE `utf8mb4_general_ci`, DROP color_id');
  161.         $this->addSql('DROP INDEX IDX_717C2ED97ADA1FB5 ON customer_transaction');
  162.         $this->addSql('ALTER TABLE customer_transaction ADD color VARCHAR(6) DEFAULT NULL COLLATE `utf8mb4_general_ci`, DROP color_id');
  163.         $this->addSql('ALTER TABLE user ADD colors LONGTEXT DEFAULT NULL COLLATE `utf8mb4_general_ci` COMMENT \'(DC2Type:array)\'');
  164.     }
  165. }