Skip to content

Commit ae6efeb

Browse files
author
pauldambra
committed
exception two and nine passing
1 parent 3e978ee commit ae6efeb

16 files changed

+80
-85
lines changed

src/main/java/com/dambra/paul/moduluschecker/Account/BankAccount.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,14 @@ public int getNumberAt(int i) {
3636
return allDigits().toArray(Integer[]::new)[i];
3737
}
3838

39+
@Override
40+
public String toString() {
41+
return "BankAccount{" +
42+
"sortCode='" + sortCode + '\'' +
43+
", accountNumber='" + accountNumber + '\'' +
44+
'}';
45+
}
46+
3947
private static class NonStandardAccounts {
4048
public static String[] corrections(String sortCode, String accountNumber) {
4149

src/main/java/com/dambra/paul/moduluschecker/ModulusChecker.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
import com.dambra.paul.moduluschecker.Account.BankAccount;
44
import com.dambra.paul.moduluschecker.chain.*;
5+
import com.dambra.paul.moduluschecker.chain.checks.DoubleAlternateCheck;
6+
import com.dambra.paul.moduluschecker.chain.checks.ModulusElevenCheck;
7+
import com.dambra.paul.moduluschecker.chain.checks.ModulusTenCheck;
58
import com.dambra.paul.moduluschecker.valacdosFile.ModulusWeightRows;
69

710
import java.util.Optional;
@@ -23,6 +26,7 @@ public Boolean checkBankAccount(String sortCode, String accountNumber) {
2326

2427
Boolean firstResult = modulusResults.firstCheck.orElse(false);
2528
Boolean secondResult = modulusResults.secondCheck.orElse(false);
29+
2630
return firstResult || secondResult;
2731
}
2832

src/main/java/com/dambra/paul/moduluschecker/chain/FirstModulusCheckRouter.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package com.dambra.paul.moduluschecker.chain;
22

33
import com.dambra.paul.moduluschecker.ModulusCheckParams;
4+
import com.dambra.paul.moduluschecker.chain.checks.DoubleAlternateCheck;
5+
import com.dambra.paul.moduluschecker.chain.checks.ModulusElevenCheck;
6+
import com.dambra.paul.moduluschecker.chain.checks.ModulusTenCheck;
47
import com.dambra.paul.moduluschecker.valacdosFile.WeightRow;
58

69
import java.util.Optional;

src/main/java/com/dambra/paul/moduluschecker/chain/SecondModulusCheckGate.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,12 @@ public SecondModulusCheckGate(SecondModulusCheckRouter next) {
1414
public ModulusResult check(ModulusCheckParams params) {
1515
if (!params.getSecondWeightRow().isPresent()) { return params.getModulusResult().get(); }
1616

17+
if (params.getFirstWeightRow().get().isExceptionTwo()) {
18+
if (params.getModulusResult().get().firstCheck.get()) {
19+
return params.getModulusResult().get();
20+
}
21+
}
22+
1723
return next.check(params);
1824
}
1925
}

src/main/java/com/dambra/paul/moduluschecker/chain/SecondModulusCheckRouter.java

Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
package com.dambra.paul.moduluschecker.chain;
22

3-
import com.dambra.paul.moduluschecker.Account.BankAccount;
43
import com.dambra.paul.moduluschecker.ModulusCheckParams;
4+
import com.dambra.paul.moduluschecker.chain.checks.DoubleAlternateCheck;
5+
import com.dambra.paul.moduluschecker.chain.checks.ModulusElevenCheck;
6+
import com.dambra.paul.moduluschecker.chain.checks.ModulusTenCheck;
57
import com.dambra.paul.moduluschecker.valacdosFile.WeightRow;
68

9+
import java.util.function.Function;
10+
711
public class SecondModulusCheckRouter implements ModulusChainCheck {
812
private final DoubleAlternateCheck doubleAlternateCheck;
913
private final ModulusTenCheck modulusTenCheck;
@@ -27,25 +31,16 @@ public ModulusResult check(ModulusCheckParams params) {
2731
return params.getModulusResult().get();
2832
}
2933

30-
31-
if (isExceptionTwoAndNineWithFailingFirstCheck(params)) {
32-
params = new ModulusCheckParams(
33-
new BankAccount(BankAccount.LLOYDS_EURO_SORT_CODE, params.getAccount().accountNumber),
34-
params.getFirstWeightRow(),
35-
params.getSecondWeightRow(),
36-
params.getModulusResult()
37-
);
38-
}
39-
34+
Function<ModulusCheckParams, WeightRow> rowSelector = p -> p.getSecondWeightRow().get();
4035
switch (params.getSecondWeightRow().get().modulusAlgorithm) {
4136
case DOUBLE_ALTERNATE:
42-
result = doubleAlternateCheck.check(params, p -> p.getSecondWeightRow().get());
37+
result = doubleAlternateCheck.check(params, rowSelector);
4338
break;
4439
case MOD10:
45-
result = modulusTenCheck.check(params, p -> p.getSecondWeightRow().get());
40+
result = modulusTenCheck.check(params, rowSelector);
4641
break;
4742
case MOD11:
48-
result = modulusElevenCheck.check(params, p -> p.getSecondWeightRow().get());
43+
result = modulusElevenCheck.check(params, rowSelector);
4944
break;
5045
}
5146

@@ -60,11 +55,4 @@ private boolean isExceptionTwoAndNineWithPassingFirstCheck(ModulusCheckParams pa
6055

6156
return isExceptionTwoAndNine && hasResults && hasFirstCheckResult && firstCheckSucceeded;
6257
}
63-
64-
private boolean isExceptionTwoAndNineWithFailingFirstCheck(ModulusCheckParams params) {
65-
return WeightRow.isExceptionTwoAndNine(params.getFirstWeightRow(), params.getSecondWeightRow())
66-
&& params.getModulusResult().isPresent()
67-
&& params.getModulusResult().get().firstCheck.isPresent()
68-
&& !params.getModulusResult().get().firstCheck.get();
69-
}
7058
}

src/main/java/com/dambra/paul/moduluschecker/chain/DoubleAlternateCheck.java renamed to src/main/java/com/dambra/paul/moduluschecker/chain/checks/DoubleAlternateCheck.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.dambra.paul.moduluschecker.chain;
1+
package com.dambra.paul.moduluschecker.chain.checks;
22

33
import com.dambra.paul.moduluschecker.As;
44
import com.dambra.paul.moduluschecker.ModulusCheckParams;
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.dambra.paul.moduluschecker.chain.checks;
2+
3+
import com.dambra.paul.moduluschecker.Account.BankAccount;
4+
import com.dambra.paul.moduluschecker.ModulusCheckParams;
5+
import com.dambra.paul.moduluschecker.valacdosFile.WeightRow;
6+
import com.google.common.collect.Streams;
7+
8+
import java.util.function.Function;
9+
10+
public final class LloydsAlternateModulusElevenCheck {
11+
public Boolean check(ModulusCheckParams params, Function<ModulusCheckParams, WeightRow> rowSelector) {
12+
WeightRow selectedRow = rowSelector.apply(params);
13+
14+
if (!WeightRow.isExceptionTwoAndNine(params.getFirstWeightRow(), params.getSecondWeightRow())) {
15+
return false;
16+
}
17+
18+
BankAccount account = new BankAccount(BankAccount.LLOYDS_EURO_SORT_CODE, params.getAccount().accountNumber);
19+
20+
int total = Streams.zip(
21+
account.allDigits(),
22+
selectedRow.getWeights().stream(),
23+
(l, r) -> l * r
24+
).reduce(0, Integer::sum);
25+
26+
return total % 11 == 0;
27+
}
28+
}

src/main/java/com/dambra/paul/moduluschecker/chain/ModulusElevenCheck.java renamed to src/main/java/com/dambra/paul/moduluschecker/chain/checks/ModulusElevenCheck.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.dambra.paul.moduluschecker.chain;
1+
package com.dambra.paul.moduluschecker.chain.checks;
22

33
import com.dambra.paul.moduluschecker.Account.BankAccount;
44
import com.dambra.paul.moduluschecker.ModulusCheckParams;
@@ -23,8 +23,15 @@ public Boolean check(ModulusCheckParams params, Function<ModulusCheckParams, Wei
2323

2424
int remainder = total % 11;
2525

26-
boolean isExceptionFour = selectedRow.isExceptionFour();
27-
return isExceptionFour ? remainder == exceptionFourCheckDigit(params) : remainder == 0;
26+
if (selectedRow.isExceptionFour()) {
27+
return remainder == exceptionFourCheckDigit(params);
28+
}
29+
else {
30+
boolean result = remainder == 0;
31+
if (result) { return true; }
32+
33+
return new LloydsAlternateModulusElevenCheck().check(params, rowSelector);
34+
}
2835
}
2936

3037
private int exceptionFourCheckDigit(ModulusCheckParams params) {
@@ -34,7 +41,7 @@ private int exceptionFourCheckDigit(ModulusCheckParams params) {
3441
}
3542

3643
private ImmutableList<Integer> CheckForExceptionTwoAndNine(ModulusCheckParams params, WeightRow selectedRow) {
37-
if (!WeightRow.isExceptionTwoAndNine(java.util.Optional.ofNullable(selectedRow), params.getSecondWeightRow())) {
44+
if (!WeightRow.isExceptionTwoAndNine(params.getFirstWeightRow(), params.getSecondWeightRow())) {
3845
return selectedRow.getWeights();
3946
}
4047

@@ -43,9 +50,9 @@ private ImmutableList<Integer> CheckForExceptionTwoAndNine(ModulusCheckParams pa
4350
}
4451

4552
if (params.getAccount().getNumberAt(BankAccount.G) == 9) {
46-
return ImmutableList.of(0, 0, 1, 2, 5, 3, 6, 4, 8, 7, 10, 9, 3, 1);
47-
} else {
4853
return ImmutableList.of(0, 0, 0, 0, 0, 0, 0, 0, 8, 7, 10, 9, 3, 1);
54+
} else {
55+
return ImmutableList.of(0, 0, 1, 2, 5, 3, 6, 4, 8, 7, 10, 9, 3, 1);
4956
}
5057
}
5158

src/main/java/com/dambra/paul/moduluschecker/chain/ModulusTenCheck.java renamed to src/main/java/com/dambra/paul/moduluschecker/chain/checks/ModulusTenCheck.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.dambra.paul.moduluschecker.chain;
1+
package com.dambra.paul.moduluschecker.chain.checks;
22

33
import com.dambra.paul.moduluschecker.ModulusCheckParams;
44
import com.dambra.paul.moduluschecker.valacdosFile.WeightRow;

src/main/java/com/dambra/paul/moduluschecker/valacdosFile/ModulusWeightRows.java

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,38 +24,30 @@ public ModulusWeightRows(List<ValacdosRow> valacdosRows) {
2424
this.valacdosRows = ImmutableList.copyOf(valacdosRows);
2525
}
2626

27-
private ImmutableListMultimap<String, WeightRow> expand(ImmutableMap<SortCodeRange, WeightRow> weights) {
28-
ListMultimap<String, WeightRow> expandedRows = ArrayListMultimap.create();
29-
weights.forEach((scr, weightRow) -> scr.fullRange()
30-
.forEach(sc -> expandedRows.put(sc, weightRow)));
31-
return ImmutableListMultimap.copyOf(expandedRows);
32-
}
33-
3427
public ModulusCheckParams FindFor(BankAccount account) {
3528

3629
WeightRow first = null;
3730
WeightRow second = null;
3831

3932
for (ValacdosRow vr : this.valacdosRows) {
33+
boolean stillSeekingFirstMatch = first == null;
34+
4035
if (!vr.getSortCodeRange().contains(account.sortCode)) {
41-
if (first == null) {
36+
if (stillSeekingFirstMatch) {
4237
continue;
4338
} else {
4439
break;
4540
}
4641
}
4742

48-
if (first == null) {
43+
if (stillSeekingFirstMatch) {
4944
first = vr.getWeightRow();
5045
continue;
5146
}
5247

5348
second = vr.getWeightRow();
5449
}
5550

56-
System.out.println("first: " + first);
57-
System.out.println("second: " + second);
58-
5951
return new ModulusCheckParams(
6052
account,
6153
Optional.ofNullable(first),

0 commit comments

Comments
 (0)