timr 0.5.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0a52eda0ed77a6f73e3c0e039bc938fa21248a54
4
- data.tar.gz: a17fe3a693f1cf2a7c544b6212f405cb3ba42e1c
3
+ metadata.gz: 3948415c9078720d4fa8086cc8ce9c234ddd5e88
4
+ data.tar.gz: ee3a6ce0a660c31fb89a343d5e34ed8502e0c6eb
5
5
  SHA512:
6
- metadata.gz: 86632a136e85c82349380204a9e02d9ed9bea484ea634b85c44fed7af4ab1707470b85995c3cce4c8325562704826bb9bdf0aa526c283f3f83ed50705ad03458
7
- data.tar.gz: e9be4b7834949de95f9cfcdb77a8f279dbf23d448ae83219bd169a5fd96d2ae7d2b1c02b14035e706710ab7b00f9d3ed90b4e7859bf3ab81d69969de3b63505b
6
+ metadata.gz: 2e36359864dc8d6004ccc34176e77902e02c4a31e419423d4bc4f2c408ca4024b4e68459e40f6a52c18a2f60c11902c2f84d2da988864510145ce70c18b663aa
7
+ data.tar.gz: 377b2341c3f240d688fa8b4d4e4e61c597e85086c1e296fa3e3023b238a54f178d4a1b59528c346d3d82f8cef99b38b1ba1075c333d8c09f1754869ca4d65c9c
data/README.md CHANGED
@@ -158,6 +158,14 @@ Export Tasks and Tracks.
158
158
 
