void ButtonSendErrorSendedEmails_Clicked(object sender, EventArgs e)
        {
            ManualEmailSender emailSender = new ManualEmailSender();

            emailSender.ResendEmailWithErrorSendingStatus(datepicker1.Date);
            MessageDialogWorks.RunInfoDialog("Done");
        }
Exemple #2
0
        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
                                                           ));
        }
Exemple #3
0
        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);
        }
Exemple #4
0
        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);
        }
Exemple #5
0
 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("Сохранено.");
 }
Exemple #6
0
        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);
        }
Exemple #8
0
        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();
        }
Exemple #9
0
        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)
                                                                                                      ))
                                                               ));
            }
        }
Exemple #10
0
        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);
        }
Exemple #11
0
        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);
        }
Exemple #12
0
        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("Разрывов в треке не найдено.");
            }
        }
Exemple #13
0
        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));
            }
        }
Exemple #14
0
        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();
        }