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);
        }