Beispiel #1
0
        public FineDlg(UndeliveredOrder undeliveredOrder) : this()
        {
            Entity.UndeliveredOrder = undeliveredOrder;
            var RouteList = RouteListItemRepository.GetRouteListItemForOrder(UoW, undeliveredOrder.OldOrder)?.RouteList;

            Entity.RouteList = RouteList;
        }
        public Dictionary <GuiltyTypes, int> GetDictionaryWithUndeliveriesCountForDates(IUnitOfWork uow, DateTime?start = null, DateTime?end = null)
        {
            UndeliveredOrder   undeliveredOrderAlias   = null;
            Order              orderAlias              = null;
            GuiltyInUndelivery guiltyInUndeliveryAlias = null;

            var query = uow.Session.QueryOver <UndeliveredOrder>(() => undeliveredOrderAlias);

            if (start != null && end != null)
            {
                query.Left.JoinAlias(u => u.OldOrder, () => orderAlias)
                .Where(() => orderAlias.DeliveryDate >= start)
                .Where(u => orderAlias.DeliveryDate <= end);
            }

            var result = query
                         .Left.JoinAlias(() => undeliveredOrderAlias.GuiltyInUndelivery, () => guiltyInUndeliveryAlias)
                         .SelectList(list => list
                                     .SelectGroup(() => guiltyInUndeliveryAlias.GuiltySide)
                                     .SelectCount(() => undeliveredOrderAlias.Id)
                                     )
                         .List <object[]>();

            return(result.ToDictionary(x => (GuiltyTypes)x[0], x => (int)x[1]));
        }
        public IList <UndeliveredOrderCountNode> GetListOfUndeliveriesCountOnDptForDates(IUnitOfWork uow, DateTime?start = null, DateTime?end = null)
        {
            UndeliveredOrderCountNode resultAlias           = null;
            UndeliveredOrder          undeliveredOrderAlias = null;
            Subdivision        subdivisionAlias             = null;
            Order              orderAlias = null;
            GuiltyInUndelivery guiltyInUndeliveryAlias = null;

            var query = uow.Session.QueryOver <UndeliveredOrder>(() => undeliveredOrderAlias)
                        .Where(() => guiltyInUndeliveryAlias.GuiltySide == GuiltyTypes.Department)
                        .Left.JoinAlias(u => u.OldOrder, () => orderAlias)
                        .Left.JoinAlias(() => guiltyInUndeliveryAlias.GuiltyDepartment, () => subdivisionAlias)
                        .Left.JoinAlias(() => undeliveredOrderAlias.GuiltyInUndelivery, () => guiltyInUndeliveryAlias);

            if (start != null && end != null)
            {
                query.Where(() => orderAlias.DeliveryDate >= start)
                .Where(u => orderAlias.DeliveryDate <= end);
            }

            var result = query.SelectList(list => list
                                          .SelectGroup(() => subdivisionAlias.Id).WithAlias(() => resultAlias.SubdivisionId)
                                          .Select(() => subdivisionAlias.Name).WithAlias(() => resultAlias.Subdivision)
                                          .SelectCount(() => undeliveredOrderAlias.Id).WithAlias(() => resultAlias.Count)
                                          )
                         .TransformUsing(Transformers.AliasToBean <UndeliveredOrderCountNode>())
                         .List <UndeliveredOrderCountNode>();

            return(result);
        }
 public IList <UndeliveredOrderComment> GetComments(IUnitOfWork uow, UndeliveredOrder undeliveredOrder, CommentedFields field)
 {
     return(uow.Session.QueryOver <UndeliveredOrderComment>()
            .Where(c => c.UndeliveredOrder.Id == undeliveredOrder.Id)
            .Where(c => c.CommentedField == field)
            .List <UndeliveredOrderComment>());
 }
        public IList <UndeliveredOrderCommentsNode> GetCommentNodes(IUnitOfWork uow, UndeliveredOrder undeliveredOrder, CommentedFields field)
        {
            UndeliveredOrderCommentsNode resultAlias            = null;
            UndeliveredOrderComment      undeliveredOrderAllais = null;
            Employee employeeAlias = null;
            bool     clr           = false;

            var nodes = uow.Session.QueryOver <UndeliveredOrderComment>(() => undeliveredOrderAllais)
                        .Where(c => c.UndeliveredOrder.Id == undeliveredOrder.Id)
                        .Where(c => c.CommentedField == field)
                        .JoinAlias(() => undeliveredOrderAllais.Employee, () => employeeAlias)
                        .SelectList(
                list => list
                .Select(() => undeliveredOrderAllais.Comment).WithAlias(() => resultAlias.Comment)
                .Select(() => undeliveredOrderAllais.CommentDate).WithAlias(() => resultAlias.Date)
                .Select(() => employeeAlias.Name).WithAlias(() => resultAlias.FName)
                .Select(() => employeeAlias.Patronymic).WithAlias(() => resultAlias.MName)
                .Select(() => employeeAlias.LastName).WithAlias(() => resultAlias.LName)
                )
                        .OrderBy(i => i.CommentDate).Desc
                        .TransformUsing(Transformers.AliasToBean <UndeliveredOrderCommentsNode>())
                        .List <UndeliveredOrderCommentsNode>();

            foreach (var node in nodes)
            {
                node.Color = clr ? "red" : "blue";
                clr        = !clr;
            }

            return(nodes);
        }
 public UndeliveredOrderDlg(int id)
 {
     this.Build();
     UoW = UnitOfWorkFactory.CreateForRoot <UndeliveredOrder>(id);
     UndeliveredOrder = UoW.RootObject as UndeliveredOrder;
     TabName          = UndeliveredOrder.Title;
     ConfigureDlg();
 }
 public void ConfigureDlg()
 {
     undelivery = new UndeliveredOrder {
         UoW    = UoW,
         Author = EmployeeRepository.GetEmployeeForCurrentUser(UoW),
         EmployeeRegistrator = EmployeeRepository.GetEmployeeForCurrentUser(UoW),
         TimeOfCreation      = DateTime.Now,
         OldOrder            = order
     };
     undeliveryView.ConfigureDlg(UoW, undelivery);
 }
