Skip to content

Commit 7aabaca

Browse files
author
Nick Grippin
authored
Merge pull request cfpb#1159 from schbetsy/reports-refactor-trial
Combine Disclosure 5-X Reports - Input Requested
2 parents 4c1e39b + 6f0ef24 commit 7aabaca

File tree

12 files changed

+143
-269
lines changed

12 files changed

+143
-269
lines changed

publication/src/main/scala/hmda/publication/reports/disclosure/D51.scala

Lines changed: 8 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -3,75 +3,25 @@ package hmda.publication.reports.disclosure
33
import akka.NotUsed
44
import akka.stream.scaladsl.Source
55
import hmda.publication.reports._
6-
import hmda.model.publication.reports._
7-
import hmda.publication.reports.util.ReportUtil._
8-
import hmda.publication.reports.util.ReportsMetaDataLookup
96
import hmda.query.model.filing.LoanApplicationRegisterQuery
107

118
import scala.concurrent.Future
129

13-
case class D51(
14-
respondentId: String,
15-
institutionName: String,
16-
year: Int,
17-
msa: MSAReport,
18-
applicantIncomes: List[ApplicantIncome],
19-
total: List[Disposition],
20-
reportDate: String = formattedCurrentDate,
21-
table: String = D51.metaData.reportTable,
22-
description: String = D51.metaData.description
23-
) extends DisclosureReport
24-
2510
object D51 {
26-
val metaData = ReportsMetaDataLookup.values("D51")
27-
val dispositions = metaData.dispositions
2811

29-
// Table filters:
30-
// Loan Type 2,3,4
31-
// Property Type 1,2
32-
// Purpose of Loan 1
12+
def filters(lar: LoanApplicationRegisterQuery): Boolean = {
13+
(lar.loanType == 2 || lar.loanType == 3 || lar.loanType == 4) &&
14+
(lar.propertyType == 1 || lar.propertyType == 2) &&
15+
(lar.purpose == 1)
16+
}
17+
3318
def generate[ec: EC, mat: MAT, as: AS](
3419
larSource: Source[LoanApplicationRegisterQuery, NotUsed],
3520
fipsCode: Int,
3621
respondentId: String,
3722
institutionNameF: Future[String]
38-
): Future[D51] = {
39-
40-
val lars = larSource
41-
.filter(lar => lar.respondentId == respondentId)
42-
.filter(lar => lar.msa != "NA")
43-
.filter(lar => lar.msa.toInt == fipsCode)
44-
.filter { lar =>
45-
(lar.loanType == 2 || lar.loanType == 3 || lar.loanType == 4) &&
46-
(lar.propertyType == 1 || lar.propertyType == 2) &&
47-
(lar.purpose == 1)
48-
}
49-
val larsWithIncome = lars.filter(lar => lar.income != "NA")
50-
51-
val msa = msaReport(fipsCode.toString)
52-
53-
val incomeIntervals = calculateMedianIncomeIntervals(fipsCode)
54-
val applicantIncomesF = applicantIncomesWithBorrowerCharacteristics(larsWithIncome, incomeIntervals, dispositions)
55-
56-
val yearF = calculateYear(larSource)
57-
val totalF = calculateDispositions(lars, dispositions)
58-
59-
for {
60-
institutionName <- institutionNameF
61-
year <- yearF
62-
applicantIncomes <- applicantIncomesF
63-
total <- totalF
64-
} yield {
65-
66-
D51(
67-
respondentId,
68-
institutionName,
69-
year,
70-
msa,
71-
applicantIncomes,
72-
total
73-
)
74-
}
23+
): Future[D5X] = {
7524

25+
D5X.generate("D51", filters, larSource, fipsCode, respondentId, institutionNameF)
7626
}
7727
}

publication/src/main/scala/hmda/publication/reports/disclosure/D53.scala

Lines changed: 7 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -2,74 +2,26 @@ package hmda.publication.reports.disclosure
22

33
import akka.NotUsed
44
import akka.stream.scaladsl.Source
5-
import hmda.model.publication.reports.{ ApplicantIncome, Disposition, MSAReport }
65
import hmda.publication.reports._
7-
import hmda.publication.reports.util.ReportUtil._
8-
import hmda.publication.reports.util.ReportsMetaDataLookup
96
import hmda.query.model.filing.LoanApplicationRegisterQuery
107

118
import scala.concurrent.Future
129

