fix: Show create button only if target doc does not exists
This commit is contained in:
parent
ecc801d3d8
commit
94d7096c8c
@ -32,23 +32,18 @@ frappe.ui.form.on('Pick List', {
|
|||||||
},
|
},
|
||||||
refresh: (frm) => {
|
refresh: (frm) => {
|
||||||
frm.trigger('add_get_items_button');
|
frm.trigger('add_get_items_button');
|
||||||
|
|
||||||
// if (frm.doc.items && (frm.doc.items.length > 1 || frm.doc.items[0].item_code) && frm.doc.docstatus === 0) {
|
|
||||||
// frm.add_custom_button(__('Get Item Locations'), () => {
|
|
||||||
// frm.call('set_item_locations');
|
|
||||||
// }).addClass('btn-primary');
|
|
||||||
// }
|
|
||||||
if (frm.doc.docstatus === 1) {
|
if (frm.doc.docstatus === 1) {
|
||||||
if (frm.doc.purpose === 'Delivery against Sales Order') {
|
frappe.xcall('erpnext.stock.doctype.pick_list.pick_list.target_document_exists', {
|
||||||
frm.add_custom_button(__('Delivery Note'), () => frm.trigger('create_delivery_note'), __('Create'));
|
'pick_list_name': frm.doc.name,
|
||||||
} else {
|
'purpose': frm.doc.purpose
|
||||||
frappe.xcall('erpnext.stock.doctype.pick_list.pick_list.stock_entry_exists', {
|
}).then(target_document_exists => {
|
||||||
'pick_list_name': frm.doc.name
|
if (target_document_exists) return;
|
||||||
}).then(exists => {
|
if (frm.doc.purpose === 'Delivery against Sales Order') {
|
||||||
if (exists) return;
|
frm.add_custom_button(__('Delivery Note'), () => frm.trigger('create_delivery_note'), __('Create'));
|
||||||
|
} else {
|
||||||
frm.add_custom_button(__('Stock Entry'), () => frm.trigger('create_stock_entry'), __('Create'));
|
frm.add_custom_button(__('Stock Entry'), () => frm.trigger('create_stock_entry'), __('Create'));
|
||||||
});
|
}
|
||||||
}
|
});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
work_order: (frm) => {
|
work_order: (frm) => {
|
||||||
|
@ -170,6 +170,7 @@ def get_item_locations_based_on_batch_nos(item_doc):
|
|||||||
|
|
||||||
return locations
|
return locations
|
||||||
|
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def create_delivery_note(source_name, target_doc=None):
|
def create_delivery_note(source_name, target_doc=None):
|
||||||
pick_list = frappe.get_doc('Pick List', source_name)
|
pick_list = frappe.get_doc('Pick List', source_name)
|
||||||
@ -181,18 +182,18 @@ def create_delivery_note(source_name, target_doc=None):
|
|||||||
delivery_note = create_delivery_note_from_sales_order(sales_order,
|
delivery_note = create_delivery_note_from_sales_order(sales_order,
|
||||||
delivery_note, skip_item_mapping=True)
|
delivery_note, skip_item_mapping=True)
|
||||||
|
|
||||||
|
item_table_mapper = {
|
||||||
|
'doctype': 'Delivery Note Item',
|
||||||
|
'field_map': {
|
||||||
|
'rate': 'rate',
|
||||||
|
'name': 'so_detail',
|
||||||
|
'parent': 'against_sales_order',
|
||||||
|
},
|
||||||
|
'condition': lambda doc: abs(doc.delivered_qty) < abs(doc.qty) and doc.delivered_by_supplier!=1
|
||||||
|
}
|
||||||
|
|
||||||
for location in pick_list.locations:
|
for location in pick_list.locations:
|
||||||
sales_order_item = frappe.get_cached_doc('Sales Order Item', location.sales_order_item)
|
sales_order_item = frappe.get_cached_doc('Sales Order Item', location.sales_order_item)
|
||||||
item_table_mapper = {
|
|
||||||
'doctype': 'Delivery Note Item',
|
|
||||||
'field_map': {
|
|
||||||
'rate': 'rate',
|
|
||||||
'name': 'so_detail',
|
|
||||||
'parent': 'against_sales_order',
|
|
||||||
},
|
|
||||||
'condition': lambda doc: abs(doc.delivered_qty) < abs(doc.qty) and doc.delivered_by_supplier!=1
|
|
||||||
}
|
|
||||||
|
|
||||||
dn_item = map_child_doc(sales_order_item, delivery_note, item_table_mapper)
|
dn_item = map_child_doc(sales_order_item, delivery_note, item_table_mapper)
|
||||||
|
|
||||||
if dn_item:
|
if dn_item:
|
||||||
@ -203,79 +204,26 @@ def create_delivery_note(source_name, target_doc=None):
|
|||||||
|
|
||||||
set_delivery_note_missing_values(delivery_note)
|
set_delivery_note_missing_values(delivery_note)
|
||||||
|
|
||||||
|
delivery_note.pick_list = pick_list.name
|
||||||
|
|
||||||
return delivery_note
|
return delivery_note
|
||||||
|
|
||||||
|
|
||||||
def update_delivery_note_item(source, target, delivery_note):
|
|
||||||
cost_center = frappe.db.get_value("Project", delivery_note.project, "cost_center")
|
|
||||||
if not cost_center:
|
|
||||||
cost_center = frappe.db.get_value('Item Default',
|
|
||||||
fieldname=['buying_cost_center'],
|
|
||||||
filters={
|
|
||||||
'parent': source.item_code,
|
|
||||||
'parenttype': 'Item',
|
|
||||||
'company': delivery_note.company
|
|
||||||
})
|
|
||||||
|
|
||||||
if not cost_center:
|
|
||||||
cost_center = frappe.db.get_value('Item Default',
|
|
||||||
fieldname=['buying_cost_center'],
|
|
||||||
filters={
|
|
||||||
'parent': source.item_group,
|
|
||||||
'parenttype': 'Item Group',
|
|
||||||
'company': delivery_note.company
|
|
||||||
})
|
|
||||||
|
|
||||||
target.cost_center = cost_center
|
|
||||||
|
|
||||||
def set_delivery_note_missing_values(target):
|
|
||||||
target.run_method('set_missing_values')
|
|
||||||
target.run_method('set_po_nos')
|
|
||||||
target.run_method('calculate_taxes_and_totals')
|
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def create_stock_entry(pick_list):
|
def create_stock_entry(pick_list):
|
||||||
pick_list = frappe.get_doc(json.loads(pick_list))
|
pick_list = frappe.get_doc(json.loads(pick_list))
|
||||||
if stock_entry_exists(pick_list.get('name')):
|
|
||||||
return frappe.msgprint(_('Stock Entry already exists against this Pick List'))
|
|
||||||
|
|
||||||
work_order = frappe.get_doc("Work Order", pick_list.get('work_order'))
|
if stock_entry_exists(pick_list.get('name')):
|
||||||
|
return frappe.msgprint(_('Stock Entry has been already created against this Pick List'))
|
||||||
|
|
||||||
stock_entry = frappe.new_doc('Stock Entry')
|
stock_entry = frappe.new_doc('Stock Entry')
|
||||||
stock_entry.pick_list = pick_list.get('name')
|
stock_entry.pick_list = pick_list.get('name')
|
||||||
stock_entry.purpose = pick_list.get('purpose')
|
stock_entry.purpose = pick_list.get('purpose')
|
||||||
stock_entry.set_stock_entry_type()
|
stock_entry.set_stock_entry_type()
|
||||||
stock_entry.work_order = work_order.name
|
|
||||||
stock_entry.company = work_order.company
|
|
||||||
stock_entry.from_bom = 1
|
|
||||||
stock_entry.bom_no = work_order.bom_no
|
|
||||||
stock_entry.use_multi_level_bom = work_order.use_multi_level_bom
|
|
||||||
stock_entry.fg_completed_qty = pick_list.for_qty
|
|
||||||
if work_order.bom_no:
|
|
||||||
stock_entry.inspection_required = frappe.db.get_value('BOM',
|
|
||||||
work_order.bom_no, 'inspection_required')
|
|
||||||
|
|
||||||
is_wip_warehouse_group = frappe.db.get_value('Warehouse', work_order.wip_warehouse, 'is_group')
|
if pick_list.get('work_order'):
|
||||||
if not (is_wip_warehouse_group and work_order.skip_transfer):
|
stock_entry = update_stock_entry_based_on_work_order(pick_list, stock_entry)
|
||||||
wip_warehouse = work_order.wip_warehouse
|
elif pick_list.get('material_request'):
|
||||||
else:
|
stock_entry = update_stock_entry_based_on_material_request(pick_list, stock_entry)
|
||||||
wip_warehouse = None
|
|
||||||
stock_entry.to_warehouse = wip_warehouse
|
|
||||||
|
|
||||||
stock_entry.project = work_order.project
|
|
||||||
|
|
||||||
for location in pick_list.locations:
|
|
||||||
item = frappe._dict()
|
|
||||||
item.item_code = location.item_code
|
|
||||||
item.s_warehouse = location.warehouse
|
|
||||||
item.t_warehouse = wip_warehouse
|
|
||||||
item.qty = location.qty
|
|
||||||
item.transfer_qty = location.stock_qty
|
|
||||||
item.uom = location.uom
|
|
||||||
item.conversion_factor = location.conversion_factor
|
|
||||||
item.stock_uom = location.stock_uom
|
|
||||||
|
|
||||||
stock_entry.append('items', item)
|
|
||||||
|
|
||||||
stock_entry.set_incoming_rate()
|
stock_entry.set_incoming_rate()
|
||||||
stock_entry.set_actual_qty()
|
stock_entry.set_actual_qty()
|
||||||
@ -283,7 +231,6 @@ def create_stock_entry(pick_list):
|
|||||||
|
|
||||||
return stock_entry.as_dict()
|
return stock_entry.as_dict()
|
||||||
|
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def create_stock_entry_with_material_request_items(pick_list):
|
def create_stock_entry_with_material_request_items(pick_list):
|
||||||
stock_entry = frappe.new_doc('Stock Entry')
|
stock_entry = frappe.new_doc('Stock Entry')
|
||||||
@ -330,11 +277,99 @@ def get_pending_work_orders(doctype, txt, searchfield, start, page_length, filte
|
|||||||
'company': filters.get('company')
|
'company': filters.get('company')
|
||||||
}, as_dict=as_dict)
|
}, as_dict=as_dict)
|
||||||
|
|
||||||
def get_item_details(item_code):
|
|
||||||
pass
|
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
|
def target_document_exists(pick_list_name, purpose):
|
||||||
|
if purpose == 'Delivery against Sales Order':
|
||||||
|
return frappe.db.exists('Delivery Note', {
|
||||||
|
'pick_list': pick_list_name
|
||||||
|
})
|
||||||
|
|
||||||
|
return stock_entry_exists(pick_list_name)
|
||||||
|
|
||||||
|
|
||||||
|
def update_delivery_note_item(source, target, delivery_note):
|
||||||
|
cost_center = frappe.db.get_value('Project', delivery_note.project, 'cost_center')
|
||||||
|
if not cost_center:
|
||||||
|
cost_center = get_cost_center(source.item_code, 'Item', delivery_note.company)
|
||||||
|
|
||||||
|
if not cost_center:
|
||||||
|
cost_center = get_cost_center(source.item_group, 'Item Group', delivery_note.company)
|
||||||
|
|
||||||
|
target.cost_center = cost_center
|
||||||
|
|
||||||
|
def get_cost_center(for_item, from_doctype, company):
|
||||||
|
'''Returns Cost Center for Item or Item Group'''
|
||||||
|
return frappe.db.get_value('Item Default',
|
||||||
|
fieldname=['buying_cost_center'],
|
||||||
|
filters={
|
||||||
|
'parent': for_item,
|
||||||
|
'parenttype': from_doctype,
|
||||||
|
'company': company
|
||||||
|
})
|
||||||
|
|
||||||
|
def set_delivery_note_missing_values(target):
|
||||||
|
target.run_method('set_missing_values')
|
||||||
|
target.run_method('set_po_nos')
|
||||||
|
target.run_method('calculate_taxes_and_totals')
|
||||||
|
|
||||||
def stock_entry_exists(pick_list_name):
|
def stock_entry_exists(pick_list_name):
|
||||||
return frappe.db.exists('Stock Entry', {
|
return frappe.db.exists('Stock Entry', {
|
||||||
'pick_list': pick_list_name
|
'pick_list': pick_list_name
|
||||||
})
|
})
|
||||||
|
|
||||||
|
def get_item_details(item_code):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def update_stock_entry_based_on_work_order(pick_list, stock_entry):
|
||||||
|
work_order = frappe.get_doc("Work Order", pick_list.get('work_order'))
|
||||||
|
|
||||||
|
stock_entry.work_order = work_order.name
|
||||||
|
stock_entry.company = work_order.company
|
||||||
|
stock_entry.from_bom = 1
|
||||||
|
stock_entry.bom_no = work_order.bom_no
|
||||||
|
stock_entry.use_multi_level_bom = work_order.use_multi_level_bom
|
||||||
|
stock_entry.fg_completed_qty = pick_list.for_qty
|
||||||
|
if work_order.bom_no:
|
||||||
|
stock_entry.inspection_required = frappe.db.get_value('BOM',
|
||||||
|
work_order.bom_no, 'inspection_required')
|
||||||
|
|
||||||
|
is_wip_warehouse_group = frappe.db.get_value('Warehouse', work_order.wip_warehouse, 'is_group')
|
||||||
|
if not (is_wip_warehouse_group and work_order.skip_transfer):
|
||||||
|
wip_warehouse = work_order.wip_warehouse
|
||||||
|
else:
|
||||||
|
wip_warehouse = None
|
||||||
|
stock_entry.to_warehouse = wip_warehouse
|
||||||
|
|
||||||
|
stock_entry.project = work_order.project
|
||||||
|
|
||||||
|
for location in pick_list.locations:
|
||||||
|
item = frappe._dict()
|
||||||
|
item.item_code = location.item_code
|
||||||
|
item.s_warehouse = location.warehouse
|
||||||
|
item.t_warehouse = wip_warehouse
|
||||||
|
item.qty = location.qty
|
||||||
|
item.transfer_qty = location.stock_qty
|
||||||
|
item.uom = location.uom
|
||||||
|
item.conversion_factor = location.conversion_factor
|
||||||
|
item.stock_uom = location.stock_uom
|
||||||
|
|
||||||
|
stock_entry.append('items', item)
|
||||||
|
|
||||||
|
return stock_entry
|
||||||
|
|
||||||
|
def update_stock_entry_based_on_material_request(pick_list, stock_entry):
|
||||||
|
for location in pick_list.locations:
|
||||||
|
item = frappe._dict()
|
||||||
|
item.item_code = location.item_code
|
||||||
|
item.s_warehouse = location.warehouse
|
||||||
|
item.qty = location.qty
|
||||||
|
item.transfer_qty = location.stock_qty
|
||||||
|
item.uom = location.uom
|
||||||
|
item.conversion_factor = location.conversion_factor
|
||||||
|
item.stock_uom = location.stock_uom
|
||||||
|
item.material_request = location.material_request
|
||||||
|
item.material_request_item = location.material_request_item
|
||||||
|
|
||||||
|
stock_entry.append('items', item)
|
||||||
|
|
||||||
|
return stock_entry
|
Loading…
x
Reference in New Issue
Block a user