models.py 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  1. # coding=utf-8
  2. from django.utils import timezone
  3. from apps.foundation.models import Option
  4. from apps.customer.models import Customer
  5. from apps.exceptions import CustomError
  6. from django.db import models
  7. from django.conf import settings
  8. from django.db.models import Sum, F
  9. from apps.account.models import User, Department
  10. from apps.goods.models import Goods
  11. from apps.warehouse.models import Warehouse, WarehouseStock, WarehouseRecord, WarehouseStockRecord
  12. class SaleOrder(models.Model):
  13. no = models.CharField(max_length=20, verbose_name=u"单号", editable=False)
  14. customer = models.ForeignKey(Customer, verbose_name=u"客户", on_delete=models.PROTECT)
  15. status = models.PositiveSmallIntegerField(choices=settings.CHECK_STATUS_CHOICES, default=settings.DEFAULT, verbose_name=u"状态")
  16. notes = models.CharField(max_length=200, verbose_name=u"备注", blank=True, null=True)
  17. create_time = models.DateTimeField(verbose_name=u"创建时间", default=timezone.now, blank=True)
  18. create_user = models.ForeignKey(User, related_name='sale_order_ref_create_user', verbose_name=u"创建人", on_delete=models.PROTECT, editable=False)
  19. department = models.ForeignKey(Department, verbose_name=u"创建部门", editable=False, on_delete=models.PROTECT)
  20. check_time = models.DateTimeField(verbose_name=u"审核时间", null=True)
  21. check_user = models.ForeignKey(User, related_name='sale_order_ref_check_user', verbose_name=u"审核人", on_delete=models.PROTECT, null=True)
  22. count = models.BigIntegerField(u'发货数量', default=0)
  23. amount = models.BigIntegerField(u'发货金额', default=0)
  24. receive_count = models.BigIntegerField(u'收货数量', default=0)
  25. receive_amount = models.BigIntegerField(u'收货金额', default=0)
  26. pay_amount = models.BigIntegerField(u'已付金额', default=0)
  27. put_amount = models.BigIntegerField(u'装车费', default=0)
  28. fare_amount = models.BigIntegerField(u'运费', default=0)
  29. loss_amount = models.BigIntegerField(u'扣减金额', default=0)
  30. loss_notes = models.CharField(max_length=200, verbose_name=u"扣减备注", blank=True, null=True)
  31. cleared = models.BooleanField(verbose_name=u"结清", default=False)
  32. class Meta:
  33. db_table = "sale_order"
  34. verbose_name = u"订单管理"
  35. ordering = ('-id',)
  36. index_together = (
  37. 'create_time', 'check_time', 'status'
  38. )
  39. unique_together = (
  40. 'no',
  41. )
  42. default_permissions = ()
  43. permissions = ( # 销售订单管理
  44. ("view_sale_order", u"浏览"),
  45. ("add_sale_order", u"添加"),
  46. ("check_sale_order", u"审核"),
  47. ("delete_sale_order", u"删除"),
  48. ("export_sale_order", u"导出"),
  49. ("print_sale_order", u"打印"),
  50. ("loss_sale_order", u"扣减"),
  51. ("pay_sale_order", u"结算"),
  52. )
  53. @staticmethod
  54. def getById(id):
  55. instance = SaleOrder.objects.filter(pk=id).first()
  56. if not instance:
  57. raise CustomError(u'未找到相应的订单')
  58. return instance
  59. def updateAmount(self):
  60. sum_count = 0
  61. sum_amount = 0
  62. sum_row = SaleOrderDetail.objects.filter(main=self).aggregate(sum_count=Sum('count'), sum_amount=Sum('amount'))
  63. if sum_row:
  64. sum_count = sum_row['sum_count'] or 0
  65. sum_amount = sum_row['sum_amount'] or 0
  66. self.count = sum_count
  67. self.amount = sum_amount
  68. self.save()
  69. def updateReceiveAmount(self):
  70. sum_receive_count = 0
  71. sum_receive_amount = 0
  72. sum_row = SaleOrderDetail.objects.filter(main=self).aggregate(
  73. sum_receive_count=Sum('receive_count'), sum_receive_amount=Sum(F('receive_count')*F('price'))
  74. )
  75. if sum_row:
  76. sum_receive_count = sum_row['sum_receive_count'] or 0
  77. sum_receive_amount = sum_row['sum_receive_amount'] or 0
  78. self.receive_count = sum_receive_count
  79. self.receive_amount = sum_receive_amount
  80. self.save()
  81. def save(self, *args, **kwargs):
  82. if self.no == None or self.no == '':
  83. now = timezone.now()
  84. rows = SaleOrder.objects.filter(create_time__gte=now.strftime('%Y-%m-%d')).order_by('-no')
  85. count = rows.count()
  86. if count == 0:
  87. self.no = 'GS%s%03d' % (now.strftime('%Y%m%d'), count + 1)
  88. else:
  89. self.no = rows[0].no[:2] + str(int(rows[0].no[2:]) + 1)
  90. super(SaleOrder, self).save(*args, **kwargs)
  91. class SaleOrderDetail(models.Model):
  92. main = models.ForeignKey(SaleOrder, verbose_name=u'销售单', on_delete=models.PROTECT)
  93. goods = models.ForeignKey(Goods, verbose_name=u'产品', on_delete=models.PROTECT)
  94. quality_request = models.ForeignKey(Option, verbose_name=u"质量标准", null=True, blank=True, on_delete=models.PROTECT)
  95. count = models.BigIntegerField(u'数量')
  96. receive_count = models.BigIntegerField(u'收货数量')
  97. price = models.BigIntegerField(u'单价')
  98. amount = models.BigIntegerField(u'金额', editable=False)
  99. class Meta:
  100. db_table = "sale_order_detail"
  101. verbose_name = u"入库查询"
  102. ordering = ('-id',)
  103. default_permissions = ()
  104. permissions = (# 销售订单明细
  105. ("view_goods_godownentry_query", u"浏览"),
  106. ("export_goods_godownentry_query", u"导出"),
  107. ("print_goods_godownentry_query", u"打印"),
  108. )
  109. class GoodsDeliver(models.Model):
  110. no = models.CharField(max_length=20, verbose_name=u"出库单号", editable=False)
  111. create_time = models.DateTimeField(verbose_name=u"创建时间", default=timezone.now)
  112. create_user = models.ForeignKey(User, verbose_name=u"创建人", related_name='goodsdeliver_ref_create_user',
  113. on_delete=models.PROTECT, blank=True, editable=False)
  114. customer = models.ForeignKey(Customer, verbose_name=u"客户", on_delete=models.PROTECT, blank=True, null=True)
  115. department = models.ForeignKey(Department, verbose_name=u"创建部门", related_name='goodsdeliver_ref_department',on_delete=models.PROTECT, blank=True, editable=False)
  116. status = models.PositiveSmallIntegerField(choices=settings.CHECK_STATUS_CHOICES, verbose_name=u"审核状态",default=settings.DEFAULT)
  117. check_user = models.ForeignKey(User, related_name='goodsdeliver_ref_check_user', verbose_name=u"审核人",on_delete=models.PROTECT, blank=True, null=True)
  118. check_time = models.DateTimeField(verbose_name=u"审核时间", blank=True, null=True)
  119. agent_user = models.ForeignKey(User, verbose_name=u"经办人", related_name='goodsdeliver_ref_agent_user', on_delete=models.PROTECT)
  120. agent_department = models.ForeignKey(Department, verbose_name=u"经办人部门", related_name='goodsdeliver_ref_agent_department', on_delete=models.PROTECT, blank=True, editable=False)
  121. warehouse = models.ForeignKey(Warehouse, verbose_name=u'仓别', on_delete=models.PROTECT)
  122. sale_order = models.ForeignKey(SaleOrder, verbose_name=u'销售订单', on_delete=models.PROTECT, blank=True, null=True)
  123. notes = models.CharField(max_length=200, verbose_name=u"备注", blank=True, null=True)
  124. total_count = models.BigIntegerField(verbose_name=u'合计数量', default=0)
  125. total_cost = models.BigIntegerField(verbose_name=u'合计成本', default=0)
  126. total_amount = models.BigIntegerField(verbose_name=u'合计销售价', default=0, blank=True)
  127. return_count = models.BigIntegerField(verbose_name=u"合计退库数量", default=0)
  128. return_cost = models.BigIntegerField(verbose_name=u"合计退库成本", default=0)
  129. class Meta:
  130. db_table = "goods_deliver"
  131. verbose_name = u"出库管理"
  132. ordering = ('-id',)
  133. index_together = (
  134. 'create_time', 'check_time', 'status'
  135. )
  136. unique_together = (
  137. 'no',
  138. )
  139. default_permissions = ()
  140. permissions = ( # 成品出库管理
  141. ("view_goods_deliver", u"浏览"),
  142. ("add_goods_deliver", u"添加"),
  143. ("check_goods_deliver", u"审核"),
  144. ("delete_goods_deliver", u"删除"),
  145. ("export_goods_deliver", u"导出"),
  146. ("print_goods_deliver", u"打印"),
  147. )
  148. @staticmethod
  149. def getById(id):
  150. instances = GoodsDeliver.objects.filter(id=id).first()
  151. if not instances:
  152. raise CustomError(u'未找到相应的出库单')
  153. return instances
  154. def save(self, *args, **kwargs):
  155. if self.no == None or self.no == '':
  156. now = timezone.now()
  157. rows = GoodsDeliver.objects.filter(create_time__gte=now.strftime('%Y-%m-%d')).order_by('-no')
  158. count = rows.count()
  159. if count == 0:
  160. self.no = 'GC%s%03d' % (now.strftime('%Y%m%d'), count + 1)
  161. else:
  162. self.no = rows[0].no[:2] + str(int(rows[0].no[2:]) + 1)
  163. super(GoodsDeliver, self).save(*args, **kwargs)
  164. def update_total(self):
  165. total_count = 0
  166. total_cost = 0
  167. total_amount = 0
  168. sum_row = GoodsDeliverDetail.objects.filter(main=self).aggregate(total_count=Sum('count'), total_cost=Sum('total_cost'), total_amount=Sum('total_amount'))
  169. if sum_row:
  170. total_count = sum_row['total_count'] or 0
  171. total_cost = sum_row['total_cost'] or 0
  172. total_amount = sum_row['total_amount'] or 0
  173. self.total_count = total_count
  174. self.total_cost = total_cost
  175. self.total_amount = total_amount
  176. self.save()
  177. def update_return(self):
  178. return_count = 0
  179. return_cost = 0
  180. sum_row = GoodsDeliverDetail.objects.filter(main=self).aggregate(return_count=Sum('return_count'),
  181. return_cost=Sum('return_cost'))
  182. if sum_row:
  183. return_count = sum_row['return_count'] or 0
  184. return_cost = sum_row['return_cost'] or 0
  185. self.return_count = return_count
  186. self.return_cost = return_cost
  187. self.save()
  188. class GoodsDeliverDetail(models.Model):
  189. main = models.ForeignKey(GoodsDeliver, verbose_name=u'出库单', on_delete=models.PROTECT, related_name='goods_deliver_details')
  190. product_base = models.ForeignKey(Goods, verbose_name=u'产品', on_delete=models.PROTECT)
  191. count = models.BigIntegerField(verbose_name=u'数量', default=0)
  192. price = models.BigIntegerField(verbose_name=u'单价', default=0)
  193. warehouse_stock = models.ForeignKey(WarehouseStock, verbose_name=u'仓别库存', editable=False, on_delete=models.PROTECT)
  194. warehouse_record = models.ForeignKey(WarehouseRecord, verbose_name=u'库存记录', on_delete=models.PROTECT, null=True,
  195. blank=True, related_name='goods_deliver_detail_ref_warehouse_record')
  196. warehouse_stockrecord = models.ForeignKey(WarehouseStockRecord, verbose_name=u'入库库存记录', on_delete=models.PROTECT,
  197. null=True, blank=True,
  198. related_name='goods_deliver_detail_ref_warehouse_stock_record')
  199. total_cost = models.BigIntegerField(verbose_name=u'成本合计', default=0)
  200. total_amount = models.BigIntegerField(verbose_name=u'销售价合计', default=0, blank=True)
  201. return_count = models.BigIntegerField(verbose_name=u'退库数量', default=0)
  202. return_cost = models.BigIntegerField(verbose_name=u'退库成本合计', default=0)
  203. notes = models.CharField(max_length=200, verbose_name=u"备注", blank=True, null=True)
  204. class Meta:
  205. db_table = "goods_deliver_detail"
  206. verbose_name = u"出库查询"
  207. ordering = ('-id',)
  208. default_permissions = ()
  209. permissions = (# 成品出库管理明细
  210. ("view_goods_deliver_query", u"浏览"),
  211. ("export_goods_deliver_query", u"导出"),
  212. ("print_goods_deliver_query", u"打印"),
  213. )
  214. def updateReturn(self):
  215. return_count = 0
  216. return_cost = 0
  217. sum_row = GoodsDeliverReturnDetail.objects.filter(deliver_detail=self).aggregate(return_count=Sum('return_count'),
  218. return_cost=Sum('return_cost'))
  219. if sum_row:
  220. return_count = sum_row['return_count'] or 0
  221. return_cost = sum_row['return_cost'] or 0
  222. self.return_count = return_count
  223. self.return_cost = return_cost
  224. self.save()
  225. class GoodsDeliverReturn(models.Model):
  226. no = models.CharField(max_length=20, verbose_name=u"退库单号", editable=False)
  227. reason = models.CharField(max_length=500, verbose_name=u"原因", blank=True, null=True)
  228. create_time = models.DateTimeField(verbose_name=u"创建时间", default=timezone.now)
  229. create_user = models.ForeignKey(User, verbose_name=u"创建人", on_delete=models.PROTECT, blank=True, editable=False)
  230. department = models.ForeignKey(Department, verbose_name=u"创建部门", on_delete=models.PROTECT, blank=True, editable=False)
  231. return_count = models.BigIntegerField(verbose_name=u'退库合计数量', default=0)
  232. return_cost = models.BigIntegerField(verbose_name=u'退库合计成本', default=0)
  233. class Meta:
  234. db_table = "goods_deliver_return"
  235. verbose_name = u"退库管理"
  236. ordering = ('-id',)
  237. index_together = (
  238. 'create_time',
  239. )
  240. unique_together = (
  241. 'no',
  242. )
  243. default_permissions = ()
  244. permissions = (
  245. ("view_goods_deliver_return", u"浏览"),
  246. ("add_goods_deliver_return", u"添加"),
  247. ("print_goods_deliver_return", u"打印"),
  248. )
  249. @staticmethod
  250. def getByIds(ids):
  251. return GoodsDeliverReturn.objects.filter(id__in=ids)
  252. @staticmethod
  253. def getById(id):
  254. instances = GoodsDeliverReturn.objects.filter(id=id).first()
  255. if not instances:
  256. raise CustomError(u'未找到相应的退库单')
  257. return instances
  258. def save(self, *args, **kwargs):
  259. if self.no == None or self.no == '':
  260. now = timezone.now()
  261. rows = GoodsDeliverReturn.objects.filter(create_time__gte=now.strftime('%Y-%m-%d')).order_by('-no')
  262. count = rows.count()
  263. if count == 0:
  264. self.no = 'TK%s%03d' % (now.strftime('%Y%m%d'), count + 1)
  265. else:
  266. self.no = rows[0].no[:2] + str(int(rows[0].no[2:]) + 1)
  267. super(GoodsDeliverReturn, self).save(*args, **kwargs)
  268. def update_total(self):
  269. return_count = 0
  270. return_cost = 0
  271. sum_row = GoodsDeliverReturnDetail.objects.filter(main=self).aggregate(return_count=Sum('return_count'),
  272. return_cost=Sum('return_cost'))
  273. if sum_row:
  274. return_count = sum_row['return_count'] or 0
  275. return_cost = sum_row['return_cost'] or 0
  276. self.return_count = return_count
  277. self.return_cost = return_cost
  278. self.save()
  279. class GoodsDeliverReturnDetail(models.Model):
  280. main = models.ForeignKey(GoodsDeliverReturn, verbose_name=u'退库单', on_delete=models.PROTECT, related_name='goods_deliver_return_details')
  281. deliver_detail = models.ForeignKey(GoodsDeliverDetail, verbose_name=u'出库明细', on_delete=models.PROTECT)
  282. product_base = models.ForeignKey(Goods, verbose_name=u'产品', on_delete=models.PROTECT)
  283. return_count = models.BigIntegerField(verbose_name=u'退库数量', default=0)
  284. return_cost = models.BigIntegerField(verbose_name=u'退库成本合计', default=0)
  285. warehouse_stock = models.ForeignKey(WarehouseStock, verbose_name=u'仓别库存', on_delete=models.PROTECT, editable=False)
  286. warehouse_record = models.ForeignKey(WarehouseRecord, verbose_name=u'库存记录', on_delete=models.PROTECT, null=True,
  287. blank=True, related_name='goods_return_deliver_detail_ref_warehouse_record')
  288. notes = models.CharField(max_length=200, verbose_name=u"备注", blank=True, null=True)
  289. class Meta:
  290. db_table = "goods_deliver_detail_return"
  291. verbose_name = u"退库查询"
  292. ordering = ('-id',)
  293. default_permissions = ()
  294. permissions = (# 退库管理明细
  295. ("view_goods_deliver_return_query", u"浏览"),
  296. ("export_goods_deliver_return_query", u"导出"),
  297. )