Exemplo n.º 1
0
        private double GetDutyEntranceDuration(PersonnelEntrance entrance)
        {
            if (!entrance.ExitDate.HasValue || !entrance.Exit.HasValue)
            {
                return(0);
            }

            double dutyDuration = 0;

            var personnelDutyEntrance = GetPersonnelDutyEntrance(entrance);

            //recorded by duty card
            if (personnelDutyEntrance != null)
            {
                dutyDuration = (personnelDutyEntrance.EndDate.Value.Add(personnelDutyEntrance.End.Value)
                                - personnelDutyEntrance.StartDate.Add(personnelDutyEntrance.Start)).TotalSeconds;
            }
            else //applied and approved in system
            {
                var personnelDuty = GetEntranceDateDuty(entrance);
                if (personnelDuty != null)
                {
                    dutyDuration = GetDutyDuration(personnelDuty);
                }
            }

            return(dutyDuration);
        }
Exemplo n.º 2
0
        public double GetTotalExtraWorkDuration(PersonnelEntrance entrance, WorkingHour workingHour)
        {
            var totalExtraWork = GetPriorExtraWorkDuration(entrance, workingHour)
                                 + GetLaterExtraWorkDuration(entrance, workingHour);

            return(totalExtraWork);
        }
Exemplo n.º 3
0
 private PersonnelDutyEntrance GetPersonnelDutyEntrance(PersonnelEntrance entrance)
 {
     return(_personnelDutyEntranceRepository
            .Get(q => q.PersonnelId == entrance.PersonnelId && q.IsCompleted)
            .AsEnumerable()
            .Where(q => q.StartDate.Add(q.Start) >= entrance.EnterDate.Add(entrance.Enter) &&
                   q.EndDate.Value.Add(q.End.Value) <= entrance.ExitDate.Value.Add(entrance.Exit.Value))
            .FirstOrDefault());
 }
Exemplo n.º 4
0
        public string GetOperationTimeFormatted(PersonnelEntrance entrance, WorkingHour workingHour)
        {
            var timeDifference = GetOperationTime(entrance, workingHour);

            if (timeDifference == 0)
            {
                TimeSpan.Zero.ToDetailedString();
            }
            return(SecondsToTimeFormatted(timeDifference));
        }
Exemplo n.º 5
0
        public double GetPriorExtraWorkDuration(PersonnelEntrance entrance, WorkingHour workingHour)
        {
            double priorExtraWork = 0;

            if (!IsAbsent(entrance))
            {
                priorExtraWork = (workingHour.FromTime - entrance.Enter).TotalSeconds > 0
                        ? (workingHour.FromTime - entrance.Enter).TotalSeconds : 0;
            }

            return(priorExtraWork > workingHour.PriorExtraWorkTime
                ? workingHour.PriorExtraWorkTime : priorExtraWork);
        }
Exemplo n.º 6
0
        public string GetAbsenceTitle(PersonnelEntrance entrance, WorkingHour workingHour)
        {
            if (IsAbsent(entrance))
            {
                return("absence");
            }
            if (GetTotalAbsenceDuration(entrance, workingHour) > 0)
            {
                return("shortage of work time");
            }

            return("-");
        }
Exemplo n.º 7
0
        private double GetDismissalAbsenceDuration(PersonnelEntrance entrance)
        {
            double dismissalDuration = 0;

            var entranceDateDismissal = GetEntranceDateDismissal(entrance);

            if (entranceDateDismissal != null)
            {
                dismissalDuration = GetDismissalDuration(entranceDateDismissal);
            }
            double dismissalEntranceDuration = GetDismissalEntranceDuration(entrance);

            return(dismissalDuration > dismissalEntranceDuration ? 0 : dismissalEntranceDuration - dismissalDuration);
        }
Exemplo n.º 8
0
        private double GetDutyAbsenceDuration(PersonnelEntrance entrance)
        {
            double dutyDuration = 0;

            var entranceDateDuty = GetEntranceDateDuty(entrance);

            if (entranceDateDuty != null)
            {
                dutyDuration = GetDutyDuration(entranceDateDuty);
            }
            double dutyEntranceDuration = GetDutyEntranceDuration(entrance);

            return(dutyDuration > dutyEntranceDuration ? 0 : dutyEntranceDuration - dutyDuration);
        }
