示例#1
0
        public void WriteHeader(Prism820Context context, Type820Header header)
        {
            var line = string.Format("SH|{0}|{1}|O|", context.TradingPartnerId, header.TraceReferenceNbr);

            context.AppendLine(line);
            logger.TraceFormat("Wrote 820 \"SH\" PRISM line for Header {0}", header.HeaderKey);
        }
示例#2
0
        public void ParseHeader(Prism820Context context, string[] marketFields)
        {
            var model = new Type820Header
            {
                TotalAmount       = marketFields.AtIndex(4),
                PaymentMethodCode = marketFields.AtIndex(5),
                TransactionDate   = marketFields.AtIndex(13),
                TraceReferenceNbr = marketFields.AtIndex(14),
                TdspName          = marketFields.AtIndex(15),
                TdspDuns          = marketFields.AtIndex(16),
                CrName            = marketFields.AtIndex(17),
                CrDuns            = marketFields.AtIndex(18),
                CreditDebitFlag   = marketFields.AtIndex(19),
            };

            var identifiedMarket = clientDataAccess.IdentifyMarket(model.TdspDuns);

            if (identifiedMarket.HasValue)
            {
                context.SetMarket(identifiedMarket.Value);
            }

            model.MarketId   = context.MarketId;
            model.ProviderId = 1;

            context.PushModel(model);
        }
示例#3
0
        public IMarketFileExportResult[] Export(CancellationToken token)
        {
            var cspDunsPorts = clientDataAccess.ListCspDunsPort();
            var prismPorts   = cspDunsPorts
                               .Where(x => x.ProviderId == 1)
                               .ToArray();

            var context = new Prism820Context();

            foreach (var prismPort in prismPorts)
            {
                if (token.IsCancellationRequested)
                {
                    break;
                }

                var headers = marketDataAccess.ListUnprocessed(prismPort.LdcDuns, prismPort.Duns, 1);
                if (headers.Length == 0)
                {
                    logger.TraceFormat("Zero 820 Prism records found to export for TDSP Duns \"{0}\" and CR Duns \"{1}\".",
                                       prismPort.LdcDuns, prismPort.Duns);
                    continue;
                }

                logger.DebugFormat("Exporting {0} unprocessed 820 record(s) for TDSP Duns \"{1}\" and CR Duns \"{2}\".",
                                   headers.Length, prismPort.LdcDuns, prismPort.Duns);

                foreach (var header in headers)
                {
                    if (!header.HeaderKey.HasValue)
                    {
                        continue;
                    }

                    if (token.IsCancellationRequested)
                    {
                        break;
                    }

                    var headerKey = header.HeaderKey.Value;

                    context.Initialize();

                    var identifiedMarket = clientDataAccess.IdentifyMarket(header.TdspDuns);
                    if (identifiedMarket.HasValue)
                    {
                        context.SetMarket(identifiedMarket.Value);
                    }

                    context.SetFileProperties(prismPort, header.TdspDuns, "PYM");
                    context.SetHeaderId(headerKey);

                    WriteHeader(context, header);
                    WritePayment(context, header);
                    WriteDetail(context, header);
                }
            }

            return(context.Models);
        }
示例#4
0
        public void WriteDetail(Prism820Context context, Type820Header header)
        {
            if (!header.HeaderKey.HasValue)
            {
                return;
            }

            var headerKey = header.HeaderKey.Value;
            var details   = marketDataAccess.ListDetails(headerKey);

            if (details == null || details.Length == 0)
            {
                return;
            }

            foreach (var detail in details)
            {
                if (!detail.DetailKey.HasValue)
                {
                    continue;
                }

                var premiseNumber = IdentifyEsiId(context, detail);
                var membershipId  = IdentifyLdcAccountNumber(context, detail);

                var line = string.Format("20|{0}|{5}||{1}|||||{2}||||{3}|||{4}|", context.TradingPartnerId,
                                         detail.PaymentAmount, detail.CrossReferenceNbr, detail.ReferenceNbr, premiseNumber, membershipId);

                context.AppendLine(line);
                logger.TraceFormat("Wrote 820 \"20\" PRISM line for Header {0}", header.HeaderKey);
            }
        }
