Commit 4bab285e authored by KelwinJonas's avatar KelwinJonas
Browse files

desligamento de participantes

parent 55115928
<?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 @@
namespace App\Http\Controllers;
use Auth;
use Illuminate\Http\Request;
use App\Evento;
use App\CoordenadorComissao;
use App\Avaliador;
use App\Desligamento;
use App\Mail\SolicitacaoDesligamento;
use App\Notificacao;
use App\Proponente;
use App\Participante;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Mail;
class CoordenadorComissaoController extends Controller
{
......@@ -115,6 +120,29 @@ 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' => 6,
]);
$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.']);
}
}
......@@ -125,6 +125,10 @@ class NotificacaoController extends Controller
} else {
return redirect()->route('avaliador.editais');
}
}elseif ($notificacao->tipo == 6) {
if ($notificacao->destinatario_id == Auth()->user()->id && Auth()->user()->tipo != 'proponente') {
return redirect()->route('admin.analisarProposta', ['id' => $notificacao->trabalho->id]);
}
}
}
......
......@@ -2,6 +2,7 @@
namespace App\Http\Controllers;
use App\Desligamento;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
......@@ -10,7 +11,12 @@ use App\User;
use App\Trabalho;
use App\Proponente;
use App\Evento;
use App\Mail\SolicitacaoDesligamento;
use App\Mail\SolicitacaoSubstituicao;
use App\Notificacao;
use App\Participante;
use Carbon\Carbon;
use Illuminate\Support\Facades\Mail;
class ProponenteController extends Controller
{
......@@ -111,4 +117,35 @@ class ProponenteController extends Controller
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
]);
}
}
......@@ -37,4 +37,8 @@ class Participante extends Model
public function documentacaoComplementar() {
return $this->hasOne('App\DocumentacaoComplementar', 'participante_id');
}
public function desligamentos() {
return $this->hasMany('App\Desligamento', 'participante_id')->orderBy('created_at', 'DESC');
}
}
......@@ -110,4 +110,9 @@ class Trabalho extends Model
public function notificacoes(){
return $this->hasMany(Notificacao::class, 'trabalho_id', 'id');
}
public function desligamentos(){
return $this->hasMany(Desligamento::class, 'trabalho_id', 'id')->orderBy('created_at', 'DESC');
}
}
<?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');
}
}
......@@ -94,7 +94,7 @@
<a href="" data-toggle="modal" data-target="#modalVizuSubstituicao" class="button">Substituições Pendentes</a>
<img class="" src="{{asset('img/icons/warning.ico')}}" style="width:15px" alt="">
@else
<a href="" data-toggle="modal" data-target="#modalVizuSubstituicao" class="button">Substituições</a>
<a href="" data-toggle="modal" data-target="#modalVizuSubstituicao" class="button">Substituições/Desligamentos</a>
@endif
</div>
</div>
......@@ -611,6 +611,11 @@
<span> Histórico</span>
</div>
</li>
<li>
<div class="aba3 aba">
<span> Desligamentos</span>
</div>
</li>
</ul>
</div>
<div id="content">
......@@ -789,14 +794,64 @@
@if($subs->status == 'Em Aguardo')
<h6>Pendente</h6>
@else
<a href="" data-toggle="modal" data-target="#modalVizuJustificativa{{$subs->id}}" class="button"><h5 style="font-size:18px">Visualizar</h5></a>
<a href="" data-toggle="modal" class="button" onclick="vizuJustificativa('{{$subs->justificativa}}')"><h5 style="font-size:18px">Visualizar</h5></a>
@endif
</div>
</div>
@endforeach
</div>
</div>
</div>
<div class="justify-content-center conteudo" id="tela3" style="margin-top: 0px;border: none;overflow-x: auto;">
<div class="col-md-12" style="padding: 0px">
<div class="card" style="border-radius: 5px">
<div class="card-body" style="padding-top: 0.2rem;padding-right: 0px;padding-left: 5px;padding-bottom: 5px;">
<div class="">
<div class="justify-content-start" style="alignment: center">
@foreach($trabalho->desligamentos as $desligamento)
<div class="row justify-content-between">
<div class="col-md-9">
<h5 style="color: #234B8B; font-weight: bold" class="col-md-12">Desligamento</h5>
<div class="d-flex justify-content-between">
<div class="col-md-2">
<img src="{{asset('img/icons/usuario.svg')}}" style="width:50px" alt="" class="img-flex">
</div>
<div class="col-md-10" >
<a onclick="vizuParticipante({{$desligamento->participante()->withTrashed()->first()->id}})" class="button">{{$desligamento->participante()->withTrashed()->first()->user->name}}</a>
<br><label for="justificativa">Justificativa: </label>
{{$desligamento->justificativa}}
</div>
</div>
</div>
<div class="col-md-3">
@if($desligamento->status == \App\Desligamento::STATUS_ENUM['solicitado'])
<h5 style="color: #234B8B; font-weight: bold" class="col-md-12 text-center"> Ações</h5>
<div class="col-md-12 text-center" style="border: solid#1111; padding: 10px; ">
<form id="resposta-desligamento{{$desligamento->id}}" method="POST" action="{{route('coordenador.resposta.desligamento', ['desligamento_id' => $desligamento->id]) }}">
@csrf
<input type="hidden" id="desligamento" name="desligamento" value="{{$desligamento->id}}">
<input type="radio" id="aceitar{{$desligamento->id}}" name="opcao" value="{{\App\Desligamento::STATUS_ENUM['aceito']}}"> Aprovar
<input type="radio" id="negar{{$desligamento->id}}" name="opcao" value="{{\App\Desligamento::STATUS_ENUM['recusado']}}"> Negar
<br>
<button type="submit" class="btn btn-primary" form="resposta-desligamento{{$desligamento->id}}">Submeter</button>
</form>
</div>
@else
<h5 style="color: #234B8B; font-weight: bold" class="col-md-12 text-center"> Status</h5>
<div class="col-md-12 text-center" style="border: solid#1111; padding: 10px; ">
{{$desligamento->getStatus()}}
</div>
@endif
</div>
</div>
@endforeach
</div>
</div>
</div>
</div>
</div>
</div>
</div>
......@@ -854,16 +909,28 @@
$(".abas li:first div").addClass("selected");
$(".aba2").click(function(){
$(".aba1").removeClass("selected");
$(".aba3").removeClass("selected");
$(this).addClass("selected");
$("#tela1").hide();
$("#tela3").hide();
$("#tela2").show();
});
$(".aba1").click(function(){
$(".aba2").removeClass("selected");
$(".aba3").removeClass("selected");
$(this).addClass("selected");
$("#tela2").hide();
$("#tela3").hide();
$("#tela1").show();
});
$(".aba3").click(function(){
$(".aba2").removeClass("selected");
$(".aba1").removeClass("selected");
$(this).addClass("selected");
$("#tela2").hide();
$("#tela1").hide();
$("#tela3").show();
});
let textTemp = document.getElementById("comentario").innerHTML;
......@@ -896,8 +963,8 @@
function vizuJustificativa(texto){
$("#modalVizuSubstituicao").modal('hide');
setTimeout(() => { $("#modalVizuJustificativa").modal(); }, 500);
document.getElementById("conteudoJustificativa").innerHTML = texto;
setTimeout(() => { $("#modalVizuJustificativa").modal(); }, 500);
}
function closeJustificativa(){
......
......@@ -42,6 +42,7 @@
@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>
<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>
......@@ -167,6 +168,44 @@
</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
</div>
</div>
......@@ -301,6 +340,45 @@
</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>
......
<!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,20 @@
@endif
@endif
</div>
@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 desligamento
para {{$notificacao->trabalho->evento->nome}}</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>
......
......@@ -7,7 +7,7 @@
<div class="col-sm-9"><h5 style="color: #234B8B; font-weight: bold">Discentes</h5></div>
<div class="col-sm-3 text-sm-right" >
<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>
<hr style="border-top: 1px solid#1492E6">
......
......@@ -45,6 +45,8 @@ Route::group(['middleware' => ['isTemp', 'auth', 'verified']], function(){
Route::get( '/proponente/editais', 'ProponenteController@editais' )->name('proponente.editais');
Route::get( '/projetos-submetidos', 'ProponenteController@projetosDoProponente' )->name('proponente.projetos');
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 #################################
......@@ -299,4 +301,7 @@ Route::prefix('coordenador')->name('coordenador.')->group(function(){
Route::post('/retornoDetalhes', 'CoordenadorComissaoController@retornoDetalhes' )->name('retornoDetalhes');
Route::post('/atribuirAvaliadorTrabalho', 'TrabalhoController@atribuirAvaliadorTrabalho' )->name('atribuirAvaliadorTrabalho');
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