mirror of
https://github.com/frappe/erpnext.git
synced 2026-06-02 11:49:10 +00:00
Merge pull request #27281 from DeeMysterio/party-specific-items
feat: link items to supplier / customer
(cherry picked from commit aa82624f31)
# Conflicts:
# erpnext/controllers/queries.py
# erpnext/hr/doctype/interview_type/interview_type.json
# erpnext/patches.txt
# erpnext/patches/v13_0/replace_supplier_item_group_with_party_specific_item.py
# erpnext/selling/doctype/party_specific_item/party_specific_item.py
# erpnext/selling/doctype/party_specific_item/test_party_specific_item.py
# erpnext/selling/sales_common.js
# erpnext/stock/doctype/stock_reposting_settings/test_stock_reposting_settings.py
This commit is contained in:
@@ -235,6 +235,7 @@ def item_query(doctype, txt, searchfield, start, page_len, filters, as_dict=Fals
|
|||||||
searchfields = " or ".join([field + " like %(txt)s" for field in searchfields])
|
searchfields = " or ".join([field + " like %(txt)s" for field in searchfields])
|
||||||
|
|
||||||
if filters and isinstance(filters, dict):
|
if filters and isinstance(filters, dict):
|
||||||
|
<<<<<<< HEAD
|
||||||
if filters.get("customer") or filters.get("supplier"):
|
if filters.get("customer") or filters.get("supplier"):
|
||||||
party = filters.get("customer") or filters.get("supplier")
|
party = filters.get("customer") or filters.get("supplier")
|
||||||
item_rules_list = frappe.get_all(
|
item_rules_list = frappe.get_all(
|
||||||
@@ -245,13 +246,36 @@ def item_query(doctype, txt, searchfield, start, page_len, filters, as_dict=Fals
|
|||||||
for rule in item_rules_list:
|
for rule in item_rules_list:
|
||||||
if rule["restrict_based_on"] == "Item":
|
if rule["restrict_based_on"] == "Item":
|
||||||
rule["restrict_based_on"] = "name"
|
rule["restrict_based_on"] = "name"
|
||||||
|
=======
|
||||||
|
if filters.get('customer') or filters.get('supplier'):
|
||||||
|
party = filters.get('customer') or filters.get('supplier')
|
||||||
|
item_rules_list = frappe.get_all('Party Specific Item',
|
||||||
|
filters = {'party': party}, fields = ['restrict_based_on', 'based_on_value'])
|
||||||
|
|
||||||
|
filters_dict = {}
|
||||||
|
for rule in item_rules_list:
|
||||||
|
if rule['restrict_based_on'] == 'Item':
|
||||||
|
rule['restrict_based_on'] = 'name'
|
||||||
|
>>>>>>> aa82624f31 (Merge pull request #27281 from DeeMysterio/party-specific-items)
|
||||||
filters_dict[rule.restrict_based_on] = []
|
filters_dict[rule.restrict_based_on] = []
|
||||||
|
|
||||||
for rule in item_rules_list:
|
for rule in item_rules_list:
|
||||||
filters_dict[rule.restrict_based_on].append(rule.based_on_value)
|
filters_dict[rule.restrict_based_on].append(rule.based_on_value)
|
||||||
|
<<<<<<< HEAD
|
||||||
|
|
||||||
for filter in filters_dict:
|
for filter in filters_dict:
|
||||||
filters[scrub(filter)] = ["in", filters_dict[filter]]
|
filters[scrub(filter)] = ["in", filters_dict[filter]]
|
||||||
|
=======
|
||||||
|
|
||||||
|
for filter in filters_dict:
|
||||||
|
filters[scrub(filter)] = ['in', filters_dict[filter]]
|
||||||
|
|
||||||
|
if filters.get('customer'):
|
||||||
|
del filters['customer']
|
||||||
|
else:
|
||||||
|
del filters['supplier']
|
||||||
|
|
||||||
|
>>>>>>> aa82624f31 (Merge pull request #27281 from DeeMysterio/party-specific-items)
|
||||||
|
|
||||||
if filters.get("customer"):
|
if filters.get("customer"):
|
||||||
del filters["customer"]
|
del filters["customer"]
|
||||||
|
|||||||
@@ -311,9 +311,16 @@ execute:frappe.reload_doc("erpnext_integrations", "doctype", "TaxJar Settings")
|
|||||||
execute:frappe.reload_doc("erpnext_integrations", "doctype", "Product Tax Category")
|
execute:frappe.reload_doc("erpnext_integrations", "doctype", "Product Tax Category")
|
||||||
erpnext.patches.v13_0.custom_fields_for_taxjar_integration #08-11-2021
|
erpnext.patches.v13_0.custom_fields_for_taxjar_integration #08-11-2021
|
||||||
erpnext.patches.v13_0.set_operation_time_based_on_operating_cost
|
erpnext.patches.v13_0.set_operation_time_based_on_operating_cost
|
||||||
|
<<<<<<< HEAD
|
||||||
erpnext.patches.v13_0.create_website_items #30-09-2021
|
erpnext.patches.v13_0.create_website_items #30-09-2021
|
||||||
erpnext.patches.v13_0.populate_e_commerce_settings
|
erpnext.patches.v13_0.populate_e_commerce_settings
|
||||||
erpnext.patches.v13_0.make_homepage_products_website_items
|
erpnext.patches.v13_0.make_homepage_products_website_items
|
||||||
|
=======
|
||||||
|
erpnext.patches.v13_0.validate_options_for_data_field
|
||||||
|
erpnext.patches.v13_0.create_gst_payment_entry_fields
|
||||||
|
erpnext.patches.v14_0.delete_shopify_doctypes
|
||||||
|
erpnext.patches.v13_0.replace_supplier_item_group_with_party_specific_item
|
||||||
|
>>>>>>> aa82624f31 (Merge pull request #27281 from DeeMysterio/party-specific-items)
|
||||||
erpnext.patches.v13_0.update_dates_in_tax_withholding_category
|
erpnext.patches.v13_0.update_dates_in_tax_withholding_category
|
||||||
erpnext.patches.v13_0.fix_invoice_statuses
|
erpnext.patches.v13_0.fix_invoice_statuses
|
||||||
erpnext.patches.v13_0.replace_supplier_item_group_with_party_specific_item
|
erpnext.patches.v13_0.replace_supplier_item_group_with_party_specific_item
|
||||||
|
|||||||
@@ -5,7 +5,11 @@ import frappe
|
|||||||
|
|
||||||
|
|
||||||
def execute():
|
def execute():
|
||||||
|
<<<<<<< HEAD
|
||||||
if frappe.db.table_exists("Supplier Item Group"):
|
if frappe.db.table_exists("Supplier Item Group"):
|
||||||
|
=======
|
||||||
|
if frappe.db.table_exists('Supplier Item Group'):
|
||||||
|
>>>>>>> aa82624f31 (Merge pull request #27281 from DeeMysterio/party-specific-items)
|
||||||
frappe.reload_doc("selling", "doctype", "party_specific_item")
|
frappe.reload_doc("selling", "doctype", "party_specific_item")
|
||||||
sig = frappe.db.get_all("Supplier Item Group", fields=["name", "supplier", "item_group"])
|
sig = frappe.db.get_all("Supplier Item Group", fields=["name", "supplier", "item_group"])
|
||||||
for item in sig:
|
for item in sig:
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ from frappe.model.document import Document
|
|||||||
|
|
||||||
class PartySpecificItem(Document):
|
class PartySpecificItem(Document):
|
||||||
def validate(self):
|
def validate(self):
|
||||||
|
<<<<<<< HEAD
|
||||||
exists = frappe.db.exists(
|
exists = frappe.db.exists(
|
||||||
{
|
{
|
||||||
"doctype": "Party Specific Item",
|
"doctype": "Party Specific Item",
|
||||||
@@ -17,5 +18,14 @@ class PartySpecificItem(Document):
|
|||||||
"based_on": self.based_on_value,
|
"based_on": self.based_on_value,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
=======
|
||||||
|
exists = frappe.db.exists({
|
||||||
|
'doctype': 'Party Specific Item',
|
||||||
|
'party_type': self.party_type,
|
||||||
|
'party': self.party,
|
||||||
|
'restrict_based_on': self.restrict_based_on,
|
||||||
|
'based_on': self.based_on_value,
|
||||||
|
})
|
||||||
|
>>>>>>> aa82624f31 (Merge pull request #27281 from DeeMysterio/party-specific-items)
|
||||||
if exists:
|
if exists:
|
||||||
frappe.throw(_("This item filter has already been applied for the {0}").format(self.party_type))
|
frappe.throw(_("This item filter has already been applied for the {0}").format(self.party_type))
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# Copyright (c) 2021, Frappe Technologies Pvt. Ltd. and Contributors
|
# Copyright (c) 2021, Frappe Technologies Pvt. Ltd. and Contributors
|
||||||
# See license.txt
|
# See license.txt
|
||||||
|
|
||||||
|
<<<<<<< HEAD
|
||||||
import frappe
|
import frappe
|
||||||
from frappe.tests.utils import FrappeTestCase
|
from frappe.tests.utils import FrappeTestCase
|
||||||
|
|
||||||
@@ -19,12 +20,32 @@ def create_party_specific_item(**args):
|
|||||||
|
|
||||||
|
|
||||||
class TestPartySpecificItem(FrappeTestCase):
|
class TestPartySpecificItem(FrappeTestCase):
|
||||||
|
=======
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
import frappe
|
||||||
|
|
||||||
|
from erpnext.controllers.queries import item_query
|
||||||
|
|
||||||
|
test_dependencies = ['Item', 'Customer', 'Supplier']
|
||||||
|
|
||||||
|
def create_party_specific_item(**args):
|
||||||
|
psi = frappe.new_doc("Party Specific Item")
|
||||||
|
psi.party_type = args.get('party_type')
|
||||||
|
psi.party = args.get('party')
|
||||||
|
psi.restrict_based_on = args.get('restrict_based_on')
|
||||||
|
psi.based_on_value = args.get('based_on_value')
|
||||||
|
psi.insert()
|
||||||
|
|
||||||
|
class TestPartySpecificItem(unittest.TestCase):
|
||||||
|
>>>>>>> aa82624f31 (Merge pull request #27281 from DeeMysterio/party-specific-items)
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.customer = frappe.get_last_doc("Customer")
|
self.customer = frappe.get_last_doc("Customer")
|
||||||
self.supplier = frappe.get_last_doc("Supplier")
|
self.supplier = frappe.get_last_doc("Supplier")
|
||||||
self.item = frappe.get_last_doc("Item")
|
self.item = frappe.get_last_doc("Item")
|
||||||
|
|
||||||
def test_item_query_for_customer(self):
|
def test_item_query_for_customer(self):
|
||||||
|
<<<<<<< HEAD
|
||||||
create_party_specific_item(
|
create_party_specific_item(
|
||||||
party_type="Customer",
|
party_type="Customer",
|
||||||
party=self.customer.name,
|
party=self.customer.name,
|
||||||
@@ -35,10 +56,16 @@ class TestPartySpecificItem(FrappeTestCase):
|
|||||||
items = item_query(
|
items = item_query(
|
||||||
doctype="Item", txt="", searchfield="name", start=0, page_len=20, filters=filters, as_dict=False
|
doctype="Item", txt="", searchfield="name", start=0, page_len=20, filters=filters, as_dict=False
|
||||||
)
|
)
|
||||||
|
=======
|
||||||
|
create_party_specific_item(party_type='Customer', party=self.customer.name, restrict_based_on='Item', based_on_value=self.item.name)
|
||||||
|
filters = {'is_sales_item': 1, 'customer': self.customer.name}
|
||||||
|
items = item_query(doctype= 'Item', txt= '', searchfield= 'name', start= 0, page_len= 20,filters=filters, as_dict= False)
|
||||||
|
>>>>>>> aa82624f31 (Merge pull request #27281 from DeeMysterio/party-specific-items)
|
||||||
for item in items:
|
for item in items:
|
||||||
self.assertEqual(item[0], self.item.name)
|
self.assertEqual(item[0], self.item.name)
|
||||||
|
|
||||||
def test_item_query_for_supplier(self):
|
def test_item_query_for_supplier(self):
|
||||||
|
<<<<<<< HEAD
|
||||||
create_party_specific_item(
|
create_party_specific_item(
|
||||||
party_type="Supplier",
|
party_type="Supplier",
|
||||||
party=self.supplier.name,
|
party=self.supplier.name,
|
||||||
@@ -49,5 +76,10 @@ class TestPartySpecificItem(FrappeTestCase):
|
|||||||
items = item_query(
|
items = item_query(
|
||||||
doctype="Item", txt="", searchfield="name", start=0, page_len=20, filters=filters, as_dict=False
|
doctype="Item", txt="", searchfield="name", start=0, page_len=20, filters=filters, as_dict=False
|
||||||
)
|
)
|
||||||
|
=======
|
||||||
|
create_party_specific_item(party_type='Supplier', party=self.supplier.name, restrict_based_on='Item Group', based_on_value=self.item.item_group)
|
||||||
|
filters = {'supplier': self.supplier.name, 'is_purchase_item': 1}
|
||||||
|
items = item_query(doctype= 'Item', txt= '', searchfield= 'name', start= 0, page_len= 20,filters=filters, as_dict= False)
|
||||||
|
>>>>>>> aa82624f31 (Merge pull request #27281 from DeeMysterio/party-specific-items)
|
||||||
for item in items:
|
for item in items:
|
||||||
self.assertEqual(item[2], self.item.item_group)
|
self.assertEqual(item[2], self.item.item_group)
|
||||||
|
|||||||
@@ -63,7 +63,11 @@ erpnext.selling.SellingController = erpnext.TransactionController.extend({
|
|||||||
this.frm.set_query("item_code", "items", function() {
|
this.frm.set_query("item_code", "items", function() {
|
||||||
return {
|
return {
|
||||||
query: "erpnext.controllers.queries.item_query",
|
query: "erpnext.controllers.queries.item_query",
|
||||||
|
<<<<<<< HEAD
|
||||||
filters: {'is_sales_item': 1, 'customer': cur_frm.doc.customer, 'has_variants': 0}
|
filters: {'is_sales_item': 1, 'customer': cur_frm.doc.customer, 'has_variants': 0}
|
||||||
|
=======
|
||||||
|
filters: {'is_sales_item': 1, 'customer': cur_frm.doc.customer}
|
||||||
|
>>>>>>> aa82624f31 (Merge pull request #27281 from DeeMysterio/party-specific-items)
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user