private void ShowInfoWindow(object sender, EventArgs args)
        {
            var info = "Особенности отчета:\n" +
                       "<b>Ситуация 1.</b> У водителя не было закрепленных районов доставки на некоторую дату, и он закрыл какой-либо МЛ " +
                       "в этот день.\n" +
                       "З/П по адресам этого МЛ начислится как за чужой район, и заказы появятся в данном отчете, в \"закрепленных " +
                       "районах\" будет пусто.\n" +
                       "В тот же день водителю добавили районы доставки, в таком случае (у водителя их еще не было), районы активируются " +
                       "сразу \n" +
                       "в 00 часов 00 минут того же дня, а не на следующий день. Итог - после повторной генерации отчета \n" +
                       "у заказов появятся \"закрепленные районы\", которые, к тому же, могут совпасть с \"районом доставки\".\n" +
                       "<b>Ситуация 2.</b> У некоторого водителя ставка за свой и чужой районы на момент выполнения МЛ может совпадать.\n" +
                       "В отчет попадают заказы, у которых переплата больше нуля.\n" +
                       "Затем водителю сделали разницу в ставках за районы. Отчет отобразит заказы, если после изменения ставок ЗП за МЛ " +
                       "будет пересчитана.\n\n" +
                       "Сокращения отчета:\n" +
                       "<b>КТС</b>: категория транспортного средства. \n\tСокращения столбца: " +
                       "<b>К</b>: транспорт компании , <b>Н</b>: наемный транспорт, <b>Л</b>: ларгус, <b>Ф</b>: фура, <b>Г</b>: газель.\n\n" +
                       "Столбцы отчета:\n" +
                       "<b>№</b>: порядковый номер\n" +
                       "<b>№ МЛ</b>: номер маршрутного листа\n" +
                       "<b>№ заказа</b>: номер заказа маршрутного листа\n" +
                       "<b>ФИО водителя</b>: фамилия имя отчество водителя\n" +
                       "<b>ФИО логиста</b>: фамилия имя отчество логиста, создавшего МЛ\n" +
                       "<b>КТС</b>: вид транспорта, которым управляет водитель\n" +
                       "<b>Подразделение</b>: подразделение водителя\n" +
                       "<b>Адрес</b>: адрес в чужом для водителя районе\n" +
                       "<b>Переплата</b>: разница между ставкой за 1 адрес в чужом районе и ставкой за свой район\n" +
                       "<b>Район адреса</b>\n" +
                       "<b>Закрепленные районы</b>: закрепленные за водителем районы на дату МЛ\n" +
                       "<b>Комментарий</b>: комментарий к адресу из диалога Разбор МЛ";

            _interactiveService.ShowMessage(ImportanceLevel.Info, info, "Информация");
        }
