brokeyourbike/clearbank-api-client-go

View on GitHub
webhook/transactions.go

Summary

Maintainability
A
0 mins
Test Coverage
F
0%
package webhook

import (
    "github.com/brokeyourbike/clearbank-api-client-go"
    "github.com/google/uuid"
)

type TransactionStatus string

const (
    TransactionStatusSettled  TransactionStatus = "Settled"
    TransactionStatusRejected TransactionStatus = "Rejected"
)

type TransactionScheme string

const (
    TransactionSchemeTransfer       = "Transfer"
    TransactionSchemeFasterPayments = "FasterPayments"
    TransactionSchemeBacs           = "Bacs"
    TransactionSchemeChaps          = "Chaps"
)

type DebitCreditCode string

const (
    DebitCreditCodeDebit  DebitCreditCode = "Debit"
    DebitCreditCodeCredit DebitCreditCode = "Credit"
)

type TransactionAccount struct {
    IBAN                 string `json:"IBAN"`
    BBAN                 string `json:"BBAN"`
    OwnerName            string `json:"OwnerName"`
    TransactionOwnerName string `json:"TransactionOwnerName"`
    InstitutionName      string `json:"InstitutionName"`
}

var _ Transaction = (*TransactionSettledPayload)(nil)

// TransactionSettledPayload
// This sends a webhook notification confirming the transaction has settled
type TransactionSettledPayload struct {
    TransactionID               uuid.UUID          `json:"TransactionId" validate:"required"`
    Status                      TransactionStatus  `json:"Status" validate:"required"`
    Scheme                      TransactionScheme  `json:"Scheme" validate:"required"`
    EndToEndTransactionID       string             `json:"EndToEndTransactionId" validate:"required"`
    Amount                      float64            `json:"Amount" validate:"required"`
    TimestampSettled            clearbank.Time     `json:"TimestampSettled" validate:"required"`
    TimestampCreated            clearbank.Time     `json:"TimestampCreated" validate:"required"`
    CurrencyCode                string             `json:"CurrencyCode" validate:"required"`
    DebitCreditCode             DebitCreditCode    `json:"DebitCreditCode" validate:"required"`
    Reference                   string             `json:"Reference"`
    Return                      bool               `json:"IsReturn" validate:"boolean"`
    Account                     TransactionAccount `json:"Account" validate:"required"`
    CounterpartAccount          TransactionAccount `json:"CounterpartAccount" validate:"required"`
    ActualEndToEndTransactionID string             `json:"ActualEndToEndTransactionId" validate:"required"`
    DirectDebitMandateID        string             `json:"DirectDebitMandateId"`
    TransactionCode             string             `json:"TransactionCode"`
    ServiceUserNumber           string             `json:"ServiceUserNumber"`
    BacsTransactionID           string             `json:"BacsTransactionId"`
    BacsTransactionDescription  string             `json:"BacsTransactionDescription"`
    TransactionType             string             `json:"TransactionType"`
    TransactionSource           string             `json:"TransactionSource"`
    SupplementaryData           []struct {
        Name  string `json:"Name"`
        Value string `json:"Value"`
    } `json:"SupplementaryData"`
}

func (w TransactionSettledPayload) GetID() uuid.UUID {
    return w.TransactionID
}

func (w TransactionSettledPayload) GetEndToEndID() string {
    return w.EndToEndTransactionID
}

func (w TransactionSettledPayload) GetCurrency() string {
    return w.CurrencyCode
}

func (w TransactionSettledPayload) GetAmount() float64 {
    if w.DebitCreditCode == DebitCreditCodeDebit {
        return -w.Amount
    }
    return w.Amount
}

func (w TransactionSettledPayload) IsReturn() bool {
    return w.Return
}

func (w TransactionSettledPayload) GetReference() string {
    return w.Reference
}

func (w TransactionSettledPayload) GetAccountIdentifier() string {
    return w.Account.IBAN
}

func (w TransactionSettledPayload) GetAccountOwner() string {
    return w.Account.OwnerName
}

func (w TransactionSettledPayload) GetCounterpartAccountIdentifier() string {
    return w.CounterpartAccount.IBAN
}

func (w TransactionSettledPayload) GetCounterpartAccountOwner() string {
    return w.CounterpartAccount.TransactionOwnerName
}

var _ Transaction = (*TransactionRejectedPayload)(nil)

// TransactionRejectedPayload
// This webhook confirms the payment has been rejected
type TransactionRejectedPayload struct {
    TransactionID         uuid.UUID          `json:"TransactionId" validate:"required"`
    Status                TransactionStatus  `json:"Status" validate:"required"`
    Scheme                TransactionScheme  `json:"Scheme" validate:"required"`
    EndToEndTransactionID string             `json:"EndToEndTransactionId" validate:"required"`
    Amount                float64            `json:"Amount" validate:"required"`
    TimestampModified     clearbank.Time     `json:"TimestampModified" validate:"required"`
    CurrencyCode          string             `json:"CurrencyCode"`
    DebitCreditCode       DebitCreditCode    `json:"DebitCreditCode" validate:"required"`
    Reference             string             `json:"Reference"`
    Return                bool               `json:"IsReturn" validate:"boolean"`
    CancellationReason    string             `json:"CancellationReason"`
    CancellationCode      string             `json:"CancellationCode"`
    Account               TransactionAccount `json:"Account" validate:"required"`
    CounterpartAccount    TransactionAccount `json:"CounterpartAccount" validate:"required"`
}

