1
0
mirror of https://github.com/devcode-it/openstamanager.git synced 2025-02-16 19:40:44 +01:00
This commit is contained in:
loviuz 2019-05-10 11:44:44 +02:00
commit 19d55223cd
28 changed files with 530 additions and 227 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;
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 {
@ -197,4 +197,4 @@
.skin-default .panel-primary .panel-heading {
border-bottom: 2px solid #57a;
}
}

View File

@ -50,6 +50,66 @@ 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, hooks.length);
});
},
});
});
function executeHook(hook, length){
$("#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();
message = \'<li class="hook-element"><a href="\' + (result.link ? result.link : "#") + \'"><i class="\' + result.icon + \'"></i> \' + result.message + \'</a></li>\';
// Inserimento della notifica
if(result.notify) {
hooks_count = $("#hooks-count");
number = parseInt(hooks_count.text());
number = isNaN(number) ? 0 : number;
hooks_count.text(parseInt(number) + 1);
$("#hooks").prepend(message);
} else {
$("#hooks").append(message);
}
// Rimozione eventuale della rotella di caricamento
if($(".hook-element").length == hooks.length) {
$("#hooks-loading").hide();
}
},
});
}
</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 -->
@ -218,26 +218,49 @@ if (Auth::check()) {
'.Translator::dateToLocale($_SESSION['period_start']).' - '.Translator::dateToLocale($_SESSION['period_end']).'
</span>
</div>
<div id="right-menu" class="pull-right">
<button onclick="window.print()" class="btn btn-sm 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').'">
<i class="fa fa-bug"></i>
</a>
<a href="'.$rootdir.'/log.php" class="btn btn-sm 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').'">
<i class="fa fa-info"></i>
</a>
<a href="'.$rootdir.'/index.php?op=logout" class="btn btn-sm btn-danger tip" title="'.tr('Esci').'">
<i class="fa fa-power-off"></i>
</a>
</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">
<span id="hooks-loading"><i class="fa fa-spinner fa-spin"></i></span>
<span id="hooks-count"></span>
</span>
</a>
<ul class="dropdown-menu">
<li><ul class="menu" id="hooks">
</ul></li>
</ul>
</li>
<li><a href="#" onclick="window.print()" class="btn-info tip" title="'.tr('Stampa').'">
<i class="fa fa-print"></i>
</a></li>
<li><a href="'.$rootdir.'/bug.php" class="btn-github tip" title="'.tr('Segnalazione bug').'">
<i class="fa fa-bug"></i>
</a></li>
<li><a href="'.$rootdir.'/log.php" class="btn-github tip" title="'.tr('Log accessi').'">
<i class="fa fa-book"></i>
</a></li>
<li><a href="'.$rootdir.'/info.php" class="btn-github tip" title="'.tr('Informazioni').'">
<i class="fa fa-info"></i>
</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></li>
</ul>
</div>
</nav>
</header>
<aside class="main-sidebar">

View File

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

View File

@ -132,6 +132,7 @@ switch (post('op')) {
// Duplica contratto
case 'copy':
$new = $contratto->replicate();
$new->numero = Contratto::getNextNumero();
$new->idstato = 1;
$new->save();

View File

@ -40,85 +40,76 @@ switch (post('op')) {
case 'update':
if (post('id_record') !== null) {
$idstatodocumento = post('idstatodocumento');
$idpagamento = post('idpagamento');
$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');
$totale_imponibile = get_imponibile_fattura($id_record);
$totale_fattura = get_totale_fattura($id_record);
$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->codice_stato_fe = post('codice_stato_fe') ?: null;
$fattura->id_ritenuta_contributi = post('id_ritenuta_contributi') ?: null;
$data = [];
if ($dir == 'uscita') {
$data = [
'numero' => post('numero'),
'numero_esterno' => post('numero_esterno'),
'idrivalsainps' => post('id_rivalsa_inps'),
'idritenutaacconto' => post('id_ritenuta_acconto'),
];
$fattura->numero = post('numero');
$fattura->numero_esterno = post('numero_esterno');
$fattura->idrivalsainps = post('id_rivalsa_inps');
$fattura->idritenutaacconto = post('id_ritenuta_acconto');
}
// Leggo la descrizione del pagamento
$query = 'SELECT descrizione FROM co_pagamenti WHERE id='.prepare($idpagamento);
$rs = $dbo->fetchArray($query);
$pagamento = $rs[0]['descrizione'];
$fattura->addebita_bollo = post('addebita_bollo');
$bollo_automatico = post('bollo_automatico');
if (empty($bollo_automatico)) {
$fattura->bollo = post('bollo');
} else {
$fattura->bollo = null;
}
// Query di aggiornamento
$dbo->update('co_documenti', array_merge([
'data' => post('data'),
'data_ricezione' => post('data_ricezione'),
'numero_esterno' => post('numero_esterno'),
'note' => post('note'),
'note_aggiuntive' => post('note_aggiuntive'),
'idstatodocumento' => $idstatodocumento,
'idtipodocumento' => post('idtipodocumento'),
'idanagrafica' => post('idanagrafica'),
'idagente' => post('idagente'),
'idpagamento' => $idpagamento,
'idbanca' => post('idbanca'),
'idcausalet' => post('idcausalet'),
'idspedizione' => post('idspedizione'),
'idporto' => post('idporto'),
'idaspettobeni' => post('idaspettobeni'),
'idvettore' => post('idvettore'),
'idsede' => post('idsede'),
'idconto' => post('idconto'),
'split_payment' => post('split_payment') ?: 0,
'is_fattura_conto_terzi' => post('is_fattura_conto_terzi') ?: 0,
'n_colli' => post('n_colli'),
'tipo_resa' => post('tipo_resa'),
'addebita_bollo' => post('addebita_bollo'),
'bollo' => 0,
'rivalsainps' => 0,
'ritenutaacconto' => 0,
'iva_rivalsainps' => 0,
'codice_stato_fe' => post('codice_stato_fe') ?: null,
'id_ritenuta_contributi' => post('id_ritenuta_contributi') ?: null,
], $data), ['id' => $id_record]);
$query = 'SELECT descrizione FROM co_statidocumento WHERE id='.prepare($idstatodocumento);
$rs = $dbo->fetchArray($query);
$fattura->save();
// Ricalcolo inps, ritenuta e bollo (se la fattura non è stata pagata)
ricalcola_costiagg_fattura($id_record);
$stato = $fattura->stato;
// Elimino la scadenza e tutti i movimenti, poi se la fattura è emessa le ricalcolo
if ($rs[0]['descrizione'] == 'Bozza' or $rs[0]['descrizione'] == 'Annullata') {
if ($stato['descrizione'] == 'Bozza' or $stato['descrizione'] == 'Annullata') {
elimina_scadenza($id_record);
//elimina_movimento($id_record, 0);
//elimino movimento anche prima nota (se pagata o parzialmente pagata)
elimina_movimento($id_record, 1);
} elseif ($rs[0]['descrizione'] == 'Emessa') {
} elseif ($stato['descrizione'] == 'Emessa') {
elimina_scadenza($id_record);
elimina_movimento($id_record, 0);
} elseif (($rs[0]['descrizione'] == 'Pagato' or $rs[0]['descrizione'] == 'Parzialmente pagato') and ($dbo->fetchNum('SELECT id FROM co_scadenziario WHERE iddocumento = '.prepare($id_record)) == 0)) {
} elseif (($stato['descrizione'] == 'Pagato' or $stato['descrizione'] == 'Parzialmente pagato') and ($dbo->fetchNum('SELECT id FROM co_scadenziario WHERE iddocumento = '.prepare($id_record)) == 0)) {
// aggiungo la scadenza come già pagata
aggiungi_scadenza($id_record, $pagamento, 1);
aggiungi_scadenza($id_record, null, 1);
aggiungi_movimento($id_record, $dir);
}
// Se la fattura è in stato "Emessa" posso inserirla in scadenzario e aprire il mastrino cliente
if ($rs[0]['descrizione'] == 'Emessa') {
aggiungi_scadenza($id_record, $pagamento);
if ($stato['descrizione'] == 'Emessa') {
aggiungi_scadenza($id_record);
aggiungi_movimento($id_record, $dir);
}

View File

@ -221,21 +221,6 @@ if (empty($record['is_fiscale'])) {
</div>
</div>
<?php
if ($dir == 'uscita') {
?>
<div class="row">
<div class="col-md-3">
{[ "type": "number", "label": "<?php echo tr('Marca da bollo'); ?>", "name": "bollo", "value": "$bollo$", "help": "<?php echo tr('Applicato solo se il totale della fattura è maggiore di _MONEY_', [
'_MONEY_' => moneyFormat(setting("Soglia minima per l'applicazione della marca da bollo")),
]),'.'; ?>" ]}
</div>
</div>
<?php
}
?>
<div class="row">
<div class="col-md-3">
{[ "type": "checkbox", "label": "<?php echo tr('Split payment'); ?>", "name": "split_payment", "value": "$split_payment$", "help": "<?php echo tr('Abilita lo split payment per questo documento. Le aliquote iva con natura N6 (reverse charge) non saranno disponibili.'); ?>", "placeholder": "<?php echo tr('Split payment'); ?>" ]}
@ -256,11 +241,6 @@ if ($dir == 'uscita') {
<div class="col-md-3">
{[ "type": "select", "label": "<?php echo tr('Ritenuta contributi'); ?>", "name": "id_ritenuta_contributi", "value": "$id_ritenuta_contributi$", "values": "query=SELECT * FROM co_ritenuta_contributi" ]}
</div>
<div class="col-md-3">
{[ "type": "checkbox", "label": "<?php echo tr('Addebita marca da bollo'); ?>", "name": "addebita_bollo", "value": "$addebita_bollo$" ]}
</div>
</div>
<div class="row">
@ -278,6 +258,38 @@ if ($dir == 'uscita') {
</div>
<?php
echo '
<div class="box box-info">
<div class="box-header with-border">
<h3 class="box-title"><i class="fa fa-certificate "></i> '.tr('Marca da bollo').'</h3>
</div>
<div class="box-body">
<div class="row">
<div class="col-md-4">
{[ "type": "checkbox", "label": "'.tr('Addebita marca da bollo').'", "name": "addebita_bollo", "value": "$addebita_bollo$" ]}
</div>
<div class="col-md-4">
{[ "type": "checkbox", "label": "'.tr('Marca da bollo automatica').'", "name": "bollo_automatico", "value": "'.intval(!isset($record['bollo'])).'", "help": "'.tr("Seleziona per impostare automaticamente l'importo della marca da bollo").'. '.tr('Applicata solo se il totale della fattura è maggiore di _MONEY_', [
'_MONEY_' => moneyFormat(setting("Soglia minima per l'applicazione della marca da bollo")),
]).'.", "placeholder": "'.tr('Bollo automatico').'" ]}
</div>
<div class="col-md-4">
{[ "type": "number", "label": "'.tr('Importo marca da bollo').'", "name": "bollo", "value": "$bollo$", "disabled": '.intval(!isset($record['bollo'])).' ]}
</div>
<script type="text/javascript">
$(document).ready(function() {
$("#bollo_automatico").click(function(){
$("#bollo").attr("disabled", $(this).is(":checked"));
});
});
</script>
</div>
</div>
</div>';
if ($tipodoc == 'Fattura accompagnatoria di vendita') {
echo '

View File

@ -696,25 +696,22 @@ 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 (!empty($rsa[$i]['idarticolo'])) {
add_movimento_magazzino($rsa[$i]['idarticolo'], $rsa[$i]['qta'], ['iddocumento' => $id_documento]);
}
}else{
$qta_evasa = $rsa[$i]['qta_evasa'] + $riga['qta'];
// Ripristino le quantità da evadere nel preventivo
$dbo->update('co_righe_preventivi',
[
'qta_evasa' => $qta_evasa,
],
[
'id' => $rsa[$i]['id'],
]
);
}
if ($riga['is_preventivo']) {
if (!empty($rsa[$i]['idarticolo'])) {
add_movimento_magazzino($rsa[$i]['idarticolo'], $rsa[$i]['qta'], ['iddocumento' => $id_documento]);
}
} else {
$qta_evasa = $rsa[$i]['qta_evasa'] + $riga['qta'];
// Ripristino le quantità da evadere nel preventivo
$dbo->update('co_righe_preventivi',
[
'qta_evasa' => $qta_evasa,
],
[
'id' => $rsa[$i]['id'],
]
);
}
}
}
@ -723,33 +720,24 @@ 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 (!empty($rsa[$i]['idarticolo'])) {
add_movimento_magazzino($rsa[$i]['idarticolo'], $rsa[$i]['qta'], ['iddocumento' => $id_documento]);
}
}else{
$qta_evasa = $rsa[$i]['qta_evasa'] + $riga['qta'];
// Ripristino le quantità da evadere nel contratto
$dbo->update('co_righe_contratti',
[
'qta_evasa' => $qta_evasa,
],
[
'id' => $rsa[$i]['id'],
]
);
}
if ($riga['is_contratto']) {
if (!empty($rsa[$i]['idarticolo'])) {
add_movimento_magazzino($rsa[$i]['idarticolo'], $rsa[$i]['qta'], ['iddocumento' => $id_documento]);
}
} else {
$qta_evasa = $rsa[$i]['qta_evasa'] + $riga['qta'];
// Ripristino le quantità da evadere nel contratto
$dbo->update('co_righe_contratti',
[
'qta_evasa' => $qta_evasa,
],
[
'id' => $rsa[$i]['id'],
]
);
}
}
}
//Rimozione righe generiche
if (empty($riga['idarticolo'])) {

View File

@ -396,7 +396,12 @@ class Fattura extends Document
public function save(array $options = [])
{
// Fix dei campi statici
$this->calcolaMarcaDaBollo();
$bollo = $this->bollo;
if ($bollo == null) {
$bollo = $this->calcolaMarcaDaBollo();
}
$this->manageRigaMarcaDaBollo($bollo, $this->addebita_bollo);
$this->attributes['ritenutaacconto'] = $this->ritenuta_acconto;
$this->attributes['iva_rivalsainps'] = $this->iva_rivalsa_inps;
@ -529,12 +534,15 @@ class Fattura extends Document
// Se l'importo è negativo può essere una nota di credito, quindi cambio segno alla marca da bollo
$marca_da_bollo = abs($marca_da_bollo);
$this->bollo = $marca_da_bollo;
return $marca_da_bollo;
}
protected function manageRigaMarcaDaBollo($marca_da_bollo, $addebita_bollo)
{
$riga = $this->rigaBollo;
// Rimozione riga bollo se nullo
if (empty($this->addebita_bollo) || empty($marca_da_bollo)) {
if (empty($addebita_bollo) || empty($marca_da_bollo)) {
if (!empty($riga)) {
$this->id_riga_bollo = null;

View File

@ -3,36 +3,31 @@
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) );
$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));
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 (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){
$msg = tr('_NUM_ tipologi_A_ iva eliminat_A_.', [
'_NUM_' => $count_iva,
'_A_' => ($count_iva==1) ? 'a' : 'e']);
flash()->info($msg);
}
else{
flash()->warning(tr('Nessuna tipologia iva eliminata!'));
if ($count_iva > 0) {
$msg = tr('_NUM_ tipologi_A_ iva eliminat_A_.', [
'_NUM_' => $count_iva,
'_A_' => ($count_iva == 1) ? 'a' : 'e', ]);
flash()->info($msg);
} else {
flash()->warning(tr('Nessuna tipologia iva eliminata!'));
}
break;
}
@ -41,4 +36,4 @@ $bulk = [
'delete-bulk' => tr('Elimina selezionati'),
];
return $bulk;
return $bulk;

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 '
@ -114,4 +113,4 @@ if ($res) {
<a class="btn btn-danger ask" data-backto="record-list">
<i class="fa fa-trash"></i> '.tr('Elimina').'
</a>';
}
}

View File

@ -100,6 +100,7 @@ switch (post('op')) {
// Duplica preventivo
case 'copy':
$new = $preventivo->replicate();
$new->numero = Preventivo::getNextNumero();
$new->idstato = 1;
$new->master_revision = $preventivo->id;
$new->save();

View File

@ -82,7 +82,7 @@ foreach ($widgets as $widget) {
echo '
<tr class="'.$class.'">
<td>'.$widget['widget_name'].((!empty($widget['help'])) ? ' <i class="tip fa fa-question-circle-o" class="tip" title="'.$widget['help'].'"</i>' : '').'</td>
<td>'.$widget['widget_name'].((!empty($widget['help'])) ? ' <i class="tip fa fa-question-circle-o" class="tip" title="'.$widget['help'].'"</i>' : '').'</td>
<td align="right"><small>'.$location.'</small></td>
<td align="center">'.$stato.'</td>
<td align="center">'.$posizione.'</td>

View File

@ -802,11 +802,11 @@ class FatturaElettronica
if (!empty($element['num_item'])) {
$dati['NumItem'] = $element['num_item'];
}
if (!empty($element['codice_cup'])) {
if (!empty($element['codice_cup'])) {
$dati['CodiceCUP'] = $element['codice_cup'];
}
if (!empty($element['codice_cig'])) {
$dati['CodiceCIG'] = $element['codice_cig'];
}

View File

@ -37,7 +37,7 @@ if (!empty($list)) {
}
echo '
<button type="button" class="btn btn-warning" onclick="download(this, \''.$element.'\')">
<button type="button" class="btn btn-warning" '.((!extension_loaded('ssl') and strpos($element, 'p7m') !== false) ? 'disabled' : '').' onclick="download(this, \''.$element.'\')">
<i class="fa fa-download"></i> '.tr('Importa').'
</button>
</td>

View File

@ -37,7 +37,7 @@ echo '
<div class="row" >
<div class="col-md-6">
<h4>'.
$ragione_sociale.'<br>
$ragione_sociale.' '.((empty($idanagrafica = $dbo->fetchOne('SELECT idanagrafica FROM an_anagrafiche WHERE ( codice_fiscale = '.prepare($codice_fiscale).' AND codice_fiscale != \'\' ) OR ( piva = '.prepare($partita_iva).' AND piva != \'\' ) ')['idanagrafica'])) ? '<span class="badge badge-success" >'.tr('Nuova').'</span>' : '<small>'.Modules::link('Anagrafiche', $idanagrafica, '', null, '')).'</small>'.'<br>
<small>
'.(!empty($codice_fiscale) ? (tr('Codice Fiscale').': '.$codice_fiscale.'<br>') : '').'
'.(!empty($partita_iva) ? (tr('Partita IVA').': '.$partita_iva.'<br>') : '').'
@ -169,17 +169,43 @@ if (!empty($righe)) {
$query .= ' ORDER BY descrizione ASC';
/*Visualizzo codici articoli*/
$codici_articoli = '';
//caso di un solo codice articolo
if (isset($riga['CodiceArticolo']) and empty($riga['CodiceArticolo'][0]['CodiceValore'])) {
$riga['CodiceArticolo'][0]['CodiceValore'] = $riga['CodiceArticolo']['CodiceValore'];
$riga['CodiceArticolo'][0]['CodiceTipo'] = $riga['CodiceArticolo']['CodiceTipo'];
}
foreach ($riga['CodiceArticolo'] as $key => $item) {
foreach ($item as $key => $name) {
if ($key == 'CodiceValore') {
if (!empty($item['CodiceValore'])) {
$codici_articoli .= '<small>'.$item['CodiceValore'].' ('.$item['CodiceTipo'].')</small>';
if (($item['CodiceValore'] != end($riga['CodiceArticolo'][(count($riga['CodiceArticolo']) - 1)])) and (is_array($riga['CodiceArticolo'][1]))) {
$codici_articoli .= ', ';
}
}
}
}
}
/*###*/
echo '
<tr>
<td>
'.$riga['Descrizione'].'<br>
'.(($codici_articoli != '') ? $codici_articoli.'<br>' : '').'
<small>'.tr('Q.: _QTA_ _UM_', [
'_QTA_' => Translator::numberToLocale($riga['Quantita']),
'_UM_' => $riga['UnitaMisura'],
]).'</small><br>
<small>'.tr('Aliquota IVA _VALUE_ _DESC_', [
<small>'.tr('Aliquota IVA: _VALUE_ _DESC_', [
'_VALUE_' => empty($riga['Natura']) ? numberFormat($riga['AliquotaIVA']).'%' : $riga['Natura'],
'_DESC_' => $riga['RiferimentoNormativo'] ? ' - '.$riga['RiferimentoNormativo'] : '',
]).'</small>

View File

@ -70,7 +70,7 @@ class FatturaElettronica
$module = Modules::get('Fatture di acquisto');
$plugin = $module->plugins->first(function ($value, $key) {
return $value->name = 'Fatturazione Elettronica';
return $value->name == 'Fatturazione Elettronica';
});
self::$directory = DOCROOT.'/'.$plugin->upload_directory;

View File

@ -0,0 +1,37 @@
<?php
namespace Plugins\ImportFE;
use Common\HookManager;
use Modules;
class InvoiceHook extends HookManager
{
public function manage()
{
$list = Interaction::listToImport();
return $list;
}
public function response($results)
{
$count = count($results);
$module = Modules::get('Fatture di acquisto');
$plugin = $module->plugins->first(function ($value, $key) {
return $value->name == 'Fatturazione Elettronica';
});
$link = ROOTDIR.'/controller.php?id_module='.$module->id.'#tab_'.$plugin->id;
return [
'icon' => 'fa fa-file-text-o',
'link' => $link,
'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,37 @@
<?php
namespace Plugins\ReceiptFE;
use Common\HookManager;
use Modules;
class ReceiptHook extends HookManager
{
public function manage()
{
$list = Interaction::getReceiptList();
return $list;
}
public function response($results)
{
$count = count($results);
$module = Modules::get('Fatture di vendita');
$plugin = $module->plugins->first(function ($value, $key) {
return $value->name == 'Ricevute FE';
});
$link = ROOTDIR.'/controller.php?id_module='.$module->id.'#tab_'.$plugin->id;
return [
'icon' => 'fa fa-dot-circle-o',
'link' => $link,
'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);

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

@ -0,0 +1,84 @@
<?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'];
// Interpretazione della cache
$results = json_decode($results, true);
} else {
$results = $hook->manage();
// Rimozione cache precedente
$database = database();
$database->delete('zz_hook_cache', [
'hook_id' => $this->id,
]);
// Aggiunta del risultato come cache
$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

@ -21,8 +21,8 @@ foreach ($prefixes as $prefix) {
$replaces[$prefix.'piva'] = !empty($replaces[$prefix.'piva']) ? 'P.Iva/C.F.: '.$replaces[$prefix.'piva'] : '';
$replaces[$prefix.'codicefiscale'] = '';
}
$replaces[$prefix.'codice_destinatario'] = !empty($replaces[$prefix.'codice_destinatario']) ? 'Cod.Fatturazione: '.$replaces[$prefix.'codice_destinatario'] : '';
$replaces[$prefix.'codice_destinatario'] = !empty($replaces[$prefix.'codice_destinatario']) ? 'Cod.Fatturazione: '.$replaces[$prefix.'codice_destinatario'] : '';
$replaces[$prefix.'capsoc'] = !empty($replaces[$prefix.'capsoc']) ? 'Cap.Soc.: '.$replaces[$prefix.'capsoc'] : '';
$replaces[$prefix.'sitoweb'] = !empty($replaces[$prefix.'sitoweb']) ? 'Web: '.$replaces[$prefix.'sitoweb'] : '';
$replaces[$prefix.'telefono'] = !empty($replaces[$prefix.'telefono']) ? 'Tel: '.$replaces[$prefix.'telefono'] : '';

View File

@ -253,7 +253,8 @@ INSERT INTO `zz_settings` (`id`, `nome`, `valore`, `tipo`, `editable`, `sezione`
ALTER TABLE `zz_settings` CHANGE `help` `help` varchar(255);
UPDATE `zz_settings` SET `help` = NULL WHERE `help` = '';
ALTER TABLE `co_documenti` CHANGE `data_stato_fe` `data_stato_fe` TIMESTAMP NULL, ADD `addebita_bollo` BOOLEAN NOT NULL DEFAULT TRUE, ADD `id_riga_bollo` int(11), ADD FOREIGN KEY (`id_riga_bollo`) REFERENCES `co_righe_documenti`(`id`) ON DELETE SET NULL;
ALTER TABLE `co_documenti` CHANGE `bollo` `bollo` decimal(12,4), CHANGE `data_stato_fe` `data_stato_fe` TIMESTAMP NULL, ADD `addebita_bollo` BOOLEAN NOT NULL DEFAULT TRUE, ADD `id_riga_bollo` int(11), ADD FOREIGN KEY (`id_riga_bollo`) REFERENCES `co_righe_documenti`(`id`) ON DELETE SET NULL;
UPDATE `co_documenti` SET `bollo` = NULL;
UPDATE `co_documenti` SET `data_ricezione` = NULL WHERE `data_ricezione` = '0000-00-00';
UPDATE `co_documenti` SET `data_stato_fe` = NULL WHERE `data_stato_fe` = '0000-00-00 00:00:00';
@ -343,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';
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',