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 ChapaPaymentVerificationResponse 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 ChapaTransferVerificationResponse struct { Message string `json:"message"` Status string `json:"status"` Data struct { AccountName string `json:"account_name"` AccountNumber string `json:"account_number"` Mobile interface{} `json:"mobile"` Currency string `json:"currency"` Amount float64 `json:"amount"` Charge float64 `json:"charge"` Mode string `json:"mode"` TransferMethod string `json:"transfer_method"` Narration interface{} `json:"narration"` ChapaTransferID string `json:"chapa_transfer_id"` BankCode int `json:"bank_code"` BankName string `json:"bank_name"` CrossPartyReference interface{} `json:"cross_party_reference"` IPAddress string `json:"ip_address"` Status string `json:"status"` TxRef string `json:"tx_ref"` 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 SwapResponse struct { Message string `json:"message"` Status string `json:"status"` Data 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"` } `json:"data"` } type ChapaTransfersListResponse struct { Message string `json:"message"` Status string `json:"status"` Meta struct { CurrentPage int `json:"current_page"` FirstPageURL string `json:"first_page_url"` LastPage int `json:"last_page"` LastPageURL string `json:"last_page_url"` NextPageURL string `json:"next_page_url"` Path string `json:"path"` PerPage int `json:"per_page"` PrevPageURL interface{} `json:"prev_page_url"` To int `json:"to"` Total int `json:"total"` Error []interface{} `json:"error"` } `json:"meta"` Data []struct { AccountName string `json:"account_name"` AccountNumber string `json:"account_number"` Currency string `json:"currency"` Amount float64 `json:"amount"` Charge float64 `json:"charge"` TransferType string `json:"transfer_type"` ChapaReference string `json:"chapa_reference"` BankCode int `json:"bank_code"` BankName string `json:"bank_name"` BankReference interface{} `json:"bank_reference"` Status string `json:"status"` Reference interface{} `json:"reference"` CreatedAt string `json:"created_at"` UpdatedAt string `json:"updated_at"` } `json:"data"` } 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 { Event string `json:"event"` Type string `json:"type"` AccountName string `json:"account_name"` AccountNumber string `json:"account_number"` BankID int `json:"bank_id"` BankName string `json:"bank_name"` Amount string `json:"amount"` Charge string `json:"charge"` Currency string `json:"currency"` Status string `json:"status"` Reference string `json:"reference"` ChapaReference string `json:"chapa_reference"` BankReference string `json:"bank_reference"` CreatedAt string `json:"created_at"` UpdatedAt string `json:"updated_at"` } type ChapaWebhookPayment struct { Event string `json:"event"` FirstName string `json:"first_name"` LastName string `json:"last_name"` Email *string `json:"email,omitempty"` Mobile string `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 string `json:"created_at"` UpdatedAt string `json:"updated_at"` Type string `json:"type"` TxRef string `json:"tx_ref"` PaymentMethod string `json:"payment_method"` Customization ChapaWebhookCustomization `json:"customization"` Meta interface{} `json:"meta"` // may vary in structure, so kept flexible } type ChapaWebhookCustomization struct { Title *string `json:"title,omitempty"` Description *string `json:"description,omitempty"` Logo *string `json:"logo,omitempty"` } 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 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"` }