popi_reimbursement.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  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. used_prices: dict[str, float] = {}
  16. for infra in infras:
  17. print(infra['Type'])
  18. infra['Contributions'].sort(key=lambda c: c['Time'])
  19. for contribution in infra['Contributions']:
  20. if contribution['ContributerName'] != config.company or contribution['Time'] < threshold:
  21. continue
  22. print('\t' + contribution['Time'])
  23. for mat in contribution['Materials']:
  24. price = prices.get(mat['Ticker'], 0)
  25. print(f'\t\t{mat["Ticker"]} {mat["Amount"]} @ {price} = {mat["Amount"] * price}')
  26. used_prices[mat['Ticker']] = price
  27. print()
  28. for ticker, price in used_prices.items():
  29. print(f'{ticker:3}: {price}')
  30. def get_prices() -> typing.Mapping[str, float]:
  31. cxos_users: typing.Mapping = cache.get('https://api.fnar.net/cx/cxos/?username=' + config.username,
  32. headers={'Authorization': 'FIOAPIKey ' + config.fio_api_key})
  33. (cxos_user,) = cxos_users['UserNameToData'].values()
  34. cxos: list[CXOSOrder] = cxos_user['Data']
  35. cxos.reverse()
  36. prices: dict[str, float] = {}
  37. for order in cxos:
  38. if order['OrderType'] == 'BUYING' and order['Status'] == 'FILLED':
  39. prices.setdefault(order['MaterialTicker'], order['LimitAmount'])
  40. return prices
  41. class Infrastructure(typing.TypedDict):
  42. Type: str
  43. Contributions: list[Contribution]
  44. class Contribution(typing.TypedDict):
  45. ContributerName: str
  46. Time: str
  47. Materials: typing.Sequence[Material]
  48. class Material(typing.TypedDict):
  49. Ticker: str
  50. Amount: int
  51. class CXOSOrder(typing.TypedDict):
  52. OrderType: typing.Literal['BUYING', 'SELLING']
  53. Status: typing.Literal['PLACED', 'PARTIALLY_FILLED', 'FILLED']
  54. MaterialTicker: str
  55. LimitAmount: float
  56. if __name__ == '__main__':
  57. main()