810 lines
37 KiB
PHP
810 lines
37 KiB
PHP
<?php
|
|
|
|
namespace App\Services\RegulacaoDivulgacao;
|
|
|
|
use App\Enums\Regulacao\ParametrizacaoDivulgacaoAba;
|
|
use App\Enums\Regulacao\ParametrizacaoDivulgacaoModoTempoMedio;
|
|
use App\Enums\Regulacao\StatusTipo;
|
|
use App\Models\Regulacao\ParametrizacaoDivulgacao;
|
|
use App\Services\Service;
|
|
use Carbon\Carbon;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
class FilaService extends Service
|
|
{
|
|
public static function list()
|
|
{
|
|
$data = (object) [
|
|
'additionals' => [],
|
|
'form' => [],
|
|
'model' => [],
|
|
];
|
|
|
|
$params = self::getParams();
|
|
|
|
$sets = [
|
|
'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'];
|
|
},
|
|
];
|
|
|
|
$load = is_null(request()->load_from);
|
|
|
|
if ($load) {
|
|
|
|
$data->additionals = [
|
|
'data_atual' => Carbon::today()->format('d/m/Y'),
|
|
'colunas_visiveis' => DB::table('regulacao_parametrizacao_divulgacao_aba_coluna as aba_coluna')
|
|
->where('aba_coluna.aba_id', request()->aba === 'solicitacao-espera'
|
|
? ParametrizacaoDivulgacaoAba::SOLICITACOES_EM_ESPERA
|
|
: ParametrizacaoDivulgacaoAba::SOLICITACOES_ATENDIDAS)
|
|
->where('aba_coluna.visivel', true)
|
|
->pluck('aba_coluna.coluna_id')
|
|
];
|
|
}
|
|
|
|
$fieldsItem = collect(['exame', 'procedimento_cirurgico', 'especialidade']);
|
|
$isLoadFromItens = $fieldsItem->contains(request()->load_from);
|
|
|
|
foreach ($sets as $field => $set) {
|
|
|
|
if ($load) {
|
|
|
|
if ($isLoadFromItens && $fieldsItem->contains($field)) {
|
|
|
|
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) [
|
|
'exames' => request()->get('exames', []),
|
|
'procedimentos_cirurgicos' => request()->get('procedimentos_cirurgicos', []),
|
|
'especialidades' => request()->get('especialidades', []),
|
|
];
|
|
|
|
return $params;
|
|
}
|
|
|
|
private static function getExames()
|
|
{
|
|
$exames = DB::table('parametrizacao_exame as exame')
|
|
->whereNull('exame.deleted_at')
|
|
->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(
|
|
'regulacao_parametrizacao_divulgacao_regulador as regulador',
|
|
'regulador.regulacao_parametrizacao_regulador_id',
|
|
'solicitacao.regulador_id'
|
|
)
|
|
->join(
|
|
'regulacao_parametrizacao_divulgacao_regulador_exame as regulador_exame',
|
|
'regulador_exame.regulador_id',
|
|
'regulador.id'
|
|
)
|
|
->join(
|
|
'regulacao_parametrizacao_regulador as regulacao_regulador',
|
|
'regulacao_regulador.id',
|
|
'regulador.regulacao_parametrizacao_regulador_id'
|
|
)
|
|
->join(
|
|
'cadastro_infraestrutura as infraestrutura_reguladora',
|
|
'infraestrutura_reguladora.id',
|
|
'regulacao_regulador.infraestrutura_id'
|
|
)
|
|
->join(
|
|
'regulacao_status as status', 'status.id', 'solicitacao.status_id'
|
|
)
|
|
->whereColumn('item.exame_id', 'exame.id')
|
|
->whereColumn('regulador_exame.exame_id', 'exame.id')
|
|
->where('regulador_exame.ativo', true)
|
|
->where('regulador.ativo', true)
|
|
->whereNotNull('item.exame_id')
|
|
->whereNotNull('solicitacao.confirmado_em')
|
|
->whereIn('status.tipo_id', self::getStatusTiposVisiveis())
|
|
)
|
|
->selectRaw("
|
|
exame.id,
|
|
exame.nome
|
|
")
|
|
->orderBy('exame.nome')
|
|
->get()
|
|
->map(fn ($exame) => [
|
|
'id' => $exame->id,
|
|
'descricao' => $exame->nome,
|
|
]);
|
|
|
|
return ['form' => $exames, 'model' => collect()];
|
|
}
|
|
|
|
private static function getProcedimentosCirurgicos()
|
|
{
|
|
$procedimentosCirurgicos = DB::table('parametrizacao_procedimento_cirurgico as procedimento_cirurgico')
|
|
->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(
|
|
'regulacao_parametrizacao_divulgacao_regulador as regulador',
|
|
'regulador.regulacao_parametrizacao_regulador_id',
|
|
'solicitacao.regulador_id'
|
|
)
|
|
->join(
|
|
'regulacao_parametrizacao_divulgacao_regulador_cirurgico as regulador_cirurgico',
|
|
'regulador_cirurgico.regulador_id',
|
|
'regulador.id'
|
|
)
|
|
->join(
|
|
'regulacao_parametrizacao_regulador as regulacao_regulador',
|
|
'regulacao_regulador.id',
|
|
'regulador.regulacao_parametrizacao_regulador_id'
|
|
)
|
|
->join(
|
|
'cadastro_infraestrutura as infraestrutura_reguladora',
|
|
'infraestrutura_reguladora.id',
|
|
'regulacao_regulador.infraestrutura_id'
|
|
)
|
|
->join(
|
|
'regulacao_status as status', 'status.id', 'solicitacao.status_id'
|
|
)
|
|
->whereColumn('item.procedimento_cirurgico_id', 'procedimento_cirurgico.id')
|
|
->whereColumn('regulador_cirurgico.procedimento_cirurgico_id', 'procedimento_cirurgico.id')
|
|
->where('regulador_cirurgico.ativo', true)
|
|
->where('regulador.ativo', true)
|
|
->whereNotNull('item.procedimento_cirurgico_id')
|
|
->whereNotNull('solicitacao.confirmado_em')
|
|
->whereIn('status.tipo_id', self::getStatusTiposVisiveis())
|
|
)
|
|
->selectRaw("
|
|
procedimento_cirurgico.id,
|
|
procedimento_cirurgico.nome
|
|
")
|
|
->orderBy('procedimento_cirurgico.nome')
|
|
->get()
|
|
->map(fn ($procedimentoCirurgico) => [
|
|
'id' => $procedimentoCirurgico->id,
|
|
'descricao' => $procedimentoCirurgico->nome,
|
|
]);
|
|
|
|
return ['form' => $procedimentosCirurgicos, 'model' => collect()];
|
|
}
|
|
|
|
private static function getEspecialidades()
|
|
{
|
|
$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(
|
|
'regulacao_parametrizacao_divulgacao_regulador as regulador',
|
|
'regulador.regulacao_parametrizacao_regulador_id',
|
|
'solicitacao.regulador_id'
|
|
)
|
|
->join(
|
|
'regulacao_parametrizacao_divulgacao_regulador_especialidade as regulador_especialidade',
|
|
'regulador_especialidade.regulador_id',
|
|
'regulador.id'
|
|
)
|
|
->join(
|
|
'regulacao_parametrizacao_regulador as regulacao_regulador',
|
|
'regulacao_regulador.id',
|
|
'regulador.regulacao_parametrizacao_regulador_id'
|
|
)
|
|
->join(
|
|
'cadastro_infraestrutura as infraestrutura_reguladora',
|
|
'infraestrutura_reguladora.id',
|
|
'regulacao_regulador.infraestrutura_id'
|
|
)
|
|
->join(
|
|
'regulacao_status as status', 'status.id', 'solicitacao.status_id'
|
|
)
|
|
->whereColumn('item.especialidade_id', 'especialidade.id')
|
|
->whereColumn('regulador_especialidade.especialidade_id', 'especialidade.id')
|
|
->where('regulador_especialidade.ativo', true)
|
|
->where('regulador.ativo', true)
|
|
->whereNotNull('item.especialidade_id')
|
|
->whereNotNull('solicitacao.confirmado_em')
|
|
->whereIn('status.tipo_id', self::getStatusTiposVisiveis())
|
|
)
|
|
->selectRaw("
|
|
especialidade.id,
|
|
especialidade.nome
|
|
")
|
|
->orderBy('especialidade.nome')
|
|
->get()
|
|
->map(fn ($especialidade) => [
|
|
'id' => $especialidade->id,
|
|
'descricao' => $especialidade->nome,
|
|
]);
|
|
|
|
return ['form' => $especialidades, 'model' => collect()];
|
|
}
|
|
|
|
private static function getStatusTiposVisiveis()
|
|
{
|
|
return DB::table('regulacao_parametrizacao_divulgacao_aba_status_tipo as aba_status_tipo')
|
|
->where('aba_status_tipo.aba_id', request()->aba === 'solicitacao-espera'
|
|
? ParametrizacaoDivulgacaoAba::SOLICITACOES_EM_ESPERA
|
|
: ParametrizacaoDivulgacaoAba::SOLICITACOES_ATENDIDAS)
|
|
->where('visivel', true)
|
|
->pluck('aba_status_tipo.status_tipo_id');
|
|
}
|
|
|
|
public static function datatableSolicitacaoEspera()
|
|
{
|
|
$statusTipos = DB::table('regulacao_parametrizacao_divulgacao_aba_status_tipo as aba_status_tipo')
|
|
->where('aba_status_tipo.aba_id', ParametrizacaoDivulgacaoAba::SOLICITACOES_EM_ESPERA)
|
|
->where('visivel', true)
|
|
->pluck('aba_status_tipo.status_tipo_id');
|
|
|
|
$params = self::getParams();
|
|
|
|
$solicitacoes = 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('regulacao_solicitacao_prioridade as prioridade', 'prioridade.id', 'solicitacao.prioridade_id')
|
|
->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_parametrizacao_divulgacao_regulador as regulador',
|
|
'regulador.regulacao_parametrizacao_regulador_id',
|
|
'solicitacao.regulador_id'
|
|
)
|
|
->join('regulacao_parametrizacao_regulador as regulacao_regulador', 'regulacao_regulador.id', 'regulador.regulacao_parametrizacao_regulador_id')
|
|
->join(
|
|
'cadastro_infraestrutura as infraestrutura_reguladora',
|
|
'infraestrutura_reguladora.id',
|
|
'regulacao_regulador.infraestrutura_id'
|
|
)
|
|
->join('regulacao_solicitacao_item as item', 'item.solicitacao_id', 'solicitacao.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')
|
|
->whereNotNull('solicitacao.confirmado_em')
|
|
->whereIn('status.tipo_id', $statusTipos)
|
|
->where('regulador.ativo', true)
|
|
->where(function ($q) use ($params) {
|
|
|
|
if (!empty($params->exames) || !empty($params->procedimentos_cirurgicos)) {
|
|
$q->where(function ($sub) use ($params) {
|
|
if (!empty($params->exames)) {
|
|
$sub->whereIn('item.exame_id', $params->exames);
|
|
}
|
|
if (!empty($params->procedimentos_cirurgicos)) {
|
|
$sub->orWhereIn('item.procedimento_cirurgico_id', $params->procedimentos_cirurgicos);
|
|
}
|
|
});
|
|
}
|
|
|
|
if (!empty($params->especialidades)) {
|
|
$q->orWhereIn('item.especialidade_id', $params->especialidades);
|
|
}
|
|
})
|
|
->selectRaw("
|
|
solicitacao.id,
|
|
solicitacao.data,
|
|
DATE_FORMAT(movimentacao.movimentado_em, '%d/%m/%Y %H:%i:%s') as data_movimentacao,
|
|
IF(solicitacao.posicao_portal IS NULL, NULL, LPAD(solicitacao.posicao_portal, 4, '0')) AS posicao,
|
|
CONCAT(
|
|
paciente_cidadao.nome,
|
|
IF(paciente_cidadao.nome_social IS NULL,
|
|
'',
|
|
CONCAT(' (', paciente_cidadao.nome_social, ')')
|
|
)
|
|
) as paciente_nome,
|
|
paciente_cidadao.cns as paciente_cns,
|
|
paciente_cidadao.cpf as paciente_cpf,
|
|
status.tipo_id as status_tipo_id,
|
|
status.nome as status_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,
|
|
IF(status.tipo_id IN (" . self::getStatusTiposQueFinalizamSolicitacao()->join(', ') . "), 0, 1) as allow_update,
|
|
IF(status.tipo_id IN (" . self::getStatusTipoDeAgendamento()->join(', ') . "), 1, 0) as allow_update_protocolo_agendamento,
|
|
GROUP_CONCAT((
|
|
CASE
|
|
WHEN item.exame_id IS NOT NULL
|
|
THEN exame.nome
|
|
WHEN item.procedimento_cirurgico_id IS NOT NULL
|
|
THEN procedimento_cirurgico.nome
|
|
WHEN item.especialidade_id IS NOT NULL
|
|
THEN especialidade.nome
|
|
END
|
|
) SEPARATOR '#') AS itens,
|
|
GROUP_CONCAT((
|
|
CASE
|
|
WHEN item.exame_id IS NOT NULL
|
|
THEN CONCAT('EXAME|', item.exame_id)
|
|
WHEN item.procedimento_cirurgico_id IS NOT NULL
|
|
THEN CONCAT('PROCEDIMENTO|', item.procedimento_cirurgico_id)
|
|
WHEN item.especialidade_id IS NOT NULL
|
|
THEN CONCAT('ESPECIALIDADE|', item.especialidade_id)
|
|
END
|
|
) SEPARATOR '#') AS itens_ids,
|
|
(status.tipo_id = " . StatusTipo::AGENDADO . ") as is_agendado,
|
|
IF(status.tipo_id = " . StatusTipo::DEVOLVIDO . ", solicitacao.justificativa_devolucao, NULL) as justificativa_devolucao,
|
|
prioridade.nome as prioridade_nome,
|
|
solicitacao.observacao,
|
|
(
|
|
CASE
|
|
WHEN item.exame_id IS NOT NULL
|
|
THEN 'EXAME'
|
|
WHEN item.procedimento_cirurgico_id IS NOT NULL
|
|
THEN 'PROCEDIMENTO CIRÚRGICO'
|
|
WHEN item.especialidade_id IS NOT NULL
|
|
THEN 'CONSULTA'
|
|
END
|
|
) AS tipo_solicitacao
|
|
")
|
|
->groupByRaw("
|
|
solicitacao.id,
|
|
DATE_FORMAT(solicitacao.data, '%d/%m/%Y'),
|
|
DATE_FORMAT(solicitacao.data_desejada, '%d/%m/%Y'),
|
|
DATE_FORMAT(movimentacao.movimentado_em, '%d/%m/%Y'),
|
|
posicao,
|
|
paciente_nome,
|
|
status.tipo_id,
|
|
status.nome,
|
|
tempo_espera,
|
|
allow_update,
|
|
allow_update_protocolo_agendamento,
|
|
is_agendado,
|
|
IF(status.tipo_id = " . StatusTipo::DEVOLVIDO . ", solicitacao.justificativa_devolucao, NULL),
|
|
prioridade.nome,
|
|
solicitacao.observacao,
|
|
tipo_solicitacao
|
|
")
|
|
->orderBy('solicitacao.posicao_portal');
|
|
|
|
return $solicitacoes;
|
|
}
|
|
|
|
public static function datatableSolicitacaoAtendida()
|
|
{
|
|
$statusTipos = DB::table('regulacao_parametrizacao_divulgacao_aba_status_tipo as aba_status_tipo')
|
|
->where('aba_status_tipo.aba_id', ParametrizacaoDivulgacaoAba::SOLICITACOES_ATENDIDAS)
|
|
->where('visivel', true)
|
|
->pluck('aba_status_tipo.status_tipo_id');
|
|
|
|
$params = self::getParams();
|
|
|
|
$solicitacoes = 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('regulacao_status as status_movimentacao', 'status_movimentacao.id', 'movimentacao.status_id')
|
|
->join('regulacao_solicitacao_prioridade as prioridade', 'prioridade.id', 'solicitacao.prioridade_id')
|
|
->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_status_tipo as status_tipo', 'status_tipo.id', 'status.tipo_id')
|
|
->join(
|
|
'regulacao_parametrizacao_divulgacao_regulador as regulador',
|
|
'regulador.regulacao_parametrizacao_regulador_id',
|
|
'solicitacao.regulador_id'
|
|
)
|
|
->join('regulacao_parametrizacao_regulador as regulacao_regulador', 'regulacao_regulador.id', 'regulador.regulacao_parametrizacao_regulador_id')
|
|
->join(
|
|
'cadastro_infraestrutura as infraestrutura_reguladora',
|
|
'infraestrutura_reguladora.id',
|
|
'regulacao_regulador.infraestrutura_id'
|
|
)
|
|
->join('regulacao_solicitacao_item as item', 'item.solicitacao_id', 'solicitacao.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')
|
|
->whereNotNull('solicitacao.confirmado_em')
|
|
->whereIn('status.tipo_id', $statusTipos)
|
|
->where('regulador.ativo', true)
|
|
->where(function ($q) use ($params) {
|
|
|
|
if (!empty($params->exames) || !empty($params->procedimentos_cirurgicos)) {
|
|
$q->where(function ($sub) use ($params) {
|
|
if (!empty($params->exames)) {
|
|
$sub->whereIn('item.exame_id', $params->exames);
|
|
}
|
|
if (!empty($params->procedimentos_cirurgicos)) {
|
|
$sub->orWhereIn('item.procedimento_cirurgico_id', $params->procedimentos_cirurgicos);
|
|
}
|
|
});
|
|
}
|
|
|
|
if (!empty($params->especialidades)) {
|
|
$q->orWhereIn('item.especialidade_id', $params->especialidades);
|
|
}
|
|
})
|
|
->selectRaw("
|
|
solicitacao.id,
|
|
solicitacao.data,
|
|
DATE_FORMAT(movimentacao.movimentado_em, '%d/%m/%Y %H:%i:%s') as data_movimentacao,
|
|
IF(solicitacao.posicao_portal IS NULL, NULL, LPAD(solicitacao.posicao_portal, 4, '0')) AS posicao,
|
|
CONCAT(
|
|
paciente_cidadao.nome,
|
|
IF(paciente_cidadao.nome_social IS NULL,
|
|
'',
|
|
CONCAT(' (', paciente_cidadao.nome_social, ')')
|
|
)
|
|
) as paciente_nome,
|
|
paciente_cidadao.cns as paciente_cns,
|
|
paciente_cidadao.cpf as paciente_cpf,
|
|
status.tipo_id as status_tipo_id,
|
|
status.nome as status_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,
|
|
IF(status.tipo_id IN (" . self::getStatusTiposQueFinalizamSolicitacao()->join(', ') . "), 0, 1) as allow_update,
|
|
IF(status.tipo_id IN (" . self::getStatusTipoDeAgendamento()->join(', ') . "), 1, 0) as allow_update_protocolo_agendamento,
|
|
GROUP_CONCAT((
|
|
CASE
|
|
WHEN item.exame_id IS NOT NULL
|
|
THEN exame.nome
|
|
WHEN item.procedimento_cirurgico_id IS NOT NULL
|
|
THEN procedimento_cirurgico.nome
|
|
WHEN item.especialidade_id IS NOT NULL
|
|
THEN especialidade.nome
|
|
END
|
|
) SEPARATOR '#') AS itens,
|
|
GROUP_CONCAT((
|
|
CASE
|
|
WHEN item.exame_id IS NOT NULL
|
|
THEN CONCAT('EXAME|', item.exame_id)
|
|
WHEN item.procedimento_cirurgico_id IS NOT NULL
|
|
THEN CONCAT('PROCEDIMENTO|', item.procedimento_cirurgico_id)
|
|
WHEN item.especialidade_id IS NOT NULL
|
|
THEN CONCAT('ESPECIALIDADE|', item.especialidade_id)
|
|
END
|
|
) SEPARATOR '#') AS itens_ids,
|
|
(status.tipo_id = " . StatusTipo::AGENDADO . ") as is_agendado,
|
|
IF(status.tipo_id = " . StatusTipo::DEVOLVIDO . ", solicitacao.justificativa_devolucao, NULL) as justificativa_devolucao,
|
|
prioridade.nome as prioridade_nome,
|
|
solicitacao.observacao,
|
|
(
|
|
CASE
|
|
WHEN item.exame_id IS NOT NULL
|
|
THEN 'EXAME'
|
|
WHEN item.procedimento_cirurgico_id IS NOT NULL
|
|
THEN 'PROCEDIMENTO CIRÚRGICO'
|
|
WHEN item.especialidade_id IS NOT NULL
|
|
THEN 'CONSULTA'
|
|
END
|
|
) AS tipo_solicitacao,
|
|
status_tipo.nome as status_tipo_nome,
|
|
IF(
|
|
status_movimentacao.tipo_id = " . StatusTipo::REALIZADO . ",
|
|
DATE(movimentacao.movimentado_em),
|
|
NULL
|
|
) as data_realizacao
|
|
")
|
|
->groupByRaw("
|
|
solicitacao.id,
|
|
DATE_FORMAT(solicitacao.data, '%d/%m/%Y'),
|
|
DATE_FORMAT(solicitacao.data_desejada, '%d/%m/%Y'),
|
|
DATE_FORMAT(movimentacao.movimentado_em, '%d/%m/%Y'),
|
|
posicao,
|
|
paciente_nome,
|
|
status.tipo_id,
|
|
status.nome,
|
|
tempo_espera,
|
|
allow_update,
|
|
allow_update_protocolo_agendamento,
|
|
is_agendado,
|
|
IF(status.tipo_id = " . StatusTipo::DEVOLVIDO . ", solicitacao.justificativa_devolucao, NULL),
|
|
prioridade.nome,
|
|
solicitacao.observacao,
|
|
tipo_solicitacao,
|
|
status_tipo.nome,
|
|
data_realizacao
|
|
");
|
|
|
|
return $solicitacoes;
|
|
}
|
|
|
|
public static function getStatusTipoDeAgendamento()
|
|
{
|
|
return collect([
|
|
StatusTipo::AGENDADO,
|
|
StatusTipo::REAGENDADO,
|
|
]);
|
|
}
|
|
|
|
public static function getStatusTiposQueFinalizamSolicitacao()
|
|
{
|
|
return collect([
|
|
StatusTipo::FALTA,
|
|
StatusTipo::REALIZADO,
|
|
StatusTipo::CANCELADO,
|
|
]);
|
|
}
|
|
|
|
public static function getTempoMedioPrevistoAtendimento()
|
|
{
|
|
$tempoMedioAutomatico = (ParametrizacaoDivulgacao::first()->modo_tempo_medio_id ?? null)
|
|
=== ParametrizacaoDivulgacaoModoTempoMedio::AUTOMATICO;
|
|
|
|
return [
|
|
'exames' => self::getTempoMedioPrevistoAtendimentoExames($tempoMedioAutomatico),
|
|
'procedimentos_cirurgicos' => self::getTempoMedioPrevistoAtendimentoProcedimentosCirurgicos($tempoMedioAutomatico),
|
|
'especialidades' => self::getTempoMedioPrevistoAtendimentoEspecialidades($tempoMedioAutomatico),
|
|
];
|
|
}
|
|
|
|
private static function getTempoMedioPrevistoAtendimentoExames($tempoMedioAutomatico)
|
|
{
|
|
$medias = [];
|
|
|
|
if ($tempoMedioAutomatico) {
|
|
$tempoEsperaExames = [];
|
|
|
|
foreach (request()->exames as $id) {
|
|
DB::table('regulacao_solicitacao_item as item')
|
|
->join('regulacao_solicitacao as solicitacao', 'solicitacao.id', 'item.solicitacao_id')
|
|
->where('item.exame_id', $id)
|
|
->select(
|
|
DB::raw("TIMESTAMPDIFF(
|
|
DAY,
|
|
CONCAT(solicitacao.data, ' 00:00:00'),
|
|
CONCAT(solicitacao.data_agendada, ' 00:00:00')
|
|
) AS tempo_espera")
|
|
)
|
|
->get()
|
|
->each(function ($data) use ($id, &$tempoEsperaExames) {
|
|
if (isset($data->tempo_espera)) {
|
|
$tempoEsperaExames[$id][] = (int) $data->tempo_espera;
|
|
}
|
|
});
|
|
}
|
|
|
|
foreach ($tempoEsperaExames as $id => $temposEspera) {
|
|
$medias[$id] = (int) ceil(collect($temposEspera)->sum() / count($temposEspera));
|
|
}
|
|
}
|
|
else {
|
|
foreach (request()->exames as $id) {
|
|
$tempoMedio = DB::table('parametrizacao_exame as exame')
|
|
->where('exame.id', $id)
|
|
->select('exame.tempo_medio_previsto_atendimento_dias')
|
|
->first()->tempo_medio_previsto_atendimento_dias ?? null;
|
|
|
|
$medias[$id] = $tempoMedio;
|
|
}
|
|
}
|
|
|
|
return $medias;
|
|
}
|
|
|
|
private static function getTempoMedioPrevistoAtendimentoProcedimentosCirurgicos($tempoMedioAutomatico)
|
|
{
|
|
$medias = [];
|
|
|
|
if ($tempoMedioAutomatico) {
|
|
$tempoEsperaProcedimentos = [];
|
|
|
|
foreach (request()->procedimentos_cirurgicos as $id) {
|
|
DB::table('regulacao_solicitacao_item as item')
|
|
->join('regulacao_solicitacao as solicitacao', 'solicitacao.id', 'item.solicitacao_id')
|
|
->where('item.procedimento_cirurgico_id', $id)
|
|
->select(
|
|
DB::raw("TIMESTAMPDIFF(
|
|
DAY,
|
|
CONCAT(solicitacao.data, ' 00:00:00'),
|
|
CONCAT(solicitacao.data_agendada, ' 00:00:00')
|
|
) AS tempo_espera")
|
|
)
|
|
->get()
|
|
->each(function ($data) use ($id, &$tempoEsperaProcedimentos) {
|
|
if (isset($data->tempo_espera)) {
|
|
$tempoEsperaProcedimentos[$id][] = (int) $data->tempo_espera;
|
|
}
|
|
});
|
|
}
|
|
|
|
foreach ($tempoEsperaProcedimentos as $id => $temposEspera) {
|
|
$medias[$id] = (int) ceil(collect($temposEspera)->sum() / count($temposEspera));
|
|
}
|
|
}
|
|
else {
|
|
foreach (request()->procedimentos_cirurgicos as $id) {
|
|
$medias[$id] = null;
|
|
}
|
|
}
|
|
|
|
return $medias;
|
|
}
|
|
|
|
private static function getTempoMedioPrevistoAtendimentoEspecialidades($tempoMedioAutomatico)
|
|
{
|
|
$medias = [];
|
|
|
|
if ($tempoMedioAutomatico) {
|
|
$tempoEsperaEspecialidades = [];
|
|
|
|
foreach (request()->especialidades as $id) {
|
|
DB::table('regulacao_solicitacao_item as item')
|
|
->join('regulacao_solicitacao as solicitacao', 'solicitacao.id', 'item.solicitacao_id')
|
|
->where('item.especialidade_id', $id)
|
|
->select(
|
|
DB::raw("TIMESTAMPDIFF(
|
|
DAY,
|
|
CONCAT(solicitacao.data, ' 00:00:00'),
|
|
CONCAT(solicitacao.data_agendada, ' 00:00:00')
|
|
) AS tempo_espera")
|
|
)
|
|
->get()
|
|
->each(function ($data) use ($id, &$tempoEsperaEspecialidades) {
|
|
if (isset($data->tempo_espera)) {
|
|
$tempoEsperaEspecialidades[$id][] = (int) $data->tempo_espera;
|
|
}
|
|
});
|
|
}
|
|
|
|
foreach ($tempoEsperaEspecialidades as $id => $temposEspera) {
|
|
$medias[$id] = (int) ceil(collect($temposEspera)->sum() / count($temposEspera));
|
|
}
|
|
}
|
|
else {
|
|
foreach (request()->especialidades as $id) {
|
|
$tempoMedio = DB::table('cadastro_especialidade as especialidade')
|
|
->where('especialidade.id', $id)
|
|
->select('especialidade.tempo_medio_previsto_atendimento_dias')
|
|
->first()->tempo_medio_previsto_atendimento_dias ?? null;
|
|
|
|
$medias[$id] = $tempoMedio;
|
|
}
|
|
}
|
|
|
|
return $medias;
|
|
}
|
|
}
|