159
159
  See more informations on the [timr-report(1)](https://timr.fox21.at/man/timr-report.1.html) man page.
160
160
 
161
+ ### Reset Command
162
+
163
+ Remove current running Track.
164
+
165
+ timr reset [<options>]
166
+
167
+ See more informations on the [timr-reset(1)](https://timr.fox21.at/man/timr-reset.1.html) man page.
168
+
161
169
  ## Workflow Example
162
170
 
163
171
  Here is an example as shell commands how your workflow could look like while using Timr.
@@ -1,2 +1,3 @@
1
1
  dev
2
2
  dev_clean.sh
3
+ import
@@ -20,6 +20,7 @@ for file in \
20
20
  timr-pop.1.ronn \
21
21
  timr-push.1.ronn \
22
22
  timr-report.1.ronn \
23
+ timr-reset.1.ronn \
23
24
  timr-start.1.ronn \
24
25
  timr-status.1.ronn \
25
26
  timr-stop.1.ronn \
@@ -0,0 +1,57 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # Generate dev data.
4
+
5
+ SCRIPT_BASEDIR=$(dirname "$0")
6
+
7
+
8
+ set -e
9
+ cd "${SCRIPT_BASEDIR}/.."
10
+
11
+ cwd="tmp/dev"
12
+ mkdir -p "$cwd"
13
+
14
+ bundler exec ./bin/timr -C "$cwd" task add --id t1 -n t1
15
+ bundler exec ./bin/timr -C "$cwd" task add --id t2 -n t2
16
+ bundler exec ./bin/timr -C "$cwd" task add --id t3 -n t3
17
+ bundler exec ./bin/timr -C "$cwd" task add --id t4 -n t4
18
+
19
+ # Show Tasks
20
+ bundler exec ./bin/timr -C "$cwd" task show t1
21
+ bundler exec ./bin/timr -C "$cwd" task show t2
22
+ bundler exec ./bin/timr -C "$cwd" task show t3
23
+ bundler exec ./bin/timr -C "$cwd" task show t4
24
+
25
+ # Task 1
26
+ bundler exec ./bin/timr -C "$cwd" track add \
27
+ --start-date 2017-01-01 --start-time 01:00 \
28
+ --end-date 2017-01-01 --end-time 02:00 \
29
+ --billed \
30
+ -m 'task1_track1' t1
31
+
32
+ bundler exec ./bin/timr -C "$cwd" track add \
33
+ --start-date 2017-01-02 --start-time 01:00 \
34
+ --end-date 2017-01-02 --end-time 03:00 \
35
+ -m 'task1_track2' t1
36
+
37
+ # Task 3
38
+ bundler exec ./bin/timr -C "$cwd" track add \
39
+ --start-date 2017-01-03 --start-time 01:00 \
40
+ --end-date 2017-01-03 --end-time 03:00 \
41
+ -m 'task3_track1' t3
42
+
43
+ bundler exec ./bin/timr -C "$cwd" track add t3
44
+
45
+ # Task 4
46
+ bundler exec ./bin/timr -C "$cwd" track add \
47
+ --start-date 2017-01-04 --start-time 01:00 \
48
+ --end-date 2017-01-04 --end-time 04:00 \
49
+ -m 'task4_track1' t4
50
+
51
+ bundler exec ./bin/timr -C "$cwd" track add t4
52
+
53
+ bundler exec ./bin/timr -C "$cwd" start t4 -t 01:00
54
+ bundler exec ./bin/timr -C "$cwd" stop -t 02:00
55
+
56
+ bundler exec ./bin/timr -C "$cwd" start t1 -t 03:00
57
+ bundler exec ./bin/timr -C "$cwd" push t2
@@ -17,3 +17,5 @@ if [[ ! -f .env ]]; then
17
17
  fi
18
18
 
19
19
  bundler install
20
+
21
+ ./bin/dev_data.sh
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env bash
2
2
 
3
- # Run Unit Tests.
3
+ # Run all Tests.
4
4
 
5
5
  SCRIPT_BASEDIR=$(dirname "$0")
6
6
  RUBYOPT=-w
@@ -17,3 +17,5 @@ cd "${SCRIPT_BASEDIR}/.."
17
17
  grep -r -i taks lib man test && { echo 'ERROR: Wrong word found'; exit 1; } || true
18
18
 
19
19
  bundler exec ./test/suite_all.rb
20
+
21
+ ./bin/test_report.sh
@@ -0,0 +1,82 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # Test Report Command.
4
+
5
+ DATE=$(date +"%F_%H%M%S")
6
+ SCRIPT_BASEDIR=$(dirname "$0")
7
+
8
+
9
+ set -e
10
+ cd "${SCRIPT_BASEDIR}/.."
11
+ option=$1
12
+
13
+ mkdir -p tmp
14
+ tmpdir=$(mktemp -d tmp/test_report_XXXXX)
15
+ cwd="${tmpdir}/defaultc"
16
+ tasks_csv_file="${tmpdir}/tasks.csv"
17
+ tracks_csv_file="${tmpdir}/tracks.csv"
18
+
19
+ bundler exec ./bin/timr -C "$cwd" task add --id t1 -n t1 # full
20
+ bundler exec ./bin/timr -C "$cwd" task add --id t2 -n t2 # empty
21
+ bundler exec ./bin/timr -C "$cwd" task add --id t3 -n t3 # includes a normal track and empty track
22
+ bundler exec ./bin/timr -C "$cwd" task add --id t4 -n t4 # includes only an empty track
23
+
24
+ # Show Tasks
25
+ bundler exec ./bin/timr -C "$cwd" task show t1
26
+ bundler exec ./bin/timr -C "$cwd" task show t2
27
+ bundler exec ./bin/timr -C "$cwd" task show t3
28
+ bundler exec ./bin/timr -C "$cwd" task show t4
29
+
30
+ # Task 1
31
+ bundler exec ./bin/timr -C "$cwd" track add \
32
+ --start-date 2017-01-01 --start-time 01:00 \
33
+ --end-date 2017-01-01 --end-time 02:00 \
34
+ --billed \
35
+ -m 'task1_track1' t1
36
+
37
+ bundler exec ./bin/timr -C "$cwd" track add \
38
+ --start-date 2017-01-02 --start-time 01:00 \
39
+ --end-date 2017-01-02 --end-time 03:00 \
40
+ -m 'task1_track2' t1
41
+
42
+ # Task 2 empty
43
+
44
+ # Task 3
45
+ bundler exec ./bin/timr -C "$cwd" track add \
46
+ --start-date 2017-01-03 --start-time 01:00 \
47
+ --end-date 2017-01-03 --end-time 03:00 \
48
+ -m 'task3_track1' t3
49
+
50
+ bundler exec ./bin/timr -C "$cwd" track add t3
51
+
52
+ # Task 4
53
+ bundler exec ./bin/timr -C "$cwd" track add \
54
+ --start-date 2017-01-04 --start-time 01:00 \
55
+ --end-date 2017-01-04 --end-time 04:00 \
56
+ -m 'task4_track1' t4
57
+
58
+ bundler exec ./bin/timr -C "$cwd" track add t4
59
+
60
+ # Show Tasks
61
+ bundler exec ./bin/timr -C "$cwd" task show t1
62
+ bundler exec ./bin/timr -C "$cwd" task show t2
63
+ bundler exec ./bin/timr -C "$cwd" task show t3
64
+ bundler exec ./bin/timr -C "$cwd" task show t4
65
+
66
+ # Report to STDOUT.
67
+ bundler exec ./bin/timr -C "$cwd" report --tasks --all
68
+ bundler exec ./bin/timr -C "$cwd" report --tasks --all --billed
69
+ bundler exec ./bin/timr -C "$cwd" report --tasks --all --unbilled
70
+ bundler exec ./bin/timr -C "$cwd" report --tracks --all
71
+ bundler exec ./bin/timr -C "$cwd" report --tracks --all --billed
72
+ bundler exec ./bin/timr -C "$cwd" report --tracks --all --unbilled
73
+
74
+ # Report to files.
75
+ bundler exec ./bin/timr -C "$cwd" report --tasks --all --csv "${tasks_csv_file}"
76
+ bundler exec ./bin/timr -C "$cwd" report --tracks --all --csv "${tracks_csv_file}"
77
+
78
+ # Open under macOS.
79
+ if [[ "$option" = "-o" ]]; then
80
+ open "${tasks_csv_file}"
81
+ open "${tracks_csv_file}"
82
+ fi
@@ -12,6 +12,7 @@ function _timr_command {
12
12
  pop
13
13
  push
14
14
  report
15
+ reset
15
16
  start
16
17
  status
17
18
  stop
@@ -103,6 +104,8 @@ function _timr_report_main {
103
104
  --all
104
105
  --tasks
105
106
  --tracks
107
+ --billed
108
+ --unbilled
106
109
  --format
107
110
  --csv
108
111
  --force
@@ -110,6 +113,15 @@ function _timr_report_main {
110
113
  COMPREPLY=( $(compgen -W '${timr_commands[@]}' -- "${curr_word}") )
111
114
  }
112
115
 
116
+ function _timr_reset_main {
117
+ local curr_word=$1
118
+ local timr_commands=(
119
+ --help
120
+ --stack
121
+ )
122
+ COMPREPLY=( $(compgen -W '${timr_commands[@]}' -- "${curr_word}") )
123
+ }
124
+
113
125
  function _timr_start_main {
114
126
  local curr_word=$1
115
127
  local timr_commands=(
@@ -308,7 +320,7 @@ function _timr_main {
308
320
  fi
309
321
 
310
322
  case "${timr_command}" in
311
- continue|log|pause|pop|push|report|start|status|stop)
323
+ continue|log|pause|pop|push|report|reset|start|status|stop)
312
324
  "_timr_${timr_command}_main" "$curr_word"
313
325
  ;;
314
326
  task|track)
@@ -29,6 +29,7 @@ require 'timr/command/pause_command'
29
29
  require 'timr/command/pop_command'
30
30
  require 'timr/command/push_command'
31
31
  require 'timr/command/report_command'
32
+ require 'timr/command/reset_command'
32
33
  require 'timr/command/start_command'
33
34
  require 'timr/command/status_command'
34
35
  require 'timr/command/stop_command'
@@ -112,6 +112,8 @@ module TheFox
112
112
  command = TrackCommand
113
113
  when 'report'
114
114
  command = ReportCommand
115
+ when 'reset'
116
+ command = ResetCommand
115
117
  else
116
118
  raise CommandError, "'%s' is not a timr command. See 'timr --help'." % [name]
117
119
  end
@@ -189,7 +189,7 @@ module TheFox
189
189
  track_c,
190
190
  begin_datetime_s,
191
191
  end_datetime_s,
192
- duration ? duration.to_human : '---',
192
+ duration.to_human_s,
193
193
  task.id_foreign_or_short,
194
194
  '%s %s' % [track.short_id, track.title(15)],
195
195
  ]
@@ -219,7 +219,7 @@ module TheFox
219
219
  totals[:task_c],
220
220
  begin_datetime_s,
221
221
  end_datetime_s,
222
- duration ? duration.to_human : '---',
222
+ duration.to_human_s,
223
223
  task.id_foreign_or_short,
224
224
  '%s %s' % [track.short_id, track.title(15)],
225
225
  ]
@@ -237,7 +237,7 @@ module TheFox
237
237
  nil, # track_c
238
238
  totals[:begin_datetime_s],
239
239
  totals[:end_datetime_s],
240
- totals[:duration] ? totals[:duration].to_human : '---', # duration
240
+ totals[:duration].to_human_s, # duration
241
241
  'TOTAL', # task
242
242
  nil, # track
243
243
  ]
@@ -18,15 +18,14 @@ module TheFox
18
18
 
19
19
  def initialize(argv = Array.new)
20
20
  super()
21
- # puts "argv '#{argv}'"
22
21
 
23
22
  @help_opt = false
24
23
  @tasks_opt = false
25
24
  @tracks_opt = false
26
25
  @from_opt = nil
27
26
  @to_opt = nil
28
- # @billed_opt = false
29
- # @unbilled_opt = false
27
+ @billed_opt = false
28
+ @unbilled_opt = false
30
29
  @format_opt = nil
31
30
  @csv_opt = nil
32
31
  @force_opt = false
@@ -56,10 +55,10 @@ module TheFox
56
55
  when '-t', '--tracks'
57
56
  @tracks_opt = true
58
57
 
59
- # when '--billed'
60
- # @billed_opt = true
61
- # when '--unbilled'
62
- # @unbilled_opt = true
58
+ when '--billed'
59
+ @billed_opt = true
60
+ when '--unbilled'
61
+ @unbilled_opt = true
63
62
 
64
63
  when '--format'
65
64
  @format_opt = argv.shift
@@ -86,20 +85,20 @@ module TheFox
86
85
  @to_opt = Time.new(today.year, today.month, month_end.day, 23, 59, 59)
87
86
  end
88
87
 
89
- # @billed_resolved_opt = nil
90
- # if @billed_opt || @unbilled_opt
91
- # if @billed_opt
92
- # @billed_resolved_opt = true
93
- # elsif @unbilled_opt
94
- # @billed_resolved_opt = false
95
- # end
96
- # end
88
+ @billed_resolved_opt = nil
89
+ if @billed_opt || @unbilled_opt
90
+ if @billed_opt
91
+ @billed_resolved_opt = true
92
+ elsif @unbilled_opt
93
+ @billed_resolved_opt = false
94
+ end
95
+ end
97
96
 
98
97
  @filter_options = {
99
98
  :format => '%y-%m-%d %H:%M',
100
99
  :from => @from_opt,
101
100
  :to => @to_opt,
102
- # :billed => @billed_resolved_opt,
101
+ :billed => @billed_resolved_opt,
103
102
  }
104
103
  @csv_filter_options = {
105
104
  :format => '%F %T %z',
@@ -107,6 +106,14 @@ module TheFox
107
106
  :to => @to_opt,
108
107
  }
109
108
 
109
+ # Used by
110
+ # print_formatted_task_list
111
+ # print_formatted_track_list
112
+ @format_options = {
113
+ :format => @format_opt,
114
+ :billed => @billed_resolved_opt,
115
+ }
116
+
110
117
  if @csv_opt
111
118
  if @csv_opt == '-'
112
119
  # OK
@@ -224,9 +231,8 @@ module TheFox
224
231
  totals[:task_c],
225
232
  task.begin_datetime_s(@filter_options),
226
233
  task.end_datetime_s(@filter_options),
227
- duration.to_human,
228
- unbilled_duration.to_human,
229
- # tracks_c,
234
+ duration.to_human_s,
235
+ unbilled_duration.to_human_s,
230
236
  '%s %s' % [task.id_foreign_or_short, task.name(15)]
231
237
  ]
