add invoice class ability to input a list. other class not yet

This commit is contained in:
bcomsugi 2024-07-26 02:52:39 +07:00
parent 26e1cd2bbc
commit a7a1c6528d
3 changed files with 177 additions and 9 deletions

View File

@ -2,7 +2,7 @@ from server import baseQBQuery, timing
import pprint import pprint
import timeit import timeit
import xml.dom.minidom import xml.dom.minidom
from utils import timing, cleanIncludeRetElements from utils import timing, cleanIncludeRetElements, makeAList
import json import json
# from functools import wraps # from functools import wraps
@ -374,7 +374,7 @@ class SalesOrderQuery(baseQBQuery):
### Required Variable ### Required Variable
self.includeRetElements_allowed = ["TxnID", "TimeCreated", "TimeModified", "EditSequence", "TxnNumber", "CustomerRef", "ClassRef", "TemplateRef", self.includeRetElements_allowed = ["TxnID", "TimeCreated", "TimeModified", "EditSequence", "TxnNumber", "CustomerRef", "ClassRef", "TemplateRef",
"TxnDate", "RefNumber", "BillAddress", "BillAddressBlock", "ShipAddress", "ShipAddressBlock", "PONumber,", "TermsRef", "DueDate", "TxnDate", "RefNumber", "BillAddress", "BillAddressBlock", "ShipAddress", "ShipAddressBlock", "PONumber,", "TermsRef", "DueDate",
"SalesRefRef", "FOB", "ShipDate", "ShipMethodRef", "SubTotal", "ItemSalesTaxRef", "SalesTaxPercentage", "SalesTaxTotal", "TotalAmount", "SalesRepRef", "FOB", "ShipDate", "ShipMethodRef", "SubTotal", "ItemSalesTaxRef", "SalesTaxPercentage", "SalesTaxTotal", "TotalAmount",
"CurrencyRef", "ExchangeRate", "TotalAmountInHomeCurrency", "IsManuallyClosed", "IsFullyInvoiced", "Memo", "CustomerMsgRef", "IsToBePrinted", "CurrencyRef", "ExchangeRate", "TotalAmountInHomeCurrency", "IsManuallyClosed", "IsFullyInvoiced", "Memo", "CustomerMsgRef", "IsToBePrinted",
"IsToBeEmailed", "IsTaxIncluded", "CustomerSalesTaxCodeRef", "Other", "ExternalGUID", "LinkedTxn", "SalesOrderLineRet", "SalesOrderLineGroupRet" "IsToBeEmailed", "IsTaxIncluded", "CustomerSalesTaxCodeRef", "Other", "ExternalGUID", "LinkedTxn", "SalesOrderLineRet", "SalesOrderLineGroupRet"
] ]
@ -387,11 +387,11 @@ class SalesOrderQuery(baseQBQuery):
self.QBDict[self.__class__.__name__ + "Rq"]={} self.QBDict[self.__class__.__name__ + "Rq"]={}
### End Required Variable. can put ENUM list below this (eg: self.ENUM_GeneralSummaryReportQuery=[]) ### End Required Variable. can put ENUM list below this (eg: self.ENUM_GeneralSummaryReportQuery=[])
if 'TxnID' in kwargs: if 'TxnID' in kwargs and kwargs['TxnID']:
self.QBDict[self.__class__.__name__ + "Rq"]["TxnID"]=kwargs['TxnID'] self.QBDict[self.__class__.__name__ + "Rq"]["TxnID"]=kwargs['TxnID']
elif 'RefNumber' in kwargs: elif 'RefNumber' in kwargs and kwargs['RefNumber']:
self.QBDict[self.__class__.__name__ + "Rq"]["RefNumber"]=kwargs['RefNumber'] self.QBDict[self.__class__.__name__ + "Rq"]["RefNumber"]=kwargs['RefNumber']
elif 'RefNumberCaseSensitive' in kwargs: elif 'RefNumberCaseSensitive' in kwargs and kwargs['RefNumberCaseSensitive']:
self.QBDict[self.__class__.__name__ + "Rq"]["RefNumberCaseSensitive"]=kwargs['RefNumberCaseSensitive'] self.QBDict[self.__class__.__name__ + "Rq"]["RefNumberCaseSensitive"]=kwargs['RefNumberCaseSensitive']
else: else:
if 'MaxReturned' in kwargs: if 'MaxReturned' in kwargs:
@ -442,12 +442,113 @@ class SalesOrderQuery(baseQBQuery):
self.runCheck() ### running the qbxml connection to get data ### self.runCheck() ### running the qbxml connection to get data ###
class InvoiceQuery(baseQBQuery):
def __init__(self, *args, **kwargs):
print(f'{args = }')
print(f'{kwargs = }')
super().__init__(*args, **kwargs)
### Required Variable
self.includeRetElements_allowed = ["TxnID", "TimeCreated", "TimeModified", "EditSequence", "TxnNumber", "CustomerRef", "ClassRef", "ARAccountRef", "TemplateRef",
"TxnDate", "RefNumber", "BillAddress", "BillAddressBlock", "ShipAddress", "ShipAddressBlock", "IsPending", "IsFinanceCharge", "PONumber,", "TermsRef", "DueDate",
"SalesRepRef", "FOB", "ShipDate", "ShipMethodRef", "SubTotal", "ItemSalesTaxRef", "SalesTaxPercentage", "SalesTaxTotal", "AppliedAmount", "BalanceRemaining",
"CurrencyRef", "ExchangeRate", "BalanceRemainingInHomeCurrency", "Memo", "IsPaid", "CustomerMsgRef", "IsToBePrinted",
"IsToBeEmailed", "IsTaxIncluded", "CustomerSalesTaxCodeRef", "SuggestedDiscountAmount", "SuggestedDiscountDate", "Other", "ExternalGUID",
"LinkedTxn", "InvoiceLineRet", "InvoiceLineGroupRet",
]
self.onError = "stopOnError"
self.retName = 'InvoiceRet'
self.defaultFilterKey = "TxnID"
if 'debug' in kwargs and isinstance(kwargs['debug'], bool):
self.class_debug=kwargs["debug"]
self.QBDict[self.__class__.__name__ + "Rq"]={}
### End Required Variable. can put ENUM list below this (eg: self.ENUM_GeneralSummaryReportQuery=[])
if 'TxnID' in kwargs and kwargs['TxnID']:
_txnIDs=makeAList(kwargs['TxnID'])
self.QBDict[self.__class__.__name__ + "Rq"]["TxnID"]= _txnIDs
elif 'RefNumber' in kwargs and kwargs['RefNumber']:
_refNumbers=makeAList(kwargs['RefNumber'])
# print(f'{_refNumbers=}')
self.QBDict[self.__class__.__name__ + "Rq"]['RefNumber']=_refNumbers
elif 'RefNumberCaseSensitive' in kwargs and kwargs['RefNumberCaseSensitive']:
_refNumbersCaseSensitive=makeAList(kwargs['RefNumberCaseSensitive'])
self.QBDict[self.__class__.__name__ + "Rq"]["RefNumberCaseSensitive"]=_refNumbersCaseSensitive
else:
if 'MaxReturned' in kwargs:
self.QBDict[self.__class__.__name__ + "Rq"]["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', "")}
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', "")}
elif 'TxnDateRangeFilter_DateMacro' in kwargs:
self.QBDict[self.__class__.__name__ + "Rq"]["TxnDateRangeFilter"]={'DateMacro':kwargs['TxnDateRangeFilter_DateMacro']}
if 'EntityFilter_ListID' in kwargs:
self.QBDict[self.__class__.__name__ + "Rq"]["EntityFilter"]={'ListID':kwargs['EntityFilter_ListID']}
elif 'EntityFilter_FullName' in kwargs:
self.QBDict[self.__class__.__name__ + "Rq"]["EntityFilter"]={'FullName':kwargs['EntityFilter_FullName']}
elif 'EntityFilter_ListIDWithChildren' in kwargs:
self.QBDict[self.__class__.__name__ + "Rq"]["EntityFilter"]={'ListIDWithChildren':kwargs['EntityFilter_ListIDWithChildren']}
elif 'EntityFilter_FullNameWithChildren' in kwargs:
self.QBDict[self.__class__.__name__ + "Rq"]["EntityFilter"]={'FullNameWithChildren':kwargs['EntityFilter_FullNameWithChildren']}
if 'AccountFilter_ListID' in kwargs:
self.QBDict[self.__class__.__name__ + "Rq"]["AccountFilter"]={'ListID':kwargs['AccountFilter_ListID']}
elif 'AccountFilter_FullName' in kwargs:
self.QBDict[self.__class__.__name__ + "Rq"]["AccountFilter"]={'FullName':kwargs['AccountFilter_FullName']}
elif 'AccountFilter_ListIDWithChildren' in kwargs:
self.QBDict[self.__class__.__name__ + "Rq"]["AccountFilter"]={'ListIDWithChildren':kwargs['AccountFilter_ListIDWithChildren']}
elif 'AccountFilter_FullNameWithChildren' in kwargs:
self.QBDict[self.__class__.__name__ + "Rq"]["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']]}
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', "")}
if 'CurrencyFilter_ListID' in kwargs:
self.QBDict[self.__class__.__name__ + "Rq"]["CurrencyFilter"]=kwargs['CurrencyFilter_ListID']
elif 'CurrencyFilter_FullName' in kwargs:
self.QBDict[self.__class__.__name__ + "Rq"]["CurrencyFilter"]=kwargs['CurrencyFilter_FullName']
if 'IncludeLineItems' in kwargs:
print(f'{self.QBDict} = ')
self.QBDict[self.__class__.__name__ + "Rq"]["IncludeLineItems"]=kwargs['IncludeLineItems']
if 'IncludeLinkedTxns' in kwargs:
self.QBDict[self.__class__.__name__ + "Rq"]["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
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")
# print(self.QBDict)
self.runCheck() ### running the qbxml connection to get data ###
if __name__ == "__main__": if __name__ == "__main__":
@timing @timing
def salesorderquery(): def invoicequery():
g=SalesOrderQuery(debug=False, MaxReturned = 2, EntityFilter_FullName="Abadi Serpong", TxnID="1786D5-1689047665", IncludeLineItems="true", IncludeLinkedTxns="true") g=InvoiceQuery(debug=False, MaxReturned = 2, IncludeLineItems="true", IncludeLinkedTxns="true",
RefNumber="24010022")#"2023-08-22")
print(json.dumps(g.filter().all(), indent=3)) print(json.dumps(g.filter().all(), indent=3))
print(g.count()) print(g.count())
@timing
def salesorderquery():
g=SalesOrderQuery(debug=False, MaxReturned = None, TxnID=None, IncludeLineItems="true", IncludeLinkedTxns="true",
RefNumber="24010022" )#"B23070857")
print(json.dumps(g.filter().all(), indent=3))
print(g.count())
@timing @timing
def transactionquery(): def transactionquery():
g=TransactionQuery(debug=False, MaxReturned=None, TransactionTypeFilter_TxnTypeFilter="Invoice", TransactionEntityFilter_FullName="Abadi Serpong", g=TransactionQuery(debug=False, MaxReturned=None, TransactionTypeFilter_TxnTypeFilter="Invoice", TransactionEntityFilter_FullName="Abadi Serpong",
@ -562,7 +663,8 @@ if __name__ == "__main__":
print(recursiveDict(varDict, f, enumDict)) print(recursiveDict(varDict, f, enumDict))
f.close f.close
salesorderquery() invoicequery()
# salesorderquery()
# transactionquery() # transactionquery()
# main() # main()
# iteminventoryquery() # iteminventoryquery()

30
save_data.py Normal file
View File

@ -0,0 +1,30 @@
from QBClasses import SalesOrderQuery, InvoiceQuery, TransactionQuery
from utils import timing, makeAList
from pprint import pprint
# h1="17b2d5"
# h2="17b2c1"
# res = int(h2,16)-int(h1,16)
# print(res, type(res), hex(res)[2:])
# print(h1<h2, h2<h1)
@timing
def main():
IncludeRetElements = ["TxnID", "TimeCreated", "TimeModified", "EditSequence", "TxnNumber", "CustomerRef", "TemplateRef",
"TxnDate", "RefNumber", "BillAddressBlock", "ShipAddressBlock", "IsPending", "PONumber,",
"SalesRepRef", "ShipDate", "SubTotal",
"Memo", "CustomerMsgRef", "IsToBePrinted",
"IsToBeEmailed", "ExternalGUID",
"LinkedTxn", "InvoiceLineRet", "InvoiceLineGroupRet",
]
refNumbers_listofdict= [{'RefNumber': '0099'}, {'RefNumber': '0100'}, {'RefNumber': '0103'}]
refNumbers_list= makeAList(refNumbers_listofdict,dictvalue=True, listofdict=True)
print(refNumbers_list)
invQ = InvoiceQuery(**{'debug':False, 'MaxReturned':100, 'RefNumber':refNumbers_list, 'IncludeLineItems':'true', 'IncludeLinkedTxns':'true'})#, 'IncludeRetElements':IncludeRetElements})#, 'OwnerID':0} )
# print(pprint(invQ), type(invQ), pprint(invQ.all()))
# print(invQ.response_string)
print(invQ.filter("RefNumber"))
print(invQ.count())
if __name__=='__main__':
main()

View File

@ -1,6 +1,36 @@
from time import time from time import time
from typing import Union
def makeAList(x:Union[str , dict , list], dictvalue:bool=False, listofdict:bool=False)->list :
if isinstance(x,str):
x=[x]
elif isinstance(x, list) and not listofdict: #lists of str or int values
pass
elif isinstance(x, list) and not dictvalue: #lists of dict, and get all the keys
res=[]
for z in x:
for k in z:
res.append(k)
return res
elif isinstance(x, list) and dictvalue: #lists of dict, and get all the values
res=[]
for z in x:
for k,v in z.items():
res.append(v)
return res
elif isinstance(x, list): #lists of str or int values
res=[]
for z in x:
for k in z:
res.append(k)
return res
elif isinstance(x, dict) and not dictvalue: #get a list of keys from dict
x=[k for k in x]
elif isinstance(x, dict): #get a list of values from dict
x=[v for k,v in x.items()]
return x
def timing(f): def timing(f):
# @wraps(f) # @wraps(f)
@ -25,3 +55,9 @@ def cleanIncludeRetElements(includeRetElements_allowed:list, includeRetElements:
iREs.append(iRE_a) iREs.append(iRE_a)
break break
return iREs return iREs
if __name__=='__main__':
#Example makelist
print(makeAList("hallo"), makeAList({'world':1, 'case':'another'}), makeAList(['here', 'we', 'go']), makeAList(1), makeAList({'world':1, 'case':'another'}, True))
alistofdict = [{'RefNumber': '0001'}, {'RefNumber': '0022'}, {'RefNumber': '0004'}, {'RefNumber': '0006'}, {'RefNumber': '0008'}, {'RefNumber': '0009'}, {'RefNumber': '0010'}, {'RefNumber': '0015'}, {'RefNumber': '0065'}, {'RefNumber': '0017'}, {'RefNumber': '0019'}, {'RefNumber': '0023'}, {'RefNumber': '0024'}, {'RefNumber': '0025'}, {'RefNumber': '0027'}, {'RefNumber': '0029'}, {'RefNumber': '0030'}, {'RefNumber': '0045'}, {'RefNumber': '0032'}, {'RefNumber': '0034'}, {'RefNumber': '0035'}, {'RefNumber': '0036'}, {'RefNumber': '0040'}, {'RefNumber': '0003'}, {'RefNumber': '0031'}, {'RefNumber': '0033'}, {'RefNumber': '0037'}, {'RefNumber': '0038'}, {'RefNumber': '0039'}, {'RefNumber': '0047'}, {'RefNumber': '0005'}, {'RefNumber': '0007'}, {'RefNumber': '0012'}, {'RefNumber': '0013'}, {'RefNumber': '0014'}, {'RefNumber': '0016'}, {'RefNumber': '0011'}, {'RefNumber': '0021'}, {'RefNumber': '0002'}, {'RefNumber': '0018'}, {'RefNumber': '0020'}, {'RefNumber': '0026'}, {'RefNumber': '0028'}, {'RefNumber': '0041'}, {'RefNumber': '0051'}, {'RefNumber': '0062'}, {'RefNumber': '0042'}, {'RefNumber': '0043'}, {'RefNumber': '0053'}, {'RefNumber': '0055'}, {'RefNumber': '0057'}, {'RefNumber': '0058'}, {'RefNumber': '0059'}, {'RefNumber': '0061'}, {'RefNumber': '0068'}, {'RefNumber': '0044'}, {'RefNumber': '0046'}, {'RefNumber': '0048'}, {'RefNumber': '0049'}, {'RefNumber': '0050'}, {'RefNumber': '0086'}, {'RefNumber': '0054'}, {'RefNumber': '0056'}, {'RefNumber': '0060'}, {'RefNumber': '0052'}, {'RefNumber': '0064'}, {'RefNumber': '0066'}, {'RefNumber': '0070'}, {'RefNumber': '0071'}, {'RefNumber': '0072'}, {'RefNumber': '0075'}, {'RefNumber': '0076'}, {'RefNumber': '0078'}, {'RefNumber': '0080'}, {'RefNumber': '0081'}, {'RefNumber': '0085'}, {'RefNumber': '0067'}, {'RefNumber': '0069'}, {'RefNumber': '0073'}, {'RefNumber': '0074'}, {'RefNumber': '0077'}, {'RefNumber': '0079'}, {'RefNumber': '0082'}, {'RefNumber': '0083'}, {'RefNumber': '0084'}, {'RefNumber': '0087'}, {'RefNumber': '0089'}, {'RefNumber': '0091'}, {'RefNumber': '0092'}, {'RefNumber': '0093'}, {'RefNumber': '0094'}, {'RefNumber': '0095'}, {'RefNumber': '0096'}, {'RefNumber': '0167'}, {'RefNumber': '0088'}, {'RefNumber': '0097'}, {'RefNumber': '0098'}, {'RefNumber': '0099'}, {'RefNumber': '0100'}, {'RefNumber': '0103'}]
print(makeAList(alistofdict,listofdict=True, dictvalue=True))