Merge pull request #25622 from noahjacob/promo_scheme_feat
feat: added multi-select fields to create multiple pricing rules.
This commit is contained in:
		
						commit
						d657f39ab8
					
				
							
								
								
									
										0
									
								
								erpnext/accounts/doctype/campaign_item/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								erpnext/accounts/doctype/campaign_item/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										31
									
								
								erpnext/accounts/doctype/campaign_item/campaign_item.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								erpnext/accounts/doctype/campaign_item/campaign_item.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,31 @@ | ||||
| { | ||||
|  "actions": [], | ||||
|  "creation": "2021-05-06 16:18:25.410476", | ||||
|  "doctype": "DocType", | ||||
|  "editable_grid": 1, | ||||
|  "engine": "InnoDB", | ||||
|  "field_order": [ | ||||
|   "campaign" | ||||
|  ], | ||||
|  "fields": [ | ||||
|   { | ||||
|    "fieldname": "campaign", | ||||
|    "fieldtype": "Link", | ||||
|    "in_list_view": 1, | ||||
|    "label": "Campaign", | ||||
|    "options": "Campaign" | ||||
|   } | ||||
|  ], | ||||
|  "index_web_pages_for_search": 1, | ||||
|  "istable": 1, | ||||
|  "links": [], | ||||
|  "modified": "2021-05-07 10:43:49.717633", | ||||
|  "modified_by": "Administrator", | ||||
|  "module": "Accounts", | ||||
|  "name": "Campaign Item", | ||||
|  "owner": "Administrator", | ||||
|  "permissions": [], | ||||
|  "sort_field": "modified", | ||||
|  "sort_order": "DESC", | ||||
|  "track_changes": 1 | ||||
| } | ||||
							
								
								
									
										8
									
								
								erpnext/accounts/doctype/campaign_item/campaign_item.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								erpnext/accounts/doctype/campaign_item/campaign_item.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,8 @@ | ||||
| # Copyright (c) 2021, Frappe Technologies Pvt. Ltd. and contributors | ||||
| # For license information, please see license.txt | ||||
| 
 | ||||
| # import frappe | ||||
| from frappe.model.document import Document | ||||
| 
 | ||||
