public bool Delete(int timeEntryId, string userName)
        {
            var timeEntryById = GetRelatedTimeEntryById(timeEntryId);

            var timeEntryView = new TimeEntryView
            {
                ProjectId   = timeEntryById.ProjectId,
                MemberId    = timeEntryById.MemberId,
                TaskTypesId = timeEntryById.TaskTypesId,
                Date        = timeEntryById.Date
            };

            // Check if exists related entities.
            CheckRelatedEntities(timeEntryView, timeEntryById, userName, out var relatedMemberByName, out var relatedProjectById);

            // Check Lock TimeEntries: User cannot Create TimeEntry, if enable Lock TimeEntry in Project settings.
            CheckLockTimeEntryByProjectSettings(timeEntryView.Date, relatedProjectById);

            #region Delete TimeEntry from DB.

            try
            {
                Uow.TimeEntryRepository.Delete(timeEntryById.Id);
                Uow.Save();

                return(true);
            }
            catch (Exception e)
            {
                throw new CoralTimeDangerException("An error occurred while deleting the TimeEntry", e);
            }

            #endregion
        }
        public TimeEntryView Update(TimeEntryView timeEntryView, string userName)
        {
            var timeEntryById = GetRelatedTimeEntryById(timeEntryView.Id);

            // Check if exists related entities.
            CheckRelatedEntities(timeEntryView, timeEntryById, userName, out var relatedMemberByName, out var relatedProjectById);

            // Check Lock TimeEntries: User cannot Create TimeEntry, if enable Lock TimeEntry in Project settings.
            CheckLockTimeEntryByProjectSettings(timeEntryView.Date, relatedProjectById);

            // Check correct timing values from TimeEntryView.
            CheckCorrectTimingValues(timeEntryView.TimeFrom, timeEntryView.TimeTo, timeEntryView.Time);

            // Check that total time per day is not grater than 24 hours.
            CheckTotalTimeAtDay(relatedMemberByName, timeEntryView, timeEntryById);

            // Update values for TimeEntry.
            UpdateValuesForTimeEntry(timeEntryById, timeEntryView);

            #region Update TimeEntry in DB.

            try
            {
                Uow.TimeEntryRepository.Update(timeEntryById);
                Uow.Save();

                return(timeEntryById.GetViewTimeEntry(userName, Mapper));
            }
            catch (Exception e)
            {
                throw new CoralTimeDangerException("An error occurred while updating TimeEntry", e);
            }

            #endregion
        }
        public void Delete(int timeEntryId)
        {
            var timeEntryById = GetRelatedTimeEntryById(timeEntryId);

            var timeEntryView = new TimeEntryView
            {
                ProjectId   = timeEntryById.ProjectId,
                MemberId    = timeEntryById.MemberId,
                TaskTypesId = timeEntryById.TaskTypesId,
                Date        = timeEntryById.Date
            };

            // Check if exists related entities.
            CheckRelatedEntities(timeEntryView, timeEntryById, out var relatedMemberByName, out var relatedProjectById);

            // Check Lock TimeEntries: User cannot Create TimeEntry, if enable Lock TimeEntry in Project settings.
            var isOnlyMemberAtProject = !IsAdminOrManagerOfProject(ApplicationUserCurrent.IsAdmin, relatedMemberByName.Id, relatedProjectById.Id);

            CheckLockTimeEntryByProjectSettings(timeEntryView.Date, relatedProjectById, isOnlyMemberAtProject);

            #region Delete TimeEntry from DB.

            try
            {
                Uow.TimeEntryRepository.Delete(timeEntryById.Id);
                Uow.Save();
            }
            catch (Exception e)
            {
                throw new CoralTimeDangerException("An error occurred while deleting the TimeEntry", e);
            }

            #endregion
        }
