diff --git a/modules/anagrafiche/bulk.php b/modules/anagrafiche/bulk.php index 37ab956a3..8373b2d58 100755 --- a/modules/anagrafiche/bulk.php +++ b/modules/anagrafiche/bulk.php @@ -53,59 +53,7 @@ switch (post('op')) { case 'ricerca-coordinate': foreach ($id_records as $id) { $anagrafica = Anagrafica::find($id); - if (!empty($anagrafica->sedeLegale->indirizzo) && !empty($anagrafica->sedeLegale->citta) && !empty($anagrafica->sedeLegale->provincia)) { - $indirizzo = urlencode($anagrafica->sedeLegale->indirizzo.', '.$anagrafica->sedeLegale->citta.', '.$anagrafica->sedeLegale->provincia); - - // TODO: da riscrivere con Guzzle e spostare su hook - if (!function_exists('curl_init')) { - // cURL non è attivo - flash()->error(tr('cURL non attivo, impossibile continuare l\'operazione.')); - - return false; - } else { - $ch = curl_init(); - } - $url = 'https://nominatim.openstreetmap.org/search.php?q='.$indirizzo.'&format=jsonv2&accept-language='.$lang; - $user_agent = 'traccar'; - curl_setopt($ch, CURLOPT_USERAGENT, $user_agent); - curl_setopt($ch, CURLOPT_URL, $url); - curl_setopt($ch, CURLOPT_HEADER, 0); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); - $data = json_decode(curl_exec($ch)); - curl_close($ch); - - // Salvataggio informazioni - $anagrafica->gaddress = $data[0]->display_name; - $anagrafica->lat = $data[0]->lat; - $anagrafica->lng = $data[0]->lon; - $anagrafica->save(); - } - } - - break; - - case 'ricerca-coordinate-google': - $curl = new CurlHttpAdapter(); - $geocoder = new GoogleMaps($curl, 'IT-it', null, true, $google); - - foreach ($id_records as $id) { - $anagrafica = Anagrafica::find($id); - if (empty($anagrafica->lat) && empty($anagrafica->lng) && !empty($anagrafica->sedeLegale->indirizzo) && !empty($anagrafica->sedeLegale->citta) && !empty($anagrafica->sedeLegale->cap)) { - $indirizzo = urlencode($anagrafica->sedeLegale->indirizzo.' '.$anagrafica->sedeLegale->citta.' '.$anagrafica->sedeLegale->cap); - - try { - // Ricerca indirizzo - $address = $geocoder->geocode($indirizzo)->first(); - $coordinates = $address->getCoordinates(); - - // Salvataggio informazioni - $anagrafica->lat = $coordinates->getLatitude(); - $anagrafica->lng = $coordinates->getLongitude(); - $anagrafica->save(); - } catch (Exception) { - flash()->error("Impossibile recuperare le coordinate dell'anagrafica ".$anagrafica->ragione_sociale." per l'indirizzo ".$anagrafica->sedeLegale->indirizzo.' '.$anagrafica->sedeLegale->citta.' '.$anagrafica->sedeLegale->cap); - } - } + $anagrafica->save(); } break; diff --git a/modules/anagrafiche/modutil.php b/modules/anagrafiche/modutil.php new file mode 100644 index 000000000..acef03adc --- /dev/null +++ b/modules/anagrafiche/modutil.php @@ -0,0 +1,89 @@ +. + */ + +use Modules\Anagrafiche\Anagrafica; + +if (!function_exists('geolocalizzazione')) { + function geolocalizzazione($id_record, $is_sede = false) + { + $dbo = database(); + + if( $is_sede ){ + $sede = $dbo->table('an_sedi')->where('id',$id_record)->first(); + + if (!empty($sede->indirizzo) && !empty($sede->citta) && !empty($sede->provincia) && empty($sede->lat) && empty($sede->lng)) { + $indirizzo = urlencode($sede->indirizzo.', '.$sede->citta.', '.$sede->provincia); + + // TODO: da riscrivere con Guzzle e spostare su hook + if (!function_exists('curl_init')) { + // cURL non è attivo + flash()->error(tr('cURL non attivo, impossibile continuare l\'operazione.')); + return false; + } else { + $ch = curl_init(); + } + $url = 'https://nominatim.openstreetmap.org/search.php?q='.$indirizzo.'&format=jsonv2&accept-language='.$lang; + $user_agent = 'traccar'; + curl_setopt($ch, CURLOPT_USERAGENT, $user_agent); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_HEADER, 0); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + $data = json_decode(curl_exec($ch)); + curl_close($ch); + + // Salvataggio informazioni + $dbo->update('an_sedi', [ + 'gaddress' => $data[0]->display_name, + 'lat' => $data[0]->lat, + 'lng' => $data[0]->lon, + ],['id' => $sede->id]); + } + }else{ + $anagrafica = Anagrafica::find($id_record); + if (!empty($anagrafica->sedeLegale->indirizzo) && !empty($anagrafica->sedeLegale->citta) && !empty($anagrafica->sedeLegale->provincia) && empty($anagrafica->lat) && empty($anagrafica->lng)) { + $indirizzo = urlencode($anagrafica->sedeLegale->indirizzo.', '.$anagrafica->sedeLegale->citta.', '.$anagrafica->sedeLegale->provincia); + + // TODO: da riscrivere con Guzzle e spostare su hook + if (!function_exists('curl_init')) { + // cURL non è attivo + flash()->error(tr('cURL non attivo, impossibile continuare l\'operazione.')); + return false; + } else { + $ch = curl_init(); + } + $url = 'https://nominatim.openstreetmap.org/search.php?q='.$indirizzo.'&format=jsonv2&accept-language='.$lang; + $user_agent = 'traccar'; + curl_setopt($ch, CURLOPT_USERAGENT, $user_agent); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_HEADER, 0); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + $data = json_decode(curl_exec($ch)); + curl_close($ch); + + // Salvataggio informazioni + $anagrafica->gaddress = $data[0]->display_name; + $anagrafica->lat = $data[0]->lat; + $anagrafica->lng = $data[0]->lon; + $anagrafica->save(); + } + } + + return true; + } +} \ No newline at end of file diff --git a/modules/anagrafiche/src/Anagrafica.php b/modules/anagrafiche/src/Anagrafica.php index 336577730..558abac2b 100755 --- a/modules/anagrafiche/src/Anagrafica.php +++ b/modules/anagrafiche/src/Anagrafica.php @@ -222,6 +222,10 @@ class Anagrafica extends Model { $this->fixRagioneSociale(); + if( setting('Geolocalizzazione automatica') ){ + $this->geolocalizzazione(); + } + return parent::save($options); } @@ -442,4 +446,47 @@ class Anagrafica extends Model } $this->aggiornaConto(); } + + protected function geolocalizzazione() + { + if (!empty($this->sedeLegale->indirizzo) && !empty($this->sedeLegale->citta) && !empty($this->sedeLegale->provincia)) { + $indirizzo = urlencode($this->sedeLegale->indirizzo.', '.$this->sedeLegale->citta.', '.$this->sedeLegale->provincia); + + if( setting('Gestore mappa')=='OpenStreetMap' ){ + // TODO: da riscrivere con Guzzle e spostare su hook + if (!function_exists('curl_init')) { + // cURL non è attivo + flash()->error(tr('cURL non attivo, impossibile continuare l\'operazione.')); + return false; + } else { + $ch = curl_init(); + } + $url = 'https://nominatim.openstreetmap.org/search.php?q='.$indirizzo.'&format=jsonv2&accept-language='.$lang; + $user_agent = 'traccar'; + curl_setopt($ch, CURLOPT_USERAGENT, $user_agent); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_HEADER, 0); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + $data = json_decode(curl_exec($ch)); + curl_close($ch); + + // Salvataggio informazioni + $this->gaddress = $data[0]->display_name; + $this->lat = $data[0]->lat; + $this->lng = $data[0]->lon; + }elseif( setting('Gestore mappa')=='Google Maps' ){ + $apiKey = setting('Google Maps API key per Tecnici'); + $url = "https://maps.googleapis.com/maps/api/geocode/json?address=".$indirizzo."&key=".$apiKey; + + $response = file_get_contents($url); + $data = json_decode($response, true); + + if ($data['status'] == 'OK') { + $this->lat = $data['results'][0]['geometry']['location']['lat']; + $this->lng = $data['results'][0]['geometry']['location']['lng']; + $this->gaddress = $data['results'][0]['formatted_address']; + } + } + } + } } diff --git a/modules/anagrafiche/src/Sede.php b/modules/anagrafiche/src/Sede.php index 268fc16f3..e26cd78ba 100644 --- a/modules/anagrafiche/src/Sede.php +++ b/modules/anagrafiche/src/Sede.php @@ -21,6 +21,8 @@ namespace Modules\Anagrafiche; use Common\SimpleModelTrait; use Illuminate\Database\Eloquent\Model; +use Geocoder\Provider\GoogleMaps; +use Ivory\HttpAdapter\CurlHttpAdapter; class Sede extends Model { @@ -67,6 +69,10 @@ class Sede extends Model { $this->fixRappresentanteFiscale(); + if( setting('Geolocalizzazione automatica') ){ + $this->geolocalizzazione(); + } + return parent::save($options); } @@ -84,4 +90,47 @@ class Sede extends Model $this->attributes['is_rappresentante_fiscale'] = $rappresentante_fiscale; } } + + protected function geolocalizzazione() + { + if (!empty($this->indirizzo) && !empty($this->citta) && !empty($this->provincia) && empty($this->gaddress)) { + $indirizzo = urlencode($this->indirizzo.', '.$this->citta.', '.$this->provincia); + + if( setting('Gestore mappa')=='OpenStreetMap' ){ + // TODO: da riscrivere con Guzzle e spostare su hook + if (!function_exists('curl_init')) { + // cURL non è attivo + flash()->error(tr('cURL non attivo, impossibile continuare l\'operazione.')); + return false; + } else { + $ch = curl_init(); + } + $url = 'https://nominatim.openstreetmap.org/search.php?q='.$indirizzo.'&format=jsonv2&accept-language='.$lang; + $user_agent = 'traccar'; + curl_setopt($ch, CURLOPT_USERAGENT, $user_agent); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_HEADER, 0); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + $data = json_decode(curl_exec($ch)); + curl_close($ch); + + // Salvataggio informazioni + $this->gaddress = $data[0]->display_name; + $this->lat = $data[0]->lat; + $this->lng = $data[0]->lon; + }elseif( setting('Gestore mappa')=='Google Maps' ){ + $curl = new CurlHttpAdapter(); + $geocoder = new GoogleMaps($curl, 'IT-it', null, true, $google); + + // Ricerca indirizzo + $address = $geocoder->geocode($indirizzo)->first(); + $coordinates = $address->getCoordinates(); + + // Salvataggio informazioni + $this->gaddress = $data[0]->display_name; + $this->lat = $coordinates->getLatitude(); + $this->lng = $coordinates->getLongitude(); + } + } + } } diff --git a/plugins/sedi/actions.php b/plugins/sedi/actions.php index 89de60e7a..9db0729b0 100755 --- a/plugins/sedi/actions.php +++ b/plugins/sedi/actions.php @@ -27,29 +27,29 @@ switch ($operazione) { case 'addsede': if (!empty(post('nomesede'))) { $opt_out_newsletter = post('disable_newsletter_add'); - $dbo->insert('an_sedi', [ - 'idanagrafica' => $id_parent, - 'nomesede' => post('nomesede'), - 'indirizzo' => post('indirizzo'), - 'citta' => post('citta'), - 'cap' => post('cap'), - 'provincia' => strtoupper(post('provincia')), - 'km' => post('km'), - 'id_nazione' => !empty(post('id_nazione')) ? post('id_nazione') : null, - 'idzona' => !empty(post('idzona')) ? post('idzona') : 0, - 'cellulare' => post('cellulare'), - 'telefono' => post('telefono'), - 'email' => post('email'), - 'enable_newsletter' => empty($opt_out_newsletter), - 'codice_destinatario' => post('codice_destinatario'), - 'is_automezzo' => post('is_automezzo_add'), - 'is_rappresentante_fiscale' => post('is_rappresentante_fiscale_add'), - 'targa' => post('targa'), - 'nome' => post('nome'), - 'descrizione' => post('descrizione'), - ]); + $sede = Sede::build(Anagrafica::find($id_parent)); + + $sede->nomesede = post('nomesede'); + $sede->indirizzo = post('indirizzo'); + $sede->citta = post('citta'); + $sede->cap = post('cap'); + $sede->provincia = strtoupper(post('provincia')); + $sede->km = post('km'); + $sede->id_nazione = !empty(post('id_nazione')) ? post('id_nazione') : null; + $sede->idzona = !empty(post('idzona')) ? post('idzona') : 0; + $sede->cellulare = post('cellulare'); + $sede->telefono = post('telefono'); + $sede->email = post('email'); + $sede->enable_newsletter = empty($opt_out_newsletter); + $sede->codice_destinatario = post('codice_destinatario'); + $sede->is_automezzo = post('is_automezzo'); + $sede->is_rappresentante_fiscale = post('is_rappresentante_fiscale'); + $sede->targa = post('targa'); + $sede->nome = post('nome'); + $sede->descrizione = post('descrizione'); + $sede->save(); - $id_record = $dbo->lastInsertedID(); + $id_record = $sede->id; $id_referenti = (array) post('id_referenti'); foreach ($id_referenti as $id_referente) { @@ -78,32 +78,28 @@ switch ($operazione) { $opt_out_newsletter = post('disable_newsletter'); $sede = Sede::find($id_record); - $dbo->update('an_sedi', [ - 'nomesede' => post('nomesede'), - 'indirizzo' => post('indirizzo'), - 'citta' => post('citta'), - 'cap' => post('cap'), - 'provincia' => strtoupper(post('provincia')), - 'id_nazione' => !empty(post('id_nazione')) ? post('id_nazione') : null, - 'telefono' => post('telefono'), - 'cellulare' => post('cellulare'), - 'email' => post('email'), - 'enable_newsletter' => empty($opt_out_newsletter), - 'codice_destinatario' => post('codice_destinatario'), - 'is_rappresentante_fiscale' => post('is_rappresentante_fiscale'), - 'piva' => post('piva'), - 'codice_fiscale' => post('codice_fiscale'), - 'is_automezzo' => post('is_automezzo'), - 'idzona' => post('idzona'), - 'km' => post('km'), - 'note' => post('note'), - 'gaddress' => post('gaddress'), - 'lat' => post('lat'), - 'lng' => post('lng'), - 'targa' => post('targa'), - 'nome' => post('nome'), - 'descrizione' => post('descrizione'), - ], ['id' => $id_record]); + $sede->nomesede = post('nomesede'); + $sede->indirizzo = post('indirizzo'); + $sede->citta = post('citta'); + $sede->cap = post('cap'); + $sede->provincia = strtoupper(post('provincia')); + $sede->km = post('km'); + $sede->id_nazione = !empty(post('id_nazione')) ? post('id_nazione') : null; + $sede->idzona = !empty(post('idzona')) ? post('idzona') : 0; + $sede->cellulare = post('cellulare'); + $sede->telefono = post('telefono'); + $sede->email = post('email'); + $sede->enable_newsletter = empty($opt_out_newsletter); + $sede->codice_destinatario = post('codice_destinatario'); + $sede->is_automezzo = post('is_automezzo'); + $sede->is_rappresentante_fiscale = post('is_rappresentante_fiscale'); + $sede->targa = post('targa'); + $sede->nome = post('nome'); + $sede->descrizione = post('descrizione'); + $sede->gaddress = post('gaddress'); + $sede->lat = post('lat'); + $sede->lng = post('lng'); + $sede->save(); $referenti = $dbo->fetchArray('SELECT id FROM an_referenti WHERE idsede = '.$id_record); $id_referenti = (array) post('id_referenti'); diff --git a/update/2_5_4.sql b/update/2_5_4.sql index 27dabc95c..ef628f845 100644 --- a/update/2_5_4.sql +++ b/update/2_5_4.sql @@ -52,4 +52,13 @@ HAVING 2=2 ORDER BY `data` DESC, - CAST(`numero_esterno` AS UNSIGNED) DESC" WHERE `zz_modules`.`name` = 'Ordini cliente'; \ No newline at end of file + CAST(`numero_esterno` AS UNSIGNED) DESC" WHERE `zz_modules`.`name` = 'Ordini cliente'; + +-- Geolocalizzazione automatica +INSERT INTO `zz_settings` (`id`, `nome`, `valore`, `tipo`, `editable`, `sezione`, `order`) VALUES +(NULL, 'Geolocalizzazione automatica', '1', 'boolean', '1', 'Anagrafiche', NULL), +(NULL, 'Gestore mappa', 'Google Maps', 'list[Google Maps, OpenStreetMap]', '1', 'Generale', NULL); + +INSERT INTO `zz_settings_lang` (`id`, `id_lang`, `id_record`, `title`, `help`) VALUES (NULL, '1', (SELECT `zz_settings`.`id` FROM `zz_settings` WHERE `zz_settings`.`nome` = 'Geolocalizzazione automatica'), 'Geolocalizzazione automatica', ''); + +INSERT INTO `zz_settings_lang` (`id`, `id_lang`, `id_record`, `title`, `help`) VALUES (NULL, '1', (SELECT `zz_settings`.`id` FROM `zz_settings` WHERE `zz_settings`.`nome` = 'Gestore mappa'), 'Gestore mappa', ''); \ No newline at end of file