示例#1
0
        public static string BuildFAFMessage(int merchantId, DateTime xctPostingDate)
        {
            string response = string.Empty;

            var merchant = MongoDBContext.FindMerchantById(merchantId);
            var merchantDailyActivity = MongoDBContext.FindMerchantDailyActivity(merchantId, xctPostingDate);

            if (merchantDailyActivity == null)
            {
                merchantDailyActivity = new MerchantDailyActivityMBE()
                {
                    merchant_id = merchantId, xct_posting_date = xctPostingDate
                };
                MongoDBContext.InsertMerchantDailyActivity(merchantDailyActivity);
            }

            if (!merchantDailyActivity.is_fast_access_funding_enabled.HasValue ||
                !merchantDailyActivity.is_fast_access_funding_enabled.Value)
            {
                response = $"Reply CONFIRM to have today's settlement deposited into debit card account ending in {merchant.setup_options.debit_card_no.Right(4)} tomorrow morning upon batch close.";
            }
            else
            {
                response = $"Reply UNDO to NOT use Fast Access Funding for today's settlement and have it deposited on the normal schedule.";
            }

            return(response);
        }
示例#2
0
        public static string BuildReturnsSummaryMessage(int merchantId, DateTime xctPostingDate)
        {
            StringBuilder sb = new StringBuilder();

            sb.AppendLine($"Merchant Account Summary as of {DateTime.Now.ToString("ddd MMM dd, yyyy h:mm tt")}");
            sb.AppendLine();
            sb.AppendLine($"Returns:");

            var merchantActivity = MongoDBContext.FindMerchantDailyActivity(merchantId, xctPostingDate);

            if (merchantActivity != null && merchantActivity.transactions != null && merchantActivity.transactions.Count() > 0)
            {
                var refundXcts = merchantActivity.transactions
                                 .Where(x => x.xct_type == Enums.TRANSACTION_TYPE.credit_return).ToList();


                if (refundXcts != null && refundXcts.Count() > 0)
                {
                    sb.AppendLine($"{refundXcts.Sum(x => x.xct_amount):C}  [{refundXcts.Count()} txns]");
                }
                else
                {
                    sb.AppendLine($"$0.00 [0 txns]");
                    //sb.AppendLine(@"There are no refunds yet today.");
                }
            }
            else
            {
                sb.AppendLine($"$0.00 [0 txns]");
                //sb.AppendLine(@"There are no activity yet today.");
            }

            return(sb.ToString());
        }
示例#3
0
        public static string BuildConfirmFAFMessage(int merchantId, DateTime xctPostingDate)
        {
            string response = string.Empty;

            var merchantDailyActivity = MongoDBContext.FindMerchantDailyActivity(merchantId, xctPostingDate);

            if (merchantDailyActivity == null)
            {
                merchantDailyActivity = new MerchantDailyActivityMBE()
                {
                    merchant_id = merchantId, xct_posting_date = xctPostingDate
                };
                MongoDBContext.InsertMerchantDailyActivity(merchantDailyActivity);
            }

            if (!merchantDailyActivity.is_fast_access_funding_enabled.HasValue ||
                !merchantDailyActivity.is_fast_access_funding_enabled.Value)
            {
                response = @"Funds for the Final Settlement amount will now be deposited via FastAccess tomorrow morning.";

                merchantDailyActivity.is_fast_access_funding_enabled = true;
                MongoDBContext.UpdateMerchantDailyActivity(merchantDailyActivity);
            }
            else
            {
                response = @"Funds for the Final Settlement amount are already set to be deposited via FastAccess tomorrow morning.";
            }

            return(response);
        }
