199 lines
6.6 KiB
Go
199 lines
6.6 KiB
Go
package domain
|
|
|
|
import (
|
|
"time"
|
|
|
|
dbgen "github.com/SamuelTariku/FortuneBet-Backend/gen/db"
|
|
"github.com/jackc/pgx/v5/pgtype"
|
|
)
|
|
|
|
type TransferType string
|
|
|
|
const (
|
|
DEPOSIT TransferType = "deposit"
|
|
WITHDRAW TransferType = "withdraw"
|
|
WALLET TransferType = "wallet"
|
|
)
|
|
|
|
type PaymentMethod string
|
|
|
|
// Info on why the wallet was modified
|
|
// If its internal system modification then, its always direct
|
|
const (
|
|
TRANSFER_DIRECT PaymentMethod = "direct"
|
|
TRANSFER_CASH PaymentMethod = "cash"
|
|
TRANSFER_BANK PaymentMethod = "bank"
|
|
TRANSFER_CHAPA PaymentMethod = "chapa"
|
|
TRANSFER_ARIFPAY PaymentMethod = "arifpay"
|
|
TRANSFER_SANTIMPAY PaymentMethod = "santimpay"
|
|
TRANSFER_ADDISPAY PaymentMethod = "addispay"
|
|
TRANSFER_OTHER PaymentMethod = "other"
|
|
)
|
|
|
|
type TransactionApproval struct {
|
|
ID int64
|
|
TransferID int64
|
|
ApprovedBy int64 // User ID of approver
|
|
Status string // "pending", "approved", "rejected"
|
|
Comments string
|
|
CreatedAt time.Time
|
|
UpdatedAt time.Time
|
|
}
|
|
|
|
type ApprovalAction string
|
|
|
|
const (
|
|
ApprovalActionApprove ApprovalAction = "approve"
|
|
ApprovalActionReject ApprovalAction = "reject"
|
|
)
|
|
|
|
type ApprovalRequest struct {
|
|
TransferID int64
|
|
Action ApprovalAction
|
|
Comments string
|
|
ApproverID int64
|
|
}
|
|
|
|
// Info for the payment providers
|
|
type PaymentDetails struct {
|
|
ReferenceNumber ValidString
|
|
BankNumber ValidString
|
|
}
|
|
|
|
// A Transfer is logged for every modification of ALL wallets and wallet types
|
|
type Transfer struct {
|
|
ID int64 `json:"id"`
|
|
Amount Currency `json:"amount"`
|
|
Verified bool `json:"verified"`
|
|
Message string `json:"message"`
|
|
Type TransferType `json:"type"`
|
|
PaymentMethod PaymentMethod `json:"payment_method"`
|
|
ReceiverWalletID ValidInt64 `json:"receiver_wallet_id"`
|
|
SenderWalletID ValidInt64 `json:"sender_wallet_id"`
|
|
ReferenceNumber string `json:"reference_number"` // <-- needed
|
|
SessionID string `json:"session_id"`
|
|
Status string `json:"status"`
|
|
DepositorID ValidInt64 `json:"depositor_id"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
}
|
|
type TransferDetail struct {
|
|
ID int64 `json:"id"`
|
|
Amount Currency `json:"amount"`
|
|
Verified bool `json:"verified"`
|
|
Message string `json:"message"`
|
|
Type TransferType `json:"type"`
|
|
PaymentMethod PaymentMethod `json:"payment_method"`
|
|
ReceiverWalletID ValidInt64 `json:"receiver_wallet_id"`
|
|
SenderWalletID ValidInt64 `json:"sender_wallet_id"`
|
|
ReferenceNumber string `json:"reference_number"` // <-- needed
|
|
SessionID string `json:"session_id"`
|
|
Status string `json:"status"`
|
|
DepositorID ValidInt64 `json:"depositor_id"`
|
|
DepositorFirstName string `json:"depositor_first_name"`
|
|
DepositorLastName string `json:"depositor_last_name"`
|
|
DepositorPhoneNumber string `json:"depositor_phone_number"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
}
|
|
|
|
type CreateTransfer struct {
|
|
Amount Currency `json:"amount"`
|
|
Verified bool `json:"verified"`
|
|
Message string `json:"message"`
|
|
Type TransferType `json:"type"`
|
|
PaymentMethod PaymentMethod `json:"payment_method"`
|
|
ReceiverWalletID ValidInt64 `json:"receiver_wallet_id"`
|
|
SenderWalletID ValidInt64 `json:"sender_wallet_id"`
|
|
ReferenceNumber string `json:"reference_number"` // <-- needed
|
|
SessionID string `json:"session_id"`
|
|
Status string `json:"status"`
|
|
CashierID ValidInt64 `json:"cashier_id"`
|
|
}
|
|
|
|
type TransferStats struct {
|
|
TotalTransfer int64
|
|
TotalDeposits int64
|
|
TotalWithdraws int64
|
|
TotalWalletToWallet int64
|
|
}
|
|
|
|
func ConvertDBTransferDetail(transfer dbgen.WalletTransferDetail) TransferDetail {
|
|
return TransferDetail{
|
|
ID: transfer.ID,
|
|
Amount: Currency(transfer.Amount.Int64),
|
|
Type: TransferType(transfer.Type.String),
|
|
Verified: transfer.Verified.Bool,
|
|
Message: transfer.Message,
|
|
ReceiverWalletID: ValidInt64{
|
|
Value: transfer.ReceiverWalletID.Int64,
|
|
Valid: transfer.ReceiverWalletID.Valid,
|
|
},
|
|
SenderWalletID: ValidInt64{
|
|
Value: transfer.SenderWalletID.Int64,
|
|
Valid: transfer.SenderWalletID.Valid,
|
|
},
|
|
DepositorID: ValidInt64{
|
|
Value: transfer.CashierID.Int64,
|
|
Valid: transfer.CashierID.Valid,
|
|
},
|
|
DepositorFirstName: transfer.FirstName.String,
|
|
DepositorLastName: transfer.LastName.String,
|
|
DepositorPhoneNumber: transfer.PhoneNumber.String,
|
|
PaymentMethod: PaymentMethod(transfer.PaymentMethod.String),
|
|
ReferenceNumber: transfer.ReferenceNumber,
|
|
SessionID: transfer.SessionID.String,
|
|
Status: transfer.Status.String,
|
|
CreatedAt: transfer.CreatedAt.Time,
|
|
UpdatedAt: transfer.UpdatedAt.Time,
|
|
}
|
|
}
|
|
func ConvertDBTransfer(transfer dbgen.WalletTransfer) Transfer {
|
|
return Transfer{
|
|
ID: transfer.ID,
|
|
Amount: Currency(transfer.Amount.Int64),
|
|
Type: TransferType(transfer.Type.String),
|
|
Verified: transfer.Verified.Bool,
|
|
Message: transfer.Message,
|
|
ReceiverWalletID: ValidInt64{
|
|
Value: transfer.ReceiverWalletID.Int64,
|
|
Valid: transfer.ReceiverWalletID.Valid,
|
|
},
|
|
SenderWalletID: ValidInt64{
|
|
Value: transfer.SenderWalletID.Int64,
|
|
Valid: transfer.SenderWalletID.Valid,
|
|
},
|
|
DepositorID: ValidInt64{
|
|
Value: transfer.CashierID.Int64,
|
|
Valid: transfer.CashierID.Valid,
|
|
},
|
|
PaymentMethod: PaymentMethod(transfer.PaymentMethod.String),
|
|
ReferenceNumber: transfer.ReferenceNumber,
|
|
SessionID: transfer.SessionID.String,
|
|
Status: transfer.Status.String,
|
|
CreatedAt: transfer.CreatedAt.Time,
|
|
UpdatedAt: transfer.UpdatedAt.Time,
|
|
}
|
|
}
|
|
|
|
func ConvertCreateTransfer(transfer CreateTransfer) dbgen.CreateTransferParams {
|
|
return dbgen.CreateTransferParams{
|
|
Message: transfer.Message,
|
|
Amount: pgtype.Int8{Int64: int64(transfer.Amount), Valid: true},
|
|
Type: pgtype.Text{String: string(transfer.Type), Valid: true},
|
|
ReceiverWalletID: transfer.ReceiverWalletID.ToPG(),
|
|
SenderWalletID: transfer.SenderWalletID.ToPG(),
|
|
CashierID: transfer.CashierID.ToPG(),
|
|
ReferenceNumber: string(transfer.ReferenceNumber),
|
|
SessionID: pgtype.Text{
|
|
String: transfer.SessionID,
|
|
Valid: true,
|
|
},
|
|
PaymentMethod: pgtype.Text{String: string(transfer.PaymentMethod), Valid: true},
|
|
Verified: pgtype.Bool{
|
|
Bool: transfer.Verified,
|
|
Valid: true,
|
|
},
|
|
}
|
|
}
|