popi_reimbursement.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. from __future__ import annotations
  2. import datetime
  3. import sys
  4. import typing
  5. import cache
  6. from config import config
  7. def main() -> None:
  8. planet = sys.argv[1]
  9. print('getting prices...')
  10. prices = get_prices()
  11. print('\r')
  12. infras: typing.Sequence[Infrastructure] = cache.get(
  13. 'https://api.fnar.net/infrastructure?include_contributions=true&infrastructure=' + planet)
  14. threshold = (datetime.datetime.now(datetime.UTC) - datetime.timedelta(days=60)).strftime('%Y-%m-%d')
  15. for infra in infras:
  16. print(infra['Type'])
  17. infra['Contributions'].sort(key=lambda c: c['Time'])
  18. for contribution in infra['Contributions']:
  19. if contribution['ContributerName'] != config.company or contribution['Time'] < threshold:
  20. continue
  21. print('\t' + contribution['Time'])
  22. for mat in contribution['Materials']:
  23. price = prices.get(mat['Ticker'], 0)
  24. print(f'\t\t{mat["Ticker"]} {mat["Amount"]} @ {price} = {mat["Amount"] * price}')
  25. def get_prices() -> typing.Mapping[str, float]:
  26. cxos_users: typing.Mapping = cache.get('https://api.fnar.net/cx/cxos/?username=' + config.username,
  27. headers={'Authorization': 'FIOAPIKey ' + config.fio_api_key})
  28. (cxos_user,) = cxos_users['UserNameToData'].values()
  29. cxos: list[CXOSOrder] = cxos_user['Data']
  30. cxos.reverse()
  31. prices: dict[str, float] = {}
  32. for order in cxos:
  33. if order['OrderType'] == 'BUYING' and order['Status'] == 'FILLED':
  34. prices[order['MaterialTicker']] = order['LimitAmount']
  35. return prices
  36. class Infrastructure(typing.TypedDict):
  37. Type: str
  38. Contributions: list[Contribution]
  39. class Contribution(typing.TypedDict):
  40. ContributerName: str
  41. Time: str
  42. Materials: typing.Sequence[Material]
  43. class Material(typing.TypedDict):
  44. Ticker: str
  45. Amount: int
  46. class CXOSOrder(typing.TypedDict):
  47. OrderType: typing.Literal['BUYING', 'SELLING']
  48. Status: typing.Literal['PLACED', 'PARTIALLY_FILLED', 'FILLED']
  49. MaterialTicker: str
  50. LimitAmount: float
  51. if __name__ == '__main__':
  52. main()