13-
case class D53(
14-
respondentId: String,
15-
institutionName: String,
16-
year: Int,
17-
msa: MSAReport,
18-
applicantIncomes: List[ApplicantIncome],
19-
total: List[Disposition],
20-
reportDate: String = formattedCurrentDate,
21-
table: String = D53.metaData.reportTable,
22-
description: String = D53.metaData.description
23-
) extends DisclosureReport
24-
2510
object D53 {
26-
val metaData = ReportsMetaDataLookup.values("D53")
27-
val dispositions = metaData.dispositions
2811

29-
// Table filters:
30-
// Property Type: 1, 2
31-
// Purpose of Loan: 3
12+
def filters(lar: LoanApplicationRegisterQuery): Boolean = {
13+
(lar.propertyType == 1 || lar.propertyType == 2) &&
14+
(lar.purpose == 3)
15+
}
16+
3217
def generate[ec: EC, mat: MAT, as: AS](
3318
larSource: Source[LoanApplicationRegisterQuery, NotUsed],
3419
fipsCode: Int,
3520
respondentId: String,
3621
institutionNameF: Future[String]
37-
): Future[D53] = {
38-
39-
val lars = larSource
40-
.filter(lar => lar.respondentId == respondentId)
41-
.filter(lar => lar.msa != "NA")
42-
.filter(lar => lar.msa.toInt == fipsCode)
43-
.filter { lar =>
44-
(lar.propertyType == 1 || lar.propertyType == 2) &&
45-
(lar.purpose == 3)
46-
}
47-
val larsWithIncome = lars.filter(lar => lar.income != "NA")
48-
49-
val msa = msaReport(fipsCode.toString)
50-
51-
val incomeIntervals = calculateMedianIncomeIntervals(fipsCode)
52-
val applicantIncomesF = applicantIncomesWithBorrowerCharacteristics(larsWithIncome, incomeIntervals, dispositions)
53-
54-
val yearF = calculateYear(larSource)
55-
val totalF = calculateDispositions(lars, dispositions)
56-
57-
for {
58-
institutionName <- institutionNameF
59-
year <- yearF
60-
applicantIncomes <- applicantIncomesF
61-
total <- totalF
62-
} yield {
22+
): Future[D5X] = {
6323

64-
D53(
65-
respondentId,
66-
institutionName,
67-
year,
68-
msa,
69-
applicantIncomes,
70-
total
71-
)
72-
}
24+
D5X.generate("D53", filters, larSource, fipsCode, respondentId, institutionNameF)
7325

7426
}
7527

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package hmda.publication.reports.disclosure
2+
3+
import hmda.model.publication.reports.{ ApplicantIncome, Disposition, MSAReport }
4+
import hmda.publication.reports.util.ReportsMetaDataLookup
5+
import hmda.publication.reports.util.ReportUtil._
6+
import akka.NotUsed
7+
import akka.stream.scaladsl.Source
8+
import hmda.publication.reports._
9+
import hmda.query.model.filing.LoanApplicationRegisterQuery
10+
11+
import scala.concurrent.Future
12+
13+
case class D5X(
14+
respondentId: String,
15+
institutionName: String,
16+
year: Int,
17+
msa: MSAReport,
18+
applicantIncomes: List[ApplicantIncome],
19+
total: List[Disposition],
20+
table: String,
21+
description: String,
22+
reportDate: String = formattedCurrentDate
23+
) extends DisclosureReport
24+
25+
object D5X {
26+
def generate[ec: EC, mat: MAT, as: AS](
27+
reportId: String,
28+
filters: LoanApplicationRegisterQuery => Boolean,
29+
larSource: Source[LoanApplicationRegisterQuery, NotUsed],
30+
fipsCode: Int,
31+
respondentId: String,
32+
institutionNameF: Future[String]
33+
): Future[D5X] = {
34+
35+
val metaData = ReportsMetaDataLookup.values(reportId)
36+
val dispositions = metaData.dispositions
37+
38+
val lars = larSource
39+
.filter(lar => lar.respondentId == respondentId)
40+
.filter(lar => lar.msa != "NA")
41+
.filter(lar => lar.msa.toInt == fipsCode)
42+
.filter(filters)
43+
44+
val larsWithIncome = lars.filter(lar => lar.income != "NA")
45+
46+
val msa = msaReport(fipsCode.toString)
47+
48+
val incomeIntervals = calculateMedianIncomeIntervals(fipsCode)
49+
val applicantIncomesF = applicantIncomesWithBorrowerCharacteristics(larsWithIncome, incomeIntervals, dispositions)
50+
51+
val yearF = calculateYear(larSource)
52+
val totalF = calculateDispositions(lars, dispositions)
53+
54+
for {
55+
institutionName <- institutionNameF
56+
year <- yearF
57+
applicantIncomes <- applicantIncomesF
58+
total <- totalF
59+
} yield {
60+
61+
D5X(
62+
respondentId,
63+
institutionName,
64+
year,
65+
msa,
66+
applicantIncomes,
67+
total,
68+
metaData.reportTable,
69+
metaData.description
70+
)
71+
}
72+
73+
}
74+
}

publication/src/main/scala/hmda/publication/reports/disclosure/DisclosureReport.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ trait DisclosureReport {
1111
val table: String
1212
val year: Int
1313
val msa: MSAReport
14+
val reportDate: String
1415

1516
val reportType: ReportTypeEnum = Disclosure
1617

publication/src/main/scala/hmda/publication/reports/disclosure/DisclosureReports.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import akka.util.Timeout
77
import com.typesafe.config.ConfigFactory
88
import hmda.model.institution.Institution
99
import hmda.persistence.model.HmdaSupervisorActor.FindActorByName
10-
import hmda.publication.reports.protocol.disclosure.D51Protocol._
10+
import hmda.publication.reports.protocol.disclosure.D5XProtocol._
1111
import hmda.query.repository.filing.FilingCassandraRepository
1212
import hmda.query.view.institutions.InstitutionView
1313
import hmda.query.view.institutions.InstitutionView.GetInstitutionByRespondentId

publication/src/main/scala/hmda/publication/reports/protocol/disclosure/D53Protocol.scala

Lines changed: 0 additions & 58 deletions
This file was deleted.

publication/src/main/scala/hmda/publication/reports/protocol/disclosure/D51Protocol.scala renamed to publication/src/main/scala/hmda/publication/reports/protocol/disclosure/D5XProtocol.scala

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,25 @@
11
package hmda.publication.reports.protocol.disclosure
22

3-
import spray.json.DefaultJsonProtocol
43
import hmda.model.publication.reports.{ ApplicantIncome, Disposition, MSAReport }
54
import hmda.model.publication.reports.ReportTypeEnum.Disclosure
6-
import hmda.publication.reports.disclosure.D51
5+
import hmda.publication.reports.disclosure.D5X
76
import hmda.publication.reports.protocol.{ ApplicantIncomeProtocol, MSAReportProtocol, ReportTypeEnumProtocol }
87
import spray.json._
8+
import spray.json.DefaultJsonProtocol
99

10-
object D51Protocol
10+
object D5XProtocol
1111
extends DefaultJsonProtocol
1212
with ReportTypeEnumProtocol
1313
with MSAReportProtocol
1414
with ApplicantIncomeProtocol {
1515

16-
implicit object D51Format extends RootJsonFormat[D51] {
16+
implicit object D5XFormat extends RootJsonFormat[D5X] {
1717

18-
override def write(obj: D51): JsValue = {
18+
override def write(obj: D5X): JsValue = {
1919
JsObject(
2020
"respondentId" -> JsString(obj.respondentId),
2121
"institutionName" -> JsString(obj.institutionName),
22-
"table" -> JsString("5-1"),
22+
"table" -> JsString(obj.table),
2323
"type" -> JsString(Disclosure.toString),
2424
"desc" -> JsString(obj.description),
2525
"year" -> JsNumber(obj.year),
@@ -30,26 +30,27 @@ object D51Protocol
3030
)
3131
}
3232

33-
override def read(json: JsValue): D51 = json.asJsObject.getFields(
33+
override def read(json: JsValue): D5X = json.asJsObject.getFields(
3434
"respondentId",
3535
"institutionName",
36-
"table",
37-
"type",
38-
"desc",
3936
"year",
4037
"reportDate",
4138
"msa",
4239
"applicantIncomes",
43-
"total"
40+
"total",
41+
"table",
42+
"desc"
4443
) match {
45-
case Seq(respondentId, institutionName, table, reportType, description, year, reportDate, msa, applicantIncomes, total) =>
46-
D51(
44+
case Seq(respondentId, institutionName, year, reportDate, msa, applicantIncomes, total, table, desc) =>
45+
D5X(
4746
respondentId.convertTo[String],
4847
institutionName.convertTo[String],
4948
year.convertTo[Int],
5049
msa.convertTo[MSAReport],
5150
applicantIncomes.convertTo[List[ApplicantIncome]],
5251
total.convertTo[List[Disposition]],
52+
table.convertTo[String],
53+
desc.convertTo[String],
5354
reportDate.convertTo[String]
5455
)
5556
}

0 commit comments

Comments
 (0)