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 Strategy63 implements Strategy {
29
30 private static final int[] multiplicators = new int[] { 0, 1, 2, 1, 2, 1, 2 };
31
32 /**
33 * @see net.sf.plausj.bank.german.strategy.Strategy#calculateCheckDigit(net.sf.plausj.bank.german.BankCode,
34 * net.sf.plausj.bank.german.AccountCode)
35 */
36 public CheckDigit calculateCheckDigit(final BankCode bankCode,
37 final AccountCode accountCode) {
38 if (0 != accountCode.getDigitAtPos(0)) {
39 return new CheckDigit(CheckDigit.ALWAYS_INVALID, 0);
40 }
41
42 CheckDigit cd = calculateCheckDigit(accountCode);
43 if (accountCode.matchesCheckDigit(cd)
44 || (0 == accountCode.getDigitAtPos(8) && 0 == accountCode
45 .getDigitAtPos(9))) {
46 return cd;
47 }
48
49 AccountCode accountCodeFb = new AccountCode(accountCode
50 .getAccountCode().substring(2, 10)
51 + "00");
52 CheckDigit cdFb = calculateCheckDigit(accountCodeFb);
53
54 if (!accountCodeFb.matchesCheckDigit(cdFb)) {
55 return cd;
56 } else {
57 return new CheckDigit(9, cdFb.getDigit());
58 }
59 }
60
61 private CheckDigit calculateCheckDigit(AccountCode accountCode) {
62 int sum = 0;
63 for (int i = 6; i > 0; --i) {
64 int p = accountCode.getDigitAtPos(i) * multiplicators[i];
65 while (p > 9) {
66 p = MathHelper.calcCrossTotal(p);
67 }
68 sum += p;
69 }
70
71 int ld = MathHelper.getLastDigits(sum, 1);
72
73 int cd = 0;
74 if (ld > 0) {
75 cd = 10 - ld;
76 }
77
78 return new CheckDigit(7, cd);
79 }
80
81 }