Transaction Log for France (#12795)

* Regional overrides for France

* Addition of tests and documentation
diff --git a/erpnext/docs/user/manual/en/regional/france/index.txt b/erpnext/docs/user/manual/en/regional/france/index.txt
index 2edf323..84fcb9e 100644
--- a/erpnext/docs/user/manual/en/regional/france/index.txt
+++ b/erpnext/docs/user/manual/en/regional/france/index.txt
@@ -1 +1,2 @@
 fichier_des_ecritures_comptables
+local_overrides
diff --git a/erpnext/docs/user/manual/en/regional/france/local_overrides.md b/erpnext/docs/user/manual/en/regional/france/local_overrides.md
new file mode 100644
index 0000000..59eb199
--- /dev/null
+++ b/erpnext/docs/user/manual/en/regional/france/local_overrides.md
@@ -0,0 +1,7 @@
+# Sales and Payment Transactions
+
+In order to be compliant with the latest finance law applicable to POS software, ERPNext automatically registers all sales and payment transactions in a chained log.
+
+If your country is set to "France", the deletion of sales and payment transactions will also not be permitted, even if the appropriate permissions are given to the user.
+
+Please note that ERPNext is not yet fully compliant with the 2016 Finance Law.
diff --git a/erpnext/hooks.py b/erpnext/hooks.py
index 45abbdb..442ddf5 100644
--- a/erpnext/hooks.py
+++ b/erpnext/hooks.py
@@ -198,13 +198,19 @@
 	"Website Settings": {
 		"validate": "erpnext.portal.doctype.products_settings.products_settings.home_page_is_products"
 	},
+	"Sales Invoice": {
+		'validate': 'erpnext.regional.india.utils.set_place_of_supply',
+		"on_submit": "erpnext.regional.france.utils.create_transaction_log",
+		"on_trash": "erpnext.regional.france.utils.check_deletion_permission"
+	},
 	"Payment Entry": {
-		"on_submit": "erpnext.accounts.doctype.payment_request.payment_request.make_status_as_paid"
+		"on_submit": ["erpnext.regional.france.utils.create_transaction_log", "erpnext.accounts.doctype.payment_request.payment_request.make_status_as_paid"],
+		"on_trash": "erpnext.regional.france.utils.check_deletion_permission"
 	},
 	'Address': {
 		'validate': 'erpnext.regional.india.utils.validate_gstin_for_india'
 	},
-	('Sales Invoice', 'Purchase Invoice'): {
+	'Purchase Invoice': {
 		'validate': 'erpnext.regional.india.utils.set_place_of_supply'
 	}
 }
@@ -257,6 +263,9 @@
 payment_gateway_enabled = "erpnext.accounts.utils.create_payment_gateway_account"
 
 regional_overrides = {
+	'France': {
+		'erpnext.tests.test_regional.test_method': 'erpnext.regional.france.utils.test_method'
+	},
 	'India': {
 		'erpnext.tests.test_regional.test_method': 'erpnext.regional.india.utils.test_method',
 		'erpnext.controllers.taxes_and_totals.get_itemised_tax_breakup_header': 'erpnext.regional.india.utils.get_itemised_tax_breakup_header',
diff --git a/erpnext/regional/france/utils.py b/erpnext/regional/france/utils.py
new file mode 100644
index 0000000..c963d74
--- /dev/null
+++ b/erpnext/regional/france/utils.py
@@ -0,0 +1,35 @@
+# Copyright (c) 2018, Frappe Technologies and contributors
+# For license information, please see license.txt
+
+import frappe
+from frappe import _
+from erpnext import get_region
+
+def create_transaction_log(doc, method):
+	region = get_region()
+	if region not in ["France"]:
+		return
+
+	else:
+
+		data = str(doc.as_dict())
+
+		frappe.get_doc({
+			"doctype": "Transaction Log",
+			"reference_doctype": doc.doctype,
+			"document_name": doc.name,
+			"data": data
+		}).insert(ignore_permissions=True)
+
+def check_deletion_permission(doc, method):
+	region = get_region()
+	if region not in ["France"]:
+		return
+
+	else:
+		frappe.throw(_("Deletion is not permitted for country {0}".format(region)))
+
+# don't remove this function it is used in tests
+def test_method():
+	'''test function'''
+	return 'overridden'
diff --git a/erpnext/tests/test_regional.py b/erpnext/tests/test_regional.py
index 5d9628f..7524ccc 100644
--- a/erpnext/tests/test_regional.py
+++ b/erpnext/tests/test_regional.py
@@ -10,4 +10,7 @@
 		self.assertEqual(test_method(), 'overridden')
 
 		frappe.flags.country = 'Nepal'
-		self.assertEqual(test_method(), 'original')
\ No newline at end of file
+		self.assertEqual(test_method(), 'original')
+
+		frappe.flags.country = 'France'
+		self.assertEqual(test_method(), 'overridden')