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) {
- "; + "; if ($row->isArticolo()) { echo " diff --git a/modules/ordini/edit.php b/modules/ordini/edit.php index 9d3aaf2a9..21aea344b 100644 --- a/modules/ordini/edit.php +++ b/modules/ordini/edit.php @@ -39,6 +39,7 @@ $_SESSION['superselect']['idanagrafica'] = $record['idanagrafica'];
diff --git a/modules/ordini/init.php b/modules/ordini/init.php index 10b810ada..bc34f7be9 100644 --- a/modules/ordini/init.php +++ b/modules/ordini/init.php @@ -6,9 +6,9 @@ if (isset($id_record)) { $ordine = Modules\Ordini\Ordine::with('tipo', 'stato')->find($id_record); // Aggiornamento stato di questo ordine (?) - if (!empty(get_stato_ordine($id_record)) && setting('Cambia automaticamente stato ordini fatturati')) { - $dbo->query('UPDATE or_ordini SET idstatoordine=(SELECT id FROM or_statiordine WHERE descrizione="'.get_stato_ordine($id_record).'") WHERE id='.prepare($id_record)); - } + //if (!empty(get_stato_ordine($id_record)) && setting('Cambia automaticamente stato ordini fatturati')) { + // $dbo->query('UPDATE or_ordini SET idstatoordine=(SELECT id FROM or_statiordine WHERE descrizione="'.get_stato_ordine($id_record).'") WHERE id='.prepare($id_record)); + //} $record = $dbo->fetchOne('SELECT *, or_ordini.note, diff --git a/modules/ordini/src/Ordine.php b/modules/ordini/src/Ordine.php index 0153611bc..f9e29f8c1 100644 --- a/modules/ordini/src/Ordine.php +++ b/modules/ordini/src/Ordine.php @@ -2,8 +2,10 @@ namespace Modules\Ordini; +use Common\Components\Description; use Common\Document; use Modules\Anagrafiche\Anagrafica; +use Modules\DDT\DDT; use Traits\RecordTrait; use Util\Generator; @@ -120,6 +122,38 @@ class Ordine extends Document return $this->hasMany(Components\Descrizione::class, 'idordine'); } + /** + * 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 ordini 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'; + } elseif ($trigger->parent instanceof DDT) { + $descrizione = $parziale ? 'Parzialmente evaso' : 'Evaso'; + } else { + $descrizione = $parziale ? 'Parzialmente fatturato' : 'Fatturato'; + } + + $stato = Stato::where('descrizione', $descrizione)->first(); + $this->stato()->associate($stato); + $this->save(); + } + } + // Metodi statici /** diff --git a/modules/preventivi/src/Preventivo.php b/modules/preventivi/src/Preventivo.php index 18b29b0e5..6bd3c8bf2 100644 --- a/modules/preventivi/src/Preventivo.php +++ b/modules/preventivi/src/Preventivo.php @@ -3,9 +3,11 @@ namespace Modules\Preventivi; 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; @@ -155,6 +157,47 @@ class Preventivo 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/plugins/importFE/actions.php b/plugins/importFE/actions.php index 9e27ce6a4..2e3e3cec3 100644 --- a/plugins/importFE/actions.php +++ b/plugins/importFE/actions.php @@ -19,8 +19,18 @@ switch (filter('op')) { } if (FatturaElettronica::isValid($file)) { + // Individuazione ID fisico + $files = Interaction::fileToImport(); + foreach ($files as $key => $value) { + if ($value['name'] == $file) { + $index = $key; + + break; + } + } + echo json_encode([ - 'filename' => $file, + 'id' => $index + 1, ]); } else { echo json_encode([ diff --git a/plugins/importFE/edit.php b/plugins/importFE/edit.php index 4cbe44e03..cf3e8e725 100644 --- a/plugins/importFE/edit.php +++ b/plugins/importFE/edit.php @@ -4,6 +4,12 @@ include_once __DIR__.'/../../core.php'; use Plugins\ImportFE\Interaction; +if (!empty($fattura_pa)) { + include $structure->filepath('generate.php'); + + return; +} + echo ' + '; diff --git a/plugins/importFE/init.php b/plugins/importFE/init.php new file mode 100644 index 000000000..24147a2b9 --- /dev/null +++ b/plugins/importFE/init.php @@ -0,0 +1,21 @@ +findAnagrafica(); + + $record = $file; + } catch (Exception $e) { + } +} diff --git a/plugins/importFE/list.php b/plugins/importFE/list.php index cd70702d4..9fffea457 100644 --- a/plugins/importFE/list.php +++ b/plugins/importFE/list.php @@ -124,17 +124,17 @@ function download(button, file, data_registrazione) { data = JSON.parse(data); if (!data.already) { - launch_modal("'.tr('Righe fattura').'", globals.rootdir + "/actions.php?id_module=" + globals.id_module + "&id_plugin=" + '.$id_plugin.' + "&op=list&filename=" + data.filename +"&data_registrazione=" + data_registrazione); - buttonRestore(button, restore); + redirect(globals.rootdir + "/editor.php?id_module=" + globals.id_module + "&id_plugin=" + '.$id_plugin.' + "&id_record=" + data.id); } else { swal({ title: "'.tr('Fattura già importata.').'", type: "info", }); - buttonRestore(button, restore); $(button).prop("disabled", true); } + + buttonRestore(button, restore); }, error: function(xhr) { alert("'.tr('Errore').': " + xhr.responseJSON.error.message); diff --git a/plugins/importFE/src/FatturaElettronica.php b/plugins/importFE/src/FatturaElettronica.php index 600beacc4..9e96db6d7 100644 --- a/plugins/importFE/src/FatturaElettronica.php +++ b/plugins/importFE/src/FatturaElettronica.php @@ -187,14 +187,7 @@ class FatturaElettronica ])); } - /** - * Restituisce l'anagrafica collegata alla fattura, eventualmente generandola con i dati forniti. - * - * @param string $type - * - * @return Anagrafica - */ - public function saveAnagrafica($type = 'Fornitore') + public function findAnagrafica() { $info = $this->getAnagrafe(); @@ -212,12 +205,26 @@ class FatturaElettronica $anagrafica->where('codice_fiscale', $info['codice_fiscale']); } - $anagrafica = $anagrafica->first(); + return $anagrafica->first(); + } + + /** + * Restituisce l'anagrafica collegata alla fattura, eventualmente generandola con i dati forniti. + * + * @param string $type + * + * @return Anagrafica + */ + public function saveAnagrafica($type = 'Fornitore') + { + $anagrafica = $this->findAnagrafica(); if (!empty($anagrafica)) { return $anagrafica; } + $info = $this->getAnagrafe(); + $anagrafica = Anagrafica::build($info['ragione_sociale'], $info['nome'], $info['cognome'], [ TipoAnagrafica::where('descrizione', $type)->first()->id, ]); diff --git a/plugins/importFE/src/Interaction.php b/plugins/importFE/src/Interaction.php index b745ab500..ee5e85e82 100644 --- a/plugins/importFE/src/Interaction.php +++ b/plugins/importFE/src/Interaction.php @@ -28,6 +28,18 @@ class Interaction extends Services } } + // Ricerca fisica + $files = self::fileToImport($names); + + $list = array_merge($list, $files); + + return $list; + } + + public static function fileToImport($names = []) + { + $list = []; + // Ricerca fisica $directory = FatturaElettronica::getImportDirectory();