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.PriceLevelName = None
self.SPPriceLevelName = None self.SPPriceLevelName = None
self.cwd = kwargs['cwd'] if 'cwd' in kwargs else os.getcwd() 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.item_inventory_path = "ItemInventory"
self.price_level_filename = "PriceLevel.xlsx" 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'],) 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,6 +101,15 @@ class SalesOrderQuery:
QBXMLMsgsRq.text = "\n " QBXMLMsgsRq.text = "\n "
SalesOrderQueryRq = self.create_sub_element(ET, QBXMLMsgsRq, "SalesOrderQueryRq","\n " ) SalesOrderQueryRq = self.create_sub_element(ET, QBXMLMsgsRq, "SalesOrderQueryRq","\n " )
# SalesOrderType = self.create_sub_element(ET, SalesOrderQueryRq, 'SalesOrderType', self.SalesOrderType) # SalesOrderType = self.create_sub_element(ET, SalesOrderQueryRq, 'SalesOrderType', self.SalesOrderType)
if self.TxnID:
pass
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: if self.RefNumber:
pass pass
RefNumberFilter = self.create_sub_element(ET, SalesOrderQueryRq, 'RefNumberFilter', "\n ",) RefNumberFilter = self.create_sub_element(ET, SalesOrderQueryRq, 'RefNumberFilter', "\n ",)
@ -178,11 +189,17 @@ class SalesOrderQuery:
return self.get_customer_pricelevel(response_string) return self.get_customer_pricelevel(response_string)
return response_string return response_string
def create_invoiceadd_QBXML(self, soList=None): def create_invoiceadd_QBXML(self, soDict=None):
print('create_ionvoiceadd_QBXML') print('create_ionvoiceadd_QBXML')
if soList: txn_date = str(date.today())
self.SalesOrderList = soList 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 = ET.Element("QBXML")
root.tail = "\n" root.tail = "\n"
root.text = "\n " root.text = "\n "
@ -196,11 +213,12 @@ class SalesOrderQuery:
FullName = self.create_sub_element(ET, CustomerRef, "FullName", self.SalesOrderList[0]['CustomerFullName'], 8 ) FullName = self.create_sub_element(ET, CustomerRef, "FullName", self.SalesOrderList[0]['CustomerFullName'], 8 )
TemplateRef = self.create_sub_element(ET, InvoiceAdd, "TemplateRef", "\n ", 8 ) TemplateRef = self.create_sub_element(ET, InvoiceAdd, "TemplateRef", "\n ", 8 )
TemplateFullName = self.create_sub_element(ET, TemplateRef, "FullName", "DBW Invoice (11%)", 8 ) TemplateFullName = self.create_sub_element(ET, TemplateRef, "FullName", "DBW Invoice (11%)", 8 )
today = str(date.today()) # today = str(date.today())
TxnDate = self.create_sub_element(ET, InvoiceAdd, "TxnDate", today,8) # self.DN['TxnDate'], 8 ) # print(txn_date)
TxnDate = self.create_sub_element(ET, InvoiceAdd, "TxnDate", txn_date, 8) # self.DN['TxnDate'], 8 )
RefNumber = self.create_sub_element(ET, InvoiceAdd, "RefNumber", today,8 ) # self.DN['DNRefNum'], 8 ) if ref_number:
ShipDate = self.create_sub_element(ET, InvoiceAdd, "ShipDate", today,8) # self.DN['TxnDate'], 8 ) 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 ) # Memo = self.create_sub_element(ET, InvoiceAdd, "Memo", self.DN['Memo'], 10 )
disc_amount = 0 disc_amount = 0
for soidx, salesorder in enumerate(self.SalesOrderList): for soidx, salesorder in enumerate(self.SalesOrderList):

View File