Exemplo n.º 9
0
        public OperationType GetOperationType(PersonnelEntrance entrance)
        {
            if ((entrance.AutoEnter && entrance.AutoExit) ||
                (entrance.AutoEnter && !entrance.Exit.HasValue))
            {
                if (IsDailyDismissalOrDutyDay(entrance))
                {
                    return(OperationType.OnDutyOrDismissal);
                }

                return(OperationType.Absent);
            }
            return(OperationType.Present);
        }
Exemplo n.º 10
0
        private double CalcOperationTime(PersonnelEntrance entrance, WorkingHour workingHour)
        {
            if (!entrance.ExitDate.HasValue || !entrance.Exit.HasValue)
            {
                return(0);
            }
            var exit = entrance.Exit.Value <= workingHour.ToTime ? entrance.Exit.Value
                    : workingHour.ToTime;
            var enter = entrance.Enter >= workingHour.FromTime ? entrance.Enter
                : workingHour.FromTime;

            var exitDate  = entrance.ExitDate.Value.Date.Add(exit);
            var enterDate = entrance.EnterDate.Date.Add(enter);

            return((exitDate - enterDate).TotalSeconds
                   - GetWorkingHourBreakTimes(entrance, workingHour));
        }
Exemplo n.º 11
0
        public double GetRushDuration(PersonnelEntrance entrance, WorkingHour workingHour)
        {
            //check exit
            if (!entrance.ExitDate.HasValue || !entrance.Exit.HasValue)
            {
                return(0);
            }

            double rush = 0;

            //if entrance has rush
            if (!entrance.AutoExit &&
                (workingHour.ToTime - entrance.Exit.Value).TotalSeconds > workingHour.DailyRush)
            {
                //default
                rush = (workingHour.ToTime - entrance.Exit.Value).TotalSeconds;

                //check dismissal
                var dismissalTimePeriod = GetStartAndEndOfDismissal(entrance);
                //check duty
                var dutyTimePeriod = GetStartAndEndOfDuty(entrance);
                //entrance exit
                var exit = entrance.ExitDate.Value.Add(entrance.Exit.Value);
                if (dismissalTimePeriod != null)
                {
                    if (exit >= dismissalTimePeriod.Start && exit <= dismissalTimePeriod.End)
                    //dismissal fills the gap
                    {
                        rush = 0;
                    }
                }
                if (dutyTimePeriod != null)
                {
                    if (exit >= dutyTimePeriod.Start && exit <= dutyTimePeriod.End)
                    //dismissal fills the gap
                    {
                        rush = 0;
                    }
                }
            }

            return(rush);
        }
Exemplo n.º 12
0
        public double GetLaterExtraWorkDuration(PersonnelEntrance entrance, WorkingHour workingHour)
        {
            //check exit
            if (!entrance.ExitDate.HasValue || !entrance.Exit.HasValue)
            {
                return(0);
            }

            double laterExtraWork = 0;

            if (!IsAbsent(entrance))
            {
                laterExtraWork = (entrance.Exit.Value - workingHour.ToTime).TotalSeconds > 0
                        ? (entrance.Exit.Value - workingHour.ToTime).TotalSeconds : 0;
            }

            return(laterExtraWork > workingHour.LaterExtraWorkTime
                ? workingHour.LaterExtraWorkTime : laterExtraWork);
        }
Exemplo n.º 13
0
        public double GetOperationTime(PersonnelEntrance entrance, WorkingHour workingHour
                                       , bool forceCalculate = false)
        {
            if (forceCalculate)
            {
                return(CalcOperationTime(entrance, workingHour));
            }

            var operationType = GetOperationType(entrance);

            switch (operationType)
            {
            case OperationType.OnDutyOrDismissal:
            case OperationType.Absent:
                return(0);

            default:     //present
                return(CalcOperationTime(entrance, workingHour));
            }
        }
