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 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"