From e92430f416aae481b5d0899f90f2836460572a00 Mon Sep 17 00:00:00 2001 From: Thomas Zilio Date: Fri, 3 May 2019 18:28:33 -0700 Subject: [PATCH 1/5] Aggiunta relazioni morph tra righe --- include/src/Components/Article.php | 6 ++++-- include/src/Components/Description.php | 27 +++++++++++++++++--------- include/src/Components/Discount.php | 6 ++++-- include/src/Components/MorphTrait.php | 20 +++++++++++++++++++ include/src/Components/Row.php | 10 ++++++---- include/src/Model.php | 5 +++++ modules/fatture/actions.php | 12 +++++------- modules/my_impianti/actions.php | 6 +++--- modules/my_impianti/buttons.php | 2 +- update/2_4_9.sql | 5 +++++ 10 files changed, 71 insertions(+), 28 deletions(-) create mode 100644 include/src/Components/MorphTrait.php diff --git a/include/src/Components/Article.php b/include/src/Components/Article.php index 29c490a36..f24dcbd7a 100644 --- a/include/src/Components/Article.php +++ b/include/src/Components/Article.php @@ -128,8 +128,10 @@ abstract class Article extends Row { parent::boot(true); - static::addGlobalScope('articles', function (Builder $builder) { - $builder->whereNotNull('idarticolo')->where('idarticolo', '<>', 0); + $table = parent::getTableName(); + + static::addGlobalScope('articles', function (Builder $builder) use ($table) { + $builder->whereNotNull($table.'.idarticolo')->where($table.'.idarticolo', '<>', 0); }); } diff --git a/include/src/Components/Description.php b/include/src/Components/Description.php index 5d6c48673..5e119aeaa 100644 --- a/include/src/Components/Description.php +++ b/include/src/Components/Description.php @@ -8,6 +8,8 @@ use Illuminate\Database\Eloquent\Builder; abstract class Description extends Model { + use MorphTrait; + protected $guarded = []; public static function build(Document $document, $bypass = false) @@ -38,7 +40,7 @@ abstract class Description extends Model $this->attributes['qta'] = $value; - $this->evasione($diff); + $this->evasione(-$diff); return $diff; } @@ -129,11 +131,10 @@ abstract class Description extends Model // Azioni specifiche successive $model->customAfterDataCopiaIn($this); - $model->save(); + $model->original_id = $this->id; + $model->original_type = $current; - // Rimozione quantità evasa - $this->qta_evasa = $this->qta_evasa + abs($attributes['qta']); - $this->save(); + $model->save(); return $model; } @@ -164,6 +165,12 @@ abstract class Description extends Model protected function evasione($diff) { + if ($this->hasOriginal()) { + $original = $this->getOriginal(); + + $original->qta_evasa -= $diff; + $original->save(); + } } /** @@ -199,13 +206,15 @@ abstract class Description extends Model { parent::boot(); + $table = parent::getTableName(); + if (!$bypass) { - static::addGlobalScope('descriptions', function (Builder $builder) { - $builder->where('is_descrizione', '=', 1); + static::addGlobalScope('descriptions', function (Builder $builder) use ($table) { + $builder->where($table.'.is_descrizione', '=', 1); }); } else { - static::addGlobalScope('not_descriptions', function (Builder $builder) { - $builder->where('is_descrizione', '=', 0); + static::addGlobalScope('not_descriptions', function (Builder $builder) use ($table) { + $builder->where($table.'.is_descrizione', '=', 0); }); } } diff --git a/include/src/Components/Discount.php b/include/src/Components/Discount.php index 9faf30fdd..b8d297bf1 100644 --- a/include/src/Components/Discount.php +++ b/include/src/Components/Discount.php @@ -43,8 +43,10 @@ abstract class Discount extends Row { parent::boot(true); - static::addGlobalScope('discounts', function (Builder $builder) { - $builder->where('is_sconto', '=', 1); + $table = parent::getTableName(); + + static::addGlobalScope('discounts', function (Builder $builder) use ($table) { + $builder->where($table.'.is_sconto', '=', 1); }); } } diff --git a/include/src/Components/MorphTrait.php b/include/src/Components/MorphTrait.php new file mode 100644 index 000000000..85aed26b5 --- /dev/null +++ b/include/src/Components/MorphTrait.php @@ -0,0 +1,20 @@ +original_type) && !empty($this->original); + } + + public function original() + { + return $this->morphedByMany($this->original_type, 'original', $this->table, 'id'); + } + + public function getOriginal(){ + return $this->original()->first(); + } +} diff --git a/include/src/Components/Row.php b/include/src/Components/Row.php index 32a8af6b2..9336aa232 100644 --- a/include/src/Components/Row.php +++ b/include/src/Components/Row.php @@ -173,13 +173,15 @@ abstract class Row extends Description { parent::boot(true); + $table = parent::getTableName(); + if (!$bypass) { - static::addGlobalScope('rows', function (Builder $builder) { - $builder->whereNull('idarticolo')->orWhere('idarticolo', '=', 0); + static::addGlobalScope('rows', function (Builder $builder) use ($table) { + $builder->whereNull($table.'.idarticolo')->orWhere($table.'.idarticolo', '=', 0); }); - static::addGlobalScope('not_discounts', function (Builder $builder) { - $builder->where('is_sconto', '=', 0); + static::addGlobalScope('not_discounts', function (Builder $builder) use ($table) { + $builder->where($table.'.is_sconto', '=', 0); }); } } diff --git a/include/src/Model.php b/include/src/Model.php index 36869e2e0..cd457b4e1 100644 --- a/include/src/Model.php +++ b/include/src/Model.php @@ -18,4 +18,9 @@ abstract class Model extends Original { return new static(); } + + public static function getTableName() + { + return with(new static())->getTable(); + } } diff --git a/modules/fatture/actions.php b/modules/fatture/actions.php index b08d49c7a..40663e853 100644 --- a/modules/fatture/actions.php +++ b/modules/fatture/actions.php @@ -607,8 +607,8 @@ switch (post('op')) { if (!empty($rsa[$i]['idarticolo'])) { add_movimento_magazzino($rsa[$i]['idarticolo'], $rsa[$i]['qta'], ['iddocumento' => $id_record]); } - - // Ripristino le quantità da evadere nel contratto + + // Ripristino le quantità da evadere nel contratto $dbo->update('co_righe_contratti', [ 'qta_evasa' => 0, @@ -617,16 +617,14 @@ switch (post('op')) { 'idcontratto' => $idcontratto, ] ); - } } else { - - $rs5 = $dbo->fetchArray('SELECT idarticolo, id, qta, descrizione FROM co_righe_documenti WHERE id = '.prepare($idriga).' AND idintervento IS NULL'); + $rs5 = $dbo->fetchArray('SELECT idarticolo, id, qta, descrizione FROM co_righe_documenti WHERE id = '.prepare($idriga).' AND idintervento IS NULL'); if (!empty($idarticolo)) { rimuovi_articolo_dafattura($rs5[0]['idarticolo'], $id_record, $idriga); } - - // Ripristino le quantità da evadere nel contratto + + // Ripristino le quantità da evadere nel contratto $dbo->update('co_righe_contratti', [ 'qta_evasa' => 0, diff --git a/modules/my_impianti/actions.php b/modules/my_impianti/actions.php index 7b0a24d0e..517f52b10 100644 --- a/modules/my_impianti/actions.php +++ b/modules/my_impianti/actions.php @@ -122,12 +122,12 @@ switch ($op) { $dbo->query('ALTER TABLE tmp DROP id'); $dbo->query('INSERT INTO my_impianti SELECT NULL,tmp. * FROM tmp'); $id_record = $dbo->lastInsertedID(); - $dbo->query ('DROP TEMPORARY TABLE tmp'); + $dbo->query('DROP TEMPORARY TABLE tmp'); - $dbo->query ('UPDATE my_impianti SET matricola = CONCAT (matricola, " (copia)") WHERE id = '.prepare($id_record)); + $dbo->query('UPDATE my_impianti SET matricola = CONCAT (matricola, " (copia)") WHERE id = '.prepare($id_record)); flash()->info(tr('Impianto duplicato correttamente!')); - + break; // Rimuovo impianto e scollego tutti i suoi componenti diff --git a/modules/my_impianti/buttons.php b/modules/my_impianti/buttons.php index b164baedd..5d0c2c3ee 100644 --- a/modules/my_impianti/buttons.php +++ b/modules/my_impianti/buttons.php @@ -10,4 +10,4 @@ echo '
-
'; \ No newline at end of file +'; diff --git a/update/2_4_9.sql b/update/2_4_9.sql index f6c4f1457..9c096edc8 100644 --- a/update/2_4_9.sql +++ b/update/2_4_9.sql @@ -301,3 +301,8 @@ UPDATE `zz_modules` `t1` INNER JOIN `zz_modules` `t2` ON (`t1`.`name` = 'Stato d -- Widget spazio utilizzato INSERT INTO `zz_widgets` (`id`, `name`, `type`, `id_module`, `location`, `class`, `query`, `bgcolor`, `icon`, `print_link`, `more_link`, `more_link_type`, `php_include`, `text`, `enabled`, `order`, `help`) VALUES (NULL, 'Spazio utilizzato', 'chart', (SELECT id FROM zz_modules WHERE name = 'Stato dei servizi'), 'controller_right', 'col-md-12', NULL, '#4ccc4c', 'fa fa-hdd-o', '', '', NULL, './modules/stato_servizi/widgets/spazio_utilizzato.php', 'Spazio utilizzato', '1', '1', NULL); + +-- Relazione tra le righe dei documenti +ALTER TABLE `co_righe_documenti` ADD `original_id` int(11), ADD `original_type` varchar(255); +ALTER TABLE `or_righe_ordini` ADD `original_id` int(11), ADD `original_type` varchar(255); +ALTER TABLE `dt_righe_ddt` ADD `original_id` int(11), ADD `original_type` varchar(255); From 33fee0163db1496810da545c9b6efc25c198531f Mon Sep 17 00:00:00 2001 From: Thomas Zilio Date: Fri, 3 May 2019 21:19:08 -0700 Subject: [PATCH 2/5] Aggiornamento Contratti --- include/src/Components/MorphTrait.php | 3 +- include/src/Document.php | 33 ++ modules/contratti/actions.php | 284 ++++++++---------- modules/contratti/row-add.php | 7 +- modules/contratti/row-edit.php | 6 +- modules/contratti/row-list.php | 169 +++++------ .../src/Components/RelationTrait.php | 8 + modules/contratti/src/Contratto.php | 12 + modules/fatture/row-list.php | 4 +- modules/fatture/src/Fattura.php | 2 +- 10 files changed, 265 insertions(+), 263 deletions(-) diff --git a/include/src/Components/MorphTrait.php b/include/src/Components/MorphTrait.php index 85aed26b5..7d7df8a70 100644 --- a/include/src/Components/MorphTrait.php +++ b/include/src/Components/MorphTrait.php @@ -14,7 +14,8 @@ trait MorphTrait return $this->morphedByMany($this->original_type, 'original', $this->table, 'id'); } - public function getOriginal(){ + public function getOriginal() + { return $this->original()->first(); } } diff --git a/include/src/Document.php b/include/src/Document.php index cc2a08924..284765efd 100644 --- a/include/src/Document.php +++ b/include/src/Document.php @@ -19,6 +19,29 @@ abstract class Document extends Model return $descrizioni->merge($righe)->merge($articoli)->merge($sconti)->sortBy('order'); } + /** + * Restituisce la collezione di righe e articoli con valori rilevanti per i conti, raggruppate sulla base dei documenti di provenienza. + * La chiave è la serializzazione del documento di origine, oppure null in caso non esista. + * + * @return iterable + */ + public function getRigheRaggruppate() + { + $righe = $this->getRighe(); + + $groups = $righe->groupBy(function ($item, $key) { + if (!$item->hasOriginal()) { + return null; + } + + $parent = $item->getOriginal()->parent; + + return serialize($parent); + }); + + return $groups; + } + abstract public function righe(); abstract public function articoli(); @@ -97,6 +120,16 @@ abstract class Document extends Model return $this->calcola('guadagno'); } + public function delete() + { + $righe = $this->getRighe(); + foreach ($righe as $riga) { + $riga->delete(); + } + + return parent::delete(); + } + /** * 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/actions.php b/modules/contratti/actions.php index bfd355048..ee1fdb4de 100644 --- a/modules/contratti/actions.php +++ b/modules/contratti/actions.php @@ -3,7 +3,9 @@ include_once __DIR__.'/../../core.php'; use Modules\Anagrafiche\Anagrafica; +use Modules\Articoli\Articolo as ArticoloOriginale; use Modules\Contratti\Components\Articolo; +use Modules\Contratti\Components\Descrizione; use Modules\Contratti\Components\Riga; use Modules\Contratti\Components\Sconto; use Modules\Contratti\Contratto; @@ -26,72 +28,30 @@ switch (post('op')) { case 'update': if (post('id_record') !== null) { - $idstato = post('idstato'); - $idanagrafica = post('idanagrafica'); - $idsede = post('idsede'); - $nome = post('nome'); - $idagente = post('idagente'); - $idpagamento = post('idpagamento'); - $numero = post('numero'); + $contratto->idanagrafica = post('idanagrafica'); + $contratto->idsede = post('idsede'); + $contratto->idstato = post('idstato'); + $contratto->nome = post('nome'); + $contratto->idagente = post('idagente'); + $contratto->idpagamento = post('idpagamento'); + $contratto->numero = post('numero'); + $contratto->idreferente = post('idreferente'); + $contratto->validita = post('validita'); + $contratto->data_bozza = post('data_bozza'); + $contratto->data_accettazione = post('data_accettazione'); + $contratto->data_rifiuto = post('data_rifiuto'); + $contratto->data_conclusione = post('data_conclusione'); + $contratto->rinnovabile = post('rinnovabile'); + $contratto->giorni_preavviso_rinnovo = post('giorni_preavviso_rinnovo'); + $contratto->ore_preavviso_rinnovo = post('ore_preavviso_rinnovo'); + $contratto->esclusioni = post('esclusioni'); + $contratto->descrizione = post('descrizione'); + $contratto->id_documento_fe = post('id_documento_fe'); + $contratto->num_item = post('num_item'); + $contratto->codice_cig = post('codice_cig'); + $contratto->codice_cup = post('codice_cup'); - // Se non specifico un budget me lo vado a ricalcolare - if ($budget != '') { - $budget = post('budget'); - } else { - $q = "SELECT (SELECT SUM(subtotale) FROM co_righe_contratti GROUP BY idcontratto HAVING idcontratto=co_contratti.id) AS 'budget' FROM co_contratti WHERE id=".prepare($id_record); - $rs = $dbo->fetchArray($q); - $budget = $rs[0]['budget']; - } - - $data_bozza = post('data_bozza'); - $data_accettazione = post('data_accettazione'); - $data_rifiuto = post('data_rifiuto'); - $data_conclusione = post('data_conclusione'); - $rinnovabile = post('rinnovabile'); - - $giorni_preavviso_rinnovo = post('giorni_preavviso_rinnovo'); - $ore_preavviso_rinnovo = post('ore_preavviso_rinnovo'); - $validita = post('validita'); - $idreferente = post('idreferente'); - $esclusioni = post('esclusioni'); - $descrizione = post('descrizione'); - // $ore_lavoro = post('ore_lavoro'); - - $costo_orario = post('costo_orario'); - $costo_km = post('costo_km'); - $costo_diritto_chiamata = post('costo_diritto_chiamata'); - - $id_documento_fe = post('id_documento_fe'); - $num_item = post('num_item'); - $codice_cig = post('codice_cig'); - $codice_cup = post('codice_cup'); - - $query = 'UPDATE co_contratti SET idanagrafica='.prepare($idanagrafica).', - idsede='.prepare($idsede).', - idstato='.prepare($idstato).', - nome='.prepare($nome).', - idagente='.prepare($idagente).', - idpagamento='.prepare($idpagamento).', - numero='.prepare($numero).', - budget='.prepare($budget).', - idreferente='.prepare($idreferente).', - validita='.prepare($validita).', - data_bozza='.prepare($data_bozza).', - data_accettazione='.prepare($data_accettazione).', - data_rifiuto='.prepare($data_rifiuto).', - data_conclusione='.prepare($data_conclusione).', - rinnovabile='.prepare($rinnovabile).', - giorni_preavviso_rinnovo='.prepare($giorni_preavviso_rinnovo).', - ore_preavviso_rinnovo='.prepare($ore_preavviso_rinnovo).', - esclusioni='.prepare($esclusioni).', descrizione='.prepare($descrizione).', - id_documento_fe='.prepare($id_documento_fe).', - num_item='.prepare($num_item).', - codice_cig='.prepare($codice_cig).', - codice_cup='.prepare($codice_cup).' WHERE id='.prepare($id_record); - - // costo_diritto_chiamata='.prepare($costo_diritto_chiamata).', ore_lavoro='.prepare($ore_lavoro).', costo_orario='.prepare($costo_orario).', costo_km='.prepare($costo_km).' - - $dbo->query($query); + $contratto->save(); $dbo->query('DELETE FROM my_impianti_contratti WHERE idcontratto='.prepare($id_record)); foreach ((array) post('matricolaimpianto') as $matricolaimpianto) { @@ -99,27 +59,27 @@ switch (post('op')) { } // Salvataggio costi attività unitari del contratto - foreach (post('costo_ore') as $idtipointervento => $valore) { - $rs = $dbo->fetchArray('SELECT * FROM co_contratti_tipiintervento WHERE idcontratto='.prepare($id_record).' AND idtipointervento='.prepare($idtipointervento)); + foreach (post('costo_ore') as $id_tipo => $valore) { + $rs = $dbo->fetchArray('SELECT * FROM co_contratti_tipiintervento WHERE idcontratto='.prepare($id_record).' AND idtipointervento='.prepare($id_tipo)); // Se non esiste il record lo inserisco... if (sizeof($rs) == 0) { // Se almeno un valore è diverso da 0 inserisco l'importo... - if (post('costo_ore')[$idtipointervento] != 0 || post('costo_km')[$idtipointervento] != 0 || post('costo_dirittochiamata')[$idtipointervento] != 0) { - $dbo->query('INSERT INTO co_contratti_tipiintervento(idcontratto, idtipointervento, costo_ore, costo_km, costo_dirittochiamata, costo_ore_tecnico, costo_km_tecnico, costo_dirittochiamata_tecnico) VALUES('.prepare($id_record).', '.prepare($idtipointervento).', '.prepare(post('costo_ore')[$idtipointervento]).', '.prepare(post('costo_km')[$idtipointervento]).', '.prepare(post('costo_dirittochiamata')[$idtipointervento]).', '.prepare(post('costo_ore_tecnico')[$idtipointervento]).', '.prepare(post('costo_km_tecnico')[$idtipointervento]).', '.prepare(post('costo_dirittochiamata_tecnico')[$idtipointervento]).')'); + if (post('costo_ore')[$id_tipo] != 0 || post('costo_km')[$id_tipo] != 0 || post('costo_dirittochiamata')[$id_tipo] != 0) { + $dbo->query('INSERT INTO co_contratti_tipiintervento(idcontratto, idtipointervento, costo_ore, costo_km, costo_dirittochiamata, costo_ore_tecnico, costo_km_tecnico, costo_dirittochiamata_tecnico) VALUES('.prepare($id_record).', '.prepare($id_tipo).', '.prepare(post('costo_ore')[$id_tipo]).', '.prepare(post('costo_km')[$id_tipo]).', '.prepare(post('costo_dirittochiamata')[$id_tipo]).', '.prepare(post('costo_ore_tecnico')[$id_tipo]).', '.prepare(post('costo_km_tecnico')[$id_tipo]).', '.prepare(post('costo_dirittochiamata_tecnico')[$id_tipo]).')'); } } // ...altrimenti... else { // Aggiorno il nuovo valore se è diverso da 0... - if (post('costo_ore')[$idtipointervento] != 0 || post('costo_km')[$idtipointervento] != 0 || post('costo_dirittochiamata')[$idtipointervento] != 0) { - $dbo->query('UPDATE co_contratti_tipiintervento SET costo_ore='.prepare(post('costo_ore')[$idtipointervento]).', costo_km='.prepare(post('costo_km')[$idtipointervento]).', costo_dirittochiamata='.prepare(post('costo_dirittochiamata')[$idtipointervento]).', costo_ore_tecnico='.prepare(post('costo_ore_tecnico')[$idtipointervento]).', costo_km_tecnico='.prepare(post('costo_km_tecnico')[$idtipointervento]).', costo_dirittochiamata_tecnico='.prepare(post('costo_dirittochiamata_tecnico')[$idtipointervento]).' WHERE idcontratto='.prepare($id_record).' AND idtipointervento='.prepare($idtipointervento)); + if (post('costo_ore')[$id_tipo] != 0 || post('costo_km')[$id_tipo] != 0 || post('costo_dirittochiamata')[$id_tipo] != 0) { + $dbo->query('UPDATE co_contratti_tipiintervento SET costo_ore='.prepare(post('costo_ore')[$id_tipo]).', costo_km='.prepare(post('costo_km')[$id_tipo]).', costo_dirittochiamata='.prepare(post('costo_dirittochiamata')[$id_tipo]).', costo_ore_tecnico='.prepare(post('costo_ore_tecnico')[$id_tipo]).', costo_km_tecnico='.prepare(post('costo_km_tecnico')[$id_tipo]).', costo_dirittochiamata_tecnico='.prepare(post('costo_dirittochiamata_tecnico')[$id_tipo]).' WHERE idcontratto='.prepare($id_record).' AND idtipointervento='.prepare($id_tipo)); } // ...altrimenti cancello l'eventuale riga else { - $dbo->query('DELETE FROM co_contratti_tipiintervento WHERE idcontratto='.prepare($id_record).' AND idtipointervento='.prepare($idtipointervento)); + $dbo->query('DELETE FROM co_contratti_tipiintervento WHERE idcontratto='.prepare($id_record).' AND idtipointervento='.prepare($id_tipo)); } } } @@ -150,6 +110,42 @@ switch (post('op')) { break; + case 'manage_articolo': + if (post('idriga') != null) { + $articolo = Articolo::find(post('idriga')); + } else { + $originale = ArticoloOriginale::find(post('idarticolo')); + $articolo = Articolo::build($contratto, $originale); + } + + $qta = post('qta'); + + $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 = $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!')); + } + + break; + case 'manage_sconto': if (post('idriga') != null) { $sconto = Sconto::find(post('idriga')); @@ -173,108 +169,72 @@ switch (post('op')) { break; - // Aggiungo una riga al contratto - case 'addriga': - $idiva = post('idiva'); - $idarticolo = post('idarticolo'); - $descrizione = post('descrizione'); + case 'manage_riga': + if (post('idriga') != null) { + $riga = Riga::find(post('idriga')); + } else { + $riga = Riga::build($contratto); + } $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, - ]); + $riga->descrizione = post('descrizione'); + $riga->um = post('um') ?: null; - $subtot = $prezzo * $qta; + $riga->id_iva = post('idiva'); - $um = post('um'); + //$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'); - // Lettura iva dell'articolo - $rs2 = $dbo->fetchArray('SELECT percentuale, descrizione, indetraibile FROM co_iva WHERE id='.prepare($idiva)); - $iva = ($prezzo * $qta - $sconto) / 100 * $rs2[0]['percentuale']; - $iva_indetraibile = $iva / 100 * $rs2[0]['indetraibile']; - $desc_iva = $rs2[0]['descrizione']; + $riga->qta = $qta; - $dbo->query('INSERT INTO co_righe_contratti(idcontratto, idarticolo, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, um, qta, sconto, sconto_unitario, tipo_sconto, is_descrizione, `order`) VALUES ('.prepare($id_record).', '.prepare($idarticolo).', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($subtot).', '.prepare($um).', '.prepare($qta).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).', '.prepare(empty($qta)).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_contratti AS t WHERE idcontratto='.prepare($id_record).'))'); + $riga->save(); - // Messaggi informativi - if (!empty($idarticolo)) { - flash()->info(tr('Articolo aggiunto!')); - } elseif (!empty($qta)) { + if (post('idriga') != null) { + flash()->info(tr('Riga modificata!')); + } else { flash()->info(tr('Riga aggiunta!')); + } + + // Ricalcolo inps, ritenuta e bollo + ricalcola_costiagg_fattura($id_record); + + break; + + case 'manage_descrizione': + if (post('idriga') != null) { + $riga = Descrizione::find(post('idriga')); + } else { + $riga = Descrizione::build($contratto); + } + + $riga->descrizione = post('descrizione'); + + $riga->save(); + + if (post('idriga') != null) { + flash()->info(tr('Riga descrittiva modificata!')); } else { flash()->info(tr('Riga descrittiva aggiunta!')); } break; - case 'editriga': - $idriga = post('idriga'); - - $rs = $dbo->fetchArray("SELECT * FROM co_righe_contratti WHERE id='".$idriga."'"); - $is_descrizione = $rs[0]['is_descrizione']; - - $idarticolo = post('idarticolo'); - $descrizione = post('descrizione'); - - $qta = post('qta'); - $prezzo = post('prezzo'); - $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, - ]); - - $idiva = post('idiva'); - $um = post('um'); - - // Calcolo iva - $query = 'SELECT percentuale, descrizione, 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']; - $desc_iva = $rs[0]['descrizione']; - - // Modifica riga generica sul documento - if ($is_descrizione == 0) { - $query = 'UPDATE co_righe_contratti SET idarticolo='.prepare($idarticolo).', 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 co_righe_contratti SET descrizione='.prepare($descrizione).' WHERE id='.prepare($idriga); - } - $dbo->query($query); - - flash()->info(tr('Riga modificata!')); - - break; - // Eliminazione riga - case 'delriga': - if (post('idriga') !== null) { - $idriga = post('idriga'); + case 'delete_riga': + $id_riga = post('idriga'); + if ($id_riga !== null) { + $riga = Descrizione::find($id_riga) ?: Riga::find($id_riga); + $riga = $riga ? $riga : Articolo::find($id_riga); + $riga = $riga ? $riga : Sconto::find($id_riga); - $query = 'DELETE FROM `co_righe_contratti` WHERE idcontratto='.prepare($id_record).' AND id='.prepare($idriga); + $riga->delete(); - if ($dbo->query($query)) { - flash()->info(tr('Riga eliminata!')); - } + flash()->info(tr('Riga eliminata!')); } - // Ricalcolo il budget - $dbo->query('UPDATE co_contratti SET budget=( SELECT SUM(subtotale) FROM co_righe_contratti GROUP BY idcontratto HAVING idcontratto=co_contratti.id ) WHERE id='.prepare($id_record)); - break; // Scollegamento intervento da contratto @@ -292,16 +252,16 @@ switch (post('op')) { } break; - case 'update_position': - $orders = explode(',', $_POST['order']); - $order = 0; + case 'update_position': + $orders = explode(',', $_POST['order']); + $order = 0; - foreach ($orders as $idriga) { - $dbo->query('UPDATE `co_righe_contratti` SET `order`='.prepare($order).' WHERE id='.prepare($idriga)); - ++$order; - } + foreach ($orders as $idriga) { + $dbo->query('UPDATE `co_righe_contratti` SET `order`='.prepare($order).' WHERE id='.prepare($idriga)); + ++$order; + } - break; + break; // eliminazione contratto case 'delete': diff --git a/modules/contratti/row-add.php b/modules/contratti/row-add.php index 3c9913a42..677af3f51 100644 --- a/modules/contratti/row-add.php +++ b/modules/contratti/row-add.php @@ -9,7 +9,7 @@ $documento = Contratto::find($id_record); // Impostazioni per la gestione $options = [ - 'op' => 'addriga', + 'op' => 'manage_riga', 'action' => 'add', 'dir' => $documento->direzione, 'idanagrafica' => $documento['idanagrafica'], @@ -43,12 +43,15 @@ if ($listino[0]['prc_guadagno'] > 0) { $file = 'riga'; if (get('is_descrizione') !== null) { $file = 'descrizione'; + + $options['op'] = 'manage_descrizione'; } elseif (get('is_articolo') !== null) { $file = 'articolo'; + + $options['op'] = 'manage_articolo'; } elseif (get('is_sconto') !== null) { $file = 'sconto'; $options['op'] = 'manage_sconto'; } - echo App::load($file.'.php', $result, $options); diff --git a/modules/contratti/row-edit.php b/modules/contratti/row-edit.php index 81ea36626..a6e30b656 100644 --- a/modules/contratti/row-edit.php +++ b/modules/contratti/row-edit.php @@ -9,7 +9,7 @@ $documento = Contratto::find($id_record); // Impostazioni per la gestione $options = [ - 'op' => 'editriga', + 'op' => 'manage_riga', 'action' => 'edit', 'dir' => $documento->direzione, 'idanagrafica' => $documento['idanagrafica'], @@ -29,8 +29,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/contratti/row-list.php b/modules/contratti/row-list.php index d308de23e..4df347834 100644 --- a/modules/contratti/row-list.php +++ b/modules/contratti/row-list.php @@ -2,17 +2,15 @@ include_once __DIR__.'/../../core.php'; -/* -ARTICOLI + RIGHE GENERICHE -*/ -$rs = $dbo->fetchArray('SELECT *, round(sconto_unitario,'.setting('Cifre decimali per importi').') AS sconto_unitario, round(sconto,'.setting('Cifre decimali per importi').') AS sconto, round(subtotale,'.setting('Cifre decimali per importi').') AS subtotale, IFNULL((SELECT codice FROM mg_articoli WHERE id=idarticolo), "") AS codice FROM co_righe_contratti WHERE idcontratto='.prepare($id_record).' ORDER BY `order`'); +// Righe documento +$righe = $contratto->getRighe(); echo ' - + @@ -22,79 +20,69 @@ echo ' '; -foreach ($rs as $r) { +foreach ($righe as $riga) { + echo ' + '; + // Descrizione + $descrizione = nl2br($riga->descrizione); + if ($riga->isArticolo()) { + $descrizione = Modules::link('Articoli', $riga->idarticolo, $riga->articolo->codice.' - '.$descrizione); + } echo ' - - '; + + if ($riga->isDescrizione()) { + echo ' + + + + + '; } else { - echo nl2br($r['descrizione']); - } - - echo ' + // Q.tà + echo ' + '; - // Q.tà - echo ' - '; - // um - echo ' - '; + '; - // IVA - echo ' - '; - // Imponibile - echo ' - '; + } // Possibilità di rimuovere una riga solo se il preventivo non è stato pagato echo ' @@ -102,20 +90,14 @@ foreach ($rs as $r) { if ($record['stato'] != 'Pagato') { echo ' - + - - - - + + -
'; - - echo " - - - "; - echo ' +
+ +
'; } @@ -130,42 +112,43 @@ foreach ($rs as $r) {
'; } -// Calcoli -$imponibile = sum(array_column($rs, 'subtotale')); -$sconto = sum(array_column($rs, 'sconto')); -$iva = sum(array_column($rs, 'iva')); +echo ' +'; echo ' '; // SCONTO -if (abs($sconto) > 0) { +if (!empty($contratto->sconto)) { // Totale imponibile scontato echo ' - '; echo ' - '; @@ -173,11 +156,11 @@ if (abs($sconto) > 0) { // Totale imponibile scontato echo ' - '; @@ -185,11 +168,11 @@ if (abs($sconto) > 0) { // Totale imponibile echo ' - '; @@ -198,11 +181,11 @@ if (abs($sconto) > 0) { // Totale iva echo ' - '; @@ -210,11 +193,11 @@ echo ' // Totale contratto echo ' - '; diff --git a/modules/contratti/src/Components/RelationTrait.php b/modules/contratti/src/Components/RelationTrait.php index 0afa4ae3d..aeecfd9f9 100644 --- a/modules/contratti/src/Components/RelationTrait.php +++ b/modules/contratti/src/Components/RelationTrait.php @@ -20,4 +20,12 @@ trait RelationTrait { return $this->parent(); } + + public function delete() + { + $parent = $this->parent; + $parent->save(); + + return parent::delete(); + } } diff --git a/modules/contratti/src/Contratto.php b/modules/contratti/src/Contratto.php index aba1a2b06..89b261862 100644 --- a/modules/contratti/src/Contratto.php +++ b/modules/contratti/src/Contratto.php @@ -137,6 +137,18 @@ class Contratto extends Document return $this->hasMany(Intervento::class, 'id_contratto'); } + public function fixBudget() + { + $this->budget = $this->imponibile_scontato; + } + + public function save(array $options = []) + { + $this->fixBudget(); + + return parent::save($options); + } + // Metodi statici /** diff --git a/modules/fatture/row-list.php b/modules/fatture/row-list.php index 4366592d2..f7bd953c5 100644 --- a/modules/fatture/row-list.php +++ b/modules/fatture/row-list.php @@ -2,9 +2,7 @@ include_once __DIR__.'/../../core.php'; -use Modules\Fatture\Components\Riga; - -// Righe fattura +// Righe documento $righe = $fattura->getRighe(); echo ' diff --git a/modules/fatture/src/Fattura.php b/modules/fatture/src/Fattura.php index da983acf0..f8ab1bcaa 100644 --- a/modules/fatture/src/Fattura.php +++ b/modules/fatture/src/Fattura.php @@ -332,7 +332,7 @@ class Fattura extends Document */ public static function registraScadenza(Fattura $fattura, $importo, $scadenza, $is_pagato, $type = 'fattura') { - //Calcolo la descrizione + // Individuazione della descrizione $descrizione = database()->fetchOne("SELECT CONCAT(co_tipidocumento.descrizione, CONCAT(' numero ', IF(numero_esterno!='', numero_esterno, numero))) AS descrizione FROM co_documenti INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id WHERE co_documenti.id='".$fattura->id."'")['descrizione']; database()->insert('co_scadenziario', [ From 4ecb0f8009fa8f2d4088d48507d3b33641a5814c Mon Sep 17 00:00:00 2001 From: Thomas Zilio Date: Fri, 3 May 2019 21:39:18 -0700 Subject: [PATCH 3/5] Aggiornamento Preventivi --- include/src/Model.php | 5 +- modules/contratti/actions.php | 7 +- modules/contratti/row-add.php | 1 + modules/contratti/row-edit.php | 2 - modules/contratti/row-list.php | 2 +- modules/preventivi/actions.php | 263 +++++++----------- modules/preventivi/modutil.php | 48 ---- modules/preventivi/row-add.php | 6 +- modules/preventivi/row-edit.php | 9 +- modules/preventivi/row-list.php | 184 ++++++------ .../src/Components/RelationTrait.php | 9 + modules/preventivi/src/Preventivo.php | 24 ++ 12 files changed, 236 insertions(+), 324 deletions(-) diff --git a/include/src/Model.php b/include/src/Model.php index cd457b4e1..c9d8c6ba8 100644 --- a/include/src/Model.php +++ b/include/src/Model.php @@ -7,7 +7,10 @@ use Illuminate\Database\Eloquent\Model as Original; abstract class Model extends Original { // Retrocompatibilità MySQL - const UPDATED_AT = null; + public function setUpdatedAtAttribute($value) + { + // to Disable updated_at + } /** * Crea una nuova istanza del modello. diff --git a/modules/contratti/actions.php b/modules/contratti/actions.php index ee1fdb4de..483ac1815 100644 --- a/modules/contratti/actions.php +++ b/modules/contratti/actions.php @@ -198,9 +198,6 @@ switch (post('op')) { flash()->info(tr('Riga aggiunta!')); } - // Ricalcolo inps, ritenuta e bollo - ricalcola_costiagg_fattura($id_record); - break; case 'manage_descrizione': @@ -265,9 +262,9 @@ switch (post('op')) { // eliminazione contratto case 'delete': - $dbo->query('DELETE FROM co_contratti WHERE id='.prepare($id_record)); $dbo->query('DELETE FROM co_promemoria WHERE idcontratto='.prepare($id_record)); - $dbo->query('DELETE FROM co_righe_contratti WHERE idcontratto='.prepare($id_record)); + + $contratto->delete(); flash()->info(tr('Contratto eliminato!')); diff --git a/modules/contratti/row-add.php b/modules/contratti/row-add.php index 677af3f51..1777261ff 100644 --- a/modules/contratti/row-add.php +++ b/modules/contratti/row-add.php @@ -54,4 +54,5 @@ if (get('is_descrizione') !== null) { $options['op'] = 'manage_sconto'; } + echo App::load($file.'.php', $result, $options); diff --git a/modules/contratti/row-edit.php b/modules/contratti/row-edit.php index a6e30b656..4f093f342 100644 --- a/modules/contratti/row-edit.php +++ b/modules/contratti/row-edit.php @@ -23,8 +23,6 @@ $riga = $documento->getRighe()->find($id_riga); $result = $riga->toArray(); $result['prezzo'] = $riga->prezzo_unitario_vendita; -// Importazione della gestione dedicata - // Importazione della gestione dedicata $file = 'riga'; if ($riga->isDescrizione()) { diff --git a/modules/contratti/row-list.php b/modules/contratti/row-list.php index 4df347834..ecf6ee376 100644 --- a/modules/contratti/row-list.php +++ b/modules/contratti/row-list.php @@ -119,7 +119,7 @@ function editRow(id){ } function deleteRow(id){ - if(confirm("'.tr('Rimuovere questa riga dal contratto?').'")){ + if(confirm("'.tr('Rimuovere questa riga dal documento?').'")){ $("#delete-form-" + id).submit(); } } diff --git a/modules/preventivi/actions.php b/modules/preventivi/actions.php index 482b5138b..979973010 100644 --- a/modules/preventivi/actions.php +++ b/modules/preventivi/actions.php @@ -3,6 +3,8 @@ include_once __DIR__.'/../../core.php'; use Modules\Anagrafiche\Anagrafica; +use Modules\Articoli\Articolo as ArticoloOriginale; +use Modules\Preventivi\Components\Descrizione; use Modules\Interventi\TipoSessione; use Modules\Preventivi\Components\Articolo; use Modules\Preventivi\Components\Riga; @@ -29,72 +31,35 @@ switch (post('op')) { case 'update': if (isset($id_record)) { - $idstato = post('idstato'); - $nome = post('nome'); - $idanagrafica = post('idanagrafica'); - $idsede = post('idsede'); - $idagente = post('idagente'); - $idreferente = post('idreferente'); - $idpagamento = post('idpagamento'); - $idporto = post('idporto'); - $tempi_consegna = post('tempi_consegna'); - $numero = post('numero'); + $preventivo->idstato= post('idstato'); + $preventivo->nome= post('nome'); + $preventivo->idanagrafica= post('idanagrafica'); + $preventivo->idsede= post('idsede'); + $preventivo->idagente= post('idagente'); + $preventivo->idreferente= post('idreferente'); + $preventivo->idpagamento= post('idpagamento'); + $preventivo->idporto= post('idporto'); + $preventivo->tempi_consegna= post('tempi_consegna'); + $preventivo->numero= post('numero'); + $preventivo->data_bozza= post('data_bozza'); + $preventivo->data_accettazione= post('data_accettazione'); + $preventivo->data_rifiuto= post('data_rifiuto'); + $preventivo->data_conclusione= post('data_conclusione'); + $preventivo->esclusioni= post('esclusioni'); + $preventivo->descrizione= post('descrizione'); + $preventivo->id_documento_fe= post('id_documento_fe'); + $preventivo->num_item= post('num_item'); + $preventivo->codice_cig= post('codice_cig'); + $preventivo->codice_cup= post('codice_cup'); + $preventivo->validita= post('validita'); + $preventivo->idtipointervento= post('idtipointervento'); + $preventivo->idiva= post('idiva'); - $tipo_sconto = post('tipo_sconto_generico'); - $sconto = post('sconto_generico'); + $preventivo->save(); - // $budget = post('budget'); - // $budget = str_replace( ",", ".", $budget ); - - $data_bozza = post('data_bozza'); - $data_accettazione = post('data_accettazione'); - $data_rifiuto = post('data_rifiuto'); - $data_conclusione = post('data_conclusione'); - $esclusioni = post('esclusioni'); - $descrizione = post('descrizione'); - $validita = post('validita'); - $idtipointervento = post('idtipointervento'); - - // $costo_diritto_chiamata = post('costo_diritto_chiamata'); - // $ore_lavoro = str_replace( ",", ".", post('ore_lavoro') ); - // $costo_orario = post('costo_orario'); - // $costo_km = post('costo_km'); - - $idiva = post('idiva'); - - $id_documento_fe = post('id_documento_fe'); - $num_item = post('num_item'); - $codice_cig = post('codice_cig'); - $codice_cup = post('codice_cup'); - - $query = 'UPDATE co_preventivi SET idstato='.prepare($idstato).','. - ' nome='.prepare($nome).','. - ' idanagrafica='.prepare($idanagrafica).','. - ' idsede='.prepare($idsede).','. - ' idagente='.prepare($idagente).','. - ' idreferente='.prepare($idreferente).','. - ' idpagamento='.prepare($idpagamento).','. - ' idporto='.prepare($idporto).','. - ' tempi_consegna='.prepare($tempi_consegna).','. - ' numero='.prepare($numero).','. - ' data_bozza='.prepare($data_bozza).','. - ' data_accettazione='.prepare($data_accettazione).','. - ' data_rifiuto='.prepare($data_rifiuto).','. - ' data_conclusione='.prepare($data_conclusione).','. - ' esclusioni='.prepare($esclusioni).','. - ' descrizione='.prepare($descrizione).','. - ' id_documento_fe='.prepare($id_documento_fe).','. - ' num_item='.prepare($num_item).','. - ' codice_cig='.prepare($codice_cig).','. - ' codice_cup='.prepare($codice_cup).','. - ' validita='.prepare($validita).','. - ' idtipointervento='.prepare($idtipointervento).','. - ' idiva='.prepare($idiva).' WHERE id='.prepare($id_record); - $dbo->query($query); - - // update_budget_preventivo( $id_record ); flash()->info(tr('Preventivo modificato correttamente!')); } + break; // Duplica preventivo @@ -140,25 +105,6 @@ switch (post('op')) { } break; - // Scollegamento articolo da ordine - case 'unlink_articolo': - if (post('idriga') !== null) { - $idriga = post('idriga'); - $idarticolo = post('idarticolo'); - - // Leggo la quantità di questo articolo nell'ordine - $query = 'SELECT qta, subtotale FROM co_righe_preventivi WHERE id='.prepare($idriga); - $rs = $dbo->fetchArray($query); - $qta = floatval($rs[0]['qta']); - $subtotale = $rs[0]['subtotale']; - - // Elimino la riga dal preventivo - $dbo->query('DELETE FROM co_righe_preventivi WHERE id='.prepare($idriga)); - - flash()->info(tr('Riga rimossa!')); - } - break; - // Scollegamento intervento da preventivo case 'unlink': if (isset($_GET['idpreventivo']) && isset($_GET['idintervento'])) { @@ -174,59 +120,46 @@ switch (post('op')) { } break; - // eliminazione preventivo + // Eliminazione preventivo case 'delete': - $rs_revisioni = $dbo->fetchArray('SELECT master_revision FROM co_preventivi WHERE id='.prepare($id_record)); - - //Cancello preventivo e revisioni - $dbo->query('DELETE FROM co_preventivi WHERE master_revision='.prepare($rs_revisioni[0]['master_revision'])); - - $dbo->update('in_interventi', [ - 'id_preventivo' => null, - ], ['id_preventivo' => $id_record]); + $preventivo->delete(); flash()->info(tr('Preventivo eliminato!')); break; - // Aggiungo una riga al preventivo - case 'addriga': - $idarticolo = post('idarticolo'); - $idiva = post('idiva'); - $descrizione = post('descrizione'); + case 'manage_articolo': + if (post('idriga') != null) { + $articolo = Articolo::find(post('idriga')); + } else { + $originale = ArticoloOriginale::find(post('idarticolo')); + $articolo = Articolo::build($preventivo, $originale); + } $qta = post('qta'); - $prezzo = post('prezzo'); - $prezzo_acquisto = post('prezzo_acquisto'); - // 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->descrizione = post('descrizione'); + $articolo->um = post('um') ?: null; - $subtot = $prezzo * $qta; + $articolo->id_iva = post('idiva'); - $um = post('um'); + //$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'); - // Lettura iva dell'articolo - $rs2 = $dbo->fetchArray('SELECT descrizione, percentuale, indetraibile FROM co_iva WHERE id='.prepare($idiva)); - $iva = ($subtot - $sconto) / 100 * $rs2[0]['percentuale']; - $iva_indetraibile = $iva / 100 * $rs2[0]['indetraibile']; + try { + $articolo->qta = $qta; + } catch (UnexpectedValueException $e) { + flash()->error(tr('Alcuni serial number sono già stati utilizzati!')); + } - $dbo->query('INSERT INTO co_righe_preventivi(idpreventivo, idarticolo, idiva, desc_iva, iva, iva_indetraibile, descrizione, prezzo_unitario_acquisto, subtotale, um, qta, sconto, sconto_unitario, tipo_sconto, is_descrizione, `order`) VALUES ('.prepare($id_record).', '.prepare($idarticolo).', '.prepare($idiva).', '.prepare($rs2[0]['descrizione']).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($prezzo_acquisto).', '.prepare($subtot).', '.prepare($um).', '.prepare($qta).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).', '.prepare(empty($qta)).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_preventivi AS t WHERE idpreventivo='.prepare($id_record).'))'); + $articolo->save(); - // 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!')); } break; @@ -254,62 +187,72 @@ switch (post('op')) { break; - case 'editriga': - $idriga = post('idriga'); - $descrizione = post('descrizione'); - $idarticolo = post('idarticolo'); - //Info riga Preventivo - $rs = $dbo->fetchArray('SELECT * FROM co_righe_preventivi WHERE id='.prepare($idriga)); - $is_descrizione = $rs[0]['is_descrizione']; + case 'manage_riga': + if (post('idriga') != null) { + $riga = Riga::find(post('idriga')); + } else { + $riga = Riga::build($preventivo); + } $qta = post('qta'); - $prezzo = post('prezzo'); - $prezzo_acquisto = post('prezzo_acquisto'); - $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, - ]); + $riga->descrizione = post('descrizione'); + $riga->um = post('um') ?: null; - $idiva = post('idiva'); - $um = post('um'); + $riga->id_iva = post('idiva'); - // Calcolo iva - $rs2 = $dbo->fetchArray('SELECT descrizione, percentuale, indetraibile FROM co_iva WHERE id='.prepare($idiva)); - $iva = ($subtot - $sconto) / 100 * $rs2[0]['percentuale']; - $iva_indetraibile = $iva / 100 * $rs2[0]['indetraibile']; - $desc_iva = $rs2[0]['descrizione']; + //$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'); - if ($is_descrizione == 0) { - // Modifica riga generica sul documento - $query = 'UPDATE co_righe_preventivi SET idarticolo='.prepare($idarticolo).', idiva='.prepare($idiva).', desc_iva='.prepare($desc_iva).', iva='.prepare($iva).', iva_indetraibile='.prepare($iva_indetraibile).', descrizione='.prepare($descrizione).', prezzo_unitario_acquisto='.prepare($prezzo_acquisto).',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); + $riga->qta = $qta; + + $riga->save(); + + if (post('idriga') != null) { + flash()->info(tr('Riga modificata!')); } else { - $query = 'UPDATE co_righe_preventivi SET descrizione='.prepare($descrizione).' WHERE id='.prepare($idriga); + flash()->info(tr('Riga aggiunta!')); } - $dbo->query($query); - flash()->info('Riga modificata!'); break; - case 'update_position': - $orders = explode(',', $_POST['order']); - $order = 0; + case 'manage_descrizione': + if (post('idriga') != null) { + $riga = Descrizione::find(post('idriga')); + } else { + $riga = Descrizione::build($preventivo); + } - foreach ($orders as $idriga) { - $dbo->query('UPDATE `co_righe_preventivi` SET `order`='.prepare($order).' WHERE id='.prepare($idriga)); - ++$order; - } + $riga->descrizione = post('descrizione'); - break; + $riga->save(); + + if (post('idriga') != null) { + flash()->info(tr('Riga descrittiva modificata!')); + } else { + flash()->info(tr('Riga descrittiva aggiunta!')); + } + + break; + + // Eliminazione riga + case 'delete_riga': + $id_riga = post('idriga'); + if ($id_riga !== null) { + $riga = Descrizione::find($id_riga) ?: Riga::find($id_riga); + $riga = $riga ? $riga : Articolo::find($id_riga); + $riga = $riga ? $riga : Sconto::find($id_riga); + + $riga->delete(); + + flash()->info(tr('Riga eliminata!')); + } + + break; case 'add_revision': - //Copio il preventivo $rs_preventivo = $dbo->fetchArray("SELECT * FROM co_preventivi WHERE id='".$id_record."'"); diff --git a/modules/preventivi/modutil.php b/modules/preventivi/modutil.php index d08ff67f1..b2ebefca6 100644 --- a/modules/preventivi/modutil.php +++ b/modules/preventivi/modutil.php @@ -4,27 +4,6 @@ include_once __DIR__.'/../../core.php'; use Modules\Preventivi\Preventivo; -/** - * Questa funzione rimuove un articolo dal ddt data e lo riporta in magazzino - * $idarticolo integer codice dell'articolo da scollegare dall'ordine - * $idordine integer codice dell'ordine da cui scollegare l'articolo. - */ -function rimuovi_articolo_dapreventivo($idarticolo, $idpreventivo, $idriga) -{ - global $dir; - - $dbo = database(); - - // Leggo la quantità di questo articolo nell'ordine - $query = 'SELECT qta, subtotale FROM co_righe_preventivi WHERE id='.prepare($idriga); - $rs = $dbo->fetchArray($query); - $qta = floatval($rs[0]['qta']); - $subtotale = $rs[0]['subtotale']; - - // Elimino la riga dall'ordine - $dbo->query('DELETE FROM co_righe_preventivi WHERE id='.prepare($idriga)); -} - function get_imponibile_preventivo($idpreventivo) { $preventivo = Preventivo::find($idpreventivo); @@ -51,30 +30,3 @@ function get_stato_preventivo($idpreventivo) return 'Non evaso'; } } - -/** - * Aggiorna il budget del preventivo leggendo tutte le righe inserite. - * - * @deprecated 2.3 - */ -function update_budget_preventivo($idpreventivo) -{ - $dbo = database(); - - // Totale articoli - $rs = $dbo->fetchArray('SELECT SUM(subtotale) AS totale FROM co_righe_preventivi GROUP BY idpreventivo HAVING idpreventivo='.prepare($idpreventivo)); - $totale_articoli = $rs[0]['totale']; - - $rs = $dbo->fetchArray('SELECT SUM(sconto*qta) AS totale FROM co_righe_preventivi GROUP BY idpreventivo HAVING idpreventivo='.prepare($idpreventivo)); - $totale_sconto = $rs[0]['totale']; - - $rs = $dbo->fetchArray('SELECT SUM(iva) AS totale FROM co_righe_preventivi GROUP BY idpreventivo HAVING idpreventivo='.prepare($idpreventivo)); - $totale_iva = $rs[0]['totale']; - - // Totale costo ore, km e diritto di chiamata - // $rs = $dbo->fetchArray("SELECT SUM(costo_orario*ore_lavoro + costo_diritto_chiamata) AS totale FROM co_preventivi GROUP BY id HAVING id=\"".$idpreventivo."\""); - // $totale_lavoro = $rs[0]['totale']; - - // Aggiorno il budget su co_preventivi - $dbo->query('UPDATE co_preventivi SET budget='.prepare(($totale_articoli - $totale_sconto) + $totale_iva).' WHERE id='.prepare($idpreventivo)); -} diff --git a/modules/preventivi/row-add.php b/modules/preventivi/row-add.php index 0e4f46ebf..ba7f0406d 100644 --- a/modules/preventivi/row-add.php +++ b/modules/preventivi/row-add.php @@ -9,7 +9,7 @@ $documento = Preventivo::find($id_record); // Impostazioni per la gestione $options = [ - 'op' => 'addriga', + 'op' => 'manage_riga', 'action' => 'add', 'dir' => $documento->direzione, 'idanagrafica' => $documento['idanagrafica'], @@ -43,8 +43,12 @@ if ($listino[0]['prc_guadagno'] > 0) { $file = 'riga'; if (get('is_descrizione') !== null) { $file = 'descrizione'; + + $options['op'] = 'manage_descrizione'; } elseif (get('is_articolo') !== null) { $file = 'articolo'; + + $options['op'] = 'manage_articolo'; } elseif (get('is_sconto') !== null) { $file = 'sconto'; diff --git a/modules/preventivi/row-edit.php b/modules/preventivi/row-edit.php index c91fb8ae6..a9d3b90b8 100644 --- a/modules/preventivi/row-edit.php +++ b/modules/preventivi/row-edit.php @@ -9,7 +9,7 @@ $documento = Preventivo::find($id_record); // Impostazioni per la gestione $options = [ - 'op' => 'editriga', + 'op' => 'manage_riga', 'action' => 'edit', 'dir' => $documento->direzione, 'idanagrafica' => $documento['idanagrafica'], @@ -23,18 +23,19 @@ $riga = $documento->getRighe()->find($id_riga); $result = $riga->toArray(); $result['prezzo'] = $riga->prezzo_unitario_vendita; -// Importazione della gestione dedicata - // Importazione della gestione dedicata $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/preventivi/row-list.php b/modules/preventivi/row-list.php index acec870a7..695ba7477 100644 --- a/modules/preventivi/row-list.php +++ b/modules/preventivi/row-list.php @@ -2,11 +2,8 @@ include_once __DIR__.'/../../core.php'; -/* -ARTICOLI + RIGHE GENERICHE -*/ -$q_art = 'SELECT *, round(sconto_unitario,'.setting('Cifre decimali per importi').') AS sconto_unitario, round(sconto,'.setting('Cifre decimali per importi').') AS sconto, round(subtotale,'.setting('Cifre decimali per importi').') AS subtotale, IFNULL((SELECT codice FROM mg_articoli WHERE id=idarticolo), "") AS codice FROM co_righe_preventivi WHERE idpreventivo='.prepare($id_record).' ORDER BY `order`'; -$rs = $dbo->fetchArray($q_art); +// Righe documento +$righe = $preventivo->getRighe(); echo '
'.tr('Descrizione').''.tr('Q.tà').''.tr('Q.tà').' '.tr('Q.tà').' '.tr('U.m.').' '.tr('Costo unitario').' '.tr('Iva').'
'; - if (!empty($r['idarticolo'])) { - echo Modules::link('Articoli', $r['idarticolo'], $r['codice'].' - '.$r['descrizione']); + + '.$descrizione.' + + '.Translator::numberToLocale($riga->qta_rimanente, 'qta').' / '.Translator::numberToLocale($riga->qta, 'qta').' '; - - if (empty($r['is_descrizione'])) { + // Unità di misura echo ' - '.Translator::numberToLocale($r['qta'] - $r['qta_evasa'], 'qta').' / '.Translator::numberToLocale($r['qta'], 'qta').''; - } - echo ' + + '.$riga->um.' '; - if (empty($r['is_descrizione'])) { + // Costo unitario echo ' - '.$r['um']; - } - echo ' - + '.moneyFormat($riga->prezzo_unitario_vendita); - // Costo unitario - echo ' - '; - if (empty($r['is_descrizione'])) { - echo ' - '.moneyFormat($r['subtotale'] / $r['qta']); - - if ($r['sconto_unitario'] > 0) { + if ($riga->sconto_unitario > 0) { echo ' -
'.tr('sconto _TOT_ _TYPE_', [ - '_TOT_' => Translator::numberToLocale($r['sconto_unitario']), - '_TYPE_' => ($r['tipo_sconto'] == 'PRC' ? '%' : currency()), +
'.tr('sconto _TOT_ _TYPE_', [ + '_TOT_' => Translator::numberToLocale($riga->sconto_unitario), + '_TYPE_' => ($riga->tipo_sconto == 'PRC' ? '%' : currency()), ]).''; } - } - echo' + + echo'
'; - if (empty($r['is_descrizione'])) { + // IVA echo ' - '.moneyFormat($r['iva'])."
- ".$r['desc_iva'].''; - } - echo ' +
+ '.moneyFormat($riga->iva).'
+ '.$riga->aliquota->descrizione.(($riga->aliquota->esente) ? ' ('.$riga->aliquota->codice_natura_fe.')' : null).'
'; - if (empty($r['is_descrizione'])) { + // Imponibile echo ' - '.moneyFormat($r['subtotale'] - $r['sconto']); - } - echo ' + + '.moneyFormat($riga->imponibile_scontato).'
+ '.tr('Imponibile', [], ['upper' => true]).': - '.moneyFormat($imponibile, 2).' + '.moneyFormat($contratto->imponibile, 2).'
+ '.tr('Sconto', [], ['upper' => true]).': - '.moneyFormat($sconto, 2).' + '.moneyFormat($contratto->sconto, 2).'
+ '.tr('Imponibile scontato', [], ['upper' => true]).': - '.moneyFormat($imponibile_scontato, 2).' + '.moneyFormat($contratto->imponibile_scontato, 2).'
+ '.tr('Imponibile', [], ['upper' => true]).': - '.moneyFormat($imponibile, 2).' + '.moneyFormat($contratto->imponibile, 2).'
+ '.tr('Iva', [], ['upper' => true]).': - '.moneyFormat($iva, 2).' + '.moneyFormat($contratto->iva, 2).'
+ '.tr('Totale', [], ['upper' => true]).': - '.moneyFormat($totale, 2).' + '.moneyFormat($contratto->totale, 2).'
@@ -15,7 +12,7 @@ echo ' - + @@ -23,77 +20,68 @@ echo ' '; -// se ho almeno un articolo caricato mostro la riga -foreach ($rs as $r) { +foreach ($righe as $riga) { echo ' - - '; - if (!empty($r['idarticolo'])) { - echo Modules::link('Articoli', $r['idarticolo'], $r['codice'].' - '.$r['descrizione']); + // Descrizione + $descrizione = nl2br($riga->descrizione); + if ($riga->isArticolo()) { + $descrizione = Modules::link('Articoli', $riga->idarticolo, $riga->articolo->codice.' - '.$descrizione); + } + echo ' + '; + + if ($riga->isDescrizione()) { + echo ' + + + + + '; } else { - echo nl2br($r['descrizione']); - } - - echo ' + // Q.tà + echo ' + '; - // q.tà - echo ' - '; - // um - echo ' - '; + '; - // iva - echo ' - '; - // Imponibile - echo ' - '; } // Possibilità di rimuovere una riga solo se il preventivo non è stato pagato @@ -101,19 +89,17 @@ foreach ($rs as $r) { '; } -// Calcoli -$totale_acquisto = 0; -foreach ($rs as $r) { - $totale_acquisto += ($r['prezzo_unitario_acquisto'] * $r['qta']); +echo ' +'; echo ' '; // SCONTO -if (abs($sconto) > 0) { +if (!empty($preventivo->sconto)) { + // Totale imponibile scontato echo ' - '; @@ -167,20 +147,20 @@ if (abs($sconto) > 0) { - '; - // Totale imponibile + // Totale imponibile scontato echo ' - '; @@ -191,8 +171,8 @@ if (abs($sconto) > 0) { - '; @@ -202,22 +182,22 @@ if (abs($sconto) > 0) { echo ' - '; -// Totale preventivo +// Totale contratto echo ' - '; @@ -241,7 +221,7 @@ $(document).ready(function(){ order += ","+$(this).data("id"); }); order = order.replace(/^,/, ""); - + $.post("'.$rootdir.'/actions.php", { id: ui.item.data("id"), id_module: '.$id_module.', diff --git a/modules/preventivi/src/Components/RelationTrait.php b/modules/preventivi/src/Components/RelationTrait.php index 64826346a..bb07c250a 100644 --- a/modules/preventivi/src/Components/RelationTrait.php +++ b/modules/preventivi/src/Components/RelationTrait.php @@ -20,4 +20,13 @@ trait RelationTrait { return $this->parent(); } + + public function delete() + { + $parent = $this->parent; + $parent->save(); + + return parent::delete(); + } + } diff --git a/modules/preventivi/src/Preventivo.php b/modules/preventivi/src/Preventivo.php index ca9d8b41e..e1eb9fb50 100644 --- a/modules/preventivi/src/Preventivo.php +++ b/modules/preventivi/src/Preventivo.php @@ -131,6 +131,30 @@ class Preventivo extends Document return $this->hasMany(Intervento::class, 'id_preventivo'); } + public function fixBudget() + { + $this->budget = $this->imponibile_scontato; + } + + public function save(array $options = []) + { + $this->fixBudget(); + + return parent::save($options); + } + + public function delete() + { + $this->interventi()->update(['id_preventivo' => null]); + $revision = $this->master_revision; + + $result = parent::delete(); + + self::where('master_revision', $revision)->delete(); + + return $result; + } + // Metodi statici /** From 81a834ef4b4a51fb332d907c6cc659ff295876ac Mon Sep 17 00:00:00 2001 From: Thomas Zilio Date: Fri, 3 May 2019 21:41:56 -0700 Subject: [PATCH 4/5] Stile del codice --- modules/preventivi/actions.php | 48 +++++++++---------- .../src/Components/RelationTrait.php | 1 - modules/preventivi/src/Preventivo.php | 2 +- 3 files changed, 25 insertions(+), 26 deletions(-) diff --git a/modules/preventivi/actions.php b/modules/preventivi/actions.php index 979973010..addbc2f3f 100644 --- a/modules/preventivi/actions.php +++ b/modules/preventivi/actions.php @@ -4,9 +4,9 @@ include_once __DIR__.'/../../core.php'; use Modules\Anagrafiche\Anagrafica; use Modules\Articoli\Articolo as ArticoloOriginale; -use Modules\Preventivi\Components\Descrizione; use Modules\Interventi\TipoSessione; use Modules\Preventivi\Components\Articolo; +use Modules\Preventivi\Components\Descrizione; use Modules\Preventivi\Components\Riga; use Modules\Preventivi\Components\Sconto; use Modules\Preventivi\Preventivo; @@ -31,29 +31,29 @@ switch (post('op')) { case 'update': if (isset($id_record)) { - $preventivo->idstato= post('idstato'); - $preventivo->nome= post('nome'); - $preventivo->idanagrafica= post('idanagrafica'); - $preventivo->idsede= post('idsede'); - $preventivo->idagente= post('idagente'); - $preventivo->idreferente= post('idreferente'); - $preventivo->idpagamento= post('idpagamento'); - $preventivo->idporto= post('idporto'); - $preventivo->tempi_consegna= post('tempi_consegna'); - $preventivo->numero= post('numero'); - $preventivo->data_bozza= post('data_bozza'); - $preventivo->data_accettazione= post('data_accettazione'); - $preventivo->data_rifiuto= post('data_rifiuto'); - $preventivo->data_conclusione= post('data_conclusione'); - $preventivo->esclusioni= post('esclusioni'); - $preventivo->descrizione= post('descrizione'); - $preventivo->id_documento_fe= post('id_documento_fe'); - $preventivo->num_item= post('num_item'); - $preventivo->codice_cig= post('codice_cig'); - $preventivo->codice_cup= post('codice_cup'); - $preventivo->validita= post('validita'); - $preventivo->idtipointervento= post('idtipointervento'); - $preventivo->idiva= post('idiva'); + $preventivo->idstato = post('idstato'); + $preventivo->nome = post('nome'); + $preventivo->idanagrafica = post('idanagrafica'); + $preventivo->idsede = post('idsede'); + $preventivo->idagente = post('idagente'); + $preventivo->idreferente = post('idreferente'); + $preventivo->idpagamento = post('idpagamento'); + $preventivo->idporto = post('idporto'); + $preventivo->tempi_consegna = post('tempi_consegna'); + $preventivo->numero = post('numero'); + $preventivo->data_bozza = post('data_bozza'); + $preventivo->data_accettazione = post('data_accettazione'); + $preventivo->data_rifiuto = post('data_rifiuto'); + $preventivo->data_conclusione = post('data_conclusione'); + $preventivo->esclusioni = post('esclusioni'); + $preventivo->descrizione = post('descrizione'); + $preventivo->id_documento_fe = post('id_documento_fe'); + $preventivo->num_item = post('num_item'); + $preventivo->codice_cig = post('codice_cig'); + $preventivo->codice_cup = post('codice_cup'); + $preventivo->validita = post('validita'); + $preventivo->idtipointervento = post('idtipointervento'); + $preventivo->idiva = post('idiva'); $preventivo->save(); diff --git a/modules/preventivi/src/Components/RelationTrait.php b/modules/preventivi/src/Components/RelationTrait.php index bb07c250a..30de2c97b 100644 --- a/modules/preventivi/src/Components/RelationTrait.php +++ b/modules/preventivi/src/Components/RelationTrait.php @@ -28,5 +28,4 @@ trait RelationTrait return parent::delete(); } - } diff --git a/modules/preventivi/src/Preventivo.php b/modules/preventivi/src/Preventivo.php index e1eb9fb50..3f7f50ee7 100644 --- a/modules/preventivi/src/Preventivo.php +++ b/modules/preventivi/src/Preventivo.php @@ -148,7 +148,7 @@ class Preventivo extends Document $this->interventi()->update(['id_preventivo' => null]); $revision = $this->master_revision; - $result = parent::delete(); + $result = parent::delete(); self::where('master_revision', $revision)->delete(); From bc5a0d3dfaa1266c0870273775fc22a211fba9ab Mon Sep 17 00:00:00 2001 From: Thomas Zilio Date: Thu, 16 May 2019 21:27:26 -0700 Subject: [PATCH 5/5] Miglioramento movimentazioni --- include/src/Components/Article.php | 22 +++++++++++- include/src/Components/Description.php | 34 +++++++++++-------- modules/contratti/src/Components/Articolo.php | 4 ++- modules/ddt/src/Components/Articolo.php | 2 +- modules/fatture/src/Components/Articolo.php | 2 +- .../interventi/src/Components/Articolo.php | 2 +- modules/ordini/src/Components/Articolo.php | 6 ++-- .../preventivi/src/Components/Articolo.php | 4 ++- 8 files changed, 53 insertions(+), 23 deletions(-) diff --git a/include/src/Components/Article.php b/include/src/Components/Article.php index f24dcbd7a..babeaf4ac 100644 --- a/include/src/Components/Article.php +++ b/include/src/Components/Article.php @@ -9,6 +9,7 @@ use UnexpectedValueException; abstract class Article extends Row { + public $movimenta_magazzino = true; protected $serialRowID = null; protected $abilita_movimentazione = true; @@ -27,7 +28,24 @@ abstract class Article extends Row return $model; } - abstract public function movimenta($qta); + public function movimenta($qta) + { + if (!$this->movimenta_magazzino) { + return; + } + + $movimenta = true; + + // Movimenta il magazzino solo se l'articolo non è già stato movimentato da un documento precedente + if ($this->hasOriginal()) { + $original = $this->getOriginal(); + $movimenta = !$original->movimenta_magazzino; + } + + if ($movimenta) { + $this->movimentaMagazzino($qta); + } + } abstract public function getDirection(); @@ -124,6 +142,8 @@ abstract class Article extends Row return parent::save($options); } + abstract protected function movimentaMagazzino($qta); + protected static function boot() { parent::boot(true); diff --git a/include/src/Components/Description.php b/include/src/Components/Description.php index 5e119aeaa..db1599ae0 100644 --- a/include/src/Components/Description.php +++ b/include/src/Components/Description.php @@ -38,9 +38,23 @@ abstract class Description extends Model $previous = $this->qta; $diff = $value - $previous; + if ($this->hasOriginal()) { + $original = $this->getOriginal(); + + if ($original->qta_rimanente < $diff) { + $diff = $original->qta_rimanente; + $value = $previous + $diff; + } + } + $this->attributes['qta'] = $value; - $this->evasione(-$diff); + if ($this->hasOriginal()) { + $original = $this->getOriginal(); + + $original->qta_evasa += $diff; + $original->save(); + } return $diff; } @@ -57,7 +71,7 @@ abstract class Description extends Model public function delete() { - $this->evasione(-$this->qta); + $this->qta = 0; return parent::delete(); } @@ -110,6 +124,9 @@ abstract class Description extends Model // Creazione del nuovo oggetto $model = new $object(); + $model->original_id = $this->id; + $model->original_type = $current; + // Azioni specifiche di inizalizzazione $model->customInitCopiaIn($this); @@ -131,9 +148,6 @@ abstract class Description extends Model // Azioni specifiche successive $model->customAfterDataCopiaIn($this); - $model->original_id = $this->id; - $model->original_type = $current; - $model->save(); return $model; @@ -163,16 +177,6 @@ abstract class Description extends Model return $this instanceof Article; } - protected function evasione($diff) - { - if ($this->hasOriginal()) { - $original = $this->getOriginal(); - - $original->qta_evasa -= $diff; - $original->save(); - } - } - /** * Azione personalizzata per la copia dell'oggetto (inizializzazione della copia). * diff --git a/modules/contratti/src/Components/Articolo.php b/modules/contratti/src/Components/Articolo.php index fe73e1d22..9e7a8be96 100644 --- a/modules/contratti/src/Components/Articolo.php +++ b/modules/contratti/src/Components/Articolo.php @@ -10,6 +10,8 @@ class Articolo extends Article { use RelationTrait; + public $movimenta_magazzino = false; + protected $table = 'co_righe_contratti'; /** @@ -27,7 +29,7 @@ class Articolo extends Article return $model; } - public function movimenta($qta) + public function movimentaMagazzino($qta) { return; } diff --git a/modules/ddt/src/Components/Articolo.php b/modules/ddt/src/Components/Articolo.php index 6f7a94c29..abb2fd4f9 100644 --- a/modules/ddt/src/Components/Articolo.php +++ b/modules/ddt/src/Components/Articolo.php @@ -28,7 +28,7 @@ class Articolo extends Article return $model; } - public function movimenta($qta) + public function movimentaMagazzino($qta) { $ddt = $this->ddt; $tipo = $ddt->tipo; diff --git a/modules/fatture/src/Components/Articolo.php b/modules/fatture/src/Components/Articolo.php index 861294704..f8c1df202 100644 --- a/modules/fatture/src/Components/Articolo.php +++ b/modules/fatture/src/Components/Articolo.php @@ -28,7 +28,7 @@ class Articolo extends Article return $model; } - public function movimenta($qta) + public function movimentaMagazzino($qta) { // Se il documento è generato da un ddt o intervento allora **non** movimento il magazzino if (!empty($this->idddt) || !empty($this->idintervento)) { diff --git a/modules/interventi/src/Components/Articolo.php b/modules/interventi/src/Components/Articolo.php index 5ad4c58d2..134f2349b 100644 --- a/modules/interventi/src/Components/Articolo.php +++ b/modules/interventi/src/Components/Articolo.php @@ -35,7 +35,7 @@ class Articolo extends Article return $model; } - public function movimenta($qta) + public function movimentaMagazzino($qta) { $articolo = $this->articolo; $id_automezzo = $this->intervento->idautomezzo; diff --git a/modules/ordini/src/Components/Articolo.php b/modules/ordini/src/Components/Articolo.php index 33825192f..246ada263 100644 --- a/modules/ordini/src/Components/Articolo.php +++ b/modules/ordini/src/Components/Articolo.php @@ -10,6 +10,8 @@ class Articolo extends Article { use RelationTrait; + public $movimenta_magazzino = false; + protected $table = 'or_righe_ordini'; protected $serialRowID = 'ordine'; @@ -28,9 +30,9 @@ class Articolo extends Article return $model; } - public function movimenta($qta) + public function movimentaMagazzino($qta) { - return true; + return; } public function getDirection() diff --git a/modules/preventivi/src/Components/Articolo.php b/modules/preventivi/src/Components/Articolo.php index 273c06cc1..b97ec0947 100644 --- a/modules/preventivi/src/Components/Articolo.php +++ b/modules/preventivi/src/Components/Articolo.php @@ -10,6 +10,8 @@ class Articolo extends Article { use RelationTrait; + public $movimenta_magazzino = false; + protected $table = 'co_righe_preventivi'; /** @@ -27,7 +29,7 @@ class Articolo extends Article return $model; } - public function movimenta($qta) + public function movimentaMagazzino($qta) { return; }
'.tr('Descrizione').' '.tr('Q.tà').' '.tr('U.m.').''.tr('Prezzo unitario').''.tr('Costo unitario').' '.tr('Iva').' '.tr('Imponibile').'
'; +
+ '.$descrizione.' + + '.Translator::numberToLocale($riga->qta_rimanente, 'qta').' / '.Translator::numberToLocale($riga->qta, 'qta').' '; - if (empty($r['is_descrizione'])) { + // Unità di misura echo ' - '.Translator::numberToLocale($r['qta'] - $r['qta_evasa'], 'qta').' / '.Translator::numberToLocale($r['qta'], 'qta').''; - } - echo ' + + '.$riga->um.' '; - if (empty($r['is_descrizione'])) { + // Costo unitario echo ' - '.$r['um']; - } - echo ' - + '.moneyFormat($riga->prezzo_unitario_vendita); - // prezzo di vendita unitario - echo ' - '; - if (empty($r['is_descrizione'])) { - echo ' - '.moneyFormat($r['subtotale'] / $r['qta']); - - if ($r['sconto_unitario'] > 0) { + if ($riga->sconto_unitario > 0) { echo ' -
'.tr('sconto _TOT_ _TYPE_', [ - '_TOT_' => Translator::numberToLocale($r['sconto_unitario']), - '_TYPE_' => ($r['tipo_sconto'] == 'PRC' ? '%' : currency()), +
'.tr('sconto _TOT_ _TYPE_', [ + '_TOT_' => Translator::numberToLocale($riga->sconto_unitario), + '_TYPE_' => ($riga->tipo_sconto == 'PRC' ? '%' : currency()), ]).''; } - } - echo ' + echo'
'; - if (empty($r['is_descrizione'])) { + // IVA echo ' - '.moneyFormat($r['iva']).' -
'.$r['desc_iva'].''; - } - echo' +
+ '.moneyFormat($riga->iva).'
+ '.$riga->aliquota->descrizione.(($riga->aliquota->esente) ? ' ('.$riga->aliquota->codice_natura_fe.')' : null).'
'; - if (empty($r['is_descrizione'])) { + // Imponibile echo ' - '.moneyFormat($r['subtotale'] - $r['sconto']); + + '.moneyFormat($riga->imponibile_scontato).' + '; if ($record['stato'] != 'Pagato') { - echo " -
- - - - + echo ' + + + + -
- - - +
+ +
- "; + '; } echo ' @@ -126,38 +112,32 @@ foreach ($rs as $r) {
'.tr('Imponibile', [], ['upper' => true]).': - '.moneyFormat($imponibile, 2).' + + '.moneyFormat($preventivo->imponibile, 2).'
'.tr('Sconto', [], ['upper' => true]).': - '.moneyFormat($sconto, 2).' + + '.moneyFormat($preventivo->sconto, 2).'
'.tr('Imponibile scontato', [], ['upper' => true]).': - '.moneyFormat($imponibile_scontato, 2).' + + '.moneyFormat($preventivo->imponibile_scontato, 2).'
'.tr('Imponibile', [], ['upper' => true]).': - '.moneyFormat($imponibile, 2).' + + '.moneyFormat($preventivo->imponibile, 2).'
- '.tr('IVA', [], ['upper' => true]).': + '.tr('Iva', [], ['upper' => true]).': - '.moneyFormat($iva, 2).' + + '.moneyFormat($preventivo->iva, 2).'
'.tr('Totale', [], ['upper' => true]).': - '.moneyFormat($totale, 2).' + + '.moneyFormat($preventivo->totale, 2).'