From a09792ba8afdbcca60ff7a03ea032af3aa1217ae Mon Sep 17 00:00:00 2001 From: bcomsugi Date: Sat, 15 Mar 2025 15:27:59 +0700 Subject: [PATCH] update main and qb classes, adding on po info in checkstock --- QBClass/QBClasses.py | 16 +++++---- QBClass/server.py | 78 ++++++++++++++++++++++++++++++++++++++++++++ main.py | 31 ++++++++++++++++++ test from mike.py | 27 ++++++++++----- 4 files changed, 137 insertions(+), 15 deletions(-) diff --git a/QBClass/QBClasses.py b/QBClass/QBClasses.py index 450b97e..c1e3199 100644 --- a/QBClass/QBClasses.py +++ b/QBClass/QBClasses.py @@ -1361,12 +1361,14 @@ if __name__ == "__main__": @timing def main(): g= GeneralSummaryReportQuery(debug=False, GeneralSummaryReportType="ProfitAndLossStandard", ReportDateMacro="ThisYear") - print(g, type(g)) - print(type(g.all())) - print(g.all()) - print(g.response_string) - pprint.pprint(g.filter("reportdata").all()) + g= GeneralSummaryReportQuery(debug=True, GeneralSummaryReportType="InventoryStockStatusByItem", ReportItemFilter_FullName=['ECO:0:ECO-009', 'TACF:HNDL:TP-H04/MR','ECO:0:ECO-007', 'ECO:0:ECO-006']) + # print(g, type(g)) + # print(type(g.all())) + # print(g.all()) + # print(g.response_string) + print(g.filter("reportdata").all()) print(g.count(), g.all()) + print(f'{g.filter("datarow").getItemInventory_Report() = }') @timing def iteminventoryquery(): @@ -1472,13 +1474,15 @@ if __name__ == "__main__": print([y for y in x]) print(f"{x.get('Name')} : {len(x.get('PriceLevelPerItemRet'))}") + main() # pricelevel() # invoicequery() # salesorderquery() # transactionquery() # pprint.pprint(InventoryStockStatusByVendor(), sort_dicts=False) # iteminventoryquery() - customerquery() + # customerquery() # readxmltodict() # g=SalesOrderQuery(MaxReturned=1) # print(len(None)) + diff --git a/QBClass/server.py b/QBClass/server.py index f678594..f8a3a69 100644 --- a/QBClass/server.py +++ b/QBClass/server.py @@ -437,6 +437,84 @@ class baseQBQuery: yield from self.findKeyInDict(var[_], ) return dataRetList + def getShortName(self, FullName): + #print(FullName) + return FullName.split(":")[-1] + + def getItemInventory_Report(self): #DataRow): + print(f'{self.filterKey=} {self.__class__.__name__ = }') + if self.filterKey[0].lower()!='datarow' or len(self.filterKey)>1: + return {} + DataRow = self.all()[0] + if not DataRow.get('DataRow'): + print('No DataRow Passed') + return {} + if not isinstance(DataRow.get('DataRow'), list): + DataRow = [DataRow.get('DataRow')] + else: + DataRow = DataRow.get('DataRow') + + itemInvDict = {} + for ItemInvRet in DataRow: + try: + Rowdata = ItemInvRet.get("RowData") + + fullName = Rowdata.get("@value") + ColDatas = ItemInvRet.get("ColData") + QOH, QOSO, QA, QOPO, UOM, ND = None, None, None, None, None, None + for ColData in ColDatas: + if ColData["@colID"] == "5": + QOH = ColData["@value"] + elif ColData["@colID"] =="6": + QOSO = ColData["@value"] + elif ColData["@colID"] =="8": + QA = ColData["@value"] + elif ColData["@colID"] =="9": + UOM = ColData["@value"] + elif ColData["@colID"] =="11": + QOPO = ColData["@value"] + elif ColData["@colID"] =="13": + ND = ColData["@value"] + + # Rowdata = ItemInvRet.find("RowData") + + # fullName = Rowdata.attrib["value"] + # ColDatas = ItemInvRet.iter("ColData") + + # for ColData in ColDatas: + # if ColData.attrib["colID"] == "5": + # QOH = ColData.attrib["value"] + # elif ColData.attrib["colID"] =="6": + # QOSO = ColData.attrib["value"] + # elif ColData.attrib["colID"] =="8": + # QA = ColData.attrib["value"] + # elif ColData.attrib["colID"] =="9": + # UOM = ColData.attrib["value"] + # elif ColData.attrib["colID"] =="11": + # QOPO = ColData.attrib["value"] + # elif ColData.attrib["colID"] =="13": + # ND = ColData.attrib["value"] + + # print("IRQ Modul:",fullName, f'{QOH=} {QOSO=} {QA=} {QOPO=} {UOM=} {ND=} {self.getShortName(fullName)=}' ) + # itemInvDict[fullName] = [self.getShortName(fullName), int(QOH) - int(QOSO)] + itemInvDict[self.getShortName(fullName)] = {'ShortName':self.getShortName(fullName), 'QOH':int(float(QOH)), 'QOSO':int(float(QOSO)), 'QA':int(float(QA)), 'QOPO':int(float(QOPO)), 'UOM':UOM, 'ND':ND} + + #print(ItemInvRet.attrib, ItemInvRet.tag, ItemInvRet.text) + + # QOH = ItemInvRet.find('QuantityOnHand').text + # QOSO = ItemInvRet.find('QuantityOnSalesOrder').text + # #txnid = ItemInvRet.find('ListID').text + # name = ItemInvRet.find('Name').text + # fullName = ItemInvRet.find('FullName').text + # itemInvDict[fullName] = [name, int(QOH) - int(QOSO)] + # #print(itemInvDict[name], name, QOH, QOSO) + except AttributeError: + pass + print(" Attribute err") + except Exception as e: + print("err:", e) + # print(f'{itemInvDict = }') + return itemInvDict # def find_allListOfDict(self, key, var:dict=None, dataRetList:list=None): # return [x for x in self.findKeyInDict(key, var, dataRetList)] diff --git a/main.py b/main.py index 4c5b639..ffd01bd 100644 --- a/main.py +++ b/main.py @@ -21,6 +21,7 @@ import os from QBClass.QBClasses import SalesOrderAdd, InventoryStockStatusByVendor, PriceLevelQuery, TransactionQuery from QBClass.QBClasses import CustomerQuery as CQ from QBClass.QBClasses import ItemInventoryQuery as IIQ +from QBClass.QBClasses import GeneralSummaryReportQuery as GSRQuery import pprint @@ -276,6 +277,36 @@ async def get_stock(request: Request): print("") return responseRt +@app.post('/get-iteminventory_report') +async def getiteminventory_report(request:Request): + print('masuk getiteminventoryreport') + params = await request.body() + print('getiteminventoryrepot') + try: + params = json.loads(params) + except: + print('error get-iteminventory_report') + return {'message':'error get-iteminventory_report'} + # print(f'{request.query_params = }') + # params = await request.json() + print(f'{params = }') + # print(type(params), params) + # params = request.query_params._dict + print(type(params), f'{params = }') + # iteminventory = CustomerQuery.CustomerQuery(**params) + iteminventory_report = GSRQuery(**params, debug=False) + # print(iteminventory.all()) + # status, data = iteminventory.to_json() + # print(f'{MaxReturned = }') + # print(f'{request.query_params = }') + # print(iteminventory_report.filter('datarow').getItemInventory_Report()) + ret = iteminventory_report.filter('DataRow').getItemInventory_Report() + # print(f'{ret = } {type(ret) = } {len(ret) = }') + if len(ret)>0: + return ret + else: + return {'Info': f"CANNOT Get", 'Status':'ERROR', 'msg':f'Cannot Get /getiteminventory_report with params: {params}'} + @app.post('/dasa2/get_generalsalesreport') async def get_generalsalesreport(request: Request): getdict = await request.body() diff --git a/test from mike.py b/test from mike.py index 9b77394..6033f64 100644 --- a/test from mike.py +++ b/test from mike.py @@ -1,5 +1,6 @@ import win32com.client import xml.etree.ElementTree as ET +from QBClass.QBClasses import GeneralSummaryReportQuery class QuickBooksSDK: def __init__(self): @@ -113,16 +114,24 @@ class QuickBooksSDK: # **🔹 Main Execution** if __name__ == "__main__": - qb = QuickBooksSDK() + # qb = QuickBooksSDK() - try: - qb.open_connection() + # try: + # qb.open_connection() - # Query sales orders from January 1, 2024 to January 5, 2024 - sales_orders = qb.get_sales_orders("2024-01-01", "2024-01-05") + # # Query sales orders from January 1, 2024 to January 5, 2024 + # sales_orders = qb.get_sales_orders("2024-01-01", "2024-01-05") - # Print hasil dalam format dictionary - print("Sales Orders:", sales_orders) + # # Print hasil dalam format dictionary + # print("Sales Orders:", sales_orders) - finally: - qb.close_connection() + # finally: + # qb.close_connection() + g= GeneralSummaryReportQuery(debug=False, GeneralSummaryReportType="InventoryStockStatusByItem", ReportItemFilter_FullName=['ECO:0:ECO-009', 'TACF:HNDL:TP-H04/MR','ECO:0:ECO-007', 'ECO:0:ECO-006']) + # print(g, type(g)) + # print(type(g.all())) + # print(g.all()) + # print(g.response_string) + # print(g.filter("reportdata").all()) + # print(g.all()) + print(f'{g.filter("datarow").getItemInventory_Report() = }') \ No newline at end of file