Note di accredito/addebito
Inotroduzione della gestione interna di note di accredito e di addebito.
This commit is contained in:
parent
c48d66b519
commit
ff66ff8854
|
@ -58,6 +58,10 @@ if (!empty($rs2)) {
|
|||
// Causale
|
||||
$dir = ($r['qta'] < 0) ? 'vendita' : 'acquisto';
|
||||
|
||||
if (!empty($r['iddocumento'])) {
|
||||
$dir = $dbo->fetchArray('SELECT dir FROM co_tipidocumento WHERE id = (SELECT idtipodocumento FROM co_documenti WHERE id = '.prepare($r['iddocumento']).')')[0]['dir'] == 'entrata' ? 'vendita' : 'acquisto';
|
||||
}
|
||||
|
||||
echo '
|
||||
<td>'.$r['movimento'].'
|
||||
'.((!empty($r['idintervento'])) ? Modules::link('Interventi', $r['idintervento']) : '').'
|
||||
|
|
|
@ -5,6 +5,6 @@ include_once __DIR__.'/../../core.php';
|
|||
if (!in_array($records[0]['stato'], ['Bozza', 'Fatturato'])) {
|
||||
echo '
|
||||
<a class="btn btn-info" data-href="'.$rootdir.'/modules/fatture/crea_documento.php?id_module='.$id_module.'&id_record='.$id_record.'&documento=fattura" data-toggle="modal" data-title="Crea fattura" data-target="#bs-popup">
|
||||
<i class="fa fa-magic"></i>.'.tr('Crea fattura').'</i>
|
||||
<i class="fa fa-magic"></i> '.tr('Crea fattura').'
|
||||
</a>';
|
||||
}
|
||||
|
|
|
@ -1057,7 +1057,7 @@ switch (post('op')) {
|
|||
foreach ($post['qta_da_evadere'] as $i => $value) {
|
||||
// Processo solo le righe da evadere
|
||||
if ($post['evadere'][$i] == 'on') {
|
||||
$idrigaordine = $i;
|
||||
$idriga = $i;
|
||||
$idarticolo = post('idarticolo')[$i];
|
||||
$descrizione = post('descrizione')[$i];
|
||||
$qta = post('qta_da_evadere')[$i];
|
||||
|
@ -1068,7 +1068,7 @@ switch (post('op')) {
|
|||
$sconto = Translator::numberToLocale(post('sconto')[$i]);
|
||||
$sconto = $sconto * $qta;
|
||||
|
||||
$qprc = 'SELECT tipo_sconto, sconto_unitario FROM or_righe_ordini WHERE id='.prepare($idrigaordine);
|
||||
$qprc = 'SELECT tipo_sconto, sconto_unitario FROM or_righe_ordini WHERE id='.prepare($idriga);
|
||||
$rsprc = $dbo->fetchArray($qprc);
|
||||
|
||||
$sconto_unitario = $rsprc[0]['sconto_unitario'];
|
||||
|
@ -1088,13 +1088,13 @@ switch (post('op')) {
|
|||
if (!empty($idarticolo)) {
|
||||
$idiva_acquisto = $idiva;
|
||||
$prezzo_acquisto = $subtot;
|
||||
$idriga = add_articolo_infattura($id_record, $idarticolo, $descrizione, $idiva_acquisto, $qta, $prezzo_acquisto, $sconto, $sconto_unitario, $tipo_sconto);
|
||||
$riga = add_articolo_infattura($id_record, $idarticolo, $descrizione, $idiva_acquisto, $qta, $prezzo_acquisto, $sconto, $sconto_unitario, $tipo_sconto);
|
||||
|
||||
// Aggiornamento seriali dalla riga dell'ordine
|
||||
$serials = is_array($post['serial'][$i]) ? $post['serial'][$i] : [];
|
||||
$serials = array_filter($serials, function ($value) { return !empty($value); });
|
||||
|
||||
$dbo->sync('mg_prodotti', ['id_riga_documento' => $idriga, 'dir' => $dir, 'id_articolo' => $idarticolo], ['serial' => $serials]);
|
||||
$dbo->sync('mg_prodotti', ['id_riga_documento' => $riga, 'dir' => $dir, 'id_articolo' => $idarticolo], ['serial' => $serials]);
|
||||
|
||||
// Imposto la provenienza dell'ordine
|
||||
$dbo->query('UPDATE co_righe_documenti SET idordine='.prepare($idordine).' WHERE id='.prepare($idriga));
|
||||
|
@ -1107,7 +1107,7 @@ switch (post('op')) {
|
|||
}
|
||||
|
||||
// Scalo la quantità dall'ordine
|
||||
$dbo->query('UPDATE or_righe_ordini SET qta_evasa = qta_evasa+'.$qta.' WHERE id='.prepare($idrigaordine));
|
||||
$dbo->query('UPDATE or_righe_ordini SET qta_evasa = qta_evasa+'.$qta.' WHERE id='.prepare($idriga));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1501,7 +1501,7 @@ switch (post('op')) {
|
|||
foreach ($post['qta_da_evadere'] as $i => $value) {
|
||||
// Processo solo le righe da evadere
|
||||
if ($post['evadere'][$i] == 'on') {
|
||||
$idrigaordine = $i;
|
||||
$idriga = $i;
|
||||
$idarticolo = post('idarticolo')[$i];
|
||||
$descrizione = post('descrizione')[$i];
|
||||
|
||||
|
@ -1512,7 +1512,7 @@ switch (post('op')) {
|
|||
$sconto = $post['sconto'][$i];
|
||||
$sconto = $sconto * $qta;
|
||||
|
||||
$qprc = 'SELECT tipo_sconto, sconto_unitario FROM or_righe_ordini WHERE id='.prepare($idrigaordine);
|
||||
$qprc = 'SELECT tipo_sconto, sconto_unitario FROM or_righe_ordini WHERE id='.prepare($idriga);
|
||||
$rsprc = $dbo->fetchArray($qprc);
|
||||
|
||||
$sconto_unitario = $rsprc[0]['sconto_unitario'];
|
||||
|
@ -1538,7 +1538,7 @@ switch (post('op')) {
|
|||
$riga = add_articolo_infattura($id_record, $idarticolo, $descrizione, $idiva_acquisto, $qta, $prezzo_acquisto, 0, 0, 'UNT', 0, $idconto);
|
||||
|
||||
// Lettura lotto, serial, altro dalla riga dell'ordine
|
||||
$dbo->query('INSERT INTO mg_prodotti (id_riga_documento, id_articolo, dir, serial, lotto, altro) SELECT '.prepare($riga).', '.prepare($idarticolo).', '.prepare($dir).', serial, lotto, altro FROM mg_prodotti AS t WHERE id_riga_ordine='.prepare($idrigaordine));
|
||||
$dbo->query('INSERT INTO mg_prodotti (id_riga_documento, id_articolo, dir, serial, lotto, altro) SELECT '.prepare($riga).', '.prepare($idarticolo).', '.prepare($dir).', serial, lotto, altro FROM mg_prodotti AS t WHERE id_riga_ordine='.prepare($idriga));
|
||||
}
|
||||
|
||||
// Inserimento riga normale
|
||||
|
@ -1548,7 +1548,7 @@ switch (post('op')) {
|
|||
}
|
||||
|
||||
// Scalo la quantità dall ordine
|
||||
$dbo->query('UPDATE or_righe_ordini SET qta_evasa = qta_evasa+'.$qta.' WHERE id='.prepare($idrigaordine));
|
||||
$dbo->query('UPDATE or_righe_ordini SET qta_evasa = qta_evasa+'.$qta.' WHERE id='.prepare($idriga));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1557,6 +1557,87 @@ switch (post('op')) {
|
|||
$_SESSION['infos'][] = tr('Aggiunti nuovi articoli in fattura!');
|
||||
|
||||
break;
|
||||
|
||||
// Nota di accredito
|
||||
case 'nota_accredito':
|
||||
$id_segment = post('id_segment');
|
||||
|
||||
$numero = get_new_numerofattura($records[0]['data']);
|
||||
$numero_esterno = get_new_numerosecondariofattura($records[0]['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 accredito\' 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();
|
||||
|
||||
// Lettura di tutte le righe della tabella in arrivo
|
||||
foreach ($post['qta_da_evadere'] as $i => $value) {
|
||||
// Processo solo le righe da evadere
|
||||
if ($post['evadere'][$i] == 'on') {
|
||||
$idriga = $i;
|
||||
$idarticolo = post('idarticolo')[$i];
|
||||
$descrizione = post('descrizione')[$i];
|
||||
|
||||
$qta = -$post['qta_da_evadere'][$i];
|
||||
$um = post('um')[$i];
|
||||
|
||||
$subtot = $post['subtot'][$i] * $qta;
|
||||
$sconto = $post['sconto'][$i];
|
||||
$sconto = $sconto * $qta;
|
||||
|
||||
$qprc = 'SELECT tipo_sconto, sconto_unitario FROM co_righe_documenti WHERE id='.prepare($idriga);
|
||||
$rsprc = $dbo->fetchArray($qprc);
|
||||
|
||||
$sconto_unitario = $rsprc[0]['sconto_unitario'];
|
||||
$tipo_sconto = $rsprc[0]['tipo_sconto'];
|
||||
|
||||
$idiva = post('idiva')[$i];
|
||||
|
||||
// Calcolo l'iva indetraibile
|
||||
$q = 'SELECT percentuale, indetraibile FROM co_iva WHERE id='.prepare($idiva);
|
||||
$rs = $dbo->fetchArray($q);
|
||||
$iva = ($subtot - $sconto) / 100 * $rs[0]['percentuale'];
|
||||
$iva_indetraibile = $iva / 100 * $rs[0]['indetraibile'];
|
||||
|
||||
// Leggo la descrizione iva
|
||||
$query = 'SELECT * FROM co_iva WHERE id='.prepare($idiva);
|
||||
$rs = $dbo->fetchArray($query);
|
||||
$desc_iva = $rs[0]['descrizione'];
|
||||
|
||||
// Se sto aggiungendo un articolo uso la funzione per inserirlo e incrementare la giacenza
|
||||
if (!empty($idarticolo)) {
|
||||
$idiva_acquisto = $idiva;
|
||||
$prezzo_acquisto = $subtot;
|
||||
$riga = add_articolo_infattura($id_record, $idarticolo, $descrizione, $idiva_acquisto, $qta, $prezzo_acquisto, $sconto, $sconto_unitario, $tipo_sconto);
|
||||
|
||||
// Aggiornamento seriali dalla riga dell'ordine
|
||||
$serials = is_array($post['serial'][$i]) ? $post['serial'][$i] : [];
|
||||
$serials = array_filter($serials, function ($value) { return !empty($value); });
|
||||
|
||||
$dbo->sync('mg_prodotti', ['id_riga_documento' => $riga, 'dir' => 'uscita', 'id_articolo' => $idarticolo], ['serial' => $serials]);
|
||||
}
|
||||
|
||||
// Inserimento riga normale
|
||||
elseif ($qta != 0) {
|
||||
$query = 'INSERT INTO co_righe_documenti(iddocumento, idarticolo, descrizione, idconto, idordine, idiva, desc_iva, iva, iva_indetraibile, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, `order`) VALUES('.prepare($id_record).', '.prepare($idarticolo).', '.prepare($descrizione).', '.prepare($idconto).', '.prepare($idordine).', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).', '.prepare($um).', '.prepare($qta).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))';
|
||||
$dbo->query($query);
|
||||
}
|
||||
|
||||
// Scalo la quantità dall ordine
|
||||
$dbo->query('UPDATE co_righe_documenti SET qta_evasa = qta_evasa+'.(-$qta).' WHERE id='.prepare($idriga));
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
// Nota di addebito
|
||||
if (get('op') == 'nota_addebito') {
|
||||
$id_segment = $records[0]['id_segment'];
|
||||
|
||||
$numero = get_new_numerofattura($records[0]['data']);
|
||||
$numero_esterno = get_new_numerosecondariofattura($records[0]['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 addebito\' 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));
|
||||
$id_record = $dbo->lastInsertedID();
|
||||
}
|
||||
|
||||
// Aggiornamento stato dei ddt presenti in questa fattura in base alle quantità totali evase
|
||||
|
|
|
@ -12,3 +12,23 @@ echo '
|
|||
<button type="button" class="btn btn-primary" onclick="if( confirm(\'Duplicare questa fattura?\') ){ $(\'#form-copy\').submit(); }">
|
||||
<i class="fa fa-copy"></i> '.tr('Duplica fattura').'
|
||||
</button>';
|
||||
|
||||
if ($dir == 'entrata' && empty($records[0]['ref_documento']) && $records[0]['stato'] == 'Emessa') {
|
||||
echo '
|
||||
<div class="btn-group">
|
||||
<button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||
<i class="fa fa-magic"></i> '.tr('Crea').' <span class="caret"></span>
|
||||
<span class="sr-only">Toggle Dropdown</span>
|
||||
</button>
|
||||
|
||||
<ul class="dropdown-menu dropdown-menu-right">
|
||||
<li><a href="'.$rootdir.'/editor.php?id_module='.$id_module.'&id_record='.$id_record.'&op=nota_addebito&backto=record-edit">
|
||||
'.tr('Nota di addebito').'
|
||||
</a></li>
|
||||
|
||||
<li><a data-href="'.$rootdir.'/modules/fatture/crea_documento.php?id_module='.$id_module.'&id_record='.$id_record.'&iddocumento='.$id_record.'" data-title="Aggiungi nota di accredito" data-target="#bs-popup">
|
||||
'.tr('Nota di accredito').'
|
||||
</a></li>
|
||||
</ul>
|
||||
</div>';
|
||||
}
|
||||
|
|
|
@ -6,10 +6,10 @@ $module = Modules::get($id_module);
|
|||
|
||||
$data = [
|
||||
'ddt' => [
|
||||
'table' => 'dt_ddt',
|
||||
'rows' => 'dt_righe_ddt',
|
||||
'id' => 'idddt',
|
||||
'condition' => '(id_riga_documento IS NOT NULL)',
|
||||
'table' => 'dt_ddt', // Tabella del documento
|
||||
'rows' => 'dt_righe_ddt', // Tabella delle righe
|
||||
'id' => 'idddt', // ID nella tabella delle righe
|
||||
'condition' => '(id_riga_documento IS NOT NULL)', // Condizione per i seriali
|
||||
],
|
||||
'ord' => [
|
||||
'table' => 'or_ordini',
|
||||
|
@ -17,6 +17,13 @@ $data = [
|
|||
'id' => 'idordine',
|
||||
'condition' => '(id_riga_ddt IS NOT NULL OR id_riga_documento IS NOT NULL)',
|
||||
],
|
||||
'fat' => [
|
||||
'table' => 'co_documenti',
|
||||
'rows' => 'co_righe_documenti',
|
||||
'id' => 'iddocumento',
|
||||
'condition' => '(1 = 2)',
|
||||
'allow-empty' => true,
|
||||
],
|
||||
];
|
||||
|
||||
$documento = get('documento');
|
||||
|
@ -26,11 +33,22 @@ if ($module['name'] == 'Ordini cliente' || $module['name'] == 'Ordini fornitore'
|
|||
$op = ($documento == 'ddt') ? 'ddt_da_ordine' : 'fattura_da_ordine';
|
||||
|
||||
$head = tr('Ordine numero _NUM_');
|
||||
} else {
|
||||
|
||||
$dir = ($module['name'] == 'Ordini cliente') ? 'entrata' : 'uscita';
|
||||
} elseif ($module['name'] == 'Ddt di vendita' || $module['name'] == 'Ddt di acquisto') {
|
||||
$pos = 'ddt';
|
||||
$op = 'fattura_da_ddt';
|
||||
|
||||
$head = tr('Ddt numero _NUM_');
|
||||
|
||||
$dir = ($module['name'] == 'Ddt di vendita') ? 'entrata' : 'uscita';
|
||||
} else {
|
||||
$pos = 'fat';
|
||||
$op = 'nota_accredito';
|
||||
|
||||
$head = tr('Fattura numero _NUM_');
|
||||
|
||||
$dir = 'entrata';
|
||||
}
|
||||
|
||||
$table = $data[$pos]['table'];
|
||||
|
@ -38,19 +56,13 @@ $rows = $data[$pos]['rows'];
|
|||
$id = $data[$pos]['id'];
|
||||
$row = str_replace('id', 'id_riga_', $id);
|
||||
|
||||
if ($module['name'] == 'Ordini cliente' || $module['name'] == 'Ddt di vendita') {
|
||||
$dir = 'entrata';
|
||||
} else {
|
||||
$dir = 'uscita';
|
||||
}
|
||||
|
||||
if ($module['name'] == 'Ordini cliente') {
|
||||
$module_name = ($documento == 'ddt') ? 'Ddt di vendita' : 'Fatture di vendita';
|
||||
} elseif ($module['name'] == 'Ordini fornitore') {
|
||||
$module_name = ($documento == 'ddt') ? 'Ddt di acquisto' : 'Fatture di acquisto';
|
||||
} elseif ($module['name'] == 'Ddt di acquisto') {
|
||||
$module_name = 'Fatture di acquisto';
|
||||
} elseif ($module['name'] == 'Ddt di vendita') {
|
||||
} else {
|
||||
$module_name = 'Fatture di vendita';
|
||||
}
|
||||
|
||||
|
@ -178,11 +190,15 @@ if (!empty($rs)) {
|
|||
echo '
|
||||
<td>';
|
||||
if (!empty($r['abilita_serial'])) {
|
||||
$values = $dbo->fetchArray('SELECT DISTINCT serial FROM mg_prodotti WHERE dir=\''.$dir.'\' AND '.$row.' = \''.$r['id'].'\' AND serial IS NOT NULL AND serial NOT IN (SELECT serial FROM mg_prodotti WHERE serial IS NOT NULL AND dir=\''.$dir.'\' AND '.$data[$pos]['condition'].')');
|
||||
$query = 'SELECT DISTINCT serial AS id, serial AS descrizione FROM mg_prodotti WHERE dir=\''.$dir.'\' AND '.$row.' = \''.$r['id'].'\' AND serial IS NOT NULL AND serial NOT IN (SELECT serial FROM mg_prodotti AS t WHERE serial IS NOT NULL AND dir=\''.$dir.'\' AND '.$data[$pos]['condition'].')';
|
||||
|
||||
echo '
|
||||
{[ "type": "select", "name": "serial['.$i.']['.$r['id'].']", "id": "serial_'.$i.'", "multiple": 1, "values": "query=SELECT DISTINCT serial AS id, serial AS descrizione FROM mg_prodotti WHERE dir=\''.$dir.'\' AND '.$row.' = \''.$r['id'].'\' AND serial IS NOT NULL AND serial NOT IN (SELECT serial FROM mg_prodotti WHERE serial IS NOT NULL AND dir=\''.$dir.'\' AND '.$data[$pos]['condition'].')", "value": "'.implode(',', array_column($values, 'serial')).'", "extra": "data-maximum=\"'.intval($r['qta_rimanente']).'\"" ]}
|
||||
';
|
||||
$values = $dbo->fetchArray($query);
|
||||
if (!empty($values)) {
|
||||
echo '
|
||||
{[ "type": "select", "name": "serial['.$r['id'].'][]", "id": "serial_'.$i.'", "multiple": 1, "values": "query='.$query.'", "value": "'.implode(',', array_column($values, 'id')).'", "extra": "data-maximum=\"'.intval($r['qta_rimanente']).'\"" ]}';
|
||||
} else {
|
||||
echo '-';
|
||||
}
|
||||
} else {
|
||||
echo '-';
|
||||
}
|
||||
|
@ -227,12 +243,12 @@ echo '
|
|||
?>
|
||||
|
||||
<script type="text/javascript">
|
||||
function ricalcola_subtotale_riga( r ){
|
||||
subtot = $("#subtot_"+r).val();
|
||||
sconto = $("#sconto_"+r).val();
|
||||
iva = $("#iva_"+r).val();
|
||||
function ricalcola_subtotale_riga(r) {
|
||||
subtot = $("#subtot_" + r).val();
|
||||
sconto = $("#sconto_" + r).val();
|
||||
iva = $("#iva_" + r).val();
|
||||
|
||||
qtamax = $("#qtamax_"+r).val() ? $("#qtamax_"+r).val() : 0;
|
||||
qtamax = $("#qtamax_" + r).val() ? $("#qtamax_" + r).val() : 0;
|
||||
|
||||
subtot = parseFloat(subtot);
|
||||
sconto = parseFloat(sconto);
|
||||
|
@ -241,66 +257,73 @@ echo '
|
|||
|
||||
subtot = subtot - sconto;
|
||||
|
||||
qta = $("#qta_"+r).val().toEnglish();
|
||||
qta = $("#qta_" + r).val().toEnglish();
|
||||
|
||||
// Se inserisco una quantità da evadere maggiore di quella rimanente, la imposto al massimo possibile
|
||||
if(qta > qtamax){
|
||||
if (qta > qtamax) {
|
||||
qta = qtamax;
|
||||
|
||||
$('#qta_'+r).val(qta);
|
||||
$('#qta_' + r).val(qta);
|
||||
}
|
||||
|
||||
// Se tolgo la spunta della casella dell'evasione devo azzerare i conteggi
|
||||
if(isNaN(qta) || !$('#checked_'+r).is(':checked')){
|
||||
if (isNaN(qta) || !$('#checked_' + r).is(':checked')) {
|
||||
qta = 0;
|
||||
}
|
||||
|
||||
$("#serial_"+r).selectClear();
|
||||
$("#serial_"+r).select2("destroy");
|
||||
$("#serial_"+r).data('maximum', qta);
|
||||
$("#serial_" + r).selectClear();
|
||||
$("#serial_" + r).select2("destroy");
|
||||
$("#serial_" + r).data('maximum', qta);
|
||||
start_superselect();
|
||||
|
||||
subtotale = (subtot * qta + iva * qta).toLocale();
|
||||
|
||||
$("#subtotale_"+r).html(subtotale+" €");
|
||||
$("#subtotaledettagli_"+r).html((subtot * qta).toLocale() + " + " + (iva * qta).toLocale());
|
||||
$("#subtotale_" + r).html(subtotale + " €");
|
||||
$("#subtotaledettagli_" + r).html((subtot * qta).toLocale() + " + " + (iva * qta).toLocale());
|
||||
|
||||
ricalcola_totale();
|
||||
}
|
||||
|
||||
function ricalcola_totale(){
|
||||
function ricalcola_totale() {
|
||||
tot_qta = 0;
|
||||
r = 0;
|
||||
totale = 0.00;
|
||||
$('input[id*=qta_]').each( function(){
|
||||
$('input[id*=qta_]').each(function() {
|
||||
qta = $(this).val().toEnglish();
|
||||
|
||||
if( !$('#checked_'+r).is(':checked') || isNaN(qta) ){
|
||||
if (!$('#checked_' + r).is(':checked') || isNaN(qta)) {
|
||||
qta = 0;
|
||||
}
|
||||
|
||||
subtot = $("#subtot_"+r).val();
|
||||
sconto = $("#sconto_"+r).val();
|
||||
iva = $("#iva_"+r).val();
|
||||
subtot = $("#subtot_" + r).val();
|
||||
sconto = $("#sconto_" + r).val();
|
||||
iva = $("#iva_" + r).val();
|
||||
|
||||
subtot = parseFloat(subtot);
|
||||
sconto = parseFloat(sconto);
|
||||
iva = parseFloat(iva);
|
||||
|
||||
subtot = subtot-sconto;
|
||||
subtot = subtot - sconto;
|
||||
|
||||
totale += subtot*qta+iva*qta;
|
||||
totale += subtot * qta + iva * qta;
|
||||
|
||||
r++;
|
||||
|
||||
tot_qta +=qta;
|
||||
tot_qta += qta;
|
||||
});
|
||||
|
||||
$('#totale').html( (totale.toLocale()) + " €" );
|
||||
$('#totale').html((totale.toLocale()) + " €");
|
||||
|
||||
if( tot_qta>0 )
|
||||
$('#submit_btn').show();
|
||||
<?php
|
||||
|
||||
if (empty($data[$pos]['allow-empty'])) {
|
||||
echo '
|
||||
if (tot_qta > 0)
|
||||
$("#submit_btn").show();
|
||||
else
|
||||
$('#submit_btn').hide();
|
||||
$("#submit_btn").hide();';
|
||||
}
|
||||
|
||||
?>
|
||||
}
|
||||
</script>
|
||||
|
|
|
@ -30,6 +30,7 @@ if ($dir == 'entrata') {
|
|||
<div class="panel-body">
|
||||
|
||||
<?php
|
||||
|
||||
if ($dir == 'entrata') {
|
||||
$rs2 = $dbo->fetchArray('SELECT piva, codice_fiscale, citta, indirizzo, cap, provincia FROM an_anagrafiche WHERE idanagrafica='.prepare($records[0]['idanagrafica']));
|
||||
$campi_mancanti = [];
|
||||
|
@ -261,56 +262,58 @@ if ($records[0]['stato'] == 'Emessa') {
|
|||
<div class="pull-left">
|
||||
<?php
|
||||
if ($records[0]['stato'] != 'Pagato' && $records[0]['stato'] != 'Emessa') {
|
||||
if ($dir == 'entrata') {
|
||||
// Lettura interventi non rifiutati, non fatturati e non collegati a preventivi o contratti
|
||||
$int_query = 'SELECT COUNT(*) AS tot FROM in_interventi INNER JOIN in_statiintervento ON in_interventi.idstatointervento=in_statiintervento.idstatointervento WHERE idanagrafica='.prepare($records[0]['idanagrafica']).' AND in_statiintervento.completato=1 AND in_interventi.id NOT IN (SELECT idintervento FROM co_righe_documenti WHERE idintervento IS NOT NULL) AND in_interventi.id NOT IN (SELECT idintervento FROM co_preventivi_interventi WHERE idintervento IS NOT NULL) AND in_interventi.id NOT IN (SELECT idintervento FROM co_contratti_promemoria WHERE idintervento IS NOT NULL)';
|
||||
$interventi = $dbo->fetchArray($int_query)[0]['tot'];
|
||||
|
||||
// Se non trovo niente provo a vedere se ce ne sono per clienti terzi
|
||||
if (empty($interventi)) {
|
||||
// Lettura interventi non rifiutati, non fatturati e non collegati a preventivi o contratti (clienti terzi)
|
||||
$int_query = 'SELECT COUNT(*) AS tot FROM in_interventi INNER JOIN in_statiintervento ON in_interventi.idstatointervento=in_statiintervento.idstatointervento WHERE idclientefinale='.prepare($records[0]['idanagrafica']).' AND in_statiintervento.completato=1 AND in_interventi.id NOT IN (SELECT idintervento FROM co_righe_documenti WHERE idintervento IS NOT NULL) AND in_interventi.id NOT IN (SELECT idintervento FROM co_preventivi_interventi WHERE idintervento IS NOT NULL) AND in_interventi.id NOT IN (SELECT idintervento FROM co_contratti_promemoria WHERE idintervento IS NOT NULL)';
|
||||
if (empty($records[0]['ref_documento'])) {
|
||||
if ($dir == 'entrata') {
|
||||
// Lettura interventi non rifiutati, non fatturati e non collegati a preventivi o contratti
|
||||
$int_query = 'SELECT COUNT(*) AS tot FROM in_interventi INNER JOIN in_statiintervento ON in_interventi.idstatointervento=in_statiintervento.idstatointervento WHERE idanagrafica='.prepare($records[0]['idanagrafica']).' AND in_statiintervento.completato=1 AND in_interventi.id NOT IN (SELECT idintervento FROM co_righe_documenti WHERE idintervento IS NOT NULL) AND in_interventi.id NOT IN (SELECT idintervento FROM co_preventivi_interventi WHERE idintervento IS NOT NULL) AND in_interventi.id NOT IN (SELECT idintervento FROM co_contratti_promemoria WHERE idintervento IS NOT NULL)';
|
||||
$interventi = $dbo->fetchArray($int_query)[0]['tot'];
|
||||
}
|
||||
|
||||
echo '
|
||||
// Se non trovo niente provo a vedere se ce ne sono per clienti terzi
|
||||
if (empty($interventi)) {
|
||||
// Lettura interventi non rifiutati, non fatturati e non collegati a preventivi o contratti (clienti terzi)
|
||||
$int_query = 'SELECT COUNT(*) AS tot FROM in_interventi INNER JOIN in_statiintervento ON in_interventi.idstatointervento=in_statiintervento.idstatointervento WHERE idclientefinale='.prepare($records[0]['idanagrafica']).' AND in_statiintervento.completato=1 AND in_interventi.id NOT IN (SELECT idintervento FROM co_righe_documenti WHERE idintervento IS NOT NULL) AND in_interventi.id NOT IN (SELECT idintervento FROM co_preventivi_interventi WHERE idintervento IS NOT NULL) AND in_interventi.id NOT IN (SELECT idintervento FROM co_contratti_promemoria WHERE idintervento IS NOT NULL)';
|
||||
$interventi = $dbo->fetchArray($int_query)[0]['tot'];
|
||||
}
|
||||
|
||||
echo '
|
||||
<a class="btn btn-sm btn-primary tip" '.(!empty($interventi) ? '' : ' disabled').' data-toggle="tooltip" title="'.tr('Interventi non collegati a preventivi o contratti.').'" data-href="'.$rootdir.'/modules/fatture/add_intervento.php?id_module='.$id_module.'&id_record='.$id_record.'" data-title="Aggiungi intervento" data-target="#bs-popup">
|
||||
<i class="fa fa-plus"></i> Intervento
|
||||
</a>';
|
||||
|
||||
// Lettura preventivi accettati, in attesa di conferma o in lavorazione
|
||||
$prev_query = 'SELECT COUNT(*) AS tot FROM co_preventivi WHERE idanagrafica='.prepare($records[0]['idanagrafica'])." AND id NOT IN (SELECT idpreventivo FROM co_righe_documenti WHERE NOT idpreventivo=NULL) AND idstato IN( SELECT id FROM co_statipreventivi WHERE descrizione='Accettato' OR descrizione='In lavorazione' OR descrizione='In attesa di conferma')";
|
||||
$preventivi = $dbo->fetchArray($prev_query)[0]['tot'];
|
||||
echo '
|
||||
// Lettura preventivi accettati, in attesa di conferma o in lavorazione
|
||||
$prev_query = 'SELECT COUNT(*) AS tot FROM co_preventivi WHERE idanagrafica='.prepare($records[0]['idanagrafica'])." AND id NOT IN (SELECT idpreventivo FROM co_righe_documenti WHERE NOT idpreventivo=NULL) AND idstato IN( SELECT id FROM co_statipreventivi WHERE descrizione='Accettato' OR descrizione='In lavorazione' OR descrizione='In attesa di conferma')";
|
||||
$preventivi = $dbo->fetchArray($prev_query)[0]['tot'];
|
||||
echo '
|
||||
<a class="btn btn-sm btn-primary tip" '.(!empty($preventivi) ? '' : ' disabled').' title="'.tr('Preventivi accettati, in attesa di conferma o in lavorazione.').'" data-href="'.$rootdir.'/modules/fatture/add_preventivo.php?id_module='.$id_module.'&id_record='.$id_record.'" data-toggle="tooltip" data-title="Aggiungi preventivo" data-target="#bs-popup">
|
||||
<i class="fa fa-plus"></i> Preventivo
|
||||
</a>';
|
||||
|
||||
// Lettura contratti accettati, in attesa di conferma o in lavorazione
|
||||
$contr_query = 'SELECT COUNT(*) AS tot FROM co_contratti WHERE idanagrafica='.prepare($records[0]['idanagrafica']).' AND id NOT IN (SELECT idcontratto FROM co_righe_documenti WHERE NOT idcontratto=NULL) AND idstato IN( SELECT id FROM co_staticontratti WHERE fatturabile = 1) AND NOT EXISTS (SELECT id FROM co_righe_documenti WHERE co_righe_documenti.idcontratto = co_contratti.id)';
|
||||
$contratti = $dbo->fetchArray($contr_query)[0]['tot'];
|
||||
echo '
|
||||
// Lettura contratti accettati, in attesa di conferma o in lavorazione
|
||||
$contr_query = 'SELECT COUNT(*) AS tot FROM co_contratti WHERE idanagrafica='.prepare($records[0]['idanagrafica']).' AND id NOT IN (SELECT idcontratto FROM co_righe_documenti WHERE NOT idcontratto=NULL) AND idstato IN( SELECT id FROM co_staticontratti WHERE fatturabile = 1) AND NOT EXISTS (SELECT id FROM co_righe_documenti WHERE co_righe_documenti.idcontratto = co_contratti.id)';
|
||||
$contratti = $dbo->fetchArray($contr_query)[0]['tot'];
|
||||
echo '
|
||||
|
||||
<a class="btn btn-sm btn-primary tip" '.(!empty($contratti) ? '' : ' disabled').' title="'.tr('Contratti accettati, in attesa di conferma o in lavorazione.').'" data-href="'.$rootdir.'/modules/fatture/add_contratto.php?id_module='.$id_module.'&id_record='.$id_record.'" data-toggle="tooltip" data-title="Aggiungi contratto" data-target="#bs-popup">
|
||||
<i class="fa fa-plus"></i> Contratto
|
||||
</a>';
|
||||
|
||||
// Lettura ddt
|
||||
$ddt_query = 'SELECT COUNT(*) AS tot FROM dt_ddt WHERE idanagrafica='.prepare($records[0]['idanagrafica']).' AND idstatoddt IN (SELECT id FROM dt_statiddt WHERE descrizione IN(\'Bozza\', \'Evaso\', \'Parzialmente evaso\', \'Parzialmente fatturato\')) AND idtipoddt IN (SELECT id FROM dt_tipiddt WHERE dir='.prepare($dir).') AND dt_ddt.id IN (SELECT idddt FROM dt_righe_ddt WHERE dt_righe_ddt.idddt = dt_ddt.id AND (qta - qta_evasa) > 0)';
|
||||
$ddt = $dbo->fetchArray($ddt_query)[0]['tot'];
|
||||
echo '
|
||||
// Lettura ddt
|
||||
$ddt_query = 'SELECT COUNT(*) AS tot FROM dt_ddt WHERE idanagrafica='.prepare($records[0]['idanagrafica']).' AND idstatoddt IN (SELECT id FROM dt_statiddt WHERE descrizione IN(\'Bozza\', \'Evaso\', \'Parzialmente evaso\', \'Parzialmente fatturato\')) AND idtipoddt IN (SELECT id FROM dt_tipiddt WHERE dir='.prepare($dir).') AND dt_ddt.id IN (SELECT idddt FROM dt_righe_ddt WHERE dt_righe_ddt.idddt = dt_ddt.id AND (qta - qta_evasa) > 0)';
|
||||
$ddt = $dbo->fetchArray($ddt_query)[0]['tot'];
|
||||
echo '
|
||||
<a class="btn btn-sm btn-primary'.(!empty($ddt) ? '' : ' disabled').'" data-href="'.$rootdir.'/modules/fatture/add_ddt.php?id_module='.$id_module.'&id_record='.$id_record.'" data-toggle="tooltip" data-title="Aggiungi ddt" data-target="#bs-popup">
|
||||
<i class="fa fa-plus"></i> Ddt
|
||||
</a>';
|
||||
}
|
||||
}
|
||||
|
||||
// Lettura ordini
|
||||
$ordini_query = 'SELECT COUNT(*) AS tot FROM or_ordini WHERE idanagrafica='.prepare($records[0]['idanagrafica']).' AND idstatoordine IN (SELECT id FROM or_statiordine WHERE descrizione IN(\'Bozza\', \'Evaso\', \'Parzialmente evaso\', \'Parzialmente fatturato\')) AND idtipoordine=(SELECT id FROM or_tipiordine WHERE dir='.prepare($dir).') AND or_ordini.id IN (SELECT idordine FROM or_righe_ordini WHERE or_righe_ordini.idordine = or_ordini.id AND (qta - qta_evasa) > 0)';
|
||||
$ordini = $dbo->fetchArray($ordini_query)[0]['tot'];
|
||||
echo '
|
||||
// Lettura ordini
|
||||
$ordini_query = 'SELECT COUNT(*) AS tot FROM or_ordini WHERE idanagrafica='.prepare($records[0]['idanagrafica']).' AND idstatoordine IN (SELECT id FROM or_statiordine WHERE descrizione IN(\'Bozza\', \'Evaso\', \'Parzialmente evaso\', \'Parzialmente fatturato\')) AND idtipoordine=(SELECT id FROM or_tipiordine WHERE dir='.prepare($dir).') AND or_ordini.id IN (SELECT idordine FROM or_righe_ordini WHERE or_righe_ordini.idordine = or_ordini.id AND (qta - qta_evasa) > 0)';
|
||||
$ordini = $dbo->fetchArray($ordini_query)[0]['tot'];
|
||||
echo '
|
||||
<a class="btn btn-sm btn-primary'.(!empty($ordini) ? '' : ' disabled').'" data-href="'.$rootdir.'/modules/fatture/add_ordine.php?id_module='.$id_module.'&id_record='.$id_record.'" data-toggle="modal" data-title="Aggiungi ordine" data-target="#bs-popup">
|
||||
<i class="fa fa-plus"></i> Ordine
|
||||
</a>';
|
||||
</a>';
|
||||
}
|
||||
|
||||
// Lettura articoli
|
||||
$art_query = 'SELECT COUNT(*) AS tot FROM mg_articoli WHERE attivo = 1';
|
||||
|
|
|
@ -48,7 +48,6 @@ function get_new_numerofattura($data)
|
|||
function get_new_numerosecondariofattura($data)
|
||||
{
|
||||
global $dir;
|
||||
global $idtipodocumento;
|
||||
global $id_segment;
|
||||
|
||||
$dbo = Database::getConnection();
|
||||
|
@ -689,7 +688,7 @@ function add_articolo_infattura($iddocumento, $idarticolo, $descrizione, $idiva,
|
|||
$iva = ($prezzo - $sconto) / 100 * $rs2[0]['percentuale'];
|
||||
$desc_iva = $rs2[0]['descrizione'];
|
||||
|
||||
if ($qta > 0) {
|
||||
if ($qta != 0) {
|
||||
$rsart = $dbo->fetchArray('SELECT abilita_serial FROM mg_articoli WHERE id='.prepare($idarticolo));
|
||||
|
||||
$dbo->query('INSERT INTO co_righe_documenti(iddocumento, idarticolo, idintervento, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, qta, abilita_serial, idconto, um, `order`) VALUES ('.prepare($iddocumento).', '.prepare($idarticolo).', '.(!empty($idintervento) ? prepare($idintervento) : 'NULL').', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($prezzo).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).', '.prepare($qta).', '.prepare($rsart[0]['abilita_serial']).', '.prepare($idconto).', '.prepare($um).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($iddocumento).'))');
|
||||
|
|
|
@ -7,7 +7,6 @@ include_once Modules::filepath('Fatture di vendita', 'modutil.php');
|
|||
/*
|
||||
Righe fattura
|
||||
*/
|
||||
//$rs = $dbo->fetchArray('SELECT *, round(iva,'.Settings::get('Cifre decimali per importi').') AS iva, round(sconto_unitario,'.Settings::get('Cifre decimali per importi').') AS sconto_unitario, round(sconto,'.Settings::get('Cifre decimali per importi').') AS sconto, round(subtotale,'.Settings::get('Cifre decimali per importi').') AS subtotale, IFNULL((SELECT codice FROM mg_articoli WHERE id=idarticolo),"") AS codice, (SELECT descrizione FROM co_pianodeiconti3 WHERE co_pianodeiconti3.id=IF(co_righe_documenti.idconto = 0, (SELECT idconto FROM co_documenti WHERE iddocumento='.prepare($id_record).' LIMIT 1), co_righe_documenti.idconto)) AS descrizione_conto FROM `co_righe_documenti` WHERE iddocumento='.prepare($id_record).' ORDER BY `order`');
|
||||
$rs = $dbo->fetchArray('SELECT *, round(sconto_unitario,'.Settings::get('Cifre decimali per importi').') AS sconto_unitario, round(sconto,'.Settings::get('Cifre decimali per importi').') AS sconto, round(subtotale,'.Settings::get('Cifre decimali per importi').') AS subtotale, IFNULL((SELECT codice FROM mg_articoli WHERE id=idarticolo),"") AS codice, (SELECT descrizione FROM co_pianodeiconti3 WHERE co_pianodeiconti3.id=IF(co_righe_documenti.idconto = 0, (SELECT idconto FROM co_documenti WHERE iddocumento='.prepare($id_record).' LIMIT 1), co_righe_documenti.idconto)) AS descrizione_conto FROM `co_righe_documenti` WHERE iddocumento='.prepare($id_record).' ORDER BY `order`');
|
||||
|
||||
echo '
|
||||
|
@ -27,6 +26,13 @@ echo '
|
|||
|
||||
if (!empty($rs)) {
|
||||
foreach ($rs as $r) {
|
||||
// Valori assoluti
|
||||
$r['qta'] = abs($r['qta']);
|
||||
$r['subtotale'] = abs($r['subtotale']);
|
||||
$r['sconto_unitario'] = abs($r['sconto_unitario']);
|
||||
$r['sconto'] = abs($r['sconto']);
|
||||
$r['iva'] = abs($r['iva']);
|
||||
|
||||
$extra = '';
|
||||
|
||||
$ref_modulo = null;
|
||||
|
@ -240,6 +246,14 @@ $netto_a_pagare = sum([
|
|||
-$records[0]['ritenutaacconto'],
|
||||
]);
|
||||
|
||||
$imponibile = abs($imponibile);
|
||||
$sconto = abs($sconto);
|
||||
$iva = abs($iva);
|
||||
$imponibile_scontato = abs($imponibile_scontato);
|
||||
$totale_iva = abs($totale_iva);
|
||||
$totale = abs($totale);
|
||||
$netto_a_pagare = abs($netto_a_pagare);
|
||||
|
||||
// IMPONIBILE
|
||||
echo '
|
||||
<tr>
|
||||
|
|
|
@ -57,6 +57,13 @@ foreach ($righe as $r) {
|
|||
$count += ceil(strlen($r['descrizione']) / $autofill['words']);
|
||||
$count += substr_count($r['descrizione'], PHP_EOL);
|
||||
|
||||
// Valori assoluti
|
||||
$r['qta'] = abs($r['qta']);
|
||||
$r['subtotale'] = abs($r['subtotale']);
|
||||
$r['sconto_unitario'] = abs($r['sconto_unitario']);
|
||||
$r['sconto'] = abs($r['sconto']);
|
||||
$r['iva'] = abs($r['iva']);
|
||||
|
||||
echo '
|
||||
<tr>
|
||||
<td>
|
||||
|
|
|
@ -367,5 +367,10 @@ INSERT INTO `zz_settings` (`idimpostazione`, `nome`, `valore`, `tipo`, `editable
|
|||
-- Rimozione idtipoanagrafica da zz_users
|
||||
ALTER TABLE `zz_users` DROP `idtipoanagrafica`;
|
||||
|
||||
-- Introduzione controllo duplicazione della numerazione Fatture di vendita
|
||||
INSERT INTO `zz_views` (`id_module`, `name`, `query`, `order`, `search`, `slow`, `enabled`, `default`) VALUES
|
||||
((SELECT `id` FROM `zz_modules` WHERE `name` = 'Fatture di vendita'), '_bg_', 'IF((SELECT COUNT(t.numero_esterno) FROM co_documenti AS t WHERE t.numero_esterno = co_documenti.numero_esterno AND t.id_segment = co_documenti.id_segment AND idtipodocumento IN (SELECT id FROM co_tipidocumento WHERE dir = ''entrata'') AND t.data >= ''|period_start|'' AND t.data <= ''|period_end|'') > 1, ''red'', '''')', 0, 0, 0, 0, 1);
|
||||
|
||||
-- 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`;
|
||||
|
|
Loading…
Reference in New Issue