private void WriteLogFile()
        {
            try
            {
                var folder = ExportFolderName + CreationTimeStamp.ToString("yyyy-MM-dd") + "\\";

                if (Directory.Exists(folder) == false)
                {
                    Directory.CreateDirectory(folder);
                }

                var exportFilename = Path.Combine(folder, $"{CreationTimeStamp.ToString("yyyy-MM-dd-HHmm")}_Log.log");

                using (var w = new StreamWriter(exportFilename))
                {
                    foreach (var logEntry in _logEntries)
                    {
                        w.WriteLine(logEntry);
                    }

                    w.Flush();
                }
            }
            catch (Exception e)
            {
                OnLogEventRaised($"Konnte Logdatei nicht schreiben. Fehlermeldung: {e.Message}");
            }
        }
        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);
            }
        }
        private void WriteBaseFile(List <ProffixData> proffixDataList)
        {
            var folder = ExportFolderName + CreationTimeStamp.ToString("yyyy-MM-dd") + "\\";

            if (Directory.Exists(folder) == false)
            {
                Directory.CreateDirectory(folder);
            }

            var exportFilename    = Path.Combine(folder, $"{CreationTimeStamp.ToString("yyyy-MM-dd-HHmm")}_Base.csv");
            var nrOfLinesExported = 0;

            OnLogEventRaised($"Exportiere Basis-Daten in Datei: {exportFilename}");

            using (var w = new StreamWriter(exportFilename))
            {
                var header =
                    "ARP,TYPMO,ACREG,TYPTR,NUMMO,ORIDE,PAX,DATMO,TIMMO,PIMO,TYPPI,DIRDE,CID,CDT,CDM,KEY,Mitgliedernummer,LASTNAME,MTOW,CLUB,HOME_BASE,ORIGINAL_ORIDE,REMARKS";
                w.WriteLine(header);

                foreach (var proffixData in proffixDataList)
                {
                    var sb = new StringBuilder();
                    sb.Append(proffixData.FlightBoxData.Airport);
                    sb.Append(",");
                    sb.Append(proffixData.FlightBoxData.MovementType);
                    sb.Append(",");
                    sb.Append(proffixData.FlightBoxData.Immatriculation);
                    sb.Append(",");
                    sb.Append(proffixData.FlightBoxData.TypeOfTraffic);
                    sb.Append(",");
                    sb.Append(proffixData.FlightBoxData.NrOfMovements);
                    sb.Append(",");
                    sb.Append(proffixData.FlightBoxData.Location);
                    sb.Append(",");
                    sb.Append(proffixData.FlightBoxData.NrOfPassengers);
                    sb.Append(",");
                    sb.Append(proffixData.FlightBoxData.MovementDate);
                    sb.Append(",");
                    sb.Append(proffixData.FlightBoxData.MovementTime);
                    sb.Append(",");
                    sb.Append(proffixData.FlightBoxData.Runway);
                    sb.Append(",");
                    sb.Append(proffixData.FlightBoxData.TypePi);
                    sb.Append(",");
                    sb.Append(proffixData.FlightBoxData.DirectionOfDeparture);
                    sb.Append(",");
                    sb.Append(proffixData.FlightBoxData.CID);
                    sb.Append(",");
                    sb.Append(proffixData.FlightBoxData.CreationDate);
                    sb.Append(",");
                    sb.Append(proffixData.FlightBoxData.CreationTime);
                    sb.Append(",");
                    sb.Append(proffixData.FlightBoxData.Key);
                    sb.Append(",");
                    sb.Append(proffixData.MemberNumber); // using the new mapped member number
                    sb.Append(",");
                    sb.Append(proffixData.FlightBoxData.Lastname);
                    sb.Append(",");
                    sb.Append(proffixData.FlightBoxData.MaxTakeOffWeight);
                    sb.Append(",");
                    sb.Append(proffixData.FlightBoxData.Club);
                    sb.Append(",");
                    if (proffixData.FlightBoxData.IsHomebased)
                    {
                        sb.Append("1");
                    }
                    sb.Append(",");
                    sb.Append(proffixData.FlightBoxData.OriginalLocation);
                    sb.Append(",");
                    sb.Append(proffixData.FlightBoxData.Remarks);
                    w.WriteLine(sb.ToString());
                    nrOfLinesExported++;
                }

                w.Flush();
            }

            OnLogEventRaised($"{nrOfLinesExported} Basis-Daten erfolgreich exportiert.");
        }