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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: eb0e173a315fde0703d0a3032bca022d5ec4b51c
4
- data.tar.gz: 061660d57caea51bb1ed329ffdce2e7246a825ce
3
+ metadata.gz: 647006a0a03ba4313f87618171cfd76bf10ed50d
4
+ data.tar.gz: f32060c85bd2009eb2e3511152ba8942d6a37aeb
5
5
  SHA512:
6
- metadata.gz: eddb59108370f4052a7599e83161b737a3bae516462d0ccb0af97dc19fccd29a3159e2103c9315e2de8ca6dcc3f2d6d0ea32da89a1f179e1a8765a84db587bed
7
- data.tar.gz: bdacca4d724854962db321a7ee5ca42102ebff28f23c988c15cb7ca2faaebcc6b525701277ceae274dfc274d66b9d1c9aeebcee92ca4a08e4674f3e7e336b319
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.6.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 (2.14.1)
26
- rspec-core (~> 2.14.0)
27
- rspec-expectations (~> 2.14.0)
28
- rspec-mocks (~> 2.14.0)
29
- rspec-core (2.14.8)
30
- rspec-expectations (2.14.5)
31
- diff-lcs (>= 1.1.3, < 2.0)
32
- rspec-mocks (2.14.6)
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
@@ -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
- d << I18n.l(a.datum, format: :mit_wochentag)
84
- d << a.name
85
- d << a.typ
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
- def zeit_bis_to_s(a)
99
- if a.zeit_bis.nil?
100
- return nil
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
- s = a.zeit_bis.strftime("%H:%M")
103
- s == "00:00" ? "24:00" : s
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
- @pdf.bounding_box([xpos, ypos], width: WIDTH+30) do #height dynamisch
108
- make_table_without_bounding_box(daten, title)
109
- end
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 = @pdf.bounds.width
114
- r1 = Rational(1, 6)
115
- r2 = r1 * Rational(1, 2)
116
- r3 = Rational(1, 4)
117
- r4 = Rational(1, 9)
118
-
119
- column_width = [p_width * r1, p_width * r3, p_width * r3, p_width * r2, p_width * r2, p_width * r4]
120
- @pdf.table(daten, column_widths: column_width,
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
- t.column(5).style(align: :right)
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
 
@@ -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 :datum, :name, :typ, :zeit_von, :zeit_bis, :arbeitszeit
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
@@ -1,5 +1,5 @@
1
1
  module Planik
2
2
  module Lohnausweis
3
- VERSION = "0.6.0"
3
+ VERSION = "0.7.0"
4
4
  end
5
5
  end
data/lib/lohnausweis.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require "lohnausweis/version"
2
+ require "lohnausweis/arbeitslistespalten"
2
3
  require "lohnausweis/pdf_generator"
3
4
  require "lohnausweis/rohdaten"
4
5
  require "lohnausweis/daten_eintrag"