lohnausweis 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/Gemfile.lock +14 -9
- data/lib/lohnausweis/arbeitslistespalten.rb +120 -0
- data/lib/lohnausweis/daten.rb +17 -18
- data/lib/lohnausweis/pdf_generator.rb +28 -16
- data/lib/lohnausweis/rohdaten.rb +9 -3
- data/lib/lohnausweis/version.rb +1 -1
- data/lib/lohnausweis.rb +1 -0
- data/mit_weiss_nicht_was_alles.pdf +1601 -0
- data/spec/lohnausweis/pdf_generator_spec.rb +27 -21
- data/spec/lohnausweis/pdf_generator_spec_mit_zulagen_spec.rb +46 -0
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 647006a0a03ba4313f87618171cfd76bf10ed50d
|
4
|
+
data.tar.gz: f32060c85bd2009eb2e3511152ba8942d6a37aeb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2a97b9e01cce3ba1103dd709078ad43f01adc53c78987057d89f58afab8a4e88e153710a689615f60492786bc486fbed59036c9f69d006e6bb1e853d5fc9c977
|
7
|
+
data.tar.gz: 2c28e5ec1487afeaa46bd16960095b57f9b65aff0471cd529ba05b50dd3cf323bd309cf7713a54068db563bcbc39b33fa5b4da5c28be167419bc3c505bd13668
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
lohnausweis (0.
|
4
|
+
lohnausweis (0.7.0)
|
5
5
|
|
6
6
|
GEM
|
7
7
|
remote: https://rubygems.org/
|
@@ -22,14 +22,19 @@ GEM
|
|
22
22
|
pdf-core (~> 0.2.2)
|
23
23
|
ttfunk (~> 1.1.1)
|
24
24
|
rake (10.1.1)
|
25
|
-
rspec (
|
26
|
-
rspec-core (~>
|
27
|
-
rspec-expectations (~>
|
28
|
-
rspec-mocks (~>
|
29
|
-
rspec-core (
|
30
|
-
|
31
|
-
|
32
|
-
|
25
|
+
rspec (3.4.0)
|
26
|
+
rspec-core (~> 3.4.0)
|
27
|
+
rspec-expectations (~> 3.4.0)
|
28
|
+
rspec-mocks (~> 3.4.0)
|
29
|
+
rspec-core (3.4.4)
|
30
|
+
rspec-support (~> 3.4.0)
|
31
|
+
rspec-expectations (3.4.0)
|
32
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
33
|
+
rspec-support (~> 3.4.0)
|
34
|
+
rspec-mocks (3.4.1)
|
35
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
36
|
+
rspec-support (~> 3.4.0)
|
37
|
+
rspec-support (3.4.1)
|
33
38
|
thread_safe (0.2.0)
|
34
39
|
atomic (>= 1.1.7, < 2)
|
35
40
|
ttfunk (1.1.1)
|
@@ -0,0 +1,120 @@
|
|
1
|
+
require 'mathn'
|
2
|
+
require 'active_support/number_helper'
|
3
|
+
|
4
|
+
module Planik
|
5
|
+
module Lohnausweis
|
6
|
+
|
7
|
+
class Formatter
|
8
|
+
attr_reader :align_right
|
9
|
+
|
10
|
+
def initialize align_right = false
|
11
|
+
@align_right = align_right
|
12
|
+
end
|
13
|
+
|
14
|
+
def summe(arbeitsliste)
|
15
|
+
nil
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class DateFormatter < Formatter
|
20
|
+
def format datum
|
21
|
+
I18n.l(datum, format: :mit_wochentag, locale: :de)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
class TimeFormatter < Formatter
|
26
|
+
def format time
|
27
|
+
time.nil? ? nil : time.strftime("%H:%M")
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
class TimeEndFormatter < Formatter
|
32
|
+
def format time
|
33
|
+
if time.nil?
|
34
|
+
return nil
|
35
|
+
end
|
36
|
+
s = time.strftime("%H:%M")
|
37
|
+
s == "00:00" ? "24:00" : s
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
class TimeDeziFormatter < Formatter
|
42
|
+
def initialize
|
43
|
+
super(true)
|
44
|
+
end
|
45
|
+
|
46
|
+
def format time
|
47
|
+
time = nil if time == 0
|
48
|
+
time ? super('%.2f', time) : nil
|
49
|
+
end
|
50
|
+
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
class NullFormatter < Formatter
|
55
|
+
def format text
|
56
|
+
text
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
# class Formatters
|
61
|
+
# FORMATTERS = {date_formatter: DateFormatter.new,
|
62
|
+
# time_formatter: TimeFormatter.new, TimeEndformatter}
|
63
|
+
# end
|
64
|
+
|
65
|
+
# Abstrakte Klasse für alle Einträge in den Tabellen des Lohnausweises
|
66
|
+
# Ein Eintrag hat vier mögliche Spalten: Name, Menge, Ansatz und Betrag, von denen aber der einte oder andere nil sein kann.
|
67
|
+
class Arbeitslistespalte
|
68
|
+
attr_reader :key, :text, :relative_breite, :formatter
|
69
|
+
|
70
|
+
def initialize(key, text, relative_breite, formatter)
|
71
|
+
@key, @text, @relative_breite, @formatter = key, text, relative_breite, formatter
|
72
|
+
end
|
73
|
+
|
74
|
+
def format arbeits_item
|
75
|
+
formatter.format(arbeits_item.get(key))
|
76
|
+
end
|
77
|
+
|
78
|
+
def summe(arbeitsliste)
|
79
|
+
|
80
|
+
if is_summen_spalte?
|
81
|
+
sum = 0
|
82
|
+
arbeitsliste.each { |x|
|
83
|
+
sum += x.get(key) if x.get(key)
|
84
|
+
}
|
85
|
+
sum = formatter.format(sum)
|
86
|
+
else
|
87
|
+
nil
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def is_summen_spalte?
|
92
|
+
formatter.is_a? TimeDeziFormatter
|
93
|
+
end
|
94
|
+
|
95
|
+
|
96
|
+
end
|
97
|
+
|
98
|
+
class Arbeitslistespalten
|
99
|
+
SPALTEN = {
|
100
|
+
datum: Arbeitslistespalte.new(:datum, "Datum", 4, DateFormatter.new),
|
101
|
+
name: Arbeitslistespalte.new(:name, "Dienst/Arbeit", 4, NullFormatter.new),
|
102
|
+
typ: Arbeitslistespalte.new(:typ, "Typ", 4, NullFormatter.new),
|
103
|
+
start: Arbeitslistespalte.new(:start, "Start", 2, TimeFormatter.new),
|
104
|
+
ende: Arbeitslistespalte.new(:ende, "Ende", 2, TimeEndFormatter.new),
|
105
|
+
arbeitszeit: Arbeitslistespalte.new(:arbeitszeit, "Arbeitszeit", 3, TimeDeziFormatter.new),
|
106
|
+
zulage_nacht: Arbeitslistespalte.new(:zulage_nacht, "Zulage Nacht", 4, TimeDeziFormatter.new),
|
107
|
+
zulage_wochenende: Arbeitslistespalte.new(:zulage_wochenende, "Zulage Wochenende", 4, TimeDeziFormatter.new)
|
108
|
+
}
|
109
|
+
|
110
|
+
def self.find(key)
|
111
|
+
x = SPALTEN[key]
|
112
|
+
raise "Kann Arbeitslistespalte für key '#{key}' nicht finden" unless x
|
113
|
+
x
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
118
|
+
|
119
|
+
|
120
|
+
end
|
data/lib/lohnausweis/daten.rb
CHANGED
@@ -73,34 +73,33 @@ module Planik
|
|
73
73
|
@arbeitszeit_block = Block.new(eintraege, titel)
|
74
74
|
end
|
75
75
|
|
76
|
+
# erstellt die Arbeitliste {:spalten, :eintraege}
|
77
|
+
# [titel, arbeitsitems, Total]
|
76
78
|
def create_arbeitsliste
|
79
|
+
|
77
80
|
eintraege = []
|
78
|
-
titel = ["Datum", "Dienst/Arbeit", "Typ", "Start", "Ende", "Arbeitszeit"]
|
81
|
+
titel = @rohdaten.arbeitsliste_spalten.map{|x| x.text}#["Datum", "Dienst/Arbeit", "Typ", "Start", "Ende", "Arbeitszeit"]
|
79
82
|
eintraege << titel
|
80
83
|
|
81
84
|
@rohdaten.arbeitsliste.each do |a|
|
82
85
|
d = []
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
d << (a.zeit_von.nil? ? nil: a.zeit_von.strftime("%H:%M"))
|
87
|
-
d << (zeit_bis_to_s(a))
|
88
|
-
d << format('%.2f', a.arbeitszeit)
|
86
|
+
@rohdaten.arbeitsliste_spalten.each do |spalte|
|
87
|
+
d << spalte.format(a)
|
88
|
+
end
|
89
89
|
eintraege << d
|
90
90
|
end
|
91
|
-
sum = 0
|
92
|
-
@rohdaten.arbeitsliste.each{|x| sum += x.arbeitszeit}
|
93
|
-
sum = format('%.2f', sum)
|
94
|
-
eintraege << ["Arbeitszeit total", nil, nil, nil, nil, sum]
|
95
|
-
@arbeitsliste = eintraege
|
96
|
-
end
|
97
91
|
|
98
|
-
|
99
|
-
|
100
|
-
|
92
|
+
last = Array.new#(@rohdaten.arbeitsliste_spalten.length)
|
93
|
+
|
94
|
+
@rohdaten.arbeitsliste_spalten.each do |a|
|
95
|
+
last << a.summe(@rohdaten.arbeitsliste)
|
101
96
|
end
|
102
|
-
|
103
|
-
|
97
|
+
last[0] = "Arbeitszeit total"
|
98
|
+
|
99
|
+
eintraege << last
|
100
|
+
|
101
|
+
al = {spalten: @rohdaten.arbeitsliste_spalten, eintraege: eintraege}
|
102
|
+
@arbeitsliste = al
|
104
103
|
end
|
105
104
|
|
106
105
|
|
@@ -103,21 +103,23 @@ module Planik
|
|
103
103
|
end
|
104
104
|
end
|
105
105
|
|
106
|
-
def make_arbeitsliste_table(xpos, ypos, daten, title = false)
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
end
|
106
|
+
# def make_arbeitsliste_table(xpos, ypos, daten, title = false)
|
107
|
+
# @pdf.bounding_box([xpos, ypos], width: WIDTH+30) do #height dynamisch
|
108
|
+
# make_table_without_bounding_box(daten, title)
|
109
|
+
# end
|
110
|
+
# end
|
111
111
|
|
112
112
|
def make_table_without_bounding_box(daten, title)
|
113
|
-
p_width =
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
113
|
+
p_width = WIDTH #@pdf.bounds.width
|
114
|
+
|
115
|
+
eintraege = daten[:eintraege]
|
116
|
+
|
117
|
+
sum_relative_breite = 0
|
118
|
+
daten[:spalten].each { |x| sum_relative_breite += x.relative_breite }
|
119
|
+
|
120
|
+
column_width = daten[:spalten].map { |s| p_width * (s.relative_breite/sum_relative_breite) }
|
121
|
+
|
122
|
+
@pdf.table(eintraege, column_widths: column_width,
|
121
123
|
cell_style: {
|
122
124
|
borders: [], #keine Ränder
|
123
125
|
padding_top: 3, padding_bottom: 3
|
@@ -128,10 +130,20 @@ module Planik
|
|
128
130
|
t.row(0).style(font_style: :bold) #Titel bold
|
129
131
|
t.row(0).background_color = "D8D8D8"
|
130
132
|
end
|
131
|
-
|
133
|
+
|
134
|
+
daten[:spalten].each_with_index do |s, i|
|
135
|
+
t.column(i).style(align: :right) if s.formatter.align_right
|
136
|
+
end
|
137
|
+
|
138
|
+
#Letzte Zeile (Total)
|
139
|
+
|
140
|
+
daten[:spalten].each_with_index do |s, i|
|
141
|
+
if s.is_summen_spalte?
|
142
|
+
t.cells[t.row_length-1, i].borders = [:top]
|
143
|
+
t.cells[t.row_length-1, i].font_style = :bold
|
144
|
+
end
|
145
|
+
end
|
132
146
|
t.cells[t.row_length-1, 0].font_style = :bold
|
133
|
-
t.cells[t.row_length-1, 5].borders = [:top]
|
134
|
-
t.cells[t.row_length-1, 5].font_style = :bold
|
135
147
|
end
|
136
148
|
end
|
137
149
|
|
data/lib/lohnausweis/rohdaten.rb
CHANGED
@@ -54,11 +54,16 @@ module Planik
|
|
54
54
|
# Ein Dienst, Termine mit Arbeitszeit oder "andere Arbeit". Erscheinen im Anhang des PDFs
|
55
55
|
#
|
56
56
|
class ArbeitsItem
|
57
|
-
attr_accessor :
|
57
|
+
attr_accessor :daten
|
58
|
+
def initialize(daten)
|
59
|
+
@daten = daten
|
60
|
+
end
|
61
|
+
|
62
|
+
def get was
|
63
|
+
daten[was]
|
58
64
|
|
59
|
-
def initialize(datum, name, typ, zeit_von, zeit_bis, arbeitszeit)
|
60
|
-
@datum, @name, @typ, @zeit_von, @zeit_bis, @arbeitszeit = datum, name, typ, zeit_von, zeit_bis, arbeitszeit
|
61
65
|
end
|
66
|
+
|
62
67
|
end
|
63
68
|
|
64
69
|
attr_accessor :start_datum, :end_datum
|
@@ -66,6 +71,7 @@ module Planik
|
|
66
71
|
attr_accessor :arbeitszeit
|
67
72
|
attr_accessor :geldbetraege_zulagen_anzeigen
|
68
73
|
attr_accessor :zulage_nacht, :zulage_wochenende
|
74
|
+
attr_accessor :arbeitsliste_spalten
|
69
75
|
attr_accessor :arbeitsliste
|
70
76
|
|
71
77
|
def initialize
|
data/lib/lohnausweis/version.rb
CHANGED