print_service.py 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  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, OrderBilling
  8. from enums.locations import Locations
  9. logger = getLogger(__name__)
  10. user_data_service = DataServiceFactory.get_user_service()
  11. def get_printer_url() -> str:
  12. if DEVELOPMENT:
  13. return "http://10.10.12.3:8000"
  14. else:
  15. return "http://10.10.12.3:8000"
  16. def print_order(order: Order):
  17. """Send order to printer"""
  18. logger.info(f"Attempting to print order for table {order.table}")
  19. printer_url = get_printer_url()
  20. try:
  21. if not order.items or not order.table:
  22. error_msg = "Order must have items and a table number"
  23. logger.error(error_msg)
  24. raise ValueError(error_msg)
  25. # Prepare the order data for printing
  26. order_data = {
  27. "table": order.table,
  28. "items": [{"name": item.name, "price": item.price, "quantity": item.quantity, "comment": item.comment, "kitchen_id": item.kitchen_id} for item in order.items],
  29. "user": order.customerName,
  30. "totalAmount": order.totalAmount,
  31. "orderDate": order.orderDate
  32. }
  33. logger.info(f"Order data prepared for printing: table={order.table}, items={order.items}, total={order.totalAmount}")
  34. # Send the order data to the printer service
  35. response = requests.post(
  36. f"{printer_url}/print",
  37. json=order_data,
  38. headers={"Authorization": f"Bearer PRINTER123cerveza@"},
  39. timeout=10
  40. )
  41. if response.status_code != 200:
  42. error_msg = f"Failed to print order: HTTP {response.status_code} - {response.text}"
  43. logger.error(error_msg)
  44. raise Exception(error_msg)
  45. logger.info(f"Order printed successfully for table {order.table}")
  46. return response.json() # Return the response from the printer service
  47. except requests.RequestException as e:
  48. error_msg = f"Network error while printing order for table {order.table}: {e}"
  49. logger.error(error_msg)
  50. raise Exception(error_msg)
  51. except Exception as e:
  52. error_msg = f"Unexpected error while printing order for table {order.table}: {e}"
  53. logger.error(error_msg)
  54. raise
  55. def print_ticket(number_table: int):
  56. """Send a ticket to the printer"""
  57. logger.info(f"Attempting to print ticket for table {number_table}")
  58. printer_url = get_printer_url()
  59. try:
  60. response = requests.get(
  61. f"{printer_url}/ticket/{number_table}",
  62. headers={"Authorization": f"Bearer PRINTER123cerveza@"},
  63. timeout=10
  64. )
  65. if response.status_code != 200:
  66. error_msg = f"Failed to print ticket for table {number_table}: HTTP {response.status_code} - {response.text}"
  67. logger.error(error_msg)
  68. raise Exception(error_msg)
  69. logger.info(f"Ticket printed successfully for table {number_table}")
  70. return response.json() # Return the response from the printer service
  71. except requests.RequestException as e:
  72. error_msg = f"Network error while printing ticket for table {number_table}: {e}"
  73. logger.error(error_msg)
  74. raise Exception(error_msg)
  75. except Exception as e:
  76. error_msg = f"Unexpected error while printing ticket for table {number_table}: {e}"
  77. logger.error(error_msg)
  78. raise
  79. def print_billing(order: OrderBilling):
  80. """Send billing order to printer"""
  81. logger.info(f"Attempting to print billing order for table {order.table}")
  82. printer_url = get_printer_url()
  83. try:
  84. if not order.table:
  85. error_msg = "Order must have a table number"
  86. logger.error(error_msg)
  87. raise ValueError(error_msg)
  88. logger.info(f"Order data prepared for printing: table={order.table}, payment={order.payment}")
  89. # Send the order data to the printer service
  90. response = requests.get(
  91. f"{printer_url}/billing/{order.table}/{order.payment}",
  92. headers={"Authorization": f"Bearer PRINTER123cerveza@"},
  93. timeout=1000
  94. )
  95. if response.status_code != 200:
  96. error_msg = f"Failed to print billing order: HTTP {response.status_code} - {response.text}"
  97. logger.error(error_msg)
  98. raise Exception(error_msg)
  99. logger.info(f"Billing order printed successfully for table {order.table}")
  100. return True
  101. except requests.RequestException as e:
  102. error_msg = f"Network error while printing billing order for table {order.table}: {e}"
  103. logger.error(error_msg)
  104. raise Exception(error_msg)
  105. def get_status(location: Locations):
  106. """Get the status of the printer service"""
  107. logger.info("Checking printer service status")
  108. printer_url = get_printer_url()
  109. try:
  110. response = requests.get(
  111. f"{printer_url}/status",
  112. headers={"Authorization": f"Bearer PRINTER123cerveza@"},
  113. timeout=10
  114. )
  115. data = response.json()
  116. status = data.get("printer_connected", False)
  117. logger.info(f"Printer service status: {'online' if status else 'offline'}")
  118. return bool(status)
  119. except requests.RequestException as e:
  120. error_msg = f"Error connecting to printer service: {e}"
  121. logger.error(error_msg)
  122. return False
  123. except Exception as e:
  124. error_msg = f"Unexpected error checking printer status: {e}"
  125. logger.error(error_msg)
  126. return False