lohnausweis 0.6.0 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- 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