[feat] #19334
diff --git a/erpnext/patches/v12_0/set_permission_einvoicing.py b/erpnext/patches/v12_0/set_permission_einvoicing.py
new file mode 100644
index 0000000..c01f34a
--- /dev/null
+++ b/erpnext/patches/v12_0/set_permission_einvoicing.py
@@ -0,0 +1,12 @@
+import frappe
+from frappe.permissions import add_permission, update_permission_property
+
+def execute():
+	company = frappe.get_all('Company', filters = {'country': 'Italy'})
+
+	if not company:
+		return
+
+	add_permission('Import Supplier Invoice', 'Accounts Manager', 0)
+	update_permission_property('Import Supplier Invoice', 'Accounts Manager', 0, 'write', 1)
+	update_permission_property('Import Supplier Invoice', 'Accounts Manager', 0, 'create', 1)
\ No newline at end of file
diff --git a/erpnext/regional/doctype/import_supplier_invoice/__init__.py b/erpnext/regional/doctype/import_supplier_invoice/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/regional/doctype/import_supplier_invoice/__init__.py
diff --git a/erpnext/regional/doctype/import_supplier_invoice/import_supplier_invoice.js b/erpnext/regional/doctype/import_supplier_invoice/import_supplier_invoice.js
new file mode 100644
index 0000000..efd55db
--- /dev/null
+++ b/erpnext/regional/doctype/import_supplier_invoice/import_supplier_invoice.js
@@ -0,0 +1,21 @@
+// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
+// License: GNU General Public License v3. See license.txt
+
+frappe.ui.form.on('Import Supplier Invoice', {
+	onload: function(frm) {
+		frappe.realtime.on("import_invoice_update", function (data) {
+			frm.dashboard.show_progress(data.title, (data.count / data.total) * 100, data.message);
+			if (data.count == data.total) {
+				window.setTimeout(title => frm.dashboard.hide_progress(title), 1500, data.title);
+			}
+		});
+
+		frm.set_query("tax_account", function() {
+					return {
+						filters: {
+							account_type: 'Tax'
+						}
+					}
+				});
+	}
+});
\ No newline at end of file
diff --git a/erpnext/regional/doctype/import_supplier_invoice/import_supplier_invoice.json b/erpnext/regional/doctype/import_supplier_invoice/import_supplier_invoice.json
new file mode 100644
index 0000000..6d28eac
--- /dev/null
+++ b/erpnext/regional/doctype/import_supplier_invoice/import_supplier_invoice.json
@@ -0,0 +1,81 @@
+{
+ "creation": "2019-10-15 12:33:21.845329",
+ "doctype": "DocType",
+ "editable_grid": 1,
+ "engine": "InnoDB",
+ "field_order": [
+  "company",
+  "item_code",
+  "supplier_group",
+  "tax_account",
+  "column_break_5",
+  "zip_file",
+  "import_invoices",
+  "status"
+ ],
+ "fields": [
+  {
+   "fieldname": "company",
+   "fieldtype": "Link",
+   "in_list_view": 1,
+   "label": "Company",
+   "options": "Company",
+   "reqd": 1
+  },
+  {
+   "fieldname": "item_code",
+   "fieldtype": "Link",
+   "in_list_view": 1,
+   "label": "Item Code",
+   "options": "Item",
+   "reqd": 1
+  },
+  {
+   "fieldname": "supplier_group",
+   "fieldtype": "Link",
+   "in_list_view": 1,
+   "label": "Supplier Group",
+   "options": "Supplier Group",
+   "reqd": 1
+  },
+  {
+   "fieldname": "tax_account",
+   "fieldtype": "Link",
+   "in_list_view": 1,
+   "label": "Tax Account",
+   "options": "Account",
+   "reqd": 1
+  },
+  {
+   "fieldname": "column_break_5",
+   "fieldtype": "Column Break"
+  },
+  {
+   "fieldname": "zip_file",
+   "fieldtype": "Attach",
+   "label": "Zip File"
+  },
+  {
+   "description": "Click on Import Invoices button once the zip file has been attached to the document. Any errors related to processing will be shown in the Error Log.",
+   "fieldname": "import_invoices",
+   "fieldtype": "Button",
+   "label": "Import Invoices",
+   "options": "process_file_data"
+  },
+  {
+   "fieldname": "status",
+   "fieldtype": "Data",
+   "label": "Status",
+   "read_only": 1
+  }
+ ],
+ "modified": "2019-10-16 02:00:00.538268",
+ "modified_by": "Administrator",
+ "module": "Regional",
+ "name": "Import Supplier Invoice",
+ "owner": "Administrator",
+ "permissions": [],
+ "sort_field": "modified",
+ "sort_order": "DESC",
+ "track_changes": 1
+}
\ No newline at end of file
diff --git a/erpnext/regional/doctype/import_supplier_invoice/import_supplier_invoice.py b/erpnext/regional/doctype/import_supplier_invoice/import_supplier_invoice.py
new file mode 100644
index 0000000..3b43fe7
--- /dev/null
+++ b/erpnext/regional/doctype/import_supplier_invoice/import_supplier_invoice.py
@@ -0,0 +1,383 @@
+# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
+# License: GNU General Public License v3. See license.txt
+
+from __future__ import unicode_literals
+
+from decimal import Decimal
+import json
+import re
+import traceback
+import zipfile
+import frappe
+from frappe import _
+from frappe.model.document import Document
+from frappe.custom.doctype.custom_field.custom_field import create_custom_field
+from frappe.utils.data import format_datetime
+from bs4 import BeautifulSoup as bs
+from frappe.utils import cint, flt, today, nowdate, add_days, get_files_path
+import dateutil
+from frappe.utils.file_manager import save_file
+
+class ImportSupplierInvoice(Document):
+
+	def autoname(self):
+		if not self.name:
+			self.name = "Import Invoice on " + format_datetime(self.creation)
+
+	def import_xml_data(self):
+		import_file = frappe.get_doc("File", {"file_url": self.zip_file})
+		self.publish("File Import", _("Processing XML Files"), 1, 3)
+		pi_count = 0
+		with zipfile.ZipFile(get_full_path(self.zip_file)) as zf:
+			file_count = 0
+			for file_name in zf.namelist():
+				items = []
+				taxes = []
+				terms = []
+				encoded_content = zf.read(file_name)
+				try:
+					content = encoded_content.decode("utf-8-sig")
+				except UnicodeDecodeError:
+					content = encoded_content.decode("utf-16")
+				file_content = bs(content, "xml")
+
+				for line in file_content.find_all("DatiTrasmissione"):
+					destination_code = line.CodiceDestinatario.text
+
+				for line in file_content.find_all("DatiGeneraliDocumento"):
+					document_type = line.TipoDocumento.text
+					bill_date = dateutil.parser.parse(line.Data.text).strftime("%Y-%m-%d")
+					invoice_no = line.Numero.text
+					if len(invoice_no) != 0:
+						for line in file_content.find_all("CedentePrestatore"):
+							tax_id = line.DatiAnagrafici.IdPaese.text + line.DatiAnagrafici.IdCodice.text
+							if line.find("CodiceFiscale"):
+								fiscal_code = line.DatiAnagrafici.CodiceFiscale.text
+							else:
+								fiscal_code = ""
+							if line.find("RegimeFiscale"):
+								fiscal_regime = line.DatiAnagrafici.RegimeFiscale.text
+							else:
+								fiscal_regime = ""
+							if line.find("Denominazione"):
+								supplier = line.DatiAnagrafici.Anagrafica.Denominazione.text
+							if line.find("Nome"):
+								supplier = line.DatiAnagrafici.Anagrafica.Nome.text + " " + line.DatiAnagrafici.Anagrafica.Cognome.text
+							address_line1 = line.Sede.Indirizzo.text
+							city = line.Sede.Comune.text
+							if line.find("Provincia"):
+								province = line.Sede.Provincia.text
+							else:
+								province = ""
+							pin_code = line.Sede.CAP.text
+							country = get_country(line.Sede.Nazione.text)
+
+						for line in file_content.find_all("DettaglioLinee"):
+							if line.find("PrezzoUnitario") and line.find("PrezzoTotale"):
+								unit_rate = float(line.PrezzoUnitario.text) or float(0)
+								line_total = float(line.PrezzoTotale.text) or float(0)
+
+								if (unit_rate == 0.0):
+									qty = float(1)
+									uom = "nos"
+									rate = tax_rate = 0
+								else:
+									if (line_total / unit_rate) == 1.0:
+										qty = float(1)
+										uom = "nos"
+									else:
+										if line.find("Quantita"):
+											qty = float(line.Quantita.text) or float(0)
+											if line.find("UnitaMisura"):
+												uom = create_uom(line.UnitaMisura.text)
+											else:
+												uom = "nos"
+
+									if (unit_rate < 0 and line_total < 0):
+										qty *= -1
+										return_invoice = 1
+									else:
+										return_invoice = 0
+
+									rate = unit_rate
+									if line.find("AliquotaIVA"):
+										tax_rate = float(line.AliquotaIVA.text)
+
+								line_str = re.sub('[^A-Za-z0-9]+', '-', line.Descrizione.text)
+								item_name = line_str[0:140]
+								items.append({
+												"item_code": self.item_code,
+												"item_name": item_name,
+												"description": line_str,
+												"qty": float(qty),
+												"uom": uom,
+												"rate": rate,
+												"conversion_factor": float(1),
+												"tax_rate": tax_rate
+											})
+
+						for line in file_content.find_all("DatiRiepilogo"):
+							if line.find("AliquotaIVA"):
+								if line.find("EsigibilitaIVA"):
+									descr = line.EsigibilitaIVA.text
+								else:
+									descr = "None"
+								taxes.append({
+									"charge_type": "Actual",
+									"account_head": self.tax_account,
+									"tax_rate": float(line.AliquotaIVA.text) or float(0),
+									"description": descr,
+									"tax_amount": float(line.Imposta.text) if len(line.find("Imposta"))!=0 else float(0)
+								})
+
+						mop_dict = {'MP01':"MP01-Contanti", 'MP02':"MP02-Assegno", 'MP03':"MP03-Assegno circolare", 'MP04':"MP04-Contanti presso Tesoreria",
+									'MP05':"MP05-Bonifico", 'MP06': "MP06-Vaglia cambiario", 'MP07': "MP07-Bollettino bancario", 'MP08': "MP08-Carta di pagamento",
+									'MP09':"MP09-RID", 'MP10': "MP10-RID utenze", 'MP11': "MP11-RID veloce", 'MP12':"MP12-RIBA", 'MP13':"MP13-MAV",
+									'MP14':"MP14-Quietanza erario", 'MP15':"MP15-Giroconto su conti di contabilità speciale", 'MP16':"MP16-Domiciliazione bancaria",
+									'MP17': "MP17-Domiciliazione postale", 'MP18': "MP18-Bollettino di c/c postale", 'MP19': "MP19-SEPA Direct Debit",
+									'MP20': "MP20-SEPA Direct Debit CORE", 'MP21': "MP21-SEPA Direct Debit B2B", 'MP22':"MP22-Trattenuta su somme già riscosse"}
+				
+						for line in file_content.find_all("DettaglioPagamento"):
+							mop_code = mop_dict.get(line.ModalitaPagamento.text)
+							
+							if line.find("DataScadenzaPagamento"):
+								due_date = dateutil.parser.parse(line.DataScadenzaPagamento.text).strftime("%Y-%m-%d")
+							else:
+								due_date = today()
+							terms.append({
+											"mode_of_payment_code": mop_code,
+											"bank_account_iban": line.IBAN.text if line.find("IBAN") else "",
+											"due_date": due_date,
+											"payment_amount": line.ImportoPagamento.text
+							})
+
+						supplier_name = create_supplier(supplier = supplier, supplier_group = self.supplier_group, 
+														tax_id = tax_id, fiscal_code = fiscal_code,
+														fiscal_regime = fiscal_regime)
+
+						address = create_address(supplier_name = supplier_name, address_line1 = address_line1, 
+												city = city, province = province, 
+												pin_code = pin_code, country = country)
+
+						pi_name = create_purchase_invoice(company = self.company,
+														supplier_name = supplier_name,
+														bill_no = invoice_no,
+														document_type = document_type,
+														bill_date = bill_date,
+														is_return = return_invoice,
+														destination_code = destination_code,
+														items = items,
+														taxes = taxes,
+														terms = terms,
+														file_name = file_name)
+						file_count += 1
+						if pi_name:
+							pi_count += 1
+							file_save = save_file(file_name, encoded_content, "Purchase Invoice", pi_name, folder=None, decode=False, is_private=0, df=None)
+
+		if pi_count == file_count:
+			self.status = "File Import Completed"
+			self.publish("File Import", _("XML Files Processed"), 2, 3)
+		else:
+			self.status = "Partially Completed - Check Error Log"
+			self.publish("File Import", _("XML Files Processed"), 2, 3)
+
+		self.save()
+		self.publish("File Import", _("XML Files Processed"), 3, 3)
+
+	def process_file_data(self):
+		self.status = "Processing File Data"
+		self.save()
+		frappe.enqueue_doc(self.doctype, self.name, "import_xml_data", queue="long", timeout=3600)
+
+	def publish(self, title, message, count, total):
+		frappe.publish_realtime("import_invoice_update", {"title": title, "message": message, "count": count, "total": total})
+
+def create_supplier(**args):
+
+	args = frappe._dict(args)
+	existing_supplier_name = frappe.db.get_value("Supplier",
+				filters={"tax_id": args.tax_id}, fieldname="name")
+	if existing_supplier_name:
+		pass
+	else:
+		existing_supplier_name = frappe.db.get_value("Supplier",
+				filters={"name": args.supplier}, fieldname="name")
+
+	if existing_supplier_name:
+		filters = [
+				["Dynamic Link", "link_doctype", "=", "Supplier"],
+				["Dynamic Link", "link_name", "=", args.existing_supplier_name],
+				["Dynamic Link", "parenttype", "=", "Contact"]
+			]
+
+		existing_contacts = frappe.get_list("Contact", filters)
+
+		if existing_contacts:
+			pass
+		else:
+			new_contact = frappe.new_doc("Contact")
+			new_contact.first_name = args.supplier
+			new_contact.append('links', {
+				"link_doctype": "Supplier",
+				"link_name": existing_supplier_name
+			})
+			new_contact.insert()
+
+		return existing_supplier_name
+	else:
+		
+		new_supplier = frappe.new_doc("Supplier")
+		new_supplier.supplier_name = args.supplier
+		new_supplier.supplier_group = args.supplier_group
+		new_supplier.tax_id = args.tax_id
+		new_supplier.fiscal_code = args.fiscal_code
+		new_supplier.fiscal_regime = args.fiscal_regime
+		new_supplier.save()
+
+		new_contact = frappe.new_doc("Contact")
+		new_contact.first_name = args.supplier
+		new_contact.append('links', {
+			"link_doctype": "Supplier",
+			"link_name": new_supplier.name
+		})
+
+		new_contact.insert()
+
+		return new_supplier.name
+
+def create_address(**args):
+
+	args = frappe._dict(args)
+	filters = [
+			["Dynamic Link", "link_doctype", "=", "Supplier"],
+			["Dynamic Link", "link_name", "=", args.supplier_name],
+			["Dynamic Link", "parenttype", "=", "Address"]
+		]
+
+	existing_address = frappe.get_list("Address", filters)
+
+	if args.address_line1:
+		make_address = frappe.new_doc("Address")
+		make_address.address_line1 = args.address_line1
+
+		if args.city:
+			make_address.city = args.city
+		else:
+			make_address.city = "Not Provided"
+
+		if args.province:
+			make_address.state_code = args.province
+
+		if args.pincode:
+			make_address.pincode = args.pincode
+
+		if args.country:
+			make_address.country = args.country
+
+		for address in existing_address:
+			address_doc = frappe.get_doc("Address", address["name"])
+			if (address_doc.address_line1 == make_address.address_line1 and
+				address_doc.pincode == make_address.pincode):
+				return address
+
+		make_address.append("links", {
+			"link_doctype": "Supplier",
+			"link_name": args.supplier_name
+		})
+		make_address.address_type = "Billing"
+		make_address.insert()
+		return make_address.name
+	else:
+		return None
+
+def create_purchase_invoice(**args):
+
+	args = frappe._dict(args)
+	pi = frappe.get_doc({
+			"doctype": "Purchase Invoice",
+			"company": args.company,
+			"naming_series": "PINV-",
+			"supplier": args.supplier_name,
+			"is_return": args.is_return,
+			"posting_date": today(),
+			"bill_no": args.bill_no,
+			"bill_date": args.bill_date,
+			"destination_code": args.destination_code,
+			"document_type": args.document_type,
+			"items": args["items"],
+			"taxes": args["taxes"]
+		})
+
+	try:
+		pi.insert(ignore_permissions=True)
+		calc_total = 0
+		adj = 0
+		for term in args.terms:
+			calc_total += float(term["payment_amount"])
+		if float(calc_total - float(pi.grand_total)) != 0:
+			adj = calc_total - float(pi.grand_total)
+		pi.payment_schedule = []
+		for term in args.terms:
+			pi.append('payment_schedule',{"mode_of_payment_code": term["mode_of_payment_code"],
+			"bank_account_iban": term["bank_account_iban"],
+			"due_date": term["due_date"],
+			"payment_amount": float(term["payment_amount"]) - adj })
+			adj = 0
+		pi.imported_grand_total = calc_total
+		pi.save()
+		return pi.name
+	except Exception as e:
+		frappe.log_error(message=e, title="Create Purchase Invoice: " + args.bill_no + "File Name: " + args.file_name)
+		return None
+
+def get_country(code):
+
+	existing_country_name = frappe.db.get_value("Country",
+			filters={"code": code}, fieldname="name")
+	if existing_country_name:
+		return existing_country_name
+	else:
+		frappe.throw(_("Country Code in File does not match with country code set up in the system"))
+
+def create_uom(uom):
+
+	existing_uom = frappe.db.get_value("UOM",
+			filters={"uom_name": uom}, fieldname="uom_name")
+	if existing_uom:
+		return existing_uom
+	else:
+		new_uom = frappe.new_doc("UOM")
+		new_uom.uom_name = uom
+		new_uom.save()
+		return new_uom.uom_name
+
+def check_bill_no(invoice_no):
+
+	existing_bill_no = frappe.db.get_value("Purchase Invoice",
+				filters={"bill_no": invoice_no, "docstatus": 1}, fieldname="name")
+	if existing_bill_no:
+		return existing_bill_no
+	else:
+		return None
+
+def get_full_path(file_name):
+	"""Returns file path from given file name"""
+	file_path = file_name
+
+	if "/" not in file_path:
+		file_path = "/files/" + file_path
+
+	if file_path.startswith("/private/files/"):
+		file_path = get_files_path(*file_path.split("/private/files/", 1)[1].split("/"), is_private=1)
+
+	elif file_path.startswith("/files/"):
+		file_path = get_files_path(*file_path.split("/files/", 1)[1].split("/"))
+
+	elif file_path.startswith("http"):
+		pass
+
+	elif not self.file_url:
+		frappe.throw(_("There is some problem with the file url: {0}").format(file_path))
+
+	return file_path
\ No newline at end of file
diff --git a/erpnext/regional/doctype/import_supplier_invoice/test_import_supplier_invoice.py b/erpnext/regional/doctype/import_supplier_invoice/test_import_supplier_invoice.py
new file mode 100644
index 0000000..d1caf77
--- /dev/null
+++ b/erpnext/regional/doctype/import_supplier_invoice/test_import_supplier_invoice.py
@@ -0,0 +1,10 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and Contributors
+# See license.txt
+from __future__ import unicode_literals
+
+# import frappe
+import unittest
+
+class TestImportSupplierInvoice(unittest.TestCase):
+	pass
diff --git a/erpnext/regional/italy/setup.py b/erpnext/regional/italy/setup.py
index 1526d6f..2d0ad66 100644
--- a/erpnext/regional/italy/setup.py
+++ b/erpnext/regional/italy/setup.py
@@ -155,6 +155,31 @@
 				fetch_from="country.code"),
 			dict(fieldname='state_code', label='State Code',
 				fieldtype='Data', insert_after='state', print_hide=1)
