Introduzione hooks (#569)

This commit is contained in:
Thomas Zilio 2019-05-09 21:32:06 -07:00
parent ccc37d7fec
commit 19564d5955
22 changed files with 406 additions and 180 deletions

View File

@ -2,6 +2,8 @@
include_once __DIR__.'/core.php';
use Models\Hook;
switch (get('op')) {
// Imposta un valore ad un array di $_SESSION
// esempio: push di un valore in $_SESSION['dashboard']['idtecnici']
@ -77,5 +79,31 @@ switch (get('op')) {
]);
echo json_encode($datas);
break;
case 'hooks':
$hooks = Hook::all();
$results = [];
foreach ($hooks as $hook) {
$results[] = [
'id' => $hook->id,
'name' => $hook->name,
];
}
echo json_encode($results);
break;
case 'hook':
$hook_id = filter('id');
$hook = Hook::find($hook_id);
$response = $hook->execute();
echo json_encode($response);
break;
}

View File

@ -61,14 +61,6 @@ a.disabled {
margin: 8px 0 0 0;
}
#right-menu {
padding: 10px;
}
#right-menu .fa-info {
padding: 0 5px
}
.ui-menu {
position: fixed;
}
@ -336,6 +328,11 @@ span.form-control {
color: #3C8DBC;
}
.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a, .navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a, .navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a
{
white-space: normal;
}
.nav-tabs-custom>.nav-tabs.pull-right>li>a.back-btn:hover {
cursor: pointer;
color: #72AFD2;

View File

@ -41,19 +41,19 @@
color: #72AFD2;
}
.skin-default .main-header .navbar {
.skin-default .main-header .navbar > span {
color: #eee;
background: #222;
border: none;
}
.skin-default .main-header .navbar .nav li a
.skin-default .main-header .navbar .nav li a:hover,
.skin-default .main-header .navbar .nav li a:active,
.skin-default .main-header .navbar .nav li a:focus,
.skin-default .main-header .navbar .nav .open a,
.skin-default .main-header .navbar .nav .open a:hover,
.skin-default .main-header .navbar .nav .open a:focus,
.skin-default .main-header .navbar .nav > li > a
.skin-default .main-header .navbar .nav > li > a:hover,
.skin-default .main-header .navbar .nav > li > a:active,
.skin-default .main-header .navbar .nav > li > a:focus,
.skin-default .main-header .navbar .nav .open > a,
.skin-default .main-header .navbar .nav .open > a:hover,
.skin-default .main-header .navbar .nav .open > a:focus,
.skin-default .main-header .navbar .nav .active a,
.skin-default .main-header .navbar .nav .actual a,
.skin-default .main-header .navbar .nav .menu-open a {

View File

@ -50,6 +50,56 @@ if (Auth::check()) {
echo '
<style>'.$custom_css.'</style>';
}
// Hooks
echo '
<script>
$(document).ready(function() {
$.ajax({
url: globals.rootdir + "/ajax.php",
type: "get",
data: {
op: "hooks",
},
success: function(data) {
hooks = JSON.parse(data);
hooks.forEach(function(item, index){
executeHook(item);
});
},
});
});
function executeHook(hook){
$("#hooks").append("<li id=\"hook-loader-" + hook.id + "\"><a href=\"#\">'.tr('Hook _NAME_ in esecuzione', [
'_NAME_' => '\"" + hook.name + "\"',
]).'</a></li>");
$.ajax({
url: globals.rootdir + "/ajax.php",
type: "get",
data: {
op: "hook",
id: hook.id,
},
success: function(data) {
result = JSON.parse(data);
$("#hook-loader-" + hook.id).remove();
$("#hooks").append("<li><a href=\"#\"><i class=\"" + result.icon + "\"></i> " + result.message + "</a></li>");
$("#hook-header").hide();
if(result.notify) {
number = parseInt($("#hook-count").text());
number = isNaN(number) ? 0 : number;
$("#hook-count").text(parseInt(number) + 1);
}
},
});
}
</script>';
}
echo '

View File

@ -0,0 +1,10 @@
<?php
namespace Common;
abstract class HookManager
{
abstract public function manage();
abstract public function response($results);
}

