From 7ab35c7edfa1f8a3810d1838b8374452501e3c14 Mon Sep 17 00:00:00 2001 From: Dasc3er Date: Thu, 25 Feb 2021 09:41:33 +0100 Subject: [PATCH] =?UTF-8?q?Introduzione=20sistema=20per=20controlli=20di?= =?UTF-8?q?=20integrit=C3=A0=20logica=20dei=20dati?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Base per effettuare controlli sullo stato dei dati del gestionale, con introduzione di un relativo script per controlli sui Conti Cliente e Fornitore. --- modules/aggiornamenti/actions.php | 56 +++++ modules/aggiornamenti/controlli.php | 219 ++++++++++++++++++ modules/aggiornamenti/edit.php | 8 + .../aggiornamenti/src/Controlli/Controllo.php | 65 ++++++ .../src/Controlli/PianoConti.php | 105 +++++++++ 5 files changed, 453 insertions(+) create mode 100644 modules/aggiornamenti/controlli.php create mode 100644 modules/aggiornamenti/src/Controlli/Controllo.php create mode 100644 modules/aggiornamenti/src/Controlli/PianoConti.php diff --git a/modules/aggiornamenti/actions.php b/modules/aggiornamenti/actions.php index cd9e76927..7e9a480db 100755 --- a/modules/aggiornamenti/actions.php +++ b/modules/aggiornamenti/actions.php @@ -20,6 +20,8 @@ include_once __DIR__.'/../../core.php'; use Models\Cache; +use Modules\Aggiornamenti\Controlli\Controllo; +use Modules\Aggiornamenti\Controlli\PianoConti; use Modules\Aggiornamenti\UpdateHook; $id = post('id'); @@ -42,5 +44,59 @@ switch (filter('op')) { case 'upload': include base_dir().'/modules/aggiornamenti/upload_modules.php'; + break; + + case 'controlli-disponibili': + $controlli = [ + PianoConti::class, + ]; + + $results = []; + foreach ($controlli as $key => $controllo) { + $results[] = [ + 'id' => $key, + 'class' => $controllo, + 'name' => (new $controllo())->getName(), + ]; + } + + echo json_encode($results); + + break; + + case 'controlli-check': + $class = post('controllo'); + + // Controllo sulla classe + if (!is_subclass_of($class, Controllo::class)) { + echo json_encode([]); + + return; + } + + $manager = new $class(); + $manager->check(); + + echo json_encode($manager->getResults()); + + break; + + case 'controlli-action': + $class = post('controllo'); + $records = post('records'); + $params = post('params'); + + // Controllo sulla classe + if (!is_subclass_of($class, Controllo::class)) { + echo json_encode([]); + + return; + } + + $manager = new $class(); + $result = $manager->solve($records, $params); + + echo json_encode($result); + break; } diff --git a/modules/aggiornamenti/controlli.php b/modules/aggiornamenti/controlli.php new file mode 100644 index 000000000..a8e2e65fd --- /dev/null +++ b/modules/aggiornamenti/controlli.php @@ -0,0 +1,219 @@ +. + */ + +include_once __DIR__.'/../../core.php'; + +// Schermata di caricamento delle informazioni +echo ' + + +
+ +
+
+
+ 0% +
+
+
+

'.tr('Operazione in corso').':

+
+ +
+ '.tr('Caricamento in corso').'... +
+ + + +'; diff --git a/modules/aggiornamenti/edit.php b/modules/aggiornamenti/edit.php index 5e34e71d4..dc80efeee 100755 --- a/modules/aggiornamenti/edit.php +++ b/modules/aggiornamenti/edit.php @@ -156,6 +156,10 @@ function database(button) { openModal("'.tr('Controllo del database').'", "'.$module->fileurl('database.php').'?id_module='.$id_module.'"); } +function controlli(button) { + openModal("'.tr('Controlli del gestionale').'", "'.$module->fileurl('controlli.php').'?id_module='.$id_module.'"); +} + function search(button) { let restore = buttonLoading(button); @@ -217,6 +221,10 @@ function search(button) { + + diff --git a/modules/aggiornamenti/src/Controlli/Controllo.php b/modules/aggiornamenti/src/Controlli/Controllo.php new file mode 100644 index 000000000..54d6d4b24 --- /dev/null +++ b/modules/aggiornamenti/src/Controlli/Controllo.php @@ -0,0 +1,65 @@ +. + */ + +namespace Modules\Aggiornamenti\Controlli; + +abstract class Controllo +{ + public $results = []; + + public function addResult($record) + { + $this->results[] = array_merge($record, [ + 'type' => $this->getType($record), + 'options' => $this->getOptions($record), + ]); + } + + public function getResults() + { + return $this->results; + } + + public function getOptions($record) + { + return []; + } + + abstract public function getName(); + + abstract public function getType($record); + + abstract public function check(); + + public function solve($records, $params = []) + { + if (!isset($records[0])) { + return $this->execute($records, $params); + } + + $results = []; + foreach ($records as $record) { + $results[$record['id']] = $this->execute($record, $params); + } + + return $results; + } + + abstract public function execute($records, $params = []); +} diff --git a/modules/aggiornamenti/src/Controlli/PianoConti.php b/modules/aggiornamenti/src/Controlli/PianoConti.php new file mode 100644 index 000000000..6d3c51215 --- /dev/null +++ b/modules/aggiornamenti/src/Controlli/PianoConti.php @@ -0,0 +1,105 @@ +. + */ + +namespace Modules\Aggiornamenti\Controlli; + +use Modules\Anagrafiche\Anagrafica; + +class PianoConti extends Controllo +{ + public function getName() + { + return tr('Piano dei Conti collegato alle anagrafiche'); + } + + public function getType($record) + { + return 'warning'; + } + + public function getOptions($record) + { + return [ + [ + 'name' => tr('Risolvi'), + 'icon' => 'fa fa-check', + 'color' => 'success', + 'params' => [], + ], + ]; + } + + public function check() + { + $database = database(); + + /** + * Verifico se serve creare un conto per eventuali nuovi clienti o fornitori. + */ + $anagrafiche_interessate = $database->fetchArray('SELECT + an_anagrafiche.idanagrafica AS id, + an_anagrafiche.idconto_cliente, + an_anagrafiche.idconto_fornitore, + an_anagrafiche.ragione_sociale, + GROUP_CONCAT(an_tipianagrafiche.descrizione) AS tipi_anagrafica + FROM an_anagrafiche + INNER JOIN an_tipianagrafiche_anagrafiche ON an_tipianagrafiche_anagrafiche.idanagrafica = an_anagrafiche.idanagrafica + INNER JOIN an_tipianagrafiche ON an_tipianagrafiche.idtipoanagrafica = an_tipianagrafiche_anagrafiche.idtipoanagrafica + WHERE idconto_cliente = 0 OR idconto_cliente IS NULL OR idconto_fornitore = 0 OR idconto_fornitore IS NULL + GROUP BY an_anagrafiche.idanagrafica'); + + foreach ($anagrafiche_interessate as $anagrafica) { + $tipi = explode(',', $anagrafica['tipi_anagrafica']); + $cliente = in_array('Cliente', $tipi) && empty($anagrafica['idconto_cliente']); + $fornitore = in_array('Fornitore', $tipi) && empty($anagrafica['idconto_fornitore']); + + $descrizione = null; + if ($cliente && $fornitore) { + $descrizione = tr("L'anagrafica corrente non ha impostati i conti relativi al Piano dei Conti"); + } elseif ($cliente) { + $descrizione = tr("L'anagrafica corrente non ha impostati il conto Cliente relativo al Piano dei Conti"); + } elseif ($fornitore) { + $descrizione = tr("L'anagrafica corrente non ha impostati il conto Fornitore relativo al Piano dei Conti"); + } + + if (!empty($descrizione)) { + $this->addResult([ + 'id' => $anagrafica['id'], + 'nome' => $anagrafica['ragione_sociale'], + 'descrizione' => $descrizione, + ]); + } + } + } + + public function execute($record, $params = []) + { + $anagrafica = Anagrafica::find($record['id']); + + if ($anagrafica->isTipo('Cliente')) { + Anagrafica::fixCliente($anagrafica); + } + + if ($anagrafica->isTipo('Fornitore')) { + Anagrafica::fixFornitore($anagrafica); + } + + return true; + } +}