// CORE function private IEnumerable <InvoiceResident> GetInvoiceResidentData(DateTime startDate, DateTime endDate) { // each resi may have multiple contributors, LA || LA and CC || LA and CC1, CC2 var schedules = this._invoiceDataProvider.GetAllSchedulesForInvoiceDate(startDate, endDate); var residents = this._residentDataProvider .GetResidents() .Where(res => res.ExitDate >= startDate && res.AdmissionDate <= endDate); // create invoiceResident var invResidents = residents.Select(r => { // find their schedules. by LA or CC or LA+CC? var _schedules = schedules.Where(s => s.ResidentId == r.Id); var _invResident = new InvoiceResident(r.Id, $"{r.ForeName} {r.SurName}", _schedules); _invResident.LocalAuthorityId = _schedules.Select(s => s.LocalAuthorityId).FirstOrDefault(); // logger.Info($"Calculate invoice amount {_invResident.Name}"); var residentsWithCalculatedFees = _feeCalculatorService.CalculateFee(_invResident, startDate, endDate); // sum LA total, LA Fee + Supliment Fee(s) // PaymentProviderId = LA=1, CC=2, PV=3 var sumWeekly = residentsWithCalculatedFees.GetSchedules() .Where(s => s.PaymentProviderId == 1).Select(k => k.AmountDue).Sum(); residentsWithCalculatedFees.TotalLaFee = sumWeekly; // get resident weekly fee (LA Fee + CC Fee) var payTypeIds = residentsWithCalculatedFees.GetSchedules().Select(s => s.PaymentTypeId).Distinct(); payTypeIds.ForEach(payId => { if (payId <= 3) // paymentTypeId 1 = La, 2 = CC 3 = Private { var wf = residentsWithCalculatedFees.GetSchedules().Where(s => s.PaymentTypeId == payId).Select(s => s.WeeklyFee).FirstOrDefault(); residentsWithCalculatedFees.ResidentWeeklyFee += wf; } }); // get GrandTotal (all amount dues) residentsWithCalculatedFees.GrandTotal = residentsWithCalculatedFees.GetSchedules() .Select(s => s.AmountDue).Sum(); // order by local auth id residentsWithCalculatedFees.SetSchedules( residentsWithCalculatedFees.GetSchedules().OrderBy(s => s.LocalAuthorityId)); // Added la div names for report purposes residentsWithCalculatedFees.LocalAuthorityName = r.LocalAuthorityName; residentsWithCalculatedFees.CareHomeDivisionId = r.CareHomeDivisionId; residentsWithCalculatedFees.CareHomeDivisionName = r.CareHomeDivisionName; return(residentsWithCalculatedFees); }).ToArray(); var result = invResidents.OrderBy(r => r.Name); return(result); }