ldc-bogt/app/Models/TraceaPoultry.php
2022-11-23 16:12:07 +01:00

223 lines
7.1 KiB
PHP

<?php
namespace App\Models;
use App\Enums\FoodType;
use App\Enums\PoultryLabelType;
use App\Traits\HasCompositePrimaryKey;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Str;
use Illuminate\Validation\ValidationException;
class TraceaPoultry extends Model
{
use HasCompositePrimaryKey;
/**
* The primary key for the model.
*
* @var string
*/
protected $primaryKey = [
'item_code', 'order_num',
'external_code_lot'
];
/**
* 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 are mass assignable.
*
* @var array
*/
protected $fillable = [
'item_code',
'article',
'external_code_lot',
'breeder_code',
'order_num',
'opa_lot',
'barcode_price',
'barcode_weight',
'abattoir_lot',
'customer_order',
'sign',
'brand',
'family',
'exp_date',
'prep_date'
];
/**
* The attributes that should be cast.
*
* @var array
*/
protected $casts = [
'exp_date' => 'date',
'prep_date' => 'date'
];
/**
* Perform any actions required after the model boots.
*
* @return void
*/
protected static function booted()
{
// * EVENT CLOSURES.
static::creating(function (self $model) {
self::hasAtLeastOneBarCode($model);
});
static::updating(function (self $model) {
self::hasAtLeastOneBarCode($model);
});
}
// * METHODS
/**
* Getter Label
*
* @return \App\Enums\PoultryLabelType
*/
public function getLabelAttribute(): PoultryLabelType
{
$family = Str::upper($this->getAttributeFromArray('family'));
switch (true) {
case \strpos($family, 'LOUE') !== false:
return PoultryLabelType::labelRouge();
case \strpos($family, 'BIO') !== false:
return PoultryLabelType::bio();
default:
return PoultryLabelType::unkown();
}
}
/**
* Get associatedBreeder
*
* @return \App\Models\CafelPoultryBreeder|null
*/
public function getBreederAttribute(): ?CafelPoultryBreeder
{
$matches = [];
preg_match('/(?P<inuav>V\d{3}[A-Z]{3})/', \strval($this->breeder_code), $matches);
if (!\array_key_exists('inuav', $matches)) {
return collect();
}
return Cache::remember("traceaPoultryBreeder$this->id", 5, function () use ($matches) {
return CafelPoultryBreeder::where(
'inuavs',
'LIKE',
'%' . \filter_var($matches['inuav'], \FILTER_SANITIZE_STRING) . '%'
)->first();
});
}
/**
* * Get Bea
*
* L'explication du batch code est un non sens.... putin de merde
*
* Comment faisons-nous pour lier notre lot à une note BEA ?
* (code lot sous ce format : XXXXX/0 pour les données BEA) -> Code lot CAFEL / Code OPA
* Comment faisons-nous pour lier notre lot à son alimentation ?
* (code lot sous ce format : XXXXX/0 pour les données alimentation) -> Code lot CAFEL / Code OPA
* Pour ces questions, peux-tu nous dire avec les informations que nous recevons du flux Sablé
* les règles que nous devons utiliser stp ? * -> @Mathilde Hervier peux-tu répondre à cette question ?
* Le 6e champ reçu dans le fichier xml est le code lot OPA qui sert donc à faire le lien avec la CAFEL
*
* @return \App\Models\CafelBeaPoultry|null
*/
public function getBeaAttribute(): ?CafelBeaPoultry
{
// * On utilise code lot_opa vue que son explication de merde est inversée ... Uu
return CafelBeaPoultry::whereCodeLotCafel(\intval($this->opa_lot));
}
/**
* * Get Food
*
*
* L'explication du batch code est un non sens.... putin de merde
*
* Comment faisons-nous pour lier notre lot à une note BEA ?
* (code lot sous ce format : XXXXX/0 pour les données BEA) -> Code lot CAFEL / Code OPA
* Comment faisons-nous pour lier notre lot à son alimentation ?
* (code lot sous ce format : XXXXX/0 pour les données alimentation) -> Code lot CAFEL / Code OPA
* Pour ces questions, peux-tu nous dire avec les informations que nous recevons du flux Sablé
* les règles que nous devons utiliser stp ? * -> @Mathilde Hervier peux-tu répondre à cette question ?
* Le 6e champ reçu dans le fichier xml est le code lot OPA qui sert donc à faire le lien avec la CAFEL
*
* @return \App\Models\CafelFood|null
*/
public function getFoodAttribute(): ?CafelFood
{
// * On utilise code lot_opa vue que son explication de merde est inversée ... Uu
return CafelFood::whereCodeLotCafel(FoodType::chicken(), \intval($this->opa_lot));
}
/**
* * Get Bea
*
* L'explication du batch code est un non sens.... putin de merde
*
* Comment faisons-nous pour lier notre lot à une note BEA ?
* (code lot sous ce format : XXXXX/0 pour les données BEA) -> Code lot CAFEL / Code OPA
* Comment faisons-nous pour lier notre lot à son alimentation ?
* (code lot sous ce format : XXXXX/0 pour les données alimentation) -> Code lot CAFEL / Code OPA
* Pour ces questions, peux-tu nous dire avec les informations que nous recevons du flux Sablé
* les règles que nous devons utiliser stp ? * -> @Mathilde Hervier peux-tu répondre à cette question ?
* Le 6e champ reçu dans le fichier xml est le code lot OPA qui sert donc à faire le lien avec la CAFEL
*
* @return \App\Models\CafelPoultryMiseEnPlace|null
*/
public function getMepAttribute(): ?CafelPoultryMiseEnPlace
{
// * On utilise code lot_opa vue que son explication de merde est inversée ... Uu
return CafelPoultryMiseEnPlace::whereCodeLotCafel(\intval($this->opa_lot));
}
/**
* Assert has at least one barcode
*
* @param self $tracea
* @return boolean
* @throws \Illuminate\Validation\ValidationException If inuav code is already used.
*/
protected static function hasAtLeastOneBarCode(self $tracea): bool
{
if (empty($tracea->barcode_price) and empty($tracea->barcode_weight)) {
throw ValidationException::withMessages([
'barcode_price' => "Il faut au moins un code barre pour faire la recherche '{$tracea->barcode_price}'",
'barcode_weight' => "Il faut au moins un code barre pour faire la recherche '{$tracea->barcode_weight}'"
]);
}
return true;
}
/**
* Get Packshot
*
* @return \App\Models\PoultryPackshot|null
*/
public function getPackshotAttribute(): ?PoultryPackshot
{
return PoultryPackshot::whereItemCode($this->item_code)->first();
}
}