Skip to content
This repository was archived by the owner on May 13, 2020. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,6 @@

# Ignore user profile files
/.rvmrc
.DS_Store
.DS_Store

/config/smtp_config.yml
1 change: 1 addition & 0 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ gem 'devise', '~> 3.0.0.rc'
gem 'jbuilder'
gem 'gravatar_image_tag', '~> 1.1.3'
gem 'simple_form', '~> 3.0.0.beta1'
gem 'whenever'

# Heroku gems

Expand Down
5 changes: 5 additions & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ GEM
bootswatch-rails (0.4.0)
railties (>= 3.1)
builder (3.1.4)
chronic (0.10.2)
coffee-rails (4.0.1)
coffee-script (>= 2.2.0)
railties (>= 4.0.0, < 5.0)
Expand Down Expand Up @@ -138,6 +139,9 @@ GEM
json (>= 1.8.0)
warden (1.2.3)
rack (>= 1.0)
whenever (0.9.0)
activesupport (>= 2.3.4)
chronic (>= 0.6.3)
wirble (0.1.3)

PLATFORMS
Expand All @@ -163,4 +167,5 @@ DEPENDENCIES
simple_form (~> 3.0.0.beta1)
thin (~> 1.4.1)
uglifier (>= 1.0.3)
whenever
wirble (~> 0.1.3)
3 changes: 2 additions & 1 deletion app/assets/javascripts/application.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,5 @@
//= require partials/mask
//= require partials/timer
//= require partials/timesheet
//= require partials/reports
//= require partials/reports
//= require partials/users
7 changes: 7 additions & 0 deletions app/assets/javascripts/partials/users.js.coffee
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
jQuery ->
if $("#user_is_admin").is ":checked"
$("#subscription_to_admin").show()
else
$("#subscription_to_admin").hide()

$("#user_is_admin").change -> $("#subscription_to_admin").toggle()
10 changes: 8 additions & 2 deletions app/controllers/users_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,14 @@ def set_user

# Never trust parameters from the scary internet, only allow the white list through.
def user_params
user_attributes = [:name, :email, :password, :password_confirmation, :time_zone]
user_attributes += [:is_admin, :is_active] if current_user.is_admin
user_attributes = [:name, :email, :password, :password_confirmation, :time_zone,
:subscriber_to_user_summary_email]
if current_user.is_admin
user_attributes += [:is_admin, :is_active]
if params[:user][:is_admin].to_i == 1
user_attributes.push(:subscriber_to_admin_summary_email)
end
end
params.require(:user).permit(*user_attributes)
end

Expand Down
83 changes: 83 additions & 0 deletions app/mailers/user_mailer.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
class UserMailer < ActionMailer::Base
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Rename the following methods:

  • send_DAILY_summary_to_all_users
  • send_WEEKLY_summary_to_all_users
  • user_DAILY_summary_email
  • admin_DAILY_summary_email
  • user_WEEKLY_summary_email
  • admin_WEEKLY_summary_email

include TimesheetHelper
helper_method :hours_and_minutes

before_action :set_date

default from: "Cuckoo <#{SMTP_CONFIG[:from_email]}>"

def send_day_summary_to_all_subscribers

users = User.where(subscriber_to_user_summary_email: true)

users.each do |user|
user_day_summary_email(user).deliver
end

admins = User.where(subscriber_to_admin_summary_email: true)

admin_day_summary_email(admins).deliver

end

def send_week_summary_to_all_subscribers

users = User.where(subscriber_to_user_summary_email: true)

users.each do |user|
user_week_summary_email(user).deliver
end

admins = User.where(subscriber_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
68 changes: 68 additions & 0 deletions app/models/report.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
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
92 changes: 92 additions & 0 deletions app/views/user_mailer/_day_summary.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
<% if !summary[:day_entries].find_by(ended_at: nil).nil? %>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

filename: DAILY

<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 %>
65 changes: 65 additions & 0 deletions app/views/user_mailer/_week_summary.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
<!-- Table with week hours -->
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

filename: WEEKLY

<table>
<tr>
<% summary[:weekdays].each do |weekday| %>
<td style="text-align:center; color:#555">
<%= weekday.strftime('%A') %><br>
<span>(<%= hours_and_minutes(summary[:week_hours][weekday.day]) %>)</span>
</td>
<% end %>
<td style="text-align:center">
Total<br>
<span>(<%= hours_and_minutes(summary[:week_hours].values.sum) %>)</span>
</td>
</tr>
</table>

<% if summary[:time_summary].empty? %>
<br>
<div><%= t :no_time_entry %></div>
<% else %>
<!-- Table with time spent on each project and tasks -->
<table style="text-align:center">
<tbody>
<% summary[:time_summary].each do |project, info| %>
<tr>
<td style="text-align:left; min-width:250px">
<ul style="list-style-type:none; padding-left:0px">
<!-- Project | Task > Description -->
<li style="text-align:left; margin:0px">

<div style="font-size:1.25em; font-weight:bold">
<%= project %>
</div>

</li>

</ul>
</td>

<td>

<div style="font-size:1.25em; font-weight:bold">
<%= hours_and_minutes(info[:total]) %>
</div>

</td>

</tr>

<tr style="text-align:left">
<td style="padding-left:8px; max-width:450px">
<% info[:tasks].each do |task, duration| %>
<span div style="font-size:1em">
<%= task %> (<%= hours_and_minutes(duration) %>)
</span><br>
<% end %>
</td>
</tr>

<% end %><!-- end for day_entries loop -->

</tbody>

</table>
<% end %>
12 changes: 12 additions & 0 deletions app/views/user_mailer/admin_day_summary_email.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<!DOCTYPE html>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DAILY

<html>
<head>
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
</head>
<body>
<% @users.each do |user| %>
<h2><%= user.name %></h2>
<%= render 'day_summary', summary: Report.new(user).day_summary %>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"daily_summary"

<% end %>
</body>
</html>
Loading