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:
Dasc3er 2020-09-22 20:28:37 +02:00
parent 19e6a8ac23
commit 1796a02b34
118 changed files with 1425 additions and 992 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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';
/**

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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();
}
}

View File

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

View File

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

View File

@ -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"';
}

View File

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

View File

@ -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();
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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();
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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();
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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] = [

View File

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

View File

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

View File

@ -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();
}

View File

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

View File

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

View File

@ -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');
});
}
}

View File

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

View File

@ -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();
}
}

View File

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

View File

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

View File

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

View File

@ -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');
}
}

View File

@ -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([]);
}

View File

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

View File

@ -21,6 +21,8 @@ namespace Common;
class RowReference extends Model
{
use SimpleModelTrait;
protected $table = 'co_riferimenti_righe';
public function source()

View File

@ -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();
}
}

View File

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

View File

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

View File

@ -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 */

View File

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

View File

@ -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 */

View File

@ -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 */

View File

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