public IList <ClosedComplaintResultNode> GetComplaintsResultsOfCounterparty(IUnitOfWork uow, DateTime?start = null, DateTime?end = null)
        {
            ComplaintResultOfCounterparty resultOfCounterpartyAlias = null;
            ClosedComplaintResultNode     resultAlias = null;

            var query = uow.Session.QueryOver <Complaint>()
                        .Left.JoinAlias(c => c.ComplaintResultOfCounterparty, () => resultOfCounterpartyAlias)
                        .Where(c => c.Status == ComplaintStatuses.Closed);

            AddDateRestriction(start, end, query);

            return(query.SelectList(list => list
                                    .SelectGroup(() => resultOfCounterpartyAlias.Name).WithAlias(() => resultAlias.Name)
                                    .Select(Projections.SqlFunction(
                                                new SQLFunctionTemplate(NHibernateUtil.Int32, "COUNT(IFNULL(?1, 0))"),
                                                NHibernateUtil.Int32,
                                                Projections.Property(() => resultOfCounterpartyAlias.Id))).WithAlias(() => resultAlias.Count))
                   .TransformUsing(Transformers.AliasToBean <ClosedComplaintResultNode>())
                   .List <ClosedComplaintResultNode>());
        }
Beispiel #2
0
        private IList <ComplaintGuiltyNode> GetGuilties(ComplaintFilterViewModel filter)
        {
            Complaint                     complaintAlias              = null;
            Subdivision                   subdivisionAlias            = null;
            Subdivision                   subdivisionForEmployeeAlias = null;
            Employee                      employeeAlias             = null;
            ComplaintGuiltyItem           guiltyItemAlias           = null;
            ComplaintResultOfCounterparty resultOfCounterpartyAlias = null;
            ComplaintResultOfEmployees    resultOfEmployeesAlias    = null;
            QueryNode                     queryNodeAlias            = null;
            ComplaintDiscussion           discussionAlias           = null;

            var query = InfoProvider.UoW.Session.QueryOver(() => guiltyItemAlias)
                        .Left.JoinAlias(() => guiltyItemAlias.Complaint, () => complaintAlias)
                        .Left.JoinAlias(() => complaintAlias.ComplaintResultOfCounterparty, () => resultOfCounterpartyAlias)
                        .Left.JoinAlias(() => complaintAlias.ComplaintResultOfEmployees, () => resultOfEmployeesAlias)
                        .Left.JoinAlias(() => guiltyItemAlias.Subdivision, () => subdivisionAlias)
                        .Left.JoinAlias(() => guiltyItemAlias.Employee, () => employeeAlias)
                        .Left.JoinAlias(() => employeeAlias.Subdivision, () => subdivisionForEmployeeAlias);

            filter.EndDate = filter.EndDate.Date.AddHours(23).AddMinutes(59);
            if (filter.StartDate.HasValue)
            {
                filter.StartDate = filter.StartDate.Value.Date;
            }

            QueryOver <ComplaintDiscussion, ComplaintDiscussion> dicussionQuery = null;

            if (filter.Subdivision != null)
            {
                dicussionQuery = QueryOver.Of(() => discussionAlias)
                                 .Select(Projections.Property <ComplaintDiscussion>(p => p.Id))
                                 .Where(() => discussionAlias.Subdivision.Id == filter.Subdivision.Id)
                                 .And(() => discussionAlias.Complaint.Id == complaintAlias.Id);
            }

            if (filter.StartDate.HasValue)
            {
                switch (filter.FilterDateType)
                {
                case DateFilterType.PlannedCompletionDate:
                    if (dicussionQuery == null)
                    {
                        query = query.Where(() => complaintAlias.PlannedCompletionDate <= filter.EndDate)
                                .And(() => filter.StartDate == null || complaintAlias.PlannedCompletionDate >= filter.StartDate.Value);
                    }
                    else
                    {
                        dicussionQuery = dicussionQuery
                                         .And(() => filter.StartDate == null || discussionAlias.PlannedCompletionDate >= filter.StartDate.Value)
                                         .And(() => discussionAlias.PlannedCompletionDate <= filter.EndDate);
                    }
                    break;

                case DateFilterType.ActualCompletionDate:
                    query = query.Where(() => complaintAlias.ActualCompletionDate <= filter.EndDate)
                            .And(() => filter.StartDate == null || complaintAlias.ActualCompletionDate >= filter.StartDate.Value);
                    break;

                case DateFilterType.CreationDate:
                    query = query.Where(() => complaintAlias.CreationDate <= filter.EndDate)
                            .And(() => filter.StartDate == null || complaintAlias.CreationDate >= filter.StartDate.Value);
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }
            }

            if (dicussionQuery != null)
            {
                query.WithSubquery.WhereExists(dicussionQuery);
            }
            if (filter.ComplaintType != null)
            {
                query = query.Where(() => complaintAlias.ComplaintType == filter.ComplaintType);
            }
            if (filter.ComplaintStatus != null)
            {
                query = query.Where(() => complaintAlias.Status == filter.ComplaintStatus);
            }
            if (filter.Employee != null)
            {
                query = query.Where(() => complaintAlias.CreatedBy.Id == filter.Employee.Id);
            }

            if (filter.GuiltyItemVM?.Entity?.GuiltyType != null)
            {
                var subquery = QueryOver.Of <ComplaintGuiltyItem>()
                               .Where(g => g.GuiltyType == filter.GuiltyItemVM.Entity.GuiltyType.Value);
                switch (filter.GuiltyItemVM.Entity.GuiltyType)
                {
                case ComplaintGuiltyTypes.None:
                case ComplaintGuiltyTypes.Client:
                case ComplaintGuiltyTypes.Depreciation:
                case ComplaintGuiltyTypes.Supplier:
                    break;

                case ComplaintGuiltyTypes.Employee:
                    if (filter.GuiltyItemVM.Entity.Employee != null)
                    {
                        subquery.Where(g => g.Employee.Id == filter.GuiltyItemVM.Entity.Employee.Id);
                    }
                    break;

                case ComplaintGuiltyTypes.Subdivision:
                    if (filter.GuiltyItemVM.Entity.Subdivision != null)
                    {
                        subquery.Where(g => g.Subdivision.Id == filter.GuiltyItemVM.Entity.Subdivision.Id);
                    }
                    break;

                default:
                    break;
                }
                query.WithSubquery.WhereProperty(() => complaintAlias.Id).In(subquery.Select(x => x.Complaint));
            }

            if (filter.ComplaintKind != null)
            {
                query.Where(() => complaintAlias.ComplaintKind.Id == filter.ComplaintKind.Id);
            }

            var result = query.SelectList(list => list
                                          .SelectGroup(c => c.Complaint.Id)
                                          .Select(() => complaintAlias.Status).WithAlias(() => queryNodeAlias.Status)
                                          .Select(() => resultOfCounterpartyAlias.Name).WithAlias(() => queryNodeAlias.ResultOfCounterpartyText)
                                          .Select(() => resultOfEmployeesAlias.Name).WithAlias(() => queryNodeAlias.ResultOfEmployeesText)
                                          .Select(Projections.SqlFunction(
                                                      new SQLFunctionTemplate(
                                                          NHibernateUtil.String,
                                                          "GROUP_CONCAT(" +
                                                          "CASE ?1 " +
                                                          $"WHEN '{nameof(ComplaintGuiltyTypes.Employee)}' THEN IFNULL(CONCAT('Отд: ', ?2), 'Отдел ВВ') " +
                                                          $"WHEN '{nameof(ComplaintGuiltyTypes.Subdivision)}' THEN IFNULL(CONCAT('Отд: ', ?3), 'Отдел ВВ') " +
                                                          $"WHEN '{nameof(ComplaintGuiltyTypes.Client)}' THEN 'Клиент' " +
                                                          $"WHEN '{nameof(ComplaintGuiltyTypes.Depreciation)}' THEN 'Износ' " +
                                                          $"WHEN '{nameof(ComplaintGuiltyTypes.Supplier)}' THEN 'Поставщик' " +
                                                          $"WHEN '{nameof(ComplaintGuiltyTypes.None)}' THEN 'Нет (не рекламация)' " +
                                                          "ELSE ?1 " +
                                                          "END " +
                                                          "ORDER BY ?1 ASC SEPARATOR '\n')"),
                                                      NHibernateUtil.String,
                                                      Projections.Property(() => guiltyItemAlias.GuiltyType),
                                                      Projections.Property(() => subdivisionForEmployeeAlias.Name),
                                                      Projections.Property(() => subdivisionAlias.Name)))
                                          .WithAlias(() => queryNodeAlias.GuiltyName))
                         .TransformUsing(Transformers.AliasToBean <QueryNode>())
                         .List <QueryNode>();

            var groupedResult = result.GroupBy(p => p.GuiltyName, (guiltyName, guiltiesGroup) => new ComplaintGuiltyNode {
                GuiltyName = guiltyName,
                Count      = guiltiesGroup.Count(),
                Guilties   = guiltiesGroup.ToList()
            }).ToList();

            //Удаление дублирующихся названий отделов
            for (int i = 0; i < groupedResult.Count; i++)
            {
                if (groupedResult[i].GuiltyName.Contains("\n"))
                {
                    groupedResult[i].GuiltyName = string.Join("\n", groupedResult[i].GuiltyName.Split('\n').Distinct());
                }
            }

            foreach (var item in groupedResult)
            {
                item.CreateComplaintResultNodes();
            }
            return(groupedResult);
        }