27 Star 102 Fork 60

则霖信息技术(深圳)有限公司 / ERPNext常见问题

 / 详情

定制生产场景下如何在销售单将一次性快速创建物料,物料清单,供应商,物料供应商等基础资料 config to order: create master data per quotation detail

已完成
任务 拥有者
创建于  
2022-04-18 22:28

背景与问题

定制生产场景,传统方式需要在接单(销售订单)前准备好物料,物料清单,供应商,物料价格(原材料采购价格)等,因为定制生产,无法提前知晓可能的成品规格值,如果按各种属性值排列组合,成品料号数量相当庞大,且存在很大的可能性提前准备好的物料号及物料清单基础资料后面实际用不上,仅有少部分会被客户选配(用到).

如何快速有效且不浪费地创建在销售订单录入前准备好这些基础资料。

其它系统的参考资料

输入图片说明
输入图片说明

参考做法

  1. 建两个自定义单据类型,一个主表,一个明细表
    主表就一个成品物料号
  2. 表单上加一个按钮,上传主数据

稍稍修改下,不用APP,直接通过网页界面实现:定义单据类型,js及python脚本。

代码参考

{
 "autoname": "format:{item_code}-{###}",
 "creation": "2020-04-04 22:17:43.034683",
 "doctype": "DocType",
 "editable_grid": 1,
 "engine": "InnoDB",
 "field_order": [
  "item_code",
  "date",
  "column_break_3",
  "item_name",
  "import_status",
  "section_break_4",
  "items"
 ],
 "fields": [
  {
   "fieldname": "item_code",
   "fieldtype": "Link",
   "in_list_view": 1,
   "label": "Item Code",
   "options": "Item"
  },
  {
   "fieldname": "date",
   "fieldtype": "Date",
   "in_list_view": 1,
   "label": "Date"
  },
  {
   "fieldname": "section_break_4",
   "fieldtype": "Section Break"
  },
  {
   "allow_bulk_edit": 1,
   "fieldname": "items",
   "fieldtype": "Table",
   "label": "Items",
   "options": "MTM Quotation Item"
  },
  {
   "fieldname": "column_break_3",
   "fieldtype": "Column Break"
  },
  {
   "fetch_from": "item_code.item_name",
   "fieldname": "item_name",
   "fieldtype": "Data",
   "label": "Item Name",
   "read_only": 1
  },
  {
   "fieldname": "import_status",
   "fieldtype": "Select",
   "label": "Import Status",
   "options": "\nOK\nFailed"
  }
 ],
 "modified": "2020-04-05 19:53:43.941971",
 "modified_by": "yuxinyong@163.com",
 "module": "MTM Logistic",
 "name": "MTM Quotation",
 "owner": "yuxinyong@163.com",
 "permissions": [
  {
   "create": 1,
   "delete": 1,
   "email": 1,
   "export": 1,
   "print": 1,
   "read": 1,
   "report": 1,
   "role": "System Manager",
   "share": 1,
   "write": 1
  },
  {
   "create": 1,
   "delete": 1,
   "email": 1,
   "export": 1,
   "print": 1,
   "read": 1,
   "report": 1,
   "role": "Purchase Manager",
   "share": 1,
   "write": 1
  },
  {
   "create": 1,
   "delete": 1,
   "email": 1,
   "export": 1,
   "print": 1,
   "read": 1,
   "report": 1,
   "role": "Sales Manager",
   "share": 1,
   "write": 1
  },
  {
   "create": 1,
   "delete": 1,
   "email": 1,
   "export": 1,
   "print": 1,
   "read": 1,
   "report": 1,
   "role": "Item Manager",
   "share": 1,
   "write": 1
  }
 ],
 "quick_entry": 1,
 "sort_field": "modified",
 "sort_order": "DESC",
 "track_changes": 1
}
# -*- coding: utf-8 -*-
# Copyright (c) 2020, MTM Technology Ltd and contributors
# For license information, please see license.txt

from __future__ import unicode_literals
import os
import frappe
from frappe.model.document import Document

