mirror of
https://github.com/devcode-it/openstamanager.git
synced 2025-02-20 21:40:48 +01:00
Merge branch 'master' of https://github.com/devcode-it/openstamanager
This commit is contained in:
commit
adde2a97f5
13
CHANGELOG.md
13
CHANGELOG.md
@ -33,18 +33,31 @@ Il formato utilizzato è basato sulle linee guida di [Keep a Changelog](http://k
|
||||
- Controlli aggiuntivi sulla numerazione di **DDT** e **Fatture**
|
||||
- Fatturazione massiva di Contratti e Preventivi
|
||||
- Nuovo modulo **Stampe** sotto **Strumenti** per permettere la modifica manuale delle opzioni delle stampe
|
||||
- Visualizzazione informazioni su CIG, CUP anche nella stampa delle **Fatture**
|
||||
- Aggiunta prezzo vendita e acquisto in inserimento **Articoli**
|
||||
- Aggiunto elenco di **Fatture di vendita** in stato *Bozza* alla creazione
|
||||
- Aggiunta nuova stampa per i barcode degli **Articoli** e nuova variabile *revisione* nella stampa **Preventivi**
|
||||
- Aggiunta azione di cambiamento massivo dello stato negli **Interventi**
|
||||
- Aggiunto controllo sulla numerazione di **Fatture di acquisto** e **DDT in entrata**, con miglioramento delle informazioni per la numerazione delle **Fatture di vendita**
|
||||
- Supporto alla data di fine nella selezione dashboard (#556)
|
||||
|
||||
### Modificato (Changed)
|
||||
- Revisione e aggiornamento dei plugin *Pianificazione interventi* e *Pianficazione fatturazione*
|
||||
- Modifica della gestione degli importi per le righe dei documenti (#758)
|
||||
- Il plugin *Movimenti* degli **Articoli** presenta ora un raggruppamento per documento (#766)
|
||||
- Aggiornamento del sistema di cache per prevedere una maggiore varietà di casi di utilizzo
|
||||
- Estensione suggerimento prezzi di acquisto e vendita per gli **Articoli** nei documenti
|
||||
- Rimozione blocco del codice destinatario sulla base della Tipologia di **Anagrafica** e rimozione dell'unicità obbligatoria del codice fiscale (#768)
|
||||
- Ottimizzazione della procedura di caricamento delle righe per **Fatture**, **Ordini** e **DDT**
|
||||
- Controllo del totale delle Fatture Elettroniche sulla base dei *Riepiloghi IVA*
|
||||
|
||||
### Fixed
|
||||
- Blocco della duplicazione per Fatture per cui esiste una Nota di credito
|
||||
- Gestione delle quantità evase per la fatturazione massiva di DDT
|
||||
- Abilitazione e disabilitazione API per utenti senza token
|
||||
- Modifica del totale per scadenze generiche in **Scadenzario** (#764)
|
||||
- Fix totale volume e peso nelle stampe DDT e Fatture
|
||||
- Fix percentuale negativa per Maggiorazione in Fattura Elettronica (#780)
|
||||
|
||||
## 2.4.13 (2020-02-05)
|
||||
|
||||
|
@ -190,10 +190,10 @@ foreach ($righe as $i => $r) {
|
||||
echo '
|
||||
<tr>
|
||||
<td>
|
||||
<input type="hidden" id="subtot_'.$i.'" name="subtot['.$r['id'].']" value="'.$r['prezzo_unitario_vendita'].'" />
|
||||
<input type="hidden" id="sconto_'.$i.'" name="sconto['.$r['id'].']" value="'.$r['sconto'] / $r['qta'].'" />
|
||||
<input type="hidden" id="iva_'.$i.'" name="iva['.$r['id'].']" value="'.$r['iva'] / $r['qta'].'" />
|
||||
<input type="hidden" id="qtamax_'.$i.'" value="'.($r['qta_rimanente']).'" />';
|
||||
<input type="hidden" id="prezzo_unitario_'.$i.'" name="subtot['.$r['id'].']" value="'.$r['prezzo_unitario'].'" />
|
||||
<input type="hidden" id="sconto_unitario_'.$i.'" name="sconto['.$r['id'].']" value="'.$r['sconto_unitario'].'" />
|
||||
<input type="hidden" id="iva_unitaria_'.$i.'" name="iva['.$r['id'].']" value="'.$r['iva_unitaria'].'" />
|
||||
<input type="hidden" id="qta_max_'.$i.'" value="'.($r['qta_rimanente']).'" />';
|
||||
|
||||
// Checkbox - da evadere?
|
||||
echo '
|
||||
@ -291,24 +291,25 @@ echo '
|
||||
|
||||
<script type="text/javascript">
|
||||
function ricalcola_subtotale_riga(r) {
|
||||
subtot = $("#subtot_" + r).val();
|
||||
sconto = $("#sconto_" + r).val();
|
||||
iva = $("#iva_" + r).val();
|
||||
var prezzo_unitario = $("#prezzo_unitario_" + r).val();
|
||||
var sconto = $("#sconto_unitario_" + r).val();
|
||||
var iva = $("#iva_unitaria_" + r).val();
|
||||
|
||||
qtamax = $("#qtamax_" + r).val() ? $("#qtamax_" + r).val() : 0;
|
||||
var qta_max_input = $("#qta_max_" + r);
|
||||
var qta_max = qta_max_input.val() ? qta_max_input.val() : 0;
|
||||
|
||||
subtot = parseFloat(subtot);
|
||||
prezzo_unitario = parseFloat(prezzo_unitario);
|
||||
sconto = parseFloat(sconto);
|
||||
iva = parseFloat(iva);
|
||||
qtamax = parseFloat(qtamax);
|
||||
qta_max = parseFloat(qta_max);
|
||||
|
||||
subtot = subtot - sconto;
|
||||
var prezzo_scontato = prezzo_unitario - sconto;
|
||||
|
||||
qta = $("#qta_" + r).val().toEnglish();
|
||||
var qta = $("#qta_" + r).val().toEnglish();
|
||||
|
||||
// Se inserisco una quantità da evadere maggiore di quella rimanente, la imposto al massimo possibile
|
||||
if (qta > qtamax) {
|
||||
qta = qtamax;
|
||||
if (qta > qta_max) {
|
||||
qta = qta_max;
|
||||
|
||||
$('#qta_' + r).val(qta);
|
||||
}
|
||||
@ -318,43 +319,44 @@ echo '
|
||||
qta = 0;
|
||||
}
|
||||
|
||||
$("#serial_" + r).selectClear();
|
||||
$("#serial_" + r).select2("destroy");
|
||||
$("#serial_" + r).data('maximum', qta);
|
||||
var serial_select = $("#serial_" + r);
|
||||
serial_select.selectClear();
|
||||
serial_select.select2("destroy");
|
||||
serial_select.data('maximum', qta);
|
||||
start_superselect();
|
||||
|
||||
subtotale = (subtot * qta + iva * qta).toLocale();
|
||||
var subtotale = (prezzo_scontato * qta + iva * qta).toLocale();
|
||||
|
||||
$("#subtotale_" + r).html(subtotale + " " + globals.currency);
|
||||
$("#subtotaledettagli_" + r).html((subtot * qta).toLocale() + " + " + (iva * qta).toLocale());
|
||||
$("#subtotaledettagli_" + r).html((prezzo_scontato * qta).toLocale() + " + " + (iva * qta).toLocale());
|
||||
|
||||
ricalcola_totale();
|
||||
}
|
||||
|
||||
function ricalcola_totale() {
|
||||
totale = 0.00;
|
||||
totale_qta = 0;
|
||||
var totale = 0.00;
|
||||
var totale_qta = 0;
|
||||
|
||||
$('input[id*=qta_]').each(function() {
|
||||
qta = $(this).val().toEnglish();
|
||||
r = $(this).attr("id").replace("qta_", "");
|
||||
var qta = $(this).val().toEnglish();
|
||||
var r = $(this).attr("id").replace("qta_", "");
|
||||
|
||||
if (!$("#checked_" + r).is(":checked") || isNaN(qta)) {
|
||||
qta = 0;
|
||||
}
|
||||
|
||||
subtot = $("#subtot_" + r).val();
|
||||
sconto = $("#sconto_" + r).val();
|
||||
iva = $("#iva_" + r).val();
|
||||
var prezzo_unitario = $("#prezzo_unitario_" + r).val();
|
||||
var sconto = $("#sconto_unitario_" + r).val();
|
||||
var iva = $("#iva_unitaria_" + r).val();
|
||||
|
||||
subtot = parseFloat(subtot);
|
||||
prezzo_unitario = parseFloat(prezzo_unitario);
|
||||
sconto = parseFloat(sconto);
|
||||
iva = parseFloat(iva);
|
||||
|
||||
subtot = subtot - sconto;
|
||||
var prezzo_scontato = prezzo_unitario - sconto;
|
||||
|
||||
if(subtot) {
|
||||
totale += subtot * qta + iva * qta;
|
||||
if(prezzo_scontato) {
|
||||
totale += prezzo_scontato * qta + iva * qta;
|
||||
}
|
||||
|
||||
totale_qta += qta;
|
||||
|
@ -26,7 +26,7 @@ switch ($resource) {
|
||||
($documenti[$i]['n2_documento'] != '') ? $n_documento = $documenti[$i]['n2_documento'] : $n_documento = $documenti[$i]['n_documento'];
|
||||
|
||||
$link_id = Modules::get($documenti[$i]['modulo'])['id'];
|
||||
echo "<tr><td class='first_cell text-left'><a href='".ROOTDIR.'/editor.php?id_module='.$link_id.'&id_record='.$documenti[$i]['id']."' target=\"_blank\" title=\"Apri il documento su una nuova finestra\">".$documenti[$i]['tipo'].". n. ".$n_documento.' del '.Translator::dateToLocale($documenti[$i]['data_documento'])." </a></td>\n";
|
||||
echo "<tr><td class='first_cell text-left'><a href='".ROOTDIR.'/editor.php?id_module='.$link_id.'&id_record='.$documenti[$i]['id']."' target=\"_blank\" title=\"Apri il documento su una nuova finestra\">".$documenti[$i]['tipo'].'. n. '.$n_documento.' del '.Translator::dateToLocale($documenti[$i]['data_documento'])." </a></td>\n";
|
||||
echo "<td class='table_cell text-right'>".moneyFormat($documenti[$i]['costo_unitario'])."</td></tr>\n";
|
||||
array_push($ids, '"'.$documenti[$i]['id'].'"');
|
||||
}
|
||||
@ -55,7 +55,7 @@ switch ($resource) {
|
||||
($documenti[$i]['n2_documento'] != '') ? $n_documento = $documenti[$i]['n2_documento'] : $n_documento = $documenti[$i]['n_documento'];
|
||||
|
||||
$link_id = Modules::get($documenti[$i]['modulo'])['id'];
|
||||
echo "<tr><td class='first_cell text-left'><a href='".ROOTDIR.'/editor.php?id_module='.$link_id.'&id_record='.$documenti[$i]['id']."' target=\"_blank\" title=\"Apri il documento su una nuova finestra\">".$documenti[$i]['tipo'].". n. ".$n_documento.' del '.Translator::dateToLocale($documenti[$i]['data_documento'])." </a></td>\n";
|
||||
echo "<tr><td class='first_cell text-left'><a href='".ROOTDIR.'/editor.php?id_module='.$link_id.'&id_record='.$documenti[$i]['id']."' target=\"_blank\" title=\"Apri il documento su una nuova finestra\">".$documenti[$i]['tipo'].'. n. '.$n_documento.' del '.Translator::dateToLocale($documenti[$i]['data_documento'])." </a></td>\n";
|
||||
echo "<td class='table_cell text-right'>".moneyFormat($documenti[$i]['costo_unitario'])."</td></tr>\n";
|
||||
array_push($ids, '"'.$documenti[$i]['id'].'"');
|
||||
}
|
||||
@ -83,7 +83,7 @@ switch ($resource) {
|
||||
($documenti[$i]['n2_documento'] != '') ? $n_documento = $documenti[$i]['n2_documento'] : $n_documento = $documenti[$i]['n_documento'];
|
||||
|
||||
$link_id = Modules::get($documenti[$i]['modulo'])['id'];
|
||||
echo "<tr><td class='first_cell text-left'><a href='".ROOTDIR.'/editor.php?id_module='.$link_id.'&id_record='.$documenti[$i]['id']."' target=\"_blank\" title=\"Apri il documento su una nuova finestra\">".$documenti[$i]['tipo'].". n. ".$n_documento.' del '.Translator::dateToLocale($documenti[$i]['data_documento'])." </a></td>\n";
|
||||
echo "<tr><td class='first_cell text-left'><a href='".ROOTDIR.'/editor.php?id_module='.$link_id.'&id_record='.$documenti[$i]['id']."' target=\"_blank\" title=\"Apri il documento su una nuova finestra\">".$documenti[$i]['tipo'].'. n. '.$n_documento.' del '.Translator::dateToLocale($documenti[$i]['data_documento'])." </a></td>\n";
|
||||
echo "<td class='table_cell text-right'>".moneyFormat($documenti[$i]['costo_unitario'])."</td></tr>\n";
|
||||
array_push($ids, '"'.$documenti[$i]['id'].'"');
|
||||
}
|
||||
|
@ -1,139 +0,0 @@
|
||||
<?php
|
||||
|
||||
include_once __DIR__.'/../../../core.php';
|
||||
|
||||
// TODO: aggiornare con la funzione months()
|
||||
$mesi = [
|
||||
tr('Gennaio'),
|
||||
tr('Febbraio'),
|
||||
tr('Marzo'),
|
||||
tr('Aprile'),
|
||||
tr('Maggio'),
|
||||
tr('Giugno'),
|
||||
tr('Luglio'),
|
||||
tr('Agosto'),
|
||||
tr('Settembre'),
|
||||
tr('Ottobre'),
|
||||
tr('Novembre'),
|
||||
tr('Dicembre'),
|
||||
];
|
||||
|
||||
// Righe inserite
|
||||
//idcontratto IN( SELECT id FROM co_contratti WHERE idstato IN(SELECT id FROM co_staticontratti WHERE is_pianificabile = 1) ) AND
|
||||
$qp = "SELECT *,
|
||||
(SELECT SUM(subtotale) FROM co_righe_contratti WHERE idcontratto=co_fatturazione_contratti.idcontratto) AS budget_contratto,
|
||||
DATE_FORMAT(data_scadenza, '%m-%Y') AS mese,
|
||||
(SELECT idanagrafica FROM co_contratti WHERE id=idcontratto) AS idcliente,
|
||||
(SELECT nome FROM co_contratti WHERE id=idcontratto) AS nome,
|
||||
(SELECT ragione_sociale FROM an_anagrafiche WHERE idanagrafica=(SELECT idanagrafica FROM co_contratti WHERE id=idcontratto)) AS ragione_sociale,
|
||||
(SELECT descrizione FROM an_zone WHERE id=co_fatturazione_contratti.idzona) AS zona
|
||||
FROM co_fatturazione_contratti WHERE co_fatturazione_contratti.iddocumento=0 ORDER BY data_scadenza ASC, idcliente ASC";
|
||||
$rsp = $dbo->fetchArray($qp);
|
||||
|
||||
if (!empty($rsp)) {
|
||||
// Lettura numero di rate e totale già fatturato
|
||||
$rs2 = $dbo->fetchArray('SELECT * FROM co_fatturazione_contratti');
|
||||
|
||||
for ($j = 0; $j < sizeof($rs2); ++$j) {
|
||||
// Leggo quante rate sono pianificate per dividere l'importo delle sedi in modo corretto
|
||||
++$n_rate[$rs2[$j]['idcontratto']][$rs2[$j]['idzona']];
|
||||
|
||||
// Leggo il totale già fatturato per questa zona per toglierlo dalla divisione (totale/n_rate)
|
||||
$rs3 = $dbo->fetchArray('SELECT SUM(subtotale-sconto) AS totale FROM co_righe_documenti WHERE iddocumento='.prepare($rs2[$j]['iddocumento']));
|
||||
$gia_fatturato[$rs2[$j]['idcontratto']][$rs2[$j]['idzona']] += $rs3[0]['totale'];
|
||||
}
|
||||
|
||||
// Elenco fatture da emettere
|
||||
foreach ($rsp as $i => $r) {
|
||||
++$n_rata[$r['idzona']][$r['idcontratto']];
|
||||
|
||||
// Se cambia il mese ricreo l'intestazione della tabella
|
||||
if (!isset($rsp[$i - 1]) || $r['mese'] != $rsp[$i - 1]['mese']) {
|
||||
echo "
|
||||
<div class='title_settings'>
|
||||
<a class='clickable' onclick=\"$('#f_".$i."').slideToggle();\"></a>
|
||||
</div>";
|
||||
if ($i == 0) {
|
||||
$attr = '';
|
||||
$class = 'fa-minus-circle';
|
||||
} else {
|
||||
$attr = 'style="display:none;"';
|
||||
$class = 'fa-plus-circle';
|
||||
}
|
||||
|
||||
echo "
|
||||
<h4>
|
||||
<a class='clickable' onclick=\"if( $('#f_".$i."').css('display') == 'none' ){ $(this).children('i').removeClass('fa-plus-circle'); $(this).children('i').addClass('fa-minus-circle'); }else{ $(this).children('i').addClass('fa-plus-circle'); $(this).children('i').removeClass('fa-minus-circle'); } $('#f_".$i."').slideToggle();\">
|
||||
<i class='fa ".$class."'></i> ".$mesi[intval(date('m', strtotime($r['data_scadenza']))) - 1].' '.date('Y', strtotime($r['data_scadenza'])).'
|
||||
</a>
|
||||
</h4>';
|
||||
|
||||
echo '
|
||||
<div id="f_'.$i.'" '.$attr.'>
|
||||
<table class="table table-hover table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th width="25%">'.tr('Entro il').'</th>
|
||||
<th width="35%">'.tr('Ragione sociale').'</th>
|
||||
<th width="20%">'.tr('Importo').'</th>
|
||||
<th width="10%"></th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
<tbody>';
|
||||
}
|
||||
|
||||
// Lettura numero di sedi in cui si sono pianificati ordini di servizio per la zona corrente
|
||||
if (!empty($r['idzona'])) {
|
||||
$n_sedi_pianificate = $dbo->fetchNum('SELECT DISTINCT(idsede) FROM my_impianti WHERE id IN (SELECT idimpianto FROM co_ordiniservizio WHERE idcontratto='.prepare($id_record).') AND idsede IN(SELECT id FROM an_sedi WHERE idzona='.prepare($r['idzona']).')');
|
||||
|
||||
// Verifico se ci sono impianti in questa zona legati alla sede legale
|
||||
$n_sedi_pianificate += $dbo->fetchNum('SELECT DISTINCT(idsede) FROM my_impianti WHERE id IN (SELECT idimpianto FROM co_ordiniservizio WHERE idcontratto='.prepare($id_record).') AND idsede=(SELECT idsede FROM an_anagrafiche WHERE idanagrafica=(SELECT idanagrafica FROM co_contratti WHERE id='.prepare($id_record).') AND idzona='.prepare($r['idzona']).') AND idsede=0');
|
||||
}
|
||||
// Fix nel caso non siano previste sedi pianificate (l'eventuale 0 portava a problemi nel calcolo dell'importo)
|
||||
$n_sedi_pianificate = ($n_sedi_pianificate < 1) ? 1 : $n_sedi_pianificate;
|
||||
|
||||
/*
|
||||
Importo
|
||||
*/
|
||||
// $importo = ($r['budget_contratto'] * $n_sedi_pianificate / $n_rate[ $r['idcontratto'] ][ $r['idzona'] ]) - ($gia_fatturato[ $r['idcontratto'] ][ $r['idzona'] ] * $n_sedi_pianificate / sizeof($gia_fatturato[ $r['idcontratto'] ][ $r['idzona'] ]) );
|
||||
$importo = ($r['budget_contratto'] * $n_sedi_pianificate / $n_rate[$r['idcontratto']][$r['idzona']]);
|
||||
|
||||
// Visualizzo solo le rate non pagate
|
||||
if ($r['iddocumento'] == 0) {
|
||||
echo "
|
||||
<tr id='fat_".$r['id']."'>
|
||||
<td>".Translator::dateToLocale($r['data_scadenza'])."<br><a href='".$rootdir.'/editor.php?id_module='.Modules::get('Contratti')['id'].'&id_record='.$r['idcontratto']."'><small>rif. ".$r['nome']." </small></a></td>
|
||||
<td>
|
||||
<a href='".$rootdir.'/editor.php?id_module='.Modules::get('Anagrafiche')['id'].'&id_record='.$r['idcliente']."'>".nl2br($r['ragione_sociale']).'</a>
|
||||
</td>
|
||||
|
||||
<td>
|
||||
'.moneyFormat($importo).'<br>
|
||||
<small><small>'.moneyFormat($r['budget_contratto']).' / '.$n_rate[$r['idcontratto']][$r['idzona']].' rate</small></small>
|
||||
</td>';
|
||||
|
||||
// Pulsanti
|
||||
echo '
|
||||
<td>';
|
||||
if (empty($r['idintervento'])) {
|
||||
echo '<button type="button" class="btn btn-primary btn-sm" onclick="launch_modal( \'Crea fattura\', \''.$rootdir.'/modules/contratti/plugins/addfattura.php?idcontratto='.$r['idcontratto'].'&idpianificazione='.$r['id'].'&importo='.$importo.'&n_rata='.$n_rata[$r['idzona']][$r['idcontratto']].'\');">
|
||||
<i class="fa fa-euro"></i> Crea fattura
|
||||
</button>';
|
||||
}
|
||||
echo '
|
||||
</td>
|
||||
</tr>';
|
||||
}
|
||||
|
||||
if (!isset($rsp[$i + 1]) || $r['mese'] != $rsp[$i + 1]['mese']) {
|
||||
echo '
|
||||
</tbody>
|
||||
</table>
|
||||
</div>';
|
||||
}
|
||||
}
|
||||
} else {
|
||||
echo '
|
||||
<p>'.tr('Non ci sono fatture da emettere').'.</p>';
|
||||
}
|
@ -401,8 +401,8 @@ if (!empty($elementi)) {
|
||||
$descrizione = tr('_DOC_ num. _NUM_ del _DATE_ [_STATE_]', [
|
||||
'_DOC_' => $fattura['tipo_documento'],
|
||||
'_NUM_' => !empty($fattura['numero_esterno']) ? $fattura['numero_esterno'] : $fattura['numero'],
|
||||
'_DATE_' => Translator::dateToLocale($fattura['data']),
|
||||
'_STATE_' => $fattura['stato_documento'],
|
||||
'_DATE_' => Translator::dateToLocale($fattura['data']),
|
||||
'_STATE_' => $fattura['stato_documento'],
|
||||
]);
|
||||
|
||||
$modulo = ($fattura['dir'] == 'entrata') ? 'Fatture di vendita' : 'Fatture di acquisto';
|
||||
|
@ -29,17 +29,17 @@ foreach ($raggruppamenti as $mese => $raggruppamento) {
|
||||
|
||||
echo "
|
||||
<h4>
|
||||
<a class='clickable' onclick=\"if( $('#t1_".$counter."').css('display') == 'none' ){ $(this).children('i').removeClass('fa-plus-circle'); $(this).children('i').addClass('fa-minus-circle'); }else{ $(this).children('i').addClass('fa-plus-circle'); $(this).children('i').removeClass('fa-minus-circle'); } $('#t1_".$counter."').slideToggle();\">
|
||||
<a class='clickable' onclick=\"if( $('#interventi_pianificare_".$counter."').css('display') == 'none' ){ $(this).children('i').removeClass('fa-plus-circle'); $(this).children('i').addClass('fa-minus-circle'); }else{ $(this).children('i').addClass('fa-plus-circle'); $(this).children('i').removeClass('fa-minus-circle'); } $('#interventi_pianificare_".$counter."').slideToggle();\">
|
||||
<i class='fa ".$class."'></i> ".$mese.'
|
||||
</a>
|
||||
</h4>';
|
||||
|
||||
echo '
|
||||
<div id="t1_'.$counter.'" '.$attr.'>
|
||||
<div id="interventi_pianificare_'.$counter.'" '.$attr.'>
|
||||
<table class="table table-hover table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th width="70">'.tr('Codice').'</th>
|
||||
<th width="70">'.tr('Codice').'</th>
|
||||
<th width="120">'.tr('Cliente').'</th>
|
||||
<th width="70"><small>'.tr('Data richiesta').'</small></th>
|
||||
<th width="70"><small>'.tr('Data scadenza').'</small></th>
|
||||
|
@ -64,17 +64,15 @@ switch ($operazione) {
|
||||
break;
|
||||
|
||||
case 'reset':
|
||||
|
||||
$dbo->query('DELETE FROM `co_fatturazione_contratti` WHERE `idcontratto`='.prepare($id_record));
|
||||
flash()->info(tr('Pianificazione rimossa'));
|
||||
|
||||
break;
|
||||
|
||||
case 'add_fattura':
|
||||
$contratto = Contratto::find($id_record);
|
||||
|
||||
$rata = post('rata');
|
||||
$pianificazione = $contratto->pianificazioni[$rata];
|
||||
$id_rata = post('rata');
|
||||
$pianificazione = Pianificazione::find($id_rata);
|
||||
$contratto = $pianificazione->contratto;
|
||||
|
||||
$data = post('data');
|
||||
$id_segment = post('id_segment');
|
||||
|
@ -1,13 +1,17 @@
|
||||
<?php
|
||||
|
||||
use Modules\Contratti\Contratto;
|
||||
use Plugins\PianificazioneFatturazione\Pianificazione;
|
||||
|
||||
include_once __DIR__.'/../../core.php';
|
||||
|
||||
$contratto = Contratto::find($id_record);
|
||||
$id_rata = get('rata');
|
||||
$pianificazione = Pianificazione::find($id_rata);
|
||||
$contratto = $pianificazione->contratto;
|
||||
|
||||
$rata = get('rata');
|
||||
$pianificazione = $contratto->pianificazioni[$rata];
|
||||
$id_pianificazione = $pianificazione->id;
|
||||
$numero_rata = $contratto->pianificazioni->search(function ($item) use ($id_pianificazione) {
|
||||
return $item->id = $id_pianificazione;
|
||||
}) + 1;
|
||||
|
||||
$module_fattura = Modules::get('Fatture di vendita');
|
||||
|
||||
@ -15,7 +19,7 @@ echo '
|
||||
<form action="" method="post">
|
||||
<input type="hidden" name="op" value="add_fattura">
|
||||
<input type="hidden" name="backto" value="record-edit">
|
||||
<input type="hidden" name="rata" value="'.$rata.'">
|
||||
<input type="hidden" name="rata" value="'.$id_rata.'">
|
||||
<input type="hidden" name="id_module" value="'.$id_module.'">
|
||||
<input type="hidden" name="id_plugin" value="'.$id_plugin.'">
|
||||
<input type="hidden" name="id_record" value="'.$id_record.'">';
|
||||
@ -42,7 +46,7 @@ echo '
|
||||
|
||||
// Descrizione fattura
|
||||
$descrizione = tr('Rata _N_ del contratto numero _NUM_', [
|
||||
'_N_' => ($rata + 1),
|
||||
'_N_' => $numero_rata,
|
||||
'_NUM_' => $contratto->numero,
|
||||
]);
|
||||
|
||||
|
@ -41,7 +41,7 @@ if (!$pianificazioni->isEmpty()) {
|
||||
<tbody>';
|
||||
|
||||
$previous = null;
|
||||
foreach ($pianificazioni as $rata => $pianificazione) {
|
||||
foreach ($pianificazioni as $pianificazione) {
|
||||
echo '
|
||||
<tr>
|
||||
<td>';
|
||||
@ -81,7 +81,7 @@ if (!$pianificazioni->isEmpty()) {
|
||||
// Creazione fattura
|
||||
echo '
|
||||
<td class="text-center">
|
||||
<button type="button" class="btn btn-primary btn-sm '.(!empty($fattura) ? 'disabled' : '').'" '.(!empty($fattura) ? 'disabled' : '').' onclick="crea_fattura('.$rata.')">
|
||||
<button type="button" class="btn btn-primary btn-sm '.(!empty($fattura) ? 'disabled' : '').'" '.(!empty($fattura) ? 'disabled' : '').' onclick="crea_fattura('.$pianificazione->id.')">
|
||||
<i class="fa fa-euro"></i> '.tr('Crea fattura').'
|
||||
</button>
|
||||
</td>
|
||||
|
@ -0,0 +1,100 @@
|
||||
<?php
|
||||
|
||||
use Plugins\PianificazioneFatturazione\Pianificazione;
|
||||
|
||||
include_once __DIR__.'/../../../core.php';
|
||||
|
||||
$pianificazioni = Pianificazione::doesntHave('fattura')->get();
|
||||
if ($pianificazioni->isEmpty()) {
|
||||
echo '
|
||||
<p>'.tr('Non ci sono fatture da emettere').'.</p>';
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$raggruppamenti = $pianificazioni->groupBy(function ($item) {
|
||||
return ucfirst($item->data_scadenza->formatLocalized('%B %Y'));
|
||||
});
|
||||
|
||||
$counter = 0;
|
||||
foreach ($raggruppamenti as $mese => $raggruppamento) {
|
||||
++$counter;
|
||||
|
||||
// Se cambia il mese ricreo l'intestazione della tabella
|
||||
if ($counter == 1) {
|
||||
$attr = '';
|
||||
$class = 'fa-minus-circle';
|
||||
} else {
|
||||
$attr = 'style="display:none;"';
|
||||
$class = 'fa-plus-circle';
|
||||
}
|
||||
|
||||
echo "
|
||||
<h4>
|
||||
<a class='clickable' onclick=\"if( $('#rate_pianificare_".$counter."').css('display') == 'none' ){ $(this).children('i').removeClass('fa-plus-circle'); $(this).children('i').addClass('fa-minus-circle'); }else{ $(this).children('i').addClass('fa-plus-circle'); $(this).children('i').removeClass('fa-minus-circle'); } $('#rate_pianificare_".$counter."').slideToggle();\">
|
||||
<i class='fa ".$class."'></i> ".$mese.'
|
||||
</a>
|
||||
</h4>';
|
||||
|
||||
echo '
|
||||
<div id="rate_pianificare_'.$counter.'" '.$attr.'>
|
||||
<table class="table table-hover table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th width="25%">'.tr('Entro il').'</th>
|
||||
<th width="35%">'.tr('Ragione sociale').'</th>
|
||||
<th width="20%">'.tr('Importo').'</th>
|
||||
<th width="10%"></th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
<tbody>';
|
||||
|
||||
// Elenco fatture da emettere
|
||||
foreach ($pianificazioni as $pianificazione) {
|
||||
$contratto = $pianificazione->contratto;
|
||||
$anagrafica = $contratto->anagrafica;
|
||||
|
||||
echo '
|
||||
<tr>
|
||||
<td>
|
||||
'.dateFormat($pianificazione->data_scadenza).'
|
||||
<br><small>'.reference($contratto)."</small>
|
||||
</td>
|
||||
|
||||
<td>
|
||||
<a href='".$rootdir.'/editor.php?id_module='.Modules::get('Anagrafiche')['id'].'&id_record='.$anagrafica->id."'>".nl2br($anagrafica->ragione_sociale).'</a>
|
||||
</td>
|
||||
|
||||
<td>
|
||||
'.moneyFormat($pianificazione->totale).'<br>
|
||||
<small>'.tr('_TOT_ / _NUM_ rate', [
|
||||
'_TOT_' => moneyFormat($contratto->totale),
|
||||
'_NUM_' => numberFormat($contratto->pianificazioni()->count(), 0),
|
||||
]).'</small>
|
||||
</td>';
|
||||
|
||||
// Pulsanti
|
||||
echo '
|
||||
<td class="text-center">
|
||||
<button type="button" class="btn btn-primary btn-sm" onclick="crea_fattura('.$contratto->id.', '.$pianificazione->id.')">
|
||||
<i class="fa fa-euro"></i> '.tr('Crea fattura').'
|
||||
</button>
|
||||
</td>
|
||||
</tr>';
|
||||
}
|
||||
|
||||
echo '
|
||||
</tbody>
|
||||
</table>
|
||||
</div>';
|
||||
}
|
||||
|
||||
$modulo_pianificazione = Modules::get('Contratti');
|
||||
$plugin_pianificazione = Plugins::get('Pianificazione fatturazione');
|
||||
echo '
|
||||
<script>
|
||||
function crea_fattura(contratto, rata){
|
||||
openModal("Crea fattura", "'.$plugin_pianificazione->fileurl('crea_fattura.php').'?id_module='.$modulo_pianificazione->id.'&id_plugin='.$plugin_pianificazione->id.'&id_record=" + contratto + "&rata=" + rata);
|
||||
}
|
||||
</script>';
|
14
reset.php
14
reset.php
@ -41,7 +41,7 @@ switch (post('op')) {
|
||||
flash()->info(tr("Se le informazioni inserite corrispondono ai dati di un utente, riceverai a breve un'email all'indirizzo collegato").'.');
|
||||
|
||||
redirect(ROOTDIR.'/index.php');
|
||||
exit();
|
||||
exit();
|
||||
break;
|
||||
|
||||
case 'update':
|
||||
@ -58,7 +58,7 @@ switch (post('op')) {
|
||||
flash()->info(tr('Password cambiata!'));
|
||||
|
||||
redirect(ROOTDIR.'/index.php');
|
||||
exit();
|
||||
exit();
|
||||
break;
|
||||
}
|
||||
|
||||
@ -100,7 +100,7 @@ if (Auth::isBrute()) {
|
||||
}
|
||||
|
||||
echo '
|
||||
<form action="" method="post" class="box box-center-large box-warning" id="reset">
|
||||
<form action="" method="post" class="box box-center-large box-warning" id="reset">
|
||||
<div class="box-header with-border text-center">
|
||||
<a href="'.ROOTDIR.'/index.php"><i class="fa fa-arrow-left btn btn-xs btn-warning pull-left tip" title="'.tr('Torna indietro').'" ></i></a>
|
||||
<h3 class="box-title">'.$pageTitle.'</h3>
|
||||
@ -114,22 +114,22 @@ if (empty($token)) {
|
||||
|
||||
<p>'.tr("Per reimpostare password, inserisci l'username con cui hai accesso al gestionale e l'indirizzo email associato all'utente").'.<br>
|
||||
'.tr("Se i dati inseriti risulteranno corretti riceverai un'email dove sarà indicato il link da cui potrai reimpostare la tua password").'.</p>
|
||||
|
||||
|
||||
{[ "type": "text", "label": "'.tr('Username').'", "placeholder": "'.tr('Username').'", "name": "username", "icon-before": "<i class=\"fa fa-user\"></i>", "required": 1 ]}
|
||||
|
||||
|
||||
{[ "type": "email", "label": "'.tr('Email').'", "placeholder": "'.tr('Email').'", "name": "email", "icon-before": "<i class=\"fa fa-envelope\"></i>", "required": 1 ]}';
|
||||
} else {
|
||||
echo '
|
||||
<input type="hidden" name="op" value="update">
|
||||
|
||||
<p>'.tr('Inserisci la nuova password per il tuo account').':</p>
|
||||
|
||||
|
||||
{[ "type": "password", "label": "'.tr('Password').'", "name": "password", "required": 1, "strength": "#submit-button", "icon-before": "<i class=\"fa fa-lock\"></i>" ]}';
|
||||
}
|
||||
|
||||
echo '
|
||||
</div>
|
||||
|
||||
|
||||
<div class="box-footer">
|
||||
<button type="submit" id="submit-button" class="btn btn-success btn-block">
|
||||
<i class="fa fa-arrow-right"></i> '.tr('Invia richiesta').'
|
||||
|
@ -12,10 +12,10 @@ $totale_iva = $documento->iva;
|
||||
$totale = $documento->totale;
|
||||
|
||||
$volume = $righe->sum(function ($item) {
|
||||
return $item->isArticolo() ? $item->articolo->volume*$item->qta : 0;
|
||||
return $item->isArticolo() ? $item->articolo->volume * $item->qta : 0;
|
||||
});
|
||||
$peso_lordo = $righe->sum(function ($item) {
|
||||
return $item->isArticolo() ? $item->articolo->peso_lordo*$item->qta : 0;
|
||||
return $item->isArticolo() ? $item->articolo->peso_lordo * $item->qta : 0;
|
||||
});
|
||||
|
||||
// TABELLA PRINCIPALE
|
||||
|
@ -91,11 +91,8 @@ foreach ($righe as $riga) {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Informazioni su CIG, CUP, ...
|
||||
if ($riga->hasOriginal()) {
|
||||
|
||||
// Informazioni su CIG, CUP, ...
|
||||
if ($riga->hasOriginal()) {
|
||||
$documento_originale = $riga->getOriginal()->parent;
|
||||
|
||||
$num_item = $documento_originale['num_item'];
|
||||
@ -110,13 +107,10 @@ foreach ($righe as $riga) {
|
||||
'_CODICE_CUP_' => $codice_cup ? ', CUP: '.$codice_cup : null,
|
||||
]);
|
||||
|
||||
|
||||
echo '
|
||||
<br><small>'.$extra_riga.'</small>';
|
||||
}
|
||||
|
||||
|
||||
|
||||
echo '
|
||||
</td>';
|
||||
|
||||
|
@ -15,10 +15,10 @@ $netto_a_pagare = abs($documento->netto);
|
||||
$show_sconto = $sconto > 0;
|
||||
|
||||
$volume = $righe->sum(function ($item) {
|
||||
return $item->isArticolo() ? $item->articolo->volume*$item->qta : 0;
|
||||
return $item->isArticolo() ? $item->articolo->volume * $item->qta : 0;
|
||||
});
|
||||
$peso_lordo = $righe->sum(function ($item) {
|
||||
return $item->isArticolo() ? $item->articolo->peso_lordo*$item->qta : 0;
|
||||
return $item->isArticolo() ? $item->articolo->peso_lordo * $item->qta : 0;
|
||||
});
|
||||
|
||||
$width = round(100 / ($show_sconto ? 5 : 3), 2);
|
||||
|
@ -533,4 +533,8 @@ INSERT INTO `zz_views` (`id_module`, `name`, `query`, `order`, `search`, `format
|
||||
|
||||
-- Aggiunta colonna Rif. fattura per attività
|
||||
INSERT INTO `zz_views` (`id_module`, `name`, `query`, `order`, `search`, `format`, `default`, `visible`) VALUES
|
||||
((SELECT `id` FROM `zz_modules` WHERE `name` = 'Interventi'), 'Rif. fattura', 'fattura.info', 17, 1, 0, 0, 1);
|
||||
((SELECT `id` FROM `zz_modules` WHERE `name` = 'Interventi'), 'Rif. fattura', 'fattura.info', 17, 1, 0, 0, 1);
|
||||
|
||||
-- Aggiornamento widget Rate contrattuali
|
||||
UPDATE `zz_widgets` SET `more_link` = './plugins/pianificazione_fatturazione/widgets/rate_contrattuali.php' WHERE `zz_widgets`.`name` = 'Rate contrattuali';
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user