orders.py 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. from itertools import product
  2. from math import log
  3. import time
  4. from fastapi import HTTPException, APIRouter
  5. from fastapi.responses import JSONResponse
  6. from fudo import fudo
  7. from models.sales import OrderWeb
  8. from services.fudo_service import add_product_to_fudo
  9. from services.email_service import send_email
  10. from services.logging_service import log_order
  11. from impresora.printer import PrinterUSB
  12. from impresora.order import Order, Item
  13. from logging import getLogger
  14. from threading import Thread
  15. from services.data_service import ProductDataService, UserDataService
  16. from config.mails import PRINTER_DISCONNECTED_MAIL
  17. from config.messages import ErrorResponse, SuccessResponse, UserResponse
  18. logger = getLogger(__name__)
  19. user_data_service = UserDataService()
  20. product_data_service = ProductDataService()
  21. printer_orders = []
  22. order_router = APIRouter()
  23. @order_router.post("/send")
  24. async def printer_order(order: OrderWeb):
  25. """Process printer order"""
  26. logger.info("Printer order received")
  27. logger.info(order)
  28. if not PrinterUSB.check_usb_port(0xfe6, 0x811e):
  29. logger.error("Printer is not connected.")
  30. email_thread = Thread(
  31. target=send_email,
  32. args=(PRINTER_DISCONNECTED_MAIL["subject"], PRINTER_DISCONNECTED_MAIL["body"], ["erwinjacimino2003@gmail.com"]),
  33. daemon=True
  34. )
  35. email_thread.start()
  36. logger.error("Email sent to admin about printer issue.")
  37. return JSONResponse(status_code=424, content={"message": ErrorResponse.PRINTER_DISCONNECTED})
  38. items = order.items
  39. table = order.table
  40. if not items or not table:
  41. return JSONResponse(status_code=400, content={"message": ErrorResponse.MISSING_FIELDS})
  42. if not isinstance(table, int):
  43. return JSONResponse(status_code=400, content={"message": ErrorResponse.INVALID_TABLE_TYPE})
  44. # Add products to Fudo
  45. product_errors = []
  46. for item in items:
  47. fudo.get_token()
  48. # product = add_product_to_fudo(item.id, item.quantity, table)
  49. # if not product:
  50. # product_errors.append(f"Error adding product {item.id} to table {table}.")
  51. if product_errors:
  52. return JSONResponse(
  53. status_code=424,
  54. content={"message": ErrorResponse.PRODUCT_ADD_ERROR, "errors": product_errors}
  55. )
  56. user = user_data_service.get_by_id(order.customerId)
  57. if not user:
  58. return JSONResponse(status_code=404, content={"message": UserResponse.USER_NOT_FOUND.format(user_id=order.customerId)})
  59. products = product_data_service.get_products([item.id for item in items])
  60. # Print order
  61. printer_orders.append(Order(
  62. user=user.nombre if user else "Unknown User",
  63. items=[Item(product.name, product.price, item.quantity) for product, item in zip(products, items)]
  64. ))
  65. # Log order
  66. log_order(user.nombre, order.table, order_date=order.orderDate, items=[product.name for product in products])
  67. return JSONResponse({"message": SuccessResponse.ORDER_SUCCESS})
  68. def order_thread():
  69. """Thread to process orders"""
  70. logger.info("Starting order thread")
  71. while True:
  72. if printer_orders:
  73. order = printer_orders.pop(0)
  74. logger.info(f"Processing order: {order}")
  75. try:
  76. printer = PrinterUSB(0xfe6, 0x811e)
  77. if not printer.is_connected():
  78. logger.error("Printer is not connected.")
  79. continue
  80. # printer.print_order(order)
  81. logger.info(f"Order printed: {order}")
  82. except Exception as e:
  83. logger.error(f"Error printing order: {e}")
  84. time.sleep(1) # Sleep to avoid busy waiting