diff --git a/QBClasses.py b/QBClasses.py index 46db2ed..3d33ed7 100644 --- a/QBClasses.py +++ b/QBClasses.py @@ -4,21 +4,13 @@ import timeit import xml.dom.minidom from utils import timing, cleanIncludeRetElements, makeAList import json +from typing import Union -# from functools import wraps - -# def cleanIncludeRetElements(includeRetElements_allowed:list, includeRetElements:list): -# iREs = [] -# # print(f'{includeRetElements_allowed = }\n{includeRetElements = }') -# if isinstance(includeRetElements, str): #if user put 1 str argument in IncludeRetElements, change it to list -# includeRetElements = [includeRetElements] -# for iRE in includeRetElements: -# for iRE_a in includeRetElements_allowed: -# if iRE.lower() == iRE_a.lower(): -# iREs.append(iRE_a) -# break -# return iREs - +ENUM_DateMacro = ['All', 'Today', 'ThisWeek', 'ThisWeekToDate', 'ThisMonth', 'ThisMonthToDate', 'ThisCalendarQuarter', 'ThisCalendarQuarterToDate', 'ThisFiscalQuarter', + 'ThisFiscalQuarterToDate', 'ThisCalendarYear', 'ThisCalendarYearToDate', 'ThisFiscalYear', 'ThisFiscalYearToDate', 'Yesterday', 'LastWeek', 'LastWeekToDate', 'LastMonth', + 'LastMonthToDate', 'LastCalendarQuarter', 'LastCalendarQuarterToDate', 'LastFiscalQuarter', 'LastFiscalQuarterToDate', 'LastCalendarYear', 'LastCalendarYearToDate', + 'LastFiscalYear', 'LastFiscalYearToDate', 'NextWeek', 'NextFourWeeks', 'NextMonth', 'NextCalendarQuarter', 'NextCalendarYear', 'NextFiscalQuarter', 'NextFiscalYear' + ] class ItemInventoryQuery(baseQBQuery): def __init__(self, *args, **kwargs): @@ -35,29 +27,31 @@ class ItemInventoryQuery(baseQBQuery): self.onError = "stopOnError" self.retName = 'ItemInventoryRet' self.defaultFilterKey = "ListID" + self.className = "ItemInventoryQuery" + self.classNameRq:str = self.__class__.__name__ + 'Rq' if 'debug' in kwargs and isinstance(kwargs['debug'], bool): self.class_debug=kwargs["debug"] - self.QBDict[self.__class__.__name__ + "Rq"]={} + self.QBDict[self.classNameRq]={} ### End Required Variable. can put ENUM list below this (eg: self.ENUM_GeneralSummaryReportQuery=[]) if 'ListID' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["ListID"]=kwargs['ListID'] + self.QBDict[self.classNameRq]["ListID"]=kwargs['ListID'] elif 'FullName' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["FullName"]=kwargs['FullName'] + self.QBDict[self.classNameRq]["FullName"]=kwargs['FullName'] else: if 'MaxReturned' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["MaxReturned"]=kwargs['MaxReturned'] + self.QBDict[self.classNameRq]["MaxReturned"]=kwargs['MaxReturned'] if 'ActiveStatus' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["ActiveStatus"]=kwargs['ActiveStatus'] + self.QBDict[self.classNameRq]["ActiveStatus"]=kwargs['ActiveStatus'] if 'FromModifiedDate' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["FromModifiedDate"]=kwargs['FromModifiedDate'] + self.QBDict[self.classNameRq]["FromModifiedDate"]=kwargs['FromModifiedDate'] if 'ToModifiedDate' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["ToModifiedDate"]=kwargs['ToModifiedDate'] + self.QBDict[self.classNameRq]["ToModifiedDate"]=kwargs['ToModifiedDate'] if 'MatchCriterion' in kwargs and 'Name' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["NameFilter"]={'MatchCriterion':kwargs['MatchCriterion', 'Name':kwargs['Name']]} + self.QBDict[self.classNameRq]["NameFilter"]={'MatchCriterion':kwargs['MatchCriterion', 'Name':kwargs['Name']]} elif 'FromName' in kwargs or 'ToName' in kwargs: #if or then use {'key1':kwargs.get('key1',""), 'key2':kwargs.get('key2', "")} - self.QBDict[self.__class__.__name__ + "Rq"]["NameRangeFilter"]={'FromName':kwargs.get('FromName', ""), 'ToName':kwargs.get('ToName', "")} + self.QBDict[self.classNameRq]["NameRangeFilter"]={'FromName':kwargs.get('FromName', ""), 'ToName':kwargs.get('ToName', "")} if 'IncludeRetElement' in kwargs: IRE = cleanIncludeRetElements(self.includeRetElements_allowed, kwargs["IncludeRetElement"]) # IRE->IncludeRetElements cleaned version @@ -65,14 +59,15 @@ class ItemInventoryQuery(baseQBQuery): if len(IRE)>0: if self.defaultFilterKey not in IRE: # defaultFilterKey is for BaseClass.count() eg: after instantiate, then print obj.count() IRE.append(self.defaultFilterKey) - self.QBDict[self.__class__.__name__ + "Rq"]["IncludeRetElement"]=IRE + self.QBDict[self.classNameRq]["IncludeRetElement"]=IRE if 'OwnerID' in kwargs: # usually value=0 to get to DataExtRet (additional data) - self.QBDict[self.__class__.__name__ + "Rq"]["OwnerID"]=kwargs['OwnerID'] + self.QBDict[self.classNameRq]["OwnerID"]=kwargs['OwnerID'] - # print(self.__class__.__name__ + "Rq") + # print(self.classNameRq) # print(self.QBDict) - self.runCheck() ### running the qbxml connection to get data ### + if self.__class__.__name__==self.className: + self.runCheck() ### running the qbxml connection to get data ### class GeneralSummaryReportQuery(baseQBQuery): def __init__(self, *args, **kwargs): @@ -84,10 +79,12 @@ class GeneralSummaryReportQuery(baseQBQuery): self.onError = "stopOnError" self.retName = 'ReportRet' self.defaultFilterKey = "ListID" + self.className = "GeneralSummaryReportQuery" + self.classNameRq:str = self.__class__.__name__ + 'Rq' if 'debug' in kwargs and isinstance(kwargs['debug'], bool): self.class_debug=kwargs["debug"] - self.QBDict[self.__class__.__name__ + "Rq"]={} #Required + self.QBDict[self.classNameRq]={} #Required ### End Required variable self.ENUM_GeneralSummaryReportType = ["BalanceSheetByClass", "BalanceSheetPrevYearComp", "BalanceSheetStandard", "BalanceSheetSummary", "CustomerBalanceSummary", "ExpenseByVendorSummary", "IncomeByCustomerSummary", "InventoryStockStatusByItem", "InventoryStockStatusByVendor", "IncomeTaxSummary", @@ -99,31 +96,96 @@ class GeneralSummaryReportQuery(baseQBQuery): if 'GeneralSummaryReportType' in kwargs: enum=cleanIncludeRetElements(self.ENUM_GeneralSummaryReportType, kwargs['GeneralSummaryReportType']) print(enum) - self.QBDict[self.__class__.__name__ + "Rq"]["GeneralSummaryReportType"]=enum[0] + self.QBDict[self.classRq]["GeneralSummaryReportType"]=enum[0] else: print("Error -> GeneralSummaryReportType is required") return - if 'FromReportDate' in kwargs or 'ToReportDate' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["ReportPeriod"]={'FromReportDate':kwargs.get('FromReportDate', ""), 'ToReportDate':kwargs.get('ToReportDate', "")} - elif 'ReportDateMacro' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["ReportDateMacro"]=kwargs.get('ReportDateMacro', "") + # if 'DisplayReport_ReportPeriod_FromReportDate' in kwargs or 'DisplayReport_ReportPeriod_ToReportDate' in kwargs: + # self.QBDict[self.classNameRq]['DisplayReport']={'ReportPeriod':{}} + # if 'DisplayReport_ReportPeriod_FromReportDate' in kwargs: + # self.QBDict[self.classNameRq]["DisplayReport"]['ReportPeriod']['FromReportDate']=kwargs['DisplayReport_ReportPeriod_FromReportDate'] + # if 'DisplayReport_ReportPeriod_ToReportDate' in kwargs: + # self.QBDict[self.classNameRq]["DisplayReport"]['ReportPeriod']['ToReportDate']=kwargs['DisplayReport_ReportPeriod_ToReportDate'] + # elif 'DisplayReport_ReportPeriod_ReportDateMacro' in kwargs: + # self.QBDict[self.classNameRq]['DisplayReport']={"ReportDateMacro":kwargs['DisplayReport_ReportPeriod_ReportDateMacro']} + + if 'DisplayReport' in kwargs: + self.QBDict[self.classNameRq]["DisplayReport"]=kwargs['DisplayReport'] - elif 'FullName' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["FullName"]=kwargs['FullName'] - else: - if 'MaxReturned' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["MaxReturned"]=kwargs['MaxReturned'] - if 'ActiveStatus' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["ActiveStatus"]=kwargs['ActiveStatus'] - if 'FromModifiedDate' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["FromModifiedDate"]=kwargs['FromModifiedDate'] - if 'ToModifiedDate' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["ToModifiedDate"]=kwargs['ToModifiedDate'] - if 'MatchCriterion' in kwargs and 'Name' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["NameFilter"]={'MatchCriterion':kwargs['MatchCriterion', 'Name':kwargs['Name']]} - elif 'FromName' in kwargs or 'ToName' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["NameRangeFilter"]={'FromName':kwargs.get('FromName', ""), 'ToName':kwargs.get('ToName', "")} + if 'ReportPeriod_FromReportDate' in kwargs or 'ReportPeriod_ToReportDate' in kwargs: #if or then use {'key1':kwargs.get('key1',""), 'key2':kwargs.get('key2', "")} + self.QBDict[self.classNameRq]["ReportPeriod"]={'FromReportDate':kwargs.get('ReportPeriod_FromReportDate', None), 'ToReportDate':kwargs.get('ReportPeriod_ToReportDate', None)} + elif 'ReportDateMacro' in kwargs: + self.QBDict[self.classNameRq]["ReportDateMacro"]=kwargs['ReportDateMacro'] + + if 'ReportAccountFilter_AccountTypeFilter' in kwargs: + self.QBDict[self.classNameRq]["ReportAccountFilter"]={'AccountTypeFilter':kwargs['ReportAccountFilter_AccountTypeFilter']} + elif 'ReportAccountFilter_ListID' in kwargs: + self.QBDict[self.classNameRq]["ReportAccountFilter"]={'ListID':kwargs['ReportAccountFilter_ListID']} + elif 'ReportAccountFilter_FullName' in kwargs: + self.QBDict[self.classNameRq]["ReportAccountFilter"]={'FullName':kwargs['ReportAccountFilter_FullName']} + elif 'ReportAccountFilter_ListIDWithChildren' in kwargs: + self.QBDict[self.classNameRq]["ReportAccountFilter"]={'ListIDWithChildren':kwargs['ReportAccountFilter_ListIDWithChildren']} + elif 'ReportAccountFilter_FullNameWithChildren' in kwargs: + self.QBDict[self.classNameRq]["ReportAccountFilter"]={'FullNameWithChildren':kwargs['ReportAccountFilter_FullNameWithChildren']} + + if 'ReportEntityFilter_EntityTypeFilter' in kwargs: + self.QBDict[self.classNameRq]["ReportEntityFilter"]={'EntityTypeFilter':kwargs['ReportEntityFilter_EntityTypeFilter']} + elif 'ReportEntityFilter_ListID' in kwargs: + self.QBDict[self.classNameRq]["ReportEntityFilter"]={'ListID':kwargs['ReportEntityFilter_ListID']} + elif 'ReportEntityFilter_FullName' in kwargs: + self.QBDict[self.classNameRq]["ReportEntityFilter"]={'FullName':kwargs['ReportEntityFilter_FullName']} + elif 'ReportEntityFilter_ListIDWithChildren' in kwargs: + self.QBDict[self.classNameRq]["ReportEntityFilter"]={'ListIDWithChildren':kwargs['ReportEntityFilter_ListIDWithChildren']} + elif 'ReportEntityFilter_FullNameWithChildren' in kwargs: + self.QBDict[self.classNameRq]["ReportEntityFilter"]={'FullNameWithChildren':kwargs['ReportEntityFilter_FullNameWithChildren']} + + if 'ReportItemFilter_ItemTypeFilter' in kwargs: + self.QBDict[self.classNameRq]["ReportItemFilter"]={'ItemTypeFilter':kwargs['ReportItemFilter_ItemTypeFilter']} + elif 'ReportItemFilter_ListID' in kwargs: + self.QBDict[self.classNameRq]["ReportItemFilter"]={'ListID':kwargs['ReportItemFilter_ListID']} + elif 'ReportItemFilter_FullName' in kwargs: + self.QBDict[self.classNameRq]["ReportItemFilter"]={'FullName':kwargs['ReportItemFilter_FullName']} + elif 'ReportItemFilter_ListIDWithChildren' in kwargs: + self.QBDict[self.classNameRq]["ReportItemFilter"]={'ListIDWithChildren':kwargs['ReportItemFilter_ListIDWithChildren']} + elif 'ReportItemFilter_FullNameWithChildren' in kwargs: + self.QBDict[self.classNameRq]["ReportItemFilter"]={'FullNameWithChildren':kwargs['ReportItemFilter_FullNameWithChildren']} + + if 'ReportClassFilter_ListID' in kwargs: + self.QBDict[self.classNameRq]["ReportClassFilter"]={'ListID':kwargs['ReportClassFilter_ListID']} + elif 'ReportClassFilter_FullName' in kwargs: + self.QBDict[self.classNameRq]["ReportClassFilter"]={'FullName':kwargs['ReportClassFilter_FullName']} + elif 'ReportClassFilter_ListIDWithChildren' in kwargs: + self.QBDict[self.classNameRq]["ReportClassFilter"]={'ListIDWithChildren':kwargs['ReportClassFilter_ListIDWithChildren']} + elif 'ReportClassFilter_FullNameWithChildren' in kwargs: + self.QBDict[self.classNameRq]["ReportClassFilter"]={'FullNameWithChildren':kwargs['ReportClassFilter_FullNameWithChildren']} + + if 'ReportTxnTypeFilter_ListID' in kwargs: + self.QBDict[self.classNameRq]["ReportTxnTypeFilter"]={'TxnTypeFilter':makeAList(kwargs['ReportTxnTypeFilter_ListID'])} + + if 'ReportModifiedDateRangeFilter_FromReportModifiedDate' in kwargs or 'ReportModifiedDateRangeFilter_ToReportModifiedDate' in kwargs: #if or then use {'key1':kwargs.get('key1',""), 'key2':kwargs.get('key2', "")} + self.QBDict[self.classNameRq]["ReportModifiedDateRangeFilter"]={'FromReportModifiedDate':kwargs.get('ReportModifiedDateRangeFilter_FromReportModifiedDate', None), 'ToReportModifiedDate':kwargs.get('ReportModifiedDateRangeFilter_ToReportModifiedDate', None)} + elif 'ReportModifiedDateRangeMacro' in kwargs: + self.QBDict[self.classNameRq]["ReportModifiedDateRangeMacro"]=cleanIncludeRetElements(ENUM_DateMacro, kwargs['ReportModifiedDateRangeMacro']) + + if 'ReportDetailLevelFilter' in kwargs: + self.QBDict[self.classNameRq]["ReportDetailLevelFilter"]=cleanIncludeRetElements(['All', 'AllExceptSummary', 'SummaryOnly'], kwargs['ReportDetailLevelFilter'], 'All') + if 'ReportPostingStatusFilter' in kwargs: + self.QBDict[self.classNameRq]["ReportPostingStatusFilter"]=cleanIncludeRetElements(['Either', 'NonPosting', 'Posting'], kwargs['ReportPostingStatusFilter']) + if 'SummarizeColumnsBy' in kwargs: + self.ENUM_SummarizeColumnsBy=['Account', 'BalanceSheet', 'Class', 'Customer', 'CustomerType', 'Day', 'Employee', 'FourWeek', 'HalfMonth', 'IncomeStatement', 'ItemDetail', 'ItemType', 'Month', 'Payee', + 'PaymentMethod', 'PayrollItemDetail', 'PayrollYtdDetail', 'Quarter', 'SalesRep', 'SalesTaxCode', 'ShipMethod', 'Terms', 'TotalOnly', 'TwoWeek', 'Vendor', 'VendorType', 'Week', 'Year'] + self.QBDict[self.classNameRq]["SummarizeColumnsBy"]=cleanIncludeRetElements(self.ENUM_SummarizeColumnsBy, kwargs['SummarizeColumnsBy']) + if 'IncludeSubColumns' in kwargs: + self.QBDict[self.classNameRq]["IncludeSubColumns"]=kwargs['IncludeSubColumns'] + if 'ReportCalendar' in kwargs: + self.QBDict[self.classNameRq]["ReportCalendar"]=cleanIncludeRetElements(['CalendarYear', 'FiscalYear', 'TaxYear'], kwargs['ReportCalendar'], default_val='CalendarYear') + if 'ReturnsRows' in kwargs: + self.QBDict[self.classNameRq]["ReturnsRows"]=cleanIncludeRetElements(['ActiveOnly', 'NonZero', 'All'], kwargs['ReturnsRows'], default_val='ActiveOnly') + if 'ReturnColumns' in kwargs: + self.QBDict[self.classNameRq]["ReturnColumns"]=cleanIncludeRetElements(['ActiveOnly', 'NonZero', 'All'], kwargs['ReturnColumns'], default_val='ActiveOnly') + if 'ReportBasis' in kwargs: + self.QBDict[self.classNameRq]["ReportBasis"]=cleanIncludeRetElements(['Accrual', 'Cash', 'None'], kwargs['ReportBasis'], default_val='None') if 'IncludeRetElement' in kwargs: IRE = cleanIncludeRetElements(self.includeRetElements_allowed, kwargs["IncludeRetElement"]) #IRE->IncludeRetElements cleaned version @@ -131,47 +193,249 @@ class GeneralSummaryReportQuery(baseQBQuery): if len(IRE)>0: if self.defaultFilterKey not in IRE: #defaultFilterKey is for BaseClass.count() eg: after instantiate, then print obj.count() IRE.append(self.defaultFilterKey) - self.QBDict[self.__class__.__name__ + "Rq"]["IncludeRetElement"]=IRE + self.QBDict[self.classNameRq]["IncludeRetElement"]=IRE - # print(self.__class__.__name__ + "Rq") + # print(self.classNameRq) # print(f'{self.QBDict = }') - self.runCheck() ### running the qbxml connection to get data ### - + if self.__class__.__name__==self.className: + self.runCheck() ### running the qbxml connection to get data ### +import xmltodict +def LineAdd(lineAdd:Union[list, dict])->dict: + if not(isinstance(lineAdd, list) or isinstance(lineAdd, dict)): + raise Exception(f"LineAdd Error. {type(lineAdd)}, should use dictionary or list of dictionary. ") + if isinstance(lineAdd, dict): #convert to listofdict + lineAdd = [lineAdd] + ## process LineAdd dict + resultList = [] + resdict = {} + for xLineAdd in lineAdd: + resdict={'@defMacro':'MACROTYPE'} + resdict['abc']="" + # resdict['ItemRef']={} + if 'ItemRef_ListID' in xLineAdd and xLineAdd['ItemRef_ListID']: + print(":he") + if 'ItemRef' in resdict: + resdict['ItemRef']['ListID']= xLineAdd['ItemRef_ListID'] + else: + resdict['ItemRef']={'ListID': xLineAdd['ItemRef_ListID']} + print(resdict) + if 'ItemRef_FullName' in xLineAdd and xLineAdd['ItemRef_FullName']: + resdict['ItemRef']['FullName']= xLineAdd['ItemRef_FullName'] + if 'Desc' in xLineAdd and xLineAdd['Desc']: + resdict['Desc']= xLineAdd['Desc'] + + resultList.append(resdict) + print(f'{resultList = }') + xyz=xmltodict.unparse({'root':{'LineAdd':resultList}}, pretty=True) + print(xyz) + txt = ''' + + + + 1234 + Sugiarto + + lorem + + ''' + dct = xmltodict.parse(txt) + print(f'{dct = }') +x=[{'ItemRef_FullName': 'Sugiarto', 'ItemRef_ListID':1234, 'Desc':"lorem"}, {'ItemRef_FullName': 'Sugiarto', 'ItemRef_ListID':1234, 'Desc':"lorem"}] +LineAdd(x) +# print(cleanIncludeRetElements(['ActiveOnly', 'NonZero', 'All'], "nonzero", 'ActiveOnly')) class InvoiceAdd(baseQBQuery): def __init__(self, *args, **kwargs): print(f'{args = }') print(f'{kwargs = }') super().__init__(*args, **kwargs) + # self.includeRetElements_allowed = ['TxnID', 'TimeCreated', 'TimeModified', 'EditSequence', 'TxnNumber', 'CustomerRef', 'ClassRef', 'ARAccontRef', 'TemplateRef'] + self.onError = "stopOnError" self.retName = 'InvoiceAddRet' - self.reqSubName = self.retName.replace('Ret', '') - self.QBDict[self.__class__.__name__ + "Rq"]={} - if 'CustomerFullName' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["ListID"]=kwargs['ListID'] - if 'ListID' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["ListID"]=kwargs['ListID'] - elif 'FullName' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["FullName"]=kwargs['FullName'] - else: - if 'MaxReturned' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["MaxReturned"]=kwargs['MaxReturned'] - if 'ActiveStatus' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["ActiveStatus"]=kwargs['ActiveStatus'] - if 'FromModifiedDate' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["FromModifiedDate"]=kwargs['FromModifiedDate'] - if 'ToModifiedDate' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["ToModifiedDate"]=kwargs['ToModifiedDate'] - if 'MatchCriterion' in kwargs and 'Name' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["NameFilter"]={'MatchCriterion':kwargs['MatchCriterion', 'Name':kwargs['Name']]} - if 'FromName' in kwargs or 'ToName' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["NameRangeFilter"]={'FromName':kwargs.get('FromName', ""), 'ToName':kwargs.get('ToName', "")} - if 'IncludeRetElement' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["IncludeRetElement"]=kwargs['IncludeRetElement'] - if 'OwnerID' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["OwnerID"]=kwargs['OwnerID'] - # print(self.__class__.__name__ + "Rq") + self.defaultFilterKey = "TxnID" + self.className = "InvoiceAdd" + self.classNameRq:str = self.__class__.__name__ + 'Rq' + self.reqSubName = self.className + if 'debug' in kwargs and isinstance(kwargs['debug'], bool): + self.class_debug=kwargs["debug"] + + self.QBDict[self.classNameRq]={} + + self.isRequiredFieldSatisfied = False + self.QBDict[self.classNameRq][self.__class__.__name__]={'@defMacro':'MACROTYPE'} + if 'CustomerRef_ListID' in kwargs: + if 'CustomerRef' in self.QBDict[self.classNameRq][self.__class__.__name__]: + self.QBDict[self.classNameRq][self.__class__.__name__]["CustomerRef"]['ListID']= kwargs['CustomerRef_ListID'] + else: + self.QBDict[self.classNameRq][self.__class__.__name__]["CustomerRef"]={'ListID': kwargs['CustomerRef_ListID']} + self.isRequiredFieldSatisfied=True + if 'CustomerRef_FullName' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["CustomerRef"]={'FullName': kwargs['CustomerRef_FullName']} + self.isRequiredFieldSatisfied=True + + if not self.isRequiredFieldSatisfied: + raise Exception("Need CustomerRef FullName and/or ListID") + + if 'ClassRef_ListID' in kwargs: + if 'ClassRef' in self.QBDict[self.classNameRq][self.__class__.__name__]: + self.QBDict[self.classNameRq][self.__class__.__name__]["ClassRef"]['ListID']= kwargs['ClassRef_ListID'] + else: + self.QBDict[self.classNameRq][self.__class__.__name__]["ClassRef"]={'ListID': kwargs['ClassRef_ListID']} + if 'ClassRef_FullName' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["ClassRef"]={'FullName': kwargs['ClassRef_FullName']} + + if 'ARAccountRef_ListID' in kwargs: + if 'ARAccountRef' in self.QBDict[self.classNameRq][self.__class__.__name__]: + self.QBDict[self.classNameRq][self.__class__.__name__]["ARAccountRef"]['ListID']= kwargs['ARAccountRef_ListID'] + else: + self.QBDict[self.classNameRq][self.__class__.__name__]["ARAccountRef"]={'ListID': kwargs['ARAccountRef_ListID']} + if 'ARAccountRef_FullName' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["ARAccountRef"]={'FullName': kwargs['ARAccountRef_FullName']} + + if 'TemplateRef_ListID' in kwargs: + if 'TemplateRef' in self.QBDict[self.classNameRq][self.__class__.__name__]: + self.QBDict[self.classNameRq][self.__class__.__name__]["TemplateRef"]['ListID']= kwargs['TemplateRef_ListID'] + else: + self.QBDict[self.classNameRq][self.__class__.__name__]["TemplateRef"]={'ListID': kwargs['TemplateRef_ListID']} + if 'TemplateRef_FullName' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["TemplateRef"]={'FullName': kwargs['TemplateRef_FullName']} + + if 'TxnDate' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["TxnDate"]=kwargs['TxnDate'] + if 'RefNumber' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["RefNumber"]=kwargs['RefNumber'] + if 'BillAddress_Addr1' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["BillAddress"]={'Addr1': kwargs['BillAddress_Addr1']} + if 'BillAddress_Addr2' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["BillAddress"]={'Addr2': kwargs['BillAddress_Addr2']} + if 'BillAddress_Addr3' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["BillAddress"]={'Addr3': kwargs['BillAddress_Addr3']} + if 'BillAddress_Addr4' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["BillAddress"]={'Addr4': kwargs['BillAddress_Addr4']} + if 'BillAddress_Addr5' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["BillAddress"]={'Addr5': kwargs['BillAddress_Addr5']} + if 'BillAddress_City' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["BillAddress"]={'City': kwargs['BillAddress_City']} + if 'BillAddress_State' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["BillAddress"]={'State': kwargs['BillAddress_State']} + if 'BillAddress_PostalCode' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["BillAddress"]={'PostalCode': kwargs['BillAddress_PostalCode']} + if 'BillAddress_Country' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["BillAddress"]={'Country': kwargs['BillAddress_Country']} + if 'BillAddress_Note' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["BillAddress"]={'Note': kwargs['BillAddress_Note']} + + if 'ShipAddress_Addr1' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["ShipAddress"]={'Addr1': kwargs['ShipAddress_Addr1']} + if 'ShipAddress_Addr2' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["ShipAddress"]={'Addr2': kwargs['ShipAddress_Addr2']} + if 'ShipAddress_Addr3' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["ShipAddress"]={'Addr3': kwargs['ShipAddress_Addr3']} + if 'ShipAddress_Addr4' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["ShipAddress"]={'Addr4': kwargs['ShipAddress_Addr4']} + if 'ShipAddress_Addr5' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["ShipAddress"]={'Addr5': kwargs['ShipAddress_Addr5']} + if 'ShipAddress_City' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["ShipAddress"]={'City': kwargs['ShipAddress_City']} + if 'ShipAddress_State' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["ShipAddress"]={'State': kwargs['ShipAddress_State']} + if 'ShipAddress_PostalCode' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["ShipAddress"]={'PostalCode': kwargs['ShipAddress_PostalCode']} + if 'ShipAddress_Country' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["ShipAddress"]={'Country': kwargs['ShipAddress_Country']} + if 'ShipAddress_Note' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["ShipAddress"]={'Note': kwargs['ShipAddress_Note']} + + if 'IsPending' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["IsPending"]=kwargs['IsPending'] + if 'IsFinanceCharge' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["IsFinanceCharge"]=kwargs['IsFinanceCharge'] + if 'PONumber' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["PONumber"]=kwargs['PONumber'] + if 'TermsRef_ListID' in kwargs: + if 'TermsRef' in self.QBDict[self.classNameRq][self.__class__.__name__]: + self.QBDict[self.classNameRq][self.__class__.__name__]["TermsRef"]['ListID']= kwargs['TermsRef_ListID'] + else: + self.QBDict[self.classNameRq][self.__class__.__name__]["TermsRef"]={'ListID': kwargs['TermsRef_ListID']} + if 'TermsRef_FullName' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["TermsRef"]={'FullName': kwargs['TermsRef_FullName']} + + if 'DueDate' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["DueDate"]=kwargs['DueDate'] + if 'SalesRepRef_ListID' in kwargs: + if 'SalesRepRef' in self.QBDict[self.classNameRq][self.__class__.__name__]: + self.QBDict[self.classNameRq][self.__class__.__name__]["SalesRepRef"]['ListID']= kwargs['SalesRepRef_ListID'] + else: + self.QBDict[self.classNameRq][self.__class__.__name__]["SalesRepRef"]={'ListID': kwargs['SalesRepRef_ListID']} + if 'SalesRepRef_FullName' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["SalesRepRef"]={'FullName': kwargs['SalesRepRef_FullName']} + + if 'FOB' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["FOB"]=kwargs['FOB'] + if 'ShipDate' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["ShipDate"]=kwargs['ShipDate'] + if 'ShipMethodRef_ListID' in kwargs: + if 'ShipMethodRef' in self.QBDict[self.classNameRq][self.__class__.__name__]: + self.QBDict[self.classNameRq][self.__class__.__name__]["ShipMethodRef"]['ListID']= kwargs['ShipMethodRef_ListID'] + else: + self.QBDict[self.classNameRq][self.__class__.__name__]["ShipMethodRef"]={'ListID': kwargs['ShipMethodRef_ListID']} + if 'ShipMethodRef_FullName' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["ShipMethodRef"]={'FullName': kwargs['ShipMethodRef_FullName']} + + if 'ItemSalesTaxRef_ListID' in kwargs: + if 'ItemSalesTaxRef' in self.QBDict[self.classNameRq][self.__class__.__name__]: + self.QBDict[self.classNameRq][self.__class__.__name__]["ItemSalesTaxRef"]['ListID']= kwargs['ItemSalesTaxRef_ListID'] + else: + self.QBDict[self.classNameRq][self.__class__.__name__]["ItemSalesTaxRef"]={'ListID': kwargs['ItemSalesTaxRef_ListID']} + if 'ItemSalesTaxRef_FullName' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["ItemSalesTaxRef"]={'FullName': kwargs['ItemSalesTaxRef_FullName']} + + if 'Memo' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["Memo"]=kwargs['Memo'] + if 'CustomerMsgRef_ListID' in kwargs: + if 'CustomerMsgRef' in self.QBDict[self.classNameRq][self.__class__.__name__]: + self.QBDict[self.classNameRq][self.__class__.__name__]["CustomerMsgRef"]['ListID']= kwargs['CustomerMsgRef_ListID'] + else: + self.QBDict[self.classNameRq][self.__class__.__name__]["CustomerMsgRef"]={'ListID': kwargs['CustomerMsgRef_ListID']} + if 'CustomerMsgRef_FullName' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["CustomerMsgRef"]={'FullName': kwargs['CustomerMsgRef_FullName']} + + if 'IsToBePrinted' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["IsToBePrinted"]=kwargs['IsToBePrinted'] + if 'IsToBeEmailed' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["IsToBeEmailed"]=kwargs['IsToBeEmailed'] + if 'IsTaxIncluded' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["IsTaxIncluded"]=kwargs['IsTaxIncluded'] + if 'CustomerSalesTaxCodeRef_ListID' in kwargs: + if 'CustomerSalesTaxCodeRef' in self.QBDict[self.classNameRq][self.__class__.__name__]: + self.QBDict[self.classNameRq][self.__class__.__name__]["CustomerSalesTaxCodeRef"]['ListID']= kwargs['CustomerSalesTaxCodeRef_ListID'] + else: + self.QBDict[self.classNameRq][self.__class__.__name__]["CustomerSalesTaxCodeRef"]={'ListID': kwargs['CustomerSalesTaxCodeRef_ListID']} + if 'CustomerSalesTaxCodeRef_FullName' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["CustomerSalesTaxCodeRef"]={'FullName': kwargs['CustomerSalesTaxCodeRef_FullName']} + + if 'Other' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["Other"]=kwargs['Other'] + if 'ExchangeRate' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["ExchangeRate"]=kwargs['ExchangeRate'] + if 'ExternalGUID' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["ExternalGUID"]=kwargs['ExternalGUID'] + if 'LinkToTxnID' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["LinkToTxnID"]=makeAList(kwargs['LinkToTxnID']) + + if 'SetCredit_CreditTxnID' in kwargs and 'SetCredit_AppliedAmount' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["SetCredit"]={'CreditTxnID':{'@useMacro':"MACROTYPE", '#text':kwargs['SetCredit_CreditTxnID']}, 'AppliedAmount': kwargs['SetCredit_AppliedAmount']} + if 'SetCredit_Override' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["SetCredit"]["Override"]=kwargs['SetCredit_Override'] + #add InvoiceLineAdd kwargs here + + + if 'IncludeRetElement' in kwargs: + self.QBDict[self.classNameRq]["IncludeRetElement"]=kwargs['IncludeRetElement'] + + # print(self.classNameRq) # print(self.QBDict) @@ -190,45 +454,48 @@ class CustomerQuery(baseQBQuery): self.onError = "stopOnError" self.retName = 'CustomerRet' self.defaultFilterKey = "ListID" + self.className = "CustomerQuery" + self.classNameRq:str = self.__class__.__name__ + 'Rq' if 'debug' in kwargs and isinstance(kwargs['debug'], bool): self.class_debug=kwargs["debug"] - self.QBDict[self.__class__.__name__ + "Rq"]={} + self.QBDict[self.classNameRq]={} if 'ListID' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["ListID"]=kwargs['ListID'] + self.QBDict[self.classNameRq]["ListID"]=kwargs['ListID'] elif 'FullName' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["FullName"]=kwargs['FullName'] + self.QBDict[self.classNameRq]["FullName"]=kwargs['FullName'] else: if 'MaxReturned' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["MaxReturned"]=kwargs['MaxReturned'] + self.QBDict[self.classNameRq]["MaxReturned"]=kwargs['MaxReturned'] if 'ActiveStatus' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["ActiveStatus"]=kwargs['ActiveStatus'] + self.QBDict[self.classNameRq]["ActiveStatus"]=kwargs['ActiveStatus'] if 'FromModifiedDate' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["FromModifiedDate"]=kwargs['FromModifiedDate'] + self.QBDict[self.classNameRq]["FromModifiedDate"]=kwargs['FromModifiedDate'] if 'ToModifiedDate' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["ToModifiedDate"]=kwargs['ToModifiedDate'] + self.QBDict[self.classNameRq]["ToModifiedDate"]=kwargs['ToModifiedDate'] if 'MatchCriterion' in kwargs and 'Name' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["NameFilter"]={'MatchCriterion':kwargs['MatchCriterion'], 'Name':kwargs['Name']} + self.QBDict[self.classNameRq]["NameFilter"]={'MatchCriterion':kwargs['MatchCriterion'], 'Name':kwargs['Name']} elif 'FromName' in kwargs or 'ToName' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["NameRangeFilter"]={'FromName':kwargs.get('FromName', ""), 'ToName':kwargs.get('ToName', "")} + self.QBDict[self.classNameRq]["NameRangeFilter"]={'FromName':kwargs.get('FromName', ""), 'ToName':kwargs.get('ToName', "")} if 'Operator' in kwargs and 'Amount' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["TotalBalanceFilter"]={'Operator':kwargs['Operator'], 'Amount':kwargs['Amount']} + self.QBDict[self.classNameRq]["TotalBalanceFilter"]={'Operator':kwargs['Operator'], 'Amount':kwargs['Amount']} if 'IncludeRetElement' in kwargs: IRE = cleanIncludeRetElements(self.includeRetElements_allowed, kwargs['IncludeRetElement']) print(f'{IRE = }') if len(IRE)>0: if self.defaultFilterKey not in IRE: IRE.append(self.defaultFilterKey) - self.QBDict[self.__class__.__name__ + "Rq"]["IncludeRetElement"]=IRE + self.QBDict[self.classNameRq]["IncludeRetElement"]=IRE if 'OwnerID' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["OwnerID"]=kwargs['OwnerID'] + self.QBDict[self.classNameRq]["OwnerID"]=kwargs['OwnerID'] - print(self.__class__.__name__ + "Rq") + print(self.classNameRq) print(f'{self.QBDict = }' ) # print(f'{self.includeRetElements_allowed =}') - self.runCheck() ### running the qbxml connection to get data ### + if self.__class__.__name__==self.className: + self.runCheck() ### running the qbxml connection to get data ### class TransactionQuery(baseQBQuery): @@ -243,14 +510,16 @@ class TransactionQuery(baseQBQuery): self.onError = "stopOnError" self.retName = 'TransactionRet' self.defaultFilterKey = "TxnID" + self.className = "TransactionQuery" + self.classNameRq = self.__class__.__name__ + 'Rq' if 'debug' in kwargs and isinstance(kwargs['debug'], bool): self.class_debug=kwargs["debug"] - self.QBDict[self.__class__.__name__ + "Rq"]={} + self.QBDict[self.classNameRq]={} ### End Required Variable. can put ENUM list below this (eg: self.ENUM_GeneralSummaryReportQuery=[]) if 'TxnID' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["TxnID"]=kwargs['TxnID'] + self.QBDict[self.classNameRq]["TxnID"]=kwargs['TxnID'] else: if 'MaxReturned' in kwargs: if kwargs['MaxReturned'] is None: @@ -272,85 +541,85 @@ class TransactionQuery(baseQBQuery): MaxReturned = 0 else: MaxReturned = 0 - self.QBDict[self.__class__.__name__ + "Rq"]["MaxReturned"]=MaxReturned + self.QBDict[self.classNameRq]["MaxReturned"]=MaxReturned if 'RefNumber' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["RefNumber"]=kwargs['RefNumber'] + self.QBDict[self.classNameRq]["RefNumber"]=kwargs['RefNumber'] elif 'RefNumberCaseSensitive' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["RefNumberCaseSensitive"]=kwargs['RefNumberCaseSensitive'] + self.QBDict[self.classNameRq]["RefNumberCaseSensitive"]=kwargs['RefNumberCaseSensitive'] elif 'RefNumberFilter_MatchCriterion' in kwargs and 'RefNumberFilter_RefNumber' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["RefNumberFilter"]={'MatchCriterion':kwargs['RefNumberFilter_MatchCriterion', 'RefNumber':kwargs['RefNumberFilter_RefNumber']]} + self.QBDict[self.classNameRq]["RefNumberFilter"]={'MatchCriterion':kwargs['RefNumberFilter_MatchCriterion', 'RefNumber':kwargs['RefNumberFilter_RefNumber']]} elif 'RefNumberFilter_FromRefNumber' in kwargs or 'RefNumberFilter_ToRefNumber' in kwargs: #if or then use {'key1':kwargs.get('key1',""), 'key2':kwargs.get('key2', "")} - self.QBDict[self.__class__.__name__ + "Rq"]["RefNumberRangeFilter"]={'FromRefNumber':kwargs.get('RefNumberFilter_FromRefNumber', ""), 'ToRefNumber':kwargs.get('RefNumberFilter_ToRefNumber', "")} + self.QBDict[self.classNameRq]["RefNumberRangeFilter"]={'FromRefNumber':kwargs.get('RefNumberFilter_FromRefNumber', ""), 'ToRefNumber':kwargs.get('RefNumberFilter_ToRefNumber', "")} if 'TransactionModifiedDateRangeFilter_FromModifiedDate' in kwargs or 'TransactionModifiedDateRangeFilter_ToModifiedDate' in kwargs: #if or then use {'key1':kwargs.get('key1',""), 'key2':kwargs.get('key2', "")} - self.QBDict[self.__class__.__name__ + "Rq"]["TransactionModifiedDateRangeFilter"]={'FromModifiedDate':kwargs.get('TransactionModifiedDateRangeFilter_FromModifiedDate', ""), 'ToModifiedDate':kwargs.get('TransactionModifiedDateRangeFilter_ToModifiedDate', "")} + self.QBDict[self.classNameRq]["TransactionModifiedDateRangeFilter"]={'FromModifiedDate':kwargs.get('TransactionModifiedDateRangeFilter_FromModifiedDate', ""), 'ToModifiedDate':kwargs.get('TransactionModifiedDateRangeFilter_ToModifiedDate', "")} elif 'TransactionModifiedDateRangeFilter_DateMacro' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["TransactionModifiedDateRangeFilter"]={'DateMacro':kwargs['TransactionModifiedDateRangeFilter_DateMacro']} + self.QBDict[self.classNameRq]["TransactionModifiedDateRangeFilter"]={'DateMacro':kwargs['TransactionModifiedDateRangeFilter_DateMacro']} if 'TransactionDateRangeFilter_FromTxnDate' in kwargs or 'TransactionDateRangeFilter_ToTxnDate' in kwargs: #if or then use {'key1':kwargs.get('key1',""), 'key2':kwargs.get('key2', "")} - self.QBDict[self.__class__.__name__ + "Rq"]["TransactionDateRangeFilter"]={'FromTxnDate':kwargs.get('TransactionDateRangeFilter_FromTxnDate', ""), 'ToTxnDate':kwargs.get('TransactionDateRangeFilter_ToTxnDate', "")} + self.QBDict[self.classNameRq]["TransactionDateRangeFilter"]={'FromTxnDate':kwargs.get('TransactionDateRangeFilter_FromTxnDate', ""), 'ToTxnDate':kwargs.get('TransactionDateRangeFilter_ToTxnDate', "")} elif 'TransactionDateRangeFilter_DateMacro' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["TransactionDateRangeFilter"]={'DateMacro':kwargs['TransactionDateRangeFilter_DateMacro']} + self.QBDict[self.classNameRq]["TransactionDateRangeFilter"]={'DateMacro':kwargs['TransactionDateRangeFilter_DateMacro']} if 'TransactionEntityFilter_EntityTypeFilter' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["TransactionEntityFilter"]={'EntityTypeFilter':kwargs['TransactionEntityFilter_EntityTypeFilter']} + self.QBDict[self.classNameRq]["TransactionEntityFilter"]={'EntityTypeFilter':kwargs['TransactionEntityFilter_EntityTypeFilter']} elif 'TransactionEntityFilter_ListID' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["TransactionEntityFilter"]={'ListID':kwargs['TransactionEntityFilter_ListID']} + self.QBDict[self.classNameRq]["TransactionEntityFilter"]={'ListID':kwargs['TransactionEntityFilter_ListID']} elif 'TransactionEntityFilter_FullName' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["TransactionEntityFilter"]={'FullName':kwargs['TransactionEntityFilter_FullName']} + self.QBDict[self.classNameRq]["TransactionEntityFilter"]={'FullName':kwargs['TransactionEntityFilter_FullName']} elif 'TransactionEntityFilter_ListIDWithChildren' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["TransactionEntityFilter"]={'ListIDWithChildren':kwargs['TransactionEntityFilter_ListIDWithChildren']} + self.QBDict[self.classNameRq]["TransactionEntityFilter"]={'ListIDWithChildren':kwargs['TransactionEntityFilter_ListIDWithChildren']} elif 'TransactionEntityFilter_FullNameWithChildren' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["TransactionEntityFilter"]={'FullNameWithChildren':kwargs['TransactionEntityFilter_FullNameWithChildren']} + self.QBDict[self.classNameRq]["TransactionEntityFilter"]={'FullNameWithChildren':kwargs['TransactionEntityFilter_FullNameWithChildren']} if 'TransactionAccountFilter_AccountTypeFilter' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["TransactionAccountFilter"]={'AccountTypeFilter':kwargs['TransactionAccountFilter_AccountTypeFilter']} + self.QBDict[self.classNameRq]["TransactionAccountFilter"]={'AccountTypeFilter':kwargs['TransactionAccountFilter_AccountTypeFilter']} elif 'TransactionAccountFilter_ListID' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["TransactionAccountFilter"]={'ListID':kwargs['TransactionAccountFilter_ListID']} + self.QBDict[self.classNameRq]["TransactionAccountFilter"]={'ListID':kwargs['TransactionAccountFilter_ListID']} elif 'TransactionAccountFilter_FullName' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["TransactionAccountFilter"]={'FullName':kwargs['TransactionAccountFilter_FullName']} + self.QBDict[self.classNameRq]["TransactionAccountFilter"]={'FullName':kwargs['TransactionAccountFilter_FullName']} elif 'TransactionAccountFilter_ListIDWithChildren' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["TransactionAccountFilter"]={'ListIDWithChildren':kwargs['TransactionAccountFilter_ListIDWithChildren']} + self.QBDict[self.classNameRq]["TransactionAccountFilter"]={'ListIDWithChildren':kwargs['TransactionAccountFilter_ListIDWithChildren']} elif 'TransactionAccountFilter_FullNameWithChildren' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["TransactionAccountFilter"]={'FullNameWithChildren':kwargs['TransactionAccountFilter_FullNameWithChildren']} + self.QBDict[self.classNameRq]["TransactionAccountFilter"]={'FullNameWithChildren':kwargs['TransactionAccountFilter_FullNameWithChildren']} if 'TransactionItemFilter_ItemTypeFilter' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["TransactionItemFilter"]={'ItemTypeFilter':kwargs['TransactionItemFilter_ItemTypeFilter']} + self.QBDict[self.classNameRq]["TransactionItemFilter"]={'ItemTypeFilter':kwargs['TransactionItemFilter_ItemTypeFilter']} elif 'TransactionItemFilter_ListID' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["TransactionItemFilter"]={'ListID':kwargs['TransactionItemFilter_ListID']} + self.QBDict[self.classNameRq]["TransactionItemFilter"]={'ListID':kwargs['TransactionItemFilter_ListID']} elif 'TransactionItemFilter_FullName' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["TransactionItemFilter"]={'FullName':kwargs['TransactionItemFilter_FullName']} + self.QBDict[self.classNameRq]["TransactionItemFilter"]={'FullName':kwargs['TransactionItemFilter_FullName']} elif 'TransactionItemFilter_ListIDWithChildren' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["TransactionItemFilter"]={'ListIDWithChildren':kwargs['TransactionItemFilter_ListIDWithChildren']} + self.QBDict[self.classNameRq]["TransactionItemFilter"]={'ListIDWithChildren':kwargs['TransactionItemFilter_ListIDWithChildren']} elif 'TransactionItemFilter_FullNameWithChildren' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["TransactionItemFilter"]={'FullNameWithChildren':kwargs['TransactionItemFilter_FullNameWithChildren']} + self.QBDict[self.classNameRq]["TransactionItemFilter"]={'FullNameWithChildren':kwargs['TransactionItemFilter_FullNameWithChildren']} if 'TransactionClassFilter_ListID' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["TransactionClassFilter"]={'ListID':kwargs['TransactionClassFilter_ListID']} + self.QBDict[self.classNameRq]["TransactionClassFilter"]={'ListID':kwargs['TransactionClassFilter_ListID']} elif 'TransactionClassFilter_FullName' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["TransactionClassFilter"]={'FullName':kwargs['TransactionClassFilter_FullName']} + self.QBDict[self.classNameRq]["TransactionClassFilter"]={'FullName':kwargs['TransactionClassFilter_FullName']} elif 'TransactionClassFilter_ListIDWithChildren' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["TransactionClassFilter"]={'ListIDWithChildren':kwargs['TransactionClassFilter_ListIDWithChildren']} + self.QBDict[self.classNameRq]["TransactionClassFilter"]={'ListIDWithChildren':kwargs['TransactionClassFilter_ListIDWithChildren']} elif 'TransactionClassFilter_FullNameWithChildren' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["TransactionClassFilter"]={'FullNameWithChildren':kwargs['TransactionClassFilter_FullNameWithChildren']} + self.QBDict[self.classNameRq]["TransactionClassFilter"]={'FullNameWithChildren':kwargs['TransactionClassFilter_FullNameWithChildren']} if 'TransactionTypeFilter_TxnTypeFilter' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["TransactionTypeFilter"]={'TxnTypeFilter':kwargs['TransactionTypeFilter_TxnTypeFilter']} + self.QBDict[self.classNameRq]["TransactionTypeFilter"]={'TxnTypeFilter':kwargs['TransactionTypeFilter_TxnTypeFilter']} if 'TransactionDetailLevelFilter' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["TransactionDetailLevelFilter"]=kwargs['TransactionDetailLevelFilter'] + self.QBDict[self.classNameRq]["TransactionDetailLevelFilter"]=kwargs['TransactionDetailLevelFilter'] if 'TransactionPostingStatusFilter' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["TransactionPostingStatusFilter"]=kwargs['TransactionPostingStatusFilter'] + self.QBDict[self.classNameRq]["TransactionPostingStatusFilter"]=kwargs['TransactionPostingStatusFilter'] if 'TransactionPaidStatusFilter' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["TransactionPaidStatusFilter"]=kwargs['TransactionPaidStatusFilter'] + self.QBDict[self.classNameRq]["TransactionPaidStatusFilter"]=kwargs['TransactionPaidStatusFilter'] if 'CurrencyFilter_ListID' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["CurrencyFilter"]=kwargs['CurrencyFilter_ListID'] + self.QBDict[self.classNameRq]["CurrencyFilter"]=kwargs['CurrencyFilter_ListID'] elif 'CurrencyFilter_FullName' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["CurrencyFilter"]=kwargs['CurrencyFilter_FullName'] + self.QBDict[self.classNameRq]["CurrencyFilter"]=kwargs['CurrencyFilter_FullName'] if 'IncludeRetElement' in kwargs: IRE = cleanIncludeRetElements(self.includeRetElements_allowed, kwargs["IncludeRetElement"]) # IRE->IncludeRetElements cleaned version @@ -358,12 +627,272 @@ class TransactionQuery(baseQBQuery): if len(IRE)>0: if self.defaultFilterKey not in IRE: # defaultFilterKey is for BaseClass.count() eg: after instantiate, then print obj.count() IRE.append(self.defaultFilterKey) - self.QBDict[self.__class__.__name__ + "Rq"]["IncludeRetElement"]=IRE + self.QBDict[self.classNameRq]["IncludeRetElement"]=IRE - # print(self.__class__.__name__ + "Rq") + # print(self.classNameRq) # print(self.QBDict) - self.runCheck() ### running the qbxml connection to get data ### + if self.__class__.__name__==self.className: + self.runCheck() ### running the qbxml connection to get data ### + + +class SalesOrderAdd(baseQBQuery): + def __init__(self, *args, **kwargs): + print(f'{args = }') + print(f'{kwargs = }') + super().__init__(*args, **kwargs) + # self.includeRetElements_allowed = ['TxnID', 'TimeCreated', 'TimeModified', 'EditSequence', 'TxnNumber', 'CustomerRef', 'ClassRef', 'ARAccontRef', 'TemplateRef'] + self.onError = "stopOnError" + self.retName = 'SalesOrderAddRet' + + self.defaultFilterKey = "TxnID" + self.className = "SalesOrderAdd" + self.classNameRq:str = self.__class__.__name__ + 'Rq' + self.reqSubName = self.className + if 'debug' in kwargs and isinstance(kwargs['debug'], bool): + self.class_debug=kwargs["debug"] + + self.QBDict[self.classNameRq]={} + + self.isRequiredFieldSatisfied = False + self.QBDict[self.classNameRq][self.__class__.__name__]={'@defMacro':'MACROTYPE'} + if 'CustomerRef_ListID' in kwargs: + if 'CustomerRef' in self.QBDict[self.classNameRq][self.__class__.__name__]: + self.QBDict[self.classNameRq][self.__class__.__name__]["CustomerRef"]['ListID']= kwargs['CustomerRef_ListID'] + else: + self.QBDict[self.classNameRq][self.__class__.__name__]["CustomerRef"]={'ListID': kwargs['CustomerRef_ListID']} + self.isRequiredFieldSatisfied=True + if 'CustomerRef_FullName' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["CustomerRef"]={'FullName': kwargs['CustomerRef_FullName']} + self.isRequiredFieldSatisfied=True + + if not self.isRequiredFieldSatisfied: + raise Exception("Need CustomerRef FullName and/or ListID") + + if 'ClassRef_ListID' in kwargs: + if 'ClassRef' in self.QBDict[self.classNameRq][self.__class__.__name__]: + self.QBDict[self.classNameRq][self.__class__.__name__]["ClassRef"]['ListID']= kwargs['ClassRef_ListID'] + else: + self.QBDict[self.classNameRq][self.__class__.__name__]["ClassRef"]={'ListID': kwargs['ClassRef_ListID']} + if 'ClassRef_FullName' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["ClassRef"]={'FullName': kwargs['ClassRef_FullName']} + + # if 'ARAccountRef_ListID' in kwargs: + # if 'ARAccountRef' in self.QBDict[self.classNameRq][self.__class__.__name__]: + # self.QBDict[self.classNameRq][self.__class__.__name__]["ARAccountRef"]['ListID']= kwargs['ARAccountRef_ListID'] + # else: + # self.QBDict[self.classNameRq][self.__class__.__name__]["ARAccountRef"]={'ListID': kwargs['ARAccountRef_ListID']} + # if 'ARAccountRef_FullName' in kwargs: + # self.QBDict[self.classNameRq][self.__class__.__name__]["ARAccountRef"]={'FullName': kwargs['ARAccountRef_FullName']} + + if 'TemplateRef_ListID' in kwargs: + if 'TemplateRef' in self.QBDict[self.classNameRq][self.__class__.__name__]: + self.QBDict[self.classNameRq][self.__class__.__name__]["TemplateRef"]['ListID']= kwargs['TemplateRef_ListID'] + else: + self.QBDict[self.classNameRq][self.__class__.__name__]["TemplateRef"]={'ListID': kwargs['TemplateRef_ListID']} + if 'TemplateRef_FullName' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["TemplateRef"]={'FullName': kwargs['TemplateRef_FullName']} + + if 'TxnDate' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["TxnDate"]=kwargs['TxnDate'] + if 'RefNumber' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["RefNumber"]=kwargs['RefNumber'] + if 'BillAddress_Addr1' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["BillAddress"]={'Addr1': kwargs['BillAddress_Addr1']} + if 'BillAddress_Addr2' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["BillAddress"]={'Addr2': kwargs['BillAddress_Addr2']} + if 'BillAddress_Addr3' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["BillAddress"]={'Addr3': kwargs['BillAddress_Addr3']} + if 'BillAddress_Addr4' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["BillAddress"]={'Addr4': kwargs['BillAddress_Addr4']} + if 'BillAddress_Addr5' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["BillAddress"]={'Addr5': kwargs['BillAddress_Addr5']} + if 'BillAddress_City' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["BillAddress"]={'City': kwargs['BillAddress_City']} + if 'BillAddress_State' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["BillAddress"]={'State': kwargs['BillAddress_State']} + if 'BillAddress_PostalCode' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["BillAddress"]={'PostalCode': kwargs['BillAddress_PostalCode']} + if 'BillAddress_Country' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["BillAddress"]={'Country': kwargs['BillAddress_Country']} + if 'BillAddress_Note' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["BillAddress"]={'Note': kwargs['BillAddress_Note']} + + if 'ShipAddress_Addr1' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["ShipAddress"]={'Addr1': kwargs['ShipAddress_Addr1']} + if 'ShipAddress_Addr2' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["ShipAddress"]={'Addr2': kwargs['ShipAddress_Addr2']} + if 'ShipAddress_Addr3' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["ShipAddress"]={'Addr3': kwargs['ShipAddress_Addr3']} + if 'ShipAddress_Addr4' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["ShipAddress"]={'Addr4': kwargs['ShipAddress_Addr4']} + if 'ShipAddress_Addr5' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["ShipAddress"]={'Addr5': kwargs['ShipAddress_Addr5']} + if 'ShipAddress_City' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["ShipAddress"]={'City': kwargs['ShipAddress_City']} + if 'ShipAddress_State' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["ShipAddress"]={'State': kwargs['ShipAddress_State']} + if 'ShipAddress_PostalCode' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["ShipAddress"]={'PostalCode': kwargs['ShipAddress_PostalCode']} + if 'ShipAddress_Country' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["ShipAddress"]={'Country': kwargs['ShipAddress_Country']} + if 'ShipAddress_Note' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["ShipAddress"]={'Note': kwargs['ShipAddress_Note']} + + if 'IsPending' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["IsPending"]=kwargs['IsPending'] + if 'IsFinanceCharge' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["IsFinanceCharge"]=kwargs['IsFinanceCharge'] + if 'PONumber' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["PONumber"]=kwargs['PONumber'] + if 'TermsRef_ListID' in kwargs: + if 'TermsRef' in self.QBDict[self.classNameRq][self.__class__.__name__]: + self.QBDict[self.classNameRq][self.__class__.__name__]["TermsRef"]['ListID']= kwargs['TermsRef_ListID'] + else: + self.QBDict[self.classNameRq][self.__class__.__name__]["TermsRef"]={'ListID': kwargs['TermsRef_ListID']} + if 'TermsRef_FullName' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["TermsRef"]={'FullName': kwargs['TermsRef_FullName']} + + if 'DueDate' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["DueDate"]=kwargs['DueDate'] + if 'SalesRepRef_ListID' in kwargs: + if 'SalesRepRef' in self.QBDict[self.classNameRq][self.__class__.__name__]: + self.QBDict[self.classNameRq][self.__class__.__name__]["SalesRepRef"]['ListID']= kwargs['SalesRepRef_ListID'] + else: + self.QBDict[self.classNameRq][self.__class__.__name__]["SalesRepRef"]={'ListID': kwargs['SalesRepRef_ListID']} + if 'SalesRepRef_FullName' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["SalesRepRef"]={'FullName': kwargs['SalesRepRef_FullName']} + + if 'FOB' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["FOB"]=kwargs['FOB'] + if 'ShipDate' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["ShipDate"]=kwargs['ShipDate'] + if 'ShipMethodRef_ListID' in kwargs: + if 'ShipMethodRef' in self.QBDict[self.classNameRq][self.__class__.__name__]: + self.QBDict[self.classNameRq][self.__class__.__name__]["ShipMethodRef"]['ListID']= kwargs['ShipMethodRef_ListID'] + else: + self.QBDict[self.classNameRq][self.__class__.__name__]["ShipMethodRef"]={'ListID': kwargs['ShipMethodRef_ListID']} + if 'ShipMethodRef_FullName' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["ShipMethodRef"]={'FullName': kwargs['ShipMethodRef_FullName']} + + if 'ItemSalesTaxRef_ListID' in kwargs: + if 'ItemSalesTaxRef' in self.QBDict[self.classNameRq][self.__class__.__name__]: + self.QBDict[self.classNameRq][self.__class__.__name__]["ItemSalesTaxRef"]['ListID']= kwargs['ItemSalesTaxRef_ListID'] + else: + self.QBDict[self.classNameRq][self.__class__.__name__]["ItemSalesTaxRef"]={'ListID': kwargs['ItemSalesTaxRef_ListID']} + if 'ItemSalesTaxRef_FullName' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["ItemSalesTaxRef"]={'FullName': kwargs['ItemSalesTaxRef_FullName']} + + if 'IsManuallyClosed' in kwargs: #only SalesOrderAdd. not in InvoiceAdd + self.QBDict[self.classNameRq][self.__class__.__name__]["IsManuallyClosed"]=kwargs['IsManuallyClosed'] + if 'Memo' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["Memo"]=kwargs['Memo'] + if 'CustomerMsgRef_ListID' in kwargs: + if 'CustomerMsgRef' in self.QBDict[self.classNameRq][self.__class__.__name__]: + self.QBDict[self.classNameRq][self.__class__.__name__]["CustomerMsgRef"]['ListID']= kwargs['CustomerMsgRef_ListID'] + else: + self.QBDict[self.classNameRq][self.__class__.__name__]["CustomerMsgRef"]={'ListID': kwargs['CustomerMsgRef_ListID']} + if 'CustomerMsgRef_FullName' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["CustomerMsgRef"]={'FullName': kwargs['CustomerMsgRef_FullName']} + + if 'IsToBePrinted' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["IsToBePrinted"]=kwargs['IsToBePrinted'] + if 'IsToBeEmailed' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["IsToBeEmailed"]=kwargs['IsToBeEmailed'] + if 'IsTaxIncluded' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["IsTaxIncluded"]=kwargs['IsTaxIncluded'] + if 'CustomerSalesTaxCodeRef_ListID' in kwargs: + if 'CustomerSalesTaxCodeRef' in self.QBDict[self.classNameRq][self.__class__.__name__]: + self.QBDict[self.classNameRq][self.__class__.__name__]["CustomerSalesTaxCodeRef"]['ListID']= kwargs['CustomerSalesTaxCodeRef_ListID'] + else: + self.QBDict[self.classNameRq][self.__class__.__name__]["CustomerSalesTaxCodeRef"]={'ListID': kwargs['CustomerSalesTaxCodeRef_ListID']} + if 'CustomerSalesTaxCodeRef_FullName' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["CustomerSalesTaxCodeRef"]={'FullName': kwargs['CustomerSalesTaxCodeRef_FullName']} + + if 'Other' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["Other"]=kwargs['Other'] + if 'ExchangeRate' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["ExchangeRate"]=kwargs['ExchangeRate'] + if 'ExternalGUID' in kwargs: + self.QBDict[self.classNameRq][self.__class__.__name__]["ExternalGUID"]=kwargs['ExternalGUID'] + + # if 'LinkToTxnID' in kwargs: + # self.QBDict[self.classNameRq][self.__class__.__name__]["LinkToTxnID"]=makeAList(kwargs['LinkToTxnID']) + + # if 'SetCredit_CreditTxnID' in kwargs and 'SetCredit_AppliedAmount' in kwargs: + # self.QBDict[self.classNameRq][self.__class__.__name__]["SetCredit"]={'CreditTxnID':{'@useMacro':"MACROTYPE", '#text':kwargs['SetCredit_CreditTxnID']}, 'AppliedAmount': kwargs['SetCredit_AppliedAmount']} + # if 'SetCredit_Override' in kwargs: + # self.QBDict[self.classNameRq][self.__class__.__name__]["SetCredit"]["Override"]=kwargs['SetCredit_Override'] + + #add InvoiceLineAdd kwargs here + + self.SalesOrderLineAdd = [] + if 'SalesOrderLineAdd' in kwargs: + LineAdd = kwargs.get('SalesOrderLineAdd') + self.isLineAddOk = True + if isinstance(LineAdd, dict ): + LineAdd = [LineAdd] + elif isinstance(LineAdd, list): + pass + else: + self.isLineAddOk = False + + if self.isLineAddOk: #check if each instance in the list are all dictionary. + for eachLineAdd in LineAdd: + if not isinstance(eachLineAdd, dict): + self.isLineAddOk = False + break + else: + print("SalesOrderLineAdd Not OK. has to be lisst of dict or a dict") + + + if self.isLineAddOk: #if everything good + for eachLineAdd in LineAdd: + self.LineAddDict = {} + if 'ItemRef_ListID' in eachLineAdd: + if 'ItemRef' in self.QBDict[self.classNameRq][self.__class__.__name__]: + self.LineAddDict["ItemRef"]['ListID']= eachLineAdd['ItemRef_ListID'] + else: + self.LineAddDict["ItemRef"]={'ListID': eachLineAdd['ItemRef_ListID']} + if 'ItemRef_FullName' in eachLineAdd: + self.LineAddDict["ItemRef"]={'FullName': eachLineAdd['ItemRef_FullName']} + if 'Desc' in eachLineAdd: + self.LineAddDict["Desc"]=eachLineAdd['Desc'] + if 'Quantity' in eachLineAdd: + self.LineAddDict["Quantity"]=eachLineAdd['Quantity'] + if 'UnitOfMeasure' in eachLineAdd: + self.LineAddDict["UnitOfMeasure"]=eachLineAdd['UnitOfMeasure'] + if 'Rate' in eachLineAdd: + self.LineAddDict["Rate"]=eachLineAdd['Rate'] + elif 'RatePercent' in eachLineAdd: + self.LineAddDict["RatePercent"]=eachLineAdd['RatePercent'] + elif 'PriceLevelRef_ListID' in eachLineAdd: + if 'PriceLevelRef' in self.QBDict[self.classNameRq][self.__class__.__name__]: + self.LineAddDict["PriceLevelRef"]['ListID']= eachLineAdd['PriceLevelRef_ListID'] + else: + self.LineAddDict["PriceLevelRef"]={'ListID': eachLineAdd['PriceLevelRef_ListID']} + elif 'PriceLevelRef_FullName' in eachLineAdd: + self.LineAddDict["PriceLevelRef"]={'FullName': eachLineAdd['PriceLevelRef_FullName']} + + if 'Amount' in eachLineAdd: + self.LineAddDict["Amount"]=eachLineAdd['Amount'] + # Others + if 'Other1' in eachLineAdd: + self.LineAddDict["Other1"]=eachLineAdd['Other1'] + if len(self.LineAddDict)>0: + self.SalesOrderLineAdd.append(self.LineAddDict) + + #skip the rest, not too important + else: + print("SalesOrderLineAdd has to be list of dict or a dict") + print(f'{self.SalesOrderLineAdd = }') + if len(self.SalesOrderLineAdd)>0: + self.QBDict[self.classNameRq][self.__class__.__name__]['SalesOrderLineAdd']=self.SalesOrderLineAdd + if 'IncludeRetElement' in kwargs: + self.QBDict[self.classNameRq]["IncludeRetElement"]=kwargs['IncludeRetElement'] + + # print(self.classNameRq) + print(f'{self.QBDict = }') class SalesOrderQuery(baseQBQuery): @@ -381,65 +910,78 @@ class SalesOrderQuery(baseQBQuery): self.onError = "stopOnError" self.retName = 'SalesOrderRet' self.defaultFilterKey = "TxnID" + self.className = 'SalesOrderQuery' #Hardcoded because for check if self.__class__.__name__==self.className + self.classNameRq:str = self.__class__.__name__ + 'Rq' if 'debug' in kwargs and isinstance(kwargs['debug'], bool): self.class_debug=kwargs["debug"] - self.QBDict[self.__class__.__name__ + "Rq"]={} + self.QBDict[self.classNameRq]={} ### End Required Variable. can put ENUM list below this (eg: self.ENUM_GeneralSummaryReportQuery=[]) + # self.ENUM_DateMacro = ['All', 'Today', 'ThisWeek', 'ThisWeekToDate', 'ThisMonth', 'ThisMonthToDate', 'ThisCalendarQuarter', 'ThisCalendarQuarterToDate', 'ThisFiscalQuarter', + # 'ThisFiscalQuarterToDate', 'ThisCalendarYear', 'ThisCalendarYearToDate', 'ThisFiscalYear', 'ThisFiscalYearToDate', 'Yesterday', 'LastWeek', 'LastWeekToDate', 'LastMonth', + # 'LastMonthToDate', 'LastCalendarQuarter', 'LastCalendarQuarterToDate', 'LastFiscalQuarter', 'LastFiscalQuarterToDate', 'LastCalendarYear', 'LastCalendarYearToDate', + # 'LastFiscalYear', 'LastFiscalYearToDate', 'NextWeek', 'NextFourWeeks', 'NextMonth', 'NextCalendarQuarter', 'NextCalendarYear', 'NextFiscalQuarter', 'NextFiscalYear' + # ] + self.ENUM_MatchCriterion = ['StartsWith', 'Contains', 'EndsWith'] if 'TxnID' in kwargs and kwargs['TxnID'] and len(kwargs['TxnID'])>0: - self.QBDict[self.__class__.__name__ + "Rq"]["TxnID"]=kwargs['TxnID'] + self.QBDict[self.classNameRq]["TxnID"]=makeAList(kwargs['TxnID']) elif 'RefNumber' in kwargs and kwargs['RefNumber']: - self.QBDict[self.__class__.__name__ + "Rq"]["RefNumber"]=kwargs['RefNumber'] + self.QBDict[self.classNameRq]["RefNumber"]=makeAList(kwargs['RefNumber']) elif 'RefNumberCaseSensitive' in kwargs and kwargs['RefNumberCaseSensitive']: - self.QBDict[self.__class__.__name__ + "Rq"]["RefNumberCaseSensitive"]=kwargs['RefNumberCaseSensitive'] + self.QBDict[self.classNameRq]["RefNumberCaseSensitive"]=makeAList(kwargs['RefNumberCaseSensitive']) else: if 'MaxReturned' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["MaxReturned"]=kwargs['MaxReturned'] + self.QBDict[self.classNameRq]["MaxReturned"]=kwargs['MaxReturned'] if 'ModifiedDateRangeFilter_FromModifiedDate' in kwargs or 'ModifiedDateRangeFilter_ToModifiedDate' in kwargs: #if or then use {'key1':kwargs.get('key1',""), 'key2':kwargs.get('key2', "")} - self.QBDict[self.__class__.__name__ + "Rq"]["ModifiedDateRangeFilter"]={'FromModifiedDate':kwargs.get('ModifiedDateRangeFilter_FromModifiedDate', ""), 'ToModifiedDate':kwargs.get('ModifiedDateRangeFilter_ToModifiedDate', "")} + self.QBDict[self.classNameRq]["ModifiedDateRangeFilter"]={'FromModifiedDate':kwargs.get('ModifiedDateRangeFilter_FromModifiedDate', ""), 'ToModifiedDate':kwargs.get('ModifiedDateRangeFilter_ToModifiedDate', "")} elif 'TxnDateRangeFilter_FromTxnDate' in kwargs or 'TxnDateRangeFilter_ToTxnDate' in kwargs: #if or then use {'key1':kwargs.get('key1',""), 'key2':kwargs.get('key2', "")} - self.QBDict[self.__class__.__name__ + "Rq"]["TxnDateRangeFilter"]={'FromTxnDate':kwargs.get('TxnDateRangeFilter_FromTxnDate', ""), 'ToTxnDate':kwargs.get('TxnDateRangeFilter_ToTxnDate', "")} + self.QBDict[self.classNameRq]["TxnDateRangeFilter"]={'FromTxnDate':kwargs.get('TxnDateRangeFilter_FromTxnDate', ""), 'ToTxnDate':kwargs.get('TxnDateRangeFilter_ToTxnDate', "")} elif 'TxnDateRangeFilter_DateMacro' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["TxnDateRangeFilter"]={'DateMacro':kwargs['TxnDateRangeFilter_DateMacro']} + DM=cleanIncludeRetElements(ENUM_DateMacro, kwargs['TxnDateRangeFilter_DateMacro']) + if len(DM)>0: + self.QBDict[self.classNameRq]["TxnDateRangeFilter"]={'DateMacro':DM} if 'EntityFilter_ListID' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["EntityFilter"]={'ListID':kwargs['EntityFilter_ListID']} + self.QBDict[self.classNameRq]["EntityFilter"]={'ListID':makeAList(kwargs['EntityFilter_ListID'])} elif 'EntityFilter_FullName' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["EntityFilter"]={'FullName':kwargs['EntityFilter_FullName']} + self.QBDict[self.classNameRq]["EntityFilter"]={'FullName':makeAList(kwargs['EntityFilter_FullName'])} elif 'EntityFilter_ListIDWithChildren' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["EntityFilter"]={'ListIDWithChildren':kwargs['EntityFilter_ListIDWithChildren']} + self.QBDict[self.classNameRq]["EntityFilter"]={'ListIDWithChildren':kwargs['EntityFilter_ListIDWithChildren']} elif 'EntityFilter_FullNameWithChildren' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["EntityFilter"]={'FullNameWithChildren':kwargs['EntityFilter_FullNameWithChildren']} + self.QBDict[self.classNameRq]["EntityFilter"]={'FullNameWithChildren':kwargs['EntityFilter_FullNameWithChildren']} if 'RefNumberFilter_MatchCriterion' in kwargs and 'RefNumberFilter_RefNumber' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["RefNumberFilter"]={'MatchCriterion':kwargs['RefNumberFilter_MatchCriterion', 'RefNumber':kwargs['RefNumberFilter_RefNumber']]} + RNFMC = cleanIncludeRetElements(self.ENUM_MatchCriterion, kwargs['RefNumberFilter_MatchCriterion']) + if len(RNFMC)>0: + self.QBDict[self.classNameRq]["RefNumberFilter"]={'MatchCriterion':RNFMC, 'RefNumber':kwargs['RefNumberFilter_RefNumber']} elif 'RefNumberRangeFilter_FromRefNumber' in kwargs or 'RefNumberRangeFilter_ToRefNumber' in kwargs: #if or then use {'key1':kwargs.get('key1',""), 'key2':kwargs.get('key2', "")} - self.QBDict[self.__class__.__name__ + "Rq"]["RefNumberRangeFilter"]={'FromRefNumber':kwargs.get('RefNumberRangeFilter_FromRefNumber', ""), 'ToRefNumber':kwargs.get('RefNumberRangeFilter_ToRefNumber', "")} + self.QBDict[self.classNameRq]["RefNumberRangeFilter"]={'FromRefNumber':kwargs.get('RefNumberRangeFilter_FromRefNumber', ""), 'ToRefNumber':kwargs.get('RefNumberRangeFilter_ToRefNumber', "")} if 'CurrencyFilter_ListID' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["CurrencyFilter"]=kwargs['CurrencyFilter_ListID'] + self.QBDict[self.classNameRq]["CurrencyFilter"]=makeAList(kwargs['CurrencyFilter_ListID']) elif 'CurrencyFilter_FullName' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["CurrencyFilter"]=kwargs['CurrencyFilter_FullName'] + self.QBDict[self.classNameRq]["CurrencyFilter"]=makeAList(kwargs['CurrencyFilter_FullName']) if 'IncludeLineItems' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["IncludeLineItems"]=kwargs['IncludeLineItems'] + self.QBDict[self.classNameRq]["IncludeLineItems"]=kwargs['IncludeLineItems'] if 'IncludeLinkedTxns' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["IncludeLinkedTxns"]=kwargs['IncludeLinkedTxns'] + self.QBDict[self.classNameRq]["IncludeLinkedTxns"]=kwargs['IncludeLinkedTxns'] if 'IncludeRetElement' in kwargs: IRE = cleanIncludeRetElements(self.includeRetElements_allowed, kwargs["IncludeRetElement"]) # IRE->IncludeRetElements cleaned version print(f"{IRE = }") if len(IRE)>0: if self.defaultFilterKey not in IRE: # defaultFilterKey is for BaseClass.count() eg: after instantiate, then print obj.count() IRE.append(self.defaultFilterKey) - self.QBDict[self.__class__.__name__ + "Rq"]["IncludeRetElement"]=IRE + self.QBDict[self.classNameRq]["IncludeRetElement"]=IRE if 'OwnerID' in kwargs: # usually value=0 to get to DataExtRet (additional data) - self.QBDict[self.__class__.__name__ + "Rq"]["OwnerID"]=kwargs['OwnerID'] + self.QBDict[self.classNameRq]["OwnerID"]=kwargs['OwnerID'] - # print(self.__class__.__name__ + "Rq") - # print(self.QBDict) - self.runCheck() ### running the qbxml connection to get data ### + # print(self.classNameRq) + print(self.QBDict) + if self.__class__.__name__==self.className: + self.runCheck() ### running the qbxml connection to get data ### class InvoiceQuery(baseQBQuery): @@ -459,79 +1001,92 @@ class InvoiceQuery(baseQBQuery): self.onError = "stopOnError" self.retName = 'InvoiceRet' self.defaultFilterKey = "TxnID" + self.className = 'InvoiceQuery' + self.classNameRq:str = self.__class__.__name__ + 'Rq' if 'debug' in kwargs and isinstance(kwargs['debug'], bool): self.class_debug=kwargs["debug"] - self.QBDict[self.__class__.__name__ + "Rq"]={} + self.QBDict[self.classNameRq]={} ### End Required Variable. can put ENUM list below this (eg: self.ENUM_GeneralSummaryReportQuery=[]) + # self.ENUM_DateMacro = ['All', 'Today', 'ThisWeek', 'ThisWeekToDate', 'ThisMonth', 'ThisMonthToDate', 'ThisCalendarQuarter', 'ThisCalendarQuarterToDate', 'ThisFiscalQuarter', + # 'ThisFiscalQuarterToDate', 'ThisCalendarYear', 'ThisCalendarYearToDate', 'ThisFiscalYear', 'ThisFiscalYearToDate', 'Yesterday', 'LastWeek', 'LastWeekToDate', 'LastMonth', + # 'LastMonthToDate', 'LastCalendarQuarter', 'LastCalendarQuarterToDate', 'LastFiscalQuarter', 'LastFiscalQuarterToDate', 'LastCalendarYear', 'LastCalendarYearToDate', + # 'LastFiscalYear', 'LastFiscalYearToDate', 'NextWeek', 'NextFourWeeks', 'NextMonth', 'NextCalendarQuarter', 'NextCalendarYear', 'NextFiscalQuarter', 'NextFiscalYear' + # ] ## disabled, and move to outside class, on top of page + self.ENUM_MatchCriterion = ['StartsWith', 'Contains', 'EndsWith'] - if 'TxnID' in kwargs and kwargs['TxnID']: + if 'TxnID' in kwargs and kwargs['TxnID'] and len(kwargs['TxnID'])>0: _txnIDs=makeAList(kwargs['TxnID']) - self.QBDict[self.__class__.__name__ + "Rq"]["TxnID"]= makeAList(kwargs['TxnID']) + self.QBDict[self.classNameRq]["TxnID"]= makeAList(kwargs['TxnID']) elif 'RefNumber' in kwargs and kwargs['RefNumber']: - self.QBDict[self.__class__.__name__ + "Rq"]['RefNumber']=makeAList(kwargs['RefNumber']) + self.QBDict[self.classNameRq]['RefNumber']=makeAList(kwargs['RefNumber']) elif 'RefNumberCaseSensitive' in kwargs and kwargs['RefNumberCaseSensitive']: - self.QBDict[self.__class__.__name__ + "Rq"]["RefNumberCaseSensitive"]=makeAList(kwargs['RefNumberCaseSensitive']) + self.QBDict[self.classNameRq]["RefNumberCaseSensitive"]=makeAList(kwargs['RefNumberCaseSensitive']) else: if 'MaxReturned' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["MaxReturned"]=kwargs['MaxReturned'] + self.QBDict[self.classNameRq]["MaxReturned"]=kwargs['MaxReturned'] if 'ModifiedDateRangeFilter_FromModifiedDate' in kwargs or 'ModifiedDateRangeFilter_ToModifiedDate' in kwargs: #if or then use {'key1':kwargs.get('key1',""), 'key2':kwargs.get('key2', "")} - self.QBDict[self.__class__.__name__ + "Rq"]["ModifiedDateRangeFilter"]={'FromModifiedDate':kwargs.get('ModifiedDateRangeFilter_FromModifiedDate', ""), 'ToModifiedDate':kwargs.get('ModifiedDateRangeFilter_ToModifiedDate', "")} + self.QBDict[self.classNameRq]["ModifiedDateRangeFilter"]={'FromModifiedDate':kwargs.get('ModifiedDateRangeFilter_FromModifiedDate', ""), 'ToModifiedDate':kwargs.get('ModifiedDateRangeFilter_ToModifiedDate', "")} elif 'TxnDateRangeFilter_FromTxnDate' in kwargs or 'TxnDateRangeFilter_ToTxnDate' in kwargs: #if or then use {'key1':kwargs.get('key1',""), 'key2':kwargs.get('key2', "")} - self.QBDict[self.__class__.__name__ + "Rq"]["TxnDateRangeFilter"]={'FromTxnDate':kwargs.get('TxnDateRangeFilter_FromTxnDate', ""), 'ToTxnDate':kwargs.get('TxnDateRangeFilter_ToTxnDate', "")} + self.QBDict[self.classNameRq]["TxnDateRangeFilter"]={'FromTxnDate':kwargs.get('TxnDateRangeFilter_FromTxnDate', ""), 'ToTxnDate':kwargs.get('TxnDateRangeFilter_ToTxnDate', "")} elif 'TxnDateRangeFilter_DateMacro' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["TxnDateRangeFilter"]={'DateMacro':kwargs['TxnDateRangeFilter_DateMacro']} + DM=cleanIncludeRetElements(ENUM_DateMacro, kwargs['TxnDateRangeFilter_DateMacro']) + if len(DM)>0: + self.QBDict[self.classNameRq]["TxnDateRangeFilter"]={'DateMacro':DM} if 'EntityFilter_ListID' in kwargs: - # self.QBDict[self.__class__.__name__ + "Rq"]["EntityFilter"]={'ListID':kwargs['EntityFilter_ListID']} - self.QBDict[self.__class__.__name__ + "Rq"]['EntityFilter']={'ListID':makeAList(kwargs['EntityFilter_ListID'])} + # self.QBDict[self.classNameRq]["EntityFilter"]={'ListID':kwargs['EntityFilter_ListID']} + self.QBDict[self.classNameRq]['EntityFilter']={'ListID':makeAList(kwargs['EntityFilter_ListID'])} elif 'EntityFilter_FullName' in kwargs: - # self.QBDict[self.__class__.__name__ + "Rq"]["EntityFilter"]={'FullName':kwargs['EntityFilter_FullName']} - self.QBDict[self.__class__.__name__ + "Rq"]['EntityFilter']={'FullName':makeAList(kwargs['EntityFilter_FullName'])} + # self.QBDict[self.classNameRq]["EntityFilter"]={'FullName':kwargs['EntityFilter_FullName']} + self.QBDict[self.classNameRq]['EntityFilter']={'FullName':makeAList(kwargs['EntityFilter_FullName'])} elif 'EntityFilter_ListIDWithChildren' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["EntityFilter"]={'ListIDWithChildren':kwargs['EntityFilter_ListIDWithChildren']} + self.QBDict[self.classNameRq]["EntityFilter"]={'ListIDWithChildren':kwargs['EntityFilter_ListIDWithChildren']} elif 'EntityFilter_FullNameWithChildren' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["EntityFilter"]={'FullNameWithChildren':kwargs['EntityFilter_FullNameWithChildren']} + self.QBDict[self.classNameRq]["EntityFilter"]={'FullNameWithChildren':kwargs['EntityFilter_FullNameWithChildren']} if 'AccountFilter_ListID' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["AccountFilter"]={'ListID':makeAList(kwargs['AccountFilter_ListID'])} + self.QBDict[self.classNameRq]["AccountFilter"]={'ListID':makeAList(kwargs['AccountFilter_ListID'])} elif 'AccountFilter_FullName' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["AccountFilter"]={'FullName':makeAList(kwargs['AccountFilter_FullName'])} + self.QBDict[self.classNameRq]["AccountFilter"]={'FullName':makeAList(kwargs['AccountFilter_FullName'])} elif 'AccountFilter_ListIDWithChildren' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["AccountFilter"]={'ListIDWithChildren':kwargs['AccountFilter_ListIDWithChildren']} + self.QBDict[self.classNameRq]["AccountFilter"]={'ListIDWithChildren':kwargs['AccountFilter_ListIDWithChildren']} elif 'AccountFilter_FullNameWithChildren' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["AccountFilter"]={'FullNameWithChildren':kwargs['AccountFilter_FullNameWithChildren']} + self.QBDict[self.classNameRq]["AccountFilter"]={'FullNameWithChildren':kwargs['AccountFilter_FullNameWithChildren']} if 'RefNumberFilter_MatchCriterion' in kwargs and 'RefNumberFilter_RefNumber' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["RefNumberFilter"]={'MatchCriterion':kwargs['RefNumberFilter_MatchCriterion', 'RefNumber':kwargs['RefNumberFilter_RefNumber']]} + RNFMC = cleanIncludeRetElements(self.ENUM_MatchCriterion, kwargs['RefNumberFilter_MatchCriterion']) + if len(RNFMC)>0: + self.QBDict[self.classNameRq]["RefNumberFilter"]={'MatchCriterion':RNFMC, 'RefNumber':kwargs['RefNumberFilter_RefNumber']} elif 'RefNumberRangeFilter_FromRefNumber' in kwargs or 'RefNumberRangeFilter_ToRefNumber' in kwargs: #if or then use {'key1':kwargs.get('key1',""), 'key2':kwargs.get('key2', "")} ##### CAREFULL with the get() coz "" will get anything - self.QBDict[self.__class__.__name__ + "Rq"]["RefNumberRangeFilter"]={'FromRefNumber':kwargs.get('RefNumberRangeFilter_FromRefNumber', ""), 'ToRefNumber':kwargs.get('RefNumberRangeFilter_ToRefNumber', "")} + self.QBDict[self.classNameRq]["RefNumberRangeFilter"]={'FromRefNumber':kwargs.get('RefNumberRangeFilter_FromRefNumber', ""), 'ToRefNumber':kwargs.get('RefNumberRangeFilter_ToRefNumber', "")} if 'CurrencyFilter_ListID' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["CurrencyFilter"]=kwargs['CurrencyFilter_ListID'] + self.QBDict[self.classNameRq]["CurrencyFilter"]=makeAList(kwargs['CurrencyFilter_ListID']) elif 'CurrencyFilter_FullName' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["CurrencyFilter"]=kwargs['CurrencyFilter_FullName'] + self.QBDict[self.classNameRq]["CurrencyFilter"]=makeAList(kwargs['CurrencyFilter_FullName']) if 'IncludeLineItems' in kwargs: print(f'{self.QBDict} = ') - self.QBDict[self.__class__.__name__ + "Rq"]["IncludeLineItems"]=kwargs['IncludeLineItems'] + self.QBDict[self.classNameRq]["IncludeLineItems"]=kwargs['IncludeLineItems'] if 'IncludeLinkedTxns' in kwargs: - self.QBDict[self.__class__.__name__ + "Rq"]["IncludeLinkedTxns"]=kwargs['IncludeLinkedTxns'] + self.QBDict[self.classNameRq]["IncludeLinkedTxns"]=kwargs['IncludeLinkedTxns'] if 'IncludeRetElement' in kwargs: IRE = cleanIncludeRetElements(self.includeRetElements_allowed, kwargs["IncludeRetElement"]) # IRE->IncludeRetElements cleaned version print(f"{IRE = }") if len(IRE)>0: if self.defaultFilterKey not in IRE: # defaultFilterKey is for BaseClass.count() eg: after instantiate, then print obj.count() IRE.append(self.defaultFilterKey) - self.QBDict[self.__class__.__name__ + "Rq"]["IncludeRetElement"]=IRE + self.QBDict[self.classNameRq]["IncludeRetElement"]=IRE if 'OwnerID' in kwargs: # usually value=0 to get to DataExtRet (additional data) - self.QBDict[self.__class__.__name__ + "Rq"]["OwnerID"]=kwargs['OwnerID'] - - # print(self.__class__.__name__ + "Rq") + self.QBDict[self.classNameRq]["OwnerID"]=kwargs['OwnerID'] + # print(self.classNameRq) # print(self.QBDict) - self.runCheck() ### running the qbxml connection to get data ### + if self.__class__.__name__==self.className: + self.runCheck() ### running the qbxml connection to get data ### + if __name__ == "__main__": @@ -544,8 +1099,8 @@ if __name__ == "__main__": @timing def salesorderquery(): - g=SalesOrderQuery(debug=False, MaxReturned = None, TxnID=None, IncludeLineItems="true", IncludeLinkedTxns="true", - RefNumber="24010022" )#"B23070857") + g=SalesOrderQuery(debug=False, MaxReturned = 1, TxnID=None, IncludeLineItems="true", IncludeLinkedTxns="true", + )#RefNumber="24010022" )#"B23070857") print(json.dumps(g.filter().all(), indent=3)) print(g.count()) @@ -663,12 +1218,12 @@ if __name__ == "__main__": print(recursiveDict(varDict, f, enumDict)) f.close - invoicequery() - # salesorderquery() + # invoicequery() + salesorderquery() # transactionquery() # main() # iteminventoryquery() # customerquery() # readxmltodict() - - + # g=SalesOrderQuery(MaxReturned=1) + # print(len(None)) diff --git a/SalesOrderAdd.xml b/SalesOrderAdd.xml new file mode 100644 index 0000000..43cdbc8 --- /dev/null +++ b/SalesOrderAdd.xml @@ -0,0 +1,435 @@ + + + + + + + + IDTYPE + STRTYPE + + + IDTYPE + STRTYPE + + + IDTYPE + STRTYPE + + DATETYPE + STRTYPE + + STRTYPE + STRTYPE + STRTYPE + STRTYPE + STRTYPE + STRTYPE + STRTYPE + STRTYPE + STRTYPE + STRTYPE + + + STRTYPE + STRTYPE + STRTYPE + STRTYPE + STRTYPE + STRTYPE + STRTYPE + STRTYPE + STRTYPE + STRTYPE + + STRTYPE + + IDTYPE + STRTYPE + + DATETYPE + + IDTYPE + STRTYPE + + STRTYPE + DATETYPE + + IDTYPE + STRTYPE + + + IDTYPE + STRTYPE + + BOOLTYPE + STRTYPE + + IDTYPE + STRTYPE + + BOOLTYPE + BOOLTYPE + BOOLTYPE + + IDTYPE + STRTYPE + + STRTYPE + FLOATTYPE + GUIDTYPE + + + + IDTYPE + STRTYPE + + STRTYPE + QUANTYPE + STRTYPE + + PRICETYPE + + PERCENTTYPE + + + IDTYPE + STRTYPE + + + + IDTYPE + STRTYPE + + AMTTYPE + + ENUMTYPE + + IDTYPE + STRTYPE + + + IDTYPE + STRTYPE + + + STRTYPE + + STRTYPE + + + IDTYPE + STRTYPE + + BOOLTYPE + STRTYPE + STRTYPE + + GUIDTYPE + STRTYPE + STRTYPE + + + + + + IDTYPE + STRTYPE + + QUANTYPE + STRTYPE + + IDTYPE + STRTYPE + + + IDTYPE + STRTYPE + + + GUIDTYPE + STRTYPE + STRTYPE + + + ENUMTYPE + STRTYPE + STRTYPE + + + STRTYPE + + + + + IDTYPE + DATETIMETYPE + DATETIMETYPE + STRTYPE + INTTYPE + + IDTYPE + STRTYPE + + + IDTYPE + STRTYPE + + + IDTYPE + STRTYPE + + DATETYPE + STRTYPE + + STRTYPE + STRTYPE + STRTYPE + STRTYPE + STRTYPE + STRTYPE + STRTYPE + STRTYPE + STRTYPE + STRTYPE + + + STRTYPE + STRTYPE + STRTYPE + STRTYPE + STRTYPE + + + STRTYPE + STRTYPE + STRTYPE + STRTYPE + STRTYPE + STRTYPE + STRTYPE + STRTYPE + STRTYPE + STRTYPE + + + STRTYPE + STRTYPE + STRTYPE + STRTYPE + STRTYPE + + STRTYPE + + IDTYPE + STRTYPE + + DATETYPE + + IDTYPE + STRTYPE + + STRTYPE + DATETYPE + + IDTYPE + STRTYPE + + AMTTYPE + + IDTYPE + STRTYPE + + PERCENTTYPE + AMTTYPE + AMTTYPE + + IDTYPE + STRTYPE + + FLOATTYPE + AMTTYPE + BOOLTYPE + BOOLTYPE + STRTYPE + + IDTYPE + STRTYPE + + BOOLTYPE + BOOLTYPE + BOOLTYPE + + IDTYPE + STRTYPE + + STRTYPE + GUIDTYPE + + IDTYPE + + ENUMTYPE + DATETYPE + STRTYPE + + ENUMTYPE + AMTTYPE + + + + IDTYPE + + IDTYPE + STRTYPE + + STRTYPE + QUANTYPE + STRTYPE + + IDTYPE + STRTYPE + + + PRICETYPE + + PERCENTTYPE + + + IDTYPE + STRTYPE + + AMTTYPE + + IDTYPE + STRTYPE + + + IDTYPE + STRTYPE + + + STRTYPE + + STRTYPE + + STRTYPE + + IDTYPE + STRTYPE + + QUANTYPE + BOOLTYPE + STRTYPE + STRTYPE + + GUIDTYPE + STRTYPE + + ENUMTYPE + STRTYPE + + + + + IDTYPE + + IDTYPE + STRTYPE + + STRTYPE + QUANTYPE + STRTYPE + + IDTYPE + STRTYPE + + BOOLTYPE + AMTTYPE + + IDTYPE + + IDTYPE + STRTYPE + + STRTYPE + QUANTYPE + STRTYPE + + IDTYPE + STRTYPE + + + PRICETYPE + + PERCENTTYPE + + + IDTYPE + STRTYPE + + AMTTYPE + + IDTYPE + STRTYPE + + + IDTYPE + STRTYPE + + + STRTYPE + + STRTYPE + + STRTYPE + + IDTYPE + STRTYPE + + QUANTYPE + BOOLTYPE + STRTYPE + STRTYPE + + GUIDTYPE + STRTYPE + + ENUMTYPE + STRTYPE + + + + GUIDTYPE + STRTYPE + + ENUMTYPE + STRTYPE + + ENUMTYPE + STRTYPE + STRTYPE + + + + GUIDTYPE + STRTYPE + + ENUMTYPE + STRTYPE + + + + + IDTYPE + + GUIDTYPE + + IDTYPE + + INTTYPE + STRTYPE + GUIDTYPE + + + + diff --git a/addSO.py b/addSO.py new file mode 100644 index 0000000..94db330 --- /dev/null +++ b/addSO.py @@ -0,0 +1,50 @@ +from QBClasses import SalesOrderQuery, InvoiceQuery, TransactionQuery, InvoiceAdd, SalesOrderAdd +from utils import timing, makeAList, makeLinkedTxnList, prepareData +from pprint import pprint, PrettyPrinter +import datetime + +import xmltodict + +def addSO(data:dict)->bool: + CustomerRef_FullName=data.get('CustomerRef_FullName', None) + TemplateRef_FullName=data.get('TemplateRef_FullName', None) + TxnDate=data.get('TxnDate', None) #default today + RefNumber=data.get('RefNumber', None) + ShipAddress=data.get('ShipAddress', None) + PONumber=data.get('PONumber', None) + Memo=data.get('Memo', None) + IsToBePrint=False #default False + IsToBeEmail=False #default False + + SalesOrderLineAdd:list[dict]=data.get('SalesOrderLineAdd', []) + for SOLine in SalesOrderLineAdd: + ItemRef_FullName=SOLine.get('ItemRef_FullName', None) + Quantity=SOLine.get('Quantity', None) + UnitOfMeasure=SOLine.get('UnitOfMeasure', None) + +def main(): + data = {'CustomerRef_FullName': '999 HPL', 'RefNumber':'Ref12345'} + lineAdd = [{'ItemRef_FullName':'TACO:AA:TH-006AA', 'Quantity':5, 'Rate':1200}, {'ItemRef_FullName':'TACO:J_FC:TH-807J','Other1':"my reftoother1", 'Quantity':1, 'Rate':5500}] + # lineAdd = {'ItemRef_FullName':'Item123', 'Quantity':5, 'Rate':1200}#, {'ItemRef_FullName':'Item23A', 'Quantity':1, 'Rate':5500} + data['SalesOrderLineAdd']=lineAdd + print("") + print('this is the format to ADD SO or INV') + pprint(data) + print("") + soAdd = SalesOrderAdd(**data) + # print(f'{soAdd = }') + print(soAdd.__repr__) + +def test_preparedata(): + print("Test Preparedata") + data = '''order: Sumber rejeki\n + TH-001AA : 4 :Kirim Krian\n + ECO-016= 7\n + ''' + prepareData(data) +if __name__=='__main__': + test_preparedata() + # data={'root':data} + # print(f'{data = }') + # QBXML = xmltodict.unparse(data, pretty=True).replace("", "")#.replace(f'version="{version}"', f'version="{version}"?') + # print(QBXML) \ No newline at end of file diff --git a/save_data.py b/save_data.py index a49b7c5..c4a2fd1 100644 --- a/save_data.py +++ b/save_data.py @@ -22,7 +22,7 @@ def main(): ] refNumbers_listofdict= [{'RefNumber': '0099'}, {'RefNumber': '0100'}, {'RefNumber': '0103'}] refNumbers_list= makeAList(refNumbers_listofdict,dictvalue=True, listofdict=True) - print(refNumbers_list) + print(f'{refNumbers_list = }') # invQ = InvoiceQuery(**{'debug':False, 'MaxReturned':1, 'RefNumber':refNumbers_list, 'IncludeLineItems':'true', 'IncludeLinkedTxns':'true', 'IncludeRetElements':IncludeRetElements})#, 'OwnerID':0} ) invQ = InvoiceQuery(**{'debug':False, 'MaxReturned':1, 'IncludeLineItems':'true', 'IncludeLinkedTxns':'true', 'IncludeRetElement':IncludeRetElements})#, 'OwnerID':0} ) @@ -126,4 +126,12 @@ def main(): if __name__=='__main__': + # main() + if True: print("trueeee"); print("again") + print("before") if True else 0 + d={'a':""} + if d['a']: + print("Ada") + else: + print('Tak ada') main() \ No newline at end of file diff --git a/server.py b/server.py index 37c64c9..7a238ec 100644 --- a/server.py +++ b/server.py @@ -40,6 +40,11 @@ class baseQBQuery: self.statusMessage = "" self.statusSeverity = "" self.statusOk = False + if self.__class__.__name__=="baseQBQuery": + print("baseqbquey same with classname") + else: + print("accessed from child class") + print("basequery is accessed from ", self.__class__.__name__ + "Rq") # @timing def create_QBXML(self): diff --git a/utils.py b/utils.py index a37c890..2b4aba1 100644 --- a/utils.py +++ b/utils.py @@ -3,6 +3,59 @@ from time import time from typing import Union +def getItemFullName(shortItem:str)->str: + # def searchitem(SearchItem = '001aba', QTY = 0, dbTable="itemlist", column="FullName"): + FullName = shortItem + return FullName + +def getCustomerFullName(shortCustomerName:str)->str: + # def searchitem(SearchItem = '001aba', QTY = 0, dbTable="itemlist", column="FullName"): + FullName = shortCustomerName + return FullName + +def getRefNumber()->str: + return "refnumber345" + +def prepareData(dt:str): + dtLines = dt.strip().split('\n') + smoothdtLines:list[str] = [] + for dtLine in dtLines: + if dtLine.strip()=='': + continue + smoothdtLines.append(dtLine) + for smIdx, smdtLine in enumerate(smoothdtLines): + itemName, Qty, memoLine = ('', '', '') + if smIdx==0 and ':' in smdtLine: + CustomerName = smdtLine.split(':')[1].strip() + CustomerRef_FullName = getCustomerFullName(CustomerName) + RefNumber = getRefNumber() + continue + elif smIdx==0 and ':' not in smdtLine: + return False + else: #proccess the second till end lines + for splitChar in [':', '=']: + if splitChar in smdtLine: + objects = smdtLine.split(splitChar) + if len(objects)==2: + itemName, Qty = tuple(smdtLine.split(splitChar)) + if len(objects)==3: + itemName, Qty, memoLine = tuple(smdtLine.split(splitChar)) + break + itemName = itemName.strip() + Qty=Qty.strip() + memoLine = memoLine.strip() + print(CustomerRef_FullName, RefNumber, itemName, Qty, memoLine) + ItemRef_FullName = getItemFullName(itemName) + + if memoLine: + print(memoLine) + else: + print("no memo") + + + + + def makeLinkedTxnList(x:list, key:str=None)->list: txnIDs=[] if isinstance(x, dict): @@ -63,7 +116,11 @@ def timing(f): return wrap -def cleanIncludeRetElements(includeRetElements_allowed:list, includeRetElements:list): +def cleanIncludeRetElements(includeRetElements_allowed:list, includeRetElements:Union[list, str], default_val:str=None): + if default_val==None: + default_val = [] + # else: + # default = [default] iREs = [] # print(f'{includeRetElements_allowed = }\n{includeRetElements = }') if isinstance(includeRetElements, str): #if user put 1 str argument in IncludeRetElements, change it to list @@ -73,7 +130,10 @@ def cleanIncludeRetElements(includeRetElements_allowed:list, includeRetElements: if iRE.lower() == iRE_a.lower(): iREs.append(iRE_a) break - return iREs + if len(iREs)>0: + return iREs + else: + return [default_val] if __name__=='__main__': #Example makelist