From 214288c063d7ea5bb3248bd18aedb05c915e78ab Mon Sep 17 00:00:00 2001 From: Thomas Zilio Date: Sat, 19 Jan 2019 10:33:57 +0100 Subject: [PATCH] Gestione Contratti tramite Eloquent --- config/namespaces.php | 1 + core.php | 2 +- modules/contratti/actions.php | 38 ++--- modules/contratti/src/Components/Articolo.php | 58 +++++++ .../contratti/src/Components/Descrizione.php | 27 +++ .../src/Components/RelationTrait.php | 23 +++ modules/contratti/src/Components/Riga.php | 27 +++ modules/contratti/src/Components/Sconto.php | 33 ++++ modules/contratti/src/Contratto.php | 157 ++++++++++++++++++ modules/contratti/src/Stato.php | 15 ++ modules/ddt/actions.php | 2 +- modules/ordini/actions.php | 2 +- src/Extensions/MessageHandler.php | 2 +- src/HTMLBuilder/HTMLBuilder.php | 27 ++- 14 files changed, 381 insertions(+), 33 deletions(-) create mode 100644 modules/contratti/src/Components/Articolo.php create mode 100644 modules/contratti/src/Components/Descrizione.php create mode 100644 modules/contratti/src/Components/RelationTrait.php create mode 100644 modules/contratti/src/Components/Riga.php create mode 100644 modules/contratti/src/Components/Sconto.php create mode 100644 modules/contratti/src/Contratto.php create mode 100644 modules/contratti/src/Stato.php diff --git a/config/namespaces.php b/config/namespaces.php index d6c157fb6..d8c5086db 100644 --- a/config/namespaces.php +++ b/config/namespaces.php @@ -10,6 +10,7 @@ return [ 'modules/fatture' => 'Modules\Fatture', 'modules/ordini' => 'Modules\Ordini', 'modules/preventivi' => 'Modules\Preventivi', + 'modules/contratti' => 'Modules\Contratti', 'modules/interventi' => 'Modules\Interventi', 'plugins/exportFE' => 'Plugins\ExportFE', 'plugins/importFE' => 'Plugins\ImportFE', diff --git a/core.php b/core.php index 30f6a9eac..e29f09032 100644 --- a/core.php +++ b/core.php @@ -117,7 +117,7 @@ if (App::debug()) { 'message' => $exception->getMessage(), 'file' => $exception->getFile(), 'line' => $exception->getLine(), - 'trace' => null, + 'trace' => $exception->getTraceAsString(), ]); }); } diff --git a/modules/contratti/actions.php b/modules/contratti/actions.php index 89d8f0534..496e8e9f2 100644 --- a/modules/contratti/actions.php +++ b/modules/contratti/actions.php @@ -2,40 +2,24 @@ include_once __DIR__.'/../../core.php'; +use Modules\Anagrafiche\Anagrafica; +use Modules\Contratti\Components\Articolo; +use Modules\Contratti\Components\Riga; +use Modules\Contratti\Contratto; + switch (post('op')) { case 'add': $idanagrafica = post('idanagrafica'); $nome = post('nome'); - // Verifico se c'è già un agente collegato all'anagrafica cliente, così lo imposto già - $q = 'SELECT idagente FROM an_anagrafiche WHERE idanagrafica='.prepare($idanagrafica); - $rs = $dbo->fetchArray($q); - $idagente = $rs[0]['idagente']; + $anagrafica = Anagrafica::find($idanagrafica); - // Codice contratto: calcolo il successivo in base al formato specificato - $rs = $dbo->fetchArray('SELECT numero FROM co_contratti ORDER BY id DESC LIMIT 0,1'); - $numero = Util\Generator::generate(setting('Formato codice contratti'), $rs[0]['numero']); + $contratto = Contratto::build($anagrafica, $nome); + $id_record = $contratto->id; - // Uso il tipo di pagamento specificato in anagrafica se c'è, altrimenti quello di default - $rsa = $dbo->fetchArray('SELECT idpagamento_vendite AS idpagamento FROM an_anagrafiche WHERE idanagrafica='.prepare($idanagrafica)); - - $idpagamento = (!empty($rsa[0]['idpagamento'])) ? $rsa[0]['idpagamento'] : setting('Tipo di pagamento predefinito'); - - if (post('idanagrafica') !== null) { - $dbo->query('INSERT INTO co_contratti(idanagrafica, nome, numero, idagente, idpagamento, idstato, data_bozza) VALUES ('.prepare($idanagrafica).', '.prepare($nome).', '.prepare($numero).', '.prepare($idagente).', '.prepare($idpagamento).", (SELECT `id` FROM `co_staticontratti` WHERE `descrizione`='Bozza'), NOW())"); - $id_record = $dbo->lastInsertedID(); - - // Aggiunta associazioni costi unitari al contratto - $rsi = $dbo->fetchArray('SELECT * FROM in_tipiintervento WHERE (costo_orario!=0 OR costo_km!=0 OR costo_diritto_chiamata!=0)'); - - for ($i = 0; $i < sizeof($rsi); ++$i) { - $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($rsi[$i]['idtipointervento']).', '.prepare($rsi[$i]['costo_orario']).', '.prepare($rsi[$i]['costo_km']).', '.prepare($rsi[$i]['costo_diritto_chiamata']).', '.prepare($rsi[$i]['costo_orario_tecnico']).', '.prepare($rsi[$i]['costo_km_tecnico']).', '.prepare($rsi[$i]['costo_diritto_chiamata_tecnico']).')'); - } - - flash()->info(tr('Aggiunto contratto numero _NUM_!', [ - '_NUM_' => $numero, - ])); - } + flash()->info(tr('Aggiunto contratto numero _NUM_!', [ + '_NUM_' => $contratto['numero'], + ])); break; diff --git a/modules/contratti/src/Components/Articolo.php b/modules/contratti/src/Components/Articolo.php new file mode 100644 index 000000000..718e14057 --- /dev/null +++ b/modules/contratti/src/Components/Articolo.php @@ -0,0 +1,58 @@ +contratto; + $tipo = $contratto->tipo; + + $numero = $contratto->numero_esterno ?: $contratto->numero; + $data = $contratto->data; + + $carico = ($tipo->dir == 'entrata') ? tr('Ripristino articolo da _TYPE_ _NUM_') : tr('Carico magazzino da _TYPE_ numero _NUM_'); + $scarico = ($tipo->dir == 'entrata') ? tr('Scarico magazzino per _TYPE_ numero _NUM_') : tr('Rimozione articolo da _TYPE_ _NUM_'); + + $qta = ($tipo->dir == 'uscita') ? -$qta : $qta; + $movimento = ($qta < 0) ? $carico : $scarico; + + $movimento = replace($movimento, [ + '_TYPE_' => $tipo->descrizione, + '_NUM_' => $numero, + ]); + + $this->articolo->movimenta(-$qta, $movimento, $data, false, [ + 'iddocumento' => $contratto->id, + ]); + } + + public function getDirection() + { + return $this->contratto->tipo->dir; + } +} diff --git a/modules/contratti/src/Components/Descrizione.php b/modules/contratti/src/Components/Descrizione.php new file mode 100644 index 000000000..f5e83f131 --- /dev/null +++ b/modules/contratti/src/Components/Descrizione.php @@ -0,0 +1,27 @@ +belongsTo(Contratto::class, $this->getParentID()); + } + + public function contratto() + { + return $this->parent(); + } +} diff --git a/modules/contratti/src/Components/Riga.php b/modules/contratti/src/Components/Riga.php new file mode 100644 index 000000000..b9df4a0d2 --- /dev/null +++ b/modules/contratti/src/Components/Riga.php @@ -0,0 +1,27 @@ +scontoGlobale; + + if ($model == null) { + $model = parent::build(); + + $model->setContratto($contratto); + } + + return $model; + } +} diff --git a/modules/contratti/src/Contratto.php b/modules/contratti/src/Contratto.php new file mode 100644 index 000000000..7072005a9 --- /dev/null +++ b/modules/contratti/src/Contratto.php @@ -0,0 +1,157 @@ +first(); + + $id_anagrafica = $anagrafica->id; + $id_agente = $anagrafica->idagente; + + $id_pagamento = $anagrafica->idpagamento_vendite; + if (empty($id_pagamento)) { + $id_pagamento = setting('Tipo di pagamento predefinito'); + } + + $model->anagrafica()->associate($anagrafica); + $model->stato()->associate($stato_documento); + + $model->numero = static::getNextNumero(); + + // Salvataggio delle informazioni + $model->nome = $nome; + $model->data_bozza = Carbon::now(); + + if (!empty($id_agente)) { + $model->idagente = $id_agente; + } + + if (!empty($id_pagamento)) { + $model->idpagamento = $id_pagamento; + } + + $model->save(); + + $model->fixTipiSessioni(); + + return $model; + } + + public function fixTipiSessioni() + { + $database = database(); + $database->query('DELETE FROM co_contratti_tipiintervento WHERE idcontratto = '.prepare($this->id)); + + // Aggiunta associazioni costi unitari al contratto + $tipi = TipoSessione::where('costo_orario', '<>', 0) + ->where('costo_km', '<>', 0) + ->where('costo_diritto_chiamata', '<>', 0) + ->get(); + + foreach ($tipi as $tipo) { + $database->insert('co_contratti_tipiintervento', [ + 'idcontratto' => $this->id, + 'idtipointervento' => $tipo->id, + 'costo_ore' => $tipo->costo_orario, + 'costo_km' => $tipo->costo_km, + 'costo_dirittochiamata' => $tipo->costo_diritto_chiamata, + 'costo_ore_tecnico' => $tipo->costo_orario_tecnico, + 'costo_km_tecnico' => $tipo->costo_km_tecnico, + 'costo_dirittochiamata_tecnico' => $tipo->costo_diritto_chiamata_tecnico, + ]); + } + } + + /** + * Restituisce il nome del modulo a cui l'oggetto è collegato. + * + * @return string + */ + public function getModuleAttribute() + { + return 'Contratti'; + } + + public function updateSconto() + { + // Aggiornamento sconto + aggiorna_sconto([ + 'parent' => 'co_preventivi', + 'row' => 'co_righe_preventivi', + ], [ + 'parent' => 'id', + 'row' => 'idcontratto', + ], $this->id); + } + + public function anagrafica() + { + return $this->belongsTo(Anagrafica::class, 'idanagrafica'); + } + + public function stato() + { + return $this->belongsTo(Stato::class, 'idstato'); + } + + public function articoli() + { + return $this->hasMany(Components\Articolo::class, 'idcontratto'); + } + + public function righe() + { + return $this->hasMany(Components\Riga::class, 'idcontratto'); + } + + public function descrizioni() + { + return $this->hasMany(Components\Descrizione::class, 'idcontratto'); + } + + public function scontoGlobale() + { + return $this->hasOne(Components\Sconto::class, 'idcontratto'); + } + + // Metodi statici + + /** + * Calcola il nuovo numero di contratto. + * + * @return string + */ + public static function getNextNumero() + { + $maschera = setting('Formato codice contratti'); + + $ultimo = Generator::getPreviousFrom($maschera, 'co_contratti', 'numero'); + $numero = Generator::generate($maschera, $ultimo); + + return $numero; + } +} diff --git a/modules/contratti/src/Stato.php b/modules/contratti/src/Stato.php new file mode 100644 index 000000000..68998fb54 --- /dev/null +++ b/modules/contratti/src/Stato.php @@ -0,0 +1,15 @@ +hasMany(Contratto::class, 'idstato'); + } +} diff --git a/modules/ddt/actions.php b/modules/ddt/actions.php index c8fdf9aff..33278ae23 100644 --- a/modules/ddt/actions.php +++ b/modules/ddt/actions.php @@ -31,7 +31,7 @@ switch (post('op')) { flash()->info(tr('Aggiunto ddt in _TYPE_ numero _NUM_!', [ '_TYPE_' => $dir, - '_NUM_' => $numero, + '_NUM_' => $ddt->numero, ])); break; diff --git a/modules/ordini/actions.php b/modules/ordini/actions.php index 1e37e9f14..73c7bc340 100644 --- a/modules/ordini/actions.php +++ b/modules/ordini/actions.php @@ -32,7 +32,7 @@ switch (post('op')) { $id_record = $ordine->id; flash()->info(tr('Aggiunto ordine numero _NUM_!', [ - '_NUM_' => $numero, + '_NUM_' => $ordine->numero, ])); break; diff --git a/src/Extensions/MessageHandler.php b/src/Extensions/MessageHandler.php index 44d0318da..0ca6ccebd 100644 --- a/src/Extensions/MessageHandler.php +++ b/src/Extensions/MessageHandler.php @@ -13,7 +13,7 @@ class MessageHandler extends AbstractProcessingHandler { protected function write(array $record) { - if (isAjaxRequest()) { + if (\Whoops\Util\Misc::isAjaxRequest()) { return; } diff --git a/src/HTMLBuilder/HTMLBuilder.php b/src/HTMLBuilder/HTMLBuilder.php index 04d900d8e..275a2e197 100644 --- a/src/HTMLBuilder/HTMLBuilder.php +++ b/src/HTMLBuilder/HTMLBuilder.php @@ -106,7 +106,18 @@ class HTMLBuilder $json = self::decode($value, 'manager'); $class = self::getManager($json['name']); - $result = !empty($class) ? $class->manage($json) : ''; + $result = ''; + try { + $result = !empty($class) ? $class->manage($json) : ''; + } catch (\Exception $exception) { + logger()->error($exception->getMessage(), [ + 'code' => $exception->getCode(), + 'message' => $exception->getMessage(), + 'file' => $exception->getFile(), + 'line' => $exception->getLine(), + 'trace' => $exception->getTraceAsString(), + ]); + } // Ricorsione if ($depth < self::$max_recursion) { @@ -121,7 +132,19 @@ class HTMLBuilder foreach ($handlers[0] as $value) { $json = self::decode($value, 'handler'); - $result = self::generate($json); + + $result = null; + try { + $result = self::generate($json); + } catch (\Exception $exception) { + logger()->error($exception->getMessage(), [ + 'code' => $exception->getCode(), + 'message' => $exception->getMessage(), + 'file' => $exception->getFile(), + 'line' => $exception->getLine(), + 'trace' => $exception->getTraceAsString(), + ]); + } // Ricorsione if ($depth < self::$max_recursion) {