1
- package hmda .publication .reports .aggregate
2
-
3
- import java .util .Calendar
1
+ package hmda .publication .reports .national
4
2
5
3
import akka .NotUsed
6
4
import akka .stream .scaladsl .Source
7
5
import hmda .census .model .MsaIncomeLookup
8
6
import hmda .model .publication .reports .ApplicantIncomeEnum ._
9
- import hmda .model .publication .reports .{ ApplicantIncome , Disposition , MSAReport }
7
+ import hmda .model .publication .reports ._
10
8
import hmda .publication .reports ._
11
- import hmda .publication .reports .national .NationalAggregateReport
12
- import hmda .publication .reports .util .DateUtil ._
13
- import hmda .publication .reports .util .ReportUtil ._
9
+ import hmda .publication .reports .aggregate .A52
14
10
import hmda .publication .reports .util .ReportsMetaDataLookup
15
11
import hmda .query .model .filing .LoanApplicationRegisterQuery
16
12
@@ -25,7 +21,31 @@ case class N52(
25
21
description : String = N52 .metaData.description
26
22
) extends NationalAggregateReport {
27
23
def + (a52 : A52 ): N52 = {
24
+ val combinedIncomes = a52.applicantIncomes.map(income => {
25
+ val bc = applicantIncomes.find(i => i.applicantIncome == income.applicantIncome).get.borrowerCharacteristics
26
+
27
+ val originalRc = bc.find(_.isInstanceOf [RaceBorrowerCharacteristic ]).get.asInstanceOf [RaceBorrowerCharacteristic ]
28
+ val additionalRc = income.borrowerCharacteristics.find(_.isInstanceOf [RaceBorrowerCharacteristic ]).get.asInstanceOf [RaceBorrowerCharacteristic ]
29
+
30
+ val originalEc = bc.find(_.isInstanceOf [EthnicityBorrowerCharacteristic ]).get.asInstanceOf [EthnicityBorrowerCharacteristic ]
31
+ val additionalEc = income.borrowerCharacteristics.find(_.isInstanceOf [EthnicityBorrowerCharacteristic ]).get.asInstanceOf [EthnicityBorrowerCharacteristic ]
32
+
33
+ val originalMsc = bc.find(_.isInstanceOf [MinorityStatusBorrowerCharacteristic ]).get.asInstanceOf [MinorityStatusBorrowerCharacteristic ]
34
+ val additionalMsc = income.borrowerCharacteristics.find(_.isInstanceOf [MinorityStatusBorrowerCharacteristic ]).get.asInstanceOf [MinorityStatusBorrowerCharacteristic ]
28
35
36
+ ApplicantIncome (income.applicantIncome, List (
37
+ originalRc + additionalRc,
38
+ originalEc + additionalEc,
39
+ originalMsc + additionalMsc
40
+ ))
41
+ })
42
+
43
+ val combinedDispositions = a52.total.map(disposition => {
44
+ val originalDisposition = total.find(d => d.disposition == disposition.disposition).get
45
+ disposition + originalDisposition
46
+ })
47
+
48
+ N52 (year, reportDate, combinedIncomes, combinedDispositions, table, description)
29
49
}
30
50
}
31
51
@@ -38,67 +58,11 @@ object N52 {
38
58
// Property Type 1,2
39
59
// Purpose of Loan 1
40
60
def generate [ec : EC , mat : MAT , as : AS ](larSource : Source [LoanApplicationRegisterQuery , NotUsed ]): Future [N52 ] = {
41
- val lars = larSource
42
- .filter { lar =>
43
- (lar.loanType == 1 ) &&
44
- (lar.propertyType == 1 || lar.propertyType == 2 ) &&
45
- (lar.purpose == 1 )
46
- }
47
- val larsWithIncome = lars.filter(lar => lar.income != " NA" )
48
-
49
61
val fipsList = MsaIncomeLookup .values.map(_.fips)
50
- val yearF = calculateYear(larSource)
51
- val totalF = calculateDispositions(lars, dispositions)
52
-
53
-
54
- fipsList.foreach(fipsCode => {
55
- val incomeIntervals = calculateMedianIncomeIntervals(fipsCode)
56
- val larsByIncome = larsByIncomeInterval(larsWithIncome, incomeIntervals)
57
- val borrowerCharacteristicsByIncomeF = borrowerCharacteristicsByIncomeInterval(larsByIncome, dispositions)
58
-
59
- for {
60
- lars50BorrowerCharacteristics <- borrowerCharacteristicsByIncomeF(LessThan50PercentOfMSAMedian )
61
- lars50To79BorrowerCharacteristics <- borrowerCharacteristicsByIncomeF(Between50And79PercentOfMSAMedian )
62
- lars80To99BorrowerCharacteristics <- borrowerCharacteristicsByIncomeF(Between80And99PercentOfMSAMedian )
63
- lars100To120BorrowerCharacteristics <- borrowerCharacteristicsByIncomeF(Between100And119PercentOfMSAMedian )
64
- lars120BorrowerCharacteristics <- borrowerCharacteristicsByIncomeF(GreaterThan120PercentOfMSAMedian )
65
- } yield {
66
- val income50 = ApplicantIncome (
67
- LessThan50PercentOfMSAMedian ,
68
- lars50BorrowerCharacteristics
69
- )
70
- val income50To79 = ApplicantIncome (
71
- Between50And79PercentOfMSAMedian ,
72
- lars50To79BorrowerCharacteristics
73
- )
74
- val income80To99 = ApplicantIncome (
75
- Between80And99PercentOfMSAMedian ,
76
- lars80To99BorrowerCharacteristics
77
- )
78
- val income100To120 = ApplicantIncome (
79
- Between100And119PercentOfMSAMedian ,
80
- lars100To120BorrowerCharacteristics
81
- )
82
- val income120 = ApplicantIncome (
83
- GreaterThan120PercentOfMSAMedian ,
84
- lars120BorrowerCharacteristics
85
- )
86
-
87
- val applicantIncomes = List (
88
- income50,
89
- income50To79,
90
- income80To99,
91
- income100To120,
92
- income120
93
- )
94
62
95
- N52 (
96
- year,
97
- formatDate(Calendar .getInstance().toInstant),
98
- applicantIncomes,
99
- total
100
- )
101
- }
63
+ fipsList.foldLeft(N52 ())((n, f) => {
64
+ val a52 = A52 .generate(larSource, f)
65
+ a52.map{report => n + report}
102
66
})
103
67
}
104
68
}
0 commit comments