File manager - Edit - /var/www/html/gop/api/app/Imports/SubitensImport.php
Back
<?php namespace App\Imports; use App\Models\Fase; use App\Models\FaseServico; use App\Models\FaseServicoSubitem; use App\Models\LogImportacao; use Illuminate\Support\Facades\Validator; use Maatwebsite\Excel\Concerns\ToModel; use Maatwebsite\Excel\Concerns\WithStartRow; class SubitensImport implements ToModel, WithStartRow { private $faseId; private $obraId; private array $servicos = []; private $line = 6; public function __construct($obraId) { $this->obraId = $obraId; } public function startRow(): int { return 6; } public function map($row): array { return $row; } public function model(array $row) { $item = $row[0]; if (str_starts_with($item, 'Fase')) { return $this->createFase($row); } elseif (str_contains($item, '.')) { return $this->createSubitem($row); } elseif (is_numeric($item)) { return $this->createServico($row); } $this->line++; } private function getCurrentServicoId($item) { $servicoNumber = explode('.', $item)[0]; return $this->servicos[$servicoNumber] ?? null; } private function createSubitem($row) { $nomeSubitem = $row[1]; $arraySubitem = [ 'descricao' => $row[2], 'unidade' => $row[3], 'quantidade' => $row[4], 'preco_unitario' => $row[5], 'bdi' => $row[6], ]; $validator = Validator::make($arraySubitem, [ 'descricao' => 'nullable|string', 'quantidade' => 'required|numeric|min:0.01', 'unidade' => 'required|string', 'preco_unitario' => 'required|numeric|min:0.01', 'bdi' => 'nullable|numeric|min:0|max:100', ]); if ($validator->fails()) { $this->geraLog($validator); $this->line++; return null; } $subitem = FaseServicoSubitem::firstOrCreate( ['nome' => $nomeSubitem, 'fase_servico_id' => $this->getCurrentServicoId($row[0])], $arraySubitem ); $this->line++; return $subitem; } private function createServico($row) { $nomeServico = $row[1]; $servico = FaseServico::firstOrCreate( ['nome' => $nomeServico, 'fase_id' => $this->faseId], [ 'descricao' => $row[2], ] ); $this->servicos[$row[0]] = $servico->id; $this->line++; return $servico; } private function createFase($row) { $nomeFase = $row[1] ?: 'Fase de Obras'; $fase = Fase::firstOrCreate(['nome' => $nomeFase, 'obra_id' => $this->obraId]); $this->faseId = $fase->id; $this->line++; return $fase; } private function geraLog($validator) { $erros = $validator->errors(); $mensagensErro = ''; foreach ($erros->all() as $mensagem) { $mensagensErro .= $mensagem."\n"; } LogImportacao::create([ 'obra_id' => $this->obraId, 'mensagem' => "A importação da linha {$this->line} falhou com os seguintes erros:\n{$mensagensErro}", ]); } }
| ver. 1.4 |
Github
|
.
| PHP 8.3.28 | Generation time: 0.02 |
proxy
|
phpinfo
|
Settings