orders.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. from threading import Thread
  2. from math import log
  3. import time
  4. from uuid import uuid4
  5. from fastapi import HTTPException, APIRouter
  6. from fastapi.responses import JSONResponse
  7. from fudo import fudo
  8. from models.sales import ItemWeb, OrderWeb
  9. from services.fudo_service import add_product_to_fudo
  10. from services.email_service import send_email
  11. from services.logging_service import log_order
  12. import services.print_service as ps
  13. from logging import getLogger
  14. from services.data_service import DataServiceFactory
  15. from config.mails import PRINTER_DISCONNECTED_MAIL
  16. from config.messages import ErrorResponse, SuccessResponse, UserResponse
  17. from config.settings import DEVELOPMENT
  18. from models.items import Item, Order
  19. logger = getLogger(__name__)
  20. user_data_service = DataServiceFactory.get_user_service()
  21. product_data_service = DataServiceFactory.get_product_service()
  22. sale_data_service = DataServiceFactory.get_sales_service()
  23. printer_orders = []
  24. order_router = APIRouter()
  25. @order_router.post("/send")
  26. async def printer_order(order: OrderWeb):
  27. """Process printer order"""
  28. logger.info("Printer order received")
  29. logger.info(order)
  30. if not DEVELOPMENT:
  31. if not ps.get_status():
  32. logger.error("Printer is not connected.")
  33. email_thread = Thread(
  34. target=send_email,
  35. args=(PRINTER_DISCONNECTED_MAIL["subject"], PRINTER_DISCONNECTED_MAIL["body"], ["erwinjacimino2003@gmail.com"]),
  36. daemon=True
  37. )
  38. email_thread.start()
  39. logger.error("Email sent to admin about printer issue.")
  40. return JSONResponse(status_code=424, content={"message": ErrorResponse.PRINTER_DISCONNECTED})
  41. items = order.items
  42. table = order.table
  43. if not items or not table:
  44. return JSONResponse(status_code=400, content={"message": ErrorResponse.MISSING_FIELDS})
  45. if not isinstance(table, int):
  46. return JSONResponse(status_code=400, content={"message": ErrorResponse.INVALID_TABLE_TYPE})
  47. # Add products to Fudo
  48. product_errors = []
  49. for item in items:
  50. fudo.get_token()
  51. product = add_product_to_fudo(item.id, item.quantity, table)
  52. if not product:
  53. product_errors.append(f"Error adding product {item.id} to table {table}.")
  54. if product_errors:
  55. return JSONResponse(
  56. status_code=424,
  57. content={"message": ErrorResponse.PRODUCT_ADD_ERROR, "errors": product_errors}
  58. )
  59. user = user_data_service.get_by_id(order.customerId)
  60. if not user:
  61. return JSONResponse(status_code=404, content={"message": UserResponse.USER_NOT_FOUND.format(user_id=order.customerId)})
  62. active_sale_id = fudo.get_active_sale(fudo.get_table(table))
  63. if not active_sale_id:
  64. logger.error(f"Error: No active sale found for table {table}.")
  65. raise HTTPException(status_code=404)
  66. active_sale_id = active_sale_id['id']
  67. products = product_data_service.get_products([item.id for item in items])
  68. sale = sale_data_service.create(
  69. order.customerId,
  70. active_sale_id or uuid4().hex,
  71. order.totalAmount,
  72. order.table,
  73. [item.id for item in items],
  74. [item.quantity for item in items]
  75. )
  76. logger.info(f"Sale created: {sale}")
  77. ps.print_order(
  78. Order(
  79. table=table,
  80. items=[Item(name=product.name, price=product.price or 0, quantity=item.quantity) for product, item in zip(products, items)],
  81. customerName=user.name,
  82. totalAmount=order.totalAmount,
  83. orderDate=order.orderDate
  84. )
  85. )
  86. # Log order
  87. log_order(user.name, order.table, order_date=order.orderDate, items=[product.name for product in products])
  88. return JSONResponse({"message": SuccessResponse.ORDER_SUCCESS})