Beispiel #8
0
        /// <summary>
        /// Проверка на возможность создания нового недовоза
        /// </summary>
        /// <returns><c>true</c>, если можем создать, <c>false</c> если создать недовоз не можем,
        /// при этом добавляется автокомментарий к существующему недовозу с содержимым
        /// нового (но не добавленного) недовоза.</returns>
        bool CanCreateUndelivery()
        {
            if (UndeliveredOrder.Id > 0)
            {
                return(true);
            }
            var otherUndelivery = UndeliveredOrdersRepository.GetListOfUndeliveriesForOrder(UoW, UndeliveredOrder.OldOrder).FirstOrDefault();

            if (otherUndelivery == null)
            {
                return(true);
            }
            otherUndelivery.AddCommentToTheField(UoW, CommentedFields.Reason, UndeliveredOrder.GetUndeliveryInfo());
            return(false);
        }
 public void Configure(IUnitOfWork uow, UndeliveredOrder undeliveredOrder, CommentedFields field)
 {
     UoW = uow;
     UndeliveredOrder            = undeliveredOrder;
     Employee                    = _employeeRepository.GetEmployeeForCurrentUser(UoW);
     Field                       = field;
     yTreeComments.ColumnsConfig = ColumnsConfigFactory.Create <UndeliveredOrderCommentsNode>()
                                   .AddColumn("Дата - Имя")
                                   .AddTextRenderer(n => n.UserDateAndName, useMarkup: true)
                                   .AddColumn("Комментарий")
                                   .AddTextRenderer(n => n.MarkedupComment, useMarkup: true)
                                   .WrapWidth(450).WrapMode(Pango.WrapMode.WordChar)
                                   .Finish();
     GetComments();
 }
Beispiel #10
0
 public UndeliveredOrderDlg()
 {
     this.Build();
     UoW = UnitOfWorkFactory.CreateWithNewRoot <UndeliveredOrder>();
     UndeliveredOrder        = UoW.RootObject as UndeliveredOrder;
     UndeliveredOrder.Author = EmployeeRepository.GetEmployeeForCurrentUser(UoW);
     UndeliveredOrder.EmployeeRegistrator = EmployeeRepository.GetEmployeeForCurrentUser(UoW);
     if (UndeliveredOrder.Author == null)
     {
         MessageDialogWorks.RunErrorDialog("Ваш пользователь не привязан к действующему сотруднику, вы не можете создавать недовозы, так как некого указывать в качестве автора документа.");
         FailInitialize = true;
         return;
     }
     TabName = "Новый недовоз";
     UndeliveredOrder.TimeOfCreation = DateTime.Now;
     ConfigureDlg();
 }
        public IList <object[]> GetGuiltyAndCountForDates(IUnitOfWork uow, DateTime?start = null, DateTime?end = null)
        {
            UndeliveredOrder   undeliveredOrderAlias   = null;
            Subdivision        subdivisionAlias        = null;
            Order              orderAlias              = null;
            GuiltyInUndelivery guiltyInUndeliveryAlias = null;

            var query = uow.Session.QueryOver <UndeliveredOrder>(() => undeliveredOrderAlias)
                        .Left.JoinAlias(u => u.OldOrder, () => orderAlias)
                        .Left.JoinAlias(() => undeliveredOrderAlias.GuiltyInUndelivery, () => guiltyInUndeliveryAlias)
                        .Left.JoinAlias(() => guiltyInUndeliveryAlias.GuiltyDepartment, () => subdivisionAlias);

            if (start != null && end != null)
            {
                query.Where(() => orderAlias.DeliveryDate >= start)
                .Where(u => orderAlias.DeliveryDate <= end);
            }

            int i      = 0;
            var result = query.SelectList(list => list
                                          .SelectGroup(u => u.Id)
                                          .Select(
                                              Projections.SqlFunction(
                                                  new SQLFunctionTemplate(
                                                      NHibernateUtil.String,
                                                      "GROUP_CONCAT(CASE ?1 WHEN 'Department' THEN IFNULL(CONCAT('Отд: ', ?2), 'Отдел ВВ') WHEN 'Client' THEN 'Клиент' WHEN 'Driver' THEN 'Водитель' WHEN 'ServiceMan' THEN 'Мастер СЦ' WHEN 'None' THEN 'Нет (не недовоз)' WHEN 'Unknown' THEN 'Неизвестно' ELSE ?1 END ORDER BY ?1 ASC SEPARATOR '\n')"
                                                      ),
                                                  NHibernateUtil.String,
                                                  Projections.Property(() => guiltyInUndeliveryAlias.GuiltySide),
                                                  Projections.Property(() => subdivisionAlias.ShortName)
                                                  )
                                              )
                                          )
                         .List <object[]>()
                         .GroupBy(x => x[1])
                         .Select(r => new[] { r.Key, r.Count(), i++ })
                         .ToList();

            return(result);
        }
Beispiel #12
0
 public UndeliveredOrderDlg(UndeliveredOrder sub) : this(sub.Id)
 {
 }
Beispiel #13
0
 public UndeliveryOnOrderCloseEventArgs(UndeliveredOrder undeliveredOrder)
 {
     UndeliveredOrder = undeliveredOrder;
 }
