139 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			139 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors
 | |
| # License: GNU General Public License v3. See license.txt
 | |
| 
 | |
| 
 | |
| import frappe
 | |
| from frappe.custom.doctype.property_setter.property_setter import make_property_setter
 | |
| 
 | |
| doctype_series_map = {
 | |
| 	"Additional Salary": "HR-ADS-.YY.-.MM.-",
 | |
| 	"Appraisal": "HR-APR-.YY.-.MM.",
 | |
| 	"Asset": "ACC-ASS-.YYYY.-",
 | |
| 	"Attendance": "HR-ATT-.YYYY.-",
 | |
| 	"Auto Repeat": "SYS-ARP-.YYYY.-",
 | |
| 	"Blanket Order": "MFG-BLR-.YYYY.-",
 | |
| 	"Campaign": "SAL-CAM-.YYYY.-",
 | |
| 	"Course Schedule": "EDU-CSH-.YYYY.-",
 | |
| 	"Customer": "CUST-.YYYY.-",
 | |
| 	"Delivery Note": "MAT-DN-.YYYY.-",
 | |
| 	"Delivery Trip": "MAT-DT-.YYYY.-",
 | |
| 	"Driver": "HR-DRI-.YYYY.-",
 | |
| 	"Employee": "HR-EMP-",
 | |
| 	"Employee Advance": "HR-EAD-.YYYY.-",
 | |
| 	"Expense Claim": "HR-EXP-.YYYY.-",
 | |
| 	"Fee Schedule": "EDU-FSH-.YYYY.-",
 | |
| 	"Fee Structure": "EDU-FST-.YYYY.-",
 | |
| 	"Fees": "EDU-FEE-.YYYY.-",
 | |
| 	"Installation Note": "MAT-INS-.YYYY.-",
 | |
| 	"Instructor": "EDU-INS-.YYYY.-",
 | |
| 	"Issue": "ISS-.YYYY.-",
 | |
| 	"Journal Entry": "ACC-JV-.YYYY.-",
 | |
| 	"Landed Cost Voucher": "MAT-LCV-.YYYY.-",
 | |
| 	"Lead": "CRM-LEAD-.YYYY.-",
 | |
| 	"Leave Allocation": "HR-LAL-.YYYY.-",
 | |
| 	"Leave Application": "HR-LAP-.YYYY.-",
 | |
| 	"Maintenance Schedule": "MAT-MSH-.YYYY.-",
 | |
| 	"Maintenance Visit": "MAT-MVS-.YYYY.-",
 | |
| 	"Material Request": "MAT-MR-.YYYY.-",
 | |
| 	"Member": "NPO-MEM-.YYYY.-",
 | |
| 	"Opportunity": "CRM-OPP-.YYYY.-",
 | |
| 	"Packing Slip": "MAT-PAC-.YYYY.-",
 | |
| 	"Payment Entry": "ACC-PAY-.YYYY.-",
 | |
| 	"Payment Request": "ACC-PRQ-.YYYY.-",
 | |
| 	"Production Plan": "MFG-PP-.YYYY.-",
 | |
| 	"Project Update": "PROJ-UPD-.YYYY.-",
 | |
| 	"Purchase Invoice": "ACC-PINV-.YYYY.-",
 | |
| 	"Purchase Order": "PUR-ORD-.YYYY.-",
 | |
| 	"Purchase Receipt": "MAT-PRE-.YYYY.-",
 | |
| 	"Quality Inspection": "MAT-QA-.YYYY.-",
 | |
| 	"Quotation": "SAL-QTN-.YYYY.-",
 | |
| 	"Request for Quotation": "PUR-RFQ-.YYYY.-",
 | |
| 	"Sales Invoice": "ACC-SINV-.YYYY.-",
 | |
| 	"Sales Order": "SAL-ORD-.YYYY.-",
 | |
| 	"Sample Collection": "HLC-SC-.YYYY.-",
 | |
| 	"Shareholder": "ACC-SH-.YYYY.-",
 | |
| 	"Stock Entry": "MAT-STE-.YYYY.-",
 | |
| 	"Stock Reconciliation": "MAT-RECO-.YYYY.-",
 | |
| 	"Supplier": "SUP-.YYYY.-",
 | |
| 	"Supplier Quotation": "PUR-SQTN-.YYYY.-",
 | |
| 	"Supplier Scorecard Period": "PU-SSP-.YYYY.-",
 | |
| 	"Timesheet": "TS-.YYYY.-",
 | |
| 	"Vehicle Log": "HR-VLOG-.YYYY.-",
 | |
| 	"Warranty Claim": "SER-WRN-.YYYY.-",
 | |
| 	"Work Order": "MFG-WO-.YYYY.-",
 | |
| }
 | |
