static void recalculateReferralsContracts()
 {
     using (FlyMiningEntityDI Fdb = new FlyMiningEntityDI())
     {
         List <UserProfile2>     userList     = Fdb.UserProfile2.Where(t => t.InvitedBy.HasValue && t.InvitedBy != t.Id && t.InvitedBy != 0).ToList();
         List <ContractReferral> referralList = Fdb.ContractReferrals.ToList();
         List <Contract>         contractList = Fdb.Contracts.ToList();
         decimal referralPart = Settings.FriendPart;
         foreach (UserProfile2 user in userList)
         {
             List <Contract> contractUserList = contractList.Where(t => t.userID == user.Id).ToList();
             foreach (Contract contract in contractUserList)
             {
                 if (referralList.Count(t => t.userID == user.Id && t.ContractFatherId == contract.id) == 0)
                 {
                     ContractReferral newRefContr = new ContractReferral(contract, user.Id, referralPart);
                     Fdb.ContractReferrals.Add(newRefContr);
                 }
                 if (referralList.Count(t => t.userID == user.InvitedBy && t.ContractFatherId == contract.id) == 0)
                 {
                     ContractReferral newRefContr = new ContractReferral(contract, user.Id, referralPart);
                     Fdb.ContractReferrals.Add(newRefContr);
                 }
             }
             Fdb.SaveChanges();
         }
     }
 }
        static void exportIncome(IFlyMiningEntityDI fDb, SiteContent _siteSelector)
        {
            MailSender             mailSender      = new MailSender(fDb, _siteSelector, new FlySmtpClient());
            List <ExportIncome>    exportList      = new List <ExportIncome>();
            List <RsBankPayout>    payoutList      = new List <RsBankPayout>();
            List <ExportHistory>   historyList     = new List <ExportHistory>();
            List <ReferralPayment> refPaymentsList = new List <ReferralPayment>();
            var requests = Settings.PaymentRequestListAll(fDb, _siteSelector).Where(t => t.Valid == true && t.Confirmed == true);
            List <UserProfile2> users_list = fDb.UserProfile2.Where(t => requests.Any(y => y.userId == t.Id)).ToList();

            foreach (PaymentRequest request in requests.ToList())
            {
                Decimal payoutFee = 0;
                try
                {
                    if (request.Type != null)
                    {
                        payoutFee = Settings.withdrawFee(request.Type, request.CryptoCurrency);
                    }
                    else
                    {
                        request.Type = "R1";
                        payoutFee    = Settings.withdrawFee(request.Type, request.CryptoCurrency);
                    }
                    UserProfile2 user = users_list.SingleOrDefault(t => t.Id == request.userId);
                    List <RsBankAccountBalanceView> accountBalanceList = Settings.rsBalanceList(fDb, user, _siteSelector).Where(t => t.Currency == request.CryptoCurrency).ToList();
                    if (user == null)
                    {
                        Logger.AddLogRecord("Invalid request.Wrong userid " + request.userId.ToString());
                        fDb.PaymentRequests.Remove(request);
                        continue;
                    }
                    if (request.WalletDestinision == "")
                    {
                        Logger.AddLogRecord("Invalid request.Invalid wallet  " + request.WalletDestinision.ToString());
                        fDb.PaymentRequests.Remove(request);
                        continue;
                    }
                    decimal         currentBalance = 0;
                    UserBalanceData balanceData    = fDb.UserBalanceDatas.SingleOrDefault(t => t.userId == user.Id);
                    if (balanceData == null)
                    {
                        continue;
                    }
                    currentBalance = balanceData.Balance(_siteSelector, request.CryptoCurrency);
                    if (currentBalance < payoutFee)
                    {
                        Logger.AddLogRecord(currentBalance + "<" + payoutFee + " for paymentRequest " + request.id);
                        request.Valid = false;
                        continue;
                    }
                    foreach (RsBankAccountBalanceView account in accountBalanceList.Where(t => t.Type == "contract"))
                    {
                        Contract contract = fDb.Contracts.SingleOrDefault(t => t.TxID == account.RsTxId);
                        if (contract == null)
                        {
                            continue;
                        }
                        ExportHistory newHistory = new ExportHistory(request.CryptoCurrency)
                        {
                            Type       = 2,
                            UserId     = user.Id,
                            income     = 0,
                            ContractID = contract.id,
                            hashrate   = contract.hashrate,
                            Referral   = false
                        };
                        newHistory.income = account.AmountIncome ?? 0;
                        ExportIncome newExport = new ExportIncome(request.CryptoCurrency)
                        {
                            userId     = user.Id,
                            Wallet     = request.WalletDestinision,
                            RequestID  = request.id,
                            Referral   = false,
                            ContractID = contract.id,
                            Sum        = account.Amount.Value
                        };
                        if (newExport.Sum < 0)
                        {
                            Logger.AddLogRecord("newExport less then 0 : Income =" + newExport.Sum.ToString(new CultureInfo("en")));
                            continue;
                        }
                        int selector        = Settings.ConvertSelectorToInt(_siteSelector);
                        var MaintenanceData = fDb.MaintenanceHistories.Where(t => t.UserId == user.Id && t.Confirmed == true &&
                                                                             t.CryptoCurrency == contract.CryptoCurrency && (t.Contract.ContractType.SiteSelector == selector || (t.NonBTCBalance.HasValue && t.NonBTCBalance.Value == true))).Where(t => t.ContractID == contract.id && t.Spent == false && t.Referral == false);
                        foreach (MaintenanceHistory oper in MaintenanceData.ToList())
                        {
                            oper.Spent = true;
                        }
                        foreach (HodlContractManagementFee oper in fDb.HodlContractManagementFees.Where(t => MaintenanceData.Any(x => x.id == t.MaintId)).ToList())
                        {
                            oper.Spent = true;
                        }
                        exportList.Add(newExport);
                        historyList.Add(newHistory);
                        RsBankPayout newPayout = new RsBankPayout(request);
                        newPayout.Wallet      = account.RsTxId;
                        newPayout.Sum_Value   = (Math.Round(newExport.Sum * 1000000, 2)).ToString(new CultureInfo("en"));
                        newPayout.Description = newPayout.Sum_Value.ToString(new CultureInfo("en")) + " to " + newPayout.UserWallet + " " + request.CryptoCurrency + " from " + user.RsBankId;
                        payoutList.Add(newPayout);
                    }
                    foreach (RsBankAccountBalanceView account in accountBalanceList.Where(t => t.Type == "contractReferral"))
                    {
                        ContractReferral contractRef = Settings.RefContractList(fDb, SiteContent.Flymining).SingleOrDefault(t => t.TxID == account.RsTxId);
                        if (contractRef == null)
                        {
                            continue;
                        }
                        ExportIncome newExport = new ExportIncome(request.CryptoCurrency)
                        {
                            userId     = user.Id,
                            Wallet     = request.WalletDestinision,
                            RequestID  = request.id,
                            Referral   = true,
                            ContractID = contractRef.id,
                            Sum        = account.Amount.Value
                        };
                        ExportHistory newHistory = new ExportHistory(request.CryptoCurrency)
                        {
                            Type       = 2,
                            UserId     = user.Id,
                            ContractID = contractRef.ContractFatherId,
                            hashrate   = contractRef.hashrate,
                            Referral   = true,
                            income     = account.AmountIncome.Value
                        };
                        if (newExport.Sum < 0)
                        {
                            Logger.AddLogRecord("newExport less then 0 : Income =" + newExport.Sum.ToString(new CultureInfo("en")));
                            continue;
                        }
                        exportList.Add(newExport);
                        historyList.Add(newHistory);
                        RsBankPayout newPayout = new RsBankPayout(request)
                        {
                            Wallet    = account.RsTxId,
                            Sum_Value = (Math.Round(newExport.Sum * 1000000, 2)).ToString(new CultureInfo("en"))
                        };
                        newPayout.Description = newPayout.Sum_Value.ToString(new CultureInfo("en")) + " to " + newPayout.UserWallet + " " + request.CryptoCurrency + " referral from " + user.RsBankId;
                        payoutList.Add(newPayout);
                    }
                    foreach (RsBankAccountBalanceView account in accountBalanceList.Where(t => t.Type == "ReferralPayment"))
                    {
                        RsBankPayout newPayout = new RsBankPayout(request)
                        {
                            Wallet    = user.RsBankId,
                            Sum_Value = (Math.Round(account.RsAmount.Value, 2)).ToString(new CultureInfo("en"))
                        };
                        newPayout.Description = "Referral payment " + newPayout.Sum_Value.ToString(new CultureInfo("en")) + " to " + newPayout.UserWallet + " BTC referral from " + user.RsBankId;
                        payoutList.Add(newPayout);
                        refPaymentsList.Add(fDb.ReferralPayments.Single(t => t.TxId == account.RsTxId));
                        ExportIncome newExport = new ExportIncome(request, account.Amount.Value, true);
                        exportList.Add(newExport);
                    }
                    request.Valid = false;
                    decimal currentCommision = payoutFee;
                    decimal payoutSum        = payoutList.Where(t => t.TxID == request.UniqueID).Sum(t => Convert.ToDecimal(t.Sum_Value));
                    request.Amount = payoutSum - currentCommision * 1000000;
                    List <RsBankPayout> commList = new List <RsBankPayout>();
                    foreach (RsBankPayout payout in payoutList.Where(t => t.TxID == request.UniqueID))
                    {
                        RsBankPayout newPayout = new RsBankPayout
                        {
                            UniqueID      = Guid.NewGuid().ToString(),
                            Date          = DateTime.UtcNow,
                            TxID          = payout.TxID,
                            Oper_Type     = "5",
                            Wallet_Type   = payout.Wallet_Type,
                            Wallet        = payout.Wallet,
                            Currency_Name = request.CryptoCurrency,
                            Special_Kind  = "S",
                            Rest          = "0",
                            Spent         = false,
                            UserWallet    = payout.UserWallet
                        };
                        newPayout.Year    = newPayout.Date.Year;
                        newPayout.Month   = newPayout.Date.Month;
                        newPayout.Day     = newPayout.Date.Day;
                        currentCommision -= Math.Round((Convert.ToDecimal(payout.Sum_Value) * payoutFee) / payoutSum, 8);
                        if (currentCommision < 0)
                        {
                            currentCommision   += Math.Round((Convert.ToDecimal(payout.Sum_Value) * payoutFee) / payoutSum, 8);
                            newPayout.Sum_Value = Convert.ToString(Math.Round(-currentCommision * 1000000, 2), new CultureInfo("en"));
                            payout.Sum_Value    = (Convert.ToDecimal(payout.Sum_Value) + Convert.ToDecimal(newPayout.Sum_Value)).ToString("#0.00", CultureInfo.InvariantCulture);
                            currentCommision    = 0;
                        }
                        else
                        {
                            newPayout.Sum_Value = Convert.ToString(Math.Round(-(Convert.ToDecimal(payout.Sum_Value) * payoutFee * 1000000) / payoutSum, 2), new CultureInfo("en"));
                            payout.Sum_Value    = (Convert.ToDecimal(payout.Sum_Value) + Convert.ToDecimal(newPayout.Sum_Value)).ToString("#0.00", CultureInfo.InvariantCulture);
                        }
                        newPayout.Description = newPayout.Sum_Value.ToString(new CultureInfo("en")) + " " + request.CryptoCurrency + " commision to " + newPayout.UserWallet + " user " + user.RsBankId;
                        commList.Add(newPayout);
                    }
                    payoutList.AddRange(commList);
                    if (currentCommision != 0)
                    {
                        string firstWallet = payoutList.Where(t => t.TxID == request.UniqueID).OrderByDescending(t => t.Sum_Value).First().Wallet;
                        foreach (RsBankPayout payout in payoutList.Where(t => t.Wallet == firstWallet && t.TxID == request.UniqueID))
                        {
                            if (payout.Special_Kind == "S")
                            {
                                payout.Sum_Value   = Convert.ToString(Convert.ToDecimal(payout.Sum_Value) + currentCommision, new CultureInfo("en"));
                                payout.Description = payout.Sum_Value.ToString(new CultureInfo("en")) + " " + request.CryptoCurrency + " commision to " + payout.UserWallet + " user " + user.RsBankId;
                            }
                            else
                            {
                                payout.Sum_Value   = Convert.ToString(Convert.ToDecimal(payout.Sum_Value) - currentCommision, new CultureInfo("en"));
                                payout.Description = payout.Sum_Value.ToString(new CultureInfo("en")) + " to " + payout.UserWallet + " " + request.CryptoCurrency + " from " + user.RsBankId;
                            }
                        }
                    }
                    mailSender.SendPaymentRequest(user, request);
                }
                catch (Exception ex)
                {
                    Logger.AddLogRecord("Payment Request Parsing.Error:" + Convert.ToString(ex));
                }
            }
            foreach (ExportIncome row in exportList)
            {
                fDb.ExportIncomes.Add(row);
            }
            foreach (RsBankPayout row in payoutList)
            {
                fDb.RsBankPayouts.Add(row);
            }
            foreach (ExportHistory row in historyList)
            {
                fDb.ExportHistories.Add(row);
            }
            foreach (ReferralPayment row in refPaymentsList)
            {
                row.Sent = true;
            }
            try
            {
                fDb.SaveChanges();
                UtilityFunc utilHandler = new UtilityFunc(fDb);
                foreach (UserProfile2 user in users_list)
                {
                    utilHandler.recalculateBalance(user);
                }
            }
            catch (Exception ex)
            {
                Logger.AddLogRecord("Error on SaveChanges Export Income Service :" + Convert.ToString(ex));
            }
        }