From abf6f8562e7c63ae3a521b59c7ef1c6e8e93246e Mon Sep 17 00:00:00 2001 From: abhijith Date: Mon, 30 Oct 2017 17:14:05 +0530 Subject: [PATCH 1/7] Edited Invoice GET so that Sales and Purchase Invoices separeted in View Invoice --- gkcore/views/api_invoice.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/gkcore/views/api_invoice.py b/gkcore/views/api_invoice.py index 3d45c35..7fc7966 100644 --- a/gkcore/views/api_invoice.py +++ b/gkcore/views/api_invoice.py @@ -489,6 +489,14 @@ The bills grid calld gkresult will return a list as it's value. result = self.con.execute(select([customerandsupplier.c.custname,customerandsupplier.c.csflag]).where(customerandsupplier.c.custid==row["custid"])) custname = result.fetchone() invoices.append({"invoiceno":row["invoiceno"], "invid":row["invid"],"custname":custname["custname"],"csflag":custname["csflag"],"invoicedate":datetime.strftime(row["invoicedate"],'%d-%m-%Y'),"invoicetotal":"%.2f"%float(row["invoicetotal"]), "attachmentcount":row["attachmentcount"]}) + if self.request.params.has_key('type'): + if str(self.request.params["type"]) == 'sale' and int(custname['csflag']) == 3: + invoices.append({"invoiceno":row["invoiceno"], "invid":row["invid"],"custname":custname["custname"],"csflag":custname["csflag"],"invoicedate":datetime.strftime(row["invoicedate"],'%d-%m-%Y'),"invoicetotal":"%.2f"%float(row["invoicetotal"]), "attachmentcount":row["attachmentcount"]}) + elif str(self.request.params["type"]) == 'purchase' and int(custname['csflag']) == 19: + invoices.append({"invoiceno":row["invoiceno"], "invid":row["invid"],"custname":custname["custname"],"csflag":custname["csflag"],"invoicedate":datetime.strftime(row["invoicedate"],'%d-%m-%Y'),"invoicetotal":"%.2f"%float(row["invoicetotal"]), "attachmentcount":row["attachmentcount"]}) + else: + invoices.append({"invoiceno":row["invoiceno"], "invid":row["invid"],"custname":custname["custname"],"csflag":custname["csflag"],"invoicedate":datetime.strftime(row["invoicedate"],'%d-%m-%Y'),"invoicetotal":"%.2f"%float(row["invoicetotal"]), "attachmentcount":row["attachmentcount"]}) + return {"gkstatus": gkcore.enumdict["Success"], "gkresult":invoices } except: return {"gkstatus":gkcore.enumdict["ConnectionFailed"]} -- GitLab From dfe811df44d5350cd0db880b8211010ddda2222a Mon Sep 17 00:00:00 2001 From: abhijith Date: Mon, 30 Oct 2017 20:02:58 +0530 Subject: [PATCH 2/7] Removed Try/Catch from api to get user godowns --- gkcore/views/api_godown.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gkcore/views/api_godown.py b/gkcore/views/api_godown.py index 57afc1a..6b67c78 100644 --- a/gkcore/views/api_godown.py +++ b/gkcore/views/api_godown.py @@ -216,13 +216,13 @@ class api_godown(object): if authDetails["auth"] == False: return {"gkstatus": gkcore.enumdict["UnauthorisedAccess"]} else: - #try: + try: self.con = eng.connect() result = getusergodowns(self.request.params["userid"]) return {"gkstatus": gkcore.enumdict["Success"], "gkresult":result["gkresult"]} - #except: + except: return {"gkstatus":gkcore.enumdict["ConnectionFailed"] } - #finally: + finally: self.con.close() -- GitLab From 78e4ab0a04d4e3dc2edaa251e8e9369ce191802e Mon Sep 17 00:00:00 2001 From: abhijith Date: Mon, 30 Oct 2017 20:19:35 +0530 Subject: [PATCH 3/7] Untabified API_Product --- gkcore/views/api_product.py | 782 ++++++++++++++++++------------------ 1 file changed, 391 insertions(+), 391 deletions(-) diff --git a/gkcore/views/api_product.py b/gkcore/views/api_product.py index edf2659..e5d0c78 100644 --- a/gkcore/views/api_product.py +++ b/gkcore/views/api_product.py @@ -50,394 +50,394 @@ from time import strftime, strptime @view_defaults(route_name='products') class api_product(object): - def __init__(self,request): - self.request = Request - self.request = request - self.con = Connection - - - - @view_config(request_method='GET', renderer ='json') - def getAllProducts(self): - try: - token = self.request.headers["gktoken"] - except: - return {"gkstatus": enumdict["UnauthorisedAccess"]} - authDetails = authCheck(token) - if authDetails["auth"]==False: - return {"gkstatus":enumdict["UnauthorisedAccess"]} - else: - try: - self.con=eng.connect() - userrole = getUserRole(authDetails["userid"]) - gorole = userrole["gkresult"] - if (gorole["userrole"]==3): - uId = getusergodowns(authDetails["userid"]) - gid=[] - for record1 in uId["gkresult"]: - gid.append(record1["goid"]) - productCodes=[] - for record2 in gid: - proCode = self.con.execute(select([gkdb.goprod.c.productcode]).where(gkdb.goprod.c.goid==record2)) - proCodes = proCode.fetchall() - for record3 in proCodes: - productCodes.append(record3["productcode"]) - results = [] - for record4 in productCodes: - result = self.con.execute(select([gkdb.product.c.productcode, gkdb.product.c.productdesc, gkdb.product.c.categorycode, gkdb.product.c.uomid,gkdb.product.c.gsflag]).where(and_(gkdb.product.c.orgcode==authDetails["orgcode"], gkdb.product.c.productcode==record4)).order_by(gkdb.product.c.productdesc)) - products = result.fetchone() - results.append(products) - else: - invdc = 9 - try: - invdc = int(self.request.params["invdc"]) - except: - invdc = 9 - if invdc == 4: - results = self.con.execute(select([gkdb.product.c.productcode,gkdb.product.c.gsflag ,gkdb.product.c.productdesc, gkdb.product.c.categorycode, gkdb.product.c.uomid]).where(and_(gkdb.product.c.orgcode==authDetails["orgcode"],gkdb.product.c.gsflag==7)).order_by(gkdb.product.c.productdesc)) - if invdc == 9: - results = self.con.execute(select([gkdb.product.c.productcode, gkdb.product.c.productdesc,gkdb.product.c.gsflag, gkdb.product.c.categorycode, gkdb.product.c.uomid]).where(gkdb.product.c.orgcode==authDetails["orgcode"]).order_by(gkdb.product.c.productdesc)) - - products = [] - srno=1 - for row in results: - unitsofmeasurement = self.con.execute(select([gkdb.unitofmeasurement.c.unitname]).where(gkdb.unitofmeasurement.c.uomid==row["uomid"])) - unitofmeasurement = unitsofmeasurement.fetchone() - if unitofmeasurement != None: - unitname = unitofmeasurement["unitname"] - else: - unitname = "" - if row["categorycode"]!=None: - categories = self.con.execute(select([gkdb.categorysubcategories.c.categoryname]).where(gkdb.categorysubcategories.c.categorycode==row["categorycode"])) - category = categories.fetchone() - categoryname = category["categoryname"] - else: - categoryname="" - if row["productcode"]!=None: - openingStockResult = self.con.execute(select([gkdb.product.c.openingstock]).where(gkdb.product.c.productcode == row["productcode"])) - osRow =openingStockResult.fetchone() - openingStock = osRow["openingstock"] - productstockin = self.con.execute(select([func.sum(gkdb.stock.c.qty).label("sumofins")]).where(and_(gkdb.stock.c.productcode==row["productcode"],gkdb.stock.c.inout==9))) - stockinsum = productstockin.fetchone() - if stockinsum["sumofins"]!=None: - openingStock = openingStock + stockinsum["sumofins"] - productstockout = self.con.execute(select([func.sum(gkdb.stock.c.qty).label("sumofouts")]).where(and_(gkdb.stock.c.productcode==row["productcode"],gkdb.stock.c.inout==15))) - stockoutsum = productstockout.fetchone() - if stockoutsum["sumofouts"]!=None: - openingStock = openingStock - stockoutsum["sumofouts"] - products.append({"srno":srno, "unitname":unitname, "categoryname":categoryname, "productcode": row["productcode"], "productdesc":row["productdesc"] , "categorycode": row["categorycode"], "productquantity": "%.2f"%float(openingStock),"gsflag":row["gsflag"]}) - srno = srno+1 - return {"gkstatus":enumdict["Success"], "gkresult":products} - except: - self.con.close() - return {"gkstatus":enumdict["ConnectionFailed"]} - finally: - self.con.close() - - - @view_config(request_param='qty=single', request_method='GET',renderer='json') - def getProduct(self): - try: - token = self.request.headers["gktoken"] - except: - return {"gkstatus": enumdict["UnauthorisedAccess"]} - authDetails = authCheck(token) - if authDetails["auth"]==False: - return {"gkstatus":enumdict["UnauthorisedAccess"]} - else: - try: - self.con = eng.connect() - result = self.con.execute(select([gkdb.product]).where(gkdb.product.c.productcode==self.request.params["productcode"])) - row = result.fetchone() - - productDetails={ "productcode":row["productcode"],"productdesc": row["productdesc"], "gsflag":row["gsflag"],"gscode":row["gscode"]} - if int(row["gsflag"]) == 7: - result1 = self.con.execute(select([gkdb.unitofmeasurement.c.unitname]).where(gkdb.unitofmeasurement.c.uomid==row["uomid"])) - unitrow= result1.fetchone() - productDetails["specs"] = row["specs"] - productDetails["categorycode"] = row["categorycode"] - productDetails["uomid"]=row["uomid"] - productDetails["gsflag"]=row["gsflag"] - productDetails["unitname"]=unitrow["unitname"] - productDetails["openingstock"]="%.2f"%float(row["openingstock"]) - godownswithstock = self.con.execute(select([func.count(gkdb.goprod.c.productcode).label("numberofgodowns")]).where(gkdb.goprod.c.productcode==self.request.params["productcode"])) - godowns = godownswithstock.fetchone() - numberofgodowns = godowns["numberofgodowns"] - return {"gkstatus":enumdict["Success"],"gkresult":productDetails,"numberofgodowns":"%d"%int(numberofgodowns)} - else: - return {"gkstatus":enumdict["Success"],"gkresult":productDetails} - except: - self.con.close() - return {"gkstatus":enumdict["ConnectionFailed"]} - finally: - self.con.close() - @view_config(request_method='GET',request_param='type=pt',renderer='json') - def getTaxForProduct(self): - """ - Purpose: returns either VAT or GST for a selected product based on product code and state. - description: - This function takes productcode,source and destination states, - (called source and destination as params). - Also takes taxflag. - The function makes calld to the global function calTax found in api_tax. - Will return a dictionary containing the tax name and rate. - Please refer calTax in api_tax for details. - """ - try: - token = self.request.headers["gktoken"] - except: - return {"gkstatus": enumdict["UnauthorisedAccess"]} - authDetails = authCheck(token) - if authDetails["auth"]==False: - return {"gkstatus":enumdict["UnauthorisedAccess"]} - else: - try: - self.con = eng.connect() - return calTax(int(self.request.params["taxflag"]),self.request.params["source"],self.request.params["destination"],int(self.request.params["productcode"]),self.con) - - except: - self.con.close() - return {"gkstatus":enumdict["ConnectionFailed"]} - finally: - self.con.close() - - - - - - @view_config(request_method='GET', request_param='by=category',renderer='json') - def getProductbyCategory(self): - try: - token = self.request.headers["gktoken"] - except: - return {"gkstatus": enumdict["UnauthorisedAccess"]} - authDetails = authCheck(token) - if authDetails["auth"]==False: - return {"gkstatus":enumdict["UnauthorisedAccess"]} - else: - try: - self.con = eng.connect() - if self.request.params["categorycode"] =="": - result = self.con.execute(select([gkdb.product.c.productcode,gkdb.product.c.productdesc]).where(gkdb.product.c.categorycode==None)) - else: - result = self.con.execute(select([gkdb.product.c.productcode,gkdb.product.c.productdesc]).where(gkdb.product.c.categorycode==self.request.params["categorycode"])) - prodlist = [] - for row in result: - productDetails={ "productcode":row["productcode"],"productdesc": row["productdesc"]} - prodlist.append(productDetails); - return {"gkstatus":enumdict["Success"],"gkresult":prodlist} - except: - self.con.close() - return {"gkstatus":enumdict["ConnectionFailed"]} - finally: - self.con.close() - - - @view_config(request_method='GET', request_param='by=godown',renderer='json') - def getProductbyGodown(self): - try: - token = self.request.headers["gktoken"] - except: - return {"gkstatus": enumdict["UnauthorisedAccess"]} - authDetails = authCheck(token) - if authDetails["auth"]==False: - return {"gkstatus":enumdict["UnauthorisedAccess"]} - else: - try: - self.con = eng.connect() - productcode = self.request.params["productcode"] - result = self.con.execute(select([goprod]).where(goprod.c.productcode == productcode)) - godowns = [] - for row in result: - goDownDetails = {"goid":row["goid"], "goopeningstock":"%.2f"%float(row["goopeningstock"]), "productcode":row["productcode"]} - godowns.append(goDownDetails) - return {"gkstatus":enumdict["Success"],"gkresult":godowns} - except: - self.con.close() - return {"gkstatus":enumdict["ConnectionFailed"]} - finally: - self.con.close() - - @view_config(request_method='GET', request_param='from=godown',renderer='json') - def getProductfromGodown(self): - try: - token = self.request.headers["gktoken"] - except: - return {"gkstatus": enumdict["UnauthorisedAccess"]} - authDetails = authCheck(token) - if authDetails["auth"]==False: - return {"gkstatus":enumdict["UnauthorisedAccess"]} - else: - try: - self.con = eng.connect() - goid = self.request.params["godownid"] - result = self.con.execute(select([gkdb.goprod.c.goprodid, gkdb.goprod.c.goopeningstock, gkdb.goprod.c.productcode]).where(and_(gkdb.goprod.c.goid== goid, gkdb.goprod.c.orgcode==authDetails["orgcode"]))) - products = [] - for row in result: - productDetails = {"goprodid":row["goprodid"], "goopeningstock":"%.2f"%float(row["goopeningstock"]), "productcode":row["productcode"]} - products.append(productDetails) - return {"gkstatus":enumdict["Success"],"gkresult":products} - except: - self.con.close() - return {"gkstatus":enumdict["ConnectionFailed"]} - finally: - self.con.close() - - - @view_config(request_method='POST',renderer='json') - def addProduct(self): - try: - token = self.request.headers["gktoken"] - except: - return {"gkstatus": enumdict["UnauthorisedAccess"]} - authDetails = authCheck(token) - if authDetails["auth"]==False: - return {"gkstatus":enumdict["UnauthorisedAccess"]} - else: - try: - self.con = eng.connect() - dataset = self.request.json_body - productDetails = dataset["productdetails"] - godownFlag = dataset["godownflag"] - productDetails["orgcode"] = authDetails["orgcode"] - if productDetails.has_key("categorycode")==False: - duplicateproduct = self.con.execute(select([func.count(gkdb.product.c.productcode).label("productcount")]).where(and_(gkdb.product.c.productdesc== productDetails["productdesc"],gkdb.product.c.categorycode==None,gkdb.product.c.orgcode==productDetails["orgcode"]))) - duplicateproductrow = duplicateproduct.fetchone() - if duplicateproductrow["productcount"]>0: - return {"gkstatus":enumdict["DuplicateEntry"]} - result = self.con.execute(gkdb.product.insert(),[productDetails]) - spec = productDetails["specs"] - for sp in spec.keys(): - self.con.execute("update categoryspecs set productcount = productcount +1 where spcode = %d"%(int(sp))) - if productDetails.has_key("categorycode")==False: - productDetails["categorycode"]=None - result = self.con.execute(select([gkdb.product.c.productcode]).where(and_(gkdb.product.c.productdesc==productDetails["productdesc"], gkdb.product.c.categorycode==productDetails["categorycode"],gkdb.product.c.orgcode==productDetails["orgcode"]))) - row = result.fetchone() - productCode = row["productcode"] - if godownFlag: - goDetails = dataset["godetails"] - ttlOpening = 0.00 - for g in goDetails.keys(): - ttlOpening = ttlOpening + float(goDetails[g]) - goro = {"productcode":productCode,"goid":g,"goopeningstock":goDetails[g],"orgcode":authDetails["orgcode"]} - self.con.execute(goprod.insert(),[goro]) - self.con.execute(product.update().where(and_(product.c.productcode == productCode,product.c.orgcode==authDetails["orgcode"])).values(openingstock = ttlOpening)) - - return {"gkstatus":enumdict["Success"],"gkresult":row["productcode"]} - - except exc.IntegrityError: - return {"gkstatus":enumdict["DuplicateEntry"]} - except: - return {"gkstatus":enumdict["ConnectionFailed"]} - finally: - self.con.close() - - ''' - Here product data is updated with new data input by the user while editing product. - If godowns have been created and godownwise opening stock has been entered for a product the record in "goprod" table is first deleted and fresh record is created. - If godownwise opening stock was not recorded while creating product it can be created here. - In this case a new record is created in "goprod" table. - ''' - @view_config(request_method='PUT', renderer='json') - def editProduct(self): - try: - token = self.request.headers["gktoken"] - except: - return {"gkstatus": enumdict["UnauthorisedAccess"]} - authDetails = authCheck(token) - if authDetails["auth"]==False: - return {"gkstatus":enumdict["UnauthorisedAccess"]} - else: - try: - self.con = eng.connect() - dataset = self.request.json_body - productDetails = dataset["productdetails"] - godownFlag = dataset["godownflag"] - productCode = productDetails["productcode"] - result = self.con.execute(gkdb.product.update().where(gkdb.product.c.productcode==productDetails["productcode"]).values(productDetails)) - if godownFlag: - goDetails = dataset["godetails"] - result = self.con.execute(gkdb.goprod.delete().where(and_(gkdb.goprod.c.productcode==productCode,gkdb.goprod.c.orgcode==authDetails["orgcode"]))) - ttlOpening = 0.0 - for g in goDetails.keys(): - ttlOpening = ttlOpening + float(goDetails[g]) - goro = {"productcode":productCode,"goid":g,"goopeningstock":goDetails[g],"orgcode":authDetails["orgcode"]} - self.con.execute(gkdb.goprod.insert(),[goro]) - self.con.execute(product.update().where(and_(product.c.productcode == productCode,product.c.orgcode==authDetails["orgcode"])).values(openingstock = ttlOpening)) - - return {"gkstatus":enumdict["Success"]} - except exc.IntegrityError: - return {"gkstatus":enumdict["DuplicateEntry"]} - except: - return {"gkstatus":enumdict["ConnectionFailed"]} - finally: - self.con.close() - - @view_config(request_method='DELETE', renderer ='json') - def deleteProduct(self): - try: - token = self.request.headers["gktoken"] - except: - return {"gkstatus": enumdict["UnauthorisedAccess"]} - authDetails = authCheck(token) - if authDetails["auth"]==False: - return {"gkstatus":enumdict["UnauthorisedAccess"]} - else: - try: - self.con = eng.connect() - dataset = self.request.json_body - result = self.con.execute(select([gkdb.product.c.specs]).where(gkdb.product.c.productcode==dataset["productcode"])) - row = result.fetchone() - spec = row["specs"] - for sp in spec.keys(): - self.con.execute("update categoryspecs set productcount = productcount -1 where spcode = %d"%(int(sp))) - result = self.con.execute(gkdb.product.delete().where(gkdb.product.c.productcode==dataset["productcode"])) - return {"gkstatus":enumdict["Success"]} - except exc.IntegrityError: - return {"gkstatus":enumdict["ActionDisallowed"]} - except: - return {"gkstatus":enumdict["ConnectionFailed"] } - finally: - self.con.close() - - @view_config(request_method='GET',request_param='tax=vatorgst',renderer='json') - def getvatorgst(self): - """ - Purpose: - To determine what kind of tax will be applible to the goods of corresponding organisation. - Description: - This function uses orgcode of organisation and will fetch it's financialStart and financialEnddate. - gstdate as "01/07/2017" is used which is compared with financialStart and financialEnd based on this gstorvatflag changes as following: - gstorvatflag=7 (means GST is applible) - gstorvatflag=22 (means VAT is applible) - gstorvatflag=29 (GST and VAT are applible) - """ - try: - token=self.request.headers["gktoken"] - except : - return {"gkstatus": enumdict["UnauthorisedAccess"]} - authDetails = authCheck(token) - if authDetails["auth"]==False: - return {"gkstatus":enumdict["UnauthorisedAccess"]} - else: - try: - self.con=eng.connect() - result = self.con.execute(select([gkdb.organisation.c.yearstart,gkdb.organisation.c.yearend]).where(gkdb.organisation.c.orgcode==authDetails["orgcode"])) - yearstartandend=result.fetchone() - gstorvatflag=29 - date1 = "2017-07-01" - gstdate = datetime.strptime(date1, "%Y-%m-%d") - financialStart = datetime.strptime(str(yearstartandend["yearstart"]), "%Y-%m-%d") - financialEnd = datetime.strptime(str(yearstartandend["yearend"]),"%Y-%m-%d") - - if (gstdate>financialStart and gstdate>financialEnd): - gstorvatflag=22 - elif(gstdate>financialStart and gstdate<=financialEnd) : - gstorvatflag=29 - elif(gstdate<=financialStart and gstdate<=financialEnd): - gstorvatflag=7 - return {"gkstatus":enumdict["Success"],"gkresult":str(gstorvatflag)} - except: - return {"gkstatus":enumdict["ConnectionFailed"] } - finally: - self.con.close() + def __init__(self,request): + self.request = Request + self.request = request + self.con = Connection + + + + @view_config(request_method='GET', renderer ='json') + def getAllProducts(self): + try: + token = self.request.headers["gktoken"] + except: + return {"gkstatus": enumdict["UnauthorisedAccess"]} + authDetails = authCheck(token) + if authDetails["auth"]==False: + return {"gkstatus":enumdict["UnauthorisedAccess"]} + else: + try: + self.con=eng.connect() + userrole = getUserRole(authDetails["userid"]) + gorole = userrole["gkresult"] + if (gorole["userrole"]==3): + uId = getusergodowns(authDetails["userid"]) + gid=[] + for record1 in uId["gkresult"]: + gid.append(record1["goid"]) + productCodes=[] + for record2 in gid: + proCode = self.con.execute(select([gkdb.goprod.c.productcode]).where(gkdb.goprod.c.goid==record2)) + proCodes = proCode.fetchall() + for record3 in proCodes: + productCodes.append(record3["productcode"]) + results = [] + for record4 in productCodes: + result = self.con.execute(select([gkdb.product.c.productcode, gkdb.product.c.productdesc, gkdb.product.c.categorycode, gkdb.product.c.uomid,gkdb.product.c.gsflag]).where(and_(gkdb.product.c.orgcode==authDetails["orgcode"], gkdb.product.c.productcode==record4)).order_by(gkdb.product.c.productdesc)) + products = result.fetchone() + results.append(products) + else: + invdc = 9 + try: + invdc = int(self.request.params["invdc"]) + except: + invdc = 9 + if invdc == 4: + results = self.con.execute(select([gkdb.product.c.productcode,gkdb.product.c.gsflag ,gkdb.product.c.productdesc, gkdb.product.c.categorycode, gkdb.product.c.uomid]).where(and_(gkdb.product.c.orgcode==authDetails["orgcode"],gkdb.product.c.gsflag==7)).order_by(gkdb.product.c.productdesc)) + if invdc == 9: + results = self.con.execute(select([gkdb.product.c.productcode, gkdb.product.c.productdesc,gkdb.product.c.gsflag, gkdb.product.c.categorycode, gkdb.product.c.uomid]).where(gkdb.product.c.orgcode==authDetails["orgcode"]).order_by(gkdb.product.c.productdesc)) + + products = [] + srno=1 + for row in results: + unitsofmeasurement = self.con.execute(select([gkdb.unitofmeasurement.c.unitname]).where(gkdb.unitofmeasurement.c.uomid==row["uomid"])) + unitofmeasurement = unitsofmeasurement.fetchone() + if unitofmeasurement != None: + unitname = unitofmeasurement["unitname"] + else: + unitname = "" + if row["categorycode"]!=None: + categories = self.con.execute(select([gkdb.categorysubcategories.c.categoryname]).where(gkdb.categorysubcategories.c.categorycode==row["categorycode"])) + category = categories.fetchone() + categoryname = category["categoryname"] + else: + categoryname="" + if row["productcode"]!=None: + openingStockResult = self.con.execute(select([gkdb.product.c.openingstock]).where(gkdb.product.c.productcode == row["productcode"])) + osRow =openingStockResult.fetchone() + openingStock = osRow["openingstock"] + productstockin = self.con.execute(select([func.sum(gkdb.stock.c.qty).label("sumofins")]).where(and_(gkdb.stock.c.productcode==row["productcode"],gkdb.stock.c.inout==9))) + stockinsum = productstockin.fetchone() + if stockinsum["sumofins"]!=None: + openingStock = openingStock + stockinsum["sumofins"] + productstockout = self.con.execute(select([func.sum(gkdb.stock.c.qty).label("sumofouts")]).where(and_(gkdb.stock.c.productcode==row["productcode"],gkdb.stock.c.inout==15))) + stockoutsum = productstockout.fetchone() + if stockoutsum["sumofouts"]!=None: + openingStock = openingStock - stockoutsum["sumofouts"] + products.append({"srno":srno, "unitname":unitname, "categoryname":categoryname, "productcode": row["productcode"], "productdesc":row["productdesc"] , "categorycode": row["categorycode"], "productquantity": "%.2f"%float(openingStock),"gsflag":row["gsflag"]}) + srno = srno+1 + return {"gkstatus":enumdict["Success"], "gkresult":products} + except: + self.con.close() + return {"gkstatus":enumdict["ConnectionFailed"]} + finally: + self.con.close() + + + @view_config(request_param='qty=single', request_method='GET',renderer='json') + def getProduct(self): + try: + token = self.request.headers["gktoken"] + except: + return {"gkstatus": enumdict["UnauthorisedAccess"]} + authDetails = authCheck(token) + if authDetails["auth"]==False: + return {"gkstatus":enumdict["UnauthorisedAccess"]} + else: + try: + self.con = eng.connect() + result = self.con.execute(select([gkdb.product]).where(gkdb.product.c.productcode==self.request.params["productcode"])) + row = result.fetchone() + + productDetails={ "productcode":row["productcode"],"productdesc": row["productdesc"], "gsflag":row["gsflag"],"gscode":row["gscode"]} + if int(row["gsflag"]) == 7: + result1 = self.con.execute(select([gkdb.unitofmeasurement.c.unitname]).where(gkdb.unitofmeasurement.c.uomid==row["uomid"])) + unitrow= result1.fetchone() + productDetails["specs"] = row["specs"] + productDetails["categorycode"] = row["categorycode"] + productDetails["uomid"]=row["uomid"] + productDetails["gsflag"]=row["gsflag"] + productDetails["unitname"]=unitrow["unitname"] + productDetails["openingstock"]="%.2f"%float(row["openingstock"]) + godownswithstock = self.con.execute(select([func.count(gkdb.goprod.c.productcode).label("numberofgodowns")]).where(gkdb.goprod.c.productcode==self.request.params["productcode"])) + godowns = godownswithstock.fetchone() + numberofgodowns = godowns["numberofgodowns"] + return {"gkstatus":enumdict["Success"],"gkresult":productDetails,"numberofgodowns":"%d"%int(numberofgodowns)} + else: + return {"gkstatus":enumdict["Success"],"gkresult":productDetails} + except: + self.con.close() + return {"gkstatus":enumdict["ConnectionFailed"]} + finally: + self.con.close() + @view_config(request_method='GET',request_param='type=pt',renderer='json') + def getTaxForProduct(self): + """ + Purpose: returns either VAT or GST for a selected product based on product code and state. + description: + This function takes productcode,source and destination states, + (called source and destination as params). + Also takes taxflag. + The function makes calld to the global function calTax found in api_tax. + Will return a dictionary containing the tax name and rate. + Please refer calTax in api_tax for details. + """ + try: + token = self.request.headers["gktoken"] + except: + return {"gkstatus": enumdict["UnauthorisedAccess"]} + authDetails = authCheck(token) + if authDetails["auth"]==False: + return {"gkstatus":enumdict["UnauthorisedAccess"]} + else: + try: + self.con = eng.connect() + return calTax(int(self.request.params["taxflag"]),self.request.params["source"],self.request.params["destination"],int(self.request.params["productcode"]),self.con) + + except: + self.con.close() + return {"gkstatus":enumdict["ConnectionFailed"]} + finally: + self.con.close() + + + + + + @view_config(request_method='GET', request_param='by=category',renderer='json') + def getProductbyCategory(self): + try: + token = self.request.headers["gktoken"] + except: + return {"gkstatus": enumdict["UnauthorisedAccess"]} + authDetails = authCheck(token) + if authDetails["auth"]==False: + return {"gkstatus":enumdict["UnauthorisedAccess"]} + else: + try: + self.con = eng.connect() + if self.request.params["categorycode"] =="": + result = self.con.execute(select([gkdb.product.c.productcode,gkdb.product.c.productdesc]).where(gkdb.product.c.categorycode==None)) + else: + result = self.con.execute(select([gkdb.product.c.productcode,gkdb.product.c.productdesc]).where(gkdb.product.c.categorycode==self.request.params["categorycode"])) + prodlist = [] + for row in result: + productDetails={ "productcode":row["productcode"],"productdesc": row["productdesc"]} + prodlist.append(productDetails); + return {"gkstatus":enumdict["Success"],"gkresult":prodlist} + except: + self.con.close() + return {"gkstatus":enumdict["ConnectionFailed"]} + finally: + self.con.close() + + + @view_config(request_method='GET', request_param='by=godown',renderer='json') + def getProductbyGodown(self): + try: + token = self.request.headers["gktoken"] + except: + return {"gkstatus": enumdict["UnauthorisedAccess"]} + authDetails = authCheck(token) + if authDetails["auth"]==False: + return {"gkstatus":enumdict["UnauthorisedAccess"]} + else: + try: + self.con = eng.connect() + productcode = self.request.params["productcode"] + result = self.con.execute(select([goprod]).where(goprod.c.productcode == productcode)) + godowns = [] + for row in result: + goDownDetails = {"goid":row["goid"], "goopeningstock":"%.2f"%float(row["goopeningstock"]), "productcode":row["productcode"]} + godowns.append(goDownDetails) + return {"gkstatus":enumdict["Success"],"gkresult":godowns} + except: + self.con.close() + return {"gkstatus":enumdict["ConnectionFailed"]} + finally: + self.con.close() + + @view_config(request_method='GET', request_param='from=godown',renderer='json') + def getProductfromGodown(self): + try: + token = self.request.headers["gktoken"] + except: + return {"gkstatus": enumdict["UnauthorisedAccess"]} + authDetails = authCheck(token) + if authDetails["auth"]==False: + return {"gkstatus":enumdict["UnauthorisedAccess"]} + else: + try: + self.con = eng.connect() + goid = self.request.params["godownid"] + result = self.con.execute(select([gkdb.goprod.c.goprodid, gkdb.goprod.c.goopeningstock, gkdb.goprod.c.productcode]).where(and_(gkdb.goprod.c.goid== goid, gkdb.goprod.c.orgcode==authDetails["orgcode"]))) + products = [] + for row in result: + productDetails = {"goprodid":row["goprodid"], "goopeningstock":"%.2f"%float(row["goopeningstock"]), "productcode":row["productcode"]} + products.append(productDetails) + return {"gkstatus":enumdict["Success"],"gkresult":products} + except: + self.con.close() + return {"gkstatus":enumdict["ConnectionFailed"]} + finally: + self.con.close() + + + @view_config(request_method='POST',renderer='json') + def addProduct(self): + try: + token = self.request.headers["gktoken"] + except: + return {"gkstatus": enumdict["UnauthorisedAccess"]} + authDetails = authCheck(token) + if authDetails["auth"]==False: + return {"gkstatus":enumdict["UnauthorisedAccess"]} + else: + try: + self.con = eng.connect() + dataset = self.request.json_body + productDetails = dataset["productdetails"] + godownFlag = dataset["godownflag"] + productDetails["orgcode"] = authDetails["orgcode"] + if productDetails.has_key("categorycode")==False: + duplicateproduct = self.con.execute(select([func.count(gkdb.product.c.productcode).label("productcount")]).where(and_(gkdb.product.c.productdesc== productDetails["productdesc"],gkdb.product.c.categorycode==None,gkdb.product.c.orgcode==productDetails["orgcode"]))) + duplicateproductrow = duplicateproduct.fetchone() + if duplicateproductrow["productcount"]>0: + return {"gkstatus":enumdict["DuplicateEntry"]} + result = self.con.execute(gkdb.product.insert(),[productDetails]) + spec = productDetails["specs"] + for sp in spec.keys(): + self.con.execute("update categoryspecs set productcount = productcount +1 where spcode = %d"%(int(sp))) + if productDetails.has_key("categorycode")==False: + productDetails["categorycode"]=None + result = self.con.execute(select([gkdb.product.c.productcode]).where(and_(gkdb.product.c.productdesc==productDetails["productdesc"], gkdb.product.c.categorycode==productDetails["categorycode"],gkdb.product.c.orgcode==productDetails["orgcode"]))) + row = result.fetchone() + productCode = row["productcode"] + if godownFlag: + goDetails = dataset["godetails"] + ttlOpening = 0.00 + for g in goDetails.keys(): + ttlOpening = ttlOpening + float(goDetails[g]) + goro = {"productcode":productCode,"goid":g,"goopeningstock":goDetails[g],"orgcode":authDetails["orgcode"]} + self.con.execute(goprod.insert(),[goro]) + self.con.execute(product.update().where(and_(product.c.productcode == productCode,product.c.orgcode==authDetails["orgcode"])).values(openingstock = ttlOpening)) + + return {"gkstatus":enumdict["Success"],"gkresult":row["productcode"]} + + except exc.IntegrityError: + return {"gkstatus":enumdict["DuplicateEntry"]} + except: + return {"gkstatus":enumdict["ConnectionFailed"]} + finally: + self.con.close() + + ''' + Here product data is updated with new data input by the user while editing product. + If godowns have been created and godownwise opening stock has been entered for a product the record in "goprod" table is first deleted and fresh record is created. + If godownwise opening stock was not recorded while creating product it can be created here. + In this case a new record is created in "goprod" table. + ''' + @view_config(request_method='PUT', renderer='json') + def editProduct(self): + try: + token = self.request.headers["gktoken"] + except: + return {"gkstatus": enumdict["UnauthorisedAccess"]} + authDetails = authCheck(token) + if authDetails["auth"]==False: + return {"gkstatus":enumdict["UnauthorisedAccess"]} + else: + try: + self.con = eng.connect() + dataset = self.request.json_body + productDetails = dataset["productdetails"] + godownFlag = dataset["godownflag"] + productCode = productDetails["productcode"] + result = self.con.execute(gkdb.product.update().where(gkdb.product.c.productcode==productDetails["productcode"]).values(productDetails)) + if godownFlag: + goDetails = dataset["godetails"] + result = self.con.execute(gkdb.goprod.delete().where(and_(gkdb.goprod.c.productcode==productCode,gkdb.goprod.c.orgcode==authDetails["orgcode"]))) + ttlOpening = 0.0 + for g in goDetails.keys(): + ttlOpening = ttlOpening + float(goDetails[g]) + goro = {"productcode":productCode,"goid":g,"goopeningstock":goDetails[g],"orgcode":authDetails["orgcode"]} + self.con.execute(gkdb.goprod.insert(),[goro]) + self.con.execute(product.update().where(and_(product.c.productcode == productCode,product.c.orgcode==authDetails["orgcode"])).values(openingstock = ttlOpening)) + + return {"gkstatus":enumdict["Success"]} + except exc.IntegrityError: + return {"gkstatus":enumdict["DuplicateEntry"]} + except: + return {"gkstatus":enumdict["ConnectionFailed"]} + finally: + self.con.close() + + @view_config(request_method='DELETE', renderer ='json') + def deleteProduct(self): + try: + token = self.request.headers["gktoken"] + except: + return {"gkstatus": enumdict["UnauthorisedAccess"]} + authDetails = authCheck(token) + if authDetails["auth"]==False: + return {"gkstatus":enumdict["UnauthorisedAccess"]} + else: + try: + self.con = eng.connect() + dataset = self.request.json_body + result = self.con.execute(select([gkdb.product.c.specs]).where(gkdb.product.c.productcode==dataset["productcode"])) + row = result.fetchone() + spec = row["specs"] + for sp in spec.keys(): + self.con.execute("update categoryspecs set productcount = productcount -1 where spcode = %d"%(int(sp))) + result = self.con.execute(gkdb.product.delete().where(gkdb.product.c.productcode==dataset["productcode"])) + return {"gkstatus":enumdict["Success"]} + except exc.IntegrityError: + return {"gkstatus":enumdict["ActionDisallowed"]} + except: + return {"gkstatus":enumdict["ConnectionFailed"] } + finally: + self.con.close() + + @view_config(request_method='GET',request_param='tax=vatorgst',renderer='json') + def getvatorgst(self): + """ + Purpose: + To determine what kind of tax will be applible to the goods of corresponding organisation. + Description: + This function uses orgcode of organisation and will fetch it's financialStart and financialEnddate. + gstdate as "01/07/2017" is used which is compared with financialStart and financialEnd based on this gstorvatflag changes as following: + gstorvatflag=7 (means GST is applible) + gstorvatflag=22 (means VAT is applible) + gstorvatflag=29 (GST and VAT are applible) + """ + try: + token=self.request.headers["gktoken"] + except : + return {"gkstatus": enumdict["UnauthorisedAccess"]} + authDetails = authCheck(token) + if authDetails["auth"]==False: + return {"gkstatus":enumdict["UnauthorisedAccess"]} + else: + try: + self.con=eng.connect() + result = self.con.execute(select([gkdb.organisation.c.yearstart,gkdb.organisation.c.yearend]).where(gkdb.organisation.c.orgcode==authDetails["orgcode"])) + yearstartandend=result.fetchone() + gstorvatflag=29 + date1 = "2017-07-01" + gstdate = datetime.strptime(date1, "%Y-%m-%d") + financialStart = datetime.strptime(str(yearstartandend["yearstart"]), "%Y-%m-%d") + financialEnd = datetime.strptime(str(yearstartandend["yearend"]),"%Y-%m-%d") + + if (gstdate>financialStart and gstdate>financialEnd): + gstorvatflag=22 + elif(gstdate>financialStart and gstdate<=financialEnd) : + gstorvatflag=29 + elif(gstdate<=financialStart and gstdate<=financialEnd): + gstorvatflag=7 + return {"gkstatus":enumdict["Success"],"gkresult":str(gstorvatflag)} + except: + return {"gkstatus":enumdict["ConnectionFailed"] } + finally: + self.con.close() -- GitLab From 3a60afa1be089de9e855b8dfa464ff83ae971be7 Mon Sep 17 00:00:00 2001 From: abhijith Date: Tue, 31 Oct 2017 12:39:12 +0530 Subject: [PATCH 4/7] In case of godown keeper number of godowns in Product GET considers only the godowns assigned to godown keeper --- gkcore/views/api_product.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/gkcore/views/api_product.py b/gkcore/views/api_product.py index e5d0c78..bf2e8f1 100644 --- a/gkcore/views/api_product.py +++ b/gkcore/views/api_product.py @@ -160,9 +160,19 @@ class api_product(object): productDetails["gsflag"]=row["gsflag"] productDetails["unitname"]=unitrow["unitname"] productDetails["openingstock"]="%.2f"%float(row["openingstock"]) - godownswithstock = self.con.execute(select([func.count(gkdb.goprod.c.productcode).label("numberofgodowns")]).where(gkdb.goprod.c.productcode==self.request.params["productcode"])) - godowns = godownswithstock.fetchone() - numberofgodowns = godowns["numberofgodowns"] + userrole = getUserRole(authDetails["userid"]) + if int(userrole["gkresult"]["userrole"]) != 3: + godownswithstock = self.con.execute(select([func.count(gkdb.goprod.c.productcode).label("numberofgodowns")]).where(gkdb.goprod.c.productcode==self.request.params["productcode"])) + godowns = godownswithstock.fetchone() + numberofgodowns = godowns["numberofgodowns"] + else: + usergodowmns = getusergodowns(authDetails["userid"]) + numberofgodowns = 0 + for usergodown in usergodowmns["gkresult"]: + godownswithstock = self.con.execute(select([gkdb.goprod.c.goid]).where(and_(gkdb.goprod.c.productcode==self.request.params["productcode"], gkdb.goprod.c.goid==usergodown["goid"]))) + usergodownwithstock = godownswithstock.fetchone() + if usergodownwithstock['goid']: + numberofgodowns = numberofgodowns + 1 return {"gkstatus":enumdict["Success"],"gkresult":productDetails,"numberofgodowns":"%d"%int(numberofgodowns)} else: return {"gkstatus":enumdict["Success"],"gkresult":productDetails} -- GitLab From 47736a31cfd91732302d9f5c2f83e982a65732e1 Mon Sep 17 00:00:00 2001 From: abhijith Date: Tue, 31 Oct 2017 12:57:01 +0530 Subject: [PATCH 5/7] Added try/catch in Product GET --- gkcore/views/api_product.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/gkcore/views/api_product.py b/gkcore/views/api_product.py index bf2e8f1..2a87548 100644 --- a/gkcore/views/api_product.py +++ b/gkcore/views/api_product.py @@ -171,8 +171,11 @@ class api_product(object): for usergodown in usergodowmns["gkresult"]: godownswithstock = self.con.execute(select([gkdb.goprod.c.goid]).where(and_(gkdb.goprod.c.productcode==self.request.params["productcode"], gkdb.goprod.c.goid==usergodown["goid"]))) usergodownwithstock = godownswithstock.fetchone() - if usergodownwithstock['goid']: - numberofgodowns = numberofgodowns + 1 + try: + if usergodownwithstock['goid']: + numberofgodowns = numberofgodowns + 1 + except: + continue return {"gkstatus":enumdict["Success"],"gkresult":productDetails,"numberofgodowns":"%d"%int(numberofgodowns)} else: return {"gkstatus":enumdict["Success"],"gkresult":productDetails} -- GitLab From bdad4e5d28fc4be13df13df2bb5409e2925e5569 Mon Sep 17 00:00:00 2001 From: abhijith Date: Tue, 31 Oct 2017 17:28:46 +0530 Subject: [PATCH 6/7] Considered godown keeper's godowns in getProductByGodown --- gkcore/views/api_product.py | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/gkcore/views/api_product.py b/gkcore/views/api_product.py index 2a87548..e0ec1e0 100644 --- a/gkcore/views/api_product.py +++ b/gkcore/views/api_product.py @@ -259,11 +259,24 @@ class api_product(object): try: self.con = eng.connect() productcode = self.request.params["productcode"] - result = self.con.execute(select([goprod]).where(goprod.c.productcode == productcode)) - godowns = [] - for row in result: - goDownDetails = {"goid":row["goid"], "goopeningstock":"%.2f"%float(row["goopeningstock"]), "productcode":row["productcode"]} - godowns.append(goDownDetails) + userrole = getUserRole(authDetails["userid"]) + if int(userrole["gkresult"]["userrole"]) != 3: + result = self.con.execute(select([goprod]).where(goprod.c.productcode == productcode)) + godowns = [] + for row in result: + goDownDetails = {"goid":row["goid"], "goopeningstock":"%.2f"%float(row["goopeningstock"]), "productcode":row["productcode"]} + godowns.append(goDownDetails) + else: + usergodowns = getusergodowns(authDetails["userid"]) + godowns = [] + for usergodown in usergodowns["gkresult"]: + thisgodown = self.con.execute(select([goprod]).where(and_(goprod.c.productcode == productcode, goprod.c.goid == usergodown["goid"]))) + thisgodown = thisgodown.fetchone() + try: + goDownDetails = {"goid":thisgodown["goid"], "goopeningstock":"%.2f"%float(thisgodown["goopeningstock"]), "productcode":thisgodown["productcode"]} + godowns.append(goDownDetails) + except: + continue return {"gkstatus":enumdict["Success"],"gkresult":godowns} except: self.con.close() -- GitLab From 2e74485be60b27c39dc4735e507f7e4455bcae44 Mon Sep 17 00:00:00 2001 From: abhijith Date: Tue, 31 Oct 2017 18:56:40 +0530 Subject: [PATCH 7/7] Changed some variables --- gkcore/views/api_invoice.py | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/gkcore/views/api_invoice.py b/gkcore/views/api_invoice.py index 7fc7966..28c3f06 100644 --- a/gkcore/views/api_invoice.py +++ b/gkcore/views/api_invoice.py @@ -486,16 +486,15 @@ The bills grid calld gkresult will return a list as it's value. result = self.con.execute(select([invoice.c.invoiceno,invoice.c.invid,invoice.c.invoicedate,invoice.c.custid,invoice.c.invoicetotal,invoice.c.attachmentcount]).where(and_(invoice.c.orgcode==authDetails["orgcode"],invoice.c.icflag==9)).order_by(invoice.c.invoicedate)) invoices = [] for row in result: - result = self.con.execute(select([customerandsupplier.c.custname,customerandsupplier.c.csflag]).where(customerandsupplier.c.custid==row["custid"])) - custname = result.fetchone() - invoices.append({"invoiceno":row["invoiceno"], "invid":row["invid"],"custname":custname["custname"],"csflag":custname["csflag"],"invoicedate":datetime.strftime(row["invoicedate"],'%d-%m-%Y'),"invoicetotal":"%.2f"%float(row["invoicetotal"]), "attachmentcount":row["attachmentcount"]}) - if self.request.params.has_key('type'): - if str(self.request.params["type"]) == 'sale' and int(custname['csflag']) == 3: - invoices.append({"invoiceno":row["invoiceno"], "invid":row["invid"],"custname":custname["custname"],"csflag":custname["csflag"],"invoicedate":datetime.strftime(row["invoicedate"],'%d-%m-%Y'),"invoicetotal":"%.2f"%float(row["invoicetotal"]), "attachmentcount":row["attachmentcount"]}) - elif str(self.request.params["type"]) == 'purchase' and int(custname['csflag']) == 19: - invoices.append({"invoiceno":row["invoiceno"], "invid":row["invid"],"custname":custname["custname"],"csflag":custname["csflag"],"invoicedate":datetime.strftime(row["invoicedate"],'%d-%m-%Y'),"invoicetotal":"%.2f"%float(row["invoicetotal"]), "attachmentcount":row["attachmentcount"]}) - else: - invoices.append({"invoiceno":row["invoiceno"], "invid":row["invid"],"custname":custname["custname"],"csflag":custname["csflag"],"invoicedate":datetime.strftime(row["invoicedate"],'%d-%m-%Y'),"invoicetotal":"%.2f"%float(row["invoicetotal"]), "attachmentcount":row["attachmentcount"]}) + customer = self.con.execute(select([customerandsupplier.c.custname,customerandsupplier.c.csflag]).where(customerandsupplier.c.custid==row["custid"])) + custname = customer.fetchone() + if self.request.params.has_key('type'): + if str(self.request.params["type"]) == 'sale' and int(custname['csflag']) == 3: + invoices.append({"invoiceno":row["invoiceno"], "invid":row["invid"],"custname":custname["custname"],"csflag":custname["csflag"],"invoicedate":datetime.strftime(row["invoicedate"],'%d-%m-%Y'),"invoicetotal":"%.2f"%float(row["invoicetotal"]), "attachmentcount":row["attachmentcount"]}) + elif str(self.request.params["type"]) == 'purchase' and int(custname['csflag']) == 19: + invoices.append({"invoiceno":row["invoiceno"], "invid":row["invid"],"custname":custname["custname"],"csflag":custname["csflag"],"invoicedate":datetime.strftime(row["invoicedate"],'%d-%m-%Y'),"invoicetotal":"%.2f"%float(row["invoicetotal"]), "attachmentcount":row["attachmentcount"]}) + else: + invoices.append({"invoiceno":row["invoiceno"], "invid":row["invid"],"custname":custname["custname"],"csflag":custname["csflag"],"invoicedate":datetime.strftime(row["invoicedate"],'%d-%m-%Y'),"invoicetotal":"%.2f"%float(row["invoicetotal"]), "attachmentcount":row["attachmentcount"]}) return {"gkstatus": gkcore.enumdict["Success"], "gkresult":invoices } except: -- GitLab