func (w TransactionRejectedPayload) GetID() uuid.UUID {
    return w.TransactionID
}

func (w TransactionRejectedPayload) GetEndToEndID() string {
    return w.EndToEndTransactionID
}

func (w TransactionRejectedPayload) GetCurrency() string {
    return w.CurrencyCode
}

func (w TransactionRejectedPayload) GetAmount() float64 {
    if w.DebitCreditCode == DebitCreditCodeDebit {
        return -w.Amount
    }
    return w.Amount
}

func (w TransactionRejectedPayload) IsReturn() bool {
    return w.Return
}

func (w TransactionRejectedPayload) GetReference() string {
    return w.Reference
}

func (w TransactionRejectedPayload) GetAccountIdentifier() string {
    return w.Account.IBAN
}

func (w TransactionRejectedPayload) GetAccountOwner() string {
    return w.Account.OwnerName
}

func (w TransactionRejectedPayload) GetCounterpartAccountIdentifier() string {
    return w.CounterpartAccount.IBAN
}

func (w TransactionRejectedPayload) GetCounterpartAccountOwner() string {
    return w.CounterpartAccount.TransactionOwnerName
}

// PaymentMessageAssesmentFailedPayload
// This webhook confirms the payment assessment has failed
type PaymentMessageAssesmentFailedPayload struct {
    MessageID         uuid.UUID         `json:"MessageId" validate:"required"`
    PaymentMethodType TransactionScheme `json:"PaymentMethodType" validate:"required"`
    AssesmentFailures []struct {
        EndToEndID string   `json:"EndToEndId"`
        Reasons    []string `json:"Reasons"`
    } `json:"AssesmentFailure" validate:"required"`
    AccountIdentification struct {
        Debtor struct {
            IBAN string `json:"IBAN" validate:"required"`
            BBAN string `json:"BBAN" validate:"required"`
        }
        Creditors []struct {
            Reference    string  `json:"Reference"`
            Amount       float64 `json:"Amount"`
            CurrencyCode string  `json:"CurrencyCode"`
            IBAN         string  `json:"IBAN" validate:"required"`
            BBAN         string  `json:"BBAN" validate:"required"`
        } `json:"Creditors" validate:"required"`
    } `json:"AccountIdentification" validate:"required"`
}

// PaymentMessageValidationFailedPayload
// This webhook confirms the payment validation has failed
type PaymentMessageValidationFailedPayload struct {
    MessageID          uuid.UUID         `json:"MessageId" validate:"required"`
    PaymentMethodType  TransactionScheme `json:"PaymentMethodType" validate:"required"`
    ValidationFailures []struct {
        EndToEndID string   `json:"EndToEndId"`
        Reasons    []string `json:"Reasons"`
    } `json:"ValidationFailure" validate:"required"`
    AccountIdentification struct {
        Debtor struct {
            IBAN               string `json:"IBAN" validate:"required"`
            BBAN               string `json:"BBAN" validate:"required"`
            AccountName        string `json:"AccountName"`
            AccountHolderLabel string `json:"AccountHolderLabel"`
            InstitutionName    string `json:"InstitutionName"`
        }
        Creditors []struct {
            Reference          string  `json:"Reference" validate:"required"`
            Amount             float64 `json:"Amount" validate:"required"`
            CurrencyCode       string  `json:"CurrencyCode" validate:"required"`
            IBAN               string  `json:"IBAN" validate:"required"`
            BBAN               string  `json:"BBAN" validate:"required"`
            AccountName        string  `json:"AccountName"`
            AccountHolderLabel string  `json:"AccountHolderLabel"`
            InstitutionName    string  `json:"InstitutionName"`
        } `json:"Creditors" validate:"required"`
    } `json:"AccountIdentification" validate:"required"`
}

// InboundHeldTransactionPayload
// This webhook confirms the inbound transaction has been held
type InboundHeldTransactionPayload struct {
    Scheme  string `json:"Scheme" validate:"required"`
    Account struct {
        IBAN string `json:"IBAN" validate:"required"`
        BBAN string `json:"BBAN" validate:"required"`
    } `json:"Account" validate:"required"`
    CounterpartAccount struct {
        IBAN string `json:"IBAN" validate:"required"`
        BBAN string `json:"BBAN" validate:"required"`
    } `json:"CounterpartAccount" validate:"required"`
    TransactionAmount     float64        `json:"TransactionAmount"`
    PaymentReference      string         `json:"PaymentReference"`
    EndToEndTransactionID string         `json:"EndToEndTransactionID"`
    TimestampCreated      clearbank.Time `json:"TimestampCreated"`
}

// OutboundHeldTransactionPayload
// This webhook confirms the outbound transaction has been held
type OutboundHeldTransactionPayload struct {
    Scheme  string `json:"Scheme" validate:"required"`
    Account struct {
        IBAN string `json:"IBAN" validate:"required"`
        BBAN string `json:"BBAN" validate:"required"`
    } `json:"Account" validate:"required"`
    CounterpartAccount struct {
        IBAN string `json:"IBAN" validate:"required"`
        BBAN string `json:"BBAN" validate:"required"`
    } `json:"CounterpartAccount" validate:"required"`
    TransactionAmount     float64        `json:"TransactionAmount"`
    PaymentReference      string         `json:"PaymentReference"`
    EndToEndTransactionID string         `json:"EndToEndTransactionID"`
    TimestampCreated      clearbank.Time `json:"TimestampCreated"`
}