Created
April 11, 2017 01:46
-
-
Save walison17/877e5d8be4a5da5e9c5545e7017d5554 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace App; | |
use Carbon\Carbon; | |
use Illuminate\Database\Eloquent\Relations\HasMany; | |
use Illuminate\Notifications\Notifiable; | |
use Illuminate\Foundation\Auth\User as Authenticatable; | |
use Illuminate\Support\Collection; | |
use Illuminate\Support\Facades\DB; | |
use Image; | |
use Mockery\Exception; | |
use Spatie\Permission\Traits\HasRoles; | |
/** | |
* App\User | |
* | |
* @property-read \Illuminate\Notifications\DatabaseNotificationCollection|\Illuminate\Notifications\DatabaseNotification[] $notifications | |
* @property-read \Illuminate\Database\Eloquent\Collection|\Spatie\Permission\Models\Permission[] $permissions | |
* @property-read \Illuminate\Database\Eloquent\Collection|\Spatie\Permission\Models\Role[] $roles | |
* @method static \Illuminate\Database\Query\Builder|\App\User role($roles) | |
* @mixin \Eloquent | |
*/ | |
class User extends Authenticatable | |
{ | |
use Notifiable; | |
use HasRoles; | |
protected $fillable = [ | |
'name', | |
'email', | |
'login', | |
'cpf', | |
'cep', | |
'password', | |
'logradouro', | |
'numero', | |
'bairro', | |
'cidade', | |
'uf', | |
'data_nascimento' | |
]; | |
protected $hidden = [ | |
'name', | |
'password', | |
'remember_token', | |
'created_at', | |
'updated_at' | |
]; | |
protected $casts = [ | |
'ativo' => 'boolean', | |
'perfil_concluido' => 'boolean' | |
]; | |
/** | |
* cria a assinatura da acompanhante para exibição no site | |
* | |
* @param Plano $plano | |
* @param Prazo $prazo | |
*/ | |
public function assinar(Plano $plano, Prazo $prazo) | |
{ | |
$dataInicio = Carbon::now(); | |
$dataFim = Carbon::now()->addDays($prazo->quantidade_dias); | |
$this->planos()->attach($plano->id, [ | |
'valor_plano' => $plano->comPrazo($prazo)->pivot->valor, | |
'data_inicio' => $dataInicio, | |
'data_fim' => $dataFim, | |
'created_at' => Carbon::now(), | |
'updated_at' => Carbon::now() | |
]); | |
} | |
/** | |
* verifica se o usuário já é assinante do plano | |
* | |
* @param Plano $plano | |
* @return mixed | |
*/ | |
public function assinouPlano(Plano $plano) | |
{ | |
return $this->planos->contains('id', $plano->id); | |
} | |
/** | |
* renova a assinatura do plano | |
* atualiza a data_fim acrescentando a quantidade de dias de acordo com o prazo assinado | |
* | |
* @param Plano $plano | |
* @param Prazo $prazo | |
*/ | |
public function renovarAssinatura(Plano $plano, Prazo $prazo) | |
{ | |
$assinatura = $this->getAssinatura($plano); | |
$dataFim = Carbon::parse($assinatura->pivot->data_fim) | |
->addDays($prazo->quantidade_dias); | |
$this->planos()->updateExistingPivot($plano->id, [ | |
'data_fim' => $dataFim, | |
'updated_at' => Carbon::now() | |
]); | |
} | |
/** | |
* cancela a assinatura do plano não importando qual prazo está atribuido | |
* | |
* @param Plano $plano | |
*/ | |
public function cancelarAssinatura(Plano $plano) | |
{ | |
$assinatura = $this->getAssinatura($plano); | |
//todo criar campo de status para assinatura | |
} | |
/** | |
* retorna a assinatura detalhada do plano | |
* | |
* @param $plano | |
*/ | |
public function getAssinatura(Plano $plano) | |
{ | |
$this->planos->first(function ($value) use ($plano) { | |
return $value->id == $plano->id; | |
}); | |
} | |
/** | |
* retorna a lista de planos assinados pela acompanhante | |
* | |
* @return \Illuminate\Database\Eloquent\Relations\BelongsToMany | |
*/ | |
public function planos() | |
{ | |
return $this->belongsToMany(Plano::class, 'user_has_plans', 'user_id', 'plan_id') | |
->withPivot(['data_inicio', 'data_fim', 'valor_plano']); | |
} | |
/** | |
* perfil da acompanhante | |
* | |
* @return \Illuminate\Database\Eloquent\Relations\HasOne | |
*/ | |
public function profile() | |
{ | |
return $this->hasOne(Profile::class); | |
} | |
/** | |
* define o perfil do usuário | |
* | |
* @param Profile $perfil | |
*/ | |
public function definirPerfil(Profile $perfil) | |
{ | |
$this->profile()->save($perfil); | |
} | |
/** | |
* lista os ensaios do usuário | |
* | |
* @return HasMany | |
*/ | |
public function ensaios() | |
{ | |
return $this->hasMany(Ensaio::class); | |
} | |
/** | |
* Adiciona um ensaio | |
* | |
* @param $ensaio | |
*/ | |
public function adicionarEnsaio($ensaio) | |
{ | |
if (!$this->podeAdicionarEnsaios()) { | |
throw new Exception('Limite de ensaios foi atingido'); | |
} | |
$this->ensaios()->save($ensaio); | |
} | |
/** | |
* avalia se o usuário pode criar novos ensaios | |
* | |
* @return bool | |
*/ | |
public function podeAdicionarEnsaios() | |
{ | |
return $this->quantidadeEnsaiosDisponivel() > 0; | |
} | |
/** | |
* quantidade de ensaios o usuário ainda pode inserir | |
* | |
* @return int | |
*/ | |
public function quantidadeEnsaiosDisponivel() | |
{ | |
$limiteEnsaios = $this->attributes['quant_ensaios']; | |
$quantidadeEnsaios = $this->ensaios->count(); | |
return ($limiteEnsaios - $quantidadeEnsaios); | |
} | |
/** | |
* lista usuários por plano | |
* | |
* @param int $quantidade | |
* @return Collection | |
*/ | |
public static function porPlano($nomePlano, $quantidade = 4) | |
{ | |
return self::ativo() | |
->comCadastroConcluido() | |
->comPlano($nomePlano) | |
->take($quantidade) | |
->inRandomOrder() | |
->get(); | |
} | |
public function scopeComPlano($query, $nomePlano) | |
{ | |
return $query->whereHas('planos', function ($query) use ($nomePlano) { | |
$query->where('nome', $nomePlano); | |
}); | |
} | |
/** | |
* filtra usuários com assinatura válida | |
* a assinatura é considerada válida quando | |
* | |
* @param $query | |
* @return mixed | |
*/ | |
public function scopeComAssinaturaValida($query) | |
{ | |
return $query->whereHas('planos', function ($query) { | |
$query->whereHas('prazos', function ($query) { | |
$query->where('data_fim', '>=', Carbon::today()->toDateString()); | |
}); | |
}); | |
} | |
/** | |
* @param $query | |
* @return mixed | |
*/ | |
public function scopeComCadastroConcluido($query) | |
{ | |
return $query->where('perfil_concluido', 1); | |
} | |
/** | |
* @param $query | |
* @return mixed | |
*/ | |
public function scopeAtivo($query) | |
{ | |
return $query->where('ativo', 1); | |
} | |
/** | |
* informa se o usuário é administrador | |
* | |
* @return bool | |
*/ | |
public function isAdministrador() | |
{ | |
return $this->hasRole('administrador'); | |
} | |
/** | |
* informa se o usuário é acompanhante | |
* | |
* @return bool | |
*/ | |
public function isAcompanhante() | |
{ | |
return $this->hasRole('acompanhante'); | |
} | |
/** | |
* informa se o usuário é desenvolvedor | |
* | |
* @return bool | |
*/ | |
public function isDesenvolvedor() | |
{ | |
return $this->hasRole('desenvolvedor'); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment