This repository has been archived by the owner on May 13, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Pull request #34 by @henriquelampert.
This is the code from pull request #34 with very little refactory.
- Loading branch information
1 parent
a804c5b
commit e83e868
Showing
21 changed files
with
478 additions
and
10 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -17,4 +17,6 @@ | |
|
||
# Ignore user profile files | ||
/.rvmrc | ||
.DS_Store | ||
.DS_Store | ||
|
||
/config/smtp.yml |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
jQuery -> | ||
if $("#user_is_admin").is ":checked" | ||
$("#admin-summary-email-subscription").show() | ||
else | ||
$("#admin-summary-email-subscription").hide() | ||
|
||
$("#user_is_admin").change -> | ||
$("#admin-summary-email-subscription").toggle() | ||
if !$(this).is ":checked" | ||
admin_email_checkbox = $("#admin-summary-email-subscription").find("input:checkbox:first") | ||
admin_email_checkbox.prop("checked", false) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,77 @@ | ||
class UserMailer < ActionMailer::Base | ||
include TimesheetHelper | ||
helper_method :hours_and_minutes | ||
|
||
before_action :set_date | ||
|
||
default from: "Cuckoo <#{SMTP_CONFIG[:from_email]}>" if defined? SMTP_CONFIG | ||
|
||
def send_day_summary_to_all_subscribers | ||
users = User.where(subscribed_to_user_summary_email: true) | ||
|
||
users.each do |user| | ||
user_day_summary_email(user).deliver | ||
end | ||
|
||
admins = User.where(subscribed_to_admin_summary_email: true) | ||
admin_day_summary_email(admins).deliver | ||
end | ||
|
||
def send_week_summary_to_all_subscribers | ||
users = User.where(subscribed_to_user_summary_email: true) | ||
|
||
users.each do |user| | ||
user_week_summary_email(user).deliver | ||
end | ||
|
||
admins = User.where(subscribed_to_admin_summary_email: true) | ||
admin_week_summary_email(admins).deliver | ||
end | ||
|
||
def user_day_summary_email(user) | ||
@user = user | ||
subject = (@date.strftime('%b/%d')) + ' summary' | ||
mail(to: user.email, subject: subject, content: 'html', | ||
template_name: 'user_day_summary_email') | ||
end | ||
|
||
def admin_day_summary_email(recipients) | ||
@users = User.all | ||
subject = 'All users ' + @date.strftime('%b/%d') + ' summary' | ||
emails = get_emails_from(recipients) | ||
mail(to: emails, subject: subject, content: 'html', | ||
template_name: 'admin_day_summary_email') | ||
end | ||
|
||
def user_week_summary_email(user) | ||
@user = user | ||
subject = @date.at_beginning_of_week.strftime('%b/%d') \ | ||
+ ' to ' + @date.at_end_of_week.strftime('%b/%d') + ' summary' | ||
mail(to: user.email, subject: subject, content: 'html', | ||
template_name: 'user_week_summary_email') | ||
end | ||
|
||
def admin_week_summary_email(recipients) | ||
@users = User.all | ||
subject = 'All users ' + @date.at_beginning_of_week.strftime('%b/%d') \ | ||
+ ' to ' + @date.at_end_of_week.strftime('%b/%d') + ' summary' | ||
emails = get_emails_from(recipients) | ||
mail(to: emails, subject: subject, content: 'html', | ||
template_name: 'admin_week_summary_email') | ||
end | ||
|
||
private | ||
|
||
def set_date | ||
@date = Time.current.to_date | ||
end | ||
|
||
def get_emails_from(recipients) | ||
if (recipients.class == User) | ||
recipients.email | ||
else | ||
recipients.collect(&:email) | ||
end | ||
end | ||
|
||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
class Report | ||
|
||
def initialize(user) | ||
@user = user | ||
end | ||
|
||
def week_summary(date = Time.current.to_date) | ||
|
||
week_begin = date.at_beginning_of_week.at_midnight.gmtime | ||
week_end = date.at_end_of_week.at_midnight.gmtime | ||
entries = TimeEntry.where(user_id: @user.id) | ||
.where('started_at >= ? AND started_at < ?', week_begin, week_end) | ||
.includes(:project, :task) | ||
|
||
time_summary = {} | ||
entries.each do |time_entry| | ||
project = time_entry.project.name | ||
task = time_entry.task.name | ||
|
||
if (time_summary[project].nil?) | ||
time_summary[project] = {} | ||
time_summary[project][:total] = 0 | ||
time_summary[project][:tasks] = {} | ||
end | ||
|
||
if (time_summary[project][:tasks][task].nil?) | ||
time_summary[project][:tasks][task] = 0 | ||
end | ||
|
||
if (!time_entry.total_time.nil?) | ||
time_summary[project][:total] += time_entry.total_time | ||
time_summary[project][:tasks][task] += time_entry.total_time | ||
end | ||
|
||
end | ||
|
||
{ | ||
date: date, | ||
weekdays: week_days(date), | ||
week_hours: week_hours(date), | ||
time_summary: time_summary | ||
} | ||
|
||
end | ||
|
||
def day_summary(date = Time.current.to_date) | ||
{ | ||
date: date, | ||
weekdays: week_days(date), | ||
week_hours: week_hours(date), | ||
day_entries: day_entries(date) | ||
} | ||
end | ||
|
||
def week_hours(date = Time.current.to_date) | ||
Timesheet.new(@user).week_hours(date) | ||
end | ||
|
||
def week_days(date = Time.current.to_date) | ||
(date.at_beginning_of_week..date.at_end_of_week) | ||
end | ||
|
||
def day_entries(date = Time.current.to_date) | ||
Timesheet.new(@user).day_entries(date) | ||
end | ||
|
||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,92 @@ | ||
<% if !summary[:day_entries].find_by(ended_at: nil).nil? %> | ||
<h3> You have clock(s) still <span style="color:white; background-color:red">Running</span>!!! </h3> | ||
<% end %> | ||
|
||
<table> | ||
<tr> | ||
<% summary[:weekdays].each do |weekday| %> | ||
<td style="text-align:center;<%= (weekday.day == summary[:date].day) ? "font-weight:bold" : "color:#777" %>" > | ||
<%= weekday.strftime('%A') %><br> | ||
<span>(<%= hours_and_minutes(summary[:week_hours][weekday.day]) %>)</span> | ||
</td> | ||
<% end %> | ||
<td style="text-align:center; color:#777"> | ||
Total<br> | ||
<span>(<%= hours_and_minutes(summary[:week_hours].values.sum) %>)</span> | ||
</td> | ||
</tr> | ||
</table> | ||
|
||
<br> | ||
|
||
<% if summary[:day_entries].empty? %> | ||
<div><%= t :no_time_entry %></div> | ||
<% else %> | ||
<!-- Table with the time entries --> | ||
<table style="text-align:center"> | ||
<!-- Header of table with the time entries variables --> | ||
<thead> | ||
<tr> | ||
<th style="text-align:left">Activity</th> | ||
<th>Time</th> | ||
<th>Duration</th> | ||
</tr> | ||
</thead> | ||
<tbody> | ||
<% summary[:day_entries].each do |time_entry| %> | ||
<tr> | ||
<td style="text-align:left; min-width:10em"> | ||
<ul style="list-style-type:none; padding-left:0px"> | ||
|
||
<!-- Project | Task > Description --> | ||
<li style="text-align:left"> | ||
|
||
<div style="text-size:1.2em"> | ||
<% if time_entry.is_billable? %> | ||
<span style="background-color:blue; color:white">Billable</span> | ||
<% end %> | ||
<%= time_entry.project.name %><span> | </span><%= time_entry.task.name %> | ||
<% if time_entry.description.present? %><span>></span><% end %> | ||
</div> | ||
|
||
<% if time_entry.description.present? %> | ||
<div style="margin-left:8px"> | ||
<%= simple_format time_entry.description %> | ||
</div> | ||
<% end %> | ||
|
||
</li> | ||
|
||
</ul> | ||
</td> | ||
|
||
<td style="min-width:5em"> | ||
|
||
<!-- Started_at and Ended_at Time column --> | ||
<div style="text-size:1.2em"> | ||
<%= time_entry.started_at.strftime("%H:%M") %><br> | ||
<%= time_entry.ended_at.strftime("%H:%M") unless time_entry.ended_at.nil? %> | ||
</div> | ||
|
||
</td> | ||
|
||
<td> | ||
|
||
<!-- Duration column --> | ||
<div style="text-size:1.2em"> | ||
<% if !time_entry.ended_at.nil? %> | ||
<%= hours_and_minutes(time_entry.ended_at - time_entry.started_at) %> | ||
<% else %> | ||
<span style="background-color:red; color:white">Running</span> | ||
<% end %> | ||
</div> | ||
</td> | ||
|
||
</tr> | ||
|
||
<% end %><!-- end for day_entries loop --> | ||
|
||
</tbody> | ||
|
||
</table> | ||
<% end %> |
Oops, something went wrong.