void ButtonSendErrorSendedEmails_Clicked(object sender, EventArgs e) { ManualEmailSender emailSender = new ManualEmailSender(); emailSender.ResendEmailWithErrorSendingStatus(datepicker1.Date); MessageDialogWorks.RunInfoDialog("Done"); }
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"); route.Stroke = new System.Drawing.Pen(System.Drawing.Color.Blue); route.Stroke.Width = 4; route.Stroke.DashStyle = System.Drawing.Drawing2D.DashStyle.Solid; tracksDistance.Add(MakeDistanceLayout(route)); trackToBaseOverlay.Routes.Add(route); buttonRecalculateToBase.Sensitive = false; MessageDialogWorks.RunInfoDialog(String.Format("Расстояние от {0} до склада {1} км. Время в пути {2}.", response.RouteSummary.StartPoint, response.RouteSummary.TotalDistanceKm, response.RouteSummary.TotalTime )); }
public override bool Save() { var valid = new QSValidator <AdvanceReport>(UoWGeneric.Root); if (valid.RunDlgIfNotValid((Gtk.Window) this.Toplevel)) { return(false); } logger.Info("Сохраняем авансовый отчет..."); Income newIncome; Expense newExpense; bool needClosing = UoWGeneric.IsNew; UoWGeneric.Save(); // Сохраняем сначала отчет, так как нужно получить Id. if (needClosing) { var closing = Entity.CloseAdvances(out newExpense, out newIncome, advanceList.Where(a => a.Selected).Select(a => a.Advance).ToList()); if (newExpense != null) { UoWGeneric.Save(newExpense); logger.Info("Создаем документ распределения расхода налички по юр лицу..."); distributor.DistributeCashForExpenseAdvance(UoW, newExpense, Entity); } if (newIncome != null) { UoWGeneric.Save(newIncome); logger.Info("Создаем документ распределения прихода налички по юр лицу..."); distributor.DistributeCashForIncomeAdvance(UoW, newIncome, Entity); } advanceList.Where(a => a.Selected).Select(a => a.Advance).ToList().ForEach(a => UoWGeneric.Save(a)); closing.ForEach(c => UoWGeneric.Save(c)); UoWGeneric.Save(); if (newIncome != null) { MessageDialogWorks.RunInfoDialog(String.Format("Дополнительно создан приходный ордер №{0}, на сумму {1:C}.\nНе забудьте получить сдачу от подотчетного лица!", newIncome.Id, newIncome.Money)); } if (newExpense != null) { MessageDialogWorks.RunInfoDialog(String.Format("Дополнительно создан расходный ордер №{0}, на сумму {1:C}.\nНе забудьте доплатить подотчетному лицу!", newExpense.Id, newExpense.Money)); } } logger.Info("Ok"); return(true); }
protected void OnButtonOkClicked(object sender, EventArgs e) { checkSettingsExist(); isUpdate.ValueSettting = ycheckbutton.Active.ToString(); timer.ValueSettting = ((int)yspinbutton.Value).ToString(); isUpdate.DateEdit = timer.DateEdit = DateTime.Now; UoW.Save(isUpdate); UoW.Save(timer); UoW.Commit(); MessageDialogWorks.RunInfoDialog("Изменения вступят в силу после перезапуска программы."); Respond(ResponseType.Ok); }
protected void OnBtnSaveClicked(object sender, EventArgs e) { foreach (var row in listEmployeeCoeff) { if (row.Value == null) { row.Value = "1"; } row.Value.Replace(",", "."); UoW.Save(row); } UoW.Commit(); MessageDialogWorks.RunInfoDialog("Сохранено."); }
protected void OnButtonAppointForwardersClicked(object sender, EventArgs e) { var toAdd = new List <AtWorkForwarder>(); foreach (var forwarder in ForwardersAtDay.Where(f => DriversAtDay.All(d => d.WithForwarder != f))) { var defaulDriver = DriversAtDay.FirstOrDefault(d => d.WithForwarder == null && d.Employee.DefaultForwarder?.Id == forwarder.Employee.Id); if (defaulDriver != null) { defaulDriver.WithForwarder = forwarder; } else { toAdd.Add(forwarder); } } if (toAdd.Count == 0) { return; } var orders = LogisticAreaRepository.OrdersCountByArea(uow, DialogAtDate, 12); var districtsBottles = orders.GroupBy(x => x.DistrictId).ToDictionary(x => x.Key, x => x.Sum(o => o.WaterCount)); foreach (var forwarder in toAdd) { var driversToAdd = DriversAtDay.Where(x => x.WithForwarder == null && x.Car != null && x.Car.TypeOfUse != CarTypeOfUse.Largus).ToList(); if (driversToAdd.Count == 0) { logger.Warn("Не осталось водителей для добавленя экспедиторов."); break; } Func <int, int> ManOnDistrict = (int districtId) => driversAtDay.Where(dr => dr.Car != null && dr.Car.TypeOfUse != CarTypeOfUse.Largus && dr.Districts.Any(dd2 => dd2.District.Id == districtId)) .Sum(dr => dr.WithForwarder == null ? 1 : 2); var driver = driversToAdd.OrderByDescending(x => districtsBottles.Where(db => x.Employee.Districts.Any(dd => dd.District.Id == db.Key)) .Max(db => (double)db.Value / ManOnDistrict(db.Key))).First(); var testSum = driversToAdd.ToDictionary(x => x, x => districtsBottles.Where(db => x.Employee.Districts.Any(dd => dd.District.Id == db.Key)) .Max(db => (double)db.Value / ManOnDistrict(db.Key))); driver.WithForwarder = forwarder; } MessageDialogWorks.RunInfoDialog("Готово."); }
public override bool Save() { if (Entity.Status == RouteListStatus.EnRoute && items.All(x => x.Status != RouteListItemStatus.EnRoute)) { if (MessageDialogWorks.RunQuestionDialog("В маршрутном листе не осталось адресов со статусом в 'В пути'. Завершить маршрут?")) { Entity.CompleteRoute(); } } 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) { MessageDialogWorks.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); }
private void Configure() { track = Vodovoz.Repository.Logistics.TrackRepository.GetTrackForRouteList(UoW, routeList.Id); if (track == null) { buttonRecalculateToBase.Sensitive = buttonFindGap.Sensitive = buttonCutTrack.Sensitive = buttonLastAddress.Sensitive = false; MessageDialogWorks.RunInfoDialog($"Маршрутный лист №{routeList.Id}\nТрек не обнаружен"); } else if (routeList.Status < RouteListStatus.OnClosing) { buttonRecalculateToBase.Sensitive = buttonFindGap.Sensitive = buttonCutTrack.Sensitive = buttonLastAddress.Sensitive = false; } ConfigureMap(); OpenMap(); UpdateDistanceLabel(); }
protected void OnButtonUpdatePricesClicked(object sender, EventArgs e) { var newPricesList = new Dictionary <Price, int>(); int effectedRows = 0; foreach (var item in Entity.ProjectRows) { PriceItem newPriceItem = Repository.PriceRepository.GetLastPriceItem(UoW, item.Fitting, item.SelectedPriceItem?.Price.Provider); if (newPriceItem == null) { continue; } if (!DomainHelper.EqualDomainObjects(newPriceItem, item.SelectedPriceItem)) { effectedRows++; item.SelectedPriceItem = newPriceItem; item.FittingPrice = newPriceItem.Cost; item.PriceCurrency = newPriceItem.Currency; if (newPricesList.ContainsKey(newPriceItem.Price)) { newPricesList[newPriceItem.Price]++; } else { newPricesList.Add(newPriceItem.Price, 1); } } } if (effectedRows == 0) { MessageDialogWorks.RunInfoDialog("Новые цены не найдены!"); } else { MessageDialogWorks.RunInfoDialog(String.Format("Были обновлены цены в {0}.\n" + "Новые цены были получены из {1}:\n" + "{2}", RusNumber.FormatCase(effectedRows, "{0} строке", "{0} строках", "{0} строках"), RusNumber.FormatCase(newPricesList.Count, "{0} прайса", "{0} прайсов", "{0} прайсов"), String.Join("\n", newPricesList.Select(x => String.Format("{0} ({1:d}) - {2}", x.Key.Provider.Name, x.Key.Date, x.Value) )) )); } }
public override bool Save() { var valid = new QSValidation.QSValidator <SelfDeliveryDocument>(UoWGeneric.Root); if (valid.RunDlgIfNotValid((Gtk.Window) this.Toplevel)) { return(false); } Entity.LastEditor = Repository.EmployeeRepository.GetEmployeeForCurrentUser(UoW); Entity.LastEditedTime = DateTime.Now; if (Entity.LastEditor == null) { MessageDialogWorks.RunErrorDialog("Ваш пользователь не привязан к действующему сотруднику, вы не можете изменять складские документы, так как некого указывать в качестве кладовщика."); return(false); } Entity.UpdateOperations(UoW); foreach (GoodsReceptionVMNode item in BottlesReceptionList) { Entity.UpdateReturnedOperation(UoW, item.NomenclatureId, item.Amount); var defBottle = NomenclatureRepository.GetDefaultBottle(UoW); if (item.NomenclatureId == defBottle.Id) { Entity.Order.ReturnedTare = item.Amount; } } foreach (GoodsReceptionVMNode item in GoodsReceptionList) { Entity.UpdateReturnedOperation(UoW, item.NomenclatureId, item.Amount); } if (Entity.FullyShiped(UoW)) { MessageDialogWorks.RunInfoDialog("Заказ отгружен полностью."); } logger.Info("Сохраняем документ самовывоза..."); UoWGeneric.Save(); logger.Info("Ok."); return(true); }
public override bool Save() { var valid = new QSValidation.QSValidator <CarLoadDocument> (UoWGeneric.Root); if (valid.RunDlgIfNotValid((Gtk.Window) this.Toplevel)) { return(false); } Entity.LastEditor = Repository.EmployeeRepository.GetEmployeeForCurrentUser(UoW); Entity.LastEditedTime = DateTime.Now; if (Entity.LastEditor == null) { MessageDialogWorks.RunErrorDialog("Ваш пользователь не привязан к действующему сотруднику, вы не можете изменять складские документы, так как некого указывать в качестве кладовщика."); return(false); } if (Entity.Items.Any(x => x.Amount == 0)) { if (MessageDialogWorks.RunQuestionDialog("В списке есть нулевые позиции. Убрать нулевые позиции перед сохранением?")) { Entity.ClearItemsFromZero(); } } Entity.UpdateOperations(UoW); logger.Info("Сохраняем погрузочный талон..."); UoWGeneric.Save(); logger.Info("Меняем статус маршрутного листа..."); if (Entity.RouteList.ShipIfCan(UoW)) { MessageDialogWorks.RunInfoDialog("Маршрутный лист отгружен полностью."); } UoW.Save(Entity.RouteList); UoW.Commit(); logger.Info("Ok."); return(true); }
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>(); routePoints.Add(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) { MessageDialogWorks.RunErrorDialog("Не удалось получить ответ от сервиса \"Спутник\""); return; } if (missedTrack.Status != 0) { MessageDialogWorks.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"); route.Stroke = new System.Drawing.Pen(System.Drawing.Color.DarkMagenta); route.Stroke.Width = 4; route.Stroke.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 (MessageDialogWorks.RunQuestionDialog(message)) { track.Distance = newDistance; track.DistanceEdited = true; UoW.Save(track); UoW.Commit(); UpdateDistanceLabel(); } } else { MessageDialogWorks.RunInfoDialog("Разрывов в треке не найдено."); } }
public static void CheckMicroUpdates() { Version currentDB = new Version(); if (MainSupport.BaseParameters.All.ContainsKey("micro_updates")) { currentDB = Version.Parse(MainSupport.BaseParameters.All["micro_updates"]); } var dbMainVersion = Version.Parse(MainSupport.BaseParameters.Version); if (currentDB < dbMainVersion) { currentDB = dbMainVersion; } logger.Info("Проверяем микро обновления базы(текущая версия:{0})", StringWorks.VersionToShortString(currentDB)); var beforeUpdates = currentDB; while (microUpdates.Exists(u => u.Source == currentDB)) { var update = microUpdates.Find(u => u.Source == currentDB); if (!QSMain.User.Admin) { NotAdminErrorAndExit(true, update.Source, update.Destanation); } logger.Info("Обновляемся до {0}", StringWorks.VersionToShortString(update.Destanation)); var trans = QSMain.ConnectionDB.BeginTransaction(); try { string sql; using (Stream stream = update.Assembly.GetManifestResourceStream(update.Resource)) { if (stream == null) { throw new InvalidOperationException(String.Format("Ресурс {0} указанный в обновлениях не найден.", update.Resource)); } StreamReader reader = new StreamReader(stream); sql = reader.ReadToEnd(); } var cmd = QSMain.ConnectionDB.CreateCommand(); cmd.CommandText = sql; cmd.Transaction = trans; cmd.ExecuteNonQuery(); trans.Commit(); currentDB = update.Destanation; } catch (Exception ex) { trans.Rollback(); QSMain.ErrorMessageWithLog("Ошибка при обновлении базы..", logger, ex); return; } } if (currentDB != beforeUpdates) { MainSupport.BaseParameters.UpdateParameter( QSMain.ConnectionDB, "micro_updates", StringWorks.VersionToShortString(currentDB) ); MessageDialogWorks.RunInfoDialog("Выполнено микро обновление базы {0} -> {1}.", StringWorks.VersionToShortString(beforeUpdates), StringWorks.VersionToShortString(currentDB)); } }
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>(); 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; } RouteListItem newItem = new RouteListItem(routeListTo, item.Order, item.Status); newItem.WasTransfered = true; newItem.NeedToReload = row.LeftNeedToReload; newItem.WithForwarder = routeListTo.Forwarder != null; routeListTo.ObservableAddresses.Add(newItem); item.TransferedTo = newItem; if (routeListTo.ClosingFilled) { newItem.FirstFillClosing(UoW); } UoW.Save(item); UoW.Save(newItem); } 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) { MessageDialogWorks.RunWarningDialog("Для следующих адресов не была указана необходимость загрузки, поэтому они не были перенесены:\n * " + String.Join("\n * ", needReloadNotSet.Select(x => x.Address)) ); } if (messages.Count > 0) { MessageDialogWorks.RunInfoDialog(String.Format("Были выполнены следующие действия:\n*{0}", String.Join("\n*", messages))); } UpdateNodes(); CheckSensitivities(); }