diff --git a/README.rdoc b/README.rdoc index c95e1de19..5d08eef78 100644 --- a/README.rdoc +++ b/README.rdoc @@ -77,24 +77,17 @@ If an apache passenger module is used then make sure the following settings are b) RailsAppSpawnerIdleTime 0 c) PassengerPreStart http://rails-app-url/ -Release Notes for 2.2 +Release Notes for 2.2.1 Features: - - Made compatible with Redmine 3.2.2. - - Clock-in and clock-out widget in all pages. - - Pagination in the report popup. - - Allow TE Admin to Delete entry in attendance. - - Hide Expense, Attendance and Reports modules. - - Configuration for Min/Max hours per week. - - Configuration for non submission mails to group of users. + - Made compatible with Redmine 3.3.0. + - Time & Expense report in Report module. + - Show the first clock in and last clock out of the day. + - Show the List page for view permission holder also. Bugs: - - Fixed Does not support other language Issue Id Validation Message. - - Fixed Log Time : Approved/submitted sheet don't allow time entry through edit issue screen. - - Fixed Show 'No record to display' if there is no record in attendance report. - - Fixed Mobile web compatibility. - - Fixed Min Hours Per Day : validation for Min Hours is less then Max Hours. - - Fixed Expense total does not show correctly in Deleted Projects. - - Fixed last day of the month not shown in the attendance report. - - Fixed Does not save expense amount greater then 100000. + - Fixed the clock in/out column shift error. + - Fixed the leave total hours bug in attendance list. + - Added permission logic for viewing expenses report. + - Left align the report header. Customization: For any Customization/Support, please contact us, our consulting team will be happy to help you diff --git a/app/controllers/wkattendance_controller.rb b/app/controllers/wkattendance_controller.rb index 50017e5ea..d3c7220a2 100644 --- a/app/controllers/wkattendance_controller.rb +++ b/app/controllers/wkattendance_controller.rb @@ -11,12 +11,13 @@ def index @status = params[:status] || 1 @groups = Group.all.sort sqlStr = "" - if !findLastAttnEntry.blank? - @lastAttnEntry = findLastAttnEntry[0] - end lastMonthStartDt = Date.civil(Date.today.year, Date.today.month, 1) << 1 if(Setting.plugin_redmine_wktime['wktime_leave'].blank?) - sqlStr = " select u.id as user_id, u.firstname, u.lastname, u.status, -1 as issue_id from users u where u.type = 'User' " + sqlStr = " select u.id as user_id, u.firstname, u.lastname, u.status, -1 as issue_id from users u" + if !params[:group_id].blank? + sqlStr = sqlStr + " left join groups_users gu on u.id = gu.user_id" + end + sqlStr = sqlStr + " where u.type = 'User' " else listboxArr = Setting.plugin_redmine_wktime['wktime_leave'][0].split('|') issueId = listboxArr[0] @@ -37,10 +38,7 @@ def index findBySql(sqlStr) end - def edit - if !findLastAttnEntry.blank? - @lastAttnEntry = findLastAttnEntry[0] - end + def edit sqlStr = getQueryStr + " where i.id in (#{getLeaveIssueIds}) and u.type = 'User' and u.id = #{params[:user_id]} order by i.subject" @leave_details = WkUserLeave.find_by_sql(sqlStr) render :action => 'edit' diff --git a/app/controllers/wkbase_controller.rb b/app/controllers/wkbase_controller.rb index 4ef56814e..88ea7d3f7 100644 --- a/app/controllers/wkbase_controller.rb +++ b/app/controllers/wkbase_controller.rb @@ -1,9 +1,7 @@ class WkbaseController < ApplicationController unloadable - def findLastAttnEntry - WkAttendance.find_by_sql("select a.* from wk_attendances a inner join ( select max(start_time) as start_time,user_id from wk_attendances where user_id = #{User.current.id} group by user_id ) vw on a.start_time = vw.start_time and a.user_id = vw.user_id order by a.start_time ") - end + def updateClockInOut if !findLastAttnEntry.blank? @@ -47,41 +45,5 @@ def addNewAttendance end wkattendance.user_id = User.current.id wkattendance.save() - end - - def computeWorkedHours(startTime,endTime, ishours) - currentEntryDate = startTime.localtime - workedHours = endTime-startTime - if !Setting.plugin_redmine_wktime['wktime_break_time'].blank? - Setting.plugin_redmine_wktime['wktime_break_time'].each_with_index do |element,index| - listboxArr = element.split('|') - breakStart = currentEntryDate.change({ hour: listboxArr[0], min:listboxArr[1], sec: '00' }) - breakEnd = currentEntryDate.change({ hour: listboxArr[2], min:listboxArr[3], sec: '00' }) - if(!(startTime>breakEnd || endTime < breakStart)) - if startTime < breakStart - if endTime < breakEnd - workedHours = workedHours - (endTime-breakStart) - else - workedHours = workedHours - (breakEnd-breakStart) - end - else - if endTime > breakEnd - workedHours = workedHours - (breakEnd-startTime) - else - workedHours = nil - end - end - end - end - end - if ishours - workedHours = (workedHours/1.hour).round(2) unless workedHours.blank? - end - workedHours - end - - def totalhours - dateStr = getConvertDateStr('start_time') - (WkAttendance.where("user_id = #{User.current.id} and #{dateStr} = '#{Time.now.strftime("%Y-%m-%d")}'").sum(:hours)).round(2) - end + end end diff --git a/app/controllers/wkexpense_controller.rb b/app/controllers/wkexpense_controller.rb index 0ff860e76..ae8059caa 100644 --- a/app/controllers/wkexpense_controller.rb +++ b/app/controllers/wkexpense_controller.rb @@ -66,9 +66,38 @@ def reportdetail @query = WkExpenseEntryQuery.build_from_params(params, :project => @project, :name => '_') sort_init(@query.sort_criteria.empty? ? [['spent_on', 'desc']] : @query.sort_criteria) sort_update(@query.sortable_columns) - scope = expense_entry_scope(:order => sort_clause). - includes(:project, :user, :issue). - preload(:issue => [:project, :tracker, :status, :assigned_to, :priority]) + set_managed_projects + projectid = -1 + ismanagedProject = false + currentProject = Project.where(:identifier => params[:project_id]) + if !currentProject.blank? + projectid = currentProject[0].id + end + projectids = '' + @manage_view_spenttime_projects.each{ |manageproject| + if projectids !='' + projectids += ', ' + end + projectids += manageproject.id.to_s + if projectid == manageproject.id + ismanagedProject = true + end + } + if (!@manage_view_spenttime_projects.blank? && ismanagedProject) || isAccountUser + scope = expense_entry_scope(:order => sort_clause). + includes(:project, :user, :issue). + preload(:issue => [:project, :tracker, :status, :assigned_to, :priority]) + else + cond ='' + if projectid > 0 + cond = "user_id = #{User.current.id} and project_id in (#{projectid}) " + elsif !@manage_view_spenttime_projects.blank? + cond = "project_id in (#{projectids}) " + else + cond = "user_id = #{User.current.id}" + end + scope = WkExpenseEntry.where(cond) + end respond_to do |format| format.html { @entry_count = scope.count @@ -108,27 +137,39 @@ def report def deleteEntry respond_to do |format| format.html { - delete(params[:id]) - flash[:notice] = l(:notice_successful_delete) + if delete(params[:id]) + flash[:notice] = l(:notice_successful_delete) + else + flash[:error] = l(:error_expense_entry_delete) + end redirect_to :action => 'reportdetail', :project_id => params[:project] } end end - def textfield_size - 6 - end + def textfield_size + 6 + end - def showClockInOut - false - end - def maxHourPerWeek - 0 - end + def showClockInOut + false + end + + def getNewCustomField + nil + end + + def getTELabel + l(:label_wk_expensesheet) + end + + def maxHourPerWeek + 0 + end - def minHourPerWeek - 0 - end + def minHourPerWeek + 0 + end private def getSpecificField "amount" @@ -183,10 +224,6 @@ def setValueForSpField(teEntry,spValue,decimal_separator,entry) teEntry.currency = getUnit(entry) end - def getNewCustomField - nil - end - def getWkEntity Wkexpense.new end @@ -200,7 +237,28 @@ def deleteWkEntity(cond) end def delete(ids) - WkExpenseEntry.delete(ids) + #WkExpenseEntry.delete(ids) + errMsg = false + @expense_entries = WkExpenseEntry.find_by_sql("SELECT * FROM wk_expense_entries w where id = #{ids} ;") + destroyed = WkExpenseEntry.transaction do + @expense_entries.each do |t| + status = getExpenseEntryStatus(t.spent_on, t.user_id) + if !status.blank? && ('a' == status || 's' == status || 'l' == status) + errMsg = false + else + errMsg = true + WkExpenseEntry.delete(ids) + end + end + end + errMsg + end + + def getExpenseEntryStatus(spent_on, user_id) + start_day = getStartDay(spent_on) + result = Wkexpense.where(['begin_date = ? AND user_id = ?', start_day, user_id]) + result = result[0].blank? ? 'n' : result[0].status + return result end def findTEEntries(ids) @@ -251,10 +309,6 @@ def expense_entry_scope(options={}) scope end - def getTELabel - l(:label_wk_expensesheet) - end - def findTEEntryBySql(query) WkExpenseEntry.find_by_sql(query) end diff --git a/app/controllers/wkreport_controller.rb b/app/controllers/wkreport_controller.rb index 925baffdb..4a11c6e66 100644 --- a/app/controllers/wkreport_controller.rb +++ b/app/controllers/wkreport_controller.rb @@ -10,54 +10,72 @@ class WkreportController < WkbaseController def index @groups = Group.sorted.all - if !findLastAttnEntry.blank? - @lastAttnEntry = findLastAttnEntry[0] - end + #scope = User.in_group( params[:group_id]) if !params[:group_id].blank? + #@members = scope.all if !scope.blank? + set_filter_session + retrieve_date_range + @members = Array.new + userList = getGroupMembers + userList.each do |users| + @members << [users.name,users.id.to_s()] + end + report #patched method + end + + def set_filter_session if params[:searchlist].blank? && session[:wkreport].nil? - session[:wkreport] = {:group_id => params[:group_id]} + session[:wkreport] = {:report_type => params[:report_type], :period_type => params[:period_type], :period => params[:period],:group_id => params[:group_id], :user_id => params[:user_id], :from => @from, :to => @to} elsif params[:searchlist] =='wkreport' + session[:wkreport][:report_type] = params[:report_type] + session[:wkreport][:period_type] = params[:period_type] + session[:wkreport][:period] = params[:period] session[:wkreport][:group_id] = params[:group_id] - end - retrieve_date_range - if params[:report_type] == 'attendance_report' - reportattn - elsif params[:report_type] == 'time_report' - time_rpt - #redirect_to :action => 'time_rpt', :controller => 'wktime' + session[:wkreport][:user_id] = params[:user_id] + session[:wkreport][:from] = params[:from] + session[:wkreport][:to] = params[:to] end end - def time_rpt - #@user = User.current - #@startday = getStartDay(Date.today) - #@entries = findEntries() - - #render :action => 'time_rpt', :controller => 'wktime', :layout => false - redirect_to :action => 'time_rpt', :controller => 'wktime' - end - def reportattn if !params[:group_id].blank? group_id = params[:group_id] else group_id = session[:wkreport][:group_id] end + if group_id.blank? group_id = 0 end + + if !params[:user_id].blank? + user_id = params[:user_id] + else + user_id = session[:wkreport][:user_id] + end + + if user_id.blank? + user_id = 0 + end + + unless @from.blank? + @from = Date.civil(@from.year,@from.month, 1) + @to = (@from >> 1) - 1 + end dateStr = getConvertDateStr('start_time') sqlStr = "" - userSqlStr = getUserQueryStr(group_id) + userSqlStr = getUserQueryStr(group_id,user_id) leaveSql = "select u.id as user_id, gu.group_id, i.id as issue_id, l.balance, l.accrual, l.used, l.accrual_on," + " lm.balance + lm.accrual - lm.used as open_bal from users u" + " left join groups_users gu on (gu.user_id = u.id and gu.group_id = #{group_id})" + " cross join (select id from issues where id in (#{getReportLeaveIssueIds})) i" + " left join (#{getLeaveQueryStr(@from,@to)}) l on l.user_id = u.id and l.issue_id = i.id" + " left join (#{getLeaveQueryStr(@from << 1,@from - 1)}) lm on lm.user_id = u.id and i.id = lm.issue_id" - if group_id.to_i > 0 + if group_id.to_i > 0 && user_id.to_i < 1 leaveSql = leaveSql + " Where gu.group_id is not null" + elsif user_id.to_i > 0 + leaveSql = leaveSql + " Where u.id = #{user_id}" end - if isAccountUser + if isAccountUser || User.current.admin? leave_entry = TimeEntry.where("issue_id in (#{getLeaveIssueIds}) and spent_on between '#{@from}' and '#{@to}'") sqlStr = "select user_id,#{dateStr} as spent_on,sum(hours) as hours from wk_attendances where #{dateStr} between '#{@from}' and '#{@to}' group by user_id,#{dateStr}" else @@ -89,7 +107,39 @@ def reportattn render :action => 'reportattn', :layout => false end - def getUserQueryStr(group_id) + def getMembersbyGroup + group_by_users="" + userList=[] + #set_managed_projects + userList = getGroupMembers + userList.each do |users| + group_by_users << users.id.to_s() + ',' + users.name + "\n" + end + respond_to do |format| + format.text { render :text => group_by_users } + end + end + + def getGroupMembers + userList = nil + group_id = nil + if (!params[:group_id].blank?) + group_id = params[:group_id] + else + group_id = session[:wkreport][:group_id] + end + + if !group_id.blank? && group_id.to_i > 0 + userList = User.in_group(group_id) + else + userList = User.order("#{User.table_name}.firstname ASC,#{User.table_name}.lastname ASC") + end + userList + end + + private + + def getUserQueryStr(group_id,user_id) queryStr = "select u.id , gu.group_id, u.firstname, u.lastname,cvt.value as termination_date, cvj.value as joining_date, " + "cvdob.value as date_of_birth, cveid.value as employee_id, cvdesg.value as designation from users u " + "left join groups_users gu on (gu.user_id = u.id and gu.group_id = #{group_id}) " + @@ -99,10 +149,13 @@ def getUserQueryStr(group_id) "left join custom_values cveid on (u.id = cveid.customized_id and cveid.custom_field_id = #{getSettingCfId('wktime_attn_employee_id_cf')} ) " + "left join custom_values cvdesg on (u.id = cvdesg.customized_id and cvdesg.custom_field_id = #{getSettingCfId('wktime_attn_designation_cf')} ) " + "where u.type = 'User' and (#{getConvertDateStr('cvt.value')} >= '#{@from}' or (u.status = #{User::STATUS_ACTIVE} and cvt.value is null))" - if group_id.to_i > 0 + if group_id.to_i > 0 && user_id.to_i < 1 queryStr = queryStr + " and gu.group_id is not null" + elsif user_id.to_i > 0 + queryStr = queryStr + " and u.id = #{user_id}" end - if !isAccountUser + + if !(isAccountUser || User.current.admin?) queryStr = queryStr + " and u.id = #{User.current.id} " end #queryStr = queryStr + " order by u.created_on" @@ -129,7 +182,7 @@ def getReportLeaveIssueIds def getLeaveQueryStr(from,to) queryStr = "select * from wk_user_leaves WHERE issue_id in (#{getLeaveIssueIds}) and accrual_on between '#{from}' and '#{to}'" - if !isAccountUser + if !(isAccountUser || User.current.admin?) queryStr = queryStr + " and user_id = #{User.current.id} " end queryStr @@ -139,10 +192,10 @@ def getLeaveQueryStr(from,to) def retrieve_date_range @free_period = false @from, @to = nil, nil - period_type = params[:period_type] - period = params[:period] - fromdate = params[:from] - todate = params[:to] + period_type = session[:wkreport][:period_type] + period = session[:wkreport][:period] + fromdate = session[:wkreport][:from] + todate = session[:wkreport][:to] if (period_type == '1' || (period_type.nil? && !period.nil?)) case period.to_s @@ -152,10 +205,17 @@ def retrieve_date_range when 'last_month' @from = Date.civil(Date.today.year, Date.today.month, 1) << 1 @to = (@from >> 1) - 1 + when 'current_week' + @from = getStartDay(Date.today - (Date.today.cwday - 1)%7) + @to = @from + 6 + when 'last_week' + @from =getStartDay(Date.today - 7 - (Date.today.cwday - 1)%7) + @to = @from + 6 end elsif period_type == '2' || (period_type.nil? && (!fromdate.nil? || !todate.nil?)) - begin; @from = Date.civil((fromdate.to_s.to_date).year,(fromdate.to_s.to_date).month, 1) unless fromdate.blank?; rescue; end - begin; @to = (@from >> 1) - 1 unless @from.blank?; rescue; end + begin; @from = fromdate.to_s.to_date unless fromdate.blank?; rescue; end #@from = Date.civil((fromdate.to_s.to_date).year,(fromdate.to_s.to_date).month, 1) + #begin; @to = (@from >> 1) - 1 unless @from.blank?; rescue; end + begin; @to = todate.to_s.to_date unless todate.blank?; rescue; end if @from.blank? @from = Date.civil(Date.today.year, Date.today.month, 1) @to = (@from >> 1) - 1 @@ -167,7 +227,8 @@ def retrieve_date_range @from = Date.civil(Date.today.year, Date.today.month, 1) @to = (@from >> 1) - 1 end - + session[:wkreport][:from] = @from + session[:wkreport][:to] = @to @from, @to = @to, @from if @from && @to && @from > @to end @@ -215,7 +276,7 @@ def check_perm_and_redirect def check_permission ret = false ret = params[:user_id].to_i == User.current.id - return (ret || isAccountUser) + return (ret || isAccountUser || User.current.admin?) end end diff --git a/app/controllers/wktime_controller.rb b/app/controllers/wktime_controller.rb index 80cf61075..22fa3ad64 100644 --- a/app/controllers/wktime_controller.rb +++ b/app/controllers/wktime_controller.rb @@ -4,7 +4,7 @@ class WktimeController < WkbaseController include WktimeHelper before_filter :require_login -before_filter :check_perm_and_redirect, :only => [:edit, :update] +before_filter :check_perm_and_redirect, :only => [:edit, :update, :destroy] # user without edit permission can't destroy before_filter :check_editperm_redirect, :only => [:destroy] before_filter :check_view_redirect, :only => [:index] before_filter :check_log_time_redirect, :only => [:new] @@ -21,7 +21,6 @@ def index unless user_custom_fields.blank? @query = WkTimeEntryQuery.build_from_params(params, :project => nil, :name => '_') end - set_filter_session retrieve_date_range @from = getStartDay(@from) @@ -37,9 +36,6 @@ def index status = session[:wktimes][:status] userfilter = getValidUserCF(session[:wktimes][:filters], user_custom_fields) end - if !findLastAttnEntry.blank? - @lastAttnEntry = findLastAttnEntry[0] - end unless userfilter.blank? || @query.blank? @query.filters = userfilter @@ -51,7 +47,8 @@ def index setMembers ids = nil if user_id.blank? - user_id = @currentUser_loggable_projects.blank? ? '-1' : User.current.id.to_s + user_id = (@currentUser_loggable_projects.blank? && @view_spenttime_projects.blank?) ? '-1' : User.current.id.to_s + #user_id = @currentUser_loggable_projects.blank? ? '-1' : User.current.id.to_s end #if user_id.blank? #ids = is_member_of_any_project() ? User.current.id.to_s : '0' @@ -100,9 +97,6 @@ def edit @editable = false if @locked set_edit_time_logs @entries = findEntries() - if !findLastAttnEntry.blank? - @lastAttnEntry = findLastAttnEntry[0] - end if !$tempEntries.blank? newEntries = $tempEntries - @entries if !newEntries.blank? @@ -381,9 +375,6 @@ def destroy def new set_user_projects - if !findLastAttnEntry.blank? - @lastAttnEntry = findLastAttnEntry[0] - end @selected_project = getSelectedProject(@manage_projects, true) # get the startday for current week @startday = getStartDay(Date.today) @@ -720,11 +711,11 @@ def getTracker tracker = getTrackerbyIssue(params[:issue_id]) settingstracker = Setting.plugin_redmine_wktime[getTFSettingName()] allowtracker = Setting.plugin_redmine_wktime['wktime_allow_user_filter_tracker'].to_i - if settingstracker != ["0"] - if ((["#{tracker}"] == settingstracker) || (tracker == '0')) + if settingstracker != ["0"] + if ((settingstracker.include?("#{tracker}")) || (tracker == '0')) ret = true end - else + else ret = true end @@ -939,13 +930,32 @@ def getTotalBreakTime end def time_rpt - @user = User.current - @startday = getStartDay(Date.today) - @entries = findEntries() + @user = (session[:wkreport][:user_id].blank? || (session[:wkreport][:user_id]).to_i < 1) ? User.current : User.find(session[:wkreport][:user_id]) + #@user = User.find(session[:wkreport][:user_id].blank? ? User.current.id : session[:wkreport][:user_id])#User.current + @startday = getStartDay((session[:wkreport][:from]).to_s.to_date) + #@entries = findEntries() render :action => 'time_rpt', :layout => false end + ############ Moved from private ############## + + def findEntries + setup + cond = getCondition('spent_on', @user.id, @startday, @startday+6) + findEntriesByCond(cond) + end + + def getNewCustomField + TimeEntry.new.custom_field_values + end + + def getTELabel + l(:label_wk_timesheet) + end + + ############ Moved from private ############## + def showClockInOut (!Setting.plugin_redmine_wktime['wktime_enable_clock_in_out'].blank? && Setting.plugin_redmine_wktime['wktime_enable_clock_in_out'].to_i == 1) && (!Setting.plugin_redmine_wktime['wktime_enable_attendance_module'].blank? && Setting.plugin_redmine_wktime['wktime_enable_attendance_module'].to_i == 1 ) @@ -1291,12 +1301,6 @@ def gatherAPIEntries errorMsg end - def findEntries - setup - cond = getCondition('spent_on', @user.id, @startday, @startday+6) - findEntriesByCond(cond) - end - def findWkTE(start_date, end_date=nil) setup cond = getCondition('begin_date', @user.nil? ? nil : @user.id, start_date, end_date) @@ -1628,8 +1632,8 @@ def set_managed_projects if isAccountUser @manage_view_spenttime_projects = getAccountUserProjects else - view_spenttime_projects ||= Project.where(Project.allowed_to_condition(User.current, :view_time_entries)).order('name') - @manage_view_spenttime_projects = @manage_projects & view_spenttime_projects + @view_spenttime_projects ||= Project.where(Project.allowed_to_condition(User.current, :view_time_entries)).order('name') + @manage_view_spenttime_projects = @manage_projects & @view_spenttime_projects end end @manage_view_spenttime_projects = setTEProjects(@manage_view_spenttime_projects) @@ -1893,11 +1897,6 @@ def sendRejectionEmail ActionMailer::Base.raise_delivery_errors = raise_delivery_errors_old end - - def getNewCustomField - TimeEntry.new.custom_field_values - end - def getWkEntity Wktime.new @@ -2071,10 +2070,6 @@ def set_filter_session session[:wkexpense][:group_id] = params[:group_id] session[:wkexpense][:filters] = @query.blank? ? nil : @query.filters end - end - - def getTELabel - l(:label_wk_timesheet) end def findTEEntryBySql(query) diff --git a/app/helpers/wkreport_helper.rb b/app/helpers/wkreport_helper.rb index d83a4ae74..0ec52050a 100644 --- a/app/helpers/wkreport_helper.rb +++ b/app/helpers/wkreport_helper.rb @@ -1,19 +1,20 @@ module WkreportHelper include WktimeHelper - def options_for_period_select + def options_for_period_select(value) options_for_select([ + [l(:label_this_week), 'current_week'], + [l(:label_last_week), 'last_week'], [l(:label_this_month), 'current_month'], [l(:label_last_month), 'last_month']], - 'current_month') + value.blank? ? 'current_week' : value) end - def options_for_report_select + def options_for_report_select(selectedRpt) options_for_select([ - [l(:label_wk_attendance), 'attendance_report']#, - #[l(:label_wktime), 'time_report'], - #[l(:label_wkexpense), 'expense_report'] - ], 'attendance_report') + [l(:label_wk_attendance), 'attendance_report'], + [l(:label_wk_timesheet), 'time_report'], + [l(:label_wk_expensesheet), 'expense_report']], selectedRpt) end end diff --git a/app/helpers/wktime_helper.rb b/app/helpers/wktime_helper.rb index 03349a029..0088b09b2 100644 --- a/app/helpers/wktime_helper.rb +++ b/app/helpers/wktime_helper.rb @@ -898,8 +898,10 @@ def populateWkUserLeaves #Accrual will be given only when the user works atleast 11 days a month if (entry.spent_hours.blank? || (!entry.spent_hours.blank? && entry.spent_hours < (defWorkTime * 11)) || !includeAccrual) accrual = 0 - end - no_of_holidays = entry.balance.blank? ? entry.accrual : entry.balance + entry.accrual + end + lastMntBalance = entry.balance.blank? ? 0 : entry.balance + lastMntAccrual = entry.accrual.blank? ? 0 : entry.accrual + no_of_holidays = lastMntBalance + lastMntAccrual #entry.balance.blank? ? entry.accrual : entry.balance + entry.accrual if !entry.used.blank? && entry.used > 0 no_of_holidays = no_of_holidays - entry.used end @@ -913,7 +915,7 @@ def populateWkUserLeaves userLeave.issue_id = entry.issue_id userLeave.balance = no_of_holidays userLeave.accrual = accrual - userLeave.used = entry.hours + userLeave.used = entry.hours.blank? ? 0 : entry.hours userLeave.accrual_on = Date.civil(Date.today.year, Date.today.month, 1) - 1 userLeave.save() end @@ -957,4 +959,44 @@ def getNonSubmissionUserIds end userIds end + + def findLastAttnEntry + WkAttendance.find_by_sql("select a.* from wk_attendances a inner join ( select max(start_time) as start_time,user_id from wk_attendances where user_id = #{User.current.id} group by user_id ) vw on a.start_time = vw.start_time and a.user_id = vw.user_id order by a.start_time ") + end + + def computeWorkedHours(startTime,endTime, ishours) + currentEntryDate = startTime.localtime + workedHours = endTime-startTime + if !Setting.plugin_redmine_wktime['wktime_break_time'].blank? + Setting.plugin_redmine_wktime['wktime_break_time'].each_with_index do |element,index| + listboxArr = element.split('|') + breakStart = currentEntryDate.change({ hour: listboxArr[0], min:listboxArr[1], sec: '00' }) + breakEnd = currentEntryDate.change({ hour: listboxArr[2], min:listboxArr[3], sec: '00' }) + if(!(startTime>breakEnd || endTime < breakStart)) + if startTime < breakStart + if endTime < breakEnd + workedHours = workedHours - (endTime-breakStart) + else + workedHours = workedHours - (breakEnd-breakStart) + end + else + if endTime > breakEnd + workedHours = workedHours - (breakEnd-startTime) + else + workedHours = nil + end + end + end + end + end + if ishours + workedHours = (workedHours/1.hour).round(2) unless workedHours.blank? + end + workedHours + end + + def totalhours + dateStr = getConvertDateStr('start_time') + (WkAttendance.where("user_id = #{User.current.id} and #{dateStr} = '#{Time.now.strftime("%Y-%m-%d")}'").sum(:hours)).round(2) + end end \ No newline at end of file diff --git a/app/views/wkattendance/edit.html.erb b/app/views/wkattendance/edit.html.erb index 7f4fac768..f9d1dc734 100644 --- a/app/views/wkattendance/edit.html.erb +++ b/app/views/wkattendance/edit.html.erb @@ -1,4 +1,3 @@ -<%= render :partial => 'wktime/attendance_widget' %> <%= form_tag({:controller => 'wkattendance', :action => 'update'}, :method => :post, :id => 'wkattendance_update') do %> <% lastAccrualOn = Date.civil(Date.today.year, Date.today.month, 1) -1 diff --git a/app/views/wkattendance/index.html.erb b/app/views/wkattendance/index.html.erb index 86cb3ab11..53b7c4947 100644 --- a/app/views/wkattendance/index.html.erb +++ b/app/views/wkattendance/index.html.erb @@ -8,5 +8,4 @@ <%= render_tabs time_expense_tabs %> <%= render :partial => 'attn_index' %> -<%= render :partial => 'wktime/attendance_widget' %> <% html_title(l(:label_ta)) -%> \ No newline at end of file diff --git a/app/views/wkexpense/edit.html.erb b/app/views/wkexpense/edit.html.erb index c0036a616..d112e8b15 100644 --- a/app/views/wkexpense/edit.html.erb +++ b/app/views/wkexpense/edit.html.erb @@ -1,4 +1,3 @@ -<%= render :partial => 'wktime/attendance_widget' %> <%= stylesheet_link_tag 'wk-time', :plugin => "redmine_wktime" %> <%= javascript_include_tag 'edit', :plugin => "redmine_wktime" %> diff --git a/app/views/wkexpense/index.html.erb b/app/views/wkexpense/index.html.erb index 7dce961ed..c71da8349 100644 --- a/app/views/wkexpense/index.html.erb +++ b/app/views/wkexpense/index.html.erb @@ -9,6 +9,5 @@ <%= render_tabs time_expense_tabs %> <%= render :partial => 'wktime/te_index' %> -<%= render :partial => 'wktime/attendance_widget' %> <% html_title(l(:label_ta)) -%> \ No newline at end of file diff --git a/app/views/wkexpense/new.html.erb b/app/views/wkexpense/new.html.erb index 3ccb15c4e..0b06e3e48 100644 --- a/app/views/wkexpense/new.html.erb +++ b/app/views/wkexpense/new.html.erb @@ -6,7 +6,6 @@