Ejemplo n.º 2
0
        private void ShowInfoWindow()
        {
            var info =
                "<b>1.</b> Подсчет продаж ведется на основе заказов. В отчете учитываются заказы со статусами:" +
                $"\n\t'{OrderStatus.Accepted.GetEnumTitle()}'" +
                $"\n\t'{OrderStatus.InTravelList.GetEnumTitle()}'" +
                $"\n\t'{OrderStatus.OnLoading.GetEnumTitle()}'" +
                $"\n\t'{OrderStatus.OnTheWay.GetEnumTitle()}'" +
                $"\n\t'{OrderStatus.Shipped.GetEnumTitle()}'" +
                $"\n\t'{OrderStatus.UnloadingOnStock.GetEnumTitle()}'" +
                $"\n\t'{OrderStatus.Closed.GetEnumTitle()}'" +
                $"\n\t'{OrderStatus.WaitForPayment.GetEnumTitle()}' и заказ - самовывоз с оплатой после отгрузки." +
                "\nВ отчет <b>не попадают</b> заказы, являющиеся закрывашками по контракту." +
                "\nФильтр по дате отсекает заказы, если дата доставки не входит в выбранный период." +

                "\n\n<b>2.</b> Подсчет тары ведется следующим образом:" +
                "\n\tПлановое значение - сумма бутылей на возврат попавших в отчет заказов;" +
                "\n\tФактическое значение - сумма фактически возвращенных бутылей по адресам маршрутного листа." +
                "\n\t\tФактическое значение возвращенных бутылей по адресу зависит от того, доставлен<b>(*)</b> заказ или нет:" +
                "\n\t\t\t <b>-</b> Если да - берется кол-во бутылей, которое по факту забрал водитель. " +
                "Это кол-во может быть вручную указано при закрытии МЛ;" +

                "\n\t\t\t <b>-</b> Если не доставлен - берется кол-во бутылей на возврат из заказа;" +
                "\n\t\t\t <b>-</b> Если заказ является самовывозом - берется значение возвращенной тары, указанное в отпуске самовывоза;" +
                $"\n\t\t <b>*</b> Заказ считается доставленным, если его статус в МЛ: '{RouteListItemStatus.Completed.GetEnumTitle()}' или " +
                $"'{RouteListItemStatus.EnRoute.GetEnumTitle()}' и статус МЛ '{RouteListStatus.Closed.GetEnumTitle()}' " +
                $"или '{RouteListStatus.OnClosing.GetEnumTitle()}'." +
                "\n\nДетальный отчет аналогичен обычному, лишь предоставляет расширенную информацию.";

            _interactiveService.ShowMessage(ImportanceLevel.Info, info, "Справка по работе с отчетом");
        }
        private void ShowInfoWindow(object sender, EventArgs e)
        {
            var info = "Сокращения отчета:\n" +
                       "<b>КТС</b>: категория транспортного средства. \n\tСокращения столбца: " +
                       "<b>К</b>: ТС компании , <b>В</b>: ТС водителя, <b>Р</b>: ТС в раскате, <b>Л</b>: Фургон (Ларгус), <b>Г</b>: Грузовой (Газель).\n" +
                       "Столбцы отчета:\n" +
                       "<b>№</b>: порядковый номер\n" +
                       "<b>Код</b>: код сотрудника\n" +
                       "<b>ФИО</b>: фамилия имя отчество сотрудника\n" +
                       "<b>Категория</b>: категория сотрудника (Водитель, Экспедитор)\n" +
                       "<b>Управляет</b>: вид транспорта, которым управляет сотрудник ЕСЛИ сотрудник - водитель\n" +
                       "<b>Работает с сотрудником</b>: поле \"Экспедитор по умолчанию\" для водителей\n" +
                       "Если же сотрудник - экспедитор, то к какому водителю он приставлен по умолчанию. Если поле не заполнено, то пустота\n" +
                       "<b>Кол-во рабочих дней</b>: общее количество отработанных дней водителем, <b>Рабочий день</b> - день, в котором есть хотя бы один закрытый МЛ\n" +
                       "<b>Кол-во адресов</b>: общее количество адресов, которые объехал водитель (заказов в закрытых МЛ ) фактическое (не перенес, не отменен, не опоздали)\n" +
                       "<b>Адресов в среднем за день</b>: Кол-во адресов / Кол-во рабочих дней (округлены до целого)\n" +
                       "<b>Кол-во полных бутылей</b>: общее количество перевезенных полных бутылей фактическое\n" +
                       "<b>Полных бутылей в среднем за день</b>: общее количество перевезенных полных бутылей / количество рабочих дней (округлены до целого)\n" +
                       "<b>Кол-во пустых бутылей</b>: общее количество перевезенных пустых бутылей фактическое\n" +
                       "<b>Пустых бутылей в среднем за день</b>: общее количество перевезенных пустых бутылей / количество рабочих дней (округлены до целого)\n" +
                       "<b>ЗП за месяц</b>: фактическая ЗП за месяц\n" +
                       "<b>ЗП за месяц среднее за день</b>: ЗП за месяц / кол- во рабочих дней\n" +
                       "<b>Расчетная ЗП за 22 р.д.</b>: с ЗП за месяц среднее в день * 22\n";

            _interactiveService.ShowMessage(ImportanceLevel.Info, info, "Информация");
        }
