diff --git a/CHANGELOG.md b/CHANGELOG.md index 384084354..4a4844df6 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -47,9 +47,12 @@ Il formato utilizzato è basato sulle linee guida di [Keep a Changelog](http://k - Aggiunta possibilità di notificare al cliente/tecnico in modo automatico quando viene cambiato lo stato dell'intervento - Aggiunta flag per escludere la generazione scadenza di una ritenuta d'acconto se viene versata dal fornitore - ### Modificato (Changed) +### Modificato (Changed) - Impostazione CAP automatico a 99999 nella FE per clienti esteri +### Fixed + - Correzione movimenti di magazzino con sedi diverse + ## 2.4.21 (2021-01-14) ### Aggiunto (Added) diff --git a/modules/articoli/ajax/select.php b/modules/articoli/ajax/select.php index 909fa447b..3be6f8f9f 100755 --- a/modules/articoli/ajax/select.php +++ b/modules/articoli/ajax/select.php @@ -106,8 +106,8 @@ switch ($resource) { // Se c'è una sede settata, carico tutti gli articoli presenti in quella sede 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'; + LEFT JOIN (SELECT idarticolo, idsede FROM mg_movimenti GROUP BY idarticolo) movimenti ON movimenti.idarticolo=mg_articoli.id + LEFT JOIN an_sedi ON an_sedi.id = movimenti.idsede'; } $query .= ' @@ -154,20 +154,11 @@ switch ($resource) { // IVA da impostazioni foreach ($rs as $k => $r) { // Lettura movimenti delle mie sedi - $qta_azienda = $dbo->fetchOne('SELECT SUM(mg_movimenti.qta) AS qta FROM mg_movimenti LEFT JOIN an_sedi ON an_sedi.id = mg_movimenti.idsede_azienda WHERE mg_movimenti.idarticolo = '.prepare($r['id']).' AND idsede_azienda = '.prepare($superselect['idsede_partenza'])); - - // Lettura eventuali movimenti ad una propria sede (nel caso di movimenti fra sedi della mia azienda) per il calcolo corretto delle quantità - if ($superselect['idsede_partenza'] != 0) { - $qta_controparte = $dbo->fetchOne('SELECT SUM(mg_movimenti.qta) AS qta FROM mg_movimenti LEFT JOIN an_sedi ON an_sedi.id = mg_movimenti.idsede_controparte WHERE mg_movimenti.idarticolo = '.prepare($r['id']).' AND idsede_controparte = '.prepare($superselect['idsede_partenza'])); - } else { - $qta_controparte = $dbo->fetchOne('SELECT SUM(mg_movimenti.qta) AS qta FROM ((( mg_movimenti LEFT JOIN an_sedi ON an_sedi.id = mg_movimenti.idsede_controparte ) LEFT JOIN dt_ddt ON mg_movimenti.idddt = dt_ddt.id ) LEFT JOIN co_documenti ON mg_movimenti.iddocumento = co_documenti.id ) WHERE mg_movimenti.idarticolo = '.prepare($r['id']).' AND idsede_controparte = '.prepare($superselect['idsede_partenza']).' AND IFNULL(dt_ddt.idanagrafica, co_documenti.idanagrafica) = '.prepare(setting('Azienda predefinita'))); - } - - $qta = $qta_azienda['qta'] - $qta_controparte['qta']; + $qta_sede = $dbo->fetchOne('SELECT SUM(mg_movimenti.qta) AS qta FROM mg_movimenti LEFT JOIN an_sedi ON an_sedi.id = mg_movimenti.idsede WHERE mg_movimenti.idarticolo = '.prepare($r['id']).' AND idsede = '.prepare($superselect['idsede_partenza']))['qta']; $rs[$k] = array_merge($r, [ - 'text' => $r['codice'].' - '.$r['descrizione'].' '.(!$r['servizio'] ? '('.Translator::numberToLocale($qta).(!empty($r['um']) ? ' '.$r['um'] : '').')' : ''), - 'disabled' => $r['qta'] <= 0 && !$permetti_movimenti_sotto_zero && !$r['servizio'], + 'text' => $r['codice'].' - '.$r['descrizione'].' '.(!$r['servizio'] ? '('.Translator::numberToLocale($qta_sede).(!empty($r['um']) ? ' '.$r['um'] : '').')' : ''), + 'disabled' => $qta_sede <= 0 && !$permetti_movimenti_sotto_zero && !$r['servizio'], ]); } diff --git a/modules/articoli/modutil.php b/modules/articoli/modutil.php index b2c328054..53b766564 100755 --- a/modules/articoli/modutil.php +++ b/modules/articoli/modutil.php @@ -121,23 +121,20 @@ function aggiorna_sedi_movimenti($module, $id) if ($module == 'ddt') { $rs = $dbo->fetchArray('SELECT idsede_partenza, idsede_destinazione, dir FROM dt_ddt INNER JOIN dt_tipiddt ON dt_tipiddt.id = dt_ddt.idtipoddt WHERE dt_ddt.id='.prepare($id)); - $idsede_azienda = ($rs[0]['dir'] == 'uscita') ? $rs[0]['idsede_destinazione'] : $rs[0]['idsede_partenza']; - $idsede_controparte = ($rs[0]['dir'] == 'uscita') ? $rs[0]['idsede_partenza'] : $rs[0]['idsede_destinazione']; + $idsede = ($rs[0]['dir'] == 'uscita') ? $rs[0]['idsede_destinazione'] : $rs[0]['idsede_partenza']; - $dbo->query('UPDATE mg_movimenti SET idsede_azienda='.prepare($idsede_azienda).', idsede_controparte='.prepare($idsede_controparte).' WHERE idddt='.prepare($id)); + $dbo->query('UPDATE mg_movimenti SET idsede='.prepare($idsede).' WHERE reference_type='.prepare('Modules\DDT\DDT').' AND reference_id='.prepare($id)); } elseif ($module == 'documenti') { $rs = $dbo->fetchArray('SELECT idsede_partenza, idsede_destinazione, dir FROM co_documenti INNER JOIN co_tipidocumento ON co_tipidocumento.id = co_documenti.idtipodocumento WHERE co_documenti.id='.prepare($id)); - $idsede_azienda = ($rs[0]['dir'] == 'uscita') ? $rs[0]['idsede_destinazione'] : $rs[0]['idsede_partenza']; - $idsede_controparte = ($rs[0]['dir'] == 'uscita') ? $rs[0]['idsede_partenza'] : $rs[0]['idsede_destinazione']; + $idsede = ($rs[0]['dir'] == 'uscita') ? $rs[0]['idsede_destinazione'] : $rs[0]['idsede_partenza']; - $dbo->query('UPDATE mg_movimenti SET idsede_azienda='.prepare($idsede_azienda).', idsede_controparte='.prepare($idsede_controparte).' WHERE iddocumento='.prepare($id)); + $dbo->query('UPDATE mg_movimenti SET idsede='.prepare($idsede).' WHERE reference_type='.prepare('Modules\Fatture\Fattura').' AND reference_id='.prepare($id)); } elseif ($module == 'interventi') { $rs = $dbo->fetchArray('SELECT idsede_partenza, idsede_destinazione FROM in_interventi WHERE in_interventi.id='.prepare($id)); - $idsede_azienda = $rs[0]['idsede_partenza']; - $idsede_controparte = $rs[0]['idsede_destinazione']; + $idsede = $rs[0]['idsede_partenza']; - $dbo->query('UPDATE mg_movimenti SET idsede_azienda='.prepare($idsede_azienda).', idsede_controparte='.prepare($idsede_controparte).' WHERE idintervento='.prepare($id)); + $dbo->query('UPDATE mg_movimenti SET idsede='.prepare($idsede).' WHERE reference_type='.prepare('Modules\Interventi\Intervento').' AND reference_id='.prepare($id)); } } diff --git a/modules/articoli/src/Articolo.php b/modules/articoli/src/Articolo.php index 4554151c2..12c541889 100755 --- a/modules/articoli/src/Articolo.php +++ b/modules/articoli/src/Articolo.php @@ -204,12 +204,12 @@ class Articolo extends Model { return $this->movimenti() ->select( - 'idsede_azienda', + 'idsede', database()->raw('SUM(qta) AS qta') - )->groupBy(['idsede_azienda']) + )->groupBy(['idsede']) ->get() ->mapToGroups(function ($item, $key) { - return [$item->idsede_azienda => (float) $item->attributes['qta']]; + return [$item->idsede => (float) $item->attributes['qta']]; }) ->flatten() ->toArray(); diff --git a/modules/articoli/src/Import/CSV.php b/modules/articoli/src/Import/CSV.php index 21b96716e..c5b352c56 100644 --- a/modules/articoli/src/Import/CSV.php +++ b/modules/articoli/src/Import/CSV.php @@ -291,8 +291,7 @@ class CSV extends CSVImporter $qta_movimento = $qta_registrata - $giacenze[$id_sede]; $articolo->movimenta($qta_movimento, tr('Movimento da importazione'), new Carbon(), false, [ - 'idsede_azienda' => $id_sede, - 'idsede_controparte' => 0, + 'idsede' => $id_sede, ]); } diff --git a/modules/articoli/src/Movimento.php b/modules/articoli/src/Movimento.php index 91e32cdf1..21c950889 100755 --- a/modules/articoli/src/Movimento.php +++ b/modules/articoli/src/Movimento.php @@ -24,12 +24,6 @@ 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* - * Il campo *idsede_azienda* è relativo alla sede dell'Azienda che è interessata dal movimento, mentre *idsede_controparte* indica la sede del Cliente/Fornitore controparte. - * La natura effettiva del movimento (e di *idsede_controparte*) è quindi identificabile dal valore del campo *qta*: se positivo il magazzino è aumentatao (movimento da *idsede_controparte* a *idsede_azienda*), se negativo il magazzino è diminuito (movimento da *idsede_azienda* a *idsede_controparte*). - * - * Si noti che il valore "0" per i campi *idsede_* indica solitamente una Sede legale dell'Anagrafica di riferimento. Solo se il movimento non è associato ad alcun documento il campo *idsede_controparte* non segue questo significato, poichè il movimento in questo caso è considerato manuale. */ class Movimento extends Model { diff --git a/modules/listini/bulk.php b/modules/listini/bulk.php deleted file mode 100644 index d2825c5da..000000000 --- a/modules/listini/bulk.php +++ /dev/null @@ -1,26 +0,0 @@ -query('UPDATE mg_prezzi_articoli SET sconto_percentuale='.prepare($sconto).' WHERE id='.prepare($id_record)); - } - flash()->info(tr('Sconti modificati correttamente!')); - break; -} - -return [ - 'aggiorna-listino' => [ - 'text' => ''.tr('Modifica sconto').'', - 'data' => [ - 'title' => tr('Inserisci lo sconto per questi articoli'), - 'msg' => '{[ "type": "text", "label": "'.tr('Nuovo sconto').'","icon-after":"%", "name": "sconto" ]}', - 'button' => tr('Modifica'), - 'class' => 'btn btn-lg btn-warning', - 'blank' => false, - ], - ], -]; diff --git a/modules/movimenti/actions.php b/modules/movimenti/actions.php index a6ee362c2..b7d082664 100755 --- a/modules/movimenti/actions.php +++ b/modules/movimenti/actions.php @@ -45,20 +45,17 @@ switch (post('op')) { // Registrazione del movimento con variazione della quantità $articolo->movimenta($qta, $descrizione, $data, 1, [ - 'idsede_controparte' => $id_sede_controparte, - 'idsede_azienda' => $id_sede_azienda, + 'idsede' => $id_sede_azienda, ]); } elseif ($tipo_movimento == 'spostamento') { // Registrazione del movimento verso la sede di destinazione $articolo->registra($qta, $descrizione, $data, 1, [ - 'idsede_controparte' => 0, - 'idsede_azienda' => $idsede_destinazione, + 'idsede' => $idsede_destinazione, ]); // Registrazione del movimento dalla sede di origine $articolo->registra(-$qta, $descrizione, $data, 1, [ - 'idsede_controparte' => 0, - 'idsede_azienda' => $idsede_partenza, + 'idsede' => $idsede_partenza, ]); } diff --git a/plugins/importFE/generate.php b/plugins/importFE/generate.php index 648f697fc..b9cf67e6c 100755 --- a/plugins/importFE/generate.php +++ b/plugins/importFE/generate.php @@ -245,7 +245,7 @@ if (!empty($anagrafica)) { if (in_array($dati_generali['TipoDocumento'], ['TD04', 'TD05'])) { echo '
- {[ "type": "select", "label": "'.tr('Fattura collegata').'", "name": "ref_fattura", "required": 1, "values": "query='.$query.'" ]} + {[ "type": "select", "label": "'.tr('Fattura collegata').'", "name": "ref_fattura", "required": 0, "values": "query='.$query.'" ]}
'; } elseif ($dati_generali['TipoDocumento'] == 'TD06') { $query .= "AND co_documenti.id_segment = (SELECT id FROM zz_segments WHERE name = 'Fatture pro-forma' AND id_module = ".prepare($id_module).')'; diff --git a/src/Common/Components/Article.php b/src/Common/Components/Article.php index eb23f7ede..30c0be7e9 100755 --- a/src/Common/Components/Article.php +++ b/src/Common/Components/Article.php @@ -277,8 +277,7 @@ abstract class Article extends Accounting $qta_movimento = $documento->direzione == 'uscita' ? $qta : -$qta; $movimento = Movimento::descrizioneMovimento($qta_movimento, $documento->direzione).' - '.$documento->getReference(); - $partenza = $documento->direzione == 'uscita' ? $documento->idsede_destinazione : $documento->idsede_partenza; - $arrivo = $documento->direzione == 'uscita' ? $documento->idsede_partenza : $documento->idsede_destinazione; + $idsede = $documento->direzione == 'uscita' ? $documento->idsede_destinazione : $documento->idsede_partenza; // Fix per valori di sede a NULL $partenza = $partenza ?: 0; @@ -287,8 +286,7 @@ abstract class Article extends Accounting $this->articolo->movimenta($qta_movimento, $movimento, $data, false, [ 'reference_type' => get_class($documento), 'reference_id' => $documento->id, - 'idsede_azienda' => $partenza, - 'idsede_controparte' => $arrivo, + 'idsede' => $idsede, ]); } diff --git a/update/2_4_22.sql b/update/2_4_22.sql index b7820953f..262c759bf 100644 --- a/update/2_4_22.sql +++ b/update/2_4_22.sql @@ -12,7 +12,7 @@ ALTER TABLE `mg_movimenti` ADD INDEX(`idarticolo`); UPDATE `zz_settings` SET `tipo`='query=SELECT idstatointervento AS id, descrizione AS text FROM in_statiintervento' WHERE `nome`='Stato dell''attività dopo la firma'; -- Aggiunto filtro N3.% nella scelta aliquota per le dichiarazioni d'intento -UPDATE `zz_settings` SET `tipo` = 'query=SELECT id, descrizione FROM `co_iva` WHERE codice_natura_fe LIKE \'N3.%\' AND deleted_at IS NULL ORDER BY descrizione ASC' WHERE `zz_settings`.`nome` = 'Iva per lettere d''intento'; +UPDATE `zz_settings` SET `tipo` = 'query=SELECT id, descrizione FROM `co_iva` WHERE codice_natura_fe LIKE ''N3.%'' AND deleted_at IS NULL ORDER BY descrizione ASC' WHERE `zz_settings`.`nome` = 'Iva per lettere d''intento'; -- Aggiunte descrizioni aliquote IVA con codice natura 2.1 @@ -91,7 +91,7 @@ INSERT INTO `zz_api_resources` (`id`, `version`, `type`, `resource`, `class`, `e ALTER TABLE `co_documenti` ADD `is_ritenuta_pagata` BOOLEAN NOT NULL AFTER `id_ricevuta_principale`; -- Modificato options modulo scadenzario -UPDATE `zz_modules` SET `options` = 'SELECT |select| FROM `co_scadenziario`\r\n LEFT JOIN `co_documenti` ON `co_scadenziario`.`iddocumento` = `co_documenti`.`id`\r\n LEFT JOIN `an_anagrafiche` ON `co_documenti`.`idanagrafica` = `an_anagrafiche`.`idanagrafica`\r\n LEFT JOIN `co_pagamenti` ON `co_documenti`.`idpagamento` = `co_pagamenti`.`id`\r\n LEFT JOIN `co_tipidocumento` ON `co_documenti`.`idtipodocumento` = `co_tipidocumento`.`id`\r\n LEFT JOIN `co_statidocumento` ON `co_documenti`.`idstatodocumento` = `co_statidocumento`.`id`\r\nWHERE 1=1 AND\r\n (`co_statidocumento`.`descrizione` IS NULL OR `co_statidocumento`.`descrizione` IN(\'Emessa\',\'Parzialmente pagato\',\'Pagato\'))\r\nHAVING 2=2\r\nORDER BY `scadenza` ASC' WHERE `zz_modules`.`id` = (SELECT `id` FROM `zz_modules` WHERE `name`='Scadenzario'); +UPDATE `zz_modules` SET `options` = 'SELECT |select| FROM `co_scadenziario`\r\n LEFT JOIN `co_documenti` ON `co_scadenziario`.`iddocumento` = `co_documenti`.`id`\r\n LEFT JOIN `an_anagrafiche` ON `co_documenti`.`idanagrafica` = `an_anagrafiche`.`idanagrafica`\r\n LEFT JOIN `co_pagamenti` ON `co_documenti`.`idpagamento` = `co_pagamenti`.`id`\r\n LEFT JOIN `co_tipidocumento` ON `co_documenti`.`idtipodocumento` = `co_tipidocumento`.`id`\r\n LEFT JOIN `co_statidocumento` ON `co_documenti`.`idstatodocumento` = `co_statidocumento`.`id`\r\nWHERE 1=1 AND\r\n (`co_statidocumento`.`descrizione` IS NULL OR `co_statidocumento`.`descrizione` IN(\'Emessa\',\'Parzialmente pagato\',\'Pagato\'))\r\nHAVING 2=2\r\nORDER BY `scadenza` ASC' WHERE `zz_modules`.`name`='Scadenzario'; -- Modificato nome segmento UPDATE `zz_segments` SET `name` = 'Scadenzario completo per periodo' WHERE `zz_segments`.`name` = 'Scadenzario completo'; @@ -99,4 +99,14 @@ UPDATE `zz_segments` SET `name` = 'Scadenzario completo per periodo' WHERE `zz_s -- Fix stampe predefinite Preventivi e Contratti UPDATE `zz_prints` SET `predefined` = '0' WHERE `zz_prints`.`id_module` = (SELECT `id` FROM `zz_modules` WHERE `name` = 'Preventivi') AND `zz_prints`.`name` = 'Consuntivo preventivo'; UPDATE `zz_prints` SET `predefined` = '0' WHERE `zz_prints`.`id_module` = (SELECT `id` FROM `zz_modules` WHERE `name` = 'Contratti') AND `zz_prints`.`name` = 'Consuntivo contratto'; -UPDATE `zz_prints` SET `predefined` = '0' WHERE `zz_prints`.`id_module` = (SELECT `id` FROM `zz_modules` WHERE `name` = 'Contratti') AND `zz_prints`.`name` = 'Ordine di servizio'; \ No newline at end of file +UPDATE `zz_prints` SET `predefined` = '0' WHERE `zz_prints`.`id_module` = (SELECT `id` FROM `zz_modules` WHERE `name` = 'Contratti') AND `zz_prints`.`name` = 'Ordine di servizio'; + +-- Eliminata colonna idsede_controparte e rinominata idsede_azienda in idsede +ALTER TABLE `mg_movimenti` CHANGE `idsede_azienda` `idsede` INT(11) NOT NULL; +ALTER TABLE `mg_movimenti` DROP `idsede_controparte`; +UPDATE `zz_modules` SET `options` = 'SELECT |select| FROM `mg_movimenti` JOIN `mg_articoli` ON `mg_articoli`.id = `mg_movimenti`.`idarticolo` LEFT JOIN `an_sedi` ON `mg_movimenti`.`idsede` = `an_sedi`.`id` WHERE 1=1 HAVING 2=2 ORDER BY mg_movimenti.data DESC, mg_movimenti.created_at DESC' WHERE `zz_modules`.`name` = 'Movimenti'; +UPDATE `zz_views` SET `query` = 'IF( mg_movimenti.idsede=0, \'Sede legale\', an_sedi.nomesede )' WHERE `zz_views`.`name` = 'Sede' 'Movimenti' AND `zz_views`.`id_module`= (SELECT `id` FROM `zz_modules` WHERE `name`='Movimenti'); +UPDATE `zz_modules` SET `options` = 'SELECT |select| FROM `mg_articoli`\r\n LEFT OUTER JOIN an_anagrafiche ON mg_articoli.id_fornitore = an_anagrafiche.idanagrafica\r\n LEFT OUTER JOIN co_iva ON mg_articoli.idiva_vendita = co_iva.id\r\n LEFT OUTER JOIN (\r\n SELECT SUM(qta - qta_evasa) AS qta_impegnata, idarticolo FROM or_righe_ordini\r\n INNER JOIN or_ordini ON or_righe_ordini.idordine = or_ordini.id\r\n WHERE idstatoordine IN (SELECT id FROM or_statiordine WHERE completato = 0)\r\n GROUP BY idarticolo\r\n ) ordini ON ordini.idarticolo = mg_articoli.id\r\n LEFT OUTER JOIN (SELECT `idarticolo`, `idsede`, SUM(`qta`) AS `qta` FROM `mg_movimenti` WHERE `idsede` = |giacenze_sedi_idsede| GROUP BY `idarticolo`, `idsede`) movimenti ON `mg_articoli`.`id` = `movimenti`.`idarticolo`\r\nWHERE 1=1 AND `mg_articoli`.`deleted_at` IS NULL HAVING 2=2 AND `Q.tà` > 0 ORDER BY `descrizione`' WHERE `zz_modules`.`name` = 'Giacenze sedi'; + +-- Rimozione campo idsede_azienda +UPDATE `zz_views` INNER JOIN `zz_modules` ON `zz_views`.`id_module` = `zz_modules`.`id` SET `zz_views`.`query` = 'IF( mg_movimenti.idsede=0, \'Sede legale\', an_sedi.nomesede )' WHERE `zz_views`.`name` = 'Sede' AND `zz_modules`.`name` = 'Movimenti';