models.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. # coding=utf-8
  2. import datetime
  3. import time
  4. from django.db import models
  5. from django.conf import settings
  6. from django.db.models import Q
  7. from utils.exceptions import CustomError
  8. from django.utils import timezone
  9. from apps.base import Formater
  10. from apps.WeChatResponse import WeChatResponse
  11. from apps.Alipay import Alipay
  12. from apps.tenant.config.models import Config
  13. class Tenant(models.Model):
  14. EDITION_1 = 1
  15. EDITION_2 = 2
  16. EDITION_3 = 3
  17. EDITION_CHOICES = (
  18. (EDITION_1, u'标准版'),
  19. (EDITION_2, u'专业版'),
  20. (EDITION_3, u'无限版'),
  21. )
  22. company_no = models.CharField(max_length=10, verbose_name=u'企业编号', blank=True, null=True)
  23. company_name = models.CharField(max_length=200, verbose_name=u'企业名称', blank=True, null=True)
  24. organ_code = models.CharField(max_length=200, verbose_name=u'组织代码', blank=True, null=True)
  25. wxapp_img = models.CharField(verbose_name=u'小程序二维码', max_length=250, null=True)
  26. name = models.CharField(max_length=20, verbose_name=u'联系人名称')
  27. tel = models.CharField(max_length=20, verbose_name=u'联系人电话')
  28. address = models.CharField(max_length=200, verbose_name=u'地址', blank=True, null=True)
  29. create_time = models.DateTimeField(verbose_name=u'申请时间', auto_now_add=True, editable=False)
  30. end_date = models.DateField(verbose_name=u'到期时间', editable=False, blank=True, null=True)
  31. status = models.PositiveSmallIntegerField(choices=settings.CHECK_STATE_CHOICES, verbose_name=u'审核状态',
  32. default=settings.DEFAULT)
  33. user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u"申请人", on_delete=models.PROTECT,
  34. editable=False, null=True)
  35. reject_reason = models.CharField(max_length=200, verbose_name=u'拒绝原因', blank=True, null=True)
  36. delete = models.BooleanField(verbose_name=u'删除', default=False, editable=False)
  37. edition = models.PositiveSmallIntegerField(choices=EDITION_CHOICES, verbose_name='版本', default=EDITION_1)
  38. class Meta:
  39. db_table = 'tenant'
  40. ordering = ['-id']
  41. verbose_name = '企业'
  42. default_permissions = ()
  43. def get_no(self):
  44. now = int(timezone.now().strftime('%H%M%S')) * 1.3
  45. no = '{0}{1}'.format(self.id, now)
  46. return no
  47. @staticmethod
  48. def is_exist(company_name, exclude_id=None):
  49. rows = Tenant.objects.filter(delete=False, company_name=company_name)
  50. if exclude_id:
  51. rows = rows.filter(~Q(id=exclude_id))
  52. return rows.count()
  53. @staticmethod
  54. def check_validity(no):
  55. if not no:
  56. return True
  57. tenant = Tenant.objects.filter(company_no=no).first()
  58. if not tenant:
  59. raise CustomError('未找到该企业,请重新输入')
  60. if tenant.status == settings.OVERDUE:
  61. return False
  62. today = datetime.datetime.now().strftime('%Y-%m-%d')
  63. today_stamp = time.mktime(time.strptime(today, "%Y-%m-%d"))
  64. end_date = time.mktime(time.strptime(tenant.end_date.strftime('%Y-%m-%d'), '%Y-%m-%d'))
  65. diff = int(end_date) - int(today_stamp)
  66. if diff < 0:
  67. tenant.status = settings.OVERDUE
  68. tenant.save()
  69. return False
  70. return True
  71. @staticmethod
  72. def getById(id):
  73. try:
  74. id = int(id)
  75. except:
  76. raise CustomError(u'无效的企业!')
  77. tenant = Tenant.objects.filter(id=id, delete=False).first()
  78. if not tenant:
  79. raise CustomError(u'未找到相应的企业信息!')
  80. return tenant
  81. @staticmethod
  82. def getByNo(no):
  83. tenant = Tenant.objects.filter(company_no=no, delete=False).first()
  84. if not tenant:
  85. raise CustomError(u'未找到相应的企业信息!')
  86. return tenant
  87. class Pay(models.Model):
  88. WAIT = 0
  89. PAY = 1
  90. CONFIRM = 2
  91. UNDO = 3
  92. STATUS_CHOICES = (
  93. (WAIT, u'待付款'),
  94. (PAY, u'已付款'),
  95. (CONFIRM, u'已确认付款'),
  96. (UNDO, u'已取消'),
  97. )
  98. WECHAT = 1
  99. ALIPAY = 2
  100. WECHAT_APP = 3
  101. PAY_CHANNEL_CHOICES = (
  102. (WECHAT, u'微信'),
  103. (ALIPAY, u'支付宝'),
  104. (WECHAT_APP, u'小程序'),
  105. )
  106. pay_no = models.CharField(max_length=25, verbose_name='支付单号',unique=True, null=True)
  107. status = models.PositiveSmallIntegerField(choices=STATUS_CHOICES, verbose_name='状态', default=WAIT)
  108. pay_channel = models.PositiveSmallIntegerField(choices=PAY_CHANNEL_CHOICES, verbose_name='支付通道')
  109. precreate_amount = models.BigIntegerField(verbose_name=u"预支付金额")
  110. create_time = models.DateTimeField(verbose_name=u"创建时间", default=timezone.now)
  111. qrcode = models.CharField(max_length=512, verbose_name=u"付款码", null=True)
  112. amount = models.BigIntegerField(verbose_name=u"支付金额", null=True)
  113. user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u'下单人',related_name='pay_user', on_delete=models.PROTECT)
  114. tenant = models.ForeignKey(Tenant, verbose_name=u'商户',related_name='pay_tenant', on_delete=models.PROTECT)
  115. edition_year = models.CharField(max_length=10, verbose_name='版本年限', default='')
  116. class Meta:
  117. db_table = "pay"
  118. verbose_name = u"支付信息"
  119. ordering = ('-id',)
  120. default_permissions = ()
  121. def payClosed(self):
  122. if self.status != Pay.WAIT:
  123. return
  124. self.status = Pay.UNDO
  125. self.save()
  126. def paySuccess(self, pay_amount):
  127. if self.status != Pay.WAIT:
  128. return
  129. self.status = Pay.PAY
  130. self.amount = Formater.formatAmount(pay_amount)
  131. self.save()
  132. year = self.edition_year.split(',')[1]
  133. today = datetime.datetime.now().strftime('%Y-%m-%d')
  134. today_stamp = time.mktime(time.strptime(today, "%Y-%m-%d"))
  135. end_date = time.mktime(time.strptime(self.tenant.end_date.strftime('%Y-%m-%d'), '%Y-%m-%d'))
  136. diff = int(end_date) - int(today_stamp)
  137. if diff >= 0:
  138. renew_date = (self.tenant.end_date + datetime.timedelta(days=365 * int(year))).strftime('%Y-%m-%d')
  139. else:
  140. renew_date = (datetime.datetime.now() + datetime.timedelta(days=365 * int(year))).strftime('%Y-%m-%d')
  141. self.tenant.end_date = renew_date
  142. self.tenant.status = settings.PASS
  143. self.tenant.edition = self.edition_year.split(',')[0]
  144. self.tenant.save()
  145. # 支付宝回调,付款
  146. def payConfirm(self, no):
  147. if self.status != Pay.PAY:
  148. return
  149. pay_amount = 0
  150. if self.pay_channel == Pay.ALIPAY:
  151. pay_amount = Alipay.queryUnifiedOrder(no)
  152. pay_amount = Formater.formatAmount(pay_amount)
  153. elif self.pay_channel == Pay.WECHAT:
  154. pay_amount = WeChatResponse().orderquery(no)
  155. pay_amount = Formater.formatPrice(pay_amount)
  156. self.status = Pay.CONFIRM
  157. self.amount = pay_amount
  158. self.save()
  159. @staticmethod
  160. def getByNo(pay_no):
  161. instance = Pay.objects.filter(pay_no=pay_no).first()
  162. if not instance:
  163. raise CustomError(u'未找到相应的支付单号!')
  164. return instance
  165. # 小程序支付
  166. @staticmethod
  167. def wechatAppPay(user, tenant_id, amount, edition_year):
  168. item = Pay._precreatePay(
  169. user,
  170. tenant_id,
  171. Pay.WECHAT_APP,
  172. amount,
  173. edition_year,
  174. )
  175. return item
  176. # 微信支付
  177. @staticmethod
  178. def wechatPay(user, tenant_id, amount, edition_year):
  179. item = Pay._precreatePay(
  180. user,
  181. tenant_id,
  182. Pay.WECHAT,
  183. amount,
  184. edition_year,
  185. )
  186. return item
  187. # 支付宝支付
  188. @staticmethod
  189. def alipayPay(user, tenant_id, amount, edition_year):
  190. item = Pay._precreatePay(
  191. user,
  192. tenant_id,
  193. Pay.ALIPAY,
  194. amount,
  195. edition_year,
  196. )
  197. return item
  198. @staticmethod
  199. def _precreatePay(user, tenant_id, pay_channel, amount, edition_year):
  200. pay_no = '{0}{1}'.format(tenant_id, timezone.now().strftime('%y%m%d%H%M%S'))
  201. pay = Pay.objects.create(
  202. tenant_id=tenant_id,
  203. pay_no=pay_no,
  204. pay_channel=pay_channel,
  205. status=Pay.WAIT,
  206. precreate_amount=amount,
  207. user=user,
  208. edition_year=edition_year,
  209. )
  210. qrcode = ''
  211. if pay_channel == Pay.WECHAT:
  212. qrcode = WeChatResponse().unifiedOrder(pay.pay_no, round(float(Formater.formatAmountShow(amount)), 2))
  213. pass
  214. elif pay_channel == Pay.ALIPAY:
  215. qrcode = Alipay.payUnifiedOrder(pay.pay_no, round(float(Formater.formatAmountShow(amount)), 2))
  216. pay.qrcode = qrcode
  217. pay.save()
  218. return pay
  219. class Invoice(models.Model):
  220. NOT_CHECKED = 0
  221. NOT_MAIL = 1
  222. MAILED = 2
  223. REJECT = 3
  224. APPLY_STATE_CHOICES = (
  225. (NOT_CHECKED, u'待审核'),
  226. (NOT_MAIL, u'待邮寄'),
  227. (MAILED, u'已邮寄'),
  228. (REJECT, u'未通过'),
  229. )
  230. invoice_name = models.CharField(max_length=50, verbose_name=u'名称')
  231. tax_no = models.CharField(max_length=200, verbose_name=u'税号')
  232. company_address = models.CharField(max_length=200, verbose_name=u'单位地址', blank=True, null=True)
  233. phone_no = models.CharField(max_length=20, verbose_name=u'电话号码', blank=True, null=True)
  234. deposit_bank = models.CharField(max_length=50, verbose_name=u'开户银行', blank=True, null=True)
  235. bank_account = models.CharField(max_length=50, verbose_name=u'银行帐户', blank=True, null=True)
  236. invoice_sum = models.FloatField(max_length=20, verbose_name=u'发票金额')
  237. user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u"申请人", on_delete=models.PROTECT,
  238. editable=False)
  239. create_time = models.DateTimeField(verbose_name=u'申请时间', auto_now_add=True, editable=False)
  240. status = models.PositiveSmallIntegerField(choices=APPLY_STATE_CHOICES, verbose_name=u'状态',
  241. default=NOT_CHECKED)
  242. reject_reason = models.CharField(max_length=200, verbose_name=u'拒绝原因', blank=True, null=True)
  243. use_time = models.DateTimeField(verbose_name=u'操作时间', auto_now_add=True, editable=False)
  244. consignee = models.CharField(max_length=10, verbose_name=u'收件人',)
  245. consignee_tel= models.CharField(max_length=20, verbose_name=u'收件人电话')
  246. consignee_address= models.CharField(max_length=200, verbose_name=u'收件地址')
  247. express_company = models.CharField(max_length=20, verbose_name=u'快递公司', blank=True, null=True)
  248. express_number = models.CharField(max_length=200, verbose_name=u'快递单号', blank=True, null=True)
  249. class Meta:
  250. db_table = 'invoice'
  251. ordering = ['-id']
  252. verbose_name = '申请发票'
  253. default_permissions = ()