feat(stabili-fornitori): import notes and bank accounts from Stabili.mdb, add Fornitori ASCII wireframe, and legacy authoritative sync directive (task-d095b0e23b)

This commit is contained in:
michele 2026-08-27 18:19:10 +02:00
parent 99766a36bd
commit fcd31d5bea
3 changed files with 229 additions and 3 deletions

View File

@ -0,0 +1,143 @@
<?php
namespace App\Console\Commands;
use App\Models\Stabile;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
class GesconImportStabiliBankNotesCommand extends Command
{
protected $signature = 'gescon:import-stabili-bank-notes {--mdb= : Percorso opzionale Stabili.mdb}';
protected $description = 'Importa ed allinea note, banche, IBAN e conti correnti postali da Stabili.mdb sugli stabili consolidati';
public function handle(): int
{
$this->info('Avvio importazione note e conti correnti da Stabili.mdb...');
$candidateMdbs = [
$this->option('mdb'),
'/mnt/gescon-archives/gescon/dbc/Stabili.mdb',
'/mnt/gescon-archives/gescon/DBC/Stabili.mdb',
'/mnt/gescon-archives/gescon_vuoto/DBC/Stabili.mdb',
];
$mdbPath = null;
foreach ($candidateMdbs as $p) {
if ($p && file_exists($p) && is_readable($p)) {
$mdbPath = $p;
break;
}
}
if (! $mdbPath) {
$this->error('File Stabili.mdb non trovato.');
return self::FAILURE;
}
$this->line("Utilizzo file MDB: {$mdbPath}");
$proc = new \Symfony\Component\Process\Process(['mdb-export', $mdbPath, 'Stabili']);
$proc->run();
if (! $proc->isSuccessful()) {
$this->error('Impossibile eseguire mdb-export.');
return self::FAILURE;
}
$csvContent = $proc->getOutput();
$stream = fopen('php://memory', 'r+');
fwrite($stream, $csvContent);
rewind($stream);
$header = fgetcsv($stream);
if (! $header) {
fclose($stream);
$this->error('Header CSV non valido.');
return self::FAILURE;
}
$updated = 0;
while (($data = fgetcsv($stream)) !== false) {
if (count($data) === count($header)) {
$row = array_combine($header, $data);
$codLegacy = sprintf('%04d', (int) ($row['cod_stabile'] ?? 0));
$den = trim((string) ($row['denominazione'] ?? ''));
$note1 = trim((string) ($row['note1'] ?? ''));
$note2 = trim((string) ($row['Note'] ?? ''));
$banca1 = trim((string) ($row['Banca'] ?? ''));
$ibanBanca1 = trim((string) ($row['IBAN_Banca'] ?? ''));
$ccBanca1 = trim((string) ($row['Banca_num_cc'] ?? ''));
$abi1 = trim((string) ($row['ABI'] ?? ''));
$cab1 = trim((string) ($row['CAB'] ?? ''));
$sia1 = trim((string) ($row['SIA'] ?? ''));
$cin1 = trim((string) ($row['CIN'] ?? ''));
$banca2 = trim((string) ($row['Banca2'] ?? ''));
$ibanBanca2 = trim((string) ($row['IBAN_Banca2'] ?? ''));
$ccBanca2 = trim((string) ($row['Banca2_num_cc'] ?? ''));
$numCcp1 = trim((string) ($row['num_ccp'] ?? ''));
$ibanPosta1 = trim((string) ($row['IBAN_Posta'] ?? ''));
$numCcp2 = trim((string) ($row['num_ccp_2'] ?? ''));
$ibanPosta2 = trim((string) ($row['IBAN_Posta_2'] ?? ''));
$stabile = Stabile::query()
->where('codice_stabile', $codLegacy)
->orWhere('cod_stabile', $codLegacy)
->orWhere('codice_stabile', ltrim($codLegacy, '0'))
->first();
if ($stabile) {
$noteFull = array_filter([$note1, $note2]);
$noteStr = implode("\n", $noteFull);
$bancherieAdv = [
'banca_1' => [
'banca' => $banca1,
'iban' => $ibanBanca1,
'conto_cc' => $ccBanca1,
'abi' => $abi1,
'cab' => $cab1,
'sia' => $sia1,
'cin' => $cin1,
],
'banca_2' => [
'banca' => $banca2,
'iban' => $ibanBanca2,
'conto_cc' => $ccBanca2,
],
'posta_1' => [
'num_ccp' => $numCcp1,
'iban' => $ibanPosta1,
],
'posta_2' => [
'num_ccp' => $numCcp2,
'iban' => $ibanPosta2,
],
];
$existingAdv = is_array($stabile->configurazione_avanzata) ? $stabile->configurazione_avanzata : [];
$mergedAdv = array_merge($existingAdv, ['conti_correnti' => $bancherieAdv]);
$stabile->update([
'note' => $noteStr ?: $stabile->note,
'banca_principale' => $banca1 ?: $stabile->banca_principale,
'iban_principale' => $ibanBanca1 ?: $stabile->iban_principale,
'banca_secondaria' => $banca2 ?: $stabile->banca_secondaria,
'iban_secondario' => ($ibanBanca2 ?: $ibanPosta1) ?: $stabile->iban_secondario,
'configurazione_avanzata'=> $mergedAdv,
]);
$updated++;
$this->line(" ✓ Stabile {$codLegacy} ({$den}): Note e Conti Correnti aggiornati.");
}
}
}
fclose($stream);
$this->info("Completata sincronizzazione conti correnti per {$updated} stabili!");
return self::SUCCESS;
}
}

