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