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')