View File

@ -196,7 +196,7 @@ if (Auth::check()) {
<div id="tiny-loader" style="display:none;"></div>
<header class="main-header">
<a href="https://www.openstamanager.com" class="logo" title="'.tr('Il gestionale open source per l\'assistenza tecnica e la fatturazione').'" target="_blank">
<a href="https://www.openstamanager.com" class="logo" title="'.tr("Il gestionale open source per l'assistenza tecnica e la fatturazione").'" target="_blank">
<!-- mini logo for sidebar mini 50x50 pixels -->
<span class="logo-mini">'.tr('OSM').'</span>
<!-- logo for regular state and mobile devices -->
@ -219,25 +219,46 @@ if (Auth::check()) {
</span>
</div>
<!-- Navbar Right Menu -->
<div class="navbar-custom-menu" id="right-menu">
<ul class="nav navbar-nav">
<li class="dropdown notifications-menu">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
<i class="fa fa-bell-o"></i>
<span class="label label-warning" id="hook-count"></span>
</a>
<ul class="dropdown-menu">
<li class="header" id="hook-header">'.tr('Caricamento in corso').'</li>
<li><ul class="menu" id="hooks">
<div id="right-menu" class="pull-right">
<button onclick="window.print()" class="btn btn-sm btn-info tip" title="'.tr('Stampa').'">
</ul></li>
</ul>
</li>
<li><a href="#" onclick="window.print()" class="btn-info tip" title="'.tr('Stampa').'">
<i class="fa fa-print"></i>
</button>
<a href="'.$rootdir.'/bug.php" class="btn btn-sm btn-github tip" title="'.tr('Segnalazione bug').'">
</a></li>
<li><a href="'.$rootdir.'/bug.php" class="btn-github tip" title="'.tr('Segnalazione bug').'">
<i class="fa fa-bug"></i>
</a>
<a href="'.$rootdir.'/log.php" class="btn btn-sm btn-github tip" title="'.tr('Log accessi').'">
</a></li>
<li><a href="'.$rootdir.'/log.php" class="btn-github tip" title="'.tr('Log accessi').'">
<i class="fa fa-book"></i>
</a>
<a href="'.$rootdir.'/info.php" class="btn btn-sm btn-github tip" title="'.tr('Informazioni').'">
</a></li>
<li><a href="'.$rootdir.'/info.php" class="btn-github tip" title="'.tr('Informazioni').'">
<i class="fa fa-info"></i>
</a>
<a href="'.$rootdir.'/index.php?op=logout" class="btn btn-sm btn-danger tip" title="'.tr('Esci').'">
</a></li>
<li><a href="'.$rootdir.'/index.php?op=logout" class="btn-danger tip" title="'.tr('Esci').'">
<i class="fa fa-power-off"></i>
</a>
</a></li>
</ul>
</div>
</nav>
</header>
<aside class="main-sidebar">

View File

@ -85,7 +85,7 @@ switch ($resource) {
break;
case 'get_mansioni':
$q = "SELECT DISTINCT mansione FROM an_referenti";
$q = 'SELECT DISTINCT mansione FROM an_referenti';
$rs = $dbo->fetchArray($q);
$n = sizeof($rs);

View File

@ -40,36 +40,36 @@ switch (post('op')) {
case 'update':
if (post('id_record') !== null) {
$fattura->data=post('data');
$fattura->data_ricezione=post('data_ricezione');
$fattura->numero_esterno=post('numero_esterno');
$fattura->note=post('note');
$fattura->note_aggiuntive=post('note_aggiuntive');
$fattura->data = post('data');
$fattura->data_ricezione = post('data_ricezione');
$fattura->numero_esterno = post('numero_esterno');
$fattura->note = post('note');
$fattura->note_aggiuntive = post('note_aggiuntive');
$fattura->idstatodocumento=post('idstatodocumento');
$fattura->idtipodocumento=post('idtipodocumento');
$fattura->idanagrafica=post('idanagrafica');
$fattura->idagente=post('idagente');
$fattura->idpagamento=post('idpagamento');
$fattura->idbanca=post('idbanca');
$fattura->idcausalet=post('idcausalet');
$fattura->idspedizione=post('idspedizione');
$fattura->idporto=post('idporto');
$fattura->idaspettobeni=post('idaspettobeni');
$fattura->idvettore=post('idvettore');
$fattura->idsede=post('idsede');
$fattura->idconto=post('idconto');
$fattura->split_payment=post('split_payment') ?: 0;
$fattura->is_fattura_conto_terzi=post('is_fattura_conto_terzi') ?: 0;
$fattura->n_colli=post('n_colli');
$fattura->tipo_resa=post('tipo_resa');
$fattura->idstatodocumento = post('idstatodocumento');
$fattura->idtipodocumento = post('idtipodocumento');
$fattura->idanagrafica = post('idanagrafica');
$fattura->idagente = post('idagente');
$fattura->idpagamento = post('idpagamento');
$fattura->idbanca = post('idbanca');
$fattura->idcausalet = post('idcausalet');
$fattura->idspedizione = post('idspedizione');
$fattura->idporto = post('idporto');
$fattura->idaspettobeni = post('idaspettobeni');
$fattura->idvettore = post('idvettore');
$fattura->idsede = post('idsede');
$fattura->idconto = post('idconto');
$fattura->split_payment = post('split_payment') ?: 0;
$fattura->is_fattura_conto_terzi = post('is_fattura_conto_terzi') ?: 0;
$fattura->n_colli = post('n_colli');
$fattura->tipo_resa = post('tipo_resa');
$fattura->rivalsainps=0;
$fattura->ritenutaacconto=0;
$fattura->iva_rivalsainps=0;
$fattura->rivalsainps = 0;
$fattura->ritenutaacconto = 0;
$fattura->iva_rivalsainps = 0;
$fattura->codice_stato_fe=post('codice_stato_fe') ?: null;
$fattura->id_ritenuta_contributi=post('id_ritenuta_contributi') ?: null;
$fattura->codice_stato_fe = post('codice_stato_fe') ?: null;
$fattura->id_ritenuta_contributi = post('id_ritenuta_contributi') ?: null;
if ($dir == 'uscita') {
$fattura->numero = post('numero');
@ -78,11 +78,11 @@ switch (post('op')) {
$fattura->idritenutaacconto = post('id_ritenuta_acconto');
}
$fattura->addebita_bollo=post('addebita_bollo');
$fattura->addebita_bollo = post('addebita_bollo');
$bollo_automatico = post('bollo_automatico');
if (empty($bollo_automatico)){
if (empty($bollo_automatico)) {
$fattura->bollo = post('bollo');
}else{
} else {
$fattura->bollo = null;
}

View File

@ -711,13 +711,11 @@ function rimuovi_riga_fattura($id_documento, $id_riga, $dir)
//rimetto a magazzino gli articoli collegati al preventivo
$rsa = $dbo->fetchArray('SELECT id, idarticolo, qta FROM co_righe_preventivi WHERE idpreventivo = '.prepare($riga['idpreventivo']));
for ($i = 0; $i < sizeof($rsa); ++$i) {
if ($riga['is_preventivo']){
if ($riga['is_preventivo']) {
if (!empty($rsa[$i]['idarticolo'])) {
add_movimento_magazzino($rsa[$i]['idarticolo'], $rsa[$i]['qta'], ['iddocumento' => $id_documento]);
}
}else{
} else {
$qta_evasa = $rsa[$i]['qta_evasa'] + $riga['qta'];
// Ripristino le quantità da evadere nel preventivo
$dbo->update('co_righe_preventivi',
@ -728,7 +726,6 @@ function rimuovi_riga_fattura($id_documento, $id_riga, $dir)
'id' => $rsa[$i]['id'],
]
);
}
}
}
@ -738,13 +735,11 @@ function rimuovi_riga_fattura($id_documento, $id_riga, $dir)
//rimetto a magazzino gli articoli collegati al contratto
$rsa = $dbo->fetchArray('SELECT id, idarticolo, qta FROM co_righe_contratti WHERE idcontratto = '.prepare($riga['idcontratto']));
for ($i = 0; $i < sizeof($rsa); ++$i) {
if ($riga['is_contratto']){
if ($riga['is_contratto']) {
if (!empty($rsa[$i]['idarticolo'])) {
add_movimento_magazzino($rsa[$i]['idarticolo'], $rsa[$i]['qta'], ['iddocumento' => $id_documento]);
}
}else{
} else {
$qta_evasa = $rsa[$i]['qta_evasa'] + $riga['qta'];
// Ripristino le quantità da evadere nel contratto
$dbo->update('co_righe_contratti',
@ -755,17 +750,10 @@ function rimuovi_riga_fattura($id_documento, $id_riga, $dir)
'id' => $rsa[$i]['id'],
]
);
}
}
}
//Rimozione righe generiche
if (empty($riga['idarticolo'])) {
// TODO: possibile ambiguità tra righe molto simili tra loro

View File

@ -396,9 +396,10 @@ class Fattura extends Document
public function save(array $options = [])
{
// Fix dei campi statici
$bollo =$this->bollo;
if( $bollo == null)
$bollo = $this->bollo;
if ($bollo == null) {
$bollo = $this->calcolaMarcaDaBollo();
}
$this->manageRigaMarcaDaBollo($bollo, $this->addebita_bollo);
@ -536,8 +537,8 @@ class Fattura extends Document
return $marca_da_bollo;
}
protected function manageRigaMarcaDaBollo($marca_da_bollo, $addebita_bollo){
protected function manageRigaMarcaDaBollo($marca_da_bollo, $addebita_bollo)
{
$riga = $this->rigaBollo;
// Rimozione riga bollo se nullo

View File

@ -3,35 +3,30 @@
include_once __DIR__.'/../../core.php';
switch (post('op')) {
case 'delete-bulk':
$count_iva = $dbo->fetchNum('SELECT id FROM `co_iva` WHERE deleted_at IS NOT NULL');
foreach ($id_records as $id) {
$res = $dbo->fetchNum('SELECT `co_righe_documenti`.`id` FROM `co_righe_documenti` WHERE `co_righe_documenti`.`idiva`='.prepare($id).
' UNION SELECT `co_righe_preventivi`.`id` FROM `co_righe_preventivi` WHERE `co_righe_preventivi`.`idiva` = '.prepare($id).
' UNION SELECT `co_righe_contratti`.`id` FROM `co_righe_contratti` WHERE `co_righe_contratti`.`idiva` = '.prepare($id).
' UNION SELECT `dt_righe_ddt`.`id` FROM `dt_righe_ddt` WHERE `dt_righe_ddt`.`idiva` = '.prepare($id).
' UNION SELECT `or_righe_ordini`.`id` FROM `or_righe_ordini` WHERE `or_righe_ordini`.`idiva` = '.prepare($id).
' UNION SELECT `mg_articoli`.`id` FROM `mg_articoli` WHERE `mg_articoli`.`idiva_vendita` = '.prepare($id).
' UNION SELECT `an_anagrafiche`.`idanagrafica` AS `id` FROM `an_anagrafiche` WHERE `an_anagrafiche`.`idiva_vendite` = '.prepare($id).' OR `an_anagrafiche`.`idiva_acquisti` = '.prepare($id) );
' UNION SELECT `an_anagrafiche`.`idanagrafica` AS `id` FROM `an_anagrafiche` WHERE `an_anagrafiche`.`idiva_vendite` = '.prepare($id).' OR `an_anagrafiche`.`idiva_acquisti` = '.prepare($id));
if (empty($res)) {
$dbo->query('UPDATE `co_iva` SET deleted_at = NOW() WHERE id = '.prepare($id).Modules::getAdditionalsQuery($id_module));
}
}
$count_iva = $dbo->fetchNum('SELECT id FROM `co_iva` WHERE deleted_at IS NOT NULL') - $count_iva;
if ($count_iva>0){
if ($count_iva > 0) {
$msg = tr('_NUM_ tipologi_A_ iva eliminat_A_.', [
'_NUM_' => $count_iva,
'_A_' => ($count_iva==1) ? 'a' : 'e']);
'_A_' => ($count_iva == 1) ? 'a' : 'e', ]);
flash()->info($msg);
}
else{
} else {
flash()->warning(tr('Nessuna tipologia iva eliminata!'));
}
break;

View File

@ -101,8 +101,7 @@ $res = $dbo->fetchNum('SELECT `co_righe_documenti`.`id` FROM `co_righe_documenti
' UNION SELECT `dt_righe_ddt`.`id` FROM `dt_righe_ddt` WHERE `dt_righe_ddt`.`idiva` = '.prepare($id_record).
' UNION SELECT `or_righe_ordini`.`id` FROM `or_righe_ordini` WHERE `or_righe_ordini`.`idiva` = '.prepare($id_record).
' UNION SELECT `mg_articoli`.`id` FROM `mg_articoli` WHERE `mg_articoli`.`idiva_vendita` = '.prepare($id_record).
' UNION SELECT `an_anagrafiche`.`idanagrafica` AS `id` FROM `an_anagrafiche` WHERE `an_anagrafiche`.`idiva_vendite` = '.prepare($id_record).' OR `an_anagrafiche`.`idiva_acquisti` = '.prepare($id_record) );
' UNION SELECT `an_anagrafiche`.`idanagrafica` AS `id` FROM `an_anagrafiche` WHERE `an_anagrafiche`.`idiva_vendite` = '.prepare($id_record).' OR `an_anagrafiche`.`idiva_acquisti` = '.prepare($id_record));
if ($res) {
echo '

View File

@ -0,0 +1,28 @@
<?php
namespace Plugins\ImportFE;
use Common\HookManager;
class InvoiceHook extends HookManager
{
public function manage()
{
$list = Interaction::listToImport();
return $list;
}
public function response($results)
{
$count = count($results);
return [
'icon' => 'fa fa-file-text-o ',
'message' => tr('Ci sono _NUM_ fatture remote da importare', [
'_NUM_' => $count,
]),
'notify' => !empty($count),
];
}
}

View File

@ -6,22 +6,6 @@ use Plugins\ReceiptFE\Interaction;
use Plugins\ReceiptFE\Ricevuta;
switch (filter('op')) {
case 'save':
$content = file_get_contents($_FILES['blob']['tmp_name']);
$file = FatturaElettronica::store($_FILES['blob']['name'], $content);
if (FatturaElettronica::isValid($file)) {
echo json_encode([
'filename' => $file,
]);
} else {
echo json_encode([
'already' => 1,
]);
}
break;
case 'import':
$list = Interaction::getReceiptList();

View File

@ -0,0 +1,28 @@
<?php
namespace Plugins\ReceiptFE;
use Common\HookManager;
class ReceiptHook extends HookManager
{
public function manage()
{
$list = Interaction::getReceiptList();
return $list;
}
public function response($results)
{
$count = count($results);
return [
'icon' => 'fa fa-dot-circle-o',
'message' => tr('Ci sono _NUM_ ricevute da importare', [
'_NUM_' => $count,
]),
'notify' => !empty($count),
];
}
}

View File

@ -452,7 +452,7 @@ class Database extends Util\Singleton
if (!empty($order)) {
foreach ((array) $order as $key => $value) {
$order = is_numeric($key) ? 'ASC' : strtoupper($value);
$field = is_numeric($key) ? $value : key;
$field = is_numeric($key) ? $value : $key;
if ($order == 'ASC') {
$statement = $statement->orderBy($field);

76
src/Models/Hook.php Normal file
View File

@ -0,0 +1,76 @@
<?php
namespace Models;
use Carbon\Carbon;
use Carbon\CarbonInterval;
use Common\Model;
use Traits\StoreTrait;
class Hook extends Model
{
use StoreTrait;
protected $table = 'zz_hooks';
protected $cached = null;
protected $use_cached = null;
public function getIsCachedAttribute()
{
if (!isset($this->use_cached)) {
$cache = $this->cache;
$use_cached = false;
if (!empty($cache)) {
$date = new Carbon($cache['created_at']);
$interval = CarbonInterval::make($this->frequency);
$date = $date->add($interval);
$now = new Carbon();
$use_cached = $date->greaterThan($now);
}
$this->use_cached = $use_cached;
}
return $this->use_cached;
}
public function execute()
{
$class = $this->class;
$hook = new $class();
if ($this->is_cached) {
$results = $this->cache['results'];
$results = json_decode($results, true);
} else {
$results = $hook->manage();
$cache = json_encode($results);
database()->insert('zz_hook_cache', [
'hook_id' => $this->id,
'results' => $cache,
]);
$this->cached = null;
$this->getCacheAttribute();
}
return $hook->response($results);
}
public function getCacheAttribute()
{
if (!isset($this->cached)) {
$cache = database()->selectOne('zz_hook_cache', '*', ['hook_id' => $this->id], ['id' => 'DESC']);
$this->cached = $cache;
}
return $this->cached;
}
}

View File

@ -344,10 +344,29 @@ UPDATE `zz_views` SET `order` = 10 WHERE `id_module` IN (SELECT `id` FROM `zz_mo
UPDATE `zz_views` SET `order` = 11 WHERE `id_module` IN (SELECT `id` FROM `zz_modules` WHERE `name` IN('Ddt di vendita', 'Ddt di acquisto')) AND `name` = 'icon_title_Stato';
UPDATE `zz_views` SET `order` = 12 WHERE `id_module` IN (SELECT `id` FROM `zz_modules` WHERE `name` IN('Ddt di vendita', 'Ddt di acquisto')) AND `name` = 'dir';
-- Aggiornamento widget "Fatturato" (iva esclusa)
UPDATE `zz_widgets` SET `query` = 'SELECT CONCAT_WS('' '', REPLACE(REPLACE(REPLACE(FORMAT((SELECT SUM(subtotale-sconto-co_righe_documenti.ritenutaacconto)), 2), '','', ''#''), ''.'', '',''), ''#'', ''.''), ''&euro;'') AS dato FROM (co_righe_documenti INNER JOIN co_documenti ON co_righe_documenti.iddocumento=co_documenti.id) INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id WHERE co_tipidocumento.dir=''entrata'' |segment| AND data >= ''|period_start|'' AND data <= ''|period_end|'' AND 1=1', `help` = 'Fatturato IVA esclusa.' WHERE `zz_widgets`.`name` = 'Fatturato';
-- Aggiornamento widget "Acquisti" (iva esclusa)
UPDATE `zz_widgets` SET `query` = 'SELECT CONCAT_WS('' '', REPLACE(REPLACE(REPLACE(FORMAT((SELECT SUM(subtotale-sconto-co_righe_documenti.ritenutaacconto)), 2), '','', ''#''), ''.'', '',''), ''#'', ''.''), ''&euro;'') AS dato FROM (co_righe_documenti INNER JOIN co_documenti ON co_righe_documenti.iddocumento=co_documenti.id) INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id WHERE co_tipidocumento.dir=''uscita'' |segment| AND data >= ''|period_start|'' AND data <= ''|period_end|'' AND 1=1', `help` = 'Fatturato IVA esclusa.' WHERE `zz_widgets`.`name` = 'Acquisti';
-- Sistema Hook
CREATE TABLE IF NOT EXISTS `zz_hooks` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`class` varchar(255) NOT NULL,
`frequency` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS `zz_hook_cache` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`hook_id` int(11) NOT NULL,
`results` TEXT NOT NULL,
PRIMARY KEY (`id`),
FOREIGN KEY (`hook_id`) REFERENCES `zz_hooks`(`id`)
) ENGINE=InnoDB;
INSERT INTO `zz_hooks` (`id`, `name`, `class`, `frequency`) VALUES
(NULL, 'Ricevute', 'Plugins\\ReceiptFE\\ReceiptHook', '1 day'),
(NULL, 'Fatture', 'Plugins\\ImportFE\\InvoiceHook', '1 day');

View File

@ -92,6 +92,8 @@ return [
'zz_groups',
'zz_group_module',
'zz_group_view',
'zz_hooks',
'zz_hook_cache',
'zz_logs',
'zz_modules',
'zz_operations',