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); }
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()); }
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); }
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); }
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); }
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); }
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()); }
/// <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); }
/// <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); }
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()); }