public Dictionary <int, UchNoActiveField> BuyProductForCc(IDbTransaction transaction, PaymentCcViewModel model, int currentUserId) { var random = new Random(); var quantity = model.Quantity; var ps = GetStoreItemsByType(transaction.Connection, model.ProductType); var storeItem = ps.StoreList.First(i => i.ProductStoreId == model.ProductStoreId); if (storeItem == null) { throw new ArgumentNullException(Error.InputDataIncorrect, nameof(storeItem)); } var totalCost = (int)Math.Ceiling(storeItem.ProductCost * quantity); if ((int)Math.Floor(Math.Abs(model.TotalCost - totalCost)) > 0) { throw new ValidationException(Error.InputDataIncorrect); } var canBuy = false; BalanceEnoughCc(transaction.Connection, currentUserId, totalCost, b => { canBuy = b; }); if (!canBuy) { throw new ValidationException(Error.NotEnoughCc); } var transactionItem = new TransacationCcDataModel { UserId = currentUserId, ProductStoreId = storeItem.ProductStoreId, Quantity = quantity, TotalCost = totalCost, Source = (sbyte)SourceCcChange.BuyStoreItem, Token = DateTime.UtcNow.ToString("yyMMddHHmmssffffff") + random.Next(1000, 9999), FormToken = model.__RequestVerificationToken, DateCreate = DateTime.UtcNow }; return(TransactionBuyItemCc(transaction, transactionItem, storeItem)); }
public Dictionary <int, UchNoActiveField> TransactionBuyItemCc(IDbTransaction transaction, TransacationCcDataModel preparedCheckedItem, StoreViewItem storeViewItem) { IList <UserChestDataModel> newChestItems = null; JournalBuyDataModel jBData = null; UserBalanceCcDataModel newUserBalanceCc = null; var p = _tranCcRepo.Provider; var c = transaction.Connection; var etTranItem = _tranCcRepo.ConvertToEntity(preparedCheckedItem); etTranItem = _tranCcRepo.AddOrUpdate(c, etTranItem); var transactionId = etTranItem.Id; if (transactionId == 0) { throw new NotImplementedException(); } var chestItems = _createListUserChestDataModel(preparedCheckedItem.UserId, storeViewItem.ProductStoreId, storeViewItem.ProductTypeId, transactionId, preparedCheckedItem.Quantity, UnixTime.ToTimestamp(preparedCheckedItem.DateCreate)); var insertedChestItems = _userChestRepo.AddOrUpdate(c, _userChestRepo.ConvertToEntities(chestItems), transaction); newChestItems = insertedChestItems.Select(i => _userChestRepo.ConvertToWorkModel(i)).ToList(); jBData = _journalBuySetModel(transactionId); var jbEnt = _journalBuyRepository.ConvertToEntity(jBData); jbEnt = _journalBuyRepository.AddOrUpdate(c, jbEnt, transaction); jBData.Id = jbEnt.Id; var balanceTbName = p.GetTableName(nameof(user_balance_cc)); var balance = c.QuerySingleOrDefault <user_balance_cc>(p.SqlGetById(balanceTbName)); if (balance == null) { throw new NullReferenceException(); } balance.quantity -= (int)preparedCheckedItem.TotalCost; var suc = _userBalanceRepo.Update(transaction.Connection, balance, transaction); if (!suc) { throw new NotImplementedException(); } newUserBalanceCc = _userBalanceRepo.ConvertToWorkModel(balance); if (newChestItems == null || !newChestItems.Any() || jBData == null || newUserBalanceCc == null) { throw new NullReferenceException(); } var updatesChestItems = _userChestCache.UpdateLocalItems(c, newChestItems); _journalBuyCache.UpdateLocalItem(c, jBData); _userBalanceCache.UpdateLocalItem(c, newUserBalanceCc); var resultData = updatesChestItems.ToDictionary(i => i.Id, i => new UchNoActiveField { Id = i.Id, Activated = i.Activated, DateActivate = i.DateActivate, DateCreate = i.DateCreate, ProductTypeId = i.ProductTypeId, ProductItemProperty = storeViewItem.ProductItemProperty, ProductStoreId = i.ProductStoreId }); return(resultData); }