@php $legacyCode = request()->input('legacy_code', $legacyCode ?? null); $existingMap = collect($vociFieldMapping ?? []) ->filter(fn ($row) => !empty($row['legacy'])) ->keyBy(fn ($row) => $row['legacy']); $humanize = static function (?string $value): string { if ($value === null) { return ''; } $value = str_replace(['.', '_'], ' ', $value); $value = preg_replace('/\s+/', ' ', $value ?? '') ?? ''; return ucfirst(trim($value)); }; $importConnection = config('database.connections.gescon_import') ? 'gescon_import' : config('database.default'); $probeTables = [ 'voci_spesa', 'voci', 'tab_voci', 'tab_spese', 'piano_spese', 'conti', ]; $stagingHeaders = []; if ($importConnection) { try { $schema = \Illuminate\Support\Facades\Schema::connection($importConnection); foreach ($probeTables as $table) { if (!$schema->hasTable($table)) { continue; } foreach ($schema->getColumnListing($table) as $column) { $column = trim($column); if ($column === '') { continue; } if (!in_array($column, $stagingHeaders, true)) { $stagingHeaders[] = $column; } } } } catch (\Throwable $th) { $stagingHeaders = []; } } $legacyFields = []; $legacyKeyIndex = []; $appendField = static function (array $field) use (&$legacyFields, &$legacyKeyIndex, $humanize): void { $key = (string) ($field['key'] ?? ''); if ($key === '' || isset($legacyKeyIndex[$key])) { return; } if (empty($field['label'])) { $field['label'] = $humanize($key); } $legacyFields[] = [ 'key' => $key, 'label' => $field['label'], 'group' => $field['group'] ?? null, 'description' => $field['description'] ?? null, 'default_target' => $field['default_target'] ?? null, ]; $legacyKeyIndex[$key] = true; }; $preferredFields = [ [ 'key' => 'cod_voce', 'label' => 'Codice voce', 'group' => 'Identificativi', 'description' => 'Codice progressivo della voce di spesa.', 'default_target' => 'cod_voce', ], [ 'key' => 'descrizione', 'label' => 'Descrizione voce', 'group' => 'Identificativi', 'description' => 'Descrizione testuale della voce.', 'default_target' => 'descrizione', ], [ 'key' => 'gruppo', 'label' => 'Gruppo', 'group' => 'Identificativi', 'description' => 'Gruppo o categoria di appartenenza.', 'default_target' => 'gruppo', ], [ 'key' => 'tipo', 'label' => 'Tipo voce', 'group' => 'Identificativi', 'description' => 'Tipologia della voce (ordinaria, straordinaria, ecc.).', 'default_target' => 'tipo', ], [ 'key' => 'tabella', 'label' => 'Tabella collegata', 'group' => 'Identificativi', 'description' => 'Tabella millesimale di riferimento, se presente.', 'default_target' => 'tabella', ], [ 'key' => 'conto_aggancio', 'label' => 'Conto di aggancio', 'group' => 'Contabilità', 'description' => 'Conto piano dei conti collegato alla voce.', 'default_target' => 'conto_aggancio', ], [ 'key' => 'sottoconto_aggancio', 'label' => 'Sottoconto di aggancio', 'group' => 'Contabilità', 'description' => 'Sottoconto legacy collegato alla voce.', 'default_target' => 'sottoconto_aggancio', ], [ 'key' => 'centro_costo', 'label' => 'Centro di costo', 'group' => 'Contabilità', 'description' => 'Centro di costo di riferimento.', 'default_target' => 'centro_costo', ], [ 'key' => 'natura2', 'label' => 'Natura 2', 'group' => 'Ripartizioni', 'description' => 'Natura secondaria legacy per riparti personalizzati.', 'default_target' => 'natura2', ], [ 'key' => 'raoa', 'label' => 'RAOA / Flag riparto', 'group' => 'Ripartizioni', 'description' => 'Indicazione legacy sulle modalità di riparto.', 'default_target' => 'raoa', ], [ 'key' => 'percentuale_proprietario', 'label' => '% Proprietario', 'group' => 'Ripartizioni', 'description' => 'Percentuale a carico del proprietario.', 'default_target' => 'percentuale_proprietario', ], [ 'key' => 'percentuale_inquilino', 'label' => '% Inquilino', 'group' => 'Ripartizioni', 'description' => 'Percentuale a carico dell’inquilino.', 'default_target' => 'percentuale_inquilino', ], [ 'key' => 'importo_proprietario', 'label' => 'Importo proprietario (€)', 'group' => 'Importi', 'description' => 'Quota importo imputata al proprietario.', 'default_target' => 'importo_proprietario', ], [ 'key' => 'importo_inquilino', 'label' => 'Importo inquilino (€)', 'group' => 'Importi', 'description' => 'Quota importo imputata all’inquilino.', 'default_target' => 'importo_inquilino', ], [ 'key' => 'note', 'label' => 'Note', 'group' => 'Metadati', 'description' => 'Annotazioni e commenti legacy.', 'default_target' => 'note', ], [ 'key' => 'legacy_codice', 'label' => 'Codice legacy', 'group' => 'Metadati', 'description' => 'Codice originale della voce legacy.', 'default_target' => 'legacy_codice', ], [ 'key' => 'legacy_tipo', 'label' => 'Tipo legacy', 'group' => 'Metadati', 'description' => 'Tipologia originale registrata nel gestionale legacy.', 'default_target' => 'legacy_tipo', ], [ 'key' => 'flag_attiva', 'label' => 'Flag attiva', 'group' => 'Metadati', 'description' => 'Indica se la voce risulta attiva o meno.', 'default_target' => 'flag_attiva', ], [ 'key' => 'ordinamento', 'label' => 'Ordinamento', 'group' => 'Metadati', 'description' => 'Ordine preferenziale della voce.', 'default_target' => 'ordinamento', ], ]; foreach ($preferredFields as $field) { $appendField($field); } foreach ($stagingHeaders as $column) { $appendField([ 'key' => $column, 'label' => $humanize($column), 'group' => 'Colonne legacy', 'description' => null, 'default_target' => $existingMap->get($column)['target'] ?? null, ]); } foreach ($existingMap as $legacyKey => $row) { $appendField([ 'key' => $legacyKey, 'label' => $humanize($legacyKey), 'group' => 'Mappature esistenti', 'description' => null, 'default_target' => $row['target'] ?? $row['target_field'] ?? null, ]); } $legacyFieldMeta = array_map(function ($field) { return [ 'key' => $field['key'], 'label' => $field['label'] ?? $field['key'], 'group' => $field['group'] ?? null, 'description' => $field['description'] ?? null, 'default_target' => $field['default_target'] ?? null, ]; }, $legacyFields); $preferredOrder = array_map(fn ($field) => $field['key'], $legacyFields); $existingMappingLookup = $existingMap->mapWithKeys(fn ($row, $key) => [ $key => $row['target'] ?? $row['target_field'] ?? null, ])->all(); $targetFields = [ 'cod_voce', 'descrizione', 'gruppo', 'tipo', 'note', 'tabella', 'conto_aggancio', 'sottoconto_aggancio', 'centro_costo', 'natura2', 'raoa', 'percentuale_proprietario', 'percentuale_inquilino', 'importo_proprietario', 'importo_inquilino', 'legacy_codice', 'legacy_tipo', 'flag_attiva', 'ordinamento', ]; @endphp

Mapping Campi Voci Spese (Legacy → Archivi)

Campi Legacy (voci)
Tabella: Righe trovate: 0
@php $currentGroup = null; @endphp @forelse($legacyFields as $field) @if(($field['group'] ?? null) && $field['group'] !== $currentGroup)
{{ $field['group'] }}
@php $currentGroup = $field['group']; @endphp @endif
{{ $field['label'] }}
{{ $field['key'] }}
@if(!empty($field['description']))
{{ $field['description'] }}
@endif
@if(!empty($field['default_target']))
Suggerito → {{ $field['default_target'] }}
@endif
@empty
Caricamento...
@endforelse
Anteprima dati legacy
In attesa selezione…
Carica un codice legacy per vedere i primi conti/voci disponibili.
Associazione a Campi Target
@forelse($legacyFields as $field) @php $legacyKey = $field['key']; $prefill = $existingMap->get($legacyKey)['target'] ?? ($field['default_target'] ?? null); @endphp
{{ $field['label'] }}
{{ $legacyKey }}
Anteprima →
@empty
In attesa colonne legacy...
@endforelse @foreach($targetFields as $tf) @endforeach
Suggerimento: lascia vuoto il campo target se non vuoi importare quel campo legacy.