@ -7,6 +7,14 @@
<div class="modal-header"> <div class="modal-header">
<!-- <h1>Choose Items</h1> --> <!-- <h1>Choose Items</h1> -->
<h2>{{ customer_fullname }}</h2> <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>
<div class="modal-body"> <div class="modal-body">
<div class="mb-3 mt-3"> <div class="mb-3 mt-3">

View File

@ -1,6 +1,6 @@
from django.shortcuts import render, get_object_or_404, redirect from django.shortcuts import render, get_object_or_404, redirect
from django.urls import reverse 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.forms import modelformset_factory, inlineformset_factory
from django.db import transaction from django.db import transaction
from django.core import serializers from django.core import serializers
@ -15,11 +15,12 @@ import os
import pandas as pd import pandas as pd
from django.conf import settings from django.conf import settings
from icecream import ic from icecream import ic
import timeit
from decimal import Decimal from decimal import Decimal
ic.configureOutput(includeContext= True) ic.configureOutput(includeContext= True)
def get_SalesOrderQuery(customer_name): def get_SalesOrderQuery(customer_name, txnid=None):
try: try:
print("try") print("try")
from SO_to_Inv.readSO import SalesOrderQuery from SO_to_Inv.readSO import SalesOrderQuery
@ -39,13 +40,40 @@ def get_SalesOrderQuery(customer_name):
basedir = settings.BASE_DIR basedir = settings.BASE_DIR
parentdir = os.path.dirname(basedir) parentdir = os.path.dirname(basedir)
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) ini=SalesOrderQuery(FullName= customer_name, IncludeRetElement = ['TxnID', 'TimeCreated', 'TimeModified','TxnNumber', 'CustomerRef', 'TxnDate', 'RefNumber', 'IsManuallyClosed', 'IsFullyInvoiced','TotalAmount'], cwd=parentdir)
return ini 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): def show_customer(request):
pass pass
print("show_customer")
starttime = timeit.default_timer()
# thispath = os.getcwd() # thispath = os.getcwd()
# print(thispath) # print(thispath)
basedir = settings.BASE_DIR basedir = settings.BASE_DIR
@ -61,17 +89,21 @@ def show_customer(request):
print(f'customer_name: {customer_name}') print(f'customer_name: {customer_name}')
# context['objects'] = [['abc', 'def', 'ghi', 'jkl']] # context['objects'] = [['abc', 'def', 'ghi', 'jkl']]
context['objects'] = [] context['objects'] = []
print("The time difference is bef show customer :", timeit.default_timer() - starttime)
if customer_name: if customer_name:
ini = get_SalesOrderQuery(customer_name) ini = get_SalesOrderQuery(customer_name)
print("The time difference is mid show customer :", timeit.default_timer() - starttime)
if ini: if ini:
print("after ini") print("after ini show customer")
qbxml = ini.create_QBXML() 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) response_string = ini.connect_to_quickbooks(qbxml)
print(response_string) # print(response_string)
open_sales_orders = ini.get_open_so() 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 ini=None
if not open_sales_orders: if not open_sales_orders:
messages.info(request, f"There is No open SO for {customer_name}") 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 context['customer_fullname'] = customer_name
print("The time difference is :", timeit.default_timer() - starttime)
return render(request, "Invoice/so_list_form.html", context) 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) return render(request, "Invoice/show-customers.html", context)
@ -91,6 +125,8 @@ def select_so(request):
def choose_inv(request): def choose_inv(request):
print("choose_inv") print("choose_inv")
starttime = timeit.default_timer()
context={} context={}
if request.method == "POST": if request.method == "POST":
print(request.POST) print(request.POST)
@ -119,23 +155,32 @@ def choose_inv(request):
customer_fullname = request.POST.get('customer_fullname') customer_fullname = request.POST.get('customer_fullname')
print(f'Customer_fullname:{customer_fullname} -> request values:{open_sales_orders_TxnID}') print(f'Customer_fullname:{customer_fullname} -> request values:{open_sales_orders_TxnID}')
### get the SO detail ### 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(f'ini::{ini}')
print("The time difference chooseinv is :", timeit.default_timer() - starttime)
print("before ITU") print("before ITU")
itu = ini.get_open_sales_order(open_sales_orders_TxnID) itu = ini.get_open_sales_order(open_sales_orders_TxnID)
# print(itu) # print(itu)
print("The time difference after itu is :", timeit.default_timer() - starttime)
print(f'get_open_sales_order:{itu}') print(f'get_open_sales_order:{itu}')
if itu: if itu:
context['objects'] = itu context['objects'] = itu
context['customer_fullname'] = customer_fullname context['customer_fullname'] = customer_fullname
print("Invoiceaddqbxml:") # print("Invoiceaddqbxml:")
invoiceaddQBXML=ini.create_invoiceadd_QBXML() # invoiceaddQBXML=ini.create_invoiceadd_QBXML()
print(invoiceaddQBXML) # print(invoiceaddQBXML)
result=None # print("")
# result=None
# print("")
# result = ini.connect_to_quickbooks(ini.create_invoiceadd_QBXML()) # 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) return render(request, "Invoice/so_details_form.html", context)
elif 'customer_fullname' in request.POST: elif 'customer_fullname' in request.POST:
customer_name = request.POST.get('customer_fullname') customer_name = request.POST.get('customer_fullname')
@ -154,6 +199,7 @@ def choose_inv(request):
context['customer_fullname'] = customer_name context['customer_fullname'] = customer_name
print("The time difference is :", timeit.default_timer() - starttime)
return render( request, "Invoice/so_list_form.html", context) return render( request, "Invoice/so_list_form.html", context)
# return HttpResponse('') # return HttpResponse('')
@ -167,9 +213,16 @@ def unique(list1):
unique_list = (list(list_set)) unique_list = (list(list_set))
return unique_list 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): def save_inv(request):
print("save_inv") print("save_inv")
starttime = timeit.default_timer()
context={} context={}
if request.method == "POST": if request.method == "POST":
# print(request.POST) # print(request.POST)
@ -179,6 +232,20 @@ def save_inv(request):
### get others items into list of dict ### ### get others items into list of dict ###
others=[] others=[]
otherFullName = {'peti': 'PETI', 'expedition':'Sales_Ekspedisi'} 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: if 'selected_items' in data:
for _ in data['selected_items']: for _ in data['selected_items']:
if _ in data['other_items']: if _ in data['other_items']:
@ -318,18 +385,20 @@ def save_inv(request):
print('last data to save == dict') print('last data to save == dict')
for _ in others: for _ in others:
data_to_save.append(_) 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("")
# print(itu) # print(itu)
context['objects'] = itu context['objects'] = itu
context['customer_fullname'] = customer_fullname context['customer_fullname'] = customer_fullname
# print(context['objects']) # print(context['objects'])
print("Invoiceaddqbxml:") print("Invoiceaddqbxml:")
invoiceaddQBXML=ini.create_invoiceadd_QBXML(data_to_save) invoiceaddQBXML=ini.create_invoiceadd_QBXML(dict_to_save)
print(invoiceaddQBXML) print(invoiceaddQBXML)
result=None result=None
# result = ini.connect_to_quickbooks(ini.create_invoiceadd_QBXML()) result = ini.connect_to_quickbooks(invoiceaddQBXML)
print("RESULT:") print("RESULT:")
print(result) print(result)
if result and ini.status_ok(result): if result and ini.status_ok(result):
@ -337,6 +406,8 @@ def save_inv(request):
# context['messages']=[{"alert":"info", "message": "invoice Is Good"}] # 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.success(request, f"Invoice No: Has Been SAVED with link SO No. : {unique(df['RefNumber'].to_list())}")
# messages.info(request, 'Invoice Has Been SAVED2') # 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 redirect('Invoice:show_customer')
return render(request, "Invoice/show-customers.html", context) return render(request, "Invoice/show-customers.html", context)
return render(request, "Invoice/so_details_form.html", context) return render(request, "Invoice/so_details_form.html", context)

