private async void PollDecoTableFired(object stateInfo)
        {
            if (m_paused)
            {
                return;
            }

            Console.WriteLine("now running Deco...");
            var logger  = new LocationLogger();
            var number  = 0;
            var records = await ReadDecoAsync();

            Console.WriteLine("Found: {0} records", records.ToList().Count);

            foreach (var r in records)
            {
                number++;
                if (null == r)
                {
                    continue;            // we got an exception reading the record
                }
                //sow_Deco_<locationid>_<date>-<time>_<linecount>_<staffid>
                var filename = string.Format("sow_Deco_{0}_{1}_{2}_{3}", r.location_id, r.date_time.ToString("yyyyMMdd-HHmm"), 1, r.courier_id);

                // polly policy goes here
                var retry    = ConfigurationManager.GetEnvironmentVariableInt32($"{nameof(Deco)}Retry", 3);
                var interval = ConfigurationManager.GetEnvironmentVariableInt32($"{nameof(Deco)}Internal", 100);

                var pr = await Policy.Handle <Exception>()
                         .WaitAndRetryAsync(retry, c => TimeSpan.FromMilliseconds(interval * Math.Pow(2, c)))
                         .ExecuteAndCaptureAsync(() =>
                {
                    var text    = r.ToString();
                    var request = new StringContent(text);
                    request.Headers.Add("X-Name", filename);
                    request.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("text/plain");
                    request.Headers.Add("Source", "sow");
                    return(m_client.PostAsync("/api/rts/deco", request));
                });

                if (null != pr.FinalException)
                {
                    logger.Log(new LogEntry(pr.FinalException)
                    {
                        Message = $"Line {number}"
                    });
                    continue;
                }
                var response = pr.Result;
                Console.WriteLine($"\t{r.console_no} : {response.StatusCode}\t");
                logger.Log(new LogEntry {
                    Message = $"Record: {number}({r.id}) , StatusCode: {(int)response.StatusCode}", Severity = Severity.Debug
                });

                if (!response.IsSuccessStatusCode)
                {
                    var warn = new LogEntry
                    {
                        Message  = $"Non success status code record {number}({r.id}), StatusCode: {(int)response.StatusCode}",
                        Severity = Severity.Warning
                    };
                    logger.Log(warn);
                }
                else
                {
                    await DeleteDecoRowAsync(r);
                }
            }

            Console.WriteLine();
            logger.Log(new LogEntry {
                Message = $"Done processing with {number} record(s)", Severity = Severity.Info
            });
        }
        private async void FswChanged(object sender, FileSystemEventArgs e)
        {
            if (m_paused)
            {
                return;
            }

            var file = e.FullPath;
            var wip  = file + ".wip";

            await WaitReadyAsync(file);

            var logger = new LocationLogger();
            var port   = new IposDepositPaymentPort(logger)
            {
                Uri = new Uri(file)
            };

            var fileInfo = new FileInfo(file);

            port.AddHeader("CreationTime", $"{fileInfo.CreationTime:s}");
            port.AddHeader("DirectoryName", fileInfo.DirectoryName);
            port.AddHeader("Exists", $"{fileInfo.Exists}");
            port.AddHeader("Length", $"{fileInfo.Length}");
            port.AddHeader("Extension", fileInfo.Extension);
            port.AddHeader("Attributes", $"{fileInfo.Attributes}");
            port.AddHeader("FullName", fileInfo.FullName);
            port.AddHeader("Name", fileInfo.Name);
            port.AddHeader("LastWriteTime", $"{fileInfo.LastWriteTime:s}");
            port.AddHeader("LastAccessTime", $"{fileInfo.LastAccessTime:s}");
            port.AddHeader("IsReadOnly", $"{fileInfo.IsReadOnly}");
            port.AddHeader("Rx:ApplicationName", "PosEntt");
            port.AddHeader("Rx:LocationName", nameof(IposDepositFileDrop));
            port.AddHeader("Rx:Type", "FolderReceiveLocation");
            port.AddHeader("Rx:MachineName", Environment.GetEnvironmentVariable("COMPUTERNAME"));
            port.AddHeader("Rx:UserName", Environment.GetEnvironmentVariable("USERNAME"));



            File.Move(file, wip);
            await WaitReadyAsync(wip);

            await Task.Delay(100);

            var number  = 0;
            var lines   = File.ReadLines(wip);
            var records = port.Process(lines);

            // now post it to the server
            Console.WriteLine($"Reading file {file}");
            foreach (var r in records)
            {
                number++;
                if (null == r)
                {
                    continue;            // we got an exception reading the record
                }
                // polly policy goes here
                var retry    = ConfigurationManager.GetEnvironmentVariableInt32("IposDepositFileDrop", 3);
                var interval = ConfigurationManager.GetEnvironmentVariableInt32("IposDepositFileDrop", 100);

                var pr = await Policy.Handle <Exception>()
                         .WaitAndRetryAsync(retry, c => TimeSpan.FromMilliseconds(interval * Math.Pow(2, c)))
                         .ExecuteAndCaptureAsync(() =>
                {
                    var request = new StringContent(r.ToJson());
                    request.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
                    return(m_client.PostAsync("/api/ipos-deposit-payments/", request));
                });

                if (null != pr.FinalException)
                {
                    logger.Log(new LogEntry(pr.FinalException)
                    {
                        Message = $"Line {number}"
                    });
                    continue;
                }
                var response = pr.Result;
                Console.Write($"\r{number} : {response.StatusCode}\t");
                logger.Log(new LogEntry {
                    Message = $"Record: {number}({r.Sequence}) , StatusCode: {(int)response.StatusCode}", Severity = Severity.Debug
                });

                if (!response.IsSuccessStatusCode)
                {
                    var warn = new LogEntry
                    {
                        Message  = $"Non success status code record {number}({r.Sequence}), StatusCode: {(int)response.StatusCode}",
                        Severity = Severity.Warning,
                        Details  = $"{fileInfo.FullName}:{number}({r.Sequence})"
                    };
                    logger.Log(warn);
                }
            }


            Console.WriteLine();
            logger.Log(new LogEntry {
                Message = $"Done processing {file} with {number} record(s)", Severity = Severity.Info
            });

            var archivedFolder = ConfigurationManager.GetEnvironmentVariable(nameof(IposDepositFileDrop) + "ArchiveLocation");

            if (!string.IsNullOrWhiteSpace(archivedFolder) && Directory.Exists(archivedFolder))
            {
                File.Move(wip, Path.Combine(archivedFolder, Path.GetFileName(file)));
            }
            else
            {
                File.Delete(wip);
            }
        }