reconcile.py 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. import datetime
  4. from typing import Tuple
  5. from dateutil.parser import parse
  6. from apps.web.user.models import RechargeRecord
  7. def dt_range(date_string):
  8. # type:(str)->Tuple[datetime.datetime, datetime.datetime]
  9. start = parse(date_string)
  10. return start, datetime.datetime.combine(start, datetime.time.max)
  11. def cn(unicode_):
  12. assert isinstance(unicode_, unicode)
  13. return unicode_.encode('gb18030')
  14. def mask(df, key, value): return df[df[key] == value]
  15. def df_in(df, key, items): return df[df[key].isin(items)]
  16. def withdraw_succeeded_mask(df):
  17. return mask(df, key = "付款状态", value = "付款成功")
  18. def download_alipay_statement():
  19. #: TODO
  20. pass
  21. def read_alipay_statement(file_name):
  22. """
  23. :param file_name:
  24. :return:
  25. """
  26. #: 跳过支付宝的csv表头注释
  27. #: TODO change file encoding
  28. import pandas as pd
  29. return pd.read_csv(file_name, skiprows = 2)
  30. def reconcile_alipay(file_name, date_str):
  31. # type:(str, str)->list
  32. """
  33. :param file_name:
  34. :param date_str:
  35. :return:
  36. """
  37. df = mask(df = read_alipay_statement(file_name), key = cn(u'交易状态'), value = cn(u'成功'))
  38. start, end = dt_range(date_str)
  39. records = RechargeRecord.objects(gateway = 'alipay', result = 'unPay', dateTimeAdded__gte = start,
  40. dateTimeAdded__lte = end)
  41. df = df[df[cn(u'商户订单号')].isin([str(_.orderNo) for _ in records])]
  42. return list(df[cn(u'商户订单号')])
  43. def reset_today_income():
  44. pass