This commit is contained in:
772
api/app/Services/Ambulatorio/FilaService.php
Normal file
772
api/app/Services/Ambulatorio/FilaService.php
Normal file
@@ -0,0 +1,772 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services\Ambulatorio;
|
||||
|
||||
use App\Enums\Administracao\Modulo;
|
||||
use App\Enums\Ambulatorio\AgendamentoStatus;
|
||||
use App\Enums\Cadastro\Estabelecimento\SetorTipo;
|
||||
use App\Enums\PainelSenha\Status;
|
||||
use App\Events\PainelSenha\FilaEvent;
|
||||
use App\Models\Administracao\Funcionalidade;
|
||||
use App\Models\Ambulatorio\ClassificacaoRisco;
|
||||
use App\Models\Ambulatorio\ParametrizacaoInfraestruturaOcupacao;
|
||||
use App\Models\Cadastro\Estabelecimento\CentroCusto;
|
||||
use App\Models\Cadastro\Estabelecimento\Sala;
|
||||
use App\Models\Cadastro\Parametrizacao\Parametrizacao;
|
||||
use App\Models\PainelSenha\Encaminhamento;
|
||||
use App\Models\PainelSenha\Fila;
|
||||
use App\Models\PainelSenha\OpcaoEntrada;
|
||||
use App\Models\PainelSenha\Prioridade;
|
||||
use App\Models\PainelSenha\Tela;
|
||||
use App\Models\PainelSenha\TempoEspera;
|
||||
use App\Services\Administracao\ModuloService;
|
||||
use App\Services\Geral\AgeService;
|
||||
use App\Services\Service;
|
||||
use App\Utils\MaskUtil;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
class FilaService extends Service
|
||||
{
|
||||
public static function list()
|
||||
{
|
||||
$centroCusto = CentroCusto::findOrFail(request()->centro_custo_id);
|
||||
$servicos = self::getFormServicos($centroCusto);
|
||||
|
||||
return [
|
||||
'additionals' => [
|
||||
'data_atual' => Carbon::today()->format('d/m/Y'),
|
||||
'permite_atendimento_enfermagem' => self::permiteAtendimentoEnfermagem($centroCusto),
|
||||
],
|
||||
'form' => [
|
||||
'classificacoes_risco' => ClassificacaoRisco::orderBy('nome')
|
||||
->get(['id', 'nome'])
|
||||
->map(fn ($classificacaoRisco) => [
|
||||
'id' => $classificacaoRisco->id,
|
||||
'nome' => Str::upper($classificacaoRisco->nome),
|
||||
]),
|
||||
'opcoes_entrada' => OpcaoEntrada::where('modulo_id', ModuloService::getId(Modulo::AMBULATORIO))
|
||||
->whereHas('centroCusto', function($query) use ($centroCusto) {
|
||||
$query->where('infraestrutura_id', $centroCusto->infraestrutura_id);
|
||||
})
|
||||
->whereExists(function($query) {
|
||||
$query->select(DB::raw(1))
|
||||
->from('ambulatorio_atendimento')
|
||||
->join('painel_senha_fila', 'painel_senha_fila.id', 'ambulatorio_atendimento.fila_id')
|
||||
->whereNull('ambulatorio_atendimento.finalizado_em')
|
||||
->whereColumn('painel_senha_fila.opcao_entrada_id', 'painel_senha_opcao_entrada.id');
|
||||
})
|
||||
->orderBy('nome')
|
||||
->get(['id', 'nome']),
|
||||
'prioridades' => Prioridade::orderBy('nome')
|
||||
->get(['id', 'nome']),
|
||||
'salas' => Sala::orderBy('nome')
|
||||
->where('centro_custo_id', request()->centro_custo_id)
|
||||
->get(['id', 'nome']),
|
||||
'status' => DB::table('painel_senha_status')
|
||||
->select([
|
||||
'id',
|
||||
'nome',
|
||||
])
|
||||
->orderBy('nome')
|
||||
->get(),
|
||||
'telas' => Tela::orderBy('nome')
|
||||
->whereHas('opcoesChamada', fn ($q) => $q
|
||||
->where('centro_custo_id', request()->centro_custo_id)
|
||||
)
|
||||
->get(['id', 'nome']),
|
||||
'tempos_espera' => TempoEspera::orderBy('tempo')
|
||||
->whereHas('infraestrutura.centrosCusto', fn ($q) => $q
|
||||
->where('id', request()->centro_custo_id)
|
||||
)
|
||||
->get(['id', 'tempo'])
|
||||
->map(fn ($tempoEspera) => [
|
||||
'id' => $tempoEspera->id,
|
||||
'minutos' => $tempoEspera->minutos,
|
||||
]),
|
||||
'ordenacoes' => collect([
|
||||
['value' => 'dataHoraAgendamento', 'text' => 'Data/hora de agendamento'],
|
||||
['value' => 'dataHoraChegada', 'text' => 'Data/hora de chegada'],
|
||||
]),
|
||||
'servicos' => $servicos,
|
||||
'cria_ficha_atencao_basica_atendimento_domiciliar' => self::criaFicha('atendimento-domiciliar'),
|
||||
'centros_custo_encaminhamento' => self::getCentrosCustoEncaminhamento(),
|
||||
],
|
||||
'model' => [
|
||||
'data' => Carbon::today()->format('d/m/Y'),
|
||||
'classificacao_risco_id' => null,
|
||||
'opcao_entrada_id' => null,
|
||||
'prioridade_id' => null,
|
||||
'status_id' => Status::EM_ESPERA,
|
||||
'tempo_espera_id' => null,
|
||||
'ordenacao' => 'dataHoraAgendamento',
|
||||
'servicos' => $servicos->pluck('id'),
|
||||
'fila' => self::index((object) request()->all()),
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
private static function permiteAtendimentoEnfermagem($centroCusto)
|
||||
{
|
||||
$parametrizacaoOcupacao = DB::table('ambulatorio_parametrizacao_infraestrutura_ocupacao as parametrizacao_infraestrutura_ocupacao')
|
||||
->join(
|
||||
'ambulatorio_parametrizacao_infraestrutura as parametrizacao_infraestrutura',
|
||||
'parametrizacao_infraestrutura.id',
|
||||
'parametrizacao_infraestrutura_ocupacao.parametrizacao_infraestrutura_id'
|
||||
)
|
||||
->where('parametrizacao_infraestrutura.infraestrutura_id', $centroCusto->infraestrutura_id)
|
||||
->where('parametrizacao_infraestrutura_ocupacao.ocupacao_id', self::getCurrentLotacao()->ocupacao_id)
|
||||
->select('parametrizacao_infraestrutura_ocupacao.permite_atendimento_enfermagem')
|
||||
->first();
|
||||
|
||||
if ($parametrizacaoOcupacao) {
|
||||
|
||||
return (bool) $parametrizacaoOcupacao->permite_atendimento_enfermagem;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private static function getFormServicos($centroCusto)
|
||||
{
|
||||
return DB::table('ambulatorio_servico as servico')
|
||||
->join(
|
||||
'ambulatorio_parametrizacao_infraestrutura_servico as parametrizacao_servico',
|
||||
'parametrizacao_servico.servico_id',
|
||||
'servico.id'
|
||||
)
|
||||
->join(
|
||||
'ambulatorio_parametrizacao_infraestrutura as parametrizacao_infraestrutura',
|
||||
'parametrizacao_infraestrutura.id',
|
||||
'parametrizacao_servico.parametrizacao_infraestrutura_id'
|
||||
)
|
||||
->where('parametrizacao_infraestrutura.infraestrutura_id', $centroCusto->infraestrutura_id)
|
||||
->select(
|
||||
'servico.id',
|
||||
'servico.nome'
|
||||
)
|
||||
->orderBy('servico.nome')
|
||||
->get();
|
||||
}
|
||||
|
||||
public static function index($params)
|
||||
{
|
||||
$parametrizacao = Parametrizacao::first();
|
||||
$quantidadeDias = $parametrizacao->cadastro_paciente_desatualizado_quantidade_dias ?? 0;
|
||||
|
||||
$filas = DB::table('painel_senha_fila as fila')
|
||||
->join(
|
||||
'cadastro_centro_custo AS centro_custo',
|
||||
'centro_custo.id',
|
||||
'fila.centro_custo_id'
|
||||
)
|
||||
->join(
|
||||
'cadastro_setor AS setor',
|
||||
'setor.id',
|
||||
'centro_custo.setor_id'
|
||||
)
|
||||
->join(
|
||||
'painel_senha_opcao_entrada as opcao_entrada',
|
||||
'opcao_entrada.id',
|
||||
'fila.opcao_entrada_id'
|
||||
)
|
||||
->join(
|
||||
'painel_senha_status as fila_status',
|
||||
'fila_status.id',
|
||||
'fila.status_id'
|
||||
)
|
||||
->leftJoin(
|
||||
'painel_senha_prioridade as prioridade',
|
||||
'prioridade.id',
|
||||
'fila.prioridade_id'
|
||||
)
|
||||
->leftJoin(
|
||||
'ambulatorio_atendimento as atendimento',
|
||||
'atendimento.fila_id',
|
||||
'fila.id'
|
||||
)
|
||||
->leftJoin('ambulatorio_atendimento_soap as soap_rascunho', fn ($j) => $j
|
||||
->on('soap_rascunho.atendimento_id', 'atendimento.id')
|
||||
->where('soap_rascunho.is_rascunho', true)
|
||||
)
|
||||
->leftJoin(
|
||||
'cadastro_lotacao as soap_rascunho_lotacao',
|
||||
'soap_rascunho_lotacao.id',
|
||||
'soap_rascunho.created_lotacao_id'
|
||||
)
|
||||
->leftJoin(
|
||||
'ambulatorio_agendamento as agendamento',
|
||||
'agendamento.id',
|
||||
'atendimento.agendamento_id'
|
||||
)
|
||||
->leftJoin(
|
||||
'ambulatorio_jornada as jornada',
|
||||
'jornada.id',
|
||||
'agendamento.jornada_id'
|
||||
)
|
||||
->leftJoin(
|
||||
'cadastro_lotacao as jornada_lotacao',
|
||||
'jornada_lotacao.id',
|
||||
'jornada.lotacao_id'
|
||||
)
|
||||
->leftJoin(
|
||||
'ambulatorio_demanda_espontanea as demanda_espontanea',
|
||||
'demanda_espontanea.id',
|
||||
'atendimento.demanda_espontanea_id'
|
||||
)
|
||||
->leftJoin(
|
||||
'cadastro_paciente as paciente',
|
||||
'paciente.id',
|
||||
DB::raw("COALESCE(demanda_espontanea.paciente_id, agendamento.paciente_id)")
|
||||
)
|
||||
->leftJoin(
|
||||
'cadastro_cidadao as paciente_cidadao',
|
||||
'paciente_cidadao.id',
|
||||
'paciente.cidadao_id'
|
||||
)
|
||||
->leftJoinSub(
|
||||
DB::table('atencao_basica_avaliacao')
|
||||
->select('paciente_id', DB::raw('MAX(id) as id'))
|
||||
->groupBy('paciente_id'),
|
||||
'avaliacao',
|
||||
'avaliacao.paciente_id',
|
||||
'paciente.id'
|
||||
)
|
||||
->leftJoin(
|
||||
'cadastro_usuario as usuario',
|
||||
'usuario.id',
|
||||
DB::raw("COALESCE(atendimento.responsavel_atual_usuario_id, demanda_espontanea.usuario_id, jornada_lotacao.usuario_id)")
|
||||
)
|
||||
->leftJoin(
|
||||
'cadastro_cidadao as usuario_cidadao',
|
||||
'usuario_cidadao.id',
|
||||
'usuario.cidadao_id'
|
||||
)
|
||||
->leftJoin(
|
||||
'cadastro_especialidade as especialidade',
|
||||
'especialidade.id',
|
||||
DB::raw("COALESCE(atendimento.responsavel_atual_especialidade_id, demanda_espontanea.especialidade_id, jornada.especialidade_id)")
|
||||
)
|
||||
->leftJoin(
|
||||
'sigtap.ocupacao as ocupacao',
|
||||
'ocupacao.id',
|
||||
DB::raw("COALESCE(atendimento.responsavel_atual_ocupacao_id, demanda_espontanea.ocupacao_id, jornada_lotacao.ocupacao_id)")
|
||||
)
|
||||
->leftJoin(
|
||||
'cadastro_lotacao as responsavel_encaminhamento_atual_lotacao',
|
||||
'responsavel_encaminhamento_atual_lotacao.id',
|
||||
'atendimento.responsavel_encaminhamento_atual_lotacao_id'
|
||||
)
|
||||
->leftJoin(
|
||||
'cadastro_usuario as responsavel_encaminhamento_atual_usuario',
|
||||
'responsavel_encaminhamento_atual_usuario.id',
|
||||
'responsavel_encaminhamento_atual_lotacao.usuario_id'
|
||||
)
|
||||
->leftJoin(
|
||||
'cadastro_cidadao as responsavel_encaminhamento_atual_usuario_cidadao',
|
||||
'responsavel_encaminhamento_atual_usuario_cidadao.id',
|
||||
'responsavel_encaminhamento_atual_usuario.cidadao_id'
|
||||
)
|
||||
->leftJoin(
|
||||
'ambulatorio_atendimento_pre_atendimento as pre_atendimento',
|
||||
'pre_atendimento.atendimento_id',
|
||||
'atendimento.id'
|
||||
)
|
||||
->leftJoin(
|
||||
'ambulatorio_classificacao_risco as classificacao_risco',
|
||||
'classificacao_risco.id',
|
||||
'pre_atendimento.classificacao_risco_id'
|
||||
)
|
||||
->whereNull('fila.deleted_at')
|
||||
->whereRaw("fila.created_at >= DATE_SUB(CURDATE(), INTERVAL 15 DAY)")
|
||||
->where('fila.evadido', false)
|
||||
->where('fila.finalizado', false)
|
||||
->where('opcao_entrada.modulo_id', ModuloService::getId(Modulo::AMBULATORIO))
|
||||
->where('setor.tipo_id', $params->setor_tipo_id)
|
||||
->where('centro_custo.id', $params->centro_custo_id)
|
||||
->whereNull('atendimento.finalizado_em')
|
||||
->select(DB::raw("
|
||||
fila.id,
|
||||
avaliacao.id as avaliacao_id,
|
||||
DATE_FORMAT(fila.emitido_em, '%d/%m/%Y') as emitido_em,
|
||||
atendimento.id as atendimento_id,
|
||||
fila.senha as numero_senha,
|
||||
CONCAT(opcao_entrada.sigla, fila.senha) as senha,
|
||||
paciente_cidadao.nome as paciente_nome,
|
||||
paciente_cidadao.nome_social as paciente_nome_social,
|
||||
paciente_cidadao.preferencia_nome_id as paciente_preferencia_nome_id,
|
||||
DATE_FORMAT(paciente_cidadao.data_nascimento, '%d/%m/%Y') as paciente_data_nascimento,
|
||||
paciente_cidadao.cpf as paciente_cpf,
|
||||
paciente_cidadao.cns as paciente_cns,
|
||||
paciente_cidadao.nome_mae as paciente_nome_mae,
|
||||
LPAD(paciente.prontuario, 6, '0') as paciente_prontuario,
|
||||
paciente.id as paciente_id,
|
||||
usuario.id as usuario_id,
|
||||
usuario_cidadao.nome as usuario_nome,
|
||||
ocupacao.id as ocupacao_id,
|
||||
ocupacao.codigo as ocupacao_descricao,
|
||||
especialidade.nome as especialidade_nome,
|
||||
agendamento.jornada_id,
|
||||
TIMESTAMP(jornada.data, agendamento.horario) as data_hora_agendamento,
|
||||
fila.created_at as data_hora_chegada,
|
||||
DATE_FORMAT(agendamento.horario, '%H:%i') as horario_agendado,
|
||||
DATE_FORMAT(fila.created_at, '%H:%i') as horario_chegada,
|
||||
classificacao_risco.id as classificacao_risco_id,
|
||||
classificacao_risco.nome as classificacao_risco_nome,
|
||||
opcao_entrada.id as opcao_entrada_id,
|
||||
opcao_entrada.nome as opcao_entrada_nome,
|
||||
prioridade.id as prioridade_id,
|
||||
prioridade.nome as prioridade_nome,
|
||||
prioridade.grau as prioridade_grau,
|
||||
fila_status.id as status_id,
|
||||
CASE WHEN paciente.updated_at IS NULL AND paciente_cidadao.updated_at IS NULL THEN
|
||||
1
|
||||
WHEN paciente.updated_at IS NOT NULL AND (paciente_cidadao.updated_at IS NULL OR paciente.updated_at > paciente_cidadao.updated_at) THEN
|
||||
CASE WHEN " . ($quantidadeDias > 0 ? "DATE_ADD(paciente.updated_at, INTERVAL " . $quantidadeDias . " DAY) < NOW()" : "false") . " THEN
|
||||
DATEDIFF(NOW(), DATE_ADD(paciente.updated_at, INTERVAL " . $quantidadeDias . " DAY))
|
||||
ELSE
|
||||
0
|
||||
END
|
||||
WHEN paciente_cidadao.updated_at IS NOT NULL AND (paciente.updated_at IS NULL OR paciente_cidadao.updated_at > paciente.updated_at) THEN
|
||||
CASE WHEN " . ($quantidadeDias > 0 ? "DATE_ADD(paciente_cidadao.updated_at, INTERVAL " . $quantidadeDias . " DAY) < NOW()" : "false") . " THEN
|
||||
DATEDIFF(NOW(), DATE_ADD(paciente_cidadao.updated_at, INTERVAL " . $quantidadeDias . " DAY))
|
||||
ELSE
|
||||
0
|
||||
END
|
||||
ELSE
|
||||
0
|
||||
END as dias_cadastro_desatualizado,
|
||||
soap_rascunho_lotacao.usuario_id as soap_rascunho_usuario_id,
|
||||
soap_rascunho_lotacao.ocupacao_id as soap_rascunho_ocupacao_id,
|
||||
IF(
|
||||
pre_atendimento.id IS NOT NULL
|
||||
OR EXISTS (
|
||||
SELECT 1
|
||||
FROM ambulatorio_atendimento_soap as soap
|
||||
WHERE soap.atendimento_id = atendimento.id
|
||||
),
|
||||
0,
|
||||
1
|
||||
) as allow_pre_atendimento,
|
||||
atendimento.pos_consulta,
|
||||
responsavel_encaminhamento_atual_usuario_cidadao.nome as responsavel_encaminhamento_atual_nome
|
||||
"))
|
||||
->addSelect([
|
||||
'chamadas' => function ($query) {
|
||||
|
||||
$query->select(DB::raw("COALESCE(COUNT(chamada.id), 0)"))
|
||||
->from('painel_senha_chamada AS chamada')
|
||||
->whereColumn('chamada.fila_id', 'fila.id')
|
||||
->whereColumn('chamada.status_id', 'fila.status_id');
|
||||
},
|
||||
])
|
||||
->get();
|
||||
|
||||
$filas->each(function ($fila) {
|
||||
|
||||
$fila->is_encaminhado = !is_null($fila->responsavel_encaminhamento_atual_nome);
|
||||
$fila->paciente_cpf = MaskUtil::getCpfMasked($fila->paciente_cpf);
|
||||
$fila->paciente_cns = MaskUtil::getCnsMasked($fila->paciente_cns);
|
||||
|
||||
$fila->paciente_idade = isset($fila->paciente_data_nascimento)
|
||||
? AgeService::getFormattedAge(Carbon::createFromFormat('d/m/Y', $fila->paciente_data_nascimento))
|
||||
: null;
|
||||
|
||||
$fila->tempo_espera = self::getTempoEspera($fila->id);
|
||||
$fila->servicos = self::getServicos($fila->atendimento_id);
|
||||
$fila->allow_pre_atendimento = (bool) $fila->allow_pre_atendimento;
|
||||
$fila->pos_consulta = (bool) $fila->pos_consulta;
|
||||
|
||||
unset($fila->atendimento_id);
|
||||
});
|
||||
|
||||
return $filas;
|
||||
}
|
||||
|
||||
public static function getTempoEspera($filaId)
|
||||
{
|
||||
$tempoEsperaTotal = DB::table('painel_senha_fila_historico AS historico')
|
||||
->where('historico.fila_id', $filaId)
|
||||
->select(
|
||||
'historico.created_at',
|
||||
'historico.status_id'
|
||||
)
|
||||
->distinct()
|
||||
->get()
|
||||
->reduce(function ($count, $historico) use ($filaId) {
|
||||
|
||||
if ($historico->status_id === Status::EM_ESPERA) {
|
||||
|
||||
$proximo = DB::table('painel_senha_fila_historico')
|
||||
->where('fila_id', $filaId)
|
||||
->where('created_at', '>', $historico->created_at)
|
||||
->select('created_at')
|
||||
->first();
|
||||
|
||||
return $count + Carbon::create($historico->created_at)
|
||||
->diffInMinutes($proximo->created_at ?? Carbon::now());
|
||||
}
|
||||
|
||||
return $count;
|
||||
}, 1);
|
||||
|
||||
$centroCustoLogado = self::getCurrentCentroCusto();
|
||||
|
||||
$tempoEspera = DB::table('painel_senha_tempo_espera')
|
||||
->whereNull('deleted_at')
|
||||
->where('tempo', '<=', $tempoEsperaTotal)
|
||||
->where('infraestrutura_id', $centroCustoLogado->infraestrutura_id)
|
||||
->select(
|
||||
'id',
|
||||
'cor'
|
||||
)
|
||||
->orderByDesc('tempo')
|
||||
->first();
|
||||
|
||||
if (is_null($tempoEspera)) {
|
||||
|
||||
$tempoEspera = DB::table('painel_senha_tempo_espera')
|
||||
->whereNull('deleted_at')
|
||||
->where('tempo', '>=', $tempoEsperaTotal)
|
||||
->where('infraestrutura_id', $centroCustoLogado->infraestrutura_id)
|
||||
->select(
|
||||
'id',
|
||||
'cor'
|
||||
)
|
||||
->orderBy('tempo')
|
||||
->first();
|
||||
}
|
||||
|
||||
$tempoEsperaTotal = Carbon::now()
|
||||
->subMinutes($tempoEsperaTotal)
|
||||
->diff(Carbon::now());
|
||||
|
||||
return [
|
||||
'id' => $tempoEspera->id ?? null,
|
||||
'cor' => $tempoEspera->cor ?? null,
|
||||
'total' => [
|
||||
'dias' => (int) $tempoEsperaTotal->format('%d') > 0
|
||||
? (int) $tempoEsperaTotal->format('%d') : null,
|
||||
'horas' => (int) $tempoEsperaTotal->format('%h') ?? null,
|
||||
'minutos' => (int) $tempoEsperaTotal->format('%i') ?? null,
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
private static function getServicos($atendimentoId)
|
||||
{
|
||||
return DB::table('ambulatorio_atendimento_servico as atendimento_servico')
|
||||
->join(
|
||||
'ambulatorio_servico as servico',
|
||||
'servico.id',
|
||||
'atendimento_servico.servico_id'
|
||||
)
|
||||
->where('atendimento_servico.atendimento_id', $atendimentoId)
|
||||
->select(
|
||||
'servico.id',
|
||||
'servico.nome'
|
||||
)
|
||||
->orderBy('servico.nome')
|
||||
->get();
|
||||
}
|
||||
|
||||
public static function store($params)
|
||||
{
|
||||
$centroCusto = CentroCusto::findOrFail($params->centro_custo_id);
|
||||
|
||||
$senha = (
|
||||
Fila::where('opcao_entrada_id', $params->opcao_entrada_id)
|
||||
->whereRaw('emitido_em = CURRENT_DATE')
|
||||
->max('senha') ?? 0
|
||||
) + 1;
|
||||
|
||||
$emitidoEm = (isset($params->habilita_integracao_aplicativo_feridas) && $params->habilita_integracao_aplicativo_feridas)
|
||||
? $params->data_jornada->format('Y-m-d')
|
||||
: now();
|
||||
|
||||
return Fila::create([
|
||||
'paciente_id' => $params->paciente_id,
|
||||
'centro_custo_id' => $centroCusto->id,
|
||||
'status_id' => Status::EM_ESPERA,
|
||||
'opcao_entrada_id' => $params->opcao_entrada_id,
|
||||
'prioridade_id' => $params->prioridade_id,
|
||||
'senha' => $senha,
|
||||
'emitido_em' => $emitidoEm
|
||||
]);
|
||||
|
||||
self::dispatch($centroCusto->id);
|
||||
}
|
||||
|
||||
public static function answer($id)
|
||||
{
|
||||
$fila = Fila::findOrFail($id);
|
||||
|
||||
$fila->update(['status_id' => Status::EM_ATENDIMENTO]);
|
||||
|
||||
self::dispatch($fila->centro_custo_id);
|
||||
}
|
||||
|
||||
public static function forward($id, $centroCustoIdTo)
|
||||
{
|
||||
$fila = Fila::findOrFail($id);
|
||||
$centroCustoIdFrom = $fila->centro_custo_id;
|
||||
|
||||
$fila->update([
|
||||
'centro_custo_id' => $centroCustoIdTo,
|
||||
'status_id' => Status::EM_ESPERA,
|
||||
]);
|
||||
|
||||
self::dispatch($centroCustoIdFrom);
|
||||
self::dispatch($centroCustoIdTo);
|
||||
}
|
||||
|
||||
public static function sendBack($id)
|
||||
{
|
||||
$fila = Fila::findOrFail($id);
|
||||
|
||||
$fila->update(['status_id' => Status::EM_ESPERA]);
|
||||
|
||||
self::dispatch($fila->centro_custo_id);
|
||||
}
|
||||
|
||||
public static function evade($id)
|
||||
{
|
||||
$fila = Fila::findOrFail($id);
|
||||
|
||||
self::validateEvade();
|
||||
|
||||
$fila->update([
|
||||
'evadido' => true,
|
||||
'motivo_evasao' => request()->motivo,
|
||||
'motivo_cancelamento_evasao' => null,
|
||||
'finalizado' => true,
|
||||
]);
|
||||
|
||||
if ($fila->ambulatorioAtendimento) {
|
||||
$atendimento = $fila->ambulatorioAtendimento;
|
||||
|
||||
if ($atendimento->agendamento_id) {
|
||||
$atendimento->agendamento->update([
|
||||
'status_id' => AgendamentoStatus::EVADIDO
|
||||
]);
|
||||
}
|
||||
|
||||
$atendimento->update([
|
||||
'finalizado_em' => Carbon::now(),
|
||||
'finalizado_lotacao_id' => self::getCurrentLotacao()->id,
|
||||
]);
|
||||
}
|
||||
|
||||
self::dispatch($fila->centro_custo_id);
|
||||
}
|
||||
|
||||
private static function validateEvade()
|
||||
{
|
||||
request()->validate([
|
||||
'motivo' => [
|
||||
'required',
|
||||
'string',
|
||||
'max:500',
|
||||
],
|
||||
]);
|
||||
}
|
||||
|
||||
public static function undoEvade($id)
|
||||
{
|
||||
$fila = Fila::findOrFail($id);
|
||||
|
||||
self::validateUndoEvade();
|
||||
|
||||
if ($fila->evadido) {
|
||||
$fila->update([
|
||||
'evadido' => false,
|
||||
'motivo_evasao' => null,
|
||||
'motivo_cancelamento_evasao' => request()->motivo,
|
||||
'finalizado' => false,
|
||||
]);
|
||||
|
||||
if ($fila->ambulatorioAtendimento) {
|
||||
$fila->ambulatorioAtendimento->update([
|
||||
'finalizado_em' => null,
|
||||
'finalizado_lotacao_id' => null,
|
||||
]);
|
||||
|
||||
if ($fila->ambulatorioAtendimento->agendamento_id) {
|
||||
$fila->ambulatorioAtendimento->agendamento->update([
|
||||
'status_id' => AgendamentoStatus::AGENDADO
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
self::dispatch($fila->centro_custo_id);
|
||||
}
|
||||
}
|
||||
|
||||
private static function validateUndoEvade()
|
||||
{
|
||||
request()->validate([
|
||||
'motivo' => [
|
||||
'required',
|
||||
'string',
|
||||
'max:500',
|
||||
],
|
||||
]);
|
||||
}
|
||||
|
||||
public static function destroy($id)
|
||||
{
|
||||
$fila = Fila::findOrFail($id);
|
||||
$centroCustoId = $fila->centro_custo_id;
|
||||
|
||||
$fila->delete();
|
||||
|
||||
self::dispatch($centroCustoId);
|
||||
}
|
||||
|
||||
public static function dispatch($centroCustoId)
|
||||
{
|
||||
$centroCusto = CentroCusto::findOrFail($centroCustoId);
|
||||
|
||||
$fila = self::index((object) [
|
||||
'centro_custo_id' => $centroCusto->id,
|
||||
'setor_tipo_id' => $centroCusto->setor->tipo_id,
|
||||
]);
|
||||
|
||||
FilaEvent::dispatch(
|
||||
$centroCusto->setor->tipo_id,
|
||||
$centroCusto->id,
|
||||
Modulo::AMBULATORIO,
|
||||
$fila
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
public static function getAgendamentosRetroativos()
|
||||
{
|
||||
$agendamentos = DB::table('ambulatorio_agendamento as agendamento')
|
||||
->join(
|
||||
'cadastro_paciente as paciente',
|
||||
'paciente.id',
|
||||
'agendamento.paciente_id'
|
||||
)
|
||||
->join(
|
||||
'cadastro_cidadao as paciente_cidadao',
|
||||
'paciente_cidadao.id',
|
||||
'paciente.cidadao_id'
|
||||
)
|
||||
->join(
|
||||
'ambulatorio_jornada as jornada',
|
||||
'jornada.id',
|
||||
'agendamento.jornada_id'
|
||||
)
|
||||
->join(
|
||||
'cadastro_lotacao as jornada_lotacao',
|
||||
'jornada_lotacao.id',
|
||||
'jornada.lotacao_id'
|
||||
)
|
||||
->join(
|
||||
'cadastro_usuario as usuario',
|
||||
'usuario.id',
|
||||
'jornada_lotacao.usuario_id'
|
||||
)
|
||||
->join(
|
||||
'cadastro_cidadao as usuario_cidadao',
|
||||
'usuario_cidadao.id',
|
||||
'usuario.cidadao_id'
|
||||
)
|
||||
->join(
|
||||
'cadastro_especialidade as especialidade',
|
||||
'especialidade.id',
|
||||
'jornada.especialidade_id'
|
||||
)
|
||||
->where('agendamento.status_id', AgendamentoStatus::AGENDADO)
|
||||
->where(fn ($q) => $q
|
||||
->whereExists(fn ($q) => $q
|
||||
->selectRaw(1)
|
||||
->from('ambulatorio_atendimento as atendimento')
|
||||
->whereColumn('atendimento.agendamento_id', 'agendamento.id')
|
||||
->whereNull('atendimento.finalizado_em')
|
||||
)
|
||||
->orWhereNotExists(fn ($q) => $q
|
||||
->selectRaw(1)
|
||||
->from('ambulatorio_atendimento as atendimento')
|
||||
->whereColumn('atendimento.agendamento_id', 'agendamento.id')
|
||||
)
|
||||
)
|
||||
->whereDate('jornada.data', Carbon::createFromFormat('d/m/Y', request()->data))
|
||||
->where('jornada.lotacao_id', self::getCurrentLotacao()->id)
|
||||
->selectRaw("
|
||||
agendamento.id,
|
||||
DATE_FORMAT(agendamento.horario, '%H:%i') as horario,
|
||||
paciente_cidadao.nome as paciente_nome,
|
||||
paciente_cidadao.nome_social as paciente_nome_social,
|
||||
paciente_cidadao.preferencia_nome_id as paciente_preferencia_nome_id,
|
||||
DATE_FORMAT(paciente_cidadao.data_nascimento, '%d/%m/%Y') as paciente_data_nascimento,
|
||||
paciente_cidadao.cpf as paciente_cpf,
|
||||
paciente_cidadao.cns as paciente_cns,
|
||||
paciente_cidadao.nome_mae as paciente_nome_mae,
|
||||
LPAD(paciente.prontuario, 6, '0') as paciente_prontuario,
|
||||
especialidade.nome as especialidade_nome
|
||||
")
|
||||
->get();
|
||||
|
||||
$agendamentos->each(function ($agendamento) {
|
||||
|
||||
$agendamento->paciente_cpf = MaskUtil::getCpfMasked($agendamento->paciente_cpf);
|
||||
$agendamento->paciente_cns = MaskUtil::getCnsMasked($agendamento->paciente_cns);
|
||||
|
||||
$agendamento->paciente_idade = isset($agendamento->paciente_data_nascimento)
|
||||
? AgeService::getFormattedAge(Carbon::createFromFormat('d/m/Y', $agendamento->paciente_data_nascimento))
|
||||
: null;
|
||||
});
|
||||
|
||||
return $agendamentos;
|
||||
}
|
||||
|
||||
public static function criaFicha($funcionalidadeIdentificador)
|
||||
{
|
||||
$lotacaoLogada = self::getCurrentLotacao();
|
||||
|
||||
return ParametrizacaoInfraestruturaOcupacao::whereHas('parametrizacaoInfraestrutura', fn ($q) => $q
|
||||
->where('infraestrutura_id', $lotacaoLogada->infraestrutura_id)
|
||||
)
|
||||
->where('ocupacao_id', $lotacaoLogada->ocupacao_id)
|
||||
->whereHas('fichasAtb', fn ($q) => $q
|
||||
->where('funcionalidade_id', Funcionalidade::whereHas('modulo', fn ($q) => $q
|
||||
->where('identificador', 'atencao-basica')
|
||||
)
|
||||
->where('identificador', $funcionalidadeIdentificador)
|
||||
->first('id')->id
|
||||
)
|
||||
)
|
||||
->exists();
|
||||
}
|
||||
|
||||
private static function getCentrosCustoEncaminhamento($centroCustoId = null)
|
||||
{
|
||||
if (is_null($centroCustoId)) {
|
||||
return Encaminhamento::where('centro_custo_id_de', self::getCurrentCentroCusto()->id)
|
||||
->whereHas('centroCustoPara', fn ($q) => $q
|
||||
->whereHas('setor', fn ($q) => $q
|
||||
->whereIn('tipo_id', [
|
||||
SetorTipo::ENFERMAGEM,
|
||||
SetorTipo::CONSULTORIO,
|
||||
])
|
||||
)
|
||||
)
|
||||
->get()
|
||||
->map(fn ($encaminhamento) => [
|
||||
'id' => $encaminhamento->centroCustoPara->id,
|
||||
'setor_nome' => $encaminhamento->centroCustoPara->setor->nome,
|
||||
]);
|
||||
}
|
||||
|
||||
return CentroCusto::where('id', $centroCustoId)
|
||||
->get()
|
||||
->map(fn ($centroCusto) => [
|
||||
'id' => $centroCusto->id,
|
||||
'setor_nome' => $centroCusto->setor->nome,
|
||||
]);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user