pretty print and readso can accept RefNumber

This commit is contained in:
bcomsugi 2023-11-15 23:58:41 +07:00
parent f954a83862
commit 051a5c1184
4 changed files with 63 additions and 32 deletions

View File

@ -8,7 +8,8 @@ from datetime import date
import timeit import timeit
import os import os
import pythoncom import pythoncom
# from icecream import ic from icecream import ic
# ic.configureOutput(includeContext=True, ) # ic.configureOutput(includeContext=True, )
class SalesOrderQuery: class SalesOrderQuery:
@ -30,9 +31,10 @@ class SalesOrderQuery:
self._df_customer = pd.read_excel(os.path.join(self.cwd, self.item_inventory_path, self.CustomerPriceLevelName_filename), usecols=['FullName', 'PriceLevelName', 'SPName'],) self._df_customer = pd.read_excel(os.path.join(self.cwd, self.item_inventory_path, self.CustomerPriceLevelName_filename), usecols=['FullName', 'PriceLevelName', 'SPName'],)
self._df_customer = self._df_customer.fillna('') self._df_customer = self._df_customer.fillna('')
print(self._df_customer) print(self._df_customer)
self.Customer = None
self.Customer = self._df_customer.loc[(self._df_customer["FullName"]==self.FullName)].values.tolist()[0] if self.FullName:
print(f'Customer:{self.Customer}') self.Customer = self._df_customer.loc[(self._df_customer["FullName"]==self.FullName)].values.tolist()[0]
print(f'Customer:{self.Customer}')
self.DN = kwargs['DN'] if 'DN' in kwargs else {} self.DN = kwargs['DN'] if 'DN' in kwargs else {}
self.Reuse = kwargs['Reuse'] if 'Reuse' in kwargs else None self.Reuse = kwargs['Reuse'] if 'Reuse' in kwargs else None
@ -54,9 +56,23 @@ class SalesOrderQuery:
# print(self.Reuse) # print(self.Reuse)
# if not self.Reuse: # if not self.Reuse:
# self.dfDN, self.ext_doc_no_list = self.get_ext_doc_no_list(self.DN) # self.dfDN, self.ext_doc_no_list = self.get_ext_doc_no_list(self.DN)
# self.RefNumber = kwargs['RefNumber'] if 'RefNumber' in kwargs else self.ext_doc_no_list self.RefNumber = kwargs['RefNumber'] if 'RefNumber' in kwargs else None
# self.get_sales_order_header() # self.get_sales_order_header()
def pprintXml(self, 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
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):
if type(attrib) is not dict: if type(attrib) is not dict:
attrib = {} attrib = {}
@ -81,10 +97,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.FullName: 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 ") EntityFilter = self.create_sub_element(ET, SalesOrderQueryRq, 'EntityFilter', "\n ")
FullName = self.create_sub_element(ET, EntityFilter, "FullName", self.FullName, 6) FullName = self.create_sub_element(ET, EntityFilter, "FullName", self.FullName, 6)
if self.DateMacro: elif self.DateMacro:
TxnDateRangeFilter = self.create_sub_element(ET, SalesOrderQueryRq, "TxnDateRangeFilter", "\n ",) 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, TxnDateRangeFilter, "DateMacro", self.DateMacro)
# SalesOrderType = self.create_sub_element(ET, SalesOrderQueryRq, "DateMacro", self.DateMacro) # SalesOrderType = self.create_sub_element(ET, SalesOrderQueryRq, "DateMacro", self.DateMacro)
@ -220,14 +241,7 @@ class SalesOrderQuery:
# print(f"replyfrom qbxml:{self.connect_to_quickbooks(qbxml_query)}") # print(f"replyfrom qbxml:{self.connect_to_quickbooks(qbxml_query)}")
# print([s for s in qbxml_query.split('\n') if s.strip(' ') != '']) # print([s for s in qbxml_query.split('\n') if s.strip(' ') != ''])
import xml.dom.minidom print(self.pprintXml(qbxml_query))
# dom = xml.dom.minidom.parse(xml_fname) # or
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(' ') != ""])
pretty_xml_as_string = '\n'.join([s for s in pretty_xml_as_string if s.strip() ])
print(pretty_xml_as_string)
return qbxml_query return qbxml_query
@ -282,12 +296,18 @@ class SalesOrderQuery:
def _get_sales_order_header(self, response_string): def _get_sales_order_header(self, response_string):
print('_get_sales_order_header') print('_get_sales_order_header')
ic(f'responsestring:{response_string}') print(f'responsestring:{self.pprintXml(response_string)}')
QBXML = ET.fromstring(response_string) QBXML = ET.fromstring(response_string)
datadict = {} datadict = {}
SalesOrderdict = {} SalesOrderdict = {}
_SalesOrderlist = [] _SalesOrderlist = []
SalesOrderRets = QBXML.findall('.//SalesOrderRet') SalesOrderRets = QBXML.findall('.//SalesOrderRet')
if self.Customer == None:
custtemp = QBXML.find('.//SalesOrderRet/CustomerRef/FullName')
if custtemp != None:
self.Customer = custtemp.text
self.Customer = self._df_customer.loc[(self._df_customer["FullName"]==self.Customer)].values.tolist()[0]
print(f'Customer:{self.Customer}')
# print(SalesOrderRets) # print(SalesOrderRets)
for SalesOrderRet in SalesOrderRets: for SalesOrderRet in SalesOrderRets:
RefNumber = SalesOrderRet.find('RefNumber').text RefNumber = SalesOrderRet.find('RefNumber').text
@ -332,16 +352,18 @@ class SalesOrderQuery:
# print(TxnLineID, ItemFullName) # print(TxnLineID, ItemFullName)
BackOrdered = float(Quantity) - float(Invoiced) BackOrdered = float(Quantity) - float(Invoiced)
if BackOrdered > 0 and LineIsManuallyClosed.lower() == 'false' : if BackOrdered > 0 and LineIsManuallyClosed.lower() == 'false' :
if self.Customer[2]: ic(self.Customer)
discPerPcs = Rate-self._df_price_level.loc[(self._df_price_level['FullName']==ItemFullName) & (self._df_price_level['PriceLevelName']==self.Customer[2])].values.tolist()[0][2] if self.Customer:
# ic(Rate, disc, (Rate - self._df_price_level.loc[(self._df_price_level['FullName']==ItemFullName) & (self._df_price_level['PriceLevelName']==self.SPPriceLevelName)].values.tolist()[0][2])) if self.Customer[2]:
if discPerPcs > 0: discPerPcs = Rate-self._df_price_level.loc[(self._df_price_level['FullName']==ItemFullName) & (self._df_price_level['PriceLevelName']==self.Customer[2])].values.tolist()[0][2]
ic(Quantity, BackOrdered, Rate, (Rate - self._df_price_level.loc[(self._df_price_level['FullName']==ItemFullName) & (self._df_price_level['PriceLevelName']==self.Customer[2])].values.tolist()[0][2])) # ic(Rate, disc, (Rate - self._df_price_level.loc[(self._df_price_level['FullName']==ItemFullName) & (self._df_price_level['PriceLevelName']==self.SPPriceLevelName)].values.tolist()[0][2]))
discPerItem = BackOrdered * discPerPcs if discPerPcs > 0:
disc_amount += discPerItem ic(Quantity, BackOrdered, Rate, (Rate - self._df_price_level.loc[(self._df_price_level['FullName']==ItemFullName) & (self._df_price_level['PriceLevelName']==self.Customer[2])].values.tolist()[0][2]))
# disc_amount += BackOrdered * discPerPcs # (Rate-self._df_price_level.loc[(self._df_price_level['FullName']==ItemFullName) & (self._df_price_level['PriceLevelName']==self.Customer[2])].values.tolist()[0][2]) discPerItem = BackOrdered * discPerPcs
else: disc_amount += discPerItem
discPerPcs = 0 # disc_amount += BackOrdered * discPerPcs # (Rate-self._df_price_level.loc[(self._df_price_level['FullName']==ItemFullName) & (self._df_price_level['PriceLevelName']==self.Customer[2])].values.tolist()[0][2])
else:
discPerPcs = 0
SalesOrderLinedict = {'TxnLineID':TxnLineID, SalesOrderLinedict = {'TxnLineID':TxnLineID,
'ItemFullName':ItemFullName, 'ItemFullName':ItemFullName,
'Quantity':Quantity, 'Quantity':Quantity,
@ -566,7 +588,9 @@ if __name__ == '__main__':
# ini=SalesOrderQuery(FullName= '999 HPL', IncludeRetElement = ['TxnID', 'TimeCreated', 'TimeModified','TxnNumber', 'CustomerRef', 'IsManuallyClosed', 'IsFullyInvoiced']) # ini=SalesOrderQuery(FullName= '999 HPL', IncludeRetElement = ['TxnID', 'TimeCreated', 'TimeModified','TxnNumber', 'CustomerRef', 'IsManuallyClosed', 'IsFullyInvoiced'])
# ini=SalesOrderQuery(FullName= 'YSM Interior', IncludeRetElement = ['TxnID', 'TimeCreated', 'TimeModified','TxnNumber', 'CustomerRef', 'TxnDate', 'RefNumber', 'IsManuallyClosed', 'IsFullyInvoiced','TotalAmount']) # ini=SalesOrderQuery(FullName= 'YSM Interior', IncludeRetElement = ['TxnID', 'TimeCreated', 'TimeModified','TxnNumber', 'CustomerRef', 'TxnDate', 'RefNumber', 'IsManuallyClosed', 'IsFullyInvoiced','TotalAmount'])
ini=SalesOrderQuery(FullName= 'Abadi Serpong', IncludeRetElement = ['TxnID', 'TimeCreated', 'TimeModified','TxnNumber', 'CustomerRef', 'TxnDate', 'RefNumber', 'IsManuallyClosed', 'IsFullyInvoiced','TotalAmount']) # ini=SalesOrderQuery(FullName= 'Abadi Serpong', IncludeRetElement = ['TxnID', 'TimeCreated', 'TimeModified','TxnNumber', 'CustomerRef', 'TxnDate', 'RefNumber', 'IsManuallyClosed', 'IsFullyInvoiced','TotalAmount'])
# ini=SalesOrderQuery(RefNumber = 'B23070685', FullName= 'Abadi Serpong', IncludeRetElement = ['TxnID', 'TimeCreated', 'TimeModified','TxnNumber', 'CustomerRef', 'TxnDate', 'RefNumber', 'IsManuallyClosed', 'IsFullyInvoiced','TotalAmount'])
ini=SalesOrderQuery(RefNumber = 'B23070685', IncludeRetElement = ['TxnID', 'TimeCreated', 'TimeModified','TxnNumber', 'CustomerRef', 'TxnDate', 'RefNumber', 'IsManuallyClosed', 'IsFullyInvoiced','TotalAmount'])
# iya = ini.create_customerquery_QBXML() #pakai excel saja lebih cepat # iya = ini.create_customerquery_QBXML() #pakai excel saja lebih cepat
# print(iya) # print(iya)
print(f'createQBXML:{ini.create_QBXML()}') print(f'createQBXML:{ini.create_QBXML()}')

View File

@ -1,7 +1,11 @@
from fastapi.responses import HTMLResponse from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates from fastapi.templating import Jinja2Templates
from fastapi import FastAPI, Request, UploadFile, Body from fastapi import FastAPI, Request, UploadFile, Body
# from icecream import install
# import icecream
# install()
# from icecream import ic
# ic.configureOutput(includeContext=True, )
import json import json
from iteminventorydasa import QBStock from iteminventorydasa import QBStock
import datetime import datetime
@ -13,7 +17,7 @@ import pdfexcel4DNwithxlrd
from ItemInventoryQuery import ItemInventoryQuery from ItemInventoryQuery import ItemInventoryQuery
from SO_to_Inv import readSO from SO_to_Inv import readSO
import os import os
from icecream import ic
import pprint import pprint
# app = FastAPI() # app = FastAPI()
@ -134,6 +138,7 @@ async def getopenso(request: Request, CustomerName: str = Body(...)):
FullName = CustomerName['CustomerName'] FullName = CustomerName['CustomerName']
print(FullName) print(FullName)
ini=readSO.SalesOrderQuery(FullName= FullName, IncludeRetElement = ['TxnID', 'TimeCreated', 'TimeModified','TxnNumber', 'CustomerRef', 'TxnDate', 'RefNumber', 'IsManuallyClosed', 'IsFullyInvoiced','TotalAmount']) ini=readSO.SalesOrderQuery(FullName= FullName, IncludeRetElement = ['TxnID', 'TimeCreated', 'TimeModified','TxnNumber', 'CustomerRef', 'TxnDate', 'RefNumber', 'IsManuallyClosed', 'IsFullyInvoiced','TotalAmount'])
print("selesai salesorder")
open_sales_orders = ini.get_open_so() open_sales_orders = ini.get_open_so()
print(f'return opensalesorder:{open_sales_orders}') print(f'return opensalesorder:{open_sales_orders}')
return open_sales_orders return open_sales_orders

View File

@ -58,7 +58,7 @@ class SalesOrderQuery:
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
print(qbxml_query)
return qbxml_query return qbxml_query
def connect_to_quickbooks(self, qbxml_query): def connect_to_quickbooks(self, qbxml_query):
@ -83,7 +83,7 @@ class SalesOrderQuery:
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())))
# print("__str__") print("__str__")
return str(self.get_datarow()) return str(self.get_datarow())
# return "hello" # return "hello"

2
test.py Normal file
View File

@ -0,0 +1,2 @@
import icecream
print("berhasil")