models.py 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. from django.db import models
  2. from django.utils.translation import gettext_lazy as _
  3. from userprofile.models import Users
  4. class InvoiceHeader(models.Model):
  5. """单位抬头信息表"""
  6. name = models.CharField(max_length=100, verbose_name="单位名称")
  7. tax_id = models.BigIntegerField(unique=True, verbose_name="纳税人识别号")
  8. address = models.CharField(max_length=200,null=True, blank=True, verbose_name="地址")
  9. bank = models.CharField(max_length=100,null=True, blank=True, verbose_name="开户银行")
  10. account = models.CharField(max_length=50,null=True, blank=True, verbose_name="银行账号")
  11. create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
  12. update_time = models.DateTimeField(auto_now=True, verbose_name="更新时间")
  13. is_delete = models.BooleanField(default=False, verbose_name="删除标记")
  14. class Meta:
  15. db_table = 'invoice_header'
  16. verbose_name = '发票抬头信息'
  17. verbose_name_plural = '发票抬头信息'
  18. ordering = ['name']
  19. def __str__(self):
  20. return f"{self.name} ({self.tax_id})"
  21. class InvoiceRecord(models.Model):
  22. """发票申报记录表"""
  23. header = models.ForeignKey(
  24. InvoiceHeader, on_delete=models.CASCADE,
  25. related_name='invoices', verbose_name="单位抬头"
  26. )
  27. amount = models.DecimalField(max_digits=12, decimal_places=2, verbose_name="金额")
  28. date = models.DateField(verbose_name="时间")
  29. purpose = models.CharField(max_length=100, verbose_name="用途")
  30. teacher = models.ForeignKey(
  31. Users, related_name='teacher_invoices', on_delete=models.SET_NULL, null=True, verbose_name="归属老师"
  32. )
  33. project = models.CharField(max_length=100, verbose_name="归属项目")
  34. actual_paid = models.DecimalField(max_digits=12, decimal_places=2, verbose_name="实付金额")
  35. is_reported = models.BooleanField(default=False, verbose_name="是否申报")
  36. invoice_attachment = models.FileField(
  37. upload_to='invoices/', blank=True, null=True, verbose_name="发票附件"
  38. )
  39. payment_attachment = models.FileField(
  40. upload_to='payments/', blank=True, null=True, verbose_name="支付附件"
  41. )
  42. class ApprovalStatus(models.TextChoices):
  43. PENDING = 'P', _('待审批')
  44. APPROVED = 'A', _('已通过')
  45. REJECTED = 'R', _('已拒绝')
  46. status = models.CharField(
  47. max_length=1, choices=ApprovalStatus.choices,
  48. default=ApprovalStatus.PENDING, verbose_name="审批状态"
  49. )
  50. create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
  51. update_time = models.DateTimeField(auto_now=True, verbose_name="更新时间")
  52. class Meta:
  53. db_table = 'invoice_record'
  54. verbose_name = '发票记录'
  55. verbose_name_plural = '发票记录'
  56. ordering = ['-date']
  57. def __str__(self):
  58. return f"Invoice #{self.id} - {self.header.name}"