-
Notifications
You must be signed in to change notification settings - Fork 0
/
Skatteberegner.java
109 lines (77 loc) · 4.75 KB
/
Skatteberegner.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
package no.bekk.test.aws;
import com.amazonaws.services.dynamodbv2.document.*;
import ske.fastsetting.manntall.skatteplikt.v1_0.SkattesubjektXml;
import ske.fastsetting.skatt.beregnetskatt.v1_0.BeregnetSkattXml;
import ske.fastsetting.skatt.beregnetskatt.v1_0.ObjectFactory;
import ske.fastsetting.skatt.forskudd.SkattyterKontekstForskuddBuilder;
import ske.fastsetting.skatt.skatteberegning.SkatteberegningService;
import ske.fastsetting.skatt.skattegrunnlag.v2_0.SkattegrunnlagXml;
import ske.fastsetting.skatt.uttrykk.domene.SkattyterKontekst;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
class Skatteberegner {
private static final String SKATTEGRUNNLAG_TABLE = "Skattegrunnlag";
private static final String SKATTEPLIKT_TABLE = "Skatteplikt";
private static final String BEREGNETSKATT_TABLE = "BeregnetSkatt";
private final String[] fnrArray;
private final DynamoDB dynamoDB;
private final JaxbXmlMapper jaxbXmlMapper;
Skatteberegner(DynamoDB dynamoDB, String[] fnrArray, JaxbXmlMapper jaxbXmlMapper) {
this.jaxbXmlMapper = jaxbXmlMapper;
this.fnrArray = fnrArray;
this.dynamoDB = dynamoDB;
}
public void beregn() {
long start = System.currentTimeMillis();
System.out.println("Leser grunnlag fra DynamoDB: " + fnrArray.length);
TableKeysAndAttributes skattegrunnlagTableKeysAndAttributes = new TableKeysAndAttributes(SKATTEGRUNNLAG_TABLE);
TableKeysAndAttributes skattepliktTableKeysAndAttributes = new TableKeysAndAttributes(SKATTEPLIKT_TABLE);
for (String fnr : fnrArray) {
PrimaryKey pk = new PrimaryKey("fnr", fnr);
skattegrunnlagTableKeysAndAttributes.addPrimaryKey(pk);
skattepliktTableKeysAndAttributes.addPrimaryKey(pk);
}
BatchGetItemOutcome outcome = dynamoDB.batchGetItem(skattegrunnlagTableKeysAndAttributes, skattepliktTableKeysAndAttributes);
System.out.println("Lest grunnlag fra DynamoDB: " + fnrArray.length + " stk " + (System.currentTimeMillis() - start) + " ms");
if (outcome.getUnprocessedKeys().size() > 0) {
System.out.println("Fikk ikke alle grunnlag. Rekjører IKKE. Mangler: " + outcome.getUnprocessedKeys());
}
start = System.currentTimeMillis();
Map<String, SkattegrunnlagXml> skattegrunnlagMap = outcome.getTableItems().get(SKATTEGRUNNLAG_TABLE).stream()
.collect(Collectors.toMap(
item -> item.getString("fnr"),
item -> jaxbXmlMapper.fraByteArray(item.getBinary("dok"), SkattegrunnlagXml.class)
));
Map<String, SkattesubjektXml> skattepliktMap = outcome.getTableItems().get(SKATTEPLIKT_TABLE).stream()
.collect(Collectors.toMap(
item -> item.getString("fnr"),
item -> jaxbXmlMapper.fraByteArray(item.getBinary("dok"), SkattesubjektXml.class)
));
System.out.println("Deserialisert grunnlag: " + skattepliktMap.size() + " skatteplikt, " + skattegrunnlagMap.size() + " skattegrunnlag. " + (System.currentTimeMillis() - start) + " ms");
start = System.currentTimeMillis();
List<Item> items = new ArrayList<>();
for (String fnr : fnrArray) {
if (!skattegrunnlagMap.containsKey(fnr) || !skattepliktMap.containsKey(fnr)) {
System.out.println("Mangler grunnlag for fnr " + fnr);
continue;
}
SkattyterKontekst skattyterKontekst = SkattyterKontekstForskuddBuilder.forForskuddAar()
.medSkattegrunnlag(skattegrunnlagMap.get(fnr))
.medSkattesubjekt(skattepliktMap.get(fnr))
.bygg();
BeregnetSkattXml beregnetSkattXml = SkatteberegningService.beregnSkatt(skattyterKontekst, false);
byte[] data = jaxbXmlMapper.tilByteArray(
new ObjectFactory().createBeregnetSkatt(beregnetSkattXml),
BeregnetSkattXml.class);
items.add(new Item().withPrimaryKey("fnr", fnr).withBinary("dok", data));
}
final long tid = System.currentTimeMillis() - start;
System.out.println("Ferdig beregnet: " + fnrArray.length + " stk på " + tid + " ms, altså " + tid / fnrArray.length + " ms/fnr");
start = System.currentTimeMillis();
TableWriteItems beregnetSkattWriteItems = new TableWriteItems(BEREGNETSKATT_TABLE).withItemsToPut(items);
dynamoDB.batchWriteItem(beregnetSkattWriteItems);
System.out.println("Lagret til " + BEREGNETSKATT_TABLE + " " + (System.currentTimeMillis() - start) + " ms");
}
}