232
238
  end
@@ -242,9 +248,8 @@ module TheFox
242
248
  nil, # task_c
243
249
  totals[:begin_datetime_s],
244
250
  totals[:end_datetime_s],
245
- totals[:duration].to_human, # duration
246
- totals[:unbilled_duration].to_human, # duration
247
- # totals[:tracks_c],
251
+ totals[:duration].to_human_s, # duration
252
+ totals[:unbilled_duration].to_human_s, # duration
248
253
  'TOTAL', # task
249
254
  ]
250
255
 
@@ -256,9 +261,8 @@ module TheFox
256
261
  end
257
262
 
258
263
  def print_formatted_task_list
259
- puts 'print_formatted_task_list'
260
264
  filtered_tasks.each do |task|
261
- puts task.formatted(@format_opt)
265
+ puts task.formatted(@format_options)
262
266
  end
263
267
  end
264
268
 
@@ -321,7 +325,7 @@ module TheFox
321
325
  totals[:tracks_c],
322
326
  track.begin_datetime_s(@filter_options),
323
327
  track.end_datetime_s(@filter_options),
324
- duration.to_human,
328
+ duration.to_human_s,
325
329
  '%s' % [task.id_foreign_or_short],
326
330
  '%s %s' % [track.short_id, track.title(15)],
