netgescon-master/app/Http/Controllers/SuperAdmin/ComuniItalianiController.php
2025-07-20 14:57:25 +00:00

282 lines
9.1 KiB
PHP

<?php
namespace App\Http\Controllers\SuperAdmin;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
class ComuniItalianiController extends Controller
{
/**
* Mostra la dashboard gestione comuni italiani
*/
public function index()
{
$stats = [
'comuni_totali' => DB::table('comuni_italiani')->count(),
'regioni_totali' => DB::table('comuni_italiani')->distinct('regione')->count(),
'province_totali' => DB::table('comuni_italiani')->distinct('provincia')->count(),
'ultimo_aggiornamento' => DB::table('comuni_italiani')->max('updated_at')
];
return view('superadmin.comuni.index', compact('stats'));
}
/**
* Upload e importazione ZIP con dati comuni
*/
public function uploadZip(Request $request)
{
$request->validate([
'zip_file' => 'required|file|mimes:zip|max:50000', // Max 50MB
'overwrite' => 'nullable|boolean'
]);
try {
$zipFile = $request->file('zip_file');
$tempPath = storage_path('app/temp/comuni_import_' . time());
// Crea directory temporanea
if (!file_exists($tempPath)) {
mkdir($tempPath, 0755, true);
}
// Estrai il ZIP
$zip = new \ZipArchive;
if ($zip->open($zipFile->getPathname()) === TRUE) {
$zip->extractTo($tempPath);
$zip->close();
// Cerca file JSON nella directory estratta
$jsonFiles = glob($tempPath . '/*.json');
if (empty($jsonFiles)) {
throw new \Exception('Nessun file JSON trovato nel ZIP');
}
$importedCount = 0;
$skippedCount = 0;
foreach ($jsonFiles as $jsonFile) {
$result = $this->importJsonFile($jsonFile, $request->boolean('overwrite'));
$importedCount += $result['imported'];
$skippedCount += $result['skipped'];
}
// Pulizia file temporanei
$this->cleanupTempFiles($tempPath);
return response()->json([
'success' => true,
'message' => "Importazione completata: {$importedCount} comuni importati, {$skippedCount} saltati",
'imported' => $importedCount,
'skipped' => $skippedCount
]);
} else {
throw new \Exception('Impossibile aprire il file ZIP');
}
} catch (\Exception $e) {
Log::error('Errore import comuni ZIP: ' . $e->getMessage());
return response()->json([
'success' => false,
'message' => 'Errore durante l\'importazione: ' . $e->getMessage()
], 500);
}
}
/**
* Importa singolo file JSON
*/
private function importJsonFile($jsonFile, $overwrite = false)
{
$jsonData = json_decode(file_get_contents($jsonFile), true);
if (!$jsonData) {
throw new \Exception('File JSON non valido: ' . basename($jsonFile));
}
$imported = 0;
$skipped = 0;
foreach ($jsonData as $comune) {
// Validazione dati minimi
if (!isset($comune['codice_catastale']) || !isset($comune['denominazione'])) {
$skipped++;
continue;
}
$exists = DB::table('comuni_italiani')
->where('codice_catastale', $comune['codice_catastale'])
->exists();
if ($exists && !$overwrite) {
$skipped++;
continue;
}
// Prepara dati per inserimento/aggiornamento
$data = [
'codice_catastale' => $comune['codice_catastale'],
'denominazione' => $comune['denominazione'],
'regione' => $comune['regione'] ?? null,
'provincia' => $comune['provincia'] ?? null,
'cap' => $comune['cap'] ?? null,
'codice_istat' => $comune['codice_istat'] ?? null,
'prefisso' => $comune['prefisso'] ?? null,
'superficie_kmq' => $comune['superficie_kmq'] ?? null,
'popolazione' => $comune['popolazione'] ?? null,
'latitudine' => $comune['latitudine'] ?? null,
'longitudine' => $comune['longitudine'] ?? null,
'zona_altimetrica' => $comune['zona_altimetrica'] ?? null,
'updated_at' => now(),
];
if ($exists && $overwrite) {
DB::table('comuni_italiani')
->where('codice_catastale', $comune['codice_catastale'])
->update($data);
} else {
$data['created_at'] = now();
DB::table('comuni_italiani')->insert($data);
}
$imported++;
}
return ['imported' => $imported, 'skipped' => $skipped];
}
/**
* Ricerca comuni AJAX
*/
public function search(Request $request)
{
$query = $request->get('q', '');
$regione = $request->get('regione', '');
$provincia = $request->get('provincia', '');
$comuni = DB::table('comuni_italiani')
->when($query, function($q) use ($query) {
return $q->where('denominazione', 'LIKE', "%{$query}%")
->orWhere('codice_catastale', 'LIKE', "%{$query}%");
})
->when($regione, function($q) use ($regione) {
return $q->where('regione', $regione);
})
->when($provincia, function($q) use ($provincia) {
return $q->where('provincia', $provincia);
})
->orderBy('denominazione')
->limit(50)
->get();
return response()->json($comuni);
}
/**
* Statistiche dettagliate
*/
public function stats()
{
$stats = [
'per_regione' => DB::table('comuni_italiani')
->select('regione', DB::raw('count(*) as totale'))
->groupBy('regione')
->orderBy('totale', 'desc')
->get(),
'per_provincia' => DB::table('comuni_italiani')
->select('provincia', DB::raw('count(*) as totale'))
->groupBy('provincia')
->orderBy('totale', 'desc')
->limit(20)
->get(),
'totali' => [
'comuni' => DB::table('comuni_italiani')->count(),
'regioni' => DB::table('comuni_italiani')->distinct('regione')->count(),
'province' => DB::table('comuni_italiani')->distinct('provincia')->count(),
]
];
return response()->json($stats);
}
/**
* Elimina tutti i comuni (reset database)
*/
public function reset(Request $request)
{
if (!$request->has('confirm') || $request->get('confirm') !== 'RESET_COMUNI') {
return response()->json([
'success' => false,
'message' => 'Conferma richiesta mancante'
], 400);
}
try {
$deletedCount = DB::table('comuni_italiani')->count();
DB::table('comuni_italiani')->truncate();
Log::info("SuperAdmin reset comuni italiani: {$deletedCount} record eliminati");
return response()->json([
'success' => true,
'message' => "Database comuni resettato: {$deletedCount} record eliminati"
]);
} catch (\Exception $e) {
Log::error('Errore reset comuni: ' . $e->getMessage());
return response()->json([
'success' => false,
'message' => 'Errore durante il reset: ' . $e->getMessage()
], 500);
}
}
/**
* Pulisce i file temporanei
*/
private function cleanupTempFiles($tempPath)
{
if (is_dir($tempPath)) {
$files = array_diff(scandir($tempPath), ['.', '..']);
foreach ($files as $file) {
unlink($tempPath . '/' . $file);
}
rmdir($tempPath);
}
}
/**
* Export comuni in formato JSON
*/
public function export(Request $request)
{
$regione = $request->get('regione');
$provincia = $request->get('provincia');
$query = DB::table('comuni_italiani');
if ($regione) {
$query->where('regione', $regione);
}
if ($provincia) {
$query->where('provincia', $provincia);
}
$comuni = $query->orderBy('denominazione')->get();
$filename = 'comuni_italiani_' . date('Y-m-d_H-i-s') . '.json';
return response()->json($comuni)
->header('Content-Disposition', 'attachment; filename="' . $filename . '"');
}
}