Ejemplo n.º 4
0
 private void OnButtonCreateReportClicked(object sender, EventArgs args)
 {
     if (!enumchecklistIndicators.SelectedValues.Any())
     {
         interactiveService.ShowMessage(ImportanceLevel.Warning, "Не выбрано ни 1 показателя");
         return;
     }
     LoadReport?.Invoke(this, new LoadReportEventArgs(GetReportInfo()));
 }
Ejemplo n.º 5
0
        public bool CreateLogin(string login, string password)
        {
            logger.Info("Создание учетной записи на сервере...");

            try {
                //Проверка существует ли логин
                string sql = "SELECT COUNT(*) FROM users WHERE login = @login";
                mysqlProvider.CheckConnectionAlive();
                MySqlCommand cmd = new MySqlCommand(sql, mysqlProvider.DbConnection);
                cmd.Parameters.AddWithValue("@login", login);
                if (Convert.ToInt32(cmd.ExecuteScalar()) > 0)
                {
                    string message = "Пользователь с логином " + login + " уже существует в базе. " +
                                     "Создание второго пользователя с таким же логином невозможно.";
                    interactiveService.ShowMessage(Dialog.ImportanceLevel.Error, message, "Создание учетной записи на сервере");
                    return(false);
                }

                sql = "SELECT COUNT(*) from mysql.user WHERE USER = @login";
                cmd = new MySqlCommand(sql, mysqlProvider.DbConnection);
                cmd.Parameters.AddWithValue("@login", login);
                try {
                    if (Convert.ToInt32(cmd.ExecuteScalar()) > 0)
                    {
                        string message = "Пользователь с логином " + login + " уже существует на сервере. " +
                                         "Если он использовался для доступа к другим базам, может возникнуть путаница. " +
                                         "Использовать этот логин?";
                        bool result = interactiveService.Question(message, "Создание учетной записи на сервере");
                        return(result);
                    }
                } catch (MySqlException ex) {
                    if (ex.Number == 1045)
                    {
                        logger.Warn(ex, "Нет доступа к таблице пользователей, пробую создать пользователя в слепую.");
                    }
                    else
                    {
                        return(false);
                    }
                }
                //Создание пользователя.
                sql = "CREATE USER @login IDENTIFIED BY @password";
                cmd = new MySqlCommand(sql, mysqlProvider.DbConnection);
                cmd.Parameters.AddWithValue("@login", login);
                cmd.Parameters.AddWithValue("@password", password);
                cmd.ExecuteNonQuery();
                cmd.CommandText = "CREATE USER @login @'localhost' IDENTIFIED BY @password";
                cmd.ExecuteNonQuery();

                logger.Info("Ok");
                return(true);
            } catch (Exception ex) {
                logger.Error(ex, "Ошибка создания пользователя!");
                throw ex;
            }
        }
Ejemplo n.º 6
0
 protected void OnButtonCreateReportClicked(object sender, EventArgs e)
 {
     if (dateperiodpicker.StartDate != default(DateTime))
     {
         OnUpdate(true);
     }
     else
     {
         _interactiveService.ShowMessage(ImportanceLevel.Warning, "Заполните дату.");
     }
 }
Ejemplo n.º 7
0
        public void AddAnalog()
        {
            if (Entity.Type == null)
            {
                interactiveService.ShowMessage(ImportanceLevel.Error, "Не указан тип номенклатуры!");
                return;
            }
            var page = NavigationManager.OpenViewModel <ProtectionToolsJournalViewModel>(this, OpenPageOptions.AsSlave);

            page.ViewModel.SelectionMode   = QS.Project.Journal.JournalSelectionMode.Multiple;
            page.ViewModel.OnSelectResult += Analog_OnSelectResult;
        }
