Esempio n. 1
0
        public List <Invoice> GetInvoices(
            String searchText,
            InvoiceStatus?status,
            DateTime issueDateFrom,
            DateTime issueDateTo,
            DateTime dueDateFrom,
            DateTime dueDateTo,
            EntityType entityType,
            int entityID,
            String currency,
            int from,
            int count,
            OrderBy orderBy)
        {
            if (_crmSecurity.IsAdmin)
            {
                return(GetCrudeInvoices(
                           searchText,
                           status,
                           issueDateFrom,
                           issueDateTo,
                           dueDateFrom,
                           dueDateTo,
                           entityType,
                           entityID,
                           currency,
                           from,
                           count,
                           orderBy));
            }


            var crudeInvoices = GetCrudeInvoices(
                searchText,
                status,
                issueDateFrom,
                issueDateTo,
                dueDateFrom,
                dueDateTo,
                entityType,
                entityID,
                currency,
                0,
                from + count,
                orderBy);

            if (crudeInvoices.Count == 0)
            {
                return(crudeInvoices);
            }

            if (crudeInvoices.Count < from + count)
            {
                return(_crmSecurity.FilterRead(crudeInvoices).Skip(from).ToList());
            }

            var result = _crmSecurity.FilterRead(crudeInvoices).ToList();

            if (result.Count == crudeInvoices.Count)
            {
                return(result.Skip(from).ToList());
            }

            var localCount = count;
            var localFrom  = from + count;

            while (true)
            {
                crudeInvoices = GetCrudeInvoices(
                    searchText,
                    status,
                    issueDateFrom,
                    issueDateTo,
                    dueDateFrom,
                    dueDateTo,
                    entityType,
                    entityID,
                    currency,
                    localFrom,
                    localCount,
                    orderBy);

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

                result.AddRange(_crmSecurity.FilterRead(crudeInvoices));

                if ((result.Count >= count + from) || (crudeInvoices.Count < localCount))
                {
                    break;
                }

                localFrom += localCount;
                localCount = localCount * 2;
            }

            return(result.Skip(from).Take(count).ToList());
        }