join( 'transporte_paciente_veiculo_tipo_passageiro as tipo_passageiro', 'veiculo.tipo_passageiro_id', 'tipo_passageiro.id' ) ->join( 'transporte_paciente_veiculo_cor as cor', 'veiculo.cor_id', 'cor.id' ) ->join( 'transporte_paciente_veiculo_marca as marca', 'veiculo.marca_id', 'marca.id' ) ->join( 'transporte_paciente_veiculo_tipo as tipo', 'veiculo.tipo_id', 'tipo.id' ) ->where('veiculo.id', $idVeiculo) ->select( 'veiculo.id', 'veiculo.numero_placa', 'veiculo.descricao_modelo', 'veiculo.ano_fabricacao', 'veiculo.numero_capacidade', 'marca.descricao as descricao_marca', 'tipo.descricao as descricao_tipo', 'tipo_passageiro.descricao as passageiro_descricao_tipo', 'cor.descricao as descricao_cor', ) ->first(1); $veiculo->numero_placa = MaskUtil::getPlacaMasked($veiculo->numero_placa); return $veiculo; } private static function obterJornadas($idVeiculo) { $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') ->where('jornada.veiculo_id', $idVeiculo) ->select( 'jornada.id', 'jornada.data_inicial', 'jornada.data_final', 'veiculo.numero_placa', 'dia_semana.id as geral_dia_semana_id', 'dia_semana.descricao as geral_dia_semana_descricao', DB::raw('false AS selecionado'), DB::raw('(SELECT agendar.id FROM transporte_paciente_agendar_transporte as agendar WHERE agendar.jornada_id = jornada.id AND (agendar.status_id != "' . Status::CANCELADO . '" OR agendar.status_id IS NULL) LIMIT 1) as vinculo' ) ) ->orderBy('jornada.data_inicial') ->get(); return $jornadas; } private static function getFormData($idVeiculo = null) { return [ 'veiculo' => self::obterInformacoesVeiculo($idVeiculo), 'dias_semana' => self::obterDiasSemana(), 'data_atual' => Carbon::now()->format('Y-m-d'), 'feriados' => self::getFeriados(), 'tipo_jornada' => [ ['value' => 'unica', 'text' => 'Única'], ], ]; } private static function getFeriados() { return Feriado::whereHas('modulos', fn ($q) => $q ->where('identificador', Modulo::TRANSPORTE_PACIENTE) ) ->orderBy('id') ->get() ->map(fn ($feriado) => (object) [ 'id' => $feriado->id, 'data' => (new Carbon($feriado->data))->format('d/m/Y') ?? null, 'tipo_nome' => $feriado->tipo->descricao, 'observacao' => $feriado->observacao, 'modulos' => $feriado->modulos->pluck('id'), ]); } private static function obterDiasSemana() { return DiaSemana::get() ->map(fn ($feriado) => [ 'id' => $feriado->id, 'descricao' => $feriado->descricao, 'disabled' => true, ]); } private static function getModelData($idVeiculo = null) { return [ 'jornadas' => self::obterJornadas($idVeiculo), 'jornadasNotSave' => null, ]; } public static function create() { return [ 'form' => self::getFormData(), 'model' => self::getModelData(), ]; } public static function edit($idVeiculo) { return [ 'form' => self::getFormData($idVeiculo), 'model' => self::getModelData($idVeiculo), ]; } public static function destroySelected() { try { $ids = request()->ids; $deletarVariasJornadas = Agendar::where('jornada_id', $ids) ->where(function ($query) { $query->whereNotIn('status_id', [Status::CANCELADO]) ->orWhereNull('status_id'); })->get(); if ($deletarVariasJornadas) { Agendar::where('jornada_id', $ids)->update(['jornada_id' => null]); } DB::transaction(function () use ($ids) { Viagem::whereIn('jornada_id', $ids)->delete(); Jornada::whereIn('id', $ids)->delete(); }); } catch (\Throwable $th) { throw new DeletingModelException; } } public static function destroy($id) { try { $deletarJornada = Agendar::where('jornada_id', $id) ->where(function ($query) { $query->whereNotIn('status_id', [Status::CANCELADO]) ->orWhereNull('status_id'); })->get(); if ($deletarJornada) { Agendar::where('jornada_id', $id)->update(['jornada_id' => null]); } DB::transaction(function () use ($id) { Viagem::where('jornada_id', $id)->delete(); Jornada::destroy($id); }); } catch (\Throwable $th) { throw new DeletingModelException; } } public static function store() { self::validate(); DB::transaction(function () { foreach (request()->jornadas as $jornada) { if (is_numeric($jornada['id'])) { $existingJornada = Jornada::find($jornada['id']); if ($existingJornada) { $existingJornada->update($jornada); } } else { unset($jornada['id']); Jornada::create($jornada); } } }); return response()->json(null, Response::HTTP_NO_CONTENT); } public static function datatable() { $veiculos = DB::table('transporte_paciente_veiculo as veiculo') ->join( 'transporte_paciente_veiculo_cor as cor', 'veiculo.cor_id', 'cor.id' ) ->join( 'transporte_paciente_veiculo_marca as marca', 'veiculo.marca_id', 'marca.id' ) ->join( 'transporte_paciente_veiculo_tipo as tipo', 'veiculo.tipo_id', 'tipo.id' ) ->where('veiculo.bloqueado', false) ->select( 'veiculo.id', 'veiculo.numero_placa', 'veiculo.descricao_modelo', 'veiculo.descricao_modelo', 'marca.descricao as descricao_marca', 'tipo.descricao as descricao_tipo', 'veiculo.ano_fabricacao', 'cor.descricao as descricao_cor', ); return $veiculos; } private static function validate() { return request()->validate( [ 'jornadas.*.veiculo_id' => ['required',], 'jornadas.*.data_inicial' => ['required',], 'jornadas.*.data_final' => ['required',], 'jornadas.*.geral_dia_semana_id' => ['required',], ] ); } }