Ejemplo n.º 8
0
        protected void OnButtonOkClicked(object sender, EventArgs e)
        {
            if (entryLogin.Text == "root")
            {
                string        Message = "Операции с пользователем root запрещены.";
                MessageDialog md      = new MessageDialog(this, DialogFlags.DestroyWithParent,
                                                          MessageType.Warning,
                                                          ButtonsType.Ok,
                                                          Message);
                md.Run();
                md.Destroy();
                return;
            }
            var regex = new Regex(@"^[A-Za-z\d.,_-]+\Z");

            if (!regex.IsMatch(entryLogin.Text))
            {
                interactiveService.ShowMessage(Dialog.ImportanceLevel.Error, "Логин может состоять только из букв английского алфавита, нижнего подчеркивания, дефиса, точки и запятой");
                entryLogin.Text = string.Empty;
                return;
            }
            if (IsNewUser)
            {
                mySQLUserRepository.CreateUser(User, entryPassword.Text, GetExtraFieldsForSelect(), GetExtraFieldsForInsert(), GetPermissionValues());
            }
            else
            {
                mySQLUserRepository.UpdateUser(User, entryPassword.Text, GetExtraFieldsForUpdate(), GetPermissionValues());
                userpermissionwidget.Save();
            }
        }
Ejemplo n.º 9
0
        /// <summary>
        /// Метод берет последовательность доставки из предложенного маршрута и переносит его в маршрутный лист.
        /// Переносится только последовательность адресов. Никакие адреса не добавляются и не удаляются.
        /// Метод нужен для перестройки с учетов времени уже имеющегося МЛ.
        /// </summary>
        public void UpdateAddressOrderInRealRoute(RouteList updatedRoute)
        {
            if (updatedRoute.Status > RouteListStatus.InLoading)
            {
                _interactiveService.ShowMessage(ImportanceLevel.Error,
                                                $"Была выполнена попытка перестроить маршрут {updatedRoute.Id} после того, как он отгружен. Проверьте фильтр \"Показать уехавшие\".");

                return;
            }

            for (int i = 0; i < updatedRoute.ObservableAddresses.Count; i++)
            {
                var address = updatedRoute.ObservableAddresses[i];
                if (i < Orders.Count)
                {
                    if (Orders[i].Order.Id != updatedRoute.ObservableAddresses[i].Order.Id)
                    {
                        address = updatedRoute.ObservableAddresses.First(x => x.Order.Id == Orders[i].Order.Id);
                        updatedRoute.ObservableAddresses.Remove(address);
                        updatedRoute.ObservableAddresses.Insert(i, address);
                    }
                    address.PlanTimeStart = Orders[i].ProposedTimeStart;
                    address.PlanTimeEnd   = Orders[i].ProposedTimeEnd;
                }
                else
                {
                    address.PlanTimeStart = null;
                    address.PlanTimeEnd   = null;
                }
            }
        }
