diff --git a/erpnext/regional/doctype/import_supplier_invoice/import_supplier_invoice.py b/erpnext/regional/doctype/import_supplier_invoice/import_supplier_invoice.py
index 43c6454..62a5329 100644
--- a/erpnext/regional/doctype/import_supplier_invoice/import_supplier_invoice.py
+++ b/erpnext/regional/doctype/import_supplier_invoice/import_supplier_invoice.py
@@ -28,16 +28,10 @@
 			self.name = "Import Invoice on " + format_datetime(self.creation)
 
 	def import_xml_data(self):
+		pi_count = 0
 		import_file = frappe.get_doc("File", {"file_url": self.zip_file})
 		self.publish("File Import", _("Processing XML Files"), 1, 3)
 
-		pi_count = 0
-		mop_options = frappe.get_meta('Mode of Payment').fields[4].options
-		mop_str = re.sub('\n', ',', mop_options)
-		mop_dict = dict(item.split("-") for item in mop_str.split(","))
-
-		default_uom = frappe.db.get_value("Stock Settings", fieldname="stock_uom")
-
 		with zipfile.ZipFile(get_full_path(self.zip_file)) as zf:
 			file_count = 0
 			for file_name in zf.namelist():
@@ -56,126 +50,26 @@
 
 				file_content = bs(content, "xml")
 
-				for line in file_content.find_all("DatiTrasmissione"):
-					destination_code = line.CodiceDestinatario.text
-
-				#read address information from file
 				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)
-
 						total_discount = 0
 
-						#read item information from file
-						for line in file_content.find_all("DettaglioLinee"):
-							if line.find("PrezzoUnitario") and line.find("PrezzoTotale"):
-								unit_rate = flt(line.PrezzoUnitario.text) or 0
-								line_total = flt(line.PrezzoTotale.text) or 0
+						supp_dict = get_supplier_info_from_file(file_content)
+						destination_code = get_destination_code_from_file(file_content)
+						items, return_invoice, total_discount = get_item_from_file(file_content, self.item_code)
+						taxes = get_taxes_from_file(file_content, self.tax_account)
+						terms = get_payment_terms_from_file(file_content)
 
-								if (unit_rate == 0.0):
-									qty = 1.0
-									uom = default_uom
-									rate = tax_rate = 0
-								else:
-									if (line_total / unit_rate) == 1.0:
-										qty = 1.0
-										uom = default_uom
-									else:
-										if line.find("Quantita"):
-											qty = flt(line.Quantita.text) or 0
-											if line.find("UnitaMisura"):
-												uom = create_uom(line.UnitaMisura.text)
-											else:
-												uom = default_uom
+						supplier_name = create_supplier(supplier = supp_dict.get('supplier'), supplier_group = self.supplier_group, 
+											tax_id = supp_dict.get('tax_id'), fiscal_code = supp_dict.get('fiscal_code'),
+											fiscal_regime = supp_dict.get('fiscal_regime'))
 
