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

Merge pull request #189 from KelwinJonas/master

Desligamento de participantes
parents 27015b69 b61f4f6f
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Desligamento extends Model
{
protected $fillable = [
'status',
'justificativa',
'participante_id',
'trabalho_id',
];
public const STATUS_ENUM = [
'solicitado' => 1,
'aceito' => 2,
'recusado' => 3,
];
public function participante(){
return $this->belongsTo(Participante::class, 'participante_id', 'id');
}
public function trabalho(){
return $this->belongsTo(Trabalho::class, 'trabalho_id', 'id');
}
public function getStatus()
{
switch ($this->status) {
case Desligamento::STATUS_ENUM['solicitado']:
return 'Solicitado';
break;
case Desligamento::STATUS_ENUM['aceito']:
return 'Aceito';
break;
case Desligamento::STATUS_ENUM['recusado']:
return 'Recusado';
break;
default:
break;
}
}
}
...@@ -2,13 +2,18 @@ ...@@ -2,13 +2,18 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use Auth;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use App\Evento; use App\Evento;
use App\CoordenadorComissao; use App\CoordenadorComissao;
use App\Avaliador; use App\Avaliador;
use App\Desligamento;
use App\Mail\SolicitacaoDesligamento;
use App\Notificacao;
use App\Proponente; use App\Proponente;
use App\Participante; use App\Participante;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Mail;
class CoordenadorComissaoController extends Controller class CoordenadorComissaoController extends Controller
{ {
...@@ -114,7 +119,30 @@ class CoordenadorComissaoController extends Controller ...@@ -114,7 +119,30 @@ class CoordenadorComissaoController extends Controller
} }
public function respostaDesligamento(Request $request)
{
$desligamento = Desligamento::find($request->desligamento);
$desligamento->status = intval($request->opcao);
$desligamento->update();
if($desligamento->status == Desligamento::STATUS_ENUM['aceito']){
$desligamento->participante->delete();
}
$notificacao = Notificacao::create([
'remetente_id' => Auth::user()->id,
'destinatario_id' => $desligamento->trabalho->proponente_id,
'trabalho_id' => $desligamento->trabalho->id,
'lido' => false,
'tipo' => 7,
]);
$notificacao->save();
Mail::to($desligamento->trabalho->proponente->user->email)->send(new SolicitacaoDesligamento($desligamento->trabalho->evento, $desligamento->trabalho, "resultado"));
return redirect()->back()->with(['sucesso' => 'Desligamento '.$desligamento->getStatus().' com sucesso.']);
}
} }
...@@ -126,6 +126,10 @@ class NotificacaoController extends Controller ...@@ -126,6 +126,10 @@ class NotificacaoController extends Controller
} else { } else {
return redirect()->route('avaliador.editais'); return redirect()->route('avaliador.editais');
} }
}elseif ($notificacao->tipo == 7) {
if ($notificacao->destinatario_id == Auth()->user()->id && Auth()->user()->tipo != 'proponente') {
return redirect()->route('admin.analisarProposta', ['id' => $notificacao->trabalho->id]);
}
} elseif ($notificacao->tipo == 6) { } elseif ($notificacao->tipo == 6) {
$trabalho = $notificacao->trabalho; $trabalho = $notificacao->trabalho;
return view('administrador.visualizarSolicitacaoCertificado', compact('notificacao', 'trabalho')); return view('administrador.visualizarSolicitacaoCertificado', compact('notificacao', 'trabalho'));
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\Desligamento;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator; use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule; use Illuminate\Validation\Rule;
...@@ -10,7 +11,12 @@ use App\User; ...@@ -10,7 +11,12 @@ use App\User;
use App\Trabalho; use App\Trabalho;
use App\Proponente; use App\Proponente;
use App\Evento; use App\Evento;
use App\Mail\SolicitacaoDesligamento;
use App\Mail\SolicitacaoSubstituicao;
use App\Notificacao;
use App\Participante;
use Carbon\Carbon; use Carbon\Carbon;
use Illuminate\Support\Facades\Mail;
class ProponenteController extends Controller class ProponenteController extends Controller
{ {
...@@ -111,4 +117,35 @@ class ProponenteController extends Controller ...@@ -111,4 +117,35 @@ class ProponenteController extends Controller
return view('proponente.projetosEdital')->with(['edital' => $edital, 'projetos' => $projetos, 'hoje'=>$hoje]); return view('proponente.projetosEdital')->with(['edital' => $edital, 'projetos' => $projetos, 'hoje'=>$hoje]);
} }
public function solicitarDesligamento(Request $request){
$participante = Participante::find($request->participante);
$request->validate([
'justificativa' => 'required|max:5000|min:5',
]);
$desligamento = new Desligamento();
$desligamento->status = Desligamento::STATUS_ENUM['solicitado'];
$desligamento->justificativa = $request->justificativa;
$desligamento->trabalho_id = $request->trabalho;
$desligamento->participante_id = $participante->id;
$desligamento->save();
$trabalho = Trabalho::find($request->trabalho);
$notificacao = Notificacao::create([
'remetente_id' => Auth::user()->id,
'destinatario_id' => $trabalho->evento->coordenadorComissao->user_id,
'trabalho_id' => $trabalho->id,
'lido' => false,
'tipo' => 6,
]);
$notificacao->save();
Mail::to($trabalho->evento->coordenadorComissao->user->email)->send(new SolicitacaoDesligamento($trabalho->evento, $trabalho));
return redirect()->back()->with(['sucesso' => 'Solicitação de desligamento feita com sucesso.']);
}
} }
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
class SolicitacaoDesligamento extends Mailable
{
use Queueable, SerializesModels;
public $edital;
public $projeto;
public $tipo;
public function __construct($edital, $projeto, $tipo = '')
{
$this->edital = $edital;
$this->projeto = $projeto;
$this->tipo = $tipo;
}
public function build(){
return $this->from('lmtsteste@gmail.com', 'Submeta - LMTS')
->subject('Solicitação de Desligamento')
->view('emails.solicitacaoDesligamento')
->with([
'edital' => $this->edital,
'projeto' => $this->projeto,
'tipo' => $this->tipo
]);
}
}
...@@ -34,4 +34,11 @@ class Participante extends Model ...@@ -34,4 +34,11 @@ class Participante extends Model
return $this->hasOne('App\Arquivo', 'participanteId'); return $this->hasOne('App\Arquivo', 'participanteId');
} }
public function documentacaoComplementar() {
return $this->hasOne('App\DocumentacaoComplementar', 'participante_id');
}
public function desligamentos() {
return $this->hasMany('App\Desligamento', 'participante_id')->orderBy('created_at', 'DESC');
}
} }
...@@ -111,6 +111,10 @@ class Trabalho extends Model ...@@ -111,6 +111,10 @@ class Trabalho extends Model
return $this->hasMany(Notificacao::class, 'trabalho_id', 'id'); return $this->hasMany(Notificacao::class, 'trabalho_id', 'id');
} }
public function desligamentos(){
return $this->hasMany(Desligamento::class, 'trabalho_id', 'id')->orderBy('created_at', 'DESC');
}
public function solicitacoesCertificados() public function solicitacoesCertificados()
{ {
return $this->hasMany(Certificado::class, 'trabalho_id'); return $this->hasMany(Certificado::class, 'trabalho_id');
......
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateDesligamentosTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('desligamentos', function (Blueprint $table) {
$table->bigIncrements('id');
$table->integer('status');
$table->text('justificativa');
$table->unsignedBigInteger('participante_id');
$table->foreign('participante_id')->references('id')->on('participantes');
$table->unsignedBigInteger('trabalho_id');
$table->foreign('trabalho_id')->references('id')->on('trabalhos');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('desligamentos');
}
}
...@@ -42,6 +42,7 @@ ...@@ -42,6 +42,7 @@
@if(($substituicoesProjeto->first() != null) && ($substituicoesProjeto->first()->status == 'Em Aguardo')) style="pointer-events: none; cursor: default;" @endif> @if(($substituicoesProjeto->first() != null) && ($substituicoesProjeto->first()->status == 'Em Aguardo')) style="pointer-events: none; cursor: default;" @endif>
<i class="fas fa-exchange-alt fa-2x"></i></a> <i class="fas fa-exchange-alt fa-2x"></i></a>
<a href="" data-toggle="modal" data-target="#modalVizuParticipante{{$participante->id}}" class="button"><i class="far fa-eye fa-2x"></i></a> <a href="" data-toggle="modal" data-target="#modalVizuParticipante{{$participante->id}}" class="button"><i class="far fa-eye fa-2x"></i></a>
<a href="" data-toggle="modal" data-target="#modalSolicitarDesligamentoParticipante{{$participante->id}}" class="button">Solicitar desligamento</a>
</div> </div>
</div> </div>
...@@ -167,6 +168,44 @@ ...@@ -167,6 +168,44 @@
</div> </div>
</div> </div>
</div> </div>
<!-- Modal solicitar desligamento participante -->
<div class="modal fade" id="modalSolicitarDesligamentoParticipante{{$participante->id}}" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered modal-lg">
<div class="modal-content">
<div class="modal-header" style="overflow-x:auto;">
<h5 class="modal-title" id="exampleModalLabel" style= "color:#1492E6">Desligar Participante</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">
<form id="solicitar-desligamento{{$participante->id}}" method="POST" action="{{route('proponente.solicitar.desligamento', ['edital_id' => $projeto->evento->id, 'projeto_id' => $projeto->id, 'participante_id' => $participante->id]) }}">
@csrf
<input type="hidden" id="participante{{$participante->id}}" name="participante" value="{{$participante->id}}">
<input type="hidden" id="trabalho" name="trabalho" value="{{$projeto->id}}">
<h6>Tem certeza que deseja solicitar o desligamento do participante <span style="font-weight: bold">{{$participante->user->name}}</span>?</h6>
<div class="form-row">
<div class="col-md-12 form-group">
<label for="justificativa">{{ __('Justificativa') }}<span style="color: red; font-weight: bold;"> *</span></label>
<textarea class="form-control @error('justificativa') is-invalid @enderror" type="text" name="justificativa" id="justificativa" cols="30" rows="5" placeholder="Digite a justificativa para o desligamento do participante" required>{{old('justificativa')}}</textarea>
@error('justificativa')
<div id="validationServer03Feedback" class="invalid-feedback">
{{ $message }}
</div>
@enderror
</div>
</div>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Cancelar</button>
@if($participante->desligamentos->first() == null || ($participante->desligamentos->first() != null && $participante->desligamentos->first()->status != \App\Desligamento::STATUS_ENUM['solicitado']))
<button type="submit" class="btn btn-success" form="solicitar-desligamento{{$participante->id}}">Confirmar</button>
@endif
</div>
</div>
</div>
</div>
@endforeach @endforeach
</div> </div>
</div> </div>
...@@ -301,6 +340,45 @@ ...@@ -301,6 +340,45 @@
</div> </div>
</div> </div>
<h4 style="margin-top: 50px">Desligamentos</h4>
<div style="margin-top: 20px">
<div class="card-header">
<div class="row">
<div class="col-4">
<h5 class="card-title" style= "color:#1492E6">
Participante
</h5>
</div>
<div class="col-2" style="text-align: center">
<h5 class="card-title" style= "color:#1492E6">
Status
</h5>
</div>
<div class="col-6" style="text-align: center">
<h5 class="card-title" style= "color:#1492E6">
Justificativa
</h5>
</div>
</div>
</div>
<div class="card-body">
@foreach($projeto->desligamentos as $desligamento)
<div class="row"style="margin-bottom: 20px;">
<div class="col-4">
<a href="" data-toggle="modal" data-target="#modalVizuParticipante{{$desligamento->participante()->withTrashed()->first()->id}}" class="button"><h4 style="font-size:18px">{{$desligamento->participante()->withTrashed()->first()->user->name}}</h4></a>
<h5 style= "color:grey; font-size:medium">{{date('d-m-Y', strtotime($desligamento->created_at))}}</h5>
</div>
<div class="col-2" style="text-align: center">
<h5>{{$desligamento->getStatus()}}</h5>
</div>
<div class="col-6" style="text-align: center">
<h5>{{$desligamento->justificativa}}</h5>
</div>
</div>
@endforeach
</div>
</div>
</div> </div>
</div> </div>
</div> </div>
......
<!DOCTYPE html>
<html>
<head>
</head>
<body>
@if($tipo == 'resultado')
<h4>Resultado pedido de desligamento</h4>
<p>A sua solicitação de desligamento no projeto <strong>{{$projeto->titulo}}</strong> foi analisada e o resultado você pode conferir <a href="{{route('trabalho.trocaParticipante', ['evento_id' => $projeto->evento->id, 'projeto_id' => $projeto->id])}}">aqui.</a></p>
<p>
Atenciosamente,
<br>
Equipe submeta.
</p>
@else
<h4>Um pedido de desligamento foi solicitado</h4>
<p>O proponente <strong>{{$projeto->proponente->user->name}}</strong> solicitou um desligamento no projeto <strong>{{$projeto->titulo}}</strong> do edital <strong>{{$edital->nome}}</strong> </p>
<p><a href="{{route('trabalho.telaAnaliseSubstituicoes', ['trabalho_id' => $projeto->id])}}" class="">Clique aqui</a> para analisar.</p>
@endif
</body>
</html>
\ No newline at end of file
...@@ -110,6 +110,12 @@ ...@@ -110,6 +110,12 @@
@endif @endif
@endif @endif
</div> </div>
@elseif($notificacao->tipo==7)
<div class="row">
@if($notificacao->destinatario_id == Auth::user()->id)
<div class="col-sm-11">
<h6 style="font-size: 18px">Solicitação de desligamento
para {{$notificacao->trabalho->evento->nome}}</h6>
{{-- Certificado --}} {{-- Certificado --}}
@elseif ($notificacao->tipo == 6) @elseif ($notificacao->tipo == 6)
<div class="row"> <div class="row">
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
</div> </div>
<div class="col-sm-2 text-sm-right" > <div class="col-sm-2 text-sm-right" >
<a href="{{route('trabalho.trocaParticipante', ['evento_id' => $projeto->evento->id, 'projeto_id' => $projeto->id])}}" <a href="{{route('trabalho.trocaParticipante', ['evento_id' => $projeto->evento->id, 'projeto_id' => $projeto->id])}}"
class="button">Solicitar Substituições</a> class="button">Solicitar Substituições/Desligamentos</a>
</div> </div>
</div> </div>
<hr style="border-top: 1px solid#1492E6"> <hr style="border-top: 1px solid#1492E6">
......
...@@ -45,6 +45,8 @@ Route::group(['middleware' => ['isTemp', 'auth', 'verified']], function(){ ...@@ -45,6 +45,8 @@ Route::group(['middleware' => ['isTemp', 'auth', 'verified']], function(){
Route::get( '/proponente/editais', 'ProponenteController@editais' )->name('proponente.editais'); Route::get( '/proponente/editais', 'ProponenteController@editais' )->name('proponente.editais');
Route::get( '/projetos-submetidos', 'ProponenteController@projetosDoProponente' )->name('proponente.projetos'); Route::get( '/projetos-submetidos', 'ProponenteController@projetosDoProponente' )->name('proponente.projetos');
Route::get( '/projetos-edital/{id}', 'ProponenteController@projetosEdital' )->name('proponente.projetosEdital')->middleware('auth'); Route::get( '/projetos-edital/{id}', 'ProponenteController@projetosEdital' )->name('proponente.projetosEdital')->middleware('auth');
Route::post('/proponente/edital/{edital_id}/projeto/{projeto_id}/solicitar_desligamento/{participante_id}', 'ProponenteController@solicitarDesligamento')->name('proponente.solicitar.desligamento');
//######### Rotas Administrador ################################# //######### Rotas Administrador #################################
...@@ -302,4 +304,7 @@ Route::prefix('coordenador')->name('coordenador.')->group(function(){ ...@@ -302,4 +304,7 @@ Route::prefix('coordenador')->name('coordenador.')->group(function(){
Route::post('/retornoDetalhes', 'CoordenadorComissaoController@retornoDetalhes' )->name('retornoDetalhes'); Route::post('/retornoDetalhes', 'CoordenadorComissaoController@retornoDetalhes' )->name('retornoDetalhes');
Route::post('/atribuirAvaliadorTrabalho', 'TrabalhoController@atribuirAvaliadorTrabalho' )->name('atribuirAvaliadorTrabalho'); Route::post('/atribuirAvaliadorTrabalho', 'TrabalhoController@atribuirAvaliadorTrabalho' )->name('atribuirAvaliadorTrabalho');
Route::post('/atribuir', 'TrabalhoController@atribuir' )->name('atribuir'); Route::post('/atribuir', 'TrabalhoController@atribuir' )->name('atribuir');
Route::post('/atribuir', 'TrabalhoController@atribuir' )->name('atribuir');
Route::post('/resposta-solicitacao-desligamento/{desligamento_id}', 'CoordenadorComissaoController@respostaDesligamento')->name('resposta.desligamento');
}); });
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