diff --git a/CHANGELOG.md b/CHANGELOG.md index 398357014..87ac64172 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,7 +40,9 @@ Il formato utilizzato è basato sulle linee guida di [Keep a Changelog](http://k ### Aggiunto (Added) - Aggiunta nel calendario della Dashboard visualizzazione dei preventivi pianificabili in corrispondenza alla data di accettazione e conclusione. - Aggiunta impostazione per la visualizzazione delle ore nella stampa intervento (Decimale, Sessantesimi). - + - Aggiunta possibilità di selezionare la sede di partenza della merce in fase di aggiunta articolo da un'attività + - Sostituito plugin **Componenti** nel modulo Impianti con la possibilità di inserire gli articoli di magazzino + ### Fixed - diff --git a/include/common/articolo.php b/include/common/articolo.php index 866306d48..7e501665a 100755 --- a/include/common/articolo.php +++ b/include/common/articolo.php @@ -22,6 +22,15 @@ $qta_minima = 0; // Articolo if (empty($result['idarticolo'])) { + // Sede partenza + if ($module['name'] == 'Interventi') { + echo ' +
+
+ {[ "type": "select", "label": "'.tr('Partenza merce').'", "required": "1", "id":"idsede", "name": "idsede_partenza", "ajax-source": "sedi_azienda", "value": "'.($result['idsede_partenza'] ?: $options['idsede_partenza']).'" ]} +
+
'; + } echo '
@@ -179,6 +188,12 @@ $("#idarticolo").on("change", function() { }); +$("#idsede").on("change", function() { + updateSelectOption("idsede_partenza", $(this).val()); + session_set("superselect,idsede_partenza", $(this).val(), 0); + $("#idarticolo").selectReset(); +}); + $(document).on("change", "input[name^=qta], input[name^=prezzo_unitario], input[name^=sconto]", function() { verificaPrezzoArticolo(); verificaScontoArticolo(); diff --git a/include/riferimenti/riferimenti.php b/include/riferimenti/riferimenti.php index bf411da49..aaa40a4e4 100644 --- a/include/riferimenti/riferimenti.php +++ b/include/riferimenti/riferimenti.php @@ -68,8 +68,6 @@ foreach ($ddt as $elemento) { $tipo_ordini = $direzione_richiesta == 'entrata' ? 'cliente' : 'fornitore'; $ordini = Ordine::whereHas('stato', function ($query) { $query->where('descrizione', '!=', 'Bozza'); -})->whereHas('tipo', function ($query) use ($direzione_richiesta) { - $query->where('dir', '=', $direzione_richiesta); })->get(); foreach ($ordini as $elemento) { $documenti_disponibili->push([ diff --git a/modules/articoli/edit.php b/modules/articoli/edit.php index 919f43a1d..64084cf13 100755 --- a/modules/articoli/edit.php +++ b/modules/articoli/edit.php @@ -175,7 +175,7 @@ include_once __DIR__.'/../../core.php';
- {[ "type": "select", "label": "", "name": "id_fornitore", "ajax-source": "fornitori-articolo", "select-options": $id_record]); ?>, "value":"$id_fornitore$", "help": "." ]} + {[ "type": "select", "label": "", "name": "id_fornitore", "ajax-source": "fornitori-articolo", "select-options": $id_record]); ?>, "value":"$id_fornitore$", "help": "." ]}
diff --git a/modules/interventi/actions.php b/modules/interventi/actions.php index 7fa3b807d..1009e229d 100644 --- a/modules/interventi/actions.php +++ b/modules/interventi/actions.php @@ -111,7 +111,7 @@ switch (post('op')) { } } } - aggiorna_sedi_movimenti('interventi', $id_record); + flash()->info(tr('Attività modificata correttamente!')); break; @@ -131,8 +131,6 @@ switch (post('op')) { $intervento = Intervento::build($anagrafica, $tipo, $stato, $data_richiesta); $id_record = $intervento->id; - aggiorna_sedi_movimenti('interventi', $id_record); - flash()->info(tr('Aggiunto nuovo intervento!')); // Informazioni di base @@ -219,7 +217,6 @@ switch (post('op')) { flash()->clearMessage('warning'); } - aggiorna_sedi_movimenti('interventi', $id_record); break; // Eliminazione intervento @@ -267,8 +264,6 @@ switch (post('op')) { } } - aggiorna_sedi_movimenti('interventi', $id_record); - break; case 'manage_barcode': @@ -313,7 +308,8 @@ switch (post('op')) { } $qta = post('qta'); - + + $articolo->idsede_partenza = post('idsede_partenza'); $articolo->descrizione = post('descrizione'); $articolo->um = post('um') ?: null; @@ -394,7 +390,6 @@ switch (post('op')) { $serials = (array) post('serial'); $articolo->serials = $serials; - aggiorna_sedi_movimenti('interventi', $id_record); break; // Aggiunta di un documento in ordine diff --git a/modules/interventi/row-add.php b/modules/interventi/row-add.php index 963b7b7d3..4bdc0b18b 100755 --- a/modules/interventi/row-add.php +++ b/modules/interventi/row-add.php @@ -33,6 +33,7 @@ $options = [ 'totale_imponibile_documento' => $documento->totale_imponibile, 'totale_documento' => $documento->totale, 'nascondi_prezzi' => !$show_prezzi, + 'idsede_partenza' => $documento->idsede_partenza, 'select-options' => [ 'articoli' => [ 'idanagrafica' => $documento->idanagrafica, diff --git a/plugins/componenti/actions.php b/plugins/componenti/actions.php new file mode 100644 index 000000000..85a6e291a --- /dev/null +++ b/plugins/componenti/actions.php @@ -0,0 +1,125 @@ +. + */ + +include_once __DIR__.'/../../core.php'; + +use Carbon\Carbon; + +$operazione = filter('op'); + +switch ($operazione) { + case 'update': + $articolo = (array)post('id_articolo'); + $data_installazione = (array)post('data_installazione'); + $data_disinstallazione = (array)post('data_disinstallazione'); + $data_registrazione = (array)post('data_registrazione'); + $note = (array)post('note'); + + $key = key($articolo); + + if(post('sostituito')){ + $field_articolo = 'pre_id_articolo'; + } else{ + $field_articolo = 'id_articolo'; + } + + $dbo->update('my_componenti_articoli', [ + $field_articolo => $articolo[$key], + 'data_installazione' => $data_installazione[$key] ?: null, + 'data_disinstallazione' => $data_disinstallazione[$key] ?: null, + 'data_registrazione' => $data_registrazione[$key] ?: null, + 'note' => $note[$key], + ], ['id' => $key]); + + flash()->info(tr('Salvataggio completato!')); + $dbo->commitTransaction(); + header('Location: '.$rootdir.'/editor.php?id_module='.$id_module.'&id_record='.$id_record.'#tab_'.$id_plugin); + exit; + + break; + + case 'add': + $dbo->insert('my_componenti_articoli', [ + 'id_impianto' => $id_record, + 'data_registrazione' => Carbon::now(), + 'id_articolo' => post('id_articolo'), + ]); + + flash()->info(tr('Salvataggio completato!')); + + break; + + case 'sostituisci': + $old_id = get('id_old'); + $old = $dbo->selectOne('my_componenti_articoli', '*', ['id' => $old_id]); + + if(!empty($old['id_articolo'])){ + + if(empty($old['data_disinstallazione'])){ + $data = Carbon::now(); + } else{ + $data = $old['data_disinstallazione']; + } + + $dbo->update('my_componenti_articoli', [ + 'pre_id_articolo' => $old['id_articolo'], + 'id_articolo' => 0, + 'data_disinstallazione' => $data, + ],[ + 'id' => $old_id, + ]); + + $dbo->query('CREATE TEMPORARY TABLE tmp SELECT * FROM my_componenti_articoli WHERE id= '.prepare($old_id)); + $dbo->query('ALTER TABLE tmp DROP id'); + $dbo->query('INSERT INTO my_componenti_articoli SELECT NULL,tmp. * FROM tmp'); + $new_id = $dbo->lastInsertedID(); + $dbo->query('DROP TEMPORARY TABLE tmp'); + + $dbo->update('my_componenti_articoli', [ + 'id_articolo' => $old['id_articolo'], + 'pre_id_articolo' => 0, + 'data_registrazione' => Carbon::now(), + 'data_installazione' => $data, + 'data_disinstallazione' => null, + ], [ + 'id' => $new_id, + ]); + + flash()->info(tr('Informazioni salvate correttamente!')); + } else{ + flash()->warning(tr('Inserire un articolo prima di effettuare la sostituzione!')); + } + + $dbo->commitTransaction(); + header('Location: '.$rootdir.'/editor.php?id_module='.$id_module.'&id_record='.$id_record.'#tab_'.$id_plugin); + exit; + + break; + + case 'delete': + $dbo->query('DELETE FROM my_componenti_articoli WHERE id='.prepare(get('id'))); + + flash()->info(tr('Componente eliminato!')); + + $dbo->commitTransaction(); + header('Location: '.$rootdir.'/editor.php?id_module='.$id_module.'&id_record='.$id_record.'#tab_'.$id_plugin); + exit; + + break; +} diff --git a/plugins/componenti/add.php b/plugins/componenti/add.php new file mode 100644 index 000000000..833d680a7 --- /dev/null +++ b/plugins/componenti/add.php @@ -0,0 +1,40 @@ +. + */ + +include_once __DIR__.'/../../core.php'; + +echo ' +
+ + + + +
+
+ {["type": "select", "label": "'.tr('Articolo').'", "name": "id_articolo", "ajax-source": "articoli", "value": "", "required": 1, "select-options": {"permetti_movimento_a_zero": 1} ]} +
+
+ + +
+
+ +
+
+
'; diff --git a/plugins/componenti/allegati.php b/plugins/componenti/allegati.php new file mode 100644 index 000000000..41c0f9d21 --- /dev/null +++ b/plugins/componenti/allegati.php @@ -0,0 +1,22 @@ +. + */ + +include_once __DIR__.'/../../core.php'; + +echo '{( "name": "filelist_and_upload", "id":"'.rand(1,999).'", "id_record": "'.get('id').'", "id_module": "'.$id_module.'", "id_plugin": "'.$id_plugin.'" )}'; \ No newline at end of file diff --git a/plugins/componenti/edit.php b/plugins/componenti/edit.php new file mode 100644 index 000000000..a5ed2ef01 --- /dev/null +++ b/plugins/componenti/edit.php @@ -0,0 +1,194 @@ +. + */ + +include_once __DIR__.'/../../core.php'; + +echo '
'; + +$componenti = $dbo->fetchArray('SELECT my_componenti_articoli.*, my_impianti.idanagrafica, CONCAT(a.codice, " - ", a.descrizione) AS art_sostituito, CONCAT(b.codice, " - ", b.descrizione) AS art_installato, a.codice FROM my_componenti_articoli LEFT JOIN my_impianti ON my_componenti_articoli.id_impianto=my_impianti.id LEFT JOIN mg_articoli AS a ON my_componenti_articoli.pre_id_articolo=a.id LEFT JOIN mg_articoli AS b ON my_componenti_articoli.id_articolo=b.id WHERE id_impianto='.prepare($id_record).' ORDER BY data_registrazione, id_articolo DESC'); + +$installati = 0; +$disinstallati = 0; + +foreach($componenti as $componente){ + if(!empty($componente['pre_id_articolo'])){ + $id_articolo = $componente['pre_id_articolo']; + $check_value = 1; + $box = 'danger'; + $articolo = $componente['art_sostituito']; + $data = dateFormat($componente['data_disinstallazione']); + $text = 'DISINSTALLATO'; + $class = 'danger'; + $title = ''.tr('Storico').''; + $table ='default'; + if($disinstallati==0){ + echo ' +
+
+

ARTICOLI DISINSTALLATI

+
+
+
'; + $disinstallati++; + } + } else{ + $id_articolo = $componente['id_articolo']; + $check_value = 0; + $box = 'primary'; + $articolo = $componente['art_installato']; + $data = dateFormat($componente['data_installazione']); + $text = 'INSTALLATO'; + $class = 'primary'; + $title = ''.tr('Dati').''; + $table ='primary'; + if($installati==0){ + echo ' +
+
+

ARTICOLI INSTALLATI

+
+
+
'; + $installati++; + } + } + + $allegati = $dbo->fetchOne('SELECT COUNT(id) AS num FROM zz_files WHERE id_plugin='.prepare($id_plugin).' AND id_record='.$componente['id'].' GROUP BY id_record')['num']; + + if($allegati){ + $icon = 'fa fa-check text-success'; + } else{ + $icon = 'fa fa-times text-danger'; + } + + echo ' +
+ + + + + + + +
+
+
+ + + + + + + + + + + + + + + +
'.tr('ARTICOLO').' + '.$text.''.tr('REGISTRAZIONE').''.tr('ALLEGATI').'
'.$articolo.''.$data.''.dateFormat($componente['data_registrazione']).'
+
+ +
+ +
+
+
+
+
+

'.$title.'

+
+ + +
+ +
+
+ {[ "type":"select","label":"'.tr('Articolo').'","name":"id_articolo['.$componente['id'].']", "required":"1","value":"'.$id_articolo.'", "ajax-source": "articoli", "select-options": {"permetti_movimento_a_zero": 1} ]} +
+
+ {[ "type":"date","label":"'.tr('Data registrazione').'","name":"data_registrazione['.$componente['id'].']", "value":"'.$componente['data_registrazione'].'" ]} +
+
+ {[ "type":"date","label":"'.tr('Data installazione').'","name":"data_installazione['.$componente['id'].']", "value":"'.$componente['data_installazione'].'" ]} +
+ +
+ {[ "type":"date","label":"'.tr('Data disinstallazione').'","name":"data_disinstallazione['.$componente['id'].']", "value":"'.$componente['data_disinstallazione'].'" ]} +
+
+ +
+
+ {[ "type":"textarea","label":"'.tr('Note').'","name":"note['.$componente['id'].']", "value":"'.$componente['note'].'" ]} +
+
+ + +
+
+ +
+ '; + + if(!empty($componente['id_articolo'])){ + echo ' +
+ +
'; + } + echo ' +
+ +
+
+
+
+
+
+
+
'; +} + +echo ' +'; \ No newline at end of file diff --git a/plugins/exportFE/src/FatturaElettronica.php b/plugins/exportFE/src/FatturaElettronica.php index 0bfb71655..995b5c7e5 100755 --- a/plugins/exportFE/src/FatturaElettronica.php +++ b/plugins/exportFE/src/FatturaElettronica.php @@ -1026,25 +1026,55 @@ class FatturaElettronica $result = []; // Se imposto il vettore deve essere indicata anche la p.iva nella sua anagrafica - if ($documento['idvettore']) { - $vettore = Anagrafica::find($documento['idvettore']); - $result['DatiAnagraficiVettore'] = static::getDatiAnagrafici($vettore); + if ($documento->tipo->descrizione == 'Fattura accompagnatoria di vendita') { + + if ($documento['idvettore']) { + $vettore = Anagrafica::find($documento['idvettore']); + $result['DatiAnagraficiVettore'] = static::getDatiAnagrafici($vettore); + } + + if (!empty($causale)) { + $result['CausaleTrasporto'] = $causale; + } + + if (!empty($documento['n_colli'])) { + $result['NumeroColli'] = $documento['n_colli']; + } + + if (!empty($aspetto)) { + $result['Descrizione'] = $aspetto; + } + + if ($documento['tipo_resa']) { + $result['TipoResa'] = $documento['tipo_resa']; + } } - if (!empty($causale)) { - $result['CausaleTrasporto'] = $causale; - } + if (!empty($documento['idsede_destinazione'])){ + + $sede = $database->fetchOne('SELECT * FROM an_sedi WHERE id='.prepare($documento['idsede_destinazione'])); - if (!empty($documento['n_colli'])) { - $result['NumeroColli'] = $documento['n_colli']; - } + if (!empty($sede['indirizzo'])){ + $result['IndirizzoResa']['Indirizzo'] = $sede['indirizzo']; + } - if (!empty($aspetto)) { - $result['Descrizione'] = $aspetto; - } + if (!empty($sede['cap'])){ + $result['IndirizzoResa']['CAP'] = $sede['cap']; + } - if ($documento['tipo_resa']) { - $result['TipoResa'] = $documento['tipo_resa']; + if (!empty($sede['citta'])){ + $result['IndirizzoResa']['Comune'] = $sede['citta']; + } + + if (!empty($sede['provincia'])){ + $result['IndirizzoResa']['Provincia'] = $sede['provincia']; + } + + if (!empty($sede['id_nazione'])){ + $rs_nazione = $database->fetchOne('SELECT * FROM an_nazioni WHERE id='.prepare($sede['id_nazione'])); + + $result['IndirizzoResa']['Nazione'] = $rs_nazione['iso2']; + } } return $result; @@ -1273,7 +1303,7 @@ class FatturaElettronica } } - if ($documento->tipo->descrizione == 'Fattura accompagnatoria di vendita') { + if ($documento->tipo->descrizione == 'Fattura accompagnatoria di vendita' || !empty($documento['idsede_destinazione'])) { $result['DatiTrasporto'] = static::getDatiTrasporto($fattura); } diff --git a/src/Common/Components/Article.php b/src/Common/Components/Article.php index d1efbee72..8a534af8e 100755 --- a/src/Common/Components/Article.php +++ b/src/Common/Components/Article.php @@ -292,7 +292,11 @@ abstract class Article extends Accounting $qta_movimento = $documento->direzione == 'uscita' ? $qta : -$qta; $movimento = Movimento::descrizioneMovimento($qta_movimento, $documento->direzione).' - '.$documento->getReference(); - $id_sede = $documento->direzione == 'uscita' ? $documento->idsede_destinazione : $documento->idsede_partenza; + if ($documento instanceof \Modules\Interventi\Intervento) { + $id_sede = $this->idsede_partenza; + } else{ + $id_sede = $documento->direzione == 'uscita' ? $documento->idsede_destinazione : $documento->idsede_partenza; + } // Fix per valori di sede a NULL $id_sede = $id_sede ?: 0; diff --git a/update/2_4_24.sql b/update/2_4_24.sql index 79511489a..7d687e35b 100644 --- a/update/2_4_24.sql +++ b/update/2_4_24.sql @@ -28,3 +28,15 @@ INSERT INTO `zz_settings` (`id`, `nome`, `valore`, `tipo`, `editable`, `sezione` -- Aggiunta plugin allegati dell'anagrafica INSERT INTO `zz_plugins` (`name`, `title`, `idmodule_from`, `idmodule_to`, `position`, `script`, `enabled`, `default`, `order`, `compatibility`, `version`, `options2`, `options`, `directory`, `help`) VALUES ('Allegati', 'Allegati', (SELECT `zz_modules`.`id` FROM `zz_modules` WHERE `zz_modules`.`name`='Anagrafiche'), (SELECT `zz_modules`.`id` FROM `zz_modules` WHERE `zz_modules`.`name`='Anagrafiche'), 'tab', 'allegati.php', '1', '0', '0', '', '', NULL, NULL, '', ''); + +-- Aggiunta idsede nelle righe dell'intervento +ALTER TABLE `in_righe_interventi` ADD `idsede_partenza` INT NOT NULL AFTER `id_dettaglio_fornitore`; + + +-- Aggiunto nuovo plugin Componenti e disabilitato quello precedente +UPDATE `zz_plugins` SET `name`='Componenti ini', `title`='Componenti ini' WHERE `name`='Componenti'; +UPDATE `zz_plugins` SET `enabled`=0 WHERE `name`='Componenti ini'; + +INSERT INTO `zz_plugins` ( `name`, `title`, `idmodule_from`, `idmodule_to`, `position`, `script`, `enabled`, `default`, `order`, `compatibility`, `version`, `options2`, `options`, `directory`, `help`, `created_at`, `updated_at`) VALUES ('Componenti', 'Componenti', (SELECT `id` FROM `zz_modules` WHERE name='Impianti'), (SELECT `id` FROM `zz_modules` WHERE name='Impianti'), 'tab', '', '1', '0', '0', '', '', NULL, 'custom', 'componenti', '', NOW(), NOW()); + +CREATE TABLE `my_componenti_articoli` ( `id` INT NOT NULL AUTO_INCREMENT, `id_impianto` INT NOT NULL , `id_articolo` INT NOT NULL , `pre_id_articolo` INT NOT NULL, `note` TEXT NOT NULL , `data_registrazione` DATE NULL , `data_installazione` DATE NULL , `data_disinstallazione` DATE NULL , `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP , `updated_at` TIMESTAMP on update CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`));