public async Task <IList <PayrunInvoice> > GetPackageInvoicesAsync(Guid packageId, PayrunStatus[] payRunStatuses, InvoiceStatus[] invoiceStatuses,
                                                                           PayRunInvoiceFields fields = PayRunInvoiceFields.None, bool trackChanges = false)
        {
            var query = _dbContext.PayrunInvoices.Where(p => p.Invoice.PackageId == packageId && payRunStatuses.Contains(p.Payrun.Status) && invoiceStatuses.Contains(p.InvoiceStatus))
                        .TrackChanges(trackChanges);

            return(await BuildPayRunInvoiceQuery(query, fields)
                   .OrderByDescending(pi => pi.DateCreated)
                   .ToListAsync());
        }
        private static IQueryable <PayrunInvoice> BuildPayRunInvoiceQuery(IQueryable <PayrunInvoice> query, PayRunInvoiceFields fields)
        {
            if (fields.HasFlag(PayRunInvoiceFields.Creator))
            {
                query = query.Include(p => p.Creator);
            }
            if (fields.HasFlag(PayRunInvoiceFields.Updater))
            {
                query = query.Include(p => p.Updater);
            }
            if (fields.HasFlag(PayRunInvoiceFields.Payrun))
            {
                query = query.Include(p => p.Payrun);
            }
            if (fields.HasFlag(PayRunInvoiceFields.Invoice))
            {
                query = query.Include(p => p.Invoice);
            }
            if (fields.HasFlag(PayRunInvoiceFields.InvoiceItems))
            {
                query = query.Include(p => p.Invoice).ThenInclude(i => i.Items);
            }
            if (fields.HasFlag(PayRunInvoiceFields.Package))
            {
                query = query.Include(p => p.Invoice).ThenInclude(i => i.Package);
            }
            if (fields.HasFlag(PayRunInvoiceFields.Supplier))
            {
                query = query.Include(p => p.Invoice).ThenInclude(i => i.Supplier);
            }
            if (fields.HasFlag(PayRunInvoiceFields.ServiceUser))
            {
                query = query.Include(p => p.Invoice).ThenInclude(i => i.ServiceUser);
            }

            return(query);
        }
        public async Task <PagedList <PayrunInvoice> > GetPayRunInvoicesAsync(Guid payRunId, RequestParameters parameters, InvoiceStatus[] statuses, PayRunInvoiceFields fields = PayRunInvoiceFields.None,
                                                                              bool trackChanges = false)
        {
            var query = _dbContext.PayrunInvoices.Where(p => p.PayrunId == payRunId && statuses.Contains(p.InvoiceStatus))
                        .TrackChanges(trackChanges);

            var payRunInvoices = await BuildPayRunInvoiceQuery(query, fields)
                                 .Skip((parameters.PageNumber - 1) * parameters.PageSize)
                                 .Take(parameters.PageSize)
                                 .ToListAsync();

            var invoiceCount = await query.CountAsync();

            return(PagedList <PayrunInvoice> .ToPagedList(payRunInvoices, invoiceCount, parameters.PageNumber,
                                                          parameters.PageSize));
        }
        public async Task <PayrunInvoice> GetPayRunInvoiceAsync(Guid payRunInvoiceId, PayRunInvoiceFields fields = PayRunInvoiceFields.None,
                                                                bool trackChanges = false)
        {
            var query = _dbContext.PayrunInvoices.Where(p => p.Id.Equals(payRunInvoiceId))
                        .TrackChanges(trackChanges);

            return(await BuildPayRunInvoiceQuery(query, fields).SingleOrDefaultAsync());
        }