Exemplo n.º 1
0
        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));
            }
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        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();
        }
Exemplo n.º 5
0
        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();
        }
Exemplo n.º 6
0
        // 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));
        }
Exemplo n.º 7
0
        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 }));
        }