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'])) {
{[ "type": "select", "label": "'.tr('Articolo').'", "name": "idarticolo", "required": 1, "value": "'.$result['idarticolo'].'", "ajax-source": "articoli", "icon-after": "add|'.Modules::get('Articoli')['id'].'" ]}
- '; + + + '; } else { $database = database(); - $articolo = $database->fetchArray('SELECT id, codice, descrizione FROM mg_articoli WHERE id = '.prepare($result['idarticolo']))[0]; + $articolo = $database->fetchOne('SELECT mg_articoli.id, + mg_fornitore_articolo.id AS id_dettaglio_fornitore, + 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.qta_minima, 0) AS qta_minima + FROM mg_articoli + LEFT JOIN mg_fornitore_articolo ON mg_fornitore_articolo.id_articolo = mg_articoli.id AND mg_fornitore_articolo.id = '.prepare($result['id_dettaglio_fornitore']).' + WHERE mg_articoli.id = '.prepare($result['idarticolo'])); + + $qta_minima = $articolo['qta_minima']; echo '

'.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']; +
{[ "type": "textarea", "label": "", "name": "descrizione", "required": 1, "value": "$descrizione$" ]}
+
{[ "type": "checkbox", "label": "", "name": "abilita_serial", "value": "$abilita_serial$", "help": "", "placeholder": "", "extra": " 0) ? 'readonly' : ''; ?>" ]} @@ -129,7 +131,7 @@ $_SESSION['superselect']['id_categoria'] = $record['id_categoria'];
- {[ "type": "number", "label": "", "name": "prezzo_acquisto", "value": "$prezzo_acquisto$", "icon-after": "" ]} + {[ "type": "number", "label": "", "name": "prezzo_acquisto", "value": "$prezzo_acquisto$", "icon-after": "", "help": "." ]}
@@ -139,7 +141,7 @@ $_SESSION['superselect']['id_categoria'] = $record['id_categoria'];
- {[ "type": "select", "label": "", "name": "id_fornitore", "value": "$id_fornitore$", "ajax-source": "fornitori", "icon-after": "add||tipoanagrafica=Fornitore&readonly_tipo=1" ]} + {[ "type": "select", "label": "", "name": "id_fornitore", "value": "$id_fornitore$", "ajax-source": "fornitori", "icon-after": "add||tipoanagrafica=Fornitore&readonly_tipo=1", "help": "." ]}
diff --git a/modules/articoli/src/Articolo.php b/modules/articoli/src/Articolo.php index 84cc83f7a..8a56f7c7f 100755 --- a/modules/articoli/src/Articolo.php +++ b/modules/articoli/src/Articolo.php @@ -6,6 +6,7 @@ use Common\Model; use Illuminate\Database\Eloquent\SoftDeletes; use Modules; use Modules\Interventi\Components\Articolo as ArticoloIntervento; +use Plugins\FornitoriArticolo\Dettaglio; use Traits\RecordTrait; use Uploads; @@ -170,4 +171,16 @@ class Articolo extends Model { return $this->belongsTo(Categoria::class, 'id_sottocategoria'); } + + public function dettaglioFornitori() + { + return $this->hasMany(Dettaglio::class, 'id_articolo'); + } + + public function dettaglioFornitore($id_fornitore) + { + return $this->dettaglioFornitori() + ->where('id_fornitore', $id_fornitore) + ->first(); + } } diff --git a/modules/contratti/actions.php b/modules/contratti/actions.php index a116e013b..06d5d5fe4 100644 --- a/modules/contratti/actions.php +++ b/modules/contratti/actions.php @@ -114,6 +114,7 @@ switch (post('op')) { } else { $originale = ArticoloOriginale::find(post('idarticolo')); $articolo = Articolo::build($contratto, $originale); + $articolo->id_dettaglio_fornitore = post('id_dettaglio_fornitore') ?: null; } $qta = post('qta'); diff --git a/modules/contratti/row-list.php b/modules/contratti/row-list.php index 538685a64..36c04814d 100755 --- a/modules/contratti/row-list.php +++ b/modules/contratti/row-list.php @@ -31,7 +31,7 @@ foreach ($righe as $riga) { // Descrizione $descrizione = nl2br($riga->descrizione); if ($riga->isArticolo()) { - $descrizione = Modules::link('Articoli', $riga->idarticolo, $riga->articolo->codice.' - '.$descrizione); + $descrizione = Modules::link('Articoli', $riga->idarticolo, $riga->codice.' - '.$descrizione); } echo ' diff --git a/modules/ddt/actions.php b/modules/ddt/actions.php index 3401fef1c..69d09c11f 100755 --- a/modules/ddt/actions.php +++ b/modules/ddt/actions.php @@ -137,6 +137,7 @@ switch (post('op')) { } else { $originale = ArticoloOriginale::find(post('idarticolo')); $articolo = Articolo::build($ddt, $originale); + $articolo->id_dettaglio_fornitore = post('id_dettaglio_fornitore') ?: null; } $articolo->descrizione = post('descrizione'); diff --git a/modules/ddt/row-list.php b/modules/ddt/row-list.php index 2e8ad6d0a..cbc3d57de 100755 --- a/modules/ddt/row-list.php +++ b/modules/ddt/row-list.php @@ -45,7 +45,8 @@ foreach ($righe as $riga) { '; if ($riga->isArticolo()) { - echo Modules::link('Articoli', $riga->idarticolo, $riga->articolo->codice.' - '.$riga->descrizione); + echo ' + '.Modules::link('Articoli', $riga->idarticolo, $riga->codice.' - '.$riga->descrizione); } else { echo nl2br($riga->descrizione); } diff --git a/modules/fatture/actions.php b/modules/fatture/actions.php index a067b5d98..f4681f54b 100755 --- a/modules/fatture/actions.php +++ b/modules/fatture/actions.php @@ -395,6 +395,7 @@ switch (post('op')) { } else { $originale = ArticoloOriginale::find(post('idarticolo')); $articolo = Articolo::build($fattura, $originale); + $articolo->id_dettaglio_fornitore = post('id_dettaglio_fornitore') ?: null; } $qta = post('qta'); diff --git a/modules/fatture/row-list.php b/modules/fatture/row-list.php index d2ae03f32..350afa46f 100755 --- a/modules/fatture/row-list.php +++ b/modules/fatture/row-list.php @@ -80,7 +80,7 @@ foreach ($righe as $riga) { if ($riga->isArticolo()) { echo ' - '.Modules::link('Articoli', $riga->idarticolo, $riga->articolo->codice.' - '.$riga->descrizione); + '.Modules::link('Articoli', $riga->idarticolo, $riga->codice.' - '.$riga->descrizione); } else { echo nl2br($riga->descrizione); } diff --git a/modules/interventi/actions.php b/modules/interventi/actions.php index b706e5baa..521bb7f90 100755 --- a/modules/interventi/actions.php +++ b/modules/interventi/actions.php @@ -211,6 +211,7 @@ $riga = $intervento->getRiga($type, $id_riga); } else { $originale = ArticoloOriginale::find(post('idarticolo')); $articolo = Articolo::build($intervento, $originale); + $articolo->id_dettaglio_fornitore = post('id_dettaglio_fornitore') ?: null; } $qta = post('qta'); diff --git a/modules/interventi/row-list.php b/modules/interventi/row-list.php index 48584bfb6..bb939a1ec 100755 --- a/modules/interventi/row-list.php +++ b/modules/interventi/row-list.php @@ -43,7 +43,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 ' diff --git a/modules/ordini/actions.php b/modules/ordini/actions.php index 3eb9f07ba..13b399962 100755 --- a/modules/ordini/actions.php +++ b/modules/ordini/actions.php @@ -118,6 +118,7 @@ switch (post('op')) { } else { $originale = ArticoloOriginale::find(post('idarticolo')); $articolo = Articolo::build($ordine, $originale); + $articolo->id_dettaglio_fornitore = post('id_dettaglio_fornitore') ?: null; } $articolo->descrizione = post('descrizione'); @@ -357,11 +358,20 @@ switch (post('op')) { $copia = $riga->replicate(); $copia->setParent($ordine); - $riga->original_id = null; - $riga->original_type = null; - $riga->qta_evasa = 0; + // Ripristino dei valori di default per campi potenzialmente impostati + $copia->original_id = null; + $copia->original_type = null; + $copia->qta = $qta; + $copia->qta_evasa = 0; + $copia->costo_unitario = 0; + $copia->setSconto(0, 'EUR'); - $riga->qta = $qta; + // Impostazione al prezzo di acquisto per Articoli + if ($copia->isArticolo()) { + $articolo = $copia->articolo; + $fornitore = $articolo->dettaglioFornitore($anagrafica->id); // Informazioni del fornitore + $copia->setPrezzoUnitario($fornitore ? $fornitore->prezzo_acquisto : $articolo->prezzo_acquisto, $copia->aliquota->id); + } $copia->save(); } diff --git a/modules/ordini/row-list.php b/modules/ordini/row-list.php index ede45f0e0..9a3eb7064 100755 --- a/modules/ordini/row-list.php +++ b/modules/ordini/row-list.php @@ -50,7 +50,7 @@ foreach ($righe as $riga) { if ($riga->isArticolo()) { echo ' - '.Modules::link('Articoli', $riga->idarticolo, $riga->articolo->codice.' - '.$riga->descrizione); + '.Modules::link('Articoli', $riga->idarticolo, $riga->codice.' - '.$riga->descrizione); } else { echo nl2br($riga->descrizione); } diff --git a/modules/preventivi/actions.php b/modules/preventivi/actions.php index dc3c42977..5c5270460 100755 --- a/modules/preventivi/actions.php +++ b/modules/preventivi/actions.php @@ -147,6 +147,7 @@ switch (post('op')) { } else { $originale = ArticoloOriginale::find(post('idarticolo')); $articolo = Articolo::build($preventivo, $originale); + $articolo->id_dettaglio_fornitore = post('id_dettaglio_fornitore') ?: null; } $qta = post('qta'); diff --git a/modules/preventivi/row-list.php b/modules/preventivi/row-list.php index 8b624395a..6702863e2 100755 --- a/modules/preventivi/row-list.php +++ b/modules/preventivi/row-list.php @@ -31,7 +31,7 @@ foreach ($righe as $riga) { // Descrizione $descrizione = nl2br($riga->descrizione); if ($riga->isArticolo()) { - $descrizione = Modules::link('Articoli', $riga->idarticolo, $riga->articolo->codice.' - '.$descrizione); + $descrizione = Modules::link('Articoli', $riga->idarticolo, $riga->codice.' - '.$descrizione); } echo ' diff --git a/plugins/exportFE/src/FatturaElettronica.php b/plugins/exportFE/src/FatturaElettronica.php index bfb28f5a4..7d8d7e4bd 100755 --- a/plugins/exportFE/src/FatturaElettronica.php +++ b/plugins/exportFE/src/FatturaElettronica.php @@ -1155,7 +1155,7 @@ class FatturaElettronica $codice_articolo = [ 'CodiceTipo' => 'COD', - 'CodiceValore' => $riga->articolo->codice, + 'CodiceValore' => $riga->codice, ]; $dettaglio['CodiceArticolo'] = $codice_articolo; diff --git a/plugins/fornitori_articolo/actions.php b/plugins/fornitori_articolo/actions.php new file mode 100644 index 000000000..8ab639200 --- /dev/null +++ b/plugins/fornitori_articolo/actions.php @@ -0,0 +1,47 @@ +where('id_fornitore', $id_anagrafica) + ->first(); + + if (empty($precedente)) { + $anagrafica = Anagrafica::find($id_anagrafica); + + $fornitore = Dettaglio::build($anagrafica, $articolo); + } else { + $fornitore = $precedente->replicate(); + $precedente->delete(); + } + + $fornitore->codice_fornitore = post('codice_fornitore'); + $fornitore->descrizione = post('descrizione'); + $fornitore->prezzo_acquisto = post('prezzo_acquisto'); + $fornitore->qta_minima = post('qta_minima'); + $fornitore->giorni_consegna = post('giorni_consegna'); + + $fornitore->save(); + + flash()->info(tr('Informazioni salvate correttamente!')); + break; + + case 'delete_fornitore': + $id_riga = post('id_riga'); + + $fornitore = Dettaglio::find($id_riga); + $fornitore->delete(); + + flash()->info(tr('Relazione articolo-fornitore rimossa correttamente!')); + break; +} diff --git a/plugins/fornitori_articolo/edit.php b/plugins/fornitori_articolo/edit.php new file mode 100644 index 000000000..4732bc271 --- /dev/null +++ b/plugins/fornitori_articolo/edit.php @@ -0,0 +1,118 @@ +'.tr("In questa sezione è possibile definire le caratteristiche di base dell'articolo in relazione fornitore di origine, come codice e prezzo di acquisto predefinito").'. '.tr("Queste informazioni saranno utilizzate in automatico per la compilazione dell'articolo al momento dell'inserimento in un documento di acquisto relativo al fornitore indicato, sovrascrivendo le impostazioni predefinite della sezione Acquisto per l'articolo").'.

+

'.tr("Ogni fornitore, tra cui si evidenzia quello predefinito per l'articolo, può essere descritto una sola volta con le informazioni aggiuntive").'.

+ +
+
+

'.tr('Nuovo fornitore').'

+
+ +
+
+
+ {[ "type": "select", "label": "'.tr('Fornitore').'", "name": "id_fornitore_informazioni", "required": 1, "ajax-source": "fornitori", "value": "" ]} +
+ +
+ +
+
+
+
'; + +$fornitori = Dettaglio::where('id_articolo', $id_record)->get(); +if (!$fornitori->isEmpty()) { + echo ' +

'.tr('Elenco fornitori').'

+ + + + + + + + + + + + + + '; + + foreach ($fornitori as $fornitore) { + $anagrafica = $fornitore->anagrafica; + + echo ' + id == $articolo->id_fornitore) ? 'class="success"' : '' ).'> + + + + + + + + + + + + + + '; + } + + echo ' + +
'.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']).' + + + + + + + + +
'; +} else { + echo ' +
+ '.tr('Nessuna informazione disponibile').'... +
'; +} + +echo ' + +'; diff --git a/plugins/fornitori_articolo/edit_fornitore.php b/plugins/fornitori_articolo/edit_fornitore.php new file mode 100644 index 000000000..d7c10770d --- /dev/null +++ b/plugins/fornitori_articolo/edit_fornitore.php @@ -0,0 +1,74 @@ +dettaglioFornitore($id_anagrafica); +} + +echo ' +

