models.py 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. #coding=utf-8
  2. from django.db import models
  3. from django.db.models import Sum
  4. from django.utils import timezone
  5. from apps.account.models import User, Department
  6. from apps.exceptions import CustomError
  7. from apps.product.models import ProductBase
  8. from apps.warehouse.models import Warehouse, WarehouseStock, WarehouseStockRecord
  9. from django.conf import settings
  10. class Goods(models.Model):
  11. product_base = models.ForeignKey(ProductBase, verbose_name=u"产品", on_delete=models.PROTECT, blank=True)
  12. retail_price = models.BigIntegerField(verbose_name=u"销售价", help_text=u"元", default=0)
  13. standard = models.CharField(max_length=100, verbose_name=u"标准", null=True, blank=True)
  14. goods_pack = models.CharField(max_length=100, verbose_name=u"包装", null=True, blank=True)
  15. class Meta:
  16. db_table = "goods"
  17. verbose_name = u"成品产品管理"
  18. ordering = ('-id',)
  19. default_permissions = ()
  20. permissions = (
  21. ("view_goods", u"浏览"),
  22. ("add_goods", u"添加"),
  23. ("delete_goods", u"删除"),
  24. ("export_goods", u"导出"),
  25. ("import_goods", u"导入"),
  26. ("view_goods_cost", u"查看成本"),
  27. )
  28. @staticmethod
  29. def getById(id):
  30. instance = Goods.objects.filter(pk=id).first()
  31. if not instance:
  32. raise CustomError(u'未找到相应的成品')
  33. return instance
  34. @staticmethod
  35. def getByBaseId(base_id):
  36. instance = Goods.objects.filter(product_base_id=base_id).first()
  37. if not instance:
  38. raise CustomError(u'未找到相应的成品')
  39. return instance
  40. class GoodsGodownEntry(models.Model):
  41. no = models.CharField(max_length=20, verbose_name=u"入库单号", editable=False)
  42. warehouse = models.ForeignKey(Warehouse, verbose_name=u'仓别', on_delete=models.PROTECT)
  43. create_time = models.DateTimeField(verbose_name=u"创建时间", default=timezone.now)
  44. create_user = models.ForeignKey(User, related_name='goods_godown_entry_ref_create_user', verbose_name=u"创建人", on_delete=models.PROTECT, editable=False)
  45. department = models.ForeignKey(Department, verbose_name=u"创建部门", on_delete=models.PROTECT, editable=False)
  46. check_time = models.DateTimeField(verbose_name=u"审核时间", blank=True, null=True)
  47. check_user = models.ForeignKey(User, related_name='goods_godown_entry_ref_check_user', verbose_name=u"审核人", on_delete=models.PROTECT, blank=True, null=True)
  48. status = models.PositiveSmallIntegerField(choices=settings.CHECK_STATUS_CHOICES, default=settings.DEFAULT, verbose_name=u"审核状态")
  49. notes = models.CharField(max_length=200, verbose_name=u"备注", blank=True, null=True)
  50. total_count = models.BigIntegerField(verbose_name=u'合计数量', default=0)
  51. total_amount = models.BigIntegerField(verbose_name=u'合计金额', default=0)
  52. total_invoice_amount = models.BigIntegerField(verbose_name=u'发票金额合计', default=0) # 等于明细里面的发票金额合计
  53. total_deliver_count = models.BigIntegerField(verbose_name=u"出库数量合计", default=0)
  54. total_deliver_amount = models.BigIntegerField(verbose_name=u"出库金额合计", default=0)
  55. class Meta:
  56. db_table = "goods_godown_entry"
  57. verbose_name = u"入库管理"
  58. ordering = ('-id',)
  59. index_together = (
  60. 'create_time', 'check_time', 'status'
  61. )
  62. unique_together = (
  63. 'no',
  64. )
  65. default_permissions = ()
  66. permissions = (
  67. ("view_goods_godown_entry", u"浏览"),
  68. ("add_goods_godown_entry", u"添加"),
  69. ("check_goods_godown_entry", u"审核"),
  70. ("delete_goods_godown_entry", u"删除"),
  71. ("export_goods_godown_entry", u"导出"),
  72. ("import_goods_godown_entry", u"导入"),
  73. ("print_goods_godown_entry", u"打印"),
  74. ("edit_goods_godown_entry", u"高级修改"),
  75. )
  76. @staticmethod
  77. def getById(id):
  78. instance = GoodsGodownEntry.objects.filter(pk=id).first()
  79. if not instance:
  80. raise CustomError(u'未找到相应的成品入库单')
  81. return instance
  82. def save(self, *args, **kwargs):
  83. if self.no == None or self.no == '':
  84. now = timezone.now()
  85. rows = GoodsGodownEntry.objects.filter(create_time__gte=now.strftime('%Y-%m-%d')).order_by('-no')
  86. count = rows.count()
  87. if count == 0:
  88. self.no = 'GR%s%03d' % (now.strftime('%Y%m%d'), count + 1)
  89. else:
  90. self.no = rows[0].no[:2] + str(int(rows[0].no[2:]) + 1)
  91. super(GoodsGodownEntry, self).save(*args, **kwargs)
  92. def update_total(self):
  93. total_count = 0
  94. total_amount = 0
  95. total_invoice_amount = 0
  96. sum_row = GoodsGodownEntryDetail.objects.filter(main=self).aggregate(total_count=Sum('count'),
  97. total_amount=Sum('amount'), total_invoice_amount=Sum('invoice_amount'))
  98. if sum_row:
  99. total_count = sum_row['total_count'] or 0
  100. total_amount = sum_row['total_amount'] or 0
  101. total_invoice_amount = sum_row['total_invoice_amount'] or 0
  102. self.total_count = total_count
  103. self.total_amount = total_amount
  104. self.total_invoice_amount = total_invoice_amount
  105. self.save()
  106. def update_redundant(self):
  107. sum_count = 0
  108. sum_amount = 0
  109. sum_row = GoodsGodownEntryDetail.objects.filter(main=self).aggregate(sum_count=Sum('deliver_count'),
  110. sum_amount=Sum('deliver_amount'))
  111. if sum_row:
  112. sum_count = sum_row['sum_count'] or 0
  113. sum_amount = sum_row['sum_amount'] or 0
  114. self.total_deliver_count = sum_count
  115. self.total_deliver_amount = sum_amount
  116. self.save()
  117. class GoodsGodownEntryDetail(models.Model):
  118. main = models.ForeignKey(GoodsGodownEntry, related_name='goods_godown_entry_detail_ref_main', verbose_name=u"成品入库单", on_delete=models.PROTECT)
  119. goods = models.ForeignKey(Goods, verbose_name=u"成品", on_delete=models.PROTECT)
  120. count = models.BigIntegerField(verbose_name=u"数量", default=0)
  121. price = models.BigIntegerField(verbose_name=u'单价', default=0)
  122. warehouse_stock = models.ForeignKey(WarehouseStock, verbose_name=u'仓别库存', on_delete=models.PROTECT, editable=False)
  123. stock_record = models.ForeignKey(WarehouseStockRecord, verbose_name=u'库存记录', on_delete=models.PROTECT, null=True, blank=True, related_name='goods_godown_entry_detail_ref_stock_record')
  124. amount = models.BigIntegerField(verbose_name=u'金额', default=0)
  125. invoice_amount = models.BigIntegerField(verbose_name=u'发票金额', default=0) #手工录入
  126. deliver_count = models.BigIntegerField(verbose_name=u"出库数量", default=0)
  127. deliver_amount = models.BigIntegerField(verbose_name=u"出库金额", default=0)
  128. notes = models.CharField(max_length=200, verbose_name=u"备注", blank=True, null=True)
  129. class Meta:
  130. db_table = "goods_godown_entry_detail"
  131. verbose_name = u"盘存管理"
  132. ordering = ('-id',)
  133. default_permissions = ()
  134. permissions = ( # 成品入库明细
  135. ("view_goods_inventory", u"浏览"),
  136. ("add_goods_inventory", u"添加"),
  137. ("check_goods_inventory", u"审核"),
  138. ("delete_goods_inventory", u"删除"),
  139. ("export_goods_inventory", u"导出"),
  140. ("print_goods_inventory", u"打印"),
  141. )