refactor(region): Splitting of KSA(Saudi Arabia) Regional logic from ERPNext (#33895)
* feat: remove KSA regional code
diff --git a/erpnext/hooks.py b/erpnext/hooks.py
index fd19d25..fba886c 100644
--- a/erpnext/hooks.py
+++ b/erpnext/hooks.py
@@ -311,15 +311,10 @@
"on_submit": [
"erpnext.regional.create_transaction_log",
"erpnext.regional.italy.utils.sales_invoice_on_submit",
- "erpnext.regional.saudi_arabia.utils.create_qr_code",
],
- "on_cancel": [
- "erpnext.regional.italy.utils.sales_invoice_on_cancel",
- "erpnext.regional.saudi_arabia.utils.delete_qr_code_file",
- ],
+ "on_cancel": ["erpnext.regional.italy.utils.sales_invoice_on_cancel"],
"on_trash": "erpnext.regional.check_deletion_permission",
},
- "POS Invoice": {"on_submit": ["erpnext.regional.saudi_arabia.utils.create_qr_code"]},
"Purchase Invoice": {
"validate": [
"erpnext.regional.united_arab_emirates.utils.update_grand_total_for_rcm",
@@ -347,7 +342,6 @@
"Email Unsubscribe": {
"after_insert": "erpnext.crm.doctype.email_campaign.email_campaign.unsubscribe_recipient"
},
- "Company": {"on_trash": ["erpnext.regional.saudi_arabia.utils.delete_vat_settings_for_company"]},
"Integration Request": {
"validate": "erpnext.accounts.doctype.payment_request.payment_request.validate_payment"
},
diff --git a/erpnext/patches.txt b/erpnext/patches.txt
index e6be933..2abd65b 100644
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -250,18 +250,14 @@
erpnext.patches.v13_0.update_category_in_ltds_certificate
erpnext.patches.v13_0.fetch_thumbnail_in_website_items
erpnext.patches.v13_0.update_maintenance_schedule_field_in_visit
-erpnext.patches.v13_0.create_ksa_vat_custom_fields # 07-01-2022
erpnext.patches.v14_0.migrate_crm_settings
-erpnext.patches.v13_0.rename_ksa_qr_field
erpnext.patches.v13_0.wipe_serial_no_field_for_0_qty
-erpnext.patches.v13_0.disable_ksa_print_format_for_others # 16-12-2021
erpnext.patches.v13_0.agriculture_deprecation_warning
erpnext.patches.v13_0.hospitality_deprecation_warning
erpnext.patches.v13_0.update_asset_quantity_field
erpnext.patches.v13_0.delete_bank_reconciliation_detail
erpnext.patches.v13_0.enable_provisional_accounting
erpnext.patches.v13_0.non_profit_deprecation_warning
-erpnext.patches.v13_0.enable_ksa_vat_docs #1
erpnext.patches.v13_0.show_india_localisation_deprecation_warning
erpnext.patches.v13_0.show_hr_payroll_deprecation_warning
erpnext.patches.v13_0.reset_corrupt_defaults
@@ -269,6 +265,8 @@
erpnext.patches.v15_0.delete_taxjar_doctypes
erpnext.patches.v15_0.create_asset_depreciation_schedules_from_assets
erpnext.patches.v14_0.update_reference_due_date_in_journal_entry
+erpnext.patches.v15_0.saudi_depreciation_warning
+erpnext.patches.v15_0.delete_saudi_doctypes
[post_model_sync]
execute:frappe.delete_doc_if_exists('Workspace', 'ERPNext Integrations Settings')
diff --git a/erpnext/patches/v13_0/create_ksa_vat_custom_fields.py b/erpnext/patches/v13_0/create_ksa_vat_custom_fields.py
deleted file mode 100644
index 093463a..0000000
--- a/erpnext/patches/v13_0/create_ksa_vat_custom_fields.py
+++ /dev/null
@@ -1,11 +0,0 @@
-import frappe
-
-from erpnext.regional.saudi_arabia.setup import make_custom_fields
-
-
-def execute():
- company = frappe.get_all("Company", filters={"country": "Saudi Arabia"})
- if not company:
- return
-
- make_custom_fields()
diff --git a/erpnext/patches/v13_0/disable_ksa_print_format_for_others.py b/erpnext/patches/v13_0/disable_ksa_print_format_for_others.py
deleted file mode 100644
index 84b6c37..0000000
--- a/erpnext/patches/v13_0/disable_ksa_print_format_for_others.py
+++ /dev/null
@@ -1,19 +0,0 @@
-# Copyright (c) 2020, Wahni Green Technologies and Contributors
-# License: GNU General Public License v3. See license.txt
-
-import frappe
-
-from erpnext.regional.saudi_arabia.setup import add_print_formats
-
-
-def execute():
- company = frappe.get_all("Company", filters={"country": "Saudi Arabia"})
- if company:
- add_print_formats()
- return
-
- if frappe.db.exists("DocType", "Print Format"):
- frappe.reload_doc("regional", "print_format", "ksa_vat_invoice", force=True)
- frappe.reload_doc("regional", "print_format", "ksa_pos_invoice", force=True)
- for d in ("KSA VAT Invoice", "KSA POS Invoice"):
- frappe.db.set_value("Print Format", d, "disabled", 1)
diff --git a/erpnext/patches/v13_0/enable_ksa_vat_docs.py b/erpnext/patches/v13_0/enable_ksa_vat_docs.py
deleted file mode 100644
index 4adf4d7..0000000
--- a/erpnext/patches/v13_0/enable_ksa_vat_docs.py
+++ /dev/null
@@ -1,12 +0,0 @@
-import frappe
-
-from erpnext.regional.saudi_arabia.setup import add_permissions, add_print_formats
-
-
-def execute():
- company = frappe.get_all("Company", filters={"country": "Saudi Arabia"})
- if not company:
- return
-
- add_print_formats()
- add_permissions()
diff --git a/erpnext/patches/v13_0/rename_ksa_qr_field.py b/erpnext/patches/v13_0/rename_ksa_qr_field.py
deleted file mode 100644
index e4b9141..0000000
--- a/erpnext/patches/v13_0/rename_ksa_qr_field.py
+++ /dev/null
@@ -1,36 +0,0 @@
-# Copyright (c) 2020, Wahni Green Technologies and Contributors
-# License: GNU General Public License v3. See license.txt
-
-import frappe
-from frappe.custom.doctype.custom_field.custom_field import create_custom_fields
-from frappe.model.utils.rename_field import rename_field
-
-
-def execute():
- company = frappe.get_all("Company", filters={"country": "Saudi Arabia"})
- if not company:
- return
-
- if frappe.db.exists("DocType", "Sales Invoice"):
- frappe.reload_doc("accounts", "doctype", "sales_invoice", force=True)
-
- # rename_field method assumes that the field already exists or the doc is synced
- if not frappe.db.has_column("Sales Invoice", "ksa_einv_qr"):
- create_custom_fields(
- {
- "Sales Invoice": [
- dict(
- fieldname="ksa_einv_qr",
- label="KSA E-Invoicing QR",
- fieldtype="Attach Image",
- read_only=1,
- no_copy=1,
- hidden=1,
- )
- ]
- }
- )
-
- if frappe.db.has_column("Sales Invoice", "qr_code"):
- rename_field("Sales Invoice", "qr_code", "ksa_einv_qr")
- frappe.delete_doc_if_exists("Custom Field", "Sales Invoice-qr_code")
diff --git a/erpnext/patches/v15_0/delete_saudi_doctypes.py b/erpnext/patches/v15_0/delete_saudi_doctypes.py
new file mode 100644
index 0000000..371e335
--- /dev/null
+++ b/erpnext/patches/v15_0/delete_saudi_doctypes.py
@@ -0,0 +1,25 @@
+import click
+import frappe
+
+
+def execute():
+ if "ksa" in frappe.get_installed_apps():
+ return
+
+ doctypes = ["KSA VAT Setting", "KSA VAT Purchase Account", "KSA VAT Sales Account"]
+ for doctype in doctypes:
+ frappe.delete_doc("DocType", doctype, ignore_missing=True)
+
+ print_formats = ["KSA POS Invoice", "KSA VAT Invoice"]
+ for print_format in print_formats:
+ frappe.delete_doc("Print Format", print_format, ignore_missing=True, force=True)
+
+ reports = ["KSA VAT"]
+ for report in reports:
+ frappe.delete_doc("Report", report, ignore_missing=True, force=True)
+
+ click.secho(
+ "Region Saudi Arabia(KSA) is moved to a separate app"
+ "Please install the app to continue using the module: https://github.com/8848digital/KSA",
+ fg="yellow",
+ )
diff --git a/erpnext/patches/v15_0/saudi_depreciation_warning.py b/erpnext/patches/v15_0/saudi_depreciation_warning.py
new file mode 100644
index 0000000..6af8efe
--- /dev/null
+++ b/erpnext/patches/v15_0/saudi_depreciation_warning.py
@@ -0,0 +1,12 @@
+import click
+import frappe
+
+
+def execute():
+ if "ksa" in frappe.get_installed_apps():
+ return
+ click.secho(
+ "Region Saudi Arabia(KSA) is moved to a separate app\n"
+ "Please install the app to continue using the KSA Features: https://github.com/8848digital/KSA",
+ fg="yellow",
+ )
diff --git a/erpnext/regional/doctype/ksa_vat_purchase_account/__init__.py b/erpnext/regional/doctype/ksa_vat_purchase_account/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/regional/doctype/ksa_vat_purchase_account/__init__.py
+++ /dev/null
diff --git a/erpnext/regional/doctype/ksa_vat_purchase_account/ksa_vat_purchase_account.json b/erpnext/regional/doctype/ksa_vat_purchase_account/ksa_vat_purchase_account.json
deleted file mode 100644
index 89ba3e9..0000000
--- a/erpnext/regional/doctype/ksa_vat_purchase_account/ksa_vat_purchase_account.json
+++ /dev/null
@@ -1,49 +0,0 @@
-{
- "actions": [],
- "creation": "2021-07-13 09:17:09.862163",
- "doctype": "DocType",
- "editable_grid": 1,
- "engine": "InnoDB",
- "field_order": [
- "title",
- "item_tax_template",
- "account"
- ],
- "fields": [
- {
- "fieldname": "account",
- "fieldtype": "Link",
- "in_list_view": 1,
- "label": "Account",
- "options": "Account",
- "reqd": 1
- },
- {
- "fieldname": "title",
- "fieldtype": "Data",
- "in_list_view": 1,
- "label": "Title",
- "reqd": 1
- },
- {
- "fieldname": "item_tax_template",
- "fieldtype": "Link",
- "in_list_view": 1,
- "label": "Item Tax Template",
- "options": "Item Tax Template",
- "reqd": 1
- }
- ],
- "index_web_pages_for_search": 1,
- "istable": 1,
- "links": [],
- "modified": "2021-08-04 06:42:38.205597",
- "modified_by": "Administrator",
- "module": "Regional",
- "name": "KSA VAT Purchase Account",
- "owner": "Administrator",
- "permissions": [],
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 1
-}
\ No newline at end of file
diff --git a/erpnext/regional/doctype/ksa_vat_purchase_account/ksa_vat_purchase_account.py b/erpnext/regional/doctype/ksa_vat_purchase_account/ksa_vat_purchase_account.py
deleted file mode 100644
index 3920bc5..0000000
--- a/erpnext/regional/doctype/ksa_vat_purchase_account/ksa_vat_purchase_account.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright (c) 2021, Havenir Solutions and contributors
-# For license information, please see license.txt
-
-# import frappe
-from frappe.model.document import Document
-
-
-class KSAVATPurchaseAccount(Document):
- pass
diff --git a/erpnext/regional/doctype/ksa_vat_sales_account/__init__.py b/erpnext/regional/doctype/ksa_vat_sales_account/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/regional/doctype/ksa_vat_sales_account/__init__.py
+++ /dev/null
diff --git a/erpnext/regional/doctype/ksa_vat_sales_account/ksa_vat_sales_account.js b/erpnext/regional/doctype/ksa_vat_sales_account/ksa_vat_sales_account.js
deleted file mode 100644
index 72613f4..0000000
--- a/erpnext/regional/doctype/ksa_vat_sales_account/ksa_vat_sales_account.js
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright (c) 2021, Havenir Solutions and contributors
-// For license information, please see license.txt
-
-frappe.ui.form.on('KSA VAT Sales Account', {
- // refresh: function(frm) {
-
- // }
-});
diff --git a/erpnext/regional/doctype/ksa_vat_sales_account/ksa_vat_sales_account.json b/erpnext/regional/doctype/ksa_vat_sales_account/ksa_vat_sales_account.json
deleted file mode 100644
index df27478..0000000
--- a/erpnext/regional/doctype/ksa_vat_sales_account/ksa_vat_sales_account.json
+++ /dev/null
@@ -1,49 +0,0 @@
-{
- "actions": [],
- "creation": "2021-07-13 08:46:33.820968",
- "doctype": "DocType",
- "editable_grid": 1,
- "engine": "InnoDB",
- "field_order": [
- "title",
- "item_tax_template",
- "account"
- ],
- "fields": [
- {
- "fieldname": "account",
- "fieldtype": "Link",
- "in_list_view": 1,
- "label": "Account",
- "options": "Account",
- "reqd": 1
- },
- {
- "fieldname": "title",
- "fieldtype": "Data",
- "in_list_view": 1,
- "label": "Title",
- "reqd": 1
- },
- {
- "fieldname": "item_tax_template",
- "fieldtype": "Link",
- "in_list_view": 1,
- "label": "Item Tax Template",
- "options": "Item Tax Template",
- "reqd": 1
- }
- ],
- "index_web_pages_for_search": 1,
- "istable": 1,
- "links": [],
- "modified": "2021-08-04 06:42:00.081407",
- "modified_by": "Administrator",
- "module": "Regional",
- "name": "KSA VAT Sales Account",
- "owner": "Administrator",
- "permissions": [],
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 1
-}
\ No newline at end of file
diff --git a/erpnext/regional/doctype/ksa_vat_sales_account/ksa_vat_sales_account.py b/erpnext/regional/doctype/ksa_vat_sales_account/ksa_vat_sales_account.py
deleted file mode 100644
index 7c2689f..0000000
--- a/erpnext/regional/doctype/ksa_vat_sales_account/ksa_vat_sales_account.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright (c) 2021, Havenir Solutions and contributors
-# For license information, please see license.txt
-
-# import frappe
-from frappe.model.document import Document
-
-
-class KSAVATSalesAccount(Document):
- pass
diff --git a/erpnext/regional/doctype/ksa_vat_sales_account/test_ksa_vat_sales_account.py b/erpnext/regional/doctype/ksa_vat_sales_account/test_ksa_vat_sales_account.py
deleted file mode 100644
index 1d6a6a7..0000000
--- a/erpnext/regional/doctype/ksa_vat_sales_account/test_ksa_vat_sales_account.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright (c) 2021, Havenir Solutions and Contributors
-# See license.txt
-
-# import frappe
-import unittest
-
-
-class TestKSAVATSalesAccount(unittest.TestCase):
- pass
diff --git a/erpnext/regional/doctype/ksa_vat_setting/__init__.py b/erpnext/regional/doctype/ksa_vat_setting/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/regional/doctype/ksa_vat_setting/__init__.py
+++ /dev/null
diff --git a/erpnext/regional/doctype/ksa_vat_setting/ksa_vat_setting.js b/erpnext/regional/doctype/ksa_vat_setting/ksa_vat_setting.js
deleted file mode 100644
index 00b62b9..0000000
--- a/erpnext/regional/doctype/ksa_vat_setting/ksa_vat_setting.js
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright (c) 2021, Havenir Solutions and contributors
-// For license information, please see license.txt
-
-frappe.ui.form.on('KSA VAT Setting', {
- onload: function () {
- frappe.breadcrumbs.add('Accounts', 'KSA VAT Setting');
- }
-});
diff --git a/erpnext/regional/doctype/ksa_vat_setting/ksa_vat_setting.json b/erpnext/regional/doctype/ksa_vat_setting/ksa_vat_setting.json
deleted file mode 100644
index 3361946..0000000
--- a/erpnext/regional/doctype/ksa_vat_setting/ksa_vat_setting.json
+++ /dev/null
@@ -1,49 +0,0 @@
-{
- "actions": [],
- "autoname": "field:company",
- "creation": "2021-07-13 08:49:01.100356",
- "doctype": "DocType",
- "editable_grid": 1,
- "engine": "InnoDB",
- "field_order": [
- "company",
- "ksa_vat_sales_accounts",
- "ksa_vat_purchase_accounts"
- ],
- "fields": [
- {
- "fieldname": "company",
- "fieldtype": "Link",
- "in_list_view": 1,
- "label": "Company",
- "options": "Company",
- "reqd": 1,
- "unique": 1
- },
- {
- "fieldname": "ksa_vat_sales_accounts",
- "fieldtype": "Table",
- "label": "KSA VAT Sales Accounts",
- "options": "KSA VAT Sales Account",
- "reqd": 1
- },
- {
- "fieldname": "ksa_vat_purchase_accounts",
- "fieldtype": "Table",
- "label": "KSA VAT Purchase Accounts",
- "options": "KSA VAT Purchase Account",
- "reqd": 1
- }
- ],
- "links": [],
- "modified": "2021-08-26 04:29:06.499378",
- "modified_by": "Administrator",
- "module": "Regional",
- "name": "KSA VAT Setting",
- "owner": "Administrator",
- "permissions": [],
- "sort_field": "modified",
- "sort_order": "DESC",
- "title_field": "company",
- "track_changes": 1
-}
\ No newline at end of file
diff --git a/erpnext/regional/doctype/ksa_vat_setting/ksa_vat_setting.py b/erpnext/regional/doctype/ksa_vat_setting/ksa_vat_setting.py
deleted file mode 100644
index bdae116..0000000
--- a/erpnext/regional/doctype/ksa_vat_setting/ksa_vat_setting.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright (c) 2021, Havenir Solutions and contributors
-# For license information, please see license.txt
-
-# import frappe
-from frappe.model.document import Document
-
-
-class KSAVATSetting(Document):
- pass
diff --git a/erpnext/regional/doctype/ksa_vat_setting/ksa_vat_setting_list.js b/erpnext/regional/doctype/ksa_vat_setting/ksa_vat_setting_list.js
deleted file mode 100644
index 269cbec..0000000
--- a/erpnext/regional/doctype/ksa_vat_setting/ksa_vat_setting_list.js
+++ /dev/null
@@ -1,5 +0,0 @@
-frappe.listview_settings['KSA VAT Setting'] = {
- onload () {
- frappe.breadcrumbs.add('Accounts');
- }
-}
\ No newline at end of file
diff --git a/erpnext/regional/doctype/ksa_vat_setting/test_ksa_vat_setting.py b/erpnext/regional/doctype/ksa_vat_setting/test_ksa_vat_setting.py
deleted file mode 100644
index 7207901..0000000
--- a/erpnext/regional/doctype/ksa_vat_setting/test_ksa_vat_setting.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright (c) 2021, Havenir Solutions and Contributors
-# See license.txt
-
-# import frappe
-import unittest
-
-
-class TestKSAVATSetting(unittest.TestCase):
- pass
diff --git a/erpnext/regional/print_format/ksa_pos_invoice/__init__.py b/erpnext/regional/print_format/ksa_pos_invoice/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/regional/print_format/ksa_pos_invoice/__init__.py
+++ /dev/null
diff --git a/erpnext/regional/print_format/ksa_pos_invoice/ksa_pos_invoice.json b/erpnext/regional/print_format/ksa_pos_invoice/ksa_pos_invoice.json
deleted file mode 100644
index c2a3092..0000000
--- a/erpnext/regional/print_format/ksa_pos_invoice/ksa_pos_invoice.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "absolute_value": 0,
- "align_labels_right": 0,
- "creation": "2021-12-07 13:25:05.424827",
- "css": "",
- "custom_format": 1,
- "default_print_language": "en",
- "disabled": 1,
- "doc_type": "POS Invoice",
- "docstatus": 0,
- "doctype": "Print Format",
- "font_size": 0,
- "html": "<style>\n\t.print-format table, .print-format tr, \n\t.print-format td, .print-format div, .print-format p {\n\t\tline-height: 150%;\n\t\tvertical-align: middle;\n\t}\n\t@media screen {\n\t\t.print-format {\n\t\t\twidth: 4in;\n\t\t\tpadding: 0.25in;\n\t\t\tmin-height: 8in;\n\t\t}\n\t}\n</style>\n\n{% if letter_head %}\n {{ letter_head }}\n{% endif %}\n\n<p class=\"text-center\" style=\"margin-bottom: 1rem\">\n\t{{ doc.company }}<br>\n\t<b>{{ doc.select_print_heading or _(\"Invoice\") }}</b><br>\n\t<img src={{doc.ksa_einv_qr}}>\n</p>\n<p>\n\t<b>{{ _(\"Receipt No\") }}:</b> {{ doc.name }}<br>\n\t<b>{{ _(\"Cashier\") }}:</b> {{ doc.owner }}<br>\n\t<b>{{ _(\"Customer\") }}:</b> {{ doc.customer_name }}<br>\n\t<b>{{ _(\"Date\") }}:</b> {{ doc.get_formatted(\"posting_date\") }}<br>\n\t<b>{{ _(\"Time\") }}:</b> {{ doc.get_formatted(\"posting_time\") }}<br>\n</p>\n\n<hr>\n<table class=\"table table-condensed\">\n\t<thead>\n\t\t<tr>\n\t\t\t<th width=\"40%\">{{ _(\"Item\") }}</th>\n\t\t\t<th width=\"25%\" class=\"text-right\">{{ _(\"Qty\") }}</th>\n\t\t\t<th width=\"35%\" class=\"text-right\">{{ _(\"Amount\") }}</th>\n\t\t</tr>\n\t</thead>\n\t<tbody>\n\t\t{%- for item in doc.items -%}\n\t\t<tr>\n\t\t\t<td>\n\t\t\t\t{{ item.item_code }}\n\t\t\t\t{%- if item.item_name != item.item_code -%}\n\t\t\t\t\t<br>{{ item.item_name }}\n\t\t\t\t{%- endif -%}\n\t\t\t\t{%- if item.serial_no -%}\n\t\t\t\t\t<br><b>{{ _(\"SR.No\") }}:</b><br>\n\t\t\t\t\t{{ item.serial_no | replace(\"\\n\", \", \") }}\n\t\t\t\t{%- endif -%}\n\t\t\t</td>\n\t\t\t<td class=\"text-right\">{{ item.qty }}</td>\n\t\t\t<td class=\"text-right\">{{ item.get_formatted(\"net_amount\") }}</td>\n\t\t</tr>\n\t\t{%- endfor -%}\n\t</tbody>\n</table>\n<table class=\"table table-condensed no-border\">\n\t<tbody>\n\t\t<tr>\n\t\t\t<td class=\"text-right\" style=\"width: 60%\">\n\t\t\t\t{{ _(\"Total Excl. Tax\") }}\n\t\t\t</td>\n\t\t\t<td class=\"text-right\">\n\t\t\t\t{{ doc.get_formatted(\"net_total\", doc) }}\n\t\t\t</td>\n\t\t</tr>\n\t\t{%- for row in doc.taxes -%}\n\t\t\t<tr>\n\t\t\t\t<td class=\"text-right\" style=\"width: 60%\">\n\t\t\t\t {% if '%' in row.description %}\n\t\t\t\t\t {{ row.description }}\n\t\t\t\t\t{% else %}\n\t\t\t\t\t {{ row.description }}@{{ row.rate }}%\n\t\t\t\t\t{% endif %}\n\t\t\t\t</td>\n\t\t\t\t<td class=\"text-right\">\n\t\t\t\t\t{{ row.get_formatted(\"tax_amount\", doc) }}\n\t\t\t\t</td>\n\t\t\t<tr>\n\t\t{%- endfor -%}\n\n\t\t{%- if doc.discount_amount -%}\n\t\t<tr>\n\t\t\t<td class=\"text-right\" style=\"width: 60%\">\n\t\t\t\t{{ _(\"Discount\") }}\n\t\t\t</td>\n\t\t\t<td class=\"text-right\">\n\t\t\t\t{{ doc.get_formatted(\"discount_amount\") }}\n\t\t\t</td>\n\t\t</tr>\n\t\t{%- endif -%}\n\t\t<tr>\n\t\t\t<td class=\"text-right\" style=\"width: 60%\">\n\t\t\t\t<b>{{ _(\"Grand Total\") }}</b>\n\t\t\t</td>\n\t\t\t<td class=\"text-right\">\n\t\t\t\t{{ doc.get_formatted(\"grand_total\") }}\n\t\t\t</td>\n\t\t</tr>\n\t\t{%- if doc.rounded_total -%}\n\t\t<tr>\n\t\t\t<td class=\"text-right\" style=\"width: 60%\">\n\t\t\t\t<b>{{ _(\"Rounded Total\") }}</b>\n\t\t\t</td>\n\t\t\t<td class=\"text-right\">\n\t\t\t\t{{ doc.get_formatted(\"rounded_total\") }}\n\t\t\t</td>\n\t\t</tr>\n\t\t{%- endif -%}\n\t\t<tr>\n\t\t\t<td class=\"text-right\" style=\"width: 60%\">\n\t\t\t\t<b>{{ _(\"Paid Amount\") }}</b>\n\t\t\t</td>\n\t\t\t<td class=\"text-right\">\n\t\t\t\t{{ doc.get_formatted(\"paid_amount\") }}\n\t\t\t</td>\n\t\t</tr>\n\t\t{%- if doc.change_amount -%}\n\t\t\t<tr>\n\t\t\t\t<td class=\"text-right\" style=\"width: 60%\">\n\t\t\t\t\t<b>{{ _(\"Change Amount\") }}</b>\n\t\t\t\t</td>\n\t\t\t\t<td class=\"text-right\">\n\t\t\t\t\t{{ doc.get_formatted(\"change_amount\") }}\n\t\t\t\t</td>\n\t\t\t</tr>\n\t\t{%- endif -%}\n\t</tbody>\n</table>\n<hr>\n<p>{{ doc.terms or \"\" }}</p>\n<p class=\"text-center\">{{ _(\"Thank you, please visit again.\") }}</p>",
- "idx": 0,
- "line_breaks": 0,
- "margin_bottom": 0.0,
- "margin_left": 0.0,
- "margin_right": 0.0,
- "margin_top": 0.0,
- "modified": "2021-12-08 10:25:01.930885",
- "modified_by": "Administrator",
- "module": "Regional",
- "name": "KSA POS Invoice",
- "owner": "Administrator",
- "page_number": "Hide",
- "print_format_builder": 0,
- "print_format_builder_beta": 0,
- "print_format_type": "Jinja",
- "raw_printing": 0,
- "show_section_headings": 0,
- "standard": "Yes"
-}
\ No newline at end of file
diff --git a/erpnext/regional/print_format/ksa_vat_invoice/__init__.py b/erpnext/regional/print_format/ksa_vat_invoice/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/regional/print_format/ksa_vat_invoice/__init__.py
+++ /dev/null
diff --git a/erpnext/regional/print_format/ksa_vat_invoice/ksa_vat_invoice.json b/erpnext/regional/print_format/ksa_vat_invoice/ksa_vat_invoice.json
deleted file mode 100644
index 6b64d47..0000000
--- a/erpnext/regional/print_format/ksa_vat_invoice/ksa_vat_invoice.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "absolute_value": 0,
- "align_labels_right": 0,
- "creation": "2021-10-29 22:46:26.039023",
- "css": ".qr-code{\n float:right;\n}\n\n.invoice-heading {\n margin: 0;\n}\n\n.ksa-invoice-table {\n border: 1px solid #888a8e;\n border-collapse: collapse;\n width: 100%;\n margin: 20px 0;\n font-size: 16px;\n}\n\n.ksa-invoice-table.two-columns td:nth-child(2) {\n direction: rtl;\n}\n\n.ksa-invoice-table th {\n border: 1px solid #888a8e;\n max-width: 50%;\n padding: 8px;\n}\n\n.ksa-invoice-table td {\n padding: 5px;\n border: 1px solid #888a8e;\n max-width: 50%;\n}\n\n.ksa-invoice-table thead,\n.ksa-invoice-table tfoot {\n text-transform: uppercase;\n}\n\n.qr-rtl {\n direction: rtl;\n}\n\n.qr-flex{\n display: flex;\n justify-content: space-between;\n}",
- "custom_format": 1,
- "default_print_language": "en",
- "disabled": 1,
- "doc_type": "Sales Invoice",
- "docstatus": 0,
- "doctype": "Print Format",
- "font_size": 14,
- "html": "<div class=\"ksa-vat-format\">\n <div class=\"qr-flex\">\n <div style=\"qr-flex: 1\">\n <h2 class=\"invoice-heading\">TAX INVOICE</h2>\n <h2 class=\"invoice-heading\">\u0641\u0627\u062a\u0648\u0631\u0629 \u0636\u0631\u064a\u0628\u064a\u0629</h2>\n </div>\n \n <img class=\"qr-code\" src={{doc.ksa_einv_qr}}>\n </div>\n {% set company = frappe.get_doc(\"Company\", doc.company)%}\n {% if (doc.company_address) %}\n {% set supplier_address_doc = frappe.get_doc('Address', doc.company_address) %}\n {% endif %}\n \n {% if(doc.customer_address) %}\n {% set customer_address = frappe.get_doc('Address', doc.customer_address ) %}\n {% endif %}\n \n {% if(doc.shipping_address_name) %}\n {% set customer_shipping_address = frappe.get_doc('Address', doc.shipping_address_name ) %}\n {% endif %} \n \n <table class=\"ksa-invoice-table two-columns\">\n <thead>\n <tr>\n <th>{{ company.name }}</th>\n <th style=\"text-align: right;\">{{ company.company_name_in_arabic }}</th>\n </tr>\n </thead>\n\n <tbody>\n <!-- Invoice Info -->\n <tr>\n <td>Invoice#: {{doc.name}}</td>\n <td>\u0631\u0642\u0645 \u0627\u0644\u0641\u0627\u062a\u0648\u0631\u0629: {{doc.name}}</td>\n </tr>\n <tr>\n <td>Invoice Date: {{doc.posting_date}}</td>\n <td>\u062a\u0627\u0631\u064a\u062e \u0627\u0644\u0641\u0627\u062a\u0648\u0631\u0629: {{doc.posting_date}}</td>\n </tr>\n <tr>\n <td>Date of Supply:{{doc.posting_date}}</td>\n <td>\u062a\u0627\u0631\u064a\u062e \u0627\u0644\u062a\u0648\u0631\u064a\u062f: {{doc.posting_date}}</td>\n </tr>\n \n <!--Supplier Info -->\n <tr>\n <td>Supplier:</td>\n <td>\u0627\u0644\u0645\u0648\u0631\u062f:</td>\n </tr>\n\t\t{% if (company.tax_id) %}\n <tr>\n <td>Supplier Tax Identification Number:</td>\n <td>\u0631\u0642\u0645 \u0627\u0644\u062a\u0639\u0631\u064a\u0641 \u0627\u0644\u0636\u0631\u064a\u0628\u064a \u0644\u0644\u0645\u0648\u0631\u062f:</td>\n </tr>\n <tr>\n <td>{{ company.tax_id }}</td>\n <td>{{ company.tax_id }}</td>\n </tr>\n {% endif %}\n <tr>\n <td>{{ company.name }}</td>\n <td>{{ company.company_name_in_arabic }} </td>\n </tr>\n \n \n {% if(supplier_address_doc) %}\n <tr>\n <td>{{ supplier_address_doc.address_line1}} </td>\n <td>{{ supplier_address_doc.address_in_arabic}} </td>\n </tr>\n <tr>\n <td>Phone: {{ supplier_address_doc.phone }}</td>\n <td>\u0647\u0627\u062a\u0641: {{ supplier_address_doc.phone }}</td>\n </tr>\n <tr>\n <td>Email: {{ supplier_address_doc.email_id }}</td>\n <td>\u0628\u0631\u064a\u062f \u0627\u0644\u0643\u062a\u0631\u0648\u0646\u064a: {{ supplier_address_doc.email_id }}</td>\n </tr>\n {% endif %}\n \n <!-- Customer Info -->\n <tr>\n <td>CUSTOMER:</td>\n <td>\u0639\u0645\u064a\u0644:</td>\n </tr>\n\t\t{% set customer_tax_id = frappe.db.get_value('Customer', doc.customer, 'tax_id') %}\n\t\t{% if customer_tax_id %}\n <tr>\n <td>Customer Tax Identification Number:</td>\n <td>\u0631\u0642\u0645 \u0627\u0644\u062a\u0639\u0631\u064a\u0641 \u0627\u0644\u0636\u0631\u064a\u0628\u064a \u0644\u0644\u0639\u0645\u064a\u0644:</td>\n </tr>\n <tr>\n <td>{{ customer_tax_id }}</td>\n <td>{{ customer_tax_id }}</td>\n </tr>\n {% endif %}\n <tr>\n <td> {{ doc.customer }}</td>\n <td> {{ doc.customer_name_in_arabic }} </td>\n </tr>\n \n {% if(customer_address) %}\n <tr>\n <td>{{ customer_address.address_line1}} </td>\n <td>{{ customer_address.address_in_arabic}} </td>\n </tr>\n {% endif %}\n \n {% if(customer_shipping_address) %}\n <tr>\n <td>SHIPPING ADDRESS:</td>\n <td>\u0639\u0646\u0648\u0627\u0646 \u0627\u0644\u0634\u062d\u0646:</td>\n </tr>\n \n <tr>\n <td>{{ customer_shipping_address.address_line1}} </td>\n <td>{{ customer_shipping_address.address_in_arabic}} </td>\n </tr>\n {% endif %}\n \n\t\t{% if(doc.po_no) %}\n <tr>\n <td>OTHER INFORMATION</td>\n <td>\u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0623\u062e\u0631\u0649</td>\n </tr>\n \n <tr>\n <td>Purchase Order Number: {{ doc.po_no }}</td>\n <td>\u0631\u0642\u0645 \u0623\u0645\u0631 \u0627\u0644\u0634\u0631\u0627\u0621: {{ doc.po_no }}</td>\n </tr>\n {% endif %}\n \n <tr>\n <td>Payment Due Date: {{ doc.due_date}} </td>\n <td>\u062a\u0627\u0631\u064a\u062e \u0627\u0633\u062a\u062d\u0642\u0627\u0642 \u0627\u0644\u062f\u0641\u0639: {{ doc.due_date}}</td>\n </tr>\n </tbody>\n </table>\n\n <!--Dynamic Colspan for total row columns-->\n {% set col = namespace(one = 2, two = 1) %}\n {% set length = doc.taxes | length %}\n {% set length = length / 2 | round %}\n {% set col.one = col.one + length %}\n {% set col.two = col.two + length %}\n \n {%- if(doc.taxes | length % 2 > 0 ) -%}\n {% set col.two = col.two + 1 %}\n {% endif %}\n \n <!-- Items -->\n {% set total = namespace(amount = 0) %}\n <table class=\"ksa-invoice-table\">\n <thead>\n <tr>\n <th>Nature of goods or services <br />\u0637\u0628\u064a\u0639\u0629 \u0627\u0644\u0633\u0644\u0639 \u0623\u0648 \u0627\u0644\u062e\u062f\u0645\u0627\u062a</th>\n <th>\n Unit price <br />\n \u0633\u0639\u0631 \u0627\u0644\u0648\u062d\u062f\u0629\n </th>\n <th>\n Quantity <br />\n \u0627\u0644\u0643\u0645\u064a\u0629\n </th>\n <th>\n Taxable Amount <br />\n \u0627\u0644\u0645\u0628\u0644\u063a \u0627\u0644\u062e\u0627\u0636\u0639 \u0644\u0644\u0636\u0631\u064a\u0628\u0629\n </th>\n \n {% for row in doc.taxes %}\n <th style=\"min-width: 130px\">{{row.description}}</th>\n {% endfor %}\n \n <th>\n Total <br />\n \u0627\u0644\u0645\u062c\u0645\u0648\u0639\n </th>\n </tr>\n </thead>\n <tbody>\n {%- for item in doc.items -%}\n {% set total.amount = item.amount %}\n <tr>\n <td>{{ item.item_code or item.item_name }}</td>\n <td>{{ item.get_formatted(\"rate\") }}</td>\n <td>{{ item.qty }}</td>\n <td>{{ item.get_formatted(\"amount\") }}</td>\n {% for row in doc.taxes %}\n {% set data_object = json.loads(row.item_wise_tax_detail) %}\n {% set key = item.item_code or item.item_name %}\n {% set tax_amount = frappe.utils.flt(data_object[key][1]/doc.conversion_rate, row.precision('tax_amount')) %}\n <td>\n <div class=\"qr-flex\">\n {%- if(data_object[key][0])-%}\n <span>{{ frappe.format(data_object[key][0], {'fieldtype': 'Percent'}) }}</span>\n {%- endif -%}\n <span>\n {%- if(data_object[key][1])-%}\n {{ frappe.format_value(tax_amount, currency=doc.currency) }}</span>\n {% set total.amount = total.amount + tax_amount %}\n {%- endif -%}\n </div>\n </td>\n {% endfor %}\n <td>{{ frappe.format_value(frappe.utils.flt(total.amount, doc.precision('total_taxes_and_charges')), currency=doc.currency) }}</td>\n </tr>\n {%- endfor -%}\n </tbody>\n <tfoot>\n <tr>\n <td>\n {{ doc.get_formatted(\"total\") }} <br />\n {{ doc.get_formatted(\"total_taxes_and_charges\") }}\n </td>\n \n <td colspan={{ col.one }} class=\"qr-rtl\">\n \u0627\u0644\u0625\u062c\u0645\u0627\u0644\u064a \u0628\u0627\u0633\u062a\u062b\u0646\u0627\u0621 \u0636\u0631\u064a\u0628\u0629 \u0627\u0644\u0642\u064a\u0645\u0629 \u0627\u0644\u0645\u0636\u0627\u0641\u0629\n <br />\n \u0625\u062c\u0645\u0627\u0644\u064a \u0636\u0631\u064a\u0628\u0629 \u0627\u0644\u0642\u064a\u0645\u0629 \u0627\u0644\u0645\u0636\u0627\u0641\u0629\n </td>\n <td colspan={{ col.two }}>\n Total (Excluding VAT)\n <br />\n Total VAT\n </td>\n <td>\n {{ doc.get_formatted(\"total\") }} <br />\n {{ doc.get_formatted(\"total_taxes_and_charges\") }}\n </td>\n </tr>\n <tr>\n <td>{{ doc.get_formatted(\"grand_total\") }}</td>\n <td colspan={{ col.one }} class=\"qr-rtl\">\n \u0625\u062c\u0645\u0627\u0644\u064a \u0627\u0644\u0645\u0628\u0644\u063a \u0627\u0644\u0645\u0633\u062a\u062d\u0642</td>\n <td colspan={{ col.two }}>Total Amount Due</td>\n <td>{{ doc.get_formatted(\"grand_total\") }}</td>\n </tr>\n </tfoot>\n </table>\n\n\t{%- if doc.terms -%}\n <p>\n {{doc.terms}}\n </p>\n\t{%- endif -%}\n</div>\n",
- "idx": 0,
- "line_breaks": 0,
- "margin_bottom": 15.0,
- "margin_left": 15.0,
- "margin_right": 15.0,
- "margin_top": 15.0,
- "modified": "2021-12-07 13:43:38.018593",
- "modified_by": "Administrator",
- "module": "Regional",
- "name": "KSA VAT Invoice",
- "owner": "Administrator",
- "page_number": "Hide",
- "print_format_builder": 0,
- "print_format_builder_beta": 0,
- "print_format_type": "Jinja",
- "raw_printing": 0,
- "show_section_headings": 0,
- "standard": "Yes"
-}
\ No newline at end of file
diff --git a/erpnext/regional/report/ksa_vat/__init__.py b/erpnext/regional/report/ksa_vat/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/regional/report/ksa_vat/__init__.py
+++ /dev/null
diff --git a/erpnext/regional/report/ksa_vat/ksa_vat.js b/erpnext/regional/report/ksa_vat/ksa_vat.js
deleted file mode 100644
index 59e72c3..0000000
--- a/erpnext/regional/report/ksa_vat/ksa_vat.js
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright (c) 2016, Havenir Solutions and contributors
-// For license information, please see license.txt
-/* eslint-disable */
-
-frappe.query_reports["KSA VAT"] = {
- onload() {
- frappe.breadcrumbs.add('Accounts');
- },
- "filters": [
- {
- "fieldname": "company",
- "label": __("Company"),
- "fieldtype": "Link",
- "options": "Company",
- "reqd": 1,
- "default": frappe.defaults.get_user_default("Company")
- },
- {
- "fieldname": "from_date",
- "label": __("From Date"),
- "fieldtype": "Date",
- "reqd": 1,
- "default": frappe.datetime.add_months(frappe.datetime.get_today(), -1),
- },
- {
- "fieldname": "to_date",
- "label": __("To Date"),
- "fieldtype": "Date",
- "reqd": 1,
- "default": frappe.datetime.get_today()
- }
- ],
- "formatter": function(value, row, column, data, default_formatter) {
- if (data
- && (data.title=='VAT on Sales' || data.title=='VAT on Purchases')
- && data.title==value) {
- value = $(`<span>${value}</span>`);
- var $value = $(value).css("font-weight", "bold");
- value = $value.wrap("<p></p>").parent().html();
- return value
- }else if (data.title=='Grand Total'){
- if (data.title==value) {
- value = $(`<span>${value}</span>`);
- var $value = $(value).css("font-weight", "bold");
- value = $value.wrap("<p></p>").parent().html();
- return value
- }else{
- value = default_formatter(value, row, column, data);
- value = $(`<span>${value}</span>`);
- var $value = $(value).css("font-weight", "bold");
- value = $value.wrap("<p></p>").parent().html();
- return value
- }
- }else{
- value = default_formatter(value, row, column, data);
- return value;
- }
- },
-};
diff --git a/erpnext/regional/report/ksa_vat/ksa_vat.json b/erpnext/regional/report/ksa_vat/ksa_vat.json
deleted file mode 100644
index 036e260..0000000
--- a/erpnext/regional/report/ksa_vat/ksa_vat.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "add_total_row": 0,
- "columns": [],
- "creation": "2021-07-13 08:54:38.000949",
- "disable_prepared_report": 1,
- "disabled": 1,
- "docstatus": 0,
- "doctype": "Report",
- "filters": [],
- "idx": 0,
- "is_standard": "Yes",
- "modified": "2021-08-26 04:14:37.202594",
- "modified_by": "Administrator",
- "module": "Regional",
- "name": "KSA VAT",
- "owner": "Administrator",
- "prepared_report": 1,
- "ref_doctype": "GL Entry",
- "report_name": "KSA VAT",
- "report_type": "Script Report",
- "roles": [
- {
- "role": "System Manager"
- },
- {
- "role": "Accounts Manager"
- },
- {
- "role": "Accounts User"
- }
- ]
-}
\ No newline at end of file
diff --git a/erpnext/regional/report/ksa_vat/ksa_vat.py b/erpnext/regional/report/ksa_vat/ksa_vat.py
deleted file mode 100644
index 15996d2..0000000
--- a/erpnext/regional/report/ksa_vat/ksa_vat.py
+++ /dev/null
@@ -1,231 +0,0 @@
-# Copyright (c) 2013, Havenir Solutions and contributors
-# For license information, please see license.txt
-
-
-import json
-
-import frappe
-from frappe import _
-from frappe.utils import get_url_to_list
-
-
-def execute(filters=None):
- columns = columns = get_columns()
- data = get_data(filters)
- return columns, data
-
-
-def get_columns():
- return [
- {
- "fieldname": "title",
- "label": _("Title"),
- "fieldtype": "Data",
- "width": 300,
- },
- {
- "fieldname": "amount",
- "label": _("Amount (SAR)"),
- "fieldtype": "Currency",
- "options": "currency",
- "width": 150,
- },
- {
- "fieldname": "adjustment_amount",
- "label": _("Adjustment (SAR)"),
- "fieldtype": "Currency",
- "options": "currency",
- "width": 150,
- },
- {
- "fieldname": "vat_amount",
- "label": _("VAT Amount (SAR)"),
- "fieldtype": "Currency",
- "options": "currency",
- "width": 150,
- },
- {
- "fieldname": "currency",
- "label": _("Currency"),
- "fieldtype": "Currency",
- "width": 150,
- "hidden": 1,
- },
- ]
-
-
-def get_data(filters):
- data = []
-
- # Validate if vat settings exist
- company = filters.get("company")
- company_currency = frappe.get_cached_value("Company", company, "default_currency")
-
- if frappe.db.exists("KSA VAT Setting", company) is None:
- url = get_url_to_list("KSA VAT Setting")
- frappe.msgprint(_('Create <a href="{}">KSA VAT Setting</a> for this company').format(url))
- return data
-
- ksa_vat_setting = frappe.get_doc("KSA VAT Setting", company)
-
- # Sales Heading
- append_data(data, "VAT on Sales", "", "", "", company_currency)
-
- grand_total_taxable_amount = 0
- grand_total_taxable_adjustment_amount = 0
- grand_total_tax = 0
-
- for vat_setting in ksa_vat_setting.ksa_vat_sales_accounts:
- (
- total_taxable_amount,
- total_taxable_adjustment_amount,
- total_tax,
- ) = get_tax_data_for_each_vat_setting(vat_setting, filters, "Sales Invoice")
-
- # Adding results to data
- append_data(
- data,
- vat_setting.title,
- total_taxable_amount,
- total_taxable_adjustment_amount,
- total_tax,
- company_currency,
- )
-
- grand_total_taxable_amount += total_taxable_amount
- grand_total_taxable_adjustment_amount += total_taxable_adjustment_amount
- grand_total_tax += total_tax
-
- # Sales Grand Total
- append_data(
- data,
- "Grand Total",
- grand_total_taxable_amount,
- grand_total_taxable_adjustment_amount,
- grand_total_tax,
- company_currency,
- )
-
- # Blank Line
- append_data(data, "", "", "", "", company_currency)
-
- # Purchase Heading
- append_data(data, "VAT on Purchases", "", "", "", company_currency)
-
- grand_total_taxable_amount = 0
- grand_total_taxable_adjustment_amount = 0
- grand_total_tax = 0
-
- for vat_setting in ksa_vat_setting.ksa_vat_purchase_accounts:
- (
- total_taxable_amount,
- total_taxable_adjustment_amount,
- total_tax,
- ) = get_tax_data_for_each_vat_setting(vat_setting, filters, "Purchase Invoice")
-
- # Adding results to data
- append_data(
- data,
- vat_setting.title,
- total_taxable_amount,
- total_taxable_adjustment_amount,
- total_tax,
- company_currency,
- )
-
- grand_total_taxable_amount += total_taxable_amount
- grand_total_taxable_adjustment_amount += total_taxable_adjustment_amount
- grand_total_tax += total_tax
-
- # Purchase Grand Total
- append_data(
- data,
- "Grand Total",
- grand_total_taxable_amount,
- grand_total_taxable_adjustment_amount,
- grand_total_tax,
- company_currency,
- )
-
- return data
-
-
-def get_tax_data_for_each_vat_setting(vat_setting, filters, doctype):
- """
- (KSA, {filters}, 'Sales Invoice') => 500, 153, 10 \n
- calculates and returns \n
- total_taxable_amount, total_taxable_adjustment_amount, total_tax"""
- from_date = filters.get("from_date")
- to_date = filters.get("to_date")
-
- # Initiate variables
- total_taxable_amount = 0
- total_taxable_adjustment_amount = 0
- total_tax = 0
- # Fetch All Invoices
- invoices = frappe.get_all(
- doctype,
- filters={"docstatus": 1, "posting_date": ["between", [from_date, to_date]]},
- fields=["name", "is_return"],
- )
-
- for invoice in invoices:
- invoice_items = frappe.get_all(
- f"{doctype} Item",
- filters={
- "docstatus": 1,
- "parent": invoice.name,
- "item_tax_template": vat_setting.item_tax_template,
- },
- fields=["item_code", "net_amount"],
- )
-
- for item in invoice_items:
- # Summing up total taxable amount
- if invoice.is_return == 0:
- total_taxable_amount += item.net_amount
-
- if invoice.is_return == 1:
- total_taxable_adjustment_amount += item.net_amount
-
- # Summing up total tax
- total_tax += get_tax_amount(item.item_code, vat_setting.account, doctype, invoice.name)
-
- return total_taxable_amount, total_taxable_adjustment_amount, total_tax
-
-
-def append_data(data, title, amount, adjustment_amount, vat_amount, company_currency):
- """Returns data with appended value."""
- data.append(
- {
- "title": _(title),
- "amount": amount,
- "adjustment_amount": adjustment_amount,
- "vat_amount": vat_amount,
- "currency": company_currency,
- }
- )
-
-
-def get_tax_amount(item_code, account_head, doctype, parent):
- if doctype == "Sales Invoice":
- tax_doctype = "Sales Taxes and Charges"
-
- elif doctype == "Purchase Invoice":
- tax_doctype = "Purchase Taxes and Charges"
-
- item_wise_tax_detail = frappe.get_value(
- tax_doctype,
- {"docstatus": 1, "parent": parent, "account_head": account_head},
- "item_wise_tax_detail",
- )
-
- tax_amount = 0
- if item_wise_tax_detail and len(item_wise_tax_detail) > 0:
- item_wise_tax_detail = json.loads(item_wise_tax_detail)
- for key, value in item_wise_tax_detail.items():
- if key == item_code:
- tax_amount = value[1]
- break
-
- return tax_amount
diff --git a/erpnext/regional/saudi_arabia/__init__.py b/erpnext/regional/saudi_arabia/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/regional/saudi_arabia/__init__.py
+++ /dev/null
diff --git a/erpnext/regional/saudi_arabia/setup.py b/erpnext/regional/saudi_arabia/setup.py
deleted file mode 100644
index 7f41c46..0000000
--- a/erpnext/regional/saudi_arabia/setup.py
+++ /dev/null
@@ -1,173 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
-# License: GNU General Public License v3. See license.txt
-
-import frappe
-from frappe.permissions import add_permission, update_permission_property
-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_fields
-
-
-def setup(company=None, patch=True):
- add_print_formats()
- add_permissions()
- make_custom_fields()
-
-
-def add_print_formats():
- frappe.reload_doc("regional", "print_format", "detailed_tax_invoice", force=True)
- frappe.reload_doc("regional", "print_format", "simplified_tax_invoice", force=True)
- frappe.reload_doc("regional", "print_format", "tax_invoice", force=True)
- frappe.reload_doc("regional", "print_format", "ksa_vat_invoice", force=True)
- frappe.reload_doc("regional", "print_format", "ksa_pos_invoice", force=True)
-
- for d in (
- "Simplified Tax Invoice",
- "Detailed Tax Invoice",
- "Tax Invoice",
- "KSA VAT Invoice",
- "KSA POS Invoice",
- ):
- frappe.db.set_value("Print Format", d, "disabled", 0)
-
-
-def add_permissions():
- """Add Permissions for KSA VAT Setting."""
- add_permission("KSA VAT Setting", "All", 0)
- for role in ("Accounts Manager", "Accounts User", "System Manager"):
- add_permission("KSA VAT Setting", role, 0)
- update_permission_property("KSA VAT Setting", role, 0, "write", 1)
- update_permission_property("KSA VAT Setting", role, 0, "create", 1)
-
- """Enable KSA VAT Report"""
- frappe.db.set_value("Report", "KSA VAT", "disabled", 0)
-
-
-def make_custom_fields():
- """Create Custom fields
- - QR code Image file
- - Company Name in Arabic
- - Address in Arabic
- """
- is_zero_rated = dict(
- fieldname="is_zero_rated",
- label="Is Zero Rated",
- fieldtype="Check",
- fetch_from="item_code.is_zero_rated",
- insert_after="description",
- print_hide=1,
- )
-
- is_exempt = dict(
- fieldname="is_exempt",
- label="Is Exempt",
- fieldtype="Check",
- fetch_from="item_code.is_exempt",
- insert_after="is_zero_rated",
- print_hide=1,
- )
-
- purchase_invoice_fields = [
- dict(
- fieldname="company_trn",
- label="Company TRN",
- fieldtype="Read Only",
- insert_after="shipping_address",
- fetch_from="company.tax_id",
- print_hide=1,
- ),
- dict(
- fieldname="supplier_name_in_arabic",
- label="Supplier Name in Arabic",
- fieldtype="Read Only",
- insert_after="supplier_name",
- fetch_from="supplier.supplier_name_in_arabic",
- print_hide=1,
- ),
- ]
-
- sales_invoice_fields = [
- dict(
- fieldname="company_trn",
- label="Company TRN",
- fieldtype="Read Only",
- insert_after="company_address",
- fetch_from="company.tax_id",
- print_hide=1,
- ),
- dict(
- fieldname="customer_name_in_arabic",
- label="Customer Name in Arabic",
- fieldtype="Read Only",
- insert_after="customer_name",
- fetch_from="customer.customer_name_in_arabic",
- print_hide=1,
- ),
- dict(
- fieldname="ksa_einv_qr",
- label="KSA E-Invoicing QR",
- fieldtype="Attach Image",
- read_only=1,
- no_copy=1,
- hidden=1,
- ),
- ]
-
- custom_fields = {
- "Item": [is_zero_rated, is_exempt],
- "Customer": [
- dict(
- fieldname="customer_name_in_arabic",
- label="Customer Name in Arabic",
- fieldtype="Data",
- insert_after="customer_name",
- ),
- ],
- "Supplier": [
- dict(
- fieldname="supplier_name_in_arabic",
- label="Supplier Name in Arabic",
- fieldtype="Data",
- insert_after="supplier_name",
- ),
- ],
- "Purchase Invoice": purchase_invoice_fields,
- "Purchase Order": purchase_invoice_fields,
- "Purchase Receipt": purchase_invoice_fields,
- "Sales Invoice": sales_invoice_fields,
- "POS Invoice": sales_invoice_fields,
- "Sales Order": sales_invoice_fields,
- "Delivery Note": sales_invoice_fields,
- "Sales Invoice Item": [is_zero_rated, is_exempt],
- "POS Invoice Item": [is_zero_rated, is_exempt],
- "Purchase Invoice Item": [is_zero_rated, is_exempt],
- "Sales Order Item": [is_zero_rated, is_exempt],
- "Delivery Note Item": [is_zero_rated, is_exempt],
- "Quotation Item": [is_zero_rated, is_exempt],
- "Purchase Order Item": [is_zero_rated, is_exempt],
- "Purchase Receipt Item": [is_zero_rated, is_exempt],
- "Supplier Quotation Item": [is_zero_rated, is_exempt],
- "Address": [
- dict(
- fieldname="address_in_arabic",
- label="Address in Arabic",
- fieldtype="Data",
- insert_after="address_line2",
- )
- ],
- "Company": [
- dict(
- fieldname="company_name_in_arabic",
- label="Company Name In Arabic",
- fieldtype="Data",
- insert_after="company_name",
- )
- ],
- }
-
- create_custom_fields(custom_fields, ignore_validate=True, update=True)
-
-
-def update_regional_tax_settings(country, company):
- create_ksa_vat_setting(company)
diff --git a/erpnext/regional/saudi_arabia/utils.py b/erpnext/regional/saudi_arabia/utils.py
deleted file mode 100644
index cac5ec1..0000000
--- a/erpnext/regional/saudi_arabia/utils.py
+++ /dev/null
@@ -1,169 +0,0 @@
-import io
-import os
-from base64 import b64encode
-
-import frappe
-from frappe import _
-from frappe.custom.doctype.custom_field.custom_field import create_custom_fields
-from frappe.utils.data import add_to_date, get_time, getdate
-from pyqrcode import create as qr_create
-
-from erpnext import get_region
-
-
-def create_qr_code(doc, method=None):
- region = get_region(doc.company)
- if region not in ["Saudi Arabia"]:
- return
-
- # if QR Code field not present, create it. Invoices without QR are invalid as per law.
- if not hasattr(doc, "ksa_einv_qr"):
- create_custom_fields(
- {
- doc.doctype: [
- dict(
- fieldname="ksa_einv_qr",
- label="KSA E-Invoicing QR",
- fieldtype="Attach Image",
- read_only=1,
- no_copy=1,
- hidden=1,
- )
- ]
- }
- )
-
- # Don't create QR Code if it already exists
- qr_code = doc.get("ksa_einv_qr")
- if qr_code and frappe.db.exists({"doctype": "File", "file_url": qr_code}):
- return
-
- meta = frappe.get_meta(doc.doctype)
-
- if "ksa_einv_qr" in [d.fieldname for d in meta.get_image_fields()]:
- """TLV conversion for
- 1. Seller's Name
- 2. VAT Number
- 3. Time Stamp
- 4. Invoice Amount
- 5. VAT Amount
- """
- tlv_array = []
- # Sellers Name
-
- seller_name = frappe.db.get_value("Company", doc.company, "company_name_in_arabic")
-
- if not seller_name:
- frappe.throw(_("Arabic name missing for {} in the company document").format(doc.company))
-
- tag = bytes([1]).hex()
- length = bytes([len(seller_name.encode("utf-8"))]).hex()
- value = seller_name.encode("utf-8").hex()
- tlv_array.append("".join([tag, length, value]))
-
- # VAT Number
- tax_id = frappe.db.get_value("Company", doc.company, "tax_id")
- if not tax_id:
- frappe.throw(_("Tax ID missing for {} in the company document").format(doc.company))
-
- tag = bytes([2]).hex()
- length = bytes([len(tax_id)]).hex()
- value = tax_id.encode("utf-8").hex()
- tlv_array.append("".join([tag, length, value]))
-
- # Time Stamp
- posting_date = getdate(doc.posting_date)
- time = get_time(doc.posting_time)
- seconds = time.hour * 60 * 60 + time.minute * 60 + time.second
- time_stamp = add_to_date(posting_date, seconds=seconds)
- time_stamp = time_stamp.strftime("%Y-%m-%dT%H:%M:%SZ")
-
- tag = bytes([3]).hex()
- length = bytes([len(time_stamp)]).hex()
- value = time_stamp.encode("utf-8").hex()
- tlv_array.append("".join([tag, length, value]))
-
- # Invoice Amount
- invoice_amount = str(doc.base_grand_total)
- tag = bytes([4]).hex()
- length = bytes([len(invoice_amount)]).hex()
- value = invoice_amount.encode("utf-8").hex()
- tlv_array.append("".join([tag, length, value]))
-
- # VAT Amount
- vat_amount = str(get_vat_amount(doc))
-
- tag = bytes([5]).hex()
- length = bytes([len(vat_amount)]).hex()
- value = vat_amount.encode("utf-8").hex()
- tlv_array.append("".join([tag, length, value]))
-
- # Joining bytes into one
- tlv_buff = "".join(tlv_array)
-
- # base64 conversion for QR Code
- base64_string = b64encode(bytes.fromhex(tlv_buff)).decode()
-
- qr_image = io.BytesIO()
- url = qr_create(base64_string, error="L")
- url.png(qr_image, scale=2, quiet_zone=1)
-
- name = frappe.generate_hash(doc.name, 5)
-
- # making file
- filename = f"QRCode-{name}.png".replace(os.path.sep, "__")
- _file = frappe.get_doc(
- {
- "doctype": "File",
- "file_name": filename,
- "is_private": 0,
- "content": qr_image.getvalue(),
- "attached_to_doctype": doc.get("doctype"),
- "attached_to_name": doc.get("name"),
- "attached_to_field": "ksa_einv_qr",
- }
- )
-
- _file.save()
-
- # assigning to document
- doc.db_set("ksa_einv_qr", _file.file_url)
- doc.notify_update()
-
-
-def get_vat_amount(doc):
- vat_settings = frappe.db.get_value("KSA VAT Setting", {"company": doc.company})
- vat_accounts = []
- vat_amount = 0
-
- if vat_settings:
- vat_settings_doc = frappe.get_cached_doc("KSA VAT Setting", vat_settings)
-
- for row in vat_settings_doc.get("ksa_vat_sales_accounts"):
- vat_accounts.append(row.account)
-
- for tax in doc.get("taxes"):
- if tax.account_head in vat_accounts:
- vat_amount += tax.base_tax_amount
-
- return vat_amount
-
-
-def delete_qr_code_file(doc, method=None):
- region = get_region(doc.company)
- if region not in ["Saudi Arabia"]:
- return
-
- if hasattr(doc, "ksa_einv_qr"):
- if doc.get("ksa_einv_qr"):
- file_doc = frappe.get_list("File", {"file_url": doc.get("ksa_einv_qr")})
- if len(file_doc):
- frappe.delete_doc("File", file_doc[0].name)
-
-
-def delete_vat_settings_for_company(doc, method=None):
- if doc.country != "Saudi Arabia":
- return
-
- if frappe.db.exists("KSA VAT Setting", doc.name):
- frappe.delete_doc("KSA VAT Setting", doc.name)
diff --git a/erpnext/regional/saudi_arabia/wizard/__init__.py b/erpnext/regional/saudi_arabia/wizard/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/regional/saudi_arabia/wizard/__init__.py
+++ /dev/null
diff --git a/erpnext/regional/saudi_arabia/wizard/data/__init__.py b/erpnext/regional/saudi_arabia/wizard/data/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/regional/saudi_arabia/wizard/data/__init__.py
+++ /dev/null
diff --git a/erpnext/regional/saudi_arabia/wizard/data/ksa_vat_settings.json b/erpnext/regional/saudi_arabia/wizard/data/ksa_vat_settings.json
deleted file mode 100644
index 60951a9..0000000
--- a/erpnext/regional/saudi_arabia/wizard/data/ksa_vat_settings.json
+++ /dev/null
@@ -1,47 +0,0 @@
-[
- {
- "type": "Sales Account",
- "accounts": [
- {
- "title": "Standard rated Sales",
- "item_tax_template": "KSA VAT 5%",
- "account": "VAT 5%"
- },
- {
- "title": "Zero rated domestic sales",
- "item_tax_template": "KSA VAT Zero",
- "account": "VAT Zero"
- },
- {
- "title": "Exempted sales",
- "item_tax_template": "KSA VAT Exempted",
- "account": "VAT Exempted"
- }
- ]
- },
- {
- "type": "Purchase Account",
- "accounts": [
- {
- "title": "Standard rated domestic purchases",
- "item_tax_template": "KSA VAT 5%",
- "account": "VAT 5%"
- },
- {
- "title": "Imports subject to VAT paid at customs",
- "item_tax_template": "KSA Excise 50%",
- "account": "Excise 50%"
- },
- {
- "title": "Zero rated purchases",
- "item_tax_template": "KSA VAT Zero",
- "account": "VAT Zero"
- },
- {
- "title": "Exempted purchases",
- "item_tax_template": "KSA VAT Exempted",
- "account": "VAT Exempted"
- }
- ]
- }
-]
\ No newline at end of file
diff --git a/erpnext/regional/saudi_arabia/wizard/operations/__init__.py b/erpnext/regional/saudi_arabia/wizard/operations/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/regional/saudi_arabia/wizard/operations/__init__.py
+++ /dev/null
diff --git a/erpnext/regional/saudi_arabia/wizard/operations/setup_ksa_vat_setting.py b/erpnext/regional/saudi_arabia/wizard/operations/setup_ksa_vat_setting.py
deleted file mode 100644
index 66d9df2..0000000
--- a/erpnext/regional/saudi_arabia/wizard/operations/setup_ksa_vat_setting.py
+++ /dev/null
@@ -1,46 +0,0 @@
-import json
-import os
-
-import frappe
-
-
-def create_ksa_vat_setting(company):
- """On creation of first company. Creates KSA VAT Setting"""
-
- company = frappe.get_doc("Company", company)
-
- file_path = os.path.join(os.path.dirname(__file__), "..", "data", "ksa_vat_settings.json")
- with open(file_path, "r") as json_file:
- account_data = json.load(json_file)
-
- # Creating KSA VAT Setting
- ksa_vat_setting = frappe.get_doc({"doctype": "KSA VAT Setting", "company": company.name})
-
- for data in account_data:
- if data["type"] == "Sales Account":
- for row in data["accounts"]:
- item_tax_template = row["item_tax_template"]
- account = row["account"]
- ksa_vat_setting.append(
- "ksa_vat_sales_accounts",
- {
- "title": row["title"],
- "item_tax_template": f"{item_tax_template} - {company.abbr}",
- "account": f"{account} - {company.abbr}",
- },
- )
-
- elif data["type"] == "Purchase Account":
- for row in data["accounts"]:
- item_tax_template = row["item_tax_template"]
- account = row["account"]
- ksa_vat_setting.append(
- "ksa_vat_purchase_accounts",
- {
- "title": row["title"],
- "item_tax_template": f"{item_tax_template} - {company.abbr}",
- "account": f"{account} - {company.abbr}",
- },
- )
-
- ksa_vat_setting.save()
diff --git a/erpnext/setup/setup_wizard/data/country_wise_tax.json b/erpnext/setup/setup_wizard/data/country_wise_tax.json
index 45e39c5..5750914 100644
--- a/erpnext/setup/setup_wizard/data/country_wise_tax.json
+++ b/erpnext/setup/setup_wizard/data/country_wise_tax.json
@@ -4015,34 +4015,6 @@
"tax_rate": 18.00
}
},
-
- "Saudi Arabia": {
- "KSA VAT 15%": {
- "account_name": "VAT 15%",
- "tax_rate": 15.00
- },
- "KSA VAT 5%": {
- "account_name": "VAT 5%",
- "tax_rate": 5.00
- },
- "KSA VAT Zero": {
- "account_name": "VAT Zero",
- "tax_rate": 0.00
- },
- "KSA VAT Exempted": {
- "account_name": "VAT Exempted",
- "tax_rate": 0.00
- },
- "KSA Excise 50%": {
- "account_name": "Excise 50%",
- "tax_rate": 50.00
- },
- "KSA Excise 100%": {
- "account_name": "Excise 100%",
- "tax_rate": 100.00
- }
- },
-
"Serbia": {
"Serbia Tax": {
"account_name": "VAT",