Skip to content

Commit 585fd06

Browse files
committed
Move from camt 53 to 52 for intraday request. Parsing logic for it. Add test endpoint for getting parsed version
1 parent 4a737db commit 585fd06

File tree

9 files changed

+1348
-26
lines changed

9 files changed

+1348
-26
lines changed

build.gradle.kts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,8 @@ tasks {
316316
val rootSchemas =
317317
listOf(
318318
file("$xsdDir/camt.060.001.03.xsd") to "ee.swedbank.gateway.iso.request",
319-
file("$xsdDir/camt.053.001.02.xsd") to "ee.swedbank.gateway.iso.response",
319+
file("$xsdDir/camt.052.001.02.xsd") to "ee.swedbank.gateway.iso.response",
320+
// file("$xsdDir/camt.053.001.02.xsd") to "ee.swedbank.gateway.iso.response",
320321
)
321322

322323
doLast {

src/main/java/ee/tuleva/onboarding/ledger/LedgerTestController.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,14 @@
55

66
import ee.tuleva.onboarding.auth.principal.AuthenticatedPerson;
77
import ee.tuleva.onboarding.swedbank.fetcher.SwedbankStatementFetcher;
8+
import ee.tuleva.onboarding.swedbank.statement.BankStatement;
89
import ee.tuleva.onboarding.user.User;
910
import ee.tuleva.onboarding.user.UserService;
1011
import io.swagger.v3.oas.annotations.Operation;
1112
import jakarta.validation.Valid;
1213
import java.math.BigDecimal;
1314
import java.util.List;
15+
import java.util.UUID;
1416
import lombok.AllArgsConstructor;
1517
import org.springframework.context.annotation.Profile;
1618
import org.springframework.security.core.annotation.AuthenticationPrincipal;
@@ -76,5 +78,13 @@ public void getSwedbankResponse() {
7678
swedbankStatementFetcher.getResponse(DEPOSIT_EUR);
7779
}
7880

81+
@Operation(summary = "Get statement response")
82+
@GetMapping("/swedbank/job/{id}")
83+
public BankStatement getSwedbankJobResponse(@PathVariable UUID id) {
84+
var job = swedbankStatementFetcher.getById(id).orElseThrow();
85+
var parsed = swedbankStatementFetcher.getParsedStatementResponse(job);
86+
return BankStatement.from(parsed.getBkToCstmrAcctRpt().getRpt().getFirst());
87+
}
88+
7989
record DepositDto(BigDecimal amount) {}
8090
}

src/main/java/ee/tuleva/onboarding/swedbank/fetcher/SwedbankStatementFetcher.java

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@
88
import java.time.Clock;
99
import java.time.temporal.ChronoUnit;
1010
import java.util.Optional;
11+
import java.util.UUID;
1112
import lombok.Getter;
1213
import lombok.RequiredArgsConstructor;
1314
import lombok.extern.slf4j.Slf4j;
1415
import org.springframework.context.annotation.Profile;
15-
import org.springframework.scheduling.annotation.Scheduled;
1616
import org.springframework.stereotype.Service;
1717
import org.springframework.web.client.RestClientException;
1818

@@ -40,7 +40,11 @@ public enum SwedbankAccount {
4040
}
4141
}
4242

