diff --git a/editor.php b/editor.php index 2cf47276b..c92777e2b 100755 --- a/editor.php +++ b/editor.php @@ -13,7 +13,7 @@ if (empty($id_record) && !empty($id_module)) { include_once App::filepath('include|custom|', 'top.php'); Util\Query::setSegments(false); -$query = Util\Query::getQuery($module, [ +$query = Util\Query::getQuery($structure, [ 'id' => $id_record, ]); Util\Query::setSegments(true); diff --git a/include/common/importa.php b/include/common/importa.php index 00dbc3f30..305d10952 100644 --- a/include/common/importa.php +++ b/include/common/importa.php @@ -29,7 +29,7 @@ if (empty($id_conto)) { } // 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 OR is_descrizione = 1 ORDER BY `order`'); +$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`'); if (!empty($righe)) { echo ' diff --git a/include/src/Components/Article.php b/include/src/Components/Article.php index ecff0c472..f20fd6d03 100644 --- a/include/src/Components/Article.php +++ b/include/src/Components/Article.php @@ -169,6 +169,18 @@ abstract class Article extends Row return parent::save($options); } + public function delete() + { + $this->serials = []; + + $this->qta = 0; // Fix movimentazione automatica + if (!empty($this->qta_movimentazione)) { + $this->movimenta($this->qta_movimentazione); + } + + return parent::delete(); + } + abstract protected function movimentaMagazzino($qta); protected static function boot() diff --git a/include/src/Components/Description.php b/include/src/Components/Description.php index db1599ae0..bc07141d2 100644 --- a/include/src/Components/Description.php +++ b/include/src/Components/Description.php @@ -72,8 +72,11 @@ abstract class Description extends Model public function delete() { $this->qta = 0; + $result = parent::delete(); - return parent::delete(); + $this->parent->controllo($this); + + return $result; } /** @@ -114,6 +117,9 @@ abstract class Description extends Model // Attributi dell'oggetto da copiare $attributes = $this->getAttributes(); unset($attributes['id']); + unset($attributes['original_id']); + unset($attributes['original_type']); + unset($attributes['order']); if ($qta !== null) { $attributes['qta'] = $qta; @@ -124,9 +130,15 @@ abstract class Description extends Model // Creazione del nuovo oggetto $model = new $object(); + // Rimozione attributo in conflitto + unset($attributes[$model->getParentID()]); + $model->original_id = $this->id; $model->original_type = $current; + // Impostazione del genitore + $model->setParent($document); + // Azioni specifiche di inizalizzazione $model->customInitCopiaIn($this); @@ -142,9 +154,6 @@ abstract class Description extends Model $attributes = array_intersect_key($attributes, $accepted); $model->fill($attributes); - // Impostazione del genitore - $model->setParent($document); - // Azioni specifiche successive $model->customAfterDataCopiaIn($this); @@ -177,6 +186,15 @@ abstract class Description extends Model return $this instanceof Article; } + public function save(array $options = []) + { + $result = parent::save($options); + + $this->parent->controllo($this); + + return $result; + } + /** * Azione personalizzata per la copia dell'oggetto (inizializzazione della copia). * diff --git a/include/src/Document.php b/include/src/Document.php index 4928eff2d..2bf362b35 100644 --- a/include/src/Document.php +++ b/include/src/Document.php @@ -2,6 +2,8 @@ namespace Common; +use Common\Components\Description; + abstract class Document extends Model { /** @@ -130,6 +132,20 @@ abstract class Document extends Model return parent::delete(); } + /** + * Effettua un controllo sui campi del documento. + * Viene richiamatp dalle modifiche alle righe del documento. + * + * @param Description $trigger + */ + public function controllo(Description $trigger) + { + $this->load('righe'); + $this->load('articoli'); + $this->load('descrizioni'); + $this->load('sconti'); + } + /** * Calcola la somma degli attributi indicati come parametri. * Il metodo **non** deve essere adattato per ulteriori funzionalità: deve esclusivamente calcolare la somma richiesta in modo esplicito dagli argomenti. diff --git a/modules/contratti/src/Contratto.php b/modules/contratti/src/Contratto.php index e61b6c196..ca57a11ad 100644 --- a/modules/contratti/src/Contratto.php +++ b/modules/contratti/src/Contratto.php @@ -3,9 +3,11 @@ namespace Modules\Contratti; use Carbon\Carbon; +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; @@ -149,6 +151,47 @@ class Contratto extends Document return $result; } + /** + * Effettua un controllo sui campi del documento. + * Viene richiamatp dalle modifiche alle righe del documento. + * + * @param Description $trigger + */ + public function controllo(Description $trigger) + { + parent::controllo($trigger); + + $righe = $this->getRighe(); + + $qta_evasa = $righe->sum('qta_evasa'); + $qta = $righe->sum('qta'); + $parziale = $qta != $qta_evasa; + + // Impostazione del nuovo stato + 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'; + } + + $stato = Stato::where('descrizione', $descrizione)->first(); + $this->stato()->associate($stato); + $this->save(); + + // Trasferimento degli interventi collegati + $interventi = $this->interventi; + $stato_intervento = \Modules\Interventi\Stato::where('descrizione', $descrizione_intervento)->first(); + foreach ($interventi as $intervento) { + $intervento->stato()->associate($stato_intervento); + $intervento->save(); + } + } + // Metodi statici /** diff --git a/modules/ddt/src/DDT.php b/modules/ddt/src/DDT.php index 498793179..79881d3a0 100644 --- a/modules/ddt/src/DDT.php +++ b/modules/ddt/src/DDT.php @@ -3,6 +3,7 @@ namespace Modules\DDT; use Auth; +use Common\Components\Description; use Common\Document; use Modules\Anagrafiche\Anagrafica; use Traits\RecordTrait; @@ -130,6 +131,36 @@ class DDT extends Document return $this->hasMany(Components\Descrizione::class, 'idddt'); } + /** + * Effettua un controllo sui campi del documento. + * Viene richiamatp dalle modifiche alle righe del documento. + * + * @param Description $trigger + */ + public function controllo(Description $trigger) + { + parent::controllo($trigger); + + if (setting('Cambia automaticamente stato ddt fatturati')) { + $righe = $this->getRighe(); + + $qta_evasa = $righe->sum('qta_evasa'); + $qta = $righe->sum('qta'); + $parziale = $qta != $qta_evasa; + + // Impostazione del nuovo stato + if ($qta_evasa == 0) { + $descrizione = 'Bozza'; + } else { + $descrizione = $parziale ? 'Parzialmente fatturato' : 'Fatturato'; + } + + $stato = Stato::where('descrizione', $descrizione)->first(); + $this->stato()->associate($stato); + $this->save(); + } + } + // Metodi statici /** diff --git a/modules/fatture/actions.php b/modules/fatture/actions.php index cc9f8d411..84ec92739 100644 --- a/modules/fatture/actions.php +++ b/modules/fatture/actions.php @@ -637,17 +637,16 @@ switch (post('op')) { // Scollegamento riga generica da documento case 'unlink_riga': - if (post('idriga') !== null) { - $idriga = post('idriga'); + $id_riga = post('idriga'); - rimuovi_riga_fattura($id_record, $idriga, $dir); + if (!empty($id_riga)) { + $riga = $fattura->getRighe()->find($id_riga); + $riga->delete(); + + //rimuovi_riga_fattura($id_record, $idriga, $dir); // Ricalcolo inps, ritenuta e bollo - if ($dir == 'entrata') { - ricalcola_costiagg_fattura($id_record); - } else { - ricalcola_costiagg_fattura($id_record); - } + ricalcola_costiagg_fattura($id_record); flash()->info(tr('Riga rimossa!')); } @@ -699,7 +698,6 @@ switch (post('op')) { $calcolo_ritenuta_acconto = setting("Metodologia calcolo ritenuta d'acconto predefinito"); $id_conto = post('id_conto'); - $parziale = false; $righe = $ordine->getRighe(); foreach ($righe as $riga) { if (post('evadere')[$riga->id] == 'on') { @@ -723,18 +721,8 @@ switch (post('op')) { $copia->save(); } - - if ($riga->qta != $riga->qta_evasa) { - $parziale = true; - } } - // Impostazione del nuovo stato - $descrizione = $parziale ? 'Parzialmente fatturato' : 'Fatturato'; - $stato = \Modules\Ordini\Stato::where('descrizione', $descrizione)->first(); - $ordine->stato()->associate($stato); - $ordine->save(); - ricalcola_costiagg_fattura($id_record); aggiorna_sedi_movimenti('documenti', $id_record); @@ -769,7 +757,6 @@ switch (post('op')) { $calcolo_ritenuta_acconto = setting("Metodologia calcolo ritenuta d'acconto predefinito"); $id_conto = post('id_conto'); - $parziale = false; $righe = $ddt->getRighe(); foreach ($righe as $riga) { if (post('evadere')[$riga->id] == 'on') { @@ -791,18 +778,8 @@ switch (post('op')) { $copia->save(); } - - if ($riga->qta != $riga->qta_evasa) { - $parziale = true; - } } - // Impostazione del nuovo stato - $descrizione = $parziale ? 'Parzialmente fatturato' : 'Fatturato'; - $stato = \Modules\DDT\Stato::where('descrizione', $descrizione)->first(); - $ddt->stato()->associate($stato); - $ddt->save(); - ricalcola_costiagg_fattura($id_record); aggiorna_sedi_movimenti('documenti', $id_record); @@ -836,7 +813,6 @@ switch (post('op')) { $calcolo_ritenuta_acconto = setting("Metodologia calcolo ritenuta d'acconto predefinito"); $id_conto = post('id_conto'); - $parziale = false; $righe = $preventivo->getRighe(); foreach ($righe as $riga) { if (post('evadere')[$riga->id] == 'on') { @@ -856,24 +832,6 @@ switch (post('op')) { $copia->save(); } - - if ($riga->qta != $riga->qta_evasa) { - $parziale = true; - } - } - - // Impostazione del nuovo stato - $descrizione = $parziale ? 'Parzialmente fatturato' : 'Fatturato'; - $stato = \Modules\Preventivi\Stato::where('descrizione', $descrizione)->first(); - $preventivo->stato()->associate($stato); - $preventivo->save(); - - // Trasferimento degli interventi collegati - $interventi = $preventivo->interventi; - $stato_intervento = \Modules\Interventi\Stato::where('descrizione', 'Fatturato')->first(); - foreach ($interventi as $intervento) { - $intervento->stato()->associate($stato_intervento); - $intervento->save(); } ricalcola_costiagg_fattura($id_record); @@ -909,7 +867,6 @@ switch (post('op')) { $calcolo_ritenuta_acconto = setting("Metodologia calcolo ritenuta d'acconto predefinito"); $id_conto = post('id_conto'); - $parziale = false; $righe = $contratto->getRighe(); foreach ($righe as $riga) { if (post('evadere')[$riga->id] == 'on') { @@ -929,24 +886,6 @@ switch (post('op')) { $copia->save(); } - - if ($riga->qta != $riga->qta_evasa) { - $parziale = true; - } - } - - // Impostazione del nuovo stato - $descrizione = $parziale ? 'Parzialmente fatturato' : 'Fatturato'; - $stato = \Modules\Contratti\Stato::where('descrizione', $descrizione)->first(); - $contratto->stato()->associate($stato); - $contratto->save(); - - // Trasferimento degli interventi collegati - $interventi = $contratto->interventi; - $stato_intervento = \Modules\Interventi\Stato::where('descrizione', 'Fatturato')->first(); - foreach ($interventi as $intervento) { - $intervento->stato()->associate($stato_intervento); - $intervento->save(); } ricalcola_costiagg_fattura($id_record); diff --git a/modules/fatture/row-list.php b/modules/fatture/row-list.php index 8c9c77ddc..f9c5a6fdb 100644 --- a/modules/fatture/row-list.php +++ b/modules/fatture/row-list.php @@ -253,7 +253,7 @@ foreach ($righe as $row) {