1
0
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:
Thomas Zilio 2020-03-09 13:57:13 +01:00
parent de0e2a0e82
commit 830b2a1ec8
14 changed files with 194 additions and 192 deletions

View File

@ -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();

View File

@ -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();

View File

@ -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();

View File

@ -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>

View File

@ -17,6 +17,10 @@ class DDT extends Document
protected $table = 'dt_ddt';
protected $with = [
'tipo',
];
/**
* Crea un nuovo ddt.
*

View File

@ -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;
}

View File

@ -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>

View File

@ -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>

View File

@ -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');
});
}
}

View File

@ -30,6 +30,10 @@ class Fattura extends Document
'bollo' => 'float',
];
protected $with = [
'tipo',
];
/**
* Crea una nuova fattura.
*

View File

@ -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>";
}

View File

@ -17,6 +17,10 @@ class Ordine extends Document
protected $table = 'or_ordini';
protected $with = [
'tipo',
];
/**
* Crea un nuovo ordine.
*

View File

@ -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'])) {

View File

@ -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;
}
/**