diff --git a/app/Http/Controllers/AvaliadorTaskTimeController.php b/app/Http/Controllers/AvaliadorTaskTimeController.php new file mode 100644 index 0000000000000000000000000000000000000000..ecce6c9019de5ae2720432fc553289c9d13b85fd --- /dev/null +++ b/app/Http/Controllers/AvaliadorTaskTimeController.php @@ -0,0 +1,22 @@ +id) + // ->join('pad', 'avaliador_pad.pad_id', '=', 'pad.id') + // ->get(); + + return view('avaliador-task-time.index', ['index_menu' => $menu]); + } +} diff --git a/app/Http/Controllers/TaskController.php b/app/Http/Controllers/TaskController.php index 145bb02e0f3669737d3c8634d4a60fdf5f538d6f..1a3663d550e5e7f963f1eca0ebb11704cd3f13b2 100644 --- a/app/Http/Controllers/TaskController.php +++ b/app/Http/Controllers/TaskController.php @@ -316,4 +316,9 @@ class TaskController extends Controller return Response::json($results); } + + public function searchById(Request $request) { + + dd($request->all()); + } } diff --git a/app/Http/Controllers/TaskTimeController.php b/app/Http/Controllers/TaskTimeController.php index 5f59d1b36f3c30db4b858ffce709592ff324d0ec..b01dea12654f333caa3564ce3d46f2aae9a7fcf7 100644 --- a/app/Http/Controllers/TaskTimeController.php +++ b/app/Http/Controllers/TaskTimeController.php @@ -5,6 +5,8 @@ namespace App\Http\Controllers; use App\Models\TaskTime; use App\Models\Util\Menu; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Response; +use Illuminate\Support\Facades\Validator; class TaskTimeController extends Controller { @@ -12,8 +14,6 @@ class TaskTimeController extends Controller { $menu = Menu::PADS; - $taskTimes = TaskTime::whereUserPadId($user_pad_id)->get(); - return view('task-time.index', [ 'menu' => $menu, 'user_pad_id' => $user_pad_id @@ -28,20 +28,92 @@ class TaskTimeController extends Controller public function save(Request $request) { - $array = TaskTime::splitTarefaAndType($request->get('tarefa_id')); + $model = new TaskTime($request->all()); - dd($request->get('tarefa_id'), $array); + if($model->save()) { + return redirect() + ->route('TaskTimeIndex', ['user_pad_id' => $model->user_pad_id]) + ->with('success', 'Cadastro realizado com sucesso!'); + } } - public function updateView() { - + public function edit($id) { + $model = TaskTime::find($id); + return view('task-time.update', [ + 'model' => $model + ]); } - public function update() { + public function update($id, Request $request) { + + $request->merge(['start_time' => TaskTime::traitHour($request->get('start_time'))]); + $request->merge(['end_time' => TaskTime::traitHour($request->get('end_time'))]); + + $model = TaskTime::find($id); + $model->fill($request->all()); + + if($model->save()) { + return redirect() + ->route('TaskTimeIndex', ['user_pad_id' => $model->user_pad_id]) + ->with('success', 'Atualizado com sucesso!'); + } + return redirect() + ->route('TaskTimeIndex', ['user_pad_id' => $model->user_pad_id]) + ->with('fail', 'Erro ao Atualizar!'); + } - public function delete() { + public function delete($id) { + $model = TaskTime::find($id); + + if($model->delete()) { + return redirect() + ->route('TaskTimeIndex', ['user_pad_id' => $model->user_pad_id]) + ->with('success', 'Deletado com sucesso!'); + } + + return redirect() + ->route('TaskTimeIndex', ['user_pad_id' => $model->user_pad_id]) + ->with('fail', 'Erro ao Deletar!'); + + } + + public function searchTask(Request $request) { + + $type = $request->get('type'); + $tarefa_id = $request->get('tarefa_id'); + + $model = new TaskTime(); + $model->tarefa_id = $tarefa_id; + $model->type = $type; + + $attributes = $model->tarefa->getAttributes(); + + return Response::json(['task' => $attributes]); + } + + public function ajaxValidation(Request $request) + { + $request->merge(['start_time' => TaskTime::traitHour($request->get('start_time'))]); + $request->merge(['end_time' => TaskTime::traitHour($request->get('end_time'))]); + + $attributes = [ + 'id' => $request->get('id'), + 'user_pad_id' => $request->get('user_pad_id'), + 'tarefa_id' => $request->get('tarefa_id'), + 'type' => $request->get('type'), + 'start_time' => $request->get('start_time'), + 'end_time' => $request->get('end_time'), + ]; + + $validator = Validator::make($request->all(), TaskTime::rules($attributes), TaskTime::messages()); + + if($validator->passes()) { + return Response::json(['message' => true, 'status' => 200]); + } + + return Response::json(['errors' => $validator->errors(), 'status' => 400]); } } diff --git a/app/Models/TaskTime.php b/app/Models/TaskTime.php index ef8555cee8ed1f5bde87cbe0daf35c6c1ebe8cef..9ccbe6ce97aeaea586bcaa66134e9c2421888bf4 100644 --- a/app/Models/TaskTime.php +++ b/app/Models/TaskTime.php @@ -2,7 +2,37 @@ namespace App\Models; +use Illuminate\Validation\Rule; + +use App\Models\Tabelas\Ensino\EnsinoAtendimentoDiscente; +use App\Models\Tabelas\Ensino\EnsinoAula; +use App\Models\Tabelas\Ensino\EnsinoCoordenacaoRegencia; +use App\Models\Tabelas\Ensino\EnsinoMembroDocente; +use App\Models\Tabelas\Ensino\EnsinoOrientacao; +use App\Models\Tabelas\Ensino\EnsinoOutros; +use App\Models\Tabelas\Ensino\EnsinoParticipacao; +use App\Models\Tabelas\Ensino\EnsinoProjeto; +use App\Models\Tabelas\Ensino\EnsinoSupervisao; +use App\Models\Tabelas\Extensao\ExtensaoCoordenacao; +use App\Models\Tabelas\Extensao\ExtensaoOrientacao; +use App\Models\Tabelas\Extensao\ExtensaoOutros; +use App\Models\Tabelas\Gestao\GestaoCoordenacaoLaboratoriosDidaticos; +use App\Models\Tabelas\Gestao\GestaoCoordenacaoProgramaInstitucional; +use App\Models\Tabelas\Gestao\GestaoMembroCamaras; +use App\Models\Tabelas\Gestao\GestaoMembroComissao; +use App\Models\Tabelas\Gestao\GestaoMembroConselho; +use App\Models\Tabelas\Gestao\GestaoMembroTitularConselho; +use App\Models\Tabelas\Gestao\GestaoOutros; +use App\Models\Tabelas\Gestao\GestaoRepresentanteUnidadeEducacao; +use App\Models\Tabelas\Pesquisa\PesquisaCoordenacao; +use App\Models\Tabelas\Pesquisa\PesquisaLideranca; +use App\Models\Tabelas\Pesquisa\PesquisaOrientacao; +use App\Models\Tabelas\Pesquisa\PesquisaOutros; +use App\Rules\ValidationLimitTime; +use DateInterval; +use DateTime; use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\Collection; class TaskTime extends Model { @@ -39,6 +69,7 @@ class TaskTime extends Model CONST TYPE_GESTAO_MEMBRO_COMISSAO = 23; CONST TYPE_GESTAO_OUTROS = 24; + CONST WEEK_HOUR = 0; CONST WEEK_DAY_SUNDAY = 1; CONST WEEK_DAY_MONDAY = 2; CONST WEEK_DAY_TUESDAY = 3; @@ -49,114 +80,158 @@ class TaskTime extends Model protected $table = 'task_time'; - protected $fillable = ['user_pad_upe', 'tarefa_id', 'type', 'weekday', 'start_time', 'end_time']; + protected $fillable = ['user_pad_id', 'tarefa_id', 'type', 'weekday', 'start_time', 'end_time']; + + public static function rules($attributes) + { + return [ + 'cod_atividade' => ['required'], + 'slct_tarefa_id' => ['required'], + 'tarefa_id' => ['required', 'integer'], + 'type' => ['required', 'integer', Rule::in(array_keys(self::listTaskTypes()))], + 'weekday' => ['required', 'integer', Rule::in(array_keys(self::listWeekDays()))], + 'start_time' => ['required', 'date_format:H:i', 'after_or_equal:07:30', 'before_or_equal:21:15'], + // 'end_time' => ['required', 'date_format:H:i', 'after_or_equal:07:30', 'before_or_equal:21:15'], + 'end_time' => ['required', 'date_format:H:i', 'after_or_equal:07:30', 'before_or_equal:21:15', new ValidationLimitTime($attributes)], + ]; + } + + + public static function messages() + { + return [ + //cod_atividade + 'cod_atividade.required' => '', + + //tarefa_id + 'slct_tarefa_id.required' => 'O campo "Atividade" é obrigatório!', + + // //type + // 'type.required' => 'O campo "Atividade" é obrigatório!', + + //weekday + 'weekday.required' => 'O campo "Dia da Semana" é obrigatório!', + 'weekday.in' => 'Selecione uma opção da lista de "Dia da Semana"!', + 'weekday.integer' => 'O campo "Dia da Semana" deve cónter um inteiro!', + + //start_time + 'start_time.required' => 'O campo "Horário Inicial" é obrigatório!', + 'start_time.after_or_equal' => 'O valor minímo do "Horário Inicial" é 07:30!', + 'start_time.before_or_equal' => 'O valor máximo do "Horário Inicial" é 21:15!', + + //end_time + 'end_time.required' => 'O campo "Horário Final" é obrigatório!', + 'end_time.after_or_equal' => 'O valor minímo do "Horário Final" é 07:30!', + 'end_time.before_or_equal' => 'O valor máximo do "Horário Final" é 21:15!' + ]; + } public function tarefa() { // Return Ensino Models // - - - - - - - - - - - if($this->type === self::TYPE_ENSINO_ATENDIMENTO_DISCENTE) { + if($this->type == self::TYPE_ENSINO_ATENDIMENTO_DISCENTE) { return $this->hasOne(EnsinoAtendimentoDiscente::class, 'id', 'tarefa_id'); } - if($this->type === self::TYPE_ENSINO_AULA) { + if($this->type == self::TYPE_ENSINO_AULA) { return $this->hasOne(EnsinoAula::class, 'id', 'tarefa_id'); } - if($this->type === self::TYPE_ENSINO_COORDENACAO_REGENCIA) { + if($this->type == self::TYPE_ENSINO_COORDENACAO_REGENCIA) { return $this->hasOne(EnsinoCoordenacaoRegencia::class, 'id', 'tarefa_id'); } - if($this->type === self::TYPE_ENSINO_MEMBRO_DOCENTE) { + if($this->type == self::TYPE_ENSINO_MEMBRO_DOCENTE) { return $this->hasOne(EnsinoMembroDocente::class, 'id', 'tarefa_id'); } - if($this->type === self::TYPE_ENSINO_ORIENTACAO) { + if($this->type == self::TYPE_ENSINO_ORIENTACAO) { return $this->hasOne(EnsinoOrientacao::class, 'id', 'tarefa_id'); } - if($this->type === self::TYPE_ENSINO_OUTROS) { + if($this->type == self::TYPE_ENSINO_OUTROS) { return $this->hasOne(EnsinoOutros::class, 'id', 'tarefa_id'); } - if($this->type === self::TYPE_ENSINO_PARTICIPACAO) { + if($this->type == self::TYPE_ENSINO_PARTICIPACAO) { return $this->hasOne(EnsinoParticipacao::class, 'id', 'tarefa_id'); } - if($this->type === self::TYPE_ENSINO_PROJETO) { + if($this->type == self::TYPE_ENSINO_PROJETO) { return $this->hasOne(EnsinoProjeto::class, 'id', 'tarefa_id'); } - if($this->type === self::TYPE_ENSINO_SUPERVISAO) { + if($this->type == self::TYPE_ENSINO_SUPERVISAO) { return $this->hasOne(EnsinoSupervisao::class, 'id', 'tarefa_id'); } // - - - - - - - - - - // Return Pesquisa Models // - - - - - - - - - - - if($this->type === self::TYPE_PESQUISA_COORDENACAO) { + if($this->type == self::TYPE_PESQUISA_COORDENACAO) { return $this->hasOne(PesquisaCoordenacao::class, 'id', 'tarefa_id'); } - if($this->type === self::TYPE_PESQUISA_LIDERANCA) { + if($this->type == self::TYPE_PESQUISA_LIDERANCA) { return $this->hasOne(PesquisaLideranca::class, 'id', 'tarefa_id'); } - if($this->type === self::TYPE_PESQUISA_ORIENTACAO) { + if($this->type == self::TYPE_PESQUISA_ORIENTACAO) { return $this->hasOne(PesquisaOrientacao::class, 'id', 'tarefa_id'); } - if($this->type === self::TYPE_PESQUISA_OUTROS) { + if($this->type == self::TYPE_PESQUISA_OUTROS) { return $this->hasOne(PesquisaOutros::class, 'id', 'tarefa_id'); } // - - - - - - - - - - // Return Extensao Models // - - - - - - - - - - - if($this->type === self::TYPE_EXTENSAO_COORDENACAO) { + if($this->type == self::TYPE_EXTENSAO_COORDENACAO) { return $this->hasOne(ExtensaoCoordenacao::class, 'id', 'tarefa_id'); } - if($this->type === self::TYPE_EXTENSAO_ORIENTACAO) { + if($this->type == self::TYPE_EXTENSAO_ORIENTACAO) { return $this->hasOne(ExtensaoOrientacao::class, 'id', 'tarefa_id'); } - if($this->type === self::TYPE_EXTENSAO_OUTROS) { + if($this->type == self::TYPE_EXTENSAO_OUTROS) { return $this->hasOne(ExtensaoOutros::class, 'id', 'tarefa_id'); } // - - - - - - - - - - // Return Gestao Models // - - - - - - - - - - - if($this->type === self::TYPE_GESTAO_COORDENACAO_LABORATORIOS_DIDATICOS) { + if($this->type == self::TYPE_GESTAO_COORDENACAO_LABORATORIOS_DIDATICOS) { return $this->hasOne(GestaoCoordenacaoLaboratoriosDidaticos::class, 'id', 'tarefa_id'); } - if($this->type === self::TYPE_GESTAO_COORDENACAO_PROGRAMA_INSTITUCIONAL) { + if($this->type == self::TYPE_GESTAO_COORDENACAO_PROGRAMA_INSTITUCIONAL) { return $this->hasOne(GestaoCoordenacaoProgramaInstitucional::class, 'id', 'tarefa_id'); } - if($this->type === self::TYPE_GESTAO_MEMBRO_CAMARAS) { + if($this->type == self::TYPE_GESTAO_MEMBRO_CAMARAS) { return $this->hasOne(GestaoMembroCamaras::class, 'id', 'tarefa_id'); } - if($this->type === self::TYPE_GESTAO_MEMBRO_COMISSAO) { + if($this->type == self::TYPE_GESTAO_MEMBRO_COMISSAO) { return $this->hasOne(GestaoMembroComissao::class, 'id', 'tarefa_id'); } - if($this->type === self::TYPE_GESTAO_MEMBRO_CONSELHO) { + if($this->type == self::TYPE_GESTAO_MEMBRO_CONSELHO) { return $this->hasOne(GestaoMembroConselho::class, 'id', 'tarefa_id'); } - if($this->type === self::TYPE_GESTAO_MEMBRO_TITULAR_CONSELHO) { + if($this->type == self::TYPE_GESTAO_MEMBRO_TITULAR_CONSELHO) { return $this->hasOne(GestaoMembroTitularConselho::class, 'id', 'tarefa_id'); } - if($this->type === self::TYPE_GESTAO_OUTROS) { + if($this->type == self::TYPE_GESTAO_OUTROS) { return $this->hasOne(GestaoOutros::class, 'id', 'tarefa_id'); } - if($this->type === self::TYPE_GESTAO_REPRESENTANTE_UNIDADE_EDUCACAO) { + if($this->type == self::TYPE_GESTAO_REPRESENTANTE_UNIDADE_EDUCACAO) { return $this->hasOne(GestaoRepresentanteUnidadeEducacao::class, 'id', 'tarefa_id'); } // - - - - - - - - - - @@ -166,9 +241,164 @@ class TaskTime extends Model return $this->hasOne(UserPad::class, 'id', 'user_pad_id'); } + /** + * @return string + */ + public function getCode() { + return $this->tarefa->cod_atividade; + } + + /** + * @return string + */ + public function getName() { + // Return Ensino Models + // - - - - - - - - - - + if($this->type == self::TYPE_ENSINO_ATENDIMENTO_DISCENTE) { + return $this->tarefa->componente_curricular; + } + + if($this->type == self::TYPE_ENSINO_AULA) { + return $this->tarefa->componente_curricular; + } + + if($this->type == self::TYPE_ENSINO_COORDENACAO_REGENCIA) { + return $this->tarefa->componente_curricular; + } + + if($this->type == self::TYPE_ENSINO_MEMBRO_DOCENTE) { + return $this->tarefa->nucleo; + } + + if($this->type == self::TYPE_ENSINO_ORIENTACAO) { + return $this->tarefa->atividade; + } + + if($this->type == self::TYPE_ENSINO_OUTROS) { + return $this->tarefa->atividade; + } + + if($this->type == self::TYPE_ENSINO_PARTICIPACAO) { + return $this->tarefa->curso; + } + + if($this->type == self::TYPE_ENSINO_PROJETO) { + return $this->tarefa->componente_curricular; + } + + if($this->type == self::TYPE_ENSINO_SUPERVISAO) { + return $this->tarefa->atividade; + } + // - - - - - - - - - - + + // Return Pesquisa Models + // - - - - - - - - - - + if($this->type == self::TYPE_PESQUISA_COORDENACAO) { + return $this->tarefa->titulo_projeto; + } + + if($this->type == self::TYPE_PESQUISA_LIDERANCA) { + return $this->tarefa->grupo_pesquisa; + } + + if($this->type == self::TYPE_PESQUISA_ORIENTACAO) { + return $this->tarefa->titulo_projeto; + } + + if($this->type == self::TYPE_PESQUISA_OUTROS) { + return $this->tarefa->atividade; + } + // - - - - - - - - - - + + // Return Extensao Models + // - - - - - - - - - - + if($this->type == self::TYPE_EXTENSAO_COORDENACAO) { + return $this->tarefa->titulo_projeto; + } + + if($this->type == self::TYPE_EXTENSAO_ORIENTACAO) { + return $this->tarefa->titulo_projeto; + } + + if($this->type == self::TYPE_EXTENSAO_OUTROS) { + return $this->tarefa->atividade; + } + // - - - - - - - - - - + + // Return Gestao Models + // - - - - - - - - - - + if($this->type == self::TYPE_GESTAO_COORDENACAO_LABORATORIOS_DIDATICOS) { + return $this->tarefa->nome; + } + + if($this->type == self::TYPE_GESTAO_COORDENACAO_PROGRAMA_INSTITUCIONAL) { + return $this->tarefa->nome; + } + + if($this->type == self::TYPE_GESTAO_MEMBRO_CAMARAS) { + return $this->tarefa->nome; + } + + if($this->type == self::TYPE_GESTAO_MEMBRO_COMISSAO) { + return $this->tarefa->nome; + } + + if($this->type == self::TYPE_GESTAO_MEMBRO_CONSELHO) { + return $this->tarefa->nome; + } + + if($this->type == self::TYPE_GESTAO_MEMBRO_TITULAR_CONSELHO) { + return $this->tarefa->nome; + } + + if($this->type == self::TYPE_GESTAO_OUTROS) { + return $this->tarefa->atividade; + } + + if($this->type == self::TYPE_GESTAO_REPRESENTANTE_UNIDADE_EDUCACAO) { + return $this->tarefa->nome; + } + // - - - - - - - - - - + } + + /** + * @return string + */ + public function intervalTime($format = 'H:i:s') { + + $startTime = DateTime::createFromFormat('H:i:s', $this->start_time); + + $endTime = DateTime::createFromFormat('H:i:s', $this->end_time); + + $interval = $startTime->diff($endTime); + + $dateTime = new DateTime('00:00'); + $dateTime->add($interval); // Popular com Interval + + return $dateTime->format($format); + } + + /** + * STATIC METHODS + */ + + public static function listWeekDaysTable($value = null) { + $values = [ + self::WEEK_HOUR => "HORÁRIO", + self::WEEK_DAY_MONDAY => "SEGUNDA-FEIRA", + self::WEEK_DAY_TUESDAY => "TERÇA-FEIRA", + self::WEEK_DAY_WEDNESDAY => "QUARTA-FEIRA", + self::WEEK_DAY_THURSDAY => "QUINTA-FEIRA", + self::WEEK_DAY_FRIDAY => "SEXTA-FEIRA", + self::WEEK_DAY_SATURDAY => "SÁBADO", + ]; + + return $value != null ? $values[$value] : $values; + } + public static function listWeekDays($value = null) { $values = [ - self::WEEK_DAY_SUNDAY => "DOMINGO", + // self::WEEK_DAY_SUNDAY => "DOMINGO", self::WEEK_DAY_MONDAY => "SEGUNDA-FEIRA", self::WEEK_DAY_TUESDAY => "TERÇA-FEIRA", self::WEEK_DAY_WEDNESDAY => "QUARTA-FEIRA", @@ -180,25 +410,234 @@ class TaskTime extends Model return $value != null ? $values[$value] : $values; } + public static function listTaskTypes($value = null) { + $values = [ + + self::TYPE_ENSINO_AULA => '', + self::TYPE_ENSINO_COORDENACAO_REGENCIA => '', + self::TYPE_ENSINO_ORIENTACAO => '', + self::TYPE_ENSINO_SUPERVISAO => '', + self::TYPE_ENSINO_ATENDIMENTO_DISCENTE => '', + self::TYPE_ENSINO_PROJETO => '', + self::TYPE_ENSINO_PARTICIPACAO => '', + self::TYPE_ENSINO_MEMBRO_DOCENTE => '', + self::TYPE_ENSINO_OUTROS => '', + + self::TYPE_PESQUISA_COORDENACAO => '', + self::TYPE_PESQUISA_ORIENTACAO => '', + self::TYPE_PESQUISA_LIDERANCA => '', + self::TYPE_PESQUISA_OUTROS => '', + + self::TYPE_EXTENSAO_COORDENACAO => '', + self::TYPE_EXTENSAO_ORIENTACAO => '', + self::TYPE_EXTENSAO_OUTROS => '', + + self::TYPE_GESTAO_COORDENACAO_LABORATORIOS_DIDATICOS => '', + self::TYPE_GESTAO_MEMBRO_CONSELHO => '', + self::TYPE_GESTAO_COORDENACAO_PROGRAMA_INSTITUCIONAL => '', + self::TYPE_GESTAO_MEMBRO_TITULAR_CONSELHO => '', + self::TYPE_GESTAO_MEMBRO_CAMARAS => '', + self::TYPE_GESTAO_REPRESENTANTE_UNIDADE_EDUCACAO => '', + self::TYPE_GESTAO_MEMBRO_COMISSAO => '', + self::TYPE_GESTAO_OUTROS => '', + ]; + + return $value != null ? $values[$value] : $values; + } + + /** + * @param $floatValue + * @return string|time + */ + public static function convertFloatToHour($floatValue) { + + $percent = $floatValue * 100.0; // float to percent + $one_percent_from_hour = 0.6; // 0.6 min + + $minutes = $one_percent_from_hour * $percent; // minutes + + // Criar um objeto DateTime com um intervalo de minutos + $interval = new DateInterval('PT' . $minutes . 'M'); + + // Criar um objeto DateTime base com 0 horas e 0 minutos + $dateTime = new DateTime('00:00'); + $dateTime->add($interval); // Popular com Interval + + return $dateTime->format('H:i:s'); + } + /** - * Explode string with format "id_{id}|type_{type}" to array ['tarefa_id' => 'integer', 'type' => 'integer'] - * @return array + * Recebe e formata uma string para formato H:i + * Pode ser recebido uma hora completa H:i:s ou uma hora padrão H:i + * @return string|date + */ + public static function traitHour(string|null $hour = "") + { + if(!empty($hour)) { + $hour_splited = explode(':', $hour ); + + $hour_h_i = "{$hour_splited[0]}:$hour_splited[1]"; + + return $hour_h_i; + } + + return $hour; + } + + /** + * @param $taskTimes + * @return DateTime + */ + public static function sumIntervalTimes(Collection $taskTimes) { + + $sumDateTime = new DateTime("00:00:00"); + + foreach($taskTimes as $taskTime) { + + $split_time = explode(":", $taskTime->intervalTime()); + + $hours = $split_time[0]; + $minutes = $split_time[1]; + $seconds = $split_time[2]; + + $sumDateTime->modify("+{$hours} hours +{$minutes} minutes +{$seconds} seconds"); + } + + return $sumDateTime; + } + + /** + * @param DateTime $dateTimeX + * @param DateTime $dateTimeY + * @return DateTime */ - public static function splitTarefaAndType(string $task_type) { + public static function sumDateTimes(DateTime $dateTimeX, DateTime $dateTimeY) + { + $time_x = $dateTimeX->format("H:i:s"); + $time_y = $dateTimeY->format("H:i:s"); + + $newDateTime = new DateTime($time_x); + + $split_time = explode(":", $time_y); - $split_task_type = explode("|", $task_type); + $hours = $split_time[0]; + $minutes = $split_time[1]; + $seconds = $split_time[2]; + + $newDateTime->modify("+{$hours} hours +{$minutes} minutes +{$seconds} seconds"); - $task_data = $split_task_type[0]; - $split_task = explode("_", $task_data); - $task_id = $split_task[1]; + return $newDateTime; + } + + /** @return mixed */ + public static function tarefaByStatic($type, $tarefa_id) + { + // Return Ensino Models + // - - - - - - - - - - + if($type == self::TYPE_ENSINO_ATENDIMENTO_DISCENTE) { + return EnsinoAtendimentoDiscente::find($tarefa_id); + } + + if($type == self::TYPE_ENSINO_AULA) { + return EnsinoAula::find($tarefa_id); + } + + if($type == self::TYPE_ENSINO_COORDENACAO_REGENCIA) { + return EnsinoCoordenacaoRegencia::find($tarefa_id); + } - $type_data = $split_task_type[1]; - $split_type = explode("_", $type_data); - $type = $split_type[1]; + if($type == self::TYPE_ENSINO_MEMBRO_DOCENTE) { + return EnsinoMembroDocente::find($tarefa_id); + } + + if($type == self::TYPE_ENSINO_ORIENTACAO) { + return EnsinoOrientacao::find($tarefa_id); + } + + if($type == self::TYPE_ENSINO_OUTROS) { + return EnsinoOutros::find($tarefa_id); + } + + if($type == self::TYPE_ENSINO_PARTICIPACAO) { + return EnsinoParticipacao::find($tarefa_id); + } + + if($type == self::TYPE_ENSINO_PROJETO) { + return EnsinoProjeto::find($tarefa_id); + } + + if($type == self::TYPE_ENSINO_SUPERVISAO) { + return EnsinoSupervisao::find($tarefa_id); + } + // - - - - - - - - - - + + // Return Pesquisa Models + // - - - - - - - - - - + if($type == self::TYPE_PESQUISA_COORDENACAO) { + return PesquisaCoordenacao::find($tarefa_id); + } + + if($type == self::TYPE_PESQUISA_LIDERANCA) { + return PesquisaLideranca::find($tarefa_id); + } + + if($type == self::TYPE_PESQUISA_ORIENTACAO) { + return PesquisaOrientacao::find($tarefa_id); + } + + if($type == self::TYPE_PESQUISA_OUTROS) { + return PesquisaOutros::find($tarefa_id); + } + // - - - - - - - - - - + + // Return Extensao Models + // - - - - - - - - - - + if($type == self::TYPE_EXTENSAO_COORDENACAO) { + return ExtensaoCoordenacao::find($tarefa_id); + } + + if($type == self::TYPE_EXTENSAO_ORIENTACAO) { + return ExtensaoOrientacao::find($tarefa_id); + } + + if($type == self::TYPE_EXTENSAO_OUTROS) { + return ExtensaoOutros::find($tarefa_id); + } + // - - - - - - - - - - + + // Return Gestao Models + // - - - - - - - - - - + if($type == self::TYPE_GESTAO_COORDENACAO_LABORATORIOS_DIDATICOS) { + return GestaoCoordenacaoLaboratoriosDidaticos::find($tarefa_id); + } + if($type == self::TYPE_GESTAO_COORDENACAO_PROGRAMA_INSTITUCIONAL) { + return GestaoCoordenacaoProgramaInstitucional::find($tarefa_id); + } + + if($type == self::TYPE_GESTAO_MEMBRO_CAMARAS) { + return GestaoMembroCamaras::find($tarefa_id); + } + + if($type == self::TYPE_GESTAO_MEMBRO_COMISSAO) { + return GestaoMembroComissao::find($tarefa_id); + } + + if($type == self::TYPE_GESTAO_MEMBRO_CONSELHO) { + return GestaoMembroConselho::find($tarefa_id); + } + + if($type == self::TYPE_GESTAO_MEMBRO_TITULAR_CONSELHO) { + return GestaoMembroTitularConselho::find($tarefa_id); + } - $data = ['tarefa_id' => $task_id, 'type' => $type]; + if($type == self::TYPE_GESTAO_OUTROS) { + return GestaoOutros::find($tarefa_id); + } - return $data; + if($type == self::TYPE_GESTAO_REPRESENTANTE_UNIDADE_EDUCACAO) { + return GestaoRepresentanteUnidadeEducacao::find($tarefa_id); + } + // - - - - - - - - - - } } diff --git a/app/Models/Util/MenuItemsAvaliador.php b/app/Models/Util/MenuItemsAvaliador.php index 8d443c019113b10523240b1a77205151de90d568..6f8a1d1227a022b792615a40ed73f3e0d97e429c 100644 --- a/app/Models/Util/MenuItemsAvaliador.php +++ b/app/Models/Util/MenuItemsAvaliador.php @@ -8,4 +8,5 @@ class MenuItemsAvaliador const HOME = 0; const PADs = 1; const REPORT = 2; + const TASK_TIME = 3; } diff --git a/app/Rules/ValidationLimitTime.php b/app/Rules/ValidationLimitTime.php new file mode 100644 index 0000000000000000000000000000000000000000..efa151b4fcf1874deb9ae43b021cc509a75d9dc6 --- /dev/null +++ b/app/Rules/ValidationLimitTime.php @@ -0,0 +1,162 @@ + $user_pad_id, 'tarefa_id' => $tarefa_id, 'type' => $type, 'start_time' => $start_time, 'end_time' => $end_time] + */ + public function __construct($attributes = []) + { + $this->id = $attributes['id']; + $this->user_pad_id = $attributes['user_pad_id']; + $this->tarefa_id = $attributes['tarefa_id']; + $this->type = $attributes['type']; + $this->start_time = $attributes['start_time']; + $this->end_time = $attributes['end_time']; + + $this->task = TaskTime::tarefaByStatic($this->type, $this->tarefa_id); + + $this->limit_hours = TaskTime::convertFloatToHour($this->task->ch_semanal); + + $this->taskTimes = $this->getTaskTimes(); + + $this->taskTime = $this->createTaskTime(); + } + + /** + * Determine if the validation rule passes. + * + * @param string $attribute + * @param mixed $value + * @return bool + */ + public function passes($attribute, $value) + { + $limitDateTime = new DateTime($this->limit_hours); + $sumDateTime = TaskTime::sumIntervalTimes($this->taskTimes); + + $newDateTime = new DateTime($this->taskTime->intervalTime()); + + $totalDateTime = TaskTime::sumDateTimes($sumDateTime, $newDateTime); + + $this->outLineTime = $totalDateTime->diff($limitDateTime); + + // dd([ + // 'limite' => $limitDateTime, + // 'total' => $totalDateTime, + // 'interval' => $this->outLineTime + // ]); + + return $limitDateTime >= $totalDateTime; + } + + /** + * Get the validation error message. + * + * @return string + */ + public function message() + { + $limitDateTime = new DateTime($this->limit_hours); + + $sumDateTime = TaskTime::sumIntervalTimes($this->taskTimes); + + $diffInterval = $sumDateTime->diff($limitDateTime); + + $dateTime = new DateTime('00:00:00'); + + $dateTime->add($diffInterval); + + $diff_time = $dateTime->format('H:i'); + + $taskTime = $this->createTaskTime(); + $interval_time = $taskTime->intervalTime('H:i'); + + $msgError = "Carga horária disponível restante: {$diff_time} hora(s)!"; + $msgError .= $diff_time == "00:00"? " Atividade Indisponível!" : " Intervalo entre inicio e fim : {$interval_time} hora(s)!"; + + return $msgError; + } + + /** + * @return App\Models\TaskTime[] + */ + public function getTaskTimes() + { + $id = $this->id; + + return ( + TaskTime::where('user_pad_id', '=', $this->user_pad_id) + ->where('tarefa_id', '=', $this->tarefa_id) + ->where('type', '=', $this->type) + ->get() + ->reject(function(TaskTime $model, int $key) use ($id) { + return $model->id == $id; + }) + ); + } + + /** + * @return App\Models\TaskTime + */ + public function createTaskTime() + { + $model = new TaskTime(); + $model->user_pad_id = $this->user_pad_id; + $model->tarefa_id = $this->tarefa_id; + $model->type = $this->type; + $model->start_time = $this->start_time; + $model->end_time = $this->end_time; + + $model->start_time = "{$model->start_time}:00"; + $model->end_time = "{$model->end_time}:00"; + + return $model; + } +} diff --git a/resources/views/avaliador-task-time/card_horario.blade.php b/resources/views/avaliador-task-time/card_horario.blade.php new file mode 100644 index 0000000000000000000000000000000000000000..020965cc3c0bbdbad3e6983e35653fa8fec32cb5 --- /dev/null +++ b/resources/views/avaliador-task-time/card_horario.blade.php @@ -0,0 +1,8 @@ +
+
+