View File

@ -86,8 +86,22 @@ ## 13. Strategia Display Desktop (High-Density) & Mobile (Adaptive Responsive Ca
- **Desktop (High-Density Grid)**: Layout multi-colonna ad elevata densità informativa per sfruttare la risoluzione monitor del PC ed analizzare griglie contabili, millesimi e badge recapiti.
- **Mobile (Responsive Adaptive Cards)**: Schede adattive collassabili per smartphone e tablet, ottimizzate con target touch per consultazione e gestione rapida in mobilità.
## 14. Coesistenza Temporanea in Contemporanea (Legacy MDB <-> NetGescon)
- **Modalità Parallela (Dual-Run)**: Durante la fase di migrazione e transizione, il sistema supporta il lavoro in contemporanea tra il vecchio software Legacy MDB ed il nuovo NetGescon (MySQL / PostgreSQL).
- **Importazione Differenziale Incrementale**: Le pipeline di sincronizzazione (`php artisan gescon:load-mdb-staging --incremental`) importano le novità e le modifiche apportate sul legacy senza mai distruggere o resettare i dati già consolidati in NetGescon (il reset richiede l'opzione esplicita `--reset-temp`).
## 14. Coesistenza Temporanea e Autorità della Sorgente Legacy MDB
- **Autorità della Sorgente**: Durante la fase di lavoro in contemporanea tra il vecchio gestionale MDB ed il nuovo NetGescon, **i dati del Legacy MDB sono la sorgente di verità primaria ed autoritativa**.
- **Flusso di Sincronizzazione Unidirezionale**: Eventuali aggiornamenti o modifiche effettuate sul Legacy MDB sovrascrivono e sincronizzano i dati verso NetGescon (Legacy MDB $\rightarrow$ NetGescon). NetGescon non sovrascrive mai al contrario i dati del MDB originale.
- **Importazione Differenziale Incrementale**: Il comando `php artisan gescon:load-mdb-staging --incremental` recepisce periodicamente le variazioni del legacy conservando la coerenza storica.
## 15. Importazione Note & Conti Correnti Bancari/Postali dallo Stabile (`Stabili.mdb`)
- **Comando di importazione**: `php artisan gescon:import-stabili-bank-notes`
- Estrae da `Stabili.mdb` (tabella `Stabili`):
- **Note Stabile**: `note1` + `Note` (salvate nel campo `note`).
- **Coordinate Bancarie 1**: `Banca`, `IBAN_Banca`, `Banca_num_cc`, `ABI`, `CAB`, `SIA`, `CIN`.
- **Coordinate Bancarie 2 & Postali**: `Banca2`, `IBAN_Banca2`, `num_ccp` (CCP), `IBAN_Posta`, `num_ccp_2`, `IBAN_Posta_2`.
- I dati sono strutturati ed archiviati in `stabili.configurazione_avanzata['conti_correnti']` e nei campi diretti `iban_principale`, `banca_principale`, `iban_secondario`, `banca_secondaria`.
## 16. Sistema Grafico Unificato per l'Anagrafica Fornitori (`/admin-filament/gescon/anagrafica/fornitori`)
- **Design System Coerente**: La vista Fornitori condivide ed applica il design grafico unificato delle tabelle e schede anagrafiche del sistema (`FornitoriArchivio.php`).
- **Wireframe ASCII di Riferimento**: `skill-netgescon/ui-wireframes/fornitori-anagrafica.md`.
- **Filtri Tag & P.IVA**: Supporta la ricerca rapida per Ragione Sociale, Partita IVA, Codice Fiscale, recapiti e tag di categoria (es. *Idraulici, Elettricisti, Pulizie, Ascensori*).

View File

@ -0,0 +1,69 @@
# ASCII Wireframe - Gestione Fornitori & Anagrafica Accreditate (/admin-filament/gescon/anagrafica/fornitori)
## 1. VISUALIZZAZIONE DESKTOP (High-Density Multi-Column Grid)
```text
+-------------------------------------------------------------------------------------------------------------------+
| NETGESCON - ANAGRAFICA UNIFICATA STABILI & FORNITORI [SuperAdmin: Michele] |
+-------------------------------------------------------------------------------------------------------------------+
| PATH: Home > NetGescon > Anagrafica > Fornitori & Imprese Accreditate |
+-------------------------------------------------------------------------------------------------------------------+
| |
| [ + NUOVO FORNITORE ] [ 🔄 IMPORTA DA LEGACY MDB ] [ 🔍 Cerca per Ragione Sociale, P.IVA, CF, Tag... ] |
| |
| FILTRI TAG CATEGORIA: [ Tutti ▾ ] [ Idraulici ] [ Elettricisti ] [ Pulizie ] [ Ascensori ] [ Amministrativi ] |
| |
| +----+----------------------------+-----------------+-----------------------+-------------------+-----------------+
| | ID | RAGIONE SOCIALE / IMPRESA | P.IVA / C.F. | RECAPITI MULTICANALE | CATEGORIE / TAGS | AZIONI |
| +----+----------------------------+-----------------+-----------------------+-------------------+-----------------+
| | 10 | TECNOREPAIR S.R.L. | 01234567890 | ✉ info@tecnorepair.it | [Idraulico] | [Modifica Scheda|
| | | | | 📱 335-9988776 | [Elettricista] | [Assegna Ticket |
| | 11 | CLEAN & SHINE PULIZIE | 09876543210 | ✉ ordini@cleanshine.it| [Pulizie Parti C.]| [Modifica Scheda|
| | 12 | ASCENSORI ROMA NORD S.A.S. | RMCNSC65L11H501K| ☎ 06-44332211 | [Manut. Ascensore]| [Modifica Scheda|
| | 13 | EDILIZIA SUBALPINA S.R.L. | 05544332211 | ✉ cantiere@subalpina.it| [Edile] [Tetti] | [Modifica Scheda|
| +----+----------------------------+-----------------+-----------------------+-------------------+-----------------+
| Mostrati 4 di 4 fornitori accreditati per gli stabili dell'amministratore |
+-------------------------------------------------------------------------------------------------------------------+
| DETTAGLIO ED EDITING SCHEDA FORNITORE (#10 TECNOREPAIR S.R.L.) |
| |
| [ Ragione Sociale: TECNOREPAIR S.R.L. ] |
| [ Partita IVA: 01234567890 ] [ Codice Fiscale: 01234567890 ] |
| [ Indirizzo: Via Ottaviano 45 ] [ Città: ROMA ] [ CAP: 00192 ] |
| [ Email Ordini: info@tecnorepair.it ] [ PEC: tecnorepair@pec.it ] |
| [ Telefono Studio: 06 99887766 ] [ Cellulare Urgenze: 335 9988776 ] |
| |
| CONTI CORRENTI & COORDINATE BANCARIE PER BONIFICI: |
| • Banca: Banca Nazionale del Lavoro - Filiale Roma Prati |
| • IBAN: IT60X0100503301000000123456 (Cin: X, ABI: 01005, CAB: 03301) |
| |
| CATEGORIE E TAGS OPERATIVI: [Idraulico] [Elettricista] [Pronto Intervento H24] |
| |
| [ SALVA SCHEDA FORNITORE ] [ ANNULLA ] [ ASSEGNA NUOVO TICKET INTERVENTO ] |
+-------------------------------------------------------------------------------------------------------------------+
```
## 2. VISUALIZZAZIONE RESPONSIVE MOBILE (Adaptive Collapsible Card View)
```text
+--------------------------------------------------+
| 📱 NETGESCON FORNITORI [SuperAdmin: M] |
+--------------------------------------------------+
| ANAGRAFICA FORNITORI ACCREDITATI |
| [ + NUOVO FORNITORE ] [ 🔍 Cerca... ] |
+--------------------------------------------------+
| 🛠️ TECNOREPAIR S.R.L. (ID #10) |
| • P.IVA: 01234567890 | Tags: [Idraulico] [Elect] |
| ✉ info@tecnorepair.it | 📱 335-9988776 |
| 🏦 IBAN: IT60X0100503301000000123456 |
| ──────────────────────────────────────────────── |
| AZIONI APPARATO MOBILE: |
| [ ✏️ Modifica Scheda ] |
| [ 🛠️ Assegna Ticket Intervento ] |
| [ 📱 Chiama subito ] [ 📧 Invia Ordine ] |
+--------------------------------------------------+
| 🧹 CLEAN & SHINE PULIZIE (ID #11) |
| • P.IVA: 09876543210 | Tags: [Pulizie] |
| ✉ ordini@cleanshine.it |
| [ ✏️ Modifica Scheda ] |
+--------------------------------------------------+
```