Ejemplo n.º 10
0
 private void ShowInfoMessage()
 {
     _interactiveService.ShowMessage(
         ImportanceLevel.Info,
         "Во все отчёты попадают только:\n" +
         $"Контрагенты с формой '{PersonType.legal.GetEnumTitle()}'\n" +
         $"Заказы с формой оплаты '{PaymentType.cashless.GetEnumTitle()}', суммой больше 0 и статусом оплаты не равным '{OrderPaymentStatus.Paid.GetEnumTitle()}'\n\n" +
         $"<b>{ybuttonCounterpartyDebtBalance.Label}</b>:\n" +
         "Доступен только если не выбран контрагент \n\n" +
         $"<b>{ybuttonCounterpartyDebtDetails.Label}</b>:\n" +
         "Доступен только если выбран контрагент\n\n" +
         $"Если <b>{chkOrderByDate.Label}</b> не активна:\n" +
         $"- <b>{ybuttonCounterpartyDebtBalance.Label}</b> сортируется по последнему столбцу\n" +
         $"- <b>{ybuttonNotPaidOrders.Label}</b> сортируются по последнему столбцу\n" +
         $"- <b>{ybuttonCounterpartyDebtDetails.Label}</b> сортировка была по дате платежа по убыванию,\n" +
         "а внутри блока платежа закрытые суммы заказов данным платежом.\n" +
         "Выше до всех платежей идут незакрытые суммы неоплаченных/частично оплаченных заказов.\n" +
         "Заказы внутри блока также сортируются по дате доставки по убыванию\n\n" +
         $"Если <b>{chkOrderByDate.Label}</b> активна:\n" +
         $"- <b>{ybuttonCounterpartyDebtBalance.Label}</b> сортируется по последнему столбцу\n" +
         $"- <b>{ybuttonNotPaidOrders.Label}</b> сортируются по столбцу \"Дата доставки\"\n" +
         $"- <b>{ybuttonCounterpartyDebtDetails.Label}</b> сортируется по столбцу \"Дата доставки заказа. Время операции\" по убыванию.\n" +
         "При этом заказы не привязаны к платежу и не разбиваются по закрытым/незакрытым суммам"
         );
 }
Ejemplo n.º 11
0
        void StartCreation(string server, string dbname, string login, string password)
        {
            var createModel = autofacScope.Resolve <MySqlDbCreateModel>(new TypedParameter(typeof(IDbCreateController), this));

            try {
                bool success = createModel.RunCreation(server, dbname, login, password);
                if (success)
                {
                    interactive.ShowMessage(ImportanceLevel.Info, "Создание базы успешно завершено.\nЗайдите в программу под администратором для добавления пользователей.");
                }
            }
            finally {
                if (progressPage != null)
                {
                    navigation.ForceClosePage(progressPage, CloseSource.FromParentPage);
                }
            }
        }
Ejemplo n.º 12
0
        private void OnButtonHelpClicked(object sender, EventArgs e)
        {
            var info =
                "В отчёт попадают заказы с учётом выбранных фильтров, а также следующих условий:\n" +
                "- есть возвращённые бутыли\n" +
                "- отстуствуют тмц категории \"Вода\" с объёмом тары 19л.";

            _interactiveService.ShowMessage(ImportanceLevel.Info, info, "Информация");
        }
Ejemplo n.º 13
0
        public static bool MySqlExceptionAuthHandler(Exception exception, IApplicationInfo application, UserBase user, IInteractiveService interactiveMessage)
        {
            var mysqlEx = ExceptionHelper.FindExceptionTypeInInner <MySqlException>(exception);

            if (mysqlEx != null && mysqlEx.Message.Contains("Authentication to host"))
            {
                interactiveMessage.ShowMessage(ImportanceLevel.Info, "Пароль вашего аккаунта был сброшен, для продолжения работы перезайдите в программу");
                return(true);
            }
            return(false);
        }
Ejemplo n.º 14
0
        void ShowInfoWindow(object sender, EventArgs args)
        {
            var info = "Фильтры отчета:\n" +
                       "<b>Категория</b>: выбор категории сотрудника\n" +
                       "<b>Фильтр статусов</b>: позволяет выбрать несколько статусов. Если не выбран ни один статус - в таблицу попадут сотрудники с любыми статусами\n" +
                       "<b>Фильтры периодов</b>: не обязательны для выбора и не конфликтуют между собой. " +
                       "<b>Периоды по дате расчета и увольнения</b>: учитываются, если выбраны соответствующие статусы\n" +
                       "<b>В отчет не попадают</b>: водители управляющие фурой компании, являющиеся разовыми, являющиеся мастерами\n";

            _interactiveService.ShowMessage(ImportanceLevel.Info, info, "Информация");
        }