-									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 = flt(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": qty,
-												"uom": uom,
-												"rate": rate,
-												"conversion_factor": 1.0,
-												"tax_rate": tax_rate
-											})
-
-								for disc_line in line.find_all("ScontoMaggiorazione"):
-									if disc_line.find("Percentuale"):
-										discount = flt(disc_line.Percentuale.text) or 0
-										total_discount += flt((discount / 100) * (rate * qty))
-
-						#read taxes from file
-						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": flt(line.AliquotaIVA.text) or 0,
-									"description": descr,
-									"tax_amount": flt(line.Imposta.text) if len(line.find("Imposta"))!=0 else 0
-								})
-
-						#read payment data from file
-						for line in file_content.find_all("DettaglioPagamento"):
-							mop_code = line.ModalitaPagamento.text + '-' + 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)
+						address = create_address(supplier_name = supplier_name, address_line1 = supp_dict.get('address_line1'), 
+									city = supp_dict.get('city'), province = supp_dict.get('province'), 
+									pin_code = supp_dict.get('pin_code'), country = supp_dict.get('country'))
 
 						pi_name = create_purchase_invoice(company = self.company, naming_series = self.invoice_series,
 									supplier_name = supplier_name, bill_no = invoice_no,document_type = document_type, 
@@ -206,6 +100,147 @@
 	def publish(self, title, message, count, total):
 		frappe.publish_realtime("import_invoice_update", {"title": title, "message": message, "count": count, "total": total})
 
+def get_supplier_info_from_file(file_content):
+	supplier_info = {}
+	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)
+		#set the dict values
+		supplier_info['tax_id'] = tax_id
+		supplier_info['fiscal_code'] = fiscal_code
+		supplier_info['fiscal_regime'] = fiscal_regime
+		supplier_info['supplier'] = supplier
+		supplier_info['address_line1'] = address_line1
+		supplier_info['city'] = city
+		supplier_info['province'] = province
+		supplier_info['pin_code'] = pin_code
+		supplier_info['country'] = country
+
+		return supplier_info
+
+def get_item_from_file(file_content, item_code):
+	items = []
+	total_discount = 0
+	default_uom = frappe.db.get_value("Stock Settings", fieldname="stock_uom")
+	#read file for item information
+	for line in file_content.find_all("DettaglioLinee"):
+		if line.find("PrezzoUnitario") and line.find("PrezzoTotale"):
+			unit_rate = flt(line.PrezzoUnitario.text) or 0
+			line_total = flt(line.PrezzoTotale.text) or 0
+
+			if (unit_rate == 0.0):
+				qty = 1.0
+				uom = default_uom
+				rate = tax_rate = 0
+			else:
+				if (line_total / unit_rate) == 1.0:
+					qty = 1.0
+					uom = default_uom
+				else:
+					if line.find("Quantita"):
+						qty = flt(line.Quantita.text) or 0
+						if line.find("UnitaMisura"):
+							uom = create_uom(line.UnitaMisura.text)
+						else:
+							uom = default_uom
+
+				if (unit_rate < 0 and line_total < 0):
+					qty *= -1
+					return_invoice = 1
+					unit_rate *= -1
+				else:
+					return_invoice = 0
+
+				rate = unit_rate
+				if line.find("AliquotaIVA"):
+					tax_rate = flt(line.AliquotaIVA.text)
+
+			line_str = re.sub('[^A-Za-z0-9]+', '-', line.Descrizione.text)
+			item_name = line_str[0:140]
+			items.append({
+							"item_code": item_code,
+							"item_name": item_name,
+							"description": line_str,
+							"qty": qty,
+							"uom": uom,
+							"rate": rate,
+							"conversion_factor": 1.0,
+							"tax_rate": tax_rate
+						})
+
+			for disc_line in line.find_all("ScontoMaggiorazione"):
+				if disc_line.find("Percentuale"):
+					discount = flt(disc_line.Percentuale.text) or 0
+					total_discount += flt((discount / 100) * (rate * qty))
+
+	return items, return_invoice, total_discount
+
+def get_taxes_from_file(file_content, tax_account):
+	taxes = []
+	#read file for taxes information
+	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": tax_account,
+				"tax_rate": flt(line.AliquotaIVA.text) or 0,
+				"description": descr,
+				"tax_amount": flt(line.Imposta.text) if len(line.find("Imposta"))!=0 else 0
+			})
+
+	return taxes
+
+def get_payment_terms_from_file(file_content):
+	terms = []
+	#Get mode of payment dict from setup
+	mop_options = frappe.get_meta('Mode of Payment').fields[4].options
+	mop_str = re.sub('\n', ',', mop_options)
+	mop_dict = dict(item.split("-") for item in mop_str.split(","))
+	#read file for payment information
+	for line in file_content.find_all("DettaglioPagamento"):
+		mop_code = line.ModalitaPagamento.text + '-' + 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
+		})
+
+	return terms
+
+def get_destination_code_from_file(file_content):
+	for line in file_content.find_all("DatiTrasmissione"):
+		destination_code = line.CodiceDestinatario.text
+
+	return destination_code
+
 def create_supplier(**args):
 	args = frappe._dict(args)
 	existing_supplier_name = frappe.db.get_value("Supplier",
