epb_view_models 1.0.29 → 1.1.1

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.
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),