models.py 10 KB

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