File tree Expand file tree Collapse file tree 2 files changed +72
-0
lines changed
main/scala/hmda/validation/engine/lar
test/scala/hmda/validation/engine/lar Expand file tree Collapse file tree 2 files changed +72
-0
lines changed Original file line number Diff line number Diff line change
1
+ package hmda .validation .engine .lar
2
+
3
+ // See https://www.consumerfinance.gov/eregulations/1003-C/2015-26607_20180101#1003-C-1
4
+
5
+ object ULIValidation {
6
+
7
+ val conversionTable = Map (
8
+ " a" -> 10 ,
9
+ " b" -> 11 ,
10
+ " c" -> 12 ,
11
+ " d" -> 13 ,
12
+ " e" -> 14 ,
13
+ " f" -> 15 ,
14
+ " g" -> 16 ,
15
+ " h" -> 17 ,
16
+ " i" -> 18 ,
17
+ " j" -> 19 ,
18
+ " k" -> 20 ,
19
+ " l" -> 21 ,
20
+ " m" -> 22 ,
21
+ " n" -> 23 ,
22
+ " o" -> 24 ,
23
+ " p" -> 25 ,
24
+ " q" -> 26 ,
25
+ " r" -> 27 ,
26
+ " s" -> 28 ,
27
+ " t" -> 29 ,
28
+ " u" -> 30 ,
29
+ " v" -> 31 ,
30
+ " w" -> 32 ,
31
+ " x" -> 33 ,
32
+ " y" -> 34 ,
33
+ " z" -> 35
34
+ )
35
+
36
+ private def convert (uli : String ): String = uli
37
+ .map(_.toLower)
38
+ .map { c =>
39
+ if (! c.isDigit)
40
+ conversionTable(c.toString).toString
41
+ else
42
+ c
43
+ }.mkString(" " ) + " 00"
44
+
45
+ private def calculateMod (i : BigInt ): BigInt = {
46
+ i % 97
47
+ }
48
+
49
+ private def calculateCheckDigit (i : BigInt ) = {
50
+ 98 - i
51
+ }
52
+
53
+ def checkDigit (uli : String ): String = {
54
+ val checkDigit =
55
+ calculateCheckDigit(calculateMod(BigInt (convert(uli))))
56
+ uli + checkDigit.toString
57
+ }
58
+
59
+ }
Original file line number Diff line number Diff line change
1
+ package hmda .validation .engine .lar
2
+
3
+ import org .scalatest .{ MustMatchers , WordSpec }
4
+
5
+ class ULIValidationSpec extends WordSpec with MustMatchers {
6
+
7
+ " A ULI Validation" must {
8
+ " Produce valid check digit" in {
9
+ val uli = " 10Bx939c5543TqA1144M999143X"
10
+ ULIValidation .checkDigit(uli) mustBe " 10Bx939c5543TqA1144M999143X38"
11
+ }
12
+ }
13
+ }
You can’t perform that action at this time.
0 commit comments