43-
@Scheduled(cron = "0 0 9-17 * * MON-FRI")
43+
public Optional<SwedbankStatementFetchJob> getById(UUID id) {
44+
return swedbankStatementFetchJobRepository.findById(id);
45+
}
46+
47+
// @Scheduled(cron = "0 0 9-17 * * MON-FRI")
4448
public void sendRequests() {
4549
for (SwedbankAccount account : SwedbankAccount.values()) {
4650
sendRequest(account);
@@ -90,7 +94,7 @@ public void sendRequest(SwedbankAccount account) {
9094
}
9195
}
9296

93-
@Scheduled(cron = "0 */15 9-17 * * MON-FRI")
97+
// @Scheduled(cron = "0 */15 9-17 * * MON-FRI")
9498
public void getResponses() {
9599
for (SwedbankAccount account : SwedbankAccount.values()) {
96100
getResponse(account);
@@ -166,18 +170,19 @@ public void getResponse(SwedbankAccount account) {
166170
swedbankStatementFetchJobRepository.save(jobForResponseFromSwedbank);
167171

168172
try {
169-
processStatementResponse(jobForResponseFromSwedbank);
173+
getParsedStatementResponse(jobForResponseFromSwedbank);
170174
} catch (Exception e) {
171175
log.error("Failed to process Swedbank statement response for account={}", account, e);
172176
}
173177

174178
acknowledgeResponse(response, jobForResponseFromSwedbank);
175179
}
176180

177-
private void processStatementResponse(SwedbankStatementFetchJob job) {
178-
Document response = swedbankGatewayClient.getParsedStatementResponse(job.getRawResponse());
179-
180-
log.info("Swedbank statement response: {}", response);
181+
public Document getParsedStatementResponse(SwedbankStatementFetchJob job) {
182+
if (job.getRawResponse() == null) {
183+
throw new IllegalStateException("Job has no response");
184+
}
185+
return swedbankGatewayClient.getParsedStatementResponse(job.getRawResponse());
181186
}
182187

183188
private void acknowledgeResponse(

src/main/java/ee/tuleva/onboarding/swedbank/http/SwedbankGatewayClient.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ public JAXBElement<ee.swedbank.gateway.iso.request.Document> getAccountStatement
118118
ReportingRequest3 reportingRequest = new ReportingRequest3();
119119

120120
reportingRequest.setId(serializeRequestId(messageId));
121-
reportingRequest.setReqdMsgNmId("camt.053.001.02");
121+
reportingRequest.setReqdMsgNmId("camt.052.001.02"); // current day 52, past 53
122122

123123
CashAccount24 cashAccount24 = new CashAccount24();
124124
AccountIdentification4Choice accountIdentification = new AccountIdentification4Choice();
@@ -130,7 +130,7 @@ public JAXBElement<ee.swedbank.gateway.iso.request.Document> getAccountStatement
130130

131131
var partyChoice = new Party12Choice();
132132
var party = new PartyIdentification43();
133-
party.setNm("Tuleva");
133+
// party.setNm("Tuleva");
134134
partyChoice.setPty(party);
135135

136136
reportingRequest.setAcctOwnr(partyChoice);
@@ -169,7 +169,10 @@ public JAXBElement<ee.swedbank.gateway.iso.request.Document> getAccountStatement
169169
}
170170

171171
public ee.swedbank.gateway.iso.response.Document getParsedStatementResponse(String rawResponse) {
172-
return marshaller.unMarshal(rawResponse, ee.swedbank.gateway.iso.response.Document.class);
172+
JAXBElement<ee.swedbank.gateway.iso.response.Document> marshalled =
173+
marshaller.unMarshal(rawResponse, JAXBElement.class);
174+
175+
return marshalled.getValue();
173176
}
174177

175178
public String getRequestXml(JAXBElement<ee.swedbank.gateway.iso.request.Document> requestEntity) {

src/main/java/ee/tuleva/onboarding/swedbank/statement/BankStatement.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import static lombok.AccessLevel.PRIVATE;
44

5-
import ee.swedbank.gateway.iso.response.AccountStatement2;
5+
import ee.swedbank.gateway.iso.response.AccountReport11;
66
import java.util.List;
77
import lombok.Getter;
88
import lombok.RequiredArgsConstructor;
@@ -16,10 +16,11 @@ public class BankStatement {
1616
// TODO check entries against TtlCdtNtries and TttlDbtEntries count from balances?
1717
private final List<BankStatementEntry> entries;
1818

19-
public static BankStatement from(AccountStatement2 statement) {
20-
var accountType = BankStatementAccountType.from(statement);
21-
var balances = statement.getBal().stream().map(BankStatementBalance::from).toList();
22-
var entries = statement.getNtry().stream().map(BankStatementEntry::from).toList();
19+
// TODO camt 053 for previous reports also here?
20+
public static BankStatement from(AccountReport11 report) {
21+
var accountType = BankStatementAccountType.from(report);
22+
var balances = report.getBal().stream().map(BankStatementBalance::from).toList();
23+
var entries = report.getNtry().stream().map(BankStatementEntry::from).toList();
2324

2425
return new BankStatement(accountType, balances, entries);
2526
}

src/main/java/ee/tuleva/onboarding/swedbank/statement/BankStatementAccountType.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import static ee.tuleva.onboarding.ledger.LedgerAccount.ServiceAccountType.DEPOSIT_EUR;
44

5-
import ee.swedbank.gateway.iso.response.AccountStatement2;
5+
import ee.swedbank.gateway.iso.response.AccountReport11;
66
import ee.tuleva.onboarding.ledger.LedgerAccount.ServiceAccountType;
77

88
public record BankStatementAccountType(String iban) {
@@ -11,7 +11,7 @@ public ServiceAccountType getServiceAccountType() {
1111
return DEPOSIT_EUR;
1212
}
1313

14-
public static BankStatementAccountType from(AccountStatement2 statement) {
15-
return new BankStatementAccountType(statement.getAcct().getId().getIBAN());
14+
public static BankStatementAccountType from(AccountReport11 report) {
15+
return new BankStatementAccountType(report.getAcct().getId().getIBAN());
1616
}
1717
}

src/main/java/ee/tuleva/onboarding/swedbank/statement/BankStatementBalance.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,17 @@ public static StatementBalanceType fromBalanceCode(BalanceType12Code balanceType
3434
return Arrays.stream(StatementBalanceType.values())
3535
.filter(balanceType -> balanceType.balanceCode.equals(balanceTypeCode))
3636
.findFirst()
37-
.orElseThrow(
38-
() -> new IllegalArgumentException("Cannot match balance type " + balanceTypeCode));
37+
.orElse(null); // TODO reserved party null balance code?
38+
/*.orElseThrow(
39+
() -> new IllegalArgumentException("Cannot match balance type " + balanceTypeCode));*/
3940
}
4041
}
4142

4243
public static BankStatementBalance from(CashBalance3 balance) {
4344
var dateConverter = new XmlGregorianCalendarConverterToLocalDate();
4445
var statementBalanceType =
45-
StatementBalanceType.fromBalanceCode(balance.getTp().getCdOrPrtry().getCd());
46+
StatementBalanceType.fromBalanceCode(
47+
balance.getTp().getCdOrPrtry().getCd()); // TODO reserved party = null?
4648

4749
// handle dateTime here as well?
4850
var date = dateConverter.convert(balance.getDt().getDt());

0 commit comments

Comments
 (0)