2018-08-29 18:06:51 +02:00
< ? php
2020-09-07 15:04:06 +02:00
/*
* OpenSTAManager : il software gestionale open source per l ' assistenza tecnica e la fatturazione
2021-01-20 15:08:51 +01:00
* Copyright ( C ) DevCode s . r . l .
2020-09-07 15:04:06 +02:00
*
* 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 />.
*/
2018-08-29 18:06:51 +02:00
namespace Modules\Articoli ;
2020-09-22 20:28:37 +02:00
use Common\SimpleModelTrait ;
use Illuminate\Database\Eloquent\Model ;
2019-08-26 18:02:05 +02:00
use Illuminate\Database\Eloquent\SoftDeletes ;
2019-07-12 12:40:13 +02:00
use Modules ;
2021-08-31 15:46:14 +02:00
use Modules\AttributiCombinazioni\ValoreAttributo ;
use Modules\CombinazioniArticoli\Combinazione ;
2019-03-08 15:17:04 +01:00
use Modules\Interventi\Components\Articolo as ArticoloIntervento ;
2020-07-06 13:57:45 +02:00
use Modules\Iva\Aliquota ;
2021-07-27 18:11:54 +02:00
use Plugins\ListinoFornitori\DettaglioFornitore ;
2020-04-14 08:49:48 +02:00
use Traits\RecordTrait ;
2019-07-12 12:40:13 +02:00
use Uploads ;
2018-08-29 18:06:51 +02:00
class Articolo extends Model
{
2020-09-22 20:28:37 +02:00
use SimpleModelTrait ;
2019-08-26 11:10:59 +02:00
use SoftDeletes ;
2020-04-14 08:49:48 +02:00
use RecordTrait ;
2019-08-26 11:10:59 +02:00
2020-08-07 10:14:09 +02:00
protected $guarded = [
'qta' ,
];
2018-08-29 18:06:51 +02:00
protected $table = 'mg_articoli' ;
2020-03-19 13:27:02 +01:00
public static function build ( $codice , $nome , Categoria $categoria = null , Categoria $sottocategoria = null )
2019-10-18 16:40:15 +02:00
{
2020-09-22 20:28:37 +02:00
$model = new static ();
2019-10-18 16:40:15 +02:00
$model -> codice = $codice ;
$model -> descrizione = $nome ;
$model -> abilita_serial = false ;
$model -> attivo = true ;
$model -> categoria () -> associate ( $categoria );
$model -> sottocategoria () -> associate ( $sottocategoria );
$model -> save ();
return $model ;
}
2018-08-29 18:06:51 +02:00
/**
2020-08-07 10:43:14 +02:00
* Funzione per registrare un movimento del magazzino in relazione all 'articolo corrente, modificando di conseguenza la quantità dell' articolo stesso .
2019-02-12 17:21:27 +01:00
*
* @ param $qta
2020-08-07 10:43:14 +02:00
* @ param string $descrizone
* @ param string $data
* @ param bool $manuale
* @ param array $array
2019-02-12 17:21:27 +01:00
*
* @ return bool
2018-08-29 18:06:51 +02:00
*/
2018-09-03 10:03:27 +02:00
public function movimenta ( $qta , $descrizone = null , $data = null , $manuale = false , $array = [])
2018-08-29 18:06:51 +02:00
{
2020-11-12 17:11:09 +01:00
$data = ( $data ? : date ( 'Y-m-d H:i:s' ));
2019-12-12 19:08:23 +01:00
$id = $this -> registra ( $qta , $descrizone , $data , $manuale , $array );
2018-08-29 18:06:51 +02:00
2020-12-22 16:01:02 +01:00
if ( empty ( $this -> servizio )) {
2018-08-29 18:06:51 +02:00
$this -> qta += $qta ;
$this -> save ();
}
2019-12-12 19:08:23 +01:00
return $id ;
2018-08-29 18:06:51 +02:00
}
/**
2020-08-07 10:43:14 +02:00
* Funzione per registrare un movimento del magazzino in relazione all 'articolo corrente, senza movimentare la quantità dell' articolo stesso .
2019-02-12 17:21:27 +01:00
*
* @ param $qta
2020-08-07 10:43:14 +02:00
* @ param string $descrizone
* @ param string $data
* @ param bool $manuale
* @ param array $array
2019-02-12 17:21:27 +01:00
*
* @ return bool
2018-08-29 18:06:51 +02:00
*/
public function registra ( $qta , $descrizone = null , $data = null , $manuale = false , $array = [])
{
if ( empty ( $qta )) {
return false ;
}
// Movimento il magazzino solo se l'articolo non è un servizio
2021-02-26 10:32:50 +01:00
if ( empty ( $this -> servizio )) {
2018-08-29 18:06:51 +02:00
// Registrazione della movimentazione
database () -> insert ( 'mg_movimenti' , array_merge ( $array , [
'idarticolo' => $this -> id ,
'qta' => $qta ,
'movimento' => $descrizone ,
'data' => $data ,
'manuale' => $manuale ,
]));
}
2019-12-12 19:08:23 +01:00
$id = database () -> lastInsertedID ();
2018-08-29 18:06:51 +02:00
2019-12-12 19:08:23 +01:00
return $id ;
2018-08-29 18:06:51 +02:00
}
2020-08-07 10:43:14 +02:00
/**
* Imposta il prezzo di vendita sulla base dell 'impstazione per l' utilizzo dei prezzi comprensivi di IVA .
*
* @ param $prezzo_vendita
* @ param $id_iva
*/
2020-07-06 13:57:45 +02:00
public function setPrezzoVendita ( $prezzo_vendita , $id_iva )
{
$this -> idiva_vendita = $id_iva ;
// Calcolo prezzo di vendita ivato e non ivato
$prezzi_ivati = setting ( 'Utilizza prezzi di vendita comprensivi di IVA' );
$percentuale_aliquota = floatval ( Aliquota :: find ( $id_iva ) -> percentuale );
if ( $prezzi_ivati ) {
$this -> prezzo_vendita_ivato = $prezzo_vendita ;
$this -> prezzo_vendita = $prezzo_vendita / ( 1 + $percentuale_aliquota / 100 );
} else {
$this -> prezzo_vendita = $prezzo_vendita ;
$this -> prezzo_vendita_ivato = $prezzo_vendita * ( 1 + $percentuale_aliquota / 100 );
}
}
2021-08-31 15:46:14 +02:00
/**
* Verifica se l ' articolo corrente è una variante per una Combinazione .
*
* @ return bool
*/
public function isVariante ()
{
return ! empty ( $this -> id_combinazione );
}
2019-09-07 15:57:33 +02:00
// Attributi Eloquent
2019-07-12 12:40:13 +02:00
2020-04-14 08:49:48 +02:00
public function getImmagineUploadAttribute ()
{
if ( empty ( $this -> immagine )) {
return null ;
}
return $this -> uploads () -> where ( 'filename' , $this -> immagine ) -> first ();
}
2019-07-12 12:40:13 +02:00
public function getImageAttribute ()
{
if ( empty ( $this -> immagine )) {
return null ;
}
$module = Modules :: get ( $this -> module );
$fileinfo = Uploads :: fileInfo ( $this -> immagine );
2020-07-06 14:16:16 +02:00
$directory = '/' . $module -> upload_directory . '/' ;
$image = $directory . $this -> immagine ;
$image_thumbnail = $directory . $fileinfo [ 'filename' ] . '_thumb600.' . $fileinfo [ 'extension' ];
2019-07-12 12:40:13 +02:00
2020-09-23 17:53:19 +02:00
$url = file_exists ( base_dir () . $image_thumbnail ) ? base_path () . $image_thumbnail : base_path () . $image ;
2019-07-12 12:40:13 +02:00
return $url ;
}
/**
* Restituisce il nome del modulo a cui l ' oggetto è collegato .
*
* @ return string
*/
public function getModuleAttribute ()
{
return 'Articoli' ;
}
2019-09-07 15:57:33 +02:00
2021-08-31 15:46:14 +02:00
public function getNomeVarianteAttribute ()
{
$valori = database () -> fetchArray ( " SELECT CONCAT(`mg_attributi`.`titolo`, ': ', `mg_valori_attributi`.`nome`) AS nome
FROM `mg_articolo_attributo`
INNER JOIN `mg_valori_attributi` ON `mg_valori_attributi` . `id` = `mg_articolo_attributo` . `id_valore`
INNER JOIN `mg_attributi` ON `mg_attributi` . `id` = `mg_valori_attributi` . `id_attributo`
INNER JOIN `mg_articoli` ON `mg_articoli` . `id` = `mg_articolo_attributo` . `id_articolo`
INNER JOIN `mg_combinazioni` ON `mg_combinazioni` . `id` = `mg_articoli` . `id_combinazione`
INNER JOIN `mg_attributo_combinazione` ON `mg_attributo_combinazione` . `id_combinazione` = `mg_combinazioni` . `id` AND `mg_attributo_combinazione` . `id_attributo` = `mg_attributi` . `id`
WHERE `mg_articoli` . `id` = " .prepare( $this->id ).'
ORDER BY `mg_attributo_combinazione` . `order` ' );
return implode ( ', ' , array_column ( $valori , 'nome' ));
}
2019-09-07 15:57:33 +02:00
// Relazioni Eloquent
public function articoli ()
{
return $this -> hasMany ( ArticoloIntervento :: class , 'idarticolo' );
}
2019-09-26 18:12:32 +02:00
2021-08-31 15:46:14 +02:00
public function combinazione ()
{
return $this -> belongsTo ( Combinazione :: class , 'id_combinazione' );
}
public function attributi ()
{
return $this -> belongsToMany ( ValoreAttributo :: class , 'mg_articolo_attributo' , 'id_articolo' , 'id_valore' );
}
2020-03-03 10:33:32 +01:00
/**
* Restituisce i movimenti di magazzino dell ' articolo .
*
* @ return \Illuminate\Database\Eloquent\Relations\HasMany | \Illuminate\Database\Query\Builder
*/
public function movimenti ()
{
return $this -> hasMany ( Movimento :: class , 'idarticolo' );
}
2020-11-13 17:54:58 +01:00
/**
* Restituisce le giacenze per sede dell ' articolo .
*
* @ return array
*/
public function getGiacenze ()
{
return $this -> movimenti ()
-> select (
2021-02-05 13:27:18 +01:00
'idsede' ,
2020-11-13 17:54:58 +01:00
database () -> raw ( 'SUM(qta) AS qta' )
2021-02-05 13:27:18 +01:00
) -> groupBy ([ 'idsede' ])
2020-11-13 17:54:58 +01:00
-> get ()
-> mapToGroups ( function ( $item , $key ) {
2021-02-05 13:27:18 +01:00
return [ $item -> idsede => ( float ) $item -> attributes [ 'qta' ]];
2020-11-13 17:54:58 +01:00
})
-> toArray ();
}
2020-03-03 10:33:32 +01:00
/**
* Restituisce i movimenti di magazzino dell ' articolo raggruppati per documento relativo .
*
* @ return \Illuminate\Database\Eloquent\Relations\HasMany | \Illuminate\Database\Query\Builder
*/
2021-09-17 11:17:33 +02:00
public function movimentiComposti ( $mostra_vuoti = false )
2020-03-03 10:33:32 +01:00
{
2021-09-17 11:17:33 +02:00
$movimenti = $this -> movimenti ()
-> selectRaw ( '*, mg_movimenti.created_at AS data_movimento, SUM(mg_movimenti.qta) as qta_documento, IFNULL(mg_movimenti.reference_type, mg_movimenti.id) as tipo_gruppo' )
-> groupBy ([ 'tipo_gruppo' , 'mg_movimenti.reference_id' ]);
2021-09-17 12:18:21 +02:00
if ( ! empty ( $mostra_vuoti )) {
2021-09-17 11:17:33 +02:00
return $movimenti ;
}
return $movimenti -> havingRaw ( 'mg_movimenti.reference_type IS NULL OR qta_documento != 0' );
2020-03-03 10:33:32 +01:00
}
2019-09-26 18:12:32 +02:00
public function categoria ()
{
return $this -> belongsTo ( Categoria :: class , 'id_categoria' );
}
public function sottocategoria ()
{
return $this -> belongsTo ( Categoria :: class , 'id_sottocategoria' );
}
2020-07-06 13:32:43 +02:00
public function dettaglioFornitori ()
{
2020-08-25 17:38:10 +02:00
return $this -> hasMany ( DettaglioFornitore :: class , 'id_articolo' );
2020-07-06 13:32:43 +02:00
}
public function dettaglioFornitore ( $id_fornitore )
{
return $this -> dettaglioFornitori ()
-> where ( 'id_fornitore' , $id_fornitore )
-> first ();
}
2018-08-29 18:06:51 +02:00
}