代码拉取完成,页面将自动刷新
背景与问题
定制生产场景,传统方式需要在接单(销售订单)前准备好物料,物料清单,供应商,物料价格(原材料采购价格)等,因为定制生产,无法提前知晓可能的成品规格值,如果按各种属性值排列组合,成品料号数量相当庞大,且存在很大的可能性提前准备好的物料号及物料清单基础资料后面实际用不上,仅有少部分会被客户选配(用到).
如何快速有效且不浪费地创建在销售订单录入前准备好这些基础资料。
其它系统的参考资料
参考做法
稍稍修改下,不用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
}
登录 后才可以发表评论