mirror of
https://github.com/devcode-it/openstamanager.git
synced 2025-02-16 19:40:44 +01:00
Ottimizzazione caricamento righe Fatture, Ordini e DDT
Aggiunto controllo totale FE sui Riepiloghi IVA.
This commit is contained in:
parent
de0e2a0e82
commit
830b2a1ec8
@ -230,6 +230,11 @@ abstract class Article extends Row
|
||||
|
||||
protected static function boot()
|
||||
{
|
||||
// Precaricamento Articolo
|
||||
static::addGlobalScope('articolo', function (Builder $builder) {
|
||||
$builder->with('articolo');
|
||||
});
|
||||
|
||||
parent::boot(true);
|
||||
|
||||
$table = parent::getTableName();
|
||||
|
@ -16,6 +16,10 @@ abstract class Description extends Model
|
||||
'max_qta',
|
||||
];
|
||||
|
||||
protected $hidden = [
|
||||
'parent',
|
||||
];
|
||||
|
||||
public static function build(Document $document, $bypass = false)
|
||||
{
|
||||
$model = parent::build();
|
||||
@ -281,6 +285,11 @@ abstract class Description extends Model
|
||||
|
||||
protected static function boot($bypass = false)
|
||||
{
|
||||
// Precaricamento Documento
|
||||
static::addGlobalScope('parent', function (Builder $builder) {
|
||||
$builder->with('parent');
|
||||
});
|
||||
|
||||
parent::boot();
|
||||
|
||||
$table = parent::getTableName();
|
||||
|
@ -318,6 +318,11 @@ abstract class Row extends Description
|
||||
|
||||
protected static function boot($bypass = false)
|
||||
{
|
||||
// Precaricamento Aliquota IVA
|
||||
static::addGlobalScope('aliquota', function (Builder $builder) {
|
||||
$builder->with('aliquota');
|
||||
});
|
||||
|
||||
parent::boot(true);
|
||||
|
||||
$table = parent::getTableName();
|
||||
|
@ -20,15 +20,13 @@ echo '
|
||||
// Righe documento
|
||||
$righe = $ddt->getRighe();
|
||||
foreach ($righe as $riga) {
|
||||
$r = $riga->toArray();
|
||||
|
||||
$extra = '';
|
||||
$mancanti = 0;
|
||||
|
||||
// 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 ($riga->isArticolo() && !empty($riga->abilita_serial)) {
|
||||
$serials = $riga->serials;
|
||||
$mancanti = abs($riga->qta) - count($serials);
|
||||
|
||||
if ($mancanti > 0) {
|
||||
$extra = 'class="warning"';
|
||||
@ -38,28 +36,26 @@ foreach ($righe as $riga) {
|
||||
}
|
||||
|
||||
echo '
|
||||
<tr data-id="'.$r['id'].'" '.$extra.'>
|
||||
<td align="left">';
|
||||
|
||||
if (!empty($r['idarticolo'])) {
|
||||
<tr data-id="'.$riga->id.'" '.$extra.'>
|
||||
<td>';
|
||||
if ($riga->isArticolo()) {
|
||||
echo '
|
||||
'.Modules::link('Articoli', $r['idarticolo'], $riga->articolo->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);
|
||||
}
|
||||
}
|
||||
'.Modules::link('Articoli', $riga->idarticolo, $riga->articolo->codice.' - '.$riga->descrizione);
|
||||
} else {
|
||||
echo nl2br($r['descrizione']);
|
||||
echo nl2br($riga->descrizione);
|
||||
}
|
||||
|
||||
if ($riga->isArticolo() && !empty($riga->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);
|
||||
}
|
||||
}
|
||||
|
||||
// Aggiunta dei riferimenti ai documenti
|
||||
@ -81,7 +77,7 @@ foreach ($righe as $riga) {
|
||||
// Quantità e unità di misura
|
||||
echo '
|
||||
<td class="text-center">
|
||||
'.numberFormat($riga->qta_rimanente, 'qta').' / '.numberFormat($riga->qta, 'qta').' '.$r['um'].'
|
||||
'.numberFormat($riga->qta_rimanente, 'qta').' / '.numberFormat($riga->qta, 'qta').' '.$riga->um.'
|
||||
</td>';
|
||||
|
||||
// Prezzi unitari
|
||||
@ -126,26 +122,26 @@ foreach ($righe as $riga) {
|
||||
|
||||
if ($record['flag_completato'] == 0) {
|
||||
echo "
|
||||
<form action='".$rootdir.'/editor.php?id_module='.$id_module.'&id_record='.$id_record."' method='post' id='delete-form-".$r['id']."' role='form'>
|
||||
<form action='".$rootdir.'/editor.php?id_module='.$id_module.'&id_record='.$id_record."' method='post' id='delete-form-".$riga->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='idriga' value='".$riga->id."'>
|
||||
<input type='hidden' name='type' value='".get_class($riga)."'>
|
||||
<input type='hidden' name='op' value='delete_riga'>
|
||||
|
||||
<div class='input-group-btn'>";
|
||||
|
||||
if (!empty($r['idarticolo']) && $r['abilita_serial']) {
|
||||
if ($riga->isArticolo() && !empty($riga->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']."');\"><i class='fa fa-barcode' aria-hidden='true'></i></a>";
|
||||
<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='.$riga->id.'&idarticolo='.$riga->idarticolo."');\"><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/row-edit.php?id_module='.$id_module.'&id_record='.$id_record.'&idriga='.$r['id'].'&type='.urlencode(get_class($riga))."');\">
|
||||
<a class='btn btn-xs btn-warning' title='Modifica questa riga...' onclick=\"launch_modal('Modifica riga', '".$rootdir.'/modules/ddt/row-edit.php?id_module='.$id_module.'&id_record='.$id_record.'&idriga='.$riga->id.'&type='.urlencode(get_class($riga))."');\">
|
||||
<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(); }\">
|
||||
<a class='btn btn-xs btn-danger' title='Rimuovi questa riga...' onclick=\"if( confirm('Rimuovere questa riga dal ddt?') ){ $('#delete-form-".$riga->id."').submit(); }\">
|
||||
<i class='fa fa-trash'></i>
|
||||
</a>
|
||||
</div>
|
||||
|
@ -17,6 +17,10 @@ class DDT extends Document
|
||||
|
||||
protected $table = 'dt_ddt';
|
||||
|
||||
protected $with = [
|
||||
'tipo',
|
||||
];
|
||||
|
||||
/**
|
||||
* Crea un nuovo ddt.
|
||||
*
|
||||
|
@ -186,8 +186,27 @@ switch (post('op')) {
|
||||
try {
|
||||
$xml = \Util\XML::read($fattura->getXML());
|
||||
|
||||
// Totale basato sul campo ImportoTotaleDocumento
|
||||
$dati_generali = $xml['FatturaElettronicaBody']['DatiGenerali']['DatiGeneraliDocumento'];
|
||||
$totale_documento = $fattura->isNota() ? -abs(floatval($dati_generali['ImportoTotaleDocumento'])) : abs(floatval($dati_generali['ImportoTotaleDocumento']));
|
||||
$totale_documento = abs(floatval($dati_generali['ImportoTotaleDocumento']));
|
||||
|
||||
// Calcolo del totale basato sui DatiRiepilogo
|
||||
if (empty($totale_documento)) {
|
||||
$totale_documento = 0;
|
||||
|
||||
$riepiloghi = $xml['FatturaElettronicaBody']['DatiBeniServizi']['DatiRiepilogo'];
|
||||
if (!empty($riepiloghi) && !isset($riepiloghi[0])) {
|
||||
$riepiloghi = [$riepiloghi];
|
||||
}
|
||||
|
||||
foreach ($riepiloghi as $riepilogo) {
|
||||
$totale_documento = sum([$totale_documento, $riepilogo['ImponibileImporto'], $riepilogo['Imposta']]);
|
||||
}
|
||||
|
||||
$totale_documento = abs($totale_documento);
|
||||
}
|
||||
|
||||
$totale_documento = $fattura->isNota() ? -$totale_documento : $totale_documento;
|
||||
} catch (Exception $e) {
|
||||
$totale_documento = null;
|
||||
}
|
||||
|
@ -672,6 +672,7 @@ include $structure->filepath('row-list.php');
|
||||
</div>
|
||||
|
||||
<?php
|
||||
|
||||
if ($dir == 'uscita' && $fattura->isFE()) {
|
||||
echo '
|
||||
<div class="alert alert-info text-center" id="controlla_totali"><i class="fa fa-spinner fa-spin"></i> '.tr('Controllo sui totali del documento e della fattura elettronica in corso').'...</div>
|
||||
|
@ -3,6 +3,7 @@
|
||||
include_once __DIR__.'/../../core.php';
|
||||
|
||||
echo '
|
||||
<div class="table-responsive">
|
||||
<table class="table table-striped table-hover table-condensed table-bordered">
|
||||
<thead>
|
||||
<tr>
|
||||
@ -19,75 +20,19 @@ echo '
|
||||
// Righe documento
|
||||
$righe = $fattura->getRighe();
|
||||
foreach ($righe as $riga) {
|
||||
$r = $riga->toArray();
|
||||
|
||||
// Valori assoluti
|
||||
$r['qta'] = abs($r['qta']);
|
||||
$r['costo_unitario'] = abs($r['costo_unitario']);
|
||||
$r['totale_imponibile'] = ($fattura->isNota() ? -$riga->totale_imponibile : $riga->totale_imponibile);
|
||||
$r['sconto_unitario'] = abs($r['sconto_unitario']);
|
||||
$r['sconto'] = abs($r['sconto']);
|
||||
$r['iva'] = abs($r['iva']);
|
||||
|
||||
if (empty($r['is_descrizione'])) {
|
||||
$r['descrizione_conto'] = $dbo->fetchOne('SELECT descrizione FROM co_pianodeiconti3 WHERE id = '.prepare($r['idconto']))['descrizione'];
|
||||
}
|
||||
|
||||
$r['ritenuta_acconto'] = !empty($r['idritenutaacconto']) ? moneyFormat(abs($r['ritenutaacconto']), 2) : null;
|
||||
$r['ritenuta_contributi'] = !empty($r['ritenuta_contributi']) ? moneyFormat(abs($r['ritenuta_contributi']), 2) : null;
|
||||
$r['rivalsa'] = !empty($r['idrivalsainps']) ? moneyFormat(abs($r['rivalsainps']), 2) : null;
|
||||
|
||||
$extra = '';
|
||||
|
||||
$mancanti = 0;
|
||||
$delete = 'delete_riga';
|
||||
|
||||
// Articoli
|
||||
if ($riga->isArticolo()) {
|
||||
$r['descrizione'] = (!empty($riga->articolo) ? $riga->articolo->codice.' - ' : '').$r['descrizione'];
|
||||
|
||||
$extra = '';
|
||||
$mancanti = 0;
|
||||
}
|
||||
|
||||
// Intervento
|
||||
if (!empty($r['idintervento'])) {
|
||||
$intervento = $dbo->fetchOne('SELECT num_item,codice_cig,codice_cup,id_documento_fe FROM in_interventi WHERE id = '.prepare($r['idintervento']));
|
||||
$r['num_item'] = $intervento['num_item'];
|
||||
$r['codice_cig'] = $intervento['codice_cig'];
|
||||
$r['codice_cup'] = $intervento['codice_cup'];
|
||||
$r['id_documento_fe'] = $intervento['id_documento_fe'];
|
||||
|
||||
// Operazione di rimozione specializzata per gli Interventi
|
||||
if (!empty($documento_originale) && $documento_originale instanceof \Modules\Interventi\Intervento) {
|
||||
$delete = 'unlink_intervento';
|
||||
}
|
||||
// Preventivi
|
||||
elseif (!empty($r['idpreventivo'])) {
|
||||
$preventivo = $dbo->fetchOne('SELECT num_item,codice_cig,codice_cup,id_documento_fe FROM co_preventivi WHERE id = '.prepare($r['idpreventivo']));
|
||||
$r['num_item'] = $preventivo['num_item'];
|
||||
$r['codice_cig'] = $preventivo['codice_cig'];
|
||||
$r['codice_cup'] = $preventivo['codice_cup'];
|
||||
$r['id_documento_fe'] = $preventivo['id_documento_fe'];
|
||||
}
|
||||
// Contratti
|
||||
elseif (!empty($r['idcontratto'])) {
|
||||
$contratto = $dbo->fetchOne('SELECT num_item,codice_cig,codice_cup,id_documento_fe FROM co_contratti WHERE id = '.prepare($r['idcontratto']));
|
||||
$r['num_item'] = $contratto['num_item'];
|
||||
$r['codice_cig'] = $contratto['codice_cig'];
|
||||
$r['codice_cup'] = $contratto['codice_cup'];
|
||||
$r['id_documento_fe'] = $contratto['id_documento_fe'];
|
||||
}
|
||||
// Ordini (IDDOCUMENTO,CIG,CUP)
|
||||
elseif (!empty($r['idordine'])) {
|
||||
$ordine = $dbo->fetchOne('SELECT num_item,codice_cig,codice_cup,id_documento_fe FROM or_ordini WHERE id = '.prepare($r['idordine']));
|
||||
$r['num_item'] = $ordine['num_item'];
|
||||
$r['codice_cig'] = $ordine['codice_cig'];
|
||||
$r['codice_cup'] = $ordine['codice_cup'];
|
||||
$r['id_documento_fe'] = $ordine['id_documento_fe'];
|
||||
}
|
||||
|
||||
// Individuazione dei seriali
|
||||
if (!empty($r['abilita_serial'])) {
|
||||
if ($riga->isArticolo() && !empty($riga->abilita_serial)) {
|
||||
$serials = $riga->serials;
|
||||
$mancanti = $r['qta'] - count($serials);
|
||||
$mancanti = abs($riga->qta) - count($serials);
|
||||
|
||||
if ($mancanti > 0) {
|
||||
$extra = 'class="warning"';
|
||||
@ -97,26 +42,47 @@ foreach ($righe as $riga) {
|
||||
}
|
||||
|
||||
$extra_riga = '';
|
||||
if (!$r['is_descrizione']) {
|
||||
if (!$riga->isDescrizione()) {
|
||||
// Informazioni su CIG, CUP, ...
|
||||
if ($riga->hasOriginal()) {
|
||||
$documento_originale = $riga->getOriginal()->parent;
|
||||
|
||||
$num_item = $documento_originale['num_item'];
|
||||
$codice_cig = $documento_originale['codice_cig'];
|
||||
$codice_cup = $documento_originale['codice_cup'];
|
||||
$id_documento_fe = $documento_originale['id_documento_fe'];
|
||||
}
|
||||
|
||||
$descrizione_conto = $dbo->fetchOne('SELECT descrizione FROM co_pianodeiconti3 WHERE id = '.prepare($riga->id_conto))['descrizione'];
|
||||
//dump($documento_originale);exit();
|
||||
|
||||
$extra_riga = tr('_DESCRIZIONE_CONTO__ID_DOCUMENTO__NUMERO_RIGA__CODICE_CIG__CODICE_CUP__RITENUTA_ACCONTO__RITENUTA_CONTRIBUTI__RIVALSA_', [
|
||||
'_RIVALSA_' => $r['rivalsa'] ? '<br>Rivalsa: '.$r['rivalsa'] : null,
|
||||
'_RITENUTA_ACCONTO_' => $r['ritenuta_acconto'] ? '<br>Ritenuta acconto: '.$r['ritenuta_acconto'] : null,
|
||||
'_RITENUTA_CONTRIBUTI_' => $r['ritenuta_contributi'] ? '<br>Ritenuta contributi: '.$r['ritenuta_contributi'] : null,
|
||||
'_DESCRIZIONE_CONTO_' => $r['descrizione_conto'] ?: null,
|
||||
'_ID_DOCUMENTO_' => $r['id_documento_fe'] ? ' - DOC: '.$r['id_documento_fe'] : null,
|
||||
'_NUMERO_RIGA_' => $r['num_item'] ? ', NRI: '.$r['num_item'] : null,
|
||||
'_CODICE_CIG_' => $r['codice_cig'] ? ', CIG: '.$r['codice_cig'] : null,
|
||||
'_CODICE_CUP_' => $r['codice_cup'] ? ', CUP: '.$r['codice_cup'] : null,
|
||||
'_RIVALSA_' => $riga->rivalsa_inps ? '<br>Rivalsa: '.moneyFormat(abs($riga->rivalsa_inps)) : null,
|
||||
'_RITENUTA_ACCONTO_' => $riga->ritenuta_acconto ? '<br>Ritenuta acconto: '.moneyFormat(abs($riga->ritenuta_acconto)) : null,
|
||||
'_RITENUTA_CONTRIBUTI_' => $riga->ritenuta_contributi ? '<br>Ritenuta contributi: '.moneyFormat(abs($riga->ritenuta_contributi)) : null,
|
||||
'_DESCRIZIONE_CONTO_' => $descrizione_conto ?: null,
|
||||
'_ID_DOCUMENTO_' => $id_documento_fe ? ' - DOC: '.$id_documento_fe : null,
|
||||
'_NUMERO_RIGA_' => $num_item ? ', NRI: '.$num_item : null,
|
||||
'_CODICE_CIG_' => $codice_cig ? ', CIG: '.$codice_cig : null,
|
||||
'_CODICE_CUP_' => $codice_cup ? ', CUP: '.$codice_cup : null,
|
||||
]);
|
||||
}
|
||||
|
||||
echo '
|
||||
<tr data-id="'.$r['id'].'" '.$extra.'>
|
||||
<td>
|
||||
'.Modules::link($riga->isArticolo() ? Modules::get('Articoli')['id'] : null, $riga->isArticolo() ? $r['idarticolo'] : null, $r['descrizione']).'
|
||||
<tr data-id="'.$riga->id.'" '.$extra.'>
|
||||
<td>';
|
||||
|
||||
if ($riga->isArticolo()) {
|
||||
echo '
|
||||
'.Modules::link('Articoli', $riga->idarticolo, $riga->articolo->codice.' - '.$riga->descrizione);
|
||||
} else {
|
||||
echo nl2br($riga->descrizione);
|
||||
}
|
||||
|
||||
echo '
|
||||
<small class="pull-right text-right text-muted">'.$extra_riga.'</small>';
|
||||
|
||||
if (!empty($r['abilita_serial'])) {
|
||||
if ($riga->isArticolo() && !empty($riga->abilita_serial)) {
|
||||
if (!empty($mancanti)) {
|
||||
echo '
|
||||
<br><b><small class="text-danger">'.tr('_NUM_ serial mancanti', [
|
||||
@ -129,19 +95,6 @@ foreach ($righe as $riga) {
|
||||
}
|
||||
}
|
||||
|
||||
// Aggiunta dei riferimenti ai documenti
|
||||
if ($fattura->isNota() && !empty($record['ref_documento'])) {
|
||||
$data = $dbo->fetchArray("SELECT IF(numero_esterno != '', numero_esterno, numero) AS numero, data FROM co_documenti WHERE id = ".prepare($record['ref_documento']));
|
||||
|
||||
$text = tr('Rif. fattura _NUM_ del _DATE_', [
|
||||
'_NUM_' => $data[0]['numero'],
|
||||
'_DATE_' => Translator::dateToLocale($data[0]['data']),
|
||||
]);
|
||||
|
||||
echo '
|
||||
<br>'.Modules::link($id_module, $record['ref_documento'], $text, $text);
|
||||
}
|
||||
|
||||
// Aggiunta dei riferimenti ai documenti
|
||||
if ($riga->hasOriginal()) {
|
||||
echo '
|
||||
@ -161,7 +114,7 @@ foreach ($righe as $riga) {
|
||||
// Quantità e unità di misura
|
||||
echo '
|
||||
<td class="text-center">
|
||||
'.numberFormat($riga->qta, 'qta').' '.$r['um'].'
|
||||
'.numberFormat($riga->qta, 'qta').' '.$riga->um.'
|
||||
</td>';
|
||||
|
||||
// Prezzi unitari
|
||||
@ -204,37 +157,37 @@ foreach ($righe as $riga) {
|
||||
echo '
|
||||
<td class="text-center">';
|
||||
|
||||
if ($record['stato'] != 'Pagato' && $record['stato'] != 'Emessa' && $r['id'] != $fattura->rigaBollo->id) {
|
||||
if ($record['stato'] != 'Pagato' && $record['stato'] != 'Emessa' && $riga->id != $fattura->rigaBollo->id) {
|
||||
echo "
|
||||
<form action='".$rootdir.'/editor.php?id_module='.$id_module.'&id_record='.$id_record."' method='post' id='delete-form-".$r['id']."' role='form'>
|
||||
<form action='".$rootdir.'/editor.php?id_module='.$id_module.'&id_record='.$id_record."' method='post' id='delete-form-".$riga->id."' role='form'>
|
||||
<input type='hidden' name='backto' value='record-edit'>
|
||||
<input type='hidden' name='idriga' value='".$r['id']."'>
|
||||
<input type='hidden' name='idriga' value='".$riga->id."'>
|
||||
<input type='hidden' name='type' value='".get_class($riga)."'>
|
||||
<input type='hidden' name='op' value='".$delete."'>";
|
||||
|
||||
if ($riga->isArticolo()) {
|
||||
echo "
|
||||
<input type='hidden' name='idarticolo' value='".$r['idarticolo']."'>";
|
||||
<input type='hidden' name='idarticolo' value='".$riga->idarticolo."'>";
|
||||
}
|
||||
|
||||
echo "
|
||||
<div class='input-group-btn'>";
|
||||
|
||||
if ($riga->isArticolo() && $r['abilita_serial'] && (empty($r['idddt']) || empty($r['idintervento']))) {
|
||||
if ($riga->isArticolo() && !empty($riga->abilita_serial)) {
|
||||
echo "
|
||||
<a class='btn btn-primary btn-xs'data-toggle='tooltip' title='Aggiorna SN...' onclick=\"launch_modal( 'Aggiorna SN', '".$structure->fileurl('add_serial.php').'?id_module='.$id_module.'&id_record='.$id_record.'&idriga='.$r['id'].'&idarticolo='.$r['idarticolo']."');\"><i class='fa fa-barcode' aria-hidden='true'></i></a>";
|
||||
<a class='btn btn-primary btn-xs'data-toggle='tooltip' title='Aggiorna SN...' onclick=\"launch_modal( 'Aggiorna SN', '".$structure->fileurl('add_serial.php').'?id_module='.$id_module.'&id_record='.$id_record.'&idriga='.$riga->id.'&idarticolo='.$riga->idarticolo."');\"><i class='fa fa-barcode' aria-hidden='true'></i></a>";
|
||||
}
|
||||
|
||||
echo "
|
||||
<a class='btn btn-xs btn-info' title='".tr('Aggiungi informazioni FE per questa riga...')."' data-toggle='modal' data-title='".tr('Dati Fattura Elettronica')."' data-href='".$structure->fileurl('fe/row-fe.php').'?id_module='.$id_module.'&id_record='.$id_record.'&idriga='.$r['id'].'&type='.urlencode(get_class($riga))."'>
|
||||
<a class='btn btn-xs btn-info' title='".tr('Aggiungi informazioni FE per questa riga...')."' data-toggle='modal' data-title='".tr('Dati Fattura Elettronica')."' data-href='".$structure->fileurl('fe/row-fe.php').'?id_module='.$id_module.'&id_record='.$id_record.'&idriga='.$riga->id.'&type='.urlencode(get_class($riga))."'>
|
||||
<i class='fa fa-file-code-o '></i>
|
||||
</a>
|
||||
|
||||
<a class='btn btn-xs btn-warning' title='".tr('Modifica questa riga...')."' onclick=\"launch_modal( 'Modifica riga', '".$structure->fileurl('row-edit.php').'?id_module='.$id_module.'&id_record='.$id_record.'&idriga='.$r['id'].'&type='.urlencode(get_class($riga))."');\">
|
||||
<a class='btn btn-xs btn-warning' title='".tr('Modifica questa riga...')."' onclick=\"launch_modal( 'Modifica riga', '".$structure->fileurl('row-edit.php').'?id_module='.$id_module.'&id_record='.$id_record.'&idriga='.$riga->id.'&type='.urlencode(get_class($riga))."');\">
|
||||
<i class='fa fa-edit'></i>
|
||||
</a>
|
||||
|
||||
<a class='btn btn-xs btn-danger' title='".tr('Rimuovi questa riga...')."' onclick=\"if( confirm('".tr('Rimuovere questa riga dalla fattura?')."') ){ $('#delete-form-".$r['id']."').submit(); }\">
|
||||
<a class='btn btn-xs btn-danger' title='".tr('Rimuovi questa riga...')."' onclick=\"if( confirm('".tr('Rimuovere questa riga dalla fattura?')."') ){ $('#delete-form-".$riga->id."').submit(); }\">
|
||||
<i class='fa fa-trash'></i>
|
||||
</a>
|
||||
</div>
|
||||
@ -255,12 +208,21 @@ foreach ($righe as $riga) {
|
||||
echo '
|
||||
</tbody>';
|
||||
|
||||
$imponibile = abs($fattura->imponibile);
|
||||
// Individuazione dei totali
|
||||
$imponibile = $fattura->imponibile;
|
||||
$sconto = $fattura->sconto;
|
||||
$totale_imponibile = abs($fattura->totale_imponibile);
|
||||
$iva = abs($fattura->iva);
|
||||
$totale = abs($fattura->totale);
|
||||
$netto_a_pagare = abs($fattura->netto);
|
||||
$totale_imponibile = $fattura->totale_imponibile;
|
||||
$iva = $fattura->iva;
|
||||
$totale = $fattura->totale;
|
||||
$netto_a_pagare = $fattura->netto;
|
||||
|
||||
// Inversione dei valori per le Note
|
||||
$imponibile = $fattura->isNota() ? -$imponibile : $imponibile;
|
||||
$sconto = $fattura->isNota() ? -$sconto : $sconto;
|
||||
$totale_imponibile = $fattura->isNota() ? -$totale_imponibile : $totale_imponibile;
|
||||
$iva = $fattura->isNota() ? -$iva : $iva;
|
||||
$totale = $fattura->isNota() ? -$totale : $totale;
|
||||
$netto_a_pagare = $fattura->isNota() ? -$netto_a_pagare : $netto_a_pagare;
|
||||
|
||||
// IMPONIBILE
|
||||
echo '
|
||||
@ -396,7 +358,8 @@ if ($totale != $netto_a_pagare) {
|
||||
}
|
||||
|
||||
echo '
|
||||
</table>';
|
||||
</table>
|
||||
</div>';
|
||||
|
||||
echo '
|
||||
<script>
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
namespace Modules\Fatture\Components;
|
||||
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Modules\Fatture\Fattura;
|
||||
use Modules\Ritenute\RitenutaAcconto;
|
||||
use Modules\Rivalse\RivalsaINPS;
|
||||
@ -187,30 +188,18 @@ trait RelationTrait
|
||||
$this->attributes['ritenutaacconto'] = $this->ritenuta_acconto;
|
||||
}
|
||||
|
||||
protected function evasione($diff)
|
||||
protected static function boot($bypass = false)
|
||||
{
|
||||
parent::evasione($diff);
|
||||
parent::boot($bypass);
|
||||
|
||||
$database = database();
|
||||
// Precaricamento Rivalsa INPS
|
||||
static::addGlobalScope('rivalsa', function (Builder $builder) {
|
||||
$builder->with('rivalsa');
|
||||
});
|
||||
|
||||
// Se c'è un collegamento ad un ddt, aggiorno la quantità evasa
|
||||
if (!empty($this->idddt)) {
|
||||
$database->query('UPDATE dt_righe_ddt SET qta_evasa = qta_evasa + '.$diff.' WHERE descrizione = '.prepare($this->descrizione).' AND idarticolo = '.prepare($this->idarticolo).' AND idddt = '.prepare($this->idddt).' AND idiva = '.prepare($this->idiva).' AND qta_evasa < qta LIMIT 1');
|
||||
}
|
||||
|
||||
// Se c'è un collegamento ad un ordine, aggiorno la quantità evasa
|
||||
elseif (!empty($this->idordine)) {
|
||||
$database->query('UPDATE or_righe_ordini SET qta_evasa = qta_evasa + '.$diff.' WHERE descrizione = '.prepare($this->descrizione).' AND idarticolo = '.prepare($this->idarticolo).' AND idordine = '.prepare($this->idordine).' AND idiva = '.prepare($this->idiva).' AND qta_evasa < qta LIMIT 1');
|
||||
}
|
||||
|
||||
// Se c'è un collegamento ad un preventivo, aggiorno la quantità evasa
|
||||
elseif (!empty($this->idpreventivo)) {
|
||||
$database->query('UPDATE co_righe_preventivi SET qta_evasa = qta_evasa + '.$diff.' WHERE descrizione = '.prepare($this->descrizione).' AND idarticolo = '.prepare($this->idarticolo).' AND idpreventivo = '.prepare($this->idpreventivo).' AND idiva = '.prepare($this->idiva).' AND qta_evasa < qta LIMIT 1');
|
||||
}
|
||||
|
||||
// Se c'è un collegamento ad un contratto, aggiorno la quantità evasa
|
||||
elseif (!empty($this->idcontratto)) {
|
||||
$database->query('UPDATE co_righe_contratti SET qta_evasa = qta_evasa + '.$diff.' WHERE descrizione = '.prepare($this->descrizione).' AND idarticolo = '.prepare($this->idarticolo).' AND idcontratto = '.prepare($this->idcontratto).' AND idiva = '.prepare($this->idiva).' AND qta_evasa < qta LIMIT 1');
|
||||
}
|
||||
// Precaricamento Ritenuta d'Acconto
|
||||
static::addGlobalScope('ritenuta', function (Builder $builder) {
|
||||
$builder->with('ritenuta');
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -30,6 +30,10 @@ class Fattura extends Document
|
||||
'bollo' => 'float',
|
||||
];
|
||||
|
||||
protected $with = [
|
||||
'tipo',
|
||||
];
|
||||
|
||||
/**
|
||||
* Crea una nuova fattura.
|
||||
*
|
||||
|
@ -20,15 +20,13 @@ echo '
|
||||
// Righe documento
|
||||
$righe = $ordine->getRighe();
|
||||
foreach ($righe as $riga) {
|
||||
$r = $riga->toArray();
|
||||
|
||||
$extra = '';
|
||||
$mancanti = 0;
|
||||
|
||||
// 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_ordine='.prepare($r['id'])), 'serial');
|
||||
$mancanti = $r['qta'] - count($serials);
|
||||
if ($riga->isArticolo() && !empty($riga->abilita_serial)) {
|
||||
$serials = $riga->serials;
|
||||
$mancanti = abs($riga->qta) - count($serials);
|
||||
|
||||
if ($mancanti > 0) {
|
||||
$extra = 'class="warning"';
|
||||
@ -38,28 +36,27 @@ foreach ($righe as $riga) {
|
||||
}
|
||||
|
||||
echo '
|
||||
<tr data-id="'.$r['id'].'" '.$extra.'>
|
||||
<td align="left">';
|
||||
<tr data-id="'.$riga->id.'" '.$extra.'>
|
||||
<td>';
|
||||
|
||||
if (!empty($r['idarticolo'])) {
|
||||
if ($riga->isArticolo()) {
|
||||
echo '
|
||||
'.Modules::link('Articoli', $r['idarticolo'], $riga->articolo->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);
|
||||
}
|
||||
}
|
||||
'.Modules::link('Articoli', $riga->idarticolo, $riga->articolo->codice.' - '.$riga->descrizione);
|
||||
} else {
|
||||
echo nl2br($r['descrizione']);
|
||||
echo nl2br($riga->descrizione);
|
||||
}
|
||||
|
||||
if ($riga->isArticolo() && !empty($riga->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);
|
||||
}
|
||||
}
|
||||
|
||||
// Aggiunta dei riferimenti ai documenti
|
||||
@ -81,7 +78,7 @@ foreach ($righe as $riga) {
|
||||
// Quantità e unità di misura
|
||||
echo '
|
||||
<td class="text-center">
|
||||
'.numberFormat($riga->qta_rimanente, 'qta').' / '.numberFormat($riga->qta, 'qta').' '.$r['um'].'
|
||||
'.numberFormat($riga->qta_rimanente, 'qta').' / '.numberFormat($riga->qta, 'qta').' '.$riga->um.'
|
||||
</td>';
|
||||
|
||||
// Prezzi unitari
|
||||
@ -126,10 +123,10 @@ foreach ($righe as $riga) {
|
||||
|
||||
if ($record['flag_completato'] == 0) {
|
||||
echo "
|
||||
<form action='".$rootdir.'/editor.php?id_module='.$id_module.'&id_record='.$id_record."' method='post' id='delete-form-".$r['id']."' role='form'>
|
||||
<form action='".$rootdir.'/editor.php?id_module='.$id_module.'&id_record='.$id_record."' method='post' id='delete-form-".$riga->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='idriga' value='".$riga->id."'>
|
||||
<input type='hidden' name='type' value='".get_class($riga)."'>
|
||||
<input type='hidden' name='op' value='delete_riga'>";
|
||||
|
||||
@ -137,15 +134,15 @@ foreach ($righe as $riga) {
|
||||
|
||||
<div class='input-group-btn'>";
|
||||
|
||||
if (!empty($r['idarticolo']) && $r['abilita_serial']) {
|
||||
if ($riga->isArticolo() && !empty($riga->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']."');\"><i class='fa fa-barcode' aria-hidden='true'></i></a>";
|
||||
<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='.$riga->id.'&idarticolo='.$riga->idarticolo."');\"><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/ordini/row-edit.php?id_module='.$id_module.'&id_record='.$id_record.'&idriga='.$r['id'].'&type='.urlencode(get_class($riga))."');\"><i class='fa fa-edit'></i></a>
|
||||
<a class='btn btn-xs btn-warning' title='Modifica questa riga...' onclick=\"launch_modal( 'Modifica riga', '".$rootdir.'/modules/ordini/row-edit.php?id_module='.$id_module.'&id_record='.$id_record.'&idriga='.$riga->id.'&type='.urlencode(get_class($riga))."');\"><i class='fa fa-edit'></i></a>
|
||||
|
||||
<a class='btn btn-xs btn-danger' title='Rimuovi questa riga...' onclick=\"if( confirm('Rimuovere questa riga dall\\'ordine?') ){ $('#delete-form-".$r['id']."').submit(); }\"><i class='fa fa-trash'></i></a>
|
||||
<a class='btn btn-xs btn-danger' title='Rimuovi questa riga...' onclick=\"if( confirm('Rimuovere questa riga dall\\'ordine?') ){ $('#delete-form-".$riga->id."').submit(); }\"><i class='fa fa-trash'></i></a>
|
||||
</div>
|
||||
</form>";
|
||||
}
|
||||
|
@ -17,6 +17,10 @@ class Ordine extends Document
|
||||
|
||||
protected $table = 'or_ordini';
|
||||
|
||||
protected $with = [
|
||||
'tipo',
|
||||
];
|
||||
|
||||
/**
|
||||
* Crea un nuovo ordine.
|
||||
*
|
||||
|
@ -66,6 +66,7 @@ class FatturaOrdinaria extends FatturaElettronica
|
||||
{
|
||||
$result = $this->getBody()['DatiBeniServizi']['DettaglioLinee'];
|
||||
|
||||
// Aggiunta degli arrotondamenti IVA come righe indipendenti
|
||||
$riepolighi = $this->getBody()['DatiBeniServizi']['DatiRiepilogo'];
|
||||
foreach ($riepolighi as $riepilogo) {
|
||||
if (!empty($riepilogo['Arrotondamento'])) {
|
||||
|
@ -7,6 +7,8 @@
|
||||
*/
|
||||
class Update
|
||||
{
|
||||
protected static $current_version;
|
||||
|
||||
/** @var array Elenco degli aggiornamenti da completare */
|
||||
protected static $updates;
|
||||
/** @var array Percorsi da controllare per gli aggiornamenti */
|
||||
@ -114,11 +116,14 @@ class Update
|
||||
*/
|
||||
public static function getDatabaseVersion()
|
||||
{
|
||||
$database = database();
|
||||
if (!isset(self::$current_version)) {
|
||||
$database = database();
|
||||
|
||||
$results = $database->fetchArray("SELECT version FROM `updates` WHERE version NOT LIKE '%\_%' ORDER BY INET_ATON(SUBSTRING_INDEX(CONCAT(version,'.0.0.0'),'.',4)) DESC LIMIT 1");
|
||||
$results = $database->fetchArray("SELECT version FROM `updates` WHERE version NOT LIKE '%\_%' ORDER BY INET_ATON(SUBSTRING_INDEX(CONCAT(version,'.0.0.0'),'.',4)) DESC LIMIT 1");
|
||||
self::$current_version = $results[0]['version'];
|
||||
}
|
||||
|
||||
return $results[0]['version'];
|
||||
return self::$current_version;
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
x
Reference in New Issue
Block a user