140 lines
4.6 KiB
Python
140 lines
4.6 KiB
Python
from time import time
|
|
|
|
from fastapi import APIRouter
|
|
|
|
from app import mongo
|
|
from app.utils.response_util import response
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
@router.post("/add")
|
|
async def add_service(params: dict):
|
|
start_time = time()
|
|
|
|
deal_id = params["dealId"]
|
|
service_data = {
|
|
"serviceId": params["serviceId"],
|
|
"quantity": params["quantity"],
|
|
"price": params["price"]
|
|
}
|
|
|
|
deal = await mongo.deals_collection.find_one({"id": deal_id})
|
|
if not deal:
|
|
return response({"message": "Сделка не найдена", "ok": False}, start_time=start_time)
|
|
|
|
services = deal.get("services", [])
|
|
services.append(service_data)
|
|
|
|
await mongo.deals_collection.update_one({"id": deal_id}, {"$set": {"services": services}})
|
|
return response({
|
|
"message": "Услуга добавлена к сделке",
|
|
"ok": True
|
|
}, start_time=start_time)
|
|
|
|
|
|
@router.post("/update")
|
|
async def update_service(params: dict):
|
|
start_time = time()
|
|
|
|
deal_id = params["dealId"]
|
|
service_id = params["service"]["serviceId"]
|
|
|
|
deal = await mongo.deals_collection.find_one({"id": deal_id})
|
|
if not deal:
|
|
return response({"message": "Сделка не найдена", "ok": False}, start_time=start_time)
|
|
|
|
services = deal.get("services", [])
|
|
for service in services:
|
|
if service["serviceId"] == service_id:
|
|
for key, value in params["service"].items():
|
|
service[key] = value
|
|
break
|
|
|
|
await mongo.deals_collection.update_one({"id": deal_id}, {"$set": {"services": services}})
|
|
return response({
|
|
"message": "Услуга обновлена в сделке",
|
|
"ok": True
|
|
}, start_time=start_time)
|
|
|
|
|
|
@router.post("/delete")
|
|
async def delete_service(params: dict):
|
|
start_time = time()
|
|
|
|
deal_id = params["dealId"]
|
|
service_id = params["serviceId"]
|
|
|
|
deal = await mongo.deals_collection.find_one({"id": deal_id})
|
|
if not deal:
|
|
return response({"message": "Сделка не найдена", "ok": False}, start_time=start_time)
|
|
|
|
services = deal.get("services", [])
|
|
updated_services = [service for service in services if service["serviceId"] != service_id]
|
|
|
|
await mongo.deals_collection.update_one({"id": deal_id}, {"$set": {"services": updated_services}})
|
|
return response({
|
|
"message": "Услуга удалена из сделки",
|
|
"ok": True
|
|
}, start_time=start_time)
|
|
|
|
|
|
@router.post("/copy")
|
|
async def copy_services(params: dict):
|
|
start_time = time()
|
|
|
|
deal_id = params["dealId"]
|
|
source_product_id = params["sourceProductId"]
|
|
destination_product_ids = params["destinationProductIds"]
|
|
|
|
deal = await mongo.deals_collection.find_one({"id": deal_id})
|
|
if not deal:
|
|
return response({
|
|
"message": "Сделка не найдена",
|
|
"ok": False
|
|
}, start_time=start_time)
|
|
|
|
products = deal.get("products", [])
|
|
source_product_services = []
|
|
|
|
for product in products:
|
|
if product["productId"] == source_product_id:
|
|
source_product_services = product.get("services", [])
|
|
break
|
|
|
|
source_services_map = {s["serviceId"]: s for s in source_product_services}
|
|
service_quantities = {}
|
|
|
|
for product in products:
|
|
if product["productId"] in destination_product_ids:
|
|
new_services = []
|
|
for service_id, service in source_services_map.items():
|
|
new_service = service.copy()
|
|
new_services.append(new_service)
|
|
service_quantities[service_id] = service_quantities.get(service_id, 0) + product["quantity"]
|
|
product["services"] = new_services
|
|
|
|
for service_id, total_quantity in service_quantities.items():
|
|
service_data = await mongo.services_collection.find_one({"id": service_id})
|
|
if not service_data or "priceRanges" not in service_data:
|
|
continue
|
|
|
|
price_ranges = sorted(service_data["priceRanges"], key=lambda x: x["fromQuantity"])
|
|
new_price = None
|
|
|
|
for price_range in price_ranges:
|
|
if total_quantity >= price_range["fromQuantity"]:
|
|
new_price = price_range["price"]
|
|
|
|
if new_price is not None:
|
|
for product in products:
|
|
for service in product.get("services", []):
|
|
if service["serviceId"] == service_id and not service.get("isFixedPrice", False):
|
|
service["price"] = new_price
|
|
|
|
await mongo.deals_collection.update_one({"id": deal_id}, {"$set": {"products": products}})
|
|
return response({
|
|
"message": "Услуги скопированы и обновлены",
|
|
"ok": True
|
|
}, start_time=start_time)
|