Merge branch 'master' into 2.4.2

This commit is contained in:
Thomas Zilio 2018-08-29 18:15:12 +02:00
commit f01e4526f9
31 changed files with 263 additions and 133 deletions

View File

@ -170,15 +170,11 @@ if (!empty($result_query) && $result_query != 'menu' && $result_query != 'custom
// Icona di stampa
elseif ($field == '_print_') {
$print_url = $r['_print_'];
$print = $r['_print_'];
preg_match_all('/\$(.+?)\$/', $print_url, $matches);
$print_url = Prints::getHref($print, $r['id']);
for ($m = 0; $m < sizeof($matches[0]); ++$m) {
$print_url = str_replace($matches[0][$m], $r[$matches[1][$m]], $print_url);
}
$value = '<a href="'.$rootdir.'/'.$print_url.'" target="_blank"><i class="fa fa-2x fa-print"></i></a>';
$value = '<a href="'.$print_url.'" target="_blank"><i class="fa fa-2x fa-print"></i></a>';
}
// Icona

View File

@ -71,7 +71,7 @@ if (!empty($rsi)) {
</td>
<td class="text-right">
'.Translator::numberToLocale($int['totale']).'
'.Translator::numberToLocale($int['totale_scontato']).'
</td>
</tr>';
@ -203,7 +203,7 @@ if (!empty($rsi)) {
$totale_km += $int['km'];
$totale_costo += $int['totale_costo'];
$totale_addebito += $int['totale_addebito'];
$totale += $int['totale'];
$totale += $int['totale_scontato'];
}
// Totali

View File

@ -165,7 +165,7 @@ switch (filter('op')) {
$idstatointervento = 'WIP';
//calcolo codice intervento
$formato = get_var('Formato codice intervento');
$formato = setting('Formato codice intervento');
$template = str_replace('#', '%', $formato);
$rs = $dbo->fetchArray('SELECT codice FROM in_interventi WHERE codice=(SELECT MAX(CAST(codice AS SIGNED)) FROM in_interventi) AND codice LIKE '.prepare($template).' ORDER BY codice DESC LIMIT 0,1');

View File

@ -10,13 +10,21 @@ switch (post('op')) {
$totale_n_ddt = 0;
// Informazioni della fattura
$tipo_documento = $dbo->selectOne('co_tipidocumento', 'id', ['descrizione' => 'Fattura immediata di vendita'])['id'];
$dir = 'entrata';
if( $dir == 'entrata' ){
$tipo_documento = $dbo->selectOne('co_tipidocumento', 'id', ['descrizione' => 'Fattura immediata di vendita'])['id'];
$module_name = 'Fatture di vendita';
$idconto = setting('Conto predefinito fatture di vendita');
} else {
$tipo_documento = $dbo->selectOne('co_tipidocumento', 'id', ['descrizione' => 'Fattura immediata di acquisto'])['id'];
$module_name = 'Fatture di acquisto';
$idconto = setting('Conto predefinito fatture di acquisto');
}
$idiva = setting('Iva predefinita');
$data = date('Y-m-d');
// Segmenti
$id_fatture = Modules::get('Fatture di vendita')['id'];
$id_fatture = Modules::get($module_name)['id'];
if (!isset($_SESSION['module_'.$id_fatture]['id_segment'])) {
$segments = Modules::getSegments($id_fatture);
$_SESSION['module_'.$id_fatture]['id_segment'] = isset($segments[0]['id']) ? $segments[0]['id'] : null;
@ -68,12 +76,11 @@ switch (post('op')) {
$id_documento = $dbo->lastInsertedID();
$id_documento_cliente[$id_anagrafica] = $id_documento;
++$totale_n_ddt;
}
// Inserimento righe
foreach ($righe as $riga) {
++$totale_n_ddt;
$qta = $riga['qta'] - $riga['qta_evasa'];
if ($qta > 0) {
@ -145,10 +152,7 @@ switch (post('op')) {
$operations = [
'delete-bulk' => tr('Elimina selezionati'),
];
if (Modules::get('Ddt di vendita')['id'] == $id_module) {
$operations['crea_fattura'] = [
'crea_fattura' => [
'text' => tr('Crea fattura'),
'data' => [
'msg' => tr('Vuoi davvero creare una fattura per questi interventi?'),
@ -156,7 +160,7 @@ if (Modules::get('Ddt di vendita')['id'] == $id_module) {
'class' => 'btn btn-lg btn-warning',
'blank' => false,
],
];
}
]
];
return $operations;

View File

@ -122,16 +122,21 @@ switch (post('op')) {
}
// Elimino la scadenza e tutti i movimenti, poi se la fattura è emessa le ricalcolo
if ($rs[0]['descrizione'] == 'Bozza') {
if ($rs[0]['descrizione'] == 'Bozza' or $rs[0]['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') {
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)) {
//aggiungo la scadenza come già pagata
aggiungi_scadenza($id_record, $pagamento, 1);
aggiungi_movimento($id_record, $dir);
}
// Se la fattura è in stato "Emessa" posso inserirla in scadenziario e aprire il mastrino cliente
// 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);
aggiungi_movimento($id_record, $dir);
@ -1482,6 +1487,7 @@ switch (post('op')) {
// Nota di credito
case 'nota_credito':
$id_segment = post('id_segment');
$data = post('data');
$numero = get_new_numerofattura($record['data']);
$numero_esterno = get_new_numerosecondariofattura($record['data']);
@ -1490,7 +1496,7 @@ switch (post('op')) {
$idconto = $rs[0]['idconto'];
$ref_documento = $id_record;
$dbo->query('INSERT INTO co_documenti (numero, numero_esterno, ref_documento, idanagrafica, idconto, idtipodocumento, idpagamento, idbanca, data, idstatodocumento, idsede, id_segment) SELECT '.prepare($numero).', '.prepare($numero_esterno).', '.prepare($ref_documento).', idanagrafica, idconto, (SELECT `id` FROM `co_tipidocumento` WHERE `descrizione`=\'Nota di credito\' AND dir = \'entrata\'), idpagamento, idbanca, data, (SELECT `id` FROM `co_statidocumento` WHERE `descrizione`=\'Bozza\'), idsede, '.prepare($id_segment).' FROM co_documenti AS t WHERE id = '.prepare($id_record));
$dbo->query('INSERT INTO co_documenti (numero, numero_esterno, ref_documento, idanagrafica, idconto, idtipodocumento, idpagamento, idbanca, data, idstatodocumento, idsede, id_segment) SELECT '.prepare($numero).', '.prepare($numero_esterno).', '.prepare($ref_documento).', idanagrafica, idconto, (SELECT `id` FROM `co_tipidocumento` WHERE `descrizione`=\'Nota di accredito\' AND dir = \'entrata\'), idpagamento, idbanca, '.prepare($data).', (SELECT `id` FROM `co_statidocumento` WHERE `descrizione`=\'Bozza\'), idsede, '.prepare($id_segment).' FROM co_documenti AS t WHERE id = '.prepare($id_record));
$id_record = $dbo->lastInsertedID();
// Lettura di tutte le righe della tabella in arrivo
@ -1561,12 +1567,17 @@ switch (post('op')) {
// Nota di debito
if (get('op') == 'nota_addebito') {
$id_segment = $record['id_segment'];
$rs_segment = $dbo->fetchArray("SELECT * FROM zz_segments WHERE predefined_addebito='1'");
if (sizeof($rs_segment) > 0) {
$id_segment = $rs_segment[0]['id'];
} else {
$id_segment = $record['id_segment'];
}
$numero = get_new_numerofattura($record['data']);
$numero_esterno = get_new_numerosecondariofattura($record['data']);
$dbo->query('INSERT INTO co_documenti (numero, numero_esterno, ref_documento, idanagrafica, idconto, idtipodocumento, idpagamento, idbanca, data, idstatodocumento, idsede, id_segment) SELECT '.prepare($numero).', '.prepare($numero_esterno).', '.prepare($id_record).', idanagrafica, idconto, (SELECT `id` FROM `co_tipidocumento` WHERE `descrizione`=\'Nota di debito\' AND dir = \'entrata\'), idpagamento, idbanca, data, (SELECT `id` FROM `co_statidocumento` WHERE `descrizione`=\'Bozza\'), idsede, id_segment FROM co_documenti AS t WHERE id = '.prepare($id_record));
$dbo->query('INSERT INTO co_documenti (numero, numero_esterno, ref_documento, idanagrafica, idconto, idtipodocumento, idpagamento, idbanca, data, idstatodocumento, idsede, id_segment) SELECT '.prepare($numero).', '.prepare($numero_esterno).', '.prepare($id_record).', idanagrafica, idconto, (SELECT `id` FROM `co_tipidocumento` WHERE `descrizione`=\'Nota di addebito\' AND dir = \'entrata\'), idpagamento, idbanca, data, (SELECT `id` FROM `co_statidocumento` WHERE `descrizione`=\'Bozza\'), idsede, '.prepare($id_segment).' FROM co_documenti AS t WHERE id = '.prepare($id_record));
$id_record = $dbo->lastInsertedID();
}

View File

@ -113,12 +113,20 @@ if (!empty($rs)) {
<div class="col-md-6">
{[ "type": "date", "label": "'.tr('Data del documento').'", "name": "data", "required": 1, "value": "-now-" ]}
</div>';
if ($module_name == 'Fatture di vendita' || $module_name == 'Fatture di acquisto') {
echo '
$rs_segment = $dbo->fetchArray("SELECT * FROM zz_segments WHERE predefined_accredito='1'");
if($op=='nota_accredito' && sizeof($rs_segment)>0){
echo '
<div class="col-md-6">
{[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "values": "query=SELECT id, name AS descrizione FROM zz_segments WHERE id_module='.prepare(Modules::get($module_name)['id']).' ORDER BY name", "value": "'.$rs_segment[0]['id'].'" ]}
</div>';
} else {
echo '
<div class="col-md-6">
{[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "values": "query=SELECT id, name AS descrizione FROM zz_segments WHERE id_module='.prepare(Modules::get($module_name)['id']).' ORDER BY name", "value": "'.$_SESSION['module_'.Modules::get($module_name)['id']]['id_segment'].'" ]}
</div>';
}
}
echo

View File

@ -84,7 +84,8 @@ if ($dir == 'entrata') {
</div>
<div class="col-md-3">
{[ "type": "select", "label": "<?php echo tr('Stato'); ?>", "name": "idstatodocumento", "required": 1, "values": "query=SELECT * FROM co_statidocumento", "value": "$idstatodocumento$", "class": "unblockable", "extra": " onchange = \"if ($('#idstatodocumento option:selected').text()=='Pagato'){if( confirm('Sicuri di voler impostare manualmente la fattura come pagata senza aggiungerla in prima nota?') ){ return true; }else{ $('#idstatodocumento').selectSet(<?php echo $record['idstatodocumento']; ?>); }}\" " ]}
<!-- TODO: Rimuovere possibilità di selezionare lo stato pagato obbligando l'utente ad aggiungere il movimento in prima nota -->
{[ "type": "select", "label": "<?php echo tr('Stato'); ?>", "name": "idstatodocumento", "required": 1, "values": "query=SELECT * FROM co_statidocumento", "value": "$idstatodocumento$", "class": "unblockable", "extra": " onchange = \"if ($('#idstatodocumento option:selected').text()=='Pagato' || $('#idstatodocumento option:selected').text()=='Parzialmente pagato' ){if( confirm('<?php echo tr('Sicuro di voler impostare manualmente la fattura come pagata senza aggiungere il movimento in prima nota?'); ?>') ){ return true; }else{ $('#idstatodocumento').selectSet(<?php echo $record['idstatodocumento']; ?>); }}\" " ]}
</div>
</div>

View File

@ -10,33 +10,33 @@ function get_new_numerofattura($data)
$dbo = Database::getConnection();
if ($dir == 'uscita') {
// recupero maschera per questo segmento
$rs_maschera = $dbo->fetchArray('SELECT pattern FROM zz_segments WHERE id = '.prepare($id_segment));
// esempio: ####/YY
$maschera = $rs_maschera[0]['pattern'];
// recupero maschera per questo segmento
$rs_maschera = $dbo->fetchArray('SELECT pattern FROM zz_segments WHERE id = '.prepare($id_segment));
// esempio: ####/YY
$maschera = $rs_maschera[0]['pattern'];
// estraggo blocchi di caratteri standard da sostituire
preg_match('/[#]+/', $maschera, $m1);
preg_match('/[Y]+/', $maschera, $m2);
// estraggo blocchi di caratteri standard da sostituire
preg_match('/[#]+/', $maschera, $m1);
preg_match('/[Y]+/', $maschera, $m2);
$query = "SELECT numero FROM co_documenti WHERE DATE_FORMAT(data,'%Y') = ".prepare(date('Y', strtotime($data))).' AND id_segment = '.prepare($id_segment);
$query = "SELECT numero FROM co_documenti WHERE DATE_FORMAT(data,'%Y') = ".prepare(date('Y', strtotime($data))).' AND id_segment = '.prepare($id_segment);
$pos1 = strpos($maschera, $m1[0]);
if ($pos1 == 0) {
$query .= ' ORDER BY CAST(numero AS UNSIGNED) DESC LIMIT 0,1';
} else {
$query .= ' ORDER BY numero DESC LIMIT 0,1';
}
$pos1 = strpos($maschera, $m1[0]);
if ($pos1 == 0) {
$query .= ' ORDER BY CAST(numero AS UNSIGNED) DESC LIMIT 0,1';
} else {
$query .= ' ORDER BY numero DESC LIMIT 0,1';
}
$rs_ultima_fattura = $dbo->fetchArray($query);
$rs_ultima_fattura = $dbo->fetchArray($query);
if ($dir == 'uscita') {
$numero = Util\Generator::generate($maschera, $rs_ultima_fattura[0]['numero']);
} else {
$query = "SELECT IFNULL(MAX(numero),'0') AS max_numerofattura FROM co_documenti WHERE DATE_FORMAT( data, '%Y' ) = ".prepare(date('Y', strtotime($data))).' AND idtipodocumento IN(SELECT id FROM co_tipidocumento WHERE dir = '.prepare($dir).') ORDER BY CAST(numero AS UNSIGNED) DESC LIMIT 0, 1';
$rs = $dbo->fetchArray($query);
$numero = $rs[0]['max_numerofattura'] + 1;
// NB: Fatture di vendita ($dir = entrata)
// il campo numero per questa tipologia di documento è nascosto nel modulo, ma poi viene utilizzato
// come numero di protocollo nelle stampe fiscali, calcolo quindi un progressivo semplice (es. 1, 2, 3, etc)
$numero = Util\Generator::generate('#', $rs_ultima_fattura[0]['numero']);
}
return $numero;
@ -95,8 +95,9 @@ function elimina_scadenza($iddocumento)
* Funzione per ricalcolare lo scadenzario di una determinata fattura
* $iddocumento string E' l'id del documento di cui ricalcolare lo scadenzario
* $pagamento string Nome del tipo di pagamento. Se è vuoto lo leggo da co_pagamenti_documenti, perché significa che devo solo aggiornare gli importi.
* $pagato boolean Indica se devo segnare l'importo come pagato
*/
function aggiungi_scadenza($iddocumento, $pagamento = '')
function aggiungi_scadenza($iddocumento, $pagamento = '', $pagato = 0)
{
$dbo = Database::getConnection();
@ -176,11 +177,29 @@ function aggiungi_scadenza($iddocumento, $pagamento = '')
}
$dbo->query('INSERT INTO co_scadenziario(iddocumento, data_emissione, scadenza, da_pagare, pagato, tipo) VALUES('.prepare($iddocumento).', '.prepare($data).', '.prepare($scadenza).', '.prepare($da_pagare).", 0, 'fattura')");
if ($pagato){
$id_scadenza = $dbo->lastInsertedID();
$dbo->update('co_scadenziario', [
'pagato' => $da_pagare,
'data_pagamento' => $data,
], ['id' => $id_scadenza]);
}
}
// Se c'è una ritenuta d'acconto, la aggiungo allo scadenzario
if ($dir == 'uscita' && $ritenutaacconto > 0) {
$dbo->query('INSERT INTO co_scadenziario(iddocumento, data_emissione, scadenza, da_pagare, pagato, tipo) VALUES('.prepare($iddocumento).', '.prepare($data).', '.prepare(date('Y-m', strtotime($data.' +1 month')).'-15').', '.prepare(-$ritenutaacconto).", 0, 'ritenutaacconto')");
if ($pagato){
$id_scadenza = $dbo->lastInsertedID();
$dbo->update('co_scadenziario', [
'pagato' => -$ritenutaacconto,
'data_pagamento' => $data,
], ['id' => $id_scadenza]);
}
}
return true;
@ -481,7 +500,7 @@ function get_imponibile_fattura($iddocumento)
$query = 'SELECT SUM(co_righe_documenti.subtotale - co_righe_documenti.sconto) AS imponibile FROM co_righe_documenti GROUP BY iddocumento HAVING iddocumento='.prepare($iddocumento);
$rs = $dbo->fetchArray($query);
return $rs[0]['imponibile'];
return sum($rs[0]['imponibile'], null, 2);
}
/**
@ -516,7 +535,7 @@ function get_totale_fattura($iddocumento)
get_imponibile_fattura($iddocumento),
$rs2[0]['rivalsainps'],
$totale_iva,
]);
], null, 2);
return $totale;
}
@ -535,7 +554,7 @@ function get_netto_fattura($iddocumento)
get_totale_fattura($iddocumento),
$rs[0]['bollo'],
-$rs[0]['ritenutaacconto'],
]);
], null, 2);
return $netto_a_pagare;
}
@ -855,11 +874,13 @@ function rimuovi_riga_fattura($id_documento, $id_riga, $dir)
if (!empty($riga['idordine'])) {
$dbo->query('UPDATE or_righe_ordini SET qta_evasa=qta_evasa-'.$riga['qta'].' WHERE qta='.prepare($riga['qta']).' AND idarticolo='.prepare($riga['idarticolo']).' AND idordine='.prepare($riga['idordine']));
}
}
// Nota di credito
if (!empty($riga['ref_riga_documento'])) {
$dbo->query('UPDATE co_righe_documenti SET qta_evasa = qta_evasa+'.$riga['qta'].' WHERE id='.prepare($riga['ref_riga_documento']));
// Nota di accredito
if (!empty($riga['ref_riga_documento'])) {
$dbo->query('UPDATE co_righe_documenti SET qta_evasa = qta_evasa+'.$riga['qta'].' WHERE id='.prepare($riga['ref_riga_documento']));
if (!empty($riga['idarticolo'])) {
$serials = array_column($serials, 'serial');
$serials = array_filter($serials, function ($value) { return !empty($value); });

View File

@ -59,14 +59,14 @@ $_SESSION['superselect']['idanagrafica'] = $record['idanagrafica'];
<div class="col-md-6">
<?php
$rs = $dbo->fetchArray('SELECT id, idcontratto FROM co_contratti_promemoria WHERE idintervento='.prepare($id_record));
/*$rs = $dbo->fetchArray('SELECT id, idcontratto FROM co_contratti_promemoria WHERE idintervento='.prepare($id_record));
if (count($rs) == 1) {
$idcontratto = $rs[0]['idcontratto'];
$idcontratto_riga = $rs[0]['id'];
} else {
$idcontratto = '';
$idcontratto_riga = '';
}
}*/
if (($idcontratto != '')) {
echo '
@ -74,7 +74,7 @@ $_SESSION['superselect']['idanagrafica'] = $record['idanagrafica'];
}
?>
{[ "type": "select", "label": "<?php echo tr('Contratto'); ?>", "name": "idcontratto", "value": "<?php echo $idcontratto; ?>", "ajax-source": "contratti", "readonly": "<?php echo $record['flag_completato']; ?>" ]}
{[ "type": "select", "label": "<?php echo tr('Contratto'); ?>", "name": "idcontratto", "value": "<?php echo $record['idcontratto']; ?>", "ajax-source": "contratti", "readonly": "<?php echo $record['flag_completato']; ?>" ]}
<input type='hidden' name='idcontratto_riga' value='<?php echo $idcontratto_riga; ?>'>
</div>
</div>

View File

@ -3,7 +3,7 @@
include_once __DIR__.'/../../core.php';
if (isset($id_record)) {
$record = $dbo->fetchOne('SELECT *, (SELECT completato FROM in_statiintervento WHERE idstatointervento=in_interventi.idstatointervento) AS flag_completato, IF((in_interventi.idsede = 0), (SELECT idzona FROM an_anagrafiche WHERE idanagrafica = in_interventi.idanagrafica), (SELECT idzona FROM an_sedi WHERE id = in_interventi.idsede)) AS idzona, (SELECT colore FROM in_statiintervento WHERE idstatointervento=in_interventi.idstatointervento) AS colore, (SELECT idpreventivo FROM co_preventivi_interventi WHERE idintervento=in_interventi.id LIMIT 0,1) AS idpreventivo FROM in_interventi WHERE id='.prepare($id_record).Modules::getAdditionalsQuery($id_module));
$record = $dbo->fetchOne('SELECT *, (SELECT completato FROM in_statiintervento WHERE idstatointervento=in_interventi.idstatointervento) AS flag_completato, IF((in_interventi.idsede = 0), (SELECT idzona FROM an_anagrafiche WHERE idanagrafica = in_interventi.idanagrafica), (SELECT idzona FROM an_sedi WHERE id = in_interventi.idsede)) AS idzona, (SELECT colore FROM in_statiintervento WHERE idstatointervento=in_interventi.idstatointervento) AS colore, (SELECT idcontratto FROM co_contratti_promemoria WHERE idintervento=in_interventi.id LIMIT 0,1) AS idcontratto, (SELECT idpreventivo FROM co_preventivi_interventi WHERE idintervento=in_interventi.id LIMIT 0,1) AS idpreventivo FROM in_interventi WHERE id='.prepare($id_record).Modules::getAdditionalsQuery($id_module));
}
$jscript_modules[] = $rootdir.'/modules/interventi/js/interventi_helperjs.js';

View File

@ -53,7 +53,7 @@ if (!empty($results)) {
</table>';
} else {
echo '
<p>'.tr('Nessun intervento su questo impianto').'...</p>';
<div class=\'alert alert-info\' ><i class=\'fa fa-info-circle\'></i> '.tr('Nessun intervento su questo impianto').'.</div>';
}
echo '

View File

@ -43,6 +43,9 @@ if (!empty($record['immagine'])) {
<div class="clearfix"></div>
<div class="col-md-12">
<?php
echo Modules::link('Anagrafiche', $record['idanagrafica'], null, null, 'class="pull-right"');
?>
{[ "type": "select", "label": "<?php echo tr('Cliente'); ?>", "name": "idanagrafica", "required": 1, "values": "query=SELECT an_anagrafiche.idanagrafica AS id, ragione_sociale AS descrizione FROM an_anagrafiche INNER JOIN (an_tipianagrafiche_anagrafiche INNER JOIN an_tipianagrafiche ON an_tipianagrafiche_anagrafiche.idtipoanagrafica=an_tipianagrafiche.idtipoanagrafica) ON an_anagrafiche.idanagrafica=an_tipianagrafiche_anagrafiche.idanagrafica WHERE descrizione='Cliente' AND deleted_at IS NULL ORDER BY ragione_sociale", "value": "$idanagrafica$", "extra": "", "ajax-source": "clienti" ]}
</div>
</div>

View File

@ -235,7 +235,7 @@ if (!empty($rs2)) {
echo '
<div class="clearfix"></div>
<div class="col-md-12">
<div class="alert alert-info">'.tr('Nessun intervento collegato a questo componente!').'</div>
<div class="alert alert-info"><i class=\'fa fa-info-circle\'></i> '.tr('Nessun intervento collegato a questo componente!').'</div>
</div>';
}
@ -254,27 +254,30 @@ if (!empty($rs2)) {
// Pulsante Salva/Elimina
echo '
<div class="col-md-12">
<button type="submit" class="btn btn-success"><i class="fa fa-check"></i> '.tr('Salva modifiche').'</button>
<button type="submit" class="btn btn-success"><i class="fa fa-check"></i> '.tr('Salva modifiche').'</button>';
<a class="btn btn-danger ask" data-backto="record-edit" data-op="unlinkcomponente" data-id="'.$rs2[$j]['id'].'">
// Sostituisci componente con un altro dello stesso tipo, posso sostituire solo i componenti installati
if (empty($rs2[$j]['data_sostituzione'])) {
echo "
<button class=\"btn btn-warning\" onclick=\"if( confirm('".tr('Vuoi sostituire questo componente con un altro dello stesso tipo?')."') ){ location.href='".$rootdir.'/editor.php?id_module='.$id_module.'&id_record='.$id_record.'&op=sostituiscicomponente&backto=record-edit&filename='.$filename.'&id='.$rs2[$j]['id']."'; }\"><i class='fa fa-refresh'></i> ".tr('Sostituisci questo componente').'</button>';
} else {
echo '
<button class="btn btn-warning disabled" disabled>'.tr('Componente già sostituito').'</button>';
}
echo '
<a class="btn btn-danger ask" data-backto="record-edit" data-op="unlinkcomponente" data-id="'.$rs2[$j]['id'].'">
<i class="fa fa-trash"></i> '.tr('Elimina').'
</a>
</div>';
</a>';
// Sostituisci componente con un altro dello stesso tipo, posso sostituire solo i componenti installati
echo '
<div class="col-md-12">';
if (empty($rs2[$j]['data_sostituzione'])) {
echo "
<a href=\"javascript:;\" class=\"text-warning\" onclick=\"if( confirm('".tr('Vuoi sostituire questo componente con un altro dello stesso tipo?')."') ){ location.href='".$rootdir.'/editor.php?id_module='.$id_module.'&id_record='.$id_record.'&op=sostituiscicomponente&backto=record-edit&filename='.$filename.'&id='.$rs2[$j]['id']."'; }\"><i class='fa fa-refresh'></i> ".tr('Sostituisci questo componente').'</a><br><br>';
} else {
echo '
<p class="text-danger">'.tr('Componente già sostituito').'</p>';
}
echo '
echo '
</div>
</form>
</div>
</div>
@ -285,7 +288,7 @@ if (!empty($rs2)) {
</div>';
} else {
echo '
<p>'.tr('Nessun componente inserito').'.</p>';
<div class=\'alert alert-info\' ><i class=\'fa fa-info-circle\'></i> '.tr('Nessun componente inserito').'.</div>';
}
echo '

View File

@ -27,19 +27,20 @@ function get_new_numerosecondarioordine($data)
$dbo = Database::getConnection();
$query = "SELECT numero_esterno FROM or_ordini WHERE DATE_FORMAT( data, '%Y' ) = ".prepare(date('Y', strtotime($data))).' AND idtipoordine IN(SELECT id FROM or_tipiordine WHERE dir='.prepare($dir).') ORDER BY CAST(numero_esterno AS UNSIGNED) DESC LIMIT 0,1';
// Calcolo il numero secondario se stabilito dalle impostazioni e se documento di vendita
$formato_numero_secondario = setting('Formato numero secondario ordine');
$formato_numero_secondario = str_replace('#', '%', $formato_numero_secondario);
$query = 'SELECT numero_esterno FROM or_ordini WHERE DATE_FORMAT( data, "%Y" ) = '.prepare(date('Y', strtotime($data))).' AND idtipoordine IN(SELECT id FROM or_tipiordine WHERE dir='.prepare($dir).') AND numero_esterno LIKE('.prepare(Util\Generator::complete($formato_numero_secondario)).') ORDER BY CAST(numero AS UNSIGNED) DESC LIMIT 0,1';
$rs = $dbo->fetchArray($query);
$numero_secondario = $rs[0]['numero_esterno'];
// Calcolo il numero secondario se stabilito dalle impostazioni e se documento di vendita
$formato_numero_secondario = setting('Formato numero secondario ordine');
if ($numero_secondario == '') {
$numero_secondario = $formato_numero_secondario;
$numero_secondario = setting('Formato numero secondario ordine');
}
if ($formato_numero_secondario != '' && $dir == 'entrata') {
$numero_esterno = Util\Generator::generate($formato_numero_secondario, $numero_secondario);
$numero_esterno = Util\Generator::generate(setting('Formato numero secondario ordine'), $numero_secondario);
} else {
$numero_esterno = '';
}

View File

@ -25,11 +25,11 @@ switch (post('op')) {
$numeropreventivo_template = str_replace('#', '%', $numeropreventivo_template);
// Codice preventivo: calcolo il successivo in base al formato specificato
$rs = $dbo->fetchArray('SELECT numero FROM co_preventivi WHERE numero=(SELECT MAX(CAST(numero AS SIGNED)) FROM co_preventivi) AND numero LIKE('.prepare($numeropreventivo_template).') ORDER BY numero DESC LIMIT 0,1');
$rs = $dbo->fetchArray('SELECT numero FROM co_preventivi WHERE numero=(SELECT MAX(CAST(numero AS SIGNED)) FROM co_preventivi) AND numero LIKE('.prepare(Util\Generator::complete($numeropreventivo_template)).') ORDER BY numero DESC LIMIT 0,1');
$numero = Util\Generator::generate(setting('Formato codice preventivi'), $rs[0]['numero']);
if (!is_numeric($numero)) {
$rs = $dbo->fetchArray('SELECT numero FROM co_preventivi WHERE numero LIKE('.prepare($numeropreventivo_template).') ORDER BY numero DESC LIMIT 0,1');
$rs = $dbo->fetchArray('SELECT numero FROM co_preventivi WHERE numero LIKE('.prepare(Util\Generator::complete($numeropreventivo_template)).') ORDER BY numero DESC LIMIT 0,1');
$numero = Util\Generator::generate(setting('Formato codice preventivi'), $rs[0]['numero']);
}

View File

@ -87,13 +87,10 @@ $_SESSION['superselect']['idanagrafica'] = $record['idanagrafica'];
<div class="col-md-3">
{[ "type": "select", "label": "<?php echo tr('Tipo di attività'); ?>", "name": "idtipointervento", "required": 1, "values": "query=SELECT idtipointervento AS id, descrizione FROM in_tipiintervento ORDER BY descrizione", "value": "$idtipointervento$" ]}
</div>
<!--div class="col-md-3">
{[ "type": "select", "label": "<?php echo tr('Iva'); ?>", "name": "idiva", "values": "query=SELECT id, descrizione FROM co_iva ORDER BY descrizione ASC", "value": "$idiva$" ]}
</div-->
<div class="col-md-3">
<!--div class="col-md-3">
{[ "type": "select", "label": "<?php echo tr('Resa materiale'); ?>", "name": "idporto", "values": "query=SELECT id, descrizione FROM dt_porto ORDER BY descrizione", "value": "$idporto$" ]}
</div>
</div-->
</div>
<div class="row">

View File

@ -73,7 +73,7 @@ if (!empty($rsi)) {
</td>
<td class="text-right">
'.Translator::numberToLocale($int['totale']).'
'.Translator::numberToLocale($int['totale_scontato']).'
</td>
</tr>';
@ -205,7 +205,7 @@ if (!empty($rsi)) {
$totale_km += $int['km'];
$totale_costo += $int['totale_costo'];
$totale_addebito += $int['totale_addebito'];
$totale += $int['totale'];
$totale += $int['totale_scontato'];
}
// Totali

View File

@ -317,10 +317,12 @@ include_once __DIR__.'/../../core.php';
if(bilancio == 0){
$("#testo_aggiuntivo").removeClass('text-danger').html("");
$("#btn_submit").removeClass('hide');
$('#btn_crea_modello').removeClass('hide');
}
else{
$("#testo_aggiuntivo").addClass('text-danger').html("sbilancio di " + bilancio.toLocale() + " &euro;" );
$("#btn_submit").addClass('hide');
$('#btn_crea_modello').addClass('hide');
}
}
@ -336,7 +338,7 @@ include_once __DIR__.'/../../core.php';
var idmastrino = $(this).val();
if(idmastrino!=''){
$('#btn_crea_modello').hide();
$('#btn_crea_modello').addClass('hide');
var causale = $(this).find('option:selected').text();
$('#desc').val(causale);
@ -351,7 +353,7 @@ include_once __DIR__.'/../../core.php';
}
});
}else{
$('#btn_crea_modello').show();
$('#btn_crea_modello').removeClass('hide');
}
});

View File

@ -14,6 +14,16 @@ switch (post('op')) {
if ($predefined) {
$dbo->query('UPDATE zz_segments SET predefined = 0 WHERE id_module = '.prepare($id_module));
}
$predefined_accredito = post('predefined_accredito');
if ($predefined_accredito) {
$dbo->query('UPDATE zz_segments SET predefined_accredito = 0 WHERE id_module = '.prepare($id_module));
}
$predefined_addebito = post('predefined_addebito');
if ($predefined_addebito) {
$dbo->query('UPDATE zz_segments SET predefined_addebito = 0 WHERE id_module = '.prepare($id_module));
}
$dbo->update('zz_segments', [
'id_module' => post('module'),
@ -23,6 +33,8 @@ switch (post('op')) {
'note' => post('note'),
'position' => post('position'),
'predefined' => $predefined,
'predefined_accredito' => $predefined_accredito,
'predefined_addebito' => $predefined_addebito,
], ['id' => $id_record]);
flash()->info(tr('Modifiche salvate correttamente'));

View File

@ -33,6 +33,17 @@ include_once __DIR__.'/../../core.php';
</div>
<div class='row'>
<div class="col-md-4">
{[ "type": "checkbox", "label": "<?php echo tr('Predefinito note di accredito'); ?>", "name": "predefined_accredito", "value": "$predefined_accredito$", "help": "<?php echo tr('Seleziona per rendere il segmento predefinito per le note di accredito.'); ?>", "placeholder": "<?php echo tr('Segmento predefinito per le note di accredito'); ?>" ]}
</div>
<div class="col-md-4">
{[ "type": "checkbox", "label": "<?php echo tr('Predefinito note di addebito'); ?>", "name": "predefined_addebito", "value": "$predefined_addebito$", "help": "<?php echo tr('Seleziona per rendere il segmento predefinito per le note di addebito.'); ?>", "placeholder": "<?php echo tr('Segmento predefinito per le note di addebito'); ?>" ]}
</div>
</div>
<div class="row">
<div class="col-md-8">

View File

@ -9,6 +9,9 @@ switch ($resource) {
foreach ($elements as $element) {
$filter[] = 'id = '.prepare($element);
}
if (empty($filter)) {
$where[] = 'deleted_at IS NULL';
}
if (!empty($search)) {
$search_fields[] = 'name LIKE '.prepare('%'.$search.'%');
}

View File

@ -122,12 +122,17 @@ switch (filter('op')) {
}
break;
// Disabilita API utente
case 'token':
$token = $dbo->fetchOne('SELECT `enabled` FROM `zz_tokens` WHERE `id_utente` = '.prepare($id_record));
// Abilita API utente
case 'token_enable':
if ($dbo->query('UPDATE zz_tokens SET enabled = 1 WHERE id_utente = '.prepare($id_utente))) {
flash()->info(tr('Token abilitato!'));
}
break;
if ($dbo->query('UPDATE zz_tokens SET enabled = '.(empty($token['enabled']) ? 1 : 0).' WHERE id_utente = '.prepare($id_utente))) {
flash()->info(tr('Utente eliminato!'));
// Disabilita API utente
case 'token_disable':
if ($dbo->query('UPDATE zz_tokens SET enabled = 0 WHERE id_utente = '.prepare($id_utente))) {
flash()->info(tr('Token disabilitato!'));
}
break;
@ -149,6 +154,39 @@ switch (filter('op')) {
break;
// Impostazione/reimpostazione dei permessi di accesso di default
case 'restore_permission':
//Gruppo Tecnici
if ($dbo->fetchArray('SELECT `nome` FROM `zz_groups` WHERE `id` = '.prepare($id_record))[0]['nome']=='Tecnici'){
$permessi = array ();
$permessi['Dashboard'] = 'rw';
$permessi['Anagrafiche'] = 'rw';
$permessi['Interventi'] = 'rw';
$permessi['Magazzino'] = 'rw';
$permessi['Articoli'] = 'rw';
$dbo->query('DELETE FROM zz_permissions WHERE idgruppo='.prepare($id_record));
foreach ($permessi as $module_name => $permesso) {
$module_id = $dbo->fetchArray('SELECT `id` FROM `zz_modules` WHERE `name` = "'.$module_name.'"')[0]['id'];
$dbo->insert('zz_permissions', [
'idgruppo' => $id_record,
'idmodule' => $module_id,
'permessi' => $permesso,
]);
}
$_SESSION['infos'][] = tr('Permessi reimpostati.');
}
break;
// Aggiornamento dei permessi di accesso
case 'update_permission':
$permessi = filter('permesso');

View File

@ -66,13 +66,12 @@ if (!empty($utenti)) {
// Disabilitazione token API, se diverso da id_utente #1 (admin)
if ($utente['id'] != '1') {
$token = $dbo->fetchOne('SELECT `enabled` FROM `zz_tokens` WHERE `id_utente` = '.prepare($utente['id']));
if (!empty($token['enabled'])) {
echo '
<a href="javascript:;" onclick="swal({ title: \''.tr("Disabilitare l\'accesso API per questo utente?").'\', type: \'info\', showCancelButton: true, confirmButtonText: \''.tr('Sì').'\' }).then(function (result) { location.href=\''.$rootdir.'/editor.php?id_module='.$id_module.'&id_record='.$id_record.'&op=token&id_utente='.$utente['id'].'&idgruppo='.$record['id'].'\'; }) " title="Disabilita API" class="text-danger tip"><i class="fa fa-2x fa-key"></i></a>';
<a href="javascript:;" onclick="swal({ title: \''.tr("Disabilitare l\'accesso API per questo utente?").'\', type: \'info\', showCancelButton: true, confirmButtonText: \''.tr('Sì').'\' }).then(function (result) { location.href=\''.$rootdir.'/editor.php?id_module='.$id_module.'&id_record='.$id_record.'&op=token_disable&id_utente='.$utente['id'].'&idgruppo='.$record['id'].'\'; }) " title="Disabilita API" class="text-danger tip"><i class="fa fa-2x fa-key"></i></a>';
} else {
echo '
<a href="javascript:;" onclick="swal({ title: \''.tr("Abilitare l\'accesso API per questo utente?").'\', type: \'info\', showCancelButton: true, confirmButtonText: \''.tr('Sì').'\' }).then(function (result) { location.href=\''.$rootdir.'/editor.php?id_module='.$id_module.'&id_record='.$id_record.'&op=token&id_utente='.$utente['id'].'&idgruppo='.$record['id'].'\'; }) " title="Abilitare API" class="text-success tip"><i class="fa fa-2x fa-key"></i></a>';
<a href="javascript:;" onclick="swal({ title: \''.tr("Abilitare l\'accesso API per questo utente?").'\', type: \'info\', showCancelButton: true, confirmButtonText: \''.tr('Sì').'\' }).then(function (result) { location.href=\''.$rootdir.'/editor.php?id_module='.$id_module.'&id_record='.$id_record.'&op=token_enable&id_utente='.$utente['id'].'&idgruppo='.$record['id'].'\'; }) " title="Abilitare API" class="text-success tip"><i class="fa fa-2x fa-key"></i></a>';
}
} else {
echo '
@ -97,7 +96,7 @@ if (!empty($utenti)) {
</table>';
} else {
echo '
<p>'.tr('Non ci sono utenti in questo gruppo').'...</p>';
<div class=\'alert alert-info\' ><i class=\'fa fa-info-circle\'></i> '.tr('Non ci sono utenti in questo gruppo').'.</div>';
}
echo '
<a data-toggle="modal" data-target="#bs-popup" data-href="'.$rootdir.'/modules/utenti/user.php?idgruppo='.$record['id'].'" data-title="'.tr('Aggiungi utente').'" class="pull-right btn btn-primary"><i class="fa fa-plus"></i> '.tr('Aggiungi utente').'</a>
@ -113,7 +112,8 @@ echo '
<div class="panel-heading">
<h3 class="panel-title">'.tr('Permessi _GROUP_', [
'_GROUP_' => $record['nome'],
]).'</h3>
]).((empty($record['editable'])) ? '<button class=\'btn btn-xs btn-info pull-right ask\' data-msg="'.tr('Verranno reimpostati i permessi di default per il gruppo \''.$record['nome'].'\' ').'." data-class="btn btn-lg btn-warning" data-button="'.tr('Reimposta permessi').'" data-op="restore_permission" >'.tr('Reimposta permessi').'</button>' : '').'</h3>
</div>
<div class="panel-body">';
@ -141,7 +141,7 @@ if ($record['nome'] != 'Amministratori') {
</table>';
} else {
echo '
<p>'.tr('Gli amministratori hanno accesso a qualsiasi modulo').'.</p>';
<div class=\'alert alert-info\' ><i class=\'fa fa-info-circle\'></i> '.tr('Gli amministratori hanno accesso a qualsiasi modulo').'.</div>';
}
echo '
</div>

View File

@ -13,6 +13,7 @@ switch ($operazione) {
'indirizzo2' => post('indirizzo2'),
'citta' => post('citta'),
'cap' => post('cap'),
'provincia' => post('provincia'),
'km' => post('km'),
'cellulare' => post('cellulare'),
'telefono' => post('telefono'),

View File

@ -18,24 +18,24 @@ echo '
</div>
<div class="col-md-4">
{[ "type": "text", "label": "'.tr('Secondo indirizzo').'", "name": "indirizzo2" ]}
{[ "type": "text", "label": "'.tr('Indirizzo2').'", "name": "indirizzo2" ]}
</div>
</div>
<div class="row">
<div class="col-md-3">
<div class="col-md-6">
{[ "type": "text", "label": "'.tr('Città').'", "name": "citta", "required": 1 ]}
</div>
<div class="col-md-3">
<div class="col-md-2">
{[ "type": "text", "label": "'.tr('C.A.P.').'", "name": "cap" ]}
</div>
<div class="col-md-3">
{[ "type": "text", "label": "'.tr('Provincia').'", "name": "provincia" ]}
<div class="col-md-2">
{[ "type": "text", "label": "'.tr('Provincia').'", "name": "provincia", "maxlength": 2, "class": "text-center" ]}
</div>
<div class="col-md-3">
<div class="col-md-2">
{[ "type": "text", "label": "'.tr('Km').'", "name": "km" ]}
</div>
</div>

View File

@ -31,7 +31,7 @@ echo '
</div>
<div class="col-md-6">
{[ "type": "text", "label": "'.tr('Secondo indirizzo').'", "name": "indirizzo2", "value": "$indirizzo2$" ]}
{[ "type": "text", "label": "'.tr('Indirizzo2').'", "name": "indirizzo2", "value": "$indirizzo2$" ]}
</div>
</div>
@ -46,19 +46,19 @@ echo '
</div>
<div class="row">
<div class="col-md-3">
<div class="col-md-6">
{[ "type": "text", "label": "'.tr('Città').'", "name": "citta", "id": "citta_", "value": "$citta$" ]}
</div>
<div class="col-md-3">
<div class="col-md-2">
{[ "type": "text", "label": "'.tr('C.A.P.').'", "name": "cap", "value": "$cap$" ]}
</div>
<div class="col-md-3">
{[ "type": "text", "label": "'.tr('Provincia').'", "name": "provincia", "value": "$provincia$" ]}
<div class="col-md-2">
{[ "type": "text", "label": "'.tr('Provincia').'", "name": "provincia", "value": "$provincia$", "maxlength": 2, "class": "text-center" ]}
</div>
<div class="col-md-3">
<div class="col-md-2">
{[ "type": "number", "label": "'.tr('Km').'", "name": "km", "value": "$km$" ]}
</div>
</div>

View File

@ -70,7 +70,7 @@ class Generator
*
* @return string
*/
protected static function complete($pattern)
public static function complete($pattern)
{
// Costruzione del pattern
$replaces = self::getReplaces();

View File

@ -69,4 +69,4 @@ $body .= "</tr>\n";
$body .= "</table>\n";
$report_name = 'inventario.pdf';
$report_name = 'fatturato.pdf';

View File

@ -29,7 +29,8 @@ echo '
<td colspan=2 class="border-full" style="height:16mm;">
<p class="small-bold">'.tr('Spett.le', [], ['upper' => true]).'</p>
<p>$c_ragionesociale$</p>
<p>$c_indirizzo$ $c_citta_full$</p>
<p>$c_indirizzo$</p>
<p>$c_citta_full$</p>
</td>
</tr>
@ -185,7 +186,7 @@ foreach ($righe as $r) {
$sconto = sum($sconto);
$imponibile = sum($imponibile);
$iva = sum($iva, null, 2);
$iva = sum($iva);
$totale = $imponibile - $sconto;
@ -269,8 +270,9 @@ $rs = $dbo->fetchArray('SELECT * FROM co_pagamenti WHERE id = '.$records[0]['idp
$pagamento = $rs[0]['descrizione'];
// Lettura resa
$rs = $dbo->fetchArray('SELECT * FROM dt_porto WHERE id = '.$records[0]['idporto']);
$resa_materiale = $rs[0]['descrizione'];
//$rs = $dbo->fetchArray('SELECT * FROM dt_porto WHERE id = '.$records[0]['idporto']);
//$resa_materiale = $rs[0]['descrizione'];
echo '
<table class="table table-bordered">
@ -290,7 +292,7 @@ echo '
</td>
</tr>
<tr>
<!--tr>
<th>
'.tr('Resa materiale', [], ['upper' => true]).'
</th>
@ -298,7 +300,7 @@ echo '
<td>
'.$resa_materiale.'
</td>
</tr>
</tr-->
<tr>
<th>

View File

@ -206,7 +206,10 @@ UPDATE `zz_widgets` SET `query` = 'SELECT CONCAT_WS(" ", REPLACE(REPLACE(REPLACE
UPDATE `zz_widgets` SET `query` = 'SELECT CONCAT_WS(" ", REPLACE(REPLACE(REPLACE(FORMAT((SELECT ABS(SUM(da_pagare))), 2), ",", "#"), ".", ","), "#", "."), "&euro;") AS dato FROM (co_scadenziario INNER JOIN co_documenti ON co_scadenziario.iddocumento=co_documenti.id) INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id WHERE dir=''uscita'' |segment| AND data_emissione >= "|period_start|" AND data_emissione <= "|period_end|"' WHERE `zz_widgets`.`name` = 'Acquisti';
-- Aggiorno widget Crediti da clienti con i sezionali
UPDATE `zz_widgets` SET `query` = 'SELECT CONCAT_WS(" ", REPLACE(REPLACE(REPLACE(FORMAT(SUM((SELECT SUM(subtotale+iva-sconto) FROM co_righe_documenti WHERE iddocumento=co_documenti.id)+iva_rivalsainps+rivalsainps+bollo-ritenutaacconto), 2), ",", "#"), ".", ","), "#", "."), "€") AS dato FROM co_documenti WHERE idtipodocumento IN (SELECT id FROM co_tipidocumento WHERE dir="entrata") AND idstatodocumento = (SELECT id FROM co_statidocumento WHERE descrizione="Emessa") |segment| AND data >= "|period_start|" AND data <= "|period_end|" AND 1=1' WHERE `zz_widgets`.`name` = 'Crediti da clienti' ;
UPDATE `zz_widgets` SET `query` = 'SELECT CONCAT_WS(" ", REPLACE(REPLACE(REPLACE(FORMAT(SUM((SELECT SUM(subtotale+iva-sconto) FROM co_righe_documenti WHERE iddocumento=co_documenti.id)+iva_rivalsainps+rivalsainps+bollo-ritenutaacconto), 2), ",", "#"), ".", ","), "#", "."), "&euro;") AS dato FROM co_documenti WHERE idtipodocumento IN (SELECT id FROM co_tipidocumento WHERE dir="entrata") AND idstatodocumento = (SELECT id FROM co_statidocumento WHERE descrizione="Emessa") |segment| AND data >= "|period_start|" AND data <= "|period_end|" AND 1=1' WHERE `zz_widgets`.`name` = 'Crediti da clienti' ;
-- Aggiorno widget Debiti verso fornitori con i sezionali
UPDATE `zz_widgets` SET `query` = 'SELECT CONCAT_WS('' '', REPLACE(REPLACE(REPLACE(FORMAT((SELECT ABS(SUM(da_pagare-pagato))), 2), '','', ''#''), ''.'', '',''),''#'', ''.''), ''&euro;'') AS dato FROM (co_scadenziario INNER JOIN co_documenti ON co_scadenziario.iddocumento=co_documenti.id) INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id WHERE co_tipidocumento.dir=''uscita'' |segment| AND data_emissione >= "|period_start|" AND data_emissione <= "|period_end|"' WHERE `zz_widgets`.`name` = 'Debiti verso fornitori';
-- Aggiorno i moduli Fattura con i sezionali
UPDATE `zz_modules` SET `options` = 'SELECT |select| FROM `co_documenti` INNER JOIN `co_tipidocumento` ON `co_documenti`.`idtipodocumento` = `co_tipidocumento`.`id` WHERE 1=1 AND `dir` = ''uscita'' |segment| AND `data` >= ''|period_start|'' AND `data` <= ''|period_end|'' HAVING 2=2 ORDER BY `data` DESC, CAST(IF(numero_esterno='''', numero, numero_esterno) AS UNSIGNED) DESC' WHERE `name` = 'Fatture di acquisto';

View File

@ -339,7 +339,7 @@ INSERT INTO `zz_views` (`id_module`, `name`, `query`, `order`, `search`, `slow`,
-- Aggiunto supporto a Note di accredito e addebito
ALTER TABLE `co_documenti` ADD `ref_documento` int(11) AFTER `idagente`, ADD FOREIGN KEY (`ref_documento`) REFERENCES `co_documenti`(`id`) ON DELETE CASCADE;
ALTER TABLE `co_righe_documenti` ADD `qta_evasa` int(11) NOT NULL AFTER `qta`, ADD `ref_riga_documento` int(11) AFTER `idcontratto`, ADD FOREIGN KEY (`ref_riga_documento`) REFERENCES `co_righe_documenti`(`id`) ON DELETE CASCADE;
ALTER TABLE `co_righe_documenti` ADD `qta_evasa` decimal(12,4) NOT NULL AFTER `qta`, ADD `ref_riga_documento` int(11) AFTER `idcontratto`, ADD FOREIGN KEY (`ref_riga_documento`) REFERENCES `co_righe_documenti`(`id`) ON DELETE CASCADE;
ALTER TABLE `co_tipidocumento` ADD `reversed` BOOLEAN NOT NULL DEFAULT FALSE AFTER `dir`;
UPDATE `co_tipidocumento` SET `reversed` = 1 WHERE `descrizione` = 'Nota di accredito';
@ -357,9 +357,15 @@ ALTER TABLE `my_impianti` CHANGE `immagine` `immagine` varchar(255);
UPDATE `my_impianti` SET `immagine` = NULL WHERE `immagine` = '';
INSERT INTO `zz_files` (`id_module`, `id_record`, `nome`, `filename`, `original`) SELECT (SELECT `id` FROM `zz_modules` WHERE `name` = 'MyImpianti'), `id`, 'Immagine', `immagine`, `immagine` FROM `my_impianti` WHERE `immagine` IS NOT NULL;
-- Fix widgets fatturato
UPDATE `zz_widgets` SET `query` = 'SELECT CONCAT_WS(\" \", REPLACE(REPLACE(REPLACE(FORMAT(SUM((SELECT SUM(subtotale+iva-sconto) FROM co_righe_documenti WHERE iddocumento=co_documenti.id)+iva_rivalsainps+rivalsainps+bollo-ritenutaacconto), 2), \",\", \"#\"), \".\", \",\"), \"#\", \".\"), \"&euro;\") AS dato FROM co_documenti WHERE idtipodocumento IN (SELECT id FROM co_tipidocumento WHERE dir=\"entrata\") AND idstatodocumento NOT IN (SELECT id FROM co_statidocumento WHERE descrizione=\"Bozza\" OR descrizione=\"Annullata\") |segment| AND data >= \"|period_start|\" AND data <= \"|period_end|\" AND 1=1' WHERE `zz_widgets`.`name` = 'Fatturato';
UPDATE `zz_widgets` SET `query` = 'SELECT CONCAT_WS(\" \", REPLACE(REPLACE(REPLACE(FORMAT((SELECT ABS(SUM(da_pagare))), 2), \",\", \"#\"), \".\", \",\"), \"#\", \".\"), \"&euro;\") AS dato FROM (co_scadenziario INNER JOIN co_documenti ON co_scadenziario.iddocumento=co_documenti.id) INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id WHERE dir=\'uscita\' AND idstatodocumento NOT IN (SELECT id FROM co_statidocumento WHERE descrizione=\"Bozza\" OR descrizione=\"Annullata\") |segment| AND data_emissione >= \"|period_start|\" AND data_emissione <= \"|period_end|\"' WHERE `zz_widgets`.`name` = 'Acquisti';
-- Fix widgets fatturato, prendo importi dallo scadenzario
UPDATE `zz_widgets` SET `query` = 'SELECT CONCAT_WS(" ", REPLACE(REPLACE(REPLACE(FORMAT((SELECT ABS(SUM(da_pagare))), 2), ",", "#"), ".", ","), "#", "."), "&euro;") AS dato FROM (co_scadenziario INNER JOIN co_documenti ON co_scadenziario.iddocumento=co_documenti.id) INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id WHERE co_tipidocumento.dir=''entrata'' |segment| AND data_emissione >= "|period_start|" AND data_emissione <= "|period_end|" AND 1=1' WHERE `zz_widgets`.`name` = 'Fatturato';
UPDATE `zz_widgets` SET `query` = 'SELECT CONCAT_WS(" ", REPLACE(REPLACE(REPLACE(FORMAT((SELECT ABS(SUM(da_pagare))), 2), ",", "#"), ".", ","), "#", "."), "&euro;") AS dato FROM (co_scadenziario INNER JOIN co_documenti ON co_scadenziario.iddocumento=co_documenti.id) INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id WHERE co_tipidocumento.dir=''uscita'' |segment| AND data_emissione >= "|period_start|" AND data_emissione <= "|period_end|" AND 1=1', `help` = 'Fatturato IVA inclusa.' WHERE `zz_widgets`.`name` = 'Acquisti';
-- Per i crediti / debiti considero o no il periodo temporale?
UPDATE `zz_widgets` SET `query` = 'SELECT CONCAT_WS(" ", REPLACE(REPLACE(REPLACE(FORMAT((SELECT ABS(SUM(da_pagare-pagato))), 2), ",", "#"), ".", ","), "#", "."), "&euro;") AS dato FROM (co_scadenziario INNER JOIN co_documenti ON co_scadenziario.iddocumento=co_documenti.id) INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id WHERE co_tipidocumento.dir=''entrata'' |segment| AND 1=1', `help` = 'Crediti IVA inclusa.' WHERE `zz_widgets`.`name` = 'Crediti da clienti';
UPDATE `zz_widgets` SET `query` = 'SELECT CONCAT_WS('' '', REPLACE(REPLACE(REPLACE(FORMAT((SELECT ABS(SUM(da_pagare-pagato))), 2), '','', ''#''), ''.'', '',''),''#'', ''.''), ''&euro;'') AS dato FROM (co_scadenziario INNER JOIN co_documenti ON co_scadenziario.iddocumento=co_documenti.id) INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id WHERE co_tipidocumento.dir=''uscita'' |segment| AND 1=1', `help` = 'Debiti IVA inclusa.' WHERE `zz_widgets`.`name` = 'Debiti verso fornitori';
-- Introduzione del tipo documento nelle tabelle Fatture
INSERT INTO `zz_views` (`id_module`, `name`, `query`, `order`, `search`, `slow`, `enabled`, `default`) VALUES
@ -473,4 +479,11 @@ INSERT INTO `zz_views` (`id`, `id_module`, `name`, `query`, `order`, `search`, `
INSERT INTO `zz_views` (`id`, `id_module`, `name`, `query`, `order`, `search`, `slow`, `format`, `search_inside`, `order_by`, `enabled`, `summable`, `default` ) VALUES
(NULL, (SELECT `id` FROM `zz_modules` WHERE `name` = 'Tipi di intervento'), 'Tempo standard', 'in_tipiintervento.tempo_standard', 10, 1, 0, 1, '', '', 0, 0, 0);
-- Disabilito temporaneamente le stampe degli ordini di servizio, plugins disabilitati
UPDATE `zz_prints` SET `enabled` = 0 WHERE `name` IN( 'Ordine di servizio', 'Ordine di servizio (senza costi)' );
-- Fix colonna delle stampe
UPDATE `zz_views` SET `query` = '\'Intervento\'' WHERE `id_module` = (SELECT `id` FROM `zz_modules` WHERE `name` = 'Interventi') AND `name` = '_print_';
-- Flag per definire i segmenti di note di accredito e di addebito
ALTER TABLE `zz_segments` ADD `predefined_accredito` TINYINT(1) NOT NULL AFTER `predefined`, ADD `predefined_addebito` TINYINT(1) NOT NULL AFTER `predefined_accredito`;