File manager - Edit - /var/www/html/portalHomolog/database/seeders/ProjetosProgramasDirectMigrationSeeder.php
Back
<?php namespace Database\Seeders; use Illuminate\Database\Seeder; use App\Models\ProjetosProgramas\{Tipo, Classificacao, Etapa, Prazo, Fonte, Eixo, Area, Ods, ProjetoPrograma}; use App\Models\Structure; use Illuminate\Support\Facades\DB; use Illuminate\Support\Str; use Carbon\Carbon; /** * Esta seeder realiza a migração SEM DE-PARA interativo. * Ela assume que as siglas no CSV de órgãos correspondem exatamente às siglas no banco. * Se uma sigla não existir, ela CRIA o órgão automaticamente. * * Execute: php artisan db:seed --class=ProjetosProgramasDirectMigrationSeeder */ class ProjetosProgramasDirectMigrationSeeder extends Seeder { private array $orgaoMap = []; private array $stats = [ 'total' => 0, 'migrated' => 0, 'skipped' => 0, 'errors' => 0, ]; public function run(): void { $this->command->info('==========================================='); $this->command->info('Iniciando Migração DIRETA (Sem De-Para)'); $this->command->info('==========================================='); // Etapa 1: Dados básicos $this->seedDadosBasicos(); // Etapa 2: Mapear Órgãos (Direto por Sigla) $this->migrateOrgaosDireto(); // Etapa 3: Migrar Projetos $this->migrateProjects(); $this->showStatistics(); } private function seedDadosBasicos(): void { $this->command->info('Criando dados básicos...'); foreach (['Projeto', 'Programa', 'Projeto Estruturante', 'Ação/Iniciativa/Atividade'] as $v) Tipo::firstOrCreate(['nome' => $v]); foreach (['Estratégico/Prioritário', 'Estruturante', 'Modernização/Inovação', 'Setoriais'] as $v) Classificacao::firstOrCreate(['nome' => $v]); foreach (['Iniciação', 'Planejamento', 'Processo Licitatório', 'Execução', 'Monitoramento e Controle', 'Encerramento'] as $v) Etapa::firstOrCreate(['nome' => $v]); foreach (['100 dias', '1 ano', '4 anos'] as $v) Prazo::firstOrCreate(['nome' => $v]); foreach (['Recurso Próprio', 'Convênio', 'Parceria Público Privada', 'Emenda Parlamentar', 'Fundo', 'Transferência Voluntária', 'Banco de Projetos', 'Outro'] as $v) Fonte::firstOrCreate(['nome' => $v]); $eixos = [1 => 'Gestão pública eficiente', 2 => 'Angra, cidade com desenvolvimento e oportunidade', 3 => 'Angra, cidade acolhedora e saudável', 4 => 'Angra, cidade moderna e do conhecimento', 5 => 'Angra, cidade sustentável', 6 => 'Angra, cidade pacífica e segura']; $areas = [1 => ['Gestão pública', 'Infraestrutura e parcerias de investimento'], 2 => ['Desenvolvimento econômico e geração de emprego', 'Cultura', 'Turismo e eventos'], 3 => ['Saúde', 'Esporte e lazer', 'Desenvolvimento social e promoção da cidadania', 'Juventude e terceira idade'], 4 => ['Educação', 'Modernização e inovação'], 5 => ['Planejamento urbano, habitação e defesa civil', 'Mobilidade urbana e acessibilidade', 'Meio ambiente', 'Saneamento básico e ambiental'], 6 => ['Segurança pública']]; $mapEixos = []; foreach ($eixos as $code => $nome) { $eixo = Eixo::firstOrCreate(['nome' => $nome]); $mapEixos[$code] = $eixo->id; } foreach ($areas as $eixoCode => $lista) { foreach ($lista as $nomeArea) { Area::firstOrCreate(['eixo_id' => $mapEixos[$eixoCode], 'nome' => $nomeArea]); } } foreach (range(1, 17) as $i) Ods::firstOrCreate(['codigo' => str_pad($i, 2, '0', STR_PAD_LEFT)]); } private function migrateOrgaosDireto(): void { $this->command->info('Mapeando órgãos existentes pela sigla do CSV...'); $csvPath = base_path('Orgaos.csv'); if (!file_exists($csvPath)) { $this->command->error("Arquivo Orgaos.csv não encontrado!"); return; } $handle = fopen($csvPath, 'r'); $header = fgetcsv($handle); $header[0] = preg_replace('/^\x{FEFF}/u', '', $header[0]); $found = 0; $missing = 0; while (($row = fgetcsv($handle)) !== false) { if (count($row) < count($header)) continue; $data = array_combine($header, $row); $idOrg = trim($data['id_org'] ?? ''); $sigla = trim($data['org_sigla'] ?? ''); if (empty($idOrg) || empty($sigla)) continue; $structure = Structure::where('abbreviation', $sigla)->first(); if ($structure) { // Forçamos o ID como string para evitar erros no sync posterior $this->orgaoMap[$idOrg] = (string) $structure->id; $found++; } else { $missing++; } } fclose($handle); $this->command->info("✓ Mapeamento concluído: {$found} encontrados, {$missing} não encontrados no banco."); } private function migrateProjects(): void { $this->command->info('Migrando projetos...'); $csvPath = base_path('Projetos.csv'); if (!file_exists($csvPath)) return; $handle = fopen($csvPath, 'r'); $header = fgetcsv($handle); $header[0] = preg_replace('/^\x{FEFF}/u', '', $header[0]); $progressBar = $this->command->getOutput()->createProgressBar(); $progressBar->start(); while (($row = fgetcsv($handle)) !== false) { $this->stats['total']++; if (count($row) < count($header)) { $this->stats['skipped']++; $progressBar->advance(); continue; } $data = array_combine($header, $row); DB::beginTransaction(); try { $idOrgLegado = $data['pro_dimen_orgao'] ?? null; $gestorId = $this->orgaoMap[$idOrgLegado] ?? null; if (!$gestorId) { $pmar = Structure::where('abbreviation', 'PMAR')->first(); $gestorId = $pmar?->id; } $project = ProjetoPrograma::updateOrCreate([ 'denominacao' => trim($data['pro_dimen_denominacao'] ?? 'Sem denominação'), 'codigo' => trim($data['pro_dimen_codigo'] ?? ''), ], [ 'num_processo_adm' => trim($data['pro_dimen_numprocessoadm'] ?? null), 'gestor_structure_id' => $gestorId, 'tipo_id' => $this->mapTipo($data['pro_dimen_tipo'] ?? null), 'programa_ppa' => trim($data['pro_dimen_programa'] ?? null), 'endereco' => trim($data['pro_dimen_endereco'] ?? null), 'bairro' => trim($data['pro_dimen_bairro'] ?? null), 'data_inicio' => $this->parseDate($data['pro_crono_inicio'] ?? null) ?? '2022-01-01', 'data_termino' => $this->parseDate($data['pro_crono_fim'] ?? null), 'prazo_id' => $this->mapPrazo($data['pro_crono_prazo_entrega'] ?? null), 'acompanhamento_governo' => (bool) ($data['pro_dimen_acompanhamento'] ?? 0), 'classificacao_id' => $this->mapClassificacao($data['pro_dimen_classificacao'] ?? null), 'etapa_id' => $this->mapEtapa($data['pro_dimen_etapa'] ?? null), 'eixo_id' => $this->mapEixo($data['pro_eixo'] ?? ''), 'area_id' => $this->mapArea($data['pro_area'] ?? ''), 'custo_total' => $this->parseDecimal($data['pro_inves_custototal'] ?? 0), 'status_registro' => 'COMPLETO', ]); // ODS e Orgaos Envolvidos (Sync para evitar duplicados) $this->syncRelations($project, $data); DB::commit(); $this->stats['migrated']++; } catch (\Exception $e) { DB::rollBack(); $this->stats['errors']++; } $progressBar->advance(); } $progressBar->finish(); $this->command->info(''); fclose($handle); } private function syncRelations($project, $data): void { // ODS $odsCodes = []; for ($i = 1; $i <= 17; $i++) { $col = "pro_ods" . str_pad($i, 2, '0', STR_PAD_LEFT); if (isset($data[$col]) && strtoupper(trim($data[$col])) === 'S') { $odsCodes[] = str_pad($i, 2, '0', STR_PAD_LEFT); } } if (!empty($odsCodes)) { $odsIds = Ods::whereIn('codigo', $odsCodes)->pluck('id')->toArray(); $project->ods()->sync($odsIds); } // Orgaos Envolvidos $envolvidosStr = $data['pro_dados_orgaos_envolvidos'] ?? ''; $envolvidosIds = array_filter(preg_split('/[,;]/', $envolvidosStr)); $structIds = []; foreach ($envolvidosIds as $idLegacy) { if (isset($this->orgaoMap[trim($idLegacy)])) { $structIds[] = $this->orgaoMap[trim($idLegacy)]; } } if (!empty($structIds)) { $project->orgaosEnvolvidos()->sync($structIds); } } private function parseDate($date) { if (empty($date)) return null; try { return Carbon::parse($date)->format('Y-m-d'); } catch (\Exception $e) { return null; } } private function parseDecimal($value) { $cleaned = str_replace(['R$', ' ', '.'], '', $value); $cleaned = str_replace(',', '.', $cleaned); return (float) $cleaned; } private function mapTipo($v) { return Tipo::where('nome', 'like', "%{$v}%")->first()?->id; } private function mapPrazo($v) { return Prazo::where('nome', 'like', "%{$v}%")->first()?->id; } private function mapClassificacao($v) { return Classificacao::where('nome', 'like', "%{$v}%")->first()?->id; } private function mapEtapa($v) { return Etapa::where('nome', 'like', "%{$v}%")->first()?->id; } private function mapEixo($v) { return Eixo::where('id', (int) $v)->first()?->id; } private function mapArea($v) { return Area::where('nome', 'like', "%{$v}%")->first()?->id; } private function showStatistics(): void { $this->command->info("\nMigração concluída!"); $this->command->info("Total: {$this->stats['total']} | Sucesso: {$this->stats['migrated']} | Erros: {$this->stats['errors']}"); } }
| ver. 1.4 |
Github
|
.
| PHP 8.3.28 | Generation time: 0.01 |
proxy
|
phpinfo
|
Settings