print_service.py 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  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 services.logging_service import structured_logger, LogLevel
  8. logger = getLogger(__name__)
  9. user_data_service = DataServiceFactory.get_user_service()
  10. if DEVELOPMENT:
  11. printer_url = "http://localhost:5005/"
  12. else:
  13. printer_url = "http://localhost:5004/"
  14. def print_order(order: Order):
  15. """Send order to printer"""
  16. logger.info(f"Attempting to print order for table {order.table}")
  17. try:
  18. if not order.items or not order.table:
  19. error_msg = "Order must have items and a table number"
  20. logger.error(error_msg)
  21. structured_logger.log_print_event(
  22. f"Print order validation failed: {error_msg}",
  23. LogLevel.ERROR,
  24. {"table": order.table, "items_count": len(order.items) if order.items else 0}
  25. )
  26. raise ValueError(error_msg)
  27. # Prepare the order data for printing
  28. order_data = {
  29. "table": order.table,
  30. "items": [{"name": item.name, "price": item.price, "quantity": item.quantity} for item in order.items],
  31. "customerName": order.customerName,
  32. "totalAmount": order.totalAmount,
  33. "orderDate": order.orderDate
  34. }
  35. logger.info(f"Order data prepared for printing: table={order.table}, items={len(order.items)}, total={order.totalAmount}")
  36. structured_logger.log_print_event(
  37. f"Sending order to printer for table {order.table}",
  38. LogLevel.INFO,
  39. {
  40. "table": order.table,
  41. "items_count": len(order.items),
  42. "total_amount": order.totalAmount,
  43. "customer_name": order.customerName
  44. }
  45. )
  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. structured_logger.log_print_event(
  57. f"Print order failed for table {order.table}",
  58. LogLevel.ERROR,
  59. {
  60. "table": order.table,
  61. "status_code": response.status_code,
  62. "error_message": response.text,
  63. "printer_url": printer_url
  64. }
  65. )
  66. raise Exception(error_msg)
  67. logger.info(f"Order printed successfully for table {order.table}")
  68. structured_logger.log_print_event(
  69. f"Order printed successfully for table {order.table}",
  70. LogLevel.INFO,
  71. {
  72. "table": order.table,
  73. "response": response.json() if response.headers.get('content-type', '').startswith('application/json') else str(response.text)
  74. }
  75. )
  76. return response.json() # Return the response from the printer service
  77. except requests.RequestException as e:
  78. error_msg = f"Network error while printing order for table {order.table}: {e}"
  79. logger.error(error_msg)
  80. structured_logger.log_print_event(
  81. f"Network error during print for table {order.table}",
  82. LogLevel.ERROR,
  83. {
  84. "table": order.table,
  85. "error": str(e),
  86. "printer_url": printer_url
  87. }
  88. )
  89. raise Exception(error_msg)
  90. except Exception as e:
  91. error_msg = f"Unexpected error while printing order for table {order.table}: {e}"
  92. logger.error(error_msg)
  93. structured_logger.log_print_event(
  94. f"Unexpected print error for table {order.table}",
  95. LogLevel.ERROR,
  96. {
  97. "table": order.table,
  98. "error": str(e),
  99. "error_type": type(e).__name__
  100. }
  101. )
  102. raise
  103. def print_ticket(number_table: int):
  104. """Send a ticket to the printer"""
  105. logger.info(f"Attempting to print ticket for table {number_table}")
  106. try:
  107. structured_logger.log_print_event(
  108. f"Sending ticket print request for table {number_table}",
  109. LogLevel.INFO,
  110. {"table": number_table}
  111. )
  112. response = requests.get(
  113. f"{printer_url}/ticket/{number_table}",
  114. headers={"Authorization": f"Bearer PRINTER123cerveza@"},
  115. timeout=10
  116. )
  117. if response.status_code != 200:
  118. error_msg = f"Failed to print ticket for table {number_table}: HTTP {response.status_code} - {response.text}"
  119. logger.error(error_msg)
  120. structured_logger.log_print_event(
  121. f"Ticket print failed for table {number_table}",
  122. LogLevel.ERROR,
  123. {
  124. "table": number_table,
  125. "status_code": response.status_code,
  126. "error_message": response.text,
  127. "printer_url": printer_url
  128. }
  129. )
  130. raise Exception(error_msg)
  131. logger.info(f"Ticket printed successfully for table {number_table}")
  132. structured_logger.log_print_event(
  133. f"Ticket printed successfully for table {number_table}",
  134. LogLevel.INFO,
  135. {
  136. "table": number_table,
  137. "response": response.json() if response.headers.get('content-type', '').startswith('application/json') else str(response.text)
  138. }
  139. )
  140. return response.json() # Return the response from the printer service
  141. except requests.RequestException as e:
  142. error_msg = f"Network error while printing ticket for table {number_table}: {e}"
  143. logger.error(error_msg)
  144. structured_logger.log_print_event(
  145. f"Network error during ticket print for table {number_table}",
  146. LogLevel.ERROR,
  147. {
  148. "table": number_table,
  149. "error": str(e),
  150. "printer_url": printer_url
  151. }
  152. )
  153. raise Exception(error_msg)
  154. except Exception as e:
  155. error_msg = f"Unexpected error while printing ticket for table {number_table}: {e}"
  156. logger.error(error_msg)
  157. structured_logger.log_print_event(
  158. f"Unexpected ticket print error for table {number_table}",
  159. LogLevel.ERROR,
  160. {
  161. "table": number_table,
  162. "error": str(e),
  163. "error_type": type(e).__name__
  164. }
  165. )
  166. raise
  167. def get_status():
  168. """Get the status of the printer service"""
  169. logger.info("Checking printer service status")
  170. try:
  171. structured_logger.log_print_event(
  172. "Checking printer service status",
  173. LogLevel.INFO,
  174. {"printer_url": printer_url}
  175. )
  176. response = requests.get(
  177. f"{printer_url}/status",
  178. headers={"Authorization": f"Bearer PRINTER123cerveza@"},
  179. timeout=5
  180. )
  181. data = response.json()
  182. status = data.get("status", False)
  183. logger.info(f"Printer service status: {'online' if status else 'offline'}")
  184. structured_logger.log_print_event(
  185. f"Printer service status check completed: {'online' if status else 'offline'}",
  186. LogLevel.INFO if status else LogLevel.WARNING,
  187. {
  188. "status": status,
  189. "response_data": data,
  190. "status_code": response.status_code
  191. }
  192. )
  193. return status
  194. except requests.RequestException as e:
  195. error_msg = f"Error connecting to printer service: {e}"
  196. logger.error(error_msg)
  197. structured_logger.log_print_event(
  198. "Failed to connect to printer service",
  199. LogLevel.ERROR,
  200. {
  201. "error": str(e),
  202. "error_type": type(e).__name__,
  203. "printer_url": printer_url
  204. }
  205. )
  206. raise Exception(error_msg)
  207. except Exception as e:
  208. error_msg = f"Unexpected error checking printer status: {e}"
  209. logger.error(error_msg)
  210. structured_logger.log_print_event(
  211. "Unexpected error during printer status check",
  212. LogLevel.ERROR,
  213. {
  214. "error": str(e),
  215. "error_type": type(e).__name__
  216. }
  217. )
  218. raise Exception(error_msg)