public TopupTransactionEN SendTopup(PersonEN pPerson, string pOperatorName, decimal pAmount, string pPhone, int pPackCode) { TopupTransactionEN topupResult = new TopupTransactionEN(); TopupEN topup = new TopupEN(); ProductEN product = new ProductEN(); topup.Operator = pOperatorName; topup.Amount = pAmount; topup.Phone = pPhone; topup.PackageCode = pPackCode; try { var topupData = ValidateTopupData(pPerson, topup, ref product); if (topupData.IsValid) { List <PersonBagOperatorEN> operatorUserBags = topupDAL.GetUserOperatorBags(pPerson.PersonID); //Register initial bags state // var states = RegisterInitialUserBagState(operatorUserBags, product.ProductID); try { //Discounts product amount from user's bag if (UpdateUserBags(product, operatorUserBags, pPerson.PersonID)) { #region AzureSearch //if (!azureSearch.CheckExistingEntry(topupData.Phone)) // azureSearch.InsertEntry(pPerson.PersonID, pOperatorName, pPhone, pPerson.CountryID); //else // azureSearch.ComparePhoneNumber(pPhone, pOperatorName, pPerson.PersonID, pPerson.CountryID); #endregion //Gets response from Topup Service topupResult = topupClient.AttemptSendTopup(pPhone, pAmount, pPackCode, topupData.OperatorID, topupData.CategoryID); GatsTransactionEN transaction = new GatsTransactionEN(); transaction.Request = topupResult.RequestURL; transaction.Response = topupResult.Response; transaction.TransactionID = topupResult.ServiceTransactionID; transaction.ProviderTransactionID = topupResult.ServiceTransactionID; transaction.Amount = pAmount; transaction.CountryID = pPerson.CountryID; transaction.PhoneNumber = long.Parse(pPhone.ToString()); transaction.RegDate = DateTime.Now; transaction.ResponseCode = topupResult.Code; transaction.Paid = true; if (!String.Equals(topupResult.Code, "Success") && !String.Equals(topupResult.Code, "02")) { if (product.PersonDiscount > 0) { //Refunds user balance from updated values var updatedBags = topupDAL.GetUserOperatorBags(pPerson.PersonID); UpdateUserBagsRefund(product, updatedBags, pPerson.PersonID); } } else { topupResult.Message = topupData.Result; } //Updates users bags history //RegisterFinalUserBagState(states, pPerson.PersonID); topupDAL.LogTopupTransaction(transaction, pPerson.PersonID, pPerson.CountryID, topupData.Operator, product.InventoryDiscount, product.PersonDiscount); EventViewerLogger.LogInformation("SendTopup: " + transaction.Response); } } catch (Exception ex) { topupResult.Message = ex.Message; topupResult.Code = "Error"; if (product.PersonDiscount > 0) { //Gets user bags with updated values operatorUserBags = topupDAL.GetUserOperatorBags(pPerson.PersonID); //Refunds user bag if any exception ocurred UpdateUserBagsRefund(product, operatorUserBags, pPerson.PersonID); EventViewerLogger.LogError(String.Format("SendTopup - Inner exception: Refund user bags. PersonID {0}. Amount {1}. Message: {2}", Convert.ToString(pPerson.PersonID), product.PersonDiscount, ex.Message)); //Updates users bags history //RegisterFinalUserBagState(states, pPerson.PersonID); } } } else { //Sets the results according to topup data validation topupResult.Message = topupData.Result; topupResult.Code = topupData.Result; } } catch (Exception ex) { Console.WriteLine(ex.InnerException); EventViewerLogger.LogError("SendTopup: " + ex.Message); } return(topupResult); }