appraisermetrics_report_service 0.0.3 → 0.0.4

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7ea1a3db1106b824e90acc0a98e6aa295f4973de
4
- data.tar.gz: 8e8183f7d518c8462659937c60adaf3ae723f053
3
+ metadata.gz: 8eaea4b3783b9d12df2a7b0035cd65095f026af6
4
+ data.tar.gz: b02ebed32be3b8aab7ebe198d095804554a76a96
5
5
  SHA512:
6
- metadata.gz: 6789d220bfaf967c1eb54e2bd32f34084dd089c070f85ef11d9732837d92d36fce897c604adcd76f3d713592236cd44f232930db22bea337aa28e45976c13131
7
- data.tar.gz: bc774c1d990d4b024d70ec2e930a4f5abdd5d54f9c400ece560bcd065622ad094056162b78534538c947fb19b7934e03d04e1bce454fff45207838cdc69f3b43
6
+ metadata.gz: b7d20fac048b0393d089904eb65e3f5a828d3084e0051de6f5cd6187ab3aed0df878b0bba27d8bd5f4256ada62bc2f37fe543cb401c36a3a0b795c6f71a63e71
7
+ data.tar.gz: 4f1702adde2eef2f9eb7f632bd8bd82f550491fe907c5efc2d9cd8e437b6e2b8a29960908acf5a71737b6680ec0a6c1b20ee9088c3d1b3a106992e1f0b87be8d
data/.gitignore CHANGED
@@ -13,5 +13,6 @@
13
13
  *.a
14
14
  mkmf.log
15
15
  Gemfile.lock
16
- *.pdf
16
+ /eval.pdf
17
+ /closed_sale.pdf
17
18
  /todo.txt
