public Task Handle(V1.RemoveService command)
 => Handle(
     command.OrderId,
     state => Order.RemoveService(
         state, PaidService.Find(command.ServiceType)
         )
     );
コード例 #2
0
 public bool RegisterOrUpdateService(ProtectedOperationContext ctx, PaidService service, out WalletError error)
 {
     error = WalletError.OK;
     if (Channel == null)
     {
         throw new Exception("WalletManagerProxy: связь не установлена");
     }
     try
     {
         return(Channel.RegisterOrUpdateService(ctx, service, out error));
     }
     catch
     {
         RenewFactory();
         try
         {
             return(Channel.RegisterOrUpdateService(ctx, service, out error));
         }
         catch (Exception ex2)
         {
             Logger.Error("RegisterOrUpdateService() error: ", ex2);
             return(false);
         }
     }
 }
コード例 #3
0
        /// <summary>
        /// отключить услугу
        /// </summary>
        private void DeregisterTradeSignals(PaidService service)
        {
            if (service == null)
            {
                return;
            }

            // отписаться от услуги
            WalletError error;

            try
            {
                TradeSharpWalletManager.Instance.proxy.DisableService(
                    CurrentProtectedContext.Instance.MakeProtectedContext(),
                    service.Id, out error);
            }
            catch (Exception ex)
            {
                Logger.ErrorFormat("TradeSharpWalletManager.DisableService({0}) error: {1}", service.Id, ex);
                error = WalletError.CommonError;
            }

            if (error == WalletError.OK)
            {
                MessageBox.Show(Localizer.GetString("MessageServiceIsTurnedOff"),
                                Localizer.GetString("TitleConfirmation"),
                                MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                ShowSignallerOptions(editedUser);
            }
            else
            {
                MessageBox.Show(EnumFriendlyName <WalletError> .GetString(error),
                                Localizer.GetString("TitleError"), MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
コード例 #4
0
        public static ActivePaidService Create(
            PaidService paidService,
            DateTimeOffset startFrom)
        {
            var expiresAt = startFrom + paidService.Duration;

            return(new ActivePaidService(paidService, expiresAt));
        }
コード例 #5
0
        private void SetupGrids()
        {
            var blank = new PaidService();

            // торговые сигналы
            gridServiceSignal.Columns.Add(new FastColumn(blank.Property(s => s.AccountId),
                                                         Localizer.GetString("TitleAccount"))
            {
                formatter = value => Localizer.GetString("TitleAccountNumber") + value.ToString(),
                SortOrder = FastColumnSort.Ascending
            });
            gridServiceSignal.Columns.Add(new FastColumn(blank.Property(s => s.FixedPrice),
                                                         Localizer.GetString("TitlePerDay"))
            {
                rowFormatter = valueObject =>
                {
                    var srv = (PaidService)valueObject;
                    return(srv.FixedPrice.ToStringUniformMoneyFormat() + " " + srv.Currency);
                }
            });
            gridServiceSignal.Columns.Add(new FastColumn(blank.Property(s => s.FixedPriceMonth),
                                                         Localizer.GetString("TitleInMonth"))
            {
                rowFormatter = valueObject =>
                {
                    var srv = (PaidService)valueObject;
                    return(srv.FixedPriceMonth.ToStringUniformMoneyFormat() + " " + srv.Currency);
                }
            });

            gridServiceSignal.CalcSetTableMinWidth();

            // ПАММ
            gridServicePAMM.Columns.Add(new FastColumn(blank.Property(s => s.AccountId), Localizer.GetString("TitleAccount"))
            {
                formatter = value => Localizer.GetString("TitleAccountNumber") + value.ToString(),
                SortOrder = FastColumnSort.Ascending
            });
            gridServicePAMM.Columns.Add(new FastColumn(blank.Property(s => s.FixedPrice), Localizer.GetString("TitleReward"))
            {
                rowFormatter = valueObject =>
                {
                    var srv = (PaidService)valueObject;
                    if (srv.serviceRates.Count == 0)
                    {
                        return("-");
                    }
                    return(string.Join(", ",
                                       srv.serviceRates.Select(s => string.Format("{0}{1}%",
                                                                                  s.UserBalance == 0 ? "" : (Localizer.GetString("TitleFromSmall") + " " + s.UserBalance.ToStringUniformMoneyFormat() + " - "), s.Amount))));
                }
            });

            gridServicePAMM.CalcSetTableMinWidth();
        }
コード例 #6
0
        static void Main(string[] args)
        {
            var array = new PaidService[] { new FixedHourlyCostPaidService("service1", "Google Orkut", 11),
                                            new FixedHourlyCostPaidService("service2", "Google Voice", 9.4),
                                            new FixedMonthlyCostPaidService("service5", "YouTube", 8064),
                                            new FixedHourlyCostPaidService("service3", "Mandrill", 11.2),
                                            new FixedHourlyCostPaidService("service4", "Google Finance", 7.8),
                                            new FixedMonthlyCostPaidService("service7", "Google Building Maker", 5347),
                                            new FixedMonthlyCostPaidService("service6", "LinkedIn", 6863), };
            //1.Вывести id, name и среднемесячные затраты для всех элементов массива. Вывод должен
            //быть упорядочен по убыванию среднемесячных затрат. При совпадении суммы затрат –
            //упорядочивать данные по названию сервиса(в алфавитном порядке от "a" до "z").

            //var newArray = from n in array
            //               orderby n.calculateAverageMonthlyCosts() descending, n.name ascending
            //               select n;

            Func <PaidService, double> lambdaCalculateAverageMonthlyCosts = a => a.calculateAverageMonthlyCosts();

            var newArray = array
                           .OrderByDescending(lambdaCalculateAverageMonthlyCosts)
                           .ThenBy(a => a.name);

            foreach (var item in newArray)
            {
                Console.WriteLine(item);
            }

            //{
            //    var newArray = array;


            //    foreach (var item in newArray)
            //        Console.WriteLine(item);
            //}

            //2.Вывести первые 5 значений свойства name элементов из упорядоченного списка в пункте(1).
            foreach (var item in newArray.Take(5))
            {
                Console.WriteLine(item.name);
            }
            array.Count();
            //3.Вывести последние 3 значения свойства id элементов из упорядоченного списка в пункте(1).
            foreach (var item in newArray.Skip(newArray.Count() - 3))
            {
                Console.WriteLine(item.id);
            }
            //4.Сравнить среднемесячные затраты на сервисы YouTube и Mandrill.Вывести сравниваемые
            //сервисы в порядке убывания затрат или два сервиса в одну строку через слеш(/), если
            //затраты равны.

            Console.WriteLine("==============================================");
            Console.Write(zad4(array, lambdaCalculateAverageMonthlyCosts));
        }
コード例 #7
0
 public static PaidServiceItem FromDomain(
     PaidService paidService)
 => new PaidServiceItem
 {
     Description = paidService.Description,
     Price       = $"€{paidService.Price}",
     Duration    = paidService.Duration == TimeSpan.Zero
             ? null : $"{paidService.Duration.Days} days",
     Attributes = paidService.Attributes,
     Type       = paidService.GetType().Name
 };
コード例 #8
0
 public ServiceDetailForm(int serviceId)
     : this()
 {
     try
     {
         service = TradeSharpWalletManager.Instance.proxy.GetPaidServiceDetail(serviceId, out user);
     }
     catch (Exception ex)
     {
         Logger.Error("ServiceDetailForm - GetPaidServiceDetail(" + serviceId + ")", ex);
     }
 }
コード例 #9
0
        public static bool RegisterOrUpdateService(PaidService service)
        {
            // получить кошелек пользователя
            Wallet wallet;

            try
            {
                wallet =
                    TradeSharpWalletManager.Instance.proxy.GetUserWallet(
                        CurrentProtectedContext.Instance.MakeProtectedContext(),
                        AccountStatus.Instance.Login);
                if (wallet == null)
                {
                    throw new Exception("Кошелек не заведен");
                }
            }
            catch (Exception ex)
            {
                Logger.ErrorFormat("GetUserWallet({0}) error: {1}", AccountStatus.Instance.Login, ex);
                dialogBoxProvider.ShowMessageBox("Не удалось получить данные о кошельке", "Ошибка",
                                                 MessageBoxButtons.OK, MessageBoxIcon.Error);
                return(false);
            }

            // отправить на сервер запрос
            service.User = wallet.User;
            WalletError error;

            try
            {
                TradeSharpWalletManager.Instance.proxy.RegisterOrUpdateService(
                    CurrentProtectedContext.Instance.MakeProtectedContext(),
                    service, out error);
            }
            catch (Exception ex)
            {
                Logger.ErrorFormat("TradeSharpWalletManager.RegisterOrUpdateService({0}) error: {1}", AccountStatus.Instance.Login, ex);
                error = WalletError.CommonError;
            }

            if (error == WalletError.OK)
            {
                dialogBoxProvider.ShowMessageBox("Сервис зарегистрирован в системе", "Подтверждение",
                                                 MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                return(true);
            }

            dialogBoxProvider.ShowMessageBox(EnumFriendlyName <WalletError> .GetString(error),
                                             "Ошибка регистрации сервера", MessageBoxButtons.OK, MessageBoxIcon.Error);
            return(false);
        }
コード例 #10
0
        private void TbFeeSignalMonthTextChanged(object sender, EventArgs e)
        {
            var srcTextBox = (TextBox)sender;
            var val        = srcTextBox.Text.ToDecimalUniformSafe();

            if (val == null)
            {
                return;
            }

            var targetVal = PaidService.GetMonthFeeFromDailyFee(val.Value, srcTextBox == tbFeeSignalMonth);
            var targetBox = srcTextBox == tbFeeSignalMonth ? tbFeeSignalDay : tbFeeSignalMonth;

            targetBox.TextChanged -= TbFeeSignalMonthTextChanged;
            targetBox.Text         = targetVal.ToStringUniformMoneyFormat(true);
            targetBox.TextChanged += TbFeeSignalMonthTextChanged;
        }
コード例 #11
0
 public static OrderState.Result RemoveService(
     OrderState state,
     PaidService service
     )
 => !state.Services.Contains(service)
         ? state.NoEvents()
         : state.Apply(
     new V1.ServiceRemovedFromOrder
 {
     OrderId     = state.Id,
     ServiceType = service.Type.ToString()
 },
     new V1.OrderTotalUpdated
 {
     OrderId = state.Id,
     Total   = state.GetTotal() - service.Price
 }
     );
コード例 #12
0
        public void TestCalculateAccountShare()
        {
            var mgr = PAMMFeeManager.Instance;

            var investorsShare =
                conn.ACCOUNT_SHARE.First(s => s.Account == testAccount.ID && s.ShareOwner != shareOwner.ID);
            var ownersShare =
                conn.ACCOUNT_SHARE.First(s => s.Account == testAccount.ID && s.ShareOwner == shareOwner.ID);


            var testService = new PaidService
            {
                Currency     = testAccount.Currency,
                serviceRates =
                    new List <PaidServiceRate>
                {
                    new PaidServiceRate
                    {
                        Amount      = 20,
                        RateType    = PaidServiceRate.ServiceRateType.Percent,
                        UserBalance = 0
                    }
                }
            };
            decimal ownersMoney = 0;
            bool    feeWasTaken;
            var     record = mgr.CalculateAccountShare(conn, investorsShare, ownersShare,
                                                       ref ownersMoney, 10000, testService, out feeWasTaken);

            Assert.IsFalse(feeWasTaken, "CalculateAccountShare(==HWM) - комиссия не взымается");
            Assert.IsNotNull(record, "CalculateAccountShare(==HWM) - запись д.б. создана");
            Assert.IsNotNull(record.NewHWM, "CalculateAccountShare(==HWM) - запись д.б. создана c HWM != null");
            Assert.IsNotNull(investorsShare.HWM, "CalculateAccountShare(==HWM) - HWM д.б. модифицирована");

            // "добавить" денег - HWM должен обновиться
            const int aboveEquity = 500;

            record = mgr.CalculateAccountShare(conn, investorsShare, ownersShare,
                                               ref ownersMoney, 10000 + aboveEquity, testService, out feeWasTaken);
            Assert.IsTrue(feeWasTaken, "CalculateAccountShare(>HWM) - комиссия таки взымается");
            Assert.IsNotNull(record.OldHWM, "CalculateAccountShare(==HWM) - запись д.б. создана c OldHWM != null");
        }
コード例 #13
0
 public static OrderState.Result AddService(
     OrderState state,
     PaidService service
     )
 => state.Services.Contains(service)
         ? state.NoEvents()
         : state.Apply(
     new V1.ServiceAddedToOrder
 {
     OrderId     = state.Id,
     ServiceType = service.Type.ToString(),
     Description = service.Description,
     Price       = service.Price
 },
     new V1.OrderTotalUpdated
 {
     OrderId = state.Id,
     Total   = state.GetTotal() + service.Price
 }
     );
コード例 #14
0
        private void BtnMakePAMMClick(object sender, EventArgs e)
        {
            // включить ПАММ
            if (gridServicePAMM.rows.Count == 0)
            {
                // выбрать реальный счет пользователя
                var accountSelected = UserServiceRegistrator.SelectTerminalUserAccount(true);
                if (accountSelected == null)
                {
                    return;
                }
                var dlg = new OpenPAMMForm(accountSelected.Currency);
                if (dlg.ShowDialog() == DialogResult.Cancel)
                {
                    return;
                }
                if (!dlg.EnablePAMM)
                {
                    return;
                }
                var service = new PaidService
                {
                    AccountId    = accountSelected.ID,
                    Currency     = accountSelected.Currency,
                    ServiceType  = PaidServiceType.PAMM,
                    serviceRates = dlg.ServiceRates,
                    Comment      = Localizer.GetString("TitlePAMMAccount") + " #" + accountSelected.ID
                };
                if (!UserServiceRegistrator.RegisterOrUpdateService(service))
                {
                    return;
                }
                ShowSignallerOptions(editedUser);
                return;
            }

            // отключить ПАММ-сервис
            var servicePAMM = (PaidService)gridServicePAMM.rows[0].ValueObject;

            DeregisterTradeSignals(servicePAMM);
        }
コード例 #15
0
        public void TestRegisterOrUpdateService()
        {
            var service = new PaidService
            {
                AccountId    = 51,
                Comment      = "TornSphincter",
                ServiceType  = PaidServiceType.PAMM,
                serviceRates = new List <PaidServiceRate>
                {
                    new PaidServiceRate
                    {
                        Amount   = 20,
                        RateType = PaidServiceRate.ServiceRateType.Percent
                    }
                }
            };

            var isRegistred = UserServiceRegistrator.RegisterOrUpdateService(service);

            Assert.IsTrue(isRegistred, "UserServiceRegistrator - сервис должен быть зарегистрирован");
        }
コード例 #16
0
        private void BtnMakeSignalServiceClick(object sender, EventArgs e)
        {
            // проверить введенные данные
            var listError = new List <string>();
            var feeDay    = tbFeeSignalDay.Text.ToDecimalUniformSafe();

            if (!feeDay.HasValue)
            {
                listError.Add(Localizer.GetString("MessageCannotRecognizeSignalComissionString") + ": 0 0.25 5 12.50");
            }
            if (listError.Count > 0)
            {
                MessageBox.Show(string.Join(Environment.NewLine, listError),
                                Localizer.GetString("TitleError"),
                                MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            // проверить наличие реального счета, если их несколько - дать выбор
            var accountSelected = UserServiceRegistrator.SelectTerminalUserAccount(RequireRealAccountForTradeSignals);

            if (accountSelected == null)
            {
                return;
            }

            var service = new PaidService
            {
                FixedPrice  = feeDay.Value,
                Comment     = nameTextBox.Text,
                ServiceType = PaidServiceType.Signals,
                AccountId   = accountSelected.ID
            };

            if (UserServiceRegistrator.RegisterOrUpdateService(service))
            {
                DialogResult = DialogResult.OK;
            }
        }
コード例 #17
0
 ActivePaidService(PaidService paidService, DateTimeOffset expiresAt)
 {
     Service   = paidService;
     ExpiresAt = expiresAt;
 }
コード例 #18
0
        public bool RegisterOrUpdateService(ProtectedOperationContext secCtx, PaidService service, out WalletError error)
        {
            if (!UserSessionStorage.Instance.PermitUserOperation(secCtx, false, false))
            {
                error = WalletError.InsufficientRights;
                return(false);
            }

            // проверить сервис - 1 000 000 USD в день, к примеру, перебор
            // одному пользователю недозволительно высталять 10 сервисов
            // счет должен быть реальным

            if (service.ServiceType == PaidServiceType.PAMM ||
                service.ServiceType == PaidServiceType.Signals)
            {
                // проверить  - реальный счет?
                if (!service.AccountId.HasValue)
                {
                    error = WalletError.InvalidData;
                    return(false);
                }

                if (service.FixedPrice < 0)
                {
                    error = WalletError.InvalidData;
                    return(false);
                }

                try
                {
                    using (var ctx = DatabaseContext.Instance.Make())
                    {
                        var account = ctx.ACCOUNT.FirstOrDefault(a => a.ID == service.AccountId.Value);
                        if (account == null)
                        {
                            error = WalletError.InvalidData;
                            return(false);
                        }

                        service.Currency = account.Currency;

                        // перевести сумму в USD - если она велика - вернуть false
                        // перевести стоимость сервиса в USD
                        var fixedPrice = service.FixedPrice;
                        if (account.Currency != MaxFixedPriceCheckCurrency)
                        {
                            string errorStr;
                            var    fixedPriceTarget = DalSpot.Instance.ConvertSourceCurrencyToTargetCurrency(MaxFixedPriceCheckCurrency,
                                                                                                             account.Currency, (double)service.FixedPrice, QuoteStorage.Instance.ReceiveAllData(), out errorStr);
                            if (!fixedPriceTarget.HasValue)
                            {
                                error = WalletError.InvalidData;
                                return(false);
                            }
                            fixedPrice = fixedPriceTarget.Value;
                        }

                        if (fixedPrice > MaxFixedPricePerDayUSD)
                        {
                            error = WalletError.InvalidData;
                            return(false);
                        }

                        // проверить, солько сервисов зарегистрировал пользователь?
                        // заодно проверить - нет ли сервиса того же типа с указанием того же счета
                        var user = ctx.PLATFORM_USER.FirstOrDefault(u => u.ID == service.User);
                        if (user == null)
                        {
                            error = WalletError.InvalidData;
                            return(false);
                        }

                        var existService = ctx.SERVICE.FirstOrDefault(s => s.User == user.ID &&
                                                                      s.ServiceType == (int)service.ServiceType);

                        // обновить сервис
                        if (existService != null)
                        {
                            service.Id              = existService.ID;
                            existService.AccountId  = service.AccountId;
                            existService.Comment    = service.Comment;
                            existService.FixedPrice = service.FixedPrice;
                            existService.Currency   = service.Currency;
                            // прогрессивная шкала оплаты
                            if (!CreateOrUpdateServiceFeeRecords(service, ctx, true))
                            {
                                error = WalletError.ServerError;
                                return(false);
                            }
                            ctx.SaveChanges();
                            error = WalletError.OK;
                            return(true);
                        }

                        // создать новый сервис
                        var srvNew = ctx.SERVICE.Add(new SERVICE
                        {
                            User        = service.User,
                            AccountId   = service.AccountId,
                            Comment     = service.Comment,
                            FixedPrice  = service.FixedPrice,
                            Currency    = service.Currency,
                            ServiceType = (short)service.ServiceType
                        });
                        Logger.InfoFormat("New service added: user={0}, account={1}, type={2}, price={3} {4}",
                                          service.User, service.AccountId, service.ServiceType, service.FixedPrice.ToStringUniformMoneyFormat(), service.Currency);
                        ctx.SaveChanges();
                        service.Id = srvNew.ID;
                        // прогрессивная шкала оплаты
                        if (!CreateOrUpdateServiceFeeRecords(service, ctx, false))
                        {
                            error = WalletError.ServerError;
                            return(false);
                        }

                        error = WalletError.OK;
                        return(true);
                    }
                }
                catch (Exception ex)
                {
                    Logger.Error("RegisterOrUpdateService error", ex);
                }
            }

            // не ПАММ и не сигналы...
            error = WalletError.CommonError;
            return(false);
        }
コード例 #19
0
        private bool CreateOrUpdateServiceFeeRecords(PaidService service, TradeSharpConnection ctx, bool existedService)
        {
            if (service.serviceRates == null)
            {
                service.serviceRates = new List <PaidServiceRate>();
            }
            try
            {
                if ((service.serviceRates == null || service.serviceRates.Count == 0) && !existedService)
                {
                    return(true);
                }

                // сервис уже был зарегистрирован?
                if (existedService)
                {
                    var rates = ctx.SERVICE_RATE.Where(r => r.Service == service.Id).ToList();
                    if (rates.Count == 0 && service.serviceRates.Count == 0)
                    {
                        return(true);
                    }
                    // рейты не изменились?
                    if (rates.Count == service.serviceRates.Count)
                    {
                        if (rates.All(r => service.serviceRates.Any(sr =>
                                                                    sr.Amount == r.Amount &&
                                                                    sr.UserBalance == r.UserBalance &&
                                                                    (int)sr.RateType == r.RateType)))
                        {
                            return(true);
                        }
                    }
                    // удалить имеющиеся рейты
                    foreach (var rate in rates)
                    {
                        ctx.SERVICE_RATE.Remove(rate);
                    }
                }

                // добавить рейты
                foreach (var rate in service.serviceRates)
                {
                    ctx.SERVICE_RATE.Add(new SERVICE_RATE
                    {
                        Amount      = rate.Amount,
                        Service     = service.Id,
                        UserBalance = rate.UserBalance,
                        RateType    = (int)rate.RateType
                    });
                }

                ctx.SaveChanges();

                return(true);
            }
            catch (Exception ex)
            {
                Logger.Error("CreateOrUpdateServiceFeeRecords() error", ex);
                return(false);
            }
        }
コード例 #20
0
        private void SetupGrids()
        {
            var fontBold     = new Font(Font, FontStyle.Bold);
            var dataSpeciman = new AccountShared(new Account(), true);

            // счета
            gridAccount.Columns.Add(new FastColumn(dataSpeciman.Property(s => s.AccountId), "#")
            {
                SortOrder   = FastColumnSort.Ascending,
                ColumnWidth = 60
            });
            gridAccount.Columns.Add(new FastColumn(dataSpeciman.Property(s => s.IsOwnAccount), Localizer.GetString("TitleOwner"))
            {
                ColumnMinWidth = 60,
                formatter      = value => (bool)value ? Localizer.GetString("TitleYes") : ""
            });
            gridAccount.Columns.Add(new FastColumn(dataSpeciman.Property(s => s.SharePercent), Localizer.GetString("TitlePercent"))
            {
                ColumnMinWidth = 75,
                formatter      = value =>
                {
                    var percent = ((decimal)value);
                    return(percent == 100 ? "100 %" : percent.ToString("f5") + "%");
                }
            });
            gridAccount.Columns.Add(new FastColumn(dataSpeciman.Property(s => s.ShareMoneyWallet), Localizer.GetString("TitleSum"))
            {
                ColumnMinWidth = 75,
                formatter      = value => ((decimal)value).ToStringUniformMoneyFormat()
            });

            gridAccount.Columns.Add(new FastColumn(dataSpeciman.Property(s => s.IsOwnAccount), Localizer.GetString("TitleChart"))
            {
                Tag                    = ColumnTagChart,
                ColumnMinWidth         = 60,
                ImageList              = imageListGridChart,
                IsHyperlinkStyleColumn = true,
                HyperlinkActiveCursor  = Cursors.Hand,
            });

            gridAccount.Columns.Add(new FastColumn(dataSpeciman.Property(s => s.IsOwnAccount), Localizer.GetString("TitleDeposit"))
            {
                Tag                      = ColumnTagDeposit,
                SortOrder                = FastColumnSort.Ascending,
                ColumnWidth              = 70,
                IsHyperlinkStyleColumn   = true,
                HyperlinkActiveCursor    = Cursors.Hand,
                ColorHyperlinkTextActive = Color.Blue,
                HyperlinkFontActive      = fontBold,
                formatter                = valueObject => Localizer.GetString("TitleDeposit")
            });
            gridAccount.Columns.Add(new FastColumn(dataSpeciman.Property(s => s.IsOwnAccount), Localizer.GetString("TitleWithdraw"))
            {
                Tag                      = ColumnTagWithdraw,
                SortOrder                = FastColumnSort.Ascending,
                ColumnWidth              = 63,
                IsHyperlinkStyleColumn   = true,
                HyperlinkActiveCursor    = Cursors.Hand,
                ColorHyperlinkTextActive = Color.Blue,
                HyperlinkFontActive      = fontBold,
                formatter                = valueObject => Localizer.GetString("TitleWithdraw")
            });
            gridAccount.UserHitCell += GridAccountOnUserHitCell;
            gridAccount.CheckSize();

            // подписки
            var blank = new Contract.Entity.Subscription();

            gridSubscription.Columns.Add(new FastColumn(blank.Property(p => p.PaidService), Localizer.GetString("TitleService"))
            {
                Tag                      = PaidServiceType.Signals,
                SortOrder                = FastColumnSort.Ascending,
                ColumnMinWidth           = 65,
                IsHyperlinkStyleColumn   = true,
                HyperlinkActiveCursor    = Cursors.Hand,
                ColorHyperlinkTextActive = Color.Blue,
                HyperlinkFontActive      = fontBold,
                formatter                = valueObject =>
                {
                    var srv = (PaidService)valueObject;
                    return(EnumFriendlyName <PaidServiceType> .GetString(srv.ServiceType) +
                           (string.IsNullOrEmpty(srv.Comment) ? "" : " (" + srv.Comment + ")"));
                }
            });
            gridSubscription.Columns.Add(new FastColumn(blank.Property(p => p.TimeStarted), Localizer.GetString("TitleBeginning"))
            {
                ColumnMinWidth = 75
            });
            gridSubscription.Columns.Add(new FastColumn(blank.Property(p => p.TimeEnd), Localizer.GetString("TitleEnd"))
            {
                ColumnMinWidth = 75
            });
            gridSubscription.Columns.Add(new FastColumn(blank.Property(p => p.PaidService), Localizer.GetString("TitleCost"))
            {
                ColumnMinWidth = 70,
                formatter      = valueObject =>
                {
                    var srv = (PaidService)valueObject;
                    if (srv.ServiceType == PaidServiceType.Signals)
                    {
                        return(srv.FixedPrice == 0
                                   ? "-"
                                   : srv.FixedPrice.ToStringUniformMoneyFormat(true) + " / " +
                               PaidService.GetMonthFeeFromDailyFee(srv.FixedPrice) + " " +
                               srv.Currency);
                    }
                    if (srv.ServiceType == PaidServiceType.PAMM)
                    {
                        if (srv.serviceRates.Count == 0)
                        {
                            return("-");
                        }
                        if (srv.serviceRates.Count == 1)
                        {
                            return(srv.serviceRates[0].Amount.ToStringUniformMoneyFormat(true) + "%");
                        }
                        return
                        (srv.serviceRates[srv.serviceRates.IndexOfMin(r =>
                                                                      r.Amount)].Amount.ToStringUniformMoneyFormat(true) + "% ... " +
                         srv.serviceRates[srv.serviceRates.IndexOfMin(r =>
                                                                      - r.Amount)].Amount.ToStringUniformMoneyFormat(true) + "%");
                    }
                    return("");
                }
            });
            gridSubscription.Columns.Add(new FastColumn(blank.Property(p => p.RenewAuto), Localizer.GetString("TitleProlong"))
            {
                ColumnWidth            = 61,
                formatter              = v => (bool)v ? Localizer.GetString("TitleProlong") : Localizer.GetString("TitleNo"),
                IsHyperlinkStyleColumn = true,
                HyperlinkActiveCursor  = Cursors.Hand,
                HyperlinkFontActive    = fontBold,
                Tag = true
            });
            gridSubscription.Columns.Add(new FastColumn(blank.Property(p => p.RenewAuto), Localizer.GetString("TitleTurnOff"))
            {
                ColumnWidth            = 57,
                ImageList              = imageListGrid,
                IsHyperlinkStyleColumn = true,
                HyperlinkActiveCursor  = Cursors.Hand
            });
            gridSubscription.UserHitCell += GridSubscriptionOnUserHitCell;
            gridSubscription.CheckSize();

            summaryTransfersFastGrid.Columns.Add(new FastColumn("a", " "));
            summaryTransfersFastGrid.Columns.Add(new FastColumn("b", Localizer.GetString("TitleTransactions")));
            summaryTransfersFastGrid.Columns.Add(new FastColumn("c", Localizer.GetString("TitleSum")));
        }
コード例 #21
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);
        }
コード例 #22
0
        /// <summary>
        /// возвращает - соклько раз была списана комиссия
        /// </summary>
        public int ReCalculateAccountShares(TradeSharpConnection ctx, SERVICE srv)
        {
            var feeTakenCount = 0;

            try
            {
                PaidService serviceWithFeeScale = null;

                // дольки
                var shares =
                    ctx.ACCOUNT_SHARE.Where(s => s.Account == srv.AccountId && s.ShareOwner != srv.User).ToList();
                if (shares.Count == 0)
                {
                    return(feeTakenCount);
                }

                var ownerShare =
                    ctx.ACCOUNT_SHARE.FirstOrDefault(s => s.Account == srv.AccountId && s.ShareOwner == srv.User);
                if (ownerShare == null)
                {
                    Logger.ErrorFormat(
                        "ReCalculateAccountShares(service={0}, account={1}, owner={2}) - доля владельца не найдена",
                        srv.ID, srv.AccountId, srv.User);
                    return(feeTakenCount);
                }

                var account = ctx.ACCOUNT.First(a => a.ID == srv.AccountId);

                // получить актуальный баланс (средства) счета
                var positions =
                    ctx.POSITION.Where(p => p.AccountID == srv.AccountId && p.State == (int)PositionState.Opened)
                    .ToList().Select(LinqToEntity.DecorateOrder).ToList();

                var quotes = QuoteStorage.Instance.ReceiveAllData();

                bool noQuoteError;
                var  profit = DalSpot.Instance.CalculateOpenedPositionsCurrentResult(positions,
                                                                                     quotes, account.Currency,
                                                                                     out noQuoteError);
                var equity = account.Balance + (decimal)profit;
                if (noQuoteError)
                {
                    Logger.Error("Ошибка в ReCalculateAccountShares - нет котировки для пересчета одного из тикеров (" +
                                 string.Join(", ", positions.Select(p => p.Symbol).Distinct()));
                    return(feeTakenCount);
                }

                // пересчитать долю каждого пайщика
                var ownersMoney = equity * ownerShare.Share / 100M;
                serviceWithFeeScale = GetPaidServiceProgressiveFeeScaleDetail(ctx, srv);

                foreach (var share in shares)
                {
                    bool feeWasTaken;
                    var  record = CalculateAccountShare(ctx, share, ownerShare,
                                                        ref ownersMoney, equity, serviceWithFeeScale, out feeWasTaken);
                    ctx.ACCOUNT_SHARE_HISTORY.Add(record);
                    if (feeWasTaken)
                    {
                        feeTakenCount++;
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.Error("Ошибка в ReCalculateAccountShares", ex);
            }

            return(feeTakenCount);
        }