public void CalculateBuildingCharge(ChargeBuilding building, IEnumerable <ChargeExpense> expenses) { var items = new List <ChargeItem>(); foreach (var expense in expenses) { var shares = expense.CalculateExpenseShares(building, this, ApartmentId); items.AddRange(shares.Select(s => new ChargeItem { Amount = s.amount, ExpenseId = expense.ExpenseId, PayerId = s.payerId })); } Items = items; }
public IEnumerable <(int payerId, int amount)> CalculateExpenseShares(ChargeBuilding building, Charge charge, int apartmentId) { var intersectionStart = charge.From > From ? charge.From : From; var intersectionEnd = charge.To > To ? To : charge.To; if ((To - From).Days == 0) { throw new InvalidOperationException("Invalid chagre was requested "); } var currentRangeAmount = Amount * (intersectionEnd - intersectionStart).Days / (To - From).Days; var buildingService = new BuildingTimeSpanInfoService(building, From, To); return(Formula.CalculateShares(buildingService, currentRangeAmount, apartmentId)); }
public BuildingTimeSpanInfoService(ChargeBuilding building, DateTime from, DateTime to) { Building = building; From = from; To = to; }