2024-10-14 10:01:49 +06:00
using Ease.Core.DataAccess ;
using Ease.Core.Model ;
using HRM.BO ;
using System ;
using System.Collections.Generic ;
using System.Linq ;
using System.Reflection ;
using System.Text ;
using System.Data ;
using System.Threading ;
using NPOI.SS.Formula.Functions ;
namespace HRM.DA
{
public class AttendanceProcess
{
#region Declaration
//public event System.EventHandler RefreshStatus;
//List<Employee> _employees = null;
//List<MonthlyWorkPlan> _monthlyWorkPlans = null;
List < AttnNationalHoliday > _AttNHolidays = null ;
EnumWorkPlanGroup _empWPtype = EnumWorkPlanGroup . Fixed ;
List < AttnMonthlyBenefit > _atnMonthlyBenifits = null ;
DateTime Attdate = DateTime . MinValue ;
AttnProcessRunSummary _attnRunSummary ;
List < Shift > shifts = null ;
List < Shift > _shifts = null ;
List < Employee > employees = null ;
double _lateHour , _earlyHour , _oTHour ;
Employee employee = null ;
AttnParametarization _AttnParam = null ;
DailyAttnProcess _DailyAttnProcess = null ;
#endregion
#region Private functions
private EnumAttendanceType GetAttnType ( DateTime empInTime , DateTime empOutTime , Shift shift , DateTime attnDate ,
MonthlyWorkPlan empMonthlyWorkPlan )
{
EnumAttendanceType attntype = EnumAttendanceType . Present ;
DateTime shiftInTime = attnDate . Subtract ( attnDate . TimeOfDay ) . Add ( shift . InTime . TimeOfDay ) ;
DateTime shiftOutTime = DateTime . MinValue ;
DateTime shiftOutTimeWithMinimumOT = DateTime . MinValue ;
double _oTHour = 0 ;
if ( shift . InTime < = shift . OutTime )
{
shiftOutTime = attnDate . Subtract ( attnDate . TimeOfDay ) . Add ( shift . OutTime . TimeOfDay ) ;
shiftOutTimeWithMinimumOT = attnDate . Subtract ( attnDate . TimeOfDay ) . Add ( shift . OutTime . TimeOfDay )
. AddMinutes ( shift . MinimumOutOTHour ) ;
}
else
{
shiftOutTime = attnDate . AddDays ( 1 ) . Subtract ( attnDate . TimeOfDay ) . Add ( shift . OutTime . TimeOfDay ) ;
shiftOutTimeWithMinimumOT = attnDate . AddDays ( 1 ) . Subtract ( attnDate . TimeOfDay )
. Add ( shift . OutTime . TimeOfDay ) . AddMinutes ( shift . MinimumOutOTHour ) ;
}
// DateTime shiftInTimeWithLatehour = attnDate.Subtract(attnDate.TimeOfDay).Add(shift.InTime.TimeOfDay).AddMinutes(shift.LateCalcualtion);
if ( empMonthlyWorkPlan . Type ! = EnumWorkPlanDayType . WorkingDay )
{
TimeSpan OTHour = empOutTime . Subtract ( empInTime ) ;
_oTHour = Convert . ToDouble ( OTHour . Hours ) +
( Convert . ToDouble ( OTHour . Minutes ) > = Convert . ToDouble ( shift . MinimumOutOTHour ) ? 1 : 0 ) ;
//For Launch break
if ( _oTHour > 6 )
{
_oTHour = _oTHour - 1 ;
}
OTHour = empOutTime . Subtract ( empOutTime ) ;
// for fixed group employee, night 1 am to 2 pm is rest time, so this one hour will be not included in overtime.
if ( _empWPtype = = EnumWorkPlanGroup . Fixed & & empInTime . Date > empOutTime . Date & & empOutTime . Hour > = 1 & &
empOutTime . Minute > = shift . MinimumOutOTHour )
{
_oTHour = _oTHour - 1 ;
}
if ( empMonthlyWorkPlan . Type = = EnumWorkPlanDayType . NationalHoliday )
{
attntype = EnumAttendanceType . Holiday ;
}
else if ( empMonthlyWorkPlan . Type = = EnumWorkPlanDayType . WeeklyHoliday )
{
attntype = EnumAttendanceType . WeeklyHoliday ;
}
}
else
{
if ( empOutTime > shiftOutTimeWithMinimumOT )
{
TimeSpan OTHour = empOutTime . Subtract ( shiftOutTime ) ;
_oTHour = Convert . ToDouble ( OTHour . Hours ) +
( Convert . ToDouble ( OTHour . Minutes ) > = Convert . ToDouble ( shift . MinimumOutOTHour ) ? 1 : 0 ) ;
}
}
if ( _oTHour < 0 ) _oTHour = 0 ;
return attntype ;
}
private void CalcullateWorkdayType ( DailyAttnProcess attnProcess , EmployeeWorkPlanSetup oEmpWorkplan ,
WorkPlanGroup oEmpWPlanGroup , int payrollTypeID )
{
//List<ShiftRotation> oShiftRotations = null;
//oShiftRotations = ShiftRotation.Get(oEmpWPlanGroup.Type);
attnProcess . WorkDayType = EnumWorkPlanDayType . WorkingDay ;
if ( _AttNHolidays = = null )
{
DateTime oLastDate = attnProcess . AttnDate . LastDateOfMonth ( ) ;
DateTime oFirstDate = attnProcess . AttnDate . FirstDateOfMonth ( ) ;
_AttNHolidays =
new AttnNationalHolidayService ( ) . GetByMonthAndPayrollType ( oFirstDate , oLastDate , payrollTypeID ) ;
}
AttnNationalHoliday oAttNHoliday = _AttNHolidays . Where ( o = >
attnProcess . AttnDate . Date > = o . FromDate . Date & & attnProcess . AttnDate . Date < = o . ToDate . Date )
. FirstOrDefault ( ) ;
if ( oAttNHoliday ! = null )
{
attnProcess . WorkDayType = EnumWorkPlanDayType . NationalHoliday ;
attnProcess . ReferenceID = oAttNHoliday . ID ;
return ;
}
if ( oEmpWPlanGroup . Type = = EnumWorkPlanGroup . Fixed )
{
if ( ( oEmpWorkplan . WeekEndOn ! = null & & attnProcess . AttnDate . DayOfWeek = = ( DayOfWeek ) oEmpWorkplan . WeekEndOn )
| | ( oEmpWorkplan . WeekEndOn2 ! = null & & attnProcess . AttnDate . DayOfWeek = = ( DayOfWeek ) oEmpWorkplan . WeekEndOn2 ) )
{
attnProcess . WorkDayType = EnumWorkPlanDayType . WeeklyHoliday ;
}
}
else
{
if ( oEmpWorkplan . WeekEndOn ! = null )
{
if ( attnProcess . AttnDate . DayOfWeek = = ( DayOfWeek ) oEmpWorkplan . WeekEndOn )
//if (attnProcess.AttnDate.DayOfWeek == (DayOfWeek)(((int)oEmpWorkplan.WeekEndOn + 1) % 7))
{
DayOfWeek DayOfWeekValue = ( DayOfWeek ) ( ( ( int ) oEmpWorkplan . WeekEndOn + 1 ) % 7 ) ;
attnProcess . WorkDayType = EnumWorkPlanDayType . WeeklyHoliday ;
}
}
//if ((oEmpWorkplan.HolidayOne != null &&
// attnProcess.AttnDate.DayOfWeek == (DayOfWeek)oEmpWorkplan.HolidayOne)
// || (oEmpWorkplan.HolidayTwo != null &&
// attnProcess.AttnDate.DayOfWeek == (DayOfWeek)oEmpWorkplan.HolidayTwo))
//{
// if (attnProcess.AttnDate.DayOfWeek == (DayOfWeek)oEmpWorkplan.HolidayOne)
// {
// attnProcess.WorkDayType = EnumWorkPlanDayType.WeeklyHoliday;
// }
//}
else
{
attnProcess . WorkDayType = AutoRotationHolidayCalc ( oEmpWorkplan , attnProcess . AttnDate ) ;
//if (attnProcess.AttnDate >= oEmpWorkplan.CreatedDate)
//{
// int nShiftInterval = 7;
// TimeSpan st = attnProcess.AttnDate - oEmpWorkplan.CreatedDate;
// int dayCount = st.Days;
// int nCircleDay = (dayCount % nShiftInterval);
// if ((nShiftInterval - nCircleDay - 1) == 0)
// {
// attnProcess.WorkDayType = EnumWorkPlanDayType.WeeklyHoliday;
// }
//}
}
}
}
public static EnumWorkPlanDayType AutoRotationHolidayCalc ( EmployeeWorkPlanSetup oEmpWorkplan , DateTime targetDate )
{
EnumWorkPlanDayType oEnumWPDayType = EnumWorkPlanDayType . WorkingDay ;
if ( targetDate > = oEmpWorkplan . StartDate )
{
int nShiftInterval = 7 ;
TimeSpan st = targetDate - oEmpWorkplan . StartDate ;
int dayCount = st . Days ;
int nCircleDay = ( dayCount % nShiftInterval ) ;
if ( ( nShiftInterval - nCircleDay - 1 ) = = 0 )
{
oEnumWPDayType = EnumWorkPlanDayType . WeeklyHoliday ;
}
}
return oEnumWPDayType ;
}
//private void CalcullateOT(DailyAttnProcess attnProcess, Shift oshift, DateTime Attdate)
//{
// attnProcess.OTHour = 0;
// DateTime actualInTime = (DateTime)attnProcess.InTime;
// DateTime actualOutTime = (DateTime)attnProcess.OutTime;
// DateTime shiftInTime = ((DateTime)attnProcess.InTime).Date.Add(oshift.InTime.TimeOfDay);
// DateTime shiftOutTime = ((DateTime)attnProcess.InTime).Date.Add(oshift.OutTime.TimeOfDay);
// if (shiftOutTime < shiftInTime)
// {
// shiftOutTime = shiftOutTime.AddDays(1);
// }
// double standardHourWorked = shiftOutTime.Subtract(shiftInTime).TotalHours;
// double actualHourWorked = actualOutTime.Subtract(actualInTime).TotalHours;
// if (attnProcess.WorkDayType == EnumWorkPlanDayType.WorkingDay)
// {
// if (actualHourWorked > standardHourWorked)
// {
// double minutesBeforeShiftTime = 0;
// double minutesAfterShiftTime = 0;
// double inOTMinutes, outOTMinutes;
// inOTMinutes = outOTMinutes = 0;
// if (actualInTime < shiftInTime)
// {
// minutesBeforeShiftTime = shiftInTime.Subtract(actualInTime).TotalMinutes;
// var minimumOtInMinutes = oshift.MinimumInOTHour;
// if (minutesBeforeShiftTime > minimumOtInMinutes)
// {
// inOTMinutes = minutesBeforeShiftTime;
// }
// }
// if ((actualHourWorked * 60.0) - (standardHourWorked * 60.0) > minutesBeforeShiftTime)
// {
// minutesAfterShiftTime = (actualHourWorked * 60.0) - (standardHourWorked * 60.0) -
// minutesBeforeShiftTime;
// var minimumOtOutMinutes = oshift.MinimumOutOTHour;
// if (minutesAfterShiftTime > minimumOtOutMinutes)
// {
// outOTMinutes = minutesAfterShiftTime;
// }
// }
// if (inOTMinutes + outOTMinutes > 0)
// {
// attnProcess.OTHour = (inOTMinutes + outOTMinutes) / 60.0;
// }
// }
// }
// else
// {
// //For Launch break
// if (actualHourWorked > 6 && oshift.LunchHour > 0)
// {
// actualHourWorked -= (oshift.LunchHour / 60.0);
// }
// attnProcess.OTHour = actualHourWorked;
// }
// if (attnProcess.OTHour < 0)
// {
// attnProcess.OTHour = 0;
// }
//}
private void CalcullateOT ( bool isOtEligible , DailyAttnProcess attnProcess , Shift oshift , DateTime Attdate )
{
// all in one
attnProcess . OTHour = 0 ;
// it will calculate total working hour
if ( attnProcess . InTime ! = null & & attnProcess . OutTime ! = null )
{
attnProcess . OTHour = 0 ;
DateTime actualInTime = ( DateTime ) attnProcess . InTime ;
DateTime actualOutTime = ( DateTime ) attnProcess . OutTime ;
DateTime shiftInTime = ( ( DateTime ) attnProcess . InTime ) . Date . Add ( oshift . InTime . TimeOfDay ) ;
DateTime shiftOutTime = ( ( DateTime ) attnProcess . InTime ) . Date . Add ( oshift . OutTime . TimeOfDay ) ;
if ( shiftOutTime < shiftInTime )
{
shiftOutTime = shiftOutTime . AddDays ( 1 ) ;
}
double standardHourWorked = shiftOutTime . Subtract ( shiftInTime ) . TotalHours ;
double actualHourWorked = actualOutTime . Subtract ( actualInTime ) . TotalHours ;
if ( isOtEligible )
{
if ( attnProcess . WorkDayType = = EnumWorkPlanDayType . WorkingDay )
{
#region working day
double minutesBeforeShiftTime = 0 ;
double minutesAfterShiftTime = 0 ;
double inOTMinutes , outOTMinutes ;
inOTMinutes = outOTMinutes = 0 ;
if ( actualInTime < shiftInTime )
{
minutesBeforeShiftTime = shiftInTime . Subtract ( actualInTime ) . TotalMinutes ;
var minimumOtInMinutes = oshift . MinimumInOTHour ;
if ( minutesBeforeShiftTime > minimumOtInMinutes )
{
inOTMinutes = minutesBeforeShiftTime ;
}
}
if ( shiftOutTime < actualOutTime )
{
minutesAfterShiftTime = actualOutTime . Subtract ( shiftOutTime ) . TotalMinutes ;
var minimumOtOutMinutes = oshift . MinimumOutOTHour ;
if ( minutesAfterShiftTime > minimumOtOutMinutes )
{
outOTMinutes = minutesAfterShiftTime ;
}
}
if ( inOTMinutes + outOTMinutes > 0 )
{
attnProcess . OTHour = ( inOTMinutes + outOTMinutes ) ;
attnProcess . OTHour = Math . Round ( Math . Floor ( attnProcess . OTHour / 60 ) +
( ( attnProcess . OTHour % 60 ) / 100 ) , 2 ) ;
}
#endregion working day
}
else
{
double tempactualHourWorked = actualOutTime . Subtract ( actualInTime ) . TotalHours ;
actualHourWorked - = oshift . LunchHour ;
attnProcess . OTHour = Math . Round ( Math . Floor ( actualHourWorked / 60 ) +
( ( actualHourWorked % 60 ) / 100 ) , 2 ) ;
}
if ( attnProcess . OTHour < 0 )
attnProcess . OTHour = 0 ;
}
}
//only for lifung
attnProcess . OTHour = 0 ;
if ( attnProcess . WorkHour > 8 ) attnProcess . OTHour = Math . Round ( attnProcess . WorkHour - 8 , 2 ) ;
}
private void CalcullateOTEchoTex ( bool isOtEligible , DailyAttnProcess attnProcess , Shift oshift , DateTime Attdate , bool _IsOTFractionate )
{
double _oTHour = 0 ;
attnProcess . OTHour = 0 ;
if ( isOtEligible = = false | | ( attnProcess . InTime = = DateTime . MinValue | | attnProcess . InTime = = null ) | | ( attnProcess . OutTime = = DateTime . MinValue | | attnProcess . OutTime = = null ) )
{
return ;
}
DateTime shiftInTime = ( DateTime ) attnProcess . InTime ;
DateTime originalShiftInTime = Attdate . Subtract ( Attdate . TimeOfDay ) . Add ( oshift . InTime . TimeOfDay ) ;
// if anyone comes early than shift time
// then that will not be considderred in OT
if ( originalShiftInTime > shiftInTime )
{
shiftInTime = originalShiftInTime ;
}
DateTime shiftOutTime = ( DateTime ) attnProcess . OutTime ;
DateTime originalShiftOutTime = DateTime . MinValue ;
TimeSpan shiftTimeDifference = new TimeSpan ( 0 ) ;
TimeSpan shiftTotalTimeWithMinimumOT = new TimeSpan ( 0 ) ;
if ( oshift . InTime . TimeOfDay > oshift . OutTime . TimeOfDay )
{
originalShiftOutTime = originalShiftInTime . Date . AddDays ( 1 ) . Add ( oshift . OutTime . TimeOfDay ) ;
}
else
{
originalShiftOutTime = originalShiftInTime . Date . Add ( oshift . OutTime . TimeOfDay ) ;
}
shiftTimeDifference = originalShiftOutTime - originalShiftInTime ;
shiftTotalTimeWithMinimumOT = shiftTimeDifference . Add ( TimeSpan . FromMinutes ( oshift . MinimumOTHour ) ) ;
TimeSpan OTHour = TimeSpan . FromHours ( 0 ) ;
if ( attnProcess . WorkDayType ! = EnumWorkPlanDayType . WorkingDay )
{
OTHour = attnProcess . OutTime . Value . Subtract ( ( DateTime ) attnProcess . InTime ) ;
}
else
{
if ( shiftOutTime . Subtract ( shiftInTime ) . TotalHours > shiftTotalTimeWithMinimumOT . TotalHours )
{
OTHour = shiftOutTime . Subtract ( shiftInTime ) - shiftTimeDifference ;
}
}
// Normal OT Calcullation
//_oTHour = Convert.ToDouble(OTHour.Hours) + (Convert.ToDouble(OTHour.Minutes) >= Convert.ToDouble(oshift.MinimumOTHour) ?
// (_IsOTFractionate? (Convert.ToDouble(OTHour.Minutes)/60) : 1)
// : 0);
// Echo OT Calcullation
_oTHour = OTHour . Hours ;
if ( Convert . ToDouble ( OTHour . Minutes ) > = Convert . ToDouble ( oshift . MinimumOTHour ) )
{
if ( _IsOTFractionate )
{
_oTHour + = ( 60 - Convert . ToDouble ( oshift . MinimumOTHour ) ) > Convert . ToDouble ( OTHour . Minutes ) ? ( Convert . ToDouble ( OTHour . Minutes ) / 60 ) : 1 ;
}
else
{
_oTHour + = 1 ;
}
}
// Echo OT Calcullation End
if ( _oTHour < 0 ) _oTHour = 0 ;
attnProcess . OTHour = _oTHour ;
}
#endregion
public void MobileDataThreadProcess ( List < AttnMobileRawData > offlineData )
{
if ( offlineData = = null | | offlineData . Count = = 0 )
return ;
var Groupdate =
from dateGroup in offlineData
group dateGroup by dateGroup . AttnDate ;
Employee oemp = new EmployeeService ( ) . Get ( offlineData [ 0 ] . EmpID ) ;
List < Employee > emps = new List < Employee > ( ) ;
emps . Add ( oemp ) ;
User ouser = new UserService ( ) . Get ( oemp . EmployeeNo ) ;
foreach ( var item in Groupdate )
{
Thread myNewThread = new Thread ( ( ) = > Process ( item . Key ,
EnumProcessMode . Auto , oemp . PayrollTypeID , ouser . ID , emps ) ) ;
myNewThread . Start ( ) ;
}
//Thread myNewThread = new Thread(() => SendMail(oTran));
//myNewThread.Start();
}
#region Public Functions
public void Process ( DateTime ProcessDate , EnumProcessMode prMode , int payrollTypeID , int processUserID )
{
DateTime endDate = DateTime . Today . Date ;
List < Employee > emp = new EmployeeService ( ) . Get ( EnumEmployeeStatus . Regardless , payrollTypeID ) ;
_shifts = new ShiftService ( ) . GetAllShift ( ) ;
for ( DateTime currentDate = ProcessDate ; currentDate < = endDate ; currentDate = currentDate . AddDays ( 1 ) )
{
Process ( currentDate , EnumProcessMode . Auto , payrollTypeID , processUserID , emp ) ;
}
}
public void Process ( DateTime fromDate , EnumProcessMode prMode , int payrollTypeID , int processUserID , List < Employee > emps )
{
bool isEchoTex = new SystemConfigarationService ( ) . GetconfigBooleanValue ( EnumConfigurationType . Logic , "attendence" , "echotexprocess" ) ;
if ( isEchoTex = = true )
{
echoTexProcess ( fromDate , prMode , payrollTypeID , processUserID , emps ) ;
return ;
}
_attnRunSummary = new AttnProcessRunSummary ( ) ;
_attnRunSummary . ProcessMode = prMode ;
2025-03-24 14:29:03 +06:00
//bool isInOutApplicable = false;
2024-10-14 10:01:49 +06:00
_shifts = _shifts ? ? new ShiftService ( ) . GetAllShift ( ) ;
string msg = "" ;
try
{
#region Initialization for Attendence Process
Attdate = fromDate ;
2025-03-24 14:29:03 +06:00
//isInOutApplicable = new SystemConfigarationService().GetconfigBooleanValue(EnumConfigurationType.Logic, "attendence", "inoutapplicable");
2024-10-14 10:01:49 +06:00
List < DailyAttnProcess > dailyattProcesses = new List < DailyAttnProcess > ( ) ;
List < DailyAttendanceAllowance > dailyAttendanceAllowances = new List < DailyAttendanceAllowance > ( ) ;
List < EmpFieldTrack > oEmpFieldTracks = new List < EmpFieldTrack > ( ) ;
DateTime startTime = new DateTime ( Attdate . Year , Attdate . Month , Attdate . Day , 5 , 20 , 0 ) ;
DateTime ToTime = Attdate . AddDays ( 1 ) ;
ToTime = new DateTime ( ToTime . Year , ToTime . Month , ToTime . Day , 10 , 0 , 0 ) ;
LeaveEntry empLeaveEntry = null ;
List < ActingResponsibilitySetup > _tempraryShifts = new ActingResponsibilitySetupService ( ) . GetTemporaryShiftEmployee ( Attdate ) ;
List < EmployeeWorkPlanSetup > empWPGroups = new EmployeeWorkPlanSetupService ( ) . Get ( ) ;
List < DailyAttnProcess > manualAttnProcesses = null ;
List < SearchEmployee > _employees = emps ! = null ? Employee . getSearchEmp ( emps ) : null ;
if ( emps = = null | | emps . Count = = 0 )
{
SearchManager omg = new SearchManager ( ) ;
omg . SearchFrom = EnumSearchFrom . Employee ;
omg . Parameter . AddDefaultParameter ( payrollTypeID , EnumEmployeeStatus . Live ) ;
omg . Parameter . Add ( EnumSearchParameter . JoiningDate , EnumSQLOperator . SmallerThan ,
EnumSearchObjDataType . Date , Attdate . AddDays ( 1 ) ) ;
_employees = new SearchEmployeeService ( ) . Find ( omg ) ;
}
List < Employee > discontinueEmps = new EmployeeService ( ) . GetDiscontinueEmp ( Attdate , DateTime . Now , payrollTypeID ) ;
DateTime oLastDate = fromDate ;
DateTime oFirstDate = fromDate ;
_AttNHolidays = new AttnNationalHolidayService ( ) . GetByMonthAndPayrollType ( oFirstDate , oLastDate , payrollTypeID ) ;
List < AttnRawData > attRawdata = new AttnRawDataService ( ) . Get ( startTime , ToTime , payrollTypeID ) ; // get raw data by a date and order by date, employee, punchTime
List < EmployeeOutsideDuty > outSideDuties = new EmployeeOutsideDutyService ( ) . Get ( Attdate ) ; // get transaction by the a rate
List < LeaveEntry > leaves = new LeaveEntryService ( ) . Get ( Attdate ) ; // workplans by the date
List < LeaveParameter > lvParameters = new LeaveParameterService ( ) . Get ( EnumStatus . Regardless , payrollTypeID , null , false ) ;
if ( discontinueEmps ! = null & & discontinueEmps . Count > 0 )
{
foreach ( Employee emp in discontinueEmps )
{
if ( _employees . Any ( x = > x . ID = = emp . ID ) = = false )
_employees . Add ( emp . getSearchEmployee ( ) ) ;
}
}
manualAttnProcesses = new DailyAttnProcessService ( ) . GetManualProcess ( payrollTypeID , Attdate ) ;
if ( _employees . Count = = 1 )
{
manualAttnProcesses . RemoveAll ( o = > o . EmployeeID ! = _employees [ 0 ] . ID ) ;
}
foreach ( DailyAttnProcess item in manualAttnProcesses )
{
//if (leaves != null && leaves.Count > 0)
//{
// if (item.AttenType == EnumAttendanceType.Leave)
// {
// empLeaveEntry = leaves.Where(lv => lv.EmpID == item.EmployeeID).FirstOrDefault();
// item.leaveEntry = empLeaveEntry;
// }
//}
dailyattProcesses . Add ( item ) ;
}
List < MonthlyWorkPlan > monthlyWorkPlans = new MonthlyWorkPlanService ( ) . GetByDate ( Attdate , payrollTypeID ) ;
#endregion
if ( monthlyWorkPlans = = null | | monthlyWorkPlans . Count = = 0 )
{
throw new Exception ( "Monthly work plan is not yet set for the selected date of month." ) ;
}
foreach ( SearchEmployee emp in _employees )
{
Shift oshift = null ;
msg = emp . EmployeeNo + " " + emp . Name + " Date:" + Attdate . ToString ( " dd MMM yy" ) ;
#region EmployeeWise Setup
// 1. If Joining date is after Attendendence date then no attendence
// if (emp.JoiningDate > Attdate) continue;
var manualEntry = manualAttnProcesses . Where ( obj = > obj . EmployeeID = = emp . ID ) . ToList ( ) ;
if ( manualEntry . Count > 0 ) continue ; //####
DailyAttnProcess attnProcess = new DailyAttnProcess ( ) ;
attnProcess . SearchEmployee = emp ;
attnProcess . CreatedBy = processUserID ;
attnProcess . CreatedDate = DateTime . Today ;
attnProcess . AttnDate = Attdate ;
attnProcess . EmployeeID = emp . EmployeeID ;
attnProcess . IsManualEntry = false ;
_lateHour = 0 ; _earlyHour = 0 ; _oTHour = 0 ;
List < AttnRawData > empAttnData = null ;
EmployeeOutsideDuty empOutsideDuty = null ;
if ( attRawdata ! = null & & attRawdata . Count > 0 )
empAttnData = attRawdata . Where ( erd = > erd . EmployeeID = = emp . ID ) . OrderBy ( erd = > erd . PunchTime ) . ToList ( ) ;
if ( outSideDuties ! = null & & outSideDuties . Count > 0 )
empOutsideDuty = outSideDuties . Where ( od = > od . EmployeeID = = emp . ID ) . FirstOrDefault ( ) ;
if ( leaves ! = null & & leaves . Count > 0 )
empLeaveEntry = leaves . Where ( lv = > lv . EmpID = = emp . ID ) . FirstOrDefault ( ) ;
EmployeeWorkPlanSetup oEmpWorkplan = empWPGroups . Where ( oGr = > oGr . EmployeeID = = emp . ID ) . FirstOrDefault ( ) ;
// 3. If There is no EmployeeWorkPlanSetup then no attendence
//if (oEmpWorkplan == null)
//{
// continue;
// //throw new Exception("Employee Work-Group is not Defined for " + emp.Name + " (" + emp.EmployeeNo + ")");
//}
// WorkPlanGroup oEmpWPlanGroup = workPlanGroups.Where(o => o.ID.Integer == oEmpWorkplan.WorkPlanGroupID.Integer).Single();
#endregion
#region Calcullate ShiftID and WorkPlan Day Type
MonthlyWorkPlan mplan = null ;
ActingResponsibilitySetup tempShiftEmployee = _tempraryShifts . Where ( o = > o . EmployeeID = = attnProcess . EmployeeID ) . FirstOrDefault ( ) ;
mplan = GetPlanwithEmployee ( Attdate , emp . EmployeeID , empWPGroups , monthlyWorkPlans , null ) ;
if ( emp . EmployeeNo = = "BP0010" )
{
}
attnProcess . MonthlyWorkPlan = mplan ;
if ( attnProcess . MonthlyWorkPlan ! = null )
{
attnProcess . ShiftID = mplan . ShiftID ;
attnProcess . Shift = _shifts . FirstOrDefault ( x = > x . ID = = mplan . ShiftID ) ;
attnProcess . WorkDayType = mplan . Type ;
attnProcess . ActualShiftID = null ;
if ( tempShiftEmployee ! = null )
{
// set original shift into the temporary shiftt
if ( tempShiftEmployee . ShiftID = = null )
{
attnProcess . ActualShiftID = attnProcess . ShiftID ;
mplan = GetPlanwithEmployee ( Attdate , emp . ID , empWPGroups , monthlyWorkPlans , tempShiftEmployee ) ;
attnProcess . ShiftID = mplan . ShiftID ;
}
else
{
attnProcess . ActualShiftID = attnProcess . ShiftID ;
attnProcess . ShiftID = tempShiftEmployee . ShiftID ;
}
if ( tempShiftEmployee . IsHoliday )
{
_earlyHour = 0 ;
_lateHour = 0 ;
attnProcess . InTime = null ;
attnProcess . OutTime = null ;
attnProcess . IsLate = false ;
attnProcess . EarlyHour = 0 ;
attnProcess . LateHour = 0 ;
attnProcess . WorkDayType = EnumWorkPlanDayType . WeeklyHoliday ;
}
else
{
attnProcess . WorkDayType = EnumWorkPlanDayType . WorkingDay ;
}
}
}
else
{
attnProcess . AttenType = EnumAttendanceType . Absent ;
attnProcess . Comments = "Roster is not yet assigned." ;
dailyattProcesses . Add ( attnProcess ) ;
continue ;
//throw new Exception("Monthly Roster not found for the employee(" + attnProcess.Employee.EmployeeNo + ")" + attnProcess.Employee.Name);
}
//attnProcess.WorkDayType = 0;// attnProcess.MonthlyWorkPlan.Type;
//attnProcess.ReferenceID = 0;// attnProcess.MonthlyWorkPlan.HolidayID;
#endregion
#region calculate In / Out time & work day type
/ *
* if ShiftID found and attendence data exists
* Calcullate InTime and OutTime
* If elligable for OT calcullate OT according to DayType ( Holiday or Workday )
* /
if ( empAttnData ! = null & & empAttnData . Count > 0 & & attnProcess . ShiftID ! = null )
{
attnProcess . AttenType = EnumAttendanceType . Present ;
attnProcess . InTime = null ;
attnProcess . OutTime = null ;
oshift = _shifts . FirstOrDefault ( x = > x . ID = = attnProcess . ShiftID ) ;
if ( oshift = = null ) continue ;
attnProcess . InTime = GetShiftInOutTime ( empAttnData , attnProcess , oshift . ID , true ) ;
attnProcess . OutTime = GetShiftInOutTime ( empAttnData , attnProcess , oshift . ID , false ) ;
if ( attnProcess . InTime ! = null ) attnProcess . InTime = ( ( DateTime ) attnProcess . InTime ) . RemoveSecondsAndMiliseconds ( ) ;
if ( attnProcess . OutTime ! = null ) attnProcess . OutTime = ( ( DateTime ) attnProcess . OutTime ) . RemoveSecondsAndMiliseconds ( ) ;
#region Calcullate Late & Delay & Early
#region previous Early and Late calculation
//if (attnProcess.InTime != null && totalLateMinute > oshift.LateCalcualtion)
//{
// // attnProcess.AttenType = EnumAttendanceType.Late;
// attnProcess.IsLate = true;
// _lateHour = (totalLateMinute) / 60;
//}
//if (attnProcess.OutTime != null && attnProcess.OutTime != null && ((DateTime)attnProcess.OutTime).Day == attnProcess.AttnDate.Day)
//{
// if (oshift.OutTime.TimeOfDay.Subtract(((DateTime)attnProcess.OutTime).TimeOfDay).TotalMinutes > 0)
// {
// _earlyHour = oshift.OutTime.TimeOfDay.Subtract(((DateTime)attnProcess.OutTime).TimeOfDay).TotalMinutes / 60;
// }
//}
#endregion
this . CalculateLateAndDelay ( attnProcess , _shifts ) ;
#endregion
}
#endregion
if ( empOutsideDuty ! = null )
{
attnProcess . AttenType = EnumAttendanceType . OutSideDuty ;
attnProcess . ReferenceID = empOutsideDuty . ID ;
}
if ( empLeaveEntry ! = null & & ( empLeaveEntry . LeaveStatus = = EnumLeaveStatus . Approved ) )
{
attnProcess . AttenType = EnumAttendanceType . Leave ;
attnProcess . ReferenceID = empLeaveEntry . LeaveID ;
}
#region Calcullate not present status
if ( attnProcess . WorkDayType = = EnumWorkPlanDayType . WeeklyHoliday
| | attnProcess . WorkDayType = = EnumWorkPlanDayType . NationalHoliday )
{
if ( empOutsideDuty ! = null )
{
attnProcess . AttenType = EnumAttendanceType . OutSideDuty ;
attnProcess . ReferenceID = empOutsideDuty . ID ;
attnProcess . Comments = empOutsideDuty . Comments ;
}
if ( empLeaveEntry ! = null & & ( empLeaveEntry . LeaveStatus = = EnumLeaveStatus . Approved )
& & lvParameters . Where ( x = > x . LeaveId = = empLeaveEntry . LeaveID ) . Any ( x = > x . IgnoreHoliday = = false ) )
{
attnProcess . AttenType = EnumAttendanceType . Leave ;
attnProcess . ReferenceID = empLeaveEntry . LeaveID ;
attnProcess . Comments = empLeaveEntry . Remarks ;
}
}
if ( attnProcess . InTime = = null | | attnProcess . OutTime = = null )
{
if ( empLeaveEntry ! = null & & ( empLeaveEntry . LeaveStatus = = EnumLeaveStatus . Approved ) )
{
#region Check Leave Entry
// Check wether Ignore Holidays
if ( lvParameters . Where ( x = > x . LeaveId = = empLeaveEntry . LeaveID ) . Any ( x = > x . IgnoreHoliday ) )
{
if ( attnProcess . WorkDayType = = EnumWorkPlanDayType . WeeklyHoliday )
attnProcess . AttenType = EnumAttendanceType . WeeklyHoliday ;
else if ( attnProcess . WorkDayType = = EnumWorkPlanDayType . NationalHoliday )
attnProcess . AttenType = EnumAttendanceType . Holiday ;
else
{
attnProcess . AttenType = EnumAttendanceType . Leave ;
attnProcess . ReferenceID = empLeaveEntry . LeaveID ;
}
}
else
{
if ( attnProcess . AttenType ! = EnumAttendanceType . Present )
{
attnProcess . AttenType = EnumAttendanceType . Leave ;
attnProcess . ReferenceID = empLeaveEntry . LeaveID ;
}
else
{
_earlyHour = 0 ;
_lateHour = 0 ;
attnProcess . IsLate = false ;
attnProcess . EarlyHour = 0 ;
attnProcess . LateHour = 0 ;
}
}
#endregion
}
else if ( empOutsideDuty ! = null )
{
attnProcess . AttenType = EnumAttendanceType . OutSideDuty ;
attnProcess . ReferenceID = empOutsideDuty . ID ;
}
else if ( attnProcess . WorkDayType = = EnumWorkPlanDayType . WeeklyHoliday )
attnProcess . AttenType = EnumAttendanceType . WeeklyHoliday ;
else if ( attnProcess . WorkDayType = = EnumWorkPlanDayType . NationalHoliday )
attnProcess . AttenType = EnumAttendanceType . Holiday ;
else if ( ( attnProcess . InTime ! = null & & attnProcess . InTime ! = DateTime . MinValue ) | |
( attnProcess . OutTime ! = null & & attnProcess . OutTime ! = DateTime . MinValue ) )
{
attnProcess . AttenType = EnumAttendanceType . Present ;
}
else
{
attnProcess . AttenType = EnumAttendanceType . Absent ;
}
}
if ( attnProcess . InTime ! = null & & attnProcess . Shift . hasAbsentTime = = true
& & attnProcess . WorkDayType = = EnumWorkPlanDayType . WorkingDay )
{
if ( attnProcess . Shift . InTime . TimeOfDay < = attnProcess . Shift . OutTime . TimeOfDay )
{
if ( ( ( DateTime ) attnProcess . InTime ) . TimeOfDay > attnProcess . Shift . AbsentTime . TimeOfDay )
{
attnProcess . AttenType = EnumAttendanceType . Absent ;
}
}
else
{
if ( attnProcess . Shift . AbsentTime . TimeOfDay < = attnProcess . Shift . OutTime . TimeOfDay )
{
if ( ( ( DateTime ) attnProcess . InTime ) . TimeOfDay > attnProcess . Shift . AbsentTime . TimeOfDay & &
( ( DateTime ) attnProcess . InTime ) . TimeOfDay < = attnProcess . Shift . OutTime . TimeOfDay )
{
attnProcess . AttenType = EnumAttendanceType . Absent ;
}
}
else
{
if ( ! ( ( ( DateTime ) attnProcess . InTime ) . TimeOfDay < attnProcess . Shift . AbsentTime . TimeOfDay
& & ( ( DateTime ) attnProcess . InTime ) . TimeOfDay > attnProcess . Shift . OutTime . TimeOfDay ) )
{
attnProcess . AttenType = EnumAttendanceType . Absent ;
}
}
}
}
#endregion
CalcullateOT ( true , attnProcess , attnProcess . Shift , Attdate ) ;
#region New Attendance Benefit Process
if ( attnProcess . AttenType ! = EnumAttendanceType . Absent & & attnProcess . InTime ! = null & & attnProcess . OutTime ! = null )
attnProcess . Benifits = CalculateDailyAttendanceAllowance ( attnProcess , payrollTypeID , processUserID ) ;
#endregion
dailyattProcesses . Add ( attnProcess ) ; // Add the process to collection
}
msg = "Saving Data: " ;
new DailyAttnProcessService ( ) . Save ( dailyattProcesses , _atnMonthlyBenifits ) ;
// msg = "Saving Allowance Data: ";
// new DailyAttendanceAllowanceService().Save(dailyAttendanceAllowances);
}
catch ( ServiceException ex )
{
throw new ServiceException ( msg + ex . Message , ex ) ;
}
catch ( Exception e )
{
throw new ServiceException ( msg + e . Message , e ) ;
}
}
public void CalculateLateAndDelay ( DailyAttnProcess attnProcess , List < Shift > shifts )
{
double totalLateMinute = 0 ;
DateTime temptime ;
if ( attnProcess . ShiftID = = null ) return ;
Shift oshift = shifts . FirstOrDefault ( x = > x . ID = = ( int ) attnProcess . ShiftID ) ;
if ( oshift = = null ) return ;
CalculateLateAndDelay ( attnProcess , oshift ) ;
}
public void CalculateOverTime ( DailyAttnProcess attnProcess , Shift shift )
{
if ( attnProcess . ShiftID = = null ) return ;
CalcullateOT ( true , attnProcess , shift , attnProcess . AttnDate ) ;
}
public void CalculateLateAndDelay ( DailyAttnProcess attnProcess , Shift oshift )
{
double totalLateMinute = 0 ;
DateTime temptime ;
attnProcess . IsLate = false ;
attnProcess . LateHour = 0 ;
attnProcess . EarlyHour = 0 ;
_lateHour = 0 ;
_earlyHour = 0 ;
if ( oshift ! = null & & attnProcess . InTime ! = null )
{
temptime = oshift . InTime . AddMinutes ( oshift . FlexibleHour ) ;
if ( ( ( DateTime ) attnProcess . InTime ) . TimeOfDay > temptime . TimeOfDay )
{
totalLateMinute = ( ( DateTime ) attnProcess . InTime ) . TimeOfDay . Subtract ( temptime . TimeOfDay ) . TotalMinutes ;
totalLateMinute = Math . Floor ( totalLateMinute ) ; // removing second
if ( totalLateMinute > oshift . LateCalcualtion )
{
attnProcess . IsLate = true ;
_lateHour = Math . Round ( Math . Floor ( totalLateMinute / 60 ) + ( totalLateMinute % 60 ) / 100 , 2 ) ;
}
}
}
double earlyhour = 0 ;
if ( oshift ! = null & & attnProcess . InTime ! = null & & attnProcess . OutTime ! = null )
{
DateTime tempshiftTime = oshift . OutTime ;
if ( oshift . FlexibleHour = = 0 )
{
DateTime workInTime = ( DateTime ) attnProcess . InTime ;
DateTime shiftInTime = new DateTime ( workInTime . Year , workInTime . Month , workInTime . Day , oshift . InTime . Hour , oshift . InTime . Minute , 0 ) ;
if ( workInTime < shiftInTime ) workInTime = shiftInTime ;
DateTime workoutTime = ( DateTime ) attnProcess . OutTime ;
DateTime shiftoutTime = new DateTime ( workoutTime . Year , workoutTime . Month , workoutTime . Day , oshift . OutTime . Hour , oshift . OutTime . Minute , 0 ) ;
if ( workoutTime > shiftoutTime ) workoutTime = shiftoutTime ;
// double workHour = (workoutTime).Subtract((DateTime)workInTime).TotalMinutes;
double workHour = ( ( DateTime ) attnProcess . OutTime ) . Subtract ( ( DateTime ) attnProcess . InTime ) . TotalMinutes ;
workHour = Math . Floor ( workHour ) ; //removing second
attnProcess . OTHour = workHour - 480 ; // Math.Round(Math.Floor(workHour / 60) + (workHour % 60) / 100, 2);
if ( attnProcess . OTHour < 0 ) attnProcess . OTHour = 0 ;
else attnProcess . OTHour = Math . Round ( Math . Floor ( attnProcess . OTHour / 60 ) + ( attnProcess . OTHour % 60 ) / 100 , 2 ) ;
workHour = workHour - oshift . LunchHour ;
if ( workHour < 0 ) workHour = 0 ;
// if (workHour> oshift.WorkHour*60) workHour = oshift.WorkHour * 60;
attnProcess . WorkHour = Math . Round ( Math . Floor ( workHour / 60 ) + ( workHour % 60 ) / 100 , 2 ) ;
if ( ( ( DateTime ) attnProcess . OutTime ) . TimeOfDay < shiftoutTime . TimeOfDay )
{
_earlyHour = ( shiftoutTime ) . Subtract ( ( DateTime ) attnProcess . OutTime ) . TotalMinutes ;
_earlyHour = Math . Floor ( _earlyHour ) ; // removing second
earlyhour = _earlyHour ;
_earlyHour = Math . Round ( Math . Floor ( _earlyHour / 60 ) + ( _earlyHour % 60 ) / 100 , 2 ) ;
}
}
// let calcualte workhour with flexible time later
}
attnProcess . LateHour = _lateHour ;
attnProcess . EarlyHour = _earlyHour ;
_DailyAttnProcess = attnProcess ;
}
public DailyAttnProcess CalulateLateAndDelayForMobileAttendance ( DailyAttnProcess oAttnProcess , Shift oShift )
{
CalculateLateAndDelay ( oAttnProcess , oShift ) ;
return _DailyAttnProcess ;
}
public DailyAttnProcess CalulateOverTimeForMobileAttendance ( DailyAttnProcess oAttnProcess , Shift oShift )
{
CalcullateOT ( true , oAttnProcess , oShift , oAttnProcess . AttnDate ) ;
return _DailyAttnProcess ;
}
public List < DailyAttendanceAllowance > CalculateDailyAttendanceAllowance ( DailyAttnProcess pDailyattProcesses , int payrolltypeid , int userid )
{
List < DailyAttendanceAllowance > items = new List < DailyAttendanceAllowance > ( ) ;
//DailyAttendanceAllowance tempDailyAttendanceAllowance = new DailyAttendanceAllowance();
//tempDailyAttendanceAllowance.AttnDate = pDailyattProcesses.AttnDate;
//tempDailyAttendanceAllowance.EmployeeID = pDailyattProcesses.EmployeeID;
//tempDailyAttendanceAllowance.ShiftID = (int)pDailyattProcesses.ShiftID;
//tempDailyAttendanceAllowance.PayrollTypeID = pEmployee.PayrollTypeID;
if ( pDailyattProcesses . ShiftID = = null ) return items ;
if ( pDailyattProcesses . Shift . HasBenefits )
{
if ( pDailyattProcesses . Shift . HasExtraHourAllowance & & pDailyattProcesses . OutTime ! = null & & pDailyattProcesses . OutTime ! = DateTime . MinValue & &
( ( DateTime ) pDailyattProcesses . OutTime ) . TimeOfDay > pDailyattProcesses . Shift . ExtraHourAllowanceFromTime . TimeOfDay )
{
DailyAttendanceAllowance ExtraHour = new DailyAttendanceAllowance ( ) ;
ExtraHour . BenifitsType = EnumattnBeniftsType . Allowance ;
ExtraHour . OtherBenifitItemID = pDailyattProcesses . Shift . ExtraHourAllowanceID ;
ExtraHour . OtherBenifitValue = Convert . ToInt32 ( Math . Round ( ( ( DateTime ) pDailyattProcesses . OutTime ) . TimeOfDay . Subtract ( pDailyattProcesses . Shift . ExtraHourAllowanceFromTime . TimeOfDay ) . TotalHours ) ) ;
items . Add ( ExtraHour ) ;
}
if ( ( pDailyattProcesses . Shift . HasHolidayAllowance & & pDailyattProcesses . AttenType = = EnumAttendanceType . WeeklyHoliday | | pDailyattProcesses . AttenType = = EnumAttendanceType . Holiday ) & &
( ( pDailyattProcesses . InTime ! = null & & pDailyattProcesses . InTime ! = DateTime . MinValue ) & &
( pDailyattProcesses . OutTime ! = null & & pDailyattProcesses . OutTime ! = DateTime . MinValue ) ) )
{
//tempDailyAttendanceAllowance.HolidayAllowance = Convert.ToInt32(Math.Round(((DateTime)pDailyattProcesses.OutTime).Subtract(((DateTime)pDailyattProcesses.InTime)).TotalHours));
// tempDailyAttendanceAllowance.HolidayAllowance = 1;
DailyAttendanceAllowance hilidayAlloance = new DailyAttendanceAllowance ( ) ;
hilidayAlloance . BenifitsType = EnumattnBeniftsType . Allowance ;
hilidayAlloance . OtherBenifitItemID = pDailyattProcesses . Shift . HolidayAllowanceID ;
hilidayAlloance . OtherBenifitValue = 1 ;
items . Add ( hilidayAlloance ) ;
}
if ( pDailyattProcesses . Shift . HasNightAllowance & & pDailyattProcesses . Shift . IsOverlapingDay )
{
DailyAttendanceAllowance NightAllowance = new DailyAttendanceAllowance ( ) ;
NightAllowance . BenifitsType = EnumattnBeniftsType . Allowance ;
NightAllowance . OtherBenifitItemID = pDailyattProcesses . Shift . NightAllowanceID ;
NightAllowance . OtherBenifitValue = 1 ;
items . Add ( NightAllowance ) ;
}
if ( pDailyattProcesses . Shift . HasOtherAllowance )
{
DailyAttendanceAllowance OtherAllowance = new DailyAttendanceAllowance ( ) ;
OtherAllowance . BenifitsType = EnumattnBeniftsType . Allowance ;
OtherAllowance . OtherBenifitItemID = pDailyattProcesses . Shift . OtherAllowanceID ;
OtherAllowance . OtherBenifitValue = 1 ;
items . Add ( OtherAllowance ) ;
}
if ( pDailyattProcesses . Shift . HasTiffinAllowance )
{
DailyAttendanceAllowance OtherAllowance = new DailyAttendanceAllowance ( ) ;
OtherAllowance . BenifitsType = EnumattnBeniftsType . Allowance ;
OtherAllowance . OtherBenifitItemID = pDailyattProcesses . Shift . TiffinAllowanceID ;
OtherAllowance . OtherBenifitValue = 1 ;
items . Add ( OtherAllowance ) ;
}
if ( pDailyattProcesses . Shift . HasSpecialAllowance )
{
DailyAttendanceAllowance OtherAllowance = new DailyAttendanceAllowance ( ) ;
OtherAllowance . BenifitsType = EnumattnBeniftsType . Allowance ;
OtherAllowance . OtherBenifitItemID = pDailyattProcesses . Shift . SpecialAllowanceID ;
OtherAllowance . OtherBenifitValue = 1 ;
items . Add ( OtherAllowance ) ;
}
if ( pDailyattProcesses . Shift . HasRegularOverTime = = true
& & pDailyattProcesses . OTHour > 0 )
{
if ( pDailyattProcesses . Shift . HasHolidayOverTime = = true & &
( pDailyattProcesses . WorkDayType = = EnumWorkPlanDayType . NationalHoliday | |
pDailyattProcesses . WorkDayType = = EnumWorkPlanDayType . WeeklyAndNational ) )
{
// do nothing
}
else
{
DailyAttendanceAllowance RegularOverTime = new DailyAttendanceAllowance ( ) ;
RegularOverTime . BenifitsType = EnumattnBeniftsType . OT ;
RegularOverTime . OtherBenifitItemID = pDailyattProcesses . Shift . RegularOverTimeAllowanceID ;
RegularOverTime . OtherBenifitValue = pDailyattProcesses . OTHour ;
items . Add ( RegularOverTime ) ;
}
}
if ( pDailyattProcesses . Shift . HasRegularOverTime = = true & &
pDailyattProcesses . Shift . HasHolidayOverTime = = true & & pDailyattProcesses . OTHour > 0 & &
( pDailyattProcesses . WorkDayType = = EnumWorkPlanDayType . NationalHoliday | |
pDailyattProcesses . WorkDayType = = EnumWorkPlanDayType . WeeklyAndNational
) )
{
DailyAttendanceAllowance HolidayOverTime = new DailyAttendanceAllowance ( ) ;
HolidayOverTime . BenifitsType = EnumattnBeniftsType . OT ;
HolidayOverTime . OtherBenifitItemID = pDailyattProcesses . Shift . HolidayOverTimeAllowanceID ;
HolidayOverTime . OtherBenifitValue = Convert . ToInt32 ( Math . Round ( pDailyattProcesses . OTHour ) ) ;
items . Add ( HolidayOverTime ) ;
}
if ( this . _AttnParam = = null ) this . _AttnParam = new AttnParametarizationService ( ) . Get ( payrolltypeid ) ;
if ( this . _AttnParam = = null ) throw new Exception ( "Failed to get Attendance parameters" ) ;
items . ForEach ( x = >
{
x . AttnDate = pDailyattProcesses . AttnDate ;
x . EmployeeID = pDailyattProcesses . EmployeeID ;
x . ShiftID = ( int ) pDailyattProcesses . ShiftID ;
x . PayrollTypeID = payrolltypeid ;
x . CreatedBy = userid ;
x . CreatedDate = DateTime . Now ;
x . SalaryMonth = GlobalFunctions . GetAttandaceSalaryMonth ( x . AttnDate , this . _AttnParam . MonthStartDay ) ;
} ) ;
}
//DailyAttendanceAllowance tempDailyAttendanceAllowance = new DailyAttendanceAllowance();
//tempDailyAttendanceAllowance.AttnDate = pDailyattProcesses.AttnDate;
//tempDailyAttendanceAllowance.EmployeeID = pDailyattProcesses.EmployeeID;
//tempDailyAttendanceAllowance.ShiftID = (int)pDailyattProcesses.ShiftID;
//tempDailyAttendanceAllowance.PayrollTypeID = pEmployee.PayrollTypeID;
return items ;
}
public List < AttnMonthlyBenefit > AttnMonthlyBenefitProcess_prev ( List < DailyAttnProcess > dailyattProcesses , bool IsManualEntry , int payrollTypeId )
{
// this function is per previous system
List < AttnWiseAllowance > oAttnWiseAllowances = new AttnWiseAllowanceService ( ) . Get ( payrollTypeId ) ;
if ( oAttnWiseAllowances = = null | | oAttnWiseAllowances . Count = = 0 ) return null ;
AttnParametarization oAttnParam = new AttnParametarizationService ( ) . Get ( payrollTypeId ) ;
#region AttnMonthlyBenefit Process
string empids = string . Empty ;
DateTime tempIntime = DateTime . MinValue ;
DateTime tempOuttime = DateTime . MinValue ;
DateTime outTime = DateTime . MinValue ;
try
{
#region Distinct Employee
List < DailyAttnProcess > distinctEmployee = dailyattProcesses
. GroupBy ( p = > p . EmployeeID )
. Select ( g = > g . First ( ) )
. ToList ( ) ;
if ( distinctEmployee . Count = = 1 )
{
empids = distinctEmployee [ 0 ] . EmployeeID . ToString ( ) ;
}
else
{
foreach ( DailyAttnProcess dap in distinctEmployee )
{
empids + = dap . EmployeeID . ToString ( ) + "," ;
}
empids = empids . Trim ( ',' ) ;
}
#endregion
List < DailyAttnProcess > distinctAttnDate = dailyattProcesses
. GroupBy ( p = > p . AttnDate )
. Select ( g = > g . First ( ) )
. ToList ( ) ;
DateTime fromdate = GlobalFunctions . FirstDateOfMonth ( distinctAttnDate [ 0 ] . AttnDate . Date ) ;
DateTime todate = GlobalFunctions . LastDateOfMonth ( distinctAttnDate [ 0 ] . AttnDate . Date ) ;
List < Shift > shifts = new ShiftService ( ) . GetAllShift ( ) ;
string propertyName = string . Empty ;
bool isCalculatedValue = false ;
DateTime applicableMonth = DateTime . MinValue ;
double calculatedfValue = 0 ;
_atnMonthlyBenifits = new List < AttnMonthlyBenefit > ( ) ;
// omonthlyWorkPlan = new List<MonthlyWorkPlan>();
if ( distinctAttnDate . Count = = 1 )
{
// omonthlyWorkPlan = MonthlyWorkPlan.GetByDate(distinctAttnDate[0].AttnDate.Date);
AttnMnthBenefitValueMapper obj_Mapper = new AttnMnthBenefitValueMapper ( distinctAttnDate [ 0 ] . AttnDate . Date , oAttnParam . MonthStartDay , out applicableMonth ) ;
_atnMonthlyBenifits = new AttnMonthlyBenefitService ( ) . Get ( empids , applicableMonth ) ;
}
else
{
foreach ( DailyAttnProcess daProcess in distinctAttnDate )
{
DateTime tempTime = DateTime . MinValue ;
AttnMnthBenefitValueMapper obj_Mapper = new AttnMnthBenefitValueMapper ( daProcess . AttnDate . Date , oAttnParam . MonthStartDay , out applicableMonth ) ;
List < AttnMonthlyBenefit > _atnMonthlyBenifitTemp = new AttnMonthlyBenefitService ( ) . Get ( empids , applicableMonth ) ;
// omonthlyWorkPlan.AddRange(MonthlyWorkPlan.GetByDate(daProcess.AttnDate.Date));
foreach ( AttnMonthlyBenefit itemAMB in _atnMonthlyBenifitTemp )
{
if ( ! _atnMonthlyBenifits . Exists ( o = > o . EmployeeID = = itemAMB . EmployeeID & & o . SalaryMonth = = itemAMB . SalaryMonth & & o . ItemType = = itemAMB . ItemType & & o . ItemID = = itemAMB . ItemID ) )
{
_atnMonthlyBenifits . Add ( itemAMB ) ;
}
}
}
}
Employee employee = null ;
foreach ( DailyAttnProcess item in dailyattProcesses )
{
employee = item . Employee ;
PropertyInfo propertyInfo , propertyInfoIs ;
AttnMnthBenefitValueMapper objMapper = new AttnMnthBenefitValueMapper ( item . AttnDate . Date , oAttnParam . MonthStartDay , out applicableMonth ) ;
propertyName = objMapper [ item . AttnDate ] ;
List < AttnWiseAllowance > itemAttnWiseAllowwances = new AttnWiseAllowanceService ( ) . GetAllApplicableItem ( oAttnWiseAllowances , item ) ;
if ( itemAttnWiseAllowwances = = null ) continue ;
itemAttnWiseAllowwances = itemAttnWiseAllowwances . GroupBy ( p = > p . ID ) . Select ( g = > g . First ( ) ) . ToList ( ) ;
propertyInfo = typeof ( AttnMonthlyBenefit ) . GetProperties ( ) . FirstOrDefault ( p = > p . Name = = propertyName ) ;
propertyInfoIs = typeof ( AttnMonthlyBenefit ) . GetProperties ( ) . FirstOrDefault ( p = > p . Name = = "Is" + propertyName ) ;
List < AttnMonthlyBenefit > _aMBenifits = _atnMonthlyBenifits . Where ( o = > o . EmployeeID = = item . EmployeeID ) . ToList ( ) ;
if ( IsManualEntry = = true )
{
for ( int i = 0 ; i < _aMBenifits . Count ( ) ; i + + )
{
calculatedfValue = 0 ;
propertyInfo . SetValue ( _aMBenifits [ i ] , 0 , null ) ;
propertyInfoIs . SetValue ( _aMBenifits [ i ] , false , null ) ;
_aMBenifits [ i ] = new AttnMonthlyBenefitService ( ) . CalculateTotal ( _aMBenifits [ i ] ) ;
}
}
else
{
for ( int i = 0 ; i < _aMBenifits . Count ( ) ; i + + )
{
calculatedfValue = 0 ;
isCalculatedValue = ( bool ) propertyInfoIs . GetValue ( _aMBenifits [ i ] , null ) ;
if ( isCalculatedValue ) continue ;
propertyInfo . SetValue ( _aMBenifits [ i ] , 0 , null ) ;
_aMBenifits [ i ] = new AttnMonthlyBenefitService ( ) . CalculateTotal ( _aMBenifits [ i ] ) ;
}
}
foreach ( AttnWiseAllowance attSetup in itemAttnWiseAllowwances )
{
employee = item . Employee ;
AttnMonthlyBenefit oAttnWiseBenefit = _atnMonthlyBenifits
. FirstOrDefault ( x = > x . EmployeeID = = item . EmployeeID
& & attSetup . ProvisionID = = x . ItemID
& & attSetup . ProvisionType = = x . ItemType
& & x . SalaryMonth = = GlobalFunctions . GetAttandaceSalaryMonth ( item . AttnDate . Date , oAttnParam . MonthStartDay ) ) ;
if ( oAttnWiseBenefit = = null )
{
oAttnWiseBenefit = new AttnMonthlyBenefit ( ) ;
oAttnWiseBenefit . EmployeeID = item . EmployeeID ;
oAttnWiseBenefit . ItemType = attSetup . ProvisionType ;
oAttnWiseBenefit . ItemID = attSetup . ProvisionID ;
oAttnWiseBenefit . SalaryMonth = GlobalFunctions . GetAttandaceSalaryMonth ( item . AttnDate . Date , oAttnParam . MonthStartDay ) ;
_atnMonthlyBenifits . Add ( oAttnWiseBenefit ) ;
}
propertyInfo = typeof ( AttnMonthlyBenefit ) . GetProperties ( ) . FirstOrDefault ( p = > p . Name = = propertyName ) ;
calculatedfValue = ( double ) propertyInfo . GetValue ( oAttnWiseBenefit , null ) ;
propertyInfoIs = typeof ( AttnMonthlyBenefit ) . GetProperties ( ) . FirstOrDefault ( p = > p . Name = = "Is" + propertyName ) ;
isCalculatedValue = ( bool ) propertyInfoIs . GetValue ( oAttnWiseBenefit , null ) ;
if ( IsManualEntry = = false )
{
if ( isCalculatedValue )
{
continue ;
}
}
if ( oAttnWiseBenefit . ItemType = = enumPayrollComponentType . Over_Time )
{
calculatedfValue = new AttnMonthlyBenefitService ( ) . CalculateOvertimeValue ( attSetup , item , payrollTypeId ) ;
propertyInfo . SetValue ( oAttnWiseBenefit , calculatedfValue , null ) ;
}
if ( oAttnWiseBenefit . ItemType = = enumPayrollComponentType . Allowance )
{
calculatedfValue = new AttnMonthlyBenefitService ( ) . CalculateAllowanceValue ( attSetup , item ) ;
propertyInfo . SetValue ( oAttnWiseBenefit , calculatedfValue , null ) ;
}
oAttnWiseBenefit = new AttnMonthlyBenefitService ( ) . CalculateTotal ( oAttnWiseBenefit ) ;
}
}
}
catch ( Exception ex )
{
throw new Exception ( ex . Message ) ;
}
return _atnMonthlyBenifits ;
#endregion
}
#endregion
public static MonthlyWorkPlan GetPlanwithEmployee ( DateTime EffectDate , int employeeid ,
List < EmployeeWorkPlanSetup > plans , List < MonthlyWorkPlan > MworkPlans ,
ActingResponsibilitySetup temporaryShiftEmp )
{
MonthlyWorkPlan dPlan = null ;
if ( temporaryShiftEmp = = null )
{
EmployeeWorkPlanSetup workGroup = plans . FirstOrDefault ( x = > x . EmployeeID = = employeeid ) ;
if ( workGroup ! = null )
{
dPlan = MworkPlans . FirstOrDefault ( x = > x . WorkPlanGroupID = = workGroup . WorkPlanGroupID & & x . WorkDate = = EffectDate ) ;
if ( dPlan ! = null )
dPlan . EmployeeID = employeeid ;
}
}
else
{
dPlan = MworkPlans . FirstOrDefault ( x = > x . WorkPlanGroupID = = temporaryShiftEmp . WorkPlanGroupID & & x . WorkDate = = EffectDate ) ;
dPlan . EmployeeID = employeeid ;
}
return dPlan ;
}
private DateTime ? GetShiftInOutTime ( List < AttnRawData > RawData , DailyAttnProcess attnProcess , int shiftID , bool InCheck )
{
DateTime ? Returntime = null ;
Shift oShift = _shifts . FirstOrDefault ( x = > x . ID = = shiftID ) ;
if ( InCheck = = true )
{
DateTime MinInTime = new DateTime ( attnProcess . AttnDate . Year ,
attnProcess . AttnDate . Month ,
attnProcess . AttnDate . Day ,
oShift . InTime . Hour - 3 ,
0 ,
0 ) ;
DateTime inDate = attnProcess . AttnDate ;
int hour = oShift . InTime . Hour + 4 ;
if ( hour > 23 )
{
inDate = inDate . AddDays ( 1 ) ;
hour = hour - 23 ;
}
DateTime MaxInTime = new DateTime ( inDate . Year ,
inDate . Month ,
inDate . Day ,
hour ,
0 ,
0 ) ;
List < AttnRawData > rsts = RawData . Where ( x = > x . PunchTime > MinInTime & & x . PunchTime < MaxInTime ) . ToList ( ) ;
if ( rsts ! = null & & rsts . Count > 0 ) Returntime = rsts . Min ( x = > x . PunchTime ) ;
}
else
{
DateTime fromtime = attnProcess . AttnDate ;
int hour = oShift . InTime . Hour + 2 ;
if ( oShift . InTime . Hour + 2 > 23 )
{
fromtime = fromtime . AddDays ( 1 ) ;
hour = oShift . InTime . Hour + 2 - 23 ;
}
DateTime MinOutTime = new DateTime ( attnProcess . AttnDate . Year ,
fromtime . Month ,
fromtime . Day ,
hour , 0 , 0 ) ;
DateTime oDate = attnProcess . AttnDate ;
hour = 23 ;
if ( oShift . IsOverlapingDay )
{
hour = 11 ;
oDate = attnProcess . AttnDate . AddDays ( 1 ) ;
}
else
{
hour = 5 ;
oDate = attnProcess . AttnDate . AddDays ( 1 ) ;
}
DateTime MaxOutTime = new DateTime ( oDate . Year ,
oDate . Month ,
oDate . Day ,
hour ,
0 ,
0 ) ;
List < AttnRawData > rsts = RawData . Where ( x = > x . PunchTime > MinOutTime & & x . PunchTime < MaxOutTime ) . ToList ( ) ;
if ( rsts ! = null & & rsts . Count > 0 ) Returntime = rsts . Max ( x = > x . PunchTime ) ;
}
return Returntime ;
}
private void AddError ( AttnProcessRunSummary oAttnRunSummary , EnumErrorType enumErrorType ,
string errorDescription , Employee emp )
{
if ( oAttnRunSummary . AttnProcessRunDetails = = null )
oAttnRunSummary . AttnProcessRunDetails = new List < AttnProcessRunDetail > ( ) ;
oAttnRunSummary . AttnProcessRunDetails . Add ( new AttnProcessRunDetail ( )
{
EnumErrorType = enumErrorType ,
Description = errorDescription ,
EmployeeNo = emp = = null ? string . Empty : emp . EmployeeNo ,
EmployeeName = emp = = null ? string . Empty : emp . Name
} ) ;
if ( enumErrorType = = EnumErrorType . ServiceException | | enumErrorType = = EnumErrorType . Exception )
{
oAttnRunSummary . ProcessStatus = EnumAttnProcessStatus . Error ;
}
else
{
oAttnRunSummary . ProcessStatus = EnumAttnProcessStatus . SuccessWithError ;
}
}
//private void CalcullateOTandWorkHour(DailyAttnProcess attnProcess, bool isOTEligable, DateTime Attdate)
//{
// attnProcess.OTHour = 0;
// attnProcess.WorkHour = 0;
// if (attnProcess.AttenType == EnumAttendanceType.Present || attnProcess.AttenType == EnumAttendanceType.Late)
// {
// if (attnProcess.InTime != null && attnProcess.InTime != DateTime.MinValue && attnProcess.OutTime != null && attnProcess.OutTime != DateTime.MinValue)
// {
// DateTime actualInTime = (DateTime)attnProcess.InTime;
// double actualHourWorked = ((DateTime)attnProcess.OutTime).Subtract((DateTime)attnProcess.InTime).TotalHours;
// //if (attnProcess.HasDualShift)
// //{
// // if (attnProcess.InTime2 != DateTime.MinValue && attnProcess.OutTime2 != DateTime.MinValue)
// // {
// // actualHourWorked += attnProcess.OutTime2.Subtract(attnProcess.InTime2).TotalHours;
// // }
// //}
// //else if (attnProcess.OutTime2 != DateTime.MinValue)
// //{
// // actualHourWorked = attnProcess.OutTime2.Subtract(attnProcess.InTime).TotalHours;
// //}
// double standardHourWorked = attnProcess.Shift.WorkHour + (attnProcess.Shift.LunchHour / 60.0);
// DateTime shiftInTime = ((DateTime)attnProcess.InTime).Date.Add(attnProcess.Shift.InTime.TimeOfDay);
// //DateTime shiftOutTime = shiftInTime.AddHours(standardHourWorked);
// if (attnProcess.WorkDayType == EnumWorkPlanDayType.WorkingDay)
// {
// if (actualHourWorked > standardHourWorked)
// {
// attnProcess.WorkHour = attnProcess.Shift.WorkHour;
// double minutesBeforeShiftTime = 0;
// double minutesAfterShiftTime = 0;
// double inOTMinutes, outOTMinutes;
// inOTMinutes = outOTMinutes = 0;
// if (actualInTime < shiftInTime)
// {
// minutesBeforeShiftTime = shiftInTime.Subtract(actualInTime).TotalMinutes;
// var minimumOtInMinutes = attnProcess.Shift.MinimumInOTHour;
// if (minimumOtInMinutes == 0)
// inOTMinutes = minutesBeforeShiftTime;
// else
// inOTMinutes = minimumOtInMinutes *
// Math.Floor((minutesBeforeShiftTime +
// attnProcess.Shift.MinimumInGraceTime) /
// minimumOtInMinutes);
// }
// if ((actualHourWorked * 60.0) - (standardHourWorked * 60.0) > minutesBeforeShiftTime)
// {
// minutesAfterShiftTime = (actualHourWorked * 60.0) - (standardHourWorked * 60.0) -
// minutesBeforeShiftTime;
// var minimumOtOutMinutes = attnProcess.Shift.MinimumOutOTHour;
// if (minimumOtOutMinutes == 0)
// outOTMinutes = minutesAfterShiftTime;
// else
// outOTMinutes = minimumOtOutMinutes *
// Math.Floor((minutesAfterShiftTime +
// attnProcess.Shift.MinimumOutGraceTime) /
// minimumOtOutMinutes);
// }
// if (inOTMinutes + outOTMinutes > 0)
// {
// attnProcess.OTHour = (inOTMinutes + outOTMinutes) / 60.0;
// }
// }
// else
// {
// attnProcess.WorkHour = actualHourWorked - (attnProcess.Shift.LunchHour / 60.0);
// }
// }
// else
// {
// double minutesBeforeShiftTime = 0;
// double minutesAfterShiftTime = 0;
// double inOTMinutes, outOTMinutes;
// inOTMinutes = outOTMinutes = 0;
// if (actualInTime < shiftInTime)
// {
// minutesBeforeShiftTime = shiftInTime.Subtract(actualInTime).TotalMinutes;
// var minimumOtInMinutes = attnProcess.Shift.MinimumInOTHour;
// if (minimumOtInMinutes == 0)
// inOTMinutes = minutesBeforeShiftTime;
// else
// inOTMinutes = minimumOtInMinutes *
// Math.Floor(
// (minutesBeforeShiftTime + attnProcess.Shift.MinimumInGraceTime) /
// minimumOtInMinutes);
// }
// if ((actualHourWorked * 60.0) - (standardHourWorked * 60.0) > minutesBeforeShiftTime)
// {
// minutesAfterShiftTime = (actualHourWorked * 60.0) - (standardHourWorked * 60.0) -
// minutesBeforeShiftTime;
// var minimumOtOutMinutes = attnProcess.Shift.MinimumOutOTHour;
// if (minimumOtOutMinutes == 0)
// outOTMinutes = minutesAfterShiftTime;
// else
// outOTMinutes = minimumOtOutMinutes *
// Math.Floor(
// (minutesAfterShiftTime + attnProcess.Shift.MinimumOutGraceTime) /
// minimumOtOutMinutes);
// }
// var regualarMinutes = (actualHourWorked * 60) - minutesBeforeShiftTime - minutesAfterShiftTime;
// //Holiday OT applicable after 6 Hours
// if (actualHourWorked >= 6)
// {
// attnProcess.OTHour = ((regualarMinutes + inOTMinutes + outOTMinutes) / 60.0) -
// (attnProcess.Shift.LunchHour / 60.0);
// }
// else
// {
// attnProcess.WorkHour = actualHourWorked;
// }
// }
// attnProcess.OTHour = attnProcess.OTHour > 0 && isOTEligable ? attnProcess.OTHour : 0;
// attnProcess.WorkHour = attnProcess.WorkHour < 0
// ? 0
// : attnProcess.WorkHour - (attnProcess.AttenType == EnumAttendanceType.Late ? 1 : 0);
// }
// }
//}
private int GetAppropriateShiftID ( List < Shift > oShifts , int currentShiftID , DateTime inTime )
{
int shiftID = currentShiftID ;
var currentShift = oShifts . FirstOrDefault ( x = > x . ID = = shiftID ) ;
double minuteDifference = 24 * 60 ;
if ( currentShift ! = null )
{
minuteDifference = Math . Abs ( ( new DateTime ( inTime . Year , inTime . Month , inTime . Day ,
currentShift . InTime . Hour , currentShift . InTime . Minute , currentShift . InTime . Second ) - inTime )
. TotalMinutes ) ;
}
foreach ( var shift in oShifts )
{
var shiftInTime = new DateTime ( inTime . Year , inTime . Month , inTime . Day , shift . InTime . Hour ,
shift . InTime . Minute , shift . InTime . Second ) ;
// +/- 10 minutes
if ( ( Math . Abs ( ( shiftInTime - inTime ) . TotalMinutes ) + 10 ) < minuteDifference )
{
minuteDifference = Math . Abs ( ( shiftInTime - inTime ) . TotalMinutes ) ;
shiftID = shift . ID ;
}
}
return shiftID ;
}
private List < Shift > GetLocationTypewiseShifts ( List < Shift > shifts , int shiftID )
{
List < Shift > oSameLocationShifts = new List < Shift > ( ) ;
if ( shifts . Any ( x = > x . ID = = shiftID ) )
{
var locationType = shifts . First ( x = > x . ID = = shiftID ) . Location ;
oSameLocationShifts = shifts . Where ( x = > x . Location = = locationType ) . ToList ( ) ;
}
return oSameLocationShifts ;
}
public static void GetAttendanceDateRange ( out DateTime startDate , out DateTime endDate )
{
startDate = endDate = DateTime . MinValue ;
startDate = DateTime . Today . AddDays ( - 7 ) ;
endDate = DateTime . Today ;
}
public static List < DailyAttnProcess >
GetNotSubmittedAttnData ( Employee oEmp , DateTime fromDate , DateTime toDate ) //,bool isCurrentMonth)
{
if ( oEmp = = null )
{
throw new CustomException ( EnumExceptionType . Validation , "No Employee selected." ) ;
}
List < DailyAttnProcess > oNotYetSubmittedAttnDatas =
new DailyAttnProcessService ( ) . GetAttnDataByWFStatus ( fromDate , toDate , oEmp . ID . ToString ( ) ,
EnumWFAttnStatus . None ) ;
return oNotYetSubmittedAttnDatas ;
}
//public List<AttnMonthlyBenefit> AttnMonthlyBenefitProcess(List<DailyAttnProcess> dailyattProcesses,
// bool IsManualEntry, int payrollTypeID)
//{
// List<DailyAttnProcess> tempATT = new List<DailyAttnProcess>();
// List<AttnNationalHoliday> attNHolidays = null;
// List<ActingResponsibilitySetup> _tempShiftEmployees = null;
// List<EmployeeWorkPlanSetup> _EmployeeWorkPlanSetups = null;
// EmployeeWorkPlanSetup ewps = null;
// AttnShiftWiseNationalHoliday attnShiftHoliday = null;
// List<MonthlyWorkPlan> _monthlyWorkPlan = null;
// MonthlyWorkPlan monthlyWorkPlanActual = null;
// MonthlyWorkPlan monthlyWorkPlanTemp = null;
// Shift temporaryShift = null;
// bool IsWorkingDay = true;
// #region AttnMonthlyBenefit Process
// string empids = string.Empty;
// //double totalOT = 0;
// DateTime tempIntime = DateTime.MinValue;
// DateTime tempOuttime = DateTime.MinValue;
// DateTime outTime = DateTime.MinValue;
// try
// {
// List<DailyAttnProcess> distinctEmployee = dailyattProcesses
// .GroupBy(p => p.EmployeeID)
// .Select(g => g.First())
// .ToList();
// List<DailyAttnProcess> distinctAttnDate = dailyattProcesses
// .GroupBy(p => p.AttnDate)
// .Select(g => g.First())
// .ToList();
// if (distinctEmployee.Count == 1)
// {
// empids = distinctEmployee[0].EmployeeID.ToString();
// }
// else
// {
// foreach (DailyAttnProcess dap in distinctEmployee)
// {
// empids += dap.EmployeeID.ToString() + ",";
// }
// empids = empids.Trim(',');
// }
// DateTime fromdate = GlobalFunctions.FirstDateOfMonth(distinctAttnDate[0].AttnDate.Date);
// DateTime todate = GlobalFunctions.LastDateOfMonth(distinctAttnDate[0].AttnDate.Date);
// attNHolidays =
// new AttnNationalHolidayService().GetByMonthAndPayrollType(fromdate, todate, payrollTypeID);
// List<Shift> shifts = new ShiftService().Get(string.Empty, string.Empty, EnumStatus.Regardless, payrollTypeID);
// string propertyName = string.Empty;
// bool isCalculatedValue = false;
// DateTime applicableMonth = DateTime.MinValue;
// double calculatedfValue = 0;
// _atnMonthlyBenifits = new List<AttnMonthlyBenefit>();
// _tempShiftEmployees = new List<ActingResponsibilitySetup>();
// _EmployeeWorkPlanSetups = new EmployeeWorkPlanSetupService().Get();
// _monthlyWorkPlan = new List<MonthlyWorkPlan>();
// if (distinctAttnDate.Count == 1)
// {
// // _monthlyWorkPlan = new MonthlyWorkPlanService().GetByDate(distinctAttnDate[0].AttnDate.Date);
// AttnMnthBenefitValueMapper obj_Mapper =
// new AttnMnthBenefitValueMapper(distinctAttnDate[0].AttnDate.Date, out applicableMonth);
// _atnMonthlyBenifits = new AttnMonthlyBenefitService().Get(empids, applicableMonth);
// }
// else
// {
// foreach (DailyAttnProcess daProcess in distinctAttnDate)
// {
// DateTime tempTime = DateTime.MinValue;
// AttnMnthBenefitValueMapper obj_Mapper =
// new AttnMnthBenefitValueMapper(daProcess.AttnDate.Date, out applicableMonth);
// List<AttnMonthlyBenefit> _atnMonthlyBenifitTemp =
// new AttnMonthlyBenefitService().Get(empids, applicableMonth);
// // _monthlyWorkPlan.AddRange(new MonthlyWorkPlanService().GetByDate(daProcess.AttnDate.Date));
// foreach (AttnMonthlyBenefit itemAMB in _atnMonthlyBenifitTemp)
// {
// if (!_atnMonthlyBenifits.Exists(o =>
// o.EmployeeID == itemAMB.EmployeeID && o.SalaryMonth == itemAMB.SalaryMonth &&
// o.ItemType == itemAMB.ItemType && o.ItemID == itemAMB.ItemID))
// {
// _atnMonthlyBenifits.Add(itemAMB);
// }
// }
// }
// }
// AttnNationalHoliday oAttNHoliday = null;
// List<AttnWiseAllowance> oAttnWiseAllowances = new List<AttnWiseAllowance>();
// oAttnWiseAllowances = new AttnWiseAllowanceService().Get(payrollTypeID);
// Employee employee = null;
// List<Leave> oLeaves =
// new LeaveService().Get(EnumStatus.Regardless, string.Empty, string.Empty, payrollTypeID);
// foreach (DailyAttnProcess item in dailyattProcesses)
// {
// ewps = _EmployeeWorkPlanSetups.Where(o => o.EmployeeID == item.EmployeeID).FirstOrDefault();
// if (ewps == null)
// {
// //throw new Exception("Employee WorkPlan Not Defined for " + employee.EmployeeNo);
// continue;
// }
// //totalOT = 0;
// employee = item.Employee;
// attnShiftHoliday = null;
// monthlyWorkPlanActual = _monthlyWorkPlan.Where(o =>
// o.WorkPlanGroupID == ewps.WorkPlanGroupID && o.WorkDate == item.AttnDate.Date).FirstOrDefault();
// temporaryShift = null;
// PropertyInfo propertyInfo;
// PropertyInfo propertyInfoIs;
// AttnMnthBenefitValueMapper objMapper =
// new AttnMnthBenefitValueMapper(item.AttnDate.Date, out applicableMonth);
// propertyName = objMapper[item.AttnDate];
// if (attNHolidays.Count > 0)
// oAttNHoliday = attNHolidays.Where(o =>
// item.AttnDate.Date >= o.FromDate.Date && item.AttnDate.Date <= o.ToDate.Date)
// .FirstOrDefault();
// if (oAttNHoliday != null && oAttNHoliday.AttnShiftWiseNationalHolidays.Count > 0)
// {
// //if (item.TempShiftID != null)
// //{
// // monthlyWorkPlanTemp = _monthlyWorkPlan.Where(o =>
// // o.WorkDate == item.AttnDate.Date && o.Type == item.WorkDayType &&
// // o.ShiftID == item.TempShiftID).FirstOrDefault();
// // if (monthlyWorkPlanTemp != null)
// // attnShiftHoliday = oAttNHoliday.AttnShiftWiseNationalHolidays
// // .Where(o => o.WorkPlanGroupID == monthlyWorkPlanTemp.WorkPlanGroupID)
// // .FirstOrDefault();
// //}
// //else
// attnShiftHoliday = oAttNHoliday.AttnShiftWiseNationalHolidays
// .Where(o => o.WorkPlanGroupID == monthlyWorkPlanActual.WorkPlanGroupID)
// .FirstOrDefault();
// if (attnShiftHoliday == null)
// oAttNHoliday = null;
// }
// List<AttnWiseAllowance> itemAttnWiseAllowwances =
// AttnWiseAllowanceService.GetAllApplicableItem(oAttnWiseAllowances, item, oAttNHoliday, oLeaves,
// IsWorkingDay);
// if (itemAttnWiseAllowwances == null) continue;
// itemAttnWiseAllowwances = itemAttnWiseAllowwances
// .GroupBy(p => p.ID)
// .Select(g => g.First())
// .ToList();
// // Make Zero of Current Date
// propertyInfo = typeof(AttnMonthlyBenefit).GetProperties()
// .FirstOrDefault(p => p.Name == propertyName);
// propertyInfoIs = typeof(AttnMonthlyBenefit).GetProperties()
// .FirstOrDefault(p => p.Name == "Is" + propertyName);
// List<AttnMonthlyBenefit> _aMBenifits =
// _atnMonthlyBenifits.Where(o => o.EmployeeID == item.EmployeeID).ToList();
// if (IsManualEntry == true)
// {
// foreach (AttnMonthlyBenefit attnMB in _aMBenifits)
// {
// calculatedfValue = 0;
// propertyInfo.SetValue(attnMB, 0, null);
// propertyInfoIs.SetValue(attnMB, false, null);
// attnMB.Total = attnMB.Value1 + attnMB.Value2 + attnMB.Value3 + attnMB.Value4 +
// attnMB.Value5 + attnMB.Value6 + attnMB.Value7 + attnMB.Value8 +
// attnMB.Value9 + attnMB.Value10
// + attnMB.Value11 + attnMB.Value12 + attnMB.Value13 + attnMB.Value14 +
// attnMB.Value15 + attnMB.Value16 + attnMB.Value17 + attnMB.Value18 +
// attnMB.Value19 + attnMB.Value20
// + attnMB.Value21 + attnMB.Value22 + attnMB.Value23 + attnMB.Value24 +
// attnMB.Value25 + attnMB.Value26 + attnMB.Value27 + attnMB.Value28 +
// attnMB.Value29 + attnMB.Value30
// + attnMB.Value31 + attnMB.Adjustment;
// }
// }
// else
// {
// foreach (AttnMonthlyBenefit attnMB in _aMBenifits)
// {
// calculatedfValue = 0;
// isCalculatedValue = (bool)propertyInfoIs.GetValue(attnMB, null);
// if (isCalculatedValue) continue;
// propertyInfo.SetValue(attnMB, 0, null);
// attnMB.Total = attnMB.Value1 + attnMB.Value2 + attnMB.Value3 + attnMB.Value4 +
// attnMB.Value5 + attnMB.Value6 + attnMB.Value7 + attnMB.Value8 +
// attnMB.Value9 + attnMB.Value10
// + attnMB.Value11 + attnMB.Value12 + attnMB.Value13 + attnMB.Value14 +
// attnMB.Value15 + attnMB.Value16 + attnMB.Value17 + attnMB.Value18 +
// attnMB.Value19 + attnMB.Value20
// + attnMB.Value21 + attnMB.Value22 + attnMB.Value23 + attnMB.Value24 +
// attnMB.Value25 + attnMB.Value26 + attnMB.Value27 + attnMB.Value28 +
// attnMB.Value29 + attnMB.Value30
// + attnMB.Value31 + attnMB.Adjustment;
// }
// }
// //if (totalOT > 0 && (item.AttenType == EnumAttendanceType.Leave || item.AttenType == EnumAttendanceType.Absent || item.AttenType == EnumAttendanceType.WeeklyHoliday))
// //{
// // if (!itemAttnWiseAllowwances.Exists(o => o.ProvisionType == enumPayrollComponentType.Allowance && o.ProvisionID == 82))
// // {
// // itemAttnWiseAllowwances.Add(oAttnWiseAllowances.Where(o => o.ProvisionType == enumPayrollComponentType.Allowance && o.ProvisionID == 82).FirstOrDefault());
// // }
// //}
// //if (item.TempShiftID != null)
// //{
// // if (totalOT == 0 && monthlyWorkPlanActual.Type == EnumWorkPlanDayType.WeeklyHoliday)
// // {
// // itemAttnWiseAllowwances.RemoveAll(o => o.ProvisionType == enumPayrollComponentType.Allowance && o.ProvisionID == 107);
// // }
// // if (monthlyWorkPlanActual.Type == EnumWorkPlanDayType.WorkingDay && monthlyWorkPlanActual.Shift.IsOverlapingDay == true && (item.AttenType == EnumAttendanceType.Present || item.AttenType == EnumAttendanceType.WeeklyHoliday) && item.AttenType != EnumAttendanceType.Absent)
// // {
// // if (!itemAttnWiseAllowwances.Exists(o => o.ProvisionType == enumPayrollComponentType.Allowance && o.ProvisionID == 107))
// // {
// // itemAttnWiseAllowwances.Add(oAttnWiseAllowances.Where(o => o.ProvisionType == enumPayrollComponentType.Allowance && o.ProvisionID == 107).FirstOrDefault());
// // }
// // }
// //}
// foreach (AttnWiseAllowance attSetup in itemAttnWiseAllowwances)
// {
// employee = item.Employee;
// AttnMonthlyBenefit oAttnWiseBenefit = _atnMonthlyBenifits
// .FirstOrDefault(x => x.EmployeeID == item.EmployeeID
// && attSetup.ProvisionID == x.ItemID
// && attSetup.ProvisionType == x.ItemType
// && x.SalaryMonth ==
// GlobalFunctions.AttendanceMonthEnd(item.AttnDate.Date));
// //if oAttnWiseBenefit is not null and IsEdited true for the selected date, then continue
// if (oAttnWiseBenefit == null)
// {
// oAttnWiseBenefit = new AttnMonthlyBenefit();
// oAttnWiseBenefit.EmployeeID = item.EmployeeID;
// oAttnWiseBenefit.ItemType = attSetup.ProvisionType;
// oAttnWiseBenefit.ItemID = attSetup.ProvisionID;
// oAttnWiseBenefit.SalaryMonth = GlobalFunctions.AttendanceMonthEnd(item.AttnDate.Date);
// _atnMonthlyBenifits.Add(oAttnWiseBenefit);
// }
// propertyInfo = typeof(AttnMonthlyBenefit).GetProperties()
// .FirstOrDefault(p => p.Name == propertyName);
// calculatedfValue = (double)propertyInfo.GetValue(oAttnWiseBenefit, null);
// propertyInfoIs = typeof(AttnMonthlyBenefit).GetProperties()
// .FirstOrDefault(p => p.Name == "Is" + propertyName);
// isCalculatedValue = (bool)propertyInfoIs.GetValue(oAttnWiseBenefit, null);
// if (IsManualEntry == false)
// {
// if (isCalculatedValue)
// {
// continue;
// }
// }
// //else
// //{
// //if (attSetup.ProvisionType == enumPayrollComponentType.Over_Time)
// //{
// // if (isCalculatedValue)
// // {
// // continue;
// // }
// //}
// //}
// //Shift sft = shifts.Where(o => o.ID == item.ShiftID).FirstOrDefault();
// //if (item.TempShiftID != null)
// // temporaryShift = shifts.Where(o => o.ID == item.TempShiftID).FirstOrDefault();
// //if (temporaryShift != null && attSetup.ProvisionType == enumPayrollComponentType.Ordinary_Hour)
// // calculatedfValue = attSetup.GetCalculatedHour(item, temporaryShift, oLeaves);
// //else
// // calculatedfValue = attSetup.GetCalculatedHour(item, sft, oLeaves);
// //#region InsurancePolicy
// //The reason behind this code block: Sometimes employee don't get their applicable conveyance even if he/she is present.
// //if (attSetup.ProvisionType == enumPayrollComponentType.Allowance && attSetup.ProvisionID == AttendanceBenefitTypeIDConstant.Conveyance_Allowance && calculatedfValue == 0)
// //{
// // if (item.AttenType == EnumAttendanceType.Present && item.InTime != DateTime.MinValue && item.OutTime != DateTime.MinValue)
// // {
// // calculatedfValue = 1;
// // propertyInfoIs.SetValue(oAttnWiseBenefit, true, null);
// // }
// //}
// //if (attSetup.ProvisionType == enumPayrollComponentType.Ordinary_Hour)
// // item.ORDHour = calculatedfValue;
// //#endregion
// //if (calculatedfValue > 0 || newValue >0)
// //{
// if (oAttnWiseBenefit.ItemType == enumPayrollComponentType.Over_Time)
// {
// calculatedfValue = new AttnMonthlyBenefitService().CalculateOvertimeValue(attSetup, item, payrollTypeID);
// }
// propertyInfo.SetValue(oAttnWiseBenefit, calculatedfValue, null);
// oAttnWiseBenefit.Total =
// oAttnWiseBenefit.Value1 + oAttnWiseBenefit.Value2 + oAttnWiseBenefit.Value3 +
// oAttnWiseBenefit.Value4 + oAttnWiseBenefit.Value5 + oAttnWiseBenefit.Value6 +
// oAttnWiseBenefit.Value7 + oAttnWiseBenefit.Value8 + oAttnWiseBenefit.Value9 +
// oAttnWiseBenefit.Value10
// + oAttnWiseBenefit.Value11 + oAttnWiseBenefit.Value12 + oAttnWiseBenefit.Value13 +
// oAttnWiseBenefit.Value14 + oAttnWiseBenefit.Value15 + oAttnWiseBenefit.Value16 +
// oAttnWiseBenefit.Value17 + oAttnWiseBenefit.Value18 + oAttnWiseBenefit.Value19 +
// oAttnWiseBenefit.Value20
// + oAttnWiseBenefit.Value21 + oAttnWiseBenefit.Value22 + oAttnWiseBenefit.Value23 +
// oAttnWiseBenefit.Value24 + oAttnWiseBenefit.Value25 + oAttnWiseBenefit.Value26 +
// oAttnWiseBenefit.Value27 + oAttnWiseBenefit.Value28 + oAttnWiseBenefit.Value29 +
// oAttnWiseBenefit.Value30
// + oAttnWiseBenefit.Value31 + oAttnWiseBenefit.Adjustment;
// if (oAttnWiseBenefit.ItemType == enumPayrollComponentType.Over_Time)
// {
// oAttnWiseBenefit.Amount =
// AttnMonthlyBenefitService.CalculateOvertimeAmount(attSetup, item,
// oAttnWiseBenefit.Total, payrollTypeID);
// }
// //}
// }
// }
// // process go here
// }
// catch (Exception ex)
// {
// throw new Exception(ex.Message);
// }
// return _atnMonthlyBenifits;
// #endregion
//}
public static void RefreshAttendanceRegularizationApplyObject ( AttendanceRegularizationDTO attendanceRegularizationDTO , DailyAttnProcess dailyAttnProcess )
{
bool isChanged = false ;
DateTime tempDateTime = DateTime . MinValue ;
EnumAttendanceType previousStatus ;
DateTime ? previousInTime = DateTime . MinValue ;
DateTime ? previousOutTime = DateTime . MinValue ;
previousInTime = dailyAttnProcess . InTime ;
previousOutTime = dailyAttnProcess . OutTime ;
previousStatus = dailyAttnProcess . AttenType ;
dailyAttnProcess . IsManualEntry = true ;
EnumAttendanceType value = attendanceRegularizationDTO . Status ;
dailyAttnProcess . AttenType = value ;
if ( previousStatus ! = value )
isChanged = true ;
if ( ! string . IsNullOrEmpty ( attendanceRegularizationDTO . Comments ) )
{
dailyAttnProcess . Comments = attendanceRegularizationDTO . Comments ;
isChanged = true ;
}
if ( attendanceRegularizationDTO . InTime ! = null & & attendanceRegularizationDTO . InTime ! = DateTime . MinValue )
{
if ( attendanceRegularizationDTO . InTime ! = null )
{
tempDateTime = ( DateTime ) attendanceRegularizationDTO . InTime ;
dailyAttnProcess . InTime = new DateTime ( dailyAttnProcess . AttnDate . Year , dailyAttnProcess . AttnDate . Month , dailyAttnProcess . AttnDate . Day , tempDateTime . Hour , tempDateTime . Minute , tempDateTime . Second ) ;
}
}
if ( attendanceRegularizationDTO . OutTime ! = DateTime . MinValue )
{
if ( attendanceRegularizationDTO . OutTime ! = null )
{
dailyAttnProcess . OutTime = ( DateTime ) attendanceRegularizationDTO . OutTime ;
}
}
if ( previousInTime ! = dailyAttnProcess . InTime )
isChanged = true ;
if ( previousOutTime ! = dailyAttnProcess . OutTime )
isChanged = true ;
if ( isChanged = = true )
{
dailyAttnProcess . ActualInTime = previousInTime ;
dailyAttnProcess . ActualOutTime = previousOutTime ;
dailyAttnProcess . WFStatus = EnumWFAttnStatus . EmpSubmitted ;
}
else
{
dailyAttnProcess . WFStatus = EnumWFAttnStatus . NotApplicable ;
}
}
public static void RefreshAttendanceRegularizationApproveOrRejectObject ( AttendanceRegularizationDTO attendanceRegularizationDTO ,
DailyAttnProcess dailyAttnProcess )
{
bool isChanged = false ;
EnumAttendanceType previousStatus ;
DateTime ? previousInTime = dailyAttnProcess . InTime ;
DateTime ? previousOutTime = dailyAttnProcess . OutTime ;
previousStatus = dailyAttnProcess . AttenType ;
dailyAttnProcess . IsManualEntry = true ;
EnumAttendanceType value = attendanceRegularizationDTO . Status ;
dailyAttnProcess . AttenType = value ;
if ( previousStatus ! = value )
isChanged = true ;
if ( ! string . IsNullOrEmpty ( attendanceRegularizationDTO . LMRemarks ) )
{
dailyAttnProcess . LMRemarks = attendanceRegularizationDTO . LMRemarks ;
isChanged = true ;
}
if ( attendanceRegularizationDTO . InTime ! = null & & attendanceRegularizationDTO . InTime ! = DateTime . MinValue )
{
if ( attendanceRegularizationDTO . InTime ! = null )
{
DateTime tempDateTime = ( DateTime ) attendanceRegularizationDTO . InTime ;
dailyAttnProcess . InTime = new DateTime ( dailyAttnProcess . AttnDate . Year , dailyAttnProcess . AttnDate . Month , dailyAttnProcess . AttnDate . Day , tempDateTime . Hour , tempDateTime . Minute , tempDateTime . Second ) ;
}
}
if ( attendanceRegularizationDTO . OutTime ! = DateTime . MinValue )
{
if ( attendanceRegularizationDTO . OutTime ! = null )
{
dailyAttnProcess . OutTime = ( DateTime ) attendanceRegularizationDTO . OutTime ;
}
}
if ( previousInTime ! = dailyAttnProcess . InTime )
isChanged = true ;
if ( previousOutTime ! = dailyAttnProcess . OutTime )
isChanged = true ;
dailyAttnProcess . WFStatus = attendanceRegularizationDTO . WFStatus ;
if ( isChanged = = true )
{
dailyAttnProcess . ActualInTime = previousInTime ;
dailyAttnProcess . ActualOutTime = previousOutTime ;
}
}
public static List < AttendanceRegularizationDTO > GetNotSubmittedAttnData ( List < DailyAttnProcess > dailyAttnProcesses , int payrollTypeId )
{
List < AttendanceRegularizationDTO > attendanceRegularizationDTOs = new List < AttendanceRegularizationDTO > ( ) ;
List < Shift > Shifts = new ShiftService ( ) . GetAllShift ( ) ;
List < Leave > oLeaves = new LeaveService ( ) . GetAll ( ) ;
List < AttnNationalHoliday > nationalHolidays = new AttnNationalHolidayService ( ) . Get ( EnumStatus . Regardless , payrollTypeId ) ;
foreach ( DailyAttnProcess dailyAttnProcess in dailyAttnProcesses )
{
Shift shift = Shifts . FirstOrDefault ( x = > x . ID = = dailyAttnProcess . ShiftID ) ;
AttendanceRegularizationDTO attendanceRegularizationDTO = new AttendanceRegularizationDTO ( ) ;
attendanceRegularizationDTO . DailyAttnProcessID = dailyAttnProcess . ID ;
attendanceRegularizationDTO . AttendanceDate = dailyAttnProcess . AttnDate . ToString ( "dd MMM yyyy" ) ;
attendanceRegularizationDTO . Shift = shift ! = null ? shift . Name : string . Empty ;
attendanceRegularizationDTO . InTime = dailyAttnProcess . InTime ! = null ? dailyAttnProcess . InTime : null ;
attendanceRegularizationDTO . OutTime = dailyAttnProcess . OutTime ! = null ? dailyAttnProcess . OutTime : null ;
attendanceRegularizationDTO . lateHour = dailyAttnProcess . LateHour ;
attendanceRegularizationDTO . earlyHour = dailyAttnProcess . EarlyHour ;
attendanceRegularizationDTO . workHour = dailyAttnProcess . WorkHour ;
attendanceRegularizationDTO . otHour = dailyAttnProcess . OTHour ;
attendanceRegularizationDTO . IsLate = dailyAttnProcess . IsLate ;
attendanceRegularizationDTO . ActualInTime = dailyAttnProcess . ActualInTime ! = null ? dailyAttnProcess . ActualInTime : null ;
attendanceRegularizationDTO . ActualOutTime = dailyAttnProcess . ActualOutTime ! = null ? dailyAttnProcess . ActualOutTime : null ;
attendanceRegularizationDTO . WFStatus = dailyAttnProcess . WFStatus ;
attendanceRegularizationDTO . WFStatusDescription = DailyAttnProcess . getWFstatusDescription ( dailyAttnProcess . WFStatus ) ;
attendanceRegularizationDTO . Status = dailyAttnProcess . AttenType ;
attendanceRegularizationDTO . StatusDescription = dailyAttnProcess . AttenType . ToString ( ) ;
attendanceRegularizationDTO . Comments = dailyAttnProcess . Comments ;
attendanceRegularizationDTO . LMRemarks = dailyAttnProcess . LMRemarks ;
attendanceRegularizationDTO . empRemarks = dailyAttnProcess . EmpRemarks ;
if ( dailyAttnProcess . AttenType = = EnumAttendanceType . Leave & & dailyAttnProcess . ReferenceID ! = null )
{
Leave oLeave = oLeaves . Where ( o = > o . ID = = dailyAttnProcess . ReferenceID ) . FirstOrDefault ( ) ;
attendanceRegularizationDTO . ReferenceId = ( int ) dailyAttnProcess . ReferenceID ;
attendanceRegularizationDTO . Reference = oLeave = = null ? "" : oLeave . Description ;
}
else if ( dailyAttnProcess . AttenType = = EnumAttendanceType . Holiday & & dailyAttnProcess . ReferenceID ! = null )
{
AttnNationalHoliday nationalHoliday = nationalHolidays . Where ( o = > o . ID = = dailyAttnProcess . ReferenceID ) . FirstOrDefault ( ) ;
attendanceRegularizationDTO . ReferenceId = ( int ) dailyAttnProcess . ReferenceID ;
attendanceRegularizationDTO . Reference = nationalHoliday = = null ? "" : nationalHoliday . Description ;
}
else
{
attendanceRegularizationDTO . ReferenceId = 0 ;
attendanceRegularizationDTO . Reference = string . Empty ;
}
attendanceRegularizationDTOs . Add ( attendanceRegularizationDTO ) ;
}
return attendanceRegularizationDTOs ;
}
public static List < DailyAttnProcess > GetNotSubmittedAttnDataForLM ( string oEmps , DateTime fromDate , DateTime toDate ) //,bool isCurrentMonth)
{
if ( oEmps = = "" )
{
throw new CustomException ( EnumExceptionType . Validation , "No Employee selected." ) ;
}
List < DailyAttnProcess > oNotYetSubmittedAttnDatas = new DailyAttnProcessService ( ) . GetAttnDataByWFStatusForLM ( fromDate , toDate , oEmps , EnumWFAttnStatus . EmpSubmitted ) ;
return oNotYetSubmittedAttnDatas ;
}
public List < SalaryProcessStatus > BenifitProcess ( int userid , int PayrollTypeId )
{
try
{
List < SalaryProcessStatus > ErrorList = new List < SalaryProcessStatus > ( ) ;
List < ADParameterEmployee > AdparamEmployee = new List < ADParameterEmployee > ( ) ;
List < EmployeeUnAuthorizeLeave > uleaves = new List < EmployeeUnAuthorizeLeave > ( ) ;
List < EmployeeOverTime > EmpOverTimes = new List < EmployeeOverTime > ( ) ;
DailyAttnProcessService dapService = new DailyAttnProcessService ( ) ;
TermParameterService tps = new TermParameterService ( ) ;
AttnWiseAllowance attnAllow = new AttnWiseAllowance ( ) ;
// List<Employee> employees = new EmployeeService().GetByEmpIDs("352,70");
List < Employee > employees = new EmployeeService ( ) . GetAllEmps ( ) ;
List < ADParameter > oadParameters = new ADParameterService ( ) . GetWithDetail ( EnumStatus . Active , PayrollTypeId ) ;
PayrollType oPayrollType = new PayrollTypeService ( ) . Get ( PayrollTypeId ) ;
List < TermParameter > termParameters = tps . GetwithDetail ( oPayrollType . ID ) ;
AttnParametarization oAttnParam = new AttnParametarizationService ( ) . Get ( oPayrollType . ID ) ;
DateTime attnStartDate = GlobalFunctions . AttendanceMonthStart ( GlobalExtensions . FirstDateOfMonth ( oPayrollType . NextPayProcessDate ) , oAttnParam . MonthStartDay ) ;
DateTime attnEndDate = GlobalFunctions . AttendanceMonthEnd ( attnStartDate . AddDays ( 1 ) , oAttnParam . MonthStartDay ) ;
List < UnAuthorizeLeaveParam > oauthParams = new UnAuthorizeLeaveParamService ( ) . Get ( oPayrollType . ID , true ) ;
DateTime nextPayMonth = oPayrollType . NextPayProcessDate ;
if ( oauthParams = = null | | oauthParams . Count = = 0 )
{
ErrorList . Add ( new SalaryProcessStatus ( "" , "" , " No Authorize Leave parameter found" ) ) ;
}
#region Absent Deduct
DataSet EmpAbsentDays = dapService . GetUnauthorizeCount ( attnStartDate , attnEndDate , oPayrollType . ID ) ;
if ( EmpAbsentDays ! = null
& & EmpAbsentDays . Tables [ 0 ] ! = null
& & EmpAbsentDays . Tables [ 0 ] . Rows . Count > 0
& & oauthParams . Count > 0 )
{
foreach ( DataRow oRow in EmpAbsentDays . Tables [ 0 ] . Rows )
{
Employee oemp = employees . FirstOrDefault ( x = > x . ID = = Convert . ToInt32 ( oRow [ "EMPLOYEEID" ] . ToString ( ) ) ) ;
if ( oemp = = null )
{
ErrorList . Add ( new SalaryProcessStatus ( "" , "" , " Employee not found, Internal ID:" + oRow [ "EMPLOYEEID" ] . ToString ( ) ) ) ;
continue ;
}
double tempAmount = 0 ;
double absentAcount = 0 ;
double provAbsent = 0 ;
if ( oAttnParam . AbsentProvLeaveID ! = null & & ( oemp . ConfirDate = = DateTime . MinValue | | ( oemp . ConfirDate >
attnStartDate & & oemp . ConfirDate < attnEndDate ) ) )
{
UnAuthorizeLeaveParam param = UnAuthorizeLeaveParam . GetParameter ( oauthParams , ( int ) oemp . GradeID , ( int ) oAttnParam . AbsentProvLeaveID ) ;
if ( param = = null )
{
ErrorList . Add ( new SalaryProcessStatus ( oemp . EmployeeNo , oemp . Name , " Absent Provisional Parameter not found." ) ) ;
continue ;
}
absentAcount = dapService . AbsentCount ( attnStartDate , ( DateTime ) oemp . ConfirDate = = DateTime . MinValue ? attnEndDate : ( DateTime ) oemp . ConfirDate , oemp . ID , oPayrollType . ID ) ;
if ( absentAcount > 4 )
{
tempAmount = absentAcount - 4 ;
absentAcount = 1 ;
}
provAbsent = absentAcount + tempAmount / 3 ;
EmployeeUnAuthorizeLeave uProvisionEmp = new EmployeeUnAuthorizeLeave ( oemp . ID , ( int ) oAttnParam . AbsentProvLeaveID ,
nextPayMonth , nextPayMonth , attnStartDate , attnEndDate , null ,
provAbsent , param . ID , false ) ;
uleaves . Add ( uProvisionEmp ) ;
}
tempAmount = 0 ;
if ( oRow [ "TOTAL" ] = = DBNull . Value )
{
continue ;
}
absentAcount = Convert . ToDouble ( oRow [ "TOTAL" ] ) ;
if ( absentAcount > 0 )
{
UnAuthorizeLeaveParam param = UnAuthorizeLeaveParam . GetParameter ( oauthParams , ( int ) oemp . GradeID , 1 ) ;
if ( param = = null )
{
ErrorList . Add ( new SalaryProcessStatus ( oemp . EmployeeNo , oemp . Name , " Absent Parameter not found." ) ) ;
continue ;
}
EmployeeUnAuthorizeLeave uleave = new EmployeeUnAuthorizeLeave ( oemp . ID , 1 ,
nextPayMonth , nextPayMonth , attnStartDate , attnEndDate , null ,
absentAcount , param . ID , false ) ;
uleaves . Add ( uleave ) ;
}
}
}
#endregion Absent Deduct
if ( oAttnParam . lwpLeaveTypeID ! = null )
{
DataSet EmpLWPDays = dapService . GetZandDocLeaveDays ( attnStartDate , attnEndDate , EnumAttendanceType . Leave , oPayrollType . ID , oAttnParam . lwpLeaveTypeID ) ;
#region LWP deduct
if ( EmpLWPDays ! = null
& & EmpLWPDays . Tables [ 0 ] ! = null
& & EmpLWPDays . Tables [ 0 ] . Rows . Count > 0
& & oauthParams . Count > 0
)
{
UnAuthorizeLeaveParam oprm = new BO . UnAuthorizeLeaveParam ( ) ;
foreach ( DataRow oRow in EmpLWPDays . Tables [ 0 ] . Rows )
{
Employee oemp = employees . FirstOrDefault ( x = > x . ID = = Convert . ToInt32 ( oRow [ "EMPLOYEEID" ] . ToString ( ) ) ) ;
if ( oemp = = null )
{
ErrorList . Add ( new SalaryProcessStatus ( "" , "" , " Employee not found, Internal ID:" + oRow [ "EMPLOYEEID" ] . ToString ( ) ) ) ;
continue ;
}
int absentAcount = 0 ;
absentAcount = Convert . ToInt32 ( oRow [ "TOTAL" ] . ToString ( ) ) - absentAcount ;
if ( oAttnParam . lwpProvLeaveID > 0 & & ( oemp . ConfirDate = = DateTime . MinValue | | ( oemp . ConfirDate >
attnStartDate & & oemp . ConfirDate < attnEndDate ) ) )
{
UnAuthorizeLeaveParam param = UnAuthorizeLeaveParam . GetParameter ( oauthParams , ( int ) oemp . GradeID , ( int ) oAttnParam . lwpProvLeaveID ) ;
if ( param = = null )
{
ErrorList . Add ( new SalaryProcessStatus ( oemp . EmployeeNo , oemp . Name , " Absent Provisional Parameter not found." ) ) ;
continue ;
}
if ( absentAcount > 0 )
{
EmployeeUnAuthorizeLeave uProvisionEmp = new EmployeeUnAuthorizeLeave ( oemp . ID , ( int ) oAttnParam . lwpProvLeaveID ,
nextPayMonth , nextPayMonth , attnStartDate , attnEndDate , null ,
absentAcount , param . ID , false ) ;
uleaves . Add ( uProvisionEmp ) ;
}
absentAcount = Convert . ToInt32 ( oRow [ "TOTAL" ] . ToString ( ) ) - absentAcount ;
}
if ( absentAcount > 0 )
{
UnAuthorizeLeaveParam param = UnAuthorizeLeaveParam . GetParameter ( oauthParams , ( int ) oemp . GradeID , ( int ) oAttnParam . lwpLeaveID ) ;
if ( param = = null )
{
ErrorList . Add ( new SalaryProcessStatus ( oemp . EmployeeNo , oemp . Name , " Absent Provisional Parameter not found." ) ) ;
continue ;
}
EmployeeUnAuthorizeLeave uleave = new EmployeeUnAuthorizeLeave ( oemp . ID , ( int ) oAttnParam . lwpLeaveID ,
nextPayMonth , nextPayMonth , attnStartDate , attnEndDate , null ,
absentAcount , param . ID , false ) ;
uleaves . Add ( uleave ) ;
}
}
}
#endregion LWP deduct
}
if ( oAttnParam . MaternityLeaveTypeID ! = null )
{
DataSet EmpMaternitydays = dapService . GetZandDocLeaveDays ( attnStartDate , attnEndDate , EnumAttendanceType . Leave , oPayrollType . ID , oAttnParam . MaternityLeaveTypeID ) ;
#region Maternity Deduction
if ( EmpMaternitydays ! = null
& & EmpMaternitydays . Tables [ 0 ] ! = null
& & EmpMaternitydays . Tables [ 0 ] . Rows . Count > 0
& & oauthParams . Count > 0
)
{
UnAuthorizeLeaveParam oprm = new BO . UnAuthorizeLeaveParam ( ) ;
foreach ( DataRow oRow in EmpMaternitydays . Tables [ 0 ] . Rows )
{
Employee oemp = employees . FirstOrDefault ( x = > x . ID = = Convert . ToInt32 ( oRow [ "EMPLOYEEID" ] . ToString ( ) ) ) ;
if ( oemp = = null )
{
ErrorList . Add ( new SalaryProcessStatus ( "" , "" , " Employee not found, Internal ID:" + oRow [ "EMPLOYEEID" ] . ToString ( ) ) ) ;
continue ;
}
int absentAcount = 0 ;
absentAcount = Convert . ToInt32 ( oRow [ "TOTAL" ] . ToString ( ) ) ;
if ( absentAcount > 0 )
{
UnAuthorizeLeaveParam param = UnAuthorizeLeaveParam . GetParameter ( oauthParams , ( int ) oemp . GradeID , ( int ) oAttnParam . MaternityUnAuthLeaveID ) ;
if ( param = = null )
{
ErrorList . Add ( new SalaryProcessStatus ( oemp . EmployeeNo , oemp . Name , " Maternity Benifits Parameters not found." ) ) ;
continue ;
}
EmployeeUnAuthorizeLeave uleave = new EmployeeUnAuthorizeLeave ( oemp . ID , ( int ) oAttnParam . MaternityLeaveTypeID ,
nextPayMonth , nextPayMonth , attnStartDate , attnEndDate , null ,
absentAcount , param . ID , false ) ;
uleaves . Add ( uleave ) ;
}
}
}
#endregion Maternity Deduction
}
#region Late Deduct
// Late Calculation
if ( oAttnParam . lateAbsentLeaveID ! = null )
{
DataSet LateDays = dapService . GetWorkingDayLateCount ( attnStartDate , attnEndDate , oPayrollType . ID ) ;
if ( LateDays ! = null & & LateDays . Tables [ 0 ] ! = null
& & LateDays . Tables [ 0 ] . Rows . Count > 0 & & oAttnParam . lateAbsentLeaveID > 0 )
{
foreach ( DataRow oRow in LateDays . Tables [ 0 ] . Rows )
{
int nCount = Convert . ToInt32 ( oRow [ "TOTAL" ] . ToString ( ) ) ;
if ( nCount < oAttnParam . MonthlyLateForAbsent ) continue ;
if ( oAttnParam . MonthlyLateForAbsent = = 0 ) continue ;
nCount = nCount / oAttnParam . MonthlyLateForAbsent ;
Employee oemp = employees . FirstOrDefault ( x = > x . ID = = Convert . ToInt32 ( oRow [ "EMPLOYEEID" ] . ToString ( ) ) ) ;
int ProvisionLateAcount = 0 ;
int lateAbsentCount = 0 ;
if ( oAttnParam . lateAbsentProvLeaveID ! = null & & ( oemp . ConfirDate = = DateTime . MinValue | | ( oemp . ConfirDate >
attnStartDate & & oemp . ConfirDate < attnEndDate ) ) )
{
ProvisionLateAcount = dapService . GetLateCount ( attnStartDate , ( DateTime ) oemp . ConfirDate = = DateTime . MinValue ? attnEndDate : ( DateTime ) oemp . ConfirDate , oemp . ID , oPayrollType . ID ) ;
UnAuthorizeLeaveParam param = UnAuthorizeLeaveParam . GetParameter ( oauthParams , oemp . ID , ( int ) oAttnParam . lateAbsentProvLeaveID ) ;
if ( param = = null )
{
ErrorList . Add ( new SalaryProcessStatus ( oemp . EmployeeNo , oemp . Name , " Late Absent Provisional Parameter not found." ) ) ;
}
int tempAmount = 0 ;
if ( ProvisionLateAcount > 4 )
{
lateAbsentCount = 1 ;
tempAmount = ProvisionLateAcount - 4 ;
}
lateAbsentCount = lateAbsentCount + tempAmount / 3 ;
if ( lateAbsentCount > 0 )
{
EmployeeUnAuthorizeLeave uProvisionEmp = new EmployeeUnAuthorizeLeave ( oemp . ID , ( int ) oAttnParam . lateAbsentProvLeaveID ,
nextPayMonth , nextPayMonth , attnStartDate , attnEndDate , null ,
lateAbsentCount , param . ID , false ) ;
uleaves . Add ( uProvisionEmp ) ;
}
}
int TotallateCount = Convert . ToInt32 ( oRow [ "TOTAL" ] . ToString ( ) ) - ProvisionLateAcount ;
int lateAbsent = 0 ;
if ( TotallateCount > 4 )
{
lateAbsent = 1 ;
TotallateCount = TotallateCount - 4 ;
}
lateAbsent = lateAbsent + TotallateCount / 3 ;
if ( lateAbsent > 0 )
{
UnAuthorizeLeaveParam param = UnAuthorizeLeaveParam . GetParameter ( oauthParams , ( int ) oemp . GradeID , ( int ) oAttnParam . lateAbsentLeaveID ) ;
if ( param = = null )
{
ErrorList . Add ( new SalaryProcessStatus ( oemp . EmployeeNo , oemp . Name , " Late Absent Parameter not found." ) ) ;
}
EmployeeUnAuthorizeLeave ulateCount = new EmployeeUnAuthorizeLeave ( oemp . ID , ( int ) oAttnParam . lateAbsentLeaveID ,
nextPayMonth , nextPayMonth , attnStartDate , attnEndDate , null ,
lateAbsent , param . ID , false ) ;
uleaves . Add ( ulateCount ) ;
}
}
}
}
#endregion
if ( oAttnParam . AllPresentAllowanceID ! = null )
{
DataSet PresentDays = dapService . GetZandDocLeaveDays ( attnStartDate , attnEndDate , EnumAttendanceType . Present , oPayrollType . ID , null ) ;
foreach ( Employee emp in employees )
{
if ( emp . PayrollTypeID ! = oPayrollType . ID ) continue ;
if ( emp . GradeID = = null )
{
ErrorList . Add ( new SalaryProcessStatus ( emp . EmployeeNo , emp . Name , " Employee Not yet Assigned to grade" ) ) ;
continue ;
}
List < ADParameter > applicableParams = new ADParameterService ( ) . GetApplicableParameters ( emp , ( int ) emp . GradeID , oadParameters ) ;
if ( applicableParams = = null )
{
ErrorList . Add ( new SalaryProcessStatus ( emp . EmployeeNo , emp . Name , " No Alloance parameters found for Attendance Bonus" ) ) ;
continue ;
}
ADParameter applicableParam = new ADParameterService ( ) . GetApplicableParameter ( emp , ( int ) emp . GradeID , oadParameters , ( int ) oAttnParam . AllPresentAllowanceID ) ;
if ( applicableParam ! = null )
{
DataRow pdr = PresentDays . Tables [ 0 ] . AsEnumerable ( ) . FirstOrDefault ( x = >
Convert . ToInt32 ( x [ "EmployeeID" ] . ToString ( ) ) = = emp . ID ) ;
if ( pdr = = null ) continue ;
double prdays = Convert . ToDouble ( pdr [ "TOTAL" ] . ToString ( ) ) ;
if ( prdays > = oAttnParam . AllPresentAllowanceDays )
{
ADParameterEmployee adparamEmp = new ADParameterEmployee ( ) ;
adparamEmp . EmployeeID = emp . ID ;
adparamEmp . MonthlyAmount = prdays * applicableParam . FlatAmount ;
adparamEmp . Days = prdays ;
adparamEmp . Periodicity = EnumPeriodicity . Monthly ;
adparamEmp . FormDate = GlobalFunctions . FirstDateOfMonth ( oPayrollType . NextPayProcessDate ) ;
adparamEmp . TillDate = GlobalFunctions . LastDateOfMonth ( oPayrollType . NextPayProcessDate ) ;
adparamEmp . ADParameterID = applicableParam . ID ;
adparamEmp . ADEmpType = EnumADEmpType . AppliedToIndividual ;
adparamEmp . AllowDeductID = ( int ) oAttnParam . AllPresentAllowanceID ;
adparamEmp . Arreartype = EnumArrearType . NotPresent ;
adparamEmp . CreatedBy = userid ;
adparamEmp . CreatedDate = DateTime . Today ;
AdparamEmployee . Add ( adparamEmp ) ;
}
}
}
}
#region Attendance Allowance process
List < Shift > shifts = new List < Shift > ( ) ;
DataTable dtDailyAttendanceAllowances = new DataTable ( ) ;
shifts = new ShiftService ( ) . GetAllShiftByPayrollType ( PayrollTypeId ) ;
dtDailyAttendanceAllowances = new DailyAttendanceAllowanceService ( ) . GetByAttnbySalaryMonth ( oPayrollType . NextPayProcessDate , PayrollTypeId ) ;
if ( dtDailyAttendanceAllowances ! = null & & dtDailyAttendanceAllowances . Rows . Count > 0 )
{
foreach ( DataRow item in dtDailyAttendanceAllowances . Rows )
{
Employee tempEmployee = employees . Where ( emp = > emp . ID . ToString ( ) = = item [ "EmployeeID" ] . ToString ( ) ) . FirstOrDefault ( ) ;
EnumattnBeniftsType btype = ( EnumattnBeniftsType ) Convert . ToInt32 ( item [ "type" ] . ToString ( ) ) ;
if ( btype = = EnumattnBeniftsType . Allowance )
AdparamEmployee = MakeADParameterEmployeeObj ( ref AdparamEmployee , ref ErrorList , tempEmployee ,
oadParameters ,
oPayrollType , Convert . ToInt32 ( item [ "ItemID" ] . ToString ( ) ) , Convert . ToInt32 ( item [ "value" ] . ToString ( ) ) , userid ) ;
else if ( btype = = EnumattnBeniftsType . OT )
EmpOverTimes = MakeEmployeeOvertimeObj ( ref EmpOverTimes , ref ErrorList , tempEmployee , termParameters ,
oPayrollType , Convert . ToInt32 ( item [ "ItemID" ] . ToString ( ) ) , Convert . ToDouble ( item [ "value" ] . ToString ( ) ) , userid ) ;
}
}
else
{
List < Term > terms = new TermService ( ) . Get ( EnumStatus . Active , PayrollTypeId ) ;
foreach ( Term trm in terms )
{
DataSet EmpOTHours = new ShiftTermService ( ) . GetEmpOT ( oPayrollType . NextPayProcessDate , trm . ID ) ;
foreach ( DataRow Dr in EmpOTHours . Tables [ 0 ] . Rows )
{
Employee tempEmployee = employees . Where ( emp = > emp . ID . ToString ( ) = = Dr [ "EmployeeID" ] . ToString ( ) ) . FirstOrDefault ( ) ;
if ( tempEmployee = = null ) continue ;
if ( tempEmployee . GradeID = = null )
{
ErrorList . Add ( new SalaryProcessStatus ( tempEmployee . EmployeeNo , tempEmployee . Name , "Grade not assinged" ) ) ;
continue ;
}
if ( Dr [ "TotalOT" ] = = DBNull . Value )
{
// ErrorList.Add(new SalaryProcessStatus(tempEmployee.EmployeeNo, tempEmployee.Name, "value can't be null "));
continue ;
}
EmpOverTimes = MakeEmployeeOvertimeObj ( ref EmpOverTimes , ref ErrorList , tempEmployee , termParameters ,
oPayrollType , trm . ID , Convert . ToDouble ( Dr [ "TotalOT" ] ) , userid ) ;
}
}
}
#endregion
if ( ErrorList . Count = = 0 )
{
if ( AdparamEmployee . Count > 0 | | EmpOverTimes . Count > 0 | | uleaves . Count > 0 )
{
new AttnMonthlyBenefitService ( ) . SaveAsBenifits ( oPayrollType . ID , AdparamEmployee , EmpOverTimes , uleaves ) ;
}
else ErrorList . Add ( new SalaryProcessStatus ( "" , "" , "There is nothing to process or Save. please check your Attandance data and related setups" ) ) ;
}
return ErrorList ;
}
catch ( Exception ex )
{
throw new Exception ( ex . Message ) ;
}
}
private List < ADParameterEmployee > MakeADParameterEmployeeObj ( ref List < ADParameterEmployee > AdparamEmployee , ref List < SalaryProcessStatus > ErrorList ,
Employee tempEmployee , List < ADParameter > oadParameters ,
PayrollType oPayrollType , int allowanceId , double total , int userid )
{
List < ADParameter > applicableParams = new ADParameterService ( ) . GetApplicableParameters ( tempEmployee , ( int ) tempEmployee . GradeID , oadParameters ) ;
if ( applicableParams = = null )
{
ErrorList . Add ( new SalaryProcessStatus ( tempEmployee . EmployeeNo , tempEmployee . Name , " No Alloance/Benifits parameters found in live allowance/Benifits list" ) ) ;
return AdparamEmployee ;
}
var AppliedIndvParam = applicableParams . Where ( x = > x . EntitleType = = EnumEntitleType . Individual & & x . IsDependsOnAttendance = = true & & x . Periodicity = = EnumPeriodicity . Monthly & & x . AllowDeductID = = allowanceId ) . ToList ( ) ;
if ( AppliedIndvParam = = null )
{
ErrorList . Add ( new SalaryProcessStatus ( tempEmployee . EmployeeNo , tempEmployee . Name , " Individualy and depand on Attandance declared Alloance/Benifits parameters found in live allowance/Benifits list" ) ) ;
return AdparamEmployee ;
}
foreach ( ADParameter indvParam in AppliedIndvParam )
{
ADParameterEmployee adparamEmp = new ADParameterEmployee ( ) ;
adparamEmp . EmployeeID = tempEmployee . ID ;
adparamEmp . MonthlyAmount = total * indvParam . FlatAmount ;
adparamEmp . Periodicity = EnumPeriodicity . Monthly ;
adparamEmp . Days = total ;
adparamEmp . FormDate = GlobalFunctions . FirstDateOfMonth ( oPayrollType . NextPayProcessDate ) ;
adparamEmp . TillDate = GlobalFunctions . LastDateOfMonth ( oPayrollType . NextPayProcessDate ) ;
adparamEmp . ADParameterID = indvParam . ID ;
adparamEmp . ADEmpType = EnumADEmpType . AppliedToIndividual ;
adparamEmp . AllowDeductID = allowanceId ;
adparamEmp . Arreartype = EnumArrearType . NotPresent ;
adparamEmp . CreatedBy = userid ;
adparamEmp . CreatedDate = DateTime . Today ;
AdparamEmployee . Add ( adparamEmp ) ;
}
return AdparamEmployee ;
}
private List < EmployeeOverTime > MakeEmployeeOvertimeObj ( ref List < EmployeeOverTime > EmpOverTimes , ref List < SalaryProcessStatus > ErrorList , Employee tempEmployee ,
List < TermParameter > oParameters , PayrollType oPayrollType , int termid , double total , int userid )
{
AttnWiseAllowance attnAllow = new AttnWiseAllowance ( ) ;
if ( oParameters . Count = = 0 ) return EmpOverTimes ;
TermParameter empTermParam = TermParameter . GetParameter ( oParameters , ( int ) tempEmployee . GradeID , termid ) ;
if ( empTermParam = = null )
{
ErrorList . Add ( new SalaryProcessStatus ( tempEmployee . EmployeeNo , tempEmployee . Name , "OT setup not found" ) ) ;
return EmpOverTimes ;
}
EmployeeOverTime empot = new EmployeeOverTime ( ) ;
empot . EmployeeID = tempEmployee . ID ;
empot . OTMonth = oPayrollType . NextPayProcessDate ;
empot . PayrollTypeID = oPayrollType . ID ;
empot . TermID = termid ;
empot . TermParameterID = empTermParam . TermID ;
empot . OTHours = total ;
empot . Value = empTermParam . Amount ;
empot . CreatedBy = userid ;
empot . CreatedDate = DateTime . Today ;
empot . MonthDate = oPayrollType . NextPayProcessDate ;
EmpOverTimes . Add ( empot ) ;
return EmpOverTimes ;
}
public void echoTexProcess ( DateTime Attdate , EnumProcessMode prMode , int payrolltypeid , int processUserID , List < Employee > employees )
{
AttnProcessRunSummary oAttnRunSummary = new AttnProcessRunSummary ( ) ;
bool isInOutApplicable = false ;
try
{
#region Load Attendence Raw Data
// AttnRawData.RunScriptCollectRawData(Attdate);
new AttnRawDataService ( ) . RunScriptCollectRawData ( Attdate ) ;
#endregion
#region Initialization for Attendence Process
isInOutApplicable = new SystemConfigarationService ( ) . GetconfigBooleanValue ( EnumConfigurationType . Logic , "attendence" , "inoutapplicable" ) ;
bool _IsOTFractionate = new SystemConfigarationService ( ) . GetconfigBooleanValue ( EnumConfigurationType . Logic , "overtime" , "fractionateothour" ) ;
var sinMissingHour = new SystemConfigarationService ( ) . GetconfigValue ( EnumConfigurationType . Logic , "overtime" , "inmissinghour" ) ;
double inMissingHour = 0 ;
if ( sinMissingHour ! = null ) inMissingHour = Convert . ToDouble ( sinMissingHour ) ;
List < DailyAttnProcess > dailyattProcesses = new List < DailyAttnProcess > ( ) ;
List < EmpFieldTrack > oEmpFieldTracks = new List < EmpFieldTrack > ( ) ;
List < AccessCard > oAccessCards = new AccessCardService ( ) . Get ( EnumCardStatus . Attached ) ;
List < CardOperation > oCardOperations = new CardOperationService ( ) . Get ( ) ;
DateTime startTime = new DateTime ( Attdate . Year , Attdate . Month , Attdate . Day , 4 , 0 , 0 ) ;
DateTime ToTime = Attdate . AddDays ( 1 ) ;
ToTime = new DateTime ( ToTime . Year , ToTime . Month , ToTime . Day , 10 , 0 , 0 ) ;
List < ShiftRotation > CounterClockRotation = new ShiftRotationService ( ) . Get ( EnumStatus . Regardless , payrolltypeid ) ;
List < EmployeeWorkPlanSetup > empWPGroups = new EmployeeWorkPlanSetupService ( ) . GetAll ( ) ;
List < Shift > shifts = new ShiftService ( ) . GetAllShift ( ) ;
List < WorkPlanGroup > workPlanGroups = new WorkPlanGroupService ( ) . GetAll ( ) ;
2025-03-24 14:29:03 +06:00
//if( employees == null) employees = new EmployeeService().GetAllLive();
if ( employees = = null )
employees = new EmployeeService ( ) . Get ( EnumEmployeeStatus . Live , payrolltypeid )
. OrderBy ( num = > num . EmployeeNo . Length ) . ThenBy ( num = > Convert . ToInt32 ( num . EmployeeNo ) ) . ToList ( ) ;
2024-10-14 10:01:49 +06:00
List < Employee > discontinueEmps = new EmployeeService ( ) . GetDiscontinueEmp ( Attdate , DateTime . Now , payrolltypeid ) ;
//List<AttnRawData> attRawdata = new AttnRawDataService().Get(startTime, ToTime, payrolltypeid);// get raw data by a date and order by date, employee, punchTime
List < AttnRawData > attRawdata = new AttnRawDataService ( ) . GetWithoutMobileRawData ( startTime , ToTime , payrolltypeid ) ; // get raw data by a date without MobileRawData and order by date, employee, punchTime
List < EmployeeOutsideDuty > outSideDuties = new EmployeeOutsideDutyService ( ) . Get ( Attdate ) ; // get transaction by the a rate
List < LeaveEntry > leaves = new LeaveEntryService ( ) . Get ( Attdate ) ; // workplans by the date
// Short leave for a particullar Day Should be between 6:00 AM Current Day to 6:00 AM Next Day. [Change can be done according to business logic]
List < EmployeeShortLeave > shortLeaves = new EmployeeShortLeaveService ( ) . Get ( Attdate . Date . AddHours ( 6 ) , Attdate . Date . AddDays ( 1 ) . AddHours ( 6 ) ) ;
//oEmpFieldTracks =new EmpFieldTrackService().Get().Where(obj => obj.TranDateTime.Date == Attdate.Date).ToList();
List < LeaveParameter > lvParameters = new LeaveParameterService ( ) . Get ( true , payrolltypeid ) ;
if ( discontinueEmps ! = null & & discontinueEmps . Count > 0 )
{
foreach ( Employee emp in discontinueEmps )
{
if ( employees . FindIndex ( x = > x . ID = = emp . ID ) ! = - 1 )
employees . Add ( emp ) ;
}
}
List < DailyAttnProcess > prvDayattns = new DailyAttnProcessService ( ) . GetshotList ( Attdate . AddDays ( - 1 ) ) ;
List < DailyAttnProcess > manualAttnProcesses = new DailyAttnProcessService ( ) . GetManualProcess ( payrolltypeid , Attdate ) ;
//foreach (DailyAttnProcess item in manualAttnProcesses)
//{
// dailyattProcesses.Add(item);
//}
#endregion
foreach ( Employee emp in employees )
{
//EmpTempid = emp.ID.Integer;
#region EmployeeWise Setup
// 1. If Joining date is after Attendendence date then no attendence
if ( emp . JoiningDate > Attdate )
{
continue ;
}
// 2. If End of Contract date is less than or equal Attendendence date then no attendence
if ( emp . EndOfContractDate ! = null & & emp . EndOfContractDate . Value < = Attdate )
{
continue ;
}
DailyAttnProcess attnProcess = new DailyAttnProcess ( ) ;
DailyAttnProcess manualEntry = manualAttnProcesses
. FirstOrDefault ( obj = > obj . EmployeeID = = emp . ID ) ;
// 2. If Attendendence is manually enterred
if ( manualEntry ! = null )
{
// 2.1 If Both In and Out are Manually Enterred then add the item
if ( ! manualEntry . OnlyManualInTime & & ! manualEntry . OnlyManualOutTime )
{
dailyattProcesses . Add ( manualEntry ) ;
continue ;
}
attnProcess = manualEntry ;
}
else
{
attnProcess . AttnDate = Attdate ;
attnProcess . EmployeeID = emp . ID ;
attnProcess . IsManualEntry = false ;
}
attnProcess . AttenType = EnumAttendanceType . Present ;
List < AttnRawData > empAttnData = null ;
EmployeeOutsideDuty empOutsideDuty = null ;
LeaveEntry empLeaveEntry = null ;
#region Some fine tuning in Employee ' s attendence RawData
if ( attRawdata ! = null & & attRawdata . Count > 0 )
{
empAttnData = attRawdata . Where ( erd = > erd . EmployeeID = = emp . ID )
. OrderBy ( erd = > erd . PunchTime )
. ToList ( ) ;
#region Remove Previously assigned Cards data in Current Date
if ( emp . CardID ! = null & & emp . CardID ! = null )
{
AccessCard accessCardEmp = oAccessCards . FirstOrDefault ( x = > x . ID = = emp . CardID ) ;
if ( accessCardEmp ! = null )
{
CardOperation oEmpCardOperation = oCardOperations
. FirstOrDefault ( x = > x . CardNumber . Trim ( ) . ToUpper ( ) = = accessCardEmp . CardNumber . Trim ( ) . ToUpper ( )
& & x . EmployeeID = = emp . ID ) ;
if ( oEmpCardOperation ! = null )
{
// if Current Date is Greater than currently assigned Cards assingnDate
if ( Attdate . Date > oEmpCardOperation . AssignDate )
{
// Remove Previously assigned Cards Data
empAttnData = empAttnData . Where ( x = > x . CardNo . Trim ( ) . ToUpper ( ) = = oEmpCardOperation . CardNumber . ToUpper ( ) ) . ToList ( ) ;
}
}
}
}
#endregion
// If empAttendence Data exist and
if ( empAttnData . Count > 0 )
{
// If empAttendence Data's first punchTime is greater than current date's last Time
if ( empAttnData [ 0 ] . PunchTime > new DateTime ( ToTime . Year , ToTime . Month , ToTime . Day , 2 , 0 , 0 ) )
{
// We Clear empAttendence Data
empAttnData = new List < AttnRawData > ( ) ;
}
else
{
// Gets Employees Previous Days Attendence
DailyAttnProcess op = prvDayattns . Where ( itm = > itm . EmployeeID = = emp . ID )
. OrderByDescending ( itm = > itm . OutTime )
. FirstOrDefault ( ) ;
// if Previous day attendence exists
if ( op ! = null )
{
// Previous Day's Out time Exists
if ( op . OutTime ! = null )
{
while ( empAttnData . Count > 0 )
{
// Take the Current First Attndence Data
AttnRawData ordata = empAttnData [ 0 ] ;
// If PunchTime is less than Previous Date's OutTime OR
// Difference is less Than 10 minutes
if ( ordata . PunchTime < = op . OutTime | | Math . Abs ( ( ( ( DateTime ) ordata . PunchTime - ( DateTime ) op . OutTime ) ) . TotalMinutes ) < 10 )
{
// discard that attendence entry
empAttnData . Remove ( ordata ) ;
}
else
{
break ;
}
}
}
else
{
// What to do??
}
}
}
if ( isInOutApplicable )
{
empAttnData = empAttnData
. OrderBy ( erd = > ( int ) erd . EntryMode )
. ThenBy ( erd = > erd . PunchTime )
. ToList ( ) ;
}
}
}
#endregion
if ( outSideDuties ! = null & & outSideDuties . Count > 0 )
{
empOutsideDuty = outSideDuties . Where ( od = > od . EmployeeID = = emp . ID )
. FirstOrDefault ( ) ;
}
EmployeeWorkPlanSetup oEmpWorkplan = empWPGroups . Where ( oGr = > oGr . EmployeeID = = emp . ID )
. SingleOrDefault ( ) ;
// 3. If There is no EmployeeWorkPlanSetup then no attendence
if ( oEmpWorkplan = = null )
{
//oAttnRunSummary.AddError(EnumErrorType.WorkGroupUndefine, "Employee WorkPlan Not Defined.", emp);
continue ;
}
WorkPlanGroup oEmpWPlanGroup = workPlanGroups . Where ( o = > o . ID = = oEmpWorkplan . WorkPlanGroupID )
. Single ( ) ;
//oEmpWPlanGroup = workPlanGroups.Where(o => o.ID == 28)
// .Single();
#endregion
#region Calcullate ShiftID and WorkPlan Day Type
// not needed now
// _empWPtype = oEmpWPlanGroup.Type; // Set Workplan Type
// Get ShiftID from WorkPlan for Fixed workplan
if ( oEmpWPlanGroup . Type = = EnumWorkPlanGroup . Fixed )
{
switch ( Attdate . DayOfWeek )
{
case DayOfWeek . Friday :
attnProcess . ShiftID = oEmpWorkplan . FridayShiftID ;
break ;
case DayOfWeek . Monday :
attnProcess . ShiftID = oEmpWorkplan . MondayShiftID ;
break ;
case DayOfWeek . Saturday :
attnProcess . ShiftID = oEmpWorkplan . SaturdayShiftID ;
break ;
case DayOfWeek . Sunday :
attnProcess . ShiftID = oEmpWorkplan . SundayShiftID ;
break ;
case DayOfWeek . Thursday :
attnProcess . ShiftID = oEmpWorkplan . ThursdayShiftID ;
break ;
case DayOfWeek . Tuesday :
attnProcess . ShiftID = oEmpWorkplan . TuesdayShiftID ;
break ;
case DayOfWeek . Wednesday :
attnProcess . ShiftID = oEmpWorkplan . WednesdayShiftID ;
break ;
default :
break ;
}
}
// Calcullate ShiftID for Rotation workplan
else
{
if ( empAttnData ! = null & & empAttnData . Count > 0 )
{
DateTime inTime = empAttnData [ 0 ] . PunchTime ;
double nminutes = 10000 ;
List < ShiftRotation > osrs ;
DateTime shiftInTime , shiftOutTime ;
Shift oshift ;
osrs = CounterClockRotation . Where ( x = > x . WorkPlanType = = oEmpWPlanGroup . Type ) . ToList ( ) ;
foreach ( ShiftRotation sr in osrs )
{
oshift = shifts . Single ( o = > o . ID = = sr . ShiftID ) ;
shiftInTime = Attdate . Subtract ( Attdate . TimeOfDay ) . Add ( oshift . InTime . TimeOfDay ) ;
TimeSpan ospan = ( inTime - shiftInTime ) ;
if ( nminutes > Math . Abs ( ospan . TotalMinutes ) )
{
nminutes = Math . Abs ( ospan . TotalMinutes ) ;
if ( ! attnProcess . IsManualEntry ) //This Condition is added for manual Shift change
attnProcess . ShiftID = sr . ShiftID ;
}
}
oshift = shifts . Single ( o = > o . ID = = attnProcess . ShiftID ) ;
shiftInTime = Attdate . Subtract ( Attdate . TimeOfDay ) . Add ( oshift . InTime . TimeOfDay ) ;
shiftOutTime = Attdate . Subtract ( Attdate . TimeOfDay ) . Add ( oshift . OutTime . TimeOfDay ) ;
if ( shiftOutTime < shiftInTime ) shiftOutTime = shiftOutTime . AddDays ( 1 ) ;
if ( Math . Abs ( ( shiftOutTime - shiftInTime ) . TotalMinutes ) < nminutes )
{
attnProcess . ShiftID = null ;
empAttnData = new List < AttnRawData > ( ) ;
}
}
}
CalcullateWorkdayType ( attnProcess , oEmpWorkplan , oEmpWPlanGroup , 1 ) ;
#region Leave Calcullation
if ( leaves ! = null & & leaves . Count > 0 )
{
empLeaveEntry = leaves . Where ( lv = > lv . EmpID = = emp . ID
& & ( lv . LeaveStatus = = EnumLeaveStatus . Approved | | lv . LeaveStatus = = EnumLeaveStatus . Availed ) )
. FirstOrDefault ( ) ;
if ( empLeaveEntry ! = null )
{
// Check wether Ignore Holidays
if ( lvParameters . Where ( x = > x . LeaveId = = empLeaveEntry . LeaveID ) . Any ( x = > x . IgnoreHoliday ) )
{
if ( attnProcess . WorkDayType = = EnumWorkPlanDayType . WeeklyHoliday )
{
attnProcess . AttenType = EnumAttendanceType . WeeklyHoliday ;
}
else if ( attnProcess . WorkDayType = = EnumWorkPlanDayType . NationalHoliday )
{
attnProcess . AttenType = EnumAttendanceType . Holiday ;
}
else
{
attnProcess . AttenType = EnumAttendanceType . Leave ;
attnProcess . ReferenceID = empLeaveEntry . LeaveID ;
dailyattProcesses . Add ( attnProcess ) ;
continue ;
}
}
else
{
attnProcess . AttenType = EnumAttendanceType . Leave ;
attnProcess . ReferenceID = empLeaveEntry . LeaveID ;
dailyattProcesses . Add ( attnProcess ) ;
continue ;
}
}
}
#endregion
#endregion
#region calculate In / Out time and With Other Things
/ *
* if ShiftID found and attendence data exists
* Calcullate InTime and OutTime
* If elligable for OT calcullate OT according to DayType ( Holiday or Workday )
* /
if ( empAttnData ! = null & & empAttnData . Count > 0 & & attnProcess . ShiftID ! = null & & attnProcess . ShiftID ! = 0 )
{
Shift oshift = shifts . FirstOrDefault ( x = > x . ID = = attnProcess . ShiftID ) ;
oshift . OutTime = oshift . InTime . Date
. AddDays ( oshift . OutTime . TimeOfDay < oshift . InTime . TimeOfDay ? 1 : 0 )
. Add ( oshift . OutTime . TimeOfDay ) ;
#region Calcullate In Out
if ( ! isInOutApplicable )
{
attnProcess . InTime = attnProcess . IsManualEntry & & attnProcess . OnlyManualInTime ?
attnProcess . InTime : empAttnData [ 0 ] . PunchTime ;
if ( ! ( attnProcess . IsManualEntry & & attnProcess . OnlyManualOutTime ) )
{
int outInitialIndex = attnProcess . IsManualEntry & & attnProcess . OnlyManualInTime ?
0 : 1 ;
if ( empAttnData . Count > outInitialIndex )
{
attnProcess . OutTime = empAttnData [ empAttnData . Count - 1 ] . PunchTime ;
//TimeSpan otime = attnProcess.OutTime - attnProcess.InTime;
// here we defined that total working hour is 19 hour in a day.
for ( int i = empAttnData . Count - 1 ; i > = outInitialIndex ; i - - )
{
TimeSpan ntime = ( DateTime ) empAttnData [ i ] . PunchTime - ( DateTime ) attnProcess . InTime ;
if ( oEmpWPlanGroup . Type ! = EnumWorkPlanGroup . Fixed )
{
if ( ! oshift . IsOverlapingDay // if not overlapping days
& & empAttnData [ i ] . PunchTime . Date > attnProcess . InTime // But it overlaps
& & empAttnData [ i ] . PunchTime . Subtract ( empAttnData [ i ] . PunchTime . Date ) . TotalHours > 4 ) //then check weather it is more than 4 hour next Day
{
// then ignore
continue ;
}
else
{
if ( ntime . TotalHours < = 14 )
{
attnProcess . OutTime = empAttnData [ i ] . PunchTime ;
break ;
}
}
}
else
{
attnProcess . OutTime = null ;
if ( empAttnData [ i ] . PunchTime . Date > attnProcess . InTime & & ntime . TotalHours > 16 )
continue ;
else
{
attnProcess . OutTime = empAttnData [ i ] . PunchTime ;
break ;
}
}
}
if ( attnProcess . OutTime ! = null )
{
if ( Math . Abs ( ( ( DateTime ) attnProcess . InTime - ( DateTime ) attnProcess . OutTime ) . TotalMinutes ) < 10 )
{
attnProcess . OutTime = null ;
}
}
}
}
}
else
{
List < AttnRawData > empInRawData = empAttnData . Where ( rd = > rd . EntryMode = = EnumEntryMode . In )
. OrderBy ( rd = > rd . PunchTime )
. ToList ( ) ;
List < AttnRawData > empOutRawData = empAttnData . Where ( rd = > rd . EntryMode = = EnumEntryMode . Out )
. OrderByDescending ( rd = > rd . PunchTime )
. ToList ( ) ;
if ( empInRawData . Count > 0 )
{
attnProcess . InTime = attnProcess . IsManualEntry & & attnProcess . OnlyManualInTime ?
attnProcess . InTime : empInRawData [ 0 ] . PunchTime ;
if ( ! ( attnProcess . IsManualEntry & & attnProcess . OnlyManualOutTime ) )
{
if ( empOutRawData . Count > 0 )
{
attnProcess . OutTime = empOutRawData [ 0 ] . PunchTime ;
foreach ( AttnRawData item in empOutRawData )
{
TimeSpan ntime = ( DateTime ) item . PunchTime - ( DateTime ) attnProcess . InTime ;
if ( oEmpWPlanGroup . Type ! = EnumWorkPlanGroup . Fixed )
{
if ( ntime . TotalHours < = 16 )
{
attnProcess . OutTime = item . PunchTime ;
break ;
}
}
else
{
attnProcess . OutTime = null ;
if ( item . PunchTime . Date > ( ( DateTime ) attnProcess . InTime ) . Date & & item . PunchTime . Hour > 5 )
continue ;
else
{
attnProcess . OutTime = item . PunchTime ;
break ;
}
}
}
}
if ( attnProcess . OutTime ! = null )
{
if ( Math . Abs ( ( ( DateTime ) attnProcess . InTime - ( DateTime ) attnProcess . OutTime ) . TotalMinutes ) < 10 )
{
attnProcess . OutTime = null ;
}
}
}
}
}
#endregion
CalcInOutCorrection ( inMissingHour , shifts , attnProcess ) ;
if ( attnProcess . InTime ! = null )
{
oshift . InTime = ( ( DateTime ) attnProcess . InTime ) . Date . Add ( oshift . InTime . TimeOfDay ) ;
oshift . OutTime = oshift . InTime . Date
. AddDays ( oshift . OutTime . TimeOfDay < oshift . InTime . TimeOfDay ? 1 : 0 )
. Add ( oshift . OutTime . TimeOfDay ) ;
oshift . AbsentTime = oshift . InTime . Date
. AddDays ( oshift . AbsentTime . TimeOfDay < oshift . InTime . TimeOfDay ? 1 : 0 )
. Add ( oshift . AbsentTime . TimeOfDay ) ;
#region Calcullate Late , Delay , Early & Absent
double lateOrDelayTime = ( ( DateTime ) attnProcess . InTime ) . TimeOfDay . Subtract ( oshift . InTime . TimeOfDay ) . TotalMinutes ;
if ( oshift . LateCalcualtion ! = 0 & & lateOrDelayTime > oshift . LateCalcualtion )
{
attnProcess . AttenType = EnumAttendanceType . Late ;
attnProcess . IsLate = true ;
attnProcess . LateHour = ( lateOrDelayTime - oshift . LateCalcualtion ) / 60 ;
}
if ( oshift . DelayCalcualtion ! = 0 & & lateOrDelayTime > oshift . DelayCalcualtion )
{
attnProcess . AttenType = EnumAttendanceType . Delay ;
attnProcess . IsLate = true ;
attnProcess . LateHour = ( lateOrDelayTime - oshift . DelayCalcualtion ) / 60 ;
}
if ( oshift . EarlyExitBefore ! = 0 & & attnProcess . OutTime ! = null )
{
double minutesEarly ;
minutesEarly = oshift . OutTime . Subtract ( oshift . InTime ) . TotalMinutes - ( ( DateTime ) attnProcess . OutTime ) . Subtract ( ( DateTime ) attnProcess . InTime ) . TotalMinutes ;
if ( minutesEarly > oshift . EarlyExitBefore )
{
attnProcess . AttenType = EnumAttendanceType . Early ;
attnProcess . EarlyHour = ( minutesEarly - oshift . EarlyExitBefore ) / 60 ;
}
}
//if(attnProcess.OutTime != DateTime.MinValue && oshift.HalfdayBarrierHour >0 && attnProcess.OutTime.Subtract(attnProcess.InTime).TotalHours <= oshift.HalfdayBarrierHour)
//{
// attnProcess.AttenType = EnumAttendanceType.HalfDay;
//}
if ( attnProcess . OutTime ! = null & & oshift . HalfdayBarrierHour > 0 & &
( ( DateTime ) attnProcess . OutTime ) . Subtract ( ( DateTime ) attnProcess . InTime ) . TotalHours
< = oshift . HalfdayBarrierHour )
{
attnProcess . AttenType = EnumAttendanceType . HalfDay ;
EmployeeShortLeave empShortLeave = shortLeaves . FirstOrDefault ( x = > x . EmployeeID = = emp . ID ) ;
double totalWorkingHour = 0 ;
if ( empShortLeave ! = null )
{
// Mutually Exclusive
if ( attnProcess . InTime > = empShortLeave . ToDate | | attnProcess . OutTime < = empShortLeave . FromDate )
{
totalWorkingHour = ( ( DateTime ) attnProcess . OutTime ) . Subtract ( ( DateTime ) attnProcess . InTime ) . TotalHours + empShortLeave . ToDate . Subtract ( empShortLeave . FromDate ) . TotalHours ;
}
else
{
DateTime calStartTime = ( DateTime ) attnProcess . InTime < ( DateTime ) empShortLeave . FromDate ? ( DateTime ) attnProcess . InTime : empShortLeave . FromDate ;
DateTime calEndTime = ( DateTime ) attnProcess . OutTime > empShortLeave . ToDate ? ( DateTime ) attnProcess . OutTime : empShortLeave . ToDate ;
totalWorkingHour = calEndTime . Subtract ( calStartTime ) . TotalHours ;
}
if ( totalWorkingHour > = oshift . HalfdayBarrierHour )
{
attnProcess . AttenType = EnumAttendanceType . Present ;
attnProcess . Comments = "Short Leave" ;
attnProcess . Reason = "Short Leave" ;
}
}
}
if ( oshift . hasAbsentTime )
{
if ( attnProcess . InTime > oshift . AbsentTime )
{
attnProcess . AttenType = EnumAttendanceType . Absent ;
}
}
#endregion
CalcullateOTEchoTex ( emp . IsEligibleOT , attnProcess , oshift , Attdate , _IsOTFractionate ) ;
//CalcullateOTEchoTex(!emp.IsEligibleOT, attnProcess, oshift, Attdate, true);
}
}
#endregion
#region Calcullate MobileAttendence if Not found in rawData
if ( attnProcess . InTime = = null & & oEmpFieldTracks . Any ( obj = > obj . EmployeeID = = attnProcess . EmployeeID ) )
{
List < EmpFieldTrack > oCurrentEmpFTracks = oEmpFieldTracks . Where ( obj = > obj . EmployeeID = = attnProcess . EmployeeID ) . OrderBy ( o = > o . TranDateTime ) . ToList ( ) ;
attnProcess . InTime = oCurrentEmpFTracks [ 0 ] . TranDateTime ;
if ( oCurrentEmpFTracks . Count > 1 )
attnProcess . OutTime = oCurrentEmpFTracks [ oCurrentEmpFTracks . Count - 1 ] . TranDateTime ;
attnProcess . AttenType = EnumAttendanceType . Present ;
}
#endregion
CalcInOutCorrection ( inMissingHour , shifts , attnProcess ) ;
#region Calcullate not present status
if ( attnProcess . InTime = = null & & attnProcess . OutTime = = null )
{
if ( empOutsideDuty ! = null )
{
attnProcess . AttenType = EnumAttendanceType . OutSideDuty ;
attnProcess . ReferenceID = empOutsideDuty . ID ;
}
else if ( attnProcess . WorkDayType = = EnumWorkPlanDayType . WeeklyHoliday )
{
attnProcess . AttenType = EnumAttendanceType . WeeklyHoliday ;
}
else if ( attnProcess . WorkDayType = = EnumWorkPlanDayType . NationalHoliday )
{
attnProcess . AttenType = EnumAttendanceType . Holiday ;
}
else
{
attnProcess . AttenType = EnumAttendanceType . Absent ;
}
}
#endregion
dailyattProcesses . Add ( attnProcess ) ; // Add the process to collection
}
//if (dailyattProcesses.Count == 0)
// throw new ServiceException("After process Raw data, no attandance found for the selected date.");
//DailyAttnProcess.Save(dailyattProcesses, false);
new DailyAttnProcessService ( ) . Save ( dailyattProcesses , null ) ;
}
catch ( ServiceException ex )
{
throw new ServiceException ( ex . Message , ex ) ;
}
catch ( Exception e )
{
throw new ServiceException ( e . Message , e ) ;
}
}
private static void CalcInOutCorrection ( double inMissingHour , List < Shift > shifts , DailyAttnProcess attnProcess )
{
// If There is InMissing Hour in Logic
if ( inMissingHour > 0 )
{
Shift oEmpshift = shifts . FirstOrDefault ( x = > x . ID = = attnProcess . ShiftID ) ;
if ( oEmpshift ! = null )
{
if ( attnProcess . InTime ! = null )
oEmpshift . InTime = ( ( DateTime ) attnProcess . InTime ) . Date . Add ( oEmpshift . InTime . TimeOfDay ) ;
if ( attnProcess . InTime ! = null & & oEmpshift . InTime . AddHours ( inMissingHour ) < attnProcess . InTime )
{
DateTime previousIn = ( DateTime ) attnProcess . InTime ;
attnProcess . InTime = null ;
attnProcess . LateHour = 0 ;
if ( attnProcess . OutTime = = null | | oEmpshift . OutTime . AddHours ( inMissingHour ) < attnProcess . OutTime )
{
attnProcess . OutTime = previousIn ;
}
}
}
}
}
}
}