示例#4
0
        public static string BuildUndoFAFMessage(int merchantId, DateTime xctPostingDate)
        {
            string response = string.Empty;

            var merchantDailyActivity = MongoDBContext.FindMerchantDailyActivity(merchantId, xctPostingDate);

            if (merchantDailyActivity == null)
            {
                merchantDailyActivity = new MerchantDailyActivityMBE()
                {
                    merchant_id = merchantId, xct_posting_date = xctPostingDate
                };
                MongoDBContext.InsertMerchantDailyActivity(merchantDailyActivity);
            }

            if (!merchantDailyActivity.is_fast_access_funding_enabled.HasValue ||
                !merchantDailyActivity.is_fast_access_funding_enabled.Value)
            {
                response = @"Funds for this Final Settlement amount are already set Not to use Fast Access Funding.";
            }
            else
            {
                response = @"Funds for this Final Settlement amount will Not use Fast Access Funding and will be deposited on the normal date.";

                var merchantActivity = MongoDBContext.FindMerchantDailyActivity(merchantId, xctPostingDate);
                merchantActivity.is_fast_access_funding_enabled = false;
                MongoDBContext.UpdateMerchantDailyActivity(merchantActivity);
            }

            return(response);
        }
示例#5
0
        public void TestFindMerchantDailyActivity()
        {
            int      merchant_id      = _merchantTestsGlobal.MERCHANT_ID;
            DateTime xct_posting_date = _merchantTestsGlobal.XCT_POSTING_DATE;

            var merchantActivity = MongoDBContext.FindMerchantDailyActivity(merchant_id, xct_posting_date);

            Assert.NotNull(merchantActivity);
            Assert.Equal(merchant_id, merchantActivity.merchant_id);
            // local time is converted to utc when store to mongo
            Assert.Equal(xct_posting_date, merchantActivity.xct_posting_date);
        }
示例#6
0
        public static void GenerateChargebacksXcts(int merchantId)
        {
            DateTime xctPostingDate = DateTime.Today;

            // get merchant metadata (MDB ??)
            var merchant = MongoDBContext.FindMerchantById(merchantId);

            #region Optionally Create MerchantDailyActivity record (if reqd)
            var merchantActivity = MongoDBContext.FindMerchantDailyActivity(merchantId, xctPostingDate);

            if (merchantActivity == null)
            {
                merchantActivity = new MerchantDailyActivityMBE()
                {
                    merchant_id      = merchantId,
                    xct_posting_date = xctPostingDate
                };

                MongoDBContext.InsertMerchantDailyActivity(merchantActivity);
            }
            #endregion

            int    xctCntToGenerate   = new Random().Next(1, 2);
            Random amountGenerator    = new Random();
            Random deltaDaysGenerator = new Random();

            var transactions = new List <TransactionMBE>();

            // create a random # of purchase xcts
            for (int loopCtr = 1; loopCtr <= xctCntToGenerate; loopCtr++)
            {
                int deltaDays = -1 * deltaDaysGenerator.Next(1, 3); // creates a number between 1 and 12

                DateTime xctDate = DateTime.Now.AddDays(deltaDays);

                transactions.Add(new TransactionMBE()
                {
                    terminal_id = merchant.terminals.OrderBy(t => Guid.NewGuid()).First().terminal_id,
                    card_data   = _paymentCards.OrderBy(t => Guid.NewGuid()).First(),
                    xct_amount  = Math.Round(new decimal(amountGenerator.NextDouble() * -50.0), 2),
                    xct_dt      = xctDate,
                    xct_id      = Guid.NewGuid(),
                    xct_type    = Enums.TRANSACTION_TYPE.chargeback
                });
            }

            // store xcts
            MongoDBContext.UpsertMerchantDailyActivity(merchantId, xctPostingDate, transactions);
        }
