private int FindLeavesOverlaps(DateTime fromDate, DateTime toDate, Action <AreaCoverageGaps> actionForArea, Action <IList <EmployesCoverageGaps>, AreaDto, AreaCoverageGaps> actionForEmploye = null, IList <EmployesCoverageGaps> employesCoverageGaps = null, long employeId = -1) { List <AreaDto> areas = employeId > 0 ? _areaService.FindByEmployeId(employeId).ToList() : _areaService.GetAllWithEmploye().ToList(); List <LeaveDto> leaves = _leaveService.GetLeavesRange(fromDate, toDate).ToList(); if (employeId <= 0) { leaves = leaves.Where(l => l.State == LeaveState.Approved).ToList(); } foreach (AreaDto a in areas) { int areaEmployeNumber = a.EmployeList.Count; IList <EmployeBaseDto> employesDto = a.EmployeList; AreaCoverageGaps areaCoverageGaps = new AreaCoverageGaps(a.Description, employesDto, areaEmployeNumber == 1); if (employeId > 0) { areaEmployeNumber--; } IList <DayCoverageGaps> areaLeaveOverlaps = FindLeaveOverlaps(leaves.Where(l => l.Employe.AreaList.Any(ea => ea.Id == a.Id)).ToList(), areaEmployeNumber); areaCoverageGaps.Gaps.AddRange(areaLeaveOverlaps); if (areaCoverageGaps.Gaps.Count > 0 && actionForArea != null) { actionForArea(areaCoverageGaps); } else if (areaCoverageGaps.Gaps.Count > 0 && actionForEmploye != null) { actionForEmploye(employesCoverageGaps, a, areaCoverageGaps); } else { //nothing to do just removing sonar issue } } return(areas.Count); }