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 StrategyC1 implements Strategy {
29
30 private static final Strategy S17 = new Strategy17();
31
32 private static final int[] multiplicators = new int[] { 1, 2, 1, 2, 1, 2,
33 1, 2, 1 };
34
35 /**
36 * @see net.sf.plausj.bank.german.strategy.Strategy#calculateCheckDigit(net.sf.plausj.bank.german.BankCode,
37 * net.sf.plausj.bank.german.AccountCode)
38 */
39 public CheckDigit calculateCheckDigit(final BankCode bankCode,
40 final AccountCode accountCode) {
41 if (5 != accountCode.getDigitAtPos(0)) {
42 return methodOne(accountCode);
43 } else {
44 return methodTwo(accountCode);
45 }
46 }
47
48 private CheckDigit methodOne(AccountCode accountCode) {
49 return S17.calculateCheckDigit(null, accountCode);
50 }
51
52 private CheckDigit methodTwo(AccountCode accountCode) {
53 int sum = 0;
54 for (int i = 0; i < AccountCode.ACCOUNT_CODE_MAX_LENGTH - 1; ++i) {
55 int p = accountCode.getDigitAtPos(i) * multiplicators[i];
56 if (p > 9 && i % 2 != 0) {
57 p = MathHelper.calcCrossTotal(p);
58 }
59 sum += p;
60 }
61 --sum;
62 int mod = sum % 11;
63 int cd = 10 - mod;
64 if (0 == mod) {
65 cd = 0;
66 }
67
68 return new CheckDigit(9, cd);
69 }
70
71 }