print_service.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  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 location == Locations.KITCHEN:
  12. return "http://localhost:6002"
  13. elif location == Locations.COCTELERY:
  14. return "http://localhost:6004"
  15. else:
  16. return "http://localhost:6000"
  17. def print_order(order: Order, location:Locations ):
  18. """Send order to printer"""
  19. logger.info(f"Attempting to print order for table {order.table}")
  20. # match location:
  21. # case Locations.BAR:
  22. # printer_url = "http://localhost:6000"
  23. # case Locations.KITCHEN:
  24. # printer_url = "http://localhost:6002"
  25. # case Locations.COCTELERY:
  26. # printer_url = "http://localhost:6004"
  27. printer_url = get_printer_url(location)
  28. try:
  29. if not order.items or not order.table:
  30. error_msg = "Order must have items and a table number"
  31. logger.error(error_msg)
  32. raise ValueError(error_msg)
  33. # Prepare the order data for printing
  34. order_data = {
  35. "table": order.table,
  36. "items": [{"name": item.name, "price": item.price, "quantity": item.quantity} for item in order.items],
  37. "customerName": order.customerName,
  38. "totalAmount": order.totalAmount,
  39. "orderDate": order.orderDate
  40. }
  41. logger.info(f"Order data prepared for printing: table={order.table}, items={len(order.items)}, total={order.totalAmount}")
  42. # Send the order data to the printer service
  43. response = requests.post(
  44. f"{printer_url}/print",
  45. json=order_data,
  46. headers={"Authorization": f"Bearer PRINTER123cerveza@"},
  47. timeout=10
  48. )
  49. if response.status_code != 200:
  50. error_msg = f"Failed to print order: HTTP {response.status_code} - {response.text}"
  51. logger.error(error_msg)
  52. raise Exception(error_msg)
  53. logger.info(f"Order printed successfully for table {order.table}")
  54. return response.json() # Return the response from the printer service
  55. except requests.RequestException as e:
  56. error_msg = f"Network error while printing order for table {order.table}: {e}"
  57. logger.error(error_msg)
  58. raise Exception(error_msg)
  59. except Exception as e:
  60. error_msg = f"Unexpected error while printing order for table {order.table}: {e}"
  61. logger.error(error_msg)
  62. raise
  63. def print_ticket(number_table: int):
  64. """Send a ticket to the printer"""
  65. logger.info(f"Attempting to print ticket for table {number_table}")
  66. printer_url = get_printer_url(Locations.BAR)
  67. try:
  68. response = requests.get(
  69. f"{printer_url}/ticket/{number_table}",
  70. headers={"Authorization": f"Bearer PRINTER123cerveza@"},
  71. timeout=10
  72. )
  73. if response.status_code != 200:
  74. error_msg = f"Failed to print ticket for table {number_table}: HTTP {response.status_code} - {response.text}"
  75. logger.error(error_msg)
  76. raise Exception(error_msg)
  77. logger.info(f"Ticket printed successfully for table {number_table}")
  78. return response.json() # Return the response from the printer service
  79. except requests.RequestException as e:
  80. error_msg = f"Network error while printing ticket for table {number_table}: {e}"
  81. logger.error(error_msg)
  82. raise Exception(error_msg)
  83. except Exception as e:
  84. error_msg = f"Unexpected error while printing ticket for table {number_table}: {e}"
  85. logger.error(error_msg)
  86. raise
  87. def get_status(location: Locations):
  88. """Get the status of the printer service"""
  89. logger.info("Checking printer service status")
  90. printer_url = get_printer_url(location)
  91. try:
  92. response = requests.get(
  93. f"{printer_url}/status",
  94. headers={"Authorization": f"Bearer PRINTER123cerveza@"},
  95. timeout=5
  96. )
  97. data = response.json()
  98. status = data.get("status", False)
  99. logger.info(f"Printer service status: {'online' if status else 'offline'}")
  100. return status
  101. except requests.RequestException as e:
  102. error_msg = f"Error connecting to printer service: {e}"
  103. logger.error(error_msg)
  104. raise Exception(error_msg)
  105. except Exception as e:
  106. error_msg = f"Unexpected error checking printer status: {e}"
  107. logger.error(error_msg)
  108. raise Exception(error_msg)