USE [EnVisage]
GO

ALTER FUNCTION [dbo].[resourceAvailability_f](@StartDate datetime, @EndDate datetime, @Per char(1), @AvailableHours float)

RETURNS @restable TABLE
   (FirstName  varchar(100),
    LastName   varchar(100),
    ExpenditureCategory       varchar(100),
    AvailableHours       float,
    AllocatedHours       float,
    TrainingHours       float,
    VacationHours       float,
    ResourceAvailability       float,
    TeamName	varchar(100),
	TeamId	varchar(36),
	ExpenditureCategoryId varchar(36)
    )
AS
BEGIN
 if (@Per = 1)
  begin
	INSERT INTO @restable
	select vw.FirstName, vw.LastName, vw.Name as ExpenditureCategory, 
	sum(vw.AvailableHours) as AvailableHours, sum(vw.AllocatedHours) as AllocatedHours, 
	sum(vw.TrainingHours) as TrainingHours, sum(vw.VacationHours) as VacationHours,
	sum(vw.AvailableHours)-sum(vw.AllocatedHours)-sum(vw.TrainingHours)-sum(vw.VacationHours) as ResourceAvailability,
	vw.TeamName, vw.teamId, vw.expId
	From(
		select 
		pr.Id,
		ec2.Id as expId,
		t.Id as teamId,
		pr.FirstName,
		pr.LastName,
		ec2.Name, 
		t.Name as TeamName,
		fc.EndDate, 

		((select UOM.UOMValue
		from UOM, ExpenditureCategory ec
		where UOM.Id=ec.UOMId and ec.Id=pr.ExpenditureCategoryId)
		*((cast( ww.Monday as int) + cast(ww.Tuesday as int) +  cast(ww.Wednesday as int) + cast(ww.Thursday as int) + cast(ww.Friday as int) + cast(ww.Saturday as int) + cast(ww.Sunday as int)) /5.0)
		) as AvailableHours, 

		ISNULL((select SUM (pa.Quantity)
		From PeopleResourceAllocation pa
			inner join Scenario s on s.Id = pa.ScenarioId and s.Status = 1
		Where pa.PeopleResourceId=pr.Id and pa.TeamId = pr.TeamId and pa.WeekEndingDate = fc.EndDate), 0) as AllocatedHours,

		ISNULL((select SUM (pt.HoursOff)
		From NonProjectTimeAllocation pt
		Where pt.PeopleResourceId=pr.Id and pt.WeekEndingDate = fc.EndDate), 0) as TrainingHours,

		0 as VacationHours

		from FiscalCalendar fc
			join VW_TeamResource pr on fc.StartDate >= pr.TeamStartDate and fc.EndDate <= pr.TeamEndDate --(not(fc.StartDate > pr.EndDate) and not(fc.EndDate < pr.StartDate))
			join ExpenditureCategory ec2 on ec2.Id=pr.ExpenditureCategoryId
			join WorkWeek ww on ww.Id = pr.WorkWeekId
			join Team t on t.Id = pr.TeamId 
		where  fc.StartDate >= @StartDate  and fc.EndDate <= @EndDate and fc.Type = 0 and
		not pr.Id in (
			select sub.Id from
				(select pr.Id,
				((select UOM.UOMValue * count(fc.Id)
				*((cast( ww.Monday as int) + cast(ww.Tuesday as int) +  cast(ww.Wednesday as int) + cast(ww.Thursday as int) + cast(ww.Friday as int) + cast(ww.Saturday as int) + cast(ww.Sunday as int)) /5.0)
				from UOM, ExpenditureCategory ec, PeopleResource pr1
				join WorkWeek ww on ww.Id = pr1.WorkWeekId
				where UOM.Id=ec.UOMId and ec.Id=pr.ExpenditureCategoryId and pr1.Id = pr.Id)
				-
				ISNULL((select SUM (pa.Quantity)
				From PeopleResourceAllocation pa
					inner join Scenario s on s.Id = pa.ScenarioId and s.Status = 1
				Where pa.PeopleResourceId=pr.Id and pa.TeamId = pr.TeamId and pa.WeekEndingDate >= min(fc.EndDate) and pa.WeekEndingDate <= max(fc.EndDate)), 0)
				-
				ISNULL((select SUM (pt.HoursOff)
				From NonProjectTimeAllocation pt
				Where pt.PeopleResourceId=pr.Id and pt.WeekEndingDate >= min(fc.EndDate) and pt.WeekEndingDate <= max(fc.EndDate)), 0) --as TrainingHours,
				) as AvailableHours

				from FiscalCalendar fc
					join VW_TeamResource pr on fc.StartDate >=pr.TeamStartDate and fc.EndDate <= pr.TeamEndDate
				where  datepart(MONTH,fc.EndDate) >= datepart(MONTH, @StartDate) and datepart(YEAR,fc.EndDate) >= datepart(YEAR, @StartDate) 
				and datepart(MONTH,fc.EndDate) <= datepart(MONTH, @EndDate) and datepart(YEAR,fc.EndDate) <= datepart(YEAR, @EndDate)and fc.Type = 0

				group by datepart(MONTH,fc.EndDate), pr.Id, pr.TeamId, pr.ExpenditureCategoryId, pr.TeamStartDate, pr.TeamEndDate
			)sub where sub.AvailableHours < @AvailableHours	
		)
	) as vw 
	group by vw.Id, vw.expId, vw.teamId, vw.FirstName, vw.LastName, vw.Name, vw.TeamName--, vw.EndDate
  end
  else if(@Per= 2)
  begin
	INSERT INTO @restable

	select 
	vw.FirstName, vw.LastName, vw.Name as ExpenditureCategory, 
	sum(vw.AvailableHours) as AvailableHours, sum(vw.AllocatedHours) as AllocatedHours, 
	sum(vw.TrainingHours) as TrainingHours, sum(vw.VacationHours) as VacationHours,
	sum(vw.AvailableHours)-sum(vw.AllocatedHours)-sum(vw.TrainingHours)-sum(vw.VacationHours) as ResourceAvailability,
	vw.TeamName, vw.teamId, vw.expId
	From(
		select 
		pr.Id,
		ec2.Id as expId,
		t.Id as teamId,
		pr.FirstName,
		pr.LastName,
		ec2.Name, 
		t.Name as TeamName,
		fc.EndDate, 

		((select UOM.UOMValue
		from UOM, ExpenditureCategory ec
		where UOM.Id=ec.UOMId and ec.Id=pr.ExpenditureCategoryId)
		*((cast( ww.Monday as int) + cast(ww.Tuesday as int) +  cast(ww.Wednesday as int) + cast(ww.Thursday as int) + cast(ww.Friday as int) + cast(ww.Saturday as int) + cast(ww.Sunday as int)) /5.0)
		) as AvailableHours, 

		ISNULL((select SUM (pa.Quantity)
		From PeopleResourceAllocation pa
			inner join Scenario s on s.Id = pa.ScenarioId and s.Status = 1
		Where pa.PeopleResourceId=pr.Id and pa.TeamId = pr.TeamId and pa.WeekEndingDate = fc.EndDate), 0) as AllocatedHours,

		ISNULL((select SUM (pt.HoursOff)
		From NonProjectTimeAllocation pt
		Where pt.PeopleResourceId=pr.Id and pt.WeekEndingDate = fc.EndDate), 0) as TrainingHours,

		0 as VacationHours

		from FiscalCalendar fc
			join VW_TeamResource pr on fc.StartDate >= pr.TeamStartDate and fc.EndDate <= pr.TeamEndDate --(not(fc.StartDate > pr.EndDate) and not(fc.EndDate < pr.StartDate))
			join ExpenditureCategory ec2 on ec2.Id=pr.ExpenditureCategoryId
			join WorkWeek ww on ww.Id = pr.WorkWeekId
			join Team t on t.Id = pr.TeamId 
		where  fc.StartDate >= @StartDate  and fc.EndDate <= @EndDate and fc.Type = 0	 and
		not pr.Id in (
			select sub.Id from
				(select 
				pr.Id,
				((select UOM.UOMValue 
				*((cast( ww.Monday as int) + cast(ww.Tuesday as int) +  cast(ww.Wednesday as int) + cast(ww.Thursday as int) + cast(ww.Friday as int) + cast(ww.Saturday as int) + cast(ww.Sunday as int)) /5.0)
				from UOM, ExpenditureCategory ec, PeopleResource pr1
					join WorkWeek ww on ww.Id = pr1.WorkWeekId
				where UOM.Id=ec.UOMId and ec.Id=pr.ExpenditureCategoryId and pr1.Id = pr.Id)
				-
				ISNULL((select SUM (pa.Quantity)
				From PeopleResourceAllocation pa
					inner join Scenario s on s.Id = pa.ScenarioId and s.Status = 1
				Where pa.PeopleResourceId=pr.Id and pa.TeamId = pr.TeamId and pa.WeekEndingDate = fc.EndDate), 0)
				-
				ISNULL((select SUM (pt.HoursOff)
				From NonProjectTimeAllocation pt
				Where pt.PeopleResourceId=pr.Id and pt.WeekEndingDate =fc.EndDate), 0) --as TrainingHours,
				) as AvailableHours

				from FiscalCalendar fc
					join VW_TeamResource pr on fc.StartDate >=pr.TeamStartDate and fc.EndDate <= pr.TeamEndDate
				where  fc.StartDate >= @StartDate  and fc.EndDate <= @EndDate and fc.Type = 0	
			)sub where sub.AvailableHours < @AvailableHours	
		)
	) as vw 
	group by vw.Id, vw.expId, vw.teamId, vw.FirstName, vw.LastName, vw.Name, vw.TeamName--, vw.EndDate
  end
 else
	begin
    INSERT INTO @restable

	select 
	vw.FirstName, vw.LastName, vw.Name as ExpenditureCategory, 
	sum(vw.AvailableHours) as AvailableHours, sum(vw.AllocatedHours) as AllocatedHours, 
	sum(vw.TrainingHours) as TrainingHours, sum(vw.VacationHours) as VacationHours,
	sum(vw.AvailableHours)-sum(vw.AllocatedHours)-sum(vw.TrainingHours)-sum(vw.VacationHours) as ResourceAvailability,
	vw.TeamName, vw.teamId, vw.expId

	From(

	select 
		pr.Id,
		ec2.Id as expId,
		t.Id as teamId,
		pr.FirstName,
		pr.LastName,
		ec2.Name, 
		t.Name as TeamName,
		fc.EndDate, 

		((select UOM.UOMValue
		from UOM, ExpenditureCategory ec
		where UOM.Id=ec.UOMId and ec.Id=pr.ExpenditureCategoryId)
		*((cast( ww.Monday as int) + cast(ww.Tuesday as int) +  cast(ww.Wednesday as int) + cast(ww.Thursday as int) + cast(ww.Friday as int) + cast(ww.Saturday as int) + cast(ww.Sunday as int)) /5.0)
		) as AvailableHours, 

		ISNULL((select SUM (pa.Quantity)
		From PeopleResourceAllocation pa
			inner join Scenario s on s.Id = pa.ScenarioId and s.Status = 1
		Where pa.PeopleResourceId=pr.Id and pa.TeamId = pr.TeamId and pa.WeekEndingDate = fc.EndDate), 0) as AllocatedHours,

		ISNULL((select SUM (pt.HoursOff)
		From NonProjectTimeAllocation pt
		Where pt.PeopleResourceId=pr.Id and pt.WeekEndingDate = fc.EndDate), 0) as TrainingHours,

		0 as VacationHours

		from FiscalCalendar fc
			join VW_TeamResource pr on fc.StartDate >= pr.TeamStartDate and fc.EndDate <= pr.TeamEndDate --(not(fc.StartDate > pr.EndDate) and not(fc.EndDate < pr.StartDate))
			join ExpenditureCategory ec2 on ec2.Id=pr.ExpenditureCategoryId
			join WorkWeek ww on ww.Id = pr.WorkWeekId
			join Team t on t.Id = pr.TeamId 
		where  fc.StartDate >= @StartDate  and fc.EndDate <= @EndDate and fc.Type = 0	
	) as vw 
group by vw.Id, vw.expId, vw.teamId, vw.FirstName, vw.LastName, vw.Name, vw.TeamName, vw.AvailableHours--, vw.EndDate
having (sum(vw.AvailableHours)-sum(vw.AllocatedHours)-sum(vw.TrainingHours)-sum(vw.VacationHours)) > @AvailableHours
end
RETURN  
END 

GO


