fix: po_detail or sco_rm_detail not getting set while while mapping SE
(cherry picked from commit 3a9c08e7c9)
This commit is contained in:
@@ -295,131 +295,12 @@ erpnext.buying.PurchaseOrderController = class PurchaseOrderController extends e
|
|||||||
}
|
}
|
||||||
|
|
||||||
make_stock_entry() {
|
make_stock_entry() {
|
||||||
var items = $.map(cur_frm.doc.items, function(d) { return d.bom ? d.item_code : false; });
|
|
||||||
var me = this;
|
|
||||||
|
|
||||||
if(items.length >= 1){
|
|
||||||
me.raw_material_data = [];
|
|
||||||
me.show_dialog = 1;
|
|
||||||
let title = __('Transfer Material to Supplier');
|
|
||||||
let fields = [
|
|
||||||
{fieldtype:'Section Break', label: __('Raw Materials')},
|
|
||||||
{fieldname: 'sub_con_rm_items', fieldtype: 'Table', label: __('Items'),
|
|
||||||
fields: [
|
|
||||||
{
|
|
||||||
fieldtype:'Data',
|
|
||||||
fieldname:'item_code',
|
|
||||||
label: __('Item'),
|
|
||||||
read_only:1,
|
|
||||||
in_list_view:1
|
|
||||||
},
|
|
||||||
{
|
|
||||||
fieldtype:'Data',
|
|
||||||
fieldname:'rm_item_code',
|
|
||||||
label: __('Raw Material'),
|
|
||||||
read_only:1,
|
|
||||||
in_list_view:1
|
|
||||||
},
|
|
||||||
{
|
|
||||||
fieldtype:'Float',
|
|
||||||
read_only:1,
|
|
||||||
fieldname:'qty',
|
|
||||||
label: __('Quantity'),
|
|
||||||
read_only:1,
|
|
||||||
in_list_view:1
|
|
||||||
},
|
|
||||||
{
|
|
||||||
fieldtype:'Data',
|
|
||||||
read_only:1,
|
|
||||||
fieldname:'warehouse',
|
|
||||||
label: __('Reserve Warehouse'),
|
|
||||||
in_list_view:1
|
|
||||||
},
|
|
||||||
{
|
|
||||||
fieldtype:'Float',
|
|
||||||
read_only:1,
|
|
||||||
fieldname:'rate',
|
|
||||||
label: __('Rate'),
|
|
||||||
hidden:1
|
|
||||||
},
|
|
||||||
{
|
|
||||||
fieldtype:'Float',
|
|
||||||
read_only:1,
|
|
||||||
fieldname:'amount',
|
|
||||||
label: __('Amount'),
|
|
||||||
hidden:1
|
|
||||||
},
|
|
||||||
{
|
|
||||||
fieldtype:'Link',
|
|
||||||
read_only:1,
|
|
||||||
fieldname:'uom',
|
|
||||||
label: __('UOM'),
|
|
||||||
hidden:1
|
|
||||||
}
|
|
||||||
],
|
|
||||||
data: me.raw_material_data,
|
|
||||||
get_data: function() {
|
|
||||||
return me.raw_material_data;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
|
|
||||||
me.dialog = new frappe.ui.Dialog({
|
|
||||||
title: title, fields: fields
|
|
||||||
});
|
|
||||||
|
|
||||||
if (me.frm.doc['supplied_items']) {
|
|
||||||
me.frm.doc['supplied_items'].forEach((item, index) => {
|
|
||||||
if (item.rm_item_code && item.main_item_code && item.required_qty - item.supplied_qty != 0) {
|
|
||||||
me.raw_material_data.push ({
|
|
||||||
'name':item.name,
|
|
||||||
'item_code': item.main_item_code,
|
|
||||||
'rm_item_code': item.rm_item_code,
|
|
||||||
'item_name': item.rm_item_code,
|
|
||||||
'qty': item.required_qty - item.supplied_qty,
|
|
||||||
'warehouse':item.reserve_warehouse,
|
|
||||||
'rate':item.rate,
|
|
||||||
'amount':item.amount,
|
|
||||||
'stock_uom':item.stock_uom
|
|
||||||
});
|
|
||||||
me.dialog.fields_dict.sub_con_rm_items.grid.refresh();
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
me.dialog.get_field('sub_con_rm_items').check_all_rows()
|
|
||||||
|
|
||||||
me.dialog.show()
|
|
||||||
this.dialog.set_primary_action(__('Transfer'), function() {
|
|
||||||
me.values = me.dialog.get_values();
|
|
||||||
if(me.values) {
|
|
||||||
me.values.sub_con_rm_items.map((row,i) => {
|
|
||||||
if (!row.item_code || !row.rm_item_code || !row.warehouse || !row.qty || row.qty === 0) {
|
|
||||||
let row_id = i+1;
|
|
||||||
frappe.throw(__("Item Code, warehouse and quantity are required on row {0}", [row_id]));
|
|
||||||
}
|
|
||||||
})
|
|
||||||
me._make_rm_stock_entry(me.dialog.fields_dict.sub_con_rm_items.grid.get_selected_children())
|
|
||||||
me.dialog.hide()
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
me.dialog.get_close_btn().on('click', () => {
|
|
||||||
me.dialog.hide();
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
_make_rm_stock_entry(rm_items) {
|
|
||||||
frappe.call({
|
frappe.call({
|
||||||
method:"erpnext.controllers.subcontracting_controller.make_rm_stock_entry",
|
method:"erpnext.controllers.subcontracting_controller.make_rm_stock_entry",
|
||||||
args: {
|
args: {
|
||||||
subcontract_order: cur_frm.doc.name,
|
subcontract_order: cur_frm.doc.name,
|
||||||
rm_items: rm_items,
|
|
||||||
order_doctype: cur_frm.doc.doctype
|
order_doctype: cur_frm.doc.doctype
|
||||||
}
|
},
|
||||||
,
|
|
||||||
callback: function(r) {
|
callback: function(r) {
|
||||||
var doclist = frappe.model.sync(r.message);
|
var doclist = frappe.model.sync(r.message);
|
||||||
frappe.set_route("Form", doclist[0].doctype, doclist[0].name);
|
frappe.set_route("Form", doclist[0].doctype, doclist[0].name);
|
||||||
|
|||||||
@@ -770,7 +770,7 @@ def get_item_details(items):
|
|||||||
item = frappe.qb.DocType("Item")
|
item = frappe.qb.DocType("Item")
|
||||||
item_list = (
|
item_list = (
|
||||||
frappe.qb.from_(item)
|
frappe.qb.from_(item)
|
||||||
.select(item.item_code, item.description, item.allow_alternative_item)
|
.select(item.item_code, item.item_name, item.description, item.allow_alternative_item)
|
||||||
.where(item.name.isin(items))
|
.where(item.name.isin(items))
|
||||||
.run(as_dict=True)
|
.run(as_dict=True)
|
||||||
)
|
)
|
||||||
@@ -783,68 +783,93 @@ def get_item_details(items):
|
|||||||
|
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def make_rm_stock_entry(subcontract_order, rm_items, order_doctype="Subcontracting Order"):
|
def make_rm_stock_entry(
|
||||||
rm_items_list = rm_items
|
subcontract_order, rm_items=None, order_doctype="Subcontracting Order", target_doc=None
|
||||||
|
):
|
||||||
if isinstance(rm_items, str):
|
|
||||||
rm_items_list = json.loads(rm_items)
|
|
||||||
elif not rm_items:
|
|
||||||
frappe.throw(_("No Items available for transfer"))
|
|
||||||
|
|
||||||
if rm_items_list:
|
|
||||||
fg_items = list(set(item["item_code"] for item in rm_items_list))
|
|
||||||
else:
|
|
||||||
frappe.throw(_("No Items selected for transfer"))
|
|
||||||
|
|
||||||
if subcontract_order:
|
if subcontract_order:
|
||||||
subcontract_order = frappe.get_doc(order_doctype, subcontract_order)
|
subcontract_order = frappe.get_doc(order_doctype, subcontract_order)
|
||||||
|
|
||||||
if fg_items:
|
if not rm_items:
|
||||||
items = tuple(set(item["rm_item_code"] for item in rm_items_list))
|
if not subcontract_order.supplied_items:
|
||||||
item_wh = get_item_details(items)
|
frappe.throw(_("No item available for transfer."))
|
||||||
|
|
||||||
stock_entry = frappe.new_doc("Stock Entry")
|
rm_items = subcontract_order.supplied_items
|
||||||
stock_entry.purpose = "Send to Subcontractor"
|
|
||||||
if order_doctype == "Purchase Order":
|
|
||||||
stock_entry.purchase_order = subcontract_order.name
|
|
||||||
else:
|
|
||||||
stock_entry.subcontracting_order = subcontract_order.name
|
|
||||||
stock_entry.supplier = subcontract_order.supplier
|
|
||||||
stock_entry.supplier_name = subcontract_order.supplier_name
|
|
||||||
stock_entry.supplier_address = subcontract_order.supplier_address
|
|
||||||
stock_entry.address_display = subcontract_order.address_display
|
|
||||||
stock_entry.company = subcontract_order.company
|
|
||||||
stock_entry.to_warehouse = subcontract_order.supplier_warehouse
|
|
||||||
stock_entry.set_stock_entry_type()
|
|
||||||
|
|
||||||
if order_doctype == "Purchase Order":
|
fg_item_code_list = list(
|
||||||
rm_detail_field = "po_detail"
|
set(item.get("main_item_code") or item.get("item_code") for item in rm_items)
|
||||||
else:
|
)
|
||||||
rm_detail_field = "sco_rm_detail"
|
|
||||||
|
|
||||||
for item_code in fg_items:
|
if fg_item_code_list:
|
||||||
for rm_item_data in rm_items_list:
|
rm_item_code_list = tuple(set(item.get("rm_item_code") for item in rm_items))
|
||||||
if rm_item_data["item_code"] == item_code:
|
item_wh = get_item_details(rm_item_code_list)
|
||||||
rm_item_code = rm_item_data["rm_item_code"]
|
|
||||||
items_dict = {
|
field_no_map, rm_detail_field = "purchase_order", "sco_rm_detail"
|
||||||
rm_item_code: {
|
if order_doctype == "Purchase Order":
|
||||||
rm_detail_field: rm_item_data.get("name"),
|
field_no_map, rm_detail_field = "subcontracting_order", "po_detail"
|
||||||
"item_name": rm_item_data["item_name"],
|
|
||||||
"description": item_wh.get(rm_item_code, {}).get("description", ""),
|
if target_doc and target_doc.get("items"):
|
||||||
"qty": rm_item_data["qty"],
|
target_doc.items = []
|
||||||
"from_warehouse": rm_item_data["warehouse"],
|
|
||||||
"stock_uom": rm_item_data["stock_uom"],
|
stock_entry = get_mapped_doc(
|
||||||
"serial_no": rm_item_data.get("serial_no"),
|
order_doctype,
|
||||||
"batch_no": rm_item_data.get("batch_no"),
|
subcontract_order.name,
|
||||||
"main_item_code": rm_item_data["item_code"],
|
{
|
||||||
"allow_alternative_item": item_wh.get(rm_item_code, {}).get("allow_alternative_item"),
|
order_doctype: {
|
||||||
|
"doctype": "Stock Entry",
|
||||||
|
"field_map": {
|
||||||
|
"to_warehouse": "supplier_warehouse",
|
||||||
|
},
|
||||||
|
"field_no_map": [field_no_map],
|
||||||
|
"validation": {
|
||||||
|
"docstatus": ["=", 1],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
target_doc,
|
||||||
|
ignore_child_tables=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
stock_entry.purpose = "Send to Subcontractor"
|
||||||
|
|
||||||
|
if order_doctype == "Purchase Order":
|
||||||
|
stock_entry.purchase_order = subcontract_order.name
|
||||||
|
else:
|
||||||
|
stock_entry.subcontracting_order = subcontract_order.name
|
||||||
|
|
||||||
|
stock_entry.set_stock_entry_type()
|
||||||
|
|
||||||
|
for fg_item_code in fg_item_code_list:
|
||||||
|
for rm_item in rm_items:
|
||||||
|
|
||||||
|
if rm_item.get("main_item_code") or rm_item.get("item_code") == fg_item_code:
|
||||||
|
rm_item_code = rm_item.get("rm_item_code")
|
||||||
|
|
||||||
|
items_dict = {
|
||||||
|
rm_item_code: {
|
||||||
|
rm_detail_field: rm_item.get("name"),
|
||||||
|
"item_name": rm_item.get("item_name")
|
||||||
|
or item_wh.get(rm_item_code, {}).get("item_name", ""),
|
||||||
|
"description": item_wh.get(rm_item_code, {}).get("description", ""),
|
||||||
|
"qty": rm_item.get("qty")
|
||||||
|
or max(rm_item.get("required_qty") - rm_item.get("total_supplied_qty"), 0),
|
||||||
|
"from_warehouse": rm_item.get("warehouse") or rm_item.get("reserve_warehouse"),
|
||||||
|
"to_warehouse": subcontract_order.supplier_warehouse,
|
||||||
|
"stock_uom": rm_item.get("stock_uom"),
|
||||||
|
"serial_no": rm_item.get("serial_no"),
|
||||||
|
"batch_no": rm_item.get("batch_no"),
|
||||||
|
"main_item_code": fg_item_code,
|
||||||
|
"allow_alternative_item": item_wh.get(rm_item_code, {}).get("allow_alternative_item"),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
stock_entry.add_to_stock_entry_detail(items_dict)
|
stock_entry.add_to_stock_entry_detail(items_dict)
|
||||||
return stock_entry.as_dict()
|
|
||||||
else:
|
if target_doc:
|
||||||
frappe.throw(_("No Items selected for transfer"))
|
return stock_entry
|
||||||
return subcontract_order.name
|
else:
|
||||||
|
return stock_entry.as_dict()
|
||||||
|
else:
|
||||||
|
frappe.throw(_("No Items selected for transfer."))
|
||||||
|
|
||||||
|
|
||||||
def add_items_in_ste(
|
def add_items_in_ste(
|
||||||
|
|||||||
@@ -625,6 +625,12 @@ frappe.ui.form.on('Stock Entry', {
|
|||||||
purchase_order: (frm) => {
|
purchase_order: (frm) => {
|
||||||
if (frm.doc.purchase_order) {
|
if (frm.doc.purchase_order) {
|
||||||
frm.set_value("subcontracting_order", "");
|
frm.set_value("subcontracting_order", "");
|
||||||
|
erpnext.utils.map_current_doc({
|
||||||
|
method: 'erpnext.stock.doctype.stock_entry.stock_entry.get_items_from_subcontract_order',
|
||||||
|
source_name: frm.doc.purchase_order,
|
||||||
|
target_doc: frm,
|
||||||
|
freeze: true,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -632,7 +638,7 @@ frappe.ui.form.on('Stock Entry', {
|
|||||||
if (frm.doc.subcontracting_order) {
|
if (frm.doc.subcontracting_order) {
|
||||||
frm.set_value("purchase_order", "");
|
frm.set_value("purchase_order", "");
|
||||||
erpnext.utils.map_current_doc({
|
erpnext.utils.map_current_doc({
|
||||||
method: 'erpnext.stock.doctype.stock_entry.stock_entry.get_items_from_subcontracting_order',
|
method: 'erpnext.stock.doctype.stock_entry.stock_entry.get_items_from_subcontract_order',
|
||||||
source_name: frm.doc.subcontracting_order,
|
source_name: frm.doc.subcontracting_order,
|
||||||
target_doc: frm,
|
target_doc: frm,
|
||||||
freeze: true,
|
freeze: true,
|
||||||
|
|||||||
@@ -1945,6 +1945,8 @@ class StockEntry(StockController):
|
|||||||
se_child.is_finished_item = item_row.get("is_finished_item", 0)
|
se_child.is_finished_item = item_row.get("is_finished_item", 0)
|
||||||
se_child.is_scrap_item = item_row.get("is_scrap_item", 0)
|
se_child.is_scrap_item = item_row.get("is_scrap_item", 0)
|
||||||
se_child.is_process_loss = item_row.get("is_process_loss", 0)
|
se_child.is_process_loss = item_row.get("is_process_loss", 0)
|
||||||
|
se_child.po_detail = item_row.get("po_detail")
|
||||||
|
se_child.sco_rm_detail = item_row.get("sco_rm_detail")
|
||||||
|
|
||||||
for field in [
|
for field in [
|
||||||
self.subcontract_data.rm_detail_field,
|
self.subcontract_data.rm_detail_field,
|
||||||
@@ -2591,50 +2593,15 @@ def get_supplied_items(
|
|||||||
|
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def get_items_from_subcontracting_order(source_name, target_doc=None):
|
def get_items_from_subcontract_order(source_name, target_doc=None):
|
||||||
def post_process(source, target):
|
from erpnext.controllers.subcontracting_controller import make_rm_stock_entry
|
||||||
target.stock_entry_type = target.purpose = "Send to Subcontractor"
|
|
||||||
target.subcontracting_order = source_name
|
|
||||||
|
|
||||||
if target.items:
|
if isinstance(target_doc, str):
|
||||||
target.items = []
|
target_doc = frappe.get_doc(json.loads(target_doc))
|
||||||
|
|
||||||
warehouses = {}
|
order_doctype = "Purchase Order" if target_doc.purchase_order else "Subcontracting Order"
|
||||||
for item in source.items:
|
target_doc = make_rm_stock_entry(
|
||||||
warehouses[item.name] = item.warehouse
|
subcontract_order=source_name, order_doctype=order_doctype, target_doc=target_doc
|
||||||
|
|
||||||
for item in source.supplied_items:
|
|
||||||
target.append(
|
|
||||||
"items",
|
|
||||||
{
|
|
||||||
"s_warehouse": warehouses.get(item.reference_name),
|
|
||||||
"t_warehouse": source.supplier_warehouse,
|
|
||||||
"subcontracted_item": item.main_item_code,
|
|
||||||
"item_code": item.rm_item_code,
|
|
||||||
"qty": max(item.required_qty - item.total_supplied_qty, 0),
|
|
||||||
"transfer_qty": item.required_qty,
|
|
||||||
"uom": item.stock_uom,
|
|
||||||
"stock_uom": item.stock_uom,
|
|
||||||
"conversion_factor": 1,
|
|
||||||
"sco_rm_detail": item.name,
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
target_doc = get_mapped_doc(
|
|
||||||
"Subcontracting Order",
|
|
||||||
source_name,
|
|
||||||
{
|
|
||||||
"Subcontracting Order": {
|
|
||||||
"doctype": "Stock Entry",
|
|
||||||
"field_no_map": ["purchase_order"],
|
|
||||||
"validation": {
|
|
||||||
"docstatus": ["=", 1],
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
target_doc,
|
|
||||||
post_process,
|
|
||||||
ignore_child_tables=True,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
return target_doc
|
return target_doc
|
||||||
|
|||||||
@@ -205,20 +205,10 @@ erpnext.buying.SubcontractingOrderController = class SubcontractingOrderControll
|
|||||||
}
|
}
|
||||||
|
|
||||||
make_stock_entry() {
|
make_stock_entry() {
|
||||||
frappe.model.open_mapped_doc({
|
|
||||||
method: 'erpnext.stock.doctype.stock_entry.stock_entry.get_items_from_subcontracting_order',
|
|
||||||
source_name: cur_frm.doc.name,
|
|
||||||
freeze: true,
|
|
||||||
freeze_message: __('Creating Stock Entry ...')
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
make_rm_stock_entry(rm_items) {
|
|
||||||
frappe.call({
|
frappe.call({
|
||||||
method: 'erpnext.controllers.subcontracting_controller.make_rm_stock_entry',
|
method: 'erpnext.controllers.subcontracting_controller.make_rm_stock_entry',
|
||||||
args: {
|
args: {
|
||||||
subcontract_order: cur_frm.doc.name,
|
subcontract_order: cur_frm.doc.name,
|
||||||
rm_items: rm_items,
|
|
||||||
order_doctype: cur_frm.doc.doctype
|
order_doctype: cur_frm.doc.doctype
|
||||||
},
|
},
|
||||||
callback: (r) => {
|
callback: (r) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user