init
This commit is contained in:
@@ -0,0 +1,94 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user