fix: AD not getting copied from SCO while creating a SE (#32004)
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py
index 7721efb..d709522 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.py
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.py
@@ -2568,27 +2568,26 @@
@frappe.whitelist()
def get_items_from_subcontracting_order(source_name, target_doc=None):
- sco = frappe.get_doc("Subcontracting Order", source_name)
+ def post_process(source, target):
+ target.stock_entry_type = target.purpose = "Send to Subcontractor"
+ target.subcontracting_order = source_name
- if sco.docstatus == 1:
- if target_doc and isinstance(target_doc, str):
- target_doc = frappe.get_doc(json.loads(target_doc))
-
- if target_doc.items:
- target_doc.items = []
+ if target.items:
+ target.items = []
warehouses = {}
- for item in sco.items:
+ for item in source.items:
warehouses[item.name] = item.warehouse
- for item in sco.supplied_items:
- target_doc.append(
+ for item in source.supplied_items:
+ target.append(
"items",
{
"s_warehouse": warehouses.get(item.reference_name),
- "t_warehouse": sco.supplier_warehouse,
+ "t_warehouse": source.supplier_warehouse,
+ "subcontracted_item": item.main_item_code,
"item_code": item.rm_item_code,
- "qty": item.required_qty,
+ "qty": max(item.required_qty - item.total_supplied_qty, 0),
"transfer_qty": item.required_qty,
"uom": item.stock_uom,
"stock_uom": item.stock_uom,
@@ -2596,6 +2595,23 @@
},
)
+ 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
diff --git a/erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js b/erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js
index bbc58fe..065ef39 100644
--- a/erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js
+++ b/erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js
@@ -164,10 +164,7 @@
if (flt(doc.per_received) < 100) {
cur_frm.add_custom_button(__('Subcontracting Receipt'), this.make_subcontracting_receipt, __('Create'));
if (me.has_unsupplied_items()) {
- cur_frm.add_custom_button(__('Material to Supplier'),
- () => {
- me.make_stock_entry();
- }, __('Transfer'));
+ cur_frm.add_custom_button(__('Material to Supplier'), this.make_stock_entry, __('Transfer'));
}
}
cur_frm.page.set_inner_btn_group_as_primary(__('Create'));
@@ -195,120 +192,6 @@
transaction_controller.autofill_warehouse(child_table, warehouse_field, warehouse);
}
- make_stock_entry() {
- var items = $.map(cur_frm.doc.items, (d) => 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'),
- 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: () => 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) => {
- 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'), () => {
- 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();
- });
- }
-
has_unsupplied_items() {
return this.frm.doc['supplied_items'].some(item => item.required_qty > item.supplied_qty);
}
@@ -321,6 +204,15 @@
});
}
+ 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({
method: 'erpnext.controllers.subcontracting_controller.make_rm_stock_entry',