| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- from itertools import product
- from math import log
- import time
- from fastapi import HTTPException, APIRouter
- from fastapi.responses import JSONResponse
- from fudo import fudo
- from models.sells import OrderWeb
- from services.fudo_service import add_product_to_fudo
- from services.email_service import send_email
- from services.logging_service import log_order
- from impresora.printer import PrinterUSB
- from impresora.order import Order, Item
- from logging import getLogger
- from threading import Thread
- from services.data_service import ProductDataService, UserDataService
- from config.mails import PRINTER_DISCONNECTED_MAIL
- from config.messages import ErrorResponse, SuccessResponse, UserResponse
- logger = getLogger(__name__)
- user_data_service = UserDataService()
- product_data_service = ProductDataService()
- printer_orders = []
- order_router = APIRouter()
- @order_router.post("/send")
- async def printer_order(order: OrderWeb):
- """Process printer order"""
- logger.info("Printer order received")
- logger.info(order)
- if not PrinterUSB.check_usb_port(0xfe6, 0x811e):
- logger.error("Printer is not connected.")
- email_thread = Thread(
- target=send_email,
- args=(PRINTER_DISCONNECTED_MAIL["subject"], PRINTER_DISCONNECTED_MAIL["body"], ["erwinjacimino2003@gmail.com"]),
- daemon=True
- )
- email_thread.start()
- logger.error("Email sent to admin about printer issue.")
- return JSONResponse(status_code=424, content={"message": ErrorResponse.PRINTER_DISCONNECTED})
- items = order.items
- table = order.table
- if not items or not table:
- return JSONResponse(status_code=400, content={"message": ErrorResponse.MISSING_FIELDS})
- if not isinstance(table, int):
- return JSONResponse(status_code=400, content={"message": ErrorResponse.INVALID_TABLE_TYPE})
- # Add products to Fudo
- product_errors = []
- for item in items:
- fudo.get_token()
- # product = add_product_to_fudo(item.id, item.quantity, table)
- # if not product:
- # product_errors.append(f"Error adding product {item.id} to table {table}.")
- if product_errors:
- return JSONResponse(
- status_code=424,
- content={"message": ErrorResponse.PRODUCT_ADD_ERROR, "errors": product_errors}
- )
- user = user_data_service.get_by_id(order.customerId)
- if not user:
- return JSONResponse(status_code=404, content={"message": UserResponse.USER_NOT_FOUND.format(user_id=order.customerId)})
- products = product_data_service.get_products([item.id for item in items])
- # Print order
- printer_orders.append(Order(
- user=user.nombre if user else "Unknown User",
- items=[Item(product.name, product.price, item.quantity) for product, item in zip(products, items)]
- ))
- # Log order
- log_order(user.nombre, order.table, order_date=order.orderDate, items=[product.name for product in products])
- return JSONResponse({"message": SuccessResponse.ORDER_SUCCESS})
- def order_thread():
- """Thread to process orders"""
- logger.info("Starting order thread")
- while True:
- if printer_orders:
- order = printer_orders.pop(0)
- logger.info(f"Processing order: {order}")
- try:
- printer = PrinterUSB(0xfe6, 0x811e)
- if not printer.is_connected():
- logger.error("Printer is not connected.")
- continue
-
- # printer.print_order(order)
- logger.info(f"Order printed: {order}")
- except Exception as e:
- logger.error(f"Error printing order: {e}")
- time.sleep(1) # Sleep to avoid busy waiting
|