From d6ef2c9c29680ebb22acf169da484cfc0f3a2e10 Mon Sep 17 00:00:00 2001 From: Enrique Barcelli Date: Wed, 28 Jan 2026 00:27:03 +0800 Subject: [PATCH] Implement mandatory fields until page 14. Table 2, item 7, from the guidelines --- config-sample.py | 4 +++ extract_invoice.py | 73 +++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 73 insertions(+), 4 deletions(-) diff --git a/config-sample.py b/config-sample.py index ec5a6af..5e9ba2d 100644 --- a/config-sample.py +++ b/config-sample.py @@ -30,3 +30,7 @@ ProfileID = 'urn:peppol:pint:billing-1@sg-1' InvoiceTypeCode = '380' PeppolID = 'SGUEN200212345Z' CountryID = 'SG' +SupplierAddress = '1 Cameron Road #42-01, Singapore' +SupplierPostalCode = '001321' +GSTRegNo = 'GSTREGNUMBER' +SupplierUEN = 'UENNUMBER' diff --git a/extract_invoice.py b/extract_invoice.py index 5fcf46e..a66a558 100644 --- a/extract_invoice.py +++ b/extract_invoice.py @@ -25,7 +25,7 @@ def extract_invoice(document): #print (invoice['response']['data'][0]['businessPartner']) uuid = invoice['response']['data'][0]['id'] uuid = uuid[:8]+'-'+uuid[8:12]+'-'+uuid[12:16]+'-'+uuid[16:20]+'-'+uuid[20:32] - print(uuid) + #print(uuid) lastCalculatedOnDate = invoice['response']['data'][0]['lastCalculatedOnDate'] daysTillDue = invoice['response']['data'][0]['daysTillDue'] dueDate = date(int(lastCalculatedOnDate[0:4]), int(lastCalculatedOnDate[5:7]), int(lastCalculatedOnDate[8:10])) + timedelta(days=daysTillDue) @@ -44,12 +44,15 @@ def extract_invoice(document): lines_json = json.dumps(lines) #print(lines_json) lines = json.loads(lines_json) + #print(lines) lines_output = '[' first_line = True for key in lines: #print (key) linetemp_json = json.dumps(key) + #print(linetemp_json) linetemp = json.loads(linetemp_json) + #print(linetemp) if linetemp['product'] != None: if not first_line: lines_output = lines_output+',' @@ -62,13 +65,14 @@ def extract_invoice(document): else: lines_output = lines_output + '{"service_name": "'+product+'","service_description": "'+linetemp['description']+'","service_quantity": '+str(linetemp['invoicedQuantity'])+',"service_price": '+str(linetemp['unitPrice'])+',"service_vat": '+gst_rate+'}' lines_output = lines_output+']' - print(lines_output) + #print(lines_output) ubloutput = xml_header+'\n'+'\n' ubloutput = ubloutput+indentation+CustomizationID+'\n' ubloutput = ubloutput+indentation+ProfileID+'\n' ubloutput = ubloutput+indentation+InvoiceTypeCode+'\n' ubloutput = ubloutput+indentation+''+invoice['response']['data'][0]['documentNo']+''+'\n' + ubloutput = ubloutput+indentation+''+uuid+''+'\n' ubloutput = ubloutput+indentation+''+invoice['response']['data'][0]['invoiceDate']+''+'\n' ubloutput = ubloutput+indentation+''+invoice['response']['data'][0]['currency$_identifier']+''+'\n' ubloutput = ubloutput+indentation+''+'\n' @@ -78,13 +82,22 @@ def extract_invoice(document): ubloutput = ubloutput+indentation+indentation+indentation+indentation+'5790000436071'+'\n' ubloutput = ubloutput+indentation+indentation+indentation+''+'\n' ubloutput = ubloutput+indentation+indentation+indentation+''+'\n' + ubloutput = ubloutput+indentation+indentation+indentation+indentation+''+SupplierAddress+''+'\n' + ubloutput = ubloutput+indentation+indentation+indentation+indentation+''+SupplierPostalCode+''+'\n' ubloutput = ubloutput+indentation+indentation+indentation+indentation+''+'\n' ubloutput = ubloutput+indentation+indentation+indentation+indentation+indentation+''+CountryID+''+'\n' ubloutput = ubloutput+indentation+indentation+indentation+indentation+''+'\n' ubloutput = ubloutput+indentation+indentation+indentation+''+'\n' ubloutput = ubloutput+indentation+indentation+indentation+''+'\n' ubloutput = ubloutput+indentation+indentation+indentation+indentation+''+invoice['response']['data'][0]['client$_identifier']+''+'\n' + ubloutput = ubloutput+indentation+indentation+indentation+indentation+''+SupplierUEN+''+'\n' ubloutput = ubloutput+indentation+indentation+indentation+''+'\n' + ubloutput = ubloutput+indentation+indentation+indentation+''+'\n' + ubloutput = ubloutput+indentation+indentation+indentation+indentation+''+GSTRegNo+''+'\n' + ubloutput = ubloutput+indentation+indentation+indentation+indentation+''+'\n' + ubloutput = ubloutput+indentation+indentation+indentation+indentation+indentation+'GST'+'\n' + ubloutput = ubloutput+indentation+indentation+indentation+indentation+''+'\n' + ubloutput = ubloutput+indentation+indentation+indentation+''+'\n' ubloutput = ubloutput+indentation+indentation+''+'\n' ubloutput = ubloutput+indentation+''+'\n' ubloutput = ubloutput+indentation+''+'\n' @@ -94,6 +107,7 @@ def extract_invoice(document): ubloutput = ubloutput+indentation+indentation+indentation+indentation+'5790000436071'+'\n' ubloutput = ubloutput+indentation+indentation+indentation+''+'\n' ubloutput = ubloutput+indentation+indentation+indentation+''+'\n' + ubloutput = ubloutput+indentation+indentation+indentation+indentation+''+invoice['response']['data'][0]['partnerAddress$_identifier']+''+'\n' ubloutput = ubloutput+indentation+indentation+indentation+indentation+''+'\n' ubloutput = ubloutput+indentation+indentation+indentation+indentation+indentation+''+CountryID+''+'\n' ubloutput = ubloutput+indentation+indentation+indentation+indentation+''+'\n' @@ -117,11 +131,61 @@ def extract_invoice(document): ubloutput = ubloutput+indentation+indentation+indentation+''+'\n' ubloutput = ubloutput+indentation+indentation+''+'\n' ubloutput = ubloutput+indentation+''+'\n' + ubloutput = ubloutput+indentation+''+'\n' + ubloutput = ubloutput+indentation+indentation+''+f"{summedLineAmount:.2f}"+''+f"{summedLineAmount:.2f}"+''+f"{invoice['response']['data'][0]['grandTotalAmount']:.2f}"+''+f"{invoice['response']['data'][0]['grandTotalAmount']:.2f}"+''+'\n' + ubloutput = ubloutput+indentation+''+'\n' + url = ob_api_url+"InvoiceLine?_where=invoice='"+invoice['response']['data'][0]['id']+"'&_noActiveFilter=false&_sortBy=lineNo" - - + response = requests.request("GET", url, headers=headers, data=payload) #extracts invoice lines + #print(response.text) + lines = json.loads(response.text)['response']['data'] + lines_json = json.dumps(lines) + #print(lines_json) + lines = json.loads(lines_json) + #print(lines) + lines_output = '[' + first_line = True + for key in lines: + #print (key) + linetemp_json = json.dumps(key) + #print(linetemp_json) + linetemp = json.loads(linetemp_json) + print(linetemp) + if linetemp['product'] != None: + if not first_line: + lines_output = lines_output+',' + first_line = False + url = ob_api_url+"Product?_where=id='"+linetemp['product']+"'&_noActiveFilter=false" + response = requests.request("GET", url, headers=headers, data=payload) #extracts product from master + product = json.loads(response.text)['response']['data'][0]['searchKey'] + if product != comment_product: + lines_output = lines_output + '{"service_name": "'+product+'","service_description": "'+linetemp['product$_identifier']+'","service_quantity": '+str(linetemp['invoicedQuantity'])+',"service_price": '+str(linetemp['unitPrice'])+',"service_vat": '+gst_rate+'}' + ubloutput = ubloutput+indentation+indentation+''+str(linetemp['lineNo'])+''+'\n' + ubloutput = ubloutput+indentation+indentation+''+'\n' + ubloutput = ubloutput+indentation+indentation+indentation+''+linetemp['product$_identifier']+''+'\n' + ubloutput = ubloutput+indentation+indentation+indentation+''+'\n' + ubloutput = ubloutput+indentation+indentation+indentation+indentation+'SR'+'\n' + ubloutput = ubloutput+indentation+indentation+indentation+indentation+''+'\n' + ubloutput = ubloutput+indentation+indentation+indentation+indentation+indentation+'GST'+'\n' + ubloutput = ubloutput+indentation+indentation+indentation+indentation+''+'\n' + ubloutput = ubloutput+indentation+indentation+indentation+''+'\n' + ubloutput = ubloutput+indentation+indentation+''+'\n' + ubloutput = ubloutput+indentation+indentation+''+str(linetemp['invoicedQuantity'])+''+'\n' + ubloutput = ubloutput+indentation+indentation+''+'\n' + ubloutput = ubloutput+indentation+indentation+indentation+''+str(linetemp['unitPrice'])+''+'\n' + ubloutput = ubloutput+indentation+indentation+''+'\n' + ubloutput = ubloutput+indentation+indentation+''+str(linetemp['lineNetAmount'])+''+'\n' + else: + lines_output = lines_output + '{"service_name": "'+product+'","service_description": "'+linetemp['description']+'","service_quantity": '+str(linetemp['invoicedQuantity'])+',"service_price": '+str(linetemp['unitPrice'])+',"service_vat": '+gst_rate+'}' + lines_output = lines_output+']' + + ubloutput = ubloutput+indentation+''+'\n' print(ubloutput) @@ -130,6 +194,7 @@ def extract_invoice(document): + payload = json.dumps({ "sales_invoice_number": invoice['response']['data'][0]['documentNo'], "sales_invoice_date": invoice['response']['data'][0]['invoiceDate']+"T00:00:00Z",