diff --git a/.gitignore b/.gitignore
index 8a14d77..5c83a8d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -169,4 +169,5 @@ QBbackup/
.xlsx
.pdf
QBbackup/
-test_folder_source_DeliveryNote/
\ No newline at end of file
+test_folder_source_DeliveryNote/
+Exim/Data
\ No newline at end of file
diff --git a/DASAServer.bat b/DASAServeCRB.bat
similarity index 100%
rename from DASAServer.bat
rename to DASAServeCRB.bat
diff --git a/DASAServeCaruban.bat b/DASAServerBGR.bat
similarity index 95%
rename from DASAServeCaruban.bat
rename to DASAServerBGR.bat
index f6a2904..e441699 100644
--- a/DASAServeCaruban.bat
+++ b/DASAServerBGR.bat
@@ -1,6 +1,6 @@
cd "C:\Sources\dasaproject\"
echo already cd
-cmd /k "cd /d C:\Sources\dasaproject\env\Scripts\ & activate & cd /d C:\Sources\dasaproject\ & uvicorn main:app --host 0.0.0.0 --port 9997
+cmd /k "cd /d C:\Sources\dasaproject\env\Scripts\ & activate & cd /d C:\Sources\dasaproject\ & uvicorn main:app --host 0.0.0.0 --port 9999
echo workon env
echo pause
echo get to env
diff --git a/Exim/__init__.py b/Exim/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/InvoiceAdd.xml b/InvoiceAdd.xml
new file mode 100644
index 0000000..5259754
--- /dev/null
+++ b/InvoiceAdd.xml
@@ -0,0 +1,454 @@
+
+
+
+
+
+
+
+ IDTYPE
+ STRTYPE
+
+
+ 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
+
+ BOOLTYPE
+ BOOLTYPE
+ STRTYPE
+
+ IDTYPE
+ STRTYPE
+
+ DATETYPE
+
+ IDTYPE
+ STRTYPE
+
+ STRTYPE
+ DATETYPE
+
+ IDTYPE
+ STRTYPE
+
+
+ IDTYPE
+ STRTYPE
+
+ STRTYPE
+
+ IDTYPE
+ STRTYPE
+
+ BOOLTYPE
+ BOOLTYPE
+ BOOLTYPE
+
+ IDTYPE
+ STRTYPE
+
+ STRTYPE
+ FLOATTYPE
+ GUIDTYPE
+ IDTYPE
+
+ IDTYPE
+ AMTTYPE
+ BOOLTYPE
+
+
+
+
+ IDTYPE
+ STRTYPE
+
+ STRTYPE
+ QUANTYPE
+ STRTYPE
+
+ PRICETYPE
+
+ PERCENTTYPE
+
+
+ IDTYPE
+ STRTYPE
+
+
+
+ IDTYPE
+ STRTYPE
+
+ AMTTYPE
+
+ ENUMTYPE
+
+ IDTYPE
+ STRTYPE
+
+
+ IDTYPE
+ STRTYPE
+
+
+ STRTYPE
+
+ STRTYPE
+
+ DATETYPE
+
+ IDTYPE
+ STRTYPE
+
+
+ IDTYPE
+ STRTYPE
+
+ STRTYPE
+ STRTYPE
+
+ IDTYPE
+ IDTYPE
+
+
+ GUIDTYPE
+ STRTYPE
+ STRTYPE
+
+
+
+
+
+ IDTYPE
+ STRTYPE
+
+ QUANTYPE
+ STRTYPE
+
+ IDTYPE
+ STRTYPE
+
+
+ IDTYPE
+ STRTYPE
+
+
+ GUIDTYPE
+ STRTYPE
+ STRTYPE
+
+
+
+
+ STRTYPE
+
+
+
+
+ IDTYPE
+ DATETIMETYPE
+ DATETIMETYPE
+ STRTYPE
+ INTTYPE
+
+ IDTYPE
+ STRTYPE
+
+
+ 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
+
+ BOOLTYPE
+ BOOLTYPE
+ STRTYPE
+
+ IDTYPE
+ STRTYPE
+
+ DATETYPE
+
+ IDTYPE
+ STRTYPE
+
+ STRTYPE
+ DATETYPE
+
+ IDTYPE
+ STRTYPE
+
+ AMTTYPE
+
+ IDTYPE
+ STRTYPE
+
+ PERCENTTYPE
+ AMTTYPE
+ AMTTYPE
+ AMTTYPE
+
+ IDTYPE
+ STRTYPE
+
+ FLOATTYPE
+ AMTTYPE
+ STRTYPE
+ BOOLTYPE
+
+ IDTYPE
+ STRTYPE
+
+ BOOLTYPE
+ BOOLTYPE
+ BOOLTYPE
+
+ IDTYPE
+ STRTYPE
+
+ AMTTYPE
+ DATETYPE
+ 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
+ DATETYPE
+
+ IDTYPE
+ STRTYPE
+
+ 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
+ DATETYPE
+
+ IDTYPE
+ STRTYPE
+
+ STRTYPE
+ STRTYPE
+
+ GUIDTYPE
+ STRTYPE
+
+ ENUMTYPE
+ STRTYPE
+
+
+
+ GUIDTYPE
+ STRTYPE
+
+ ENUMTYPE
+ STRTYPE
+
+
+
+
+ GUIDTYPE
+ STRTYPE
+
+ ENUMTYPE
+ STRTYPE
+
+
+
+
+ IDTYPE
+
+ GUIDTYPE
+
+ IDTYPE
+
+ INTTYPE
+ STRTYPE
+ GUIDTYPE
+
+
+
+
diff --git a/QBClass/QBClasses.py b/QBClass/QBClasses.py
index 54329ad..1a6354c 100644
--- a/QBClass/QBClasses.py
+++ b/QBClass/QBClasses.py
@@ -8,302 +8,302 @@ import json
from typing import Union
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'
- ]
+ '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):
- print(f'{args = }')
- print(f'{kwargs = }')
- super().__init__(*args, **kwargs)
- ### Required Variable
- self.includeRetElements_allowed = ["ListID", "FullName", "TimeCreated", "TimeModified", "EditSequence", "Name", "IsActive", "ClassRef", "ParentRef", "Sublevel", "BarCodeValue",
- "ManufacturerPartNumber", "UnitOfMeasureSetRef", "IsTaxIncluded", "SalesTaxCodeRef", "SalesDesc,", "SalesPrice", "IncomeAccountRef",
- "PurchaseDesc", "PurchaseCost", "PurchaseTaxCodeRef", "COGSAccountRef", "PrefVendorRef", "AssetAccountRef", "ReforderPoint", "Max", "QuantityOnHand",
- "AcerageCost", "QuantityOnOrder", "QuantityOnSalesOrder",
- "ExternalGUID", "DataExtRet",
- ]
- 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"]
+ def __init__(self, *args, **kwargs):
+ print(f'{args = }')
+ print(f'{kwargs = }')
+ super().__init__(*args, **kwargs)
+ ### Required Variable
+ self.includeRetElements_allowed = ["ListID", "FullName", "TimeCreated", "TimeModified", "EditSequence", "Name", "IsActive", "ClassRef", "ParentRef", "Sublevel", "BarCodeValue",
+ "ManufacturerPartNumber", "UnitOfMeasureSetRef", "IsTaxIncluded", "SalesTaxCodeRef", "SalesDesc,", "SalesPrice", "IncomeAccountRef",
+ "PurchaseDesc", "PurchaseCost", "PurchaseTaxCodeRef", "COGSAccountRef", "PrefVendorRef", "AssetAccountRef", "ReforderPoint", "Max", "QuantityOnHand",
+ "AverageCost", "QuantityOnOrder", "QuantityOnSalesOrder",
+ "ExternalGUID", "DataExtRet",
+ ]
+ 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.classNameRq]={}
- ### End Required Variable. can put ENUM list below this (eg: self.ENUM_GeneralSummaryReportQuery=[])
+ self.QBDict[self.classNameRq]={}
+ ### End Required Variable. can put ENUM list below this (eg: self.ENUM_GeneralSummaryReportQuery=[])
- if 'ListID' in kwargs:
- self.QBDict[self.classNameRq]["ListID"]=kwargs['ListID']
- elif 'FullName' in kwargs:
- self.QBDict[self.classNameRq]["FullName"]=kwargs['FullName']
- else:
- if 'MaxReturned' in kwargs:
- self.QBDict[self.classNameRq]["MaxReturned"]=kwargs['MaxReturned']
- if 'ActiveStatus' in kwargs:
- self.QBDict[self.classNameRq]["ActiveStatus"]=kwargs['ActiveStatus']
- if 'FromModifiedDate' in kwargs:
- self.QBDict[self.classNameRq]["FromModifiedDate"]=kwargs['FromModifiedDate']
- if 'ToModifiedDate' in kwargs:
- self.QBDict[self.classNameRq]["ToModifiedDate"]=kwargs['ToModifiedDate']
- if 'MatchCriterion' in kwargs and 'Name' in kwargs:
- 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.classNameRq]["NameRangeFilter"]={'FromName':kwargs.get('FromName', ""), 'ToName':kwargs.get('ToName', "")}
+ if 'ListID' in kwargs:
+ self.QBDict[self.classNameRq]["ListID"]=kwargs['ListID']
+ elif 'FullName' in kwargs:
+ self.QBDict[self.classNameRq]["FullName"]=kwargs['FullName']
+ else:
+ if 'MaxReturned' in kwargs:
+ self.QBDict[self.classNameRq]["MaxReturned"]=kwargs['MaxReturned']
+ if 'ActiveStatus' in kwargs:
+ self.QBDict[self.classNameRq]["ActiveStatus"]=kwargs['ActiveStatus']
+ if 'FromModifiedDate' in kwargs:
+ self.QBDict[self.classNameRq]["FromModifiedDate"]=kwargs['FromModifiedDate']
+ if 'ToModifiedDate' in kwargs:
+ self.QBDict[self.classNameRq]["ToModifiedDate"]=kwargs['ToModifiedDate']
+ if 'MatchCriterion' in kwargs and 'Name' in kwargs:
+ 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.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
- 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.classNameRq]["IncludeRetElement"]=IRE
+ 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.classNameRq]["IncludeRetElement"]=IRE
- if 'OwnerID' in kwargs: # usually value=0 to get to DataExtRet (additional data)
- self.QBDict[self.classNameRq]["OwnerID"]=kwargs['OwnerID']
+ if 'OwnerID' in kwargs: # usually value=0 to get to DataExtRet (additional data)
+ self.QBDict[self.classNameRq]["OwnerID"]=kwargs['OwnerID']
- # print(self.classNameRq)
- # print(self.QBDict)
- if self.__class__.__name__==self.className:
- 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 GeneralSummaryReportQuery(baseQBQuery):
- def __init__(self, *args, **kwargs):
- print(f'{args = }')
- print(f'{kwargs = }')
- super().__init__( )
- ## Required variable
- self.includeRetElements_allowed = ["ReportTitle", "ReportSubtitle", "ReportBasis", "NumRows", "NumColumns", "NumColTitleRows", "ReportData", "DataRow"]
- 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.classNameRq]={} #Required
- ### End Required variable
- self.ENUM_GeneralSummaryReportType = ["BalanceSheetByClass", "BalanceSheetPrevYearComp", "BalanceSheetStandard", "BalanceSheetSummary", "CustomerBalanceSummary",
- "ExpenseByVendorSummary", "IncomeByCustomerSummary", "InventoryStockStatusByItem", "InventoryStockStatusByVendor", "IncomeTaxSummary",
- "InventoryValuationSummary", "InventoryValuationSummaryBySite", "LotNumberInStockBySite", "PhysicalInventoryWorksheet", "ProfitAndLossByClass",
- "ProfitAndLossByJob", "ProfitAndLossPrevYearComp", "ProfitAndLossStandard", "ProfitAndLossYTDComp", "PurchaseByItemSummary", "PurchaseByVendorSummary",
- "SalesByCustomerSummary", "SalesByItemSummary", "SalesByRepSummary", "SalesTaxLiability", "SalesTaxRevenueSummary", "SerialNumberInStockBySite",
- "TrialBalance", "VendorBalanceSummary"]
+ def __init__(self, *args, **kwargs):
+ print(f'{args = }')
+ print(f'{kwargs = }')
+ super().__init__( )
+ ## Required variable
+ self.includeRetElements_allowed = ["ReportTitle", "ReportSubtitle", "ReportBasis", "NumRows", "NumColumns", "NumColTitleRows", "ReportData", "DataRow"]
+ 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.classNameRq]={} #Required
+ ### End Required variable
+ self.ENUM_GeneralSummaryReportType = ["BalanceSheetByClass", "BalanceSheetPrevYearComp", "BalanceSheetStandard", "BalanceSheetSummary", "CustomerBalanceSummary",
+ "ExpenseByVendorSummary", "IncomeByCustomerSummary", "InventoryStockStatusByItem", "InventoryStockStatusByVendor", "IncomeTaxSummary",
+ "InventoryValuationSummary", "InventoryValuationSummaryBySite", "LotNumberInStockBySite", "PhysicalInventoryWorksheet", "ProfitAndLossByClass",
+ "ProfitAndLossByJob", "ProfitAndLossPrevYearComp", "ProfitAndLossStandard", "ProfitAndLossYTDComp", "PurchaseByItemSummary", "PurchaseByVendorSummary",
+ "SalesByCustomerSummary", "SalesByItemSummary", "SalesByRepSummary", "SalesTaxLiability", "SalesTaxRevenueSummary", "SerialNumberInStockBySite",
+ "TrialBalance", "VendorBalanceSummary"]
- if 'GeneralSummaryReportType' in kwargs:
- enum=cleanIncludeRetElements(self.ENUM_GeneralSummaryReportType, kwargs['GeneralSummaryReportType'])
- print(f'{enum = }')
- self.QBDict[self.classNameRq]["GeneralSummaryReportType"]=enum[0]
- else:
- print("Error -> GeneralSummaryReportType is required")
- return
+ if 'GeneralSummaryReportType' in kwargs:
+ enum=cleanIncludeRetElements(self.ENUM_GeneralSummaryReportType, kwargs['GeneralSummaryReportType'])
+ print(f'{enum = }')
+ self.QBDict[self.classNameRq]["GeneralSummaryReportType"]=enum[0]
+ else:
+ print("Error -> GeneralSummaryReportType is required")
+ return
- # 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']
+ # 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']
- 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 '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 '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 '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 '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 '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 '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 'ReturnRows' in kwargs:
- self.QBDict[self.classNameRq]["ReturnRows"]=cleanIncludeRetElements(['ActiveOnly', 'NonZero', 'All'], kwargs['ReturnRows'], 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 '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 'ReturnRows' in kwargs:
+ self.QBDict[self.classNameRq]["ReturnRows"]=cleanIncludeRetElements(['ActiveOnly', 'NonZero', 'All'], kwargs['ReturnRows'], 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
- 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.classNameRq]["IncludeRetElement"]=IRE
+ 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.classNameRq]["IncludeRetElement"]=IRE
- # print(self.classNameRq)
- # print(f'{self.QBDict = }')
- if self.__class__.__name__==self.className:
- self.runCheck() ### running the qbxml connection to get data ###
+ # print(self.classNameRq)
+ # print(f'{self.QBDict = }')
+ if self.__class__.__name__==self.className:
+ self.runCheck() ### running the qbxml connection to get data ###
class PriceLevelQuery(baseQBQuery):
- def __init__(self, *args, **kwargs):
- print(f'{args = }')
- print(f'{kwargs = }')
- super().__init__( )
- ## Required variable
- self.includeRetElements_allowed = ["ListID", "TimeCreated", "TimeModified", "EditSequence", "Name", "isActive", "PriceLevelType", "PriceLevelFixedPercentage",
- "PriceLevelPerItemRet", "ItemRef", "CustomPrice", "CustomePricePercent", "CurrencyRef"]
- self.onError = "stopOnError"
- self.retName = 'PriceLevelRet'
- self.defaultFilterKey = "ListID"
- self.className = "PriceLevelQuery"
- self.classNameRq:str = self.__class__.__name__ + 'Rq'
- if 'debug' in kwargs and isinstance(kwargs['debug'], bool):
- self.class_debug=kwargs["debug"]
-
- self.QBDict[self.classNameRq]={} #Required
- ### End Required variable
+ def __init__(self, *args, **kwargs):
+ print(f'{args = }')
+ print(f'{kwargs = }')
+ super().__init__( )
+ ## Required variable
+ self.includeRetElements_allowed = ["ListID", "TimeCreated", "TimeModified", "EditSequence", "Name", "isActive", "PriceLevelType", "PriceLevelFixedPercentage",
+ "PriceLevelPerItemRet", "ItemRef", "CustomPrice", "CustomePricePercent", "CurrencyRef"]
+ self.onError = "stopOnError"
+ self.retName = 'PriceLevelRet'
+ self.defaultFilterKey = "ListID"
+ self.className = "PriceLevelQuery"
+ self.classNameRq:str = self.__class__.__name__ + 'Rq'
+ if 'debug' in kwargs and isinstance(kwargs['debug'], bool):
+ self.class_debug=kwargs["debug"]
+
+ self.QBDict[self.classNameRq]={} #Required
+ ### End Required variable
- self.ENUM_ActiveStatus = ['ActiveOnly', 'InactiveOnly', 'All']
- self.ENUM_MatchCriterion = ['StartsWith', 'Contains', 'EndsWith']
+ self.ENUM_ActiveStatus = ['ActiveOnly', 'InactiveOnly', 'All']
+ self.ENUM_MatchCriterion = ['StartsWith', 'Contains', 'EndsWith']
- if 'ListID' in kwargs:
- self.QBDict[self.classNameRq]["ListID"]=kwargs['ListID']
- elif 'FullName' in kwargs:
- self.QBDict[self.classNameRq]["FullName"]=kwargs['FullName']
- else:
- if 'MaxReturned' in kwargs:
- self.QBDict[self.classNameRq]["MaxReturned"]=kwargs['MaxReturned']
- if 'ActiveStatus' in kwargs:
- enum=cleanIncludeRetElements(self.ENUM_ActiveStatus, kwargs['ActiveStatus'])
- self.QBDict[self.classNameRq]["ActiveStatus"]=enum[0]
- if 'FromModifiedDate' in kwargs:
- self.QBDict[self.classNameRq]["FromModifiedDate"]=kwargs['FromModifiedDate']
- if 'ToModifiedDate' in kwargs:
- self.QBDict[self.classNameRq]["ToModifiedDate"]=kwargs['ToModifiedDate']
- if 'NameFilter_MatchCriterion' in kwargs and 'NameFilter_Name' in kwargs:
- enum= cleanIncludeRetElements(self.ENUM_MatchCriterion, kwargs['NameFilter_MatchCriterion'])
- self.QBDict[self.classNameRq]["NameFilter"]={'MatchCriterion': enum[0], 'Name': kwargs['NameFilter_Name']}
- elif 'NameRangeFilter_FromName' in kwargs or 'NameRangeFilter_ToName' in kwargs:
- self.QBDict[self.classNameRq]["NameRangeFilter"]={'FromName':kwargs.get('NameRangeFilter_FromName', None), 'ToReportDate':kwargs.get('NameRangeFilter_ToName', None)}
- if 'ItemRef_ListID' in kwargs or 'ItemRef_FullName' in kwargs:
- self.QBDict[self.classNameRq]["ItemRef"]={'ListID':kwargs.get('ItemRef_ListID', None), 'FullName':kwargs.get('ItemRef_FullName', None)}
- if 'CurrencyFilter_ListID' in kwargs:
- self.QBDict[self.classNameRq]["CurrencyFilter"]=kwargs['CurrencyFilter_ListID']
- elif 'CurrencyFilter_FullName' in kwargs:
- self.QBDict[self.classNameRq]["CurrencyFilter"]=kwargs['CurrencyFilter_FullName']
- 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.classNameRq]["IncludeRetElement"]=IRE
+ if 'ListID' in kwargs:
+ self.QBDict[self.classNameRq]["ListID"]=kwargs['ListID']
+ elif 'FullName' in kwargs:
+ self.QBDict[self.classNameRq]["FullName"]=kwargs['FullName']
+ else:
+ if 'MaxReturned' in kwargs:
+ self.QBDict[self.classNameRq]["MaxReturned"]=kwargs['MaxReturned']
+ if 'ActiveStatus' in kwargs:
+ enum=cleanIncludeRetElements(self.ENUM_ActiveStatus, kwargs['ActiveStatus'])
+ self.QBDict[self.classNameRq]["ActiveStatus"]=enum[0]
+ if 'FromModifiedDate' in kwargs:
+ self.QBDict[self.classNameRq]["FromModifiedDate"]=kwargs['FromModifiedDate']
+ if 'ToModifiedDate' in kwargs:
+ self.QBDict[self.classNameRq]["ToModifiedDate"]=kwargs['ToModifiedDate']
+ if 'NameFilter_MatchCriterion' in kwargs and 'NameFilter_Name' in kwargs:
+ enum= cleanIncludeRetElements(self.ENUM_MatchCriterion, kwargs['NameFilter_MatchCriterion'])
+ self.QBDict[self.classNameRq]["NameFilter"]={'MatchCriterion': enum[0], 'Name': kwargs['NameFilter_Name']}
+ elif 'NameRangeFilter_FromName' in kwargs or 'NameRangeFilter_ToName' in kwargs:
+ self.QBDict[self.classNameRq]["NameRangeFilter"]={'FromName':kwargs.get('NameRangeFilter_FromName', None), 'ToReportDate':kwargs.get('NameRangeFilter_ToName', None)}
+ if 'ItemRef_ListID' in kwargs or 'ItemRef_FullName' in kwargs:
+ self.QBDict[self.classNameRq]["ItemRef"]={'ListID':kwargs.get('ItemRef_ListID', None), 'FullName':kwargs.get('ItemRef_FullName', None)}
+ if 'CurrencyFilter_ListID' in kwargs:
+ self.QBDict[self.classNameRq]["CurrencyFilter"]=kwargs['CurrencyFilter_ListID']
+ elif 'CurrencyFilter_FullName' in kwargs:
+ self.QBDict[self.classNameRq]["CurrencyFilter"]=kwargs['CurrencyFilter_FullName']
+ 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.classNameRq]["IncludeRetElement"]=IRE
- # print(self.classNameRq)
- # print(f'{self.QBDict = }')
- if self.__class__.__name__==self.className:
- self.runCheck() ### running the qbxml connection to get data ###
+ # print(self.classNameRq)
+ # print(f'{self.QBDict = }')
+ 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 = }')
+ 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)
@@ -311,1078 +311,1169 @@ def LineAdd(lineAdd:Union[list, dict])->dict:
# 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'
+ 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.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.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")
+ # self.QBDict[self.classNameRq]={}
+ # self.QBDict={}
+ print('before')
+ if len(args)==0:
+ self.create_data(kwargs)
+ self.qbdicttemp = self.QBDict.copy()
+ del self.QBDict[self.__class__.__name__]
+ self.QBDict[self.classNameRq]=self.qbdicttemp
+ else:
+ self.qbdictlist = []
+ for arg in args:
+ self.create_data(arg)
+ self.qbdictlist.append(self.QBDict.copy())
+ del self.QBDict[self.__class__.__name__]
+ self.QBDict[self.classNameRq]=self.qbdictlist
+ pprint.pprint(self.QBDict, sort_dicts=False)
- 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
-
+ def create_data(self, kwargs):
+ # print(kwargs)
+ self.isRequiredFieldSatisfied = False
+ # self.QBDict[self.__class__.__name__]={'@defMacro':'MACROTYPE'}
+ self.QBDict[self.__class__.__name__]={}
+ if 'CustomerRef_ListID' in kwargs:
+ if 'CustomerRef' in self.QBDict[self.__class__.__name__]:
+ self.QBDict[self.__class__.__name__]["CustomerRef"]['ListID']= kwargs['CustomerRef_ListID']
+ else:
+ self.QBDict[self.__class__.__name__]["CustomerRef"]={'ListID': kwargs['CustomerRef_ListID']}
+ self.isRequiredFieldSatisfied=True
+ if 'CustomerRef_FullName' in kwargs:
+ self.QBDict[self.__class__.__name__]["CustomerRef"]={'FullName': kwargs['CustomerRef_FullName']}
+ self.isRequiredFieldSatisfied=True
+
+ if not self.isRequiredFieldSatisfied:
+ raise Exception("Need CustomerRef FullName and/or ListID")
- if 'IncludeRetElement' in kwargs:
- self.QBDict[self.classNameRq]["IncludeRetElement"]=kwargs['IncludeRetElement']
+ if 'ClassRef_ListID' in kwargs:
+ if 'ClassRef' in self.QBDict[self.__class__.__name__]:
+ self.QBDict[self.__class__.__name__]["ClassRef"]['ListID']= kwargs['ClassRef_ListID']
+ else:
+ self.QBDict[self.__class__.__name__]["ClassRef"]={'ListID': kwargs['ClassRef_ListID']}
+ if 'ClassRef_FullName' in kwargs:
+ self.QBDict[self.__class__.__name__]["ClassRef"]={'FullName': kwargs['ClassRef_FullName']}
+
+ if 'ARAccountRef_ListID' in kwargs:
+ if 'ARAccountRef' in self.QBDict[self.__class__.__name__]:
+ self.QBDict[self.__class__.__name__]["ARAccountRef"]['ListID']= kwargs['ARAccountRef_ListID']
+ else:
+ self.QBDict[self.__class__.__name__]["ARAccountRef"]={'ListID': kwargs['ARAccountRef_ListID']}
+ if 'ARAccountRef_FullName' in kwargs:
+ self.QBDict[self.__class__.__name__]["ARAccountRef"]={'FullName': kwargs['ARAccountRef_FullName']}
+
+ if 'TemplateRef_ListID' in kwargs:
+ if 'TemplateRef' in self.QBDict[self.__class__.__name__]:
+ self.QBDict[self.__class__.__name__]["TemplateRef"]['ListID']= kwargs['TemplateRef_ListID']
+ else:
+ self.QBDict[self.__class__.__name__]["TemplateRef"]={'ListID': kwargs['TemplateRef_ListID']}
+ if 'TemplateRef_FullName' in kwargs:
+ self.QBDict[self.__class__.__name__]["TemplateRef"]={'FullName': kwargs['TemplateRef_FullName']}
+
+ if 'TxnDate' in kwargs:
+ self.QBDict[self.__class__.__name__]["TxnDate"]=kwargs['TxnDate']
+ if 'RefNumber' in kwargs:
+ self.QBDict[self.__class__.__name__]["RefNumber"]=kwargs['RefNumber']
+ if 'BillAddress_Addr1' in kwargs:
+ self.QBDict[self.__class__.__name__]["BillAddress"]={'Addr1': kwargs['BillAddress_Addr1']}
+ if 'BillAddress_Addr2' in kwargs:
+ self.QBDict[self.__class__.__name__]["BillAddress"]={'Addr2': kwargs['BillAddress_Addr2']}
+ if 'BillAddress_Addr3' in kwargs:
+ self.QBDict[self.__class__.__name__]["BillAddress"]={'Addr3': kwargs['BillAddress_Addr3']}
+ if 'BillAddress_Addr4' in kwargs:
+ self.QBDict[self.__class__.__name__]["BillAddress"]={'Addr4': kwargs['BillAddress_Addr4']}
+ if 'BillAddress_Addr5' in kwargs:
+ self.QBDict[self.__class__.__name__]["BillAddress"]={'Addr5': kwargs['BillAddress_Addr5']}
+ if 'BillAddress_City' in kwargs:
+ self.QBDict[self.__class__.__name__]["BillAddress"]={'City': kwargs['BillAddress_City']}
+ if 'BillAddress_State' in kwargs:
+ self.QBDict[self.__class__.__name__]["BillAddress"]={'State': kwargs['BillAddress_State']}
+ if 'BillAddress_PostalCode' in kwargs:
+ self.QBDict[self.__class__.__name__]["BillAddress"]={'PostalCode': kwargs['BillAddress_PostalCode']}
+ if 'BillAddress_Country' in kwargs:
+ self.QBDict[self.__class__.__name__]["BillAddress"]={'Country': kwargs['BillAddress_Country']}
+ if 'BillAddress_Note' in kwargs:
+ self.QBDict[self.__class__.__name__]["BillAddress"]={'Note': kwargs['BillAddress_Note']}
- # print(self.classNameRq)
- # print(self.QBDict)
+ if 'ShipAddress_Addr1' in kwargs:
+ self.QBDict[self.__class__.__name__]["ShipAddress"]={'Addr1': kwargs['ShipAddress_Addr1']}
+ if 'ShipAddress_Addr2' in kwargs:
+ self.QBDict[self.__class__.__name__]["ShipAddress"]={'Addr2': kwargs['ShipAddress_Addr2']}
+ if 'ShipAddress_Addr3' in kwargs:
+ self.QBDict[self.__class__.__name__]["ShipAddress"]={'Addr3': kwargs['ShipAddress_Addr3']}
+ if 'ShipAddress_Addr4' in kwargs:
+ self.QBDict[self.__class__.__name__]["ShipAddress"]={'Addr4': kwargs['ShipAddress_Addr4']}
+ if 'ShipAddress_Addr5' in kwargs:
+ self.QBDict[self.__class__.__name__]["ShipAddress"]={'Addr5': kwargs['ShipAddress_Addr5']}
+ if 'ShipAddress_City' in kwargs:
+ self.QBDict[self.__class__.__name__]["ShipAddress"]={'City': kwargs['ShipAddress_City']}
+ if 'ShipAddress_State' in kwargs:
+ self.QBDict[self.__class__.__name__]["ShipAddress"]={'State': kwargs['ShipAddress_State']}
+ if 'ShipAddress_PostalCode' in kwargs:
+ self.QBDict[self.__class__.__name__]["ShipAddress"]={'PostalCode': kwargs['ShipAddress_PostalCode']}
+ if 'ShipAddress_Country' in kwargs:
+ self.QBDict[self.__class__.__name__]["ShipAddress"]={'Country': kwargs['ShipAddress_Country']}
+ if 'ShipAddress_Note' in kwargs:
+ self.QBDict[self.__class__.__name__]["ShipAddress"]={'Note': kwargs['ShipAddress_Note']}
+
+ if 'IsPending' in kwargs:
+ self.QBDict[self.__class__.__name__]["IsPending"]=kwargs['IsPending']
+ if 'IsFinanceCharge' in kwargs:
+ self.QBDict[self.__class__.__name__]["IsFinanceCharge"]=kwargs['IsFinanceCharge']
+ if 'PONumber' in kwargs:
+ self.QBDict[self.__class__.__name__]["PONumber"]=kwargs['PONumber']
+ if 'TermsRef_ListID' in kwargs:
+ if 'TermsRef' in self.QBDict[self.__class__.__name__]:
+ self.QBDict[self.__class__.__name__]["TermsRef"]['ListID']= kwargs['TermsRef_ListID']
+ else:
+ self.QBDict[self.__class__.__name__]["TermsRef"]={'ListID': kwargs['TermsRef_ListID']}
+ if 'TermsRef_FullName' in kwargs:
+ self.QBDict[self.__class__.__name__]["TermsRef"]={'FullName': kwargs['TermsRef_FullName']}
+
+ if 'DueDate' in kwargs:
+ self.QBDict[self.__class__.__name__]["DueDate"]=kwargs['DueDate']
+ if 'SalesRepRef_ListID' in kwargs:
+ if 'SalesRepRef' in self.QBDict[self.__class__.__name__]:
+ self.QBDict[self.__class__.__name__]["SalesRepRef"]['ListID']= kwargs['SalesRepRef_ListID']
+ else:
+ self.QBDict[self.__class__.__name__]["SalesRepRef"]={'ListID': kwargs['SalesRepRef_ListID']}
+ if 'SalesRepRef_FullName' in kwargs:
+ self.QBDict[self.__class__.__name__]["SalesRepRef"]={'FullName': kwargs['SalesRepRef_FullName']}
+
+ if 'FOB' in kwargs:
+ self.QBDict[self.__class__.__name__]["FOB"]=kwargs['FOB']
+ if 'ShipDate' in kwargs:
+ self.QBDict[self.__class__.__name__]["ShipDate"]=kwargs['ShipDate']
+ if 'ShipMethodRef_ListID' in kwargs:
+ if 'ShipMethodRef' in self.QBDict[self.__class__.__name__]:
+ self.QBDict[self.__class__.__name__]["ShipMethodRef"]['ListID']= kwargs['ShipMethodRef_ListID']
+ else:
+ self.QBDict[self.__class__.__name__]["ShipMethodRef"]={'ListID': kwargs['ShipMethodRef_ListID']}
+ if 'ShipMethodRef_FullName' in kwargs:
+ self.QBDict[self.__class__.__name__]["ShipMethodRef"]={'FullName': kwargs['ShipMethodRef_FullName']}
+
+ if 'ItemSalesTaxRef_ListID' in kwargs:
+ if 'ItemSalesTaxRef' in self.QBDict[self.__class__.__name__]:
+ self.QBDict[self.__class__.__name__]["ItemSalesTaxRef"]['ListID']= kwargs['ItemSalesTaxRef_ListID']
+ else:
+ self.QBDict[self.__class__.__name__]["ItemSalesTaxRef"]={'ListID': kwargs['ItemSalesTaxRef_ListID']}
+ if 'ItemSalesTaxRef_FullName' in kwargs:
+ self.QBDict[self.__class__.__name__]["ItemSalesTaxRef"]={'FullName': kwargs['ItemSalesTaxRef_FullName']}
+
+ if 'Memo' in kwargs:
+ self.QBDict[self.__class__.__name__]["Memo"]=kwargs['Memo']
+ if 'CustomerMsgRef_ListID' in kwargs:
+ if 'CustomerMsgRef' in self.QBDict[self.__class__.__name__]:
+ self.QBDict[self.__class__.__name__]["CustomerMsgRef"]['ListID']= kwargs['CustomerMsgRef_ListID']
+ else:
+ self.QBDict[self.__class__.__name__]["CustomerMsgRef"]={'ListID': kwargs['CustomerMsgRef_ListID']}
+ if 'CustomerMsgRef_FullName' in kwargs:
+ self.QBDict[self.__class__.__name__]["CustomerMsgRef"]={'FullName': kwargs['CustomerMsgRef_FullName']}
+
+ if 'IsToBePrinted' in kwargs:
+ self.QBDict[self.__class__.__name__]["IsToBePrinted"]=kwargs['IsToBePrinted']
+ if 'IsToBeEmailed' in kwargs:
+ self.QBDict[self.__class__.__name__]["IsToBeEmailed"]=kwargs['IsToBeEmailed']
+ if 'IsTaxIncluded' in kwargs:
+ self.QBDict[self.__class__.__name__]["IsTaxIncluded"]=kwargs['IsTaxIncluded']
+ if 'CustomerSalesTaxCodeRef_ListID' in kwargs:
+ if 'CustomerSalesTaxCodeRef' in self.QBDict[self.__class__.__name__]:
+ self.QBDict[self.__class__.__name__]["CustomerSalesTaxCodeRef"]['ListID']= kwargs['CustomerSalesTaxCodeRef_ListID']
+ else:
+ self.QBDict[self.__class__.__name__]["CustomerSalesTaxCodeRef"]={'ListID': kwargs['CustomerSalesTaxCodeRef_ListID']}
+ if 'CustomerSalesTaxCodeRef_FullName' in kwargs:
+ self.QBDict[self.__class__.__name__]["CustomerSalesTaxCodeRef"]={'FullName': kwargs['CustomerSalesTaxCodeRef_FullName']}
+
+ if 'Other' in kwargs:
+ self.QBDict[self.__class__.__name__]["Other"]=kwargs['Other']
+ if 'ExchangeRate' in kwargs:
+ self.QBDict[self.__class__.__name__]["ExchangeRate"]=kwargs['ExchangeRate']
+ if 'ExternalGUID' in kwargs:
+ self.QBDict[self.__class__.__name__]["ExternalGUID"]=kwargs['ExternalGUID']
+ if 'LinkToTxnID' in kwargs:
+ self.QBDict[self.__class__.__name__]["LinkToTxnID"]=makeAList(kwargs['LinkToTxnID'])
+
+ if 'SetCredit_CreditTxnID' in kwargs and 'SetCredit_AppliedAmount' in kwargs:
+ self.QBDict[self.__class__.__name__]["SetCredit"]={'CreditTxnID':{'@useMacro':"MACROTYPE", '#text':kwargs['SetCredit_CreditTxnID']}, 'AppliedAmount': kwargs['SetCredit_AppliedAmount']}
+ if 'SetCredit_Override' in kwargs:
+ self.QBDict[self.__class__.__name__]["SetCredit"]["Override"]=kwargs['SetCredit_Override']
+#add InvoiceLineAdd kwargs here
+
+ self.InvoiceLineAdd = []
+ if 'InvoiceLineAdd' in kwargs:
+ LineAdd = kwargs.get('InvoiceLineAdd')
+ 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("InvoiceLineAdd 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.__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.__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 'Other2' in eachLineAdd:
+ self.LineAddDict["Other2"]=eachLineAdd['Other2']
+ if len(self.LineAddDict)>0:
+ self.InvoiceLineAdd.append(self.LineAddDict)
+ if 'LinkToTxn_TxnID' in eachLineAdd and 'LinkToTxn_TxnLineID' in eachLineAdd:
+ self.LineAddDict["LinkToTxn"]={'TxnID': eachLineAdd['LinkToTxn_TxnID'], 'TxnLineID': eachLineAdd['LinkToTxn_TxnLineID']}
+
+ #skip the rest, not too important
+ else:
+ print("InvoiceLineAdd has to be list of dict or a dict")
+ # print(f'{self.InvoiceLineAdd = }')
+ if len(self.InvoiceLineAdd)>0:
+ self.QBDict[self.__class__.__name__]['InvoiceLineAdd']=self.InvoiceLineAdd
+
+ if 'IncludeRetElement' in kwargs:
+ self.QBDict[self.classNameRq]["IncludeRetElement"]=kwargs['IncludeRetElement']
+
+ # print(self.classNameRq)
+ pprint.pprint(self.QBDict, sort_dicts=False)
class CustomerQuery(baseQBQuery):
- def __init__(self, *args, **kwargs):
- print(f'{args = }')
- print(f'{kwargs = }')
- super().__init__(*args, **kwargs)
- self.includeRetElements_allowed = ["ListID", "FullName", "TimeCreated", "TimeModified", "EditSequence", "Name", "IsActive", "ClassRef", "ParentRef", "Sublevel", "CompanyName", "Salutation",
- "FirstName", "MiddleName", "LastName", "JobTitle", "BillAddress", "BillAddressBlock", "ShipAddress", "ShipAddressBlock", "ShipToAddress", "Phone",
- "AltPhone", "Fax", "Email", "Cc", "Contact", "AltContact", "AdditionalContactRef", "ContactsRet", "CustomerTypeRef", "TermsRef", "SalesRepRef",
- "Balance", "TotalBalance", "SalesTaxCodeRef", "ItemSalesTaxRef", "SalesTaxCountry", "ResaleNumber", "AccountNumber", "CreditLimit",
- "PreferredPaymentMethodRef", "CreditCardInfo", "JobStatus", "JobStartDate", "JobProjectedEndDate", "JobEndDate", "JobDesc", "JobTypeRef", "Notes",
- "AdditionalNotesRet", "PreferredDeliveryMethod", "PriceLevelRef", "ExternalGUID", "TaxRegistrationNumber", "CurrencyRef", "DataExtRet"]
- 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.classNameRq]={}
+ def __init__(self, *args, **kwargs):
+ print(f'{args = }')
+ print(f'{kwargs = }')
+ super().__init__(*args, **kwargs)
+ self.includeRetElements_allowed = ["ListID", "FullName", "TimeCreated", "TimeModified", "EditSequence", "Name", "IsActive", "ClassRef", "ParentRef", "Sublevel", "CompanyName", "Salutation",
+ "FirstName", "MiddleName", "LastName", "JobTitle", "BillAddress", "BillAddressBlock", "ShipAddress", "ShipAddressBlock", "ShipToAddress", "Phone",
+ "AltPhone", "Fax", "Email", "Cc", "Contact", "AltContact", "AdditionalContactRef", "ContactsRet", "CustomerTypeRef", "TermsRef", "SalesRepRef",
+ "Balance", "TotalBalance", "SalesTaxCodeRef", "ItemSalesTaxRef", "SalesTaxCountry", "ResaleNumber", "AccountNumber", "CreditLimit",
+ "PreferredPaymentMethodRef", "CreditCardInfo", "JobStatus", "JobStartDate", "JobProjectedEndDate", "JobEndDate", "JobDesc", "JobTypeRef", "Notes",
+ "AdditionalNotesRet", "PreferredDeliveryMethod", "PriceLevelRef", "ExternalGUID", "TaxRegistrationNumber", "CurrencyRef", "DataExtRet"]
+ 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.classNameRq]={}
- if 'ListID' in kwargs:
- self.QBDict[self.classNameRq]["ListID"]=kwargs['ListID']
- elif 'FullName' in kwargs:
- self.QBDict[self.classNameRq]["FullName"]=kwargs['FullName']
- else:
- if 'MaxReturned' in kwargs:
- self.QBDict[self.classNameRq]["MaxReturned"]=kwargs['MaxReturned']
- if 'ActiveStatus' in kwargs:
- self.QBDict[self.classNameRq]["ActiveStatus"]=kwargs['ActiveStatus']
- if 'FromModifiedDate' in kwargs:
- self.QBDict[self.classNameRq]["FromModifiedDate"]=kwargs['FromModifiedDate']
- if 'ToModifiedDate' in kwargs:
- self.QBDict[self.classNameRq]["ToModifiedDate"]=kwargs['ToModifiedDate']
- if 'MatchCriterion' in kwargs and 'Name' in kwargs:
- self.QBDict[self.classNameRq]["NameFilter"]={'MatchCriterion':kwargs['MatchCriterion'], 'Name':kwargs['Name']}
- elif 'FromName' in kwargs or 'ToName' in kwargs:
- self.QBDict[self.classNameRq]["NameRangeFilter"]={'FromName':kwargs.get('FromName', ""), 'ToName':kwargs.get('ToName', "")}
+ if 'ListID' in kwargs:
+ self.QBDict[self.classNameRq]["ListID"]=kwargs['ListID']
+ elif 'FullName' in kwargs:
+ self.QBDict[self.classNameRq]["FullName"]=kwargs['FullName']
+ else:
+ if 'MaxReturned' in kwargs:
+ self.QBDict[self.classNameRq]["MaxReturned"]=kwargs['MaxReturned']
+ if 'ActiveStatus' in kwargs:
+ self.QBDict[self.classNameRq]["ActiveStatus"]=kwargs['ActiveStatus']
+ if 'FromModifiedDate' in kwargs:
+ self.QBDict[self.classNameRq]["FromModifiedDate"]=kwargs['FromModifiedDate']
+ if 'ToModifiedDate' in kwargs:
+ self.QBDict[self.classNameRq]["ToModifiedDate"]=kwargs['ToModifiedDate']
+ if 'MatchCriterion' in kwargs and 'Name' in kwargs:
+ self.QBDict[self.classNameRq]["NameFilter"]={'MatchCriterion':kwargs['MatchCriterion'], 'Name':kwargs['Name']}
+ elif 'FromName' in kwargs or 'ToName' in kwargs:
+ self.QBDict[self.classNameRq]["NameRangeFilter"]={'FromName':kwargs.get('FromName', ""), 'ToName':kwargs.get('ToName', "")}
- if 'Operator' in kwargs and 'Amount' in kwargs:
- self.QBDict[self.classNameRq]["TotalBalanceFilter"]={'Operator':kwargs['Operator'], 'Amount':kwargs['Amount']}
- if 'IncludeRetElement' in kwargs and kwargs['IncludeRetElement']:
- 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.classNameRq]["IncludeRetElement"]=IRE
- else:
- self.QBDict[self.classNameRq]["IncludeRetElement"]=self.includeRetElements_allowed
- if 'OwnerID' in kwargs:
- self.QBDict[self.classNameRq]["OwnerID"]=kwargs['OwnerID']
+ if 'Operator' in kwargs and 'Amount' in kwargs:
+ self.QBDict[self.classNameRq]["TotalBalanceFilter"]={'Operator':kwargs['Operator'], 'Amount':kwargs['Amount']}
+ if 'IncludeRetElement' in kwargs and kwargs['IncludeRetElement']:
+ 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.classNameRq]["IncludeRetElement"]=IRE
+ else:
+ self.QBDict[self.classNameRq]["IncludeRetElement"]=self.includeRetElements_allowed
+ if 'OwnerID' in kwargs:
+ self.QBDict[self.classNameRq]["OwnerID"]=kwargs['OwnerID']
- print(self.classNameRq)
- print(f'{self.QBDict = }' )
- # print(f'{self.includeRetElements_allowed =}')
- if self.__class__.__name__==self.className:
- self.runCheck() ### running the qbxml connection to get data ###
+ print(self.classNameRq)
+ print(f'{self.QBDict = }' )
+ # print(f'{self.includeRetElements_allowed =}')
+ if self.__class__.__name__==self.className:
+ self.runCheck() ### running the qbxml connection to get data ###
class TransactionQuery(baseQBQuery):
- def __init__(self, *args, **kwargs):
- print(f'{args = }')
- print(f'{kwargs = }')
- super().__init__(*args, **kwargs)
- ### Required Variable
- self.includeRetElements_allowed = ["TxnType", "TxnID", "TxnLineID", "TimeCreated", "TimeModified", "EntityRef", "AccountRef", "TxnDate", "RefNumber",
- "Amount", "CurrencyRef", "ExchangeRate", "AmountInHomeCurrency", "Memo",
- ]
- 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"]
+ def __init__(self, *args, **kwargs):
+ print(f'{args = }')
+ print(f'{kwargs = }')
+ super().__init__(*args, **kwargs)
+ ### Required Variable
+ self.includeRetElements_allowed = ["TxnType", "TxnID", "TxnLineID", "TimeCreated", "TimeModified", "EntityRef", "AccountRef", "TxnDate", "RefNumber",
+ "Amount", "CurrencyRef", "ExchangeRate", "AmountInHomeCurrency", "Memo",
+ ]
+ 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.classNameRq]={}
- ### End Required Variable. can put ENUM list below this (eg: self.ENUM_GeneralSummaryReportQuery=[])
+ self.QBDict[self.classNameRq]={}
+ ### End Required Variable. can put ENUM list below this (eg: self.ENUM_GeneralSummaryReportQuery=[])
- if 'TxnID' in kwargs:
- self.QBDict[self.classNameRq]["TxnID"]=kwargs['TxnID']
- else:
- if 'MaxReturned' in kwargs:
- if kwargs['MaxReturned'] is None:
- if 'TxnID' in kwargs:
- MaxReturned = None
- elif len(kwargs)>1 :
- MaxReturned = None
- else:
- MaxReturned = 1000
- elif isinstance(kwargs['MaxReturned'], str) and not kwargs['MaxReturned'].isdigit():
- MaxReturned = 0
- elif not isinstance(kwargs['MaxReturned'], int):
- MaxReturned = 0
- elif int(kwargs['MaxReturned']) > 1000:
- MaxReturned = 1000
- elif int(kwargs['MaxReturned']) > 0:
- MaxReturned = kwargs['MaxReturned']
- else:
- MaxReturned = 0
- else:
- MaxReturned = 0
- self.QBDict[self.classNameRq]["MaxReturned"]=MaxReturned
+ if 'TxnID' in kwargs:
+ self.QBDict[self.classNameRq]["TxnID"]=kwargs['TxnID']
+ else:
+ if 'MaxReturned' in kwargs:
+ if kwargs['MaxReturned'] is None:
+ if 'TxnID' in kwargs:
+ MaxReturned = None
+ elif len(kwargs)>1 :
+ MaxReturned = None
+ else:
+ MaxReturned = 1000
+ elif isinstance(kwargs['MaxReturned'], str) and not kwargs['MaxReturned'].isdigit():
+ MaxReturned = 0
+ elif not isinstance(kwargs['MaxReturned'], int):
+ MaxReturned = 0
+ elif int(kwargs['MaxReturned']) > 1000:
+ MaxReturned = 1000
+ elif int(kwargs['MaxReturned']) > 0:
+ MaxReturned = kwargs['MaxReturned']
+ else:
+ MaxReturned = 0
+ else:
+ MaxReturned = 0
+ self.QBDict[self.classNameRq]["MaxReturned"]=MaxReturned
- if 'RefNumber' in kwargs:
- self.QBDict[self.classNameRq]["RefNumber"]=kwargs['RefNumber']
- elif 'RefNumberCaseSensitive' in kwargs:
- self.QBDict[self.classNameRq]["RefNumberCaseSensitive"]=kwargs['RefNumberCaseSensitive']
- elif 'RefNumberFilter_MatchCriterion' in kwargs and 'RefNumberFilter_RefNumber' in kwargs:
- 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.classNameRq]["RefNumberRangeFilter"]={'FromRefNumber':kwargs.get('RefNumberFilter_FromRefNumber', ""), 'ToRefNumber':kwargs.get('RefNumberFilter_ToRefNumber', "")}
+ if 'RefNumber' in kwargs:
+ self.QBDict[self.classNameRq]["RefNumber"]=kwargs['RefNumber']
+ elif 'RefNumberCaseSensitive' in kwargs:
+ self.QBDict[self.classNameRq]["RefNumberCaseSensitive"]=kwargs['RefNumberCaseSensitive']
+ elif 'RefNumberFilter_MatchCriterion' in kwargs and 'RefNumberFilter_RefNumber' in kwargs:
+ 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.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.classNameRq]["TransactionModifiedDateRangeFilter"]={'FromModifiedDate':kwargs.get('TransactionModifiedDateRangeFilter_FromModifiedDate', ""), 'ToModifiedDate':kwargs.get('TransactionModifiedDateRangeFilter_ToModifiedDate', "")}
- elif 'TransactionModifiedDateRangeFilter_DateMacro' in kwargs:
- self.QBDict[self.classNameRq]["TransactionModifiedDateRangeFilter"]={'DateMacro':kwargs['TransactionModifiedDateRangeFilter_DateMacro']}
+ 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.classNameRq]["TransactionModifiedDateRangeFilter"]={'FromModifiedDate':kwargs.get('TransactionModifiedDateRangeFilter_FromModifiedDate', ""), 'ToModifiedDate':kwargs.get('TransactionModifiedDateRangeFilter_ToModifiedDate', "")}
+ elif 'TransactionModifiedDateRangeFilter_DateMacro' in kwargs:
+ 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.classNameRq]["TransactionDateRangeFilter"]={'FromTxnDate':kwargs.get('TransactionDateRangeFilter_FromTxnDate', ""), 'ToTxnDate':kwargs.get('TransactionDateRangeFilter_ToTxnDate', "")}
- elif 'TransactionDateRangeFilter_DateMacro' in kwargs:
- self.QBDict[self.classNameRq]["TransactionDateRangeFilter"]={'DateMacro':kwargs['TransactionDateRangeFilter_DateMacro']}
-
- #
- if 'TransactionEntityFilter_EntityTypeFilter' in kwargs:
- self.QBDict[self.classNameRq]["TransactionEntityFilter"]={'EntityTypeFilter':kwargs['TransactionEntityFilter_EntityTypeFilter']}
- elif 'TransactionEntityFilter_ListID' in kwargs:
- self.QBDict[self.classNameRq]["TransactionEntityFilter"]={'ListID':kwargs['TransactionEntityFilter_ListID']}
- elif 'TransactionEntityFilter_FullName' in kwargs:
- self.QBDict[self.classNameRq]["TransactionEntityFilter"]={'FullName':kwargs['TransactionEntityFilter_FullName']}
- elif 'TransactionEntityFilter_ListIDWithChildren' in kwargs:
- self.QBDict[self.classNameRq]["TransactionEntityFilter"]={'ListIDWithChildren':kwargs['TransactionEntityFilter_ListIDWithChildren']}
- elif 'TransactionEntityFilter_FullNameWithChildren' in kwargs:
- self.QBDict[self.classNameRq]["TransactionEntityFilter"]={'FullNameWithChildren':kwargs['TransactionEntityFilter_FullNameWithChildren']}
-
- #
- if 'TransactionAccountFilter_AccountTypeFilter' in kwargs:
- self.QBDict[self.classNameRq]["TransactionAccountFilter"]={'AccountTypeFilter':kwargs['TransactionAccountFilter_AccountTypeFilter']}
- elif 'TransactionAccountFilter_ListID' in kwargs:
- self.QBDict[self.classNameRq]["TransactionAccountFilter"]={'ListID':kwargs['TransactionAccountFilter_ListID']}
- elif 'TransactionAccountFilter_FullName' in kwargs:
- self.QBDict[self.classNameRq]["TransactionAccountFilter"]={'FullName':kwargs['TransactionAccountFilter_FullName']}
- elif 'TransactionAccountFilter_ListIDWithChildren' in kwargs:
- self.QBDict[self.classNameRq]["TransactionAccountFilter"]={'ListIDWithChildren':kwargs['TransactionAccountFilter_ListIDWithChildren']}
- elif 'TransactionAccountFilter_FullNameWithChildren' in kwargs:
- self.QBDict[self.classNameRq]["TransactionAccountFilter"]={'FullNameWithChildren':kwargs['TransactionAccountFilter_FullNameWithChildren']}
+ 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.classNameRq]["TransactionDateRangeFilter"]={'FromTxnDate':kwargs.get('TransactionDateRangeFilter_FromTxnDate', ""), 'ToTxnDate':kwargs.get('TransactionDateRangeFilter_ToTxnDate', "")}
+ elif 'TransactionDateRangeFilter_DateMacro' in kwargs:
+ self.QBDict[self.classNameRq]["TransactionDateRangeFilter"]={'DateMacro':kwargs['TransactionDateRangeFilter_DateMacro']}
+
+ #
+ if 'TransactionEntityFilter_EntityTypeFilter' in kwargs:
+ self.QBDict[self.classNameRq]["TransactionEntityFilter"]={'EntityTypeFilter':kwargs['TransactionEntityFilter_EntityTypeFilter']}
+ elif 'TransactionEntityFilter_ListID' in kwargs:
+ self.QBDict[self.classNameRq]["TransactionEntityFilter"]={'ListID':kwargs['TransactionEntityFilter_ListID']}
+ elif 'TransactionEntityFilter_FullName' in kwargs:
+ self.QBDict[self.classNameRq]["TransactionEntityFilter"]={'FullName':kwargs['TransactionEntityFilter_FullName']}
+ elif 'TransactionEntityFilter_ListIDWithChildren' in kwargs:
+ self.QBDict[self.classNameRq]["TransactionEntityFilter"]={'ListIDWithChildren':kwargs['TransactionEntityFilter_ListIDWithChildren']}
+ elif 'TransactionEntityFilter_FullNameWithChildren' in kwargs:
+ self.QBDict[self.classNameRq]["TransactionEntityFilter"]={'FullNameWithChildren':kwargs['TransactionEntityFilter_FullNameWithChildren']}
+
+ #
+ if 'TransactionAccountFilter_AccountTypeFilter' in kwargs:
+ self.QBDict[self.classNameRq]["TransactionAccountFilter"]={'AccountTypeFilter':kwargs['TransactionAccountFilter_AccountTypeFilter']}
+ elif 'TransactionAccountFilter_ListID' in kwargs:
+ self.QBDict[self.classNameRq]["TransactionAccountFilter"]={'ListID':kwargs['TransactionAccountFilter_ListID']}
+ elif 'TransactionAccountFilter_FullName' in kwargs:
+ self.QBDict[self.classNameRq]["TransactionAccountFilter"]={'FullName':kwargs['TransactionAccountFilter_FullName']}
+ elif 'TransactionAccountFilter_ListIDWithChildren' in kwargs:
+ self.QBDict[self.classNameRq]["TransactionAccountFilter"]={'ListIDWithChildren':kwargs['TransactionAccountFilter_ListIDWithChildren']}
+ elif 'TransactionAccountFilter_FullNameWithChildren' in kwargs:
+ self.QBDict[self.classNameRq]["TransactionAccountFilter"]={'FullNameWithChildren':kwargs['TransactionAccountFilter_FullNameWithChildren']}
- #
- if 'TransactionItemFilter_ItemTypeFilter' in kwargs:
- self.QBDict[self.classNameRq]["TransactionItemFilter"]={'ItemTypeFilter':kwargs['TransactionItemFilter_ItemTypeFilter']}
- elif 'TransactionItemFilter_ListID' in kwargs:
- self.QBDict[self.classNameRq]["TransactionItemFilter"]={'ListID':kwargs['TransactionItemFilter_ListID']}
- elif 'TransactionItemFilter_FullName' in kwargs:
- self.QBDict[self.classNameRq]["TransactionItemFilter"]={'FullName':kwargs['TransactionItemFilter_FullName']}
- elif 'TransactionItemFilter_ListIDWithChildren' in kwargs:
- self.QBDict[self.classNameRq]["TransactionItemFilter"]={'ListIDWithChildren':kwargs['TransactionItemFilter_ListIDWithChildren']}
- elif 'TransactionItemFilter_FullNameWithChildren' in kwargs:
- self.QBDict[self.classNameRq]["TransactionItemFilter"]={'FullNameWithChildren':kwargs['TransactionItemFilter_FullNameWithChildren']}
+ #
+ if 'TransactionItemFilter_ItemTypeFilter' in kwargs:
+ self.QBDict[self.classNameRq]["TransactionItemFilter"]={'ItemTypeFilter':kwargs['TransactionItemFilter_ItemTypeFilter']}
+ elif 'TransactionItemFilter_ListID' in kwargs:
+ self.QBDict[self.classNameRq]["TransactionItemFilter"]={'ListID':kwargs['TransactionItemFilter_ListID']}
+ elif 'TransactionItemFilter_FullName' in kwargs:
+ self.QBDict[self.classNameRq]["TransactionItemFilter"]={'FullName':kwargs['TransactionItemFilter_FullName']}
+ elif 'TransactionItemFilter_ListIDWithChildren' in kwargs:
+ self.QBDict[self.classNameRq]["TransactionItemFilter"]={'ListIDWithChildren':kwargs['TransactionItemFilter_ListIDWithChildren']}
+ elif 'TransactionItemFilter_FullNameWithChildren' in kwargs:
+ self.QBDict[self.classNameRq]["TransactionItemFilter"]={'FullNameWithChildren':kwargs['TransactionItemFilter_FullNameWithChildren']}
- if 'TransactionClassFilter_ListID' in kwargs:
- self.QBDict[self.classNameRq]["TransactionClassFilter"]={'ListID':kwargs['TransactionClassFilter_ListID']}
- elif 'TransactionClassFilter_FullName' in kwargs:
- self.QBDict[self.classNameRq]["TransactionClassFilter"]={'FullName':kwargs['TransactionClassFilter_FullName']}
- elif 'TransactionClassFilter_ListIDWithChildren' in kwargs:
- self.QBDict[self.classNameRq]["TransactionClassFilter"]={'ListIDWithChildren':kwargs['TransactionClassFilter_ListIDWithChildren']}
- elif 'TransactionClassFilter_FullNameWithChildren' in kwargs:
- self.QBDict[self.classNameRq]["TransactionClassFilter"]={'FullNameWithChildren':kwargs['TransactionClassFilter_FullNameWithChildren']}
-
- #
- if 'TransactionTypeFilter_TxnTypeFilter' in kwargs:
- self.QBDict[self.classNameRq]["TransactionTypeFilter"]={'TxnTypeFilter':kwargs['TransactionTypeFilter_TxnTypeFilter']}
-
- #
- if 'TransactionDetailLevelFilter' in kwargs:
- self.QBDict[self.classNameRq]["TransactionDetailLevelFilter"]=kwargs['TransactionDetailLevelFilter']
-
- #
- if 'TransactionPostingStatusFilter' in kwargs:
- self.QBDict[self.classNameRq]["TransactionPostingStatusFilter"]=kwargs['TransactionPostingStatusFilter']
-
- #
- if 'TransactionPaidStatusFilter' in kwargs:
- self.QBDict[self.classNameRq]["TransactionPaidStatusFilter"]=kwargs['TransactionPaidStatusFilter']
-
- if 'CurrencyFilter_ListID' in kwargs:
- self.QBDict[self.classNameRq]["CurrencyFilter"]=kwargs['CurrencyFilter_ListID']
- elif 'CurrencyFilter_FullName' in kwargs:
- self.QBDict[self.classNameRq]["CurrencyFilter"]=kwargs['CurrencyFilter_FullName']
+ if 'TransactionClassFilter_ListID' in kwargs:
+ self.QBDict[self.classNameRq]["TransactionClassFilter"]={'ListID':kwargs['TransactionClassFilter_ListID']}
+ elif 'TransactionClassFilter_FullName' in kwargs:
+ self.QBDict[self.classNameRq]["TransactionClassFilter"]={'FullName':kwargs['TransactionClassFilter_FullName']}
+ elif 'TransactionClassFilter_ListIDWithChildren' in kwargs:
+ self.QBDict[self.classNameRq]["TransactionClassFilter"]={'ListIDWithChildren':kwargs['TransactionClassFilter_ListIDWithChildren']}
+ elif 'TransactionClassFilter_FullNameWithChildren' in kwargs:
+ self.QBDict[self.classNameRq]["TransactionClassFilter"]={'FullNameWithChildren':kwargs['TransactionClassFilter_FullNameWithChildren']}
+
+ #
+ if 'TransactionTypeFilter_TxnTypeFilter' in kwargs:
+ self.QBDict[self.classNameRq]["TransactionTypeFilter"]={'TxnTypeFilter':kwargs['TransactionTypeFilter_TxnTypeFilter']}
+
+ #
+ if 'TransactionDetailLevelFilter' in kwargs:
+ self.QBDict[self.classNameRq]["TransactionDetailLevelFilter"]=kwargs['TransactionDetailLevelFilter']
+
+ #
+ if 'TransactionPostingStatusFilter' in kwargs:
+ self.QBDict[self.classNameRq]["TransactionPostingStatusFilter"]=kwargs['TransactionPostingStatusFilter']
+
+ #
+ if 'TransactionPaidStatusFilter' in kwargs:
+ self.QBDict[self.classNameRq]["TransactionPaidStatusFilter"]=kwargs['TransactionPaidStatusFilter']
+
+ if 'CurrencyFilter_ListID' in kwargs:
+ self.QBDict[self.classNameRq]["CurrencyFilter"]=kwargs['CurrencyFilter_ListID']
+ elif 'CurrencyFilter_FullName' in kwargs:
+ self.QBDict[self.classNameRq]["CurrencyFilter"]=kwargs['CurrencyFilter_FullName']
- 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.classNameRq]["IncludeRetElement"]=IRE
+ 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.classNameRq]["IncludeRetElement"]=IRE
- # print(self.classNameRq)
- # print(self.QBDict)
- if self.__class__.__name__==self.className:
- 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 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 = 'SalesOrderRet'
+ 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 = 'SalesOrderRet'
- 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.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.QBDict[self.classNameRq]={}
+
-
- self.isRequiredFieldSatisfied = False
- if 'requestID' in kwargs:
- self.QBDict[self.classNameRq]={'@requestID':kwargs.get('requestID', '1')}
- 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")
+
+ self.isRequiredFieldSatisfied = False
+ if 'requestID' in kwargs:
+ self.QBDict[self.classNameRq]={'@requestID':kwargs.get('requestID', '1')}
+ 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 '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']
+ 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
+#add InvoiceLineAdd kwargs here
- 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']
+ 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
- # print(self.classNameRq)
- print(f'{self.QBDict = }')
+ 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):
- 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", "TemplateRef",
- "TxnDate", "RefNumber", "BillAddress", "BillAddressBlock", "ShipAddress", "ShipAddressBlock", "PONumber,", "TermsRef", "DueDate",
- "SalesRepRef", "FOB", "ShipDate", "ShipMethodRef", "SubTotal", "ItemSalesTaxRef", "SalesTaxPercentage", "SalesTaxTotal", "TotalAmount",
- "CurrencyRef", "ExchangeRate", "TotalAmountInHomeCurrency", "IsManuallyClosed", "IsFullyInvoiced", "Memo", "CustomerMsgRef", "IsToBePrinted",
- "IsToBeEmailed", "IsTaxIncluded", "CustomerSalesTaxCodeRef", "Other", "ExternalGUID", "LinkedTxn", "SalesOrderLineRet", "SalesOrderLineGroupRet"
- ]
- 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"]
+ def __init__(self, *args, **kwargs):
+ if 'debug' in kwargs and isinstance(kwargs['debug'], bool):
+ self.class_debug=kwargs["debug"]
+ else:
+ self.class_debug=False
+ if self.class_debug:
+ print(f'{args = }')
+ print(f'{kwargs = }')
+ super().__init__(*args, **kwargs)
+ ### Required Variable
+ self.includeRetElements_allowed = ["TxnID", "TimeCreated", "TimeModified", "EditSequence", "TxnNumber", "CustomerRef", "ClassRef", "TemplateRef",
+ "TxnDate", "RefNumber", "BillAddress", "BillAddressBlock", "ShipAddress", "ShipAddressBlock", "PONumber,", "TermsRef", "DueDate",
+ "SalesRepRef", "FOB", "ShipDate", "ShipMethodRef", "SubTotal", "ItemSalesTaxRef", "SalesTaxPercentage", "SalesTaxTotal", "TotalAmount",
+ "CurrencyRef", "ExchangeRate", "TotalAmountInHomeCurrency", "IsManuallyClosed", "IsFullyInvoiced", "Memo", "CustomerMsgRef", "IsToBePrinted",
+ "IsToBeEmailed", "IsTaxIncluded", "CustomerSalesTaxCodeRef", "Other", "ExternalGUID", "LinkedTxn", "SalesOrderLineRet", "SalesOrderLineGroupRet"
+ ]
+ 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'
- 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.classNameRq]["TxnID"]=makeAList(kwargs['TxnID'])
- elif 'RefNumber' in kwargs and kwargs['RefNumber']:
- self.QBDict[self.classNameRq]["RefNumber"]=makeAList(kwargs['RefNumber'])
- elif 'RefNumberCaseSensitive' in kwargs and kwargs['RefNumberCaseSensitive']:
- self.QBDict[self.classNameRq]["RefNumberCaseSensitive"]=makeAList(kwargs['RefNumberCaseSensitive'])
- else:
- if 'MaxReturned' in kwargs:
- 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.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.classNameRq]["TxnDateRangeFilter"]={'FromTxnDate':kwargs.get('TxnDateRangeFilter_FromTxnDate', ""), 'ToTxnDate':kwargs.get('TxnDateRangeFilter_ToTxnDate', "")}
- elif 'TxnDateRangeFilter_DateMacro' in kwargs:
- DM=cleanIncludeRetElements(ENUM_DateMacro, kwargs['TxnDateRangeFilter_DateMacro'])
- if len(DM)>0:
- self.QBDict[self.classNameRq]["TxnDateRangeFilter"]={'DateMacro':DM}
+ 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 'EntityFilter_ListID' in kwargs:
- self.QBDict[self.classNameRq]["EntityFilter"]={'ListID':makeAList(kwargs['EntityFilter_ListID'])}
- elif 'EntityFilter_FullName' in kwargs:
- self.QBDict[self.classNameRq]["EntityFilter"]={'FullName':makeAList(kwargs['EntityFilter_FullName'])}
- elif 'EntityFilter_ListIDWithChildren' in kwargs:
- self.QBDict[self.classNameRq]["EntityFilter"]={'ListIDWithChildren':kwargs['EntityFilter_ListIDWithChildren']}
- elif 'EntityFilter_FullNameWithChildren' in kwargs:
- self.QBDict[self.classNameRq]["EntityFilter"]={'FullNameWithChildren':kwargs['EntityFilter_FullNameWithChildren']}
+ if 'TxnID' in kwargs and kwargs['TxnID'] and len(kwargs['TxnID'])>0:
+ self.QBDict[self.classNameRq]["TxnID"]=makeAList(kwargs['TxnID'])
+ elif 'RefNumber' in kwargs and kwargs['RefNumber']:
+ self.QBDict[self.classNameRq]["RefNumber"]=makeAList(kwargs['RefNumber'])
+ elif 'RefNumberCaseSensitive' in kwargs and kwargs['RefNumberCaseSensitive']:
+ self.QBDict[self.classNameRq]["RefNumberCaseSensitive"]=makeAList(kwargs['RefNumberCaseSensitive'])
+ else:
+ if 'MaxReturned' in kwargs:
+ 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.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.classNameRq]["TxnDateRangeFilter"]={'FromTxnDate':kwargs.get('TxnDateRangeFilter_FromTxnDate', ""), 'ToTxnDate':kwargs.get('TxnDateRangeFilter_ToTxnDate', "")}
+ elif 'TxnDateRangeFilter_DateMacro' in kwargs:
+ DM=cleanIncludeRetElements(ENUM_DateMacro, kwargs['TxnDateRangeFilter_DateMacro'])
+ if len(DM)>0:
+ self.QBDict[self.classNameRq]["TxnDateRangeFilter"]={'DateMacro':DM}
- if 'RefNumberFilter_MatchCriterion' in kwargs and 'RefNumberFilter_RefNumber' in kwargs:
- 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.classNameRq]["RefNumberRangeFilter"]={'FromRefNumber':kwargs.get('RefNumberRangeFilter_FromRefNumber', ""), 'ToRefNumber':kwargs.get('RefNumberRangeFilter_ToRefNumber', "")}
+ if 'EntityFilter_ListID' in kwargs:
+ self.QBDict[self.classNameRq]["EntityFilter"]={'ListID':makeAList(kwargs['EntityFilter_ListID'])}
+ elif 'EntityFilter_FullName' in kwargs:
+ self.QBDict[self.classNameRq]["EntityFilter"]={'FullName':makeAList(kwargs['EntityFilter_FullName'])}
+ elif 'EntityFilter_ListIDWithChildren' in kwargs:
+ self.QBDict[self.classNameRq]["EntityFilter"]={'ListIDWithChildren':kwargs['EntityFilter_ListIDWithChildren']}
+ elif 'EntityFilter_FullNameWithChildren' in kwargs:
+ self.QBDict[self.classNameRq]["EntityFilter"]={'FullNameWithChildren':kwargs['EntityFilter_FullNameWithChildren']}
- if 'CurrencyFilter_ListID' in kwargs:
- self.QBDict[self.classNameRq]["CurrencyFilter"]=makeAList(kwargs['CurrencyFilter_ListID'])
- elif 'CurrencyFilter_FullName' in kwargs:
- self.QBDict[self.classNameRq]["CurrencyFilter"]=makeAList(kwargs['CurrencyFilter_FullName'])
+ if 'RefNumberFilter_MatchCriterion' in kwargs and 'RefNumberFilter_RefNumber' in kwargs:
+ 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.classNameRq]["RefNumberRangeFilter"]={'FromRefNumber':kwargs.get('RefNumberRangeFilter_FromRefNumber', ""), 'ToRefNumber':kwargs.get('RefNumberRangeFilter_ToRefNumber', "")}
- if 'IncludeLineItems' in kwargs:
- self.QBDict[self.classNameRq]["IncludeLineItems"]=kwargs['IncludeLineItems']
- if 'IncludeLinkedTxns' in kwargs:
- 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.classNameRq]["IncludeRetElement"]=IRE
+ if 'CurrencyFilter_ListID' in kwargs:
+ self.QBDict[self.classNameRq]["CurrencyFilter"]=makeAList(kwargs['CurrencyFilter_ListID'])
+ elif 'CurrencyFilter_FullName' in kwargs:
+ self.QBDict[self.classNameRq]["CurrencyFilter"]=makeAList(kwargs['CurrencyFilter_FullName'])
- if 'OwnerID' in kwargs: # usually value=0 to get to DataExtRet (additional data)
- self.QBDict[self.classNameRq]["OwnerID"]=kwargs['OwnerID']
+ if 'IncludeLineItems' in kwargs:
+ self.QBDict[self.classNameRq]["IncludeLineItems"]=kwargs['IncludeLineItems']
+ if 'IncludeLinkedTxns' in kwargs:
+ 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.classNameRq]["IncludeRetElement"]=IRE
- # print(self.classNameRq)
- print(self.QBDict)
- if self.__class__.__name__==self.className:
- self.runCheck() ### running the qbxml connection to get data ###
+ if 'OwnerID' in kwargs: # usually value=0 to get to DataExtRet (additional data)
+ self.QBDict[self.classNameRq]["OwnerID"]=kwargs['OwnerID']
+
+ # print(self.classNameRq)
+ if self.class_debug:
+ print(self.QBDict)
+ if self.__class__.__name__==self.className:
+ self.runCheck() ### running the qbxml connection to get data ###
class InvoiceQuery(baseQBQuery):
- def __init__(self, *args, **kwargs):
+ 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"
- self.className = 'InvoiceQuery'
- self.classNameRq:str = self.__class__.__name__ + 'Rq'
- if 'debug' in kwargs and isinstance(kwargs['debug'], bool):
- self.class_debug=kwargs["debug"]
+ 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"
+ 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.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']
+ 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'] and len(kwargs['TxnID'])>0:
- _txnIDs=makeAList(kwargs['TxnID'])
- self.QBDict[self.classNameRq]["TxnID"]= makeAList(kwargs['TxnID'])
- elif 'RefNumber' in kwargs and kwargs['RefNumber']:
- self.QBDict[self.classNameRq]['RefNumber']=makeAList(kwargs['RefNumber'])
- elif 'RefNumberCaseSensitive' in kwargs and kwargs['RefNumberCaseSensitive']:
- self.QBDict[self.classNameRq]["RefNumberCaseSensitive"]=makeAList(kwargs['RefNumberCaseSensitive'])
- else:
- if 'MaxReturned' in kwargs:
- 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.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.classNameRq]["TxnDateRangeFilter"]={'FromTxnDate':kwargs.get('TxnDateRangeFilter_FromTxnDate', ""), 'ToTxnDate':kwargs.get('TxnDateRangeFilter_ToTxnDate', "")}
- elif 'TxnDateRangeFilter_DateMacro' in kwargs:
- DM=cleanIncludeRetElements(ENUM_DateMacro, kwargs['TxnDateRangeFilter_DateMacro'])
- if len(DM)>0:
- self.QBDict[self.classNameRq]["TxnDateRangeFilter"]={'DateMacro':DM}
+ if 'TxnID' in kwargs and kwargs['TxnID'] and len(kwargs['TxnID'])>0:
+ _txnIDs=makeAList(kwargs['TxnID'])
+ self.QBDict[self.classNameRq]["TxnID"]= makeAList(kwargs['TxnID'])
+ elif 'RefNumber' in kwargs and kwargs['RefNumber']:
+ self.QBDict[self.classNameRq]['RefNumber']=makeAList(kwargs['RefNumber'])
+ elif 'RefNumberCaseSensitive' in kwargs and kwargs['RefNumberCaseSensitive']:
+ self.QBDict[self.classNameRq]["RefNumberCaseSensitive"]=makeAList(kwargs['RefNumberCaseSensitive'])
+ else:
+ if 'MaxReturned' in kwargs:
+ 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.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.classNameRq]["TxnDateRangeFilter"]={'FromTxnDate':kwargs.get('TxnDateRangeFilter_FromTxnDate', ""), 'ToTxnDate':kwargs.get('TxnDateRangeFilter_ToTxnDate', "")}
+ elif 'TxnDateRangeFilter_DateMacro' in kwargs:
+ 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.classNameRq]["EntityFilter"]={'ListID':kwargs['EntityFilter_ListID']}
- self.QBDict[self.classNameRq]['EntityFilter']={'ListID':makeAList(kwargs['EntityFilter_ListID'])}
- elif 'EntityFilter_FullName' in kwargs:
- # 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.classNameRq]["EntityFilter"]={'ListIDWithChildren':kwargs['EntityFilter_ListIDWithChildren']}
- elif 'EntityFilter_FullNameWithChildren' in kwargs:
- self.QBDict[self.classNameRq]["EntityFilter"]={'FullNameWithChildren':kwargs['EntityFilter_FullNameWithChildren']}
+ if 'EntityFilter_ListID' in kwargs:
+ # 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.classNameRq]["EntityFilter"]={'FullName':kwargs['EntityFilter_FullName']}
+ self.QBDict[self.classNameRq]['EntityFilter']={'FullName':makeAList(kwargs['EntityFilter_FullName'])}
+ elif 'EntityFilter_ListIDWithChildren' in kwargs:
+ self.QBDict[self.classNameRq]["EntityFilter"]={'ListIDWithChildren':kwargs['EntityFilter_ListIDWithChildren']}
+ elif 'EntityFilter_FullNameWithChildren' in kwargs:
+ self.QBDict[self.classNameRq]["EntityFilter"]={'FullNameWithChildren':kwargs['EntityFilter_FullNameWithChildren']}
- if 'AccountFilter_ListID' in kwargs:
- self.QBDict[self.classNameRq]["AccountFilter"]={'ListID':makeAList(kwargs['AccountFilter_ListID'])}
- elif 'AccountFilter_FullName' in kwargs:
- self.QBDict[self.classNameRq]["AccountFilter"]={'FullName':makeAList(kwargs['AccountFilter_FullName'])}
- elif 'AccountFilter_ListIDWithChildren' in kwargs:
- self.QBDict[self.classNameRq]["AccountFilter"]={'ListIDWithChildren':kwargs['AccountFilter_ListIDWithChildren']}
- elif 'AccountFilter_FullNameWithChildren' in kwargs:
- self.QBDict[self.classNameRq]["AccountFilter"]={'FullNameWithChildren':kwargs['AccountFilter_FullNameWithChildren']}
+ if 'AccountFilter_ListID' in kwargs:
+ self.QBDict[self.classNameRq]["AccountFilter"]={'ListID':makeAList(kwargs['AccountFilter_ListID'])}
+ elif 'AccountFilter_FullName' in kwargs:
+ self.QBDict[self.classNameRq]["AccountFilter"]={'FullName':makeAList(kwargs['AccountFilter_FullName'])}
+ elif 'AccountFilter_ListIDWithChildren' in kwargs:
+ self.QBDict[self.classNameRq]["AccountFilter"]={'ListIDWithChildren':kwargs['AccountFilter_ListIDWithChildren']}
+ elif 'AccountFilter_FullNameWithChildren' in kwargs:
+ self.QBDict[self.classNameRq]["AccountFilter"]={'FullNameWithChildren':kwargs['AccountFilter_FullNameWithChildren']}
- if 'RefNumberFilter_MatchCriterion' in kwargs and 'RefNumberFilter_RefNumber' in kwargs:
- 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.classNameRq]["RefNumberRangeFilter"]={'FromRefNumber':kwargs.get('RefNumberRangeFilter_FromRefNumber', ""), 'ToRefNumber':kwargs.get('RefNumberRangeFilter_ToRefNumber', "")}
+ if 'RefNumberFilter_MatchCriterion' in kwargs and 'RefNumberFilter_RefNumber' in kwargs:
+ 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.classNameRq]["RefNumberRangeFilter"]={'FromRefNumber':kwargs.get('RefNumberRangeFilter_FromRefNumber', ""), 'ToRefNumber':kwargs.get('RefNumberRangeFilter_ToRefNumber', "")}
- if 'CurrencyFilter_ListID' in kwargs:
- self.QBDict[self.classNameRq]["CurrencyFilter"]=makeAList(kwargs['CurrencyFilter_ListID'])
- elif 'CurrencyFilter_FullName' in kwargs:
- self.QBDict[self.classNameRq]["CurrencyFilter"]=makeAList(kwargs['CurrencyFilter_FullName'])
+ if 'CurrencyFilter_ListID' in kwargs:
+ self.QBDict[self.classNameRq]["CurrencyFilter"]=makeAList(kwargs['CurrencyFilter_ListID'])
+ elif 'CurrencyFilter_FullName' in kwargs:
+ self.QBDict[self.classNameRq]["CurrencyFilter"]=makeAList(kwargs['CurrencyFilter_FullName'])
- if 'IncludeLineItems' in kwargs:
- print(f'{self.QBDict} = ')
- self.QBDict[self.classNameRq]["IncludeLineItems"]=kwargs['IncludeLineItems']
- if 'IncludeLinkedTxns' in kwargs:
- 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.classNameRq]["IncludeRetElement"]=IRE
+ if 'IncludeLineItems' in kwargs:
+ print(f'{self.QBDict} = ')
+ self.QBDict[self.classNameRq]["IncludeLineItems"]=kwargs['IncludeLineItems']
+ if 'IncludeLinkedTxns' in kwargs:
+ 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.classNameRq]["IncludeRetElement"]=IRE
- if 'OwnerID' in kwargs: # usually value=0 to get to DataExtRet (additional data)
- self.QBDict[self.classNameRq]["OwnerID"]=kwargs['OwnerID']
- # print(self.classNameRq)
- # print(self.QBDict)
- if self.__class__.__name__==self.className:
- self.runCheck() ### running the qbxml connection to get data ###
+ if 'OwnerID' in kwargs: # usually value=0 to get to DataExtRet (additional data)
+ self.QBDict[self.classNameRq]["OwnerID"]=kwargs['OwnerID']
+ # print(self.classNameRq)
+ # print(self.QBDict)
+ if self.__class__.__name__==self.className:
+ self.runCheck() ### running the qbxml connection to get data ###
@timing
def InventoryStockStatusByVendor(ReportEntityFilter_FullName:str='TACO') -> dict:
- # g= GeneralSummaryReportQuery(debug=False, GeneralSummaryReportType="ProfitAndLossStandard", ReportDateMacro="ThisYear")
- g= GeneralSummaryReportQuery(debug=False, GeneralSummaryReportType="InventoryStockStatusByVendor", ReportEntityFilter_FullName=ReportEntityFilter_FullName, )
- # g= GeneralSummaryReportQuery(debug=False, GeneralSummaryReportType="InventoryStockStatusByVendor", ReportItemFilter_FullName=['TACH:RLC:BBS009PO45-500','TACH:RLC:BBS009PO45-400'], ReportEntityFilter_FullName='TACO' )
- # print(g, type(g))
- # print(type(g.all()))
- # print(g.all())
- # print(g.response_string)
- # print(g.all())
- # pprint.pprint(g.filter("reportdata").all())
- # abc = g.filter("reportdata").all()
- # print(abc)
- # print()
- # pprint.pprint(g.filter('datarow').all(abc), sort_dicts=False)
- datarows = g.filter('datarow').all()
- # pprint.pprint(datarows, sort_dicts=False)
- # print(type(datarows))
- dt = {}
- if len(datarows[0]['DataRow'])==0:
- return dt
- for datarow in datarows[0]['DataRow']:
- # print(datarow,)
- FullName=datarow['RowData']['@value']
- if len(FullName.split(':'))==3:
- ShortName=datarow['ColData'][0]['@value']
- QOH, QOSO, QA, UOM, QOPO, min, max, ND = None, None, None, None, None, None, None, None
- for coldata in datarow['ColData']:
- if coldata['@colID']=='5':
- QOH=coldata['@value']
- elif coldata['@colID']=='6':
- QOSO=coldata['@value']
- elif coldata['@colID']=='8':
- QA=coldata['@value']
- elif coldata['@colID']=='9':
- UOM=coldata['@value']
- elif coldata['@colID']=='11':
- QOPO=coldata['@value']
- elif coldata['@colID']=='3':
- min=coldata['@value']
- elif coldata['@colID']=='4':
- max=coldata['@value']
- elif coldata['@colID']=='13':
- ND=coldata['@value'] #Next Delivery Date
- dt[FullName]={'ShortName':ShortName, 'QOH':QOH, 'QOSO':QOSO, 'QA':QA, 'QOPO':QOPO, 'UOM':UOM, 'min':min, 'max':max, 'ND':ND}
- # print(f'{dt = }')
- print(f'InventoryStockStatusByVendor {len(dt) = }')
- return dt
- """
- {'@rowNumber': '1016',
- 'ColData': [{'@colID': '1',
- '@value': 'EDG-P1251-1/42'},
- {'@colID': '2',
- '@value': 'EDGING 42 X 1 MM P1251'},
- {'@colID': '5', '@value': '1'}, # QOH
- {'@colID': '6', '@value': '0'}, # QOSO
- {'@colID': '7', '@value': '0'}, #assembly
- {'@colID': '8', '@value': '1'}, # QA(available)(QOH-QOSO-assembly)
- {'@colID': '9', '@value': 'Roll'}, #base_uom
- {'@colID': '10', '@value': 'false'},
- {'@colID': '11', '@value': '0'}, #QOPO
- {'@colID': '12', '@value': '0'}, #ReorderqTY
- {'@colID': '13', '@value': '13/04/2022'}, #NextDeliver
- {'@colID': '14', '@value': '0'}],
- 'RowData': {'@rowType': 'item',
- '@value': 'TEDG:P142:EDG-P1251-1/42'}},
- """
+ # g= GeneralSummaryReportQuery(debug=False, GeneralSummaryReportType="ProfitAndLossStandard", ReportDateMacro="ThisYear")
+ g= GeneralSummaryReportQuery(debug=False, GeneralSummaryReportType="InventoryStockStatusByVendor", ReportEntityFilter_FullName=ReportEntityFilter_FullName, )
+ # g= GeneralSummaryReportQuery(debug=False, GeneralSummaryReportType="InventoryStockStatusByVendor", ReportItemFilter_FullName=['TACH:RLC:BBS009PO45-500','TACH:RLC:BBS009PO45-400'], ReportEntityFilter_FullName='TACO' )
+ # print(g, type(g))
+ # print(type(g.all()))
+ # print(g.all())
+ # print(g.response_string)
+ # print(g.all())
+ # pprint.pprint(g.filter("reportdata").all())
+ # abc = g.filter("reportdata").all()
+ # print(abc)
+ # print()
+ # pprint.pprint(g.filter('datarow').all(abc), sort_dicts=False)
+ datarows = g.filter('datarow').all()
+ # pprint.pprint(datarows, sort_dicts=False)
+ # print(type(datarows))
+ dt = {}
+ if len(datarows[0]['DataRow'])==0:
+ return dt
+ for datarow in datarows[0]['DataRow']:
+ # print(datarow,)
+ FullName=datarow['RowData']['@value']
+ if len(FullName.split(':'))==3:
+ ShortName=datarow['ColData'][0]['@value']
+ QOH, QOSO, QA, UOM, QOPO, min, max, ND = None, None, None, None, None, None, None, None
+ for coldata in datarow['ColData']:
+ if coldata['@colID']=='5':
+ QOH=coldata['@value']
+ elif coldata['@colID']=='6':
+ QOSO=coldata['@value']
+ elif coldata['@colID']=='8':
+ QA=coldata['@value']
+ elif coldata['@colID']=='9':
+ UOM=coldata['@value']
+ elif coldata['@colID']=='11':
+ QOPO=coldata['@value']
+ elif coldata['@colID']=='3':
+ min=coldata['@value']
+ elif coldata['@colID']=='4':
+ max=coldata['@value']
+ elif coldata['@colID']=='13':
+ ND=coldata['@value'] #Next Delivery Date
+ dt[FullName]={'ShortName':ShortName, 'QOH':QOH, 'QOSO':QOSO, 'QA':QA, 'QOPO':QOPO, 'UOM':UOM, 'min':min, 'max':max, 'ND':ND}
+ # print(f'{dt = }')
+ print(f'InventoryStockStatusByVendor {len(dt) = }')
+ return dt
+ """
+ {'@rowNumber': '1016',
+ 'ColData': [{'@colID': '1',
+ '@value': 'EDG-P1251-1/42'},
+ {'@colID': '2',
+ '@value': 'EDGING 42 X 1 MM P1251'},
+ {'@colID': '5', '@value': '1'}, # QOH
+ {'@colID': '6', '@value': '0'}, # QOSO
+ {'@colID': '7', '@value': '0'}, #assembly
+ {'@colID': '8', '@value': '1'}, # QA(available)(QOH-QOSO-assembly)
+ {'@colID': '9', '@value': 'Roll'}, #base_uom
+ {'@colID': '10', '@value': 'false'},
+ {'@colID': '11', '@value': '0'}, #QOPO
+ {'@colID': '12', '@value': '0'}, #ReorderqTY
+ {'@colID': '13', '@value': '13/04/2022'}, #NextDeliver
+ {'@colID': '14', '@value': '0'}],
+ 'RowData': {'@rowType': 'item',
+ '@value': 'TEDG:P142:EDG-P1251-1/42'}},
+ """
if __name__ == "__main__":
- @timing
- def invoicequery():
- g=InvoiceQuery(debug=False, MaxReturned = 2, IncludeLineItems="true", IncludeLinkedTxns="true",
- RefNumber="24010022")#"2023-08-22")
- print(json.dumps(g.filter().all(), indent=3))
- print(g.count())
+ @timing
+ def invoicequery():
+ g=InvoiceQuery(debug=False, MaxReturned = 2, IncludeLineItems="true", IncludeLinkedTxns="true",
+ RefNumber="24010022")#"2023-08-22")
+ print(json.dumps(g.filter().all(), indent=3))
+ print(g.count())
- @timing
- def salesorderquery():
- 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())
+ @timing
+ def salesorderquery():
+ 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())
- @timing
- def transactionquery():
- g=TransactionQuery(debug=False, MaxReturned=None, TransactionTypeFilter_TxnTypeFilter="Invoice", TransactionEntityFilter_FullName="Abadi Serpong",
- TransactionDetailLevelFilter="All", TransactionPaidStatusFilter="Open", TransactionDateRangeFilter_DateMacro="ThisFiscalYear")
- # print(g.response_string)
- # pprint.pprint({"temp":g.filter(['TxnType', 'TxnID', 'Entityref', 'accountref', 'txndate', 'refnumber'])})
- # print(json.dumps(g.filter(['TxnType', 'TxnID', 'Entityref', 'accountref', 'refnumber','txndate',"amount" ]).all(), indent=3))
+ @timing
+ def transactionquery():
+ g=TransactionQuery(debug=False, MaxReturned=None, TransactionTypeFilter_TxnTypeFilter="Invoice", TransactionEntityFilter_FullName="Abadi Serpong",
+ TransactionDetailLevelFilter="All", TransactionPaidStatusFilter="Open", TransactionDateRangeFilter_DateMacro="ThisFiscalYear")
+ # print(g.response_string)
+ # pprint.pprint({"temp":g.filter(['TxnType', 'TxnID', 'Entityref', 'accountref', 'txndate', 'refnumber'])})
+ # print(json.dumps(g.filter(['TxnType', 'TxnID', 'Entityref', 'accountref', 'refnumber','txndate',"amount" ]).all(), indent=3))
- print(json.dumps(g.filter().all(), indent=3))
+ print(json.dumps(g.filter().all(), indent=3))
- print(g.count())
+ print(g.count())
- @timing
- def main():
- g= GeneralSummaryReportQuery(debug=False, GeneralSummaryReportType="ProfitAndLossStandard", ReportDateMacro="ThisYear")
- print(g, type(g))
- print(type(g.all()))
- print(g.all())
- print(g.response_string)
- pprint.pprint(g.filter("reportdata").all())
- print(g.count(), g.all())
+ @timing
+ def main():
+ g= GeneralSummaryReportQuery(debug=False, GeneralSummaryReportType="ProfitAndLossStandard", ReportDateMacro="ThisYear")
+ print(g, type(g))
+ print(type(g.all()))
+ print(g.all())
+ print(g.response_string)
+ pprint.pprint(g.filter("reportdata").all())
+ print(g.count(), g.all())
- @timing
- def iteminventoryquery():
- # g=ItemInventoryQuery()
- g=ItemInventoryQuery(debug = False, MaxReturned = 5, IncludeRetElements = "abc")# IncludeRetElement=["FullName", "DataExtRet", "Name", "QuantityOnHand", "QuantityOnSalesOrder", "QuantityOnOrder", "ManufacturerPartNumber"]) #put OwnerID=0 to get DataExtRet
- # print("before g.all")
- # print(f'{g.all() = }')
- # print("after g.all")
- # print("")
- # pprint.pprint(g.filter(["FullName", "Name", "sublevel"]).all())
- # print(f'{g.filter("fullname") = }')
+ @timing
+ def iteminventoryquery():
+ # g=ItemInventoryQuery()
+ g=ItemInventoryQuery(debug = False, MaxReturned = 5, IncludeRetElements = "abc")# IncludeRetElement=["FullName", "DataExtRet", "Name", "QuantityOnHand", "QuantityOnSalesOrder", "QuantityOnOrder", "ManufacturerPartNumber"]) #put OwnerID=0 to get DataExtRet
+ # print("before g.all")
+ # print(f'{g.all() = }')
+ # print("after g.all")
+ # print("")
+ # pprint.pprint(g.filter(["FullName", "Name", "sublevel"]).all())
+ # print(f'{g.filter("fullname") = }')
- # print(f'{g = }')
- # pprint.pprint(g.response_string,indent=4 )
- print(g.response_string, type(g.response_string))
- print("before")
- # print(g.filter([ "Name", "QuantityOnHand", "QUantityOnSalesOrder", "QuantityonOrder"]).first())
- c = g.filter([ "Name", "QuantityOnHand", "QUantityOnSalesOrder", "QuantityonOrder"]).first()
- print("c:",type(c), c)
- # pprint.pprint(g.returnRet())
- # print(g.filter("name").firstValue())
- print(g.count())
- print(g.statusOk)
- print(g.filter(["name", "manufacturerpartnumber", "quantityonhand"]).getValuesOf(["Name","quantityonhand", "manufacturerpartnumber"]))
+ # print(f'{g = }')
+ # pprint.pprint(g.response_string,indent=4 )
+ print(g.response_string, type(g.response_string))
+ print("before")
+ # print(g.filter([ "Name", "QuantityOnHand", "QUantityOnSalesOrder", "QuantityonOrder"]).first())
+ c = g.filter([ "Name", "QuantityOnHand", "QUantityOnSalesOrder", "QuantityonOrder"]).first()
+ print("c:",type(c), c)
+ # pprint.pprint(g.returnRet())
+ # print(g.filter("name").firstValue())
+ print(g.count())
+ print(g.statusOk)
+ print(g.filter(["name", "manufacturerpartnumber", "quantityonhand"]).getValuesOf(["Name","quantityonhand", "manufacturerpartnumber"]))
- # print(g.filter(["DataExtRet"]).all())
+ # print(g.filter(["DataExtRet"]).all())
- @timing
- def customerquery():
- g= CustomerQuery(MaxReturned=3, IncludeRetElement=["fullname", "name", "CompanyName", "BillAddressBlock", "ShipAddressBlock", "Notes", "AdditionalNotesRet", 'creditlimit'])
- # g= CustomerQuery(MaxReturned=20, ActiveStatus="ActiveOnly", MatchCriterion="StartsWith", Name="to", IncludeRetElement=["fullname", "name", "billaddressblock", "currencyfilter"])
- # print(g.IncludeRetElements_allowed)
- print("init finish")
- # print(f'{type(g.all()) = }')
- print("before g.all")
- print(f'{g.all() = }')
- print("after g.all")
- pprint.pprint(f'{g.filter(["FullName", "Name", "Notes"]).all() = }')
- print(f'{g.filter() = }')
- # pprint.pprint(g.filter(["FullName", "abc", "BillAddressBlock"]).all())
- # print(f'{g.filter(["FullName", "abc", "BillAddressBlock"]).all() = }')
- # print("")
- # print(f'{g.filter([ "Addr1", "Addr2", "Addr3", "Addr4", "Addr5"]).all() = }')
- # print(f'{g.filter([ "Addr1", "Addr2", "Addr3", "Addr4", "Addr5"]) = }')
- # print(f'{g.filter(["fullname", "name"]).lastValue() = }')
+ @timing
+ def customerquery():
+ g= CustomerQuery(MaxReturned=3, IncludeRetElement=["fullname", "name", "CompanyName", "BillAddressBlock", "ShipAddressBlock", "Notes", "AdditionalNotesRet", 'creditlimit'])
+ g= CustomerQuery(MaxReturned=2, IncludeRetElement=["fullname", "name", "CompanyName", "BillAddressBlock", "ShipAddress", "ShipToAddress","Phone", "Notes", "AdditionalNotesRet", 'creditlimit'])
+ # g= CustomerQuery(MaxReturned=20, ActiveStatus="ActiveOnly", MatchCriterion="StartsWith", Name="to", IncludeRetElement=["fullname", "name", "billaddressblock", "currencyfilter"])
+ # print(g.IncludeRetElements_allowed)
+ print("init finish")
+ # print(f'{type(g.all()) = }')
+ print("before g.all")
+ print(f'{g.all() = }')
+ print("after g.all")
+ pprint.pprint(f'{g.filter(["FullName", "Name", "Notes"]).all() = }')
+ print(f'{g.filter() = }')
+ # pprint.pprint(g.filter(["FullName", "abc", "BillAddressBlock"]).all())
+ # print(f'{g.filter(["FullName", "abc", "BillAddressBlock"]).all() = }')
+ # print("")
+ # print(f'{g.filter([ "Addr1", "Addr2", "Addr3", "Addr4", "Addr5"]).all() = }')
+ # print(f'{g.filter([ "Addr1", "Addr2", "Addr3", "Addr4", "Addr5"]) = }')
+ # print(f'{g.filter(["fullname", "name"]).lastValue() = }')
- def readxmltodict():
- import xmltodict
- filename="ItemInventoryQuery.xml"
- filename="InvoiceAdd.xml"
- with open(filename, "r") as f:
- xml = f.read()
- print(xml)
- print("")
- print("")
- with open(filename, "r") as f:
- xmllines = f.readlines()
- print(xmllines)
- varDict = xmltodict.parse(xml)
- # print(f"{varDict = }")
- print()
- f = open(filename)
- enumDict ={}
- def recursiveDict(varDict, f, enumDict):
- # print(varDict)
- for dKey in varDict:
- print(dKey)
- if not isinstance(varDict[dKey], (list, dict)):
- if dKey[0]=='@' or dKey[0]=="#":
- continue
- _ = f.readline()
- dKey = dKey.replace("#", "")
- print(dKey)
- # print(f'{dKey = }, {varDict[dKey]}, {_}')
- _strOptional = ""
- while not dKey in _:
- _ = f.readline()
- # print(f'{dKey = }, {varDict[dKey]}, {_}')
- if "values:" in _:
- enumDict[dKey]=_.split(":")[-1].replace("[DEFAULT]","").replace("-->","").replace(" ","").replace("\n","").split(",")
- _ = f.readline()
- _strOptional = _.split("--")[1].strip()
- varDict[dKey]+=";"+_strOptional
- print(f'{varDict[dKey] = }')
- elif isinstance(varDict[dKey], dict):
- varDict[dKey], enumDict=recursiveDict(varDict[dKey], f, enumDict)##### istirahat dulu ah
- return varDict, enumDict
- print(f'{varDict = }')
- print()
- print(recursiveDict(varDict, f, enumDict))
- f.close
+ def readxmltodict():
+ import xmltodict
+ filename="ItemInventoryQuery.xml"
+ filename="InvoiceAdd.xml"
+ with open(filename, "r") as f:
+ xml = f.read()
+ print(xml)
+ print("")
+ print("")
+ with open(filename, "r") as f:
+ xmllines = f.readlines()
+ print(xmllines)
+ varDict = xmltodict.parse(xml)
+ # print(f"{varDict = }")
+ print()
+ f = open(filename)
+ enumDict ={}
+ def recursiveDict(varDict, f, enumDict):
+ # print(varDict)
+ for dKey in varDict:
+ print(dKey)
+ if not isinstance(varDict[dKey], (list, dict)):
+ if dKey[0]=='@' or dKey[0]=="#":
+ continue
+ _ = f.readline()
+ dKey = dKey.replace("#", "")
+ print(dKey)
+ # print(f'{dKey = }, {varDict[dKey]}, {_}')
+ _strOptional = ""
+ while not dKey in _:
+ _ = f.readline()
+ # print(f'{dKey = }, {varDict[dKey]}, {_}')
+ if "values:" in _:
+ enumDict[dKey]=_.split(":")[-1].replace("[DEFAULT]","").replace("-->","").replace(" ","").replace("\n","").split(",")
+ _ = f.readline()
+ _strOptional = _.split("--")[1].strip()
+ varDict[dKey]+=";"+_strOptional
+ print(f'{varDict[dKey] = }')
+ elif isinstance(varDict[dKey], dict):
+ varDict[dKey], enumDict=recursiveDict(varDict[dKey], f, enumDict)##### istirahat dulu ah
+ return varDict, enumDict
+ print(f'{varDict = }')
+ print()
+ print(recursiveDict(varDict, f, enumDict))
+ f.close
- @timing
- def pricelevel():
- g = PriceLevelQuery(FullName = 'B 202112', ItemRef_FullName = "TEDG:WG42:EDG-905/42")
- g = PriceLevelQuery( NameFilter_MatchCriterion='Contains', NameFilter_Name='202112' )
- # print(g.filter('PriceLevelPerItemRet').all())
- print(g.all())
- print(len(g.filter('PriceLevelPerItemRet').all()))
- for x in g.all():
- print([y for y in x])
- print(f"{x.get('Name')} : {len(x.get('PriceLevelPerItemRet'))}")
+ @timing
+ def pricelevel():
+ g = PriceLevelQuery(FullName = 'B 202112', ItemRef_FullName = "TEDG:WG42:EDG-905/42")
+ g = PriceLevelQuery( NameFilter_MatchCriterion='Contains', NameFilter_Name='202112' )
+ # print(g.filter('PriceLevelPerItemRet').all())
+ print(g.all())
+ print(len(g.filter('PriceLevelPerItemRet').all()))
+ for x in g.all():
+ print([y for y in x])
+ print(f"{x.get('Name')} : {len(x.get('PriceLevelPerItemRet'))}")
- pricelevel()
- # invoicequery()
- # salesorderquery()
- # transactionquery()
- # pprint.pprint(InventoryStockStatusByVendor(), sort_dicts=False)
- # iteminventoryquery()
- # customerquery()
- # readxmltodict()
- # g=SalesOrderQuery(MaxReturned=1)
- # print(len(None))
+ # pricelevel()
+ # invoicequery()
+ # salesorderquery()
+ # transactionquery()
+ # pprint.pprint(InventoryStockStatusByVendor(), sort_dicts=False)
+ # iteminventoryquery()
+ customerquery()
+ # readxmltodict()
+ # g=SalesOrderQuery(MaxReturned=1)
+ # print(len(None))
diff --git a/QBClass/server.py b/QBClass/server.py
index 92d7344..d9595b2 100644
--- a/QBClass/server.py
+++ b/QBClass/server.py
@@ -8,508 +8,513 @@ from .utils import cleanIncludeRetElements
import json
def timing(f):
- # @wraps(f)
- def wrap(*args, **kw):
- ts = time()
- result = f(*args, **kw)
- te = time()
- print('func:%r args:[%r, %r] took: %2.6f sec' % \
- (f.__name__, args, kw, te-ts))
- return result
- return wrap
+ # @wraps(f)
+ def wrap(*args, **kw):
+ ts = time()
+ result = f(*args, **kw)
+ te = time()
+ print('func:%r args:[%r, %r] took: %2.6f sec' % \
+ (f.__name__, args, kw, te-ts))
+ return result
+ return wrap
class baseQBQuery:
- def __init__(self, *args, **kwargs, ) -> None:
- # print(f'{kwargs = }')
- # print(f'{args = }')
- self.QBXML = None
- self.QBDict = {}
- self.response_string = None
- self.Rs = None
- self.varDict = {}
- ### start ### variable to be replace with other class init value
- self.onError = "continueOnError"
- # self.cleanIncludeRetElements = None
- self.includeRetElements_allowed = None
- self.retName = None
- self.defaultFilterKey = None
- self.class_debug = False
- ### end ### variable to be replace with other class init value
- self.listOfDict = self.ListOfDict(None, self.varDict, self.retName, False)
- self.requestID = None
- self.statusCode = -1
- 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")
+ def __init__(self, *args, **kwargs, ) -> None:
+ # print(f'{kwargs = }')
+ print(f'{args = }')
+ self.QBXML = None
+ self.QBDict = {}
+ self.response_string = None
+ self.Rs = None
+ self.varDict = {}
+ ### start ### variable to be replace with other class init value
+ self.onError = "continueOnError"
+ # self.cleanIncludeRetElements = None
+ self.includeRetElements_allowed = None
+ self.retName = None
+ self.defaultFilterKey = None
+ self.class_debug = False
+ ### end ### variable to be replace with other class init value
+ self.listOfDict = self.ListOfDict(None, self.varDict, self.retName, False)
+ self.requestID = None
+ self.statusCode = -1
+ self.statusMessage = ""
+ self.statusSeverity = ""
+ self.statusOk = False
+ if self.class_debug:
+ 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):
- version = "13.0"
- dataDict = { ### Header for qmxml with version attribute
- "?qbxml": {
- "@version": version,
- }
- }
- # dataDict["?qbxml"]["QBXML"] = {"QBXMLMsgsRq": { ### Simple Example ###
- # "@onError": "continueOnError",
- # "GeneralSummaryReportQueryRq": {
- # "GeneralSummaryReportType": self.GeneralSummaryReportType,
- # }
- # }
- # }
+ # @timing
+ def create_QBXML(self):
+ version = "13.0"
+ dataDict = { ### Header for qmxml with version attribute
+ "?qbxml": {
+ "@version": version,
+ }
+ }
+ # dataDict["?qbxml"]["QBXML"] = {"QBXMLMsgsRq": { ### Simple Example ###
+ # "@onError": "continueOnError",
+ # "GeneralSummaryReportQueryRq": {
+ # "GeneralSummaryReportType": self.GeneralSummaryReportType,
+ # }
+ # }
+ # }
- # dataDict["?qbxml"]["QBXML"] = {"QBXMLMsgsRq": { ### Example with multiple FullName Item ###
- # "@onError": "continueOnError",
- # "ItemInventoryQueryRq": {
- # "FullName": ["TACO:AA:TH-003AA",
- # "TACO:AA:TH-010AA"]
- # },
- # }
- # }
- firstKey = str(list(self.QBDict.keys())[0])
- dataDict["?qbxml"]["QBXML"] = {"QBXMLMsgsRq": { ### Example with multiple FullName Item ###
- "@onError": self.onError,
- firstKey: self.QBDict[firstKey]}}
- # print(f'{dataDict = }')
+ # dataDict["?qbxml"]["QBXML"] = {"QBXMLMsgsRq": { ### Example with multiple FullName Item ###
+ # "@onError": "continueOnError",
+ # "ItemInventoryQueryRq": {
+ # "FullName": ["TACO:AA:TH-003AA",
+ # "TACO:AA:TH-010AA"]
+ # },
+ # }
+ # }
+ firstKey = str(list(self.QBDict.keys())[0])
+ print(f'{firstKey = } {self.QBDict}')
+ dataDict["?qbxml"]["QBXML"] = {"QBXMLMsgsRq": { ### Example with multiple FullName Item ###
+ "@onError": self.onError,
+ firstKey: self.QBDict[firstKey]}}
+ # print(f'{dataDict = }')
# # QBXML = '' + xmltodict.unparse(dataDict, pretty=True)
- self.QBXML = xmltodict.unparse(dataDict, pretty=True).replace("?qbxml>", "").replace(f'version="{version}"', f'version="{version}"?')
- print(self.QBXML, type(self.QBXML))
- return self.QBXML
+ self.QBXML = xmltodict.unparse(dataDict, pretty=True).replace("?qbxml>", "").replace(f'version="{version}"', f'version="{version}"?')
+ if self.class_debug:
+ print(self.QBXML, type(self.QBXML))
+ return self.QBXML
- # @timing
- def connect_to_quickbooks(self, qbxml_query=None):
- # Connect to Quickbooks
- sessionManager = win32com.client.Dispatch("QBXMLRP2.RequestProcessor")
- sessionManager.OpenConnection('', 'DASA2')
- # ticket = sessionManager.BeginSession("z:\\DBW Bogor.qbw", 2)
- ticket = sessionManager.BeginSession("", 2)
+ # @timing
+ def connect_to_quickbooks(self, qbxml_query=None):
+ # Connect to Quickbooks
+ sessionManager = win32com.client.Dispatch("QBXMLRP2.RequestProcessor")
+ sessionManager.OpenConnection('', 'DASA2')
+ # ticket = sessionManager.BeginSession("z:\\DBW Bogor.qbw", 2)
+ ticket = sessionManager.BeginSession("", 2)
- # Send query and receive response
- self.response_string = sessionManager.ProcessRequest(ticket, self.QBXML)
+ # Send query and receive response
+ self.response_string = sessionManager.ProcessRequest(ticket, self.QBXML)
- # Disconnect from Quickbooks
- sessionManager.EndSession(ticket) # Close the company file
- sessionManager.CloseConnection() # Close the connection
+ # Disconnect from Quickbooks
+ sessionManager.EndSession(ticket) # Close the company file
+ sessionManager.CloseConnection() # Close the connection
- # Beautify response_string
- # print(f'{self.response_string = }')
- xml = minidom.parseString(self.response_string.replace("\n", ""))
- self.response_string = xml.toprettyxml()
- # print(f'{self.response_string = }')
+ # Beautify response_string
+ # print(f'{self.response_string = }')
+ xml = minidom.parseString(self.response_string.replace("\n", ""))
+ self.response_string = xml.toprettyxml()
+ # print(f'{self.response_string = }')
- self.statusOk = self.isDataOK()
- return self.statusOk
- return self.response_string
+ self.statusOk = self.isDataOK()
+ return self.statusOk
+ return self.response_string
- def isDataOK(self):
- # print("isdataok")
- # QBXML = ET.fromstring(self.response_string)
- # print(xmltodict.parse(self.response_string))
- self.varDict = xmltodict.parse(self.response_string)
- if self.class_debug:
- pprint.pprint("isDataOK", self.varDict)
- self.listOfDict.varDict = self.varDict
- self.listOfDict.filterKey = ["@requestID"]
- self.requestID = self.listOfDict.firstValue().get('@requestID',None)
- self.listOfDict.filterKey = ["@statusCode"]
- self.statusCode = self.listOfDict.firstValue().get('@statusCode',None)
- self.listOfDict.filterKey = ["@statusMessage"]
- self.statusMessage = self.listOfDict.firstValue().get('@statusMessage',None)
- self.listOfDict.filterKey = ["@statusSeverity"]
- self.statusSeverity = self.listOfDict.firstValue().get('@statusSeverity')
- self.listOfDict.filterKey = [self.retName]
- if self.class_debug:
- print(f'isDataOK -> {self.listOfDict.firstValue() = }')
- if self.listOfDict.firstValue().get(self.retName,None)==None:
- return False
-
- print(f'{self.statusCode = }, {self.statusMessage = }, {self.statusSeverity = }')
- varDict = self.varDict['QBXML']['QBXMLMsgsRs'][self.__class__.__name__+"Rs"]
- return True
- # isStatusOK=None
+ def isDataOK(self):
+ # print("isdataok")
+ # QBXML = ET.fromstring(self.response_string)
+ # print(xmltodict.parse(self.response_string))
+ self.varDict = xmltodict.parse(self.response_string)
+ if self.class_debug:
+ print("isDataOK", self.varDict)
+ self.listOfDict.varDict = self.varDict
+ self.listOfDict.filterKey = ["@requestID"]
+ self.requestID = self.listOfDict.firstValue().get('@requestID',None)
+ self.listOfDict.filterKey = ["@statusCode"]
+ self.statusCode = self.listOfDict.firstValue().get('@statusCode',None)
+ self.listOfDict.filterKey = ["@statusMessage"]
+ self.statusMessage = self.listOfDict.firstValue().get('@statusMessage',None)
+ self.listOfDict.filterKey = ["@statusSeverity"]
+ self.statusSeverity = self.listOfDict.firstValue().get('@statusSeverity')
+ self.listOfDict.filterKey = [self.retName]
+ if self.class_debug:
+ print(f'isDataOK -> {self.listOfDict.firstValue() = }')
+ if self.listOfDict.firstValue().get(self.retName,None)==None:
+ return False
+ if self.class_debug:
+ print(f'{self.statusCode = }, {self.statusMessage = }, {self.statusSeverity = }')
+ varDict = self.varDict['QBXML']['QBXMLMsgsRs'][self.__class__.__name__+"Rs"]
+ return True
+ # isStatusOK=None
- # for _ in self.findKeyInDict("FullName", ): ###berhasil
- # print(f'{_ = }')
- # for _ in self.gen_dict_extract("@statusMessage", self.varDict):
- # print(_)
- # if 'Status OK'.lower()==_.lower():
- # print(_)
- # isStatusOK = True
- # break
- # else:
- # isStatusOK=False
-
- # if self.ListOfDict.find_firstListOfDict("@statusMessage")['@statusMessage'].lower()=="status OK".lower():
- # # print(f'{self.retName = }')
- # self.Rs = self.find_firstListOfDict(self.retName)[self.retName]
- # # self.Rs=self.returnRet(self.varDict)
- # # # print(self.findKeyInDict("FullName", )) ###test
- # # print(self.findKeyInDict("FullName", self.findKeyInDict("QBXMLMsgsRs1", ))) ###test
- # # # print(self.findKeyInDict("@statusMessage", )) ###test
- # # for _ in self.findKeyInDict("QBXMLMsgsRs",): ###trial blm berhasil
- # # print(f'2{_ = }')
- # # print(f'{self.Rs = }')
- # # print(type(self.Rs))
- # # print(self.find_firstListOfDict("FullName")['FullName'])
- # # print(self.find_firstListOfDict("FullName"))
- # # print(self.find_allListOfDict("FullName"))
+ # for _ in self.findKeyInDict("FullName", ): ###berhasil
+ # print(f'{_ = }')
+ # for _ in self.gen_dict_extract("@statusMessage", self.varDict):
+ # print(_)
+ # if 'Status OK'.lower()==_.lower():
+ # print(_)
+ # isStatusOK = True
+ # break
+ # else:
+ # isStatusOK=False
+
+ # if self.ListOfDict.find_firstListOfDict("@statusMessage")['@statusMessage'].lower()=="status OK".lower():
+ # # print(f'{self.retName = }')
+ # self.Rs = self.find_firstListOfDict(self.retName)[self.retName]
+ # # self.Rs=self.returnRet(self.varDict)
+ # # # print(self.findKeyInDict("FullName", )) ###test
+ # # print(self.findKeyInDict("FullName", self.findKeyInDict("QBXMLMsgsRs1", ))) ###test
+ # # # print(self.findKeyInDict("@statusMessage", )) ###test
+ # # for _ in self.findKeyInDict("QBXMLMsgsRs",): ###trial blm berhasil
+ # # print(f'2{_ = }')
+ # # print(f'{self.Rs = }')
+ # # print(type(self.Rs))
+ # # print(self.find_firstListOfDict("FullName")['FullName'])
+ # # print(self.find_firstListOfDict("FullName"))
+ # # print(self.find_allListOfDict("FullName"))
- def returnRet(self, varDict:dict = None):
- if varDict== None:
- varDict=self.varDict
- # pprint.pprint(self.varDict)
-
- # print(f'{varDict = }')
- varDict = varDict['QBXML']['QBXMLMsgsRs'][self.__class__.__name__+"Rs"]
- # print(f'{varDict = }')
-
- for idx, key in enumerate(varDict):
- # print(idx, key, len(varDict))
- if self.retName in key:
- return varDict[key]
- return None
+ def returnRet(self, varDict:dict = None):
+ if varDict== None:
+ varDict=self.varDict
+ # pprint.pprint(self.varDict)
+
+ # print(f'{varDict = }')
+ varDict = varDict['QBXML']['QBXMLMsgsRs'][self.__class__.__name__+"Rs"]
+ # print(f'{varDict = }')
+
+ for idx, key in enumerate(varDict):
+ # print(idx, key, len(varDict))
+ if self.retName in key:
+ return varDict[key]
+ return None
- def runCheck(self):
- # print("runCheck")
- if self.varDict:
- return True
- if self.response_string:
- return True
- if self.Rs:
- return True
- if self.QBDict:
- self.create_QBXML()
- if self.connect_to_quickbooks():
- return True
- return False
+ def runCheck(self):
+ # print("runCheck")
+ if self.varDict:
+ return True
+ if self.response_string:
+ return True
+ if self.Rs:
+ return True
+ if self.QBDict:
+ print('runcheck', self.QBDict)
+ self.create_QBXML()
+ if self.connect_to_quickbooks():
+ return True
+ return False
- def __repr__(self) -> str:
- self.all()
- # print(f'{self.returnRet() = }')
- return self.response_string
+ def __repr__(self) -> str:
+ self.all()
+ # print(f'{self.returnRet() = }')
+ return self.response_string
- def count(self) -> int:
- # objs = self.filter(self.defaultFilterKey).all()
- # print(f"{objs = }", type(objs))
- return len(self.filter(self.defaultFilterKey).all())
+ def count(self) -> int:
+ # objs = self.filter(self.defaultFilterKey).all()
+ # print(f"{objs = }", type(objs))
+ return len(self.filter(self.defaultFilterKey).all())
- def filter(self, key=None):
- print(f'{key = }')
- # print(f'{self.statusOk = }')
- if not self.runCheck():
- print("not runcheck")
- return self.ListOfDict(["abc"], self.varDict, self.retName, self.includeRetElements_allowed, self.statusOk)
- return []
- if isinstance(key, str):
- key = [key]
- elif isinstance(key, list):
- pass
- elif isinstance(key, dict):
- key = [x for x,y in key.items()]
- elif key is None:
- # print(f"key is none. {self.retName = }")
- return self.ListOfDict(self.retName, self.varDict, self.retName, self.includeRetElements_allowed, self.statusOk)#.firstValue()#[self.retName]
- else:
- return []
- key = cleanIncludeRetElements(self.includeRetElements_allowed, key)
- # print(f'f {key = }')
- if key:
- return self.ListOfDict(key, self.varDict, self.retName, self.includeRetElements_allowed, self.statusOk)
- else:
- return self.ListOfDict(["abc"], self.varDict, self.retName, self.includeRetElements_allowed, self.statusOk)
- ### dont use this way, better returning class because the value if you assign to variable, the valu will be the last filterKey inputed
- ### if return class, every filterKey is an object, different from other filterKey
- self.listOfDict.varDict = self.varDict
- self.listOfDict.filterKey = key
- return self.listOfDict
- ###
+ def filter(self, key=None):
+ print(f'{key = }')
+ # print(f'{self.statusOk = }')
+ if not self.runCheck():
+ print("not runcheck")
+ return self.ListOfDict(["abc"], self.varDict, self.retName, self.includeRetElements_allowed, self.statusOk)
+ return []
+ if isinstance(key, str):
+ key = [key]
+ elif isinstance(key, list):
+ pass
+ elif isinstance(key, dict):
+ key = [x for x,y in key.items()]
+ elif key is None:
+ # print(f"key is none. {self.retName = }")
+ return self.ListOfDict(self.retName, self.varDict, self.retName, self.includeRetElements_allowed, self.statusOk)#.firstValue()#[self.retName]
+ else:
+ return []
+ key = cleanIncludeRetElements(self.includeRetElements_allowed, key)
+ # print(f'f {key = }')
+ if key:
+ return self.ListOfDict(key, self.varDict, self.retName, self.includeRetElements_allowed, self.statusOk)
+ else:
+ return self.ListOfDict(["abc"], self.varDict, self.retName, self.includeRetElements_allowed, self.statusOk)
+ ### dont use this way, better returning class because the value if you assign to variable, the valu will be the last filterKey inputed
+ ### if return class, every filterKey is an object, different from other filterKey
+ self.listOfDict.varDict = self.varDict
+ self.listOfDict.filterKey = key
+ return self.listOfDict
+ ###
- def all(self) -> dict:
- if not self.runCheck():
- return None
- # return self.ListOfDict(None, self.varDict, self.retName).firstValue()
- temp = self.ListOfDict(None, self.varDict, self.retName, self.includeRetElements_allowed, self.statusOk).firstValue()
- if temp:
- temp = temp[self.retName]
- else:
- return {'status':"Error", 'statusCode': self.statusCode, 'statusMessage':self.statusMessage, 'statusSeverity': self.statusSeverity}
- if self.requestID:
- temp['requestID']=self.requestID
- # print(f'{temp = }')
- return temp
- # return self.ListOfDict(None, self.varDict, self.retName, self.includeRetElements_allowed, self.statusOk).firstValue()[self.retName]
- ### dont use this way
- self.listOfDict.varDict = self.varDict
- self.listOfDict.filterKey = self.retName
- return self.listOfDict
- ###
-
- def to_json(self) -> str:
- return json.dumps(self.all())
-
-
- class ListOfDict:
- def __init__(self, key, var, retName, includeRetElements_allowed:list ,statusOk:bool = True) -> None:
- # print(f'{key =}, {var =}')
- # self.first = self.find_firstListOfDict(key)
- if key:
- if isinstance(key, str):
- self.filterKey = [key]
- else:
- self.filterKey = key
- else:
- self.filterKey = [retName]
- # print(f"{self.filterKey = }")
- self.varDict = var
- self.statusOk = statusOk
- self._includeRetElements_allowed = includeRetElements_allowed
- # print("listofDict")
-
-
- def __repr__(self) -> str:
- return str(self.all())
-
- # def filter(self, filterKey):
- # self.filterKey=filterKey
-
-
- def getValuesOf(self, key:str=None, var:dict=None, dataRetList:list=None) :
- if key==None:
- key = self.filterKey
- elif isinstance(key, str):
- key=[key]
- elif isinstance(key, list):
- pass
- else:
- raise TypeError(f'{key=} should be string not {type(key)}')
- print(key)
- key = cleanIncludeRetElements(self._includeRetElements_allowed, key)
- print(key)
- if len(key)==0:
- key = self.filterKey
- else:
- key = key
- # print(f'getvaluesof {key = }')
- # for xdct in self.findKeyInDict(var, dataRetList):
- # print(f'{xdct = }', type(xdct), self.filterKey[0], key)
- lstresult = []
- for x in self.findKeyInDict(var, dataRetList):
- templstresult = []
- for y in key:
- templstresult.append(x.get(y, ""))
- lstresult.append(templstresult)
- print(f'{lstresult[-1] =}')
- return lstresult
- _lst = [x[key] for x in self.findKeyInDict(var, dataRetList)]
- # print(_dct)
- return _lst
-
- def all(self, var:dict=None, dataRetList:list=None) -> list:
- # print(f'{self.statusOk = }')
- if not self.statusOk:
- return []
- _lst = [x for x in self.findKeyInDict(var, dataRetList)]
- # _lst = [x[self.filterKey] for x in self.findKeyInDict(var, dataRetList)]
- # if _lst:
- return _lst
- # else:
- # return []
-
- def allOnlyValue(self, var:dict=None, dataRetList:list=None):
- if not self.statusOk:
- return []
- _lst = [x for x in self.findKeyInDict(var, dataRetList)]
- return _lst
-
- def first(self, var:dict=None, dataRetList:list=None) -> dict:
- if not self.statusOk:
- return {}
- return next(self.findKeyInDict( var, dataRetList), {})
-
- def firstValue(self, var:dict=None, dataRetList:list=None) ->dict:
- if not self.statusOk:
- print("firstValue statusOk is False")
- return {}
- # return self.first(var, dataRetList)[self.filterKey]
- _val=self.first(var, dataRetList)
- # print(f'{_val = }')
- if _val:
- # return _val[self.filterKey]
- return _val
- else:
- return {}
-
- def last(self, var:dict=None, dataRetList:list=None) -> dict:
- if not self.statusOk:
- return {}
- # *_, last = self.findKeyInDict( var, dataRetList)
- _val= self.all(var, dataRetList)
- if _val:return _val[-1]
- else: return {}
-
- def lastValue(self, var:dict=None, dataRetList:list=None) -> dict:
- if not self.statusOk:
- return {}
- _val=self.last(var, dataRetList)
- # print(f"lastValue {_val =}")
- if _val:
- # return _val[self.filterKey]
- return _val
- else:
- return {}
-
- def count(self, var:dict=None, dataRetList:list=None) -> int:
- if not self.statusOk:
- return 0
- # print(len(self.all()))
- return len(self.all())
-
- # def findKeyInDict(self, var:dict=None, dataRetList:list=None, ):
- # # print("genfinekeys")
- # if var==None:
- # var=self.varDict
- # # print(f"{var = }")
- # if dataRetList is None:
- # dataRetList = []
- # if isinstance(var, list):
- # # print("list var")
- # for _ in var:
- # yield from self.findKeyInDict( _, )
- # elif isinstance(var, dict):
- # # print("dict var")
- # if self.filterKey in var:
- # dataRetList.append({self.filterKey: var[self.filterKey]})
- # print(f"{dataRetList = }")
- # yield {self.filterKey: var[self.filterKey]}
- # else:
- # # print(f'dict else var={var}')
- # for _ in var:
- # # print(_)
- # yield from self.findKeyInDict(var[_], )
- # return dataRetList
-
- def findKeyInDict(self, var:dict=None, dataRetList:list=None, ):
- # print("genfinekeys")
- if var==None:
- var=self.varDict
- # print(f"{var = }")
- if dataRetList is None:
- dataRetList = []
- if isinstance(var, list):
- # print("list var")
- for _ in var:
- yield from self.findKeyInDict( _, )
- elif isinstance(var, dict):
- # print("dict var")
- found = False
- tempDct = {}
- for fKey in self.filterKey:
- # if self.filterKey in var:
- if fKey in var:
- found = True
- tempDct[fKey]=var[fKey]
- # print(f'{tempDct = }')
- if found:
- # dataRetList.append({self.filterKey: var[self.filterKey]})
- dataRetList.append(tempDct)
- # print(f"{dataRetList = }")
- yield tempDct #{self.filterKey: var[self.filterKey]}
- else:
- # print(f'dict else var={var}')
- for _ in var:
- # print(_)
- yield from self.findKeyInDict(var[_], )
- return dataRetList
-
-
- # def find_allListOfDict(self, key, var:dict=None, dataRetList:list=None):
- # return [x for x in self.findKeyInDict(key, var, dataRetList)]
-
- # def find_firstListOfDictValue(self, key, var:dict=None, dataRetList:list=None):
- # return self.find_firstListOfDict(key, var, dataRetList)[key]
-
- # def find_firstListOfDict(self, key, var:dict=None, dataRetList:list=None):
- # return next(self.findKeyInDict(key, var, dataRetList), None)
-
- # def findKeyInDict(self, key, var:dict=None, dataRetList:list=None, ):
- # # print("genfinekeys")
- # if var==None:
- # var=self.varDict
- # # print(f"{var = }")
- # if dataRetList is None:
- # dataRetList = []
- # if isinstance(var, list):
- # # print("list var")
- # for _ in var:
- # yield from self.findKeyInDict(key, _, )
- # elif isinstance(var, dict):
- # # print("dict var")
- # if key in var:
- # dataRetList.append({key: var[key]})
- # # print(f"{dataRetList = }")
- # yield {key: var[key]}
- # else:
- # # print(f'dict else var={var}')
- # for _ in var:
- # # print(_)
- # yield from self.findKeyInDict(key, var[_], )
- # return dataRetList
-
-
- #### dont delete.
- ### Example of extracting dictionary value by key
- def gen_dict_extract(self, key, var:dict=None): ### Utils
- if var==None:
- var=self.response_string
- # print("var")
- if hasattr(var,'items'): # hasattr(var,'items') for python 3, hasattr(var,'iteritems') for python 2
- # print("hassattr")
- for k, v in var.items(): # var.items() for python 3, var.iteritems() for python 2
- # print(k,v)
- if k == key:
- yield v
- if isinstance(v, dict):
- for result in self.gen_dict_extract(key, v):
- yield result
- elif isinstance(v, list):
- for d in v:
- for result in self.gen_dict_extract(key, d):
- yield result
-
- def __str__(self, *args, **kwargs) -> str:
- # return str(self._get_datarow(self.connect_to_quickbooks(self.create_QBXML())))
- # print("__str__")
- return str(self.all())
- return self.__class__.__name__
- return str(self.get_datarow())
-
-
- # def get_datarow(self, *args):
- # return self._get_datarow(self.connect_to_quickbooks(self.create_QBXML()))
+ def all(self) -> dict:
+ if not self.runCheck():
+ return None
+ # return self.ListOfDict(None, self.varDict, self.retName).firstValue()
+ temp = self.ListOfDict(None, self.varDict, self.retName, self.includeRetElements_allowed, self.statusOk).firstValue()
+ if temp:
+ temp = temp[self.retName]
+ else:
+ return {'status':"Error", 'statusCode': self.statusCode, 'statusMessage':self.statusMessage, 'statusSeverity': self.statusSeverity}
+ if self.requestID:
+ temp['requestID']=self.requestID
+ # print(f'{temp = }')
+ return temp
+ # return self.ListOfDict(None, self.varDict, self.retName, self.includeRetElements_allowed, self.statusOk).firstValue()[self.retName]
+ ### dont use this way
+ self.listOfDict.varDict = self.varDict
+ self.listOfDict.filterKey = self.retName
+ return self.listOfDict
+ ###
+
+ def to_json(self) -> str:
+ return json.dumps(self.all())
- # def get_dict(self, *args):
- # return pd.DataFrame(self._get_datarow(self.connect_to_quickbooks(self.create_QBXML())))
- def status_ok(self, QBXML):
- GSRQRs=QBXML.find('.//GeneralSummaryReportQueryRs')
- status_code = GSRQRs.attrib #.get('statusCode')
- # print(GSRQRs.attrib)
- # print(GSRQRs.attrib['statusCode'])
- status=GSRQRs.attrib.get('statusMessage')
-
- print(f'status={status}')
- if 'OK' in status:
- return True, status_code
- else:
- return False, status_code
+ class ListOfDict:
+ def __init__(self, key, var, retName, includeRetElements_allowed:list ,statusOk:bool = True) -> None:
+ # print(f'{key =}, {var =}')
+ # self.first = self.find_firstListOfDict(key)
+ if key:
+ if isinstance(key, str):
+ self.filterKey = [key]
+ else:
+ self.filterKey = key
+ else:
+ self.filterKey = [retName]
+ # print(f"{self.filterKey = }")
+ self.varDict = var
+ self.statusOk = statusOk
+ self._includeRetElements_allowed = includeRetElements_allowed
+ # print("listofDict")
+
+
+ def __repr__(self) -> str:
+ return str(self.all())
+
+ # def filter(self, filterKey):
+ # self.filterKey=filterKey
+
+
+ def getValuesOf(self, key:str=None, var:dict=None, dataRetList:list=None) :
+ if key==None:
+ key = self.filterKey
+ elif isinstance(key, str):
+ key=[key]
+ elif isinstance(key, list):
+ pass
+ else:
+ raise TypeError(f'{key=} should be string not {type(key)}')
+ print(key)
+ key = cleanIncludeRetElements(self._includeRetElements_allowed, key)
+ print(key)
+ if len(key)==0:
+ key = self.filterKey
+ else:
+ key = key
+ # print(f'getvaluesof {key = }')
+ # for xdct in self.findKeyInDict(var, dataRetList):
+ # print(f'{xdct = }', type(xdct), self.filterKey[0], key)
+ lstresult = []
+ for x in self.findKeyInDict(var, dataRetList):
+ templstresult = []
+ for y in key:
+ templstresult.append(x.get(y, ""))
+ lstresult.append(templstresult)
+ print(f'{lstresult[-1] =}')
+ return lstresult
+ _lst = [x[key] for x in self.findKeyInDict(var, dataRetList)]
+ # print(_dct)
+ return _lst
+
+ def all(self, var:dict=None, dataRetList:list=None) -> list:
+ # print(f'{self.statusOk = }')
+ if not self.statusOk:
+ return []
+ _lst = [x for x in self.findKeyInDict(var, dataRetList)]
+ # _lst = [x[self.filterKey] for x in self.findKeyInDict(var, dataRetList)]
+ # if _lst:
+ return _lst
+ # else:
+ # return []
+
+ def allOnlyValue(self, var:dict=None, dataRetList:list=None):
+ if not self.statusOk:
+ return []
+ _lst = [x for x in self.findKeyInDict(var, dataRetList)]
+ return _lst
+
+ def first(self, var:dict=None, dataRetList:list=None) -> dict:
+ if not self.statusOk:
+ return {}
+ return next(self.findKeyInDict( var, dataRetList), {})
+
+ def firstValue(self, var:dict=None, dataRetList:list=None) ->dict:
+ if not self.statusOk:
+ print("firstValue statusOk is False")
+ return {}
+ # return self.first(var, dataRetList)[self.filterKey]
+ _val=self.first(var, dataRetList)
+ # print(f'{_val = }')
+ if _val:
+ # return _val[self.filterKey]
+ return _val
+ else:
+ return {}
+
+ def last(self, var:dict=None, dataRetList:list=None) -> dict:
+ if not self.statusOk:
+ return {}
+ # *_, last = self.findKeyInDict( var, dataRetList)
+ _val= self.all(var, dataRetList)
+ if _val:return _val[-1]
+ else: return {}
+
+ def lastValue(self, var:dict=None, dataRetList:list=None) -> dict:
+ if not self.statusOk:
+ return {}
+ _val=self.last(var, dataRetList)
+ # print(f"lastValue {_val =}")
+ if _val:
+ # return _val[self.filterKey]
+ return _val
+ else:
+ return {}
+
+ def count(self, var:dict=None, dataRetList:list=None) -> int:
+ if not self.statusOk:
+ return 0
+ # print(len(self.all()))
+ return len(self.all())
+
+ # def findKeyInDict(self, var:dict=None, dataRetList:list=None, ):
+ # # print("genfinekeys")
+ # if var==None:
+ # var=self.varDict
+ # # print(f"{var = }")
+ # if dataRetList is None:
+ # dataRetList = []
+ # if isinstance(var, list):
+ # # print("list var")
+ # for _ in var:
+ # yield from self.findKeyInDict( _, )
+ # elif isinstance(var, dict):
+ # # print("dict var")
+ # if self.filterKey in var:
+ # dataRetList.append({self.filterKey: var[self.filterKey]})
+ # print(f"{dataRetList = }")
+ # yield {self.filterKey: var[self.filterKey]}
+ # else:
+ # # print(f'dict else var={var}')
+ # for _ in var:
+ # # print(_)
+ # yield from self.findKeyInDict(var[_], )
+ # return dataRetList
+
+ def findKeyInDict(self, var:dict=None, dataRetList:list=None, ):
+ # print("genfinekeys")
+ if var==None:
+ var=self.varDict
+ # print(f"{var = }")
+ if dataRetList is None:
+ dataRetList = []
+ if isinstance(var, list):
+ # print("list var")
+ for _ in var:
+ yield from self.findKeyInDict( _, )
+ elif isinstance(var, dict):
+ # print("dict var")
+ found = False
+ tempDct = {}
+ for fKey in self.filterKey:
+ # if self.filterKey in var:
+ if fKey in var:
+ found = True
+ tempDct[fKey]=var[fKey]
+ # print(f'{tempDct = }')
+ if found:
+ # dataRetList.append({self.filterKey: var[self.filterKey]})
+ dataRetList.append(tempDct)
+ # print(f"{dataRetList = }")
+ yield tempDct #{self.filterKey: var[self.filterKey]}
+ else:
+ # print(f'dict else var={var}')
+ for _ in var:
+ # print(_)
+ yield from self.findKeyInDict(var[_], )
+ return dataRetList
+
+
+ # def find_allListOfDict(self, key, var:dict=None, dataRetList:list=None):
+ # return [x for x in self.findKeyInDict(key, var, dataRetList)]
+
+ # def find_firstListOfDictValue(self, key, var:dict=None, dataRetList:list=None):
+ # return self.find_firstListOfDict(key, var, dataRetList)[key]
+
+ # def find_firstListOfDict(self, key, var:dict=None, dataRetList:list=None):
+ # return next(self.findKeyInDict(key, var, dataRetList), None)
+
+ # def findKeyInDict(self, key, var:dict=None, dataRetList:list=None, ):
+ # # print("genfinekeys")
+ # if var==None:
+ # var=self.varDict
+ # # print(f"{var = }")
+ # if dataRetList is None:
+ # dataRetList = []
+ # if isinstance(var, list):
+ # # print("list var")
+ # for _ in var:
+ # yield from self.findKeyInDict(key, _, )
+ # elif isinstance(var, dict):
+ # # print("dict var")
+ # if key in var:
+ # dataRetList.append({key: var[key]})
+ # # print(f"{dataRetList = }")
+ # yield {key: var[key]}
+ # else:
+ # # print(f'dict else var={var}')
+ # for _ in var:
+ # # print(_)
+ # yield from self.findKeyInDict(key, var[_], )
+ # return dataRetList
+
+
+ #### dont delete.
+ ### Example of extracting dictionary value by key
+ def gen_dict_extract(self, key, var:dict=None): ### Utils
+ if var==None:
+ var=self.response_string
+ # print("var")
+ if hasattr(var,'items'): # hasattr(var,'items') for python 3, hasattr(var,'iteritems') for python 2
+ # print("hassattr")
+ for k, v in var.items(): # var.items() for python 3, var.iteritems() for python 2
+ # print(k,v)
+ if k == key:
+ yield v
+ if isinstance(v, dict):
+ for result in self.gen_dict_extract(key, v):
+ yield result
+ elif isinstance(v, list):
+ for d in v:
+ for result in self.gen_dict_extract(key, d):
+ yield result
+
+ def __str__(self, *args, **kwargs) -> str:
+ # return str(self._get_datarow(self.connect_to_quickbooks(self.create_QBXML())))
+ # print("__str__")
+ return str(self.all())
+ return self.__class__.__name__
+ return str(self.get_datarow())
+
+
+ # def get_datarow(self, *args):
+ # return self._get_datarow(self.connect_to_quickbooks(self.create_QBXML()))
+
+ # def get_dict(self, *args):
+ # return pd.DataFrame(self._get_datarow(self.connect_to_quickbooks(self.create_QBXML())))
+
+ def status_ok(self, QBXML):
+ GSRQRs=QBXML.find('.//GeneralSummaryReportQueryRs')
+ status_code = GSRQRs.attrib #.get('statusCode')
+ # print(GSRQRs.attrib)
+ # print(GSRQRs.attrib['statusCode'])
+ status=GSRQRs.attrib.get('statusMessage')
+
+ print(f'status={status}')
+ if 'OK' in status:
+ return True, status_code
+ else:
+ return False, status_code
+
-
if __name__ == '__main__':
- pass
\ No newline at end of file
+ pass
\ No newline at end of file
diff --git a/exim.py b/exim.py
new file mode 100644
index 0000000..b684158
--- /dev/null
+++ b/exim.py
@@ -0,0 +1,568 @@
+# from . import QBClasses
+from pprint import pprint
+# from QBClass.QBClasses import InvoiceQuery, SalesOrderQuery
+from QBClass.QBClasses import InvoiceQuery, SalesOrderQuery
+# import timeit
+import time
+import json
+import pandas as pd
+import numpy as np
+import datetime
+
+print('succes Loading modules')
+
+
+
+def timer(func):
+ def wrapper(*args, **kwargs):
+ nonlocal total
+ start = time.time()
+ result = func(*args, **kwargs)
+ duration = time.time() - start
+ total += duration
+ print(f"Execution time: {duration} Total: {total}")
+ return result
+
+ total = 0
+ return wrapper
+
+
+@timer
+def get_all_so_from_invoice( FromTxnDate=None, ToTxnDate=None, MaxReturned=None,):
+ print(MaxReturned, FromTxnDate, ToTxnDate)
+ start = time.time()
+ print('Get Invoice Query List. Processing..... wait for at minute(1 month=90secs)')
+ if MaxReturned:
+ iq = InvoiceQuery(MaxReturned= MaxReturned, IncludeLinkedTxns='true', IncludeLineItems='true', debug=False)
+ elif FromTxnDate and ToTxnDate:
+ print('here')
+ iq = InvoiceQuery(TxnDateRangeFilter_FromTxnDate=FromTxnDate, TxnDateRangeFilter_ToTxnDate=ToTxnDate, IncludeLinkedTxns='true', IncludeLineItems='true', debug=False)
+ else:
+ iq = InvoiceQuery(TxnDateRangeFilter_FromTxnDate='2021-01-01', TxnDateRangeFilter_ToTxnDate='2021-03-30', IncludeLinkedTxns='true', IncludeLineItems='true', debug=False)
+ # pprint(iq.all(), sort_dicts=False)
+ # print(iq.all())
+ print(f"Execution time InvoiceQuery: {time.time()-start} {len(iq.all()) = }")
+ so_list = []
+ iq_list = []
+ dup_so_list = []
+ for idx, txn in enumerate(iq.all()):
+ # iq_list.append(txn)
+ # print(f"{idx = } {txn['RefNumber'] = } {txn['TxnDate'] = } {txn['Subtotal'] = } ")
+ if 'LinkedTxn' in txn:
+ # pprint(txn['LinkedTxn'], sort_dicts=False)
+ if not isinstance(txn['LinkedTxn'], list): #if there is no receive payment and only 1 linked traction, need to change to a list. RECORD it
+ txn_linkedTxn = [txn['LinkedTxn']]
+ else:
+ txn_linkedTxn = txn['LinkedTxn']
+ for linkedtxn in txn_linkedTxn:
+ if linkedtxn['TxnType']=='SalesOrder':
+ if linkedtxn['RefNumber'] not in so_list:
+ so_list.append(linkedtxn['RefNumber'])
+ else:
+ dup_so_list.append(linkedtxn['RefNumber'])
+
+ print(f'{dup_so_list = }')
+ print()
+ so_dict = {}
+ print(f"Execution time before SO: {time.time()-start}")
+ print('Get Sales Order Query List. Processing..... wait for at minute(1 month=130 secs)')
+ so = SalesOrderQuery(RefNumber = so_list, IncludeLinkedTxns='true', IncludeLineItems='true', debug=False)
+ duplicateSO = []
+ soWithNoLinkedTxn = []
+ print(f"Execution time SalesOrderQuery: {time.time()-start}")
+ for idx, txn in enumerate(so.all()):
+ if 'LinkedTxn' in txn:
+ if txn['RefNumber'] not in so_dict:
+ so_dict[txn['RefNumber']] = txn
+ else:
+ duplicateSO.append(txn['RefNumber'])
+ else:
+ soWithNoLinkedTxn.append(txn)
+ # pprint(so.all(), sort_dicts=False)
+ res = next(iter(so_dict))
+ # print(f'{so_dict[res] = }')
+ # pprint(so_dict[res])
+ print(f'{soWithNoLinkedTxn = }')
+ print(f'{len(iq.all()) = } {len(so.all()) = } {len(so_list) = } {len(dup_so_list) = } {len(so_dict) = }')
+ print(f'{duplicateSO = }')
+ print()
+ ### start processing like below module ###
+ pass
+ return iq.all(), so_dict
+
+
+@timer
+def process():
+ iq = InvoiceQuery(MaxReturned= 20, IncludeLinkedTxns='true', IncludeLineItems='true', debug=False)
+ # iq = InvoiceQuery(TxnDateRangeFilter_FromTxnDate='2024-02-01', TxnDateRangeFilter_ToTxnDate='2024-02-29', IncludeLinkedTxns='true', IncludeLineItems='true')
+ pprint(iq.all(), sort_dicts=False)
+ # print(iq.all())
+ nolinkInv = []
+ soNotInOneInv = []
+ for idx, txn in enumerate(iq.all()):
+ print(f"{idx = } {txn['RefNumber'] = } {txn['TxnDate'] = } {txn['Subtotal'] = } ")
+ # print(f"{txn['Subtotal'] = }")
+ if 'LinkedTxn' in txn:
+ # pprint(txn['LinkedTxn'], sort_dicts=False)
+
+ if not isinstance(txn['LinkedTxn'], list): #if there is no receive payment and only 1 linked traction, need to change to a list. RECORD it
+ txn_linkedTxn = [txn['LinkedTxn']]
+ else:
+ txn_linkedTxn = txn['LinkedTxn']
+
+ for linkedtxn in txn_linkedTxn:
+ try:
+ if linkedtxn['TxnType']=='SalesOrder':
+ so = SalesOrderQuery(RefNumber = linkedtxn['RefNumber'], IncludeLinkedTxns='true', debug=False)
+ is_soLinkedToOneInvoice = False
+ if 'LinkedTxn' in so.all():
+ if not isinstance(so.all()['LinkedTxn'], list):
+ # print(so.all())
+ so_linkedTxn = [so.all()['LinkedTxn']] #make a list
+ else:
+ so_linkedTxn = so.all()['LinkedTxn'] #just copy, already list
+ # print(so.all())
+ for solinkedtxn in so_linkedTxn:
+ # print(len(so_linkedTxn))
+ if solinkedtxn['TxnType']=='Invoice' and len(so_linkedTxn)==1:
+ # print(so.all()['RefNumber'], 'the only one SO')
+ is_soLinkedToOneInvoice=True
+ # pass
+ else:
+ is_soLinkedToOneInvoice=False
+ print(so.all()['RefNumber'], 'NOT the only One, this SO have other Invoice number') #make append to a list
+ soNotInOneInv.append(so.all()['RefNumber'])
+
+ if float(linkedtxn['Amount'])<0:
+ if so.all()['TotalAmount']!=linkedtxn['Amount'][1:]:
+ if is_soLinkedToOneInvoice: #maybe the SO is manually closed, check it item by item, find which item is not in invoice
+ if so.all()['IsManuallyClosed'] == 'true':
+ pass
+ print(f"{so.all()['TxnID'] = } {so.all()['RefNumber'] = }")
+ else:
+ print('SO TotalAmount<>Amount in Invoice. not Manually closed and not fully Invoiced')
+ pprint(f'{linkedtxn = }', sort_dicts=False)
+ print(f"{so.all()['TxnID'] = } {so.all()['RefNumber'] = }")
+ print(so.all())
+ else:
+ pass # this SO is fully invoiced, starting process to export the details
+ else:
+ print('Linkedtxn amount is positif(should be negatif')
+ except Exception as e:
+ print('ERROR')
+ pprint(linkedtxn, sort_dicts=False)
+ print(f"{so.all()['TxnID'] = }")
+ print(so.all())
+ print(e)
+ break
+ else:
+ nolinkInv.append(txn)
+ print(f'{len(nolinkInv) = }')
+
+
+@timer
+def process_data(iq_list, so_dict):
+ print('process_data')
+ # iq = InvoiceQuery(MaxReturned= 20, IncludeLinkedTxns='true', IncludeLineItems='true', debug=False)
+ # iq = InvoiceQuery(TxnDateRangeFilter_FromTxnDate='2024-02-01', TxnDateRangeFilter_ToTxnDate='2024-02-29', IncludeLinkedTxns='true', IncludeLineItems='true')
+ # pprint(iq_list, sort_dicts=False)
+ # print(iq_list)
+ nolinkInv = []
+ soNotInOneInv = []
+ manuallyClosedSO = []
+ openSO = []
+ fullyInvoicedSO = []
+ so_list = [x for x in so_dict]
+ print(f'{len(so_list) = }')
+ result_iq_list = []
+ for idx, txn in enumerate(iq_list):
+ # print(f"{idx = } {txn['RefNumber'] = } {txn['TxnDate'] = } {txn['Subtotal'] = } ")
+ # print(f"{txn['Subtotal'] = }")
+
+ if 'LinkedTxn' in txn:
+ # pprint(txn['LinkedTxn'], sort_dicts=False)
+ if not isinstance(txn['LinkedTxn'], list): #if there is no receive payment and only 1 linked traction, need to change to a list. RECORD it
+ txn_linkedTxn = [txn['LinkedTxn']]
+ else:
+ txn_linkedTxn = txn['LinkedTxn']
+
+ for linkedtxn in txn_linkedTxn:
+ # try:
+ if linkedtxn['TxnType']=='SalesOrder':
+ try:
+ # so_list.remove(linkedtxn['RefNumber'])
+ # so = SalesOrderQuery(RefNumber = linkedtxn['RefNumber'], IncludeLinkedTxns='true', debug=False)
+ sodt = so_dict[linkedtxn['RefNumber']]
+ is_soLinkedToOneInvoice = False
+ if sodt['IsManuallyClosed']=='true':
+ manuallyClosedSO.append(sodt['RefNumber'])
+ if sodt['IsFullyInvoiced']=='true':
+ fullyInvoicedSO.append(sodt['RefNumber'])
+ if 'LinkedTxn' in sodt:
+ if not isinstance(sodt['LinkedTxn'], list):
+ # print(sodt)
+ so_linkedTxn = [sodt['LinkedTxn']] #make a list
+ else:
+ so_linkedTxn = sodt['LinkedTxn'] #just copy, already list
+ # print(sodt)
+ for solinkedtxn in so_linkedTxn:
+ # print(len(so_linkedTxn))
+ if solinkedtxn['TxnType']=='Invoice' and len(so_linkedTxn)==1:
+ # print(sodt['RefNumber'], 'the only one SO')
+ is_soLinkedToOneInvoice=True
+ # pass
+ else:
+ is_soLinkedToOneInvoice=False
+ print(sodt['RefNumber'], 'NOT the only One, this SO have other Invoice number') #make append to a list
+ soNotInOneInv.append(sodt['RefNumber'])
+
+ if float(linkedtxn['Amount'])<0:
+ # if sodt['TotalAmount']!=linkedtxn['Amount'][1:]:
+ # pass
+ # if is_soLinkedToOneInvoice: #maybe the SO is manually closed, check it item by item, find which item is not in invoice
+ # if sodt['IsManuallyClosed'] == 'true':
+ # pass
+ # print(f"{sodt['TxnID'] = } {sodt['RefNumber'] = }")
+ # manuallyClosedSO.append(sodt['RefNumber'])
+ # else:
+ # print('SO TotalAmount<>Amount in Invoice. not Manually closed and not fully Invoiced')
+ # pprint(f'{linkedtxn = }', sort_dicts=False)
+ # print(f"{sodt['TxnID'] = } {sodt['RefNumber'] = }")
+ # print(sodt)
+ # openSO.append(sodt['RefNumber'])
+ # else:
+ pass # this SO is fully invoiced, starting process to export the details
+ try:
+ if not isinstance(sodt['SalesOrderLineRet'],list):
+ sodt['SalesOrderLineRet'] = [sodt['SalesOrderLineRet']]
+ if not isinstance(txn['InvoiceLineRet'],list):
+ txn['InvoiceLineRet'] = [txn['InvoiceLineRet']]
+ for so_line in sodt['SalesOrderLineRet']:
+ checklist = ['ItemRef', ]
+ if len([ i for i in checklist if i in so_line])==0:
+ continue
+ sotxnlineid = so_line['TxnLineID']
+ soitemref_fullname = so_line.get('ItemRef',{}).get('FullName')
+ soquantity:str = so_line.get('Quantity')
+ # print(f'{soquantity = }')
+ sounitofmeasure = so_line.get('UnitOfMeasure')
+ # sooverrideuomsetref_fullname = so_line['OverrideUOMSetRef']['FullName']
+ sorate = so_line.get('Rate')
+ soamount = so_line.get('Amount')
+ soinvoiced = so_line.get('Invoiced')
+ soismanuallyclosed = so_line['IsManuallyClosed']
+ soother2 = so_line.get('Other2')
+
+ #check compare to the invoicelineret
+ for inv_line in txn['InvoiceLineRet']: #loop start from top in order
+ is_inv_so_line_ok = True
+ if 'soline' not in inv_line: #this line has no so link yet
+ if inv_line.get('ItemRef',{}).get('FullName') != soitemref_fullname:
+ continue
+ if inv_line.get('UnitOfMeasure') != sounitofmeasure:
+ print(f"{inv_line['ItemRef']['FullName'] = } {inv_line['UnitOfMeasure']=} != {sounitofmeasure=}")
+ is_inv_so_line_ok = False
+ #do convertion????
+ # continue
+ if soinvoiced and inv_line.get('Quantity',0)!=soinvoiced: #compre with the invoiced
+ print(f"{inv_line['ItemRef']['FullName'] = } {inv_line['Quantity']=} != {soquantity=}")
+ is_inv_so_line_ok = False
+ if sorate:
+ if float(inv_line.get('Rate',0))!=float(sorate):
+ print(f"{inv_line['ItemRef']['FullName'] = } {inv_line['Rate']=} <> {sorate=} ; {float(inv_line.get('Rate',0)) = } {float(sorate) = }")
+ is_inv_so_line_ok = False
+ # if soamount:
+ # if float(inv_line.get('Amount',0))!=float(soamount):
+ # print(f"{txn['RefNumber']} {inv_line['ItemRef']['FullName'] = } {inv_line['Amount']=} != {soamount=}")
+ # is_inv_so_line_ok = False
+ if not is_inv_so_line_ok:
+ print(f"{inv_line['ItemRef']['FullName'] = } Some detail not equal")
+ continue
+ #add to the spesific invoiceline
+ inv_line['soline']= {'TxnID':sodt['TxnID'],
+ 'RefNumber':sodt['RefNumber'],
+ 'TxnDate':sodt['TxnDate'],
+ 'TxnLineID': sotxnlineid,
+ 'ItemRef_FullName':soitemref_fullname,
+ 'Quantity':soquantity,
+ 'UnitOfMeasure':sounitofmeasure,
+ 'Rate':sorate,
+ 'Amount':soamount,
+ 'Invoiced':soinvoiced,
+ 'IsManuallyClosed':soismanuallyclosed,
+ 'Other2':soother2}
+ break
+ except Exception as e:
+ print(f"SO {sodt['RefNumber'] = } {txn['RefNumber'] = }")
+ print(f'ERROR: {e}')
+ else:
+ print('Linkedtxn amount is positif(should be negatif')
+ except Exception as e:
+ # print('ERROR')
+ # pprint(linkedtxn, sort_dicts=False)
+ # print(f"{sodt['TxnID'] = }")
+ print(f"{sodt['RefNumber'] = } {txn['RefNumber'] = }")
+ print(f'ERROR: {e}')
+ break
+ else:
+ nolinkInv.append(txn)
+ # c =next(iter(iq_list))
+ # print('TEST RESULT:')
+ # pprint(c, sort_dicts=False)
+ print(f'{len(nolinkInv) = }\n{nolinkInv = }\n{soNotInOneInv = }\n{manuallyClosedSO = }\n{openSO = }\n{len(fullyInvoicedSO) = }')
+ c = [item for item in so_list if item not in fullyInvoicedSO]
+ print(f'not fuuly invoice, leftover SO: {c}')
+ return iq_list
+
+
+def checking_iqwith_so(iq_list):
+ if not iq_list:
+ return False
+ if not isinstance(iq_list,list):
+ iq_list = [iq_list]
+ inv_nolineret = []
+ inv_line_no_soline = []
+ inv_line_no_itemref = []
+ for txn in iq_list:
+ if 'InvoiceLineRet' not in txn:
+ print(f"{txn['RefNumber'] = } doesnt have InvoiceLineRet")
+ inv_nolineret.append(txn['RefNumber'])
+ continue
+ # if 'LinkedTxn'
+ if not isinstance(txn['InvoiceLineRet'], list):
+ txn['InvoiceLineRet'] = [txn['InvoiceLineRet']]
+ for idx, inv_line in enumerate(txn['InvoiceLineRet']):
+ if 'ItemRef' not in inv_line:
+ inv_line_no_itemref.append({'RefNumber':txn['RefNumber'],
+ 'idx':idx,})
+ continue
+ if 'soline' in inv_line:
+ continue
+
+ if '400_Sales' not in inv_line['ItemRef']['FullName'] and 'Sales Promo Discount' not in inv_line['ItemRef']['FullName']:
+ inv_line_no_soline.append({'RefNumber':txn['RefNumber'],
+ 'idx':idx,
+ 'ItemRef_FullName':inv_line['ItemRef']['FullName'],
+ 'Amount':inv_line['Amount']})
+ print(f'{inv_line_no_soline = }')
+ print(f'{inv_line_no_itemref = }')
+ print(f'{inv_nolineret = }')
+ if inv_line_no_soline or inv_line_no_itemref or inv_nolineret:
+ return False
+ else:
+ return True
+
+
+def make_invoiceadd_dict(iq_list):
+ print('make_invoiceadd_dict')
+ # status = checking_iqwith_so(iq_list)
+ # print(status)
+ # if not status:
+ # return False
+ inv_nolineret = []
+ inv_line_no_soline = []
+ inv_line_no_itemref = []
+ invoiceaddlist = []
+ for inv_line in iq_list:
+ # if 'InvoiceLineRet' not in txn:
+ # print(f"{txn['RefNumber'] = } doesnt have InvoiceLineRet")
+ # inv_nolineret.append(txn['RefNumber'])
+ # continue
+ # if not isinstance(txn['InvoiceLineRet'], list):
+ # txn['InvoiceLineRet'] = [txn['InvoiceLineRet']]
+ # for idx, inv_line in enumerate(txn['InvoiceLineRet']):
+ invadddict = {}
+ # pprint(inv_line, sort_dicts=False)
+ invadddict['CustomerRef_FullName'] = inv_line['CustomerRef']['FullName']
+ invadddict['ARAccountRef_FullName']= inv_line['ARAccountRef']['FullName']
+ invadddict['TemplateRef_FullName'] = inv_line['TemplateRef']['FullName']
+ invadddict['TxnDate'] = inv_line['TxnDate']
+ invadddict['RefNumber'] = inv_line['RefNumber']
+ invadddict['BillAddress_Addr1'] = inv_line['BillAddress'].get('Addr1')
+ invadddict['BillAddress_Addr2'] = inv_line['BillAddress'].get('Addr2')
+ invadddict['BillAddress_Addr3'] = inv_line['BillAddress'].get('Addr3')
+ invadddict['BillAddress_Addr4'] = inv_line['BillAddress'].get('Addr4')
+ invadddict['BillAddress_Addr5'] = inv_line['BillAddress'].get('Addr5')
+ invadddict['BillAddress_City'] = inv_line['BillAddress'].get('City')
+ invadddict['BillAddress_State'] = inv_line['BillAddress'].get('State')
+ invadddict['BillAddress_PostalCode'] = inv_line['BillAddress'].get('PostalCode')
+ invadddict['BillAddress_Country'] = inv_line['BillAddress'].get('Country')
+ invadddict['BillAddress_Note'] = inv_line['BillAddress'].get('Note')
+ if 'ShipAddress' in inv_line:
+ invadddict['ShipAddress_Addr1'] = inv_line['ShipAddress'].get('Addr1')
+ invadddict['ShipAddress_Addr2'] = inv_line['ShipAddress'].get('Addr2')
+ invadddict['ShipAddress_Addr3'] = inv_line['ShipAddress'].get('Addr3')
+ invadddict['ShipAddress_Addr4'] = inv_line['ShipAddress'].get('Addr4')
+ invadddict['ShipAddress_Addr5'] = inv_line['ShipAddress'].get('Addr5')
+ invadddict['ShipAddress_City'] = inv_line['ShipAddress'].get('City')
+ invadddict['ShipAddress_State'] = inv_line['ShipAddress'].get('State')
+ invadddict['ShipAddress_PostalCode'] = inv_line['ShipAddress'].get('PostalCode')
+ invadddict['ShipAddress_Country'] = inv_line['ShipAddress'].get('Country')
+ invadddict['ShipAddress_Note'] = inv_line['ShipAddress'].get('Note')
+ if inv_line.get('PONumber'):
+ invadddict['PONumber'] = inv_line.get('PONumber')
+ invadddict['TermsRef_FullName'] = inv_line['TermsRef']['FullName']
+ invadddict['DueDate'] = inv_line['DueDate']
+ if 'SalesRepRef' in inv_line:
+ invadddict['SalesRepRef_FullName'] = inv_line['SalesRepRef']['FullName']
+ invadddict['ShipDate'] = inv_line['ShipDate']
+ if inv_line.get('Memo'):
+ invadddict['Memo'] = inv_line['Memo']
+ invadddict['IsToBePrinted'] = "false"
+ invadddict['IsToBeEmailed'] = "false"
+ if 'Other' in inv_line :
+ invadddict['Other'] = inv_line['Other']
+
+ #InvoiceLineAdd BEGIN
+ invoicelineadd_list = []
+ txnid_list = []
+ if not isinstance(inv_line['InvoiceLineRet'], list):
+ inv_line['InvoiceLineRet'] = [inv_line['InvoiceLineRet']]
+
+ for idx, invlineret in enumerate(inv_line['InvoiceLineRet']):
+ print(f'{invlineret = }')
+ if 'ItemRef' not in invlineret:
+ inv_line_no_itemref.append({'RefNumber':inv_line['RefNumber'],
+ 'idx':idx,})
+ continue
+ invlineadd={}
+ if 'soline' not in invlineret:
+ invlineadd['ItemRef_FullName'] = invlineret['ItemRef']['FullName']
+ # invlineadd['Desc'] = invlineret['Desc']
+ if 'Quantity' in invlineret:
+ invlineadd['Quantity'] = invlineret['Quantity']
+ if 'UnitOfMeasure' in invlineret:
+ invlineadd['UnitOfMeasure'] = invlineret['UnitOfMeasure']
+ invlineadd['Rate'] = invlineret['Rate']
+ invlineadd['Amount'] = invlineret['Amount']
+ if 'Other1' in invlineret:
+ invlineadd['Other1'] = invlineret['Other1']
+ if 'Other2' in invlineret:
+ invlineadd['Other2'] = invlineret['Other2']
+ # print(f"{invlineadd = } {invlineret['ItemRef']['FullName']=}")
+ ### WARNING, check with the real TxnID in new QB. Replace the soline TxnID and TxnLineID with New QB SalesOrder
+ if 'soline' in invlineret: ### WARNING, check with the real TxnID in new QB
+ invlineadd['LinkToTxn_TxnID'] = invlineret['soline']['TxnID']
+ invlineadd['LinkToTxn_TxnLineID'] = invlineret['soline']['TxnLineID']
+ txnid_list.append(invlineret['soline']['TxnID'])
+ invoicelineadd_list.append(invlineadd)
+ # print(invlineadd)
+ # print(invoicelineadd_list)
+ txnid = list(set(txnid_list))
+ # if txnid:
+ # invadddict['LinkToTxnID']=txnid
+ invadddict['InvoiceLineAdd'] = invoicelineadd_list
+ invoiceaddlist.append(invadddict)
+
+ pprint(invadddict, sort_dicts=False)
+ for x in invoiceaddlist:
+ if '10671' in x['RefNumber']:
+ pprint(x, sort_dicts=False)
+ break
+ # for y in x['InvoiceLineAdd']:
+ # if '10671' in y['ItemRef_FullName']:
+ # pprint(x, sort_dicts=False)
+ # break
+ print(f'{len(invoiceaddlist) = }')
+
+def writeToFile(iq_list=None, so_dict=None, filename = "", suffix="", indent=2):
+ if not filename:
+ return False
+ try:
+ if iq_list:
+ if indent==None:
+ iq_list_json = json.dumps(iq_list)
+ else:
+ iq_list_json = json.dumps(iq_list, indent=indent)
+ with open(f"{filename}{suffix}.json", "w") as outfile:
+ outfile.write(iq_list_json)
+ if so_dict:
+ if indent==None:
+ so_dict_json = json.dumps(so_dict)
+ else:
+ so_dict_json = json.dumps(so_dict, indent=indent)
+ with open(f"{filename}_so_dict{suffix}.json", "w") as outfile:
+ outfile.write(so_dict_json)
+ return True
+ except Exception as e:
+ print(e)
+ return False
+
+def readJsonFromFile(filename):
+ try:
+ with open(filename, "r") as infile:
+ _list = json.load(infile)
+ return _list
+ except Exception as e:
+ print(e)
+ return []
+
+
+def get_last_date_of_month(stryearmonth:str):
+ # Get Last date of Month
+ # Using replace() + timedelta()
+
+ # initializing date
+ test_date = datetime.datetime.fromisoformat(stryearmonth)
+ # test_date = datetime.datetime(2018, 6, 4)
+
+ # printing original date
+ print("The original date is : " + str(test_date))
+
+ # getting next month
+ # using replace to get to last day + offset
+ # to reach next month
+ nxt_mnth = test_date.replace(day=28) + datetime.timedelta(days=4)
+
+ # subtracting the days from next month date to
+ # get last date of current Month
+ res = nxt_mnth - datetime.timedelta(days=nxt_mnth.day)
+
+ # printing result
+ datesplit = stryearmonth.split('-')
+ print("Last date of month : " + str(res.day), f"{datesplit[0]}-{datesplit[1]}-{str(res.day)}")
+
+ return f"{datesplit[0]}-{datesplit[1]}-{str(res.day)}"
+
+def main(fromtxndate, totxndate, maxreturned:int=None):
+ # print(timeit.repeat(process, repeat=1))
+ # process()
+
+ invqueryfilename = f'exim\Data\{fromtxndate}iq'
+ # if maxreturned:
+ # iq_list, so_dict = get_all_so_from_invoice(MaxReturned=maxreturned)
+
+ # else:
+ # try:
+ # _fromdate = datetime.datetime.fromisoformat(fromtxndate)
+ # _todate = datetime.datetime.fromisoformat(totxndate)
+ # except Exception as e:
+ # print('date format should be yyyy-mm-dd example: "2024-03-09"')
+ # return False
+
+ # ## Reading from QB and write to a file depends on txndate
+ # iq_list, so_dict = get_all_so_from_invoice(FromTxnDate=fromtxndate, ToTxnDate=totxndate)
+ # writeToFile(iq_list, so_dict, filename=invqueryfilename)
+
+ ### reading from existing file the iq_list and so_dict jsonfile
+
+ iq_list = readJsonFromFile(f"{invqueryfilename}.json")
+ so_dict = readJsonFromFile(f"{invqueryfilename}_so_dict.json")
+ print(f'{len(iq_list) = } {len(so_dict) = }')
+ iq_list = process_data(iq_list, so_dict)
+ suffix = '_withsoindent2'
+ writeToFile(iq_list, filename=f'{invqueryfilename}', suffix=suffix, indent=2)
+ iq_list = readJsonFromFile(f'{invqueryfilename}{suffix}.json')
+ print(len(iq_list))
+ print(f'Seems {invqueryfilename}{suffix}.json is {checking_iqwith_so(iq_list)}') #checking the iq_list. is it good to import to new QB?
+
+ make_invoiceadd_dict(iq_list)
+
+if __name__=='__main__':
+ # print(np.arange('2021-02', '2021-03', dtype='datetime64[D]'))
+ fromtxndate = '2022-08-01'
+ totxndate = get_last_date_of_month(fromtxndate)
+ _fromdate = datetime.datetime.fromisoformat(fromtxndate)
+
+ print(fromtxndate)
+ main(fromtxndate, totxndate)
diff --git a/exim_testimport.py b/exim_testimport.py
new file mode 100644
index 0000000..99f63af
--- /dev/null
+++ b/exim_testimport.py
@@ -0,0 +1,137 @@
+dt2 = [{'CustomerRef_FullName': 'JM Abadi',
+ 'ARAccountRef_FullName': 'Accounts Receivable',
+ 'TemplateRef_FullName': 'DBW Invoice (11%)',
+ 'TxnDate': '2022-08-26',
+ 'RefNumber': '10671',
+ 'BillAddress_Addr1': 'JM Abadi',
+ 'BillAddress_Addr2': 'Jl. Raya Ps. Minggu No. 75',
+ 'BillAddress_Addr3': None,
+ 'BillAddress_Addr4': None,
+ 'BillAddress_Addr5': None,
+ 'BillAddress_City': None,
+ 'BillAddress_State': None,
+ 'BillAddress_PostalCode': None,
+ 'BillAddress_Country': None,
+ 'BillAddress_Note': None,
+ 'ShipAddress_Addr1': 'JM Abadi',
+ 'ShipAddress_Addr2': 'Jl. Raya Ps. Minggu No. 75',
+ 'ShipAddress_Addr3': None,
+ 'ShipAddress_Addr4': None,
+ 'ShipAddress_Addr5': None,
+ 'ShipAddress_City': None,
+ 'ShipAddress_State': None,
+ 'ShipAddress_PostalCode': None,
+ 'ShipAddress_Country': None,
+ 'ShipAddress_Note': None,
+ 'TermsRef_FullName': '30 Hari',
+ 'DueDate': '2022-09-25',
+ 'SalesRepRef_FullName': 'W',
+ 'ShipDate': '2022-08-26',
+ 'IsToBePrinted': 'false',
+ 'IsToBeEmailed': 'false',
+ 'InvoiceLineAdd': [{'Quantity': '12',
+ 'UnitOfMeasure': 'Box',
+ 'Rate': '35000',
+ 'Amount': '420000.00',
+ 'LinkToTxn_TxnID': 'A289A-1661495309',
+ 'LinkToTxn_TxnLineID': 'A289C-1661495309'},
+ {'Quantity': '6',
+ 'UnitOfMeasure': 'Box',
+ 'Rate': '122500',
+ 'Amount': '735000.00',
+ 'LinkToTxn_TxnID': 'A289A-1661495309',
+ 'LinkToTxn_TxnLineID': 'A289D-1661495309'}]},
+ {'CustomerRef_FullName': 'JM Abadi',
+ 'ARAccountRef_FullName': 'Accounts Receivable',
+ 'TemplateRef_FullName': 'DBW Invoice (11%)',
+ 'TxnDate': '2022-08-26',
+ 'RefNumber': '10671',
+ 'BillAddress_Addr1': 'JM Abadi',
+ 'BillAddress_Addr2': 'Jl. Raya Ps. Minggu No. 75',
+ 'BillAddress_Addr3': None,
+ 'BillAddress_Addr4': None,
+ 'BillAddress_Addr5': None,
+ 'BillAddress_City': None,
+ 'BillAddress_State': None,
+ 'BillAddress_PostalCode': None,
+ 'BillAddress_Country': None,
+ 'BillAddress_Note': None,
+ 'ShipAddress_Addr1': 'JM Abadi',
+ 'ShipAddress_Addr2': 'Jl. Raya Ps. Minggu No. 75',
+ 'ShipAddress_Addr3': None,
+ 'ShipAddress_Addr4': None,
+ 'ShipAddress_Addr5': None,
+ 'ShipAddress_City': None,
+ 'ShipAddress_State': None,
+ 'ShipAddress_PostalCode': None,
+ 'ShipAddress_Country': None,
+ 'ShipAddress_Note': None,
+ 'TermsRef_FullName': '30 Hari',
+ 'DueDate': '2022-09-25',
+ 'SalesRepRef_FullName': 'W',
+ 'ShipDate': '2022-08-26',
+ 'IsToBePrinted': 'false',
+ 'IsToBeEmailed': 'false',
+ 'InvoiceLineAdd': [{'Quantity': '12',
+ 'UnitOfMeasure': 'Box',
+ 'Rate': '35000',
+ 'Amount': '420000.00',
+ 'LinkToTxn_TxnID': 'A289A-1661495309',
+ 'LinkToTxn_TxnLineID': 'A289C-1661495309'},
+ {'Quantity': '6',
+ 'UnitOfMeasure': 'Box',
+ 'Rate': '122500',
+ 'Amount': '735000.00',
+ 'LinkToTxn_TxnID': 'A289A-1661495309',
+ 'LinkToTxn_TxnLineID': 'A289D-1661495309'}]}]
+# print(dt)
+
+dt = {'CustomerRef_FullName': 'JM Abadi',
+ 'ARAccountRef_FullName': 'Accounts Receivable',
+ 'TemplateRef_FullName': 'DBW Invoice (11%)',
+ 'TxnDate': '2022-08-26',
+ 'RefNumber': '10671',
+ 'BillAddress_Addr1': 'JM Abadi',
+ 'BillAddress_Addr2': 'Jl. Raya Ps. Minggu No. 75',
+ 'BillAddress_Addr3': None,
+ 'BillAddress_Addr4': None,
+ 'BillAddress_Addr5': None,
+ 'BillAddress_City': None,
+ 'BillAddress_State': None,
+ 'BillAddress_PostalCode': None,
+ 'BillAddress_Country': None,
+ 'BillAddress_Note': None,
+ 'ShipAddress_Addr1': 'JM Abadi',
+ 'ShipAddress_Addr2': 'Jl. Raya Ps. Minggu No. 75',
+ 'ShipAddress_Addr3': None,
+ 'ShipAddress_Addr4': None,
+ 'ShipAddress_Addr5': None,
+ 'ShipAddress_City': None,
+ 'ShipAddress_State': None,
+ 'ShipAddress_PostalCode': None,
+ 'ShipAddress_Country': None,
+ 'ShipAddress_Note': None,
+ 'TermsRef_FullName': '30 Hari',
+ 'DueDate': '2022-09-25',
+ 'SalesRepRef_FullName': 'W',
+ 'ShipDate': '2022-08-26',
+ 'IsToBePrinted': 'false',
+ 'IsToBeEmailed': 'false',
+ 'InvoiceLineAdd': [{'Quantity': '12',
+ 'UnitOfMeasure': 'Box',
+ 'Rate': '35000',
+ 'Amount': '420000.00',
+ 'LinkToTxn_TxnID': 'A289A-1661495309',
+ 'LinkToTxn_TxnLineID': 'A289C-1661495309'},
+ {'Quantity': '6',
+ 'UnitOfMeasure': 'Box',
+ 'Rate': '122500',
+ 'Amount': '735000.00',
+ 'LinkToTxn_TxnID': 'A289A-1661495309',
+ 'LinkToTxn_TxnLineID': 'A289D-1661495309'}]}
+from QBClass.QBClasses import InvoiceAdd
+
+# IA = InvoiceAdd(**dt, debug=True)
+IA = InvoiceAdd(*dt2, debug=True) #a list
+print(IA.all())
+
diff --git a/main.py b/main.py
index 15a249c..e0ab828 100644
--- a/main.py
+++ b/main.py
@@ -265,7 +265,10 @@ async def get_generalsalesreport(request: Request):
getdict = json.loads(getdict)
except:
print('error get_gsr()')
- return {'message':'error getting GeneralSalesReport'}
+ if not getdict:
+ getdict = {'ReportDateMacro' : 'ThisYear'}
+ else:
+ return {'message':'error getting GeneralSalesReport'}
print(f'get_gsr 1-> {type(getdict)}, {getdict}')
ReportDateMacro = getdict['ReportDateMacro'] if 'ReportDateMacro' in getdict else None
FromReportDate = getdict['FromReportDate'] if 'FromReportDate' in getdict else None
@@ -274,7 +277,7 @@ async def get_generalsalesreport(request: Request):
responseRt = GSRQ(GeneralSummaryReportType='SalesByCustomerSummary', ReportDateMacro=ReportDateMacro, FromReportDate=FromReportDate, ToReportDate=ToReportDate)
# print(f'get_gsr 2-> {type(responseRt)}, {responseRt}')
datas1=responseRt.get_datarow()
- # print(f'get_gsr 3-> {type(datas1)}, {datas1}')
+ print(f'get_gsr 3-> {type(datas1)}, {datas1}')
print(f'{datetime.datetime.now()} get_gsr 4 finish -> {type(getdict)}, {getdict}')
print("")
diff --git a/test from mike.py b/test from mike.py
new file mode 100644
index 0000000..9b77394
--- /dev/null
+++ b/test from mike.py
@@ -0,0 +1,128 @@
+import win32com.client
+import xml.etree.ElementTree as ET
+
+class QuickBooksSDK:
+ def __init__(self):
+ """ Initialize QBSDK Request Processor """
+ self.qb = win32com.client.Dispatch("QBXMLRP2.RequestProcessor")
+ # self.session_id = None
+ # def open_connection(self):
+ # """ Open connection to QuickBooks """
+ # self.qb.OpenConnection("", "My Python App")
+ # self.qb.BeginSession("", 2) # 2 = Use current QuickBooks session
+
+ # def close_connection(self):
+ # """ Close connection to QuickBooks """
+ # self.qb.EndSession()
+ # self.qb.CloseConnection()
+
+ def open_connection(self):
+ """ Open connection to QuickBooks """
+ self.qb = win32com.client.Dispatch("QBXMLRP2.RequestProcessor")
+ self.qb.OpenConnection("", "My QuickBooks App")
+ self.session_id = self.qb.BeginSession("", 2) # 2 = Open in "No UI" mode
+ print("Connection to QuickBooks established.", self.session_id)
+
+ def close_connection(self):
+ """ Close QuickBooks session and connection """
+ if self.session_id:
+
+ self.qb.EndSession(self.session_id)
+ self.qb.CloseConnection()
+ print("Connection to QuickBooks closed.")
+
+
+ # def send_request(self, qbxml: str) -> str:
+ # """ Send qbXML request and return response """
+ # print("Sending XML Request to QuickBooks:\n", qbxml) # Debugging print
+ # response = self.qb.ProcessRequest(qbxml)
+ # return response
+ def send_request(self, qbxml: str) -> str:
+ """ Send QBXML request to QuickBooks and return response """
+ try:
+ print("\nš· SENDING REQUEST TO QUICKBOOKS:")
+ print(qbxml) # Print the exact request
+ print(self.session_id)
+ response = self.qb.ProcessRequest(self.session_id, qbxml)
+
+ print("\nā
RESPONSE RECEIVED FROM QUICKBOOKS:")
+ print(response if response else "No response received!")
+
+ return response
+ except Exception as e:
+ print("\nā ERROR Processing Request:", str(e))
+ return ""
+
+
+
+ def parse_sales_order_response(self, xml_response: str):
+ """ Parse SalesOrderQueryRs XML response into a Python dictionary """
+ print(f'{xml_response = }')
+ root = ET.fromstring(xml_response)
+ sales_orders = []
+
+ for order in root.findall(".//SalesOrderRet"):
+ order_data = {
+ "TxnID": order.findtext("TxnID", ""),
+ "TxnDate": order.findtext("TxnDate", ""),
+ "CustomerRef": order.findtext("CustomerRef/FullName", ""),
+ "TotalAmount": order.findtext("TotalAmount", ""),
+ "LineItems": []
+ }
+
+ for line in order.findall(".//SalesOrderLineRet"):
+ line_item = {
+ "ItemRef": line.findtext("ItemRef/FullName", ""),
+ "Quantity": line.findtext("Quantity", ""),
+ "Rate": line.findtext("Rate", ""),
+ "Amount": line.findtext("Amount", "")
+ }
+ order_data["LineItems"].append(line_item)
+
+ sales_orders.append(order_data)
+
+ return sales_orders
+
+ def get_sales_orders(self, from_date: str, to_date: str) -> str:
+ """ Fetch sales orders from QuickBooks within date range """
+ qbxml = f"""
+
+
+
+
+
+
+
+ 2024-01-01
+ 2024-01-05
+
+ 1
+
+
+
+ """
+ qbxml = qbxml.strip()
+ print("\nš CHECKING QBXML FORMAT BEFORE SENDING:")
+ print(qbxml) # Print request before sending
+
+ response = self.send_request(qbxml)
+ return response
+
+
+
+
+# **š¹ Main Execution**
+if __name__ == "__main__":
+ qb = QuickBooksSDK()
+
+ try:
+ qb.open_connection()
+
+ # Query sales orders from January 1, 2024 to January 5, 2024
+ sales_orders = qb.get_sales_orders("2024-01-01", "2024-01-05")
+
+ # Print hasil dalam format dictionary
+ print("Sales Orders:", sales_orders)
+
+ finally:
+ qb.close_connection()
diff --git a/test.py b/test.py
deleted file mode 100644
index 4085149..0000000
--- a/test.py
+++ /dev/null
@@ -1,2 +0,0 @@
-import icecream
-print("berhasil")
\ No newline at end of file