private NewPaymentCommand GetPaymentFilled(PaymentProcessingViewModel paymentProcessingViewModel) { var newPaymentCommand = this.typeMapper.Map <NewPaymentCommand>(paymentProcessingViewModel); newPaymentCommand.Id = newPaymentCommand.Id != Guid.Empty ? newPaymentCommand.Id : Guid.NewGuid(); return(newPaymentCommand); }
public async Task <IActionResult> Post([FromBody] PaymentProcessingViewModel paymentProcessingDTO) { try { await this.paymentApplicationService.CreateAsync(paymentProcessingDTO); return(Ok(new PaymentResponseViewModel())); } catch (Exception ex) { return(StatusCode(StatusCodes.Status500InternalServerError, ex.Message)); } }
public async Task <PaymentProcessingResponseViewModel> CreateAsync(PaymentProcessingViewModel paymentProcessingViewModel) { var newPaymentCommand = GetPaymentFilled(paymentProcessingViewModel); await mediatorHandler.SendCommand <NewPaymentCommand>(newPaymentCommand); var errorMessages = notifications.GetNotifications().Select(n => n.Value); var paymentProcessingResponseViewModel = new PaymentProcessingResponseViewModel { PaymentID = newPaymentCommand.Id, PaymentStatus = errorMessages.Any() ? PaymentStatus.Rejected : PaymentStatus.Processing, ErrorMessage = errorMessages }; return(paymentProcessingResponseViewModel); }
public void PaymentAmountPreCondition_Success() { //ARRANGE var paymentProcessingDTO = new PaymentProcessingViewModel { Amount = new Money(null, 150) }; //var paymentPreConditions = new IPreCondition<PaymentProcessingDTO>[] { // new PaymentAmountPreCondition(), //}; //var paymentPreConditionEvaluator = new PreConditionEvaluator<PaymentProcessingDTO>(paymentPreConditions); ////ACT //var result = paymentPreConditionEvaluator.Evaluate(paymentProcessingDTO); ////ASSERT //result.Success.Should().BeTrue(); }
public void PaymentAmountPreCondition_Fail() { //ARRANGE var paymentProcessingDTO = new PaymentProcessingViewModel { Amount = new Money(null, 0) }; //var paymentPreConditions = new PaymentPreCondition{ // new PaymentAmountPreCondition(), //}; //var paymentPreConditionEvaluator = new PreConditionEvaluator<PaymentProcessingDTO>(paymentPreConditions); ////ACT //var result = paymentPreConditionEvaluator.Evaluate(paymentProcessingDTO); ////ASSERT //result.Failure.Should().BeTrue(); //result.Messages.Should().NotBeNull(); }
// GET: Payables/ProcessPayments public async Task <IActionResult> ProcessPayments(Guid productId, string errReference, string errBankAccounts) { if (!string.IsNullOrEmpty(errReference)) { ViewData["ErrReference"] = errReference; } if (!string.IsNullOrEmpty(errBankAccounts)) { ViewData["ErrBankAccounts"] = errBankAccounts; } var myParam = productId; await _context.Database.ExecuteSqlCommandAsync( "DELETE FROM ChequeTemp WHERE ProductID = {0}", parameters : myParam); await _context.Database.ExecuteSqlCommandAsync( "DELETE FROM ChequeSummaryTemp WHERE ProductID = {0}", parameters : myParam); string query = "SELECT CT.ID AS ID, PD.ID AS ProductID, CT.ClaimID AS ClaimID, " + "PY.ID AS PayeeID, PY.Name AS Payee, CT.InvoiceNumber AS InvoiceNumber, " + "AC.AccountCode AS AccountCode, AF.Name AS Affected, " + "CT.Authorised AS Authorised, CT.Amount AS Amount, " + "CN.LastName + ' ' + CN.FirstName AS Client, IR.Name AS Insurer, " + "PD.Name AS Product " + "FROM ClaimTransaction AS CT INNER JOIN Payee AS PY ON CT.PayeeID = PY.ID " + "INNER JOIN Claim AS CL ON CT.ClaimID = CL.ID " + "INNER JOIN Policy AS PL ON CL.PolicyID = PL.ID " + "INNER JOIN Client AS CN ON PL.ClientID = CN.ID " + "INNER JOIN Affected AS AF ON CT.AffectedID = AF.ID " + "INNER JOIN AccountChart AS AC ON CT.AccountID = AC.ID " + "INNER JOIN Insurer AS IR ON PL.InsurerID = IR.ID " + "INNER JOIN Product PD ON PL.ProductID = PD.ID " + "WHERE CT.Authorised = 1 AND CT.Amount > 0 " + "AND CT.HoldForPayment = 0 AND PassForPayment = 1 " + "AND PayableID IS NULL AND PD.ID = {0} " + "ORDER BY PY.Name"; var chequetransactions = await _context.ChequeTemps .FromSql(query, myParam) .AsNoTracking() .ToListAsync(); foreach (ChequeTemp c in chequetransactions) { _context.ChequeTemps.Add(c); } _context.SaveChanges(); string query1 = "SELECT PY.ID AS ID, PD.ID AS ProductID, PY.Name AS Payee, " + "NULL AS PostalAddress, NULL AS City, " + "SUM(CT.Amount) AS Amount, COUNT(*) AS PayeeCount " + "FROM ClaimTransaction AS CT INNER JOIN Payee AS PY ON CT.PayeeID = PY.ID " + "INNER JOIN Claim AS CL ON CT.ClaimID = CL.ID " + "INNER JOIN Policy AS PL ON CL.PolicyID = PL.ID " + "INNER JOIN Client AS CN ON PL.ClientID = CN.ID " + "INNER JOIN Affected AS AF ON CT.AffectedID = AF.ID " + "INNER JOIN AccountChart AS AC ON CT.AccountID = AC.ID " + "INNER JOIN Insurer AS IR ON PL.InsurerID = IR.ID " + "INNER JOIN Product PD ON PL.ProductID = PD.ID " + "WHERE CT.Authorised = 1 AND CT.Amount > 0 " + "AND CT.HoldForPayment = 0 AND PassForPayment = 1 " + "AND PayableID IS NULL AND PD.ID = {0} " + "GROUP BY PY.ID, PD.ID, PY.Name " + "ORDER BY PY.Name"; var chequesummary = await _context.ChequeSummaryTemps .FromSql(query1, myParam) .AsNoTracking() .ToListAsync(); int rowCount = chequesummary.Count(); object[,] bankaccounts = new object[rowCount, 5]; int i = 0; bool allaccounts = true; foreach (ChequeSummaryTemp c in chequesummary) { // Get PayeeID and check if Payee has Bank Account Number // Then populate the BankAccount Array List <string> accountnumber = GetBankAccount(c.PayeeID); bankaccounts[i, 0] = c.PayeeID; bankaccounts[i, 1] = c.Payee; bankaccounts[i, 2] = accountnumber[0]; // Account Number bankaccounts[i, 3] = accountnumber[1]; // BIC bankaccounts[i, 4] = accountnumber[2]; // Bank allaccounts = (accountnumber.Count == 0) ? false : true; // Get Payee Address List <string> PayeeAddress = GetPayeeAddress(c.PayeeID); c.PostalAddress = PayeeAddress[0]; c.City = PayeeAddress[1]; _context.ChequeSummaryTemps.Add(c); i++; } _context.SaveChanges(); PaymentProcessingViewModel viewModel = new PaymentProcessingViewModel { ProductID = productId, ProductName = ProductName(productId), ChequeTemps = chequetransactions, ChequeSummaryTemps = chequesummary, BankAccounts = bankaccounts, AllAccounts = allaccounts, PaymentTypeList = new SelectList(_context.PaymentTypes, "ID", "Name", _context.PaymentTypes.FirstOrDefault().ID), PaymentTypeID = _context.PaymentTypes.FirstOrDefault().ID }; return(View(viewModel)); }
public async Task <IActionResult> ProcessPayments(PaymentProcessingViewModel viewModel) { string ReferenceNumber = viewModel.ReferenceNumber; bool allaccounts = viewModel.AllAccounts; if (string.IsNullOrEmpty(ReferenceNumber)) { return(RedirectToAction("ProcessPayments", new { productId = viewModel.ProductID, errReference = "Process cannot continue. Please enter value." })); } ; if (!allaccounts && (viewModel.PaymentTypeID != 1 && viewModel.PaymentTypeID != 3)) { return(RedirectToAction("ProcessPayments", new { productId = viewModel.ProductID, errBankAccounts = "Process cannot continue. Please ensure that all payees have account numbers." })); } ; if (ReferenceNumber != null) { const int BufferSize = 4096; int paymentType = viewModel.PaymentTypeID; var todaydate = DateTime.Now.ToString("yyyyMMddHHmmss"); string dy = todaydate.Substring(6, 2); string mn = todaydate.Substring(4, 2); string yr = todaydate.Substring(0, 4); string hr = todaydate.Substring(8, 2); string mi = todaydate.Substring(10, 2); string sc = todaydate.Substring(12, 2); string prefix = ""; switch (paymentType) { case 1: // Cash prefix = "CSH"; break; case 2: // EFT prefix = "EFT"; break; case 3: // Cheque prefix = "CHQ"; break; case 4: // Direct Debit prefix = "DDR"; break; case 5: // Bank Transfer prefix = "BTR"; break; default: break; } var filename = prefix + "-File-" + yr + mn + dy + hr + mi + sc + ".txt"; var filePath = hostingEnv.WebRootPath + $@"\BankFiles\{filename}"; var cheques = await _context.ChequeSummaryTemps.ToListAsync(); var chequetransactions = await _context.ChequeTemps.ToListAsync(); BatchNumbers BatchNumberGen = new BatchNumbers(_context); var BatchNumber = BatchNumberGen.GetBatchNumber(); int chequenumber = 0; if (paymentType == 3) { chequenumber = int.Parse(viewModel.ReferenceNumber); ReferenceNumber = chequenumber.ToString(); } else { ReferenceNumber = viewModel.ReferenceNumber; }; Guid productId = viewModel.ProductID; int paymentTypeId = viewModel.PaymentTypeID; Guid currentUserId = Guid.Parse(User.FindFirstValue(ClaimTypes.NameIdentifier)); Guid payableId = Guid.Empty; var myParams = new object[] { productId, ReferenceNumber, BatchNumber }; using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.Read, BufferSize, true)) { Int32 offset = 0; string refnumberVar = string.Empty; string text = "Payment Transactions\r\n"; text += "=====================\r\n"; byte[] buffer = Encoding.Unicode.GetBytes(text); await fs.WriteAsync(buffer, offset, buffer.Length); decimal BulkAmount = cheques.Sum(a => a.Amount); foreach (ChequeSummaryTemp c in cheques) { Guid payeeId = c.PayeeID; // This string attempts to create the presumed record format as will be determined by the paying // institution. This string assumes that the output will be a comma-separated ascii file in the // given column order. if (paymentType == 1 || paymentType == 3) { text = ReferenceNumber + "," + c.Amount.ToString() + "," + DateTime.Now.ToString("dd/MM/yyyy") + "," + c.Payee + "," + c.PostalAddress + "," + c.City; } else if (paymentType == 2 || paymentType == 4 || paymentType == 2) { // Get Payee Bank Account Details var bankaccountdetail = GetBankDetails(c.PayeeID); text = ReferenceNumber + "," + bankaccountdetail + "," + c.Amount.ToString() + "," + DateTime.Now.ToString("dd/MM/yyyy") + "," + c.Payee + "," + c.PostalAddress + "," + c.City; } ; buffer = Encoding.Unicode.GetBytes(text + "\r\n"); await fs.WriteAsync(buffer, offset, buffer.Length); if (!ReferenceNumber.Equals(refnumberVar)) { refnumberVar = ReferenceNumber; decimal FinalAmount = (paymentType == 3) ? c.Amount : BulkAmount; var payableParams = new object[] { Guid.NewGuid(), productId, ReferenceNumber, DateTime.Now, paymentTypeId, FinalAmount, BatchNumber, false, null, null, null, DateTime.Now, currentUserId, null, null }; await _context.Database.ExecuteSqlCommandAsync( "INSERT INTO Payable (ID, ProductID, Reference, PayableDate, PaymentTypeID, Amount, " + "BatchNumber, Void, VoidReason, Remarks, PayableExportID, DateAdded, AddedBy, " + "DateModified, ModifiedBy) " + "VALUES ({0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}, {9}, {10}, {11}, {12}, {13}, {14})", parameters : payableParams); // Get Payable ID payableId = GetPayableId(ReferenceNumber); } ; foreach (ChequeTemp t in chequetransactions) { if (t.PayeeID == payeeId) { var transParams = new object[] { t.ID, payableId }; await _context.Database.ExecuteSqlCommandAsync( "UPDATE ClaimTransaction SET PayableID = {1} " + "WHERE ID = {0}", parameters : transParams); } } chequenumber++; if (paymentType == 3) { refnumberVar = chequenumber.ToString(); ReferenceNumber = refnumberVar; } else { refnumberVar = ReferenceNumber; }; } ; fs.Flush(); } var batchParams = new object[] { BatchNumber }; await _context.Database.ExecuteSqlCommandAsync( "INSERT INTO BatchNumberGenerator(BatchNumber) " + "Values ({0})", parameters : batchParams); // Generete Payment File [Done] // Then insert into Payable and update ClaimTransaction tables // Delete ChequeTemp and ChequeSummaryTemp records var myParam = productId; await _context.Database.ExecuteSqlCommandAsync( "DELETE FROM ChequeTemp WHERE ProductID = {0}", parameters : myParam); await _context.Database.ExecuteSqlCommandAsync( "DELETE FROM ChequeSummaryTemp WHERE ProductID = {0}", parameters : myParam); } return(RedirectToAction("ProcessPayments", new { productId = viewModel.ProductID })); }