This commit is contained in:
925
api/app/Services/TransportePaciente/Agendar/AgendarService.php
Normal file
925
api/app/Services/TransportePaciente/Agendar/AgendarService.php
Normal file
@@ -0,0 +1,925 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services\TransportePaciente\Agendar;
|
||||
|
||||
use App\Enums\Cadastro\SujeitoAtencao\Classificacao;
|
||||
use App\Enums\Cadastro\SujeitoAtencao\PreferenciaNome;
|
||||
use App\Enums\TransportePaciente\Funcionalidade;
|
||||
use App\Enums\TransportePaciente\Status;
|
||||
use App\Exceptions\TransportePaciente\ExceededCapacidadeVeiculoException;
|
||||
use App\Models\Cadastro\Parametrizacao\ParametrizacaoPermissaoUsuario;
|
||||
use App\Models\Cadastro\SujeitoAtencao\Lotacao;
|
||||
use App\Models\Cadastro\SujeitoAtencao\Paciente;
|
||||
use App\Models\Cadastro\SujeitoAtencao\PacienteClassificacao;
|
||||
use App\Models\Intranet\Cliente;
|
||||
use App\Models\TransportePaciente\Acompanhante;
|
||||
use App\Models\TransportePaciente\Agendar\Agendar;
|
||||
use App\Models\TransportePaciente\Destino\Destino;
|
||||
use App\Models\TransportePaciente\Parametrizacao\Parametrizacao;
|
||||
use App\Models\TransportePaciente\Ponto\Ponto;
|
||||
use App\Models\TransportePaciente\PreAgendamentoTransporte;
|
||||
use App\Models\TransportePaciente\Relacao;
|
||||
use App\Models\TransportePaciente\Veiculo\Tipo;
|
||||
use App\Models\TransportePaciente\Veiculo\TipoPassageiro;
|
||||
use App\Models\TransportePaciente\Veiculo\Veiculo;
|
||||
use App\Services\Integracao\CnsService;
|
||||
use App\Services\Service;
|
||||
use App\Utils\MaskUtil;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class AgendarService extends Service
|
||||
{
|
||||
|
||||
private static function getFormData($id)
|
||||
{
|
||||
$now = Carbon::now();
|
||||
|
||||
$paciente = Paciente::with('unidade')->findOrFail($id);
|
||||
$endereco = $paciente->cidadao->domicilio->endereco ?? null;
|
||||
$parametrizacao = Parametrizacao::first();
|
||||
$cliente = Cliente::where('link', app('config')->get('database.default'))->firstOrFail();
|
||||
$currentLotacao = self::getCurrentLotacao();
|
||||
$responsavel = Lotacao::find($paciente->created_lotacao_id);
|
||||
$area = null;
|
||||
|
||||
if ($responsavel) {
|
||||
|
||||
$area = self::getAreaMicroarea($responsavel->usuario->id, $paciente->created_lotacao_id,
|
||||
$responsavel->infraestrutura_id, $responsavel->infraestrutura->unidade_id,
|
||||
$responsavel->ocupacao_id);
|
||||
$microarea = $area ? ($area->microarea ? $area->microarea : 'Sem Microárea') : null;
|
||||
}
|
||||
|
||||
$permissaoUsuario = ParametrizacaoPermissaoUsuario::where('usuario_id', $currentLotacao->usuario_id)
|
||||
->where('infraestrutura_id', $currentLotacao->infraestrutura_id)
|
||||
->first();
|
||||
|
||||
$countUsuario = ParametrizacaoPermissaoUsuario::count();
|
||||
|
||||
$classificacoes = $permissaoUsuario
|
||||
? PacienteClassificacao::orderBy('descricao')
|
||||
->get()
|
||||
->filter(function ($classificacao) use ($permissaoUsuario) {
|
||||
|
||||
$exibe = false;
|
||||
|
||||
switch ($classificacao->id) {
|
||||
case Classificacao::MUNICIPE:
|
||||
$exibe = $permissaoUsuario->municipe;
|
||||
break;
|
||||
case Classificacao::PROVISORIO:
|
||||
$exibe = $permissaoUsuario->provisorio;
|
||||
break;
|
||||
case Classificacao::OUTRO_MUNICIPIO:
|
||||
$exibe = $permissaoUsuario->outro_municipio;
|
||||
break;
|
||||
}
|
||||
|
||||
return $exibe ? [
|
||||
'id' => $classificacao->id,
|
||||
'descricao' => $classificacao->descricao
|
||||
] : null;
|
||||
})
|
||||
->values()
|
||||
: [];
|
||||
|
||||
return [
|
||||
'data_atual' => $now->format('d/m/Y'),
|
||||
'tipos_passageiro' => TipoPassageiro::orderBy('descricao')->get(),
|
||||
'tipos_veiculo' => Tipo::orderBy('descricao')->get(),
|
||||
'horario_saida' => $parametrizacao->horario_saida ?? null,
|
||||
'veiculo_obrigatorio' => $parametrizacao->veiculo ?? null,
|
||||
'mensagem_protocolo' => $parametrizacao->mensagem_protocolo ?? null,
|
||||
'agendar_transporte_jornada' => $parametrizacao->agendar_transporte_jornada ?? null,
|
||||
'dados_acompanhante' => $parametrizacao->dados_acompanhante ?? null,
|
||||
'comprovante_acompanhante' => $parametrizacao->comprovante_acompanhante ?? null,
|
||||
'campo_livre' => $parametrizacao->campo_livre ?? null,
|
||||
'acompanhante' => [
|
||||
['value' => 0, 'text' => 'Nenhum'],
|
||||
['value' => 1, 'text' => '1'],
|
||||
['value' => 2, 'text' => '2'],
|
||||
],
|
||||
'paciente' => [
|
||||
'nome' => $paciente->cidadao->nome ?? null,
|
||||
'nome_social' => $paciente->cidadao->nome_social,
|
||||
'prefere_nome_social' => $paciente->cidadao
|
||||
->preferencia_nome_id === PreferenciaNome::NOME_SOCIAL,
|
||||
'data_nascimento' => $paciente->cidadao->data_nascimento
|
||||
? $paciente->cidadao->data_nascimento->format('d/m/Y')
|
||||
: '',
|
||||
'nacionalidade_id' => $paciente->cidadao->nacionalidade_id ?? null,
|
||||
'raca_cor_id' => $paciente->cidadao->raca_cor_id ?? null,
|
||||
'etnia_indigena_id' => $paciente->cidadao->etnia_indigena_id ?? null,
|
||||
'domicilio_id' => $paciente->cidadao->domicilio_id ?? null,
|
||||
'cpf' => $paciente->cidadao->cpf ? MaskUtil::getCpfMasked($paciente->cidadao->cpf) : null,
|
||||
'rg' => $paciente->cidadao->carteiraIdentidade->numero ?? null,
|
||||
'convenio_medico_nome' => $paciente->cidadao->conveniosMedico->first()->nome ?? null,
|
||||
'situacao_familiar' => $paciente->cidadao->situacaoFamiliarConjugal->descricao ?? null,
|
||||
'prontuario' => $paciente->prontuario,
|
||||
'unidade' => $paciente->unidade->nome_fantasia ?? null,
|
||||
'telefone_unidade_agendadora' => $currentLotacao->infraestrutura->telefone ? MaskUtil::getPhoneMasked($currentLotacao->infraestrutura->telefone) : null,
|
||||
'sexo' => $paciente->cidadao->sexo ?? '-',
|
||||
'classificacao_id' => $paciente->classificacao_id ?? '-',
|
||||
'classificacao_nome' => $paciente->classificacao->descricao ?? '-',
|
||||
'cns' => $paciente->cidadao->cns ? MaskUtil::getCnsMasked($paciente->cidadao->cns) : '',
|
||||
'idade' => $paciente->cidadao->data_nascimento
|
||||
? "{$paciente->cidadao->idade['anos']} ano(s), "
|
||||
. "{$paciente->cidadao->idade['meses']} mês(es) e "
|
||||
. "{$paciente->cidadao->idade['dias']} dia(s) "
|
||||
: 'NÃO INFORMADA',
|
||||
'required_acompanhante' => $paciente->cidadao->idade['anos']
|
||||
? ($paciente->cidadao->idade['anos'] < 8 || $paciente->cidadao->idade['anos'] > 80 ? true : false)
|
||||
: false,
|
||||
'telefones' => $paciente->cidadao->telefones
|
||||
->map(fn ($t) => MaskUtil::getPhoneMasked($t->numero))->all(),
|
||||
'nome_mae' => $paciente->cidadao->nome_mae,
|
||||
'cidadao_id' => $paciente->cidadao_id,
|
||||
'responsavel_cadastro' => $responsavel ? $responsavel->usuario->cidadao->nome : null,
|
||||
'area_microarea' => $area ? $area->area . '/' . $microarea : null
|
||||
],
|
||||
'endereco' => [
|
||||
'estado_id' => $endereco ? $endereco->logradouro->municipio->estado->id : null,
|
||||
'municipio' => $endereco ? $endereco->logradouro->municipio : null,
|
||||
'logradouro' => $endereco ? $endereco->logradouro : null,
|
||||
'cep' => $endereco ? MaskUtil::getCepMasked($endereco->logradouro->cep) : null,
|
||||
'numero' => $endereco ? $endereco->numero : null,
|
||||
'sem_numero' => $endereco ? $endereco->sem_numero : null,
|
||||
'complemento' => $endereco ? $endereco->complemento ?? '' : null,
|
||||
'zona_id' => $endereco ? $endereco->zona_id : null,
|
||||
],
|
||||
'cliente' => [
|
||||
'sistema' => [
|
||||
'ramo_atividade' => [
|
||||
'nome' => $cliente->sistema->ramoAtividade->nome ?? null,
|
||||
],
|
||||
'nome' => $cliente->sistema->nome ?? null,
|
||||
'versao' => $cliente->sistema->versao ?? null,
|
||||
],
|
||||
'municipio' => [
|
||||
'estado' => [
|
||||
'uf' => $cliente->municipio->estado->uf ?? null,
|
||||
],
|
||||
'nome' => $cliente->municipio->nome ?? null,
|
||||
],
|
||||
'nome' => $cliente->nome ?? null,
|
||||
'email' => $cliente->email ?? null,
|
||||
'site' => $cliente->site ?? null,
|
||||
'logotipo' => $cliente->logotipo ?? null,
|
||||
],
|
||||
'usuario' => $currentLotacao->usuario->cidadao->nome,
|
||||
'pre_agendamentos' => self::getPreAgendamentos($id),
|
||||
'relacoes' => Relacao::get(),
|
||||
'municipios' => DB::table('transporte_paciente_destino as destino')
|
||||
->select('municipio.id', 'municipio.nome')
|
||||
->join('intranet.cadastro_municipio as municipio', 'destino.municipio_id', 'municipio.id')
|
||||
->where('bloqueado', false)
|
||||
->groupBy('destino.municipio_id')
|
||||
->get(),
|
||||
'pontos' => self::getPontos($id),
|
||||
'tipos_passageiro' => TipoPassageiro::orderBy('descricao')->get(),
|
||||
'classificacoes' => $classificacoes,
|
||||
'is_permissao_cadastro' => $countUsuario === 0 ? true : false,
|
||||
];
|
||||
}
|
||||
|
||||
private static function getModelData($agendar = null)
|
||||
{
|
||||
$agendar = [
|
||||
'id' => null,
|
||||
'paciente_id' => null,
|
||||
'motivo' => null,
|
||||
'data' => null,
|
||||
'horario' => null,
|
||||
'municipio' => null,
|
||||
'destino_id' => null,
|
||||
'acompanhante' => 0,
|
||||
'ponto_id' => null,
|
||||
'data_saida' => null,
|
||||
'horario_saida' => null,
|
||||
'tipo_passageiro_id' => null,
|
||||
'veiculo_id' => null,
|
||||
'jornada_id' => null,
|
||||
'pre_agendamento_id' => null,
|
||||
'consulta_observacao' => null,
|
||||
'acompanhante1' => null,
|
||||
'nome1' => null,
|
||||
'telefone1' => null,
|
||||
'relacao1' => null,
|
||||
'acompanhante2' => null,
|
||||
'nome2' => null,
|
||||
'telefone2' => null,
|
||||
'relacao2' => null,
|
||||
'observacao' => null,
|
||||
];
|
||||
|
||||
return $agendar;
|
||||
}
|
||||
|
||||
public static function show($id)
|
||||
{
|
||||
$model = self::getModelData(Agendar::find($id));
|
||||
$model['observacao'] = self::getObservacao($id);
|
||||
|
||||
return [
|
||||
'additionals' => [
|
||||
'permissoes_atualizacao_cadastro_paciente' => self::getPermissoesAtualizacaoCadastroPaciente(),
|
||||
],
|
||||
'form' => self::getFormData($id),
|
||||
'model' => $model,
|
||||
];
|
||||
}
|
||||
|
||||
private static function getObservacao($id)
|
||||
{
|
||||
$ultimo_agendamento = Agendar::where('paciente_id', $id)->latest()->first();
|
||||
if($ultimo_agendamento) {
|
||||
return $ultimo_agendamento->observacao;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static function store()
|
||||
{
|
||||
self::validate();
|
||||
|
||||
if (request()->supervisor_id === null && request()->veiculo_id !== null && isset(request()->capacidade)) {
|
||||
|
||||
$agendados = intval(request()->total_agendados) ?? 0;
|
||||
$acompanhante = intval(request()->acompanhante) ?? 0;
|
||||
$capacidade = intval(request()->capacidade) ?? 0;
|
||||
|
||||
if (($agendados + $acompanhante + 1) > $capacidade ) {
|
||||
|
||||
throw new ExceededCapacidadeVeiculoException;
|
||||
}
|
||||
}
|
||||
|
||||
$agendar = null;
|
||||
DB::transaction(function () use (&$agendar) {
|
||||
if(isset(request()->acompanhante1) && isset(request()->acompanhante1['id']) && isset(request()->relacao1) || isset(request()->nome1)) {
|
||||
$acompanhante1 = Acompanhante::create([
|
||||
'relacao_id' => request()->relacao1,
|
||||
'usuario_id' => request()->acompanhante1['id'] ?? null,
|
||||
'nome' => request()->nome1 ?? null,
|
||||
'telefone' => isset(request()->acompanhante1['id']) ? null : request()->telefone1,
|
||||
])->fresh();
|
||||
|
||||
if (isset(request()->acompanhante1['id'])) {
|
||||
$telefonePrincipal = Paciente::findOrFail(request()->acompanhante1['id'])->cidadao->telefones()->where('principal', true);
|
||||
|
||||
if (is_null(request()->telefone1)) {
|
||||
$telefonePrincipal->delete();
|
||||
} else {
|
||||
$telefonePrincipal->update(['numero' => request()->telefone1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(isset(request()->acompanhante2) && isset(request()->acompanhante2['id']) && isset(request()->relacao2) || isset(request()->nome2)) {
|
||||
$acompanhante2 = Acompanhante::create([
|
||||
'relacao_id' => request()->relacao2,
|
||||
'usuario_id' => request()->acompanhante2['id'] ?? null,
|
||||
'nome' => request()->nome2 ?? null,
|
||||
'telefone' => isset(request()->acompanhante2['id']) ? null : request()->telefone2,
|
||||
])->fresh();
|
||||
|
||||
if (isset(request()->acompanhante2['id'])) {
|
||||
$telefonePrincipal = Paciente::findOrFail(request()->acompanhante2['id'])->cidadao->telefones()->where('principal', true);
|
||||
|
||||
if (is_null(request()->telefone2)) {
|
||||
$telefonePrincipal->delete();
|
||||
} else {
|
||||
$telefonePrincipal->update(['numero' => request()->telefone2]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$agendar = Agendar::create(request()->all() + [
|
||||
'acompanhante_1_id' => $acompanhante1->id ?? null,
|
||||
'acompanhante_2_id' => $acompanhante2->id ?? null,
|
||||
'veiculo_edited_by' => request()->veiculo_id ? self::getCurrentLotacao()->usuario->id : null,
|
||||
'veiculo_edited_at' => request()->veiculo_id ? Carbon::now() : null,
|
||||
'funcionalidade_origem' => request()->veiculo_id ? Funcionalidade::AGENDAR_TRANSPORTE : null
|
||||
])->fresh();
|
||||
|
||||
$preAgendar = PreAgendamentoTransporte::find(request()->pre_agendamento_id);
|
||||
|
||||
if ($preAgendar) {
|
||||
$preAgendar->horario_saida = request()->horario_saida;
|
||||
$preAgendar->data_saida = request()->data_saida;
|
||||
$preAgendar->veiculo_id = request()->veiculo_id;
|
||||
$preAgendar->jornada_id = request()->jornada_id;
|
||||
$preAgendar->save();
|
||||
}
|
||||
|
||||
HistoricoService::create($agendar, Status::AGENDADO, $agendar->updated_lotacao_id);
|
||||
});
|
||||
|
||||
return $agendar;
|
||||
}
|
||||
|
||||
public static function update()
|
||||
{
|
||||
if (request()->supervisor_id === null && request()->veiculo_id !== null && isset(request()->capacidade)) {
|
||||
|
||||
$agendados = intval(request()->total_agendados) ?? 0;
|
||||
$acompanhante = intval(request()->acompanhante) ?? 0;
|
||||
$capacidade = intval(request()->capacidade) ?? 0;
|
||||
|
||||
if (($agendados + $acompanhante + 1) > $capacidade ) {
|
||||
|
||||
throw new ExceededCapacidadeVeiculoException;
|
||||
}
|
||||
}
|
||||
|
||||
$agendar = Agendar::find(request()->agendar_id);
|
||||
|
||||
if (isset($agendar)) {
|
||||
|
||||
$agendar->horario_saida = request()->horario_saida;
|
||||
$agendar->veiculo_id = request()->veiculo_id;
|
||||
$agendar->jornada_id = request()->jornada_id;
|
||||
$agendar->veiculo_edited_by = request()->veiculo_id ? self::getCurrentLotacao()->usuario->id : null;
|
||||
$agendar->veiculo_edited_at = request()->veiculo_id ? Carbon::now() : null;
|
||||
$agendar->funcionalidade_origem = request()->veiculo_id ? Funcionalidade::PRE_AGENDAR_TRANSPORTE : null;
|
||||
$agendar->save();
|
||||
|
||||
$preAgendar = PreAgendamentoTransporte::find(request()->pre_agendamento_id);
|
||||
|
||||
$preAgendar->data_saida = request()->data_saida;
|
||||
$preAgendar->horario_saida = request()->horario_saida;
|
||||
$preAgendar->veiculo_id = request()->veiculo_id;
|
||||
$preAgendar->jornada_id = request()->jornada_id;
|
||||
$preAgendar->save();
|
||||
|
||||
HistoricoService::create($agendar, Status::MODIFICADO, $agendar->updated_lotacao_id);
|
||||
}
|
||||
|
||||
return $agendar;
|
||||
}
|
||||
|
||||
public static function getAgendados() {
|
||||
|
||||
return [
|
||||
'municipio' => Agendar::where('municipio_id', request()->municipio_id)
|
||||
->whereNotIn('status_id', [Status::CANCELADO])
|
||||
->where('data', request()->data)
|
||||
->select(
|
||||
DB::raw('SUM(IFNULL(acompanhante, 0) + 1) AS total'),
|
||||
)
|
||||
->first(),
|
||||
'destinos' => Agendar::where('municipio_id', request()->municipio_id)
|
||||
->where('data', request()->data)
|
||||
->select(
|
||||
'destino_id',
|
||||
DB::raw('SUM(IFNULL(acompanhante, 0) + 1) AS quantidade'),
|
||||
)
|
||||
->groupBy('destino_id')
|
||||
->get()
|
||||
->map(fn($query) => [
|
||||
'id' => $query->id ?? null,
|
||||
'destino_id' => $query->destino_id ?? null,
|
||||
'destino' => $query->destino->descricao_destino ?? null,
|
||||
'quantidade' => $query->quantidade,
|
||||
'agendados' => Agendar::where('municipio_id', request()->municipio_id)
|
||||
->whereNotIn('status_id', [Status::CANCELADO])
|
||||
->where('destino_id', $query->destino_id)
|
||||
->where('data', request()->data)
|
||||
->select(
|
||||
DB::raw('SUM(IFNULL(acompanhante, 0) + 1) AS quantidade'),
|
||||
DB::raw("
|
||||
CASE WHEN horario_saida IS NOT NULL THEN
|
||||
TIME_FORMAT(horario_saida, '%H:%i')
|
||||
ELSE
|
||||
'Não informado'
|
||||
END AS horario_saida
|
||||
"),
|
||||
)
|
||||
->groupBy('horario_saida')
|
||||
->get()
|
||||
->map(fn($query) => [
|
||||
'quantidade' => $query->quantidade,
|
||||
'horario_saida' => $query->horario_saida,
|
||||
])
|
||||
])
|
||||
];
|
||||
}
|
||||
|
||||
public static function getFaltasPaciente() {
|
||||
|
||||
$parametrizacao = Parametrizacao::first();
|
||||
|
||||
if ($parametrizacao && $parametrizacao->faltas && $parametrizacao->periodo) {
|
||||
|
||||
$dataAtual = Carbon::now();
|
||||
$dataDe = $dataAtual->copy()->subMonths($parametrizacao->periodo);
|
||||
|
||||
return Agendar::where('paciente_id', request()->paciente_id)
|
||||
->whereBetween('data', [$dataDe, $dataAtual])
|
||||
->where('status_id', Status::FALTOU)
|
||||
->select(
|
||||
DB::raw("LPAD(COUNT(*), 2, '0') AS total"),
|
||||
DB::raw("LPAD(" . $parametrizacao->faltas . ", 2, '0') AS limite"),
|
||||
DB::raw("LPAD(" . $parametrizacao->periodo . ", 2, '0') AS periodo")
|
||||
)
|
||||
->groupBy('paciente_id')
|
||||
->first();
|
||||
} else {
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
public static function getDestinos() {
|
||||
|
||||
return Destino::where('municipio_id', request()->municipio_id)
|
||||
->where('bloqueado', false)
|
||||
->orderBy('descricao_destino')
|
||||
->get()
|
||||
->map(fn($query) => [
|
||||
'id' => $query->id ?? null,
|
||||
'descricao' => $query->descricao_destino ?? null,
|
||||
]);
|
||||
}
|
||||
|
||||
public static function getPontos() {
|
||||
return DB::table('transporte_paciente_ponto')
|
||||
->where('bloqueado', false)
|
||||
->distinct()
|
||||
->select([
|
||||
'id',
|
||||
DB::raw('COALESCE(descricao, "CASA DO PACIENTE") AS descricao'),
|
||||
])
|
||||
->orderBy('descricao')
|
||||
->groupBy('descricao')
|
||||
->get();
|
||||
}
|
||||
|
||||
public static function getAgendadosPaciente() {
|
||||
|
||||
return Agendar::where('paciente_id', request()->paciente_id)
|
||||
->where('data_saida', request()->data_saida)
|
||||
->whereNotIn('status_id', [Status::CANCELADO, Status::TRANSPORTADO])
|
||||
->get()
|
||||
->map(fn($query) => [
|
||||
'id' => $query->id ?? null,
|
||||
'jornada_id' => $query->jornada_id ?? null,
|
||||
'jornada_descricao' => $query->jornada_id
|
||||
? (new Carbon($query->jornada->data_inicial))->format('d/m/Y H:i')
|
||||
. ' - '
|
||||
. (new Carbon($query->jornada->data_final))->format('d/m/Y H:i')
|
||||
. ' - '
|
||||
. $query->jornada_id
|
||||
: null,
|
||||
'veiculo_id' => $query->veiculo_id ?? null,
|
||||
'veiculo_descricao' => $query->veiculo_id
|
||||
? $query->veiculo->numero_placa . ' - ' . $query->veiculo->descricao_modelo
|
||||
: null,
|
||||
'numero_placa' => $query->veiculo->numero_placa ?? null,
|
||||
'descricao_modelo' => $query->veiculo->descricao_modelo ?? null,
|
||||
'data_inicial' => $query->jornada->data_inicial ?? $query->data,
|
||||
'data_final' => $query->jornada->data_final ?? $query->data,
|
||||
'data' => (new Carbon($query->data))->format('d/m/Y') ?? null,
|
||||
'horario' => (new Carbon($query->horario))->format('H:i') ?? null,
|
||||
'horario_saida' => (new Carbon($query->horario_saida))->format('H:i') ?? null,
|
||||
'destino_id' => $query->destino_id ?? null,
|
||||
'destino' => $query->destino->descricao_destino ?? null,
|
||||
'municipio_id' => $query->municipio_id ?? null,
|
||||
'municipio' => $query->municipio->nome ?? null,
|
||||
'uf' => $query->municipio->estado->uf ?? null,
|
||||
'status' => $query->status_id,
|
||||
'consulta_observacao' => $query->consulta_observacao,
|
||||
'observacao' => $query->observacao,
|
||||
'motivo_descricao' => $query->motivo->descricao,
|
||||
]);
|
||||
}
|
||||
|
||||
public static function getVeiculos($preAgendado = false, $dataSaida = null, $horarioSaida = null)
|
||||
{
|
||||
if (request()->boolean('agendar_transporte_jornada') || $preAgendado) {
|
||||
|
||||
$dataSaida = $preAgendado ? $dataSaida : request()->data_saida;
|
||||
$horarioSaida = $preAgendado ? $horarioSaida : request()->horario_saida;
|
||||
$horarioConsulta = request()->horario_consulta;
|
||||
$dataInicial = request()->data_inicial;
|
||||
$dataFinal = request()->data_final;
|
||||
$diaSemana = request()->dia_semana;
|
||||
|
||||
$veiculos = DB::table('transporte_paciente_veiculo as veiculo')
|
||||
->join('transporte_paciente_jornada as jornada', 'veiculo.id', 'jornada.veiculo_id')
|
||||
->select([
|
||||
'veiculo.id',
|
||||
'veiculo.numero_placa',
|
||||
'veiculo.descricao_modelo',
|
||||
'veiculo.numero_capacidade',
|
||||
'veiculo.tipo_id'
|
||||
])
|
||||
->when($horarioSaida, function ($query) use ($horarioSaida) {
|
||||
$query->where(DB::raw("DATE_FORMAT(jornada.data_inicial, '%H:%i')"), '<=', $horarioSaida)
|
||||
->where(DB::raw("DATE_FORMAT(jornada.data_final, '%H:%i')"), '>=', $horarioSaida);
|
||||
})
|
||||
->when($dataSaida, function ($query) use ($dataSaida) {
|
||||
$query->where(DB::raw("DATE_FORMAT(jornada.data_inicial, '%Y-%m-%d')"), '<=', $dataSaida)
|
||||
->where(DB::raw("DATE_FORMAT(jornada.data_final, '%Y-%m-%d')"), '>=', $dataSaida);
|
||||
})
|
||||
->when($horarioConsulta, function ($query) use ($horarioConsulta) {
|
||||
$query->where(DB::raw("DATE_FORMAT(jornada.data_inicial, '%H:%i')"), '<=', $horarioConsulta)
|
||||
->where(DB::raw("DATE_FORMAT(jornada.data_final, '%H:%i')"), '>=', $horarioConsulta);
|
||||
})
|
||||
->when($dataInicial, function ($query) use ($dataInicial, $dataFinal) {
|
||||
$query->where(DB::raw("DATE_FORMAT(jornada.data_inicial, '%Y-%m-%d')"), '>=', $dataInicial)
|
||||
->where(DB::raw("DATE_FORMAT(jornada.data_final, '%Y-%m-%d')"), '<=', $dataFinal);
|
||||
})
|
||||
->when($diaSemana, function ($query) use ($diaSemana) {
|
||||
$query->whereIn('jornada.geral_dia_semana_id', $diaSemana);
|
||||
})
|
||||
->where('veiculo.bloqueado', false)
|
||||
->orderBy('veiculo.numero_placa')
|
||||
->groupBy('veiculo.id')
|
||||
->get()
|
||||
->map(fn($query) => [
|
||||
'id' => $query->id ?? null,
|
||||
'descricao' => $query->numero_placa . ' - ' . $query->descricao_modelo,
|
||||
'capacidade' => $query->numero_capacidade ?? null,
|
||||
'tipo_id' => $query->tipo_id ?? null,
|
||||
'agendados' => Agendar::where('veiculo_id', $query->id)
|
||||
->whereNotIn('status_id', [Status::CANCELADO])
|
||||
->when($dataSaida, function ($query) use ($dataSaida) {
|
||||
$query->where(DB::raw("DATE_FORMAT(data_saida, '%Y-%m-%d')"), $dataSaida);
|
||||
})
|
||||
->when($dataInicial, function ($query) use ($dataInicial, $dataFinal) {
|
||||
$query->where(DB::raw("DATE_FORMAT(data_saida, '%Y-%m-%d')"), '>=', $dataInicial)
|
||||
->where(DB::raw("DATE_FORMAT(data_saida, '%Y-%m-%d')"), '<=', $dataFinal);
|
||||
})
|
||||
->select(
|
||||
DB::raw("DATE_FORMAT(data_saida, '%Y-%m-%d') as data_saida"),
|
||||
DB::raw('SUM(IFNULL(acompanhante, 0) + 1) AS quantidade')
|
||||
)
|
||||
->groupBy('veiculo_id', DB::raw("DATE_FORMAT(data_saida, '%Y-%m-%d')"))
|
||||
->get()
|
||||
->map(function($result) {
|
||||
return [
|
||||
'data_saida' => $result->data_saida,
|
||||
'quantidade' => $result->quantidade
|
||||
];
|
||||
})
|
||||
]);
|
||||
} else {
|
||||
|
||||
$veiculos = Veiculo::where('bloqueado', false)
|
||||
->get()
|
||||
->map(fn($query) => [
|
||||
'id' => $query->id ?? null,
|
||||
'descricao' => $query->numero_placa . ' - ' . $query->descricao_modelo,
|
||||
'capacidade' => $query->numero_capacidade ?? null,
|
||||
'tipo_id' => $query->tipo_id ?? null,
|
||||
'agendados' => Agendar::where('veiculo_id', $query->id)
|
||||
->whereNotIn('status_id', [Status::CANCELADO])
|
||||
->when($dataSaida, function ($query) use ($dataSaida) {
|
||||
$query->where(DB::raw("DATE_FORMAT(data_saida, '%Y-%m-%d')"), $dataSaida);
|
||||
})
|
||||
->select(
|
||||
DB::raw('SUM(IFNULL(acompanhante, 0) + 1) AS quantidade'),
|
||||
)
|
||||
->groupBy('veiculo_id')
|
||||
->first()
|
||||
]);
|
||||
}
|
||||
|
||||
return $veiculos;
|
||||
}
|
||||
|
||||
public static function getJornadas($IdVeiculo = false, $saidaDataHorario = false)
|
||||
{
|
||||
$paciente_id = request()->paciente_id;
|
||||
$gerenciamento = request()->gerenciamento;
|
||||
$dataHorarioSaida = request()->data_horario_saida;
|
||||
$dataInicial = request()->data_inicial ? request()->data_inicial : request()->data_saida;
|
||||
$dataFinal = request()->data_final ? request()->data_final : request()->data_saida;
|
||||
$diaSemana = request()->dia_semana;
|
||||
$veiculoId = request()->veiculo_id;
|
||||
|
||||
$jornadas = DB::table('transporte_paciente_jornada as jornada')
|
||||
->join('transporte_paciente_veiculo as veiculo', 'jornada.veiculo_id', 'veiculo.id')
|
||||
->join('geral_dia_semana as dia_semana', 'jornada.geral_dia_semana_id', 'dia_semana.id')
|
||||
->leftJoin(DB::raw(
|
||||
'(SELECT jornada_id, paciente_id, status_id, SUM(IFNULL(acompanhante, 0) + 1) AS total_agendados
|
||||
FROM transporte_paciente_agendar_transporte where status_id NOT IN ('.Status::CANCELADO.')'
|
||||
.($paciente_id && !$gerenciamento ? " and paciente_id <> $paciente_id" : '').
|
||||
' GROUP BY jornada_id) AS agendamentos'),
|
||||
'jornada.id', '=', 'agendamentos.jornada_id'
|
||||
)
|
||||
->when(request()->veiculo_id, fn ($query) => $query->where('jornada.veiculo_id', request()->veiculo_id))
|
||||
->when($dataHorarioSaida, function ($query) use ($dataHorarioSaida) {
|
||||
$query->where('jornada.data_inicial', '<=', $dataHorarioSaida)
|
||||
->where('jornada.data_final', '>=', $dataHorarioSaida);
|
||||
})
|
||||
->when($dataInicial, function ($query) use ($dataInicial, $dataFinal) {
|
||||
$query->where(DB::raw("DATE_FORMAT(jornada.data_inicial, '%Y-%m-%d')"), '>=', $dataInicial)
|
||||
->where(DB::raw("DATE_FORMAT(jornada.data_final, '%Y-%m-%d')"), '<=', $dataFinal);
|
||||
})
|
||||
->when($diaSemana, function ($query) use ($diaSemana) {
|
||||
$query->whereIn('jornada.geral_dia_semana_id', $diaSemana);
|
||||
})
|
||||
->when($saidaDataHorario, function ($query) use ($saidaDataHorario) {
|
||||
$query->where('jornada.data_inicial', '>=', $saidaDataHorario)
|
||||
->where('jornada.data_final', '<=', $saidaDataHorario);
|
||||
})
|
||||
->select(
|
||||
'jornada.id',
|
||||
'jornada.data_inicial',
|
||||
'jornada.data_final',
|
||||
'veiculo.numero_placa',
|
||||
'veiculo.id as veiculo_id',
|
||||
'veiculo.numero_capacidade',
|
||||
'veiculo.tipo_id',
|
||||
'veiculo.tipo_passageiro_id as veiculo_tipo_passageiro_id',
|
||||
'dia_semana.id as geral_dia_semana_id',
|
||||
'dia_semana.descricao as geral_dia_semana_descricao',
|
||||
DB::raw('COALESCE(agendamentos.total_agendados, 0) as total_agendados'),
|
||||
DB::raw("CONCAT(
|
||||
DATE_FORMAT(jornada.data_inicial, '%d/%m/%Y %H:%i'),
|
||||
' - ',
|
||||
DATE_FORMAT(jornada.data_final, '%d/%m/%Y %H:%i'),
|
||||
' - ',
|
||||
jornada.id
|
||||
) AS descricao")
|
||||
)
|
||||
->orderBy('jornada.data_inicial')
|
||||
->get();
|
||||
|
||||
return $jornadas;
|
||||
}
|
||||
|
||||
private static function validate()
|
||||
{
|
||||
return request()->validate(
|
||||
[
|
||||
'data' => [
|
||||
'required',
|
||||
],
|
||||
'data_saida' => [
|
||||
'required',
|
||||
],
|
||||
'horario' => [
|
||||
'required',
|
||||
],
|
||||
'destino_id' => [
|
||||
'required',
|
||||
'integer',
|
||||
],
|
||||
'motivo_id' => [
|
||||
'required',
|
||||
'integer',
|
||||
],
|
||||
'municipio_id' => [
|
||||
'required',
|
||||
'integer',
|
||||
],
|
||||
'ponto_id' => [
|
||||
'required',
|
||||
'integer',
|
||||
],
|
||||
],
|
||||
[
|
||||
'data.required' => 'É obrigatório informar a data',
|
||||
'data_saida.required' => 'É obrigatório informar a data da saída',
|
||||
'horario.required' => 'É obrigatório informar o horário',
|
||||
'destino_id.required' => 'É obrigatório informar o destino',
|
||||
'motivo_id.required' => 'É obrigatório informar o motivo',
|
||||
'municipio_id.required' => 'É obrigatório informar o município',
|
||||
'ponto_id.required' => 'É obrigatório informar o ponto de referência',
|
||||
'municipio_id.required' => 'É obrigatório informar o município',
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
public static function editHorario()
|
||||
{
|
||||
return [
|
||||
'form' => [
|
||||
'minDate' => Carbon::now()->format('Y-m-d'),
|
||||
'municipios' => self::getMunicipios(),
|
||||
'locais' => self::getLocais(),
|
||||
'horarios' => self::getHorarios(),
|
||||
],
|
||||
'model' => [
|
||||
'data' => Carbon::now()->format('Y-m-d'),
|
||||
'municipio_id' => null,
|
||||
'destino_id' => null,
|
||||
'horario' => null,
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
public static function getMunicipios()
|
||||
{
|
||||
return DB::table('transporte_paciente_agendar_transporte as agendar')
|
||||
->select('agendar.municipio_id as id', 'municipio.nome')
|
||||
->where('agendar.data', request()->data ?? Carbon::now()->format('Y-m-d'))
|
||||
->where('agendar.status_id', Status::AGENDADO)
|
||||
->when(request()->destino_id, function ($query) {
|
||||
$query->where('destino_id', request()->destino_id);
|
||||
})
|
||||
->when(request()->horario, function ($query) {
|
||||
$query->where('horario', request()->horario);
|
||||
})
|
||||
->join('intranet.cadastro_municipio as municipio', 'municipio.id', '=', 'agendar.municipio_id')
|
||||
->groupBy('id')
|
||||
->get();
|
||||
}
|
||||
|
||||
public static function getLocais()
|
||||
{
|
||||
return DB::table('transporte_paciente_agendar_transporte as agendar')
|
||||
->select('agendar.destino_id as id', 'destino.descricao_destino as descricao')
|
||||
->where('agendar.data', request()->data ?? Carbon::now()->format('Y-m-d'))
|
||||
->where('agendar.status_id', Status::AGENDADO)
|
||||
->when(request()->municipio_id, function ($query) {
|
||||
$query->where('agendar.municipio_id', request()->municipio_id);
|
||||
})
|
||||
->when(request()->horario, function ($query) {
|
||||
$query->where('horario', request()->horario);
|
||||
})
|
||||
->join('transporte_paciente_destino as destino', 'destino.id', '=', 'agendar.destino_id')
|
||||
->groupBy('id')
|
||||
->get();
|
||||
}
|
||||
|
||||
public static function getHorarios()
|
||||
{
|
||||
return DB::table('transporte_paciente_agendar_transporte as agendar')
|
||||
->select('horario')
|
||||
->where('agendar.data', request()->data ?? Carbon::now()->format('Y-m-d'))
|
||||
->where('agendar.status_id', Status::AGENDADO)
|
||||
->when(request()->municipio_id, function ($query) {
|
||||
$query->where('municipio_id', request()->municipio_id);
|
||||
})
|
||||
->when(request()->destino_id, function ($query) {
|
||||
$query->where('destino_id', request()->destino_id);
|
||||
})
|
||||
->groupBy('horario')
|
||||
->get();
|
||||
}
|
||||
|
||||
public static function getAgendamentos()
|
||||
{
|
||||
return DB::table('transporte_paciente_agendar_transporte as agendar')
|
||||
->select(
|
||||
'agendar.id',
|
||||
'cidadao.nome',
|
||||
'paciente.prontuario',
|
||||
'cidadao.data_nascimento',
|
||||
'destino.descricao_destino as destino',
|
||||
'agendar.horario',
|
||||
'agendar.horario_saida',
|
||||
'ponto.descricao as ponto',
|
||||
)
|
||||
->where('agendar.data', request()->data)
|
||||
->where('agendar.status_id', Status::AGENDADO)
|
||||
->when(request()->municipio_id, function ($query) {
|
||||
$query->where('agendar.municipio_id', request()->municipio_id);
|
||||
})
|
||||
->when(request()->destino_id, function ($query) {
|
||||
$query->where('destino_id', request()->destino_id);
|
||||
})
|
||||
->when(request()->horario, function ($query) {
|
||||
$query->where('horario', request()->horario);
|
||||
})
|
||||
->join('cadastro_paciente as paciente', 'agendar.paciente_id', '=', 'paciente.id')
|
||||
->join('cadastro_cidadao as cidadao', 'paciente.cidadao_id', '=', 'cidadao.id')
|
||||
->join('transporte_paciente_destino as destino', 'agendar.destino_id', '=', 'destino.id')
|
||||
->join('transporte_paciente_ponto as ponto', 'agendar.ponto_id', '=', 'ponto.id')
|
||||
->get();
|
||||
}
|
||||
|
||||
private static function getPreAgendamentos($id)
|
||||
{
|
||||
return PreAgendamentoTransporte::where('paciente_id', $id)
|
||||
->doesntHave('agendamento')
|
||||
->whereDate('data', '>=', Carbon::now())
|
||||
->get()
|
||||
->map(function($query) {
|
||||
return [
|
||||
'id' => $query->id,
|
||||
'paciente_id' => $query->paciente_id,
|
||||
'tipo_passgeiro_id' => $query->tipo_passageiro_id,
|
||||
'municipio' => $query->municipio->nome,
|
||||
'municipio_id' => $query->municipio_id,
|
||||
'transportePacienteDestino' => $query->destino->descricao_destino,
|
||||
'destino_id' => $query->destino_id,
|
||||
'transportePacienteMotivo' => $query->motivo->descricao,
|
||||
'motivo_id' => $query->motivo_id,
|
||||
'preAgendamentoData' => $query->data,
|
||||
'data' => Carbon::parse($query->data)->format('d/m/Y'),
|
||||
'data_saida' => Carbon::parse($query->data_saida)->format('d/m/Y'),
|
||||
'horario' => Carbon::parse($query->horario)->format('H:i'),
|
||||
'horario_saida' => $query->horario_saida,
|
||||
'acompanhante' => $query->acompanhante,
|
||||
'acompanhante_1_id' => $query->acompanhante_1_id,
|
||||
'acompanhante1' => $query->acompanhante1->usuario ?? null,
|
||||
'relacao1' => $query->acompanhante1->relacao_id ?? null,
|
||||
'acompanhante_2_id' => $query->acompanhante_2_id,
|
||||
'acompanhante2' => $query->acompanhante2->usuario ?? null,
|
||||
'relacao2' => $query->acompanhante2->relacao_id ?? null,
|
||||
'veiculo_id' => $query->veiculo_id,
|
||||
'jornada_id' => $query->jornada_id,
|
||||
'ponto_id' => $query->ponto_id,
|
||||
'observacao' => $query->observacao,
|
||||
'veiculo_capacidade' => $query->veiculo->numero_capacidade ?? null,
|
||||
'veiculo_tipo_id' => $query->veiculo->tipo_id ?? null,
|
||||
'selecionado' => false,
|
||||
];
|
||||
});
|
||||
}
|
||||
|
||||
public static function updateHorario($request)
|
||||
{
|
||||
foreach($request->agendamentos as $agendamento){
|
||||
$agendar = Agendar::find($agendamento['id']);
|
||||
$ultimaLotacao = $agendar->updated_lotacao_id;
|
||||
|
||||
$agendar->horario_saida = $agendamento['novo_horario'];
|
||||
$agendar->save();
|
||||
|
||||
HistoricoService::create($agendar, Status::MODIFICADO, $ultimaLotacao);
|
||||
}
|
||||
}
|
||||
|
||||
public static function salvarObservacao()
|
||||
{
|
||||
$ultimo_agendamento = Agendar::where('paciente_id', request()->id)->latest()->first();
|
||||
if($ultimo_agendamento) {
|
||||
$ultimo_agendamento->observacao = request()->observacao;
|
||||
$ultimo_agendamento->save();
|
||||
|
||||
HistoricoService::create($ultimo_agendamento, Status::MODIFICADO, $ultimo_agendamento->updated_lotacao_id);
|
||||
}
|
||||
}
|
||||
|
||||
public static function getHistoricos($id)
|
||||
{
|
||||
return HistoricoService::show($id);
|
||||
}
|
||||
|
||||
public static function getTipoPassageiros()
|
||||
{
|
||||
return DB::table('transporte_paciente_jornada as jornada')
|
||||
->select(
|
||||
'tipo_passageiro.descricao',
|
||||
'tipo_passageiro.id'
|
||||
)
|
||||
->join('transporte_paciente_veiculo as veiculo', 'jornada.veiculo_id', 'veiculo.id')
|
||||
->join('transporte_paciente_veiculo_tipo_passageiro as tipo_passageiro', 'veiculo.tipo_passageiro_id', 'tipo_passageiro.id')
|
||||
->whereRaw('DATE_FORMAT(jornada.data_inicial, "%Y-%m-%d") >= ?', [request()->data_saida])
|
||||
->whereRaw('DATE_FORMAT(jornada.data_final, "%Y-%m-%d") >= ?', [request()->data_saida])
|
||||
->when(request()->horario_saida, function($query) {
|
||||
return $query->whereRaw('DATE_FORMAT(jornada.data_inicial, "%H:%i") <= ?', [request()->horario_saida]);
|
||||
})
|
||||
->when(request()->horario_saida, function($query) {
|
||||
return $query->whereRaw('DATE_FORMAT(jornada.data_final, "%H:%i") >= ?', [request()->horario_saida]);
|
||||
})
|
||||
->orderBy('tipo_passageiro.descricao')
|
||||
->groupBy('tipo_passageiro.id')
|
||||
->get();
|
||||
}
|
||||
|
||||
private static function getPermissoesAtualizacaoCadastroPaciente()
|
||||
{
|
||||
$parametrizacao = CnsService::getParametrizacao();
|
||||
|
||||
if (!is_null($parametrizacao)) {
|
||||
$lotacao = self::getCurrentLotacao();
|
||||
|
||||
return DB::table('cadastro_parametrizacao_permissao_usuario')
|
||||
->select([
|
||||
'municipe',
|
||||
'provisorio',
|
||||
'outro_municipio',
|
||||
])
|
||||
->where('infraestrutura_id', $lotacao->infraestrutura_id)
|
||||
->where('usuario_id', $lotacao->usuario_id)
|
||||
->get()
|
||||
->first();
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public static function getAreaMicroarea($usuario, $lotacao, $infraestrutura, $unidade)
|
||||
{
|
||||
return DB::table('cadastro_lotacao')
|
||||
->select('atencao_basica_parametrizacao_area.descricao AS area',
|
||||
'atencao_basica_parametrizacao_microarea.descricao AS microarea'
|
||||
)
|
||||
->join('atencao_basica_parametrizacao_equipe_usuario', 'atencao_basica_parametrizacao_equipe_usuario.usuario_id', 'cadastro_lotacao.usuario_id')
|
||||
->join('atencao_basica_parametrizacao_equipe', 'atencao_basica_parametrizacao_equipe.id', 'atencao_basica_parametrizacao_equipe_usuario.equipe_id')
|
||||
->leftJoin('atencao_basica_parametrizacao_area', 'atencao_basica_parametrizacao_area.id', 'atencao_basica_parametrizacao_equipe.area_id')
|
||||
->leftJoin('atencao_basica_parametrizacao_microarea', 'atencao_basica_parametrizacao_microarea.id', 'atencao_basica_parametrizacao_equipe.microarea_id')
|
||||
->where('cadastro_lotacao.id', $lotacao)
|
||||
->where('atencao_basica_parametrizacao_equipe_usuario.usuario_id', $usuario)
|
||||
->where('atencao_basica_parametrizacao_equipe.infraestrutura_id', $infraestrutura)
|
||||
->where('atencao_basica_parametrizacao_equipe.unidade_id', $unidade)
|
||||
->first();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user