- Added ListinoRelationManager for managing price lists associated with models. - Introduced ImportaListiniAction for importing price lists from Excel files. - Created ListinoPrezzo model to represent price entries in the database. - Developed ListinoExcelParser for parsing Excel files containing price lists. - Implemented ListinoImporter to handle the import logic and associations. - Added migration for creating listino_prezzi table and converting measures to mm. - Updated frontend logic to handle new price list features and validations. - Enhanced tests for price list import and conversion functionalities.
87 lines
2.5 KiB
PHP
87 lines
2.5 KiB
PHP
<?php
|
|
|
|
namespace App\Models;
|
|
|
|
use Illuminate\Database\Eloquent\Builder;
|
|
use Illuminate\Database\Eloquent\Model;
|
|
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
|
use Illuminate\Database\Eloquent\Relations\HasMany;
|
|
use Illuminate\Support\Facades\Storage;
|
|
|
|
class Modello extends Model
|
|
{
|
|
protected $table = 'modelli';
|
|
|
|
// Categorie usate dal configuratore (es. per scegliere altezza_maniglia_<categoria>.json).
|
|
public const CATEGORIE = [
|
|
'finestre' => 'Finestre',
|
|
'porte' => 'Porte',
|
|
'scorrevoli' => 'Scorrevoli',
|
|
'scuretti' => 'Scuretti',
|
|
'accessori' => 'Accessori',
|
|
];
|
|
|
|
// Moduli dati caricati dal configuratore per il modello.
|
|
public const MODULI = [
|
|
'listino' => 'Listino',
|
|
'modello' => 'Finiture',
|
|
'maniglia' => 'Maniglia',
|
|
'altezza_maniglia' => 'Altezza maniglia',
|
|
'vetro' => 'Vetro',
|
|
'cerniere' => 'Cerniere',
|
|
'telaio' => 'Telaio',
|
|
'avvolgibile' => 'Avvolgibile',
|
|
'select_finiture' => 'Select finiture',
|
|
];
|
|
|
|
protected $fillable = [
|
|
'sistema_id', 'codice', 'nome', 'descrizione', 'icona', 'ordine', 'attivo',
|
|
'cartella', 'file_modello', 'categoria', 'cartella_texture', 'moduli',
|
|
'listino_aggiornato_at',
|
|
];
|
|
|
|
protected $casts = [
|
|
'ordine' => 'integer',
|
|
'attivo' => 'boolean',
|
|
'moduli' => 'array',
|
|
'listino_aggiornato_at' => 'datetime',
|
|
];
|
|
|
|
public function sistema(): BelongsTo
|
|
{
|
|
return $this->belongsTo(Sistema::class);
|
|
}
|
|
|
|
public function listino(): HasMany
|
|
{
|
|
return $this->hasMany(ListinoPrezzo::class);
|
|
}
|
|
|
|
public function scopeAttivi(Builder $query): Builder
|
|
{
|
|
return $query->where('attivo', true)->orderBy('ordine')->orderBy('id');
|
|
}
|
|
|
|
public function getIconaUrlAttribute(): ?string
|
|
{
|
|
return $this->icona ? Storage::disk('public')->url($this->icona) : null;
|
|
}
|
|
|
|
protected static function booted(): void
|
|
{
|
|
// Rimuove il file dell'icona sostituita o del modello eliminato.
|
|
static::updated(function (Modello $modello): void {
|
|
$vecchia = $modello->getOriginal('icona');
|
|
if ($modello->wasChanged('icona') && $vecchia) {
|
|
Storage::disk('public')->delete($vecchia);
|
|
}
|
|
});
|
|
|
|
static::deleted(function (Modello $modello): void {
|
|
if ($modello->icona) {
|
|
Storage::disk('public')->delete($modello->icona);
|
|
}
|
|
});
|
|
}
|
|
}
|