Merge branch 'hotfix'
diff --git a/erpnext/__init__.py b/erpnext/__init__.py
index 24cc8ea..049a8a0 100644
--- a/erpnext/__init__.py
+++ b/erpnext/__init__.py
@@ -5,7 +5,7 @@
 from erpnext.hooks import regional_overrides
 from frappe.utils import getdate
 
-__version__ = '11.1.8'
+__version__ = '11.1.9'
 
 def get_default_company(user=None):
 	'''Get default company for user'''
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
index abd201f..895ca07 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
@@ -24,7 +24,6 @@
 from erpnext.accounts.doctype.loyalty_program.loyalty_program import \
 	get_loyalty_program_details_with_points, get_loyalty_details, validate_loyalty_points
 from erpnext.accounts.deferred_revenue import validate_service_stop_date
-from erpnext.controllers.accounts_controller import on_submit_regional, on_cancel_regional
 
 from erpnext.healthcare.utils import manage_invoice_submit_cancel
 
@@ -199,8 +198,6 @@
 		if "Healthcare" in active_domains:
 			manage_invoice_submit_cancel(self, "on_submit")
 
-		on_submit_regional(self)
-
 	def validate_pos_paid_amount(self):
 		if len(self.payments) == 0 and self.is_pos:
 			frappe.throw(_("At least one mode of payment is required for POS invoice."))
@@ -256,8 +253,6 @@
 		if "Healthcare" in active_domains:
 			manage_invoice_submit_cancel(self, "on_cancel")
 