示例#5
0
        public string IdentifyEsiId(Prism820Context context, Type820Detail detail)
        {
            if (context.Market == MarketOptions.Maryland)
            {
                return(string.Empty);
            }

            return(detail.EsiId);
        }
示例#6
0
        public void WritePayment(Prism820Context context, Type820Header header)
        {
            var partnerId = context.TradingPartnerId;
            var stateId   = partnerId.Substring(3, 2);

            var line = string.Format("01|{0}|{1}|{2}|{3}|{4}||||||||{5}|{6}|{7}|{8}|{9}|{10}|{11}||||", partnerId,
                                     stateId, header.TransactionTypeCode, header.TotalAmount, header.PaymentMethodCode,
                                     header.TransactionDate, header.TraceReferenceNbr, header.CrName, header.CrDuns, header.TdspName,
                                     header.TdspDuns, header.CreditDebitFlag);

            context.AppendLine(line);
            logger.TraceFormat("Wrote 820 \"01\" PRISM line for Header {0}", header.HeaderKey);
        }
示例#7
0
        public string IdentifyLdcAccountNumber(Prism820Context context, Type820Detail detail)
        {
            if (context.Market == MarketOptions.Maryland)
            {
                return(detail.EsiId);
            }

            // original code has Util.GetString(dr, "MembershipID")
            // which is a column that was not found in the 820 Detail table
            // the "Util" call would result in an empty string being
            // returned

            return(string.Empty);
        }
示例#8
0
        public IMarketFileParseResult Parse(Stream stream)
        {
            var context = new Prism820Context();

            using (var reader = new StreamReader(stream))
            {
                string marketFileLine;
                while ((marketFileLine = reader.ReadLine()) != null)
                {
                    ParseLine(context, marketFileLine);
                }
            }

            if (context.ShouldResolve)
            {
                logger.Warn("Unresolved data identified after parsing 820. Transactions may not be completed.");
                context.ResolveToHeader();
            }

            return(context.Results);
        }
示例#9
0
        public void ParseDetail(Prism820Context context, string[] marketFields)
        {
            var current = context.Current;

            if (current == null || current.ModelType != Type820Types.Header)
            {
                throw new InvalidOperationException();
            }

            var header = current as Type820Header;

            if (header == null)
            {
                throw new InvalidOperationException();
            }

            var model = new Type820Detail
            {
                ReferenceNbr         = marketFields.AtIndex(2),
                PaymentActionCode    = marketFields.AtIndex(3),
                PaymentAmount        = marketFields.AtIndex(4),
                AdjustmentReasonCode = marketFields.AtIndex(5),
                AdjustmentAmount     = marketFields.AtIndex(6),
            };

            if (context.Market == MarketOptions.Maryland)
            {
                marketFields.TryAtIndex(11, x => model.CrossReferenceNbr = x);
                marketFields.TryAtIndex(2, x => model.EsiId = x);
            }
            else
            {
                marketFields.TryAtIndex(9, x => model.CrossReferenceNbr = x);
                marketFields.TryAtIndex(16, x => model.EsiId            = x);
            }

            header.AddDetail(model);
        }
示例#10
0
        public void ParseLine(Prism820Context context, string line)
        {
            if (string.IsNullOrWhiteSpace(line))
            {
                return;
            }

            if (line.Length < 2)
            {
                return;
            }

            var indicator    = line.Substring(0, 2);
            var marketFields = line.Split('|');

            switch (indicator)
            {
            case "SH":
                context.ResolveToHeader();
                context.Initialize();
                context.TransactionActualCount++;
                break;

            case "01":
                ParseHeader(context, marketFields);
                break;

            case "20":
                ParseDetail(context, marketFields);
                break;

            case "TL":
                context.ResolveToHeader();
                marketFields.TryAtIndexInt(1, x => context.TransactionAuditCount = x);
                break;
            }
        }