openbravo-ubl/extract_invoice.py

151 lines
8.5 KiB
Python

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']
summedLineAmount=invoice['response']['data'][0]['summedLineAmount']
totalTaxAmount=invoice['response']['data'][0]['grandTotalAmount']-summedLineAmount
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'+'<Invoice '+xmlns_header+'>\n'
ubloutput = ubloutput+indentation+CustomizationID+'\n'
ubloutput = ubloutput+indentation+ProfileID+'\n'
ubloutput = ubloutput+indentation+InvoiceTypeCode+'\n'
ubloutput = ubloutput+indentation+'<cbc:ID>'+invoice['response']['data'][0]['documentNo']+'</cbc:ID>'+'\n'
ubloutput = ubloutput+indentation+'<cbc:IssueDate>'+invoice['response']['data'][0]['invoiceDate']+'</cbc:IssueDate>'+'\n'
ubloutput = ubloutput+indentation+'<cbc:DocumentCurrencyCode>'+invoice['response']['data'][0]['currency$_identifier']+'</cbc:DocumentCurrencyCode>'+'\n'
ubloutput = ubloutput+indentation+'<cac:AccountingSupplierParty>'+'\n'
ubloutput = ubloutput+indentation+indentation+'<cac:Party>'+'\n'
ubloutput = ubloutput+indentation+indentation+indentation+'<cbc:EndpointID schemeID="0195">'+PeppolID+'</cbc:EndpointID>'+'\n'
ubloutput = ubloutput+indentation+indentation+indentation+'<cac:PartyIdentification>'+'\n'
ubloutput = ubloutput+indentation+indentation+indentation+indentation+'<cbc:ID schemeID="0035">5790000436071</cbc:ID>'+'\n'
ubloutput = ubloutput+indentation+indentation+indentation+'</cac:PartyIdentification>'+'\n'
ubloutput = ubloutput+indentation+indentation+indentation+'<cac:PostalAddress>'+'\n'
ubloutput = ubloutput+indentation+indentation+indentation+indentation+'<cac:Country>'+'\n'
ubloutput = ubloutput+indentation+indentation+indentation+indentation+indentation+'<cbc:IdentificationCode>'+CountryID+'</cbc:IdentificationCode>'+'\n'
ubloutput = ubloutput+indentation+indentation+indentation+indentation+'</cac:Country>'+'\n'
ubloutput = ubloutput+indentation+indentation+indentation+'</cac:PostalAddress>'+'\n'
ubloutput = ubloutput+indentation+indentation+indentation+'<cac:PartyLegalEntity>'+'\n'
ubloutput = ubloutput+indentation+indentation+indentation+indentation+'<cbc:RegistrationName>'+invoice['response']['data'][0]['client$_identifier']+'</cbc:RegistrationName>'+'\n'
ubloutput = ubloutput+indentation+indentation+indentation+'</cac:PartyLegalEntity>'+'\n'
ubloutput = ubloutput+indentation+indentation+'</cac:Party>'+'\n'
ubloutput = ubloutput+indentation+'</cac:AccountingSupplierParty>'+'\n'
ubloutput = ubloutput+indentation+'<cac:AccountingCustomerParty>'+'\n'
ubloutput = ubloutput+indentation+indentation+'<cac:Party>'+'\n'
ubloutput = ubloutput+indentation+indentation+indentation+'<cbc:EndpointID schemeID="0195">'+'XXXXXXXXXXXXXXXXX'+'</cbc:EndpointID>'+'\n'
ubloutput = ubloutput+indentation+indentation+indentation+'<cac:PartyIdentification>'+'\n'
ubloutput = ubloutput+indentation+indentation+indentation+indentation+'<cbc:ID schemeID="0035">5790000436071</cbc:ID>'+'\n'
ubloutput = ubloutput+indentation+indentation+indentation+'</cac:PartyIdentification>'+'\n'
ubloutput = ubloutput+indentation+indentation+indentation+'<cac:PostalAddress>'+'\n'
ubloutput = ubloutput+indentation+indentation+indentation+indentation+'<cac:Country>'+'\n'
ubloutput = ubloutput+indentation+indentation+indentation+indentation+indentation+'<cbc:IdentificationCode>'+CountryID+'</cbc:IdentificationCode>'+'\n'
ubloutput = ubloutput+indentation+indentation+indentation+indentation+'</cac:Country>'+'\n'
ubloutput = ubloutput+indentation+indentation+indentation+'</cac:PostalAddress>'+'\n'
ubloutput = ubloutput+indentation+indentation+indentation+'<cac:PartyLegalEntity>'+'\n'
ubloutput = ubloutput+indentation+indentation+indentation+indentation+'<cbc:RegistrationName>'+invoice['response']['data'][0]['businessPartner$_identifier']+'</cbc:RegistrationName>'+'\n'
ubloutput = ubloutput+indentation+indentation+indentation+'</cac:PartyLegalEntity>'+'\n'
ubloutput = ubloutput+indentation+indentation+'</cac:Party>'+'\n'
ubloutput = ubloutput+indentation+'</cac:AccountingCustomerParty>'+'\n'
ubloutput = ubloutput+indentation+'<cac:TaxTotal>'+'\n'
ubloutput = ubloutput+indentation+indentation+'<cbc:TaxAmount currencyID="SGD">'+f"{totalTaxAmount:.2f}"+'</cbc:TaxAmount>'+'\n'
ubloutput = ubloutput+indentation+indentation+'<cac:TaxSubtotal>'+'\n'
ubloutput = ubloutput+indentation+indentation+indentation+'<cbc:TaxableAmount currencyID="SGD">'+f"{summedLineAmount:.2f}"+'</cbc:TaxableAmount>'+'\n'
ubloutput = ubloutput+indentation+indentation+indentation+'<cbc:TaxAmount currencyID="SGD">'+f"{totalTaxAmount:.2f}"+'</cbc:TaxAmount>'+'\n'
ubloutput = ubloutput+indentation+indentation+indentation+'<cac:TaxCategory>'+'\n'
ubloutput = ubloutput+indentation+indentation+indentation+indentation+'<cbc:ID>SR</cbc:ID>'+'\n'
ubloutput = ubloutput+indentation+indentation+indentation+indentation+'<cbc:Percent>'+gst_rate+'</cbc:Percent>'+'\n'
ubloutput = ubloutput+indentation+indentation+indentation+indentation+'<cac:TaxScheme>'+'\n'
ubloutput = ubloutput+indentation+indentation+indentation+indentation+indentation+'<cbc:ID>GST</cbc:ID>'+'\n'
ubloutput = ubloutput+indentation+indentation+indentation+indentation+'</cac:TaxScheme>'+'\n'
ubloutput = ubloutput+indentation+indentation+indentation+'</cac:TaxCategory>'+'\n'
ubloutput = ubloutput+indentation+indentation+'</cac:TaxSubtotal>'+'\n'
ubloutput = ubloutput+indentation+'</cac:TaxTotal>'+'\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]))