From 5cc91ef780ee148c6a01375499b7e2d0d432f7bb Mon Sep 17 00:00:00 2001 From: Egor Cherniak Date: Fri, 10 Jul 2026 09:31:57 +0300 Subject: [PATCH 1/3] Support new adjustment type --- pom.xml | 4 +- .../disputes/constant/ErrorMessage.java | 1 + ...nsactionInfoAdjustmentParamsConverter.java | 25 +++++++ .../TransactionInfoThriftConverter.java | 23 +++++++ .../ProviderPaymentsAdjustmentExtractor.java | 7 ++ .../service/ProviderPaymentsService.java | 47 +++++++++++-- ..._transaction_info_to_provider_callback.sql | 3 + .../payments/ProviderPaymentsServiceTest.java | 67 +++++++++++++++++++ .../service/config/PendingFlowHandler.java | 7 +- .../dev/vality/disputes/util/MockUtil.java | 12 ++++ 10 files changed, 186 insertions(+), 10 deletions(-) create mode 100644 src/main/java/dev/vality/disputes/provider/payments/converter/ProviderPaymentsToInvoicePaymentTransactionInfoAdjustmentParamsConverter.java create mode 100644 src/main/java/dev/vality/disputes/provider/payments/converter/TransactionInfoThriftConverter.java create mode 100644 src/main/resources/db/migration/V16__add_transaction_info_to_provider_callback.sql diff --git a/pom.xml b/pom.xml index 24f473b4..275ac2d8 100644 --- a/pom.xml +++ b/pom.xml @@ -46,7 +46,7 @@ dev.vality disputes-proto - 1.56-97eaea8 + 1.57-3b5a8e6 dev.vality @@ -60,7 +60,7 @@ dev.vality damsel - 1.679-b5c1dc4 + 1.696-b07c077 dev.vality diff --git a/src/main/java/dev/vality/disputes/constant/ErrorMessage.java b/src/main/java/dev/vality/disputes/constant/ErrorMessage.java index 828cb0b3..eb8d436a 100644 --- a/src/main/java/dev/vality/disputes/constant/ErrorMessage.java +++ b/src/main/java/dev/vality/disputes/constant/ErrorMessage.java @@ -5,6 +5,7 @@ public class ErrorMessage { public static final String NO_ATTACHMENTS = "no attachments"; public static final String INVOICE_NOT_FOUND = "invoice not found"; public static final String PAYMENT_NOT_FOUND = "payment not found"; + public static final String PAYMENT_STATUS_NOT_SUCCESS = "payment status is not success"; public static final String PAYMENT_STATUS_RESTRICTIONS = "payment status restrictions"; public static final String PROVIDER_RESULT_UNEXPECTED = "provider result unexpected"; public static final String DEFAULT_DESTINATION = "dispute via disputes-tg-bot"; diff --git a/src/main/java/dev/vality/disputes/provider/payments/converter/ProviderPaymentsToInvoicePaymentTransactionInfoAdjustmentParamsConverter.java b/src/main/java/dev/vality/disputes/provider/payments/converter/ProviderPaymentsToInvoicePaymentTransactionInfoAdjustmentParamsConverter.java new file mode 100644 index 00000000..23404c4c --- /dev/null +++ b/src/main/java/dev/vality/disputes/provider/payments/converter/ProviderPaymentsToInvoicePaymentTransactionInfoAdjustmentParamsConverter.java @@ -0,0 +1,25 @@ +package dev.vality.disputes.provider.payments.converter; + +import dev.vality.damsel.domain.InvoicePaymentAdjustmentTransactionInfo; +import dev.vality.damsel.payment_processing.InvoicePaymentAdjustmentParams; +import dev.vality.damsel.payment_processing.InvoicePaymentAdjustmentScenario; +import dev.vality.disputes.domain.tables.pojos.ProviderCallback; +import dev.vality.disputes.provider.payments.service.ProviderPaymentsAdjustmentExtractor; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class ProviderPaymentsToInvoicePaymentTransactionInfoAdjustmentParamsConverter { + + private final ProviderPaymentsAdjustmentExtractor providerPaymentsAdjustmentExtractor; + private final TransactionInfoThriftConverter transactionInfoThriftConverter; + + public InvoicePaymentAdjustmentParams convert(ProviderCallback providerCallback) { + var transactionInfo = transactionInfoThriftConverter.deserialize(providerCallback.getTransactionInfo()); + return new InvoicePaymentAdjustmentParams() + .setReason(providerPaymentsAdjustmentExtractor.getReason(providerCallback)) + .setScenario(InvoicePaymentAdjustmentScenario.transaction_info( + new InvoicePaymentAdjustmentTransactionInfo(transactionInfo))); + } +} diff --git a/src/main/java/dev/vality/disputes/provider/payments/converter/TransactionInfoThriftConverter.java b/src/main/java/dev/vality/disputes/provider/payments/converter/TransactionInfoThriftConverter.java new file mode 100644 index 00000000..d0d1d799 --- /dev/null +++ b/src/main/java/dev/vality/disputes/provider/payments/converter/TransactionInfoThriftConverter.java @@ -0,0 +1,23 @@ +package dev.vality.disputes.provider.payments.converter; + +import dev.vality.damsel.domain.TransactionInfo; +import lombok.SneakyThrows; +import org.apache.thrift.TDeserializer; +import org.apache.thrift.TSerializer; +import org.springframework.stereotype.Component; + +@Component +public class TransactionInfoThriftConverter { + + @SneakyThrows + public byte[] serialize(TransactionInfo transactionInfo) { + return new TSerializer().serialize(transactionInfo); + } + + @SneakyThrows + public TransactionInfo deserialize(byte[] transactionInfo) { + var result = new TransactionInfo(); + new TDeserializer().deserialize(result, transactionInfo); + return result; + } +} diff --git a/src/main/java/dev/vality/disputes/provider/payments/service/ProviderPaymentsAdjustmentExtractor.java b/src/main/java/dev/vality/disputes/provider/payments/service/ProviderPaymentsAdjustmentExtractor.java index 9cc01006..7900b5dd 100644 --- a/src/main/java/dev/vality/disputes/provider/payments/service/ProviderPaymentsAdjustmentExtractor.java +++ b/src/main/java/dev/vality/disputes/provider/payments/service/ProviderPaymentsAdjustmentExtractor.java @@ -39,6 +39,13 @@ public boolean isCapturedAdjustmentByProviderPaymentsExist(InvoicePayment invoic providerCallback)); } + public boolean isTransactionInfoAdjustmentByProviderPaymentsExist(InvoicePayment invoicePayment, + ProviderCallback providerCallback) { + return getInvoicePaymentAdjustmentStream(invoicePayment) + .filter(adj -> isProviderPaymentsAdjustment(adj.getReason(), providerCallback)) + .anyMatch(adj -> adj.getState() != null && adj.getState().isSetTransactionInfo()); + } + private Stream getInvoicePaymentAdjustmentStream(InvoicePayment invoicePayment) { return Optional.ofNullable(invoicePayment.getAdjustments()) .orElse(List.of()) diff --git a/src/main/java/dev/vality/disputes/provider/payments/service/ProviderPaymentsService.java b/src/main/java/dev/vality/disputes/provider/payments/service/ProviderPaymentsService.java index a93ce753..9784275f 100644 --- a/src/main/java/dev/vality/disputes/provider/payments/service/ProviderPaymentsService.java +++ b/src/main/java/dev/vality/disputes/provider/payments/service/ProviderPaymentsService.java @@ -13,7 +13,9 @@ import dev.vality.disputes.provider.payments.client.ProviderPaymentsRemoteClient; import dev.vality.disputes.provider.payments.converter.ProviderPaymentsToInvoicePaymentCapturedAdjustmentParamsConverter; import dev.vality.disputes.provider.payments.converter.ProviderPaymentsToInvoicePaymentCashFlowAdjustmentParamsConverter; +import dev.vality.disputes.provider.payments.converter.ProviderPaymentsToInvoicePaymentTransactionInfoAdjustmentParamsConverter; import dev.vality.disputes.provider.payments.converter.TransactionContextConverter; +import dev.vality.disputes.provider.payments.converter.TransactionInfoThriftConverter; import dev.vality.disputes.provider.payments.dao.ProviderCallbackDao; import dev.vality.disputes.provider.payments.exception.ProviderCallbackAlreadyExistException; import dev.vality.disputes.provider.payments.exception.ProviderCallbackStatusWasUpdatedByAnotherThreadException; @@ -25,7 +27,6 @@ import dev.vality.disputes.service.external.InvoicingService; import dev.vality.disputes.util.ChangedAmountResolver; import dev.vality.disputes.util.PaymentStatusValidator; -import dev.vality.provider.payments.PaymentStatusResult; import dev.vality.provider.payments.ProviderPaymentsCallbackParams; import dev.vality.provider.payments.TransactionContext; import lombok.RequiredArgsConstructor; @@ -39,8 +40,7 @@ import java.util.Map; import java.util.Optional; -import static dev.vality.disputes.constant.ErrorMessage.INVOICE_NOT_FOUND; -import static dev.vality.disputes.constant.ErrorMessage.PAYMENT_NOT_FOUND; +import static dev.vality.disputes.constant.ErrorMessage.*; import static dev.vality.disputes.util.OptionsExtractor.extractProviderPaymentsCheckStatusDelaySec; import static dev.vality.disputes.util.ThreadFormatter.buildThreadName; @@ -56,6 +56,9 @@ public class ProviderPaymentsService { providerPaymentsToInvoicePaymentCapturedAdjustmentParamsConverter; private final ProviderPaymentsToInvoicePaymentCashFlowAdjustmentParamsConverter providerPaymentsToInvoicePaymentCashFlowAdjustmentParamsConverter; + private final ProviderPaymentsToInvoicePaymentTransactionInfoAdjustmentParamsConverter + providerPaymentsToInvoicePaymentTransactionInfoAdjustmentParamsConverter; + private final TransactionInfoThriftConverter transactionInfoThriftConverter; private final DisputeCurrencyConverter disputeCurrencyConverter; private final ProviderPaymentsAdjustmentExtractor providerPaymentsAdjustmentExtractor; private final ProviderDataService providerDataService; @@ -145,15 +148,22 @@ public void checkPaymentStatusAndCreateAdjustment(TransactionContext transaction checkProviderCallbackExist(transactionContext.getInvoiceId(), transactionContext.getPaymentId()); var paymentStatusResult = providerPaymentsRemoteClient.checkPaymentStatus(transactionContext, currency, providerData); + var providerCallback = new ProviderCallback(); + providerCallback.setInvoiceId(transactionContext.getInvoiceId()); + providerCallback.setPaymentId(transactionContext.getPaymentId()); + providerCallback.setAmount(amount); + providerCallback.setPaymentStatusSuccess(paymentStatusResult.isSuccess()); + paymentStatusResult.getTransactionInfo() + .map(transactionInfoThriftConverter::serialize) + .ifPresent(providerCallback::setTransactionInfo); if (paymentStatusResult.isSuccess()) { - var providerCallback = new ProviderCallback(); - providerCallback.setInvoiceId(transactionContext.getInvoiceId()); - providerCallback.setPaymentId(transactionContext.getPaymentId()); providerCallback.setChangedAmount( ChangedAmountResolver.fromPaymentStatusResult(amount, paymentStatusResult)); - providerCallback.setAmount(amount); log.info("Save providerCallback {}", providerCallback); providerCallbackDao.save(providerCallback); + } else if (providerCallback.getTransactionInfo() != null) { + log.info("Save unsuccessful providerCallback with transactionInfo {}", providerCallback); + providerCallbackDao.save(providerCallback); } else { throw new ProviderPaymentsUnexpectedPaymentStatus( "providerPaymentsService.checkPaymentStatusAndSave unsuccessful: Cant do createAdjustment"); @@ -183,6 +193,13 @@ public void callHgForCreateAdjustment(ProviderCallback providerCallback) { updateNextCheckAfter(providerCallback); return; } + if (createTransactionInfoAdjustment(providerCallback, invoicePayment)) { + return; + } + if (!providerCallback.getPaymentStatusSuccess()) { + finishFailed(providerCallback, PAYMENT_STATUS_NOT_SUCCESS); + return; + } if (statusAction == PaymentStatusValidator.StatusAction.FAILED) { finishFailed(providerCallback, PaymentStatusValidator.getTechnicalErrorMessage(invoicePayment)); return; @@ -281,6 +298,22 @@ private boolean createCashFlowAdjustment(ProviderCallback providerCallback, Invo } } + private boolean createTransactionInfoAdjustment(ProviderCallback providerCallback, InvoicePayment invoicePayment) { + if (providerCallback.getTransactionInfo() == null) { + return false; + } + if (!providerPaymentsAdjustmentExtractor.isTransactionInfoAdjustmentByProviderPaymentsExist( + invoicePayment, providerCallback)) { + var transactionInfoParams = + providerPaymentsToInvoicePaymentTransactionInfoAdjustmentParamsConverter.convert(providerCallback); + invoicingService.createPaymentAdjustment(providerCallback.getInvoiceId(), providerCallback.getPaymentId(), + transactionInfoParams); + return true; + } + log.info("Creating TransactionInfoAdjustment was skipped {}", providerCallback); + return false; + } + private void createCapturedAdjustment(ProviderCallback providerCallback, InvoicePayment invoicePayment) { if (!providerPaymentsAdjustmentExtractor.isCapturedAdjustmentByProviderPaymentsExist(invoicePayment, providerCallback)) { diff --git a/src/main/resources/db/migration/V16__add_transaction_info_to_provider_callback.sql b/src/main/resources/db/migration/V16__add_transaction_info_to_provider_callback.sql new file mode 100644 index 00000000..0c6e3e65 --- /dev/null +++ b/src/main/resources/db/migration/V16__add_transaction_info_to_provider_callback.sql @@ -0,0 +1,3 @@ +ALTER TABLE dspt.provider_callback + ADD COLUMN "transaction_info" BYTEA, + ADD COLUMN "payment_status_success" BOOLEAN NOT NULL DEFAULT TRUE; diff --git a/src/test/java/dev/vality/disputes/provider/payments/ProviderPaymentsServiceTest.java b/src/test/java/dev/vality/disputes/provider/payments/ProviderPaymentsServiceTest.java index 6d4a7ab7..c78c0c03 100644 --- a/src/test/java/dev/vality/disputes/provider/payments/ProviderPaymentsServiceTest.java +++ b/src/test/java/dev/vality/disputes/provider/payments/ProviderPaymentsServiceTest.java @@ -5,19 +5,29 @@ import dev.vality.damsel.domain.InvoicePaymentProcessed; import dev.vality.damsel.domain.InvoicePaymentRefunded; import dev.vality.damsel.domain.InvoicePaymentStatus; +import dev.vality.damsel.domain.TransactionInfo; +import dev.vality.damsel.payment_processing.InvoicePaymentAdjustmentParams; import dev.vality.disputes.config.AbstractMockitoConfig; import dev.vality.disputes.config.WireMockSpringBootITest; import dev.vality.disputes.domain.enums.DisputeStatus; import dev.vality.disputes.domain.enums.ProviderPaymentsStatus; +import dev.vality.provider.payments.PaymentStatusResult; import lombok.SneakyThrows; import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; import org.springframework.test.context.TestPropertySource; +import java.util.List; +import java.util.Map; + import static dev.vality.disputes.util.MockUtil.createInvoicePayment; +import static dev.vality.disputes.util.MockUtil.getTransactionInfoInvoicePaymentAdjustment; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.never; +import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -124,4 +134,61 @@ public void testSuccessWhenInvoicePaymentStatusIsCapturedWithChangedAmount() { assertEquals(DisputeStatus.succeeded, disputeDao.get(disputeId).getStatus()); verify(invoicingClient, never()).createPaymentAdjustment(any(), any(), any()); } + + @Test + @SneakyThrows + public void testCreateTransactionInfoAdjustment() { + var transactionInfo = new TransactionInfo("new-trx-id", Map.of("rrn", "123")); + var disputeId = pendingFlowHandler.handlePending( + new PaymentStatusResult(true).setTransactionInfo(transactionInfo)); + var dispute = disputeDao.get(disputeId); + var providerCallback = providerCallbackDao.get(dispute.getInvoiceId(), dispute.getPaymentId()); + assertNotNull(providerCallback.getTransactionInfo()); + var invoicePayment = createInvoicePayment(providerCallback.getPaymentId()); + when(invoicingClient.getPayment(any(), any())).thenReturn(invoicePayment); + + providerPaymentsService.callHgForCreateAdjustment(providerCallback); + + var reason = providerPaymentsAdjustmentExtractor.getReason(providerCallback); + invoicePayment.setAdjustments(List.of( + getTransactionInfoInvoicePaymentAdjustment("transaction-info-adjustment", reason, transactionInfo))); + providerPaymentsService.callHgForCreateAdjustment(providerCallback); + + var paramsCaptor = ArgumentCaptor.forClass(InvoicePaymentAdjustmentParams.class); + verify(invoicingClient, times(2)).createPaymentAdjustment(any(), any(), paramsCaptor.capture()); + var scenarios = paramsCaptor.getAllValues().stream() + .map(InvoicePaymentAdjustmentParams::getScenario) + .toList(); + assertTrue(scenarios.get(0).isSetTransactionInfo()); + assertEquals(transactionInfo, scenarios.get(0).getTransactionInfo().getTrx()); + assertTrue(scenarios.get(1).isSetStatusChange()); + assertEquals(ProviderPaymentsStatus.succeeded, + providerCallbackDao.get(dispute.getInvoiceId(), dispute.getPaymentId()).getStatus()); + } + + @Test + @SneakyThrows + public void testCreateTransactionInfoAdjustmentForUnsuccessfulPaymentStatus() { + var transactionInfo = new TransactionInfo("new-trx-id", Map.of("rrn", "123")); + var disputeId = pendingFlowHandler.handlePending( + new PaymentStatusResult(false).setTransactionInfo(transactionInfo)); + var dispute = disputeDao.get(disputeId); + var providerCallback = providerCallbackDao.get(dispute.getInvoiceId(), dispute.getPaymentId()); + assertNotNull(providerCallback.getTransactionInfo()); + var invoicePayment = createInvoicePayment(providerCallback.getPaymentId()); + when(invoicingClient.getPayment(any(), any())).thenReturn(invoicePayment); + + providerPaymentsService.callHgForCreateAdjustment(providerCallback); + + var reason = providerPaymentsAdjustmentExtractor.getReason(providerCallback); + invoicePayment.setAdjustments(List.of( + getTransactionInfoInvoicePaymentAdjustment("transaction-info-adjustment", reason, transactionInfo))); + providerPaymentsService.callHgForCreateAdjustment(providerCallback); + + var paramsCaptor = ArgumentCaptor.forClass(InvoicePaymentAdjustmentParams.class); + verify(invoicingClient).createPaymentAdjustment(any(), any(), paramsCaptor.capture()); + assertTrue(paramsCaptor.getValue().getScenario().isSetTransactionInfo()); + assertEquals(ProviderPaymentsStatus.failed, + providerCallbackDao.get(dispute.getInvoiceId(), dispute.getPaymentId()).getStatus()); + } } diff --git a/src/test/java/dev/vality/disputes/schedule/service/config/PendingFlowHandler.java b/src/test/java/dev/vality/disputes/schedule/service/config/PendingFlowHandler.java index 10debf31..93bef67d 100644 --- a/src/test/java/dev/vality/disputes/schedule/service/config/PendingFlowHandler.java +++ b/src/test/java/dev/vality/disputes/schedule/service/config/PendingFlowHandler.java @@ -34,12 +34,17 @@ public class PendingFlowHandler { @SneakyThrows public UUID handlePending() { + return handlePending(new PaymentStatusResult(true)); + } + + @SneakyThrows + public UUID handlePending(PaymentStatusResult paymentStatusResult) { var disputeId = createdFlowHandler.handleCreate(); var providerMock = mock(ProviderDisputesServiceSrv.Client.class); when(providerMock.checkDisputeStatus(any())).thenReturn(createDisputeStatusSuccessResult()); when(providerDisputesThriftInterfaceBuilder.buildWoodyClient(any())).thenReturn(providerMock); var providerPaymentMock = mock(ProviderPaymentsServiceSrv.Client.class); - when(providerPaymentMock.checkPaymentStatus(any(), any())).thenReturn(new PaymentStatusResult(true)); + when(providerPaymentMock.checkPaymentStatus(any(), any())).thenReturn(paymentStatusResult); when(providerPaymentsThriftInterfaceBuilder.buildWoodyClient(any())).thenReturn(providerPaymentMock); var dispute = disputeDao.get(disputeId); pendingDisputesService.callPendingDisputeRemotely(dispute); diff --git a/src/test/java/dev/vality/disputes/util/MockUtil.java b/src/test/java/dev/vality/disputes/util/MockUtil.java index b71a22ad..99197176 100644 --- a/src/test/java/dev/vality/disputes/util/MockUtil.java +++ b/src/test/java/dev/vality/disputes/util/MockUtil.java @@ -194,6 +194,18 @@ public static InvoicePaymentAdjustment getCashFlowInvoicePaymentAdjustment(Strin .setScenario(new InvoicePaymentAdjustmentCashFlow().setNewAmount(10L)))); } + public static InvoicePaymentAdjustment getTransactionInfoInvoicePaymentAdjustment( + String adjustmentId, + String reason, + TransactionInfo transactionInfo) { + return new InvoicePaymentAdjustment() + .setId(adjustmentId) + .setReason(reason) + .setState(InvoicePaymentAdjustmentState.transaction_info( + new InvoicePaymentAdjustmentTransactionInfoState() + .setScenario(new InvoicePaymentAdjustmentTransactionInfo(transactionInfo)))); + } + public static Failure createFailure() { Failure failure = new Failure("no_transfer"); failure.setReason("code = resp_status_error, description = Tek seferde en fazla 4,000.00 işem yapılabilir."); From 95b6c9fa86917d96cdc13502035f9c9b79369af0 Mon Sep 17 00:00:00 2001 From: Egor Cherniak Date: Fri, 10 Jul 2026 13:17:18 +0300 Subject: [PATCH 2/3] upd proto --- pom.xml | 2 +- .../provider/payments/service/ProviderPaymentsService.java | 2 +- .../provider/payments/ProviderPaymentsServiceTest.java | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 275ac2d8..23e5df5e 100644 --- a/pom.xml +++ b/pom.xml @@ -46,7 +46,7 @@ dev.vality disputes-proto - 1.57-3b5a8e6 + 1.58-419fe9c dev.vality diff --git a/src/main/java/dev/vality/disputes/provider/payments/service/ProviderPaymentsService.java b/src/main/java/dev/vality/disputes/provider/payments/service/ProviderPaymentsService.java index 9784275f..912f7d8c 100644 --- a/src/main/java/dev/vality/disputes/provider/payments/service/ProviderPaymentsService.java +++ b/src/main/java/dev/vality/disputes/provider/payments/service/ProviderPaymentsService.java @@ -153,7 +153,7 @@ public void checkPaymentStatusAndCreateAdjustment(TransactionContext transaction providerCallback.setPaymentId(transactionContext.getPaymentId()); providerCallback.setAmount(amount); providerCallback.setPaymentStatusSuccess(paymentStatusResult.isSuccess()); - paymentStatusResult.getTransactionInfo() + paymentStatusResult.getChangedTransactionInfo() .map(transactionInfoThriftConverter::serialize) .ifPresent(providerCallback::setTransactionInfo); if (paymentStatusResult.isSuccess()) { diff --git a/src/test/java/dev/vality/disputes/provider/payments/ProviderPaymentsServiceTest.java b/src/test/java/dev/vality/disputes/provider/payments/ProviderPaymentsServiceTest.java index c78c0c03..58b888b3 100644 --- a/src/test/java/dev/vality/disputes/provider/payments/ProviderPaymentsServiceTest.java +++ b/src/test/java/dev/vality/disputes/provider/payments/ProviderPaymentsServiceTest.java @@ -140,7 +140,7 @@ public void testSuccessWhenInvoicePaymentStatusIsCapturedWithChangedAmount() { public void testCreateTransactionInfoAdjustment() { var transactionInfo = new TransactionInfo("new-trx-id", Map.of("rrn", "123")); var disputeId = pendingFlowHandler.handlePending( - new PaymentStatusResult(true).setTransactionInfo(transactionInfo)); + new PaymentStatusResult(true).setChangedTransactionInfo(transactionInfo)); var dispute = disputeDao.get(disputeId); var providerCallback = providerCallbackDao.get(dispute.getInvoiceId(), dispute.getPaymentId()); assertNotNull(providerCallback.getTransactionInfo()); @@ -171,7 +171,7 @@ public void testCreateTransactionInfoAdjustment() { public void testCreateTransactionInfoAdjustmentForUnsuccessfulPaymentStatus() { var transactionInfo = new TransactionInfo("new-trx-id", Map.of("rrn", "123")); var disputeId = pendingFlowHandler.handlePending( - new PaymentStatusResult(false).setTransactionInfo(transactionInfo)); + new PaymentStatusResult(false).setChangedTransactionInfo(transactionInfo)); var dispute = disputeDao.get(disputeId); var providerCallback = providerCallbackDao.get(dispute.getInvoiceId(), dispute.getPaymentId()); assertNotNull(providerCallback.getTransactionInfo()); From 275d4fa6435acc741ac4b336f44cbd0e639f7a10 Mon Sep 17 00:00:00 2001 From: Egor Cherniak Date: Fri, 10 Jul 2026 15:59:25 +0300 Subject: [PATCH 3/3] rebase + feedback fix --- .../payments/service/ProviderPaymentsService.java | 8 ++++---- ...=> V17__add_transaction_info_to_provider_callback.sql} | 0 2 files changed, 4 insertions(+), 4 deletions(-) rename src/main/resources/db/migration/{V16__add_transaction_info_to_provider_callback.sql => V17__add_transaction_info_to_provider_callback.sql} (100%) diff --git a/src/main/java/dev/vality/disputes/provider/payments/service/ProviderPaymentsService.java b/src/main/java/dev/vality/disputes/provider/payments/service/ProviderPaymentsService.java index 912f7d8c..c257e5ca 100644 --- a/src/main/java/dev/vality/disputes/provider/payments/service/ProviderPaymentsService.java +++ b/src/main/java/dev/vality/disputes/provider/payments/service/ProviderPaymentsService.java @@ -196,14 +196,14 @@ public void callHgForCreateAdjustment(ProviderCallback providerCallback) { if (createTransactionInfoAdjustment(providerCallback, invoicePayment)) { return; } - if (!providerCallback.getPaymentStatusSuccess()) { - finishFailed(providerCallback, PAYMENT_STATUS_NOT_SUCCESS); - return; - } if (statusAction == PaymentStatusValidator.StatusAction.FAILED) { finishFailed(providerCallback, PaymentStatusValidator.getTechnicalErrorMessage(invoicePayment)); return; } + if (!providerCallback.getPaymentStatusSuccess()) { + finishFailed(providerCallback, PAYMENT_STATUS_NOT_SUCCESS); + return; + } if (statusAction == PaymentStatusValidator.StatusAction.CAPTURED) { var changedAmount = ChangedAmountResolver.fromInvoicePayment(invoicePayment.getPayment()); if (changedAmount != null) { diff --git a/src/main/resources/db/migration/V16__add_transaction_info_to_provider_callback.sql b/src/main/resources/db/migration/V17__add_transaction_info_to_provider_callback.sql similarity index 100% rename from src/main/resources/db/migration/V16__add_transaction_info_to_provider_callback.sql rename to src/main/resources/db/migration/V17__add_transaction_info_to_provider_callback.sql