Exemplo n.º 14
0
        private TimePeriod GetStartAndEndOfDuty(PersonnelEntrance entrance)
        {
            var personnelDutyEntrance = GetPersonnelDutyEntrance(entrance);

            if (personnelDutyEntrance != null) //recorded
            {
                return(new TimePeriod
                           (personnelDutyEntrance.StartDate.Add(personnelDutyEntrance.Start)
                           , personnelDutyEntrance.EndDate.Value.Add(personnelDutyEntrance.End.Value)));
            }
            else //system
            {
                var personnelDuty = GetEntranceDateDuty(entrance);
                if (personnelDuty != null)
                {
                    switch (personnelDuty.DutyDuration)
                    {
                    case RequestDuration.Daily:
                        var daily = (personnelDuty as PersonnelDailyDuty);
                        if (daily.FromDate == entrance.EnterDate)
                        {
                            return(new TimePeriod
                                       (daily.FromDate, daily.ToDate));
                        }
                        break;

                    case RequestDuration.Hourly:
                        var hourly = (personnelDuty as PersonnelHourlyDuty);
                        if (hourly.Date == entrance.EnterDate)
                        {
                            return(new TimePeriod
                                       (hourly.Date.Add(hourly.FromTime), hourly.Date.Add(hourly.ToTime)));
                        }
                        break;
                    }
                }
            }
            return(null);
        }
Exemplo n.º 15
0
        private bool IsDailyDismissalOrDutyDay(PersonnelEntrance entrance)
        {
            //if entrance is daily dismissal or duty
            var personnelDismissal = GetEntranceDateDismissal(entrance);

            if (personnelDismissal != null)
            {
                if (personnelDismissal.DismissalDuration == RequestDuration.Daily)
                {
                    return(true);
                }
            }
            var personnelDuty = GetEntranceDateDuty(entrance);

            if (personnelDuty != null)
            {
                if (personnelDuty.DutyDuration == RequestDuration.Daily)
                {
                    return(true);
                }
            }
            return(false);
        }
Exemplo n.º 16
0
        public double GetTotalAbsenceDuration(PersonnelEntrance entrance, WorkingHour workingHour
                                              , bool forceDutyOrDismissalDay = false)
        {
            double absenceDuration = 0;

            //if entrance is daily dismissal or duty
            if (forceDutyOrDismissalDay || IsDailyDismissalOrDutyDay(entrance))
            {
                return(absenceDuration);
            }
            //otherwise
            if (IsAbsent(entrance))
            {
                absenceDuration = GetOperationTime(entrance, workingHour, forceCalculate: true);
            }
            else
            {
                absenceDuration = GetRushDuration(entrance, workingHour)
                                  + GetDelayDuration(entrance, workingHour)
                                  + GetDutyAbsenceDuration(entrance)
                                  + GetDismissalAbsenceDuration(entrance);
            }
            return(absenceDuration);
        }
Exemplo n.º 17
0
        public double GetDelayDuration(PersonnelEntrance entrance, WorkingHour workingHour)
        {
            double delay = 0;

            //if entrance has delay
            if (!entrance.AutoEnter &&
                (entrance.Enter - workingHour.FromTime).TotalSeconds > workingHour.DailyDelay)
            {
                //default
                delay = (entrance.Enter - workingHour.FromTime).TotalSeconds;

                //check dismissal
                var dismissalTimePeriod = GetStartAndEndOfDismissal(entrance);
                //check duty
                var dutyTimePeriod = GetStartAndEndOfDuty(entrance);
                //entrance enter
                var enter = entrance.EnterDate.Add(entrance.Enter);
                if (dismissalTimePeriod != null)
                {
                    if (enter >= dismissalTimePeriod.Start && enter <= dismissalTimePeriod.End)
                    //dismissal fills the gap
                    {
                        delay = 0;
                    }
                }
                if (dutyTimePeriod != null)
                {
                    if (enter >= dutyTimePeriod.Start && enter <= dutyTimePeriod.End)
                    //duty fills the gap
                    {
                        delay = 0;
                    }
                }
            }
            return(delay);
        }
