feat: miglioria gestione classe articolo per distinta base

This commit is contained in:
valentina 2024-11-14 09:37:53 +01:00
parent 3dedde4675
commit 90ddbe4f10
1 changed files with 171 additions and 0 deletions

View File

@ -29,6 +29,9 @@ use Modules\Interventi\Components\Articolo as ArticoloIntervento;
use Modules\Iva\Aliquota; use Modules\Iva\Aliquota;
use Plugins\ListinoFornitori\DettaglioFornitore; use Plugins\ListinoFornitori\DettaglioFornitore;
use Traits\RecordTrait; use Traits\RecordTrait;
use Modules\Preventivi\Components\Articolo as ArticoloPreventivo;
use Models\Plugin;
class Articolo extends Model class Articolo extends Model
{ {
@ -82,6 +85,45 @@ class Articolo extends Model
$this->save(); $this->save();
} }
if (Plugin::where('name', 'Distinta base')->first()->id) {
$descrizione_ricorsivo = '';
if (!empty($array['reference_type']) && !empty($array['reference_id'])) {
$object = new $array['reference_type']();
$document = $object::find($array['reference_id']);
$dir = $document->direzione;
}
if (!$this->componenti->isEmpty() && setting('Produci articoli della distinta base in fase di vendita') && $manuale == false && $dir == 'entrata' && $descrizone != "tr('Produzione articolo')" && $descrizone != "tr('Scomposizione articolo')") {
if ($qta < 0) {
$descrizione_ricorsivo = tr('Produzione articolo');
} else {
$descrizione_ricorsivo = tr('Scomposizione articolo');
}
$this->movimenta(-$qta, $descrizione_ricorsivo, $data, false);
$this->movimentaRicorsivo($qta, $descrizione_ricorsivo);
}
if (!$this->componenti->isEmpty() && setting('Scomponi articolo padre in fase di acquisto') && $manuale == false && $dir == 'uscita' && $descrizone != "tr('Produzione articolo')" && $descrizone != "tr('Scomposizione articolo')") {
if ($qta < 0) {
$descrizione_ricorsivo = tr('Produzione articolo');
} else {
$descrizione_ricorsivo = tr('Scomposizione articolo');
}
$this->movimenta(-$qta, $descrizione_ricorsivo, $data, false);
$this->movimentaRicorsivo($qta, $descrizione_ricorsivo);
}
if (!$this->componenti->isEmpty() && setting('Movimenta gli articoli figlio tramite i movimenti manuali') && $manuale) {
if ($qta < 0) {
$descrizione_ricorsivo = tr('Produzione articolo');
} else {
$descrizione_ricorsivo = tr('Scomposizione articolo');
}
$this->movimenta(-$qta, $descrizione_ricorsivo, $data, false);
$this->movimentaRicorsivo($qta, $descrizione_ricorsivo);
}
}
return $id; return $id;
} }
@ -351,4 +393,133 @@ class Articolo extends Model
{ {
return self::$translated_fields; return self::$translated_fields;
} }
/**
* @version distinta_base
*/
public function componenti()
{
return $this->belongsToMany(Articolo::class, 'mg_articoli_distinte', 'id_articolo', 'id_figlio')->withPivot('qta');
}
public function parti()
{
return $this->belongsToMany(Articolo::class, 'mg_articoli_distinte', 'id_figlio', 'id_articolo')->withPivot('qta');
}
/**
* @version distinta_base
*/
public function triggerChange(Articolo $trigger)
{
if ($this->sincronizza_prezzo_vendita) {
$this->prezzo_vendita = $this->totale_vendita;
}
if ($this->sincronizza_prezzo_acquisto) {
$this->prezzo_acquisto = $this->totale_acquisto;
}
$this->save();
}
/**
* @version distinta_base
*/
public function save(array $attributes = [])
{
if (Plugin::where('name', 'Distinta base')->first()->id) {
// Supporto al plugin Fornitori (prodotto per il coefficiente relativo)
if (!$this->componenti->isEmpty()) {
if ($this->sincronizza_prezzo_vendita) {
$this->prezzo_vendita = $this->totale_vendita;
}
if ($this->sincronizza_prezzo_acquisto) {
$this->prezzo_acquisto = $this->totale_acquisto;
}
}
$result = parent::save($attributes);
$parti = $this->parti;
foreach ($parti as $parte) {
$parte->pivot->qta = 1; // Fix per le quantità inverse
$parte->triggerChange($this);
}
return $result;
} else {
return parent::save($attributes);
}
}
/**
* Funzione per inserire i movimenti di magazzino.
*
* @version distinta_base
*
* @param null $descrizone
* @param null $data
* @param bool $manuale
* @param array $array
*
* @return bool
*/
public function movimentaRicorsivo($qta, $descrizone = null, $data = null, $manuale = false, $array = [])
{
$componenti = $this->componenti;
$suffix = ' (di.ba.)';
$descrizone = str_contains((string) $descrizone, $suffix) ? $descrizone : $descrizone.$suffix;
foreach ($componenti as $componente) {
$qta_componente = $qta * $componente->pivot->qta;
$componente->movimenta($qta_componente, $descrizone, $data, $manuale, $array);
}
}
public function getTotaleAcquistoAttribute()
{
$componenti = $this->componenti;
$prezzo_acquisto = 0;
foreach ($componenti as $componente) {
$prezzo_acquisto += $componente->prezzo_acquisto * $componente->pivot->qta;
}
return $prezzo_acquisto;
}
public function getTotaleVenditaAttribute()
{
$componenti = $this->componenti;
$prezzo_vendita = 0;
foreach ($componenti as $componente) {
$prezzo_vendita += $componente->prezzo_vendita * $componente->pivot->qta;
}
return $prezzo_vendita;
}
/**
* @version distinta_base
*/
public function componenti_preventivo($idrigapreventivo = null)
{
return database()->select('mg_articoli_distinte_preventivi', ['id_figlio', 'qta', 'prezzo_acquisto', 'prezzo_vendita', 'sconto', 'tipo_sconto'], [
'idrigapreventivo' => $idrigapreventivo,
'id_articolo' => $this->id,
]);
}
public function triggerChangePreventivo($idrigapreventivo)
{
$riga = ArticoloPreventivo::find($idrigapreventivo);
$riga->costo_unitario = $riga->totale_acquisto ?: 0;
$riga->setPrezzoUnitario($riga->totale_vendita, $riga->idiva);
$riga->save();
}
} }