View File

@ -6,13 +6,18 @@ import datetime
import pandas as pd import pandas as pd
import xml.dom.minidom import xml.dom.minidom
from lxml import etree from lxml import etree
from tools import pprintXml
import timeit
class TransactionQuery: class TransactionQuery:
def __init__(self, **kwargs) -> None: def __init__(self, **kwargs) -> None:
# print(f'kwargs:{kwargs}') # print(f'kwargs:{kwargs}')
# print(args) # print(args)
# self.TransactionTypeFilter = kwargs['TransactionTypeFilter'] if 'TransactionTypeFilter' in kwargs else 'SalesOrder' # 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.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 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.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.ToTxnDate = self.validate_date(kwargs['ToTxnDate']) if 'ToTxnDate' in kwargs else None
self.ReportEntityFilter = kwargs['ReportEntityFilter'] if 'ReportEntityFilter' 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) # print(self.DateMacro, self.ReportPeriod, self.FromTxnDate, self.ToTxnDate)
def create_sub_element(self, ET, parentNode, thisNode, text="\n", whiteSpace = 0, attrib =None): def create_sub_element(self, ET, parentNode, thisNode, text="\n", whiteSpace = 0, attrib =None):
@ -53,6 +58,13 @@ class TransactionQuery:
QBXMLMsgsRq.text = "\n " 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", attrib={"metaData":"MetaDataAndResponseData", "iteratorID":"UUIDTYPE" })
TransactionQueryRq = self.create_sub_element(ET, QBXMLMsgsRq, "TransactionQueryRq","\n") 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: if self.DateMacro:
TransactionDateRangeFilter = self.create_sub_element(ET, TransactionQueryRq, "TransactionDateRangeFilter","\n") TransactionDateRangeFilter = self.create_sub_element(ET, TransactionQueryRq, "TransactionDateRangeFilter","\n")
# ReportPeriod = 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: if type(self.ToTxnDate) is datetime.date:
ToTxnDate = self.create_sub_element(ET, TransactionDateRangeFilter, "ToTxnDate", self.ToTxnDate.strftime('%Y-%m-%d')) 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 " ) # TransactionQueryRq = self.create_sub_element(ET, QBXMLMsgsRq, "TransactionQueryRq","\n " )
if self.TxnTypeFilter: if self.TxnTypeFilter:
TransactionTypeFilter = self.create_sub_element(ET, TransactionQueryRq, 'TransactionTypeFilter', "\n") TransactionTypeFilter = self.create_sub_element(ET, TransactionQueryRq, 'TransactionTypeFilter', "\n")
@ -78,13 +95,13 @@ class TransactionQuery:
IncludeRetElement = self.create_sub_element(ET, TransactionQueryRq, 'IncludeRetElement', ire) IncludeRetElement = self.create_sub_element(ET, TransactionQueryRq, 'IncludeRetElement', ire)
mydata = ET.tostring(root, encoding="unicode") mydata = ET.tostring(root, encoding="unicode")
# 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 = """<?xml version="1.0" encoding="utf-8"?>\n"""
qbxml_query = qbxml_query + """<?qbxml version="13.0"?>""" qbxml_query = qbxml_query + """<?qbxml version="13.0"?>"""
qbxml_query = qbxml_query + "\n" + mydata qbxml_query = qbxml_query + "\n" + mydata
# def to_string(): # def to_string():
# qbxml_query=str(qbxml_query) # qbxml_query=str(qbxml_query)
return qbxml_query return pprintXml(qbxml_query)
def connect_to_quickbooks(self, qbxml_query): def connect_to_quickbooks(self, qbxml_query):
# Connect to Quickbooks # Connect to Quickbooks
@ -95,7 +112,8 @@ class TransactionQuery:
# print(enumfodnc.qbFileOpenDoNotCare) # print(enumfodnc.qbFileOpenDoNotCare)
sessionManager = win32com.client.Dispatch("QBXMLRP2.RequestProcessor") sessionManager = win32com.client.Dispatch("QBXMLRP2.RequestProcessor")
sessionManager.OpenConnection('', 'DASA2') 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 # Send query and receive response
response_string = sessionManager.ProcessRequest(ticket, qbxml_query) response_string = sessionManager.ProcessRequest(ticket, qbxml_query)
@ -103,8 +121,9 @@ class TransactionQuery:
# Disconnect from Quickbooks # Disconnect from Quickbooks
sessionManager.EndSession(ticket) # Close the company file sessionManager.EndSession(ticket) # Close the company file
sessionManager.CloseConnection() # Close the connection sessionManager.CloseConnection() # Close the connection
# print (response_string) # print(f"response: {response_string}")
return response_string # print (pprintXml(response_string))
return pprintXml(response_string)
def __str__(self, *args) -> str: def __str__(self, *args) -> str:
# return str(self._get_datarow(self.connect_to_quickbooks(self.create_QBXML()))) # 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())) return self._get_total(self.connect_to_quickbooks(self.create_QBXML()))
def status_ok(self, 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') status_code = GSRQRs.attrib #.get('statusCode')
# print(GSRQRs.attrib) # print(GSRQRs.attrib)
# print(GSRQRs.attrib['statusCode']) # print(GSRQRs.attrib['statusCode'])
@ -252,14 +276,26 @@ class TransactionQuery:
# raise ValueError("Incorrect data format, should be YYYY-MM-DD") # raise ValueError("Incorrect data format, should be YYYY-MM-DD")
print('### Transaction ###') print('### Transaction ###')
if __name__ == '__main__': if __name__ == '__main__':
starttime = timeit.default_timer()
# ini=TransactionQuery(DateMacro='ThisMonth') # ini=TransactionQuery(DateMacro='ThisMonth')
# ini=TransactionQuery() # ini=TransactionQuery()
# temp = xml.dom.minidom.parseString(ini.create_QBXML()) # temp = xml.dom.minidom.parseString(ini.create_QBXML())
# print(temp.toprettyxml()) # 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='All')
ini=TransactionQuery(FromTxnDate='2023-01-11', ToTxnDate='2023-01-12', TransactionPaidStatusFilter='Closed', TransactionDetailLevelFilter=None, # ini=TransactionQuery(FromTxnDate='2023-01-11', ToTxnDate='2023-01-12', TransactionPaidStatusFilter='Closed', TransactionDetailLevelFilter=None,
IncludeRetElement=['EntityRef', 'TxnDate', 'Amount', 'Memo']) # 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='SalesByItemSummary')
# ini=TransactionQuery(TransactionTypeFilter='SalesByRepSummary') # ini=TransactionQuery(TransactionTypeFilter='SalesByRepSummary')
# ini=TransactionQuery(TransactionTypeFilter='PurchaseByVendorSummary') # ini=TransactionQuery(TransactionTypeFilter='PurchaseByVendorSummary')
@ -268,7 +304,8 @@ if __name__ == '__main__':
# ini=TransactionQuery(TransactionTypeFilter='InventoryStockStatusByItem') # ini=TransactionQuery(TransactionTypeFilter='InventoryStockStatusByItem')
print(type(ini.create_QBXML())) print(type(ini.create_QBXML()))
print(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(type(ini.get_datarow()))
# print(ini.get_total()) # print(ini.get_total())
# print(f'ini.getdatarow:{ini.get_datarow()}') # print(f'ini.getdatarow:{ini.get_datarow()}')
@ -284,3 +321,5 @@ if __name__ == '__main__':
# print(df.tail(10)) # print(df.tail(10))
# print(headers) # 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 result += x
return result 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__": if __name__ == "__main__":
print(get_alpha_numeric('TH-201/88. aa, BH')) print(get_alpha_numeric('TH-201/88. aa, BH'))