Пример #1
0
        public static bool FraudCheck(FundsTransferRequest request)
        {
            string r = RandomGeneratedStrings(request.cract, string.Empty, string.Empty,
                                              request.dract, request.trnamt.ToString(), string.Empty, string.Empty, request.trnrefno, request.trans_type);

            return(r == request.guid);
        }
Пример #2
0
        private async Task <FundsResponseResult> DigestResponseItemAsync(
            FundsResponseFile file,
            FundsResponseFileItem item,
            FundsTransferRequest fundsTransferRequest,
            FundsTransferBatchMessage responseBatchMessage,
            SO statefulObject,
            State stateAfterRequest)
        {
            if (file == null)
            {
                throw new ArgumentNullException(nameof(file));
            }
            if (item == null)
            {
                throw new ArgumentNullException(nameof(item));
            }
            if (fundsTransferRequest == null)
            {
                throw new ArgumentNullException(nameof(fundsTransferRequest));
            }

            var line = new FundsResponseLine(file, item, responseBatchMessage.ID);

            return(await DigestResponseLineAsync(fundsTransferRequest, line, statefulObject, stateAfterRequest));
        }
Пример #3
0
        public FundsTransferRequest GetFundsTransferRequest()
        {
            var fundsTransfer = new FundsTransferRequest();

            SetBaseHeaders(fundsTransfer);
            SetBaseFields(fundsTransfer);
            SetBaseUri(fundsTransfer);
            return(fundsTransfer);
        }
Пример #4
0
 public static TransLog GetTransLog(FundsTransferRequest request)
 {
     return(new TransLog()
     {
         creditaccount = request.cract,
         debitaccount = request.dract,
         debit_branch = request.branch_code,
         post_amt = request.trnamt.ToString(),
         refno = request.trnrefno
     });
 }
Пример #5
0
        public IActionResult Donate(long merchant, long amount, string cardHolder, string cardNumber,
                                    string cardExpiry, string cardCvc, string message, string currency)
        {
            var expiry = DateTime.Parse(cardExpiry);

            var request = new FundsTransferRequest
            {
                MerchantId               = merchant,
                Amount                   = amount,
                CardNumber               = cardNumber,
                CardExpiryDate           = $"{expiry.Year}-{expiry.Month}",
                Currency                 = currency,
                LocalTransactionDateTime = DateTimeOffset.Now
            };

            var result = FundsTransferService.TransferFunds(request);

            return(Donate(result));
        }
Пример #6
0
        public async Task TransferMoneyToBankAccount(string amount, string productCode, string accountNumber, string phoneNumber)
        {
            var estelClient = new EstelServicesClient();

            Logger.Info("amount to transfer: " + amount);

            var fundsTransferRequest = new FundsTransferRequest();

            fundsTransferRequest.amount       = amount;
            fundsTransferRequest.mpin         = "7F1359753577B274D717DC2E41BA1E51";
            fundsTransferRequest.agentCode    = "APEX_PINRDM";
            fundsTransferRequest.destination  = accountNumber;
            fundsTransferRequest.mobilenumber = phoneNumber;
            fundsTransferRequest.productCode  = productCode;

            var fundsTransferResponse = (await estelClient.getFundsTransferAsync(fundsTransferRequest)).Body.getFundsTransferReturn;

            switch (fundsTransferResponse.resultcode)
            {
            case "0":
                Logger.Info("destination: " + fundsTransferResponse.destination);
                Logger.Info("bank code: " + fundsTransferResponse.productcode);
                Logger.Info("reason: " + fundsTransferResponse.reason);
                Logger.Info("result code: " + fundsTransferResponse.resultcode);
                Logger.Info("description: " + fundsTransferResponse.resultdescription);
                break;

            default:
                Logger.Info("destination: " + fundsTransferResponse.destination);
                Logger.Info("bank code: " + fundsTransferResponse.productcode);
                Logger.Info("reason: " + fundsTransferResponse.reason);
                Logger.Info("result code: " + fundsTransferResponse.resultcode);
                Logger.Info("description: " + fundsTransferResponse.resultdescription);
                throw new MoneyTransferException("Error completing request");
            }
        }
