Ejemplo n.º 1
0
        private bool ProcessLevel(Table item, int?assignmentMap, PXResultset <EPAssignmentRoute> routes)
        {
            PXSelectReadonly <EPAssignmentRoute,
                              Where <EPAssignmentRoute.assignmentMapID, Equal <Required <EPAssignmentMap.assignmentMapID> >,
                                     And <EPAssignmentRoute.parent, Equal <Required <EPAssignmentRoute.assignmentRouteID> > > >, OrderBy <Asc <EPAssignmentRoute.sequence> > > rs = new PXSelectReadonly <EPAssignmentRoute, Where <EPAssignmentRoute.assignmentMapID, Equal <Required <EPAssignmentMap.assignmentMapID> >, And <EPAssignmentRoute.parent, Equal <Required <EPAssignmentRoute.assignmentRouteID> > > >, OrderBy <Asc <EPAssignmentRoute.sequence> > >(this);

            foreach (EPAssignmentRoute route in routes)
            {
                if (route.AssignmentRouteID == null)
                {
                    continue;
                }

                path.Add(route.AssignmentRouteID.Value);

                if (IsPassed(item, route))
                {
                    if (route.WorkgroupID != null || route.OwnerID != null || route.OwnerSource != null)
                    {
                        item.WorkgroupID = route.WorkgroupID;
                        item.OwnerID     = null;
                        if (route.OwnerSource != null)
                        {
                            PXGraph graph = processGraph;
                            PXCache cache = graph.Caches[typeof(Table)];
                            string  code  = PXTemplateContentParser.Instance.Process(route.OwnerSource,
                                                                                     graph,
                                                                                     typeof(Table),
                                                                                     null
                                                                                     );
                            EPEmployee emp =
                                PXSelect <EPEmployee, Where <EPEmployee.acctCD, Equal <Required <EPEmployee.acctCD> > > >
                                .SelectWindowed(this, 0, 1, code);

                            item.OwnerID = emp != null ? emp.UserID : GUID.CreateGuid(code);
                        }
                        if (item.OwnerID == null)
                        {
                            item.OwnerID = route.OwnerID;
                        }

                        if (route.UseWorkgroupByOwner == true && item.WorkgroupID != null && item.OwnerID != null)
                        {
                            EPCompanyTreeMember member =
                                PXSelectJoin <EPCompanyTreeMember,
                                              InnerJoin <EPCompanyTreeH, On <EPCompanyTreeH.workGroupID, Equal <EPCompanyTreeMember.workGroupID> >,
                                                         InnerJoin <EPEmployee, On <EPEmployee.userID, Equal <EPCompanyTreeMember.userID> > > >,
                                              Where <EPCompanyTreeH.parentWGID, Equal <Required <EPCompanyTreeH.parentWGID> >,
                                                     And <EPCompanyTreeMember.userID, Equal <Required <EPCompanyTreeMember.userID> > > > >
                                .SelectWindowed(this, 0, 1, item.WorkgroupID, item.OwnerID);

                            if (member != null)
                            {
                                item.WorkgroupID = member.WorkGroupID;
                            }
                        }

                        if (item.WorkgroupID != null && item.OwnerID == null)
                        {
                            EPCompanyTreeMember owner = PXSelectJoin <EPCompanyTreeMember,
                                                                      InnerJoin <EPEmployee, On <EPEmployee.userID, Equal <EPCompanyTreeMember.userID> > >,
                                                                      Where <EPCompanyTreeMember.workGroupID, Equal <Required <EPCompanyTreeMember.workGroupID> >,
                                                                             And <EPCompanyTreeMember.isOwner, Equal <boolTrue> > > > .Select(this, item.WorkgroupID);

                            if (owner != null)
                            {
                                item.OwnerID = owner.UserID;
                            }
                        }

                        PXTrace.WriteInformation(Messages.ProcessRouteSequence, route.Sequence);
                        return(true);
                    }

                    if (route.RouteID != null)
                    {
                        return(!path.Contains(route.RouteID.Value) &&
                               ProcessLevel(item, assignmentMap, PXSelectReadonly <EPAssignmentRoute>
                                            .Search <EPAssignmentRoute.assignmentRouteID>(this, route.RouteID)));
                    }
                    PXResultset <EPAssignmentRoute> result = rs.Select(assignmentMap, route.AssignmentRouteID);
                    return(ProcessLevel(item, assignmentMap, result));
                }
            }

            return(false);
        }
        private IEnumerable <ApproveInfo> ProcessLevel(Table item, int?assignmentMap, PXResultset <EPRule> rules)
        {
            foreach (EPRule rule in rules)
            {
                if (rule.RuleID == null)
                {
                    continue;
                }

                path.Add(rule.RuleID.Value);

                bool isSuccessful  = true;
                var  filteredItems = ExecuteRule(item, rule, ref isSuccessful);


                Guid?OwnerID     = null;
                int? WorkgroupID = rule.WorkgroupID;

                switch (rule.RuleType)
                {
                case EPRuleType.Direct:

                    if (!isSuccessful || (filteredItems != null && filteredItems.Count == 0))
                    {
                        continue;
                    }

                    OwnerID = rule.OwnerID;

                    FillOwnerWorkgroup(ref OwnerID, ref WorkgroupID);

                    if (OwnerID == null && WorkgroupID == null)
                    {
                        continue;
                    }

                    yield return(new ApproveInfo()
                    {
                        OwnerID = OwnerID,
                        WorkgroupID = WorkgroupID,
                        RuleID = rule.RuleID,
                        StepID = rule.StepID,
                        WaitTime = rule.WaitTime
                    });

                    break;

                case EPRuleType.Document:

                    if (rule.OwnerSource == null || (filteredItems != null && filteredItems.Count == 0))
                    {
                        continue;
                    }

                    PXView lineView    = null;
                    PXView primaryView = null;
                    Type   viewType    = null;
                    try
                    {
                        var s        = rule.OwnerSource;
                        var viewName = s.Substring(s.LastIndexOf("(") + 1, s.IndexOf(".") - (s.LastIndexOf("(") + 1));

                        if (String.Equals(viewName, processGraph.PrimaryView, StringComparison.InvariantCultureIgnoreCase))
                        {
                            primaryView = processGraph.Views[viewName];
                            viewType    = primaryView.GetItemType();
                        }
                        else
                        {
                            lineView = processGraph.Views[viewName];
                            viewType = lineView.GetItemType();
                        }
                    }
                    catch (Exception)
                    {
                        // ignored
                    }


                    bool queryContainsDetails = filteredItems != null && filteredItems.Count > 0 && ((PXResult)filteredItems[0])[viewType] != null;

                    var arrayToIterate = queryContainsDetails
                                                        ? filteredItems
                                                        : lineView?.SelectMulti() ?? primaryView.Cache.Current.SingleToList() ?? filteredItems;

                    foreach (object filteredItem in arrayToIterate)
                    {
                        if (filteredItem is PXResult)
                        {
                            var line = ((PXResult)filteredItem)[viewType];
                            processGraph.Caches[viewType].Current = line;
                        }
                        else
                        {
                            processGraph.Caches[viewType].Current = filteredItem;
                        }

                        string code = PXTemplateContentParser.Instance.Process(rule.OwnerSource, processGraph, viewType, null);

                        EPEmployee emp =
                            PXSelect <
                                EPEmployee,
                                Where <EPEmployee.acctCD, Equal <Required <EPEmployee.acctCD> > > >
                            .SelectWindowed(this, 0, 1, code);

                        OwnerID = emp != null ? emp.UserID : GUID.CreateGuid(code);

                        FillOwnerWorkgroup(ref OwnerID, ref WorkgroupID);

                        if (OwnerID == null && WorkgroupID == null)
                        {
                            continue;
                        }

                        yield return(new ApproveInfo()
                        {
                            OwnerID = OwnerID,
                            WorkgroupID = WorkgroupID,
                            RuleID = rule.RuleID,
                            StepID = rule.StepID,
                            WaitTime = rule.WaitTime
                        });
                    }

                    break;

                case EPRuleType.Filter:

                    if (filteredItems == null || filteredItems.Count == 0)
                    {
                        continue;
                    }

                    List <EPRuleBaseCondition> conditions =
                        PXSelectReadonly <EPRuleEmployeeCondition,
                                          Where <EPRuleEmployeeCondition.ruleID, Equal <Required <EPRule.ruleID> > > >
                        .Select(this, rule.RuleID)
                        .Select(_ => (EPRuleBaseCondition)_)
                        .ToList();

                    if (conditions.Count == 0)
                    {
                        break;
                    }

                    foreach (var approveInfo in GetEmployeesByFilter(item, rule, conditions))
                    {
                        yield return(approveInfo);
                    }

                    break;
                }

                if (rule.RuleID != null)
                {
                    if (path.Contains(rule.RuleID.Value))
                    {
                        continue;
                    }

                    foreach (var approveInfo in ProcessLevel(item, assignmentMap, PXSelectReadonly <EPRule> .Search <EPRule.ruleID>(this, rule.RuleID)))
                    {
                        yield return(approveInfo);
                    }
                }

                PXResultset <EPRule> result = PXSelectReadonly <
                    EPRule,
                    Where <
                        EPRule.assignmentMapID, Equal <Required <EPAssignmentMap.assignmentMapID> > >,
                    OrderBy <
                        Asc <EPRule.sequence> > > .Select(this, assignmentMap);

                foreach (var approveInfo in ProcessLevel(item, assignmentMap, result))
                {
                    yield return(approveInfo);
                }
            }
        }