-		on_cancel_regional(self)
-
 	def update_status_updater_args(self):
 		if cint(self.update_stock):
 			self.status_updater.extend([{
diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py
index 5a765aa..34bbe7b 100644
--- a/erpnext/controllers/accounts_controller.py
+++ b/erpnext/controllers/accounts_controller.py
@@ -1138,11 +1138,3 @@
 @erpnext.allow_regional
 def validate_regional(doc):
 	pass
-
-@erpnext.allow_regional
-def on_submit_regional(doc):
-	pass
-
-@erpnext.allow_regional
-def on_cancel_regional(doc):
-	pass
diff --git a/erpnext/hooks.py b/erpnext/hooks.py
index e98ca4b..ccdd412 100644
--- a/erpnext/hooks.py
+++ b/erpnext/hooks.py
@@ -202,7 +202,8 @@
 		"validate": "erpnext.portal.doctype.products_settings.products_settings.home_page_is_products"
 	},
 	"Sales Invoice": {
-		"on_submit": "erpnext.regional.france.utils.create_transaction_log",
+		"on_submit": ["erpnext.regional.france.utils.create_transaction_log", "erpnext.regional.italy.utils.sales_invoice_on_submit"],
+		"on_cancel": "erpnext.regional.italy.utils.sales_invoice_on_cancel",
 		"on_trash": "erpnext.regional.check_deletion_permission"
 	},
 	"Payment Entry": {
@@ -305,7 +306,5 @@
 	'Italy': {
 		'erpnext.controllers.taxes_and_totals.update_itemised_tax_data': 'erpnext.regional.italy.utils.update_itemised_tax_data',
 		'erpnext.controllers.accounts_controller.validate_regional': 'erpnext.regional.italy.utils.sales_invoice_validate',
-		'erpnext.controllers.accounts_controller.on_submit_regional': 'erpnext.regional.italy.utils.sales_invoice_on_submit',
-		'erpnext.controllers.accounts_controller.on_cancel_regional': 'erpnext.regional.italy.utils.sales_invoice_on_cancel'
 	}
 }
diff --git a/erpnext/patches/v11_0/make_italian_localization_fields.py b/erpnext/patches/v11_0/make_italian_localization_fields.py
index cb65f23..fa77149 100644
--- a/erpnext/patches/v11_0/make_italian_localization_fields.py
+++ b/erpnext/patches/v11_0/make_italian_localization_fields.py
@@ -8,21 +8,21 @@
 
 
 def execute():
+	company = frappe.get_all('Company', filters = {'country': 'Italy'})
+	if not company:
+		return
 
-    company = frappe.get_all('Company', filters = {'country': 'Italy'})
-    if not company:
-      return
+	frappe.reload_doc('regional', 'report', 'electronic_invoice_register')
+	make_custom_fields()
+	setup_report()
 
-    make_custom_fields()
-    setup_report()
+	# Set state codes
+	condition = ""
+	for state, code in state_codes.items():
+		condition += " when '{0}' then '{1}'".format(frappe.db.escape(state), frappe.db.escape(code))
 
-    # Set state codes
-    condition = ""
-    for state, code in state_codes.items():
-      condition += " when '{0}' then '{1}'".format(frappe.db.escape(state), frappe.db.escape(code))
-
-    if condition:
-      frappe.db.sql("""
-        UPDATE tabAddress set state_code = (case state {condition} end)
-        WHERE country in ('Italy', 'Italia', 'Italian Republic', 'Repubblica Italiana')
-      """.format(condition=condition))
+	if condition:
+		frappe.db.sql("""
+			UPDATE tabAddress set state_code = (case state {condition} end)
+			WHERE country in ('Italy', 'Italia', 'Italian Republic', 'Repubblica Italiana')
+		""".format(condition=condition))
diff --git a/erpnext/regional/italy/setup.py b/erpnext/regional/italy/setup.py
index 3e9d7a2..a9de2d1 100644
--- a/erpnext/regional/italy/setup.py
+++ b/erpnext/regional/italy/setup.py
@@ -10,12 +10,12 @@
 from erpnext.regional.italy import fiscal_regimes, tax_exemption_reasons, mode_of_payment_codes, vat_collectability_options
 
 def setup(company=None, patch=True):
-    make_custom_fields()
-    setup_report()
+	make_custom_fields()
+	setup_report()
 
 def make_custom_fields(update=True):
-    invoice_item_fields = [
-        dict(fieldname='tax_rate', label='Tax Rate',
+	invoice_item_fields = [
+		dict(fieldname='tax_rate', label='Tax Rate',
 			fieldtype='Float', insert_after='description',
 			print_hide=1, hidden=1, read_only=1),
 		dict(fieldname='tax_amount', label='Tax Amount',
@@ -24,135 +24,135 @@
 		dict(fieldname='total_amount', label='Total Amount',
 			fieldtype='Currency', insert_after='tax_amount',
 			print_hide=1, hidden=1, read_only=1, options="currency")
-    ]
+	]
 
-    custom_fields = {
-        'Company': [
-            dict(fieldname='sb_e_invoicing', label='E-Invoicing',
-			    fieldtype='Section Break', insert_after='date_of_establishment', print_hide=1),
-            dict(fieldname='fiscal_regime', label='Fiscal Regime',
-			    fieldtype='Select', insert_after='sb_e_invoicing', print_hide=1,
-                options="\n".join(map(lambda x: x.decode('utf-8'), fiscal_regimes))),
-            dict(fieldname='fiscal_code', label='Fiscal Code', fieldtype='Data', insert_after='fiscal_regime', print_hide=1,
-                description=_("Applicable if the company is an Individual or a Proprietorship")),
-            dict(fieldname='vat_collectability', label='VAT Collectability',
-			    fieldtype='Select', insert_after='fiscal_code', print_hide=1,
-                options="\n".join(map(lambda x: x.decode('utf-8'), vat_collectability_options))),
-            dict(fieldname='cb_e_invoicing1', fieldtype='Column Break', insert_after='vat_collectability', print_hide=1),
-            dict(fieldname='registrar_office_province', label='Province of the Registrar Office',
-			    fieldtype='Data', insert_after='cb_e_invoicing1', print_hide=1, length=2),
-            dict(fieldname='registration_number', label='Registration Number',
-			    fieldtype='Data', insert_after='registrar_office_province', print_hide=1, length=20),
-            dict(fieldname='share_capital_amount', label='Share Capital',
-			    fieldtype='Currency', insert_after='registration_number', print_hide=1,
-                description=_('Applicable if the company is SpA, SApA or SRL')),
-            dict(fieldname='no_of_members', label='No of Members',
-			    fieldtype='Select', insert_after='share_capital_amount', print_hide=1,
-                options="\nSU-Socio Unico\nSM-Piu Soci", description=_("Applicable if the company is a limited liability company")),
-            dict(fieldname='liquidation_state', label='Liquidation State',
-			    fieldtype='Select', insert_after='no_of_members', print_hide=1,
-                options="\nLS-In Liquidazione\nLN-Non in Liquidazione")
-        ],
-        'Sales Taxes and Charges': [
-            dict(fieldname='tax_exemption_reason', label='Tax Exemption Reason',
-                fieldtype='Select', insert_after='included_in_print_rate', print_hide=1,
-                depends_on='eval:doc.charge_type!="Actual" && doc.rate==0.0',
-                options="\n" + "\n".join(map(lambda x: x.decode('utf-8'), tax_exemption_reasons))),
-            dict(fieldname='tax_exemption_law', label='Tax Exempt Under',
-                fieldtype='Text', insert_after='tax_exemption_reason', print_hide=1,
-                depends_on='eval:doc.charge_type!="Actual" && doc.rate==0.0')
-        ],
-        'Customer': [
-            dict(fieldname='fiscal_code', label='Fiscal Code', fieldtype='Data', insert_after='tax_id', print_hide=1),
-            dict(fieldname='recipient_code', label='Recipient Code',
-                fieldtype='Data', insert_after='fiscal_code', print_hide=1, default="0000000"),
-            dict(fieldname='pec', label='Recipient PEC',
-                fieldtype='Data', insert_after='fiscal_code', print_hide=1),
-            dict(fieldname='is_public_administration', label='Is Public Administration',
-			    fieldtype='Check', insert_after='is_internal_customer', print_hide=1,
-                description=_("Set this if the customer is a Public Administration company."),
-                depends_on='eval:doc.customer_type=="Company"'),
-            dict(fieldname='first_name', label='First Name', fieldtype='Data',
-                insert_after='salutation', print_hide=1, depends_on='eval:doc.customer_type!="Company"'),
-            dict(fieldname='last_name', label='Last Name', fieldtype='Data',
-                insert_after='first_name', print_hide=1, depends_on='eval:doc.customer_type!="Company"')
-        ],
-        'Mode of Payment': [
-            dict(fieldname='mode_of_payment_code', label='Code',
-		    fieldtype='Select', insert_after='included_in_print_rate', print_hide=1,
-            options="\n".join(map(lambda x: x.decode('utf-8'), mode_of_payment_codes)))
-        ],
-        'Payment Schedule': [
-            dict(fieldname='mode_of_payment_code', label='Code',
-                fieldtype='Select', insert_after='mode_of_payment', print_hide=1,
-                options="\n".join(map(lambda x: x.decode('utf-8'), mode_of_payment_codes)),
-                fetch_from="mode_of_payment.mode_of_payment_code", read_only=1),
-            dict(fieldname='bank_account', label='Bank Account',
-                fieldtype='Link', insert_after='mode_of_payment_code', print_hide=1,
-                options="Bank Account"),
-            dict(fieldname='bank_account_name', label='Bank Account Name',
-                fieldtype='Data', insert_after='bank_account', print_hide=1,
-                fetch_from="bank_account.account_name", read_only=1),
-            dict(fieldname='bank_account_no', label='Bank Account No',
-                fieldtype='Data', insert_after='bank_account_name', print_hide=1,
-                fetch_from="bank_account.bank_account_no", read_only=1),
-            dict(fieldname='bank_account_iban', label='IBAN',
-                fieldtype='Data', insert_after='bank_account_name', print_hide=1,
-                fetch_from="bank_account.iban", read_only=1),
-        ],
-        "Sales Invoice": [
-            dict(fieldname='vat_collectability', label='VAT Collectability',
-			    fieldtype='Select', insert_after='taxes_and_charges', print_hide=1,
-                options="\n".join(map(lambda x: x.decode('utf-8'), vat_collectability_options)),
-                fetch_from="company.vat_collectability"),
-            dict(fieldname='sb_e_invoicing_reference', label='E-Invoicing',
-			    fieldtype='Section Break', insert_after='pos_total_qty', print_hide=1),
-            dict(fieldname='company_tax_id', label='Company Tax ID',
-			    fieldtype='Data', insert_after='sb_e_invoicing_reference', print_hide=1, read_only=1,
-                fetch_from="company.tax_id"),
-            dict(fieldname='company_fiscal_code', label='Company Fiscal Code',
-			    fieldtype='Data', insert_after='company_tax_id', print_hide=1, read_only=1,
-                fetch_from="company.fiscal_code"),
-            dict(fieldname='company_fiscal_regime', label='Company Fiscal Regime',
-			    fieldtype='Data', insert_after='company_fiscal_code', print_hide=1, read_only=1,
-                fetch_from="company.fiscal_regime"),
-            dict(fieldname='cb_e_invoicing_reference', fieldtype='Column Break',
-                insert_after='company_fiscal_regime', print_hide=1),
-            dict(fieldname='customer_fiscal_code', label='Customer Fiscal Code',
-                fieldtype='Data', insert_after='cb_e_invoicing_reference', read_only=1,
-                fetch_from="customer.fiscal_code"),
-        ],
-        'Purchase Invoice Item': invoice_item_fields,
+	custom_fields = {
+		'Company': [
+			dict(fieldname='sb_e_invoicing', label='E-Invoicing',
+				fieldtype='Section Break', insert_after='date_of_establishment', print_hide=1),
+			dict(fieldname='fiscal_regime', label='Fiscal Regime',
+				fieldtype='Select', insert_after='sb_e_invoicing', print_hide=1,
+				options="\n".join(map(lambda x: x.decode('utf-8'), fiscal_regimes))),
+			dict(fieldname='fiscal_code', label='Fiscal Code', fieldtype='Data', insert_after='fiscal_regime', print_hide=1,
+				description=_("Applicable if the company is an Individual or a Proprietorship")),
+			dict(fieldname='vat_collectability', label='VAT Collectability',
+				fieldtype='Select', insert_after='fiscal_code', print_hide=1,
+				options="\n".join(map(lambda x: x.decode('utf-8'), vat_collectability_options))),
+			dict(fieldname='cb_e_invoicing1', fieldtype='Column Break', insert_after='vat_collectability', print_hide=1),
+			dict(fieldname='registrar_office_province', label='Province of the Registrar Office',
+				fieldtype='Data', insert_after='cb_e_invoicing1', print_hide=1, length=2),
+			dict(fieldname='registration_number', label='Registration Number',
+				fieldtype='Data', insert_after='registrar_office_province', print_hide=1, length=20),
+			dict(fieldname='share_capital_amount', label='Share Capital',
+				fieldtype='Currency', insert_after='registration_number', print_hide=1,
+				description=_('Applicable if the company is SpA, SApA or SRL')),
+			dict(fieldname='no_of_members', label='No of Members',
+				fieldtype='Select', insert_after='share_capital_amount', print_hide=1,
+				options="\nSU-Socio Unico\nSM-Piu Soci", description=_("Applicable if the company is a limited liability company")),
+			dict(fieldname='liquidation_state', label='Liquidation State',
+				fieldtype='Select', insert_after='no_of_members', print_hide=1,
+				options="\nLS-In Liquidazione\nLN-Non in Liquidazione")
+		],
+		'Sales Taxes and Charges': [
+			dict(fieldname='tax_exemption_reason', label='Tax Exemption Reason',
+				fieldtype='Select', insert_after='included_in_print_rate', print_hide=1,
+				depends_on='eval:doc.charge_type!="Actual" && doc.rate==0.0',
+				options="\n" + "\n".join(map(lambda x: x.decode('utf-8'), tax_exemption_reasons))),
+			dict(fieldname='tax_exemption_law', label='Tax Exempt Under',
+				fieldtype='Text', insert_after='tax_exemption_reason', print_hide=1,
+				depends_on='eval:doc.charge_type!="Actual" && doc.rate==0.0')
+		],
+		'Customer': [
+			dict(fieldname='fiscal_code', label='Fiscal Code', fieldtype='Data', insert_after='tax_id', print_hide=1),
+			dict(fieldname='recipient_code', label='Recipient Code',
+				fieldtype='Data', insert_after='fiscal_code', print_hide=1, default="0000000"),
+			dict(fieldname='pec', label='Recipient PEC',
+				fieldtype='Data', insert_after='fiscal_code', print_hide=1),
+			dict(fieldname='is_public_administration', label='Is Public Administration',
+				fieldtype='Check', insert_after='is_internal_customer', print_hide=1,
+				description=_("Set this if the customer is a Public Administration company."),
+				depends_on='eval:doc.customer_type=="Company"'),
+			dict(fieldname='first_name', label='First Name', fieldtype='Data',
+				insert_after='salutation', print_hide=1, depends_on='eval:doc.customer_type!="Company"'),
+			dict(fieldname='last_name', label='Last Name', fieldtype='Data',
+				insert_after='first_name', print_hide=1, depends_on='eval:doc.customer_type!="Company"')
+		],
+		'Mode of Payment': [
+			dict(fieldname='mode_of_payment_code', label='Code',
+			fieldtype='Select', insert_after='included_in_print_rate', print_hide=1,
+			options="\n".join(map(lambda x: x.decode('utf-8'), mode_of_payment_codes)))
+		],
+		'Payment Schedule': [
+			dict(fieldname='mode_of_payment_code', label='Code',
+				fieldtype='Select', insert_after='mode_of_payment', print_hide=1,
+				options="\n".join(map(lambda x: x.decode('utf-8'), mode_of_payment_codes)),
+				fetch_from="mode_of_payment.mode_of_payment_code", read_only=1),
+			dict(fieldname='bank_account', label='Bank Account',
+				fieldtype='Link', insert_after='mode_of_payment_code', print_hide=1,
+				options="Bank Account"),
+			dict(fieldname='bank_account_name', label='Bank Account Name',
+				fieldtype='Data', insert_after='bank_account', print_hide=1,
+				fetch_from="bank_account.account_name", read_only=1),
+			dict(fieldname='bank_account_no', label='Bank Account No',
+				fieldtype='Data', insert_after='bank_account_name', print_hide=1,
+				fetch_from="bank_account.bank_account_no", read_only=1),
+			dict(fieldname='bank_account_iban', label='IBAN',
+				fieldtype='Data', insert_after='bank_account_name', print_hide=1,
+				fetch_from="bank_account.iban", read_only=1),
+		],
+		"Sales Invoice": [
+			dict(fieldname='vat_collectability', label='VAT Collectability',
+				fieldtype='Select', insert_after='taxes_and_charges', print_hide=1,
+				options="\n".join(map(lambda x: x.decode('utf-8'), vat_collectability_options)),
+				fetch_from="company.vat_collectability"),
+			dict(fieldname='sb_e_invoicing_reference', label='E-Invoicing',
+				fieldtype='Section Break', insert_after='pos_total_qty', print_hide=1),
+			dict(fieldname='company_tax_id', label='Company Tax ID',
+				fieldtype='Data', insert_after='sb_e_invoicing_reference', print_hide=1, read_only=1,
+				fetch_from="company.tax_id"),
+			dict(fieldname='company_fiscal_code', label='Company Fiscal Code',
+				fieldtype='Data', insert_after='company_tax_id', print_hide=1, read_only=1,
+				fetch_from="company.fiscal_code"),
+			dict(fieldname='company_fiscal_regime', label='Company Fiscal Regime',
+				fieldtype='Data', insert_after='company_fiscal_code', print_hide=1, read_only=1,
+				fetch_from="company.fiscal_regime"),
+			dict(fieldname='cb_e_invoicing_reference', fieldtype='Column Break',
+				insert_after='company_fiscal_regime', print_hide=1),
+			dict(fieldname='customer_fiscal_code', label='Customer Fiscal Code',
+				fieldtype='Data', insert_after='cb_e_invoicing_reference', read_only=1,
+				fetch_from="customer.fiscal_code"),
+		],
+		'Purchase Invoice Item': invoice_item_fields,
 		'Sales Order Item': invoice_item_fields,
 		'Delivery Note Item': invoice_item_fields,
-        'Sales Invoice Item': invoice_item_fields,
+		'Sales Invoice Item': invoice_item_fields,
 		'Quotation Item': invoice_item_fields,
 		'Purchase Order Item': invoice_item_fields,
 		'Purchase Receipt Item': invoice_item_fields,
 		'Supplier Quotation Item': invoice_item_fields,
-        'Address': [
-            dict(fieldname='country_code', label='Country Code',
-			    fieldtype='Data', insert_after='country', print_hide=1, read_only=1,
-                fetch_from="country.code"),
-            dict(fieldname='state_code', label='State Code',
-			    fieldtype='Data', insert_after='state', print_hide=1)
-        ]
-    }
+		'Address': [
+			dict(fieldname='country_code', label='Country Code',
+				fieldtype='Data', insert_after='country', print_hide=1, read_only=1,
+				fetch_from="country.code"),
+			dict(fieldname='state_code', label='State Code',
+				fieldtype='Data', insert_after='state', print_hide=1)
+		]
+	}
 
-    create_custom_fields(custom_fields, ignore_validate = frappe.flags.in_patch, update=update)
+	create_custom_fields(custom_fields, ignore_validate = frappe.flags.in_patch, update=update)
 
 def setup_report():
-    report_name = 'Electronic Invoice Register'
+	report_name = 'Electronic Invoice Register'
 
-    frappe.db.sql(""" update `tabReport` set disabled = 0 where
-        name = %s """, report_name)
+	frappe.db.sql(""" update `tabReport` set disabled = 0 where
+		name = %s """, report_name)
 
-    if not frappe.db.get_value('Custom Role', dict(report=report_name)):
-        frappe.get_doc(dict(
-            doctype='Custom Role',
-            report=report_name,
-            roles= [
-                dict(role='Accounts User'),
-                dict(role='Accounts Manager')
-            ]
-        )).insert()
+	if not frappe.db.get_value('Custom Role', dict(report=report_name)):
+		frappe.get_doc(dict(
+			doctype='Custom Role',
+			report=report_name,
+			roles= [
+				dict(role='Accounts User'),
+				dict(role='Accounts Manager')
+			]
+		)).insert()
diff --git a/erpnext/regional/italy/utils.py b/erpnext/regional/italy/utils.py
index 51aa93a..c86ad78 100644
--- a/erpnext/regional/italy/utils.py
+++ b/erpnext/regional/italy/utils.py
@@ -183,6 +183,9 @@
 #Preflight for successful e-invoice export.
 def sales_invoice_validate(doc):
 	#Validate company
+	if doc.doctype != 'Sales Invoice':
+		return
+
 	if not doc.company_address:
 		frappe.throw(_("Please set an Address on the Company '%s'" % doc.company), title=_("E-Invoicing Information Missing"))
 	else:
@@ -219,8 +222,12 @@
 
 
 #Ensure payment details are valid for e-invoice.
-def sales_invoice_on_submit(doc):
+def sales_invoice_on_submit(doc, method):
 	#Validate payment details
+	if get_company_country(doc.company) not in ['Italy',
+		'Italia', 'Italian Republic', 'Repubblica Italiana']:
+		return
+
 	if not len(doc.payment_schedule):
 		frappe.throw(_("Please set the Payment Schedule"), title=_("E-Invoicing Information Missing"))
 	else:
@@ -244,10 +251,17 @@
 	save_file(xml_filename, invoice_xml, dt=doc.doctype, dn=doc.name, is_private=True)
 
 #Delete e-invoice attachment on cancel.
-def sales_invoice_on_cancel(doc):
+def sales_invoice_on_cancel(doc, method):
+	if get_company_country(doc.company) not in ['Italy',
+		'Italia', 'Italian Republic', 'Repubblica Italiana']:
+		return
+
 	for attachment in get_e_invoice_attachments(doc):
 		remove_file(attachment.name, attached_to_doctype=doc.doctype, attached_to_name=doc.name)
 
+def get_company_country(company):
+	return frappe.get_cached_value('Company', company, 'country')
+
 def get_e_invoice_attachments(invoice):
 	out = []
 	attachments = get_attachments(invoice.doctype, invoice.name)
diff --git a/erpnext/stock/doctype/material_request/material_request.js b/erpnext/stock/doctype/material_request/material_request.js
index 2b0ed38..cb4afef 100644
--- a/erpnext/stock/doctype/material_request/material_request.js
+++ b/erpnext/stock/doctype/material_request/material_request.js
@@ -85,7 +85,7 @@
 
 				// stop
 				frm.add_custom_button(__('Stop'),
-					() => frm.events.update_status(frm, 'Stop'));
+					() => frm.events.update_status(frm, 'Stopped'));
 
 			}
 		}