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
data/lib/report_utils.rb
CHANGED
@@ -57,33 +57,33 @@ module ReportUtils
|
|
57
57
|
end
|
58
58
|
module_function :parallel_text
|
59
59
|
|
60
|
-
def
|
60
|
+
def average_land_val(comp_values) # averages an array of floats
|
61
61
|
sum = comp_values.inject(:+)
|
62
62
|
ave = sum ? sum / comp_values.count : 0
|
63
63
|
return Money.new(ave * 100, 'USD')
|
64
64
|
end
|
65
|
-
module_function :
|
65
|
+
module_function :average_land_val
|
66
66
|
|
67
|
-
def
|
67
|
+
def median_land_val(comp_values) # gets median value for an array of floats
|
68
68
|
sorted_array = comp_values.sort
|
69
69
|
length = sorted_array.length
|
70
70
|
|
71
71
|
median = sorted_array.any? ? (sorted_array[(length - 1) / 2] + sorted_array[length / 2]) / 2.0 : 0
|
72
72
|
return Money.new(median * 100, 'USD')
|
73
73
|
end
|
74
|
-
module_function :
|
74
|
+
module_function :median_land_val
|
75
75
|
|
76
|
-
def
|
76
|
+
def maximum_land_val(comp_values) # gets max value for array of floats
|
77
77
|
max = comp_values.any? ? comp_values.max : 0
|
78
78
|
return Money.new(max * 100, 'USD')
|
79
79
|
end
|
80
|
-
module_function :
|
80
|
+
module_function :maximum_land_val
|
81
81
|
|
82
|
-
def
|
82
|
+
def minimum_land_val(comp_values) # gets min value for array of floats
|
83
83
|
min = comp_values.any? ? comp_values.min : 0
|
84
84
|
return Money.new(min * 100, 'USD')
|
85
85
|
end
|
86
|
-
module_function :
|
86
|
+
module_function :minimum_land_val
|
87
87
|
|
88
88
|
def flip_improvements_array(improv_array)
|
89
89
|
type, size, unit_of_measure, foundation, const_class = ["Type"], ["Size"], ["Unit of Measure"], ["Foundation"], ["Const. Class"]
|
@@ -1,11 +1,12 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe 'eval report class' do
|
4
|
+
|
4
5
|
describe '#meta_data' do
|
5
6
|
context 'with keys' do
|
6
7
|
it 'renders static content' do
|
7
8
|
@pdf = EvalReport.new do
|
8
|
-
@sub = {
|
9
|
+
@sub = {}
|
9
10
|
cover_page
|
10
11
|
end
|
11
12
|
|
@@ -27,7 +28,7 @@ describe 'eval report class' do
|
|
27
28
|
context 'without keys' do
|
28
29
|
it 'renders static content' do
|
29
30
|
@pdf = EvalReport.new do
|
30
|
-
@sub = {
|
31
|
+
@sub = {}
|
31
32
|
cover_page
|
32
33
|
end
|
33
34
|
|
@@ -65,7 +66,7 @@ describe 'eval report class' do
|
|
65
66
|
context 'without keys' do
|
66
67
|
it 'renders static content' do
|
67
68
|
@pdf = EvalReport.new do
|
68
|
-
@sub = {
|
69
|
+
@sub = {}
|
69
70
|
@text_blocks = static_strings
|
70
71
|
letter_of_transmittal
|
71
72
|
end
|
@@ -105,7 +106,7 @@ describe 'eval report class' do
|
|
105
106
|
context 'without keys' do
|
106
107
|
it 'renders static content' do
|
107
108
|
@pdf = EvalReport.new do
|
108
|
-
@sub = {
|
109
|
+
@sub = {}
|
109
110
|
@text_blocks = static_strings
|
110
111
|
introduction
|
111
112
|
end
|
@@ -142,7 +143,7 @@ describe 'eval report class' do
|
|
142
143
|
context 'without keys' do
|
143
144
|
it 'renders static content' do
|
144
145
|
@pdf = EvalReport.new do
|
145
|
-
@sub = {
|
146
|
+
@sub = {}
|
146
147
|
property_identification
|
147
148
|
end
|
148
149
|
|
@@ -169,7 +170,7 @@ describe 'eval report class' do
|
|
169
170
|
context 'without keys' do
|
170
171
|
it 'renders static content' do
|
171
172
|
@pdf = EvalReport.new do
|
172
|
-
@sub = {
|
173
|
+
@sub = {}
|
173
174
|
@images = {}
|
174
175
|
regional_maps
|
175
176
|
end
|
@@ -184,7 +185,7 @@ describe 'eval report class' do
|
|
184
185
|
context 'with keys' do
|
185
186
|
it 'renders image headers' do
|
186
187
|
@pdf = EvalReport.new do
|
187
|
-
@sub = {
|
188
|
+
@sub = {}
|
188
189
|
@images = Sampler.sample_eval_images
|
189
190
|
topo_maps
|
190
191
|
end
|
@@ -197,7 +198,7 @@ describe 'eval report class' do
|
|
197
198
|
context 'without keys' do
|
198
199
|
it 'renders static content' do
|
199
200
|
@pdf = EvalReport.new do
|
200
|
-
@sub = {
|
201
|
+
@sub = {}
|
201
202
|
@images = {}
|
202
203
|
topo_maps
|
203
204
|
end
|
@@ -287,45 +288,6 @@ describe 'eval report class' do
|
|
287
288
|
end
|
288
289
|
end
|
289
290
|
|
290
|
-
describe '#comp_methodology' do
|
291
|
-
context 'with text blocks' do
|
292
|
-
it 'renders static content' do
|
293
|
-
@pdf = EvalReport.new do
|
294
|
-
@sub = {}
|
295
|
-
@text_blocks = {comp_method: 'methodology statement'}
|
296
|
-
comp_methodology
|
297
|
-
end
|
298
|
-
|
299
|
-
@method_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(1).to_s
|
300
|
-
expect(@method_content).to include('DIRECT', 'METHODOLOGY', 'ESTIMATE')
|
301
|
-
end
|
302
|
-
|
303
|
-
it 'renders dynamic content from keys' do
|
304
|
-
@pdf = EvalReport.new do
|
305
|
-
@sub = {}
|
306
|
-
@text_blocks = {comp_method: 'methodology statement'}
|
307
|
-
comp_methodology
|
308
|
-
end
|
309
|
-
|
310
|
-
@method_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(1).to_s
|
311
|
-
expect(@method_content).to include('methodology statement')
|
312
|
-
end
|
313
|
-
end
|
314
|
-
|
315
|
-
context 'without text blocks' do
|
316
|
-
it 'renders static content' do
|
317
|
-
@pdf = EvalReport.new do
|
318
|
-
@sub = {}
|
319
|
-
@text_blocks = {}
|
320
|
-
comp_methodology
|
321
|
-
end
|
322
|
-
|
323
|
-
@method_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(1).to_s
|
324
|
-
expect(@method_content).to include('DIRECT', 'METHODOLOGY', 'ESTIMATE')
|
325
|
-
end
|
326
|
-
end
|
327
|
-
end
|
328
|
-
|
329
291
|
describe '#property_comparison' do
|
330
292
|
context 'with keys' do
|
331
293
|
it 'renders static content' do
|
@@ -406,7 +368,17 @@ describe 'eval report class' do
|
|
406
368
|
end
|
407
369
|
|
408
370
|
@discussion_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(1).to_s
|
409
|
-
expect(@discussion_content).to include('
|
371
|
+
expect(@discussion_content).to include('DIRECT')
|
372
|
+
end
|
373
|
+
end
|
374
|
+
|
375
|
+
context '@comps is nil' do
|
376
|
+
it 'does not break if @comps is nil' do
|
377
|
+
@pdf = EvalReport.new do
|
378
|
+
@sub = Sampler.get_eval1
|
379
|
+
@comps = nil
|
380
|
+
discussion_of_sales
|
381
|
+
end
|
410
382
|
end
|
411
383
|
end
|
412
384
|
end
|
@@ -431,6 +403,7 @@ describe 'eval report class' do
|
|
431
403
|
@text_blocks = {}
|
432
404
|
@comps = []
|
433
405
|
@recon_primary_per_acre = []
|
406
|
+
@recon_secondary_per_acre = []
|
434
407
|
6.times {|f| @comps << Sampler.get_comp2}
|
435
408
|
val_method_and_recon
|
436
409
|
end
|
@@ -439,19 +412,20 @@ describe 'eval report class' do
|
|
439
412
|
expect(@recon_content).to include('Average', 'Median', 'Maximum')
|
440
413
|
end
|
441
414
|
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
|
415
|
+
it 'renders dynamic content from keys' do
|
416
|
+
@pdf = EvalReport.new do
|
417
|
+
@sub = Sampler.get_eval1
|
418
|
+
@text_blocks = {}
|
419
|
+
@comps = []
|
420
|
+
@recon_primary_per_acre = []
|
421
|
+
@recon_secondary_per_acre = []
|
422
|
+
6.times {|f| @comps << Sampler.get_comp2}
|
423
|
+
val_method_and_recon
|
424
|
+
end
|
425
|
+
|
426
|
+
@recon_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(1).to_s
|
427
|
+
expect(@recon_content).to include('$7,500')
|
428
|
+
end
|
455
429
|
end
|
456
430
|
|
457
431
|
context 'without keys' do
|
@@ -461,6 +435,7 @@ describe 'eval report class' do
|
|
461
435
|
@text_blocks = {}
|
462
436
|
@comps = []
|
463
437
|
@recon_primary_per_acre = []
|
438
|
+
@recon_secondary_per_acre = []
|
464
439
|
val_method_and_recon
|
465
440
|
end
|
466
441
|
|
@@ -474,6 +449,7 @@ describe 'eval report class' do
|
|
474
449
|
@text_blocks = {val_method: 'value text'}
|
475
450
|
@comps = []
|
476
451
|
@recon_primary_per_acre = []
|
452
|
+
@recon_secondary_per_acre = []
|
477
453
|
val_method_and_recon
|
478
454
|
end
|
479
455
|
|
@@ -509,18 +485,80 @@ describe 'eval report class' do
|
|
509
485
|
|
510
486
|
describe '#addendum_a' do
|
511
487
|
context 'with keys' do
|
512
|
-
it 'renders static content'
|
488
|
+
it 'renders static content' do
|
489
|
+
@pdf = EvalReport.new do
|
490
|
+
@sub = Sampler.get_eval1
|
491
|
+
@docs = {engagement_letter: './spec/test_data/pdfs/engagement_letter.pdf'}
|
492
|
+
addendum_a
|
493
|
+
end
|
513
494
|
|
514
|
-
|
495
|
+
@addendum_a_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(2).to_s
|
496
|
+
expect(@addendum_a_content).to include('ENGAGEMENT')
|
497
|
+
end
|
498
|
+
|
499
|
+
it 'renders dynamic content from keys' do
|
500
|
+
@pdf = EvalReport.new do
|
501
|
+
@sub = Sampler.get_eval1
|
502
|
+
@docs = {engagement_letter: './spec/test_data/pdfs/engagement_letter.pdf'}
|
503
|
+
addendum_a
|
504
|
+
end
|
505
|
+
|
506
|
+
@addendum_a_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(2).to_s
|
507
|
+
expect(@addendum_a_content).to include('test')
|
508
|
+
end
|
515
509
|
end
|
516
510
|
|
517
511
|
context 'without keys' do
|
518
|
-
it 'renders static content'
|
512
|
+
it 'renders static content' do
|
513
|
+
@pdf = EvalReport.new do
|
514
|
+
@sub = {}
|
515
|
+
@docs = {}
|
516
|
+
addendum_a
|
517
|
+
end
|
518
|
+
|
519
|
+
@addendum_a_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(2).to_s
|
520
|
+
expect(@addendum_a_content).to include('ENGAGEMENT', 'present')
|
521
|
+
end
|
519
522
|
end
|
520
523
|
end
|
521
524
|
|
522
525
|
describe '#addendum_b' do
|
526
|
+
context 'with keys' do
|
527
|
+
it 'renders static content' do
|
528
|
+
@pdf = EvalReport.new do
|
529
|
+
@sub = {}
|
530
|
+
@docs = {legal_description: './spec/test_data/pdfs/legal_description.pdf'}
|
531
|
+
addendum_b
|
532
|
+
end
|
533
|
+
|
534
|
+
@addendum_b_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(2).to_s
|
535
|
+
expect(@addendum_b_content).to include('LEGAL')
|
536
|
+
end
|
537
|
+
|
538
|
+
it 'renders inserts dynamic content from pdf' do
|
539
|
+
@pdf = EvalReport.new do
|
540
|
+
@sub = Sampler.get_eval1
|
541
|
+
@docs = {legal_description: './spec/test_data/pdfs/legal_description.pdf'}
|
542
|
+
addendum_b
|
543
|
+
end
|
544
|
+
|
545
|
+
@addendum_b_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(2).to_s
|
546
|
+
expect(@addendum_b_content).to include('test')
|
547
|
+
end
|
548
|
+
end
|
549
|
+
|
550
|
+
context 'without keys' do
|
551
|
+
it 'renders static content' do
|
552
|
+
@pdf = EvalReport.new do
|
553
|
+
@sub = Sampler.get_eval1
|
554
|
+
@docs = {}
|
555
|
+
addendum_b
|
556
|
+
end
|
523
557
|
|
558
|
+
@addendum_b_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(2).to_s
|
559
|
+
expect(@addendum_b_content).to include('LEGAL')
|
560
|
+
end
|
561
|
+
end
|
524
562
|
end
|
525
563
|
|
526
564
|
describe '#header' do
|
@@ -551,7 +589,7 @@ describe 'eval report class' do
|
|
551
589
|
context 'without keys' do
|
552
590
|
it 'renders static content' do
|
553
591
|
@pdf = EvalReport.new do
|
554
|
-
@sub = {
|
592
|
+
@sub = {}
|
555
593
|
transaction_history
|
556
594
|
end
|
557
595
|
@transaction_history_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(1).to_s
|
@@ -582,7 +620,7 @@ describe 'eval report class' do
|
|
582
620
|
context 'without keys' do
|
583
621
|
it 'renders static content' do
|
584
622
|
@pdf = EvalReport.new do
|
585
|
-
@sub = {
|
623
|
+
@sub = {}
|
586
624
|
utilities
|
587
625
|
end
|
588
626
|
@utilities_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(1).to_s
|
@@ -613,7 +651,7 @@ describe 'eval report class' do
|
|
613
651
|
context 'without keys' do
|
614
652
|
it 'renders static content' do
|
615
653
|
@pdf = EvalReport.new do
|
616
|
-
@sub = {
|
654
|
+
@sub = {}
|
617
655
|
improvements
|
618
656
|
end
|
619
657
|
|
@@ -646,7 +684,7 @@ describe 'eval report class' do
|
|
646
684
|
context 'without keys' do
|
647
685
|
it 'renders static content' do
|
648
686
|
@pdf = EvalReport.new do
|
649
|
-
@sub = {
|
687
|
+
@sub = {}
|
650
688
|
water_rights
|
651
689
|
end
|
652
690
|
@water_rights_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(1).to_s
|
@@ -680,7 +718,7 @@ describe 'eval report class' do
|
|
680
718
|
context 'without keys' do
|
681
719
|
it 'renders static content' do
|
682
720
|
@pdf = EvalReport.new do
|
683
|
-
@sub = {
|
721
|
+
@sub = {}
|
684
722
|
water_distribution
|
685
723
|
end
|
686
724
|
@water_distribution_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(1).to_s
|
@@ -712,7 +750,7 @@ describe 'eval report class' do
|
|
712
750
|
context 'without keys' do
|
713
751
|
it 'renders static content' do
|
714
752
|
@pdf = EvalReport.new do
|
715
|
-
@sub = {
|
753
|
+
@sub = {}
|
716
754
|
crop_yield
|
717
755
|
end
|
718
756
|
@crop_yield_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(1).to_s
|
@@ -744,7 +782,7 @@ describe 'eval report class' do
|
|
744
782
|
context 'without keys' do
|
745
783
|
it 'renders static content' do
|
746
784
|
@pdf = EvalReport.new do
|
747
|
-
@sub = {
|
785
|
+
@sub = {}
|
748
786
|
perm_plantings
|
749
787
|
end
|
750
788
|
@perm_plantings_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(1).to_s
|
@@ -776,7 +814,7 @@ describe 'eval report class' do
|
|
776
814
|
context 'without keys' do
|
777
815
|
it 'renders static content' do
|
778
816
|
@pdf = EvalReport.new do
|
779
|
-
@sub = {
|
817
|
+
@sub = {}
|
780
818
|
externalities
|
781
819
|
end
|
782
820
|
@externalities_content = PDF::Reader.new(StringIO.new(@pdf.render)).page(1).to_s
|
@@ -788,7 +826,7 @@ describe 'eval report class' do
|
|
788
826
|
describe '#image_cap' do
|
789
827
|
it 'renders title text' do
|
790
828
|
@pdf = EvalReport.new do
|
791
|
-
@sub = {
|
829
|
+
@sub = {}
|
792
830
|
image_cap('Some Title')
|
793
831
|
end
|
794
832
|
|
@@ -81,40 +81,40 @@ describe ReportUtils do
|
|
81
81
|
end
|
82
82
|
end
|
83
83
|
|
84
|
-
describe '#
|
84
|
+
describe '#average_land_val' do
|
85
85
|
it 'returns the average of an array of values' do
|
86
86
|
@recon_primary_per_acre = [100, 200, 300, 400, 500, 600]
|
87
|
-
ave = ReportUtils.
|
87
|
+
ave = ReportUtils.average_land_val(@recon_primary_per_acre)
|
88
88
|
expect(ave.format(no_cents: false)).to eq("$350.00")
|
89
89
|
end
|
90
90
|
end
|
91
91
|
|
92
|
-
describe '#
|
92
|
+
describe '#median_land_val' do
|
93
93
|
it 'returns the median value for an odd numbered array' do
|
94
94
|
@recon_primary_per_acre = [100, 200, 300, 400, 500, 600, 700]
|
95
|
-
median = ReportUtils.
|
95
|
+
median = ReportUtils.median_land_val(@recon_primary_per_acre)
|
96
96
|
expect(median.format(no_cents: false)).to eq("$400.00")
|
97
97
|
end
|
98
98
|
|
99
99
|
it 'returns the median value for an even numbered array' do
|
100
100
|
@recon_primary_per_acre = [100, 200, 300, 400, 500, 600]
|
101
|
-
median = ReportUtils.
|
101
|
+
median = ReportUtils.median_land_val(@recon_primary_per_acre)
|
102
102
|
expect(median.format(no_cents: false)).to eq("$350.00")
|
103
103
|
end
|
104
104
|
end
|
105
105
|
|
106
|
-
describe '#
|
106
|
+
describe '#maximum_land_val' do
|
107
107
|
it 'returns the max value in the array' do
|
108
108
|
@recon_primary_per_acre = [100, 200, 300, 400, 500, 600]
|
109
|
-
max = ReportUtils.
|
109
|
+
max = ReportUtils.maximum_land_val(@recon_primary_per_acre)
|
110
110
|
expect(max.format(no_cents: false)).to eq("$600.00")
|
111
111
|
end
|
112
112
|
end
|
113
113
|
|
114
|
-
describe '#
|
114
|
+
describe '#minimum_land_val' do
|
115
115
|
it 'returns the min value in the array' do
|
116
116
|
@recon_primary_per_acre = [100, 200, 300, 400, 500, 600]
|
117
|
-
min = ReportUtils.
|
117
|
+
min = ReportUtils.minimum_land_val(@recon_primary_per_acre)
|
118
118
|
expect(min.format(no_cents: false)).to eq("$100.00")
|
119
119
|
end
|
120
120
|
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
%PDF-1.3
|
2
|
+
%����
|
3
|
+
1 0 obj
|
4
|
+
<< /Creator <feff0050007200610077006e>
|
5
|
+
/Producer <feff0050007200610077006e>
|
6
|
+
>>
|
7
|
+
endobj
|
8
|
+
2 0 obj
|
9
|
+
<< /Type /Catalog
|
10
|
+
/Pages 3 0 R
|
11
|
+
>>
|
12
|
+
endobj
|
13
|
+
3 0 obj
|
14
|
+
<< /Type /Pages
|
15
|
+
/Count 1
|
16
|
+
/Kids [5 0 R]
|
17
|
+
>>
|
18
|
+
endobj
|
19
|
+
4 0 obj
|
20
|
+
<< /Length 89
|
21
|
+
>>
|
22
|
+
stream
|
23
|
+
q
|
24
|
+
|
25
|
+
BT
|
26
|
+
36 684.46 Td
|
27
|
+
/F1.0 30 Tf
|
28
|
+
[<7465737420656e676167656d656e74206c6574746572>] TJ
|
29
|
+
ET
|
30
|
+
|
31
|
+
Q
|
32
|
+
|
33
|
+
endstream
|
34
|
+
endobj
|
35
|
+
5 0 obj
|
36
|
+
<< /Type /Page
|
37
|
+
/Parent 3 0 R
|
38
|
+
/MediaBox [0 0 612.0 792.0]
|
39
|
+
/Contents 4 0 R
|
40
|
+
/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
|
41
|
+
/Font << /F1.0 6 0 R
|
42
|
+
>>
|
43
|
+
>>
|
44
|
+
>>
|
45
|
+
endobj
|
46
|
+
6 0 obj
|
47
|
+
<< /Type /Font
|
48
|
+
/Subtype /Type1
|
49
|
+
/BaseFont /Helvetica
|
50
|
+
/Encoding /WinAnsiEncoding
|
51
|
+
>>
|
52
|
+
endobj
|
53
|
+
xref
|
54
|
+
0 7
|
55
|
+
0000000000 65535 f
|
56
|
+
0000000015 00000 n
|
57
|
+
0000000109 00000 n
|
58
|
+
0000000158 00000 n
|
59
|
+
0000000215 00000 n
|
60
|
+
0000000354 00000 n
|
61
|
+
0000000532 00000 n
|
62
|
+
trailer
|
63
|
+
<< /Size 7
|
64
|
+
/Root 2 0 R
|
65
|
+
/Info 1 0 R
|
66
|
+
>>
|
67
|
+
startxref
|
68
|
+
629
|
69
|
+
%%EOF
|