h-usersite/angular/src/app/services/order.service.ts
gofnnp 00a47756b2 dev #13810
исправил баги
2023-02-28 00:13:40 +04:00

180 lines
5.1 KiB
TypeScript

import { Injectable } from '@angular/core';
import { CartService } from './cart.service';
import { WpJsonService } from './wp-json.service';
import { forkJoin, lastValueFrom, Observable, tap } from 'rxjs';
import {
Cart,
DeliveryData,
DeliveryType,
Modifier,
Product,
UserData,
} from '../interface/data';
import { Order } from '../models/order';
import { OrderProduct } from '../models/order-product';
import { JsonrpcService, RpcService } from './jsonrpc.service';
import { CookiesService } from './cookies.service';
import { MessageService } from 'primeng/api';
import { map } from 'rxjs/operators';
import { cloneDeep } from 'lodash';
import { environment } from 'src/environments/environment';
@Injectable({
providedIn: 'root',
})
export class OrderService {
private order!: Order;
constructor(
private cartService: CartService,
private wpJsonService: WpJsonService,
private jsonRpcService: JsonrpcService,
private cookiesService: CookiesService,
private messageService: MessageService
) {}
async getDeliveryTypes(): Promise<DeliveryType[]> {
return await lastValueFrom(this.wpJsonService.getDeliveryTypes());
}
async getOrder(refresh = false): Promise<Order> {
if (!this.order || refresh) {
const cart = this.cartService.getCart();
if (cart.products.length) {
const token = this.cookiesService.getItem('token') || '';
const products = await this.getProducts(cart);
// const additionalInfo = this.jsonRpcService.rpc(
// {
// method: 'getAdditionalInfo',
// params: [],
// },
// RpcService.authService,
// true
// );
const terminal =
JSON.parse(
this.cookiesService.getItem('selectedTerminal') || 'null'
) || this.cartService.selectedTerminal$;
if (!token.length) {
this.order = new Order({
products: products,
userData: null,
phone: '',
token: token,
terminal_id: terminal.id,
});
return this.order;
}
const additionalInfo = this.wpJsonService.getCustomerInfo(
environment.systemId,
token,
environment.icardProxy
);
const tokenData = this.jsonRpcService.rpc(
{
method: 'getTokenData',
params: [this.cookiesService.getItem('token')],
},
RpcService.authService,
true
);
const info = await lastValueFrom(
forkJoin([additionalInfo, tokenData, products])
);
const customer_info = info[0]?.customer_info;
this.order = new Order({
products: products,
userData: customer_info,
phone: info[1].data?.mobile_number,
token: token,
terminal_id: terminal.id,
});
} else if (this.order) {
this.order.products.length = 0;
}
}
return this.order;
}
async getProducts(cart: Cart): Promise<OrderProduct[]> {
const terminal =
JSON.parse(this.cookiesService.getItem('selectedTerminal') || 'null');
const products: OrderProduct[] = [];
if (!terminal) {
return products
}
const allData = await lastValueFrom(
this.wpJsonService.getAllData(`${terminal.label}${terminal.id}`)
);
for (let i = 0; i < cart.products.length; i++) {
const productSub = allData.products.find(
(product: any) => product.id === cart.products[i].id
);
if (!productSub) {
this.cartService.removeFromCart(cart.products[i].guid);
break;
}
const product = Object.assign(cloneDeep(cart.products[i]), {
category_id: 0,
price: productSub.price,
currency_symbol: '₽',
description: '',
short_description: '',
image_gallery: [],
image: productSub.image,
modifier_data: cart.products[i].modifiers,
stock_status: 'instock',
groupId: productSub.groupId,
modifiers_group: productSub.modifiers_group,
});
const orderProduct: OrderProduct = new OrderProduct(
product,
cart.products[i].guid,
cart.products[i].amount
);
products.push(orderProduct);
}
return products;
}
removeFromCart(productGuid: string): void {
this.order.products = this.order.products.filter(
(value) => value.guid !== productGuid
);
this.cartService.removeFromCart(productGuid);
}
setUserData(userData: UserData): void {
this.order.userData = userData;
}
setDeliveryData(deliveryData: DeliveryData): void {
this.order.deliveryData = deliveryData;
}
submit(): Observable<any> {
return this.wpJsonService
.createOrder(this.order.toJson(), environment.webhookItRetail)
.pipe(
tap({
next: (_) => {
this.jsonRpcService
.rpc(
{
method: 'updateAdditionalInfo',
params: [this.order.userData, this.order.deliveryData],
},
RpcService.authService,
true
)
.subscribe();
},
})
);
}
}