#' 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
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.