'.tr('Informazioni relative al fornitore _NAME_', [ + '_NAME_' => $anagrafica->ragione_sociale, +]).'.

+ +
+ + + + + + + + +
+
+ {[ "type": "text", "label": "'.tr('Codice fornitore').'", "name": "codice_fornitore", "required": 1, "value": "'.$fornitore['codice_fornitore'].'" ]} +
+
+ +
+
+ {[ "type": "textarea", "label": "'.tr('Descrizione').'", "name": "descrizione", "required": 1, "value": "'.$fornitore['descrizione'].'" ]} +
+
+ +
+
+ {[ "type": "number", "label": "'.tr('Prezzo acquisto').'", "name": "prezzo_acquisto", "required": 1, "value": "'.$fornitore['prezzo_acquisto'].'", "icon-after": "€" ]} +
+ +
+ {[ "type": "number", "label": "'.tr('Qta minima ordinabile').'", "name": "qta_minima", "required": 0, "value": "'.$fornitore['qta_minima'].'", "icon-after": "'.$articolo->um.'" ]} +
+ +
+ {[ "type": "text", "label": "'.tr('Tempi di consegna').'", "name": "giorni_consegna", "class": "text-right", "required": 0, "value": "'.$fornitore['giorni_consegna'].'", "icon-after": "'.tr('gg').'" ]} +
+
+ +
+ +
+
+ +
+
+
+ +'; 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 ' diff --git a/templates/contratti/body.php b/templates/contratti/body.php index 430634263..e4b6de70b 100755 --- a/templates/contratti/body.php +++ b/templates/contratti/body.php @@ -106,7 +106,7 @@ foreach ($righe as $riga) { if ($riga->isArticolo()) { // Codice articolo $text = tr('COD. _COD_', [ - '_COD_' => $riga->articolo->codice, + '_COD_' => $riga->codice, ]); echo '
'.$text.''; diff --git a/templates/ddt/body.php b/templates/ddt/body.php index 1216443f2..9ad39f769 100755 --- a/templates/ddt/body.php +++ b/templates/ddt/body.php @@ -53,7 +53,7 @@ foreach ($righe as $riga) { if ($riga->isArticolo()) { // Codice articolo $text = tr('COD. _COD_', [ - '_COD_' => $riga->articolo->codice, + '_COD_' => $riga->codice, ]); echo '
'.$text.''; diff --git a/templates/fatture/body.php b/templates/fatture/body.php index 3edb0c5b8..0d520d6a1 100755 --- a/templates/fatture/body.php +++ b/templates/fatture/body.php @@ -53,7 +53,7 @@ foreach ($righe as $riga) { if ($riga->isArticolo()) { // Codice articolo $text = tr('COD. _COD_', [ - '_COD_' => $riga->articolo->codice, + '_COD_' => $riga->codice, ]); echo '
'.$text.''; diff --git a/templates/interventi/body.php b/templates/interventi/body.php index ca6584fbf..4c1cd6db0 100755 --- a/templates/interventi/body.php +++ b/templates/interventi/body.php @@ -162,7 +162,7 @@ if (!$righe->isEmpty()) { if ($riga->isArticolo()) { // Codice articolo $text = tr('COD. _COD_', [ - '_COD_' => $riga->articolo->codice, + '_COD_' => $riga->codice, ]); echo '
'.$text.''; diff --git a/templates/ordini/body.php b/templates/ordini/body.php index 47e831a30..b7aaff70e 100755 --- a/templates/ordini/body.php +++ b/templates/ordini/body.php @@ -79,7 +79,7 @@ foreach ($righe as $riga) { if ($riga->isArticolo()) { // Codice articolo $text = tr('COD. _COD_', [ - '_COD_' => $riga->articolo->codice, + '_COD_' => $riga->codice, ]); echo '
'.$text.''; diff --git a/templates/preventivi/body.php b/templates/preventivi/body.php index 42b5b7f3c..9a49a6c50 100755 --- a/templates/preventivi/body.php +++ b/templates/preventivi/body.php @@ -153,7 +153,7 @@ foreach ($righe as $riga) { if ($riga->isArticolo()) { // Codice articolo $text = tr('COD. _COD_', [ - '_COD_' => $riga->articolo->codice, + '_COD_' => $riga->codice, ]); echo '
'.$text.''; diff --git a/update/2_4_16.sql b/update/2_4_16.sql index f6962d187..b95e329d5 100644 --- a/update/2_4_16.sql +++ b/update/2_4_16.sql @@ -63,3 +63,37 @@ CREATE TABLE IF NOT EXISTS `co_riferimenti_righe` ( `target_id` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB; + +-- Aggiunta relazione tra articoli e fornitori +CREATE TABLE IF NOT EXISTS `mg_fornitore_articolo` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_articolo` int(11) NOT NULL, + `id_fornitore` int(11) NOT NULL, + `codice_fornitore` varchar(255) NOT NULL, + `descrizione` varchar(255) NOT NULL, + `prezzo_acquisto` decimal(15, 6) NOT NULL, + `qta_minima` decimal(15, 6) NOT NULL, + `giorni_consegna` int(11) NOT NULL, + `deleted_at` TIMESTAMP NULL DEFAULT NULL, + PRIMARY KEY (`id`), + FOREIGN KEY (`id_articolo`) REFERENCES `mg_articoli`(`id`) ON DELETE CASCADE, + FOREIGN KEY (`id_fornitore`) REFERENCES `an_anagrafiche`(`idanagrafica`) ON DELETE CASCADE +); + +INSERT INTO `zz_plugins` (`id`, `name`, `title`, `idmodule_from`, `idmodule_to`, `position`, `directory`, `options`) VALUES +(NULL, 'Fornitori Articolo', 'Fornitori', (SELECT `id` FROM `zz_modules` WHERE `name`='Articoli'), (SELECT `id` FROM `zz_modules` WHERE `name`='Articoli'), 'tab', 'fornitori_articolo', 'custom'); + +ALTER TABLE `or_righe_ordini` ADD `id_dettaglio_fornitore` int(11) NULL, + ADD FOREIGN KEY (`id_dettaglio_fornitore`) REFERENCES `mg_fornitore_articolo`(`id`) ON DELETE SET NULL; +ALTER TABLE `dt_righe_ddt` ADD `id_dettaglio_fornitore` int(11) NULL, +ADD FOREIGN KEY (`id_dettaglio_fornitore`) REFERENCES `mg_fornitore_articolo`(`id`) ON DELETE SET NULL; +ALTER TABLE `co_righe_preventivi` ADD `id_dettaglio_fornitore` int(11) NULL, + ADD FOREIGN KEY (`id_dettaglio_fornitore`) REFERENCES `mg_fornitore_articolo`(`id`) ON DELETE SET NULL; +ALTER TABLE `co_righe_contratti` ADD `id_dettaglio_fornitore` int(11) NULL, + ADD FOREIGN KEY (`id_dettaglio_fornitore`) REFERENCES `mg_fornitore_articolo`(`id`) ON DELETE SET NULL; +ALTER TABLE `co_righe_documenti` ADD `id_dettaglio_fornitore` int(11) NULL, + ADD FOREIGN KEY (`id_dettaglio_fornitore`) REFERENCES `mg_fornitore_articolo`(`id`) ON DELETE SET NULL; +ALTER TABLE `in_righe_interventi` ADD `id_dettaglio_fornitore` int(11) NULL, + ADD FOREIGN KEY (`id_dettaglio_fornitore`) REFERENCES `mg_fornitore_articolo`(`id`) ON DELETE SET NULL; +ALTER TABLE `co_righe_promemoria` ADD `id_dettaglio_fornitore` int(11) NULL, + ADD FOREIGN KEY (`id_dettaglio_fornitore`) REFERENCES `mg_fornitore_articolo`(`id`) ON DELETE SET NULL; diff --git a/update/tables.php b/update/tables.php index d3d87d2bc..9ef135068 100755 --- a/update/tables.php +++ b/update/tables.php @@ -76,6 +76,7 @@ return [ 'in_tipiintervento', 'in_vociservizio', 'mg_articoli', + 'mg_fornitore_articolo', 'mg_categorie', 'mg_causali_movimenti', 'mg_listini',