self::getFormData(), 'model' => self::getModelData(), ]; } private static function getFormData() { return [ 'status_tipo' => StatusTipo::all(), 'prioridade_tipo' => PrioridadeTipo::all(), 'prioridades' => Prioridade::select('id', 'nome')->get(), ]; } private static function getModelData() { return [ 'status' => Status::all()->map(fn ($status) => [ 'id' => $status->id, 'tipo_status_id' => $status->tipo_id, 'tipo_status_nome' => $status->statusTipo->nome, 'nome_status' => $status->nome, 'allow_destroy' => SolicitacaoStatusHistorico::where('status_id', $status->id)->exists(), ]), 'prioridade' => Prioridade::all()->map(fn ($prioridade) => [ 'id' => $prioridade->id, 'tipo_prioridade_id' => $prioridade->tipo_id, 'tipo_prioridade_nome' => $prioridade->prioridadeTipo->nome, 'nome_prioridade' => $prioridade->nome, 'allow_destroy' => ServicoManutencao::where('prioridade_id', $prioridade->id)->exists(), ]), 'sla' => Sla::all()->map(fn ($sla) => [ 'id' => $sla->id, 'prioridade_id' => $sla->prioridade_id, 'prioridade_nome' => $sla->prioridade->nome, 'tempo_de_atendimento' => $sla->tempo_atendimento, 'allow_destroy' => TRUE, ]), ]; } public static function store() { self::validate(); $status = collect(request()->status); $prioridade = collect(request()->prioridade); $sla = collect(request()->sla); DB::beginTransaction(); try { $statusParams = self::saveStatus($status); $slaParams = self::saveSla($sla); $prioridadeParams = self::savePrioridade($prioridade); DB::commit(); return [ 'status' => $statusParams, 'prioridade' => $prioridadeParams, 'sla' => $slaParams, ]; } catch (\Exception $e) { DB::rollBack(); throw $e; } } private static function saveStatus($status) { $statusIds = $status->pluck('id'); $status->each(function ($status) { Status::updateOrCreate( [ 'id' => $status['id'], ], [ 'tipo_id' => $status['tipo_status_id'], 'nome' => $status['nome_status'], ] ); }); Status::whereNotIn('id', $statusIds)->delete(); return $status->pluck('id'); } private static function savePrioridade($prioridade) { $prioridadeIds = $prioridade->pluck('id'); $prioridade->each(function ($prioridade) { Prioridade::updateOrCreate( [ 'id' => $prioridade['id'], ], [ 'tipo_id' => $prioridade['tipo_prioridade_id'], 'nome' => $prioridade['nome_prioridade'], ] ); }); Prioridade::whereNotIn('id', $prioridadeIds)->delete(); return $prioridade->pluck('id'); } private static function saveSla($sla) { $slaIds = $sla->pluck('id'); $sla->each(function ($sla) { Sla::updateOrCreate( [ 'id' => $sla['id'], ], [ 'prioridade_id' => $sla['prioridade_id'], 'tempo_atendimento' => $sla['tempo_de_atendimento'], ] ); }); Sla::whereNotIn('id', $slaIds)->delete(); return $sla->pluck('id'); } private static function validate() { self::getStatusValidations(); self::getSlaValidations(); self::getPrioridadeValidations(); } private static function getStatusValidations() { request()->validate([ 'status' => [ 'present', 'array', ], 'status.*.tipo_status_id' => [ 'required', 'integer', Rule::exists(StatusTipo::class, 'id'), ], 'status.*.nome_status' => [ 'required', 'string', 'max:100', 'min:3', ], ]); } private static function getSlaValidations() { request()->validate([ 'sla' => [ 'present', 'array', ], 'sla.*.prioridade_id' => [ 'required', 'integer', Rule::exists(Prioridade::class, 'id'), ], 'sla.*.tempo_de_atendimento' => [ 'required', 'string', 'min:5', 'max:6', ], ]); } private static function getPrioridadeValidations() { request()->validate([ 'prioridade' => [ 'present', 'array', ], 'prioridade.*.tipo_prioridade_id' => [ 'required', 'integer', Rule::exists(PrioridadeTipo::class, 'id'), ], 'prioridade.*.nome_prioridade' => [ 'required', 'string', 'max:100', 'min:3', ], ]); } }