<?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 Version20260107160000 extends AbstractMigration
{
public function getDescription(): string
{
return 'Insert weekly missions for Backoffice, Sales & Placements, and XP & Rankings';
}
public function up(Schema $schema): void
{
// Weekly Backoffice & Navigation
$missionsBackoffice = [
[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],
];
foreach ($missionsBackoffice 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})");
}
// Weekly Sales & Placements
$missionsSalesAndPlacements = [
[20, MissionIdentifier::TYPE_WEEKLY_MAKE_3_SALES, 'weekly_make_3_sales', 'weekly', 1],
[21, MissionIdentifier::TYPE_WEEKLY_MAKE_5_SALES, 'weekly_make_5_sales', 'weekly', 1],
[22, MissionIdentifier::TYPE_WEEKLY_MAKE_2_SALES_ABOVE_100, 'weekly_make_2_sales_above_100', 'weekly', 1],
[23, MissionIdentifier::TYPE_WEEKLY_MAKE_SALE_ABOVE_AVERAGE, 'weekly_make_sale_above_average', 'weekly', 1],
[24, MissionIdentifier::TYPE_WEEKLY_MAKE_5_PLACEMENTS, 'weekly_make_5_placements', 'weekly', 1],
[25, MissionIdentifier::TYPE_WEEKLY_MAKE_10_PLACEMENTS, 'weekly_make_10_placements', 'weekly', 1],
[26, MissionIdentifier::TYPE_WEEKLY_LOGIN_5_DAYS, 'weekly_login_5_days', 'weekly', 1],
[27, MissionIdentifier::TYPE_WEEKLY_MAKE_SALE_AND_PLACEMENT_SAME_DAY, 'weekly_make_sale_and_placement_same_day', 'weekly', 1],
[28, MissionIdentifier::TYPE_WEEKLY_REACH_DAILY_SALES_RECORD, 'weekly_reach_daily_sales_record', 'weekly', 1],
[29, MissionIdentifier::TYPE_WEEKLY_REACH_DAILY_PLACEMENT_RECORD, 'weekly_reach_daily_placement_record', 'weekly', 1],
[30, MissionIdentifier::TYPE_WEEKLY_REACH_NEW_RANK, 'weekly_reach_new_rank', 'weekly', 1],
[31, MissionIdentifier::TYPE_WEEKLY_GENERATE_2_LUUME_AND_2_FUTURESLEARN_SALES, 'weekly_generate_2_luume_and_2_futureslearn_sales', 'weekly', 1],
];
$categorySalesAndPlacements = Mission::CATEGORY_SALES_AND_PLACEMENTS;
foreach ($missionsSalesAndPlacements as [$id, $name, $marketingName, $recurrence, $isEnabled]) {
$this->addSql("INSERT INTO mybiz_mission (id, name, marketing_name, recurrence, category, is_enabled)
VALUES ({$id}, '{$name}', '{$marketingName}', '{$recurrence}', '{$categorySalesAndPlacements}', {$isEnabled})");
}
// Weekly XP & Rankings
$missionsXpAndRankings = [
[32, MissionIdentifier::TYPE_WEEKLY_GENERATE_250_POINTS, 'weekly_generate_250_points', 'weekly', 1],
[33, MissionIdentifier::TYPE_WEEKLY_GENERATE_500_POINTS, 'weekly_generate_500_points', 'weekly', 1],
[34, MissionIdentifier::TYPE_WEEKLY_GENERATE_1000_POINTS, 'weekly_generate_1000_points', 'weekly', 1],
[35, MissionIdentifier::TYPE_WEEKLY_GENERATE_1500_POINTS, 'weekly_generate_1500_points', 'weekly', 1],
[36, MissionIdentifier::TYPE_WEEKLY_GENERATE_2000_POINTS, 'weekly_generate_2000_points', 'weekly', 1],
[37, MissionIdentifier::TYPE_WEEKLY_GENERATE_2500_POINTS, 'weekly_generate_2500_points', 'weekly', 1],
[38, MissionIdentifier::TYPE_WEEKLY_GENERATE_MORE_POINTS_THAN_LAST_WEEK, 'weekly_generate_more_points_than_last_week', 'weekly', 1],
[39, MissionIdentifier::TYPE_WEEKLY_GENERATE_POINTS_2_DAYS_IN_ROW, 'weekly_generate_points_2_days_in_row', 'weekly', 1],
[40, MissionIdentifier::TYPE_WEEKLY_GENERATE_POINTS_3_DAYS_IN_ROW, 'weekly_generate_points_3_days_in_row', 'weekly', 1],
[41, MissionIdentifier::TYPE_WEEKLY_GENERATE_POINTS_5_DAYS_IN_ROW, 'weekly_generate_points_5_days_in_row', 'weekly', 1],
[42, MissionIdentifier::TYPE_WEEKLY_APPEAR_IN_TOP_PERFORMER, 'weekly_appear_in_top_performer', 'weekly', 1],
[43, MissionIdentifier::TYPE_WEEKLY_APPEAR_IN_TOP_3_PERFORMER, 'weekly_appear_in_top_3_performer', 'weekly', 1],
[44, MissionIdentifier::TYPE_WEEKLY_APPEAR_IN_TOP_5_PERFORMER, 'weekly_appear_in_top_5_performer', 'weekly', 1],
[45, MissionIdentifier::TYPE_WEEKLY_REACH_WEEKLY_POINTS_RECORD, 'weekly_reach_weekly_points_record', 'weekly', 1],
];
$categoryPointsXpAndRankings = Mission::CATEGORY_POINTS_XP_AND_RANKINGS;
foreach ($missionsXpAndRankings as [$id, $name, $marketingName, $recurrence, $isEnabled]) {
$this->addSql("INSERT INTO mybiz_mission (id, name, marketing_name, recurrence, category, is_enabled)
VALUES ({$id}, '{$name}', '{$marketingName}', '{$recurrence}', '{$categoryPointsXpAndRankings}', {$isEnabled})");
}
// Mission Levels Data
// IDs are auto-incremented, starting from 141 naturally
$missionLevels = [
[5, 10, 1, 18], // weekly_add_5_events
[8, 10, 1, 19], // weekly_add_8_prospects
[3, 10, 1, 20], // weekly_make_3_sales
[5, 50, 1, 21], // weekly_make_5_sales
[2, 25, 1, 22], // weekly_make_2_sales_above_100
[1, 25, 1, 23], // weekly_make_sale_above_average
[5, 10, 1, 24], // weekly_make_5_placements
[10, 25, 1, 25], // weekly_make_10_placements
[5, 10, 1, 26], // weekly_login_5_days
[2, 25, 1, 27], // weekly_make_sale_and_placement_same_day
[1, 50, 1, 28], // weekly_reach_daily_sales_record
[1, 25, 1, 29], // weekly_reach_daily_placement_record
[1, 50, 1, 30], // weekly_reach_new_rank
[4, 50, 1, 31], // weekly_generate_2_luume_and_2_futureslearn_sales
[250, 10, 1, 32], // weekly_generate_250_points
[500, 10, 1, 33], // weekly_generate_500_points
[1000, 25, 1, 34], // weekly_generate_1000_points
[1500, 25, 1, 35], // weekly_generate_1500_points
[2000, 50, 1, 36], // weekly_generate_2000_points
[2500, 50, 1, 37], // weekly_generate_2500_points
[1, 25, 1, 38], // weekly_generate_more_points_than_last_week
[2, 25, 1, 39], // weekly_generate_points_2_days_in_row
[3, 50, 1, 40], // weekly_generate_points_3_days_in_row
[5, 50, 1, 41], // weekly_generate_points_5_days_in_row
[1, 50, 1, 42], // weekly_appear_in_top_performer
[3, 50, 1, 43], // weekly_appear_in_top_3_performer
[5, 50, 1, 44], // weekly_appear_in_top_5_performer
[1, 50, 1, 45], // weekly_reach_weekly_points_record
];
foreach ($missionLevels as [$threshold, $xp, $levelNumber, $missionId]) {
$this->addSql("INSERT INTO mybiz_mission_level (threshold, xp, level_number, mission_id)
VALUES ({$threshold}, {$xp}, {$levelNumber}, {$missionId})");
}
}
public function down(Schema $schema): void
{
// Delete mission levels
$this->addSql('DELETE FROM mybiz_mission_level WHERE mission_id BETWEEN 18 AND 45');
// Delete missions
$this->addSql('DELETE FROM mybiz_mission WHERE id BETWEEN 18 AND 45');
}
}