From c2eb43c308d8982b1ca4e325d819eb53f11894e2 Mon Sep 17 00:00:00 2001 From: Thomas Zilio Date: Tue, 23 Jul 2019 15:39:00 +0200 Subject: [PATCH] Miglioramenti distribuiti MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Gestione della gerarchia per qta_evasa, stati dei documenti relativi (con priorità a "Fatturato") e eliminazione dei documenti. Miglioramento gestione schermata di importazione documento in un altro. Standardizzazione rimozione righe per le fatture. --- include/common/importa.php | 391 ++++++++------- include/common/riga.php | 2 +- include/src/Components/Article.php | 11 + include/src/Components/Description.php | 28 +- include/src/Document.php | 12 +- lib/functions.js | 13 +- modules/contratti/crea_documento.php | 25 +- modules/contratti/src/Contratto.php | 8 +- modules/ddt/actions.php | 296 ++++-------- modules/ddt/crea_documento.php | 29 +- modules/ddt/row-add.php | 6 +- modules/ddt/row-edit.php | 7 +- modules/ddt/src/Components/Articolo.php | 5 + modules/ddt/src/DDT.php | 4 +- modules/fatture/actions.php | 447 +++--------------- modules/fatture/add_contratto.php | 59 +-- modules/fatture/add_ddt.php | 65 +-- modules/fatture/add_ordine.php | 65 +-- modules/fatture/add_preventivo.php | 60 +-- modules/fatture/modutil.php | 222 --------- modules/fatture/row-list.php | 26 +- modules/fatture/src/Components/Articolo.php | 5 + .../fatture/src/Components/RelationTrait.php | 11 + modules/fatture/src/Fattura.php | 10 + modules/ordini/actions.php | 242 ++++------ modules/ordini/crea_documento.php | 36 +- modules/ordini/row-add.php | 6 +- modules/ordini/row-edit.php | 6 +- modules/ordini/src/Ordine.php | 8 +- modules/preventivi/crea_documento.php | 32 +- modules/preventivi/src/Preventivo.php | 8 +- update/2_4_11.sql | 49 +- 32 files changed, 795 insertions(+), 1399 deletions(-) diff --git a/include/common/importa.php b/include/common/importa.php index 305d10952..042e02a7c 100644 --- a/include/common/importa.php +++ b/include/common/importa.php @@ -1,197 +1,270 @@ fetchOne('SELECT * FROM '.$table.' WHERE id = '.prepare($id_record)); -$numero = !empty($documento['numero_esterno']) ? $documento['numero_esterno'] : $documento['numero']; -$id_anagrafica = $documento['idanagrafica']; -$id_pagamento = $documento['idpagamento']; -$id_conto = $documento['idconto']; - -if (empty($documento)) { +// Inizializzazione +$documento = $options['documento']; +$documento_finale = $options['documento_finale']; +if (empty($documento) || (!empty($documento_finale) && $documento_finale->direzione != $documento->direzione)) { return; } +// Informazioi utili +$dir = $documento->direzione; +$original_module = Modules::get($documento->module); + +$name = !empty($documento_finale) ? $documento_finale->module : $options['module']; +$final_module = Modules::get($name); + +// IVA predefinta $id_iva = $id_iva ?: setting('Iva predefinita'); -if (empty($id_conto)) { - $id_conto = ($dir == 'entrata') ? setting('Conto predefinito fatture di vendita') : setting('Conto predefinito fatture di acquisto'); + +$righe = $documento->getRighe()->where('qta_rimanente', '>', 0); +if (empty($righe)) { + echo ' +

'.tr('Non ci sono elementi da evadere').'...

'; + + return; } -// Selezione articoli dell'ordine da portare nel ddt -$righe = $dbo->fetchArray('SELECT *, IFNULL((SELECT codice FROM mg_articoli WHERE id=idarticolo),"") AS codice, (qta - qta_evasa) AS qta_rimanente FROM '.$table.' INNER JOIN '.$rows.' ON '.$table.'.id='.$rows.'.'.$id_rows.' WHERE '.$table.'.id='.prepare($id_record).' HAVING qta_rimanente > 0 ORDER BY `order`'); +$link = !empty($documento_finale) ? ROOTDIR.'/editor.php?id_module='.$final_module['id'].'&id_record='.$documento_finale->id : ROOTDIR.'/controller.php?id_module='.$final_module['id']; -if (!empty($righe)) { - echo ' +echo ' -
- - - - - - - - + + - '; + + + '; - // Creazione fattura dal documento - if (!empty($options['create_document'])) { - echo ' -
- +// Creazione fattura dal documento +if (!empty($options['create_document'])) { + echo ' +
+
+

'.tr('Nuovo documento').'

+
+
+ +
+ + +
+ {[ "type": "date", "label": "'.tr('Data del documento').'", "name": "data", "required": 1, "value": "-now-" ]} +
'; -
- {[ "type": "date", "label": "'.tr('Data del documento').'", "name": "data", "required": 1, "value": "-now-" ]} -
'; + if (in_array($final_module['name'], ['Fatture di vendita', 'Fatture di acquisto'])) { + if ($op == 'nota_accredito' && !empty($segmenti)) { + $segmento = $dbo->fetchOne("SELECT * FROM zz_segments WHERE predefined_accredito='1'"); - if ($final_module['name'] == 'Fatture di vendita' || $final_module['name'] == 'Fatture di acquisto') { - if ($op == 'nota_accredito' && !empty($segmenti)) { - $segmento = $dbo->fetchOne("SELECT * FROM zz_segments WHERE predefined_accredito='1'"); - - $id_segment = $segmento['id']; - } else { - $id_segment = $_SESSION['module_'.$final_module['id']]['id_segment']; - } - - echo ' -
- {[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "values": "query=SELECT id, name AS descrizione FROM zz_segments WHERE id_module='.prepare($final_module['id']).' ORDER BY name", "value": "'.$id_segment.'" ]} -
'; + $id_segment = $segmento['id']; + } else { + $id_segment = $_SESSION['module_'.$final_module['id']]['id_segment']; } echo ' +
+ {[ "type": "select", "label": "'.tr('Ritenuta contributi').'", "name": "id_ritenuta_contributi", "value": "$id_ritenuta_contributi$", "values": "query=SELECT * FROM co_ritenuta_contributi" ]} +
+ +
+ {[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "values": "query=SELECT id, name AS descrizione FROM zz_segments WHERE id_module='.prepare($final_module['id']).' ORDER BY name", "value": "'.$id_segment.'" ]} +
'; + } + + echo ' +
+
'; +} + + // Conto, rivalsa INPS, ritenuta d'acconto e ritenuta contributi +if (in_array($final_module['name'], ['Fatture di vendita', 'Fatture di acquisto']) && !in_array($original_module['name'], ['Fatture di vendita', 'Fatture di acquisto'])) { + $id_rivalsa_inps = setting('Percentuale rivalsa'); + if ($dir == 'uscita') { + $id_ritenuta_acconto = $documento->anagrafica->id_ritenuta_acconto_acquisti; + } else { + $id_ritenuta_acconto = $documento->anagrafica->id_ritenuta_acconto_vendite ?: setting("Percentuale ritenuta d'acconto"); + } + $calcolo_ritenuta_acconto = setting("Metodologia calcolo ritenuta d'acconto predefinito"); + + $show_rivalsa = !empty($id_rivalsa_inps); + $show_ritenuta_acconto = setting("Percentuale ritenuta d'acconto") != '' || !empty($id_ritenuta_acconto); + $show_ritenuta_contributi = !empty($documento_finale['id_ritenuta_contributi']); + + $id_conto = $documento_finale['idconto']; + if (empty($id_conto)) { + $id_conto = ($dir == 'entrata') ? setting('Conto predefinito fatture di vendita') : setting('Conto predefinito fatture di acquisto'); + } + + echo ' +
+
+

'.tr('Opzioni generali delle righe').'

+
+
'; + + if ($show_rivalsa || $show_ritenuta_acconto) { + echo ' +
'; + + // Rivalsa INPS + if ($show_rivalsa) { + echo ' +
+ {[ "type": "select", "label": "'.tr('Rivalsa').'", "name": "id_rivalsa_inps", "value": "'.$id_rivalsa_inps.'", "values": "query=SELECT * FROM co_rivalse", "help": "'.(($options['dir'] == 'entrata') ? setting('Tipo Cassa Previdenziale') : null).'" ]} +
'; + } + + // Ritenuta d'acconto + if ($show_ritenuta_acconto) { + echo ' +
+ {[ "type": "select", "label": "'.tr("Ritenuta d'acconto").'", "name": "id_ritenuta_acconto", "value": "'.$id_ritenuta_acconto.'", "values": "query=SELECT * FROM co_ritenutaacconto" ]} +
'; + + // Calcola ritenuta d'acconto su + echo ' +
+ {[ "type": "select", "label": "'.tr("Calcola ritenuta d'acconto su").'", "name": "calcolo_ritenuta_acconto", "value": "'.$calcolo_ritenuta_acconto.'", "values": "list=\"IMP\":\"Imponibile\", \"IMP+RIV\":\"Imponibile + rivalsa\"", "required": "1" ]} +
'; + } + + echo ' +
'; + } + + $width = $show_ritenuta_contributi ? 6 : 12; + + echo ' +
'; + + // Ritenuta contributi + if ($show_ritenuta_contributi) { + echo ' +
+ {[ "type": "checkbox", "label": "'.tr('Ritenuta contributi').'", "name": "ritenuta_contributi", "value": "1" ]} +
'; } // Conto - if (($final_module['name'] == 'Fatture di vendita' || $final_module['name'] == 'Fatture di acquisto') && !($original_module['name'] == 'Fatture di vendita' || $original_module['name'] == 'Fatture di acquisto')) { - echo ' -
-
- {[ "type": "select", "label": "'.tr('Conto').'", "name": "id_conto", "required": 1, "value": "'.$id_conto.'", "ajax-source": "'.($dir == 'entrata' ? 'conti-vendite' : 'conti-acquisti').'" ]} + echo ' +
+ {[ "type": "select", "label": "'.tr('Conto').'", "name": "id_conto", "required": 1, "value": "'.$id_conto.'", "ajax-source": "'.($dir == 'entrata' ? 'conti-vendite' : 'conti-acquisti').'" ]} +
+
'; - } +} echo ' -
-
+
+
+

'.tr('Righe da importare').'

+
-

'.tr('Seleziona le righe e le relative quantità da inserire nel documento').'.

+ + + + + + '; -
'.tr('Descrizione').''.tr('Q.tà').''.tr('Q.tà da evadere').''.tr('Subtot.').'
- - - - - '; +if (!empty($options['serials'])) { + echo ' + '; +} +echo ' + '; + +foreach ($righe as $i => $r) { + // Descrizione + echo ' + + '; + + // Q.tà rimanente + echo ' + '; + + // Q.tà da evadere + echo ' + '; + + echo ' + '; + + // Seriali if (!empty($options['serials'])) { echo ' - '; - } + '; + if (!empty($r['abilita_serial'])) { + $serials = $r->serials; - foreach ($righe as $i => $r) { - // Descrizione - echo ' - - '; - - // Q.tà rimanente - echo ' - '; - - // Q.tà da evadere - echo ' - '; - - // Subtotale - $subtotale = $r['subtotale'] / $r['qta'] * ($r['qta'] - $r['qta_evasa']); - $sconto = $r['sconto'] / $r['qta'] * ($r['qta'] - $r['qta_evasa']); - $iva = $r['iva'] / $r['qta'] * ($r['qta'] - $r['qta_evasa']); - - echo ' - '; - - // Seriali - if (!empty($options['serials'])) { - echo ' - '; + if (empty($r['abilita_serial']) || empty($serials)) { + echo '-'; } echo ' - '; + '; } - // Totale echo ' - - - - -
'.tr('Descrizione').''.tr('Q.tà').''.tr('Q.tà da evadere').''.tr('Subtot.').''.tr('Seriali').'
+ + + + '; + + // Checkbox - da evadere? + echo ' + '; + + $descrizione = ($r->isArticolo() ? $r->articolo->codice.' - ' : '').$r['descrizione']; + + echo ' '.nl2br($descrizione); + + echo ' + + '.Translator::numberToLocale($r['qta_rimanente']).' + + {[ "type": "number", "name": "qta_da_evadere['.$r['id'].']", "id": "qta_'.$i.'", "required": 1, "value": "'.$r['qta_rimanente'].'", "decimals": "qta", "min-value": "0", "extra": "'.(($r['is_descrizione']) ? 'readonly' : '').' onkeyup=\"ricalcola_subtotale_riga('.$i.');\"" ]} + + '.moneyFormat($r->totale).'
+ + '.Translator::numberToLocale($r->totale_imponibile).' + '.Translator::numberToLocale($r->iva).' +
'.tr('Seriali').''; - echo ' -
'; - - // Checkbox - da evadere? - echo ' - '; - - $descrizione = (!empty($r['codice']) ? $r['codice'].' - ' : '').$r['descrizione']; - - echo ' '.nl2br($descrizione); - - echo ' - - -

'.Translator::numberToLocale($r['qta_rimanente']).'

-
- {[ "type": "number", "name": "qta_da_evadere['.$r['id'].']", "id": "qta_'.$i.'", "required": 1, "value": "'.$r['qta_rimanente'].'", "decimals": "qta", "min-value": "0", "extra": "'.(($r['is_descrizione']) ? 'readonly' : '').' onkeyup=\"ricalcola_subtotale_riga('.$i.');\"" ]} - - - - - - '.moneyFormat($subtotale - $sconto + $iva).'
- - '.Translator::numberToLocale($subtotale - $sconto).' + '.Translator::numberToLocale($iva).' -
'; - - if (!empty($r['abilita_serial'])) { - $query = 'SELECT DISTINCT serial AS id, serial AS descrizione FROM mg_prodotti WHERE dir='.prepare($dir).' AND '.$options['serials']['id_riga'].' = '.prepare($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='.prepare($dir).' AND '.$options['serials']['condition'].')'; - - $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']).'\"" ]}'; - } + $list = []; + foreach ($serials as $serial) { + $list[] = [ + 'id' => $serial, + 'text' => $serial, + ]; } - if (empty($r['abilita_serial']) || empty($values)) { - echo '-'; + if (!empty($serials)) { + echo ' + {[ "type": "select", "name": "serial['.$r['id'].'][]", "id": "serial_'.$i.'", "multiple": 1, "values": '.json_encode($list).', "value": "'.implode(',', $serials).'", "extra": "data-maximum=\"'.intval($r['qta_rimanente']).'\"" ]}'; } + } - echo ' -
- '.tr('Totale').': - - -
'; + '; +} - echo ' +// Totale +echo ' + + + '.tr('Totale').': + + + + + + +
'; + +echo '
@@ -202,10 +275,6 @@ if (!empty($righe)) {
'; -} else { - echo ' -

'.tr('Non ci sono elementi da evadere').'...

'; -} echo ' '; @@ -255,13 +324,13 @@ echo ' } function ricalcola_totale() { - tot_qta = 0; - r = 0; totale = 0.00; + $('input[id*=qta_]').each(function() { qta = $(this).val().toEnglish(); + r = $(this).attr("id").replace("qta_", ""); - if (!$('#checked_' + r).is(':checked') || isNaN(qta)) { + if (!$("#checked_" + r).is(":checked") || isNaN(qta)) { qta = 0; } @@ -278,17 +347,13 @@ echo ' if(subtot) { totale += subtot * qta + iva * qta; } - - r++; - - tot_qta += qta; }); $('#totale').html((totale.toLocale()) + " " + globals.currency); 0) $("#submit_btn").show(); diff --git a/include/common/riga.php b/include/common/riga.php index 6f1834f06..77e8016bf 100644 --- a/include/common/riga.php +++ b/include/common/riga.php @@ -16,7 +16,7 @@ echo ' // Quantità echo '
- {[ "type": "number", "label": "'.tr('Q.tà').'", "name": "qta", "required": 1, "value": "'.$result['qta'].'", "decimals": "qta" ]} + {[ "type": "number", "label": "'.tr('Q.tà').'", "name": "qta", "required": 1, "value": "'.$result['qta'].'", "decimals": "qta"'.(isset($result['max_qta']) ? ', "icon-after": "/ '.numberFormat($result['max_qta'], 'qta').'", "help": "'.tr("Quantità dell'elemento / quantità totale massima").'"' : '').' ]}
'; // Unità di misura diff --git a/include/src/Components/Article.php b/include/src/Components/Article.php index f20fd6d03..b6dde2d2c 100644 --- a/include/src/Components/Article.php +++ b/include/src/Components/Article.php @@ -169,8 +169,19 @@ abstract class Article extends Row return parent::save($options); } + public function canDelete() + { + $serials = $this->usedSerials(); + + return empty($serials); + } + public function delete() { + if (!$this->canDelete()) { + throw new \InvalidArgumentException(); + } + $this->serials = []; $this->qta = 0; // Fix movimentazione automatica diff --git a/include/src/Components/Description.php b/include/src/Components/Description.php index bc07141d2..911aa5694 100644 --- a/include/src/Components/Description.php +++ b/include/src/Components/Description.php @@ -12,6 +12,10 @@ abstract class Description extends Model protected $guarded = []; + protected $appends = [ + 'max_qta', + ]; + public static function build(Document $document, $bypass = false) { $model = parent::build(); @@ -26,6 +30,17 @@ abstract class Description extends Model return $model; } + public function getMaxQtaAttribute() + { + if (!$this->hasOriginal()) { + return null; + } + + $original = $this->getOriginal(); + + return $original->qta_rimanente + $this->qta; + } + /** * Modifica la quantità dell'elemento. * @@ -69,12 +84,21 @@ abstract class Description extends Model return $this->qta - $this->qta_evasa; } + public function canDelete() + { + return true; + } + public function delete() { + if (!$this->canDelete()) { + throw new \InvalidArgumentException(); + } + $this->qta = 0; $result = parent::delete(); - $this->parent->controllo($this); + $this->parent->fixStato($this); return $result; } @@ -190,7 +214,7 @@ abstract class Description extends Model { $result = parent::save($options); - $this->parent->controllo($this); + $this->parent->fixStato($this); return $result; } diff --git a/include/src/Document.php b/include/src/Document.php index 2bf362b35..16d957d41 100644 --- a/include/src/Document.php +++ b/include/src/Document.php @@ -125,6 +125,16 @@ abstract class Document extends Model public function delete() { $righe = $this->getRighe(); + + $can_delete = true; + foreach ($righe as $riga) { + $can_delete &= $riga->canDelete(); + } + + if (!$can_delete) { + throw new \InvalidArgumentException(); + } + foreach ($righe as $riga) { $riga->delete(); } @@ -138,7 +148,7 @@ abstract class Document extends Model * * @param Description $trigger */ - public function controllo(Description $trigger) + public function fixStato(Description $trigger) { $this->load('righe'); $this->load('articoli'); diff --git a/lib/functions.js b/lib/functions.js index 8315d6ed4..6266d16a3 100644 --- a/lib/functions.js +++ b/lib/functions.js @@ -248,11 +248,22 @@ $(document).ready(function () { $('.nav-tabs').tabs(); // Entra nel tab indicato al caricamento della pagina - var hash = window.location.hash ? window.location.hash : getUrlVars().hash; + var hash = location.hash ? location.hash : getUrlVars().hash; if (hash && hash != '#tab_0') { $('ul.nav-tabs a[href="' + hash + '"]').tab('show').trigger('shown.bs.tab'); + } else { + location.hash = ''; } + $(window).bind("hashchange", function(){ + var hash = location.hash; + console.log(hash); + + if (!hash || hash == '#tab_0') { + location.hash = ''; + } + }); + // Nel caso la navigazione sia da mobile, disabilito il ritorno al punto precedente if (!isMobile.any()) { // Salvo lo scroll per riportare qui l'utente al reload diff --git a/modules/contratti/crea_documento.php b/modules/contratti/crea_documento.php index 7c69eafdc..1e1266bed 100644 --- a/modules/contratti/crea_documento.php +++ b/modules/contratti/crea_documento.php @@ -2,26 +2,17 @@ include_once __DIR__.'/../../core.php'; -$module = Modules::get($id_module); +use Modules\Contratti\Contratto; + +$documento = Contratto::find($id_record); $options = [ - 'op' => 'add_contratto', - 'id_importazione' => 'id_contratto', - 'final_module' => 'Fatture di vendita', - 'original_module' => $module['name'], - 'sql' => [ - 'table' => 'co_contratti', - 'rows' => 'co_righe_contratti', - 'id_rows' => 'idcontratto', - ], + 'op' => 'add_documento', + 'type' => 'contratto', + 'module' => 'Fatture di vendita', 'button' => tr('Aggiungi'), - 'dir' => 'entrata', 'create_document' => true, + 'documento' => $documento, ]; -$result = [ - 'id_record' => $id_record, - 'id_documento' => get('iddocumento'), -]; - -echo App::load('importa.php', $result, $options, true); +echo App::load('importa.php', [], $options, true); diff --git a/modules/contratti/src/Contratto.php b/modules/contratti/src/Contratto.php index ca57a11ad..e95ad542f 100644 --- a/modules/contratti/src/Contratto.php +++ b/modules/contratti/src/Contratto.php @@ -7,7 +7,6 @@ use Common\Components\Description; use Common\Document; use Modules\Anagrafiche\Anagrafica; use Modules\Interventi\Intervento; -use Modules\Ordini\Ordine; use Modules\TipiIntervento\Tipo as TipoSessione; use Traits\RecordTrait; use Util\Generator; @@ -157,9 +156,9 @@ class Contratto extends Document * * @param Description $trigger */ - public function controllo(Description $trigger) + public function fixStato(Description $trigger) { - parent::controllo($trigger); + parent::fixStato($trigger); $righe = $this->getRighe(); @@ -171,9 +170,6 @@ class Contratto extends Document if ($qta_evasa == 0) { $descrizione = 'In lavorazione'; $descrizione_intervento = 'Completato'; - } elseif ($trigger->parent instanceof Ordine) { - $descrizione = $this->stato->descrizione; - $descrizione_intervento = 'Completato'; } else { $descrizione = $parziale ? 'Parzialmente fatturato' : 'Fatturato'; $descrizione_intervento = 'Fatturato'; diff --git a/modules/ddt/actions.php b/modules/ddt/actions.php index 3b0291751..5ceb6c828 100644 --- a/modules/ddt/actions.php +++ b/modules/ddt/actions.php @@ -2,6 +2,7 @@ include_once __DIR__.'/../../core.php'; +use Modules\Articoli\Articolo as ArticoloOriginale; use Modules\Anagrafiche\Anagrafica; use Modules\DDT\Components\Articolo; use Modules\DDT\Components\Descrizione; @@ -115,75 +116,36 @@ switch (post('op')) { } break; - case 'addarticolo': - if (post('idarticolo') !== null) { - $dir = post('dir'); - $idarticolo = post('idarticolo'); - $descrizione = post('descrizione'); - $idiva = post('idiva'); - - $qta = post('qta'); - $prezzo = post('prezzo'); - - // Calcolo dello sconto - $sconto_unitario = post('sconto'); - $tipo_sconto = post('tipo_sconto'); - $sconto = calcola_sconto([ - 'sconto' => $sconto_unitario, - 'prezzo' => $prezzo, - 'tipo' => $tipo_sconto, - 'qta' => $qta, - ]); - - add_articolo_inddt($id_record, $idarticolo, $descrizione, $idiva, $qta, post('um'), $prezzo * $qta, $sconto, $sconto_unitario, $tipo_sconto); - - // Ricalcolo inps, ritenuta e bollo - ricalcola_costiagg_ddt($id_record); - - aggiorna_sedi_movimenti('ddt', $id_record); - - flash()->info(tr('Articolo aggiunto!')); - } - break; - - case 'addriga': - // Selezione costi da intervento - $descrizione = post('descrizione'); - $idiva = post('idiva'); - $um = post('um'); - - $prezzo = post('prezzo'); - $qta = post('qta'); - - // Calcolo dello sconto - $sconto_unitario = post('sconto'); - $tipo_sconto = post('tipo_sconto'); - $sconto = calcola_sconto([ - 'sconto' => $sconto_unitario, - 'prezzo' => $prezzo, - 'tipo' => $tipo_sconto, - 'qta' => $qta, - ]); - - $subtot = $prezzo * $qta; - - // Calcolo iva - $query = 'SELECT descrizione, percentuale, indetraibile FROM co_iva WHERE id='.prepare($idiva); - $rs = $dbo->fetchArray($query); - $iva = ($subtot - $sconto) / 100 * $rs[0]['percentuale']; - $iva_indetraibile = $iva / 100 * $rs[0]['indetraibile']; - - $query = 'INSERT INTO dt_righe_ddt(idddt, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, is_descrizione, `order`) VALUES('.prepare($id_record).', '.prepare($idiva).', '.prepare($rs[0]['descrizione']).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).', '.prepare($um).', '.prepare($qta).', '.prepare(empty($qta)).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM dt_righe_ddt AS t WHERE idddt='.prepare($id_record).'))'; - $dbo->query($query); - - // Messaggi informativi - if (!empty($idarticolo)) { - flash()->info(tr('Articolo aggiunto!')); - } elseif (!empty($qta)) { - flash()->info(tr('Riga aggiunta!')); + case 'manage_articolo': + if (post('idriga') != null) { + $articolo = Articolo::find(post('idriga')); } else { - flash()->info(tr('Riga descrittiva aggiunta!')); + $originale = ArticoloOriginale::find(post('idarticolo')); + $articolo = Articolo::build($ddt, $originale); + } + + $articolo->descrizione = post('descrizione'); + $articolo->um = post('um') ?: null; + $articolo->id_iva = post('idiva'); + + $articolo->prezzo_unitario_acquisto = post('prezzo_acquisto') ?: 0; + $articolo->prezzo_unitario_vendita = post('prezzo'); + $articolo->sconto_unitario = post('sconto'); + $articolo->tipo_sconto = post('tipo_sconto'); + + try { + $articolo->qta = post('qta'); + } catch (UnexpectedValueException $e) { + flash()->error(tr('Alcuni serial number sono già stati utilizzati!')); + } + + $articolo->save(); + + if (post('idriga') != null) { + flash()->info(tr('Articolo modificato!')); + } else { + flash()->info(tr('Articolo aggiunto!')); } // Ricalcolo inps, ritenuta e bollo @@ -217,9 +179,59 @@ switch (post('op')) { break; + case 'manage_riga': + if (post('idriga') != null) { + $riga = Riga::find(post('idriga')); + } else { + $riga = Riga::build($ddt); + } + + $riga->descrizione = post('descrizione'); + $riga->um = post('um') ?: null; + $riga->id_iva = post('idiva'); + + $riga->prezzo_unitario_acquisto = post('prezzo_acquisto') ?: 0; + $riga->prezzo_unitario_vendita = post('prezzo'); + $riga->sconto_unitario = post('sconto'); + $riga->tipo_sconto = post('tipo_sconto'); + + $riga->qta = post('qta'); + + $riga->save(); + + if (post('idriga') != null) { + flash()->info(tr('Riga modificata!')); + } else { + flash()->info(tr('Riga aggiunta!')); + } + + // Ricalcolo inps, ritenuta e bollo + ricalcola_costiagg_ddt($id_record); + + break; + + case 'manage_descrizione': + if (post('idriga') != null) { + $riga = Descrizione::find(post('idriga')); + } else { + $riga = Descrizione::build($ddt); + } + + $riga->descrizione = post('descrizione'); + + $riga->save(); + + if (post('idriga') != null) { + flash()->info(tr('Riga descrittiva modificata!')); + } else { + flash()->info(tr('Riga descrittiva aggiunta!')); + } + + break; + // Aggiunta di un ordine in ddt case 'add_ordine': - $ordine = \Modules\Ordini\Ordine::find(post('id_ordine')); + $ordine = \Modules\Ordini\Ordine::find(post('id_documento')); // Creazione della fattura al volo if (post('create_document') == 'on') { @@ -238,7 +250,6 @@ switch (post('op')) { $id_record = $ddt->id; } - $parziale = false; $righe = $ordine->getRighe(); foreach ($righe as $riga) { if (post('evadere')[$riga->id] == 'on') { @@ -257,22 +268,10 @@ switch (post('op')) { $copia->save(); } - - if ($riga->qta != $riga->qta_evasa) { - $parziale = true; - } } - // Impostazione del nuovo stato - $descrizione = $parziale ? 'Parzialmente evaso' : 'Evaso'; - $stato = \Modules\Ordini\Stato::where('descrizione', $descrizione)->first(); - $ordine->stato()->associate($stato); - $ordine->save(); - ricalcola_costiagg_ddt($id_record); - aggiorna_sedi_movimenti('ddt', $id_record); - flash()->info(tr('Ordine _NUM_ aggiunto!', [ '_NUM_' => $ordine->numero, ])); @@ -297,8 +296,6 @@ switch (post('op')) { ricalcola_costiagg_ddt($id_record, 0, 0, 0); } - aggiorna_sedi_movimenti('ddt', $id_record); - flash()->info(tr('Articolo rimosso!')); break; @@ -335,139 +332,18 @@ switch (post('op')) { } break; - // Modifica riga - case 'editriga': - if (post('idriga') !== null) { - // Selezione costi da intervento - $idriga = post('idriga'); - $descrizione = post('descrizione'); - - $prezzo = post('prezzo'); - $qta = post('qta'); - - // Calcolo dello sconto - $sconto_unitario = post('sconto'); - $tipo_sconto = post('tipo_sconto'); - $sconto = calcola_sconto([ - 'sconto' => $sconto_unitario, - 'prezzo' => $prezzo, - 'tipo' => $tipo_sconto, - 'qta' => $qta, - ]); - - $idiva = post('idiva'); - $um = post('um'); - - $subtot = $prezzo * $qta; - - // Lettura idarticolo dalla riga ddt - $rs = $dbo->fetchArray('SELECT * FROM dt_righe_ddt WHERE id='.prepare($idriga)); - $idarticolo = $rs[0]['idarticolo']; - $idordine = $rs[0]['idordine']; - $old_qta = $rs[0]['qta']; - $is_descrizione = $rs[0]['is_descrizione']; - - // Controllo per gestire i serial - if (!empty($idarticolo)) { - if (!controlla_seriali('id_riga_ddt', $idriga, $old_qta, $qta, $dir)) { - flash()->error(tr('Alcuni serial number sono già stati utilizzati!')); - - return; - } - } - - // Se c'è un collegamento ad un ordine, aggiorno la quantità evasa - if (!empty($idordine)) { - $dbo->query('UPDATE or_righe_ordini SET qta_evasa=qta_evasa-'.$old_qta.' + '.$qta.' WHERE descrizione='.prepare($rs[0]['descrizione']).' AND idarticolo='.prepare($rs[0]['idarticolo']).' AND idordine='.prepare($idordine).' AND idiva='.prepare($rs[0]['idiva'])); - } - - // Calcolo iva - $query = 'SELECT * FROM co_iva WHERE id='.prepare($idiva); - $rs = $dbo->fetchArray($query); - $iva = ($subtot - $sconto) / 100 * $rs[0]['percentuale']; - $iva_indetraibile = $iva / 100 * $rs[0]['indetraibile']; - $desc_iva = $rs[0]['descrizione']; - - // Modifica riga generica sul ddt - if ($is_descrizione == 0) { - $query = 'UPDATE dt_righe_ddt SET idiva='.prepare($idiva).', desc_iva='.prepare($desc_iva).', iva='.prepare($iva).', iva_indetraibile='.prepare($iva_indetraibile).', descrizione='.prepare($descrizione).', subtotale='.prepare($subtot).', sconto='.prepare($sconto).', sconto_unitario='.prepare($sconto_unitario).', tipo_sconto='.prepare($tipo_sconto).', um='.prepare($um).', qta='.prepare($qta).' WHERE id='.prepare($idriga); - } else { - $query = 'UPDATE dt_righe_ddt SET descrizione='.prepare($descrizione).' WHERE id='.prepare($idriga); - } - if ($dbo->query($query)) { - if (!empty($idarticolo)) { - // Controlli aggiuntivi sulle quantità evase degli ordini - if (!empty($idordine) && $qta > 0) { - $rs = $dbo->fetchArray('SELECT qta_evasa, qta FROM or_righe_ordini WHERE idordine='.prepare($idordine).' AND idarticolo='.prepare($idarticolo)); - - $qta_ordine = $qta; - if ($qta > $rs[0]['qta_evasa']) { - $qta_ordine = ($qta > $rs[0]['qta']) ? $rs[0]['qta'] : $qta; - } - - $dbo->query('UPDATE or_righe_ordini SET qta_evasa = '.prepare($qta_ordine).' WHERE idordine='.prepare($idordine).' AND idarticolo='.prepare($idarticolo)); - } - - $new_qta = $qta - $old_qta; - $new_qta = ($dir == 'entrata') ? -$new_qta : $new_qta; - add_movimento_magazzino($idarticolo, $new_qta, ['idddt' => $id_record]); - } - - flash()->info(tr('Riga modificata!')); - - // Ricalcolo inps, ritenuta e bollo - if ($dir == 'entrata') { - ricalcola_costiagg_ddt($id_record); - } else { - ricalcola_costiagg_ddt($id_record); - } - } - } - aggiorna_sedi_movimenti('ddt', $id_record); - break; - // eliminazione ddt case 'delete': - // Se ci sono degli articoli collegati - $rs = $dbo->fetchArray('SELECT id, idarticolo FROM dt_righe_ddt WHERE idddt='.prepare($id_record)); + try { + $ddt->delete(); - foreach ($rs as $value) { - $non_rimovibili = seriali_non_rimuovibili('id_riga_ddt', $value['id'], $dir); - if (!empty($non_rimovibili)) { - flash()->error(tr('Alcuni serial number sono già stati utilizzati!')); + $dbo->query('DELETE FROM mg_movimenti WHERE idddt='.prepare($id_record)); - return; - } + flash()->info(tr('Ddt eliminato!')); + } catch (InvalidArgumentException $e) { + flash()->error(tr('Sono stati utilizzati alcuni serial number nel documento: impossibile procedere!')); } - for ($i = 0; $i < sizeof($rs); ++$i) { - if ($rs[$i]['idarticolo']) { - rimuovi_articolo_daddt($rs[$i]['idarticolo'], $id_record, $rs[$i]['id']); - } - } - - // Se delle righe sono state create da un ordine, devo riportare la quantità evasa nella tabella degli ordini - // al valore di prima, riaggiungendo la quantità che sto togliendo - $rs = $dbo->fetchArray('SELECT qta, descrizione, idarticolo, idordine, idiva FROM dt_righe_ddt WHERE idddt='.prepare($id_record).' AND idarticolo="0"'); - - // Rimpiazzo la quantità negli ordini - for ($i = 0; $i < sizeof($rs); ++$i) { - $dbo->query('UPDATE or_righe_ordini SET qta_evasa=qta_evasa-'.$rs[$i]['qta'].' WHERE descrizione='.prepare($rs[$i]['descrizione']).' AND idarticolo='.prepare($rs[$i]['idarticolo']).' AND idordine='.prepare($rs[$i]['idordine']).' AND idiva='.prepare($rs[$i]['idiva'])); - } - - $dbo->query('DELETE FROM dt_ddt WHERE id='.prepare($id_record)); - $dbo->query('DELETE FROM dt_righe_ddt WHERE idddt='.prepare($id_record)); - $dbo->query('DELETE FROM mg_movimenti WHERE idddt='.prepare($id_record)); - - //Aggiorno gli stati degli ordini - if (setting('Cambia automaticamente stato ordini fatturati')) { - for ($i = 0; $i < sizeof($rs); ++$i) { - $dbo->query('UPDATE or_ordini SET idstatoordine=(SELECT id FROM or_statiordine WHERE descrizione="'.get_stato_ordine($rs[$i]['idordine']).'") WHERE id = '.prepare($rs[$i]['idordine'])); - } - } - - flash()->info(tr('Ddt eliminato!')); - break; case 'add_serial': diff --git a/modules/ddt/crea_documento.php b/modules/ddt/crea_documento.php index 4813ca11e..2c54c8b8b 100644 --- a/modules/ddt/crea_documento.php +++ b/modules/ddt/crea_documento.php @@ -2,33 +2,24 @@ include_once __DIR__.'/../../core.php'; +use Modules\DDT\DDT; + +$documento = DDT::find($id_record); + $module = Modules::get($id_module); $final_module = $module['name'] == 'Ddt di vendita' ? 'Fatture di vendita' : 'Fatture di acquisto'; $dir = $module['name'] == 'Ddt di vendita' ? 'entrata' : 'uscita'; $options = [ - 'op' => 'add_ddt', - 'id_importazione' => 'id_ddt', - 'final_module' => $final_module, - 'original_module' => $module['name'], - 'sql' => [ - 'table' => 'dt_ddt', - 'rows' => 'dt_righe_ddt', - 'id_rows' => 'idddt', - ], - 'serials' => [ - 'id_riga' => 'id_riga_ddt', - 'condition' => '(id_riga_documento IS NOT NULL)', - ], + 'op' => 'add_documento', + 'type' => 'ddt', + 'module' => $final_module, + 'serials'=>true, 'button' => tr('Aggiungi'), 'dir' => $dir, 'create_document' => true, + 'documento' => $documento, ]; -$result = [ - 'id_record' => $id_record, - 'id_documento' => get('iddocumento'), -]; - -echo App::load('importa.php', $result, $options, true); +echo App::load('importa.php', [], $options, true); diff --git a/modules/ddt/row-add.php b/modules/ddt/row-add.php index 7a61ebb09..d85d01cf6 100644 --- a/modules/ddt/row-add.php +++ b/modules/ddt/row-add.php @@ -10,7 +10,7 @@ $dir = $documento->direzione; // Impostazioni per la gestione $options = [ - 'op' => 'addriga', + 'op' => 'manage_riga', 'action' => 'add', 'dir' => $documento->direzione, 'idanagrafica' => $documento['idanagrafica'], @@ -36,6 +36,8 @@ $result['idiva'] = $iva[0]['idiva'] ?: setting('Iva predefinita'); $file = 'riga'; if (get('is_descrizione') !== null) { $file = 'descrizione'; + + $options['op'] = 'manage_descrizione'; } elseif (get('is_articolo') !== null) { $file = 'articolo'; @@ -47,7 +49,7 @@ if (get('is_descrizione') !== null) { $result['tipo_sconto'] = 'PRC'; } - $options['op'] = 'addarticolo'; + $options['op'] = 'manage_articolo'; } elseif (get('is_sconto') !== null) { $file = 'sconto'; diff --git a/modules/ddt/row-edit.php b/modules/ddt/row-edit.php index abcfe3607..30c3a7681 100644 --- a/modules/ddt/row-edit.php +++ b/modules/ddt/row-edit.php @@ -9,7 +9,7 @@ $documento = DDT::find($id_record); // Impostazioni per la gestione $options = [ - 'op' => 'editriga', + 'op' => 'manage_riga', 'action' => 'edit', 'dir' => $documento->direzione, 'idanagrafica' => $documento['idanagrafica'], @@ -27,12 +27,17 @@ $result['prezzo'] = $riga->prezzo_unitario_vendita; $file = 'riga'; if ($riga->isDescrizione()) { $file = 'descrizione'; + + $options['op'] = 'manage_descrizione'; } elseif ($riga->isArticolo()) { $file = 'articolo'; + + $options['op'] = 'manage_articolo'; } elseif ($riga->isSconto()) { $file = 'sconto'; $options['op'] = 'manage_sconto'; } + echo App::load($file.'.php', $result, $options); diff --git a/modules/ddt/src/Components/Articolo.php b/modules/ddt/src/Components/Articolo.php index abb2fd4f9..00a10360b 100644 --- a/modules/ddt/src/Components/Articolo.php +++ b/modules/ddt/src/Components/Articolo.php @@ -47,8 +47,13 @@ class Articolo extends Article '_NUM_' => $numero, ]); + $partenza = $ddt->direzione == 'uscita' ? $ddt->idsede_destinazione : $ddt->idsede_partenza; + $arrivo = $ddt->direzione == 'uscita' ? $ddt->idsede_partenza : $ddt->idsede_destinazione; + $this->articolo->movimenta(-$qta, $movimento, $data, false, [ 'idddt' => $ddt->id, + 'idsede_azienda' => $partenza, + 'idsede_controparte' => $arrivo, ]); } diff --git a/modules/ddt/src/DDT.php b/modules/ddt/src/DDT.php index 79881d3a0..d0c1c1bb9 100644 --- a/modules/ddt/src/DDT.php +++ b/modules/ddt/src/DDT.php @@ -137,9 +137,9 @@ class DDT extends Document * * @param Description $trigger */ - public function controllo(Description $trigger) + public function fixStato(Description $trigger) { - parent::controllo($trigger); + parent::fixStato($trigger); if (setting('Cambia automaticamente stato ddt fatturati')) { $righe = $this->getRighe(); diff --git a/modules/fatture/actions.php b/modules/fatture/actions.php index 84ec92739..816cafe4c 100644 --- a/modules/fatture/actions.php +++ b/modules/fatture/actions.php @@ -32,7 +32,6 @@ switch (post('op')) { $fattura = Fattura::build($anagrafica, $tipo, $data, $id_segment); $id_record = $fattura->id; - aggiorna_sedi_movimenti('documenti', $id_record); flash()->info(tr('Aggiunta fattura numero _NUM_!', [ '_NUM_' => $fattura->numero, ])); @@ -151,48 +150,20 @@ switch (post('op')) { // eliminazione documento case 'delete': - $rs = $dbo->fetchArray('SELECT id FROM co_righe_documenti WHERE iddocumento='.prepare($id_record)); + try { + $fattura->delete(); - // Controllo sui seriali - foreach ($rs as $r) { - $non_rimovibili = seriali_non_rimuovibili('id_riga_documento', $r['id'], $dir); - if (!empty($non_rimovibili)) { - flash()->error(tr('Alcuni serial number sono già stati utilizzati!')); + $dbo->query('DELETE FROM co_scadenziario WHERE iddocumento='.prepare($id_record)); + $dbo->query('DELETE FROM co_movimenti WHERE iddocumento='.prepare($id_record)); - return; - } + // Azzeramento collegamento della rata contrattuale alla pianificazione + $dbo->query('UPDATE co_ordiniservizio_pianificazionefatture SET iddocumento=0 WHERE iddocumento='.prepare($id_record)); + + flash()->info(tr('Fattura eliminata!')); + } catch (InvalidArgumentException $e) { + flash()->error(tr('Sono stati utilizzati alcuni serial number nel documento: impossibile procedere!')); } - // Rimozione righe - foreach ($rs as $r) { - rimuovi_riga_fattura($id_record, $r['id'], $dir); - } - - // Se ci sono dei preventivi collegati li rimetto nello stato "In attesa di pagamento" - $rs = $dbo->fetchArray('SELECT idpreventivo FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).' AND idpreventivo IS NOT NULL'); - for ($i = 0; $i < sizeof($rs); ++$i) { - $dbo->query("UPDATE co_preventivi SET idstato=(SELECT id FROM co_statipreventivi WHERE descrizione='In lavorazione') WHERE id=".prepare($rs[$i]['idpreventivo'])); - $dbo->query('UPDATE co_righe_preventivi SET qta_evasa=0 WHERE idpreventivo='.prepare($rs[$i]['idpreventivo'])); - } - - // Se ci sono degli interventi collegati li rimetto nello stato "Completato" - $rs = $dbo->fetchArray('SELECT idintervento FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).' AND idintervento IS NOT NULL'); - for ($i = 0; $i < sizeof($rs); ++$i) { - $dbo->query("UPDATE in_interventi SET idstatointervento = (SELECT idstatointervento FROM in_statiintervento WHERE descrizione = 'Completato') WHERE id=".prepare($rs[$i]['idintervento'])); - } - - elimina_scadenza($id_record); - elimina_movimento($id_record); - - $dbo->query('DELETE FROM co_documenti WHERE id='.prepare($id_record)); - $dbo->query('DELETE FROM co_scadenziario WHERE iddocumento='.prepare($id_record)); - $dbo->query('DELETE FROM co_movimenti WHERE iddocumento='.prepare($id_record)); - - // Azzeramento collegamento della rata contrattuale alla pianificazione - $dbo->query('UPDATE co_ordiniservizio_pianificazionefatture SET iddocumento=0 WHERE iddocumento='.prepare($id_record)); - - flash()->info(tr('Fattura eliminata!')); - break; // Duplicazione fattura @@ -360,15 +331,8 @@ switch (post('op')) { flash()->error(tr('Alcuni serial number sono già stati utilizzati!')); } - // Informazioni aggiuntive FE - $articolo->data_inizio_periodo = post('data_inizio_periodo') ?: null; - $articolo->data_fine_periodo = post('data_fine_periodo') ?: null; - $articolo->riferimento_amministrazione = post('riferimento_amministrazione'); - $articolo->tipo_cessione_prestazione = post('tipo_cessione_prestazione'); - $articolo->save(); - aggiorna_sedi_movimenti('documenti', $id_record); if (post('idriga') != null) { flash()->info(tr('Articolo modificato!')); } else { @@ -443,12 +407,6 @@ switch (post('op')) { $riga->qta = $qta; - // Informazioni aggiuntive FE - $riga->data_inizio_periodo = post('data_inizio_periodo') ?: null; - $riga->data_fine_periodo = post('data_fine_periodo') ?: null; - $riga->riferimento_amministrazione = post('riferimento_amministrazione'); - $riga->tipo_cessione_prestazione = post('tipo_cessione_prestazione'); - $riga->save(); if (post('idriga') != null) { @@ -486,37 +444,15 @@ switch (post('op')) { if (!empty($id_record) && post('idriga') !== null) { $idriga = post('idriga'); - // Lettura preventivi collegati - $query = 'SELECT iddocumento, idintervento FROM co_righe_documenti WHERE id='.prepare($idriga); - $rsp = $dbo->fetchArray($query); - $id_record = $rsp[0]['iddocumento']; - $idintervento = $rsp[0]['idintervento']; + $righe = $fattura->getRighe(); + $riga = $righe->find($id_riga); - // Ricalcolo inps, ritenuta e bollo - if ($dir == 'entrata') { - ricalcola_costiagg_fattura($id_record); - } else { - ricalcola_costiagg_fattura($id_record); + $righe_intervento = $righe->where('idintervento', $riga->idintervento); + foreach ($righe_intervento as $r) { + $r->delete(); } - // Lettura interventi collegati - // $query = 'SELECT id, idintervento FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).' AND idintervento IS NOT NULL'; - // $rs = $dbo->fetchArray($query); - - // Se ci sono degli interventi collegati li rimetto nello stato "Completato" - // for ($i = 0; $i < sizeof($rs); ++$i) { - $dbo->query("UPDATE in_interventi SET idstatointervento = (SELECT idstatointervento FROM in_statiintervento WHERE descrizione = 'Completato') WHERE id=".prepare($idintervento)); - - // Rimuovo dalla fattura gli articoli collegati all'intervento - $rs2 = $dbo->fetchArray('SELECT idarticolo FROM mg_articoli_interventi WHERE idintervento='.prepare($idintervento)); - for ($j = 0; $j < sizeof($rs2); ++$j) { - rimuovi_articolo_dafattura($rs[0]['idarticolo'], $id_record, $rs[0]['idrigadocumento']); - } - // } - - // rimuovo riga da co_righe_documenti - $query = 'DELETE FROM `co_righe_documenti` WHERE iddocumento='.prepare($id_record).' AND id='.prepare($idriga); - $dbo->query($query); + //$dbo->query("UPDATE in_interventi SET idstatointervento = (SELECT idstatointervento FROM in_statiintervento WHERE descrizione = 'Completato') WHERE id=".prepare($idintervento)); flash()->info(tr('Intervento _NUM_ rimosso!', [ '_NUM_' => $idintervento, @@ -524,131 +460,23 @@ switch (post('op')) { } break; - // Scollegamento articolo da documento - case 'unlink_articolo': - if (!empty($id_record)) { - $idriga = post('idriga'); - - if (!rimuovi_riga_fattura($id_record, $idriga, $dir)) { - flash()->error(tr('Alcuni serial number sono già stati utilizzati!')); - - return; - } - - // Ricalcolo inps, ritenuta e bollo - if ($dir == 'entrata') { - ricalcola_costiagg_fattura($id_record); - } else { - ricalcola_costiagg_fattura($id_record); - } - - aggiorna_sedi_movimenti('documenti', $id_record); - flash()->info(tr('Articolo rimosso!')); - } - break; - - // Scollegamento preventivo da documento - case 'unlink_preventivo': - if (post('idriga') !== null) { - $idriga = post('idriga'); - - // Lettura preventivi collegati - $query = 'SELECT iddocumento, idpreventivo, idarticolo, id, qta, descrizione FROM co_righe_documenti WHERE id='.prepare($idriga); - $rsp = $dbo->fetchArray($query); - $id_record = $rsp[0]['iddocumento']; - $idpreventivo = $rsp[0]['idpreventivo']; - $idarticolo = $rsp[0]['idarticolo']; - $qta = $rsp[0]['qta']; - - if (!empty($idarticolo)) { - rimuovi_articolo_dafattura($rsp[0]['idarticolo'], $id_record, $idriga); - } - - // Ripristino le quantità da evadere nel preventivo - $query = 'UPDATE co_righe_preventivi SET qta_evasa = qta_evasa - '.$rsp[0]['qta'].' WHERE idarticolo='.prepare($rsp[0]['idarticolo']).' AND descrizione='.prepare($rsp[0]['descrizione']).' AND idpreventivo = '.prepare($idpreventivo); - $dbo->query($query); - - $query = 'DELETE FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).' AND id='.prepare($idriga); - $dbo->query($query); - - $rs_righe = $dbo->fetchArray('SELECT * FROM co_righe_documenti WHERE idpreventivo='.prepare($idpreventivo)); - - if (empty($rs_righe)) { - // Se ci sono dei preventivi collegati li rimetto nello stato "In attesa di pagamento" - $dbo->query("UPDATE co_preventivi SET idstato=(SELECT id FROM co_statipreventivi WHERE descrizione='In lavorazione') WHERE id=".prepare($idpreventivo)); - - // Aggiorno anche lo stato degli interventi collegati ai preventivi - $dbo->query("UPDATE in_interventi SET idstatointervento = (SELECT idstatointervento FROM in_statiintervento WHERE descrizione = 'Completato') WHERE id_preventivo=".prepare($idpreventivo)); - } - - // Ricalcolo inps, ritenuta e bollo - if ($dir == 'entrata') { - ricalcola_costiagg_fattura($id_record); - } else { - ricalcola_costiagg_fattura($id_record); - } - - flash()->info(tr('Preventivo rimosso!')); - } - break; - - // Scollegamento contratto da documento - case 'unlink_contratto': - if (post('idriga') !== null) { - $idriga = post('idriga'); - - // Lettura contratti collegati - $query = 'SELECT iddocumento, idcontratto, idarticolo, id, qta, descrizione FROM co_righe_documenti WHERE id='.prepare($idriga); - $rsp = $dbo->fetchArray($query); - $id_record = $rsp[0]['iddocumento']; - $idcontratto = $rsp[0]['idcontratto']; - $idarticolo = $rsp[0]['idarticolo']; - - if (!empty($idarticolo)) { - rimuovi_articolo_dafattura($rsp[0]['idarticolo'], $id_record, $idriga); - } - - // Ripristino le quantità da evadere nel contratto - $query = 'UPDATE co_righe_contratti SET qta_evasa = qta_evasa - '.$rsp[0]['qta'].' WHERE idarticolo='.prepare($rsp[0]['idarticolo']).' AND descrizione='.prepare($rsp[0]['descrizione']).' AND idcontratto = '.prepare($idcontratto); - $dbo->query($query); - - $query = 'DELETE FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).' AND id='.prepare($idriga); - $dbo->query($query); - - $rs_righe = $dbo->fetchArray('SELECT * FROM co_righe_documenti WHERE idcontratto='.prepare($idcontratto)); - - if (empty($rs_righe)) { // Se ci sono dei preventivi collegati li rimetto nello stato "In attesa di pagamento" - $dbo->query("UPDATE co_contratti SET idstato=(SELECT id FROM co_staticontratti WHERE descrizione='In lavorazione') WHERE id=".prepare($idcontratto)); - - // Aggiorno anche lo stato degli interventi collegati ai contratti - $dbo->query("UPDATE in_interventi SET idstatointervento = (SELECT idstatointervento FROM in_statiintervento WHERE descrizione = 'Completato') WHERE id IN (SELECT idintervento FROM co_promemoria WHERE idcontratto=".prepare($idcontratto).')'); - - // Ricalcolo inps, ritenuta e bollo - if ($dir == 'entrata') { - ricalcola_costiagg_fattura($id_record); - } else { - ricalcola_costiagg_fattura($id_record); - } - - flash()->info(tr('Contratto rimosso!')); - } - } - break; - // Scollegamento riga generica da documento case 'unlink_riga': $id_riga = post('idriga'); if (!empty($id_riga)) { $riga = $fattura->getRighe()->find($id_riga); - $riga->delete(); - //rimuovi_riga_fattura($id_record, $idriga, $dir); + try { + $riga->delete(); - // Ricalcolo inps, ritenuta e bollo - ricalcola_costiagg_fattura($id_record); + // Ricalcolo inps, ritenuta e bollo + ricalcola_costiagg_fattura($id_record); - flash()->info(tr('Riga rimossa!')); + flash()->info(tr('Riga rimossa!')); + } catch (InvalidArgumentException $e) { + flash()->error(tr('Alcuni serial number sono già stati utilizzati!')); + } } break; @@ -673,32 +501,43 @@ switch (post('op')) { break; - // Aggiunta di un ordine in fattura - case 'add_ordine': - $ordine = \Modules\Ordini\Ordine::find(post('id_ordine')); + // Aggiunta di un documento in fattura + case 'add_documento': + $id_documento = post('id_documento'); + $type = post('type'); + + $movimenta = true; + if ($type == 'ordine') { + $documento = \Modules\Ordini\Ordine::find($id_documento); + } elseif ($type == 'ddt') { + $documento = \Modules\DDT\DDT::find($id_documento); + $movimenta = false; + } elseif ($type == 'preventivo') { + $documento = \Modules\Preventivi\Preventivo::find($id_documento); + } elseif ($type == 'contratto') { + $documento = \Modules\Contratti\Contratto::find($id_documento); + } // Creazione della fattura al volo if (post('create_document') == 'on') { $descrizione = ($dir == 'entrata') ? 'Fattura immediata di vendita' : 'Fattura immediata di acquisto'; $tipo = Tipo::where('descrizione', $descrizione)->first(); - $fattura = Fattura::build($ordine->anagrafica, $tipo, post('data'), post('id_segment')); - $fattura->idpagamento = $ordine->idpagamento; + $fattura = Fattura::build($documento->anagrafica, $tipo, post('data'), post('id_segment')); + $fattura->idpagamento = $documento->idpagamento; + $fattura->id_ritenuta_contributi = post('id_ritenuta_contributi') ?: null; $fattura->save(); $id_record = $fattura->id; } - $id_rivalsa_inps = setting('Percentuale rivalsa'); - if ($dir == 'uscita') { - $id_ritenuta_acconto = $fattura->anagrafica->id_ritenuta_acconto_acquisti; - } else { - $id_ritenuta_acconto = $fattura->anagrafica->id_ritenuta_acconto_vendite ?: setting("Percentuale ritenuta d'acconto"); - } - $calcolo_ritenuta_acconto = setting("Metodologia calcolo ritenuta d'acconto predefinito"); + $calcolo_ritenuta_acconto = post('calcolo_ritenuta_acconto') ?: null; + $id_ritenuta_acconto = post('id_ritenuta_acconto') ?: null; + $ritenuta_contributi = boolval(post('ritenuta_contributi')); + $id_rivalsa_inps = post('id_rivalsa_inps') ?: null; $id_conto = post('id_conto'); - $righe = $ordine->getRighe(); + $righe = $documento->getRighe(); foreach ($righe as $riga) { if (post('evadere')[$riga->id] == 'on') { $qta = post('qta_da_evadere')[$riga->id]; @@ -709,10 +548,13 @@ switch (post('op')) { $copia->calcolo_ritenuta_acconto = $calcolo_ritenuta_acconto; $copia->id_ritenuta_acconto = $id_ritenuta_acconto; $copia->id_rivalsa_inps = $id_rivalsa_inps; + $copia->ritenuta_contributi = $ritenuta_contributi; // Aggiornamento seriali dalla riga dell'ordine if ($copia->isArticolo()) { - $copia->movimenta($copia->qta); + if ($movimenta) { + $copia->movimenta($copia->qta); + } $serials = is_array(post('serial')[$riga->id]) ? post('serial')[$riga->id] : []; @@ -724,176 +566,27 @@ switch (post('op')) { } ricalcola_costiagg_fattura($id_record); - aggiorna_sedi_movimenti('documenti', $id_record); - flash()->info(tr('Ordine _NUM_ aggiunto!', [ - '_NUM_' => $ordine->numero, - ])); - - break; - - // Aggiunta di un ddt in fattura - case 'add_ddt': - $ddt = \Modules\DDT\DDT::find(post('id_ddt')); - - // Creazione della fattura al volo - if (post('create_document') == 'on') { - $descrizione = ($dir == 'entrata') ? 'Fattura differita di vendita' : 'Fattura differita di acquisto'; - $tipo = Tipo::where('descrizione', $descrizione)->first(); - - $fattura = Fattura::build($ddt->anagrafica, $tipo, post('data'), post('id_segment')); - $fattura->idpagamento = $ddt->idpagamento; - $fattura->save(); - - $id_record = $fattura->id; + $message = ''; + if ($type == 'ordine') { + $message = tr('Ordine _NUM_ aggiunto!', [ + '_NUM_' => $ordine->numero, + ]); + } elseif ($type == 'ddt') { + $message = tr('DDT _NUM_ aggiunto!', [ + '_NUM_' => $ordine->numero, + ]); + } elseif ($type == 'preventivo') { + $message = tr('Preventivo _NUM_ aggiunto!', [ + '_NUM_' => $ordine->numero, + ]); + } elseif ($type == 'contratto') { + $message = tr('Contratto _NUM_ aggiunto!', [ + '_NUM_' => $ordine->numero, + ]); } - $id_rivalsa_inps = setting('Percentuale rivalsa'); - if ($dir == 'uscita') { - $id_ritenuta_acconto = $fattura->anagrafica->id_ritenuta_acconto_acquisti; - } else { - $id_ritenuta_acconto = $fattura->anagrafica->id_ritenuta_acconto_vendite ?: setting("Percentuale ritenuta d'acconto"); - } - $calcolo_ritenuta_acconto = setting("Metodologia calcolo ritenuta d'acconto predefinito"); - $id_conto = post('id_conto'); - - $righe = $ddt->getRighe(); - foreach ($righe as $riga) { - if (post('evadere')[$riga->id] == 'on') { - $qta = post('qta_da_evadere')[$riga->id]; - - $copia = $riga->copiaIn($fattura, $qta); - $copia->id_conto = $id_conto; - - $copia->calcolo_ritenuta_acconto = $calcolo_ritenuta_acconto; - $copia->id_ritenuta_acconto = $id_ritenuta_acconto; - $copia->id_rivalsa_inps = $id_rivalsa_inps; - - // Aggiornamento seriali dalla riga dell'ordine - if ($copia->isArticolo()) { - $serials = is_array(post('serial')[$riga->id]) ? post('serial')[$riga->id] : []; - - $copia->serials = $serials; - } - - $copia->save(); - } - } - - ricalcola_costiagg_fattura($id_record); - aggiorna_sedi_movimenti('documenti', $id_record); - - flash()->info(tr('DDT _NUM_ aggiunto!', [ - '_NUM_' => $ddt->numero, - ])); - - break; - - // Aggiunta di un preventivo in fattura - case 'add_preventivo': - $preventivo = \Modules\Preventivi\Preventivo::find(post('id_preventivo')); - - // Creazione della fattura al volo - if (post('create_document') == 'on') { - $tipo = Tipo::where('descrizione', 'Fattura immediata di vendita')->first(); - - $fattura = Fattura::build($preventivo->anagrafica, $tipo, post('data'), post('id_segment')); - $fattura->idpagamento = $preventivo->idpagamento; - $fattura->save(); - - $id_record = $fattura->id; - } - - $id_rivalsa_inps = setting('Percentuale rivalsa'); - if ($dir == 'uscita') { - $id_ritenuta_acconto = $fattura->anagrafica->id_ritenuta_acconto_acquisti; - } else { - $id_ritenuta_acconto = $fattura->anagrafica->id_ritenuta_acconto_vendite ?: setting("Percentuale ritenuta d'acconto"); - } - $calcolo_ritenuta_acconto = setting("Metodologia calcolo ritenuta d'acconto predefinito"); - $id_conto = post('id_conto'); - - $righe = $preventivo->getRighe(); - foreach ($righe as $riga) { - if (post('evadere')[$riga->id] == 'on') { - $qta = post('qta_da_evadere')[$riga->id]; - - $copia = $riga->copiaIn($fattura, $qta); - $copia->id_conto = $id_conto; - - $copia->calcolo_ritenuta_acconto = $calcolo_ritenuta_acconto; - $copia->id_ritenuta_acconto = $id_ritenuta_acconto; - $copia->id_rivalsa_inps = $id_rivalsa_inps; - - // Aggiornamento seriali dalla riga dell'ordine - if ($copia->isArticolo()) { - $copia->movimenta($copia->qta); - } - - $copia->save(); - } - } - - ricalcola_costiagg_fattura($id_record); - aggiorna_sedi_movimenti('documenti', $id_record); - - flash()->info(tr('Preventivo _NUM_ aggiunto!', [ - '_NUM_' => $preventivo->numero, - ])); - - break; - - // Aggiunta di un contratto in fattura - case 'add_contratto': - $contratto = \Modules\Contratti\Contratto::find(post('id_contratto')); - - // Creazione della fattura al volo - if (post('create_document') == 'on') { - $tipo = Tipo::where('descrizione', 'Fattura immediata di vendita')->first(); - - $fattura = Fattura::build($contratto->anagrafica, $tipo, post('data'), post('id_segment')); - $fattura->idpagamento = $contratto->idpagamento; - $fattura->save(); - - $id_record = $fattura->id; - } - - $id_rivalsa_inps = setting('Percentuale rivalsa'); - if ($dir == 'uscita') { - $id_ritenuta_acconto = $fattura->anagrafica->id_ritenuta_acconto_acquisti; - } else { - $id_ritenuta_acconto = $fattura->anagrafica->id_ritenuta_acconto_vendite ?: setting("Percentuale ritenuta d'acconto"); - } - $calcolo_ritenuta_acconto = setting("Metodologia calcolo ritenuta d'acconto predefinito"); - $id_conto = post('id_conto'); - - $righe = $contratto->getRighe(); - foreach ($righe as $riga) { - if (post('evadere')[$riga->id] == 'on') { - $qta = post('qta_da_evadere')[$riga->id]; - - $copia = $riga->copiaIn($fattura, $qta); - $copia->id_conto = $id_conto; - - $copia->calcolo_ritenuta_acconto = $calcolo_ritenuta_acconto; - $copia->id_ritenuta_acconto = $id_ritenuta_acconto; - $copia->id_rivalsa_inps = $id_rivalsa_inps; - - // Aggiornamento seriali dalla riga dell'ordine - if ($copia->isArticolo()) { - $copia->movimenta($copia->qta); - } - - $copia->save(); - } - } - - ricalcola_costiagg_fattura($id_record); - aggiorna_sedi_movimenti('documenti', $id_record); - - flash()->info(tr('Contratto _NUM_ aggiunto!', [ - '_NUM_' => $contratto->numero, - ])); + flash()->info($message); break; diff --git a/modules/fatture/add_contratto.php b/modules/fatture/add_contratto.php index cf05c38f7..e834df5d8 100644 --- a/modules/fatture/add_contratto.php +++ b/modules/fatture/add_contratto.php @@ -2,34 +2,32 @@ include_once __DIR__.'/../../core.php'; -$module = Modules::get($id_module); +use Modules\Contratti\Contratto; +use Modules\Fatture\Fattura; + +$documento_finale = Fattura::find($id_record); +$dir = $documento_finale->direzione; + +$id_documento = get('id_documento'); +if (!empty($id_documento)) { + $documento = Contratto::find($id_documento); -if (get('op')) { $options = [ - 'op' => 'add_contratto', - 'id_importazione' => 'id_contratto', - 'final_module' => $module['name'], - 'original_module' => 'Contratti', - 'sql' => [ - 'table' => 'co_contratti', - 'rows' => 'co_righe_contratti', - 'id_rows' => 'idcontratto', - ], - 'serials' => false, + 'op' => 'add_documento', + 'type' => 'contratto', 'button' => tr('Aggiungi'), - 'dir' => 'entrata', + 'documento' => $documento, + 'documento_finale' => $documento_finale, ]; - $result = [ - 'id_record' => $id_record, - 'id_documento' => get('iddocumento'), - ]; - - echo App::load('importa.php', $result, $options, true); + echo App::load('importa.php', [], $options, true); return; } +$id_anagrafica = $documento_finale->idanagrafica; + +$_SESSION['superselect']['idanagrafica'] = $id_anagrafica; $_SESSION['superselect']['stato'] = 'is_fatturabile'; echo ' @@ -39,12 +37,8 @@ echo '
-
-
-

'.tr('Informazioni di importazione').'

-
-
-
+
+
@@ -56,30 +50,21 @@ echo ' '; diff --git a/modules/fatture/add_ddt.php b/modules/fatture/add_ddt.php index ba257f97b..859e7e45d 100644 --- a/modules/fatture/add_ddt.php +++ b/modules/fatture/add_ddt.php @@ -2,55 +2,41 @@ include_once __DIR__.'/../../core.php'; -$module = Modules::get($id_module); +use Modules\DDT\DDT; +use Modules\Fatture\Fattura; -$dir = ($module['name'] == 'Fatture di vendita') ? 'entrata' : 'uscita'; +$documento_finale = Fattura::find($id_record); +$dir = $documento_finale->direzione; + +$id_documento = get('id_documento'); +if (!empty($id_documento)) { + $documento = DDT::find($id_documento); -if (get('op')) { $options = [ - 'op' => 'add_ddt', - 'id_importazione' => 'id_ddt', - 'final_module' => $module['name'], - 'original_module' => $module['name'] == 'Fatture di vendita' ? 'Ddt di vendita' : 'Ddt di acquisto', - 'sql' => [ - 'table' => 'dt_ddt', - 'rows' => 'dt_righe_ddt', - 'id_rows' => 'idddt', - ], - 'serials' => [ - 'id_riga' => 'id_riga_ddt', - 'condition' => '(id_riga_documento IS NOT NULL)', - ], + 'op' => 'add_documento', + 'type' => 'ddt', + 'serials' => true, 'button' => tr('Aggiungi'), - 'dir' => $dir, + 'documento' => $documento, + 'documento_finale' => $documento_finale, ]; - $result = [ - 'id_record' => $id_record, - 'id_documento' => get('iddocumento'), - ]; - - echo App::load('importa.php', $result, $options, true); + echo App::load('importa.php', [], $options, true); return; } -$info = $dbo->fetchOne('SELECT * FROM co_documenti WHERE id='.prepare($id_record)); -$idanagrafica = $info['idanagrafica']; +$id_anagrafica = $documento_finale->idanagrafica; echo '
- {[ "type": "select", "label": "'.tr('Ddt').'", "name": "id_documento", "values": "query=SELECT dt_ddt.id, CONCAT(\'DDT num. \', IF(numero_esterno != \'\', numero_esterno, numero), \' del \', DATE_FORMAT(data, \'%d-%m-%Y\')) AS descrizione FROM dt_ddt WHERE idanagrafica='.prepare($idanagrafica).' AND idstatoddt IN (SELECT id FROM dt_statiddt WHERE descrizione IN(\'Bozza\', \'Evaso\', \'Parzialmente evaso\', \'Parzialmente fatturato\')) AND idtipoddt=(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) ORDER BY data DESC, numero DESC" ]} + {[ "type": "select", "label": "'.tr('Ddt').'", "name": "id_documento", "values": "query=SELECT dt_ddt.id, CONCAT(\'DDT num. \', IF(numero_esterno != \'\', numero_esterno, numero), \' del \', DATE_FORMAT(data, \'%d-%m-%Y\')) AS descrizione FROM dt_ddt WHERE idanagrafica='.prepare($id_anagrafica).' AND idstatoddt IN (SELECT id FROM dt_statiddt WHERE descrizione IN(\'Bozza\', \'Evaso\', \'Parzialmente evaso\', \'Parzialmente fatturato\')) AND idtipoddt=(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) ORDER BY data DESC, numero DESC" ]}
-
-
-

'.tr('Informazioni di importazione').'

-
-
-
+
+
@@ -62,30 +48,21 @@ echo ' '; diff --git a/modules/fatture/add_ordine.php b/modules/fatture/add_ordine.php index aed3f4db2..af49ae77f 100644 --- a/modules/fatture/add_ordine.php +++ b/modules/fatture/add_ordine.php @@ -2,55 +2,41 @@ include_once __DIR__.'/../../core.php'; -$module = Modules::get($id_module); +use Modules\Fatture\Fattura; +use Modules\Ordini\Ordine; -$dir = ($module['name'] == 'Fatture di vendita') ? 'entrata' : 'uscita'; +$documento_finale = Fattura::find($id_record); +$dir = $documento_finale->direzione; + +$id_documento = get('id_documento'); +if (!empty($id_documento)) { + $documento = Ordine::find($id_documento); -if (get('op')) { $options = [ - 'op' => 'add_ordine', - 'id_importazione' => 'id_ordine', - 'final_module' => $module['name'], - 'original_module' => $module['name'] == 'Fatture di vendita' ? 'Ordini cliente' : 'Ordini fornitore', - 'sql' => [ - 'table' => 'or_ordini', - 'rows' => 'or_righe_ordini', - 'id_rows' => 'idordine', - ], - 'serials' => [ - 'id_riga' => 'id_riga_ddt', - 'condition' => '(id_riga_documento IS NOT NULL)', - ], + 'op' => 'add_documento', + 'type' => 'ordine', + 'serials' => true, 'button' => tr('Aggiungi'), - 'dir' => $dir, + 'documento' => $documento, + 'documento_finale' => $documento_finale, ]; - $result = [ - 'id_record' => $id_record, - 'id_documento' => get('iddocumento'), - ]; - - echo App::load('importa.php', $result, $options, true); + echo App::load('importa.php', [], $options, true); return; } -$info = $dbo->fetchOne('SELECT * FROM co_documenti WHERE id='.prepare($id_record)); -$idanagrafica = $info['idanagrafica']; +$id_anagrafica = $documento_finale->idanagrafica; echo '
- {[ "type": "select", "label": "'.tr('Ordine').'", "name": "id_documento", "values": "query=SELECT or_ordini.id, CONCAT(IF(numero_esterno != \'\', numero_esterno, numero), \' del \', DATE_FORMAT(data, \'%d-%m-%Y\')) AS descrizione FROM or_ordini WHERE idanagrafica='.prepare($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).' LIMIT 0,1) AND or_ordini.id IN (SELECT idordine FROM or_righe_ordini WHERE or_righe_ordini.idordine = or_ordini.id AND (qta - qta_evasa) > 0) ORDER BY data DESC, numero DESC" ]} + {[ "type": "select", "label": "'.tr('Ordine').'", "name": "id_documento", "values": "query=SELECT or_ordini.id, CONCAT(IF(numero_esterno != \'\', numero_esterno, numero), \' del \', DATE_FORMAT(data, \'%d-%m-%Y\')) AS descrizione FROM or_ordini WHERE idanagrafica='.prepare($id_anagrafica).' 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).' LIMIT 0,1) AND or_ordini.id IN (SELECT idordine FROM or_righe_ordini WHERE or_righe_ordini.idordine = or_ordini.id AND (qta - qta_evasa) > 0) ORDER BY data DESC, numero DESC" ]}
-
-
-

'.tr('Informazioni di importazione').'

-
-
-
+
+
@@ -62,30 +48,21 @@ echo ' '; diff --git a/modules/fatture/add_preventivo.php b/modules/fatture/add_preventivo.php index dcc861fc6..82886a25f 100644 --- a/modules/fatture/add_preventivo.php +++ b/modules/fatture/add_preventivo.php @@ -2,34 +2,33 @@ include_once __DIR__.'/../../core.php'; -$module = Modules::get($id_module); +use Modules\Fatture\Fattura; +use Modules\Preventivi\Preventivo; + +$documento_finale = Fattura::find($id_record); +$dir = $documento_finale->direzione; + +$id_documento = get('id_documento'); +if (!empty($id_documento)) { + $documento = Preventivo::find($id_documento); -if (get('op')) { $options = [ - 'op' => 'add_preventivo', - 'id_importazione' => 'id_preventivo', - 'final_module' => $module['name'], - 'original_module' => 'Preventivi', - 'sql' => [ - 'table' => 'co_preventivi', - 'rows' => 'co_righe_preventivi', - 'id_rows' => 'idpreventivo', - ], - 'serials' => false, + 'op' => 'add_documento', + 'type' => 'preventivo', 'button' => tr('Aggiungi'), - 'dir' => 'entrata', + 'documento' => $documento, + 'documento_finale' => $documento_finale, ]; - $result = [ - 'id_record' => $id_record, - 'id_documento' => get('iddocumento'), - ]; - - echo App::load('importa.php', $result, $options, true); + echo App::load('importa.php', [], $options, true); return; } +$id_anagrafica = $documento_finale->idanagrafica; + +$_SESSION['superselect']['idanagrafica'] = $id_anagrafica; + echo '
@@ -37,12 +36,8 @@ echo '
-
-
-

'.tr('Informazioni di importazione').'

-
-
-
+
+
@@ -54,30 +49,21 @@ echo ' '; diff --git a/modules/fatture/modutil.php b/modules/fatture/modutil.php index e521e0ff1..83c5553bf 100755 --- a/modules/fatture/modutil.php +++ b/modules/fatture/modutil.php @@ -554,225 +554,3 @@ function add_articolo_infattura($iddocumento, $idarticolo, $descrizione, $idiva, return $idriga; } - -/** - * Questa funzione rimuove un articolo dalla fattura data e lo riporta in magazzino nel primo lotto libero - * a partire dal lotto più vecchio - * $idarticolo integer codice dell'articolo da scollegare dalla fattura - * $iddocumento integer codice della fattura da cui scollegare l'articolo. - */ -function rimuovi_articolo_dafattura($idarticolo, $iddocumento, $idrigadocumento) -{ - global $dir; - - $dbo = database(); - - // Leggo la quantità di questo articolo in fattura - $query = 'SELECT qta, idintervento, idpreventivo, idordine, idddt, subtotale, descrizione FROM co_righe_documenti WHERE id='.prepare($idrigadocumento); - $rs = $dbo->fetchArray($query); - $idintervento = $rs[0]['idintervento']; - $idpreventivo = $rs[0]['idpreventivo']; - $idddt = $rs[0]['idddt']; - $idordine = $rs[0]['idordine']; - $qta = $rs[0]['qta']; - $subtotale = $rs[0]['subtotale']; - - $descrizione = $rs[0]['descrizione']; - - $lotto = $rs[0]['lotto']; - $serial = $rs[0]['serial']; - $altro = $rs[0]['altro']; - - $non_rimovibili = seriali_non_rimuovibili('id_riga_documento', $idrigadocumento, $dir); - if (!empty($non_rimovibili)) { - return false; - } - - // Se l'articolo è stato aggiunto in fattura perché era collegato ad un intervento o - // preventivo o ddt o ordine non devo riportarlo in magazzino quando lo tolgo dalla fattura, perché - // se lo scollegassi poi anche dall'intervento aggiungerei in magazzino la quantità 2 volte!! - if ($qta > 0) { - if (empty($idintervento) && empty($idddt)) { - // Fatture di vendita - if ($dir == 'entrata') { - add_movimento_magazzino($idarticolo, $qta, ['iddocumento' => $iddocumento]); - } - - // Fatture di acquisto - else { - add_movimento_magazzino($idarticolo, -$qta, ['iddocumento' => $iddocumento]); - } - } - - // TODO: possibile ambiguità tra righe molto simili tra loro - // Se l'articolo è stato inserito in fattura tramite un ddt devo sanare la qta_evasa - if (!empty($idddt)) { - $dbo->query('UPDATE dt_righe_ddt SET qta_evasa=qta_evasa-'.$qta.' WHERE qta='.prepare($qta).' AND idarticolo='.prepare($idarticolo).' AND idddt='.prepare($idddt)); - } - - // TODO: possibile ambiguità tra righe molto simili tra loro - // Se l'articolo è stato inserito in fattura tramite un ordine devo sanare la qta_evasa - if (!empty($idordine)) { - $dbo->query('UPDATE or_righe_ordini SET qta_evasa=qta_evasa-'.$qta.' WHERE qta='.prepare($qta).' AND idarticolo='.prepare($idarticolo).' AND idordine='.prepare($idordine)); - } - } - - // Elimino la riga dal documento - $dbo->query('DELETE FROM `co_righe_documenti` WHERE id='.prepare($idrigadocumento).' AND iddocumento='.prepare($iddocumento)); - - // Aggiorno lo stato dell'ordine - if (setting('Cambia automaticamente stato ordini fatturati') && !empty($idordine)) { - $dbo->query('UPDATE or_ordini SET idstatoordine=(SELECT id FROM or_statiordine WHERE descrizione="'.get_stato_ordine($idordine).'") WHERE id = '.prepare($idordine)); - } - - // Aggiorno lo stato del ddt - if (setting('Cambia automaticamente stato ddt fatturati') && !empty($idddt)) { - $dbo->query('UPDATE dt_ddt SET idstatoddt=(SELECT id FROM dt_statiddt WHERE descrizione="'.get_stato_ddt($idddt).'") WHERE id = '.prepare($idddt)); - } - - // Elimino i movimenti avvenuti nel magazzino per questo articolo lotto, serial, altro - $dbo->query('DELETE FROM `mg_movimenti` WHERE idarticolo = '.prepare($idarticolo).' AND iddocumento = '.prepare($iddocumento).' AND id = '.prepare($idrigadocumento)); - - // Elimino i seriali utilizzati dalla riga - $dbo->query('DELETE FROM `mg_prodotti` WHERE id_articolo = '.prepare($idarticolo).' AND id_riga_documento = '.prepare($idrigadocumento)); - - return true; -} - -function rimuovi_riga_fattura($id_documento, $id_riga, $dir) -{ - $dbo = database(); - - // Leggo la quantità di questo articolo in fattura - $riga = $dbo->fetchOne('SELECT * FROM co_righe_documenti WHERE id='.prepare($id_riga)); - - $non_rimovibili = seriali_non_rimuovibili('id_riga_documento', $id_riga, $dir); - if (!empty($non_rimovibili)) { - return false; - } - - $serials = $dbo->fetchArray('SELECT serial FROM mg_prodotti WHERE serial IS NOT NULL AND id_riga_documento='.prepare($id_riga)); - - // Elimino la riga dal documento - $dbo->query('DELETE FROM `co_righe_documenti` WHERE id='.prepare($id_riga).' AND iddocumento='.prepare($id_documento)); - - if (empty($riga['qta'])) { - return true; - } - - // Operazioni per la rimozione degli articoli - if (!empty($riga['idarticolo'])) { - // Movimentazione articoli se da interventi o ddt - if (empty($riga['idintervento']) && empty($riga['idddt'])) { - add_movimento_magazzino($riga['idarticolo'], ($dir == 'entrata') ? $riga['qta'] : -$riga['qta'], ['iddocumento' => $id_documento]); - } - - // Se l'articolo è stato inserito in fattura tramite un preventivo devo sanare la qta_evasa - if (!empty($riga['idpreventivo'])) { - $dbo->query('UPDATE co_righe_preventivi SET qta_evasa=qta_evasa-'.$riga['qta'].' WHERE qta='.prepare($riga['qta']).' AND idarticolo='.prepare($riga['idarticolo']).' AND idpreventivo='.prepare($riga['idpreventivo']).' AND qta_evasa > 0 LIMIT 1'); - } - - // Se l'articolo è stato inserito in fattura tramite un ddt devo sanare la qta_evasa - if (!empty($riga['idddt'])) { - $dbo->query('UPDATE dt_righe_ddt SET qta_evasa=qta_evasa-'.$riga['qta'].' WHERE qta='.prepare($riga['qta']).' AND idarticolo='.prepare($riga['idarticolo']).' AND idddt='.prepare($riga['idddt']).' AND qta_evasa > 0 LIMIT 1'); - } - - // Se l'articolo è stato inserito in fattura tramite un ordine devo sanare la qta_evasa - elseif (!empty($riga['idordine'])) { - $dbo->query('UPDATE or_righe_ordini SET qta_evasa=qta_evasa-'.$riga['qta'].' WHERE qta='.prepare($riga['qta']).' AND idarticolo='.prepare($riga['idarticolo']).' AND idordine='.prepare($riga['idordine']).' AND qta_evasa > 0 LIMIT 1'); - } - } - - // Nota di credito - if (!empty($riga['ref_riga_documento'])) { - $dbo->query('UPDATE co_righe_documenti SET qta_evasa = qta_evasa+'.$riga['qta'].' WHERE id='.prepare($riga['ref_riga_documento'])); - - if (!empty($riga['idarticolo'])) { - $serials = array_column($serials, 'serial'); - $serials = array_clean($serials); - - $dbo->attach('mg_prodotti', ['id_riga_documento' => $riga['ref_riga_documento'], 'dir' => $dir, 'id_articolo' => $riga['idarticolo']], ['serial' => $serials]); - } - } - - // Rimozione articoli collegati ad un preventivo importato con riga unica - if (empty($riga['idarticolo']) && $riga['idpreventivo']) { - //rimetto a magazzino gli articoli collegati al preventivo - $rsa = $dbo->fetchArray('SELECT id, idarticolo, qta FROM co_righe_preventivi WHERE idpreventivo = '.prepare($riga['idpreventivo'])); - for ($i = 0; $i < sizeof($rsa); ++$i) { - if ($riga['is_preventivo']) { - if (!empty($rsa[$i]['idarticolo'])) { - add_movimento_magazzino($rsa[$i]['idarticolo'], $rsa[$i]['qta'], ['iddocumento' => $id_documento]); - } - } else { - $qta_evasa = $rsa[$i]['qta_evasa'] + $riga['qta']; - // Ripristino le quantità da evadere nel preventivo - $dbo->update('co_righe_preventivi', - [ - 'qta_evasa' => $qta_evasa, - ], - [ - 'id' => $rsa[$i]['id'], - ] - ); - } - } - } - - // Rimozione articoli collegati ad un contratto importato con riga unica - if (empty($riga['idarticolo']) && $riga['idcontratto']) { - //rimetto a magazzino gli articoli collegati al contratto - $rsa = $dbo->fetchArray('SELECT id, idarticolo, qta FROM co_righe_contratti WHERE idcontratto = '.prepare($riga['idcontratto'])); - for ($i = 0; $i < sizeof($rsa); ++$i) { - if ($riga['is_contratto']) { - if (!empty($rsa[$i]['idarticolo'])) { - add_movimento_magazzino($rsa[$i]['idarticolo'], $rsa[$i]['qta'], ['iddocumento' => $id_documento]); - } - } else { - $qta_evasa = $rsa[$i]['qta_evasa'] + $riga['qta']; - // Ripristino le quantità da evadere nel contratto - $dbo->update('co_righe_contratti', - [ - 'qta_evasa' => $qta_evasa, - ], - [ - 'id' => $rsa[$i]['id'], - ] - ); - } - } - } - - //Rimozione righe generiche - if (empty($riga['idarticolo'])) { - // TODO: possibile ambiguità tra righe molto simili tra loro - // Se l'articolo è stato inserito in fattura tramite un ddt devo sanare la qta_evasa - if (!empty($riga['idddt'])) { - $dbo->query('UPDATE dt_righe_ddt SET qta_evasa=qta_evasa-'.$riga['qta'].' WHERE qta='.prepare($riga['qta']).' AND descrizione='.prepare($riga['descrizione']).' AND idddt='.prepare($riga['idddt'])); - } - - // TODO: possibile ambiguità tra righe molto simili tra loro - // Se l'articolo è stato inserito in fattura tramite un ordine devo sanare la qta_evasa - if (!empty($riga['idordine'])) { - $dbo->query('UPDATE or_righe_ordini SET qta_evasa=qta_evasa-'.$riga['qta'].' WHERE qta='.prepare($riga['qta']).' AND descrizione='.prepare($riga['descrizione']).' AND idordine='.prepare($riga['idordine'])); - } - } - - // Aggiorno lo stato dell'ordine - if (!empty($riga['idordine']) && setting('Cambia automaticamente stato ordini fatturati')) { - $dbo->query('UPDATE or_ordini SET idstatoordine = (SELECT id FROM or_statiordine WHERE descrizione = '.prepare(get_stato_ordine($riga['idordine'])).') WHERE id = '.prepare($riga['idordine'])); - } - - // Aggiorno lo stato del ddt - if (!empty($riga['idddt']) && setting('Cambia automaticamente stato ddt fatturati')) { - $dbo->query('UPDATE dt_ddt SET idstatoddt = (SELECT id FROM dt_statiddt WHERE descrizione = '.prepare(get_stato_ddt($riga['idddt'])).') WHERE id = '.prepare($riga['idddt'])); - } - - // Elimino i movimenti avvenuti nel magazzino per questo articolo lotto, serial, altro - $dbo->query('DELETE FROM `mg_movimenti` WHERE idarticolo = '.prepare($riga['idarticolo']).' AND iddocumento = '.prepare($id_documento).' AND id = '.prepare($id_riga)); - - // Elimino i seriali utilizzati dalla riga - $dbo->query('DELETE FROM `mg_prodotti` WHERE id_articolo = '.prepare($riga['idarticolo']).' AND id_riga_documento = '.prepare($id_riga)); - - return true; -} diff --git a/modules/fatture/row-list.php b/modules/fatture/row-list.php index f9c5a6fdb..22bea83ef 100644 --- a/modules/fatture/row-list.php +++ b/modules/fatture/row-list.php @@ -37,26 +37,18 @@ foreach ($righe as $row) { $extra = ''; + $delete = 'unlink_riga'; + // Articoli if ($row->isArticolo()) { $riga['descrizione'] = (!empty($row->articolo) ? $row->articolo->codice.' - ' : '').$riga['descrizione']; - $delete = 'unlink_articolo'; - // Preventivi - if (!empty($riga['idpreventivo'])) { - $delete = 'unlink_preventivo'; - } - // Contratti - elseif (!empty($riga['idcontratto'])) { - $delete = 'unlink_contratto'; - } - $extra = ''; $mancanti = 0; } // Intervento - elseif (!empty($riga['idintervento'])) { + if (!empty($riga['idintervento'])) { $intervento = $dbo->fetchOne('SELECT num_item,codice_cig,codice_cup,id_documento_fe FROM in_interventi WHERE id = '.prepare($riga['idintervento'])); $riga['num_item'] = $intervento['num_item']; $riga['codice_cig'] = $intervento['codice_cig']; @@ -72,8 +64,6 @@ foreach ($righe as $row) { $riga['codice_cig'] = $preventivo['codice_cig']; $riga['codice_cup'] = $preventivo['codice_cup']; $riga['id_documento_fe'] = $preventivo['id_documento_fe']; - - $delete = 'unlink_preventivo'; } // Contratti elseif (!empty($riga['idcontratto'])) { @@ -82,8 +72,6 @@ foreach ($righe as $row) { $riga['codice_cig'] = $contratto['codice_cig']; $riga['codice_cup'] = $contratto['codice_cup']; $riga['id_documento_fe'] = $contratto['id_documento_fe']; - - $delete = 'unlink_contratto'; } // Ordini (IDDOCUMENTO,CIG,CUP) elseif (!empty($riga['idordine'])) { @@ -92,12 +80,6 @@ foreach ($righe as $row) { $riga['codice_cig'] = $ordine['codice_cig']; $riga['codice_cup'] = $ordine['codice_cup']; $riga['id_documento_fe'] = $ordine['id_documento_fe']; - - $delete = 'unlink_riga'; - } - // Righe generiche - else { - $delete = 'unlink_riga'; } // Individuazione dei seriali @@ -253,7 +235,7 @@ foreach ($righe as $row) {
- "; + "; if ($row->isArticolo()) { echo " diff --git a/modules/fatture/src/Components/Articolo.php b/modules/fatture/src/Components/Articolo.php index f8c1df202..89d296df3 100644 --- a/modules/fatture/src/Components/Articolo.php +++ b/modules/fatture/src/Components/Articolo.php @@ -52,8 +52,13 @@ class Articolo extends Article '_NUM_' => $numero, ]); + $partenza = $fattura->direzione == 'uscita' ? $fattura->idsede_destinazione : $fattura->idsede_partenza; + $arrivo = $fattura->direzione == 'uscita' ? $fattura->idsede_partenza : $fattura->idsede_destinazione; + $this->articolo->movimenta(-$qta, $movimento, $data, false, [ 'iddocumento' => $fattura->id, + 'idsede_azienda' => $partenza, + 'idsede_controparte' => $arrivo, ]); } diff --git a/modules/fatture/src/Components/RelationTrait.php b/modules/fatture/src/Components/RelationTrait.php index 5d4cf27be..8b0c5be2f 100644 --- a/modules/fatture/src/Components/RelationTrait.php +++ b/modules/fatture/src/Components/RelationTrait.php @@ -162,6 +162,17 @@ trait RelationTrait return parent::save($options); } + public function delete() + { + $result = parent::delete(); + + if (!empty($this->idintervento)) { + database()->query("UPDATE in_interventi SET idstatointervento = (SELECT idstatointervento FROM in_statiintervento WHERE descrizione = 'Completato') WHERE id=".prepare($this->idintervento)); + } + + return $result; + } + /** * Effettua i conti per la Rivalsa INPS. */ diff --git a/modules/fatture/src/Fattura.php b/modules/fatture/src/Fattura.php index 6a45cb9e3..2154caebf 100644 --- a/modules/fatture/src/Fattura.php +++ b/modules/fatture/src/Fattura.php @@ -441,6 +441,16 @@ class Fattura extends Document return parent::save($options); } + public function delete() + { + $result = parent::delete(); + + $this->rimuoviScadenze(); + elimina_movimento($this->id); + + return $result; + } + /** * Restituisce l'elenco delle note di credito collegate. * diff --git a/modules/ordini/actions.php b/modules/ordini/actions.php index c93ad0bad..136dd21cb 100644 --- a/modules/ordini/actions.php +++ b/modules/ordini/actions.php @@ -2,6 +2,7 @@ include_once __DIR__.'/../../core.php'; +use Modules\Articoli\Articolo as ArticoloOriginale; use Modules\Anagrafiche\Anagrafica; use Modules\Ordini\Components\Articolo; use Modules\Ordini\Components\Descrizione; @@ -108,68 +109,35 @@ switch (post('op')) { break; - case 'addarticolo': - if (post('idarticolo') !== null) { - $idarticolo = post('idarticolo'); - $idiva = post('idiva'); - $descrizione = post('descrizione'); - $qta = post('qta'); - $prezzo = post('prezzo'); - - // Calcolo dello sconto - $sconto_unitario = post('sconto'); - $tipo_sconto = post('tipo_sconto'); - $sconto = calcola_sconto([ - 'sconto' => $sconto_unitario, - 'prezzo' => $prezzo, - 'tipo' => $tipo_sconto, - 'qta' => $qta, - ]); - - add_articolo_inordine($id_record, $idarticolo, $descrizione, $idiva, $qta, post('um'), $prezzo * $qta, $sconto, $sconto_unitario, $tipo_sconto); - - flash()->info(tr('Articolo aggiunto!')); + case 'manage_articolo': + if (post('idriga') != null) { + $articolo = Articolo::find(post('idriga')); + } else { + $originale = ArticoloOriginale::find(post('idarticolo')); + $articolo = Articolo::build($ordine, $originale); } - ricalcola_costiagg_ordine($id_record); + $articolo->descrizione = post('descrizione'); + $articolo->um = post('um') ?: null; + $articolo->id_iva = post('idiva'); - break; + $articolo->prezzo_unitario_acquisto = post('prezzo_acquisto') ?: 0; + $articolo->prezzo_unitario_vendita = post('prezzo'); + $articolo->sconto_unitario = post('sconto'); + $articolo->tipo_sconto = post('tipo_sconto'); - case 'addriga': - // Selezione costi da intervento - $descrizione = post('descrizione'); - $prezzo = post('prezzo'); - $qta = post('qta'); - $idiva = post('idiva'); - $um = post('um'); - $subtot = $prezzo * $qta; + try { + $articolo->qta = post('qta'); + } catch (UnexpectedValueException $e) { + flash()->error(tr('Alcuni serial number sono già stati utilizzati!')); + } - // Calcolo dello sconto - $sconto_unitario = post('sconto'); - $tipo_sconto = post('tipo_sconto'); - $sconto = calcola_sconto([ - 'sconto' => $sconto_unitario, - 'prezzo' => $prezzo, - 'tipo' => $tipo_sconto, - 'qta' => $qta, - ]); + $articolo->save(); - // Calcolo iva - $query = 'SELECT descrizione, percentuale, indetraibile FROM co_iva WHERE id='.prepare($idiva); - $rs = $dbo->fetchArray($query); - $iva = ($subtot - $sconto) / 100 * $rs[0]['percentuale']; - $iva_indetraibile = $iva / 100 * $rs[0]['indetraibile']; - - $query = 'INSERT INTO or_righe_ordini(idordine, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, is_descrizione, `order`) VALUES('.prepare($id_record).', '.prepare($idiva).', '.prepare($rs[0]['descrizione']).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).', '.prepare($um).', '.prepare($qta).', '.prepare(empty($qta)).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM or_righe_ordini AS t WHERE idordine='.prepare($id_record).'))'; - $dbo->query($query); - - // Messaggi informativi - if (!empty($idarticolo)) { - flash()->info(tr('Articolo aggiunto!')); - } elseif (!empty($qta)) { - flash()->info(tr('Riga aggiunta!')); + if (post('idriga') != null) { + flash()->info(tr('Articolo modificato!')); } else { - flash()->info(tr('Riga descrittiva aggiunta!')); + flash()->info(tr('Articolo aggiunto!')); } // Ricalcolo inps, ritenuta e bollo @@ -177,6 +145,82 @@ switch (post('op')) { break; + case 'manage_sconto': + if (post('idriga') != null) { + $sconto = Sconto::find(post('idriga')); + } else { + $sconto = Sconto::build($ordine); + } + + $sconto->descrizione = post('descrizione'); + $sconto->id_iva = post('idiva'); + + $sconto->sconto_unitario = post('sconto_unitario'); + $sconto->tipo_sconto = 'UNT'; + + $sconto->save(); + + if (post('idriga') != null) { + flash()->info(tr('Sconto/maggiorazione modificato!')); + } else { + flash()->info(tr('Sconto/maggiorazione aggiunto!')); + } + + // Ricalcolo inps, ritenuta e bollo + ricalcola_costiagg_ordine($id_record); + + break; + + case 'manage_riga': + if (post('idriga') != null) { + $riga = Riga::find(post('idriga')); + } else { + $riga = Riga::build($ordine); + } + + $riga->descrizione = post('descrizione'); + $riga->um = post('um') ?: null; + $riga->id_iva = post('idiva'); + + $riga->prezzo_unitario_acquisto = post('prezzo_acquisto') ?: 0; + $riga->prezzo_unitario_vendita = post('prezzo'); + $riga->sconto_unitario = post('sconto'); + $riga->tipo_sconto = post('tipo_sconto'); + + $riga->qta = post('qta'); + + $riga->save(); + + if (post('idriga') != null) { + flash()->info(tr('Riga modificata!')); + } else { + flash()->info(tr('Riga aggiunta!')); + } + + // Ricalcolo inps, ritenuta e bollo + ricalcola_costiagg_ordine($id_record); + + break; + + case 'manage_descrizione': + if (post('idriga') != null) { + $riga = Descrizione::find(post('idriga')); + } else { + $riga = Descrizione::build($ordine); + } + + $riga->descrizione = post('descrizione'); + + $riga->save(); + + if (post('idriga') != null) { + flash()->info(tr('Riga descrittiva modificata!')); + } else { + flash()->info(tr('Riga descrittiva aggiunta!')); + } + + break; + // Scollegamento articolo da ordine case 'unlink_articolo': $idarticolo = post('idarticolo'); @@ -223,92 +267,6 @@ switch (post('op')) { break; - case 'manage_sconto': - if (post('idriga') != null) { - $sconto = Sconto::find(post('idriga')); - } else { - $sconto = Sconto::build($ordine); - } - - $sconto->descrizione = post('descrizione'); - $sconto->id_iva = post('idiva'); - - $sconto->sconto_unitario = post('sconto_unitario'); - $sconto->tipo_sconto = 'UNT'; - - $sconto->save(); - - if (post('idriga') != null) { - flash()->info(tr('Sconto/maggiorazione modificato!')); - } else { - flash()->info(tr('Sconto/maggiorazione aggiunto!')); - } - - // Ricalcolo inps, ritenuta e bollo - ricalcola_costiagg_ordine($id_record); - - break; - - // Modifica riga - case 'editriga': - if (post('idriga') !== null) { - $idriga = post('idriga'); - $descrizione = post('descrizione'); - $prezzo = post('prezzo'); - $qta = post('qta'); - $idiva = post('idiva'); - $um = post('um'); - $subtot = $prezzo * $qta; - - // Calcolo dello sconto - $sconto_unitario = post('sconto'); - $tipo_sconto = post('tipo_sconto'); - $sconto = calcola_sconto([ - 'sconto' => $sconto_unitario, - 'prezzo' => $prezzo, - 'tipo' => $tipo_sconto, - 'qta' => $qta, - ]); - - // Lettura idarticolo dalla riga documento - $rs = $dbo->fetchArray('SELECT idordine, idarticolo, qta, abilita_serial, is_descrizione FROM or_righe_ordini WHERE id='.prepare($idriga)); - $idarticolo = $rs[0]['idarticolo']; - $old_qta = $rs[0]['qta']; - $idordine = $rs[0]['idordine']; - $abilita_serial = $rs[0]['abilita_serial']; - $is_descrizione = $rs[0]['is_descrizione']; - - // Controllo per gestire i serial - if (!empty($idarticolo)) { - if (!controlla_seriali('id_riga_ordine', $idriga, $old_qta, $qta, $dir)) { - flash()->error(tr('Alcuni serial number sono già stati utilizzati!')); - - return; - } - } - - // Calcolo iva - $query = 'SELECT * FROM co_iva WHERE id='.prepare($idiva); - $rs = $dbo->fetchArray($query); - $iva = ($subtot - $sconto) / 100 * $rs[0]['percentuale']; - $iva_indetraibile = $iva / 100 * $rs[0]['indetraibile']; - $desc_iva = $rs[0]['descrizione']; - - if ($is_descrizione == 0) { - // Modifica riga generica sul documento - $query = 'UPDATE or_righe_ordini SET idiva='.prepare($idiva).', desc_iva='.prepare($rs[0]['descrizione']).', iva='.prepare($iva).', iva_indetraibile='.prepare($iva_indetraibile).', descrizione='.prepare($descrizione).', subtotale='.prepare($subtot).', sconto='.prepare($sconto).', sconto_unitario='.prepare($sconto_unitario).', tipo_sconto='.prepare($tipo_sconto).', um='.prepare($um).', qta='.prepare($qta).' WHERE id='.prepare($idriga); - } else { - $query = 'UPDATE or_righe_ordini SET descrizione='.prepare($descrizione).' WHERE id='.prepare($idriga); - } - if ($dbo->query($query)) { - flash()->info(tr('Riga modificata!')); - - // Ricalcolo inps, ritenuta e bollo - ricalcola_costiagg_ordine($id_record); - } - } - break; - // eliminazione ordine case 'delete': // Se ci sono degli articoli collegati (ma non collegati a preventivi o interventi) li rimetto nel magazzino @@ -358,7 +316,7 @@ switch (post('op')) { // Aggiunta di un preventivo in ordine case 'add_preventivo': - $preventivo = \Modules\Preventivi\Preventivo::find(post('id_preventivo')); + $preventivo = \Modules\Preventivi\Preventivo::find(post('id_documento')); // Creazione della fattura al volo if (post('create_document') == 'on') { diff --git a/modules/ordini/crea_documento.php b/modules/ordini/crea_documento.php index 098096f88..ad155986e 100644 --- a/modules/ordini/crea_documento.php +++ b/modules/ordini/crea_documento.php @@ -2,38 +2,28 @@ include_once __DIR__.'/../../core.php'; -$module = Modules::get($id_module); +use Modules\Ordini\Ordine; + +$documento = Ordine::find($id_record); + +$module = Modules::get($documento->module); if (get('documento') == 'fattura') { $final_module = $module['name'] == 'Ordini cliente' ? 'Fatture di vendita' : 'Fatture di acquisto'; + $op = 'add_documento'; } else { $final_module = $module['name'] == 'Ordini cliente' ? 'Ddt di vendita' : 'Ddt di acquisto'; + $op = 'add_ordine'; } -$dir = $module['name'] == 'Ordini cliente' ? 'entrata' : 'uscita'; - $options = [ - 'op' => 'add_ordine', - 'id_importazione' => 'id_ordine', - 'final_module' => $final_module, - 'original_module' => $module['name'], - 'sql' => [ - 'table' => 'or_ordini', - 'rows' => 'or_righe_ordini', - 'id_rows' => 'idordine', - ], - 'serials' => [ - 'id_riga' => 'id_riga_ordine', - 'condition' => '(id_riga_ddt IS NOT NULL OR id_riga_documento IS NOT NULL)', - ], + 'op' => $op, + 'type' => 'ordine', + 'module' => $final_module, 'button' => tr('Aggiungi'), - 'dir' => $dir, 'create_document' => true, + 'serials' => true, + 'documento' => $documento, ]; -$result = [ - 'id_record' => $id_record, - 'id_documento' => get('iddocumento'), -]; - -echo App::load('importa.php', $result, $options, true); +echo App::load('importa.php', [], $options, true); diff --git a/modules/ordini/row-add.php b/modules/ordini/row-add.php index 4c4d6e337..6b3e04c81 100644 --- a/modules/ordini/row-add.php +++ b/modules/ordini/row-add.php @@ -10,7 +10,7 @@ $dir = $documento->direzione; // Impostazioni per la gestione $options = [ - 'op' => 'addriga', + 'op' => 'manage_riga', 'action' => 'add', 'dir' => $documento->direzione, 'idanagrafica' => $documento['idanagrafica'], @@ -36,6 +36,8 @@ $result['idiva'] = $iva[0]['idiva'] ?: setting('Iva predefinita'); $file = 'riga'; if (get('is_descrizione') !== null) { $file = 'descrizione'; + + $options['op'] = 'manage_descrizione'; } elseif (get('is_articolo') !== null) { $file = 'articolo'; @@ -47,7 +49,7 @@ if (get('is_descrizione') !== null) { $result['tipo_sconto'] = 'PRC'; } - $options['op'] = 'addarticolo'; + $options['op'] = 'manage_articolo'; } elseif (get('is_sconto') !== null) { $file = 'sconto'; diff --git a/modules/ordini/row-edit.php b/modules/ordini/row-edit.php index 74ef4b58d..fd043c341 100644 --- a/modules/ordini/row-edit.php +++ b/modules/ordini/row-edit.php @@ -9,7 +9,7 @@ $documento = Ordine::find($id_record); // Impostazioni per la gestione $options = [ - 'op' => 'editriga', + 'op' => 'manage_riga', 'action' => 'edit', 'dir' => $documento->direzione, 'idanagrafica' => $documento['idanagrafica'], @@ -27,8 +27,12 @@ $result['prezzo'] = $riga->prezzo_unitario_vendita; $file = 'riga'; if ($riga->isDescrizione()) { $file = 'descrizione'; + + $options['op'] = 'manage_descrizione'; } elseif ($riga->isArticolo()) { $file = 'articolo'; + + $options['op'] = 'manage_articolo'; } elseif ($riga->isSconto()) { $file = 'sconto'; diff --git a/modules/ordini/src/Ordine.php b/modules/ordini/src/Ordine.php index f9e29f8c1..1272a6597 100644 --- a/modules/ordini/src/Ordine.php +++ b/modules/ordini/src/Ordine.php @@ -128,9 +128,9 @@ class Ordine extends Document * * @param Description $trigger */ - public function controllo(Description $trigger) + public function fixStato(Description $trigger) { - parent::controllo($trigger); + parent::fixStato($trigger); if (setting('Cambia automaticamente stato ordini fatturati')) { $righe = $this->getRighe(); @@ -139,10 +139,12 @@ class Ordine extends Document $qta = $righe->sum('qta'); $parziale = $qta != $qta_evasa; + $stato_attuale = $this->stato; + // Impostazione del nuovo stato if ($qta_evasa == 0) { $descrizione = 'Bozza'; - } elseif ($trigger->parent instanceof DDT) { + } elseif (!in_array($stato_attuale->descrizione, ['Parzialmente fatturato', 'Fatturato']) && $trigger->parent instanceof DDT) { $descrizione = $parziale ? 'Parzialmente evaso' : 'Evaso'; } else { $descrizione = $parziale ? 'Parzialmente fatturato' : 'Fatturato'; diff --git a/modules/preventivi/crea_documento.php b/modules/preventivi/crea_documento.php index ac1c4a624..ab9cf99f2 100644 --- a/modules/preventivi/crea_documento.php +++ b/modules/preventivi/crea_documento.php @@ -2,26 +2,26 @@ include_once __DIR__.'/../../core.php'; -$module = Modules::get($id_module); +use Modules\Preventivi\Preventivo; + +$documento = Preventivo::find($id_record); + +if (get('documento') == 'fattura') { + $final_module = 'Fatture di vendita'; + $op = 'add_documento'; +} else { + $final_module = 'Ordini cliente'; + $op = 'add_preventivo'; +} $options = [ - 'op' => 'add_preventivo', - 'id_importazione' => 'id_preventivo', - 'final_module' => get('documento') == 'fattura' ? 'Fatture di vendita' : 'Ordini cliente', - 'original_module' => $module['name'], - 'sql' => [ - 'table' => 'co_preventivi', - 'rows' => 'co_righe_preventivi', - 'id_rows' => 'idpreventivo', - ], + 'op' => $op, + 'type' => 'preventivo', + 'module' => $final_module, 'button' => tr('Aggiungi'), 'dir' => 'entrata', 'create_document' => true, + 'documento' => $documento, ]; -$result = [ - 'id_record' => $id_record, - 'id_documento' => get('iddocumento'), -]; - -echo App::load('importa.php', $result, $options, true); +echo App::load('importa.php', [], $options, true); diff --git a/modules/preventivi/src/Preventivo.php b/modules/preventivi/src/Preventivo.php index 6bd3c8bf2..299f8fbcb 100644 --- a/modules/preventivi/src/Preventivo.php +++ b/modules/preventivi/src/Preventivo.php @@ -163,9 +163,9 @@ class Preventivo extends Document * * @param Description $trigger */ - public function controllo(Description $trigger) + public function fixStato(Description $trigger) { - parent::controllo($trigger); + parent::fixStato($trigger); $righe = $this->getRighe(); @@ -173,11 +173,13 @@ class Preventivo extends Document $qta = $righe->sum('qta'); $parziale = $qta != $qta_evasa; + $stato_attuale = $this->stato; + // Impostazione del nuovo stato if ($qta_evasa == 0) { $descrizione = 'In lavorazione'; $descrizione_intervento = 'Completato'; - } elseif ($trigger->parent instanceof Ordine) { + } elseif (!in_array($stato_attuale->descrizione, ['Parzialmente fatturato', 'Fatturato']) && $trigger->parent instanceof Ordine) { $descrizione = $this->stato->descrizione; $descrizione_intervento = 'Completato'; } else { diff --git a/update/2_4_11.sql b/update/2_4_11.sql index d727664ce..23660f482 100644 --- a/update/2_4_11.sql +++ b/update/2_4_11.sql @@ -28,10 +28,14 @@ ALTER TABLE `dt_righe_ddt` ADD `original_id` int(11), ADD `original_type` varcha ALTER TABLE `co_righe_contratti` ADD `abilita_serial` tinyint(1) NOT NULL DEFAULT '0'; ALTER TABLE `co_righe_preventivi` ADD `abilita_serial` tinyint(1) NOT NULL DEFAULT '0'; --- Collegamento Articoli -- -- Attenzione: da testare per il corretto aggiornamento dei dati. -- + +-- +-- Fatture +-- +-- Collegamento Articoli UPDATE `co_righe_documenti` INNER JOIN `or_righe_ordini` ON `co_righe_documenti`.`idordine` = `or_righe_ordini`.`idordine` AND `co_righe_documenti`.`descrizione` = `or_righe_ordini`.`descrizione` AND `co_righe_documenti`.`idarticolo` = `or_righe_ordini`.`idarticolo` SET `co_righe_documenti`.`original_id` = `or_righe_ordini`.`id`, `co_righe_documenti`.`original_type` = 'Modules\\Ordini\\Components\\Articolo' WHERE `co_righe_documenti`.`idarticolo` != 0; UPDATE `co_righe_documenti` INNER JOIN `dt_righe_ddt` ON `co_righe_documenti`.`idddt` = `dt_righe_ddt`.`idddt` AND `co_righe_documenti`.`descrizione` = `dt_righe_ddt`.`descrizione` AND `co_righe_documenti`.`idarticolo` = `dt_righe_ddt`.`idarticolo` SET `co_righe_documenti`.`original_id` = `dt_righe_ddt`.`id`, `co_righe_documenti`.`original_type` = 'Modules\\Ddt\\Components\\Articolo' WHERE `co_righe_documenti`.`idarticolo` != 0; @@ -67,6 +71,36 @@ UPDATE `co_righe_documenti` INNER JOIN `co_righe_contratti` ON `co_righe_documen UPDATE `co_righe_documenti` INNER JOIN `co_righe_preventivi` ON `co_righe_documenti`.`idpreventivo` = `co_righe_preventivi`.`idpreventivo` AND `co_righe_documenti`.`descrizione` = `co_righe_preventivi`.`descrizione` AND `co_righe_documenti`.`idarticolo` = `co_righe_preventivi`.`idarticolo` SET `co_righe_documenti`.`original_id` = `co_righe_preventivi`.`id`, `co_righe_documenti`.`original_type` = 'Modules\\Preventivi\\Components\\Riga' WHERE `co_righe_documenti`.`original_id` IS NULL; +-- +-- DDT +-- +-- Collegamento Articoli +UPDATE `dt_righe_ddt` INNER JOIN `or_righe_ordini` ON `dt_righe_ddt`.`idordine` = `or_righe_ordini`.`idordine` AND `dt_righe_ddt`.`descrizione` = `or_righe_ordini`.`descrizione` AND `dt_righe_ddt`.`idarticolo` = `or_righe_ordini`.`idarticolo` SET `dt_righe_ddt`.`original_id` = `or_righe_ordini`.`id`, `dt_righe_ddt`.`original_type` = 'Modules\\Ordini\\Components\\Articolo' WHERE `dt_righe_ddt`.`idarticolo` != 0; + +-- Collegamento Sconti +UPDATE `dt_righe_ddt` INNER JOIN `or_righe_ordini` ON `dt_righe_ddt`.`idordine` = `or_righe_ordini`.`idordine` AND `dt_righe_ddt`.`descrizione` = `or_righe_ordini`.`descrizione` AND `dt_righe_ddt`.`idarticolo` = `or_righe_ordini`.`idarticolo` SET `dt_righe_ddt`.`original_id` = `or_righe_ordini`.`id`, `dt_righe_ddt`.`original_type` = 'Modules\\Ordini\\Components\\Sconto' WHERE `dt_righe_ddt`.`is_sconto` != 0; + +-- Collegamento Descrizioni +UPDATE `dt_righe_ddt` INNER JOIN `or_righe_ordini` ON `dt_righe_ddt`.`idordine` = `or_righe_ordini`.`idordine` AND `dt_righe_ddt`.`descrizione` = `or_righe_ordini`.`descrizione` AND `dt_righe_ddt`.`idarticolo` = `or_righe_ordini`.`idarticolo` SET `dt_righe_ddt`.`original_id` = `or_righe_ordini`.`id`, `dt_righe_ddt`.`original_type` = 'Modules\\Ordini\\Components\\Descrizione' WHERE `dt_righe_ddt`.`is_descrizione` != 0; + +-- Collegamento Righe +UPDATE `dt_righe_ddt` INNER JOIN `or_righe_ordini` ON `dt_righe_ddt`.`idordine` = `or_righe_ordini`.`idordine` AND `dt_righe_ddt`.`descrizione` = `or_righe_ordini`.`descrizione` AND `dt_righe_ddt`.`idarticolo` = `or_righe_ordini`.`idarticolo` SET `dt_righe_ddt`.`original_id` = `or_righe_ordini`.`id`, `dt_righe_ddt`.`original_type` = 'Modules\\Ordini\\Components\\Riga' WHERE `dt_righe_ddt`.`original_id` IS NULL; + +-- +-- Ordini +-- +-- Collegamento Articoli +UPDATE `or_righe_ordini` INNER JOIN `co_righe_preventivi` ON `or_righe_ordini`.`idpreventivo` = `co_righe_preventivi`.`idpreventivo` AND `or_righe_ordini`.`descrizione` = `co_righe_preventivi`.`descrizione` AND `or_righe_ordini`.`idarticolo` = `co_righe_preventivi`.`idarticolo` SET `or_righe_ordini`.`original_id` = `co_righe_preventivi`.`id`, `or_righe_ordini`.`original_type` = 'Modules\\Preventivi\\Components\\Articolo' WHERE `or_righe_ordini`.`idarticolo` != 0; + +-- Collegamento Sconti +UPDATE `or_righe_ordini` INNER JOIN `co_righe_preventivi` ON `or_righe_ordini`.`idpreventivo` = `co_righe_preventivi`.`idpreventivo` AND `or_righe_ordini`.`descrizione` = `co_righe_preventivi`.`descrizione` AND `or_righe_ordini`.`idarticolo` = `co_righe_preventivi`.`idarticolo` SET `or_righe_ordini`.`original_id` = `co_righe_preventivi`.`id`, `or_righe_ordini`.`original_type` = 'Modules\\Preventivi\\Components\\Sconto' WHERE `or_righe_ordini`.`is_sconto` != 0; + +-- Collegamento Descrizioni +UPDATE `or_righe_ordini` INNER JOIN `co_righe_preventivi` ON `or_righe_ordini`.`idpreventivo` = `co_righe_preventivi`.`idpreventivo` AND `or_righe_ordini`.`descrizione` = `co_righe_preventivi`.`descrizione` AND `or_righe_ordini`.`idarticolo` = `co_righe_preventivi`.`idarticolo` SET `or_righe_ordini`.`original_id` = `co_righe_preventivi`.`id`, `or_righe_ordini`.`original_type` = 'Modules\\Preventivi\\Components\\Descrizione' WHERE `or_righe_ordini`.`is_descrizione` != 0; + +-- Collegamento Righe +UPDATE `or_righe_ordini` INNER JOIN `co_righe_preventivi` ON `or_righe_ordini`.`idpreventivo` = `co_righe_preventivi`.`idpreventivo` AND `or_righe_ordini`.`descrizione` = `co_righe_preventivi`.`descrizione` AND `or_righe_ordini`.`idarticolo` = `co_righe_preventivi`.`idarticolo` SET `or_righe_ordini`.`original_id` = `co_righe_preventivi`.`id`, `or_righe_ordini`.`original_type` = 'Modules\\Preventivi\\Components\\Riga' WHERE `or_righe_ordini`.`original_id` IS NULL; + -- Aggiunta foto utente ALTER TABLE `zz_users` ADD `image_file_id` int(11); UPDATE `zz_modules` SET `enabled` = 1 WHERE `name` = 'Utenti e permessi'; @@ -122,3 +156,16 @@ INSERT INTO `zz_segments` (`id`, `id_module`, `name`, `clause`, `position`, `pat -- Aggiunto codice cig e codice cup per ddt ALTER TABLE `dt_ddt` ADD `codice_cig` VARCHAR(15), ADD `codice_cup` VARCHAR(15) AFTER `codice_cig`, ADD `id_documento_fe` VARCHAR(20) AFTER `codice_cup`,ADD `num_item` VARCHAR(15) AFTER `id_documento_fe`; + +-- Fix quantità per descrizioni +UPDATE `co_righe_documenti` SET `qta` = 1 WHERE `is_descrizione` = 1; +UPDATE `dt_righe_ddt` SET `qta` = 1 WHERE `is_descrizione` = 1; +UPDATE `co_righe_preventivi` SET `qta` = 1 WHERE `is_descrizione` = 1; +UPDATE `co_righe_contratti` SET `qta` = 1 WHERE `is_descrizione` = 1; +UPDATE `or_righe_ordini` SET `qta` = 1 WHERE `is_descrizione` = 1; +UPDATE `mg_articoli_interventi` SET `qta` = 1 WHERE `is_descrizione` = 1; + +-- Aggiunta generale di prezzo_unitario_acquisto +ALTER TABLE `dt_righe_ddt` ADD `prezzo_unitario_acquisto` DECIMAL(12,4) NOT NULL AFTER `descrizione`; +ALTER TABLE `or_righe_ordini` ADD `prezzo_unitario_acquisto` DECIMAL(12,4) NOT NULL AFTER `descrizione`; +ALTER TABLE `co_righe_contratti` ADD `prezzo_unitario_acquisto` DECIMAL(12,4) NOT NULL AFTER `descrizione`;