diff --git a/CHANGELOG.md b/CHANGELOG.md index 508421753..3965cb98e 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ Tutti i maggiori cambiamenti di questo progetto saranno documentati in questo fi Il formato utilizzato è basato sulle linee guida di [Keep a Changelog](http://keepachangelog.com/), e il progetto segue il [Semantic Versioning](http://semver.org/) per definire le versioni delle release. +- [2.4.14](#2414) - [2.4.13 (2020-02-05)](#2413-2020-02-05) - [2.4.12 (2019-12-30)](#2412-2019-12-30) - [2.4.11 (2019-11-29)](#2411-2019-11-29) @@ -23,6 +24,28 @@ Il formato utilizzato è basato sulle linee guida di [Keep a Changelog](http://k - [2.2 (2016-11-10)](#22-2016-11-10) - [2.1 (2015-04-02)](#21-2015-04-02) +## 2.4.14 + +### Aggiunto (Added) + - Nuove funzionalità nell'importazione delle Fatture Elettroniche + - Riferimenti manuali a DDT e Ordini di acquisto nell'importazione delle Fatture Elettroniche + - Compilazione automatica dei campi principali sulla base delle Fatture precedentemente importate + - Controlli aggiuntivi sulla numerazione di **DDT** e **Fatture** + - Fatturazione massiva di Contratti e Preventivi + - Nuovo modulo **Stampe** sotto **Strumenti** per permettere la modifica manuale delle opzioni delle stampe + +### Modificato (Changed) + - Revisione e aggiornamento dei plugin *Pianificazione interventi* e *Pianficazione fatturazione* + - Modifica della gestione degli importi per le righe dei documenti (#758) + - Il plugin *Movimenti* degli **Articoli** presenta ora un raggruppamento per documento (#766) + - Aggiornamento del sistema di cache per prevedere una maggiore varietà di casi di utilizzo + +### Fixed + - Blocco della duplicazione per Fatture per cui esiste una Nota di credito + - Gestione delle quantità evase per la fatturazione massiva di DDT + - Abilitazione e disabilitazione API per utenti senza token + - Modifica del totale per scadenze generiche in **Scadenzario** (#764) + ## 2.4.13 (2020-02-05) ### Aggiunto (Added) diff --git a/modules/aggiornamenti/actions.php b/modules/aggiornamenti/actions.php index 45d468e96..5b434a7eb 100755 --- a/modules/aggiornamenti/actions.php +++ b/modules/aggiornamenti/actions.php @@ -2,6 +2,7 @@ include_once __DIR__.'/../../core.php'; +use Models\Cache; use Modules\Aggiornamenti\UpdateHook; $id = post('id'); @@ -9,7 +10,8 @@ $id = post('id'); switch (filter('op')) { case 'check': $result = UpdateHook::isAvailable(); - UpdateHook::update($result); + + Cache::get('Ultima versione di OpenSTAManager disponibile')->set($result); echo $result; diff --git a/modules/aggiornamenti/src/UpdateHook.php b/modules/aggiornamenti/src/UpdateHook.php index cad88793a..0fa89ce83 100755 --- a/modules/aggiornamenti/src/UpdateHook.php +++ b/modules/aggiornamenti/src/UpdateHook.php @@ -11,16 +11,19 @@ class UpdateHook extends CachedManager { protected static $client = null; - public function data() + public function getCacheName() { - $result = self::isAvailable(); + return 'Ultima versione di OpenSTAManager disponibile'; + } - return $result; + public function cacheData() + { + return self::isAvailable(); } public function response() { - $update = self::getCache()['results']; + $update = $this->getCache()->content; $module = Modules::get('Aggiornamenti'); $link = ROOTDIR.'/controller.php?id_module='.$module->id; diff --git a/plugins/importFE/src/Interaction.php b/plugins/importFE/src/Interaction.php index 6622aa724..953451478 100755 --- a/plugins/importFE/src/Interaction.php +++ b/plugins/importFE/src/Interaction.php @@ -3,6 +3,7 @@ namespace Plugins\ImportFE; use API\Services; +use Models\Cache; /** * Classe per l'interazione con API esterne. @@ -19,7 +20,7 @@ class Interaction extends Services $result = self::getFileList($list); // Aggiornamento cache hook - InvoiceHook::update($result); + Cache::get('Fatture Elettroniche')->set($result); return $result; } diff --git a/plugins/importFE/src/InvoiceHook.php b/plugins/importFE/src/InvoiceHook.php index 8fb1f4366..7ac1d6006 100755 --- a/plugins/importFE/src/InvoiceHook.php +++ b/plugins/importFE/src/InvoiceHook.php @@ -7,16 +7,19 @@ use Modules; class InvoiceHook extends CachedManager { - public function data() + public function getCacheName() { - $list = Interaction::getInvoiceList(); + return 'Fatture Elettroniche'; + } - return $list; + public function cacheData() + { + return Interaction::getInvoiceList(); } public function response() { - $results = self::getCache()['results']; + $results = $this->getCache()->content; $count = count($results); $notify = false; diff --git a/plugins/receiptFE/actions.php b/plugins/receiptFE/actions.php index c612b42fc..33deb7f44 100755 --- a/plugins/receiptFE/actions.php +++ b/plugins/receiptFE/actions.php @@ -3,16 +3,12 @@ include_once __DIR__.'/../../core.php'; use Plugins\ReceiptFE\Interaction; -use Plugins\ReceiptFE\ReceiptHook; use Plugins\ReceiptFE\Ricevuta; switch (filter('op')) { case 'import': $list = Interaction::getReceiptList(); - // Aggiornamento cache hook - ReceiptHook::update($list); - $results = []; foreach ($list as $element) { $name = $element['name']; diff --git a/plugins/receiptFE/src/Interaction.php b/plugins/receiptFE/src/Interaction.php index bb64868ab..c15dfb52d 100755 --- a/plugins/receiptFE/src/Interaction.php +++ b/plugins/receiptFE/src/Interaction.php @@ -3,6 +3,7 @@ namespace Plugins\ReceiptFE; use API\Services; +use Models\Cache; /** * Classe per l'interazione con API esterne. @@ -21,7 +22,7 @@ class Interaction extends Services $list = array_merge($list, $files); // Aggiornamento cache hook - ReceiptHook::update($list); + Cache::get('Ricevute Elettroniche')->set($list); return $list; } diff --git a/plugins/receiptFE/src/ReceiptHook.php b/plugins/receiptFE/src/ReceiptHook.php index fbee6a7a5..59a60bd33 100755 --- a/plugins/receiptFE/src/ReceiptHook.php +++ b/plugins/receiptFE/src/ReceiptHook.php @@ -7,16 +7,19 @@ use Modules; class ReceiptHook extends CachedManager { - public function data() + public function getCacheName() { - $list = Interaction::getReceiptList(); + return 'Ricevute Elettroniche'; + } - return $list; + public function cacheData() + { + return Interaction::getReceiptList(); } public function response() { - $results = self::getCache()['results']; + $results = $this->getCache()->content; $count = count($results); $notify = false; diff --git a/src/Hooks/CachedManager.php b/src/Hooks/CachedManager.php index 3bdde1c7e..fc3cabf87 100755 --- a/src/Hooks/CachedManager.php +++ b/src/Hooks/CachedManager.php @@ -2,95 +2,47 @@ namespace Hooks; -use Carbon\Carbon; -use Carbon\CarbonInterval; +use Models\Cache; +use Models\Hook; abstract class CachedManager extends Manager { - protected static $cache = null; - protected static $is_cached = null; + protected $cache = null; - abstract public function data(); + public function __construct(Hook $hook) + { + parent::__construct($hook); + + $this->cache = Cache::get($this->getCacheName()); + } + + abstract public function cacheData(); + + abstract public function getCacheName(); public function needsExecution() { - return !self::isCached(); + return !$this->isCached(); } public function execute() { - if (self::isCached()) { - $results = self::getCache()['results']; - } else { - $results = $this->data(); + if (!$this->isCached()) { + $data = $this->cacheData(); - self::update($results); + $this->getCache()->set($data); } - return $results; + return $this->getCache()->content; } - public static function getCache() + public function getCache() { - if (!isset(self::$cache)) { - $hook = self::getHook(); - - $cache = database()->selectOne('zz_hook_cache', '*', ['hook_id' => $hook->id], ['id' => 'DESC']); - - // Interpretazione della cache - if (isset($cache['results'])) { - $cache['results'] = json_decode($cache['results'], true); - } - - self::$cache = $cache; - } - - return self::$cache; + return $this->cache; } - public static function update($results) + public function isCached() { - $hook = self::getHook(); - - if (!empty($hook)) { - // Rimozione cache precedente - $database = database(); - $database->delete('zz_hook_cache', [ - 'hook_id' => $hook->id, - ]); - - // Aggiunta del risultato come cache - $cache = json_encode($results); - $database->insert('zz_hook_cache', [ - 'hook_id' => $hook->id, - 'results' => $cache, - ]); - - self::$cache = $results; - self::$is_cached = null; - } - } - - public static function isCached() - { - if (!isset(self::$is_cached)) { - $hook = self::getHook(); - $cache = self::getCache(); - - $is_cached = false; - if (!empty($cache)) { - $date = new Carbon($cache['created_at']); - $interval = CarbonInterval::make($hook->frequency); - - $date = $date->add($interval); - - $now = new Carbon(); - $is_cached = $date->greaterThan($now); - } - - self::$is_cached = $is_cached; - } - - return self::$is_cached; + return $this->getCache()->isValid(); } } diff --git a/src/Hooks/Manager.php b/src/Hooks/Manager.php index 7aa576ec3..887f741b0 100755 --- a/src/Hooks/Manager.php +++ b/src/Hooks/Manager.php @@ -6,6 +6,13 @@ use Models\Hook; abstract class Manager { + protected $hook = null; + + public function __construct(Hook $hook) + { + $this->hook = $hook; + } + /** * Restituisce le informazioni sull'esecuzione dell'hook. * @@ -31,7 +38,7 @@ abstract class Manager } /** - * Restituisce se l'hook ha bisogno di una esecuzione;. + * Restituisce se l'hook ha bisogno di una esecuzione. * * @return bool */ @@ -58,12 +65,8 @@ abstract class Manager * * @return Hook|null */ - protected static function getHook() + protected function getHook() { - $class = get_called_class(); - - $hook = Hook::where('class', $class)->first(); - - return $hook; + return $this->getHook(); } } diff --git a/src/Models/Cache.php b/src/Models/Cache.php new file mode 100755 index 000000000..6348e5e40 --- /dev/null +++ b/src/Models/Cache.php @@ -0,0 +1,89 @@ + 'array', + ]; + + protected $dates = [ + 'expire_at', + ]; + + public static function build($name, $valid_time, $expire_at = null) + { + $model = new self(); + + $model->name = $name; + $model->valid_time = $valid_time; + $model->expire_at = $expire_at; + + $model->save(); + + return $model; + } + + public function isValid() + { + return $this->valid; + } + + public function getValidAttribute() + { + return !empty($this->expire_at) && $this->expire_at->greaterThanOrEqualTo(Carbon::now()); + } + + public function set($content) + { + $this->content = $content; + + return $this->save(); + } + + public function save(array $options = []) + { + if (!empty($this->valid_time)) { + $interval = CarbonInterval::make($this->valid_time); + $this->expire_at = (new Carbon())->add($interval); + } elseif (empty($this->expire_at)) { + $interval = CarbonInterval::make('6 hours'); + $this->expire_at = (new Carbon())->add($interval); + } + + return parent::save($options); + } + + public function delete() + { + if (empty($this->valid_time)) { + return parent::delete(); + } + + return false; + } + + public function scopeValid($query) + { + return $query->where('expire_at', '>', Carbon::now()); + } + + public function scopeInvalid($query) + { + return $query->where('expire_at', '<=', Carbon::now()); + } +} diff --git a/src/Models/Hook.php b/src/Models/Hook.php index d4a3851f8..d628a7e53 100755 --- a/src/Models/Hook.php +++ b/src/Models/Hook.php @@ -119,7 +119,7 @@ class Hook extends Model public function getClass() { $class = $this->class; - $hook = new $class(); + $hook = new $class($this); if (!$hook instanceof Manager) { throw new \UnexpectedValueException(); diff --git a/src/Update.php b/src/Update.php index 4a1b63221..1ccfe6214 100755 --- a/src/Update.php +++ b/src/Update.php @@ -182,8 +182,8 @@ class Update // Normalizzazione di charset e collation self::normalizeDatabase($database->getDatabaseName()); - if (class_exists('\Modules\Aggiornamenti\UpdateHook')) { - \Modules\Aggiornamenti\UpdateHook::update(null); + if (class_exists('\Models\Cache')) { + \Models\Cache::get('Ultima versione di OpenSTAManager disponibile')->set(null); } return true; diff --git a/update/2_4_12.sql b/update/2_4_12.sql index 66f0a1a72..b76c57dd7 100755 --- a/update/2_4_12.sql +++ b/update/2_4_12.sql @@ -14,7 +14,7 @@ UPDATE `in_statiintervento` SET `descrizione` = 'Programmato' WHERE `in_statiint UPDATE `in_interventi` SET `data_scadenza` = NULL WHERE `data_scadenza` = '0000-00-00 00:00:00'; -- Permetti inserimento sessioni anche per altri tecnici -INSERT INTO `zz_settings` (`id`, `nome`, `valore`, `tipo`, `editable`, `sezione`, `created_at`, `updated_at`, `order`, `help`) VALUES (NULL, 'Permetti inserimento sessioni degli altri tecnici', '0', 'boolean', '1', 'Interventi', NULL, NULL, NULL, "Permette al tecnico l\'inserimento delle sessioni di lavoro anche per gli altri tecnici."); +INSERT INTO `zz_settings` (`id`, `nome`, `valore`, `tipo`, `editable`, `sezione`, `order`, `help`) VALUES (NULL, 'Permetti inserimento sessioni degli altri tecnici', '0', 'boolean', '1', 'Interventi', NULL, "Permette al tecnico l\'inserimento delle sessioni di lavoro anche per gli altri tecnici."); -- Aggiunta cartella per il modulo "Movimenti" UPDATE `zz_modules` SET `directory` = 'movimenti' WHERE `name` = 'Movimenti'; diff --git a/update/2_4_14.sql b/update/2_4_14.sql index 1d305ed40..79d5c687f 100755 --- a/update/2_4_14.sql +++ b/update/2_4_14.sql @@ -391,3 +391,20 @@ ORDER BY `data` DESC, CAST(`numero_esterno` AS UNSIGNED) DESC' WHERE `name` = 'O UPDATE `zz_views` SET `query` = 'righe.totale_imponibile' WHERE `id_module` = (SELECT `id` FROM `zz_modules` WHERE `name` = 'Ordini fornitore') AND `name` = 'Totale'; INSERT INTO `zz_views` (`id_module`, `name`, `query`, `order`, `search`, `format`, `default`, `visible`) VALUES ((SELECT `id` FROM `zz_modules` WHERE `name` = 'Ordini fornitore'), 'Totale ivato', 'righe.totale', 5, 1, 1, 1, 1); + +-- Miglioramento della cache interna +CREATE TABLE IF NOT EXISTS `zz_cache` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` VARCHAR(255) NOT NULL, + `content` TEXT NOT NULL, + `valid_time` VARCHAR(255), + `expire_at` timestamp NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB; + +INSERT INTO `zz_cache` (`id`, `name`, `content`, `valid_time`, `expire_at`) VALUES +(NULL, 'Ricevute Elettroniche', '', '1 day', NULL), +(NULL, 'Fatture Elettroniche', '', '1 day', NULL), +(NULL, 'Ultima versione di OpenSTAManager disponibile', '', '7 day', NULL); + +DROP TABLE IF EXISTS `zz_hook_cache`; diff --git a/update/tables.php b/update/tables.php index 7e2c79a0a..6ebf43748 100755 --- a/update/tables.php +++ b/update/tables.php @@ -94,6 +94,7 @@ return [ 'or_statiordine', 'or_tipiordine', 'zz_api_resources', + 'zz_cache', 'zz_currencies', 'zz_checks', 'zz_check_user', @@ -108,7 +109,6 @@ return [ 'zz_group_module', 'zz_group_view', 'zz_hooks', - 'zz_hook_cache', 'zz_logs', 'zz_modules', 'zz_operations',