ldc-bogt/app/Models/CafelEggBreeder.php
Jérémy Munsch 35aab2df1f
For Egg And Poultry Breeders
Truncate breeders before importing from Cafel
Trigger Breeder destroy event to remove pictures
2022-10-27 16:15:11 +02:00

192 lines
5 KiB
PHP

<?php
namespace App\Models;
use App\Enums\BreederCivilty;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
use Illuminate\Validation\ValidationException;
use Kwaadpepper\Enum\Traits\CastsEnums;
class CafelEggBreeder extends Model
{
use CastsEnums;
/**
* The primary key for the model.
*
* @var string
*/
protected $primaryKey = 'cafel_code';
/**
* Indicates if the IDs are auto-incrementing.
*
* @var boolean
*/
public $incrementing = false;
/**
* Indicates if the model should be timestamped.
*
* @var boolean
*/
public $timestamps = false;
/**
* The attributes that should be cast.
*
* @var array
*/
protected $casts = [
'birth_date' => 'date',
'date_start_operation' => 'date',
'inuavs' => 'array'
];
/**
* Map attribute names to enum classes.
*
* @var array
*/
protected $enumCasts = [
'civility' => BreederCivilty::class
];
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'cafel_code',
'ede_code',
'civility',
'lastname',
'firstname',
'birth_date',
'postcode',
'city',
'date_start_operation',
'inuavs',
'exploitation',
'aboutyou',
'vocation',
'likeinjob',
'loue_means',
'path_picture_1',
'path_picture_2',
'marking_egg',
'marking_b1',
'marking_b2'
];
/**
* The accessors to append to the model's array form.
*
* @var array
*/
protected $appends = ['questions'];
/**
* Perform any actions required after the model boots.
*
* @return void
*/
protected static function booted()
{
// * EVENT CLOSURES.
static::creating(function (self $model) {
return self::areInuavCodesUniques($model);
return self::isEdeCodeUnique($model);
});
static::updating(function (self $model) {
if ($model->getRawOriginal('path_picture_1') !== $model->path_picture_1) {
Storage::delete(\public_path($model->getRawOriginal('path_picture_1')));
}
if ($model->getRawOriginal('path_picture_2') !== $model->path_picture_2) {
Storage::delete(\public_path($model->getRawOriginal('path_picture_2')));
}
return self::areInuavCodesUniques($model);
return self::isEdeCodeUnique($model);
});
static::deleting(function (self $model) {
if ($model->getRawOriginal('path_picture_1')) {
Storage::delete(\public_path($model->getRawOriginal('path_picture_1')));
}
if ($model->getRawOriginal('path_picture_2')) {
Storage::delete(\public_path($model->getRawOriginal('path_picture_2')));
}
});
}
// * METHODS
/**
* Questions attribute accessor
*
* @return boolean
*/
public function getQuestionsAttribute(): bool
{
if ($this->aboutyou != null && $this->aboutyou != '') {
return true;
}
if ($this->vocation != null && $this->vocation != '') {
return true;
}
if ($this->likeinjob != null && $this->likeinjob != '') {
return true;
}
if ($this->loue_means != null && $this->loue_means != '') {
return true;
}
return false;
}
/**
* Check if inuav codes are unique
*
* @param self $breeder
* @return boolean
* @throws \Illuminate\Validation\ValidationException If inuav code is already used.
*/
protected static function areInuavCodesUniques(self $breeder): bool
{
$q = self::query();
// * Update condition
$q->where(function ($q) use ($breeder) {
foreach ($breeder->inuavs as $inuav) {
$q->orWhere('inuavs', '=', $inuav);
}
});
if ($breeder->cafel_code) {
$q->where('cafel_code', '!=', $breeder->cafel_code);
}
if ($q->count()) {
throw ValidationException::withMessages([
'inuavs' => 'Les codes INUAVS doinvent être uniques : ' . collect($breeder->inuavs)->implode(',')
]);
}
return true;
}
/**
* Check if ede code is unique
*
* @param self $breeder
* @return boolean
* @throws \Illuminate\Validation\ValidationException If ede code is already used.
*/
protected static function isEdeCodeUnique(self $breeder): bool
{
Validator::make([
'ede_code' => $breeder->ede_code
], ['ede_code' => [
Rule::unique($breeder->getTable(), 'ede_code')->ignore($breeder->id)
]])->validate();
return true;
}
}