Aggiornamento cache e CHANGELOG

This commit is contained in:
Thomas Zilio 2020-03-03 10:31:01 +01:00
parent 665dd823ae
commit 9216cd1288
16 changed files with 194 additions and 101 deletions

View File

@ -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. 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.13 (2020-02-05)](#2413-2020-02-05)
- [2.4.12 (2019-12-30)](#2412-2019-12-30) - [2.4.12 (2019-12-30)](#2412-2019-12-30)
- [2.4.11 (2019-11-29)](#2411-2019-11-29) - [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.2 (2016-11-10)](#22-2016-11-10)
- [2.1 (2015-04-02)](#21-2015-04-02) - [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) ## 2.4.13 (2020-02-05)
### Aggiunto (Added) ### Aggiunto (Added)

View File

@ -2,6 +2,7 @@
include_once __DIR__.'/../../core.php'; include_once __DIR__.'/../../core.php';
use Models\Cache;
use Modules\Aggiornamenti\UpdateHook; use Modules\Aggiornamenti\UpdateHook;
$id = post('id'); $id = post('id');
@ -9,7 +10,8 @@ $id = post('id');
switch (filter('op')) { switch (filter('op')) {
case 'check': case 'check':
$result = UpdateHook::isAvailable(); $result = UpdateHook::isAvailable();
UpdateHook::update($result);
Cache::get('Ultima versione di OpenSTAManager disponibile')->set($result);
echo $result; echo $result;

View File

@ -11,16 +11,19 @@ class UpdateHook extends CachedManager
{ {
protected static $client = null; 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() public function response()
{ {
$update = self::getCache()['results']; $update = $this->getCache()->content;
$module = Modules::get('Aggiornamenti'); $module = Modules::get('Aggiornamenti');
$link = ROOTDIR.'/controller.php?id_module='.$module->id; $link = ROOTDIR.'/controller.php?id_module='.$module->id;

View File

@ -3,6 +3,7 @@
namespace Plugins\ImportFE; namespace Plugins\ImportFE;
use API\Services; use API\Services;
use Models\Cache;
/** /**
* Classe per l'interazione con API esterne. * Classe per l'interazione con API esterne.
@ -19,7 +20,7 @@ class Interaction extends Services
$result = self::getFileList($list); $result = self::getFileList($list);
// Aggiornamento cache hook // Aggiornamento cache hook
InvoiceHook::update($result); Cache::get('Fatture Elettroniche')->set($result);
return $result; return $result;
} }

View File

@ -7,16 +7,19 @@ use Modules;
class InvoiceHook extends CachedManager 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() public function response()
{ {
$results = self::getCache()['results']; $results = $this->getCache()->content;
$count = count($results); $count = count($results);
$notify = false; $notify = false;

View File

@ -3,16 +3,12 @@
include_once __DIR__.'/../../core.php'; include_once __DIR__.'/../../core.php';
use Plugins\ReceiptFE\Interaction; use Plugins\ReceiptFE\Interaction;
use Plugins\ReceiptFE\ReceiptHook;
use Plugins\ReceiptFE\Ricevuta; use Plugins\ReceiptFE\Ricevuta;
switch (filter('op')) { switch (filter('op')) {
case 'import': case 'import':
$list = Interaction::getReceiptList(); $list = Interaction::getReceiptList();
// Aggiornamento cache hook
ReceiptHook::update($list);
$results = []; $results = [];
foreach ($list as $element) { foreach ($list as $element) {
$name = $element['name']; $name = $element['name'];

View File

@ -3,6 +3,7 @@
namespace Plugins\ReceiptFE; namespace Plugins\ReceiptFE;
use API\Services; use API\Services;
use Models\Cache;
/** /**
* Classe per l'interazione con API esterne. * Classe per l'interazione con API esterne.
@ -21,7 +22,7 @@ class Interaction extends Services
$list = array_merge($list, $files); $list = array_merge($list, $files);
// Aggiornamento cache hook // Aggiornamento cache hook
ReceiptHook::update($list); Cache::get('Ricevute Elettroniche')->set($list);
return $list; return $list;
} }

View File

@ -7,16 +7,19 @@ use Modules;
class ReceiptHook extends CachedManager 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() public function response()
{ {
$results = self::getCache()['results']; $results = $this->getCache()->content;
$count = count($results); $count = count($results);
$notify = false; $notify = false;

View File

@ -2,95 +2,47 @@
namespace Hooks; namespace Hooks;
use Carbon\Carbon; use Models\Cache;
use Carbon\CarbonInterval; use Models\Hook;
abstract class CachedManager extends Manager abstract class CachedManager extends Manager
{ {
protected static $cache = null; protected $cache = null;
protected static $is_cached = 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() public function needsExecution()
{ {
return !self::isCached(); return !$this->isCached();
} }
public function execute() public function execute()
{ {
if (self::isCached()) { if (!$this->isCached()) {
$results = self::getCache()['results']; $data = $this->cacheData();
} else {
$results = $this->data();
self::update($results); $this->getCache()->set($data);
} }
return $results; return $this->getCache()->content;
} }
public static function getCache() public function getCache()
{ {
if (!isset(self::$cache)) { return $this->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;
} }
public static function update($results) public function isCached()
{ {
$hook = self::getHook(); return $this->getCache()->isValid();
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;
} }
} }

View File

@ -6,6 +6,13 @@ use Models\Hook;
abstract class Manager abstract class Manager
{ {
protected $hook = null;
public function __construct(Hook $hook)
{
$this->hook = $hook;
}
/** /**
* Restituisce le informazioni sull'esecuzione dell'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 * @return bool
*/ */
@ -58,12 +65,8 @@ abstract class Manager
* *
* @return Hook|null * @return Hook|null
*/ */
protected static function getHook() protected function getHook()
{ {
$class = get_called_class(); return $this->getHook();
$hook = Hook::where('class', $class)->first();
return $hook;
} }
} }

89
src/Models/Cache.php Executable file
View File

@ -0,0 +1,89 @@
<?php
namespace Models;
use Carbon\Carbon;
use Carbon\CarbonInterval;
use Common\Model;
use Traits\StoreTrait;
/**
* Risorsa di cache per la gestione delle informazioni temporanee del gestionale.
* Da utilizzare in sola lettura oppure in creazione e diretta scritture.
*/
class Cache extends Model
{
use StoreTrait;
protected $table = 'zz_cache';
protected $casts = [
'content' => '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());
}
}

View File

@ -119,7 +119,7 @@ class Hook extends Model
public function getClass() public function getClass()
{ {
$class = $this->class; $class = $this->class;
$hook = new $class(); $hook = new $class($this);
if (!$hook instanceof Manager) { if (!$hook instanceof Manager) {
throw new \UnexpectedValueException(); throw new \UnexpectedValueException();

View File

@ -182,8 +182,8 @@ class Update
// Normalizzazione di charset e collation // Normalizzazione di charset e collation
self::normalizeDatabase($database->getDatabaseName()); self::normalizeDatabase($database->getDatabaseName());
if (class_exists('\Modules\Aggiornamenti\UpdateHook')) { if (class_exists('\Models\Cache')) {
\Modules\Aggiornamenti\UpdateHook::update(null); \Models\Cache::get('Ultima versione di OpenSTAManager disponibile')->set(null);
} }
return true; return true;

View File

@ -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'; UPDATE `in_interventi` SET `data_scadenza` = NULL WHERE `data_scadenza` = '0000-00-00 00:00:00';
-- Permetti inserimento sessioni anche per altri tecnici -- 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" -- Aggiunta cartella per il modulo "Movimenti"
UPDATE `zz_modules` SET `directory` = 'movimenti' WHERE `name` = 'Movimenti'; UPDATE `zz_modules` SET `directory` = 'movimenti' WHERE `name` = 'Movimenti';

View File

@ -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'; 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 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); ((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`;

View File

@ -94,6 +94,7 @@ return [
'or_statiordine', 'or_statiordine',
'or_tipiordine', 'or_tipiordine',
'zz_api_resources', 'zz_api_resources',
'zz_cache',
'zz_currencies', 'zz_currencies',
'zz_checks', 'zz_checks',
'zz_check_user', 'zz_check_user',
@ -108,7 +109,6 @@ return [
'zz_group_module', 'zz_group_module',
'zz_group_view', 'zz_group_view',
'zz_hooks', 'zz_hooks',
'zz_hook_cache',
'zz_logs', 'zz_logs',
'zz_modules', 'zz_modules',
'zz_operations', 'zz_operations',