Exemple #4
0
 public void AddUpdateEntry(TimeEntryView entryToSave, string userId)
 {
     try
     {
         var eventType   = EventTypes.Default;
         var peakerEvent = new PeakerEvent()
         {
             TimeStamp = DateTime.Now,
             UserId    = userId
         };
         if (entryToSave.id <= 0)
         {
             eventType = EventTypes.Created;
             var entryId = RetrieveSingleConvertible <int>(Constants.InsertTimeEntryProcedure, entryToSave.GetInsertParameters());
             if (entryId != int.MinValue)
             {
                 entryToSave.id = entryId;
             }
         }
         else
         {
             eventType = EventTypes.Updated;
             ExecuteNonQuery(Constants.UpdateTimeEntryProcedure, entryToSave.GetUpdateParameters());
         }
         peakerEvent.EventType = eventType;
         peakerEvent.ObjectId  = entryToSave.id;
         peakerEvent.Data      = entryToSave;
         ProcessHours(entryToSave, GetIsShiftWorker(entryToSave.userDetailId));
         new EventsAccess().SaveEvent(peakerEvent);
     }
     catch (Exception ex) {
         new EventsAccess().LogException(ex);
         throw;
     }
 }
        private void CheckTotalTimeAtDay(Member memberByName, TimeEntryView timeEntryView, TimeEntry timeEntryById = null)
        {
            var totalTimeForDay = Uow.TimeEntryRepository.GetQueryWithIncludes()
                                  .Where(tEntry => tEntry.MemberId == memberByName.Id && tEntry.Date.Date == timeEntryView.Date.Date)
                                  .Sum(tEntry => tEntry.TimeActual);

            var newTime = timeEntryView.TimeValues.TimeActual;
            var newDate = timeEntryView.Date;

            if (timeEntryById != null)
            {
                var oldTime = timeEntryById.TimeActual;
                var oldDate = timeEntryById.Date;

                if (oldDate != newDate)
                {
                    totalTimeForDay = totalTimeForDay + newTime;
                }
                else if (oldTime != newTime)
                {
                    totalTimeForDay = totalTimeForDay - oldTime + newTime;
                }
            }
            else
            {
                totalTimeForDay = totalTimeForDay + newTime;
            }

            if (totalTimeForDay > Constants.SecondsInThisDay)
            {
                throw new CoralTimeDangerException($"Total work time on the date {timeEntryView.Date} is greater than 24 hours");
            }
        }
        private static void UpdateValuesForTimeEntry(TimeEntry timeEntry, TimeEntryView timeEntryView)
        {
            #region #1. Update related entites.

            timeEntry.ProjectId   = timeEntryView.ProjectId;
            timeEntry.MemberId    = timeEntryView.MemberId;
            timeEntry.TaskTypesId = timeEntryView.TaskTypesId;

            #endregion

            #region #2. Update other values.

            timeEntry.Date = timeEntryView.Date.Date;

            timeEntry.TimeActual     = timeEntryView.TimeValues.TimeActual;
            timeEntry.TimeEstimated  = timeEntryView.TimeValues.TimeEstimated ?? 0;
            timeEntry.TimeFrom       = timeEntryView.TimeValues.TimeFrom ?? 0;
            timeEntry.TimeTo         = timeEntryView.TimeValues.TimeTo ?? 0;
            timeEntry.TimeTimerStart = timeEntryView.TimeOptions.TimeTimerStart;

            timeEntry.Description  = timeEntryView.Description;
            timeEntry.IsFromToShow = timeEntryView.TimeOptions.IsFromToShow;

            #endregion
        }
        private void CheckTotalTimeAtDay(Member memberByName, TimeEntryView timeEntryView, TimeEntry timeEntryById = null)
        {
            var totalTimeForDay = Uow.TimeEntryRepository.GetQueryWithIncludes()
                                  .Where(tEntry => tEntry.MemberId == memberByName.Id && tEntry.Date.Date == timeEntryView.Date.Date)
                                  .Sum(tEntry => tEntry.Time);

            var newTime = timeEntryView.Time;
            var newDate = timeEntryView.Date;

            if (timeEntryById != null)
            {
                var oldTime = timeEntryById.Time;
                var oldDate = timeEntryById.Date;

                if (oldDate != newDate)
                {
                    totalTimeForDay = totalTimeForDay + newTime;
                }
                else if (oldTime != newTime)
                {
                    totalTimeForDay = totalTimeForDay - oldTime + newTime;
                }
            }
            else
            {
                totalTimeForDay = totalTimeForDay + newTime;
            }

            //TODO return !(timeEntry.Time/3600 >= 24) && !(Math.Abs(timeEntry.TimeTo - timeEntry.TimeFrom) >= TimeSpan.FromDays(1).TotalSeconds);
            if (totalTimeForDay > Constants.SecondsInThisDay)
            {
                throw new CoralTimeDangerException($"Total work time on the date {timeEntryView.Date} is greater than 24 hours");
            }
        }
        private void CheckRelatedEntities(TimeEntryView timeEntryView, TimeEntry timeEntry, out Member relatedMemberByName, out Project relatedProjectById)
        {
            relatedMemberByName = MemberImpersonated;
            var isOnlyMemberAtProject = !IsAdminOrManagerOfProject(ApplicationUserCurrent.IsAdmin, MemberImpersonated.Id, timeEntry.ProjectId);

            relatedProjectById = GetRelatedProjectById(timeEntryView.ProjectId, isOnlyMemberAtProject);
            var relatedMemberById   = GetRelatedMemberById(timeEntryView.MemberId, isOnlyMemberAtProject);
            var relatedTaskTypeById = GetRetaledTaskTypeById(timeEntryView.TaskTypesId, isOnlyMemberAtProject);
        }
        private void CheckRelatedEntities(TimeEntryView timeEntryView, TimeEntry timeEntry, string userName, out Member relatedMemberByName, out Project relatedProjectById)
        {
            var relatedUserByName = GetRelatedUserByName(userName);

            relatedMemberByName = GetRelatedMemberByUserName(userName);

            IsOnlyMemberAtProject = !IsAdminOrManagerOfProject(relatedUserByName.IsAdmin, relatedMemberByName.Id, timeEntry.ProjectId);

            relatedProjectById = GetRelatedProjectById(timeEntryView.ProjectId, IsOnlyMemberAtProject);
            var relatedMemberById   = GetRelatedMemberById(timeEntryView.MemberId, IsOnlyMemberAtProject);
            var relatedTaskTypeById = GetRetaledTaskTypeById(timeEntryView.TaskTypesId, IsOnlyMemberAtProject);
        }
 public IHttpActionResult Post([FromBody] TimeEntryView entryToSave)
 {
     if (User.Identity != null)
     {
         new TimeEntryAccess().AddUpdateEntry(entryToSave, User.Identity.GetUserId());
         return(Ok());
     }
     else
     {
         return(Unauthorized());
     }
 }
