first commit
This commit is contained in:
353
app/mongo.py
Normal file
353
app/mongo.py
Normal file
@ -0,0 +1,353 @@
|
||||
from datetime import datetime
|
||||
|
||||
from motor import motor_asyncio
|
||||
from pymongo import ASCENDING, DESCENDING
|
||||
|
||||
from app.config import config
|
||||
from app.utils.logger_util import logger
|
||||
|
||||
asc = ASCENDING
|
||||
desc = DESCENDING
|
||||
|
||||
client = motor_asyncio.AsyncIOMotorClient(config["MONGO_URL"])
|
||||
db = client.get_database(config["MONGO_DB"])
|
||||
|
||||
users_collection = db.get_collection("users")
|
||||
|
||||
roles_collection = db.get_collection("roles")
|
||||
|
||||
clients_collection = db.get_collection("clients")
|
||||
client_pallets_collection = db.get_collection("client_pallets")
|
||||
client_boxes_collection = db.get_collection("client_boxes")
|
||||
|
||||
products_collection = db.get_collection("products")
|
||||
|
||||
services_collection = db.get_collection("services")
|
||||
service_kits_collection = db.get_collection("service_kits")
|
||||
service_types_collection = db.get_collection("service_types")
|
||||
service_categories_collection = db.get_collection("service_categories")
|
||||
|
||||
templates_collection = db.get_collection("templates")
|
||||
template_sizes_collection = db.get_collection("template_sizes")
|
||||
template_attributes_collection = db.get_collection("template_attributes")
|
||||
|
||||
shipping_warehouses_collection = db.get_collection("shipping_warehouses")
|
||||
|
||||
marketplaces_collection = db.get_collection("marketplaces")
|
||||
base_marketplaces_collection = db.get_collection("base_marketplaces")
|
||||
|
||||
deals_collection = db.get_collection("deals")
|
||||
deals_status_history_collection = db.get_collection("deals_status_history")
|
||||
|
||||
departments_collection = db.get_collection("departments")
|
||||
department_sections_collection = db.get_collection("department_sections")
|
||||
|
||||
positions_collection = db.get_collection("positions")
|
||||
|
||||
pay_rates_collection = db.get_collection("pay_rates")
|
||||
pay_rate_schemes_collection = db.get_collection("pay_rate_schemes")
|
||||
|
||||
projects_collection = db.get_collection("projects")
|
||||
|
||||
boards_collection = db.get_collection("boards")
|
||||
|
||||
statuses_collection = db.get_collection("statuses")
|
||||
|
||||
payment_records_collection = db.get_collection("payment_records")
|
||||
|
||||
tasks_collection = db.get_collection("tasks")
|
||||
|
||||
work_shifts_collection = db.get_collection("work_shifts")
|
||||
time_tracking_collection = db.get_collection("time_tracking")
|
||||
|
||||
transactions_collection = db.get_collection("transactions")
|
||||
transaction_tags_collection = db.get_collection("transaction_tags")
|
||||
|
||||
|
||||
async def migrate():
|
||||
try:
|
||||
await users_collection.create_index("id", unique=True)
|
||||
|
||||
await roles_collection.create_index("id", unique=True)
|
||||
await roles_collection.create_index("key")
|
||||
await roles_collection.create_index("name")
|
||||
|
||||
await clients_collection.create_index("id", unique=True)
|
||||
await clients_collection.create_index("name")
|
||||
await clients_collection.create_index("companyName")
|
||||
|
||||
await client_pallets_collection.create_index("id", unique=True)
|
||||
await client_pallets_collection.create_index("createdAt")
|
||||
await client_pallets_collection.create_index("clientId")
|
||||
|
||||
await client_boxes_collection.create_index("id", unique=True)
|
||||
await client_boxes_collection.create_index("createdAt")
|
||||
await client_boxes_collection.create_index("clientId")
|
||||
await client_boxes_collection.create_index("palletId")
|
||||
|
||||
await products_collection.create_index("id", unique=True)
|
||||
await products_collection.create_index("client_id")
|
||||
await products_collection.create_index("name")
|
||||
await products_collection.create_index("article")
|
||||
await products_collection.create_index("factoryArticle")
|
||||
await products_collection.create_index("barcodes")
|
||||
|
||||
await services_collection.create_index("id", unique=True)
|
||||
await services_collection.create_index("name")
|
||||
await services_collection.create_index("price")
|
||||
await services_collection.create_index("serviceType")
|
||||
|
||||
await service_types_collection.create_index("id", unique=True)
|
||||
await service_types_collection.create_index("name")
|
||||
|
||||
await service_categories_collection.create_index("id", unique=True)
|
||||
await service_categories_collection.create_index("name")
|
||||
|
||||
await service_kits_collection.create_index("id", unique=True)
|
||||
await service_kits_collection.create_index("name")
|
||||
|
||||
await templates_collection.create_index("id", unique=True)
|
||||
await templates_collection.create_index("name")
|
||||
|
||||
await template_sizes_collection.create_index("id", unique=True)
|
||||
await template_sizes_collection.create_index("key")
|
||||
await template_sizes_collection.create_index("name")
|
||||
await template_sizes_collection.create_index("height")
|
||||
await template_sizes_collection.create_index("width")
|
||||
|
||||
await template_attributes_collection.create_index("id", unique=True)
|
||||
await template_attributes_collection.create_index("key")
|
||||
await template_attributes_collection.create_index("name")
|
||||
|
||||
await shipping_warehouses_collection.create_index("id", unique=True)
|
||||
await shipping_warehouses_collection.create_index("name")
|
||||
|
||||
await marketplaces_collection.create_index("id", unique=True)
|
||||
await marketplaces_collection.create_index("name")
|
||||
await marketplaces_collection.create_index("clientId")
|
||||
await marketplaces_collection.create_index("client.id")
|
||||
|
||||
await base_marketplaces_collection.create_index("id", unique=True)
|
||||
await base_marketplaces_collection.create_index("key")
|
||||
await base_marketplaces_collection.create_index("name")
|
||||
|
||||
await deals_collection.create_index("id", unique=True)
|
||||
await deals_collection.create_index("name")
|
||||
await deals_collection.create_index("createdAt")
|
||||
|
||||
await department_sections_collection.create_index("id", unique=True)
|
||||
await department_sections_collection.create_index("departmentId")
|
||||
await department_sections_collection.create_index("name")
|
||||
await department_sections_collection.create_index("parentDepartmentSectionId")
|
||||
|
||||
await positions_collection.create_index("id", unique=True)
|
||||
await positions_collection.create_index("key")
|
||||
await positions_collection.create_index("name")
|
||||
|
||||
await pay_rates_collection.create_index("id", unique=True)
|
||||
await pay_rates_collection.create_index("name")
|
||||
|
||||
await projects_collection.create_index("id", unique=True)
|
||||
await projects_collection.create_index("name")
|
||||
|
||||
await boards_collection.create_index("id", unique=True)
|
||||
await boards_collection.create_index("name")
|
||||
await boards_collection.create_index("projectId")
|
||||
|
||||
await statuses_collection.create_index("id", unique=True)
|
||||
await statuses_collection.create_index("name")
|
||||
await statuses_collection.create_index("boardId")
|
||||
|
||||
await payment_records_collection.create_index("id", unique=True)
|
||||
await payment_records_collection.create_index("createdAt")
|
||||
|
||||
await tasks_collection.create_index("taskId", unique=True)
|
||||
await tasks_collection.create_index("status")
|
||||
await tasks_collection.create_index("marketplaceId")
|
||||
await tasks_collection.create_index("createdAt")
|
||||
|
||||
await work_shifts_collection.create_index("id", unique=True)
|
||||
except Exception as e:
|
||||
logger.debug(e)
|
||||
|
||||
|
||||
async def get_next_id(collection) -> int:
|
||||
last_id = 1
|
||||
try:
|
||||
last = await collection.find({}).sort("id", desc).limit(1).to_list()
|
||||
last_id = last[0]["id"] + 1
|
||||
finally:
|
||||
return last_id
|
||||
|
||||
|
||||
def created_at(date: datetime = None, format: str = "%Y-%m-%dT%H:%M:%S"):
|
||||
if not date:
|
||||
date = datetime.now()
|
||||
|
||||
return date.strftime(format)
|
||||
|
||||
|
||||
async def get_deals_total_prices(*deals: dict) -> dict:
|
||||
results = {}
|
||||
for deal in deals:
|
||||
total_price = 0
|
||||
|
||||
for service in deal.get("services", []):
|
||||
total_price += service.get("price", 0) * service.get("quantity", 1)
|
||||
|
||||
for product in deal.get("products", []):
|
||||
for service in product.get("services", []):
|
||||
total_price += service.get("price", 0) * service.get("quantity", 1) * product.get("quantity", 1)
|
||||
|
||||
results[deal["id"]] = total_price
|
||||
|
||||
return results
|
||||
|
||||
|
||||
async def additional_deals_data(*deals: dict, full: bool):
|
||||
client_names = {deal["clientName"] for deal in deals}
|
||||
service_ids = set()
|
||||
product_ids = set()
|
||||
user_ids = set()
|
||||
|
||||
for deal in deals:
|
||||
for service in deal.get("services", []):
|
||||
service_ids.add(service["serviceId"])
|
||||
for product in deal.get("products", []):
|
||||
product_ids.add(product["productId"])
|
||||
for service in product.get("services", []):
|
||||
service_ids.add(service["serviceId"])
|
||||
for employee in deal.get("employees", []):
|
||||
user_ids.add(employee["userId"])
|
||||
|
||||
for history in deal.get("statusHistory", []):
|
||||
if "userId" in history:
|
||||
user_ids.add(history["userId"])
|
||||
|
||||
projects = {
|
||||
project["id"]: project async for project in projects_collection.find({}, {"_id": False})
|
||||
}
|
||||
|
||||
boards = {
|
||||
board["id"]: board async for board in boards_collection.find({}, {"_id": False})
|
||||
}
|
||||
|
||||
statuses = {
|
||||
status["id"]: status async for status in statuses_collection.find({}, {"_id": False})
|
||||
}
|
||||
|
||||
clients = {
|
||||
client["name"]: client async for client in clients_collection.find(
|
||||
{"name": {"$in": list(client_names)}}, {"_id": False}
|
||||
)
|
||||
}
|
||||
|
||||
products = {}
|
||||
if full:
|
||||
products = {
|
||||
product["id"]: product async for product in products_collection.find(
|
||||
{"id": {"$in": list(product_ids)}}, {"_id": False}
|
||||
)
|
||||
}
|
||||
|
||||
services = {}
|
||||
if full:
|
||||
services = {
|
||||
service["id"]: service async for service in services_collection.find(
|
||||
{"id": {"$in": list(service_ids)}}, {"_id": False}
|
||||
)
|
||||
}
|
||||
|
||||
users = {}
|
||||
if full:
|
||||
users = {
|
||||
user["id"]: user async for user in users_collection.find(
|
||||
{"id": {"$in": list(user_ids)}}, {"_id": False}
|
||||
)
|
||||
}
|
||||
|
||||
for deal in deals:
|
||||
deal["shipmentWarehouseName"] = deal["shippingWarehouse"]
|
||||
deal["shippingWarehouse"] = {"name": deal["shippingWarehouse"]}
|
||||
|
||||
deal["status"] = statuses.get(deal["statusId"])
|
||||
deal["board"] = boards.get(deal["boardId"])
|
||||
deal["project"] = projects.get(deal["board"]["projectId"])
|
||||
|
||||
deal["board"]["project"] = projects.get(deal["board"]["projectId"])
|
||||
deal["board"]["dealStatuses"] = [status for status in statuses.values() if status["boardId"] == deal["boardId"]]
|
||||
|
||||
deal["client"] = clients.get(deal["clientName"], {})
|
||||
if deal["client"]:
|
||||
deal["clientId"] = deal["client"]["id"]
|
||||
|
||||
total_price = 0
|
||||
total_products = 0
|
||||
|
||||
enriched_services = []
|
||||
for service in deal.get("services", []):
|
||||
if full:
|
||||
service["service"] = services.get(service["serviceId"])
|
||||
enriched_services.append(service)
|
||||
total_price += service.get("price", 0) * service.get("quantity", 1)
|
||||
deal["services"] = enriched_services
|
||||
|
||||
enriched_products = []
|
||||
for product in deal.get("products", []):
|
||||
if full:
|
||||
product["product"] = products.get(product["productId"])
|
||||
|
||||
enriched_services = []
|
||||
for service in product.get("services", []):
|
||||
if full:
|
||||
service["service"] = services.get(service["serviceId"])
|
||||
enriched_services.append(service)
|
||||
total_price += service.get("price", 0) * service.get("quantity", 1) * product.get("quantity", 1)
|
||||
|
||||
product["services"] = enriched_services
|
||||
enriched_products.append(product)
|
||||
|
||||
total_products += product.get("quantity", 1)
|
||||
|
||||
deal["products"] = enriched_products
|
||||
|
||||
enriched_employees = []
|
||||
for employee in deal.get("employees", []):
|
||||
if full:
|
||||
employee["user"] = users.get(employee["userId"])
|
||||
enriched_employees.append(employee)
|
||||
deal["employees"] = enriched_employees
|
||||
|
||||
enriched_history = []
|
||||
for history in deal.get("statusHistory", []):
|
||||
if full:
|
||||
history["user"] = users.get(history.get("userId"))
|
||||
history["fromStatus"] = statuses.get(history.get("fromStatusId"))
|
||||
history["toStatus"] = statuses.get(history.get("toStatusId"))
|
||||
enriched_history.append(history)
|
||||
deal["statusHistory"] = enriched_history
|
||||
|
||||
deal["totalPrice"] = total_price
|
||||
deal["totalProducts"] = total_products
|
||||
|
||||
return deals
|
||||
|
||||
|
||||
async def get_all_summaries(full: bool):
|
||||
deals = await deals_collection.find({
|
||||
"$and": [
|
||||
{
|
||||
"$or": [
|
||||
{"isDeleted": False},
|
||||
{"isDeleted": {"$exists": False}}
|
||||
]
|
||||
},
|
||||
{
|
||||
"$or": [
|
||||
{"isCompleted": False},
|
||||
{"isCompleted": {"$exists": False}}
|
||||
]
|
||||
}
|
||||
]
|
||||
}, {"_id": False}).sort("id", asc).to_list()
|
||||
return await additional_deals_data(*deals, full=full)
|
||||
Reference in New Issue
Block a user