<?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 Version20260107201000 extends AbstractMigration
{
public function getDescription(): string
{
return 'Insert daily missions for Backoffice, Sales & Placements, and XP & Rankings';
}
public function up(Schema $schema): void
{
// BACKOFFICE AND NAVIGATION (IDs 46-70)
$missionsBackofficeAndNavigation = [
[46, MissionIdentifier::TYPE_DAILY_LOGIN_BACKOFFICE, 'daily_login_backoffice', 'daily', 1],
[47, MissionIdentifier::TYPE_DAILY_LOGIN_MOBILE, 'daily_login_mobile', 'daily', 1],
[48, MissionIdentifier::TYPE_DAILY_LOGIN_BEFORE_10AM, 'daily_login_before_10am', 'daily', 1],
[49, MissionIdentifier::TYPE_DAILY_LOGIN_AFTER_6PM, 'daily_login_after_6pm', 'daily', 1],
[50, MissionIdentifier::TYPE_DAILY_LOGIN_TWICE, 'daily_login_twice', 'daily', 1],
[51, MissionIdentifier::TYPE_DAILY_VIEW_DASHBOARD, 'daily_view_dashboard', 'daily', 1],
[52, MissionIdentifier::TYPE_DAILY_VIEW_PROFILE, 'daily_view_profile', 'daily', 1],
[53, MissionIdentifier::TYPE_DAILY_VIEW_MISSIONS, 'daily_view_missions', 'daily', 1],
[54, MissionIdentifier::TYPE_DAILY_VIEW_PROGRESSION, 'daily_view_progression', 'daily', 1],
[55, MissionIdentifier::TYPE_DAILY_VIEW_GAMIFICATION, 'daily_view_gamification', 'daily', 1],
[56, MissionIdentifier::TYPE_DAILY_VIEW_RANKINGS, 'daily_view_rankings', 'daily', 1],
[57, MissionIdentifier::TYPE_DAILY_VIEW_CLIENTS, 'daily_view_clients', 'daily', 1],
[58, MissionIdentifier::TYPE_DAILY_VIEW_SALES, 'daily_view_sales', 'daily', 1],
[59, MissionIdentifier::TYPE_DAILY_VIEW_PLACEMENTS, 'daily_view_placements', 'daily', 1],
[60, MissionIdentifier::TYPE_DAILY_VIEW_STATISTICS, 'daily_view_statistics', 'daily', 1],
[61, MissionIdentifier::TYPE_DAILY_VIEW_GOALS, 'daily_view_goals', 'daily', 1],
[62, MissionIdentifier::TYPE_DAILY_ADD_CALENDAR_EVENT, 'daily_add_calendar_event', 'daily', 1],
[63, MissionIdentifier::TYPE_DAILY_CHECK_NOTIFICATIONS, 'daily_check_notifications', 'daily', 1],
[64, MissionIdentifier::TYPE_DAILY_VIEW_ACTIVE_CLIENT, 'daily_view_active_client', 'daily', 1],
[65, MissionIdentifier::TYPE_DAILY_VIEW_TWO_ACTIVE_CLIENTS, 'daily_view_two_active_clients', 'daily', 1],
[66, MissionIdentifier::TYPE_DAILY_VIEW_INACTIVE_CLIENT, 'daily_view_inactive_client', 'daily', 1],
[67, MissionIdentifier::TYPE_DAILY_VIEW_TWO_INACTIVE_CLIENTS, 'daily_view_two_inactive_clients', 'daily', 1],
[68, MissionIdentifier::TYPE_DAILY_ADD_TWO_CARD_KANBAN, 'daily_add_two_card_kanban', 'daily', 1],
[69, MissionIdentifier::TYPE_DAILY_MYBIZ_RESOURCE_DOWNLOADED, 'daily_mybiz_resource_downloaded', 'daily', 1],
[70, MissionIdentifier::TYPE_DAILY_MYBIZ_NEWS_VIEWED, 'daily_mybiz_news_viewed', 'daily', 1],
];
$categoryBackofficeAndNavigation = Mission::CATEGORY_BACKOFFICE_AND_NAVIGATION;
foreach ($missionsBackofficeAndNavigation 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}', '{$categoryBackofficeAndNavigation}', {$isEnabled})");
}
// SALES AND PLACEMENTS (IDs 71-84)
$missionsSalesAndPlacements = [
[71, MissionIdentifier::TYPE_DAILY_MAKE_SALE, 'daily_make_sale', 'daily', 1],
[72, MissionIdentifier::TYPE_DAILY_MAKE_TWO_SALES, 'daily_make_two_sales', 'daily', 1],
[73, MissionIdentifier::TYPE_DAILY_MAKE_SALE_BEFORE_3PM, 'daily_make_sale_before_3pm', 'daily', 1],
[74, MissionIdentifier::TYPE_DAILY_MAKE_SALE_AFTER_3PM, 'daily_make_sale_after_3pm', 'daily', 1],
[75, MissionIdentifier::TYPE_DAILY_MAKE_SALE_ABOVE_AVERAGE, 'daily_make_sale_above_average', 'daily', 1],
[76, MissionIdentifier::TYPE_DAILY_MAKE_PLACEMENT, 'daily_make_placement', 'daily', 1],
[77, MissionIdentifier::TYPE_DAILY_MAKE_TWO_PLACEMENTS, 'daily_make_two_placements', 'daily', 1],
[78, MissionIdentifier::TYPE_DAILY_MAKE_PLACEMENT_BEFORE_3PM, 'daily_make_placement_before_3pm', 'daily', 1],
[79, MissionIdentifier::TYPE_DAILY_MAKE_PLACEMENT_AFTER_3PM, 'daily_make_placement_after_3pm', 'daily', 1],
[80, MissionIdentifier::TYPE_DAILY_MAKE_SALE_AND_PLACEMENT, 'daily_make_sale_and_placement', 'daily', 1],
[81, MissionIdentifier::TYPE_DAILY_REACH_PERSONAL_SALES_RECORD, 'daily_reach_personal_sales_record', 'daily', 1],
[82, MissionIdentifier::TYPE_DAILY_REACH_PERSONAL_PLACEMENT_RECORD, 'daily_reach_personal_placement_record', 'daily', 1],
[83, MissionIdentifier::TYPE_DAILY_REACH_NEW_RANK, 'daily_reach_new_rank', 'daily', 1],
[84, MissionIdentifier::TYPE_DAILY_MAKE_LUUME_AND_FUTURESLEARN_SALE, 'daily_make_luume_and_futureslearn_sale', 'daily', 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})");
}
// POINTS XP AND RANKINGS (IDs 85-101)
$missionsPointsXpAndRankings = [
[85, MissionIdentifier::TYPE_DAILY_GENERATE_50_POINTS, 'daily_generate_50_points', 'daily', 1],
[86, MissionIdentifier::TYPE_DAILY_GENERATE_80_POINTS, 'daily_generate_80_points', 'daily', 1],
[87, MissionIdentifier::TYPE_DAILY_GENERATE_100_POINTS, 'daily_generate_100_points', 'daily', 1],
[88, MissionIdentifier::TYPE_DAILY_GENERATE_150_POINTS, 'daily_generate_150_points', 'daily', 1],
[89, MissionIdentifier::TYPE_DAILY_GENERATE_200_POINTS, 'daily_generate_200_points', 'daily', 1],
[90, MissionIdentifier::TYPE_DAILY_GENERATE_250_POINTS, 'daily_generate_250_points', 'daily', 1],
[91, MissionIdentifier::TYPE_DAILY_GENERATE_300_POINTS, 'daily_generate_300_points', 'daily', 1],
[92, MissionIdentifier::TYPE_DAILY_GENERATE_100_POINTS_BEFORE_3PM, 'daily_generate_100_points_before_3pm', 'daily', 1],
[93, MissionIdentifier::TYPE_DAILY_GENERATE_250_POINTS_BEFORE_6PM, 'daily_generate_250_points_before_6pm', 'daily', 1],
[94, MissionIdentifier::TYPE_DAILY_GENERATE_MORE_POINTS_THAN_YESTERDAY, 'daily_generate_more_points_than_yesterday', 'daily', 1],
[95, MissionIdentifier::TYPE_DAILY_GENERATE_POINTS_2_DAYS_IN_ROW, 'daily_generate_points_2_days_in_row', 'daily', 1],
[96, MissionIdentifier::TYPE_DAILY_GENERATE_POINTS_3_DAYS_IN_ROW, 'daily_generate_points_3_days_in_row', 'daily', 1],
[97, MissionIdentifier::TYPE_DAILY_GENERATE_POINTS_5_DAYS_IN_ROW, 'daily_generate_points_5_days_in_row', 'daily', 1],
[98, MissionIdentifier::TYPE_DAILY_APPEAR_IN_TOP_PERFORMER, 'daily_appear_in_top_performer', 'daily', 1],
[99, MissionIdentifier::TYPE_DAILY_APPEAR_IN_TOP_3_PERFORMER, 'daily_appear_in_top_3_performer', 'daily', 1],
[100, MissionIdentifier::TYPE_DAILY_APPEAR_IN_TOP_5_PERFORMER, 'daily_appear_in_top_5_performer', 'daily', 1],
[101, MissionIdentifier::TYPE_DAILY_REACH_DAILY_POINTS_RECORD, 'daily_reach_daily_points_record', 'daily', 1],
];
$categoryPointsXpAndRankings = Mission::CATEGORY_POINTS_XP_AND_RANKINGS;
foreach ($missionsPointsXpAndRankings 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
$missionLevels = [
[1, 10, 1, 46], // daily_login_backoffice
[1, 10, 1, 47], // daily_login_mobile
[1, 10, 1, 48], // daily_login_before_10am
[1, 10, 1, 49], // daily_login_after_6pm
[2, 10, 1, 50], // daily_login_twice
[1, 10, 1, 51], // daily_view_dashboard
[1, 10, 1, 52], // daily_view_profile
[1, 10, 1, 53], // daily_view_missions
[1, 10, 1, 54], // daily_view_progression
[1, 10, 1, 55], // daily_view_gamification
[1, 10, 1, 56], // daily_view_rankings
[1, 10, 1, 57], // daily_view_clients
[1, 10, 1, 58], // daily_view_sales
[1, 10, 1, 59], // daily_view_placements
[1, 10, 1, 60], // daily_view_statistics
[1, 10, 1, 61], // daily_view_goals
[1, 10, 1, 62], // daily_add_calendar_event
[1, 10, 1, 63], // daily_check_notifications
[1, 10, 1, 64], // daily_view_active_client
[2, 10, 1, 65], // daily_view_two_active_clients
[1, 10, 1, 66], // daily_view_inactive_client
[2, 10, 1, 67], // daily_view_two_inactive_clients
[2, 10, 1, 68], // daily_add_two_prospects_kanban
[1, 10, 1, 69], // daily_mybiz_resource_downloaded
[1, 10, 1, 70], // daily_mybiz_news_viewed
[1, 25, 1, 71], // daily_make_sale
[2, 50, 1, 72], // daily_make_two_sales
[1, 25, 1, 73], // daily_make_sale_before_3pm
[1, 25, 1, 74], // daily_make_sale_after_3pm
[1, 25, 1, 75], // daily_make_sale_above_average
[1, 10, 1, 76], // daily_make_placement
[2, 25, 1, 77], // daily_make_two_placements
[1, 10, 1, 78], // daily_make_placement_before_3pm
[1, 10, 1, 79], // daily_make_placement_after_3pm
[2, 25, 1, 80], // daily_make_sale_and_placement
[1, 50, 1, 81], // daily_reach_personal_sales_record
[1, 25, 1, 82], // daily_reach_personal_placement_record
[1, 50, 1, 83], // daily_reach_new_rank
[2, 50, 1, 84], // daily_make_luume_and_futureslearn_sale
[50, 25, 1, 85], // daily_generate_50_points
[80, 25, 1, 86], // daily_generate_80_points
[100, 25, 1, 87], // daily_generate_100_points
[150, 25, 1, 88], // daily_generate_150_points
[200, 50, 1, 89], // daily_generate_200_points
[250, 50, 1, 90], // daily_generate_250_points
[300, 50, 1, 91], // daily_generate_300_points
[100, 50, 1, 92], // daily_generate_100_points_before_3pm
[250, 50, 1, 93], // daily_generate_250_points_before_6pm
[1, 25, 1, 94], // daily_generate_more_points_than_yesterday
[2, 25, 1, 95], // daily_generate_points_2_days_in_row
[3, 50, 1, 96], // daily_generate_points_3_days_in_row
[5, 50, 1, 97], // daily_generate_points_5_days_in_row
[1, 50, 1, 98], // daily_appear_in_top_performer
[1, 50, 1, 99], // daily_appear_in_top_3_performer
[1, 50, 1, 100], // daily_appear_in_top_5_performer
[1, 50, 1, 101], // daily_reach_daily_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 46 AND 101');
// Delete missions
$this->addSql('DELETE FROM mybiz_mission WHERE id BETWEEN 46 AND 101');
}
}