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, "Информация"); }
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, "Информация"); }
private void OnButtonCreateReportClicked(object sender, EventArgs args) { if (!enumchecklistIndicators.SelectedValues.Any()) { interactiveService.ShowMessage(ImportanceLevel.Warning, "Не выбрано ни 1 показателя"); return; } LoadReport?.Invoke(this, new LoadReportEventArgs(GetReportInfo())); }
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; } }
protected void OnButtonCreateReportClicked(object sender, EventArgs e) { if (dateperiodpicker.StartDate != default(DateTime)) { OnUpdate(true); } else { _interactiveService.ShowMessage(ImportanceLevel.Warning, "Заполните дату."); } }
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; }
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(); } }
/// <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; } } }
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" + "При этом заказы не привязаны к платежу и не разбиваются по закрытым/незакрытым суммам" ); }
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); } } }
private void OnButtonHelpClicked(object sender, EventArgs e) { var info = "В отчёт попадают заказы с учётом выбранных фильтров, а также следующих условий:\n" + "- есть возвращённые бутыли\n" + "- отстуствуют тмц категории \"Вода\" с объёмом тары 19л."; _interactiveService.ShowMessage(ImportanceLevel.Info, info, "Информация"); }
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); }
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, "Информация"); }
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()); }
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(); }; }
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); }
bool Validate() { string errorString = string.Empty; if (!(ydateperiodpickerCreate.StartDateOrNull.HasValue && ydateperiodpickerCreate.EndDateOrNull.HasValue)) { errorString = "Не выбран период"; interactiveService.ShowMessage(ImportanceLevel.Error, errorString); return(false); } return(true); }
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(); }
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(); } }