diff --git a/erpnext/buying/doctype/request_for_quotation/test_request_for_quotation.py b/erpnext/buying/doctype/request_for_quotation/test_request_for_quotation.py index fb2d893a4c9f15d7eaca1b149a4cc64298edd5f6..79e30edcd28d36f19323014699ef46bd61d321d3 100644 --- a/erpnext/buying/doctype/request_for_quotation/test_request_for_quotation.py +++ b/erpnext/buying/doctype/request_for_quotation/test_request_for_quotation.py @@ -76,6 +76,46 @@ class TestRequestforQuotation(IntegrationTestCase): self.assertEqual(sq1.get("items")[0].item_code, "_Test Item") self.assertEqual(sq1.get("items")[0].qty, 5) + def test_make_supplier_quotation_with_taxes(self): + """Test automatic tax addition when supplier quotation is created from RFQ taxes_and_charges are set""" + + # Create a Purchase Taxes and Charges Template for testing + tax_template = frappe.new_doc("Purchase Taxes and Charges Template") + tax_template.doctype = "Purchase Taxes and Charges Template" + tax_template.title = "_Test Purchase Taxes Template for RFQ" + tax_template.company = "_Test Company" + tax_template.append( + "taxes", + { + "charge_type": "On Net Total", + "account_head": "_Test Account Service Tax - _TC", + "description": "VAT", + "rate": 10, + }, + ) + tax_template.save() + + rfq = make_request_for_quotation() + supplier = rfq.get("suppliers")[0].supplier + + tax_rule = frappe.new_doc("Tax Rule") + tax_rule.company = "_Test Company" + tax_rule.tax_type = "Purchase" + tax_rule.supplier = supplier + tax_rule.purchase_tax_template = tax_template.name + tax_rule.save() + + sq = make_supplier_quotation_from_rfq(rfq.name, for_supplier=supplier) + + # Verify that taxes_and_charges is set from get_party_details + self.assertEqual(sq.taxes_and_charges, tax_template.name) + + # Verify that taxes are automatically added + self.assertGreaterEqual(len(sq.get("taxes")), 1) + + tax_rule.delete() + tax_template.delete() + def test_make_supplier_quotation_with_special_characters(self): frappe.delete_doc_if_exists("Supplier", "_Test Supplier '1", force=1) supplier = frappe.new_doc("Supplier") diff --git a/erpnext/controllers/buying_controller.py b/erpnext/controllers/buying_controller.py index b13bca3ca362791d70f5be179734f86ad21d6dac..d883c3adc72fe2c2d0fecde47520aca01c91c885 100644 --- a/erpnext/controllers/buying_controller.py +++ b/erpnext/controllers/buying_controller.py @@ -15,6 +15,7 @@ from erpnext.accounts.doctype.accounting_dimension.accounting_dimension import g from erpnext.accounts.doctype.budget.budget import validate_expense_against_budget from erpnext.accounts.party import get_party_details from erpnext.buying.utils import update_last_purchase_rate, validate_for_items +from erpnext.controllers.accounts_controller import get_taxes_and_charges from erpnext.controllers.sales_and_purchase_return import get_rate_for_return from erpnext.controllers.subcontracting_controller import SubcontractingController from erpnext.stock.get_item_details import get_conversion_factor, get_item_defaults @@ -216,6 +217,12 @@ class BuyingController(SubcontractingController): self.set_missing_item_details(for_validate) + if self.meta.get_field("taxes"): + if self.get("taxes_and_charges") and not self.get("taxes") and not for_validate: + taxes = get_taxes_and_charges("Purchase Taxes and Charges Template", self.taxes_and_charges) + for tax in taxes: + self.append("taxes", tax) + def set_supplier_from_item_default(self): if self.meta.get_field("supplier") and not self.supplier: for d in self.get("items"):