feat(regional): QR Code generation for Saudi Arabia Sales Invoices
diff --git a/erpnext/regional/__init__.py b/erpnext/regional/__init__.py
index 45a689e..3591be0 100644
--- a/erpnext/regional/__init__.py
+++ b/erpnext/regional/__init__.py
@@ -7,6 +7,9 @@
 from frappe import _
 
 from erpnext import get_region
+from pyqrcode import create as qr_create
+import io
+import os
 
 
 def check_deletion_permission(doc, method):
@@ -31,3 +34,72 @@
 		"document_name": doc.name,
 		"data": data
 	}).insert(ignore_permissions=True)
+
+
+def create_qr_code(doc, method):
+	"""Create QR Code after inserting Sales Inv
+	"""
+
+	region = get_region(doc.company)
+	if region not in ['Saudi Arabia']:
+		return
+
+	# if QR Code field not present, do nothing
+	if not hasattr(doc, 'qr_code'):
+		return
+
+	# Don't create QR Code if it already exists
+	qr_code = doc.get("qr_code")
+	if qr_code and frappe.db.exists({"doctype": "File", "file_url": qr_code}):
+		return
+
+	fields = frappe.get_meta('Sales Invoice').fields
+	
+	for field in fields:
+		if field.fieldname == 'qr_code' and field.fieldtype == 'Attach Image':
+			# Creating public url to print format
+			default_print_format = frappe.db.get_value('Property Setter', dict(property='default_print_format', doc_type=doc.doctype), "value")
+			
+			# System Language
+			language = frappe.get_system_settings('language')
+			
+			# creating qr code for the url
+			url = f"{ frappe.utils.get_url() }/{ doc.doctype }/{ doc.name }?format={ default_print_format or 'Standard' }&_lang={ language }&key={ doc.get_signature() }"
+			qr_image = io.BytesIO()
+			url = qr_create(url, error='L')
+			url.png(qr_image, scale=2, quiet_zone=1)
+			
+			# making file
+			filename = f"QR-CODE-{doc.name}.png".replace(os.path.sep, "__")
+			_file = frappe.get_doc({
+				"doctype": "File",
+				"file_name": filename,
+				"is_private": 0,
+				"content": qr_image.getvalue()
+			})
+
+			_file.save()
+
+			# assigning to document
+			doc.db_set('qr_code', _file.file_url)
+			doc.notify_update()
+
+			break
+
+		else:
+			pass
+
+def delete_qr_code_file(doc, method):
+	"""Delete QR Code on deleted sales invoice"""
+	
+	region = get_region(doc.company)
+	if region not in ['Saudi Arabia']:
+		return
+
+	if hasattr(doc, 'qr_code'):
+		if doc.get('qr_code'):
+			file_doc = frappe.get_list('File', {
+				'file_url': doc.qr_code
+			})
+			if len(file_doc):
+				frappe.delete_doc('File', file_doc[0].name)
\ No newline at end of file
diff --git a/erpnext/regional/saudi_arabia/setup.py b/erpnext/regional/saudi_arabia/setup.py
index 0534967..f559000 100644
--- a/erpnext/regional/saudi_arabia/setup.py
+++ b/erpnext/regional/saudi_arabia/setup.py
@@ -2,18 +2,18 @@
 # License: GNU General Public License v3. See license.txt
 
 from __future__ import unicode_literals
-
 import frappe
 from frappe.permissions import add_permission, update_permission_property
-from erpnext.regional.united_arab_emirates.setup import make_custom_fields, add_print_formats
+from erpnext.regional.united_arab_emirates.setup import make_custom_fields as uae_custom_fields, add_print_formats
 from erpnext.regional.saudi_arabia.wizard.operations.setup_ksa_vat_setting import create_ksa_vat_setting
-
+from frappe.custom.doctype.custom_field.custom_field import create_custom_field
 
 def setup(company=None, patch=True):
-	make_custom_fields()
+	uae_custom_fields()
 	add_print_formats()
 	add_permissions()
 	create_ksa_vat_setting(company)
+	make_custom_fields()
 	
 
 def add_permissions():
@@ -26,3 +26,12 @@
 
 	"""Enable KSA VAT Report"""
 	frappe.db.set_value('Report', 'KSA VAT', 'disabled', 0)
+
+def make_custom_fields():
+	qr_code_field = dict(
+		fieldname='qr_code', 
+		label='QR Code', 
+		fieldtype='Attach Image', 
+		read_only=1, no_copy=1, hidden=1)
+	
+	create_custom_field('Sales Invoice', qr_code_field)