Ejemplo n.º 15
0
        public void OpenLastIssue(EmployeeCardItem row)
        {
            var referencedoc = employeeIssueRepository.GetReferencedDocuments(row.LastIssueOperation.Id);

            if (!referencedoc.Any() || referencedoc.First().DocumentType == null)
            {
                interactive.ShowMessage(ImportanceLevel.Error, "Не найдена ссылка на документ выдачи");
                return;
            }
            stockDocumentsModel.EditDocumentDialog(employeeViewModel, referencedoc.First());
        }
Ejemplo n.º 16
0
        public void NewOrderCommand()
        {
            if (currentCounterparty.IsForRetail)
            {
                _interactiveService.ShowMessage(ImportanceLevel.Warning, "Заказ поступает от контрагента дистрибуции");
            }
            var   model = CounterpartyOrdersViewModels.Find(m => m.Client.Id == currentCounterparty.Id);
            IPage page  = _tdiNavigation.OpenTdiTab <OrderDlg, Counterparty>(null, currentCounterparty);

            page.PageClosed += (sender, e) => { model.RefreshOrders(); };
        }
Ejemplo n.º 17
0
        public static bool SocketTimeoutException(Exception exception, IApplicationInfo application, UserBase user, IInteractiveService interactiveService)
        {
            var nhibernateEx = ExceptionHelper.FindExceptionTypeInInner <NHibernate.Exceptions.GenericADOException>(exception);
            var timeOutEx    = ExceptionHelper.FindExceptionTypeInInner <System.Net.Sockets.SocketException>(exception);

            if (nhibernateEx != null && timeOutEx != null && timeOutEx.SocketErrorCode == System.Net.Sockets.SocketError.TimedOut)
            {
                interactiveService.ShowMessage(ImportanceLevel.Warning, "Программа не смогла обработать запрос вовремя, переоткройте вкладку");
                return(true);
            }
            return(false);
        }
Ejemplo n.º 18
0
        bool Validate()
        {
            string errorString = string.Empty;

            if (!(ydateperiodpickerCreate.StartDateOrNull.HasValue &&
                  ydateperiodpickerCreate.EndDateOrNull.HasValue))
            {
                errorString = "Не выбран период";
                interactiveService.ShowMessage(ImportanceLevel.Error, errorString);
                return(false);
            }

            return(true);
        }
Ejemplo n.º 19
0
        public DocumentsPrinterViewModel(
            IEntityDocumentsPrinterFactory entityDocumentsPrinterFactory,
            IInteractiveService interactiveService,
            INavigationManager navigationManager,
            Order order) : base(interactiveService, navigationManager)
        {
            EntityDocumentsPrinter =
                (entityDocumentsPrinterFactory ?? throw new ArgumentNullException(nameof(entityDocumentsPrinterFactory)))
                .CreateOrderDocumentsPrinter(order);

            TabName = "Печать документов заказа";

            if (!string.IsNullOrEmpty(EntityDocumentsPrinter.ODTTemplateNotFoundMessages))
            {
                interactiveService.ShowMessage(ImportanceLevel.Warning, EntityDocumentsPrinter.ODTTemplateNotFoundMessages);
            }

            _currentOrder = order;
            Configure();
        }
