select(DB::raw(" ferida.id, ferida.nome, ferida.ativo, 'ferida.identificador_externo', ferida.observacao ")); } public static function create() { return [ 'form' => self::getFormData(), 'model' => [ 'nome' => null, 'ativo' => true, 'identificador_externo' => null, 'cid' => null, 'observacao' => null, 'procedimento' => null, 'procedimentos' => [], ], ]; } public static function store() { self::validate(); $params = self::getParams(); $ferida = Ferida::create($params); foreach (request()->procedimentos as $procedimento) { $cidId = $procedimento['cid_id'] ?? null; $quantidade = $procedimento['quantidade'] ?? null; FeridaProcedimento::create([ 'ferida_id' => $ferida->id, 'procedimento_id' => $procedimento['id'], 'cid_id' => $cidId, 'quantidade' => $quantidade, ]); } return $ferida; } public static function edit($id) { $ferida = Ferida::with( [ 'procedimentos.procedimento', 'procedimentos.cid' ] )->findOrFail($id); return [ 'form' => self::getFormData(), 'model' => [ 'nome' => $ferida->nome, 'ativo' => $ferida->ativo ?? false, 'identificador_externo' => $ferida->identificador_externo, 'observacao' => $ferida->observacao ?? null, 'procedimento' => null, 'procedimentos' => $ferida->procedimentos->map(fn ($procedimento) => (object) [ 'codigo' => $procedimento->procedimento->codigo, 'nome' => $procedimento->procedimento->nome, 'id' => $procedimento->procedimento_id, 'cid_id' => $procedimento->cid_id, 'cid' => $procedimento->cid, 'quantidade' => $procedimento->quantidade, ] ), ], ]; } private static function getFormData() { return []; } public static function update($id) { self::validate(); $ferida = Ferida::findOrFail($id); $params = self::getParams(); $ferida->update($params); FeridaProcedimento::where('ferida_id', $ferida->id)->delete(); foreach (request()->procedimentos as $procedimento) { $cidId = $procedimento['cid_id'] ?? null; $quantidade = $procedimento['quantidade'] ?? null; FeridaProcedimento::create([ 'ferida_id' => $ferida->id, 'procedimento_id' => $procedimento['id'], 'cid_id' => $cidId, 'quantidade' => $quantidade, ]); } return $ferida->fresh(); } private static function getParams() { $params = request()->except(['procedimentos']); return $params; } public static function activate($id) { $feriado = Ferida::findOrFail($id); $feriado->update(['ativo' => true]); return $feriado->fresh(); } public static function deactivate($id) { $feriado = Ferida::findOrFail($id); $feriado->update(['ativo' => false]); return $feriado->fresh(); } public static function destroy($id) { FeridaProcedimento::where('ferida_id', $id)->delete(); Ferida::findOrFail($id)->delete(); } private static function validate() { $validator = Validator::make(request()->all(), [ 'nome' => [ 'required', 'string', 'between:3,100', Rule::unique(Ferida::class, 'nome') ->ignore(request()->route('ferida')) ], 'ativo' => [ 'required', 'boolean', ], 'identificador_externo' => [ 'nullable', 'alpha_num', 'max:64', Rule::unique(Ferida::class, 'identificador_externo') ->ignore(request()->route('ferida')) ], 'observacao' => [ 'nullable', 'string', 'max:500', ], ], [ 'nome.unique' => 'O nome da Ferida já foi inserido anteriormente.', 'identificador_externo.alpha_num' => 'O Identificador Externo deve conter apenas letras e números.', 'identificador_externo.max' => 'O Identificador Externo não pode ter mais que 64 caracteres.', 'identificador_externo.unique' => 'O Identificador Externo já está em uso.', ]); if ($validator->fails()) { if ($validator->errors()->has('identificador_externo')) { Log::info('Tentativa de gravação de Identificador Externo inválido ou duplicado.', [ 'user_id' => auth()->id(), 'identificador_externo' => request('identificador_externo'), 'errors' => $validator->errors()->get('identificador_externo') ]); } $validator->validate(); } } }