Пример #1
0
        public void ExportFlightNetUsers()
        {
            try
            {
                using (var client = new HttpClient())
                {
                    OnLogEventRaised("Verbinde mit FlightNet...");
                    Thread.Sleep(50);
                    //http://www.flightnet.aero/manual/index.html?abouttheapi.htm
                    var uri = "https://www.flightnet.aero/api/getusers.ashx";
                    client.BaseAddress = new Uri("https://www.flightnet.aero/api/");

                    var apiUri =
                        $"getusers.ashx?company={FlightNetCompanyName}&username={ApiUserName}&password={ApiPassword}&includedeleted=false";
                    var request = client.GetAsync(apiUri)
                                  .ContinueWith(res =>
                    {
                        OnLogEventRaised("Lade Daten...");
                        Thread.Sleep(50);
                        var result = res.Result;
                        if (result.IsSuccessStatusCode)
                        {
                            Thread.Sleep(50);
                            OnLogEventRaised("Daten erfolgreich heruntergeladen. Exportiere Daten...");

                            var readData = result.Content.ReadAsStringAsync();
                            readData.Wait();

                            var array = readData.Result.Split(new string[] { Environment.NewLine },
                                                              StringSplitOptions.RemoveEmptyEntries);

                            var correctNumberOfColumns = 31;
                            List <string> headers      = new List <string>();
                            var indexUserName          = -1;
                            var indexLastName          = -1;
                            var indexFirstName         = -1;
                            var indexPhoneMobile       = -1;
                            var numberOfLines          = 0;

                            using (var w = new StreamWriter(ExportFileName, false, Encoding.UTF8))
                            {
                                foreach (var line in array)
                                {
                                    char[] delimiter = new char[] { '\t' };
                                    var splittedLine = line.Split(delimiter).ToList();

                                    if (splittedLine.Count() == 2)
                                    {
                                        if (splittedLine[0] == "206")
                                        {
                                            HasExportError     = true;
                                            ExportErrorMessage = splittedLine[1];
                                            OnLogEventRaised($"Fehler beim Exportieren!");
                                            OnLogEventRaised($"Fehler: {ExportErrorMessage}");
                                            ExportFinished?.Invoke(this, EventArgs.Empty);
                                            break;
                                        }
                                    }

                                    if (splittedLine.FindIndex(x => x.StartsWith("UserName")) >= 0 &&
                                        splittedLine.FindIndex(x => x.StartsWith("LastName")) >= 0 &&
                                        splittedLine.FindIndex(x => x.StartsWith("FirstName")) >= 0 &&
                                        splittedLine.FindIndex(x => x.StartsWith("PhoneMobile")) >= 0)
                                    {
                                        headers = splittedLine;
                                        correctNumberOfColumns = splittedLine.Count;
                                        w.WriteLine("UserName,LastName,FirstName,PhoneMobile");
                                        indexUserName    = headers.FindIndex(x => x.StartsWith("UserName"));
                                        indexLastName    = headers.FindIndex(x => x.StartsWith("LastName"));
                                        indexFirstName   = headers.FindIndex(x => x.StartsWith("FirstName"));
                                        indexPhoneMobile = headers.FindIndex(x => x.StartsWith("PhoneMobile"));
                                        continue;
                                    }

                                    if (splittedLine.Count == correctNumberOfColumns &&
                                        headers.Count == correctNumberOfColumns)
                                    {
                                        var username  = splittedLine[indexUserName];
                                        var lastname  = splittedLine[indexLastName];
                                        var firstname = splittedLine[indexFirstName];
                                        var phone     = splittedLine[indexPhoneMobile];

                                        w.WriteLine($"{username},{lastname},{firstname},{phone}");
                                        numberOfLines++;
                                    }
                                }

                                w.Flush();

                                if (numberOfLines == 0)
                                {
                                    HasExportError     = true;
                                    ExportErrorMessage = "Keine Datensätze exportiert. Allenfalls fehlerhafte Verbindungsdaten zu FlightNet.";
                                }

                                OnLogEventRaised($"{numberOfLines} Datensätze aus FlightNet exportiert.");
                                ExportFinished?.Invoke(this, EventArgs.Empty);
                            }
                        }
                        else
                        {
                            OnLogEventRaised("Fehler in der Verbindung zu FlightNet. Kann Daten nicht exportieren.");
                        }
                    });

                    request.Wait();
                }
            }
            catch (Exception e)
            {
                HasExportError     = true;
                ExportErrorMessage = e.Message;
                OnLogEventRaised("Fehler beim Exportieren..." + Environment.NewLine + "Fehlermeldung: " + e.Message);
                ExportFinished?.Invoke(this, EventArgs.Empty);
            }
        }
        public void Convert()
        {
            try
            {
                ExportErrorMessage = string.Empty;
                HasExportError     = false;

                //loading proffix address numbers from database
                var nrOfAddressesFromProffixRead = _dataManager.ReadProffixDatabase();

                if (ImportFileName.ToLower().EndsWith(".csv") == false)
                {
                    var directory = new DirectoryInfo(ImportFileName);
                    var lastFile  = directory.GetFiles().OrderByDescending(f => f.LastWriteTime).FirstOrDefault();

                    if (lastFile == null)
                    {
                        OnLogEventRaised("Konnte keine aktuelle Datei zum Importieren finden!");
                        throw new ApplicationException($"Konnte keine aktuelle Datei zum Importieren in Verzeichnis {ImportFileName} finden!");
                    }

                    ImportFileName = lastFile.FullName;
                    OnLogEventRaised($"Verwende Datei: {ImportFileName}");
                }

                _logEntries = new List <string>();
                var flightBoxDataList = ReadFile();
                var proffixDataList   = new List <ProffixData>();
                CreationTimeStamp = DateTime.Now;

                OnLogEventRaised("Bereinige Basis-Daten...");

                if (Settings.Default.ReadProffixDbData)
                {
                    OnLogEventRaised($"Mitgliedernummern werden anhand der Proffix-Datenbank überprüft. {nrOfAddressesFromProffixRead} Adressen aus Proffix geladen.");
                }
                else
                {
                    OnLogEventRaised("Proffix-Datenbank wird für die Mitgliedernummer-Prüfung nicht verwendet!");
                }

                foreach (var flightBoxData in flightBoxDataList)
                {
                    var proffixData = new ProffixData(flightBoxData);

                    //check movement date within the valid import range
                    //we won't import old movement data into proffix
                    var minMovementDate = new DateTime(DateTime.Now.AddMonths(-1).Year, DateTime.Now.AddMonths(-1).Month, 1);

                    if (flightBoxData.MovementDateTime < minMovementDate)
                    {
                        // found movement older than the previous months
                        flightBoxData.IsOlderMovementDate = true;
                        OnLogEventRaised(
                            $"Alte Flugbewegung gefunden vom {flightBoxData.MovementDateTime.ToShortDateString()} (Zeile: {flightBoxData.LineNumber}).");

                        if (_ignoreDateRange == false)
                        {
                            ExportErrorMessage = "Alte Flugbewegung wurde gefunden und Warnung bei alten Daten darf nicht ignoriert werden. Verarbeitung wird abgebrochen.";
                            HasExportError     = true;
                            WriteLogFile();
                            ExportFinished?.Invoke(this, EventArgs.Empty);
                            return;
                        }
                    }

                    // try to find MemberNumber based on name if no MemberNumber is set
                    if (string.IsNullOrWhiteSpace(flightBoxData.MemberNumber) || flightBoxData.MemberNumber == "000000")
                    {
                        if (_dataManager.FindLastnameAndSetMemberNumber(proffixData))
                        {
                            OnLogEventRaised(
                                $"MemberNumber {proffixData.MemberNumber} für {flightBoxData.Lastname} mit {flightBoxData.Immatriculation} gesetzt (Zeile: {flightBoxData.LineNumber}).");
                        }
                    }

                    // set MemberNumber based on immatriculation
                    if (_dataManager.FindImmatriculationAndMapMemberNumber(proffixData))
                    {
                        OnLogEventRaised($"Setze spezielle Mitgliedernummer für {proffixData.FlightBoxData.Immatriculation} (Zeile: {flightBoxData.LineNumber}): Alte Mitgliedernummer {proffixData.FlightBoxData.MemberNumber}, neue Mitgliedernummer {proffixData.MemberNumber}");
                    }

                    if (Settings.Default.ReadProffixDbData && _dataManager.FindMemberNumberInProffix(proffixData) == false)
                    {
                        OnLogEventRaised($"Mitgliedernummer {proffixData.MemberNumber} für {proffixData.FlightBoxData.Lastname} mit {proffixData.FlightBoxData.Immatriculation} in Proffix-Datenbank nicht gefunden (Zeile: {flightBoxData.LineNumber})");
                    }

                    proffixDataList.Add(proffixData);
                }

                Thread.Sleep(50);

                WriteBaseFile(proffixDataList);

                Thread.Sleep(50);

                foreach (var proffixData in proffixDataList)
                {
                    if (_dataManager.IsNoLdgTaxMember(proffixData))
                    {
                        proffixData.FlightBoxData.IgnoreLandingTax = true;
                    }

                    if (proffixData.MemberNumber == "999605" &&
                        proffixData.FlightBoxData.TypeOfTraffic == (int)TypeOfTraffic.Instruction)
                    {
                        // Heli Sitterdorf is always private tax not training
                        proffixData.FlightBoxData.TypeOfTraffic = (int)TypeOfTraffic.Private;
                    }

                    if ((proffixData.MemberNumber == "999998" || proffixData.MemberNumber == "383909") &&
                        proffixData.FlightBoxData.TypeOfTraffic == (int)TypeOfTraffic.Instruction)
                    {
                        // Stoffel Aviation is external on instruction
                        proffixData.FlightBoxData.IsHomebased = false;
                    }

                    //TODO: Handle maintenance flights from Seiferle

                    // filtering for tow flights and departure movements are handled within the FlightBoxData class directly

                    if (string.IsNullOrWhiteSpace(proffixData.MemberNumber) || proffixData.MemberNumber == "000000")
                    {
                        proffixData.MemberNumberInProffixNotFound = true;

                        ExportErrorMessage +=
                            $"{Environment.NewLine}Fehlerhafte MemberNumber {proffixData.MemberNumber} für {proffixData.FlightBoxData.Lastname} mit {proffixData.FlightBoxData.Immatriculation} gefunden (Zeile: {proffixData.FlightBoxData.LineNumber}).";
                        OnLogEventRaised(
                            $"Fehlerhafte MemberNumber {proffixData.MemberNumber} für {proffixData.FlightBoxData.Lastname} mit {proffixData.FlightBoxData.Immatriculation} gefunden (Zeile: {proffixData.FlightBoxData.LineNumber}).");
                    }

                    CalculateLandingTax(proffixData);
                }

                if (HasExportError)
                {
                    WriteLogFile();
                    ExportFinished?.Invoke(this, EventArgs.Empty);
                    return;
                }

                Thread.Sleep(50);
                OnLogEventRaised(string.Empty);
                var folder         = Path.Combine(ExportFolderName, CreationTimeStamp.ToString("yyyy-MM-dd"));
                var exportFilename = Path.Combine(folder, $"{CreationTimeStamp.ToString("yyyy-MM-dd-HHmm")}_LdgTaxes_without_Remarks (to Import in Proffix).csv");
                var listToExport   = proffixDataList.Where(x => x.FlightBoxData.IsDepartureMovement == false &&
                                                           x.FlightBoxData.IsMaintenanceFlight == false &&
                                                           x.FlightBoxData.IsTowFlight == false &&
                                                           x.FlightBoxData.IgnoreLandingTax == false &&
                                                           string.IsNullOrWhiteSpace(x.FlightBoxData.Remarks) &&
                                                           x.MemberNumberInProffixNotFound == false)
                                     .ToList();

                if (listToExport.Any())
                {
                    OnLogEventRaised($"Exportiere Proffix-Daten ohne Bemerkungen in Datei: {exportFilename}");
                    var exporter = new ProffixDataCsvExporter(exportFilename, listToExport);
                    exporter.Export();
                    OnLogEventRaised(
                        $"{exporter.NumberOfLinesExported} Proffix-Daten ohne Bemerkungen erfolgreich exportiert.");
                }
                else
                {
                    OnLogEventRaised(
                        $"Keine Proffix-Daten ohne Bemerkungen exportiert. Datei: {exportFilename} wurde nicht erzeugt!");
                }

                Thread.Sleep(50);
                OnLogEventRaised(string.Empty);

                exportFilename = Path.Combine(folder, $"{CreationTimeStamp.ToString("yyyy-MM-dd-HHmm")}_LdgTaxes_With_MemberNumberNotFound_Error (to correct and Import in Proffix).csv");
                listToExport   = proffixDataList.Where(x => x.FlightBoxData.IsDepartureMovement == false &&
                                                       x.FlightBoxData.IsMaintenanceFlight == false &&
                                                       x.FlightBoxData.IsTowFlight == false &&
                                                       x.FlightBoxData.IgnoreLandingTax == false &&
                                                       x.MemberNumberInProffixNotFound)
                                 .ToList();

                if (listToExport.Any())
                {
                    OnLogEventRaised($"Exportiere Proffix-Daten mit fehlerhaften Mitgliedernummern in Datei: {exportFilename}");
                    var exporter = new ProffixDataCsvExporter(exportFilename, listToExport);
                    exporter.Export();
                    OnLogEventRaised(
                        $"{exporter.NumberOfLinesExported} Proffix-Daten mit fehlerhaften Mitgliedernummern erfolgreich exportiert.");
                }
                else
                {
                    OnLogEventRaised(
                        $"Keine Proffix-Daten mit fehlerhaften Mitgliedernummern exportiert. Datei: {exportFilename} wurde nicht erzeugt!");
                }

                Thread.Sleep(50);
                OnLogEventRaised(string.Empty);

                exportFilename = Path.Combine(folder, $"{CreationTimeStamp.ToString("yyyy-MM-dd-HHmm")}_LdgTaxes_with_Remarks (to check and import in Proffix).csv");
                listToExport   = proffixDataList.Where(x => x.FlightBoxData.IsDepartureMovement == false &&
                                                       x.FlightBoxData.IsMaintenanceFlight == false &&
                                                       x.FlightBoxData.IsTowFlight == false &&
                                                       x.FlightBoxData.IgnoreLandingTax == false &&
                                                       string.IsNullOrWhiteSpace(x.FlightBoxData.Remarks) == false &&
                                                       x.MemberNumberInProffixNotFound == false)
                                 .ToList();

                if (listToExport.Any())
                {
                    OnLogEventRaised(
                        $"Exportiere Daten mit Bemerkungen zur Prüfung und Importieren in Proffix in Datei: {exportFilename}");
                    var exporter = new ProffixDataCsvExporter(exportFilename, listToExport);
                    exporter.Export();
                    OnLogEventRaised(
                        $"{exporter.NumberOfLinesExported} Daten mit Bemerkungen zur Prüfung und Importieren in Proffix erfolgreich exportiert.");
                }
                else
                {
                    OnLogEventRaised(
                        $"Keine Daten mit Bemerkungen zur Prüfung und Importieren in Proffix exportiert. Datei: {exportFilename} wurde nicht erzeugt!");
                }

                Thread.Sleep(50);
                OnLogEventRaised(string.Empty);

                exportFilename = Path.Combine(folder, $"{CreationTimeStamp.ToString("yyyy-MM-dd-HHmm")}_No_LdgTaxes_without_Remarks (not to import).csv");
                listToExport   = proffixDataList.Where(x => (x.FlightBoxData.IsMaintenanceFlight ||
                                                             x.FlightBoxData.IsTowFlight ||
                                                             x.FlightBoxData.IgnoreLandingTax) &&
                                                       string.IsNullOrWhiteSpace(x.FlightBoxData.Remarks))
                                 .ToList();

                if (listToExport.Any())
                {
                    OnLogEventRaised($"Exportiere Nicht-Proffix-Daten ohne Bemerkungen in Datei: {exportFilename}");
                    var exporter = new ProffixDataCsvExporter(exportFilename, listToExport);
                    exporter.Export();
                    OnLogEventRaised(
                        $"{exporter.NumberOfLinesExported} Nicht-Proffix-Daten ohne Bemerkungen erfolgreich exportiert.");
                }
                else
                {
                    OnLogEventRaised(
                        $"Keine Nicht-Proffix-Daten ohne Bemerkungen exportiert. Datei: {exportFilename} wurde nicht erzeugt!");
                }

                Thread.Sleep(50);
                OnLogEventRaised(string.Empty);

                exportFilename = Path.Combine(folder, $"{CreationTimeStamp.ToString("yyyy-MM-dd-HHmm")}_No_LdgTaxes_with_Remarks (to check and NO import in Proffix).csv");
                listToExport   = proffixDataList.Where(x => (x.FlightBoxData.IsMaintenanceFlight ||
                                                             x.FlightBoxData.IsTowFlight ||
                                                             x.FlightBoxData.IgnoreLandingTax) &&
                                                       string.IsNullOrWhiteSpace(x.FlightBoxData.Remarks) == false)
                                 .ToList();

                if (listToExport.Any())
                {
                    OnLogEventRaised(
                        $"Exportiere Daten mit Bemerkungen zur Prüfung und NICHT importieren in Proffix in Datei: {exportFilename}");
                    var exporter = new ProffixDataCsvExporter(exportFilename, listToExport);
                    exporter.Export();
                    OnLogEventRaised(
                        $"{exporter.NumberOfLinesExported} Daten mit Bemerkungen zur Prüfung und NICHT importieren in Proffix erfolgreich exportiert.");
                }
                else
                {
                    OnLogEventRaised(
                        $"Keine Daten mit Bemerkungen zur Prüfung und NICHT importieren in Proffix exportiert. Datei: {exportFilename} wurde nicht erzeugt!");
                }

                Thread.Sleep(50);
                OnLogEventRaised(string.Empty);

                exportFilename = Path.Combine(folder, $"{CreationTimeStamp.ToString("yyyy-MM-dd-HHmm")}_Heli Sitterdorf.csv");
                listToExport   = proffixDataList.Where(x => x.MemberNumber == "999605" && x.FlightBoxData.IsDepartureMovement == false)
                                 .ToList();

                if (listToExport.Any())
                {
                    OnLogEventRaised($"Exportiere Daten für Heli Sitterdorf in Datei: {exportFilename}");
                    var reportExporter = new ReportExporter(exportFilename, listToExport);
                    reportExporter.Export();
                    OnLogEventRaised(
                        $"{reportExporter.NumberOfLinesExported} Daten für Heli Sitterdorf erfolgreich exportiert.");
                }
                else
                {
                    OnLogEventRaised(
                        $"Keine Daten für Heli Sitterdorf exportiert. Datei: {exportFilename} wurde nicht erzeugt!");
                }

                Thread.Sleep(50);
                OnLogEventRaised(string.Empty);

                exportFilename = Path.Combine(folder, $"{CreationTimeStamp.ToString("yyyy-MM-dd-HHmm")}_Skydive.csv");
                listToExport   = proffixDataList.Where(x => x.MemberNumber == "703100" && x.FlightBoxData.IsDepartureMovement == false)
                                 .ToList();

                if (listToExport.Any())
                {
                    OnLogEventRaised($"Exportiere Daten für Skydive in Datei: {exportFilename}");
                    var reportExporter = new ReportExporter(exportFilename, listToExport);
                    reportExporter.Export();
                    OnLogEventRaised(
                        $"{reportExporter.NumberOfLinesExported} Daten für Skydive erfolgreich exportiert.");
                }
                else
                {
                    OnLogEventRaised(
                        $"Keine Daten für Skydive exportiert. Datei: {exportFilename} wurde nicht erzeugt!");
                }

                Thread.Sleep(50);
                OnLogEventRaised(string.Empty);

                exportFilename = Path.Combine(folder, $"{CreationTimeStamp.ToString("yyyy-MM-dd-HHmm")}_Swiss oldies.csv");
                listToExport   = proffixDataList.Where(x => x.MemberNumber == "28" && x.FlightBoxData.IsDepartureMovement == false)
                                 .ToList();

                if (listToExport.Any())
                {
                    OnLogEventRaised($"Exportiere Daten für Swiss oldies in Datei: {exportFilename}");
                    var reportExporter = new ReportExporter(exportFilename, listToExport);
                    reportExporter.Export();
                    OnLogEventRaised(
                        $"{reportExporter.NumberOfLinesExported} Daten für Swiss oldies erfolgreich exportiert.");
                }
                else
                {
                    OnLogEventRaised(
                        $"Keine Daten für Swiss oldies exportiert. Datei: {exportFilename} wurde nicht erzeugt!");
                }

                Thread.Sleep(50);

                WriteLogFile();

                Thread.Sleep(50);

                ExportFinished?.Invoke(this, EventArgs.Empty);
            }
            catch (Exception e)
            {
                HasExportError     = true;
                ExportErrorMessage = e.Message;
                OnLogEventRaised("Fehler beim Convertieren..." + Environment.NewLine + "Fehlermeldung: " + e.Message);
                ExportFinished?.Invoke(this, EventArgs.Empty);
            }
        }