views.py 48 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059
  1. # coding=utf-8
  2. import traceback
  3. import json
  4. from django.db import models,connection
  5. from libs.utils import strftime, strfdate
  6. from django.conf import settings
  7. from django.utils import timezone
  8. from apps.base import Formater
  9. from django.db.models import Q, Sum, F
  10. from django.views.decorators.csrf import csrf_exempt
  11. from django.db import transaction,IntegrityError
  12. from django.db.models import ProtectedError
  13. from apps.account.decorators import token_required, permission_required, isHasPermissions
  14. from apps.foundation.models import BizLog, Option
  15. from apps.goods.filters import GoodsFilter, GoodsGodownEntryFilter, GoodsProductFilter
  16. from apps.goods.models import Goods, GoodsGodownEntry, GoodsGodownEntryDetail
  17. from apps.goods.resources import GoodsResource, GoodsImporter, GoodsGodownEntryResource, GoodsGodownEntryDetailResource, \
  18. GoodsGodownEntryImporter, GoodsProductResource, GodownEntryQueryResource
  19. from apps.goods.serializers import GoodsSerializer, GoodsGodownEntrySerializer, GoodsGodownEntryDetailSerializer, GoodsProductSerializer
  20. from apps.product.models import ProductBase
  21. from apps.product.serializers import ProductBaseSerializer
  22. from apps.warehouse.biz import BizWarehouse, GetWarehouseSrockRecord
  23. from apps.warehouse.models import WarehouseStock, Warehouse, WarehouseRecord, WarehouseStockRecord, InventoryDetail, WarehouseRecordDetail
  24. from apps.order.models import GoodsDeliver, GoodsDeliverReturnDetail, GoodsDeliverDetail, GoodsDeliverReturn
  25. from libs.http import JSONResponse, JSONError, DataGridJSONResponse
  26. from libs import utils
  27. from apps.exceptions import CustomError, ExportChange
  28. @permission_required('goods.view_goods')
  29. def goods_list(request):
  30. f = GoodsFilter(request.GET, queryset=Goods.objects.filter())
  31. rows, total = utils.get_page_data(request, f.qs)
  32. serializer = GoodsSerializer(rows, many=True)
  33. return DataGridJSONResponse(serializer.data, total)
  34. @permission_required('goods.export_goods')
  35. def goods_export(request):
  36. f = GoodsFilter(request.GET, queryset=Goods.objects.filter())
  37. serializer = GoodsSerializer(f.qs, many=True)
  38. export_data = ExportChange.dict_to_obj(serializer)
  39. export_data = GoodsResource().export(export_data)
  40. filename = utils.attachment_save(export_data)
  41. return JSONResponse({'filename': filename})
  42. @csrf_exempt
  43. @permission_required('goods.add_goods')
  44. def goods_save(request):
  45. id = request.GET.get('id')
  46. data = json.loads(request.body)
  47. try:
  48. with transaction.atomic():
  49. product_base_id = None
  50. data['type'] = ProductBase.GOODS
  51. serializer = GoodsSerializer.factory(request.user, data, id)
  52. if serializer.instance:
  53. product_base_id = serializer.instance.product_base_id
  54. data['standard'] = data['base_standard']
  55. pb = ProductBaseSerializer.factory(request.user,data,product_base_id)
  56. pb = pb.validSave()
  57. data['product_base'] = pb.id
  58. serializer.validSave()
  59. except CustomError, e:
  60. return JSONError(e.get_error_msg())
  61. except Exception, e:
  62. traceback.print_exc()
  63. return JSONError(u'保存失败!')
  64. return JSONResponse()
  65. @permission_required('goods.delete_goods')
  66. def goods_delete(request):
  67. id = int(request.GET.get('id'))
  68. try:
  69. with transaction.atomic():
  70. goods = Goods.getById(id)
  71. product_base_id = goods.product_base.id
  72. BizLog.objects.addnew(request.user, BizLog.DELETE, u"删除成品[%s],id=%d" % (goods.product_base.name, goods.id))
  73. goods.delete()
  74. WarehouseStock.removeStockByProduct(goods.product_base)
  75. ProductBase.objects.filter(id=product_base_id).delete()
  76. except CustomError, e:
  77. return JSONError(e.get_error_msg())
  78. except ProtectedError:
  79. return JSONError(u'该成品已被使用,禁止删除!')
  80. except IntegrityError:
  81. return JSONError(u'该成品已被使用,禁止删除!')
  82. except Exception, e:
  83. traceback.print_exc()
  84. return JSONError(u'删除失败!')
  85. return JSONResponse({})
  86. @csrf_exempt
  87. @permission_required('goods.import_goods')
  88. def goods_import(request):
  89. file = request.FILES.get('excel_file')
  90. try:
  91. line = 2
  92. importer = GoodsImporter()
  93. excel_rows = importer.getExcelData(file)
  94. with transaction.atomic():
  95. for excel_row in excel_rows:
  96. try:
  97. row = importer.validRow(excel_row)
  98. option = Option.getByName(row[u'类别'], Option.GOODS_MODE)
  99. data = {
  100. 'name': row[u'名称'],
  101. 'model': row[u'代码'],
  102. 'option_type': option.id,
  103. 'standard': row[u'标准'],
  104. 'goods_pack': row[u'包装'],
  105. 'warehouse_place': row[u'库位'],
  106. 'retail_price': row[u'销售价'],
  107. 'notes': row[u'备注'],
  108. 'enabled': 1,
  109. }
  110. data['type'] = ProductBase.GOODS
  111. pb = ProductBaseSerializer.factory(request.user,data)
  112. pb = pb.validSave()
  113. data['product_base'] = pb.id
  114. serializer = GoodsSerializer.factory(request.user,data)
  115. serializer.validSave()
  116. except CustomError,e:
  117. raise CustomError(u'第%d行:%s' % (line,e.get_error_msg()))
  118. except Exception,e:
  119. raise CustomError(u'第%d行:%s' %(line,unicode(e)))
  120. line += 1
  121. BizLog.objects.addnew(request.user, BizLog.IMPORT, u"导入成品数据[%s]条" % (line - 2))
  122. except CustomError, e:
  123. return JSONError(e.get_error_msg())
  124. except Exception, e:
  125. traceback.print_exc()
  126. return JSONError(u'导入失败!')
  127. return JSONResponse()
  128. @csrf_exempt
  129. @token_required
  130. def goods_select(request):
  131. param = request.GET.get('param')
  132. warehouse_id = request.GET.get('warehouse')
  133. rows = Goods.objects.filter(product_base__enabled=True)
  134. if param:
  135. rows = rows.filter(
  136. Q(product_base__name__icontains=param) | Q(product_base__model__icontains=param)
  137. )
  138. rows, total = utils.get_page_data(request, rows)
  139. data = []
  140. for row in rows:
  141. record_data = []
  142. if warehouse_id:
  143. record_data = GetWarehouseSrockRecord.getRecord(row.product_base.id, warehouse_id)
  144. item = {
  145. 'id': row.id,
  146. 'product_id': row.product_base.id,
  147. 'name': row.product_base.name,
  148. 'model': row.product_base.model,
  149. 'unit': row.product_base.unit,
  150. 'base_standard': row.product_base.standard,
  151. 'type_text': row.product_base.get_type_display(),
  152. 'option_type': row.product_base.option_type.name,
  153. 'retail_price': Formater.formatPriceShow(row.retail_price),
  154. 'standard': row.standard,
  155. 'goods_pack': row.goods_pack,
  156. # 'entry_price': entry_price,
  157. # 'total_cost': total_cost,
  158. 'record_data': record_data
  159. }
  160. data.append(item)
  161. return DataGridJSONResponse(data, total)
  162. @permission_required('goods.view_goods_godown_entry')
  163. def godownentry_list(request):
  164. product_notes = request.GET.get('product_notes')
  165. warehouses_ids = Warehouse.getManagerWarehouses(request.user)
  166. department_ids = request.user.getSubDepartmentIds()
  167. user_ids = request.user.getSubEmployeeIds()
  168. rows = GoodsGodownEntry.objects.filter(warehouse_id__in=warehouses_ids)
  169. rows = rows.filter(
  170. Q(department_id__in=department_ids) | Q(create_user_id__in=user_ids) | Q(create_user=request.user))
  171. if product_notes:
  172. g_ids = rows.values_list('id')
  173. d_ids = GoodsGodownEntryDetail.objects.filter(main_id__in=g_ids, notes__icontains=product_notes).values_list('main_id')
  174. rows = rows.filter(id__in=d_ids)
  175. f = GoodsGodownEntryFilter(request.GET, queryset=rows)
  176. total_row = f.qs.aggregate(total_count=Sum('total_count'), total_amount=Sum('total_amount'))
  177. more = {
  178. 'total_count': Formater.formatCountShow(total_row['total_count']),
  179. 'total_amount': Formater.formatAmountShow(total_row['total_amount'])
  180. }
  181. rows, total = utils.get_page_data(request, f.qs)
  182. serializer = GoodsGodownEntrySerializer(rows, many=True)
  183. return DataGridJSONResponse(serializer.data, total, more)
  184. @csrf_exempt
  185. @permission_required('goods.add_goods_godown_entry')
  186. def godownentry_save(request):
  187. id = request.GET.get('id')
  188. main_data = json.loads(request.POST.get('main'))
  189. items_data = json.loads(request.POST.get('item'))
  190. try:
  191. with transaction.atomic():
  192. serializer = GoodsGodownEntrySerializer.factory(request.user, main_data, id)
  193. if serializer.instance and serializer.instance.status == settings.PASS:
  194. raise CustomError(u'该成品入库单已审核,禁止修改!')
  195. serializer = serializer.validSave()
  196. GoodsGodownEntryDetail.objects.filter(main=serializer).delete()
  197. for item in items_data:
  198. item['main'] = serializer.id
  199. detail_serializer = GoodsGodownEntryDetailSerializer.factory(request.user, data=item)
  200. detail_serializer.validSave()
  201. serializer.update_total()
  202. except CustomError, e:
  203. return JSONError(e.get_error_msg())
  204. except Exception, e:
  205. traceback.print_exc()
  206. return JSONError(u'保存失败!')
  207. return JSONResponse()
  208. @token_required
  209. def godownentry_detail(request):
  210. id = request.GET.get('id')
  211. instance = GoodsGodownEntry.getById(id)
  212. company = instance.department.getCompany()
  213. if instance.status == settings.PASS:
  214. status_text = u'已审核'
  215. else:
  216. status_text = u'待审核'
  217. main_data = {
  218. 'id': instance.id,
  219. 'warehouse_id': instance.warehouse_id,
  220. 'warehouse_name': instance.warehouse.name,
  221. 'create_user': instance.create_user.name,
  222. 'create_time': Formater.formatStrTime(instance.create_time),
  223. 'total_count': Formater.formatCountShow(instance.total_count),
  224. 'total_amount': Formater.formatAmountShow(instance.total_amount),
  225. 'total_invoice_amount': Formater.formatAmountShow(instance.total_invoice_amount),
  226. 'status_text': status_text,
  227. 'check_user_text': instance.check_user and instance.check_user.name or ' ',
  228. 'check_time': Formater.formatStrTime(instance.create_time),
  229. 'notes': instance.notes,
  230. 'company': company.name,
  231. 'no': instance.no
  232. }
  233. data = {
  234. 'main_data': main_data,
  235. 'items_data': []
  236. }
  237. detail_rows = GoodsGodownEntryDetail.objects.filter(main=instance)
  238. for detail_row in detail_rows:
  239. item_data = {
  240. 'id': detail_row.id,
  241. 'goods_id': detail_row.goods_id,
  242. 'goods_name': detail_row.goods.product_base.name,
  243. 'goods_model': detail_row.goods.product_base.model,
  244. 'price': Formater.formatPriceShow(detail_row.price),
  245. 'count': Formater.formatCountShow(detail_row.count),
  246. 'amount': Formater.formatAmountShow(detail_row.amount),
  247. 'invoice_amount': Formater.formatAmountShow(detail_row.invoice_amount),
  248. 'unit': detail_row.goods.product_base.unit or '',
  249. 'warehouse_place': detail_row.goods.product_base.warehouse_place or '',
  250. 'notes': detail_row.notes or ''
  251. }
  252. data['items_data'].append(item_data)
  253. return JSONResponse(data)
  254. @permission_required('goods.delete_goods_godown_entry')
  255. def godownentry_delete(request):
  256. id = request.GET.get('id')
  257. try:
  258. with transaction.atomic():
  259. instance = GoodsGodownEntry.getById(id)
  260. if instance.status == settings.PASS:
  261. raise CustomError(u'该成品入库单已审核,禁止删除!')
  262. BizLog.objects.addnew(request.user, BizLog.DELETE, u"删除成品入库单[%s],id=%d" % (instance.no, instance.id))
  263. GoodsGodownEntryDetail.objects.filter(main=instance).delete()
  264. instance.delete()
  265. except CustomError, e:
  266. return JSONError(e.get_error_msg())
  267. except ProtectedError:
  268. return JSONError(u'该成品入库单已被引用,禁止删除!')
  269. except IntegrityError:
  270. return JSONError(u'该成品入库单已被引用,禁止删除!')
  271. except Exception, e:
  272. traceback.print_exc()
  273. return JSONError(u'删除失败!')
  274. return JSONResponse({})
  275. @permission_required('goods.export_goods_godown_entry')
  276. def godownentry_export(request):
  277. try:
  278. warehouses_ids = Warehouse.getManagerWarehouses(request.user)
  279. department_ids = request.user.getSubDepartmentIds()
  280. user_ids = request.user.getSubEmployeeIds()
  281. rows = GoodsGodownEntry.objects.filter(warehouse_id__in=warehouses_ids)
  282. rows = rows.filter(
  283. Q(department_id__in=department_ids) | Q(create_user_id__in=user_ids) | Q(create_user=request.user))
  284. f = GoodsGodownEntryFilter(request.GET, queryset=rows)
  285. serializer = GoodsGodownEntrySerializer(f.qs, many=True)
  286. export_data = ExportChange.dict_to_obj(serializer)
  287. is_show_cost = isHasPermissions(request.user, 'goods.view_goods_cost')
  288. export_data = GoodsGodownEntryResource(is_show_cost).export(export_data)
  289. filename = utils.attachment_save(export_data)
  290. BizLog.objects.addnew(request.user, BizLog.EXPORT, u"导出成品入库单" )
  291. except CustomError, e:
  292. return JSONError(e.get_error_msg())
  293. except Exception, e:
  294. traceback.print_exc()
  295. return JSONError(u'导出列表失败!')
  296. return JSONResponse({'filename': filename})
  297. @permission_required('goods.export_goods_godown_entry')
  298. def godownentry_export_detail(request):
  299. id = request.GET.get('id')
  300. try:
  301. instance = GoodsGodownEntry.getById(id)
  302. godown_entry_detail = GoodsGodownEntryDetail.objects.filter(main=instance)
  303. serializer = GoodsGodownEntryDetailSerializer(godown_entry_detail, many=True)
  304. export_data = ExportChange.dict_to_obj(serializer)
  305. is_show_cost = isHasPermissions(request.user, 'goods.view_goods_cost')
  306. export_data = GoodsGodownEntryDetailResource(is_show_cost).export(export_data)
  307. filename = utils.attachment_save(export_data)
  308. BizLog.objects.addnew(request.user, BizLog.EXPORT, u"导出成品入库单[%s]明细,id=%d" % (instance.no, instance.id))
  309. except CustomError, e:
  310. return JSONError(e.get_error_msg())
  311. except Exception, e:
  312. traceback.print_exc()
  313. return JSONError(u'导出明细失败!')
  314. return JSONResponse({'filename': filename})
  315. @csrf_exempt
  316. @permission_required('goods.import_goods_godown_entry')
  317. def godownentry_import(request):
  318. file = request.FILES.get('excel_file')
  319. main_data = json.loads(request.POST.get('main_data'))
  320. try:
  321. line = 2
  322. importer = GoodsGodownEntryImporter()
  323. excel_rows = importer.getExcelData(file)
  324. with transaction.atomic():
  325. serializer = GoodsGodownEntrySerializer.factory(request.user, main_data)
  326. serializer = serializer.validSave()
  327. for excel_row in excel_rows:
  328. try:
  329. row = importer.validRow(excel_row)
  330. model = row[u'成品代码']
  331. goods = Goods.objects.filter(product_base__model=model, product_base__type=ProductBase.GOODS)
  332. if goods.count() == 0:
  333. raise CustomError(u'成品代码不存在')
  334. elif goods.count() > 1:
  335. raise CustomError(u'成品代码重复,前往基础数据设置修改')
  336. else:
  337. goods = goods.first()
  338. items_data = {}
  339. items_data['goods'] = goods.id
  340. items_data['main'] = serializer.id
  341. items_data['price'] = row[u'单价']
  342. items_data['count'] = row[u'数量']
  343. items_data['invoice_amount'] = row[u'发票金额']
  344. items_data['notes'] = row[u'备注']
  345. detail_serializer = GoodsGodownEntryDetailSerializer.factory(request.user, items_data)
  346. detail_serializer.validSave()
  347. except CustomError, e:
  348. raise CustomError(u'第%d行:%s' % (line, e.get_error_msg()))
  349. except Exception, e:
  350. raise CustomError(u'第%d行:%s' % (line, unicode(e)))
  351. line += 1
  352. serializer.update_total()
  353. BizLog.objects.addnew(request.user, BizLog.IMPORT, u"导入成品入库单[%s],id=%d" % (serializer.no, serializer.id))
  354. except CustomError, e:
  355. return JSONError(e.get_error_msg())
  356. except Exception, e:
  357. traceback.print_exc()
  358. return JSONError(u'导入失败!')
  359. return JSONResponse()
  360. @permission_required('goods.check_goods_godown_entry')
  361. def godownentry_check(request):
  362. id = request.GET.get('id')
  363. try:
  364. with transaction.atomic():
  365. instance = GoodsGodownEntry.getById(id)
  366. if instance.status == settings.PASS:
  367. raise CustomError(u'该成品入库单已审核')
  368. godownentry_details = GoodsGodownEntryDetail.objects.filter(main=instance)
  369. for godownentry_detail in godownentry_details:
  370. stock_record = BizWarehouse.entry(type=WarehouseRecord.RK_ZJ,
  371. product=godownentry_detail.goods.product_base,
  372. warehouse=instance.warehouse,
  373. supplier=None,
  374. entry_count=godownentry_detail.count,
  375. entry_price=godownentry_detail.price,
  376. entry_price2=godownentry_detail.price)
  377. godownentry_detail.stock_record = stock_record
  378. godownentry_detail.save()
  379. instance.status = settings.PASS
  380. instance.check_user = request.user
  381. instance.check_time = timezone.now()
  382. BizLog.objects.addnew(
  383. request.user,
  384. BizLog.CHECK,
  385. u"审核原料入库[%s],id=%d" % (instance.no, instance.id),
  386. )
  387. instance.save()
  388. except CustomError, e:
  389. return JSONError(e.get_error_msg())
  390. except Exception, e:
  391. traceback.print_exc()
  392. return JSONError(u'审核失败')
  393. return JSONResponse({})
  394. @csrf_exempt
  395. @permission_required('goods.edit_goods_godown_entry')
  396. def godownentry_senior_edit(request):
  397. def updateStock(product_base, warehouse):
  398. sum_row = WarehouseRecord.objects.filter(
  399. warehouse=warehouse,
  400. product=product_base
  401. ).aggregate(
  402. count=Sum('count'),
  403. amount=Sum('amount'),
  404. amount2=Sum('amount2')
  405. )
  406. warehouse_stock = WarehouseStock.objects.filter(product=product_base, warehouse=warehouse).first()
  407. if warehouse_stock:
  408. warehouse_stock.count = sum_row['count'] or 0
  409. warehouse_stock.amount = sum_row['amount'] or 0
  410. warehouse_stock.amount2 = sum_row['amount2'] or 0
  411. if warehouse_stock.count != 0:
  412. warehouse_stock.avg_cost_price = warehouse_stock.amount / warehouse_stock.count
  413. warehouse_stock.avg_cost_price2 = warehouse_stock.amount2 / warehouse_stock.count
  414. warehouse_stock.save()
  415. sum_row = WarehouseStock.objects.filter(
  416. product=product_base
  417. ).aggregate(
  418. count=Sum('count'),
  419. amount=Sum('amount'),
  420. amount2=Sum('amount2')
  421. )
  422. product_base.stock_count = sum_row['count'] or 0
  423. product_base.stock_amount = sum_row['amount'] or 0
  424. product_base.stock_amount2 = sum_row['amount2'] or 0
  425. if product_base.stock_count > 0:
  426. product_base.avg_cost_price = product_base.stock_amount / product_base.stock_count
  427. product_base.avg_cost_price2 = product_base.stock_amount2 / product_base.stock_count
  428. product_base.save()
  429. def updateWarehouseRecord(warehouse_record):
  430. sum_row = WarehouseRecordDetail.objects.filter(
  431. warehouse_record=warehouse_record
  432. ).aggregate(
  433. sum_amount=Sum(F('count') * F('warehouse_stock_record__entry_price')),
  434. sum_amount2=Sum(F('count') * F('warehouse_stock_record__entry_price2')),
  435. sum_count=Sum('count')
  436. )
  437. warehouse_record.amount = sum_row['sum_amount'] or 0
  438. warehouse_record.amount2 = sum_row['sum_amount2'] or 0
  439. warehouse_record.count = sum_row['sum_count'] or 0
  440. warehouse_record.save()
  441. def changeEntryPrice(entry_detail,entry_price,entry_price2):
  442. changeEntryPriceBase(entry_detail, entry_price, entry_price2)
  443. rows = WarehouseRecordDetail.objects.filter(warehouse_stock_record=entry_detail.stock_record)
  444. ck_type = (WarehouseRecord.CK_ZJ, WarehouseRecord.CK_XS,)
  445. pk_type = (WarehouseRecord.CK_PK,)
  446. tl_type = (WarehouseRecord.TL,)
  447. for row in rows:
  448. warehouse_record = row.warehouse_record
  449. updateWarehouseRecord(warehouse_record)
  450. if warehouse_record.type in ck_type:
  451. deliver_detail = GoodsDeliverDetail.objects.filter(warehouse_record=warehouse_record).first()
  452. if deliver_detail:
  453. #更新出库明细的合计成本
  454. deliver_detail.total_cost = warehouse_record.amount
  455. deliver_detail.save()
  456. # 更新出库单的合计成本
  457. order = deliver_detail.main
  458. sum_row = GoodsDeliverDetail.objects.filter(
  459. main=order
  460. ).aggregate(
  461. sum_cost=Sum('total_cost')
  462. )
  463. order.total_cost = sum_row['sum_cost'] or 0
  464. order.save()
  465. elif warehouse_record.type in tl_type:
  466. detail = GoodsDeliverReturnDetail.objects.filter(warehouse_record=warehouse_record).first()
  467. if detail:
  468. #更新退料明细的合计成本
  469. old_amount = detail.return_cost
  470. detail.return_cost = warehouse_record.amount
  471. detail.save()
  472. # 更新出库明细的退料合计成本
  473. new_amount = detail.return_cost
  474. detail.deliver_detail.return_cost += new_amount - old_amount
  475. detail.deliver_detail.save()
  476. #更新出库单的退料合计成本
  477. detail.deliver_detail.main.return_cost += new_amount - old_amount
  478. detail.deliver_detail.main.save()
  479. #更新退料单的合计成本
  480. order = detail.main
  481. sum_row = GoodsDeliverReturnDetail.objects.filter(
  482. main=order
  483. ).aggregate(
  484. sum_cost=Sum('return_cost')
  485. )
  486. order.return_cost = sum_row['sum_cost'] or 0
  487. order.save()
  488. elif warehouse_record.type in pk_type:
  489. detail = InventoryDetail.objects.filter(warehouse_record=warehouse_record).first()
  490. if detail:
  491. #更新盘存明细
  492. detail.amount = warehouse_record.amount
  493. detail.price = 0
  494. if detail.count:
  495. detail.price = detail.amount / detail.count
  496. detail.save()
  497. # 更新盘存单
  498. order = detail.main
  499. sum_row = InventoryDetail.objects.filter(
  500. main=order
  501. ).aggregate(
  502. sum_amount=Sum('amount')
  503. )
  504. order.total_amount = sum_row['sum_amount'] or 0
  505. order.save()
  506. def changeEntryPriceBase(entry_detail,entry_price,entry_price2):
  507. entry_detail.price = entry_price
  508. entry_detail.amount = entry_detail.count * entry_price
  509. entry_detail.save()
  510. if entry_detail.stock_record:
  511. entry_detail.stock_record.entry_price = entry_price
  512. entry_detail.stock_record.entry_price2 = entry_price2
  513. entry_detail.stock_record.save()
  514. def changePrice(godownentry_detail,new_entry_price):
  515. changeEntryPrice(godownentry_detail, new_entry_price, new_entry_price)
  516. updateStock(godownentry_detail.goods.product_base, godownentry_detail.main.warehouse)
  517. def addCount(godownentry_detail,add_count):
  518. godownentry_detail.count += add_count
  519. godownentry_detail.amount = godownentry_detail.count * godownentry_detail.price
  520. godownentry_detail.save()
  521. if godownentry_detail.stock_record:
  522. godownentry_detail.stock_record.entry_count += add_count
  523. godownentry_detail.stock_record.surplus_count += add_count
  524. godownentry_detail.stock_record.save()
  525. record_detail = WarehouseRecordDetail.objects.filter(
  526. warehouse_stock_record=godownentry_detail.stock_record,
  527. warehouse_record__type__in=(WarehouseRecord.RK_CG, WarehouseRecord.RK_ZJ)
  528. ).first()
  529. if record_detail:
  530. record_detail.count += add_count
  531. record_detail.save()
  532. updateWarehouseRecord(record_detail.warehouse_record)
  533. updateStock(godownentry_detail.goods.product_base, godownentry_detail.main.warehouse)
  534. def decCount(godownentry_detail,red_count):
  535. godownentry_detail.count -= red_count
  536. godownentry_detail.amount = godownentry_detail.count * godownentry_detail.price
  537. godownentry_detail.save()
  538. if godownentry_detail.stock_record:
  539. if red_count > godownentry_detail.stock_record.surplus_count:
  540. raise CustomError(u'该入库单中的配件[%s],剩余%s,不能减少%s,请使用退货减少库存' % (
  541. godownentry_detail.goods.product_base.name,
  542. Formater.formatCountShow(godownentry_detail.stock_record.surplus_count),
  543. Formater.formatCountShow(red_count)
  544. ))
  545. godownentry_detail.stock_record.entry_count -= red_count
  546. godownentry_detail.stock_record.surplus_count -= red_count
  547. godownentry_detail.stock_record.save()
  548. record_detail = WarehouseRecordDetail.objects.filter(
  549. warehouse_stock_record=godownentry_detail.stock_record,
  550. warehouse_record__type__in=(WarehouseRecord.RK_CG, WarehouseRecord.RK_ZJ)
  551. ).first()
  552. if record_detail:
  553. record_detail.count -= red_count
  554. record_detail.save()
  555. updateWarehouseRecord(record_detail.warehouse_record)
  556. updateStock(godownentry_detail.goods.product_base, godownentry_detail.main.warehouse)
  557. new_rows = json.loads(request.POST.get('item'))
  558. id = request.GET.get('id')
  559. try:
  560. with transaction.atomic():
  561. godownentry = GoodsGodownEntry.objects.filter(pk=int(id)).first()
  562. if not godownentry:
  563. raise CustomError(u'未找到相应的入库单')
  564. if godownentry.status != settings.PASS:
  565. raise CustomError(u'未通过审核的入库单不允许高级修改')
  566. for row in new_rows:
  567. new_entry_count = Formater.formatCount(row['new_count'])
  568. new_entry_price = Formater.formatPrice(row['new_price'])
  569. if new_entry_count < 0:
  570. raise CustomError(u'入库数量不能小于0')
  571. if new_entry_price < 0:
  572. raise CustomError(u'入库价不能小于0')
  573. detail = GoodsGodownEntryDetail.objects.filter(id=int(row['new_detail_id'])).first()
  574. if not detail:
  575. continue
  576. if detail.price != new_entry_price:
  577. changePrice(detail,new_entry_price)
  578. if detail.count < new_entry_count:
  579. addCount(detail,new_entry_count-detail.count)
  580. if detail.count > new_entry_count:
  581. decCount(detail, detail.count-new_entry_count)
  582. WarehouseRecord.updateCurStockByProduct(detail.main.warehouse_id, detail.goods.product_base_id)
  583. count = 0
  584. amount = 0
  585. sum_row = GoodsGodownEntryDetail.objects.filter(main=godownentry).aggregate(
  586. count_sum=Sum('count'),
  587. amount_sum=Sum('amount')
  588. )
  589. if sum_row:
  590. count = sum_row['count_sum'] or 0
  591. amount = sum_row['amount_sum'] or 0
  592. godownentry.total_count = count
  593. godownentry.total_amount = amount
  594. godownentry.save()
  595. BizLog.objects.addnew(
  596. request.user,
  597. BizLog.UPDATE,
  598. u"原料高级修改[单号=%s],id=%d" % (godownentry.no, godownentry.id)
  599. )
  600. except CustomError, e:
  601. return JSONError(e.get_error_msg())
  602. except Exception, e:
  603. traceback.print_exc()
  604. return JSONError(u'修改失败')
  605. return JSONResponse({})
  606. @csrf_exempt
  607. @permission_required('warehouse.view_goods_stock_log')
  608. def goods_stock_log(request):
  609. keyword = request.GET.get('keyword')
  610. action = request.GET.get('action')
  611. happen_time = request.GET.get('happen_time')
  612. warehouse_id = request.GET.get('warehouse_id')
  613. product_id = request.GET.get('product_id')
  614. page, page_size = utils.get_page_info(request)
  615. product_id = int(product_id)
  616. warehouse_id = int(warehouse_id)
  617. where = ''
  618. if happen_time:
  619. happen_time = happen_time.split(' - ')
  620. where += " AND m.happen_time >= '%s' " % happen_time[0]
  621. where += " AND m.happen_time <= '%s' " % (happen_time[1] + ' 23:59:59')
  622. if action:
  623. where += ' AND m.type = %d' % int(action)
  624. if keyword and len(keyword) > 0:
  625. where += " AND (m.order_no like '%" + keyword + "%' " \
  626. " or m.warehouse_name like '%" + keyword + "%' )"
  627. page_sql = ' LIMIT %d OFFSET %d ' % (page_size, page * page_size)
  628. sql = """SELECT * FROM(
  629. SELECT
  630. pwr.type,
  631. pwr.happen_time,
  632. (CASE WHEN pwr.type in (3, 4) THEN gd.`no`
  633. WHEN pwr.type = 5 THEN iv.`no`
  634. WHEN pwr.type = 7 THEN gdr.`no`
  635. else '' END) AS order_no,
  636. (CASE WHEN pwr.type in (3, 4) THEN gdd.price
  637. WHEN pwr.type = 5 THEN ind.price
  638. WHEN pwr.type = 7 THEN rdgd.price
  639. else '' END) AS order_price,
  640. pwr.count,
  641. pwr.amount,
  642. pwr.amount/pwr.count as cost,
  643. pw.name as warehouse_name,
  644. pwr.warehouse_id AS warehouse_id,
  645. pwr.product_id AS product_id,
  646. pwr.id AS id,
  647. pwr.cur_count as cur_count,
  648. pwr.cur_amount as cur_amount
  649. FROM product_warehouse_record pwr LEFT JOIN
  650. product_warehouse pw ON pwr.warehouse_id = pw.id LEFT JOIN
  651. product_warehouse_stock pws ON pwr.product_id = pws.product_id AND pwr.warehouse_id=pws.warehouse_id LEFT JOIN
  652. goods_deliver_detail gdd ON pwr.id=gdd.warehouse_record_id LEFT JOIN
  653. goods_deliver gd ON gdd.main_id=gd.id LEFT JOIN
  654. goods_deliver_detail_return gdrd ON pwr.id = gdrd.warehouse_record_id LEFT JOIN
  655. goods_deliver_detail rdgd ON rdgd.id = gdrd.deliver_detail_id LEFT JOIN
  656. goods_deliver_return gdr ON gdrd.main_id = gdr.id LEFT JOIN
  657. inventory_detail ind on ind.warehouse_record_id=pwr.id left join
  658. inventory iv ON iv.id=ind.main_id
  659. WHERE pwr.warehouse_id = %(warehose)d AND pwr.product_id = %(product)d AND pwr.type >=3
  660. UNION ALL
  661. SELECT
  662. pwr.type,
  663. pwr.happen_time,
  664. (CASE WHEN pwr.type in (0, 1) THEN gge.`no`
  665. WHEN pwr.type = 2 THEN iv.`no`
  666. else '' END) AS order_no,
  667. (CASE WHEN pwr.type in (0, 1) THEN gded.price
  668. WHEN pwr.type = 2 THEN ind.price
  669. else '' END) AS order_price,
  670. pwr.count,
  671. pwr.amount,
  672. pwr.amount/pwr.count as cost,
  673. pw.name as warehouse_name,
  674. pwr.warehouse_id AS warehouse_id,
  675. pwr.product_id AS product_id,
  676. pwr.id AS id,
  677. pwr.cur_count as cur_count,
  678. pwr.cur_amount as cur_amount
  679. FROM product_warehouse_record pwr LEFT JOIN
  680. product_warehouse pw ON pwr.warehouse_id = pw.id LEFT JOIN
  681. product_warehouse_stock pws ON pwr.product_id = pws.product_id AND pwr.warehouse_id=pws.warehouse_id LEFT JOIN
  682. product_warehouse_record_detail pwrd ON pwr.id=pwrd.warehouse_record_id LEFT JOIN
  683. goods_godown_entry_detail gded ON pwrd.warehouse_stock_record_id=gded.stock_record_id LEFT JOIN
  684. goods_godown_entry gge ON gded.main_id=gge.id LEFT JOIN
  685. inventory_detail ind on ind.warehouse_stock_record_id = pwrd.warehouse_stock_record_id left join
  686. inventory iv ON iv.id = ind.main_id
  687. WHERE pwr.warehouse_id = %(warehose)d AND pwr.product_id = %(product)d AND (pwr.type <= 2)
  688. ) as m
  689. WHERE 1=1 %(where)s
  690. ORDER BY m.happen_time DESC
  691. """ % {'warehose': warehouse_id, 'product': product_id, 'where': where}
  692. sum_sql = """ SELECT
  693. COUNT(0)
  694. FROM
  695. (%s) AS t
  696. """ % sql
  697. items = []
  698. sql = '%s %s' % (sql, page_sql)
  699. cursor = connection.cursor()
  700. cursor.execute(sql)
  701. row = cursor.fetchone()
  702. total = 0
  703. while row:
  704. action_text = WarehouseRecord.TYPE_CHOICES[row[0]][1]
  705. text = ''
  706. if row[0] == WarehouseRecord.RK_ZJ:
  707. text = u'入库单[' + row[2] + u']'
  708. elif row[0] == WarehouseRecord.RK_CG:
  709. text = u'采购转入库,入库单[' + row[2] + u']'
  710. elif row[0] == WarehouseRecord.RK_PY:
  711. text = u'盘盈单[' + row[2] + u']'
  712. elif row[0] == WarehouseRecord.CK_ZJ:
  713. text = u'出库单[' + row[2] + ']'
  714. elif row[0] == WarehouseRecord.CK_XS:
  715. text = u'订单转出库,出库单[' + row[2] + u']'
  716. elif row[0] == WarehouseRecord.CK_PK:
  717. text = u'盘亏单[' + row[2] + u']'
  718. elif row[0] == WarehouseRecord.TH:
  719. text = u'退货单[' + row[2] + u']'
  720. elif row[0] == WarehouseRecord.TL:
  721. text = u'退料单[' + row[2] + u']'
  722. item = {
  723. 'action': row[0],
  724. 'action_text': action_text,
  725. 'create_time': strftime(row[1]),
  726. 'order_no': row[2],
  727. 'count': Formater.formatCountShow(row[4]),
  728. 'cost': Formater.formatPriceShow(row[6]),
  729. 'price': Formater.formatPriceShow(row[3]),
  730. 'warehouse_text': row[7],
  731. 'text': text,
  732. 'cur_count': Formater.formatCountShow(row[11]),
  733. 'cur_amount': Formater.formatAmountShow(row[12]),
  734. }
  735. items.append(item)
  736. row = cursor.fetchone()
  737. cursor.execute(sum_sql)
  738. row = cursor.fetchone()
  739. if row:
  740. total = row[0]
  741. return DataGridJSONResponse(items, total)
  742. @csrf_exempt
  743. @permission_required('product.view_goods_product')
  744. def goods_product_list(request):
  745. empty = request.GET.get('empty')
  746. rows = ProductBase.objects.filter(type=ProductBase.GOODS)
  747. if empty == '0':
  748. rows = rows.filter(stock_count=0)
  749. elif empty == '1':
  750. rows = rows.filter(stock_count__gt=0)
  751. f = GoodsProductFilter(request.GET, queryset=rows)
  752. total_row = f.qs.aggregate(sum_count=Sum('stock_count'))
  753. more = {
  754. 'sum_count': Formater.formatCountShow(total_row['sum_count'])
  755. }
  756. rows, total = utils.get_page_data(request, f.qs)
  757. serializer = GoodsProductSerializer(rows, many=True)
  758. return DataGridJSONResponse(serializer.data, total, more)
  759. @csrf_exempt
  760. @permission_required('product.export_goods_product')
  761. def goods_product_export(request):
  762. empty = request.GET.get('empty')
  763. rows = ProductBase.objects.filter(type=ProductBase.GOODS)
  764. if empty == '0':
  765. rows = rows.filter(stock_count=0)
  766. elif empty == '1':
  767. rows = rows.filter(stock_count__gt=0)
  768. f = GoodsProductFilter(request.GET, queryset=rows)
  769. serializer = GoodsProductSerializer(f.qs, many=True)
  770. export_data = ExportChange.dict_to_obj(serializer)
  771. export_data = GoodsProductResource().export(export_data)
  772. filename = utils.attachment_save(export_data)
  773. return JSONResponse({'filename': filename})
  774. @token_required
  775. @permission_required('order.view_goods_godownentry_query')
  776. def godownentry_query_list(request):
  777. rows = get_filter_data(request)
  778. total_row = rows.aggregate(godownentry_total_count=Sum('goods_godown_entry_detail_ref_stock_record__count'),
  779. inventory_total_count=Sum('inventory_details_ref_warehouse_stock_record__count'),
  780. godownentry_total_amount=Sum('goods_godown_entry_detail_ref_stock_record__amount'),
  781. inventory_total_amount=Sum('inventory_details_ref_warehouse_stock_record__amount'),
  782. godownentry_total_deliver_count=Sum(
  783. 'goods_godown_entry_detail_ref_stock_record__deliver_count'),
  784. inventory_total_deliver_count=Sum(
  785. 'inventory_details_ref_warehouse_stock_record__deliver_count'),
  786. total_surplus_count=Sum('surplus_count')
  787. )
  788. more = {
  789. 'total_count': Formater.formatCountShow(
  790. (total_row['godownentry_total_count'] or 0) + (total_row['inventory_total_count'] or 0)),
  791. 'total_amount': Formater.formatAmountShow(
  792. (total_row['godownentry_total_amount'] or 0) + (total_row['inventory_total_amount'] or 0)),
  793. 'total_deliver_count': Formater.formatCountShow(
  794. (total_row['godownentry_total_deliver_count'] or 0) + (total_row['inventory_total_deliver_count'] or 0)),
  795. 'total_surplus_count': Formater.formatCountShow(total_row['total_surplus_count'] or 0)
  796. }
  797. rows, total = utils.get_page_data(request, rows)
  798. data = get_godownentry_query_data(rows)
  799. return DataGridJSONResponse(data, total, more)
  800. @token_required
  801. @permission_required('order.export_goods_godownentry_query')
  802. def godownentry_query_export(request):
  803. try:
  804. rows = get_filter_data(request)
  805. data = get_godownentry_query_data(rows)
  806. export_data = ExportChange.dict_to_obj2(data)
  807. is_show_cost = isHasPermissions(request.user, 'goods.view_goods_cost')
  808. export_data = GodownEntryQueryResource(is_show_cost).export(export_data)
  809. filename = utils.attachment_save(export_data)
  810. BizLog.objects.addnew(request.user, BizLog.EXPORT, u"导出成品入库查询")
  811. except Exception, e:
  812. traceback.print_exc()
  813. return JSONError(u'导出成品入库查询失败!')
  814. return JSONResponse({'filename': filename})
  815. @token_required
  816. def godownentry_query_detail(request):
  817. rows = get_filter_data(request)
  818. data = get_godownentry_query_data(rows)
  819. return JSONResponse(data)
  820. def get_filter_data(request):
  821. entry_time = request.GET.get('entry_time')
  822. no = request.GET.get('no')
  823. create_user = request.GET.get('create_user')
  824. product_text = request.GET.get('product_text')
  825. product_model = request.GET.get('product_model')
  826. warehouse = request.GET.get('warehouse')
  827. entry_type = request.GET.get('entry_type')
  828. notes = request.GET.get('notes')
  829. rows = WarehouseStockRecord.objects.filter(
  830. product__type=ProductBase.GOODS,
  831. warehouse_record_detail_ref_stock_record__warehouse_record__type__in=[0,1,2]).order_by(
  832. '-id'
  833. )
  834. if entry_type:
  835. rows = rows.filter(warehouse_record_detail_ref_stock_record__warehouse_record__type=int(entry_type))
  836. if notes:
  837. rows = rows.filter(Q(goods_godown_entry_detail_ref_stock_record__notes__icontains=notes) |
  838. Q(inventory_details_ref_warehouse_stock_record__notes__icontains=notes))
  839. if product_text:
  840. rows = rows.filter(product__name__icontains=product_text)
  841. if product_model:
  842. rows = rows.filter(product__model__icontains=product_model)
  843. if warehouse:
  844. rows = rows.filter(warehouse__name__icontains=warehouse)
  845. if entry_time:
  846. entry_time_begin = entry_time.split(' - ')[0]
  847. entry_time_end = entry_time.split(' - ')[1] + ' 23:59:59'
  848. rows = rows.filter(entry_time__gt=entry_time_begin, entry_time__lt=entry_time_end)
  849. if no:
  850. rows = rows.filter(Q(goods_godown_entry_detail_ref_stock_record__main__no__icontains=no) |
  851. Q(inventory_details_ref_warehouse_stock_record__main__no__icontains=no))
  852. if create_user:
  853. rows = rows.filter(Q(goods_godown_entry_detail_ref_stock_record__main__create_user__name__icontains=create_user) |
  854. Q(inventory_details_ref_warehouse_stock_record__main__create_user__name__icontains=create_user))
  855. warehouses_ids = Warehouse.getManagerWarehouses(request.user)
  856. department_ids = request.user.getSubDepartmentIds()
  857. user_ids = request.user.getSubEmployeeIds()
  858. rows = rows.filter(warehouse_id__in=warehouses_ids)
  859. rows = rows.filter(Q(
  860. Q(goods_godown_entry_detail_ref_stock_record__main__department_id__in=department_ids)
  861. | Q(goods_godown_entry_detail_ref_stock_record__main__create_user_id__in=user_ids)
  862. | Q(goods_godown_entry_detail_ref_stock_record__main__create_user=request.user)) |
  863. Q(
  864. Q(inventory_details_ref_warehouse_stock_record__main__department_id__in=department_ids)
  865. | Q(inventory_details_ref_warehouse_stock_record__main__create_user_id__in=user_ids)
  866. | Q(inventory_details_ref_warehouse_stock_record__main__create_user=request.user)
  867. ))
  868. return rows
  869. def get_godownentry_query_data(rows):
  870. rows = rows.values(
  871. 'id',
  872. 'goods_godown_entry_detail_ref_stock_record__goods__product_base__name',
  873. 'goods_godown_entry_detail_ref_stock_record__goods__product_base__model',
  874. 'goods_godown_entry_detail_ref_stock_record__goods__product_base__unit',
  875. 'goods_godown_entry_detail_ref_stock_record__goods__product_base__type',
  876. 'goods_godown_entry_detail_ref_stock_record__goods__product_base__warehouse_place',
  877. 'inventory_details_ref_warehouse_stock_record__product__name',
  878. 'inventory_details_ref_warehouse_stock_record__product__model',
  879. 'inventory_details_ref_warehouse_stock_record__product__unit',
  880. 'inventory_details_ref_warehouse_stock_record__product__type',
  881. 'inventory_details_ref_warehouse_stock_record__product__warehouse_place',
  882. 'warehouse__name',
  883. 'warehouse_record_detail_ref_stock_record__warehouse_record__type',
  884. 'goods_godown_entry_detail_ref_stock_record__id',
  885. 'goods_godown_entry_detail_ref_stock_record__price',
  886. 'goods_godown_entry_detail_ref_stock_record__count',
  887. 'goods_godown_entry_detail_ref_stock_record__amount',
  888. 'goods_godown_entry_detail_ref_stock_record__deliver_count',
  889. 'goods_godown_entry_detail_ref_stock_record__notes',
  890. 'goods_godown_entry_detail_ref_stock_record__main__create_user__name',
  891. 'goods_godown_entry_detail_ref_stock_record__main__check_time',
  892. 'goods_godown_entry_detail_ref_stock_record__main__no',
  893. 'inventory_details_ref_warehouse_stock_record__price',
  894. 'inventory_details_ref_warehouse_stock_record__count',
  895. 'inventory_details_ref_warehouse_stock_record__amount',
  896. 'inventory_details_ref_warehouse_stock_record__notes',
  897. 'inventory_details_ref_warehouse_stock_record__deliver_count',
  898. 'inventory_details_ref_warehouse_stock_record__main__create_user__name',
  899. 'inventory_details_ref_warehouse_stock_record__main__check_time',
  900. 'inventory_details_ref_warehouse_stock_record__main__no',
  901. )
  902. data = []
  903. for row in rows:
  904. warehouse_record_type = WarehouseRecord.TYPE_CHOICES[row['warehouse_record_detail_ref_stock_record__warehouse_record__type']][1]
  905. if row['warehouse_record_detail_ref_stock_record__warehouse_record__type'] == WarehouseRecord.RK_PY:
  906. product_type_text = ProductBase.TYPE_CHOICES[row['inventory_details_ref_warehouse_stock_record__product__type']][1]
  907. surplus_count = row['inventory_details_ref_warehouse_stock_record__count'] - row['inventory_details_ref_warehouse_stock_record__deliver_count']
  908. item = {
  909. 'id': row['id'],
  910. 'type': warehouse_record_type,
  911. 'product_type': product_type_text,
  912. 'product_name': row['inventory_details_ref_warehouse_stock_record__product__name'],
  913. 'product_model': row['inventory_details_ref_warehouse_stock_record__product__model'],
  914. 'product_unit': row['inventory_details_ref_warehouse_stock_record__product__unit'],
  915. 'warehouse_place': row['inventory_details_ref_warehouse_stock_record__product__warehouse_place'],
  916. 'warehouse': row['warehouse__name'],
  917. 'price': Formater.formatPriceShow(row['inventory_details_ref_warehouse_stock_record__price']),
  918. 'count': Formater.formatCountShow(row['inventory_details_ref_warehouse_stock_record__count']),
  919. 'amount': Formater.formatAmountShow(row['inventory_details_ref_warehouse_stock_record__amount']),
  920. 'deliver_count': Formater.formatCountShow(row['inventory_details_ref_warehouse_stock_record__deliver_count']),
  921. 'surplus_count': Formater.formatCountShow(surplus_count),
  922. 'create_user': row['inventory_details_ref_warehouse_stock_record__main__create_user__name'],
  923. 'check_time': Formater.formatStrTime(row['inventory_details_ref_warehouse_stock_record__main__check_time']),
  924. 'notes': row['inventory_details_ref_warehouse_stock_record__notes'],
  925. 'no': row['inventory_details_ref_warehouse_stock_record__main__no'],
  926. }
  927. else:
  928. product_type_text = ProductBase.TYPE_CHOICES[row['goods_godown_entry_detail_ref_stock_record__goods__product_base__type']][1]
  929. surplus_count = row['goods_godown_entry_detail_ref_stock_record__count'] - row['goods_godown_entry_detail_ref_stock_record__deliver_count']
  930. item = {
  931. 'id': row['id'],
  932. 'godownentry_detail_id': row['goods_godown_entry_detail_ref_stock_record__id'],
  933. 'type': warehouse_record_type,
  934. 'product_type': product_type_text,
  935. 'product_name': row['goods_godown_entry_detail_ref_stock_record__goods__product_base__name'],
  936. 'product_model': row['goods_godown_entry_detail_ref_stock_record__goods__product_base__model'],
  937. 'product_unit': row['goods_godown_entry_detail_ref_stock_record__goods__product_base__unit'],
  938. 'warehouse_place': row['goods_godown_entry_detail_ref_stock_record__goods__product_base__warehouse_place'],
  939. 'warehouse': row['warehouse__name'],
  940. 'price': Formater.formatPriceShow(row['goods_godown_entry_detail_ref_stock_record__price']),
  941. 'count': Formater.formatCountShow(row['goods_godown_entry_detail_ref_stock_record__count']),
  942. 'amount': Formater.formatAmountShow(row['goods_godown_entry_detail_ref_stock_record__amount']),
  943. 'deliver_count': Formater.formatCountShow(row['goods_godown_entry_detail_ref_stock_record__deliver_count']),
  944. 'surplus_count': Formater.formatCountShow(surplus_count),
  945. 'create_user': row['goods_godown_entry_detail_ref_stock_record__main__create_user__name'],
  946. 'check_time': Formater.formatStrTime(row['goods_godown_entry_detail_ref_stock_record__main__check_time']),
  947. 'notes': row['goods_godown_entry_detail_ref_stock_record__notes'],
  948. 'no': row['goods_godown_entry_detail_ref_stock_record__main__no'],
  949. }
  950. data.append(item)
  951. return data