steuer 1.1.0 → 1.2.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.
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'yaml'
4
+
5
+ module Steuer
6
+ # Lookup of Bundesfinanzamtsnummer (BUFA-Nr, the four-digit prefix of the
7
+ # federal-13 form) to the office's name, backed by the BZSt BUFA-Tabelle
8
+ # bundled in data/finanzaemter.yml.
9
+ #
10
+ # Unlike the structural data in StateMapping, these names go stale: offices
11
+ # merge and get renamed several times a year. Lookups therefore return nil
12
+ # rather than raising, so a number issued after the bundled table's revision
13
+ # still converts -- it just has no name yet.
14
+ module FinanzamtRegistry
15
+ DATA_PATH = File.expand_path('data/finanzaemter.yml', __dir__)
16
+
17
+ class << self
18
+ def name_for(code)
19
+ entries[code.to_s]&.fetch(:name, nil)
20
+ end
21
+
22
+ def state_for(code)
23
+ entries[code.to_s]&.fetch(:state, nil)
24
+ end
25
+
26
+ def known?(code)
27
+ entries.key?(code.to_s)
28
+ end
29
+
30
+ def revision
31
+ data[:revision]
32
+ end
33
+
34
+ def entries
35
+ @entries ||= data[:finanzaemter].to_h do |code, attrs|
36
+ [code.to_s, { name: attrs['name'], state: attrs['state'] }.freeze]
37
+ end.freeze
38
+ end
39
+
40
+ private
41
+
42
+ def data
43
+ @data ||= begin
44
+ loaded = YAML.safe_load_file(DATA_PATH)
45
+ { revision: loaded['revision'], finanzaemter: loaded['finanzaemter'] || {} }
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative 'state_mapping'
4
+ require_relative 'finanzamt_registry'
4
5
 
5
6
  module Steuer
6
7
  class Steuernummer
@@ -76,6 +77,19 @@ module Steuer
76
77
  StateMapping::STATES[@state_code][:name]
77
78
  end
78
79
 
80
+ # The BUFA-Nr: the leading four digits of the federal-13 form, identifying
81
+ # the issuing Finanzamt (the Empfaenger in an ELSTER transmission).
82
+ def finanzamt_code
83
+ to_federal_13&.slice(0, 4)
84
+ end
85
+
86
+ def finanzamt_name
87
+ code = finanzamt_code
88
+ return unless code
89
+
90
+ FinanzamtRegistry.name_for(code)
91
+ end
92
+
79
93
  def format_type
80
94
  @format_type ||= if normalized_input.include?('/')
81
95
  :standard
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Steuer
4
- VERSION = '1.1.0'
4
+ VERSION = '1.2.0'
5
5
  end
data/lib/steuer.rb CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  require_relative 'steuer/version'
4
4
  require_relative 'steuer/steuernummer'
5
+ require_relative 'steuer/finanzamt_registry'
5
6
  require_relative 'steuer/errors'
6
7
 
7
8
  module Steuer
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: steuer
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Olumuyiwa Osiname
@@ -133,7 +133,9 @@ files:
133
133
  - LICENSE
134
134
  - README.md
135
135
  - lib/steuer.rb
136
+ - lib/steuer/data/finanzaemter.yml
136
137
  - lib/steuer/errors.rb
138
+ - lib/steuer/finanzamt_registry.rb
137
139
  - lib/steuer/state_mapping.rb
138
140
  - lib/steuer/steuernummer.rb
139
141
  - lib/steuer/version.rb