mirror of
https://github.com/devcode-it/openstamanager.git
synced 2024-12-12 16:38:19 +01:00
585290e011
Risoluzione delle problematiche relative alla selezioni di diversi sconti su multipli livelli. Aggiunta selezione automatica dello sconto da listino. Introduzione del nuovo sistema degli sconti nei contratti.
376 lines
10 KiB
PHP
376 lines
10 KiB
PHP
<?php
|
|
|
|
include_once __DIR__.'/../../core.php';
|
|
|
|
echo '
|
|
<table class="table table-striped table-hover table-condensed table-bordered">
|
|
<tr>
|
|
<th>'.tr('Descrizione').'</th>
|
|
<th width="120">'.tr('Q.tà').'</th>
|
|
<th width="80">'.tr('U.m.').'</th>
|
|
<th width="120">'.tr('Costo unitario').'</th>
|
|
<th width="120">'.tr('Iva').'</th>
|
|
<th width="120">'.tr('Imponibile').'</th>
|
|
<th width="60"></th>
|
|
</tr>
|
|
|
|
<tbody class="sortable">';
|
|
|
|
/*
|
|
Articoli e righe generiche
|
|
*/
|
|
$q_art = 'SELECT *, (SELECT codice FROM mg_articoli WHERE id=idarticolo) AS codice FROM `dt_righe_ddt` WHERE idddt='.prepare($id_record).' ORDER BY `order`';
|
|
$rs = $dbo->fetchArray($q_art);
|
|
|
|
if (!empty($rs)) {
|
|
foreach ($rs as $r) {
|
|
// Individuazione dei seriali
|
|
if (!empty($r['idarticolo']) && !empty($r['abilita_serial'])) {
|
|
$serials = array_column($dbo->fetchArray('SELECT serial FROM mg_prodotti WHERE serial IS NOT NULL AND id_riga_ddt='.prepare($r['id'])), 'serial');
|
|
$mancanti = $r['qta'] - count($serials);
|
|
|
|
if ($mancanti > 0) {
|
|
$extra = 'class="warning"';
|
|
} else {
|
|
$mancanti = 0;
|
|
}
|
|
}
|
|
|
|
echo '
|
|
<tr data-id="'.$r['id'].'" '.$extra.'>
|
|
<td align="left">';
|
|
|
|
if (!empty($r['idarticolo'])) {
|
|
echo '
|
|
'.Modules::link('Articoli', $r['idarticolo'], $r['codice'].' - '.$r['descrizione']);
|
|
|
|
if (!empty($r['abilita_serial'])) {
|
|
if (!empty($mancanti)) {
|
|
echo '
|
|
<br><b><small class="text-danger">'.tr('_NUM_ serial mancanti', [
|
|
'_NUM_' => $mancanti,
|
|
]).'</small></b>';
|
|
}
|
|
|
|
if (!empty($serials)) {
|
|
echo '
|
|
<br>'.tr('SN').': '.implode(', ', $serials);
|
|
}
|
|
}
|
|
} else {
|
|
echo nl2br($r['descrizione']);
|
|
}
|
|
|
|
// Aggiunta riferimento a ordine
|
|
if (!empty($r['idordine'])) {
|
|
$rso = $dbo->fetchArray('SELECT numero, numero_esterno, data, dir FROM or_ordini JOIN or_tipiordine ON or_tipiordine.id = or_ordini.idtipoordine WHERE or_ordini.id='.prepare($r['idordine']));
|
|
$numero = ($rso[0]['numero_esterno'] != '') ? $rso[0]['numero_esterno'] : $rso[0]['numero'];
|
|
|
|
$ref = $rso[0]['dir'] == 'entrata' ? 'Ordini cliente' : 'Ordini fornitore';
|
|
$ref_id = $r['idordine'];
|
|
|
|
$descrizione = tr('Rif. ordine _NUM_ del _DATE_', [
|
|
'_NUM_' => $numero,
|
|
'_DATE_' => Translator::dateToLocale($rso[0]['data']),
|
|
]);
|
|
}
|
|
|
|
if (!empty($descrizione)) {
|
|
echo '
|
|
<br>'.Modules::link($ref, $ref_id, $descrizione.' <i class="fa fa-external-link"></i>', $descrizione);
|
|
}
|
|
|
|
echo '
|
|
</td>';
|
|
|
|
echo '
|
|
<td class="text-center">';
|
|
if (empty($r['sconto_globale'])) {
|
|
echo '
|
|
<big>'.Translator::numberToLocale($r['qta'] - $r['qta_evasa']).'</big>
|
|
<br><small>('.tr('Q.tà iniziale').': '.Translator::numberToLocale($r['qta']).')</small>';
|
|
} else {
|
|
echo '1';
|
|
}
|
|
echo '
|
|
</td>';
|
|
|
|
// Unità di misura
|
|
echo '
|
|
<td class="text-center">
|
|
'.$r['um'].'
|
|
</td>';
|
|
|
|
// Costo unitario
|
|
echo '
|
|
<td class="text-right">
|
|
'.Translator::numberToLocale($r['subtotale'] / $r['qta']).' €';
|
|
|
|
if ($r['sconto_unitario'] > 0) {
|
|
echo '
|
|
<br><small class="label label-danger">- sconto '.Translator::numberToLocale($r['sconto_unitario']).($r['tipo_sconto'] == 'PRC' ? '%' : ' €').'</small>';
|
|
}
|
|
|
|
echo '
|
|
</td>';
|
|
|
|
// Iva
|
|
echo '
|
|
<td class="text-right">
|
|
'.Translator::numberToLocale($r['iva']).' €
|
|
<br><small class="help-block">'.$r['desc_iva'].'</small>
|
|
</td>';
|
|
|
|
// Imponibile
|
|
echo '
|
|
<td class="text-right">
|
|
'.Translator::numberToLocale($r['subtotale'] - $r['sconto']).' €
|
|
</td>';
|
|
|
|
// Possibilità di rimuovere una riga solo se il ddt non è evaso
|
|
echo '
|
|
<td class="text-center">';
|
|
if ($records[0]['stato'] != 'Evaso' && empty($r['sconto_globale'])) {
|
|
echo "
|
|
<form action='".$rootdir.'/editor.php?id_module='.Modules::getModule($name)['id'].'&id_record='.$id_record."' method='post' id='delete-form-".$r['id']."' role='form'>
|
|
<input type='hidden' name='backto' value='record-edit'>
|
|
<input type='hidden' name='id_record' value='".$id_record."'>
|
|
<input type='hidden' name='idriga' value='".$r['id']."'>
|
|
<input type='hidden' name='dir' value='".$dir."'>";
|
|
|
|
if (!empty($r['idarticolo'])) {
|
|
echo "
|
|
<input type='hidden' name='idarticolo' value='".$r['idarticolo']."'>
|
|
<input type='hidden' name='op' value='unlink_articolo'>";
|
|
} else {
|
|
echo "
|
|
|
|
<input type='hidden' name='op' value='unlink_riga'>";
|
|
}
|
|
|
|
echo "
|
|
|
|
<div class='input-group-btn'>";
|
|
|
|
if (!empty($r['idarticolo']) && $r['abilita_serial']) {
|
|
echo "
|
|
<a class='btn btn-primary btn-xs'data-toggle='tooltip' title='Aggiorna SN...' onclick=\"launch_modal( 'Aggiorna SN', '".$rootdir.'/modules/fatture/add_serial.php?id_module='.$id_module.'&id_record='.$id_record.'&idriga='.$r['id'].'&idarticolo='.$r['idarticolo']."', 1 );\"><i class='fa fa-barcode' aria-hidden='true'></i></a>";
|
|
}
|
|
|
|
echo "
|
|
<a class='btn btn-xs btn-warning' title='Modifica questa riga...' onclick=\"launch_modal( 'Modifica riga', '".$rootdir.'/modules/ddt/add_riga.php?id_module='.$id_module.'&id_record='.$id_record.'&idriga='.$r['id'].'&dir='.$dir."', 1 );\">
|
|
<i class='fa fa-edit'></i>
|
|
</a>
|
|
|
|
<a class='btn btn-xs btn-danger' title='Rimuovi questa riga...' onclick=\"if( confirm('Rimuovere questa riga dal ddt?') ){ $('#delete-form-".$r['id']."').submit(); }\">
|
|
<i class='fa fa-trash'></i>
|
|
</a>
|
|
</div>
|
|
</form>";
|
|
}
|
|
|
|
if (empty($r['sconto_globale'])) {
|
|
echo '
|
|
<div class="handle clickable" style="padding:10px">
|
|
<i class="fa fa-sort"></i>
|
|
</div>';
|
|
}
|
|
|
|
echo '
|
|
</td>
|
|
</tr>';
|
|
}
|
|
}
|
|
|
|
echo '
|
|
</tbody>';
|
|
|
|
// Calcoli
|
|
$imponibile = sum(array_column($rs, 'subtotale'));
|
|
$sconto = sum(array_column($rs, 'sconto'));
|
|
$iva = sum(array_column($rs, 'iva'));
|
|
|
|
$imponibile_scontato = sum($imponibile, -$sconto);
|
|
|
|
$totale_iva = sum($iva, $records[0]['iva_rivalsainps']);
|
|
|
|
$totale = sum([
|
|
$imponibile_scontato,
|
|
$records[0]['rivalsainps'],
|
|
$totale_iva,
|
|
]);
|
|
|
|
$netto_a_pagare = sum([
|
|
$totale,
|
|
$marca_da_bollo,
|
|
-$records[0]['ritenutaacconto'],
|
|
]);
|
|
|
|
// IMPONIBILE
|
|
echo '
|
|
<tr>
|
|
<td colspan="5" class="text-right">
|
|
<b>'.tr('Imponibile', [], ['upper' => true]).':</b>
|
|
</td>
|
|
|
|
<td align="right">
|
|
'.Translator::numberToLocale($imponibile).' €
|
|
</td>
|
|
|
|
<td></td>
|
|
</tr>';
|
|
|
|
if (abs($sconto) > 0) {
|
|
// SCONTO
|
|
echo '
|
|
<tr>
|
|
<td colspan="5" class="text-right">
|
|
<b>'.tr('Sconto', [], ['upper' => true]).':</b>
|
|
</td>
|
|
|
|
<td align="right">
|
|
'.Translator::numberToLocale($sconto).' €
|
|
</td>
|
|
|
|
<td></td>
|
|
</tr>';
|
|
|
|
// IMPONIBILE SCONTATO
|
|
echo '
|
|
<tr>
|
|
<td colspan="5" class="text-right">
|
|
<b>'.tr('Imponibile scontato', [], ['upper' => true]).':</b>
|
|
</td>
|
|
|
|
<td align="right">
|
|
'.Translator::numberToLocale($imponibile_scontato).' €
|
|
</td>
|
|
|
|
<td></td>
|
|
</tr>';
|
|
}
|
|
|
|
// RIVALSA INPS
|
|
if (abs($records[0]['rivalsainps']) > 0) {
|
|
echo '
|
|
<tr>
|
|
<td colspan="5" class="text-right">
|
|
<b>'.tr('Rivalsa INPS', [], ['upper' => true]).':</b>
|
|
</td>
|
|
|
|
<td align="right">
|
|
'.Translator::numberToLocale($records[0]['rivalsainps']).' €
|
|
</td>
|
|
|
|
<td></td>
|
|
</tr>';
|
|
}
|
|
|
|
if (abs($totale_iva) > 0) {
|
|
echo '
|
|
<tr>
|
|
<td colspan="5" class="text-right">
|
|
<b>'.tr('IVA', [], ['upper' => true]).':</b>
|
|
</td>
|
|
|
|
<td align="right">
|
|
'.Translator::numberToLocale($totale_iva).' €
|
|
</td>
|
|
|
|
<td></td>
|
|
</tr>';
|
|
}
|
|
|
|
// TOTALE
|
|
echo '
|
|
<tr>
|
|
<td colspan="5" class="text-right">
|
|
<b>'.tr('Totale', [], ['upper' => true]).':</b>
|
|
</td>
|
|
|
|
<td align="right">
|
|
'.Translator::numberToLocale($totale).' €
|
|
</td>
|
|
|
|
<td></td>
|
|
</tr>';
|
|
|
|
// Mostra marca da bollo se c'è
|
|
if (abs($records[0]['bollo']) > 0) {
|
|
echo '
|
|
<tr>
|
|
<td colspan="5" class="text-right">
|
|
<b>'.tr('Marca da bollo', [], ['upper' => true]).':</b>
|
|
</td>
|
|
|
|
<td align="right">
|
|
'.Translator::numberToLocale($records[0]['bollo']).' €
|
|
</td>
|
|
|
|
<td></td>
|
|
</tr>';
|
|
}
|
|
|
|
// RITENUTA D'ACCONTO
|
|
if (abs($records[0]['ritenutaacconto']) > 0) {
|
|
echo '
|
|
<tr>
|
|
<td colspan="5" class="text-right">
|
|
<b>'.tr("Ritenuta d'acconto", [], ['upper' => true]).':</b>
|
|
</td>
|
|
|
|
<td align="right">
|
|
'.Translator::numberToLocale($records[0]['ritenutaacconto']).' €
|
|
</td>
|
|
|
|
<td></td>
|
|
</tr>';
|
|
}
|
|
|
|
// NETTO A PAGARE
|
|
if ($totale != $netto_a_pagare) {
|
|
echo '
|
|
<tr>
|
|
<td colspan="5" class="text-right">
|
|
<b>'.tr('Netto a pagare', [], ['upper' => true]).':</b>
|
|
</td>
|
|
|
|
<td align="right">
|
|
'.Translator::numberToLocale($netto_a_pagare).' €
|
|
</td>
|
|
|
|
<td></td>
|
|
</tr>';
|
|
}
|
|
|
|
echo '
|
|
</table>';
|
|
|
|
echo '
|
|
<script>
|
|
$(document).ready(function(){
|
|
$(".sortable").each(function() {
|
|
$(this).sortable({
|
|
axis: "y",
|
|
handle: ".handle",
|
|
cursor: "move",
|
|
dropOnEmpty: true,
|
|
scroll: true,
|
|
start: function(event, ui) {
|
|
ui.item.data("start", ui.item.index());
|
|
},
|
|
update: function(event, ui) {
|
|
$.post("'.$rootdir.'/actions.php", {
|
|
id: ui.item.data("id"),
|
|
id_module: '.$id_module.',
|
|
id_record: '.$id_record.',
|
|
op: "update_position",
|
|
start: ui.item.data("start"),
|
|
end: ui.item.index()
|
|
});
|
|
}
|
|
});
|
|
});
|
|
});
|
|
</script>';
|