fudo.py 8.2 KB

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