Пример #7
0
        private async Task <FundsResponseResult> DigestResponseLineAsync(
            FundsTransferRequest fundsTransferRequest,
            FundsResponseLine line,
            SO statefulObject,
            State stateAfterRequest)
        {
            if (fundsTransferRequest == null)
            {
                throw new ArgumentNullException(nameof(fundsTransferRequest));
            }
            if (line == null)
            {
                throw new ArgumentNullException(nameof(line));
            }

            if (statefulObject == null || stateAfterRequest == null)
            {
                return(await DigestResponseLineAsync(fundsTransferRequest, line));
            }

            var eventType = GetEventTypeFromResponseLine(line);

            var previousEvent = TryGetExistingDigestedFundsTransferEvent(fundsTransferRequest, eventType, line.ResponseCode);

            if (previousEvent != null)
            {
                return(new FundsResponseResult
                {
                    Event = previousEvent,
                    Line = line,
                    IsAlreadyDigested = true
                });
            }

            var actionArguments = new Dictionary <string, object>
            {
                [StandardArgumentKeys.BillingItem] = line
            };

            try
            {
                var fundsResponseResult = new FundsResponseResult
                {
                    Line = line
                };

                // Attempt to get the next path to be executed. Any exception will be recorded in a funds transfer event with ExceptionData.

                string statePathCodeName = TrySpecifyNextStatePath(statefulObject, stateAfterRequest, line);

                if (statePathCodeName != null)                 // Should a path be executed?
                {
                    var statePath = await statePathsByCodeNameCache.Get(statePathCodeName);

                    using (var transaction = this.DomainContainer.BeginTransaction())
                    {
                        var transition = await ExecuteStatePathAsync(
                            statefulObject,
                            statePath,
                            actionArguments);

                        fundsResponseResult.Event = transition.FundsTransferEvent;

                        R remittance = null;

                        if (transition.FundsTransferEventID.HasValue)
                        {
                            remittance = await this.DomainContainer.Remittances.SingleOrDefaultAsync(r => r.FundsTransferEventID == transition.FundsTransferEventID);
                        }

                        if (transition.FundsTransferEvent != null)
                        {
                            await OnResponseLineDigestionSuccessAsync(line, transition.FundsTransferEvent, remittance);
                        }

                        await transaction.CommitAsync();
                    }
                }
                else                 // If no path is specified, record the event directly.
                {
                    using (var accountingSession = CreateAccountingSession())
                        using (GetElevatedAccessScope())
                            using (var transaction = this.DomainContainer.BeginTransaction())
                            {
                                var directActionResult = await accountingSession.AddFundsTransferEventAsync(
                                    fundsTransferRequest,
                                    line.Time,
                                    eventType,
                                    j => AppendResponseJournalAsync(j, fundsTransferRequest, line, eventType, null),
                                    line.BatchMessageID,
                                    line.ResponseCode,
                                    line.TraceCode,
                                    line.Comments);

                                fundsResponseResult.Event = directActionResult.FundsTransferEvent;

                                var remittance = TryGetTransferRemittance(directActionResult);

                                await OnResponseLineDigestionSuccessAsync(line, directActionResult.FundsTransferEvent, remittance);

                                await transaction.CommitAsync();
                            }
                }

                return(fundsResponseResult);
            }
            catch (Exception exception)
            {
                this.DomainContainer.ChangeTracker.UndoChanges();                 // Undo attempted entities.

                return(await RecordDigestionExceptionEventAsync(fundsTransferRequest, line, exception, GetEventTypeFromResponseLine(line)));
            }
        }
        public async Task <IActionResult> transfer([FromBody] FundsTransferRequest request)
        {
            FundsTransferResponse  resp  = new FundsTransferResponse();
            AccountEnquiryResponse aresp = new AccountEnquiryResponse();

            try
            {
                if (!ModelState.IsValid)
                {
                    return(BadRequest(Commons.Helpers.Utility.GetResponse(ModelState)));
                }

                //request.trnrefno = $"{request.branch_code}{request.product}{request.l_acs_ccy}" +
                //    $"{Commons.Helpers.Utility.RandomString(6)}";

                request.trans_type = 1;

                if (request.is_own_account && !await _orclRepo.IsOwnAccount(request))
                {
                    return(StatusCode((int)HttpStatusCode.BadRequest,
                                      Commons.Helpers.Utility.GetResponse(Constant.ACCOUNT_NOT_LINKED, HttpStatusCode.BadRequest)));
                }

                if (!string.IsNullOrEmpty(request.cract) && request.cract.Length != 9)
                {
                    aresp = await _orclRepo.GetAccountEnquiryByAccountNumber(new AccountEnquiryRequest()
                    {
                        accountNumber = request.cract
                    });

                    if (aresp?.ac_stat_no_cr?.ToUpper().Trim() != "N")
                    {
                        return(StatusCode((int)HttpStatusCode.BadRequest,
                                          Commons.Helpers.Utility.GetResponse(Constant.STAT_NO_CR, HttpStatusCode.BadRequest)));
                    }
                }

                if (!string.IsNullOrEmpty(request.dract) && request.dract.Length != 9)
                {
                    aresp = await _orclRepo.GetAccountEnquiryByAccountNumber(new AccountEnquiryRequest()
                    {
                        accountNumber = request.dract
                    });

                    if (aresp?.ac_stat_no_dr?.ToUpper().Trim() != "N")
                    {
                        return(StatusCode((int)HttpStatusCode.BadRequest,
                                          Commons.Helpers.Utility.GetResponse(Constant.STAT_NO_DR, HttpStatusCode.BadRequest)));
                    }

                    if (aresp?.ac_stat_dormant?.ToUpper().Trim() != "N")
                    {
                        return(StatusCode((int)HttpStatusCode.BadRequest,
                                          Commons.Helpers.Utility.GetResponse(Constant.STAT_DORMANT, HttpStatusCode.BadRequest)));
                    }
                }

                resp = await _orclRepo.ExecuteTransaction(request);

                if (resp.status?.ToUpper().Trim() == "Y")
                {
                    resp.id       = request.trnrefno;
                    resp.trnrefno = request.trnrefno;
                }
            }
            catch (Exception ex)
            {
                _logger.LogError($"{request.cract} : {request.dract}:- {ex.ToString()}");
                return(StatusCode((int)HttpStatusCode.InternalServerError, Commons.Helpers.Utility.GetResponse(ex)));
            }

            return(CreatedAtAction("transfer", resp));
        }
 /// <summary>
 /// Decides the state path to execute on a stateful object
 /// when a <see cref="FundsResponseLine"/> arrives for it.
 /// Returns null to indicate that no path should be executed and the that the line should
 /// be consumed directly. Throws an exception to abort normal digestion of the line
 /// and to record a transfer event with <see cref="FundsTransferEvent.ExceptionData"/> set instead.
 /// </summary>
 /// <param name="statefulObject">The stateful object for which to decide the state path.</param>
 /// <param name="stateAfterFundsTransferRequest">The state of the <paramref name="statefulObject"/> right after the funds transfer request.</param>
 /// <param name="fundsResponseLine">The batch line arriving for the stateful object.</param>
 /// <param name="fundsTransferRequest">The funds transfer request being handled.</param>
 /// <returns>Returns the code name of the path to execute or null to execute none.</returns>
 /// <exception cref="Exception">
 /// Thrown to record a funds transfer event with its <see cref="FundsTransferEvent.ExceptionData"/>
 /// containing the thrown exception.
 /// </exception>
 protected abstract string TrySpecifyNextStatePath(
     SO statefulObject,
     State stateAfterFundsTransferRequest,
     FundsResponseLine fundsResponseLine,
     FundsTransferRequest fundsTransferRequest);