Add QR Payment
This commit is contained in:
@@ -5,7 +5,6 @@ import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
errors2 "furtuna-be/internal/common/errors"
|
||||
"furtuna-be/internal/common/logger"
|
||||
"furtuna-be/internal/common/mycontext"
|
||||
order2 "furtuna-be/internal/constants/order"
|
||||
@@ -155,12 +154,20 @@ func (s *OrderService) Execute(ctx context.Context, req *entity.OrderExecuteRequ
|
||||
}
|
||||
|
||||
if order.PaymentType != "CASH" {
|
||||
paymentResponse, err := s.processNonCashPayment(ctx, order, partnerID, req.CreatedBy)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
if order.PaymentType == "QRIS" {
|
||||
paymentResponse, err := s.processQRPayment(ctx, order, partnerID, req.CreatedBy)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
resp.QRCode = paymentResponse.QrCodeUrl
|
||||
} else {
|
||||
paymentResponse, err := s.processNonCashPayment(ctx, order, partnerID, req.CreatedBy)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
resp.PaymentToken = paymentResponse.Token
|
||||
resp.RedirectURL = paymentResponse.RedirectURL
|
||||
}
|
||||
resp.PaymentToken = paymentResponse.Token
|
||||
resp.RedirectURL = paymentResponse.RedirectURL
|
||||
}
|
||||
|
||||
order.SetExecutePaymentStatus()
|
||||
@@ -217,7 +224,54 @@ func (s *OrderService) processNonCashPayment(ctx context.Context, order *entity.
|
||||
PartnerID: partnerID,
|
||||
OrderID: order.ID,
|
||||
ReferenceID: paymentRequest.PaymentReferenceID,
|
||||
Channel: "XENDIT",
|
||||
Channel: "MIDTRANS",
|
||||
PaymentType: order.PaymentType,
|
||||
Amount: order.Amount,
|
||||
State: "PENDING",
|
||||
CreatedAt: time.Now(),
|
||||
UpdatedAt: time.Now(),
|
||||
RequestMetadata: requestMetadata,
|
||||
}
|
||||
|
||||
_, err = s.payment.Create(ctx, payment)
|
||||
if err != nil {
|
||||
logger.ContextLogger(ctx).Error("error when creating payment record", zap.Error(err))
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return paymentResponse, nil
|
||||
}
|
||||
|
||||
func (s *OrderService) processQRPayment(ctx context.Context, order *entity.Order, partnerID, createdBy int64) (*entity.MidtransQrisResponse, error) {
|
||||
paymentRequest := entity.MidtransRequest{
|
||||
PaymentReferenceID: generator.GenerateUUIDV4(),
|
||||
TotalAmount: int64(order.Amount),
|
||||
OrderItems: order.OrderItems,
|
||||
PaymentMethod: order.PaymentType,
|
||||
}
|
||||
|
||||
paymentResponse, err := s.midtrans.CreateQrisPayment(paymentRequest)
|
||||
if err != nil {
|
||||
logger.ContextLogger(ctx).Error("error when creating payment", zap.Error(err))
|
||||
return nil, err
|
||||
}
|
||||
|
||||
requestMetadata, err := json.Marshal(map[string]string{
|
||||
"partner_id": strconv.FormatInt(partnerID, 10),
|
||||
"created_by": strconv.FormatInt(createdBy, 10),
|
||||
"qr_code": paymentResponse.QrCodeUrl,
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
logger.ContextLogger(ctx).Error("error when marshaling request metadata", zap.Error(err))
|
||||
return nil, err
|
||||
}
|
||||
|
||||
payment := &entity.Payment{
|
||||
PartnerID: partnerID,
|
||||
OrderID: order.ID,
|
||||
ReferenceID: paymentRequest.PaymentReferenceID,
|
||||
Channel: "MIDTRANS",
|
||||
PaymentType: order.PaymentType,
|
||||
Amount: order.Amount,
|
||||
State: "PENDING",
|
||||
@@ -362,16 +416,29 @@ func (s OrderService) SumAmount(ctx mycontext.Context, req entity.OrderSearch) (
|
||||
return data, nil
|
||||
}
|
||||
|
||||
func (s *OrderService) GetByID(ctx mycontext.Context, id int64) (*entity.Order, error) {
|
||||
func (s *OrderService) GetByID(ctx mycontext.Context, id int64, referenceID string) (*entity.Order, error) {
|
||||
if referenceID != "" {
|
||||
payment, err := s.payment.FindByReferenceID(ctx, nil, referenceID)
|
||||
if err != nil {
|
||||
logger.ContextLogger(ctx).Error("error when getting payment by IDs", zap.Error(err))
|
||||
return nil, err
|
||||
}
|
||||
id = payment.OrderID
|
||||
}
|
||||
|
||||
order, err := s.repo.FindByID(ctx, id)
|
||||
if err != nil {
|
||||
logger.ContextLogger(ctx).Error("error when getting products by IDs", zap.Error(err))
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if order.CreatedBy != ctx.RequestedBy() {
|
||||
return nil, errors2.NewError(errors2.ErrorBadRequest.ErrorType(), "order not found")
|
||||
if ctx.IsCasheer() {
|
||||
return order, nil
|
||||
}
|
||||
|
||||
//if order.CreatedBy != ctx.RequestedBy() {
|
||||
// return nil, errors2.NewError(errors2.ErrorBadRequest.ErrorType(), "order not found")
|
||||
//}
|
||||
|
||||
return order, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user