diff --git a/CHANGELOG.md b/CHANGELOG.md index 70bbd1e64..5c532875e 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ Tutti i maggiori cambiamenti di questo progetto saranno documentati in questo fi Il formato utilizzato è basato sulle linee guida di [Keep a Changelog](http://keepachangelog.com/), e il progetto segue il [Semantic Versioning](http://semver.org/) per definire le versioni delle release. +- [2.4.39 (2023-01-13)](#2439-2023-01-13) - [2.4.38 (2022-12-07)](#2438-2022-12-07) - [2.4.37 (2022-11-02)](#2437-2022-11-04) - [2.4.36 (2022-09-16)](#2436-2022-09-16) @@ -49,7 +50,30 @@ Il formato utilizzato è basato sulle linee guida di [Keep a Changelog](http://k - [2.2 (2016-11-10)](#22-2016-11-10) - [2.1 (2015-04-02)](#21-2015-04-02) - +## 2.4.39 (2023-01-13) +### Aggiunto (Added) +- Aggiunto controllo eliminazione metodo di pagamento +- Aggiunte nazioni +- Aggiunta visualizzazione mappa all'aggiunta attività +- Aggiunta possibilità di creare campi aggiuntivi con testo libero +- Aggiunta impostazione per nascondere i promemoria su app +- Aggiunta ID utente nei movimenti articolo +### Modificato (Changed) +- Miglioria gestione codice REA e provincia +- Miglioria stampa mastrino saldo iniziale +### Fixed +- Corretta query vista contratti +- Corretta stampa inventario in Articoli +- Corretta query vista fatture di vendita +- Corretta query vista utenti e permessi +- Corretta lunghezza campo codice REA +- Corretto il calcolo del guadagno in aggiunta riga +- Corretto ordinamento riga bollo in fattura +- Corretta vulnerabilità XSS +- Corretto set pattern segmento attività +- Corretta query vista giacenze sedi +- Corretta visualizzazione rate contrattuali da plugin per anno precedente +- Corretta selezione conti e IVA durante importazione Fattura elettronica di acquisto ## 2.4.38 (2022-12-07) ### Aggiunto (Added) - Aggiunto tempDir per mpdf @@ -78,6 +102,7 @@ Il formato utilizzato è basato sulle linee guida di [Keep a Changelog](http://k - Miglioria ricerca di corrispondenza tra anagrafiche in fase di impostazione dei permessi - Sostituita funzione deprecata formatLocalized con isoFormat - Rimozione codice non raggiungibile +- Ridotte restrizioni cookie per problemi con app esterne ### Fixed - Corretta la selezione dei colori - Corretta la visualizzazione delle colonne datatables @@ -105,6 +130,11 @@ Il formato utilizzato è basato sulle linee guida di [Keep a Changelog](http://k - Corretta logica riapertura fattura pagata - Corretta valorizzazione codice REA in fase di importazione fattura elettronica - Corretta creazione fattura da azioni di gruppo in Attività se valorizzato 'Per conto di' +- Corrette note interne riga documento +- Corretto invio notifica chiusura intervento +- Corretta emissione fatture da azioni di gruppo +- Corretta generazione fatture con totale negativo +- Corretto controllo sort-buffer-size ## 2.4.37 (2022-11-04) ### Aggiunto (Added) - Aggiunto modulo Mappa per geolocalizzare le attività diff --git a/modules/anagrafiche/ajax/select.php b/modules/anagrafiche/ajax/select.php index 66e4a4827..4eabc81fc 100755 --- a/modules/anagrafiche/ajax/select.php +++ b/modules/anagrafiche/ajax/select.php @@ -25,7 +25,42 @@ switch ($resource) { case 'clienti': $id_azienda = setting('Azienda predefinita'); - $query = "SELECT an_anagrafiche.idanagrafica AS id, is_bloccata, CONCAT(ragione_sociale, IF(citta IS NULL OR citta = '', '', CONCAT(' (', citta, ')')), IF(an_anagrafiche.deleted_at IS NULL, '', ' (".tr('eliminata').")'), IF(is_bloccata = 1, CONCAT(' (', an_relazioni.descrizione, ')'), '') ) AS descrizione, idtipointervento_default AS idtipointervento, in_tipiintervento.descrizione AS idtipointervento_descrizione, an_anagrafiche.idzona, contratto.id AS id_contratto, contratto.descrizione AS descrizione_contratto, co_pagamenti.id AS id_pagamento, co_pagamenti.descrizione AS desc_pagamento, banca_vendite.id AS id_banca_vendite, CONCAT(banca_vendite.nome, ' - ', banca_vendite.iban) AS descrizione_banca_vendite FROM an_anagrafiche INNER JOIN (an_tipianagrafiche_anagrafiche INNER JOIN an_tipianagrafiche ON an_tipianagrafiche_anagrafiche.idtipoanagrafica=an_tipianagrafiche.idtipoanagrafica) ON an_anagrafiche.idanagrafica=an_tipianagrafiche_anagrafiche.idanagrafica LEFT JOIN in_tipiintervento ON an_anagrafiche.idtipointervento_default=in_tipiintervento.idtipointervento LEFT JOIN an_relazioni ON an_anagrafiche.idrelazione=an_relazioni.id LEFT JOIN (SELECT co_contratti.id, idanagrafica, CONCAT('Contratto ', numero, ' del ', DATE_FORMAT(data_bozza, '%d/%m/%Y'), ' - ', co_contratti.nome, ' [', `co_staticontratti`.`descrizione` , ']') AS descrizione FROM co_contratti LEFT JOIN co_staticontratti ON co_contratti.idstato=co_staticontratti.id WHERE co_contratti.predefined=1 AND is_pianificabile=1) AS contratto ON an_anagrafiche.idanagrafica=contratto.idanagrafica LEFT JOIN co_pagamenti ON an_anagrafiche.idpagamento_vendite=co_pagamenti.id LEFT JOIN co_banche banca_vendite ON co_pagamenti.idconto_vendite = banca_vendite.id_pianodeiconti3 AND banca_vendite.id_anagrafica = ".prepare($id_azienda)." AND banca_vendite.deleted_at IS NULL AND banca_vendite.predefined = 1 |where| ORDER BY ragione_sociale"; + $query = "SELECT + an_anagrafiche.idanagrafica AS id, + an_anagrafiche.lat, + an_anagrafiche.lng, + is_bloccata, + CONCAT(ragione_sociale, IF(citta IS NULL OR citta = '', '', CONCAT(' (', citta, ')')), IF(an_anagrafiche.deleted_at IS NULL, '', ' (".tr('eliminata').")'), IF(is_bloccata = 1, CONCAT(' (', an_relazioni.descrizione, ')'), '') ) AS descrizione, + idtipointervento_default AS idtipointervento, + in_tipiintervento.descrizione AS idtipointervento_descrizione, + an_anagrafiche.idzona, + contratto.id AS id_contratto, + contratto.descrizione AS descrizione_contratto, + co_pagamenti.id AS id_pagamento, + co_pagamenti.descrizione AS desc_pagamento, + banca_vendite.id AS id_banca_vendite, + CONCAT(banca_vendite.nome, ' - ', banca_vendite.iban) AS descrizione_banca_vendite + FROM + an_anagrafiche + INNER JOIN (an_tipianagrafiche_anagrafiche + INNER JOIN an_tipianagrafiche + ON an_tipianagrafiche_anagrafiche.idtipoanagrafica=an_tipianagrafiche.idtipoanagrafica) + ON an_anagrafiche.idanagrafica=an_tipianagrafiche_anagrafiche.idanagrafica LEFT JOIN in_tipiintervento ON an_anagrafiche.idtipointervento_default=in_tipiintervento.idtipointervento + LEFT JOIN + an_relazioni + ON an_anagrafiche.idrelazione=an_relazioni.id + LEFT JOIN + (SELECT co_contratti.id, idanagrafica, CONCAT('Contratto ', numero, ' del ', DATE_FORMAT(data_bozza, '%d/%m/%Y'), ' - ', co_contratti.nome, ' [', `co_staticontratti`.`descrizione` , ']') AS descrizione FROM co_contratti LEFT JOIN co_staticontratti ON co_contratti.idstato=co_staticontratti.id WHERE co_contratti.predefined=1 AND is_pianificabile=1) AS contratto + ON an_anagrafiche.idanagrafica=contratto.idanagrafica + LEFT JOIN + co_pagamenti + ON an_anagrafiche.idpagamento_vendite=co_pagamenti.id + LEFT JOIN + co_banche banca_vendite + ON co_pagamenti.idconto_vendite = banca_vendite.id_pianodeiconti3 AND banca_vendite.id_anagrafica = ".prepare($id_azienda)." AND banca_vendite.deleted_at IS NULL AND banca_vendite.predefined = 1 + |where| + ORDER BY + ragione_sociale"; foreach ($elements as $element) { $filter[] = 'an_anagrafiche.idanagrafica='.prepare($element); @@ -267,7 +302,24 @@ switch ($resource) { */ case 'sedi': if (isset($superselect['idanagrafica'])) { - $query = "SELECT * FROM (SELECT '0' AS id, (SELECT idzona FROM an_anagrafiche |where|) AS idzona, CONCAT_WS(' - ', \"".tr('Sede legale')."\" , (SELECT CONCAT (citta, IF(indirizzo!='',CONCAT(' (', indirizzo, ')'), ''), ' (',ragione_sociale,')') FROM an_anagrafiche |where|)) AS descrizione UNION SELECT id, idzona, CONCAT_WS(' - ', nomesede, CONCAT(citta, IF(indirizzo!='',CONCAT(' (', indirizzo, ')'), '')) ) FROM an_sedi |where|) AS tab HAVING descrizione LIKE ".prepare('%'.$search.'%').' ORDER BY descrizione'; + $query = " + SELECT + * + FROM + (SELECT '0' AS id, (SELECT lat FROM an_anagrafiche |where|) AS lat, (SELECT lng FROM an_anagrafiche |where|) AS lng, (SELECT idzona FROM an_anagrafiche |where|) AS idzona, CONCAT_WS(' - ', \"".tr('Sede legale')."\" , (SELECT CONCAT (citta, IF(indirizzo!='',CONCAT(' (', indirizzo, ')'), ''), ' (',ragione_sociale,')') FROM an_anagrafiche |where|)) AS descrizione + + UNION + + SELECT + id, + lat, + lng, + idzona, + CONCAT_WS(' - ', nomesede, CONCAT(citta, IF(indirizzo!='',CONCAT(' (', indirizzo, ')'), '')) ) FROM an_sedi |where|) AS tab + HAVING + descrizione LIKE ".prepare('%'.$search.'%').' + ORDER BY + descrizione'; foreach ($elements as $element) { $filter[] = 'id='.prepare($element); diff --git a/modules/articoli/plugins/articoli.movimenti.php b/modules/articoli/plugins/articoli.movimenti.php index 829935fc1..eb23bec8d 100755 --- a/modules/articoli/plugins/articoli.movimenti.php +++ b/modules/articoli/plugins/articoli.movimenti.php @@ -143,9 +143,12 @@ if (!empty($movimenti)) { '; // Data + $utente = $dbo->table('zz_users')->where('id',$movimento->idutente)->first(); + $data = ($movimento->data ? $movimento->data : $movimento->data_movimento); echo ' - '.dateFormat($movimento->data).' '.dateFormat($data).' '; // Operazioni diff --git a/modules/articoli/src/Articolo.php b/modules/articoli/src/Articolo.php index 25f63dad8..73f7a33ad 100755 --- a/modules/articoli/src/Articolo.php +++ b/modules/articoli/src/Articolo.php @@ -103,6 +103,8 @@ class Articolo extends Model return false; } + global $user; + // Movimento il magazzino solo se l'articolo non è un servizio if (empty($this->servizio)) { // Registrazione della movimentazione @@ -112,6 +114,7 @@ class Articolo extends Model 'movimento' => $descrizone, 'data' => $data, 'manuale' => $manuale, + 'idutente' => $user->id, ])); } $id = database()->lastInsertedID(); @@ -307,7 +310,7 @@ class Articolo extends Model { $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']); + ->groupBy(['tipo_gruppo', 'mg_movimenti.reference_id', 'mg_movimenti.idutente']); if (!empty($mostra_vuoti)) { return $movimenti; diff --git a/modules/banche/src/IBAN.php b/modules/banche/src/IBAN.php index 501d76c21..8857d3464 100644 --- a/modules/banche/src/IBAN.php +++ b/modules/banche/src/IBAN.php @@ -155,7 +155,7 @@ class IBAN 'IE' => [ 'length' => 22, 'pattern' => '4c 14n', - 'structure' => 'IEkk aaaa bbbb bbcc cccc cc', + 'structure' => 'IEkk ssss bbbb bbcc cccc cc', ], 'IL' => [ 'length' => 23, diff --git a/modules/custom_fields/actions.php b/modules/custom_fields/actions.php index 9e29fd8a1..31eb20559 100755 --- a/modules/custom_fields/actions.php +++ b/modules/custom_fields/actions.php @@ -29,7 +29,7 @@ switch (post('op')) { 'id_plugin' => $plugin, 'name' => post('name'), 'html_name' => post('html_name'), - 'content' => post('content'), + 'content' => $_POST['content'], 'on_add' => post('on_add'), 'top' => post('top'), ], ['id' => $id_record]); @@ -46,7 +46,7 @@ switch (post('op')) { 'id_module' => $module, 'id_plugin' => $plugin, 'name' => post('name'), - 'content' => post('content'), + 'content' => $_POST['content'], 'html_name' => secure_random_string(8), ]); $id_record = $dbo->lastInsertedID(); diff --git a/modules/interventi/add.php b/modules/interventi/add.php index b6f1d2088..a2f7d5d09 100755 --- a/modules/interventi/add.php +++ b/modules/interventi/add.php @@ -218,6 +218,30 @@ echo ' '; + +$api_key = setting('Google Maps API key'); +$map_load_message = tr('Clicca per visualizzare'); + +if (!empty($api_key)) { + echo ' + +
+
+

'.tr('Posizione').'

+
+ +
+
+ +
+
+
+
'; +} + + $espandi_dettagli = setting('Espandi automaticamente la sezione "Dettagli aggiuntivi"'); echo ' @@ -443,6 +467,7 @@ echo ' var ordine = input("idordine"); var referente = input("idreferente"); var cliente_finale = input("idclientefinale"); + var autoload_mappa = false; $(document).ready(function() { if(!anagrafica.get()){ @@ -531,6 +556,8 @@ echo ' input("idcontratto").getElement() .selectSetNew(data.id_contratto, data.descrizione_contratto); } + + caricaMappa(data.lat, data.lng); } if (data !== undefined) { @@ -574,6 +601,8 @@ echo ' if (data) { input("idzona").set(data.idzona ? data.idzona : ""); // session_set("superselect,idzona", $(this).selectData().idzona, 0); + + caricaMappa(data.lat, data.lng); } }); @@ -727,4 +756,54 @@ echo ' $("#data_fine_ricorrenza").attr("required", false); } }); + + var marker = null; + var position = null; + var map = null; + var current_lat = null; + var current_lng = null; + + function caricaMappa(lat, lng) { + current_lat = lat; + current_lng = lng; + + if (!autoload_mappa){ + return false; + } + + const map_div = $("#map-edit"); + + if (input("idanagrafica").getData("select-options")) { + if (map === null) { + if (lat || lng) { + $.getScript("//maps.googleapis.com/maps/api/js?libraries=places&key='.$api_key.'", function() { + const map_element = map_div[0]; + position = new google.maps.LatLng(lat, lng); + + // Create a Google Maps native view under the map_canvas div. + map = new google.maps.Map(map_element, { + zoom: 14, + scrollwheel: false, + mapTypeControl: true, + mapTypeId: "roadmap", + mapTypeControlOptions: { + style: google.maps.MapTypeControlStyle.DROPDOWN_MENU, + mapTypeIds: ["roadmap", "terrain"], + } + }); + + map.setCenter(position); + marker = new google.maps.Marker({ + position: position, + map: map, + }); + }); + } + } else { + position = new google.maps.LatLng(lat, lng); + marker.setPosition(position); + map.setCenter(position); + } + } + } '; diff --git a/plugins/importFE/generate.php b/plugins/importFE/generate.php index f9e1509a3..bb7b17b4e 100755 --- a/plugins/importFE/generate.php +++ b/plugins/importFE/generate.php @@ -566,8 +566,8 @@ if (!empty($righe)) { echo '