diff --git a/erpnext/hooks.py b/erpnext/hooks.py index fd19d2585cc..fba886ca2c3 100644 --- a/erpnext/hooks.py +++ b/erpnext/hooks.py @@ -311,15 +311,10 @@ doc_events = { "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 @@ doc_events = { "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 e6be933f258..2abd65b1b5b 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -250,18 +250,14 @@ erpnext.patches.v13_0.item_naming_series_not_mandatory 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.v13_0.create_accounting_dimensions_for_asset_repair 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 093463a12e9..00000000000 --- 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 84b6c37dd9d..00000000000 --- 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 4adf4d71db7..00000000000 --- 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 e4b91412ee1..00000000000 --- 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 00000000000..371e3352908 --- /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 00000000000..6af8efe5ff0 --- /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 e69de29bb2d..00000000000 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 89ba3e977af..00000000000 --- 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 3920bc546c1..00000000000 --- 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 e69de29bb2d..00000000000 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 72613f4064f..00000000000 --- 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 df2747891dc..00000000000 --- 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 7c2689f530e..00000000000 --- 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 1d6a6a793dc..00000000000 --- 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 e69de29bb2d..00000000000 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 00b62b9adfb..00000000000 --- 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 33619467ed0..00000000000 --- 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 bdae1161fd7..00000000000 --- 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 269cbec5fb4..00000000000 --- 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 7207901fd43..00000000000 --- 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 e69de29bb2d..00000000000 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 c2a309231dd..00000000000 --- 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": "\n\n{% if letter_head %}\n {{ letter_head }}\n{% endif %}\n\n

\n\t{{ doc.company }}
\n\t{{ doc.select_print_heading or _(\"Invoice\") }}
\n\t\n

\n

\n\t{{ _(\"Receipt No\") }}: {{ doc.name }}
\n\t{{ _(\"Cashier\") }}: {{ doc.owner }}
\n\t{{ _(\"Customer\") }}: {{ doc.customer_name }}
\n\t{{ _(\"Date\") }}: {{ doc.get_formatted(\"posting_date\") }}
\n\t{{ _(\"Time\") }}: {{ doc.get_formatted(\"posting_time\") }}
\n

\n\n
\n\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\n\t\n\t\t{%- for item in doc.items -%}\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t{%- endfor -%}\n\t\n
{{ _(\"Item\") }}{{ _(\"Qty\") }}{{ _(\"Amount\") }}
\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
{{ item.item_name }}\n\t\t\t\t{%- endif -%}\n\t\t\t\t{%- if item.serial_no -%}\n\t\t\t\t\t
{{ _(\"SR.No\") }}:
\n\t\t\t\t\t{{ item.serial_no | replace(\"\\n\", \", \") }}\n\t\t\t\t{%- endif -%}\n\t\t\t
{{ item.qty }}{{ item.get_formatted(\"net_amount\") }}
\n\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t{%- for row in doc.taxes -%}\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t{%- endfor -%}\n\n\t\t{%- if doc.discount_amount -%}\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t{%- endif -%}\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t{%- if doc.rounded_total -%}\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t{%- endif -%}\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t{%- if doc.change_amount -%}\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t{%- endif -%}\n\t\n
\n\t\t\t\t{{ _(\"Total Excl. Tax\") }}\n\t\t\t\n\t\t\t\t{{ doc.get_formatted(\"net_total\", doc) }}\n\t\t\t
\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\n\t\t\t\t\t{{ row.get_formatted(\"tax_amount\", doc) }}\n\t\t\t\t
\n\t\t\t\t{{ _(\"Discount\") }}\n\t\t\t\n\t\t\t\t{{ doc.get_formatted(\"discount_amount\") }}\n\t\t\t
\n\t\t\t\t{{ _(\"Grand Total\") }}\n\t\t\t\n\t\t\t\t{{ doc.get_formatted(\"grand_total\") }}\n\t\t\t
\n\t\t\t\t{{ _(\"Rounded Total\") }}\n\t\t\t\n\t\t\t\t{{ doc.get_formatted(\"rounded_total\") }}\n\t\t\t
\n\t\t\t\t{{ _(\"Paid Amount\") }}\n\t\t\t\n\t\t\t\t{{ doc.get_formatted(\"paid_amount\") }}\n\t\t\t
\n\t\t\t\t\t{{ _(\"Change Amount\") }}\n\t\t\t\t\n\t\t\t\t\t{{ doc.get_formatted(\"change_amount\") }}\n\t\t\t\t
\n
\n

{{ doc.terms or \"\" }}

\n

{{ _(\"Thank you, please visit again.\") }}

", - "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 e69de29bb2d..00000000000 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 6b64d474535..00000000000 --- 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": "
\n
\n
\n

TAX INVOICE

\n

\u0641\u0627\u062a\u0648\u0631\u0629 \u0636\u0631\u064a\u0628\u064a\u0629

\n
\n \n \n
\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 \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\t\t{% if (company.tax_id) %}\n \n \n \n \n \n \n \n \n {% endif %}\n \n \n \n \n \n \n {% if(supplier_address_doc) %}\n \n \n \n \n \n \n \n \n \n \n \n \n {% endif %}\n \n \n \n \n \n \n\t\t{% set customer_tax_id = frappe.db.get_value('Customer', doc.customer, 'tax_id') %}\n\t\t{% if customer_tax_id %}\n \n \n \n \n \n \n \n \n {% endif %}\n \n \n \n \n \n {% if(customer_address) %}\n \n \n \n \n {% endif %}\n \n {% if(customer_shipping_address) %}\n \n \n \n \n \n \n \n \n \n {% endif %}\n \n\t\t{% if(doc.po_no) %}\n \n \n \n \n \n \n \n \n \n {% endif %}\n \n \n \n \n \n \n
{{ company.name }}{{ company.company_name_in_arabic }}
Invoice#: {{doc.name}}\u0631\u0642\u0645 \u0627\u0644\u0641\u0627\u062a\u0648\u0631\u0629: {{doc.name}}
Invoice Date: {{doc.posting_date}}\u062a\u0627\u0631\u064a\u062e \u0627\u0644\u0641\u0627\u062a\u0648\u0631\u0629: {{doc.posting_date}}
Date of Supply:{{doc.posting_date}}\u062a\u0627\u0631\u064a\u062e \u0627\u0644\u062a\u0648\u0631\u064a\u062f: {{doc.posting_date}}
Supplier:\u0627\u0644\u0645\u0648\u0631\u062f:
Supplier Tax Identification Number:\u0631\u0642\u0645 \u0627\u0644\u062a\u0639\u0631\u064a\u0641 \u0627\u0644\u0636\u0631\u064a\u0628\u064a \u0644\u0644\u0645\u0648\u0631\u062f:
{{ company.tax_id }}{{ company.tax_id }}
{{ company.name }}{{ company.company_name_in_arabic }}
{{ supplier_address_doc.address_line1}} {{ supplier_address_doc.address_in_arabic}}
Phone: {{ supplier_address_doc.phone }}\u0647\u0627\u062a\u0641: {{ supplier_address_doc.phone }}
Email: {{ supplier_address_doc.email_id }}\u0628\u0631\u064a\u062f \u0627\u0644\u0643\u062a\u0631\u0648\u0646\u064a: {{ supplier_address_doc.email_id }}
CUSTOMER:\u0639\u0645\u064a\u0644:
Customer Tax Identification Number:\u0631\u0642\u0645 \u0627\u0644\u062a\u0639\u0631\u064a\u0641 \u0627\u0644\u0636\u0631\u064a\u0628\u064a \u0644\u0644\u0639\u0645\u064a\u0644:
{{ customer_tax_id }}{{ customer_tax_id }}
{{ doc.customer }} {{ doc.customer_name_in_arabic }}
{{ customer_address.address_line1}} {{ customer_address.address_in_arabic}}
SHIPPING ADDRESS:\u0639\u0646\u0648\u0627\u0646 \u0627\u0644\u0634\u062d\u0646:
{{ customer_shipping_address.address_line1}} {{ customer_shipping_address.address_in_arabic}}
OTHER INFORMATION\u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0623\u062e\u0631\u0649
Purchase Order Number: {{ doc.po_no }}\u0631\u0642\u0645 \u0623\u0645\u0631 \u0627\u0644\u0634\u0631\u0627\u0621: {{ doc.po_no }}
Payment Due Date: {{ doc.due_date}} \u062a\u0627\u0631\u064a\u062e \u0627\u0633\u062a\u062d\u0642\u0627\u0642 \u0627\u0644\u062f\u0641\u0639: {{ doc.due_date}}
\n\n \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 \n {% set total = namespace(amount = 0) %}\n \n \n \n \n \n \n \n \n {% for row in doc.taxes %}\n \n {% endfor %}\n \n \n \n \n \n {%- for item in doc.items -%}\n {% set total.amount = item.amount %}\n \n \n \n \n \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 \n {% endfor %}\n \n \n {%- endfor -%}\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
Nature of goods or services
\u0637\u0628\u064a\u0639\u0629 \u0627\u0644\u0633\u0644\u0639 \u0623\u0648 \u0627\u0644\u062e\u062f\u0645\u0627\u062a
\n Unit price
\n \u0633\u0639\u0631 \u0627\u0644\u0648\u062d\u062f\u0629\n
\n Quantity
\n \u0627\u0644\u0643\u0645\u064a\u0629\n
\n Taxable Amount
\n \u0627\u0644\u0645\u0628\u0644\u063a \u0627\u0644\u062e\u0627\u0636\u0639 \u0644\u0644\u0636\u0631\u064a\u0628\u0629\n
{{row.description}}\n Total
\n \u0627\u0644\u0645\u062c\u0645\u0648\u0639\n
{{ item.item_code or item.item_name }}{{ item.get_formatted(\"rate\") }}{{ item.qty }}{{ item.get_formatted(\"amount\") }}\n
\n {%- if(data_object[key][0])-%}\n {{ frappe.format(data_object[key][0], {'fieldtype': 'Percent'}) }}\n {%- endif -%}\n \n {%- if(data_object[key][1])-%}\n {{ frappe.format_value(tax_amount, currency=doc.currency) }}\n {% set total.amount = total.amount + tax_amount %}\n {%- endif -%}\n
\n
{{ frappe.format_value(frappe.utils.flt(total.amount, doc.precision('total_taxes_and_charges')), currency=doc.currency) }}
\n {{ doc.get_formatted(\"total\") }}
\n {{ doc.get_formatted(\"total_taxes_and_charges\") }}\n
\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
\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
\n Total (Excluding VAT)\n
\n Total VAT\n
\n {{ doc.get_formatted(\"total\") }}
\n {{ doc.get_formatted(\"total_taxes_and_charges\") }}\n
{{ doc.get_formatted(\"grand_total\") }}\n \u0625\u062c\u0645\u0627\u0644\u064a \u0627\u0644\u0645\u0628\u0644\u063a \u0627\u0644\u0645\u0633\u062a\u062d\u0642Total Amount Due{{ doc.get_formatted(\"grand_total\") }}
\n\n\t{%- if doc.terms -%}\n

\n {{doc.terms}}\n

\n\t{%- endif -%}\n
\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 e69de29bb2d..00000000000 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 59e72c3e638..00000000000 --- 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 = $(`${value}`); - var $value = $(value).css("font-weight", "bold"); - value = $value.wrap("

").parent().html(); - return value - }else if (data.title=='Grand Total'){ - if (data.title==value) { - value = $(`${value}`); - var $value = $(value).css("font-weight", "bold"); - value = $value.wrap("

").parent().html(); - return value - }else{ - value = default_formatter(value, row, column, data); - value = $(`${value}`); - var $value = $(value).css("font-weight", "bold"); - value = $value.wrap("

").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 036e2603103..00000000000 --- 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 15996d2d1f8..00000000000 --- 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 KSA VAT Setting 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 e69de29bb2d..00000000000 diff --git a/erpnext/regional/saudi_arabia/setup.py b/erpnext/regional/saudi_arabia/setup.py deleted file mode 100644 index 7f41c462cce..00000000000 --- 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 cac5ec113e8..00000000000 --- 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 e69de29bb2d..00000000000 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 e69de29bb2d..00000000000 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 60951a9ceca..00000000000 --- 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 e69de29bb2d..00000000000 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 66d9df224e7..00000000000 --- 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 45e39c5bd0b..5750914b9ad 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",