<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use App\Entity\Gamification\Mission;
use App\Service\Gamification\MissionIdentifier;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
final class Version20260115140000 extends AbstractMigration
{
public function getDescription(): string
{
return 'Consolidated migration for Gamification tables and data';
}
public function up(Schema $schema): void
{
// 1. SCHEMA CREATION
// mybiz_mission table
$this->addSql('CREATE TABLE mybiz_mission (
id INT AUTO_INCREMENT NOT NULL,
name VARCHAR(255) NOT NULL,
marketing_name VARCHAR(255) NOT NULL,
recurrence VARCHAR(255) NOT NULL,
is_enabled TINYINT(1) NOT NULL DEFAULT 1,
category VARCHAR(255) DEFAULT NULL,
PRIMARY KEY(id)
) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB');
// mybiz_mission_level table
$this->addSql('CREATE TABLE mybiz_mission_level (
id INT AUTO_INCREMENT NOT NULL,
badge_name VARCHAR(255) DEFAULT NULL,
badge_marketing_name VARCHAR(255) DEFAULT NULL,
badge_image VARCHAR(255) DEFAULT NULL,
threshold DOUBLE PRECISION NOT NULL,
xp INT NOT NULL,
level_number INT NOT NULL,
mission_id INT NOT NULL,
INDEX IDX_MISSION_LEVEL_MISSION (mission_id),
PRIMARY KEY(id)
) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB');
// mybiz_mission_history table
$this->addSql('CREATE TABLE mybiz_mission_history (
id INT AUTO_INCREMENT NOT NULL,
member_id INT NOT NULL,
mission_id INT NOT NULL,
mission_level_id INT DEFAULT NULL,
xp INT NOT NULL,
created_at DATETIME NOT NULL COMMENT \'(DC2Type:datetime_immutable)\',
updated_at DATETIME DEFAULT NULL COMMENT \'(DC2Type:datetime_immutable)\',
is_deprecated TINYINT(1) NOT NULL DEFAULT 0,
context JSON DEFAULT NULL COMMENT \'(DC2Type:json)\',
progress DOUBLE PRECISION DEFAULT NULL,
is_completed TINYINT(1) DEFAULT 0 NOT NULL,
INDEX IDX_MISSION_HISTORY_MEMBER (member_id),
INDEX IDX_MISSION_HISTORY_MISSION (mission_id),
INDEX IDX_MISSION_HISTORY_MISSION_LEVEL (mission_level_id),
PRIMARY KEY(id)
) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB');
// Foreign key constraints
$this->addSql('ALTER TABLE mybiz_mission_level ADD CONSTRAINT FK_MISSION_LEVEL_MISSION FOREIGN KEY (mission_id) REFERENCES mybiz_mission (id)');
$this->addSql('ALTER TABLE mybiz_mission_history ADD CONSTRAINT FK_MISSION_HISTORY_MEMBER FOREIGN KEY (member_id) REFERENCES app_member (id)');
$this->addSql('ALTER TABLE mybiz_mission_history ADD CONSTRAINT FK_MISSION_HISTORY_MISSION FOREIGN KEY (mission_id) REFERENCES mybiz_mission (id)');
$this->addSql('ALTER TABLE mybiz_mission_history ADD CONSTRAINT FK_MISSION_HISTORY_MISSION_LEVEL FOREIGN KEY (mission_level_id) REFERENCES mybiz_mission_level (id)');
// 2. DATA INSERTION - MISSIONS
// One-time and Monthly missions (IDs 1-17)
$missionsOneTimeMonthly = [
[1, MissionIdentifier::TYPE_ONE_TIME_COMMISSION, 'one_time_commission', 'one_time', 1],
[2, MissionIdentifier::TYPE_ONE_TIME_RANK, 'one_time_rank', 'one_time', 1],
[3, MissionIdentifier::TYPE_ONE_TIME_PERSONAL_CLIENT, 'one_time_personal_client', 'one_time', 1],
[4, MissionIdentifier::TYPE_ONE_TIME_QUALIFICATION_IN_PERSONAL_CLIENTS, 'one_time_qualification_in_personal_clients', 'one_time', 1],
[5, MissionIdentifier::TYPE_ONE_TIME_PERSONAL_CLIENT_POINT, 'one_time_personal_client_point', 'one_time', 1],
[6, MissionIdentifier::TYPE_ONE_TIME_CONNECTION, 'one_time_connection', 'one_time', 1],
[7, MissionIdentifier::TYPE_ONE_TIME_BIRTH_BIZ_DAY, 'one_time_birth_biz_day', 'one_time', 1],
[8, MissionIdentifier::TYPE_ONE_TIME_ACTIVE_BIZPARTNER, 'one_time_active_bizpartner', 'one_time', 1],
[9, MissionIdentifier::TYPE_ONE_TIME_ACTIVE_CLIENT, 'one_time_active_client', 'one_time', 1],
[10, MissionIdentifier::TYPE_ONE_TIME_COUNTRY_POINT, 'one_time_country_point', 'one_time', 1],
[11, MissionIdentifier::TYPE_ONE_TIME_FUTURES_POINT, 'one_time_futures_point', 'one_time', 1],
[12, MissionIdentifier::TYPE_ONE_TIME_LUUME_POINT, 'one_time_luume_point', 'one_time', 1],
[13, MissionIdentifier::TYPE_ONE_TIME_MISSION_COMPLETED, 'one_time_mission_completed', 'one_time', 1],
[14, MissionIdentifier::TYPE_MONTHLY_PERSONAL_CLIENT_POINT, 'monthly_personal_client_point', 'monthly', 1],
[15, MissionIdentifier::TYPE_MONTHLY_TOP_PERFORMER, 'monthly_top_performer', 'monthly', 1],
[16, MissionIdentifier::TYPE_MONTHLY_QUALIFICATION, 'monthly_qualification', 'monthly', 1],
];
foreach ($missionsOneTimeMonthly as [$id, $name, $marketingName, $recurrence, $isEnabled]) {
$this->addSql("INSERT INTO mybiz_mission (id, name, marketing_name, recurrence, is_enabled)
VALUES ({$id}, '{$name}', '{$marketingName}', '{$recurrence}', {$isEnabled})");
}
// Weekly missions (IDs 18-45)
$missionsWeekly = [
[18, MissionIdentifier::TYPE_WEEKLY_ADD_5_EVENTS, 'weekly_add_5_events', 'weekly', Mission::CATEGORY_BACKOFFICE_AND_NAVIGATION, 1],
[19, MissionIdentifier::TYPE_WEEKLY_ADD_8_PROSPECTS, 'weekly_add_8_prospects', 'weekly', Mission::CATEGORY_BACKOFFICE_AND_NAVIGATION, 1],
[20, MissionIdentifier::TYPE_WEEKLY_MAKE_3_SALES, 'weekly_make_3_sales', 'weekly', Mission::CATEGORY_SALES_AND_PLACEMENTS, 1],
[21, MissionIdentifier::TYPE_WEEKLY_MAKE_5_SALES, 'weekly_make_5_sales', 'weekly', Mission::CATEGORY_SALES_AND_PLACEMENTS, 1],
[22, MissionIdentifier::TYPE_WEEKLY_MAKE_2_SALES_ABOVE_100, 'weekly_make_2_sales_above_100', 'weekly', Mission::CATEGORY_SALES_AND_PLACEMENTS, 1],
[23, MissionIdentifier::TYPE_WEEKLY_MAKE_SALE_ABOVE_AVERAGE, 'weekly_make_sale_above_average', 'weekly', Mission::CATEGORY_SALES_AND_PLACEMENTS, 1],
[24, MissionIdentifier::TYPE_WEEKLY_MAKE_5_PLACEMENTS, 'weekly_make_5_placements', 'weekly', Mission::CATEGORY_SALES_AND_PLACEMENTS, 1],
[25, MissionIdentifier::TYPE_WEEKLY_MAKE_10_PLACEMENTS, 'weekly_make_10_placements', 'weekly', Mission::CATEGORY_SALES_AND_PLACEMENTS, 1],
[26, MissionIdentifier::TYPE_WEEKLY_LOGIN_5_DAYS, 'weekly_login_5_days', 'weekly', Mission::CATEGORY_SALES_AND_PLACEMENTS, 1],
[27, MissionIdentifier::TYPE_WEEKLY_MAKE_SALE_AND_PLACEMENT_SAME_DAY, 'weekly_make_sale_and_placement_same_day', 'weekly', Mission::CATEGORY_SALES_AND_PLACEMENTS, 1],
[28, MissionIdentifier::TYPE_WEEKLY_REACH_DAILY_SALES_RECORD, 'weekly_reach_daily_sales_record', 'weekly', Mission::CATEGORY_SALES_AND_PLACEMENTS, 1],
[29, MissionIdentifier::TYPE_WEEKLY_REACH_DAILY_PLACEMENT_RECORD, 'weekly_reach_daily_placement_record', 'weekly', Mission::CATEGORY_SALES_AND_PLACEMENTS, 1],
[30, MissionIdentifier::TYPE_WEEKLY_REACH_NEW_RANK, 'weekly_reach_new_rank', 'weekly', Mission::CATEGORY_SALES_AND_PLACEMENTS, 1],
[31, MissionIdentifier::TYPE_WEEKLY_GENERATE_2_LUUME_AND_2_FUTURESLEARN_SALES, 'weekly_generate_2_luume_and_2_futureslearn_sales', 'weekly', Mission::CATEGORY_SALES_AND_PLACEMENTS, 1],
[32, MissionIdentifier::TYPE_WEEKLY_GENERATE_250_POINTS, 'weekly_generate_250_points', 'weekly', Mission::CATEGORY_POINTS_XP_AND_RANKINGS, 1],
[33, MissionIdentifier::TYPE_WEEKLY_GENERATE_500_POINTS, 'weekly_generate_500_points', 'weekly', Mission::CATEGORY_POINTS_XP_AND_RANKINGS, 1],
[34, MissionIdentifier::TYPE_WEEKLY_GENERATE_1000_POINTS, 'weekly_generate_1000_points', 'weekly', Mission::CATEGORY_POINTS_XP_AND_RANKINGS, 1],
[35, MissionIdentifier::TYPE_WEEKLY_GENERATE_1500_POINTS, 'weekly_generate_1500_points', 'weekly', Mission::CATEGORY_POINTS_XP_AND_RANKINGS, 1],
[36, MissionIdentifier::TYPE_WEEKLY_GENERATE_2000_POINTS, 'weekly_generate_2000_points', 'weekly', Mission::CATEGORY_POINTS_XP_AND_RANKINGS, 1],
[37, MissionIdentifier::TYPE_WEEKLY_GENERATE_2500_POINTS, 'weekly_generate_2500_points', 'weekly', Mission::CATEGORY_POINTS_XP_AND_RANKINGS, 1],
[38, MissionIdentifier::TYPE_WEEKLY_GENERATE_MORE_POINTS_THAN_LAST_WEEK, 'weekly_generate_more_points_than_last_week', 'weekly', Mission::CATEGORY_POINTS_XP_AND_RANKINGS, 1],
[39, MissionIdentifier::TYPE_WEEKLY_GENERATE_POINTS_2_DAYS_IN_ROW, 'weekly_generate_points_2_days_in_row', 'weekly', Mission::CATEGORY_POINTS_XP_AND_RANKINGS, 1],
[40, MissionIdentifier::TYPE_WEEKLY_GENERATE_POINTS_3_DAYS_IN_ROW, 'weekly_generate_points_3_days_in_row', 'weekly', Mission::CATEGORY_POINTS_XP_AND_RANKINGS, 1],
[41, MissionIdentifier::TYPE_WEEKLY_GENERATE_POINTS_5_DAYS_IN_ROW, 'weekly_generate_points_5_days_in_row', 'weekly', Mission::CATEGORY_POINTS_XP_AND_RANKINGS, 1],
[42, MissionIdentifier::TYPE_WEEKLY_APPEAR_IN_TOP_PERFORMER, 'weekly_appear_in_top_performer', 'weekly', Mission::CATEGORY_POINTS_XP_AND_RANKINGS, 1],
[43, MissionIdentifier::TYPE_WEEKLY_APPEAR_IN_TOP_3_PERFORMER, 'weekly_appear_in_top_3_performer', 'weekly', Mission::CATEGORY_POINTS_XP_AND_RANKINGS, 1],
[44, MissionIdentifier::TYPE_WEEKLY_APPEAR_IN_TOP_5_PERFORMER, 'weekly_appear_in_top_5_performer', 'weekly', Mission::CATEGORY_POINTS_XP_AND_RANKINGS, 1],
[45, MissionIdentifier::TYPE_WEEKLY_REACH_WEEKLY_POINTS_RECORD, 'weekly_reach_weekly_points_record', 'weekly', Mission::CATEGORY_POINTS_XP_AND_RANKINGS, 1],
];
foreach ($missionsWeekly as [$id, $name, $marketingName, $recurrence, $category, $isEnabled]) {
$this->addSql("INSERT INTO mybiz_mission (id, name, marketing_name, recurrence, category, is_enabled)
VALUES ({$id}, '{$name}', '{$marketingName}', '{$recurrence}', '{$category}', {$isEnabled})");
}
// Daily missions (IDs 46-101)
$missionsDaily = [
[46, MissionIdentifier::TYPE_DAILY_LOGIN_BACKOFFICE, 'daily_login_backoffice', 'daily', Mission::CATEGORY_BACKOFFICE_AND_NAVIGATION, 1],
[47, MissionIdentifier::TYPE_DAILY_LOGIN_MOBILE, 'daily_login_mobile', 'daily', Mission::CATEGORY_BACKOFFICE_AND_NAVIGATION, 1],
[48, MissionIdentifier::TYPE_DAILY_LOGIN_BEFORE_10AM, 'daily_login_before_10am', 'daily', Mission::CATEGORY_BACKOFFICE_AND_NAVIGATION, 1],
[49, MissionIdentifier::TYPE_DAILY_LOGIN_AFTER_6PM, 'daily_login_after_6pm', 'daily', Mission::CATEGORY_BACKOFFICE_AND_NAVIGATION, 1],
[50, MissionIdentifier::TYPE_DAILY_LOGIN_TWICE, 'daily_login_twice', 'daily', Mission::CATEGORY_BACKOFFICE_AND_NAVIGATION, 1],
[51, MissionIdentifier::TYPE_DAILY_VIEW_DASHBOARD, 'daily_view_dashboard', 'daily', Mission::CATEGORY_BACKOFFICE_AND_NAVIGATION, 1],
[52, MissionIdentifier::TYPE_DAILY_VIEW_PROFILE, 'daily_view_profile', 'daily', Mission::CATEGORY_BACKOFFICE_AND_NAVIGATION, 1],
[53, MissionIdentifier::TYPE_DAILY_VIEW_MISSIONS, 'daily_view_missions', 'daily', Mission::CATEGORY_BACKOFFICE_AND_NAVIGATION, 1],
[54, MissionIdentifier::TYPE_DAILY_VIEW_PROGRESSION, 'daily_view_progression', 'daily', Mission::CATEGORY_BACKOFFICE_AND_NAVIGATION, 1],
[55, MissionIdentifier::TYPE_DAILY_VIEW_GAMIFICATION, 'daily_view_gamification', 'daily', Mission::CATEGORY_BACKOFFICE_AND_NAVIGATION, 1],
[56, MissionIdentifier::TYPE_DAILY_VIEW_RANKINGS, 'daily_view_rankings', 'daily', Mission::CATEGORY_BACKOFFICE_AND_NAVIGATION, 1],
[57, MissionIdentifier::TYPE_DAILY_VIEW_CLIENTS, 'daily_view_clients', 'daily', Mission::CATEGORY_BACKOFFICE_AND_NAVIGATION, 1],
[58, MissionIdentifier::TYPE_DAILY_VIEW_SALES, 'daily_view_sales', 'daily', Mission::CATEGORY_BACKOFFICE_AND_NAVIGATION, 0], // Deactivated
[59, MissionIdentifier::TYPE_DAILY_VIEW_PLACEMENTS, 'daily_view_placements', 'daily', Mission::CATEGORY_BACKOFFICE_AND_NAVIGATION, 1],
[60, MissionIdentifier::TYPE_DAILY_VIEW_STATISTICS, 'daily_view_statistics', 'daily', Mission::CATEGORY_BACKOFFICE_AND_NAVIGATION, 1],
[61, MissionIdentifier::TYPE_DAILY_VIEW_GOALS, 'daily_view_goals', 'daily', Mission::CATEGORY_BACKOFFICE_AND_NAVIGATION, 0], // Deactivated
[62, MissionIdentifier::TYPE_DAILY_ADD_CALENDAR_EVENT, 'daily_add_calendar_event', 'daily', Mission::CATEGORY_BACKOFFICE_AND_NAVIGATION, 1],
[63, MissionIdentifier::TYPE_DAILY_CHECK_NOTIFICATIONS, 'daily_check_notifications', 'daily', Mission::CATEGORY_BACKOFFICE_AND_NAVIGATION, 1],
[64, MissionIdentifier::TYPE_DAILY_VIEW_ACTIVE_CLIENT, 'daily_view_active_client', 'daily', Mission::CATEGORY_BACKOFFICE_AND_NAVIGATION, 1],
[65, MissionIdentifier::TYPE_DAILY_VIEW_TWO_ACTIVE_CLIENTS, 'daily_view_two_active_clients', 'daily', Mission::CATEGORY_BACKOFFICE_AND_NAVIGATION, 1],
[66, MissionIdentifier::TYPE_DAILY_VIEW_INACTIVE_CLIENT, 'daily_view_inactive_client', 'daily', Mission::CATEGORY_BACKOFFICE_AND_NAVIGATION, 1],
[67, MissionIdentifier::TYPE_DAILY_VIEW_TWO_INACTIVE_CLIENTS, 'daily_view_two_inactive_clients', 'daily', Mission::CATEGORY_BACKOFFICE_AND_NAVIGATION, 1],
[68, MissionIdentifier::TYPE_DAILY_ADD_TWO_CARD_KANBAN, 'daily_add_two_card_kanban', 'daily', Mission::CATEGORY_BACKOFFICE_AND_NAVIGATION, 1],
[69, MissionIdentifier::TYPE_DAILY_MYBIZ_RESOURCE_DOWNLOADED, 'daily_mybiz_resource_downloaded', 'daily', Mission::CATEGORY_BACKOFFICE_AND_NAVIGATION, 0], // Deactivated
[70, MissionIdentifier::TYPE_DAILY_MYBIZ_NEWS_VIEWED, 'daily_mybiz_news_viewed', 'daily', Mission::CATEGORY_BACKOFFICE_AND_NAVIGATION, 0], // Deactivated
[71, MissionIdentifier::TYPE_DAILY_MAKE_SALE, 'daily_make_sale', 'daily', Mission::CATEGORY_SALES_AND_PLACEMENTS, 1],
[72, MissionIdentifier::TYPE_DAILY_MAKE_TWO_SALES, 'daily_make_two_sales', 'daily', Mission::CATEGORY_SALES_AND_PLACEMENTS, 1],
[73, MissionIdentifier::TYPE_DAILY_MAKE_SALE_BEFORE_3PM, 'daily_make_sale_before_3pm', 'daily', Mission::CATEGORY_SALES_AND_PLACEMENTS, 1],
[74, MissionIdentifier::TYPE_DAILY_MAKE_SALE_AFTER_3PM, 'daily_make_sale_after_3pm', 'daily', Mission::CATEGORY_SALES_AND_PLACEMENTS, 1],
[75, MissionIdentifier::TYPE_DAILY_MAKE_SALE_ABOVE_AVERAGE, 'daily_make_sale_above_average', 'daily', Mission::CATEGORY_SALES_AND_PLACEMENTS, 1],
[76, MissionIdentifier::TYPE_DAILY_MAKE_PLACEMENT, 'daily_make_placement', 'daily', Mission::CATEGORY_SALES_AND_PLACEMENTS, 1],
[77, MissionIdentifier::TYPE_DAILY_MAKE_TWO_PLACEMENTS, 'daily_make_two_placements', 'daily', Mission::CATEGORY_SALES_AND_PLACEMENTS, 1],
[78, MissionIdentifier::TYPE_DAILY_MAKE_PLACEMENT_BEFORE_3PM, 'daily_make_placement_before_3pm', 'daily', Mission::CATEGORY_SALES_AND_PLACEMENTS, 1],
[79, MissionIdentifier::TYPE_DAILY_MAKE_PLACEMENT_AFTER_3PM, 'daily_make_placement_after_3pm', 'daily', Mission::CATEGORY_SALES_AND_PLACEMENTS, 1],
[80, MissionIdentifier::TYPE_DAILY_MAKE_SALE_AND_PLACEMENT, 'daily_make_sale_and_placement', 'daily', Mission::CATEGORY_SALES_AND_PLACEMENTS, 1],
[81, MissionIdentifier::TYPE_DAILY_REACH_PERSONAL_SALES_RECORD, 'daily_reach_personal_sales_record', 'daily', Mission::CATEGORY_SALES_AND_PLACEMENTS, 1],
[82, MissionIdentifier::TYPE_DAILY_REACH_PERSONAL_PLACEMENT_RECORD, 'daily_reach_personal_placement_record', 'daily', Mission::CATEGORY_SALES_AND_PLACEMENTS, 1],
[83, MissionIdentifier::TYPE_DAILY_REACH_NEW_RANK, 'daily_reach_new_rank', 'daily', Mission::CATEGORY_SALES_AND_PLACEMENTS, 1],
[84, MissionIdentifier::TYPE_DAILY_MAKE_LUUME_AND_FUTURESLEARN_SALE, 'daily_make_luume_and_futureslearn_sale', 'daily', Mission::CATEGORY_SALES_AND_PLACEMENTS, 1],
[85, MissionIdentifier::TYPE_DAILY_GENERATE_50_POINTS, 'daily_generate_50_points', 'daily', Mission::CATEGORY_POINTS_XP_AND_RANKINGS, 1],
[86, MissionIdentifier::TYPE_DAILY_GENERATE_80_POINTS, 'daily_generate_80_points', 'daily', Mission::CATEGORY_POINTS_XP_AND_RANKINGS, 1],
[87, MissionIdentifier::TYPE_DAILY_GENERATE_100_POINTS, 'daily_generate_100_points', 'daily', Mission::CATEGORY_POINTS_XP_AND_RANKINGS, 1],
[88, MissionIdentifier::TYPE_DAILY_GENERATE_150_POINTS, 'daily_generate_150_points', 'daily', Mission::CATEGORY_POINTS_XP_AND_RANKINGS, 1],
[89, MissionIdentifier::TYPE_DAILY_GENERATE_200_POINTS, 'daily_generate_200_points', 'daily', Mission::CATEGORY_POINTS_XP_AND_RANKINGS, 1],
[90, MissionIdentifier::TYPE_DAILY_GENERATE_250_POINTS, 'daily_generate_250_points', 'daily', Mission::CATEGORY_POINTS_XP_AND_RANKINGS, 1],
[91, MissionIdentifier::TYPE_DAILY_GENERATE_300_POINTS, 'daily_generate_300_points', 'daily', Mission::CATEGORY_POINTS_XP_AND_RANKINGS, 1],
[92, MissionIdentifier::TYPE_DAILY_GENERATE_100_POINTS_BEFORE_3PM, 'daily_generate_100_points_before_3pm', 'daily', Mission::CATEGORY_POINTS_XP_AND_RANKINGS, 1],
[93, MissionIdentifier::TYPE_DAILY_GENERATE_250_POINTS_BEFORE_6PM, 'daily_generate_250_points_before_6pm', 'daily', Mission::CATEGORY_POINTS_XP_AND_RANKINGS, 1],
[94, MissionIdentifier::TYPE_DAILY_GENERATE_MORE_POINTS_THAN_YESTERDAY, 'daily_generate_more_points_than_yesterday', 'daily', Mission::CATEGORY_POINTS_XP_AND_RANKINGS, 1],
[95, MissionIdentifier::TYPE_DAILY_GENERATE_POINTS_2_DAYS_IN_ROW, 'daily_generate_points_2_days_in_row', 'daily', Mission::CATEGORY_POINTS_XP_AND_RANKINGS, 0], // Deactivated
[96, MissionIdentifier::TYPE_DAILY_GENERATE_POINTS_3_DAYS_IN_ROW, 'daily_generate_points_3_days_in_row', 'daily', Mission::CATEGORY_POINTS_XP_AND_RANKINGS, 0], // Deactivated
[97, MissionIdentifier::TYPE_DAILY_GENERATE_POINTS_5_DAYS_IN_ROW, 'daily_generate_points_5_days_in_row', 'daily', Mission::CATEGORY_POINTS_XP_AND_RANKINGS, 0], // Deactivated
[98, MissionIdentifier::TYPE_DAILY_APPEAR_IN_TOP_PERFORMER, 'daily_appear_in_top_performer', 'daily', Mission::CATEGORY_POINTS_XP_AND_RANKINGS, 1],
[99, MissionIdentifier::TYPE_DAILY_APPEAR_IN_TOP_3_PERFORMER, 'daily_appear_in_top_3_performer', 'daily', Mission::CATEGORY_POINTS_XP_AND_RANKINGS, 1],
[100, MissionIdentifier::TYPE_DAILY_APPEAR_IN_TOP_5_PERFORMER, 'daily_appear_in_top_5_performer', 'daily', Mission::CATEGORY_POINTS_XP_AND_RANKINGS, 1],
[101, MissionIdentifier::TYPE_DAILY_REACH_DAILY_POINTS_RECORD, 'daily_reach_daily_points_record', 'daily', Mission::CATEGORY_POINTS_XP_AND_RANKINGS, 1],
];
foreach ($missionsDaily as [$id, $name, $marketingName, $recurrence, $category, $isEnabled]) {
$this->addSql("INSERT INTO mybiz_mission (id, name, marketing_name, recurrence, category, is_enabled)
VALUES ({$id}, '{$name}', '{$marketingName}', '{$recurrence}', '{$category}', {$isEnabled})");
}
// 3. DATA INSERTION - MISSION LEVELS
$missionLevels = [
// One-time missions (IDs 1-13)
[1, 'earner_500', 'Earner 500', 'earner_500', 500, 100, 1, 1],
[2, 'earner_1000', 'Earner 1000', 'earner_1000', 1000, 150, 2, 1],
[3, 'earner_2000', 'Earner 2000', 'earner_2000', 2000, 200, 3, 1],
[4, 'earner_5000', 'Earner 5000', 'earner_5000', 5000, 250, 4, 1],
[5, 'earner_10000', 'Earner 10000', 'earner_10000', 10000, 300, 5, 1],
[6, 'earner_20000', 'Earner 20000', 'earner_20000', 20000, 350, 6, 1],
[7, 'earner_50000', 'Earner 50000', 'earner_50000', 50000, 500, 7, 1],
[8, 'earner_100000', 'Earner 100000', 'earner_100000', 100000, 750, 8, 1],
[9, 'earner_200000', 'Earner 200000', 'earner_200000', 200000, 1000, 9, 1],
[10, 'earner_500000', 'Earner 500000', 'earner_500000', 500000, 2000, 10, 1],
[11, 'earner_1000000', 'Earner 1000000', 'earner_1000000', 1000000, 5000, 11, 1],
[12, 'biz_challenger', 'BizChallenger', 'biz_challenger', 2, 100, 1, 2],
[13, 'biz_director', 'BizDirector', 'biz_director', 3, 250, 2, 2],
[14, 'iron_partner', 'Iron', 'iron_partner', 4, 500, 3, 2],
[15, 'biz_ambassador', 'BizAmbassador', 'biz_ambassador', 5, 750, 4, 2],
[16, 'diamond_10', 'Diamond 10', 'diamond_10', 6, 1000, 5, 2],
[17, 'diamond_20', 'Diamond 20', 'diamond_20', 7, 1500, 6, 2],
[18, 'diamond_50', 'Diamond 50', 'diamond_50', 8, 2000, 7, 2],
[19, 'legend_100', 'Legend 100', 'legend_100', 9, 2500, 8, 2],
[20, 'legend_250', 'Legend 250', 'legend_250', 10, 5000, 9, 2],
[21, 'legend_500', 'Legend 500', 'legend_500', 11, 10000, 10, 2],
[22, 'biz_recruiter_1', 'BizRecruiter 1', 'biz_recruiter_1', 1, 100, 1, 3],
[23, 'biz_recruiter_3', 'BizRecruiter 3', 'biz_recruiter_3', 3, 200, 2, 3],
[24, 'biz_recruiter_5', 'BizRecruiter 5', 'biz_recruiter_5', 5, 300, 3, 3],
[25, 'biz_recruiter_10', 'BizRecruiter 10', 'biz_recruiter_10', 10, 400, 4, 3],
[26, 'biz_recruiter_20', 'BizRecruiter 20', 'biz_recruiter_20', 20, 500, 5, 3],
[27, 'biz_recruiter_30', 'BizRecruiter 30', 'biz_recruiter_30', 30, 600, 6, 3],
[28, 'biz_recruiter_50', 'BizRecruiter 50', 'biz_recruiter_50', 50, 800, 7, 3],
[29, 'biz_recruiter_70', 'BizRecruiter 70', 'biz_recruiter_70', 70, 1000, 8, 3],
[30, 'biz_recruiter_100', 'BizRecruiter 100', 'biz_recruiter_100', 100, 1200, 9, 3],
[31, 'biz_recruiter_200', 'BizRecruiter 200', 'biz_recruiter_200', 200, 1400, 10, 3],
[32, 'biz_recruiter_500', 'BizRecruiter 500', 'biz_recruiter_500', 500, 1500, 11, 3],
[33, 'biz_recruiter_1000', 'BizRecruiter 1000', 'biz_recruiter_1000', 1000, 2000, 12, 3],
[34, 'biz_creator_1', 'BizCreator 1', 'biz_creator_1', 1, 50, 1, 4],
[35, 'biz_creator_10', 'BizCreator 10', 'biz_creator_10', 10, 100, 2, 4],
[36, 'biz_creator_20', 'BizCreator 20', 'biz_creator_20', 20, 200, 3, 4],
[37, 'biz_creator_30', 'BizCreator 30', 'biz_creator_30', 30, 300, 4, 4],
[38, 'biz_creator_50', 'BizCreator 50', 'biz_creator_50', 50, 400, 5, 4],
[39, 'biz_creator_80', 'BizCreator 80', 'biz_creator_80', 80, 500, 6, 4],
[40, 'biz_creator_100', 'BizCreator 100', 'biz_creator_100', 100, 750, 7, 4],
[41, 'biz_creator_200', 'BizCreator 200', 'biz_creator_200', 200, 1000, 8, 4],
[42, 'biz_creator_500', 'BizCreator 500', 'biz_creator_500', 500, 1500, 9, 4],
[43, 'biz_creator_1000', 'BizCreator 1000', 'biz_creator_1000', 1000, 3000, 10, 4],
[44, 'biz_master_500', 'BizMaster 500', 'biz_master_500', 500, 50, 1, 5],
[45, 'biz_master_1000', 'BizMaster 1000', 'biz_master_1000', 1000, 150, 2, 5],
[46, 'biz_master_5000', 'BizMaster 5000', 'biz_master_5000', 5000, 250, 3, 5],
[47, 'biz_master_10000', 'BizMaster 10000', 'biz_master_10000', 10000, 400, 4, 5],
[48, 'biz_master_25000', 'BizMaster 25000', 'biz_master_25000', 25000, 750, 5, 5],
[49, 'biz_master_50000', 'BizMaster 50000', 'biz_master_50000', 50000, 1000, 6, 5],
[50, 'biz_master_100000', 'BizMaster 100000', 'biz_master_100000', 100000, 1500, 7, 5],
[51, 'biz_master_300000', 'BizMaster 300000', 'biz_master_300000', 300000, 2500, 8, 5],
[52, 'regular_7', 'Regular 7', 'regular_7', 7, 50, 1, 6],
[53, 'regular_30', 'Regular 30', 'regular_30', 30, 100, 2, 6],
[54, 'regular_90', 'Regular 90', 'regular_90', 90, 150, 3, 6],
[55, 'regular_180', 'Regular 180', 'regular_180', 180, 200, 4, 6],
[56, 'regular_365', 'Regular 365', 'regular_365', 365, 250, 5, 6],
[57, 'regular_500', 'Regular 500', 'regular_500', 500, 300, 6, 6],
[58, 'regular_1000', 'Regular 1000', 'regular_1000', 1000, 400, 7, 6],
[59, 'regular_2500', 'Regular 2500', 'regular_2500', 2500, 500, 8, 6],
[60, 'regular_5000', 'Regular 5000', 'regular_5000', 5000, 1000, 9, 6],
[61, 'happy_1st_bizday', 'Happy 1st BizDay', 'happy_1st_bizday', 1, 500, 1, 7],
[62, 'happy_2nd_bizday', 'Happy 2nd BizDay', 'happy_2nd_bizday', 2, 1000, 2, 7],
[63, 'happy_3rd_bizday', 'Happy 3rd BizDay', 'happy_3rd_bizday', 3, 1500, 3, 7],
[64, 'happy_4th_bizday', 'Happy 4th BizDay', 'happy_4th_bizday', 4, 2000, 4, 7],
[65, 'happy_5th_bizday', 'Happy 5th BizDay', 'happy_5th_bizday', 5, 2500, 5, 7],
[66, 'biz_builder_1', 'BizBuilder 1', 'biz_builder_1', 1, 50, 1, 8],
[67, 'biz_builder_10', 'BizBuilder 10', 'biz_builder_10', 10, 100, 2, 8],
[68, 'biz_builder_20', 'BizBuilder 20', 'biz_builder_20', 20, 250, 3, 8],
[69, 'biz_builder_50', 'BizBuilder 50', 'biz_builder_50', 50, 400, 4, 8],
[70, 'biz_builder_100', 'BizBuilder 100', 'biz_builder_100', 100, 500, 5, 8],
[71, 'biz_builder_200', 'BizBuilder 200', 'biz_builder_200', 200, 650, 6, 8],
[72, 'biz_builder_500', 'BizBuilder 500', 'biz_builder_500', 500, 750, 7, 8],
[73, 'biz_builder_1000', 'BizBuilder 1 000', 'biz_builder_1000', 1000, 1000, 8, 8],
[74, 'biz_builder_2500', 'BizBuilder 2500', 'biz_builder_2500', 2500, 1500, 9, 8],
[75, 'biz_builder_5000', 'BizBuilder 5000', 'biz_builder_5000', 5000, 2500, 10, 8],
[76, 'sales_1', 'Sales 1', 'sales_1', 1, 50, 1, 9],
[77, 'sales_10', 'Sales 10', 'sales_10', 10, 250, 2, 9],
[78, 'sales_50', 'Sales 50', 'sales_50', 50, 500, 3, 9],
[79, 'sales_100', 'Sales 100', 'sales_100', 100, 600, 4, 9],
[80, 'sales_200', 'Sales 200', 'sales_200', 200, 700, 5, 9],
[81, 'sales_500', 'Sales 500', 'sales_500', 500, 800, 6, 9],
[82, 'sales_1000', 'Sales 1 000', 'sales_1000', 1000, 1000, 7, 9],
[83, 'sales_2500', 'Sales 2500', 'sales_2500', 2500, 1250, 8, 9],
[84, 'sales_5000', 'Sales 5000', 'sales_5000', 5000, 1500, 9, 9],
[85, 'sales_7500', 'Sales 7500', 'sales_7500', 7500, 2500, 10, 9],
[86, 'sales_10000', 'Sales 10000', 'sales_10000', 10000, 5000, 11, 9],
[87, 'international_leader_2', 'International Leader 2', 'international_leader_2', 2, 100, 1, 10],
[88, 'international_leader_4', 'International Leader 4', 'international_leader_4', 4, 250, 2, 10],
[89, 'international_leader_7', 'International Leader 7', 'international_leader_7', 7, 500, 3, 10],
[90, 'international_leader_10', 'International Leader 10', 'international_leader_10', 10, 750, 4, 10],
[91, 'international_leader_15', 'International Leader 15', 'international_leader_15', 15, 1000, 5, 10],
[92, 'international_leader_20', 'International Leader 20', 'international_leader_20', 20, 1500, 6, 10],
[93, 'international_leader_25', 'International Leader 25', 'international_leader_25', 25, 2000, 7, 10],
[94, 'futures_seller_500', 'Futures Seller 500', 'futures_seller_500', 500, 100, 1, 11],
[95, 'futures_seller_1000', 'Futures Seller 1000', 'futures_seller_1000', 1000, 200, 2, 11],
[96, 'futures_seller_5000', 'Futures Seller 5000', 'futures_seller_5000', 5000, 400, 3, 11],
[97, 'futures_seller_10000', 'Futures Seller 10000', 'futures_seller_10000', 10000, 600, 4, 11],
[98, 'futures_seller_25000', 'Futures Seller 25000', 'futures_seller_25000', 25000, 900, 5, 11],
[99, 'futures_seller_50000', 'Futures Seller 50000', 'futures_seller_50000', 50000, 1200, 6, 11],
[100, 'futures_seller_100000', 'Futures Seller 100000', 'futures_seller_100000', 100000, 1500, 7, 11],
[101, 'futures_seller_300000', 'Futures Seller 300000', 'futures_seller_300000', 300000, 2000, 8, 11],
[102, 'luume_seller_500', 'Luume Seller 500', 'luume_seller_500', 500, 100, 1, 12],
[103, 'luume_seller_1000', 'Luume Seller 1 000', 'luume_seller_1000', 1000, 200, 2, 12],
[104, 'luume_seller_5000', 'Luume Seller 5 000', 'luume_seller_5000', 5000, 400, 3, 12],
[105, 'luume_seller_10000', 'Luume Seller 10 000', 'luume_seller_10000', 10000, 600, 4, 12],
[106, 'luume_seller_25000', 'Luume Seller 25 000', 'luume_seller_25000', 25000, 900, 5, 12],
[107, 'luume_seller_50000', 'Luume Seller 50 000', 'luume_seller_50000', 50000, 1200, 6, 12],
[108, 'luume_seller_100000', 'Luume Seller 100 000', 'luume_seller_100000', 100000, 1500, 7, 12],
[109, 'luume_seller_300000', 'Luume Seller 300 000', 'luume_seller_300000', 300000, 2000, 8, 12],
[110, 'achiever_1', 'Achiever 1', 'achiever_1', 1, 50, 1, 13],
[111, 'achiever_5', 'Achiever 5', 'achiever_5', 5, 100, 2, 13],
[112, 'achiever_10', 'Achiever 10', 'achiever_10', 10, 150, 3, 13],
[113, 'achiever_20', 'Achiever 20', 'achiever_20', 20, 200, 4, 13],
[114, 'achiever_50', 'Achiever 50', 'achiever_50', 50, 250, 5, 13],
[115, 'achiever_100', 'Achiever 100', 'achiever_100', 100, 300, 6, 13],
[116, 'achiever_200', 'Achiever 200', 'achiever_200', 200, 350, 7, 13],
[117, 'achiever_500', 'Achiever 500', 'achiever_500', 500, 400, 8, 13],
[118, 'achiever_1000', 'Achiever 1 000', 'achiever_1000', 1000, 750, 9, 13],
[119, 'achiever_2000', 'Achiever 2000', 'achiever_2000', 2000, 1000, 10, 13],
// Monthly missions (IDs 14-16)
[120, NULL, NULL, NULL, 500, 150, 1, 14],
[121, NULL, NULL, NULL, 1000, 250, 2, 14],
[122, NULL, NULL, NULL, 2000, 400, 3, 14],
[123, NULL, NULL, NULL, 5000, 700, 4, 14],
[124, NULL, NULL, NULL, 10000, 1000, 5, 14],
[125, NULL, NULL, NULL, 15000, 1500, 6, 14],
[126, NULL, NULL, NULL, 30000, 2000, 7, 14],
[127, 'top_10_performer', 'Top 10 Performer', 'top_10_performer', 10, 100, 1, 15],
[128, 'monthly_podium', 'Monthly Podium', 'monthly_podium', 3, 250, 2, 15],
[129, 'biz_champion', 'BizChampion', 'biz_champion', 2, 500, 3, 15],
[130, '1_of_the_month', '1 of the Month', '1_of_the_month', 1, 750, 4, 15],
[131, NULL, NULL, NULL, 2, 50, 1, 16],
[132, NULL, NULL, NULL, 3, 100, 2, 16],
[133, NULL, NULL, NULL, 4, 200, 3, 16],
[134, NULL, NULL, NULL, 5, 500, 4, 16],
[135, NULL, NULL, NULL, 6, 750, 5, 16],
[136, NULL, NULL, NULL, 7, 1000, 6, 16],
[137, NULL, NULL, NULL, 8, 1500, 7, 16],
[138, NULL, NULL, NULL, 9, 2000, 8, 16],
[139, NULL, NULL, NULL, 10, 3000, 9, 16],
[140, NULL, NULL, NULL, 11, 5000, 10, 16],
];
foreach ($missionLevels as [$id, $badge, $mBadge, $img, $threshold, $xp, $level, $missionId]) {
$badgeStr = $badge ? "'{$badge}'" : 'NULL';
$mBadgeStr = $mBadge ? "'{$mBadge}'" : 'NULL';
$imgStr = $img ? "'{$img}'" : 'NULL';
$this->addSql("INSERT INTO mybiz_mission_level (id, badge_name, badge_marketing_name, badge_image, threshold, xp, level_number, mission_id)
VALUES ({$id}, {$badgeStr}, {$mBadgeStr}, {$imgStr}, {$threshold}, {$xp}, {$level}, {$missionId})");
}
// Weekly mission levels (IDs 18-45)
$weeklyLevels = [
[5, 10, 1, 18],
[8, 10, 1, 19],
[3, 10, 1, 20],
[5, 50, 1, 21],
[2, 25, 1, 22],
[1, 25, 1, 23],
[5, 10, 1, 24],
[10, 25, 1, 25],
[5, 10, 1, 26],
[2, 25, 1, 27],
[1, 50, 1, 28],
[1, 25, 1, 29],
[1, 50, 1, 30],
[4, 50, 1, 31],
[250, 10, 1, 32],
[500, 10, 1, 33],
[1000, 25, 1, 34],
[1500, 25, 1, 35],
[2000, 50, 1, 36],
[2500, 50, 1, 37],
[1, 25, 1, 38],
[2, 25, 1, 39],
[3, 50, 1, 40],
[5, 50, 1, 41],
[1, 50, 1, 42],
[3, 50, 1, 43],
[5, 50, 1, 44],
[1, 50, 1, 45],
];
foreach ($weeklyLevels as [$threshold, $xp, $level, $missionId]) {
$this->addSql("INSERT INTO mybiz_mission_level (threshold, xp, level_number, mission_id)
VALUES ({$threshold}, {$xp}, {$level}, {$missionId})");
}
// Daily mission levels (IDs 46-101)
$dailyLevels = [
[1, 10, 1, 46],
[1, 10, 1, 47],
[1, 10, 1, 48],
[1, 10, 1, 49],
[2, 10, 1, 50],
[1, 10, 1, 51],
[1, 10, 1, 52],
[1, 10, 1, 53],
[1, 10, 1, 54],
[1, 10, 1, 55],
[1, 10, 1, 56],
[1, 10, 1, 57],
[1, 10, 1, 58],
[1, 10, 1, 59],
[1, 10, 1, 60],
[1, 10, 1, 61],
[1, 10, 1, 62],
[1, 10, 1, 63],
[1, 10, 1, 64],
[2, 10, 1, 65],
[1, 10, 1, 66],
[2, 10, 1, 67],
[2, 10, 1, 68],
[1, 10, 1, 69],
[1, 10, 1, 70],
[1, 25, 1, 71],
[2, 50, 1, 72],
[1, 25, 1, 73],
[1, 25, 1, 74],
[1, 25, 1, 75],
[1, 10, 1, 76],
[2, 25, 1, 77],
[1, 10, 1, 78],
[1, 10, 1, 79],
[2, 25, 1, 80],
[1, 50, 1, 81],
[1, 25, 1, 82],
[1, 50, 1, 83],
[2, 50, 1, 84],
[50, 25, 1, 85],
[80, 25, 1, 86],
[100, 25, 1, 87],
[150, 25, 1, 88],
[200, 50, 1, 89],
[250, 50, 1, 90],
[300, 50, 1, 91],
[100, 50, 1, 92],
[250, 50, 1, 93],
[1, 25, 1, 94],
[2, 25, 1, 95],
[3, 50, 1, 96],
[5, 50, 1, 97],
[1, 50, 1, 98],
[1, 50, 1, 99],
[1, 50, 1, 100],
[1, 50, 1, 101],
];
foreach ($dailyLevels as [$threshold, $xp, $level, $missionId]) {
$this->addSql("INSERT INTO mybiz_mission_level (threshold, xp, level_number, mission_id)
VALUES ({$threshold}, {$xp}, {$level}, {$missionId})");
}
}
public function down(Schema $schema): void
{
// Drop foreign key constraints first
$this->addSql('ALTER TABLE mybiz_mission_history DROP FOREIGN KEY FK_MISSION_HISTORY_MEMBER');
$this->addSql('ALTER TABLE mybiz_mission_history DROP FOREIGN KEY FK_MISSION_HISTORY_MISSION');
$this->addSql('ALTER TABLE mybiz_mission_history DROP FOREIGN KEY FK_MISSION_HISTORY_MISSION_LEVEL');
$this->addSql('ALTER TABLE mybiz_mission_level DROP FOREIGN KEY FK_MISSION_LEVEL_MISSION');
// Drop tables
$this->addSql('DROP TABLE mybiz_mission_history');
$this->addSql('DROP TABLE mybiz_mission_level');
$this->addSql('DROP TABLE mybiz_mission');
}
}