mirror of
https://github.com/bcomsugi/dasaproject.git
synced 2026-01-09 15:42:37 +07:00
20240102
This commit is contained in:
parent
abc64aa7a0
commit
104b1021b7
@ -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):
|
||||
|
||||
@ -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">
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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)
|
||||
13
tools.py
13
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'))
|
||||
Loading…
Reference in New Issue
Block a user