| 
 | |
| 
 | |
| def execute():
 | |
| 	frappe.db.sql(
 | |
| 		"""
 | |
| 		update `tabProperty Setter`
 | |
| 		set name=concat(doc_type, '-', field_name, '-', property)
 | |
| 		where property='fetch_from'
 | |
| 	"""
 | |
| 	)
 | |
| 	series_to_set = get_series()
 | |
| 	for doctype, opts in series_to_set.items():
 | |
| 		set_series(doctype, opts["options"], opts["default"])
 | |
| 
 | |
| 
 | |
| def set_series(doctype, options, default):
 | |
| 	def _make_property_setter(property_name, value):
 | |
| 		property_setter = frappe.db.exists(
 | |
| 			"Property Setter",
 | |
| 			{"doc_type": doctype, "field_name": "naming_series", "property": property_name},
 | |
| 		)
 | |
| 		if property_setter:
 | |
| 			frappe.db.set_value("Property Setter", property_setter, "value", value)
 | |
| 		else:
 | |
| 			make_property_setter(doctype, "naming_series", "options", value, "Text")
 | |
| 
 | |
| 	_make_property_setter("options", options)
 | |
| 	if default:
 | |
| 		_make_property_setter("default", default)
 | |
| 
 | |
| 
 | |
| def get_series():
 | |
| 	series_to_set = {}
 | |
| 
 | |
| 	for doctype in doctype_series_map:
 | |
| 		if not frappe.db.exists("DocType", doctype):
 | |
| 			continue
 | |
| 		if not frappe.db.a_row_exists(doctype):
 | |
| 			continue
 | |
| 		if not frappe.db.has_column(doctype, "naming_series"):
 | |
| 			continue
 | |
| 		if not frappe.get_meta(doctype).has_field("naming_series"):
 | |
| 			continue
 | |
| 		series_to_preserve = list(filter(None, get_series_to_preserve(doctype)))
 | |
| 		default_series = get_default_series(doctype)
 | |
| 
 | |
| 		if not series_to_preserve:
 | |
| 			continue
 | |
| 		existing_series = (frappe.get_meta(doctype).get_field("naming_series").options or "").split("\n")
 | |
| 		existing_series = list(filter(None, [d.strip() for d in existing_series]))
 | |
| 
 | |
| 		# set naming series property setter
 | |
| 		series_to_preserve = list(set(series_to_preserve + existing_series))
 | |
| 
 | |
| 		if series_to_preserve:
 | |
| 			series_to_set[doctype] = {"options": "\n".join(series_to_preserve), "default": default_series}
 | |
| 
 | |
| 	return series_to_set
 | |
| 
 | |
| 
 | |
| def get_series_to_preserve(doctype):
 | |
| 	series_to_preserve = frappe.db.sql_list(
 | |
| 		"""select distinct naming_series from `tab{doctype}` where ifnull(naming_series, '') != ''""".format(
 | |
| 			doctype=doctype
 | |
| 		)
 | |
| 	)
 | |
| 	series_to_preserve.sort()
 | |
| 	return series_to_preserve
 | |
| 
 | |
| 
 | |
| def get_default_series(doctype):
 | |
| 	field = frappe.get_meta(doctype).get_field("naming_series")
 | |
| 	default_series = field.get("default", "") if field else ""
 | |
| 	return default_series
 |