diff --git a/app/controllers/concerns/worktimes_csv.rb b/app/controllers/concerns/worktimes_csv.rb index d5a7df42c..e75bde829 100644 --- a/app/controllers/concerns/worktimes_csv.rb +++ b/app/controllers/concerns/worktimes_csv.rb @@ -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) diff --git a/app/controllers/order_services_controller.rb b/app/controllers/order_services_controller.rb index e3a0b2439..42db3548e 100644 --- a/app/controllers/order_services_controller.rb +++ b/app/controllers/order_services_controller.rb @@ -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 diff --git a/app/views/order_services/_actions.html.haml b/app/views/order_services/_actions.html.haml index 4be2f0cec..d290a2ce5 100644 --- a/app/views/order_services/_actions.html.haml +++ b/app/views/order_services/_actions.html.haml @@ -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)) diff --git a/test/controllers/order_services_controller_test.rb b/test/controllers/order_services_controller_test.rb index 15ab41625..f8df595b3 100644 --- a/test/controllers/order_services_controller_test.rb +++ b/test/controllers/order_services_controller_test.rb @@ -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 } diff --git a/test/fixtures/worktimes.yml b/test/fixtures/worktimes.yml index 5f681e748..c53de7f94 100644 --- a/test/fixtures/worktimes.yml +++ b/test/fixtures/worktimes.yml @@ -47,6 +47,7 @@ wt_pz_puzzletime: type: Ordertime billable: true ticket: rc1 + internal_description: 'Some sensitive data' wt_pz_webauftritt: id: 3