simedkom/app/Console/Commands/MigrateCooperationCommand.php

240 lines
9.7 KiB
PHP

<?php
namespace App\Console\Commands;
use App\Enums\ApprovalStatus;
use App\Enums\CooperationStatus;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
class MigrateCooperationCommand extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'migrate:cooperation';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Migrate cooperation data, proposals, and orders from legacy database';
/**
* Execute the console command.
*/
public function handle()
{
$this->info('Starting comprehensive cooperation and report migration...');
$legacyConn = DB::connection('mysql_second');
$offset = 10000;
// 1. Migrate media_orders -> cooperations & task_assignments
$this->info('Migrating media_orders...');
$legacyOrders = $legacyConn->table('media_orders')->get();
$this->withProgressBar($legacyOrders, function ($legacy) {
$status = $legacy->deleted_at ? CooperationStatus::COMPLETED->value : CooperationStatus::ASSIGNMENT->value;
DB::table('cooperations')->updateOrInsert(
['id' => $legacy->id],
[
'title' => Str::limit($legacy->name, 200),
'initial_submission_date' => $legacy->begin,
'final_submission_date' => $legacy->end,
'description' => $legacy->description ?? '-',
'status' => $status,
'created_at' => $legacy->created_at ?? now(),
'updated_at' => $legacy->updated_at ?? now(),
'deleted_at' => $legacy->deleted_at,
]
);
// Task Assignment
DB::table('task_assignments')->updateOrInsert(
['id' => $legacy->id],
[
'cooperation_id' => $legacy->id,
'start_date' => $legacy->begin,
'end_date' => $legacy->end,
'task_description' => $legacy->description ?? '-',
'report_amount' => $legacy->amount_report ?? 1,
'created_at' => $legacy->created_at ?? now(),
'updated_at' => $legacy->updated_at ?? now(),
]
);
// Pivot Media
if ($legacy->media) {
$mediaIds = explode(',', $legacy->media);
$statuses = explode(',', $legacy->status);
foreach ($mediaIds as $index => $mediaId) {
$mediaId = trim($mediaId);
if (empty($mediaId)) {
continue;
}
$mediaStatus = isset($statuses[$index]) ? trim($statuses[$index]) : '1';
$approval = $this->mapApprovalStatus($mediaStatus);
DB::table('cooperation_media')->updateOrInsert(
['cooperation_id' => $legacy->id, 'partner_media_id' => $mediaId],
['status' => $approval, 'created_at' => $legacy->created_at ?? now(), 'updated_at' => $legacy->updated_at ?? now()]
);
DB::table('media_task_assignment')->updateOrInsert(
['task_assignment_id' => $legacy->id, 'partner_media_id' => $mediaId],
['status' => $approval, 'created_at' => $legacy->created_at ?? now(), 'updated_at' => $legacy->updated_at ?? now()]
);
}
}
});
$this->newLine();
// 2. Migrate media_cooperation -> cooperations & task_assignments
$this->info('Migrating media_cooperation...');
$legacyCoops = $legacyConn->table('media_cooperation')->get();
$this->withProgressBar($legacyCoops, function ($legacy) use ($offset) {
$newId = $legacy->id + $offset;
$status = $legacy->deleted_at ? CooperationStatus::COMPLETED->value : CooperationStatus::PENDING->value;
DB::table('cooperations')->updateOrInsert(
['id' => $newId],
[
'title' => Str::limit($legacy->name, 200),
'initial_submission_date' => $legacy->begin,
'final_submission_date' => $legacy->end,
'description' => $legacy->description ?? '-',
'status' => $status,
'created_at' => $legacy->created_at ?? now(),
'updated_at' => $legacy->updated_at ?? now(),
'deleted_at' => $legacy->deleted_at,
]
);
// Task Assignment
DB::table('task_assignments')->updateOrInsert(
['id' => $newId],
[
'cooperation_id' => $newId,
'start_date' => $legacy->begin,
'end_date' => $legacy->end,
'task_description' => $legacy->description ?? '-',
'report_amount' => 1,
'created_at' => $legacy->created_at ?? now(),
'updated_at' => $legacy->updated_at ?? now(),
]
);
// Pivot Media
if ($legacy->media) {
$mediaIds = explode(',', $legacy->media);
foreach ($mediaIds as $mediaId) {
$mediaId = trim($mediaId);
if (empty($mediaId)) {
continue;
}
DB::table('cooperation_media')->updateOrInsert(
['cooperation_id' => $newId, 'partner_media_id' => $mediaId],
['status' => ApprovalStatus::PENDING->value, 'created_at' => $legacy->created_at ?? now(), 'updated_at' => $legacy->updated_at ?? now()]
);
DB::table('media_task_assignment')->updateOrInsert(
['task_assignment_id' => $newId, 'partner_media_id' => $mediaId],
['status' => ApprovalStatus::PENDING->value, 'created_at' => $legacy->created_at ?? now(), 'updated_at' => $legacy->updated_at ?? now()]
);
}
}
});
$this->newLine();
// 3. Migrate proposals
$this->info('Migrating proposals...');
$legacyProposals = $legacyConn->table('propose_media_cooperation')->get();
$this->withProgressBar($legacyProposals, function ($legacy) use ($offset) {
$media = DB::table('partner_media')
->join('companies', 'partner_media.company_id', '=', 'companies.id')
->where('companies.user_id', $legacy->enhancer)
->select('partner_media.id')
->first();
if (! $media) {
return;
}
DB::table('cooperation_proposals')->updateOrInsert(
['id' => $legacy->id],
[
'cooperation_id' => $legacy->media_cooperation_id + $offset,
'partner_media_id' => $media->id,
'description' => $legacy->rejection_reason ?? '-',
'e_catalog' => Str::limit($legacy->e_catalog, 200),
'status' => $this->mapApprovalStatus($legacy->status),
'submitted_at' => $legacy->created_at ?? now(),
'responded_at' => $legacy->updated_at,
'created_at' => $legacy->created_at ?? now(),
'updated_at' => $legacy->updated_at ?? now(),
]
);
});
$this->newLine();
// 4. Migrate reports
$this->info('Migrating reports...');
$legacyReports = $legacyConn->table('reports')->get();
$this->withProgressBar($legacyReports, function ($legacy) {
// Find media_task_assignment_id
// We assume media_order in reports refers to media_orders table primarily
$assignment = DB::table('media_task_assignment')
->where('task_assignment_id', $legacy->media_order)
->where('partner_media_id', $legacy->media)
->first();
if (! $assignment) {
return;
}
DB::table('reports')->updateOrInsert(
['id' => $legacy->id],
[
'media_task_assignment_id' => $assignment->id,
'title' => $legacy->title,
'publication_date' => $legacy->broadcast ?? $legacy->created_at ?? now(),
'link' => Str::limit($legacy->link, 50),
'description' => 'Legacy Proof: '.($legacy->proof ?? '-'),
'status' => $this->mapReportStatus($legacy->status),
'created_at' => $legacy->created_at ?? now(),
'updated_at' => $legacy->updated_at ?? now(),
'deleted_at' => $legacy->deleted_at,
]
);
});
$this->newLine();
$this->info('Cooperation and report migration completed!');
}
private function mapApprovalStatus($legacy): int
{
return match ((string) $legacy) {
'1', '4' => ApprovalStatus::ACCEPTED->value,
'2', '0' => ApprovalStatus::REJECTED->value, // Assume 0 is rejected/inactive in some contexts, but let's see
default => ApprovalStatus::PENDING->value,
};
}
private function mapReportStatus($legacy): int
{
return match ((string) $legacy) {
'1' => ApprovalStatus::ACCEPTED->value,
'2' => ApprovalStatus::REJECTED->value,
default => ApprovalStatus::PENDING->value,
};
}
}