mirror of
https://github.com/bcomsugi/Quickbooks-API.git
synced 2026-01-08 09:12:38 +07:00
137 lines
6.8 KiB
Python
137 lines
6.8 KiB
Python
from QBClasses import SalesOrderQuery, InvoiceQuery, TransactionQuery
|
|
from utils import timing, makeAList, makeLinkedTxnList
|
|
from pprint import pprint, PrettyPrinter
|
|
# 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",
|
|
]
|
|
so_IncludeRetElements = ["TxnID", "TimeCreated", "TimeModified", "EditSequence", "TxnNumber", "CustomerRef",
|
|
"TxnDate", "RefNumber", "PONumber,", "SalesRepRef", "SubTotal", "TotalAmount",
|
|
"IsManuallyClosed", "IsFullyInvoiced", "Memo", "CustomerMsgRef", "LinkedTxn", "SalesOrderLineRet", "SalesOrderLineGroupRet",
|
|
]
|
|
refNumbers_listofdict= [{'RefNumber': '0099'}, {'RefNumber': '0100'}, {'RefNumber': '0103'}]
|
|
refNumbers_list= makeAList(refNumbers_listofdict,dictvalue=True, listofdict=True)
|
|
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} )
|
|
|
|
# print(pprint(invQ), type(invQ), pprint(invQ.all()))
|
|
# print(invQ.response_string)
|
|
# print(invQ.filter(["RefNumber","txnid"]))
|
|
# print(invQ.all(), type(invQ.all()))
|
|
# PrettyPrinter( sort_dicts=False).pprint(invQ.all())
|
|
# pprint(invQ.all(),sort_dicts=False)
|
|
print(f'{invQ.count() =}')
|
|
|
|
## start process ##
|
|
invdicts = invQ.all()
|
|
if isinstance(invdicts,dict):
|
|
invdicts=[invdicts]
|
|
|
|
print("SALES ORDER")
|
|
|
|
for inv_idx, invdict in enumerate(invdicts): #loop over every Invoice, and get the linkedtxnID
|
|
InvoiceLineRet = invQ.filter("InvoiceLineRet").all(invdict)
|
|
linkedtxns = invQ.filter("LinkedTxn").all(invdict)
|
|
print(f'{InvoiceLineRet=}', type(InvoiceLineRet))
|
|
# print(linkedtxns, type(linkedtxns))
|
|
linkedTxnIDs=makeLinkedTxnList(linkedtxns, 'SalesOrder') #this is the list of linkedTxn.TxnID
|
|
print(f'{inv_idx=} of {len(invdicts)}; {linkedTxnIDs = }')
|
|
so_init={'IncludeLineItems':'true', 'IncludeLinkedTxns':'true', 'TxnID':linkedTxnIDs, 'IncludeRetElement': so_IncludeRetElements}
|
|
SOOrders=SalesOrderQuery(**so_init)
|
|
# pprint(SOOrders.all(), sort_dicts=False)
|
|
solineret = SOOrders.filter(["TxnID", "RefNumber", "SalesOrderLineRet"]).all()
|
|
# print(solineret)
|
|
sorefnumbers = SOOrders.filter("RefNumber").getValuesOf("RefNumber")
|
|
print(f'{sorefnumbers=}')
|
|
is_soRefNumber_duplicated = False
|
|
for sorefNumber in sorefnumbers: #check if SO RefNumber is duplicated, not valid RefNumber raise error
|
|
|
|
checkduplicateRefNumber = SalesOrderQuery(RefNumber=sorefNumber)
|
|
if checkduplicateRefNumber.count()==1:
|
|
pass # SOrefnumber no duplicate
|
|
print("no duplicate refnumber")
|
|
|
|
elif checkduplicateRefNumber.count()>1:
|
|
is_soRefNumber_duplicated=True
|
|
print(f"there is duplicate in one of there refnumbers:{sorefNumber=}")
|
|
raise Exception(f"there is duplicate in one of there refnumbers:{sorefNumber=}")
|
|
break
|
|
print(f'{checkduplicateRefNumber.count() = }')
|
|
if is_soRefNumber_duplicated:
|
|
return
|
|
|
|
#prepare SOOrders to be a list of dict
|
|
soorders = SOOrders.all()
|
|
if isinstance(soorders, dict):
|
|
soorders=[soorders]
|
|
#start comparing inv to so line by line
|
|
invLineRets = InvoiceLineRet[0].get('InvoiceLineRet')
|
|
for invLineRet in invLineRets:
|
|
FullName_inv = invLineRet['ItemRef']['FullName']
|
|
TxnLineID_inv = invLineRet['TxnLineID']
|
|
Quantity_inv = invLineRet['Quantity']
|
|
UnitOfMeasure_inv = invLineRet['UnitOfMeasure']
|
|
OverrideUOMSetRef_inv = invLineRet['OverrideUOMSetRef']['FullName']
|
|
Rate_inv = invLineRet['Rate']
|
|
Amount_inv = invLineRet['Amount']
|
|
|
|
for soorder in soorders:
|
|
pass
|
|
TxnID_so = soorder['TxnID']
|
|
RefNumber_so = soorder['RefNumber']
|
|
IsFullyInvoiced_so = soorder['IsFullyInvoiced']
|
|
IsManuallyClosed_so = soorder['IsManuallyClosed']
|
|
SalesOrderLineRet_so = soorder['SalesOrderLineRet']
|
|
LinkedTxn_so = soorder['LinkedTxn']
|
|
#prepare SalesOrderLineRet to be a list of dict
|
|
if isinstance(SalesOrderLineRet_so, dict):
|
|
SalesOrderLineRet_so = [SalesOrderLineRet_so]
|
|
# print(f'{SalesOrderLineRet_so = }')
|
|
for soLineRet_idx, soLineRet in enumerate(SalesOrderLineRet_so):
|
|
# print(soLineRet_idx, soLineRet)
|
|
print(f"{soLineRet_idx} {soLineRet.get('checked', False) = }")
|
|
if soLineRet.get('checked', False): # if can find checked key and not True, then skip next soLineRet
|
|
# print(soLineRet_idx,"continue")
|
|
continue
|
|
print(f'{soLineRet_idx = }->{soLineRet}')
|
|
FullName_so = soLineRet['ItemRef']['FullName']
|
|
TxnLineID_so = soLineRet['TxnLineID']
|
|
Quantity_so = soLineRet['Quantity']
|
|
UnitOfMeasure_so = soLineRet['UnitOfMeasure']
|
|
OverrideUOMSetRef_so = soLineRet['OverrideUOMSetRef']['FullName']
|
|
Rate_so = soLineRet['Rate']
|
|
Amount_so = soLineRet['Amount']
|
|
Invoiced_so = soLineRet.get('Invoiced',0)
|
|
IsManuallyClosed_so = soLineRet['IsManuallyClosed']
|
|
SalesOrderLineRet_so[soLineRet_idx]['checked']=True
|
|
# break only if match with invlineret==solineret
|
|
# pprint(solineret, sort_dicts=False)
|
|
# pprint(SOOrders.all(), sort_dicts=False)
|
|
# pprint(invQ.all())
|
|
print(f'{SOOrders.count() = }')
|
|
|
|
|
|
|
|
|
|
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() |