示例#7
0
        public static string BuildChargebackDetails(int merchantId, DateTime xctPostingDate)
        {
            StringBuilder sb = new StringBuilder();

            sb.AppendLine($"Pending Chargeback Details as of {DateTime.Now.ToString("ddd MMM dd, yyyy h:mm tt")}");
            sb.AppendLine(@"---------------------");

            var merchantActivity = MongoDBContext.FindMerchantDailyActivity(merchantId, xctPostingDate);

            if (merchantActivity != null && merchantActivity.transactions != null && merchantActivity.transactions.Count() > 0)
            {
                var chargebackXcts = merchantActivity.transactions
                                     .Where(x => x.xct_type == Enums.TRANSACTION_TYPE.chargeback).ToList();

                if (chargebackXcts != null)
                {
                    int chargebackCount = 0;
                    foreach (var chargebackXct in chargebackXcts)
                    {
                        chargebackCount++;

                        if (chargebackCount > 1)
                        {
                            sb.AppendLine("\n");
                        }

                        DateTime dueDate = chargebackXct.xct_dt.AddDays(3);

                        sb.AppendLine($"{chargebackXct.xct_amount:C} [Card (Last 4): {chargebackXct.card_data.primary_account_no.Right(4)}] Respond By: {dueDate.ToString("ddd MMM dd, yyyy")}");
                    }
                    sb.AppendLine(@"=====================");
                    sb.AppendLine($"Total: {chargebackXcts.Sum(x => x.xct_amount):C}  Qty: {chargebackCount}");
                    sb.AppendLine($"  To respond to your Chargebacks, go to IQ: {GeneralConstants.CHARGEBACK_URL}");
                }
                else
                {
                    sb.AppendLine($"$0.00 [0 txns]");
                    //sb.AppendLine(@"There are no outstanding chargebacks.");
                }
            }
            else
            {
                //sb.AppendLine($"$0.00 [0 txns]");
                sb.AppendLine(@"You have no pending chargebacks!");
            }

            return(sb.ToString());
        }
示例#8
0
        /// <summary>
        /// Create and store a set of random transactions on the specified merchant
        /// </summary>
        /// <remarks>
        /// Used to drive demos
        /// </remarks>
        public static void GenerateRandomPurchaseXcts(int merchantId)
        {
            DateTime xctPostingDate = DateTime.Today;

            // get merchant metadata (MDB ??)
            var merchant = MongoDBContext.FindMerchantById(merchantId);

            #region Optionally Create MerchantDailyActivity record (if reqd)
            var merchantActivity = MongoDBContext.FindMerchantDailyActivity(merchantId, xctPostingDate);

            if (merchantActivity == null)
            {
                merchantActivity = new MerchantDailyActivityMBE()
                {
                    merchant_id      = merchantId,
                    xct_posting_date = xctPostingDate
                };

                MongoDBContext.InsertMerchantDailyActivity(merchantActivity);
            }
            #endregion

            int    xctCntToGenerate = new Random().Next(5, 25);
            Random amountGenerator  = new Random();

            var transactions = new List <TransactionMBE>();

            // create a random # of purchase xcts
            for (int loopCtr = 1; loopCtr <= xctCntToGenerate; loopCtr++)
            {
                int cardPresentIndicator = new Random().Next(1, 100);

                transactions.Add(new TransactionMBE()
                {
                    terminal_id = merchant.terminals.OrderBy(t => Guid.NewGuid()).First().terminal_id,
                    card_data   = _paymentCards.OrderBy(t => Guid.NewGuid()).First(),
                    xct_amount  = Math.Round(new decimal(amountGenerator.NextDouble() * 1000.0), 2),
                    xct_dt      = DateTime.Now,
                    xct_id      = Guid.NewGuid(),
                    xct_type    = (cardPresentIndicator % 2 == 0) ?
                                  Enums.TRANSACTION_TYPE.cp_sale : Enums.TRANSACTION_TYPE.cnp_sale
                });
            }

            // store xcts
            MongoDBContext.UpsertMerchantDailyActivity(merchantId, xctPostingDate, transactions);
        }
