format('Y-m-d'); $agendamentos = DB::table('transporte_paciente_agendar_transporte') ->select([ 'transporte_paciente_agendar_transporte.id', 'transporte_paciente_agendar_transporte.supervisor_id', 'transporte_paciente_agendar_transporte.jornada_id', DB::raw('DATE_FORMAT(transporte_paciente_agendar_transporte.data, "%d/%m/%Y") AS data_consulta'), DB::raw('DATE_FORMAT(transporte_paciente_agendar_transporte.data_saida, "%d/%m/%Y") AS data_saida'), DB::raw('TIME_FORMAT(transporte_paciente_agendar_transporte.horario, "%H:%i") AS horario_consulta'), DB::raw('COALESCE( pre.observacao, transporte_paciente_agendar_transporte.consulta_observacao, NULL ) AS consulta_observacao'), 'transporte_paciente_agendar_transporte.horario_saida', DB::raw('COALESCE(transporte_paciente_agendar_transporte.acompanhante, "NÃO") AS acompanhante'), DB::raw('COALESCE(transporte_paciente_ponto.descricao, "CASA DO PACIENTE") AS ponto'), DB::raw('COALESCE(transporte_paciente_destino.descricao_destino, "-") AS destino'), 'intranet.cadastro_municipio.nome AS municipio', 'cadastro_paciente.id AS paciente_id', 'cadastro_cidadao.nome AS paciente_nome', 'cadastro_cidadao.preferencia_nome_id AS paciente_preferencia_nome_id', 'cadastro_cidadao.nome_social AS paciente_nome_social', 'usuario_cidadao.nome AS profissional_nome', 'cadastro_cidadao.sexo_id AS paciente_sexo_id', 'transporte_paciente_agendar_transporte.status_id', DB::raw('DATE_FORMAT(cadastro_cidadao.data_nascimento, "%d/%m/%Y") AS paciente_nascimento'), DB::raw('LPAD(cadastro_paciente.prontuario,7,0) as paciente_prontuario'), DB::raw('CONCAT(TIMESTAMPDIFF(YEAR, cadastro_cidadao.data_nascimento, transporte_paciente_agendar_transporte.data), " anos") AS paciente_idade'), DB::raw('false AS selecionado'), DB::raw('null AS veiculo_id'), DB::raw('"NÃO ATRIBUÍDO" AS veiculo_nome'), 'transporte_paciente_veiculo_tipo_passageiro.id AS tipo_passageiro_id', 'transporte_paciente_veiculo_tipo_passageiro.descricao AS tipo_passageiro_descricao', ]) ->join('transporte_paciente_ponto', 'transporte_paciente_ponto.id', 'transporte_paciente_agendar_transporte.ponto_id') ->join('transporte_paciente_destino', 'transporte_paciente_destino.id', 'transporte_paciente_agendar_transporte.destino_id') ->join('intranet.cadastro_municipio', 'intranet.cadastro_municipio.id', 'transporte_paciente_agendar_transporte.municipio_id') ->join('cadastro_paciente', 'cadastro_paciente.id', 'transporte_paciente_agendar_transporte.paciente_id') ->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_paciente.cidadao_id') ->join( 'cadastro_lotacao', 'cadastro_lotacao.id', 'transporte_paciente_agendar_transporte.created_lotacao_id' ) ->join( 'cadastro_usuario AS usuario_lotacao', 'usuario_lotacao.id', 'cadastro_lotacao.usuario_id' ) ->join( 'cadastro_cidadao AS usuario_cidadao', 'usuario_cidadao.id', 'usuario_lotacao.cidadao_id' ) ->leftJoin( 'transporte_paciente_pre_agendamento_transporte as pre', 'pre.id', 'transporte_paciente_agendar_transporte.pre_agendamento_id' ) ->leftJoin( 'transporte_paciente_veiculo_tipo_passageiro', 'transporte_paciente_veiculo_tipo_passageiro.id', 'transporte_paciente_agendar_transporte.tipo_passageiro_id' ); $agendamentos->whereNull('transporte_paciente_agendar_transporte.veiculo_id'); $agendamentos = $agendamentos->whereIn('transporte_paciente_agendar_transporte.status_id', [Status::AGENDADO, Status::MODIFICADO, Status::REAGENDADO]); if (request()->data_saida) { $agendamentos->where('transporte_paciente_agendar_transporte.data_saida', request()->data_saida); } else { $agendamentos->where('transporte_paciente_agendar_transporte.data_saida', $currentDate); } if (request()->municipio_id) { $agendamentos->where('transporte_paciente_agendar_transporte.municipio_id', request()->municipio_id); } if (request()->destino_id) { $agendamentos->where('transporte_paciente_agendar_transporte.destino_id', request()->destino_id); } if (request()->tipo_passageiro_id) { $agendamentos->where('transporte_paciente_agendar_transporte.tipo_passageiro_id', request()->tipo_passageiro_id); } if (request()->horario_saida) { $agendamentos->where('transporte_paciente_agendar_transporte.horario_saida', request()->horario_saida); } if (request()->ordenacao) { if (request()->ordenacao == 'paciente') { $agendamentos = $agendamentos->orderBy('cadastro_cidadao.nome'); } else if (request()->ordenacao == 'agendamento') { $agendamentos = $agendamentos->orderBy('transporte_paciente_agendar_transporte.id'); } else if (request()->ordenacao == 'data_consulta') { $agendamentos = $agendamentos ->orderBy('transporte_paciente_agendar_transporte.data') ->orderBy('transporte_paciente_agendar_transporte.horario'); } else if (request()->ordenacao == 'hora_saida') { $agendamentos = $agendamentos ->orderBy('transporte_paciente_agendar_transporte.data_saida') ->orderBy('transporte_paciente_agendar_transporte.horario_saida'); } else if (request()->ordenacao == 'local_consulta') { $agendamentos = $agendamentos ->orderBy('transporte_paciente_destino.descricao_destino'); } else if (request()->ordenacao == 'ponto_referencia') { $agendamentos = $agendamentos ->orderBy(DB::raw('COALESCE(transporte_paciente_ponto.descricao, "CASA DO PACIENTE")')); } } else { $agendamentos = $agendamentos ->orderBy('transporte_paciente_agendar_transporte.horario_saida'); } $agendamentos = $agendamentos->get(); $parametrizacao = Parametrizacao::first(); return [ 'veiculos' => self::getVeiculos($parametrizacao->agendar_transporte_jornada ?? null), 'jornadas' => self::getJornadas(), 'agendamentos' => $agendamentos, 'agendamentos_jornada' => self::getAgendadosPaciente() ]; } public static function getAgendadosPaciente() { return Agendar::where('data_saida', request()->data_saida) ->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); }) ->when(request()->horario_saida, function ($query) { $query->where('horario_saida', request()->horario_saida); }) ->whereNotNull('veiculo_id') ->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, 'paciente_id' => $query->paciente_id ?? null, 'paciente_nome' => $query->paciente->cidadao->nome ?? null, 'veiculo_id' => $query->veiculo_id ?? 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, 'destino' => $query->destino->descricao_destino ?? null, 'municipio' => $query->municipio->nome ?? null, 'uf' => $query->municipio->estado->uf ?? null, 'motivo' => $query->motivo->descricao ?? null, 'observacao' => $query->observacao, ]); } public static function loadFields() { return [ 'form' => self::getFormData() ]; } private static function getFormData() { $now = Carbon::now(); $currentDate = $now->format('Y-m-d'); $parametrizacao = Parametrizacao::first(); return [ 'data_atual' => $now->format('d/m/Y'), 'periodo' => [ 'start' => $currentDate, 'end' => $currentDate, ], 'municipios' => self::getMunicipios(), 'destinos' => self::getDestinos(), 'horariosSaida' => self::getHorariosSaida(), 'tipos_passageiro' => TipoPassageiro::orderBy('descricao')->get(), 'tipos_veiculo' => Tipo::orderBy('descricao')->get(), 'horario_saida' => $parametrizacao->horario_saida ?? null, 'mensagem_protocolo' => $parametrizacao->mensagem_protocolo ?? null, 'agendar_transporte_jornada' => $parametrizacao->agendar_transporte_jornada ?? null, 'ordenacao' => [ ['value' => 'agendamento', 'text' => 'AGENDAMENTO'], ['value' => 'data_consulta', 'text' => 'DATA / HORA DA CONSULTA'], ['value' => 'hora_saida', 'text' => 'HORÁRIO DE SAÍDA'], ['value' => 'local_consulta', 'text' => 'LOCAL DE CONSULTA'], ['value' => 'paciente', 'text' => 'PACIENTE'], ['value' => 'ponto_referencia', 'text' => 'PONTO DE REFERÊNCIA'], ], ]; } public static function getVeiculos($jornada) { if ($jornada) { $veiculos = DB::table('transporte_paciente_veiculo as veiculo') ->join('transporte_paciente_jornada as jornada', 'veiculo.id', 'jornada.veiculo_id') ->when(request()->tipo_passageiro_id, function ($query) { if (in_array(request()->tipo_passageiro_id, [3, 4])) { $query->whereIn('veiculo.tipo_passageiro_id', [3, 4]); } else { $query->where('veiculo.tipo_passageiro_id', request()->tipo_passageiro_id); } }) ->when(request()->horario_saida, function ($query) { $query->where(DB::raw("DATE_FORMAT(jornada.data_inicial, '%H:%i')"), '<=', request()->horario_saida) ->where(DB::raw("DATE_FORMAT(jornada.data_final, '%H:%i')"), '>=', request()->horario_saida); }) ->when(request()->data_saida, function ($query) { $query->where(DB::raw("DATE_FORMAT(jornada.data_inicial, '%Y-%m-%d')"), '<=', request()->data_saida) ->where(DB::raw("DATE_FORMAT(jornada.data_final, '%Y-%m-%d')"), '>=', request()->data_saida); }) ->where('veiculo.bloqueado', false) ->select( 'veiculo.id', DB::raw('CONCAT( veiculo.numero_placa, " - ", veiculo.descricao_modelo ) AS descricao') ) ->orderBy('veiculo.numero_placa') ->groupBy('veiculo.id') ->get(); } 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(request()->data_saida, function ($query) { $query->where(DB::raw("DATE_FORMAT(data_saida, '%Y-%m-%d')"), request()->data_saida); }) ->select( DB::raw('SUM(IFNULL(acompanhante, 0) + 1) AS quantidade'), ) ->groupBy('veiculo_id') ->first() ]); } return $veiculos; } public static function getJornadas() { $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, SUM(IFNULL(acompanhante, 0) + 1) AS total_agendados FROM transporte_paciente_agendar_transporte where status_id NOT IN ('.Status::CANCELADO.') 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)) ->where(DB::raw("DATE_FORMAT(jornada.data_inicial, '%Y-%m-%d')"), '<=', request()->data_saida) ->where(DB::raw("DATE_FORMAT(jornada.data_final, '%Y-%m-%d')"), '>=', request()->data_saida) ->select( 'jornada.id', 'jornada.data_inicial', 'jornada.data_final', 'veiculo.id as veiculo_id', 'veiculo.numero_placa', 'veiculo.numero_capacidade', 'veiculo.tipo_id', 'dia_semana.id as geral_dia_semana_id', 'dia_semana.descricao as geral_dia_semana_descricao', 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"), DB::raw('COALESCE(agendamentos.total_agendados, 0) as total_agendados') ) ->orderBy('jornada.data_inicial') ->get(); return $jornadas; } public static function getHorariosSaida() { $now = Carbon::now(); $currentDate = $now->format('Y-m-d'); $data_saida = request()->data_saida ?? $currentDate; return Agendar::where('data_saida', $data_saida) ->whereNotNull('horario_saida') ->whereNull('veiculo_id') ->whereNotIn('status_id', [Status::CANCELADO, Status::TRANSPORTADO]) ->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); }) ->select(DB::raw("TIME_FORMAT(horario_saida, '%H:%i') as horario_saida")) ->distinct() ->orderBy('horario_saida') ->get(); } public static function getMunicipios() { $now = Carbon::now(); $currentDate = $now->format('Y-m-d'); $data_saida = request()->data_saida ?? $currentDate; return Agendar::leftJoin('intranet.cadastro_municipio', 'intranet.cadastro_municipio.id', '=', 'transporte_paciente_agendar_transporte.municipio_id') ->where('transporte_paciente_agendar_transporte.data_saida', $data_saida) ->whereNull('transporte_paciente_agendar_transporte.veiculo_id') ->whereNotIn('transporte_paciente_agendar_transporte.status_id', [Status::CANCELADO, Status::TRANSPORTADO]) ->select('intranet.cadastro_municipio.id','intranet.cadastro_municipio.nome') ->distinct() ->get(); } public static function getDestinos() { $now = Carbon::now(); $currentDate = $now->format('Y-m-d'); $data_saida = request()->data_saida ?? $currentDate; return Destino::leftJoin('transporte_paciente_agendar_transporte', 'transporte_paciente_agendar_transporte.destino_id', '=', 'transporte_paciente_destino.id') ->whereNull('transporte_paciente_agendar_transporte.veiculo_id') ->whereNotIn('transporte_paciente_agendar_transporte.status_id', [Status::CANCELADO, Status::TRANSPORTADO]) ->where('transporte_paciente_destino.municipio_id', request()->municipio_id) ->where('transporte_paciente_agendar_transporte.data_saida', $data_saida) ->where('transporte_paciente_destino.bloqueado', false) ->select('transporte_paciente_destino.id','transporte_paciente_destino.descricao_destino as descricao') ->distinct() ->get(); } private static function getModelData($destino = null) { $destino = [ 'id' => $destino->id ?? null, 'municipio_id' => $destino->municipio_id ?? null, 'destino_id' => $destino->destino_id ?? null, 'data_saida' => $destino->data_saida ?? null, 'horario_saida' => $destino->horario_saida ?? null, 'jornada_id' => $destino->jornada_id ?? null, 'veiculo_id' => $destino->veiculo_id ?? null, 'ordenacao' => $destino->ordenacao ?? null, 'total_agendados' => $destino->total_agendados ?? null, 'capacidade' => $destino->capacidade ?? null, 'tipo_veiculo_id' => $destino->tipo_veiculo_id ?? null, 'tipo_passageiro_id' => $destino->tipo_passageiro_id ?? null, 'supervisor_id' => $destino->supervisor_id ?? null, 'total_agendados' => $destino->total_agendados ?? null, 'capacidade' => $destino->capacidade ?? null, ]; return $destino; } public static function create() { return [ 'form' => self::getFormData(), 'model' => self::getModelData(), ]; } public static function store() { foreach (request()->all() as $params) { if ($params['supervisor_id'] === null && $params['veiculo_id'] !== null) { $capacidade = intval($params['capacidade']) ?? 0; $agendados = intval($params['total_agendados']) ?? 0; if ($agendados > $capacidade ) { throw new ExceededCapacidadeVeiculoException; } } $escolher = Agendar::where('id', $params['id'])->first(); $escolher->veiculo_id = $params['veiculo_id']; $escolher->horario_saida = $params['horario_saida']; $escolher->supervisor_id = $params['supervisor_id']; $escolher->jornada_id = $params['jornada_id']; $escolher->veiculo_edited_by = self::getCurrentLotacao()->usuario->id; $escolher->veiculo_edited_at = Carbon::now(); $escolher->funcionalidade_origem = Funcionalidade::ESCOLHER_VEICULO; $escolher->save(); HistoricoService::create($escolher, Status::MODIFICADO, $escolher->updated_lotacao_id); } } }