constant.py 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. from enum import Enum
  4. from apilib.systypes import StrEnum, IntEnum
  5. class DescStrEnum(Enum):
  6. @classmethod
  7. def choices(cls):
  8. result = list()
  9. for _ in cls.__members__.values():
  10. if not _.support:
  11. continue
  12. result.append(_.code)
  13. return result
  14. @classmethod
  15. def to_list(cls):
  16. return [ {"code": _.code, "text": _.text, "support": _.support} for _ in cls.__members__.values() ]
  17. def __init__(self, code, text, support):
  18. self.code = code
  19. self.text = text
  20. self.support = support
  21. def __eq__(self, other):
  22. if isinstance(other, DescStrEnum):
  23. return self.code == other.code
  24. return self.code == other
  25. def __ne__(self, other):
  26. return not self.__eq__(other)
  27. class WechatSubjectType(DescStrEnum):
  28. """ 商户的类型 """
  29. SUBJECT_TYPE_ENTERPRISE = "SUBJECT_TYPE_ENTERPRISE", u"企业", True
  30. SUBJECT_TYPE_INSTITUTIONS_CLONED = "SUBJECT_TYPE_INSTITUTIONS_CLONED", u"事业单位/政府单位", False
  31. SUBJECT_TYPE_MICRO = "SUBJECT_TYPE_MICRO", u"个人商户", True
  32. SUBJECT_TYPE_INDIVIDUAL = "SUBJECT_TYPE_INDIVIDUAL", u"个体工商户", False
  33. SUBJECT_TYPE_OTHERS = "SUBJECT_TYPE_OTHERS", u"其他组织", False
  34. class IdentificationType(DescStrEnum):
  35. """ 主要任务的证件类型 """
  36. IDENTIFICATION_TYPE_IDCARD = "IDENTIFICATION_TYPE_IDCARD", u"身份证", True
  37. IDENTIFICATION_TYPE_OVERSEA_PASSPORT = "IDENTIFICATION_TYPE_OVERSEA_PASSPORT", u"护照(限境外人士)", False
  38. IDENTIFICATION_TYPE_HONGKONG_PASSPORT = "IDENTIFICATION_TYPE_HONGKONG_PASSPORT", u"香港居民内地来往通行证", False
  39. IDENTIFICATION_TYPE_MACAO_PASSPORT = "IDENTIFICATION_TYPE_MACAO_PASSPORT", u"澳门居民内地来往通行证", False
  40. IDENTIFICATION_TYPE_TAIWAN_PASSPORT = "IDENTIFICATION_TYPE_TAIWAN_PASSPORT", u"台湾居民内地来往通行证", False
  41. class CertType(DescStrEnum):
  42. """ 登记证书可选选项 """
  43. CERTIFICATE_TYPE_2388 = "CERTIFICATE_TYPE_2388", u"事业单位法人证书", True
  44. CERTIFICATE_TYPE_2389 = "CERTIFICATE_TYPE_2389", u"统一社会信用代码证书", True
  45. CERTIFICATE_TYPE_2390 = "CERTIFICATE_TYPE_2390", u"有偿服务许可证(军队医院适用)", True
  46. CERTIFICATE_TYPE_2391 = "CERTIFICATE_TYPE_2391", u"医疗机构执业许可证(军队医院适用)", True
  47. CERTIFICATE_TYPE_2392 = "CERTIFICATE_TYPE_2392", u"企业营业执照(挂靠企业的党组织适用)", True
  48. CERTIFICATE_TYPE_2393 = "CERTIFICATE_TYPE_2393", u"组织机构代码证(政府机关适用)", True
  49. CERTIFICATE_TYPE_2394 = "CERTIFICATE_TYPE_2394", u"社会团体法人登记证书", True
  50. CERTIFICATE_TYPE_2395 = "CERTIFICATE_TYPE_2395", u"民办非企业单位登记证书", True
  51. CERTIFICATE_TYPE_2396 = "CERTIFICATE_TYPE_2396", u"基金会法人登记证书", True
  52. CERTIFICATE_TYPE_2397 = "CERTIFICATE_TYPE_2397", u"慈善组织公开募捐资格证书", True
  53. CERTIFICATE_TYPE_2398 = "CERTIFICATE_TYPE_2398", u"农民专业合作社法人营业执照", True
  54. CERTIFICATE_TYPE_2399 = "CERTIFICATE_TYPE_2399", u"宗教活动场所登记证", True
  55. CERTIFICATE_TYPE_2400 = "CERTIFICATE_TYPE_2400", u"其他证书/批文/证明", True
  56. class MicroBizType(DescStrEnum):
  57. """ 小微经营类型 """
  58. MICRO_TYPE_STORE = "MICRO_TYPE_STORE", u"门店场所", True
  59. MICRO_TYPE_MOBILE = "MICRO_TYPE_MOBILE", u"流动经营/便民服务", False
  60. MICRO_TYPE_ONLINE = "MICRO_TYPE_ONLINE", u"线上商品/服务交易", False
  61. class ContactType(DescStrEnum):
  62. """联系人的类型"""
  63. LEGAL = "LEGAL", u"法人", True
  64. SUPER = "SUPER", u"经办人", True
  65. class COMPANY_TYPE(StrEnum):
  66. ENTERPRISE = "E" # 企业性质 开办公司
  67. PERSON_COMPANY = "P" # 个体工商户 类似小商店
  68. NORMAL_PERSON = "N" # 个人商户 自然人
  69. class BLIC_CARD_TYPE(StrEnum):
  70. USC = "USC" # 统一社会信用代码 个体工商户
  71. BLI = "BLI" # 普通五类证 企业性质 个体工商户
  72. OCI = "OCI" # 多证合一 企业性质
  73. ID = "ID" # 身份证 自然人专用
  74. class LEP_CARD_TYPE(StrEnum):
  75. ID = "ID" # 大陆身份证
  76. PAS = "PAS" # 护照
  77. PASTW = "PASTW" # 台湾通行证
  78. PASHK = "PASHK" # 港澳通行证
  79. class PRIATE_OR_PUBLIC(StrEnum):
  80. PRIATE = "0" # 对私
  81. PUBLIC = "1" # 对公
  82. NO_LEG = "3" # 非法人
  83. class SETTLEMENT_PERIOD(StrEnum):
  84. NATURAL = "D1"
  85. WORKDAY = "T1"
  86. class MerchantStatus(IntEnum):
  87. """
  88. 我们系统中商户的申请状态
  89. """
  90. # 未申请 未入驻
  91. INIT = 0
  92. # 商户产品开通中
  93. WAITING = 1
  94. # 商户产品开通失败
  95. FAIL = 2
  96. # 商户流程走完 微信尚未提交 中间状态
  97. CONFIRM = 3
  98. # 商户开通成功
  99. SUCCESS = 4
  100. # ---- 新增的状态 -------
  101. # 微信审核中状态
  102. AUTH_WAITING = 5
  103. # 微信审核通过 等待商户确认
  104. AUTH_APPLY_SUCCESS = 6
  105. # 微信审核通过 已经确认
  106. AUTH_SUCCESS = 7
  107. class MerchantLogAction(StrEnum):
  108. """
  109. 商户的操作动作 目前要紧的就这四步
  110. """
  111. SUBMIT = "submit"
  112. ADD_JD_APP = "addApp"
  113. SUBMIT_WECHAT = "submitWechat"
  114. SUBMIT_ALI = "submitAli"
  115. AUTH_APPLY_SUCCESS = "authApplySuccess"
  116. CHANGE_PAY_APP = "changePayApp"
  117. FAIL = "fail"
  118. class MerchantVersion(StrEnum):
  119. SELF_DEVELOPED = "v1.0.0"
  120. OPEN_MERCHANT = "v2.0.0"
  121. class ProductStatus(IntEnum):
  122. """
  123. 京东产品支付的状态
  124. """
  125. INIT = 0
  126. WAITING = 1
  127. FAIL = 2
  128. CONFIRM = 3
  129. SUCCESS = 4
  130. class ProductRateType(StrEnum):
  131. """
  132. 京东商户的产品 手续费类型
  133. """
  134. CHANGELESS = "1" # 固定额
  135. PERCENTAGE = "2" # 百分比
  136. PERCENTAGE_LIMIT = "3" # 百分比带上限
  137. class ProductType(StrEnum):
  138. """
  139. 京东商户的产品 类型
  140. """
  141. WECHAT = "401" # 微信
  142. ALIPAY = "402" # 支付宝
  143. JD = "403" # 京东支付的
  144. # 单笔交易手续费 单位千分之一
  145. DEFAULT_TRADE_FEE = 6
  146. class SETTLE_STATUS(StrEnum):
  147. INIT = "INIT"
  148. DOING = "DOING"
  149. DONE = "DONE"
  150. FAILED = "FAILED"
  151. RETURN_BACK = "RETURN_BACK"
  152. class MERCHANT_OWNER_ROLE(StrEnum):
  153. AGENT = "agent"
  154. DEALER = "dealer"
  155. # 以下是新的商户相应常量参数 与自研系统不完全一致
  156. OPEN_JD_ERROR = {
  157. "invalidProvince": u"地址信息填写错误(省),请仔细核对您的商户地址或公司地址",
  158. "invalidCity": u"地址信息填写错误(市),请仔细核对您的商户地址或公司地址",
  159. "invalidAddress": u"地址信息填写错误,请仔细核对您的商户地址或公司地址",
  160. "invalidIndustry": u"行业无效,请您仔细核对所在行业",
  161. "userExist": u"邮箱无效,请核对您的邮箱信息",
  162. "invalidIdCard": u"无效的身份证,请校验您的身份证号码或照片",
  163. "invalidCardType": u"证件类型无效",
  164. "invalidBank": u"无效的银行,请校验您的银行卡号或照片",
  165. "invalidAmount": u"金额无效",
  166. "settleInfoExist": u"结算信息已经存在,请勿重新申请",
  167. "customerFeeExist": u"商户费率信息已经存在,请勿重新提交",
  168. "settleInfoNotExist": u"结算信息不存在",
  169. "declareNotExist": u"报单不存在",
  170. "declareStatusError": "报单状态有误",
  171. "uploadFail": "图片上传失败",
  172. "shopExist": "店铺已经存在",
  173. "uploadUpdateFail": u"图片上传更新失败",
  174. "limitAttach": "图片上传超出限制",
  175. "createCustomerManagerFail": u"创建商户管理员失败,请与平台联系解决",
  176. "activeCustomerFail": u"激活商户失败,请与平台联系解决",
  177. "idNumLimit": u"身份证号重复,请更换省份证后重新上传",
  178. "idNumInBlacklist": u"身份证在黑名单中,请更换身份证信息",
  179. "bankcardNumLimit": u"银行卡重复,请更换银行卡",
  180. "bankcardNumInBlacklist": u"银行卡在黑名单中,请更换银行卡信息",
  181. "phoneNumLimit": "联系电话重复,请检测联系电话或更换"
  182. }
  183. class JdOpenMerchantType(StrEnum):
  184. COMPANY = "COMPANY" # 企业商户
  185. PERSON = "PERSON" # 个人商户
  186. INDIVIDUALBISS = "INDIVIDUALBISS" # 个体工商户
  187. INSTITUTION = "INSTITUTION" # 事业单位
  188. class JdOpenMerchantStatus(IntEnum):
  189. FAIL = -1 # 商户申请失败
  190. WX_FAIL = -2 # 微信实名失败
  191. ALI_FAIL = -2 # 支付宝实名失败
  192. INIT = 0 # 尚未提交资料
  193. SUBMIT = 1 # 资料提交完毕
  194. CUSTOMER = 2 # 商户创建完毕
  195. SETTLE = 3 # 结算创建完毕
  196. SHOP = 4 # 商店创建完毕
  197. ATTACH = 5 # 附件上传完毕
  198. COMPLETE = 6 # 已报单
  199. CONFIRM = 7 # 已报单确认(京东审核中)
  200. SUCCESS = 8 # 商户审核成功
  201. AUTH_WAITING = 9 # 微信商户提交资料正在审核中
  202. AUTH_APPLY_SUCCESS = 10 # 微信审核成功 等待用户扫码实名认证
  203. AUTH_SUCCESS = 11 # 微信实名确认完成
  204. ALI_SUCCESS = 10
  205. class JdOpenAccountType(StrEnum):
  206. PUBLIC = "PUBLIC"
  207. PRIVATE = "PRIVATE"
  208. class JdOpenAuditStatus(StrEnum):
  209. INIT = "INIT"
  210. NOT_PASS = "NOTPASS"
  211. OT_AUDIT = "OTAUDIT"
  212. PASS = "PASS"
  213. WAIT_CHANNEL_AUDIT = "WAITCHANNELAUDIT"
  214. class JdOpenProductType(StrEnum):
  215. WX = "WX"
  216. ALI = "ALIPAY"
  217. class AuthStatus(object):
  218. """
  219. 微信 阿里的实名状态
  220. """
  221. PASS = "PASS"
  222. NO_PASS = "NOPASS"
  223. AUDIT = "AUDIT"
  224. AUTHED = "AUTHED"
  225. ALI_PAY_QR_CODE = "data:image/png;base64,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"