private Money CalculatePackCost(Member user, ReferralPackage pack) { Money membershipSingleRefPrice = user.Membership.ReferralRentCost; int currentRefs = new RentReferralsSystem(user.Name, user.Membership).GetUserRentedReferralsCount(); Money singleRefPrice = RentedReferralRangePrice.GetPriceForSingleRef(membershipSingleRefPrice, currentRefs + pack.RefsInPackage); return(Money.MultiplyPercent(singleRefPrice * pack.RefsInPackage, pack.PercentValue)); }
public static void Create(int minReferrals, int maxReferrals, Money pricePerReferralEnlargedBy, Money autopayPriceEnlargedBy) { if (minReferrals >= maxReferrals) { throw new MsgException("Max Referrals must be greater than MinReferrals"); } var allRanges = GetAll(); if (allRanges.Any(x => x.MinReferrals == minReferrals && x.MaxReferrals == maxReferrals)) { throw new MsgException("Range already exists"); } var newRange = new RentedReferralRangePrice(minReferrals, maxReferrals, pricePerReferralEnlargedBy, autopayPriceEnlargedBy); newRange.Save(); }
/// <summary> /// Run this script everyday to manage referrals: delete expired, proceed autopay, recalculate statistics on RentedReferrals and renew BOT firedby /// NOTE: This script may take a while to complete /// NOTE: Run it before the Member Statistics recount !!!!!!!!!!!!! /// </summary> public static void CRON() { using (var bridge = ParserPool.Acquire(Database.Client)) { Parser parser = bridge.Instance; random = new Random(); //Expirations DataTable ExpiredNormal = parser.ExecuteRawCommandToDataTable( TableHelper.GetSqlCommand("SELECT * FROM RentedReferrals WHERE ExpireDate <= @DATE AND BotClass = -1", DateTime.Now)); var ExpiredNormalList = TableHelper.GetListFromDataTable <RentedReferral>(ExpiredNormal, 100, true); foreach (RentedReferral referral in ExpiredNormalList) { parser.ExecuteRawCommandNonQuery("UPDATE Users SET Referer = '', IsRented = 'false', LastPointableActivity = null, PointsEarnedToReferer = 0 WHERE Username = '******'"); } string Command = "DELETE FROM RentedReferrals WHERE ExpireDate <= @DATE"; parser.ExecuteRawCommandNonQuery(TableHelper.GetSqlCommand(Command, DateTime.Now)); var fullRentedList = TableHelper.SelectAllRows <RentedReferral>(); AcquireActiveUsersList(fullRentedList.Count); activeUsersIndex = 0; bool areWeLoweringClasses = false; //With probablility 1/8 lower all bot classes if (random.Next(0, 8) == 2) { areWeLoweringClasses = true; } foreach (RentedReferral referral in fullRentedList) { //AutoPay managementd if (referral.HasAutoPay) { //Clicked => Renew for 1 day, take money from owner Member Owner = new Member(referral.OwnerUsername); int numberOfRefs = fullRentedList.Count(x => x.OwnerUsername == Owner.Name); Money autopayPrice = RentedReferralRangePrice.GetPriceForAutopay(Owner.Membership.DailyAutoPayCost, numberOfRefs); if (referral.ClicksStatsList[0] > 0 && Owner.PurchaseBalance >= autopayPrice) { referral.ExpireDate = referral.ExpireDate.AddDays(1); Owner.SubtractFromPurchaseBalance(autopayPrice, "AutoPay", BalanceLogType.Other); Owner.Save(); } else if (AppSettings.Referrals.RentedRefAutopayPolicy == AppSettings.Referrals.AutopayPolicy.UserChooses) { referral.HasAutoPay = false; } referral.Save(); } } //Recount clicks stats bridge.Instance.ExecuteRawCommandNonQuery(TableHelper.GetRawRecalculateCommand("RentedReferrals", "ClicksStats", false)); //Append new active FiredBy Command = @";WITH CTE_CARS AS (SELECT FiredBy, ROW_NUMBER() OVER (ORDER BY RefId) AS RN FROM RentedReferrals WHERE BotClass > 0) ,CTE_ENGINES AS (SELECT Username, ROW_NUMBER() OVER (ORDER BY NEWID()) AS RN FROM Users WHERE LastActivityDate2 > DATEADD(day, -2, GETDATE()) AND TotalClicks > 3) UPDATE CTE_CARS SET CTE_CARS.FiredBy = CTE_ENGINES.Username FROM CTE_CARS JOIN CTE_ENGINES ON (CTE_CARS.RN - CTE_ENGINES.RN) % (SELECT COUNT(1) FROM CTE_ENGINES) = 0"; bridge.Instance.ExecuteRawCommandNonQuery(Command); //Lower classes if (areWeLoweringClasses) { Command = "UPDATE RentedReferrals SET BotClass = BotClass - 1 WHERE BotClass > 0"; bridge.Instance.ExecuteRawCommandNonQuery(Command); } } }