diff --git a/.env.example b/.env.example index eef1ae5fb..6aadcfc76 100644 --- a/.env.example +++ b/.env.example @@ -11,7 +11,7 @@ LOG_LEVEL=debug DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 -DB_DATABASE=laravel +DB_DATABASE= DB_USERNAME=root DB_PASSWORD= diff --git a/.gitignore b/.gitignore index f21de271a..e908aa1a8 100755 --- a/.gitignore +++ b/.gitignore @@ -89,7 +89,7 @@ config.inc.php database.sql VERSION REVISION -.php_cs.cache +.php-cs-fixer.cache manifest.json checksum.json database.json @@ -112,3 +112,4 @@ Homestead.json Homestead.yaml npm-debug.log yarn-error.log +.vagrant diff --git a/.php_cs b/.php-cs-fixer.php old mode 100755 new mode 100644 similarity index 61% rename from .php_cs rename to .php-cs-fixer.php index eccec1e55..d1b876b2b --- a/.php_cs +++ b/.php-cs-fixer.php @@ -10,23 +10,16 @@ $finder = PhpCsFixer\Finder::create() ->ignoreVCS(true) ->in(__DIR__); -$config = PhpCsFixer\Config::create() - ->setRules([ +$config = new PhpCsFixer\Config(); +$config->setRules([ '@Symfony' => true, 'array_syntax' => ['syntax' => 'short'], 'yoda_style' => false, - 'no_short_echo_tag' => true, + 'echo_tag_syntax' => ['format' => 'long'], 'ordered_imports' => true, 'no_alternative_syntax' => true, 'ordered_class_elements' => true, 'phpdoc_order' => true, - //'no_superfluous_phpdoc_tags' => [ - // 'allow_mixed' => true, - // 'allow_unused_params' => true, - //], - //'phpdoc_add_missing_param_annotation' => [ - // 'only_untyped' => false, - //], ]) ->setFinder($finder); diff --git a/app/Http/Controllers/InitializationController.php b/app/Http/Controllers/InitializationController.php index 91b6496a9..97920c0f2 100644 --- a/app/Http/Controllers/InitializationController.php +++ b/app/Http/Controllers/InitializationController.php @@ -3,10 +3,12 @@ namespace App\Http\Controllers; use App\Models\User; +use Illuminate\Database\QueryException; use Illuminate\Http\Request; use Models\Group; use Models\Setting; use Models\Upload; +use PDOException; class InitializationController extends Controller { @@ -24,13 +26,25 @@ class InitializationController extends Controller if (!isset(self::$init)) { $database = database(); - $has_azienda = $database->fetchNum("SELECT `an_anagrafiche`.`idanagrafica` + // Controlli sull'inizializzazione dell'anagrafica Azienda + try { + $has_azienda = $database->fetchNum("SELECT `an_anagrafiche`.`idanagrafica` FROM `an_anagrafiche` LEFT JOIN `an_tipianagrafiche_anagrafiche` ON `an_anagrafiche`.`idanagrafica`=`an_tipianagrafiche_anagrafiche`.`idanagrafica` LEFT JOIN `an_tipianagrafiche` ON `an_tipianagrafiche`.`idtipoanagrafica`=`an_tipianagrafiche_anagrafiche`.`idtipoanagrafica` WHERE `an_tipianagrafiche`.`descrizione` = 'Azienda' AND `an_anagrafiche`.`deleted_at` IS NULL") != 0; - $has_user = $database->fetchNum('SELECT `id` FROM `zz_users`') != 0; + } catch (PDOException $e) { + $has_azienda = false; + } + // Controllo sull'utente amministratore + try { + $has_user = $database->fetchNum('SELECT `id` FROM `zz_users`') != 0; + } catch (PDOException $e) { + $has_user = false; + } + + // Controlli sulle impostazioni $settings = [ 'Regime Fiscale' => true, 'Tipo Cassa Previdenziale' => false, @@ -41,16 +55,21 @@ class InitializationController extends Controller 'Valuta' => true, ]; - if (!empty(setting("Percentuale ritenuta d'acconto"))) { - $settings["Causale ritenuta d'acconto"] = true; - } - $has_settings = true; - foreach ($settings as $setting => $required) { - if (empty(setting($setting)) && $required) { - $has_settings = false; - break; + + try { + if (!empty(setting("Percentuale ritenuta d'acconto"))) { + $settings["Causale ritenuta d'acconto"] = true; } + + foreach ($settings as $setting => $required) { + if (empty(setting($setting)) && $required) { + $has_settings = false; + break; + } + } + } catch (QueryException $e) { + $has_settings = false; } self::$init = [ diff --git a/app/Http/Controllers/LegacyController.php b/app/Http/Controllers/LegacyController.php index deaab78b3..805827597 100644 --- a/app/Http/Controllers/LegacyController.php +++ b/app/Http/Controllers/LegacyController.php @@ -35,17 +35,6 @@ class LegacyController extends Controller return $response; } - protected static function isApiRequest($path) - { - // Fix per redirect all'API - $api_request = false; - if (in_array($path, ['api', 'api/', 'api/index.php'])) { - $api_request = true; - } - - return $api_request; - } - public static function simulate($path) { $base_path = base_path('legacy'); @@ -76,4 +65,15 @@ class LegacyController extends Controller return $output; } + + protected static function isApiRequest($path) + { + // Fix per redirect all'API + $api_request = false; + if (in_array($path, ['api', 'api/', 'api/index.php'])) { + $api_request = true; + } + + return $api_request; + } } diff --git a/app/Http/Controllers/RequirementsController.php b/app/Http/Controllers/RequirementsController.php index 3979cc398..521b1b475 100644 --- a/app/Http/Controllers/RequirementsController.php +++ b/app/Http/Controllers/RequirementsController.php @@ -12,7 +12,7 @@ class RequirementsController extends Controller public function index(Request $request) { $args = [ - 'requirements' => self::getRequirementsList() + 'requirements' => self::getRequirementsList(), ]; return view('config.requirements', $args); diff --git a/app/Http/Controllers/UpdateController.php b/app/Http/Controllers/UpdateController.php new file mode 100644 index 000000000..37d8c77f1 --- /dev/null +++ b/app/Http/Controllers/UpdateController.php @@ -0,0 +1,158 @@ +initMigrationsTable(); + } + + public function index(Request $request) + { + $migrations = self::computeMigrations(); + $legacy = self::computeLegacyUpdates(); + + return view('config.update', [ + 'installing' => database()->isInstalled(), + 'legacy_number' => $legacy['number'], + 'updates_available' => $legacy['number'] + $migrations['number'], + 'total_weight' => $legacy['weight'] + $migrations['weight'], + ]); + } + + public static function getMigrator(): Migrator + { + $app = app(); + + return $app['migrator']; + } + + public static function isCompleted() + { + $migrations = self::computeMigrations(); + $legacy = self::computeLegacyUpdates(); + + return $legacy['number'] + $migrations['number'] == 0; + } + + public function execute(Request $request) + { + if ($request->input('legacy') == 'true') { + $response = $this->executeLegacyUpdate(); + } else { + $response = $this->executeMigration(); + } + + return response()->json($response); + } + + protected function initMigrationsTable() + { + $migrator = self::getMigrator(); + if ($migrator->repositoryExists()) { + return; + } + + $migrator->getRepository()->createRepository(); + } + + protected static function computeMigrations() + { + $migrator = self::getMigrator(); + + $paths = array_merge( + $migrator->paths(), + [app()->databasePath().DIRECTORY_SEPARATOR.'migrations'] + ); + + // Elenco di tutte le migrazioni disponibili + $files = $migrator->getMigrationFiles($paths); + $ran = $migrator->getRepository()->getRan(); + + // Filtro per migrazioni da eseguire + $migrations = Collection::make($files) + ->reject(function ($file) use ($migrator, $ran) { + return in_array($migrator->getMigrationName($file), $ran); + })->values()->all(); + $count = count($migrations); + + return [ + 'list' => $migrations, + 'number' => $count, + 'weight' => $count, + ]; + } + + protected static function computeLegacyUpdates() + { + $updates = Update::getTodoUpdates(); + + $total = 0; + foreach ($updates as $update) { + if ($update['sql'] && (!empty($update['done']) || is_null($update['done']))) { + $queries = readSQLFile(base_dir().$update['directory'].$update['filename'].'.sql', ';'); + $total += count($queries); + + if (intval($update['done']) > 1) { + $total -= intval($update['done']) - 2; + } + } + + if ($update['script']) { + $total += self::$legacyScriptValue; + } + } + + return [ + 'list' => $updates, + 'number' => count($updates), + 'weight' => $total, + ]; + } + + protected function executeMigration() + { + $migrations = $this->computeMigrations(); + + // Ricerca della migrazione indicata + $migration = $migrations['list'][0]; + + // Esecuzione migrazione + $migrator = self::getMigrator(); + $migrator->runPending([$migration]); + + return [ + 'progress' => 1, + 'migration' => $migrator->getMigrationName($migration), + 'completed' => count($migrations['list']) <= 1, + ]; + } + + protected function executeLegacyUpdate() + { + $update = Update::getCurrentUpdate(); + $result = Update::doUpdate(self::$legacyUpdateRate); + + $rate = 0; + if (is_array($result)) { + $rate = $result[1] - $result[0]; + } elseif (!empty($update['script'])) { + $rate = self::$legacyScriptValue; + } + + return [ + 'progress' => $rate, + 'legacyVersion' => $update['version'], + ]; + } +} diff --git a/app/Http/Middleware/EnsureConfiguration.php b/app/Http/Middleware/EnsureConfiguration.php index e60eb95a1..a306c705f 100644 --- a/app/Http/Middleware/EnsureConfiguration.php +++ b/app/Http/Middleware/EnsureConfiguration.php @@ -5,11 +5,25 @@ namespace App\Http\Middleware; use App\Http\Controllers\ConfigurationController; use App\Http\Controllers\InitializationController; use App\Http\Controllers\RequirementsController; +use App\Http\Controllers\UpdateController; use Closure; use Illuminate\Http\Request; class EnsureConfiguration { + /** + * @return string|null + */ + protected $redirect_route = null; + + /** + * @param null $redirect + */ + public function setRedirect($redirect): void + { + $this->redirect_route = $redirect; + } + /** * Handle an incoming request. * @@ -22,33 +36,38 @@ class EnsureConfiguration return $next($request); } - // Test sui requisiti del gestionale - $result = $this->checkRequirements($route); - if ($result !== null) { - return $result; - } + // Controlli in ordine per l'esecizione + $checks = [ + 'checkRequirements', // Test sui requisiti del gestionale + 'checkConfiguration', // Test della connessione al database + 'checkMigrations', // Verifiche sullo stato delle migrazioni + 'checkInitialization', // Verifiche sullo stato delle impostazioni obbligatorie + ]; - // Test della connessione al database - $result = $this->checkConfiguration($route); - if ($result !== null) { - return $result; - } + foreach ($checks as $check) { + $continue = $this->{$check}($route); - // Verifiche sullo stato delle migrazioni - $result = $this->checkMigrations($route); - if ($result !== null) { - return $result; - } + // Redirect automatico causato dal controllo corrente + if (isset($this->redirect_route)) { + return redirect($this->redirect_route); + } - // Verifiche sullo stato delle impostazioni obbligatorie - $result = $this->checkInitialization($route); - if ($result !== null) { - return $result; + // Blocco sui controlli in caso di mancato completamento del controllo corrente + if (!$continue) { + break; + } } return $next($request); } + /** + * Controlli sui requisiti minimi dell'ambiente di esecuzione. + * + * @param $route + * + * @return bool + */ protected function checkRequirements($route) { $configuration_paths = ['requirements']; @@ -57,18 +76,25 @@ class EnsureConfiguration if ($requirements_satisfied) { // Redirect nel caso in cui i requisiti siano soddisfatti if (in_array($route->getName(), $configuration_paths)) { - return redirect(route('configuration')); + $this->setRedirect(route('configuration')); } } else { // Redirect per requisiti incompleti if (!in_array($route->getName(), $configuration_paths)) { - return redirect(route('requirements')); + $this->setRedirect(route('requirements')); } } - return null; + return $requirements_satisfied; } + /** + * Controlli sulla configurazione del gestionale. + * + * @param $route + * + * @return bool + */ protected function checkConfiguration($route) { $configuration_paths = ['configuration', 'configuration-save', 'configuration-test']; @@ -77,18 +103,52 @@ class EnsureConfiguration if ($configuration_completed) { // Redirect nel caso in cui la configurazione sia correttamente funzionante if (in_array($route->getName(), $configuration_paths)) { - return redirect(route('initialization')); + $this->setRedirect(route('update')); } } else { // Redirect per configurazione mancante if (!in_array($route->getName(), $configuration_paths)) { - return redirect(route('configuration')); + $this->setRedirect(route('configuration')); } } - return null; + return $configuration_completed; } + /** + * Controlli sulle migrazioni (aggiornamenti) del gestionale. + * + * @param $route + * + * @return bool + */ + protected function checkMigrations($route) + { + $update_paths = ['update', 'update-execute']; + $update_completed = UpdateController::isCompleted(); + + if ($update_completed) { + // Redirect nel caso in cui la configurazione sia correttamente funzionante + if (in_array($route->getName(), $update_paths)) { + $this->setRedirect(route('initialization')); + } + } else { + // Redirect per configurazione mancante + if (!in_array($route->getName(), $update_paths)) { + $this->setRedirect(route('update')); + } + } + + return $update_completed; + } + + /** + * Controlli sull'inizializzazione delle informazioni di base del gestionale. + * + * @param $route + * + * @return bool + */ protected function checkInitialization($route) { $initialization_paths = ['initialization', 'initialization-save']; @@ -97,20 +157,15 @@ class EnsureConfiguration if ($initialization_completed) { // Redirect nel caso in cui la configurazione sia correttamente funzionante if (in_array($route->getName(), $initialization_paths)) { - return redirect(route('login')); + $this->setRedirect(route('login')); } } else { // Redirect per configurazione mancante if (!in_array($route->getName(), $initialization_paths)) { - return redirect(route('initialization')); + $this->setRedirect(route('initialization')); } } - return null; - } - - protected function checkMigrations($route) - { - return null; + return $initialization_completed; } } diff --git a/app/OSM/Prints/Retro/Manager.php b/app/OSM/Prints/Retro/Manager.php index bbbf2addd..6158dc342 100644 --- a/app/OSM/Prints/Retro/Manager.php +++ b/app/OSM/Prints/Retro/Manager.php @@ -19,9 +19,8 @@ namespace App\OSM\Prints\Retro; -use App; -use AppLegacy; use App\OSM\Prints\MPDFManager; +use AppLegacy; class Manager extends MPDFManager { diff --git a/app/OSM/Prints/Template.php b/app/OSM/Prints/Template.php index 50a1fbe1d..bde9f166f 100644 --- a/app/OSM/Prints/Template.php +++ b/app/OSM/Prints/Template.php @@ -20,10 +20,10 @@ namespace App\OSM\Prints; use App\OSM\ComponentManagerTrait; -use Common\SimpleModelTrait; -use Models\Group; use Common\Model; +use Common\SimpleModelTrait; use Illuminate\Database\Eloquent\Builder; +use Models\Group; use Models\Module; use Traits\LocalPoolTrait; diff --git a/app/OSM/Widgets/Retro/ModalWidget.php b/app/OSM/Widgets/Retro/ModalWidget.php index 5d9bf3d23..f5ee4fed4 100644 --- a/app/OSM/Widgets/Retro/ModalWidget.php +++ b/app/OSM/Widgets/Retro/ModalWidget.php @@ -20,9 +20,9 @@ namespace App\OSM\Widgets\Retro; use App\Http\Controllers\LegacyController; +use App\OSM\Widgets\ModalWidget as Original; use Models\Module; use Util\Query; -use App\OSM\Widgets\ModalWidget as Original; class ModalWidget extends Original { diff --git a/app/View/Components/EmailHistory.php b/app/View/Components/EmailHistory.php index 59e5ea7f9..09f3d60f3 100644 --- a/app/View/Components/EmailHistory.php +++ b/app/View/Components/EmailHistory.php @@ -13,13 +13,12 @@ class EmailHistory extends Component * Create a new component instance. * * @param string|int $module - * @param int $record + * @param int $record */ public function __construct( $module, $record ) { - // Visualizzo il log delle operazioni di invio email $this->emails = Mail::whereRaw('id IN (SELECT id_email FROM zz_operations WHERE id_record = '.prepare($record).' AND id_module = '.prepare($module).' AND id_email IS NOT NULL)') ->orderBy('created_at', 'DESC') diff --git a/app/View/Components/Inputs/Select.php b/app/View/Components/Inputs/Select.php index 3769aa4a3..5339b1eeb 100644 --- a/app/View/Components/Inputs/Select.php +++ b/app/View/Components/Inputs/Select.php @@ -8,21 +8,20 @@ use Illuminate\View\Component; class Select extends InputWrapper { - /** * Create a new component instance. * - * @param string $name + * @param string $name * @param string|null $id * @param string|null $value * @param bool|string $required * @param string|null $label * @param string|null $placeholder - * @param bool $multiple - * @param string $source - * @param string $query - * @param array $values - * @param array $options + * @param bool $multiple + * @param string $source + * @param string $query + * @param array $values + * @param array $options */ public function __construct( $name, diff --git a/app/View/Components/WidgetGroup.php b/app/View/Components/WidgetGroup.php index 2b9cf4864..5cf7a3db8 100644 --- a/app/View/Components/WidgetGroup.php +++ b/app/View/Components/WidgetGroup.php @@ -20,8 +20,9 @@ class WidgetGroup extends Component * Create a new component instance. * * @param string|int $module - * @param string $place - * @param string $position + * @param string $place + * @param string $position + * * @throws \Exception */ public function __construct( diff --git a/composer.json b/composer.json index 681d514b5..e244b62cd 100644 --- a/composer.json +++ b/composer.json @@ -16,7 +16,6 @@ "type": "project", "require": { "php": "^7.3|^8.0", - "ext-apache": "*", "ext-curl": "*", "ext-dom": "*", "ext-fileinfo": "*", @@ -58,7 +57,8 @@ "require-dev": { "facade/ignition": "^2.5", "fakerphp/faker": "^1.9.1", - "friendsofphp/php-cs-fixer": "^2.10", + "friendsofphp/php-cs-fixer": "^3.0", + "laravel/homestead": "^12.2", "mockery/mockery": "^1.4.2", "nunomaduro/collision": "^5.0", "phpunit/phpunit": "^9.3.3" diff --git a/legacy b/legacy index 3900b7894..39a79aea8 160000 --- a/legacy +++ b/legacy @@ -1 +1 @@ -Subproject commit 3900b789459d1cc805338bcc795a3ad187b972d0 +Subproject commit 39a79aea88f220f4d49c349df176b1ef310005f8 diff --git a/resources/views/config/update.blade.php b/resources/views/config/update.blade.php new file mode 100644 index 000000000..507afa1fb --- /dev/null +++ b/resources/views/config/update.blade.php @@ -0,0 +1,167 @@ +@extends('layouts.guest') + +@section('title', $installing ? tr('Installazione') : tr('Aggiornamento')) +@section('box_class', 'box-warning text-center') +@section('box_header') +

{{ $installing ? tr('Installazione di OpenSTAManager') : tr('Aggiornamento di OpenSTAManager') }}

+@endsection + +@section('content') + @if($installing) +

{{ tr("E' la prima volta che avvii OpenSTAManager e non hai ancora installato il database") }}.

+ @else +

{{ tr("E' necessario aggiornare il database a una nuova versione") }}.

+ @endif + + @php($button = $installing ? tr('Installa!') : tr('Aggiorna!')) + +

{!! tr("Premi il tasto _BUTTON_ per procedere con l'_OP_!", [ + '_BUTTON_' => ''.$button.'', + '_OP_' => $installing ? tr('installazione') : tr('aggiornamento'), + ]) !!}

+ + + +
+ + + + +@endsection diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index 1718fed6c..e421baa94 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -39,6 +39,8 @@ search: search, translations: { + "errorTitle": "{{ tr('Errore') }}", + "errorMessage": "{{ tr("Si è verificato un errore nell'esecuzione dell'operazione richiesta") }}", "day": "{{ tr('Giorno') }}", "week": "{{ tr('Settimana') }}", "month": "{{ tr('Mese') }}", @@ -61,8 +63,6 @@ "delete": "{{ tr('Elimina') }}", "deleteTitle": "{{ tr('Sei sicuro?') }}", "deleteMessage": "{{ tr('Eliminare questo elemento?') }}", - "errorTitle": "{{ tr('Errore') }}", - "errorMessage": "{{ tr("Si è verificato un errore nell'esecuzione dell'operazione richiesta") }}", "close": "{{ tr('Chiudi') }}", "filter": "{{ tr('Filtra') }}", "long": "{{ tr('La ricerca potrebbe richiedere del tempo') }}", diff --git a/resources/views/layouts/base.blade.php b/resources/views/layouts/base.blade.php index 899658fe2..c04802ce4 100644 --- a/resources/views/layouts/base.blade.php +++ b/resources/views/layouts/base.blade.php @@ -51,6 +51,8 @@ full_locale: '{{ locale() }}', translations: { + "errorTitle": "{{ tr('Errore') }}", + "errorMessage": "{{ tr("Si è verificato un errore nell'esecuzione dell'operazione richiesta") }}", password: { "wordMinLength": "{{ tr('La password è troppo corta') }}", "wordMaxLength": "{{ tr('La password è troppo lunga') }}", diff --git a/routes/auth.php b/routes/auth.php index 081a0d8f9..7fa829f9a 100644 --- a/routes/auth.php +++ b/routes/auth.php @@ -1,7 +1,6 @@ name('configuration-save'); +// Installazione aggiornamenti del gestionale +Route::get('/update', [UpdateController::class, 'index']) + ->name('update'); +Route::post('/update', [UpdateController::class, 'execute']) + ->name('update-execute'); + // Inizializzazione del gestionale Route::get('/init', [InitializationController::class, 'index']) ->name('initialization'); @@ -120,7 +126,6 @@ Route::get('/logs', [UserController::class, 'logs']) ->middleware(['auth']) ->name('logs'); - // Log di accesso Route::get('/widget/modal/{id}', [WidgetModalController::class, 'modal']) ->whereNumber('id')