print_service.py 5.1 KB

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