+		],
+		'Purchase Invoice': [
+			dict(fieldname='document_type', label='Document Type',
+				fieldtype='Data', insert_after='company', print_hide=1, read_only=1
+				),
+			dict(fieldname='destination_code', label='Destination Code',
+				fieldtype='Data', insert_after='company', print_hide=1, read_only=1
+				),
+			dict(fieldname='imported_grand_total', label='Imported Grand Total',
+				fieldtype='Data', insert_after='update_auto_repeat_reference', print_hide=1, read_only=1
+				)
+		],
+		'Purchase Taxes and Charges': [
+			dict(fieldname='tax_rate', label='Tax Rate',
+				fieldtype='Data', insert_after='parenttype', print_hide=1, read_only=0
+				)
+		],
+		'Supplier': [
+			dict(fieldname='fiscal_code', label='Fiscal Code',
+				fieldtype='Data', insert_after='tax_id', print_hide=1, read_only=1
+				),
+			dict(fieldname='fiscal_regime', label='Fiscal Regime',
+				fieldtype='Select', insert_after='fiscal_code', print_hide=1, read_only=1,
+				options= "\nRF01\nRF02\nRF04\nRF05\nRF06\nRF07\nRF08\nRF09\nRF10\nRF11\nRF12\nRF13\nRF14\nRF15\nRF16\nRF17\nRF18\nRF19"
+				)
 		]
 	}
 
