-- Sp_H_TimeCard_GetReportTimecard 157, 14020901, 14020913 alter proc dbo.Sp_H_TimeCard_GetReportTimecard @Taf_ID bigint , @TarikhAz int , @TarikhEla int as begin --declare @Taf_ID bigint = 157, @TarikhAz int =14020901, @TarikhEla int =14020913 begin try drop table #temppersiancalendar end try begin catch end catch begin try drop table #TempShift end try begin catch end catch begin try drop table #PersenelEnterExit end try begin catch end catch begin try drop table #MinMax end try begin catch end catch begin try drop table #TempQ end try begin catch end catch begin try drop table #TempOpr end try begin catch end catch begin try drop table #tempOverTimeMission end try begin catch end catch ------------------------------------ سلکت روزهای انتخاب شده select * , CAST(0 as int) WG_ID, @Taf_ID Taf_ID into #temppersiancalendar from Finance_Cycle_Detail pc where pc.jdate >= @TarikhAz and pc.jdate <= @TarikhEla -- روزها ------------------------------------ بدست آوردن و آپدیت کردن گروه کاری در بازه --select * update pc set wg_ID = (select pw.WG_ID from PeopleWorkGroup pw where pc.jdate >= pw.StartDate and pc.jdate <= pw.EndDate and pc.Taf_ID = pw.Taf_ID) from #temppersiancalendar pc ------------------------------------ بدست آوردن ایندکس های هر گروه کاری در بازه select ROW_NUMBER() over (order by cd.tarikh) RowNumber, cd.Tarikh JDate, cd.gtarikh Gdate, (DATEDIFF(DAY,wg.TarikhBaseG,cd.gtarikh) % wg.PeriodCirculation)+1 ShiftIndex, pc.WG_ID, pc.Dom_ID_DayOfWeek, pc.Taf_ID into #TempShift from CalendarDetail cd inner join #temppersiancalendar pc on cd.Tarikh = pc.jdate inner join WorkGroup wg on pc.wg_ID = wg.ID order by cd.gtarikh ------------------------------------- بدست آوردن ورود/خروجهای خام اولیه select p.taf_ID, p.tarikh, p.Saat, row_number() over(order by p.taf_ID,p.Tarikh,p.saat) [Row], row_number() over(order by p.taf_ID,p.Tarikh,p.saat) -1 Row_Parent into #PersenelEnterExit from PersenelEnterExit p where p.Tarikh >= @TarikhAz and p.Tarikh <= @TarikhEla order by p.taf_ID,p.Tarikh,p.Saat SELECT MIN([ROW]) RowMin, MAX([ROW]) RowMax, taf_ID, tarikh INTO #MinMax FROM #PersenelEnterExit GROUP BY taf_ID, tarikh; ------------------------------------- منظم کردن و دادن اولویت به ورود/خروجها with Q as ( select p.taf_ID,p.tarikh, p.saat, p.[row],p.[row_parent],1 Priority from #PersenelEnterExit p inner join #MinMax b on p.row = b.RowMin and p.taf_ID = b.taf_ID and p.tarikh = b.tarikh union all select p2.taf_ID,p2.tarikh, p2.saat , p2.[row],p2.[row_parent], q.Priority+1 Priority from #PersenelEnterExit p2 inner join Q on p2.[row_parent] = Q.[row] and p2.taf_ID = q.taf_ID and p2.tarikh = q.tarikh ) select Taf_ID, Tarikh jDate, Saat, Priority into #TempQ from Q order by tarikh,saat ------------------------------------- جمع بندی دیتا و آماده برای محاسبه عملیات select t.*, isnull(Shi.Dom_ID,0) Dom_ID, ---- تعطيل:671; روزکاري: 432 domWeek.Title DayOfWeekString, shi.ID Shift_ID, shi.Title, shi.StartTime, shi.EndTime + case when shi.IsEndTimeInNextDay = 507 then 1440 else 0 end EndTime, opStart.Value StartTimeString, opEnd.Value EndTimeString, cast(0 as int ) Entry1, cast(0 as int ) Exit1, cast(0 as int ) Entry2, cast(0 as int ) Exit2, cast(0 as int ) Entry3, cast(0 as int ) Exit3, cast(0 as int ) Entry4, cast(0 as int ) Exit4, cast(0 as bit ) IsNextDayEntry1, cast(0 as bit ) IsNextDayEntry2, cast(0 as bit ) IsNextDayEntry3, cast(0 as bit ) IsNextDayEntry4, cast(0 as bit ) IsNextDayExit1, cast(0 as bit ) IsNextDayExit2, cast(0 as bit ) IsNextDayExit3, cast(0 as bit ) IsNextDayExit4, cast('' as varchar(6)) EntryString1, cast('' as varchar(6)) ExitString1, cast('' as varchar(6)) EntryString2, cast('' as varchar(6)) ExitString2, cast('' as varchar(6)) EntryString3, cast('' as varchar(6)) ExitString3, cast('' as varchar(6)) EntryString4, cast('' as varchar(6)) ExitString4, -- cast(0 as int) EntryExitCount, -- تعداد ورود/خروج در یک روز cast(0 as bit) InComplete, -- تردد ناقص cast(0 as int ) VacationHourly, -- مرخصی ساعتی cast(0 as int ) VacationDaily, -- مرخصی روزانه cast(0 as int ) OverTimeNormal, -- اضافه کاری عادی cast(0 as int ) OverTimeHoliday, -- اضافه کاری تعطیلی cast(0 as int ) OverTimeMission, -- اضافه کاری ماموریتی cast(0 as int ) OverTimeMissionHoliday, -- اضافه کاری تعطیلی ماموریتی cast(0 as int ) AbsentHourly, -- غیبت ساعتی cast(0 as int ) AbsentDaily, -- غیبت روزانه cast(0 as int ) MissionHourly, -- ماموریت ساعتی cast(0 as int ) MissionDaily, -- ماموریت روزانه cast(0 as int ) SumOverTime, -- جمع اضافه کاری cast(0 as int ) SumPresence, -- جمع حضور cast('' as varchar(6)) VacationHourlyString, -- مرخصی ساعتی cast('' as varchar(6)) VacationDailyString, -- مرخصی روزانه cast('' as varchar(6)) OverTimeNormalString, -- اضافه کاری عادی cast('' as varchar(6)) OverTimeHolidayString, -- اضافه کاری تعطیلی cast('' as varchar(6)) OverTimeMissionString, -- اضافه کاری ماموریتی cast('' as varchar(6)) OverTimeMissionHolidayString, -- اضافه کاری تعطیلی ماموریتی cast('' as varchar(6)) AbsentHourlyString, -- غیبت ساعتی cast('' as varchar(6)) MissionHourlyString, -- ماموریت ساعتی cast('' as varchar(6)) SumOverTimeString, -- جمع اضافه کاری cast('' as varchar(6)) SumPresenceString -- جمع حضور into #TempOpr from #TempShift t inner join ShiftWorkGroup sw on t.wg_ID = sw.WG_ID and T.ShiftIndex = SW.Priority inner join Shift shi on shi.ID = sw.shi_ID inner join Domain dom on dom.ID = shi.Dom_ID --inner join Domain domWeek on domWeek.ID = t.DayOfWeek inner join Domain domWeek on domWeek.ID = t.Dom_ID_DayOfWeek inner join OtherProperties opStart on opStart.Code = shi.StartTime and opStart.Dom_ID = 689 inner join OtherProperties opEnd on opEnd.Code = shi.EndTime and opEnd.Dom_ID = 689 --order by t.jdate ------------------------------------- آپدیت کردن ورود/خروجها به ترتیب اولویت --select * update op set op.Entry1 = isnull(q1.Saat,0), op.Exit1 = isnull(q2.Saat,0), op.Entry2 = isnull(q3.Saat,0), op.Exit2 = isnull(q4.Saat,0), op.Entry3 = isnull(q5.Saat,0), op.Exit3 = isnull(q6.Saat,0), op.Entry4 = isnull(q7.Saat,0), op.Exit4 = isnull(q8.Saat,0) from #TempOpr op left join #TempQ q1 on op.Taf_ID = q1.taf_ID and q1.jDate = op.jDate and q1.Priority = 1 left join #TempQ q2 on op.Taf_ID = q2.taf_ID and q2.jDate = op.jDate and q2.Priority = 2 left join #TempQ q3 on op.Taf_ID = q3.taf_ID and q3.jDate = op.jDate and q3.Priority = 3 left join #TempQ q4 on op.Taf_ID = q4.taf_ID and q4.jDate = op.jDate and q4.Priority = 4 left join #TempQ q5 on op.Taf_ID = q5.taf_ID and q5.jDate = op.jDate and q5.Priority = 5 left join #TempQ q6 on op.Taf_ID = q6.taf_ID and q6.jDate = op.jDate and q6.Priority = 6 left join #TempQ q7 on op.Taf_ID = q7.taf_ID and q7.jDate = op.jDate and q7.Priority = 7 left join #TempQ q8 on op.Taf_ID = q8.taf_ID and q8.jDate = op.jDate and q8.Priority = 8 --------------------------------------------------------------------------------------------------------- آپدیت تعویض شیفت بر اساس پرسنل --select * update t set t.Shift_ID = tc.Shift_ID, t.Dom_ID = shNew.Dom_ID, t.Title = shNew.Title, t.StartTime = shNew.StartTime, t.EndTime = shNew.EndTime + case when shNew.IsEndTimeInNextDay = 507 then 1440 else 0 end from #TempOpr t inner join TimeCardShiftChange tc on t.JDate = tc.Tarikh and tc.taf_ID = t.Taf_ID and tc.dom_ID = 1720 --تعویض شیفت شخص inner join Shift shNew on tc.Shift_ID = shNew.ID --inner join OtherProperties op on op.Code = shNew.StartTime and op.Dom_ID = 689 --------------------------------------------------------------------------------------------------------- آپدیت تعویض شیفت بر اساس گروه کاری --select * update t set t.Shift_ID = tc.Shift_ID, t.Dom_ID = shNew.Dom_ID, t.Title = shNew.Title, t.StartTime = shNew.StartTime, t.EndTime = shNew.EndTime + case when shNew.IsEndTimeInNextDay = 507 then 1440 else 0 end from #TempOpr t inner join TimeCardShiftChange tc on t.JDate = tc.Tarikh and tc.wg_ID = t.wg_ID and tc.dom_ID = 1719 --تعویض شیفت گروه کاری inner join PeopleWorkGroup pwg on tc.wg_ID = pwg.WG_ID and t.Taf_ID = pwg.Taf_ID inner join Shift shNew on tc.Shift_ID = shNew.ID --------------------------------------------------------------------------------------------------------- آپدیت ساعت با فرمت 00:00 شیفت ها update t set t.StartTimeString = op.Value from #TempOpr t inner join Shift shNew on t.Shift_ID = shNew.ID inner join OtherProperties op on op.Code = shNew.StartTime and op.Dom_ID = 689 update t set t.EndTimeString = op.Value from #TempOpr t inner join Shift shNew on t.Shift_ID = shNew.ID inner join OtherProperties op on op.Code = shNew.EndTime and op.Dom_ID = 689 --------------------------------------------------------------------------------------------------------- محاسبه تعداد دفعات ورود/ update t set t.EntryExitCount = isnull((select count(*) from #TempQ q where q.Taf_ID = t.taf_ID and q.jDate = t.jDate),0) from #TempOpr t --------------------------------------------------------------------------------------------------------- محاسبه تردد ناقص update t set t.InComplete = (EntryExitCount % 2) from #TempOpr t --------------------------------------------------------------------------------------------------------- محاسبه جمع حضور update t set t.SumPresence = (t.Exit1-t.Entry1)+(t.Exit2-t.Entry2)+(t.Exit3-t.Entry3)+(t.Exit4-t.Entry4) from #TempOpr t where t.InComplete = 0 --------------------------------------------------------------------------------------------------------- محاسبه مرخصی ساعتی update t set t.VacationHourly = ISNULL((select sum(b.SaatEla-b.SaatAz) from TimeCardActivity b where b.Dom_ID_Noe = 312 /*مرخصي ساعتي*/ and b.Taf_ID = t.taf_ID and b.Tarikh = t.jdate),0) from #TempOpr t where t.InComplete = 0 --------------------------------------------------------------------------------------------------------- محاسبه مرخصی روزانه update t set t.VacationDaily = ISNULL((select count(*) from TimeCardActivity b where b.Dom_ID_Noe = 311 /*مرخصی روزانه*/ and b.Taf_ID = t.taf_ID and b.Tarikh = t.jdate),0) from #TempOpr t where t.InComplete = 0 --------------------------------------------------------------------------------------------------------- محاسبه ماموریت ساعتی update t set t.MissionHourly = ISNULL((select sum(b.SaatEla-b.SaatAz) from TimeCardActivity b where b.Dom_ID_Noe = 309 /*ماموريت ساعتي*/ and b.Taf_ID = t.taf_ID and b.Tarikh = t.jdate),0) from #TempOpr t where t.InComplete = 0 --------------------------------------------------------------------------------------------------------- محاسبه ماموریت روزانه update t set t.MissionDaily = ISNULL((select count(*) from TimeCardActivity b where b.Dom_ID_Noe = 308 /*ماموريت روزانه*/ and b.Taf_ID = t.taf_ID and b.Tarikh = t.jdate),0) from #TempOpr t where t.InComplete = 0 --------------------------------------------------------------------------------------------------------- محاسبه غیبت روزانه update t set t.AbsentDaily = ISNULL(( case when t.InComplete = 1 then 1 /*تردد ناقص*/ when (wg.Dom_ID_IsHolidayOfficialHoliday= 507 /*تعطیلات رسمی، تعطیل در نظر گرفته شود*/ and t.Dom_ID = 671 /*تعطیل*/) then 0 else 1 end ),0) from #TempOpr t inner join WorkGroup wg on t.wg_ID = wg.ID inner join CalendarDetail cd on t.jdate = cd.Tarikh where --t.InComplete = 0 and t.EntryExitCount = 0 /*ورود/خروج نداشته باشد*/ and t.Dom_ID not in (671,1965) /*شیفت تعطیل و آزاد نباشد*/ and t.MissionDaily = 0 and /*ماموریت روزانه*/ t.VacationDaily = 0 /*مرخصی روزانه*/ --------------------------------------------------------------------------------------------------------- محاسبه اضافه کاری -------------------- اگر 1 ورود/خروج باشد update t set t.OverTimeNormal = isnull((select case when t.dom_ID != 671 /*تعطیل*/ and t.Entry1 < t.StartTime and t.Exit1 < t.StartTime then (t.Exit1 - t.Entry1) -- هر دو قبل بازه باشد when t.dom_ID != 671 /*تعطیل*/ and t.Entry1 > t.EndTime and t.Exit1 > t.EndTime then (t.Exit1 - t.Entry1) -- هر دو بعد بازه باشد when t.dom_ID != 671 /*تعطیل*/ and t.Entry1 < t.StartTime and t.Exit1 >= t.StartTime and t.Exit1 <= t.EndTime then (t.StartTime - t.Entry1) -- اولی قبل بازه باشد when t.dom_ID != 671 /*تعطیل*/ and t.Entry1 >= t.StartTime and t.Entry1 <= t.EndTime and t.Exit1 >= t.EndTime then (t.Exit1 - t.EndTime) -- آخری بعد بازه باشد when t.dom_ID != 671 /*تعطیل*/ and t.Entry1 < t.StartTime and t.Exit1 > t.EndTime then (t.StartTime - t.Entry1)+(t.Exit1 - t.EndTime) -- اولی قبل بازه باشد و دومی بعد بازه باشد else 0 end ),0), t.OverTimeHoliday = isnull((select case when t.dom_ID = 671 /*تعطیل*/ and t.Entry1 < t.StartTime and t.Exit1 < t.StartTime then (t.Exit1 - t.Entry1) -- هر دو قبل بازه باشد when t.dom_ID = 671 /*تعطیل*/ and t.Entry1 > t.EndTime and t.Exit1 > t.EndTime then (t.Exit1 - t.Entry1) -- هر دو بعد بازه باشد when t.dom_ID = 671 /*تعطیل*/ and t.Entry1 < t.StartTime and t.Exit1 >= t.StartTime and t.Exit1 <= t.EndTime then (t.StartTime - t.Entry1) -- اولی قبل بازه باشد when t.dom_ID = 671 /*تعطیل*/ and t.Entry1 >= t.StartTime and t.Entry1 <= t.EndTime and t.Exit1 >= t.EndTime then (t.Exit1 - t.EndTime) -- آخری بعد بازه باشد when t.dom_ID = 671 /*تعطیل*/ and t.Entry1 < t.StartTime and t.Exit1 > t.EndTime then (t.StartTime - t.Entry1)+(t.Exit1 - t.EndTime) -- اولی قبل بازه باشد و دومی بعد بازه باشد else 0 end ),0) from #TempOpr t where t.InComplete = 0 and t.EntryExitCount >= 2 and t.Dom_ID != 1965 /*شیفت آزاد*/ ------------------------------ اگر 2 ورود/خروج باشد ------------------------------ ورود/خروج اول در سلکت بالا محاسبه شده است update t set t.OverTimeNormal =t.OverTimeNormal+ isnull((select case when t.dom_ID != 671 /*تعطیل*/ and t.Entry2 < t.StartTime and t.Exit2 < t.StartTime then (t.Exit2 - t.Entry2) -- هر دو قبل بازه باشد when t.dom_ID != 671 /*تعطیل*/ and t.Entry2 > t.EndTime and t.Exit2 > t.EndTime then (t.Exit2 - t.Entry2) -- هر دو بعد بازه باشد when t.dom_ID != 671 /*تعطیل*/ and t.Entry2 < t.StartTime and t.Exit2 >= t.StartTime and t.Exit2 <= t.EndTime then (t.StartTime - t.Entry2) -- ورود دومی قبل بازه باشد when t.dom_ID != 671 /*تعطیل*/ and t.Entry2 >= t.StartTime and t.Entry2 <= t.EndTime and t.Exit2 >= t.EndTime then (t.Exit2 - t.EndTime) -- آخری بعد بازه باشد when t.dom_ID != 671 /*تعطیل*/ and t.Entry2 < t.StartTime and t.Exit2 > t.EndTime then (t.StartTime - t.Entry2)+(t.Exit2 - t.EndTime) -- ورود قبل بازه باشد و خروج بعد بازه باشد else 0 end ),0), t.OverTimeHoliday =t.OverTimeHoliday+ isnull((select case when t.dom_ID = 671 /*تعطیل*/ and t.Entry2 < t.StartTime and t.Exit2 < t.StartTime then (t.Exit2 - t.Entry2) -- هر دو قبل بازه باشد when t.dom_ID = 671 /*تعطیل*/ and t.Entry2 > t.EndTime and t.Exit2 > t.EndTime then (t.Exit2 - t.Entry2) -- هر دو بعد بازه باشد when t.dom_ID = 671 /*تعطیل*/ and t.Entry2 < t.StartTime and t.Exit2 >= t.StartTime and t.Exit2 <= t.EndTime then (t.StartTime - t.Entry2) -- ورود دومی قبل بازه باشد when t.dom_ID = 671 /*تعطیل*/ and t.Entry2 >= t.StartTime and t.Entry2 <= t.EndTime and t.Exit2 >= t.EndTime then (t.Exit2 - t.EndTime) -- آخری بعد بازه باشد when t.dom_ID = 671 /*تعطیل*/ and t.Entry2 < t.StartTime and t.Exit2 > t.EndTime then (t.StartTime - t.Entry2)+(t.Exit2 - t.EndTime) -- ورود دومی قبل بازه باشد و خروج دومی بعد بازه باشد else 0 end ),0) from #TempOpr t where t.InComplete = 0 and t.EntryExitCount >= 4 and t.Dom_ID != 1965 /*شیفت آزاد*/ -------------------- اگر 3 ورود/خروج باشد ------------------------------ ورود/خروج اول و دوم در سلکت های بالا محاسبه شده است update t set t.OverTimeNormal =t.OverTimeNormal+ isnull((select case when t.dom_ID != 671 /*تعطیل*/ and t.Entry3 < t.StartTime and t.Exit3 < t.StartTime then (t.Exit3 - t.Entry3) -- هر دو قبل بازه باشد when t.dom_ID != 671 /*تعطیل*/ and t.Entry3 > t.EndTime and t.Exit3 > t.EndTime then (t.Exit3 - t.Entry3) -- هر دو بعد بازه باشد when t.dom_ID != 671 /*تعطیل*/ and t.Entry3 < t.StartTime and t.Exit3 >= t.StartTime and t.Exit3 <= t.EndTime then (t.StartTime - t.Entry3) -- ورود سومی قبل بازه باشد when t.dom_ID != 671 /*تعطیل*/ and t.Entry3 >= t.StartTime and t.Entry3 <= t.EndTime and t.Exit3 >= t.EndTime then (t.Exit3 - t.EndTime) -- آخری بعد بازه باشد when t.dom_ID != 671 /*تعطیل*/ and t.Entry3 < t.StartTime and t.Exit3 > t.EndTime then (t.StartTime - t.Entry3)+(t.Exit3 - t.EndTime) -- ورود قبل بازه باشد و خروج بعد بازه باشد else 0 end ),0), t.OverTimeHoliday =t.OverTimeHoliday+ isnull((select case when t.dom_ID = 671 /*تعطیل*/ and t.Entry3 < t.StartTime and t.Exit3 < t.StartTime then (t.Exit3 - t.Entry3) -- هر دو قبل بازه باشد when t.dom_ID = 671 /*تعطیل*/ and t.Entry3 > t.EndTime and t.Exit3 > t.EndTime then (t.Exit3 - t.Entry3) -- هر دو بعد بازه باشد when t.dom_ID = 671 /*تعطیل*/ and t.Entry3 < t.StartTime and t.Exit3 >= t.StartTime and t.Exit3 <= t.EndTime then (t.StartTime - t.Entry3) -- ورود سومی قبل بازه باشد when t.dom_ID = 671 /*تعطیل*/ and t.Entry3 >= t.StartTime and t.Entry3 <= t.EndTime and t.Exit3 >= t.EndTime then (t.Exit3 - t.EndTime) -- آخری بعد بازه باشد when t.dom_ID = 671 /*تعطیل*/ and t.Entry3 < t.StartTime and t.Exit3 > t.EndTime then (t.StartTime - t.Entry3)+(t.Exit3 - t.EndTime) -- ورود سومی قبل بازه باشد و خروج سومی بعد بازه باشد else 0 end ),0) from #TempOpr t where t.InComplete = 0 and t.EntryExitCount >= 6 and t.Dom_ID != 1965 /*شیفت آزاد*/ -------------------- اگر 4 ورود/خروج باشد ------------------------------ ورود/خروج اول و دوم و سوم در سلکت های بالا محاسبه شده است update t set t.OverTimeNormal =t.OverTimeNormal+ isnull((select case when t.dom_ID != 671 /*تعطیل*/ and t.Entry4 < t.StartTime and t.Exit4 < t.StartTime then (t.Exit4 - t.Entry4) -- هر دو قبل بازه باشد when t.dom_ID != 671 /*تعطیل*/ and t.Entry4 > t.EndTime and t.Exit4 > t.EndTime then (t.Exit4 - t.Entry4) -- هر دو بعد بازه باشد when t.dom_ID != 671 /*تعطیل*/ and t.Entry4 < t.StartTime and t.Exit4 >= t.StartTime and t.Exit4 <= t.EndTime then (t.StartTime - t.Entry4) -- ورود سومی قبل بازه باشد when t.dom_ID != 671 /*تعطیل*/ and t.Entry4 >= t.StartTime and t.Entry4 <= t.EndTime and t.Exit4 >= t.EndTime then (t.Exit4 - t.EndTime) -- آخری بعد بازه باشد when t.dom_ID != 671 /*تعطیل*/ and t.Entry4 < t.StartTime and t.Exit4 > t.EndTime then (t.StartTime - t.Entry4)+(t.Exit4 - t.EndTime) -- ورود قبل بازه باشد و خروج بعد بازه باشد else 0 end ),0), t.OverTimeHoliday =t.OverTimeHoliday+ isnull((select case when t.dom_ID = 671 /*تعطیل*/ and t.Entry4 < t.StartTime and t.Exit4 < t.StartTime then (t.Exit4 - t.Entry4) -- هر دو قبل بازه باشد when t.dom_ID = 671 /*تعطیل*/ and t.Entry4 > t.EndTime and t.Exit4 > t.EndTime then (t.Exit4 - t.Entry4) -- هر دو بعد بازه باشد when t.dom_ID = 671 /*تعطیل*/ and t.Entry4 < t.StartTime and t.Exit4 >= t.StartTime and t.Exit4 <= t.EndTime then (t.StartTime - t.Entry4) -- ورود سومی قبل بازه باشد when t.dom_ID = 671 /*تعطیل*/ and t.Entry4 >= t.StartTime and t.Entry4 <= t.EndTime and t.Exit4 >= t.EndTime then (t.Exit4 - t.EndTime) -- آخری بعد بازه باشد when t.dom_ID = 671 /*تعطیل*/ and t.Entry4 < t.StartTime and t.Exit4 > t.EndTime then (t.StartTime - t.Entry4)+(t.Exit4 - t.EndTime) -- ورود سومی قبل بازه باشد و خروج سومی بعد بازه باشد else 0 end ),0) from #TempOpr t where t.InComplete = 0 and t.EntryExitCount >= 8 and t.Dom_ID != 1965 /*شیفت آزاد*/ --------------------------------------------------------------------------------------------------------- محاسبه اضافه کار ماموریتی ------------------------- اضافه ماموریت عادی ------------------------------------- محاسبه ماموریت ها در تمپ تیبل select b.Taf_ID, b.Tarikh, ISNULL((SUM( case when b.SaatAzt.EndTime and b.SaatEla>=t.EndTime then b.SaatEla-b.SaatAz -- هر دو بعد بازه باشند when b.SaatAz<=t.StartTime and b.SaatEla>=t.StartTime and b.SaatEla<=t.EndTime then t.StartTime-b.SaatAz -- اولی قبل بازه دومی بین بازه when b.SaatAz>=t.StartTime and b.SaatAz<=t.EndTime and b.SaatEla>=t.EndTime then b.SaatEla-t.EndTime -- اولی بین بازه دومی بعد بازه else 0 end) ),0) val into #tempOverTimeMission from #TempOpr t inner join TimeCardActivity b on b.Taf_ID = t.taf_ID and b.Tarikh = t.jdate and b.Dom_ID_Noe = 309 /*ماموريت ساعتي*/ where t.InComplete = 0 and t.dom_ID not in (671,1965) /*شیفت آزاد , تعطیل*/ group by b.Taf_ID, b.Tarikh update t set t.OverTimeMission = ISNULL((tv.val),0) from #TempOpr t inner join #tempOverTimeMission tv on t.taf_ID = tv.Taf_ID and t.jdate = tv.Tarikh where t.InComplete = 0 and t.dom_ID not in (671,1965) /*شیفت آزاد , تعطیل*/ ------------------------- اضافه ماموریت تعطیلی update t set t.OverTimeMissionHoliday = ISNULL(( select SUM(b.SaatEla-b.SaatAz) from TimeCardActivity b where b.Dom_ID_Noe = 309 /*ماموريت ساعتي*/ and b.Taf_ID = t.taf_ID and b.Tarikh = t.jdate ),0) from #TempOpr t where t.InComplete = 0 and t.dom_ID = 671 /*تعطیل*/ ------------------------- جمع کلیه اضافه کاری ها update t set t.SumOverTime = ISNULL((t.OverTimeNormal+t.OverTimeHoliday+t.OverTimeMission+t.OverTimeMissionHoliday),0) from #TempOpr t where t.InComplete = 0 --------------------------------------------------------------------------------------------------------- محاسبه غیبت ساعتی update t set t.AbsentHourly = ISNULL(((t.SumPresence+t.MissionHourly+t.VacationHourly)-((t.EndTime-t.StartTime)+t.OverTimeNormal+t.OverTimeMission)),0) -- غیبت ساعتی = (جمع حضور + ماموریت ساعتی + مرخصی ساعتی)- (ساعت قانونی کار + اضافه کاری عادی + ماموریت ساعتی اضافه کاری)؛ from #TempOpr t where t.InComplete = 0 and t.VacationDaily = 0 and t.AbsentDaily = 0 /*غیبت روزانه*/ and t.Dom_ID not in (671,1965) /*شیفت آزاد , تعطیل*/ ------------------------------------------------- رکوردهایی که غیبت ساعتی آنها بزرگتر از صفر است اشکال منطقی دارند؛ جهت نشان دادن مغایرت تردد ناقص می کنیم update t set t.InComplete = 0, t.AbsentHourly = 0 from #TempOpr t where t.AbsentHourly > 0 ------------------------------------------------- مثبت کردن تاخیرها update t set t.AbsentHourly = ABS(t.AbsentHourly) from #TempOpr t ------------------------------------------------- آپدیت ساعت های شب کار update t set t.Entry1 = t.Entry1%1440,t.IsNextDayEntry1=CAST(1 as bit) from #TempOpr t where t.Entry1 > 1440 update t set t.Exit1 = t.Exit1%1440,t.IsNextDayExit1=CAST(1 as bit) from #TempOpr t where t.Exit1 > 1440 update t set t.Entry2 = t.Entry2%1440,t.IsNextDayEntry2=CAST(1 as bit) from #TempOpr t where t.Entry2 > 1440 update t set t.Exit2 = t.Exit2%1440,t.IsNextDayExit2=CAST(1 as bit) from #TempOpr t where t.Exit2 > 1440 update t set t.Entry3 = t.Entry3%1440,t.IsNextDayEntry3=CAST(1 as bit) from #TempOpr t where t.Entry3 > 1440 update t set t.Exit3 = t.Exit3%1440,t.IsNextDayExit3=CAST(1 as bit) from #TempOpr t where t.Exit3 > 1440 update t set t.Entry4 = t.Entry4%1440,t.IsNextDayEntry4=CAST(1 as bit) from #TempOpr t where t.Entry4 > 1440 update t set t.Exit4 = t.Exit4%1440,t.IsNextDayExit4=CAST(1 as bit) from #TempOpr t where t.Exit4 > 1440 -------------------------------------------------------------------- آپدیت کردن فرم ساعت --update t set t.StartTimeString = op.Value from #TempOpr t inner join OtherProperties op on op.Code = t.StartTime and op.Dom_ID = 689 and t.StartTime > 0 --update t set t.EndTimeString = op.Value from #TempOpr t inner join OtherProperties op on op.Code = t.EndTime and op.Dom_ID = 689 and t.EndTime > 0 update t set t.EntryString1 = op.Value from #TempOpr t inner join OtherProperties op on op.Code = t.Entry1 and op.Dom_ID = 689 and t.Entry1 > 0 update t set t.ExitString1 = op.Value from #TempOpr t inner join OtherProperties op on op.Code = t.Exit1 and op.Dom_ID = 689 and t.Exit1 > 0 update t set t.EntryString2 = op.Value from #TempOpr t inner join OtherProperties op on op.Code = t.Entry2 and op.Dom_ID = 689 and t.Entry2 > 0 update t set t.ExitString2 = op.Value from #TempOpr t inner join OtherProperties op on op.Code = t.Exit2 and op.Dom_ID = 689 and t.Exit2 > 0 update t set t.EntryString3 = op.Value from #TempOpr t inner join OtherProperties op on op.Code = t.Entry3 and op.Dom_ID = 689 and t.Entry3 > 0 update t set t.ExitString3 = op.Value from #TempOpr t inner join OtherProperties op on op.Code = t.Exit3 and op.Dom_ID = 689 and t.Exit3 > 0 update t set t.EntryString4 = op.Value from #TempOpr t inner join OtherProperties op on op.Code = t.Entry4 and op.Dom_ID = 689 and t.Entry4 > 0 update t set t.ExitString4 = op.Value from #TempOpr t inner join OtherProperties op on op.Code = t.Exit4 and op.Dom_ID = 689 and t.Exit4 > 0 update t set t.VacationHourlyString = op.Value from #TempOpr t inner join OtherProperties op on op.Code = t.VacationHourly and op.Dom_ID = 689 and t.VacationHourly > 0 --update t set t.VacationDailyString = op.Value from #TempOpr t inner join OtherProperties op on op.Code = t.VacationDaily and op.Dom_ID = 689 and t.VacationDaily > 0 update t set t.OverTimeNormalString = op.Value from #TempOpr t inner join OtherProperties op on op.Code = t.OverTimeNormal and op.Dom_ID = 689 and t.OverTimeNormal > 0 update t set t.OverTimeHolidayString = op.Value from #TempOpr t inner join OtherProperties op on op.Code = t.OverTimeHoliday and op.Dom_ID = 689 and t.OverTimeHoliday > 0 update t set t.OverTimeMissionString = op.Value from #TempOpr t inner join OtherProperties op on op.Code = t.OverTimeMission and op.Dom_ID = 689 and t.OverTimeMission > 0 update t set t.OverTimeMissionHolidayString = op.Value from #TempOpr t inner join OtherProperties op on op.Code = t.OverTimeMissionHoliday and op.Dom_ID = 689 and t.OverTimeMissionHoliday > 0 update t set t.AbsentHourlyString = op.Value from #TempOpr t inner join OtherProperties op on op.Code = t.AbsentHourly and op.Dom_ID = 689 and t.AbsentHourly > 0 update t set t.MissionHourlyString = op.Value from #TempOpr t inner join OtherProperties op on op.Code = t.MissionHourly and op.Dom_ID = 689 and t.MissionHourly > 0 update t set t.SumOverTimeString = op.Value from #TempOpr t inner join OtherProperties op on op.Code = t.SumOverTime and op.Dom_ID = 689 and t.SumOverTime > 0 update t set t.SumPresenceString = op.Value from #TempOpr t inner join OtherProperties op on op.Code = t.SumPresence and op.Dom_ID = 689 and t.SumPresence > 0 -------------------------------------------------------------------- select cast(isnull(RowNumber,0) as int) RowNumber, cast(ISNULL(JDate,0) as int) Tarikh , cast(isnull(ShiftIndex,0) as int) ShiftIndex, cast(isnull(WG_ID,0) as int) WG_ID, cast(isnull([Dom_ID_DayOfWeek],0) as int) [DayOfWeek], cast(isnull(Taf_ID,0) as bigint) Taf_ID, cast(isnull(Dom_ID,0) as int) Dom_ID, isnull(DayOfWeekString,'') DayOfWeekString, isnull(Title,'') Title, cast(Shift_ID as int) Shift_ID, cast(isnull(StartTime,0) as int) StartTime, cast(isnull(EndTime,0) as int) EndTime, isnull(StartTimeString,'') StartTimeString, isnull(EndTimeString,'') EndTimeString, cast(isnull(Entry1,0) as int) Entry1, cast(isnull(Exit1,0) as int) Exit1, cast(isnull(Entry2,0) as int) Entry2, cast(isnull(Exit2,0) as int) Exit2, cast(isnull(Entry3,0) as int) Entry3, cast(isnull(Exit3,0) as int) Exit3, cast(isnull(Entry4,0) as int) Entry4, cast(isnull(Exit4,0) as int) Exit4, isnull(EntryString1,'') EntryString1, isnull(ExitString1,'') ExitString1, isnull(EntryString2,'') EntryString2, isnull(ExitString2,'') ExitString2, isnull(EntryString3,'') EntryString3, isnull(ExitString3,'') ExitString3, isnull(EntryString4,'') EntryString4, isnull(ExitString4,'') ExitString4, isnull(IsNextDayEntry1,CAST(0 as bit)) IsNextDayEntry1, isnull(IsNextDayEntry2,CAST(0 as bit)) IsNextDayEntry2, isnull(IsNextDayEntry3,CAST(0 as bit)) IsNextDayEntry3, isnull(IsNextDayEntry4,CAST(0 as bit)) IsNextDayEntry4, isnull(IsNextDayExit1,CAST(0 as bit)) IsNextDayExit1, isnull(IsNextDayExit2,CAST(0 as bit)) IsNextDayExit2, isnull(IsNextDayExit3,CAST(0 as bit)) IsNextDayExit3, isnull(IsNextDayExit4,CAST(0 as bit)) IsNextDayExit4, cast(isnull(EntryExitCount,0) as int) EntryExitCount, cast(isnull(InComplete,0) as int) InComplete, cast(isnull(VacationHourly,0) as int) VacationHourly, cast(isnull(VacationDaily,0) as int) VacationDaily, cast(isnull(OverTimeNormal,0) as int) OverTimeNormal, cast(isnull(OverTimeHoliday,0) as int) OverTimeHoliday, cast(isnull(OverTimeMission,0) as int) OverTimeMission, cast(isnull(OverTimeMissionHoliday,0) as int) OverTimeMissionHoliday, cast(isnull(AbsentHourly,0) as int) AbsentHourly, cast(isnull(AbsentDaily,0) as int) AbsentDaily, cast(isnull(MissionHourly,0) as int) MissionHourly, cast(isnull(MissionDaily,0) as int) MissionDaily, cast(isnull(SumOverTime,0) as int) SumOverTime, cast(isnull(SumPresence,0) as int) SumPresence, isnull(VacationHourlyString,'') VacationHourlyString, isnull(VacationDailyString,'') VacationDailyString, isnull(OverTimeNormalString,'') OverTimeNormalString, isnull(OverTimeHolidayString,'') OverTimeHolidayString, isnull(OverTimeMissionString,'') OverTimeMissionString, isnull(OverTimeMissionHolidayString,'') OverTimeMissionHolidayString, isnull(AbsentHourlyString,'') AbsentHourlyString, isnull(MissionHourlyString,'') MissionHourlyString, isnull(SumOverTimeString,'') SumOverTimeString, isnull(SumPresenceString,'') SumPresenceString from #TempOpr op order by op.jdate end