first commit
This commit is contained in:
139
app/api/v1/deal/services.py
Normal file
139
app/api/v1/deal/services.py
Normal file
@ -0,0 +1,139 @@
|
||||
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)
|
||||
Reference in New Issue
Block a user