Unverified Commit 27015b69 authored by Laboratório Multidisciplinar de Tecnologias Sociais's avatar Laboratório Multidisciplinar de Tecnologias Sociais Committed by GitHub
Browse files

Merge pull request #188 from jofernando/solicitacao

Solicitacao de certificado
parents c57f3a05 46fcda2f
......@@ -67,26 +67,25 @@ class AdministradorController extends Controller
return view('administrador.projetos')->with(['trabalhos' => $trabalhos, 'evento' => $evento]);
}
public function analisar(Request $request){
$evento = Evento::where('id', $request->evento_id)->first();
$trabalhosSubmetidos = $evento->trabalhos->where('status', 'submetido');
$trabalhosAvaliados = $evento->trabalhos->Where('status', 'avaliado');
$trabalhosAprovados = $evento->trabalhos->Where('status', 'aprovado');
$trabalhosReprovados = $evento->trabalhos->Where('status', 'reprovado');
$trabalhosCorrigidos = $evento->trabalhos->Where('status', 'corrigido');
$trabalhos = $this->paginate($trabalhosSubmetidos);
$trabalhos = $this->paginate($trabalhosSubmetidos
->merge($trabalhosAvaliados)->merge($trabalhosAprovados)
->merge($trabalhosReprovados)->merge($trabalhosCorrigidos)->sortBy('titulo'))
->withPath('/usuarios/analisarProjetos?evento_id='.$evento->id);
$evento = Evento::find($request->evento_id);
$status = ['submetido', 'avaliado', 'aprovado', 'reprovado', 'corrigido'];
$withPath = '/usuarios/analisarProjetos?evento_id='.$evento->id;
if($request->column != null ) {
$status = [$request->column];
$withPath = '/usuarios/analisarProjetos/'.$request->column.'?evento_id='.$evento->id;
}
$trabalhos = Trabalho::where('evento_id', $evento->id)
->whereIn('status', $status)
->orderBy('titulo')
->paginate(5)
->withPath($withPath);
$funcaoParticipantes = FuncaoParticipantes::all();
// $participantes = Participante::where('trabalho_id', $id)->get();
// $participantesUsersIds = Participante::where('trabalho_id', $id)->select('user_id')->get();
// $participantes = User::whereIn('id', $participantesUsersIds)->get();
return view('administrador.analisar')->with(['trabalhos' => $trabalhos, 'evento' => $evento, 'funcaoParticipantes' => $funcaoParticipantes]);
return view('administrador.analisar')->with(['trabalhos' => $trabalhos, 'evento' => $evento, 'funcaoParticipantes' => $funcaoParticipantes, 'column' => $request->column]);
}
// Utilizado para paginação de Collection
......
......@@ -2,6 +2,7 @@
namespace App\Http\Controllers;
use App\Certificado;
use App\Notificacao;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
......@@ -125,6 +126,9 @@ class NotificacaoController extends Controller
} else {
return redirect()->route('avaliador.editais');
}
} elseif ($notificacao->tipo == 6) {
$trabalho = $notificacao->trabalho;
return view('administrador.visualizarSolicitacaoCertificado', compact('notificacao', 'trabalho'));
}
}
......
......@@ -4,6 +4,7 @@ namespace App\Http\Controllers;
use PDF;
use App;
use App\Administrador;
use Auth;
use App\Area;
use App\User;
......@@ -23,6 +24,7 @@ use App\Modalidade;
use App\Proponente;
use App\Participante;
use App\AreaModalidade;
use App\Certificado;
use Illuminate\Http\File;
use App\Mail\EventoCriado;
use Illuminate\Support\Str;
......@@ -41,8 +43,12 @@ use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Validator;
use App\Mail\EmailParaUsuarioNaoCadastrado;
use App\Mail\SolicitacaoSubstituicao;
use App\Notificacao;
use App\Notifications\SolicitacaoCertificadoNotification;
use App\Notifications\SubmissaoNotification;
use App\Notifications\SubmissaoRecebidaNotification;
use App\SolicitacaoCertificado;
use App\SolicitacaoParticipante;
use App\Substituicao;
use Illuminate\Support\Facades\Notification;
......@@ -447,6 +453,42 @@ class TrabalhoController extends Controller
return redirect()->back();
}
public function solicitarCertificado(Trabalho $trabalho, Request $request)
{
$users = User::find($request->users);
$coord = $trabalho->coordenador;
$SolicitacaoCertificado = SolicitacaoCertificado::create();
Notificacao::create([
'remetente_id' => auth()->user()->id,
'destinatario_id' => $coord->user_id,
'solicitacao_certificado_id' => $SolicitacaoCertificado->id,
'trabalho_id' => $trabalho->id,
'lido' => false,
'tipo' => 6
]);
foreach ($users as $user) {
SolicitacaoParticipante::create([
'user_id' => $user->id,
'solicitacao_certificado_id' => $SolicitacaoCertificado->id,
]);
}
$admins = Administrador::all();
foreach ($admins as $admin) {
$userTemp = User::find($admin->user_id);
Notificacao::create([
'remetente_id' => auth()->user()->id,
'destinatario_id' => $admin->user_id,
'solicitacao_certificado_id' => $SolicitacaoCertificado->id,
'trabalho_id' => $trabalho->id,
'lido' => false,
'tipo' => 6,
]);
}
$destinatarios = $admins->map(function($admin) {return $admin->user;})->push($coord->user);
Notification::send($destinatarios, new SolicitacaoCertificadoNotification($trabalho->proponente, $trabalho, $userTemp, $users));
return redirect()->route('trabalho.show', ['id' => $trabalho->id])->with('sucesso', 'Solicitação de certificado/declaração efetuada com sucesso!');
}
public function novaVersao(Request $request)
{
......
......@@ -12,7 +12,7 @@ class Notificacao extends Model
* @var array
*/
protected $fillable = [
'lido', 'tipo', 'destinatario_id', 'remetente_id', 'perfil_id', 'trabalho_id',
'lido', 'tipo', 'destinatario_id', 'remetente_id', 'perfil_id', 'trabalho_id', 'solicitacao_certificado_id',
];
public function destinatario(){
......@@ -26,4 +26,9 @@ class Notificacao extends Model
public function trabalho(){
return $this->belongsTo(Trabalho::class,'trabalho_id','id');
}
public function solicitacaoCertificado()
{
return $this->belongsTo('\App\SolicitacaoCertificado', 'solicitacao_certificado_id');
}
}
<?php
namespace App\Notifications;
use App\Proponente;
use App\Trabalho;
use App\User;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Notification;
use Illuminate\Support\Str;
class SolicitacaoCertificadoNotification extends Notification
{
use Queueable;
public $proponente;
public $trabalho;
public $destinatario;
public $users;
/**
* Create a new notification instance.
*
* @return void
*/
public function __construct(Proponente $proponente, Trabalho $trabalho, User $destinatario, $users)
{
$this->proponente = $proponente;
$this->trabalho = $trabalho;
$this->destinatario = $destinatario;
$this->users = $users;
}
/**
* Get the notification's delivery channels.
*
* @param mixed $notifiable
* @return array
*/
public function via($notifiable)
{
return ['mail'];
}
/**
* Get the mail representation of the notification.
*
* @param mixed $notifiable
* @return \Illuminate\Notifications\Messages\MailMessage
*/
public function toMail($notifiable)
{
$nomes = $this->users
->reject(function ($value, $key) {
return $value->name == $this->proponente->user->name;
})->map(function($user) {
return $user->name;
})->implode(', ');
$qtd = $this->users->count();
return (new MailMessage)
->subject('Recebimento de solicitação de certificado/declaração')
->greeting("Olá, {$notifiable->name}!")
->line("O proponente ". $this->proponente->user->name . " registrou uma solicitação de certificado/declaração para ". Str::plural('o', $qtd) . ' ' . Str::plural('seguinte', $qtd) . ' ' . Str::plural('discente', $qtd) . ': ' . $nomes)
->line('Obrigado por usar o nosso sistema.')
->markdown('vendor.notifications.email');
}
/**
* Get the array representation of the notification.
*
* @param mixed $notifiable
* @return array
*/
public function toArray($notifiable)
{
return [
//
];
}
}
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class SolicitacaoCertificado extends Model
{
protected $table = "solicitacoes_certificados";
protected $fillable = [
'trabalho_id'
];
public function solicitacoesParticipantes()
{
return $this->hasMany('App\SolicitacaoParticipante', 'solicitacao_certificado_id');
}
}
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class SolicitacaoParticipante extends Model
{
protected $table = "solicitacoes_participantes";
protected $fillable = [
'solicitacao_certificado_id', 'user_id'
];
public function solicitacaoCertificado()
{
return $this->belongsTo('App\SolicitacaoCertificado', 'solicitacao_certificado_id');
}
public function user()
{
return $this->belongsTo('App\User', 'user_id');
}
}
......@@ -110,4 +110,9 @@ class Trabalho extends Model
public function notificacoes(){
return $this->hasMany(Notificacao::class, 'trabalho_id', 'id');
}
public function solicitacoesCertificados()
{
return $this->hasMany(Certificado::class, 'trabalho_id');
}
}
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateCertificadosTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('solicitacoes_certificados', function (Blueprint $table) {
$table->bigIncrements('id');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('solicitacoes_certificados');
}
}
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateSolicitacaoParticipantesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('solicitacoes_participantes', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedBigInteger('user_id');
$table->foreign('user_id')->references('id')->on('users');
$table->unsignedBigInteger('solicitacao_certificado_id');
$table->foreign('solicitacao_certificado_id')->references('id')->on('solicitacoes_certificados');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('solicitacoes_participantes');
}
}
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddSolicitacaoCertificadoToNotificacaos extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('notificacaos', function (Blueprint $table) {
$table->unsignedBigInteger('solicitacao_certificado_id')->nullable();
$table->foreign('solicitacao_certificado_id')->references('id')->on('solicitacoes_certificados');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('notificacaos', function (Blueprint $table) {
$table->dropForeign(['solicitacao_certificado_id']);
$table->dropColumn('solicitacao_certificado_id');
});
}
}
......@@ -2,7 +2,7 @@
@section('content')
<div class="row justify-content-center" style="margin-top: 100px; overflow-x: hidden;overflow-y:hidden">
<div class="row justify-content-center" style="margin-top: 100px;">
<div class="col-md-11">
<div class="row">
<div class="col-sm-7">
......@@ -29,7 +29,35 @@
</h6>
</div>
</div>
<div class="row">
<div class="col-sm-1 mt-5">
<div class="btn-group dropup">
<button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Filtro @isset ($column) - {{$column}} @endisset
</button>
<div class="dropdown-menu" aria-labelledby="dropdownMenuLink">
<a class="dropdown-item" href="{{route('admin.analisar', ['evento_id' => $evento->id])}}">
Todos
</a>
<a class="dropdown-item" href="{{route('admin.analisar', ['evento_id' => $evento->id, 'column' => 'aprovado'])}}">
Aprovados
</a>
<a class="dropdown-item" href="{{route('admin.analisar', ['evento_id' => $evento->id, 'column' => 'reprovado'])}}">
Reprovados
</a>
<a class="dropdown-item" href="{{route('admin.analisar', ['evento_id' => $evento->id, 'column' => 'submetido'])}}">
Submetidos
</a>
<a class="dropdown-item" href="{{route('admin.analisar', ['evento_id' => $evento->id, 'column' => 'avaliado'])}}">
Avaliados
</a>
<a class="dropdown-item" href="{{route('admin.analisar', ['evento_id' => $evento->id, 'column' => 'corrigido'])}}">
Corrigidos
</a>
</div>
</div>
</div>
</div>
</div>
</div>
......
@extends('layouts.app')
@section('content')
<div class="row justify-content-center"
style="margin-top: 100px;">
<div class="col-md-11">
<div class="row">
<div class="col-sm-12">
<div class="card-body"
style="padding-top: 0.2rem;">
<div class="container">
<div class="form-row mt-3">
<div class="col-md-12">
<h5 style="color: #1492E6; font-size: 20px;">Trabalho - {{ $trabalho->titulo }}</h5>
</div>
<div class="col-md-12">
<h6 style="color: #234B8B; margin-bottom:-0.4rem; font-weight: bold; font-size: 14px;">
Solicitação de certificado/declaração</h6>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
@foreach ($notificacao->solicitacaoCertificado->solicitacoesParticipantes as $solicitacao)
<!--Informações Proponente-->
<div class="row justify-content-center"
style="margin-top: 20px;">
<br>
<div class="col-md-11">
<div class="card"
style="border-radius: 5px;">
<div class="card-body"
style="padding-top: 0.2rem;">
<div class="container">
<div class="form-row mt-3">
<div class="col-md-10">
<h5 style="color: #234B8B; font-weight: bold">Solicitante: {{ $solicitacao->user->name }}</h5>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
@endforeach
@endsection
......@@ -304,6 +304,11 @@
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.19.2/jquery.validate.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/jquery-mask-plugin@1.14.16/dist/jquery.mask.min.js"></script>
<script>
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
$(document).ready(function() {
$("#dropdown-login").on('click', function(event){
event.stopPropagation();
......
......@@ -110,6 +110,20 @@
@endif
@endif
</div>
{{-- Certificado --}}
@elseif ($notificacao->tipo == 6)
<div class="row">
@if($notificacao->destinatario_id == Auth::user()->id)
<div class="col-sm-11">
<h6 style="font-size: 18px">Solicitação de certificado/declaração</h6>
</div>
@if(!$notificacao->lido)
<div class="col-sm-1">
<p class="circulo"></p>
</div>
@endif
@endif
</div>
@endif
<p style="font-size: 14px; margin-bottom: 0;">
Projeto: {{$notificacao->trabalho->titulo}}</p>
......
......@@ -4,8 +4,11 @@
<div class="card-body" style="padding-top: 0.2rem;">
<div class="container">
<div class="form-row mt-3">
<div class="col-sm-9"><h5 style="color: #234B8B; font-weight: bold">Discentes</h5></div>
<div class="col-sm-3 text-sm-right" >
<div class="col-sm-6"><h5 style="color: #234B8B; font-weight: bold">Discentes</h5></div>
<div class="col-sm-4 text-sm-right" >
<a href="" data-toggle="modal" data-target="#modalSelecionarDiscentes" class="button">Solicitar certificado/declaração</a>
</div>
<div class="col-sm-2 text-sm-right" >
<a href="{{route('trabalho.trocaParticipante', ['evento_id' => $projeto->evento->id, 'projeto_id' => $projeto->id])}}"
class="button">Solicitar Substituições</a>
</div>
......
......@@ -43,6 +43,43 @@
</div>
</div>
</form>
<div class="modal fade" id="modalSelecionarDiscentes" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header" style="overflow-x:auto; padding-left: 31px">
<h5 class="modal-title" id="exampleModalLabel" style= "color:#1492E6">Selecione os discentes que dejesa solicitar certificado/declaração</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close" style="padding-top: 8px; color:#1492E6">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body" style="padding-right: 32px;padding-left: 32px;padding-top: 20px;padding-bottom: 32px;">
<form id="certificadoForm" action="{{route('trabalho.solicitarCertificado', $projeto)}}" method="POST">
@csrf
<div class="form-check">
<input name="users[]" class="form-check-input" type="checkbox" value="{{$projeto->proponente->user->id}}" id="pa-{{$projeto->proponente->user->id}}">
<label class="form-check-label" for="pa-{{$projeto->proponente->user->id}}">
{{$projeto->proponente->user->name}}
</label>
</div>
@foreach ($projeto->participantes as $participante)
<div class="form-check">
<input name="users[]" class="form-check-input" type="checkbox" value="{{$participante->user->id}}" id="pa-{{$participante->user->id}}">
<label class="form-check-label" for="pa-{{$participante->user->id}}">
{{$participante->user->name}}
</label>
</div>
@endforeach
</form>
</div>
<div class="modal-footer d-flex justify-content-between px-3">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Cancelar</button>
<button type="submit" form="certificadoForm" class="btn btn-primary">Confirmar</button>
</div>
</div>
</div>
</div>
<div id="participanteFirst" >
@component('componentes.participante', ['enum_turno' => $enum_turno,'estados' => $estados, ])
......
<?php
<?php
use App\Http\Middleware\checkCoordenador;
use App\Trabalho;
......@@ -135,6 +135,7 @@ Route::group(['middleware' => ['isTemp', 'auth', 'verified']], function(){
Route::post( '/projeto/{id}/atualizar', 'TrabalhoController@update' )->name('trabalho.update');
Route::get( '/projeto/{id}/excluir', 'TrabalhoController@destroy' )->name('trabalho.destroy');
Route::get( '/projeto/{id}/excluirParticipante','TrabalhoController@excluirParticipante')->name('trabalho.excluirParticipante');
Route::post( '/projeto/{trabalho}/solicitarCertificado','TrabalhoController@solicitarCertificado')->name('trabalho.solicitarCertificado');
Route::get( '/projeto/exportar/{id}','TrabalhoController@exportProjeto' )->name('exportar.projeto');
Route::get( '/projeto/substituirParticipante', 'TrabalhoController@telaTrocaPart' )->name('trabalho.trocaParticipante');
Route::post( '/projeto/substituirParticipante', 'TrabalhoController@trocaParticipante' )->name('trabalho.infoTrocaParticipante');
......@@ -142,6 +143,8 @@ Route::group(['middleware' => ['isTemp', 'auth', 'verified']], function(){
Route::post( '/aprovarSubstituicao', 'TrabalhoController@aprovarSubstituicao' )->name('trabalho.aprovarSubstituicao');
Route::post( '/aprovarProposta/{id}', 'TrabalhoController@aprovarProposta' )->name('trabalho.aprovarProposta');
Route::post( '/certificado/{certificado}', 'CertificadoController@update' )->name('certificado.update');
//########## Bolsas
Route::get( '/bolsas', 'ParticipanteController@listarParticipanteEdital' )->name('bolsas.listar');
Route::get( '/bolsas/alteracao/{id}/{tipo}', 'ParticipanteController@alterarBolsa' )->name('bolsa.alterar');
......@@ -207,7 +210,7 @@ Route::prefix('usuarios')->name('admin.')->group(function(){
Route::get('/visualizarParecer', 'AdministradorController@visualizarParecer')->name('visualizarParecer');
Route::get('/visualizarParecerInterno', 'AdministradorController@visualizarParecerInterno')->name('visualizarParecerInterno');
Route::get('/pareceresProjetos', 'AdministradorController@pareceres' )->name('pareceres');
Route::get('/analisarProjetos', 'AdministradorController@analisar' )->name('analisar');
Route::get('/analisarProjetos/{column?}', 'AdministradorController@analisar' )->name('analisar');
Route::get('/analisarProposta', 'AdministradorController@analisarProposta' )->name('analisarProposta');
Route::get('/showProjetos', 'AdministradorController@showProjetos' )->name('showProjetos');
Route::get('/showResultados', 'AdministradorController@showResultados' )->name('showResultados');
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment