mirror of
https://github.com/bcomsugi/dasaproject.git
synced 2026-01-10 07:32:38 +07:00
20240102
This commit is contained in:
parent
abc64aa7a0
commit
104b1021b7
@ -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,25 +101,34 @@ 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.RefNumber:
|
if self.TxnID:
|
||||||
pass
|
pass
|
||||||
RefNumberFilter = self.create_sub_element(ET, SalesOrderQueryRq, 'RefNumberFilter', "\n ",)
|
print(self.TxnID)
|
||||||
MatchCriterion = self.create_sub_element(ET,RefNumberFilter, 'MatchCriterion', "Contains",)
|
if isinstance(self.TxnID, list):
|
||||||
RefNumber = self.create_sub_element(ET, RefNumberFilter, 'RefNumber', self.RefNumber, )
|
for _ in self.TxnID:
|
||||||
elif self.FullName:
|
TxnID = self.create_sub_element(ET, SalesOrderQueryRq, "TxnID", _, )
|
||||||
EntityFilter = self.create_sub_element(ET, SalesOrderQueryRq, 'EntityFilter', "\n ")
|
else:
|
||||||
FullName = self.create_sub_element(ET, EntityFilter, "FullName", self.FullName, 6)
|
TxnID = self.create_sub_element(ET, SalesOrderQueryRq, "TxnID", self.TxnID, )
|
||||||
elif self.DateMacro:
|
else:
|
||||||
TxnDateRangeFilter = self.create_sub_element(ET, SalesOrderQueryRq, "TxnDateRangeFilter", "\n ",)
|
if self.RefNumber:
|
||||||
SalesOrderType = self.create_sub_element(ET, TxnDateRangeFilter, "DateMacro", self.DateMacro)
|
pass
|
||||||
# SalesOrderType = self.create_sub_element(ET, SalesOrderQueryRq, "DateMacro", self.DateMacro)
|
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:
|
elif type(self.FromTxnDate) is datetime.date or type(self.ToTxnDate) is datetime.date:
|
||||||
TxnDateRangeFilter = self.create_sub_element(ET, SalesOrderQueryRq, "TxnDateRangeFilter", "\n ",)
|
TxnDateRangeFilter = self.create_sub_element(ET, SalesOrderQueryRq, "TxnDateRangeFilter", "\n ",)
|
||||||
if type(self.FromTxnDate) is datetime.date:
|
if type(self.FromTxnDate) is datetime.date:
|
||||||
FromTxnDate = self.create_sub_element(ET, TxnDateRangeFilter, "FromTxnDate", self.FromTxnDate.strftime('%Y-%m-%d'),4)
|
FromTxnDate = self.create_sub_element(ET, TxnDateRangeFilter, "FromTxnDate", self.FromTxnDate.strftime('%Y-%m-%d'),4)
|
||||||
if type(self.ToTxnDate) is datetime.date:
|
if type(self.ToTxnDate) is datetime.date:
|
||||||
ToTxnDate = self.create_sub_element(ET, TxnDateRangeFilter, "ToTxnDate", self.ToTxnDate.strftime('%Y-%m-%d'))
|
ToTxnDate = self.create_sub_element(ET, TxnDateRangeFilter, "ToTxnDate", self.ToTxnDate.strftime('%Y-%m-%d'))
|
||||||
if self.IncludeLineItems:
|
if self.IncludeLineItems:
|
||||||
IncludeLineItems = self.create_sub_element(ET, SalesOrderQueryRq, "IncludeLineItems", self.IncludeLineItems, 4)
|
IncludeLineItems = self.create_sub_element(ET, SalesOrderQueryRq, "IncludeLineItems", self.IncludeLineItems, 4)
|
||||||
if len(self.IncludeRetElement)>0:
|
if len(self.IncludeRetElement)>0:
|
||||||
@ -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):
|
||||||
|
|||||||
@ -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">
|
||||||
|
|||||||
@ -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)
|
||||||
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 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,7 +199,8 @@ 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)
|
||||||
|
|||||||
@ -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()}')
|
||||||
@ -283,4 +320,6 @@ if __name__ == '__main__':
|
|||||||
# print(df.loc[df['TotalSales']>0])
|
# print(df.loc[df['TotalSales']>0])
|
||||||
# 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)
|
||||||
13
tools.py
13
tools.py
@ -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'))
|
||||||
Loading…
Reference in New Issue
Block a user