Skip to content
Merged
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
44 changes: 23 additions & 21 deletions app/controllers/concerns/worktimes_csv.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,31 +12,33 @@ module WorktimesCsv

private

def send_worktimes_csv(worktimes, filename)
csv_data = worktimes_csv(worktimes)
send_csv(csv_data, filename)
end
# @param stripped: include/exclude internal description in csv
def send_worktimes_csv(worktimes, filename, stripped = false)
csv_data = CSV.generate do |csv|
csv << header(stripped)

def worktimes_csv(worktimes)
CSV.generate do |csv|
csv << ['Datum', 'Stunden', 'Von Zeit', 'Bis Zeit', 'CHF', 'Stundenansatz CHF', 'Reporttyp',
'Verrechenbar', 'Member', 'Position', 'Ticket', 'Bemerkungen', 'Interne Bemerkungen']
worktimes.each do |time|
csv << [I18n.l(time.work_date),
time.hours,
(time.start_stop? ? I18n.l(time.from_start_time, format: :time) : ''),
(time.start_stop? && time.to_end_time? ? I18n.l(time.to_end_time, format: :time) : ''),
amount(time),
offered_rate(time),
time.report_type,
time.billable,
time.employee.label,
time.account.label_verbose,
time.ticket,
time.description,
time.internal_description]
csv << row(time, stripped)
end
end

send_csv(csv_data, filename)
end

def header(stripped = false)
header = ['Datum', 'Stunden', 'Von Zeit', 'Bis Zeit', 'CHF', 'Stundenansatz CHF', 'Reporttyp',
'Verrechenbar', 'Member', 'Position', 'Ticket', 'Bemerkungen']
header << 'Interne Bemerkungen' unless stripped
header
end

def row(time, stripped = false)
data = [I18n.l(time.work_date), time.hours, (time.start_stop? ? I18n.l(time.from_start_time, format: :time) : ''),
(time.start_stop? && time.to_end_time? ? I18n.l(time.to_end_time, format: :time) : ''),
amount(time), offered_rate(time), time.report_type, time.billable, time.employee.label, time.account.label_verbose,
time.ticket, time.description]
data << time.internal_description unless stripped
data
end

def offered_rate(time)
Expand Down
3 changes: 2 additions & 1 deletion app/controllers/order_services_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,10 @@ def show
end

def export_worktimes_csv
stripped = params[:stripped] == 'true'
set_period
@worktimes = list_worktimes(@period).includes(:work_item)
send_worktimes_csv(@worktimes, worktimes_csv_filename)
send_worktimes_csv(@worktimes, worktimes_csv_filename, stripped)
end

def compose_report
Expand Down
7 changes: 5 additions & 2 deletions app/views/order_services/_actions.html.haml
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,11 @@
hidden: true,
data: { submit_form: '#worktimes' })

= action_link(action_icon('export', 'CSV Export'),
params.to_unsafe_h.merge(action: :export_worktimes_csv, only_path: true))
= action_link(action_icon('export', 'CSV Export ohne internen Bemerkungen'),
params.to_unsafe_h.merge(action: :export_worktimes_csv, stripped: true, only_path: true))

= action_link(action_icon('export', 'CSV Export mit internen Bemerkungen'),
params.to_unsafe_h.merge(action: :export_worktimes_csv, stripped: false, only_path: true))

= action_link(action_icon('time', 'Zeitrapport erstellen'),
params.to_unsafe_h.merge(action: :compose_report, only_path: true))
Expand Down
26 changes: 26 additions & 0 deletions test/controllers/order_services_controller_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,32 @@ class OrderServicesControllerTest < ActionController::TestCase
session[:list_params])
end

test 'GET export worktimes as csv without stripping internal description' do
get :export_worktimes_csv, params: { order_id: order.id, employee_id: employees(:pascal).id, stripped: false }

assert_response :success
assert_equal 'text/csv', @response.media_type

csv = CSV.parse(@response.body, headers: true)

assert_includes csv.headers, 'Interne Bemerkungen'
expected = worktimes(:wt_pz_puzzletime)
row = csv.first

assert_equal expected.internal_description, row['Interne Bemerkungen']
end

test 'GET export worktimes as csv and strip internal description' do
get :export_worktimes_csv, params: { order_id: order.id, employee_id: employees(:pascal).id, stripped: true }

assert_response :success
assert_equal 'text/csv', @response.media_type

csv = CSV.parse(@response.body, headers: true)

assert_not_includes csv.headers, 'Interne Bemerkungen'
end

%i[show export_worktimes_csv report].each do |action|
test "GET #{action} filtered by employee" do
get action, params: { order_id: order.id, employee_id: employees(:pascal).id }
Expand Down
1 change: 1 addition & 0 deletions test/fixtures/worktimes.yml
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ wt_pz_puzzletime:
type: Ordertime
billable: true
ticket: rc1
internal_description: 'Some sensitive data'

wt_pz_webauftritt:
id: 3
Expand Down
Loading