relynolli-server/services/order.go

148 lines
3.9 KiB
Go
Raw Normal View History

2024-03-15 21:27:45 +03:00
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
}