<%= l(:label_wkexpense) %>

-<%= render :partial => 'wktime/attendance_widget' %> <%= render :partial => 'wktime/te_new' %> diff --git a/app/views/wkexpense/reportdetail.html.erb b/app/views/wkexpense/reportdetail.html.erb index d73661ec0..def2496a0 100644 --- a/app/views/wkexpense/reportdetail.html.erb +++ b/app/views/wkexpense/reportdetail.html.erb @@ -5,7 +5,7 @@ <%= render :partial => 'date_range' %> <% end %>
-

<%= l(:label_total) %>: <%= html_hours("%.2f" % @total_hours) %>

+

<%= l(:label_total) %>: <%= "#{@total_hours == 0.0 ? '' : '$'}" %> <%= html_hours("%.2f" % @total_hours) %>

<% unless @entries.empty? %> diff --git a/app/views/wkreport/_date_range.html.erb b/app/views/wkreport/_date_range.html.erb index bee687c6f..4378162e8 100644 --- a/app/views/wkreport/_date_range.html.erb +++ b/app/views/wkreport/_date_range.html.erb @@ -2,10 +2,12 @@
<%= l(:label_date_range) %>
+<% period = session[:wkreport][:period] %>
<%= radio_button_tag 'period_type', '1', !@free_period, :onclick => '$("#from,#to").attr("disabled", true);$("#period").removeAttr("disabled");' %> -<%= select_tag 'period', options_for_period_select, +<%= select_tag 'period', options_for_period_select(period), :onfocus => '$("period_type_1").checked = true;', + :onchange => "javascript: openReportPopup();", :disabled => @free_period %>
diff --git a/app/views/wkreport/_report_index.html.erb b/app/views/wkreport/_report_index.html.erb index 76b5a132d..36f1b940e 100644 --- a/app/views/wkreport/_report_index.html.erb +++ b/app/views/wkreport/_report_index.html.erb @@ -2,26 +2,40 @@ <%= stylesheet_link_tag 'wk-time', :plugin => "redmine_wktime" %> <%= form_tag({:controller => controller_name, :action => 'index'}, :method => :get, :id => 'query_form') do %> <% + rpttype =session[:wkreport][:report_type] groupid =session[:wkreport][:group_id] + userid =session[:wkreport][:user_id] %>
- -<% if isAccountUser %> + + +<% if User.current.admin? || isAccountUser %> + -<% end %> + + +<% end %>
<%= l(:label_report) + " " + l(:field_type) %> <%= select_tag 'report_type', options_for_report_select, :style=> "width:200px;" %><%= select_tag 'report_type', options_for_report_select(rpttype),:onchange => "reportChanged(this, #{User.current.id});", :style=> "width:200px;" %>
<%=l(:label_group_plural)%> <%=h select_tag('group_id', options_for_select( [["",0]] + (@groups.collect {|p| [p.name, p.id ]}), - :selected => !groupid.nil? ? groupid.to_i: 0), :style=> "width:300px;") %> + :selected => !groupid.nil? ? groupid.to_i: 0), :onchange => "var reportDD = document.getElementById('report_type');var id = reportDD.options[reportDD.selectedIndex].value; + var needBlankOption = (id!='attendance_report' ? false : true) ; grpChanged(this, #{User.current.id}, needBlankOption);", :style=> "width:300px;") %> <%=l(:label_member)%> +<%# show the blank value if more than one user is in the list %> +<%=h select_tag('user_id', + options_for_select( [["All Users","0"]] + @members, + :selected => userid.nil? ? (@user.nil? ? User.current.id : @user.id) : userid), + :style=> "width:200px;") %>
<%= render :partial => 'wkreport/date_range' %> <%= hidden_field_tag "searchlist", "wkreport" %> diff --git a/app/views/wkreport/index.html.erb b/app/views/wkreport/index.html.erb index 02acc9f23..22696e977 100644 --- a/app/views/wkreport/index.html.erb +++ b/app/views/wkreport/index.html.erb @@ -8,5 +8,4 @@ <%= render_tabs time_expense_tabs %> <%= render :partial => 'report_index' %> -<%= render :partial => 'wktime/attendance_widget' %> <% html_title(l(:label_ta)) -%> \ No newline at end of file diff --git a/app/views/wkreport/reportattn.html.erb b/app/views/wkreport/reportattn.html.erb index 891484f30..861268483 100644 --- a/app/views/wkreport/reportattn.html.erb +++ b/app/views/wkreport/reportattn.html.erb @@ -34,7 +34,7 @@ <% if !@userlist.blank? %>
- diff --git a/app/views/wktime/_attendance.html.erb b/app/views/wktime/_attendance.html.erb index d48800003..ca106821e 100644 --- a/app/views/wktime/_attendance.html.erb +++ b/app/views/wktime/_attendance.html.erb @@ -15,11 +15,14 @@ <% previousStartDate == startDate.to_s.to_date.wday && startDate.to_s.to_date.wday != 0 ? $entryHours[startDate.to_s.to_date.wday] << ','+(entry.hours).to_s : $entryHours[startDate.to_s.to_date.wday] = (entry.hours).to_s %> <% previousStartDate = startDate.to_s.to_date.wday %> <% end %> - <% attnEntriesId = Array.new %> <% attnstarttime = Array.new %> <% attnendtime = Array.new %> <% hoursdiff = Array.new %> +<% $headerStartTime = Array.new %> +<% $headerEndTime = Array.new %> +<% $headerEntriesId = Array.new %> +<% $headerhoursdiff = Array.new %> <% st = Array.new %> <% disable = isAccountUser ? (User.current.id == @user.id ? !(!Setting.plugin_redmine_wktime[:wktime_own_approval].blank? && Setting.plugin_redmine_wktime[:wktime_own_approval].to_i == 1 ) : false) : true %> @@ -43,6 +46,10 @@ <% attnstarttime = ( entrydate.count((@startday + (i-1)).wday) != 0) ? $entryStartTime[(@startday + (i-1)).wday].split(",") : $entryStartTime[(@startday + (i-1)).wday] %> <% attnendtime = ( entrydate.count((@startday + (i-1)).wday) != 0) ? $entryEndTime[(@startday + (i-1)).wday].split(",") : $entryEndTime[(@startday + (i-1)).wday] %> <% hoursdiff = ( entrydate.count((@startday + (i-1)).wday) != 0) ? $entryHours[(@startday + (i-1)).wday].split(",") : $entryHours[(@startday + (i-1)).wday] %> + <% $headerStartTime[i] = (attnstarttime.blank? ? "" : attnstarttime) %> + <% $headerEndTime[i] = (attnendtime.blank? ? "" : attnendtime) %> + <% $headerEntriesId[i] = (attnEntriesId.blank? ? "" : attnEntriesId) %> + <% $headerhoursdiff[i] = (hoursdiff.blank? ? "" : hoursdiff) %>
<%= l(:label_wk_form_q) %>
<%= l(:label_wk_register_for_shops) %>

