Aggiornamento cache e CHANGELOG
This commit is contained in:
parent
665dd823ae
commit
9216cd1288
23
CHANGELOG.md
23
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)
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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'];
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
return $this->cache;
|
||||
}
|
||||
|
||||
self::$cache = $cache;
|
||||
}
|
||||
|
||||
return self::$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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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`;
|
||||
|
|
|
@ -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',
|
||||
|
|
Loading…
Reference in New Issue