Implement mandatory fields until page 14. Table 2, item 7, from the guidelines
This commit is contained in:
parent
f88357a7a0
commit
d6ef2c9c29
|
|
@ -30,3 +30,7 @@ ProfileID = '<cbc:ProfileID>urn:peppol:pint:billing-1@sg-1</cbc:ProfileID>'
|
||||||
InvoiceTypeCode = '<cbc:InvoiceTypeCode>380</cbc:InvoiceTypeCode>'
|
InvoiceTypeCode = '<cbc:InvoiceTypeCode>380</cbc:InvoiceTypeCode>'
|
||||||
PeppolID = 'SGUEN200212345Z'
|
PeppolID = 'SGUEN200212345Z'
|
||||||
CountryID = 'SG'
|
CountryID = 'SG'
|
||||||
|
SupplierAddress = '1 Cameron Road #42-01, Singapore'
|
||||||
|
SupplierPostalCode = '001321'
|
||||||
|
GSTRegNo = 'GSTREGNUMBER'
|
||||||
|
SupplierUEN = 'UENNUMBER'
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,7 @@ def extract_invoice(document):
|
||||||
#print (invoice['response']['data'][0]['businessPartner'])
|
#print (invoice['response']['data'][0]['businessPartner'])
|
||||||
uuid = invoice['response']['data'][0]['id']
|
uuid = invoice['response']['data'][0]['id']
|
||||||
uuid = uuid[:8]+'-'+uuid[8:12]+'-'+uuid[12:16]+'-'+uuid[16:20]+'-'+uuid[20:32]
|
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']
|
lastCalculatedOnDate = invoice['response']['data'][0]['lastCalculatedOnDate']
|
||||||
daysTillDue = invoice['response']['data'][0]['daysTillDue']
|
daysTillDue = invoice['response']['data'][0]['daysTillDue']
|
||||||
dueDate = date(int(lastCalculatedOnDate[0:4]), int(lastCalculatedOnDate[5:7]), int(lastCalculatedOnDate[8:10])) + timedelta(days=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)
|
lines_json = json.dumps(lines)
|
||||||
#print(lines_json)
|
#print(lines_json)
|
||||||
lines = json.loads(lines_json)
|
lines = json.loads(lines_json)
|
||||||
|
#print(lines)
|
||||||
lines_output = '['
|
lines_output = '['
|
||||||
first_line = True
|
first_line = True
|
||||||
for key in lines:
|
for key in lines:
|
||||||
#print (key)
|
#print (key)
|
||||||
linetemp_json = json.dumps(key)
|
linetemp_json = json.dumps(key)
|
||||||
|
#print(linetemp_json)
|
||||||
linetemp = json.loads(linetemp_json)
|
linetemp = json.loads(linetemp_json)
|
||||||
|
#print(linetemp)
|
||||||
if linetemp['product'] != None:
|
if linetemp['product'] != None:
|
||||||
if not first_line:
|
if not first_line:
|
||||||
lines_output = lines_output+','
|
lines_output = lines_output+','
|
||||||
|
|
@ -62,13 +65,14 @@ def extract_invoice(document):
|
||||||
else:
|
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 + '{"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+']'
|
lines_output = lines_output+']'
|
||||||
print(lines_output)
|
#print(lines_output)
|
||||||
|
|
||||||
ubloutput = xml_header+'\n'+'<Invoice '+xmlns_header+'>\n'
|
ubloutput = xml_header+'\n'+'<Invoice '+xmlns_header+'>\n'
|
||||||
ubloutput = ubloutput+indentation+CustomizationID+'\n'
|
ubloutput = ubloutput+indentation+CustomizationID+'\n'
|
||||||
ubloutput = ubloutput+indentation+ProfileID+'\n'
|
ubloutput = ubloutput+indentation+ProfileID+'\n'
|
||||||
ubloutput = ubloutput+indentation+InvoiceTypeCode+'\n'
|
ubloutput = ubloutput+indentation+InvoiceTypeCode+'\n'
|
||||||
ubloutput = ubloutput+indentation+'<cbc:ID>'+invoice['response']['data'][0]['documentNo']+'</cbc:ID>'+'\n'
|
ubloutput = ubloutput+indentation+'<cbc:ID>'+invoice['response']['data'][0]['documentNo']+'</cbc:ID>'+'\n'
|
||||||
|
ubloutput = ubloutput+indentation+'<cbc:UUID>'+uuid+'</cbc:UUID>'+'\n'
|
||||||
ubloutput = ubloutput+indentation+'<cbc:IssueDate>'+invoice['response']['data'][0]['invoiceDate']+'</cbc:IssueDate>'+'\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+'<cbc:DocumentCurrencyCode>'+invoice['response']['data'][0]['currency$_identifier']+'</cbc:DocumentCurrencyCode>'+'\n'
|
||||||
ubloutput = ubloutput+indentation+'<cac:AccountingSupplierParty>'+'\n'
|
ubloutput = ubloutput+indentation+'<cac:AccountingSupplierParty>'+'\n'
|
||||||
|
|
@ -78,13 +82,22 @@ def extract_invoice(document):
|
||||||
ubloutput = ubloutput+indentation+indentation+indentation+indentation+'<cbc:ID schemeID="0035">5790000436071</cbc:ID>'+'\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:PartyIdentification>'+'\n'
|
||||||
ubloutput = ubloutput+indentation+indentation+indentation+'<cac:PostalAddress>'+'\n'
|
ubloutput = ubloutput+indentation+indentation+indentation+'<cac:PostalAddress>'+'\n'
|
||||||
|
ubloutput = ubloutput+indentation+indentation+indentation+indentation+'<cbc:StreetName>'+SupplierAddress+'</cbc:StreetName>'+'\n'
|
||||||
|
ubloutput = ubloutput+indentation+indentation+indentation+indentation+'<cbc:PostalZone>'+SupplierPostalCode+'</cbc:PostalZone>'+'\n'
|
||||||
ubloutput = ubloutput+indentation+indentation+indentation+indentation+'<cac:Country>'+'\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+indentation+'<cbc:IdentificationCode>'+CountryID+'</cbc:IdentificationCode>'+'\n'
|
||||||
ubloutput = ubloutput+indentation+indentation+indentation+indentation+'</cac:Country>'+'\n'
|
ubloutput = ubloutput+indentation+indentation+indentation+indentation+'</cac:Country>'+'\n'
|
||||||
ubloutput = ubloutput+indentation+indentation+indentation+'</cac:PostalAddress>'+'\n'
|
ubloutput = ubloutput+indentation+indentation+indentation+'</cac:PostalAddress>'+'\n'
|
||||||
ubloutput = ubloutput+indentation+indentation+indentation+'<cac:PartyLegalEntity>'+'\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+indentation+'<cbc:RegistrationName>'+invoice['response']['data'][0]['client$_identifier']+'</cbc:RegistrationName>'+'\n'
|
||||||
|
ubloutput = ubloutput+indentation+indentation+indentation+indentation+'<cbc:CompanyID>'+SupplierUEN+'</cbc:CompanyID>'+'\n'
|
||||||
ubloutput = ubloutput+indentation+indentation+indentation+'</cac:PartyLegalEntity>'+'\n'
|
ubloutput = ubloutput+indentation+indentation+indentation+'</cac:PartyLegalEntity>'+'\n'
|
||||||
|
ubloutput = ubloutput+indentation+indentation+indentation+'<cac:PartyTaxScheme>'+'\n'
|
||||||
|
ubloutput = ubloutput+indentation+indentation+indentation+indentation+'<cbc:CompanyID>'+GSTRegNo+'</cbc:CompanyID>'+'\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:PartyTaxScheme>'+'\n'
|
||||||
ubloutput = ubloutput+indentation+indentation+'</cac:Party>'+'\n'
|
ubloutput = ubloutput+indentation+indentation+'</cac:Party>'+'\n'
|
||||||
ubloutput = ubloutput+indentation+'</cac:AccountingSupplierParty>'+'\n'
|
ubloutput = ubloutput+indentation+'</cac:AccountingSupplierParty>'+'\n'
|
||||||
ubloutput = ubloutput+indentation+'<cac:AccountingCustomerParty>'+'\n'
|
ubloutput = ubloutput+indentation+'<cac:AccountingCustomerParty>'+'\n'
|
||||||
|
|
@ -94,6 +107,7 @@ def extract_invoice(document):
|
||||||
ubloutput = ubloutput+indentation+indentation+indentation+indentation+'<cbc:ID schemeID="0035">5790000436071</cbc:ID>'+'\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:PartyIdentification>'+'\n'
|
||||||
ubloutput = ubloutput+indentation+indentation+indentation+'<cac:PostalAddress>'+'\n'
|
ubloutput = ubloutput+indentation+indentation+indentation+'<cac:PostalAddress>'+'\n'
|
||||||
|
ubloutput = ubloutput+indentation+indentation+indentation+indentation+'<cbc:StreetName>'+invoice['response']['data'][0]['partnerAddress$_identifier']+'</cbc:StreetName>'+'\n'
|
||||||
ubloutput = ubloutput+indentation+indentation+indentation+indentation+'<cac:Country>'+'\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+indentation+'<cbc:IdentificationCode>'+CountryID+'</cbc:IdentificationCode>'+'\n'
|
||||||
ubloutput = ubloutput+indentation+indentation+indentation+indentation+'</cac:Country>'+'\n'
|
ubloutput = ubloutput+indentation+indentation+indentation+indentation+'</cac:Country>'+'\n'
|
||||||
|
|
@ -117,11 +131,61 @@ def extract_invoice(document):
|
||||||
ubloutput = ubloutput+indentation+indentation+indentation+'</cac:TaxCategory>'+'\n'
|
ubloutput = ubloutput+indentation+indentation+indentation+'</cac:TaxCategory>'+'\n'
|
||||||
ubloutput = ubloutput+indentation+indentation+'</cac:TaxSubtotal>'+'\n'
|
ubloutput = ubloutput+indentation+indentation+'</cac:TaxSubtotal>'+'\n'
|
||||||
ubloutput = ubloutput+indentation+'</cac:TaxTotal>'+'\n'
|
ubloutput = ubloutput+indentation+'</cac:TaxTotal>'+'\n'
|
||||||
|
ubloutput = ubloutput+indentation+'<cac:LegalMonetaryTotal>'+'\n'
|
||||||
|
ubloutput = ubloutput+indentation+indentation+'<cbc:LineExtensionAmount currencyID="SGD">'+f"{summedLineAmount:.2f}"+'</cbc:LineExtensionAmount'+'\n'
|
||||||
|
ubloutput = ubloutput+indentation+indentation+'<cbc:TaxExclusiveAmount currencyID="SGD">'+f"{summedLineAmount:.2f}"+'</cbc:TaxExclusiveAmount'+'\n'
|
||||||
|
ubloutput = ubloutput+indentation+indentation+'<cbc:TaxInclusiveAmount currencyID="SGD">'+f"{invoice['response']['data'][0]['grandTotalAmount']:.2f}"+'</cbc:TaxInclusiveAmount'+'\n'
|
||||||
|
ubloutput = ubloutput+indentation+indentation+'<cbc:PayableAmount currencyID="SGD">'+f"{invoice['response']['data'][0]['grandTotalAmount']:.2f}"+'</cbc:PayableAmount'+'\n'
|
||||||
|
ubloutput = ubloutput+indentation+'</cac:LegalMonetaryTotal>'+'\n'
|
||||||
|
ubloutput = ubloutput+indentation+'<cac:InvoiceLine>'+'\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+'<cbc:ID>'+str(linetemp['lineNo'])+'</cbc:ID>'+'\n'
|
||||||
|
ubloutput = ubloutput+indentation+indentation+'<cac:Item>'+'\n'
|
||||||
|
ubloutput = ubloutput+indentation+indentation+indentation+'<cbc:Name>'+linetemp['product$_identifier']+'</cbc:Name>'+'\n'
|
||||||
|
ubloutput = ubloutput+indentation+indentation+indentation+'<cac:ClassifiedTaxCategory>'+'\n'
|
||||||
|
ubloutput = ubloutput+indentation+indentation+indentation+indentation+'<cbc:ID>SR</cbc:ID>'+'\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:ClassifiedTaxCategory>'+'\n'
|
||||||
|
ubloutput = ubloutput+indentation+indentation+'</cac:Item>'+'\n'
|
||||||
|
ubloutput = ubloutput+indentation+indentation+'<cac:InvoicedQuantity unitCode="H87">'+str(linetemp['invoicedQuantity'])+'</cac:InvoicedQuantity>'+'\n'
|
||||||
|
ubloutput = ubloutput+indentation+indentation+'<cac:Price>'+'\n'
|
||||||
|
ubloutput = ubloutput+indentation+indentation+indentation+'<cbc:PriceAmount currencyID="SGD">'+str(linetemp['unitPrice'])+'</cbc:PriceAmount>'+'\n'
|
||||||
|
ubloutput = ubloutput+indentation+indentation+'</cac:Price>'+'\n'
|
||||||
|
ubloutput = ubloutput+indentation+indentation+'<cbc:LineExtensionAmount currencyID="SGD">'+str(linetemp['lineNetAmount'])+'</cbc:LineExtensionAmount>'+'\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+'</cac:InvoiceLine>'+'\n'
|
||||||
|
|
||||||
print(ubloutput)
|
print(ubloutput)
|
||||||
|
|
||||||
|
|
@ -130,6 +194,7 @@ def extract_invoice(document):
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
payload = json.dumps({
|
payload = json.dumps({
|
||||||
"sales_invoice_number": invoice['response']['data'][0]['documentNo'],
|
"sales_invoice_number": invoice['response']['data'][0]['documentNo'],
|
||||||
"sales_invoice_date": invoice['response']['data'][0]['invoiceDate']+"T00:00:00Z",
|
"sales_invoice_date": invoice['response']['data'][0]['invoiceDate']+"T00:00:00Z",
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue