Files
rkm-conectasus-ci-sandbox/api/app/Services/Parametrizacao/ProcedimentoCirurgicoService.php
Antonio Lopes dos Santos afec302c3e
All checks were successful
build-api-image / build (push) Successful in 51s
init commit
2026-08-04 16:52:02 -03:00

247 lines
8.1 KiB
PHP

<?php
namespace App\Services\Parametrizacao;
use App\Enums\Cadastro\Grupo\GrupoTipo;
use App\Models\Cadastro\Grupo\Grupo;
use App\Models\Cadastro\SujeitoAtencao\Paciente;
use App\Models\Parametrizacao\ProcedimentoCirurgico;
use App\Models\Regulacao\Tipo as RegulacaoTipo;
use App\Services\Service;
use Illuminate\Support\Facades\DB;
use Illuminate\Validation\Rule;
class ProcedimentoCirurgicoService extends Service
{
public static function autocomplete()
{
$query = DB::table('parametrizacao_procedimento_cirurgico AS procedimento_cirurgico')
->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.',
]);
}
}