3227 lines
165 KiB
PHP
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'],
|
|
];
|
|
}
|
|
}
|