package domain import ( "errors" "time" ) var ( ErrInsufficientBalance = errors.New("insufficient balance") ErrInvalidWithdrawalAmount = errors.New("invalid withdrawal amount") ErrWithdrawalNotFound = errors.New("withdrawal not found") ErrPaymentNotFound = errors.New("payment not found") ErrPaymentAlreadyExists = errors.New("payment with this reference already exists") ErrInvalidPaymentAmount = errors.New("invalid payment amount") ) type PaymentStatus string type WithdrawalStatus string const ( WithdrawalStatusSuccessful WithdrawalStatus = "success" WithdrawalStatusPending WithdrawalStatus = "pending" WithdrawalStatusProcessing WithdrawalStatus = "processing" WithdrawalStatusCompleted WithdrawalStatus = "completed" WithdrawalStatusFailed WithdrawalStatus = "failed" ) const ( PaymentStatusSuccessful PaymentStatus = "success" PaymentStatusPending PaymentStatus = "pending" PaymentStatusCompleted PaymentStatus = "completed" PaymentStatusFailed PaymentStatus = "failed" ) type ChapaInitDepositRequest struct { Amount Currency `json:"amount"` Currency string `json:"currency"` Email string `json:"email"` FirstName string `json:"first_name"` LastName string `json:"last_name"` TxRef string `json:"tx_ref"` CallbackURL string `json:"callback_url"` ReturnURL string `json:"return_url"` PhoneNumber string `json:"phone_number"` // PhoneNumber string `json:"phone_number"` } type ChapaDepositRequestPayload struct { Amount float64 `json:"amount" validate:"required,gt=0"` } type ChapaWebhookPayload struct { TxRef string `json:"trx_ref"` Amount Currency `json:"amount"` // Currency string `json:"currency"` Status PaymentStatus `json:"status"` } type ChapaPaymentWebhookRequest struct { TxRef string `json:"trx_ref"` RefId string `json:"ref_id"` Status PaymentStatus `json:"status"` } // PaymentResponse contains the response from payment initialization type ChapaDepositResponse struct { CheckoutURL string Reference string } // PaymentVerification contains payment verification details type ChapaDepositVerification struct { Status PaymentStatus Amount Currency Currency string } type ChapaVerificationResponse struct { Message string `json:"message"` Status string `json:"status"` Data struct { FirstName string `json:"first_name"` LastName string `json:"last_name"` Email string `json:"email"` Currency string `json:"currency"` Amount float64 `json:"amount"` Charge float64 `json:"charge"` Mode string `json:"mode"` Method string `json:"method"` Type string `json:"type"` Status string `json:"status"` Reference string `json:"reference"` TxRef string `json:"tx_ref"` Customization struct { Title string `json:"title"` Description string `json:"description"` Logo interface{} `json:"logo"` } `json:"customization"` Meta interface{} `json:"meta"` CreatedAt string `json:"created_at"` UpdatedAt string `json:"updated_at"` } `json:"data"` } type ChapaAllTransactionsResponse struct { Message string `json:"message"` Status string `json:"status"` Data struct { Transactions []struct { Status string `json:"status"` RefID string `json:"ref_id"` Type string `json:"type"` CreatedAt string `json:"created_at"` Currency string `json:"currency"` Amount string `json:"amount"` Charge string `json:"charge"` TransID *string `json:"trans_id"` PaymentMethod string `json:"payment_method"` Customer struct { ID int64 `json:"id"` Email *string `json:"email"` FirstName *string `json:"first_name"` LastName *string `json:"last_name"` Mobile *string `json:"mobile"` } `json:"customer"` } `json:"transactions"` Pagination struct { PerPage int `json:"per_page"` CurrentPage int `json:"current_page"` FirstPageURL string `json:"first_page_url"` NextPageURL *string `json:"next_page_url"` PrevPageURL *string `json:"prev_page_url"` } `json:"pagination"` } `json:"data"` } type ChapaTransactionEvent struct { Item int64 `json:"item"` Message string `json:"message"` Type string `json:"type"` CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` } type ChapaTransaction struct { Status string `json:"status"` RefID string `json:"ref_id"` Type string `json:"type"` CreatedAt string `json:"created_at"` Currency string `json:"currency"` Amount string `json:"amount"` Charge string `json:"charge"` TransID *string `json:"trans_id"` PaymentMethod string `json:"payment_method"` Customer ChapaCustomer `json:"customer"` } type ChapaCustomer struct { ID int64 `json:"id"` Email *string `json:"email"` FirstName *string `json:"first_name"` LastName *string `json:"last_name"` Mobile *string `json:"mobile"` } // type Bank struct { // ID int `json:"id"` // Slug string `json:"slug"` // Swift string `json:"swift"` // Name string `json:"name"` // AcctLength int `json:"acct_length"` // CountryID int `json:"country_id"` // IsMobileMoney int `json:"is_mobilemoney"` // nullable // IsActive int `json:"is_active"` // IsRTGS int `json:"is_rtgs"` // Active int `json:"active"` // Is24Hrs int `json:"is_24hrs"` // nullable // CreatedAt time.Time `json:"created_at"` // UpdatedAt time.Time `json:"updated_at"` // Currency string `json:"currency"` // BankLogo string `json:"bank_logo"` // URL or base64 // } type BankResponse struct { Message string `json:"message"` Status string `json:"status"` Data []BankData `json:"data"` } type BankData struct { ID int `json:"id"` Slug string `json:"slug"` Swift string `json:"swift"` Name string `json:"name"` AcctLength int `json:"acct_length"` CountryID int `json:"country_id"` IsMobileMoney int `json:"is_mobilemoney"` // nullable IsActive int `json:"is_active"` IsRTGS int `json:"is_rtgs"` Active int `json:"active"` Is24Hrs int `json:"is_24hrs"` // nullable CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` Currency string `json:"currency"` } type ChapaWithdrawal struct { ID string UserID int64 Amount Currency AccountNumber string BankCode string Status WithdrawalStatus Reference string CreatedAt time.Time UpdatedAt time.Time } type ChapaWithdrawalRequest struct { AccountName string `json:"account_name"` AccountNumber string `json:"account_number"` Amount string `json:"amount"` // string because Chapa API uses string for monetary values Currency string `json:"currency"` Reference string `json:"reference"` BankCode int `json:"bank_code"` } // type ChapaWithdrawalRequest struct { // AccountName string `json:"account_name"` // AccountNumber string `json:"account_number"` // Amount Currency `json:"amount"` // Currency string `json:"currency"` // BeneficiaryName string `json:"beneficiary_name"` // BankCode string `json:"bank_code"` // PhoneNumber string `json:"phone_number"` // } type ChapaWithdrawalResponse struct { Message string `json:"message"` Status string `json:"status"` Data string `json:"data"` // Accepts string instead of struct } type ChapaTransactionType struct { Type string `json:"type"` } type ChapaWebHookTransfer struct { AccountName string `json:"account_name"` AccountNumber string `json:"account_number"` BankId string `json:"bank_id"` BankName string `json:"bank_name"` Currency string `json:"currency"` Amount string `json:"amount"` Type string `json:"type"` Status string `json:"status"` Reference string `json:"reference"` TxRef string `json:"tx_ref"` ChapaReference string `json:"chapa_reference"` CreatedAt time.Time `json:"created_at"` } type ChapaWebHookPayment struct { Event string `json:"event"` FirstName string `json:"first_name"` LastName string `json:"last_name"` Email string `json:"email"` Mobile interface{} `json:"mobile"` Currency string `json:"currency"` Amount string `json:"amount"` Charge string `json:"charge"` Status string `json:"status"` Mode string `json:"mode"` Reference string `json:"reference"` CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` Type string `json:"type"` TxRef string `json:"tx_ref"` PaymentMethod string `json:"payment_method"` Customization struct { Title interface{} `json:"title"` Description interface{} `json:"description"` Logo interface{} `json:"logo"` } `json:"customization"` Meta string `json:"meta"` } type Balance struct { Currency string `json:"currency"` AvailableBalance float64 `json:"available_balance"` LedgerBalance float64 `json:"ledger_balance"` } type SwapRequest struct { From string `json:"from"` To string `json:"to"` Amount float64 `json:"amount"` } type SwapResponse struct { Status string `json:"status"` RefID string `json:"ref_id"` FromCurrency string `json:"from_currency"` ToCurrency string `json:"to_currency"` Amount float64 `json:"amount"` ExchangedAmount float64 `json:"exchanged_amount"` Charge float64 `json:"charge"` Rate float64 `json:"rate"` CreatedAt string `json:"created_at"` UpdatedAt string `json:"updated_at"` } type ChapaCancelResponse struct { Message string `json:"message"` Status string `json:"status"` TxRef string `json:"tx_ref"` Amount float64 `json:"amount"` Currency string `json:"currency"` CreatedAt string `json:"created_at"` UpdatedAt string `json:"updated_at"` }