2023-06-13 13:22:51 +00:00
package payment
import (
"context"
"go.uber.org/zap"
2024-12-16 13:47:40 +00:00
"gitea.pena/PenaSide/treasurer/internal/errors"
"gitea.pena/PenaSide/treasurer/internal/models"
"gitea.pena/PenaSide/treasurer/internal/models/yandex"
"gitea.pena/PenaSide/treasurer/internal/utils"
2023-06-13 13:22:51 +00:00
)
type YandexPaymentClient interface {
CreatePayment ( ctx context . Context , idempotenceKey string , request * yandex . CreatePaymentRequest [ yandex . PaymentMethodType ] ) ( * yandex . Payment , errors . Error )
CreatePaymentBankCard ( ctx context . Context , idempotenceKey string , request * yandex . CreatePaymentRequest [ yandex . PaymentMethodBankCard ] ) ( * yandex . Payment , errors . Error )
CreatePaymentB2B ( ctx context . Context , idempotenceKey string , request * yandex . CreatePaymentRequest [ yandex . PaymentMethodB2B ] ) ( * yandex . Payment , errors . Error )
}
type YandexPaymentServiceDeps struct {
Logger * zap . Logger
YandexPaymentClient YandexPaymentClient
}
type Yandex struct {
logger * zap . Logger
yandexPaymentClient YandexPaymentClient
}
func NewYandex ( deps YandexPaymentServiceDeps ) ( * Yandex , errors . Error ) {
if deps . Logger == nil {
return nil , errors . NewWithMessage ( "logger is nil on <NewCallbackClient>" , errors . ErrInvalidArgs )
}
if deps . YandexPaymentClient == nil {
return nil , errors . NewWithMessage ( "YandexPaymentClient is nil on <NewCallbackClient>" , errors . ErrInvalidArgs )
}
return & Yandex {
logger : deps . Logger ,
yandexPaymentClient : deps . YandexPaymentClient ,
} , nil
}
2024-04-17 22:35:13 +00:00
func ( receiver * Yandex ) CreatePaymentBankCard ( ctx context . Context , uuid string , request * models . CreatePayment [ yandex . Receipt ] ) ( * models . CreatePaymentResult , errors . Error ) {
2024-05-02 18:25:44 +00:00
receiver . logger . Info ( "f<CreatePaymentBankCard> of <YandexPaymentService>" , zap . Any ( "Customer" , request . Requisites . Customer ) , zap . Any ( "Items" , request . Requisites . Items ) )
2023-06-13 13:22:51 +00:00
yandexPayment , err := receiver . yandexPaymentClient . CreatePaymentBankCard ( ctx , uuid , & yandex . CreatePaymentRequest [ yandex . PaymentMethodBankCard ] {
Amount : yandex . Amount {
Value : utils . ConvertAmountToStringFloat ( request . Amount ) ,
Currency : request . Currency ,
} ,
2024-05-02 22:05:02 +00:00
Description : "Пополнение пользовательского баланса платформы Pena Hub" ,
2024-04-17 22:35:13 +00:00
Receipt : yandex . Receipt {
TaxSystemCode : 2 , //https://yookassa.ru/developers/payment-acceptance/receipts/54fz/other-services/parameters-values#tax-systems
Customer : request . Requisites . Customer ,
Items : request . Requisites . Items ,
} ,
2023-06-13 13:22:51 +00:00
PaymentMethodData : & yandex . PaymentMethodBankCard {
Type : models . YandexPaymentTypeMap [ request . Type ] ,
} ,
Confirmation : & yandex . CreateConfirmationRedirect {
Type : yandex . ConfirmationTypeRedirect ,
Locale : "ru_RU" ,
ReturnURL : request . ReturnURL ,
Enforce : true ,
} ,
Capture : true ,
ClientIP : request . ClientIP ,
} )
if err != nil {
receiver . logger . Error ( "failed to create payment on <CreatePaymentBankCard> of <YandexPaymentService>" , zap . Error ( err ) )
return nil , err
}
return & models . CreatePaymentResult {
Payment : & models . Payment {
UserID : request . UserID ,
PaymentID : yandexPayment . ID ,
IdempotencePaymentID : uuid ,
ClientIP : request . ClientIP ,
Currency : request . Currency ,
Amount : request . Amount ,
Type : request . Type ,
Status : models . PaymentStatusMap [ string ( yandexPayment . Status ) ] ,
Completed : false ,
RawPaymentBody : yandexPayment ,
CallbackHostGRPC : request . CallbackHostGRPC ,
} ,
RedirectURL : yandexPayment . Confirmation . ConfirmationURL ,
} , nil
}
2024-04-17 22:35:13 +00:00
func ( receiver * Yandex ) CreatePayment ( ctx context . Context , uuid string , request * models . CreatePayment [ yandex . Receipt ] ) ( * models . CreatePaymentResult , errors . Error ) {
2023-06-13 13:22:51 +00:00
yandexPayment , err := receiver . yandexPaymentClient . CreatePayment ( ctx , uuid , & yandex . CreatePaymentRequest [ yandex . PaymentMethodType ] {
Amount : yandex . Amount {
Value : utils . ConvertAmountToStringFloat ( request . Amount ) ,
Currency : request . Currency ,
} ,
2024-04-17 22:35:13 +00:00
Receipt : yandex . Receipt {
TaxSystemCode : 2 , //https://yookassa.ru/developers/payment-acceptance/receipts/54fz/other-services/parameters-values#tax-systems
Customer : request . Requisites . Customer ,
Items : request . Requisites . Items ,
} ,
2023-06-13 13:22:51 +00:00
PaymentMethodData : & yandex . PaymentMethodType { Type : models . YandexPaymentTypeMap [ request . Type ] } ,
Confirmation : & yandex . CreateConfirmationRedirect {
Type : yandex . ConfirmationTypeRedirect ,
Locale : "ru_RU" ,
ReturnURL : request . ReturnURL ,
Enforce : true ,
} ,
Capture : true ,
ClientIP : request . ClientIP ,
} )
if err != nil {
receiver . logger . Error ( "failed to create payment on <CreatePayment> of <YandexPaymentService>" , zap . Error ( err ) )
return nil , err
}
return & models . CreatePaymentResult {
Payment : & models . Payment {
UserID : request . UserID ,
PaymentID : yandexPayment . ID ,
IdempotencePaymentID : uuid ,
ClientIP : request . ClientIP ,
Currency : request . Currency ,
Amount : request . Amount ,
Type : request . Type ,
Status : models . PaymentStatusMap [ string ( yandexPayment . Status ) ] ,
Completed : false ,
RawPaymentBody : yandexPayment ,
CallbackHostGRPC : request . CallbackHostGRPC ,
} ,
RedirectURL : yandexPayment . Confirmation . ConfirmationURL ,
} , nil
}