From 63e9da92b23ea4c23585d9a0d08c09ad6ca6e3dd Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Mon, 28 Oct 2024 17:21:06 +0530 Subject: [PATCH] fix: work order finish button not showing (#43875) (cherry picked from commit 0a70be5b993895dcc888c7418bbd675224554d2b) # Conflicts: # erpnext/manufacturing/doctype/job_card/job_card.js # erpnext/manufacturing/doctype/job_card/job_card.py --- .../doctype/job_card/job_card.js | 114 ++++++++++++++++++ .../doctype/job_card/job_card.py | 43 +++++++ 2 files changed, 157 insertions(+) diff --git a/erpnext/manufacturing/doctype/job_card/job_card.js b/erpnext/manufacturing/doctype/job_card/job_card.js index 4cc60a3b4a6..d817f4b7adb 100644 --- a/erpnext/manufacturing/doctype/job_card/job_card.js +++ b/erpnext/manufacturing/doctype/job_card/job_card.js @@ -134,6 +134,120 @@ frappe.ui.form.on("Job Card", { } }, +<<<<<<< HEAD +======= + complete_job_card(frm) { + let fields = [ + { + fieldtype: "Float", + label: __("Completed Quantity"), + fieldname: "qty", + reqd: 1, + default: frm.doc.for_quantity - frm.doc.manufactured_qty, + }, + { + fieldtype: "Datetime", + label: __("End Time"), + fieldname: "end_time", + default: frappe.datetime.now_datetime(), + }, + ]; + + frappe.prompt( + fields, + (data) => { + if (data.qty <= 0) { + frappe.throw(__("Quantity should be greater than 0")); + } + + frm.call({ + method: "complete_job_card", + doc: frm.doc, + args: { + qty: data.qty, + end_time: data.end_time, + }, + callback: function (r) { + frm.reload_doc(); + }, + }); + }, + __("Enter Value"), + __("Update"), + __("Set Finished Good Quantity") + ); + }, + + make_subcontracting_po(frm) { + if (frm.doc.docstatus === 1 && frm.doc.for_quantity > frm.doc.manufactured_qty) { + frm.add_custom_button(__("Make Subcontracting PO"), () => { + frappe.model.open_mapped_doc({ + method: "erpnext.manufacturing.doctype.job_card.job_card.make_subcontracting_po", + frm: frm, + }); + }).addClass("btn-primary"); + } + }, + + start_timer(frm, start_time, employees) { + frm.call({ + method: "start_timer", + doc: frm.doc, + args: { + start_time: start_time, + employees: employees, + }, + callback: function (r) { + frm.reload_doc(); + frm.trigger("make_dashboard"); + }, + }); + }, + + make_finished_good(frm) { + let fields = [ + { + fieldtype: "Float", + label: __("Completed Quantity"), + fieldname: "qty", + reqd: 1, + default: frm.doc.for_quantity - frm.doc.manufactured_qty, + }, + { + fieldtype: "Datetime", + label: __("End Time"), + fieldname: "end_time", + default: frappe.datetime.now_datetime(), + }, + ]; + + frappe.prompt( + fields, + (data) => { + if (data.qty <= 0) { + frappe.throw(__("Quantity should be greater than 0")); + } + + frm.call({ + method: "make_finished_good", + doc: frm.doc, + args: { + qty: data.qty, + end_time: data.end_time, + }, + callback: function (r) { + var doc = frappe.model.sync(r.message); + frappe.set_route("Form", doc[0].doctype, doc[0].name); + }, + }); + }, + __("Enter Value"), + __("Update"), + __("Set Finished Good Quantity") + ); + }, + +>>>>>>> 0a70be5b99 (fix: work order finish button not showing (#43875)) setup_quality_inspection: function (frm) { let quality_inspection_field = frm.get_docfield("quality_inspection"); quality_inspection_field.get_route_options_for_new_doc = function (frm) { diff --git a/erpnext/manufacturing/doctype/job_card/job_card.py b/erpnext/manufacturing/doctype/job_card/job_card.py index de8116b296c..facc8648baa 100644 --- a/erpnext/manufacturing/doctype/job_card/job_card.py +++ b/erpnext/manufacturing/doctype/job_card/job_card.py @@ -921,6 +921,7 @@ class JobCard(Document): if doc.transfer_material_against == "Work Order" or doc.skip_transfer: return +<<<<<<< HEAD if self.items: # sum of 'For Quantity' of Stock Entries against JC self.transferred_qty = ( @@ -959,6 +960,48 @@ class JobCard(Document): if job_cards: qty = min(d.qty for d in job_cards) +======= + query = ( + frappe.qb.from_(stock_entry) + .select(Sum(stock_entry.fg_completed_qty)) + .where( + (stock_entry.job_card == self.name) + & (stock_entry.docstatus == 1) + & (stock_entry.purpose == "Material Transfer for Manufacture") + ) + .groupby(stock_entry.job_card) + ) + + query = query.run() + qty = 0 + + if query and query[0][0]: + qty = flt(query[0][0]) + + self.db_set("transferred_qty", qty) + self.set_status(update_status) + + if self.work_order and not frappe.get_cached_value( + "Work Order", self.work_order, "track_semi_finished_goods" + ): + self.set_transferred_qty_in_work_order() + + def set_transferred_qty_in_work_order(self): + doc = frappe.get_doc("Work Order", self.work_order) + + qty = 0.0 + if doc.transfer_material_against == "Job Card" and not doc.skip_transfer: + min_qty = [] + for d in doc.operations: + if d.completed_qty: + min_qty.append(d.completed_qty) + else: + min_qty = [] + break + + if min_qty: + qty = min(min_qty) +>>>>>>> 0a70be5b99 (fix: work order finish button not showing (#43875)) doc.db_set("material_transferred_for_manufacturing", qty)