R/hours.R

#' Calculate Hours
#'
#' @param timesheet A \code{\link{timesheet}} data frame.
#' @param hours_per_day A double scalar of the number of hours per work day.
#' @return A list
#' @export
#'
#' @examples
#' pts_calc_hours(poistimesheets::timesheet)
pts_calc_hours <- function (timesheet, hours_per_day = 7.5) {
  check_timesheet(timesheet, nrow = TRUE)
  check_scalar(hours_per_day, c(0.1, 7.5))
  
  member <- select(timesheet, .data$Member) %>%
    distinct()
  
  date <- tibble(Date = seq(from = min(timesheet$Date), 
                            to = max(timesheet$Date), by = 1))
  
  weekdays <- pts_weekdays(from = min(timesheet$Date), to = max(timesheet$Date))
  
  total <- left_join(date, timesheet, by = "Date") %>%
    complete(.data$Date, .data$Member, fill = list(Hours = 0)) %>%
    group_by(.data$Member) %>%
    summarise(Hours = sum(.data$Hours), Weekdays = weekdays) %>%
    ungroup() %>%
    mutate(HoursPerDay = hours_per_day, 
           ExtraHours = .data$Hours - .data$Weekdays * .data$HoursPerDay) %>%
    select(.data$Member, .data$HoursPerDay, .data$Hours, .data$ExtraHours)

  vacation <- filter(timesheet, .data$Task %in% c("Vacation", "Statutory Holiday")) %>%
    group_by(.data$Member) %>%
    summarise(VacationDays = sum(.data$Hours)/hours_per_day) %>%
    ungroup() %>%
    right_join(member, by = "Member") %>%
    replace_na(replace = list(VacationDays = 0))
  
  leave <- filter(timesheet, .data$Task %in% c("Unpaid Leave")) %>%
    group_by(.data$Member) %>%
    summarise(UnpaidLeave = sum(.data$Hours)/hours_per_day) %>%
    right_join(member, by = "Member") %>%
    replace_na(replace = list(UnpaidLeave = 0))
  
  health <- filter(timesheet, .data$Task %in% c("Health Day", "Personal Day", "Health Leave")) %>%
    group_by(.data$Member) %>%
    summarise(HealthDays = sum(.data$Hours)/hours_per_day) %>%
    right_join(member, by = "Member") %>%
    replace_na(replace = list(HealthDays = 0))
  
  timesheet %<>% 
    filter(!.data$Task %in% c(
    "Vacation", "Statutory Holiday", "Unpaid Leave", "Health Day", "Personal Day", "Health Leave"))
  
  personal <- group_by(timesheet, .data$Member) %>%
    do(tibble(PersonalPaid = sum(.$Hours[.$Project %in% "Personal - Paid" | .$Task %in% c("Professional Development - Individual",
    "Software Development - Open Source - Individual")]) / sum(.$Hours))) %>%
    ungroup() %>%
    right_join(member, by = "Member") %>%
    replace_na(replace = list(PersonalPaid = 0))
  
  timesheet %<>% 
    filter(!.data$Project %in% "Personal - Paid",
           !.data$Task %in% c("Professional Development - Individual",
    "Software Development - Open Source - Individual", "Health Leave", "Unpaid"))

  billable <- group_by(timesheet, .data$Member, .data$Billable) %>%
    summarise(Hours = sum(.data$Hours)) %>%
    ungroup() %>%
    complete(.data$Member, .data$Billable, fill = list(Hours = 0)) %>%
    group_by(.data$Member) %>%
    do(tibble(Billable = .$Hours[.$Billable] / sum(.$Hours))) %>%
    right_join(member, by = "Member") %>%
    replace_na(replace = list(Billable = 0))
  
  all <- inner_join(total, vacation, by = "Member") %>%
    inner_join(leave, by = "Member") %>%
    inner_join(health, by = "Member") %>%
    inner_join(personal, by = "Member") %>%
    inner_join(billable, by = "Member")
  all
}
poissonconsulting/poistimesheets documentation built on Jan. 24, 2020, 4:54 a.m.