data/README.md CHANGED
@@ -40,7 +40,9 @@ end
40
40
  ```ruby
41
41
  # generate an eval report
42
42
  r = EvalReport.new do
43
- write_content(subject, comparables, images, logo) # images is a hash, subject is a hash, comparables is an array, logo is a filepath
43
+ write_content(subject, comparables, images, logo, docs={})
44
+ # images is a hash, subject is a hash, comparables is an array, logo is a filepath
45
+ # docs is an options hash that will accept file paths for related pdf and image files
44
46
  end
45
47
 
46
48
  # image hash construction: {subject_photos: [], regional_maps: [], topo_maps: [], ag_sales_map: String}
@@ -16,11 +16,15 @@ Gem::Specification.new do |spec|
16
16
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
17
17
  spec.require_paths = ["lib"]
18
18
 
19
+ spec.add_dependency "ttfunk", "~>1.2.0"
20
+ spec.add_dependency "pdf-core", "<0.3.1"
19
21
  spec.add_development_dependency "bundler", "~> 1.6"
20
22
  spec.add_development_dependency "rake", "~> 10.0"
21
23
  spec.add_development_dependency "rspec"
22
24
  spec.add_development_dependency "pdf-reader"
25
+
23
26
  spec.add_dependency "prawn-table"
24
- spec.add_dependency "prawn"
25
- spec.add_dependency "money"
27
+ spec.add_dependency "prawn", "~> 1.2.1"
28
+ spec.add_dependency "prawn-templates"
29
+ spec.add_dependency "money", "~> 6.5.0"
26
30
  end
@@ -1,6 +1,7 @@
1
1
  module AppraisermetricsReportService
2
2
  require 'prawn'
3
3
  require 'prawn/table'
4
+ require 'prawn/templates'
4
5
  require 'money'
5
6
  require 'report_utils'
6
7
  require 'closed_sale'
@@ -1,3 +1,3 @@
1
1
  module AppraisermetricsReportService
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
data/lib/closed_sale.rb CHANGED
@@ -49,8 +49,6 @@ class ClosedSale < Prawn::Document
49
49
  estimated_productivity
50
50
  perm_plantings
51
51
  externalities
52
-
53
- start_new_page
54
52
  ## page 4 ##
55
53
  additional_images
56
54
 
@@ -67,8 +65,8 @@ class ClosedSale < Prawn::Document
67
65
  def meta_data
68
66
  bounding_box([0, 690], width: 270, height: 55) do
69
67
  meta_data = [
70
- ["Record Number:", @rep[:sequence]],
71
- ["Record Created By:", @rep[:record_created_by]],
68
+ ["Record Number:", "#{@rep[:sequence]}"],
69
+ ["Record Created By:", "#{@rep[:record_created_by]}"],
72
70
  ["Date Created or Last Modified:", datemaker(@rep[:record_edited])]
73
71
  ]
74
72
 
@@ -118,7 +116,7 @@ class ClosedSale < Prawn::Document
118
116
 
119
117
  classification_data.push(
120
118
  [
121
- l[:landclass],
119
+ "#{l[:landclass]}",
122
120
  '%.2f' % no_nil_number(l[:numacres]), # => adds .00 to acres
123
121
  per_acre_string,
124
122
  total_string
@@ -180,8 +178,8 @@ class ClosedSale < Prawn::Document
180
178
  [
181
179
  i[:incomesrc],
182
180
  moneymaker(i[:stabcashperunit], false),
183
- '%.2f' % i[:stabilizedyield],
184
- '%.2f' % i[:totalunits]
181
+ '%.2f' % no_nil_number(i[:stabilizedyield]),
182
+ '%.2f' % no_nil_number(i[:totalunits])
185
183
  ]
186
184
  )
187
185
  end
@@ -206,7 +204,7 @@ class ClosedSale < Prawn::Document
206
204
  bounding_box([0, 690], width: 270, height: 125) do
207
205
  comments_data = [
208
206
  ["Comments"],
209
- [@rep[:general_comments]]
207
+ ["#{@rep[:general_comments]}"]
210
208
  ]
211
209
 
212
210
  table(comments_data) do
@@ -223,9 +221,9 @@ class ClosedSale < Prawn::Document
223
221
  def property_class
224
222
  bounding_box([270, 690], width: 270, height: 55) do
225
223
  property_data = [
226
- ["Property Classification:", @rep[:land_use_zone]],
227
- ["Transaction Type:", @rep[:type_of_transaction]],
228
- ["Property Name:", @rep[:property_name]]
224
+ ["Property Classification:", "#{@rep[:land_use_zone]}"],
225
+ ["Transaction Type:", "#{@rep[:type_of_transaction]}"],
226
+ ["Property Name:", "#{@rep[:property_name]}"]
229
227
  ]
230
228
 
231
229
  table(property_data) do
@@ -251,13 +249,13 @@ class ClosedSale < Prawn::Document
251
249
  property_inclusions = no_nil_array(@rep[:property_inclusions]).join(" ")
252
250
  type_and_address_data = [
253
251
  [{content: "Property Type and Address", colspan: 4}],
254
- ["Property Name:", @rep[:property_name], "Primary Land Use:", @rep[:primary_ag_use]],
252
+ ["Property Name:", "#{@rep[:property_name]}", "Primary Land Use:", "#{@rep[:primary_ag_use]}"],
255
253
  ["What does this property include?",
256
254
  {content: property_inclusions, colspan: 3}],
257
255
  ["Address:", {content: "#{@rep[:property_address_number]}" + " #{@rep[:street_or_road_name]}", colspan: 3}],
258
- ["City:", @rep[:city], "County:", @rep[:ordinance_authority]],
259
- ["State:", no_nil_string(@rep[:county_state]).strip.split('').last(2).join(""), "Zip Code:", @rep[:zip_code]],
260
- ["Township/Range:","#{@rep[:townshipINT]}" + "#{@rep[:rangeINT]}", "Section(s):", @rep[:legal_description]],
256
+ ["City:", "#{@rep[:city]}", "County:", "#{@rep[:ordinance_authority]}"],
257
+ ["State:", "#{@rep[:county_state]}".strip.split('').last(2).join(""), "Zip Code:", "#{@rep[:zip_code]}"],
258
+ ["Township/Range:","#{@rep[:townshipINT]}" + "#{@rep[:rangeINT]}", "Section(s):", "#{@rep[:legal_description]}"],
261
259
  ["Latitude:", lat, "Longitude:", long],
262
260
  [{content: "Property Location and Directions:" + "#{@rep[:directions_or_ownership_comments]}", colspan: 4}]
263
261
  ]
@@ -284,9 +282,9 @@ class ClosedSale < Prawn::Document
284
282
  [{content: "Transaction Summary", colspan: 4}],
285
283
  ["Sale Price $:", price, "Sale Date:", datemaker(@rep[:sale_date])],
286
284
  ["Cond. Adjust $:", '(' + adjustment +')', "Adj. CE Sale $:", ce_sale_price],
287
- ["Unit Description:", @rep[:unit], "No. of Units:", '%.2f' % no_nil_number(@rep[:num_of_units])],
288
- ["Instrument No.:", @rep[:public_rec_ref_numer], "$/Unit:", moneymaker(@rep[:cesaleunitprice], true)],
289
- ["Seller:", @rep[:grantor], "Buyer:", @rep[:grantee]],
285
+ ["Unit Description:", "#{@rep[:unit]}", "No. of Units:", '%.2f' % no_nil_number(@rep[:num_of_units])],
286
+ ["Instrument No.:", "#{@rep[:public_rec_ref_numer]}", "$/Unit:", moneymaker(@rep[:cesaleunitprice], true)],
287
+ ["Seller:", "#{@rep[:grantor]}", "Buyer:", "#{@rep[:grantee]}"],
290
288
  ["Extent of Verification:", {content: no_nil_array(@rep[:verifications]).join(', '), colspan: 3}],
291
289
  [{content: "#{@rep[:grantor]}" + " #{@rep[:information_source_contact]}",
292
290
  colspan: 2}, "Date Inspected:", datemaker(@rep[:date_inspected])
@@ -310,14 +308,14 @@ class ClosedSale < Prawn::Document
310
308
  bounding_box([270, 360], height: 180, width: 270) do
311
309
  overview_data = [
312
310
  [{content: "Physical Overview", colspan: 4}],
313
- ["Farming Practice:", @rep[:farming_practices], {content: "Predominant Soil Type and Description:", colspan: 2}],
314
- ["Ann. Rainfall-Inches:", @rep[:avg_precipitation], {content: @rep[:soils], colspan: 2, rowspan: 3}],
315
- ["Avg Frost Free Days:", @rep[:growing_season]],
316
- ["Elevation(Range):", @rep[:elevation]],
317
- ["Predom Top Slope:", @rep[:topography], "Legal Access:", {content: @rep[:legal_access], rowspan: 2}],
311
+ ["Farming Practice:", "#{@rep[:farming_practices]}", {content: "Predominant Soil Type and Description:", colspan: 2}],
312
+ ["Ann. Rainfall-Inches:", "#{@rep[:avg_precipitation]}", {content: "#{@rep[:soils]}", colspan: 2, rowspan: 3}],
313
+ ["Avg Frost Free Days:", "#{@rep[:growing_season]}"],
314
+ ["Elevation(Range):", "#{@rep[:elevation]}"],
315
+ ["Predom Top Slope:", "#{@rep[:topography]}", "Legal Access:", {content: "#{@rep[:legal_access]}", rowspan: 2}],
318
316
  ["Corn Suitability Rating:", @rep[:CSR2]],
319
- ["Land Use Zone:", @rep[:land_use_zone], "Physical Access:", @rep[:physical_access]],
320
- ["Flood Zone:", no_nil_array(@rep[:flood_zone]).join(", "), "Wetlands:", @rep[:wetlands]],
317
+ ["Land Use Zone:", "#{@rep[:land_use_zone]}", "Physical Access:", "#{@rep[:physical_access]}"],
318
+ ["Flood Zone:", no_nil_array(@rep[:flood_zone]).join(", "), "Wetlands:", "#{@rep[:wetlands]}"],
321
319
  [{content: "Land Development Potential, Change or Use, or Limitations Comments:", colspan: 4}],
322
320
  [{content: "#{@rep[:development_potential]}" , colspan: 4}]
323
321
  ]
@@ -389,12 +387,12 @@ class ClosedSale < Prawn::Document
389
387
  [{content: "Legal/Transaction Detail", colspan: 4}],
390
388
  ["Tax Parcel ID(s)", tax_parcel_no, " ", " "],
391
389
  [" ", " ", " ", " "],
392
- ["Year of Assessment:", @rep[:year_of_assessment], "Year of RE Taxes:", @rep[:year_of_real_estate_taxes]],
390
+ ["Year of Assessment:", "#{@rep[:year_of_assessment]}", "Year of RE Taxes:", "#{@rep[:year_of_real_estate_taxes]}"],
393
391
  ["Assessed Value:", assessed_value, "RE Taxes", real_estate_taxes],
394
- ["Financing:", @rep[:financing_type], "Property Rights:", @rep[:property_rights]],
395
- ["At Market Trans?:", @rep[:atmarket_trans], "Days on Market:", @rep[:exposure_period]],
392
+ ["Financing:", "#{@rep[:financing_type]}", "Property Rights:", "#{@rep[:property_rights]}"],
393
+ ["At Market Trans?:", "#{@rep[:atmarket_trans]}", "Days on Market:", "#{@rep[:exposure_period]}"],
396
394
  [{content: "Transaction History Comments:", colspan: 4}],
397
- [{content: @rep[:listing_comments], colspan: 4}]
395
+ [{content: "#{@rep[:listing_comments]}", colspan: 4}]
398
396
  ]
399
397
 
400
398
  table(legal_transaction_data) do
@@ -422,7 +420,7 @@ class ClosedSale < Prawn::Document
422
420
  transactions.each do |t|
423
421
  if t # array could be nil
424
422
  transaction_history_data.push(
425
- [t[:transType], t[:transDescr], datemaker(t[:transDate]), moneymaker(t[:price], true)]
423
+ ["#{t[:transType]}", "#{t[:transDescr]}", datemaker(t[:transDate]), moneymaker(t[:price], true)]
426
424
  )
427
425
  end
428
426
  end
@@ -452,7 +450,7 @@ class ClosedSale < Prawn::Document
452
450
  utilities.each do |u|
453
451
  if u # array could be empty
454
452
  utilities_data.push(
455
- [u[:description], u[:availbility], u[:provider], u[:comments]]
453
+ ["#{u[:description]}", "#{u[:availability]}", "#{u[:provider]}", "#{u[:comments]}"]
456
454
  )
457
455
  end
458
456
  end
@@ -502,7 +500,7 @@ class ClosedSale < Prawn::Document
502
500
  rights.each do |r|
503
501
  if r # array could be empty
504
502
  water_rights_data.push(
505
- [r[:waterrightNum], r[:waterRight], r[:waterSrc], datemaker(r[:priorityDate]), r[:purpose], r[:numIrrAcres], r[:annVolume]]
503
+ ["#{r[:waterrightNum]}", "#{r[:waterRight]}", "#{r[:waterSrc]}", datemaker(r[:priorityDate]), "#{r[:purpose]}", "#{r[:numIrrAcres]}", "#{r[:annVolume]}"]
506
504
  )
507
505
  end
508
506
  end
@@ -535,7 +533,7 @@ class ClosedSale < Prawn::Document
535
533
  distributions.each do |d|
536
534
  if d # array could be empty
537
535
  distribution_data.push(
538
- [d[:waterdistrEq], d[:manufacturer], d[:brand], d[:eqType], d[:descr], d[:yearManuf], d[:remainingEcLife], d[:irrAcres]]
536
+ ["#{d[:waterdistrEq]}", "#{d[:manufacturer]}", "#{d[:brand]}", "#{d[:eqType]}", "#{d[:descr]}", "#{d[:yearManuf]}", "#{d[:remainingEcLife]}", "#{d[:irrAcres]}"]
539
537
  )
540
538
  end
541
539
  end
@@ -568,7 +566,7 @@ class ClosedSale < Prawn::Document
568
566
  crops.each do |c|
569
567
  if c # array could be empty
570
568
  crop_data.push(
571
- [c[:year], c[:commodity], c[:unit], c[:avgyield]]
569
+ ["#{c[:year]}", "#{c[:commodity]}", "#{c[:unit]}", "#{c[:avgyield]}"]
572
570
  )
573
571
  end
574
572
  end
@@ -630,7 +628,7 @@ class ClosedSale < Prawn::Document
630
628
  plantings.each do |p|
631
629
  if p # array could be empty
632
630
  planting_data.push(
633
- [p[:planting], p[:variety], p[:acres], p[:numacres], p[:avgage], p[:plantsacre], p[:unitdescr1], p[:avgproduction]]
631
+ ["#{p[:planting]}", "#{p[:variety]}", "#{p[:acres]}", "#{p[:numacres]}", "#{p[:avgage]}", "#{p[:plantsacre]}", "#{p[:unitdescr1]}", "#{p[:avgproduction]}"]
634
632
  )
635
633
  end
636
634
  end
@@ -667,6 +665,7 @@ class ClosedSale < Prawn::Document
667
665
 
668
666
  def additional_images
669
667
  if @property_images && @property_images.any?
668
+ start_new_page
670
669
  if @property_images[1]
671
670
  bounding_box([0, 690], height: 330, width: 250) do
672
671
  image @property_images[1], width: 240
data/lib/eval_report.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  class EvalReport < Prawn::Document
2
2
  require 'prawn'
3
3
  require 'prawn/table'
4
+ require 'prawn/templates'
4
5
  require 'date'
5
6
 
6
7
  include ReportUtils # utility methods used across reports
@@ -9,15 +10,17 @@ class EvalReport < Prawn::Document
9
10
  super()
10
11
  end
11
12
 
12
- def write_content(subject, comparables, images, logo) # main method to populate pdf
13
+ def write_content(subject, comparables, images, logo, docs={}) # main method to populate pdf
13
14
  # variables used across instance methods
14
15
  @logo = logo
15
16
  @sub = subject
16
17
  @comps = comparables
18
+ @comps ||= [] # avoid calling methods on nil
17
19
  @images = images
18
20
  @text_blocks = static_strings # Hash of text blocks loaded from .yml
19
21
  @recon_primary_per_acre = [] # used for reconciliation for comparables
20
22
  @recon_secondary_per_acre = [] # ""
23
+ @docs = docs
21
24
 
22
25
  # font defaults to Helvetica
23
26
  font_size 11
@@ -34,7 +37,6 @@ class EvalReport < Prawn::Document
34
37
  property_description
35
38
  property_features
36
39
  value_intro
37
- comp_methodology
38
40
  property_comparison # landscape
39
41
  discussion_of_sales # landscape
40
42
  ag_sales_map
@@ -137,6 +139,7 @@ class EvalReport < Prawn::Document
137
139
 
138
140
  move_cursor_to 450
139
141
  text "Dear " << "#{@sub[:clientid]},"
142
+ move_down 10
140
143
  text @text_blocks[:transmittal]
141
144
  start_new_page
142
145
  end
@@ -213,11 +216,9 @@ class EvalReport < Prawn::Document
213
216
  text "Table of Contents", size: 14
214
217
  move_down 25
215
218
 
216
- contents = ["INTRODUCTION", "SCOPE OF WORK", "REGIONAL MAPS", "MAPS",
217
- "PROPERTY DESCRIPTION, SURROUNDING LAND USES, REGIONAL ECONOMIC AND \nDEMOGRAPHIC OVERVIEW", "HIGHEST AND BEST USE",
218
- "SALES COMPARISON APPROACH", "METHODOLOGY", "DISCUSSION OF SALES USED", "GLOSSARY OF TERMS & DEFINITIONS", "CASH EQUIVALENCE",
219
- "ELLWOOD FORMULA", "EXPOSURE TIME","FEE SIMPLE ESTATE", "LEASED FEE INTEREST", "LEASEHOLD INTEREST", "MARKET RENT", "MARKET VALUE",
220
- "ADDENDA CONTENTS"
219
+ contents = ["INTRODUCTION", "PROPERTY IDENTIFICATION", "REGIONAL MAPS", "LOCAL MAPS",
220
+ "PROPERTY DESCRIPTION", "VALUATION PROCESS", "DIRECT COMPARISON ANALYSIS", "DISCUSSION OF SALES USED",
221
+ "AGRICULTURAL SALES MAP", "FINAL VALUE INDICATION","ASSUMPTIONS AND CONDITIONS", "ADDENDA CONTENTS"
221
222
  ]
222
223
 
223
224
  contents.each do |c|
@@ -378,8 +379,8 @@ class EvalReport < Prawn::Document
378
379
 
379
380
  general_data = [
380
381
  [{content: "General Information", colspan:2}],
381
- ["Effective Date of Analysis:", @sub[:effvaluedateasis]],
382
- ["Property Rights Being Analyzed:", @sub[:property_rights]],
382
+ ["Effective Date of Analysis:", "#{@sub[:effvaluedateasis]}"],
383
+ ["Property Rights Being Analyzed:", "#{@sub[:property_rights]}"],
383
384
  ["Total No. Acres:", @number_acres]
384
385
  ]
385
386
 
@@ -419,27 +420,27 @@ class EvalReport < Prawn::Document
419
420
 
420
421
  identification_data = [
421
422
  [{content: "Property Identification", colspan: 2}],
422
- ["Property Owner:", @sub[:curr_owner]],
423
- ["Property Name:", @sub[:property_name]],
423
+ ["Property Owner:", "#{@sub[:curr_owner]}"],
424
+ ["Property Name:", "#{@sub[:property_name]}"],
424
425
  ["Street Address:", street_address],
425
- ["City:", @sub[:city]],
426
+ ["City:", "#{@sub[:city]}"],
426
427
  ["State:", state_string],
427
- ["Zip Code:", @sub[:zip_code]],
428
+ ["Zip Code:", "#{@sub[:zip_code]}"],
428
429
  ["Latitude/Longitude:", lat_long_string],
429
430
  ["Meridian/Township/Range:", meridian_town_range],
430
- ["Brief Legal:", @sub[:legal_description]],
431
+ ["Brief Legal:", "#{@sub[:legal_description]}"],
431
432
  ["Tax Parcel ID(s):", parcel_nos],
432
433
  ["RE Taxes/ $/Acre:", re_tax_string],
433
- ["Assessed Value of Land:", @sub[:total_assess_value]],
434
- ["Current Real Estate Taxes", @sub[:total_RET]],
434
+ ["Assessed Value of Land:", "#{@sub[:total_assess_value]}"],
435
+ ["Current Real Estate Taxes", "#{@sub[:total_RET]}"],
435
436
  ["Total Number of Acres:", @number_acres],
436
437
  ["Land Use Zone and Allowed Uses:", "#{@sub[:land_use_zone]}, #{@sub[:allowed_uses_and_limitations]}"],
437
- ["Does property conform to zoning?:", @sub[:conf_type]],
438
+ ["Does property conform to zoning?:", "#{@sub[:conf_type]}"],
438
439
  ["Is Property located in Flood Zone/Wetland?:", "#{@sub[:flood_zone]} #{@sub[:wetlands]}"],
439
440
  ["Is Property currently listed, under contract? If property has sold in prior 3 years see Transaction History table below.", "#{@sub[:under_purchase_agr]}, #{@sub[:listed_for_sale]}"],
440
441
  ["Does Property have Legal Access? How?:", "#{@sub[:has_legal_access]} / #{@sub[:legal_access]}"],
441
442
  ["Does the property have Physical Access? How?:", "#{@sub[:has_physical_access]} / #{@sub[:physical_access]}"],
442
- ["Easements, ROW or Encroachments:", @sub[:easements_description]]
443
+ ["Easements, ROW or Encroachments:", "#{@sub[:easements_description]}"]
443
444
  ]
444
445
 
445
446
  table(identification_data) do
@@ -456,10 +457,10 @@ class EvalReport < Prawn::Document
456
457
  bounding_box([340, 645], height: 300, width: 200) do
457
458
  neighborhood_data = [
458
459
  [{content: "Neighborhood Information", colspan: 2}],
459
- ["Land Use North:", @sub[:north_land]],
460
- ["Land Use South:", @sub[:south_land]],
461
- ["Land Use East:", @sub[:east_land]],
462
- ["Land Use West:", @sub[:west_land]],
460
+ ["Land Use North:", "#{@sub[:north_land]}"],
461
+ ["Land Use South:", "#{@sub[:south_land]}"],
462
+ ["Land Use East:", "#{@sub[:east_land]}"],
463
+ ["Land Use West:", "#{@sub[:west_land]}"],
463
464
  [{content: "Comments - Distance to Services, Farm to Market, etc.:", colspan: 2}],
464
465
  [{content: "#{@sub[:SWOT_analysis1]}", colspan: 2}]
465
466
  ]
@@ -467,8 +468,8 @@ class EvalReport < Prawn::Document
467
468
  table(neighborhood_data) do
468
469
  cells.style(border_width: 0)
469
470
  cells.padding = [1, 2.5]
471
+ column(0).style(align: :right)
470
472
  row(0).style(align: :center, font_style: :bold, border_bottom_width: 0.5)
471
- column(0).style(border_right_width: 0.5)
472
473
  column(0).width = 80
473
474
  column(1).width = 120
474
475
  end
@@ -536,7 +537,7 @@ class EvalReport < Prawn::Document
536
537
  end
537
538
 
538
539
  # conditional strings
539
- is_encumbered = @sub[:occupancy] == "leased" || @sub[:occupancy] = "partially leased" ? "Yes" : "No"
540
+ is_encumbered = @sub[:occupancy] == "leased" || @sub[:occupancy] == "partially leased" ? "Yes" : "No"
540
541
  end_of_lease = @sub[:lease_data] && @sub[:lease_data].any? ? @sub[:lease_data][0][:endLeaseDate] : "NA"
541
542
 
542
543
  if @sub[:inclusions]
@@ -581,7 +582,7 @@ class EvalReport < Prawn::Document
581
582
  table(description_data2) do
582
583
  cells.style(border_width: 0)
583
584
  cells.padding = [1, 2.5]
584
- column(0).style(border_right_width: 0.5, align: :right)
585
+ column(0).style(align: :right)
585
586
  column(0..1).width = 135
586
587
  end
587
588
 
@@ -625,9 +626,9 @@ class EvalReport < Prawn::Document
625
626
  table(description_data) do
626
627
  cells.style(border_width: 0)
627
628
  cells.padding = [1, 2.5]
628
- column(0).style(border_right_width: 0.5, align: :right)
629
+ column(0).style(align: :right)
629
630
  row(-2).style(align: :center, border_bottom_width: 0.5, border_top_width: 0.5)
630
- row(-1).style(align: :right)
631
+ row(-1).style(align: :left)
631
632
 
632
633
  end
633
634
 
@@ -686,11 +687,8 @@ class EvalReport < Prawn::Document
686
687
  text "VALUATION PROCESS", size: 14, style: :bold
687
688
  move_down 20
688
689
  text "#{@text_blocks[:valuation_process]}"
689
- start_new_page
690
- end
691
690
 
692
- def comp_methodology
693
- header("DIRECT COMPARISON METHODOLOGY")
691
+
694
692
  move_down 25
695
693
  text "ESTIMATE OF VALUE BY DIRECT COMPARISON METHODOLOGY", size: 14, style: :bold
696
694
  move_down 20
@@ -701,14 +699,31 @@ class EvalReport < Prawn::Document
701
699
  def property_comparison
702
700
  header("DIRECT COMPARISON ANALYSIS")
703
701
  move_down 25
704
- font_size 6
702
+ font_size 7
705
703
 
706
- table(flip_comp_array) do
707
- column(0).width = 85
708
- columns(1..7).width = 65
704
+ table(flip_comp_array(@comps.first(5))) do
705
+ column(0).width = 90
706
+ columns(1..6).width = 75
709
707
  cells.padding = [1, 2.5]
710
- columns(1..7).style(align: :center)
708
+ columns(1..6).style(align: :center)
709
+ end
710
+
711
+ if @comps.length > 5
712
+ start_new_page
713
+ header("DIRECT COMPARISON ANALYSIS")
714
+ move_down 25
715
+ font_size 7
716
+
717
+ second_page_comps = flip_comp_array(@comps[5..9])
718
+ second_page_comps[1].delete_at(-1) # remove the extra sale header on the second page of sales
719
+ table(second_page_comps) do
720
+ column(0).width = 90
721
+ columns(1..6).width = 75
722
+ cells.padding = [1, 2.5]
723
+ columns(1..6).style(align: :center)
724
+ end
711
725
  end
726
+
712
727
  start_new_page
713
728
  font_size 11
714
729
  end
@@ -716,42 +731,61 @@ class EvalReport < Prawn::Document
716
731
  def discussion_of_sales
717
732
  header("DIRECT COMPARISON ANALYSIS")
718
733
 
719
- discussion_data = [
720
- ["Subject", "Sale 1", "Sale 2", "Sale 3", "Sale 4", "Sale 5", "Sale 6"]
721
- ]
722
-
723
- sale_discussions = ["N/A"]
724
- @comps.each do |c|
725
- c_string = "#{c[:directions_or_ownership_comments]}\n\n" << "#{c[:allowed_uses_and_limitations]}\n\n"
726
- c_string << "#{c[:development_potential]}\n\n" << "#{c[:comments_on_floodways]}\n\n" << "#{c[:sale_adjustment_comments]}\n\n"
727
- c_string << "#{c[:general_comments]}\n\n" << "#{c[:atmarket_comments]}\n\n" << "#{c[:listing_comments]}\n\n"
728
- c_string << "#{c[:lease_comments]}\n\n" << "#{c[:change_of_use]}\n\n" << "#{c[:water_rights_comment]}\n\n"
729
- c_string << "#{c[:water_distribution_comment]}\n\n" << "#{c[:accessibility]}\n\n" << "#{c[:easements_description]}\n\n"
730
- c_string << "#{c[:elevation]}\n\n" << "#{c[:property_improvement_comments]}\n\n" << "#{c[:income_comments]}"
731
-
732
- # build on sub-array
733
- sale_discussions << c_string
734
- end
734
+ if @comps && @comps.any? # just skip the table if there aren't any comps
735
735
 
736
- # push subarray to main table array
737
- discussion_data << sale_discussions
736
+ table(flip_discussions(@comps.first(5))) do
737
+ cells.padding = [1, 2.5]
738
+ columns(0..5).width = 90
739
+ row(0).style(align: :center, background_color: 'd7d7d7')
740
+ cells.style(border_width: 0)
741
+ columns(0..5).style(border_right_width: 0.5)
742
+ end
738
743
 
739
- table(discussion_data) do
740
- cells.padding = [1, 2.5]
741
- columns(0..6).width = 77
742
- row(0).style(align: :center, background_color: 'd7d7d7')
743
- cells.style(border_width: 0)
744
- columns(0..6).style(border_right_width: 0.5)
744
+ if @comps.length > 5
745
+ start_new_page
746
+ header("DIRECT COMPARISON ANALYSIS")
747
+ table(flip_discussions(@comps[5..9])) do
748
+ cells.padding = [1, 2.5]
749
+ columns(0..5).width = 90
750
+ row(0).style(align: :center, background_color: 'd7d7d7')
751
+ cells.style(border_width: 0)
752
+ columns(0..5).style(border_right_width: 0.5)
753
+ end
754
+ end
745
755
  end
746
-
747
756
  start_new_page
748
757
  end
749
758
 
759
+ def flip_discussions(comps_to_flip)
760
+ @discussion_increment ||= 1
761
+ discussion_data = [
762
+ ["Subject"]
763
+ ]
764
+ sale_discussions = ["N/A"]
765
+ comps_to_flip.each do |c|
766
+ c_string = "#{c[:directions_or_ownership_comments]}\n\n" << "#{c[:allowed_uses_and_limitations]}\n\n"
767
+ c_string << "#{c[:development_potential]}\n\n" << "#{c[:comments_on_floodways]}\n\n" << "#{c[:sale_adjustment_comments]}\n\n"
768
+ c_string << "#{c[:general_comments]}\n\n" << "#{c[:atmarket_comments]}\n\n" << "#{c[:listing_comments]}\n\n"
769
+ c_string << "#{c[:lease_comments]}\n\n" << "#{c[:change_of_use]}\n\n" << "#{c[:water_rights_comment]}\n\n"
770
+ c_string << "#{c[:water_distribution_comment]}\n\n" << "#{c[:accessibility]}\n\n" << "#{c[:easements_description]}\n\n"
771
+ c_string << "#{c[:elevation]}\n\n" << "#{c[:property_improvement_comments]}\n\n" << "#{c[:income_comments]}"
772
+
773
+ # build on sub-array
774
+ discussion_data[0] << "Sale #{@discussion_increment}"
775
+ @discussion_increment += 1
776
+ sale_discussions << c_string
777
+ end
778
+ # push subarray to main table array
779
+ discussion_data << sale_discussions
780
+
781
+ return discussion_data
782
+ end
783
+
750
784
  def ag_sales_map
751
785
  header("AGRICULTURE SALES LOCATION MAP")
752
786
  move_down 50
753
787
  if @images && @images[:ag_sales_map]
754
- image "#{@images[:ag_sales_map]}", width: 500, align: :center
788
+ image "#{@images[:ag_sales_map]}", width: 500, position: :center
755
789
  else
756
790
  text 'No Image'
757
791
  end
@@ -766,31 +800,91 @@ class EvalReport < Prawn::Document
766
800
  move_down 20
767
801
  text @text_blocks[:val_method]
768
802
  move_down 10
769
- text "The previous analysis indicated the following:"
770
- move_down 10
771
803
 
772
- parallel_text("Average Primary Land Value/Unit", "#{average_primary_land_val(@recon_primary_per_acre).format(no_cents: true)}", 200)
773
- move_down 20
774
- parallel_text("Median Primary Land Value/Unit", "#{median_primary_land_val(@recon_primary_per_acre).format(no_cents: true)}", 200)
775
- move_down 20
776
- parallel_text("Maximum Primary Land Value/Unit", "#{maximum_primary_land_val(@recon_primary_per_acre).format(no_cents: true)}", 200)
777
- move_down 20
778
- parallel_text("Minimum Primary Land Value/Unit", "#{minimum_primary_land_val(@recon_primary_per_acre).format(no_cents: true)}", 200)
779
- move_down 20
780
- parallel_text("Unit of Comparison", "$/Acre", 200)
781
- move_down 20
782
- parallel_text("Indicated Value per Unit", "stubbed", 200)
783
- move_down 20
784
- parallel_text("Indicated Primary Land Value/Unit", "stubbed", 200)
785
- move_down 20
786
- parallel_text("Indicated Secondary Land Value/Unit", "stubbed", 200)
787
- move_down 20
788
- parallel_text("Improvement Value Allocation", "stubbed", 200)
789
- move_down 20
790
- parallel_text("Overall Indicated Value", "stubbed", 200)
791
- move_down 20
792
- parallel_text("SAY", "stubbed", 200)
793
- start_new_page
804
+ indent(50) do
805
+ text "SUMMATION:"
806
+ move_down 10
807
+
808
+ # prepare primary land values for calculation
809
+ prepare_comps_for_calc
810
+
811
+ improvements = @sub[:improvements]
812
+
813
+ if improvements && improvements.any?
814
+ cents = improvements.inject(0) do |memo, improv|
815
+ memo += improv[:depval][:cents]; memo
816
+ end
817
+
818
+ total_dep = Money.new(cents, 'USD')
819
+ else
820
+ total_dep = Money.new(0, 'USD')
821
+ end
822
+
823
+ # get land class acres for calcs
824
+ if @sub[:landclassifications] && @sub[:landclassifications].any?
825
+ units_primary = @sub[:landclassifications][0][:numacres]
826
+
827
+ if @sub[:landclassifications][1]
828
+ units_secondary = @sub[:landclassifications][1][:numacres]
829
+ else
830
+ units_secondary = 0
831
+ end
832
+ else
833
+ units_primary = 0
834
+ units_secondary = 0
835
+ end
836
+
837
+ total_acres = @sub[:num_of_units] ? @sub[:num_of_units] : 0.1
838
+ indicated_val = ((median_land_val(@recon_primary_per_acre) * units_primary) + (median_land_val(@recon_secondary_per_acre) * units_secondary)) / total_acres
839
+ overall_val = ((median_land_val(@recon_primary_per_acre) * units_primary) + (median_land_val(@recon_secondary_per_acre) * units_secondary)) + total_dep
840
+ say = Money.new((((overall_val.to_i + 500/2)/500)*500).round(-2) * 100, 'USD')
841
+
842
+
843
+ parallel_text("Average Primary Land Value/Unit:", "#{average_land_val(@recon_primary_per_acre).format(no_cents: true)}", 200)
844
+ move_down 20
845
+
846
+ parallel_text("Median Primary Land Value/Unit:", "#{median_land_val(@recon_primary_per_acre).format(no_cents: true)}", 200)
847
+ move_down 20
848
+
849
+ parallel_text("Maximum Primary Land Value/Unit:", "#{maximum_land_val(@recon_primary_per_acre).format(no_cents: true)}", 200)
850
+ move_down 20
851
+
852
+ parallel_text("Minimum Primary Land Value/Unit:", "#{minimum_land_val(@recon_primary_per_acre).format(no_cents: true)}", 200)
853
+ move_down 20
854
+
855
+ parallel_text("Unit of Comparison:", "$/Acre", 200)
856
+ move_down 20
857
+
858
+ parallel_text("Aggregate Units:", "#{@sub[:num_of_units]}", 200)
859
+ move_down 20
860
+
861
+ parallel_text("Indicated Primary Land Value/Unit", "#{median_land_val(@recon_primary_per_acre).format(no_cents: true)}", 200)
862
+ move_down 20
863
+
864
+ parallel_text("Total Primary Land Units:", "#{units_primary}", 200)
865
+ move_down 20
866
+
867
+ parallel_text("Indicated Secondary Land Value/Unit:", "#{median_land_val(@recon_secondary_per_acre).format(no_cents: true)}", 200)
868
+ move_down 20
869
+
870
+ parallel_text("Total Secondary Land Units:", "#{units_secondary}", 200)
871
+ move_down 20
872
+
873
+ parallel_text("Total Other Units not Analyzed:", "#{no_nil_number(@sub[:num_of_units]) - units_primary - units_secondary}", 200)
874
+ move_down 20
875
+
876
+ parallel_text("Indicated Value per Unit in Aggregate", "#{indicated_val.format(no_cents: true)}", 200)
877
+ move_down 20
878
+
879
+ parallel_text("Improvement Value Allocation:", "#{total_dep.format(no_cents: true)}", 200)
880
+ move_down 20
881
+
882
+ parallel_text("Overall Indicated Value:", "#{overall_val.format(no_cents: true)}", 200)
883
+ move_down 20
884
+
885
+ parallel_text("SAY (Rounded):", "#{say.format(no_cents: true)}", 200)
886
+ start_new_page
887
+ end
794
888
  end
795
889
 
796
890
  def assumptions_and_conditions
@@ -801,6 +895,7 @@ class EvalReport < Prawn::Document
801
895
  text "#{@text_blocks[:assumptions_conditions]}", style: :bold
802
896
  move_down 20
803
897
  text "Evaluators Associated with this Evaluation Report are identified as follows:"
898
+ move_down 10
804
899
  text "#{@sub[:validentification]}"
805
900
  start_new_page
806
901
  end
@@ -809,37 +904,64 @@ class EvalReport < Prawn::Document
809
904
  header("ADDENDA CONTENTS")
810
905
  move_down 25
811
906
  text "ADDENDA CONTENTS", size: 14, style: :bold
812
- start_new_page
813
907
  end
814
908
 
815
909
  def addendum_a
816
- header("ENGAGEMENT LETTER")
817
- move_down 25
818
- text "ADDENDUM A", size: 14, style: :bold
819
- start_new_page
910
+ # if an engagement letter is present, use it as a template for this page
911
+ if @docs[:engagement_letter]
912
+ start_new_page(template: @docs[:engagement_letter])
913
+ header("ENGAGEMENT LETTER")
914
+ else
915
+ start_new_page
916
+ header("ENGAGEMENT LETTER")
917
+ move_down 25
918
+ text "No engagement letter present.", size: 14, style: :bold
919
+ end
820
920
  end
821
921
 
822
922
  def addendum_b
823
- header("LEGAL DESCRIPTION")
824
- move_down 25
825
- text "ADDENDUM B", size: 14, style: :bold
923
+
924
+ if @docs[:legal_description]
925
+ start_new_page(template: @docs[:legal_description])
926
+ header("LEGAL DESCRIPTION")
927
+ else
928
+ start_new_page
929
+ header("LEGAL DESCRIPTION")
930
+ move_down 25
931
+ text "No Legal Description file present.", size: 14, style: :bold
932
+ end
826
933
  # end of document
827
934
  end
828
935
 
936
+ def prepare_comps_for_calc
937
+ @comps.each do |p|
938
+ if p[:landclassifications] && p[:landclassifications].any?
939
+ primary_per_acre = p[:landclassifications][0][:priceperacre] ? p[:landclassifications][0][:priceperacre][:cents] / 100 : nil
940
+ @recon_primary_per_acre << primary_per_acre.to_f unless primary_per_acre == nil
941
+
942
+ if p[:landclassifications][1]
943
+ secondary_per_acre = p[:landclassifications][1][:priceperacre] ? p[:landclassifications][1][:priceperacre][:cents] / 100 : nil
944
+ @recon_secondary_per_acre << secondary_per_acre.to_f unless secondary_per_acre == nil
945
+ end
946
+ end
947
+ end
948
+ end
949
+
829
950
  def header(page_title)
830
951
  text "#{page_title} " << "#{page_count - 1}", align: :right
831
952
  stroke_horizontal_rule
832
953
  end
833
954
 
834
- def flip_comp_array # necessary to produce 2D array of comps side by side
835
- props = [@sub, @comps].compact.flatten
955
+ def flip_comp_array(comps_to_flip) # necessary to produce 2D array of comps side by side
956
+ props = [@sub, comps_to_flip].compact.flatten
957
+ @comp_increment ||= 0
836
958
  final_a = [
837
- [{content: 'Valuation Analysis - Sales Comparison Approach', colspan: 8}], # [0]
838
- ['Characteristic', 'Subject', 'Sale 1', 'Sale 2', 'Sale 3', 'Sale 4', 'Sale 5', 'Sale 6'], # [1]
959
+ [{content: 'Valuation Analysis - Sales Comparison Approach', colspan: 7}], # [0]
960
+ ['Characteristic', 'Subject'], # [1]
839
961
  ['Record No.'], ['Tax Parcel #(s)'], ['Address'], ['City'], ['State'], ['Zip Code'], ['Sale Date'], ['Sale Price'], # [2] -> [9]
840
962
  ['Conditions of Sale'], ['Adjusted Sale Price'], ['Property Rights Conveyed'], ['Unit of Comparison'], # [10 -> 13]
841
- ['Price/Unit'], ['Total Acres'], ['Primary Land Use'], ['No. Units - Acres'], ['$/Unit - Primary Land'], # [14 -> 18]
842
- ['Secondary Land Use'], ['No. Units - Acres'], ['$/Unit - Secondary Land'], # [19 -> 21]
963
+ ['Price/Unit'], ['Total Acres'], ['Primary Land Use'], ['No. Primary Units - Acres'], ['$/Unit - Primary Land'], # [14 -> 18]
964
+ ['Secondary Land Use'], ['No. Secondary Units - Acres'], ['$/Unit - Secondary Land'], # [19 -> 21]
843
965
  ['$/Unit Allocated to Improvements'], ['Physical Access'], ['Legal Access'], # [22 -> 24]
844
966
  ['Topography'], ['Rainfal'], ['Primary Crop'], ['Yield'], ['Cap Rate'], [''], # [25 -> 30]
845
967
  ['% Primary Land'], [''], ['Deed Instrument No.'] # [31 -> 33]
@@ -855,6 +977,9 @@ class EvalReport < Prawn::Document
855
977
  t_s = ""
856
978
  end
857
979
 
980
+ final_a[1].push("Sale #{@comp_increment}") unless @comp_increment == 0
981
+ @comp_increment += 1
982
+
858
983
  final_a[3].push(t_s) # tax parcels
859
984
  final_a[4].push("#{p[:property_address_number]} " << "#{p[:street_or_road_name]}") # address
860
985
  final_a[5].push(p[:city]) # city
@@ -874,7 +999,8 @@ class EvalReport < Prawn::Document
874
999
  units_primary = p[:landclassifications][0][:numacres]
875
1000
  units_secondary = p[:landclassifications][1][:numacres]
876
1001
 
877
- primary_per_acre = moneymaker(p[:landclassifications][0][:priceperacre], false)
1002
+ per_acre_string = moneymaker(p[:landclassifications][0][:priceperacre], false)
1003
+
878
1004
  if p[:landclassifications][1]
879
1005
  secondary_per_acre = moneymaker(p[:landclassifications][1][:priceperacre], false)
880
1006
  else
@@ -885,12 +1011,10 @@ class EvalReport < Prawn::Document
885
1011
  units_secondary = 0
886
1012
  end
887
1013
 
888
- @recon_primary_per_acre << primary_per_acre.to_f unless primary_per_acre == 0
889
-
890
1014
  percent_primary = p[:num_of_units] ? ((units_primary * 100) / p[:num_of_units]) : 0
891
1015
 
892
1016
  final_a[17].push(units_primary) # no. units
893
- final_a[18].push(primary_per_acre) # $/unit - primary
1017
+ final_a[18].push(per_acre_string) # $/unit - primary
894
1018
  final_a[19].push(p[:secondary_ag_use]) # secondary land use
895
1019
  final_a[20].push(units_secondary) # no. units - acres
896
1020
  final_a[21].push(secondary_per_acre) # $/unit - secondary
@@ -940,7 +1064,7 @@ class EvalReport < Prawn::Document
940
1064
  transactions.each do |t|
941
1065
  if t # array could be nil
942
1066
  transaction_history_data.push(
943
- [t[:transType], t[:transDescr], datemaker(t[:transDate]), moneymaker(t[:price], true)]
1067
+ ["#{t[:transType]}", "#{t[:transDescr]}", datemaker(t[:transDate]), moneymaker(t[:price], true)]
944
1068
  )
945
1069
  end
946
1070
  end
@@ -970,7 +1094,7 @@ class EvalReport < Prawn::Document
970
1094
  utilities.each do |u|
971
1095
  if u # array could be empty
972
1096
  utilities_data.push(
973
- [u[:description], u[:availbility], u[:provider], u[:comments]]
1097
+ ["#{u[:description]}", "#{u[:availability]}", "#{u[:provider]}", "#{u[:comments]}"]
974
1098
  )
975
1099
  end
976
1100
  end
@@ -1022,7 +1146,7 @@ class EvalReport < Prawn::Document
1022
1146
  rights.each do |r|
1023
1147
  if r # array could be empty
1024
1148
  water_rights_data.push(
1025
- [r[:waterrightNum], r[:waterRight], r[:waterSrc], datemaker(r[:priorityDate]), r[:purpose], r[:numIrrAcres], r[:annVolume]]
1149
+ ["#{r[:waterrightNum]}", "#{r[:waterRight]}", "#{r[:waterSrc]}", datemaker(r[:priorityDate]), "#{r[:purpose]}", "#{r[:numIrrAcres]}", "#{r[:annVolume]}"]
1026
1150
  )
1027
1151
  end
1028
1152
  end
@@ -1056,7 +1180,7 @@ class EvalReport < Prawn::Document
1056
1180
  distributions.each do |d|
1057
1181
  if d # array could be empty
1058
1182
  distribution_data.push(
1059
- [d[:waterdistrEq], d[:manufacturer], d[:brand], d[:eqType], d[:descr], d[:yearManuf], d[:remainingEcLife], d[:irrAcres]]
1183
+ ["#{d[:waterdistrEq]}", "#{d[:manufacturer]}", "#{d[:brand]}", "#{d[:eqType]}", "#{d[:descr]}", "#{d[:yearManuf]}", "#{d[:remainingEcLife]}", "#{d[:irrAcres]}"]
1060
1184
  )
1061
1185
  end
1062
1186
  end
@@ -1089,7 +1213,7 @@ class EvalReport < Prawn::Document
1089
1213
  crops.each do |c|
1090
1214
  if c # array could be empty
1091
1215
  crop_data.push(
1092
- [c[:year], c[:commodity], c[:unit], c[:avgyield]]
1216
+ ["#{c[:year]}", "#{c[:commodity]}", "#{c[:unit]}", "#{c[:avgyield]}"]
1093
1217
  )
1094
1218
  end
1095
1219
  end
@@ -1121,7 +1245,7 @@ class EvalReport < Prawn::Document
1121
1245
  plantings.each do |p|
1122
1246
  if p # array could be empty
1123
1247
  planting_data.push(
1124
- [p[:planting], p[:variety], p[:acres], p[:numacres], p[:avgage], p[:plantsacre], p[:unitdescr1], p[:avgproduction]]
1248
+ ["#{p[:planting]}", "#{p[:variety]}", "#{p[:acres]}", "#{p[:numacres]}", "#{p[:avgage]}", "#{p[:plantsacre]}", "#{p[:unitdescr1]}", "#{p[:avgproduction]}"]
1125
1249
  )
1126
1250
  end
1127
1251
  end
@@ -1165,28 +1289,4 @@ class EvalReport < Prawn::Document
1165
1289
  move_down 4
1166
1290
  text "#{title}", align: :center, color: 'ffffff'
1167
1291
  end
1168
-
1169
- def indicated_value_per_unit
1170
- # stubbed
1171
- end
1172
-
1173
- def indicated_primary_land_per_unit
1174
- # stubbed
1175
- end
1176
-
1177
- def indicated_secondary_land_per_unit
1178
- # stubbed
1179
- end
1180
-
1181
- def improvement_val_alloc
1182
- # stubbed
1183
- end
1184
-
1185
- def overall_val
1186
- # stubbed
1187
- end
1188
-
1189
- def say_value
1190
- # stubbed
1191
- end
1192
1292
  end