epb_view_models 1.0.12 → 1.0.15

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -1
  3. data/Gemfile +10 -10
  4. data/Gemfile.lock +32 -39
  5. data/api/schemas/data/orchestrate.json +4 -0
  6. data/api/schemas/xml/SAP-Schema-19.0.0/SAP/ExternalDefinitions.xml +1352 -0
  7. data/api/schemas/xml/SAP-Schema-19.0.0/SAP/ExternalDefinitions.xsd +236 -0
  8. data/api/schemas/xml/SAP-Schema-19.0.0/SAP/Templates/AssessorManagement.xsd +207 -0
  9. data/api/schemas/xml/SAP-Schema-19.0.0/SAP/Templates/EPC-Certificate.xsd +476 -0
  10. data/api/schemas/xml/SAP-Schema-19.0.0/SAP/Templates/ExceptionList.xsd +18 -0
  11. data/api/schemas/xml/SAP-Schema-19.0.0/SAP/Templates/Property.xsd +71 -0
  12. data/api/schemas/xml/SAP-Schema-19.0.0/SAP/Templates/ReportList.xsd +25 -0
  13. data/api/schemas/xml/SAP-Schema-19.0.0/SAP/Templates/SAP-CollectedData.xsd +1793 -0
  14. data/api/schemas/xml/SAP-Schema-19.0.0/SAP/Templates/SAP-Compliance-Report.xsd +36 -0
  15. data/api/schemas/xml/SAP-Schema-19.0.0/SAP/Templates/SAP-Report.xsd +196 -0
  16. data/api/schemas/xml/SAP-Schema-19.0.0/SAP/UDT/EPC-Domains.xsd +558 -0
  17. data/api/schemas/xml/SAP-Schema-19.0.0/SAP/UDT/SAP-Domains.xsd +3127 -0
  18. data/lib/epb_view_models.rb +1 -1
  19. data/lib/presenter/ac_cert/export_configuration.rb +7 -0
  20. data/lib/presenter/ac_report/export_configuration.rb +7 -0
  21. data/lib/presenter/cepc/export_configuration.rb +7 -0
  22. data/lib/presenter/cepc_rr/export_configuration.rb +7 -0
  23. data/lib/presenter/dec/export_configuration.rb +7 -0
  24. data/lib/presenter/dec_rr/export_configuration.rb +7 -0
  25. data/lib/presenter/export/statistics.rb +18 -0
  26. data/lib/presenter/rd_sap/export_configuration.rb +57 -0
  27. data/lib/presenter/sap/export_configuration.rb +7 -0
  28. data/lib/presenter/to_warehouse/base_configuration.rb +23 -0
  29. data/lib/presenter/xml/parser.rb +226 -0
  30. data/lib/view_model/factory.rb +1 -0
  31. data/lib/view_model/sap_schema_1900/common_schema.rb +587 -0
  32. data/lib/view_model/sap_wrapper.rb +2 -0
  33. data/lib/view_model_gateway/xsd_files_gateway.rb +4 -3
  34. metadata +26 -2
@@ -5,7 +5,7 @@ loader = Zeitwerk::Loader.for_gem
5
5
  loader.setup
6
6
 
7
7
  module EpbViewModels
8
- VERSION = "1.0.12"
8
+ VERSION = "1.0.15"
9
9
  end
10
10
 
11
11
  # Monkey patching to avoid using ActiveRecord::Type::Boolean.new.cast