Beispiel #14
0
        public void ConfigureWidget(IUnitOfWork uow, UndeliveredOrder undeliveredOrder, bool driverCanBeGuilty)
        {
            _uow = uow;
            _undeliveredOrder           = undeliveredOrder;
            enumBtnGuiltySide.ItemsEnum = typeof(GuiltyTypes);
            enumBtnGuiltySide.SetSensitive(GuiltyTypes.Driver, driverCanBeGuilty);
            enumBtnGuiltySide.SetSensitive(GuiltyTypes.None, !undeliveredOrder.ObservableGuilty.Any());
            undeliveredOrder.ObservableGuilty.ElementAdded   += ObservableGuilty_ElementAdded;
            undeliveredOrder.ObservableGuilty.ElementRemoved += ObservableGuilty_ElementRemoved;
            enumBtnGuiltySide.EnumItemClicked += (sender, e) => {
                undeliveredOrder.AddGuilty(
                    new GuiltyInUndelivery {
                    GuiltySide       = (GuiltyTypes)e.ItemEnum,
                    UndeliveredOrder = undeliveredOrder
                }
                    );
                SetWidgetApperance();
            };

            var colorBlack     = new Gdk.Color(0, 0, 0);
            var colorGrey      = new Gdk.Color(96, 96, 96);
            var colorWhite     = new Gdk.Color(255, 255, 255);
            var hideEnums      = !driverCanBeGuilty ? new Enum[] { GuiltyTypes.Driver } : new Enum[] { };
            var allDepartments = _subdivisionRepository.GetAllDepartmentsOrderedByName(_uow);

            treeViewGuilty.ColumnsConfig = ColumnsConfigFactory.Create <GuiltyInUndelivery>()
                                           .AddColumn("Сторона")
                                           .HeaderAlignment(0.5f)
                                           .AddEnumRenderer(n => n.GuiltySide, true, hideEnums)
                                           .AddColumn("Отдел ВВ")
                                           .HeaderAlignment(0.5f)
                                           .AddComboRenderer(n => n.GuiltyDepartment)
                                           .SetDisplayFunc(x => x.Name)
                                           .FillItems(allDepartments)
                                           .AddSetter(
                (c, n) => {
                c.Editable = n.GuiltySide == GuiltyTypes.Department;
                if (n.GuiltySide != GuiltyTypes.Department)
                {
                    n.GuiltyDepartment = null;
                }
                if (n.GuiltySide == GuiltyTypes.Department && n.GuiltyDepartment == null)
                {
                    c.ForegroundGdk = colorGrey;
                    c.Style         = Pango.Style.Italic;
                    c.Text          = "(Нажмите для выбора отдела)";
                    c.BackgroundGdk = colorWhite;
                }
                else
                {
                    c.ForegroundGdk = colorBlack;
                    c.Style         = Pango.Style.Normal;
                    c.Background    = null;
                }
            }
                )
                                           .Finish();
            treeViewGuilty.HeadersVisible  = false;
            treeViewGuilty.ItemsDataSource = undeliveredOrder.ObservableGuilty;
            SetWidgetApperance();
        }
        public void ConfigureDlg(IUnitOfWork uow, UndeliveredOrder undelivery)
        {
            this.Sensitive = false;
            yEForUndeliveredOrder.Changed += OnUndeliveredOrderChanged;

            CanChangeProblemSource = commonServices.PermissionService.ValidateUserPresetPermission("can_change_undelivery_problem_source", commonServices.UserService.CurrentUserId);
            this.undelivery        = undelivery;
            UoW      = uow;
            oldOrder = undelivery.OldOrder;
            newOrder = undelivery.NewOrder;
            if (undelivery.Id > 0 && undelivery.InProcessAtDepartment != null)
            {
                InitialProcDepartmentName = undelivery.InProcessAtDepartment.Name;
            }
            if (undelivery.Id > 0)
            {
                foreach (GuiltyInUndelivery g in undelivery.ObservableGuilty)
                {
                    initialGuiltyList.Add(
                        new GuiltyInUndelivery {
                        Id = g.Id,
                        UndeliveredOrder = g.UndeliveredOrder,
                        GuiltySide       = g.GuiltySide,
                        GuiltyDepartment = g.GuiltyDepartment
                    }
                        );
                }
            }
            var filterOrders = new OrdersFilter(UoW);
            List <OrderStatus> hiddenStatusesList = new List <OrderStatus>();
            var grantedStatusesArray = OrderRepository.GetStatusesForOrderCancelation();

            foreach (OrderStatus status in Enum.GetValues(typeof(OrderStatus)))
            {
                if (!grantedStatusesArray.Contains(status))
                {
                    hiddenStatusesList.Add(status);
                }
            }
            filterOrders.SetAndRefilterAtOnce(x => x.HideStatuses = hiddenStatusesList.Cast <Enum>().ToArray());
            yEForUndeliveredOrder.Changed += (sender, e) => {
                oldOrder       = undelivery.OldOrder;
                lblInfo.Markup = undelivery.GetOldOrderInfo();
                if (undelivery.Id <= 0)
                {
                    undelivery.OldOrderStatus = oldOrder.OrderStatus;
                }
                routeListDoesNotExist = oldOrder != null && (undelivery.OldOrderStatus == OrderStatus.NewOrder ||
                                                             undelivery.OldOrderStatus == OrderStatus.Accepted ||
                                                             undelivery.OldOrderStatus == OrderStatus.WaitForPayment);

                guiltyInUndeliveryView.ConfigureWidget(UoW, undelivery, !routeListDoesNotExist);
                SetSensitivities();
                SetVisibilities();
                GetFines();
                RemoveItemsFromEnums();
            };
            yEForUndeliveredOrder.RepresentationModel = new OrdersVM(filterOrders);
            yEForUndeliveredOrder.Binding.AddBinding(undelivery, x => x.OldOrder, x => x.Subject).InitializeFromSource();
            yEForUndeliveredOrder.CanEditReference = ServicesConfig.CommonServices.CurrentPermissionService.ValidatePresetPermission("can_delete");

            yDateDriverCallTime.Binding.AddBinding(undelivery, t => t.DriverCallTime, w => w.DateOrNull).InitializeFromSource();
            if (undelivery.Id <= 0)
            {
                yDateDriverCallTime.DateOrNull = DateTime.Now;
            }

            yEnumCMBDriverCallPlace.ItemsEnum = typeof(DriverCallType);
            yEnumCMBDriverCallPlace.Binding.AddBinding(undelivery, p => p.DriverCallType, w => w.SelectedItem).InitializeFromSource();

            yDateDispatcherCallTime.Binding.AddBinding(undelivery, t => t.DispatcherCallTime, w => w.DateOrNull).InitializeFromSource();
            if (undelivery.Id <= 0)
            {
                yDateDispatcherCallTime.DateOrNull = DateTime.Now;
            }

            referenceNewDeliverySchedule.ItemsQuery = DeliveryScheduleRepository.AllQuery();
            referenceNewDeliverySchedule.SetObjectDisplayFunc <DeliverySchedule>(e => e.Name);
            referenceNewDeliverySchedule.Binding.AddBinding(undelivery, s => s.NewDeliverySchedule, w => w.Subject).InitializeFromSource();
            referenceNewDeliverySchedule.Sensitive = false;

            SetLabelsAcordingToNewOrder();

            yEnumCMBStatus.ItemsEnum         = typeof(UndeliveryStatus);
            yEnumCMBStatus.SelectedItem      = undelivery.UndeliveryStatus;
            yEnumCMBStatus.EnumItemSelected += (s, e) => {
                SetSensitivities();
                undelivery.SetUndeliveryStatus((UndeliveryStatus)e.SelectedItem);
            };

            yentInProcessAtDepartment.SubjectType = typeof(Subdivision);
            yentInProcessAtDepartment.Binding.AddBinding(undelivery, d => d.InProcessAtDepartment, w => w.Subject).InitializeFromSource();
            yentInProcessAtDepartment.ChangedByUser += (s, e) => {
                undelivery.AddCommentToTheField(
                    UoW,
                    CommentedFields.Reason,
                    String.Format(
                        "сменил(а) \"в работе у отдела\" \nс \"{0}\" на \"{1}\"",
                        InitialProcDepartmentName,
                        undelivery.InProcessAtDepartment.Name
                        )
                    );
            };

            if (undelivery.Id <= 0)
            {
                yentInProcessAtDepartment.Subject = SubdivisionsRepository.GetQCDepartment(UoW);
            }

            refRegisteredBy.RepresentationModel = new EmployeesVM(UoW);
            refRegisteredBy.Binding.AddBinding(undelivery, s => s.EmployeeRegistrator, w => w.Subject).InitializeFromSource();

            yEnumCMBDriverCallPlace.EnumItemSelected += CMBSelectedItemChanged;

            txtReason.Binding.AddBinding(undelivery, u => u.Reason, w => w.Buffer.Text).InitializeFromSource();

            lblInfo.Markup = undelivery.GetOldOrderInfo();

            yenumcomboboxTransferType.ItemsEnum = typeof(TransferType);
            yenumcomboboxTransferType.Binding.AddBinding(undelivery, u => u.OrderTransferType, w => w.SelectedItemOrNull).InitializeFromSource();

            comboProblemSource.SetRenderTextFunc <UndeliveryProblemSource>(k => k.GetFullName);
            comboProblemSource.Binding.AddBinding(undelivery, u => u.ProblemSourceItems, w => w.ItemsList).InitializeFromSource();
            comboProblemSource.Binding.AddBinding(undelivery, u => u.ProblemSource, w => w.SelectedItem).InitializeFromSource();
            comboProblemSource.Sensitive = CanChangeProblemSource;

            yTreeFines.ColumnsConfig = ColumnsConfigFactory.Create <FineItem>()
                                       .AddColumn("Номер").AddTextRenderer(node => node.Fine.Id.ToString())
                                       .AddColumn("Сотудники").AddTextRenderer(node => node.Employee.ShortName)
                                       .AddColumn("Сумма штрафа").AddTextRenderer(node => CurrencyWorks.GetShortCurrencyString(node.Money))
                                       .Finish();

            yenumcomboboxTransferType.Visible = undelivery?.NewOrder != null;

            undelivery.PropertyChanged += (sender, e) => {
                if (e.PropertyName != "NewOrder")
                {
                    return;
                }

                if (undelivery.NewOrder == null)
                {
                    yenumcomboboxTransferType.Visible = false;
                    undelivery.OrderTransferType      = null;
                    return;
                }

                yenumcomboboxTransferType.Visible = true;
            };

            GetFines();
            SetVisibilities();
            SetSensitivities();
        }
