epb_view_models 1.0.29 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (29) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -1
  3. data/Gemfile.lock +24 -24
  4. data/api/schemas/data/orchestrate.json +4 -0
  5. data/api/schemas/xml/SAP-Schema-19.1.0/SAP/ExternalDefinitions.xml +1735 -0
  6. data/api/schemas/xml/SAP-Schema-19.1.0/SAP/ExternalDefinitions.xsd +313 -0
  7. data/api/schemas/xml/SAP-Schema-19.1.0/SAP/Templates/AssessorManagement.xsd +275 -0
  8. data/api/schemas/xml/SAP-Schema-19.1.0/SAP/Templates/EPC-Certificate.xsd +632 -0
  9. data/api/schemas/xml/SAP-Schema-19.1.0/SAP/Templates/ExceptionList.xsd +20 -0
  10. data/api/schemas/xml/SAP-Schema-19.1.0/SAP/Templates/Property.xsd +85 -0
  11. data/api/schemas/xml/SAP-Schema-19.1.0/SAP/Templates/ReportList.xsd +27 -0
  12. data/api/schemas/xml/SAP-Schema-19.1.0/SAP/Templates/SAP-CollectedData.xsd +2500 -0
  13. data/api/schemas/xml/SAP-Schema-19.1.0/SAP/Templates/SAP-Compliance-Report.xsd +51 -0
  14. data/api/schemas/xml/SAP-Schema-19.1.0/SAP/Templates/SAP-Report.xsd +277 -0
  15. data/api/schemas/xml/SAP-Schema-19.1.0/SAP/UDT/EPC-Domains.xsd +646 -0
  16. data/api/schemas/xml/SAP-Schema-19.1.0/SAP/UDT/SAP-Domains.xsd +3421 -0
  17. data/epb_view_models.gemspec +2 -2
  18. data/lib/accessor/domestic_recommendations_accessor.rb +50 -0
  19. data/lib/epb_view_models.rb +1 -1
  20. data/lib/helper/xml_enums_to_output.rb +2 -0
  21. data/lib/presenter/rd_sap/domestic_digest.rb +0 -2
  22. data/lib/presenter/sap/domestic_digest.rb +1 -1
  23. data/lib/view_model/factory.rb +1 -0
  24. data/lib/view_model/rd_sap_schema_200/common_schema.rb +5 -4
  25. data/lib/view_model/sap_schema_1800/common_schema.rb +4 -2
  26. data/lib/view_model/sap_schema_1900/common_schema.rb +4 -2
  27. data/lib/view_model/sap_schema_1910/common_schema.rb +620 -0
  28. data/lib/view_model/sap_wrapper.rb +2 -0
  29. metadata +19 -5
@@ -5,8 +5,8 @@ require_relative "lib/epb_view_models"
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = "epb_view_models"
7
7
  spec.version = EpbViewModels::VERSION
8
- spec.authors = ["MHCLG Energy Performance of Buildings"]
9
- spec.email = ["mhclg.digital-services@communities.gov.uk"]
8
+ spec.authors = ["DLUHC Energy Performance of Buildings"]
9
+ spec.email = ["dluhc.digital-services@levellingup.gov.uk"]
10
10
  spec.summary = "Library used to parse Energy Performance Certificates (EPC)"
11
11
  spec.homepage = "https://github.com/communitiesuk/epb-view-models"
12
12
  spec.license = "MIT"
@@ -0,0 +1,50 @@
1
+ require "singleton"
2
+
3
+ module Accessor
4
+ class DomesticRecommendationsAccessor
5
+ include Singleton
6
+
7
+ RecommendationDetails = Struct.new(:summary, :description, keyword_init: true)
8
+
9
+ def fetch_details(schema_version:, improvement_number:)
10
+ unless memoized_schema?(schema_version)
11
+ assessment_type = schema_version.split("-").first
12
+ is_ni = schema_version.include? "-NI-"
13
+ definitions_document = Nokogiri::XML(File.open("api/schemas/xml/#{schema_version}/#{assessment_type}/ExternalDefinitions.xml"))
14
+ sub_object = {}
15
+ country_node = definitions_document.at_xpath("//Country[Country-Code[contains(text(), '#{is_ni ? 'NIR' : 'EAW'}')]]")
16
+ recommendations = country_node.search("Recommendation")
17
+ recommendations.each do |recommendation|
18
+ sub_object[recommendation.at_css("Improvement-Number").content] = {
19
+ summary: recommendation.at_css("Improvement-Summary[language='1']").content,
20
+ description: recommendation.at_css("Improvement-Description[language='1']").content,
21
+ }
22
+ end
23
+ memoize_schema_hash(schema_version, sub_object)
24
+ end
25
+ RecommendationDetails.new(**memoized_schema(schema_version)[improvement_number])
26
+ end
27
+
28
+ def reset!
29
+ @memo = nil
30
+ end
31
+
32
+ private
33
+
34
+ def memo
35
+ @memo ||= {}
36
+ end
37
+
38
+ def memoized_schema?(schema_version)
39
+ memo.key?(schema_version)
40
+ end
41
+
42
+ def memoize_schema_hash(schema_version, hash)
43
+ memo[schema_version] = hash
44
+ end
45
+
46
+ def memoized_schema(schema_version)
47
+ memo[schema_version]
48
+ end
49
+ end
50
+ end
@@ -5,7 +5,7 @@ loader = Zeitwerk::Loader.for_gem(warn_on_extra_files: false)
5
5
  loader.setup
6
6
 
7
7
  module EpbViewModels
