private void UpdateShares(List <AccountShare> sharesNew, int subscriberId) { foreach (var share in sharesNew) { var shareOwner = share.UserId; var existShare = ctx.ACCOUNT_SHARE.FirstOrDefault(s => s.ShareOwner == shareOwner && s.Account == accountId); if (existShare != null && existShare.ShareOwner == subscriberId && withdrawNotInvest && withdrawAll) { ctx.ACCOUNT_SHARE.Remove(existShare); continue; } if (existShare != null) { existShare.Share = share.SharePercent; } else { var newShare = new ACCOUNT_SHARE { Account = accountId, Share = share.SharePercent, ShareOwner = share.UserId, HWM = share.HWM }; ctx.ACCOUNT_SHARE.Add(newShare); } } }
public void TestGetUserOwnAndSharedAccounts() { List <AccountShared> accounts; var status = testManager.GetUserOwnAndSharedAccounts(shareOwner.Login, ProtectedOperationContext.MakeServerSideContext(), out accounts); Assert.AreEqual(RequestStatus.OK, status, "GetUserOwnAndSharedAccounts() - должна завершиться успешно"); Assert.IsNotNull(accounts, "GetUserOwnAndSharedAccounts() - список счетов не должен быть NULL"); Assert.AreEqual(1, accounts.Count, "GetUserOwnAndSharedAccounts() - должен вернуться ровно один счет (владельца)"); Assert.IsTrue(accounts[0].IsOwnAccount, "GetUserOwnAndSharedAccounts() - счетом владеет управляющий"); Assert.AreEqual(50, accounts[0].SharePercent, "GetUserOwnAndSharedAccounts() - доля управляющего должна быть 50%"); Assert.Greater(accounts[0].ShareMoneyWallet, 0, "GetUserOwnAndSharedAccounts() - доля управляющего в валюте кошелька должна быть расчитана"); var ownerNewShare = new ACCOUNT_SHARE { Account = eurAccount.ID, Share = 11, ShareOwner = shareOwner.ID }; conn.ACCOUNT_SHARE.Add(ownerNewShare); conn.SaveChanges(); status = testManager.GetUserOwnAndSharedAccounts(shareOwner.Login, ProtectedOperationContext.MakeServerSideContext(), out accounts); Assert.AreEqual(RequestStatus.OK, status, "GetUserOwnAndSharedAccounts(2) - должна завершиться успешно"); Assert.AreEqual(2, accounts.Count, "GetUserOwnAndSharedAccounts() - должно вернуться два счета - владельца и вкладчика"); Assert.AreEqual(ownerNewShare.Share, accounts[1].SharePercent, "GetUserOwnAndSharedAccounts() - вкладчику одлжно принадлежать N% счета"); Assert.Greater(accounts[1].ShareMoneyWallet, 0, "GetUserOwnAndSharedAccounts() - доля вкладчика в валюте кошелька должна быть расчитана"); }
public ACCOUNT_SHARE_HISTORY CalculateAccountShare(TradeSharpConnection ctx, ACCOUNT_SHARE share, ACCOUNT_SHARE ownerShare, ref decimal ownersMoney, decimal equity, PaidService serviceWithFeeScale, out bool feeWasTaken) { feeWasTaken = false; var shareMoney = equity * share.Share / 100M; var hist = new ACCOUNT_SHARE_HISTORY { Account = share.Account, Date = DateTime.Now, OldShare = share.Share, OldHWM = share.HWM, NewShare = share.Share, NewHWM = Math.Max(share.HWM ?? 0, shareMoney), ShareOwner = share.ShareOwner, ShareAmount = shareMoney }; share.HWM = hist.NewHWM; if ((hist.OldHWM ?? 0) == 0) { return(hist); } if (shareMoney <= hist.OldHWM) { return(hist); } if (serviceWithFeeScale == null) { return(hist); } // был установлен новый HWM? var aboveHwm = shareMoney - hist.OldHWM.Value; // посчитать сумму комиссии var fee = serviceWithFeeScale.CalculateFee(shareMoney, aboveHwm); if (fee < 0.01M) { return(hist); } feeWasTaken = true; // этот самый кусочек приписать владельцу и списать его с пайщика ownersMoney += fee; shareMoney -= fee; ownerShare.Share = ownersMoney * 100M / equity; share.Share = shareMoney * 100M / equity; var newHwm = shareMoney; if (newHwm > share.HWM) { share.HWM = newHwm; hist.NewHWM = newHwm; } return(hist); }