This commit is contained in:
bcomsugi 2024-01-02 03:06:00 +07:00
parent abc64aa7a0
commit 104b1021b7
5 changed files with 210 additions and 61 deletions

View File

@ -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):

View File

@ -7,6 +7,14 @@
<div class="modal-header">
<!-- <h1>Choose Items</h1> -->
<h2>{{ customer_fullname }}</h2>
<div>
<h3> <label class="form-check-label">Ref Number</label> <input type="text" name="ref_number" value="">
</h3>
</div>
<div>
<h3> <label class="form-check-label">Date</label> <input type="date" name="date" required>
</h3>
</div>
</div>
<div class="modal-body">
<div class="mb-3 mt-3">

View File

@ -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)

View File

@ -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 = """<?xml version="1.0" encoding="utf-8"?>\n"""
qbxml_query = qbxml_query + """<?qbxml version="13.0"?>"""
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))
# print(list(df.keys().values))
print("The time difference is :", timeit.default_timer() - starttime)

View File

@ -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'))