Gestione Contratti tramite Eloquent

This commit is contained in:
Thomas Zilio 2019-01-19 10:33:57 +01:00
parent f00543bccf
commit 214288c063
14 changed files with 381 additions and 33 deletions

View File

@ -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',

View File

@ -117,7 +117,7 @@ if (App::debug()) {
'message' => $exception->getMessage(),
'file' => $exception->getFile(),
'line' => $exception->getLine(),
'trace' => null,
'trace' => $exception->getTraceAsString(),
]);
});
}

View File

@ -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;

View File

@ -0,0 +1,58 @@
<?php
namespace Modules\Contratti\Components;
use Common\Components\Article;
use Modules\Articoli\Articolo as Original;
use Modules\Contratti\Contratto;
class Articolo extends Article
{
use RelationTrait;
protected $table = 'co_righe_contratti';
/**
* Crea un nuovo articolo collegato ad una contratto.
*
* @param Contratto $contratto
* @param Original $articolo
*
* @return self
*/
public static function build(Contratto $contratto, Original $articolo)
{
$model = parent::build($contratto, $articolo);
return $model;
}
public function movimenta($qta)
{
$contratto = $this->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;
}
}

View File

@ -0,0 +1,27 @@
<?php
namespace Modules\Contratti\Components;
use Common\Components\Description;
use Modules\Contratti\Contratto;
class Descrizione extends Description
{
use RelationTrait;
protected $table = 'co_righe_contratti';
/**
* Crea una nuova riga collegata ad una contratto.
*
* @param Contratto $contratto
*
* @return self
*/
public static function build(Contratto $contratto)
{
$model = parent::build($contratto);
return $model;
}
}

View File

@ -0,0 +1,23 @@
<?php
namespace Modules\Contratti\Components;
use Modules\Contratti\Contratto;
trait RelationTrait
{
public function getParentID()
{
return 'idcontratto';
}
public function parent()
{
return $this->belongsTo(Contratto::class, $this->getParentID());
}
public function contratto()
{
return $this->parent();
}
}

View File

@ -0,0 +1,27 @@
<?php
namespace Modules\Contratti\Components;
use Common\Components\Row;
use Modules\Contratti\Contratto;
class Riga extends Row
{
use RelationTrait;
protected $table = 'co_righe_contratti';
/**
* Crea una nuova riga collegata ad una contratto.
*
* @param Contratto $contratto
*
* @return self
*/
public static function build(Contratto $contratto)
{
$model = parent::build($contratto);
return $model;
}
}

View File

@ -0,0 +1,33 @@
<?php
namespace Modules\Contratti\Components;
use Common\Components\Discount;
use Modules\Contratti\Contratto;
class Sconto extends Discount
{
use RelationTrait;
protected $table = 'co_righe_contratti';
/**
* Crea una nuovo sconto globale collegato alla contratto, oppure restituisce quello esistente.
*
* @param Contratto $contratto
*
* @return self
*/
public static function build(Contratto $contratto)
{
$model = $contratto->scontoGlobale;
if ($model == null) {
$model = parent::build();
$model->setContratto($contratto);
}
return $model;
}
}

View File

@ -0,0 +1,157 @@
<?php
namespace Modules\Contratti;
use Carbon\Carbon;
use Common\Document;
use Modules\Anagrafiche\Anagrafica;
use Modules\Interventi\TipoSessione;
use Traits\RecordTrait;
use Util\Generator;
class Contratto extends Document
{
use RecordTrait;
protected $table = 'co_contratti';
/**
* Crea un nuovo contratto.
*
* @param Anagrafica $anagrafica
* @param string $nome
*
* @return self
*/
public static function build(Anagrafica $anagrafica, $nome)
{
$model = parent::build();
$stato_documento = Stato::where('descrizione', 'Bozza')->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;
}
}

View File

@ -0,0 +1,15 @@
<?php
namespace Modules\Contratti;
use Common\Model;
class Stato extends Model
{
protected $table = 'co_staticontratti';
public function preventivi()
{
return $this->hasMany(Contratto::class, 'idstato');
}
}

View File

@ -31,7 +31,7 @@ switch (post('op')) {
flash()->info(tr('Aggiunto ddt in _TYPE_ numero _NUM_!', [
'_TYPE_' => $dir,
'_NUM_' => $numero,
'_NUM_' => $ddt->numero,
]));
break;

View File

@ -32,7 +32,7 @@ switch (post('op')) {
$id_record = $ordine->id;
flash()->info(tr('Aggiunto ordine numero _NUM_!', [
'_NUM_' => $numero,
'_NUM_' => $ordine->numero,
]));
break;

View File

@ -13,7 +13,7 @@ class MessageHandler extends AbstractProcessingHandler
{
protected function write(array $record)
{
if (isAjaxRequest()) {
if (\Whoops\Util\Misc::isAjaxRequest()) {
return;
}

View File

@ -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) {