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 +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
|