| class CampaignItem(Document): | ||||
| 	pass | ||||
| @ -57,7 +57,7 @@ def test_create_test_data(): | ||||
| 		}) | ||||
| 		item_price.insert() | ||||
| 	# create test item pricing rule | ||||
| 	if not frappe.db.exists("Pricing Rule","_Test Pricing Rule for _Test Item"): | ||||
| 	if not frappe.db.exists("Pricing Rule", {"title": "_Test Pricing Rule for _Test Item"}): | ||||
| 		item_pricing_rule = frappe.get_doc({ | ||||
| 		"doctype": "Pricing Rule", | ||||
| 		"title": "_Test Pricing Rule for _Test Item", | ||||
| @ -86,14 +86,15 @@ def test_create_test_data(): | ||||
| 		sales_partner.insert() | ||||
| 	# create test item coupon code | ||||
| 	if not frappe.db.exists("Coupon Code", "SAVE30"): | ||||
| 		pricing_rule = frappe.db.get_value("Pricing Rule", {"title": "_Test Pricing Rule for _Test Item"}, ['name']) | ||||
| 		coupon_code = frappe.get_doc({ | ||||
| 		"doctype": "Coupon Code", | ||||
| 		"coupon_name":"SAVE30", | ||||
| 		"coupon_code":"SAVE30", | ||||
| 		"pricing_rule": "_Test Pricing Rule for _Test Item", | ||||
| 		"valid_from": "2014-01-01", | ||||
| 		"maximum_use":1, | ||||
| 		"used":0 | ||||
| 			"doctype": "Coupon Code", | ||||
| 			"coupon_name":"SAVE30", | ||||
| 			"coupon_code":"SAVE30", | ||||
| 			"pricing_rule": pricing_rule, | ||||
| 			"valid_from": "2014-01-01", | ||||
| 			"maximum_use":1, | ||||
| 			"used":0 | ||||
| 		}) | ||||
| 		coupon_code.insert() | ||||
| 
 | ||||
| @ -102,7 +103,7 @@ class TestCouponCode(unittest.TestCase): | ||||
| 		test_create_test_data() | ||||
| 
 | ||||
| 	def tearDown(self): | ||||
| 		frappe.set_user("Administrator")		 | ||||
| 		frappe.set_user("Administrator") | ||||
| 
 | ||||
| 	def test_sales_order_with_coupon_code(self): | ||||
| 		frappe.db.set_value("Coupon Code", "SAVE30", "used", 0) | ||||
|  | ||||
| @ -0,0 +1,31 @@ | ||||
| { | ||||
|  "actions": [], | ||||
|  "creation": "2021-05-06 16:12:42.558878", | ||||
|  "doctype": "DocType", | ||||
|  "editable_grid": 1, | ||||
|  "engine": "InnoDB", | ||||
|  "field_order": [ | ||||
|   "customer_group" | ||||
|  ], | ||||
|  "fields": [ | ||||
|   { | ||||
|    "fieldname": "customer_group", | ||||
|    "fieldtype": "Link", | ||||
|    "in_list_view": 1, | ||||
|    "label": "Customer Group", | ||||
|    "options": "Customer Group" | ||||
|   } | ||||
|  ], | ||||
|  "index_web_pages_for_search": 1, | ||||
|  "istable": 1, | ||||
|  "links": [], | ||||
|  "modified": "2021-05-07 10:39:21.563506", | ||||
|  "modified_by": "Administrator", | ||||
|  "module": "Accounts", | ||||
|  "name": "Customer Group Item", | ||||
|  "owner": "Administrator", | ||||
|  "permissions": [], | ||||
|  "sort_field": "modified", | ||||
|  "sort_order": "DESC", | ||||
|  "track_changes": 1 | ||||
| } | ||||
| @ -0,0 +1,8 @@ | ||||
| # Copyright (c) 2021, Frappe Technologies Pvt. Ltd. and contributors | ||||
| # For license information, please see license.txt | ||||
| 
 | ||||
| # import frappe | ||||
| from frappe.model.document import Document | ||||
| 
 | ||||
| class CustomerGroupItem(Document): | ||||
| 	pass | ||||
							
								
								
									
										0
									
								
								erpnext/accounts/doctype/customer_item/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								erpnext/accounts/doctype/customer_item/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										31
									
								
								erpnext/accounts/doctype/customer_item/customer_item.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								erpnext/accounts/doctype/customer_item/customer_item.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,31 @@ | ||||
| { | ||||
|  "actions": [], | ||||
|  "creation": "2021-05-05 14:04:54.266353", | ||||
|  "doctype": "DocType", | ||||
|  "editable_grid": 1, | ||||
|  "engine": "InnoDB", | ||||
|  "field_order": [ | ||||
|   "customer" | ||||
|  ], | ||||
|  "fields": [ | ||||
|   { | ||||
|    "fieldname": "customer", | ||||
|    "fieldtype": "Link", | ||||
|    "in_list_view": 1, | ||||
|    "label": "Customer ", | ||||
|    "options": "Customer" | ||||
|   } | ||||
|  ], | ||||
|  "index_web_pages_for_search": 1, | ||||
|  "istable": 1, | ||||
|  "links": [], | ||||
|  "modified": "2021-05-06 10:02:32.967841", | ||||
|  "modified_by": "Administrator", | ||||
|  "module": "Accounts", | ||||
|  "name": "Customer Item", | ||||
|  "owner": "Administrator", | ||||
|  "permissions": [], | ||||
|  "sort_field": "modified", | ||||
|  "sort_order": "DESC", | ||||
|  "track_changes": 1 | ||||
| } | ||||
							
								
								
									
										8
									
								
								erpnext/accounts/doctype/customer_item/customer_item.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								erpnext/accounts/doctype/customer_item/customer_item.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,8 @@ | ||||
| # Copyright (c) 2021, Frappe Technologies Pvt. Ltd. and contributors | ||||
| # For license information, please see license.txt | ||||
| 
 | ||||
| # import frappe | ||||
| from frappe.model.document import Document | ||||
| 
 | ||||
| class CustomerItem(Document): | ||||
| 	pass | ||||
| @ -2,12 +2,13 @@ | ||||
|  "actions": [], | ||||
|  "allow_import": 1, | ||||
|  "allow_rename": 1, | ||||
|  "autoname": "field:title", | ||||
|  "autoname": "naming_series:", | ||||
|  "creation": "2014-02-21 15:02:51", | ||||
|  "doctype": "DocType", | ||||
|  "engine": "InnoDB", | ||||
|  "field_order": [ | ||||
|   "applicability_section", | ||||
|   "naming_series", | ||||
|   "title", | ||||
|   "disable", | ||||
|   "apply_on", | ||||
| @ -95,8 +96,7 @@ | ||||
|    "fieldtype": "Data", | ||||
|    "label": "Title", | ||||
|    "no_copy": 1, | ||||
|    "reqd": 1, | ||||
|    "unique": 1 | ||||
|    "reqd": 1 | ||||
|   }, | ||||
|   { | ||||
|    "default": "0", | ||||
| @ -571,6 +571,13 @@ | ||||
|    "fieldname": "is_recursive", | ||||
|    "fieldtype": "Check", | ||||
|    "label": "Is Recursive" | ||||
|   }, | ||||
|   { | ||||
|    "default": "PRLE-.####", | ||||
|    "fieldname": "naming_series", | ||||
|    "fieldtype": "Select", | ||||
|    "label": "Naming Series", | ||||
|    "options": "PRLE-.####" | ||||
|   } | ||||
|  ], | ||||
|  "icon": "fa fa-gift", | ||||
| @ -634,5 +641,6 @@ | ||||
|  ], | ||||
|  "show_name_in_global_search": 1, | ||||
|  "sort_field": "modified", | ||||
|  "sort_order": "DESC" | ||||
| } | ||||
|  "sort_order": "DESC", | ||||
|  "title_field": "title" | ||||
| } | ||||
|  | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -25,22 +25,31 @@ product_discount_fields = ['free_item', 'free_qty', 'free_item_uom', | ||||
| 
 | ||||
| class PromotionalScheme(Document): | ||||
| 	def validate(self): | ||||
| 		if not self.selling and not self.buying: | ||||
| 			frappe.throw(_("Either 'Selling' or 'Buying' must be selected"), title=_("Mandatory")) | ||||
| 		if not (self.price_discount_slabs | ||||
| 			or self.product_discount_slabs): | ||||
| 			frappe.throw(_("Price or product discount slabs are required")) | ||||
| 
 | ||||
| 	def on_update(self): | ||||
| 		data = frappe.get_all('Pricing Rule', fields = ["promotional_scheme_id", "name"], | ||||
| 			filters = {'promotional_scheme': self.name}) or {} | ||||
| 		pricing_rules = frappe.get_all( | ||||
| 			'Pricing Rule', | ||||
| 			fields = ["promotional_scheme_id", "name", "creation"], | ||||
| 			filters = { | ||||
| 				'promotional_scheme': self.name, | ||||
| 				'applicable_for': self.applicable_for | ||||
| 			}, | ||||
| 			order_by = 'creation asc', | ||||
| 		) or {} | ||||
| 		self.update_pricing_rules(pricing_rules) | ||||
| 
 | ||||
| 		self.update_pricing_rules(data) | ||||
| 
 | ||||
| 	def update_pricing_rules(self, data): | ||||
| 	def update_pricing_rules(self, pricing_rules): | ||||
| 		rules = {} | ||||
| 		count = 0 | ||||
| 
 | ||||
| 		for d in data: | ||||
| 			rules[d.get('promotional_scheme_id')] = d.get('name') | ||||
| 		names = [] | ||||
| 		for rule in pricing_rules: | ||||
| 			names.append(rule.name) | ||||
| 			rules[rule.get('promotional_scheme_id')] = names | ||||
| 
 | ||||
| 		docs = get_pricing_rules(self, rules) | ||||
| 
 | ||||
| @ -57,9 +66,9 @@ class PromotionalScheme(Document): | ||||
| 			frappe.msgprint(_("New {0} pricing rules are created").format(count)) | ||||
| 
 | ||||
| 	def on_trash(self): | ||||
| 		for d in frappe.get_all('Pricing Rule', | ||||
| 		for rule in frappe.get_all('Pricing Rule', | ||||
| 			{'promotional_scheme': self.name}): | ||||
| 			frappe.delete_doc('Pricing Rule', d.name) | ||||
| 			frappe.delete_doc('Pricing Rule', rule.name) | ||||
| 
 | ||||
| def get_pricing_rules(doc, rules = {}): | ||||
| 	new_doc = [] | ||||
| @ -73,42 +82,80 @@ def get_pricing_rules(doc, rules = {}): | ||||
| def _get_pricing_rules(doc, child_doc, discount_fields, rules = {}): | ||||
| 	new_doc = [] | ||||
| 	args = get_args_for_pricing_rule(doc) | ||||
| 	for d in doc.get(child_doc): | ||||
| 	applicable_for = frappe.scrub(doc.get('applicable_for')) | ||||
| 	for idx, d in enumerate(doc.get(child_doc)): | ||||
| 		if d.name in rules: | ||||
| 			pr = frappe.get_doc('Pricing Rule', rules.get(d.name)) | ||||
| 			for applicable_for_value in args.get(applicable_for): | ||||
| 				temp_args = args.copy() | ||||
| 				docname = frappe.get_all( | ||||
| 					'Pricing Rule', | ||||
| 					fields = ["promotional_scheme_id", "name", applicable_for], | ||||
| 					filters = { | ||||
| 						'promotional_scheme_id': d.name, | ||||
| 						applicable_for: applicable_for_value | ||||
| 					} | ||||
| 				) | ||||
| 
 | ||||
| 				if docname: | ||||
| 					pr = frappe.get_doc('Pricing Rule', docname[0].get('name')) | ||||
| 					temp_args[applicable_for] = applicable_for_value | ||||
| 					pr = set_args(temp_args, pr, doc, child_doc, discount_fields, d) | ||||
| 				else: | ||||
| 					pr = frappe.new_doc("Pricing Rule") | ||||
| 					pr.title = doc.name | ||||
| 					temp_args[applicable_for] = applicable_for_value | ||||
| 					pr = set_args(temp_args, pr, doc, child_doc, discount_fields, d) | ||||
| 
 | ||||
| 				new_doc.append(pr) | ||||
| 
 | ||||
| 		else: | ||||
| 			pr = frappe.new_doc("Pricing Rule") | ||||
| 			pr.title = make_autoname("{0}/.####".format(doc.name)) | ||||
| 
 | ||||
| 		pr.update(args) | ||||
| 		for field in (other_fields + discount_fields): | ||||
| 			pr.set(field, d.get(field)) | ||||
| 
 | ||||
| 		pr.promotional_scheme_id = d.name | ||||
| 		pr.promotional_scheme = doc.name | ||||
| 		pr.disable = d.disable if d.disable else doc.disable | ||||
| 		pr.price_or_product_discount = ('Price' | ||||
| 			if child_doc == 'price_discount_slabs' else 'Product') | ||||
| 
 | ||||
| 		for field in ['items', 'item_groups', 'brands']: | ||||
| 			if doc.get(field): | ||||
| 				pr.set(field, []) | ||||
| 
 | ||||
| 			apply_on = frappe.scrub(doc.get('apply_on')) | ||||
| 			for d in doc.get(field): | ||||
| 				pr.append(field, { | ||||
| 					apply_on: d.get(apply_on), | ||||
| 					'uom': d.uom | ||||
| 				}) | ||||
| 
 | ||||
| 		new_doc.append(pr) | ||||
| 			applicable_for_values = args.get(applicable_for) or [] | ||||
| 			for applicable_for_value in applicable_for_values: | ||||
| 				pr = frappe.new_doc("Pricing Rule") | ||||
| 				pr.title = doc.name | ||||
| 				temp_args = args.copy() | ||||
| 				temp_args[applicable_for] = applicable_for_value | ||||
| 				pr = set_args(temp_args, pr, doc, child_doc, discount_fields, d) | ||||
| 				new_doc.append(pr) | ||||
| 
 | ||||
| 	return new_doc | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| def set_args(args, pr, doc, child_doc, discount_fields, child_doc_fields): | ||||
| 	pr.update(args) | ||||
| 	for field in (other_fields + discount_fields): | ||||
| 		pr.set(field, child_doc_fields.get(field)) | ||||
| 
 | ||||
| 	pr.promotional_scheme_id = child_doc_fields.name | ||||
| 	pr.promotional_scheme = doc.name | ||||
| 	pr.disable = child_doc_fields.disable if child_doc_fields.disable else doc.disable | ||||
| 	pr.price_or_product_discount = ('Price' | ||||
| 		if child_doc == 'price_discount_slabs' else 'Product') | ||||
| 
 | ||||
| 	for field in ['items', 'item_groups', 'brands']: | ||||
| 		if doc.get(field): | ||||
| 			pr.set(field, []) | ||||
| 
 | ||||
| 		apply_on = frappe.scrub(doc.get('apply_on')) | ||||
| 		for d in doc.get(field): | ||||
| 			pr.append(field, { | ||||
| 				apply_on: d.get(apply_on), | ||||
| 				'uom': d.uom | ||||
| 			}) | ||||
| 	return pr | ||||
| 
 | ||||
| def get_args_for_pricing_rule(doc): | ||||
| 	args = { 'promotional_scheme': doc.name } | ||||
| 	applicable_for = frappe.scrub(doc.get('applicable_for')) | ||||
| 
 | ||||
| 	for d in pricing_rule_fields: | ||||
| 		args[d] = doc.get(d) | ||||
| 
 | ||||
| 		if d == applicable_for: | ||||
| 			items = [] | ||||
| 			for applicable_for_values in doc.get(applicable_for): | ||||
| 				items.append(applicable_for_values.get(applicable_for)) | ||||
| 			args[d] = items | ||||
| 		else: | ||||
| 			args[d] = doc.get(d) | ||||
| 	return args | ||||
|  | ||||
| @ -7,4 +7,54 @@ import frappe | ||||
| import unittest | ||||
| 
 | ||||
| class TestPromotionalScheme(unittest.TestCase): | ||||
| 	pass | ||||
| 	def test_promotional_scheme(self): | ||||
| 		ps = make_promotional_scheme() | ||||
| 		price_rules = frappe.get_all('Pricing Rule', fields = ["promotional_scheme_id", "name", "creation"], | ||||
| 			filters = {'promotional_scheme': ps.name}) | ||||
| 		self.assertTrue(len(price_rules),1)  | ||||
| 		price_doc_details = frappe.db.get_value('Pricing Rule', price_rules[0].name, ['customer', 'min_qty', 'discount_percentage'], as_dict = 1) | ||||
| 		self.assertTrue(price_doc_details.customer, '_Test Customer') | ||||
| 		self.assertTrue(price_doc_details.min_qty, 4) | ||||
| 		self.assertTrue(price_doc_details.discount_percentage, 20) | ||||
| 
 | ||||
| 		ps.price_discount_slabs[0].min_qty = 6 | ||||
| 		ps.append('customer', {   | ||||
| 			'customer': "_Test Customer 2"}) | ||||
| 		ps.save() | ||||
| 		price_rules = frappe.get_all('Pricing Rule', fields = ["promotional_scheme_id", "name"], | ||||
| 			filters = {'promotional_scheme': ps.name}) | ||||
| 		self.assertTrue(len(price_rules), 2)  | ||||
| 
 | ||||
| 		price_doc_details = frappe.db.get_value('Pricing Rule', price_rules[1].name, ['customer', 'min_qty', 'discount_percentage'], as_dict = 1) | ||||
| 		self.assertTrue(price_doc_details.customer, '_Test Customer 2') | ||||
| 		self.assertTrue(price_doc_details.min_qty, 6) | ||||
| 		self.assertTrue(price_doc_details.discount_percentage, 20) | ||||
| 		 | ||||
| 		price_doc_details = frappe.db.get_value('Pricing Rule', price_rules[0].name, ['customer', 'min_qty', 'discount_percentage'], as_dict = 1) | ||||
| 		self.assertTrue(price_doc_details.customer, '_Test Customer') | ||||
| 		self.assertTrue(price_doc_details.min_qty, 6) | ||||
| 
 | ||||
| 		frappe.delete_doc('Promotional Scheme', ps.name) | ||||
| 		price_rules = frappe.get_all('Pricing Rule', fields = ["promotional_scheme_id", "name"], | ||||
| 			filters = {'promotional_scheme': ps.name}) | ||||
| 		self.assertEqual(price_rules, []) | ||||
| 		 | ||||
| def make_promotional_scheme(): | ||||
| 	ps = frappe.new_doc('Promotional Scheme') | ||||
| 	ps.name = '_Test Scheme' | ||||
| 	ps.append('items',{ | ||||
| 		'item_code': '_Test Item' | ||||
| 	}) | ||||
| 	ps.selling = 1 | ||||
| 	ps.append('price_discount_slabs',{ | ||||
| 		'min_qty': 4, | ||||
| 		'discount_percentage': 20, | ||||
| 		'rule_description': 'Test' | ||||
| 	}) | ||||
| 	ps.applicable_for = 'Customer' | ||||
| 	ps.append('customer',{ | ||||
| 		'customer': "_Test Customer" | ||||
| 	}) | ||||
| 	ps.save() | ||||
| 
 | ||||
| 	return ps | ||||
| @ -0,0 +1,31 @@ | ||||
| { | ||||
|  "actions": [], | ||||
|  "creation": "2021-05-06 16:17:44.329943", | ||||
|  "doctype": "DocType", | ||||
|  "editable_grid": 1, | ||||
|  "engine": "InnoDB", | ||||
|  "field_order": [ | ||||
|   "sales_partner" | ||||
|  ], | ||||
|  "fields": [ | ||||
|   { | ||||
|    "fieldname": "sales_partner", | ||||
|    "fieldtype": "Link", | ||||
|    "in_list_view": 1, | ||||
|    "label": "Sales Partner ", | ||||
|    "options": "Sales Partner" | ||||
|   } | ||||
|  ], | ||||
|  "index_web_pages_for_search": 1, | ||||
|  "istable": 1, | ||||
|  "links": [], | ||||
|  "modified": "2021-05-07 10:43:37.532095", | ||||
|  "modified_by": "Administrator", | ||||
|  "module": "Accounts", | ||||
|  "name": "Sales Partner Item", | ||||
|  "owner": "Administrator", | ||||
|  "permissions": [], | ||||
|  "sort_field": "modified", | ||||
|  "sort_order": "DESC", | ||||
|  "track_changes": 1 | ||||
| } | ||||
| @ -0,0 +1,8 @@ | ||||
| # Copyright (c) 2021, Frappe Technologies Pvt. Ltd. and contributors | ||||
| # For license information, please see license.txt | ||||
| 
 | ||||
| # import frappe | ||||
| from frappe.model.document import Document | ||||
| 
 | ||||
| class SalesPartnerItem(Document): | ||||
| 	pass | ||||
| @ -0,0 +1,31 @@ | ||||
| { | ||||
|  "actions": [], | ||||
|  "creation": "2021-05-06 16:19:22.040795", | ||||
|  "doctype": "DocType", | ||||
|  "editable_grid": 1, | ||||
|  "engine": "InnoDB", | ||||
|  "field_order": [ | ||||
|   "supplier_group" | ||||
|  ], | ||||
|  "fields": [ | ||||
|   { | ||||
|    "fieldname": "supplier_group", | ||||
|    "fieldtype": "Link", | ||||
|    "in_list_view": 1, | ||||
|    "label": "Supplier Group", | ||||
|    "options": "Supplier Group" | ||||
|   } | ||||
|  ], | ||||
|  "index_web_pages_for_search": 1, | ||||
|  "istable": 1, | ||||
|  "links": [], | ||||
|  "modified": "2021-05-07 10:43:59.877938", | ||||
|  "modified_by": "Administrator", | ||||
|  "module": "Accounts", | ||||
|  "name": "Supplier Group Item", | ||||
|  "owner": "Administrator", | ||||
|  "permissions": [], | ||||
|  "sort_field": "modified", | ||||
|  "sort_order": "DESC", | ||||
|  "track_changes": 1 | ||||
| } | ||||
| @ -0,0 +1,8 @@ | ||||
| # Copyright (c) 2021, Frappe Technologies Pvt. Ltd. and contributors | ||||
| # For license information, please see license.txt | ||||
| 
 | ||||
| # import frappe | ||||
| from frappe.model.document import Document | ||||
| 
 | ||||
| class SupplierGroupItem(Document): | ||||
| 	pass | ||||
							
								
								
									
										0
									
								
								erpnext/accounts/doctype/supplier_item/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								erpnext/accounts/doctype/supplier_item/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										31
									
								
								erpnext/accounts/doctype/supplier_item/supplier_item.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								erpnext/accounts/doctype/supplier_item/supplier_item.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,31 @@ | ||||
| { | ||||
|  "actions": [], | ||||
|  "creation": "2021-05-06 16:18:54.758468", | ||||
|  "doctype": "DocType", | ||||
|  "editable_grid": 1, | ||||
|  "engine": "InnoDB", | ||||
|  "field_order": [ | ||||
|   "supplier" | ||||
|  ], | ||||
|  "fields": [ | ||||
|   { | ||||
|    "fieldname": "supplier", | ||||
|    "fieldtype": "Link", | ||||
|    "in_list_view": 1, | ||||
|    "label": "Supplier", | ||||
|    "options": "Supplier" | ||||
|   } | ||||
|  ], | ||||
|  "index_web_pages_for_search": 1, | ||||
|  "istable": 1, | ||||
|  "links": [], | ||||
|  "modified": "2021-05-07 10:44:09.707778", | ||||
|  "modified_by": "Administrator", | ||||
|  "module": "Accounts", | ||||
|  "name": "Supplier Item", | ||||
|  "owner": "Administrator", | ||||
|  "permissions": [], | ||||
|  "sort_field": "modified", | ||||
|  "sort_order": "DESC", | ||||
|  "track_changes": 1 | ||||
| } | ||||
							
								
								
									
										8
									
								
								erpnext/accounts/doctype/supplier_item/supplier_item.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								erpnext/accounts/doctype/supplier_item/supplier_item.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,8 @@ | ||||
| # Copyright (c) 2021, Frappe Technologies Pvt. Ltd. and contributors | ||||
| # For license information, please see license.txt | ||||
| 
 | ||||
| # import frappe | ||||
| from frappe.model.document import Document | ||||
| 
 | ||||
| class SupplierItem(Document): | ||||
| 	pass | ||||
							
								
								
									
										0
									
								
								erpnext/accounts/doctype/territory_item/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								erpnext/accounts/doctype/territory_item/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										31
									
								
								erpnext/accounts/doctype/territory_item/territory_item.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								erpnext/accounts/doctype/territory_item/territory_item.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,31 @@ | ||||
| { | ||||
|  "actions": [], | ||||
|  "creation": "2021-05-06 16:16:51.885441", | ||||
|  "doctype": "DocType", | ||||
|  "editable_grid": 1, | ||||
|  "engine": "InnoDB", | ||||
|  "field_order": [ | ||||
|   "territory" | ||||
|  ], | ||||
|  "fields": [ | ||||
|   { | ||||
|    "fieldname": "territory", | ||||
|    "fieldtype": "Link", | ||||
|    "in_list_view": 1, | ||||
|    "label": "Territory", | ||||
|    "options": "Territory" | ||||
|   } | ||||
|  ], | ||||
|  "index_web_pages_for_search": 1, | ||||
|  "istable": 1, | ||||
|  "links": [], | ||||
|  "modified": "2021-05-07 10:43:26.641030", | ||||
|  "modified_by": "Administrator", | ||||
|  "module": "Accounts", | ||||
|  "name": "Territory Item", | ||||
|  "owner": "Administrator", | ||||
|  "permissions": [], | ||||
|  "sort_field": "modified", | ||||
|  "sort_order": "DESC", | ||||
|  "track_changes": 1 | ||||
| } | ||||
| @ -0,0 +1,8 @@ | ||||
| # Copyright (c) 2021, Frappe Technologies Pvt. Ltd. and contributors | ||||
| # For license information, please see license.txt | ||||
| 
 | ||||
| # import frappe | ||||
| from frappe.model.document import Document | ||||
| 
 | ||||
| class TerritoryItem(Document): | ||||
| 	pass | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user