Exemple #11
0
 public IActionResult Create([FromBody] TimeEntryView timeEntryView)
 {
     try
     {
         return(new JsonResult(_service.Create(timeEntryView, this.GetUserNameWithImpersonation())));
     }
     catch (Exception e)
     {
         _logger.LogWarning($"Create method with parameters ({timeEntryView});\n {e}");
         var errors = ExceptionsChecker.CheckTimeEntriesException(e);
         return(BadRequest(errors));
     }
 }
Exemple #12
0
        private void ProcessHours(TimeEntryView entryToSave, bool isShiftWorker)
        {
            //get all hour entries
            //iterate through each entry
            //for each entry
            // if entry total drives total over 8 hours
            // split entry into two parts
            //regular hours and
            bool    mondayThruFriday = (entryToSave.entryDate.DayOfWeek != DayOfWeek.Saturday && entryToSave.entryDate.DayOfWeek != DayOfWeek.Sunday);
            decimal threshold        = isShiftWorker && mondayThruFriday ? 10 : 8;

            var finalHours = new List <TimeEntryHours>();

            var hoursParams = GetSingleParameter("p_entryDate", entryToSave.entryDate.ToString("yyyy-MM-dd"));

            hoursParams.Add("p_userDetailId", entryToSave.userDetailId);
            hoursParams.Add("p_timeEntryIdToSkip", entryToSave.id);

            var hourEntries = Retrieve(TimeEntryHours.TimeEntryHoursFactory, Constants.GetHoursByDateProcedure, hoursParams).ToList();

            hourEntries = MergeRecords(hourEntries);
            hourEntries.Add(new TimeEntryHours()
            {
                Id          = int.MinValue,
                TimeEntryId = entryToSave.id,
                Duration    = entryToSave.userHours,
                HoursType   = HourTypes.Regular
            });

            var entryDay = entryToSave.entryDate.DayOfWeek;

            if (entryDay == DayOfWeek.Sunday)
            {
                foreach (var hourEntry in hourEntries)
                {
                    hourEntry.HoursType = HourTypes.DoubleTime;
                    finalHours.Add(hourEntry);
                }
            }
            else if (entryDay == DayOfWeek.Saturday)
            {
                finalHours = ProcessHoursForDay(hourEntries, threshold, HourTypes.Overtime, HourTypes.DoubleTime);
            }
            else
            {
                finalHours = ProcessHoursForDay(hourEntries, threshold, HourTypes.Regular, HourTypes.Overtime);
            }
            UpdateTimeEntryHours(finalHours);
        }
