Files
rkm-conectasus-ci-sandbox/api/app/Services/Regulacao/ParametrizacaoService.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

1702 lines
84 KiB
PHP

<?php
namespace App\Services\Regulacao;
use App\Enums\Regulacao\OpcaoRetiradaProtocoloAgendamento;
use App\Enums\Regulacao\ParametrizacaoDivulgacaoAba;
use App\Models\Intranet\Estado;
use App\Models\Regulacao\Parametrizacao;
use App\Models\Regulacao\ParametrizacaoDivulgacao;
use App\Models\Regulacao\ParametrizacaoDivulgacaoAba as RegulacaoParametrizacaoDivulgacaoAba;
use App\Models\Regulacao\ParametrizacaoDivulgacaoModoTempoMedio;
use App\Models\Regulacao\ParametrizacaoPrestadorExterno;
use App\Models\Regulacao\ParametrizacaoPrestadorInterno;
use App\Models\Regulacao\ParametrizacaoRegulador;
use App\Models\Regulacao\ParametrizacaoDivulgacaoRegulador;
use App\Models\Regulacao\ParametrizacaoSolicitante;
use App\Models\Regulacao\ParametrizacaoSupervisor;
use App\Services\Service;
use App\Utils\DataUtil;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
class ParametrizacaoService extends Service
{
public static function autocompleteGrupoExame()
{
$parametrizacao = Parametrizacao::first();
return DB::table('cadastro_grupo as grupo')
->whereNull('grupo.deleted_at')
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('parametrizacao_exame as exame')
->whereColumn('exame.grupo_tipo_id', 'grupo.id')
->whereNull('exame.deleted_at')
->where('exame.ativo', true)
->where(function ($q) use ($parametrizacao) {
if (!$parametrizacao->exames_nao_regulados) {
$q->whereNotNull('exame.regulacao_tipo_id');
}
})
)
->selectRaw("
grupo.id,
grupo.nome
");
}
public static function autocompleteExame()
{
$parametrizacao = Parametrizacao::first();
return DB::query()
->fromSub(DB::table('cadastro_grupo as grupo')
->whereNull('grupo.deleted_at')
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('parametrizacao_exame as exame')
->whereColumn('exame.grupo_tipo_id', 'grupo.id')
->whereNull('exame.deleted_at')
->where('exame.ativo', true)
->where(function ($q) use ($parametrizacao) {
if (!$parametrizacao->exames_nao_regulados) {
$q->whereNotNull('exame.regulacao_tipo_id');
}
})
)
->selectRaw("
'grupo' as origem,
grupo.id,
NULL as codigo,
grupo.nome,
NULL as grupo_id,
NULL as grupo_nome,
NULL as observacoes
")
->unionAll(DB::table('parametrizacao_exame as exame')
->join('cadastro_grupo as grupo', 'grupo.id', 'exame.grupo_tipo_id')
->whereNull('exame.deleted_at')
->where('exame.ativo', true)
->where(function ($q) use ($parametrizacao) {
if (!$parametrizacao->exames_nao_regulados) {
$q->whereNotNull('exame.regulacao_tipo_id');
}
})
->when(is_array(request()->not_id), fn ($q) => $q->whereNotIn('exame.id', request()->not_id))
->selectRaw("
'exame' as origem,
exame.id,
exame.codigo,
exame.nome,
grupo.id as grupo_id,
grupo.nome as grupo_nome,
exame.observacao as observacoes
")
)
, 'item')
->selectRaw("
item.origem,
item.id,
item.codigo,
item.nome,
item.grupo_id,
item.grupo_nome,
item.observacoes
");
}
public static function autocompleteProcedimentoCirurgico()
{
if (DataUtil::isStringTrue(request()->get('only_procedimentos_cirurgicos', 'false'))) {
return DB::table('parametrizacao_procedimento_cirurgico as procedimento_cirurgico')
->join('cadastro_grupo as grupo', 'grupo.id', 'procedimento_cirurgico.grupo_exame_id')
->where('procedimento_cirurgico.status', true)
->whereNotNull('procedimento_cirurgico.regulacao_tipo_id')
->when(is_array(request()->not_id), fn ($q) => $q->whereNotIn('procedimento_cirurgico.id', request()->not_id))
->selectRaw("
procedimento_cirurgico.id,
procedimento_cirurgico.procedimento_codigo as codigo,
procedimento_cirurgico.nome,
grupo.id as grupo_id,
grupo.nome as grupo_nome,
procedimento_cirurgico.observacao as observacoes
");
}
return DB::query()
->fromSub(DB::table('cadastro_grupo as grupo')
->whereNull('grupo.deleted_at')
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('parametrizacao_procedimento_cirurgico as procedimento_cirurgico')
->whereColumn('procedimento_cirurgico.grupo_exame_id', 'grupo.id')
->where('procedimento_cirurgico.status', true)
->whereNotNull('procedimento_cirurgico.regulacao_tipo_id')
)
->selectRaw("
'grupo' as origem,
grupo.id,
NULL as codigo,
grupo.nome,
NULL as grupo_id,
NULL as grupo_nome,
NULL as observacoes
")
->unionAll(DB::table('parametrizacao_procedimento_cirurgico as procedimento_cirurgico')
->join('cadastro_grupo as grupo', 'grupo.id', 'procedimento_cirurgico.grupo_exame_id')
->where('procedimento_cirurgico.status', true)
->whereNotNull('procedimento_cirurgico.regulacao_tipo_id')
->when(is_array(request()->not_id), fn ($q) => $q->whereNotIn('procedimento_cirurgico.id', request()->not_id))
->selectRaw("
'procedimento' as origem,
procedimento_cirurgico.id,
procedimento_cirurgico.procedimento_codigo as codigo,
procedimento_cirurgico.nome,
grupo.id as grupo_id,
grupo.nome as grupo_nome,
procedimento_cirurgico.observacao as observacoes
")
)
, 'item')
->selectRaw("
item.origem,
item.id,
item.codigo,
item.nome,
item.grupo_id,
item.grupo_nome,
item.observacoes
");
}
public static function autocompleteEspecialidade()
{
return DB::table('cadastro_especialidade as especialidade')
->join('sigtap.ocupacao as ocupacao', 'ocupacao.id', 'especialidade.ocupacao_id')
->where('especialidade.ativo', true)
->whereNotNull('especialidade.regulacao_tipo_id')
->when(is_array(request()->not_id), fn ($q) => $q->whereNotIn('especialidade.id', request()->not_id))
->selectRaw("
especialidade.id,
ocupacao.codigo,
UPPER(especialidade.nome) as nome,
especialidade.mensagem_protocolo_agendamento as observacoes
");
}
public static function list()
{
$params = request()->all();
switch (request()->listar) {
case 'infraestruturas': {
return self::getInfraestruturas($params);
}
case 'exames': {
return self::getExames($params);
}
case 'procedimentos-cirurgicos': {
return self::getProcedimentosCirurgicos($params);
}
}
}
private static function getInfraestruturas($params)
{
return DB::table('cadastro_infraestrutura as infraestrutura')
->join('cadastro_unidade as unidade', 'unidade.id', 'infraestrutura.unidade_id')
->whereNull('infraestrutura.deleted_at')
->where('infraestrutura.unidade_id', $params['unidade_id'])
->selectRaw("
infraestrutura.id,
COALESCE(infraestrutura.nome, unidade.nome_fantasia) as nome
")
->orderByRaw("COALESCE(infraestrutura.nome, unidade.nome_fantasia)")
->get();
}
private static function getExames($params)
{
$parametrizacao = Parametrizacao::first();
return DB::table('parametrizacao_exame as exame')
->join('cadastro_grupo as grupo', 'grupo.id', 'exame.grupo_tipo_id')
->where('exame.grupo_tipo_id', $params['grupo_id'])
->whereNull('exame.deleted_at')
->where('exame.ativo', true)
->where(function($q) use ($parametrizacao) {
if (!$parametrizacao->exames_nao_regulados) {
$q->whereNotNull('exame.regulacao_tipo_id');
}
})
->selectRaw("
exame.id,
exame.codigo,
exame.nome,
grupo.id as grupo_id,
grupo.nome as grupo_nome,
exame.observacao as observacoes
")
->get();
}
private static function getProcedimentosCirurgicos($params)
{
return DB::table('parametrizacao_procedimento_cirurgico as procedimento_cirurgico')
->join('cadastro_grupo as grupo', 'grupo.id', 'procedimento_cirurgico.grupo_exame_id')
->where('procedimento_cirurgico.grupo_exame_id', $params['grupo_id'])
->where('procedimento_cirurgico.status', true)
->whereNotNull('procedimento_cirurgico.regulacao_tipo_id')
->when(is_array(request()->not_id), fn ($q) => $q->whereNotIn('procedimento_cirurgico.id', request()->not_id))
->selectRaw("
'procedimento' as origem,
procedimento_cirurgico.id,
procedimento_cirurgico.procedimento_codigo as codigo,
procedimento_cirurgico.nome,
grupo.id as grupo_id,
grupo.nome as grupo_nome,
procedimento_cirurgico.observacao as observacoes
")
->get();
}
public static function create()
{
return [
'form' => self::getFormData(),
'model' => self::getModelData(),
];
}
private static function getFormData()
{
$unidades = self::getUnidades();
$unidadesReguladas = self::getUnidadesReguladas();
return [
'opcoes_retirada_protocolo_agendamento' => self::getOpcoesRetiradaProtocoloAgendamento(),
'regulador' => [
'unidades' => $unidades,
'infraestruturas' => [],
'tipos' => self::getReguladorTipos(),
],
'divulgacao' => [
'unidades' => $unidadesReguladas,
'infraestruturas' => [],
],
'solicitante' => [
'unidades' => $unidades,
'infraestruturas' => [],
],
'prestador_interno' => [
'unidades' => self::getUnidadesPrestadoras(),
],
'prestador_externo' => [
'destinos' => self::getDestinosPrestadores(),
],
'estados' => Estado::orderBy('nome')->get(['id', 'nome', 'uf'])->map(fn ($estado) => [
'id' => $estado->id,
'descricao' => "{$estado->nome} - {$estado->uf}"
]),
'data_desejada' => [
'unidades' => $unidades,
'infraestruturas' => [],
],
'portal_transparencia' => [
'modos_tempo_medio' => ParametrizacaoDivulgacaoModoTempoMedio::orderBy('nome')
->get(['id', 'nome'])
]
];
}
private static function getUnidades()
{
return DB::table('cadastro_unidade')
->whereNull('deleted_at')
->select('id', 'nome_fantasia')
->orderBy('nome_fantasia')
->get();
}
private static function getUnidadesReguladas()
{
return DB::table('cadastro_unidade as unidade')
->join('cadastro_infraestrutura as infraestrutura', 'infraestrutura.unidade_id', 'unidade.id')
->join('regulacao_parametrizacao_regulador as regulador', 'regulador.infraestrutura_id', 'infraestrutura.id')
->whereNull('unidade.deleted_at')
->select('unidade.id as unidade_id', 'unidade.nome_fantasia as nome_fantasia')
->orderBy('nome_fantasia')
->get();
}
private static function getOpcoesRetiradaProtocoloAgendamento()
{
return DB::table('regulacao_parametrizacao_opcao_retirada_protocolo_agendamento')
->orderBy('nome')
->select('id', 'nome')
->get();
}
private static function getReguladorTipos()
{
return DB::table('regulacao_parametrizacao_regulador_tipo')
->orderBy('nome')
->select('id', 'nome')
->get();
}
private static function getUnidadesPrestadoras()
{
$unidades = collect();
$selectFields = "
unidade.id as unidade_id,
unidade.nome_fantasia as unidade_nome_fantasia,
infraestrutura.id as infraestrutura_id,
COALESCE(infraestrutura.nome, unidade.nome_fantasia) as infraestrutura_nome
";
DB::table('ambulatorio_parametrizacao_infraestrutura as parametrizacao')
->join('cadastro_infraestrutura as infraestrutura', 'infraestrutura.id', 'parametrizacao.infraestrutura_id')
->join('cadastro_unidade as unidade', 'unidade.id', 'infraestrutura.unidade_id')
->selectRaw($selectFields)
->union(DB::table('exame_laboratorial_parametrizacao_unidade as parametrizacao')
->join('cadastro_infraestrutura as infraestrutura', 'infraestrutura.id', 'parametrizacao.infraestrutura_id')
->join('cadastro_unidade as unidade', 'unidade.id', 'infraestrutura.unidade_id')
->where('parametrizacao.laboratorio', true)
->selectRaw($selectFields)
)
->union(DB::table('exame_imagem_parametrizacao_unidade as parametrizacao')
->join('cadastro_infraestrutura as infraestrutura', 'infraestrutura.id', 'parametrizacao.infraestrutura_id')
->join('cadastro_unidade as unidade', 'unidade.id', 'infraestrutura.unidade_id')
->where('parametrizacao.prestador', true)
->selectRaw($selectFields)
)
->get()
->each(function ($parametrizacao) use ($unidades) {
$unidade = $unidades->where('id', $parametrizacao->unidade_id)->first();
if (is_null($unidade)) {
$unidade = (object) [
'id' => $parametrizacao->unidade_id,
'nome_fantasia' => $parametrizacao->unidade_nome_fantasia,
'infraestruturas' => collect(),
];
$unidades->push($unidade);
}
$unidade->infraestruturas->push((object) [
'id' => $parametrizacao->infraestrutura_id,
'nome' => $parametrizacao->infraestrutura_nome,
]);
});
$unidades->each(fn ($u) => $u->infraestruturas = $u->infraestruturas->sortBy('nome')->values());
return $unidades->sortBy('nome_fantasia')->values();
}
private static function getDestinosPrestadores()
{
return DB::table('transporte_paciente_destino as destino')
->where('destino.tipo_prestador', true)
->selectRaw("
destino.id,
destino.descricao_destino as nome
")
->orderBy('destino.descricao_destino')
->get();
}
private static function getModelData()
{
$parametrizacao = Parametrizacao::first();
return [
'numero_solicitacao_automatico' => $parametrizacao->numero_solicitacao_automatico ?? false,
'solicitacao_automatica_ambulatorio' => $parametrizacao->solicitacao_automatica_ambulatorio ?? false,
'permite_agendar_fora_ordem_posicao' => $parametrizacao->permite_agendar_fora_ordem_posicao ?? false,
'solicitacao_retroativa' => $parametrizacao->solicitacao_retroativa ?? false,
'exames_nao_regulados' => $parametrizacao->exames_nao_regulados ?? false,
'sempre_alterar_unidade_solicitante' => $parametrizacao->sempre_alterar_unidade_solicitante ?? false,
'encerra_solicitacao_automaticamente_ao_encerrar_protocolo_oci' =>
$parametrizacao->encerra_solicitacao_automaticamente_ao_encerrar_protocolo_oci ?? false,
'exibe_assinatura_relatorio_solicitacao' => $parametrizacao->exibe_assinatura_relatorio_solicitacao ?? false,
'opcao_retirada_protocolo_agendamento_id' => $parametrizacao->opcao_retirada_protocolo_agendamento_id
?? OpcaoRetiradaProtocoloAgendamento::NAO_INFORMADO,
'mensagem_protocolo_solicitacao' => $parametrizacao->mensagem_protocolo_solicitacao ?? null,
'mensagem_comprovante_agendamento' => $parametrizacao->mensagem_comprovante_agendamento ?? null,
'supervisores' => DB::table('regulacao_parametrizacao_supervisor as supervisor')
->join('cadastro_usuario as usuario', 'usuario.id', 'supervisor.usuario_id')
->join('cadastro_cidadao as cidadao', 'cidadao.id', 'usuario.cidadao_id')
->selectRaw("
supervisor.id,
usuario.id as usuario_id,
cidadao.nome as usuario_nome
")
->get()
->map(fn ($supervisor) => [
'id' => $supervisor->id,
'usuario' => [
'id' => $supervisor->usuario_id,
'cidadao_nome' => $supervisor->usuario_nome,
],
]),
'reguladores' => DB::table('regulacao_parametrizacao_regulador as regulador')
->join('cadastro_infraestrutura as infraestrutura', 'infraestrutura.id', 'regulador.infraestrutura_id')
->join('cadastro_unidade as unidade', 'unidade.id', 'infraestrutura.unidade_id')
->join('regulacao_parametrizacao_regulador_tipo as tipo', 'tipo.id', 'regulador.tipo_id')
->selectRaw("
regulador.id,
regulador.ativo,
unidade.id as unidade_id,
unidade.nome_fantasia as unidade_nome_fantasia,
infraestrutura.id as infraestrutura_id,
COALESCE(infraestrutura.nome, unidade.nome_fantasia) as infraestrutura_nome,
tipo.id as tipo_id,
tipo.nome as tipo_nome,
regulador.solicitante_controla_protocolo_fechamento
")
->get()
->map(fn ($regulador) => [
'id' => $regulador->id,
'ativo' => (bool) $regulador->ativo,
'unidade_id' => $regulador->unidade_id,
'unidade_nome_fantasia' => $regulador->unidade_nome_fantasia,
'infraestrutura_id' => $regulador->infraestrutura_id,
'infraestrutura_nome' => $regulador->infraestrutura_nome,
'tipo_id' => $regulador->tipo_id,
'tipo_nome' => $regulador->tipo_nome,
'solicitante_controla_protocolo_fechamento' => (bool) $regulador->solicitante_controla_protocolo_fechamento,
'exames' => DB::table('regulacao_parametrizacao_regulador_exame as regulador_exame')
->join('parametrizacao_exame as exame', 'exame.id', 'regulador_exame.exame_id')
->join('cadastro_grupo as grupo', 'grupo.id', 'exame.grupo_tipo_id')
->where('regulador_exame.regulador_id', $regulador->id)
->selectRaw("
exame.id,
exame.codigo,
exame.nome,
grupo.id as grupo_id,
grupo.nome as grupo_nome,
regulador_exame.ativo,
regulador_exame.exige_documento_anexo
")
->get()
->map(fn ($exame) => [
'id' => $exame->id,
'codigo' => $exame->codigo,
'nome' => $exame->nome,
'grupo_id' => $exame->grupo_id,
'grupo_nome' => $exame->grupo_nome,
'ativo' => (bool) $exame->ativo,
'exige_documento_anexo' => (bool) $exame->exige_documento_anexo,
]),
'procedimentos_cirurgicos' => DB::table('regulacao_parametrizacao_regulador_procedimento_cirurgico as regulador_procedimento_cirurgico')
->join(
'parametrizacao_procedimento_cirurgico as procedimento_cirurgico',
'procedimento_cirurgico.id',
'regulador_procedimento_cirurgico.procedimento_cirurgico_id'
)
->join('cadastro_grupo as grupo', 'grupo.id', 'procedimento_cirurgico.grupo_exame_id')
->where('regulador_procedimento_cirurgico.regulador_id', $regulador->id)
->selectRaw("
procedimento_cirurgico.id,
procedimento_cirurgico.procedimento_codigo as codigo,
procedimento_cirurgico.nome,
grupo.id as grupo_id,
grupo.nome as grupo_nome,
regulador_procedimento_cirurgico.ativo,
regulador_procedimento_cirurgico.exige_documento_anexo
")
->get()
->map(fn ($procedimentoCirurgico) => [
'id' => $procedimentoCirurgico->id,
'codigo' => $procedimentoCirurgico->codigo,
'nome' => $procedimentoCirurgico->nome,
'grupo_id' => $procedimentoCirurgico->grupo_id,
'grupo_nome' => $procedimentoCirurgico->grupo_nome,
'ativo' => (bool) $procedimentoCirurgico->ativo,
'exige_documento_anexo' => (bool) $procedimentoCirurgico->exige_documento_anexo,
]),
'especialidades' => DB::table('regulacao_parametrizacao_regulador_especialidade as regulador_especialidade')
->join(
'cadastro_especialidade as especialidade',
'especialidade.id',
'regulador_especialidade.especialidade_id'
)
->join('sigtap.ocupacao as ocupacao', 'ocupacao.id', 'especialidade.ocupacao_id')
->where('regulador_especialidade.regulador_id', $regulador->id)
->selectRaw("
especialidade.id,
ocupacao.codigo,
especialidade.nome,
regulador_especialidade.ativo,
regulador_especialidade.exige_documento_anexo
")
->get()
->map(fn ($especialidade) => [
'id' => $especialidade->id,
'codigo' => $especialidade->codigo,
'nome' => $especialidade->nome,
'ativo' => (bool) $especialidade->ativo,
'exige_documento_anexo' => (bool) $especialidade->exige_documento_anexo,
]),
]),
'divulgacao' => DB::table('regulacao_parametrizacao_divulgacao_regulador as regulador')
->join('regulacao_parametrizacao_regulador as regulacao_regulador', 'regulacao_regulador.id', 'regulador.regulacao_parametrizacao_regulador_id')
->join('cadastro_infraestrutura as infraestrutura', 'infraestrutura.id', 'regulacao_regulador.infraestrutura_id')
->join('cadastro_unidade as unidade', 'unidade.id', 'infraestrutura.unidade_id')
->selectRaw("
regulador.id,
regulador.ativo,
unidade.id as unidade_id,
unidade.nome_fantasia as unidade_nome_fantasia,
infraestrutura.id as infraestrutura_id,
COALESCE(infraestrutura.nome, unidade.nome_fantasia) as infraestrutura_nome
")
->get()
->map(fn ($regulador) => [
'id' => $regulador->id,
'ativo' => (bool) $regulador->ativo,
'unidade_id' => $regulador->unidade_id,
'unidade_nome_fantasia' => $regulador->unidade_nome_fantasia,
'infraestrutura_id' => $regulador->infraestrutura_id,
'infraestrutura_nome' => $regulador->infraestrutura_nome,
'exames' => DB::table('regulacao_parametrizacao_divulgacao_regulador_exame as regulador_exame')
->join('parametrizacao_exame as exame', 'exame.id', 'regulador_exame.exame_id')
->join('cadastro_grupo as grupo', 'grupo.id', 'exame.grupo_tipo_id')
->where('regulador_exame.regulador_id', $regulador->id)
->selectRaw("
exame.id,
exame.codigo,
exame.nome,
grupo.id as grupo_id,
grupo.nome as grupo_nome,
regulador_exame.ativo
")
->get()
->map(fn ($exame) => [
'id' => $exame->id,
'codigo' => $exame->codigo,
'nome' => $exame->nome,
'grupo_id' => $exame->grupo_id,
'grupo_nome' => $exame->grupo_nome,
'ativo' => (bool) $exame->ativo,
]),
'procedimentos_cirurgicos' => DB::table('regulacao_parametrizacao_divulgacao_regulador_cirurgico as regulador_procedimento_cirurgico')
->join(
'parametrizacao_procedimento_cirurgico as procedimento_cirurgico',
'procedimento_cirurgico.id',
'regulador_procedimento_cirurgico.procedimento_cirurgico_id'
)
->join('cadastro_grupo as grupo', 'grupo.id', 'procedimento_cirurgico.grupo_exame_id')
->where('regulador_procedimento_cirurgico.regulador_id', $regulador->id)
->selectRaw("
procedimento_cirurgico.id,
procedimento_cirurgico.procedimento_codigo as codigo,
procedimento_cirurgico.nome,
grupo.id as grupo_id,
grupo.nome as grupo_nome,
regulador_procedimento_cirurgico.ativo
")
->get()
->map(fn ($procedimentoCirurgico) => [
'id' => $procedimentoCirurgico->id,
'codigo' => $procedimentoCirurgico->codigo,
'nome' => $procedimentoCirurgico->nome,
'grupo_id' => $procedimentoCirurgico->grupo_id,
'grupo_nome' => $procedimentoCirurgico->grupo_nome,
'ativo' => (bool) $procedimentoCirurgico->ativo,
]),
'especialidades' => DB::table('regulacao_parametrizacao_divulgacao_regulador_especialidade as regulador_especialidade')
->join(
'cadastro_especialidade as especialidade',
'especialidade.id',
'regulador_especialidade.especialidade_id'
)
->join('sigtap.ocupacao as ocupacao', 'ocupacao.id', 'especialidade.ocupacao_id')
->where('regulador_especialidade.regulador_id', $regulador->id)
->selectRaw("
especialidade.id,
ocupacao.codigo,
especialidade.nome,
regulador_especialidade.ativo
")
->get()
->map(fn ($especialidade) => [
'id' => $especialidade->id,
'codigo' => $especialidade->codigo,
'nome' => $especialidade->nome,
'ativo' => (bool) $especialidade->ativo,
]),
]),
'solicitantes' => DB::table('regulacao_parametrizacao_solicitante as solicitante')
->join('cadastro_infraestrutura as infraestrutura', 'infraestrutura.id', 'solicitante.infraestrutura_id')
->join('cadastro_unidade as unidade', 'unidade.id', 'infraestrutura.unidade_id')
->selectRaw("
solicitante.id,
unidade.id as unidade_id,
unidade.nome_fantasia as unidade_nome_fantasia,
infraestrutura.id as infraestrutura_id,
COALESCE(infraestrutura.nome, unidade.nome_fantasia) as infraestrutura_nome,
solicitante.is_ppi,
solicitante.atende_outro_municipio
")
->get()
->map(fn ($solicitante) => [
'id' => $solicitante->id,
'unidade_id' => $solicitante->unidade_id,
'unidade_nome_fantasia' => $solicitante->unidade_nome_fantasia,
'infraestrutura_id' => $solicitante->infraestrutura_id,
'infraestrutura_nome' => $solicitante->infraestrutura_nome,
'is_ppi' => (bool) $solicitante->is_ppi,
'atende_outro_municipio' => (bool) $solicitante->atende_outro_municipio,
'reguladores' => DB::table('regulacao_parametrizacao_solicitante_regulador as solicitante_regulador')
->join('regulacao_parametrizacao_regulador as regulador', 'regulador.id', 'solicitante_regulador.regulador_id')
->join('cadastro_infraestrutura as infraestrutura', 'infraestrutura.id', 'regulador.infraestrutura_id')
->join('cadastro_unidade as unidade', 'unidade.id', 'infraestrutura.unidade_id')
->where('solicitante_regulador.solicitante_id', $solicitante->id)
->selectRaw("
solicitante_regulador.id as solicitante_regulador_id,
regulador.id,
unidade.nome_fantasia as unidade_nome_fantasia,
infraestrutura.id as infraestrutura_id,
COALESCE(infraestrutura.nome, unidade.nome_fantasia) as infraestrutura_nome
")
->get()
->map(fn ($regulador) => [
'id' => $regulador->id,
'unidade_nome_fantasia' => $regulador->unidade_nome_fantasia,
'infraestrutura_id' => $regulador->infraestrutura_id,
'infraestrutura_nome' => $regulador->infraestrutura_nome,
'exames' => DB::table('regulacao_parametrizacao_solicitante_regulador_exame as solicitante_regulador_exame')
->join('parametrizacao_exame as exame', 'exame.id', 'solicitante_regulador_exame.exame_id')
->join('cadastro_grupo as grupo', 'grupo.id', 'exame.grupo_tipo_id')
->where('solicitante_regulador_exame.solicitante_regulador_id', $regulador->solicitante_regulador_id)
->selectRaw("
exame.id,
exame.codigo,
exame.nome,
grupo.id as grupo_id,
grupo.nome as grupo_nome
")
->get()
->map(fn ($exame) => [
'id' => $exame->id,
'codigo' => $exame->codigo,
'nome' => $exame->nome,
'grupo_id' => $exame->grupo_id,
'grupo_nome' => $exame->grupo_nome,
]),
'procedimentos_cirurgicos' => DB::table('regulacao_parametrizacao_solicitante_regulador_proced_cirurgico as solicitante_regulador_proced_cirurgico')
->join(
'parametrizacao_procedimento_cirurgico as procedimento_cirurgico',
'procedimento_cirurgico.id',
'solicitante_regulador_proced_cirurgico.procedimento_cirurgico_id'
)
->join('cadastro_grupo as grupo', 'grupo.id', 'procedimento_cirurgico.grupo_exame_id')
->where('solicitante_regulador_proced_cirurgico.solicitante_regulador_id', $regulador->solicitante_regulador_id)
->selectRaw("
procedimento_cirurgico.id,
procedimento_cirurgico.procedimento_codigo as codigo,
procedimento_cirurgico.nome,
grupo.id as grupo_id,
grupo.nome as grupo_nome
")
->get()
->map(fn ($procedimentoCirurgico) => [
'id' => $procedimentoCirurgico->id,
'codigo' => $procedimentoCirurgico->codigo,
'nome' => $procedimentoCirurgico->nome,
'grupo_id' => $procedimentoCirurgico->grupo_id,
'grupo_nome' => $procedimentoCirurgico->grupo_nome,
]),
'especialidades' => DB::table('regulacao_parametrizacao_solicitante_regulador_especialidade as solicitante_regulador_especialidade')
->join(
'cadastro_especialidade as especialidade',
'especialidade.id',
'solicitante_regulador_especialidade.especialidade_id'
)
->join('sigtap.ocupacao as ocupacao', 'ocupacao.id', 'especialidade.ocupacao_id')
->where('solicitante_regulador_especialidade.solicitante_regulador_id', $regulador->solicitante_regulador_id)
->selectRaw("
especialidade.id,
ocupacao.codigo,
especialidade.nome
")
->get()
->map(fn ($especialidade) => [
'id' => $especialidade->id,
'codigo' => $especialidade->codigo,
'nome' => $especialidade->nome,
]),
'has_solicitacao' => DB::table('regulacao_solicitacao as solicitacao')
->where('infraestrutura_solicitante_id', $solicitante->infraestrutura_id)
->where('regulador_id', $regulador->id)
->exists(),
]),
]),
'prestadores_internos' => DB::table('regulacao_parametrizacao_prestador_interno as prestador_interno')
->join('cadastro_infraestrutura as infraestrutura', 'infraestrutura.id', 'prestador_interno.infraestrutura_id')
->join('cadastro_unidade as unidade', 'unidade.id', 'infraestrutura.unidade_id')
->selectRaw("
prestador_interno.id,
prestador_interno.controla_protocolo_fechamento,
prestador_interno.ativo,
unidade.id as unidade_id,
unidade.nome_fantasia as unidade_nome_fantasia,
infraestrutura.id as infraestrutura_id,
COALESCE(infraestrutura.nome, unidade.nome_fantasia) as infraestrutura_nome
")
->get()
->map(fn ($prestadorInterno) => [
'id' => $prestadorInterno->id,
'controla_protocolo_fechamento' => (bool) $prestadorInterno->controla_protocolo_fechamento,
'ativo' => (bool) $prestadorInterno->ativo,
'unidade_id' => $prestadorInterno->unidade_id,
'unidade_nome_fantasia' => $prestadorInterno->unidade_nome_fantasia,
'infraestrutura_id' => $prestadorInterno->infraestrutura_id,
'infraestrutura_nome' => $prestadorInterno->infraestrutura_nome,
'exames' => DB::table('regulacao_parametrizacao_prestador_interno_exame as prestador_interno_exame')
->join('parametrizacao_exame as exame', 'exame.id', 'prestador_interno_exame.exame_id')
->join('cadastro_grupo as grupo', 'grupo.id', 'exame.grupo_tipo_id')
->where('prestador_interno_exame.prestador_interno_id', $prestadorInterno->id)
->selectRaw("
exame.id,
exame.codigo,
exame.nome,
grupo.id as grupo_id,
grupo.nome as grupo_nome,
prestador_interno_exame.ativo,
prestador_interno_exame.observacoes
")
->get()
->map(fn ($exame) => [
'id' => $exame->id,
'codigo' => $exame->codigo,
'nome' => $exame->nome,
'grupo_id' => $exame->grupo_id,
'grupo_nome' => $exame->grupo_nome,
'ativo' => (bool) $exame->ativo,
'observacoes' => $exame->observacoes
]),
'procedimentos_cirurgicos' => DB::table('regulacao_parametrizacao_prestador_interno_proced_cirurgico as prestador_interno_proced_cirurgico')
->join(
'parametrizacao_procedimento_cirurgico as procedimento_cirurgico',
'procedimento_cirurgico.id',
'prestador_interno_proced_cirurgico.procedimento_cirurgico_id'
)
->join('cadastro_grupo as grupo', 'grupo.id', 'procedimento_cirurgico.grupo_exame_id')
->where('prestador_interno_proced_cirurgico.prestador_interno_id', $prestadorInterno->id)
->selectRaw("
procedimento_cirurgico.id,
procedimento_cirurgico.procedimento_codigo as codigo,
procedimento_cirurgico.nome,
grupo.id as grupo_id,
grupo.nome as grupo_nome,
prestador_interno_proced_cirurgico.ativo,
prestador_interno_proced_cirurgico.observacoes
")
->get()
->map(fn ($procedimentoCirurgico) => [
'id' => $procedimentoCirurgico->id,
'codigo' => $procedimentoCirurgico->codigo,
'nome' => $procedimentoCirurgico->nome,
'grupo_id' => $procedimentoCirurgico->grupo_id,
'grupo_nome' => $procedimentoCirurgico->grupo_nome,
'ativo' => (bool) $procedimentoCirurgico->ativo,
'observacoes' => $procedimentoCirurgico->observacoes
]),
'especialidades' => DB::table('regulacao_parametrizacao_prestador_interno_especialidade as prestador_interno_especialidade')
->join(
'cadastro_especialidade as especialidade',
'especialidade.id',
'prestador_interno_especialidade.especialidade_id'
)
->join('sigtap.ocupacao as ocupacao', 'ocupacao.id', 'especialidade.ocupacao_id')
->where('prestador_interno_especialidade.prestador_interno_id', $prestadorInterno->id)
->selectRaw("
especialidade.id,
ocupacao.codigo,
especialidade.nome,
prestador_interno_especialidade.ativo,
prestador_interno_especialidade.observacoes
")
->get()
->map(fn ($especialidade) => [
'id' => $especialidade->id,
'codigo' => $especialidade->codigo,
'nome' => $especialidade->nome,
'ativo' => (bool) $especialidade->ativo,
'observacoes' => $especialidade->observacoes
]),
]),
'prestadores_externos' => DB::table('regulacao_parametrizacao_prestador_externo as prestador_externo')
->join('transporte_paciente_destino as destino', 'destino.id', 'prestador_externo.destino_id')
->whereNull('deleted_at')
->selectRaw("
prestador_externo.id,
prestador_externo.ativo,
destino.id as destino_id,
destino.descricao_destino as destino_nome
")
->get()
->map(fn ($prestadorExterno) => [
'id' => $prestadorExterno->id,
'ativo' => (bool) $prestadorExterno->ativo,
'destino_id' => $prestadorExterno->destino_id,
'destino_nome' => $prestadorExterno->destino_nome,
'exames' => DB::table('regulacao_parametrizacao_prestador_externo_exame as prestador_externo_exame')
->join('parametrizacao_exame as exame', 'exame.id', 'prestador_externo_exame.exame_id')
->join('cadastro_grupo as grupo', 'grupo.id', 'exame.grupo_tipo_id')
->where('prestador_externo_exame.prestador_externo_id', $prestadorExterno->id)
->selectRaw("
exame.id,
exame.codigo,
exame.nome,
grupo.id as grupo_id,
grupo.nome as grupo_nome,
prestador_externo_exame.ativo,
prestador_externo_exame.observacoes
")
->get()
->map(fn ($exame) => [
'id' => $exame->id,
'codigo' => $exame->codigo,
'nome' => $exame->nome,
'grupo_id' => $exame->grupo_id,
'grupo_nome' => $exame->grupo_nome,
'ativo' => (bool) $exame->ativo,
'observacoes' => $exame->observacoes
]),
'procedimentos_cirurgicos' => DB::table('regulacao_parametrizacao_prestador_externo_proced_cirurgico as prestador_externo_proced_cirurgico')
->join(
'parametrizacao_procedimento_cirurgico as procedimento_cirurgico',
'procedimento_cirurgico.id',
'prestador_externo_proced_cirurgico.procedimento_cirurgico_id'
)
->join('cadastro_grupo as grupo', 'grupo.id', 'procedimento_cirurgico.grupo_exame_id')
->where('prestador_externo_proced_cirurgico.prestador_externo_id', $prestadorExterno->id)
->selectRaw("
procedimento_cirurgico.id,
procedimento_cirurgico.procedimento_codigo as codigo,
procedimento_cirurgico.nome,
grupo.id as grupo_id,
grupo.nome as grupo_nome,
prestador_externo_proced_cirurgico.ativo,
prestador_externo_proced_cirurgico.observacoes
")
->get()
->map(fn ($procedimentoCirurgico) => [
'id' => $procedimentoCirurgico->id,
'codigo' => $procedimentoCirurgico->codigo,
'nome' => $procedimentoCirurgico->nome,
'grupo_id' => $procedimentoCirurgico->grupo_id,
'grupo_nome' => $procedimentoCirurgico->grupo_nome,
'ativo' => (bool) $procedimentoCirurgico->ativo,
'observacoes' => $procedimentoCirurgico->observacoes
]),
'especialidades' => DB::table('regulacao_parametrizacao_prestador_externo_especialidade as prestador_externo_especialidade')
->join(
'cadastro_especialidade as especialidade',
'especialidade.id',
'prestador_externo_especialidade.especialidade_id'
)
->join('sigtap.ocupacao as ocupacao', 'ocupacao.id', 'especialidade.ocupacao_id')
->where('prestador_externo_especialidade.prestador_externo_id', $prestadorExterno->id)
->selectRaw("
especialidade.id,
ocupacao.codigo,
especialidade.nome,
prestador_externo_especialidade.ativo,
prestador_externo_especialidade.observacoes
")
->get()
->map(fn ($especialidade) => [
'id' => $especialidade->id,
'codigo' => $especialidade->codigo,
'nome' => $especialidade->nome,
'ativo' => (bool) $especialidade->ativo,
'observacoes' => $especialidade->observacoes
]),
]),
'exibe_protocolo_cross' => $parametrizacao->exibe_protocolo_cross ?? false,
'obriga_protocolo_cross' => $parametrizacao->obriga_protocolo_cross ?? false,
'usuario_registro_estado_id' => $parametrizacao->usuario_registro_estado_id ?? null,
'obriga_data_desejada' => $parametrizacao->obriga_data_desejada ?? false,
'data_desejada_grupos_exames' => is_null($parametrizacao)
? []
: DB::table('regulacao_parametrizacao_data_desejada_grupo_exame as data_desejada_grupo_exame')
->join('cadastro_grupo as grupo', 'grupo.id', 'data_desejada_grupo_exame.grupo_id')
->where('data_desejada_grupo_exame.parametrizacao_id', $parametrizacao->id)
->selectRaw("
grupo.id,
grupo.nome
")
->get()
->map(fn ($grupo) => [
'id' => $grupo->id,
'nome' => $grupo->nome,
]),
'data_desejada_procedimentos_cirurgicos' => is_null($parametrizacao)
? []
: DB::table('regulacao_parametrizacao_data_desejada_procedimento_cirurgico as data_desejada_procedimento_cirurgico')
->join(
'parametrizacao_procedimento_cirurgico as procedimento_cirurgico',
'procedimento_cirurgico.id',
'data_desejada_procedimento_cirurgico.procedimento_cirurgico_id'
)
->where('data_desejada_procedimento_cirurgico.parametrizacao_id', $parametrizacao->id)
->selectRaw("
procedimento_cirurgico.id,
procedimento_cirurgico.procedimento_codigo as codigo,
procedimento_cirurgico.nome
")
->get()
->map(fn ($procedimentoCirurgico) => [
'id' => $procedimentoCirurgico->id,
'codigo' => $procedimentoCirurgico->codigo,
'nome' => $procedimentoCirurgico->nome,
]),
'data_desejada_especialidades' => is_null($parametrizacao)
? []
: DB::table('regulacao_parametrizacao_data_desejada_especialidade as data_desejada_especialidade')
->join('cadastro_especialidade as especialidade', 'especialidade.id', 'data_desejada_especialidade.especialidade_id')
->join('sigtap.ocupacao', 'ocupacao.id', 'especialidade.ocupacao_id')
->where('data_desejada_especialidade.parametrizacao_id', $parametrizacao->id)
->selectRaw("
especialidade.id,
ocupacao.codigo,
especialidade.nome
")
->get()
->map(fn ($especialidade) => [
'id' => $especialidade->id,
'codigo' => $especialidade->codigo,
'nome' => $especialidade->nome,
]),
'data_desejada_infraestruturas' => is_null($parametrizacao)
? []
: DB::table('regulacao_parametrizacao_data_desejada_infraestrutura as data_desejada_infraestrutura')
->join('cadastro_infraestrutura as infraestrutura', 'infraestrutura.id', 'data_desejada_infraestrutura.infraestrutura_id')
->join('cadastro_unidade as unidade', 'unidade.id', 'infraestrutura.unidade_id')
->where('data_desejada_infraestrutura.parametrizacao_id', $parametrizacao->id)
->selectRaw("
infraestrutura.id,
COALESCE(infraestrutura.nome, unidade.nome_fantasia) as nome,
unidade.nome_fantasia as unidade_nome_fantasia
")
->get()
->map(fn ($infraestrutura) => [
'id' => $infraestrutura->id,
'nome' => $infraestrutura->nome,
'unidade_nome_fantasia' => $infraestrutura->unidade_nome_fantasia,
]),
'portal_transparencia' => self::getPortalTransparenciaModelData(),
];
}
private static function getPortalTransparenciaModelData()
{
$getColunas = function ($abaId) {
return DB::table('regulacao_parametrizacao_divulgacao_coluna as coluna')
->join('regulacao_parametrizacao_divulgacao_aba_coluna as aba_coluna', 'aba_coluna.coluna_id', 'coluna.id')
->where('aba_coluna.aba_id', $abaId)
->select(
'coluna.id',
'coluna.nome',
'aba_coluna.visivel'
)
->orderBy('coluna.nome')
->get()
->map(fn ($coluna) => (object) [
'id' => $coluna->id,
'nome' => $coluna->nome,
'visivel' => (bool) $coluna->visivel,
]);
};
$getStatusTipos = function ($abaId) {
return DB::table('regulacao_status_tipo as status_tipo')
->join('regulacao_parametrizacao_divulgacao_aba_status_tipo as aba_status_tipo', 'aba_status_tipo.status_tipo_id', 'status_tipo.id')
->where('aba_status_tipo.aba_id', $abaId)
->select(
'status_tipo.id',
'status_tipo.nome',
'aba_status_tipo.visivel'
)
->orderBy('status_tipo.nome')
->get()
->map(fn ($statusTipo) => (object) [
'id' => $statusTipo->id,
'nome' => $statusTipo->nome,
'visivel' => (bool) $statusTipo->visivel,
]);
};
$parametrizacao = ParametrizacaoDivulgacao::first();
return [
'abas' => [
'solicitacao_espera' => [
'colunas' => $getColunas(ParametrizacaoDivulgacaoAba::SOLICITACOES_EM_ESPERA),
'status_tipos' => $getStatusTipos(ParametrizacaoDivulgacaoAba::SOLICITACOES_EM_ESPERA),
],
'solicitacao_atendida' => [
'colunas' => $getColunas(ParametrizacaoDivulgacaoAba::SOLICITACOES_ATENDIDAS),
'status_tipos' => $getStatusTipos(ParametrizacaoDivulgacaoAba::SOLICITACOES_ATENDIDAS),
],
],
'modo_tempo_medio_id' => $parametrizacao->modo_tempo_medio_id ?? null,
];
}
public static function store()
{
self::validate();
$parametrizacao = Parametrizacao::firstOrNew();
DB::transaction(function () use ($parametrizacao) {
$supervisores = collect(request()->supervisores);
$reguladores = collect(request()->reguladores);
$solicitantes = collect(request()->solicitantes);
$prestadoresInternos = collect(request()->prestadores_internos);
$prestadoresExternos = collect(request()->prestadores_externos);
$divulgacao = collect(request()->divulgacao);
$parametrizacao->fill(request()->only([
'numero_solicitacao_automatico',
'solicitacao_automatica_ambulatorio',
'permite_agendar_fora_ordem_posicao',
'opcao_retirada_protocolo_agendamento_id',
'mensagem_protocolo_solicitacao',
'mensagem_comprovante_agendamento',
'exibe_protocolo_cross',
'obriga_protocolo_cross',
'usuario_registro_estado_id',
'obriga_data_desejada',
'solicitacao_retroativa',
'exames_nao_regulados',
'sempre_alterar_unidade_solicitante',
'encerra_solicitacao_automaticamente_ao_encerrar_protocolo_oci',
'exibe_assinatura_relatorio_solicitacao',
]));
$parametrizacao->save();
$parametrizacao->dataDesejadaGruposExames()->sync(request()->data_desejada_grupos_exames);
$parametrizacao->dataDesejadaProcedimentosCirurgicos()->sync(request()->data_desejada_procedimentos_cirurgicos);
$parametrizacao->dataDesejadaEspecialidades()->sync(request()->data_desejada_especialidades);
$parametrizacao->dataDesejadaInfraestruturas()->sync(request()->data_desejada_infraestruturas);
$supervisoresIds = self::saveSupervisores($supervisores);
$reguladoresIds = self::saveReguladores($reguladores);
$divulgacaoIds = self::saveDivulgacaoReguladores($divulgacao);
$solicitantesIds = self::saveSolicitantes($solicitantes);
$prestadoresInternosIds = self::savePrestadoresInternos($prestadoresInternos);
$prestadoresExternosIds = self::savePrestadoresExternos($prestadoresExternos);
ParametrizacaoSupervisor::whereNotIn('id', $supervisoresIds)->delete();
ParametrizacaoRegulador::whereNotIn('id', $reguladoresIds)->delete();
ParametrizacaoDivulgacaoRegulador::whereNotIn('id', $divulgacaoIds)->delete();
ParametrizacaoSolicitante::whereNotIn('id', $solicitantesIds)->delete();
ParametrizacaoPrestadorInterno::whereNotIn('id', $prestadoresInternosIds)->delete();
ParametrizacaoPrestadorExterno::whereNotIn('id', $prestadoresExternosIds)->delete();
self::savePortalTransparencia();
});
return $parametrizacao->fresh();
}
private static function saveSupervisores($supervisores)
{
$ids = collect();
$supervisores->each(function ($params) use ($ids) {
$supervisor = ParametrizacaoSupervisor::updateOrCreate(['id' => $params['id']], $params);
$ids->push($supervisor->id);
});
return $ids;
}
private static function saveDivulgacaoReguladores($reguladores)
{
$ids = collect();
$reguladores->each(function ($params) use ($ids) {
$reguladorParams = DB::table('regulacao_parametrizacao_regulador')
->where('infraestrutura_id', $params['infraestrutura_id'])
->first();
$regulador = ParametrizacaoDivulgacaoRegulador::updateOrCreate(['id' => $params['id']], array_merge($params, [
'regulacao_parametrizacao_regulador_id' => $reguladorParams->id ?? null
]));
DB::table('regulacao_parametrizacao_divulgacao_regulador_exame')
->where('regulador_id', $regulador->id)
->whereNotIn('exame_id', array_keys(self::getItemsWithIdOnKey($params['exames'])))
->delete();
foreach (self::getItemsWithIdOnKey($params['exames']) as $key => $value) {
$existsReguladorExame = DB::table('regulacao_parametrizacao_divulgacao_regulador_exame')
->where('regulador_id', $regulador->id)
->where('exame_id', $key)
->exists();
if (!$existsReguladorExame) {
$regulador->exames()->attach($key, [
'ativo' => $value['ativo'],
]);
}
DB::table('regulacao_parametrizacao_divulgacao_regulador_exame')
->where('regulador_id', $regulador->id)
->where('exame_id', $key)
->update([
'ativo' => $value['ativo'],
]);
}
DB::table('regulacao_parametrizacao_divulgacao_regulador_cirurgico')
->where('regulador_id', $regulador->id)
->whereNotIn('procedimento_cirurgico_id', array_keys(self::getItemsWithIdOnKey($params['procedimentos_cirurgicos'])))
->delete();
foreach (self::getItemsWithIdOnKey($params['procedimentos_cirurgicos']) as $key => $value) {
$existsReguladorProcedimentoCirurgico = DB::table('regulacao_parametrizacao_divulgacao_regulador_cirurgico')
->where('regulador_id', $regulador->id)
->where('procedimento_cirurgico_id', $key)
->exists();
if (!$existsReguladorProcedimentoCirurgico) {
$regulador->procedimentosCirurgicos()->attach($key, [
'ativo' => $value['ativo'],
]);
}
DB::table('regulacao_parametrizacao_divulgacao_regulador_cirurgico')
->where('regulador_id', $regulador->id)
->where('procedimento_cirurgico_id', $key)
->update([
'ativo' => $value['ativo'],
]);
}
DB::table('regulacao_parametrizacao_divulgacao_regulador_especialidade')
->where('regulador_id', $regulador->id)
->whereNotIn('especialidade_id', array_keys(self::getItemsWithIdOnKey($params['especialidades'])))
->delete();
foreach (self::getItemsWithIdOnKey($params['especialidades']) as $key => $value) {
$existsReguladorEspecialidade = DB::table('regulacao_parametrizacao_divulgacao_regulador_especialidade')
->where('regulador_id', $regulador->id)
->where('especialidade_id', $key)
->exists();
if (!$existsReguladorEspecialidade) {
$regulador->especialidades()->attach($key, [
'ativo' => $value['ativo'],
]);
}
DB::table('regulacao_parametrizacao_divulgacao_regulador_especialidade')
->where('regulador_id', $regulador->id)
->where('especialidade_id', $key)
->update([
'ativo' => $value['ativo'],
]);
}
$ids->push($regulador->id);
});
return $ids;
}
private static function saveReguladores($reguladores)
{
$ids = collect();
$reguladores->each(function ($params) use ($ids) {
$regulador = ParametrizacaoRegulador::updateOrCreate(['id' => $params['id']], $params);
DB::table('regulacao_parametrizacao_regulador_exame')
->where('regulador_id', $regulador->id)
->whereNotIn('exame_id', array_keys(self::getItemsWithIdOnKey($params['exames'])))
->delete();
foreach (self::getItemsWithIdOnKey($params['exames']) as $key => $value) {
$existsReguladorExame = DB::table('regulacao_parametrizacao_regulador_exame')
->where('regulador_id', $regulador->id)
->where('exame_id', $key)
->exists();
if (!$existsReguladorExame) {
$regulador->exames()->attach($key, [
'ativo' => $value['ativo'],
'exige_documento_anexo' => $value['exige_documento_anexo']
]);
}
DB::table('regulacao_parametrizacao_regulador_exame')
->where('regulador_id', $regulador->id)
->where('exame_id', $key)
->update([
'ativo' => $value['ativo'],
'exige_documento_anexo' => $value['exige_documento_anexo']
]);
}
DB::table('regulacao_parametrizacao_regulador_procedimento_cirurgico')
->where('regulador_id', $regulador->id)
->whereNotIn('procedimento_cirurgico_id', array_keys(self::getItemsWithIdOnKey($params['procedimentos_cirurgicos'])))
->delete();
foreach (self::getItemsWithIdOnKey($params['procedimentos_cirurgicos']) as $key => $value) {
$existsReguladorProcedimentoCirurgico = DB::table('regulacao_parametrizacao_regulador_procedimento_cirurgico')
->where('regulador_id', $regulador->id)
->where('procedimento_cirurgico_id', $key)
->exists();
if (!$existsReguladorProcedimentoCirurgico) {
$regulador->procedimentosCirurgicos()->attach($key, [
'ativo' => $value['ativo'],
'exige_documento_anexo' => $value['exige_documento_anexo']
]);
}
DB::table('regulacao_parametrizacao_regulador_procedimento_cirurgico')
->where('regulador_id', $regulador->id)
->where('procedimento_cirurgico_id', $key)
->update([
'ativo' => $value['ativo'],
'exige_documento_anexo' => $value['exige_documento_anexo']
]);
}
DB::table('regulacao_parametrizacao_regulador_especialidade')
->where('regulador_id', $regulador->id)
->whereNotIn('especialidade_id', array_keys(self::getItemsWithIdOnKey($params['especialidades'])))
->delete();
foreach (self::getItemsWithIdOnKey($params['especialidades']) as $key => $value) {
$existsReguladorEspecialidade = DB::table('regulacao_parametrizacao_regulador_especialidade')
->where('regulador_id', $regulador->id)
->where('especialidade_id', $key)
->exists();
if (!$existsReguladorEspecialidade) {
$regulador->especialidades()->attach($key, [
'ativo' => $value['ativo'],
'exige_documento_anexo' => $value['exige_documento_anexo']
]);
}
DB::table('regulacao_parametrizacao_regulador_especialidade')
->where('regulador_id', $regulador->id)
->where('especialidade_id', $key)
->update([
'ativo' => $value['ativo'],
'exige_documento_anexo' => $value['exige_documento_anexo']
]);
}
$ids->push($regulador->id);
});
return $ids;
}
private static function saveSolicitantes($solicitantes)
{
$ids = collect();
$solicitantes->each(function ($params) use ($ids) {
$solicitante = ParametrizacaoSolicitante::updateOrCreate(['id' => $params['id']], $params);
$solicitantesReguladoresIds = collect();
collect($params['reguladores'])->each(function ($params) use ($solicitante, $solicitantesReguladoresIds) {
if (is_null($params['id'])) {
$params['id'] = ParametrizacaoRegulador::where('infraestrutura_id', $params['infraestrutura_id'])
->first('id')
->id;
}
$solicitanteRegulador = $solicitante->solicitanteReguladores()->updateOrCreate(
['regulador_id' => $params['id']]
);
$solicitanteRegulador->exames()->sync($params['exames']);
$solicitanteRegulador->procedimentosCirurgicos()->sync($params['procedimentos_cirurgicos']);
$solicitanteRegulador->especialidades()->sync($params['especialidades']);
$solicitantesReguladoresIds->push($solicitanteRegulador->id);
});
$solicitante->solicitanteReguladores()->whereNotIn('id', $solicitantesReguladoresIds)->delete();
$ids->push($solicitante->id);
});
return $ids;
}
private static function savePrestadoresInternos($prestadoresInternos)
{
$ids = collect();
$prestadoresInternos->each(function ($params) use ($ids) {
$prestador = ParametrizacaoPrestadorInterno::updateOrCreate(['id' => $params['id']], $params);
$prestador->exames()->sync(self::getItemsWithIdOnKey($params['exames']));
$prestador->procedimentosCirurgicos()->sync(self::getItemsWithIdOnKey($params['procedimentos_cirurgicos']));
$prestador->especialidades()->sync(self::getItemsWithIdOnKey($params['especialidades']));
$ids->push($prestador->id);
});
return $ids;
}
private static function savePrestadoresExternos($prestadoresExternos)
{
$ids = collect();
$prestadoresExternos->each(function ($params) use ($ids) {
$prestador = ParametrizacaoPrestadorExterno::updateOrCreate(['id' => $params['id']], $params);
DB::table('regulacao_parametrizacao_prestador_externo_exame')
->where('prestador_externo_id', $prestador->id)
->whereNotIn('exame_id', array_keys(self::getItemsWithIdOnKey($params['exames'])))
->delete();
foreach (self::getItemsWithIdOnKey($params['exames']) as $key => $value) {
$existsPrestadorExternoExame = DB::table('regulacao_parametrizacao_prestador_externo_exame')
->where('prestador_externo_id', $prestador->id)
->where('exame_id', $key)
->exists();
if (!$existsPrestadorExternoExame) {
$prestador->exames()->attach($key, [
'ativo' => $value['ativo'],
'observacoes' => $value['observacoes'],
]);
}
}
DB::table('regulacao_parametrizacao_prestador_externo_proced_cirurgico')
->where('prestador_externo_id', $prestador->id)
->whereNotIn('procedimento_cirurgico_id', array_keys(self::getItemsWithIdOnKey($params['procedimentos_cirurgicos'])))
->delete();
foreach (self::getItemsWithIdOnKey($params['procedimentos_cirurgicos']) as $key => $value) {
$existsPrestadorExternoProcedimentoCirurgico = DB::table('regulacao_parametrizacao_prestador_externo_proced_cirurgico')
->where('prestador_externo_id', $prestador->id)
->where('procedimento_cirurgico_id', $key)
->exists();
if (!$existsPrestadorExternoProcedimentoCirurgico) {
$prestador->procedimentosCirurgicos()->attach($key, [
'ativo' => $value['ativo'],
'observacoes' => $value['observacoes'],
]);
}
}
DB::table('regulacao_parametrizacao_prestador_externo_especialidade')
->where('prestador_externo_id', $prestador->id)
->whereNotIn('especialidade_id', array_keys(self::getItemsWithIdOnKey($params['especialidades'])))
->delete();
foreach (self::getItemsWithIdOnKey($params['especialidades']) as $key => $value) {
$existsPrestadorExternoEspecialidade = DB::table('regulacao_parametrizacao_prestador_externo_especialidade')
->where('prestador_externo_id', $prestador->id)
->where('especialidade_id', $key)
->exists();
if (!$existsPrestadorExternoEspecialidade) {
$prestador->especialidades()->attach($key, [
'ativo' => $value['ativo'],
'observacoes' => $value['observacoes'],
]);
}
}
$ids->push($prestador->id);
});
return $ids;
}
private static function getItemsWithIdOnKey($items)
{
$newItems = [];
foreach ($items as $item) {
$id = $item['id'];
unset($item['id']);
$newItems[$id] = $item;
}
return $newItems;
}
private static function savePortalTransparencia()
{
ParametrizacaoDivulgacao::updateOrCreate([], [
'modo_tempo_medio_id' => request()->portal_transparencia['modo_tempo_medio_id']
]);
self::saveAbaSolicitacaoEspera();
self::saveAbaSolicitacaoAtendida();
}
private static function saveAbaSolicitacaoEspera()
{
$aba = RegulacaoParametrizacaoDivulgacaoAba::findOrFail(ParametrizacaoDivulgacaoAba::SOLICITACOES_EM_ESPERA);
$colunas = [];
foreach (request()->portal_transparencia['abas']['solicitacao_espera']['colunas'] as $coluna) {
$colunas[$coluna['id']] = ['visivel' => $coluna['visivel']];
}
$aba->colunas()->sync($colunas);
$statusTipos = [];
foreach (request()->portal_transparencia['abas']['solicitacao_espera']['status_tipos'] as $statusTipo) {
$statusTipos[$statusTipo['id']] = ['visivel' => $statusTipo['visivel']];
}
$aba->statusTipos()->sync($statusTipos);
}
private static function saveAbaSolicitacaoAtendida()
{
$aba = RegulacaoParametrizacaoDivulgacaoAba::findOrFail(ParametrizacaoDivulgacaoAba::SOLICITACOES_ATENDIDAS);
$colunas = [];
foreach (request()->portal_transparencia['abas']['solicitacao_atendida']['colunas'] as $coluna) {
$colunas[$coluna['id']] = ['visivel' => $coluna['visivel']];
}
$aba->colunas()->sync($colunas);
$statusTipos = [];
foreach (request()->portal_transparencia['abas']['solicitacao_atendida']['status_tipos'] as $statusTipo) {
$statusTipos[$statusTipo['id']] = ['visivel' => $statusTipo['visivel']];
}
$aba->statusTipos()->sync($statusTipos);
}
public static function validate()
{
Validator::make(request()->all(), [
'numero_solicitacao_automatico' => ['required', 'boolean'],
'solicitacao_automatica_ambulatorio' => ['required', 'boolean'],
'permite_agendar_fora_ordem_posicao' => ['required', 'boolean'],
'opcao_retirada_protocolo_agendamento_id' => ['required', 'integer'],
'mensagem_protocolo_solicitacao' => ['nullable', 'string', 'max:500'],
'mensagem_comprovante_agendamento' => ['nullable', 'string', 'max:500'],
'exibe_protocolo_cross' => ['required', 'boolean'],
'obriga_protocolo_cross' => ['required', 'boolean'],
'usuario_registro_estado_id' => ['nullable', 'integer'],
'obriga_data_desejada' => ['required', 'boolean'],
'data_desejada_grupos_exames' => ['present', 'array'],
'data_desejada_grupos_exames.*' => ['required', 'integer'],
'data_desejada_procedimentos_cirurgicos' => ['present', 'array'],
'data_desejada_procedimentos_cirurgicos.*' => ['required', 'integer'],
'data_desejada_especialidades' => ['present', 'array'],
'data_desejada_especialidades.*' => ['required', 'integer'],
'data_desejada_infraestruturas' => ['present', 'array'],
'data_desejada_infraestruturas.*' => ['required', 'integer'],
'solicitacao_retroativa' => ['required', 'boolean'],
'exames_nao_regulados' => ['required', 'boolean'],
'sempre_alterar_unidade_solicitante' => ['required', 'boolean'],
'encerra_solicitacao_automaticamente_ao_encerrar_protocolo_oci' => ['required', 'boolean'],
'exibe_assinatura_relatorio_solicitacao' => ['required', 'boolean'],
])->validate();
self::getSupervisorValidations();
self::getReguladorValidations();
self::getSolicitanteValidations();
self::getPrestadorInternoValidations();
self::getPrestadorExternoValidations();
self::getPortalTransparenciaValidations();
}
private static function getSupervisorValidations()
{
Validator::make(request()->all(), [
'supervisores' => ['present', 'array'],
'supervisores.*.id' => ['nullable', 'integer'],
'supervisores.*.usuario_id' => ['required', 'integer'],
])->validate();
}
private static function getReguladorValidations()
{
Validator::make(request()->all(), [
'reguladores' => ['present', 'array'],
'reguladores.*.id' => ['nullable', 'integer'],
'reguladores.*.ativo' => ['required', 'boolean'],
'reguladores.*.infraestrutura_id' => ['required', 'integer'],
'reguladores.*.tipo_id' => ['required', 'integer'],
])->validate();
foreach (request()->all()['reguladores'] as $regulador) {
Validator::make($regulador, [
'exames' => ['present', 'array'],
'exames.*.id' => ['required', 'integer'],
'exames.*.ativo' => ['required', 'boolean'],
'exames.*.observacoes' => ['nullable', 'string', 'max:1000'],
'procedimentos_cirurgicos' => ['present', 'array'],
'procedimentos_cirurgicos.*.id' => ['required', 'integer'],
'procedimentos_cirurgicos.*.ativo' => ['required', 'boolean'],
'especialidades' => ['present', 'array'],
'especialidades.*.id' => ['required', 'integer'],
'especialidades.*.ativo' => ['required', 'boolean'],
'reguladores.*.exames.*.exige_documento_anexo' => ['required', 'boolean'],
'reguladores.*.procedimentos_cirurgicos.*.exige_documento_anexo' => ['required', 'boolean'],
'reguladores.*.especialidades.*.exige_documento_anexo' => ['required', 'boolean'],
])->validate();
}
}
private static function getSolicitanteValidations()
{
Validator::make(request()->all(), [
'solicitantes' => ['present', 'array'],
'solicitantes.*.id' => ['nullable', 'integer'],
'solicitantes.*.infraestrutura_id' => ['required', 'integer'],
'solicitantes.*.is_ppi' => ['required', 'boolean'],
'solicitantes.*.atende_outro_municipio' => ['required', 'boolean'],
])->validate();
foreach (request()->all()['solicitantes'] as $solicitante) {
Validator::make($solicitante, [
'reguladores' => ['present', 'array'],
'reguladores.*.id' => ['nullable', 'integer'],
'reguladores.*.infraestrutura_id' => ['required', 'integer'],
'reguladores.*.exames' => ['present', 'array'],
'reguladores.*.exames.*' => ['required', 'integer'],
'reguladores.*.procedimentos_cirurgicos' => ['present', 'array'],
'reguladores.*.procedimentos_cirurgicos.*' => ['required', 'integer'],
'reguladores.*.especialidades' => ['present', 'array'],
'reguladores.*.especialidades.*' => ['required', 'integer'],
])->validate();
}
}
private static function getPrestadorInternoValidations()
{
Validator::make(request()->all(), [
'prestadores_internos' => ['present', 'array'],
'prestadores_internos.*.id' => ['nullable', 'integer'],
'prestadores_internos.*.controla_protocolo_fechamento' => ['required', 'boolean'],
'prestadores_internos.*.ativo' => ['required', 'boolean'],
'prestadores_internos.*.infraestrutura_id' => ['required', 'integer'],
])->validate();
foreach (request()->all()['prestadores_internos'] as $prestador) {
Validator::make($prestador, [
'exames' => ['present', 'array'],
'exames.*.id' => ['required', 'integer'],
'exames.*.ativo' => ['required', 'boolean'],
'exames.*.observacoes' => ['nullable', 'string', 'max:1000'],
'procedimentos_cirurgicos' => ['present', 'array'],
'procedimentos_cirurgicos.*.id' => ['required', 'integer'],
'procedimentos_cirurgicos.*.ativo' => ['required', 'boolean'],
'procedimentos_cirurgicos.*.observacoes' => ['nullable', 'string', 'max:1000'],
'especialidades' => ['present', 'array'],
'especialidades.*.id' => ['required', 'integer'],
'especialidades.*.ativo' => ['required', 'boolean'],
'especialidades.*.observacoes' => ['nullable', 'string', 'max:1000'],
])->validate();
}
}
private static function getPrestadorExternoValidations()
{
Validator::make(request()->all(), [
'prestadores_externos' => ['present', 'array'],
'prestadores_externos.*.id' => ['nullable', 'integer'],
'prestadores_externos.*.ativo' => ['required', 'boolean'],
'prestadores_externos.*.destino_id' => ['required', 'integer'],
])->validate();
foreach (request()->all()['prestadores_externos'] as $prestador) {
Validator::make($prestador, [
'exames' => ['present', 'array'],
'exames.*.id' => ['required', 'integer'],
'exames.*.ativo' => ['required', 'boolean'],
'exames.*.observacoes' => ['nullable', 'string', 'max:1000'],
'procedimentos_cirurgicos' => ['present', 'array'],
'procedimentos_cirurgicos.*.id' => ['required', 'integer'],
'procedimentos_cirurgicos.*.ativo' => ['required', 'boolean'],
'procedimentos_cirurgicos.*.observacoes' => ['nullable', 'string', 'max:1000'],
'especialidades' => ['present', 'array'],
'especialidades.*.id' => ['required', 'integer'],
'especialidades.*.ativo' => ['required', 'boolean'],
'especialidades.*.observacoes' => ['nullable', 'string', 'max:1000'],
])->validate();
}
}
private static function getPortalTransparenciaValidations()
{
Validator::make(request()->all(), [
'portal_transparencia' => ['required', 'array'],
'portal_transparencia.modo_tempo_medio_id' => ['nullable', 'integer'],
'portal_transparencia.abas' => ['required', 'array'],
'portal_transparencia.abas.solicitacao_espera' => ['required', 'array'],
'portal_transparencia.abas.solicitacao_espera.colunas' => ['required', 'array'],
'portal_transparencia.abas.solicitacao_espera.colunas.*.id' => ['required', 'integer'],
'portal_transparencia.abas.solicitacao_espera.colunas.*.visivel' => ['required', 'boolean'],
'portal_transparencia.abas.solicitacao_espera.status_tipos' => ['required', 'array'],
'portal_transparencia.abas.solicitacao_espera.status_tipos.*.id' => ['required', 'integer'],
'portal_transparencia.abas.solicitacao_espera.status_tipos.*.visivel' => ['required', 'boolean'],
'portal_transparencia.abas.solicitacao_atendida' => ['required', 'array'],
'portal_transparencia.abas.solicitacao_atendida.colunas' => ['required', 'array'],
'portal_transparencia.abas.solicitacao_atendida.colunas.*.id' => ['required', 'integer'],
'portal_transparencia.abas.solicitacao_atendida.colunas.*.visivel' => ['required', 'boolean'],
'portal_transparencia.abas.solicitacao_atendida.status_tipos' => ['required', 'array'],
'portal_transparencia.abas.solicitacao_atendida.status_tipos.*.id' => ['required', 'integer'],
'portal_transparencia.abas.solicitacao_atendida.status_tipos.*.visivel' => ['required', 'boolean'],
])->validate();
}
}