Files
Antonio Lopes dos Santos afec302c3e
All checks were successful
build-api-image / build (push) Successful in 51s
init commit
2026-08-04 16:52:02 -03:00

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;
}
}