327
331
  ]
@@ -338,7 +342,7 @@ module TheFox
338
342
  nil, # task_c
339
343
  totals[:begin_datetime_s],
340
344
  totals[:end_datetime_s],
341
- totals[:duration].to_human, # duration
345
+ totals[:duration].to_human_s, # duration
342
346
  'TOTAL', # task
343
347
  nil, # track
344
348
  ]
@@ -351,9 +355,8 @@ module TheFox
351
355
  end
352
356
 
353
357
  def print_formatted_track_list
354
- puts 'print_formatted_track_list'
355
358
  @timr.tracks(@filter_options).each do |track_id, track|
356
- puts track.formatted(@format_opt)
359
+ puts track.formatted(@format_options)
357
360
  end
358
361
  end
359
362
 
@@ -478,7 +481,7 @@ module TheFox
478
481
  totals[:end_datetime] = edt
479
482
  end
480
483
 
481
- csv << [
484
+ row = [
482
485
  totals[:row_c],
483
486
 
484
487
  task.id,
@@ -488,21 +491,36 @@ module TheFox
488
491
  task.begin_datetime_s(@csv_filter_options),
489
492
  task.end_datetime_s(@csv_filter_options),
490
493
 
491
- duration ? duration.to_human : '---',
492
- duration ? duration.to_i : 0,
493
- estimation ? estimation.to_human : '---',
494
- estimation ? estimation.to_i : 0,
495
- remaining_time ? remaining_time.to_human : '---',
496
- remaining_time ? remaining_time.to_i : 0,
497
- billed_duration ? billed_duration.to_human : '---',
498
- billed_duration ? billed_duration.to_i : 0,
499
- unbilled_duration ? unbilled_duration.to_human : '---',
500
- unbilled_duration ? unbilled_duration.to_i : 0,
501
-
502
- tracks_c,
503
- billed_tracks_c,
504
- unbilled_tracks_c,
494
+ duration.to_human_s,
495
+ duration.to_i,
505
496
  ]
497
+
498
+ if estimation
499
+ row << estimation.to_human_s
500
+ row << estimation.to_i
501
+ else
502
+ row << '---'
503
+ row << 0
504
+ end
505
+
506
+ if remaining_time
507
+ row << remaining_time.to_human_s
508
+ row << remaining_time.to_i
509
+ else
510
+ row << '---'
511
+ row << 0
512
+ end
513
+
514
+ row << billed_duration.to_human_s
515
+ row << billed_duration.to_i
516
+ row << unbilled_duration.to_human_s
517
+ row << unbilled_duration.to_i
518
+
519
+ row << tracks_c
520
+ row << billed_tracks_c
521
+ row << unbilled_tracks_c
522
+
523
+ csv << row
506
524
  end
507
525
 
508
526
  totals[:begin_datetime_s] = totals[:begin_datetime] ? totals[:begin_datetime].localtime.strftime(@csv_filter_options[:format]) : '---'
@@ -520,18 +538,23 @@ module TheFox
520
538
  totals[:begin_datetime_s],
521
539
  totals[:end_datetime_s],
522
540
 
523
- totals[:duration] ? totals[:duration].to_human : '---',
524
- totals[:duration] ? totals[:duration].to_i : 0,
525
- totals[:estimation] ? totals[:estimation].to_human : '---',
526
- totals[:estimation] ? totals[:estimation].to_i : 0,
527
- totals[:remaining_time] ? totals[:remaining_time].to_human : '---',
528
- totals[:remaining_time] ? totals[:remaining_time].to_i : 0,
529
- totals[:billed_duration] ? totals[:billed_duration].to_human : '---',
530
- totals[:billed_duration] ? totals[:billed_duration].to_i : 0,
531
- totals[:unbilled_duration] ? totals[:unbilled_duration].to_human : '---',
532
- totals[:unbilled_duration] ? totals[:unbilled_duration].to_i : 0,
541
+ totals[:duration].to_human_s,
542
+ totals[:duration].to_i,
543
+
544
+ totals[:estimation].to_human_s,
545
+ totals[:estimation].to_i,
546
+
547
+ totals[:remaining_time].to_human_s,
548
+ totals[:remaining_time].to_i,
549
+
550
+ totals[:billed_duration].to_human_s,
551
+ totals[:billed_duration].to_i,
552
+
553
+ totals[:unbilled_duration].to_human_s,
554
+ totals[:unbilled_duration].to_i,
533
555
 
534
556
  totals[:tracks_c],
557
+
535
558
  totals[:billed_tracks_c],
536
559
  totals[:unbilled_tracks_c],
537
560
  ]
