migrations/Version20260115140000.php line 1

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace DoctrineMigrations;
  4. use App\Entity\Gamification\Mission;
  5. use App\Service\Gamification\MissionIdentifier;
  6. use Doctrine\DBAL\Schema\Schema;
  7. use Doctrine\Migrations\AbstractMigration;
  8. final class Version20260115140000 extends AbstractMigration
  9. {
  10.     public function getDescription(): string
  11.     {
  12.         return 'Consolidated migration for Gamification tables and data';
  13.     }
  14.     public function up(Schema $schema): void
  15.     {
  16.         // 1. SCHEMA CREATION
  17.         // mybiz_mission table
  18.         $this->addSql('CREATE TABLE mybiz_mission (
  19.             id INT AUTO_INCREMENT NOT NULL,
  20.             name VARCHAR(255) NOT NULL,
  21.             marketing_name VARCHAR(255) NOT NULL,
  22.             recurrence VARCHAR(255) NOT NULL,
  23.             is_enabled TINYINT(1) NOT NULL DEFAULT 1,
  24.             category VARCHAR(255) DEFAULT NULL,
  25.             PRIMARY KEY(id)
  26.         ) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB');
  27.         // mybiz_mission_level table
  28.         $this->addSql('CREATE TABLE mybiz_mission_level (
  29.             id INT AUTO_INCREMENT NOT NULL,
  30.             badge_name VARCHAR(255) DEFAULT NULL,
  31.             badge_marketing_name VARCHAR(255) DEFAULT NULL,
  32.             badge_image VARCHAR(255) DEFAULT NULL,
  33.             threshold DOUBLE PRECISION NOT NULL,
  34.             xp INT NOT NULL,
  35.             level_number INT NOT NULL,
  36.             mission_id INT NOT NULL,
  37.             INDEX IDX_MISSION_LEVEL_MISSION (mission_id),
  38.             PRIMARY KEY(id)
  39.         ) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB');
  40.         // mybiz_mission_history table
  41.         $this->addSql('CREATE TABLE mybiz_mission_history (
  42.             id INT AUTO_INCREMENT NOT NULL,
  43.             member_id INT NOT NULL,
  44.             mission_id INT NOT NULL,
  45.             mission_level_id INT DEFAULT NULL,
  46.             xp INT NOT NULL,
  47.             created_at DATETIME NOT NULL COMMENT \'(DC2Type:datetime_immutable)\',
  48.             updated_at DATETIME DEFAULT NULL COMMENT \'(DC2Type:datetime_immutable)\',
  49.             is_deprecated TINYINT(1) NOT NULL DEFAULT 0,
  50.             context JSON DEFAULT NULL COMMENT \'(DC2Type:json)\',
  51.             progress DOUBLE PRECISION DEFAULT NULL,
  52.             is_completed TINYINT(1) DEFAULT 0 NOT NULL,
  53.             INDEX IDX_MISSION_HISTORY_MEMBER (member_id),
  54.             INDEX IDX_MISSION_HISTORY_MISSION (mission_id),
  55.             INDEX IDX_MISSION_HISTORY_MISSION_LEVEL (mission_level_id),
  56.             PRIMARY KEY(id)
  57.         ) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB');
  58.         // Foreign key constraints
  59.         $this->addSql('ALTER TABLE mybiz_mission_level ADD CONSTRAINT FK_MISSION_LEVEL_MISSION FOREIGN KEY (mission_id) REFERENCES mybiz_mission (id)');
  60.         $this->addSql('ALTER TABLE mybiz_mission_history ADD CONSTRAINT FK_MISSION_HISTORY_MEMBER FOREIGN KEY (member_id) REFERENCES app_member (id)');
  61.         $this->addSql('ALTER TABLE mybiz_mission_history ADD CONSTRAINT FK_MISSION_HISTORY_MISSION FOREIGN KEY (mission_id) REFERENCES mybiz_mission (id)');
  62.         $this->addSql('ALTER TABLE mybiz_mission_history ADD CONSTRAINT FK_MISSION_HISTORY_MISSION_LEVEL FOREIGN KEY (mission_level_id) REFERENCES mybiz_mission_level (id)');
  63.         // 2. DATA INSERTION - MISSIONS
  64.         // One-time and Monthly missions (IDs 1-17)
  65.         $missionsOneTimeMonthly = [
  66.             [1MissionIdentifier::TYPE_ONE_TIME_COMMISSION'one_time_commission''one_time'1],
  67.             [2MissionIdentifier::TYPE_ONE_TIME_RANK'one_time_rank''one_time'1],
  68.             [3MissionIdentifier::TYPE_ONE_TIME_PERSONAL_CLIENT'one_time_personal_client''one_time'1],
  69.             [4MissionIdentifier::TYPE_ONE_TIME_QUALIFICATION_IN_PERSONAL_CLIENTS'one_time_qualification_in_personal_clients''one_time'1],
  70.             [5MissionIdentifier::TYPE_ONE_TIME_PERSONAL_CLIENT_POINT'one_time_personal_client_point''one_time'1],
  71.             [6MissionIdentifier::TYPE_ONE_TIME_CONNECTION'one_time_connection''one_time'1],
  72.             [7MissionIdentifier::TYPE_ONE_TIME_BIRTH_BIZ_DAY'one_time_birth_biz_day''one_time'1],
  73.             [8MissionIdentifier::TYPE_ONE_TIME_ACTIVE_BIZPARTNER'one_time_active_bizpartner''one_time'1],
  74.             [9MissionIdentifier::TYPE_ONE_TIME_ACTIVE_CLIENT'one_time_active_client''one_time'1],
  75.             [10MissionIdentifier::TYPE_ONE_TIME_COUNTRY_POINT'one_time_country_point''one_time'1],
  76.             [11MissionIdentifier::TYPE_ONE_TIME_FUTURES_POINT'one_time_futures_point''one_time'1],
  77.             [12MissionIdentifier::TYPE_ONE_TIME_LUUME_POINT'one_time_luume_point''one_time'1],
  78.             [13MissionIdentifier::TYPE_ONE_TIME_MISSION_COMPLETED'one_time_mission_completed''one_time'1],
  79.             [14MissionIdentifier::TYPE_MONTHLY_PERSONAL_CLIENT_POINT'monthly_personal_client_point''monthly'1],
  80.             [15MissionIdentifier::TYPE_MONTHLY_TOP_PERFORMER'monthly_top_performer''monthly'1],
  81.             [16MissionIdentifier::TYPE_MONTHLY_QUALIFICATION'monthly_qualification''monthly'1],
  82.         ];
  83.         foreach ($missionsOneTimeMonthly as [$id$name$marketingName$recurrence$isEnabled]) {
  84.             $this->addSql("INSERT INTO mybiz_mission (id, name, marketing_name, recurrence, is_enabled)
  85.                 VALUES ({$id}, '{$name}', '{$marketingName}', '{$recurrence}', {$isEnabled})");
  86.         }
  87.         // Weekly missions (IDs 18-45)
  88.         $missionsWeekly = [
  89.             [18MissionIdentifier::TYPE_WEEKLY_ADD_5_EVENTS'weekly_add_5_events''weekly'Mission::CATEGORY_BACKOFFICE_AND_NAVIGATION1],
  90.             [19MissionIdentifier::TYPE_WEEKLY_ADD_8_PROSPECTS'weekly_add_8_prospects''weekly'Mission::CATEGORY_BACKOFFICE_AND_NAVIGATION1],
  91.             [20MissionIdentifier::TYPE_WEEKLY_MAKE_3_SALES'weekly_make_3_sales''weekly'Mission::CATEGORY_SALES_AND_PLACEMENTS1],
  92.             [21MissionIdentifier::TYPE_WEEKLY_MAKE_5_SALES'weekly_make_5_sales''weekly'Mission::CATEGORY_SALES_AND_PLACEMENTS1],
  93.             [22MissionIdentifier::TYPE_WEEKLY_MAKE_2_SALES_ABOVE_100'weekly_make_2_sales_above_100''weekly'Mission::CATEGORY_SALES_AND_PLACEMENTS1],
  94.             [23MissionIdentifier::TYPE_WEEKLY_MAKE_SALE_ABOVE_AVERAGE'weekly_make_sale_above_average''weekly'Mission::CATEGORY_SALES_AND_PLACEMENTS1],
  95.             [24MissionIdentifier::TYPE_WEEKLY_MAKE_5_PLACEMENTS'weekly_make_5_placements''weekly'Mission::CATEGORY_SALES_AND_PLACEMENTS1],
  96.             [25MissionIdentifier::TYPE_WEEKLY_MAKE_10_PLACEMENTS'weekly_make_10_placements''weekly'Mission::CATEGORY_SALES_AND_PLACEMENTS1],
  97.             [26MissionIdentifier::TYPE_WEEKLY_LOGIN_5_DAYS'weekly_login_5_days''weekly'Mission::CATEGORY_SALES_AND_PLACEMENTS1],
  98.             [27MissionIdentifier::TYPE_WEEKLY_MAKE_SALE_AND_PLACEMENT_SAME_DAY'weekly_make_sale_and_placement_same_day''weekly'Mission::CATEGORY_SALES_AND_PLACEMENTS1],
  99.             [28MissionIdentifier::TYPE_WEEKLY_REACH_DAILY_SALES_RECORD'weekly_reach_daily_sales_record''weekly'Mission::CATEGORY_SALES_AND_PLACEMENTS1],
  100.             [29MissionIdentifier::TYPE_WEEKLY_REACH_DAILY_PLACEMENT_RECORD'weekly_reach_daily_placement_record''weekly'Mission::CATEGORY_SALES_AND_PLACEMENTS1],
  101.             [30MissionIdentifier::TYPE_WEEKLY_REACH_NEW_RANK'weekly_reach_new_rank''weekly'Mission::CATEGORY_SALES_AND_PLACEMENTS1],
  102.             [31MissionIdentifier::TYPE_WEEKLY_GENERATE_2_LUUME_AND_2_FUTURESLEARN_SALES'weekly_generate_2_luume_and_2_futureslearn_sales''weekly'Mission::CATEGORY_SALES_AND_PLACEMENTS1],
  103.             [32MissionIdentifier::TYPE_WEEKLY_GENERATE_250_POINTS'weekly_generate_250_points''weekly'Mission::CATEGORY_POINTS_XP_AND_RANKINGS1],
  104.             [33MissionIdentifier::TYPE_WEEKLY_GENERATE_500_POINTS'weekly_generate_500_points''weekly'Mission::CATEGORY_POINTS_XP_AND_RANKINGS1],
  105.             [34MissionIdentifier::TYPE_WEEKLY_GENERATE_1000_POINTS'weekly_generate_1000_points''weekly'Mission::CATEGORY_POINTS_XP_AND_RANKINGS1],
  106.             [35MissionIdentifier::TYPE_WEEKLY_GENERATE_1500_POINTS'weekly_generate_1500_points''weekly'Mission::CATEGORY_POINTS_XP_AND_RANKINGS1],
  107.             [36MissionIdentifier::TYPE_WEEKLY_GENERATE_2000_POINTS'weekly_generate_2000_points''weekly'Mission::CATEGORY_POINTS_XP_AND_RANKINGS1],
  108.             [37MissionIdentifier::TYPE_WEEKLY_GENERATE_2500_POINTS'weekly_generate_2500_points''weekly'Mission::CATEGORY_POINTS_XP_AND_RANKINGS1],
  109.             [38MissionIdentifier::TYPE_WEEKLY_GENERATE_MORE_POINTS_THAN_LAST_WEEK'weekly_generate_more_points_than_last_week''weekly'Mission::CATEGORY_POINTS_XP_AND_RANKINGS1],
  110.             [39MissionIdentifier::TYPE_WEEKLY_GENERATE_POINTS_2_DAYS_IN_ROW'weekly_generate_points_2_days_in_row''weekly'Mission::CATEGORY_POINTS_XP_AND_RANKINGS1],
  111.             [40MissionIdentifier::TYPE_WEEKLY_GENERATE_POINTS_3_DAYS_IN_ROW'weekly_generate_points_3_days_in_row''weekly'Mission::CATEGORY_POINTS_XP_AND_RANKINGS1],
  112.             [41MissionIdentifier::TYPE_WEEKLY_GENERATE_POINTS_5_DAYS_IN_ROW'weekly_generate_points_5_days_in_row''weekly'Mission::CATEGORY_POINTS_XP_AND_RANKINGS1],
  113.             [42MissionIdentifier::TYPE_WEEKLY_APPEAR_IN_TOP_PERFORMER'weekly_appear_in_top_performer''weekly'Mission::CATEGORY_POINTS_XP_AND_RANKINGS1],
  114.             [43MissionIdentifier::TYPE_WEEKLY_APPEAR_IN_TOP_3_PERFORMER'weekly_appear_in_top_3_performer''weekly'Mission::CATEGORY_POINTS_XP_AND_RANKINGS1],
  115.             [44MissionIdentifier::TYPE_WEEKLY_APPEAR_IN_TOP_5_PERFORMER'weekly_appear_in_top_5_performer''weekly'Mission::CATEGORY_POINTS_XP_AND_RANKINGS1],
  116.             [45MissionIdentifier::TYPE_WEEKLY_REACH_WEEKLY_POINTS_RECORD'weekly_reach_weekly_points_record''weekly'Mission::CATEGORY_POINTS_XP_AND_RANKINGS1],
  117.         ];
  118.         foreach ($missionsWeekly as [$id$name$marketingName$recurrence$category$isEnabled]) {
  119.             $this->addSql("INSERT INTO mybiz_mission (id, name, marketing_name, recurrence, category, is_enabled)
  120.                 VALUES ({$id}, '{$name}', '{$marketingName}', '{$recurrence}', '{$category}', {$isEnabled})");
  121.         }
  122.         // Daily missions (IDs 46-101)
  123.         $missionsDaily = [
  124.             [46MissionIdentifier::TYPE_DAILY_LOGIN_BACKOFFICE'daily_login_backoffice''daily'Mission::CATEGORY_BACKOFFICE_AND_NAVIGATION1],
  125.             [47MissionIdentifier::TYPE_DAILY_LOGIN_MOBILE'daily_login_mobile''daily'Mission::CATEGORY_BACKOFFICE_AND_NAVIGATION1],
  126.             [48MissionIdentifier::TYPE_DAILY_LOGIN_BEFORE_10AM'daily_login_before_10am''daily'Mission::CATEGORY_BACKOFFICE_AND_NAVIGATION1],
  127.             [49MissionIdentifier::TYPE_DAILY_LOGIN_AFTER_6PM'daily_login_after_6pm''daily'Mission::CATEGORY_BACKOFFICE_AND_NAVIGATION1],
  128.             [50MissionIdentifier::TYPE_DAILY_LOGIN_TWICE'daily_login_twice''daily'Mission::CATEGORY_BACKOFFICE_AND_NAVIGATION1],
  129.             [51MissionIdentifier::TYPE_DAILY_VIEW_DASHBOARD'daily_view_dashboard''daily'Mission::CATEGORY_BACKOFFICE_AND_NAVIGATION1],
  130.             [52MissionIdentifier::TYPE_DAILY_VIEW_PROFILE'daily_view_profile''daily'Mission::CATEGORY_BACKOFFICE_AND_NAVIGATION1],
  131.             [53MissionIdentifier::TYPE_DAILY_VIEW_MISSIONS'daily_view_missions''daily'Mission::CATEGORY_BACKOFFICE_AND_NAVIGATION1],
  132.             [54MissionIdentifier::TYPE_DAILY_VIEW_PROGRESSION'daily_view_progression''daily'Mission::CATEGORY_BACKOFFICE_AND_NAVIGATION1],
  133.             [55MissionIdentifier::TYPE_DAILY_VIEW_GAMIFICATION'daily_view_gamification''daily'Mission::CATEGORY_BACKOFFICE_AND_NAVIGATION1],
  134.             [56MissionIdentifier::TYPE_DAILY_VIEW_RANKINGS'daily_view_rankings''daily'Mission::CATEGORY_BACKOFFICE_AND_NAVIGATION1],
  135.             [57MissionIdentifier::TYPE_DAILY_VIEW_CLIENTS'daily_view_clients''daily'Mission::CATEGORY_BACKOFFICE_AND_NAVIGATION1],
  136.             [58MissionIdentifier::TYPE_DAILY_VIEW_SALES'daily_view_sales''daily'Mission::CATEGORY_BACKOFFICE_AND_NAVIGATION0], // Deactivated
  137.             [59MissionIdentifier::TYPE_DAILY_VIEW_PLACEMENTS'daily_view_placements''daily'Mission::CATEGORY_BACKOFFICE_AND_NAVIGATION1],
  138.             [60MissionIdentifier::TYPE_DAILY_VIEW_STATISTICS'daily_view_statistics''daily'Mission::CATEGORY_BACKOFFICE_AND_NAVIGATION1],
  139.             [61MissionIdentifier::TYPE_DAILY_VIEW_GOALS'daily_view_goals''daily'Mission::CATEGORY_BACKOFFICE_AND_NAVIGATION0], // Deactivated
  140.             [62MissionIdentifier::TYPE_DAILY_ADD_CALENDAR_EVENT'daily_add_calendar_event''daily'Mission::CATEGORY_BACKOFFICE_AND_NAVIGATION1],
  141.             [63MissionIdentifier::TYPE_DAILY_CHECK_NOTIFICATIONS'daily_check_notifications''daily'Mission::CATEGORY_BACKOFFICE_AND_NAVIGATION1],
  142.             [64MissionIdentifier::TYPE_DAILY_VIEW_ACTIVE_CLIENT'daily_view_active_client''daily'Mission::CATEGORY_BACKOFFICE_AND_NAVIGATION1],
  143.             [65MissionIdentifier::TYPE_DAILY_VIEW_TWO_ACTIVE_CLIENTS'daily_view_two_active_clients''daily'Mission::CATEGORY_BACKOFFICE_AND_NAVIGATION1],
  144.             [66MissionIdentifier::TYPE_DAILY_VIEW_INACTIVE_CLIENT'daily_view_inactive_client''daily'Mission::CATEGORY_BACKOFFICE_AND_NAVIGATION1],
  145.             [67MissionIdentifier::TYPE_DAILY_VIEW_TWO_INACTIVE_CLIENTS'daily_view_two_inactive_clients''daily'Mission::CATEGORY_BACKOFFICE_AND_NAVIGATION1],
  146.             [68MissionIdentifier::TYPE_DAILY_ADD_TWO_CARD_KANBAN'daily_add_two_card_kanban''daily'Mission::CATEGORY_BACKOFFICE_AND_NAVIGATION1],
  147.             [69MissionIdentifier::TYPE_DAILY_MYBIZ_RESOURCE_DOWNLOADED'daily_mybiz_resource_downloaded''daily'Mission::CATEGORY_BACKOFFICE_AND_NAVIGATION0], // Deactivated
  148.             [70MissionIdentifier::TYPE_DAILY_MYBIZ_NEWS_VIEWED'daily_mybiz_news_viewed''daily'Mission::CATEGORY_BACKOFFICE_AND_NAVIGATION0], // Deactivated
  149.             [71MissionIdentifier::TYPE_DAILY_MAKE_SALE'daily_make_sale''daily'Mission::CATEGORY_SALES_AND_PLACEMENTS1],
  150.             [72MissionIdentifier::TYPE_DAILY_MAKE_TWO_SALES'daily_make_two_sales''daily'Mission::CATEGORY_SALES_AND_PLACEMENTS1],
  151.             [73MissionIdentifier::TYPE_DAILY_MAKE_SALE_BEFORE_3PM'daily_make_sale_before_3pm''daily'Mission::CATEGORY_SALES_AND_PLACEMENTS1],
  152.             [74MissionIdentifier::TYPE_DAILY_MAKE_SALE_AFTER_3PM'daily_make_sale_after_3pm''daily'Mission::CATEGORY_SALES_AND_PLACEMENTS1],
  153.             [75MissionIdentifier::TYPE_DAILY_MAKE_SALE_ABOVE_AVERAGE'daily_make_sale_above_average''daily'Mission::CATEGORY_SALES_AND_PLACEMENTS1],
  154.             [76MissionIdentifier::TYPE_DAILY_MAKE_PLACEMENT'daily_make_placement''daily'Mission::CATEGORY_SALES_AND_PLACEMENTS1],
  155.             [77MissionIdentifier::TYPE_DAILY_MAKE_TWO_PLACEMENTS'daily_make_two_placements''daily'Mission::CATEGORY_SALES_AND_PLACEMENTS1],
  156.             [78MissionIdentifier::TYPE_DAILY_MAKE_PLACEMENT_BEFORE_3PM'daily_make_placement_before_3pm''daily'Mission::CATEGORY_SALES_AND_PLACEMENTS1],
  157.             [79MissionIdentifier::TYPE_DAILY_MAKE_PLACEMENT_AFTER_3PM'daily_make_placement_after_3pm''daily'Mission::CATEGORY_SALES_AND_PLACEMENTS1],
  158.             [80MissionIdentifier::TYPE_DAILY_MAKE_SALE_AND_PLACEMENT'daily_make_sale_and_placement''daily'Mission::CATEGORY_SALES_AND_PLACEMENTS1],
  159.             [81MissionIdentifier::TYPE_DAILY_REACH_PERSONAL_SALES_RECORD'daily_reach_personal_sales_record''daily'Mission::CATEGORY_SALES_AND_PLACEMENTS1],
  160.             [82MissionIdentifier::TYPE_DAILY_REACH_PERSONAL_PLACEMENT_RECORD'daily_reach_personal_placement_record''daily'Mission::CATEGORY_SALES_AND_PLACEMENTS1],
  161.             [83MissionIdentifier::TYPE_DAILY_REACH_NEW_RANK'daily_reach_new_rank''daily'Mission::CATEGORY_SALES_AND_PLACEMENTS1],
  162.             [84MissionIdentifier::TYPE_DAILY_MAKE_LUUME_AND_FUTURESLEARN_SALE'daily_make_luume_and_futureslearn_sale''daily'Mission::CATEGORY_SALES_AND_PLACEMENTS1],
  163.             [85MissionIdentifier::TYPE_DAILY_GENERATE_50_POINTS'daily_generate_50_points''daily'Mission::CATEGORY_POINTS_XP_AND_RANKINGS1],
  164.             [86MissionIdentifier::TYPE_DAILY_GENERATE_80_POINTS'daily_generate_80_points''daily'Mission::CATEGORY_POINTS_XP_AND_RANKINGS1],
  165.             [87MissionIdentifier::TYPE_DAILY_GENERATE_100_POINTS'daily_generate_100_points''daily'Mission::CATEGORY_POINTS_XP_AND_RANKINGS1],
  166.             [88MissionIdentifier::TYPE_DAILY_GENERATE_150_POINTS'daily_generate_150_points''daily'Mission::CATEGORY_POINTS_XP_AND_RANKINGS1],
  167.             [89MissionIdentifier::TYPE_DAILY_GENERATE_200_POINTS'daily_generate_200_points''daily'Mission::CATEGORY_POINTS_XP_AND_RANKINGS1],
  168.             [90MissionIdentifier::TYPE_DAILY_GENERATE_250_POINTS'daily_generate_250_points''daily'Mission::CATEGORY_POINTS_XP_AND_RANKINGS1],
  169.             [91MissionIdentifier::TYPE_DAILY_GENERATE_300_POINTS'daily_generate_300_points''daily'Mission::CATEGORY_POINTS_XP_AND_RANKINGS1],
  170.             [92MissionIdentifier::TYPE_DAILY_GENERATE_100_POINTS_BEFORE_3PM'daily_generate_100_points_before_3pm''daily'Mission::CATEGORY_POINTS_XP_AND_RANKINGS1],
  171.             [93MissionIdentifier::TYPE_DAILY_GENERATE_250_POINTS_BEFORE_6PM'daily_generate_250_points_before_6pm''daily'Mission::CATEGORY_POINTS_XP_AND_RANKINGS1],
  172.             [94MissionIdentifier::TYPE_DAILY_GENERATE_MORE_POINTS_THAN_YESTERDAY'daily_generate_more_points_than_yesterday''daily'Mission::CATEGORY_POINTS_XP_AND_RANKINGS1],
  173.             [95MissionIdentifier::TYPE_DAILY_GENERATE_POINTS_2_DAYS_IN_ROW'daily_generate_points_2_days_in_row''daily'Mission::CATEGORY_POINTS_XP_AND_RANKINGS0], // Deactivated
  174.             [96MissionIdentifier::TYPE_DAILY_GENERATE_POINTS_3_DAYS_IN_ROW'daily_generate_points_3_days_in_row''daily'Mission::CATEGORY_POINTS_XP_AND_RANKINGS0], // Deactivated
  175.             [97MissionIdentifier::TYPE_DAILY_GENERATE_POINTS_5_DAYS_IN_ROW'daily_generate_points_5_days_in_row''daily'Mission::CATEGORY_POINTS_XP_AND_RANKINGS0], // Deactivated
  176.             [98MissionIdentifier::TYPE_DAILY_APPEAR_IN_TOP_PERFORMER'daily_appear_in_top_performer''daily'Mission::CATEGORY_POINTS_XP_AND_RANKINGS1],
  177.             [99MissionIdentifier::TYPE_DAILY_APPEAR_IN_TOP_3_PERFORMER'daily_appear_in_top_3_performer''daily'Mission::CATEGORY_POINTS_XP_AND_RANKINGS1],
  178.             [100MissionIdentifier::TYPE_DAILY_APPEAR_IN_TOP_5_PERFORMER'daily_appear_in_top_5_performer''daily'Mission::CATEGORY_POINTS_XP_AND_RANKINGS1],
  179.             [101MissionIdentifier::TYPE_DAILY_REACH_DAILY_POINTS_RECORD'daily_reach_daily_points_record''daily'Mission::CATEGORY_POINTS_XP_AND_RANKINGS1],
  180.         ];
  181.         foreach ($missionsDaily as [$id$name$marketingName$recurrence$category$isEnabled]) {
  182.             $this->addSql("INSERT INTO mybiz_mission (id, name, marketing_name, recurrence, category, is_enabled)
  183.                 VALUES ({$id}, '{$name}', '{$marketingName}', '{$recurrence}', '{$category}', {$isEnabled})");
  184.         }
  185.         // 3. DATA INSERTION - MISSION LEVELS
  186.         $missionLevels = [
  187.             // One-time missions (IDs 1-13)
  188.             [1'earner_500''Earner 500''earner_500'50010011],
  189.             [2'earner_1000''Earner 1000''earner_1000'100015021],
  190.             [3'earner_2000''Earner 2000''earner_2000'200020031],
  191.             [4'earner_5000''Earner 5000''earner_5000'500025041],
  192.             [5'earner_10000''Earner 10000''earner_10000'1000030051],
  193.             [6'earner_20000''Earner 20000''earner_20000'2000035061],
  194.             [7'earner_50000''Earner 50000''earner_50000'5000050071],
  195.             [8'earner_100000''Earner 100000''earner_100000'10000075081],
  196.             [9'earner_200000''Earner 200000''earner_200000'200000100091],
  197.             [10'earner_500000''Earner 500000''earner_500000'5000002000101],
  198.             [11'earner_1000000''Earner 1000000''earner_1000000'10000005000111],
  199.             [12'biz_challenger''BizChallenger''biz_challenger'210012],
  200.             [13'biz_director''BizDirector''biz_director'325022],
  201.             [14'iron_partner''Iron''iron_partner'450032],
  202.             [15'biz_ambassador''BizAmbassador''biz_ambassador'575042],
  203.             [16'diamond_10''Diamond 10''diamond_10'6100052],
  204.             [17'diamond_20''Diamond 20''diamond_20'7150062],
  205.             [18'diamond_50''Diamond 50''diamond_50'8200072],
  206.             [19'legend_100''Legend 100''legend_100'9250082],
  207.             [20'legend_250''Legend 250''legend_250'10500092],
  208.             [21'legend_500''Legend 500''legend_500'1110000102],
  209.             [22'biz_recruiter_1''BizRecruiter 1''biz_recruiter_1'110013],
  210.             [23'biz_recruiter_3''BizRecruiter 3''biz_recruiter_3'320023],
  211.             [24'biz_recruiter_5''BizRecruiter 5''biz_recruiter_5'530033],
  212.             [25'biz_recruiter_10''BizRecruiter 10''biz_recruiter_10'1040043],
  213.             [26'biz_recruiter_20''BizRecruiter 20''biz_recruiter_20'2050053],
  214.             [27'biz_recruiter_30''BizRecruiter 30''biz_recruiter_30'3060063],
  215.             [28'biz_recruiter_50''BizRecruiter 50''biz_recruiter_50'5080073],
  216.             [29'biz_recruiter_70''BizRecruiter 70''biz_recruiter_70'70100083],
  217.             [30'biz_recruiter_100''BizRecruiter 100''biz_recruiter_100'100120093],
  218.             [31'biz_recruiter_200''BizRecruiter 200''biz_recruiter_200'2001400103],
  219.             [32'biz_recruiter_500''BizRecruiter 500''biz_recruiter_500'5001500113],
  220.             [33'biz_recruiter_1000''BizRecruiter 1000''biz_recruiter_1000'10002000123],
  221.             [34'biz_creator_1''BizCreator 1''biz_creator_1'15014],
  222.             [35'biz_creator_10''BizCreator 10''biz_creator_10'1010024],
  223.             [36'biz_creator_20''BizCreator 20''biz_creator_20'2020034],
  224.             [37'biz_creator_30''BizCreator 30''biz_creator_30'3030044],
  225.             [38'biz_creator_50''BizCreator 50''biz_creator_50'5040054],
  226.             [39'biz_creator_80''BizCreator 80''biz_creator_80'8050064],
  227.             [40'biz_creator_100''BizCreator 100''biz_creator_100'10075074],
  228.             [41'biz_creator_200''BizCreator 200''biz_creator_200'200100084],
  229.             [42'biz_creator_500''BizCreator 500''biz_creator_500'500150094],
  230.             [43'biz_creator_1000''BizCreator 1000''biz_creator_1000'10003000104],
  231.             [44'biz_master_500''BizMaster 500''biz_master_500'5005015],
  232.             [45'biz_master_1000''BizMaster 1000''biz_master_1000'100015025],
  233.             [46'biz_master_5000''BizMaster 5000''biz_master_5000'500025035],
  234.             [47'biz_master_10000''BizMaster 10000''biz_master_10000'1000040045],
  235.             [48'biz_master_25000''BizMaster 25000''biz_master_25000'2500075055],
  236.             [49'biz_master_50000''BizMaster 50000''biz_master_50000'50000100065],
  237.             [50'biz_master_100000''BizMaster 100000''biz_master_100000'100000150075],
  238.             [51'biz_master_300000''BizMaster 300000''biz_master_300000'300000250085],
  239.             [52'regular_7''Regular 7''regular_7'75016],
  240.             [53'regular_30''Regular 30''regular_30'3010026],
  241.             [54'regular_90''Regular 90''regular_90'9015036],
  242.             [55'regular_180''Regular 180''regular_180'18020046],
  243.             [56'regular_365''Regular 365''regular_365'36525056],
  244.             [57'regular_500''Regular 500''regular_500'50030066],
  245.             [58'regular_1000''Regular 1000''regular_1000'100040076],
  246.             [59'regular_2500''Regular 2500''regular_2500'250050086],
  247.             [60'regular_5000''Regular 5000''regular_5000'5000100096],
  248.             [61'happy_1st_bizday''Happy 1st BizDay''happy_1st_bizday'150017],
  249.             [62'happy_2nd_bizday''Happy 2nd BizDay''happy_2nd_bizday'2100027],
  250.             [63'happy_3rd_bizday''Happy 3rd BizDay''happy_3rd_bizday'3150037],
  251.             [64'happy_4th_bizday''Happy 4th BizDay''happy_4th_bizday'4200047],
  252.             [65'happy_5th_bizday''Happy 5th BizDay''happy_5th_bizday'5250057],
  253.             [66'biz_builder_1''BizBuilder 1''biz_builder_1'15018],
  254.             [67'biz_builder_10''BizBuilder 10''biz_builder_10'1010028],
  255.             [68'biz_builder_20''BizBuilder 20''biz_builder_20'2025038],
  256.             [69'biz_builder_50''BizBuilder 50''biz_builder_50'5040048],
  257.             [70'biz_builder_100''BizBuilder 100''biz_builder_100'10050058],
  258.             [71'biz_builder_200''BizBuilder 200''biz_builder_200'20065068],
  259.             [72'biz_builder_500''BizBuilder 500''biz_builder_500'50075078],
  260.             [73'biz_builder_1000''BizBuilder 1 000''biz_builder_1000'1000100088],
  261.             [74'biz_builder_2500''BizBuilder 2500''biz_builder_2500'2500150098],
  262.             [75'biz_builder_5000''BizBuilder 5000''biz_builder_5000'50002500108],
  263.             [76'sales_1''Sales 1''sales_1'15019],
  264.             [77'sales_10''Sales 10''sales_10'1025029],
  265.             [78'sales_50''Sales 50''sales_50'5050039],
  266.             [79'sales_100''Sales 100''sales_100'10060049],
  267.             [80'sales_200''Sales 200''sales_200'20070059],
  268.             [81'sales_500''Sales 500''sales_500'50080069],
  269.             [82'sales_1000''Sales 1 000''sales_1000'1000100079],
  270.             [83'sales_2500''Sales 2500''sales_2500'2500125089],
  271.             [84'sales_5000''Sales 5000''sales_5000'5000150099],
  272.             [85'sales_7500''Sales 7500''sales_7500'75002500109],
  273.             [86'sales_10000''Sales 10000''sales_10000'100005000119],
  274.             [87'international_leader_2''International Leader 2''international_leader_2'2100110],
  275.             [88'international_leader_4''International Leader 4''international_leader_4'4250210],
  276.             [89'international_leader_7''International Leader 7''international_leader_7'7500310],
  277.             [90'international_leader_10''International Leader 10''international_leader_10'10750410],
  278.             [91'international_leader_15''International Leader 15''international_leader_15'151000510],
  279.             [92'international_leader_20''International Leader 20''international_leader_20'201500610],
  280.             [93'international_leader_25''International Leader 25''international_leader_25'252000710],
  281.             [94'futures_seller_500''Futures Seller 500''futures_seller_500'500100111],
  282.             [95'futures_seller_1000''Futures Seller 1000''futures_seller_1000'1000200211],
  283.             [96'futures_seller_5000''Futures Seller 5000''futures_seller_5000'5000400311],
  284.             [97'futures_seller_10000''Futures Seller 10000''futures_seller_10000'10000600411],
  285.             [98'futures_seller_25000''Futures Seller 25000''futures_seller_25000'25000900511],
  286.             [99'futures_seller_50000''Futures Seller 50000''futures_seller_50000'500001200611],
  287.             [100'futures_seller_100000''Futures Seller 100000''futures_seller_100000'1000001500711],
  288.             [101'futures_seller_300000''Futures Seller 300000''futures_seller_300000'3000002000811],
  289.             [102'luume_seller_500''Luume Seller 500''luume_seller_500'500100112],
  290.             [103'luume_seller_1000''Luume Seller 1 000''luume_seller_1000'1000200212],
  291.             [104'luume_seller_5000''Luume Seller 5 000''luume_seller_5000'5000400312],
  292.             [105'luume_seller_10000''Luume Seller 10 000''luume_seller_10000'10000600412],
  293.             [106'luume_seller_25000''Luume Seller 25 000''luume_seller_25000'25000900512],
  294.             [107'luume_seller_50000''Luume Seller 50 000''luume_seller_50000'500001200612],
  295.             [108'luume_seller_100000''Luume Seller 100 000''luume_seller_100000'1000001500712],
  296.             [109'luume_seller_300000''Luume Seller 300 000''luume_seller_300000'3000002000812],
  297.             [110'achiever_1''Achiever 1''achiever_1'150113],
  298.             [111'achiever_5''Achiever 5''achiever_5'5100213],
  299.             [112'achiever_10''Achiever 10''achiever_10'10150313],
  300.             [113'achiever_20''Achiever 20''achiever_20'20200413],
  301.             [114'achiever_50''Achiever 50''achiever_50'50250513],
  302.             [115'achiever_100''Achiever 100''achiever_100'100300613],
  303.             [116'achiever_200''Achiever 200''achiever_200'200350713],
  304.             [117'achiever_500''Achiever 500''achiever_500'500400813],
  305.             [118'achiever_1000''Achiever 1 000''achiever_1000'1000750913],
  306.             [119'achiever_2000''Achiever 2000''achiever_2000'200010001013],
  307.             // Monthly missions (IDs 14-16)
  308.             [120NULLNULLNULL500150114],
  309.             [121NULLNULLNULL1000250214],
  310.             [122NULLNULLNULL2000400314],
  311.             [123NULLNULLNULL5000700414],
  312.             [124NULLNULLNULL100001000514],
  313.             [125NULLNULLNULL150001500614],
  314.             [126NULLNULLNULL300002000714],
  315.             [127'top_10_performer''Top 10 Performer''top_10_performer'10100115],
  316.             [128'monthly_podium''Monthly Podium''monthly_podium'3250215],
  317.             [129'biz_champion''BizChampion''biz_champion'2500315],
  318.             [130'1_of_the_month''1 of the Month''1_of_the_month'1750415],
  319.             [131NULLNULLNULL250116],
  320.             [132NULLNULLNULL3100216],
  321.             [133NULLNULLNULL4200316],
  322.             [134NULLNULLNULL5500416],
  323.             [135NULLNULLNULL6750516],
  324.             [136NULLNULLNULL71000616],
  325.             [137NULLNULLNULL81500716],
  326.             [138NULLNULLNULL92000816],
  327.             [139NULLNULLNULL103000916],
  328.             [140NULLNULLNULL1150001016],
  329.         ];
  330.         foreach ($missionLevels as [$id$badge$mBadge$img$threshold$xp$level$missionId]) {
  331.             $badgeStr $badge "'{$badge}'" 'NULL';
  332.             $mBadgeStr $mBadge "'{$mBadge}'" 'NULL';
  333.             $imgStr $img "'{$img}'" 'NULL';
  334.             $this->addSql("INSERT INTO mybiz_mission_level (id, badge_name, badge_marketing_name, badge_image, threshold, xp, level_number, mission_id)
  335.                 VALUES ({$id}{$badgeStr}{$mBadgeStr}{$imgStr}{$threshold}{$xp}{$level}{$missionId})");
  336.         }
  337.         // Weekly mission levels (IDs 18-45)
  338.         $weeklyLevels = [
  339.             [510118],
  340.             [810119],
  341.             [310120],
  342.             [550121],
  343.             [225122],
  344.             [125123],
  345.             [510124],
  346.             [1025125],
  347.             [510126],
  348.             [225127],
  349.             [150128],
  350.             [125129],
  351.             [150130],
  352.             [450131],
  353.             [25010132],
  354.             [50010133],
  355.             [100025134],
  356.             [150025135],
  357.             [200050136],
  358.             [250050137],
  359.             [125138],
  360.             [225139],
  361.             [350140],
  362.             [550141],
  363.             [150142],
  364.             [350143],
  365.             [550144],
  366.             [150145],
  367.         ];
  368.         foreach ($weeklyLevels as [$threshold$xp$level$missionId]) {
  369.             $this->addSql("INSERT INTO mybiz_mission_level (threshold, xp, level_number, mission_id)
  370.                 VALUES ({$threshold}{$xp}{$level}{$missionId})");
  371.         }
  372.         // Daily mission levels (IDs 46-101)
  373.         $dailyLevels = [
  374.             [110146],
  375.             [110147],
  376.             [110148],
  377.             [110149],
  378.             [210150],
  379.             [110151],
  380.             [110152],
  381.             [110153],
  382.             [110154],
  383.             [110155],
  384.             [110156],
  385.             [110157],
  386.             [110158],
  387.             [110159],
  388.             [110160],
  389.             [110161],
  390.             [110162],
  391.             [110163],
  392.             [110164],
  393.             [210165],
  394.             [110166],
  395.             [210167],
  396.             [210168],
  397.             [110169],
  398.             [110170],
  399.             [125171],
  400.             [250172],
  401.             [125173],
  402.             [125174],
  403.             [125175],
  404.             [110176],
  405.             [225177],
  406.             [110178],
  407.             [110179],
  408.             [225180],
  409.             [150181],
  410.             [125182],
  411.             [150183],
  412.             [250184],
  413.             [5025185],
  414.             [8025186],
  415.             [10025187],
  416.             [15025188],
  417.             [20050189],
  418.             [25050190],
  419.             [30050191],
  420.             [10050192],
  421.             [25050193],
  422.             [125194],
  423.             [225195],
  424.             [350196],
  425.             [550197],
  426.             [150198],
  427.             [150199],
  428.             [1501100],
  429.             [1501101],
  430.         ];
  431.         foreach ($dailyLevels as [$threshold$xp$level$missionId]) {
  432.             $this->addSql("INSERT INTO mybiz_mission_level (threshold, xp, level_number, mission_id)
  433.                 VALUES ({$threshold}{$xp}{$level}{$missionId})");
  434.         }
  435.     }
  436.     public function down(Schema $schema): void
  437.     {
  438.         // Drop foreign key constraints first
  439.         $this->addSql('ALTER TABLE mybiz_mission_history DROP FOREIGN KEY FK_MISSION_HISTORY_MEMBER');
  440.         $this->addSql('ALTER TABLE mybiz_mission_history DROP FOREIGN KEY FK_MISSION_HISTORY_MISSION');
  441.         $this->addSql('ALTER TABLE mybiz_mission_history DROP FOREIGN KEY FK_MISSION_HISTORY_MISSION_LEVEL');
  442.         $this->addSql('ALTER TABLE mybiz_mission_level DROP FOREIGN KEY FK_MISSION_LEVEL_MISSION');
  443.         // Drop tables
  444.         $this->addSql('DROP TABLE mybiz_mission_history');
  445.         $this->addSql('DROP TABLE mybiz_mission_level');
  446.         $this->addSql('DROP TABLE mybiz_mission');
  447.     }
  448. }