serializers.py 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744
  1. #coding=utf-8
  2. from libs import utils
  3. from django.db.models import Q, Sum
  4. from django.conf import settings
  5. from rest_framework import serializers
  6. from apps.base import Formater
  7. from apps.exceptions import CustomError
  8. from apps.foundation.models import BizLog
  9. from apps.serializer_errors import dump_serializer_errors
  10. from models import PurchasePlan, PurchaseUser, PurchasePlanDetail, PurchasePrice, PurchaseOrder, PurchaseOrderDetail, \
  11. GodownEntry, PurchaseInvoiceImage, \
  12. PurchasePayment, PurchasePaymentDetail, GodownEntry, GodownEntryDetail, GodownEntryReturn, GodownEntryReturnDetail, \
  13. PurchasePay
  14. from libs.booleancharfield import BooleanCharField, PriceShowCharField, AmountShowCharField, CountShowCharField, \
  15. TimeCharField, AmountShowCharFieldWithTwoDecimalPlaces
  16. from apps.warehouse.models import WarehouseStock
  17. from apps import base
  18. class PurchasePlanSerializer(serializers.ModelSerializer):
  19. status = serializers.CharField(read_only=True)
  20. total_count = CountShowCharField(read_only=True)
  21. status_text = serializers.CharField(source='get_status_display', read_only=True)
  22. demend_user_text = serializers.CharField(source='demend_user.name', read_only=True)
  23. demend_department_text = serializers.CharField(source='demend_department.name', read_only=True)
  24. create_time = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
  25. check_user_text = serializers.CharField(source='check_user.name', read_only=True)
  26. create_user_text = serializers.CharField(source='create_user.name', read_only=True)
  27. purchase_users = serializers.SerializerMethodField()
  28. check_time = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
  29. is_compact_text = serializers.SerializerMethodField()
  30. report_text = serializers.SerializerMethodField()
  31. # check_user_text2 = serializers.CharField(source='check_user2.name', read_only=True)
  32. # check_time2 = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
  33. # check_user_text3 = serializers.CharField(source='check_user3.name', read_only=True)
  34. # check_time3 = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
  35. class Meta:
  36. model = PurchasePlan
  37. fields = '__all__'
  38. def get_purchase_users(self, obj):
  39. data = []
  40. rows = PurchaseUser.objects.filter(purchase=obj)
  41. data.extend([s[0] for s in rows.values_list('purchase_user__name')])
  42. return ','.join(data)
  43. def get_is_compact_text(self, obj):
  44. data = obj.isCompart()
  45. return data
  46. def get_report_text(self, obj):
  47. data = obj.isReport()
  48. return data
  49. @staticmethod
  50. def factory(user, data, id=None):
  51. if id:
  52. instance = PurchasePlan.getById(id)
  53. else:
  54. instance = None
  55. serializer = PurchasePlanSerializer(instance, data=data)
  56. serializer.user = user
  57. return serializer
  58. def validate(self, data):
  59. data['demend_department'] = None
  60. if 'demend_user' in data and data['demend_user']:
  61. data['demend_department'] = data['demend_user'].department
  62. return data
  63. def create(self, validated_data):
  64. validated_data['create_user'] = self.user
  65. validated_data['department'] = self.user.department
  66. production = PurchasePlan.objects.create(**validated_data)
  67. BizLog.objects.addnew(
  68. self.user,
  69. BizLog.INSERT,
  70. u"添加采购计划[%s],id=%d" % (production.name, production.id),
  71. validated_data
  72. )
  73. return production
  74. def validSave(self):
  75. if self.is_valid():
  76. return self.save()
  77. else:
  78. raise CustomError(dump_serializer_errors(self))
  79. def update(self, instance, validated_data):
  80. instance = super(PurchasePlanSerializer, self).update(instance, validated_data)
  81. BizLog.objects.addnew(
  82. self.user,
  83. BizLog.UPDATE,
  84. u"修改采购计划[%s],id=%d" % (instance.name, instance.id),
  85. validated_data
  86. )
  87. return instance
  88. class PurchasePlanDetailSerializer(serializers.ModelSerializer):
  89. name = serializers.CharField(source='product.name', read_only=True)
  90. model = serializers.CharField(source='product.model', read_only=True)
  91. stock_count = CountShowCharField(source='product.stock_count', read_only=True)
  92. purchase_count = CountShowCharField()
  93. class Meta:
  94. model = PurchasePlanDetail
  95. fields = '__all__'
  96. @staticmethod
  97. def factory(user, data, id=None):
  98. if id:
  99. instances = PurchasePlanDetail.getById(id)
  100. else:
  101. instances = None
  102. serializer = PurchasePlanDetailSerializer(instances, data=data)
  103. serializer.user = user
  104. return serializer
  105. def create(self, validated_data):
  106. production = PurchasePlanDetail.objects.create(**validated_data)
  107. BizLog.objects.addnew(
  108. self.user,
  109. BizLog.INSERT,
  110. u"添加采购计划明细[%s],id=%d" % (production.product.name, production.id),
  111. validated_data
  112. )
  113. return production
  114. def validSave(self):
  115. if self.is_valid():
  116. return self.save()
  117. else:
  118. raise CustomError(dump_serializer_errors(self))
  119. def validate(self, data):
  120. data['purchase_count'] = Formater.formatCount(data['purchase_count'])
  121. return data
  122. def update(self, instance, validated_data):
  123. instance = super(PurchasePlanDetailSerializer, self).update(instance, validated_data)
  124. BizLog.objects.addnew(
  125. self.user,
  126. BizLog.UPDATE,
  127. u"修改采购计划明细[%s],id=%d" % (instance.name, instance.id),
  128. validated_data
  129. )
  130. return instance
  131. class PurchaseUserSerializer(serializers.ModelSerializer):
  132. purchase_user_text = serializers.CharField(source='purchase_user.name', read_only=True)
  133. class Meta:
  134. model = PurchaseUser
  135. fields = '__all__'
  136. @staticmethod
  137. def factory(user, data):
  138. instances = None
  139. serializer = PurchaseUserSerializer(instances, data=data)
  140. serializer.user = user
  141. return serializer
  142. def create(self, validated_data):
  143. purchaseuser = PurchaseUser.objects.create(**validated_data)
  144. BizLog.objects.addnew(
  145. self.user,
  146. BizLog.INSERT,
  147. u"添加采购计划[%s]采购员[%s],id=%d" % (purchaseuser.purchase.no, purchaseuser.purchase_user.name, purchaseuser.id),
  148. validated_data
  149. )
  150. return purchaseuser
  151. def validSave(self):
  152. if self.is_valid():
  153. return self.save()
  154. else:
  155. raise CustomError(dump_serializer_errors(self))
  156. def update(self, instance, validated_data):
  157. instance = super(PurchaseUserSerializer, self).update(instance, validated_data)
  158. BizLog.objects.addnew(
  159. self.user,
  160. BizLog.UPDATE,
  161. u"修改采购计划[%s]采购员[%s],id=%d" % (instance.purchase.no, instance.purchase_user.name, instance.id),
  162. validated_data
  163. )
  164. return instance
  165. class PurchasePriceSerializer(serializers.ModelSerializer):
  166. name = serializers.CharField(source='purchase_detail.product.name', read_only=True)
  167. model = serializers.CharField(source='purchase_detail.product.model', read_only=True)
  168. type_id = serializers.CharField(source='purchase_detail.product.type', read_only=True)
  169. type_text = serializers.CharField(source='purchase_detail.product.get_type_display', read_only=True)
  170. quality_request_text = serializers.CharField(source='purchase_detail.quality_request_text', read_only=True)
  171. purchase_count = CountShowCharField(source='purchase_detail.purchase_count', read_only=True)
  172. unit = serializers.CharField(source='purchase_detail.product.unit', read_only=True)
  173. demend_user_text = serializers.CharField(source='purchase_user.purchase.demend_user.name', read_only=True)
  174. purchase_user_text = serializers.CharField(source='purchase_user.name', read_only=True)
  175. product_time = serializers.DateTimeField(format=base.DATE_FORMAT, source='purchase_detail.product_time', read_only=True)
  176. supplier_text = serializers.CharField(source='supplier.name', read_only=True)
  177. price = PriceShowCharField()
  178. report_text = BooleanCharField(source='report', read_only=True)
  179. class Meta:
  180. model = PurchasePrice
  181. fields = '__all__'
  182. @staticmethod
  183. def factory(user, data, id=None):
  184. if id:
  185. instances = PurchasePrice.getById(id)
  186. else:
  187. instances = None
  188. serializer = PurchasePriceSerializer(instances, data=data)
  189. serializer.user = user
  190. return serializer
  191. def create(self, validated_data):
  192. purchaseprice = PurchasePrice.objects.create(**validated_data)
  193. BizLog.objects.addnew(
  194. self.user,
  195. BizLog.INSERT,
  196. u"添加采购计划[%s]报价[%s],id=%d" % (purchaseprice.purchase_detail.purchase.no, purchaseprice.price, purchaseprice.id),
  197. validated_data
  198. )
  199. return purchaseprice
  200. def validate(self, data):
  201. if 'price' in data:
  202. data['price'] = Formater.formatPrice(data['price'])
  203. return data
  204. def validSave(self):
  205. if self.is_valid():
  206. return self.save()
  207. else:
  208. raise CustomError(dump_serializer_errors(self))
  209. def update(self, instance, validated_data):
  210. instance = super(PurchasePriceSerializer, self).update(instance, validated_data)
  211. BizLog.objects.addnew(
  212. self.user,
  213. BizLog.UPDATE,
  214. u"修改采购计划[%s]报价[%s],id=%d" % (instance.purchase_detail.purchase.no, instance.price, instance.id),
  215. validated_data
  216. )
  217. return instance
  218. class PurchaseOrderSerializer(serializers.ModelSerializer):
  219. create_time = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
  220. check_time = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
  221. status_text = serializers.CharField(source='get_status_display', read_only=True)
  222. arrval_text = serializers.CharField(source='get_arrval_display', read_only=True)
  223. check_user_text = serializers.CharField(source='check_user.name', read_only=True)
  224. create_user_text = serializers.CharField(source='create_user.name', read_only=True)
  225. supplier_name = serializers.CharField(source='supplier.name', read_only=True)
  226. supplier_type = serializers.CharField(source='supplier.type', read_only=True)
  227. supplier_contacts = serializers.CharField(source='supplier.contacts', read_only=True)
  228. supplier_phone_number = serializers.CharField(source='supplier.phone_number', read_only=True)
  229. supplier_opening_bank = serializers.CharField(source='supplier.opening_bank', read_only=True)
  230. supplier_account = serializers.CharField(source='supplier.account', read_only=True)
  231. products = serializers.SerializerMethodField()
  232. entries = serializers.SerializerMethodField()
  233. arrvals = serializers.SerializerMethodField()
  234. is_pay = serializers.SerializerMethodField()
  235. payment_amount = serializers.SerializerMethodField()
  236. count = CountShowCharField()
  237. amount = AmountShowCharFieldWithTwoDecimalPlaces()
  238. apply_amount = AmountShowCharFieldWithTwoDecimalPlaces(read_only=True)
  239. # check_user_text2 = serializers.CharField(source='check_user2.name', read_only=True)
  240. # check_time2 = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
  241. # check_user_text3 = serializers.CharField(source='check_user3.name', read_only=True)
  242. # check_time3 = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
  243. class Meta:
  244. model = PurchaseOrder
  245. fields = '__all__'
  246. def get_products(self, obj):
  247. data = []
  248. rows = PurchaseOrderDetail.objects.filter(main=obj)
  249. data.extend([s[0] for s in rows.values_list('product__name')])
  250. return ','.join(data)
  251. def get_entries(self, obj):
  252. data = []
  253. rows = GodownEntry.objects.filter(purchase_order=obj)
  254. data.extend([s[0] for s in rows.values_list('no')])
  255. return ','.join(data)
  256. def get_is_pay(self, obj):
  257. data = 0
  258. rows = PurchasePayment.objects.filter(order=obj)
  259. if rows:
  260. data = 1
  261. return data
  262. def get_arrvals(self, obj):
  263. sum_rows = PurchaseOrderDetail.objects.filter(main=obj).aggregate(sum_count=Sum('arrval_count'))
  264. return Formater.formatCountShow(sum_rows['sum_count'] or 0)
  265. def get_payment_amount(self, obj):
  266. sum_rows = PurchasePayment.objects.filter(order=obj).aggregate(sum_amount=Sum('actual_amount'))
  267. return Formater.formatAmountShowWithTwoDecimalPlaces(sum_rows['sum_amount'] or 0)
  268. @staticmethod
  269. def factory(user, data, id=None):
  270. if id:
  271. instance = PurchaseOrder.getById(id)
  272. else:
  273. instance = None
  274. serializer = PurchaseOrderSerializer(instance, data=data)
  275. serializer.user = user
  276. return serializer
  277. def create(self, validated_data):
  278. validated_data['create_user'] = self.user
  279. validated_data['department'] = self.user.department
  280. order = PurchaseOrder.objects.create(**validated_data)
  281. BizLog.objects.addnew(
  282. self.user,
  283. BizLog.INSERT,
  284. u"添加采购合同[%s],id=%d" % (order.no, order.id),
  285. validated_data
  286. )
  287. return order
  288. def validSave(self):
  289. if self.is_valid():
  290. return self.save()
  291. else:
  292. raise CustomError(dump_serializer_errors(self))
  293. def update(self, instance, validated_data):
  294. instance = super(PurchaseOrderSerializer, self).update(instance, validated_data)
  295. BizLog.objects.addnew(
  296. self.user,
  297. BizLog.UPDATE,
  298. u"修改采购合同[%s],id=%d" % (instance.no, instance.id),
  299. validated_data
  300. )
  301. return instance
  302. class PurchaseOrderDetailSerializer(serializers.ModelSerializer):
  303. name = serializers.CharField(source='product.name', read_only=True)
  304. model = serializers.CharField(source='product.model', read_only=True)
  305. supplier_name = serializers.CharField(source='main.supplier.name', read_only=True)
  306. order_no = serializers.CharField(source='main.no', read_only=True)
  307. count = CountShowCharField()
  308. arrval_count = CountShowCharField(read_only=True)
  309. price = PriceShowCharField()
  310. amount = AmountShowCharField(read_only=True)
  311. create_time = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
  312. check_time = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
  313. invoice_date = serializers.DateField(format=base.DATE_FORMAT, read_only=True)
  314. create_user_text = serializers.CharField(source='create_user.name', read_only=True)
  315. check_user_text = serializers.CharField(source='check_user.name', read_only=True)
  316. invoice_amount = AmountShowCharField(read_only=True)
  317. check_status_text = serializers.CharField(source='get_check_status_display', read_only=True)
  318. images = serializers.SerializerMethodField()
  319. class Meta:
  320. model = PurchaseOrderDetail
  321. fields = '__all__'
  322. def get_images(self, obj):
  323. data = []
  324. rows = PurchaseInvoiceImage.objects.filter(order_detail=obj)
  325. data.extend([s[0] for s in rows.values_list('invoice_image')])
  326. return ','.join(data)
  327. @staticmethod
  328. def factory(user, data):
  329. instances = None
  330. serializer = PurchaseOrderDetailSerializer(instances, data=data)
  331. serializer.user = user
  332. return serializer
  333. def create(self, validated_data):
  334. order = PurchaseOrderDetail.objects.create(**validated_data)
  335. BizLog.objects.addnew(
  336. self.user,
  337. BizLog.INSERT,
  338. u"添加采购合同明细[%s],id=%d" % (order.main.no, order.id),
  339. validated_data
  340. )
  341. return order
  342. def validSave(self):
  343. if self.is_valid():
  344. return self.save()
  345. else:
  346. raise CustomError(dump_serializer_errors(self))
  347. def validate(self, data):
  348. data['price'] = Formater.formatPrice(data['price'])
  349. data['count'] = Formater.formatCount(data['count'])
  350. data['amount'] = data['count'] * data['price']
  351. return data
  352. def update(self, instance, validated_data):
  353. instance = super(PurchaseOrderDetailSerializer, self).update(instance, validated_data)
  354. BizLog.objects.addnew(
  355. self.user,
  356. BizLog.UPDATE,
  357. u"修改采购合同明细[%s],id=%d" % (instance.main.no, instance.id),
  358. validated_data
  359. )
  360. return instance
  361. class GodownEntrySerializer(serializers.ModelSerializer):
  362. status = serializers.CharField(read_only=True)
  363. no = serializers.CharField(read_only=True)
  364. status_text = serializers.CharField(source='get_status_display', read_only=True)
  365. create_user_text = serializers.CharField(source='create_user.name', read_only=True)
  366. department_text = serializers.CharField(source='department.name', read_only=True)
  367. supplier_text = serializers.CharField(source='supplier.name', read_only=True)
  368. total_count = CountShowCharField(read_only=True)
  369. total_amount = AmountShowCharField(read_only=True)
  370. total_invoice_amount = AmountShowCharField(read_only=True)
  371. check_user_text = serializers.CharField(source='check_user.name', read_only=True)
  372. check_time = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
  373. create_time = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
  374. warehouse_text = serializers.CharField(source='warehouse.name', read_only=True)
  375. purchase_order_no = serializers.CharField(source='purchase_order.no', read_only=True)
  376. class Meta:
  377. model = GodownEntry
  378. fields = '__all__'
  379. @staticmethod
  380. def factory(user, data, id=None):
  381. if id:
  382. instance = GodownEntry.getById(id)
  383. else:
  384. instance = None
  385. serializer = GodownEntrySerializer(instance, data=data)
  386. serializer.user = user
  387. return serializer
  388. def create(self, validated_data):
  389. validated_data['create_user'] = self.user
  390. validated_data['department'] = self.user.department
  391. instance = GodownEntry.objects.create(**validated_data)
  392. BizLog.objects.addnew(
  393. self.user,
  394. BizLog.INSERT,
  395. u"添加入库单[%s],id=%d" % (instance.no, instance.id),
  396. validated_data
  397. )
  398. return instance
  399. def validSave(self):
  400. if self.is_valid():
  401. return self.save()
  402. else:
  403. raise CustomError(dump_serializer_errors(self))
  404. def update(self, instance, validated_data):
  405. instance = super(GodownEntrySerializer, self).update(instance, validated_data)
  406. BizLog.objects.addnew(
  407. self.user,
  408. BizLog.UPDATE,
  409. u"修改入库单[%s],id=%d" % (instance.no, instance.id),
  410. validated_data
  411. )
  412. return instance
  413. class GodownEntryDetailSerializer(serializers.ModelSerializer):
  414. product_base_text = serializers.CharField(source='product_base.name', read_only=True)
  415. product_base_model = serializers.CharField(source='product_base.model', read_only=True)
  416. unit_text = serializers.CharField(source='product_base.unit', read_only=True)
  417. count = CountShowCharField()
  418. price = PriceShowCharField()
  419. amount = AmountShowCharField(read_only=True)
  420. invoice_amount = AmountShowCharField()
  421. class Meta:
  422. model = GodownEntryDetail
  423. fields = '__all__'
  424. @staticmethod
  425. def factory(user, data):
  426. serializer = GodownEntryDetailSerializer(None, data=data)
  427. serializer.user = user
  428. return serializer
  429. def create(self, validated_data):
  430. instance = GodownEntryDetail.objects.create(**validated_data)
  431. BizLog.objects.addnew(
  432. self.user,
  433. BizLog.INSERT,
  434. u"添加入库明细[%s],id=%d" % (instance.product_base.name, instance.id),
  435. validated_data
  436. )
  437. return instance
  438. def validSave(self):
  439. if self.is_valid():
  440. return self.save()
  441. else:
  442. raise CustomError(dump_serializer_errors(self))
  443. def validate(self, data):
  444. data['price'] = Formater.formatPrice(data['price'])
  445. data['count'] = Formater.formatCount(data['count'])
  446. data['amount'] = data['count'] * data['price']
  447. data['invoice_amount'] = Formater.formatAmount(data['invoice_amount'])
  448. warehouse_stock = WarehouseStock.getByWarehouseAndProduct(data['main'].warehouse, data['product_base'])
  449. data['warehouse_stock'] = warehouse_stock
  450. return data
  451. class GodownEntryReturnSerializer(serializers.ModelSerializer):
  452. status = serializers.CharField(read_only=True)
  453. no = serializers.CharField(read_only=True)
  454. status_text = serializers.CharField(source='get_status_display', read_only=True)
  455. create_user_text = serializers.CharField(source='create_user.name', read_only=True)
  456. department_text = serializers.CharField(source='department.name', read_only=True)
  457. supplier_text = serializers.CharField(source='supplier.name', read_only=True)
  458. total_count = CountShowCharField(read_only=True)
  459. total_amount = AmountShowCharField(read_only=True)
  460. warehouse_text = serializers.CharField(source='warehouse.name', read_only=True)
  461. check_user_text = serializers.CharField(source='check_user.name', read_only=True)
  462. check_time = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
  463. create_time = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
  464. class Meta:
  465. model = GodownEntryReturn
  466. fields = '__all__'
  467. @staticmethod
  468. def factory(user, data, id=None):
  469. if id:
  470. instance = GodownEntryReturn.getById(id)
  471. else:
  472. instance = None
  473. serializer = GodownEntryReturnSerializer(instance, data=data)
  474. serializer.user = user
  475. return serializer
  476. def create(self, validated_data):
  477. validated_data['create_user'] = self.user
  478. validated_data['department'] = self.user.department
  479. instance = GodownEntryReturn.objects.create(**validated_data)
  480. BizLog.objects.addnew(
  481. self.user,
  482. BizLog.INSERT,
  483. u"添加退货单[%s],id=%d" % (instance.no, instance.id),
  484. validated_data
  485. )
  486. return instance
  487. def validSave(self):
  488. if self.is_valid():
  489. return self.save()
  490. else:
  491. raise CustomError(dump_serializer_errors(self))
  492. def update(self, instance, validated_data):
  493. instance = super(GodownEntryReturnSerializer, self).update(instance, validated_data)
  494. BizLog.objects.addnew(
  495. self.user,
  496. BizLog.UPDATE,
  497. u"修改退货单[%s],id=%d" % (instance.no, instance.id),
  498. validated_data
  499. )
  500. return instance
  501. class GodownEntryReturnDetailSerializer(serializers.ModelSerializer):
  502. main_no = serializers.CharField(source='main.no', read_only=True)
  503. main_supplier = serializers.CharField(source='main.supplier.name', read_only=True)
  504. godownentry_no = serializers.CharField(source='godownentry_detail.main.no', read_only=True)
  505. main_warehouse = serializers.CharField(source='main.warehouse.name', read_only=True)
  506. main_create_user = serializers.CharField(source='main.create_user.name', read_only=True)
  507. main_create_time = TimeCharField(source='main.create_time', read_only=True)
  508. main_check_user = serializers.CharField(source='main.create_user.name', read_only=True)
  509. main_check_time = TimeCharField(source='main.check_time.name', read_only=True)
  510. product_base_text = serializers.CharField(source='product_base.name', read_only=True)
  511. product_base_model = serializers.CharField(source='product_base.model', read_only=True)
  512. main_notes = serializers.CharField(source='main.notes', read_only=True)
  513. count = CountShowCharField()
  514. price = PriceShowCharField(read_only=True)
  515. amount = AmountShowCharField()
  516. class Meta:
  517. model = GodownEntryReturnDetail
  518. fields = '__all__'
  519. @staticmethod
  520. def factory(user, data):
  521. serializer = GodownEntryReturnDetailSerializer(None, data=data)
  522. serializer.user = user
  523. return serializer
  524. def create(self, validated_data):
  525. instance = GodownEntryReturnDetail.objects.create(**validated_data)
  526. BizLog.objects.addnew(
  527. self.user,
  528. BizLog.INSERT,
  529. u"添加退货明细[%s],id=%d" % (instance.product_base.name, instance.id),
  530. validated_data
  531. )
  532. return instance
  533. def validSave(self):
  534. if self.is_valid():
  535. return self.save()
  536. else:
  537. raise CustomError(dump_serializer_errors(self))
  538. def validate(self, data):
  539. data['count'] = Formater.formatCount(data['count'])
  540. data['amount'] = Formater.formatAmount(data['amount'])
  541. data['price'] = data['amount'] / data['count']
  542. warehouse_stock = WarehouseStock.getByWarehouseAndProduct(data['main'].warehouse, data['product_base'])
  543. data['warehouse_stock'] = warehouse_stock
  544. return data
  545. class PurchasePaymentSerializer(serializers.ModelSerializer):
  546. create_time = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
  547. check_time = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
  548. status_text = serializers.CharField(source='get_status_display', read_only=True)
  549. check_user_text = serializers.CharField(source='check_user.name', read_only=True)
  550. create_user_text = serializers.CharField(source='create_user.name', read_only=True)
  551. supplier_name = serializers.CharField(source='order.supplier.name', read_only=True)
  552. supplier_account = serializers.CharField(source='order.supplier.account', read_only=True)
  553. supplier_bank = serializers.CharField(source='order.supplier.opening_bank', read_only=True)
  554. order_no = serializers.CharField(source='order.no', read_only=True)
  555. payment = BooleanCharField(source='is_pay', read_only=True)
  556. amount = AmountShowCharFieldWithTwoDecimalPlaces()
  557. actual_amount = AmountShowCharFieldWithTwoDecimalPlaces(read_only=True)
  558. apply_amount = AmountShowCharFieldWithTwoDecimalPlaces()
  559. amount_CNY = serializers.SerializerMethodField()
  560. actual_amount_CNY = serializers.SerializerMethodField()
  561. apply_amount_CNY = serializers.SerializerMethodField()
  562. # review_user_text = serializers.CharField(source='review_user.name', read_only=True)
  563. # review_time = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
  564. # ratify_user_text = serializers.CharField(source='ratify_user.name', read_only=True)
  565. # ratify_time = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
  566. class Meta:
  567. model = PurchasePayment
  568. fields = '__all__'
  569. def get_amount_CNY(self, obj):
  570. retval = Formater.formatAmountShow(obj.amount)
  571. return utils.number2CNY(float(retval))
  572. def get_actual_amount_CNY(self, obj):
  573. retval = Formater.formatAmountShow(obj.actual_amount)
  574. return utils.number2CNY(float(retval))
  575. def get_apply_amount_CNY(self, obj):
  576. retval = Formater.formatAmountShow(obj.apply_amount)
  577. return utils.number2CNY(float(retval))
  578. @staticmethod
  579. def factory(user, data, id=None):
  580. if id:
  581. instance = PurchasePayment.getById(id)
  582. else:
  583. instance = None
  584. serializer = PurchasePaymentSerializer(instance, data=data)
  585. serializer.user = user
  586. return serializer
  587. def create(self, validated_data):
  588. validated_data['create_user'] = self.user
  589. validated_data['department'] = self.user.department
  590. order = PurchasePayment.objects.create(**validated_data)
  591. BizLog.objects.addnew(
  592. self.user,
  593. BizLog.INSERT,
  594. u"添加采购付款单[%s],id=%d" % (order.no, order.id),
  595. validated_data
  596. )
  597. return order
  598. def validSave(self):
  599. if self.is_valid():
  600. return self.save()
  601. else:
  602. raise CustomError(dump_serializer_errors(self))
  603. def update(self, instance, validated_data):
  604. instance = super(PurchasePaymentSerializer, self).update(instance, validated_data)
  605. BizLog.objects.addnew(
  606. self.user,
  607. BizLog.UPDATE,
  608. u"修改采购付款单[%s],id=%d" % (instance.no, instance.id),
  609. validated_data
  610. )
  611. return instance
  612. class PurchasePaySerializer(serializers.ModelSerializer):
  613. payment_type_text = serializers.CharField(source='get_status_display', read_only=True)
  614. payment_time = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
  615. payment_user_text = serializers.CharField(source='payment_user.name', read_only=True)
  616. class Meta:
  617. model = PurchasePay
  618. fields = '__all__'
  619. @staticmethod
  620. def factory(user, data, id=None):
  621. if id:
  622. instance = PurchasePay.getById(id)
  623. else:
  624. instance = None
  625. serializer = PurchasePaySerializer(instance, data=data)
  626. serializer.user = user
  627. return serializer
  628. def create(self, validated_data):
  629. validated_data['payment_user'] = self.user
  630. validated_data['payment_department'] = self.user.department
  631. order = PurchasePay.objects.create(**validated_data)
  632. BizLog.objects.addnew(
  633. self.user,
  634. BizLog.INSERT,
  635. u"添加采购付款单明细id=%d" % (order.id),
  636. validated_data
  637. )
  638. return order
  639. def validSave(self):
  640. if self.is_valid():
  641. return self.save()
  642. else:
  643. raise CustomError(dump_serializer_errors(self))