+
<%= l(:label_wk_form_q) %>
<%= l(:label_wk_register_for_shops) %>

<%= l(:label_wk_name_address) %>: <%= Setting.app_title %> <%= l(:label_month) %>: <%= @from.strftime("%B")%> <%= l(:label_year) %>: <%= @from.strftime("%Y")%>
diff --git a/app/views/wktime/_attendance_widget.html.erb b/app/views/wktime/_attendance_widget.html.erb index c3c5868d3..0b6cdd94b 100644 --- a/app/views/wktime/_attendance_widget.html.erb +++ b/app/views/wktime/_attendance_widget.html.erb @@ -1,4 +1,7 @@ -<%= javascript_include_tag 'edit', :plugin => "redmine_wktime" %> +<% wktime_helper = Object.new.extend(WktimeHelper) %> +<% if !wktime_helper.findLastAttnEntry.blank? + @lastAttnEntry = wktime_helper.findLastAttnEntry[0] + end %> <% if (!Setting.plugin_redmine_wktime['wktime_enable_clock_in_out'].blank? && Setting.plugin_redmine_wktime['wktime_enable_clock_in_out'].to_i == 1) && (!Setting.plugin_redmine_wktime['wktime_enable_attendance_module'].blank? && Setting.plugin_redmine_wktime['wktime_enable_attendance_module'].to_i == 1 ) %> <% if !@lastAttnEntry.blank? @@ -6,7 +9,7 @@ hideStart = true hideEnd = false imglabel = "end" - remaininghr = (controller.computeWorkedHours(@lastAttnEntry.start_time, Time.now.localtime, false)) + remaininghr = (wktime_helper.computeWorkedHours(@lastAttnEntry.start_time, Time.now.localtime, false)) else hideStart = false hideEnd = true @@ -18,23 +21,23 @@ end imgname = "#{imglabel}" == "start" ? "clockin1.jpg" : "clockout1.jpg" %> - <% totalhours = (controller.totalhours)*3600 %> + <% totalhours = (wktime_helper.totalhours)*3600 %> <% totalhours = (hideStart ? ( !remaininghr.blank? ? remaininghr.round(0)+totalhours : totalhours) : totalhours ) %> <% totalhours1 = Time.at(totalhours).utc.strftime("%H:%M:%S") %> - - + <% if User.current.logged? && wktime_helper.checkViewPermission %> + + +
+ <% strt_image_tg = image_tag("widgetclkin.jpg", :id => 'clockin' , :plugin => "redmine_wktime", :title => l(:label_clock_in), :style => hideStart ? "display:none;" : "display:block;" ) %> + <%= link_to strt_image_tg, "javascript:signAttendance('start');", {:id => "clock_start"} %> +
-
- <% strt_image_tg = image_tag("widgetclkin.jpg", :id => 'clockin' , :plugin => "redmine_wktime", :title => l(:label_clock_in), :style => hideStart ? "display:none;" : "display:block;" ) %> - <%= link_to strt_image_tg, "javascript:signAttendance('start');", {:id => "clock_start"} %> -
- -
- <% end_image_tg = image_tag("widgetclkout.jpg", :id => 'clockout', :plugin => "redmine_wktime", :title => l(:label_clock_out),:style => hideEnd ? "display:none;" : "display:block;" ) %> - <%= link_to end_image_tg, "javascript:signAttendance('end');", {:id => "clock_end"} %> -
- -
- <% end %> - +
+ <% end_image_tg = image_tag("widgetclkout.jpg", :id => 'clockout', :plugin => "redmine_wktime", :title => l(:label_clock_out),:style => hideEnd ? "display:none;" : "display:block;" ) %> + <%= link_to end_image_tg, "javascript:signAttendance('end');", {:id => "clock_end"} %> +
+ +
+ <% end %> + <% end %> \ No newline at end of file diff --git a/app/views/wktime/_worktime_header.html.erb b/app/views/wktime/_worktime_header.html.erb index efde37380..0fc10eae5 100644 --- a/app/views/wktime/_worktime_header.html.erb +++ b/app/views/wktime/_worktime_header.html.erb @@ -43,9 +43,9 @@
- <%=h text_field_tag( "#{str}_#{(i+1)}" , "#{str}" == "start" ? ( $entryStartTime[i] ? $entryStartTime[i].split(",").last(1) : '00:00') : ( $entryEndTime[i] ? $entryEndTime[i].split(",").last(1) : '00:00'),:size => 4, :disabled => true, :class => (@startday + i) < Date.today ? 'clock-textbox' : ((@startday + i) == Date.today ? 'clock-todaytextbox' : '' ), :onchange => "validateHr(this,#{(i+1)});") %> - <%=h hidden_field_tag('hd' + "#{str}_#{(i+1)}", !nightclkout ? ( $entryId[i] ? $entryId[i].split(",").last(1) : '') : ( $entryId[i-1] ? $entryId[i-1].split(",").last(1) : '') ) %> - <%=h hidden_field_tag('hours' + "#{str}_#{(i+1)}", ( $entryHours[i] ? $entryHours[i].split(",").last(1) : '0.0') ) %> + <%=h text_field_tag( "#{str}_#{(i+1)}" , "#{str}" == "start" ? ($headerStartTime[i+1].blank? ? '00:00' : $headerStartTime[i+1].first(1)) : ($headerEndTime[i+1].blank? ? '00:00' : $headerEndTime[i+1].last(1)),:size => 4, :disabled => true, :class => (@startday + i) < Date.today ? 'clock-textbox' : ((@startday + i) == Date.today ? 'clock-todaytextbox' : '' ), :onchange => "validateHr(this,#{(i+1)});") %> + <%=h hidden_field_tag('hd' + "#{str}_#{(i+1)}", !nightclkout ? ( $headerEntriesId[i+1].blank? ? '' : $headerEntriesId[i+1].last(1)) : ( $headerEntriesId[i].blank? ? '' : $headerEntriesId[i].last(1)) ) %> + <%=h hidden_field_tag('hours' + "#{str}_#{(i+1)}", ( $headerhoursdiff[i+1].blank? ? '' : $headerhoursdiff[i+1].last(1)) ) %>
<% if ("#{str}" == "start" || "#{str}" == "end") && controller.showClockInOut && (i == col_num) && User.current.id == @user.id %> diff --git a/app/views/wktime/edit.html.erb b/app/views/wktime/edit.html.erb index 3795e415e..184c12ba3 100644 --- a/app/views/wktime/edit.html.erb +++ b/app/views/wktime/edit.html.erb @@ -1,7 +1,5 @@ - <%= render :partial => 'attendance_widget' %> <%= stylesheet_link_tag 'wk-time', :plugin => "redmine_wktime" %> <%= javascript_include_tag 'edit', :plugin => "redmine_wktime" %> -