class MTMQuotation(Document):
	def import_items(self):
		bom_items = []
		supplier_dict = {}
		item_count = 0
		import_log = ''
		if self.import_status != 'OK':
			for d in self.items:
				#remove line break both beginning and ending
				d.supplier = d.supplier.replace(os.linesep,'') if d.supplier else d.supplier
				supplier = supplier_dict.get(d.supplier)
				if not supplier:
					supplier = frappe.db.get_value('Supplier', filters={'name':('like', '%' + d.supplier + '%')})
					if not supplier:
						supplier = frappe.new_doc('Supplier')
						supplier.update({
							'supplier_name': d.supplier,
							'supplier_name_english': d.supplier,
							'supplier_group': 'Local'
						})
						supplier.insert(ignore_permissions = 1)
						supplier = supplier.name
						supplier_dict.update({d.supplier: supplier})
					
				item = None
				if d.item_code:
					item = frappe.db.get_value('Item', filters ={'name':d.item_code})
				if not item and d.english_name:
					item = frappe.db.get_value('Item', filters={'item_name': d.english_name})

				if item:
					item = frappe.get_doc('Item', item)
				else:
					item = frappe.new_doc('Item')
					item.update({
						'naming_series': d.naming_series,
						'stock_uom': d.uom,
						'valuation_rate': d.rate,
						'item_name': d.english_name,
						'item_name_chinese': d.chinese_name,
						'description': d.english_description,
						'description_chn':d.chinese_description,
						'item_group': d.item_group
					})
					  
					supplier_item = frappe.new_doc('Item Supplier', item, 'supplier_items')
					supplier_item.update({
						'supplier': supplier,
						'price': d.rate
					})
					item.append('supplier_items', supplier_item)
					try:
						print(item.as_dict())
						item.insert(ignore_permissions=1)
						item_count += 1
						item.import_log = 'import item OK'
					except Exception as e:
						import_log = 'import Item Failed due to error %s' % str(e)
						break
				bom_items.append({
					'item_code': item.item_code,
					'item_name': item.item_name,
					'description': item.description,
					'supplier':supplier,
					'qty': d.qty,
					'rate':d.rate
				})
			if not import_log:	
				bom = frappe.new_doc('BOM')
				bom.update({
					'item': self.item_code,
					'item_name': self.item_name,
					'quantity': 1
				})
				for d in bom_items:			
					bom_item = frappe.new_doc('BOM Item', bom, 'items')
					bom_item.update(d)
					bom.append('items', bom_item)
				bom.insert(ignore_permissions = 1)
				
				frappe.db.set_value(self.doctype, self.name, 'import_status', 'OK')
				frappe.msgprint('Imported %s items and BOM OK' % item_count)
			else:
				frappe.msgprint('Import item and BOM Failed with error %s' % import_log)
// Copyright (c) 2020, MTM Technology Ltd and contributors
// For license information, please see license.txt