Ejemplo n.º 20
0
        private void OnSendSmsButtonPressed(object btn, EventArgs args)
        {
            if (_order.Id == 0)
            {
                _interactiveService.ShowMessage(ImportanceLevel.Error, "Перед отправкой SMS необходимо сохранить заказ",
                                                "Не удалось отправить SMS");
                return;
            }
            if (string.IsNullOrWhiteSpace(validatedPhoneEntry.Text))
            {
                _interactiveService.ShowMessage(ImportanceLevel.Error, "Вы забыли выбрать номер.", "Не удалось отправить SMS");
                return;
            }

            var alreadySentSms = _smsPaymentRepository.GetSmsPaymentsForOrder(
                InfoProvider.UoW,
                _order.Id,
                _excludeSmsPaymentStatuses
                );

            var paidSmsPayments    = alreadySentSms.Where(x => x.SmsPaymentStatus == SmsPaymentStatus.Paid).ToList();
            var waitingSmsPayments = alreadySentSms.Where(x =>
                                                          x.SmsPaymentStatus == SmsPaymentStatus.WaitingForPayment &&
                                                          DateTime.Now.Subtract(x.CreationDate).TotalMinutes < 60
                                                          ).ToList();

            if (paidSmsPayments.Any())
            {
                var paidStringBuilder = new StringBuilder();

                foreach (var payment in paidSmsPayments)
                {
                    paidStringBuilder.AppendLine($"\tКод платежа:     {payment.Id}");
                    paidStringBuilder.AppendLine($"\tТелефон:            +7 {_phoneFormatter.FormatString(payment.PhoneNumber)}");
                    paidStringBuilder.AppendLine($"\tДата создания:  {payment.CreationDate}");
                    paidStringBuilder.AppendLine($"\tДата оплаты:     {payment.PaidDate}");
                    paidStringBuilder.AppendLine($"\tНомер оплаты:  {payment.ExternalId}");
                    paidStringBuilder.AppendLine();
                }

                var sendPayment = _interactiveService.Question("Для заказа уже есть ранее оплаченные платежи по SMS:\n\n" +
                                                               $"{paidStringBuilder}" +
                                                               "Вы уверены что хотите отправить ещё одну SMS?");

                if (!sendPayment)
                {
                    return;
                }
            }
            else if (waitingSmsPayments.Any())
            {
                var waitingStringBuilder = new StringBuilder();

                foreach (var payment in waitingSmsPayments)
                {
                    waitingStringBuilder.AppendLine($"\tКод платежа:     {payment.Id}");
                    waitingStringBuilder.AppendLine($"\tТелефон:            +7 {_phoneFormatter.FormatString(payment.PhoneNumber)}");
                    waitingStringBuilder.AppendLine($"\tДата создания:  {payment.CreationDate}");
                    waitingStringBuilder.AppendLine();
                }

                var sendPayment = _interactiveService.Question("Для заказа найдены SMS, ожидающие оплату клиента:\n\n" +
                                                               $"{waitingStringBuilder}" +
                                                               "Вы уверены что хотите отправить ещё одну SMS?");

                if (!sendPayment)
                {
                    return;
                }
            }

            btnSendFastPaymentPayByQrUrlBySms.Sensitive = btnSendFastPaymentPayByCardUrlBySms.Sensitive = ySendSmsButton.Sensitive = false;
            GLib.Timeout.Add(10000, () =>
            {
                btnSendFastPaymentPayByQrUrlBySms.Sensitive   = true;
                btnSendFastPaymentPayByCardUrlBySms.Sensitive = _canSendSmsForPayFromSbpByCard;
                ySendSmsButton.Sensitive = _canSendSmsForPayFromYookassa;

                return(false);
            });

            var           smsSender = new SmsPaymentSender();
            PaymentResult result;

            try
            {
                result = smsSender.SendSmsPaymentToNumber(_order.Id, validatedPhoneEntry.Text);
            }
            catch (TimeoutException)
            {
                _interactiveService.ShowMessage(ImportanceLevel.Warning,
                                                "Превышено время ожидания ответа от сервиса оплаты по SMS.\nЕсли SMS не была отправлена, произведите повторную отправку");
                return;
            }
            switch (result.Status)
            {
            case PaymentResult.MessageStatus.Ok:
                _interactiveService.ShowMessage(ImportanceLevel.Info, "SMS отправлена успешно");
                break;

            case PaymentResult.MessageStatus.Error:
                _interactiveService.ShowMessage(ImportanceLevel.Error, result.ErrorDescription, "Не удалось отправить SMS");
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
        }