Beispiel #16
0
        /// <summary>
        /// Создает новое смс-уведомление для недовоза, если до клиента не дозвонились.
        /// Все равно происходит перенос заказа на следующий день.
        /// </summary>
        /// <param name="undeliveredOrder"></param>
        /// <param name="externalUow">Используется, если надо создать <see cref="UndeliveryNotApprovedSmsNotification"/>
        /// до сохранения самого недовоза в базу</param>
        public void NotifyUndeliveryAutoTransferNotApproved(UndeliveredOrder undeliveredOrder, IUnitOfWork externalUow = null)
        {
            if (!smsNotifierParametersProvider.IsSmsNotificationsEnabled)
            {
                return;
            }

            //необходимые проверки именно НОВОГО заказа
            if (undeliveredOrder.NewOrder == null || undeliveredOrder.NewOrder.Id == 0 ||
                undeliveredOrder.NewOrder.OrderStatus == OrderStatus.NewOrder ||
                !undeliveredOrder.NewOrder.DeliveryDate.HasValue)
            {
                return;
            }
            if (undeliveredOrder.NewOrder.Client.FirstOrder == null ||
                undeliveredOrder.OrderTransferType != TransferType.AutoTransferNotApproved)
            {
                return;
            }

            //проверка уже существующих ранее уведомлений по недовозу
            using (var uow = UnitOfWorkFactory.CreateWithoutRoot())
            {
                var existsNotifications = uow.Session.QueryOver <UndeliveryNotApprovedSmsNotification>()
                                          .Where(x => x.UndeliveredOrder.Id == undeliveredOrder.Id)
                                          .List();
                if (existsNotifications.Any())
                {
                    return;
                }
            }

            //формирование номера мобильного телефона
            var mobilePhoneNumber = GetMobilePhoneNumberForOrder(undeliveredOrder.OldOrder);

            if (string.IsNullOrWhiteSpace(mobilePhoneNumber))
            {
                return;
            }

            //получение текста сообщения
            var msgToSend = smsNotifierParametersProvider.GetUndeliveryAutoTransferNotApprovedTextTemplate();

            //формирование текста сообщения
            //метки для замены в тексте сообщения из базы
            const string deliveryDateVariable = "$delivery_date$";
            const string deliveryTimeVariable = "$delivery_time$";
            //формирование времени доставки и проверка на Null exception
            var orderScheduleTimeString = undeliveredOrder.NewOrder.DeliverySchedule == null
                                ? ""
                                : $"c {undeliveredOrder.NewOrder.DeliverySchedule.From.Hours}-{undeliveredOrder.NewOrder.DeliverySchedule.To.Hours}";

            if (string.IsNullOrWhiteSpace(orderScheduleTimeString))
            {
                return;
            }
            //замена метки на дату доставки
            msgToSend = msgToSend.Replace(deliveryDateVariable, $"{undeliveredOrder.NewOrder.DeliveryDate.Value:dd.MM}");
            //замена метки на время доставки
            msgToSend = msgToSend.Replace(deliveryTimeVariable, $"{orderScheduleTimeString}");

            void FillNotification(UndeliveryNotApprovedSmsNotification notification)
            {
                notification.UndeliveredOrder = undeliveredOrder;
                notification.Counterparty     = undeliveredOrder.NewOrder.Client;
                notification.NotifyTime       = DateTime.Now;
                notification.MobilePhone      = mobilePhoneNumber;
                notification.Status           = SmsNotificationStatus.New;
                notification.MessageText      = msgToSend;
                notification.ExpiredTime      = DateTime.Now.AddMinutes(30);
            }

            //создание нового уведомления для отправки
            if (externalUow != null)
            {
                var notification = new UndeliveryNotApprovedSmsNotification();
                FillNotification(notification);
                externalUow.Save(notification);
                return;
            }

            using (var uow = UnitOfWorkFactory.CreateWithNewRoot <UndeliveryNotApprovedSmsNotification>())
            {
                FillNotification(uow.Root);
                uow.Save();
            }
        }
        private IQueryOver <UndeliveredOrder> GetUndeliveredOrdersQuery(IUnitOfWork uow)
        {
            UndeliveredOrderJournalNode resultAlias           = null;
            UndeliveredOrder            undeliveredOrderAlias = null;

            Domain.Orders.Order oldOrderAlias       = null;
            Domain.Orders.Order newOrderAlias       = null;
            Employee            driverAlias         = null;
            Employee            oldOrderAuthorAlias = null;
            Employee            authorAlias         = null;
            Employee            editorAlias         = null;
            Employee            registratorAlias    = null;
            Nomenclature        nomenclatureAlias   = null;
            OrderItem           orderItemAlias      = null;
            OrderEquipment      orderEquipmentAlias = null;
            Counterparty        counterpartyAlias   = null;
            DeliveryPoint       undeliveredOrderDeliveryPointAlias    = null;
            DeliverySchedule    undeliveredOrderDeliveryScheduleAlias = null;
            DeliverySchedule    newOrderDeliveryScheduleAlias         = null;
            RouteList           routeListAlias             = null;
            RouteListItem       routeListItemAlias         = null;
            Subdivision         subdivisionAlias           = null;
            Fine               fineAlias                   = null;
            FineItem           fineItemAlias               = null;
            Employee           finedEmployeeAlias          = null;
            Subdivision        inProcessAtSubdivisionAlias = null;
            Subdivision        authorSubdivisionAlias      = null;
            GuiltyInUndelivery guiltyInUndeliveryAlias     = null;

            var subqueryDrivers = QueryOver.Of <RouteListItem>(() => routeListItemAlias)
                                  .Where(() => routeListItemAlias.Order.Id == oldOrderAlias.Id)
                                  .Left.JoinQueryOver(i => i.RouteList, () => routeListAlias)
                                  .Left.JoinAlias(i => i.Driver, () => driverAlias)
                                  .Select(
                Projections.SqlFunction(
                    new SQLFunctionTemplate(NHibernateUtil.String,
                                            "GROUP_CONCAT(CONCAT(?1, ' ', LEFT(?2,1),'.',LEFT(?3,1)) ORDER BY ?4 DESC SEPARATOR '\n\t↑\n')"),             //⬆
                    NHibernateUtil.String,
                    Projections.Property(() => driverAlias.LastName),
                    Projections.Property(() => driverAlias.Name),
                    Projections.Property(() => driverAlias.Patronymic),
                    Projections.Property(() => routeListItemAlias.Id)
                    )
                );

            var subquery19LWaterQty = QueryOver.Of <OrderItem>(() => orderItemAlias)
                                      .Where(() => orderItemAlias.Order.Id == oldOrderAlias.Id)
                                      .Left.JoinQueryOver(i => i.Nomenclature, () => nomenclatureAlias)
                                      .Where(n => n.Category == NomenclatureCategory.water && n.TareVolume == TareVolume.Vol19L)
                                      .Select(Projections.Sum(() => orderItemAlias.Count));

            var subqueryGoodsToClient = QueryOver.Of <OrderEquipment>(() => orderEquipmentAlias)
                                        .Where(() => orderEquipmentAlias.Order.Id == oldOrderAlias.Id)
                                        .Where(() => orderEquipmentAlias.Direction == Direction.Deliver)
                                        .Left.JoinQueryOver(i => i.Nomenclature, () => nomenclatureAlias)
                                        .Select(
                Projections.SqlFunction(
                    new SQLFunctionTemplate(NHibernateUtil.String,
                                            "TRIM(GROUP_CONCAT(CONCAT(IF(?1 IS NULL, ?2, ?1),':',?3) SEPARATOR ?4))"),
                    NHibernateUtil.String,
                    Projections.Property(() => nomenclatureAlias.ShortName),
                    Projections.Property(() => nomenclatureAlias.Name),
                    Projections.Property(() => orderEquipmentAlias.Count),
                    Projections.Constant("\n")
                    )
                );

            var subqueryGoodsFromClient = QueryOver.Of <OrderEquipment>(() => orderEquipmentAlias)
                                          .Where(() => orderEquipmentAlias.Order.Id == oldOrderAlias.Id)
                                          .Where(() => orderEquipmentAlias.Direction == Direction.PickUp)
                                          .Left.JoinQueryOver(i => i.Nomenclature, () => nomenclatureAlias)
                                          .Select(
                Projections.SqlFunction(
                    new SQLFunctionTemplate(NHibernateUtil.String,
                                            "TRIM(GROUP_CONCAT(CONCAT(IF(?1 IS NULL, ?2, ?1),':',?3) SEPARATOR ?4))"),
                    NHibernateUtil.String,
                    Projections.Property(() => nomenclatureAlias.ShortName),
                    Projections.Property(() => nomenclatureAlias.Name),
                    Projections.Property(() => orderEquipmentAlias.Count),
                    Projections.Constant("\n")
                    )
                );

            var subqueryGuilty = QueryOver.Of <GuiltyInUndelivery>(() => guiltyInUndeliveryAlias)
                                 .Where(() => undeliveredOrderAlias.Id == guiltyInUndeliveryAlias.UndeliveredOrder.Id)
                                 .Left.JoinQueryOver(g => g.GuiltyDepartment, () => subdivisionAlias)
                                 .Select(
                Projections.SqlFunction(
                    new SQLFunctionTemplate(NHibernateUtil.String,
                                            "GROUP_CONCAT(CONCAT(" +
                                            "CASE ?1 " +
                                            $"WHEN '{nameof(GuiltyTypes.Client)}' THEN 'Клиент' " +
                                            $"WHEN '{nameof(GuiltyTypes.Driver)}' THEN 'Водитель' " +
                                            $"WHEN '{nameof(GuiltyTypes.Department)}' THEN 'Отд' " +
                                            $"WHEN '{nameof(GuiltyTypes.ServiceMan)}' THEN 'Мастер СЦ' " +
                                            $"WHEN '{nameof(GuiltyTypes.ForceMajor)}' THEN 'Форс-мажор' " +
                                            $"WHEN '{nameof(GuiltyTypes.None)}' THEN 'Нет (не недовоз)' " +
                                            "ELSE 'Неизвестно' " +
                                            "END, " +
                                            "IF(?1 = 'Department' AND ?2 = '', ':Неизвестно', " +
                                            "IF(?1 = 'Department' AND ?2 != '', CONCAT(':', ?2), ''))) " +
                                            "SEPARATOR '\n')"),
                    NHibernateUtil.String,
                    Projections.Property(() => guiltyInUndeliveryAlias.GuiltySide),
                    Projections.Property(() => subdivisionAlias.ShortName)
                    )
                );

            var subqueryFined = QueryOver.Of <Fine>(() => fineAlias)
                                .Where(() => fineAlias.UndeliveredOrder.Id == undeliveredOrderAlias.Id)
                                .Left.JoinAlias(() => fineAlias.Items, () => fineItemAlias)
                                .Left.JoinAlias(() => fineItemAlias.Employee, () => finedEmployeeAlias)
                                .Select(
                Projections.SqlFunction(
                    new SQLFunctionTemplate(NHibernateUtil.String, "GROUP_CONCAT(CONCAT_WS(': ', ?1, ?2) SEPARATOR '\n')"),
                    NHibernateUtil.String,
                    Projections.Property(() => finedEmployeeAlias.LastName),
                    Projections.Property(() => fineItemAlias.Money)
                    )
                );

            var query = uow.Session.QueryOver <UndeliveredOrder>(() => undeliveredOrderAlias)
                        .Left.JoinAlias(u => u.OldOrder, () => oldOrderAlias)
                        .Left.JoinAlias(u => u.NewOrder, () => newOrderAlias)
                        .Left.JoinAlias(() => oldOrderAlias.Client, () => counterpartyAlias)
                        .Left.JoinAlias(() => newOrderAlias.DeliverySchedule, () => newOrderDeliveryScheduleAlias)
                        .Left.JoinAlias(() => oldOrderAlias.Author, () => oldOrderAuthorAlias)
                        .Left.JoinAlias(() => oldOrderAlias.DeliveryPoint, () => undeliveredOrderDeliveryPointAlias)
                        .Left.JoinAlias(() => oldOrderAlias.DeliverySchedule, () => undeliveredOrderDeliveryScheduleAlias)
                        .Left.JoinAlias(u => u.Author, () => authorAlias)
                        .Left.JoinAlias(u => u.LastEditor, () => editorAlias)
                        .Left.JoinAlias(u => u.EmployeeRegistrator, () => registratorAlias)
                        .Left.JoinAlias(u => u.InProcessAtDepartment, () => inProcessAtSubdivisionAlias)
                        .Left.JoinAlias(u => u.Author.Subdivision, () => authorSubdivisionAlias)
                        .Left.JoinAlias(() => undeliveredOrderAlias.GuiltyInUndelivery, () => guiltyInUndeliveryAlias)
                        .Left.JoinAlias(() => guiltyInUndeliveryAlias.GuiltyDepartment, () => subdivisionAlias);

            if (FilterViewModel?.RestrictDriver != null)
            {
                var oldOrderIds = _undeliveredOrdersRepository.GetListOfUndeliveryIdsForDriver(UoW, FilterViewModel.RestrictDriver);
                query.Where(() => oldOrderAlias.Id.IsIn(oldOrderIds.ToArray()));
            }

            if (FilterViewModel?.RestrictOldOrder != null)
            {
                query.Where(() => oldOrderAlias.Id == FilterViewModel.RestrictOldOrder.Id);
            }

            if (FilterViewModel?.RestrictClient != null)
            {
                query.Where(() => counterpartyAlias.Id == FilterViewModel.RestrictClient.Id);
            }

            if (FilterViewModel?.RestrictAddress != null)
            {
                query.Where(() => undeliveredOrderDeliveryPointAlias.Id == FilterViewModel.RestrictAddress.Id);
            }

            if (FilterViewModel?.RestrictAuthorSubdivision != null)
            {
                query.Where(() => authorAlias.Subdivision.Id == FilterViewModel.RestrictAuthorSubdivision.Id);
            }

            if (FilterViewModel?.RestrictOldOrderAuthor != null)
            {
                query.Where(() => oldOrderAuthorAlias.Id == FilterViewModel.RestrictOldOrderAuthor.Id);
            }

            if (FilterViewModel?.RestrictOldOrderStartDate != null)
            {
                query.Where(() => oldOrderAlias.DeliveryDate >= FilterViewModel.RestrictOldOrderStartDate);
            }

            if (FilterViewModel?.RestrictOldOrderEndDate != null)
            {
                query.Where(() => oldOrderAlias.DeliveryDate <= FilterViewModel.RestrictOldOrderEndDate.Value.AddDays(1).AddTicks(-1));
            }

            if (FilterViewModel?.RestrictNewOrderStartDate != null)
            {
                query.Where(() => newOrderAlias.DeliveryDate >= FilterViewModel.RestrictNewOrderStartDate);
            }

            if (FilterViewModel?.RestrictNewOrderEndDate != null)
            {
                query.Where(() => newOrderAlias.DeliveryDate <= FilterViewModel.RestrictNewOrderEndDate.Value.AddDays(1).AddTicks(-1));
            }

            if (FilterViewModel?.RestrictGuiltySide != null)
            {
                query.Where(() => guiltyInUndeliveryAlias.GuiltySide == FilterViewModel.RestrictGuiltySide);
            }

            if (FilterViewModel != null && FilterViewModel.RestrictIsProblematicCases)
            {
                query.Where(() => !guiltyInUndeliveryAlias.GuiltySide.IsIn(FilterViewModel.ExcludingGuiltiesForProblematicCases));
            }

            if (FilterViewModel?.RestrictGuiltyDepartment != null)
            {
                query.Where(() => subdivisionAlias.Id == FilterViewModel.RestrictGuiltyDepartment.Id);
            }

            if (FilterViewModel?.RestrictInProcessAtDepartment != null)
            {
                query.Where(u => u.InProcessAtDepartment.Id == FilterViewModel.RestrictInProcessAtDepartment.Id);
            }

            if (FilterViewModel?.NewInvoiceCreated != null)
            {
                if (FilterViewModel.NewInvoiceCreated.Value)
                {
                    query.Where(u => u.NewOrder != null);
                }
                else
                {
                    query.Where(u => u.NewOrder == null);
                }
            }

            if (FilterViewModel?.RestrictUndeliveryStatus != null)
            {
                query.Where(u => u.UndeliveryStatus == FilterViewModel.RestrictUndeliveryStatus);
            }

            if (FilterViewModel?.RestrictUndeliveryAuthor != null)
            {
                query.Where(u => u.Author == FilterViewModel.RestrictUndeliveryAuthor);
            }

            var addressProjection = Projections.SqlFunction(
                new SQLFunctionTemplate(NHibernateUtil.String,
                                        "CONCAT_WS(', ', ?1, CONCAT('д.', ?2), CONCAT('лит.', ?3), CONCAT('кв/оф ', ?4))"),
                NHibernateUtil.String,
                Projections.Property(() => undeliveredOrderDeliveryPointAlias.Street),
                Projections.Property(() => undeliveredOrderDeliveryPointAlias.Building),
                Projections.Property(() => undeliveredOrderDeliveryPointAlias.Letter),
                Projections.Property(() => undeliveredOrderDeliveryPointAlias.Room));

            var oldOrderAuthorProjection = CustomProjections.Concat_WS(" ",
                                                                       () => oldOrderAuthorAlias.LastName, () => oldOrderAuthorAlias.Name, () => oldOrderAuthorAlias.Patronymic);

            var registratorProjection = CustomProjections.Concat_WS(" ",
                                                                    () => registratorAlias.LastName, () => registratorAlias.Name, () => registratorAlias.Patronymic);

            var authorProjection = CustomProjections.Concat_WS(" ",
                                                               () => authorAlias.LastName, () => authorAlias.Name, () => authorAlias.Patronymic);


            query.Where(GetSearchCriterion(
                            () => undeliveredOrderAlias.Id,
                            () => addressProjection,
                            () => counterpartyAlias.Name,
                            () => undeliveredOrderAlias.Reason,
                            () => oldOrderAuthorProjection,
                            () => registratorProjection,
                            () => authorProjection)
                        );

            var itemsQuery = query.SelectList(list => list
                                              .SelectGroup(() => undeliveredOrderAlias.Id).WithAlias(() => resultAlias.Id)
                                              .Select(() => newOrderAlias.Id).WithAlias(() => resultAlias.NewOrderId)
                                              .Select(() => newOrderAlias.DeliveryDate).WithAlias(() => resultAlias.NewOrderDeliveryDate)
                                              .Select(() => newOrderDeliveryScheduleAlias.Name).WithAlias(() => resultAlias.NewOrderDeliverySchedule)
                                              .Select(() => oldOrderAlias.Id).WithAlias(() => resultAlias.OldOrderId)
                                              .Select(() => oldOrderAlias.DeliveryDate).WithAlias(() => resultAlias.OldOrderDeliveryDateTime)
                                              .Select(() => undeliveredOrderAlias.DispatcherCallTime).WithAlias(() => resultAlias.DispatcherCallTime)
                                              .Select(() => undeliveredOrderAlias.DriverCallNr).WithAlias(() => resultAlias.DriverCallNr)
                                              .Select(() => undeliveredOrderAlias.DriverCallTime).WithAlias(() => resultAlias.DriverCallTime)
                                              .Select(() => undeliveredOrderAlias.DriverCallType).WithAlias(() => resultAlias.DriverCallType)
                                              .Select(() => counterpartyAlias.Name).WithAlias(() => resultAlias.Client)
                                              .Select(() => oldOrderAuthorAlias.LastName).WithAlias(() => resultAlias.OldOrderAuthorLastName)
                                              .Select(() => oldOrderAuthorAlias.Name).WithAlias(() => resultAlias.OldOrderAuthorFirstName)
                                              .Select(() => oldOrderAuthorAlias.Patronymic).WithAlias(() => resultAlias.OldOrderAuthorMiddleName)
                                              .Select(() => undeliveredOrderDeliveryScheduleAlias.Name).WithAlias(() => resultAlias.OldDeliverySchedule)
                                              .Select(() => authorAlias.LastName).WithAlias(() => resultAlias.AuthorLastName)
                                              .Select(() => authorAlias.Name).WithAlias(() => resultAlias.AuthorFirstName)
                                              .Select(() => authorAlias.Patronymic).WithAlias(() => resultAlias.AuthorMiddleName)
                                              .Select(() => registratorAlias.LastName).WithAlias(() => resultAlias.RegistratorLastName)
                                              .Select(() => registratorAlias.Name).WithAlias(() => resultAlias.RegistratorFirstName)
                                              .Select(() => registratorAlias.Patronymic).WithAlias(() => resultAlias.RegistratorMiddleName)
                                              .Select(() => editorAlias.LastName).WithAlias(() => resultAlias.EditorLastName)
                                              .Select(() => editorAlias.Name).WithAlias(() => resultAlias.EditorFirstName)
                                              .Select(() => editorAlias.Patronymic).WithAlias(() => resultAlias.EditorMiddleName)
                                              .Select(() => undeliveredOrderAlias.Reason).WithAlias(() => resultAlias.Reason)
                                              .Select(() => undeliveredOrderAlias.UndeliveryStatus).WithAlias(() => resultAlias.UndeliveryStatus)
                                              .Select(() => undeliveredOrderAlias.OldOrderStatus).WithAlias(() => resultAlias.StatusOnOldOrderCancel)
                                              .Select(() => oldOrderAlias.OrderStatus).WithAlias(() => resultAlias.OldOrderCurStatus)
                                              .Select(() => inProcessAtSubdivisionAlias.Name).WithAlias(() => resultAlias.InProcessAt)
                                              .SelectSubQuery(subqueryDrivers).WithAlias(() => resultAlias.OldRouteListDriverName)
                                              .SelectSubQuery(subquery19LWaterQty).WithAlias(() => resultAlias.OldOrder19LBottleQty)
                                              .SelectSubQuery(subqueryGoodsToClient).WithAlias(() => resultAlias.OldOrderGoodsToClient)
                                              .SelectSubQuery(subqueryGoodsFromClient).WithAlias(() => resultAlias.OldOrderGoodsFromClient)
                                              .SelectSubQuery(subqueryFined).WithAlias(() => resultAlias.Fined)
                                              .SelectSubQuery(subqueryGuilty).WithAlias(() => resultAlias.Guilty)
                                              .Select(addressProjection).WithAlias(() => resultAlias.Address)
                                              ).OrderBy(() => oldOrderAlias.DeliveryDate).Asc
                             .TransformUsing(Transformers.AliasToBean <UndeliveredOrderJournalNode>());

            return(itemsQuery);
        }