Exemple #13
0
        public IActionResult Update(int id, [FromBody] TimeEntryView timeEntryView)
        {
            timeEntryView.Id = id;

            try
            {
                return(new JsonResult(_service.Update(timeEntryView)));
            }
            catch (Exception e)
            {
                _logger.LogWarning($"Update method with parameters ({id}, {timeEntryView});\n {e}");
                var errors = ExceptionsChecker.CheckTimeEntriesException(e);
                return(BadRequest(errors));
            }
        }
Exemple #14
0
        private List <TimeEntryView> FillTimeEntryView(List <TimeEntry> entries)
        {
            var workCodeAccess = new WorkCodeAccess();
            var finalEntries   = new List <TimeEntryView>();

            foreach (var entry in entries)
            {
                var accountingName = RetrieveSingleConvertible <string>($@"SELECT AccountingName FROM peakertimemanagement.userdetail WHERE Id = {entry.UserDetailId};", null, false);
                entry.Hours = Retrieve(TimeEntryHours.TimeEntryHoursFactory, Constants.GetHoursForTimeEntryProcedure, entry.GetIdParameters()).ToList();
                var newEntry = new TimeEntryView(entry, accountingName);
                newEntry.hours = entry.Hours;
                var code = workCodeAccess.GetWorkCode(entry.WorkCodeId);
                code.isSelected   = true;
                newEntry.workCode = code;
                finalEntries.Add(newEntry);
            }
            return(finalEntries);
        }
        public TimeEntryView Patch(TimeEntryTime timeEntryTime, string userName)
        {
            var timeEntryById = GetRelatedTimeEntryById(timeEntryTime.Id);

            var timeEntryView = new TimeEntryView
            {
                ProjectId   = timeEntryById.ProjectId,
                MemberId    = timeEntryById.MemberId,
                TaskTypesId = timeEntryById.TaskTypesId,
                Date        = timeEntryById.Date
            };

            // Check if exists related entities.
            CheckRelatedEntities(timeEntryView, timeEntryById, userName, out var relatedMemberByName, out var relatedProjectById);

            // Check Lock TimeEntries: User cannot Create TimeEntry, if enable Lock TimeEntry in Project settings.
            CheckLockTimeEntryByProjectSettings(timeEntryView.Date, relatedProjectById);

            // Check correct timing values from TimeEntryView.
            CheckCorrectTimingValues(timeEntryTime.TimeFrom, timeEntryTime.TimeTo, timeEntryTime.Time);

            // Update values for TimeEntryTime.
            UpdateValuesForTimeEntryTime(timeEntryById, timeEntryTime);

            #region Update and Save entity to DB.

            try
            {
                Uow.TimeEntryRepository.Update(timeEntryById);
                Uow.Save();

                return(timeEntryById.GetViewTimeEntry(userName, Mapper));
            }
            catch (Exception e)
            {
                throw new CoralTimeDangerException("An error occurred while updating TimeEntry", e);
            }

            #endregion
        }
        public TimeEntryView Create(TimeEntryView timeEntryView)
        {
            var timeEntry = new TimeEntry();

            // Check if exists related entities.
            CheckRelatedEntities(timeEntryView, timeEntry, out var relatedMemberByName, out var relatedProjectById);

            // Check Lock TimeEntries: User cannot Create TimeEntry, if enable Lock TimeEntry in Project settings.
            var isOnlyMemberAtProject = !IsAdminOrManagerOfProject(ApplicationUserCurrent.IsAdmin, relatedMemberByName.Id, timeEntry.ProjectId);

            CheckLockTimeEntryByProjectSettings(timeEntryView.Date, relatedProjectById, isOnlyMemberAtProject);

            // Check correct timing values from TimeEntryView.
            CheckCorrectTimingValues(timeEntryView.TimeValues.TimeFrom, timeEntryView.TimeValues.TimeTo, timeEntryView.TimeValues.TimeActual);

            // Check that total time per day is not grater than 24 hours.
            CheckTotalTimeAtDay(relatedMemberByName, timeEntryView, timeEntry);

            // Update values for TimeEntry.
            UpdateValuesForTimeEntry(timeEntry, timeEntryView);

            #region Insert TimeEntry to DB.

            try
            {
                Uow.TimeEntryRepository.Insert(timeEntry);
                Uow.Save();

                var timeEntryWithUpdateRelatedEntities = Uow.TimeEntryRepository.LinkedCacheGetById(timeEntry.Id);
                return(timeEntryWithUpdateRelatedEntities.GetView(ImpersonatedUserName, Mapper));
            }
            catch (Exception e)
            {
                throw new CoralTimeDangerException("An error occurred while creating new TimeEntry", e);
            }

            #endregion
        }
