Skip to content

Commit 1af4ca7

Browse files
author
Nick Grippin
authored
Merge pull request cfpb#1118 from schbetsy/filing-status
Fix for Filing Status Bugs
2 parents f04dde7 + fb10cde commit 1af4ca7

File tree

5 files changed

+69
-56
lines changed

5 files changed

+69
-56
lines changed

persistence/src/main/scala/hmda/persistence/institutions/FilingPersistence.scala

Lines changed: 26 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package hmda.persistence.institutions
22

33
import akka.actor.{ ActorRef, ActorSystem, Props }
4-
import hmda.model.fi.{ Completed, Filing, InProgress, NotStarted }
4+
import hmda.model.fi._
55
import hmda.persistence.messages.CommonMessages._
66
import hmda.persistence.institutions.FilingPersistence._
77
import hmda.persistence.model.HmdaPersistentActor
@@ -12,7 +12,7 @@ object FilingPersistence {
1212
val name = "filings"
1313

1414
case class CreateFiling(filing: Filing) extends Command
15-
case class UpdateFilingStatus(filing: Filing) extends Command
15+
case class UpdateFilingStatus(period: String, status: FilingStatus) extends Command
1616
case class GetFilingByPeriod(period: String) extends Command
1717

1818
def props(institutionId: String): Props = Props(new FilingPersistence(institutionId))
@@ -48,38 +48,26 @@ class FilingPersistence(institutionId: String) extends HmdaPersistentActor {
4848

4949
override def receiveCommand: Receive = super.receiveCommand orElse {
5050
case CreateFiling(f) =>
51-
if (!state.filings.contains(f)) {
52-
persist(FilingCreated(f)) { e =>
53-
log.debug(s"Persisted: $f")
54-
updateState(e)
55-
sender() ! Some(f)
56-
}
51+
if (!state.filings.map(_.period).contains(f.period)) {
52+
persistFilingEvent(FilingCreated(f), f)
5753
} else {
5854
sender() ! None
59-
log.warning(s"Filing already exists. Could not create $f")
55+
log.warning(s"Could not create Filing. Filing period ${f.period} already exists for institution $institutionId.")
6056
}
6157

62-
case UpdateFilingStatus(modified) =>
63-
if (state.filings.map(x => x.period).contains(modified.period)) {
64-
val start = if (modified.status == InProgress) {
65-
System.currentTimeMillis
66-
} else {
67-
modified.start
68-
}
69-
val end = if (modified.status == Completed) {
70-
System.currentTimeMillis
71-
} else {
72-
modified.end
73-
}
74-
val updatedFiling = modified.copy(start = start, end = end)
75-
persist(FilingStatusUpdated(updatedFiling)) { e =>
76-
log.debug(s"persisted: $updatedFiling")
77-
updateState(e)
78-
sender() ! Some(updatedFiling)
79-
}
80-
} else {
81-
sender() ! None
82-
log.warning(s"Period does not exist. Could not update $modified")
58+
case UpdateFilingStatus(period, newStatus) =>
59+
state.filings.find(f => f.period == period) match {
60+
case Some(filing) if filing.status == Completed =>
61+
sender() ! None
62+
log.debug(s"$period Filing for Institution $institutionId is already Completed. Not updating status")
63+
case Some(filing) =>
64+
val startTime = if (newStatus == InProgress) System.currentTimeMillis else filing.start
65+
val endTime = if (newStatus == Completed) System.currentTimeMillis else filing.end
66+
val updatedFiling = filing.copy(status = newStatus, start = startTime, end = endTime)
67+
persistFilingEvent(FilingStatusUpdated(updatedFiling), updatedFiling)
68+
case None =>
69+
sender() ! None
70+
log.warning(s"Could not update filing status. Institution $institutionId, filing period $period")
8371
}
8472

8573
case GetFilingByPeriod(period) =>
@@ -94,4 +82,12 @@ class FilingPersistence(institutionId: String) extends HmdaPersistentActor {
9482
sender() ! state.filings
9583

9684
}
85+
86+
private def persistFilingEvent(event: Event, filing: Filing) = {
87+
persist(event) { e =>
88+
log.debug(s"persisted: $filing")
89+
updateState(e)
90+
sender() ! Some(filing)
91+
}
92+
}
9793
}

persistence/src/main/scala/hmda/persistence/processing/SubmissionManager.scala

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -164,12 +164,7 @@ class SubmissionManager(submissionId: SubmissionId) extends HmdaActor {
164164
}
165165

166166
private def updateFilingStatus(filingStatus: FilingStatus) = {
167-
for {
168-
p <- filingPersistence
169-
f <- (p ? GetFilingByPeriod(period)).mapTo[Filing]
170-
} yield {
171-
p ? UpdateFilingStatus(f.copy(status = filingStatus))
172-
}
167+
filingPersistence.map(_ ? UpdateFilingStatus(period, filingStatus))
173168
}
174169

175170
}

persistence/src/test/resources/application.conf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,5 @@ akka.test.single-expect-default = 10s
1414

1515
hmda {
1616
isDemo = false
17+
edits.demoMode = false
1718
}

persistence/src/test/scala/hmda/persistence/institutions/FilingPersistenceSpec.scala

Lines changed: 40 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,48 +3,68 @@ package hmda.persistence.institutions
33
import akka.testkit.TestProbe
44
import hmda.model.fi._
55
import hmda.persistence.messages.CommonMessages.GetState
6-
import hmda.persistence.demo.DemoData
76
import hmda.persistence.institutions.FilingPersistence._
87
import hmda.persistence.model.ActorSpec
98

109
class FilingPersistenceSpec extends ActorSpec {
1110

1211
val filingsActor = createFilings("12345", system)
1312

13+
val sample1 = Filing("2016", "12345", Cancelled, filingRequired = true, 1483287071000L, 1514736671000L)
14+
val sample2 = Filing("2017", "12345", NotStarted, filingRequired = true, 0L, 0L)
15+
1416
val probe = TestProbe()
1517

16-
"Filings" must {
17-
"be created and read back" in {
18-
val filings = DemoData.testFilings
18+
"CreateFiling" must {
19+
"create a filing" in {
20+
val filings = Seq(sample1, sample2)
1921
for (filing <- filings) {
2022
probe.send(filingsActor, CreateFiling(filing))
2123
probe.expectMsg(Some(filing))
2224
}
2325
probe.send(filingsActor, GetState)
2426
probe.expectMsg(filings.reverse)
2527
}
26-
"be able to change their status" in {
27-
val filing = DemoData.testFilings.head
28-
val modified = filing.copy(status = Cancelled)
29-
probe.send(filingsActor, UpdateFilingStatus(modified))
30-
probe.expectMsg(Some(modified))
31-
probe.send(filingsActor, GetFilingByPeriod(filing.period))
32-
probe.expectMsg(modified)
33-
}
34-
35-
"return None when persisting a filing that already exists" in {
36-
val f1 = Filing("2016", "12345", Completed, true, 1483287071000L, 1514736671000L)
28+
"return Some when creating filing for period with no filings" in {
29+
val f1 = Filing("2018", "12345", Completed, true, 1483287071000L, 1514736671000L)
3730
probe.send(filingsActor, CreateFiling(f1))
3831
probe.expectMsg(Some(f1))
39-
40-
val f2 = Filing("2016", "12345", Completed, true, 1483287071000L, 1514736671000L)
32+
}
33+
"return None when persisting a filing period that already has a filing" in {
34+
val f2 = Filing("2016", "12345", InProgress, true, 1483287071000L, 0L)
4135
probe.send(filingsActor, CreateFiling(f2))
4236
probe.expectMsg(None)
4337
}
38+
}
4439

45-
"return None for nonexistent period" in {
46-
val f = Filing("2006", "12345", Cancelled, false, 1483287071000L, 1514736671000L)
47-
probe.send(filingsActor, UpdateFilingStatus(f))
40+
"UpdateFilingStatus" must {
41+
"update status of filing for given period" in {
42+
val expected = sample1.copy(status = NotStarted)
43+
probe.send(filingsActor, UpdateFilingStatus("2016", NotStarted))
44+
probe.expectMsg(Some(expected))
45+
probe.send(filingsActor, GetFilingByPeriod("2016"))
46+
probe.expectMsg(expected)
47+
}
48+
"return None for nonexistent filing period" in {
49+
probe.send(filingsActor, UpdateFilingStatus("2006", InProgress))
50+
probe.expectMsg(None)
51+
}
52+
"update start and end timestamp, if necessary" in {
53+
probe.send(filingsActor, UpdateFilingStatus("2017", InProgress))
54+
val inProg = probe.expectMsgType[Option[Filing]].get
55+
inProg.status mustBe InProgress
56+
val startTime = inProg.start
57+
startTime must be > 0L
58+
inProg.end mustBe 0L
59+
60+
probe.send(filingsActor, UpdateFilingStatus("2017", Completed))
61+
val comp = probe.expectMsgType[Option[Filing]].get
62+
comp.status mustBe Completed
63+
comp.start mustBe startTime
64+
comp.end must be > 0L
65+
}
66+
"not update if filing status is already 'Completed'" in {
67+
probe.send(filingsActor, UpdateFilingStatus("2017", InProgress))
4868
probe.expectMsg(None)
4969
}
5070
}

validation/src/test/resources/application.conf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,6 @@ akka {
1515

1616
hmda {
1717
isDemo = false
18+
edits.demoMode = false
1819
persistent-actor-timeout = 60
1920
}

0 commit comments

Comments
 (0)