appraisermetrics_report_service 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
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