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:
@@ -0,0 +1,99 @@
|
||||
<?php
|
||||
|
||||
namespace Database\Seeders;
|
||||
|
||||
use App\Models\Modello;
|
||||
use App\Models\Opzione;
|
||||
use App\Models\Sistema;
|
||||
use Illuminate\Database\Seeder;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
|
||||
/**
|
||||
* Profili extra PVC: codici e descrizioni dal foglio "Profili Extra" di
|
||||
* reference/OrdineSerramenti_Descrizioni_NuoveOpzioni.xlsx, prezzi da
|
||||
* reference/Regole_Profili Extra.xls, icone da reference/icone_profili_extra.
|
||||
*
|
||||
* Gira una volta sola: se il sistema ha già profili extra con un prezzo non tocca nulla.
|
||||
* Sostituisce le righe segnaposto (senza prezzo) create dalla prima versione del catalogo.
|
||||
*/
|
||||
class ProfiliExtraSeeder extends Seeder
|
||||
{
|
||||
private const ICONE = __DIR__.'/data/configuratore/pvc/opzioni/profili_extra';
|
||||
|
||||
/** Modelli senza profili extra (foglio "Nomi"; regole: "tutti tranne scuretto, cassonetto, cielino"). */
|
||||
private const ESCLUSI = ['scuretto_base', 'scuretto_pannello_alessandrite', 'scuretto_pannello_malachite', 'cassonetto_80', 'cassonetto_139', 'cassonetto_150'];
|
||||
|
||||
/** Il cielino ha solo il frontale 4062000 (regole: "solo cielino"). */
|
||||
private const CIELINO = 'celino';
|
||||
|
||||
public function run(): void
|
||||
{
|
||||
$pvc = Sistema::where('codice', 'pvc')->first();
|
||||
$esistenti = Opzione::where('gruppo', 'profili_extra')->where('sistema_id', $pvc?->id);
|
||||
if (! $pvc || (clone $esistenti)->whereNotNull('supplemento_tipo')->exists()) {
|
||||
return;
|
||||
}
|
||||
|
||||
DB::transaction(function () use ($pvc, $esistenti) {
|
||||
// Segnaposto senza prezzo: eliminati uno per uno per rimuovere anche le icone.
|
||||
$esistenti->get()->each->delete();
|
||||
|
||||
foreach (self::profili() as $i => $profilo) {
|
||||
if ($profilo['valore'] === '406200') {
|
||||
continue;
|
||||
}
|
||||
$this->crea($pvc, null, $profilo, $i + 1);
|
||||
}
|
||||
|
||||
foreach ($pvc->modelli()->get() as $modello) {
|
||||
if (in_array($modello->codice, self::ESCLUSI, true)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$modello->update(['moduli' => array_values(array_unique([...($modello->moduli ?? []), 'profili_extra']))]);
|
||||
|
||||
if ($modello->codice === self::CIELINO) {
|
||||
$this->crea($pvc, $modello, collect(self::profili())->firstWhere('valore', '406200'), 1);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* ml = (L x ml_per_larghezza + H x ml_per_altezza + ml_aggiunta_mm) / 1000.
|
||||
* Guide: "H+100mm x 2" -> 2H + 200. Frontale: "solo larghezza (1 pz)" -> L.
|
||||
* Allargamenti NP: "ML" senza misura di riferimento -> perimetro 2L + 2H (da confermare).
|
||||
*/
|
||||
public static function profili(): array
|
||||
{
|
||||
$ml = fn (float $l, float $h, float $mm) => ['ml_per_larghezza' => $l, 'ml_per_altezza' => $h, 'ml_aggiunta_mm' => $mm];
|
||||
|
||||
return [
|
||||
['valore' => 'coprifili_piatti', 'etichetta' => 'COPRIFILI PIATTI', 'supplemento_tipo' => 'percentuale', 'supplemento' => 1, 'alternativa' => 'coprifili'],
|
||||
['valore' => 'coprifili_scatolati', 'etichetta' => 'COPRIFILI SCATOLATI', 'supplemento_tipo' => 'percentuale', 'supplemento' => 3, 'alternativa' => 'coprifili'],
|
||||
['valore' => '50811', 'etichetta' => '50811_GUIDA 34', 'supplemento_tipo' => 'metro_lineare', 'supplemento' => 15, 'alternativa' => 'guida'] + $ml(0, 2, 200),
|
||||
['valore' => '50811_50801', 'etichetta' => '50811+50801_GUIDA 87', 'supplemento_tipo' => 'metro_lineare', 'supplemento' => 15, 'alternativa' => 'guida'] + $ml(0, 2, 200),
|
||||
['valore' => '9320', 'etichetta' => 'HO9320_T/M', 'supplemento_tipo' => 'fisso', 'supplemento' => 85],
|
||||
['valore' => 'NP8300', 'etichetta' => 'NP8300_ALL.30', 'supplemento_tipo' => 'metro_lineare', 'supplemento' => 25, 'alternativa' => 'allargamento'] + $ml(2, 2, 0),
|
||||
['valore' => 'NP8500', 'etichetta' => 'NP8500_ALL.50', 'supplemento_tipo' => 'metro_lineare', 'supplemento' => 33, 'alternativa' => 'allargamento'] + $ml(2, 2, 0),
|
||||
['valore' => 'NP8700', 'etichetta' => 'NP8700_ALL.150', 'supplemento_tipo' => 'metro_lineare', 'supplemento' => 45, 'alternativa' => 'allargamento'] + $ml(2, 2, 0),
|
||||
['valore' => '406200', 'etichetta' => '4062000_FRONTALE', 'supplemento_tipo' => 'metro_lineare', 'supplemento' => 145] + $ml(1, 0, 0),
|
||||
];
|
||||
}
|
||||
|
||||
private function crea(Sistema $sistema, ?Modello $modello, array $profilo, int $ordine): void
|
||||
{
|
||||
$file = "{$profilo['valore']}.jpg";
|
||||
$icona = 'configuratore/pvc/opzioni/'.($modello ? $modello->codice : 'sistema').'/profili_extra/'.$file;
|
||||
Storage::disk('public')->put($icona, file_get_contents(self::ICONE."/{$file}"));
|
||||
|
||||
Opzione::create($profilo + [
|
||||
'sistema_id' => $sistema->id,
|
||||
'modello_id' => $modello?->id,
|
||||
'gruppo' => 'profili_extra',
|
||||
'icona' => $icona,
|
||||
'ordine' => $ordine,
|
||||
]);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user