grants.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import sys
  2. import typing
  3. import httpx
  4. import cache
  5. from config import config
  6. import integration
  7. def main() -> None:
  8. stats_month = integration.pmmg_month()
  9. coid_totals = integration.pmmg_monthly_report()['totals']
  10. bases = cache.get(f'https://prun.raylu.net/stats/data/base-data-{stats_month}.json', expiry=cache.ONE_DAY)
  11. for co in iter_grants():
  12. if co is None:
  13. print('\n')
  14. continue
  15. company = cache.get('https://rest.fnar.net/company/code/' + co)
  16. co_id = company['CompanyId']
  17. username = company['UserName']
  18. print(username, end='\t')
  19. try:
  20. url = 'https://prun.raylu.net/stats/?type=compTotals&chartType=treemap&metric=volume&group=company&companyName=' + username
  21. print(url, bases[co_id]["bases"], coid_totals[co_id]["volume"], sep='\t')
  22. except KeyError:
  23. print(f'no stats')
  24. def iter_grants() -> typing.Iterator[str | None]:
  25. (username,) = sys.argv[1:]
  26. params = {'username': username, 'status': 'TERMINATED', 'limit': 200, 'page': 1}
  27. while True:
  28. (data,) = httpx.get(f'https://api.punoted.net/v1/contracts/?username={username}&limit=200', params=params,
  29. headers={'X-Data-Token': config.punoted_api_key}).raise_for_status().json()
  30. data['Contracts'].sort(key=lambda c: c['DateEpochMs'])
  31. for contract in data['Contracts']:
  32. conditions = contract['Conditions']
  33. if len(conditions) != 2:
  34. continue
  35. payment = None
  36. if conditions[0]['Type'] == 'PAYMENT' and conditions[1]['Type'] == 'DELIVERY':
  37. payment, delivery = conditions
  38. if payment['Amount'] < 100000 or payment['Amount'] > 1000000 or delivery['Address'] != 'JY-313f (JY-313)':
  39. continue
  40. elif conditions[0]['Type'] == 'LOAN_PAYOUT' and conditions[1]['Type'] == 'LOAN_INSTALLMENT':
  41. payment, installment = conditions
  42. if payment['Amount'] < 100000 or payment['Amount'] > 1000000:
  43. continue
  44. if payment is not None and payment['Status'] == 'FULFILLED':
  45. print(f'{payment["Amount"]:9,} {payment["Currency"]}', contract['Timestamp'],
  46. contract['PartnerCode'], contract['PartnerName'], sep='\t', end='\t')
  47. yield contract['PartnerCode']
  48. if len(data['Contracts']) < 200:
  49. break
  50. params['page'] += 1
  51. if __name__ == '__main__':
  52. main()