예제 #1
0
        public void Approve(ApproveOnlineDepositRequest request)
        {
            using (var scope = CustomTransactionScope.GetTransactionScope())
            {
                //lock data to prevent deposit multi times
                _repository.LockOnlineDeposit(request.Id);

                var onlineDeposit = _repository.OnlineDeposits.First(x => x.Id == request.Id);

                if (onlineDeposit == null)
                {
                    throw new RegoException(DepositErrors.NotFound.ToString());
                }

                if (onlineDeposit.Status != OnlineDepositStatus.Verified)
                {
                    throw new RegoException(string.Format("The deposit has '{0}' status, so it can't be Approved", onlineDeposit.Status));
                }

                var onlineDepositEntity = new Entities.OnlineDeposit(onlineDeposit);
                var now = _paymentQueries.GetBrandDateTimeOffset(onlineDeposit.BrandId);

                var depositCommand = onlineDepositEntity.Approve(_actorInfoProvider.Actor.UserName, request.Remarks, now);
                _repository.SaveChanges();

                _serviceBus.PublishMessage(depositCommand);

                scope.Complete();
            }
        }
예제 #2
0
        private void UpdateVerificationStatus(Data.OnlineDeposit onlineDeposit, VerificationStatus status, UnverifyReasons?unverifyReason, string remarks)
        {
            if (onlineDeposit == null)
            {
                throw new RegoException(DepositErrors.NotFound.ToString());
            }

            var onlineDepositEntity = new Entities.OnlineDeposit(onlineDeposit);

            var now = _paymentQueries.GetBrandDateTimeOffset(onlineDeposit.BrandId);

            DomainEventBase eventCreated = null;

            if (status == VerificationStatus.Unverified)
            {
                eventCreated = onlineDepositEntity.Unverify(_actorInfoProvider.Actor.UserName, remarks, now, unverifyReason.Value);
            }
            if (status == VerificationStatus.Verified)
            {
                eventCreated = onlineDepositEntity.Verify(_actorInfoProvider.Actor.UserName, remarks, now);
            }

            using (var scope = CustomTransactionScope.GetTransactionScope())
            {
                _repository.SaveChanges();
                _eventBus.Publish(eventCreated);
                scope.Complete();
            }
        }
예제 #3
0
        public string PayNotify(OnlineDepositPayNotifyRequest request)
        {
            var transNo  = request.OrderIdOfMerchant;
            var response = "Failed";

            var hashKey = GetDepositHashKey();

            //validation
            var validationResult = new OnlineDepositPayNotifyRequestValidator(_repository, hashKey).Validate(request);

            if (!validationResult.IsValid)
            {
                throw new RegoValidationException(validationResult);
            }

            using (var scope = CustomTransactionScope.GetTransactionScope())
            {
                _repository.LockOnlineDeposit(transNo);//lock data to prevent deposit multi times

                var onlineDeposit = _repository.OnlineDeposits.First(x => x.TransactionNumber == transNo);

                var onlineDepositEntity = new Entities.OnlineDeposit(onlineDeposit);

                if (onlineDepositEntity.IsApproved() == false) //prevent approve again
                {
                    var now            = _paymentQueries.GetBrandDateTimeOffset(onlineDeposit.BrandId);
                    var depositCommand = onlineDepositEntity.Approve(request, now);

                    _repository.SaveChanges();

                    _serviceBus.PublishMessage(depositCommand);
                    scope.Complete();
                }

                response = Acknowledge;
            }

            return(response);
        }
예제 #4
0
        public void Reject(RejectOnlineDepositRequest request)
        {
            var onlineDeposit = _repository.OnlineDeposits.First(x => x.Id == request.Id);

            if (onlineDeposit == null)
            {
                throw new RegoException(DepositErrors.NotFound.ToString());
            }

            var onlineDepositEntity = new Entities.OnlineDeposit(onlineDeposit);

            var now = _paymentQueries.GetBrandDateTimeOffset(onlineDeposit.BrandId);

            var rejectedEvent = onlineDepositEntity.Reject(_actorInfoProvider.Actor.UserName, request.Remarks, now);

            using (var scope = CustomTransactionScope.GetTransactionScope())
            {
                _repository.SaveChanges();

                _eventBus.Publish(rejectedEvent);

                scope.Complete();
            }
        }
예제 #5
0
        public async Task <SubmitOnlineDepositRequestResult> SubmitOnlineDepositRequest(OnlineDepositRequest request)
        {
            var validationResult = new OnlineDepositRequestValidator(_repository).Validate(request);

            if (!validationResult.IsValid)
            {
                throw new RegoValidationException(validationResult);
            }

            var player = _repository.Players.FirstOrDefault(x => x.Id == request.PlayerId);

            var paymentGetewaySettings = _paymentGatewaySettingsQueries.GetOnePaymentGatewaySettingsByPlayerId(player.Id);

            if (paymentGetewaySettings == null)
            {
                throw new RegoException("PaymentGatewaySettings not found");
            }

            var method     = paymentGetewaySettings.OnlinePaymentMethodName;
            var channel    = paymentGetewaySettings.Channel;
            var paymentUrl = paymentGetewaySettings.EntryPoint;

            _validator.ValidatePaymentSetting(request.PlayerId, method, request.Amount, player.CurrencyCode);

            var number = GenerateOrderId(method, channel);

            var merchantId = GetDepositMerchantId();

            var hashKey = GetDepositHashKey();

            var depositParams = new OnlineDepositParams();

            depositParams.Method     = method;
            depositParams.Channel    = channel;
            depositParams.Amount     = request.Amount;
            depositParams.MerchantId = merchantId;
            depositParams.OrderId    = number;
            depositParams.Currency   = player.CurrencyCode;
            depositParams.Language   = request.CultureCode;
            depositParams.ReturnUrl  = request.ReturnUrl;
            depositParams.NotifyUrl  = request.NotifyUrl;
            depositParams.Signature  = EncryptHelper.GetMD5HashInHexadecimalFormat(depositParams.SignParams + hashKey);

            var id = Guid.NewGuid();

            var brandId = player.BrandId;

            var now = _paymentQueries.GetBrandDateTimeOffset(brandId);

            var onlineDepositEntity = new Entities.OnlineDeposit(id, number, request, depositParams, brandId, now);

            var submitEvent = onlineDepositEntity.Submit();

            using (var scope = CustomTransactionScope.GetTransactionScopeAsync())
            {
                if (!string.IsNullOrWhiteSpace(request.BonusCode) || (request.BonusId.HasValue && request.BonusId != Guid.Empty))
                {
                    var bonusRedemptionId = await _bonusApiProxy.ApplyForBonusAsync(new DepositBonusApplication
                    {
                        PlayerId  = request.PlayerId,
                        BonusId   = request.BonusId,
                        Amount    = request.Amount,
                        DepositId = onlineDepositEntity.Data.Id,
                        BonusCode = onlineDepositEntity.Data.BonusCode
                    });

                    onlineDepositEntity.SetBonusRedemption(bonusRedemptionId);
                }
                _repository.OnlineDeposits.Add(onlineDepositEntity.Data);

                _eventBus.Publish(submitEvent);

                _repository.SaveChanges();

                scope.Complete();
            }

            return(new SubmitOnlineDepositRequestResult
            {
                DepositId = id,
                RedirectUrl = new Uri(paymentUrl),
                RedirectParams = depositParams
            });
        }