Skip to content
This repository has been archived by the owner on May 13, 2020. It is now read-only.

Commit

Permalink
Pull request #34 by @henriquelampert.
Browse files Browse the repository at this point in the history
This is the code from pull request #34 with very little refactory.
  • Loading branch information
rafaelivan committed Aug 28, 2014
1 parent a804c5b commit e83e868
Show file tree
Hide file tree
Showing 21 changed files with 478 additions and 10 deletions.
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.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
11 changes: 11 additions & 0 deletions app/assets/javascripts/partials/users.js.coffee
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)
7 changes: 5 additions & 2 deletions app/controllers/users_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,11 @@ 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,
:subscribed_to_user_summary_email]
if current_user.is_admin
user_attributes += [:is_admin, :is_active, :subscribed_to_admin_summary_email]
end
params.require(:user).permit(*user_attributes)
end

Expand Down
77 changes: 77 additions & 0 deletions app/mailers/user_mailer.rb
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
67 changes: 67 additions & 0 deletions app/models/report.rb
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
10 changes: 10 additions & 0 deletions app/models/user.rb
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ class User < ActiveRecord::Base
validates_uniqueness_of :email
validates_inclusion_of :is_admin, in: [true, false]
validates_inclusion_of :is_active, in: [true, false]
validate :only_admins_subscribe_to_admins_email, unless: :is_admin?

def active_for_authentication?
super && self.is_active
Expand All @@ -26,4 +27,13 @@ def inactive_message
self.is_active ? super : :deactivated
end

private

def only_admins_subscribe_to_admins_email
if !is_admin? && subscribed_to_admin_summary_email
errors.add(:subscribed_to_admin_summary_email,
"cannot be true for this user")
end
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? %>
<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 %>
Loading

0 comments on commit e83e868

Please sign in to comment.