feat: add previous configuration handling for user selections in quotes
- Implemented session storage management for the last configuration choices made by the user. - Added functionality to prompt users when changing models to retain their previous selections. - Introduced methods to apply previous choices to the newly loaded model, including finishes, handles, glass types, and options. - Enhanced user experience by ensuring selections are automatically applied where applicable.
This commit is contained in:
@@ -6,6 +6,7 @@ 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\DB;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
|
||||
class Modello extends Model
|
||||
@@ -21,23 +22,23 @@ class Modello extends Model
|
||||
'accessori' => 'Accessori',
|
||||
];
|
||||
|
||||
// Moduli dati caricati dal configuratore per il modello.
|
||||
// Moduli base del configuratore (sezioni del menu e voci di prezzo); quelli dei gruppi
|
||||
// di opzioni si aggiungono da GruppoOpzioni (vedi moduliDisponibili).
|
||||
public const MODULI = [
|
||||
'listino' => 'Listino',
|
||||
'modello' => 'Finiture',
|
||||
'finitura_esterna' => 'Finitura esterna (bicolore)',
|
||||
'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',
|
||||
'sistema_id', 'codice', 'nome', 'descrizione', 'titolo', 'icona', 'ordine', 'attivo',
|
||||
'cartella', 'file_modello', 'categoria', 'cartella_texture', 'moduli',
|
||||
'listino_aggiornato_at',
|
||||
'regola_vetro_id', 'listino_aggiornato_at',
|
||||
];
|
||||
|
||||
protected $casts = [
|
||||
@@ -57,18 +58,86 @@ class Modello extends Model
|
||||
return $this->hasMany(ListinoPrezzo::class);
|
||||
}
|
||||
|
||||
public function regolaVetro(): BelongsTo
|
||||
{
|
||||
return $this->belongsTo(RegolaVetro::class);
|
||||
}
|
||||
|
||||
/** Opzioni personalizzate del modello (sostituiscono i gruppi del sistema). */
|
||||
public function opzioni(): HasMany
|
||||
{
|
||||
return $this->hasMany(Opzione::class);
|
||||
}
|
||||
|
||||
/** Tutte le finiture del profilo del sistema (per scegliere quali usare nel modello). */
|
||||
public function finitureDelSistema(): HasMany
|
||||
{
|
||||
return $this->hasMany(Finitura::class, 'sistema_id', 'sistema_id')->where('tipo', 'profilo');
|
||||
}
|
||||
|
||||
/** Moduli selezionabili: quelli base più uno per ogni gruppo di opzioni con un controllo. */
|
||||
public static function moduliDisponibili(): array
|
||||
{
|
||||
$gruppi = GruppoOpzioni::query()
|
||||
->where('ui', '!=', 'nessuna')
|
||||
->orderBy('ordine')
|
||||
->pluck('etichetta', 'modulo')
|
||||
->all();
|
||||
|
||||
return self::MODULI + $gruppi;
|
||||
}
|
||||
|
||||
public function haModulo(string $modulo): bool
|
||||
{
|
||||
return in_array($modulo, $this->moduli ?? [], true);
|
||||
}
|
||||
|
||||
public function scopeAttivi(Builder $query): Builder
|
||||
{
|
||||
return $query->where('attivo', true)->orderBy('ordine')->orderBy('id');
|
||||
}
|
||||
|
||||
/** Modelli mostrati nel configuratore: attivi e con un listino (senza prezzi non si possono vendere). */
|
||||
public function scopeNelConfiguratore(Builder $query): Builder
|
||||
{
|
||||
return $query->attivi()->whereHas('listino');
|
||||
}
|
||||
|
||||
public function getIconaUrlAttribute(): ?string
|
||||
{
|
||||
return $this->icona ? Storage::disk('public')->url($this->icona) : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Rinumera l'ordine dei modelli del sistema mettendo i disattivi in fondo,
|
||||
* senza cambiare l'ordine relativo all'interno dei due gruppi.
|
||||
*/
|
||||
public static function normalizzaOrdine(int $sistemaId): void
|
||||
{
|
||||
$ids = static::query()
|
||||
->where('sistema_id', $sistemaId)
|
||||
->orderByDesc('attivo')
|
||||
->orderBy('ordine')
|
||||
->orderBy('id')
|
||||
->pluck('id');
|
||||
|
||||
DB::transaction(function () use ($ids) {
|
||||
foreach ($ids as $i => $id) {
|
||||
// Query diretta: niente eventi del modello (e niente ricorsione).
|
||||
static::query()->whereKey($id)->update(['ordine' => $i + 1]);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
protected static function booted(): void
|
||||
{
|
||||
// Attivando o disattivando un modello (o creandone uno), i disattivi tornano in fondo.
|
||||
static::saved(function (Modello $modello): void {
|
||||
if ($modello->wasRecentlyCreated || $modello->wasChanged(['attivo', 'sistema_id'])) {
|
||||
static::normalizzaOrdine($modello->sistema_id);
|
||||
}
|
||||
});
|
||||
|
||||
// Rimuove il file dell'icona sostituita o del modello eliminato.
|
||||
static::updated(function (Modello $modello): void {
|
||||
$vecchia = $modello->getOriginal('icona');
|
||||
|
||||
Reference in New Issue
Block a user