Miglioramento Geolocalizzazione per Anagrafiche e Attività

This commit is contained in:
Dasc3er 2020-08-25 10:07:46 +02:00
parent 3781750895
commit 8e054472f2
5 changed files with 336 additions and 120 deletions

View File

@ -1,18 +1,13 @@
<?php <?php
use Modules\Anagrafiche\Anagrafica;
include_once __DIR__.'/../../core.php'; include_once __DIR__.'/../../core.php';
$is_fornitore = in_array($id_fornitore, $tipi_anagrafica); $is_fornitore = in_array($id_fornitore, $tipi_anagrafica);
$is_cliente = in_array($id_cliente, $tipi_anagrafica); $is_cliente = in_array($id_cliente, $tipi_anagrafica);
$is_tecnico = in_array($id_tecnico, $tipi_anagrafica); $is_tecnico = in_array($id_tecnico, $tipi_anagrafica);
$google = setting('Google Maps API key');
if (!empty($google)) {
echo '
<script src="//maps.googleapis.com/maps/api/js?libraries=places&key='.$google.'"></script>';
}
if (!$is_cliente && !$is_fornitore && $is_tecnico) { if (!$is_cliente && !$is_fornitore && $is_tecnico) {
$ignore = $dbo->fetchArray("SELECT id FROM zz_plugins WHERE name='Sedi' OR name='Referenti' OR name='Dichiarazioni d\'intento'"); $ignore = $dbo->fetchArray("SELECT id FROM zz_plugins WHERE name='Sedi' OR name='Referenti' OR name='Dichiarazioni d\'intento'");
@ -200,6 +195,16 @@ if (!$is_cliente) {
</div> </div>
<?php <?php
$sede_cliente = $anagrafica->sedeLegale;
$anagrafica_azienda = Anagrafica::find(setting('Azienda predefinita'));
$sede_azienda = $anagrafica_azienda->sedeLegale;
$google = setting('Google Maps API key');
if (!empty($google)) {
echo '
<script src="//maps.googleapis.com/maps/api/js?libraries=places&key='.$google.'"></script>';
}
echo ' echo '
<div class="col-md-4"> <div class="col-md-4">
@ -214,7 +219,7 @@ if (empty($google)) {
<div class="alert alert-info"> <div class="alert alert-info">
'.Modules::link('Impostazioni', $dbo->fetchOne("SELECT `id` FROM `zz_settings` WHERE nome='Google Maps API key'")['id'], tr('Per abilitare la visualizzazione delle anagrafiche nella mappa, inserire la Google Maps API Key nella scheda Impostazioni')).'. '.Modules::link('Impostazioni', $dbo->fetchOne("SELECT `id` FROM `zz_settings` WHERE nome='Google Maps API key'")['id'], tr('Per abilitare la visualizzazione delle anagrafiche nella mappa, inserire la Google Maps API Key nella scheda Impostazioni')).'.
</div>'; </div>';
} elseif (!empty($record['gaddress']) || (!empty($record['lat']) && !empty($record['lng']))) { } elseif (!empty($sede_cliente->gaddress) || (!empty($sede_cliente->lat) && !empty($sede_cliente->lng))) {
echo ' echo '
<div id="map-edit" style="height:200px; width:100%"></div> <div id="map-edit" style="height:200px; width:100%"></div>
@ -264,17 +269,46 @@ echo '
} }
function cercaGoogleMaps() { function cercaGoogleMaps() {
window.open("https://maps.google.com/maps/search/" + encodeURI( $("#indirizzo").val() )+", "+encodeURI( $("#citta").val() ) ); const indirizzo = getIndirizzoAnagrafica();
window.open("https://maps.google.com/maps/search/" + indirizzo);
} }
function calcolaPercorso() { function calcolaPercorso() {
window.open("https://maps.google.com/maps/dir/" + encodeURI( $("#indirizzo").val() )+", "+encodeURI( $("#citta").val() ) ); const indirizzo_partenza = getIndirizzoAzienda();
const indirizzo_destinazione = getIndirizzoAnagrafica();
window.open("https://maps.google.com/maps/dir/" + indirizzo_partenza + "/" + indirizzo_destinazione);
}
function getIndirizzoAzienda() {
const indirizzo = "'.$sede_azienda->indirizzo.'";
const citta = "'.$sede_azienda->citta.'";
const lat = parseFloat("'.$sede_azienda->lat.'");
const lng = parseFloat("'.$sede_azienda->lng.'");
const indirizzo_default = encodeURI(indirizzo) + "," + encodeURI(citta);
if (!lat || !lng) return indirizzo_default;
return lat + "," + lng;
}
function getIndirizzoAnagrafica() {
const indirizzo = $("#indirizzo").val();
const citta = $("#citta").val();
const lat = parseFloat("'.$sede_cliente->lat.'");
const lng = parseFloat("'.$sede_cliente->lng.'");
const indirizzo_default = encodeURI(indirizzo) + "," + encodeURI(citta);
if (!lat || !lng) return indirizzo_default;
return lat + "," + lng;
} }
$(document).ready(function() { $(document).ready(function() {
const map_element = $("#map-edit")[0]; const map_element = $("#map-edit")[0];
const lat = "'.$record['lat'].'"; const lat = parseFloat("'.$sede_cliente->lat.'");
const lng = "'.$record['lng'].'"; const lng = parseFloat("'.$sede_cliente->lng.'");
if (!lat || !lng) return; if (!lat || !lng) return;
const position = new google.maps.LatLng(lat, lng); const position = new google.maps.LatLng(lat, lng);
@ -291,7 +325,6 @@ echo '
} }
}); });
map.setCenter(position); map.setCenter(position);
const marker = new google.maps.Marker({ const marker = new google.maps.Marker({
position: position, position: position,

View File

@ -47,4 +47,9 @@ $("#geocomplete input").geocomplete({
$("#lat").val(result.geometry.location.lat()); $("#lat").val(result.geometry.location.lat());
$("#lng").val(result.geometry.location.lng()); $("#lng").val(result.geometry.location.lng());
}); });
// Ricaricamento della pagina alla chiusura
$("#modals > div button.close").on("click", function() {
location.reload();
});
</script>'; </script>';

View File

@ -274,6 +274,11 @@ class Anagrafica extends Model
return $this->belongsToMany(Tipo::class, 'an_tipianagrafiche_anagrafiche', 'idanagrafica', 'idtipoanagrafica'); return $this->belongsToMany(Tipo::class, 'an_tipianagrafiche_anagrafiche', 'idanagrafica', 'idtipoanagrafica');
} }
public function sedi()
{
return $this->hasMany(Sede::class, 'idanagrafica');
}
public function nazione() public function nazione()
{ {
return $this->belongsTo(Nazione::class, 'id_nazione'); return $this->belongsTo(Nazione::class, 'id_nazione');

View File

@ -0,0 +1,45 @@
<?php
namespace Modules\Anagrafiche;
use Common\Model;
class Sede extends Model
{
protected $table = 'an_sedi';
/**
* The attributes that aren't mass assignable.
*
* @var array
*/
protected $guarded = [];
/**
* Crea una nuova sede.
*
* @return self
*/
public static function build(Anagrafica $anagrafica, $is_sede_legale = false)
{
$model = parent::make();
if (!empty($is_sede_legale)) {
$model->nomesede = 'Sede legale';
}
$model->anagrafica()->associate($anagrafica);
$model->save();
return $model;
}
public function anagrafica()
{
return $this->belongsTo(Anagrafica::class, 'idanagrafica');
}
public function nazione()
{
return $this->belongsTo(Nazione::class, 'id_nazione');
}
}

View File

@ -1,84 +1,211 @@
<?php <?php
use Modules\Anagrafiche\Anagrafica;
use Modules\Anagrafiche\Sede;
include_once __DIR__.'/../../core.php'; include_once __DIR__.'/../../core.php';
$block_edit = $record['flag_completato']; $block_edit = $record['flag_completato'];
$module_anagrafiche = Modules::get('Anagrafiche'); $module_anagrafiche = Modules::get('Anagrafiche');
?><form action="" method="post" id="edit-form"> echo '
<form action="" method="post" id="edit-form">
<input type="hidden" name="op" value="update"> <input type="hidden" name="op" value="update">
<input type="hidden" name="backto" value="record-edit"> <input type="hidden" name="backto" value="record-edit">
<input type="hidden" name="id_record" value="<?php echo $id_record; ?>"> <input type="hidden" name="id_record" value="'.$id_record.'">
<div class="row">
<div class="col-md-8">
<!-- DATI CLIENTE --> <!-- DATI CLIENTE -->
<div class="panel panel-primary"> <div class="panel panel-primary">
<div class="panel-heading"> <div class="panel-heading">
<h3 class="panel-title"><?php echo tr('Dati cliente'); ?></h3> <h3 class="panel-title">'.tr('Dati cliente').'</h3>
</div> </div>
<div class="panel-body"> <div class="panel-body">
<!-- RIGA 1 --> <!-- RIGA 1 -->
<div class="row"> <div class="row">
<div class="col-md-3"> <div class="col-md-6">
<?php '.Modules::link('Anagrafiche', $record['idanagrafica'], null, null, 'class="pull-right"').'
echo Modules::link('Anagrafiche', $record['idanagrafica'], null, null, 'class="pull-right"'); {[ "type": "select", "label": "'.tr('Cliente').'", "name": "idanagrafica", "required": 1, "value": "$idanagrafica$", "ajax-source": "clienti", "readonly": "'.$record['flag_completato'].'" ]}
?>
{[ "type": "select", "label": "<?php echo tr('Cliente'); ?>", "name": "idanagrafica", "required": 1, "value": "$idanagrafica$", "ajax-source": "clienti", "readonly": "<?php echo $record['flag_completato']; ?>" ]}
</div> </div>
<?php
echo ' <div class="col-md-6">
<div class="col-md-3">
{[ "type": "select", "label": "'.tr('Sede destinazione').'", "name": "idsede_destinazione","value": "$idsede_destinazione$", "ajax-source": "sedi", "select-options": {"idanagrafica": '.$record['idanagrafica'].'}, "placeholder": "'.tr('Sede legale').'", "readonly": "'.$record['flag_completato'].'" ]} {[ "type": "select", "label": "'.tr('Sede destinazione').'", "name": "idsede_destinazione","value": "$idsede_destinazione$", "ajax-source": "sedi", "select-options": {"idanagrafica": '.$record['idanagrafica'].'}, "placeholder": "'.tr('Sede legale').'", "readonly": "'.$record['flag_completato'].'" ]}
</div>';
?>
<div class="col-md-3">
<?php
echo Modules::link('Anagrafiche', $record['idclientefinale'], null, null, 'class="pull-right"');
?>
{[ "type": "select", "label": "<?php echo tr('Per conto di'); ?>", "name": "idclientefinale", "value": "$idclientefinale$", "ajax-source": "clienti", "readonly": "<?php echo $record['flag_completato']; ?>" ]}
</div> </div>
<?php <div class="col-md-6">
echo ' '.Modules::link('Anagrafiche', $record['idclientefinale'], null, null, 'class="pull-right"').'
<div class="col-md-3"> {[ "type": "select", "label": "'.tr('Per conto di').'", "name": "idclientefinale", "value": "$idclientefinale$", "ajax-source": "clienti", "readonly": "'.$record['flag_completato'].'" ]}
</div>
<div class="col-md-6">
{[ "type": "select", "label": "'.tr('Referente').'", "name": "idreferente", "value": "$idreferente$", "ajax-source": "referenti", "select-options": {"idanagrafica": '.$record['idanagrafica'].'}, "readonly": "'.intval($record['flag_completato']).'" ]} {[ "type": "select", "label": "'.tr('Referente').'", "name": "idreferente", "value": "$idreferente$", "ajax-source": "referenti", "select-options": {"idanagrafica": '.$record['idanagrafica'].'}, "readonly": "'.intval($record['flag_completato']).'" ]}
</div>'; </div>
?>
</div> </div>
<!-- RIGA 2 --> <!-- RIGA 2 -->
<div class="row"> <div class="row">
<div class="col-md-6"> <div class="col-md-6">';
<?php
if (!empty($record['idpreventivo'])) { if (!empty($record['idpreventivo'])) {
echo ' echo '
'.Modules::link('Preventivi', $record['idpreventivo'], null, null, 'class="pull-right"'); '.Modules::link('Preventivi', $record['idpreventivo'], null, null, 'class="pull-right"');
} }
?> echo '
{[ "type": "select", "label": "'.tr('Preventivo').'", "name": "idpreventivo", "value": "$idpreventivo$", "ajax-source": "preventivi", "readonly": "'.$record['flag_completato'].'" ]}
{[ "type": "select", "label": "<?php echo tr('Preventivo'); ?>", "name": "idpreventivo", "value": "$idpreventivo$", "ajax-source": "preventivi", "readonly": "<?php echo $record['flag_completato']; ?>" ]}
</div> </div>
<div class="col-md-6"> <div class="col-md-6">';
<?php
$idcontratto_riga = $dbo->fetchOne('SELECT id FROM co_promemoria WHERE idintervento='.prepare($id_record))['id']; $idcontratto_riga = $dbo->fetchOne('SELECT id FROM co_promemoria WHERE idintervento='.prepare($id_record))['id'];
if (!empty($record['idcontratto'])) { if (!empty($record['idcontratto'])) {
echo ' echo '
'.Modules::link('Contratti', $record['idcontratto'], null, null, 'class="pull-right"'); '.Modules::link('Contratti', $record['idcontratto'], null, null, 'class="pull-right"');
} }
echo '
{[ "type": "select", "label": "'.tr('Contratto').'", "name": "idcontratto", "value": "'.$record['id_contratto'].'", "ajax-source": "contratti", "readonly": "'.$record['flag_completato'].'" ]}
<input type="hidden" name="idcontratto_riga" value="'.$idcontratto_riga.'">
</div>
</div>
</div>
</div>
</div>';
$anagrafica_cliente = $intervento->anagrafica;
$sede_cliente = $anagrafica_cliente->sedeLegale;
if (!empty($intervento->idsede_destinazione)) {
$sede_cliente = Sede::find($intervento->idsede_destinazione);
}
$anagrafica_azienda = Anagrafica::find(setting('Azienda predefinita'));
$sede_azienda = $anagrafica_azienda->sedeLegale;
$google = setting('Google Maps API key');
if (!empty($google)) {
echo '
<script src="//maps.googleapis.com/maps/api/js?libraries=places&key='.$google.'"></script>';
}
echo '
<div class="col-md-4">
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title"><i class="fa fa-map"></i> '.tr('Geolocalizzazione').'</h3>
</div>
<div class="panel-body">';
if (empty($google)) {
echo '
<div class="alert alert-info">
'.Modules::link('Impostazioni', $dbo->fetchOne("SELECT `id` FROM `zz_settings` WHERE nome='Google Maps API key'")['id'], tr('Per abilitare la visualizzazione delle anagrafiche nella mappa, inserire la Google Maps API Key nella scheda Impostazioni')).'.
</div>';
} elseif (!empty($sede_cliente->gaddress) || (!empty($sede_cliente->lat) && !empty($sede_cliente->lng))) {
echo '
<div id="map-edit" style="height:200px; width:100%"></div>
<div class="clearfix"></div>
<br>';
// Navigazione diretta verso l'indirizzo
echo '
<a class="btn btn-info btn-block" onclick="calcolaPercorso()">
<i class="fa fa-map-signs"></i> '.tr('Calcola percorso').'
</a>';
} else {
// Navigazione diretta verso l'indirizzo
echo '
<a class="btn btn-info btn-block" onclick="calcolaPercorso()">
<i class="fa fa-map-signs"></i> '.tr('Calcola percorso').'
</a>';
// Ricerca diretta su Google Maps
echo '
<a class="btn btn-info btn-block" onclick="cercaGoogleMaps()">
<i class="fa fa-map-marker"></i> '.tr('Cerca su Google Maps').'
</a>';
}
echo '
</div>
</div>
</div>
</div>
<script>
function modificaPosizione() {
openModal("'.tr('Modifica posizione').'", "'.$module->fileurl('modals/posizione.php').'?id_module='.$id_module.'&id_record='.$id_record.'");
}
function cercaGoogleMaps() {
const indirizzo = getIndirizzoAnagrafica();
window.open("https://maps.google.com/maps/search/" + indirizzo);
}
function calcolaPercorso() {
const indirizzo_partenza = getIndirizzoAzienda();
const indirizzo_destinazione = getIndirizzoAnagrafica();
window.open("https://maps.google.com/maps/dir/" + indirizzo_partenza + "/" + indirizzo_destinazione);
}
function getIndirizzoAzienda() {
const indirizzo = "'.$sede_azienda->indirizzo.'";
const citta = "'.$sede_azienda->citta.'";
const lat = parseFloat("'.$sede_azienda->lat.'");
const lng = parseFloat("'.$sede_azienda->lng.'");
const indirizzo_default = encodeURI(indirizzo) + "," + encodeURI(citta);
if (!lat || !lng) return indirizzo_default;
return lat + "," + lng;
}
function getIndirizzoAnagrafica() {
const indirizzo = "'.$sede_cliente->indirizzo.'";
const citta = "'.$sede_cliente->citta.'";
const lat = parseFloat("'.$sede_cliente->lat.'");
const lng = parseFloat("'.$sede_cliente->lng.'");
const indirizzo_default = encodeURI(indirizzo) + "," + encodeURI(citta);
if (!lat || !lng) return indirizzo_default;
return lat + "," + lng;
}
$(document).ready(function() {
const map_element = $("#map-edit")[0];
const lat = parseFloat("'.$sede_cliente->lat.'");
const lng = parseFloat("'.$sede_cliente->lng.'");
if (!lat || !lng) return;
const position = new google.maps.LatLng(lat, lng);
// Create a Google Maps native view under the map_canvas div.
const 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);
const marker = new google.maps.Marker({
position: position,
map: map,
});
});
</script>';
?> ?>
{[ "type": "select", "label": "<?php echo tr('Contratto'); ?>", "name": "idcontratto", "value": "<?php echo $record['id_contratto']; ?>", "ajax-source": "contratti", "readonly": "<?php echo $record['flag_completato']; ?>" ]}
<input type='hidden' name='idcontratto_riga' value='<?php echo $idcontratto_riga; ?>'>
</div>
</div>
</div>
</div>
<!-- DATI INTERVENTO --> <!-- DATI INTERVENTO -->
<div class="panel panel-primary"> <div class="panel panel-primary">
<div class="panel-heading"> <div class="panel-heading">
@ -145,6 +272,7 @@ echo '
</div> </div>
<?php <?php
// Visualizzo solo se l'anagrafica cliente è un ente pubblico // Visualizzo solo se l'anagrafica cliente è un ente pubblico
if (!empty($record['idcontratto'])) { if (!empty($record['idcontratto'])) {
$contratto = $dbo->fetchOne('SELECT num_item,codice_cig,codice_cup,id_documento_fe FROM co_contratti WHERE id = '.prepare($record['idcontratto'])); $contratto = $dbo->fetchOne('SELECT num_item,codice_cig,codice_cup,id_documento_fe FROM co_contratti WHERE id = '.prepare($record['idcontratto']));