Gestione Contratti tramite Eloquent
This commit is contained in:
parent
f00543bccf
commit
214288c063
|
@ -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',
|
||||
|
|
2
core.php
2
core.php
|
@ -117,7 +117,7 @@ if (App::debug()) {
|
|||
'message' => $exception->getMessage(),
|
||||
'file' => $exception->getFile(),
|
||||
'line' => $exception->getLine(),
|
||||
'trace' => null,
|
||||
'trace' => $exception->getTraceAsString(),
|
||||
]);
|
||||
});
|
||||
}
|
||||
|
|
|
@ -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']);
|
||||
|
||||
// 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']).')');
|
||||
}
|
||||
$contratto = Contratto::build($anagrafica, $nome);
|
||||
$id_record = $contratto->id;
|
||||
|
||||
flash()->info(tr('Aggiunto contratto numero _NUM_!', [
|
||||
'_NUM_' => $numero,
|
||||
'_NUM_' => $contratto['numero'],
|
||||
]));
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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');
|
||||
}
|
||||
}
|
|
@ -31,7 +31,7 @@ switch (post('op')) {
|
|||
|
||||
flash()->info(tr('Aggiunto ddt in _TYPE_ numero _NUM_!', [
|
||||
'_TYPE_' => $dir,
|
||||
'_NUM_' => $numero,
|
||||
'_NUM_' => $ddt->numero,
|
||||
]));
|
||||
|
||||
break;
|
||||
|
|
|
@ -32,7 +32,7 @@ switch (post('op')) {
|
|||
$id_record = $ordine->id;
|
||||
|
||||
flash()->info(tr('Aggiunto ordine numero _NUM_!', [
|
||||
'_NUM_' => $numero,
|
||||
'_NUM_' => $ordine->numero,
|
||||
]));
|
||||
|
||||
break;
|
||||
|
|
|
@ -13,7 +13,7 @@ class MessageHandler extends AbstractProcessingHandler
|
|||
{
|
||||
protected function write(array $record)
|
||||
{
|
||||
if (isAjaxRequest()) {
|
||||
if (\Whoops\Util\Misc::isAjaxRequest()) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -106,7 +106,18 @@ class HTMLBuilder
|
|||
$json = self::decode($value, 'manager');
|
||||
$class = self::getManager($json['name']);
|
||||
|
||||
$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 = 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) {
|
||||
|
|
Loading…
Reference in New Issue