/// <summary>Seleziona tutte le tariffe transiti e le ritorna dentro una lista di oggetti "TariffaTransito". /// Tenta anche di geolocalizzare i transiti, quelli che non potranno essere convertiti in coordinate non saranno inseriti nella lista.</summary> /// <returns>List</returns> public static List <TXTariffeTransiti> GetTariffeTransiti() { List <TXTariffeTransiti> tariffeTransiti = new List <TXTariffeTransiti>(); Dao dao = new Dao(); string sql = "SELECT * FROM TariffeTransiti"; DataSet data = dao.ExecuteQuery(sql); if (data.Tables.Count > 0) { TXTariffeTransiti tariffaTransito = null; for (int i = 0; i < data.Tables[0].Rows.Count; i++) { tariffaTransito = new TXTariffeTransiti(); tariffaTransito.CreateObject(data.Tables[0].Rows[i]); tariffeTransiti.Add(tariffaTransito); } } return(tariffeTransiti); }
/// <summary>Interroga TXTango, inserisce una nota spesa per ogni transito a pagamento attraversato sul percorso, e ritorna un evento contenente lo stato del viaggio impostato a "CLOSED".</summary> /// <param name="login">L'oggetto login da inviare a TXTango per l'autenticazione della richiesta.</param> /// <returns>Eventi</returns> public Eventi TXGetTransitsReport(TXTango.Login login) { // se non sono presenti le date di inizio e fine viaggio non posso ricavare correttamente i transiti attraversati // (si rischia di registrare nuovamente le spese di un viaggio antecedente). if (this.DataInizio == DateTime.MinValue || this.DataFine == DateTime.MinValue) { throw new Exception("Impossibile ricavare i transiti poichè non sono presenti le date di inizio o fine viaggio. IdViaggio: " + this.Id + " KeyViaggio: " + this.KeyViaggio); } // preparo l'evento da ritornare Eventi evento = new Eventi(); evento.Stato = ConfigurationManager.AppSettings["TXTANGO_STATO_CLOSED"]; evento.SyncStato = ConfigurationManager.AppSettings["TXTEMP_STATO_SINCRONIZZATO"]; evento.SyncData = DateTime.Now; evento.SyncTipo = ConfigurationManager.AppSettings["TXTEMP_FROM_TXTANGO"]; evento.SyncTask = ConfigurationManager.AppSettings["TXTANGO_TASK_GET_TRANSITS"]; // ricavo le tariffe dei transiti List <TXTariffeTransiti> tariffeTransiti = TXTariffeTransiti.GetTariffeTransiti(); // per ogni tariffa controllo se il viaggio ha attraversato il transito nel suo percorso e aggiunto la relativa nota spesa int transitiCalcolati = 0; int erroriGeolocalizzazione = 0; PositionAreaSelection areaSelection = null; ServiceSoapClient service = new ServiceSoapClient(); GetPositionAreaResult result = null; NoteSpese notaSpesa = null; for (int i = 0; i < tariffeTransiti.Count; i++) { // controllo che il tansito sia geolocalizzato try { if (tariffeTransiti[i].GeoCoordinate == "") { tariffeTransiti[i].GeoLocalizzaTransito(); } } catch (GeocodingException ex) { erroriGeolocalizzazione++; // loggo l'errore log.Error(ex.Message, ex); // invio una mail al responsabile del viaggio per avvertirlo che il transito non è geocodificabile Boolean notificationsEnabled = Convert.ToBoolean(ConfigurationManager.AppSettings["ENABLE_EMAIL_NOTIFICATIONS"]); if (notificationsEnabled && this.MailUtenteCompetenza.Trim() != "") { try { List <string> addresses = new List <string>(); addresses.Add(this.MailUtenteCompetenza); string subject = "Errore geolocalizzazione transito."; string body = "<strong>Attenzione:<br/>Si è verificato un errore nel tentativo di geolocalizzare il transito in oggetto.<br/>" + "Si consiglia di verificare e correggere i dati di localizzazione.</strong><br/><br/>" + "DATI TRANSITO:<br/>" + "Nome: " + tariffeTransiti[i].Nome + "<br/>" + "Indirizzo: " + tariffeTransiti[i].Indirizzo + "<br/>" + "Cap: " + tariffeTransiti[i].Cap + "<br/>" + "Citta: " + tariffeTransiti[i].Citta + "<br/>" + "Provincia: " + tariffeTransiti[i].Provincia + "<br/>" + "Nazione: " + tariffeTransiti[i].Nazione + "<br/>" + "Prezzo: " + tariffeTransiti[i].Prezzo + "<br/>" + "Valuta: " + tariffeTransiti[i].Valuta + "<br/>"; Mailer.SendMail(addresses, subject, body); } catch (Exception e) { log.Error(e.Message, e); } } } // chiedo a TXTango se il viaggio ha attraversato il transito if (tariffeTransiti[i].GeoCoordinate != null && tariffeTransiti[i].GeoCoordinate != "") { areaSelection = new PositionAreaSelection(); areaSelection.DateTimeRange = new DateTimeRangeSelection() { StartDate = (DateTime)this.DataInizio, EndDate = this.DataFine }; areaSelection.Driver = new Identifier() { IdentifierType = enumIdentifierType.TRANSICS_ID, Id = this.CodiceAutista }; areaSelection.Vehicle = new IdentifierVehicle() { IdentifierVehicleType = enumIdentifierVehicleType.TRANSICS_ID, Id = this.CodiceMezzo }; double latitude = Convert.ToDouble(tariffeTransiti[i].GeoCoordinate.Split(',')[0].Replace('.', ',')); double longitude = Convert.ToDouble(tariffeTransiti[i].GeoCoordinate.Split(',')[1].Replace('.', ',')); areaSelection.Position = new Position() { Latitude = latitude, Longitude = longitude }; areaSelection.KmsAround = 2; // tolleranza sul geopunto result = service.Get_Position_Area(login, areaSelection); // aggiungo all'evento gli xml di richiesta e risposta evento.XmlRequest += Serializer.SerializeObject(areaSelection, SerializationType.XML); evento.XmlResponse += Serializer.SerializeObject(result, SerializationType.XML); // se il viaggio ha attraversato il transito aggiungo la nota spesa if (result.Errors.Length == 0 && result.DateTime != null) { notaSpesa = new NoteSpese(); notaSpesa.IdViaggio = this.Id; notaSpesa.Indirizzo = tariffeTransiti[i].Indirizzo + ", " + tariffeTransiti[i].Cap + " " + tariffeTransiti[i].Citta + ", " + tariffeTransiti[i].Provincia + " " + tariffeTransiti[i].Nazione; notaSpesa.Tipo = "COST"; notaSpesa.Codice = "Transit"; notaSpesa.Descrizione = ""; notaSpesa.Data = result.DateTime.Value; notaSpesa.GeoCoordinate = tariffeTransiti[i].GeoCoordinate; notaSpesa.Prezzo = tariffeTransiti[i].Prezzo; notaSpesa.Valuta = tariffeTransiti[i].Valuta; notaSpesa.Insert(); log.Debug("transito rilevato: " + tariffeTransiti[i].Indirizzo + ", " + tariffeTransiti[i].Cap + " " + tariffeTransiti[i].Citta + ", " + tariffeTransiti[i].Provincia + " " + tariffeTransiti[i].Nazione); transitiCalcolati++; } else { if (result.Errors.Length > 0) { log.Error("Errore TXTango: " + result.Errors[0].ErrorCode.ToString()); } if (result.DateTime == null) { log.Debug("transito NON rilevato: " + tariffeTransiti[i].Indirizzo + ", " + tariffeTransiti[i].Cap + " " + tariffeTransiti[i].Citta + ", " + tariffeTransiti[i].Provincia + " " + tariffeTransiti[i].Nazione); } } } } // note evento evento.Note = "Individuati " + transitiCalcolati + " transiti a pagamento sul percorso del viaggio. "; if (erroriGeolocalizzazione != 0) { evento.Note += "Attenzione: " + erroriGeolocalizzazione + " transiti non sono geolocalizzabili, non è stato pertanto possibile verificarli ed eventualmente aggiungerli alla nota spese."; } return(evento); }