amministratore_id ?? 0); $toId = (int) $destination->id; if ($fromId === $toId) { throw new \InvalidArgumentException('Lo stabile e` gia` assegnato a questo amministratore.'); } return DB::transaction(function () use ($stabile, $destination, $actor, $alsoRubrica, $reason, $source, $ipAddress, $meta, $fromId, $toId): StabileAmministratoreTransfer { $stabile->amministratore_id = $toId; $stabile->save(); if ($alsoRubrica && (int) ($stabile->rubrica_id ?? 0) > 0) { if (Schema::hasTable('rubrica_universale') && Schema::hasColumn('rubrica_universale', 'amministratore_id')) { DB::table('rubrica_universale') ->where('id', (int) $stabile->rubrica_id) ->update(['amministratore_id' => $toId, 'updated_at' => now()]); } } // Trasferisci fornitori associati a questo stabile if (Schema::hasTable('fornitori') && Schema::hasColumn('fornitori', 'amministratore_id')) { DB::table('fornitori') ->where('stabile_id', (int) $stabile->id) ->update(['amministratore_id' => $toId, 'updated_at' => now()]); } if (method_exists($destination, 'provisionArchiveIfMissing')) { $destination->provisionArchiveIfMissing(); } // Spostamento fisico della cartella archivio dello stabile (usa codice_univoco per evitare collisioni) try { $pathService = app(\App\Services\TenantArchivePathService::class); $fromAmm = $fromId > 0 ? Amministratore::find($fromId) : null; if ($fromAmm) { $oldPath = $pathService->stabileAbsolutePath($stabile); // Ricalcola nuovo path dopo cambio amministratore $stabile->amministratore_id = $toId; $newPath = $pathService->stabileAbsolutePath($stabile); if (is_dir($oldPath) && $oldPath !== $newPath) { @mkdir(dirname($newPath), 0777, true); @rename($oldPath, $newPath); } } } catch (\Throwable $e) { // Non-blocking fallback } return StabileAmministratoreTransfer::query()->create([ 'stabile_id' => (int) $stabile->id, 'from_amministratore_id' => $fromId > 0 ? $fromId : null, 'to_amministratore_id' => $toId, 'changed_by_user_id' => $actor?->id, 'changed_by_name' => $actor?->name ?: 'Sistema', 'source' => $source, 'reason' => $reason !== null ? trim($reason) : null, 'also_rubrica' => $alsoRubrica, 'ip_address' => $ipAddress, 'meta' => $meta, ]); }); } }