示例#9
0
        /// <summary>
        /// Build a Xct Summary for the specified merchant & date
        /// </summary>
        /// <param name="merchantId"></param>
        /// <param name="xctPostingDate"></param>
        /// <returns></returns>
        public static XctDailySummaryBE GetXctDailySummary(int merchantId, DateTime xctPostingDate)
        {
            var merchantActivity = MongoDBContext.FindMerchantDailyActivity(merchantId, xctPostingDate);

            XctDailySummaryBE results = null;

            if (merchantActivity != null &&
                merchantActivity.transactions != null &&
                merchantActivity.transactions.Count > 0)
            {
                results = new XctDailySummaryBE();

                results.SummaryByXctType = merchantActivity.transactions
                                           .OrderBy(x => x.xct_type)
                                           .GroupBy(x => x.xct_type)
                                           .Select(x => new XctTypeDailySummaryBE()
                {
                    XctType = x.Key,
                    //XctType = x.Key.ToString(),
                    XctCount      = x.Count(),
                    XctTotalValue = x.Sum(r => r.xct_amount)
                }).ToList();


                var subtotals2 = from row in merchantActivity.transactions
                                 group row by row.xct_type into grp
                                 orderby grp.Key
                                 select new
                {
                    XctType       = grp.Key,
                    XctCount      = grp.Count(),
                    XctTotalValue = grp.Sum(r => r.xct_amount)
                };
            }

            return(results);
        }
示例#10
0
        public static string BuildSalesSummaryMessage(int merchantId, DateTime xctPostingDate)
        {
            StringBuilder sb = new StringBuilder();

            sb.AppendLine($"Merchant Account Summary as of: {DateTime.Now.ToString("ddd MMM dd, yyyy h:mm tt")}");
            sb.AppendLine();

            var merchantActivity = MongoDBContext.FindMerchantDailyActivity(merchantId, xctPostingDate);

            if (merchantActivity != null && merchantActivity.transactions != null && merchantActivity.transactions.Count() > 0)
            {
                var cpSalesXcts = merchantActivity.transactions
                                  .Where(x => x.xct_type == Enums.TRANSACTION_TYPE.cp_sale).ToList();

                decimal cpSales = cpSalesXcts.Sum(x => x.xct_amount);
                int     cpQty   = cpSalesXcts.Count();

                sb.AppendLine($"In-Store:");
                if (cpSalesXcts != null && cpSalesXcts.Count() > 0)
                {
                    sb.AppendLine($"{cpSales:C} [{cpQty} txns]");
                }
                else
                {
                    sb.AppendLine($"$0.00 [0 txns]");
                    //sb.AppendLine(@"There are no sales activity yet today.");
                }

                sb.AppendLine();

                var cnpSalesXcts = merchantActivity.transactions
                                   .Where(x => x.xct_type == Enums.TRANSACTION_TYPE.cnp_sale).ToList();

                decimal cnpSales = cnpSalesXcts.Sum(x => x.xct_amount);
                int     cnpQty   = cnpSalesXcts.Count();

                sb.AppendLine($"Online:");
                if (cnpSalesXcts != null && cnpSalesXcts.Count() > 0)
                {
                    sb.AppendLine($"{cnpSales:C} [{cnpQty} txns]");
                }
                else
                {
                    sb.AppendLine($"$0.00 [0 txns]");
                    //sb.AppendLine(@"There are no sales activity yet today.");
                }

                sb.AppendLine($"------------------------");
                sb.AppendLine($"Total: {(cpSales + cnpSales):C} [{cpQty + cnpQty} txns]");
                sb.AppendLine("(all Card Transactions)");
            }
            else
            {
                sb.AppendLine($"In-Store:");
                sb.AppendLine($"$0.00 [0 txns]");
                sb.AppendLine();
                sb.AppendLine($"Online:");
                sb.AppendLine($"$0.00 [0 txns]");
                sb.AppendLine($"------------------------");
                sb.AppendLine($"Total: $0.00 [0 txns]");
                sb.AppendLine("(all Card Transactions)");
                //sb.AppendLine(@"There are no activity yet today.");
            }

            return(sb.ToString());
        }