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

3227 lines
165 KiB
PHP

<?php
namespace App\Services\Regulacao;
use App\Enums\Cadastro\EtapaClinica as EtapaClinicaEnum;
use App\Enums\Regulacao\StatusTipo;
use App\Models\Cadastro\Especialidade;
use App\Models\Cadastro\Estabelecimento\Infraestrutura;
use App\Models\Cadastro\Estabelecimento\Unidade;
use App\Models\Cadastro\EtapaClinica;
use App\Models\Cadastro\Grupo\Grupo;
use App\Models\Cadastro\Oci;
use App\Models\Cadastro\SujeitoAtencao\Paciente;
use App\Models\Cadastro\SujeitoAtencao\Sexo;
use App\Models\Cadastro\SujeitoAtencao\Usuario;
use App\Models\Geral\Ciap;
use App\Models\Parametrizacao\Exame\Exame;
use App\Models\Parametrizacao\ProcedimentoCirurgico;
use App\Models\Regulacao\Parametrizacao;
use App\Models\Regulacao\ParametrizacaoOpcaoRetiradaProtocoloAgendamento;
use App\Models\Regulacao\ParametrizacaoPrestadorExterno;
use App\Models\Regulacao\ParametrizacaoPrestadorInterno;
use App\Models\Regulacao\ParametrizacaoRegulador;
use App\Models\Regulacao\SolicitacaoPrioridade;
use App\Models\Regulacao\Status;
use App\Models\Sigtap\Cid;
use App\Services\Service;
use App\Utils\DataUtil;
use App\Utils\MaskUtil;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
class RelatorioSolicitacaoService extends Service
{
public static function index()
{
$totalizadores = (object) [
'solicitacoes' => 0,
'pacientes' => 0,
'infraestruturas_solicitantes' => 0,
'prestadores' => 0,
'por_status' => collect(),
];
$params = self::getParams();
$solicitacoesBuilder = DB::table('regulacao_solicitacao as solicitacao')
->join('regulacao_solicitacao_movimentacao as movimentacao', fn ($j) => $j
->on('movimentacao.solicitacao_id', 'solicitacao.id')
->where('movimentacao.id', fn ($q) => $q
->select('movimentacao2.id')
->from('regulacao_solicitacao_movimentacao as movimentacao2')
->whereColumn('movimentacao2.solicitacao_id', 'solicitacao.id')
->orderByDesc('movimentacao2.id')
->limit(1)
)
)
->join('cadastro_paciente as paciente', 'paciente.id', 'solicitacao.paciente_id')
->join('cadastro_cidadao as paciente_cidadao', 'paciente_cidadao.id', 'paciente.cidadao_id')
->join('regulacao_status as status', 'status.id', 'solicitacao.status_id')
->join('regulacao_solicitacao_prioridade as prioridade', 'prioridade.id', 'solicitacao.prioridade_id')
->join(
'regulacao_parametrizacao_regulador as regulador',
'regulador.id',
'solicitacao.regulador_id'
)
->join(
'cadastro_infraestrutura as infraestrutura_reguladora',
'infraestrutura_reguladora.id',
'regulador.infraestrutura_id'
)
->join(
'cadastro_unidade as unidade_reguladora',
'unidade_reguladora.id',
'infraestrutura_reguladora.unidade_id'
)
->join(
'cadastro_infraestrutura as infraestrutura_solicitante',
'infraestrutura_solicitante.id',
'solicitacao.infraestrutura_solicitante_id'
)
->join(
'cadastro_unidade as unidade_solicitante',
'unidade_solicitante.id',
'infraestrutura_solicitante.unidade_id'
)
->join(
'cadastro_usuario as usuario_solicitante',
'usuario_solicitante.id',
'solicitacao.usuario_solicitante_id'
)
->join(
'cadastro_cidadao as usuario_cidadao_solicitante',
'usuario_cidadao_solicitante.id',
'usuario_solicitante.cidadao_id'
)
->join(
'cadastro_lotacao as lotacao_solicitacao',
'lotacao_solicitacao.id',
'solicitacao.created_lotacao_id'
)
->join(
'cadastro_usuario as usuario_solicitacao',
'usuario_solicitacao.id',
'lotacao_solicitacao.usuario_id'
)
->join(
'cadastro_cidadao as usuario_cidadao_solicitacao',
'usuario_cidadao_solicitacao.id',
'usuario_solicitacao.cidadao_id'
)
->join('regulacao_solicitacao_item as item', 'item.solicitacao_id', 'solicitacao.id')
->leftJoin('sigtap.cid as cid', 'cid.id', 'solicitacao.cid_id')
->leftJoin('geral_ciap as ciap', 'ciap.id', 'solicitacao.ciap_id')
->leftJoin('cadastro_sexo as paciente_sexo', 'paciente_sexo.id', 'paciente_cidadao.sexo_id')
->leftJoin(
'regulacao_parametrizacao_prestador_interno as prestador_interno',
'prestador_interno.id',
'solicitacao.prestador_interno_id'
)
->leftJoin(
'cadastro_infraestrutura as prestador_interno_infraestrutura',
'prestador_interno_infraestrutura.id',
'prestador_interno.infraestrutura_id'
)
->leftJoin(
'cadastro_unidade as prestador_interno_unidade',
'prestador_interno_unidade.id',
'prestador_interno_infraestrutura.unidade_id'
)
->leftJoin(
'regulacao_parametrizacao_prestador_externo as prestador_externo',
'prestador_externo.id',
'solicitacao.prestador_externo_id'
)
->leftJoin(
'transporte_paciente_destino as prestador_externo_destino',
'prestador_externo_destino.id',
'prestador_externo.destino_id'
)
->leftJoin('parametrizacao_exame as exame', 'exame.id', 'item.exame_id')
->leftJoin(
'parametrizacao_procedimento_cirurgico as procedimento_cirurgico',
'procedimento_cirurgico.id',
'item.procedimento_cirurgico_id'
)
->leftJoin('cadastro_especialidade as especialidade', 'especialidade.id', 'item.especialidade_id')
->leftJoin('sigtap.ocupacao as ocupacao', 'ocupacao.id', 'especialidade.ocupacao_id')
->leftJoin(
'ambulatorio_acompanhamento_oci as acompanhamento_oci',
'acompanhamento_oci.id',
'solicitacao.acompanhamento_oci_id'
)
->leftJoin(
'cadastro_especialidade as especialidade_solicitante',
'especialidade_solicitante.id',
'solicitacao.usuario_solicitante_especialidade_id'
)
->whereNotNull('solicitacao.confirmado_em')
->when($params->periodo['start'], fn ($q, $start) => $q->where('solicitacao.data', '>=', $start))
->when($params->periodo['end'], fn ($q, $end) => $q->where('solicitacao.data', '<=', $end))
->when($params->periodo_movimentacao['start'], fn ($q, $start) => $q->where('movimentacao.movimentado_em', '>=', $start))
->when($params->periodo_movimentacao['end'], fn ($q, $end) => $q->where('movimentacao.movimentado_em', '<=', $end))
->when($params->paciente_id, fn ($q, $id) => $q->where('solicitacao.paciente_id', $id))
->when($params->idade_de, fn ($q, $idadeDe) => $q
->whereRaw("TIMESTAMPDIFF(YEAR, paciente_cidadao.data_nascimento, NOW()) >= {$idadeDe}")
)
->when($params->idade_ate, fn ($q, $idadeAte) => $q
->whereRaw("TIMESTAMPDIFF(YEAR, paciente_cidadao.data_nascimento, NOW()) <= {$idadeAte}")
)
->whereIn('infraestrutura_reguladora.unidade_id', $params->unidades_reguladoras)
->whereIn('solicitacao.regulador_id', $params->reguladores)
->whereIn('infraestrutura_solicitante.unidade_id', $params->unidades_solicitantes)
->whereIn('solicitacao.infraestrutura_solicitante_id', $params->infraestruturas_solicitantes)
->when(!empty($params->unidades_referencias), fn ($q) => $q
->whereIn('paciente.unidade_id', $params->unidades_referencias)
)
->whereIn('solicitacao.usuario_solicitante_id', $params->usuarios_solicitantes)
->when(
$params->nenhum_prestador,
fn ($q) => $q
->whereNull('solicitacao.prestador_interno_id')
->whereNull('solicitacao.prestador_externo_id'),
fn ($q) => $q->where(function ($q) use ($params) {
$q->whereIn('solicitacao.prestador_interno_id', $params->prestadores_internos)
->orWhereIn('solicitacao.prestador_externo_id', $params->prestadores_externos);
if ($params->semPrestador) {
$q->orWhere(function ($q) {
$q->whereNull('solicitacao.prestador_interno_id')
->whereNull('solicitacao.prestador_externo_id');
});
}
})
)
->whereIn('solicitacao.status_id', $params->status)
->when(!empty($params->opcoes_retirada_protocolo_agendamento), function ($q) use ($params) {
$valores = array_filter($params->opcoes_retirada_protocolo_agendamento, fn ($v) => !is_null($v));
$q->where(function ($q) use ($valores, $params) {
if (!empty($valores)) {
$q->whereIn('solicitacao.opcao_retirada_protocolo_agendamento_id', $valores);
}
if (in_array(null, $params->opcoes_retirada_protocolo_agendamento, true)) {
$q->orWhereNull('solicitacao.opcao_retirada_protocolo_agendamento_id');
}
});
})
->where(fn ($q) => $q
->whereIn('item.exame_id', $params->exames)
->orWhereIn('item.procedimento_cirurgico_id', $params->procedimentos_cirurgicos)
->orWhereIn('item.especialidade_id', $params->especialidades)
)
->whereIn('solicitacao.prioridade_id', $params->prioridades)
->when($params->cid_id, fn ($q, $id) => $q->where('solicitacao.cid_id', $id))
->when($params->ciap_id, fn ($q, $id) => $q->where('solicitacao.ciap_id', $id))
->whereIn('paciente_cidadao.sexo_id', $params->sexos)
->when(!empty($params->ocis), fn ($q) => $q
->when($params->todas_ocis_selecionadas,
fn ($q) => $q->where(fn ($q) => $q
->whereIn('acompanhamento_oci.oci_id', $params->ocis)
->orWhereNull('acompanhamento_oci.id')
),
fn ($q) => $q->whereIn('acompanhamento_oci.oci_id', $params->ocis)
)
)
->when(!empty($params->etapas_clinicas), fn ($q) => $q
->when($params->todas_etapas_clinicas_selecionadas,
fn ($q) => $q->where(fn ($q) => $q
->whereIn('acompanhamento_oci.etapa_clinica_atual_id', $params->etapas_clinicas)
->orWhereNull('acompanhamento_oci.id')
),
fn ($q) => $q->whereIn('acompanhamento_oci.etapa_clinica_atual_id', $params->etapas_clinicas)
)
)
->selectRaw("
solicitacao.id,
" . (count($params->reguladores) === 1
? "IFNULL(LPAD(solicitacao.posicao_regulador, 6, '0'), '—')"
: "IFNULL(LPAD(solicitacao.posicao_municipal, 6, '0'), '—')"
) . " as posicao,
solicitacao.data,
solicitacao.data_agendada,
paciente.id as paciente_id,
CONCAT(
paciente_cidadao.nome,
IF(paciente_cidadao.nome_social IS NULL,
'',
CONCAT(' (', paciente_cidadao.nome_social, ')')
)
) as paciente_nome,
LPAD(paciente.prontuario, 7, 0) AS paciente_prontuario,
CONCAT(TIMESTAMPDIFF(YEAR, paciente_cidadao.data_nascimento, CURRENT_DATE), ' anos') as paciente_idade,
paciente_sexo.descricao as sexo_descricao,
paciente_cidadao.cpf as paciente_cpf,
paciente_cidadao.cns as paciente_cns,
cid.codigo as cid_codigo,
cid.nome as cid_nome,
ciap.codigo as ciap_codigo,
ciap.descricao as ciap_descricao,
status.id as status_id,
status.nome as status_nome,
infraestrutura_solicitante.id as infraestrutura_solicitante_id,
COALESCE(infraestrutura_solicitante.nome, unidade_solicitante.nome_fantasia) as infraestrutura_solicitante_nome,
COALESCE(infraestrutura_reguladora.nome, unidade_reguladora.nome_fantasia) as regulador_nome,
usuario_cidadao_solicitante.nome as usuario_solicitante_nome,
solicitacao.prestador_interno_id,
solicitacao.prestador_externo_id,
(
CASE
WHEN solicitacao.prestador_interno_id IS NOT NULL
THEN IF (prestador_interno_infraestrutura.nome IS NULL,
prestador_interno_unidade.nome_fantasia,
CONCAT(prestador_interno_unidade.nome_fantasia, ' (', prestador_interno_infraestrutura.nome, ')')
)
WHEN solicitacao.prestador_externo_id IS NOT NULL
THEN prestador_externo_destino.descricao_destino
ELSE NULL
END
) as prestador_nome,
usuario_cidadao_solicitacao.nome as usuario_cadastro_nome,
TIMESTAMPDIFF(
DAY,
(
SELECT STR_TO_DATE(CONCAT(solicitacao_historico.data, ' 00:00:00'), '%Y-%m-%d %H:%i:%s')
FROM regulacao_solicitacao_historico as solicitacao_historico
JOIN regulacao_status solicitacao_historico_status
ON solicitacao_historico_status.id = solicitacao_historico.status_id
WHERE solicitacao_historico.solicitacao_id = solicitacao.id
AND solicitacao_historico_status.tipo_id = " . StatusTipo::SOLICITADO . "
ORDER BY solicitacao_historico.created_at
LIMIT 1
),
COALESCE((
SELECT solicitacao_historico.created_at
FROM regulacao_solicitacao_historico as solicitacao_historico
JOIN regulacao_status solicitacao_historico_status
ON solicitacao_historico_status.id = solicitacao_historico.status_id
WHERE solicitacao_historico.solicitacao_id = solicitacao.id
AND solicitacao_historico_status.tipo_id IN (
" . StatusTipo::AGENDADO . ",
" . StatusTipo::REAGENDADO . "
)
ORDER BY solicitacao_historico.created_at
LIMIT 1
), CURRENT_TIMESTAMP)
) as tempo_espera,
prioridade.nome as prioridade_nome,
LAST_DAY(DATE_ADD(CAST(acompanhamento_oci.iniciado_em AS DATE), INTERVAL 1 MONTH)) AS data_vencimento_oci,
IF(acompanhamento_oci.etapa_clinica_atual_id = " . EtapaClinicaEnum::ALTA . ",
NULL,
TIMESTAMPDIFF(DAY,
CURRENT_DATE,
LAST_DAY(DATE_ADD(CAST(acompanhamento_oci.iniciado_em AS DATE), INTERVAL 1 MONTH))
)
) AS dias_restantes_oci,
IF(acompanhamento_oci.etapa_clinica_atual_id = " . EtapaClinicaEnum::ALTA . ", 1, 0) AS has_alta_oci,
IF(solicitacao.acompanhamento_oci_id IS NULL, 0, 1) as has_oci,
especialidade_solicitante.nome AS especialidade_solicitante_nome,
(
SELECT GROUP_CONCAT(cct.numero SEPARATOR '#')
FROM cadastro_cidadao_telefone cct
WHERE cct.cidadao_id = paciente_cidadao.id
AND cct.deleted_at IS NULL
) as telefones,
GROUP_CONCAT(DISTINCT (
CASE
WHEN item.exame_id IS NOT NULL
THEN IF (exame.codigo IS NULL OR exame.codigo = '',
exame.nome,
CONCAT(
CONCAT(
SUBSTR(exame.codigo, 1, 2),
'.',
SUBSTR(exame.codigo, 3, 2),
'.',
SUBSTR(exame.codigo, 5, 2),
'.',
SUBSTR(exame.codigo, 7, 3),
'-',
SUBSTR(exame.codigo, 10, 1)
),
' - ',
exame.nome
)
)
WHEN item.procedimento_cirurgico_id IS NOT NULL
THEN CONCAT(
CONCAT(
SUBSTR(procedimento_cirurgico.procedimento_codigo, 1, 2),
'.',
SUBSTR(procedimento_cirurgico.procedimento_codigo, 3, 2),
'.',
SUBSTR(procedimento_cirurgico.procedimento_codigo, 5, 2),
'.',
SUBSTR(procedimento_cirurgico.procedimento_codigo, 7, 3),
'-',
SUBSTR(procedimento_cirurgico.procedimento_codigo, 10, 1)
),
' - ',
procedimento_cirurgico.nome
)
WHEN item.especialidade_id IS NOT NULL
THEN CONCAT(ocupacao.codigo, ' - ', especialidade.nome)
END
) SEPARATOR '#') AS itens
")
->groupByRaw("
solicitacao.id,
posicao,
solicitacao.data,
solicitacao.data_agendada,
paciente.id,
paciente_nome,
paciente_prontuario,
paciente_idade,
paciente_sexo.descricao,
paciente_cidadao.cpf,
paciente_cidadao.cns,
cid.codigo,
cid.nome,
ciap.codigo,
ciap.descricao,
status.id,
status.nome,
infraestrutura_solicitante.id,
infraestrutura_solicitante_nome,
regulador_nome,
usuario_cidadao_solicitante.nome,
solicitacao.prestador_interno_id,
solicitacao.prestador_externo_id,
prestador_nome,
usuario_cidadao_solicitacao.nome,
tempo_espera,
prioridade.nome,
data_vencimento_oci,
dias_restantes_oci,
has_alta_oci,
has_oci,
especialidade_solicitante.nome,
telefones
");
self::setOrderBy($solicitacoesBuilder);
$solicitacoes = $solicitacoesBuilder->get();
$totalizadores->solicitacoes = $solicitacoes->count();
$totalizadores->pacientes = $solicitacoes->pluck('paciente_id')->unique()->filter()->count();
$totalizadores->infraestruturas_solicitantes = $solicitacoes->pluck('infraestrutura_solicitante_id')->unique()->filter()->count();
$totalizadores->prestadores = $solicitacoes->pluck('prestador_interno_id')->unique()->filter()->count()
+ $solicitacoes->pluck('prestador_externo_id')->unique()->filter()->count();
$totalizadores->por_status = $solicitacoes
->groupBy('status_id')
->map(fn ($solicitacao) => (object) [
'nome' => $solicitacao->first()->status_nome,
'quantidade' => $solicitacao->count(),
])
->sortBy('nome')
->values();
$solicitacoes->each(function ($solicitacao) {
$solicitacao->paciente_cpf = MaskUtil::getCpfMasked($solicitacao->paciente_cpf);
$solicitacao->paciente_cns = MaskUtil::getCnsMasked($solicitacao->paciente_cns);
$solicitacao->cid = is_null($solicitacao->cid_nome)
? null : (MaskUtil::getCidMasked($solicitacao->cid_codigo) . " - {$solicitacao->cid_nome}");
$solicitacao->ciap = is_null($solicitacao->ciap_descricao)
? null : "{$solicitacao->ciap_codigo} - {$solicitacao->ciap_descricao}";
$solicitacao->tempo_espera = self::getTempoEsperaText($solicitacao);
$solicitacao->itens = explode('#', $solicitacao->itens);
$solicitacao->has_alta_oci = (bool) $solicitacao->has_alta_oci;
$solicitacao->has_oci = (bool) $solicitacao->has_oci;
$solicitacao->is_oci_vencida = (is_null($solicitacao->data_vencimento_oci) || $solicitacao->has_alta_oci)
? false
: (Carbon::now() > Carbon::create($solicitacao->data_vencimento_oci)->endOfDay());
$solicitacao->dias_restantes_oci = is_null($solicitacao->dias_restantes_oci)
? null : ($solicitacao->dias_restantes_oci < 0 ? 0 : $solicitacao->dias_restantes_oci);
$solicitacao->telefones = collect(explode('#', $solicitacao->telefones))->map(function ($telefone) {
return MaskUtil::getPhoneMasked($telefone);
})->join(', ');
unset(
$solicitacao->cid_codigo,
$solicitacao->cid_nome,
$solicitacao->ciap_codigo,
$solicitacao->ciap_descricao,
$solicitacao->paciente_id,
$solicitacao->infraestrutura_solicitante_id,
$solicitacao->prestador_interno_id,
$solicitacao->prestador_externo_id,
$solicitacao->status_id
);
});
return compact('solicitacoes', 'totalizadores');
}
private static function getTempoEsperaText($solicitacao)
{
if ($solicitacao->tempo_espera === 0) {
return 'MESMO DIA';
}
$meses = floor($solicitacao->tempo_espera / 30);
$dias = $solicitacao->tempo_espera % 30;
$mesesText = $meses > 0 ? ($meses > 1 ? "{$meses} meses" : "{$meses} mês") : null;
$diasText = $dias > 0 ? ($dias > 1 ? "{$dias} dias" : "{$dias} dia") : null;
return is_null($mesesText)
? $diasText
: $mesesText . (is_null($diasText) ? '' : " e {$diasText}");
}
private static function setOrderBy($builder)
{
if (is_null(request()->sortBy)) {
$builder->orderByRaw('solicitacao.id');
return;
}
$columns = [
'data' => 'solicitacao.data',
'posicao' => 'posicao',
'data_agendada' => 'solicitacao.data_agendada',
'paciente_nome' => 'paciente_nome',
'paciente_prontuario' => 'paciente_prontuario',
'paciente_idade' => 'paciente_idade',
'sexo_descricao' => 'paciente_sexo.descricao',
'paciente_cpf' => 'paciente_cidadao.cpf',
'paciente_cns' => 'paciente_cidadao.cns',
'cid' => "CONCAT(cid.codigo, ' - ', cid.nome)",
'ciap' => "CONCAT(ciap.codigo, ' - ', ciap.descricao)",
'status_nome' => 'status.nome',
'infraestrutura_solicitante_nome' => 'infraestrutura_solicitante_nome',
'regulador_nome' => 'regulador_nome',
'usuario_solicitante_nome' => 'usuario_cidadao_solicitante.nome',
'prestador_nome' => 'prestador_nome',
'usuario_cadastro_nome' => 'usuario_cidadao_solicitacao.nome',
'tempo_espera' => 'tempo_espera',
'prioridade_nome' => 'prioridade.nome',
'data_vencimento_oci' => 'data_vencimento_oci',
'dias_restantes_oci' => 'dias_restantes_oci',
'especialidade_solicitante_nome' => 'especialidade_solicitante.nome',
];
$column = $columns[request()->sortBy];
$direction = DataUtil::getBooleanValueFromStringBoolean(request()->sortDesc) ? 'DESC' : 'ASC';
$builder->orderByRaw(
"{$column} {$direction}, solicitacao.id"
);
}
public static function list()
{
$data = (object) [
'additionals' => [],
'form' => [],
'model' => [],
];
$params = self::getParams();
$sets = [
'periodo' => function () use ($data, $params) {
$data->model['periodo'] = ['start' => null, 'end' => null];
$params->periodo = $data->model['periodo'];
},
'periodo_movimentacao' => function () use ($data, $params) {
$data->model['periodo_movimentacao'] = ['start' => null, 'end' => null];
$params->periodo_movimentacao = $data->model['periodo_movimentacao'];
},
'paciente' => function () use ($data, $params) {
$data->model['paciente'] = null;
$params->paciente_id = null;
},
'idade_de' => function () use ($data, $params) {
$data->model['idade_de'] = null;
$params->idade_de = $data->model['idade_de'];
},
'idade_ate' => function () use ($data, $params) {
$data->model['idade_ate'] = null;
$params->idade_ate = $data->model['idade_ate'];
},
'unidade_reguladora' => function () use ($data, $params) {
$unidadeReguladoraData = self::getUnidadesReguladoras($params);
$data->form['unidades_reguladoras'] = $unidadeReguladoraData['form'];
$data->model['unidades_reguladoras'] = $unidadeReguladoraData['model'];
$params->unidades_reguladoras = $data->model['unidades_reguladoras'];
},
'regulador' => function () use ($data, $params) {
$reguladorData = self::getReguladores($params);
$data->form['reguladores'] = $reguladorData['form'];
$data->model['reguladores'] = $reguladorData['model'];
$params->reguladores = $data->model['reguladores'];
},
'unidade_solicitante' => function () use ($data, $params) {
$unidadeSolicitanteData = self::getUnidadesSolicitantes($params);
$data->form['unidades_solicitantes'] = $unidadeSolicitanteData['form'];
$data->model['unidades_solicitantes'] = $unidadeSolicitanteData['model'];
$params->unidades_solicitantes = $data->model['unidades_solicitantes'];
},
'infraestrutura_solicitante' => function () use ($data, $params) {
$infraestruturaSolicitanteData = self::getInfraestruturasSolicitantes($params);
$data->form['infraestruturas_solicitantes'] = $infraestruturaSolicitanteData['form'];
$data->model['infraestruturas_solicitantes'] = $infraestruturaSolicitanteData['model'];
$params->infraestruturas_solicitantes = $data->model['infraestruturas_solicitantes'];
},
'unidade_referencia' => function () use ($data, $params) {
$unidadeReferenciaData = self::getUnidadesReferencia($params);
$data->form['unidades_referencias'] = $unidadeReferenciaData['form'];
$data->model['unidades_referencias'] = $unidadeReferenciaData['model'];
$params->unidades_referencias = $data->model['unidades_referencias'];
},
'usuario_solicitante' => function () use ($data, $params) {
$usuarioSolicitanteData = self::getUsuariosSolicitantes($params);
$data->form['usuarios_solicitantes'] = $usuarioSolicitanteData['form'];
$data->model['usuarios_solicitantes'] = $usuarioSolicitanteData['model'];
$params->usuarios_solicitantes = $data->model['usuarios_solicitantes'];
},
'prestador' => function () use ($data, $params) {
$prestadorData = self::getPrestadores($params);
$data->form['prestadores'] = $prestadorData['form'];
$data->model['prestadores'] = $prestadorData['model'];
$params->prestadores = $data->model['prestadores'];
self::setParamsPrestador($params);
},
'status' => function () use ($data, $params) {
$statusData = self::getStatus($params);
$data->form['status'] = $statusData['form'];
$data->model['status'] = $statusData['model'];
$params->status = $data->model['status'];
},
'opcao_retirada_protocolo_agendamento' => function () use ($data, $params) {
$opcaoData = self::getOpcoesRetiradasProtocoloAgendamento($params);
$data->form['opcoes_retirada_protocolo_agendamento'] = $opcaoData['form'];
$data->model['opcoes_retirada_protocolo_agendamento'] = $opcaoData['model'];
$params->opcoes_retirada_protocolo_agendamento = $data->model['opcoes_retirada_protocolo_agendamento'];
},
'grupo' => function () use ($data, $params) {
$grupoData = self::getGrupos($params);
$data->form['grupos'] = $grupoData['form'];
$data->model['grupos'] = $grupoData['model'];
$params->grupos = $data->model['grupos'];
},
'exame' => function () use ($data, $params) {
$exameData = self::getExames($params);
$data->form['exames'] = $exameData['form'];
$data->model['exames'] = $exameData['model'];
$params->exames = $data->model['exames'];
},
'procedimento_cirurgico' => function () use ($data, $params) {
$procedimentoCirurgicoData = self::getProcedimentosCirurgicos($params);
$data->form['procedimentos_cirurgicos'] = $procedimentoCirurgicoData['form'];
$data->model['procedimentos_cirurgicos'] = $procedimentoCirurgicoData['model'];
$params->procedimentos_cirurgicos = $data->model['procedimentos_cirurgicos'];
},
'especialidade' => function () use ($data, $params) {
$especialidadeData = self::getEspecialidades($params);
$data->form['especialidades'] = $especialidadeData['form'];
$data->model['especialidades'] = $especialidadeData['model'];
$params->especialidades = $data->model['especialidades'];
},
'prioridade' => function () use ($data, $params) {
$prioridadeData = self::getPrioridades($params);
$data->form['prioridades'] = $prioridadeData['form'];
$data->model['prioridades'] = $prioridadeData['model'];
$params->prioridades = $data->model['prioridades'];
},
'cid' => function () use ($data, $params) {
$data->model['cid'] = null;
$params->cid_id = $data->model['cid'];
},
'ciap' => function () use ($data, $params) {
$data->model['ciap'] = null;
$params->ciap_id = $data->model['ciap'];
},
'sexo' => function () use ($data, $params) {
$sexoData = self::getSexos($params);
$data->form['sexos'] = $sexoData['form'];
$data->model['sexos'] = $sexoData['model'];
$params->sexos = $data->model['sexos'];
},
'oci' => function () use ($data, $params) {
$ociData = self::getOcis($params);
$data->form['ocis'] = $ociData['form'];
$data->model['ocis'] = $ociData['model'];
$params->ocis = $data->model['ocis'];
},
'etapa_clinica' => function () use ($data, $params) {
$etapaClinicaData = self::getEtapasClinicas($params);
$data->form['etapas_clinicas'] = $etapaClinicaData['form'];
$data->model['etapas_clinicas'] = $etapaClinicaData['model'];
$params->etapas_clinicas = $data->model['etapas_clinicas'];
},
];
$firstLoad = $load = is_null(request()->load_from);
if ($load) {
$data->additionals = [
'data_atual' => Carbon::today()->format('d/m/Y'),
];
}
$fieldsItem = collect(['exame', 'procedimento_cirurgico', 'especialidade']);
$isLoadFromItens = $fieldsItem->contains(request()->load_from);
foreach ($sets as $field => $set) {
if ($load) {
if (!$firstLoad && (
collect(['periodo_movimentacao'])->contains($field)
|| ($isLoadFromItens && $fieldsItem->contains($field))
|| (request()->load_from === 'grupo' && $field === 'especialidade')
|| ($field === 'idade_de' || $field === 'idade_ate')
|| ($field === 'paciente')
)) {
continue;
}
$set();
}
else if ($field === request()->load_from) {
$load = true;
}
}
foreach ($data as $property => $itens) {
if (empty($itens)) {
unset($data->{$property});
}
}
return $data;
}
private static function getParams()
{
$params = (object) [
'periodo' => request()->get('periodo', ['start' => null, 'end' => null]),
'periodo_movimentacao' => request()->get('periodo_movimentacao', ['start' => null, 'end' => null]),
'paciente_id' => request()->get('paciente_id'),
'idade_de' => request()->get('idade_de'),
'idade_ate' => request()->get('idade_ate'),
'unidades_reguladoras' => request()->get('unidades_reguladoras', []),
'reguladores' => request()->get('reguladores', []),
'unidades_solicitantes' => request()->get('unidades_solicitantes', []),
'infraestruturas_solicitantes' => request()->get('infraestruturas_solicitantes', []),
'unidades_referencias' => request()->get('unidades_referencias', []),
'usuarios_solicitantes' => request()->get('usuarios_solicitantes', []),
'prestadores' => request()->get('prestadores', []),
'status' => request()->get('status', []),
'opcoes_retirada_protocolo_agendamento' => request()->get('opcoes_retirada_protocolo_agendamento', []),
'grupos' => request()->get('grupos', []),
'exames' => request()->get('exames', []),
'procedimentos_cirurgicos' => request()->get('procedimentos_cirurgicos', []),
'especialidades' => request()->get('especialidades', []),
'prioridades' => request()->get('prioridades', []),
'cid_id' => request()->get('cid_id'),
'ciap_id' => request()->get('ciap_id'),
'sexos' => request()->get('sexos', []),
'ocis' => request()->get('ocis', []),
'etapas_clinicas' => request()->get('etapas_clinicas', []),
'todas_ocis_selecionadas' => DataUtil::getBooleanValueFromStringBoolean(request()->get('todas_ocis_selecionadas')),
'todas_etapas_clinicas_selecionadas' => DataUtil::getBooleanValueFromStringBoolean(request()->get('todas_etapas_clinicas_selecionadas')),
];
$params->periodo = [
'start' => isset($params->periodo['start'])
? Carbon::createFromFormat('d/m/Y', $params->periodo['start'])->startOfDay()
: null,
'end' => isset($params->periodo['end'])
? Carbon::createFromFormat('d/m/Y', $params->periodo['end'])->endOfDay()
: null,
];
$params->periodo_movimentacao = [
'start' => isset($params->periodo_movimentacao['start'])
? Carbon::createFromFormat('d/m/Y', $params->periodo_movimentacao['start'])->startOfDay()
: null,
'end' => isset($params->periodo_movimentacao['end'])
? Carbon::createFromFormat('d/m/Y', $params->periodo_movimentacao['end'])->endOfDay()
: null,
];
$params->has_periodo = isset($params->periodo['start']) && isset($params->periodo['end']);
$params->has_periodo_movimentacao = isset($params->periodo_movimentacao['start'])
&& isset($params->periodo_movimentacao['end']);
self::setParamsPrestador($params);
return $params;
}
private static function setParamsPrestador($params)
{
$params->nenhum_prestador = empty($params->prestadores);
$params->prestadores_internos = [];
$params->prestadores_externos = [];
$params->semPrestador = false;
if (!$params->nenhum_prestador) {
foreach ($params->prestadores as $prestador) {
if (is_null($prestador)) {
$params->semPrestador = true;
continue;
}
$data = explode('#', $prestador);
if ($data[0] === 'interno') {
$params->prestadores_internos[] = $data[1];
}
else if ($data[0] === 'externo') {
$params->prestadores_externos[] = $data[1];
}
}
}
unset($params->prestadores);
}
public static function autocompletePaciente()
{
return DB::table('cadastro_paciente as paciente')
->join('cadastro_cidadao as cidadao', 'cidadao.id', 'paciente.cidadao_id')
->whereNull('paciente.deleted_at')
->selectRaw("
paciente.id,
cidadao.nome,
cidadao.nome_social,
cidadao.cns
");
}
private static function getUnidadesReguladoras($params)
{
$unidadesReguladoras = collect();
if ($params->has_periodo || $params->has_periodo_movimentacao || !is_null($params->paciente_id)) {
$unidadesReguladoras = DB::table('cadastro_unidade as unidade')
->whereNull('unidade.deleted_at')
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('cadastro_infraestrutura as infraestrutura')
->join(
'regulacao_parametrizacao_regulador as regulador',
'regulador.infraestrutura_id',
'infraestrutura.id'
)
->whereColumn('infraestrutura.unidade_id', 'unidade.id')
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('regulacao_solicitacao as solicitacao')
->join('regulacao_solicitacao_movimentacao as movimentacao', fn ($j) => $j
->on('movimentacao.solicitacao_id', 'solicitacao.id')
->where('movimentacao.id', fn ($q) => $q
->select('movimentacao2.id')
->from('regulacao_solicitacao_movimentacao as movimentacao2')
->whereColumn('movimentacao2.solicitacao_id', 'solicitacao.id')
->orderByDesc('movimentacao2.id')
->limit(1)
)
)
->join('cadastro_paciente as paciente', 'paciente.id', 'solicitacao.paciente_id')
->join('cadastro_cidadao as paciente_cidadao', 'paciente_cidadao.id', 'paciente.cidadao_id')
->whereColumn('solicitacao.regulador_id', 'regulador.id')
->whereNotNull('solicitacao.confirmado_em')
->when($params->periodo['start'], fn ($q, $start) => $q->where('solicitacao.data', '>=', $start))
->when($params->periodo['end'], fn ($q, $end) => $q->where('solicitacao.data', '<=', $end))
->when($params->periodo_movimentacao['start'], fn ($q, $start) => $q->where('movimentacao.movimentado_em', '>=', $start))
->when($params->periodo_movimentacao['end'], fn ($q, $end) => $q->where('movimentacao.movimentado_em', '<=', $end))
->when($params->paciente_id, fn ($q, $id) => $q->where('solicitacao.paciente_id', $id))
->when($params->idade_de, fn ($q, $idadeDe) => $q
->whereRaw("TIMESTAMPDIFF(YEAR, paciente_cidadao.data_nascimento, NOW()) >= {$idadeDe}")
)
->when($params->idade_ate, fn ($q, $idadeAte) => $q
->whereRaw("TIMESTAMPDIFF(YEAR, paciente_cidadao.data_nascimento, NOW()) <= {$idadeAte}")
)
)
)
->selectRaw("
unidade.id,
unidade.nome_fantasia
")
->orderBy('unidade.nome_fantasia')
->get();
}
$ids = $unidadesReguladoras->pluck('id')->all();
return ['form' => $unidadesReguladoras, 'model' => $ids];
}
private static function getReguladores($params)
{
$reguladores = collect();
if (!empty($params->unidades_reguladoras)) {
$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')
->whereIn('infraestrutura.unidade_id', $params->unidades_reguladoras)
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('regulacao_solicitacao as solicitacao')
->join('regulacao_solicitacao_movimentacao as movimentacao', fn ($j) => $j
->on('movimentacao.solicitacao_id', 'solicitacao.id')
->where('movimentacao.id', fn ($q) => $q
->select('movimentacao2.id')
->from('regulacao_solicitacao_movimentacao as movimentacao2')
->whereColumn('movimentacao2.solicitacao_id', 'solicitacao.id')
->orderByDesc('movimentacao2.id')
->limit(1)
)
)
->join('cadastro_paciente as paciente', 'paciente.id', 'solicitacao.paciente_id')
->join('cadastro_cidadao as paciente_cidadao', 'paciente_cidadao.id', 'paciente.cidadao_id')
->whereColumn('solicitacao.regulador_id', 'regulador.id')
->whereNotNull('solicitacao.confirmado_em')
->when($params->periodo['start'], fn ($q, $start) => $q->where('solicitacao.data', '>=', $start))
->when($params->periodo['end'], fn ($q, $end) => $q->where('solicitacao.data', '<=', $end))
->when($params->periodo_movimentacao['start'], fn ($q, $start) => $q->where('movimentacao.movimentado_em', '>=', $start))
->when($params->periodo_movimentacao['end'], fn ($q, $end) => $q->where('movimentacao.movimentado_em', '<=', $end))
->when($params->paciente_id, fn ($q, $id) => $q->where('solicitacao.paciente_id', $id))
->when($params->idade_de, fn ($q, $idadeDe) => $q
->whereRaw("TIMESTAMPDIFF(YEAR, paciente_cidadao.data_nascimento, NOW()) >= {$idadeDe}")
)
->when($params->idade_ate, fn ($q, $idadeAte) => $q
->whereRaw("TIMESTAMPDIFF(YEAR, paciente_cidadao.data_nascimento, NOW()) <= {$idadeAte}")
)
)
->selectRaw("
regulador.id,
COALESCE(infraestrutura.nome, unidade.nome_fantasia) as nome
")
->orderByRaw("COALESCE(infraestrutura.nome, unidade.nome_fantasia)")
->get();
}
$ids = $reguladores->pluck('id')->all();
return ['form' => $reguladores, 'model' => $ids];
}
private static function getUnidadesSolicitantes($params)
{
$unidadesSolicitantes = collect();
if ($params->has_periodo || $params->has_periodo_movimentacao || !is_null($params->paciente_id)) {
$unidadesSolicitantes = DB::table('cadastro_unidade as unidade')
->whereNull('unidade.deleted_at')
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('cadastro_infraestrutura as infraestrutura_solicitante')
->whereColumn('infraestrutura_solicitante.unidade_id', 'unidade.id')
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('regulacao_solicitacao as solicitacao')
->join('regulacao_solicitacao_movimentacao as movimentacao', fn ($j) => $j
->on('movimentacao.solicitacao_id', 'solicitacao.id')
->where('movimentacao.id', fn ($q) => $q
->select('movimentacao2.id')
->from('regulacao_solicitacao_movimentacao as movimentacao2')
->whereColumn('movimentacao2.solicitacao_id', 'solicitacao.id')
->orderByDesc('movimentacao2.id')
->limit(1)
)
)
->join('cadastro_paciente as paciente', 'paciente.id', 'solicitacao.paciente_id')
->join('cadastro_cidadao as paciente_cidadao', 'paciente_cidadao.id', 'paciente.cidadao_id')
->join(
'regulacao_parametrizacao_regulador as regulador',
'regulador.id',
'solicitacao.regulador_id'
)
->join(
'cadastro_infraestrutura as infraestrutura_reguladora',
'infraestrutura_reguladora.id',
'regulador.infraestrutura_id'
)
->whereColumn('solicitacao.infraestrutura_solicitante_id', 'infraestrutura_solicitante.id')
->whereNotNull('solicitacao.confirmado_em')
->when($params->periodo['start'], fn ($q, $start) => $q->where('solicitacao.data', '>=', $start))
->when($params->periodo['end'], fn ($q, $end) => $q->where('solicitacao.data', '<=', $end))
->when($params->periodo_movimentacao['start'], fn ($q, $start) => $q->where('movimentacao.movimentado_em', '>=', $start))
->when($params->periodo_movimentacao['end'], fn ($q, $end) => $q->where('movimentacao.movimentado_em', '<=', $end))
->when($params->paciente_id, fn ($q, $id) => $q->where('solicitacao.paciente_id', $id))
->when($params->idade_de, fn ($q, $idadeDe) => $q
->whereRaw("TIMESTAMPDIFF(YEAR, paciente_cidadao.data_nascimento, NOW()) >= {$idadeDe}")
)
->when($params->idade_ate, fn ($q, $idadeAte) => $q
->whereRaw("TIMESTAMPDIFF(YEAR, paciente_cidadao.data_nascimento, NOW()) <= {$idadeAte}")
)
->whereIn('infraestrutura_reguladora.unidade_id', $params->unidades_reguladoras)
->whereIn('solicitacao.regulador_id', $params->reguladores)
)
)
->selectRaw("
unidade.id,
unidade.nome_fantasia
")
->orderBy('unidade.nome_fantasia')
->get();
}
$ids = $unidadesSolicitantes->pluck('id')->all();
return ['form' => $unidadesSolicitantes, 'model' => $ids];
}
private static function getInfraestruturasSolicitantes($params)
{
$infraestruturasSolicitantes = collect();
if (!empty($params->unidades_solicitantes)) {
$infraestruturasSolicitantes = DB::table('cadastro_infraestrutura as infraestrutura')
->join('cadastro_unidade as unidade', 'unidade.id', 'infraestrutura.unidade_id')
->whereNull('infraestrutura.deleted_at')
->whereIn('infraestrutura.unidade_id', $params->unidades_solicitantes)
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('regulacao_solicitacao as solicitacao')
->join('regulacao_solicitacao_movimentacao as movimentacao', fn ($j) => $j
->on('movimentacao.solicitacao_id', 'solicitacao.id')
->where('movimentacao.id', fn ($q) => $q
->select('movimentacao2.id')
->from('regulacao_solicitacao_movimentacao as movimentacao2')
->whereColumn('movimentacao2.solicitacao_id', 'solicitacao.id')
->orderByDesc('movimentacao2.id')
->limit(1)
)
)
->join('cadastro_paciente as paciente', 'paciente.id', 'solicitacao.paciente_id')
->join('cadastro_cidadao as paciente_cidadao', 'paciente_cidadao.id', 'paciente.cidadao_id')
->join(
'regulacao_parametrizacao_regulador as regulador',
'regulador.id',
'solicitacao.regulador_id'
)
->join(
'cadastro_infraestrutura as infraestrutura_reguladora',
'infraestrutura_reguladora.id',
'regulador.infraestrutura_id'
)
->whereColumn('solicitacao.infraestrutura_solicitante_id', 'infraestrutura.id')
->whereNotNull('solicitacao.confirmado_em')
->when($params->periodo['start'], fn ($q, $start) => $q->where('solicitacao.data', '>=', $start))
->when($params->periodo['end'], fn ($q, $end) => $q->where('solicitacao.data', '<=', $end))
->when($params->periodo_movimentacao['start'], fn ($q, $start) => $q->where('movimentacao.movimentado_em', '>=', $start))
->when($params->periodo_movimentacao['end'], fn ($q, $end) => $q->where('movimentacao.movimentado_em', '<=', $end))
->when($params->paciente_id, fn ($q, $id) => $q->where('solicitacao.paciente_id', $id))
->when($params->idade_de, fn ($q, $idadeDe) => $q
->whereRaw("TIMESTAMPDIFF(YEAR, paciente_cidadao.data_nascimento, NOW()) >= {$idadeDe}")
)
->when($params->idade_ate, fn ($q, $idadeAte) => $q
->whereRaw("TIMESTAMPDIFF(YEAR, paciente_cidadao.data_nascimento, NOW()) <= {$idadeAte}")
)
->whereIn('infraestrutura_reguladora.unidade_id', $params->unidades_reguladoras)
->whereIn('solicitacao.regulador_id', $params->reguladores)
)
->selectRaw("
infraestrutura.id,
COALESCE(infraestrutura.nome, unidade.nome_fantasia) as nome
")
->orderByRaw("COALESCE(infraestrutura.nome, unidade.nome_fantasia)")
->get();
}
$ids = $infraestruturasSolicitantes->pluck('id')->all();
return ['form' => $infraestruturasSolicitantes, 'model' => $ids];
}
private static function getUnidadesReferencia($params)
{
$unidadesReferencia = collect();
if ($params->has_periodo || $params->has_periodo_movimentacao || !is_null($params->paciente_id)) {
$unidadesReferencia = DB::table('cadastro_unidade as unidade')
->whereNull('unidade.deleted_at')
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('cadastro_paciente as paciente')
->join('cadastro_cidadao as paciente_cidadao', 'paciente_cidadao.id', 'paciente.cidadao_id')
->whereColumn('paciente.unidade_id', 'unidade.id')
->when($params->paciente_id, fn ($q, $id) => $q->where('paciente.id', $id))
->when($params->idade_de, fn ($q, $idadeDe) => $q
->whereRaw("TIMESTAMPDIFF(YEAR, paciente_cidadao.data_nascimento, NOW()) >= {$idadeDe}")
)
->when($params->idade_ate, fn ($q, $idadeAte) => $q
->whereRaw("TIMESTAMPDIFF(YEAR, paciente_cidadao.data_nascimento, NOW()) <= {$idadeAte}")
)
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('regulacao_solicitacao as solicitacao')
->join('regulacao_solicitacao_movimentacao as movimentacao', fn ($j) => $j
->on('movimentacao.solicitacao_id', 'solicitacao.id')
->where('movimentacao.id', fn ($q) => $q
->select('movimentacao2.id')
->from('regulacao_solicitacao_movimentacao as movimentacao2')
->whereColumn('movimentacao2.solicitacao_id', 'solicitacao.id')
->orderByDesc('movimentacao2.id')
->limit(1)
)
)
->join(
'regulacao_parametrizacao_regulador as regulador',
'regulador.id',
'solicitacao.regulador_id'
)
->join(
'cadastro_infraestrutura as infraestrutura_reguladora',
'infraestrutura_reguladora.id',
'regulador.infraestrutura_id'
)
->join(
'cadastro_infraestrutura as infraestrutura_solicitante',
'infraestrutura_solicitante.id',
'solicitacao.infraestrutura_solicitante_id'
)
->whereColumn('solicitacao.paciente_id', 'paciente.id')
->whereNotNull('solicitacao.confirmado_em')
->when($params->periodo['start'], fn ($q, $start) => $q->where('solicitacao.data', '>=', $start))
->when($params->periodo['end'], fn ($q, $end) => $q->where('solicitacao.data', '<=', $end))
->when($params->periodo_movimentacao['start'], fn ($q, $start) => $q->where('movimentacao.movimentado_em', '>=', $start))
->when($params->periodo_movimentacao['end'], fn ($q, $end) => $q->where('movimentacao.movimentado_em', '<=', $end))
->whereIn('infraestrutura_reguladora.unidade_id', $params->unidades_reguladoras)
->whereIn('solicitacao.regulador_id', $params->reguladores)
->whereIn('infraestrutura_solicitante.unidade_id', $params->unidades_solicitantes)
->whereIn('solicitacao.infraestrutura_solicitante_id', $params->infraestruturas_solicitantes)
)
)
->selectRaw("
unidade.id,
unidade.nome_fantasia
")
->orderBy('unidade.nome_fantasia')
->get();
}
$ids = $unidadesReferencia->pluck('id')->all();
return ['form' => $unidadesReferencia, 'model' => $ids];
}
private static function getUsuariosSolicitantes($params)
{
$usuariosSolicitantes = collect();
if ($params->has_periodo || $params->has_periodo_movimentacao || !is_null($params->paciente_id)) {
$usuariosSolicitantes = DB::table('cadastro_usuario as usuario')
->join('cadastro_cidadao as cidadao', 'cidadao.id', 'usuario.cidadao_id')
->whereNull('usuario.deleted_at')
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('regulacao_solicitacao as solicitacao')
->join('regulacao_solicitacao_movimentacao as movimentacao', fn ($j) => $j
->on('movimentacao.solicitacao_id', 'solicitacao.id')
->where('movimentacao.id', fn ($q) => $q
->select('movimentacao2.id')
->from('regulacao_solicitacao_movimentacao as movimentacao2')
->whereColumn('movimentacao2.solicitacao_id', 'solicitacao.id')
->orderByDesc('movimentacao2.id')
->limit(1)
)
)
->join('cadastro_paciente as paciente', 'paciente.id', 'solicitacao.paciente_id')
->join('cadastro_cidadao as paciente_cidadao', 'paciente_cidadao.id', 'paciente.cidadao_id')
->join(
'regulacao_parametrizacao_regulador as regulador',
'regulador.id',
'solicitacao.regulador_id'
)
->join(
'cadastro_infraestrutura as infraestrutura_reguladora',
'infraestrutura_reguladora.id',
'regulador.infraestrutura_id'
)
->join(
'cadastro_infraestrutura as infraestrutura_solicitante',
'infraestrutura_solicitante.id',
'solicitacao.infraestrutura_solicitante_id'
)
->whereColumn('solicitacao.usuario_solicitante_id', 'usuario.id')
->whereNotNull('solicitacao.confirmado_em')
->when($params->periodo['start'], fn ($q, $start) => $q->where('solicitacao.data', '>=', $start))
->when($params->periodo['end'], fn ($q, $end) => $q->where('solicitacao.data', '<=', $end))
->when($params->periodo_movimentacao['start'], fn ($q, $start) => $q->where('movimentacao.movimentado_em', '>=', $start))
->when($params->periodo_movimentacao['end'], fn ($q, $end) => $q->where('movimentacao.movimentado_em', '<=', $end))
->when($params->paciente_id, fn ($q, $id) => $q->where('solicitacao.paciente_id', $id))
->when($params->idade_de, fn ($q, $idadeDe) => $q
->whereRaw("TIMESTAMPDIFF(YEAR, paciente_cidadao.data_nascimento, NOW()) >= {$idadeDe}")
)
->when($params->idade_ate, fn ($q, $idadeAte) => $q
->whereRaw("TIMESTAMPDIFF(YEAR, paciente_cidadao.data_nascimento, NOW()) <= {$idadeAte}")
)
->whereIn('infraestrutura_reguladora.unidade_id', $params->unidades_reguladoras)
->whereIn('solicitacao.regulador_id', $params->reguladores)
->whereIn('infraestrutura_solicitante.unidade_id', $params->unidades_solicitantes)
->whereIn('solicitacao.infraestrutura_solicitante_id', $params->infraestruturas_solicitantes)
->when(!empty($params->unidades_referencias), fn ($q) => $q
->whereIn('paciente.unidade_id', $params->unidades_referencias)
)
)
->selectRaw("
usuario.id,
cidadao.nome
")
->orderBy('cidadao.nome')
->get();
}
$ids = $usuariosSolicitantes->pluck('id')->all();
return ['form' => $usuariosSolicitantes, 'model' => $ids];
}
private static function getPrestadores($params)
{
$prestadores = collect();
if ($params->has_periodo || $params->has_periodo_movimentacao || !is_null($params->paciente_id)) {
$prestadores = DB::query()
->fromSub(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')
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('regulacao_solicitacao as solicitacao')
->join('regulacao_solicitacao_movimentacao as movimentacao', fn ($j) => $j
->on('movimentacao.solicitacao_id', 'solicitacao.id')
->where('movimentacao.id', fn ($q) => $q
->select('movimentacao2.id')
->from('regulacao_solicitacao_movimentacao as movimentacao2')
->whereColumn('movimentacao2.solicitacao_id', 'solicitacao.id')
->orderByDesc('movimentacao2.id')
->limit(1)
)
)
->join('cadastro_paciente as paciente', 'paciente.id', 'solicitacao.paciente_id')
->join('cadastro_cidadao as paciente_cidadao', 'paciente_cidadao.id', 'paciente.cidadao_id')
->join(
'regulacao_parametrizacao_regulador as regulador',
'regulador.id',
'solicitacao.regulador_id'
)
->join(
'cadastro_infraestrutura as infraestrutura_reguladora',
'infraestrutura_reguladora.id',
'regulador.infraestrutura_id'
)
->join(
'cadastro_infraestrutura as infraestrutura_solicitante',
'infraestrutura_solicitante.id',
'solicitacao.infraestrutura_solicitante_id'
)
->whereColumn('solicitacao.prestador_interno_id', 'prestador_interno.id')
->whereNotNull('solicitacao.prestador_interno_id')
->whereNotNull('solicitacao.confirmado_em')
->when($params->periodo['start'], fn ($q, $start) => $q->where('solicitacao.data', '>=', $start))
->when($params->periodo['end'], fn ($q, $end) => $q->where('solicitacao.data', '<=', $end))
->when($params->periodo_movimentacao['start'], fn ($q, $start) => $q->where('movimentacao.movimentado_em', '>=', $start))
->when($params->periodo_movimentacao['end'], fn ($q, $end) => $q->where('movimentacao.movimentado_em', '<=', $end))
->when($params->paciente_id, fn ($q, $id) => $q->where('solicitacao.paciente_id', $id))
->when($params->idade_de, fn ($q, $idadeDe) => $q
->whereRaw("TIMESTAMPDIFF(YEAR, paciente_cidadao.data_nascimento, NOW()) >= {$idadeDe}")
)
->when($params->idade_ate, fn ($q, $idadeAte) => $q
->whereRaw("TIMESTAMPDIFF(YEAR, paciente_cidadao.data_nascimento, NOW()) <= {$idadeAte}")
)
->whereIn('infraestrutura_reguladora.unidade_id', $params->unidades_reguladoras)
->whereIn('solicitacao.regulador_id', $params->reguladores)
->whereIn('infraestrutura_solicitante.unidade_id', $params->unidades_solicitantes)
->whereIn('solicitacao.infraestrutura_solicitante_id', $params->infraestruturas_solicitantes)
->when(!empty($params->unidades_referencias), fn ($q) => $q
->whereIn('paciente.unidade_id', $params->unidades_referencias)
)
->whereIn('solicitacao.usuario_solicitante_id', $params->usuarios_solicitantes)
)
->selectRaw("
'interno' as tipo,
prestador_interno.id,
IF(infraestrutura.principal = 1,
unidade.nome_fantasia,
CONCAT(unidade.nome_fantasia, ' - ', infraestrutura.nome)
) as nome
")
->unionAll(DB::table('regulacao_parametrizacao_prestador_externo as prestador_externo')
->join('transporte_paciente_destino as destino', 'destino.id', 'prestador_externo.destino_id')
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('regulacao_solicitacao as solicitacao')
->join('regulacao_solicitacao_movimentacao as movimentacao', fn ($j) => $j
->on('movimentacao.solicitacao_id', 'solicitacao.id')
->where('movimentacao.id', fn ($q) => $q
->select('movimentacao2.id')
->from('regulacao_solicitacao_movimentacao as movimentacao2')
->whereColumn('movimentacao2.solicitacao_id', 'solicitacao.id')
->orderByDesc('movimentacao2.id')
->limit(1)
)
)
->join('cadastro_paciente as paciente', 'paciente.id', 'solicitacao.paciente_id')
->join('cadastro_cidadao as paciente_cidadao', 'paciente_cidadao.id', 'paciente.cidadao_id')
->join(
'regulacao_parametrizacao_regulador as regulador',
'regulador.id',
'solicitacao.regulador_id'
)
->join(
'cadastro_infraestrutura as infraestrutura_reguladora',
'infraestrutura_reguladora.id',
'regulador.infraestrutura_id'
)
->join(
'cadastro_infraestrutura as infraestrutura_solicitante',
'infraestrutura_solicitante.id',
'solicitacao.infraestrutura_solicitante_id'
)
->whereColumn('solicitacao.prestador_externo_id', 'prestador_externo.id')
->whereNotNull('solicitacao.prestador_externo_id')
->whereNotNull('solicitacao.confirmado_em')
->when($params->periodo['start'], fn ($q, $start) => $q->where('solicitacao.data', '>=', $start))
->when($params->periodo['end'], fn ($q, $end) => $q->where('solicitacao.data', '<=', $end))
->when($params->periodo_movimentacao['start'], fn ($q, $start) => $q->where('movimentacao.movimentado_em', '>=', $start))
->when($params->periodo_movimentacao['end'], fn ($q, $end) => $q->where('movimentacao.movimentado_em', '<=', $end))
->when($params->paciente_id, fn ($q, $id) => $q->where('solicitacao.paciente_id', $id))
->when($params->idade_de, fn ($q, $idadeDe) => $q
->whereRaw("TIMESTAMPDIFF(YEAR, paciente_cidadao.data_nascimento, NOW()) >= {$idadeDe}")
)
->when($params->idade_ate, fn ($q, $idadeAte) => $q
->whereRaw("TIMESTAMPDIFF(YEAR, paciente_cidadao.data_nascimento, NOW()) <= {$idadeAte}")
)
->whereIn('infraestrutura_reguladora.unidade_id', $params->unidades_reguladoras)
->whereIn('solicitacao.regulador_id', $params->reguladores)
->whereIn('infraestrutura_solicitante.unidade_id', $params->unidades_solicitantes)
->whereIn('solicitacao.infraestrutura_solicitante_id', $params->infraestruturas_solicitantes)
->when(!empty($params->unidades_referencias), fn ($q) => $q
->whereIn('paciente.unidade_id', $params->unidades_referencias)
)
->whereIn('solicitacao.usuario_solicitante_id', $params->usuarios_solicitantes)
)
->selectRaw("
'externo' as tipo,
prestador_externo.id,
destino.descricao_destino as nome
")
)
, 'prestador')
->selectRaw("
CONCAT(prestador.tipo, '#', prestador.id) as value,
prestador.nome
")
->orderBy('prestador.nome')
->get();
}
$prestadores->push((object) [
'value' => null,
'nome' => 'Nenhum',
]);
$values = [];
return ['form' => $prestadores, 'model' => $values];
}
private static function getStatus($params)
{
$status = collect();
if ($params->has_periodo || $params->has_periodo_movimentacao || !is_null($params->paciente_id)) {
$status = DB::table('regulacao_status as status')
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('regulacao_solicitacao as solicitacao')
->join('regulacao_solicitacao_movimentacao as movimentacao', fn ($j) => $j
->on('movimentacao.solicitacao_id', 'solicitacao.id')
->where('movimentacao.id', fn ($q) => $q
->select('movimentacao2.id')
->from('regulacao_solicitacao_movimentacao as movimentacao2')
->whereColumn('movimentacao2.solicitacao_id', 'solicitacao.id')
->orderByDesc('movimentacao2.id')
->limit(1)
)
)
->join('cadastro_paciente as paciente', 'paciente.id', 'solicitacao.paciente_id')
->join('cadastro_cidadao as paciente_cidadao', 'paciente_cidadao.id', 'paciente.cidadao_id')
->join(
'regulacao_parametrizacao_regulador as regulador',
'regulador.id',
'solicitacao.regulador_id'
)
->join(
'cadastro_infraestrutura as infraestrutura_reguladora',
'infraestrutura_reguladora.id',
'regulador.infraestrutura_id'
)
->join(
'cadastro_infraestrutura as infraestrutura_solicitante',
'infraestrutura_solicitante.id',
'solicitacao.infraestrutura_solicitante_id'
)
->whereColumn('solicitacao.status_id', 'status.id')
->whereNotNull('solicitacao.confirmado_em')
->when($params->periodo['start'], fn ($q, $start) => $q->where('solicitacao.data', '>=', $start))
->when($params->periodo['end'], fn ($q, $end) => $q->where('solicitacao.data', '<=', $end))
->when($params->periodo_movimentacao['start'], fn ($q, $start) => $q->where('movimentacao.movimentado_em', '>=', $start))
->when($params->periodo_movimentacao['end'], fn ($q, $end) => $q->where('movimentacao.movimentado_em', '<=', $end))
->when($params->paciente_id, fn ($q, $id) => $q->where('solicitacao.paciente_id', $id))
->when($params->idade_de, fn ($q, $idadeDe) => $q
->whereRaw("TIMESTAMPDIFF(YEAR, paciente_cidadao.data_nascimento, NOW()) >= {$idadeDe}")
)
->when($params->idade_ate, fn ($q, $idadeAte) => $q
->whereRaw("TIMESTAMPDIFF(YEAR, paciente_cidadao.data_nascimento, NOW()) <= {$idadeAte}")
)
->whereIn('infraestrutura_reguladora.unidade_id', $params->unidades_reguladoras)
->whereIn('solicitacao.regulador_id', $params->reguladores)
->whereIn('infraestrutura_solicitante.unidade_id', $params->unidades_solicitantes)
->whereIn('solicitacao.infraestrutura_solicitante_id', $params->infraestruturas_solicitantes)
->when(!empty($params->unidades_referencias), fn ($q) => $q
->whereIn('paciente.unidade_id', $params->unidades_referencias)
)
->whereIn('solicitacao.usuario_solicitante_id', $params->usuarios_solicitantes)
->when($params->nenhum_prestador,
fn ($q) => $q
->whereNull('solicitacao.prestador_interno_id')
->whereNull('solicitacao.prestador_externo_id'),
fn ($q) => $q->where(function ($q) use ($params) {
$q->whereIn('solicitacao.prestador_interno_id', $params->prestadores_internos)
->orWhereIn('solicitacao.prestador_externo_id', $params->prestadores_externos);
if ($params->semPrestador) {
$q->orWhere(function ($q) {
$q->whereNull('solicitacao.prestador_interno_id')
->whereNull('solicitacao.prestador_externo_id');
});
}
})
)
)
->selectRaw("
status.id,
status.nome
")
->orderBy('status.nome')
->get();
}
$ids = $status->pluck('id')->all();
return ['form' => $status, 'model' => $ids];
}
private static function getOpcoesRetiradasProtocoloAgendamento($params)
{
$opcoes = collect();
if ($params->has_periodo || $params->has_periodo_movimentacao || !is_null($params->paciente_id)) {
$opcoes = DB::table('regulacao_parametrizacao_opcao_retirada_protocolo_agendamento as opcao')
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('regulacao_solicitacao as solicitacao')
->join('regulacao_solicitacao_movimentacao as movimentacao', fn ($j) => $j
->on('movimentacao.solicitacao_id', 'solicitacao.id')
->where('movimentacao.id', fn ($q) => $q
->select('movimentacao2.id')
->from('regulacao_solicitacao_movimentacao as movimentacao2')
->whereColumn('movimentacao2.solicitacao_id', 'solicitacao.id')
->orderByDesc('movimentacao2.id')
->limit(1)
)
)
->join('cadastro_paciente as paciente', 'paciente.id', 'solicitacao.paciente_id')
->join('cadastro_cidadao as paciente_cidadao', 'paciente_cidadao.id', 'paciente.cidadao_id')
->join(
'regulacao_parametrizacao_regulador as regulador',
'regulador.id',
'solicitacao.regulador_id'
)
->join(
'cadastro_infraestrutura as infraestrutura_reguladora',
'infraestrutura_reguladora.id',
'regulador.infraestrutura_id'
)
->join(
'cadastro_infraestrutura as infraestrutura_solicitante',
'infraestrutura_solicitante.id',
'solicitacao.infraestrutura_solicitante_id'
)
->whereColumn('solicitacao.opcao_retirada_protocolo_agendamento_id', 'opcao.id')
->whereNotNull('solicitacao.opcao_retirada_protocolo_agendamento_id')
->whereNotNull('solicitacao.confirmado_em')
->when($params->periodo['start'], fn ($q, $start) => $q->where('solicitacao.data', '>=', $start))
->when($params->periodo['end'], fn ($q, $end) => $q->where('solicitacao.data', '<=', $end))
->when($params->periodo_movimentacao['start'], fn ($q, $start) => $q->where('movimentacao.movimentado_em', '>=', $start))
->when($params->periodo_movimentacao['end'], fn ($q, $end) => $q->where('movimentacao.movimentado_em', '<=', $end))
->when($params->paciente_id, fn ($q, $id) => $q->where('solicitacao.paciente_id', $id))
->when($params->idade_de, fn ($q, $idadeDe) => $q
->whereRaw("TIMESTAMPDIFF(YEAR, paciente_cidadao.data_nascimento, NOW()) >= {$idadeDe}")
)
->when($params->idade_ate, fn ($q, $idadeAte) => $q
->whereRaw("TIMESTAMPDIFF(YEAR, paciente_cidadao.data_nascimento, NOW()) <= {$idadeAte}")
)
->whereIn('infraestrutura_reguladora.unidade_id', $params->unidades_reguladoras)
->whereIn('solicitacao.regulador_id', $params->reguladores)
->whereIn('infraestrutura_solicitante.unidade_id', $params->unidades_solicitantes)
->whereIn('solicitacao.infraestrutura_solicitante_id', $params->infraestruturas_solicitantes)
->when(!empty($params->unidades_referencias), fn ($q) => $q
->whereIn('paciente.unidade_id', $params->unidades_referencias)
)
->whereIn('solicitacao.usuario_solicitante_id', $params->usuarios_solicitantes)
->when($params->nenhum_prestador,
fn ($q) => $q
->whereNull('solicitacao.prestador_interno_id')
->whereNull('solicitacao.prestador_externo_id'),
fn ($q) => $q->where(function ($q) use ($params) {
$q->whereIn('solicitacao.prestador_interno_id', $params->prestadores_internos)
->orWhereIn('solicitacao.prestador_externo_id', $params->prestadores_externos);
if ($params->semPrestador) {
$q->orWhere(function ($q) {
$q->whereNull('solicitacao.prestador_interno_id')
->whereNull('solicitacao.prestador_externo_id');
});
}
})
)
->whereIn('solicitacao.status_id', $params->status)
)
->selectRaw("
opcao.id,
opcao.nome
")
->orderBy('opcao.nome')
->get();
}
$opcoes->push((object) [
'value' => null,
'nome' => 'Nenhum',
]);
$ids = [];
return ['form' => $opcoes, 'model' => $ids];
}
private static function getGrupos($params)
{
$grupos = collect();
if ($params->has_periodo || $params->has_periodo_movimentacao || !is_null($params->paciente_id)) {
$grupos = DB::table('cadastro_grupo as grupo')
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('parametrizacao_exame as exame')
->whereColumn('exame.grupo_tipo_id', 'grupo.id')
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('regulacao_solicitacao_item as item')
->join('regulacao_solicitacao as solicitacao', 'solicitacao.id', 'item.solicitacao_id')
->join('regulacao_solicitacao_movimentacao as movimentacao', fn ($j) => $j
->on('movimentacao.solicitacao_id', 'solicitacao.id')
->where('movimentacao.id', fn ($q) => $q
->select('movimentacao2.id')
->from('regulacao_solicitacao_movimentacao as movimentacao2')
->whereColumn('movimentacao2.solicitacao_id', 'solicitacao.id')
->orderByDesc('movimentacao2.id')
->limit(1)
)
)
->join('cadastro_paciente as paciente', 'paciente.id', 'solicitacao.paciente_id')
->join('cadastro_cidadao as paciente_cidadao', 'paciente_cidadao.id', 'paciente.cidadao_id')
->join(
'regulacao_parametrizacao_regulador as regulador',
'regulador.id',
'solicitacao.regulador_id'
)
->join(
'cadastro_infraestrutura as infraestrutura_reguladora',
'infraestrutura_reguladora.id',
'regulador.infraestrutura_id'
)
->join(
'cadastro_infraestrutura as infraestrutura_solicitante',
'infraestrutura_solicitante.id',
'solicitacao.infraestrutura_solicitante_id'
)
->whereColumn('item.exame_id', 'exame.id')
->whereNotNull('item.exame_id')
->whereNotNull('solicitacao.confirmado_em')
->when($params->periodo['start'], fn ($q, $start) => $q->where('solicitacao.data', '>=', $start))
->when($params->periodo['end'], fn ($q, $end) => $q->where('solicitacao.data', '<=', $end))
->when($params->periodo_movimentacao['start'], fn ($q, $start) => $q->where('movimentacao.movimentado_em', '>=', $start))
->when($params->periodo_movimentacao['end'], fn ($q, $end) => $q->where('movimentacao.movimentado_em', '<=', $end))
->when($params->paciente_id, fn ($q, $id) => $q->where('solicitacao.paciente_id', $id))
->when($params->idade_de, fn ($q, $idadeDe) => $q
->whereRaw("TIMESTAMPDIFF(YEAR, paciente_cidadao.data_nascimento, NOW()) >= {$idadeDe}")
)
->when($params->idade_ate, fn ($q, $idadeAte) => $q
->whereRaw("TIMESTAMPDIFF(YEAR, paciente_cidadao.data_nascimento, NOW()) <= {$idadeAte}")
)
->whereIn('infraestrutura_reguladora.unidade_id', $params->unidades_reguladoras)
->whereIn('solicitacao.regulador_id', $params->reguladores)
->whereIn('infraestrutura_solicitante.unidade_id', $params->unidades_solicitantes)
->whereIn('solicitacao.infraestrutura_solicitante_id', $params->infraestruturas_solicitantes)
->when(!empty($params->unidades_referencias), fn ($q) => $q
->whereIn('paciente.unidade_id', $params->unidades_referencias)
)
->whereIn('solicitacao.usuario_solicitante_id', $params->usuarios_solicitantes)
->when(
$params->nenhum_prestador,
fn ($q) => $q
->whereNull('solicitacao.prestador_interno_id')
->whereNull('solicitacao.prestador_externo_id'),
fn ($q) => $q->where(function ($q) use ($params) {
$q->whereIn('solicitacao.prestador_interno_id', $params->prestadores_internos)
->orWhereIn('solicitacao.prestador_externo_id', $params->prestadores_externos);
if ($params->semPrestador) {
$q->orWhere(function ($q) {
$q->whereNull('solicitacao.prestador_interno_id')
->whereNull('solicitacao.prestador_externo_id');
});
}
})
)
->whereIn('solicitacao.status_id', $params->status)
->when(!empty($params->opcoes_retirada_protocolo_agendamento), function ($q) use ($params) {
$valores = array_filter($params->opcoes_retirada_protocolo_agendamento, fn ($v) => !is_null($v));
$q->where(function ($q) use ($valores, $params) {
if (!empty($valores)) {
$q->whereIn('solicitacao.opcao_retirada_protocolo_agendamento_id', $valores);
}
if (in_array(null, $params->opcoes_retirada_protocolo_agendamento, true)) {
$q->orWhereNull('solicitacao.opcao_retirada_protocolo_agendamento_id');
}
});
})
)
)
->orWhereExists(fn ($q) => $q
->selectRaw(1)
->from('parametrizacao_procedimento_cirurgico as procedimento_cirurgico')
->whereColumn('procedimento_cirurgico.grupo_exame_id', 'grupo.id')
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('regulacao_solicitacao_item as item')
->join('regulacao_solicitacao as solicitacao', 'solicitacao.id', 'item.solicitacao_id')
->join('regulacao_solicitacao_movimentacao as movimentacao', fn ($j) => $j
->on('movimentacao.solicitacao_id', 'solicitacao.id')
->where('movimentacao.id', fn ($q) => $q
->select('movimentacao2.id')
->from('regulacao_solicitacao_movimentacao as movimentacao2')
->whereColumn('movimentacao2.solicitacao_id', 'solicitacao.id')
->orderByDesc('movimentacao2.id')
->limit(1)
)
)
->join('cadastro_paciente as paciente', 'paciente.id', 'solicitacao.paciente_id')
->join('cadastro_cidadao as paciente_cidadao', 'paciente_cidadao.id', 'paciente.cidadao_id')
->join(
'regulacao_parametrizacao_regulador as regulador',
'regulador.id',
'solicitacao.regulador_id'
)
->join(
'cadastro_infraestrutura as infraestrutura_reguladora',
'infraestrutura_reguladora.id',
'regulador.infraestrutura_id'
)
->join(
'cadastro_infraestrutura as infraestrutura_solicitante',
'infraestrutura_solicitante.id',
'solicitacao.infraestrutura_solicitante_id'
)
->whereColumn('item.procedimento_cirurgico_id', 'procedimento_cirurgico.id')
->whereNotNull('item.procedimento_cirurgico_id')
->whereNotNull('solicitacao.confirmado_em')
->when($params->periodo['start'], fn ($q, $start) => $q->where('solicitacao.data', '>=', $start))
->when($params->periodo['end'], fn ($q, $end) => $q->where('solicitacao.data', '<=', $end))
->when($params->periodo_movimentacao['start'], fn ($q, $start) => $q->where('movimentacao.movimentado_em', '>=', $start))
->when($params->periodo_movimentacao['end'], fn ($q, $end) => $q->where('movimentacao.movimentado_em', '<=', $end))
->when($params->paciente_id, fn ($q, $id) => $q->where('solicitacao.paciente_id', $id))
->when($params->idade_de, fn ($q, $idadeDe) => $q
->whereRaw("TIMESTAMPDIFF(YEAR, paciente_cidadao.data_nascimento, NOW()) >= {$idadeDe}")
)
->when($params->idade_ate, fn ($q, $idadeAte) => $q
->whereRaw("TIMESTAMPDIFF(YEAR, paciente_cidadao.data_nascimento, NOW()) <= {$idadeAte}")
)
->whereIn('infraestrutura_reguladora.unidade_id', $params->unidades_reguladoras)
->whereIn('solicitacao.regulador_id', $params->reguladores)
->whereIn('infraestrutura_solicitante.unidade_id', $params->unidades_solicitantes)
->whereIn('solicitacao.infraestrutura_solicitante_id', $params->infraestruturas_solicitantes)
->when(!empty($params->unidades_referencias), fn ($q) => $q
->whereIn('paciente.unidade_id', $params->unidades_referencias)
)
->whereIn('solicitacao.usuario_solicitante_id', $params->usuarios_solicitantes)
->when(
$params->nenhum_prestador,
fn ($q) => $q
->whereNull('solicitacao.prestador_interno_id')
->whereNull('solicitacao.prestador_externo_id'),
fn ($q) => $q->where(function ($q) use ($params) {
$q->whereIn('solicitacao.prestador_interno_id', $params->prestadores_internos)
->orWhereIn('solicitacao.prestador_externo_id', $params->prestadores_externos);
if ($params->semPrestador) {
$q->orWhere(function ($q) {
$q->whereNull('solicitacao.prestador_interno_id')
->whereNull('solicitacao.prestador_externo_id');
});
}
})
)
->whereIn('solicitacao.status_id', $params->status)
->when(!empty($params->opcoes_retirada_protocolo_agendamento), function ($q) use ($params) {
$valores = array_filter($params->opcoes_retirada_protocolo_agendamento, fn ($v) => !is_null($v));
$q->where(function ($q) use ($valores, $params) {
if (!empty($valores)) {
$q->whereIn('solicitacao.opcao_retirada_protocolo_agendamento_id', $valores);
}
if (in_array(null, $params->opcoes_retirada_protocolo_agendamento, true)) {
$q->orWhereNull('solicitacao.opcao_retirada_protocolo_agendamento_id');
}
});
})
)
)
->selectRaw("
grupo.id,
grupo.nome
")
->orderBy('grupo.nome')
->get();
}
$ids = $grupos->pluck('id')->all();
return ['form' => $grupos, 'model' => $ids];
}
private static function getExames($params)
{
$exames = collect();
if (!empty($params->grupos)) {
$exames = DB::table('parametrizacao_exame as exame')
->whereNull('exame.deleted_at')
->whereIn('exame.grupo_tipo_id', $params->grupos)
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('regulacao_solicitacao_item as item')
->join('regulacao_solicitacao as solicitacao', 'solicitacao.id', 'item.solicitacao_id')
->join('regulacao_solicitacao_movimentacao as movimentacao', fn ($j) => $j
->on('movimentacao.solicitacao_id', 'solicitacao.id')
->where('movimentacao.id', fn ($q) => $q
->select('movimentacao2.id')
->from('regulacao_solicitacao_movimentacao as movimentacao2')
->whereColumn('movimentacao2.solicitacao_id', 'solicitacao.id')
->orderByDesc('movimentacao2.id')
->limit(1)
)
)
->join('cadastro_paciente as paciente', 'paciente.id', 'solicitacao.paciente_id')
->join('cadastro_cidadao as paciente_cidadao', 'paciente_cidadao.id', 'paciente.cidadao_id')
->join(
'regulacao_parametrizacao_regulador as regulador',
'regulador.id',
'solicitacao.regulador_id'
)
->join(
'cadastro_infraestrutura as infraestrutura_reguladora',
'infraestrutura_reguladora.id',
'regulador.infraestrutura_id'
)
->join(
'cadastro_infraestrutura as infraestrutura_solicitante',
'infraestrutura_solicitante.id',
'solicitacao.infraestrutura_solicitante_id'
)
->whereColumn('item.exame_id', 'exame.id')
->whereNotNull('item.exame_id')
->whereNotNull('solicitacao.confirmado_em')
->when($params->periodo['start'], fn ($q, $start) => $q->where('solicitacao.data', '>=', $start))
->when($params->periodo['end'], fn ($q, $end) => $q->where('solicitacao.data', '<=', $end))
->when($params->periodo_movimentacao['start'], fn ($q, $start) => $q->where('movimentacao.movimentado_em', '>=', $start))
->when($params->periodo_movimentacao['end'], fn ($q, $end) => $q->where('movimentacao.movimentado_em', '<=', $end))
->when($params->paciente_id, fn ($q, $id) => $q->where('solicitacao.paciente_id', $id))
->when($params->idade_de, fn ($q, $idadeDe) => $q
->whereRaw("TIMESTAMPDIFF(YEAR, paciente_cidadao.data_nascimento, NOW()) >= {$idadeDe}")
)
->when($params->idade_ate, fn ($q, $idadeAte) => $q
->whereRaw("TIMESTAMPDIFF(YEAR, paciente_cidadao.data_nascimento, NOW()) <= {$idadeAte}")
)
->whereIn('infraestrutura_reguladora.unidade_id', $params->unidades_reguladoras)
->whereIn('solicitacao.regulador_id', $params->reguladores)
->whereIn('infraestrutura_solicitante.unidade_id', $params->unidades_solicitantes)
->whereIn('solicitacao.infraestrutura_solicitante_id', $params->infraestruturas_solicitantes)
->when(!empty($params->unidades_referencias), fn ($q) => $q
->whereIn('paciente.unidade_id', $params->unidades_referencias)
)
->whereIn('solicitacao.usuario_solicitante_id', $params->usuarios_solicitantes)
->when(
$params->nenhum_prestador,
fn ($q) => $q
->whereNull('solicitacao.prestador_interno_id')
->whereNull('solicitacao.prestador_externo_id'),
fn ($q) => $q->where(function ($q) use ($params) {
$q->whereIn('solicitacao.prestador_interno_id', $params->prestadores_internos)
->orWhereIn('solicitacao.prestador_externo_id', $params->prestadores_externos);
if ($params->semPrestador) {
$q->orWhere(function ($q) {
$q->whereNull('solicitacao.prestador_interno_id')
->whereNull('solicitacao.prestador_externo_id');
});
}
})
)
->whereIn('solicitacao.status_id', $params->status)
->when(!empty($params->opcoes_retirada_protocolo_agendamento), function ($q) use ($params) {
$valores = array_filter($params->opcoes_retirada_protocolo_agendamento, fn ($v) => !is_null($v));
$q->where(function ($q) use ($valores, $params) {
if (!empty($valores)) {
$q->whereIn('solicitacao.opcao_retirada_protocolo_agendamento_id', $valores);
}
if (in_array(null, $params->opcoes_retirada_protocolo_agendamento, true)) {
$q->orWhereNull('solicitacao.opcao_retirada_protocolo_agendamento_id');
}
});
})
)
->selectRaw("
exame.id,
exame.codigo,
exame.nome
")
->orderByRaw("exame.nome")
->get()
->map(fn ($exame) => [
'id' => $exame->id,
'descricao' => empty($exame->codigo)
? $exame->nome
: MaskUtil::getProcedimentoMasked($exame->codigo) . " - {$exame->nome}",
]);
}
$ids = $exames->pluck('id')->all();
return ['form' => $exames, 'model' => $ids];
}
private static function getProcedimentosCirurgicos($params)
{
$procedimentosCirurgicos = collect();
if (!empty($params->grupos)) {
$procedimentosCirurgicos = DB::table('parametrizacao_procedimento_cirurgico as procedimento_cirurgico')
->whereIn('procedimento_cirurgico.grupo_exame_id', $params->grupos)
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('regulacao_solicitacao_item as item')
->join('regulacao_solicitacao as solicitacao', 'solicitacao.id', 'item.solicitacao_id')
->join('regulacao_solicitacao_movimentacao as movimentacao', fn ($j) => $j
->on('movimentacao.solicitacao_id', 'solicitacao.id')
->where('movimentacao.id', fn ($q) => $q
->select('movimentacao2.id')
->from('regulacao_solicitacao_movimentacao as movimentacao2')
->whereColumn('movimentacao2.solicitacao_id', 'solicitacao.id')
->orderByDesc('movimentacao2.id')
->limit(1)
)
)
->join('cadastro_paciente as paciente', 'paciente.id', 'solicitacao.paciente_id')
->join('cadastro_cidadao as paciente_cidadao', 'paciente_cidadao.id', 'paciente.cidadao_id')
->join(
'regulacao_parametrizacao_regulador as regulador',
'regulador.id',
'solicitacao.regulador_id'
)
->join(
'cadastro_infraestrutura as infraestrutura_reguladora',
'infraestrutura_reguladora.id',
'regulador.infraestrutura_id'
)
->join(
'cadastro_infraestrutura as infraestrutura_solicitante',
'infraestrutura_solicitante.id',
'solicitacao.infraestrutura_solicitante_id'
)
->whereColumn('item.procedimento_cirurgico_id', 'procedimento_cirurgico.id')
->whereNotNull('item.procedimento_cirurgico_id')
->whereNotNull('solicitacao.confirmado_em')
->when($params->periodo['start'], fn ($q, $start) => $q->where('solicitacao.data', '>=', $start))
->when($params->periodo['end'], fn ($q, $end) => $q->where('solicitacao.data', '<=', $end))
->when($params->periodo_movimentacao['start'], fn ($q, $start) => $q->where('movimentacao.movimentado_em', '>=', $start))
->when($params->periodo_movimentacao['end'], fn ($q, $end) => $q->where('movimentacao.movimentado_em', '<=', $end))
->when($params->paciente_id, fn ($q, $id) => $q->where('solicitacao.paciente_id', $id))
->when($params->idade_de, fn ($q, $idadeDe) => $q
->whereRaw("TIMESTAMPDIFF(YEAR, paciente_cidadao.data_nascimento, NOW()) >= {$idadeDe}")
)
->when($params->idade_ate, fn ($q, $idadeAte) => $q
->whereRaw("TIMESTAMPDIFF(YEAR, paciente_cidadao.data_nascimento, NOW()) <= {$idadeAte}")
)
->whereIn('infraestrutura_reguladora.unidade_id', $params->unidades_reguladoras)
->whereIn('solicitacao.regulador_id', $params->reguladores)
->whereIn('infraestrutura_solicitante.unidade_id', $params->unidades_solicitantes)
->whereIn('solicitacao.infraestrutura_solicitante_id', $params->infraestruturas_solicitantes)
->when(!empty($params->unidades_referencias), fn ($q) => $q
->whereIn('paciente.unidade_id', $params->unidades_referencias)
)
->whereIn('solicitacao.usuario_solicitante_id', $params->usuarios_solicitantes)
->when(
$params->nenhum_prestador,
fn ($q) => $q
->whereNull('solicitacao.prestador_interno_id')
->whereNull('solicitacao.prestador_externo_id'),
fn ($q) => $q->where(function ($q) use ($params) {
$q->whereIn('solicitacao.prestador_interno_id', $params->prestadores_internos)
->orWhereIn('solicitacao.prestador_externo_id', $params->prestadores_externos);
if ($params->semPrestador) {
$q->orWhere(function ($q) {
$q->whereNull('solicitacao.prestador_interno_id')
->whereNull('solicitacao.prestador_externo_id');
});
}
})
)
->whereIn('solicitacao.status_id', $params->status)
->when(!empty($params->opcoes_retirada_protocolo_agendamento), function ($q) use ($params) {
$valores = array_filter($params->opcoes_retirada_protocolo_agendamento, fn ($v) => !is_null($v));
$q->where(function ($q) use ($valores, $params) {
if (!empty($valores)) {
$q->whereIn('solicitacao.opcao_retirada_protocolo_agendamento_id', $valores);
}
if (in_array(null, $params->opcoes_retirada_protocolo_agendamento, true)) {
$q->orWhereNull('solicitacao.opcao_retirada_protocolo_agendamento_id');
}
});
})
)
->selectRaw("
procedimento_cirurgico.id,
procedimento_cirurgico.procedimento_codigo as codigo,
procedimento_cirurgico.nome
")
->orderByRaw("procedimento_cirurgico.nome")
->get()
->map(fn ($procedimentoCirurgico) => [
'id' => $procedimentoCirurgico->id,
'descricao' => MaskUtil::getProcedimentoMasked($procedimentoCirurgico->codigo)
. " - {$procedimentoCirurgico->nome}",
]);
}
$ids = $procedimentosCirurgicos->pluck('id')->all();
return ['form' => $procedimentosCirurgicos, 'model' => $ids];
}
private static function getEspecialidades($params)
{
$especialidades = collect();
if ($params->has_periodo || $params->has_periodo_movimentacao || !is_null($params->paciente_id)) {
$especialidades = DB::table('cadastro_especialidade as especialidade')
->join('sigtap.ocupacao as ocupacao', 'ocupacao.id', 'especialidade.ocupacao_id')
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('regulacao_solicitacao_item as item')
->join('regulacao_solicitacao as solicitacao', 'solicitacao.id', 'item.solicitacao_id')
->join('regulacao_solicitacao_movimentacao as movimentacao', fn ($j) => $j
->on('movimentacao.solicitacao_id', 'solicitacao.id')
->where('movimentacao.id', fn ($q) => $q
->select('movimentacao2.id')
->from('regulacao_solicitacao_movimentacao as movimentacao2')
->whereColumn('movimentacao2.solicitacao_id', 'solicitacao.id')
->orderByDesc('movimentacao2.id')
->limit(1)
)
)
->join('cadastro_paciente as paciente', 'paciente.id', 'solicitacao.paciente_id')
->join('cadastro_cidadao as paciente_cidadao', 'paciente_cidadao.id', 'paciente.cidadao_id')
->join(
'regulacao_parametrizacao_regulador as regulador',
'regulador.id',
'solicitacao.regulador_id'
)
->join(
'cadastro_infraestrutura as infraestrutura_reguladora',
'infraestrutura_reguladora.id',
'regulador.infraestrutura_id'
)
->join(
'cadastro_infraestrutura as infraestrutura_solicitante',
'infraestrutura_solicitante.id',
'solicitacao.infraestrutura_solicitante_id'
)
->whereColumn('item.especialidade_id', 'especialidade.id')
->whereNotNull('item.especialidade_id')
->whereNotNull('solicitacao.confirmado_em')
->when($params->periodo['start'], fn ($q, $start) => $q->where('solicitacao.data', '>=', $start))
->when($params->periodo['end'], fn ($q, $end) => $q->where('solicitacao.data', '<=', $end))
->when($params->periodo_movimentacao['start'], fn ($q, $start) => $q->where('movimentacao.movimentado_em', '>=', $start))
->when($params->periodo_movimentacao['end'], fn ($q, $end) => $q->where('movimentacao.movimentado_em', '<=', $end))
->when($params->paciente_id, fn ($q, $id) => $q->where('solicitacao.paciente_id', $id))
->when($params->idade_de, fn ($q, $idadeDe) => $q
->whereRaw("TIMESTAMPDIFF(YEAR, paciente_cidadao.data_nascimento, NOW()) >= {$idadeDe}")
)
->when($params->idade_ate, fn ($q, $idadeAte) => $q
->whereRaw("TIMESTAMPDIFF(YEAR, paciente_cidadao.data_nascimento, NOW()) <= {$idadeAte}")
)
->whereIn('infraestrutura_reguladora.unidade_id', $params->unidades_reguladoras)
->whereIn('solicitacao.regulador_id', $params->reguladores)
->whereIn('infraestrutura_solicitante.unidade_id', $params->unidades_solicitantes)
->whereIn('solicitacao.infraestrutura_solicitante_id', $params->infraestruturas_solicitantes)
->when(!empty($params->unidades_referencias), fn ($q) => $q
->whereIn('paciente.unidade_id', $params->unidades_referencias)
)
->whereIn('solicitacao.usuario_solicitante_id', $params->usuarios_solicitantes)
->when(
$params->nenhum_prestador,
fn ($q) => $q
->whereNull('solicitacao.prestador_interno_id')
->whereNull('solicitacao.prestador_externo_id'),
fn ($q) => $q->where(function ($q) use ($params) {
$q->whereIn('solicitacao.prestador_interno_id', $params->prestadores_internos)
->orWhereIn('solicitacao.prestador_externo_id', $params->prestadores_externos);
if ($params->semPrestador) {
$q->orWhere(function ($q) {
$q->whereNull('solicitacao.prestador_interno_id')
->whereNull('solicitacao.prestador_externo_id');
});
}
})
)
->whereIn('solicitacao.status_id', $params->status)
->when(!empty($params->opcoes_retirada_protocolo_agendamento), function ($q) use ($params) {
$valores = array_filter($params->opcoes_retirada_protocolo_agendamento, fn ($v) => !is_null($v));
$q->where(function ($q) use ($valores, $params) {
if (!empty($valores)) {
$q->whereIn('solicitacao.opcao_retirada_protocolo_agendamento_id', $valores);
}
if (in_array(null, $params->opcoes_retirada_protocolo_agendamento, true)) {
$q->orWhereNull('solicitacao.opcao_retirada_protocolo_agendamento_id');
}
});
})
)
->selectRaw("
especialidade.id,
ocupacao.codigo,
especialidade.nome
")
->orderByRaw("especialidade.nome")
->get()
->map(fn ($especialidade) => [
'id' => $especialidade->id,
'descricao' => "{$especialidade->codigo} - {$especialidade->nome}",
]);
}
$ids = $especialidades->pluck('id')->all();
return ['form' => $especialidades, 'model' => $ids];
}
private static function getPrioridades($params)
{
$prioridades = collect();
if ($params->has_periodo || $params->has_periodo_movimentacao || !is_null($params->paciente_id)) {
$prioridades = DB::table('regulacao_solicitacao_prioridade as prioridade')
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('regulacao_solicitacao as solicitacao')
->join('regulacao_solicitacao_movimentacao as movimentacao', fn ($j) => $j
->on('movimentacao.solicitacao_id', 'solicitacao.id')
->where('movimentacao.id', fn ($q) => $q
->select('movimentacao2.id')
->from('regulacao_solicitacao_movimentacao as movimentacao2')
->whereColumn('movimentacao2.solicitacao_id', 'solicitacao.id')
->orderByDesc('movimentacao2.id')
->limit(1)
)
)
->join('cadastro_paciente as paciente', 'paciente.id', 'solicitacao.paciente_id')
->join('cadastro_cidadao as paciente_cidadao', 'paciente_cidadao.id', 'paciente.cidadao_id')
->join(
'regulacao_parametrizacao_regulador as regulador',
'regulador.id',
'solicitacao.regulador_id'
)
->join(
'cadastro_infraestrutura as infraestrutura_reguladora',
'infraestrutura_reguladora.id',
'regulador.infraestrutura_id'
)
->join(
'cadastro_infraestrutura as infraestrutura_solicitante',
'infraestrutura_solicitante.id',
'solicitacao.infraestrutura_solicitante_id'
)
->whereColumn('solicitacao.prioridade_id', 'prioridade.id')
->whereNotNull('solicitacao.confirmado_em')
->when($params->periodo['start'], fn ($q, $start) => $q->where('solicitacao.data', '>=', $start))
->when($params->periodo['end'], fn ($q, $end) => $q->where('solicitacao.data', '<=', $end))
->when($params->periodo_movimentacao['start'], fn ($q, $start) => $q->where('movimentacao.movimentado_em', '>=', $start))
->when($params->periodo_movimentacao['end'], fn ($q, $end) => $q->where('movimentacao.movimentado_em', '<=', $end))
->when($params->paciente_id, fn ($q, $id) => $q->where('solicitacao.paciente_id', $id))
->when($params->idade_de, fn ($q, $idadeDe) => $q
->whereRaw("TIMESTAMPDIFF(YEAR, paciente_cidadao.data_nascimento, NOW()) >= {$idadeDe}")
)
->when($params->idade_ate, fn ($q, $idadeAte) => $q
->whereRaw("TIMESTAMPDIFF(YEAR, paciente_cidadao.data_nascimento, NOW()) <= {$idadeAte}")
)
->whereIn('infraestrutura_reguladora.unidade_id', $params->unidades_reguladoras)
->whereIn('solicitacao.regulador_id', $params->reguladores)
->whereIn('infraestrutura_solicitante.unidade_id', $params->unidades_solicitantes)
->whereIn('solicitacao.infraestrutura_solicitante_id', $params->infraestruturas_solicitantes)
->when(!empty($params->unidades_referencias), fn ($q) => $q
->whereIn('paciente.unidade_id', $params->unidades_referencias)
)
->whereIn('solicitacao.usuario_solicitante_id', $params->usuarios_solicitantes)
->when(
$params->nenhum_prestador,
fn ($q) => $q
->whereNull('solicitacao.prestador_interno_id')
->whereNull('solicitacao.prestador_externo_id'),
fn ($q) => $q->where(function ($q) use ($params) {
$q->whereIn('solicitacao.prestador_interno_id', $params->prestadores_internos)
->orWhereIn('solicitacao.prestador_externo_id', $params->prestadores_externos);
if ($params->semPrestador) {
$q->orWhere(function ($q) {
$q->whereNull('solicitacao.prestador_interno_id')
->whereNull('solicitacao.prestador_externo_id');
});
}
})
)
->whereIn('solicitacao.status_id', $params->status)
->when(!empty($params->opcoes_retirada_protocolo_agendamento), function ($q) use ($params) {
$valores = array_filter($params->opcoes_retirada_protocolo_agendamento, fn ($v) => !is_null($v));
$q->where(function ($q) use ($valores, $params) {
if (!empty($valores)) {
$q->whereIn('solicitacao.opcao_retirada_protocolo_agendamento_id', $valores);
}
if (in_array(null, $params->opcoes_retirada_protocolo_agendamento, true)) {
$q->orWhereNull('solicitacao.opcao_retirada_protocolo_agendamento_id');
}
});
})
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('regulacao_solicitacao_item as solicitacao_item')
->whereColumn('solicitacao_item.solicitacao_id', 'solicitacao.id')
->where(fn ($q) => $q
->whereIn('solicitacao_item.exame_id', $params->exames)
->orWhereIn('solicitacao_item.procedimento_cirurgico_id', $params->procedimentos_cirurgicos)
->orWhereIn('solicitacao_item.especialidade_id', $params->especialidades)
)
)
)
->selectRaw("
prioridade.id,
prioridade.nome
")
->orderBy('prioridade.nome')
->get();
}
$ids = $prioridades->pluck('id')->all();
return ['form' => $prioridades, 'model' => $ids];
}
public static function autocompleteCid()
{
$params = self::getParams();
return DB::table('sigtap.cid as cid')
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('regulacao_solicitacao as solicitacao')
->join('regulacao_solicitacao_movimentacao as movimentacao', fn ($j) => $j
->on('movimentacao.solicitacao_id', 'solicitacao.id')
->where('movimentacao.id', fn ($q) => $q
->select('movimentacao2.id')
->from('regulacao_solicitacao_movimentacao as movimentacao2')
->whereColumn('movimentacao2.solicitacao_id', 'solicitacao.id')
->orderByDesc('movimentacao2.id')
->limit(1)
)
)
->join('cadastro_paciente as paciente', 'paciente.id', 'solicitacao.paciente_id')
->join('cadastro_cidadao as paciente_cidadao', 'paciente_cidadao.id', 'paciente.cidadao_id')
->join(
'regulacao_parametrizacao_regulador as regulador',
'regulador.id',
'solicitacao.regulador_id'
)
->join(
'cadastro_infraestrutura as infraestrutura_reguladora',
'infraestrutura_reguladora.id',
'regulador.infraestrutura_id'
)
->join(
'cadastro_infraestrutura as infraestrutura_solicitante',
'infraestrutura_solicitante.id',
'solicitacao.infraestrutura_solicitante_id'
)
->whereColumn('solicitacao.cid_id', 'cid.id')
->whereNotNull('solicitacao.cid_id')
->whereNotNull('solicitacao.confirmado_em')
->when($params->periodo['start'], fn ($q, $start) => $q->where('solicitacao.data', '>=', $start))
->when($params->periodo['end'], fn ($q, $end) => $q->where('solicitacao.data', '<=', $end))
->when($params->periodo_movimentacao['start'], fn ($q, $start) => $q->where('movimentacao.movimentado_em', '>=', $start))
->when($params->periodo_movimentacao['end'], fn ($q, $end) => $q->where('movimentacao.movimentado_em', '<=', $end))
->when($params->paciente_id, fn ($q, $id) => $q->where('solicitacao.paciente_id', $id))
->when($params->idade_de, fn ($q, $idadeDe) => $q
->whereRaw("TIMESTAMPDIFF(YEAR, paciente_cidadao.data_nascimento, NOW()) >= {$idadeDe}")
)
->when($params->idade_ate, fn ($q, $idadeAte) => $q
->whereRaw("TIMESTAMPDIFF(YEAR, paciente_cidadao.data_nascimento, NOW()) <= {$idadeAte}")
)
->whereIn('infraestrutura_reguladora.unidade_id', $params->unidades_reguladoras)
->whereIn('solicitacao.regulador_id', $params->reguladores)
->whereIn('infraestrutura_solicitante.unidade_id', $params->unidades_solicitantes)
->whereIn('solicitacao.infraestrutura_solicitante_id', $params->infraestruturas_solicitantes)
->when(!empty($params->unidades_referencias), fn ($q) => $q
->whereIn('paciente.unidade_id', $params->unidades_referencias)
)
->whereIn('solicitacao.usuario_solicitante_id', $params->usuarios_solicitantes)
->when(
$params->nenhum_prestador,
fn ($q) => $q
->whereNull('solicitacao.prestador_interno_id')
->whereNull('solicitacao.prestador_externo_id'),
fn ($q) => $q->where(function ($q) use ($params) {
$q->whereIn('solicitacao.prestador_interno_id', $params->prestadores_internos)
->orWhereIn('solicitacao.prestador_externo_id', $params->prestadores_externos);
if ($params->semPrestador) {
$q->orWhere(function ($q) {
$q->whereNull('solicitacao.prestador_interno_id')
->whereNull('solicitacao.prestador_externo_id');
});
}
})
)
->whereIn('solicitacao.status_id', $params->status)
->when(!empty($params->opcoes_retirada_protocolo_agendamento), fn ($q) => $q
->whereIn('solicitacao.opcao_retirada_protocolo_agendamento_id', $params->opcoes_retirada_protocolo_agendamento)
)
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('regulacao_solicitacao_item as solicitacao_item')
->whereColumn('solicitacao_item.solicitacao_id', 'solicitacao.id')
->where(fn ($q) => $q
->whereIn('solicitacao_item.exame_id', $params->exames)
->orWhereIn('solicitacao_item.procedimento_cirurgico_id', $params->procedimentos_cirurgicos)
->orWhereIn('solicitacao_item.especialidade_id', $params->especialidades)
)
)
->whereIn('solicitacao.prioridade_id', $params->prioridades)
)
->selectRaw("
cid.id,
cid.codigo,
cid.nome
");
}
public static function autocompleteCiap()
{
$params = self::getParams();
return DB::table('geral_ciap as ciap')
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('regulacao_solicitacao as solicitacao')
->join('regulacao_solicitacao_movimentacao as movimentacao', fn ($j) => $j
->on('movimentacao.solicitacao_id', 'solicitacao.id')
->where('movimentacao.id', fn ($q) => $q
->select('movimentacao2.id')
->from('regulacao_solicitacao_movimentacao as movimentacao2')
->whereColumn('movimentacao2.solicitacao_id', 'solicitacao.id')
->orderByDesc('movimentacao2.id')
->limit(1)
)
)
->join('cadastro_paciente as paciente', 'paciente.id', 'solicitacao.paciente_id')
->join('cadastro_cidadao as paciente_cidadao', 'paciente_cidadao.id', 'paciente.cidadao_id')
->join(
'regulacao_parametrizacao_regulador as regulador',
'regulador.id',
'solicitacao.regulador_id'
)
->join(
'cadastro_infraestrutura as infraestrutura_reguladora',
'infraestrutura_reguladora.id',
'regulador.infraestrutura_id'
)
->join(
'cadastro_infraestrutura as infraestrutura_solicitante',
'infraestrutura_solicitante.id',
'solicitacao.infraestrutura_solicitante_id'
)
->whereColumn('solicitacao.ciap_id', 'ciap.id')
->whereNotNull('solicitacao.ciap_id')
->whereNotNull('solicitacao.confirmado_em')
->when($params->periodo['start'], fn ($q, $start) => $q->where('solicitacao.data', '>=', $start))
->when($params->periodo['end'], fn ($q, $end) => $q->where('solicitacao.data', '<=', $end))
->when($params->periodo_movimentacao['start'], fn ($q, $start) => $q->where('movimentacao.movimentado_em', '>=', $start))
->when($params->periodo_movimentacao['end'], fn ($q, $end) => $q->where('movimentacao.movimentado_em', '<=', $end))
->when($params->paciente_id, fn ($q, $id) => $q->where('solicitacao.paciente_id', $id))
->when($params->idade_de, fn ($q, $idadeDe) => $q
->whereRaw("TIMESTAMPDIFF(YEAR, paciente_cidadao.data_nascimento, NOW()) >= {$idadeDe}")
)
->when($params->idade_ate, fn ($q, $idadeAte) => $q
->whereRaw("TIMESTAMPDIFF(YEAR, paciente_cidadao.data_nascimento, NOW()) <= {$idadeAte}")
)
->whereIn('infraestrutura_reguladora.unidade_id', $params->unidades_reguladoras)
->whereIn('solicitacao.regulador_id', $params->reguladores)
->whereIn('infraestrutura_solicitante.unidade_id', $params->unidades_solicitantes)
->whereIn('solicitacao.infraestrutura_solicitante_id', $params->infraestruturas_solicitantes)
->when(!empty($params->unidades_referencias), fn ($q) => $q
->whereIn('paciente.unidade_id', $params->unidades_referencias)
)
->whereIn('solicitacao.usuario_solicitante_id', $params->usuarios_solicitantes)
->when(
$params->nenhum_prestador,
fn ($q) => $q
->whereNull('solicitacao.prestador_interno_id')
->whereNull('solicitacao.prestador_externo_id'),
fn ($q) => $q->where(function ($q) use ($params) {
$q->whereIn('solicitacao.prestador_interno_id', $params->prestadores_internos)
->orWhereIn('solicitacao.prestador_externo_id', $params->prestadores_externos);
if ($params->semPrestador) {
$q->orWhere(function ($q) {
$q->whereNull('solicitacao.prestador_interno_id')
->whereNull('solicitacao.prestador_externo_id');
});
}
})
)
->whereIn('solicitacao.status_id', $params->status)
->when(!empty($params->opcoes_retirada_protocolo_agendamento), fn ($q) => $q
->whereIn('solicitacao.opcao_retirada_protocolo_agendamento_id', $params->opcoes_retirada_protocolo_agendamento)
)
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('regulacao_solicitacao_item as solicitacao_item')
->whereColumn('solicitacao_item.solicitacao_id', 'solicitacao.id')
->where(fn ($q) => $q
->whereIn('solicitacao_item.exame_id', $params->exames)
->orWhereIn('solicitacao_item.procedimento_cirurgico_id', $params->procedimentos_cirurgicos)
->orWhereIn('solicitacao_item.especialidade_id', $params->especialidades)
)
)
->whereIn('solicitacao.prioridade_id', $params->prioridades)
->when($params->cid_id, fn ($q, $id) => $q->where('solicitacao.cid_id', $id))
)
->selectRaw("
ciap.id,
ciap.codigo,
ciap.descricao
");
}
private static function getSexos($params)
{
$sexos = collect();
if ($params->has_periodo || $params->has_periodo_movimentacao || !is_null($params->paciente_id)) {
$sexos = DB::table('cadastro_sexo as sexo')
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('cadastro_cidadao as paciente_cidadao')
->join('cadastro_paciente as paciente', 'paciente.cidadao_id', 'paciente_cidadao.id')
->join('regulacao_solicitacao as solicitacao', 'solicitacao.paciente_id', 'paciente.id')
->join('regulacao_solicitacao_movimentacao as movimentacao', fn ($j) => $j
->on('movimentacao.solicitacao_id', 'solicitacao.id')
->where('movimentacao.id', fn ($q) => $q
->select('movimentacao2.id')
->from('regulacao_solicitacao_movimentacao as movimentacao2')
->whereColumn('movimentacao2.solicitacao_id', 'solicitacao.id')
->orderByDesc('movimentacao2.id')
->limit(1)
)
)
->join(
'regulacao_parametrizacao_regulador as regulador',
'regulador.id',
'solicitacao.regulador_id'
)
->join(
'cadastro_infraestrutura as infraestrutura_reguladora',
'infraestrutura_reguladora.id',
'regulador.infraestrutura_id'
)
->join(
'cadastro_infraestrutura as infraestrutura_solicitante',
'infraestrutura_solicitante.id',
'solicitacao.infraestrutura_solicitante_id'
)
->whereColumn('paciente_cidadao.sexo_id', 'sexo.id')
->whereNotNull('solicitacao.confirmado_em')
->when($params->periodo['start'], fn ($q, $start) => $q->where('solicitacao.data', '>=', $start))
->when($params->periodo['end'], fn ($q, $end) => $q->where('solicitacao.data', '<=', $end))
->when($params->periodo_movimentacao['start'], fn ($q, $start) => $q->where('movimentacao.movimentado_em', '>=', $start))
->when($params->periodo_movimentacao['end'], fn ($q, $end) => $q->where('movimentacao.movimentado_em', '<=', $end))
->when($params->paciente_id, fn ($q, $id) => $q->where('solicitacao.paciente_id', $id))
->when($params->idade_de, fn ($q, $idadeDe) => $q
->whereRaw("TIMESTAMPDIFF(YEAR, paciente_cidadao.data_nascimento, NOW()) >= {$idadeDe}")
)
->when($params->idade_ate, fn ($q, $idadeAte) => $q
->whereRaw("TIMESTAMPDIFF(YEAR, paciente_cidadao.data_nascimento, NOW()) <= {$idadeAte}")
)
->whereIn('infraestrutura_reguladora.unidade_id', $params->unidades_reguladoras)
->whereIn('solicitacao.regulador_id', $params->reguladores)
->whereIn('infraestrutura_solicitante.unidade_id', $params->unidades_solicitantes)
->whereIn('solicitacao.infraestrutura_solicitante_id', $params->infraestruturas_solicitantes)
->when(!empty($params->unidades_referencias), fn ($q) => $q
->whereIn('paciente.unidade_id', $params->unidades_referencias)
)
->whereIn('solicitacao.usuario_solicitante_id', $params->usuarios_solicitantes)
->when(
$params->nenhum_prestador,
fn ($q) => $q
->whereNull('solicitacao.prestador_interno_id')
->whereNull('solicitacao.prestador_externo_id'),
fn ($q) => $q->where(function ($q) use ($params) {
$q->whereIn('solicitacao.prestador_interno_id', $params->prestadores_internos)
->orWhereIn('solicitacao.prestador_externo_id', $params->prestadores_externos);
if ($params->semPrestador) {
$q->orWhere(function ($q) {
$q->whereNull('solicitacao.prestador_interno_id')
->whereNull('solicitacao.prestador_externo_id');
});
}
})
)
->whereIn('solicitacao.status_id', $params->status)
->when(!empty($params->opcoes_retirada_protocolo_agendamento), function ($q) use ($params) {
$valores = array_filter($params->opcoes_retirada_protocolo_agendamento, fn ($v) => !is_null($v));
$q->where(function ($q) use ($valores, $params) {
if (!empty($valores)) {
$q->whereIn('solicitacao.opcao_retirada_protocolo_agendamento_id', $valores);
}
if (in_array(null, $params->opcoes_retirada_protocolo_agendamento, true)) {
$q->orWhereNull('solicitacao.opcao_retirada_protocolo_agendamento_id');
}
});
})
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('regulacao_solicitacao_item as solicitacao_item')
->whereColumn('solicitacao_item.solicitacao_id', 'solicitacao.id')
->where(fn ($q) => $q
->whereIn('solicitacao_item.exame_id', $params->exames)
->orWhereIn('solicitacao_item.procedimento_cirurgico_id', $params->procedimentos_cirurgicos)
->orWhereIn('solicitacao_item.especialidade_id', $params->especialidades)
)
)
->whereIn('solicitacao.prioridade_id', $params->prioridades)
->when($params->cid_id, fn ($q, $id) => $q->where('solicitacao.cid_id', $id))
->when($params->ciap_id, fn ($q, $id) => $q->where('solicitacao.ciap_id', $id))
)
->selectRaw("
sexo.id,
sexo.descricao
")
->orderBy('sexo.descricao')
->get();
}
$ids = $sexos->pluck('id')->all();
return ['form' => $sexos, 'model' => $ids];
}
private static function getOcis($params)
{
$ocis = collect();
if ($params->has_periodo || $params->has_periodo_movimentacao || !is_null($params->paciente_id)) {
$ocis = DB::table('cadastro_oci AS oci')
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('ambulatorio_acompanhamento_oci as acompanhamento_oci')
->join('regulacao_solicitacao as solicitacao', 'solicitacao.acompanhamento_oci_id', 'acompanhamento_oci.id')
->join('regulacao_solicitacao_movimentacao as movimentacao', fn ($j) => $j
->on('movimentacao.solicitacao_id', 'solicitacao.id')
->where('movimentacao.id', fn ($q) => $q
->select('movimentacao2.id')
->from('regulacao_solicitacao_movimentacao as movimentacao2')
->whereColumn('movimentacao2.solicitacao_id', 'solicitacao.id')
->orderByDesc('movimentacao2.id')
->limit(1)
)
)
->join('cadastro_paciente as paciente', 'paciente.id', 'solicitacao.paciente_id')
->join('cadastro_cidadao as paciente_cidadao', 'paciente_cidadao.id', 'paciente.cidadao_id')
->join(
'regulacao_parametrizacao_regulador as regulador',
'regulador.id',
'solicitacao.regulador_id'
)
->join(
'cadastro_infraestrutura as infraestrutura_reguladora',
'infraestrutura_reguladora.id',
'regulador.infraestrutura_id'
)
->join(
'cadastro_infraestrutura as infraestrutura_solicitante',
'infraestrutura_solicitante.id',
'solicitacao.infraestrutura_solicitante_id'
)
->whereColumn('acompanhamento_oci.oci_id', 'oci.id')
->whereNotNull('solicitacao.confirmado_em')
->when($params->periodo['start'], fn ($q, $start) => $q->where('solicitacao.data', '>=', $start))
->when($params->periodo['end'], fn ($q, $end) => $q->where('solicitacao.data', '<=', $end))
->when($params->periodo_movimentacao['start'], fn ($q, $start) => $q->where('movimentacao.movimentado_em', '>=', $start))
->when($params->periodo_movimentacao['end'], fn ($q, $end) => $q->where('movimentacao.movimentado_em', '<=', $end))
->when($params->paciente_id, fn ($q, $id) => $q->where('solicitacao.paciente_id', $id))
->when($params->idade_de, fn ($q, $idadeDe) => $q
->whereRaw("TIMESTAMPDIFF(YEAR, paciente_cidadao.data_nascimento, NOW()) >= {$idadeDe}")
)
->when($params->idade_ate, fn ($q, $idadeAte) => $q
->whereRaw("TIMESTAMPDIFF(YEAR, paciente_cidadao.data_nascimento, NOW()) <= {$idadeAte}")
)
->whereIn('infraestrutura_reguladora.unidade_id', $params->unidades_reguladoras)
->whereIn('solicitacao.regulador_id', $params->reguladores)
->whereIn('infraestrutura_solicitante.unidade_id', $params->unidades_solicitantes)
->whereIn('solicitacao.infraestrutura_solicitante_id', $params->infraestruturas_solicitantes)
->when(!empty($params->unidades_referencias), fn ($q) => $q
->whereIn('paciente.unidade_id', $params->unidades_referencias)
)
->whereIn('solicitacao.usuario_solicitante_id', $params->usuarios_solicitantes)
->when(
$params->nenhum_prestador,
fn ($q) => $q
->whereNull('solicitacao.prestador_interno_id')
->whereNull('solicitacao.prestador_externo_id'),
fn ($q) => $q->where(function ($q) use ($params) {
$q->whereIn('solicitacao.prestador_interno_id', $params->prestadores_internos)
->orWhereIn('solicitacao.prestador_externo_id', $params->prestadores_externos);
if ($params->semPrestador) {
$q->orWhere(function ($q) {
$q->whereNull('solicitacao.prestador_interno_id')
->whereNull('solicitacao.prestador_externo_id');
});
}
})
)
->whereIn('solicitacao.status_id', $params->status)
->when(!empty($params->opcoes_retirada_protocolo_agendamento), function ($q) use ($params) {
$valores = array_filter($params->opcoes_retirada_protocolo_agendamento, fn ($v) => !is_null($v));
$q->where(function ($q) use ($valores, $params) {
if (!empty($valores)) {
$q->whereIn('solicitacao.opcao_retirada_protocolo_agendamento_id', $valores);
}
if (in_array(null, $params->opcoes_retirada_protocolo_agendamento, true)) {
$q->orWhereNull('solicitacao.opcao_retirada_protocolo_agendamento_id');
}
});
})
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('regulacao_solicitacao_item as solicitacao_item')
->whereColumn('solicitacao_item.solicitacao_id', 'solicitacao.id')
->where(fn ($q) => $q
->whereIn('solicitacao_item.exame_id', $params->exames)
->orWhereIn('solicitacao_item.procedimento_cirurgico_id', $params->procedimentos_cirurgicos)
->orWhereIn('solicitacao_item.especialidade_id', $params->especialidades)
)
)
->whereIn('solicitacao.prioridade_id', $params->prioridades)
->when($params->cid_id, fn ($q, $id) => $q->where('solicitacao.cid_id', $id))
->when($params->ciap_id, fn ($q, $id) => $q->where('solicitacao.ciap_id', $id))
->whereIn('paciente_cidadao.sexo_id', $params->sexos)
)
->select(
'oci.id',
'oci.nome'
)
->orderBy('oci.nome')
->get();
}
$ids = $ocis->pluck('id')->all();
return ['form' => $ocis, 'model' => $ids];
}
private static function getEtapasClinicas($params)
{
$etapasClinicas = collect();
if ($params->has_periodo || $params->has_periodo_movimentacao || !is_null($params->paciente_id)) {
$etapasClinicas = DB::table('cadastro_etapa_clinica as etapa_clinica')
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('ambulatorio_acompanhamento_oci as acompanhamento_oci')
->join('regulacao_solicitacao as solicitacao', 'solicitacao.acompanhamento_oci_id', 'acompanhamento_oci.id')
->join('regulacao_solicitacao_movimentacao as movimentacao', fn ($j) => $j
->on('movimentacao.solicitacao_id', 'solicitacao.id')
->where('movimentacao.id', fn ($q) => $q
->select('movimentacao2.id')
->from('regulacao_solicitacao_movimentacao as movimentacao2')
->whereColumn('movimentacao2.solicitacao_id', 'solicitacao.id')
->orderByDesc('movimentacao2.id')
->limit(1)
)
)
->join('cadastro_paciente as paciente', 'paciente.id', 'solicitacao.paciente_id')
->join('cadastro_cidadao as paciente_cidadao', 'paciente_cidadao.id', 'paciente.cidadao_id')
->join(
'regulacao_parametrizacao_regulador as regulador',
'regulador.id',
'solicitacao.regulador_id'
)
->join(
'cadastro_infraestrutura as infraestrutura_reguladora',
'infraestrutura_reguladora.id',
'regulador.infraestrutura_id'
)
->join(
'cadastro_infraestrutura as infraestrutura_solicitante',
'infraestrutura_solicitante.id',
'solicitacao.infraestrutura_solicitante_id'
)
->whereColumn('acompanhamento_oci.etapa_clinica_atual_id', 'etapa_clinica.id')
->whereNotNull('solicitacao.confirmado_em')
->when($params->periodo['start'], fn ($q, $start) => $q->where('solicitacao.data', '>=', $start))
->when($params->periodo['end'], fn ($q, $end) => $q->where('solicitacao.data', '<=', $end))
->when($params->periodo_movimentacao['start'], fn ($q, $start) => $q->where('movimentacao.movimentado_em', '>=', $start))
->when($params->periodo_movimentacao['end'], fn ($q, $end) => $q->where('movimentacao.movimentado_em', '<=', $end))
->when($params->paciente_id, fn ($q, $id) => $q->where('solicitacao.paciente_id', $id))
->when($params->idade_de, fn ($q, $idadeDe) => $q
->whereRaw("TIMESTAMPDIFF(YEAR, paciente_cidadao.data_nascimento, NOW()) >= {$idadeDe}")
)
->when($params->idade_ate, fn ($q, $idadeAte) => $q
->whereRaw("TIMESTAMPDIFF(YEAR, paciente_cidadao.data_nascimento, NOW()) <= {$idadeAte}")
)
->whereIn('infraestrutura_reguladora.unidade_id', $params->unidades_reguladoras)
->whereIn('solicitacao.regulador_id', $params->reguladores)
->whereIn('infraestrutura_solicitante.unidade_id', $params->unidades_solicitantes)
->whereIn('solicitacao.infraestrutura_solicitante_id', $params->infraestruturas_solicitantes)
->when(!empty($params->unidades_referencias), fn ($q) => $q
->whereIn('paciente.unidade_id', $params->unidades_referencias)
)
->whereIn('solicitacao.usuario_solicitante_id', $params->usuarios_solicitantes)
->when(
$params->nenhum_prestador,
fn ($q) => $q
->whereNull('solicitacao.prestador_interno_id')
->whereNull('solicitacao.prestador_externo_id'),
fn ($q) => $q->where(function ($q) use ($params) {
$q->whereIn('solicitacao.prestador_interno_id', $params->prestadores_internos)
->orWhereIn('solicitacao.prestador_externo_id', $params->prestadores_externos);
if ($params->semPrestador) {
$q->orWhere(function ($q) {
$q->whereNull('solicitacao.prestador_interno_id')
->whereNull('solicitacao.prestador_externo_id');
});
}
})
)
->whereIn('solicitacao.status_id', $params->status)
->when(!empty($params->opcoes_retirada_protocolo_agendamento), function ($q) use ($params) {
$valores = array_filter($params->opcoes_retirada_protocolo_agendamento, fn ($v) => !is_null($v));
$q->where(function ($q) use ($valores, $params) {
if (!empty($valores)) {
$q->whereIn('solicitacao.opcao_retirada_protocolo_agendamento_id', $valores);
}
if (in_array(null, $params->opcoes_retirada_protocolo_agendamento, true)) {
$q->orWhereNull('solicitacao.opcao_retirada_protocolo_agendamento_id');
}
});
})
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('regulacao_solicitacao_item as solicitacao_item')
->whereColumn('solicitacao_item.solicitacao_id', 'solicitacao.id')
->where(fn ($q) => $q
->whereIn('solicitacao_item.exame_id', $params->exames)
->orWhereIn('solicitacao_item.procedimento_cirurgico_id', $params->procedimentos_cirurgicos)
->orWhereIn('solicitacao_item.especialidade_id', $params->especialidades)
)
)
->whereIn('solicitacao.prioridade_id', $params->prioridades)
->when($params->cid_id, fn ($q, $id) => $q->where('solicitacao.cid_id', $id))
->when($params->ciap_id, fn ($q, $id) => $q->where('solicitacao.ciap_id', $id))
->whereIn('paciente_cidadao.sexo_id', $params->sexos)
->whereIn('acompanhamento_oci.oci_id', $params->ocis)
)
->select(
'etapa_clinica.id',
'etapa_clinica.nome'
)
->orderBy('etapa_clinica.nome')
->get();
}
$ids = $etapasClinicas->pluck('id')->all();
return ['form' => $etapasClinicas, 'model' => $ids];
}
public static function getPrintExportData()
{
$exibirAssinatura = Parametrizacao::first()->exibe_assinatura_relatorio_solicitacao ?? false;
$resultado = self::index();
$itens = $resultado['solicitacoes'];
$itens->each(function ($item) {
$item->data = (new Carbon($item->data))->format('d/m/Y');
if (!is_null($item->data_agendada)) {
$item->data_agendada = (new Carbon($item->data_agendada))->format('d/m/Y');
}
if (!is_null($item->data_vencimento_oci)) {
$item->data_vencimento_oci = (new Carbon($item->data_vencimento_oci))->format('d/m/Y');
}
});
$paciente = is_null(request()->paciente_id)
? null : Paciente::findOrFail(request()->paciente_id)->cidadao->nome;
$quantidadeUnidadesReguladoras = count(request()->unidades_reguladoras);
$unidadesReguladorasLabel = null;
if ($quantidadeUnidadesReguladoras > 0) {
if ($quantidadeUnidadesReguladoras === request()->totais_opcoes['unidades_reguladoras']) {
$unidadesReguladorasLabel = 'Todas';
}
else if ($quantidadeUnidadesReguladoras > 1) {
$unidadesReguladorasLabel = "{$quantidadeUnidadesReguladoras} selecionadas";
}
else {
$unidadesReguladorasLabel = Unidade::findOrFail(request()->unidades_reguladoras[0])->nome_fantasia;
}
}
$quantidadeReguladores = count(request()->reguladores);
$reguladoresLabel = null;
if ($quantidadeReguladores > 0) {
if ($quantidadeReguladores === request()->totais_opcoes['reguladores']) {
$reguladoresLabel = 'Todos';
}
else if ($quantidadeReguladores > 1) {
$reguladoresLabel = "{$quantidadeReguladores} selecionados";
}
else {
$reguladoresLabel = ParametrizacaoRegulador::findOrFail(request()->reguladores[0])->infraestrutura->nome;
}
}
$quantidadeUnidadesSolicitantes = count(request()->unidades_solicitantes);
$unidadesSolicitantesLabel = null;
if ($quantidadeUnidadesSolicitantes > 0) {
if ($quantidadeUnidadesSolicitantes === request()->totais_opcoes['unidades_solicitantes']) {
$unidadesSolicitantesLabel = 'Todas';
}
else if ($quantidadeUnidadesSolicitantes > 1) {
$unidadesSolicitantesLabel = "{$quantidadeUnidadesSolicitantes} selecionadas";
}
else {
$unidadesSolicitantesLabel = Unidade::findOrFail(request()->unidades_reguladoras[0])->nome_fantasia;
}
}
$quantidadeInfraestruturasSolicitantes = count(request()->infraestruturas_solicitantes);
$infraestruturasSolicitantesLabel = null;
if ($quantidadeInfraestruturasSolicitantes > 0) {
if ($quantidadeInfraestruturasSolicitantes === request()->totais_opcoes['infraestruturas_solicitantes']) {
$infraestruturasSolicitantesLabel = 'Todos';
}
else if ($quantidadeInfraestruturasSolicitantes > 1) {
$infraestruturasSolicitantesLabel = "{$quantidadeInfraestruturasSolicitantes} selecionados";
}
else {
$infraestruturasSolicitantesLabel = Infraestrutura::findOrFail(request()->infraestruturas_solicitantes[0])->nome;
}
}
$quantidadeUnidadesReferencias = count(request()->unidades_referencias);
$unidadesReferenciasLabel = null;
if ($quantidadeUnidadesReferencias > 0) {
if ($quantidadeUnidadesReferencias === request()->totais_opcoes['unidades_referencias']) {
$unidadesReferenciasLabel = 'Todas';
}
else if ($quantidadeUnidadesReferencias > 1) {
$unidadesReferenciasLabel = "{$quantidadeUnidadesReferencias} selecionadas";
}
else {
$unidadesReferenciasLabel = Unidade::findOrFail(request()->unidades_referencias[0])->nome_fantasia;
}
}
$quantidadeUsuariosSolicitantes = count(request()->usuarios_solicitantes);
$usuariosSolicitantesLabel = null;
if ($quantidadeUsuariosSolicitantes > 0) {
if ($quantidadeUsuariosSolicitantes === request()->totais_opcoes['usuarios_solicitantes']) {
$usuariosSolicitantesLabel = 'Todos';
}
else if ($quantidadeUsuariosSolicitantes > 1) {
$usuariosSolicitantesLabel = "{$quantidadeUsuariosSolicitantes} selecionados";
}
else {
$usuariosSolicitantesLabel = Usuario::findOrFail(request()->usuarios_solicitantes[0])->cidadao->nome;
}
}
$quantidadePrestadores = count(request()->prestadores);
$prestadoresLabel = 'Nenhum';
if ($quantidadePrestadores > 0) {
if ($quantidadePrestadores === request()->totais_opcoes['prestadores']) {
$prestadoresLabel = 'Todos';
}
else if ($quantidadePrestadores > 1) {
$prestadoresLabel = "{$quantidadePrestadores} selecionados";
}
else {
$prestadorData = explode('#', request()->prestadores[0]);
if ($prestadorData[0] === 'interno') {
$prestadoresLabel = ParametrizacaoPrestadorInterno::findOrFail($prestadorData[1])->infraestrutura->nome;
}
else if ($prestadorData[0] === 'externo') {
$prestadoresLabel = ParametrizacaoPrestadorExterno::findOrFail($prestadorData[1])->destino->descricao_destino;
}
}
}
$quantidadeStatus = count(request()->status);
$statusLabel = null;
if ($quantidadeStatus > 0) {
if ($quantidadeStatus === request()->totais_opcoes['status']) {
$statusLabel = 'Todos';
}
else if ($quantidadeStatus > 1) {
$statusLabel = "{$quantidadeStatus} selecionados";
}
else {
$statusLabel = Status::findOrFail(request()->status[0])->nome;
}
}
$quantidadeOpcoesRetiradasProtocoloAgendamento = count(request()->opcoes_retirada_protocolo_agendamento);
$opcoesRetiradasProtocoloAgendamentoLabel = 'Nenhum';
if ($quantidadeOpcoesRetiradasProtocoloAgendamento > 0) {
if ($quantidadeOpcoesRetiradasProtocoloAgendamento === request()->totais_opcoes['opcoes_retirada_protocolo_agendamento']) {
$opcoesRetiradasProtocoloAgendamentoLabel = 'Todas';
}
else if ($quantidadeOpcoesRetiradasProtocoloAgendamento > 1) {
$opcoesRetiradasProtocoloAgendamentoLabel = "{$quantidadeOpcoesRetiradasProtocoloAgendamento} selecionadas";
}
else {
$opcoesRetiradasProtocoloAgendamentoLabel = ParametrizacaoOpcaoRetiradaProtocoloAgendamento::findOrFail(
request()->opcoes_retirada_protocolo_agendamento[0])->nome;
}
}
$quantidadeGrupos = count(request()->grupos);
$gruposLabel = null;
if ($quantidadeGrupos > 0) {
if ($quantidadeGrupos === request()->totais_opcoes['grupos']) {
$gruposLabel = 'Todos';
}
else if ($quantidadeGrupos > 1) {
$gruposLabel = "{$quantidadeGrupos} selecionados";
}
else {
$gruposLabel = Grupo::findOrFail(request()->grupos[0])->nome;
}
}
$quantidadeExames = count(request()->exames);
$examesLabel = null;
if ($quantidadeExames > 0) {
if ($quantidadeExames === request()->totais_opcoes['exames']) {
$examesLabel = 'Todos';
}
else if ($quantidadeExames > 1) {
$examesLabel = "{$quantidadeExames} selecionados";
}
else {
$exame = Exame::findOrFail(request()->exames[0]);
$examesLabel = $exame->codigo
? (MaskUtil::getProcedimentoMasked($exame->codigo) . " - {$exame->nome}")
: $exame->nome;
}
}
$quantidadeProcedimentosCirurgicos = count(request()->procedimentos_cirurgicos);
$procedimentosCirurgicosLabel = null;
if ($quantidadeProcedimentosCirurgicos > 0) {
if ($quantidadeProcedimentosCirurgicos === request()->totais_opcoes['procedimentos_cirurgicos']) {
$procedimentosCirurgicosLabel = 'Todos';
}
else if ($quantidadeProcedimentosCirurgicos > 1) {
$procedimentosCirurgicosLabel = "{$quantidadeProcedimentosCirurgicos} selecionados";
}
else {
$procedimentoCirurgico = ProcedimentoCirurgico::findOrFail(request()->procedimentos_cirurgicos[0]);
$procedimentosCirurgicosLabel = $procedimentoCirurgico->procedimento_codigo
? (MaskUtil::getProcedimentoMasked($procedimentoCirurgico->procedimento_codigo) . " - {$procedimentoCirurgico->nome}")
: $procedimentoCirurgico->nome;
}
}
$quantidadeEspecialidades = count(request()->especialidades);
$especialidadesLabel = null;
if ($quantidadeEspecialidades > 0) {
if ($quantidadeEspecialidades === request()->totais_opcoes['especialidades']) {
$especialidadesLabel = 'Todas';
}
else if ($quantidadeEspecialidades > 1) {
$especialidadesLabel = "{$quantidadeEspecialidades} selecionadas";
}
else {
$especialidade = Especialidade::findOrFail(request()->especialidades[0]);
$especialidadesLabel = "{$especialidade->ocupacao->codigo} - {$especialidade->nome}";
}
}
$quantidadePrioridades = count(request()->prioridades);
$prioridadesLabel = null;
if ($quantidadePrioridades > 0) {
if ($quantidadePrioridades === request()->totais_opcoes['prioridades']) {
$prioridadesLabel = 'Todas';
}
else if ($quantidadePrioridades > 1) {
$prioridadesLabel = "{$quantidadePrioridades} selecionadas";
}
else {
$prioridadesLabel = SolicitacaoPrioridade::findOrFail(request()->prioridades[0])->nome;
}
}
$cid = null;
if (!is_null(request()->cid_id)) {
$cid = Cid::findOrFail(request()->cid_id);
$cid = MaskUtil::getCidMasked($cid->codigo) . " - {$cid->nome}";
}
$ciap = null;
if (!is_null(request()->ciap_id)) {
$ciap = Ciap::findOrFail(request()->ciap_id);
$ciap = "{$ciap->codigo} - {$ciap->descricao}";
}
$quantidadeSexos = count(request()->sexos);
$sexosLabel = null;
if ($quantidadeSexos > 0) {
if ($quantidadeSexos === request()->totais_opcoes['sexos']) {
$sexosLabel = 'Todos';
}
else if ($quantidadeSexos > 1) {
$sexosLabel = "{$quantidadeSexos} selecionados";
}
else {
$sexosLabel = Sexo::findOrFail(request()->sexos[0])->descricao;
}
}
$quantidadeOcis = count(request()->ocis);
$ocisLabel = null;
if ($quantidadeOcis > 0) {
if ($quantidadeOcis === request()->totais_opcoes['ocis']) {
$ocisLabel = 'Todos';
}
else if ($quantidadeOcis > 1) {
$ocisLabel = "{$quantidadeOcis} selecionados";
}
else {
$ocisLabel = Oci::findOrFail(request()->ocis[0])->nome;
}
}
$quantidadeEtapasClinicas = count(request()->etapas_clinicas);
$etapasClinicasLabel = null;
if ($quantidadeEtapasClinicas > 0) {
if ($quantidadeEtapasClinicas === request()->totais_opcoes['etapas_clinicas']) {
$etapasClinicasLabel = 'Todas';
}
else if ($quantidadeEtapasClinicas > 1) {
$etapasClinicasLabel = "{$quantidadeEtapasClinicas} selecionadas";
}
else {
$etapasClinicasLabel = EtapaClinica::findOrFail(request()->etapas_clinicas[0])->nome;
}
}
return [
'exibirAssinatura' => $exibirAssinatura,
'inicio' => request()->periodo['start'],
'fim' => request()->periodo['end'],
'movimentacaoInicio' => request()->periodo_movimentacao['start'],
'movimentacaoFim' => request()->periodo_movimentacao['end'],
'paciente' => $paciente,
'idadeDe' => request()->idade_de,
'idadeAte' => request()->idade_ate,
'unidadesReguladorasLabel' => $unidadesReguladorasLabel,
'reguladoresLabel' => $reguladoresLabel,
'unidadesSolicitantesLabel' => $unidadesSolicitantesLabel,
'infraestruturasSolicitantesLabel' => $infraestruturasSolicitantesLabel,
'unidadesReferenciasLabel' => $unidadesReferenciasLabel,
'usuariosSolicitantesLabel' => $usuariosSolicitantesLabel,
'prestadoresLabel' => $prestadoresLabel,
'statusLabel' => $statusLabel,
'opcoesRetiradasProtocoloAgendamentoLabel' => $opcoesRetiradasProtocoloAgendamentoLabel,
'gruposLabel' => $gruposLabel,
'examesLabel' => $examesLabel,
'procedimentosCirurgicosLabel' => $procedimentosCirurgicosLabel,
'especialidadesLabel' => $especialidadesLabel,
'prioridadesLabel' => $prioridadesLabel,
'cid' => $cid,
'ciap' => $ciap,
'sexosLabel' => $sexosLabel,
'ocisLabel' => $ocisLabel,
'etapasClinicasLabel' => $etapasClinicasLabel,
'colunas' => collect(request()->selected_cols),
'itens' => $itens,
'totalizadores' => $resultado['totalizadores'],
];
}
}