Files
carmine.savino 0f0764367f feat: remove obsolete glass configurations, add title import functionality
- Deleted the `vetro.json` file containing glass configurations.
- Introduced `ImportaTitoliAction` to facilitate importing model titles from Excel.
- Created `TitoliModelliImporter` for handling title import logic and updating existing models.
- Updated `SistemaResource` to include the new title import action.
- Modified `ConfigurazioneModello` to adjust the model name retrieval logic.
- Changed `ListinoImporter` to make the alias constant public.
- Added tests for title import functionality, ensuring correct updates and creation of new models.
2026-10-23 11:15:28 +02:00

98 lines
3.4 KiB
PHP

<?php
namespace App\Support\Listini;
use App\Models\Modello;
use App\Models\Sistema;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
use PhpOffice\PhpSpreadsheet\IOFactory;
/**
* Importa i titoli dei modelli da Excel (es. reference/OrdineSerramenti_Descrizioni_NuoveOpzioni.xlsx):
* un foglio con intestazione ORDINE (codice del modello) e TITOLO. Se il codice esiste nel sistema
* si aggiorna solo il titolo; altrimenti si crea un modello disattivo con codice e titolo.
*/
class TitoliModelliImporter
{
/**
* Coppie codice → titolo dal primo foglio che ha le colonne ORDINE (o CODICE) e TITOLO.
*
* @return array<string, string>
*/
public static function leggi(string $path): array
{
foreach (IOFactory::load($path)->getAllSheets() as $foglio) {
$righe = $foglio->toArray(null, true, false, false);
foreach ($righe as $r => $riga) {
$intestazioni = array_map(fn ($v) => Str::upper(trim((string) $v)), $riga);
$colCodice = array_search('ORDINE', $intestazioni, true);
if ($colCodice === false) {
$colCodice = array_search('CODICE', $intestazioni, true);
}
$colTitolo = array_search('TITOLO', $intestazioni, true);
if ($colCodice === false || $colTitolo === false) {
continue;
}
$titoli = [];
foreach (array_slice($righe, $r + 1) as $dati) {
$codice = trim((string) ($dati[$colCodice] ?? ''));
$titolo = trim((string) ($dati[$colTitolo] ?? ''));
if ($codice !== '' && $titolo !== '') {
$titoli[$codice] = $titolo;
}
}
return $titoli;
}
}
return [];
}
/**
* @param array<string, string> $titoli codice → titolo
* @return array{aggiornati: list<string>, creati: list<string>, invariati: int}
*/
public static function importa(Sistema $sistema, array $titoli): array
{
$esito = ['aggiornati' => [], 'creati' => [], 'invariati' => 0];
DB::transaction(function () use ($sistema, $titoli, &$esito) {
$modelli = $sistema->modelli()->get()->keyBy('codice');
foreach ($titoli as $codice => $titolo) {
$codice = ListinoImporter::ALIAS[$codice] ?? $codice;
$modello = $modelli->get($codice);
if ($modello) {
if ($modello->titolo === $titolo) {
$esito['invariati']++;
continue;
}
$modello->update(['titolo' => $titolo]);
$esito['aggiornati'][] = $codice;
continue;
}
// Nuovo modello: solo codice e titolo, disattivo finché non viene configurato.
$modelli->put($codice, Modello::create([
'sistema_id' => $sistema->id,
'codice' => $codice,
'nome' => $titolo,
'titolo' => $titolo,
'attivo' => false,
'ordine' => $modelli->max('ordine') + 1,
]));
$esito['creati'][] = $codice;
}
});
return $esito;
}
}