diff --git a/build.sbt b/build.sbt index eb89be6..7603489 100644 --- a/build.sbt +++ b/build.sbt @@ -31,7 +31,7 @@ ThisBuild / organization := "app.softnetwork" name := "payment" -ThisBuild / version := "0.1.4" +ThisBuild / version := "0.1.5" ThisBuild / scalaVersion := "2.12.15" diff --git a/common/src/main/protobuf/api/payment.proto b/common/src/main/protobuf/api/payment.proto index 82edf04..d25ac18 100644 --- a/common/src/main/protobuf/api/payment.proto +++ b/common/src/main/protobuf/api/payment.proto @@ -38,9 +38,18 @@ message PayInWithCardPreAuthorizedRequest { string creditedAccount = 2; } +enum TransactionStatus{ + TRANSACTION_CREATED = 0; + TRANSACTION_SUCCEEDED = 1; + TRANSACTION_FAILED = 2; + TRANSACTION_NOT_SPECIFIED = 4; + TRANSACTION_FAILED_FOR_TECHNICAL_REASON = 5; +} + message TransactionResponse { google.protobuf.StringValue transactionId = 1; - google.protobuf.StringValue error = 2; + TransactionStatus transactionStatus = 2; + google.protobuf.StringValue error = 3; } message CancelPreAuthorizationRequest { @@ -81,9 +90,10 @@ message TransferRequest { } message TransferResponse { - google.protobuf.StringValue transferedTransactionId = 1; - google.protobuf.StringValue paidOutTransactionId = 2; - google.protobuf.StringValue error = 3; + google.protobuf.StringValue transferredTransactionId = 1; + TransactionStatus transferredTransactionStatus = 2; + google.protobuf.StringValue paidOutTransactionId = 3; + google.protobuf.StringValue error = 4; } message DirectDebitRequest { diff --git a/common/src/main/scala/app/softnetwork/payment/message/PaymentMessages.scala b/common/src/main/scala/app/softnetwork/payment/message/PaymentMessages.scala index c324b41..2a59c4d 100644 --- a/common/src/main/scala/app/softnetwork/payment/message/PaymentMessages.scala +++ b/common/src/main/scala/app/softnetwork/payment/message/PaymentMessages.scala @@ -581,18 +581,23 @@ object PaymentMessages { trait PaidInResult extends PaymentResult - case class PaidIn(transactionId: String) extends PaidInResult + case class PaidIn(transactionId: String, transactionStatus: Transaction.TransactionStatus) + extends PaidInResult - case class PaidOut(transactionId: String) extends PaymentResult + case class PaidOut(transactionId: String, transactionStatus: Transaction.TransactionStatus) + extends PaymentResult - case class Refunded(transactionId: String) extends PaymentResult + case class Refunded(transactionId: String, transactionStatus: Transaction.TransactionStatus) + extends PaymentResult - case class Transfered( - transferedTransactionId: String, + case class Transferred( + transferredTransactionId: String, + transferredTransactionStatus: Transaction.TransactionStatus, paidOutTransactionId: Option[String] = None ) extends PaymentResult - case class DirectDebited(transactionId: String) extends PaymentResult + case class DirectDebited(transactionId: String, transactionStatus: Transaction.TransactionStatus) + extends PaymentResult case class PaymentRedirection(redirectUrl: String) extends PaidInResult @@ -605,9 +610,15 @@ object PaymentMessages { case class RecurringPaymentLoaded(recurringPayment: RecurringPayment) extends PaymentResult - case class FirstRecurringPaidIn(transactionId: String) extends PaidInResult + case class FirstRecurringPaidIn( + transactionId: String, + transactionStatus: Transaction.TransactionStatus + ) extends PaidInResult - case class NextRecurringPaid(transactionId: String) extends PaidInResult + case class NextRecurringPaid( + transactionId: String, + transactionStatus: Transaction.TransactionStatus + ) extends PaidInResult case class PreAuthorizationCanceled(preAuthorizationCanceled: Boolean) extends PaymentResult @@ -674,15 +685,35 @@ object PaymentMessages { case class CardPreAuthorizationFailed(resultMessage: String) extends PaymentError(resultMessage) - case class PayInFailed(resultMessage: String) extends PaymentError(resultMessage) + case class PayInFailed( + transactionId: String, + transactionStatus: Transaction.TransactionStatus, + resultMessage: String + ) extends PaymentError(resultMessage) - case class PayOutFailed(resultMessage: String) extends PaymentError(resultMessage) + case class PayOutFailed( + transactionId: String, + transactionStatus: Transaction.TransactionStatus, + resultMessage: String + ) extends PaymentError(resultMessage) - case class RefundFailed(resultMessage: String) extends PaymentError(resultMessage) + case class RefundFailed( + transactionId: String, + transactionStatus: Transaction.TransactionStatus, + resultMessage: String + ) extends PaymentError(resultMessage) - case class TransferFailed(resultMessage: String) extends PaymentError(resultMessage) + case class TransferFailed( + transferredTransactionId: String, + transferredTransactionStatus: Transaction.TransactionStatus, + resultMessage: String + ) extends PaymentError(resultMessage) - case class DirectDebitFailed(resultMessage: String) extends PaymentError(resultMessage) + case class DirectDebitFailed( + transactionId: String, + transactionStatus: Transaction.TransactionStatus, + resultMessage: String + ) extends PaymentError(resultMessage) case object PaymentAccountNotFound extends PaymentError("PaymentAccountNotFound") @@ -770,11 +801,17 @@ object PaymentMessages { case object RecurringCardPaymentRegistrationNotUpdated extends PaymentError("RecurringCardPaymentRegistrationNotUpdated") - case class FirstRecurringCardPaymentFailed(reason: String) - extends PaymentError(s"FirstRecurringPaymentFailed: $reason") + case class FirstRecurringCardPaymentFailed( + transactionId: String, + transactionStatus: Transaction.TransactionStatus, + reason: String + ) extends PaymentError(s"FirstRecurringPaymentFailed: $reason") - case class NextRecurringPaymentFailed(reason: String) - extends PaymentError(s"NextRecurringPaymentFailed: $reason") + case class NextRecurringPaymentFailed( + transactionId: String, + transactionStatus: Transaction.TransactionStatus, + reason: String + ) extends PaymentError(s"NextRecurringPaymentFailed: $reason") case object Schedule4PaymentNotTriggered extends PaymentError("Schedule4PaymentNotTriggered") } diff --git a/common/src/main/scala/app/softnetwork/payment/serialization/package.scala b/common/src/main/scala/app/softnetwork/payment/serialization/package.scala index d462ecf..851cab8 100644 --- a/common/src/main/scala/app/softnetwork/payment/serialization/package.scala +++ b/common/src/main/scala/app/softnetwork/payment/serialization/package.scala @@ -1,12 +1,10 @@ package app.softnetwork.payment import app.softnetwork.payment.model._ - import app.softnetwork.protobuf.ScalaPBSerializers import ScalaPBSerializers.GeneratedEnumSerializer - +import app.softnetwork.payment.api.TransactionStatus import org.json4s.Formats - import app.softnetwork.serialization._ import scala.language.implicitConversions @@ -33,4 +31,37 @@ package object serialization { GeneratedEnumSerializer(RecurringPayment.RecurringCardPaymentStatus.enumCompanion) ) + implicit def transactionStatusToTransactionResponseStatus( + transactionStatus: Transaction.TransactionStatus + ): TransactionStatus = { + transactionStatus match { + case Transaction.TransactionStatus.TRANSACTION_CREATED => + TransactionStatus.TRANSACTION_CREATED + case Transaction.TransactionStatus.TRANSACTION_SUCCEEDED => + TransactionStatus.TRANSACTION_SUCCEEDED + case Transaction.TransactionStatus.TRANSACTION_FAILED => + TransactionStatus.TRANSACTION_FAILED + case Transaction.TransactionStatus.TRANSACTION_NOT_SPECIFIED => + TransactionStatus.TRANSACTION_NOT_SPECIFIED + case Transaction.TransactionStatus.TRANSACTION_FAILED_FOR_TECHNICAL_REASON => + TransactionStatus.TRANSACTION_FAILED_FOR_TECHNICAL_REASON + } + } + + implicit def transactionResponseStatusToTransactionStatus( + transactionResponseStatus: TransactionStatus + ): Transaction.TransactionStatus = { + transactionResponseStatus match { + case TransactionStatus.TRANSACTION_CREATED => + Transaction.TransactionStatus.TRANSACTION_CREATED + case TransactionStatus.TRANSACTION_SUCCEEDED => + Transaction.TransactionStatus.TRANSACTION_SUCCEEDED + case TransactionStatus.TRANSACTION_FAILED => + Transaction.TransactionStatus.TRANSACTION_FAILED + case TransactionStatus.TRANSACTION_NOT_SPECIFIED => + Transaction.TransactionStatus.TRANSACTION_NOT_SPECIFIED + case TransactionStatus.TRANSACTION_FAILED_FOR_TECHNICAL_REASON => + Transaction.TransactionStatus.TRANSACTION_FAILED_FOR_TECHNICAL_REASON + } + } } diff --git a/core/src/main/scala/app/softnetwork/payment/api/PaymentServer.scala b/core/src/main/scala/app/softnetwork/payment/api/PaymentServer.scala index f285ef6..b8bbbba 100644 --- a/core/src/main/scala/app/softnetwork/payment/api/PaymentServer.scala +++ b/core/src/main/scala/app/softnetwork/payment/api/PaymentServer.scala @@ -7,13 +7,16 @@ import app.softnetwork.payment.message.PaymentMessages.{ CancelPreAuthorization, CreateOrUpdatePaymentAccount, DirectDebit, + DirectDebitFailed, DirectDebited, LoadDirectDebitTransaction, MandateCanceled, PaidIn, PaidOut, + PayInFailed, PayInWithCardPreAuthorized, PayOut, + PayOutFailed, PaymentAccountCreated, PaymentAccountUpdated, PaymentCommand, @@ -21,12 +24,15 @@ import app.softnetwork.payment.message.PaymentMessages.{ PreAuthorizationCanceled, RecurringPaymentRegistered, Refund, + RefundFailed, Refunded, RegisterRecurringPayment, Transfer, - Transfered + TransferFailed, + Transferred } import app.softnetwork.payment.model.RecurringPayment +import app.softnetwork.payment.serialization._ import app.softnetwork.persistence.typed.CommandTypeKey import scala.concurrent.{ExecutionContextExecutor, Future} @@ -57,9 +63,27 @@ trait PaymentServer extends PaymentServiceApi with GenericPaymentHandler { ): Future[TransactionResponse] = { import in._ !?(PayInWithCardPreAuthorized(preAuthorizationId, creditedAccount)) map { - case r: PaidIn => TransactionResponse(transactionId = Some(r.transactionId)) - case e: PaymentError => TransactionResponse(error = Some(e.message)) - case _ => TransactionResponse(error = Some("unknown")) + case r: PaidIn => + TransactionResponse( + transactionId = Some(r.transactionId), + transactionStatus = r.transactionStatus + ) + case f: PayInFailed => + TransactionResponse( + transactionId = Some(f.transactionId), + transactionStatus = f.transactionStatus, + error = Some(f.message) + ) + case e: PaymentError => + TransactionResponse( + transactionStatus = TransactionStatus.TRANSACTION_NOT_SPECIFIED, + error = Some(e.message) + ) + case _ => + TransactionResponse( + transactionStatus = TransactionStatus.TRANSACTION_NOT_SPECIFIED, + error = Some("unknown") + ) } } @@ -86,18 +110,54 @@ trait PaymentServer extends PaymentServiceApi with GenericPaymentHandler { initializedByClient ) ) map { - case r: Refunded => TransactionResponse(transactionId = Some(r.transactionId)) - case e: PaymentError => TransactionResponse(error = Some(e.message)) - case _ => TransactionResponse(error = Some("unknown")) + case r: Refunded => + TransactionResponse( + transactionId = Some(r.transactionId), + transactionStatus = r.transactionStatus + ) + case f: RefundFailed => + TransactionResponse( + transactionId = Some(f.transactionId), + transactionStatus = f.transactionStatus, + error = Some(f.message) + ) + case e: PaymentError => + TransactionResponse( + transactionStatus = TransactionStatus.TRANSACTION_NOT_SPECIFIED, + error = Some(e.message) + ) + case _ => + TransactionResponse( + transactionStatus = TransactionStatus.TRANSACTION_NOT_SPECIFIED, + error = Some("unknown") + ) } } override def payOut(in: PayOutRequest): Future[TransactionResponse] = { import in._ !?(PayOut(orderUuid, creditedAccount, creditedAmount, feesAmount, currency)) map { - case r: PaidOut => TransactionResponse(transactionId = Some(r.transactionId)) - case e: PaymentError => TransactionResponse(error = Some(e.message)) - case _ => TransactionResponse(error = Some("unknown")) + case r: PaidOut => + TransactionResponse( + transactionId = Some(r.transactionId), + transactionStatus = r.transactionStatus + ) + case f: PayOutFailed => + TransactionResponse( + transactionId = Some(f.transactionId), + transactionStatus = f.transactionStatus, + error = Some(f.message) + ) + case e: PaymentError => + TransactionResponse( + transactionStatus = TransactionStatus.TRANSACTION_NOT_SPECIFIED, + error = Some(e.message) + ) + case _ => + TransactionResponse( + transactionStatus = TransactionStatus.TRANSACTION_NOT_SPECIFIED, + error = Some("unknown") + ) } } @@ -115,9 +175,28 @@ trait PaymentServer extends PaymentServiceApi with GenericPaymentHandler { externalReference ) ) map { - case r: Transfered => - TransferResponse(Some(r.transferedTransactionId), r.paidOutTransactionId) - case _ => TransferResponse() + case r: Transferred => + TransferResponse( + Some(r.transferredTransactionId), + r.transferredTransactionStatus, + r.paidOutTransactionId + ) + case f: TransferFailed => + TransferResponse( + Some(f.transferredTransactionId), + f.transferredTransactionStatus, + error = Some(f.message) + ) + case e: PaymentError => + TransferResponse( + transferredTransactionStatus = TransactionStatus.TRANSACTION_NOT_SPECIFIED, + error = Some(e.message) + ) + case _ => + TransferResponse( + transferredTransactionStatus = TransactionStatus.TRANSACTION_NOT_SPECIFIED, + error = Some("unknown") + ) } } @@ -133,9 +212,27 @@ trait PaymentServer extends PaymentServiceApi with GenericPaymentHandler { externalReference ) ) map { - case r: DirectDebited => TransactionResponse(transactionId = Some(r.transactionId)) - case e: PaymentError => TransactionResponse(error = Some(e.message)) - case _ => TransactionResponse(error = Some("unknown")) + case r: DirectDebited => + TransactionResponse( + transactionId = Some(r.transactionId), + transactionStatus = r.transactionStatus + ) + case f: DirectDebitFailed => + TransactionResponse( + transactionId = Some(f.transactionId), + transactionStatus = f.transactionStatus, + error = Some(f.message) + ) + case e: PaymentError => + TransactionResponse( + transactionStatus = TransactionStatus.TRANSACTION_NOT_SPECIFIED, + error = Some(e.message) + ) + case _ => + TransactionResponse( + transactionStatus = TransactionStatus.TRANSACTION_NOT_SPECIFIED, + error = Some("unknown") + ) } } @@ -144,9 +241,27 @@ trait PaymentServer extends PaymentServiceApi with GenericPaymentHandler { ): Future[TransactionResponse] = { import in._ !?(LoadDirectDebitTransaction(directDebitTransactionId)) map { - case r: DirectDebited => TransactionResponse(transactionId = Some(r.transactionId)) - case e: PaymentError => TransactionResponse(error = Some(e.message)) - case _ => TransactionResponse(error = Some("unknown")) + case r: DirectDebited => + TransactionResponse( + transactionId = Some(r.transactionId), + transactionStatus = r.transactionStatus + ) + case f: DirectDebitFailed => + TransactionResponse( + transactionId = Some(f.transactionId), + transactionStatus = f.transactionStatus, + error = Some(f.message) + ) + case e: PaymentError => + TransactionResponse( + transactionStatus = TransactionStatus.TRANSACTION_NOT_SPECIFIED, + error = Some(e.message) + ) + case _ => + TransactionResponse( + transactionStatus = TransactionStatus.TRANSACTION_NOT_SPECIFIED, + error = Some("unknown") + ) } } diff --git a/core/src/main/scala/app/softnetwork/payment/handlers/GenericPaymentHandler.scala b/core/src/main/scala/app/softnetwork/payment/handlers/GenericPaymentHandler.scala index d9b9ee4..a93ae12 100644 --- a/core/src/main/scala/app/softnetwork/payment/handlers/GenericPaymentHandler.scala +++ b/core/src/main/scala/app/softnetwork/payment/handlers/GenericPaymentHandler.scala @@ -104,7 +104,8 @@ trait GenericPaymentDao { _: GenericPaymentHandler => case result: PaymentRedirection => Right(Left(result)) case result: PaidIn => Right(Right(result)) case error: PayInFailed => Left(error) - case _ => Left(PayInFailed("unknown")) + case _ => + Left(PayInFailed("", Transaction.TransactionStatus.TRANSACTION_NOT_SPECIFIED, "unknown")) } } @@ -149,7 +150,8 @@ trait GenericPaymentDao { _: GenericPaymentHandler => !?(PayInWithCardPreAuthorized(preAuthorizationId, creditedAccount)) map { case result: PaidIn => Right(result) case error: PayInFailed => Left(error) - case _ => Left(PayInFailed("unknown")) + case _ => + Left(PayInFailed("", Transaction.TransactionStatus.TRANSACTION_NOT_SPECIFIED, "unknown")) } } @@ -174,7 +176,8 @@ trait GenericPaymentDao { _: GenericPaymentHandler => ) map { case result: Refunded => Right(result) case error: RefundFailed => Left(error) - case _ => Left(RefundFailed("unknown")) + case _ => + Left(RefundFailed("", Transaction.TransactionStatus.TRANSACTION_NOT_SPECIFIED, "unknown")) } } @@ -185,7 +188,8 @@ trait GenericPaymentDao { _: GenericPaymentHandler => !?(PayOut(orderUuid, creditedAccount, creditedAmount, feesAmount)) map { case result: PaidOut => Right(result) case error: PayOutFailed => Left(error) - case _ => Left(PayOutFailed("unknown")) + case _ => + Left(PayOutFailed("", Transaction.TransactionStatus.TRANSACTION_NOT_SPECIFIED, "unknown")) } } @@ -196,7 +200,7 @@ trait GenericPaymentDao { _: GenericPaymentHandler => debitedAmount: Int, feesAmount: Int = 0, payOutRequired: Boolean = true - )(implicit system: ActorSystem[_]): Future[Either[TransferFailed, Transfered]] = { + )(implicit system: ActorSystem[_]): Future[Either[TransferFailed, Transferred]] = { implicit val ec: ExecutionContextExecutor = system.executionContext !?( Transfer( @@ -208,9 +212,10 @@ trait GenericPaymentDao { _: GenericPaymentHandler => payOutRequired ) ) map { - case result: Transfered => Right(result) + case result: Transferred => Right(result) case error: TransferFailed => Left(error) - case _ => Left(TransferFailed("unknown")) + case _ => + Left(TransferFailed("", Transaction.TransactionStatus.TRANSACTION_NOT_SPECIFIED, "unknown")) } } } diff --git a/core/src/main/scala/app/softnetwork/payment/persistence/query/GenericPaymentCommandProcessorStream.scala b/core/src/main/scala/app/softnetwork/payment/persistence/query/GenericPaymentCommandProcessorStream.scala index 12d6b86..a92fb1f 100644 --- a/core/src/main/scala/app/softnetwork/payment/persistence/query/GenericPaymentCommandProcessorStream.scala +++ b/core/src/main/scala/app/softnetwork/payment/persistence/query/GenericPaymentCommandProcessorStream.scala @@ -113,7 +113,7 @@ trait GenericPaymentCommandProcessorStream extends EventProcessorStream[PaymentC externalReference ) !?(command) map { - case _: Transfered => + case _: Transferred => if (forTests) system.eventStream.tell(Publish(event)) Done case other => diff --git a/core/src/main/scala/app/softnetwork/payment/persistence/typed/GenericPaymentBehavior.scala b/core/src/main/scala/app/softnetwork/payment/persistence/typed/GenericPaymentBehavior.scala index b414548..b9540fa 100644 --- a/core/src/main/scala/app/softnetwork/payment/persistence/typed/GenericPaymentBehavior.scala +++ b/core/src/main/scala/app/softnetwork/payment/persistence/typed/GenericPaymentBehavior.scala @@ -446,7 +446,14 @@ trait GenericPaymentBehavior registerCard = false, transaction ) - case _ => Effect.none.thenRun(_ => PayInFailed("unknown") ~> replyTo) + case _ => + Effect.none.thenRun(_ => + PayInFailed( + "", + Transaction.TransactionStatus.TRANSACTION_NOT_SPECIFIED, + "unknown" + ) ~> replyTo + ) } case _ => Effect.none.thenRun(_ => PaymentAccountNotFound ~> replyTo) } @@ -512,11 +519,21 @@ trait GenericPaymentBehavior transaction ) case _ => - Effect.none.thenRun(_ => PayInFailed("unknown") ~> replyTo) + Effect.none.thenRun(_ => + PayInFailed( + "", + Transaction.TransactionStatus.TRANSACTION_NOT_SPECIFIED, + "unknown" + ) ~> replyTo + ) } case _ => Effect.none.thenRun(_ => - PayInFailed("no credited wallet") ~> replyTo + PayInFailed( + "", + Transaction.TransactionStatus.TRANSACTION_NOT_SPECIFIED, + "no credited wallet" + ) ~> replyTo ) } case _ => Effect.none.thenRun(_ => PaymentAccountNotFound ~> replyTo) @@ -524,7 +541,14 @@ trait GenericPaymentBehavior case Failure(_) => Effect.none.thenRun(_ => PaymentAccountNotFound ~> replyTo) } - case _ => Effect.none.thenRun(_ => PayInFailed("no card") ~> replyTo) + case _ => + Effect.none.thenRun(_ => + PayInFailed( + "", + Transaction.TransactionStatus.TRANSACTION_NOT_SPECIFIED, + "no card" + ) ~> replyTo + ) } case _ => Effect.none.thenRun(_ => PaymentAccountNotFound ~> replyTo) } @@ -543,7 +567,13 @@ trait GenericPaymentBehavior .withPaymentType(paymentType) ) ) - .thenRun(_ => PayInFailed(s"$paymentType not supported") ~> replyTo) + .thenRun(_ => + PayInFailed( + "", + Transaction.TransactionStatus.TRANSACTION_NOT_SPECIFIED, + s"$paymentType not supported" + ) ~> replyTo + ) } case _ => Effect.none.thenRun(_ => PaymentAccountNotFound ~> replyTo) } @@ -620,7 +650,13 @@ trait GenericPaymentBehavior .withTransaction(transaction) ) :+ upsertedEvent ) - .thenRun(_ => RefundFailed(transaction.resultMessage) ~> replyTo) + .thenRun(_ => + RefundFailed( + "", + Transaction.TransactionStatus.TRANSACTION_NOT_SPECIFIED, + transaction.resultMessage + ) ~> replyTo + ) case _ => if ( transaction.status.isTransactionSucceeded || transaction.status.isTransactionCreated @@ -648,7 +684,7 @@ trait GenericPaymentBehavior .withPaymentType(transaction.paymentType) ) :+ upsertedEvent ) - .thenRun(_ => Refunded(transaction.id) ~> replyTo) + .thenRun(_ => Refunded(transaction.id, transaction.status) ~> replyTo) } else { log.info( "Order-{} could not be refunded: {} -> {}", @@ -665,7 +701,13 @@ trait GenericPaymentBehavior .withTransaction(transaction) ) :+ upsertedEvent ) - .thenRun(_ => RefundFailed(transaction.resultMessage) ~> replyTo) + .thenRun(_ => + RefundFailed( + transaction.id, + transaction.status, + transaction.resultMessage + ) ~> replyTo + ) } } case _ => @@ -682,7 +724,11 @@ trait GenericPaymentBehavior ) ) .thenRun(_ => - RefundFailed("no transaction returned by provider") ~> replyTo + RefundFailed( + "", + Transaction.TransactionStatus.TRANSACTION_NOT_SPECIFIED, + "no transaction returned by provider" + ) ~> replyTo ) } } @@ -742,7 +788,13 @@ trait GenericPaymentBehavior .withDocument(updatedPaymentAccount) .withLastUpdated(lastUpdated) ) - .thenRun(_ => PayOutFailed(transaction.resultMessage) ~> replyTo) + .thenRun(_ => + PayOutFailed( + transaction.id, + transaction.status, + transaction.resultMessage + ) ~> replyTo + ) } else if ( transaction.status.isTransactionSucceeded || transaction.status.isTransactionCreated ) { @@ -769,7 +821,9 @@ trait GenericPaymentBehavior .withDocument(updatedPaymentAccount) .withLastUpdated(lastUpdated) ) - .thenRun(_ => PaidOut(transaction.id) ~> replyTo) + .thenRun(_ => + PaidOut(transaction.id, transaction.status) ~> replyTo + ) } else { log.error( "Order-{} could not be paid out : {} -> {}", @@ -789,7 +843,13 @@ trait GenericPaymentBehavior .withDocument(updatedPaymentAccount) .withLastUpdated(lastUpdated) ) - .thenRun(_ => PayOutFailed(transaction.resultMessage) ~> replyTo) + .thenRun(_ => + PayOutFailed( + transaction.id, + transaction.status, + transaction.resultMessage + ) ~> replyTo + ) } case _ => log.error( @@ -805,15 +865,39 @@ trait GenericPaymentBehavior ) ) .thenRun(_ => - PayOutFailed("no transaction returned by provider") ~> replyTo + PayOutFailed( + "", + Transaction.TransactionStatus.TRANSACTION_NOT_SPECIFIED, + "no transaction returned by provider" + ) ~> replyTo ) } - case _ => Effect.none.thenRun(_ => PayOutFailed("no bank account") ~> replyTo) + case _ => + Effect.none.thenRun(_ => + PayOutFailed( + "", + Transaction.TransactionStatus.TRANSACTION_NOT_SPECIFIED, + "no bank account" + ) ~> replyTo + ) } - case _ => Effect.none.thenRun(_ => PayOutFailed("no wallet id") ~> replyTo) + case _ => + Effect.none.thenRun(_ => + PayOutFailed( + "", + Transaction.TransactionStatus.TRANSACTION_NOT_SPECIFIED, + "no wallet id" + ) ~> replyTo + ) } case _ => - Effect.none.thenRun(_ => PayOutFailed("no payment provider user id") ~> replyTo) + Effect.none.thenRun(_ => + PayOutFailed( + "", + Transaction.TransactionStatus.TRANSACTION_NOT_SPECIFIED, + "no payment provider user id" + ) ~> replyTo + ) } case _ => Effect.none.thenRun(_ => PaymentAccountNotFound ~> replyTo) } @@ -922,7 +1006,7 @@ trait GenericPaymentBehavior ) .thenRun(_ => { - Transfered(transaction.id, payOutTransactionId) + Transferred(transaction.id, transaction.status, payOutTransactionId) } ~> replyTo ) } else { @@ -939,7 +1023,13 @@ trait GenericPaymentBehavior .withDocument(updatedPaymentAccount) .withLastUpdated(lastUpdated) ) - .thenRun(_ => TransferFailed(transaction.resultMessage) ~> replyTo) + .thenRun(_ => + TransferFailed( + transaction.id, + transaction.status, + transaction.resultMessage + ) ~> replyTo + ) } case _ => Effect.none.thenRun(_ => TransactionNotFound ~> replyTo) } @@ -1139,7 +1229,9 @@ trait GenericPaymentBehavior .withLastUpdated(lastUpdated) .withDocument(updatedPaymentAccount) ) - .thenRun(_ => DirectDebited(transaction.id) ~> replyTo) + .thenRun(_ => + DirectDebited(transaction.id, transaction.status) ~> replyTo + ) } else { Effect .persist( @@ -1155,7 +1247,11 @@ trait GenericPaymentBehavior .withDocument(updatedPaymentAccount) ) .thenRun(_ => - DirectDebitFailed(transaction.resultMessage) ~> replyTo + DirectDebitFailed( + transaction.id, + transaction.status, + transaction.resultMessage + ) ~> replyTo ) } case _ => Effect.none.thenRun(_ => TransactionNotFound ~> replyTo) @@ -1216,7 +1312,9 @@ trait GenericPaymentBehavior .withLastUpdated(lastUpdated) .withDocument(updatedPaymentAccount) ) - .thenRun(_ => DirectDebited(transaction.id) ~> replyTo) + .thenRun(_ => + DirectDebited(transaction.id, transaction.status) ~> replyTo + ) } else { Effect .persist( @@ -1231,7 +1329,13 @@ trait GenericPaymentBehavior .withLastUpdated(lastUpdated) .withDocument(updatedPaymentAccount) ) - .thenRun(_ => DirectDebitFailed(transaction.resultMessage) ~> replyTo) + .thenRun(_ => + DirectDebitFailed( + transaction.id, + transaction.status, + transaction.resultMessage + ) ~> replyTo + ) } case _ => Effect.none.thenRun(_ => TransactionNotFound ~> replyTo) } @@ -1276,7 +1380,11 @@ trait GenericPaymentBehavior ) case _ => Effect.none.thenRun(_ => - FirstRecurringCardPaymentFailed("no transaction") ~> replyTo + FirstRecurringCardPaymentFailed( + "", + Transaction.TransactionStatus.TRANSACTION_NOT_SPECIFIED, + "no transaction" + ) ~> replyTo ) } case _ => Effect.none.thenRun(_ => RecurringPaymentNotFound ~> replyTo) @@ -1301,7 +1409,11 @@ trait GenericPaymentBehavior ) case _ => Effect.none.thenRun(_ => - FirstRecurringCardPaymentFailed("no transaction") ~> replyTo + FirstRecurringCardPaymentFailed( + "", + Transaction.TransactionStatus.TRANSACTION_NOT_SPECIFIED, + "no transaction" + ) ~> replyTo ) } case _ => Effect.none.thenRun(_ => RecurringPaymentNotFound ~> replyTo) @@ -2750,7 +2862,13 @@ trait GenericPaymentBehavior } } ) - .thenRun(_ => NextRecurringPaymentFailed(reason) ~> replyTo) + .thenRun(_ => + NextRecurringPaymentFailed( + "", + Transaction.TransactionStatus.TRANSACTION_NOT_SPECIFIED, + reason + ) ~> replyTo + ) } private def addMandate( @@ -2987,8 +3105,8 @@ trait GenericPaymentBehavior .withLastUpdated(lastUpdated) ) .thenRun(_ => - (if (first) FirstRecurringPaidIn(transaction.id) - else NextRecurringPaid(transaction.id)) ~> replyTo + (if (first) FirstRecurringPaidIn(transaction.id, transaction.status) + else NextRecurringPaid(transaction.id, transaction.status)) ~> replyTo ) } else { log.error( @@ -3057,9 +3175,17 @@ trait GenericPaymentBehavior .thenRun(_ => ( if (first) - FirstRecurringCardPaymentFailed(transaction.getReasonMessage) + FirstRecurringCardPaymentFailed( + transaction.id, + transaction.status, + transaction.getReasonMessage + ) else - NextRecurringPaymentFailed(transaction.getReasonMessage) + NextRecurringPaymentFailed( + transaction.id, + transaction.status, + transaction.getReasonMessage + ) ) ~> replyTo ) } @@ -3147,7 +3273,7 @@ trait GenericPaymentBehavior .withDocument(updatedPaymentAccount) .withLastUpdated(lastUpdated) ) - .thenRun(_ => PaidIn(transaction.id) ~> replyTo) + .thenRun(_ => PaidIn(transaction.id, transaction.status) ~> replyTo) } else { log.error( "Order-{} could not be paid in: {} -> {}", @@ -3167,7 +3293,9 @@ trait GenericPaymentBehavior .withDocument(updatedPaymentAccount) .withLastUpdated(lastUpdated) ) - .thenRun(_ => PayInFailed(transaction.resultMessage) ~> replyTo) + .thenRun(_ => + PayInFailed(transaction.id, transaction.status, transaction.resultMessage) ~> replyTo + ) } } } diff --git a/testkit/src/main/scala/app/softnetwork/payment/scalatest/PaymentTestKit.scala b/testkit/src/main/scala/app/softnetwork/payment/scalatest/PaymentTestKit.scala index 2ff12c6..be574c9 100644 --- a/testkit/src/main/scala/app/softnetwork/payment/scalatest/PaymentTestKit.scala +++ b/testkit/src/main/scala/app/softnetwork/payment/scalatest/PaymentTestKit.scala @@ -62,7 +62,8 @@ trait PaymentTestKit extends SchedulerTestKit with PaymentGuardian { _: Suite => case result: PaymentRedirection => Right(Left(result)) case result: PaidIn => Right(Right(result)) case error: PayInFailed => Left(error) - case _ => Left(PayInFailed("unknown")) + case _ => + Left(PayInFailed("", Transaction.TransactionStatus.TRANSACTION_NOT_SPECIFIED, "unknown")) } } @@ -95,7 +96,14 @@ trait PaymentTestKit extends SchedulerTestKit with PaymentGuardian { _: Suite => case result: PaymentRedirection => Right(Left(result)) case result: FirstRecurringPaidIn => Right(Right(result)) case error: FirstRecurringCardPaymentFailed => Left(error) - case _ => Left(FirstRecurringCardPaymentFailed("unknown")) + case _ => + Left( + FirstRecurringCardPaymentFailed( + "", + Transaction.TransactionStatus.TRANSACTION_NOT_SPECIFIED, + "unknown" + ) + ) } }