From 5468a3b0b7418b0aec47b4f96cc17ca85e57bd6a Mon Sep 17 00:00:00 2001 From: barredterra <14891507+barredterra@users.noreply.github.com> Date: Wed, 8 May 2024 16:23:46 +0200 Subject: [PATCH 1/4] fix(Sales Order): only show permitted actions (cherry picked from commit c29d95537185d909612103b65573242a91ef0d70) # Conflicts: # erpnext/selling/doctype/sales_order/sales_order.js --- .../doctype/sales_order/sales_order.js | 223 +++++++++++++++++- 1 file changed, 222 insertions(+), 1 deletion(-) diff --git a/erpnext/selling/doctype/sales_order/sales_order.js b/erpnext/selling/doctype/sales_order/sales_order.js index 2995a1e99bc..29ef186c42a 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 && frm.doc.status !== 'Closed' && flt(frm.doc.per_delivered, 6) < 100 && flt(frm.doc.per_billed, 6) < 100) { @@ -57,6 +58,64 @@ 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, 2) < 100 && + flt(frm.doc.per_billed, 2) < 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) === 0 && + frappe.model.can_create("Stock Reservation Entry") + ) { + 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; + } +>>>>>>> c29d955371 (fix(Sales Order): only show permitted actions) }); } @@ -66,6 +125,7 @@ frappe.ui.form.on("Sales Order", { }, get_items_from_internal_purchase_order(frm) { +<<<<<<< HEAD frm.add_custom_button(__('Purchase Order'), () => { erpnext.utils.map_current_doc({ method: 'erpnext.buying.doctype.purchase_order.purchase_order.make_inter_company_sales_order', @@ -87,6 +147,37 @@ frappe.ui.form.on("Sales Order", { } }); }, __('Get Items From')); +======= + if (!frappe.model.can_read("Purchase Order")) { + return; + } + + frm.add_custom_button( + __("Purchase Order"), + () => { + erpnext.utils.map_current_doc({ + method: "erpnext.buying.doctype.purchase_order.purchase_order.make_inter_company_sales_order", + source_doctype: "Purchase Order", + target: frm, + setters: [ + { + label: "Supplier", + fieldname: "supplier", + fieldtype: "Link", + options: "Supplier", + }, + ], + get_query_filters: { + company: frm.doc.company, + is_internal_supplier: 1, + docstatus: 1, + status: ["!=", "Completed"], + }, + }); + }, + __("Get Items From") + ); +>>>>>>> c29d955371 (fix(Sales Order): only show permitted actions) }, // When multiple companies are set up. in case company name is changed set default company address @@ -223,8 +314,22 @@ erpnext.selling.SalesOrderController = class SalesOrderController extends erpnex } } +<<<<<<< HEAD if (flt(doc.per_picked, 6) < 100 && flt(doc.per_delivered, 6) < 100) { this.frm.add_custom_button(__('Pick List'), () => this.create_pick_list(), __('Create')); +======= + if ( + (!doc.__onload || !doc.__onload.has_reserved_stock) && + flt(doc.per_picked, 2) < 100 && + flt(doc.per_delivered, 2) < 100 && + frappe.model.can_create("Pick List") + ) { + this.frm.add_custom_button( + __("Pick List"), + () => this.create_pick_list(), + __("Create") + ); +>>>>>>> c29d955371 (fix(Sales Order): only show permitted actions) } const order_is_a_sale = ["Sales", "Shopping Cart"].indexOf(doc.order_type) !== -1; @@ -233,6 +338,7 @@ 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) { this.frm.add_custom_button(__('Delivery Note'), () => this.make_delivery_note_based_on_delivery_date(), __('Create')); this.frm.add_custom_button(__('Work Order'), () => this.make_work_order(), __('Create')); @@ -269,9 +375,95 @@ erpnext.selling.SalesOrderController = class SalesOrderController extends erpnex this.frm.add_custom_button(__('Subscription'), function() { erpnext.utils.make_subscription(doc.doctype, doc.name) }, __('Create')) +======= + if ( + flt(doc.per_delivered, 2) < 100 && + (order_is_a_sale || order_is_a_custom_sale) && + allow_delivery + ) { + if (frappe.model.can_create("Delivery Note")) { + this.frm.add_custom_button( + __("Delivery Note"), + () => this.make_delivery_note_based_on_delivery_date(true), + __("Create") + ); + } + + if (frappe.model.can_create("Work Order")) { + this.frm.add_custom_button( + __("Work Order"), + () => this.make_work_order(), + __("Create") + ); + } } - if (doc.docstatus === 1 && !doc.inter_company_order_reference) { + // sales invoice + if (flt(doc.per_billed, 2) < 100 && frappe.model.can_create("Sales Invoice")) { + this.frm.add_custom_button( + __("Sales Invoice"), + () => me.make_sales_invoice(), + __("Create") + ); + } + + // material request + if ( + (!doc.order_type || + ((order_is_a_sale || order_is_a_custom_sale) && + flt(doc.per_delivered, 2) < 100)) && + frappe.model.can_create("Material Request") + ) { + this.frm.add_custom_button( + __("Material Request"), + () => this.make_material_request(), + __("Create") + ); + this.frm.add_custom_button( + __("Request for Raw Materials"), + () => this.make_raw_material_request(), + __("Create") + ); + } + + // Make Purchase Order + if (!this.frm.doc.is_internal_customer && frappe.model.can_create("Purchase Order")) { + this.frm.add_custom_button( + __("Purchase Order"), + () => this.make_purchase_order(), + __("Create") + ); + } + + // maintenance + if (flt(doc.per_delivered, 2) < 100 && (order_is_maintenance || order_is_a_custom_sale)) { + if (frappe.model.can_create("Maintenance Visit")) { + this.frm.add_custom_button( + __("Maintenance Visit"), + () => this.make_maintenance_visit(), + __("Create") + ); + } + if (frappe.model.can_create("Maintenance Schedule")) { + this.frm.add_custom_button( + __("Maintenance Schedule"), + () => this.make_maintenance_schedule(), + __("Create") + ); + } + } + + // project + if (flt(doc.per_delivered, 2) < 100 && frappe.model.can_create("Project")) { + this.frm.add_custom_button(__("Project"), () => this.make_project(), __("Create")); +>>>>>>> c29d955371 (fix(Sales Order): only show permitted actions) + } + + if ( + doc.docstatus === 1 && + !doc.inter_company_order_reference && + frappe.model.can_create("Purchase Order") + ) { let me = this; let internal = me.frm.doc.is_internal_customer; if (internal) { @@ -285,17 +477,46 @@ erpnext.selling.SalesOrderController = class SalesOrderController extends erpnex } } // payment request +<<<<<<< HEAD if(flt(doc.per_billed, precision('per_billed', doc)) < 100 + frappe.boot.sysdefaults.over_billing_allowance) { this.frm.add_custom_button(__('Payment Request'), () => this.make_payment_request(), __('Create')); this.frm.add_custom_button(__('Payment'), () => this.make_payment_entry(), __('Create')); +======= + if ( + flt(doc.per_billed, precision("per_billed", doc)) < + 100 + frappe.boot.sysdefaults.over_billing_allowance + ) { + if (frappe.model.can_create("Payment Request")) { + this.frm.add_custom_button( + __("Payment Request"), + () => this.make_payment_request(), + __("Create") + ); + } + + if (frappe.model.can_create("Payment Entry")) { + this.frm.add_custom_button( + __("Payment"), + () => this.make_payment_entry(), + __("Create") + ); + } +>>>>>>> c29d955371 (fix(Sales Order): only show permitted actions) } this.frm.page.set_inner_btn_group_as_primary(__('Create')); } } +<<<<<<< HEAD if (this.frm.doc.docstatus===0) { this.frm.add_custom_button(__('Quotation'), function() { +======= + if (this.frm.doc.docstatus === 0 && frappe.model.can_read("Quotation")) { + this.frm.add_custom_button( + __("Quotation"), + function () { +>>>>>>> c29d955371 (fix(Sales Order): only show permitted actions) let d = erpnext.utils.map_current_doc({ method: "erpnext.selling.doctype.quotation.quotation.make_sales_order", source_doctype: "Quotation", From 0aa246c39ef933028c0335abaa179b4071754c63 Mon Sep 17 00:00:00 2001 From: barredterra <14891507+barredterra@users.noreply.github.com> Date: Wed, 8 May 2024 17:55:16 +0200 Subject: [PATCH 2/4] fix(Delivery Note): only show permitted actions (cherry picked from commit 418bdc1dcc0c8c8eaaa6555b3689436515270c7c) # Conflicts: # erpnext/stock/doctype/delivery_note/delivery_note.js --- erpnext/public/js/controllers/transaction.js | 2 +- .../doctype/delivery_note/delivery_note.js | 141 +++++++++++++++++- 2 files changed, 141 insertions(+), 2 deletions(-) diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js index 66ac9582b2d..d6c5885891e 100644 --- a/erpnext/public/js/controllers/transaction.js +++ b/erpnext/public/js/controllers/transaction.js @@ -265,7 +265,7 @@ erpnext.TransactionController = class TransactionController extends erpnext.taxe } const me = this; - if (!this.frm.is_new() && this.frm.doc.docstatus === 0) { + if (!this.frm.is_new() && this.frm.doc.docstatus === 0 && frappe.model.can_create("Quality Inspection")) { this.frm.add_custom_button(__("Quality Inspection(s)"), () => { me.make_quality_inspection(); }, __("Create")); diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.js b/erpnext/stock/doctype/delivery_note/delivery_note.js index 77545e0e1ad..12379670190 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note.js +++ b/erpnext/stock/doctype/delivery_note/delivery_note.js @@ -85,6 +85,7 @@ frappe.ui.form.on("Delivery Note", { erpnext.stock.delivery_note.set_print_hide(frm.doc); }, +<<<<<<< HEAD refresh: function(frm) { if (frm.doc.docstatus === 1 && frm.doc.is_return === 1 && frm.doc.per_billed !== 100) { frm.add_custom_button(__('Credit Note'), function() { @@ -94,9 +95,33 @@ frappe.ui.form.on("Delivery Note", { }) }, __('Create')); frm.page.set_inner_btn_group_as_primary(__('Create')); +======= + refresh: function (frm) { + if ( + frm.doc.docstatus === 1 && + frm.doc.is_return === 1 && + frm.doc.per_billed !== 100 && + frappe.model.can_create("Sales Invoice") + ) { + frm.add_custom_button( + __("Credit Note"), + function () { + frappe.model.open_mapped_doc({ + method: "erpnext.stock.doctype.delivery_note.delivery_note.make_sales_invoice", + frm: cur_frm, + }); + }, + __("Create") + ); + frm.page.set_inner_btn_group_as_primary(__("Create")); +>>>>>>> 418bdc1dcc (fix(Delivery Note): only show permitted actions) } - if (frm.doc.docstatus == 1 && !frm.doc.inter_company_reference) { + if ( + frm.doc.docstatus == 1 && + !frm.doc.inter_company_reference && + frappe.model.can_create("Purchase Receipt") + ) { let internal = frm.doc.is_internal_customer; if (internal) { let button_label = (frm.doc.company === frm.doc.represents_company) ? "Internal Purchase Receipt" : @@ -135,6 +160,7 @@ erpnext.stock.DeliveryNoteController = class DeliveryNoteController extends erpn refresh(doc, dt, dn) { var me = this; super.refresh(); +<<<<<<< HEAD if ((!doc.is_return) && (doc.status!="Closed" || this.frm.is_new())) { if (this.frm.doc.docstatus===0) { this.frm.add_custom_button(__('Sales Order'), @@ -193,6 +219,109 @@ erpnext.stock.DeliveryNoteController = class DeliveryNoteController extends erpn }) }, __('Create') ); } +======= + if ( + !doc.is_return && + (doc.status != "Closed" || this.frm.is_new()) && + this.frm.has_perm("write") && + frappe.model.can_read("Sales Order") && + this.frm.doc.docstatus === 0 + ) { + this.frm.add_custom_button( + __("Sales Order"), + function () { + if (!me.frm.doc.customer) { + frappe.throw({ + title: __("Mandatory"), + message: __("Please Select a Customer"), + }); + } + erpnext.utils.map_current_doc({ + method: "erpnext.selling.doctype.sales_order.sales_order.make_delivery_note", + args: { + for_reserved_stock: 1, + }, + source_doctype: "Sales Order", + target: me.frm, + setters: { + customer: me.frm.doc.customer, + }, + get_query_filters: { + docstatus: 1, + status: ["not in", ["Closed", "On Hold"]], + per_delivered: ["<", 99.99], + company: me.frm.doc.company, + project: me.frm.doc.project || undefined, + }, + }); + }, + __("Get Items From") + ); + } + + if (!doc.is_return && doc.status != "Closed" && frappe.model.can_create("Shipment")) { + if (doc.docstatus == 1) { + this.frm.add_custom_button( + __("Shipment"), + function () { + me.make_shipment(); + }, + __("Create") + ); + } + + if ( + flt(doc.per_installed, 2) < 100 && + doc.docstatus == 1 && + frappe.model.can_create("Installation Note") + ) { + this.frm.add_custom_button( + __("Installation Note"), + function () { + me.make_installation_note(); + }, + __("Create") + ); + } + + if (doc.docstatus == 1 && this.frm.has_perm("create")) { + this.frm.add_custom_button( + __("Sales Return"), + function () { + me.make_sales_return(); + }, + __("Create") + ); + } + + if (doc.docstatus == 1 && frappe.model.can_create("Delivery Trip")) { + this.frm.add_custom_button( + __("Delivery Trip"), + function () { + me.make_delivery_trip(); + }, + __("Create") + ); + } + + if ( + doc.docstatus == 0 && + !doc.__islocal && + doc.__onload && + doc.__onload.has_unpacked_items && + frappe.model.can_create("Packing Slip") + ) { + this.frm.add_custom_button( + __("Packing Slip"), + function () { + frappe.model.open_mapped_doc({ + method: "erpnext.stock.doctype.delivery_note.delivery_note.make_packing_slip", + frm: me.frm, + }); + }, + __("Create") + ); +>>>>>>> 418bdc1dcc (fix(Delivery Note): only show permitted actions) } if (!doc.__islocal && doc.docstatus==1) { @@ -211,7 +340,17 @@ erpnext.stock.DeliveryNoteController = class DeliveryNoteController extends erpn } } +<<<<<<< HEAD if(doc.docstatus==1 && !doc.is_return && doc.status!="Closed" && flt(doc.per_billed) < 100) { +======= + if ( + doc.docstatus == 1 && + !doc.is_return && + doc.status != "Closed" && + flt(doc.per_billed) < 100 && + frappe.model.can_create("Sales Invoice") + ) { +>>>>>>> 418bdc1dcc (fix(Delivery Note): only show permitted actions) // show Make Invoice button only if Delivery Note is not created from Sales Invoice var from_sales_invoice = false; from_sales_invoice = me.frm.doc.items.some(function(item) { From 0e6edf763e9210d7bd57190e28d7c9fe77bafee1 Mon Sep 17 00:00:00 2001 From: barredterra <14891507+barredterra@users.noreply.github.com> Date: Thu, 20 Jun 2024 14:15:26 +0200 Subject: [PATCH 3/4] chore: resolve conflicts --- erpnext/public/js/controllers/transaction.js | 6 +- .../doctype/sales_order/sales_order.js | 244 ++++-------------- .../doctype/delivery_note/delivery_note.js | 196 ++++---------- 3 files changed, 107 insertions(+), 339 deletions(-) diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js index 7291a82719c..e3dae3e6f97 100644 --- a/erpnext/public/js/controllers/transaction.js +++ b/erpnext/public/js/controllers/transaction.js @@ -265,7 +265,11 @@ erpnext.TransactionController = class TransactionController extends erpnext.taxe } const me = this; - if (!this.frm.is_new() && this.frm.doc.docstatus === 0 && frappe.model.can_create("Quality Inspection")) { + if ( + !this.frm.is_new() + && this.frm.doc.docstatus === 0 + && frappe.model.can_create("Quality Inspection") + ) { this.frm.add_custom_button(__("Quality Inspection(s)"), () => { me.make_quality_inspection(); }, __("Create")); diff --git a/erpnext/selling/doctype/sales_order/sales_order.js b/erpnext/selling/doctype/sales_order/sales_order.js index bfd5d6aadee..26113554a19 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.js +++ b/erpnext/selling/doctype/sales_order/sales_order.js @@ -47,10 +47,14 @@ 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 && frm.doc.status !== 'Closed' - && flt(frm.doc.per_delivered, 6) < 100 && flt(frm.doc.per_billed, 6) < 100) { + if( + frm.doc.docstatus === 1 + && frm.doc.status !== "Closed" + && flt(frm.doc.per_delivered, 6) < 100 + && flt(frm.doc.per_billed, 6) < 100 + && frm.has_perm("write") + ) { frm.add_custom_button(__('Update Items'), () => { erpnext.utils.update_child_items({ frm: frm, @@ -58,64 +62,6 @@ 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, 2) < 100 && - flt(frm.doc.per_billed, 2) < 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) === 0 && - frappe.model.can_create("Stock Reservation Entry") - ) { - 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; - } ->>>>>>> c29d955371 (fix(Sales Order): only show permitted actions) }); } @@ -125,7 +71,10 @@ frappe.ui.form.on("Sales Order", { }, get_items_from_internal_purchase_order(frm) { -<<<<<<< HEAD + if (!frappe.model.can_read("Purchase Order")) { + return; + } + frm.add_custom_button(__('Purchase Order'), () => { erpnext.utils.map_current_doc({ method: 'erpnext.buying.doctype.purchase_order.purchase_order.make_inter_company_sales_order', @@ -147,37 +96,6 @@ frappe.ui.form.on("Sales Order", { } }); }, __('Get Items From')); -======= - if (!frappe.model.can_read("Purchase Order")) { - return; - } - - frm.add_custom_button( - __("Purchase Order"), - () => { - erpnext.utils.map_current_doc({ - method: "erpnext.buying.doctype.purchase_order.purchase_order.make_inter_company_sales_order", - source_doctype: "Purchase Order", - target: frm, - setters: [ - { - label: "Supplier", - fieldname: "supplier", - fieldtype: "Link", - options: "Supplier", - }, - ], - get_query_filters: { - company: frm.doc.company, - is_internal_supplier: 1, - docstatus: 1, - status: ["!=", "Completed"], - }, - }); - }, - __("Get Items From") - ); ->>>>>>> c29d955371 (fix(Sales Order): only show permitted actions) }, // When multiple companies are set up. in case company name is changed set default company address @@ -318,22 +236,12 @@ erpnext.selling.SalesOrderController = class SalesOrderController extends erpnex } } -<<<<<<< HEAD - if (flt(doc.per_picked, 6) < 100 && flt(doc.per_delivered, 6) < 100) { - this.frm.add_custom_button(__('Pick List'), () => this.create_pick_list(), __('Create')); -======= if ( - (!doc.__onload || !doc.__onload.has_reserved_stock) && - flt(doc.per_picked, 2) < 100 && - flt(doc.per_delivered, 2) < 100 && - frappe.model.can_create("Pick List") + flt(doc.per_picked, 6) < 100 + && flt(doc.per_delivered, 6) < 100 + && frappe.model.can_create("Pick List") ) { - this.frm.add_custom_button( - __("Pick List"), - () => this.create_pick_list(), - __("Create") - ); ->>>>>>> c29d955371 (fix(Sales Order): only show permitted actions) + this.frm.add_custom_button(__('Pick List'), () => this.create_pick_list(), __('Create')); } const order_is_a_sale = ["Sales", "Shopping Cart"].indexOf(doc.order_type) !== -1; @@ -342,57 +250,18 @@ 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) { - this.frm.add_custom_button(__('Delivery Note'), () => this.make_delivery_note_based_on_delivery_date(), __('Create')); - this.frm.add_custom_button(__('Work Order'), () => this.make_work_order(), __('Create')); - } - - // sales invoice - if(flt(doc.per_billed, 6) < 100) { - this.frm.add_custom_button(__('Sales Invoice'), () => me.make_sales_invoice(), __('Create')); - } - - // material request - if(!doc.order_type || (order_is_a_sale || order_is_a_custom_sale) && flt(doc.per_delivered, 6) < 100) { - this.frm.add_custom_button(__('Material Request'), () => this.make_material_request(), __('Create')); - this.frm.add_custom_button(__('Request for Raw Materials'), () => this.make_raw_material_request(), __('Create')); - } - - // Make Purchase Order - if (!this.frm.doc.is_internal_customer) { - this.frm.add_custom_button(__('Purchase Order'), () => this.make_purchase_order(), __('Create')); - } - - // maintenance - if(flt(doc.per_delivered, 2) < 100 && (order_is_maintenance || order_is_a_custom_sale)) { - this.frm.add_custom_button(__('Maintenance Visit'), () => this.make_maintenance_visit(), __('Create')); - this.frm.add_custom_button(__('Maintenance Schedule'), () => this.make_maintenance_schedule(), __('Create')); - } - - // project - if(flt(doc.per_delivered, 2) < 100) { - this.frm.add_custom_button(__('Project'), () => this.make_project(), __('Create')); - } - - if(!doc.auto_repeat) { - this.frm.add_custom_button(__('Subscription'), function() { - erpnext.utils.make_subscription(doc.doctype, doc.name) - }, __('Create')) -======= - if ( - flt(doc.per_delivered, 2) < 100 && - (order_is_a_sale || order_is_a_custom_sale) && - allow_delivery + if( + flt(doc.per_delivered, 6) < 100 + && (order_is_a_sale || order_is_a_custom_sale) + && allow_delivery ) { if (frappe.model.can_create("Delivery Note")) { this.frm.add_custom_button( __("Delivery Note"), - () => this.make_delivery_note_based_on_delivery_date(true), + () => this.make_delivery_note_based_on_delivery_date(), __("Create") ); } - if (frappe.model.can_create("Work Order")) { this.frm.add_custom_button( __("Work Order"), @@ -403,7 +272,7 @@ erpnext.selling.SalesOrderController = class SalesOrderController extends erpnex } // sales invoice - if (flt(doc.per_billed, 2) < 100 && frappe.model.can_create("Sales Invoice")) { + if(flt(doc.per_billed, 6) < 100 && frappe.model.can_create("Sales Invoice")) { this.frm.add_custom_button( __("Sales Invoice"), () => me.make_sales_invoice(), @@ -413,54 +282,66 @@ erpnext.selling.SalesOrderController = class SalesOrderController extends erpnex // material request if ( - (!doc.order_type || - ((order_is_a_sale || order_is_a_custom_sale) && - flt(doc.per_delivered, 2) < 100)) && - frappe.model.can_create("Material Request") + ( + !doc.order_type + || (order_is_a_sale || order_is_a_custom_sale) + && flt(doc.per_delivered, 6) < 100 + ) + && frappe.model.can_create("Material Request") ) { this.frm.add_custom_button( - __("Material Request"), + __('Material Request'), () => this.make_material_request(), - __("Create") + __('Create') ); this.frm.add_custom_button( - __("Request for Raw Materials"), + __('Request for Raw Materials'), () => this.make_raw_material_request(), - __("Create") + __('Create') ); } // Make Purchase Order if (!this.frm.doc.is_internal_customer && frappe.model.can_create("Purchase Order")) { this.frm.add_custom_button( - __("Purchase Order"), + __('Purchase Order'), () => this.make_purchase_order(), - __("Create") + __('Create') ); } // maintenance - 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, 2) < 100 && (order_is_maintenance || order_is_a_custom_sale)) { + if(frappe.model.can_create("Maintenance Visit")) { this.frm.add_custom_button( - __("Maintenance Visit"), + __('Maintenance Visit'), () => this.make_maintenance_visit(), - __("Create") + __('Create') ); } - if (frappe.model.can_create("Maintenance Schedule")) { + + if(frappe.model.can_create("Maintenance Schedule")) { this.frm.add_custom_button( - __("Maintenance Schedule"), + __('Maintenance Schedule'), () => this.make_maintenance_schedule(), - __("Create") + __('Create') ); } } // project - if (flt(doc.per_delivered, 2) < 100 && frappe.model.can_create("Project")) { - this.frm.add_custom_button(__("Project"), () => this.make_project(), __("Create")); ->>>>>>> c29d955371 (fix(Sales Order): only show permitted actions) + if(flt(doc.per_delivered, 2) < 100 && frappe.model.can_create("Project")) { + this.frm.add_custom_button(__('Project'), () => this.make_project(), __('Create')); + } + + if(!doc.auto_repeat && frappe.model.can_create("Auto Repeat")) { + this.frm.add_custom_button( + __('Subscription'), + function() { + erpnext.utils.make_subscription(doc.doctype, doc.name) + }, + __('Create') + ); } if ( @@ -481,15 +362,7 @@ erpnext.selling.SalesOrderController = class SalesOrderController extends erpnex } } // payment request -<<<<<<< HEAD if(flt(doc.per_billed, precision('per_billed', doc)) < 100 + frappe.boot.sysdefaults.over_billing_allowance) { - this.frm.add_custom_button(__('Payment Request'), () => this.make_payment_request(), __('Create')); - this.frm.add_custom_button(__('Payment'), () => this.make_payment_entry(), __('Create')); -======= - if ( - flt(doc.per_billed, precision("per_billed", doc)) < - 100 + frappe.boot.sysdefaults.over_billing_allowance - ) { if (frappe.model.can_create("Payment Request")) { this.frm.add_custom_button( __("Payment Request"), @@ -497,7 +370,6 @@ erpnext.selling.SalesOrderController = class SalesOrderController extends erpnex __("Create") ); } - if (frappe.model.can_create("Payment Entry")) { this.frm.add_custom_button( __("Payment"), @@ -505,22 +377,14 @@ erpnext.selling.SalesOrderController = class SalesOrderController extends erpnex __("Create") ); } ->>>>>>> c29d955371 (fix(Sales Order): only show permitted actions) } this.frm.page.set_inner_btn_group_as_primary(__('Create')); } } -<<<<<<< HEAD - if (this.frm.doc.docstatus===0) { + if (this.frm.doc.docstatus===0 && frappe.model.can_read("Quotation")) { this.frm.add_custom_button(__('Quotation'), function() { -======= - if (this.frm.doc.docstatus === 0 && frappe.model.can_read("Quotation")) { - this.frm.add_custom_button( - __("Quotation"), - function () { ->>>>>>> c29d955371 (fix(Sales Order): only show permitted actions) let d = erpnext.utils.map_current_doc({ method: "erpnext.selling.doctype.quotation.quotation.make_sales_order", source_doctype: "Quotation", diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.js b/erpnext/stock/doctype/delivery_note/delivery_note.js index 12379670190..22f9728cce0 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note.js +++ b/erpnext/stock/doctype/delivery_note/delivery_note.js @@ -85,9 +85,8 @@ frappe.ui.form.on("Delivery Note", { erpnext.stock.delivery_note.set_print_hide(frm.doc); }, -<<<<<<< HEAD refresh: function(frm) { - if (frm.doc.docstatus === 1 && frm.doc.is_return === 1 && frm.doc.per_billed !== 100) { + if (frm.doc.docstatus === 1 && frm.doc.is_return === 1 && frm.doc.per_billed !== 100 && frappe.model.can_create("Sales Invoice")) { frm.add_custom_button(__('Credit Note'), function() { frappe.model.open_mapped_doc({ method: "erpnext.stock.doctype.delivery_note.delivery_note.make_sales_invoice", @@ -95,26 +94,6 @@ frappe.ui.form.on("Delivery Note", { }) }, __('Create')); frm.page.set_inner_btn_group_as_primary(__('Create')); -======= - refresh: function (frm) { - if ( - frm.doc.docstatus === 1 && - frm.doc.is_return === 1 && - frm.doc.per_billed !== 100 && - frappe.model.can_create("Sales Invoice") - ) { - frm.add_custom_button( - __("Credit Note"), - function () { - frappe.model.open_mapped_doc({ - method: "erpnext.stock.doctype.delivery_note.delivery_note.make_sales_invoice", - frm: cur_frm, - }); - }, - __("Create") - ); - frm.page.set_inner_btn_group_as_primary(__("Create")); ->>>>>>> 418bdc1dcc (fix(Delivery Note): only show permitted actions) } if ( @@ -160,87 +139,24 @@ erpnext.stock.DeliveryNoteController = class DeliveryNoteController extends erpn refresh(doc, dt, dn) { var me = this; super.refresh(); -<<<<<<< HEAD - if ((!doc.is_return) && (doc.status!="Closed" || this.frm.is_new())) { - if (this.frm.doc.docstatus===0) { - this.frm.add_custom_button(__('Sales Order'), - function() { - if (!me.frm.doc.customer) { - frappe.throw({ - title: __("Mandatory"), - message: __("Please Select a Customer") - }); - } - erpnext.utils.map_current_doc({ - method: "erpnext.selling.doctype.sales_order.sales_order.make_delivery_note", - source_doctype: "Sales Order", - target: me.frm, - setters: { - customer: me.frm.doc.customer, - }, - get_query_filters: { - docstatus: 1, - status: ["not in", ["Closed", "On Hold"]], - per_delivered: ["<", 99.99], - company: me.frm.doc.company, - project: me.frm.doc.project || undefined, - } - }) - }, __("Get Items From")); - } - } - - if (!doc.is_return && doc.status!="Closed") { - if(doc.docstatus == 1) { - this.frm.add_custom_button(__('Shipment'), function() { - me.make_shipment() }, __('Create')); - } - - if(flt(doc.per_installed, 2) < 100 && doc.docstatus==1) - this.frm.add_custom_button(__('Installation Note'), function() { - me.make_installation_note() }, __('Create')); - - if (doc.docstatus==1) { - this.frm.add_custom_button(__('Sales Return'), function() { - me.make_sales_return() }, __('Create')); - } - - if (doc.docstatus==1) { - this.frm.add_custom_button(__('Delivery Trip'), function() { - me.make_delivery_trip() }, __('Create')); - } - - if(doc.docstatus==0 && !doc.__islocal) { - if (doc.__onload && doc.__onload.has_unpacked_items) { - this.frm.add_custom_button(__('Packing Slip'), function() { - frappe.model.open_mapped_doc({ - method: "erpnext.stock.doctype.delivery_note.delivery_note.make_packing_slip", - frm: me.frm - }) }, __('Create') - ); - } -======= if ( - !doc.is_return && - (doc.status != "Closed" || this.frm.is_new()) && - this.frm.has_perm("write") && - frappe.model.can_read("Sales Order") && - this.frm.doc.docstatus === 0 + !doc.is_return + && (doc.status!="Closed" || this.frm.is_new()) + && this.frm.has_perm("write") + && frappe.model.can_read("Sales Order") + && this.frm.doc.docstatus===0 ) { this.frm.add_custom_button( - __("Sales Order"), - function () { + __('Sales Order'), + function() { if (!me.frm.doc.customer) { frappe.throw({ title: __("Mandatory"), - message: __("Please Select a Customer"), + message: __("Please Select a Customer") }); } erpnext.utils.map_current_doc({ method: "erpnext.selling.doctype.sales_order.sales_order.make_delivery_note", - args: { - for_reserved_stock: 1, - }, source_doctype: "Sales Order", target: me.frm, setters: { @@ -252,76 +168,59 @@ erpnext.stock.DeliveryNoteController = class DeliveryNoteController extends erpn per_delivered: ["<", 99.99], company: me.frm.doc.company, project: me.frm.doc.project || undefined, - }, - }); + } + }) }, __("Get Items From") ); } - if (!doc.is_return && doc.status != "Closed" && frappe.model.can_create("Shipment")) { - if (doc.docstatus == 1) { - this.frm.add_custom_button( - __("Shipment"), - function () { - me.make_shipment(); - }, - __("Create") - ); + if (!doc.is_return && doc.status!="Closed") { + if (doc.docstatus == 1 && frappe.model.can_create("Shipment")) { + this.frm.add_custom_button(__('Shipment'), function() { + me.make_shipment() }, __('Create')); } if ( - flt(doc.per_installed, 2) < 100 && - doc.docstatus == 1 && - frappe.model.can_create("Installation Note") + flt(doc.per_installed, 2) < 100 + && doc.docstatus==1 + && frappe.model.can_create("Installation Note") ) { this.frm.add_custom_button( - __("Installation Note"), - function () { - me.make_installation_note(); + __('Installation Note'), + function() { + me.make_installation_note() }, - __("Create") + __('Create') ); } - if (doc.docstatus == 1 && this.frm.has_perm("create")) { - this.frm.add_custom_button( - __("Sales Return"), - function () { - me.make_sales_return(); - }, - __("Create") - ); + if (doc.docstatus==1 && this.frm.has_perm("create")) { + this.frm.add_custom_button(__('Sales Return'), function() { + me.make_sales_return() }, __('Create')); } - if (doc.docstatus == 1 && frappe.model.can_create("Delivery Trip")) { - this.frm.add_custom_button( - __("Delivery Trip"), - function () { - me.make_delivery_trip(); - }, - __("Create") - ); + if (doc.docstatus==1 && frappe.model.can_create("Delivery Trip")) { + this.frm.add_custom_button(__('Delivery Trip'), function() { + me.make_delivery_trip() }, __('Create')); } if ( - doc.docstatus == 0 && - !doc.__islocal && - doc.__onload && - doc.__onload.has_unpacked_items && - frappe.model.can_create("Packing Slip") + doc.docstatus==0 + && !doc.__islocal + && frappe.model.can_create("Packing Slip") + && (doc.__onload && doc.__onload.has_unpacked_items) ) { this.frm.add_custom_button( - __("Packing Slip"), - function () { + __('Packing Slip'), + function() { frappe.model.open_mapped_doc({ method: "erpnext.stock.doctype.delivery_note.delivery_note.make_packing_slip", - frm: me.frm, + frm: me.frm }); }, - __("Create") + __('Create') ); ->>>>>>> 418bdc1dcc (fix(Delivery Note): only show permitted actions) } if (!doc.__islocal && doc.docstatus==1) { @@ -340,17 +239,13 @@ erpnext.stock.DeliveryNoteController = class DeliveryNoteController extends erpn } } -<<<<<<< HEAD - if(doc.docstatus==1 && !doc.is_return && doc.status!="Closed" && flt(doc.per_billed) < 100) { -======= - if ( - doc.docstatus == 1 && - !doc.is_return && - doc.status != "Closed" && - flt(doc.per_billed) < 100 && - frappe.model.can_create("Sales Invoice") + if( + doc.docstatus==1 + && !doc.is_return + && doc.status!="Closed" + && flt(doc.per_billed) < 100 + && frappe.model.can_create("Sales Invoice") ) { ->>>>>>> 418bdc1dcc (fix(Delivery Note): only show permitted actions) // show Make Invoice button only if Delivery Note is not created from Sales Invoice var from_sales_invoice = false; from_sales_invoice = me.frm.doc.items.some(function(item) { @@ -369,7 +264,12 @@ erpnext.stock.DeliveryNoteController = class DeliveryNoteController extends erpn } erpnext.stock.delivery_note.set_print_hide(doc, dt, dn); - if(doc.docstatus==1 && !doc.is_return && !doc.auto_repeat) { + if( + doc.docstatus==1 + && !doc.is_return + && !doc.auto_repeat + && frappe.model.can_create("Auto Repeat") + ) { cur_frm.add_custom_button(__('Subscription'), function() { erpnext.utils.make_subscription(doc.doctype, doc.name) }, __('Create')) From 22216b275c810ba79bfca6fe5d4f68a58384bf11 Mon Sep 17 00:00:00 2001 From: barredterra <14891507+barredterra@users.noreply.github.com> Date: Thu, 20 Jun 2024 14:21:30 +0200 Subject: [PATCH 4/4] refactor: remove use of can_create for Payment Request (#41647) (cherry picked from commit 47bc5691a1579b88e0a430f6fbe5ff6309486ccf) --- erpnext/selling/doctype/sales_order/sales_order.js | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/erpnext/selling/doctype/sales_order/sales_order.js b/erpnext/selling/doctype/sales_order/sales_order.js index 26113554a19..1a6658f5418 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.js +++ b/erpnext/selling/doctype/sales_order/sales_order.js @@ -363,13 +363,12 @@ erpnext.selling.SalesOrderController = class SalesOrderController extends erpnex } // payment request if(flt(doc.per_billed, precision('per_billed', doc)) < 100 + frappe.boot.sysdefaults.over_billing_allowance) { - if (frappe.model.can_create("Payment Request")) { - this.frm.add_custom_button( - __("Payment Request"), - () => this.make_payment_request(), - __("Create") - ); - } + this.frm.add_custom_button( + __("Payment Request"), + () => this.make_payment_request(), + __("Create") + ); + if (frappe.model.can_create("Payment Entry")) { this.frm.add_custom_button( __("Payment"),