fudo.py 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. import math
  2. import requests
  3. import os
  4. api_token = os.getenv('FUDO_API_KEY')
  5. api_secret = os.getenv('FUDO_API_SECRET')
  6. def get_token():
  7. url = 'https://auth.fu.do/api'
  8. data = {
  9. "apiKey": api_token,
  10. "apiSecret": api_secret
  11. }
  12. r = requests.post(url, data=data)
  13. return r.json()['token']
  14. def get_categorys():
  15. """
  16. {
  17. "data": [
  18. {
  19. "id": "1",
  20. "type": "ProductCategory",
  21. "attributes": {
  22. "enableOnlineMenu": true,
  23. "name": "Drinks",
  24. "preparationTime": 0,
  25. "position": 50
  26. },
  27. "relationships": {
  28. "kitchen": {
  29. "data": {
  30. "id": "1",
  31. "type": "Kitchen"
  32. }
  33. },
  34. "parentCategory": {
  35. "data": {
  36. "id": "1",
  37. "type": "ProductCategory"
  38. }
  39. }
  40. }
  41. }
  42. ]
  43. }"""
  44. token = get_token()
  45. url = 'https://api.fu.do/v1alpha1/product-categories'
  46. headers = {
  47. 'Authorization': 'Bearer ' + token
  48. }
  49. r = requests.get(url, headers=headers)
  50. return r.json()
  51. def get_product(id_category:int):
  52. """
  53. Response Example:
  54. [{
  55. 'type': 'Product',
  56. 'id': '206',
  57. 'attributes': {
  58. 'active': True,
  59. 'code': None,
  60. 'cost': 364.0,
  61. 'description': '',
  62. 'enableOnlineMenu': None,
  63. 'enableQrMenu': None,
  64. 'favourite': False,
  65. 'imageUrl': None,
  66. 'name': 'Pollo 70 g',
  67. 'position': 28800000,
  68. 'preparationTime': None,
  69. 'price': 1500.0,
  70. 'sellAlone': True,
  71. 'stock': None,
  72. 'stockControl': False
  73. },
  74. 'relationships': {'kitchen': {'data': {'type': 'Kitchen', 'id': '4'}}, 'productCategory': {'data': {'type': 'ProductCategory', 'id': '28'}}, 'productModifiersGroups': {'data': []}, 'productProportions': {'data': []}}
  75. }]
  76. """
  77. url = 'https://api.fu.do/v1alpha1/products/{}'.format(id_category)
  78. token = get_token()
  79. headers = {
  80. 'Authorization': 'Bearer ' + token
  81. }
  82. r = requests.get(url, headers=headers)
  83. return r.json()
  84. def get_products():
  85. """
  86. Response Example:{
  87. 'type': 'Product',
  88. 'id': '206',
  89. 'attributes': {
  90. 'active': True,
  91. 'code': None,
  92. 'cost': 364.0,
  93. 'description': '',
  94. 'enableOnlineMenu': None,
  95. 'enableQrMenu': None,
  96. 'favourite': False,
  97. 'imageUrl': None,
  98. 'name': 'Pollo 70 g',
  99. 'position': 28800000,
  100. 'preparationTime': None,
  101. 'price': 1500.0,
  102. 'sellAlone': True,
  103. 'stock': None,
  104. 'stockControl': False
  105. },
  106. 'relationships': {'kitchen': {'data': {'type': 'Kitchen', 'id': '4'}}, 'productCategory': {'data': {'type': 'ProductCategory', 'id': '28'}}, 'productModifiersGroups': {'data': []}, 'productProportions': {'data': []}}
  107. }
  108. """
  109. url = 'https://api.fu.do/v1alpha1/products'
  110. token = get_token()
  111. headers = {
  112. 'Authorization': 'Bearer ' + token
  113. }
  114. r = requests.get(url, headers=headers)
  115. return list(filter(lambda x: x['relationships']['productCategory']['data']['id'] == '1', r.json()['data']))
  116. def get_table(number:int):
  117. n_per_page = 10
  118. page = math.ceil(number / n_per_page)
  119. url = 'https://api.fu.do/v1alpha1/tables?page[number]={}&page[size]={}&include=activeSales&sort=number'.format(page, n_per_page)
  120. token = get_token()
  121. headers = {
  122. 'Authorization': 'Bearer ' + token
  123. }
  124. r = requests.get(url, headers=headers)
  125. if r.status_code != 200:
  126. print('Error al obtener tablas:' + str(r.json()['errors']))
  127. return None
  128. try:
  129. return list(filter(lambda x: x['attributes']['number'] == number, r.json()['data']))[0]
  130. except:
  131. print('Error al obtener tabla')
  132. print(r.json())
  133. return None
  134. def get_sale(sale_id:int):
  135. url = 'https://api.fu.do/v1alpha1/sales/{}'.format(sale_id)
  136. token = get_token()
  137. headers = {
  138. 'Authorization': 'Bearer ' + token
  139. }
  140. r = requests.get(url, headers=headers)
  141. if r.status_code != 200:
  142. print('Error al obtener tablas:' + str(r.json()['errors']))
  143. return None
  144. return r.json()
  145. def create_sale(table_id:int):
  146. url = 'https://api.fu.do/v1alpha1/sales'
  147. token = get_token()
  148. headers = {
  149. 'Authorization': 'Bearer ' + token
  150. }
  151. data = {
  152. "data": {
  153. "type": "Sale",
  154. "attributes": {
  155. "people": 1,
  156. "saleType": "EAT-IN",
  157. "comment": "Pedido desde la app pedidos express"
  158. },
  159. "relationships": {
  160. "table": {
  161. "data": {
  162. "id": str(table_id),
  163. "type": "Table"
  164. }
  165. },
  166. "waiter": {
  167. "data": {
  168. "type": "User",
  169. "id": "76"
  170. }
  171. }
  172. }
  173. }
  174. }
  175. r = requests.post(url, headers=headers, json=data)
  176. if r.status_code != 201:
  177. print('Error al crear la venta:', r.json())
  178. return None
  179. return r.json()["data"]
  180. def create_item(product_id:int, quantity:int, sale_id:int, comment = None):
  181. url = 'https://api.fu.do/v1alpha1/items'
  182. token = get_token()
  183. headers = {
  184. 'Authorization': 'Bearer ' + token
  185. }
  186. data = {
  187. "quantity": quantity,
  188. "origin": "MOBILE",
  189. "comment": "[DESARROLLO NO SACAR]Pedido desde pedidos express" + (f" - {comment}" if comment else ""),
  190. }
  191. data = {
  192. "data":{
  193. "type": "Item",
  194. "attributes": data,
  195. "relationships": {
  196. "product": {
  197. "data": {
  198. "type": "Product",
  199. "id": str(product_id)
  200. }
  201. },
  202. "sale": {
  203. "data": {
  204. "type": "Sale",
  205. "id": str(sale_id)
  206. }
  207. }
  208. },
  209. }
  210. }
  211. r = requests.post(url, headers=headers, json=data)
  212. if r.status_code != 201:
  213. print(r.json())
  214. return None
  215. return r.json()["data"]
  216. def get_active_sale(table):
  217. data = table['relationships']['activeSales']['data']
  218. if len(data) == 0:
  219. return None
  220. return data[0]
  221. if __name__ == "__main__":
  222. table = get_table(107)
  223. if table is None:
  224. print('No se pudo obtener la mesa')
  225. exit()
  226. activeSale = get_active_sale(table)
  227. if not activeSale:
  228. print('No hay una venta activa para la mesa')
  229. activeSale = create_sale(table['id'])
  230. if activeSale is None:
  231. print('No se pudo crear la venta')
  232. exit()
  233. else:
  234. activeSale = activeSale[0]
  235. print('Venta activa:', activeSale['id'])
  236. """
  237. Intrucciones para hacer un pedido:
  238. 1. Obtener el token de autenticación con `get_token()`.
  239. 2. obtener la mesa con `get_table(numero_de_mesa)`.
  240. 3. ver si tiene una activeSale, en caso contrario crear una con `create_sale(id_mesa)`.
  241. 4. agregar los items a la venta con `create_item(id_producto, cantidad, id_venta, comentario)`.
  242. """