+
PAD: {{ $userPad->pad->nome }}
+
Status: {{ $userPad->pad->statusAsString() }}
+ +
+
diff --git a/resources/views/avaliador-task-time/index.blade.php b/resources/views/avaliador-task-time/index.blade.php new file mode 100644 index 0000000000000000000000000000000000000000..084e021cf2b693e7fa306d34fece8b1cce445595 --- /dev/null +++ b/resources/views/avaliador-task-time/index.blade.php @@ -0,0 +1,34 @@ +@extends('layouts.main') + +@section('header') + @include('layouts.header', [ + 'user' => Auth::user(), + ]) +@endsection + +@section('nav') + @include('layouts.navigation', ['menu' => $index_menu]) +@endsection +@section('title', 'Horários') +@section('body') +
+ +
+
+

Horários

+
+
+

Horários Disponíveis

+
+
+ {{-- @foreach($userPads as $userPad) + @include('avaliador-task-time.card_horario', ['userPad' => $userPad]) + @endforeach --}} +
+
+ + +
+ + +@endsection \ No newline at end of file diff --git a/resources/views/components/buttons/btn-delete-by-alert.blade.php b/resources/views/components/buttons/btn-delete-by-alert.blade.php new file mode 100644 index 0000000000000000000000000000000000000000..5fe980ea70d4919e787254afb9fe80f4a84cd15c --- /dev/null +++ b/resources/views/components/buttons/btn-delete-by-alert.blade.php @@ -0,0 +1,24 @@ +{{-- + @include('components.buttons.btn-delete-by-alert', [ + '_id' => '', + '_class' => '', + '_route' => route('') + ]) +--}} + + + + + \ No newline at end of file diff --git a/resources/views/components/cards/relatorio_pad.blade.php b/resources/views/components/cards/relatorio_pad.blade.php index c90beef9dd2275f4ccb78ced892534967a366446..141580685d4dc93e201b38a21567cba4f624a325 100644 --- a/resources/views/components/cards/relatorio_pad.blade.php +++ b/resources/views/components/cards/relatorio_pad.blade.php @@ -1,6 +1,6 @@
-