8
- VERSION = "1.0.29"
8
+ VERSION = "1.1.1"
9
9
  end
10
10
 
11
11
  # Monkey patching to avoid using ActiveRecord::Type::Boolean.new.cast
@@ -372,6 +372,7 @@ module Helper
372
372
  ]
373
373
 
374
374
  schemes_that_use_l = %i[
375
+ SAP-Schema-19.1.0
375
376
  SAP-Schema-19.0.0
376
377
  SAP-Schema-18.0.0
377
378
  SAP-Schema-17.1
@@ -576,6 +577,7 @@ module Helper
576
577
  ]
577
578
 
578
579
  sap = %i[
580
+ SAP-Schema-19.1.0
579
581
  SAP-Schema-19.0.0
580
582
  SAP-Schema-18.0.0
581
583
  SAP-Schema-17.1
@@ -10,8 +10,6 @@ module Presenter
10
10
  end
11
11
 
12
12
  def to_domestic_digest
13
-
14
-
15
13
  {
16
14
  type_of_assessment: TYPE_OF_ASSESSMENT,
17
15
  assessment_id: @view_model.assessment_id,
@@ -35,7 +35,7 @@ module Presenter
35
35
  total_floor_area: @view_model.total_floor_area.to_s,
36
36
  has_mains_gas: @view_model.mains_gas,
37
37
  current_energy_efficiency_rating: @view_model.current_energy_rating,
38
- type_of_property: Helper::XmlEnumsToOutput.property_type(@view_model.property_type),
38
+ type_of_property: Helper::XmlEnumsToOutput.property_type(@view_model.property_type),
39
39
  }
40
40
  end
41
41
  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.1.0
29
30
  SAP-Schema-19.0.0
30
31
  SAP-Schema-18.0.0
31
32
  SAP-Schema-17.1
@@ -117,15 +117,16 @@ module ViewModel
117
117
  end
118
118
 
119
119
  def recommendations_for_report
120
+ accessor = Accessor::DomesticRecommendationsAccessor.instance
120
121
  @xml_doc
121
122
  .search("Suggested-Improvements Improvement")
122
123
  .map do |node|
124
+ improvement_code = xpath(%w[Improvement-Details Improvement-Number], node)
123
125
  {
124
126
  sequence: xpath(%w[Sequence], node).to_i,
125
- improvement_summary: xpath(%w[Improvement-Summary], node),
126
- improvement_description: xpath(%w[Improvement-Description], node),
127
- improvement_code:
128
- xpath(%w[Improvement-Details Improvement-Number], node),
127
+ improvement_code: xpath(%w[Improvement-Details Improvement-Number], node),
128
+ improvement_summary: improvement_code ? accessor.fetch_details(schema_version: "RdSAP-Schema-20.0.0", improvement_number: improvement_code).summary : xpath(%w[Improvement-Summary], node),
129
+ improvement_description: improvement_code ? accessor.fetch_details(schema_version: "RdSAP-Schema-20.0.0", improvement_number: improvement_code).description : xpath(%w[Improvement-Description], node),
129
130
  indicative_cost: xpath(%w[Indicative-Cost], node),
130
131
  }
131
132
  end
@@ -112,13 +112,15 @@ module ViewModel
112
112
  end
113
113
 
114
114
  def recommendations_for_report
115
+ accessor = Accessor::DomesticRecommendationsAccessor.instance
115
116
  @xml_doc
116
117
  .search("Suggested-Improvements Improvement")
117
118
  .map do |node|
119
+ improvement_code = xpath(%w[Improvement-Details Improvement-Number], node)
118
120
  {
119
121
  sequence: xpath(%w[Sequence], node).to_i,
120
- improvement_summary: xpath(%w[Improvement-Summary], node),
121
- improvement_description: xpath(%w[Improvement-Description], node),
122
+ improvement_summary: improvement_code ? accessor.fetch_details(schema_version: "SAP-Schema-18.0.0", improvement_number: improvement_code).summary : xpath(%w[Improvement-Summary], node),
123
+ improvement_description: improvement_code ? accessor.fetch_details(schema_version: "SAP-Schema-18.0.0", improvement_number: improvement_code).description : xpath(%w[Improvement-Description], node),
122
124
  improvement_code:
123
125
  xpath(%w[Improvement-Details Improvement-Number], node),
124
126
  indicative_cost: xpath(%w[Indicative-Cost], node),
@@ -114,13 +114,15 @@ module ViewModel
114
114
  end
115
115
 
116
116
  def recommendations_for_report
117
+ accessor = Accessor::DomesticRecommendationsAccessor.instance
117
118
  @xml_doc
118
119
  .search("Suggested-Improvements Improvement")
119
120
  .map do |node|
121
+ improvement_code = xpath(%w[Improvement-Details Improvement-Number], node)
120
122
  {
121
123
  sequence: xpath(%w[Sequence], node).to_i,
122
- improvement_summary: xpath(%w[Improvement-Summary], node),
123
- improvement_description: xpath(%w[Improvement-Description], node),
124
+ improvement_summary: improvement_code ? accessor.fetch_details(schema_version: "SAP-Schema-19.0.0", improvement_number: improvement_code).summary : xpath(%w[Improvement-Summary], node),
125
+ improvement_description: improvement_code ? accessor.fetch_details(schema_version: "SAP-Schema-19.0.0", improvement_number: improvement_code).description : xpath(%w[Improvement-Description], node),
124
126
  improvement_code:
125
127
  xpath(%w[Improvement-Details Improvement-Number], node),
126
128
  indicative_cost: xpath(%w[Indicative-Cost], node),