frappe.ui.form.on('MTM Quotation', {
	refresh: function(frm) {
		if(frm.doc.import_status != "OK" && frm.doc.items) {
			frm.add_custom_button(__('Import Items and BOM'), () => {
				frm.call({
					btn: frm.custom_buttons["Import Items and BOM"],
					doc: frm.doc,
					method: 'import_items',
					callback: function(r) {
						frm.refresh();
						return;
					}
				});
			});
		}
	}
});
{
 "autoname": "naming_series:",
 "creation": "2020-04-04 22:26:19.400927",
 "doctype": "DocType",
 "editable_grid": 1,
 "engine": "InnoDB",
 "field_order": [
  "item_code",
  "uom",
  "column_break_3",
  "qty",
  "rate",
  "total_rate",
  "section_break_7",
  "chinese_name",
  "column_break_9",
  "english_name",
  "section_break_11",
  "chinese_description",
  "column_break_13",
  "english_description",
  "section_break_15",
  "supplier",
  "column_break_17",
  "item_group",
  "column_break_19",
  "naming_series",
  "section_break_21",
  "import_log"
 ],
 "fields": [
  {
   "fieldname": "item_code",
   "fieldtype": "Data",
   "in_list_view": 1,
   "label": "Item Code",
   "options": "Item"
  },
  {
   "fieldname": "uom",
   "fieldtype": "Link",
   "in_list_view": 1,
   "label": "UOM",
   "options": "UOM"
  },
  {
   "fieldname": "column_break_3",
   "fieldtype": "Column Break"
  },
  {
   "fieldname": "qty",
   "fieldtype": "Float",
   "in_list_view": 1,
   "label": "Qty"
  },
  {
   "fieldname": "rate",
   "fieldtype": "Currency",
   "in_list_view": 1,
   "label": "Rate"
  },
  {
   "fieldname": "total_rate",
   "fieldtype": "Currency",
   "in_list_view": 1,
   "label": "Total Rate"
  },
  {
   "fieldname": "section_break_7",
   "fieldtype": "Section Break"
  },
  {
   "fieldname": "chinese_name",
   "fieldtype": "Text Editor",
   "label": "Chinese Name"
  },
  {
   "fieldname": "column_break_9",
   "fieldtype": "Column Break"
  },
  {
   "fieldname": "english_name",
   "fieldtype": "Text Editor",
   "label": "English Name"
  },
  {
   "fieldname": "section_break_11",
   "fieldtype": "Section Break"
  },
  {
   "fieldname": "chinese_description",
   "fieldtype": "Text Editor",
   "label": "Chinese Description"
  },
  {
   "fieldname": "column_break_13",
   "fieldtype": "Column Break"
  },
  {
   "fieldname": "english_description",
   "fieldtype": "Text Editor",
   "label": "English Description"
  },
  {
   "fieldname": "section_break_15",
   "fieldtype": "Section Break"
  },
  {
   "fieldname": "supplier",
   "fieldtype": "Data",
   "label": "Supplier"
  },
  {
   "fieldname": "item_group",
   "fieldtype": "Link",
   "label": "Item Group",
   "options": "Item Group"
  },
  {
   "fieldname": "column_break_17",
   "fieldtype": "Column Break"
  },
  {
   "fieldname": "import_log",
   "fieldtype": "Text Editor",
   "label": "Import Log"
  },
  {
   "fieldname": "column_break_19",
   "fieldtype": "Column Break"
  },
  {
   "fieldname": "naming_series",
   "fieldtype": "Select",
   "label": "Naming Series",
   "options": "\nPROD.######\nVPROD.######\nPACK.######\nCOMP.######\nSERV.######"
  },
  {
   "fieldname": "section_break_21",
   "fieldtype": "Section Break"
  }
 ],
 "modified": "2020-04-05 17:43:22.450533",
 "modified_by": "yuxinyong@163.com",
 "module": "MTM Logistic",
 "name": "MTM Quotation Item",
 "owner": "yuxinyong@163.com",
 "permissions": [
  {
   "create": 1,
   "delete": 1,
   "email": 1,
   "export": 1,
   "print": 1,
   "read": 1,
   "report": 1,
   "role": "System Manager",
   "share": 1,
   "write": 1
  }
 ],
 "quick_entry": 1,
 "sort_field": "modified",
 "sort_order": "DESC",
 "track_changes": 1
}

评论 (1)

余则霖 创建了任务
余则霖 任务状态待办的 修改为已完成
余则霖 添加了
 
客户端JS脚本
标签
余则霖 添加了
 
销售与分销
标签
余则霖 添加了
 
最佳业务实践
标签
余则霖 添加了
 
数据导入
标签
余则霖 添加了
 
开发
标签
余则霖 添加了
 
python脚本
标签
余则霖 修改了描述
展开全部操作日志

这个怎么实现?

余则霖 修改了标题

登录 后才可以发表评论

状态
负责人
项目
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
预计工期 (小时)
参与者(2)
1
https://gitee.com/yuzelin/erpnext-chinese-docs.git
git@gitee.com:yuzelin/erpnext-chinese-docs.git
yuzelin
erpnext-chinese-docs
ERPNext常见问题

搜索帮助