diff --git a/SO_to_Inv/readSO.py b/SO_to_Inv/readSO.py
index 49ef292..0156064 100644
--- a/SO_to_Inv/readSO.py
+++ b/SO_to_Inv/readSO.py
@@ -20,6 +20,8 @@ class SalesOrderQuery:
self.PriceLevelName = None
self.SPPriceLevelName = None
self.cwd = kwargs['cwd'] if 'cwd' in kwargs else os.getcwd()
+ self.TxnID = kwargs['TxnID'] if 'TxnID' in kwargs else None
+
self.item_inventory_path = "ItemInventory"
self.price_level_filename = "PriceLevel.xlsx"
self._df_price_level = pd.read_excel(os.path.join(self.cwd, self.item_inventory_path, self.price_level_filename), usecols=['FullName', 'PriceLevelName', 'CustomPrice'],)
@@ -99,25 +101,34 @@ class SalesOrderQuery:
QBXMLMsgsRq.text = "\n "
SalesOrderQueryRq = self.create_sub_element(ET, QBXMLMsgsRq, "SalesOrderQueryRq","\n " )
# SalesOrderType = self.create_sub_element(ET, SalesOrderQueryRq, 'SalesOrderType', self.SalesOrderType)
- if self.RefNumber:
+ if self.TxnID:
pass
- RefNumberFilter = self.create_sub_element(ET, SalesOrderQueryRq, 'RefNumberFilter', "\n ",)
- MatchCriterion = self.create_sub_element(ET,RefNumberFilter, 'MatchCriterion', "Contains",)
- RefNumber = self.create_sub_element(ET, RefNumberFilter, 'RefNumber', self.RefNumber, )
- elif self.FullName:
- EntityFilter = self.create_sub_element(ET, SalesOrderQueryRq, 'EntityFilter', "\n ")
- FullName = self.create_sub_element(ET, EntityFilter, "FullName", self.FullName, 6)
- elif self.DateMacro:
- TxnDateRangeFilter = self.create_sub_element(ET, SalesOrderQueryRq, "TxnDateRangeFilter", "\n ",)
- SalesOrderType = self.create_sub_element(ET, TxnDateRangeFilter, "DateMacro", self.DateMacro)
- # SalesOrderType = self.create_sub_element(ET, SalesOrderQueryRq, "DateMacro", self.DateMacro)
+ print(self.TxnID)
+ if isinstance(self.TxnID, list):
+ for _ in self.TxnID:
+ TxnID = self.create_sub_element(ET, SalesOrderQueryRq, "TxnID", _, )
+ else:
+ TxnID = self.create_sub_element(ET, SalesOrderQueryRq, "TxnID", self.TxnID, )
+ else:
+ if self.RefNumber:
+ pass
+ RefNumberFilter = self.create_sub_element(ET, SalesOrderQueryRq, 'RefNumberFilter', "\n ",)
+ MatchCriterion = self.create_sub_element(ET,RefNumberFilter, 'MatchCriterion', "Contains",)
+ RefNumber = self.create_sub_element(ET, RefNumberFilter, 'RefNumber', self.RefNumber, )
+ elif self.FullName:
+ EntityFilter = self.create_sub_element(ET, SalesOrderQueryRq, 'EntityFilter', "\n ")
+ FullName = self.create_sub_element(ET, EntityFilter, "FullName", self.FullName, 6)
+ elif self.DateMacro:
+ TxnDateRangeFilter = self.create_sub_element(ET, SalesOrderQueryRq, "TxnDateRangeFilter", "\n ",)
+ SalesOrderType = self.create_sub_element(ET, TxnDateRangeFilter, "DateMacro", self.DateMacro)
+ # SalesOrderType = self.create_sub_element(ET, SalesOrderQueryRq, "DateMacro", self.DateMacro)
- elif type(self.FromTxnDate) is datetime.date or type(self.ToTxnDate) is datetime.date:
- TxnDateRangeFilter = self.create_sub_element(ET, SalesOrderQueryRq, "TxnDateRangeFilter", "\n ",)
- if type(self.FromTxnDate) is datetime.date:
- FromTxnDate = self.create_sub_element(ET, TxnDateRangeFilter, "FromTxnDate", self.FromTxnDate.strftime('%Y-%m-%d'),4)
- if type(self.ToTxnDate) is datetime.date:
- ToTxnDate = self.create_sub_element(ET, TxnDateRangeFilter, "ToTxnDate", self.ToTxnDate.strftime('%Y-%m-%d'))
+ elif type(self.FromTxnDate) is datetime.date or type(self.ToTxnDate) is datetime.date:
+ TxnDateRangeFilter = self.create_sub_element(ET, SalesOrderQueryRq, "TxnDateRangeFilter", "\n ",)
+ if type(self.FromTxnDate) is datetime.date:
+ FromTxnDate = self.create_sub_element(ET, TxnDateRangeFilter, "FromTxnDate", self.FromTxnDate.strftime('%Y-%m-%d'),4)
+ if type(self.ToTxnDate) is datetime.date:
+ ToTxnDate = self.create_sub_element(ET, TxnDateRangeFilter, "ToTxnDate", self.ToTxnDate.strftime('%Y-%m-%d'))
if self.IncludeLineItems:
IncludeLineItems = self.create_sub_element(ET, SalesOrderQueryRq, "IncludeLineItems", self.IncludeLineItems, 4)
if len(self.IncludeRetElement)>0:
@@ -178,11 +189,17 @@ class SalesOrderQuery:
return self.get_customer_pricelevel(response_string)
return response_string
- def create_invoiceadd_QBXML(self, soList=None):
+ def create_invoiceadd_QBXML(self, soDict=None):
print('create_ionvoiceadd_QBXML')
- if soList:
- self.SalesOrderList = soList
+ txn_date = str(date.today())
+ ref_number = None
+ if soDict:
+ self.SalesOrderList = soDict['data']
+ txn_date = soDict.get('txn_date', str(date.today()))
+ ref_number = soDict.get('ref_number', None)
+ # txn_date = str(date.today())
+
root = ET.Element("QBXML")
root.tail = "\n"
root.text = "\n "
@@ -196,11 +213,12 @@ class SalesOrderQuery:
FullName = self.create_sub_element(ET, CustomerRef, "FullName", self.SalesOrderList[0]['CustomerFullName'], 8 )
TemplateRef = self.create_sub_element(ET, InvoiceAdd, "TemplateRef", "\n ", 8 )
TemplateFullName = self.create_sub_element(ET, TemplateRef, "FullName", "DBW Invoice (11%)", 8 )
- today = str(date.today())
- TxnDate = self.create_sub_element(ET, InvoiceAdd, "TxnDate", today,8) # self.DN['TxnDate'], 8 )
-
- RefNumber = self.create_sub_element(ET, InvoiceAdd, "RefNumber", today,8 ) # self.DN['DNRefNum'], 8 )
- ShipDate = self.create_sub_element(ET, InvoiceAdd, "ShipDate", today,8) # self.DN['TxnDate'], 8 )
+ # today = str(date.today())
+ # print(txn_date)
+ TxnDate = self.create_sub_element(ET, InvoiceAdd, "TxnDate", txn_date, 8) # self.DN['TxnDate'], 8 )
+ if ref_number:
+ RefNumber = self.create_sub_element(ET, InvoiceAdd, "RefNumber", ref_number, 8 ) # self.DN['DNRefNum'], 8 )
+ # ShipDate = self.create_sub_element(ET, InvoiceAdd, "ShipDate", txn_date,8) # self.DN['TxnDate'], 8 )
# Memo = self.create_sub_element(ET, InvoiceAdd, "Memo", self.DN['Memo'], 10 )
disc_amount = 0
for soidx, salesorder in enumerate(self.SalesOrderList):
diff --git a/django/Invoice/templates/Invoice/so_details_form.html b/django/Invoice/templates/Invoice/so_details_form.html
index 3f7955b..56fe7e2 100644
--- a/django/Invoice/templates/Invoice/so_details_form.html
+++ b/django/Invoice/templates/Invoice/so_details_form.html
@@ -7,6 +7,14 @@
diff --git a/django/Invoice/views.py b/django/Invoice/views.py
index 363f2a0..24dc58c 100644
--- a/django/Invoice/views.py
+++ b/django/Invoice/views.py
@@ -1,6 +1,6 @@
from django.shortcuts import render, get_object_or_404, redirect
from django.urls import reverse
-from django.http import HttpResponse, JsonResponse
+from django.http import HttpResponse, JsonResponse, HttpResponseRedirect
from django.forms import modelformset_factory, inlineformset_factory
from django.db import transaction
from django.core import serializers
@@ -15,11 +15,12 @@ import os
import pandas as pd
from django.conf import settings
from icecream import ic
+import timeit
from decimal import Decimal
ic.configureOutput(includeContext= True)
-def get_SalesOrderQuery(customer_name):
+def get_SalesOrderQuery(customer_name, txnid=None):
try:
print("try")
from SO_to_Inv.readSO import SalesOrderQuery
@@ -39,13 +40,40 @@ def get_SalesOrderQuery(customer_name):
basedir = settings.BASE_DIR
parentdir = os.path.dirname(basedir)
- ini=SalesOrderQuery(FullName= customer_name, IncludeRetElement = ['TxnID', 'TimeCreated', 'TimeModified','TxnNumber', 'CustomerRef', 'TxnDate', 'RefNumber', 'IsManuallyClosed', 'IsFullyInvoiced','TotalAmount'], cwd=parentdir)
+ if txnid:
+ ini=SalesOrderQuery(FullName= customer_name, TxnID=txnid, IncludeRetElement = ['TxnID', 'TimeCreated', 'TimeModified','TxnNumber', 'CustomerRef', 'TxnDate', 'RefNumber', 'IsManuallyClosed', 'IsFullyInvoiced','TotalAmount'], cwd=parentdir)
+ pass
+ else:
+ ini=SalesOrderQuery(FullName= customer_name, IncludeRetElement = ['TxnID', 'TimeCreated', 'TimeModified','TxnNumber', 'CustomerRef', 'TxnDate', 'RefNumber', 'IsManuallyClosed', 'IsFullyInvoiced','TotalAmount'], cwd=parentdir)
return ini
- return None
+
+def get_TransactionQuery(txnid=None, refnumber=None, customername=None, txntypefilter=None, includeret=[ 'TxnID', 'EntityRef', 'TxnDate', 'RefNumber', 'Memo'] ):
+ try:
+ print("try")
+ from qbtransactionquery import TransactionQuery
+
+ except:
+ import sys
+ sys.path.append('.')
+ sys.path.append('..')
+ print("except")
+ print(sys.path)
+ from qbtransactionquery import TransactionQuery
+ print("transactionquery imported")
+
+ basedir = settings.BASE_DIR
+ parentdir = os.path.dirname(basedir)
+ if txnid:
+ ini=TransactionQuery(FullName= customername, RefNumber = refnumber, TxnID=txnid, IncludeRetElement = includeret, cwd=parentdir)
+ else:
+ ini=TransactionQuery(FullName= customername, RefNumber = refnumber, IncludeRetElement =includeret, cwd=parentdir)
+ return ini
+
def show_customer(request):
pass
-
+ print("show_customer")
+ starttime = timeit.default_timer()
# thispath = os.getcwd()
# print(thispath)
basedir = settings.BASE_DIR
@@ -61,17 +89,21 @@ def show_customer(request):
print(f'customer_name: {customer_name}')
# context['objects'] = [['abc', 'def', 'ghi', 'jkl']]
context['objects'] = []
-
+ print("The time difference is bef show customer :", timeit.default_timer() - starttime)
+
if customer_name:
ini = get_SalesOrderQuery(customer_name)
+ print("The time difference is mid show customer :", timeit.default_timer() - starttime)
if ini:
- print("after ini")
+ print("after ini show customer")
qbxml = ini.create_QBXML()
- print(qbxml)
+ # print(qbxml)
+ print("The time difference is :", timeit.default_timer() - starttime)
+ print("timeeint")
response_string = ini.connect_to_quickbooks(qbxml)
- print(response_string)
+ # print(response_string)
open_sales_orders = ini.get_open_so()
- print(f'open sales orders:{open_sales_orders}')
+ print(f'open sales orders showcustomer:{open_sales_orders}')
ini=None
if not open_sales_orders:
messages.info(request, f"There is No open SO for {customer_name}")
@@ -81,8 +113,10 @@ def show_customer(request):
context['customer_fullname'] = customer_name
+ print("The time difference is :", timeit.default_timer() - starttime)
return render(request, "Invoice/so_list_form.html", context)
- # print(df.values.tolist())
+ # print(df.values.tolist())
+ print("The time difference is :", timeit.default_timer() - starttime)
return render(request, "Invoice/show-customers.html", context)
@@ -91,6 +125,8 @@ def select_so(request):
def choose_inv(request):
print("choose_inv")
+ starttime = timeit.default_timer()
+
context={}
if request.method == "POST":
print(request.POST)
@@ -119,23 +155,32 @@ def choose_inv(request):
customer_fullname = request.POST.get('customer_fullname')
print(f'Customer_fullname:{customer_fullname} -> request values:{open_sales_orders_TxnID}')
### get the SO detail
- ini=get_SalesOrderQuery(customer_fullname)
+ ini=get_SalesOrderQuery(customer_fullname, open_sales_orders_TxnID)
+ # ini=get_SalesOrderQuery(customer_fullname)
+ print("")
+ print("The time difference chooseinv is :", timeit.default_timer() - starttime)
print(f'ini::{ini}')
+ print("The time difference chooseinv is :", timeit.default_timer() - starttime)
print("before ITU")
itu = ini.get_open_sales_order(open_sales_orders_TxnID)
# print(itu)
+ print("The time difference after itu is :", timeit.default_timer() - starttime)
print(f'get_open_sales_order:{itu}')
if itu:
context['objects'] = itu
context['customer_fullname'] = customer_fullname
- print("Invoiceaddqbxml:")
- invoiceaddQBXML=ini.create_invoiceadd_QBXML()
+ # print("Invoiceaddqbxml:")
+ # invoiceaddQBXML=ini.create_invoiceadd_QBXML()
- print(invoiceaddQBXML)
- result=None
+ # print(invoiceaddQBXML)
+ # print("")
+ # result=None
+ # print("")
# result = ini.connect_to_quickbooks(ini.create_invoiceadd_QBXML())
- print("RESULT:")
- print(result)
+ # print("RESULT:")
+ # print(result)
+ print("The time difference finish choose inv is :", timeit.default_timer() - starttime)
+
return render(request, "Invoice/so_details_form.html", context)
elif 'customer_fullname' in request.POST:
customer_name = request.POST.get('customer_fullname')
@@ -154,7 +199,8 @@ def choose_inv(request):
context['customer_fullname'] = customer_name
-
+ print("The time difference is :", timeit.default_timer() - starttime)
+
return render( request, "Invoice/so_list_form.html", context)
# return HttpResponse('')
@@ -167,9 +213,16 @@ def unique(list1):
unique_list = (list(list_set))
return unique_list
+def check_duplicate_refnumber(refnumber):
+ ini = get_TransactionQuery(refnumber=refnumber, includeret=['TxnID', 'RefNumber'])
+ status, statuscode = ini.status_ok(ini.connect_to_quickbooks(ini.create_QBXML()))
+ print(f'check duplicate refnumber:{status}; {statuscode}')
+ return status ### status=True -> duplicate refnumber
+
def save_inv(request):
print("save_inv")
+ starttime = timeit.default_timer()
context={}
if request.method == "POST":
# print(request.POST)
@@ -179,6 +232,20 @@ def save_inv(request):
### get others items into list of dict ###
others=[]
otherFullName = {'peti': 'PETI', 'expedition':'Sales_Ekspedisi'}
+ ref_number = request.POST.get('ref_number', None)
+ txn_date = request.POST.get('date', None)
+ print(ref_number, txn_date)
+ if len(ref_number)>20:
+ return HttpResponse("RefNumber Invalid. ")
+ elif ref_number.strip()=="":
+ ref_number = None
+ if check_duplicate_refnumber(ref_number):
+ return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/'))
+ return HttpResponse('RefNumber already Exist. please choose other RefNumber')
+ if len(txn_date)<6:
+ return HttpResponse("Date is Invalid")
+ del data['ref_number']
+ del data['date']
if 'selected_items' in data:
for _ in data['selected_items']:
if _ in data['other_items']:
@@ -318,18 +385,20 @@ def save_inv(request):
print('last data to save == dict')
for _ in others:
data_to_save.append(_)
- print(f'Final List:{data_to_save}')
+
+ dict_to_save = {'customer_fullname': customer_fullname, 'ref_number':ref_number, 'txn_date':txn_date, 'data':data_to_save }
+ print(f'Final List:{dict_to_save}')
print("")
# print(itu)
context['objects'] = itu
context['customer_fullname'] = customer_fullname
# print(context['objects'])
print("Invoiceaddqbxml:")
- invoiceaddQBXML=ini.create_invoiceadd_QBXML(data_to_save)
+ invoiceaddQBXML=ini.create_invoiceadd_QBXML(dict_to_save)
print(invoiceaddQBXML)
result=None
- # result = ini.connect_to_quickbooks(ini.create_invoiceadd_QBXML())
+ result = ini.connect_to_quickbooks(invoiceaddQBXML)
print("RESULT:")
print(result)
if result and ini.status_ok(result):
@@ -337,6 +406,8 @@ def save_inv(request):
# context['messages']=[{"alert":"info", "message": "invoice Is Good"}]
messages.success(request, f"Invoice No: Has Been SAVED with link SO No. : {unique(df['RefNumber'].to_list())}")
# messages.info(request, 'Invoice Has Been SAVED2')
+ print("The time difference finish Save Inv is :", timeit.default_timer() - starttime)
+
return redirect('Invoice:show_customer')
return render(request, "Invoice/show-customers.html", context)
return render(request, "Invoice/so_details_form.html", context)
diff --git a/qbtransactionquery.py b/qbtransactionquery.py
index 5ac0cce..66dbcd0 100644
--- a/qbtransactionquery.py
+++ b/qbtransactionquery.py
@@ -6,13 +6,18 @@ import datetime
import pandas as pd
import xml.dom.minidom
from lxml import etree
-
+from tools import pprintXml
+import timeit
class TransactionQuery:
def __init__(self, **kwargs) -> None:
# print(f'kwargs:{kwargs}')
# print(args)
# self.TransactionTypeFilter = kwargs['TransactionTypeFilter'] if 'TransactionTypeFilter' in kwargs else 'SalesOrder'
- self.TxnTypeFilter = kwargs['TxnTypeFilter'] if 'TxnTypeFilter' in kwargs else 'SalesOrder'
+ self.EntityTypeFilter = kwargs['EntityTypeFilter'] if 'EntityTypeFilter' in kwargs else None
+ self.RefNumber = kwargs['RefNumber'] if 'RefNumber' in kwargs else None
+
+ self.FullName = kwargs['FullName'] if 'FullName' in kwargs else None
+ self.TxnTypeFilter = kwargs['TxnTypeFilter'] if 'TxnTypeFilter' in kwargs else None
# self.TransactionPaidStatusFilter = kwargs['TransactionPaidStatusFilter'] if 'TransactionPaidStatusFilter' in kwargs else 'Open'
self.TransactionPaidStatusFilter = kwargs['TransactionPaidStatusFilter'] if 'TransactionPaidStatusFilter' in kwargs else 'Open'
self.TransactionDetailLevelFilter = kwargs['TransactionDetailLevelFilter'] if 'TransactionDetailLevelFilter' in kwargs else None
@@ -26,7 +31,7 @@ class TransactionQuery:
self.FromTxnDate = self.validate_date(kwargs['FromTxnDate']) if 'FromTxnDate' in kwargs else None
self.ToTxnDate = self.validate_date(kwargs['ToTxnDate']) if 'ToTxnDate' in kwargs else None
self.ReportEntityFilter = kwargs['ReportEntityFilter'] if 'ReportEntityFilter' in kwargs else None
- self.FullName = kwargs['FullName'] if 'FullName' in kwargs else None
+
# print(self.DateMacro, self.ReportPeriod, self.FromTxnDate, self.ToTxnDate)
def create_sub_element(self, ET, parentNode, thisNode, text="\n", whiteSpace = 0, attrib =None):
@@ -53,6 +58,13 @@ class TransactionQuery:
QBXMLMsgsRq.text = "\n "
# TransactionQueryRq = self.create_sub_element(ET, QBXMLMsgsRq, "TransactionQueryRq","\n", attrib={"metaData":"MetaDataAndResponseData", "iteratorID":"UUIDTYPE" })
TransactionQueryRq = self.create_sub_element(ET, QBXMLMsgsRq, "TransactionQueryRq","\n")
+ if self.RefNumber:
+ if isinstance(self.RefNumber, list):
+ for _ in self.RefNumber:
+ RefNumber = self.create_sub_element(ET, TransactionQueryRq, "RefNumber", _)
+ else:
+ RefNumber = self.create_sub_element(ET, TransactionQueryRq, "RefNumber", self.RefNumber)
+
if self.DateMacro:
TransactionDateRangeFilter = self.create_sub_element(ET, TransactionQueryRq, "TransactionDateRangeFilter","\n")
# ReportPeriod = self.create_sub_element(ET, TransactionQueryRq, "TransactionDateRangeFilter", "\n ",)
@@ -65,7 +77,12 @@ class TransactionQuery:
if type(self.ToTxnDate) is datetime.date:
ToTxnDate = self.create_sub_element(ET, TransactionDateRangeFilter, "ToTxnDate", self.ToTxnDate.strftime('%Y-%m-%d'))
-
+ if self.EntityTypeFilter or self.FullName:
+ TransactionEntityFilter = self.create_sub_element(ET, TransactionQueryRq, "TransactionEntityFilter","\n")
+ if self.EntityTypeFilter:
+ EntityTypeFilter = self.create_sub_element(ET, TransactionEntityFilter, "EntityTypeFilter", self.EntityTypeFilter, )
+ if self.FullName:
+ FullName = self.create_sub_element(ET, TransactionEntityFilter, "FullName", self.FullName,)
# TransactionQueryRq = self.create_sub_element(ET, QBXMLMsgsRq, "TransactionQueryRq","\n " )
if self.TxnTypeFilter:
TransactionTypeFilter = self.create_sub_element(ET, TransactionQueryRq, 'TransactionTypeFilter', "\n")
@@ -78,13 +95,13 @@ class TransactionQuery:
IncludeRetElement = self.create_sub_element(ET, TransactionQueryRq, 'IncludeRetElement', ire)
mydata = ET.tostring(root, encoding="unicode")
# mydata = ET.tostring(root, encoding = "unicode")
- print(mydata)
+ # print(mydata)
qbxml_query = """\n"""
qbxml_query = qbxml_query + """"""
qbxml_query = qbxml_query + "\n" + mydata
# def to_string():
# qbxml_query=str(qbxml_query)
- return qbxml_query
+ return pprintXml(qbxml_query)
def connect_to_quickbooks(self, qbxml_query):
# Connect to Quickbooks
@@ -95,7 +112,8 @@ class TransactionQuery:
# print(enumfodnc.qbFileOpenDoNotCare)
sessionManager = win32com.client.Dispatch("QBXMLRP2.RequestProcessor")
sessionManager.OpenConnection('', 'DASA2')
- ticket = sessionManager.BeginSession("z:\\DBW Bogor.qbw", 2)
+ # ticket = sessionManager.BeginSession("z:\\DBW Bogor.qbw", 2)
+ ticket = sessionManager.BeginSession("", 2)
# Send query and receive response
response_string = sessionManager.ProcessRequest(ticket, qbxml_query)
@@ -103,8 +121,9 @@ class TransactionQuery:
# Disconnect from Quickbooks
sessionManager.EndSession(ticket) # Close the company file
sessionManager.CloseConnection() # Close the connection
- # print (response_string)
- return response_string
+ # print(f"response: {response_string}")
+ # print (pprintXml(response_string))
+ return pprintXml(response_string)
def __str__(self, *args) -> str:
# return str(self._get_datarow(self.connect_to_quickbooks(self.create_QBXML())))
@@ -123,7 +142,12 @@ class TransactionQuery:
return self._get_total(self.connect_to_quickbooks(self.create_QBXML()))
def status_ok(self, QBXML):
- GSRQRs=QBXML.find('.//TransactionQueryRs')
+ print(QBXML)
+ tree = ET.fromstring(QBXML)
+
+ GSRQRs=tree.find('.//TransactionQueryRs')
+ print(f"GSRQRs:{GSRQRs}")
+
status_code = GSRQRs.attrib #.get('statusCode')
# print(GSRQRs.attrib)
# print(GSRQRs.attrib['statusCode'])
@@ -252,14 +276,26 @@ class TransactionQuery:
# raise ValueError("Incorrect data format, should be YYYY-MM-DD")
print('### Transaction ###')
if __name__ == '__main__':
+ starttime = timeit.default_timer()
+
# ini=TransactionQuery(DateMacro='ThisMonth')
# ini=TransactionQuery()
# temp = xml.dom.minidom.parseString(ini.create_QBXML())
# print(temp.toprettyxml())
+ print("hello")
# ini=TransactionQuery(FromTxnDate='2023-01-11', ToTxnDate='2023-01-12', TransactionPaidStatusFilter='Closed', TransactionDetailLevelFilter='All')
- ini=TransactionQuery(FromTxnDate='2023-01-11', ToTxnDate='2023-01-12', TransactionPaidStatusFilter='Closed', TransactionDetailLevelFilter=None,
- IncludeRetElement=['EntityRef', 'TxnDate', 'Amount', 'Memo'])
+ # ini=TransactionQuery(FromTxnDate='2023-01-11', ToTxnDate='2023-01-12', TransactionPaidStatusFilter='Closed', TransactionDetailLevelFilter=None,
+ # IncludeRetElement=['EntityRef', 'TxnDate', 'Amount', 'Memo'])
+ ini=TransactionQuery( TransactionPaidStatusFilter='Open', TransactionDetailLevelFilter=None,
+ # FullName='Abadi Serpong',
+ # EntityTypeFilter='Customer',
+ # RefNumber = ['24010005', '24010001', '24010002'],
+ RefNumber = ['24010002'],
+ TxnTypeFilter = None,
+ # IncludeRetElement=['EntityRef', 'TxnDate', 'Amount', 'Memo', 'RefNumber', 'TxnID', 'TimeCreated', 'TimeModified'])
+
+ IncludeRetElement=[ 'TxnID', 'EntityRef', 'TxnDate', 'RefNumber', 'Memo'])
# ini=TransactionQuery(TransactionTypeFilter='SalesByItemSummary')
# ini=TransactionQuery(TransactionTypeFilter='SalesByRepSummary')
# ini=TransactionQuery(TransactionTypeFilter='PurchaseByVendorSummary')
@@ -268,7 +304,8 @@ if __name__ == '__main__':
# ini=TransactionQuery(TransactionTypeFilter='InventoryStockStatusByItem')
print(type(ini.create_QBXML()))
print(ini.create_QBXML())
- print(f'print ini:{ini}')
+ print(f"ini result connect:{ini.connect_to_quickbooks(ini.create_QBXML())}")
+ # print(f'print ini:{ini}')
# print(type(ini.get_datarow()))
# print(ini.get_total())
# print(f'ini.getdatarow:{ini.get_datarow()}')
@@ -283,4 +320,6 @@ if __name__ == '__main__':
# print(df.loc[df['TotalSales']>0])
# print(df.tail(10))
# print(headers)
- # print(list(df.keys().values))
\ No newline at end of file
+ # print(list(df.keys().values))
+
+ print("The time difference is :", timeit.default_timer() - starttime)
\ No newline at end of file
diff --git a/tools.py b/tools.py
index 7e921ea..1ee54d8 100644
--- a/tools.py
+++ b/tools.py
@@ -7,5 +7,18 @@ def get_alpha_numeric(text:str):
result += x
return result
+
+def pprintXml(qbxml_query):
+ import xml.dom.minidom
+ from xml.sax.saxutils import escape
+ from lxml import etree
+ # dom = xml.dom.minidom.parse(xml_fname) # or
+ if isinstance(qbxml_query, str):
+ dom = xml.dom.minidom.parseString(qbxml_query)
+ pretty_xml_as_string = dom.toprettyxml(" ").split('\n')
+ pretty_xml_as_string = '\n'.join([s for s in pretty_xml_as_string if s.strip() ])
+ # print(f'pprintxml:\n{pretty_xml_as_string}')
+ return pretty_xml_as_string
+
if __name__ == "__main__":
print(get_alpha_numeric('TH-201/88. aa, BH'))
\ No newline at end of file