Exemple #17
0
 public TimeEntryViewModel(TimeEntryView timeEntry)
 {
     _timeEntry = timeEntry;
 }
 public IActionResult Create([FromBody] TimeEntryView timeEntryView) => new JsonResult(_service.Create(timeEntryView));
 public IActionResult Update(int id, [FromBody] TimeEntryView timeEntryView)
 {
     timeEntryView.Id = id;
     return(new JsonResult(_service.Update(timeEntryView)));
 }
        public List <TimeEntryView> ImportCsv()
        {
            List <TimeEntryView> returnEntries = new List <TimeEntryView>();
            List <string>        rowErrors     = new List <string>();
            string userName = string.Empty;
            string baseCode = string.Empty;
            int    index    = 1;

            using (TextFieldParser parser = new TextFieldParser(ImportPath + ImportFileName))
            {
                parser.TextFieldType = FieldType.Delimited;
                parser.SetDelimiters(",");
                while (!parser.EndOfData)
                {
                    TimeEntryView view = new TimeEntryView();
                    //Processing row
                    string[] fields = parser.ReadFields();
                    if (fields[0].ToLower() == "username")
                    {
                        index++;
                        continue; //Header
                    }
                    userName = fields[0];
                    try
                    {
                        view.entryDate = DateTime.Parse(fields[1]);
                    }
                    catch
                    {
                        rowErrors.Add($"Unable to parse date for row {index}, row skipped.");
                        index++;
                        continue;
                    }
                    baseCode       = fields[2].Split('-')[0].Trim();
                    view.jobnumber = fields[3];
                    if (view.jobnumber != string.Empty)
                    {
                        if (view.jobnumber.Length != 5)
                        {
                            rowErrors.Add($"Jobnumber not 5 characters for row {index}, row skipped.");
                            index++;
                            continue;
                        }
                    }
                    try
                    {
                        view.userHours = decimal.Parse(fields[4]);
                    }
                    catch
                    {
                        rowErrors.Add($"Unable to parse hours for row {index}, row skipped.");
                        index++;
                        continue;
                    }
                    view.comments = fields[5];
                    try
                    {
                        view.userDetailId = RetrieveSingleConvertible <int>("getuserdetailidfromusername", GetSingleParameter("p_usernamne", userName));
                    }
                    catch (ArgumentOutOfRangeException ex)
                    {
                        rowErrors.Add($"Unable to determine userdetail id for username {userName} at row {index}, row skipped.");
                        index++;
                        continue;
                    }
                    try
                    {
                        view.workCodeId = RetrieveSingleConvertible <int>("getworkcodeidfrombasecode", GetSingleParameter("p_basecode", baseCode));
                    }
                    catch (ArgumentOutOfRangeException ex)
                    {
                        rowErrors.Add($"Unable to determine workcode id for basecode {baseCode} at row {index}, row skipped.");
                        index++;
                        continue;
                    }
                    returnEntries.Add(view);
                    index++;
                }
            }

            foreach (string error in rowErrors)
            {
                Console.WriteLine(error);
            }
            return(returnEntries);
        }
Exemple #21
0
 public void SetEntryExportedToNavision(TimeEntryView entry)
 {
     ExecuteNonQuery(Constants.SetExportedToNavisionProcedure, GetSingleParameter("p_timeEntryId", entry.id));
 }
Exemple #22
0
 private void ProcessShiftHours(TimeEntryView entryToSave)
 {
     throw new NotImplementedException();
 }