Skip to content

Instantly share code, notes, and snippets.

@walison17
Created April 11, 2017 01:46
Show Gist options
  • Save walison17/877e5d8be4a5da5e9c5545e7017d5554 to your computer and use it in GitHub Desktop.
Save walison17/877e5d8be4a5da5e9c5545e7017d5554 to your computer and use it in GitHub Desktop.
<?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