diff --git a/SO_to_Inv/readSO.py b/SO_to_Inv/readSO.py index c76c9d3..b349ca5 100644 --- a/SO_to_Inv/readSO.py +++ b/SO_to_Inv/readSO.py @@ -8,7 +8,8 @@ from datetime import date import timeit import os import pythoncom -# from icecream import ic +from icecream import ic + # ic.configureOutput(includeContext=True, ) 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 = self._df_customer.fillna('') print(self._df_customer) - - self.Customer = self._df_customer.loc[(self._df_customer["FullName"]==self.FullName)].values.tolist()[0] - print(f'Customer:{self.Customer}') + self.Customer = None + if self.FullName: + 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.Reuse = kwargs['Reuse'] if 'Reuse' in kwargs else None @@ -54,9 +56,23 @@ class SalesOrderQuery: # print(self.Reuse) # if not self.Reuse: # 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() - + + + 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): if type(attrib) is not dict: attrib = {} @@ -81,10 +97,15 @@ 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.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 ") 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 ",) SalesOrderType = self.create_sub_element(ET, TxnDateRangeFilter, "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([s for s in qbxml_query.split('\n') if s.strip(' ') != '']) - import xml.dom.minidom - # 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) + print(self.pprintXml(qbxml_query)) return qbxml_query @@ -282,12 +296,18 @@ class SalesOrderQuery: def _get_sales_order_header(self, response_string): print('_get_sales_order_header') - ic(f'responsestring:{response_string}') + print(f'responsestring:{self.pprintXml(response_string)}') QBXML = ET.fromstring(response_string) datadict = {} SalesOrderdict = {} _SalesOrderlist = [] 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) for SalesOrderRet in SalesOrderRets: RefNumber = SalesOrderRet.find('RefNumber').text @@ -332,16 +352,18 @@ class SalesOrderQuery: # print(TxnLineID, ItemFullName) BackOrdered = float(Quantity) - float(Invoiced) if BackOrdered > 0 and LineIsManuallyClosed.lower() == 'false' : - if self.Customer[2]: - 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(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 discPerPcs > 0: - 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])) - discPerItem = BackOrdered * discPerPcs - disc_amount += discPerItem - # 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 + ic(self.Customer) + if self.Customer: + if self.Customer[2]: + 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(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 discPerPcs > 0: + 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])) + discPerItem = BackOrdered * discPerPcs + disc_amount += discPerItem + # 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, 'ItemFullName':ItemFullName, '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= '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 # print(iya) print(f'createQBXML:{ini.create_QBXML()}') diff --git a/main.py b/main.py index ad88de2..a2976d6 100644 --- a/main.py +++ b/main.py @@ -1,7 +1,11 @@ from fastapi.responses import HTMLResponse from fastapi.templating import Jinja2Templates from fastapi import FastAPI, Request, UploadFile, Body - +# from icecream import install +# import icecream +# install() +# from icecream import ic +# ic.configureOutput(includeContext=True, ) import json from iteminventorydasa import QBStock import datetime @@ -13,7 +17,7 @@ import pdfexcel4DNwithxlrd from ItemInventoryQuery import ItemInventoryQuery from SO_to_Inv import readSO import os -from icecream import ic + import pprint # app = FastAPI() @@ -134,6 +138,7 @@ async def getopenso(request: Request, CustomerName: str = Body(...)): FullName = CustomerName['CustomerName'] print(FullName) 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() print(f'return opensalesorder:{open_sales_orders}') return open_sales_orders diff --git a/qbsalesorderquery.py b/qbsalesorderquery.py index 0a174fc..1cc2c10 100644 --- a/qbsalesorderquery.py +++ b/qbsalesorderquery.py @@ -58,7 +58,7 @@ class SalesOrderQuery: qbxml_query = """\n""" qbxml_query = qbxml_query + """""" qbxml_query = qbxml_query + "\n" + mydata - + print(qbxml_query) return qbxml_query def connect_to_quickbooks(self, qbxml_query): @@ -83,7 +83,7 @@ class SalesOrderQuery: def __str__(self, *args) -> str: # return str(self._get_datarow(self.connect_to_quickbooks(self.create_QBXML()))) - # print("__str__") + print("__str__") return str(self.get_datarow()) # return "hello" diff --git a/test.py b/test.py new file mode 100644 index 0000000..4085149 --- /dev/null +++ b/test.py @@ -0,0 +1,2 @@ +import icecream +print("berhasil") \ No newline at end of file