package payment import ( "context" "go.uber.org/zap" "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" ) 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 ", errors.ErrInvalidArgs) } if deps.YandexPaymentClient == nil { return nil, errors.NewWithMessage("YandexPaymentClient is nil on ", errors.ErrInvalidArgs) } return &Yandex{ logger: deps.Logger, yandexPaymentClient: deps.YandexPaymentClient, }, nil } func (s *Yandex) CreatePaymentBankCard(ctx context.Context, uuid string, request *models.CreatePayment[yandex.Receipt]) (*models.CreatePaymentResult, errors.Error) { s.logger.Info("f of ", zap.Any("Customer", request.Requisites.Customer), zap.Any("Items",request.Requisites.Items)) yandexPayment, err := s.yandexPaymentClient.CreatePaymentBankCard(ctx, uuid, &yandex.CreatePaymentRequest[yandex.PaymentMethodBankCard]{ Amount: yandex.Amount{ Value: utils.ConvertAmountToStringFloat(request.Amount), Currency: request.Currency, }, Description: "Пополнение пользовательского баланса платформы Pena Hub", 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, }, 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 { s.logger.Error("failed to create payment on of ", 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 } func (s *Yandex) CreatePayment(ctx context.Context, uuid string, request *models.CreatePayment[yandex.Receipt]) (*models.CreatePaymentResult, errors.Error) { yandexPayment, err := s.yandexPaymentClient.CreatePayment(ctx, uuid, &yandex.CreatePaymentRequest[yandex.PaymentMethodType]{ Amount: yandex.Amount{ Value: utils.ConvertAmountToStringFloat(request.Amount), Currency: request.Currency, }, 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, }, 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 { s.logger.Error("failed to create payment on of ", 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 }