예제 #1
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")
            {
                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);
            }
        }
예제 #3
0
        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)));
        }
예제 #4
0
        /// <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);
            }
        }
예제 #5
0
        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);
        }
예제 #8
0
 public bool CanClose()
 {
     if (!canClose)
     {
         MessageDialogHelper.RunInfoDialog("Дождитесь завершения работы задачи и повторите");
     }
     return(canClose);
 }
예제 #9
0
 void OnUpdate(bool hide = false)
 {
     if (enumchecklistOrderStatus.SelectedValuesList.Count > 0)
     {
         LoadReport?.Invoke(this, new LoadReportEventArgs(GetReportInfo(), hide));
     }
     else
     {
         MessageDialogHelper.RunInfoDialog("Список статусов не может быть пустым");
     }
 }
예제 #10
0
 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");
            }
        }
예제 #12
0
        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);
        }
예제 #13
0
        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);
            }
        }
예제 #14
0
        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();
                }
            };
        }
예제 #15
0
        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);
        }
예제 #16
0
        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();
            }
        }
예제 #17
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;
                MessageDialogHelper.RunInfoDialog($"Маршрутный лист №{routeList.Id}\nТрек не обнаружен");
            }
            else if (routeList.Status < RouteListStatus.OnClosing)
            {
                buttonRecalculateToBase.Sensitive = buttonFindGap.Sensitive = buttonCutTrack.Sensitive = buttonLastAddress.Sensitive = false;
            }

            ConfigureMap();
            OpenMap();
            UpdateDistanceLabel();
        }
예제 #18
0
 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> — на складе достаточное количество"
         );
 }
예제 #19
0
        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;
        }
예제 #20
0
        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);
        }
예제 #21
0
        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
                    );
            }
        }
예제 #23
0
        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)));
            }
        }
예제 #24
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>();
            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();
        }
예제 #25
0
        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;
                    }
                });
            };
        }
예제 #26
0
        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();
        }
예제 #27
0
        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();
                    }
                }
            }
                                     ));
        }
예제 #28
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> {
                        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("Разрывов в треке не найдено.");
            }
        }
예제 #29
0
        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();
        }