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 +4 -4
- data/.gitignore +2 -1
- data/README.md +3 -1
- data/appraisermetrics_report_service.gemspec +6 -2
- data/lib/appraisermetrics_report_service.rb +1 -0
- data/lib/appraisermetrics_report_service/version.rb +1 -1
- data/lib/closed_sale.rb +34 -35
- data/lib/eval_report.rb +234 -134
- data/lib/report_utils.rb +8 -8
- data/spec/lib/eval_report_spec.rb +111 -73
- data/spec/lib/report_utils_spec.rb +9 -9
- data/spec/test_data/pdfs/engagement_letter.pdf +69 -0
- data/spec/test_data/pdfs/legal_description.pdf +69 -0
- data/spec/test_data/sampler.rb +2 -2
- metadata +52 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8eaea4b3783b9d12df2a7b0035cd65095f026af6
|
4
|
+
data.tar.gz: b02ebed32be3b8aab7ebe198d095804554a76a96
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b7d20fac048b0393d089904eb65e3f5a828d3084e0051de6f5cd6187ab3aed0df878b0bba27d8bd5f4256ada62bc2f37fe543cb401c36a3a0b795c6f71a63e71
|
7
|
+
data.tar.gz: 4f1702adde2eef2f9eb7f632bd8bd82f550491fe907c5efc2d9cd8e437b6e2b8a29960908acf5a71737b6680ec0a6c1b20ee9088c3d1b3a106992e1f0b87be8d
|
data/.gitignore
CHANGED
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
|
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 "
|
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
|
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:",
|
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[:
|
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", "
|
217
|
-
"PROPERTY DESCRIPTION,
|
218
|
-
"SALES
|
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]
|
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(
|
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(
|
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: :
|
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
|
-
|
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
|
702
|
+
font_size 7
|
705
703
|
|
706
|
-
table(flip_comp_array) do
|
707
|
-
column(0).width =
|
708
|
-
columns(1..
|
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..
|
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
|
-
|
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
|
-
|
737
|
-
|
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
|
-
|
740
|
-
|
741
|
-
|
742
|
-
|
743
|
-
|
744
|
-
|
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,
|
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
|
-
|
773
|
-
|
774
|
-
|
775
|
-
|
776
|
-
|
777
|
-
|
778
|
-
|
779
|
-
|
780
|
-
|
781
|
-
|
782
|
-
|
783
|
-
|
784
|
-
|
785
|
-
|
786
|
-
|
787
|
-
|
788
|
-
|
789
|
-
|
790
|
-
|
791
|
-
|
792
|
-
|
793
|
-
|
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
|
-
|
817
|
-
|
818
|
-
|
819
|
-
|
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
|
-
|
824
|
-
|
825
|
-
|
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,
|
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:
|
838
|
-
['Characteristic', 'Subject'
|
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
|
-
|
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(
|
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[:
|
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
|