diff --git a/ems-core/src/main/java/it/integry/ems/controller/MapController.java b/ems-core/src/main/java/it/integry/ems/controller/MapController.java deleted file mode 100644 index 13c555f751..0000000000 --- a/ems-core/src/main/java/it/integry/ems/controller/MapController.java +++ /dev/null @@ -1,44 +0,0 @@ -package it.integry.ems.controller; - -import it.integry.ems.response.ServiceRestResponse; -import it.integry.ems.service.MapService; -import it.integry.ems_model.config.EmsRestConstants; -import it.integry.ems_model.types.LatLng; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Scope; -import org.springframework.web.bind.annotation.*; - -import javax.servlet.http.HttpServletRequest; - - -@RestController -@Scope("request") -public class MapController { - - - private final Logger logger = LogManager.getLogger(); - - @Autowired - private MapService mapService; - - - @RequestMapping(value = EmsRestConstants.PATH_MAP_GETCOORDINATE_BY_CITY, method = RequestMethod.GET) - public @ResponseBody - ServiceRestResponse getCoordinateByCity(HttpServletRequest request, - @RequestParam String cityName) { - ServiceRestResponse resp; - try { - LatLng coordinates = mapService.getCoordinateByCity(cityName); - resp = ServiceRestResponse.createPositiveResponse(coordinates); - } catch (Exception e) { - logger.error(request.getRequestURI(), e); - resp = ServiceRestResponse.createNegativeResponse(); - } - - return resp; - } - - -} diff --git a/ems-core/src/main/java/it/integry/ems/service/MapService.java b/ems-core/src/main/java/it/integry/ems/service/MapService.java deleted file mode 100644 index 61a4ae8240..0000000000 --- a/ems-core/src/main/java/it/integry/ems/service/MapService.java +++ /dev/null @@ -1,110 +0,0 @@ -package it.integry.ems.service; - -import com.google.maps.GeoApiContext; -import com.google.maps.GeocodingApi; -import com.google.maps.model.AddressComponent; -import com.google.maps.model.AddressComponentType; -import com.google.maps.model.GeocodingResult; -import com.google.maps.model.Geometry; -import it.integry.ems_model.types.LatLng; -import it.integry.ems_model.utility.dto.IndirizzoDTO; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.math.BigDecimal; -import java.util.Arrays; -import java.util.List; - -@Service -public class MapService { - @Autowired - private KeyManagerService keyManagerService; - - public LatLng getCoordinateByCity(String cityName) throws Exception { - GeoApiContext context = new GeoApiContext.Builder() - .apiKey(getApiKey()) - .build(); - GeocodingResult[] results = GeocodingApi.geocode(context, cityName).await(); - - if (results != null && results.length > 0) { - Geometry geometry = results[0].geometry; - - LatLng latLngIntegry = new LatLng(); - latLngIntegry.set(new BigDecimal(geometry.location.lat), new BigDecimal(geometry.location.lng)); - - return latLngIntegry; - } - - return null; - } - - - public IndirizzoDTO geocode(String address) throws Exception { - GeoApiContext gtx = new GeoApiContext.Builder().apiKey(getApiKey()).build(); - GeocodingResult[] results = GeocodingApi.geocode(gtx, address).await(); - - return geocodeToDto(results); - } - - /** - * @param results - * @return - * @throws Exception - */ - public IndirizzoDTO geocodeToDto(GeocodingResult[] results) throws Exception { - if (results.length > 0) { - IndirizzoDTO indirizzoDTO = new IndirizzoDTO(); - for (AddressComponent component : results[0].addressComponents) { - List types = Arrays.asList(component.types); - if (types.contains(AddressComponentType.ROUTE)) { - indirizzoDTO.setVia(component.longName.toUpperCase()); - } else if (types.contains(AddressComponentType.STREET_NUMBER)) { - indirizzoDTO.setNumeroCivico(component.longName.toUpperCase()); - } else if (types.contains(AddressComponentType.COUNTRY)) { - indirizzoDTO.setNazione(component.shortName.toUpperCase()); - } else if (types.contains(AddressComponentType.ADMINISTRATIVE_AREA_LEVEL_2)) { - indirizzoDTO.setProv(component.shortName.toUpperCase()); - } else if (types.contains(AddressComponentType.ADMINISTRATIVE_AREA_LEVEL_3) || types.contains(AddressComponentType.LOCALITY)) { // LOCALITY - indirizzoDTO.setCitta(component.longName.toUpperCase()); - } else if (types.contains(AddressComponentType.POSTAL_CODE)) { - indirizzoDTO.setCap(component.longName.toUpperCase()); - } - } - - if (indirizzoDTO.getVia() != null) { - String indirizzo = indirizzoDTO.getVia(); - if (indirizzoDTO.getNumeroCivico() != null) { - indirizzo += ", " + indirizzoDTO.getNumeroCivico(); - } - indirizzoDTO.setIndirizzo(indirizzo); - } - - indirizzoDTO.setLat(BigDecimal.valueOf(results[0].geometry.location.lat)); - indirizzoDTO.setLng(BigDecimal.valueOf(results[0].geometry.location.lng)); - - // String address = (results[0].formattedAddress); - return indirizzoDTO; - } - return null; - } - - /** - * @param lat - * @param lng - * @return - * @throws Exception - */ - public IndirizzoDTO reverseGeocode(double lat, double lng) throws Exception { - GeoApiContext gtx = new GeoApiContext.Builder().apiKey(getApiKey()).build(); - com.google.maps.model.LatLng coords = new com.google.maps.model.LatLng(); - coords.lat = lat; - coords.lng = lng; - GeocodingResult[] results = GeocodingApi.reverseGeocode(gtx, coords).await(); - return geocodeToDto(results); - } - - - private String getApiKey() throws Exception { - return keyManagerService.getGmapsApiKey(); - } -} diff --git a/ems-core/src/main/java/it/integry/ems/service/comuni/controller/ComuniController.java b/ems-core/src/main/java/it/integry/ems/service/comuni/controller/ComuniController.java new file mode 100644 index 0000000000..cc260379f0 --- /dev/null +++ b/ems-core/src/main/java/it/integry/ems/service/comuni/controller/ComuniController.java @@ -0,0 +1,62 @@ +package it.integry.ems.service.comuni.controller; + +import it.integry.common.var.CommonConstants; +import it.integry.ems.response.ServiceRestResponse; +import it.integry.ems.service.comuni.base.CapCittaProv; +import it.integry.ems.service.comuni.dto.SavePositionRequestDTO; +import it.integry.ems.service.comuni.entities.Comune; +import it.integry.ems.service.comuni.exceptions.ComuniException; +import it.integry.ems.service.comuni.service.ComuniService; +import it.integry.ems_model.utility.UtilityString; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import java.util.List; + +@RestController +@Scope("request") +public class ComuniController { + + @Autowired + private ComuniService comuniService; + + @PostMapping(value = "savePosition") + public ServiceRestResponse savePosition(@RequestParam(CommonConstants.PROFILE_DB) String config, + @RequestBody SavePositionRequestDTO request) throws Exception { + + return ServiceRestResponse.createPositiveResponse(comuniService.savePosition(request)); + } + + @PostMapping(value = "infoComuni") + public ServiceRestResponse getInfoComuni(@RequestParam(required = false) String nome, + @RequestParam(required = false) String cap, + @RequestParam(required = false) String codiceCatastale, + @RequestParam(required = false) String indirizzo, + @RequestParam(required = false) String prov, + @RequestParam(required = false) String regione) throws ComuniException { + + List filteredComuni = comuniService.filterComuni(nome, codiceCatastale, prov, regione); + if (!UtilityString.isNullOrEmpty(indirizzo) || !UtilityString.isNullOrEmpty(cap)) { + filteredComuni = comuniService.filterIndirizzo(filteredComuni, cap, indirizzo); + } + + return ServiceRestResponse.createPositiveResponse(filteredComuni); + } + + @PostMapping(value = "capCittaProv") + public ServiceRestResponse getCapCittaProv(@RequestParam(required = false) String nome, + @RequestParam(required = false) String cap, + @RequestParam(required = false) String prov) throws Exception { + + return ServiceRestResponse.createPositiveResponse(comuniService.getCapCittaProv(nome, cap, prov)); + } + + @PostMapping(value = "searchComuni") + public ServiceRestResponse searchComuni(@RequestParam() String q, + @RequestParam(required = false) Integer limit) { + + return ServiceRestResponse.createPositiveResponse(comuniService.searchComuni(q, limit)); + } +} diff --git a/ems-core/src/main/java/it/integry/ems/service/comuni/dto/SavePositionRequestDTO.java b/ems-core/src/main/java/it/integry/ems/service/comuni/dto/SavePositionRequestDTO.java new file mode 100644 index 0000000000..04bc8bc5d9 --- /dev/null +++ b/ems-core/src/main/java/it/integry/ems/service/comuni/dto/SavePositionRequestDTO.java @@ -0,0 +1,86 @@ +package it.integry.ems.service.comuni.dto; + +public class SavePositionRequestDTO { + + private String descrizione; + private String citta; + private String indirizzo; + private String cap; + private String prov; + private String nazione; + + private double lat; + private double lng; + + public String getDescrizione() { + return descrizione; + } + + public SavePositionRequestDTO setDescrizione(String descrizione) { + this.descrizione = descrizione; + return this; + } + + public String getCitta() { + return citta; + } + + public SavePositionRequestDTO setCitta(String citta) { + this.citta = citta; + return this; + } + + public String getIndirizzo() { + return indirizzo; + } + + public SavePositionRequestDTO setIndirizzo(String indirizzo) { + this.indirizzo = indirizzo; + return this; + } + + public String getCap() { + return cap; + } + + public SavePositionRequestDTO setCap(String cap) { + this.cap = cap; + return this; + } + + public String getProv() { + return prov; + } + + public SavePositionRequestDTO setProv(String prov) { + this.prov = prov; + return this; + } + + public String getNazione() { + return nazione; + } + + public SavePositionRequestDTO setNazione(String nazione) { + this.nazione = nazione; + return this; + } + + public double getLat() { + return lat; + } + + public SavePositionRequestDTO setLat(double lat) { + this.lat = lat; + return this; + } + + public double getLng() { + return lng; + } + + public SavePositionRequestDTO setLng(double lng) { + this.lng = lng; + return this; + } +} diff --git a/ems-core/src/main/java/it/integry/ems/service/comuni/service/ComuniService.java b/ems-core/src/main/java/it/integry/ems/service/comuni/service/ComuniService.java index 53852965ed..75b38ab59a 100644 --- a/ems-core/src/main/java/it/integry/ems/service/comuni/service/ComuniService.java +++ b/ems-core/src/main/java/it/integry/ems/service/comuni/service/ComuniService.java @@ -1,43 +1,68 @@ package it.integry.ems.service.comuni.service; -import it.integry.ems.service.MapService; +import it.integry.ems.service.EntityProcessor; +import it.integry.ems.service.comuni.dto.SavePositionRequestDTO; +import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager; +import it.integry.ems_model.entity.StbPosizioni; +import it.integry.ems_model.types.OperationType; +import it.integry.googleCloudApi.service.GeocodingService; import it.integry.ems.service.comuni.base.CapCittaProv; import it.integry.ems.service.comuni.base.ComuniSearchableFields; import it.integry.ems.service.comuni.entities.Comune; import it.integry.ems.service.comuni.exceptions.ComuniException; import it.integry.ems_model.utility.UtilityString; -import it.integry.ems_model.utility.dto.IndirizzoDTO; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; +import it.integry.googleCloudApi.dto.IndirizzoDTO; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; +import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @Service +@Scope("request") public class ComuniService { @Autowired - private MapService mapService; + private GeocodingService geocodingService; @Autowired private UnitaTerritorialiService unitaTerritorialiService; - private Logger logger = LogManager.getLogger(); + @Autowired + private EntityProcessor entityProcessor; + @Autowired + private MultiDBTransactionManager multiDBTransactionManager; public List getComuni() { return unitaTerritorialiService.getComuni(); } + public StbPosizioni savePosition(SavePositionRequestDTO savePositionRequestDTO) throws Exception { + StbPosizioni position = new StbPosizioni() + .setCitta(savePositionRequestDTO.getCitta()) + .setIndirizzo(savePositionRequestDTO.getIndirizzo()) + .setProv(savePositionRequestDTO.getProv()) + .setCap(savePositionRequestDTO.getCap()) + .setNazione(savePositionRequestDTO.getNazione()) + .setLat(BigDecimal.valueOf(savePositionRequestDTO.getLat())) + .setLng(BigDecimal.valueOf(savePositionRequestDTO.getLng())); + + position.setOperation(OperationType.INSERT); + entityProcessor.processEntity(position, multiDBTransactionManager); + + position.setOperation(OperationType.SELECT_OBJECT); + return position; + } + /** * Metodo che filtra l'intera lista dei comuni corrispondenti ai parametri specificati * * @param nome Nome del comune - * @param cap Codice Avviamento Postale * @param codiceCatastale Codice Catastale * @param prov Provincia * @param regione Regione @@ -48,7 +73,6 @@ public class ComuniService { List comuni = unitaTerritorialiService.getComuni(); comuni = this.filterComuniByAttribute(ComuniSearchableFields.NOME, nome, comuni); -// comuni = this.filterComuniByAttribute(ComuniSearchableFields.CAP, cap, comuni); comuni = this.filterComuniByAttribute(ComuniSearchableFields.CODICE_CATASTALE, codiceCatastale, comuni); comuni = this.filterComuniByAttribute(ComuniSearchableFields.PROVINCIA, prov, comuni); comuni = this.filterComuniByAttribute(ComuniSearchableFields.REGIONE, regione, comuni); @@ -64,7 +88,16 @@ public class ComuniService { } } - /**/ + /** + * Metodo che restituisce un oggetto {@link CapCittaProv} contenente le informazioni di CAP, Città e Provincia + * filtrando i comuni in base ai parametri specificati. + * + * @param nome Nome del comune + * @param cap Codice di Avviamento Postale + * @param prov Sigla della provincia + * @return Un oggetto {@link CapCittaProv} con le informazioni richieste + * @throws Exception se si verifica un errore durante il recupero dei dati + */ public CapCittaProv getCapCittaProv(String nome, String cap, String prov) throws Exception { CapCittaProv comune = new CapCittaProv(); @@ -87,7 +120,7 @@ public class ComuniService { for (Comune result : resultList) { provFound = result.getSigla(); cittaFound = result.getNome(); - if (result.getCap().size() != 0){ + if (!result.getCap().isEmpty()){ capFound = result.getCap().get(0); } comune.setProv(provFound); @@ -103,10 +136,10 @@ public class ComuniService { } public List filterIndirizzo(List comuni, String cap, String indirizzo) throws ComuniException { - List result = new ArrayList(); + List result = new ArrayList<>(); try { if (!UtilityString.isNullOrEmpty(cap)) { - IndirizzoDTO indirizzoDTO = mapService.geocode(cap); + IndirizzoDTO indirizzoDTO = geocodingService.geocode(cap); if (indirizzoDTO == null) { comuni.clear(); @@ -130,7 +163,7 @@ public class ComuniService { String _nome = UtilityString.blankIfNull(comune.getNome()); String _prov = UtilityString.blankIfNull(comune.getSigla()); String rawAddress = indirizzo + " " + _nome + " " + _prov; - IndirizzoDTO indirizzoDTO = mapService.geocode(rawAddress); + IndirizzoDTO indirizzoDTO = geocodingService.geocode(rawAddress); if (indirizzoDTO != null) { String _cap = indirizzoDTO.getCap(); if (_cap != null) { @@ -210,7 +243,7 @@ public class ComuniService { * @return Lista dei comuni corrispondenti */ public List searchComuni(String qs, Integer limit) { - List result = new ArrayList(); + List result = new ArrayList<>(); if (!UtilityString.isNullOrEmpty(qs)) { List listComuni = unitaTerritorialiService.getComuni(); diff --git a/ems-core/src/main/java/it/integry/ems_model/config/EmsRestConstants.java b/ems-core/src/main/java/it/integry/ems_model/config/EmsRestConstants.java index e6a4407e04..aaf307f998 100644 --- a/ems-core/src/main/java/it/integry/ems_model/config/EmsRestConstants.java +++ b/ems-core/src/main/java/it/integry/ems_model/config/EmsRestConstants.java @@ -425,8 +425,6 @@ public class EmsRestConstants { public static final String PATH_UPDATE_MTB_MOVI_NUM_MOV = PATH + "updateMtbMoviNumMov"; public static final String PATH_SET_COORDINATE_GEO_CLIE = PATH + "setCoodinateGeoClie"; public static final String PATH_MIGRATE_GEOLOCATION_FOR_RLAVR = PATH + "migrateGeolocationForRlavr"; - public static final String PATH_REVERSE_GEOCODE = PATH + "reverseGeocode"; - public static final String PATH_GET_POSITION_FROM_COORDS = PATH + "getPositionFromCoords"; public static final String PATH_GET_RICORRENZE = PATH + "getRicorrenze"; public static final String PATH_IMPORT_PRESENZE = PATH + "importPresenze"; public static final String PATH_SAVE_TRANSACTION_FARMMES = PATH + "saveTransactionFarmmes"; @@ -494,7 +492,6 @@ public class EmsRestConstants { public static final String PATH_EXPORT_FATTURE_FPX = PATH + "exportFattureFpx"; public static final String PATH_EXPORT_EMAIL_FPX = PATH + "exportEmailFpx"; public static final String PATH_READ_FPX_INBOX = PATH + "readFpxInbox"; - public static final String PATH_GEOCODE = PATH + "geocode"; public static final String PATH_GIACENZA_ISTANTANEA = PATH + "giacenzaIstantanea"; public static final String PATH_GIACENZA_ARTICOLI_DA_BANCALE = PATH + "giacenzaArticoliBancale"; public static final String PATH_RETTIFICA_INV_MAG = PATH + "rettificaInvMag"; @@ -514,11 +511,6 @@ public class EmsRestConstants { public static final String PATH_LOG_SOAP_SERVICES = PATH + "logSoapServices"; - //MAP - public static final String PATH_EXPORT_LAYER_MAP = PATH + "exportLayerMap"; - public static final String PATH_MAP_GETCOORDINATE_BY_ADDRESS = PATH + "map/getCoordinatesByAddress"; - public static final String PATH_MAP_GETCOORDINATE_BY_CITY = PATH + "map/getCoordinatesByCity"; - //WMS SERVICES public static final String PATH_EXPORT_ART_DIALOGO = PATH + "exportArtDialogo"; private static final String USERNAME_LOGIN = "ADMINREST"; diff --git a/ems-core/src/main/java/it/integry/googleCloudApi/controller/GeocodingController.java b/ems-core/src/main/java/it/integry/googleCloudApi/controller/GeocodingController.java new file mode 100644 index 0000000000..2e1718d1ba --- /dev/null +++ b/ems-core/src/main/java/it/integry/googleCloudApi/controller/GeocodingController.java @@ -0,0 +1,47 @@ +package it.integry.googleCloudApi.controller; + +import it.integry.common.var.CommonConstants; +import it.integry.ems.response.ServiceRestResponse; +import it.integry.googleCloudApi.service.GeocodingService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.web.bind.annotation.*; + +import java.math.BigDecimal; + +@RestController +@Scope("request") +public class GeocodingController { + + @Autowired + private GeocodingService geocodingService; + + @GetMapping(value = "geocode") + public ServiceRestResponse geocode(@RequestParam("address") String address) throws Exception { + + return ServiceRestResponse.createPositiveResponse(geocodingService.geocode(address)); + } + + @GetMapping(value = "reverseGeocode") + public ServiceRestResponse reverseGeocode(@RequestParam(CommonConstants.PROFILE_DB) String configuration, + @RequestParam BigDecimal lat, + @RequestParam BigDecimal lng) throws Exception { + + return ServiceRestResponse.createPositiveResponse(geocodingService.reverseGeocode(lat.doubleValue(), lng.doubleValue())); + } + + @GetMapping(value = "getPositionFromCoords") + public ServiceRestResponse getPositionFromCoords(@RequestParam(CommonConstants.PROFILE_DB) String configuration, + @RequestParam BigDecimal lat, + @RequestParam BigDecimal lng) throws Exception { + + return ServiceRestResponse.createPositiveResponse(geocodingService.getPositionFromCoords(lat, lng)); + } + + @GetMapping(value = "map/getCoordinatesByCity") + public ServiceRestResponse getCoordinateByCity(@RequestParam String cityName) throws Exception { + + return ServiceRestResponse.createPositiveResponse(geocodingService.getCoordinateByCity(cityName)); + } + +} diff --git a/ems-core/src/main/java/it/integry/googleCloudApi/controller/PlacesController.java b/ems-core/src/main/java/it/integry/googleCloudApi/controller/PlacesController.java new file mode 100644 index 0000000000..2b23282f1b --- /dev/null +++ b/ems-core/src/main/java/it/integry/googleCloudApi/controller/PlacesController.java @@ -0,0 +1,34 @@ +package it.integry.googleCloudApi.controller; + +import it.integry.ems.response.ServiceRestResponse; +import it.integry.googleCloudApi.service.PlacesService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@Scope("request") +@RequestMapping("/google/places") +public class PlacesController { + + @Autowired + private PlacesService placesService; + + @GetMapping(value = "autoCompleteAddress") + public ServiceRestResponse autoCompleteAddress(@RequestParam String address, + @RequestParam String language, + @RequestParam String uuid) throws Exception { + + return ServiceRestResponse.createPositiveResponse(placesService.autoCompleteAddress(address, language, uuid)); + } + + @GetMapping(value = "placeDetails") + public ServiceRestResponse placeDetails(@RequestParam String placeId, + @RequestParam String uuid) throws Exception { + + return ServiceRestResponse.createPositiveResponse(placesService.placeDetails(placeId, uuid)); + } +} diff --git a/ems-core/src/main/java/it/integry/googleCloudApi/dto/AutoCompleteAddressDTO.java b/ems-core/src/main/java/it/integry/googleCloudApi/dto/AutoCompleteAddressDTO.java new file mode 100644 index 0000000000..780a2ee40e --- /dev/null +++ b/ems-core/src/main/java/it/integry/googleCloudApi/dto/AutoCompleteAddressDTO.java @@ -0,0 +1,25 @@ +package it.integry.googleCloudApi.dto; + +public class AutoCompleteAddressDTO { + + private String description; + private String placeId; + + public String getDescription() { + return description; + } + + public AutoCompleteAddressDTO setDescription(String description) { + this.description = description; + return this; + } + + public String getPlaceId() { + return placeId; + } + + public AutoCompleteAddressDTO setPlaceId(String placeId) { + this.placeId = placeId; + return this; + } +} diff --git a/ems-core/src/main/java/it/integry/ems_model/utility/dto/IndirizzoDTO.java b/ems-core/src/main/java/it/integry/googleCloudApi/dto/IndirizzoDTO.java similarity index 53% rename from ems-core/src/main/java/it/integry/ems_model/utility/dto/IndirizzoDTO.java rename to ems-core/src/main/java/it/integry/googleCloudApi/dto/IndirizzoDTO.java index ee7fec0dac..8fe02e8edb 100644 --- a/ems-core/src/main/java/it/integry/ems_model/utility/dto/IndirizzoDTO.java +++ b/ems-core/src/main/java/it/integry/googleCloudApi/dto/IndirizzoDTO.java @@ -1,18 +1,18 @@ -package it.integry.ems_model.utility.dto; +package it.integry.googleCloudApi.dto; import java.math.BigDecimal; public class IndirizzoDTO { - public Long idPosizione; - public String via; - public String numeroCivico; - public String indirizzo; // (via + numeroCivico) - public String cap; - public String citta; - public String prov; - public String nazione; - public BigDecimal lat; - public BigDecimal lng; + private Long idPosizione; + private String via; + private String numeroCivico; + private String indirizzo; // (via + numeroCivico) + private String cap; + private String citta; + private String prov; + private String nazione; + private BigDecimal lat; + private BigDecimal lng; public Long getIdPosizione() { return idPosizione; @@ -27,71 +27,80 @@ public class IndirizzoDTO { return via; } - public void setVia(String via) { + public IndirizzoDTO setVia(String via) { this.via = via; + return this; } public String getNumeroCivico() { return numeroCivico; } - public void setNumeroCivico(String numeroCivico) { + public IndirizzoDTO setNumeroCivico(String numeroCivico) { this.numeroCivico = numeroCivico; + return this; } public String getIndirizzo() { return indirizzo; } - public void setIndirizzo(String indirizzo) { + public IndirizzoDTO setIndirizzo(String indirizzo) { this.indirizzo = indirizzo; + return this; } public String getCap() { return cap; } - public void setCap(String cap) { + public IndirizzoDTO setCap(String cap) { this.cap = cap; + return this; } public String getCitta() { return citta; } - public void setCitta(String citta) { + public IndirizzoDTO setCitta(String citta) { this.citta = citta; - } - - public String getNazione() { - return nazione; - } - - public void setNazione(String nazione) { - this.nazione = nazione; + return this; } public String getProv() { return prov; } - public void setProv(String prov) { + public IndirizzoDTO setProv(String prov) { this.prov = prov; + return this; + } + + public String getNazione() { + return nazione; + } + + public IndirizzoDTO setNazione(String nazione) { + this.nazione = nazione; + return this; } public BigDecimal getLat() { return lat; } - public void setLat(BigDecimal lat) { + public IndirizzoDTO setLat(BigDecimal lat) { this.lat = lat; + return this; } public BigDecimal getLng() { return lng; } - public void setLng(BigDecimal lng) { + public IndirizzoDTO setLng(BigDecimal lng) { this.lng = lng; + return this; } } \ No newline at end of file diff --git a/ems-core/src/main/java/it/integry/googleCloudApi/service/GeocodingService.java b/ems-core/src/main/java/it/integry/googleCloudApi/service/GeocodingService.java new file mode 100644 index 0000000000..ab9bd819a5 --- /dev/null +++ b/ems-core/src/main/java/it/integry/googleCloudApi/service/GeocodingService.java @@ -0,0 +1,115 @@ +package it.integry.googleCloudApi.service; + +import com.google.maps.GeocodingApi; +import com.google.maps.model.*; +import it.integry.ems.service.EntityProcessor; +import it.integry.ems.service.KeyManagerService; +import it.integry.ems.sync.MultiDBTransaction.Connection; +import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager; +import it.integry.ems_model.entity.StbPosizioni; +import it.integry.ems_model.service.SetupGest; +import it.integry.ems_model.types.LatLng; +import it.integry.ems_model.types.OperationType; +import it.integry.ems_model.utility.UtilityDB; +import it.integry.googleCloudApi.dto.IndirizzoDTO; +import it.integry.googleCloudApi.utility.GoogleApiUtility; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.math.RoundingMode; + +@Service +@Scope("request") +public class GeocodingService { + + @Autowired + private KeyManagerService keyManagerService; + + @Autowired + public EntityProcessor entityProcessor; + + @Autowired + public MultiDBTransactionManager multiDBTransactionManager; + + @Autowired + public SetupGest setupGest; + + public IndirizzoDTO geocode(String address) throws Exception { + GeocodingResult[] results = GeocodingApi.geocode(GoogleApiUtility.getGeoApiContext(keyManagerService), address).await(); + + return GoogleApiUtility.buildIndirizzoDTO(results); + } + + public IndirizzoDTO reverseGeocode(double lat, double lng) throws Exception { + com.google.maps.model.LatLng location = new com.google.maps.model.LatLng(lat, lng); + GeocodingResult[] results = GeocodingApi.reverseGeocode(GoogleApiUtility.getGeoApiContext(keyManagerService), location).await(); + + return GoogleApiUtility.buildIndirizzoDTO(results); + } + + public IndirizzoDTO getPositionFromCoords(BigDecimal lat, BigDecimal lng) throws Exception { + Connection conn = multiDBTransactionManager.getPrimaryConnection(); + IndirizzoDTO indirizzo; + + double formattedLat = lat.setScale(5, RoundingMode.HALF_EVEN).doubleValue(); + double formattedLng = lng.setScale(5, RoundingMode.HALF_EVEN).doubleValue(); + int distance = setupGest.getSetupInteger(conn, "MAPS", "SETUP", "GEOCODE_PRECISION", 50); + + String nearbyPointQuery = "SELECT * from ( " + + " SELECT *,(6371392.896 * acos(cos(radians(" + formattedLat + ")) * cos(radians(lat)) * " + + " cos(radians(lng) - radians(" + formattedLng + ")) + " + + " sin(radians(" + formattedLat + ")) * sin(radians(lat)))) AS distance " + + " FROM stb_posizioni " + + " ) distance_points " + + "where distance < " + distance + + " ORDER BY distance"; + + StbPosizioni stbPosizioni = UtilityDB.executeSimpleQueryOnlyFirstRowDTO(conn, nearbyPointQuery, StbPosizioni.class); + + if (stbPosizioni != null) { + indirizzo = new IndirizzoDTO() + .setIdPosizione(stbPosizioni.getId()) + .setCap(stbPosizioni.getCap()) + .setCitta(stbPosizioni.getCitta()) + .setLat(stbPosizioni.getLat()) + .setLng(stbPosizioni.getLng()) + .setNazione(stbPosizioni.getNazione()) + .setVia(stbPosizioni.getIndirizzo()) + .setProv(stbPosizioni.getProv()) + .setIndirizzo(stbPosizioni.getIndirizzo()); + } else { + indirizzo = reverseGeocode(lat.doubleValue(), lng.doubleValue()); + + stbPosizioni = new StbPosizioni() + .setLat(lat) + .setLng(lng) + .setCap(indirizzo.getCap()) + .setCitta(indirizzo.getCitta()) + .setIndirizzo(indirizzo.getIndirizzo()) + .setNazione(indirizzo.getNazione()) + .setProv(indirizzo.getProv()); + + stbPosizioni.setOperation(OperationType.INSERT); + entityProcessor.processEntity(stbPosizioni, multiDBTransactionManager); + + indirizzo.setIdPosizione(stbPosizioni.getId()); + } + + return indirizzo; + } + + public LatLng getCoordinateByCity(String cityName) throws Exception { + GeocodingResult[] results = GeocodingApi.geocode(GoogleApiUtility.getGeoApiContext(keyManagerService), cityName).await(); + + if (results != null && results.length > 0) { + Geometry geometry = results[0].geometry; + + return new LatLng() + .set(new BigDecimal(geometry.location.lat), new BigDecimal(geometry.location.lng)); + } + + return null; + } +} diff --git a/ems-core/src/main/java/it/integry/googleCloudApi/service/PlacesService.java b/ems-core/src/main/java/it/integry/googleCloudApi/service/PlacesService.java new file mode 100644 index 0000000000..c0deef68dd --- /dev/null +++ b/ems-core/src/main/java/it/integry/googleCloudApi/service/PlacesService.java @@ -0,0 +1,82 @@ +package it.integry.googleCloudApi.service; + +import com.google.maps.PlacesApi; +import com.google.maps.model.AutocompletePrediction; +import com.google.maps.model.PlaceDetails; +import it.integry.ems.service.KeyManagerService; +import it.integry.googleCloudApi.dto.IndirizzoDTO; +import it.integry.googleCloudApi.dto.AutoCompleteAddressDTO; +import it.integry.googleCloudApi.utility.GoogleApiUtility; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +@Service +public class PlacesService { + + @Autowired + private KeyManagerService keyManagerService; + + /** + * Autocompletes an address based on the input string and returns a list of suggestions. + *

+ * This method uses a session token to group user interactions within a single session, + * improving the billing model and the accuracy of prediction ranking, as recommended + * by the Google Places API documentation.

+ * + *

Session Token Best Practices (from Google):

+ *
    + *
  • A session token is used to group Autocomplete and Place Details requests.
  • + *
  • Generate a new UUID when a user starts typing in a search field.
  • + *
  • Reuse the same token for all autocomplete requests and the final place details request during the session.
  • + *
  • Do not reuse a session token across different user interactions.
  • + *
  • Each session should last no longer than a few minutes.
  • + *
+ * + * @param address The address string to autocomplete. + * @param language The language for the autocomplete results. + * @param uuid A UUID string representing the session token for the autocomplete request. + * @return A list of AutoCompleteAddressDTO containing address suggestions. + * @throws Exception If there is an error during the API call. + */ + public List autoCompleteAddress(String address, String language, String uuid) throws Exception { + AutocompletePrediction[] predictions = PlacesApi.placeAutocomplete( + GoogleApiUtility.getGeoApiContext(keyManagerService), + address, + GoogleApiUtility.getSessionToken(uuid) + ).language(language).await(); + + return Arrays.stream(predictions) + .map(x -> + new AutoCompleteAddressDTO().setDescription(x.description).setPlaceId(x.placeId) + ).collect(Collectors.toList()); + } + + /** + * Retrieves detailed information about a place using its Place ID. + * + *

This method uses the same session token used during the autocomplete session, + * which allows Google to link the details request to the user's prior autocomplete queries. + * This results in more relevant results and a more efficient billing structure.

+ * + *

See: Google documentation

+ * + * @param placeId The unique identifier for the place. + * @param uuid The same session token used in the autocomplete request (as a UUID string). + * @return An IndirizzoDTO containing detailed address information, or null if not found. + * @throws Exception If there is an error during the API call. + */ + public IndirizzoDTO placeDetails(String placeId, String uuid) throws Exception { + PlaceDetails details = PlacesApi.placeDetails( + GoogleApiUtility.getGeoApiContext(keyManagerService), + placeId, + GoogleApiUtility.getSessionToken(uuid) + ).await(); + + if (details != null) return GoogleApiUtility.buildIndirizzoDTO(details); + return null; + } +} diff --git a/ems-core/src/main/java/it/integry/googleCloudApi/utility/GoogleApiUtility.java b/ems-core/src/main/java/it/integry/googleCloudApi/utility/GoogleApiUtility.java new file mode 100644 index 0000000000..d2bd1a8394 --- /dev/null +++ b/ems-core/src/main/java/it/integry/googleCloudApi/utility/GoogleApiUtility.java @@ -0,0 +1,99 @@ +package it.integry.googleCloudApi.utility; + +import com.google.maps.GeoApiContext; +import com.google.maps.PlaceAutocompleteRequest; +import com.google.maps.model.AddressComponent; +import com.google.maps.model.AddressComponentType; +import com.google.maps.model.GeocodingResult; +import com.google.maps.model.PlaceDetails; +import it.integry.ems.service.KeyManagerService; +import it.integry.googleCloudApi.dto.IndirizzoDTO; + +import java.math.BigDecimal; +import java.util.Arrays; +import java.util.List; +import java.util.UUID; + +public class GoogleApiUtility { + + /** + * Creates a GeoApiContext using the API key from KeyManagerService. + * + * @param keyManagerService The service to retrieve the Google Maps API key. + * @return A configured GeoApiContext instance. + * @throws Exception if there is an issue retrieving the API key or building the context. + */ + public static GeoApiContext getGeoApiContext(KeyManagerService keyManagerService) throws Exception { + return new GeoApiContext.Builder().apiKey(keyManagerService.getGmapsApiKey()).build(); + } + + /** + * Creates a session token for PlaceAutocompleteRequest using a UUID. + * + * @param uuid The UUID string to create the session token. + * @return A PlaceAutocompleteRequest.SessionToken instance. + */ + public static PlaceAutocompleteRequest.SessionToken getSessionToken(String uuid) { + UUID uuidObj = UUID.fromString(uuid); + return new PlaceAutocompleteRequest.SessionToken(uuidObj); + } + + /** + * Builds an IndirizzoDTO from a GeocodingResult or PlaceDetails object. + * + * @param obj The object containing address information, either GeocodingResult[] or PlaceDetails. + * @return An IndirizzoDTO populated with the address details. + * @throws IllegalArgumentException if the object type is unsupported. + */ + public static IndirizzoDTO buildIndirizzoDTO(T obj) { + if (obj instanceof GeocodingResult[]) { + GeocodingResult[] results = (GeocodingResult[]) obj; + if (results.length == 0) return null; + GeocodingResult result = results[0]; + + return addressComponentsToDto(result.addressComponents) + .setLat(BigDecimal.valueOf(result.geometry.location.lat)) + .setLng(BigDecimal.valueOf(result.geometry.location.lng)); + } else if (obj instanceof PlaceDetails) { + PlaceDetails result = (PlaceDetails) obj; + + return addressComponentsToDto(result.addressComponents) + .setLat(BigDecimal.valueOf(result.geometry.location.lat)) + .setLng(BigDecimal.valueOf(result.geometry.location.lng)); + } else { + throw new IllegalArgumentException("Unsupported type: " + obj.getClass().getName()); + } + } + + private static IndirizzoDTO addressComponentsToDto(AddressComponent[] addressComponents) { + IndirizzoDTO indirizzoDTO = new IndirizzoDTO(); + + for (AddressComponent component : addressComponents) { + List types = Arrays.asList(component.types); + + if (types.contains(AddressComponentType.ROUTE)) { + indirizzoDTO.setVia(component.longName.toUpperCase()); + } else if (types.contains(AddressComponentType.STREET_NUMBER)) { + indirizzoDTO.setNumeroCivico(component.longName.toUpperCase()); + } else if (types.contains(AddressComponentType.COUNTRY)) { + indirizzoDTO.setNazione(component.shortName.toUpperCase()); + } else if (types.contains(AddressComponentType.ADMINISTRATIVE_AREA_LEVEL_2)) { + indirizzoDTO.setProv(component.shortName.toUpperCase()); + } else if (types.contains(AddressComponentType.ADMINISTRATIVE_AREA_LEVEL_3) || types.contains(AddressComponentType.LOCALITY)) { // LOCALITY + indirizzoDTO.setCitta(component.longName.toUpperCase()); + } else if (types.contains(AddressComponentType.POSTAL_CODE)) { + indirizzoDTO.setCap(component.longName.toUpperCase()); + } + } + + if (indirizzoDTO.getVia() != null) { + String indirizzo = indirizzoDTO.getVia(); + if (indirizzoDTO.getNumeroCivico() != null) { + indirizzo += ", " + indirizzoDTO.getNumeroCivico(); + } + indirizzoDTO.setIndirizzo(indirizzo); + } + + return indirizzoDTO; + } +} diff --git a/ems-engine/src/main/java/it/integry/ems/activity/service/UserWorkHoursService.java b/ems-engine/src/main/java/it/integry/ems/activity/service/UserWorkHoursService.java index 0ffb26b52e..5f6eeff490 100644 --- a/ems-engine/src/main/java/it/integry/ems/activity/service/UserWorkHoursService.java +++ b/ems-engine/src/main/java/it/integry/ems/activity/service/UserWorkHoursService.java @@ -7,6 +7,7 @@ import it.integry.ems.activity.dto.UserWorkHoursClockOutRequestDTO; import it.integry.ems.activity.dto.UserWorkHoursStatusDTO; import it.integry.ems.exception.PrimaryDatabaseNotPresentException; import it.integry.ems.service.EntityProcessor; +import it.integry.googleCloudApi.service.GeocodingService; import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager; import it.integry.ems.system.service.SystemService; import it.integry.ems.user.dto.UserDTO; @@ -22,7 +23,7 @@ import it.integry.ems_model.utility.Query; import it.integry.ems_model.utility.UtilityDB; import it.integry.ems_model.utility.UtilityDate; import it.integry.ems_model.utility.UtilityLocalDate; -import it.integry.ems_model.utility.dto.IndirizzoDTO; +import it.integry.googleCloudApi.dto.IndirizzoDTO; import it.integry.firebase.dto.MessageDTO; import it.integry.firebase.dto.NotificationDTO; import it.integry.firebase.dto.android.AndroidConfigDTO; @@ -69,6 +70,9 @@ public class UserWorkHoursService { @Autowired private UserService userService; + @Autowired + private GeocodingService geocodingService; + public void clockIn(String username, UserWorkHoursClockInRequestDTO userWorkHoursClockInRequestDTO) throws Exception { if (!userWorkHoursClockInRequestDTO.isValidPosition()) throw new Exception("Posizione di ingresso non valida"); @@ -92,7 +96,7 @@ public class UserWorkHoursService { jtbRLavt.setOperation(OperationType.INSERT_OR_UPDATE); final IndirizzoDTO positionFromCoords = - utilityService.getPositionFromCoords(userWorkHoursClockInRequestDTO.getPositionLatitude(), userWorkHoursClockInRequestDTO.getPositionLongitude()); + geocodingService.getPositionFromCoords(userWorkHoursClockInRequestDTO.getPositionLatitude(), userWorkHoursClockInRequestDTO.getPositionLongitude()); JtbRLavr jtbRLavr = new JtbRLavr() .setDaOra(userWorkHoursClockInRequestDTO.getTimestamp() != null ? @@ -136,7 +140,7 @@ public class UserWorkHoursService { jtbRLavt.setFlagTrasferta("S"); final IndirizzoDTO positionFromCoords = - utilityService.getPositionFromCoords(userWorkHoursClockOutRequestDTO.getPositionLatitude(), userWorkHoursClockOutRequestDTO.getPositionLongitude()); + geocodingService.getPositionFromCoords(userWorkHoursClockOutRequestDTO.getPositionLatitude(), userWorkHoursClockOutRequestDTO.getPositionLongitude()); JtbRLavr jtbRLavr = new JtbRLavr() .setCodJcom(userWorkHoursClockOutRequestDTO.getCodJcom()) diff --git a/ems-engine/src/main/java/it/integry/ems/contabil/controller/ContabilController.java b/ems-engine/src/main/java/it/integry/ems/contabil/controller/ContabilController.java index bfcd5d9900..e0fb054583 100644 --- a/ems-engine/src/main/java/it/integry/ems/contabil/controller/ContabilController.java +++ b/ems-engine/src/main/java/it/integry/ems/contabil/controller/ContabilController.java @@ -13,11 +13,7 @@ import it.integry.ems.javabeans.RequestDataDTO; import it.integry.ems.response.EsitoType; import it.integry.ems.response.ServiceRestResponse; import it.integry.ems.response.StatusResponse; -import it.integry.ems.rules.businessLogic.AccountingBusinessLogic; -import it.integry.ems.service.comuni.base.CapCittaProv; -import it.integry.ems.service.comuni.entities.Comune; import it.integry.ems.service.comuni.exceptions.ComuniException; -import it.integry.ems.service.comuni.service.ComuniService; import it.integry.ems.status.ServiceChecker; import it.integry.ems.utility.UtilityEntity; import it.integry.ems_model.config.EmsRestConstants; @@ -32,7 +28,6 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.xml.ws.soap.SOAPFaultException; import java.lang.reflect.Method; -import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -45,22 +40,28 @@ public class ContabilController { @Autowired private ServiceChecker serviceChecker; + @Autowired private ContabilService contabilService; + @Autowired private AutofatturaService autofatturaService; + @Autowired private ScadenzeService scadenzeService; + @Autowired private PassaggioAnno passaggioAnno; + @Autowired private RegCorrispettivoService regCorrispettivoService; - @Autowired - private ComuniService comuniService; + @Autowired private RequestDataDTO requestDataDTO; + @Autowired private AmmortamentiService ammortamentiService; + @Autowired private SEPAService SEPAService; @@ -198,41 +199,6 @@ public class ContabilController { return ServiceRestResponse.createPositiveResponse(contabilService.checkIban(iban)); } - @RequestMapping(value = "/infoComuni", method = RequestMethod.POST) - public @ResponseBody - ServiceRestResponse getInfoComuni(HttpServletRequest request, @RequestParam(required = false) String nome, - @RequestParam(required = false) String cap, - @RequestParam(required = false) String codiceCatastale, - @RequestParam(required = false) String indirizzo, - @RequestParam(required = false) String prov, - @RequestParam(required = false) String regione) throws ComuniException { - List filteredComuni = comuniService.filterComuni(nome, codiceCatastale, prov, regione); - if (!UtilityString.isNullOrEmpty(indirizzo) || !UtilityString.isNullOrEmpty(cap)) { - filteredComuni = comuniService.filterIndirizzo(filteredComuni, cap, indirizzo); - } - return ServiceRestResponse.createPositiveResponse(filteredComuni); - } - - @RequestMapping(value = "/capCittaProv", method = RequestMethod.POST) - public @ResponseBody - ServiceRestResponse getCapCittaProv(HttpServletRequest request, @RequestParam(required = false) String nome, - @RequestParam(required = false) String cap, - @RequestParam(required = false) String prov) throws Exception { - CapCittaProv comune = comuniService.getCapCittaProv(nome, cap, prov); - - return ServiceRestResponse.createPositiveResponse(comune); - } - - @RequestMapping(value = "/searchComuni", method = RequestMethod.POST) - public @ResponseBody - ServiceRestResponse searchComuni(HttpServletRequest request, - @RequestParam() String q, - @RequestParam(required = false) Integer limit) throws Exception { - List results = comuniService.searchComuni(q, limit); - - return ServiceRestResponse.createPositiveResponse(results); - } - @ExceptionHandler(SOAPFaultException.class) public @ResponseBody ServiceRestResponse handleSOAPException(HttpServletRequest request, HttpServletResponse response, SOAPFaultException ex) { diff --git a/ems-engine/src/main/java/it/integry/ems/contabil/service/ContabilService.java b/ems-engine/src/main/java/it/integry/ems/contabil/service/ContabilService.java index 2acf9ade72..a2f8a5c02f 100644 --- a/ems-engine/src/main/java/it/integry/ems/contabil/service/ContabilService.java +++ b/ems-engine/src/main/java/it/integry/ems/contabil/service/ContabilService.java @@ -4,7 +4,6 @@ import com.annimon.stream.Stream; import it.integry.common.var.CommonConstants; import it.integry.ems.contabil.dto.DettaglioIncassoTitoliDTO; import it.integry.ems.contabil.dto.DistintaEffettiDTO; -import it.integry.ems.contabil.dto.DistinteIncassiDTO; import it.integry.ems.contabil.dto.IncassoTitoloDTO; import it.integry.ems.contabil.iban.base.IbanBase; import it.integry.ems.contabil.iban.exceptions.IbanException; @@ -16,19 +15,18 @@ import it.integry.ems.contabil.partitaIva.services.CheckVatService; import it.integry.ems.rules.businessLogic.AccountingBusinessLogic; import it.integry.ems.rules.businessLogic.enums.TipoPartita; import it.integry.ems.service.EntityProcessor; -import it.integry.ems.service.MapService; +import it.integry.googleCloudApi.service.GeocodingService; import it.integry.ems.sync.MultiDBTransaction.Connection; import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager; import it.integry.ems.utility.UtilityEntity; import it.integry.ems_model.base.EntityBase; -import it.integry.ems_model.config.EmsRestConstants; import it.integry.ems_model.db.ResultSetMapper; import it.integry.ems_model.entity.*; import it.integry.ems_model.exception.EntityException; import it.integry.ems_model.service.SetupGest; import it.integry.ems_model.types.OperationType; import it.integry.ems_model.utility.*; -import it.integry.ems_model.utility.dto.IndirizzoDTO; +import it.integry.googleCloudApi.dto.IndirizzoDTO; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; @@ -58,7 +56,7 @@ public class ContabilService { @Autowired private EntityProcessor entityProcessor; @Autowired - private MapService mapService; + private GeocodingService geocodingService; private void updateDataExport(Date dataDist, Integer rifDist) throws Exception { VtbDist vtbDist = new VtbDist() @@ -154,7 +152,7 @@ public class ContabilService { if (address.value != null) { IndirizzoDTO indirizzoDTO = null; try { - indirizzoDTO = mapService.geocode(address.value); + indirizzoDTO = geocodingService.geocode(address.value); } catch (Exception e) { logger.error("checkVat", e); } diff --git a/ems-engine/src/main/java/it/integry/ems/contabil/service/SEPAService.java b/ems-engine/src/main/java/it/integry/ems/contabil/service/SEPAService.java index 797ce1fb7b..f02edf6865 100644 --- a/ems-engine/src/main/java/it/integry/ems/contabil/service/SEPAService.java +++ b/ems-engine/src/main/java/it/integry/ems/contabil/service/SEPAService.java @@ -66,9 +66,8 @@ import it.integry.ems.response.EsitoType; import it.integry.ems.response.FileItem; import it.integry.ems.response.ServiceRestResponse; import it.integry.ems.service.EntityProcessor; -import it.integry.ems.service.MapService; +import it.integry.googleCloudApi.service.GeocodingService; import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager; -import it.integry.ems_model.config.EmsRestConstants; import it.integry.ems_model.entity.VtbDist; import it.integry.ems_model.service.SetupGest; import it.integry.ems_model.types.OperationType; @@ -109,7 +108,7 @@ public class SEPAService { @Autowired private EntityProcessor entityProcessor; @Autowired - private MapService mapService; + private GeocodingService geocodingService; public ServiceRestResponse getSepaXml(Date dataDist, Integer rifDist) throws Exception { ServiceRestResponse resp = new ServiceRestResponse(); diff --git a/ems-engine/src/main/java/it/integry/ems/order/Import/service/OrdiniImportService.java b/ems-engine/src/main/java/it/integry/ems/order/Import/service/OrdiniImportService.java index 6e238a1e28..14f4f99e78 100644 --- a/ems-engine/src/main/java/it/integry/ems/order/Import/service/OrdiniImportService.java +++ b/ems-engine/src/main/java/it/integry/ems/order/Import/service/OrdiniImportService.java @@ -9,7 +9,7 @@ import it.integry.ems.rules.completing.QueryRules; import it.integry.ems.service.EntityProcessor; import it.integry.ems.service.MailService; import it.integry.ems.service.MailTemplateService; -import it.integry.ems.service.MapService; +import it.integry.googleCloudApi.service.GeocodingService; import it.integry.ems.service.dto.GenericComunicationMailTemplateDataDTO; import it.integry.ems.sync.MultiDBTransaction.Connection; import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager; @@ -59,7 +59,7 @@ public class OrdiniImportService { @Autowired private MailService mailService; @Autowired - private MapService mapService; + private GeocodingService geocodingService; public EntityBase importOrdineDialogo(DialogoJsonDTO dialogoJsonDTO, String type, String format) throws Exception { diff --git a/ems-engine/src/main/java/it/integry/ems/production/agribook/AgribookOrderController.java b/ems-engine/src/main/java/it/integry/ems/production/agribook/AgribookOrderController.java index abcec53177..c137606fb7 100644 --- a/ems-engine/src/main/java/it/integry/ems/production/agribook/AgribookOrderController.java +++ b/ems-engine/src/main/java/it/integry/ems/production/agribook/AgribookOrderController.java @@ -6,16 +6,16 @@ import it.integry.ems._context.ApplicationContextProvider; import it.integry.ems.production.agribook.model.*; import it.integry.ems.response.ServiceRestResponse; import it.integry.ems.service.EntityProcessor; +import it.integry.googleCloudApi.service.GeocodingService; import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager; import it.integry.ems.utility.UtilityFile; -import it.integry.ems.utility.service.UtilityService; import it.integry.ems_model.entity.MtbDepo; import it.integry.ems_model.entity.MtbDepoPosizioni; import it.integry.ems_model.entity.MtbPartitaMag; import it.integry.ems_model.types.OperationType; import it.integry.ems_model.utility.UtilityDB; import it.integry.ems_model.utility.UtilityString; -import it.integry.ems_model.utility.dto.IndirizzoDTO; +import it.integry.googleCloudApi.dto.IndirizzoDTO; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; @@ -36,7 +36,6 @@ public class AgribookOrderController { private final Logger logger = LogManager.getLogger(); - @Autowired private AgribookOrderService agribookOrderService; @@ -173,7 +172,7 @@ public class AgribookOrderController { MultiDBTransactionManager multiDBTransactionManager = ContextLoader.getCurrentWebApplicationContext().getBean(MultiDBTransactionManager.class); EntityProcessor entityProcessor = ApplicationContextProvider.getApplicationContext().getBean(EntityProcessor.class); - UtilityService utilityService = ContextLoader.getCurrentWebApplicationContext().getBean(UtilityService.class); + GeocodingService geocodingService = ContextLoader.getCurrentWebApplicationContext().getBean(GeocodingService.class); List mtbDepoPosizioni = UtilityDB.executeSimpleQueryDTO(multiDBTransactionManager.getPrimaryConnection(), "SELECT * FROM mtb_depo_posizioni", MtbDepoPosizioni.class); @@ -195,8 +194,8 @@ public class AgribookOrderController { BigDecimal lat = x.getValue().get(0).getLat(); BigDecimal lng = x.getValue().get(0).getLng(); -// //Creazione posizione con coords - IndirizzoDTO indirizzoDTO = utilityService.getPositionFromCoords(lat, lng); + //Creazione posizione con coords + IndirizzoDTO indirizzoDTO = geocodingService.getPositionFromCoords(lat, lng); MtbDepoPosizioni matchPosizione = Stream.of(mtbDepoPosizioni) diff --git a/ems-engine/src/main/java/it/integry/ems/production/agribook/AgribookOrderService.java b/ems-engine/src/main/java/it/integry/ems/production/agribook/AgribookOrderService.java index 61ac137bce..db477ad6d5 100644 --- a/ems-engine/src/main/java/it/integry/ems/production/agribook/AgribookOrderService.java +++ b/ems-engine/src/main/java/it/integry/ems/production/agribook/AgribookOrderService.java @@ -6,16 +6,16 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; import it.integry.ems.production.agribook.model.*; import it.integry.ems.service.EntityProcessor; +import it.integry.googleCloudApi.service.GeocodingService; import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager; import it.integry.ems.user.UserSession; import it.integry.ems.utility.UtilityEntity; -import it.integry.ems.utility.service.UtilityService; import it.integry.ems_model.base.EntityBase; import it.integry.ems_model.entity.*; import it.integry.ems_model.service.SetupGest; import it.integry.ems_model.types.OperationType; import it.integry.ems_model.utility.*; -import it.integry.ems_model.utility.dto.IndirizzoDTO; +import it.integry.googleCloudApi.dto.IndirizzoDTO; import it.integry.ems_model.utility.dto.PaginatedDTO; import org.apache.commons.text.StringSubstitutor; import org.springframework.beans.factory.annotation.Autowired; @@ -1322,7 +1322,7 @@ public class AgribookOrderService { throw new Exception("Nessun dato da salvare."); } - UtilityService utilityService = ContextLoader.getCurrentWebApplicationContext().getBean(UtilityService.class); + GeocodingService geocodingService = ContextLoader.getCurrentWebApplicationContext().getBean(GeocodingService.class); List mtbDepoPosizioni = UtilityDB.executeSimpleQueryDTO(multiDBTransactionManager.getPrimaryConnection(), "SELECT * FROM mtb_depo_posizioni", MtbDepoPosizioni.class); @@ -1335,7 +1335,7 @@ public class AgribookOrderService { for (AgribookSaveCoordsDTO saveCoordsDTO : agribookSaveCoordsDTOS) { // Creazione posizione con coords - IndirizzoDTO indirizzoDTO = utilityService.getPositionFromCoords(saveCoordsDTO.getLat(), saveCoordsDTO.getLng()); + IndirizzoDTO indirizzoDTO = geocodingService.getPositionFromCoords(saveCoordsDTO.getLat(), saveCoordsDTO.getLng()); String codMdep = saveCoordsDTO.getCodMdep(); diff --git a/ems-engine/src/main/java/it/integry/ems/system/service/AnagImportService.java b/ems-engine/src/main/java/it/integry/ems/system/service/AnagImportService.java index 643a109eb4..b1ddee55b5 100644 --- a/ems-engine/src/main/java/it/integry/ems/system/service/AnagImportService.java +++ b/ems-engine/src/main/java/it/integry/ems/system/service/AnagImportService.java @@ -5,7 +5,7 @@ import com.annimon.stream.Stream; import it.integry.ems.Import.dto.AnomalieDTO; import it.integry.ems.service.EntityProcessor; import it.integry.ems.service.MailService; -import it.integry.ems.service.MapService; +import it.integry.googleCloudApi.service.GeocodingService; import it.integry.ems.sync.MultiDBTransaction.Connection; import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager; import it.integry.ems_model.annotation.SqlField; @@ -19,7 +19,7 @@ import it.integry.ems_model.types.OperationType; import it.integry.ems_model.utility.UtilityBigDecimal; import it.integry.ems_model.utility.UtilityDB; import it.integry.ems_model.utility.UtilityString; -import it.integry.ems_model.utility.dto.IndirizzoDTO; +import it.integry.googleCloudApi.dto.IndirizzoDTO; import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -51,7 +51,7 @@ public class AnagImportService { private SetupGest setupGest; @Autowired - private MapService mapService; + private GeocodingService geocodingService; @Autowired private MailService mailService; @@ -106,7 +106,7 @@ public class AnagImportService { String codVdes = (String) cliente.get("cod_vdes"); String indirizzo = (String) cliente.get("indirizzo"); - IndirizzoDTO indirizzoDTO = mapService.geocode(indirizzo); + IndirizzoDTO indirizzoDTO = geocodingService.geocode(indirizzo); BigDecimal lat = null; BigDecimal lng = null; diff --git a/ems-engine/src/main/java/it/integry/ems/utility/controller/UtilityController.java b/ems-engine/src/main/java/it/integry/ems/utility/controller/UtilityController.java index fb3c6c12d0..94c379b5d2 100644 --- a/ems-engine/src/main/java/it/integry/ems/utility/controller/UtilityController.java +++ b/ems-engine/src/main/java/it/integry/ems/utility/controller/UtilityController.java @@ -1,12 +1,10 @@ package it.integry.ems.utility.controller; import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; import it.integry.common.var.CommonConstants; import it.integry.ems.response.EsitoType; import it.integry.ems.response.ServiceRestResponse; import it.integry.ems.response.StatusResponse; -import it.integry.ems.service.HttpRestWrapper; import it.integry.ems.status.ServiceChecker; import it.integry.ems.utility.dto.C2EArgDTO; import it.integry.ems.utility.dto.PdfDTO; @@ -30,12 +28,10 @@ import javax.xml.validation.Schema; import javax.xml.validation.SchemaFactory; import javax.xml.validation.Validator; import java.lang.reflect.Method; -import java.math.BigDecimal; import java.util.List; @RestController @Scope(value = "request") - public class UtilityController { private final Logger logger = LogManager.getLogger(); @@ -73,15 +69,6 @@ public class UtilityController { return utilityService.splitPDF(pdfList); } - @RequestMapping(value = EmsRestConstants.PATH_GEOCODE, method = RequestMethod.GET) - public @ResponseBody - ServiceRestResponse geocode(HttpServletRequest request, - @RequestParam("address") String address) throws Exception { - - return utilityService.geocode(address); - } - - @RequestMapping(value = EmsRestConstants.PATH_CMD_2_EXPORT, method = RequestMethod.POST) public @ResponseBody Object cmd2Export(HttpServletRequest request, @@ -135,7 +122,7 @@ public class UtilityController { public @ResponseBody ServiceRestResponse readRemoteFile(@RequestBody JsonNode body) { ServiceRestResponse response; try { - if(body.has("url")) { + if (body.has("url")) { String url = body.get("url").asText(); response = ServiceRestResponse.createPositiveResponse(UtilityService.readRemoteFile(url)); } else { @@ -150,48 +137,10 @@ public class UtilityController { @RequestMapping(value = EmsRestConstants.PATH_MIGRATE_GEOLOCATION_FOR_RLAVR, method = RequestMethod.GET) public @ResponseBody - ServiceRestResponse setGeolocationFromCoordinate(HttpServletRequest request, @RequestParam(CommonConstants.PROFILE_DB) String configuration) { + ServiceRestResponse setGeolocationFromCoordinate(@RequestParam(CommonConstants.PROFILE_DB) String configuration) throws Exception { - ServiceRestResponse response = new ServiceRestResponse(); - try { - utilityService.migrateLocalizationForRlavr(); - return response; - //UtilityEntity.toServiceRestResponse(entities).get(0); - } catch (Exception e) { - logger.error(request.getRequestURI(), e); - response = new ServiceRestResponse(EsitoType.KO, configuration, e); - } - return response; - } - - @RequestMapping(value = EmsRestConstants.PATH_REVERSE_GEOCODE, method = RequestMethod.GET) - public @ResponseBody - ServiceRestResponse reverseGeocode( - HttpServletRequest request, - @RequestParam(CommonConstants.PROFILE_DB) String configuration, - @RequestParam BigDecimal lat, - @RequestParam BigDecimal lng - ) { - - ServiceRestResponse response; - try { - response = utilityService.reverseGeocode(lat, lng); - return response; - } catch (Exception e) { - logger.error(request.getRequestURI(), e); - response = new ServiceRestResponse(EsitoType.KO, configuration, e); - } - return response; - } - - @RequestMapping(value = EmsRestConstants.PATH_GET_POSITION_FROM_COORDS, method = RequestMethod.GET) - public @ResponseBody - ServiceRestResponse getPositionFromCoords(HttpServletRequest request, - @RequestParam(CommonConstants.PROFILE_DB) String configuration, - @RequestParam BigDecimal lat, - @RequestParam BigDecimal lng) throws Exception { - - return ServiceRestResponse.createPositiveResponse(utilityService.getPositionFromCoords(lat, lng)); + utilityService.migrateLocalizationForRlavr(); + return ServiceRestResponse.createPositiveResponse(); } @RequestMapping(value = EmsRestConstants.PATH_GET_RICORRENZE, method = RequestMethod.GET) @@ -205,7 +154,7 @@ public class UtilityController { @RequestMapping(value = EmsRestConstants.PATH_EXTRACT_SSCC, method = RequestMethod.GET) public @ResponseBody ServiceRestResponse extractSSCC(HttpServletRequest request, - @RequestParam("barcode") String barcode) throws Exception { + @RequestParam("barcode") String barcode) throws Exception { return ServiceRestResponse.createPositiveResponse(UtilityBarcode.extractSSCC(barcode)); } } diff --git a/ems-engine/src/main/java/it/integry/ems/utility/service/UtilityService.java b/ems-engine/src/main/java/it/integry/ems/utility/service/UtilityService.java index 50fd17fb90..e4ea25e8c3 100644 --- a/ems-engine/src/main/java/it/integry/ems/utility/service/UtilityService.java +++ b/ems-engine/src/main/java/it/integry/ems/utility/service/UtilityService.java @@ -10,7 +10,7 @@ import it.integry.ems.report.dto.PairsDTO; import it.integry.ems.response.EsitoType; import it.integry.ems.response.ServiceRestResponse; import it.integry.ems.service.EntityProcessor; -import it.integry.ems.service.MapService; +import it.integry.googleCloudApi.service.GeocodingService; import it.integry.ems.service.ReportProcessor; import it.integry.ems.service.exception.EmptyReportException; import it.integry.ems.sync.MultiDBTransaction.Connection; @@ -22,11 +22,9 @@ import it.integry.ems_model.db.ResultSetMapper; import it.integry.ems_model.entity.JtbRLavr; import it.integry.ems_model.entity.JtbRLavt; import it.integry.ems_model.entity.JtbRicorrenze; -import it.integry.ems_model.entity.StbPosizioni; -import it.integry.ems_model.service.SetupGest; import it.integry.ems_model.types.OperationType; import it.integry.ems_model.utility.*; -import it.integry.ems_model.utility.dto.IndirizzoDTO; +import it.integry.googleCloudApi.dto.IndirizzoDTO; import org.apache.commons.codec.binary.Base64; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -41,7 +39,6 @@ import java.io.ByteArrayOutputStream; import java.io.File; import java.io.InputStream; import java.math.BigDecimal; -import java.math.RoundingMode; import java.net.URL; import java.sql.Date; import java.sql.*; @@ -59,14 +56,11 @@ public class UtilityService { private ReportProcessor reportProcessor; @Autowired - private MapService mapService; + private GeocodingService geocodingService; @Autowired public EntityProcessor entityProcessor; - @Autowired - private SetupGest setupGest; - private Logger logger = LogManager.getLogger(); @@ -260,20 +254,6 @@ public class UtilityService { return response; } - public ServiceRestResponse geocode(String address) throws Exception { - ServiceRestResponse response = new ServiceRestResponse(EsitoType.OK); - IndirizzoDTO indirizzo = mapService.geocode(address); - response.setJsonObject(indirizzo); - return response; - } - - public ServiceRestResponse reverseGeocode(BigDecimal lat, BigDecimal lng) throws Exception { - ServiceRestResponse response = new ServiceRestResponse(EsitoType.OK); - IndirizzoDTO indirizzo = mapService.reverseGeocode(lat.doubleValue(), lng.doubleValue()); - response.setJsonObject(indirizzo); - return response; - } - public ServiceRestResponse cmd2Export(C2EArgDTO arguments) throws Exception { ServiceRestResponse response = new ServiceRestResponse(EsitoType.OK); @@ -645,7 +625,7 @@ public class UtilityService { try { double lat = rs.getDouble("lat"); double lng = rs.getDouble("lng"); - IndirizzoDTO address = getPositionFromCoords(BigDecimal.valueOf(lat), BigDecimal.valueOf(lng)); + IndirizzoDTO address = geocodingService.getPositionFromCoords(BigDecimal.valueOf(lat), BigDecimal.valueOf(lng)); if (address == null) { logger.debug("nessun indirizzo trovato per le coordinate : [ " + lat + " , " + lng + " ]"); continue; @@ -685,71 +665,6 @@ public class UtilityService { entityProcessor.processEntityList(testate, false); } - private Long getAddressPositionId(IndirizzoDTO address) throws Exception { - String query = " SELECT top 1 id from stb_posizioni where " + - " ISNULL(citta,'') = ISNULL(" + UtilityDB.valueToString(address.getCitta()) + ",'') AND " + - " ISNULL(indirizzo,'') = ISNULL(" + UtilityDB.valueToString(address.getIndirizzo()) + ",'') AND " + - " ISNULL(cap,'') = ISNULL(" + UtilityDB.valueToString(address.getCap()) + ",'') AND " + - " ISNULL(prov,'') = ISNULL(" + UtilityDB.valueToString(address.getProv()) + ",'') AND " + - " ISNULL(nazione,'') = ISNULL(" + UtilityDB.valueToString(address.getNazione()) + ",'')"; - Connection connection = multiDBTransactionManager.getPrimaryConnection(); - PreparedStatement ps = connection.prepareStatement(query, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); - ResultSet rs = ps.executeQuery(); - if (rs.next()) { - return rs.getLong("id"); - } - return null; - } - - public IndirizzoDTO getPositionFromCoords(BigDecimal lat, BigDecimal lng) throws Exception { - double formattedLat = lat.setScale(5, RoundingMode.HALF_EVEN).doubleValue(); - double formattedLng = lng.setScale(5, RoundingMode.HALF_EVEN).doubleValue(); - int distance = setupGest.getSetupInteger(multiDBTransactionManager.getPrimaryConnection(), "MAPS", "SETUP", "GEOCODE_PRECISION", 50); - - String nearbyPointQuery = "SELECT * from ( " + - " SELECT *,(6371392.896 * acos(cos(radians(" + formattedLat + ")) * cos(radians(lat)) * " + - " cos(radians(lng) - radians(" + formattedLng + ")) + " + - " sin(radians(" + formattedLat + ")) * sin(radians(lat)))) AS distance " + - " FROM stb_posizioni " + - " ) distance_points " + - "where distance < " + distance + - " ORDER BY distance"; - - final HashMap nearbyPoints = UtilityDB.executeSimpleQueryOnlyFirstRow(multiDBTransactionManager.getPrimaryConnection(), nearbyPointQuery); - IndirizzoDTO dto; - - if (nearbyPoints != null) { - dto = new IndirizzoDTO(); - dto.setIdPosizione(UtilityHashMap.getValueIfExists(nearbyPoints, "id")); - dto.setCap(UtilityHashMap.getValueIfExists(nearbyPoints, "cap")); - dto.setCitta(UtilityHashMap.getValueIfExists(nearbyPoints, "citta")); - dto.setLat(UtilityHashMap.getValueIfExists(nearbyPoints, "lat")); - dto.setLng(UtilityHashMap.getValueIfExists(nearbyPoints, "lng")); - dto.setNazione(UtilityHashMap.getValueIfExists(nearbyPoints, "nazione")); - dto.setVia(UtilityHashMap.getValueIfExists(nearbyPoints, "indirizzo")); - dto.setProv(UtilityHashMap.getValueIfExists(nearbyPoints, "prov")); - dto.setIndirizzo(UtilityHashMap.getValueIfExists(nearbyPoints, "indirizzo")); - } else { - dto = mapService.reverseGeocode(lat.doubleValue(), lng.doubleValue()); - - StbPosizioni stbPosizioni = new StbPosizioni(); - stbPosizioni.setOperation(OperationType.INSERT); - stbPosizioni.setLat(lat); - stbPosizioni.setLng(lng); - stbPosizioni.setCap(dto.getCap()); - stbPosizioni.setCitta(dto.getCitta()); - stbPosizioni.setIndirizzo(dto.getIndirizzo()); - stbPosizioni.setNazione(dto.getNazione()); - stbPosizioni.setProv(dto.getProv()); - entityProcessor.processEntity(stbPosizioni, multiDBTransactionManager); - - dto.setIdPosizione(stbPosizioni.getId()); - } - - return dto; - - } - public List getRicorrenze(String anno) throws Exception { String sql = "SELECT *, CAST(0 AS BIT) AS isCompleanno\n" + "FROM jtb_ricorrenze\n" +