print_service.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. import requests
  2. from logging import getLogger
  3. from config.settings import DEVELOPMENT
  4. from models.sales import OrderWeb, ItemWeb
  5. from services.data_service import DataServiceFactory
  6. from models.items import Order
  7. from enums.locations import Locations
  8. logger = getLogger(__name__)
  9. user_data_service = DataServiceFactory.get_user_service()
  10. def get_printer_url(location: Locations) -> str:
  11. if DEVELOPMENT:
  12. return "http://localhost:5005"
  13. if location == Locations.BAR:
  14. return "http://10.10.12.11:5004"
  15. elif location == Locations.COCTELERY:
  16. return "http://10.10.12.12:5004"
  17. elif location == Locations.PIZZAS:
  18. return "http://10.10.12.13:5004"
  19. else:
  20. return "http://10.10.12.14:5004"
  21. def print_order(order: Order, location:Locations ):
  22. """Send order to printer"""
  23. logger.info(f"Attempting to print order for table {order.table}")
  24. printer_url = get_printer_url(location)
  25. try:
  26. if not order.items or not order.table:
  27. error_msg = "Order must have items and a table number"
  28. logger.error(error_msg)
  29. raise ValueError(error_msg)
  30. # Prepare the order data for printing
  31. order_data = {
  32. "table": order.table,
  33. "items": [{"name": item.name, "price": item.price, "quantity": item.quantity, "comment": item.comment} for item in order.items],
  34. "customerName": order.customerName,
  35. "totalAmount": order.totalAmount,
  36. "orderDate": order.orderDate
  37. }
  38. logger.info(f"Order data prepared for printing: table={order.table}, items={order.items}, total={order.totalAmount}")
  39. # Send the order data to the printer service
  40. response = requests.post(
  41. f"{printer_url}/print",
  42. json=order_data,
  43. headers={"Authorization": f"Bearer PRINTER123cerveza@"},
  44. timeout=10
  45. )
  46. if response.status_code != 200:
  47. error_msg = f"Failed to print order: HTTP {response.status_code} - {response.text}"
  48. logger.error(error_msg)
  49. raise Exception(error_msg)
  50. logger.info(f"Order printed successfully for table {order.table}")
  51. return response.json() # Return the response from the printer service
  52. except requests.RequestException as e:
  53. error_msg = f"Network error while printing order for table {order.table}: {e}"
  54. logger.error(error_msg)
  55. raise Exception(error_msg)
  56. except Exception as e:
  57. error_msg = f"Unexpected error while printing order for table {order.table}: {e}"
  58. logger.error(error_msg)
  59. raise
  60. def print_ticket(number_table: int):
  61. """Send a ticket to the printer"""
  62. logger.info(f"Attempting to print ticket for table {number_table}")
  63. printer_url = get_printer_url(Locations.BAR)
  64. try:
  65. response = requests.get(
  66. f"{printer_url}/ticket/{number_table}",
  67. headers={"Authorization": f"Bearer PRINTER123cerveza@"},
  68. timeout=10
  69. )
  70. if response.status_code != 200:
  71. error_msg = f"Failed to print ticket for table {number_table}: HTTP {response.status_code} - {response.text}"
  72. logger.error(error_msg)
  73. raise Exception(error_msg)
  74. logger.info(f"Ticket printed successfully for table {number_table}")
  75. return response.json() # Return the response from the printer service
  76. except requests.RequestException as e:
  77. error_msg = f"Network error while printing ticket for table {number_table}: {e}"
  78. logger.error(error_msg)
  79. raise Exception(error_msg)
  80. except Exception as e:
  81. error_msg = f"Unexpected error while printing ticket for table {number_table}: {e}"
  82. logger.error(error_msg)
  83. raise
  84. def get_status(location: Locations):
  85. """Get the status of the printer service"""
  86. logger.info("Checking printer service status")
  87. printer_url = get_printer_url(location)
  88. try:
  89. response = requests.get(
  90. f"{printer_url}/status",
  91. headers={"Authorization": f"Bearer PRINTER123cerveza@"},
  92. timeout=5
  93. )
  94. data = response.json()
  95. status = data.get("printed_connected", False)
  96. logger.info(f"Printer service status: {'online' if status else 'offline'}")
  97. return bool(status)
  98. except requests.RequestException as e:
  99. error_msg = f"Error connecting to printer service: {e}"
  100. logger.error(error_msg)
  101. return False
  102. except Exception as e:
  103. error_msg = f"Unexpected error checking printer status: {e}"
  104. logger.error(error_msg)
  105. return False