This commit is contained in:
809
api/app/Services/RegulacaoDivulgacao/FilaService.php
Normal file
809
api/app/Services/RegulacaoDivulgacao/FilaService.php
Normal file
@@ -0,0 +1,809 @@
|
||||
<?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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user