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