148 lines
3.9 KiB
Go
148 lines
3.9 KiB
Go
package services
|
||
|
||
import (
|
||
"context"
|
||
"encoding/json"
|
||
"fmt"
|
||
"relynolli-server/external/bitrix"
|
||
"relynolli-server/external/kassa"
|
||
"relynolli-server/external/kassa/Measure"
|
||
"relynolli-server/external/kassa/PaymentMode"
|
||
"relynolli-server/external/kassa/PaymentSubject"
|
||
"relynolli-server/external/kassa/VatCodes"
|
||
"relynolli-server/internal"
|
||
"relynolli-server/models"
|
||
"strconv"
|
||
"strings"
|
||
)
|
||
|
||
func GetTotal(fuserId int) float64 {
|
||
rdb := internal.InitRedis()
|
||
keys, _ := rdb.Keys(context.Background(), fmt.Sprintf("api.api_cart.%d.*", fuserId)).Result()
|
||
|
||
result := []models.CatalogWithQuantityWeb{}
|
||
|
||
for _, key := range keys {
|
||
str, _ := rdb.Get(context.Background(), key).Result()
|
||
item := models.CatalogWithQuantityWeb{}
|
||
|
||
json.Unmarshal([]byte(str), &item)
|
||
result = append(result, item)
|
||
}
|
||
|
||
sum := float64(0)
|
||
|
||
for _, catalogItem := range result {
|
||
sum = sum + catalogItem.Price["BASE"].(float64)*float64(catalogItem.Quantity)
|
||
}
|
||
|
||
return sum
|
||
}
|
||
|
||
type addProductsToOrderReq struct {
|
||
ProductId int `db:"product_id"`
|
||
PriceTypeId int `db:"price_type_id"`
|
||
Quantity int `db:"quantity"`
|
||
Price float64 `db:"price"`
|
||
}
|
||
|
||
func addProductsToOrder(api bitrix.Bitrix, fuserId int, orderId int) error {
|
||
//Получаем данные из корзины
|
||
|
||
cartItems := GetCartItems(fuserId)
|
||
|
||
rdb := internal.InitRedis()
|
||
rdb.Keys(context.Background(), "")
|
||
|
||
for _, product := range cartItems {
|
||
err := api.AddProductToOrder(orderId, product.Id, product.Price["BASE"].(float64), product.Quantity)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
}
|
||
return nil
|
||
|
||
}
|
||
|
||
func MakeOrder(fuserId int, email string, fullName string, phone string) (map[string]interface{}, error) {
|
||
|
||
// Инициализируем api
|
||
|
||
api := bitrix.Initialize()
|
||
|
||
// 1. Создаем анонимного пользователя
|
||
|
||
userId, _ := api.CreateAnonymousUser()
|
||
|
||
// 2. Создаем заказ
|
||
orderId, _ := api.CreateOrder(userId)
|
||
|
||
// --- обновляем контакт пользователя
|
||
order, orderErr := api.GetOrderInfo(orderId)
|
||
if orderErr != nil {
|
||
return nil, orderErr
|
||
}
|
||
clientId, _ := strconv.Atoi(order.Clients[0].EntityId)
|
||
api.UpdateContact(clientId, email, fullName, phone)
|
||
|
||
// 3. Добавляем элементы в корзину
|
||
addProductErr := addProductsToOrder(api, fuserId, orderId)
|
||
if addProductErr != nil {
|
||
return nil, addProductErr
|
||
}
|
||
|
||
// 4. Получаем обновленный ресурс заказа
|
||
order, _ = api.GetOrderInfo(orderId)
|
||
|
||
// 5. Добавляем способ оплаты товара
|
||
createPaymentError := api.CreatePayment(orderId, order.Price)
|
||
|
||
if createPaymentError != nil {
|
||
return nil, createPaymentError
|
||
}
|
||
|
||
// 6. Получаем ресурс оплаты и url для нее
|
||
paymentData, _ := kassa.CreatePayment(orderId, order.Price, fullName, email, phone, getItemsForPayment(order))
|
||
|
||
insPaymentDataStmt := fmt.Sprintf(`
|
||
insert into api_youkassa_payment (payment_id, order_id, link, status)
|
||
values ('%s',
|
||
'%s',
|
||
'%s',
|
||
'%s');
|
||
`, paymentData["id"].(string),
|
||
orderId,
|
||
paymentData["confirmation"].(map[string]interface{})["confirmation_url"].(string),
|
||
paymentData["status"].(string),
|
||
)
|
||
|
||
db := internal.InitDatabase()
|
||
|
||
db.Execute(insPaymentDataStmt)
|
||
|
||
return paymentData, nil
|
||
}
|
||
|
||
func getItemsForPayment(order *bitrix.OrderResource) []kassa.KassaReceiptItems {
|
||
result := []kassa.KassaReceiptItems{}
|
||
|
||
for _, basketItem := range order.BasketItems {
|
||
quantity, _ := strconv.Atoi(strings.Split(basketItem.Quantity, ".")[0])
|
||
item := kassa.KassaReceiptItems{
|
||
Description: basketItem.Name,
|
||
Amount: kassa.KassaAmount{
|
||
Value: fmt.Sprintf("%f", basketItem.Price),
|
||
Currency: "RUB",
|
||
},
|
||
VatCode: VatCodes.NDS_20,
|
||
Quantity: fmt.Sprintf("%d", quantity),
|
||
Measure: Measure.PIECE,
|
||
PaymentSubject: PaymentSubject.COMMODITY,
|
||
PaymentMode: PaymentMode.FULL_PAYMENT,
|
||
}
|
||
result = append(result, item)
|
||
}
|
||
|
||
return result
|
||
}
|