diff --git a/erpnext/regional/italy/utils.py b/erpnext/regional/italy/utils.py
index bc8d00d..2af72f8 100644
--- a/erpnext/regional/italy/utils.py
+++ b/erpnext/regional/italy/utils.py
@@ -13,6 +13,8 @@
 def update_itemised_tax_data(doc):
 	if not doc.taxes: return
 
+	if doc.doctype == "Purchase Invoice": return
+
 	itemised_tax = get_itemised_tax(doc.taxes)
 
 	for row in doc.items:
diff --git a/erpnext/regional/print_format/purchase_einvoice/__init__.py b/erpnext/regional/print_format/purchase_einvoice/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/regional/print_format/purchase_einvoice/__init__.py
diff --git a/erpnext/regional/print_format/purchase_einvoice/purchase_einvoice.json b/erpnext/regional/print_format/purchase_einvoice/purchase_einvoice.json
new file mode 100644
index 0000000..88f31dd
--- /dev/null
+++ b/erpnext/regional/print_format/purchase_einvoice/purchase_einvoice.json
@@ -0,0 +1,23 @@
+{
+ "align_labels_right": 0,
+ "creation": "2019-10-16 00:47:08.877767",
+ "custom_format": 0,
+ "disabled": 1,
+ "doc_type": "Purchase Invoice",
+ "docstatus": 0,
+ "doctype": "Print Format",
+ "font": "Default",
+ "format_data": "[{\"fieldname\": \"print_heading_template\", \"fieldtype\": \"Custom HTML\", \"options\": \"<div class=\\\"print-heading\\\">\\t\\t\\t\\t<h2>Purchase Invoice<br><small>{{ doc.name }}</small>\\t\\t\\t\\t</h2></div>\"}, {\"fieldtype\": \"Section Break\", \"label\": \"\"}, {\"fieldtype\": \"Column Break\"}, {\"fieldname\": \"_custom_html\", \"print_hide\": 0, \"label\": \"Custom HTML\", \"fieldtype\": \"HTML\", \"options\": \"<table border=\\\"1\\\" width=\\\"100%\\\">\\n<head>\\n<th>\\nCedente/prestatore (fornitore)\\n</th>\\n<th>\\nCessionario/committente (cliente)\\n</th>\\n</head>\\n<body>\\n<tr>\\n<td style=\\\"width: 50%;white-space:nowrap;\\\">\\n<p>Identificstivo fiscale ai fini IVA: {{frappe.db.get_value(\\\"Supplier\\\", doc.supplier, \\\"tax_id\\\")}}</p>\\n<p>Codice fiscale: {{frappe.db.get_value(\\\"Supplier\\\", doc.supplier, \\\"fiscal_code\\\")}}</p>\\n<p>Denominazione: {{frappe.db.get_value(\\\"Supplier\\\", doc.supplier, \\\"supplier_name\\\")}}</p>\\n<p>Regime fiscale: {{frappe.db.get_value(\\\"Supplier\\\", doc.supplier, \\\"fiscal_regime\\\")}}</p>\\n<p>Indrizo: {{frappe.db.get_value(\\\"Address\\\", doc.supplier_address, \\\"address_line1\\\")}}</p>\\n<p>Commune: {{frappe.db.get_value(\\\"Address\\\", doc.supplier_address, \\\"city\\\")}} Provincia: {{frappe.db.get_value(\\\"Address\\\", doc.supplier_address, \\\"state_code\\\")}}</p>\\n<p>Cap: {{(frappe.db.get_value(\\\"Address\\\", doc.supplier_address, \\\"pincode\\\")) or \\\" \\\"}} Nazione: {{frappe.db.get_value(\\\"Address\\\", doc.supplier_address, \\\"country\\\")}}</p>\\n</td>\\n<td style=\\\"width: 50%;white-space:nowrap;\\\">\\n<p>Identificstivo fiscale ai fini IVA: {{frappe.db.get_value(\\\"Company\\\", doc.company, \\\"tax_id\\\")}}</p>\\n<p>Codice fiscale: {{frappe.db.get_value(\\\"Company\\\", doc.company, \\\"fiscal_code\\\")}}</p>\\n<p>Denominazione: {{doc.company}}</p>\\n<p>Indrizo: {{frappe.db.get_value(\\\"Address\\\", doc.shipping_address, \\\"address_line1\\\")}}</p>\\n<p>Commune: {{frappe.db.get_value(\\\"Address\\\", doc.shipping_address, \\\"city\\\")}} Provincia: {{frappe.db.get_value(\\\"Address\\\", doc.shipping_address, \\\"state_code\\\")}}</p>\\n<p>Cap: {{frappe.db.get_value(\\\"Address\\\", doc.shipping_address, \\\"pincode\\\")}} Nazione: {{frappe.db.get_value(\\\"Address\\\", doc.shipping_address, \\\"country\\\")}}</p>\\n</td>\\n</td>\\n</tr>\\n</body>\\n</table>\\n<br>\"}, {\"fieldtype\": \"Section Break\", \"label\": \"\"}, {\"fieldtype\": \"Column Break\"}, {\"fieldname\": \"_custom_html\", \"print_hide\": 0, \"label\": \"Custom HTML\", \"fieldtype\": \"HTML\", \"options\": \"<table border=\\\"1\\\" width=\\\"100%\\\">\\n<head>\\n<th>\\nTipologla\\n</th>\\n<th>\\nArt. 73\\n</th>\\n<th>\\nNumero documento\\n</th>\\n<th>\\nData documento\\n</th>\\n<th>\\nCodice destinatario\\n</th>\\n</head>\\n<body>\\n<tr>\\n<td style=\\\"width: 20%;white-space:nowrap;\\\">\\n{{doc.document_type or \\\" \\\"}}\\n</td>\\n<td style=\\\"width: 10%;white-space:nowrap;\\\">\\n{{\\\" \\\"}}\\n</td>\\n<td style=\\\"width: 20%;white-space:nowrap;\\\">\\n{{doc.bill_no or \\\" \\\"}}\\n</td>\\n<td style=\\\"width: 20%;white-space:nowrap;\\\">\\n{{doc.get_formatted(\\\"bill_date\\\") or \\\" \\\"}}\\n</td>\\n<td style=\\\"width: 30%;white-space:nowrap;\\\">\\n{{doc.destination_code or \\\" \\\"}}\\n</td>\\n</tr>\\n</body>\\n</table>\\n<br>\"}, {\"fieldtype\": \"Section Break\", \"label\": \"\"}, {\"fieldtype\": \"Column Break\"}, {\"fieldname\": \"_custom_html\", \"print_hide\": 0, \"label\": \"Custom HTML\", \"fieldtype\": \"HTML\", \"options\": \"<table border=\\\"1\\\" width=\\\"100%\\\">\\n<head>\\n<th>\\nDescrizione\\n</th>\\n<th>\\nQuantita\\n</th>\\n<th>\\nPrezzo unitario\\n</th>\\n<th>\\nUM\\n</th>\\n<th>\\n%IVA\\n</th>\\n<th>\\nPrezzo totale\\n</th>\\n</head>\\n\\n<body>\\n{%- for row in doc.items -%}\\n<tr>\\n<td style=\\\"width: 30%;\\\">\\n{{row.description or \\\" \\\"}}\\n</td>\\n<td style=\\\"width: 15%;white-space:nowrap;\\\">\\n{{row.get_formatted(\\\"qty\\\", doc)}}\\n</td>\\n<td style=\\\"width: 15%;white-space:nowrap;\\\">\\n{{row.get_formatted(\\\"rate\\\", doc)}}\\n</td>\\n<td style=\\\"width: 5%;white-space:nowrap;\\\">\\n{{row.get_formatted(\\\"uom\\\", doc)}}\\n</td>\\n<td style=\\\"width: 15%;white-space:nowrap;\\\">\\n{{row.get_formatted(\\\"tax_rate\\\", doc)}}\\n</td>\\n<td style=\\\"width: 20%;white-space:nowrap;\\\">\\n{{row.get_formatted(\\\"amount\\\", doc)}}\\n</td>\\n{%- endfor -%}\\n</body>\\n</table>\\n<br>\"}, {\"fieldtype\": \"Section Break\", \"label\": \"\"}, {\"fieldtype\": \"Column Break\"}, {\"fieldname\": \"_custom_html\", \"print_hide\": 0, \"label\": \"Custom HTML\", \"fieldtype\": \"HTML\", \"options\": \"<table border=\\\"1\\\" width=\\\"100%\\\">\\n<head>\\n<th>\\nesigibilita immediata / riferimenti normativi\\n</th>\\n<th>\\n%IVA\\n</th>\\n<th>\\nSpese accessorie\\n</th>\\n<th>\\nArr.\\n</th>\\n<th>\\nTotale imponibile\\n</th>\\n<th>\\nTotale Imposta\\n</th>\\n</head>\\n\\n<body>\\n{%- for row in doc.taxes -%}\\n<tr>\\n<td style=\\\"width: 30%;white-space:nowrap;\\\">\\n{% if 'None' in row.description %}\\n    {{ \\\" \\\" }}\\n{% else %}\\n{{row.description}}\\n{% endif %}\\n</td>\\n<td style=\\\"width: 10%;white-space:nowrap;\\\">\\n{{row.get_formatted(\\\"tax_rate\\\", doc)}}\\n</td>\\n<td style=\\\"width: 10%;white-space:nowrap;\\\">\\n{{\\\"0,00\\\"}}\\n</td>\\n<td style=\\\"width: 10%;white-space:nowrap;\\\">\\n{{\\\" \\\"}}\\n</td>\\n<td style=\\\"width: 20%;white-space:nowrap;\\\">\\n{{doc.get_formatted(\\\"base_net_total\\\")}}\\n</td>\\n<td style=\\\"width: 20%;white-space:nowrap;\\\">\\n{{row.get_formatted(\\\"tax_amount\\\", doc)}}\\n</td>\\n{%- endfor -%}\\n</body>\\n</table>\\n<br>\"}, {\"fieldtype\": \"Section Break\", \"label\": \"\"}, {\"fieldtype\": \"Column Break\"}, {\"fieldname\": \"_custom_html\", \"print_hide\": 0, \"label\": \"Custom HTML\", \"fieldtype\": \"HTML\", \"options\": \"<table border=\\\"1\\\" width=\\\"100%\\\">\\n<head>\\n<th>\\nImporto bolio\\n</th>\\n<th>\\nSconto/Magglorazione\\n</th>\\n<th>\\nArr.\\n</th>\\n<th>\\nTotale documento\\n</th>\\n</head>\\n\\n<body>\\n<tr>\\n<td style=\\\"width: 20%;white-space:nowrap;\\\">\\n{{\\\" \\\"}}\\n</td>\\n<td style=\\\"width: 30%;white-space:nowrap;\\\">\\n{{\\\" \\\"}}\\n</td>\\n<td style=\\\"width: 10%;white-space:nowrap;\\\">\\n{{\\\" \\\"}}\\n</td>\\n<td style=\\\"width: 40%;white-space:nowrap;\\\">\\n{{doc.get_formatted(\\\"base_grand_total\\\")}}\\n</td>\\n</body>\\n</table>\\n<br>\"}, {\"fieldtype\": \"Section Break\", \"label\": \"\"}, {\"fieldtype\": \"Column Break\"}, {\"fieldname\": \"_custom_html\", \"print_hide\": 0, \"label\": \"Custom HTML\", \"fieldtype\": \"HTML\", \"options\": \"<table border=\\\"1\\\" width=\\\"100%\\\">\\n<head>\\n<th>\\nModalita pagamento\\n</th>\\n<th>\\nIBAN\\n</th>\\n<th>\\nInstituto\\n</th>\\n<th>\\nData scadenza\\n</th>\\n<th>\\nImporto\\n</th>\\n</head>\\n\\n<body>\\n{%- for row in doc.payment_schedule -%}\\n<tr>\\n<td style=\\\"width: 20%;white-space:nowrap;\\\">\\n{{row.get_formatted(\\\"mode_of_payment_code\\\",doc)}}\\n</td>\\n<td style=\\\"width: 20%;white-space:nowrap;\\\">\\n{{row.get_formatted(\\\"bank_account_iban\\\",doc)}}\\n</td>\\n<td style=\\\"width: 20%;white-space:nowrap;\\\">\\n{{\\\" \\\"}}\\n</td>\\n<td style=\\\"width: 20%;white-space:nowrap;\\\">\\n{{row.get_formatted(\\\"due_date\\\",doc)}}\\n</td>\\n<td style=\\\"width: 20%;white-space:nowrap;\\\">\\n{{row.get_formatted(\\\"payment_amount\\\",doc)}}\\n</td>\\n{%- endfor -%}\\n</body>\\n</table>\"}]",
+ "idx": 0,
+ "line_breaks": 0,
+ "modified": "2019-10-16 23:32:37.709344",
+ "modified_by": "Administrator",
+ "module": "Regional",
+ "name": "Purchase eInvoice",
+ "owner": "Administrator",
+ "print_format_builder": 1,
+ "print_format_type": "Jinja",
+ "raw_printing": 0,
+ "show_section_headings": 0,
+ "standard": "Yes"
+}
\ No newline at end of file