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

926 lines
42 KiB
PHP

<?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();
}
}