protected void OnButtonRecalculateToBaseClicked(object sender, EventArgs e) { var track = Vodovoz.Repository.Logistics.TrackRepository.GetTrackForRouteList(UoW, routeList.Id); var response = track.CalculateDistanceToBase(); UoW.Save(track); UoW.Commit(); UpdateDistanceLabel(); trackToBaseOverlay.Clear(); var decodedPoints = Polyline.DecodePolyline(response.RouteGeometry); var points = decodedPoints.Select(p => new PointLatLng(p.Latitude * 0.1, p.Longitude * 0.1)).ToList(); var route = new GMapRoute(points, "RouteToBase") { Stroke = new Pen(Color.Blue) { Width = 4, DashStyle = System.Drawing.Drawing2D.DashStyle.Solid } }; tracksDistance.Add(MakeDistanceLayout(route)); trackToBaseOverlay.Routes.Add(route); buttonRecalculateToBase.Sensitive = false; MessageDialogHelper.RunInfoDialog(string.Format("Расстояние от {0} до склада {1} км. Время в пути {2}.", response.RouteSummary.StartPoint, response.RouteSummary.TotalDistanceKm, response.RouteSummary.TotalTime )); }
public override bool Save() { try { SetSensetivity(false); Entity.CalculateWages(wageParameterService); UoWGeneric.Save(); var changedList = items.Where(item => item.ChangedDeliverySchedule || item.HasChanged).ToList(); if (changedList.Count == 0) { return(true); } var currentEmployee = _employeeRepository.GetEmployeeForCurrentUser(UoWGeneric); if (currentEmployee == null) { MessageDialogHelper.RunInfoDialog("Ваш пользователь не привязан к сотруднику, уведомления об изменениях в маршрутном листе не будут отправлены водителю."); return(true); } return(true); } finally { SetSensetivity(true); } }
private void EmployeeAdvanceOrder(decimal cashInput) // Метод создаёт расходник выдачи аванса из МЛ и выводит сообщение. @Дима { string message, ifAdvanceIsBigger; Expense cashExpense = null; decimal cashToReturn = Entity.MoneyToReturn - cashInput; ifAdvanceIsBigger = (cashToReturn > 0) ? "Сумма для сдачи в кассу" : "Сумма для выдачи из кассы"; // Выбор варианта сообщения. @Дима var cashier = EmployeeRepository.GetEmployeeForCurrentUser(UoW); if (cashier == null) { MessageDialogHelper.RunErrorDialog("Ваш пользователь не привязан к действующему сотруднику, вы не можете закрыть МЛ, так как некого указывать в качестве кассира."); return; } Entity.Cashier = cashier; message = Entity.EmployeeAdvanceOperation(ref cashExpense, cashInput); // Создание расходника. @Дима if (cashExpense != null) { UoW.Save(cashExpense); } cashExpense.UpdateWagesOperations(UoW); UoW.Save(); MessageDialogHelper.RunInfoDialog(String.Format("{0}\n\n{1}: {2:C0}", message, ifAdvanceIsBigger, Math.Abs(cashToReturn))); }
/// <summary> /// Перепроверка зарплаты водителя и экспедитора /// </summary> private void CheckWage() { decimal driverCurrentWage = Entity.GetDriversTotalWage(); decimal forwarderCurrentWage = Entity.GetForwardersTotalWage(); decimal driverRecalcWage = Entity.GetRecalculatedDriverWage(); decimal forwarderRecalcWage = Entity.GetRecalculatedForwarderWage(); string recalcWageMessage = "Найдены расхождения после пересчета зарплаты:"; bool haveDiscrepancy = false; if (driverRecalcWage != driverCurrentWage) { recalcWageMessage += String.Format("\nВодителя: до {0}, после {1}", driverCurrentWage, driverRecalcWage); haveDiscrepancy = true; } if (forwarderRecalcWage != forwarderCurrentWage) { recalcWageMessage += String.Format("\nЭкспедитора: до {0}, после {1}", forwarderCurrentWage, forwarderRecalcWage); haveDiscrepancy = true; } recalcWageMessage += String.Format("\nПересчитано."); if (haveDiscrepancy && Entity.Status == RouteListStatus.Closed) { MessageDialogHelper.RunInfoDialog(recalcWageMessage); } }
private bool SendPasswordByPhone(Employee employee, string password) { SmsSender sender = new SmsSender(new BaseParametersProvider(), InstantSmsServiceSetting.GetInstantSmsService()); #region ФормированиеТелефона string stringPhoneNumber = employee.GetPhoneForSmsNotification(); if (stringPhoneNumber == null) { MessageDialogHelper.RunErrorDialog("Не найден подходящий телефон для отправки Sms", "Ошибка при отправке Sms"); return(false); } string phoneNumber = $"+7{stringPhoneNumber}"; #endregion var result = sender.SendPassword(phoneNumber, employee.LoginForNewUser, password); if (result.MessageStatus == SmsMessageStatus.Ok) { MessageDialogHelper.RunInfoDialog("Sms с паролем отправлена успешно"); return(true); } else { MessageDialogHelper.RunErrorDialog(result.ErrorDescription, "Ошибка при отправке Sms"); return(false); } }
//FIXME отделить от GTK void CreateSelfDeliveryCashInvoices(int orderId) { var order = UoW.GetById <VodovozOrder>(orderId); if (order.SelfDeliveryIsFullyPaid(new CashRepository())) { MessageDialogHelper.RunInfoDialog("Заказ уже оплачен полностью"); return; } if (order.OrderSum > 0 && !order.SelfDeliveryIsFullyIncomePaid()) { MainClass.MainWin.TdiMain.OpenTab( "selfDelivery_" + DialogHelper.GenerateDialogHashName <Income>(orderId), () => new CashIncomeSelfDeliveryDlg(order, PermissionsSettings.PermissionService) ); } if (order.OrderSumReturn > 0 && !order.SelfDeliveryIsFullyExpenseReturned()) { MainClass.MainWin.TdiMain.OpenTab( "selfDelivery_" + DialogHelper.GenerateDialogHashName <Expense>(orderId), () => new CashExpenseSelfDeliveryDlg(order, PermissionsSettings.PermissionService) ); } }
public override bool Save() { if (!Entity.CanEdit) { return(false); } Entity.UpdateAlreadyLoaded(UoW, _routeListRepository); var valid = new QS.Validation.QSValidator <CarLoadDocument> (UoWGeneric.Root); if (valid.RunDlgIfNotValid((Gtk.Window) this.Toplevel)) { return(false); } Entity.LastEditor = _employeeRepository.GetEmployeeForCurrentUser(UoW); Entity.LastEditedTime = DateTime.Now; if (Entity.LastEditor == null) { MessageDialogHelper.RunErrorDialog("Ваш пользователь не привязан к действующему сотруднику, вы не можете изменять складские документы, так как некого указывать в качестве кладовщика."); return(false); } if (Entity.Items.Any(x => x.Amount == 0)) { var res = MessageDialogHelper.RunQuestionYesNoCancelDialog( "<span foreground=\"red\">В списке есть нулевые позиции. Убрать нулевые позиции перед сохранением?</span>"); switch (res) { case -4: //DeleteEvent case -6: //Cancel return(false); case -8: //Yes Entity.ClearItemsFromZero(); break; case -9: //No break; } } Entity.UpdateOperations(UoW); logger.Info("Сохраняем погрузочный талон..."); UoWGeneric.Save(); logger.Info("Меняем статус маршрутного листа..."); if (Entity.RouteList.ShipIfCan(UoW, CallTaskWorker, out _)) { MessageDialogHelper.RunInfoDialog("Маршрутный лист отгружен полностью."); } UoW.Save(Entity.RouteList); UoW.Commit(); logger.Info("Ok."); return(true); }
public bool CanClose() { if (!canClose) { MessageDialogHelper.RunInfoDialog("Дождитесь завершения работы задачи и повторите"); } return(canClose); }
void OnUpdate(bool hide = false) { if (enumchecklistOrderStatus.SelectedValuesList.Count > 0) { LoadReport?.Invoke(this, new LoadReportEventArgs(GetReportInfo(), hide)); } else { MessageDialogHelper.RunInfoDialog("Список статусов не может быть пустым"); } }
void OnYtreeviewItemsRowActivated(object sender, RowActivatedArgs args) { if (args.Column.Title == "Заказ" && ( GetSelectedRouteListItem().Status == RouteListItemStatus.Transfered || GetSelectedRouteListItem().WasTransfered )) { MessageDialogHelper.RunInfoDialog(GetTransferText(GetSelectedRouteListItem())); return; } OnClosingItemActivated(sender, args); }
private void ResetPasswordForEmployee(Employee employee) { var result = authorizationService.ResetPasswordToGenerated(employee, 5); if (result.MessageStatus == SmsMessageStatus.Ok) { MessageDialogHelper.RunInfoDialog("Sms с паролем отправлена успешно"); } else { MessageDialogHelper.RunErrorDialog(result.ErrorDescription, "Ошибка при отправке Sms"); } }
public override bool Save() { var all = _deliveryScheduleRepository.All(UoWGeneric); var notArchivedList = all.Where(ds => ds.IsArchive == false && ds.From == Entity.From && ds.To == Entity.To).ToList(); if (notArchivedList.Any() && UoWGeneric.Root.IsArchive == false) { //при архивировании интервала эти проверки не нужны //есть вероятность, что среди активных интервалов есть дубликаты, так что берем первый var active = notArchivedList.First(); MessageDialogHelper.RunWarningDialog("Уже существует интервал с таким же периодом.\n" + "Создание нового интервала невозможно.\n" + "Существующий интервал:\n" + $"Код: {active.Id}\n" + $"Название: {active.Name}\n" + $"Период: {active.DeliveryTime}\n"); return(false); // нашли активный } var archivedList = all.Where(ds => ds.IsArchive && ds.From == Entity.From && ds.To == Entity.To).ToList(); if (archivedList.Any() && UoWGeneric.Root.IsArchive == false) { //при архивировании интервала эти проверки не нужны //т.к. интервалы нельзя удалять, архивными могут быть несколько, так что берем первый var archived = archivedList.First(); if (MessageDialogHelper.RunQuestionDialog("Уже существует архивный интервал с таким же периодом.\n" + "Создание нового интервала невозможно.\n" + "Разархивировать существующий интервал?")) { //отменяем изменения текущей сущности интервала и обновляем найденный архивный UoWGeneric.Delete(UoWGeneric.Root); archived.IsArchive = false; UoWGeneric.Save(archived); UoWGeneric.Commit(); MessageDialogHelper.RunInfoDialog("Разархивирован интервал:\n" + $"Код: {archived.Id}\n" + $"Название: {archived.Name}\n" + $"Период: {archived.DeliveryTime}\n"); } return(false); // нашли/разархивировали старый } var valid = new QSValidator <DeliverySchedule> (UoWGeneric.Root); if (valid.RunDlgIfNotValid((Gtk.Window) this.Toplevel)) { return(false); } logger.Info("Сохраняем график доставки..."); UoWGeneric.Save(); return(true); }
public override bool Save() { try { SetSensetivity(false); if (Entity.Status == RouteListStatus.EnRoute && items.All(x => x.Status != RouteListItemStatus.EnRoute)) { Entity.ChangeStatusAndCreateTask(RouteListStatus.Delivered, CallTaskWorker); } Entity.CalculateWages(wageParameterService); UoWGeneric.Save(); var changedList = items.Where(item => item.ChangedDeliverySchedule || item.HasChanged).ToList(); if (changedList.Count == 0) { return(true); } var currentEmployee = _employeeRepository.GetEmployeeForCurrentUser(UoWGeneric); if (currentEmployee == null) { MessageDialogHelper.RunInfoDialog("Ваш пользователь не привязан к сотруднику, уведомления об изменениях в маршрутном листе не будут отправлены водителю."); return(true); } foreach (var item in changedList) { if (item.HasChanged) { GetChatService() .SendOrderStatusNotificationToDriver( currentEmployee.Id, item.RouteListItem.Id ); } if (item.ChangedDeliverySchedule) { GetChatService() .SendDeliveryScheduleNotificationToDriver( currentEmployee.Id, item.RouteListItem.Id ); } } return(true); } finally { SetSensetivity(true); } }
public SmsSendPanelView() { this.Build(); validatedPhoneEntry.WidthRequest = 135; validatedPhoneEntry.ValidationMode = QSWidgetLib.ValidationType.phone; yPhonesListTreeView.ColumnsConfig = ColumnsConfigFactory.Create <Phone>() .AddColumn("Телефоны") .AddTextRenderer(x => x.Number) .Finish(); yPhonesListTreeView.Selection.Changed += (sender, args) => { selectedPhone = yPhonesListTreeView.GetSelectedObject() as Phone; validatedPhoneEntry.Text = selectedPhone?.Number ?? ""; }; ySendSmsButton.Pressed += (btn, args) => { if (string.IsNullOrWhiteSpace(validatedPhoneEntry.Text)) { MessageDialogHelper.RunErrorDialog("Вы забыли выбрать номер.", "Ошибка при отправке Sms"); return; } ySendSmsButton.Sensitive = false; GLib.Timeout.Add(10000, () => { ySendSmsButton.Sensitive = true; return(false); }); var smsSender = new SmsPaymentSender(); var result = smsSender.SendSmsPaymentToNumber(Order.Id, validatedPhoneEntry.Text); switch (result.Status) { case PaymentResult.MessageStatus.Ok: MessageDialogHelper.RunInfoDialog("Sms отправлена успешно"); break; case PaymentResult.MessageStatus.Error: MessageDialogHelper.RunErrorDialog(result.ErrorDescription, "Ошибка при отправке Sms"); break; default: throw new ArgumentOutOfRangeException(); } }; }
public override bool Save() { if (!Entity.CanEdit) { return(false); } var valid = new QS.Validation.QSValidator <SelfDeliveryDocument>(UoWGeneric.Root); if (valid.RunDlgIfNotValid((Gtk.Window) this.Toplevel)) { return(false); } Entity.LastEditor = _employeeRepository.GetEmployeeForCurrentUser(UoW); Entity.LastEditedTime = DateTime.Now; if (Entity.LastEditor == null) { MessageDialogHelper.RunErrorDialog("Ваш пользователь не привязан к действующему сотруднику, вы не можете изменять складские документы, так как некого указывать в качестве кладовщика."); return(false); } Entity.UpdateOperations(UoW); Entity.UpdateReceptions(UoW, GoodsReceptionList, _nomenclatureRepository, _bottlesRepository); IStandartNomenclatures standartNomenclatures = new BaseParametersProvider(new ParametersProvider()); var callTaskWorker = new CallTaskWorker( CallTaskSingletonFactory.GetInstance(), new CallTaskRepository(), new OrderRepository(), _employeeRepository, new BaseParametersProvider(new ParametersProvider()), ServicesConfig.CommonServices.UserService, SingletonErrorReporter.Instance); if (Entity.FullyShiped(UoW, standartNomenclatures, new RouteListItemRepository(), new SelfDeliveryRepository(), new CashRepository(), callTaskWorker)) { MessageDialogHelper.RunInfoDialog("Заказ отгружен полностью."); } logger.Info("Сохраняем документ самовывоза..."); UoWGeneric.Save(); //FIXME Необходимо проверить правильность этого кода, так как если заказ именялся то уведомление на его придет и без кода. //А если в каком то месте нужно получать уведомления об изменениях текущего объекта, то логично чтобы этот объект на него и подписался. //OrmMain.NotifyObjectUpdated(new object[] { Entity.Order }); logger.Info("Ok."); return(true); }
private void BtnConfirmNewBorderOnClicked(object sender, EventArgs e) { if (MessageDialogHelper.RunQuestionDialog("Завершить создание границы района?")) { if (ViewModel.NewBorderVertices.Count < 3) { MessageDialogHelper.RunInfoDialog("Нельзя создать границу района меньше чем за 3 точки"); return; } toggleNewBorderPreview.Active = false; newBordersPreviewOverlay.Clear(); ViewModel.ConfirmNewBorderCommand.Execute(); RefreshBorders(); } }
private void Configure() { track = Vodovoz.Repository.Logistics.TrackRepository.GetTrackForRouteList(UoW, routeList.Id); if (track == null) { buttonRecalculateToBase.Sensitive = buttonFindGap.Sensitive = buttonCutTrack.Sensitive = buttonLastAddress.Sensitive = false; MessageDialogHelper.RunInfoDialog($"Маршрутный лист №{routeList.Id}\nТрек не обнаружен"); } else if (routeList.Status < RouteListStatus.OnClosing) { buttonRecalculateToBase.Sensitive = buttonFindGap.Sensitive = buttonCutTrack.Sensitive = buttonLastAddress.Sensitive = false; } ConfigureMap(); OpenMap(); UpdateDistanceLabel(); }
protected void OnButtonColorsLegendClicked(object sender, EventArgs e) { MessageDialogHelper.RunInfoDialog( "<b>Колонка «Получено»:</b>\n" + "<span color='darkgreen'>●</span> — потребность закрыта полностью\n" + "<span color='blue'>●</span> — получено больше необходимого\n" + "<span color='orange'>●</span> — получено меньше необходимого\n" + "<span color='red'>●</span> — получения не было\n" + "\n<b>Колонка «След. получение»:</b>\n" + "<span color='red'>●</span> — получение просрочено\n" + "<span color='darkgreen'>●</span> — возможна выдача раньше срока\n" + "\n<b>Колонка «На складе»:</b>\n" + "<span color='orange'>●</span> — подходящей номенклатуры не найдено\n" + "<span color='red'>●</span> — номенклатура на складе отсутствует\n" + "<span color='blue'>●</span> — на складе не достаточное количество\n" + "<span color='green'>●</span> — на складе достаточное количество" ); }
protected void OnButtonCreateTaskClicked(object sender, EventArgs e) { if (Order.DeliveryPoint == null) { MessageDialogHelper.RunInfoDialog("Необходимо выбрать точку доставки"); return; } if (String.IsNullOrWhiteSpace(ytextview.Buffer.Text)) { MessageDialogHelper.RunInfoDialog("Необходимо оставить комментарий"); return; } using (var uow = UnitOfWorkFactory.CreateWithNewRoot <CallTask>("Кнопка «Создать задачу» на панели \"Постановка задачи\"")) { CallTaskSingletonFactory.GetInstance().CreateTask(uow, employeeRepository, personProvider, uow.Root, Order, ytextview.Buffer.Text); uow.Root.Source = TaskSource.OrderPanel; uow.Save(); } ytextview.Buffer.Text = String.Empty; }
private void OnAddContractButtonClicked(object sender, EventArgs e) { List <EmployeeDocument> doc = ViewModel.Entity.GetMainDocuments(); if (!doc.Any()) { MessageDialogHelper.RunInfoDialog("Отсутствует главный документ"); return; } if (ViewModel.Entity.Registration != RegistrationType.Contract) { MessageDialogHelper.RunInfoDialog("Должен быть указан тип регистрации: 'ГПК' "); return; } var dlg = new EmployeeContractDlg(doc[0], ViewModel.Entity, ViewModel.UoW); dlg.Save += (s, args) => ViewModel.Entity.ObservableContracts.Add(dlg.Entity); ViewModel.TabParent.AddSlaveTab(ViewModel, dlg); }
public override bool Save() { var valid = new QSValidator <RouteList>(Entity); if (valid.RunDlgIfNotValid((Gtk.Window) this.Toplevel)) { return(false); } if (!ValidateOrders()) { return(false); } var messages = new List <string>(); if (Entity.FuelOperationHaveDiscrepancy()) { if (!MessageDialogHelper.RunQuestionDialog("Был изменен водитель или автомобиль, при сохранении МЛ баланс по топливу изменится с учетом этих изменений. Продолжить сохранение?")) { return(false); } } if (Entity.Status > RouteListStatus.OnClosing) { messages.AddRange(Entity.UpdateMovementOperations()); } UoW.Save(); if (messages.Any()) { MessageDialogHelper.RunInfoDialog(String.Format("Были выполнены следующие действия:\n*{0}", String.Join("\n*", messages))); } return(true); }
protected void OnBtnSendEnRouteClicked(object sender, EventArgs e) { #region костыль //FIXME пока не можем найти причину бага с несменой статуса на в пути при полной отгрузке, позволяем логистам отправлять МЛ в путь из этого диалога bool fullyLoaded = false; if (Entity.ShipIfCan(UoW, CallTaskWorker, out _)) { fullyLoaded = true; MessageDialogHelper.RunInfoDialog("Маршрутный лист отгружен полностью."); } #endregion if ( !fullyLoaded && ServicesConfig.CommonServices.CurrentPermissionService.ValidatePresetPermission("can_send_not_loaded_route_lists_en_route") && MessageDialogHelper.RunQuestionWithTitleDialog( "Оптправить в путь?", string.Format( "{0} погружен <span foreground=\"Red\">НЕ ПОЛНОСТЬЮ</span> и будет переведён в статус \"{1}\". После сохранения изменений откат этого действия будет невозможен.\nВы уверены что хотите отправить МЛ в путь?", Entity.Title, RouteListStatus.EnRoute.GetEnumTitle() ) ) ) { Entity.ChangeStatusAndCreateTask(RouteListStatus.EnRoute, CallTaskWorker); Entity.NotFullyLoaded = true; } else if (!fullyLoaded && !ServicesConfig.CommonServices.CurrentPermissionService.ValidatePresetPermission("can_send_not_loaded_route_lists_en_route")) { MessageDialogHelper.RunWarningDialog( "Недостаточно прав", string.Format("У вас нет прав для перевода не полностью погруженных МЛ в статус \"{0}\"", RouteListStatus.EnRoute.GetEnumTitle()), Gtk.ButtonsType.Ok ); } }
protected void OnButtonCreateCashOrderClicked(object sender, EventArgs e) { var messages = new List <string>(); var casher = EmployeeRepository.GetEmployeeForCurrentUser(UoW); if (casher == null) { MessageDialogHelper.RunErrorDialog("Ваш пользователь не привязан к действующему сотруднику, вы не можете закрыть МЛ, так как некого указывать в качестве кассира."); return; } Income cashIncome = null; Expense cashExpense = null; var inputCashOrder = (decimal)spinCashOrder.Value; Entity.Cashier = casher; messages.AddRange(Entity.ManualCashOperations(ref cashIncome, ref cashExpense, inputCashOrder)); if (cashIncome != null) { UoW.Save(cashIncome); } if (cashExpense != null) { UoW.Save(cashExpense); } UoW.Save(); if (messages.Count > 0) { MessageDialogHelper.RunInfoDialog(String.Format("Были выполнены следующие действия:\n*{0}", String.Join("\n*", messages))); } }
protected void OnButtonTransferClicked(object sender, EventArgs e) { //Дополнительные проверки RouteList routeListTo = yentryreferenceRLTo.Subject as RouteList; RouteList routeListFrom = yentryreferenceRLFrom.Subject as RouteList; var messages = new List <string>(); if (routeListTo == null || routeListFrom == null || routeListTo.Id == routeListFrom.Id) { return; } List <RouteListItemNode> needReloadNotSet = new List <RouteListItemNode>(); List <RouteListItemNode> needReloadSetAndRlEnRoute = new List <RouteListItemNode>(); foreach (var row in ytreeviewRLFrom.GetSelectedObjects <RouteListItemNode>()) { RouteListItem item = row?.RouteListItem; logger.Debug("Проверка адреса с номером {0}", item?.Id.ToString() ?? "Неправильный адрес"); if (item == null || item.Status == RouteListItemStatus.Transfered) { continue; } if (!row.LeftNeedToReload && !row.LeftNotNeedToReload) { needReloadNotSet.Add(row); continue; } if (row.LeftNeedToReload && routeListTo.Status >= RouteListStatus.EnRoute) { needReloadSetAndRlEnRoute.Add(row); continue; } RouteListItem newItem = new RouteListItem(routeListTo, item.Order, item.Status) { WasTransfered = true, NeedToReload = row.LeftNeedToReload, WithForwarder = routeListTo.Forwarder != null }; routeListTo.ObservableAddresses.Add(newItem); item.TransferedTo = newItem; //Пересчёт зарплаты после изменения МЛ routeListFrom.CalculateWages(wageParameterService); routeListTo.CalculateWages(wageParameterService); item.RecalculateTotalCash(); newItem.RecalculateTotalCash(); if (routeListTo.ClosingFilled) { newItem.FirstFillClosing(UoW, wageParameterService); } UoW.Save(item); UoW.Save(newItem); } UpdateTranferDocuments(routeListFrom, routeListTo); if (routeListFrom.Status == RouteListStatus.Closed) { messages.AddRange(routeListFrom.UpdateMovementOperations()); } if (routeListTo.Status == RouteListStatus.Closed) { messages.AddRange(routeListTo.UpdateMovementOperations()); } UoW.Save(routeListTo); UoW.Save(routeListFrom); UoW.Commit(); if (needReloadNotSet.Count > 0) { MessageDialogHelper.RunWarningDialog("Для следующих адресов не была указана необходимость загрузки, поэтому они не были перенесены:\n * " + String.Join("\n * ", needReloadNotSet.Select(x => x.Address)) ); } if (needReloadSetAndRlEnRoute.Count > 0) { MessageDialogHelper.RunWarningDialog("Для следующих адресов была указана необходимость загрузки при переносе в МЛ со статусом \"В пути\" и выше , поэтому они не были перенесены:\n * " + String.Join("\n * ", needReloadSetAndRlEnRoute.Select(x => x.Address)) ); } if (messages.Count > 0) { MessageDialogHelper.RunInfoDialog(String.Format("Были выполнены следующие действия:\n*{0}", String.Join("\n*", messages))); } UpdateNodes(); CheckSensitivities(); }
private void Configure() { #region TreeViews var colorRed = new Gdk.Color(255, 0, 0); var colorWhite = new Gdk.Color(255, 255, 255); ytreeDistricts.ColumnsConfig = ColumnsConfigFactory.Create <District>() .AddColumn("Код") .HeaderAlignment(0.5f) .AddTextRenderer(x => x.Id.ToString()) .AddColumn("Название") .HeaderAlignment(0.5f) .AddTextRenderer(x => x.DistrictName) .Editable() .AddColumn("Тарифная зона") .HeaderAlignment(0.5f) .AddComboRenderer(x => x.TariffZone) .SetDisplayFunc(x => x.Name) .FillItems(ViewModel.UoW.GetAll <TariffZone>().ToList(), "Нет") .Editing() .AddColumn("Мин. бутылей") .HeaderAlignment(0.5f) .AddTextRenderer(x => x.ObservableCommonDistrictRuleItems.Any() ? x.ObservableCommonDistrictRuleItems.Min(c => c.DeliveryPriceRule.Water19LCount).ToString() : "-" ) .XAlign(0.5f) .AddColumn("") .Finish(); ytreeDistricts.Binding.AddBinding(ViewModel.Entity, e => e.ObservableDistricts, w => w.ItemsDataSource).InitializeFromSource(); ytreeDistricts.Selection.Changed += (sender, args) => { if (ViewModel.IsCreatingNewBorder) { ViewModel.CancelNewBorderCommand.Execute(); toggleNewBorderPreview.Active = false; } ViewModel.SelectedDistrict = ytreeDistricts.GetSelectedObject() as District; }; ytreeScheduleRestrictions.ColumnsConfig = ColumnsConfigFactory.Create <DeliveryScheduleRestriction>() .AddColumn("График") .MinWidth(150) .HeaderAlignment(0.5f) .AddTextRenderer(x => x.DeliverySchedule.Name) .AddColumn("Прием до") .SetTag(acceptBeforeColumnTag) .HeaderAlignment(0.5f) .AddTextRenderer(x => x.AcceptBeforeTitle) .AddSetter((c, r) => c.BackgroundGdk = r.AcceptBefore == null ? colorRed : colorWhite) .Finish(); ytreeScheduleRestrictions.Binding.AddBinding(ViewModel, vm => vm.ScheduleRestrictions, w => w.ItemsDataSource); ytreeScheduleRestrictions.Selection.Changed += (sender, args) => ViewModel.SelectedScheduleRestriction = ytreeScheduleRestrictions.GetSelectedObject() as DeliveryScheduleRestriction; ytreeCommonRulePrices.ColumnsConfig = ColumnsConfigFactory.Create <CommonDistrictRuleItem>() .AddColumn("Цена") .HeaderAlignment(0.5f) .AddNumericRenderer(p => p.Price) .Digits(2) .WidthChars(10) .Adjustment(new Adjustment(0, 0, 1000000, 1, 100, 0)) .Editing() .AddSetter((c, r) => c.BackgroundGdk = r.Price <= 0 ? colorRed : colorWhite) .AddTextRenderer(node => CurrencyWorks.CurrencyShortName, false) .AddColumn("Правило") .HeaderAlignment(0.5f) .AddTextRenderer(p => p.DeliveryPriceRule.Title) .WrapMode(Pango.WrapMode.WordChar) .WrapWidth(500) .Finish(); ytreeCommonRulePrices.Binding.AddBinding(ViewModel, vm => vm.CommonDistrictRuleItems, w => w.ItemsDataSource); ytreeCommonRulePrices.Selection.Changed += (sender, args) => ViewModel.SelectedCommonDistrictRuleItem = ytreeCommonRulePrices.GetSelectedObject() as CommonDistrictRuleItem; ytreeWeekDayRulePrices.ColumnsConfig = ColumnsConfigFactory.Create <WeekDayDistrictRuleItem>() .AddColumn("Цена") .HeaderAlignment(0.5f) .AddNumericRenderer(p => p.Price) .Digits(2) .WidthChars(10) .Adjustment(new Adjustment(0, 0, 1000000, 1, 100, 0)) .Editing() .AddSetter((c, r) => c.BackgroundGdk = r.Price <= 0 ? colorRed : colorWhite) .AddTextRenderer(node => CurrencyWorks.CurrencyShortName, false) .AddColumn("Правило") .HeaderAlignment(0.5f) .AddTextRenderer(p => p.DeliveryPriceRule.ToString()) .WrapMode(Pango.WrapMode.WordChar) .WrapWidth(390) .Finish(); ytreeWeekDayRulePrices.Binding.AddBinding(ViewModel, vm => vm.WeekDayDistrictRuleItems, w => w.ItemsDataSource); ytreeWeekDayRulePrices.Selection.Changed += (sender, args) => ViewModel.SelectedWeekDayDistrictRuleItem = ytreeWeekDayRulePrices.GetSelectedObject() as WeekDayDistrictRuleItem; #endregion btnSave.Clicked += (sender, args) => ViewModel.Save(); btnSave.Binding.AddFuncBinding(ViewModel, vm => vm.CanEditDistrict || vm.CanEdit, w => w.Sensitive).InitializeFromSource(); btnCancel.Clicked += (sender, args) => ViewModel.Close(true, CloseSource.Cancel); ylabelStatusString.Text = ViewModel.Entity.Status.GetEnumTitle(); entryName.Binding.AddBinding(ViewModel.Entity, e => e.Name, w => w.Text).InitializeFromSource(); entryName.Binding.AddFuncBinding(ViewModel, vm => vm.CanEdit, w => w.Sensitive).InitializeFromSource(); btnAddDistrict.Binding.AddFuncBinding(ViewModel, vm => vm.CanCreateDistrict, w => w.Sensitive).InitializeFromSource(); btnAddDistrict.Clicked += (sender, args) => { ViewModel.AddDistrictCommand.Execute(); ScrollToSelectedDistrict(); }; btnRemoveDistrict.Clicked += (sender, args) => { ViewModel.RemoveDistrictCommand.Execute(); if (ViewModel.SelectedDistrict == null) { RefreshBorders(); } else { ScrollToSelectedDistrict(); } }; btnRemoveDistrict.Binding.AddFuncBinding(ViewModel, vm => vm.SelectedDistrict != null && vm.CanDeleteDistrict, w => w.Sensitive).InitializeFromSource(); ytextComment.Binding.AddBinding(ViewModel.Entity, e => e.Comment, w => w.Buffer.Text).InitializeFromSource(); ytextComment.Binding.AddFuncBinding(ViewModel, vm => vm.CanEdit, w => w.Sensitive).InitializeFromSource(); btnAddCommonRule.Binding.AddFuncBinding(ViewModel, vm => vm.SelectedDistrict != null && vm.CanEditDistrict, w => w.Sensitive).InitializeFromSource(); btnAddCommonRule.Clicked += (sender, args) => { var selectRules = new OrmReference(ViewModel.UoW, DistrictRuleRepository.GetQueryOverWithAllDeliveryPriceRules()) { Mode = OrmReferenceMode.MultiSelect, ButtonMode = QS.Project.Dialogs.ReferenceButtonMode.None }; selectRules.ObjectSelected += (o, e) => ViewModel.AddCommonDistrictRuleItemCommand.Execute(e.GetEntities <DeliveryPriceRule>()); Tab.TabParent.AddSlaveTab(this.Tab, selectRules); }; btnRemoveCommonRule.Binding.AddFuncBinding(ViewModel, vm => vm.CanEditDistrict && vm.SelectedDistrict != null && vm.SelectedCommonDistrictRuleItem != null, w => w.Sensitive).InitializeFromSource(); btnRemoveCommonRule.Clicked += (sender, args) => ViewModel.RemoveCommonDistrictRuleItemCommand.Execute(); btnToday.TooltipText = "День в день.\nГрафик доставки при создании заказа сегодня и на сегодняшнюю дату доставки."; btnToday.Clicked += (sender, args) => ViewModel.SelectedWeekDayName = WeekDayName.Today; btnMonday.Clicked += (sender, args) => ViewModel.SelectedWeekDayName = WeekDayName.Monday; btnTuesday.Clicked += (sender, args) => ViewModel.SelectedWeekDayName = WeekDayName.Tuesday; btnWednesday.Clicked += (sender, args) => ViewModel.SelectedWeekDayName = WeekDayName.Wednesday; btnThursday.Clicked += (sender, args) => ViewModel.SelectedWeekDayName = WeekDayName.Thursday; btnFriday.Clicked += (sender, args) => ViewModel.SelectedWeekDayName = WeekDayName.Friday; btnSaturday.Clicked += (sender, args) => ViewModel.SelectedWeekDayName = WeekDayName.Saturday; btnSunday.Clicked += (sender, args) => ViewModel.SelectedWeekDayName = WeekDayName.Sunday; btnAddSchedule.Binding.AddFuncBinding(ViewModel, vm => vm.CanEditDistrict && vm.SelectedDistrict != null && vm.SelectedWeekDayName.HasValue, w => w.Sensitive).InitializeFromSource(); btnAddSchedule.Clicked += (sender, args) => { var selectSchedules = new OrmReference(typeof(DeliverySchedule), ViewModel.UoW) { Mode = OrmReferenceMode.MultiSelect }; selectSchedules.ObjectSelected += (o, eventArgs) => { ViewModel.AddScheduleRestrictionCommand.Execute(eventArgs.Subjects.Cast <DeliverySchedule>()); if (ViewModel.SelectedScheduleRestriction != null) { var iter = ytreeScheduleRestrictions.YTreeModel.IterFromNode(ViewModel.SelectedScheduleRestriction); var path = ytreeScheduleRestrictions.YTreeModel.GetPath(iter); ytreeScheduleRestrictions.ScrollToCell(path, ytreeScheduleRestrictions.Columns.FirstOrDefault(), false, 0, 0); } }; Tab.TabParent.AddSlaveTab(this.Tab, selectSchedules); }; btnRemoveSchedule.Binding.AddFuncBinding(ViewModel, vm => vm.CanEditDistrict && vm.SelectedDistrict != null && vm.SelectedScheduleRestriction != null, w => w.Sensitive).InitializeFromSource(); btnRemoveSchedule.Clicked += (sender, args) => ViewModel.RemoveScheduleRestrictionCommand.Execute(); btnAddAcceptBefore.Binding.AddFuncBinding(ViewModel, vm => vm.CanEditDistrict && vm.SelectedDistrict != null && vm.SelectedScheduleRestriction != null, w => w.Sensitive).InitializeFromSource(); btnAddAcceptBefore.Clicked += (sender, args) => { var acceptBeforeTimeViewModel = new SimpleEntityJournalViewModel <AcceptBefore, AcceptBeforeViewModel>( x => x.Name, () => new AcceptBeforeViewModel( EntityUoWBuilder.ForCreate(), UnitOfWorkFactory.GetDefaultFactory, ServicesConfig.CommonServices ), node => new AcceptBeforeViewModel( EntityUoWBuilder.ForOpen(node.Id), UnitOfWorkFactory.GetDefaultFactory, ServicesConfig.CommonServices ), UnitOfWorkFactory.GetDefaultFactory, ServicesConfig.CommonServices ); acceptBeforeTimeViewModel.SelectionMode = JournalSelectionMode.Single; acceptBeforeTimeViewModel.SetActionsVisible(deleteActionEnabled: false, editActionEnabled: false); acceptBeforeTimeViewModel.OnEntitySelectedResult += (o, eventArgs) => { var node = eventArgs.SelectedNodes.FirstOrDefault(); if (node != null) { ViewModel.AddAcceptBeforeCommand.Execute(ViewModel.UoW.GetById <AcceptBefore>(node.Id)); } }; Tab.TabParent.AddSlaveTab(Tab, acceptBeforeTimeViewModel); }; btnRemoveAcceptBefore.Binding.AddFuncBinding(ViewModel, vm => vm.CanEditDistrict && vm.SelectedDistrict != null && vm.SelectedScheduleRestriction != null && vm.SelectedScheduleRestriction.AcceptBefore != null, w => w.Sensitive) .InitializeFromSource(); btnRemoveAcceptBefore.Clicked += (sender, args) => ViewModel.RemoveAcceptBeforeCommand.Execute(); btnAddWeekDayRule.Binding.AddFuncBinding(ViewModel, vm => vm.CanEditDistrict && vm.SelectedDistrict != null && vm.SelectedWeekDayName.HasValue, w => w.Sensitive).InitializeFromSource(); btnAddWeekDayRule.Clicked += (sender, args) => { var selectRules = new OrmReference(ViewModel.UoW, DistrictRuleRepository.GetQueryOverWithAllDeliveryPriceRules()) { Mode = OrmReferenceMode.MultiSelect, ButtonMode = QS.Project.Dialogs.ReferenceButtonMode.None }; selectRules.ObjectSelected += (o, e) => ViewModel.AddWeekDayDistrictRuleItemCommand.Execute(e.GetEntities <DeliveryPriceRule>()); Tab.TabParent.AddSlaveTab(this.Tab, selectRules); }; btnRemoveWeekDayRule.Binding.AddFuncBinding(ViewModel, vm => vm.CanEditDistrict && vm.SelectedDistrict != null && vm.SelectedWeekDayDistrictRuleItem != null, w => w.Sensitive).InitializeFromSource(); btnRemoveWeekDayRule.Clicked += (sender, args) => ViewModel.RemoveWeekDayDistrictRuleItemCommand.Execute(); cmbGeoGroup.ItemsList = ViewModel.UoW.GetAll <GeographicGroup>().ToList(); cmbGeoGroup.Binding.AddBinding(ViewModel, vm => vm.SelectedGeoGroup, w => w.SelectedItem).InitializeFromSource(); cmbGeoGroup.Binding.AddFuncBinding(ViewModel, vm => vm.CanEditDistrict && vm.SelectedDistrict != null, w => w.Sensitive).InitializeFromSource(); cmbWageDistrict.ItemsList = ViewModel.UoW.Session.QueryOver <WageDistrict>().Where(d => !d.IsArchive).List(); cmbWageDistrict.Binding.AddBinding(ViewModel, vm => vm.SelectedWageDistrict, w => w.SelectedItem).InitializeFromSource(); cmbWageDistrict.Binding.AddFuncBinding(ViewModel, vm => vm.CanEditDistrict && vm.SelectedDistrict != null && vm.CanChangeDistrictWageTypePermissionResult, w => w.Sensitive).InitializeFromSource(); cmbWageDistrict.SetRenderTextFunc <WageDistrict>(x => x.Name); #region GMap btnAddBorder.Binding.AddFuncBinding(ViewModel, vm => !vm.IsCreatingNewBorder, w => w.Visible).InitializeFromSource(); btnAddBorder.Binding.AddFuncBinding(ViewModel, vm => vm.CanEditDistrict && !vm.IsCreatingNewBorder && vm.SelectedDistrict != null && vm.SelectedDistrict.DistrictBorder == null, w => w.Sensitive).InitializeFromSource(); btnAddBorder.Clicked += (sender, args) => ViewModel.CreateBorderCommand.Execute(); btnRemoveBorder.Binding.AddFuncBinding(ViewModel, vm => !vm.IsCreatingNewBorder, w => w.Visible).InitializeFromSource(); btnRemoveBorder.Binding.AddFuncBinding(ViewModel, vm => vm.CanEditDistrict && !vm.IsCreatingNewBorder && vm.SelectedDistrict != null && vm.SelectedDistrict.DistrictBorder != null, w => w.Sensitive).InitializeFromSource(); btnRemoveBorder.Clicked += (sender, args) => { if (MessageDialogHelper.RunQuestionDialog($"Удалить границу района {ViewModel.SelectedDistrict.DistrictName}?")) { ViewModel.RemoveBorderCommand.Execute(); RefreshBorders(); } }; btnConfirmNewBorder.Binding.AddFuncBinding(ViewModel, vm => vm.IsCreatingNewBorder, w => w.Visible).InitializeFromSource(); btnConfirmNewBorder.Binding.AddFuncBinding(ViewModel, vm => vm.SelectedDistrict != null && vm.IsCreatingNewBorder, w => w.Sensitive).InitializeFromSource(); btnConfirmNewBorder.Clicked += (sender, args) => { if (MessageDialogHelper.RunQuestionDialog("Завершить создание границы района?")) { if (ViewModel.NewBorderVertices.Count < 3) { MessageDialogHelper.RunInfoDialog("Нельзя создать границу района меньше чем за 3 точки"); return; } toggleNewBorderPreview.Active = false; ViewModel.ConfirmNewBorderCommand.Execute(); RefreshBorders(); } }; btnCancelNewBorder.Binding.AddFuncBinding(ViewModel, vm => vm.IsCreatingNewBorder, w => w.Visible).InitializeFromSource(); btnCancelNewBorder.Binding.AddFuncBinding(ViewModel, vm => vm.SelectedDistrict != null && vm.IsCreatingNewBorder, w => w.Sensitive).InitializeFromSource(); btnCancelNewBorder.Clicked += (sender, args) => { if (MessageDialogHelper.RunQuestionDialog("Отменить создание границы района?")) { ViewModel.CancelNewBorderCommand.Execute(); toggleNewBorderPreview.Active = false; } }; toggleNewBorderPreview.Binding.AddFuncBinding(ViewModel, vm => vm.IsCreatingNewBorder, w => w.Visible).InitializeFromSource(); toggleNewBorderPreview.Binding.AddFuncBinding(ViewModel, vm => vm.SelectedDistrict != null && vm.IsCreatingNewBorder, w => w.Sensitive).InitializeFromSource(); toggleNewBorderPreview.Toggled += (sender, args) => { if (toggleNewBorderPreview.Active && ViewModel.NewBorderVertices.Any()) { var previewBorder = new GMapPolygon(ViewModel.NewBorderVertices.ToList(), "Предпросмотр новых границ"); newBordersPreviewOverlay.Polygons.Add(previewBorder); } else { newBordersPreviewOverlay.Clear(); } }; cmbMapType.ItemsEnum = typeof(MapProviders); cmbMapType.EnumItemSelected += (sender, args) => gmapWidget.MapProvider = MapProvidersHelper.GetPovider((MapProviders)args.SelectedItem); cmbMapType.SelectedItem = MapProviders.YandexMap; gmapWidget.Position = new PointLatLng(59.93900, 30.31646); gmapWidget.HeightRequest = 150; gmapWidget.HasFrame = true; gmapWidget.Overlays.Add(bordersOverlay); gmapWidget.Overlays.Add(newBordersPreviewOverlay); gmapWidget.Overlays.Add(verticeOverlay); RefreshBorders(); gmapWidget.ButtonPressEvent += (o, args) => { if (args.Event.Button == 1 && ViewModel.IsCreatingNewBorder) { ViewModel.AddNewVertexCommand.Execute(gmapWidget.FromLocalToLatLng((int)args.Event.X, (int)args.Event.Y)); } if (args.Event.Button == 3 && ViewModel.IsCreatingNewBorder) { var marker = verticeOverlay.Markers.FirstOrDefault(m => m.IsMouseOver); if (marker == null) { return; } var pointMarker = new PointLatLng(marker.Position.Lat, marker.Position.Lng); if (ViewModel.NewBorderVertices.Contains(pointMarker)) { Menu popupMenu = new Menu(); var item = new MenuItem("Удалить"); item.Activated += (sender, e) => ViewModel.RemoveNewBorderVertexCommand.Execute(pointMarker); popupMenu.Add(item); popupMenu.ShowAll(); popupMenu.Popup(); } } }; void RefreshBorders() { bordersOverlay.Clear(); foreach (District district in ViewModel.Entity.ObservableDistricts) { if (district.DistrictBorder != null) { bordersOverlay.Polygons.Add(new GMapPolygon( district.DistrictBorder.Coordinates.Select(p => new PointLatLng(p.X, p.Y)).ToList(), district.DistrictName) ); } } } #endregion ViewModel.PropertyChanged += (sender, args) => { Application.Invoke((o, eventArgs) => { switch (args.PropertyName) { case nameof(ViewModel.SelectedWeekDayName): var column = ytreeScheduleRestrictions.ColumnsConfig.GetColumnsByTag(acceptBeforeColumnTag).First(); column.Visible = ViewModel.SelectedWeekDayName == WeekDayName.Today; break; case nameof(ViewModel.SelectedDistrict): if (ViewModel.SelectedDistrict != null) { ytreeDistricts.SelectObject(ViewModel.SelectedDistrict); } break; case nameof(ViewModel.SelectedScheduleRestriction): if (ViewModel.SelectedScheduleRestriction != null) { ytreeScheduleRestrictions.SelectObject(ViewModel.SelectedScheduleRestriction); } break; case nameof(ViewModel.SelectedCommonDistrictRuleItem): if (ViewModel.SelectedCommonDistrictRuleItem != null) { ytreeCommonRulePrices.SelectObject(ViewModel.SelectedCommonDistrictRuleItem); } break; case nameof(ViewModel.SelectedWeekDayDistrictRuleItem): if (ViewModel.SelectedWeekDayDistrictRuleItem != null) { ytreeWeekDayRulePrices.SelectObject(ViewModel.SelectedWeekDayDistrictRuleItem); } break; case nameof(ViewModel.SelectedDistrictBorderVertices): verticeOverlay.Clear(); if (ViewModel.SelectedDistrictBorderVertices != null) { GMapPolygon polygon = new GMapPolygon(ViewModel.SelectedDistrictBorderVertices.ToList(), "polygon"); polygon.Stroke = selectedDistrictBorderPen; verticeOverlay.Polygons.Add(polygon); } break; case nameof(ViewModel.NewBorderVertices): verticeOverlay.Clear(); if (ViewModel.NewBorderVertices != null && ViewModel.NewBorderVertices.Any()) { for (int i = 0; i < ViewModel.NewBorderVertices.Count; i++) { var color = GMarkerGoogleType.red; if (i == 0) { color = GMarkerGoogleType.yellow; } else if (i == ViewModel.NewBorderVertices.Count - 1) { color = GMarkerGoogleType.green; } GMapMarker point = new GMarkerGoogle(ViewModel.NewBorderVertices[i], color); verticeOverlay.Markers.Add(point); } if (toggleNewBorderPreview.Active) { toggleNewBorderPreview.Active = false; toggleNewBorderPreview.Active = true; } } break; } }); }; }
protected void OnButtonTransferClicked(object sender, EventArgs e) { //Дополнительные проверки var routeListTo = yentryreferenceRLTo.Subject as RouteList; var routeListFrom = yentryreferenceRLFrom.Subject as RouteList; var messages = new List <string>(); if (routeListTo == null || routeListFrom == null || routeListTo.Id == routeListFrom.Id) { return; } List <RouteListItemNode> needReloadNotSet = new List <RouteListItemNode>(); List <RouteListItemNode> needReloadSetAndRlEnRoute = new List <RouteListItemNode>(); List <RouteListItemNode> fastDeliveryNotEnoughQuantity = new List <RouteListItemNode>(); foreach (var row in ytreeviewRLFrom.GetSelectedObjects <RouteListItemNode>()) { RouteListItem item = row?.RouteListItem; _logger.Debug("Проверка адреса с номером {0}", item?.Id.ToString() ?? "Неправильный адрес"); if (item == null || item.Status == RouteListItemStatus.Transfered) { continue; } if (!row.IsFastDelivery && !row.LeftNeedToReload && !row.LeftNotNeedToReload) { needReloadNotSet.Add(row); continue; } if (row.LeftNeedToReload && routeListTo.Status >= RouteListStatus.EnRoute) { needReloadSetAndRlEnRoute.Add(row); continue; } if (row.IsFastDelivery) { var hasEnoughQuantityForFastDelivery = _routeListItemRepository .HasEnoughQuantityForFastDelivery(UoW, row.RouteListItem, routeListTo); if (!hasEnoughQuantityForFastDelivery) { fastDeliveryNotEnoughQuantity.Add(row); continue; } } var transferredAddressFromRouteListTo = _routeListItemRepository.GetTransferredRouteListItemFromRouteListForOrder(UoW, routeListTo.Id, item.Order.Id); RouteListItem newItem = null; if (transferredAddressFromRouteListTo != null) { newItem = transferredAddressFromRouteListTo; item.WasTransfered = false; routeListTo.RevertTransferAddress(_wageParameterService, newItem, item); routeListFrom.TransferAddressTo(item, newItem); newItem.WasTransfered = true; } else { newItem = new RouteListItem(routeListTo, item.Order, item.Status) { WasTransfered = true, NeedToReload = row.LeftNeedToReload, WithForwarder = routeListTo.Forwarder != null }; routeListTo.ObservableAddresses.Add(newItem); routeListFrom.TransferAddressTo(item, newItem); } //Пересчёт зарплаты после изменения МЛ routeListFrom.CalculateWages(_wageParameterService); routeListTo.CalculateWages(_wageParameterService); item.RecalculateTotalCash(); newItem.RecalculateTotalCash(); if (routeListTo.ClosingFilled) { newItem.FirstFillClosing(_wageParameterService); } UoW.Save(item); UoW.Save(newItem); } UpdateTranferDocuments(routeListFrom, routeListTo); if (routeListFrom.Status == RouteListStatus.Closed) { messages.AddRange(routeListFrom.UpdateMovementOperations(_categoryRepository)); } if (routeListTo.Status == RouteListStatus.Closed) { messages.AddRange(routeListTo.UpdateMovementOperations(_categoryRepository)); } UoW.Save(routeListTo); UoW.Save(routeListFrom); UoW.Commit(); if (needReloadNotSet.Count > 0) { MessageDialogHelper.RunWarningDialog("Для следующих адресов не была указана необходимость загрузки, поэтому они не были перенесены:\n * " + string.Join("\n * ", needReloadNotSet.Select(x => x.Address)) ); } if (needReloadSetAndRlEnRoute.Count > 0) { MessageDialogHelper.RunWarningDialog("Для следующих адресов была указана необходимость загрузки при переносе в МЛ со статусом \"В пути\" и выше , поэтому они не были перенесены:\n * " + string.Join("\n * ", needReloadSetAndRlEnRoute.Select(x => x.Address))); } if (fastDeliveryNotEnoughQuantity.Count > 0) { MessageDialogHelper.RunWarningDialog("Для следующих адресов c доставкой за час у водителя не хватает остатков, поэтому они не были перенесены:\n * " + string.Join("\n * ", fastDeliveryNotEnoughQuantity.Select(x => x.Address))); } if (messages.Count > 0) { MessageDialogHelper.RunInfoDialog(string.Format("Были выполнены следующие действия:\n*{0}", string.Join("\n*", messages))); } UpdateNodes(); CheckSensitivities(); }
protected void InitPopupActions() { var callTaskWorker = new CallTaskWorker( CallTaskSingletonFactory.GetInstance(), callTaskRepository, new OrderRepository(), new EmployeeRepository(), baseParametersProvider, commonServices.UserService, SingletonErrorReporter.Instance); PopupActionsList.Add(new JournalAction( "Закрытие МЛ", (selectedItems) => selectedItems.Any(x => closingDlgStatuses.Contains((x as RouteListJournalNode).StatusEnum)), (selectedItems) => selectedItems.Any(x => closingDlgStatuses.Contains((x as RouteListJournalNode).StatusEnum)), (selectedItems) => { var selectedNode = selectedItems.FirstOrDefault() as RouteListJournalNode; if (selectedNode != null && closingDlgStatuses.Contains(selectedNode.StatusEnum)) { TabParent.OpenTab( DialogHelper.GenerateDialogHashName <RouteList>(selectedNode.Id), () => new RouteListClosingDlg(selectedNode.Id) ); } } )); PopupActionsList.Add(new JournalAction( "Создание талона погрузки", (selectedItems) => selectedItems.Any(x => createCarLoadDocument.Contains((x as RouteListJournalNode).StatusEnum)), (selectedItems) => selectedItems.Any(x => createCarLoadDocument.Contains((x as RouteListJournalNode).StatusEnum)), (selectedItems) => { var selectedNode = selectedItems.FirstOrDefault() as RouteListJournalNode; if (selectedNode != null) { TabParent.OpenTab(() => new CarLoadDocumentDlg(selectedNode.Id, null)); } } )); PopupActionsList.Add(new JournalAction( "Создание талона разгрузки", (selectedItems) => selectedItems.Any(x => createCarUnloadDocument.Contains((x as RouteListJournalNode).StatusEnum)), (selectedItems) => selectedItems.Any(x => createCarUnloadDocument.Contains((x as RouteListJournalNode).StatusEnum)), (selectedItems) => { var selectedNode = selectedItems.FirstOrDefault() as RouteListJournalNode; if (selectedNode != null) { TabParent.OpenTab(() => new CarUnloadDocumentDlg(selectedNode.Id, null)); } } )); PopupActionsList.Add(new JournalAction( "Выдать топливо", (selectedItems) => selectedItems.Any(x => fuelIssuingStatuses.Contains((x as RouteListJournalNode).StatusEnum)), (selectedItems) => selectedItems.Any(x => fuelIssuingStatuses.Contains((x as RouteListJournalNode).StatusEnum)), (selectedItems) => { var selectedNode = selectedItems.FirstOrDefault() as RouteListJournalNode; if (selectedNode != null) { var RouteList = UoW.GetById <RouteList>(selectedNode.Id); TabParent.OpenTab( DialogHelper.GenerateDialogHashName <RouteList>(selectedNode.Id), () => new FuelDocumentViewModel( RouteList, commonServices, subdivisionRepository, new EmployeeRepository(), fuelRepository, NavigationManagerProvider.NavigationManager, new TrackRepository(), new CategoryRepository(new ParametersProvider()) ) ); } } )); PopupActionsList.Add(new JournalAction( "Вернуть в статус Сдается", (selectedItems) => selectedItems.Any(x => canReturnToOnClosing.Contains((x as RouteListJournalNode).StatusEnum)), (selectedItems) => selectedItems.Any(x => canReturnToOnClosing.Contains((x as RouteListJournalNode).StatusEnum)), (selectedItems) => { var selectedNode = selectedItems.FirstOrDefault() as RouteListJournalNode; bool isSlaveTabActive = false; if (selectedNode != null) { using (var uowLocal = UnitOfWorkFactory.CreateWithoutRoot()) { var routeList = uowLocal.Session.QueryOver <RouteList>() .Where(x => x.Id == selectedNode.Id) .List().FirstOrDefault(); if (canReturnToOnClosing.Contains(routeList.Status)) { if (TabParent.FindTab(DialogHelper.GenerateDialogHashName <RouteList>(routeList.Id)) != null) { MessageDialogHelper.RunInfoDialog("Требуется закрыть подчиненную вкладку"); isSlaveTabActive = true; return; } routeList.ChangeStatusAndCreateTask(RouteListStatus.OnClosing, callTaskWorker); uowLocal.Save(routeList); if (isSlaveTabActive) { return; } } uowLocal.Commit(); } } } )); }
protected void OnButtonFindGapClicked(object sender, EventArgs e) { trackOnGapOverlay.Clear(); tracksDistance.RemoveAll(x => x.Id == "MissingTrack"); string message = "Найдены разрывы в треке:"; double replacedDistance = 0; TrackPoint lastPoint = null; foreach (var point in track.TrackPoints) { if (lastPoint == null) { lastPoint = point; continue; } var distance = GMapProviders.EmptyProvider.Projection.GetDistance( new PointLatLng(lastPoint.Latitude, lastPoint.Longitude), new PointLatLng(point.Latitude, point.Longitude)); if (distance > 0.5) { logger.Info("Найден разрыв в треке расстоянием в {0}", distance); message += string.Format("\n* разрыв c {1:t} по {2:t} — {0:N1} км.", distance, lastPoint.TimeStamp, point.TimeStamp ); replacedDistance += distance; var addressesByCompletion = routeList.Addresses .Where(x => x.Status == RouteListItemStatus.Completed) .OrderBy(x => x.StatusLastUpdate) .ToList(); RouteListItem addressBeforeGap = addressesByCompletion.LastOrDefault(x => x.StatusLastUpdate < lastPoint.TimeStamp.AddMinutes(2)); RouteListItem addressAfterGap = addressesByCompletion.FirstOrDefault(x => x.StatusLastUpdate > point.TimeStamp.AddMinutes(-2)); var beforeIndex = addressBeforeGap == null ? -1 : addressesByCompletion.IndexOf(addressBeforeGap); var afterIndex = addressAfterGap == null ? addressesByCompletion.Count : addressesByCompletion.IndexOf(addressAfterGap); var routePoints = new List <PointOnEarth> { new PointOnEarth(lastPoint.Latitude, lastPoint.Longitude) }; if (afterIndex - beforeIndex > 1) { var throughAddress = addressesByCompletion.GetRange(beforeIndex + 1, afterIndex - beforeIndex - 1); logger.Info("В разрыве найдены выполенные адреса порядковый(е) номер(а) {0}", String.Join(", ", throughAddress.Select(x => x.IndexInRoute))); routePoints.AddRange( throughAddress.Where(x => x.Order?.DeliveryPoint?.Latitude != null && x.Order?.DeliveryPoint?.Longitude != null) .Select(x => new PointOnEarth(x.Order.DeliveryPoint.Latitude.Value, x.Order.DeliveryPoint.Longitude.Value))); message += $" c выполненными адресами({beforeIndex + 2}-{afterIndex}) п/п в МЛ " + String.Join(", ", throughAddress.Select(x => x.IndexInRoute)); } routePoints.Add(new PointOnEarth(point.Latitude, point.Longitude)); var missedTrack = SputnikMain.GetRoute(routePoints, false, true); if (missedTrack == null) { MessageDialogHelper.RunErrorDialog("Не удалось получить ответ от сервиса \"Спутник\""); return; } if (missedTrack.Status != 0) { MessageDialogHelper.RunErrorDialog("Cервис \"Спутник\" сообщил об ошибке {0}: {1}", missedTrack.Status, missedTrack.StatusMessageRus); return; } var decodedPoints = Polyline.DecodePolyline(missedTrack.RouteGeometry); var points = decodedPoints.Select(p => new PointLatLng(p.Latitude * 0.1, p.Longitude * 0.1)).ToList(); var route = new GMapRoute(points, "MissedRoute") { Stroke = new Pen(Color.DarkMagenta) { Width = 4, DashStyle = System.Drawing.Drawing2D.DashStyle.Dot } }; trackOnGapOverlay.Routes.Add(route); } lastPoint = point; } if (trackOnGapOverlay.Routes.Count > 0) { var distanceLayout = MakeDistanceLayout(trackOnGapOverlay.Routes.ToArray()); distanceLayout.Id = "MissingTrack"; tracksDistance.Add(distanceLayout); var oldDistance = track.DistanceEdited ? trackRoute.Distance : track.Distance; var missedRouteDistance = trackOnGapOverlay.Routes.Sum(x => x.Distance); var newDistance = oldDistance - replacedDistance + missedRouteDistance; var diffDistance = newDistance - oldDistance; message += $"\n Старая длинна трека:{oldDistance:N1} км." + $"\n Новая длинна трека: {newDistance:N1} км.(+{diffDistance:N1})" + "\n Сохранить изменения длинны трека?"; if (MessageDialogHelper.RunQuestionDialog(message)) { track.Distance = newDistance; track.DistanceEdited = true; UoW.Save(track); UoW.Commit(); UpdateDistanceLabel(); } } else { MessageDialogHelper.RunInfoDialog("Разрывов в треке не найдено."); } }
private void SendDocument() { var client = document.Order.Client; var rdlDoc = (document as IPrintableRDLDocument); if (rdlDoc == null) { MessageDialogHelper.RunErrorDialog("Невозможно распечатать данный тип документа"); return; } if (document.Order.Id == 0) { if (!MessageDialogHelper.RunQuestionDialog("Для отправки необходимо сохранить заказ, сохранить сейчас?")) { return; } if (!(MyOrmDialog as OrderDlg).Save()) { return; } } if (client == null) { MessageDialogHelper.RunErrorDialog("Должен быть выбран клиент в заказе"); return; } if (!ParametersProvider.Instance.ContainsParameter("email_for_email_delivery")) { MessageDialogHelper.RunErrorDialog("В параметрах базы не определена почта для рассылки"); return; } if (string.IsNullOrWhiteSpace(yvalidatedentryEmail.Text)) { MessageDialogHelper.RunErrorDialog("Необходимо ввести адрес электронной почты"); return; } Email email = CreateDocumentEmail("", "vodovoz-spb.ru", document); if (email == null) { MessageDialogHelper.RunErrorDialog("Для данного типа документа не реализовано формирование письма"); return; } using (var uow = UnitOfWorkFactory.CreateWithoutRoot()) { var employee = EmployeeRepository.GetEmployeeForCurrentUser(uow); email.AuthorId = employee != null ? employee.Id : 0; email.ManualSending = true; } IEmailService service = EmailServiceSetting.GetEmailService(); if (service == null) { return; } var result = service.SendEmail(email); //Если произошла ошибка и письмо не отправлено string resultMessage = ""; if (!result.Item1) { resultMessage = "Письмо не было отправлено! Причина:\n"; } MessageDialogHelper.RunInfoDialog(resultMessage + result.Item2); UpdateEmails(); }