From 8077c49933b2d42d03c0986cec711397794f851c Mon Sep 17 00:00:00 2001 From: vishakhdesai Date: Mon, 25 Nov 2024 12:50:35 +0530 Subject: [PATCH] fix: use field precision instead of hardcoded precision in so and po (cherry picked from commit 1a1e2c7e01f76ed9f9cc727fb802ade8faa99440) # Conflicts: # erpnext/buying/doctype/purchase_order/purchase_order.js # erpnext/selling/doctype/sales_order/sales_order.js --- .../doctype/purchase_order/purchase_order.js | 62 +++++++++ .../doctype/sales_order/sales_order.js | 128 ++++++++++++++++++ 2 files changed, 190 insertions(+) diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.js b/erpnext/buying/doctype/purchase_order/purchase_order.js index d6fd53dc778..87164b52014 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.js +++ b/erpnext/buying/doctype/purchase_order/purchase_order.js @@ -62,8 +62,16 @@ frappe.ui.form.on("Purchase Order", { get_materials_from_supplier: function(frm) { let po_details = []; +<<<<<<< HEAD if (frm.doc.supplied_items && (frm.doc.per_received == 100 || frm.doc.status === 'Closed')) { frm.doc.supplied_items.forEach(d => { +======= + if ( + frm.doc.supplied_items && + (flt(frm.doc.per_received, precision("per_received")) == 100 || frm.doc.status === "Closed") + ) { + frm.doc.supplied_items.forEach((d) => { +>>>>>>> 1a1e2c7e01 (fix: use field precision instead of hardcoded precision in so and po) if (d.total_supplied_qty && d.total_supplied_qty != d.consumed_qty) { po_details.push(d.name) } @@ -180,11 +188,22 @@ erpnext.buying.PurchaseOrderController = class PurchaseOrderController extends e this.frm.fields_dict.items_section.wrapper.removeClass("hide-border"); } +<<<<<<< HEAD if(!["Closed", "Delivered"].includes(doc.status)) { if(this.frm.doc.status !== 'Closed' && flt(this.frm.doc.per_received) < 100 && flt(this.frm.doc.per_billed) < 100) { // Don't add Update Items button if the PO is following the new subcontracting flow. if (!(this.frm.doc.is_subcontracted && !this.frm.doc.is_old_subcontracting_flow)) { this.frm.add_custom_button(__('Update Items'), () => { +======= + if (!["Closed", "Delivered"].includes(doc.status)) { + if ( + this.frm.doc.status !== "Closed" && + flt(this.frm.doc.per_received, precision("per_received")) < 100 && + flt(this.frm.doc.per_billed, precision("per_billed")) < 100 + ) { + if (!this.frm.doc.__onload || this.frm.doc.__onload.can_update_items) { + this.frm.add_custom_button(__("Update Items"), () => { +>>>>>>> 1a1e2c7e01 (fix: use field precision instead of hardcoded precision in so and po) erpnext.utils.update_child_items({ frm: this.frm, child_docname: "items", @@ -195,7 +214,14 @@ erpnext.buying.PurchaseOrderController = class PurchaseOrderController extends e } } if (this.frm.has_perm("submit")) { +<<<<<<< HEAD if(flt(doc.per_billed, 6) < 100 || flt(doc.per_received, 6) < 100) { +======= + if ( + flt(doc.per_billed, precision("per_billed")) < 100 || + flt(doc.per_received, precision("per_received")) < 100 + ) { +>>>>>>> 1a1e2c7e01 (fix: use field precision instead of hardcoded precision in so and po) if (doc.status != "On Hold") { this.frm.add_custom_button(__('Hold'), () => this.hold_purchase_order(), __("Status")); } else{ @@ -218,8 +244,19 @@ erpnext.buying.PurchaseOrderController = class PurchaseOrderController extends e } if(doc.status != "Closed") { if (doc.status != "On Hold") { +<<<<<<< HEAD if(flt(doc.per_received) < 100 && allow_receipt) { cur_frm.add_custom_button(__('Purchase Receipt'), this.make_purchase_receipt, __('Create')); +======= + if (flt(doc.per_received, precision("per_received")) < 100 && allow_receipt) { + this.frm.add_custom_button( + __("Purchase Receipt"), + () => { + me.make_purchase_receipt(); + }, + __("Create") + ); +>>>>>>> 1a1e2c7e01 (fix: use field precision instead of hardcoded precision in so and po) if (doc.is_subcontracted) { if (doc.is_old_subcontracting_flow) { if (me.has_unsupplied_items()) { @@ -231,11 +268,25 @@ erpnext.buying.PurchaseOrderController = class PurchaseOrderController extends e } } } +<<<<<<< HEAD if(flt(doc.per_billed) < 100) cur_frm.add_custom_button(__('Purchase Invoice'), this.make_purchase_invoice, __('Create')); if(flt(doc.per_billed) < 100 && doc.status != "Delivered") { +======= + // Please do not add precision in the below flt function + if (flt(doc.per_billed, precision("per_billed")) < 100) + this.frm.add_custom_button( + __("Purchase Invoice"), + () => { + me.make_purchase_invoice(); + }, + __("Create") + ); + + if (flt(doc.per_billed, precision("per_billed")) < 100 && doc.status != "Delivered") { +>>>>>>> 1a1e2c7e01 (fix: use field precision instead of hardcoded precision in so and po) this.frm.add_custom_button( __('Payment'), () => this.make_payment_entry(), @@ -243,6 +294,7 @@ erpnext.buying.PurchaseOrderController = class PurchaseOrderController extends e ); } +<<<<<<< HEAD if(flt(doc.per_billed) < 100) { this.frm.add_custom_button(__('Payment Request'), function() { me.make_payment_request() }, __('Create')); @@ -252,6 +304,16 @@ erpnext.buying.PurchaseOrderController = class PurchaseOrderController extends e cur_frm.add_custom_button(__('Subscription'), function() { erpnext.utils.make_subscription(doc.doctype, doc.name) }, __('Create')) +======= + if (flt(doc.per_billed, precision("per_billed")) < 100) { + this.frm.add_custom_button( + __("Payment Request"), + function () { + me.make_payment_request(); + }, + __("Create") + ); +>>>>>>> 1a1e2c7e01 (fix: use field precision instead of hardcoded precision in so and po) } if (doc.docstatus === 1 && !doc.inter_company_order_reference) { diff --git a/erpnext/selling/doctype/sales_order/sales_order.js b/erpnext/selling/doctype/sales_order/sales_order.js index 7bdaab75a53..fcacb1b6874 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.js +++ b/erpnext/selling/doctype/sales_order/sales_order.js @@ -47,6 +47,7 @@ frappe.ui.form.on("Sales Order", { frm.set_df_property('packed_items', 'cannot_add_rows', true); frm.set_df_property('packed_items', 'cannot_delete_rows', true); }, +<<<<<<< HEAD refresh: function(frm) { if( frm.doc.docstatus === 1 @@ -62,6 +63,63 @@ frappe.ui.form.on("Sales Order", { child_doctype: "Sales Order Detail", cannot_add_row: false, }) +======= + + refresh: function (frm) { + if (frm.doc.docstatus === 1) { + if ( + frm.doc.status !== "Closed" && + flt(frm.doc.per_delivered, precision("per_delivered")) < 100 && + flt(frm.doc.per_billed, precision("per_billed")) < 100 && + frm.has_perm("write") + ) { + frm.add_custom_button(__("Update Items"), () => { + erpnext.utils.update_child_items({ + frm: frm, + child_docname: "items", + child_doctype: "Sales Order Detail", + cannot_add_row: false, + has_reserved_stock: frm.doc.__onload && frm.doc.__onload.has_reserved_stock, + }); + }); + + // Stock Reservation > Reserve button should only be visible if the SO has unreserved stock and no Pick List is created against the SO. + if ( + frm.doc.__onload && + frm.doc.__onload.has_unreserved_stock && + flt(frm.doc.per_picked, precision("per_picked")) === 0 + ) { + frm.add_custom_button( + __("Reserve"), + () => frm.events.create_stock_reservation_entries(frm), + __("Stock Reservation") + ); + } + } + + // Stock Reservation > Unreserve button will be only visible if the SO has un-delivered reserved stock. + if ( + frm.doc.__onload && + frm.doc.__onload.has_reserved_stock && + frappe.model.can_cancel("Stock Reservation Entry") + ) { + frm.add_custom_button( + __("Unreserve"), + () => frm.events.cancel_stock_reservation_entries(frm), + __("Stock Reservation") + ); + } + + frm.doc.items.forEach((item) => { + if (flt(item.stock_reserved_qty) > 0 && frappe.model.can_read("Stock Reservation Entry")) { + frm.add_custom_button( + __("Reserved Stock"), + () => frm.events.show_reserved_stock(frm), + __("Stock Reservation") + ); + return; + } +>>>>>>> 1a1e2c7e01 (fix: use field precision instead of hardcoded precision in so and po) }); } @@ -203,6 +261,7 @@ erpnext.selling.SalesOrderController = class SalesOrderController extends erpnex if (doc.docstatus==1) { +<<<<<<< HEAD if(this.frm.has_perm("submit")) { if(doc.status === 'On Hold') { // un-hold @@ -214,6 +273,24 @@ erpnext.selling.SalesOrderController = class SalesOrderController extends erpnex // close this.frm.add_custom_button(__('Close'), () => this.close_sales_order(), __("Status")) } +======= + if ( + flt(doc.per_delivered, precision("per_delivered")) < 100 || + flt(doc.per_billed, precision("per_billed")) < 100 + ) { + // close + this.frm.add_custom_button(__("Close"), () => this.close_sales_order(), __("Status")); + } + } else if (doc.status === "Closed") { + // un-close + this.frm.add_custom_button( + __("Re-open"), + function () { + me.frm.cscript.update_status("Re-open", "Draft"); + }, + __("Status") + ); +>>>>>>> 1a1e2c7e01 (fix: use field precision instead of hardcoded precision in so and po) } else if(doc.status === 'Closed') { // un-close @@ -228,7 +305,14 @@ erpnext.selling.SalesOrderController = class SalesOrderController extends erpnex && !this.frm.doc.skip_delivery_note if (this.frm.has_perm("submit")) { +<<<<<<< HEAD if(flt(doc.per_delivered, 6) < 100 || flt(doc.per_billed) < 100) { +======= + if ( + flt(doc.per_delivered, precision("per_delivered")) < 100 || + flt(doc.per_billed, precision("per_billed")) < 100 + ) { +>>>>>>> 1a1e2c7e01 (fix: use field precision instead of hardcoded precision in so and po) // hold this.frm.add_custom_button(__('Hold'), () => this.hold_sales_order(), __("Status")) // close @@ -237,9 +321,16 @@ erpnext.selling.SalesOrderController = class SalesOrderController extends erpnex } if ( +<<<<<<< HEAD flt(doc.per_picked, 6) < 100 && flt(doc.per_delivered, 6) < 100 && frappe.model.can_create("Pick List") +======= + (!doc.__onload || !doc.__onload.has_reserved_stock) && + flt(doc.per_picked, precision("per_picked")) < 100 && + flt(doc.per_delivered, precision("per_delivered")) < 100 && + frappe.model.can_create("Pick List") +>>>>>>> 1a1e2c7e01 (fix: use field precision instead of hardcoded precision in so and po) ) { this.frm.add_custom_button(__('Pick List'), () => this.create_pick_list(), __('Create')); } @@ -250,10 +341,17 @@ erpnext.selling.SalesOrderController = class SalesOrderController extends erpnex const order_is_a_custom_sale = ["Sales", "Shopping Cart", "Maintenance"].indexOf(doc.order_type) === -1; // delivery note +<<<<<<< HEAD if( flt(doc.per_delivered, 6) < 100 && (order_is_a_sale || order_is_a_custom_sale) && allow_delivery +======= + if ( + flt(doc.per_delivered, precision("per_delivered")) < 100 && + (order_is_a_sale || order_is_a_custom_sale) && + allow_delivery +>>>>>>> 1a1e2c7e01 (fix: use field precision instead of hardcoded precision in so and po) ) { if (frappe.model.can_create("Delivery Note")) { this.frm.add_custom_button( @@ -272,7 +370,14 @@ erpnext.selling.SalesOrderController = class SalesOrderController extends erpnex } // sales invoice +<<<<<<< HEAD if(flt(doc.per_billed, 6) < 100 && frappe.model.can_create("Sales Invoice")) { +======= + if ( + flt(doc.per_billed, precision("per_billed")) < 100 && + frappe.model.can_create("Sales Invoice") + ) { +>>>>>>> 1a1e2c7e01 (fix: use field precision instead of hardcoded precision in so and po) this.frm.add_custom_button( __("Sales Invoice"), () => me.make_sales_invoice(), @@ -282,12 +387,19 @@ erpnext.selling.SalesOrderController = class SalesOrderController extends erpnex // material request if ( +<<<<<<< HEAD ( !doc.order_type || (order_is_a_sale || order_is_a_custom_sale) && flt(doc.per_delivered, 6) < 100 ) && frappe.model.can_create("Material Request") +======= + (!doc.order_type || + ((order_is_a_sale || order_is_a_custom_sale) && + flt(doc.per_delivered, precision("per_delivered")) < 100)) && + frappe.model.can_create("Material Request") +>>>>>>> 1a1e2c7e01 (fix: use field precision instead of hardcoded precision in so and po) ) { this.frm.add_custom_button( __('Material Request'), @@ -311,8 +423,16 @@ erpnext.selling.SalesOrderController = class SalesOrderController extends erpnex } // maintenance +<<<<<<< HEAD if(flt(doc.per_delivered, 2) < 100 && (order_is_maintenance || order_is_a_custom_sale)) { if(frappe.model.can_create("Maintenance Visit")) { +======= + if ( + flt(doc.per_delivered, precision("per_delivered")) < 100 && + (order_is_maintenance || order_is_a_custom_sale) + ) { + if (frappe.model.can_create("Maintenance Visit")) { +>>>>>>> 1a1e2c7e01 (fix: use field precision instead of hardcoded precision in so and po) this.frm.add_custom_button( __('Maintenance Visit'), () => this.make_maintenance_visit(), @@ -330,6 +450,7 @@ erpnext.selling.SalesOrderController = class SalesOrderController extends erpnex } // project +<<<<<<< HEAD if(flt(doc.per_delivered, 2) < 100 && frappe.model.can_create("Project")) { this.frm.add_custom_button(__('Project'), () => this.make_project(), __('Create')); } @@ -342,6 +463,13 @@ erpnext.selling.SalesOrderController = class SalesOrderController extends erpnex }, __('Create') ); +======= + if ( + flt(doc.per_delivered, precision("per_delivered")) < 100 && + frappe.model.can_create("Project") + ) { + this.frm.add_custom_button(__("Project"), () => this.make_project(), __("Create")); +>>>>>>> 1a1e2c7e01 (fix: use field precision instead of hardcoded precision in so and po) } if (