95 lines
3.1 KiB
Go
95 lines
3.1 KiB
Go
|
|
package repository
|
||
|
|
|
||
|
|
import (
|
||
|
|
"context"
|
||
|
|
"time"
|
||
|
|
|
||
|
|
"apskel-pos-be/internal/entities"
|
||
|
|
|
||
|
|
"github.com/google/uuid"
|
||
|
|
"gorm.io/gorm"
|
||
|
|
)
|
||
|
|
|
||
|
|
type PaymentRepository interface {
|
||
|
|
Create(ctx context.Context, payment *entities.Payment) error
|
||
|
|
GetByID(ctx context.Context, id uuid.UUID) (*entities.Payment, error)
|
||
|
|
GetByOrderID(ctx context.Context, orderID uuid.UUID) ([]*entities.Payment, error)
|
||
|
|
Update(ctx context.Context, payment *entities.Payment) error
|
||
|
|
Delete(ctx context.Context, id uuid.UUID) error
|
||
|
|
RefundPayment(ctx context.Context, id uuid.UUID, refundAmount float64, reason string, refundedBy uuid.UUID) error
|
||
|
|
UpdateStatus(ctx context.Context, id uuid.UUID, status entities.PaymentTransactionStatus) error
|
||
|
|
GetTotalPaidByOrderID(ctx context.Context, orderID uuid.UUID) (float64, error)
|
||
|
|
}
|
||
|
|
|
||
|
|
type PaymentRepositoryImpl struct {
|
||
|
|
db *gorm.DB
|
||
|
|
}
|
||
|
|
|
||
|
|
func NewPaymentRepositoryImpl(db *gorm.DB) *PaymentRepositoryImpl {
|
||
|
|
return &PaymentRepositoryImpl{
|
||
|
|
db: db,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func (r *PaymentRepositoryImpl) Create(ctx context.Context, payment *entities.Payment) error {
|
||
|
|
return r.db.WithContext(ctx).Create(payment).Error
|
||
|
|
}
|
||
|
|
|
||
|
|
func (r *PaymentRepositoryImpl) GetByID(ctx context.Context, id uuid.UUID) (*entities.Payment, error) {
|
||
|
|
var payment entities.Payment
|
||
|
|
err := r.db.WithContext(ctx).
|
||
|
|
Preload("PaymentMethod").
|
||
|
|
Preload("PaymentOrderItems").
|
||
|
|
First(&payment, "id = ?", id).Error
|
||
|
|
if err != nil {
|
||
|
|
return nil, err
|
||
|
|
}
|
||
|
|
return &payment, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
func (r *PaymentRepositoryImpl) GetByOrderID(ctx context.Context, orderID uuid.UUID) ([]*entities.Payment, error) {
|
||
|
|
var payments []*entities.Payment
|
||
|
|
err := r.db.WithContext(ctx).
|
||
|
|
Preload("PaymentMethod").
|
||
|
|
Preload("PaymentOrderItems").
|
||
|
|
Where("order_id = ?", orderID).
|
||
|
|
Find(&payments).Error
|
||
|
|
return payments, err
|
||
|
|
}
|
||
|
|
|
||
|
|
func (r *PaymentRepositoryImpl) Update(ctx context.Context, payment *entities.Payment) error {
|
||
|
|
return r.db.WithContext(ctx).Save(payment).Error
|
||
|
|
}
|
||
|
|
|
||
|
|
func (r *PaymentRepositoryImpl) Delete(ctx context.Context, id uuid.UUID) error {
|
||
|
|
return r.db.WithContext(ctx).Delete(&entities.Payment{}, "id = ?", id).Error
|
||
|
|
}
|
||
|
|
|
||
|
|
func (r *PaymentRepositoryImpl) RefundPayment(ctx context.Context, id uuid.UUID, refundAmount float64, reason string, refundedBy uuid.UUID) error {
|
||
|
|
now := time.Now()
|
||
|
|
return r.db.WithContext(ctx).Model(&entities.Payment{}).
|
||
|
|
Where("id = ?", id).
|
||
|
|
Updates(map[string]interface{}{
|
||
|
|
"refund_amount": refundAmount,
|
||
|
|
"refund_reason": reason,
|
||
|
|
"refunded_at": now,
|
||
|
|
"refunded_by": refundedBy,
|
||
|
|
"status": entities.PaymentTransactionStatusRefunded,
|
||
|
|
}).Error
|
||
|
|
}
|
||
|
|
|
||
|
|
func (r *PaymentRepositoryImpl) UpdateStatus(ctx context.Context, id uuid.UUID, status entities.PaymentTransactionStatus) error {
|
||
|
|
return r.db.WithContext(ctx).Model(&entities.Payment{}).
|
||
|
|
Where("id = ?", id).
|
||
|
|
Update("status", status).Error
|
||
|
|
}
|
||
|
|
|
||
|
|
func (r *PaymentRepositoryImpl) GetTotalPaidByOrderID(ctx context.Context, orderID uuid.UUID) (float64, error) {
|
||
|
|
var total float64
|
||
|
|
err := r.db.WithContext(ctx).Model(&entities.Payment{}).
|
||
|
|
Where("order_id = ? AND status = ?", orderID, entities.PaymentTransactionStatusCompleted).
|
||
|
|
Select("COALESCE(SUM(amount), 0)").
|
||
|
|
Scan(&total).Error
|
||
|
|
return total, err
|
||
|
|
}
|