join('sigtap.procedimento AS procedimento', fn ($j) => $j ->on('procedimento.codigo', 'procedimento_cirurgico.procedimento_codigo') ->where('procedimento.competencia_id', DB::table('sigtap.competencia')->max('id')) ) ->where('status', true) ->select( 'procedimento_cirurgico.id', 'procedimento_cirurgico.procedimento_codigo AS codigo', 'procedimento_cirurgico.nome', 'procedimento_cirurgico.exigir_peso_altura_circunferencia', 'procedimento.complexidade', ); if (is_numeric(request()->get('paciente_id'))) { $paciente = Paciente::findOrFail(request()->get('paciente_id')); $query->where(function ($query) use ($paciente) { $query->where(function ($query) use ($paciente) { $query->where('procedimento.sexo', $paciente->cidadao->sexo->identificador) ->orWhere('procedimento.sexo', 'I') ->orWhere('procedimento.sexo', 'N'); }); if (!$paciente->is_desconhecido) { $query->where(function ($query) use ($paciente) { $meses = $paciente->cidadao->idade['anos'] * 12; $query ->where(function ($query) use ($meses) { $query->where('procedimento.idade_minima', '<=', $meses) ->orWhere('procedimento.idade_minima', 9999); }) ->where(function ($query) use ($meses) { $query->where('procedimento.idade_maxima', '>=', $meses) ->orWhere('procedimento.idade_maxima', 9999); }); }); } }); } return $query; } public static function datatable() { $procedimentos = DB::table('parametrizacao_procedimento_cirurgico') ->select( 'cadastro_grupo.nome as grupo', 'parametrizacao_procedimento.apelido', 'parametrizacao_procedimento_cirurgico.grupo_exame_id', 'parametrizacao_procedimento_cirurgico.id', 'parametrizacao_procedimento_cirurgico.nome', 'parametrizacao_procedimento_cirurgico.observacao', 'parametrizacao_procedimento_cirurgico.procedimento_codigo', 'parametrizacao_procedimento_cirurgico.status', ) ->join('cadastro_grupo', 'parametrizacao_procedimento_cirurgico.grupo_exame_id', 'cadastro_grupo.id') ->leftJoin( 'parametrizacao_procedimento', 'parametrizacao_procedimento.procedimento_codigo', 'parametrizacao_procedimento_cirurgico.procedimento_codigo' ); return datatables() ->of($procedimentos) ->addColumn('status', function ($procedimento) { return $procedimento->status ? 'ATIVO' : 'INATIVO'; }) ->skipTotalRecords() ->make(true); } public static function index() { return ProcedimentoCirurgico::orderBy('nome')->get(); } public static function create() { return self::getDefault(); } public static function store($request) { self::validate(); $params = $request->all(); $params['valor_ppi'] = str_replace(',', '.', str_replace('.', '', $params['valor_ppi'])); $procedimentoCirurgico = ProcedimentoCirurgico::create($params)->fresh(); return $procedimentoCirurgico; } public static function edit($id) { $procedimentoCirurgico = ProcedimentoCirurgico::findOrFail($id); $procedimentoCirurgico ->setAttribute('searchByApelido', false); return [ 'model' => $procedimentoCirurgico, 'form' => self::getFormData(), ]; } public static function update($request, $id) { self::validate(); $params = $request->all(); $params['valor_ppi'] = str_replace(',', '.', str_replace('.', '', $params['valor_ppi'])); $procedimento = tap(ProcedimentoCirurgico::findOrFail($id))->update($params)->fresh(); return $procedimento; } public static function destroy($id) { return ProcedimentoCirurgico::findOrFail($id)->delete(); } private static function getDefault() { return [ 'form' => self::getFormData(), 'model' => [ 'nome' => null, 'procedimento' => null, 'grupo_exame_id' => null, 'observacao' => null, 'status' => true, 'is_regulado' => false, 'regulacao_tipo_id' => null, 'search_by_apelido' => false, 'is_ppi' => false, 'valor_ppi' => null, 'exigir_peso_altura_circunferencia' => false, ] ]; } private static function getFormData() { return [ 'grupos' => Grupo::where('grupo_tipo_id', GrupoTipo::CIRURGIA) ->orderBy('nome') ->get() ->map(fn ($query) => [ 'id' => $query->id, 'nome' => $query->nome, 'regulacao_tipo_id' => $query->regulacao_tipo_id, ]), 'regulacao_tipo' => RegulacaoTipo::orderBy('nome') ->get() ->map(fn ($query) => [ 'id' => $query->id, 'nome' => $query->nome, ]), ]; } private static function validate() { $rules = [ 'nome' => [ 'required', 'string', 'max:100', Rule::unique(ProcedimentoCirurgico::class, 'nome') ->ignore(request('id')), ], 'procedimento_codigo' => [ 'required', Rule::unique(ProcedimentoCirurgico::class, 'procedimento_codigo') ->ignore(request('id')), ], 'grupo_exame_id' => [ 'required', ], 'observacao' => [ 'nullable', 'string', 'max:1000', ], ]; if (request('is_regulado')) { $rules['regulacao_tipo_id'] = [ 'required', Rule::exists('regulacao_tipo', 'id'), ]; } request()->validate($rules, [ 'nome.required' => 'O campo nome é obrigatório.', 'nome.unique' => 'O nome do procedimento cirúrgico já foi inserido anteriormente.', 'nome.max' => 'O limite de caracteres foi atingido no campo nome.', 'procedimento_codigo.required' => 'O campo procedimento é obrigatório.', 'procedimento_codigo.unique' => 'O procedimento escolhido já foi inserido anteriormente.', 'grupo_exame_id.required' => 'O campo grupo é obrigatório.', 'observacao.max' => 'O limite de caracteres foi atingido no campo observação.', 'regulacao_tipo_id.required' => 'O campo Tipo de regulação é obrigatório quando Regulado está ativado.', 'regulacao_tipo_id.exists' => 'O Tipo de regulação selecionado é inválido.', ]); } }