+

PAD: {{ $userPad->pad->nome }}
Status: {{ $userPad->pad->statusAsString() }}
diff --git a/resources/views/layouts/user-navigation/navigation_avaliador.blade.php b/resources/views/layouts/user-navigation/navigation_avaliador.blade.php index fac25d3199e111e80b80abf7ceb01c0fda2bfc36..831fd56be05600664db990c9694415e01f8a48ab 100644 --- a/resources/views/layouts/user-navigation/navigation_avaliador.blade.php +++ b/resources/views/layouts/user-navigation/navigation_avaliador.blade.php @@ -7,6 +7,7 @@ $home_active = $index_menu === MenuItemsAvaliador::HOME ? 'active' : ''; $report_active = $index_menu === MenuItemsAvaliador::REPORT ? 'active' : ''; + $task_time_active = $index_menu === MenuItemsAvaliador::TASK_TIME ? 'active' : ''; @endphp @@ -19,10 +20,12 @@ + {{-- --}} \ No newline at end of file diff --git a/resources/views/task-time/_form.blade.php b/resources/views/task-time/_form.blade.php deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/resources/views/task-time/create.blade.php b/resources/views/task-time/create.blade.php index a0dcd567b399f2dda4cde1dbba1bafcf84d543e3..2a7d96e914f964f24d2e09793aa82d0a8018f6e9 100644 --- a/resources/views/task-time/create.blade.php +++ b/resources/views/task-time/create.blade.php @@ -2,30 +2,80 @@ use App\Models\TaskTime; @endphp -
+ @csrf @method('POST') -
-
- - +
+ + + + + + + + + +
+
+ + +
+ + @include('components.divs.errors', [ + 'field' => 'cod_atividade_create' + ]) +
+ +
+
+ + + + @include('components.divs.errors', [ + 'field' => 'weekday_create' + ]) +
+
+ +
+
+ + +
+ + @include('components.divs.errors', [ + 'field' => 'slct_tarefa_id_create' + ])
-
-
-
- - +
+
+ + + + @include('components.divs.errors', [ + 'field' => 'start_time_create', + ]) +
+ +
+
+ + + + @include('components.divs.errors', [ + 'field' => 'end_time_create', + ]) +
+
+
@@ -41,6 +91,13 @@ +@include('pad.components.scripts.ajaxValidation', [ + 'btn_submit_id' => 'btn_submit', + 'form_id' => 'task-time-form', + 'route' => route('TaskTimeValidation'), + 'form_type' => 'create', +]) + \ No newline at end of file + $('#slct_tarefa_id').on('change', function(e) + { + const type = $('#type') + const tarefa_id = $('#tarefa_id') + + $('#cod_atividade').val('') + + if($(this).val()) { + const value = $(this).val() + const split_data = value.split('|') + + const split_tarefa_id = split_data[0].split('_') + const split_type = split_data[1].split('_') + + const _tarefa_id = split_tarefa_id[1] + const _type = split_type[1] + + type.val(_type) + tarefa_id.val(_tarefa_id) + + $.ajax({ + url: '{{ route("TaskTimeSearchTask") }}', + type: 'GET', + data: { + tarefa_id: _tarefa_id, + type: _type + }, + dataType: 'json', + success: (response) => { + const cod_atividade = response.task.cod_atividade + $('#cod_atividade').val(cod_atividade) + }, + error: (xhr, status, error) => { + console.error('Erro na requisição!'); + } + }); + } + }) + + diff --git a/resources/views/task-time/index.blade.php b/resources/views/task-time/index.blade.php index 3d4b8813977eb958db2a75ca209a1196dc56b4af..08de9e3fa6ef012f727b0a46d677196053bea9aa 100644 --- a/resources/views/task-time/index.blade.php +++ b/resources/views/task-time/index.blade.php @@ -19,12 +19,96 @@ @include('components.alerts') @include('components.buttons.btn-show-modal', [ - // '_id' => 'btn-task-time-create', '_class' => 'btn-success', '_content' => 'Cadastrar', '_target_class' => 'task-time-create', ]) + @php + use App\Models\TaskTime; + + // $hours = ['07:30', '08:20', '09:10', '10:00', '10:50', '11:40', '12:30', '13:30', '14:30', '15:30', '16:30', '17:30', '19:00', '19:45', '20:30', '21:15']; + + $rangeHours = [ + ['07:30', '08:20'], + ['08:20', '09:10'], + ['09:10', '10:00'], + ['10:00', '10:50'], + ['10:50', '11:40'], + ['11:40', '12:30'], + ['12:30', '13:30'], + ['13:30', '14:30'], + ['14:30', '15:30'], + ['15:30', '16:30'], + ['16:30', '17:30'], + ['17:30', '19:00'], + ['19:00', '19:45'], + ['19:45', '20:30'], + ['20:30', '21:15'], + ['21:15', '21:15'], + ]; + + $calendar = []; + + $row = []; + + foreach ($rangeHours as $rangeHour) + { + $start_time = $rangeHour[0]; + $end_time = $rangeHour[1]; + + $row[0] = $start_time; + + foreach (array_keys(TaskTime::listWeekDays()) as $weekday) + { + $row[$weekday] = + TaskTime::where('user_pad_id', '=', $user_pad_id) + ->where('weekday', '=', $weekday) + ->where(function($query) use ($rangeHour) { + $query->orWhereBetween('start_time', $rangeHour)->orWhereBetween('end_time', $rangeHour); + })->first(); + + $row[$weekday] = $row[$weekday] ? $row[$weekday] : ''; + } + + $calendar[] = $row; + } + @endphp + +
+ + + + + @foreach(TaskTime::listWeekDaysTable() as $key => $weekday) + + @endforeach + + + + @foreach($calendar as $rowHour) + + @foreach ($rowHour as $model) + + @if(gettype($model) == 'string') + + @endif + + @if(gettype($model) == 'object') + + @endif + + @endforeach + + @endforeach + +
{{$weekday}}
{{ $model }} + + {{ "{$model->getCode()} : {$model->getName()}" }} + +
+
+ @include('components.modal', ['size' => 'modal-lg', 'header' => ''])
@@ -39,4 +123,35 @@ 'btn_class' => 'task-time-create', ]) -@endsection \ No newline at end of file + @include('pad.components.scripts.dimensao.ensino.show_modal', [ + 'modal_id' => 'modal', + 'route' => route('TaskTimeEdit'), + 'btn_class' => 'btn-edit_task', + ]) + +@endsection + +{{-- @include('components.buttons.btn-edit', [ + 'route' => route('TaskTimeEdit', ['id' => $model->id]) +]) + +@include('components.buttons.btn-delete', [ + 'id' => $model->id, + 'route' => route('TaskTimeDelete', ['id' => $model->id]) +]) --}} + +{{-- @foreach($listTaskTime as $key => $taskTimes) + + @foreach($taskTimes as $model) + + @if(gettype($model) == 'string') + {{ $model }} + @endif + + @if(gettype($model) == 'object') + + @endif + + @endforeach + +@endforeach --}} \ No newline at end of file diff --git a/resources/views/task-time/update.blade.php b/resources/views/task-time/update.blade.php new file mode 100644 index 0000000000000000000000000000000000000000..f1c19f60956650b2b525d825f6cfe35ba1746a47 --- /dev/null +++ b/resources/views/task-time/update.blade.php @@ -0,0 +1,192 @@ +@php + use App\Models\TaskTime; + + /** + * @var App\Models\TaskTime $model + */ +@endphp + +
+ @method('DELETE') + @csrf +
+ +
+ @csrf + @method('POST') + +
+ + + + + + ´ + + + +
+
+ + +
+ + @include('components.divs.errors', [ + 'field' => 'cod_atividade_update' + ]) +
+ +
+
+ + + + @include('components.divs.errors', [ + 'field' => 'weekday_update' + ]) +
+
+ +
+
+ + +
+ + @include('components.divs.errors', [ + 'field' => 'slct_tarefa_id' + ]) +
+ +
+
+ + + + @include('components.divs.errors', [ + 'field' => 'start_time_update', + ]) +
+
+ +
+
+ + + + @include('components.divs.errors', [ + 'field' => 'end_time_update', + ]) +
+
+
+ +
+ +
+ +
+ +@include('pad.components.scripts.ajaxValidation', [ + 'btn_submit_id' => 'btn_submit', + 'form_id' => 'task-time-update-form', + 'route' => route('TaskTimeValidation'), + 'form_type' => 'update', +]) + + diff --git a/routes/Task.php b/routes/Task.php index dc4e16cbe5f5675d259f0a798d0cb1c779403bd2..dd14d7065f87c3257b5c7d3bceec967af8eda8c6 100644 --- a/routes/Task.php +++ b/routes/Task.php @@ -5,4 +5,5 @@ use Illuminate\Support\Facades\Route; Route::prefix('/tarefa/geral')->group(function () { Route::get('/search', [TaskController::class, 'search'])->name('TaskSearch'); + Route::get('/search-by-id', [TaskController::class, 'searchById'])->name('TaskSearchById'); }); \ No newline at end of file diff --git a/routes/TaskTime.php b/routes/TaskTime.php index 6566e5727a129869979aca99b9c6e89a7b20c19c..eb560106530cf44b9c0895abb043c152c7e7cb27 100644 --- a/routes/TaskTime.php +++ b/routes/TaskTime.php @@ -7,9 +7,9 @@ Route::prefix('/tarefa/horario')->group(function () { Route::get('/index/{user_pad_id}', [TaskTimeController::class, 'index'])->name('TaskTimeIndex'); Route::get('/create/{user_pad_id}', [TaskTimeController::class, 'create'])->name('TaskTimeCreate'); Route::post('/save', [TaskTimeController::class, 'save'])->name('TaskTimeSave'); - //edit - //update - //delete - //move - -}); \ No newline at end of file + Route::get('/edit/{id?}', [TaskTimeController::class, 'edit'])->name('TaskTimeEdit'); + Route::post('/update/{id}', [TaskTimeController::class, 'update'])->name('TaskTimeUpdate'); + Route::delete('/delete/{id}', [TaskTimeController::class, 'delete'])->name('TaskTimeDelete'); + Route::get('/search-task', [TaskTimeController::class, 'searchTask'])->name('TaskTimeSearchTask'); + Route::post('/validation', [TaskTimeController::class, 'ajaxValidation'])->name('TaskTimeValidation'); +}); diff --git a/routes/avaliador.php b/routes/avaliador.php new file mode 100644 index 0000000000000000000000000000000000000000..4edaa30d11771fc937c4a1997a6e6e5a530afcbf --- /dev/null +++ b/routes/avaliador.php @@ -0,0 +1,21 @@ +group(function () { + Route::get('/index', [AvaliadorController::class, 'index'])->name('avaliador_index'); + Route::put('/avaliar', [AvaliadorController::class, 'avaliar'])->name('avaliador_avaliar'); + Route::get('/create', [AvaliadorController::class, 'create'])->name('avaliador_create'); + Route::post('/store', [AvaliadorController::class, 'store'])->name('avaliador_store'); + Route::get('/edit/{id}', [AvaliadorController::class, 'edit'])->name('avaliador_edit'); + Route::post('/update/{id}', [AvaliadorController::class, 'update'])->name('avaliador_update'); + Route::delete('/delete/{id}', [AvaliadorController::class, 'destroy'])->name('avaliador_delete'); + Route::get('/relatorio', [AvaliadorController::class, 'relatorio'])->name('avaliador_relatorio'); + Route::get('/relatorio/{id}', [PadController::class, 'relatorio'])->name('pad_relatório'); + Route::get('/relatorio/{id}/pdf', [PadController::class, 'generatePDF'])->name('pad_relatório_pdf'); + + Route::get('/horario/index', [AvaliadorTaskTimeController::class, 'index'])->name('avaliador_task_time_index'); +}); diff --git a/routes/web.php b/routes/web.php index 3a5ac77c72f7dfb3d2fec86922c5da37528370de..b8d1fc48588d9ffa31bb02637e31fbc2e53d10e3 100644 --- a/routes/web.php +++ b/routes/web.php @@ -29,7 +29,11 @@ require __DIR__ . '/auth.php'; require __DIR__ . '/profile.php'; require __DIR__ . '/pad.php'; + +require __DIR__ . '/avaliador.php'; + require __DIR__ . '/avaliador_pad.php'; + require __DIR__ . '/professor_pad.php'; require __DIR__ . '/unidade.php'; @@ -97,19 +101,6 @@ Route::prefix('/professor')->group(function () { Route::delete('/delete/{id}', [ProfessorController::class, 'destroy'])->name('professor_delete'); }); -Route::prefix('/avaliador')->group(function () { - Route::get('/index', [AvaliadorController::class, 'index'])->name('avaliador_index'); - Route::put('/avaliar', [AvaliadorController::class, 'avaliar'])->name('avaliador_avaliar'); - Route::get('/create', [AvaliadorController::class, 'create'])->name('avaliador_create'); - Route::post('/store', [AvaliadorController::class, 'store'])->name('avaliador_store'); - Route::get('/edit/{id}', [AvaliadorController::class, 'edit'])->name('avaliador_edit'); - Route::post('/update/{id}', [AvaliadorController::class, 'update'])->name('avaliador_update'); - Route::delete('/delete/{id}', [AvaliadorController::class, 'destroy'])->name('avaliador_delete'); - Route::get('/relatorio', [AvaliadorController::class, 'relatorio'])->name('avaliador_relatorio'); - Route::get('/relatorio/{id}', [PadController::class, 'relatorio'])->name('pad_relatório'); - Route::get('/relatorio/{id}/pdf', [PadController::class, 'generatePDF'])->name('pad_relatório_pdf'); -}); - Route::prefix('/user')->group(function () { Route::get('/edit/perfil/{tab?}', [UserController::class, 'editPerfil'])->name('edit_perfil'); Route::post('/update/perfil', [UserController::class, 'updatePerfil'])->name('update_perfil');