Beispiel #18
0
        public IList <object[]> GetGuilties(UndeliveredOrdersFilterViewModel filter)
        {
            OrderItem    orderItemAlias    = null;
            Nomenclature nomenclatureAlias = null;

            UndeliveredOrder undeliveredOrderAlias = null;

            Domain.Orders.Order oldOrderAlias       = null;
            Domain.Orders.Order newOrderAlias       = null;
            Employee            oldOrderAuthorAlias = null;
            Counterparty        counterpartyAlias   = null;
            DeliveryPoint       undeliveredOrderDeliveryPointAlias = null;
            Subdivision         subdivisionAlias        = null;
            GuiltyInUndelivery  guiltyInUndeliveryAlias = null;
            Employee            authorAlias             = null;

            var subquery19LWatterQty = QueryOver.Of <OrderItem>(() => orderItemAlias)
                                       .Where(() => orderItemAlias.Order.Id == oldOrderAlias.Id)
                                       .Left.JoinQueryOver(i => i.Nomenclature, () => nomenclatureAlias)
                                       .Where(n => n.Category == NomenclatureCategory.water && n.TareVolume == TareVolume.Vol19L)
                                       .Select(Projections.Sum(() => orderItemAlias.Count));

            var query = _uow.Session.QueryOver <UndeliveredOrder>(() => undeliveredOrderAlias)
                        .Left.JoinAlias(u => u.OldOrder, () => oldOrderAlias)
                        .Left.JoinAlias(u => u.NewOrder, () => newOrderAlias)
                        .Left.JoinAlias(() => oldOrderAlias.Client, () => counterpartyAlias)
                        .Left.JoinAlias(() => oldOrderAlias.Author, () => oldOrderAuthorAlias)
                        .Left.JoinAlias(() => oldOrderAlias.DeliveryPoint, () => undeliveredOrderDeliveryPointAlias)
                        .Left.JoinAlias(() => undeliveredOrderAlias.GuiltyInUndelivery, () => guiltyInUndeliveryAlias)
                        .Left.JoinAlias(() => guiltyInUndeliveryAlias.GuiltyDepartment, () => subdivisionAlias)
                        .Left.JoinAlias(u => u.Author, () => authorAlias);

            if (filter?.RestrictDriver != null)
            {
                var oldOrderIds = _undeliveredOrdersRepository.GetListOfUndeliveryIdsForDriver(_uow, filter.RestrictDriver);
                query.Where(() => oldOrderAlias.Id.IsIn(oldOrderIds.ToArray()));
            }

            if (filter?.RestrictOldOrder != null)
            {
                query.Where(() => oldOrderAlias.Id == filter.RestrictOldOrder.Id);
            }

            if (filter?.RestrictClient != null)
            {
                query.Where(() => counterpartyAlias.Id == filter.RestrictClient.Id);
            }

            if (filter?.RestrictAddress != null)
            {
                query.Where(() => undeliveredOrderDeliveryPointAlias.Id == filter.RestrictAddress.Id);
            }

            if (filter?.RestrictOldOrderAuthor != null)
            {
                query.Where(() => oldOrderAuthorAlias.Id == filter.RestrictOldOrderAuthor.Id);
            }

            if (filter?.RestrictOldOrderStartDate != null)
            {
                query.Where(() => oldOrderAlias.DeliveryDate >= filter.RestrictOldOrderStartDate);
            }

            if (filter?.RestrictOldOrderEndDate != null)
            {
                query.Where(() => oldOrderAlias.DeliveryDate <= filter.RestrictOldOrderEndDate.Value.AddDays(1).AddTicks(-1));
            }

            if (filter?.RestrictNewOrderStartDate != null)
            {
                query.Where(() => newOrderAlias.DeliveryDate >= filter.RestrictNewOrderStartDate);
            }

            if (filter?.RestrictNewOrderEndDate != null)
            {
                query.Where(() => newOrderAlias.DeliveryDate <= filter.RestrictNewOrderEndDate.Value.AddDays(1).AddTicks(-1));
            }

            if (filter?.RestrictGuiltySide != null)
            {
                query.Where(() => guiltyInUndeliveryAlias.GuiltySide == filter.RestrictGuiltySide);
            }

            if (filter != null && filter.RestrictIsProblematicCases)
            {
                query.Where(() => !guiltyInUndeliveryAlias.GuiltySide.IsIn(filter.ExcludingGuiltiesForProblematicCases));
            }

            if (filter?.RestrictGuiltyDepartment != null)
            {
                query.Where(() => subdivisionAlias.Id == filter.RestrictGuiltyDepartment.Id);
            }

            if (filter?.RestrictInProcessAtDepartment != null)
            {
                query.Where(u => u.InProcessAtDepartment.Id == filter.RestrictInProcessAtDepartment.Id);
            }

            if (filter?.NewInvoiceCreated != null)
            {
                if (filter.NewInvoiceCreated.Value)
                {
                    query.Where(u => u.NewOrder != null);
                }
                else
                {
                    query.Where(u => u.NewOrder == null);
                }
            }

            if (filter?.RestrictUndeliveryStatus != null)
            {
                query.Where(u => u.UndeliveryStatus == filter.RestrictUndeliveryStatus);
            }

            if (filter?.RestrictUndeliveryAuthor != null)
            {
                query.Where(u => u.Author == filter.RestrictUndeliveryAuthor);
            }


            if (filter?.RestrictAuthorSubdivision != null)
            {
                query.Where(() => authorAlias.Subdivision.Id == filter.RestrictAuthorSubdivision.Id);
            }

            int position = 0;
            var result   =
                query.SelectList(list => list
                                 .SelectGroup(u => u.Id)
                                 .Select(Projections.SqlFunction(
                                             new SQLFunctionTemplate(
                                                 NHibernateUtil.String,
                                                 "GROUP_CONCAT(" +
                                                 "CASE ?1 " +
                                                 $"WHEN '{nameof(GuiltyTypes.Department)}' THEN IFNULL(CONCAT('Отд: ', ?2), 'Отдел ВВ') " +
                                                 $"WHEN '{nameof(GuiltyTypes.Client)}' THEN 'Клиент' " +
                                                 $"WHEN '{nameof(GuiltyTypes.Driver)}' THEN 'Водитель' " +
                                                 $"WHEN '{nameof(GuiltyTypes.ServiceMan)}' THEN 'Мастер СЦ' " +
                                                 $"WHEN '{nameof(GuiltyTypes.ForceMajor)}' THEN 'Форс-мажор' " +
                                                 $"WHEN '{nameof(GuiltyTypes.None)}' THEN 'Нет (не недовоз)' " +
                                                 "ELSE ?1 " +
                                                 "END ORDER BY ?1 ASC SEPARATOR '\n')"
                                                 ),
                                             NHibernateUtil.String,
                                             Projections.Property(() => guiltyInUndeliveryAlias.GuiltySide),
                                             Projections.Property(() => subdivisionAlias.ShortName)))
                                 .SelectSubQuery(subquery19LWatterQty))
                .List <object[]>()
                .GroupBy(x => x[1])
                .Select(r => new[] { r.Key, r.Count(), position++, r.Sum(x => x[2] == null ? 0 : (decimal)x[2]) })
                .ToList();

            return(result);
        }
        protected override void CreatePopupActions()
        {
            PopupActionsList.Add(
                new JournalAction(
                    "Перейти в недовезённый заказ",
                    selectedItems => true,
                    selectedItems => true,
                    selectedItems =>
            {
                var selectedNodes = selectedItems.OfType <UndeliveredOrderJournalNode>();
                var selectedNode  = selectedNodes.FirstOrDefault();

                if (selectedNode != null)
                {
                    _gtkDlgOpener.OpenOrderDlg(this, selectedNode.OldOrderId);
                }
            }
                    )
                );

            PopupActionsList.Add(
                new JournalAction(
                    "Перейти в новый заказ",
                    selectedItems =>
            {
                var selectedNodes = selectedItems.OfType <UndeliveredOrderJournalNode>();
                var selectedNode  = selectedNodes.FirstOrDefault();

                return(selectedNode != null && selectedNode.NewOrderId > 0);
            },
                    selectedItems => true,
                    selectedItems =>
            {
                var selectedNodes = selectedItems.OfType <UndeliveredOrderJournalNode>();
                var selectedNode  = selectedNodes.FirstOrDefault();

                if (selectedNode != null)
                {
                    _gtkDlgOpener.OpenOrderDlg(this, selectedNode.NewOrderId);
                }
            }
                    )
                );

            PopupActionsList.Add(
                new JournalAction(
                    "Закрыть недовоз",
                    selectedItems =>
            {
                var selectedNodes = selectedItems.OfType <UndeliveredOrderJournalNode>();
                var selectedNode  = selectedNodes.FirstOrDefault();

                return(selectedNode != null && selectedNode.UndeliveryStatus != UndeliveryStatus.Closed && _canCloseUndeliveries);
            },
                    selectedItems => true,
                    selectedItems =>
            {
                var selectedNodes = selectedItems.OfType <UndeliveredOrderJournalNode>();
                var selectedNode  = selectedNodes.FirstOrDefault();

                if (selectedNode == null)
                {
                    return;
                }

                UndeliveredOrder undeliveredOrder = UoW.GetById <UndeliveredOrder>(selectedNode.Id);
                undeliveredOrder.Close(CurrentEmployee);
                UoW.Save(undeliveredOrder);
                UoW.Commit();
            }
                    )
                );

            PopupActionsList.Add(
                new JournalAction(
                    "Создать штраф",
                    selectedItems => true,
                    selectedItems => true,
                    selectedItems =>
            {
                var selectedNodes = selectedItems.OfType <UndeliveredOrderJournalNode>();
                var selectedNode  = selectedNodes.FirstOrDefault();

                if (selectedNode == null)
                {
                    return;
                }

                FineViewModel fineViewModel = new FineViewModel(
                    EntityUoWBuilder.ForCreate(),
                    UnitOfWorkFactory,
                    _undeliveryViewOpener,
                    _employeeService,
                    _driverEmployeeJournalFactory.CreateWorkingDriverEmployeeAutocompleteSelectorFactory(),
                    _employeeSettings,
                    _commonServices
                    );

                var undeliveredOrder           = UoW.GetById <UndeliveredOrder>(selectedNode.Id);
                fineViewModel.UndeliveredOrder = undeliveredOrder;
                fineViewModel.RouteList        = new RouteListItemRepository().GetRouteListItemForOrder(UoW, undeliveredOrder.OldOrder)?.RouteList;
                TabParent.AddSlaveTab(this, fineViewModel);
            }
                    )
                );
        }