working_times 0.6.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/working_times/cli.rb +22 -1
- data/lib/working_times/config.rb +16 -0
- data/lib/working_times/constants.rb +1 -1
- data/lib/working_times/invoice.rb +133 -0
- data/lib/working_times.rb +1 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9ccab617c04629dffdd39a32e931a3e00c8e8ae4639c1627a72a1b54b4042b02
|
4
|
+
data.tar.gz: 2745ebe905da60de2db8d7bb9f70da78de4b96fd0df4901ac2fd4dfeb5f6fe44
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8c047ff14e1b8c6d20dab82c21ce329dd44731ca97c0f21d80549744a12a42cd19543f1b94f231e3817083643b27048bb0851826c720dd76517211ec27d3c118
|
7
|
+
data.tar.gz: d01a5f63e2c43f16979615c6f7787eda71ea4390fdb8478566c1a026e28d0f0a63036f154997cc67d93b605d206bc73e3270f019f9d846cb1793fbc428c56f38
|
data/lib/working_times/cli.rb
CHANGED
@@ -13,6 +13,7 @@ module WorkingTimes
|
|
13
13
|
end
|
14
14
|
|
15
15
|
FileUtils.mkdir_p(File.join(workon, 'terms'))
|
16
|
+
FileUtils.mkdir_p(File.join(workon, 'invoices'))
|
16
17
|
initialize_wtconf(workon, term, company)
|
17
18
|
end
|
18
19
|
|
@@ -57,6 +58,21 @@ module WorkingTimes
|
|
57
58
|
Record.new(timestamp: DateTime.now, duration: duration).rest
|
58
59
|
end
|
59
60
|
|
61
|
+
option :build, type: :boolean, aliases: ['-b']
|
62
|
+
desc 'invoice', 'Create invoice for current term by TeX template. It will build pdf if option is set'
|
63
|
+
def invoice
|
64
|
+
Invoice.new.tap do |invoice|
|
65
|
+
invoice.generate
|
66
|
+
invoice.build if options[:build]
|
67
|
+
end
|
68
|
+
puts "Invoice created to #{path_invoice_current_term}."
|
69
|
+
end
|
70
|
+
|
71
|
+
desc 'version', 'Show version of working_times'
|
72
|
+
def version
|
73
|
+
puts 'version: ' + VERSION
|
74
|
+
end
|
75
|
+
|
60
76
|
private
|
61
77
|
|
62
78
|
def initialize_wtconf(workon, term, company)
|
@@ -65,7 +81,12 @@ module WorkingTimes
|
|
65
81
|
File.write(File.join(data_dir, 'wtconf.json'), <<~WTCONF)
|
66
82
|
{
|
67
83
|
"term": "#{term}",
|
68
|
-
"
|
84
|
+
"invoice": {
|
85
|
+
"company": "#{company}",
|
86
|
+
"template": "",
|
87
|
+
"salaryPerHour": 0,
|
88
|
+
"taxRate": 0.0
|
89
|
+
}
|
69
90
|
}
|
70
91
|
WTCONF
|
71
92
|
end
|
data/lib/working_times/config.rb
CHANGED
@@ -32,6 +32,22 @@ module WorkingTimes
|
|
32
32
|
wtconf['company']
|
33
33
|
end
|
34
34
|
|
35
|
+
def invoice_dir
|
36
|
+
File.join(data_dir, 'invoices')
|
37
|
+
end
|
38
|
+
|
39
|
+
def invoice_info
|
40
|
+
wtconf['invoice']
|
41
|
+
end
|
42
|
+
|
43
|
+
def dir_invoice_current_term
|
44
|
+
File.join(invoice_dir, current_term)
|
45
|
+
end
|
46
|
+
|
47
|
+
def path_invoice_current_term
|
48
|
+
File.join(dir_invoice_current_term, "#{current_term}.tex")
|
49
|
+
end
|
50
|
+
|
35
51
|
def wtconf
|
36
52
|
JSON.parse(File.read(path_wtconf))
|
37
53
|
end
|
@@ -0,0 +1,133 @@
|
|
1
|
+
module WorkingTimes
|
2
|
+
# Class about creating invoice
|
3
|
+
# This class is designed to build data_dir/invoices/current_term/invoice.tex
|
4
|
+
# from data_dir/invoices/template.tex
|
5
|
+
class Invoice
|
6
|
+
include Config
|
7
|
+
attr_reader :path_template, :salary_per_hour, :tax_rate, :company
|
8
|
+
|
9
|
+
WDAYS = %w[日 月 火 水 木 金 土].freeze
|
10
|
+
Date::DATE_FORMATS[:jp_date] = '%m月%d日'
|
11
|
+
Time::DATE_FORMATS[:only_hm] = '%H:%M'
|
12
|
+
|
13
|
+
# path_template : String
|
14
|
+
# salary_per_hour : Integer
|
15
|
+
# tax_rate : Float
|
16
|
+
# company : String
|
17
|
+
def initialize
|
18
|
+
h_invoice_info = invoice_info
|
19
|
+
|
20
|
+
@path_template = h_invoice_info['template']
|
21
|
+
@salary_per_hour = h_invoice_info['salaryPerHour']
|
22
|
+
@tax_rate = h_invoice_info['taxRate']
|
23
|
+
@company = h_invoice_info['company']
|
24
|
+
end
|
25
|
+
|
26
|
+
def generate
|
27
|
+
create_dir_invoice_current_term
|
28
|
+
makeup_worktable
|
29
|
+
generate_invoice_from_template
|
30
|
+
end
|
31
|
+
|
32
|
+
def build
|
33
|
+
puts 'Currently, it is not available to build pdf with latexmk.'
|
34
|
+
puts 'Wait for new version!'
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def create_dir_invoice_current_term
|
40
|
+
FileUtils.mkdir_p(dir_invoice_current_term)
|
41
|
+
end
|
42
|
+
|
43
|
+
def makeup_worktable
|
44
|
+
@worktable = [
|
45
|
+
'\hline',
|
46
|
+
'日付 & 曜日 & 内容 & 出勤 & 退勤 & 休憩 & 労働時間 \\\\ \hline\hline'
|
47
|
+
]
|
48
|
+
@allworktime_on_sec = 0.0
|
49
|
+
working_times = CSV.open(path_current_term, headers: true)
|
50
|
+
row = working_times.first
|
51
|
+
date_itr = beginning_of_month(row['started_at'])
|
52
|
+
date_itr.upto(date_itr.end_of_month) do |date|
|
53
|
+
if row.nil?
|
54
|
+
@worktable << format_worktable_row(date)
|
55
|
+
elsif same_day?(row['started_at'], date.rfc3339)
|
56
|
+
worktime = calculate_worktime(row['started_at'], row['finished_at'], row['rest_sec'])
|
57
|
+
@allworktime_on_sec += worktime
|
58
|
+
@worktable <<
|
59
|
+
format_worktable_row(date, row['comment'], row['started_at'], row['finished_at'], row['rest_sec'], worktime)
|
60
|
+
row = working_times.readline
|
61
|
+
else
|
62
|
+
@worktable << format_worktable_row(date)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def generate_invoice_from_template
|
68
|
+
template = File.readlines(path_template)
|
69
|
+
File.open(path_invoice_current_term, 'w') do |f|
|
70
|
+
template.each do |t|
|
71
|
+
t.gsub!(/##COMPANY##/, company)
|
72
|
+
t.gsub!(/##WORKTIME##/, parse_second_to_hh_str(@allworktime_on_sec))
|
73
|
+
t.gsub!(/##ACTUALWORKTIME##/, parse_second_to_hm_str(@allworktime_on_sec))
|
74
|
+
t.gsub!(/##SALARYPERHOUR##/, salary_per_hour.to_s)
|
75
|
+
t.gsub!(/##SALARY##/, salary.to_s)
|
76
|
+
t.gsub!(/##TAXRATE##/, "#{(tax_rate * 100).to_i}\\%")
|
77
|
+
t.gsub!(/##TAX##/, tax.to_s)
|
78
|
+
t.gsub!(/##SALARYWITHTAX##/, (salary + tax).to_s)
|
79
|
+
# on gsub, '\' means 'replace sub string'.
|
80
|
+
# so we should use block if work as expected
|
81
|
+
t.gsub!(/##WORKTABLE##/) { @worktable.join("\n") }
|
82
|
+
|
83
|
+
f.write(t)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def beginning_of_month(rfc3339)
|
89
|
+
Date.parse(rfc3339).beginning_of_month
|
90
|
+
end
|
91
|
+
|
92
|
+
def same_day?(one_rfc3339, another_rfc3339)
|
93
|
+
Date.parse(one_rfc3339) == Date.parse(another_rfc3339)
|
94
|
+
end
|
95
|
+
|
96
|
+
def calculate_worktime(st_rfc3339, fi_rfc3339, rest_sec)
|
97
|
+
Time.parse(fi_rfc3339) - Time.parse(st_rfc3339) - rest_sec.to_i
|
98
|
+
end
|
99
|
+
|
100
|
+
# date : Date
|
101
|
+
# comment : String
|
102
|
+
# started_at, finished_at : String (RFC3339)
|
103
|
+
# rest, worktime : Integer
|
104
|
+
def format_worktable_row(date, comment = nil, started_at = nil, finished_at = nil, rest = nil, worktime = nil)
|
105
|
+
"#{date.to_s(:jp_date)} & " \
|
106
|
+
"#{WDAYS[date.wday]} & " \
|
107
|
+
"#{comment || '-'} & " \
|
108
|
+
"#{started_at.nil? ? '-' : Time.parse(started_at).to_s(:only_hm)} & " \
|
109
|
+
"#{finished_at.nil? ? '-' : Time.parse(finished_at).to_s(:only_hm)} & " \
|
110
|
+
"#{rest.nil? ? '-' : parse_second_to_hm_str(rest.to_i)} & " \
|
111
|
+
"#{worktime.nil? ? '-' : parse_second_to_hm_str(worktime)} \\\\ \\hline"
|
112
|
+
end
|
113
|
+
|
114
|
+
def parse_second_to_hm_str(second)
|
115
|
+
h = (second / 3600).to_i
|
116
|
+
m = second - (3600 * h)
|
117
|
+
"#{h.to_i}:#{m.to_i.to_s.rjust(2, '0')}"
|
118
|
+
end
|
119
|
+
|
120
|
+
def parse_second_to_hh_str(second)
|
121
|
+
(second / 3600).to_i.to_s
|
122
|
+
end
|
123
|
+
|
124
|
+
# calculate with 'hour' only
|
125
|
+
def salary
|
126
|
+
@salary ||= @allworktime_on_sec.to_i / 3600 * salary_per_hour
|
127
|
+
end
|
128
|
+
|
129
|
+
def tax
|
130
|
+
@tax ||= (salary * tax_rate).to_i
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
data/lib/working_times.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: working_times
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aoshi Fujioka
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-04-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -135,6 +135,7 @@ files:
|
|
135
135
|
- lib/working_times/cli.rb
|
136
136
|
- lib/working_times/config.rb
|
137
137
|
- lib/working_times/constants.rb
|
138
|
+
- lib/working_times/invoice.rb
|
138
139
|
- lib/working_times/record.rb
|
139
140
|
- lib/working_times/state.rb
|
140
141
|
homepage: https://github.com/arsley/working_times
|