@@ -0,0 +1,7 @@
1
+ module Presenter
2
+ module AcCert
3
+ class ExportConfiguration < Presenter::ToWarehouse::BaseConfiguration
4
+ # configuration goes here
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Presenter
2
+ module AcReport
3
+ class ExportConfiguration < Presenter::ToWarehouse::BaseConfiguration
4
+ # configuration goes here
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Presenter
2
+ module Cepc
3
+ class ExportConfiguration < Presenter::ToWarehouse::BaseConfiguration
4
+ # configuration goes here
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Presenter
2
+ module CepcRr
3
+ class ExportConfiguration < Presenter::ToWarehouse::BaseConfiguration
4
+ # configuration goes here
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Presenter
2
+ module Dec
3
+ class ExportConfiguration < Presenter::ToWarehouse::BaseConfiguration
4
+ # configuration goes here
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Presenter
2
+ module DecRr
3
+ class ExportConfiguration < Presenter::ToWarehouse::BaseConfiguration
4
+ # configuration goes here
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,18 @@
1
+ module Presenter::Export
2
+ class Statistics
3
+ def initialize(wrapper)
4
+ @wrapper = wrapper
5
+ @view_model = wrapper.view_model
6
+ end
7
+
8
+ def build
9
+ {
10
+ transaction_type: @view_model.transaction_type,
11
+ }
12
+ rescue NoMethodError
13
+ {
14
+ transaction_type: 0,
15
+ }
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,57 @@
1
+ module Presenter
2
+ module RdSap
3
+ class ExportConfiguration < Presenter::ToWarehouse::BaseConfiguration
4
+ excludes %w[
5
+ ExternalDefinitions-Revision-Number
6
+ User-Interface-Name
7
+ User-Interface-Version
8
+ PCDF-Revision-Number
9
+ Related-Party-Disclosure
10
+ Insurance-Details
11
+ Previous-EPC-Check
12
+ Green-Deal-Package
13
+ Energy-Assessor
14
+ Green-Deal-Category
15
+ RRN
16
+ ]
17
+ includes %w[
18
+ Certificate-Number
19
+ ]
20
+ bases %w[
21
+ Report-Header
22
+ Energy-Assessment
23
+ Property-Summary
24
+ Energy-Use
25
+ SAP-Data
26
+ SAP-Property-Details
27
+ Identification-Number
28
+ Property
29
+ Address
30
+ ]
31
+ preferred_keys({
32
+ "Certificate-Number" => "scheme_assessor_id",
33
+ })
34
+ list_nodes %w[
35
+ SAP-Floor-Dimensions
36
+ LZC-Energy-Source
37
+ ImprovementTexts
38
+ SAP-Building-Parts
39
+ SAP-Windows
40
+ SAP-Deselected-Improvements
41
+ Main-Heating-Details
42
+ Storage-Heaters
43
+ SAP-Special-Features
44
+ Air-Change-Rates
45
+ PV-Arrays
46
+ ]
47
+ rootless_list_nodes({
48
+ "Wall" => "walls",
49
+ "Roof" => "roofs",
50
+ "Floor" => { parents: %w[Property-Summary], key: "floors" },
51
+ "Main-Heating" => { parents: %w[Property-Summary], key: "main-heating" },
52
+ "Main-Heating-Controls" => "main_heating_controls",
53
+ "Addendum-Number" => "addendum_numbers",
54
+ })
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,7 @@
1
+ module Presenter
2
+ module Sap
3
+ class ExportConfiguration < Presenter::ToWarehouse::BaseConfiguration
4
+ # configuration goes here
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,23 @@
1
+ module Presenter
2
+ module ToWarehouse
3
+ class BaseConfiguration
4
+ def to_args
5
+ self.class.args
6
+ end
7
+
8
+ class << self
9
+ KEYS = %i[excludes includes bases preferred_keys list_nodes rootless_list_nodes].freeze
10
+
11
+ KEYS.each do |key|
12
+ define_method key do |arg|
13
+ args[key] = arg
14
+ end
15
+ end
16
+
17
+ def args
18
+ @args ||= {}
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,226 @@
1
+ module Presenter
2
+ module Xml
3
+ class Parser
4
+ def initialize(excludes: [], includes: [], bases: [], preferred_keys: {}, list_nodes: [], rootless_list_nodes: {})
5
+ @excludes = excludes
6
+ @includes = includes
7
+ @bases = bases
8
+ @preferred_keys = preferred_keys
9
+ @list_nodes = list_nodes
10
+ @rootless_list_nodes = rootless_list_nodes
11
+ end
12
+
13
+ def parse(xml)
14
+ sax_parser.parse xml
15
+ last_output
16
+ end
17
+
18
+ def sax_parser
19
+ @assessment_document ||= AssessmentDocument.new excludes: @excludes,
20
+ includes: @includes,
21
+ bases: @bases,
22
+ preferred_keys: @preferred_keys,
23
+ list_nodes: @list_nodes,
24
+ rootless_list_nodes: @rootless_list_nodes
25
+ @sax_parser ||= Nokogiri::XML::SAX::Parser.new @assessment_document
26
+ end
27
+
28
+ private
29
+
30
+ def last_output
31
+ @assessment_document.output
32
+ end
33
+ end
34
+
35
+ class AssessmentDocument < Nokogiri::XML::SAX::Document
36
+ def initialize(excludes: [], includes: [], bases: [], preferred_keys: {}, list_nodes: [], rootless_list_nodes: {})
37
+ @excludes = excludes
38
+ @includes = includes
39
+ @bases = bases
40
+ @preferred_keys = preferred_keys
41
+ @list_nodes = list_nodes
42
+ @rootless_list_nodes = rootless_list_nodes
43
+ super()
44
+ end
45
+
46
+ def start_document
47
+ init!
48
+ @output = {}
49
+ end
50
+
51
+ def end_document
52
+ init!
53
+ end
54
+
55
+ def start_element_namespace(name, attrs = nil, _prefix = nil, _uri = nil, _namespace = nil)
56
+ @source_position << name
57
+ @output_position << root_key_for_list if at_rootless_list_node_item?
58
+ @output_position << as_key(name) unless is_base?(name)
59
+ @is_excluding = true if @excludes.include?(name)
60
+ @is_including = true if @includes.include?(name)
61
+ super
62
+ if encountered_position? || at_list_node_item?
63
+ set_up_list
64
+ end
65
+ write_encounter
66
+ end
67
+
68
+ def start_element(_name, attrs = nil)
69
+ @attrs = attrs
70
+ end
71
+
72
+ def end_element_namespace(name, _prefix = nil, _uri = nil)
73
+ @output_position.pop unless is_base?(name)
74
+ @output_position.pop if at_rootless_list_node_item?
75
+ @source_position.pop
76
+ @is_excluding = false if @excludes.include?(name)
77
+ @is_including = false if @includes.include?(name)
78
+ end
79
+
80
+ def characters(string)
81
+ if @is_excluding && !@is_including
82
+ return
83
+ end
84
+
85
+ stripped = string.strip
86
+ if stripped.length.zero?
87
+ return
88
+ end
89
+
90
+ value = try_as_number stripped
91
+
92
+ if @attrs.length.positive?
93
+ value = @attrs.to_h.merge({ "value" => value })
94
+ end
95
+
96
+ set_value value
97
+ end
98
+
99
+ attr_reader :output
100
+
101
+ private
102
+
103
+ def init!
104
+ @source_position = []
105
+ @output_position = []
106
+ @is_excluding = false
107
+ @is_including = false
108
+ @attrs = []
109
+ @encountered = []
110
+ end
111
+
112
+ def as_key(name)
113
+ if @preferred_keys.key?(name)
114
+ return @preferred_keys[name]
115
+ end
116
+
117
+ name.downcase.gsub("-", "_")
118
+ end
119
+
120
+ def set_value(value)
121
+ set_value_with_keys(value, @output_position)
122
+ end
123
+
124
+ def set_value_with_keys(value, keys)
125
+ prepare_hash keys
126
+ *key, last = keys
127
+
128
+ key.inject(@output, :fetch)[last] = value
129
+ end
130
+
131
+ def value_at(keys)
132
+ keys.inject(@output, :fetch)
133
+ rescue IndexError
134
+ nil
135
+ end
136
+
137
+ def prepare_hash(keys)
138
+ cursor = @output
139
+ keys[..-2].each do |key|
140
+ cursor[key] = {} unless cursor[key] && cursor[key] != ""
141
+ cursor = cursor[key]
142
+ end
143
+ end
144
+
145
+ def is_base?(name)
146
+ @bases.concat(@excludes).include?(name) || name == @source_position[0]
147
+ end
148
+
149
+ def is_numeric?(string)
150
+ true if Float(string)
151
+ rescue StandardError
152
+ false
153
+ end
154
+
155
+ def is_bool?(string)
156
+ string == true || string == false || string =~ (/(true|false)$/i) ? true : false
157
+ end
158
+
159
+ def try_as_number(string)
160
+ return string if is_bool?(string)
161
+ return string unless is_numeric?(string)
162
+
163
+ if string.include?(".")
164
+ string.to_f
165
+ else
166
+ string.to_i
167
+ end
168
+ end
169
+
170
+ def write_encounter
171
+ @encountered << source_position_string
172
+ end
173
+
174
+ def encountered_position?
175
+ @encountered.include? source_position_string
176
+ end
177
+
178
+ def source_position_string
179
+ @source_position.join(">")
180
+ end
181
+
182
+ def set_up_list
183
+ return if @output_position.any? { |x| x.is_a? Integer } && !at_list_node_item?
184
+
185
+ candidate_list = value_at @output_position[..-2]
186
+
187
+ case candidate_list
188
+ when Array
189
+ list_index = candidate_list.length
190
+ when nil
191
+ set_value_with_keys([], @output_position[..-2])
192
+ list_index = 0
193
+ else
194
+ set_value_with_keys([candidate_list.values[0]], @output_position[..-2])
195
+ list_index = 1
196
+ end
197
+
198
+ @output_position[-1] = list_index
199
+ end
200
+
201
+ def at_list_node_item?
202
+ @list_nodes.include?(@source_position[-2]) || at_rootless_list_node_item?
203
+ end
204
+
205
+ def at_rootless_list_node_item?
206
+ return unless @rootless_list_nodes.key?(@source_position[-1])
207
+
208
+ case value = @rootless_list_nodes[@source_position[-1]]
209
+ when String
210
+ true
211
+ else
212
+ value[:parents].all? { |val| @source_position.include? val }
213
+ end
214
+ end
215
+
216
+ def root_key_for_list
217
+ case value = @rootless_list_nodes[@source_position[-1]]
218
+ when String
219
+ value
220
+ else
221
+ value[:key]
222
+ end
223
+ end
224
+ end
225
+ end
226
+ end
@@ -26,6 +26,7 @@ module ViewModel
26
26
  RdSAP-Schema-NI-17.3
27
27
  ].freeze
28
28
  TYPES_OF_SAP = %i[
29
+ SAP-Schema-19.0.0
29
30
  SAP-Schema-18.0.0
30
31
  SAP-Schema-17.1
31
32
  SAP-Schema-17.0