diff --git a/config-sample.py b/config-sample.py index 67eed04..986218e 100644 --- a/config-sample.py +++ b/config-sample.py @@ -17,3 +17,15 @@ userpass_b64 = base64.b64encode((ob_user+':'+ob_pass).encode('ascii')).decode('a # the line below to match the 'Search Key' of that specific product: # comment_product = 'search-key-of-your-comment-product' comment_product = 'Comment/Note' +gst_rate = "9" + +indentation = " " + +xml_header = '' + +xmlns_header = 'xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2" xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2" xmlns:ccts="urn:un:unece:uncefact:documentation:2" xmlns:ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2" xmlns:qdt="urn:oasis:names:specification:ubl:schema:xsd:QualifiedDatatypes-2" xmlns:udt="urn:un:unece:uncefact:data:specification:UnqualifiedDataTypesSchemaModule:2" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' + +CustomizationID = 'urn:peppol:pint:billing-1@sg-1' +ProfileID = 'urn:peppol:pint:billing-1@sg-1' +InvoiceTypeCode = '380' +PeppolID = 'SGUEN200212345Z' diff --git a/extract_invoice.py b/extract_invoice.py new file mode 100644 index 0000000..2e63b85 --- /dev/null +++ b/extract_invoice.py @@ -0,0 +1,104 @@ +import requests +from requests_oauthlib import OAuth2Session +import json +import sys +import webbrowser +from config import * +#from cachehandler import CacheHandler +#from authhandler import AuthHandler +#from api import OpenbravoToBanqupAPI +from datetime import timedelta, date + +def extract_invoice(document): + + url = ob_api_url+"Invoice?_where=documentNo='"+document+"'&_noActiveFilter=false" + + payload = {} + headers = { + 'Authorization': 'Basic '+userpass_b64 + } + + response = requests.request("GET", url, headers=headers, data=payload) #extracts invoice header + + print(response.text) + invoice = json.loads(response.text) + #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) + 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) + + + businessPartner=invoice['response']['data'][0]['businessPartner'] + + + 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) + lines_output = '[' + first_line = True + for key in lines: + #print (key) + linetemp_json = json.dumps(key) + linetemp = json.loads(linetemp_json) + 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+'}' + 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) + + 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+''+invoice['response']['data'][0]['invoiceDate']+''+'\n' + ubloutput = ubloutput+indentation+''+invoice['response']['data'][0]['currency$_identifier']+''+'\n' + ubloutput = ubloutput+indentation+''+'\n' + ubloutput = ubloutput+indentation+indentation+''+'\n' + ubloutput = ubloutput+indentation+indentation+indentation+''+PeppolID+''+'\n' + + + ubloutput = ubloutput+indentation+indentation+''+'\n' + ubloutput = ubloutput+indentation+''+'\n' + + print(ubloutput) + + + + + + + payload = json.dumps({ + "sales_invoice_number": invoice['response']['data'][0]['documentNo'], + "sales_invoice_date": invoice['response']['data'][0]['invoiceDate']+"T00:00:00Z", + "sales_invoice_due_date": str(dueDate)+"T00:00:00Z", + "currency_code": invoice['response']['data'][0]['currency$_identifier'], + "invoice_lines": json.loads(lines_output, strict=False), + "po_number": "NA", + "buyer_reference": "NA", + "customer_reference": "NA", + "supplier_reference": "NA", + "contract_number": "NA" + }) + print(payload) + + + +if __name__ == '__main__': + extract_invoice(str(sys.argv[1]))