1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package net.sf.plausj.bank.german.strategy;
18
19 import net.sf.plausj.bank.german.AccountCode;
20 import net.sf.plausj.bank.german.BankCode;
21 import net.sf.plausj.bank.german.CheckDigit;
22 import net.sf.plausj.bank.german.util.MathHelper;
23
24 /**
25 * @author ninan
26 *
27 */
28 public class Strategy69 implements Strategy {
29
30 private static final int[] tblIndex = new int[] { 0, 3, 2, 1, 0, 3, 2, 1, 0 };
31
32 private static final int[][] table = new int[][] {
33 { 0, 1, 5, 9, 3, 7, 4, 8, 2, 6 }, { 0, 1, 7, 6, 9, 8, 3, 2, 5, 4 },
34 { 0, 1, 8, 4, 6, 2, 9, 5, 7, 3 }, { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 } };
35
36 /**
37 * @see net.sf.plausj.bank.german.strategy.Strategy#calculateCheckDigit(net.sf.plausj.bank.german.BankCode,
38 * net.sf.plausj.bank.german.AccountCode)
39 */
40 public CheckDigit calculateCheckDigit(final BankCode bankCode,
41 final AccountCode accountCode) {
42
43 if (9 == accountCode.getDigitAtPos(0)) {
44 if (3 == accountCode.getDigitAtPos(1)) {
45 return null;
46 } else if (7 == accountCode.getDigitAtPos(1)) {
47 return calculateVariantTwo(accountCode);
48 }
49 }
50
51 CheckDigit cd = calculateVariantOne(accountCode);
52
53 if (!accountCode.matchesCheckDigit(cd)) {
54 cd = calculateVariantTwo(accountCode);
55 }
56
57 return cd;
58
59 }
60
61 private CheckDigit calculateVariantOne(AccountCode accountCode) {
62 Strategy s = new Strategy28();
63 CheckDigit cd = s.calculateCheckDigit(null, accountCode);
64 return cd;
65 }
66
67 private CheckDigit calculateVariantTwo(AccountCode accountCode) {
68
69 int sum = 0;
70
71 for (int i = AccountCode.ACCOUNT_CODE_MAX_LENGTH - 2; i >= 0; --i) {
72 int idx = tblIndex[i];
73 sum += table[idx][accountCode.getDigitAtPos(i)];
74 }
75
76 int ld = MathHelper.getLastDigits(sum, 1);
77 int cd = 10 - ld;
78
79 return new CheckDigit(9, cd);
80 }
81 }