示例#1
0
        // 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);
        }