12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957 |
- # coding=utf-8
- import traceback
- import json
- import os
- from collections import OrderedDict
- from datetime import timedelta
- from django.db.models import Q, Count, Sum, F
- from apps.base import Formater
- from _mysql_exceptions import IntegrityError
- from django.db.models import ProtectedError
- from django.utils import timezone
- from django.views.decorators.csrf import csrf_exempt
- from django.db import transaction, IntegrityError
- from apps.warehouse.biz import BizWarehouse, GetWarehouseSrockRecord
- from libs import utils
- from django.conf import settings
- from libs.http import JSONResponse, JSONError, DataGridJSONResponse
- from apps.exceptions import CustomError, ExportChange
- from apps.account.decorators import token_required, permission_required, valid_permission, isHasPermissions
- from apps.account.models import User
- from apps.foundation.models import BizLog, Option
- from apps.product.models import ProductBase
- from apps.warehouse.models import WarehouseRecord, Warehouse, WarehouseStockRecord, WarehouseRecordDetail
- from apps.warehouse.models import WarehouseStock, InventoryDetail
- from apps.goods.models import GoodsGodownEntryDetail
- from apps.material.models import DeliverDetail, DeliverReturnDetail
- from apps.supplier.models import Supplier
- from apps.config.models import Config
- from apps.purchase.filters import PurchasePlanFilter, PurchaseOrderFilter, PurchasePriceFilter, GodownEntryFilter, \
- PurchasePaymentFilter, PurchaseOrderDetailFilter, GodownEntryReturnFilter, GodownEntryReturnDetailFilter, PurchasePriceExportFilter
- from apps.purchase.models import PurchasePlan, PurchasePlanDetail, PurchaseOrder, PurchaseOrderDetail, PurchasePrice, \
- GodownEntryReturn, GodownEntryReturnDetail, PurchaseInvoiceImage, PurchasePay
- from apps.purchase.resources import GodownEntryResource, GodownEntryDetailResource, GodownEntryImporter, \
- PurchasePlanResource, PurchasePlanDetailResource, PurchaseOrderResource, PurchaseOrderDetailResource, \
- PurchasePaymentResource, PurchasePaymentDetailResource, PurchaseInvoiceResource, GodownEntryQueryResource, \
- GodownEntryReturnResource, GodownEntryReturnDetailResource, GodownEntryReturnQueryResource, PurchasePlanImporter, PurchasePriceResource
- from apps.purchase.serializers import PurchaseUser, GodownEntryDetail, GodownEntry, PurchasePaymentDetail, \
- PurchasePayment, PurchasePlanSerializer, PurchasePlanDetailSerializer, PurchaseOrderDetailSerializer, \
- PurchaseUserSerializer, PurchasePriceSerializer, GodownEntrySerializer, GodownEntryDetailSerializer, \
- PurchaseOrderSerializer, PurchasePaymentSerializer, GodownEntryReturnSerializer, GodownEntryReturnDetailSerializer, \
- PurchasePaySerializer
- @csrf_exempt
- @permission_required('purchase.view_purchase_plan')
- def purchase_list(request):
- department_ids = request.user.getSubDepartmentIds()
- user_ids = request.user.getSubEmployeeIds()
- rows = PurchasePlan.objects.filter(Q(create_user_id__in=user_ids) | Q(department_id__in=department_ids) | Q(create_user=request.user))
- f = PurchasePlanFilter(request.GET, queryset=rows)
- total_row = f.qs.aggregate(total_count=Sum('total_count'))
- more = {
- 'total_count': Formater.formatCountShow(total_row['total_count'])
- }
- rows, total = utils.get_page_data(request, f.qs)
- serializer = PurchasePlanSerializer(rows, many=True)
- return DataGridJSONResponse(serializer.data, total, more)
- @csrf_exempt
- @permission_required('purchase.export_purchase_plan')
- def purchase_export(request):
- id = request.GET.get('id')
- if id:
- production = PurchasePlan.getById(id)
- goods_rows = PurchasePlanDetail.objects.filter(purchase__id=production.id)
- serializer = PurchasePlanDetailSerializer(goods_rows, many=True)
- export_data = ExportChange.dict_to_obj(serializer)
- export_data = PurchasePlanDetailResource().export(export_data)
- filename = utils.attachment_save(export_data)
- return JSONResponse({'filename': filename})
- department_ids = request.user.getSubDepartmentIds()
- user_ids = request.user.getSubEmployeeIds()
- rows = PurchasePlan.objects.filter(Q(create_user_id__in=user_ids) | Q(department_id__in=department_ids) | Q(create_user=request.user))
- f = PurchasePlanFilter(request.GET, queryset=rows)
- serializer = PurchasePlanSerializer(f.qs, many=True)
- export_data = ExportChange.dict_to_obj(serializer)
- export_data = PurchasePlanResource().export(export_data)
- filename = utils.attachment_save(export_data)
- return JSONResponse({'filename': filename})
- @csrf_exempt
- @permission_required('purchase.export_purchase_plan_price')
- def purchase_price_export(request):
- id = request.GET.get('id')
- rows = PurchasePrice.objects.filter(purchase_detail__purchase_id=id,report=True)
- if rows.count() == 0:
- return JSONError(u'该采购单没有上传价格')
- f = PurchasePriceExportFilter(request.GET, queryset=rows)
- serializer = PurchasePriceSerializer(f.qs, many=True)
- export_data = ExportChange.dict_to_obj(serializer)
- export_data = PurchasePriceResource().export(export_data)
- filename = utils.attachment_save(export_data)
- return JSONResponse({'filename': filename})
- @csrf_exempt
- @permission_required('purchase.add_purchase_plan')
- def purchase_import(request):
- file = request.FILES.get('excel_file')
- main_data = json.loads(request.POST.get('main_data'))
- try:
- line = 2
- importer = PurchasePlanImporter()
- excel_rows = importer.getExcelData(file)
- with transaction.atomic():
- serializer = PurchasePlanSerializer.factory(request.user, main_data)
- serializer = serializer.validSave()
- for excel_row in excel_rows:
- try:
- row = importer.validRow(excel_row)
- type = ProductBase.CONSUMABLE
- if row[u'产品类别'] == u'原料':
- type = ProductBase.MATERIAL
- model = row[u'产品代码']
- product_base = ProductBase.objects.filter(model=model, type=type)
- if product_base.count() == 0:
- raise CustomError(u'产品代码不存在')
- elif product_base.count() > 1:
- raise CustomError(u'产品代码重复,前往基础数据设置修改')
- else:
- product_base = product_base.first()
- # quality_request = None
- # if row[u'质量要求']:
- # quality_request = Option.getByName(row[u'质量要求'], Option.QUALITY_REQUEST).id
- items_data = {}
- items_data['purchase'] = serializer.id
- items_data['quality_request_text'] = row[u'质量要求']
- items_data['product'] = product_base.id
- items_data['purchase_count'] = row[u'数量']
- items_data['product_time'] = row[u'需求时间']
- items_data['notes'] = row[u'备注']
- detail_serializer = PurchasePlanDetailSerializer.factory(request.user, items_data)
- detail_serializer.validSave()
- except CustomError, e:
- raise CustomError(u'第%d行:%s' % (line, e.get_error_msg()))
- except Exception, e:
- raise CustomError(u'第%d行:%s' % (line, unicode(e)))
- line += 1
- serializer.updateTotalCount()
- BizLog.objects.addnew(request.user, BizLog.IMPORT, u"导入采购计划[%s],id=%d" % (serializer.no, serializer.id))
- except CustomError, e:
- return JSONError(e.get_error_msg())
- except Exception, e:
- traceback.print_exc()
- return JSONError(u'导入失败!')
- return JSONResponse()
- @csrf_exempt
- @permission_required('purchase.add_purchase_plan')
- def purchase_save(request):
- id = request.GET.get('id')
- purchase_base_data = json.loads(request.POST.get('items'))
- purchase_data = json.loads(request.POST.get('purchase'))
- try:
- with transaction.atomic():
- pb = PurchasePlanSerializer.factory(request.user, purchase_data, id)
- if pb.instance and pb.instance.status == settings.PASS:
- raise CustomError(u'审核通过,禁止修改')
- pb = pb.validSave()
- PurchasePlanDetail.objects.filter(purchase=pb).delete()
- for purchase_base in purchase_base_data:
- purchase_base['purchase'] = pb.id
- purchase_base['product'] = purchase_base['id']
- if 'product_time' in purchase_base and not purchase_base['product_time']:
- purchase_base['product_time'] = None
- production = PurchasePlanDetailSerializer.factory(request.user, purchase_base)
- production.validSave()
- pb.updateTotalCount()
- except CustomError, e:
- return JSONError(e.get_error_msg())
- except Exception, e:
- traceback.print_exc()
- return JSONError(u'保存失败')
- return JSONResponse()
- @csrf_exempt
- @permission_required('purchase.check_purchase_plan')
- def purchase_check(request):
- id = request.GET.get('id')
- #c_type = request.GET.get('c_type')
- status = int(request.GET.get('status'))
- try:
- with transaction.atomic():
- purchase = PurchasePlan.getById(id)
- if status == settings.PASS:
- if purchase.status == settings.PASS:
- raise CustomError(u'该采购计划已审核')
- purchase.status = settings.PASS
- purchase.check_user = request.user
- purchase.check_time = timezone.now()
- BizLog.objects.addnew(
- request.user,
- BizLog.CHECK,
- u"审核采购计划[%s],id=%d" % (purchase.name, purchase.id),
- )
- else:
- if purchase.status == settings.DEFAULT:
- raise CustomError(u'该采购计划未审核')
- # if purchase.check_user2:
- # raise CustomError(u'该采购计划已复核')
- is_report = purchase.isReport()
- is_compact = purchase.isCompart()
- if is_compact:
- raise CustomError(u'已生成采购合同,禁止撤销审核')
- if is_report:
- raise CustomError(u'已有上报的询价记录,禁止撤销审核')
- purchaseprices = PurchasePrice.objects.filter(purchase_detail__purchase=purchase)
- purchaseprices.delete()
- PurchaseUser.objects.filter(purchase=purchase).delete()
- purchase.status = settings.DEFAULT
- purchase.check_user = None
- purchase.check_time = None
- BizLog.objects.addnew(
- request.user,
- BizLog.CHECK,
- u"撤消审核采购计划[%s],id=%d" % (purchase.name, purchase.id),
- )
- purchase.save()
- # if c_type == 'check':
- # # 审核
- #
- # elif c_type == 'check2':
- # #复核
- # if status == settings.PASS:
- # if purchase.status == settings.DEFAULT:
- # raise CustomError(u'该采购计划未审核')
- # if purchase.check_user3:
- # raise CustomError(u'该采购计划已批准')
- #
- # purchase.check_user2 = request.user
- # purchase.check_time2 = timezone.now()
- # BizLog.objects.addnew(
- # request.user,
- # BizLog.CHECK,
- # u"复核采购计划[%s],id=%d" % (purchase.name, purchase.id),
- # )
- # else:
- # if not purchase.check_user2:
- # raise CustomError(u'该采购计划未复核')
- # if purchase.check_user3:
- # raise CustomError(u'该采购计划已批准')
- #
- # purchase.check_user2 = None
- # purchase.check_time2 = None
- # BizLog.objects.addnew(
- # request.user,
- # BizLog.CHECK,
- # u"撤消复核采购计划[%s],id=%d" % (purchase.name, purchase.id),
- # )
- # elif c_type == 'check3':
- # #批准
- # if status == settings.PASS:
- # if not purchase.check_user2:
- # raise CustomError(u'该采购计划未复核')
- # if purchase.check_user3:
- # raise CustomError(u'该采购计划已批准')
- # purchase.status = status
- # purchase.check_user3 = request.user
- # purchase.check_time3 = timezone.now()
- # BizLog.objects.addnew(
- # request.user,
- # BizLog.CHECK,
- # u"批准采购计划[%s],id=%d" % (purchase.name, purchase.id),
- # )
- # else:
- # if not purchase.check_user3:
- # raise CustomError(u'该采购计划未批准')
- # is_report = purchase.isReport()
- # is_compact = purchase.isCompart()
- # if is_compact:
- # raise CustomError(u'已生成采购合同,禁止撤销')
- # if is_report:
- # raise CustomError(u'已有上报的询价记录,禁止撤销')
- #
- # purchase.status = settings.CHECKING
- # purchase.check_user3 = None
- # purchase.check_time3 = None
- # BizLog.objects.addnew(
- # request.user,
- # BizLog.CHECK,
- # u"撤消批准采购计划[%s],id=%d" % (purchase.name, purchase.id),
- # )
- except CustomError, e:
- return JSONError(e.get_error_msg())
- except Exception, e:
- traceback.print_exc()
- return JSONError(u'审核失败')
- return JSONResponse({})
- @csrf_exempt
- @permission_required('purchase.delete_purchase_plan')
- def purchase_delete(request):
- id = int(request.GET.get('id'))
- try:
- with transaction.atomic():
- purchase = PurchasePlan.getById(id)
- if purchase.status == settings.PASS:
- raise CustomError(u'该采购计划已审核,禁止删除')
- is_report = purchase.isReport()
- is_compact = purchase.isCompart()
- if is_compact:
- raise CustomError(u'已生成采购合同,禁止撤销审核')
- if is_report:
- raise CustomError(u'已有上报的询价记录,禁止撤销审核')
- BizLog.objects.addnew(request.user, BizLog.DELETE, u"删除采购计划[%s],id=%d" % (purchase.name, purchase.id))
- PurchasePlanDetail.objects.filter(purchase__id=purchase.id).delete()
- purchase.delete()
- except CustomError, e:
- return JSONError(e.get_error_msg())
- except ProtectedError:
- return JSONError(u'该计划已被引用,禁止删除')
- except IntegrityError:
- return JSONError(u'该计划已被引用,禁止删除')
- except Exception, e:
- traceback.print_exc()
- return JSONError(u'删除失败!')
- return JSONResponse({})
- @csrf_exempt
- @permission_required('purchase.view_purchase_plan')
- def purchase_detail(request):
- id = request.GET.get('id')
- purchase = PurchasePlan.getById(id)
- company = purchase.department.getCompany()
- product_rows = PurchasePlanDetail.objects.filter(purchase__id=purchase.id)
- data = {
- 'purchase': [],
- 'product_items': []
- }
- if purchase.status == settings.PASS:
- status_text = u'已审核'
- else:
- status_text = u'待审核'
- production_item = {
- 'name': purchase.name,
- 'no': purchase.no,
- 'company': company.name,
- 'status_text': status_text,
- 'notes': purchase.notes,
- 'demend_user_id': purchase.demend_user and purchase.demend_user.id,
- 'demend_user': purchase.demend_user and purchase.demend_user.name or '',
- 'check_user': purchase.check_user and purchase.check_user.name or '',
- 'check_time': Formater.formatStrTime(purchase.check_time),
- 'create_time': Formater.formatStrTime(purchase.create_time),
- }
- data['purchase'].append(production_item)
- for row in product_rows:
- count = row.purchase_count - row.product.stock_count
- if count < 0:
- count = 0
- item = {
- 'id': row.id,
- 'product_id': row.product.id,
- 'name': row.product.name,
- 'model': row.product.model,
- 'unit': row.product.unit,
- 'standard': row.product.standard or '',
- 'product_notes': row.product.notes or '',
- 'quality_request_text': row.quality_request_text or '',
- 'count': Formater.formatCountShow(count),
- 'stock_count': Formater.formatCountShow(row.product.stock_count),
- 'purchase_count': Formater.formatCountShow(row.purchase_count),
- 'product_time': Formater.formatStrTimeS(row.product_time),
- 'product_time1': Formater.formatStrDate(row.product_time),
- 'notes': row.notes or ''
- }
- data['product_items'].append(item)
- return JSONResponse(data)
- @csrf_exempt
- @permission_required('purchase.add_purchase_user_plan')
- def purchase_user_save(request):
- id = request.GET.get('id')
- touch = request.GET.get('touch')
- if touch:
- users = json.loads(request.body)['users']
- else:
- users = json.loads(request.POST.get('users'))
- users_list = []
- for user in users:
- users_list.append(user['id'])
- try:
- purchase_data = PurchasePlan.getById(id)
- purchase_details = purchase_data.getPurchaseDetails()
- # 对比采购员名单,多的添加,少的删除
- purchase_user_datas = PurchaseUser.objects.filter(purchase=purchase_data).values_list('purchase_user_id',flat=True)
- purchase_user_adds = [val for val in users_list if val not in purchase_user_datas]
- purchase_user_deletes = []
- report_users = PurchasePrice.objects.filter(purchase_detail__purchase=purchase_data,report=True).values_list('purchase_user_id',flat=True).order_by('purchase_user_id').distinct()
- for val in purchase_user_datas:
- if val not in users_list and val not in report_users:
- purchase_user_deletes.append(val)
- with transaction.atomic():
- PurchasePrice.objects.filter(purchase_user__in=purchase_user_deletes, purchase_detail__purchase=purchase_data).delete()
- PurchaseUser.objects.filter(purchase=purchase_data, purchase_user__id__in=purchase_user_deletes).delete()
- for purchase_user_add in purchase_user_adds:
- purchase_user_data = {
- 'purchase': purchase_data.id,
- 'purchase_user': purchase_user_add,
- }
- production = PurchaseUserSerializer.factory(request.user, purchase_user_data)
- production.validSave()
- for purchase_detail in purchase_details:
- data = {
- 'purchase_detail': purchase_detail.id,
- 'purchase_user': purchase_user_add,
- 'report': False,
- 'price': 0,
- }
- item = PurchasePriceSerializer.factory(request.user, data)
- item.validSave()
- except CustomError, e:
- return JSONError(e.get_error_msg())
- except Exception, e:
- traceback.print_exc()
- return JSONError(u'保存失败!')
- return JSONResponse()
- @csrf_exempt
- @token_required
- def purchase_table(request):
- id = request.GET.get('id')
- purchaseplan = PurchasePlan.getById(id)
- data = {
- 'plan_details': [],
- 'purchase_users': [],
- 'purchase_prices':[]
- }
- purchasedetails = PurchasePlanDetail.objects.filter(purchase=purchaseplan)
- for purchasedetail in purchasedetails:
- item = {
- 'id':purchasedetail.id,
- 'name': purchasedetail.product.name,
- 'model': purchasedetail.product.model,
- 'unit': purchasedetail.product.unit,
- 'count': Formater.formatCountShow(purchasedetail.purchase_count),
- }
- data['plan_details'].append(item)
- purchaseusers = PurchaseUser.objects.filter(purchase=purchaseplan)
- for purchaseuser in purchaseusers:
- item = {
- 'id':purchaseuser.purchase_user.id,
- 'name':purchaseuser.purchase_user.name,
- 'plan_id':purchaseuser.purchase_id
- }
- data['purchase_users'].append(item)
- purchaseprices = PurchasePrice.objects.filter(purchase_detail__purchase=purchaseplan,report=True)
- for purchaseprice in purchaseprices:
- item = {
- 'id': purchaseprice.id,
- 'user_id': purchaseprice.purchase_user_id,
- 'detail_id': purchaseprice.purchase_detail_id,
- 'supplier': purchaseprice.supplier.name,
- 'price': Formater.formatPriceShow(purchaseprice.price),
- 'notes': purchaseprice.notes,
- }
- data['purchase_prices'].append(item)
- return JSONResponse(data)
- @csrf_exempt
- @permission_required('purchase.view_purchase_user_plan')
- def purchase_price_list(request):
- f = PurchasePriceFilter(request.GET, queryset=PurchasePrice.objects.filter(
- Q(purchase_user=request.user) & Q(purchase_detail__is_compact=False)))
- rows, total = utils.get_page_data(request, f.qs)
- serializer = PurchasePriceSerializer(rows, many=True)
- return DataGridJSONResponse(serializer.data, total)
- @csrf_exempt
- @permission_required('purchase.add_purchase_price_plan')
- def purchase_price_save(request):
- id = request.GET.get('id')
- data = json.loads(request.body)
- try:
- if 'tax_rate' in data and data['tax_rate'] == '':
- data['tax_rate'] = None
- purchase_price = PurchasePrice.getById(id)
- if purchase_price.report:
- raise CustomError(u'询价已上报,禁止录入')
- with transaction.atomic():
- production = PurchasePriceSerializer.factory(request.user, data, id)
- production.validSave()
- except CustomError, e:
- return JSONError(e.get_error_msg())
- except Exception, e:
- traceback.print_exc()
- return JSONError(u'保存失败!')
- return JSONResponse()
- @csrf_exempt
- @permission_required('purchase.add_purchase_price_plan')
- def purchase_price_report(request):
- try:
- with transaction.atomic():
- purchase_prices = PurchasePrice.objects.filter(purchase_user=request.user, supplier__isnull=False)
- purchase_price_ids = purchase_prices.values_list('id', flat=True)
- purchase_prices.update(report=True)
- BizLog.objects.addnew(
- request.user,
- BizLog.UPDATE,
- u"上报询价",
- purchase_price_ids
- )
- except CustomError, e:
- return JSONError(e.get_error_msg())
- except Exception, e:
- traceback.print_exc()
- return JSONError(u'上报失败!')
- return JSONResponse()
- @csrf_exempt
- @token_required
- def purchase_price_detail(request):
- id = request.GET.get('id')
- rows = PurchasePrice.objects.filter(purchase_detail__purchase_id=id, report=True)
- data = []
- for row in rows:
- item = {
- 'id': row.id,
- 'name': row.purchase_detail.product.name,
- 'supplier_name': row.supplier.name,
- 'user_name': row.purchase_user.name,
- 'price': Formater.formatPriceShow(row.price),
- }
- data.append(item)
- return JSONResponse({'data': data})
- @csrf_exempt
- @permission_required('purchase.edit_purchase_price')
- def purchase_price_edit_save(request):
- data = json.loads(request.POST.get('data'))
- try:
- with transaction.atomic():
- for item in data:
- order = PurchasePrice.objects.filter(id=int(item['id'])).first()
- if not order:
- raise CustomError(u'未找到单据')
- order.price = Formater.formatPrice(item['price'])
- order.save()
- BizLog.objects.addnew(
- request.user,
- BizLog.UPDATE,
- u"修改询价",
- order.purchase_detail.purchase.no
- )
- except CustomError, e:
- return JSONError(e.get_error_msg())
- except Exception, e:
- traceback.print_exc()
- return JSONError(u'保存失败')
- return JSONResponse({})
- @csrf_exempt
- @permission_required('purchase.view_purchase_order')
- def purchase_order_list(request):
- department_ids = request.user.getSubDepartmentIds()
- user_ids = request.user.getSubEmployeeIds()
- rows = PurchaseOrder.objects.filter(Q(create_user_id__in=user_ids) | Q(department_id__in=department_ids) | Q(create_user=request.user))
- f = PurchaseOrderFilter(request.GET, queryset=rows)
- total_row = f.qs.aggregate(sum_count=Sum('count'), sum_amount=Sum('amount'))
- more = {
- 'sum_count': Formater.formatCountShow(total_row['sum_count']),
- 'sum_amount': Formater.formatAmountShowWithTwoDecimalPlaces(total_row['sum_amount'])
- }
- rows, total = utils.get_page_data(request, f.qs)
- serializer = PurchaseOrderSerializer(rows, many=True)
- return DataGridJSONResponse(serializer.data, total, more)
- @csrf_exempt
- @permission_required('purchase.export_purchase_order')
- def purchase_order_export(request):
- department_ids = request.user.getSubDepartmentIds()
- user_ids = request.user.getSubEmployeeIds()
- rows = PurchaseOrder.objects.filter(Q(create_user_id__in=user_ids) | Q(department_id__in=department_ids) | Q(create_user=request.user))
- f = PurchaseOrderFilter(request.GET, queryset=rows)
- serializer = PurchaseOrderSerializer(f.qs, many=True)
- export_data = ExportChange.dict_to_obj(serializer)
- export_data = PurchaseOrderResource().export(export_data)
- filename = utils.attachment_save(export_data)
- BizLog.objects.addnew(request.user, BizLog.EXPORT, u"导出采购合同")
- return JSONResponse({'filename': filename})
- @csrf_exempt
- @permission_required('purchase.edit_purchase_order')
- def purchase_order_edit(request):
- id = request.GET.get('id')
- data = json.loads(request.body)
- try:
- with transaction.atomic():
- order = PurchaseOrder.objects.filter(id=id).first()
- if order.status > PurchaseOrder.DRAFT:
- raise CustomError(u'该合同已审核,禁止修改')
- order.supplier_id = data['supplier']
- order.payment_type = data['payment_type']
- order.notes = data['notes']
- order.deliver_time = data['deliver_time']
- order.no = data['no']
- order.consignee_name = data['consignee_name']
- order.consignee_tel = data['consignee_tel']
- order.save()
- except CustomError, e:
- return JSONError(e.get_error_msg())
- except Exception, e:
- traceback.print_exc()
- return JSONError(u'保存失败')
- return JSONResponse({})
- @csrf_exempt
- @permission_required('purchase.add_purchase_order | purchase.senior_purchase_order')
- def purchase_order_save(request):
- id = request.GET.get('id')
- data = json.loads(request.body)
- try:
- with transaction.atomic():
- pb = PurchaseOrderSerializer.factory(request.user, data['order_data'], id)
- if pb.instance and pb.instance.status == PurchaseOrder.TAKE_EFFECT:
- raise CustomError(u'该合同已审核,禁止修改')
- pb = pb.validSave()
- PurchaseOrderDetail.objects.filter(main_id=pb.id).delete()
- for item in data['items']:
- item['main'] = pb.id
- pbd = PurchaseOrderDetailSerializer.factory(request.user, item)
- pbd.validSave()
- pb.updateAmount()
- if pb.plan:
- pb.plan.updateCompact()
- except CustomError, e:
- return JSONError(e.get_error_msg())
- except Exception, e:
- traceback.print_exc()
- return JSONError(u'保存失败')
- return JSONResponse({})
- @csrf_exempt
- @permission_required('purchase.add_purchase_order')
- def purchase_plan_to_order(request):
- touch = request.GET.get('touch')
- if touch:
- data = json.loads(request.body)['data']
- else:
- data = json.loads(request.POST.get('data'))
- try:
- with transaction.atomic():
- price_ids = [row['user_price_id'] for row in data]
- supplier_rows = PurchasePrice.objects.filter(id__in=price_ids).values('supplier_id','purchase_user_id','purchase_user__department_id').order_by('supplier_id','purchase_user_id','purchase_user__department_id').distinct()
- for supplier_row in supplier_rows:
- order = PurchaseOrder.objects.create(
- supplier_id=supplier_row['supplier_id'],
- create_user_id=supplier_row['purchase_user_id'],
- department_id=supplier_row['purchase_user__department_id']
- ) # 生成采购合同
- purchase_plan = None
- price_rows = PurchasePrice.objects.filter(supplier_id=supplier_row['supplier_id'], purchase_user_id=supplier_row['purchase_user_id'], id__in=price_ids)
- if price_rows.count > 0:
- purchase_plan = price_rows[0].purchase_detail.purchase
- for price_row in price_rows:
- if price_row.purchase_detail.is_compact:
- raise CustomError(u'[%s]上报的产品[%s]已生成合同,不允许再次生成' % (price_row.purchase_user.name, price_row.purchase_detail.product.name))
- PurchaseOrderDetail.objects.create(
- main=order,
- quality_request_text=price_row.purchase_detail.quality_request_text,
- count=price_row.purchase_detail.purchase_count,
- price=price_row.price,
- amount=price_row.purchase_detail.purchase_count * price_row.price,
- product=price_row.purchase_detail.product
- )
- order.no = order.order_no
- order.plan = purchase_plan
- order.save()
- order.updateAmount()
- if purchase_plan:
- purchase_plan.updateCompact()
- except CustomError, e:
- return JSONError(e.get_error_msg())
- except Exception, e:
- traceback.print_exc()
- return JSONError(u'生成合同失败')
- return JSONResponse({})
- @csrf_exempt
- @token_required
- def purchase_order_detail(request):
- id = request.GET.get('id')
- source = request.GET.get('source')
- purchase_order = PurchaseOrder.getById(id)
- user = purchase_order.create_user
- company = purchase_order.department.getCompany()
- rows = PurchaseOrderDetail.objects.filter(main_id=id)
- create_time = purchase_order.create_time
- deliver_time = purchase_order.deliver_time
- if source:
- status_text = PurchaseOrder.STATUS_CHOICES[purchase_order.status][1]
- arrval_text = PurchaseOrder.ARRVAL_CHOICES[purchase_order.arrval][1]
- entries_list = []
- Godownentrys = GodownEntry.objects.filter(purchase_order=purchase_order)
- entries_list.extend([s[0] for s in Godownentrys.values_list('no')])
- entries_text = ','.join(entries_list)
- main_data = {
- 'order_no': purchase_order.order_no,
- 'no': purchase_order.no,
- 'notes': purchase_order.notes,
- 'supplier_text': purchase_order.supplier and purchase_order.supplier.name or '',
- 'payment_type': purchase_order.payment_type,
- 'count': Formater.formatCountShow(purchase_order.count),
- 'amount': Formater.formatAmountShow(purchase_order.amount),
- 'apply_amount': Formater.formatAmountShow(purchase_order.apply_amount),
- 'status': purchase_order.status,
- 'status_text': status_text,
- 'arrval_text': arrval_text,
- 'entries_text': entries_text,
- 'check_user': purchase_order.check_user and purchase_order.check_user.name or '',
- 'check_time': Formater.formatStrTime(purchase_order.check_time),
- 'create_user': purchase_order.create_user and purchase_order.create_user.name or '',
- 'create_time': Formater.formatStrTime(purchase_order.create_time),
- 'deliver_time': Formater.formatStrTime(purchase_order.deliver_time),
- 'check_user2': purchase_order.check_user2 and purchase_order.check_user2.name or '',
- 'check_time2': Formater.formatStrTime(purchase_order.check_time2),
- 'check_user3': purchase_order.check_user3 and purchase_order.check_user3.name or '',
- 'check_time3': Formater.formatStrTime(purchase_order.check_time3),
- 'consignee_name': purchase_order.consignee_name,
- 'consignee_tel': purchase_order.consignee_tel,
- }
- data = {
- 'main_data': main_data,
- 'items_data': []
- }
- else:
- data = {
- 'company': company.name,
- 'tel': user.tel,
- 'create_time': Formater.formatStrDate(create_time),
- 'deliver_time': deliver_time,
- 'items_data': []
- }
- for row in rows:
- g_rows = GodownEntryDetail.objects.filter(main__purchase_order_id=id, main__status=settings.PASS, product_base_id=row.product_id)
- arrval_date = ''
- arrval_nos = ''
- if g_rows:
- arrval_nos = ','.join([s[0] for s in g_rows.values_list('main__no')])
- arrval_date = ','.join([utils.strfdate(s[0]) for s in g_rows.values_list('main__check_time')])
- item = {
- 'id': row.id,
- 'product_id': row.product_id,
- 'name': row.product.name,
- 'model': row.product.model,
- 'unit': row.product.unit,
- 'standard': row.product.standard,
- 'type_text': row.product.get_type_display(),
- 'options_type_text': row.product.option_type.name,
- 'type': row.product.type,
- 'options_type': row.product.option_type_id,
- 'quality_request_text': row.quality_request_text or '',
- 'warehouse_place': row.product.warehouse_place,
- 'count': Formater.formatCountShow(row.count),
- 'arrval_count': Formater.formatCountShow(row.arrval_count),
- 'price': Formater.formatPriceShow(row.price),
- 'amount': Formater.formatAmountShowWithTwoDecimalPlaces(row.amount),
- 'arrval_date': arrval_date,
- 'arrval_nos': arrval_nos,
- 'invoice_no': row.invoice_no or '',
- 'avg_cost_price': Formater.formatPriceShow(row.product.avg_cost_price),
- 'max_price': Formater.formatPriceShow(row.product.max_price),
- 'min_price': Formater.formatPriceShow(row.product.min_price),
- }
- data['items_data'].append(item)
- return JSONResponse(data)
- @csrf_exempt
- @token_required
- def select_purchase_order(request):
- no = request.GET.get('no')
- if not no:
- return JSONError(u'请输入合同单号!')
- rows = PurchaseOrderDetail.objects.filter(main__no=no, main__status=PurchaseOrder.TAKE_EFFECT)
- if rows.count() == 0:
- return JSONError(u'合同单号不正确或该合同尚未生效!')
- if rows[0].main.apply_amount >= rows[0].main.amount:
- return JSONError(u'该合同已付款完毕!')
- result = {
- 'order_id': rows[0].main.id,
- 'apply_amount': Formater.formatAmountShow(rows[0].main.apply_amount),
- 'amount': Formater.formatAmountShow(rows[0].main.amount),
- 'data': []
- }
- for row in rows:
- item = {
- 'id': row.id,
- 'name': row.product.name,
- 'model': row.product.model,
- 'order_no': row.main.no,
- 'supplier_name': row.main.supplier.name,
- 'count': Formater.formatCountShow(row.count),
- 'amount': Formater.formatAmountShow(row.amount),
- }
- result['data'].append(item)
- return JSONResponse(result)
- @csrf_exempt
- @permission_required('purchase.delete_purchase_order')
- def purchase_order_delete(request):
- id = int(request.GET.get('id'))
- try:
- with transaction.atomic():
- order = PurchaseOrder.getById(id)
- if order.status != PurchaseOrder.DRAFT:
- raise CustomError(u'该采购合同已生效, 不允许删除')
- # 删除发票图片
- image_rows = PurchaseInvoiceImage.objects.filter(order_detail__main_id=order.id)
- images_files = []
- for image_row in image_rows:
- images_files.append({'url': image_row.invoice_image})
- image_rows.delete()
- BizLog.objects.addnew(request.user, BizLog.DELETE, u"删除采购合同[%s],id=%d" % (order.no, order.id))
- purchase = order.plan
- PurchaseOrderDetail.objects.filter(main=order).delete()
- order.delete()
- if purchase:
- purchase.updateCompact()
- try:
- for item in images_files:
- os.remove("%s/%s" % (settings.MEDIA_ROOT, item['url']))
- except:
- pass
- except CustomError, e:
- return JSONError(e.get_error_msg())
- except ProtectedError:
- return JSONError(u'该采购合同已被引用,禁止删除!')
- except IntegrityError:
- return JSONError(u'该采购合同已被引用,禁止删除!')
- except Exception, e:
- traceback.print_exc()
- return JSONError(u'删除失败!')
- return JSONResponse({})
- @csrf_exempt
- @permission_required('purchase.check_purchase_order')
- def purchase_order_check(request):
- id = request.GET.get('id')
- c_type = request.GET.get('c_type')
- status = int(request.GET.get('status'))
- try:
- with transaction.atomic():
- order = PurchaseOrder.getById(id)
- if c_type == 'check':
- if status == PurchaseOrder.TAKE_EFFECT:
- if order.status == PurchaseOrder.CHECKING:
- raise CustomError(u'该采购合同已审核')
- if not order.no:
- raise CustomError(u'该采购合同未填写合同号, 不允许审核')
- exist_rows = PurchaseOrder.objects.filter(Q(no=order.no), ~Q(id=id)).first()
- if exist_rows:
- raise CustomError(u'该采购合同单号已存在')
- order.status = PurchaseOrder.CHECKING
- order.check_user = request.user
- order.check_time = timezone.now()
- BizLog.objects.addnew(
- request.user,
- BizLog.CHECK,
- u"审核采购合同[%s],id=%d" % (order.no, order.id),
- )
- else:
- if order.status == PurchaseOrder.DRAFT:
- raise CustomError(u'该采购合同尚未审核')
- if order.check_user2:
- raise CustomError(u'该采购合同已复核')
- g_row = GodownEntry.objects.filter(purchase_order=order).first()
- if g_row:
- raise CustomError(u'该合同已存在入库单, 不允许撤销审核')
- pay = PurchasePayment.objects.filter(order=order).first()
- if pay:
- raise CustomError(u'该合同已存在付款单, 不允许撤销审核')
- d_row = PurchaseOrderDetail.objects.filter(main=order, invoice_no__isnull=False, check_status=settings.PASS).first()
- if d_row:
- raise CustomError(u'该合同已审核发票, 不允许撤销审核')
- order.status = PurchaseOrder.DRAFT
- order.check_user = None
- order.check_time = None
- BizLog.objects.addnew(
- request.user,
- BizLog.CHECK,
- u"采购合同取消审核[%s],id=%d" % (order.no, order.id),
- )
- elif c_type == 'check2':
- #复核
- if status == PurchaseOrder.TAKE_EFFECT:
- if order.status == PurchaseOrder.DRAFT:
- raise CustomError(u'该采购合同未审核')
- if order.check_user3:
- raise CustomError(u'该采购合同已批准')
- order.check_user2 = request.user
- order.check_time2 = timezone.now()
- BizLog.objects.addnew(
- request.user,
- BizLog.CHECK,
- u"采购合同复核[%s],id=%d" % (order.no, order.id),
- )
- else:
- if not order.check_user2:
- raise CustomError(u'该采购计划未复核')
- if order.check_user3:
- raise CustomError(u'该采购计划已批准')
- order.check_user2 = None
- order.check_time2 = None
- BizLog.objects.addnew(
- request.user,
- BizLog.CHECK,
- u"采购合同取消复核[%s],id=%d" % (order.no, order.id),
- )
- elif c_type == 'check3':
- #批准
- if status == PurchaseOrder.TAKE_EFFECT:
- if not order.check_user2:
- raise CustomError(u'该采购合同未复核')
- if order.check_user3:
- raise CustomError(u'该采购合同已批准')
- order.status = status
- order.check_user3 = request.user
- order.check_time3 = timezone.now()
- BizLog.objects.addnew(
- request.user,
- BizLog.CHECK,
- u"采购合同批准[%s],id=%d" % (order.no, order.id),
- )
- else:
- if not order.check_user3:
- raise CustomError(u'该采购合同未批准')
- g_row = GodownEntry.objects.filter(purchase_order=order).first()
- if g_row:
- raise CustomError(u'该合同已存在入库单, 不允许撤销')
- pay = PurchasePayment.objects.filter(order=order).first()
- if pay:
- raise CustomError(u'该合同已存在付款单, 不允许撤销')
- d_row = PurchaseOrderDetail.objects.filter(main=order, invoice_no__isnull=False,
- check_status=settings.PASS).first()
- if d_row:
- raise CustomError(u'该合同已审核发票, 不允许撤销')
- order.status = PurchaseOrder.CHECKING
- order.check_user3 = None
- order.check_time3 = None
- BizLog.objects.addnew(
- request.user,
- BizLog.CHECK,
- u"采购合同取消批准[%s],id=%d" % (order.no, order.id),
- )
- order.save()
- except CustomError, e:
- return JSONError(e.get_error_msg())
- except Exception, e:
- traceback.print_exc()
- return JSONError(u'审核失败')
- return JSONResponse({})
- @csrf_exempt
- @permission_required('purchase.export_purchase_order')
- def purchase_order_export_detail(request):
- id = request.GET.get('id')
- serializer = PurchaseOrderDetailSerializer(PurchaseOrderDetail.objects.filter(main_id=id), many=True)
- export_data = ExportChange.dict_to_obj(serializer)
- export_data = PurchaseOrderDetailResource().export(export_data)
- filename = utils.attachment_save(export_data)
- BizLog.objects.addnew(request.user, BizLog.EXPORT, u"导出采购合同明细")
- return JSONResponse({'filename': filename})
- @csrf_exempt
- @permission_required('purchase.check_purchase_order')
- def purchase_order_payment(request):
- #todo 简易模式,入库单付款,自动生成付款单,并自动审核。同时创建收支单(创建收支单,放到付款单审核流程中)
- id = request.GET.get('id') # 入库单id
- handing_amount = request.POST.get('handing_amount')
- handing_account = request.POST.get('handing_account')
- transport_account = request.POST.get('transport_account')
- transport_amount = request.POST.get('transport_amount')
- order_amount = Formater.formatAmount(request.POST.get('order_amount') or 0)
- order_account = request.POST.get('order_account')
- try:
- with transaction.atomic():
- godownentry_process = Config.getValue('godownentry_process')
- if godownentry_process != '1':
- raise CustomError('当前入库模式非简易模式,禁止付款!')
- godownEntry = GodownEntry.getById(id)
- if godownEntry.status != settings.PASS:
- raise CustomError('当前入库单未审核,禁止付款!')
- if order_amount:
- # 订单费用
- purchase_order = godownEntry.purchase_order
- payment = PurchasePayment.objects.filter(order=purchase_order).first()
- if payment:
- # 再次付款
- if payment.is_clear:
- raise CustomError('当前入库单已结清,禁止付款!')
- actual_amount = order_amount + payment.actual_amount
- order_data = {
- 'actual_amount': actual_amount,
- 'is_clear': True if actual_amount >= payment.amount else False,
- }
- pb = PurchasePaymentSerializer.factory(request.user, order_data, payment.id)
- else:
- # 首次付款
- order_data = {'order': purchase_order.id,
- 'status': settings.PASS,
- 'amount': purchase_order.amount,
- 'apply_amount': purchase_order.apply_amount,
- 'actual_amount': order_amount,
- 'is_pay': True,
- 'check_time': timezone.now(),
- 'check_user': request.user.id,
- 'is_clear': True if order_amount >= purchase_order.amount else False,
- }
- pb = PurchasePaymentSerializer.factory(request.user, order_data)
- pb.validSave()
- payment = pb.instance
- purchase_order.updateApplyAmount() # 更新合同单的申请金额
- # 创建付款明细
- data={
- 'main':payment.id,
- 'payment_type':order_account,
- 'actual_amount':order_amount,
- }
- pb = PurchasePaySerializer.factory(request.user, data)
- pb.validSave()
- # todo 自动创建收支单
- except CustomError, e:
- return JSONError(e.get_error_msg())
- except Exception, e:
- traceback.print_exc()
- return JSONError(u'审核失败')
- return JSONResponse({})
- @csrf_exempt
- @permission_required('purchase.view_purchase_payment')
- def purchase_payment_list(request):
- department_ids = request.user.getSubDepartmentIds()
- user_ids = request.user.getSubEmployeeIds()
- rows = PurchasePayment.objects.filter(Q(create_user_id__in=user_ids) | Q(department_id__in=department_ids) | Q(create_user=request.user))
- f = PurchasePaymentFilter(request.GET, queryset=rows)
- total_row = f.qs.aggregate(sum_amount=Sum('amount'),sum_apply_amount=Sum('apply_amount'),sum_actual_amount=Sum('actual_amount'))
- more = {
- 'sum_amount': Formater.formatAmountShowWithTwoDecimalPlaces(total_row['sum_amount']),
- 'sum_apply_amount': Formater.formatAmountShowWithTwoDecimalPlaces(total_row['sum_apply_amount']),
- 'sum_actual_amount': Formater.formatAmountShowWithTwoDecimalPlaces(total_row['sum_actual_amount'])
- }
- rows, total = utils.get_page_data(request, f.qs)
- serializer = PurchasePaymentSerializer(rows, many=True)
- return DataGridJSONResponse(serializer.data, total, more)
- @csrf_exempt
- @permission_required('purchase.export_purchase_payment')
- def purchase_payment_export(request):
- department_ids = request.user.getSubDepartmentIds()
- user_ids = request.user.getSubEmployeeIds()
- rows = PurchasePayment.objects.filter(Q(create_user_id__in=user_ids) | Q(department_id__in=department_ids) | Q(create_user=request.user))
- f = PurchasePaymentFilter(request.GET, queryset=rows)
- serializer = PurchasePaymentSerializer(f.qs, many=True)
- export_data = ExportChange.dict_to_obj(serializer)
- export_data = PurchasePaymentResource().export(export_data)
- filename = utils.attachment_save(export_data)
- BizLog.objects.addnew(request.user, BizLog.EXPORT, u"导出付款管理")
- return JSONResponse({'filename': filename})
- @csrf_exempt
- @permission_required('purchase.add_purchase_payment')
- def purchase_payment_save(request):
- id = request.GET.get('id')
- data = json.loads(request.body)
- try:
- with transaction.atomic():
- apply_amount = Formater.formatAmount(data['apply_amount']) # 申请金额
- if apply_amount <= 0:
- raise CustomError(u'本次申请金额必须大于0')
- total_amount = apply_amount
- amount = Formater.formatAmount(data['amount']) # 合同金额
- sum_rows = PurchasePayment.objects.filter(order_id=data['order_id']).aggregate(sum_amount=Sum('apply_amount'))
- if sum_rows:
- total_amount += sum_rows['sum_amount'] or 0
- # if total_amount > amount:
- # raise CustomError(u'该合同申请金额大于合同总金额')
- order_data = {'order': data['order_id'], 'amount': amount, 'apply_amount': apply_amount, 'notes': data['notes']}
- pb = PurchasePaymentSerializer.factory(request.user, order_data, id)
- if pb.instance and pb.instance.status == settings.PASS:
- raise CustomError(u'该付款单已审核')
- # 更新原合同单的申请金额
- if pb.instance:
- order = pb.instance.order
- order.apply_amount -= pb.instance.apply_amount
- order.save()
- pb = pb.validSave()
- pb.order.updateApplyAmount() #更新合同单的申请金额
- except CustomError, e:
- return JSONError(e.get_error_msg())
- except Exception, e:
- traceback.print_exc()
- return JSONError(u'保存失败')
- return JSONResponse({})
- @csrf_exempt
- @token_required
- def purchase_payment_detail(request):
- id = request.GET.get('id')
- company = PurchasePayment.getById(id).department.getCompany()
- payment = PurchasePayment.getById(id)
- rows = PurchaseOrderDetail.objects.filter(main_id=payment.order_id)
- order_id = None
- if rows:
- order_id = rows[0].main_id
- result = {'company': company.name, 'order_id': order_id, 'data': []}
- for row in rows:
- item = {
- 'id': row.id,
- 'product_id': row.product_id,
- 'purchase_detail_id': row.id,
- 'supplier_name': row.main.supplier.name,
- 'supplier_account': row.main.supplier.account,
- 'name': row.product.name,
- 'model': row.product.model,
- 'order_no': row.main.no,
- 'amount': Formater.formatAmountShowWithTwoDecimalPlaces(row.amount),
- 'count': Formater.formatCountShow(row.count),
- 'price': Formater.formatPriceShow(row.price),
- 'avg_cost_price': Formater.formatPriceShow(row.product.avg_cost_price),
- 'unit': row.product.unit or '',
- 'standard': row.product.standard or '',
- 'quality_request_text': row.quality_request_text or '',
- 'max_price': Formater.formatPriceShow(row.product.max_price),
- 'min_price': Formater.formatPriceShow(row.product.min_price),
- }
- result['data'].append(item)
- return JSONResponse(result)
- @csrf_exempt
- @permission_required('purchase.delete_purchase_payment')
- def purchase_payment_delete(request):
- id = int(request.GET.get('id'))
- try:
- with transaction.atomic():
- payment = PurchasePayment.getById(id)
- if payment.status != settings.DEFAULT:
- raise CustomError(u'该付款单已审核, 不允许删除')
- #更新合同单的申请金额
- payment.order.apply_amount -= payment.apply_amount
- payment.order.save()
- BizLog.objects.addnew(request.user, BizLog.DELETE, u"删除采购付款单[%s],id=%d" % (payment.no, payment.id))
- PurchasePaymentDetail.objects.filter(main=payment).delete()
- payment.delete()
- except CustomError, e:
- return JSONError(e.get_error_msg())
- except ProtectedError:
- return JSONError(u'该付款单已被引用,禁止删除!')
- except IntegrityError:
- return JSONError(u'该付款单已被引用,禁止删除!')
- except Exception, e:
- traceback.print_exc()
- return JSONError(u'删除失败!')
- return JSONResponse({})
- @csrf_exempt
- @permission_required('purchase.check_purchase_payment')
- def purchase_payment_check(request):
- id = request.GET.get('id')
- status = int(request.GET.get('status'))
- try:
- with transaction.atomic():
- order = PurchasePayment.getById(id)
- if status == settings.PASS:
- if order.status == settings.PASS:
- raise CustomError(u'该付款单已审核')
- order.status = settings.CHECKING
- order.check_user = request.user
- order.check_time = timezone.now()
- BizLog.objects.addnew(
- request.user,
- BizLog.CHECK,
- u"审核采购付款[%s],id=%d" % (order.no, order.id),
- )
- else:
- if order.status == settings.DEFAULT:
- raise CustomError(u'该付款单尚未审核')
- if order.review_time:
- raise CustomError(u'该付款单已复核,请先撤销复核')
- if order.is_pay:
- raise CustomError(u'该付款单已付款,禁止撤销审核')
- order.status = settings.DEFAULT
- order.check_user = None
- order.check_time = None
- BizLog.objects.addnew(
- request.user,
- BizLog.CHECK,
- u"采购付款单取消审核[%s],id=%d" % (order.no, order.id),
- )
- order.save()
- except CustomError, e:
- return JSONError(e.get_error_msg())
- except Exception, e:
- traceback.print_exc()
- return JSONError(u'审核失败')
- return JSONResponse({})
- @csrf_exempt
- @permission_required('purchase.review_purchase_payment')
- def purchase_payment_review(request):
- id = request.GET.get('id')
- status = int(request.GET.get('status'))
- try:
- with transaction.atomic():
- order = PurchasePayment.getById(id)
- if status == 1:
- if order.status == settings.DEFAULT:
- raise CustomError(u'该付款单尚未审核')
- if order.review_time:
- raise CustomError(u'该付款单已复核')
- order.review_user = request.user
- order.review_time = timezone.now()
- BizLog.objects.addnew(
- request.user,
- BizLog.CHECK,
- u"复核采购付款[%s],id=%d" % (order.no, order.id),
- )
- else:
- if not order.review_time:
- raise CustomError(u'该付款单尚未复核')
- if order.ratify_time:
- raise CustomError(u'该付款单已批准')
- if order.is_pay:
- raise CustomError(u'该付款单已付款,禁止撤销复核')
- order.review_user = None
- order.review_time = None
- BizLog.objects.addnew(
- request.user,
- BizLog.CHECK,
- u"采购付款单撤销复核[%s],id=%d" % (order.no, order.id),
- )
- order.save()
- except CustomError, e:
- return JSONError(e.get_error_msg())
- except Exception, e:
- traceback.print_exc()
- return JSONError(u'复核失败')
- return JSONResponse({})
- @csrf_exempt
- @permission_required('purchase.ratify_purchase_payment')
- def purchase_payment_ratify(request):
- id = request.GET.get('id')
- status = int(request.GET.get('status'))
- try:
- with transaction.atomic():
- order = PurchasePayment.getById(id)
- if status == 1:
- if order.status == settings.DEFAULT:
- raise CustomError(u'该付款单尚未审核')
- if not order.review_time:
- raise CustomError(u'该付款单尚未复核,请先复核')
- if order.ratify_time:
- raise CustomError(u'该付款单已批准')
- order.status = settings.PASS
- order.ratify_user = request.user
- order.ratify_time = timezone.now()
- BizLog.objects.addnew(
- request.user,
- BizLog.CHECK,
- u"批准采购付款[%s],id=%d" % (order.no, order.id),
- )
- else:
- if not order.ratify_time:
- raise CustomError(u'该付款单尚未批准')
- if order.is_pay:
- raise CustomError(u'该付款单已付款,禁止撤销复核')
- order.status = settings.CHECKING
- order.ratify_user = None
- order.ratify_time = None
- BizLog.objects.addnew(
- request.user,
- BizLog.CHECK,
- u"采购付款单撤销批准[%s],id=%d" % (order.no, order.id),
- )
- order.save()
- except CustomError, e:
- return JSONError(e.get_error_msg())
- except Exception, e:
- traceback.print_exc()
- return JSONError(u'批准失败')
- return JSONResponse({})
- @csrf_exempt
- @permission_required('purchase.export_purchase_payment')
- def purchase_payment_export_detail(request):
- id = request.GET.get('id')
- payment = PurchasePayment.getById(id)
- rows = PurchaseOrderDetail.objects.filter(main_id=payment.order_id)
- export_data = PurchasePaymentDetailResource().export(rows)
- filename = utils.attachment_save(export_data)
- BizLog.objects.addnew(request.user, BizLog.EXPORT, u"导出付款管理明细")
- return JSONResponse({'filename': filename})
- @csrf_exempt
- @permission_required('purchase.pay_purchase_payment')
- def purchase_payment_pay(request):
- id = request.GET.get('id')
- data = json.loads(request.body)
- try:
- with transaction.atomic():
- payment = PurchasePayment.getById(id)
- if payment.apply_amount <= payment.actual_amount:
- raise CustomError(u'付款单已付款完毕')
- if not payment.ratify_time:
- raise CustomError(u'付款单未批准,禁止付款')
- if not payment.review_time:
- raise CustomError(u'付款单未复核,禁止付款')
- try:
- data['actual_amount'] = Formater.formatAmount(data['actual_amount'])
- except:
- raise CustomError(u'付款金额无效')
- if data['actual_amount'] <= 0:
- raise CustomError(u'付款金额应该大于零')
- data['main'] = payment.id
- pb = PurchasePaySerializer.factory(request.user, data)
- pb = pb.validSave()
- payment.updateActualAmount()
- payment.is_pay = True
- payment.save()
- BizLog.objects.addnew(
- request.user,
- BizLog.UPDATE,
- u"采购付款单[%s]付款,id=%d" % (payment.no, payment.id),
- )
- except CustomError, e:
- return JSONError(e.get_error_msg())
- except Exception, e:
- traceback.print_exc()
- return JSONError(u'保存失败')
- return JSONResponse({})
- @csrf_exempt
- @token_required
- def purchase_payment_pay_detail(request):
- id = request.GET.get('id')
- try:
- instances = PurchasePay.getByMainId(id)
- data = []
- for instance in instances:
- item = {
- 'id': instance.id,
- 'payment_type': instance.payment_type.name,
- 'payment_time': Formater.formatStrTime(instance.payment_time),
- 'actual_amount': Formater.formatAmountShowWithTwoDecimalPlaces(instance.actual_amount),
- 'payment_user_text': instance.payment_user.name,
- 'notes': instance.notes or ''
- }
- data.append(item)
- except CustomError, e:
- return JSONError(e.get_error_msg())
- except Exception, e:
- traceback.print_exc()
- return JSONError(u'没有付款记录')
- return JSONResponse(data)
- @csrf_exempt
- @permission_required('purchase.view_purchase_invoice')
- def purchase_invoice_list(request):
- invoice = request.GET.get('invoice')
- rows = PurchaseOrderDetail.objects.filter(main__status=PurchaseOrder.TAKE_EFFECT)
- department_ids = request.user.getSubDepartmentIds()
- user_ids = request.user.getSubEmployeeIds()
- rows = rows.filter(Q(main__create_user_id__in=user_ids) | Q(main__department_id__in=department_ids) | Q(main__create_user=request.user))
- if invoice == '0':
- rows = rows.filter(invoice_no__isnull=True)
- elif invoice == '1':
- rows = rows.filter(invoice_no__isnull=False)
- f = PurchaseOrderDetailFilter(request.GET, queryset=rows)
- total_row = f.qs.aggregate(sum_invoice_amount=Sum('invoice_amount'), sum_amount=Sum('amount'))
- more = {
- 'sum_amount': Formater.formatAmountShow(total_row['sum_amount']),
- 'sum_invoice_amount': Formater.formatAmountShow(total_row['sum_invoice_amount'])
- }
- rows, total = utils.get_page_data(request, f.qs)
- serializer = PurchaseOrderDetailSerializer(rows, many=True)
- return DataGridJSONResponse(serializer.data, total, more)
- @csrf_exempt
- @permission_required('purchase.export_purchase_invoice')
- def purchase_invoice_export(request):
- invoice = request.GET.get('invoice')
- rows = PurchaseOrderDetail.objects.filter(main__status=PurchaseOrder.TAKE_EFFECT)
- department_ids = request.user.getSubDepartmentIds()
- user_ids = request.user.getSubEmployeeIds()
- rows = rows.filter(Q(main__create_user_id__in=user_ids) | Q(main__department_id__in=department_ids) | Q(
- main__create_user=request.user))
- if invoice == '0':
- rows = rows.filter(invoice_no__isnull=True)
- elif invoice == '1':
- rows = rows.filter(invoice_no__isnull=False)
- f = PurchaseOrderDetailFilter(request.GET, queryset=rows)
- serializer = PurchaseOrderDetailSerializer(f.qs, many=True)
- export_data = ExportChange.dict_to_obj(serializer)
- export_data = PurchaseInvoiceResource().export(export_data)
- filename = utils.attachment_save(export_data)
- BizLog.objects.addnew(request.user, BizLog.EXPORT, u"导出发票管理")
- return JSONResponse({'filename': filename})
- @csrf_exempt
- @permission_required('purchase.add_purchase_invoice')
- def purchase_invoice_save(request):
- data = json.loads(request.body)
- try:
- with transaction.atomic():
- try:
- amount = Formater.formatAmount(data['invoice_amount'])
- except:
- raise CustomError(u'发票金额无效')
- items = data['items']
- for item in items:
- order = PurchaseOrderDetail.getById(item['id'])
- if order.check_status == settings.PASS:
- raise CustomError(u'合同[%s]中产品[%s]发票已审核' % (order.main.no, order.product.name))
- order.invoice_no = data['invoice_no']
- order.invoice_amount = amount
- order.invoice_date = data['invoice_date']
- order.create_user = request.user
- order.department = request.user.department
- order.create_time = timezone.now()
- order.save()
- BizLog.objects.addnew(
- request.user,
- BizLog.INSERT,
- u"录入发票[%s]" % data['invoice_no'],
- data
- )
- except CustomError, e:
- return JSONError(e.get_error_msg())
- except Exception, e:
- traceback.print_exc()
- return JSONError(u'保存失败')
- return JSONResponse({})
- @csrf_exempt
- @permission_required('purchase.check_purchase_invoice')
- def purchase_invoice_check(request):
- id = request.GET.get('id')
- status = int(request.GET.get('status'))
- try:
- with transaction.atomic():
- order = PurchaseOrderDetail.getById(id)
- if status == settings.PASS:
- if order.check_status == settings.PASS:
- raise CustomError(u'该单据已审核')
- if not order.invoice_no or order.invoice_no == '':
- raise CustomError(u'该单据尚未录入发票')
- order.check_status = settings.PASS
- order.check_user = request.user
- order.check_time = timezone.now()
- BizLog.objects.addnew(
- request.user,
- BizLog.CHECK,
- u"审核采购发票[%s],id=%d" % (order.main.no, order.id),
- )
- else:
- if order.check_status == settings.DEFAULT:
- raise CustomError(u'该单据尚未审核')
- order.check_status = settings.DEFAULT
- order.check_user = None
- order.check_time = None
- BizLog.objects.addnew(
- request.user,
- BizLog.CHECK,
- u"采购发票取消审核[%s],id=%d" % (order.main.no, order.id),
- )
- order.save()
- except CustomError, e:
- return JSONError(e.get_error_msg())
- except Exception, e:
- traceback.print_exc()
- return JSONError(u'审核失败')
- return JSONResponse({})
- @csrf_exempt
- @permission_required('purchase.add_purchase_invoice')
- def purchase_invoice_upload_image(request):
- ids = request.POST.get('ids')
- files = request.FILES.getlist('file')
- try:
- with transaction.atomic():
- ids = str(ids).split(',')
- from models import path_and_rename
- for id in ids:
- order = PurchaseOrderDetail.objects.filter(id=id).first()
- if not order:
- raise CustomError(u'未找到合同')
- if order.check_status == settings.PASS:
- raise CustomError(u'该合同已生效')
- for file in files:
- filename = "%s%d-%s.%s" % (
- path_and_rename.path,
- order.id,
- timezone.now().strftime('%Y%m%d%H%M%S%f'),
- file.name.split('.')[-1]
- )
- filename = filename.lower()
- full_filename = "%s/%s" % (settings.MEDIA_ROOT, filename)
- with open(full_filename, 'wb+') as destination:
- for chunk in file.chunks():
- destination.write(chunk)
- #utils.resize_image(full_filename, 800)
- PurchaseInvoiceImage.objects.create(order_detail=order, invoice_image=filename)
- except CustomError, e:
- return JSONError(e.get_error_msg())
- except Exception,e:
- traceback.print_exc()
- return JSONError(u'上传失败')
- return JSONResponse({})
- @csrf_exempt
- @token_required
- def purchase_invoice_images(request):
- id = request.GET.get('id')
- rows = PurchaseInvoiceImage.objects.filter(order_detail_id=int(id))
- rows, total = utils.get_page_data(request, rows)
- data = []
- for row in rows:
- item = {
- 'id': row.id,
- 'check_status': row.order_detail.check_status,
- 'order_detail_id': row.order_detail.id,
- 'image': unicode(row.invoice_image),
- 'image_name': str(row.invoice_image).split('/')[-1],
- 'image_url': row.invoice_image.url,
- }
- data.append(item)
- return DataGridJSONResponse(data, total)
- @csrf_exempt
- @permission_required('purchase.add_purchase_invoice')
- def purchase_invoice_del_image(request):
- id = request.GET.get('id')
- try:
- with transaction.atomic():
- img = PurchaseInvoiceImage.objects.filter(id=int(id)).first()
- if img.order_detail.check_status == settings.PASS:
- raise CustomError(u'该发票已审核, 不允许删除')
- img.delete()
- try:
- os.remove("%s/%s" % (settings.MEDIA_ROOT, img.invoice_image))
- except:
- pass
- except CustomError, e:
- return JSONError(e.get_error_msg())
- except:
- traceback.print_exc()
- return JSONError(u"删除失败")
- return JSONResponse({})
- @csrf_exempt
- @token_required
- def search_product(request):
- param = request.GET.get('param')
- type = request.GET.get('type')
- warehouse_id = request.GET.get('warehouse')
- rows = ProductBase.objects.filter(enabled=True, type__lt=ProductBase.GOODS)
- if type:
- rows = rows.filter(type=int(type))
- if param:
- rows = rows.filter(Q(name__icontains=param) | Q(model__icontains=param) | Q(code__icontains=param))
- rows, total = utils.get_page_data(request, rows)
- data = []
- for row in rows:
- record_data = []
- if warehouse_id:
- record_data = GetWarehouseSrockRecord.getRecord(row.id, warehouse_id)
- item = {
- 'id': row.id,
- 'name': row.name,
- 'model': row.model,
- 'unit': row.unit,
- 'standard': row.standard,
- 'warehouse_place': row.warehouse_place,
- 'type_text': row.get_type_display(),
- 'option_type_text': row.option_type and row.option_type.name or '',
- 'record_data': record_data
- }
- data.append(item)
- return JSONResponse({'data': data, 'total': total})
- @csrf_exempt
- @token_required
- def search_user(request):
- id = request.GET.get('id')
- purchase = PurchasePlan.getById(id)
- purchase_users = PurchaseUser.objects.filter(purchase=purchase)
- rows = User.objects.filter()
- data = []
- for row in rows:
- item = {
- 'id': row.id,
- 'name': row.name,
- 'department': row.department.name,
- 'check': 0,
- 'is_report': 0,
- 'name_dept': u"{}--{}".format(row.name,row.department.name),
- }
- for purchase_user in purchase_users:
- if purchase_user.purchase_user.id == row.id:
- item['check'] = 1
- is_report = PurchasePrice.objects.filter(purchase_user_id=row.id,purchase_detail__purchase=purchase,report=True).count()
- if is_report:
- item['is_report'] = 1
- break
- data.append(item)
- return JSONResponse(data)
- @csrf_exempt
- @token_required
- def search_price(request):
- rows = PurchasePrice.objects.filter(Q(supplier__isnull=False) & Q(purchase_user=request.user) & Q(report=False))
- data = []
- for row in rows:
- item = {
- 'id': row.id,
- 'name': row.purchase_detail.product.name,
- 'model': row.purchase_detail.product.model,
- 'price': Formater.formatPriceShow(row.price),
- 'supplier': row.supplier.name,
- 'notes': row.notes or '',
- }
- data.append(item)
- return JSONResponse(data)
- @token_required
- def godownentry_list(request):
- type = int(request.GET.get('type'))
- product_notes = request.GET.get('product_notes')
- try:
- valid_permission(request.user,GodownEntry.getPermissionByType(type, 'view'))
- except:
- return DataGridJSONResponse([], 0)
- warehouses_ids = Warehouse.getManagerWarehouses(request.user)
- department_ids = request.user.getSubDepartmentIds()
- user_ids = request.user.getSubEmployeeIds()
- rows = GodownEntry.objects.filter(product_type=type,warehouse_id__in=warehouses_ids)
- rows = rows.filter(Q(department_id__in=department_ids) | Q(create_user_id__in=user_ids) | Q(create_user=request.user))
- if product_notes:
- g_ids = rows.values_list('id')
- d_ids = GodownEntryDetail.objects.filter(main_id__in=g_ids, notes__icontains=product_notes).values_list('main_id')
- rows = rows.filter(id__in=d_ids)
- f = GodownEntryFilter(request.GET, queryset=rows)
- total_row = f.qs.aggregate(total_count=Sum('total_count'), total_amount=Sum('total_amount'))
- more = {
- 'total_count': Formater.formatCountShow(total_row['total_count']),
- 'total_amount': Formater.formatAmountShow(total_row['total_amount'])
- }
- rows, total = utils.get_page_data(request, f.qs)
- serializer = GodownEntrySerializer(rows, many=True)
- return DataGridJSONResponse(serializer.data, total, more)
- @csrf_exempt
- @token_required
- def godownentry_save(request):
- id = request.GET.get('id')
- main_data = json.loads(request.POST.get('main'))
- items_data = json.loads(request.POST.get('item'))
- try:
- type = GodownEntry.getValidType(request.GET.get('type'))
- main_data['product_type'] = type
- with transaction.atomic():
- serializer = GodownEntrySerializer.factory(request.user, main_data, id)
- if serializer.instance and serializer.instance.status == settings.PASS:
- raise CustomError(u'该入库单已审核,禁止修改!')
- serializer = serializer.validSave()
- valid_permission(request.user, serializer.getPermission('add'))
- # 简易流程:添加入库单,同时生成合同,自动审核合同。
- godownentry_process = Config.getValue('godownentry_process')
- if main_data.has_key('purchase_order') and main_data['purchase_order']:
- # 合同中点到货,会执行此接口。此时无论那种流程,都不应该在创建合同。
- godownentry_process = ''
- pb = None
- if godownentry_process == '1':
- order_data = {
- 'supplier':serializer.supplier.id,
- 'status':PurchaseOrder.TAKE_EFFECT,
- 'arrval':PurchaseOrder.ALL_ARRVAL,
- 'check_time':timezone.now(),
- 'check_user':request.user.id,
- 'count':0,
- 'amount':0,
- }
- pb = PurchaseOrderSerializer.factory(request.user, order_data)
- pb = pb.validSave()
- pb.no = pb.order_no
- serializer.purchase_order = pb
- serializer.save()
- GodownEntryDetail.objects.filter(main=serializer).delete()
- for item in items_data:
- item['main'] = serializer.id
- detail_serializer = GodownEntryDetailSerializer.factory(request.user, data=item)
- detail_serializer.validSave()
- if godownentry_process == '1':
- detail = detail_serializer.instance
- dict = {
- 'main':pb.id,
- 'product':detail.product_base.id,
- 'count':item['count'],
- 'price':item['price'],
- 'amount':detail.amount,
- 'is_arrval':True,
- }
- pbd = PurchaseOrderDetailSerializer.factory(request.user, dict)
- pbd.validSave()
- pbd.instance.arrval_count = detail.count
- pbd.instance.save()
- serializer.update_total()
- if pb:
- pb.count = serializer.total_count
- pb.amount = serializer.total_amount
- pb.apply_amount = serializer.total_amount
- pb.save()
- except CustomError, e:
- return JSONError(e.get_error_msg())
- except Exception, e:
- traceback.print_exc()
- return JSONError(u'保存失败!')
- return JSONResponse()
- @token_required
- def godownentry_delete(request):
- id = request.GET.get('id')
- try:
- with transaction.atomic():
- instance = GodownEntry.getById(id)
- valid_permission(request.user, instance.getPermission('delete'))
- if instance.status == settings.PASS:
- raise CustomError(u'该入库单已审核,禁止删除!')
- BizLog.objects.addnew(request.user, BizLog.DELETE, u"删除入库单[%s],id=%d" % (instance.no, instance.id))
- GodownEntryDetail.objects.filter(main=instance).delete()
- instance.delete()
- except CustomError, e:
- return JSONError(e.get_error_msg())
- except ProtectedError:
- return JSONError(u'该入库单已被引用,禁止删除!')
- except IntegrityError:
- return JSONError(u'该入库单已被引用,禁止删除!')
- except Exception, e:
- traceback.print_exc()
- return JSONError(u'删除失败!')
- return JSONResponse({})
- @token_required
- def godownentry_detail(request):
- id = request.GET.get('id')
- instance = GodownEntry.getById(id)
- company = instance.department.getCompany()
- if instance.status == settings.PASS:
- status_text = u'已审核'
- else:
- status_text = u'待审核'
- main_data = {
- 'id': instance.id,
- 'warehouse_id': instance.warehouse_id,
- 'warehouse_name': instance.warehouse.name,
- 'supplier_id': instance.supplier_id,
- 'supplier_name': instance.supplier.name,
- 'create_user_text': instance.create_user.name,
- 'status': instance.status,
- 'status_text': status_text,
- 'check_user_text': instance.check_user and instance.check_user.name or ' ',
- 'check_time': Formater.formatStrTime(instance.check_time),
- 'total_count': Formater.formatCountShow(instance.total_count),
- 'total_amount': Formater.formatAmountShow(instance.total_amount),
- 'create_time': Formater.formatStrTime(instance.create_time),
- 'notes': instance.notes or '',
- 'no': instance.no,
- 'company': company.name,
- 'purchase_order_no':instance.purchase_order and instance.purchase_order.no or ''
- }
- data = {
- 'main_data': main_data,
- 'items_data': []
- }
- detail_rows = GodownEntryDetail.objects.filter(main=instance)
- for detail_row in detail_rows:
- item_data = {
- 'id': detail_row.id,
- 'product_base_id': detail_row.product_base_id,
- 'product_base_name': detail_row.product_base.name,
- 'product_base_model': detail_row.product_base.model,
- 'price': Formater.formatPriceShow(detail_row.price),
- 'count': Formater.formatCountShow(detail_row.count),
- 'amount': Formater.formatAmountShow(detail_row.amount),
- 'invoice_amount': Formater.formatAmountShow(detail_row.invoice_amount),
- 'warehouse_place': detail_row.product_base.warehouse_place or '',
- 'unit':detail_row.product_base.unit or '',
- 'notes':detail_row.notes or ''
- }
- data['items_data'].append(item_data)
- return JSONResponse(data)
- @token_required
- def godownentry_export(request):
- try:
- type = GodownEntry.getValidType(request.GET.get('type'))
- warehouses_ids = Warehouse.getManagerWarehouses(request.user)
- department_ids = request.user.getSubDepartmentIds()
- user_ids = request.user.getSubEmployeeIds()
- rows = GodownEntry.objects.filter(product_type=type, warehouse_id__in=warehouses_ids)
- rows = rows.filter(
- Q(department_id__in=department_ids) | Q(create_user_id__in=user_ids) | Q(create_user=request.user))
- f = GodownEntryFilter(request.GET, queryset=rows)
- serializer = GodownEntrySerializer(f.qs, many=True)
- valid_permission(request.user, GodownEntry.getPermissionByType(type, 'export'))
- export_data = ExportChange.dict_to_obj(serializer)
- if type == GodownEntry.MATERIAL:
- perm = 'material.view_material_cost'
- elif type == GodownEntry.CONSUMABLE:
- perm = 'material.view_consumable_cost'
- is_show_cost = isHasPermissions(request.user, perm)
- export_data = GodownEntryResource(is_show_cost).export(export_data)
- filename = utils.attachment_save(export_data)
- BizLog.objects.addnew(request.user, BizLog.EXPORT, u"导出入库单" )
- except CustomError, e:
- return JSONError(e.get_error_msg())
- except Exception, e:
- traceback.print_exc()
- return JSONError(u'导出列表失败!')
- return JSONResponse({'filename': filename})
- @token_required
- def godownentry_export_detail(request):
- id = request.GET.get('id')
- instance = GodownEntry.getById(id)
- try:
- valid_permission(request.user, instance.getPermission('export'))
- godown_entry_detail = GodownEntryDetail.objects.filter(main=instance)
- serializer = GodownEntryDetailSerializer(godown_entry_detail, many=True)
- export_data = ExportChange.dict_to_obj(serializer)
- if instance.product_type == GodownEntry.MATERIAL:
- perm = 'material.view_material_cost'
- elif instance.product_type == GodownEntry.CONSUMABLE:
- perm = 'material.view_consumable_cost'
- is_show_cost = isHasPermissions(request.user, perm)
- export_data = GodownEntryDetailResource(is_show_cost).export(export_data)
- filename = utils.attachment_save(export_data)
- BizLog.objects.addnew(request.user, BizLog.EXPORT, u"导出入库单[%s]明细,id=%d" % (instance.no, instance.id))
- except CustomError, e:
- return JSONError(e.get_error_msg())
- except Exception, e:
- traceback.print_exc()
- return JSONError(u'导出明细失败!')
- return JSONResponse({'filename': filename})
- @csrf_exempt
- @token_required
- def godownentry_import(request):
- file = request.FILES.get('excel_file')
- main_data = json.loads(request.POST.get('main_data'))
- try:
- type = GodownEntry.getValidType(request.GET.get('type'))
- main_data['product_type'] = type
- valid_permission(request.user, GodownEntry.getPermissionByType(type, 'import'))
- line = 2
- importer = GodownEntryImporter()
- excel_rows = importer.getExcelData(file)
- with transaction.atomic():
- serializer = GodownEntrySerializer.factory(request.user, main_data)
- serializer = serializer.validSave()
- for excel_row in excel_rows:
- try:
- row = importer.validRow(excel_row)
- model = row[u'产品代码']
- product_base = ProductBase.objects.filter(model=model, type=type)
- if product_base.count() == 0:
- raise CustomError(u'产品代码不存在')
- elif product_base.count() > 1:
- raise CustomError(u'产品代码重复,前往基础数据设置修改')
- else:
- product_base = product_base.first()
- items_data = {}
- items_data['product_base'] = product_base.id
- items_data['main'] = serializer.id
- items_data['price'] = row[u'单价']
- items_data['count'] = row[u'数量']
- items_data['invoice_amount'] = row[u'发票金额']
- items_data['notes'] = row[u'备注']
- detail_serializer = GodownEntryDetailSerializer.factory(request.user, items_data)
- detail_serializer.validSave()
- except CustomError, e:
- raise CustomError(u'第%d行:%s' % (line, e.get_error_msg()))
- except Exception, e:
- raise CustomError(u'第%d行:%s' % (line, unicode(e)))
- line += 1
- serializer.update_total()
- BizLog.objects.addnew(request.user, BizLog.IMPORT, u"导入入库单[%s],id=%d" % (serializer.no, serializer.id))
- except CustomError, e:
- return JSONError(e.get_error_msg())
- except Exception, e:
- traceback.print_exc()
- return JSONError(u'导入失败!')
- return JSONResponse()
- @csrf_exempt
- @token_required
- def godownentry_senior_edit(request):
- def updateStock(product_base, warehouse):
- sum_row = WarehouseRecord.objects.filter(
- warehouse=warehouse,
- product=product_base
- ).aggregate(
- count=Sum('count'),
- amount=Sum('amount'),
- amount2=Sum('amount2')
- )
- warehouse_stock = WarehouseStock.objects.filter(product=product_base, warehouse=warehouse).first()
- if warehouse_stock:
- warehouse_stock.count = sum_row['count'] or 0
- warehouse_stock.amount = sum_row['amount'] or 0
- warehouse_stock.amount2 = sum_row['amount2'] or 0
- if warehouse_stock.count != 0:
- warehouse_stock.avg_cost_price = warehouse_stock.amount / warehouse_stock.count
- warehouse_stock.avg_cost_price2 = warehouse_stock.amount2 / warehouse_stock.count
- warehouse_stock.save()
- sum_row = WarehouseStock.objects.filter(
- product=product_base
- ).aggregate(
- count=Sum('count'),
- amount=Sum('amount'),
- amount2=Sum('amount2')
- )
- product_base.stock_count = sum_row['count'] or 0
- product_base.stock_amount = sum_row['amount'] or 0
- product_base.stock_amount2 = sum_row['amount2'] or 0
- if product_base.stock_count > 0:
- product_base.avg_cost_price = product_base.stock_amount / product_base.stock_count
- product_base.avg_cost_price2 = product_base.stock_amount2 / product_base.stock_count
- product_base.save()
- def updateWarehouseRecord(warehouse_record):
- sum_row = WarehouseRecordDetail.objects.filter(
- warehouse_record=warehouse_record
- ).aggregate(
- sum_amount=Sum(F('count') * F('warehouse_stock_record__entry_price')),
- sum_amount2=Sum(F('count') * F('warehouse_stock_record__entry_price2')),
- sum_count=Sum('count')
- )
- warehouse_record.amount = sum_row['sum_amount'] or 0
- warehouse_record.amount2 = sum_row['sum_amount2'] or 0
- warehouse_record.count = sum_row['sum_count'] or 0
- warehouse_record.save()
- def changeEntryPrice(entry_detail,entry_price,entry_price2):
- changeEntryPriceBase(entry_detail, entry_price, entry_price2)
- rows = WarehouseRecordDetail.objects.filter(warehouse_stock_record=entry_detail.stock_record)
- ck_type = (WarehouseRecord.CK_ZJ, WarehouseRecord.CK_XS,)
- pk_type = (WarehouseRecord.CK_PK,)
- tl_type = (WarehouseRecord.TL,)
- th_type = (WarehouseRecord.TH,)
- for row in rows:
- warehouse_record = row.warehouse_record
- updateWarehouseRecord(warehouse_record)
- if warehouse_record.type in ck_type:
- deliver_detail = DeliverDetail.objects.filter(warehouse_record=warehouse_record).first()
- if deliver_detail:
- #更新出库明细的合计成本
- deliver_detail.total_cost = warehouse_record.amount
- deliver_detail.save()
- # 更新出库单的合计成本
- order = deliver_detail.main
- sum_row = DeliverDetail.objects.filter(
- main=order
- ).aggregate(
- sum_cost=Sum('total_cost')
- )
- order.total_cost = sum_row['sum_cost'] or 0
- order.save()
- elif warehouse_record.type in tl_type:
- detail = DeliverReturnDetail.objects.filter(warehouse_record=warehouse_record).first()
- if detail:
- #更新退料明细的合计成本
- old_amount = detail.return_cost
- detail.return_cost = warehouse_record.amount
- detail.save()
- # 更新出库明细的退料合计成本
- new_amount = detail.return_cost
- detail.deliver_detail.return_cost += new_amount - old_amount
- detail.deliver_detail.save()
- #更新出库单的退料合计成本
- detail.deliver_detail.main.return_cost += new_amount - old_amount
- detail.deliver_detail.main.save()
- #更新退料单的合计成本
- order = detail.main
- sum_row = DeliverReturnDetail.objects.filter(
- main=order
- ).aggregate(
- sum_cost=Sum('return_cost')
- )
- order.return_cost = sum_row['sum_cost'] or 0
- order.save()
- elif warehouse_record.type in th_type:
- detail = GodownEntryReturnDetail.objects.filter(warehouse_record=warehouse_record).first()
- if detail:
- old_amount = detail.amount
- #更新退货明细的成本
- detail.amount = warehouse_record.amount
- detail.price = 0
- if detail.count:
- detail.price = detail.amount / detail.count
- detail.save()
- #更新入库明细的退货成本
- if detail.godownentry_detail:
- new_amount = detail.amount
- detail.godownentry_detail.return_amount += new_amount - old_amount
- detail.godownentry_detail.save()
- #更新入库单的退货成本
- detail.godownentry_detail.main.return_amount += new_amount - old_amount
- detail.godownentry_detail.main.save()
- #更新退货单的合计成本
- order = detail.main
- sum_row = GodownEntryReturnDetail.objects.filter(
- main=order
- ).aggregate(
- sum_cost=Sum('amount')
- )
- order.total_amount = sum_row['sum_cost'] or 0
- order.save()
- elif warehouse_record.type in pk_type:
- detail = InventoryDetail.objects.filter(warehouse_record=warehouse_record).first()
- if detail:
- #更新盘存明细
- detail.amount = warehouse_record.amount
- detail.price = 0
- if detail.count:
- detail.price = detail.amount / detail.count
- detail.save()
- # 更新盘存单
- order = detail.main
- sum_row = InventoryDetail.objects.filter(
- main=order
- ).aggregate(
- sum_amount=Sum('amount')
- )
- order.total_amount = sum_row['sum_amount'] or 0
- order.save()
- def changeEntryPriceBase(entry_detail,entry_price,entry_price2):
- entry_detail.price = entry_price
- entry_detail.amount = entry_detail.count * entry_price
- entry_detail.save()
- if entry_detail.stock_record:
- entry_detail.stock_record.entry_price = entry_price
- entry_detail.stock_record.entry_price2 = entry_price2
- entry_detail.stock_record.save()
- def changeSupplier(godownentry, new_supplier_id):
- new_supplier = Supplier.objects.filter(id=new_supplier_id).first()
- if not new_supplier:
- raise CustomError(u'未找到相应的供应商')
- godownentry.supplier = new_supplier
- godownentry.save()
- rows = GodownEntryDetail.objects.filter(main=godownentry)
- for row in rows:
- if not row.stock_record:
- continue
- row.stock_record.supplier = new_supplier
- row.stock_record.save()
- def changePrice(godownentry_detail,new_entry_price):
- changeEntryPrice(godownentry_detail, new_entry_price, new_entry_price)
- updateStock(godownentry_detail.product_base, godownentry_detail.main.warehouse)
- def addCount(godownentry_detail,add_count):
- godownentry_detail.count += add_count
- godownentry_detail.amount = godownentry_detail.count * godownentry_detail.price
- godownentry_detail.save()
- if godownentry_detail.stock_record:
- godownentry_detail.stock_record.entry_count += add_count
- godownentry_detail.stock_record.surplus_count += add_count
- godownentry_detail.stock_record.save()
- record_detail = WarehouseRecordDetail.objects.filter(
- warehouse_stock_record=godownentry_detail.stock_record,
- warehouse_record__type__in=(WarehouseRecord.RK_CG, WarehouseRecord.RK_ZJ)
- ).first()
- if record_detail:
- record_detail.count += add_count
- record_detail.save()
- updateWarehouseRecord(record_detail.warehouse_record)
- updateStock(godownentry_detail.product_base, godownentry_detail.main.warehouse)
- def decCount(godownentry_detail,red_count):
- godownentry_detail.count -= red_count
- godownentry_detail.amount = godownentry_detail.count * godownentry_detail.price
- godownentry_detail.save()
- if godownentry_detail.stock_record:
- if red_count > godownentry_detail.stock_record.surplus_count:
- raise CustomError(u'该入库单中的配件[%s],剩余%s,不能减少%s,请使用退货减少库存' % (
- godownentry_detail.product_base.name,
- Formater.formatCountShow(godownentry_detail.stock_record.surplus_count),
- Formater.formatCountShow(red_count)
- ))
- godownentry_detail.stock_record.entry_count -= red_count
- godownentry_detail.stock_record.surplus_count -= red_count
- godownentry_detail.stock_record.save()
- record_detail = WarehouseRecordDetail.objects.filter(
- warehouse_stock_record=godownentry_detail.stock_record,
- warehouse_record__type__in=(WarehouseRecord.RK_CG, WarehouseRecord.RK_ZJ)
- ).first()
- if record_detail:
- record_detail.count -= red_count
- record_detail.save()
- updateWarehouseRecord(record_detail.warehouse_record)
- updateStock(godownentry_detail.product_base, godownentry_detail.main.warehouse)
- main_data = json.loads(request.POST.get('main'))
- new_rows = json.loads(request.POST.get('item'))
- id = request.GET.get('id')
- new_supplier_id = main_data['supplier']
- try:
- new_supplier_id = int(new_supplier_id)
- except:
- return JSONError(u"无效的供应商!")
- try:
- with transaction.atomic():
- godownentry = GodownEntry.objects.filter(pk=int(id)).first()
- if not godownentry:
- raise CustomError(u'未找到相应的入库单')
- valid_permission(request.user, godownentry.getPermission('edit'))
- if godownentry.status != settings.PASS:
- raise CustomError(u'未通过审核的入库单不允许高级修改')
- if new_supplier_id != godownentry.supplier_id:
- changeSupplier(godownentry,new_supplier_id)
- for row in new_rows:
- new_entry_count = Formater.formatCount(row['new_count'])
- new_entry_price = Formater.formatPrice(row['new_price'])
- if new_entry_count < 0:
- raise CustomError(u'入库数量不能小于0')
- if new_entry_price < 0:
- raise CustomError(u'入库价不能小于0')
- detail = GodownEntryDetail.objects.filter(id=int(row['new_detail_id'])).first()
- if not detail:
- continue
- if detail.price != new_entry_price:
- changePrice(detail,new_entry_price)
- if detail.count < new_entry_count:
- addCount(detail,new_entry_count-detail.count)
- if detail.count > new_entry_count:
- decCount(detail, detail.count-new_entry_count)
- WarehouseRecord.updateCurStockByProduct(detail.main.warehouse_id,detail.product_base_id)
- count = 0
- amount = 0
- sum_row = GodownEntryDetail.objects.filter(main=godownentry).aggregate(
- count_sum=Sum('count'),
- amount_sum=Sum('amount')
- )
- if sum_row:
- count = sum_row['count_sum'] or 0
- amount = sum_row['amount_sum'] or 0
- godownentry.total_count = count
- godownentry.total_amount = amount
- godownentry.save()
- BizLog.objects.addnew(
- request.user,
- BizLog.UPDATE,
- u"原料高级修改[单号=%s],id=%d" % (godownentry.no, godownentry.id)
- )
- except CustomError, e:
- return JSONError(e.get_error_msg())
- except Exception, e:
- traceback.print_exc()
- return JSONError(u'修改失败')
- return JSONResponse({})
- @token_required
- def godownentry_check(request):
- id = request.GET.get('id')
- try:
- with transaction.atomic():
- instance = GodownEntry.getById(id)
- valid_permission(request.user, instance.getPermission('check'))
- if instance.status == settings.PASS:
- raise CustomError(u'该入库单已审核')
- godownentry_details = GodownEntryDetail.objects.filter(main=instance)
- for godownentry_detail in godownentry_details:
- if instance.purchase_order:
- type = WarehouseRecord.RK_CG
- else:
- type = WarehouseRecord.RK_ZJ
- stock_record = BizWarehouse.entry(type,
- godownentry_detail.product_base,
- instance.warehouse,
- instance.supplier,
- godownentry_detail.count,
- godownentry_detail.price,
- godownentry_detail.price)
- godownentry_detail.stock_record = stock_record
- godownentry_detail.save()
- # 更新产品入库最高价和最低价
- product = ProductBase.objects.filter(id=godownentry_detail.product_base_id).first()
- if product:
- if product.max_price < godownentry_detail.price:
- product.max_price = godownentry_detail.price
- if product.min_price > godownentry_detail.price:
- product.min_price = godownentry_detail.price
- if not product.min_price:
- product.min_price = godownentry_detail.price
- product.save()
- instance.status = settings.PASS
- instance.check_user = request.user
- instance.check_time = timezone.now()
- BizLog.objects.addnew(
- request.user,
- BizLog.CHECK,
- u"审核入库[%s],id=%d" % (instance.no, instance.id),
- )
- instance.save()
- if instance.purchase_order:
- instance.purchase_order.updateArrval()
- except CustomError, e:
- return JSONError(e.get_error_msg())
- except Exception, e:
- traceback.print_exc()
- return JSONError(u'审核失败')
- return JSONResponse({})
- @token_required
- def godownentry_query_list(request): # 原料耗材入库查询
- try:
- valid_permission(request.user, getPermissionByType(int(request.GET.get('type')), 'view'))
- except:
- return DataGridJSONResponse([], 0)
- rows = get_filter_data(request)
- total_row = rows.aggregate(godownentry_total_count=Sum('godown_entry_detail_ref_stock_record__count'),
- inventory_total_count=Sum('inventory_details_ref_warehouse_stock_record__count'),
- godownentry_total_return_count = Sum('godown_entry_detail_ref_stock_record__return_count'),
- inventory_total_return_count = Sum('inventory_details_ref_warehouse_stock_record__return_count'),
- godownentry_total_amount=Sum('godown_entry_detail_ref_stock_record__amount'),
- inventory_total_amount=Sum('inventory_details_ref_warehouse_stock_record__amount'),
- godownentry_total_deliver_count=Sum('godown_entry_detail_ref_stock_record__deliver_count'),
- inventory_total_deliver_count=Sum('inventory_details_ref_warehouse_stock_record__deliver_count'),
- total_surplus_count=Sum('surplus_count')
- )
- more = {
- 'total_count': Formater.formatCountShow((total_row['godownentry_total_count'] or 0) + (total_row['inventory_total_count'] or 0)),
- 'total_return_count': Formater.formatCountShow((total_row['godownentry_total_return_count'] or 0) + (total_row['inventory_total_return_count'] or 0)),
- 'total_amount': Formater.formatAmountShow((total_row['godownentry_total_amount'] or 0) + (total_row['inventory_total_amount'] or 0)),
- 'total_deliver_count': Formater.formatCountShow((total_row['godownentry_total_deliver_count'] or 0) + (total_row['inventory_total_deliver_count'] or 0)),
- 'total_surplus_count':Formater.formatCountShow(total_row['total_surplus_count'] or 0)
- }
- rows, total = utils.get_page_data(request, rows)
- data = get_godownentry_query_data(rows)
- return DataGridJSONResponse(data, total, more)
- @token_required
- def godownentry_query_export(request):
- type = int(request.GET.get('type'))
- try:
- valid_permission(request.user, getPermissionByType(type, 'export'))
- rows = get_filter_data(request)
- data = get_godownentry_query_data(rows)
- export_data = ExportChange.dict_to_obj2(data)
- if type == GodownEntry.MATERIAL:
- perm = 'material.view_material_cost'
- elif type == GodownEntry.CONSUMABLE:
- perm = 'material.view_consumable_cost'
- is_show_cost = isHasPermissions(request.user, perm)
- export_data = GodownEntryQueryResource(is_show_cost).export(export_data)
- filename = utils.attachment_save(export_data)
- BizLog.objects.addnew(request.user, BizLog.EXPORT, u"导出入库查询")
- except Exception, e:
- traceback.print_exc()
- return JSONError(u'导出入库查询失败!')
- return JSONResponse({'filename': filename})
- @token_required
- def godownentry_query_detail(request):
- rows = get_filter_data(request)
- data = get_godownentry_query_data(rows)
- return JSONResponse(data)
- def get_filter_data(request):
- product_type = int(request.GET.get('type'))
- check_time = request.GET.get('check_time')
- no = request.GET.get('no')
- supplier = request.GET.get('supplier')
- create_user = request.GET.get('create_user')
- product_text = request.GET.get('product_text')
- product_model = request.GET.get('product_model')
- warehouse = request.GET.get('warehouse')
- entry_type = request.GET.get('entry_type')
- notes = request.GET.get('notes')
- rows = WarehouseStockRecord.objects.filter(product__type=product_type,
- warehouse_record_detail_ref_stock_record__warehouse_record__type__in=[0,
- 1,
- 2]).order_by(
- '-id')
- if entry_type:
- rows = rows.filter(warehouse_record_detail_ref_stock_record__warehouse_record__type=int(entry_type))
- if product_text:
- rows = rows.filter(product__name__icontains=product_text)
- if product_model:
- rows = rows.filter(product__model__icontains=product_model)
- if warehouse:
- rows = rows.filter(warehouse__name__icontains=warehouse)
- if check_time:
- check_time_begin = check_time.split(' - ')[0]
- check_time_end = check_time.split(' - ')[1] + ' 23:59:59'
- rows = rows.filter(Q(Q(godown_entry_detail_ref_stock_record__main__check_time__gt=check_time_begin) &
- Q(godown_entry_detail_ref_stock_record__main__check_time__lt=check_time_end)) |
- Q(Q(inventory_details_ref_warehouse_stock_record__main__check_time__gt=check_time_begin) &
- Q(inventory_details_ref_warehouse_stock_record__main__check_time__lt=check_time_end)))
- if no:
- rows = rows.filter(Q(godown_entry_detail_ref_stock_record__main__no__icontains=no) |
- Q(inventory_details_ref_warehouse_stock_record__main__no__icontains=no))
- if notes:
- rows = rows.filter(Q(godown_entry_detail_ref_stock_record__notes__icontains=notes) |
- Q(inventory_details_ref_warehouse_stock_record__notes__icontains=notes))
- if supplier:
- rows = rows.filter(godown_entry_detail_ref_stock_record__main__supplier__name__icontains=supplier)
- if create_user:
- rows = rows.filter(
- Q(godown_entry_detail_ref_stock_record__main__create_user__name__icontains=create_user) |
- Q(inventory_details_ref_warehouse_stock_record__main__create_user__name__icontains=create_user))
- warehouses_ids = Warehouse.getManagerWarehouses(request.user)
- department_ids = request.user.getSubDepartmentIds()
- user_ids = request.user.getSubEmployeeIds()
- rows = rows.filter(warehouse_id__in=warehouses_ids)
- rows = rows.filter(Q(Q(inventory_details_ref_warehouse_stock_record__main__department_id__in=department_ids)
- | Q(inventory_details_ref_warehouse_stock_record__main__create_user_id__in=user_ids)
- | Q(inventory_details_ref_warehouse_stock_record__main__create_user=request.user))
- | Q(Q(godown_entry_detail_ref_stock_record__main__department_id__in=department_ids)
- | Q(godown_entry_detail_ref_stock_record__main__create_user_id__in=user_ids)
- | Q(godown_entry_detail_ref_stock_record__main__create_user=request.user)
- ))
- return rows
- def get_godownentry_query_data(rows):
- rows = rows.values(
- 'id',
- 'godown_entry_detail_ref_stock_record__main__supplier__name',
- 'godown_entry_detail_ref_stock_record__product_base__name',
- 'godown_entry_detail_ref_stock_record__product_base__model',
- 'godown_entry_detail_ref_stock_record__product_base__unit',
- 'godown_entry_detail_ref_stock_record__product_base__type',
- 'godown_entry_detail_ref_stock_record__product_base__warehouse_place',
- 'inventory_details_ref_warehouse_stock_record__product__name',
- 'inventory_details_ref_warehouse_stock_record__product__model',
- 'inventory_details_ref_warehouse_stock_record__product__unit',
- 'inventory_details_ref_warehouse_stock_record__product__type',
- 'inventory_details_ref_warehouse_stock_record__product__warehouse_place',
- 'warehouse__name',
- 'warehouse_record_detail_ref_stock_record__warehouse_record__type',
- 'godown_entry_detail_ref_stock_record__id',
- 'godown_entry_detail_ref_stock_record__price',
- 'godown_entry_detail_ref_stock_record__count',
- 'godown_entry_detail_ref_stock_record__return_count',
- 'godown_entry_detail_ref_stock_record__amount',
- 'godown_entry_detail_ref_stock_record__notes',
- 'godown_entry_detail_ref_stock_record__deliver_count',
- 'godown_entry_detail_ref_stock_record__main__create_user__name',
- 'godown_entry_detail_ref_stock_record__main__check_time',
- 'godown_entry_detail_ref_stock_record__main__no',
- 'inventory_details_ref_warehouse_stock_record__price',
- 'inventory_details_ref_warehouse_stock_record__count',
- 'inventory_details_ref_warehouse_stock_record__return_count',
- 'inventory_details_ref_warehouse_stock_record__amount',
- 'inventory_details_ref_warehouse_stock_record__notes',
- 'inventory_details_ref_warehouse_stock_record__deliver_count',
- 'inventory_details_ref_warehouse_stock_record__main__create_user__name',
- 'inventory_details_ref_warehouse_stock_record__main__check_time',
- 'inventory_details_ref_warehouse_stock_record__main__no',
- )
- data = []
- for row in rows:
- warehouse_record_type = WarehouseRecord.TYPE_CHOICES[row['warehouse_record_detail_ref_stock_record__warehouse_record__type']][1]
- if row['warehouse_record_detail_ref_stock_record__warehouse_record__type'] == WarehouseRecord.RK_PY:
- product_type_text = ProductBase.TYPE_CHOICES[row['inventory_details_ref_warehouse_stock_record__product__type']][1]
- surplus_count = row['inventory_details_ref_warehouse_stock_record__count'] - row['inventory_details_ref_warehouse_stock_record__return_count'] - row['inventory_details_ref_warehouse_stock_record__deliver_count']
- item = {
- 'id': row['id'],
- 'type': warehouse_record_type,
- 'product_type': product_type_text,
- 'supplier': '',
- 'product_name': row['inventory_details_ref_warehouse_stock_record__product__name'],
- 'product_model': row['inventory_details_ref_warehouse_stock_record__product__model'],
- 'product_unit': row['inventory_details_ref_warehouse_stock_record__product__unit'],
- 'warehouse_place': row['inventory_details_ref_warehouse_stock_record__product__warehouse_place'],
- 'warehouse': row['warehouse__name'],
- 'price': Formater.formatPriceShow(row['inventory_details_ref_warehouse_stock_record__price']),
- 'count': Formater.formatCountShow(row['inventory_details_ref_warehouse_stock_record__count']),
- 'return_count': Formater.formatCountShow(row['inventory_details_ref_warehouse_stock_record__return_count']),
- 'amount': Formater.formatAmountShow(row['inventory_details_ref_warehouse_stock_record__amount']),
- 'deliver_count': Formater.formatCountShow(row['inventory_details_ref_warehouse_stock_record__deliver_count']),
- 'surplus_count': Formater.formatCountShow(surplus_count),
- 'create_user': row['inventory_details_ref_warehouse_stock_record__main__create_user__name'],
- 'check_time': Formater.formatStrTime(row['inventory_details_ref_warehouse_stock_record__main__check_time']),
- 'notes': row['inventory_details_ref_warehouse_stock_record__notes'],
- 'no': row['inventory_details_ref_warehouse_stock_record__main__no'],
- 'is_PY': True # 是否是盘盈单
- }
- else:
- product_type_text = ProductBase.TYPE_CHOICES[row['godown_entry_detail_ref_stock_record__product_base__type']][1]
- surplus_count = row['godown_entry_detail_ref_stock_record__count'] - row['godown_entry_detail_ref_stock_record__return_count'] - row['godown_entry_detail_ref_stock_record__deliver_count']
- item = {
- 'id': row['id'],
- 'godownentry_detail_id': row['godown_entry_detail_ref_stock_record__id'],
- 'type': warehouse_record_type,
- 'product_type': product_type_text,
- 'supplier': row['godown_entry_detail_ref_stock_record__main__supplier__name'],
- 'product_name': row['godown_entry_detail_ref_stock_record__product_base__name'],
- 'product_model': row['godown_entry_detail_ref_stock_record__product_base__model'],
- 'product_unit': row['godown_entry_detail_ref_stock_record__product_base__unit'],
- 'warehouse_place': row['godown_entry_detail_ref_stock_record__product_base__warehouse_place'],
- 'warehouse': row['warehouse__name'],
- 'price': Formater.formatPriceShow(row['godown_entry_detail_ref_stock_record__price']),
- 'count': Formater.formatCountShow(row['godown_entry_detail_ref_stock_record__count']),
- 'return_count': Formater.formatCountShow(row['godown_entry_detail_ref_stock_record__return_count']),
- 'amount': Formater.formatAmountShow(row['godown_entry_detail_ref_stock_record__amount']),
- 'deliver_count': Formater.formatCountShow(row['godown_entry_detail_ref_stock_record__deliver_count']),
- 'surplus_count': Formater.formatCountShow(surplus_count),
- 'create_user': row['godown_entry_detail_ref_stock_record__main__create_user__name'],
- 'check_time': Formater.formatStrTime(row['godown_entry_detail_ref_stock_record__main__check_time']),
- 'notes': row['godown_entry_detail_ref_stock_record__notes'],
- 'no': row['godown_entry_detail_ref_stock_record__main__no'],
- 'is_PY': False
- }
- data.append(item)
- return data
- def getPermissionByType(type, action):
- permissions = {
- ProductBase.MATERIAL: {'view': 'purchase.view_material_godownentry_query',
- 'export': 'purchase.export_material_godownentry_query',
- },
- ProductBase.CONSUMABLE: {'view': 'purchase.view_consumable_godownentry_query',
- 'export': 'purchase.export_consumable_godownentry_query',
- }
- }
- return permissions[type][action]
- @token_required
- def godownentry_return_list(request):
- type = int(request.GET.get('type'))
- product_notes = request.GET.get('product_notes')
- try:
- valid_permission(request.user, GodownEntryReturn.getPermissionByType(type, 'view'))
- except:
- return DataGridJSONResponse([], 0)
- warehouses_ids = Warehouse.getManagerWarehouses(request.user)
- department_ids = request.user.getSubDepartmentIds()
- user_ids = request.user.getSubEmployeeIds()
- rows = GodownEntryReturn.objects.filter(type=type, warehouse_id__in=warehouses_ids)
- rows = rows.filter(
- Q(department_id__in=department_ids) | Q(create_user_id__in=user_ids) | Q(create_user=request.user))
- if product_notes:
- g_ids = rows.values_list('id')
- d_ids = GodownEntryReturnDetail.objects.filter(main_id__in=g_ids, notes__icontains=product_notes).values_list('main_id')
- rows = rows.filter(id__in=d_ids)
- f = GodownEntryReturnFilter(request.GET, queryset=rows)
- total_row = f.qs.aggregate(total_count=Sum('total_count'), total_amount=Sum('total_amount'))
- more = {
- 'total_count': Formater.formatCountShow(total_row['total_count']),
- 'total_amount': Formater.formatAmountShow(total_row['total_amount'])
- }
- rows, total = utils.get_page_data(request, f.qs)
- serializer = GodownEntryReturnSerializer(rows, many=True)
- return DataGridJSONResponse(serializer.data, total, more)
- @csrf_exempt
- @token_required
- def godownentry_return_save(request):
- id = request.GET.get('id')
- main_data = json.loads(request.POST.get('main'))
- items_data = json.loads(request.POST.get('item'))
- try:
- type = GodownEntryReturn.getValidType(request.GET.get('type'))
- main_data['type'] = type
- with transaction.atomic():
- serializer = GodownEntryReturnSerializer.factory(request.user, main_data, id)
- if serializer.instance and serializer.instance.status == settings.PASS:
- raise CustomError(u'该退货单已审核,禁止修改!')
- valid_permission(request.user, GodownEntryReturn.getPermissionByType(type, 'add'))
- serializer = serializer.validSave()
- GodownEntryReturnDetail.objects.filter(main=serializer).delete()
- for item in items_data:
- item['main'] = serializer.id
- item['amount'] = item['total_cost']
- detail_serializer = GodownEntryReturnDetailSerializer.factory(request.user, item)
- detail_serializer.validSave()
- serializer.update_total()
- except CustomError, e:
- return JSONError(e.get_error_msg())
- except Exception, e:
- traceback.print_exc()
- return JSONError(u'保存失败!')
- return JSONResponse()
- @token_required
- def godownentry_return_detail(request):
- id = request.GET.get('id')
- instance = GodownEntryReturn.getById(id)
- company = instance.department.getCompany()
- warehouse_id = instance.warehouse_id
- supplier_id = instance.supplier and instance.supplier_id or None
- if instance.status == settings.PASS:
- status_text = u'已审核'
- else:
- status_text = u'待审核'
- main_data = {
- 'id': instance.id,
- 'warehouse_id': warehouse_id,
- 'warehouse_name': instance.warehouse.name,
- 'supplier_id': supplier_id,
- 'supplier_name': instance.supplier and instance.supplier.name or '',
- 'create_user_name': instance.create_user.name,
- 'create_time': Formater.formatStrTime(instance.create_time),
- 'status': instance.status,
- 'status_text': status_text,
- 'check_user_text': instance.check_user and instance.check_user.name or ' ',
- 'check_time': Formater.formatStrTime(instance.create_time),
- 'total_count': Formater.formatCountShow(instance.total_count),
- 'total_amount': Formater.formatAmountShow(instance.total_amount),
- 'notes': instance.notes or '',
- 'no': instance.no,
- 'company': company.name
- }
- data = {
- 'main_data': main_data,
- 'items_data': []
- }
- detail_rows = GodownEntryReturnDetail.objects.filter(main=instance)
- for detail_row in detail_rows:
- is_godown = False
- godownentry_detail = None
- if detail_row.godownentry_detail:
- is_godown = True
- godownentry_detail = detail_row.godownentry_detail_id
- record_data = GetWarehouseSrockRecord.getRecord(detail_row.product_base_id, warehouse_id, supplier_id)
- item_data = {
- 'detail_id': detail_row.id,
- 'id': detail_row.id,
- 'product_base_id': detail_row.product_base_id,
- 'product_base_name': detail_row.product_base.name,
- 'product_base_model': detail_row.product_base.model,
- 'price': Formater.formatPriceShow(detail_row.price),
- 'count': Formater.formatCountShow(detail_row.count),
- 'amount': Formater.formatAmountShow(detail_row.amount),
- 'warehouse_place': detail_row.product_base.warehouse_place,
- 'unit':detail_row.product_base.unit or '',
- 'is_godown': is_godown,
- 'godownentry_detail': godownentry_detail,
- 'notes': detail_row.notes or '',
- 'entry_no': detail_row.godownentry_detail and detail_row.godownentry_detail.main.no or '',
- 'record_data':record_data
- }
- data['items_data'].append(item_data)
- return JSONResponse(data)
- @token_required
- def get_godownentry_detail_data(request):
- id = request.GET.get('id')
- godownentry_detail = GodownEntryDetail.getById(id)
- supplier_id = godownentry_detail.main.supplier_id or None
- warehouse_id = godownentry_detail.main.warehouse_id or None
- record_data = GetWarehouseSrockRecord.getRecord(godownentry_detail.product_base_id, warehouse_id, supplier_id)
- data = {
- 'main': {
- 'supplier': supplier_id,
- 'supplier_text': godownentry_detail.main.supplier.name or '',
- 'warehouse': warehouse_id,
- },
- 'items':[{
- 'product_base_id': godownentry_detail.product_base_id,
- 'product_base_name': godownentry_detail.product_base.name,
- 'product_base_model': godownentry_detail.product_base.model,
- 'unit': godownentry_detail.product_base.unit or '',
- 'count': Formater.formatCountShow(godownentry_detail.count),
- 'price': Formater.formatPriceShow(godownentry_detail.price),
- 'godownentry_detail_id': id,
- 'notes': godownentry_detail.notes or '',
- 'record_data':record_data
- }]
- }
- return JSONResponse(data)
- @token_required
- def godownentry_return_export(request):
- try:
- type = GodownEntryReturn.getValidType(request.GET.get('type'))
- warehouses_ids = Warehouse.getManagerWarehouses(request.user)
- department_ids = request.user.getSubDepartmentIds()
- user_ids = request.user.getSubEmployeeIds()
- rows = GodownEntryReturn.objects.filter(type=type, warehouse_id__in=warehouses_ids)
- rows = rows.filter(
- Q(department_id__in=department_ids) | Q(create_user_id__in=user_ids) | Q(create_user=request.user))
- f = GodownEntryReturnFilter(request.GET, queryset=rows)
- serializer = GodownEntryReturnSerializer(f.qs, many=True)
- valid_permission(request.user, GodownEntryReturn.getPermissionByType(type, 'export'))
- export_data = ExportChange.dict_to_obj(serializer)
- if type == GodownEntryReturn.MATERIAL:
- perm = 'material.view_material_cost'
- elif type == GodownEntryReturn.CONSUMABLE:
- perm = 'material.view_consumable_cost'
- is_show_cost = isHasPermissions(request.user, perm)
- export_data = GodownEntryReturnResource(is_show_cost).export(export_data)
- filename = utils.attachment_save(export_data)
- BizLog.objects.addnew(request.user, BizLog.EXPORT, u"导出退货单" )
- except CustomError, e:
- return JSONError(e.get_error_msg())
- except Exception, e:
- traceback.print_exc()
- return JSONError(u'导出列表失败!')
- return JSONResponse({'filename': filename})
- @token_required
- def godownentry_return_export_detail(request):
- id = request.GET.get('id')
- instance = GodownEntryReturn.getById(id)
- if instance.type == GodownEntryReturn.MATERIAL:
- perm = 'material.view_material_cost'
- elif instance.type == GodownEntryReturn.CONSUMABLE:
- perm = 'material.view_consumable_cost'
- is_show_cost = isHasPermissions(request.user, perm)
- try:
- valid_permission(request.user, instance.getPermission('export'))
- godown_entry_return_detail = GodownEntryReturnDetail.objects.filter(main=instance)
- serializer = GodownEntryReturnDetailSerializer(godown_entry_return_detail, many=True)
- export_data = ExportChange.dict_to_obj(serializer)
- export_data = GodownEntryReturnDetailResource(is_show_cost).export(export_data)
- filename = utils.attachment_save(export_data)
- BizLog.objects.addnew(request.user, BizLog.EXPORT, u"导出退货单[%s]明细,id=%d" % (instance.no, instance.id))
- except CustomError, e:
- return JSONError(e.get_error_msg())
- except Exception, e:
- traceback.print_exc()
- return JSONError(u'导出明细失败!')
- return JSONResponse({'filename': filename})
- @token_required
- def godownentry_return_check(request):
- id = request.GET.get('id')
- try:
- with transaction.atomic():
- instance = GodownEntryReturn.getById(id)
- valid_permission(request.user, instance.getPermission('check'))
- if instance.status == settings.PASS:
- raise CustomError(u'该退货单已审核!')
- godownentry_return_details = GodownEntryReturnDetail.objects.filter(main=instance)
- for return_detail in godownentry_return_details:
- if return_detail.godownentry_detail:
- warehouse_record = BizWarehouse.entryBack(return_detail.godownentry_detail.stock_record, return_detail.count)
- else:
- warehouse_record = BizWarehouse.entryBatchBack(return_detail.product_base, return_detail.main.warehouse, return_detail.count, return_detail.main.supplier)
- return_detail.warehouse_record = warehouse_record
- return_detail.amount = -warehouse_record.amount
- return_detail.price = return_detail.amount / return_detail.count
- return_detail.save()
- instance.status = settings.PASS
- instance.check_user = request.user
- instance.check_time = timezone.now()
- BizLog.objects.addnew(
- request.user,
- BizLog.CHECK,
- u"审核退货[%s],id=%d" % (instance.no, instance.id),
- )
- instance.update_total()
- instance.save()
- except CustomError, e:
- return JSONError(e.get_error_msg())
- except Exception, e:
- traceback.print_exc()
- return JSONError(u'审核失败')
- return JSONResponse({})
- @token_required
- def godownentry_return_delete(request):
- id = request.GET.get('id')
- try:
- with transaction.atomic():
- instance = GodownEntryReturn.getById(id)
- valid_permission(request.user, instance.getPermission('delete'))
- if instance.status == settings.PASS:
- raise CustomError(u'该退货单已审核,禁止删除!')
- BizLog.objects.addnew(request.user, BizLog.DELETE, u"删除退货单[%s],id=%d" % (instance.no, instance.id))
- GodownEntryReturnDetail.objects.filter(main=instance).delete()
- instance.delete()
- except CustomError, e:
- return JSONError(e.get_error_msg())
- except ProtectedError:
- return JSONError(u'该退货单已被引用,禁止删除!')
- except IntegrityError:
- return JSONError(u'该退货单已被引用,禁止删除!')
- except Exception, e:
- traceback.print_exc()
- return JSONError(u'删除失败!')
- return JSONResponse({})
- @token_required
- def godownentry_return_query_list(request):
- product_type = int(request.GET.get('type'))
- try:
- valid_permission(request.user, getReturnPermissionByType(product_type, 'view'))
- except:
- return DataGridJSONResponse([], 0)
- warehouses_ids = Warehouse.getManagerWarehouses(request.user)
- department_ids = request.user.getSubDepartmentIds()
- user_ids = request.user.getSubEmployeeIds()
- rows = GodownEntryReturnDetail.objects.filter(product_base__type=product_type, main__status=settings.PASS, main__warehouse_id__in=warehouses_ids)
- rows = rows.filter(
- Q(main__department_id__in=department_ids) | Q(main__create_user_id__in=user_ids) | Q(main__create_user=request.user))
- f = GodownEntryReturnDetailFilter(request.GET, queryset=rows)
- total_row = f.qs.aggregate(total_count=Sum('count'), total_amount=Sum('amount'))
- more = {
- 'total_count': Formater.formatCountShow(total_row['total_count']),
- 'total_amount': Formater.formatAmountShow(total_row['total_amount'])
- }
- rows, total = utils.get_page_data(request, f.qs)
- serializer = GodownEntryReturnDetailSerializer(rows, many=True)
- return DataGridJSONResponse(serializer.data, total, more)
- @token_required
- def godownentry_return_query_export(request):
- product_type = int(request.GET.get('type'))
- try:
- warehouses_ids = Warehouse.getManagerWarehouses(request.user)
- department_ids = request.user.getSubDepartmentIds()
- user_ids = request.user.getSubEmployeeIds()
- rows = GodownEntryReturnDetail.objects.filter(product_base__type=product_type, main__status=settings.PASS,
- main__warehouse_id__in=warehouses_ids)
- rows = rows.filter(
- Q(main__department_id__in=department_ids) | Q(main__create_user_id__in=user_ids) | Q(main__create_user=request.user))
- f = GodownEntryReturnDetailFilter(request.GET, queryset=rows)
- serializer = GodownEntryReturnDetailSerializer(f.qs, many=True)
- valid_permission(request.user, getReturnPermissionByType(product_type, 'export'))
- export_data = ExportChange.dict_to_obj(serializer)
- if product_type == ProductBase.MATERIAL:
- perm = 'material.view_material_cost'
- elif product_type == ProductBase.CONSUMABLE:
- perm = 'material.view_consumable_cost'
- is_show_cost = isHasPermissions(request.user, perm)
- export_data = GodownEntryReturnQueryResource(is_show_cost).export(export_data)
- filename = utils.attachment_save(export_data)
- BizLog.objects.addnew(request.user, BizLog.EXPORT, u"导出退货查询")
- except CustomError, e:
- return JSONError(e.get_error_msg())
- except Exception, e:
- traceback.print_exc()
- return JSONError(u'导出退货查询失败!')
- return JSONResponse({'filename': filename})
- @token_required
- def godownentry_return_query_detail(request):
- product_type = int(request.GET.get('type'))
- warehouses_ids = Warehouse.getManagerWarehouses(request.user)
- department_ids = request.user.getSubDepartmentIds()
- user_ids = request.user.getSubEmployeeIds()
- rows = GodownEntryReturnDetail.objects.filter(product_base__type=product_type, main__status=settings.PASS,
- main__warehouse_id__in=warehouses_ids)
- rows = rows.filter(
- Q(main__department_id__in=department_ids) | Q(main__create_user_id__in=user_ids) | Q(main__create_user=request.user))
- f = GodownEntryReturnDetailFilter(request.GET, queryset=rows)
- serializer = GodownEntryReturnDetailSerializer(f.qs, many=True)
- return JSONResponse(serializer.data)
- def getReturnPermissionByType(type, action):
- permissions = {
- ProductBase.MATERIAL: {'view': 'account.view_material_godownentry_return_query',
- 'export': 'account.export_material_godownentry_return_query',
- },
- ProductBase.CONSUMABLE: {'view': 'account.view_consumable_godownentry_return_query',
- 'export': 'account.export_consumable_godownentry_return_query',
- }
- }
- return permissions[type][action]
|