123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871 |
- # 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.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 = request.POST.get('order_amount')
- order_account = request.POST.get('order_account')
- try:
- with transaction.atomic():
- order = PurchaseOrder.getById(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.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):
- #todo 简易流程:添加入库单,同时生成合同,自动审核合同。
- 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'))
- 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()
- 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_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]
|