1018 lines
45 KiB
PHP
1018 lines
45 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Parametrizacao;
|
|
|
|
use App\Enums\Cadastro\Grupo\GrupoTipo;
|
|
use App\Enums\ExameLaboratorial\TipoFator;
|
|
use App\Enums\Geral\MedidaTempo;
|
|
use App\Enums\Parametrizacao\Exame\Classificacao;
|
|
use App\Enums\Parametrizacao\Exame\Tipo;
|
|
use App\Enums\Sigtap\Complexidade;
|
|
use App\Enums\Sigtap\Registro;
|
|
use App\Exceptions\Model\DeletingModelException;
|
|
use App\Http\Controllers\Controller;
|
|
use App\Http\Requests\Parametrizacao\ExameRequest;
|
|
use App\Models\Cadastro\Grupo\Grupo;
|
|
use App\Models\Cadastro\SujeitoAtencao\Lotacao;
|
|
use App\Models\Cadastro\SujeitoAtencao\Paciente;
|
|
use App\Models\Cadastro\SujeitoAtencao\Sexo;
|
|
use App\Models\ExameImagem\Agendamento\Agendamento;
|
|
use App\Models\ExameImagem\Agendamento\AgendamentoExame;
|
|
use App\Models\ExameLaboratorial\FormulaExame\FormulaExame;
|
|
use App\Models\ExameLaboratorial\FormulaExame\FormulaExameFator;
|
|
use App\Models\Parametrizacao\Exame\Exame;
|
|
use App\Models\Parametrizacao\Exame\ExameComposicao;
|
|
use App\Models\Parametrizacao\Exame\ExameComposicaoCasaDecimal;
|
|
use App\Models\Parametrizacao\Exame\ExameComposicaoLista;
|
|
use App\Models\Parametrizacao\Exame\ExameComposicaoSituacao;
|
|
use App\Models\Parametrizacao\Exame\ExameComposicaoTipoResultado;
|
|
use App\Models\Parametrizacao\Exame\ExameComposicaoUnidade;
|
|
use App\Models\Parametrizacao\Exame\ExameComposicaoVariavel;
|
|
use App\Models\Parametrizacao\Exame\ExameTextoPronto;
|
|
use App\Models\Parametrizacao\Exame\ExameTipo;
|
|
use App\Models\Regulacao\Tipo as RegulacaoTipo;
|
|
use App\Models\Sigtap\Procedimento;
|
|
use App\Utils\DataUtil;
|
|
use Exception;
|
|
use Illuminate\Http\Response;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
class ExameController extends Controller
|
|
{
|
|
protected $modulo = 'parametrizacao';
|
|
protected $funcionalidade = 'exame';
|
|
|
|
public function autocomplete()
|
|
{
|
|
|
|
if (request()->get('exame_grupo')) {
|
|
|
|
$grupos = DB::table('cadastro_grupo')
|
|
->select([
|
|
'id',
|
|
DB::raw('"" AS codigo'),
|
|
'nome',
|
|
DB::raw('true AS pertence_grupo'),
|
|
]);
|
|
|
|
$exames = DB::table('parametrizacao_exame')
|
|
->select([
|
|
'id',
|
|
'codigo',
|
|
'nome',
|
|
DB::raw('false AS pertence_grupo'),
|
|
]);
|
|
|
|
if (is_numeric(request()->get('tipo_id'))) {
|
|
|
|
$exames->where('parametrizacao_exame.tipo_id', request()->get('tipo_id'));
|
|
}
|
|
|
|
$exames->union($grupos);
|
|
} else {
|
|
|
|
$exames = DB::table('parametrizacao_exame')
|
|
->leftJoin('sigtap.procedimento', function ($join) {
|
|
|
|
$join->on('sigtap.procedimento.codigo', 'parametrizacao_exame.codigo')
|
|
->where('sigtap.procedimento.competencia_id', '=', function ($query) {
|
|
|
|
$query->select('sigtap.competencia.id')
|
|
->from('sigtap.competencia')
|
|
->orderByDesc('sigtap.competencia.valor')
|
|
->limit(1);
|
|
});
|
|
})
|
|
->leftJoin(
|
|
'parametrizacao_procedimento',
|
|
'parametrizacao_procedimento.procedimento_codigo',
|
|
'parametrizacao_exame.codigo'
|
|
)
|
|
->select(
|
|
'parametrizacao_exame.id',
|
|
'parametrizacao_exame.tipo_id',
|
|
'parametrizacao_exame.grupo_tipo_id',
|
|
'parametrizacao_exame.codigo',
|
|
'parametrizacao_exame.nome',
|
|
'parametrizacao_exame.sigla_exame',
|
|
'parametrizacao_exame.ativo',
|
|
'parametrizacao_exame.observacao',
|
|
'parametrizacao_exame.sexo_id',
|
|
'parametrizacao_procedimento.apelido',
|
|
'sigtap.procedimento.nome as procedimento_nome',
|
|
'sigtap.procedimento.id as procedimento_id',
|
|
'sigtap.procedimento.quantidade_maxima_execucao',
|
|
'parametrizacao_exame.valor',
|
|
'parametrizacao_exame.valor_sigtap',
|
|
'parametrizacao_exame.exigir_peso_altura_circunferencia',
|
|
'parametrizacao_exame.validade',
|
|
'parametrizacao_exame.quantidade_maxima',
|
|
'parametrizacao_exame.prazo_entrega',
|
|
'parametrizacao_exame.provisorio',
|
|
'parametrizacao_exame.outro_municipio',
|
|
'parametrizacao_exame.quantidade_reagente',
|
|
'parametrizacao_exame.permite_repeticao',
|
|
'parametrizacao_exame.senha_supervisor',
|
|
'sigtap.procedimento.valor_servico_ambilatorial',
|
|
'sigtap.procedimento.sexo',
|
|
'sigtap.procedimento.complexidade',
|
|
)
|
|
->whereNull('parametrizacao_exame.deleted_at');
|
|
|
|
if (request()->get('filtrar_ativos')) {
|
|
|
|
$exames->where('parametrizacao_exame.ativo', true);
|
|
}
|
|
|
|
if (is_numeric(request()->get('tipo_id'))) {
|
|
|
|
$exames->where('parametrizacao_exame.tipo_id', request()->get('tipo_id'));
|
|
}
|
|
|
|
if (request()->get('parametrizacao_exame_laboratorial_infraestrutura_id')) {
|
|
|
|
$exames->where(fn ($q) => $q
|
|
->where('parametrizacao_exame.tipo_id', '<>', Tipo::LABORATORIAL)
|
|
->orWhere(fn ($q) => $q
|
|
->where('parametrizacao_exame.tipo_id', Tipo::LABORATORIAL)
|
|
->where(fn ($q) => $q
|
|
->whereExists(fn ($q) => $q
|
|
->selectRaw(1)
|
|
->from('exame_laboratorial_parametrizacao_unidade_solicitante_exame_item')
|
|
->join(
|
|
'exame_laboratorial_parametrizacao_unidade_solicitante_exame',
|
|
'exame_laboratorial_parametrizacao_unidade_solicitante_exame.id',
|
|
'exame_laboratorial_parametrizacao_unidade_solicitante_exame_item.unidade_solicitante_exame_id'
|
|
)
|
|
->whereColumn(
|
|
'exame_laboratorial_parametrizacao_unidade_solicitante_exame_item.exame_id',
|
|
'parametrizacao_exame.id'
|
|
)
|
|
->where(
|
|
'exame_laboratorial_parametrizacao_unidade_solicitante_exame.infraestrutura_id',
|
|
request()->get('parametrizacao_exame_laboratorial_infraestrutura_id')
|
|
)
|
|
)
|
|
->orWhereNotExists(fn ($q) => $q
|
|
->selectRaw(1)
|
|
->from('exame_laboratorial_parametrizacao_unidade_solicitante_exame')
|
|
->where(
|
|
'exame_laboratorial_parametrizacao_unidade_solicitante_exame.infraestrutura_id',
|
|
request()->get('parametrizacao_exame_laboratorial_infraestrutura_id')
|
|
)
|
|
)
|
|
)
|
|
)
|
|
);
|
|
}
|
|
|
|
if (request()->get('classificacao_id') == Classificacao::PROVISORIO) {
|
|
|
|
$exames->where('parametrizacao_exame.provisorio', true);
|
|
}
|
|
|
|
if (request()->get('classificacao_id') == Classificacao::OUTRO_MUNICIPIO) {
|
|
|
|
$exames->where('parametrizacao_exame.outro_municipio', true);
|
|
}
|
|
|
|
if (is_numeric(request()->get('grupo_id'))) {
|
|
|
|
$exames->where('parametrizacao_exame.grupo_tipo_id', request()->get('grupo_id'));
|
|
}
|
|
|
|
if (request()->get('sexo_id')) {
|
|
|
|
$exames->where(function ($query) {
|
|
|
|
$query
|
|
->where(function ($query) {
|
|
|
|
$query->where('parametrizacao_exame.exige_procedimento', true)
|
|
->where(function ($query) {
|
|
|
|
$query->where('sigtap.procedimento.sexo', Sexo::find(request()->get('sexo_id'))->identificador)
|
|
->orWhere('sigtap.procedimento.sexo', 'I')
|
|
->orWhere('sigtap.procedimento.sexo', 'N');
|
|
});
|
|
})
|
|
->orWhere(function ($query) {
|
|
|
|
$query->where('parametrizacao_exame.exige_procedimento', false)
|
|
->where('parametrizacao_exame.sexo_id', request()->get('sexo_id'));
|
|
});
|
|
});
|
|
}
|
|
|
|
if (is_numeric(request()->get('paciente_id'))) {
|
|
|
|
$paciente = Paciente::findOrFail(request()->get('paciente_id'));
|
|
|
|
$exames->where(function ($exames) use ($paciente) {
|
|
|
|
$exames
|
|
->where(function ($exames) use ($paciente) {
|
|
$exames->where('parametrizacao_exame.exige_procedimento', false)
|
|
->where(function ($exames) use ($paciente) {
|
|
$exames->whereNull('parametrizacao_exame.sexo_id')
|
|
->orWhere('parametrizacao_exame.sexo_id', $paciente->cidadao->sexo_id);
|
|
});
|
|
})
|
|
->orWhere(function ($exames) use ($paciente) {
|
|
|
|
$exames->where('parametrizacao_exame.exige_procedimento', true)
|
|
->where(function ($exames) use ($paciente) {
|
|
|
|
$exames->where(function ($exames) use ($paciente) {
|
|
$exames
|
|
->where('sigtap.procedimento.sexo', $paciente->cidadao->sexo->identificador)
|
|
->orWhere('sigtap.procedimento.sexo', 'I')
|
|
->orWhere('sigtap.procedimento.sexo', 'N');
|
|
});
|
|
|
|
if (!$paciente->is_desconhecido) {
|
|
|
|
$exames->where(function ($exames) use ($paciente) {
|
|
|
|
$meses = $paciente->cidadao->idade['anos'] * 12;
|
|
|
|
$exames
|
|
->where(function ($query) use ($meses) {
|
|
|
|
$query->where('sigtap.procedimento.idade_minima', '<=', $meses)
|
|
->orWhere('sigtap.procedimento.idade_minima', 9999);
|
|
})
|
|
->where(function ($query) use ($meses) {
|
|
|
|
$query->where('sigtap.procedimento.idade_maxima', '>=', $meses)
|
|
->orWhere('sigtap.procedimento.idade_maxima', 9999);
|
|
});
|
|
});
|
|
}
|
|
});
|
|
});
|
|
});
|
|
}
|
|
|
|
$cbo = !is_null(request()->get('cbo')) ? request()->get('cbo') : null;
|
|
|
|
if (is_null($cbo) && DataUtil::isStringTrue(request()->query('cbo_lotacao_atual'))) {
|
|
|
|
$cbo = Lotacao::findOrFail(auth()->payload()->get('lotacao_id'))->ocupacao->codigo;
|
|
}
|
|
|
|
if (!is_null($cbo)) {
|
|
|
|
$exames->where(function ($exames) use ($cbo) {
|
|
|
|
$onlyWithCbo = DataUtil::isStringBoolean(request()->get('only_with_cbo'))
|
|
? DataUtil::getBooleanValueFromStringBoolean(request()->get('only_with_cbo'))
|
|
: false;
|
|
|
|
$onlyFilterExameImagemCbo = DataUtil::isStringBoolean(request()->get('only_filter_exame_imagem_cbo'))
|
|
? DataUtil::getBooleanValueFromStringBoolean(request()->get('only_filter_exame_imagem_cbo'))
|
|
: false;
|
|
|
|
$exames->whereExists(function($query) use ($cbo) {
|
|
|
|
$query->select(DB::raw(1))
|
|
->from('sigtap.procedimento_ocupacao')
|
|
->whereColumn('sigtap.procedimento_ocupacao.procedimento_id', 'sigtap.procedimento.id')
|
|
->join('sigtap.ocupacao', 'sigtap.ocupacao.id', 'sigtap.procedimento_ocupacao.ocupacao_id');
|
|
|
|
if (is_array($cbo)) {
|
|
|
|
$query->whereIn('sigtap.ocupacao.codigo', $cbo);
|
|
} else {
|
|
|
|
$query->where('sigtap.ocupacao.codigo', $cbo);
|
|
}
|
|
});
|
|
|
|
if (!$onlyWithCbo) {
|
|
|
|
$exames->orWhereNotExists(function ($query) {
|
|
|
|
$query->select(DB::raw(1))
|
|
->from('sigtap.procedimento_ocupacao')
|
|
->whereColumn('sigtap.procedimento_ocupacao.procedimento_id', 'sigtap.procedimento.id');
|
|
});
|
|
}
|
|
|
|
if ($onlyFilterExameImagemCbo) {
|
|
|
|
$exames->orWhere('parametrizacao_exame.tipo_id', '<>', Tipo::IMAGEM);
|
|
}
|
|
});
|
|
}
|
|
|
|
if (DataUtil::isStringTrue(request()->query('atencao_basica_cadastro_exame_solicitado_avaliado'))) {
|
|
|
|
$exames->whereNotExists(function($query) {
|
|
|
|
$query->select(DB::raw(1))
|
|
->from('atencao_basica_cadastro_exame_solicitado_avaliado')
|
|
->whereColumn('sigtap.procedimento.codigo', 'atencao_basica_cadastro_exame_solicitado_avaliado.codigo_procedimento');
|
|
});
|
|
}
|
|
|
|
if (DataUtil::isStringTrue(request()->query('atencao_basica_cadastro_triagem_neonatal'))) {
|
|
|
|
$exames->whereNotExists(function($query) {
|
|
|
|
$query->select(DB::raw(1))
|
|
->from('atencao_basica_cadastro_triagem_neonatal')
|
|
->whereColumn('sigtap.procedimento.codigo', 'atencao_basica_cadastro_triagem_neonatal.codigo_procedimento');
|
|
});
|
|
}
|
|
|
|
if (DataUtil::isStringBoolean(request()->get('alto_custo'))) {
|
|
|
|
$exames->where(function ($query) {
|
|
|
|
if (DataUtil::isStringTrue(request()->get('alto_custo'))) {
|
|
|
|
$query->whereIn('sigtap.procedimento.complexidade', [
|
|
Complexidade::MEDIA_COMPLEXIDADE,
|
|
Complexidade::ALTA_COMPLEXIDADE,
|
|
])
|
|
->whereExists(function ($query) {
|
|
|
|
$query->select(DB::raw(1))
|
|
->from('sigtap.procedimento_registro')
|
|
->join(
|
|
'sigtap.registro',
|
|
'sigtap.registro.id',
|
|
'sigtap.procedimento_registro.registro_id'
|
|
)
|
|
->whereColumn('sigtap.procedimento_registro.procedimento_id', 'sigtap.procedimento.id')
|
|
->whereIn('sigtap.registro.codigo', [
|
|
Registro::APAC_PROC_PRINCIPAL,
|
|
Registro::APAC_PROC_SECUNDARIO,
|
|
]);
|
|
});
|
|
}
|
|
else {
|
|
|
|
$query->whereNotIn('sigtap.procedimento.complexidade', [
|
|
Complexidade::MEDIA_COMPLEXIDADE,
|
|
Complexidade::ALTA_COMPLEXIDADE,
|
|
]);
|
|
}
|
|
});
|
|
}
|
|
|
|
if (DataUtil::isStringBoolean(request()->get('with_unidade_solicitante')) && filter_var(request()->get('with_unidade_solicitante'), FILTER_VALIDATE_BOOLEAN)) {
|
|
|
|
$exames->where(function ($query) {
|
|
|
|
$query->whereExists(function ($query) {
|
|
|
|
$query->select(DB::raw(1))
|
|
->from('exame_laboratorial_parametrizacao_unidade_solicitante_exame_item')
|
|
->join(
|
|
'exame_laboratorial_parametrizacao_unidade_solicitante_exame',
|
|
'exame_laboratorial_parametrizacao_unidade_solicitante_exame.id',
|
|
'exame_laboratorial_parametrizacao_unidade_solicitante_exame_item.unidade_solicitante_exame_id'
|
|
)
|
|
->whereColumn('exame_laboratorial_parametrizacao_unidade_solicitante_exame_item.exame_id', 'parametrizacao_exame.id')
|
|
->where('exame_laboratorial_parametrizacao_unidade_solicitante_exame.infraestrutura_id', request()->infraestrutura_id);
|
|
});
|
|
});
|
|
}
|
|
|
|
if (DataUtil::isStringBoolean(request()->get('without_exame_regulado')) && filter_var(request()->get('without_exame_regulado'), FILTER_VALIDATE_BOOLEAN)) {
|
|
|
|
$exames->whereNull('regulacao_tipo_id');
|
|
}
|
|
}
|
|
|
|
return datatables()->of($exames)->skipTotalRecords()->make(true);
|
|
}
|
|
|
|
public function datatable()
|
|
{
|
|
$exames = DB::table('parametrizacao_exame')
|
|
->leftJoin('parametrizacao_exame_tipo', 'parametrizacao_exame_tipo.id', 'parametrizacao_exame.tipo_id')
|
|
->leftJoin('cadastro_grupo', 'cadastro_grupo.id', 'parametrizacao_exame.grupo_tipo_id')
|
|
->leftJoin('sigtap.procedimento', function ($join) {
|
|
|
|
$join->on('sigtap.procedimento.codigo', 'parametrizacao_exame.codigo')
|
|
->where('sigtap.procedimento.competencia_id', '=', function ($query) {
|
|
|
|
$query->select('sigtap.competencia.id')
|
|
->from('sigtap.competencia')
|
|
->orderByDesc('sigtap.competencia.valor')
|
|
->limit(1);
|
|
});
|
|
})
|
|
->select(
|
|
'parametrizacao_exame.id',
|
|
'parametrizacao_exame.nome AS exame',
|
|
'parametrizacao_exame_tipo.nome AS tipo',
|
|
DB::raw(
|
|
"CASE WHEN cadastro_grupo.nome IS NULL
|
|
THEN '-'
|
|
ELSE cadastro_grupo.nome END AS grupo"
|
|
),
|
|
'procedimento.codigo as procedimentoCodigo',
|
|
'procedimento.nome AS procedimentoNome'
|
|
)
|
|
->whereNull('parametrizacao_exame.deleted_at');
|
|
|
|
return datatables()->of($exames)->make(true);
|
|
}
|
|
|
|
public function index()
|
|
{
|
|
$this->auth(__FUNCTION__);
|
|
|
|
$response = null;
|
|
|
|
if (request()->has('listar') && request()->listar === 'grupos') {
|
|
$response = [
|
|
'grupos' => $this->getGrupos(),
|
|
'tipos' => RegulacaoTipo::orderBy('nome')->get(['id', 'nome']),
|
|
];
|
|
} else {
|
|
$response = $this->get(Exame::class)->orderBy('nome')->get();
|
|
}
|
|
|
|
return response()->json($response, Response::HTTP_OK);
|
|
}
|
|
|
|
public function create()
|
|
{
|
|
$this->auth(__FUNCTION__);
|
|
|
|
$exame = new Exame;
|
|
$exame->fill(array_fill_keys($exame->getFillable(), null));
|
|
|
|
return response()->json(
|
|
[
|
|
'form' => $this->getFormData(),
|
|
'model' => [
|
|
'tipo_id' => null,
|
|
'grupo_tipo_id' => null,
|
|
'tipo_salvo_id' => null,
|
|
'sigla_exame' => null,
|
|
'nome' => null,
|
|
'ativo' => true,
|
|
'exige_procedimento' => true,
|
|
'observacao' => null,
|
|
'sexoId' => null,
|
|
'is_regulado' => false,
|
|
'regulacao_tipo_id' => null,
|
|
'is_ppi' => false,
|
|
'valor_ppi' => null,
|
|
'tempo_medio_previsto_atendimento_dias' => null,
|
|
'laboratorio' => [
|
|
'prazo_entrega' => null,
|
|
'validade' => null,
|
|
'valor' => null,
|
|
'quantidade_maxima' => null,
|
|
'outro_municipio' => false,
|
|
'provisorio' => false,
|
|
'sigilo' => false,
|
|
'senha_supervisor' => false,
|
|
'ultimo_resultado' => null,
|
|
'mapa_agrupado' => false,
|
|
'posicao_mapa' => null,
|
|
'valor_sigtap' => false,
|
|
'quantidade_reagente' => null,
|
|
'permite_repeticao' => false,
|
|
],
|
|
'imagem' => [
|
|
'prazo_entrega' => null,
|
|
'validade' => null,
|
|
'valor' => null,
|
|
'valor_sigtap' => null,
|
|
'quantidade_maxima' => null,
|
|
'outro_municipio' => false,
|
|
'provisorio' => false,
|
|
'senha_supervisor' => false,
|
|
'ultimo_resultado' => null,
|
|
'resultado' => null,
|
|
'valor_sigtap' => false,
|
|
'exigir_peso_altura_circunferencia' => false,
|
|
],
|
|
'composicao' => [],
|
|
'texto_pronto' => [],
|
|
]
|
|
],
|
|
Response::HTTP_OK
|
|
);
|
|
}
|
|
|
|
public function store(ExameRequest $request)
|
|
{
|
|
if ($request->has('action') && $request->action === 'atribuicao-parametro-grupo') {
|
|
$params = [];
|
|
|
|
if (isset($request->regulacao_tipo_id)) {
|
|
$params['regulacao_tipo_id'] = $request->regulacao_tipo_id;
|
|
}
|
|
|
|
if (!isset($request->regulacao_tipo_id)) {
|
|
$params['regulacao_tipo_id'] = NULL;
|
|
}
|
|
if (isset($request->exigir_peso_altura_circunferencia)) {
|
|
$params['exigir_peso_altura_circunferencia'] = $request->exigir_peso_altura_circunferencia;
|
|
}
|
|
|
|
if (isset($request->is_ppi)) {
|
|
$params['is_ppi'] = $request->is_ppi;
|
|
}
|
|
|
|
if (isset($request->tempo_medio_previsto_atendimento_dias)) {
|
|
$params['tempo_medio_previsto_atendimento_dias'] = $request->tempo_medio_previsto_atendimento_dias;
|
|
}
|
|
|
|
foreach ($request->grupos as $grupo) {
|
|
Exame::where('grupo_tipo_id', $grupo)->update($params);
|
|
}
|
|
|
|
return response()->json([], Response::HTTP_CREATED);
|
|
} else {
|
|
$this->auth(__FUNCTION__);
|
|
|
|
$exame = Exame::create($this->getParams($request))->fresh();
|
|
|
|
DB::transaction(function () use ($request, $exame) {
|
|
|
|
foreach ($request['composicao'] as $param) {
|
|
|
|
$composicao = new ExameComposicao();
|
|
|
|
$composicao->exame_id = $exame->id;
|
|
$composicao->descricao = $param['descricao'];
|
|
$composicao->limite_inferior = $param['limite_inferior'];
|
|
$composicao->limite_superior = $param['limite_superior'];
|
|
$composicao->unidade_id = $param['unidade_id'];
|
|
$composicao->referencia = $param['referencia'];
|
|
$composicao->tipo_idade_id = $param['tipo_idade_id'];
|
|
$composicao->idade_inicial = $param['idade_inicial'];
|
|
$composicao->idade_final = $param['idade_final'];
|
|
$composicao->sexo_id = $param['sexo_id'];
|
|
$composicao->tipo_resultado_id = $param['tipo_resultado_id'];
|
|
$composicao->casa_decimal_id = $param['casa_decimal_id'];
|
|
$composicao->formula_id = $param['formula_id'];
|
|
$composicao->visivel = $param['visivel'];
|
|
$composicao->referencia_especial = $param['referencia_especial'];
|
|
$composicao->valor_absoluto = $param['valor_absoluto'];
|
|
$composicao->resultado = $param['resultado'];
|
|
|
|
if (!is_null($param['limite_inferior'])) {
|
|
$composicao->limite_inferior = str_replace('.', '', $composicao->limite_inferior);
|
|
$composicao->limite_inferior = str_replace(',', '.', $composicao->limite_inferior);
|
|
}
|
|
|
|
if (!is_null($param['limite_superior'])) {
|
|
$composicao->limite_superior = str_replace('.', '', $composicao->limite_superior);
|
|
$composicao->limite_superior = str_replace(',', '.', $composicao->limite_superior);
|
|
}
|
|
|
|
$composicao->save();
|
|
|
|
foreach ($param['lista'] ?? [] as $paramLista) {
|
|
|
|
$lista = new ExameComposicaoLista();
|
|
|
|
$lista->composicao_id = $composicao->id;
|
|
$lista->descricao = $paramLista['descricao'];
|
|
$lista->ordem = $paramLista['ordem'];
|
|
$lista->situacao_id = $paramLista['situacao_id'];
|
|
$lista->padrao = $paramLista['padrao'];
|
|
$lista->save();
|
|
}
|
|
|
|
foreach ($param['variavel'] ?? [] as $paramVariavel) {
|
|
|
|
$variavel = new ExameComposicaoVariavel();
|
|
|
|
$variavel->composicao_id = $composicao->id;
|
|
$variavel->fator_id = $paramVariavel['fator_id'];
|
|
$variavel->ordem = $paramVariavel['ordem'];
|
|
$variavel->save();
|
|
}
|
|
}
|
|
|
|
foreach ($request['texto_pronto'] ?? [] as $param) {
|
|
|
|
$texto = new ExameTextoPronto();
|
|
|
|
$texto->exame_id = $exame->id;
|
|
$texto->codigo = $param['codigo'];
|
|
$texto->descricao = $param['descricao'];
|
|
$texto->save();
|
|
}
|
|
});
|
|
|
|
return response()->json($exame, Response::HTTP_CREATED);
|
|
}
|
|
}
|
|
|
|
public function show($id)
|
|
{
|
|
$this->auth(__FUNCTION__);
|
|
|
|
return response()->json($this->get(Exame::class, $id), Response::HTTP_OK);
|
|
}
|
|
|
|
public function edit($id)
|
|
{
|
|
$this->auth(__FUNCTION__);
|
|
|
|
$exame = Exame::findOrFail($id);
|
|
|
|
$valor = number_format($exame->valor, 2, ",", ".");
|
|
|
|
return response()->json(
|
|
[
|
|
'form' => $this->getFormData(),
|
|
'model' => [
|
|
'tipo_id' => $exame->tipo_id ?? null,
|
|
'tipo_salvo_id' => $exame->tipo_id ?? null,
|
|
'grupo_tipo_id' => $exame->grupo_tipo_id ?? null,
|
|
'grupo_tipo_nome' => $exame->grupo_tipo_id->nome ?? null,
|
|
'grupo_salvo' => $exame->grupo_tipo_id ?? null,
|
|
'procedimento' => $exame->procedimento ?? null,
|
|
'sigla_exame' => $exame->sigla_exame ?? null,
|
|
'sexo_id' => $exame->sexo_id ?? null,
|
|
'nome' => $exame->nome ?? null,
|
|
'salva_nome_procedimento' => $exame->procedimento ?? null,
|
|
'ativo' => $exame->ativo ?? true,
|
|
'exige_procedimento' => $exame->exige_procedimento ?? true,
|
|
'observacao' => $exame->observacao ?? null,
|
|
'is_regulado' => $exame->is_regulado,
|
|
'regulacao_tipo_id' => $exame->regulacao_tipo_id,
|
|
'is_ppi' => $exame->is_ppi ?? false,
|
|
'valor_ppi' => $exame->valor_ppi,
|
|
'tempo_medio_previsto_atendimento_dias' => $exame->tempo_medio_previsto_atendimento_dias,
|
|
'laboratorio' => [
|
|
'prazo_entrega' => $exame->prazo_entrega ?? null,
|
|
'validade' => $exame->validade ?? null,
|
|
'valor' => $valor ?? null,
|
|
'quantidade_maxima' => $exame->quantidade_maxima ?? null,
|
|
'outro_municipio' => $exame->outro_municipio ?? false,
|
|
'provisorio' => $exame->provisorio ?? false,
|
|
'sigilo' => $exame->sigilo ?? false,
|
|
'senha_supervisor' => $exame->senha_supervisor ?? false,
|
|
'ultimo_resultado' => $exame->ultimo_resultado ?? null,
|
|
'mapa_agrupado' => $exame->mapa_agrupado ?? false,
|
|
'posicao_mapa' => $exame->posicao_mapa ?? null,
|
|
'valor_sigtap' => $exame->valor_sigtap ?? true,
|
|
'quantidade_reagente' => $exame->quantidade_reagente ?? null,
|
|
'permite_repeticao' => $exame->permite_repeticao ?? false,
|
|
],
|
|
'imagem' => [
|
|
'prazo_entrega' => $exame->prazo_entrega ?? null,
|
|
'validade' => $exame->validade ?? null,
|
|
'valor' => $valor ?? null,
|
|
'quantidade_maxima' => $exame->quantidade_maxima ?? null,
|
|
'outro_municipio' => $exame->outro_municipio ?? false,
|
|
'provisorio' => $exame->provisorio ?? false,
|
|
'senha_supervisor' => $exame->senha_supervisor ?? false,
|
|
'ultimo_resultado' => $exame->ultimo_resultado ?? null,
|
|
'resultado' => $exame->resultado ?? null,
|
|
'valor_sigtap' => $exame->valor_sigtap ?? true,
|
|
'exigir_peso_altura_circunferencia' => $exame->exigir_peso_altura_circunferencia ?? false,
|
|
],
|
|
'composicao' => ExameComposicao::where('exame_id', $id)
|
|
->get()
|
|
->map(fn ($query) => [
|
|
'id' => $query->id,
|
|
'exame_id' => $query->exame_id,
|
|
'descricao' => $query->descricao,
|
|
'limite_inferior' => number_format($query->limite_inferior, 2, ',', '.'),
|
|
'limite_superior' => number_format($query->limite_superior, 2, ',', '.'),
|
|
'unidade_id' => $query->unidade_id,
|
|
'unidade' => $query->unidade_id ? $query->unidade->descricao : '-',
|
|
'referencia' => $query->referencia,
|
|
'tipo_idade_id' => $query->tipo_idade_id,
|
|
'tipo_idade' => $query->tipoIdade ? mb_strtoupper($query->tipoIdade->nome) : '-',
|
|
'idade_inicial' => $query->idade_inicial,
|
|
'idade_final' => $query->idade_final,
|
|
'sexo_id' => $query->sexo_id,
|
|
'sexo' => $query->sexo->descricao ?? 'AMBOS',
|
|
'tipo_resultado_id' => $query->tipo_resultado_id,
|
|
'tipo_resultado' => $query->tipoResultado->descricao,
|
|
'casa_decimal_id' => $query->casa_decimal_id,
|
|
'formula_id' => $query->formula_id,
|
|
'visivel' => $query->visivel,
|
|
'valor_absoluto' => $query->valor_absoluto,
|
|
'resultado' => $query->resultado,
|
|
'referencia_especial' => $query->referencia_especial,
|
|
'lista' => ExameComposicaoLista::where('composicao_id', $query->id)
|
|
->get()
|
|
->map(fn ($composicao) => [
|
|
'id' => $composicao->id,
|
|
'descricao' => $composicao->descricao,
|
|
'ordem' => $composicao->ordem,
|
|
'situacao_id' => $composicao->situacao_id,
|
|
'situacao' => $composicao->situacao->descricao,
|
|
'padrao' => $composicao->padrao,
|
|
]),
|
|
'variavel' => ExameComposicaoVariavel::where('composicao_id', $query->id)
|
|
->get()
|
|
->map(fn ($variavel) => [
|
|
'id' => $variavel->id,
|
|
'ordem' => $variavel->ordem,
|
|
'fator_id' => $variavel->fator_id ?? null,
|
|
'fator' => $variavel->fator->fator ?? null,
|
|
]),
|
|
]),
|
|
'texto_pronto' => ExameTextoPronto::where('exame_id', $id)
|
|
->get()
|
|
->map(fn ($query) => [
|
|
'id' => $query->id,
|
|
'exame_id' => $query->exame_id,
|
|
'codigo' => $query->codigo,
|
|
'descricao' => $query->descricao,
|
|
]),
|
|
],
|
|
],
|
|
Response::HTTP_OK
|
|
);
|
|
}
|
|
|
|
private function getFormData()
|
|
{
|
|
return [
|
|
'composicao_unidade' => ExameComposicaoUnidade::orderBy('descricao')->get(),
|
|
'composicao_sexo' => Sexo::orderBy('descricao')->get(),
|
|
'composicao_tipo_resultado' => ExameComposicaoTipoResultado::orderBy('descricao')->get(),
|
|
'composicao_tipo_idade' => self::getMedidaTempo(),
|
|
'composicao_casa_decimal' => ExameComposicaoCasaDecimal::orderBy('descricao')->get(),
|
|
'composicao_visivel' => [
|
|
[
|
|
'value' => true,
|
|
'text' => 'SIM',
|
|
],
|
|
[
|
|
'value' => false,
|
|
'text' => 'NÃO',
|
|
]
|
|
],
|
|
'composicao_situacao' => ExameComposicaoSituacao::orderBy('descricao')->get(),
|
|
'formulas' => FormulaExame::orderBy('nome')->get(),
|
|
'tipos' => ExameTipo::orderBy('nome')->get(),
|
|
'variaveis' => FormulaExameFator::where('tipo', TipoFator::VARIAVEL)
|
|
->get()
|
|
->map(function ($query) {
|
|
return [
|
|
'id' => $query->id,
|
|
'fator' => $query->fator,
|
|
];
|
|
})->values(),
|
|
'grupos' => Grupo::where('grupo_tipo_id', GrupoTipo::EXAME)->orderBy('nome')
|
|
->get()
|
|
->map(fn ($query) => [
|
|
'id' => $query->id,
|
|
'nome' => $query->nome,
|
|
'regulacao_tipo_id' => $query->regulacao_tipo_id,
|
|
]),
|
|
'sexos' => Sexo::orderBy('descricao')->get()->map(fn ($sexo) => [
|
|
'id' => $sexo->id,
|
|
'descricao' => $sexo->descricao
|
|
]),
|
|
'regulacao_tipos' => RegulacaoTipo::orderBy('nome')->get(['id', 'nome']),
|
|
];
|
|
}
|
|
|
|
private static function getMedidaTempo()
|
|
{
|
|
return DB::table('geral_medida_tempo')
|
|
->select(
|
|
'id',
|
|
DB::raw("UPPER(nome) as nome"),
|
|
)
|
|
->where(function($query) {
|
|
$query->where('id', MedidaTempo::DIAS)
|
|
->orWhere('id', MedidaTempo::MESES)
|
|
->orWhere('id', MedidaTempo::ANOS);
|
|
})
|
|
->get();
|
|
}
|
|
|
|
public function update(ExameRequest $request, $id)
|
|
{
|
|
$this->auth(__FUNCTION__);
|
|
|
|
$exame = tap(Exame::findOrFail($id))->update($this->getParams($request));
|
|
|
|
DB::transaction(function () use ($request, $id) {
|
|
|
|
$ids = [];
|
|
|
|
foreach ($request['composicao'] as $param) {
|
|
|
|
if (is_numeric($param['id'])) {
|
|
|
|
$composicao = ExameComposicao::where('id', $param['id'])
|
|
->first();
|
|
} else {
|
|
|
|
$composicao = new ExameComposicao();
|
|
}
|
|
|
|
$composicao->exame_id = $id;
|
|
$composicao->descricao = $param['descricao'];
|
|
$composicao->limite_inferior = $param['limite_inferior'];
|
|
$composicao->limite_superior = $param['limite_superior'];
|
|
$composicao->unidade_id = $param['unidade_id'];
|
|
$composicao->referencia = $param['referencia'];
|
|
$composicao->tipo_idade_id = $param['tipo_idade_id'];
|
|
$composicao->idade_inicial = $param['idade_inicial'];
|
|
$composicao->idade_final = $param['idade_final'];
|
|
$composicao->sexo_id = $param['sexo_id'];
|
|
$composicao->tipo_resultado_id = $param['tipo_resultado_id'];
|
|
$composicao->casa_decimal_id = $param['casa_decimal_id'];
|
|
$composicao->formula_id = $param['formula_id'];
|
|
$composicao->visivel = $param['visivel'];
|
|
$composicao->referencia_especial = $param['referencia_especial'];
|
|
$composicao->valor_absoluto = $param['valor_absoluto'];
|
|
$composicao->resultado = $param['resultado'];
|
|
|
|
if (!is_null($param['limite_inferior'])) {
|
|
$composicao->limite_inferior = str_replace('.', '', $composicao->limite_inferior);
|
|
$composicao->limite_inferior = str_replace(',', '.', $composicao->limite_inferior);
|
|
}
|
|
|
|
if (!is_null($param['limite_superior'])) {
|
|
$composicao->limite_superior = str_replace('.', '', $composicao->limite_superior);
|
|
$composicao->limite_superior = str_replace(',', '.', $composicao->limite_superior);
|
|
}
|
|
|
|
$composicao->save();
|
|
|
|
$ids[] = $composicao->id;
|
|
|
|
$ids_lista = [];
|
|
|
|
foreach ($param['lista'] ?? [] as $paramLista) {
|
|
|
|
if (is_numeric($paramLista['id'])) {
|
|
|
|
$lista = ExameComposicaoLista::where('id', $paramLista['id'])
|
|
->first();
|
|
} else {
|
|
|
|
$lista = new ExameComposicaoLista();
|
|
}
|
|
|
|
$lista->composicao_id = $composicao->id;
|
|
$lista->descricao = $paramLista['descricao'];
|
|
$lista->ordem = $paramLista['ordem'];
|
|
$lista->situacao_id = $paramLista['situacao_id'];
|
|
$lista->padrao = $paramLista['padrao'];
|
|
$lista->save();
|
|
|
|
$ids_lista[] = $lista->id;
|
|
}
|
|
|
|
$ids_variavel = [];
|
|
|
|
foreach ($param['variavel'] ?? [] as $paramVariavel) {
|
|
|
|
if (is_numeric($paramVariavel['id'])) {
|
|
|
|
$variavel = ExameComposicaoVariavel::where('id', $paramVariavel['id'])
|
|
->first();
|
|
} else {
|
|
|
|
$variavel = new ExameComposicaoVariavel();
|
|
}
|
|
|
|
$variavel->composicao_id = $composicao->id;
|
|
$variavel->fator_id = $paramVariavel['fator_id'];
|
|
$variavel->ordem = $paramVariavel['ordem'];
|
|
$variavel->save();
|
|
|
|
$ids_variavel[] = $variavel->id;
|
|
}
|
|
|
|
ExameComposicaoVariavel::destroy(ExameComposicaoVariavel::where('composicao_id', $composicao->id)
|
|
->whereNotIn('id', $ids_variavel)->pluck('id'));
|
|
|
|
ExameComposicaoLista::destroy(ExameComposicaoLista::where('composicao_id', $composicao->id)
|
|
->whereNotIn('id', $ids_lista)->pluck('id'));
|
|
}
|
|
|
|
$ids_texto = [];
|
|
|
|
foreach ($request['texto_pronto'] ?? [] as $param) {
|
|
|
|
if (is_numeric($param['id'])) {
|
|
|
|
$texto = ExameTextoPronto::where('id', $param['id'])
|
|
->first();
|
|
} else {
|
|
|
|
$texto = new ExameTextoPronto();
|
|
}
|
|
|
|
$texto->exame_id = $id;
|
|
$texto->codigo = $param['codigo'];
|
|
$texto->descricao = $param['descricao'];
|
|
$texto->save();
|
|
|
|
$ids_texto[] = $texto->id;
|
|
}
|
|
|
|
try {
|
|
ExameTextoPronto::destroy(ExameTextoPronto::where('exame_id', $id)
|
|
->whereNotIn('id', $ids_texto)->pluck('id'));
|
|
|
|
ExameComposicao::destroy(ExameComposicao::where('exame_id', $id)
|
|
->whereNotIn('id', $ids)->pluck('id'));
|
|
} catch (Exception $e) {
|
|
throw new DeletingModelException;
|
|
}
|
|
});
|
|
|
|
return response()->json($exame->fresh(), Response::HTTP_OK);
|
|
}
|
|
|
|
private function getParams($request)
|
|
{
|
|
$params = $request->all();
|
|
|
|
if ($params['tipo_id'] == '1') {
|
|
|
|
$valor = $params['laboratorio']['valor'];
|
|
$valor = str_replace('.', '', $valor);
|
|
$valor = str_replace(',', '.', $valor);
|
|
|
|
$params['prazo_entrega'] = $params['laboratorio']['prazo_entrega'];
|
|
$params['validade'] = $params['laboratorio']['validade'];
|
|
$params['valor'] = $valor;
|
|
$params['quantidade_maxima'] = $params['laboratorio']['quantidade_maxima'];
|
|
$params['outro_municipio'] = $params['laboratorio']['outro_municipio'];
|
|
$params['provisorio'] = $params['laboratorio']['provisorio'];
|
|
$params['sigilo'] = $params['laboratorio']['sigilo'];
|
|
$params['senha_supervisor'] = $params['laboratorio']['senha_supervisor'];
|
|
$params['ultimo_resultado'] = $params['laboratorio']['ultimo_resultado'];
|
|
$params['mapa_agrupado'] = $params['laboratorio']['mapa_agrupado'];
|
|
$params['posicao_mapa'] = $params['laboratorio']['posicao_mapa'];
|
|
$params['valor_sigtap'] = $params['laboratorio']['valor_sigtap'];
|
|
$params['quantidade_reagente'] = $params['laboratorio']['quantidade_reagente'];
|
|
$params['permite_repeticao'] = $params['laboratorio']['permite_repeticao'];
|
|
} else {
|
|
|
|
$valor = $params['imagem']['valor'];
|
|
$valor = str_replace('.', '', $valor);
|
|
$valor = str_replace(',', '.', $valor);
|
|
|
|
$params['prazo_entrega'] = $params['imagem']['prazo_entrega'];
|
|
$params['validade'] = $params['imagem']['validade'];
|
|
$params['valor'] = $valor;
|
|
$params['quantidade_maxima'] = $params['imagem']['quantidade_maxima'];
|
|
$params['outro_municipio'] = $params['imagem']['outro_municipio'];
|
|
$params['provisorio'] = $params['imagem']['provisorio'];
|
|
$params['senha_supervisor'] = $params['imagem']['senha_supervisor'];
|
|
$params['ultimo_resultado'] = $params['imagem']['ultimo_resultado'];
|
|
$params['resultado'] = $params['imagem']['resultado'];
|
|
$params['valor_sigtap'] = $params['imagem']['valor_sigtap'];
|
|
$params['exigir_peso_altura_circunferencia'] = $params['imagem']['exigir_peso_altura_circunferencia'];
|
|
}
|
|
|
|
if ($params['exige_procedimento'] == true) {
|
|
|
|
$params['codigo'] = Procedimento::findOrFail($params['procedimento_id'])->codigo;
|
|
}
|
|
|
|
if ($params['exige_procedimento'] == false) {
|
|
|
|
$params['codigo'] = '';
|
|
}
|
|
|
|
$params['valor_ppi'] = str_replace(',', '.', str_replace('.', '', $params['valor_ppi']));
|
|
|
|
return $params;
|
|
}
|
|
|
|
public function destroy($id)
|
|
{
|
|
$this->auth(__FUNCTION__);
|
|
|
|
Exame::findOrFail($id)->delete();
|
|
|
|
return response()->json(null, Response::HTTP_NO_CONTENT);
|
|
}
|
|
|
|
private function getGrupos()
|
|
{
|
|
return DB::table('cadastro_grupo')
|
|
->select([
|
|
'cadastro_grupo.id',
|
|
'cadastro_grupo.nome',
|
|
])
|
|
->whereExists(fn ($q) => $q->select(DB::raw(1))
|
|
->from('parametrizacao_exame')
|
|
->whereColumn('parametrizacao_exame.grupo_tipo_id', 'cadastro_grupo.id')
|
|
)
|
|
->get();
|
|
}
|
|
}
|