Exemplo n.º 18
0
        public PersonnelDismissal GetEntranceDateDismissal(PersonnelEntrance entrance)
        {
            PersonnelDismissal personDismissal = null;

            var personDismissals = _personnelDismissalRepository
                                   .Get(q => q.PersonnelId == entrance.PersonnelId &&
                                        q.ActionDate.HasValue &&
                                        q.RequestAction == RequestAction.Accept
                                        , includeProperties: "Dismissal")
                                   .OrderByDescending(o => o.ActionDate).ToList();

            foreach (var item in personDismissals)
            {
                if (personDismissal != null)
                {
                    break;
                }
                switch (item.DismissalDuration)
                {
                case RequestDuration.Daily:
                    if ((item as PersonnelDailyDismissal).FromDate == entrance.EnterDate)
                    {
                        personDismissal = item;
                    }
                    break;

                case RequestDuration.Hourly:
                    if ((item as PersonnelHourlyDismissal).Date == entrance.EnterDate)
                    {
                        personDismissal = item;
                    }
                    break;
                }
            }
            return(personDismissal);
        }
Exemplo n.º 19
0
 public bool IsAbsent(PersonnelEntrance entrance)
 {
     return(GetOperationType(entrance) == OperationType.Absent);
 }
Exemplo n.º 20
0
 public bool EntranceHasDelay(PersonnelEntrance entrance, WorkingHour workingHour)
 {
     return(entrance.Enter > workingHour.FromTime
            .Add(TimeSpan.FromSeconds(workingHour.DailyDelay)));
 }
Exemplo n.º 21
0
        private double GetWorkingHourBreakTimes(PersonnelEntrance entrance, WorkingHour workingHour)
        {
            if (!entrance.ExitDate.HasValue || !entrance.Exit.HasValue)
            {
                return(0);
            }

            var exitDate  = entrance.ExitDate.Value.Date.Add(entrance.Exit.Value);
            var enterDate = entrance.EnterDate.Date.Add(entrance.Enter);

            int duration = 0;

            switch (workingHour.WorkingHourDuration)
            {
            case WorkingHourDuration.OneDay:
                duration = 0;
                break;

            case WorkingHourDuration.TwoDays:
                duration = 1;
                break;

            case WorkingHourDuration.ThreeDays:
                duration = 2;
                break;
            }

            double totalBreakTime = 0;

            if (workingHour.MealTimeBreakToTime.HasValue && workingHour.MealTimeBreakFromTime.HasValue)
            {
                for (int i = 0; i <= duration; i++)
                {
                    if (exitDate >= entrance.EnterDate.AddDays(i).Add(workingHour.MealTimeBreakToTime.Value) &&
                        enterDate <= entrance.EnterDate.AddDays(i).Add(workingHour.MealTimeBreakFromTime.Value))
                    {
                        totalBreakTime += (workingHour.MealTimeBreakToTime - workingHour.MealTimeBreakFromTime)
                                          .Value.TotalSeconds;
                    }
                }
            }
            if (workingHour.Break1ToTime.HasValue && workingHour.Break1FromTime.HasValue)
            {
                for (int i = 0; i <= duration; i++)
                {
                    if (exitDate >= entrance.EnterDate.AddDays(i).Add(workingHour.Break1ToTime.Value) &&
                        enterDate <= entrance.EnterDate.AddDays(i).Add(workingHour.Break1FromTime.Value))
                    {
                        totalBreakTime += (workingHour.Break1ToTime - workingHour.Break1FromTime)
                                          .Value.TotalSeconds;
                    }
                }
            }
            if (workingHour.Break2ToTime.HasValue && workingHour.Break2FromTime.HasValue)
            {
                for (int i = 0; i <= duration; i++)
                {
                    if (exitDate >= entrance.EnterDate.AddDays(i).Add(workingHour.Break2ToTime.Value) &&
                        enterDate <= entrance.EnterDate.AddDays(i).Add(workingHour.Break2FromTime.Value))
                    {
                        totalBreakTime += (workingHour.Break2ToTime - workingHour.Break2FromTime)
                                          .Value.TotalSeconds;
                    }
                }
            }
            if (workingHour.Break3ToTime.HasValue && workingHour.Break3FromTime.HasValue)
            {
                for (int i = 0; i <= duration; i++)
                {
                    if (exitDate >= entrance.EnterDate.AddDays(i).Add(workingHour.Break3ToTime.Value) &&
                        enterDate <= entrance.EnterDate.AddDays(i).Add(workingHour.Break3FromTime.Value))
                    {
                        totalBreakTime += (workingHour.Break3ToTime - workingHour.Break3FromTime)
                                          .Value.TotalSeconds;
                    }
                }
            }
            return(totalBreakTime);
        }