@@ -625,7 +648,7 @@ module TheFox
625
648
  totals[:end_datetime] = edt
626
649
  end
627
650
 
628
- csv << [
651
+ row = [
629
652
  totals[:row_c],
630
653
 
631
654
  task.id,
@@ -637,15 +660,19 @@ module TheFox
637
660
  track.begin_datetime_s(@csv_filter_options),
638
661
  track.end_datetime_s(@csv_filter_options),
639
662
 
640
- duration ? duration.to_human : '---',
641
- duration ? duration.to_i : 0,
642
- billed_duration ? billed_duration.to_human : '---',
643
- billed_duration ? billed_duration.to_i : 0,
644
- unbilled_duration ? unbilled_duration.to_human : '---',
645
- unbilled_duration ? unbilled_duration.to_i : 0,
663
+ duration.to_human_s,
664
+ duration.to_i,
665
+
666
+ billed_duration.to_human_s,
667
+ billed_duration.to_i,
668
+
669
+ unbilled_duration.to_human_s,
670
+ unbilled_duration.to_i,
646
671
 
647
672
  track.is_billed.to_i,
648
673
  ]
674
+
675
+ csv << row
649
676
  end
650
677
 
651
678
  totals[:begin_datetime_s] = totals[:begin_datetime] ? totals[:begin_datetime].localtime.strftime(@csv_filter_options[:format]) : '---'
@@ -653,7 +680,7 @@ module TheFox
653
680
  totals[:end_datetime_s] = totals[:end_datetime] ? totals[:end_datetime].localtime.strftime(@csv_filter_options[:format]) : '---'
654
681
 
655
682
  totals[:row_c] += 1
656
- csv << [
683
+ row = [
657
684
  totals[:row_c],
658
685
  'TOTAL',
659
686
 
@@ -666,14 +693,18 @@ module TheFox
666
693
  totals[:begin_datetime_s],
667
694
  totals[:end_datetime_s],
668
695
 
669
- totals[:duration] ? totals[:duration].to_human : '---',
670
- totals[:duration] ? totals[:duration].to_i : 0,
671
- totals[:billed_duration] ? totals[:billed_duration].to_human : '---',
672
- totals[:billed_duration] ? totals[:billed_duration].to_i : 0,
673
- totals[:unbilled_duration] ? totals[:unbilled_duration].to_human : '---',
674
- totals[:unbilled_duration] ? totals[:unbilled_duration].to_i : 0,
696
+ totals[:duration].to_human_s,
697
+ totals[:duration].to_i,
698
+
699
+ totals[:billed_duration].to_human_s,
700
+ totals[:billed_duration].to_i,
701
+
702
+ totals[:unbilled_duration].to_human_s,
703
+ totals[:unbilled_duration].to_i,
675
704
  ]
676
705
 
706
+ csv << row
707
+
677
708
  csv.close
678
709
  end
679
710
 
@@ -688,7 +719,8 @@ module TheFox
688
719
  def help
689
720
  puts 'usage: timr report [-d|--day <date>] [-m|--month <[YYYY-]MM>]'
690
721
  puts ' [-y|--year [<YYYY>]] [-a|--all] [--tasks|--tracks]'
691
- puts ' [--csv <path>] [--force]'
722
+ puts ' [--billed|--unbilled]'
723
+ puts ' [--csv <path>] [--force] [--format <str>]'
692
724
  puts ' or: timr report [-h|--help]'
693
725
  puts
694
726
  puts 'Options'
@@ -698,9 +730,9 @@ module TheFox
698
730
  puts ' -a, --all All.'
699
731
  puts ' --tasks Export Tasks (default)'
700
732
  puts ' --tracks Export Tracks'
701
- # puts ' --billed Filter only Tasks/Tracks which are billed.'
702
- # puts ' --unbilled Filter only Tasks/Tracks which are not billed.'
703
- puts ' --format Format Tasks and Tracks output.'
733
+ puts ' --billed Filter only Tasks/Tracks which are billed.'
734
+ puts ' --unbilled Filter only Tasks/Tracks which are not billed.'
735
+ puts ' --format <str> Format Tasks and Tracks output.'
704
736
  puts " --csv <path> Export as CSV file. Use '--csv -' to use STDOUT."
705
737
  puts " --force Force overwrite file."
706
738
  puts
@@ -715,6 +747,8 @@ module TheFox
715
747
  puts ' %fid Foreign ID'
716
748
  puts ' %n Name'
717
749
  puts ' %d Description'
750
+ puts ' %ds Duration Seconds'
751
+ puts ' %dh Duration Human Format'
718
752
  puts
719
753
  puts 'Track Format'
720
754
  puts ' %id ID'
@@ -726,6 +760,10 @@ module TheFox
726
760
  puts ' %edt End DateTime'
727
761
  puts ' %ed End Date'
728
762
  puts ' %et End Time'
763
+ puts ' %ds Duration Seconds'
764
+ puts ' %dh Duration Human Format'
765
+ puts ' %bi Billed Integer'
766
+ puts ' %bh Billed Human Format (YES, NO)'
729
767
  puts
730
768
  puts "Use '%T' prefix for each Task attribute for Track formatting."
731
769
  puts "For example use '%Tid' to use the Task ID."