From 3603d2914b8558f156e66f788df56e51dba4da0a Mon Sep 17 00:00:00 2001 From: valentina Date: Fri, 23 May 2025 15:17:12 +0200 Subject: [PATCH] fix: 1518 Bug cambio di stato automatico documenti --- modules/ddt/src/DDT.php | 74 ++++++++++++++++++++++++++++++++--- modules/ordini/src/Ordine.php | 42 +++++++++++++++++++- 2 files changed, 109 insertions(+), 7 deletions(-) diff --git a/modules/ddt/src/DDT.php b/modules/ddt/src/DDT.php index 45e9c0170..7cbd54d4f 100755 --- a/modules/ddt/src/DDT.php +++ b/modules/ddt/src/DDT.php @@ -222,25 +222,89 @@ class DDT extends Document $qta_evasa = $righe->sum('qta_evasa'); $parziale = $qta != $qta_evasa; + $fatture_collegate = database()->table('co_righe_documenti') + ->where('idddt', $this->id) + ->join('co_documenti', 'co_righe_documenti.iddocumento', '=', 'co_documenti.id') + ->count(); + + $qta_fatturate = 0; + $parziale_fatturato = true; $fattura = Fattura::find($trigger->iddocumento); if (!empty($fattura)) { - $righe_fatturate = $fattura->getRighe()->where('idddt', '=', $this->id); + $righe_fatturate = $fattura->getRighe()->where('idddt', $this->id); $qta_fatturate = $righe_fatturate->sum('qta'); $parziale_fatturato = $qta != $qta_fatturate; } + $collegato_a_ordine = false; + foreach ($righe as $riga) { + if (!empty($riga->original_id) && !empty($riga->original_type) && strpos($riga->original_type, 'Ordini') !== false) { + $collegato_a_ordine = true; + break; + } + } + // Impostazione del nuovo stato - if ($qta_evasa == 0) { + if ($qta_evasa == 0 && !$collegato_a_ordine) { $descrizione = 'Bozza'; - } elseif (empty($qta_fatturate)) { - $descrizione = $parziale ? 'Parzialmente evaso' : 'Evaso'; - } else { + } elseif ($fatture_collegate > 0) { $descrizione = $parziale_fatturato ? 'Parzialmente fatturato' : 'Fatturato'; + } else { + $descrizione = $parziale ? 'Parzialmente evaso' : 'Evaso'; } $stato = Stato::where('name', $descrizione)->first()->id; $this->stato()->associate($stato); $this->save(); + + if ($descrizione == 'Fatturato' || $descrizione == 'Parzialmente fatturato') { + $this->aggiornaStatiOrdiniCollegati(); + } + } + } + + /** + * Aggiorna lo stato degli ordini collegati a questo DDT. + * Quando il DDT passa a "Fatturato" o "Parzialmente fatturato", anche gli ordini collegati + * devono passare a "Fatturato" o "Parzialmente fatturato". + */ + public function aggiornaStatiOrdiniCollegati() + { + $righe_ddt = $this->getRighe(); + + foreach ($righe_ddt as $riga_ddt) { + if (!empty($riga_ddt->original_id) && !empty($riga_ddt->original_type) && strpos($riga_ddt->original_type, 'Ordini') !== false) { + $riga_ordine = $riga_ddt->getOriginalComponent(); + + if (!empty($riga_ordine)) { + $ordine = $riga_ordine->getDocument(); + + if (!empty($ordine)) { + $fatture_collegate = database()->table('co_righe_documenti') + ->where('idddt', $this->id) + ->join('co_documenti', 'co_righe_documenti.iddocumento', '=', 'co_documenti.id') + ->count(); + + if ($fatture_collegate > 0) { + $righe_ordine = $ordine->getRighe(); + $qta = $righe_ordine->sum('qta'); + $qta_evasa = $righe_ordine->sum('qta_evasa'); + $parziale = $qta != $qta_evasa; + + $descrizione = $parziale ? 'Parzialmente fatturato' : 'Fatturato'; + + if (database()->isConnected() && database()->tableExists('or_statiordine_lang')) { + $stato = \Modules\Ordini\Stato::where('name', $descrizione)->first()->id; + } else { + $stato = \Modules\Ordini\Stato::where('descrizione', $descrizione)->first()->id; + } + + $ordine->stato()->associate($stato); + $ordine->save(); + } + } + } + } } } diff --git a/modules/ordini/src/Ordine.php b/modules/ordini/src/Ordine.php index 66a01bbe2..eb90c9b86 100755 --- a/modules/ordini/src/Ordine.php +++ b/modules/ordini/src/Ordine.php @@ -170,13 +170,51 @@ class Ordine extends Document $stato_attuale = $this->stato; $nome_stato = (database()->isConnected() && database()->tableExists('or_statiordine_lang') ? $stato_attuale->getTranslation('title', \Models\Locale::getPredefined()->id) : $stato_attuale->descrizione); + $righe_fatturate = $righe->where('qta_evasa', '>', 0); + $qta_fatturate = 0; + $fatture_collegate_totali = 0; + + foreach ($righe_fatturate as $riga) { + $fatture_collegate = database()->table('co_righe_documenti') + ->where('original_id', $riga->id) + ->where('original_type', get_class($riga)) + ->join('co_documenti', 'co_righe_documenti.iddocumento', '=', 'co_documenti.id') + ->count(); + + $fatture_collegate_totali += $fatture_collegate; + + if ($fatture_collegate > 0) { + $qta_fatturate += $riga->qta; + } + } + + $parziale_fatturato = $qta != $qta_fatturate; + // Impostazione del nuovo stato if ($qta_evasa == 0) { $descrizione = 'Accettato'; - } elseif (!in_array($nome_stato, ['Parzialmente fatturato', 'Fatturato']) && $trigger->getDocument() instanceof DDT) { + } elseif ($trigger->getDocument() instanceof \Modules\Fatture\Fattura) { + $descrizione = $parziale_fatturato ? 'Parzialmente fatturato' : 'Fatturato'; + } elseif ($trigger->getDocument() instanceof \Modules\DDT\DDT) { + $ddt = $trigger->getDocument(); + $fatture_ddt = database()->table('co_righe_documenti') + ->where('idddt', $ddt->id) + ->join('co_documenti', 'co_righe_documenti.iddocumento', '=', 'co_documenti.id') + ->count(); + + if ($fatture_ddt > 0) { + $descrizione = $parziale_fatturato ? 'Parzialmente fatturato' : 'Fatturato'; + } else { + $descrizione = $parziale ? 'Parzialmente evaso' : 'Evaso'; + } + } elseif ($fatture_collegate_totali > 0) { + $descrizione = $parziale_fatturato ? 'Parzialmente fatturato' : 'Fatturato'; + } elseif (in_array($nome_stato, ['Parzialmente fatturato', 'Fatturato'])) { + $descrizione = $parziale ? 'Parzialmente evaso' : 'Evaso'; + } elseif ($qta_evasa > 0) { $descrizione = $parziale ? 'Parzialmente evaso' : 'Evaso'; } else { - $descrizione = $parziale ? 'Parzialmente fatturato' : 'Fatturato'; + $descrizione = $nome_stato; } if (database()->isConnected() && database()->tableExists('or_statiordine_lang')) {