Miglioramenti per Warning PHP
Revisione della gerarchia tra le classi Eloquent. Modifica dei metodi getOriginal e hasOriginal per le righe in getOriginalComponent e hasOriginalComponent per maggiore compatibilità. Correzione del documento per le righe da parent a document. Suddivisione della gestione righe in: Component per gestire le relazioni, Accounting per gestire i prezzi. Separazione di righe, articoli, sconti e descrizioni in classi indipendenti.
This commit is contained in:
parent
19e6a8ac23
commit
1796a02b34
4
core.php
4
core.php
|
@ -258,8 +258,8 @@ if (!API\Response::isAPIRequest()) {
|
|||
$plugin = Plugins::getCurrent();
|
||||
$structure = isset($plugin) ? $plugin : $module;
|
||||
|
||||
$id_module = $module['id'];
|
||||
$id_plugin = $plugin['id'];
|
||||
$id_module = $module ? $module['id'] : null;
|
||||
$id_plugin = $plugin ? $plugin['id'] : null;
|
||||
|
||||
$user = Auth::user();
|
||||
|
||||
|
|
|
@ -48,7 +48,7 @@ echo '
|
|||
</div>';
|
||||
|
||||
$documenti_disponibili = collect();
|
||||
$direzione_richiesta = $source->parent->direzione == 'entrata' ? 'uscita' : 'entrata';
|
||||
$direzione_richiesta = $source->getDocument()->direzione == 'entrata' ? 'uscita' : 'entrata';
|
||||
|
||||
// Individuazione DDT disponibili
|
||||
$ddt = DDT::whereHas('stato', function ($query) {
|
||||
|
|
|
@ -55,7 +55,7 @@ if (!$riferimenti->isEmpty()) {
|
|||
'.$riferimento->target->descrizione.'
|
||||
|
||||
<br>
|
||||
<small>'.reference($riferimento->target->parent).'</small>
|
||||
<small>'.reference($riferimento->target->getDocument()).'</small>
|
||||
</td>
|
||||
</tr>';
|
||||
|
||||
|
|
|
@ -289,7 +289,8 @@ if (Auth::check()) {
|
|||
}
|
||||
}
|
||||
|
||||
$hide_sidebar = Auth::check() && (setting('Nascondere la barra sinistra di default') or $_SESSION['settings']['sidebar-collapse']);
|
||||
$settings_collapse = session('settings.sidebar-collapse') ? 1 : 0;
|
||||
$hide_sidebar = Auth::check() && (setting('Nascondere la barra sinistra di default') || $settings_collapse);
|
||||
echo '
|
||||
|
||||
</head>
|
||||
|
@ -520,10 +521,16 @@ if (Auth::check()) {
|
|||
<div class="col-md-12">';
|
||||
|
||||
// Eventuale messaggio personalizzato per l'installazione corrente
|
||||
include_once App::filepath('include/custom/extra', 'extra.php');
|
||||
$extra_file = App::filepath('include/custom/extra', 'extra.php');
|
||||
if ($extra_file) {
|
||||
include_once $extra_file;
|
||||
}
|
||||
} else {
|
||||
// Eventuale messaggio personalizzato per l'installazione corrente
|
||||
include_once App::filepath('include/custom/extra', 'login.php');
|
||||
$extra_file = App::filepath('include/custom/extra', 'login.php');
|
||||
if ($extra_file) {
|
||||
include_once $extra_file;
|
||||
}
|
||||
|
||||
if (!empty($messages['info']) || !empty($messages['warning']) || !empty($messages['error'])) {
|
||||
echo '
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
*
|
||||
* @since 2.4.2
|
||||
*/
|
||||
use Common\Components\Accounting;
|
||||
|
||||
/**
|
||||
* Esegue una somma precisa tra due interi/array.
|
||||
|
@ -113,7 +114,7 @@ function orderValue($table, $field, $id)
|
|||
*
|
||||
* @return string|null
|
||||
*/
|
||||
function discountInfo(\Common\Components\Row $riga, $mostra_maggiorazione = true)
|
||||
function discountInfo(Accounting $riga, $mostra_maggiorazione = true)
|
||||
{
|
||||
if (empty($riga->sconto_unitario) || (!$mostra_maggiorazione && $riga->sconto_unitario < 0)) {
|
||||
return null;
|
||||
|
|
|
@ -17,11 +17,13 @@
|
|||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
/*
|
||||
* Funzioni fondamentali per il corretto funzionamento del nucleo del progetto.
|
||||
*
|
||||
* @since 2.3
|
||||
*/
|
||||
|
||||
use HTMLBuilder\HTMLBuilder;
|
||||
use Models\OperationLog;
|
||||
|
||||
/**
|
||||
|
@ -213,8 +215,10 @@ function translateTemplate()
|
|||
$id_record = filter('id_record');
|
||||
$id_parent = filter('id_parent');
|
||||
|
||||
$id_module = Modules::getCurrent()['id'];
|
||||
$id_plugin = Plugins::getCurrent()['id'];
|
||||
$module = Modules::getCurrent();
|
||||
$plugin = Plugins::getCurrent();
|
||||
$id_module = $module ? $module['id'] : null;
|
||||
$id_plugin = $plugin ? $plugin['id'] : null;
|
||||
|
||||
$template = ob_get_clean();
|
||||
|
||||
|
@ -225,7 +229,7 @@ function translateTemplate()
|
|||
];
|
||||
|
||||
$template = replace($template, $replaces);
|
||||
$template = \HTMLBuilder\HTMLBuilder::replace($template);
|
||||
$template = HTMLBuilder::replace($template);
|
||||
$template = replace($template, $replaces);
|
||||
|
||||
// Informazioni estese sulle azioni dell'utente
|
||||
|
@ -406,3 +410,22 @@ function check_query($query)
|
|||
|
||||
return true;
|
||||
}
|
||||
|
||||
function session($name = '')
|
||||
{
|
||||
$session = &$_SESSION;
|
||||
if (empty($name)) {
|
||||
return $session;
|
||||
}
|
||||
|
||||
$pieces = explode('.', $name);
|
||||
foreach ($pieces as $piece) {
|
||||
if (!isset($session[$piece])) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$session = &$session[$piece];
|
||||
}
|
||||
|
||||
return $session;
|
||||
}
|
||||
|
|
|
@ -19,7 +19,8 @@
|
|||
|
||||
namespace Modules\Anagrafiche;
|
||||
|
||||
use Common\Model;
|
||||
use Common\SimpleModelTrait;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
use Modules\Contratti\Contratto;
|
||||
use Modules\DDT\DDT;
|
||||
|
@ -34,6 +35,7 @@ use Util\Generator;
|
|||
|
||||
class Anagrafica extends Model
|
||||
{
|
||||
use SimpleModelTrait;
|
||||
use RecordTrait;
|
||||
use SoftDeletes;
|
||||
|
||||
|
@ -62,7 +64,7 @@ class Anagrafica extends Model
|
|||
*/
|
||||
public static function build($ragione_sociale, $nome = '', $cognome = '', array $tipologie = [])
|
||||
{
|
||||
$model = parent::build();
|
||||
$model = new static();
|
||||
|
||||
$model->ragione_sociale = $ragione_sociale;
|
||||
|
||||
|
|
|
@ -19,10 +19,13 @@
|
|||
|
||||
namespace Modules\Anagrafiche;
|
||||
|
||||
use Common\Model;
|
||||
use Common\SimpleModelTrait;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class Nazione extends Model
|
||||
{
|
||||
use SimpleModelTrait;
|
||||
|
||||
protected $table = 'an_nazioni';
|
||||
|
||||
public function anagrafiche()
|
||||
|
|
|
@ -19,10 +19,13 @@
|
|||
|
||||
namespace Modules\Anagrafiche;
|
||||
|
||||
use Common\Model;
|
||||
use Common\SimpleModelTrait;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class Sede extends Model
|
||||
{
|
||||
use SimpleModelTrait;
|
||||
|
||||
protected $table = 'an_sedi';
|
||||
|
||||
/**
|
||||
|
|
|
@ -19,10 +19,13 @@
|
|||
|
||||
namespace Modules\Anagrafiche;
|
||||
|
||||
use Common\Model;
|
||||
use Common\SimpleModelTrait;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class Tipo extends Model
|
||||
{
|
||||
use SimpleModelTrait;
|
||||
|
||||
protected $table = 'an_tipianagrafiche';
|
||||
protected $primaryKey = 'idtipoanagrafica';
|
||||
|
||||
|
|
|
@ -19,7 +19,8 @@
|
|||
|
||||
namespace Modules\Articoli;
|
||||
|
||||
use Common\Model;
|
||||
use Common\SimpleModelTrait;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
use Modules;
|
||||
use Modules\Interventi\Components\Articolo as ArticoloIntervento;
|
||||
|
@ -30,6 +31,7 @@ use Uploads;
|
|||
|
||||
class Articolo extends Model
|
||||
{
|
||||
use SimpleModelTrait;
|
||||
use SoftDeletes;
|
||||
use RecordTrait;
|
||||
|
||||
|
@ -41,7 +43,7 @@ class Articolo extends Model
|
|||
|
||||
public static function build($codice, $nome, Categoria $categoria = null, Categoria $sottocategoria = null)
|
||||
{
|
||||
$model = parent::build();
|
||||
$model = new static();
|
||||
|
||||
$model->codice = $codice;
|
||||
$model->descrizione = $nome;
|
||||
|
|
|
@ -19,11 +19,13 @@
|
|||
|
||||
namespace Modules\Articoli;
|
||||
|
||||
use Common\Model;
|
||||
use Common\SimpleModelTrait;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Traits\HierarchyTrait;
|
||||
|
||||
class Categoria extends Model
|
||||
{
|
||||
use SimpleModelTrait;
|
||||
use HierarchyTrait;
|
||||
|
||||
protected $table = 'mg_categorie';
|
||||
|
@ -31,7 +33,7 @@ class Categoria extends Model
|
|||
|
||||
public static function build($nome)
|
||||
{
|
||||
$model = parent::build();
|
||||
$model = new static();
|
||||
|
||||
$model->nome = $nome;
|
||||
$model->save();
|
||||
|
|
|
@ -19,9 +19,10 @@
|
|||
|
||||
namespace Modules\Articoli;
|
||||
|
||||
use Common\Model;
|
||||
use Common\SimpleModelTrait;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
/**
|
||||
/*
|
||||
* Classe dedicata alla gestione dei movimenti di magazzino degli articoli.
|
||||
*
|
||||
* Alcuni appunti sull'utilizzo dei campi *idsede_azienda* e *idsede_controparte*
|
||||
|
@ -32,12 +33,14 @@ use Common\Model;
|
|||
*/
|
||||
class Movimento extends Model
|
||||
{
|
||||
use SimpleModelTrait;
|
||||
|
||||
protected $document;
|
||||
protected $table = 'mg_movimenti';
|
||||
|
||||
public static function build(Articolo $articolo, $qta, $descrizone, $data, $document = null)
|
||||
{
|
||||
$model = parent::build();
|
||||
$model = new static();
|
||||
|
||||
$model->articolo()->associate($articolo);
|
||||
|
||||
|
|
|
@ -19,18 +19,20 @@
|
|||
|
||||
namespace Modules\CategorieDocumentali;
|
||||
|
||||
use Common\Model;
|
||||
use Common\SimpleModelTrait;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
|
||||
class Categoria extends Model
|
||||
{
|
||||
use SimpleModelTrait;
|
||||
use SoftDeletes;
|
||||
|
||||
protected $table = 'do_categorie';
|
||||
|
||||
public static function build($descrizione)
|
||||
{
|
||||
$model = parent::build();
|
||||
$model = new static();
|
||||
$model->descrizione = $descrizione;
|
||||
|
||||
$model->save();
|
||||
|
|
|
@ -19,7 +19,8 @@
|
|||
|
||||
namespace Modules\Checklists;
|
||||
|
||||
use Common\Model;
|
||||
use Common\SimpleModelTrait;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Models\Group;
|
||||
use Models\Module;
|
||||
use Models\Plugin;
|
||||
|
@ -29,6 +30,7 @@ use Traits\HierarchyTrait;
|
|||
|
||||
class Check extends Model
|
||||
{
|
||||
use SimpleModelTrait;
|
||||
use HierarchyTrait;
|
||||
|
||||
protected static $parent_identifier = 'id_parent';
|
||||
|
@ -46,7 +48,7 @@ class Check extends Model
|
|||
*/
|
||||
public static function build(User $user, $structure, $id_record, $content, $parent_id = null)
|
||||
{
|
||||
$model = parent::build();
|
||||
$model = new static();
|
||||
|
||||
$model->user()->associate($user);
|
||||
$model->id_parent = $parent_id;
|
||||
|
|
|
@ -19,13 +19,16 @@
|
|||
|
||||
namespace Modules\Checklists;
|
||||
|
||||
use Common\Model;
|
||||
use Common\SimpleModelTrait;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Models\Module;
|
||||
use Models\Plugin;
|
||||
use Models\User;
|
||||
|
||||
class Checklist extends Model
|
||||
{
|
||||
use SimpleModelTrait;
|
||||
|
||||
protected $table = 'zz_checklists';
|
||||
|
||||
/**
|
||||
|
@ -37,7 +40,7 @@ class Checklist extends Model
|
|||
*/
|
||||
public static function build($nome)
|
||||
{
|
||||
$model = parent::build();
|
||||
$model = new static();
|
||||
|
||||
$model->name = $nome;
|
||||
$model->save();
|
||||
|
|
|
@ -19,11 +19,13 @@
|
|||
|
||||
namespace Modules\Checklists;
|
||||
|
||||
use Common\Model;
|
||||
use Common\SimpleModelTrait;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Traits\HierarchyTrait;
|
||||
|
||||
class ChecklistItem extends Model
|
||||
{
|
||||
use SimpleModelTrait;
|
||||
use HierarchyTrait;
|
||||
|
||||
protected static $parent_identifier = 'id_parent';
|
||||
|
@ -39,7 +41,7 @@ class ChecklistItem extends Model
|
|||
*/
|
||||
public static function build(Checklist $checklist, $contenuto, $id_parent = null)
|
||||
{
|
||||
$model = parent::build();
|
||||
$model = new static();
|
||||
|
||||
$model->checklist()->associate($checklist);
|
||||
$model->id_parent = $id_parent;
|
||||
|
|
|
@ -121,7 +121,7 @@ switch (post('op')) {
|
|||
$righe = $contratto->getRighe();
|
||||
foreach ($righe as $riga) {
|
||||
$new_riga = $riga->replicate();
|
||||
$new_riga->setParent($new);
|
||||
$new_riga->setDocument($new);
|
||||
|
||||
$new_riga->qta_evasa = 0;
|
||||
$new_riga->save();
|
||||
|
|
|
@ -51,9 +51,9 @@ foreach ($righe as $riga) {
|
|||
<td>';
|
||||
|
||||
// Aggiunta dei riferimenti ai documenti
|
||||
if ($riga->hasOriginal()) {
|
||||
if ($riga->hasOriginalComponent()) {
|
||||
echo '
|
||||
<small class="pull-right text-right text-muted">'.reference($riga->getOriginal()->parent, tr('Origine')).'</small>';
|
||||
<small class="pull-right text-right text-muted">'.reference($riga->getOriginalComponent()->getDocument(), tr('Origine')).'</small>';
|
||||
}
|
||||
|
||||
// Descrizione
|
||||
|
|
|
@ -23,18 +23,18 @@ use Modules\Contratti\Contratto;
|
|||
|
||||
trait RelationTrait
|
||||
{
|
||||
public function getParentID()
|
||||
public function getDocumentID()
|
||||
{
|
||||
return 'idcontratto';
|
||||
}
|
||||
|
||||
public function parent()
|
||||
public function document()
|
||||
{
|
||||
return $this->belongsTo(Contratto::class, $this->getParentID());
|
||||
return $this->belongsTo(Contratto::class, $this->getDocumentID());
|
||||
}
|
||||
|
||||
public function contratto()
|
||||
{
|
||||
return $this->parent();
|
||||
return $this->document();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -21,7 +21,7 @@ namespace Modules\Contratti;
|
|||
|
||||
use Carbon\Carbon;
|
||||
use Carbon\CarbonInterval;
|
||||
use Common\Components\Description;
|
||||
use Common\Components\Component;
|
||||
use Common\Document;
|
||||
use Modules\Anagrafiche\Anagrafica;
|
||||
use Modules\Interventi\Intervento;
|
||||
|
@ -58,7 +58,7 @@ class Contratto extends Document
|
|||
*/
|
||||
public static function build(Anagrafica $anagrafica, $nome)
|
||||
{
|
||||
$model = parent::build();
|
||||
$model = new static();
|
||||
|
||||
$stato_documento = Stato::where('descrizione', 'Bozza')->first();
|
||||
|
||||
|
@ -220,7 +220,7 @@ class Contratto extends Document
|
|||
* Effettua un controllo sui campi del documento.
|
||||
* Viene richiamato dalle modifiche alle righe del documento.
|
||||
*/
|
||||
public function triggerEvasione(Description $trigger)
|
||||
public function triggerEvasione(Component $trigger)
|
||||
{
|
||||
parent::triggerEvasione($trigger);
|
||||
|
||||
|
|
|
@ -19,10 +19,13 @@
|
|||
|
||||
namespace Modules\Contratti;
|
||||
|
||||
use Common\Model;
|
||||
use Common\SimpleModelTrait;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class Stato extends Model
|
||||
{
|
||||
use SimpleModelTrait;
|
||||
|
||||
protected $table = 'co_staticontratti';
|
||||
|
||||
public function preventivi()
|
||||
|
|
|
@ -31,10 +31,11 @@ echo '
|
|||
<ul class="dropdown-menu" role="menu">';
|
||||
|
||||
// Stati intervento
|
||||
$stati_sessione = session('dashboard.idstatiintervento') ?: [];
|
||||
$stati_intervento = $dbo->fetchArray('SELECT idstatointervento AS id, descrizione, colore FROM in_statiintervento WHERE deleted_at IS NULL ORDER BY descrizione ASC');
|
||||
foreach ($stati_intervento as $stato) {
|
||||
$attr = '';
|
||||
if (in_array("'".$stato['id']."'", $_SESSION['dashboard']['idstatiintervento'])) {
|
||||
if (in_array("'".$stato['id']."'", $stati_sessione)) {
|
||||
$attr = 'checked="checked"';
|
||||
}
|
||||
|
||||
|
@ -68,10 +69,11 @@ echo '
|
|||
<ul class="dropdown-menu" role="menu">';
|
||||
|
||||
// Tipi intervento
|
||||
$tipi_sessione = session('dashboard.idtipiintervento') ?: [];
|
||||
$tipi_intervento = $dbo->fetchArray('SELECT idtipointervento AS id, descrizione FROM in_tipiintervento ORDER BY descrizione ASC');
|
||||
foreach ($tipi_intervento as $tipo) {
|
||||
$attr = '';
|
||||
if (in_array("'".$tipo['id']."'", $_SESSION['dashboard']['idtipiintervento'])) {
|
||||
if (in_array("'".$tipo['id']."'", $tipi_sessione)) {
|
||||
$attr = 'checked="checked"';
|
||||
}
|
||||
|
||||
|
@ -104,12 +106,13 @@ echo '
|
|||
</button>
|
||||
<ul class="dropdown-menu" role="menu">';
|
||||
|
||||
$tecnici_sessione = session('dashboard.idtecnici') ?: [];
|
||||
$tecnici_disponibili = $dbo->fetchArray("SELECT an_anagrafiche.idanagrafica AS id, ragione_sociale, colore FROM an_anagrafiche INNER JOIN (an_tipianagrafiche_anagrafiche INNER JOIN an_tipianagrafiche ON an_tipianagrafiche_anagrafiche.idtipoanagrafica=an_tipianagrafiche.idtipoanagrafica) ON an_anagrafiche.idanagrafica=an_tipianagrafiche_anagrafiche.idanagrafica
|
||||
LEFT OUTER JOIN in_interventi_tecnici ON in_interventi_tecnici.idtecnico = an_anagrafiche.idanagrafica INNER JOIN in_interventi ON in_interventi_tecnici.idintervento=in_interventi.id
|
||||
WHERE an_anagrafiche.deleted_at IS NULL AND an_tipianagrafiche.descrizione='Tecnico' ".Modules::getAdditionalsQuery('Interventi').' GROUP BY an_anagrafiche.idanagrafica ORDER BY ragione_sociale ASC');
|
||||
foreach ($tecnici_disponibili as $tecnico) {
|
||||
$attr = '';
|
||||
if (in_array("'".$tecnico['id']."'", $_SESSION['dashboard']['idtecnici'])) {
|
||||
if (in_array("'".$tecnico['id']."'", $tecnici_sessione)) {
|
||||
$attr = 'checked="checked"';
|
||||
}
|
||||
|
||||
|
@ -143,10 +146,11 @@ echo '
|
|||
<ul class="dropdown-menu" role="menu">';
|
||||
|
||||
// Zone
|
||||
$zone_sessione = session('dashboard.idzone') ?: [];
|
||||
$zone = $dbo->fetchArray('(SELECT 0 AS ordine, \'0\' AS id, \'Nessuna zona\' AS descrizione) UNION (SELECT 1 AS ordine, id, descrizione FROM an_zone) ORDER BY ordine, descrizione ASC');
|
||||
foreach ($zone as $zona) {
|
||||
$attr = '';
|
||||
if (in_array("'".$zona['id']."'", $_SESSION['dashboard']['idzone'])) {
|
||||
if (in_array("'".$zona['id']."'", $zone_sessione)) {
|
||||
$attr = 'checked="checked"';
|
||||
}
|
||||
|
||||
|
|
|
@ -76,9 +76,9 @@ foreach ($righe as $riga) {
|
|||
</button>';
|
||||
|
||||
// Aggiunta dei riferimenti ai documenti
|
||||
if ($riga->hasOriginal()) {
|
||||
if ($riga->hasOriginalComponent()) {
|
||||
echo '
|
||||
<br>'.reference($riga->getOriginal()->parent, tr('Origine'));
|
||||
<br>'.reference($riga->getOriginalComponent()->getDocument(), tr('Origine'));
|
||||
}
|
||||
echo '
|
||||
</small>';
|
||||
|
|
|
@ -23,18 +23,18 @@ use Modules\DDT\DDT;
|
|||
|
||||
trait RelationTrait
|
||||
{
|
||||
public function getParentID()
|
||||
public function getDocumentID()
|
||||
{
|
||||
return 'idddt';
|
||||
}
|
||||
|
||||
public function parent()
|
||||
public function document()
|
||||
{
|
||||
return $this->belongsTo(DDT::class, $this->getParentID());
|
||||
return $this->belongsTo(DDT::class, $this->getDocumentID());
|
||||
}
|
||||
|
||||
public function ddt()
|
||||
{
|
||||
return $this->parent();
|
||||
return $this->document();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -53,7 +53,7 @@ class DDT extends Document
|
|||
*/
|
||||
public static function build(Anagrafica $anagrafica, Tipo $tipo_documento, $data)
|
||||
{
|
||||
$model = parent::build();
|
||||
$model = new static();
|
||||
|
||||
$user = Auth::user();
|
||||
|
||||
|
|
|
@ -19,10 +19,13 @@
|
|||
|
||||
namespace Modules\DDT;
|
||||
|
||||
use Common\Model;
|
||||
use Common\SimpleModelTrait;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class Stato extends Model
|
||||
{
|
||||
use SimpleModelTrait;
|
||||
|
||||
protected $table = 'dt_statiddt';
|
||||
|
||||
public function ddt()
|
||||
|
|
|
@ -19,10 +19,13 @@
|
|||
|
||||
namespace Modules\DDT;
|
||||
|
||||
use Common\Model;
|
||||
use Common\SimpleModelTrait;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class Tipo extends Model
|
||||
{
|
||||
use SimpleModelTrait;
|
||||
|
||||
protected $table = 'dt_tipiddt';
|
||||
|
||||
public function ddt()
|
||||
|
|
|
@ -20,13 +20,15 @@
|
|||
namespace Modules\Emails;
|
||||
|
||||
use Carbon\Carbon;
|
||||
use Common\Model;
|
||||
use Common\SimpleModelTrait;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
use Notifications\EmailNotification;
|
||||
use Traits\StoreTrait;
|
||||
|
||||
class Account extends Model
|
||||
{
|
||||
use SimpleModelTrait;
|
||||
use StoreTrait;
|
||||
use SoftDeletes;
|
||||
|
||||
|
|
|
@ -19,7 +19,8 @@
|
|||
|
||||
namespace Modules\Emails;
|
||||
|
||||
use Common\Model;
|
||||
use Common\SimpleModelTrait;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Models\PrintTemplate;
|
||||
use Models\Upload;
|
||||
use Models\User;
|
||||
|
@ -27,13 +28,15 @@ use Modules\Newsletter\Newsletter;
|
|||
|
||||
class Mail extends Model
|
||||
{
|
||||
use SimpleModelTrait;
|
||||
|
||||
protected $table = 'em_emails';
|
||||
|
||||
protected $options = null;
|
||||
|
||||
public static function build(User $user, $template = null, $id_record = null, $account = null)
|
||||
{
|
||||
$model = parent::build();
|
||||
$model = new static();
|
||||
|
||||
$model->created_by = $user->id;
|
||||
|
||||
|
|
|
@ -19,17 +19,20 @@
|
|||
|
||||
namespace Modules\Emails;
|
||||
|
||||
use Common\Model;
|
||||
use Common\SimpleModelTrait;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class Receiver extends Model
|
||||
{
|
||||
use SimpleModelTrait;
|
||||
|
||||
protected $table = 'em_email_receiver';
|
||||
|
||||
/* Relazioni Eloquent */
|
||||
|
||||
public static function build(Mail $mail, $address, $type = null)
|
||||
{
|
||||
$model = parent::build();
|
||||
$model = new static();
|
||||
|
||||
$model->email()->associate($mail);
|
||||
|
||||
|
|
|
@ -19,7 +19,8 @@
|
|||
|
||||
namespace Modules\Emails;
|
||||
|
||||
use Common\Model;
|
||||
use Common\SimpleModelTrait;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
use Models\Module;
|
||||
use Models\PrintTemplate;
|
||||
|
@ -27,6 +28,7 @@ use Traits\StoreTrait;
|
|||
|
||||
class Template extends Model
|
||||
{
|
||||
use SimpleModelTrait;
|
||||
use StoreTrait;
|
||||
use SoftDeletes;
|
||||
|
||||
|
|
|
@ -304,7 +304,7 @@ switch (post('op')) {
|
|||
$righe = $fattura->getRighe();
|
||||
foreach ($righe as $riga) {
|
||||
$new_riga = $riga->replicate();
|
||||
$new_riga->setParent($new);
|
||||
$new_riga->setDocument($new);
|
||||
|
||||
// Rimozione riferimenti (deorecati)
|
||||
$new_riga->idpreventivo = 0;
|
||||
|
|
|
@ -240,7 +240,7 @@ switch (post('op')) {
|
|||
$righe = $fattura->getRighe();
|
||||
foreach ($righe as $riga) {
|
||||
$new_riga = $riga->replicate();
|
||||
$new_riga->setParent($new);
|
||||
$new_riga->setDocument($new);
|
||||
|
||||
if (!post('riferimenti')) {
|
||||
$new_riga->idpreventivo = 0;
|
||||
|
|
|
@ -65,8 +65,8 @@ foreach ($righe as $riga) {
|
|||
$extra_riga = '';
|
||||
if (!$riga->isDescrizione()) {
|
||||
// Informazioni su CIG, CUP, ...
|
||||
if ($riga->hasOriginal()) {
|
||||
$documento_originale = $riga->getOriginal()->parent;
|
||||
if ($riga->hasOriginalComponent()) {
|
||||
$documento_originale = $riga->getOriginalComponent()->getDocument();
|
||||
|
||||
$num_item = $documento_originale['num_item'];
|
||||
$codice_cig = $documento_originale['codice_cig'];
|
||||
|
@ -102,9 +102,9 @@ foreach ($righe as $riga) {
|
|||
'.$extra_riga;
|
||||
|
||||
// Aggiunta dei riferimenti ai documenti
|
||||
if ($riga->hasOriginal()) {
|
||||
if ($riga->hasOriginalComponent()) {
|
||||
echo '
|
||||
<br>'.reference($riga->getOriginal()->parent, tr('Origine'));
|
||||
<br>'.reference($riga->getOriginalComponent()->getDocument(), tr('Origine'));
|
||||
}
|
||||
|
||||
echo '
|
||||
|
|
|
@ -52,8 +52,8 @@ class Articolo extends Article
|
|||
|
||||
// Movimenta il magazzino solo se l'articolo non è già stato movimentato da un documento precedente
|
||||
// Movimentazione forzata per Note di credito/debito
|
||||
if ($this->hasOriginal() && !$this->parent->isNota()) {
|
||||
$original = $this->getOriginal();
|
||||
if ($this->hasOriginalComponent() && !$this->getDocument()->isNota()) {
|
||||
$original = $this->getOriginalComponent();
|
||||
$movimenta = !$original->movimenta_magazzino;
|
||||
}
|
||||
|
||||
|
|
|
@ -26,26 +26,26 @@ use Modules\Rivalse\RivalsaINPS;
|
|||
|
||||
trait RelationTrait
|
||||
{
|
||||
public function getParentID()
|
||||
public function getDocumentID()
|
||||
{
|
||||
return 'iddocumento';
|
||||
}
|
||||
|
||||
public function parent()
|
||||
public function document()
|
||||
{
|
||||
return $this->belongsTo(Fattura::class, $this->getParentID());
|
||||
return $this->belongsTo(Fattura::class, $this->getDocumentID());
|
||||
}
|
||||
|
||||
public function fattura()
|
||||
{
|
||||
return $this->parent();
|
||||
return $this->document();
|
||||
}
|
||||
|
||||
public function getNettoAttribute()
|
||||
{
|
||||
$result = $this->totale - $this->ritenuta_acconto - $this->ritenuta_contributi;
|
||||
|
||||
if ($this->parent->split_payment) {
|
||||
if ($this->getDocument()->split_payment) {
|
||||
$result = $result - $this->iva;
|
||||
}
|
||||
|
||||
|
@ -113,7 +113,7 @@ trait RelationTrait
|
|||
{
|
||||
if ($this->attributes['ritenuta_contributi']) {
|
||||
$result = $this->totale_imponibile;
|
||||
$ritenuta = $this->parent->ritenutaContributi;
|
||||
$ritenuta = $this->getDocument()->ritenutaContributi;
|
||||
|
||||
$result = $result * $ritenuta->percentuale_imponibile / 100;
|
||||
|
||||
|
|
|
@ -21,7 +21,7 @@ namespace Modules\Fatture;
|
|||
|
||||
use Auth;
|
||||
use Carbon\Carbon;
|
||||
use Common\Components\Description;
|
||||
use Common\Components\Component;
|
||||
use Common\Document;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Modules\Anagrafiche\Anagrafica;
|
||||
|
@ -86,7 +86,7 @@ class Fattura extends Document
|
|||
*/
|
||||
public static function build(Anagrafica $anagrafica, Tipo $tipo_documento, $data, $id_segment, $numero_esterno = null)
|
||||
{
|
||||
$model = parent::build();
|
||||
$model = new static();
|
||||
|
||||
$user = Auth::user();
|
||||
|
||||
|
@ -416,7 +416,7 @@ class Fattura extends Document
|
|||
|
||||
// Metodi generali
|
||||
|
||||
public function triggerComponent(Description $trigger)
|
||||
public function triggerComponent(Component $trigger)
|
||||
{
|
||||
parent::triggerComponent($trigger);
|
||||
|
||||
|
|
|
@ -19,10 +19,13 @@
|
|||
|
||||
namespace Modules\Fatture;
|
||||
|
||||
use Common\Model;
|
||||
use Common\SimpleModelTrait;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class Stato extends Model
|
||||
{
|
||||
use SimpleModelTrait;
|
||||
|
||||
protected $table = 'co_statidocumento';
|
||||
|
||||
public function fatture()
|
||||
|
|
|
@ -19,10 +19,13 @@
|
|||
|
||||
namespace Modules\Fatture;
|
||||
|
||||
use Common\Model;
|
||||
use Common\SimpleModelTrait;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class StatoFE extends Model
|
||||
{
|
||||
use SimpleModelTrait;
|
||||
|
||||
public $incrementing = false;
|
||||
protected $table = 'fe_stati_documento';
|
||||
protected $primaryKey = 'codice';
|
||||
|
|
|
@ -19,10 +19,13 @@
|
|||
|
||||
namespace Modules\Fatture;
|
||||
|
||||
use Common\Model;
|
||||
use Common\SimpleModelTrait;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class Tipo extends Model
|
||||
{
|
||||
use SimpleModelTrait;
|
||||
|
||||
protected $table = 'co_tipidocumento';
|
||||
|
||||
public function fatture()
|
||||
|
|
|
@ -19,11 +19,14 @@
|
|||
|
||||
namespace Modules\Impianti;
|
||||
|
||||
use Common\Model;
|
||||
use Common\SimpleModelTrait;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Modules\Anagrafiche\Anagrafica;
|
||||
|
||||
class Impianto extends Model
|
||||
{
|
||||
use SimpleModelTrait;
|
||||
|
||||
protected $table = 'my_impianti';
|
||||
|
||||
// Relazioni Eloquent
|
||||
|
|
|
@ -552,7 +552,7 @@ switch (post('op')) {
|
|||
$righe = $intervento->getRighe();
|
||||
foreach ($righe as $riga) {
|
||||
$new_riga = $riga->replicate();
|
||||
$new_riga->setParent($new);
|
||||
$new_riga->setDocument($new);
|
||||
|
||||
$new_riga->qta_evasa = 0;
|
||||
$new_riga->save();
|
||||
|
|
|
@ -184,7 +184,7 @@ switch (post('op')) {
|
|||
$righe = $intervento->getRighe();
|
||||
foreach ($righe as $riga) {
|
||||
$new_riga = $riga->replicate();
|
||||
$new_riga->setParent($new);
|
||||
$new_riga->setDocument($new);
|
||||
|
||||
$new_riga->qta_evasa = 0;
|
||||
$new_riga->save();
|
||||
|
|
|
@ -25,19 +25,19 @@ trait RelationTrait
|
|||
{
|
||||
protected $disableOrder = true;
|
||||
|
||||
public function getParentID()
|
||||
public function getDocumentID()
|
||||
{
|
||||
return 'idintervento';
|
||||
}
|
||||
|
||||
public function parent()
|
||||
public function document()
|
||||
{
|
||||
return $this->belongsTo(Intervento::class, $this->getParentID());
|
||||
return $this->belongsTo(Intervento::class, $this->getDocumentID());
|
||||
}
|
||||
|
||||
public function intervento()
|
||||
{
|
||||
return $this->parent();
|
||||
return $this->document();
|
||||
}
|
||||
|
||||
public function fixIvaIndetraibile()
|
||||
|
|
|
@ -19,21 +19,23 @@
|
|||
|
||||
namespace Modules\Interventi\Components;
|
||||
|
||||
use Common\Model;
|
||||
use Common\SimpleModelTrait;
|
||||
use DateTime;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use InvalidArgumentException;
|
||||
use Modules\Anagrafiche\Anagrafica;
|
||||
use Modules\Interventi\Intervento;
|
||||
use Modules\Iva\Aliquota;
|
||||
use Modules\TipiIntervento\Tipo as TipoSessione;
|
||||
|
||||
/**
|
||||
/*
|
||||
* Notazione: i costi sono rivolti all'azienda, i prezzi al cliente.
|
||||
*
|
||||
* @since 2.4.9
|
||||
*/
|
||||
use Modules\Iva\Aliquota;
|
||||
use Modules\TipiIntervento\Tipo as TipoSessione;
|
||||
|
||||
class Sessione extends Model
|
||||
{
|
||||
use SimpleModelTrait;
|
||||
use RelationTrait;
|
||||
|
||||
protected $table = 'in_interventi_tecnici';
|
||||
|
@ -54,9 +56,9 @@ class Sessione extends Model
|
|||
throw new InvalidArgumentException();
|
||||
}
|
||||
|
||||
$model = parent::build();
|
||||
$model = new static();
|
||||
|
||||
$model->parent()->associate($intervento);
|
||||
$model->document()->associate($intervento);
|
||||
$model->anagrafica()->associate($anagrafica);
|
||||
|
||||
$id_tipo = $intervento['idtipointervento'];
|
||||
|
@ -152,7 +154,7 @@ class Sessione extends Model
|
|||
return parent::save($options);
|
||||
}
|
||||
|
||||
public function getParentID()
|
||||
public function getDocumentID()
|
||||
{
|
||||
return 'idintervento';
|
||||
}
|
||||
|
@ -171,7 +173,7 @@ class Sessione extends Model
|
|||
|
||||
public function parent()
|
||||
{
|
||||
return $this->belongsTo(Intervento::class, $this->getParentID());
|
||||
return $this->belongsTo(Intervento::class, $this->getDocumentID());
|
||||
}
|
||||
|
||||
// Costi per l'azienda
|
||||
|
|
|
@ -54,7 +54,7 @@ class Intervento extends Document
|
|||
*/
|
||||
public static function build(Anagrafica $anagrafica, TipoSessione $tipo_sessione, Stato $stato, $data_richiesta)
|
||||
{
|
||||
$model = parent::build();
|
||||
$model = new static();
|
||||
|
||||
$model->anagrafica()->associate($anagrafica);
|
||||
$model->stato()->associate($stato);
|
||||
|
|
|
@ -19,10 +19,13 @@
|
|||
|
||||
namespace Modules\Interventi;
|
||||
|
||||
use Common\Model;
|
||||
use Common\SimpleModelTrait;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class Stato extends Model
|
||||
{
|
||||
use SimpleModelTrait;
|
||||
|
||||
protected $primaryKey = 'idstatointervento';
|
||||
protected $table = 'in_statiintervento';
|
||||
|
||||
|
|
|
@ -19,10 +19,13 @@
|
|||
|
||||
namespace Modules\Interventi;
|
||||
|
||||
use Common\Model;
|
||||
use Common\SimpleModelTrait;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class Tipo extends Model
|
||||
{
|
||||
use SimpleModelTrait;
|
||||
|
||||
protected $primaryKey = 'idtipointervento';
|
||||
protected $table = 'in_tipiintervento';
|
||||
|
||||
|
|
|
@ -19,9 +19,12 @@
|
|||
|
||||
namespace Modules\Iva;
|
||||
|
||||
use Common\Model;
|
||||
use Common\SimpleModelTrait;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class Aliquota extends Model
|
||||
{
|
||||
use SimpleModelTrait;
|
||||
|
||||
protected $table = 'co_iva';
|
||||
}
|
||||
|
|
|
@ -19,15 +19,18 @@
|
|||
|
||||
namespace Modules\Listini;
|
||||
|
||||
use Common\Model;
|
||||
use Common\SimpleModelTrait;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class Listino extends Model
|
||||
{
|
||||
use SimpleModelTrait;
|
||||
|
||||
protected $table = 'mg_listini';
|
||||
|
||||
public static function build($nome, $percentuale)
|
||||
{
|
||||
$model = parent::build();
|
||||
$model = new static();
|
||||
|
||||
$model->nome = $nome;
|
||||
$model->percentuale = $percentuale;
|
||||
|
|
|
@ -19,13 +19,15 @@
|
|||
|
||||
namespace Modules\Newsletter;
|
||||
|
||||
use Common\Model;
|
||||
use Common\SimpleModelTrait;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
use Modules\Anagrafiche\Anagrafica;
|
||||
use Traits\RecordTrait;
|
||||
|
||||
class Lista extends Model
|
||||
{
|
||||
use SimpleModelTrait;
|
||||
use SoftDeletes;
|
||||
use RecordTrait;
|
||||
|
||||
|
@ -33,7 +35,7 @@ class Lista extends Model
|
|||
|
||||
public static function build($name)
|
||||
{
|
||||
$model = parent::build();
|
||||
$model = new static();
|
||||
$model->name = $name;
|
||||
|
||||
$model->save();
|
||||
|
|
|
@ -19,7 +19,8 @@
|
|||
|
||||
namespace Modules\Newsletter;
|
||||
|
||||
use Common\Model;
|
||||
use Common\SimpleModelTrait;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
use Models\User;
|
||||
use Modules\Anagrafiche\Anagrafica;
|
||||
|
@ -30,6 +31,7 @@ use Traits\RecordTrait;
|
|||
|
||||
class Newsletter extends Model
|
||||
{
|
||||
use SimpleModelTrait;
|
||||
use SoftDeletes;
|
||||
use RecordTrait;
|
||||
|
||||
|
@ -37,7 +39,7 @@ class Newsletter extends Model
|
|||
|
||||
public static function build(User $user, Template $template, $name)
|
||||
{
|
||||
$model = parent::build();
|
||||
$model = new static();
|
||||
|
||||
$model->user()->associate($user);
|
||||
$model->template()->associate($template);
|
||||
|
|
|
@ -403,7 +403,7 @@ switch (post('op')) {
|
|||
$qta = post('qta_da_evadere')[$riga->id];
|
||||
|
||||
$copia = $riga->replicate();
|
||||
$copia->setParent($ordine);
|
||||
$copia->setDocument($ordine);
|
||||
|
||||
// Ripristino dei valori di default per campi potenzialmente impostati
|
||||
$copia->original_id = null;
|
||||
|
|
|
@ -69,9 +69,9 @@ foreach ($righe as $riga) {
|
|||
<td>';
|
||||
|
||||
// Aggiunta dei riferimenti ai documenti
|
||||
if ($riga->hasOriginal()) {
|
||||
if ($riga->hasOriginalComponent()) {
|
||||
echo '
|
||||
<small class="pull-right text-right text-muted">'.reference($riga->getOriginal()->parent, tr('Origine')).'</small>';
|
||||
<small class="pull-right text-right text-muted">'.reference($riga->getOriginalComponent()->getDocument(), tr('Origine')).'</small>';
|
||||
}
|
||||
|
||||
if ($riga->isArticolo()) {
|
||||
|
|
|
@ -23,18 +23,18 @@ use Modules\Ordini\Ordine;
|
|||
|
||||
trait RelationTrait
|
||||
{
|
||||
public function getParentID()
|
||||
public function getDocumentID()
|
||||
{
|
||||
return 'idordine';
|
||||
}
|
||||
|
||||
public function parent()
|
||||
public function document()
|
||||
{
|
||||
return $this->belongsTo(Ordine::class, $this->getParentID());
|
||||
return $this->belongsTo(Ordine::class, $this->getDocumentID());
|
||||
}
|
||||
|
||||
public function ordine()
|
||||
{
|
||||
return $this->parent();
|
||||
return $this->document();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
|
||||
namespace Modules\Ordini;
|
||||
|
||||
use Common\Components\Description;
|
||||
use Common\Components\Component;
|
||||
use Common\Document;
|
||||
use Modules\Anagrafiche\Anagrafica;
|
||||
use Modules\DDT\DDT;
|
||||
|
@ -47,7 +47,7 @@ class Ordine extends Document
|
|||
*/
|
||||
public static function build(Anagrafica $anagrafica, Tipo $tipo_documento, $data)
|
||||
{
|
||||
$model = parent::build();
|
||||
$model = new static();
|
||||
|
||||
$stato_documento = Stato::where('descrizione', 'Bozza')->first();
|
||||
|
||||
|
@ -147,7 +147,7 @@ class Ordine extends Document
|
|||
* Effettua un controllo sui campi del documento.
|
||||
* Viene richiamato dalle modifiche alle righe del documento.
|
||||
*/
|
||||
public function triggerEvasione(Description $trigger)
|
||||
public function triggerEvasione(Component $trigger)
|
||||
{
|
||||
parent::triggerEvasione($trigger);
|
||||
|
||||
|
@ -163,7 +163,7 @@ class Ordine extends Document
|
|||
// Impostazione del nuovo stato
|
||||
if ($qta_evasa == 0) {
|
||||
$descrizione = 'Bozza';
|
||||
} elseif (!in_array($stato_attuale->descrizione, ['Parzialmente fatturato', 'Fatturato']) && $trigger->parent instanceof DDT) {
|
||||
} elseif (!in_array($stato_attuale->descrizione, ['Parzialmente fatturato', 'Fatturato']) && $trigger->getDocument() instanceof DDT) {
|
||||
$descrizione = $parziale ? 'Parzialmente evaso' : 'Evaso';
|
||||
} else {
|
||||
$descrizione = $parziale ? 'Parzialmente fatturato' : 'Fatturato';
|
||||
|
|
|
@ -19,10 +19,13 @@
|
|||
|
||||
namespace Modules\Ordini;
|
||||
|
||||
use Common\Model;
|
||||
use Common\SimpleModelTrait;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class Stato extends Model
|
||||
{
|
||||
use SimpleModelTrait;
|
||||
|
||||
protected $table = 'or_statiordine';
|
||||
|
||||
public function ordini()
|
||||
|
|
|
@ -19,10 +19,13 @@
|
|||
|
||||
namespace Modules\Ordini;
|
||||
|
||||
use Common\Model;
|
||||
use Common\SimpleModelTrait;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class Tipo extends Model
|
||||
{
|
||||
use SimpleModelTrait;
|
||||
|
||||
protected $table = 'or_tipiordine';
|
||||
|
||||
public function ordini()
|
||||
|
|
|
@ -19,11 +19,14 @@
|
|||
|
||||
namespace Modules\Pagamenti;
|
||||
|
||||
use Common\Model;
|
||||
use Common\SimpleModelTrait;
|
||||
use DateTime;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class Pagamento extends Model
|
||||
{
|
||||
use SimpleModelTrait;
|
||||
|
||||
protected $table = 'co_pagamenti';
|
||||
|
||||
public function fatture()
|
||||
|
|
|
@ -107,7 +107,7 @@ switch (post('op')) {
|
|||
$righe = $preventivo->getRighe();
|
||||
foreach ($righe as $riga) {
|
||||
$new_riga = $riga->replicate();
|
||||
$new_riga->setParent($new);
|
||||
$new_riga->setDocument($new);
|
||||
|
||||
$new_riga->qta_evasa = 0;
|
||||
$new_riga->save();
|
||||
|
@ -334,7 +334,7 @@ switch (post('op')) {
|
|||
$righe = $preventivo->getRighe();
|
||||
foreach ($righe as $riga) {
|
||||
$new_riga = $riga->replicate();
|
||||
$new_riga->setParent($new);
|
||||
$new_riga->setDocument($new);
|
||||
|
||||
$new_riga->qta_evasa = 0;
|
||||
$new_riga->save();
|
||||
|
|
|
@ -50,9 +50,9 @@ foreach ($righe as $riga) {
|
|||
<td>';
|
||||
|
||||
// Aggiunta dei riferimenti ai documenti
|
||||
if ($riga->hasOriginal()) {
|
||||
if ($riga->hasOriginalComponent()) {
|
||||
echo '
|
||||
<small class="pull-right text-right text-muted">'.reference($riga->getOriginal()->parent, tr('Origine')).'</small>';
|
||||
<small class="pull-right text-right text-muted">'.reference($riga->getOriginalComponent()->getDocument(), tr('Origine')).'</small>';
|
||||
}
|
||||
|
||||
// Descrizione
|
||||
|
|
|
@ -23,18 +23,18 @@ use Modules\Preventivi\Preventivo;
|
|||
|
||||
trait RelationTrait
|
||||
{
|
||||
public function getParentID()
|
||||
public function getDocumentID()
|
||||
{
|
||||
return 'idpreventivo';
|
||||
}
|
||||
|
||||
public function parent()
|
||||
public function document()
|
||||
{
|
||||
return $this->belongsTo(Preventivo::class, $this->getParentID());
|
||||
return $this->belongsTo(Preventivo::class, $this->getDocumentID());
|
||||
}
|
||||
|
||||
public function preventivo()
|
||||
{
|
||||
return $this->parent();
|
||||
return $this->document();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -21,7 +21,7 @@ namespace Modules\Preventivi;
|
|||
|
||||
use Carbon\Carbon;
|
||||
use Carbon\CarbonInterval;
|
||||
use Common\Components\Description;
|
||||
use Common\Components\Component;
|
||||
use Common\Document;
|
||||
use Modules\Anagrafiche\Anagrafica;
|
||||
use Modules\Interventi\Intervento;
|
||||
|
@ -47,7 +47,7 @@ class Preventivo extends Document
|
|||
*/
|
||||
public static function build(Anagrafica $anagrafica, TipoSessione $tipo_sessione, $nome, $data_bozza, $id_sede)
|
||||
{
|
||||
$model = parent::build();
|
||||
$model = new static();
|
||||
|
||||
$stato_documento = Stato::where('descrizione', 'Bozza')->first();
|
||||
|
||||
|
@ -230,7 +230,7 @@ class Preventivo extends Document
|
|||
* Effettua un controllo sui campi del documento.
|
||||
* Viene richiamato dalle modifiche alle righe del documento.
|
||||
*/
|
||||
public function triggerEvasione(Description $trigger)
|
||||
public function triggerEvasione(Component $trigger)
|
||||
{
|
||||
parent::triggerEvasione($trigger);
|
||||
|
||||
|
@ -246,7 +246,7 @@ class Preventivo extends Document
|
|||
if ($qta_evasa == 0) {
|
||||
$descrizione = 'In lavorazione';
|
||||
$codice_intervento = 'OK';
|
||||
} elseif (!in_array($stato_attuale->descrizione, ['Parzialmente fatturato', 'Fatturato']) && $trigger->parent instanceof Ordine) {
|
||||
} elseif (!in_array($stato_attuale->descrizione, ['Parzialmente fatturato', 'Fatturato']) && $trigger->getDocument() instanceof Ordine) {
|
||||
$descrizione = $this->stato->descrizione;
|
||||
$codice_intervento = 'OK';
|
||||
} else {
|
||||
|
|
|
@ -19,10 +19,13 @@
|
|||
|
||||
namespace Modules\Preventivi;
|
||||
|
||||
use Common\Model;
|
||||
use Common\SimpleModelTrait;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class Stato extends Model
|
||||
{
|
||||
use SimpleModelTrait;
|
||||
|
||||
protected $table = 'co_statipreventivi';
|
||||
|
||||
public function preventivi()
|
||||
|
|
|
@ -19,18 +19,21 @@
|
|||
|
||||
namespace Modules\PrimaNota;
|
||||
|
||||
use Common\Model;
|
||||
use Common\SimpleModelTrait;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Modules\Fatture\Fattura;
|
||||
use Modules\Scadenzario\Scadenza;
|
||||
|
||||
/**
|
||||
/*
|
||||
* Struttura ausiliaria dedicata alla raggruppamento e alla gestione di un insieme di Movimenti, unificati attraverso il numero di mastrino.
|
||||
*
|
||||
* Questa classe non è utilizzabile come normale modello Eloquent poichè non prevede operazioni di modifica a livello di database.
|
||||
* La creazione di un record può essere utilizzata per la gestione di un insieme di Movimenti, mentre l'eliminazione provoca la rimozione in cascata dei Movimenti associati al Mastrino.
|
||||
*/
|
||||
use Modules\Scadenzario\Scadenza;
|
||||
|
||||
class Mastrino extends Model
|
||||
{
|
||||
use SimpleModelTrait;
|
||||
|
||||
public $incrementing = false;
|
||||
protected $table = 'co_movimenti';
|
||||
protected $primaryKey = 'idmastrino';
|
||||
|
@ -44,7 +47,7 @@ class Mastrino extends Model
|
|||
|
||||
public static function build($descrizione, $data, $is_insoluto = false, $contabile = false)
|
||||
{
|
||||
$model = parent::build();
|
||||
$model = new static();
|
||||
|
||||
$model->idmastrino = self::getNextMastrino();
|
||||
$model->data = $data;
|
||||
|
|
|
@ -19,12 +19,15 @@
|
|||
|
||||
namespace Modules\PrimaNota;
|
||||
|
||||
use Common\Model;
|
||||
use Common\SimpleModelTrait;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Modules\Fatture\Fattura;
|
||||
use Modules\Scadenzario\Scadenza;
|
||||
|
||||
class Movimento extends Model
|
||||
{
|
||||
use SimpleModelTrait;
|
||||
|
||||
protected $table = 'co_movimenti';
|
||||
|
||||
protected $appends = [
|
||||
|
@ -35,7 +38,7 @@ class Movimento extends Model
|
|||
|
||||
public static function build(Mastrino $mastrino, $id_conto, Fattura $documento = null, Scadenza $scadenza = null)
|
||||
{
|
||||
$model = parent::build();
|
||||
$model = new static();
|
||||
|
||||
// Informazioni dipendenti dal mastrino
|
||||
$model->idmastrino = $mastrino->idmastrino;
|
||||
|
|
|
@ -19,9 +19,12 @@
|
|||
|
||||
namespace Modules\Ritenute;
|
||||
|
||||
use Common\Model;
|
||||
use Common\SimpleModelTrait;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class RitenutaAcconto extends Model
|
||||
{
|
||||
use SimpleModelTrait;
|
||||
|
||||
protected $table = 'co_ritenutaacconto';
|
||||
}
|
||||
|
|
|
@ -19,11 +19,14 @@
|
|||
|
||||
namespace Modules\RitenuteContributi;
|
||||
|
||||
use Common\Model;
|
||||
use Common\SimpleModelTrait;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Modules\Fatture\Fattura;
|
||||
|
||||
class RitenutaContributi extends Model
|
||||
{
|
||||
use SimpleModelTrait;
|
||||
|
||||
protected $table = 'co_ritenuta_contributi';
|
||||
|
||||
public function fatture()
|
||||
|
|
|
@ -19,9 +19,12 @@
|
|||
|
||||
namespace Modules\Rivalse;
|
||||
|
||||
use Common\Model;
|
||||
use Common\SimpleModelTrait;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class RivalsaINPS extends Model
|
||||
{
|
||||
use SimpleModelTrait;
|
||||
|
||||
protected $table = 'co_rivalse';
|
||||
}
|
||||
|
|
|
@ -19,11 +19,14 @@
|
|||
|
||||
namespace Modules\Scadenzario;
|
||||
|
||||
use Common\Model;
|
||||
use Common\SimpleModelTrait;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Modules\Fatture\Fattura;
|
||||
|
||||
class Scadenza extends Model
|
||||
{
|
||||
use SimpleModelTrait;
|
||||
|
||||
protected $table = 'co_scadenziario';
|
||||
|
||||
protected $dates = [
|
||||
|
@ -33,7 +36,7 @@ class Scadenza extends Model
|
|||
|
||||
public static function build($descrizione, $importo, $data_scadenza, $type = 'fattura', $is_pagato = false)
|
||||
{
|
||||
$model = parent::build();
|
||||
$model = new static();
|
||||
|
||||
$model->descrizione = $descrizione;
|
||||
$model->scadenza = $data_scadenza;
|
||||
|
|
|
@ -19,11 +19,14 @@
|
|||
|
||||
namespace Modules\TipiIntervento;
|
||||
|
||||
use Common\Model;
|
||||
use Common\SimpleModelTrait;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Modules\Anagrafiche\Anagrafica;
|
||||
|
||||
class Tipo extends Model
|
||||
{
|
||||
use SimpleModelTrait;
|
||||
|
||||
protected $table = 'in_tipiintervento';
|
||||
protected $primaryKey = 'idtipointervento';
|
||||
|
||||
|
@ -38,7 +41,7 @@ class Tipo extends Model
|
|||
*/
|
||||
public static function build($codice, $descrizione)
|
||||
{
|
||||
$model = parent::build();
|
||||
$model = new static();
|
||||
|
||||
$model->codice = $codice;
|
||||
$model->descrizione = $descrizione;
|
||||
|
|
|
@ -19,18 +19,20 @@
|
|||
|
||||
namespace Plugins\DettagliArticolo;
|
||||
|
||||
use Common\Model;
|
||||
use Common\SimpleModelTrait;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
use Modules\Anagrafiche\Anagrafica;
|
||||
use Modules\Articoli\Articolo;
|
||||
|
||||
/**
|
||||
/*
|
||||
* Classe per la gestione delle relazioni tra articolo e fornitore.
|
||||
*
|
||||
* @since 2.4.15
|
||||
*/
|
||||
class DettaglioFornitore extends Model
|
||||
{
|
||||
use SimpleModelTrait;
|
||||
use SoftDeletes;
|
||||
|
||||
protected $table = 'mg_fornitore_articolo';
|
||||
|
@ -42,7 +44,7 @@ class DettaglioFornitore extends Model
|
|||
*/
|
||||
public static function build(Anagrafica $fornitore, Articolo $articolo)
|
||||
{
|
||||
$model = parent::build();
|
||||
$model = new static();
|
||||
|
||||
$model->anagrafica()->associate($fornitore);
|
||||
$model->articolo()->associate($articolo);
|
||||
|
|
|
@ -19,18 +19,21 @@
|
|||
|
||||
namespace Plugins\DettagliArticolo;
|
||||
|
||||
use Common\Model;
|
||||
use Common\SimpleModelTrait;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Modules\Anagrafiche\Anagrafica;
|
||||
use Modules\Articoli\Articolo;
|
||||
use Modules\Iva\Aliquota;
|
||||
|
||||
/**
|
||||
/*
|
||||
* Classe per la gestione delle relazioni articolo-prezzo sulla base di un range di quantità e di una specifica anagrafica.
|
||||
*
|
||||
* @since 2.4.18
|
||||
*/
|
||||
class DettaglioPrezzo extends Model
|
||||
{
|
||||
use SimpleModelTrait;
|
||||
|
||||
protected $table = 'mg_prezzi_articoli';
|
||||
|
||||
/**
|
||||
|
@ -40,7 +43,7 @@ class DettaglioPrezzo extends Model
|
|||
*/
|
||||
public static function build(Articolo $articolo, Anagrafica $anagrafica, $direzione = 'uscita')
|
||||
{
|
||||
$model = parent::build();
|
||||
$model = new static();
|
||||
|
||||
$model->anagrafica()->associate($anagrafica);
|
||||
$model->articolo()->associate($articolo);
|
||||
|
|
|
@ -19,18 +19,20 @@
|
|||
|
||||
namespace Plugins\DichiarazioniIntento;
|
||||
|
||||
use Common\Model;
|
||||
use Common\SimpleModelTrait;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
use Modules\Anagrafiche\Anagrafica;
|
||||
use Modules\Fatture\Fattura;
|
||||
|
||||
/**
|
||||
/*
|
||||
* Classe per la gestione delle dichiarazione d'intento.
|
||||
*
|
||||
* @since 2.4.11
|
||||
*/
|
||||
class Dichiarazione extends Model
|
||||
{
|
||||
use SimpleModelTrait;
|
||||
use SoftDeletes;
|
||||
|
||||
protected $table = 'co_dichiarazioni_intento';
|
||||
|
@ -48,7 +50,7 @@ class Dichiarazione extends Model
|
|||
*/
|
||||
public static function build(Anagrafica $anagrafica, $data, $numero_protocollo, $numero_progressivo, $data_inizio, $data_fine)
|
||||
{
|
||||
$model = parent::build();
|
||||
$model = new static();
|
||||
|
||||
$model->anagrafica()->associate($anagrafica);
|
||||
|
||||
|
|
|
@ -1185,8 +1185,8 @@ class FatturaElettronica
|
|||
$descrizione = str_replace('’', ' ', $descrizione);
|
||||
|
||||
// Aggiunta dei riferimenti ai documenti
|
||||
if (setting('Riferimento dei documenti in Fattura Elettronica') && $riga->hasOriginal()) {
|
||||
$descrizione .= "\n".$riga->getOriginal()->parent->getReference();
|
||||
if (setting('Riferimento dei documenti in Fattura Elettronica') && $riga->hasOriginalComponent()) {
|
||||
$descrizione .= "\n".$riga->getOriginalComponent()->getDocument()->getReference();
|
||||
}
|
||||
|
||||
$dettaglio['Descrizione'] = $descrizione;
|
||||
|
|
|
@ -362,7 +362,7 @@ switch (filter('op')) {
|
|||
|
||||
// Ricerca della riga
|
||||
$riga = $documento->getRiga($namespace.$type, $collegamento['id']);
|
||||
$riga_origine = $riga->getOriginal();
|
||||
$riga_origine = $riga->getOriginalComponent();
|
||||
|
||||
// Compilazione dei dati
|
||||
$results[$key] = [
|
||||
|
|
|
@ -54,7 +54,7 @@ $id_riferimento = get('id_riferimento');
|
|||
$righe = $documento->getRighe();
|
||||
foreach ($righe as $riga) {
|
||||
$qta_rimanente = $riga->qta_rimanente - $righe_utilizzate[$riga->id];
|
||||
$riga_origine = $riga->getOriginal();
|
||||
$riga_origine = $riga->getOriginalComponent();
|
||||
|
||||
$dettagli = [
|
||||
'tipo' => get_class($riga),
|
||||
|
|
|
@ -45,7 +45,7 @@ class Pianificazione extends Document
|
|||
*/
|
||||
public static function build(Contratto $contratto, $data_scadenza)
|
||||
{
|
||||
$model = parent::build();
|
||||
$model = new static();
|
||||
|
||||
$model->contratto()->associate($contratto);
|
||||
|
||||
|
|
|
@ -127,7 +127,7 @@ switch ($operazione) {
|
|||
$righe = $promemoria_originale->getRighe();
|
||||
foreach ($righe as $riga) {
|
||||
$copia = $riga->replicate();
|
||||
$copia->setParent($promemoria_corrente);
|
||||
$copia->setDocument($promemoria_corrente);
|
||||
$copia->save();
|
||||
}
|
||||
|
||||
|
|
|
@ -25,19 +25,19 @@ trait RelationTrait
|
|||
{
|
||||
protected $disableOrder = true;
|
||||
|
||||
public function getParentID()
|
||||
public function getDocumentID()
|
||||
{
|
||||
return 'id_promemoria';
|
||||
}
|
||||
|
||||
public function parent()
|
||||
public function document()
|
||||
{
|
||||
return $this->belongsTo(Promemoria::class, $this->getParentID());
|
||||
return $this->belongsTo(Promemoria::class, $this->getDocumentID());
|
||||
}
|
||||
|
||||
public function contratto()
|
||||
{
|
||||
return $this->parent();
|
||||
return $this->document();
|
||||
}
|
||||
|
||||
public function fixIvaIndetraibile()
|
||||
|
|
|
@ -49,7 +49,7 @@ class Promemoria extends Document
|
|||
*/
|
||||
public static function build(Contratto $contratto, TipoSessione $tipo, $data_richiesta)
|
||||
{
|
||||
$model = parent::build();
|
||||
$model = new static();
|
||||
|
||||
$model->contratto()->associate($contratto);
|
||||
$model->tipo()->associate($tipo);
|
||||
|
|
|
@ -0,0 +1,405 @@
|
|||
<?php
|
||||
/*
|
||||
* OpenSTAManager: il software gestionale open source per l'assistenza tecnica e la fatturazione
|
||||
* Copyright (C) DevCode s.n.c.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
namespace Common\Components;
|
||||
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Modules\Iva\Aliquota;
|
||||
|
||||
/**
|
||||
* Classe dedicata alla gestione delle informazioni contabili standard di una componente dei Documenti.
|
||||
*
|
||||
* Prevede i seguenti campi nel database:
|
||||
*
|
||||
* @property float prezzo_unitario
|
||||
* @property float iva_unitaria = prezzo_unitario * percentuale_iva
|
||||
* @property float prezzo_unitario_ivato = prezzo_unitario + iva_unitaria
|
||||
* @property float sconto_unitario
|
||||
* @property float sconto_iva_unitario = sconto_unitario * percentuale_iva
|
||||
* @property float sconto_unitario_ivato = sconto_unitario + sconto_iva_unitario
|
||||
*
|
||||
* Introduce i seguenti campi ausiliari:
|
||||
* @property float imponibile = prezzo_unitario * qta
|
||||
* @property float sconto = sconto_unitario * qta
|
||||
* @property float totale_imponibile = (prezzo_unitario - sconto_unitario) * qta [Imponibile con sconto]
|
||||
* @property float iva = (iva_unitaria - sconto_iva_unitario) * qta
|
||||
* @property float totale = (prezzo_unitario_ivato - sconto_unitario_ivato) * qta [Totale imponibile con IVA]
|
||||
* @property float importo = se incorpora_iva: totale, altrimenti: totale_imponibile
|
||||
*
|
||||
* Per una estensione del sistema dei totali (Rivalsa, Ritenuta, ...), si consiglia di introdurre un relativo Netto a pagare. [Fatture]
|
||||
*
|
||||
* @since 2.4.18
|
||||
*/
|
||||
abstract class Accounting extends Component
|
||||
{
|
||||
protected $casts = [
|
||||
'qta' => 'float',
|
||||
'prezzo_unitario' => 'float',
|
||||
'prezzo_unitario_ivato' => 'float',
|
||||
'iva_unitaria' => 'float',
|
||||
'sconto_percentuale' => 'float',
|
||||
'sconto_unitario' => 'float',
|
||||
'sconto_iva_unitario' => 'float',
|
||||
'sconto_unitario_ivato' => 'float',
|
||||
//'qta_evasa' => 'float',
|
||||
];
|
||||
|
||||
protected $appends = [
|
||||
'prezzo_unitario_corrente',
|
||||
'sconto_unitario_corrente',
|
||||
'max_qta',
|
||||
];
|
||||
|
||||
public function getIvaIndetraibileAttribute()
|
||||
{
|
||||
return $this->iva / 100 * $this->aliquota->indetraibile;
|
||||
}
|
||||
|
||||
public function aliquota()
|
||||
{
|
||||
return $this->belongsTo(Aliquota::class, 'idiva');
|
||||
}
|
||||
|
||||
public function getIvaAttribute()
|
||||
{
|
||||
return ($this->iva_unitaria - $this->sconto_iva_unitario) * $this->qta;
|
||||
}
|
||||
|
||||
/**
|
||||
* Imposta il prezzo unitario secondo le informazioni indicate per valore e tipologia (UNT o PRC).
|
||||
*
|
||||
* @param $value
|
||||
* @param $type
|
||||
*/
|
||||
public function setPrezzoUnitario($prezzo_unitario, $id_iva)
|
||||
{
|
||||
$this->id_iva = $id_iva;
|
||||
|
||||
// Gestione IVA incorporata
|
||||
if ($this->incorporaIVA()) {
|
||||
$this->prezzo_unitario_ivato = $prezzo_unitario;
|
||||
} else {
|
||||
$this->prezzo_unitario = $prezzo_unitario;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Restituisce il totale (imponibile + iva) dell'elemento.
|
||||
*
|
||||
* @return float
|
||||
*/
|
||||
public function getTotaleAttribute()
|
||||
{
|
||||
return ($this->prezzo_unitario_ivato - $this->sconto_unitario_ivato) * $this->qta;
|
||||
}
|
||||
|
||||
/**
|
||||
* Restituisce l'imponibile dell'elemento (prezzo unitario senza IVA * qta).
|
||||
*
|
||||
* @return float
|
||||
*/
|
||||
public function getImponibileAttribute()
|
||||
{
|
||||
return $this->prezzo_unitario * $this->qta;
|
||||
}
|
||||
|
||||
/**
|
||||
* Restituisce il tipo di sconto della riga corrente.
|
||||
*
|
||||
* @return float
|
||||
*/
|
||||
public function getTipoScontoAttribute()
|
||||
{
|
||||
return $this->sconto_percentuale ? 'PRC' : 'UNT';
|
||||
}
|
||||
|
||||
/**
|
||||
* Restituisce il margine totale (imponibile - spesa) relativo all'elemento.
|
||||
*
|
||||
* @return float
|
||||
*/
|
||||
public function getMargineAttribute()
|
||||
{
|
||||
return $this->totale_imponibile - $this->spesa;
|
||||
}
|
||||
|
||||
/**
|
||||
* Restituisce l'importo (unitario oppure unitario ivato a seconda dell'impostazione 'Utilizza prezzi di vendita con IVA incorporata') per la riga.
|
||||
*
|
||||
* @return float
|
||||
*/
|
||||
public function getImportoAttribute()
|
||||
{
|
||||
return $this->incorporaIVA() ? $this->totale : $this->totale_imponibile;
|
||||
}
|
||||
|
||||
/**
|
||||
* Restituisce il totale imponibile dell'elemento (imponibile - sconto unitario senza IVA).
|
||||
*
|
||||
* @return float
|
||||
*/
|
||||
public function getTotaleImponibileAttribute()
|
||||
{
|
||||
$result = $this->prezzo_unitario >= 0 ? $this->imponibile : -$this->imponibile;
|
||||
|
||||
$result -= $this->sconto;
|
||||
|
||||
return $this->prezzo_unitario >= 0 ? $result : -$result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Imposta il sconto unitario ivato (con IVA) per la riga corrente.
|
||||
*
|
||||
* @param $value
|
||||
*/
|
||||
public function setScontoUnitarioIvatoAttribute($value)
|
||||
{
|
||||
$this->attributes['sconto_unitario_ivato'] = $value;
|
||||
$percentuale_iva = floatval($this->aliquota->percentuale) / 100;
|
||||
|
||||
$this->attributes['sconto_iva_unitario'] = $value * $percentuale_iva / (1 + $percentuale_iva); // Calcolo IVA
|
||||
$this->attributes['sconto_unitario'] = $value - $this->attributes['sconto_iva_unitario'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Restituisce la spesa (costo_unitario * qta) relativa all'elemento.
|
||||
*
|
||||
* @return float
|
||||
*/
|
||||
public function getSpesaAttribute()
|
||||
{
|
||||
return $this->costo_unitario * $this->qta;
|
||||
}
|
||||
|
||||
public function getIvaDetraibileAttribute()
|
||||
{
|
||||
return $this->iva - $this->iva_indetraibile;
|
||||
}
|
||||
|
||||
/**
|
||||
* Restituisce lo sconto unitario corrente (unitario oppure unitario ivato a seconda dell'impostazione 'Utilizza prezzi di vendita comprensivi di IVA') per la riga.
|
||||
*
|
||||
* @return float
|
||||
*/
|
||||
public function getScontoUnitarioCorrenteAttribute()
|
||||
{
|
||||
// Gestione IVA incorporata
|
||||
if ($this->incorporaIVA()) {
|
||||
return $this->sconto_unitario_ivato;
|
||||
} else {
|
||||
return $this->sconto_unitario;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Imposta lo sconto secondo le informazioni indicate per valore e tipologia (UNT o PRC).
|
||||
*
|
||||
* @param $value
|
||||
* @param $type
|
||||
*/
|
||||
public function setSconto($value, $type)
|
||||
{
|
||||
$incorpora_iva = $this->incorporaIVA();
|
||||
|
||||
if ($type == 'PRC') {
|
||||
$this->attributes['sconto_percentuale'] = $value;
|
||||
|
||||
$sconto = calcola_sconto([
|
||||
'sconto' => $value,
|
||||
'prezzo' => $incorpora_iva ? $this->prezzo_unitario_ivato : $this->prezzo_unitario,
|
||||
'tipo' => 'PRC',
|
||||
'qta' => 1,
|
||||
]);
|
||||
} else {
|
||||
$this->attributes['sconto_percentuale'] = 0;
|
||||
$sconto = $value;
|
||||
}
|
||||
|
||||
// Gestione IVA incorporata
|
||||
if ($incorpora_iva) {
|
||||
$this->sconto_unitario_ivato = $sconto;
|
||||
} else {
|
||||
$this->sconto_unitario = $sconto;
|
||||
}
|
||||
}
|
||||
|
||||
public function incorporaIVA()
|
||||
{
|
||||
return $this->getDocument()->direzione == 'entrata' && setting('Utilizza prezzi di vendita comprensivi di IVA');
|
||||
}
|
||||
|
||||
/**
|
||||
* Imposta il prezzo unitario (senza IVA) per la riga corrente.
|
||||
*
|
||||
* @param $value
|
||||
*/
|
||||
public function setPrezzoUnitarioAttribute($value)
|
||||
{
|
||||
$this->attributes['prezzo_unitario'] = $value;
|
||||
$percentuale_iva = floatval($this->aliquota->percentuale) / 100;
|
||||
|
||||
$this->attributes['iva_unitaria'] = $value * $percentuale_iva; // Calcolo IVA
|
||||
$this->attributes['prezzo_unitario_ivato'] = $value + $this->attributes['iva_unitaria'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Restituisce lo sconto della riga corrente in euro.
|
||||
*
|
||||
* @return float
|
||||
*/
|
||||
public function getScontoAttribute()
|
||||
{
|
||||
return $this->qta * $this->sconto_unitario;
|
||||
}
|
||||
|
||||
/**
|
||||
* Restituisce il prezzo unitario corrente (unitario oppure unitario ivato a seconda dell'impostazione 'Utilizza prezzi di vendita comprensivi di IVA') per la riga.
|
||||
*
|
||||
* @return float
|
||||
*/
|
||||
public function getPrezzoUnitarioCorrenteAttribute()
|
||||
{
|
||||
// Gestione IVA incorporata
|
||||
if ($this->incorporaIVA()) {
|
||||
return $this->prezzo_unitario_ivato;
|
||||
} else {
|
||||
return $this->prezzo_unitario;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Restituisce il margine percentuale relativo all'elemento.
|
||||
*
|
||||
* @return float
|
||||
*/
|
||||
public function getMarginePercentualeAttribute()
|
||||
{
|
||||
return (1 - ($this->spesa / $this->imponibile)) * 100;
|
||||
}
|
||||
|
||||
/**
|
||||
* Imposta il prezzo unitario ivato (con IVA) per la riga corrente.
|
||||
*
|
||||
* @param $value
|
||||
*/
|
||||
public function setPrezzoUnitarioIvatoAttribute($value)
|
||||
{
|
||||
$this->attributes['prezzo_unitario_ivato'] = $value;
|
||||
$percentuale_iva = floatval($this->aliquota->percentuale) / 100;
|
||||
|
||||
$this->attributes['iva_unitaria'] = $value * $percentuale_iva / (1 + $percentuale_iva); // Calcolo IVA
|
||||
$this->attributes['prezzo_unitario'] = $value - $this->attributes['iva_unitaria'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Imposta il sconto unitario (senza IVA) per la riga corrente.
|
||||
*
|
||||
* @param $value
|
||||
*/
|
||||
public function setScontoUnitarioAttribute($value)
|
||||
{
|
||||
$this->attributes['sconto_unitario'] = $value;
|
||||
$percentuale_iva = floatval($this->aliquota->percentuale) / 100;
|
||||
|
||||
$this->attributes['sconto_iva_unitario'] = $value * $percentuale_iva; // Calcolo IVA
|
||||
$this->attributes['sconto_unitario_ivato'] = $value + $this->attributes['sconto_iva_unitario'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Imposta l'identificatore dell'IVA.
|
||||
*
|
||||
* @param int $value
|
||||
*/
|
||||
public function setIdIvaAttribute($value)
|
||||
{
|
||||
$this->attributes['idiva'] = $value;
|
||||
$this->load('aliquota');
|
||||
}
|
||||
|
||||
public function getSubtotaleAttribute()
|
||||
{
|
||||
return $this->imponibile;
|
||||
}
|
||||
|
||||
/**
|
||||
* Salva la riga, impostando i campi dipendenti dai singoli parametri.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function save(array $options = [])
|
||||
{
|
||||
// Fix dei campi statici
|
||||
$this->fixSubtotale();
|
||||
$this->fixSconto();
|
||||
|
||||
$this->fixIva();
|
||||
|
||||
return parent::save($options);
|
||||
}
|
||||
|
||||
/**
|
||||
* Effettua i conti per il subtotale della riga.
|
||||
*/
|
||||
protected function fixSubtotale()
|
||||
{
|
||||
$this->attributes['subtotale'] = $this->imponibile;
|
||||
}
|
||||
|
||||
/**
|
||||
* Effettua i conti per l'IVA.
|
||||
*/
|
||||
protected function fixIva()
|
||||
{
|
||||
$this->attributes['iva'] = $this->iva;
|
||||
|
||||
$descrizione = $this->aliquota->descrizione;
|
||||
if (!empty($descrizione)) {
|
||||
$this->attributes['desc_iva'] = $descrizione;
|
||||
}
|
||||
|
||||
$this->fixIvaIndetraibile();
|
||||
}
|
||||
|
||||
/**
|
||||
* Effettua i conti per l'IVA indetraibile.
|
||||
*/
|
||||
protected function fixIvaIndetraibile()
|
||||
{
|
||||
$this->attributes['iva_indetraibile'] = $this->iva_indetraibile;
|
||||
}
|
||||
|
||||
/**
|
||||
* Effettua i conti per lo sconto totale.
|
||||
*/
|
||||
protected function fixSconto()
|
||||
{
|
||||
$this->attributes['sconto'] = $this->sconto;
|
||||
$this->attributes['tipo_sconto'] = $this->sconto_percentuale ? 'PRC' : 'UNT';
|
||||
}
|
||||
|
||||
protected static function boot()
|
||||
{
|
||||
parent::boot();
|
||||
|
||||
// Pre-caricamento Aliquota IVA
|
||||
static::addGlobalScope('aliquota', function (Builder $builder) {
|
||||
$builder->with('aliquota');
|
||||
});
|
||||
}
|
||||
}
|
|
@ -20,14 +20,17 @@
|
|||
namespace Common\Components;
|
||||
|
||||
use Common\Document;
|
||||
use Common\SimpleModelTrait;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Modules\Articoli\Articolo as Original;
|
||||
use Modules\Articoli\Movimento;
|
||||
use Plugins\DettagliArticolo\DettaglioFornitore;
|
||||
use UnexpectedValueException;
|
||||
|
||||
abstract class Article extends Row
|
||||
abstract class Article extends Accounting
|
||||
{
|
||||
use SimpleModelTrait;
|
||||
|
||||
public $movimenta_magazzino = true;
|
||||
protected $abilita_movimentazione = true;
|
||||
|
||||
|
@ -38,7 +41,8 @@ abstract class Article extends Row
|
|||
|
||||
public static function build(Document $document, Original $articolo)
|
||||
{
|
||||
$model = parent::build($document, true);
|
||||
$model = new static();
|
||||
$model->setDocument($document);
|
||||
|
||||
$model->articolo()->associate($articolo);
|
||||
|
||||
|
@ -49,6 +53,31 @@ abstract class Article extends Row
|
|||
return $model;
|
||||
}
|
||||
|
||||
public function isDescrizione()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public function isSconto()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public function isRiga()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public function isArticolo()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Metodo dedicato a gestire in automatico la movimentazione del magazzino in relazione all'articolo di riferimento sulla base delle caratteristiche del movimento (magazzino abilitato o meno).
|
||||
*
|
||||
* @param $qta
|
||||
*/
|
||||
public function movimenta($qta)
|
||||
{
|
||||
if (!$this->movimenta_magazzino) {
|
||||
|
@ -58,8 +87,8 @@ abstract class Article extends Row
|
|||
$movimenta = true;
|
||||
|
||||
// Movimenta il magazzino solo se l'articolo non è già stato movimentato da un documento precedente
|
||||
if ($this->hasOriginal()) {
|
||||
$original = $this->getOriginal();
|
||||
if ($this->hasOriginalComponent()) {
|
||||
$original = $this->getOriginalComponent();
|
||||
$movimenta = !$original->movimenta_magazzino;
|
||||
}
|
||||
|
||||
|
@ -70,7 +99,7 @@ abstract class Article extends Row
|
|||
|
||||
public function getDirection()
|
||||
{
|
||||
return $this->parent->direzione;
|
||||
return $this->getDocument()->direzione;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -242,7 +271,7 @@ abstract class Article extends Row
|
|||
|
||||
protected function movimentaMagazzino($qta)
|
||||
{
|
||||
$documento = $this->parent;
|
||||
$documento = $this->getDocument();
|
||||
$data = $documento->getReferenceDate();
|
||||
|
||||
$qta_movimento = $documento->direzione == 'uscita' ? $qta : -$qta;
|
||||
|
@ -265,15 +294,14 @@ abstract class Article extends Row
|
|||
|
||||
protected static function boot()
|
||||
{
|
||||
// Precaricamento Articolo
|
||||
parent::boot();
|
||||
|
||||
// Pre-caricamento Articolo
|
||||
static::addGlobalScope('articolo', function (Builder $builder) {
|
||||
$builder->with('articolo', 'dettaglioFornitore');
|
||||
});
|
||||
|
||||
parent::boot(true);
|
||||
|
||||
$table = parent::getTableName();
|
||||
|
||||
$table = static::getTableName();
|
||||
static::addGlobalScope('articles', function (Builder $builder) use ($table) {
|
||||
$builder->whereNotNull($table.'.idarticolo')->where($table.'.idarticolo', '<>', 0);
|
||||
});
|
||||
|
@ -341,18 +369,4 @@ abstract class Article extends Row
|
|||
{
|
||||
$this->articolo()->associate($original->articolo);
|
||||
}
|
||||
|
||||
protected function customBeforeDataCopiaIn($original)
|
||||
{
|
||||
//$this->movimentazione(false);
|
||||
|
||||
parent::customBeforeDataCopiaIn($original);
|
||||
}
|
||||
|
||||
protected function customAfterDataCopiaIn($original)
|
||||
{
|
||||
// $this->movimentazione(true);
|
||||
|
||||
parent::customAfterDataCopiaIn($original);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,393 @@
|
|||
<?php
|
||||
/*
|
||||
* OpenSTAManager: il software gestionale open source per l'assistenza tecnica e la fatturazione
|
||||
* Copyright (C) DevCode s.n.c.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
namespace Common\Components;
|
||||
|
||||
use Common\Document;
|
||||
use Common\RowReference;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use InvalidArgumentException;
|
||||
|
||||
/**
|
||||
* Classe dedicata alla gestione delle informazioni di base dei componenti dei Documenti, e in particolare di:
|
||||
* - Collegamento con il Documento do origine
|
||||
* - Riferimento di origine
|
||||
* - Riferimenti informativi tra righe di altri documenti
|
||||
* - Importazione tra documenti distinti di un componente.
|
||||
*
|
||||
* @property string original_type
|
||||
* @property string original_id
|
||||
*
|
||||
* @since 2.4.18
|
||||
*/
|
||||
abstract class Component extends Model
|
||||
{
|
||||
/**
|
||||
* Componente di origine da cui il compontente corrente deriva.
|
||||
*
|
||||
* @var Component|null
|
||||
*/
|
||||
protected $original_model = null;
|
||||
|
||||
protected $guarded = [];
|
||||
|
||||
protected $appends = [
|
||||
'max_qta',
|
||||
];
|
||||
|
||||
protected $hidden = [
|
||||
'parent',
|
||||
];
|
||||
|
||||
public function hasOriginalComponent()
|
||||
{
|
||||
return !empty($this->original_type) && !empty($this->getOriginalComponent());
|
||||
}
|
||||
|
||||
public function getOriginalComponent()
|
||||
{
|
||||
if (!isset($this->original_model) && !empty($this->original_type)) {
|
||||
$class = $this->original_type;
|
||||
|
||||
$this->original_model = $class::find($this->original_id);
|
||||
}
|
||||
|
||||
return $this->original_model;
|
||||
}
|
||||
|
||||
public function referenceSources()
|
||||
{
|
||||
$class = get_class($this);
|
||||
|
||||
return $this->hasMany(RowReference::class, 'target_id')
|
||||
->where('target_type', $class);
|
||||
}
|
||||
|
||||
public function referenceTargets()
|
||||
{
|
||||
$class = get_class($this);
|
||||
|
||||
return $this->hasMany(RowReference::class, 'source_id')
|
||||
->where('source_type', $class);
|
||||
}
|
||||
|
||||
/**
|
||||
* Restituisce l'eventuale limite sulla quantità massima derivato dal componente di origine.
|
||||
*
|
||||
* @return mixed|null
|
||||
*/
|
||||
public function getMaxQtaAttribute()
|
||||
{
|
||||
if (!$this->hasOriginalComponent()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$original = $this->getOriginalComponent();
|
||||
|
||||
return $original->qta_rimanente + $this->qta;
|
||||
}
|
||||
|
||||
/**
|
||||
* Modifica la quantità del componente.
|
||||
*
|
||||
* @param float $value
|
||||
*
|
||||
* @return float
|
||||
*/
|
||||
public function setQtaAttribute($value)
|
||||
{
|
||||
$previous = $this->qta;
|
||||
$diff = $value - $previous;
|
||||
|
||||
if ($this->hasOriginalComponent()) {
|
||||
$original = $this->getOriginalComponent();
|
||||
|
||||
if ($original->qta_rimanente < $diff) {
|
||||
$diff = $original->qta_rimanente;
|
||||
$value = $previous + $diff;
|
||||
}
|
||||
}
|
||||
|
||||
$this->attributes['qta'] = $value;
|
||||
|
||||
if ($this->hasOriginalComponent()) {
|
||||
$original = $this->getOriginalComponent();
|
||||
|
||||
$original->qta_evasa += $diff;
|
||||
$original->save();
|
||||
}
|
||||
|
||||
return $diff;
|
||||
}
|
||||
|
||||
/**
|
||||
* Restituisce la quantità rimanente del componente.
|
||||
*
|
||||
* @return float
|
||||
*/
|
||||
public function getQtaRimanenteAttribute()
|
||||
{
|
||||
return $this->qta - $this->qta_evasa;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gestisce la possibilità di eliminare il componente.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function canDelete()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public function delete()
|
||||
{
|
||||
if (!$this->canDelete()) {
|
||||
throw new InvalidArgumentException();
|
||||
}
|
||||
|
||||
if ($this->hasOriginalComponent()) {
|
||||
$original = $this->getOriginalComponent();
|
||||
}
|
||||
|
||||
$this->qta = 0;
|
||||
$result = parent::delete();
|
||||
|
||||
// Trigger per la modifica delle righe
|
||||
$this->getDocument()->triggerComponent($this);
|
||||
|
||||
// Trigger per l'evasione delle quantità
|
||||
if ($this->hasOriginalComponent()) {
|
||||
$original->getDocument()->triggerEvasione($this);
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
public function toArray()
|
||||
{
|
||||
$array = parent::toArray();
|
||||
|
||||
$result = array_merge($array, [
|
||||
'spesa' => $this->spesa,
|
||||
'imponibile' => $this->imponibile,
|
||||
'sconto' => $this->sconto,
|
||||
'totale_imponibile' => $this->totale_imponibile,
|
||||
'iva' => $this->iva,
|
||||
'totale' => $this->totale,
|
||||
]);
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Copia l'oggetto (articolo, riga, descrizione) nel corrispettivo per il documento indicato.
|
||||
*
|
||||
* @param Document $document Documento di destinazione
|
||||
* @param float|null $qta Quantità da riportare
|
||||
*
|
||||
* @return self
|
||||
*/
|
||||
public function copiaIn(Document $document, $qta = null)
|
||||
{
|
||||
// Individuazione classe di destinazione
|
||||
$class = get_class($document);
|
||||
$namespace = implode('\\', explode('\\', $class, -1));
|
||||
|
||||
$current = get_class($this);
|
||||
$pieces = explode('\\', $current);
|
||||
$type = end($pieces);
|
||||
|
||||
$object = $namespace.'\\Components\\'.$type;
|
||||
|
||||
// Attributi dell'oggetto da copiare
|
||||
$attributes = $this->getAttributes();
|
||||
unset($attributes['id']);
|
||||
unset($attributes['order']);
|
||||
|
||||
if ($qta !== null) {
|
||||
$attributes['qta'] = $qta;
|
||||
}
|
||||
|
||||
$attributes['qta_evasa'] = 0;
|
||||
|
||||
// Creazione del nuovo oggetto
|
||||
$model = new $object();
|
||||
|
||||
// Rimozione attributo in conflitto
|
||||
unset($attributes[$model->getDocumentID()]);
|
||||
|
||||
// Riferimento di origine per l'evasione automatica della riga
|
||||
$is_evasione = true;
|
||||
if ($is_evasione) {
|
||||
// Mantenimento dell'origine della riga precedente
|
||||
$model->original_id = $attributes['original_id'];
|
||||
$model->original_type = $attributes['original_type'];
|
||||
|
||||
// Aggiornamento dei riferimenti
|
||||
list($riferimento_precedente, $nuovo_riferimento) = $model->impostaOrigine($current, $this->id);
|
||||
|
||||
// Correzione della descrizione
|
||||
$attributes['descrizione'] = str_replace($riferimento_precedente, '', $attributes['descrizione']);
|
||||
$attributes['descrizione'] .= $nuovo_riferimento;
|
||||
}
|
||||
unset($attributes['original_id']);
|
||||
unset($attributes['original_type']);
|
||||
|
||||
// Impostazione del genitore
|
||||
$model->setDocument($document);
|
||||
|
||||
// Azioni specifiche di inizializzazione
|
||||
$model->customInitCopiaIn($this);
|
||||
|
||||
$model->save();
|
||||
|
||||
// Impostazione degli attributi
|
||||
$model = $object::find($model->id);
|
||||
if (empty($model)) {
|
||||
dd($model, $attributes, $object);
|
||||
}
|
||||
$accepted = $model->getAttributes();
|
||||
|
||||
// Azioni specifiche precedenti
|
||||
$model->customBeforeDataCopiaIn($this);
|
||||
|
||||
$attributes = array_intersect_key($attributes, $accepted);
|
||||
$model->fill($attributes);
|
||||
|
||||
// Azioni specifiche successive
|
||||
$model->customAfterDataCopiaIn($this);
|
||||
|
||||
$model->save();
|
||||
|
||||
return $model;
|
||||
}
|
||||
|
||||
/**
|
||||
* Imposta l'origine del componente, restituendo un array contenente i replace da effettuare per modificare la descrizione in modo coerente.
|
||||
*
|
||||
* @param string $type
|
||||
* @param string $id
|
||||
*/
|
||||
public function impostaOrigine($type, $id)
|
||||
{
|
||||
$riferimento_precedente = null;
|
||||
$nuovo_riferimento = null;
|
||||
|
||||
// Rimozione del riferimento precedente dalla descrizione
|
||||
if ($this->hasOriginalComponent()) {
|
||||
$riferimento = $this->getOriginalComponent()->getDocument()->getReference();
|
||||
$riferimento_precedente = "\nRif. ".strtolower($riferimento);
|
||||
}
|
||||
|
||||
$this->original_id = $id;
|
||||
$this->original_type = $type;
|
||||
|
||||
// Aggiunta del riferimento nella descrizione
|
||||
$origine = $type::find($id);
|
||||
if (!empty($origine)) {
|
||||
$riferimento = $origine->getDocument()->getReference();
|
||||
$nuovo_riferimento = "\nRif. ".strtolower($riferimento);
|
||||
}
|
||||
|
||||
return [$riferimento_precedente, $nuovo_riferimento];
|
||||
}
|
||||
|
||||
/**
|
||||
* Imposta il proprietario dell'oggetto e l'ordine relativo all'interno delle righe.
|
||||
*
|
||||
* @param Document $document Documento di riferimento
|
||||
*/
|
||||
public function setDocument(Document $document)
|
||||
{
|
||||
$this->document()->associate($document);
|
||||
|
||||
// Ordine delle righe
|
||||
if (empty($this->disableOrder)) {
|
||||
$this->order = orderValue($this->table, $this->getDocumentID(), $document->id);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Document
|
||||
*/
|
||||
public function getDocument()
|
||||
{
|
||||
return $this->document;
|
||||
}
|
||||
|
||||
abstract public function document();
|
||||
|
||||
abstract public function getDocumentID();
|
||||
|
||||
public function save(array $options = [])
|
||||
{
|
||||
$result = parent::save($options);
|
||||
|
||||
// Trigger per la modifica delle righe
|
||||
$this->getDocument()->triggerComponent($this);
|
||||
|
||||
// Trigger per l'evasione delle quantità
|
||||
if ($this->hasOriginalComponent()) {
|
||||
$original = $this->getOriginalComponent();
|
||||
|
||||
$original->getDocument()->triggerEvasione($this);
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Azione personalizzata per la copia dell'oggetto (inizializzazione della copia).
|
||||
*
|
||||
* @param $original
|
||||
*/
|
||||
protected function customInitCopiaIn($original)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Azione personalizzata per la copia dell'oggetto (dopo la copia).
|
||||
*
|
||||
* @param $original
|
||||
*/
|
||||
protected function customBeforeDataCopiaIn($original)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Azione personalizzata per la copia dell'oggetto (dopo la copia).
|
||||
*
|
||||
* @param $original
|
||||
*/
|
||||
protected function customAfterDataCopiaIn($original)
|
||||
{
|
||||
}
|
||||
|
||||
protected static function boot()
|
||||
{
|
||||
// Pre-caricamento Documento
|
||||
static::addGlobalScope('document', function (Builder $builder) {
|
||||
$builder->with('document');
|
||||
});
|
||||
|
||||
parent::boot();
|
||||
}
|
||||
}
|
|
@ -20,295 +20,43 @@
|
|||
namespace Common\Components;
|
||||
|
||||
use Common\Document;
|
||||
use Common\Model;
|
||||
use Common\SimpleModelTrait;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
|
||||
abstract class Description extends Model
|
||||
abstract class Description extends Component
|
||||
{
|
||||
use MorphTrait;
|
||||
use SimpleModelTrait;
|
||||
|
||||
protected $guarded = [];
|
||||
|
||||
protected $appends = [
|
||||
'max_qta',
|
||||
];
|
||||
|
||||
protected $hidden = [
|
||||
'parent',
|
||||
];
|
||||
|
||||
public static function build(Document $document, $bypass = false)
|
||||
public static function build(Document $document)
|
||||
{
|
||||
$model = parent::build();
|
||||
$model = new static();
|
||||
|
||||
if (!$bypass) {
|
||||
$model->is_descrizione = 1;
|
||||
$model->qta = 1;
|
||||
}
|
||||
$model->is_descrizione = 1;
|
||||
$model->qta = 1;
|
||||
|
||||
$model->setParent($document);
|
||||
$model->setDocument($document);
|
||||
|
||||
return $model;
|
||||
}
|
||||
|
||||
public function getMaxQtaAttribute()
|
||||
{
|
||||
if (!$this->hasOriginal()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$original = $this->getOriginal();
|
||||
|
||||
return $original->qta_rimanente + $this->qta;
|
||||
}
|
||||
|
||||
/**
|
||||
* Modifica la quantità dell'elemento.
|
||||
*
|
||||
* @param float $value
|
||||
*
|
||||
* @return float
|
||||
*/
|
||||
public function setQtaAttribute($value)
|
||||
{
|
||||
$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;
|
||||
|
||||
if ($this->hasOriginal()) {
|
||||
$original = $this->getOriginal();
|
||||
|
||||
$original->qta_evasa += $diff;
|
||||
$original->save();
|
||||
}
|
||||
|
||||
return $diff;
|
||||
}
|
||||
|
||||
/**
|
||||
* Restituisce la quantità rimanente dell'elemento.
|
||||
*
|
||||
* @return float
|
||||
*/
|
||||
public function getQtaRimanenteAttribute()
|
||||
{
|
||||
return $this->qta - $this->qta_evasa;
|
||||
}
|
||||
|
||||
public function canDelete()
|
||||
public function isDescrizione()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public function delete()
|
||||
{
|
||||
if (!$this->canDelete()) {
|
||||
throw new \InvalidArgumentException();
|
||||
}
|
||||
|
||||
if ($this->hasOriginal()) {
|
||||
$original = $this->getOriginal();
|
||||
}
|
||||
|
||||
$this->qta = 0;
|
||||
$result = parent::delete();
|
||||
|
||||
// Trigger per la modifica delle righe
|
||||
$this->parent->triggerComponent($this);
|
||||
|
||||
// Trigger per l'evasione delle quantità
|
||||
if ($this->hasOriginal()) {
|
||||
$original->parent->triggerEvasione($this);
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
public function toArray()
|
||||
{
|
||||
$array = parent::toArray();
|
||||
|
||||
$result = array_merge($array, [
|
||||
'spesa' => $this->spesa,
|
||||
'imponibile' => $this->imponibile,
|
||||
'sconto' => $this->sconto,
|
||||
'totale_imponibile' => $this->totale_imponibile,
|
||||
'iva' => $this->iva,
|
||||
'totale' => $this->totale,
|
||||
]);
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Imposta il proprietario dell'oggetto e l'ordine relativo all'interno delle righe.
|
||||
*/
|
||||
public function setParent(Document $document)
|
||||
{
|
||||
$this->parent()->associate($document);
|
||||
|
||||
// Ordine delle righe
|
||||
if (empty($this->disableOrder)) {
|
||||
$this->order = orderValue($this->table, $this->getParentID(), $document->id);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Copia l'oggetto (articolo, riga, descrizione) nel corrispettivo per il documento indicato.
|
||||
*
|
||||
* @return self
|
||||
*/
|
||||
public function copiaIn(Document $document, $qta = null)
|
||||
{
|
||||
// Individuazione classe di destinazione
|
||||
$class = get_class($document);
|
||||
$namespace = implode('\\', explode('\\', $class, -1));
|
||||
|
||||
$current = get_class($this);
|
||||
$pieces = explode('\\', $current);
|
||||
$type = end($pieces);
|
||||
|
||||
$object = $namespace.'\\Components\\'.$type;
|
||||
|
||||
// Attributi dell'oggetto da copiare
|
||||
$attributes = $this->getAttributes();
|
||||
unset($attributes['id']);
|
||||
unset($attributes['order']);
|
||||
|
||||
if ($qta !== null) {
|
||||
$attributes['qta'] = $qta;
|
||||
}
|
||||
|
||||
$attributes['qta_evasa'] = 0;
|
||||
|
||||
// Creazione del nuovo oggetto
|
||||
$model = new $object();
|
||||
|
||||
// Rimozione attributo in conflitto
|
||||
unset($attributes[$model->getParentID()]);
|
||||
|
||||
// Riferimento di origine per l'evasione automatica della riga
|
||||
$is_evasione = true;
|
||||
if ($is_evasione) {
|
||||
// Mantenimento dell'origine della riga precedente
|
||||
$model->original_id = $attributes['original_id'];
|
||||
$model->original_type = $attributes['original_type'];
|
||||
|
||||
// Aggiornamento dei riferimenti
|
||||
list($riferimento_precedente, $nuovo_riferimento) = $model->impostaOrigine($current, $this->id);
|
||||
|
||||
// Correzione della descrizione
|
||||
$attributes['descrizione'] = str_replace($riferimento_precedente, '', $attributes['descrizione']);
|
||||
$attributes['descrizione'] .= $nuovo_riferimento;
|
||||
}
|
||||
unset($attributes['original_id']);
|
||||
unset($attributes['original_type']);
|
||||
|
||||
// Impostazione del genitore
|
||||
$model->setParent($document);
|
||||
|
||||
// Azioni specifiche di inizializzazione
|
||||
$model->customInitCopiaIn($this);
|
||||
|
||||
$model->save();
|
||||
|
||||
// Impostazione degli attributi
|
||||
$model = $object::find($model->id);
|
||||
$accepted = $model->getAttributes();
|
||||
|
||||
// Azioni specifiche precedenti
|
||||
$model->customBeforeDataCopiaIn($this);
|
||||
|
||||
$attributes = array_intersect_key($attributes, $accepted);
|
||||
$model->fill($attributes);
|
||||
|
||||
// Azioni specifiche successive
|
||||
$model->customAfterDataCopiaIn($this);
|
||||
|
||||
$model->save();
|
||||
|
||||
return $model;
|
||||
}
|
||||
|
||||
/**
|
||||
* Imposta l'origine dell'elemento, restituendo un array contenente i replace da effettuare per modificare la descrizione in modo coerente.
|
||||
*
|
||||
* @param $type
|
||||
* @param $id
|
||||
*/
|
||||
public function impostaOrigine($type, $id)
|
||||
{
|
||||
$riferimento_precedente = null;
|
||||
$nuovo_riferimento = null;
|
||||
|
||||
// Rimozione del riferimento precedente dalla descrizione
|
||||
if ($this->hasOriginal()) {
|
||||
$riferimento = $this->getOriginal()->parent->getReference();
|
||||
$riferimento_precedente = "\nRif. ".strtolower($riferimento);
|
||||
}
|
||||
|
||||
$this->original_id = $id;
|
||||
$this->original_type = $type;
|
||||
|
||||
// Aggiunta del riferimento nella descrizione
|
||||
$origine = $type::find($id);
|
||||
if (!empty($origine)) {
|
||||
$riferimento = $origine->parent->getReference();
|
||||
$nuovo_riferimento = "\nRif. ".strtolower($riferimento);
|
||||
}
|
||||
|
||||
return [$riferimento_precedente, $nuovo_riferimento];
|
||||
}
|
||||
|
||||
abstract public function parent();
|
||||
|
||||
abstract public function getParentID();
|
||||
|
||||
public function isDescrizione()
|
||||
{
|
||||
return !$this->isArticolo() && !$this->isSconto() && !$this->isRiga() && $this instanceof Description;
|
||||
}
|
||||
|
||||
public function isSconto()
|
||||
{
|
||||
return $this instanceof Discount;
|
||||
return false;
|
||||
}
|
||||
|
||||
public function isRiga()
|
||||
{
|
||||
return !$this->isArticolo() && !$this->isSconto() && $this instanceof Row;
|
||||
return false;
|
||||
}
|
||||
|
||||
public function isArticolo()
|
||||
{
|
||||
return $this instanceof Article;
|
||||
}
|
||||
|
||||
public function save(array $options = [])
|
||||
{
|
||||
$result = parent::save($options);
|
||||
|
||||
// Trigger per la modifica delle righe
|
||||
$this->parent->triggerComponent($this);
|
||||
|
||||
// Trigger per l'evasione delle quantità
|
||||
if ($this->hasOriginal()) {
|
||||
$original = $this->getOriginal();
|
||||
|
||||
$original->parent->triggerEvasione($this);
|
||||
}
|
||||
|
||||
return $result;
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -319,46 +67,16 @@ abstract class Description extends Model
|
|||
protected function customInitCopiaIn($original)
|
||||
{
|
||||
$this->is_descrizione = $original->is_descrizione;
|
||||
$this->is_sconto = $original->is_sconto;
|
||||
}
|
||||
|
||||
/**
|
||||
* Azione personalizzata per la copia dell'oggetto (dopo la copia).
|
||||
*
|
||||
* @param $original
|
||||
*/
|
||||
protected function customBeforeDataCopiaIn($original)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Azione personalizzata per la copia dell'oggetto (dopo la copia).
|
||||
*
|
||||
* @param $original
|
||||
*/
|
||||
protected function customAfterDataCopiaIn($original)
|
||||
{
|
||||
}
|
||||
|
||||
protected static function boot($bypass = false)
|
||||
{
|
||||
// Precaricamento Documento
|
||||
static::addGlobalScope('parent', function (Builder $builder) {
|
||||
$builder->with('parent');
|
||||
});
|
||||
|
||||
// Pre-caricamento Documento
|
||||
parent::boot();
|
||||
|
||||
$table = parent::getTableName();
|
||||
|
||||
if (!$bypass) {
|
||||
static::addGlobalScope('descriptions', function (Builder $builder) use ($table) {
|
||||
$builder->where($table.'.is_descrizione', '=', 1);
|
||||
});
|
||||
} else {
|
||||
static::addGlobalScope('not_descriptions', function (Builder $builder) use ($table) {
|
||||
$builder->where($table.'.is_descrizione', '=', 0);
|
||||
});
|
||||
}
|
||||
$table = static::getTableName();
|
||||
static::addGlobalScope('descriptions', function (Builder $builder) use ($table) {
|
||||
$builder->where($table.'.is_descrizione', '=', 1);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
@ -20,15 +20,19 @@
|
|||
namespace Common\Components;
|
||||
|
||||
use Common\Document;
|
||||
use Common\SimpleModelTrait;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
|
||||
abstract class Discount extends Row
|
||||
abstract class Discount extends Accounting
|
||||
{
|
||||
use SimpleModelTrait;
|
||||
|
||||
protected $guarded = [];
|
||||
|
||||
public static function build(Document $document)
|
||||
{
|
||||
$model = parent::build($document, true);
|
||||
$model = new static();
|
||||
$model->setDocument($document);
|
||||
|
||||
$model->is_sconto = 1;
|
||||
$model->qta = 1;
|
||||
|
@ -36,6 +40,26 @@ abstract class Discount extends Row
|
|||
return $model;
|
||||
}
|
||||
|
||||
public function isDescrizione()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public function isSconto()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public function isRiga()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public function isArticolo()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public function getIvaAttribute()
|
||||
{
|
||||
return $this->attributes['iva'];
|
||||
|
@ -61,12 +85,16 @@ abstract class Discount extends Row
|
|||
$this->fixIvaIndetraibile();
|
||||
}
|
||||
|
||||
protected function customInitCopiaIn($original)
|
||||
{
|
||||
$this->is_sconto = $original->is_sconto;
|
||||
}
|
||||
|
||||
protected static function boot($bypass = false)
|
||||
{
|
||||
parent::boot(true);
|
||||
|
||||
$table = parent::getTableName();
|
||||
parent::boot();
|
||||
|
||||
$table = static::getTableName();
|
||||
static::addGlobalScope('discounts', function (Builder $builder) use ($table) {
|
||||
$builder->where($table.'.is_sconto', '=', 1);
|
||||
});
|
||||
|
|
|
@ -1,59 +0,0 @@
|
|||
<?php
|
||||
/*
|
||||
* OpenSTAManager: il software gestionale open source per l'assistenza tecnica e la fatturazione
|
||||
* Copyright (C) DevCode s.n.c.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
namespace Common\Components;
|
||||
|
||||
use Common\RowReference;
|
||||
|
||||
trait MorphTrait
|
||||
{
|
||||
protected $original_model = null;
|
||||
|
||||
public function hasOriginal()
|
||||
{
|
||||
return !empty($this->original_type) && !empty($this->getOriginal());
|
||||
}
|
||||
|
||||
public function getOriginal()
|
||||
{
|
||||
if (!isset($this->original_model) && !empty($this->original_type)) {
|
||||
$class = $this->original_type;
|
||||
|
||||
$this->original_model = $class::find($this->original_id);
|
||||
}
|
||||
|
||||
return $this->original_model;
|
||||
}
|
||||
|
||||
public function referenceSources()
|
||||
{
|
||||
$class = get_class($this);
|
||||
|
||||
return $this->hasMany(RowReference::class, 'target_id')
|
||||
->where('target_type', $class);
|
||||
}
|
||||
|
||||
public function referenceTargets()
|
||||
{
|
||||
$class = get_class($this);
|
||||
|
||||
return $this->hasMany(RowReference::class, 'source_id')
|
||||
->where('source_type', $class);
|
||||
}
|
||||
}
|
|
@ -20,380 +20,57 @@
|
|||
namespace Common\Components;
|
||||
|
||||
use Common\Document;
|
||||
use Common\SimpleModelTrait;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Modules\Iva\Aliquota;
|
||||
|
||||
abstract class Row extends Description
|
||||
abstract class Row extends Accounting
|
||||
{
|
||||
protected $casts = [
|
||||
'qta' => 'float',
|
||||
'prezzo_unitario' => 'float',
|
||||
'prezzo_unitario_ivato' => 'float',
|
||||
'iva_unitaria' => 'float',
|
||||
'sconto_percentuale' => 'float',
|
||||
'sconto_unitario' => 'float',
|
||||
'sconto_iva_unitario' => 'float',
|
||||
'sconto_unitario_ivato' => 'float',
|
||||
//'qta_evasa' => 'float',
|
||||
];
|
||||
use SimpleModelTrait;
|
||||
|
||||
protected $appends = [
|
||||
'prezzo_unitario_corrente',
|
||||
'sconto_unitario_corrente',
|
||||
'max_qta',
|
||||
];
|
||||
|
||||
public static function build(Document $document, $bypass = false)
|
||||
public static function build(Document $document)
|
||||
{
|
||||
return parent::build($document, true);
|
||||
$model = new static();
|
||||
$model->setDocument($document);
|
||||
|
||||
return $model;
|
||||
}
|
||||
|
||||
// Attributi di contabilità
|
||||
|
||||
/**
|
||||
* Restituisce l'imponibile dell'elemento (prezzo unitario senza IVA * qta).
|
||||
*
|
||||
* @return float
|
||||
*/
|
||||
public function getImponibileAttribute()
|
||||
public function isDescrizione()
|
||||
{
|
||||
return $this->prezzo_unitario * $this->qta;
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Restituisce il totale imponibile dell'elemento (imponibile - sconto unitario senza IVA).
|
||||
*
|
||||
* @return float
|
||||
*/
|
||||
public function getTotaleImponibileAttribute()
|
||||
public function isSconto()
|
||||
{
|
||||
$result = $this->prezzo_unitario >= 0 ? $this->imponibile : -$this->imponibile;
|
||||
|
||||
$result -= $this->sconto;
|
||||
|
||||
return $this->prezzo_unitario >= 0 ? $result : -$result;
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Restituisce il totale (imponibile + iva) dell'elemento.
|
||||
*
|
||||
* @return float
|
||||
*/
|
||||
public function getTotaleAttribute()
|
||||
public function isRiga()
|
||||
{
|
||||
return ($this->prezzo_unitario_ivato - $this->sconto_unitario_ivato) * $this->qta;
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Restituisce l'importo (unitario oppure unitario ivato a seconda dell'impostazione 'Utilizza prezzi di vendita con IVA incorporata') per la riga.
|
||||
*
|
||||
* @return float
|
||||
*/
|
||||
public function getImportoAttribute()
|
||||
public function isArticolo()
|
||||
{
|
||||
return $this->incorporaIVA() ? $this->totale : $this->totale_imponibile;
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Restituisce la spesa (costo_unitario * qta) relativa all'elemento.
|
||||
*
|
||||
* @return float
|
||||
*/
|
||||
public function getSpesaAttribute()
|
||||
protected static function boot()
|
||||
{
|
||||
return $this->costo_unitario * $this->qta;
|
||||
}
|
||||
parent::boot();
|
||||
|
||||
/**
|
||||
* Restituisce il margine totale (imponibile - spesa) relativo all'elemento.
|
||||
*
|
||||
* @return float
|
||||
*/
|
||||
public function getMargineAttribute()
|
||||
{
|
||||
return $this->totale_imponibile - $this->spesa;
|
||||
}
|
||||
|
||||
/**
|
||||
* Restituisce il margine percentuale relativo all'elemento.
|
||||
*
|
||||
* @return float
|
||||
*/
|
||||
public function getMarginePercentualeAttribute()
|
||||
{
|
||||
return (1 - ($this->spesa / $this->imponibile)) * 100;
|
||||
}
|
||||
|
||||
// Attributi della componente
|
||||
|
||||
public function getIvaAttribute()
|
||||
{
|
||||
return ($this->iva_unitaria - $this->sconto_iva_unitario) * $this->qta;
|
||||
}
|
||||
|
||||
public function getIvaIndetraibileAttribute()
|
||||
{
|
||||
return $this->iva / 100 * $this->aliquota->indetraibile;
|
||||
}
|
||||
|
||||
public function getIvaDetraibileAttribute()
|
||||
{
|
||||
return $this->iva - $this->iva_indetraibile;
|
||||
}
|
||||
|
||||
public function getSubtotaleAttribute()
|
||||
{
|
||||
return $this->imponibile;
|
||||
}
|
||||
|
||||
/**
|
||||
* Restituisce lo sconto della riga corrente in euro.
|
||||
*
|
||||
* @return float
|
||||
*/
|
||||
public function getScontoAttribute()
|
||||
{
|
||||
return $this->qta * $this->sconto_unitario;
|
||||
}
|
||||
|
||||
/**
|
||||
* Restituisce il tipo di sconto della riga corrente.
|
||||
*
|
||||
* @return float
|
||||
*/
|
||||
public function getTipoScontoAttribute()
|
||||
{
|
||||
return $this->sconto_percentuale ? 'PRC' : 'UNT';
|
||||
}
|
||||
|
||||
/**
|
||||
* Imposta l'identificatore dell'IVA.
|
||||
*
|
||||
* @param int $value
|
||||
*/
|
||||
public function setIdIvaAttribute($value)
|
||||
{
|
||||
$this->attributes['idiva'] = $value;
|
||||
$this->load('aliquota');
|
||||
}
|
||||
|
||||
/**
|
||||
* Restituisce il prezzo unitario corrente (unitario oppure unitario ivato a seconda dell'impostazione 'Utilizza prezzi di vendita comprensivi di IVA') per la riga.
|
||||
*
|
||||
* @return float
|
||||
*/
|
||||
public function getPrezzoUnitarioCorrenteAttribute()
|
||||
{
|
||||
// Gestione IVA incorporata
|
||||
if ($this->incorporaIVA()) {
|
||||
return $this->prezzo_unitario_ivato;
|
||||
} else {
|
||||
return $this->prezzo_unitario;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Restituisce lo sconto unitario corrente (unitario oppure unitario ivato a seconda dell'impostazione 'Utilizza prezzi di vendita comprensivi di IVA') per la riga.
|
||||
*
|
||||
* @return float
|
||||
*/
|
||||
public function getScontoUnitarioCorrenteAttribute()
|
||||
{
|
||||
// Gestione IVA incorporata
|
||||
if ($this->incorporaIVA()) {
|
||||
return $this->sconto_unitario_ivato;
|
||||
} else {
|
||||
return $this->sconto_unitario;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Imposta il prezzo unitario (senza IVA) per la riga corrente.
|
||||
*
|
||||
* @param $value
|
||||
*/
|
||||
public function setPrezzoUnitarioAttribute($value)
|
||||
{
|
||||
$this->attributes['prezzo_unitario'] = $value;
|
||||
$percentuale_iva = floatval($this->aliquota->percentuale) / 100;
|
||||
|
||||
$this->attributes['iva_unitaria'] = $value * $percentuale_iva; // Calcolo IVA
|
||||
$this->attributes['prezzo_unitario_ivato'] = $value + $this->attributes['iva_unitaria'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Imposta il prezzo unitario ivato (con IVA) per la riga corrente.
|
||||
*
|
||||
* @param $value
|
||||
*/
|
||||
public function setPrezzoUnitarioIvatoAttribute($value)
|
||||
{
|
||||
$this->attributes['prezzo_unitario_ivato'] = $value;
|
||||
$percentuale_iva = floatval($this->aliquota->percentuale) / 100;
|
||||
|
||||
$this->attributes['iva_unitaria'] = $value * $percentuale_iva / (1 + $percentuale_iva); // Calcolo IVA
|
||||
$this->attributes['prezzo_unitario'] = $value - $this->attributes['iva_unitaria'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Imposta il sconto unitario (senza IVA) per la riga corrente.
|
||||
*
|
||||
* @param $value
|
||||
*/
|
||||
public function setScontoUnitarioAttribute($value)
|
||||
{
|
||||
$this->attributes['sconto_unitario'] = $value;
|
||||
$percentuale_iva = floatval($this->aliquota->percentuale) / 100;
|
||||
|
||||
$this->attributes['sconto_iva_unitario'] = $value * $percentuale_iva; // Calcolo IVA
|
||||
$this->attributes['sconto_unitario_ivato'] = $value + $this->attributes['sconto_iva_unitario'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Imposta il sconto unitario ivato (con IVA) per la riga corrente.
|
||||
*
|
||||
* @param $value
|
||||
*/
|
||||
public function setScontoUnitarioIvatoAttribute($value)
|
||||
{
|
||||
$this->attributes['sconto_unitario_ivato'] = $value;
|
||||
$percentuale_iva = floatval($this->aliquota->percentuale) / 100;
|
||||
|
||||
$this->attributes['sconto_iva_unitario'] = $value * $percentuale_iva / (1 + $percentuale_iva); // Calcolo IVA
|
||||
$this->attributes['sconto_unitario'] = $value - $this->attributes['sconto_iva_unitario'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Imposta il prezzo unitario secondo le informazioni indicate per valore e tipologia (UNT o PRC).
|
||||
*
|
||||
* @param $value
|
||||
* @param $type
|
||||
*/
|
||||
public function setPrezzoUnitario($prezzo_unitario, $id_iva)
|
||||
{
|
||||
$this->id_iva = $id_iva;
|
||||
|
||||
// Gestione IVA incorporata
|
||||
if ($this->incorporaIVA()) {
|
||||
$this->prezzo_unitario_ivato = $prezzo_unitario;
|
||||
} else {
|
||||
$this->prezzo_unitario = $prezzo_unitario;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Imposta lo sconto secondo le informazioni indicate per valore e tipologia (UNT o PRC).
|
||||
*
|
||||
* @param $value
|
||||
* @param $type
|
||||
*/
|
||||
public function setSconto($value, $type)
|
||||
{
|
||||
$incorpora_iva = $this->incorporaIVA();
|
||||
|
||||
if ($type == 'PRC') {
|
||||
$this->attributes['sconto_percentuale'] = $value;
|
||||
|
||||
$sconto = calcola_sconto([
|
||||
'sconto' => $value,
|
||||
'prezzo' => $incorpora_iva ? $this->prezzo_unitario_ivato : $this->prezzo_unitario,
|
||||
'tipo' => 'PRC',
|
||||
'qta' => 1,
|
||||
]);
|
||||
} else {
|
||||
$this->attributes['sconto_percentuale'] = 0;
|
||||
$sconto = $value;
|
||||
}
|
||||
|
||||
// Gestione IVA incorporata
|
||||
if ($incorpora_iva) {
|
||||
$this->sconto_unitario_ivato = $sconto;
|
||||
} else {
|
||||
$this->sconto_unitario = $sconto;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Salva la riga, impostando i campi dipendenti dai singoli parametri.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function save(array $options = [])
|
||||
{
|
||||
// Fix dei campi statici
|
||||
$this->fixSubtotale();
|
||||
$this->fixSconto();
|
||||
|
||||
$this->fixIva();
|
||||
|
||||
return parent::save($options);
|
||||
}
|
||||
|
||||
public function aliquota()
|
||||
{
|
||||
return $this->belongsTo(Aliquota::class, 'idiva');
|
||||
}
|
||||
|
||||
protected static function boot($bypass = false)
|
||||
{
|
||||
// Precaricamento Aliquota IVA
|
||||
static::addGlobalScope('aliquota', function (Builder $builder) {
|
||||
$builder->with('aliquota');
|
||||
$table = static::getTableName();
|
||||
static::addGlobalScope('not_articles', function (Builder $builder) use ($table) {
|
||||
$builder->whereNull($table.'.idarticolo')->orWhere($table.'.idarticolo', '=', 0);
|
||||
});
|
||||
|
||||
parent::boot(true);
|
||||
static::addGlobalScope('not_discounts', function (Builder $builder) use ($table) {
|
||||
$builder->where($table.'.is_sconto', '=', 0);
|
||||
});
|
||||
|
||||
$table = parent::getTableName();
|
||||
|
||||
if (!$bypass) {
|
||||
static::addGlobalScope('rows', function (Builder $builder) use ($table) {
|
||||
$builder->whereNull($table.'.idarticolo')->orWhere($table.'.idarticolo', '=', 0);
|
||||
});
|
||||
|
||||
static::addGlobalScope('not_discounts', function (Builder $builder) use ($table) {
|
||||
$builder->where($table.'.is_sconto', '=', 0);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Effettua i conti per il subtotale della riga.
|
||||
*/
|
||||
protected function fixSubtotale()
|
||||
{
|
||||
$this->attributes['subtotale'] = $this->imponibile;
|
||||
}
|
||||
|
||||
/**
|
||||
* Effettua i conti per l'IVA.
|
||||
*/
|
||||
protected function fixIva()
|
||||
{
|
||||
$this->attributes['iva'] = $this->iva;
|
||||
|
||||
$descrizione = $this->aliquota->descrizione;
|
||||
if (!empty($descrizione)) {
|
||||
$this->attributes['desc_iva'] = $descrizione;
|
||||
}
|
||||
|
||||
$this->fixIvaIndetraibile();
|
||||
}
|
||||
|
||||
/**
|
||||
* Effettua i conti per l'IVA indetraibile.
|
||||
*/
|
||||
protected function fixIvaIndetraibile()
|
||||
{
|
||||
$this->attributes['iva_indetraibile'] = $this->iva_indetraibile;
|
||||
}
|
||||
|
||||
/**
|
||||
* Effettua i conti per lo sconto totale.
|
||||
*/
|
||||
protected function fixSconto()
|
||||
{
|
||||
$this->attributes['sconto'] = $this->sconto;
|
||||
$this->attributes['tipo_sconto'] = $this->sconto_percentuale ? 'PRC' : 'UNT';
|
||||
static::addGlobalScope('not_descriptions', function (Builder $builder) use ($table) {
|
||||
$builder->where($table.'.is_descrizione', '=', 0);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -407,9 +84,4 @@ abstract class Row extends Description
|
|||
|
||||
parent::customAfterDataCopiaIn($original);
|
||||
}
|
||||
|
||||
protected function incorporaIVA()
|
||||
{
|
||||
return $this->parent->direzione == 'entrata' && setting('Utilizza prezzi di vendita comprensivi di IVA');
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,7 +19,8 @@
|
|||
|
||||
namespace Common;
|
||||
|
||||
use Common\Components\Description;
|
||||
use Common\Components\Component;
|
||||
use Illuminate\Database\Eloquent\Model as Model;
|
||||
|
||||
abstract class Document extends Model implements ReferenceInterface
|
||||
{
|
||||
|
@ -65,11 +66,11 @@ abstract class Document extends Model implements ReferenceInterface
|
|||
$righe = $this->getRighe();
|
||||
|
||||
$groups = $righe->groupBy(function ($item, $key) {
|
||||
if (!$item->hasOriginal()) {
|
||||
if (!$item->hasOriginalComponent()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$parent = $item->getOriginal()->parent;
|
||||
$parent = $item->getOriginalComponent()->getDocument();
|
||||
|
||||
return serialize($parent);
|
||||
});
|
||||
|
@ -191,7 +192,7 @@ abstract class Document extends Model implements ReferenceInterface
|
|||
* Metodo richiamato a seguito di modifiche sull'evasione generale delle righe del documento.
|
||||
* Utilizzabile per l'impostazione automatica degli stati.
|
||||
*/
|
||||
public function triggerEvasione(Description $trigger)
|
||||
public function triggerEvasione(Component $trigger)
|
||||
{
|
||||
$this->setRelations([]);
|
||||
}
|
||||
|
@ -200,7 +201,7 @@ abstract class Document extends Model implements ReferenceInterface
|
|||
* Metodo richiamato a seguito della modifica o creazione di una riga del documento.
|
||||
* Utilizzabile per limpostazione automatica di campi statici del documento.
|
||||
*/
|
||||
public function triggerComponent(Description $trigger)
|
||||
public function triggerComponent(Component $trigger)
|
||||
{
|
||||
$this->setRelations([]);
|
||||
}
|
||||
|
|
|
@ -21,26 +21,10 @@ namespace Common;
|
|||
|
||||
use Illuminate\Database\Eloquent\Model as Original;
|
||||
|
||||
/**
|
||||
* @deprecated 2.4.18
|
||||
*/
|
||||
abstract class Model extends Original
|
||||
{
|
||||
// Retrocompatibilità MySQL
|
||||
public function setUpdatedAtAttribute($value)
|
||||
{
|
||||
// to Disable updated_at
|
||||
}
|
||||
|
||||
/**
|
||||
* Crea una nuova istanza del modello.
|
||||
*
|
||||
* @return static
|
||||
*/
|
||||
public static function build()
|
||||
{
|
||||
return new static();
|
||||
}
|
||||
|
||||
public static function getTableName()
|
||||
{
|
||||
return with(new static())->getTable();
|
||||
}
|
||||
use SimpleModelTrait;
|
||||
}
|
||||
|
|
|
@ -21,6 +21,8 @@ namespace Common;
|
|||
|
||||
class RowReference extends Model
|
||||
{
|
||||
use SimpleModelTrait;
|
||||
|
||||
protected $table = 'co_riferimenti_righe';
|
||||
|
||||
public function source()
|
||||
|
|
|
@ -0,0 +1,44 @@
|
|||
<?php
|
||||
/*
|
||||
* OpenSTAManager: il software gestionale open source per l'assistenza tecnica e la fatturazione
|
||||
* Copyright (C) DevCode s.n.c.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
namespace Common;
|
||||
|
||||
trait SimpleModelTrait
|
||||
{
|
||||
// Retrocompatibilità MySQL
|
||||
public function setUpdatedAtAttribute($value)
|
||||
{
|
||||
// to Disable updated_at
|
||||
}
|
||||
|
||||
public static function getTableName()
|
||||
{
|
||||
return with(new static())->getTable();
|
||||
}
|
||||
|
||||
/**
|
||||
* Crea una nuova istanza del modello.
|
||||
*
|
||||
* @return static
|
||||
*/
|
||||
public static function build()
|
||||
{
|
||||
return new static();
|
||||
}
|
||||
}
|
|
@ -132,6 +132,7 @@ class ButtonManager implements ManagerInterface
|
|||
'id_record' => $options['id_record'],
|
||||
'class' => $options['class'],
|
||||
'parameters' => $options['parameters'],
|
||||
'html_id' => $options['html_id'].'_p',
|
||||
]);
|
||||
|
||||
unset($list[$predefined]);
|
||||
|
@ -144,7 +145,7 @@ class ButtonManager implements ManagerInterface
|
|||
</button>
|
||||
<ul class="dropdown-menu dropdown-menu-right">';
|
||||
|
||||
foreach ($list as $element) {
|
||||
foreach ($list as $i => $element) {
|
||||
$result .= '
|
||||
<li>'.$this->link([
|
||||
'type' => $options['type'],
|
||||
|
@ -153,6 +154,7 @@ class ButtonManager implements ManagerInterface
|
|||
'id_record' => $options['id_record'],
|
||||
'class' => false,
|
||||
'parameters' => $options['parameters'],
|
||||
'html_id' => $options['html_id'].'_'.$i,
|
||||
]).'</li>';
|
||||
}
|
||||
|
||||
|
|
|
@ -217,9 +217,8 @@ class FileManager implements ManagerInterface
|
|||
|
||||
$source = array_clean(array_column($categories, 'category'));
|
||||
|
||||
$upload_max_filesize = \Util\FileSystem::formatBytes(ini_get('upload_max_filesize'), 0);
|
||||
//remove unit
|
||||
$upload_max_filesize = substr($upload_max_filesize, 0, strrpos($upload_max_filesize, ' '));
|
||||
$upload_max_filesize = ini_get('upload_max_filesize');
|
||||
$upload_max_filesize = substr($upload_max_filesize, 0, -1);
|
||||
|
||||
$result .= '
|
||||
<script>$(document).ready(init)</script>
|
||||
|
|
|
@ -19,10 +19,13 @@
|
|||
|
||||
namespace Models;
|
||||
|
||||
use Common\Model;
|
||||
use Common\SimpleModelTrait;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class ApiResource extends Model
|
||||
{
|
||||
use SimpleModelTrait;
|
||||
|
||||
protected $table = 'zz_api_resources';
|
||||
|
||||
/* Relazioni Eloquent */
|
||||
|
|
|
@ -21,7 +21,8 @@ namespace Models;
|
|||
|
||||
use Carbon\Carbon;
|
||||
use Carbon\CarbonInterval;
|
||||
use Common\Model;
|
||||
use Common\SimpleModelTrait;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Traits\StoreTrait;
|
||||
|
||||
/**
|
||||
|
@ -30,6 +31,7 @@ use Traits\StoreTrait;
|
|||
*/
|
||||
class Cache extends Model
|
||||
{
|
||||
use SimpleModelTrait;
|
||||
use StoreTrait;
|
||||
|
||||
protected $table = 'zz_cache';
|
||||
|
|
|
@ -19,11 +19,14 @@
|
|||
|
||||
namespace Models;
|
||||
|
||||
use Common\Model;
|
||||
use Common\SimpleModelTrait;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Util\Query;
|
||||
|
||||
class Clause extends Model
|
||||
{
|
||||
use SimpleModelTrait;
|
||||
|
||||
protected $table = 'zz_group_module';
|
||||
|
||||
/* Relazioni Eloquent */
|
||||
|
|
|
@ -19,10 +19,13 @@
|
|||
|
||||
namespace Models;
|
||||
|
||||
use Common\Model;
|
||||
use Common\SimpleModelTrait;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class Group extends Model
|
||||
{
|
||||
use SimpleModelTrait;
|
||||
|
||||
protected $table = 'zz_groups';
|
||||
|
||||
/* Relazioni Eloquent */
|
||||
|
|
|
@ -21,13 +21,15 @@ namespace Models;
|
|||
|
||||
use Carbon\Carbon;
|
||||
use Carbon\CarbonInterval;
|
||||
use Common\Model;
|
||||
use Common\SimpleModelTrait;
|
||||
use Hooks\Manager;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Traits\StoreTrait;
|
||||
|
||||
class Hook extends Model
|
||||
{
|
||||
use SimpleModelTrait;
|
||||
use StoreTrait;
|
||||
|
||||
protected $table = 'zz_hooks';
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue