diff --git a/config/namespaces.php b/config/namespaces.php index f8b662241..76f0aa5fe 100755 --- a/config/namespaces.php +++ b/config/namespaces.php @@ -39,4 +39,5 @@ return [ 'plugins/pianificazione_interventi' => 'Plugins\PianificazioneInterventi', 'plugins/pianificazione_fatturazione' => 'Plugins\PianificazioneFatturazione', 'plugins/statistiche_articoli' => 'Plugins\StatisticheArticoli', + 'plugins/fornitori_articolo' => 'Plugins\FornitoriArticolo', ]; diff --git a/include/common/articolo.php b/include/common/articolo.php index 04e3adae7..cef4c2479 100755 --- a/include/common/articolo.php +++ b/include/common/articolo.php @@ -6,6 +6,8 @@ $_SESSION['superselect']['dir'] = $options['dir']; $_SESSION['superselect']['idanagrafica'] = $options['idanagrafica']; $_SESSION['superselect']['idarticolo'] = $options['idarticolo']; +$qta_minima = 0; + // Articolo if (empty($result['idarticolo'])) { echo ' @@ -13,16 +15,30 @@ if (empty($result['idarticolo'])) {
'.tr('Articolo').': '.$articolo['codice'].' - '.$articolo['descrizione'].'.
'; } +echo ' + '; + // Selezione impianto per gli Interventi if ($module['name'] == 'Interventi') { echo ' @@ -68,7 +84,7 @@ if ($module['name'] != 'Contratti' && $module['name'] != 'Preventivi') { echo ' '; diff --git a/include/src/Components/Article.php b/include/src/Components/Article.php index f6c0492bc..f119a94ab 100755 --- a/include/src/Components/Article.php +++ b/include/src/Components/Article.php @@ -6,6 +6,7 @@ use Common\Document; use Illuminate\Database\Eloquent\Builder; use Modules\Articoli\Articolo as Original; use Modules\Articoli\Movimento; +use Plugins\FornitoriArticolo\Dettaglio; use UnexpectedValueException; abstract class Article extends Row @@ -55,6 +56,14 @@ abstract class Article extends Row return $this->parent->direzione; } + /** + * Restituisce il codice impostato per l'articolo corrente. + */ + public function getCodiceAttribute() + { + return $this->dettaglioFornitore->codice_fornitore ?: $this->articolo->codice; + } + /** * Imposta i seriali collegati all'articolo. * @@ -161,6 +170,11 @@ abstract class Article extends Row return $this->belongsTo(Original::class, 'idarticolo'); } + public function dettaglioFornitore() + { + return $this->belongsTo(Dettaglio::class, 'id_dettaglio_fornitore')->withTrashed(); + } + public function movimentazione($value = true) { $this->abilita_movimentazione = $value; @@ -232,7 +246,7 @@ abstract class Article extends Row { // Precaricamento Articolo static::addGlobalScope('articolo', function (Builder $builder) { - $builder->with('articolo'); + $builder->with('articolo', 'dettaglioFornitore'); }); parent::boot(true); diff --git a/modules/articoli/ajax/select.php b/modules/articoli/ajax/select.php index f88e10864..755ec105c 100755 --- a/modules/articoli/ajax/select.php +++ b/modules/articoli/ajax/select.php @@ -4,82 +4,63 @@ include_once __DIR__.'/../../../core.php'; switch ($resource) { case 'articoli': - // Se non ci sono sedi settate, carico tutti gli articoli - if (!isset($superselect['idsede_partenza']) && (!isset($superselect['idsede_destinazione']))) { - $query = 'SELECT - mg_articoli.id, - mg_articoli.codice, - mg_articoli.barcode, - mg_articoli.descrizione, - round(mg_articoli.qta,'.setting('Cifre decimali per quantità').') AS qta, - mg_articoli.um, - mg_articoli.idiva_vendita, - mg_articoli.idconto_vendita, - mg_articoli.idconto_acquisto, - mg_articoli.prezzo_vendita, - mg_articoli.prezzo_acquisto, - mg_articoli.servizio, - categoria.`nome` AS categoria, - sottocategoria.`nome` AS sottocategoria, - co_iva.descrizione AS iva_vendita, - CONCAT(conto_vendita_categoria .numero, ".", conto_vendita_sottocategoria.numero, " ", conto_vendita_sottocategoria.descrizione) AS idconto_vendita_title, - CONCAT(conto_acquisto_categoria .numero, ".", conto_acquisto_sottocategoria.numero, " ", conto_acquisto_sottocategoria.descrizione) AS idconto_acquisto_title - FROM mg_articoli - LEFT JOIN co_iva ON mg_articoli.idiva_vendita = co_iva.id - LEFT JOIN `mg_categorie` AS categoria ON `categoria`.`id` = `mg_articoli`.`id_categoria` - LEFT JOIN `mg_categorie` AS sottocategoria ON `sottocategoria`.`id` = `mg_articoli`.`id_sottocategoria` - LEFT JOIN co_pianodeiconti3 AS conto_vendita_sottocategoria ON conto_vendita_sottocategoria.id=mg_articoli.idconto_vendita - LEFT JOIN co_pianodeiconti2 AS conto_vendita_categoria ON conto_vendita_sottocategoria.idpianodeiconti2=conto_vendita_categoria.id - LEFT JOIN co_pianodeiconti3 AS conto_acquisto_sottocategoria ON conto_acquisto_sottocategoria.id=mg_articoli.idconto_acquisto - LEFT JOIN co_pianodeiconti2 AS conto_acquisto_categoria ON conto_acquisto_sottocategoria.idpianodeiconti2=conto_acquisto_categoria.id - |where| - ORDER BY - mg_articoli.id_categoria ASC, - mg_articoli.id_sottocategoria ASC, - mg_articoli.codice ASC, - mg_articoli.descrizione ASC'; - } + $sedi_non_impostate = !isset($superselect['idsede_partenza']) && !isset($superselect['idsede_destinazione']); + + $query = 'SELECT + mg_articoli.id, + mg_articoli.barcode, + IFNULL(mg_fornitore_articolo.codice_fornitore, mg_articoli.codice) AS codice, + IFNULL(mg_fornitore_articolo.descrizione, mg_articoli.descrizione) AS descrizione, + IFNULL(mg_fornitore_articolo.prezzo_acquisto, mg_articoli.prezzo_acquisto) AS prezzo_acquisto, + IFNULL(mg_fornitore_articolo.qta_minima, 0) AS qta_minima, + mg_fornitore_articolo.id AS id_dettaglio_fornitore, + round(mg_articoli.qta,'.setting('Cifre decimali per quantità').') AS qta, + mg_articoli.um, + mg_articoli.servizio, + mg_articoli.idiva_vendita, + mg_articoli.idconto_vendita, + mg_articoli.idconto_acquisto, + mg_articoli.prezzo_vendita, + categoria.`nome` AS categoria, + sottocategoria.`nome` AS sottocategoria, + co_iva.descrizione AS iva_vendita, + CONCAT(conto_vendita_categoria .numero, ".", conto_vendita_sottocategoria.numero, " ", conto_vendita_sottocategoria.descrizione) AS idconto_vendita_title, + CONCAT(conto_acquisto_categoria .numero, ".", conto_acquisto_sottocategoria.numero, " ", conto_acquisto_sottocategoria.descrizione) AS idconto_acquisto_title + FROM mg_articoli + LEFT JOIN co_iva ON mg_articoli.idiva_vendita = co_iva.id + LEFT JOIN `mg_categorie` AS categoria ON `categoria`.`id` = `mg_articoli`.`id_categoria` + LEFT JOIN `mg_categorie` AS sottocategoria ON `sottocategoria`.`id` = `mg_articoli`.`id_sottocategoria` + LEFT JOIN co_pianodeiconti3 AS conto_vendita_sottocategoria ON conto_vendita_sottocategoria.id=mg_articoli.idconto_vendita + LEFT JOIN co_pianodeiconti2 AS conto_vendita_categoria ON conto_vendita_sottocategoria.idpianodeiconti2=conto_vendita_categoria.id + LEFT JOIN co_pianodeiconti3 AS conto_acquisto_sottocategoria ON conto_acquisto_sottocategoria.id=mg_articoli.idconto_acquisto + LEFT JOIN co_pianodeiconti2 AS conto_acquisto_categoria ON conto_acquisto_sottocategoria.idpianodeiconti2=conto_acquisto_categoria.id + + LEFT JOIN mg_fornitore_articolo ON mg_fornitore_articolo.id_articolo = mg_articoli.id AND mg_fornitore_articolo.deleted_at IS NULL AND mg_fornitore_articolo.id_fornitore = '.prepare($superselect['idanagrafica']); // Se c'è una sede settata, carico tutti gli articoli presenti in quella sede - else { - $query = 'SELECT - mg_articoli.id, - mg_articoli.codice, - mg_articoli.barcode, - mg_articoli.descrizione, - round(mg_articoli.qta,'.setting('Cifre decimali per quantità').') AS qta, - mg_articoli.um, - mg_articoli.idiva_vendita, - mg_articoli.idconto_vendita, - mg_articoli.idconto_acquisto, - mg_articoli.prezzo_vendita, - mg_articoli.prezzo_acquisto, - categoria.`nome` AS categoria, - sottocategoria.`nome` AS sottocategoria, - co_iva.descrizione AS iva_vendita, - mg_articoli.servizio, - CONCAT(conto_vendita_categoria .numero, ".", conto_vendita_sottocategoria.numero, " ", conto_vendita_sottocategoria.descrizione) AS idconto_vendita_title, - CONCAT(conto_acquisto_categoria .numero, ".", conto_acquisto_sottocategoria.numero, " ", conto_acquisto_sottocategoria.descrizione) AS idconto_acquisto_title - FROM mg_articoli - LEFT JOIN co_iva ON mg_articoli.idiva_vendita = co_iva.id - LEFT JOIN `mg_categorie` AS categoria ON `categoria`.`id` = `mg_articoli`.`id_categoria` - LEFT JOIN `mg_categorie` AS sottocategoria ON `sottocategoria`.`id` = `mg_articoli`.`id_sottocategoria` - LEFT JOIN co_pianodeiconti3 AS conto_vendita_sottocategoria ON conto_vendita_sottocategoria.id=mg_articoli.idconto_vendita - LEFT JOIN co_pianodeiconti2 AS conto_vendita_categoria ON conto_vendita_sottocategoria.idpianodeiconti2=conto_vendita_categoria.id - LEFT JOIN co_pianodeiconti3 AS conto_acquisto_sottocategoria ON conto_acquisto_sottocategoria.id=mg_articoli.idconto_acquisto - LEFT JOIN co_pianodeiconti2 AS conto_acquisto_categoria ON conto_acquisto_sottocategoria.idpianodeiconti2=conto_acquisto_categoria.id - LEFT JOIN (SELECT idarticolo, idsede_azienda, idsede_controparte FROM mg_movimenti GROUP BY idarticolo) movimenti ON movimenti.idarticolo=mg_articoli.id - LEFT JOIN an_sedi ON an_sedi.id = movimenti.idsede_azienda - |where| - GROUP BY - mg_articoli.id - ORDER BY - mg_articoli.id_categoria ASC, - mg_articoli.id_sottocategoria ASC, - mg_articoli.codice ASC, - mg_articoli.descrizione ASC'; + if (!$sedi_non_impostate) { + $query .= ' + LEFT JOIN (SELECT idarticolo, idsede_azienda, idsede_controparte FROM mg_movimenti GROUP BY idarticolo) movimenti ON movimenti.idarticolo=mg_articoli.id + LEFT JOIN an_sedi ON an_sedi.id = movimenti.idsede_azienda'; } + $query .= ' + |where|'; + + // Se c'è una sede settata, carico tutti gli articoli presenti in quella sede + if (!$sedi_non_impostate) { + $query .= ' + GROUP BY + mg_articoli.id'; + } + + $query .= ' + ORDER BY + mg_articoli.id_categoria ASC, + mg_articoli.id_sottocategoria ASC, + mg_articoli.codice ASC, + mg_articoli.descrizione ASC'; + foreach ($elements as $element) { $filter[] = 'mg_articoli.id='.prepare($element); } @@ -102,6 +83,8 @@ switch ($resource) { 'id' => 'id', 'codice' => 'codice', 'descrizione' => 'descrizione', + 'qta_minima' => 'qta_minima', + 'id_dettaglio_fornitore' => 'id_dettaglio_fornitore', 'servizio' => 'servizio', 'qta' => 'qta', 'um' => 'um', @@ -185,6 +168,8 @@ switch ($resource) { 'text' => $r['codice'].' - '.$r['descrizione'].' '.(!$r['servizio'] ? '('.Translator::numberToLocale($qta).(!empty($r['um']) ? ' '.$r['um'] : '').')' : ''), 'codice' => $r['codice'], 'descrizione' => $r['descrizione'], + 'qta_minima' => $r['qta_minima'], + 'id_dettaglio_fornitore' => $r['id_dettaglio_fornitore'], 'barcode' => $r['barcode'], 'qta' => $r['qta'], 'um' => $r['um'], diff --git a/modules/articoli/edit.php b/modules/articoli/edit.php index 60878889f..908957f2b 100755 --- a/modules/articoli/edit.php +++ b/modules/articoli/edit.php @@ -42,11 +42,13 @@ $_SESSION['superselect']['id_categoria'] = $record['id_categoria']; +'.tr("Ogni fornitore, tra cui si evidenzia quello predefinito per l'articolo, può essere descritto una sola volta con le informazioni aggiuntive").'.
+ +'.tr('Fornitore').' | +'.tr('Codice').' | +'.tr('Descrizione').' | +'.tr('Q.tà minima ordinabile').' | +'.tr('Tempi di consegna').' | +'.tr('Prezzo acquisto').' | ++ |
---|---|---|---|---|---|---|
+ '.Modules::link('Anagrafiche', $anagrafica->id, $anagrafica->ragione_sociale).' + | + ++ '.$fornitore['codice_fornitore'].' + | + ++ '.$fornitore['descrizione'].' + | + ++ '.numberFormat($fornitore['qta_minima']).' '.$fornitore->articolo->um.' + | + ++ '.tr('_NUM_ gg', [ + '_NUM_' => numberFormat($fornitore['giorni_consegna'], 0), + ]).' + | + ++ '.moneyFormat($fornitore['prezzo_acquisto']).' + | + ++ + + + + + + + | +
'.tr('Informazioni relative al fornitore _NAME_', [ + '_NAME_' => $anagrafica->ragione_sociale, +]).'.
+ + + +'; diff --git a/plugins/fornitori_articolo/src/Dettaglio.php b/plugins/fornitori_articolo/src/Dettaglio.php new file mode 100644 index 000000000..94c4a91a6 --- /dev/null +++ b/plugins/fornitori_articolo/src/Dettaglio.php @@ -0,0 +1,49 @@ +anagrafica()->associate($fornitore); + $model->articolo()->associate($articolo); + + $model->save(); + + return $model; + } + + // Relazioni Eloquent + + public function anagrafica() + { + return $this->belongsTo(Anagrafica::class, 'id_fornitore'); + } + + public function articolo() + { + return $this->belongsTo(Articolo::class, 'id_articolo'); + } +} diff --git a/plugins/pianificazione_interventi/actions.php b/plugins/pianificazione_interventi/actions.php index cdee341c0..a1f244e49 100755 --- a/plugins/pianificazione_interventi/actions.php +++ b/plugins/pianificazione_interventi/actions.php @@ -192,6 +192,7 @@ switch ($operazione) { } else { $originale = ArticoloOriginale::find(post('idarticolo')); $articolo = Articolo::build($promemoria, $originale); + $articolo->id_dettaglio_fornitore = post('id_dettaglio_fornitore') ?: null; } $qta = post('qta'); diff --git a/plugins/pianificazione_interventi/row-list.php b/plugins/pianificazione_interventi/row-list.php index 84a27215f..b408d43c3 100755 --- a/plugins/pianificazione_interventi/row-list.php +++ b/plugins/pianificazione_interventi/row-list.php @@ -44,7 +44,7 @@ if (!$righe->isEmpty()) { if ($mancanti > 0) { $extra = 'class="warning"'; } - $descrizione = (!empty($riga->articolo) ? $riga->articolo->codice.' - ' : '').$riga['descrizione']; + $descrizione = (!empty($riga->articolo) ? $riga->codice.' - ' : '').$riga['descrizione']; echo '