Exemple #1
0
        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() - доля вкладчика в валюте кошелька должна быть расчитана");
        }
Exemple #3
0
        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);
        }