@PUT @Consumes(APPLICATION_JSON) @Produces(APPLICATION_JSON) @Path("/payments/{paymentId:" + UUID_PATTERN + "}/transactions/{paymentTransactionId:" + UUID_PATTERN + "}") @ApiOperation(value = "Update existing paymentTransaction and associated payment state") @ApiResponses(value = {@ApiResponse(code = 204, message = "Successful operation"), @ApiResponse(code = 400, message = "Invalid account data supplied")}) public Response updatePaymentTransactionState(@PathParam("paymentId") final UUID paymentId, @PathParam("paymentTransactionId") final UUID paymentTransactionId, final AdminPaymentJson json, @HeaderParam(HDR_CREATED_BY) final String createdBy, @HeaderParam(HDR_REASON) final String reason, @HeaderParam(HDR_COMMENT) final String comment, @javax.ws.rs.core.Context final HttpServletRequest request) throws PaymentApiException { final CallContext callContext = context.createCallContextNoAccountId(createdBy, reason, comment, request); final Payment payment = paymentApi.getPayment(paymentId, false, false, ImmutableList.<PluginProperty>of(), callContext); final PaymentTransaction paymentTransaction = Iterables.tryFind(payment.getTransactions(), new Predicate<PaymentTransaction>() { @Override public boolean apply(final PaymentTransaction input) { return input.getId().equals(paymentTransactionId); } }).orNull(); adminPaymentApi.fixPaymentTransactionState(payment, paymentTransaction, TransactionStatus.valueOf(json.getTransactionStatus()), json.getLastSuccessPaymentState(), json.getCurrentPaymentStateName(), ImmutableList.<PluginProperty>of(), callContext); return Response.status(Status.NO_CONTENT).build(); }
paymentPluginStatus); osgiKillbillAPI.getAdminPaymentApi().fixPaymentTransactionState(payment, updatedPaymentTransaction, transactionStatus, lastSuccessfulPaymentStateName, currentPaymentStateName, ImmutableList.<PluginProperty>of(), context); final Payment fixedPayment = osgiKillbillAPI.getPaymentApi().getPayment(payment.getId(), true, false, ImmutableList.<PluginProperty>of(), context); return filterForTransaction(fixedPayment, updatedPaymentTransaction.getId());
return null; }).when(adminPaymentApi).fixPaymentTransactionState(Mockito.<Payment>any(), Mockito.<PaymentTransaction>any(), Mockito.<TransactionStatus>any(),
@Test(groups = "slow", description = "https://github.com/killbill/killbill/issues/551") public void testFixPaymentTransactionStateNoPaymentTransactionInfoPlugin() throws PaymentApiException { final Payment payment = paymentApi.createAuthorization(account, account.getPaymentMethodId(), null, BigDecimal.TEN, Currency.EUR, null, UUID.randomUUID().toString(), UUID.randomUUID().toString(), ImmutableList.<PluginProperty>of(), callContext); final PaymentModelDao paymentModelDao = paymentDao.getPayment(payment.getId(), internalCallContext); final PaymentTransactionModelDao paymentTransactionModelDao = paymentDao.getPaymentTransaction(payment.getTransactions().get(0).getId(), internalCallContext); Assert.assertEquals(paymentModelDao.getStateName(), "AUTH_SUCCESS"); Assert.assertEquals(paymentModelDao.getLastSuccessStateName(), "AUTH_SUCCESS"); Assert.assertEquals(paymentTransactionModelDao.getTransactionStatus(), TransactionStatus.SUCCESS); Assert.assertEquals(paymentTransactionModelDao.getProcessedAmount().compareTo(BigDecimal.TEN), 0); Assert.assertEquals(paymentTransactionModelDao.getProcessedCurrency(), Currency.EUR); Assert.assertEquals(paymentTransactionModelDao.getGatewayErrorCode(), ""); Assert.assertEquals(paymentTransactionModelDao.getGatewayErrorMsg(), ""); try { // Since no transaction status is passed, PaymentTransactionInfoPlugin should be set adminPaymentApi.fixPaymentTransactionState(payment, Mockito.mock(DefaultPaymentTransaction.class), null, null, "AUTH_ERRORED", ImmutableList.<PluginProperty>of(), callContext); } catch (final PaymentApiException e) { Assert.assertEquals(e.getCode(), ErrorCode.PAYMENT_INVALID_PARAMETER.getCode()); } }
adminPaymentApi.fixPaymentTransactionState(payments.get(0), payments.get(0).getTransactions().get(0), TransactionStatus.PAYMENT_FAILURE, null, null, ImmutableList.<PluginProperty>of(), callContext); assertListenerStatus();
Assert.assertEquals(paymentTransactionModelDao2.getTransactionStatus(), TransactionStatus.SUCCESS); adminPaymentApi.fixPaymentTransactionState(refund, refund.getTransactions().get(1), TransactionStatus.PAYMENT_FAILURE,
Mockito.when(updatedPaymentTransaction.getProcessedCurrency()).thenReturn(existingPaymentTransaction.getCurrency()); busHandler.pushExpectedEvents(NextEvent.PAYMENT, NextEvent.INVOICE_PAYMENT, NextEvent.BLOCK); adminPaymentApi.fixPaymentTransactionState(payments.get(0), updatedPaymentTransaction, TransactionStatus.SUCCESS, null, null, ImmutableList.<PluginProperty>of(), callContext); assertListenerStatus();
Mockito.when(updatedPaymentTransaction.getProcessedCurrency()).thenReturn(existingPaymentTransaction.getCurrency()); busHandler.pushExpectedEvents(NextEvent.PAYMENT, NextEvent.INVOICE_PAYMENT, NextEvent.BLOCK); adminPaymentApi.fixPaymentTransactionState(payments.get(0), updatedPaymentTransaction, TransactionStatus.SUCCESS, null, null, ImmutableList.<PluginProperty>of(), callContext); assertListenerStatus();
Assert.assertEquals(paymentTransactionModelDao.getGatewayErrorMsg(), ""); adminPaymentApi.fixPaymentTransactionState(payment, payment.getTransactions().get(0), TransactionStatus.PAYMENT_FAILURE, null, "AUTH_ERRORED", ImmutableList.<PluginProperty>of(), callContext);
Assert.assertEquals(paymentTransactionModelDao2.getTransactionStatus(), TransactionStatus.PAYMENT_FAILURE); adminPaymentApi.fixPaymentTransactionState(refund, refund.getTransactions().get(1), TransactionStatus.SUCCESS,
infoPlugin.getGatewayError(), infoPlugin); adminPaymentApi.fixPaymentTransactionState(payment, newPaymentTransaction, null, null, "AUTH_ERRORED", ImmutableList.<PluginProperty>of(), callContext);