From 16fe53b8c765aee9e4942bd73d3bd6ccb8b2e05b Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Tue, 18 Mar 2025 21:20:40 +0530 Subject: [PATCH 1/2] fix: not able to make PR against stand alone Debit Note (cherry picked from commit 6a52c30591b8202a73ff87672a54fe9ea21c6ff5) # Conflicts: # erpnext/public/js/controllers/buying.js --- erpnext/public/js/controllers/buying.js | 426 ++++++++++++++++++++++++ 1 file changed, 426 insertions(+) diff --git a/erpnext/public/js/controllers/buying.js b/erpnext/public/js/controllers/buying.js index aa7dfbd90d6..e732d2843bc 100644 --- a/erpnext/public/js/controllers/buying.js +++ b/erpnext/public/js/controllers/buying.js @@ -9,9 +9,435 @@ cur_frm.cscript.tax_table = "Purchase Taxes and Charges"; cur_frm.email_field = "contact_email"; +<<<<<<< HEAD erpnext.buying.BuyingController = class BuyingController extends erpnext.TransactionController { setup() { super.setup(); +======= + this.frm.set_query("project", function (doc) { + return { + filters: { + company: doc.company, + }, + }; + }); + + if (this.frm.doc.__islocal + && frappe.meta.has_field(this.frm.doc.doctype, "disable_rounded_total")) { + + var df = frappe.meta.get_docfield(this.frm.doc.doctype, "disable_rounded_total"); + var disable = cint(df.default) || cint(frappe.sys_defaults.disable_rounded_total); + this.frm.set_value("disable_rounded_total", disable); + } + + + // no idea where me is coming from + if(this.frm.get_field('shipping_address')) { + this.frm.set_query("shipping_address", () => { + if(this.frm.doc.customer) { + return { + query: 'frappe.contacts.doctype.address.address.address_query', + filters: { link_doctype: 'Customer', link_name: this.frm.doc.customer } + }; + } else + return erpnext.queries.company_address_query(this.frm.doc) + }); + } + } + + setup_queries(doc, cdt, cdn) { + var me = this; + + if(this.frm.fields_dict.buying_price_list) { + this.frm.set_query("buying_price_list", function() { + return{ + filters: { 'buying': 1 } + } + }); + } + + if(this.frm.fields_dict.tc_name) { + this.frm.set_query("tc_name", function() { + return{ + filters: { 'buying': 1 } + } + }); + } + + me.frm.set_query('supplier', erpnext.queries.supplier); + me.frm.set_query('contact_person', erpnext.queries.contact_query); + me.frm.set_query('supplier_address', erpnext.queries.address_query); + + me.frm.set_query('billing_address', erpnext.queries.company_address_query); + erpnext.accounts.dimensions.setup_dimension_filters(me.frm, me.frm.doctype); + + this.frm.set_query("item_code", "items", function() { + if (me.frm.doc.is_subcontracted) { + var filters = {'supplier': me.frm.doc.supplier}; + if (me.frm.doc.is_old_subcontracting_flow) { + filters["is_sub_contracted_item"] = 1; + } + else { + filters["is_stock_item"] = 0; + } + + return{ + query: "erpnext.controllers.queries.item_query", + filters: filters + } + } + else { + return{ + query: "erpnext.controllers.queries.item_query", + filters: { 'supplier': me.frm.doc.supplier, 'is_purchase_item': 1, 'has_variants': 0} + } + } + }); + + + this.frm.set_query("manufacturer", "items", function(doc, cdt, cdn) { + const row = locals[cdt][cdn]; + return { + query: "erpnext.controllers.queries.item_manufacturer_query", + filters:{ 'item_code': row.item_code } + } + }); + + if(this.frm.fields_dict["items"].grid.get_field('item_code')) { + this.frm.set_query("item_tax_template", "items", function(doc, cdt, cdn) { + return me.set_query_for_item_tax_template(doc, cdt, cdn) + }); + } + } + + refresh(doc) { + frappe.dynamic_link = {doc: this.frm.doc, fieldname: 'supplier', doctype: 'Supplier'}; + + this.frm.toggle_display("supplier_name", + (this.frm.doc.supplier_name && this.frm.doc.supplier_name!==this.frm.doc.supplier)); + + if(this.frm.doc.docstatus==0 && + (this.frm.doctype==="Purchase Order" || this.frm.doctype==="Material Request")) { + this.set_from_product_bundle(); + } + + this.toggle_subcontracting_fields(); + super.refresh(); + } + + toggle_subcontracting_fields() { + if (['Purchase Receipt', 'Purchase Invoice'].includes(this.frm.doc.doctype)) { + this.frm.fields_dict.supplied_items.grid.update_docfield_property('consumed_qty', + 'read_only', this.frm.doc.__onload && this.frm.doc.__onload.backflush_based_on === 'BOM'); + + this.frm.set_df_property('supplied_items', 'cannot_add_rows', 1); + this.frm.set_df_property('supplied_items', 'cannot_delete_rows', 1); + } + } + + supplier() { + var me = this; + erpnext.utils.get_party_details(this.frm, null, null, function(){ + me.apply_price_list(); + }); + } + + company(){ + if(!frappe.meta.has_field(this.frm.doc.doctype, "billing_address")) return; + + frappe.call({ + method: "erpnext.setup.doctype.company.company.get_billing_shipping_address", + args: { + name: this.frm.doc.company, + billing_address:this.frm.doc.billing_address, + shipping_address: this.frm.doc.shipping_address + }, + callback: (r) => { + this.frm.set_value("billing_address", r.message.primary_address || ""); + + if(!frappe.meta.has_field(this.frm.doc.doctype, "shipping_address")) return; + this.frm.set_value("shipping_address", r.message.shipping_address || ""); + }, + }); + } + + supplier_address() { + erpnext.utils.get_address_display(this.frm); + erpnext.utils.set_taxes_from_address(this.frm, "supplier_address", "supplier_address", "supplier_address"); + } + + buying_price_list() { + this.apply_price_list(); + } + + discount_percentage(doc, cdt, cdn) { + var item = frappe.get_doc(cdt, cdn); + item.discount_amount = 0.0; + this.price_list_rate(doc, cdt, cdn); + } + + discount_amount(doc, cdt, cdn) { + var item = frappe.get_doc(cdt, cdn); + item.discount_percentage = 0.0; + this.price_list_rate(doc, cdt, cdn); + } + + qty(doc, cdt, cdn) { + if ((doc.doctype == "Purchase Receipt") || (doc.doctype == "Purchase Invoice" && doc.update_stock)) { + this.calculate_received_qty(doc, cdt, cdn) + } + super.qty(doc, cdt, cdn); + } + + rejected_qty(doc, cdt, cdn) { + this.calculate_received_qty(doc, cdt, cdn) + } + + calculate_received_qty(doc, cdt, cdn){ + var item = frappe.get_doc(cdt, cdn); + frappe.model.round_floats_in(item, ["qty", "rejected_qty"]); + + if(!doc.is_return && this.validate_negative_quantity(cdt, cdn, item, ["qty", "rejected_qty"])){ return } + + let received_qty = flt(item.qty + item.rejected_qty, precision("received_qty", item)); + let received_stock_qty = flt(item.conversion_factor, precision("conversion_factor", item)) * flt(received_qty); + + frappe.model.set_value(cdt, cdn, "received_qty", received_qty); + frappe.model.set_value(cdt, cdn, "received_stock_qty", received_stock_qty); + } + + batch_no(doc, cdt, cdn) { + super.batch_no(doc, cdt, cdn); + } + + validate_negative_quantity(cdt, cdn, item, fieldnames){ + if(!item || !fieldnames) { return } + + var is_negative_qty = false; + for(var i = 0; i{0} is invalid", [row.manufacturer_part_no]), + title: __("Invalid Part Number") + } + frappe.throw(msg); + } + } + ); + } + } + + add_serial_batch_bundle(doc, cdt, cdn) { + let item = locals[cdt][cdn]; + let me = this; + let fields = ["has_batch_no", "has_serial_no"]; + + frappe.db.get_value("Item", item.item_code, fields) + .then((r) => { + if (r.message && (r.message.has_batch_no || r.message.has_serial_no)) { + fields.forEach((field) => { + item[field] = r.message[field]; + }); + + item.type_of_transaction = item.qty > 0 ? "Inward" : "Outward"; + item.is_rejected = false; + + new erpnext.SerialBatchPackageSelector( + me.frm, item, (r) => { + if (r) { + let qty = Math.abs(r.total_qty); + if (doc.is_return) { + qty = qty * -1; + } + + let update_values = { + "serial_and_batch_bundle": r.name, + "use_serial_batch_fields": 0, + "qty": qty / flt(item.conversion_factor || 1, precision("conversion_factor", item)) + } + + if (r.warehouse) { + update_values["warehouse"] = r.warehouse; + } + + frappe.model.set_value(item.doctype, item.name, update_values); + } + } + ); + } + }); + } + + add_serial_batch_for_rejected_qty(doc, cdt, cdn) { + let item = locals[cdt][cdn]; + let me = this; + let fields = ["has_batch_no", "has_serial_no"]; + + frappe.db.get_value("Item", item.item_code, fields) + .then((r) => { + if (r.message && (r.message.has_batch_no || r.message.has_serial_no)) { + fields.forEach((field) => { + item[field] = r.message[field]; + }); + + item.type_of_transaction = !doc.is_return > 0 ? "Inward" : "Outward"; + item.is_rejected = true; + + new erpnext.SerialBatchPackageSelector( + me.frm, item, (r) => { + if (r) { + let qty = Math.abs(r.total_qty); + if (doc.is_return) { + qty = qty * -1; + } + + let update_values = { + "rejected_serial_and_batch_bundle": r.name, + "use_serial_batch_fields": 0, + "rejected_qty": qty / flt(item.conversion_factor || 1, precision("conversion_factor", item)) + } + + if (r.warehouse) { + update_values["rejected_warehouse"] = r.warehouse; + } + + frappe.model.set_value(item.doctype, item.name, update_values); + } + } + ); + } + }); + } + }; +>>>>>>> 6a52c30591 (fix: not able to make PR against stand alone Debit Note) } onload(doc, cdt, cdn) { From 64fd5c0ba9cae88cfe05f23006796eac6e79f755 Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Wed, 19 Mar 2025 15:31:05 +0530 Subject: [PATCH 2/2] chore: fix conflicts --- erpnext/public/js/controllers/buying.js | 428 +----------------------- 1 file changed, 1 insertion(+), 427 deletions(-) diff --git a/erpnext/public/js/controllers/buying.js b/erpnext/public/js/controllers/buying.js index e732d2843bc..521149215da 100644 --- a/erpnext/public/js/controllers/buying.js +++ b/erpnext/public/js/controllers/buying.js @@ -9,435 +9,9 @@ cur_frm.cscript.tax_table = "Purchase Taxes and Charges"; cur_frm.email_field = "contact_email"; -<<<<<<< HEAD erpnext.buying.BuyingController = class BuyingController extends erpnext.TransactionController { setup() { super.setup(); -======= - this.frm.set_query("project", function (doc) { - return { - filters: { - company: doc.company, - }, - }; - }); - - if (this.frm.doc.__islocal - && frappe.meta.has_field(this.frm.doc.doctype, "disable_rounded_total")) { - - var df = frappe.meta.get_docfield(this.frm.doc.doctype, "disable_rounded_total"); - var disable = cint(df.default) || cint(frappe.sys_defaults.disable_rounded_total); - this.frm.set_value("disable_rounded_total", disable); - } - - - // no idea where me is coming from - if(this.frm.get_field('shipping_address')) { - this.frm.set_query("shipping_address", () => { - if(this.frm.doc.customer) { - return { - query: 'frappe.contacts.doctype.address.address.address_query', - filters: { link_doctype: 'Customer', link_name: this.frm.doc.customer } - }; - } else - return erpnext.queries.company_address_query(this.frm.doc) - }); - } - } - - setup_queries(doc, cdt, cdn) { - var me = this; - - if(this.frm.fields_dict.buying_price_list) { - this.frm.set_query("buying_price_list", function() { - return{ - filters: { 'buying': 1 } - } - }); - } - - if(this.frm.fields_dict.tc_name) { - this.frm.set_query("tc_name", function() { - return{ - filters: { 'buying': 1 } - } - }); - } - - me.frm.set_query('supplier', erpnext.queries.supplier); - me.frm.set_query('contact_person', erpnext.queries.contact_query); - me.frm.set_query('supplier_address', erpnext.queries.address_query); - - me.frm.set_query('billing_address', erpnext.queries.company_address_query); - erpnext.accounts.dimensions.setup_dimension_filters(me.frm, me.frm.doctype); - - this.frm.set_query("item_code", "items", function() { - if (me.frm.doc.is_subcontracted) { - var filters = {'supplier': me.frm.doc.supplier}; - if (me.frm.doc.is_old_subcontracting_flow) { - filters["is_sub_contracted_item"] = 1; - } - else { - filters["is_stock_item"] = 0; - } - - return{ - query: "erpnext.controllers.queries.item_query", - filters: filters - } - } - else { - return{ - query: "erpnext.controllers.queries.item_query", - filters: { 'supplier': me.frm.doc.supplier, 'is_purchase_item': 1, 'has_variants': 0} - } - } - }); - - - this.frm.set_query("manufacturer", "items", function(doc, cdt, cdn) { - const row = locals[cdt][cdn]; - return { - query: "erpnext.controllers.queries.item_manufacturer_query", - filters:{ 'item_code': row.item_code } - } - }); - - if(this.frm.fields_dict["items"].grid.get_field('item_code')) { - this.frm.set_query("item_tax_template", "items", function(doc, cdt, cdn) { - return me.set_query_for_item_tax_template(doc, cdt, cdn) - }); - } - } - - refresh(doc) { - frappe.dynamic_link = {doc: this.frm.doc, fieldname: 'supplier', doctype: 'Supplier'}; - - this.frm.toggle_display("supplier_name", - (this.frm.doc.supplier_name && this.frm.doc.supplier_name!==this.frm.doc.supplier)); - - if(this.frm.doc.docstatus==0 && - (this.frm.doctype==="Purchase Order" || this.frm.doctype==="Material Request")) { - this.set_from_product_bundle(); - } - - this.toggle_subcontracting_fields(); - super.refresh(); - } - - toggle_subcontracting_fields() { - if (['Purchase Receipt', 'Purchase Invoice'].includes(this.frm.doc.doctype)) { - this.frm.fields_dict.supplied_items.grid.update_docfield_property('consumed_qty', - 'read_only', this.frm.doc.__onload && this.frm.doc.__onload.backflush_based_on === 'BOM'); - - this.frm.set_df_property('supplied_items', 'cannot_add_rows', 1); - this.frm.set_df_property('supplied_items', 'cannot_delete_rows', 1); - } - } - - supplier() { - var me = this; - erpnext.utils.get_party_details(this.frm, null, null, function(){ - me.apply_price_list(); - }); - } - - company(){ - if(!frappe.meta.has_field(this.frm.doc.doctype, "billing_address")) return; - - frappe.call({ - method: "erpnext.setup.doctype.company.company.get_billing_shipping_address", - args: { - name: this.frm.doc.company, - billing_address:this.frm.doc.billing_address, - shipping_address: this.frm.doc.shipping_address - }, - callback: (r) => { - this.frm.set_value("billing_address", r.message.primary_address || ""); - - if(!frappe.meta.has_field(this.frm.doc.doctype, "shipping_address")) return; - this.frm.set_value("shipping_address", r.message.shipping_address || ""); - }, - }); - } - - supplier_address() { - erpnext.utils.get_address_display(this.frm); - erpnext.utils.set_taxes_from_address(this.frm, "supplier_address", "supplier_address", "supplier_address"); - } - - buying_price_list() { - this.apply_price_list(); - } - - discount_percentage(doc, cdt, cdn) { - var item = frappe.get_doc(cdt, cdn); - item.discount_amount = 0.0; - this.price_list_rate(doc, cdt, cdn); - } - - discount_amount(doc, cdt, cdn) { - var item = frappe.get_doc(cdt, cdn); - item.discount_percentage = 0.0; - this.price_list_rate(doc, cdt, cdn); - } - - qty(doc, cdt, cdn) { - if ((doc.doctype == "Purchase Receipt") || (doc.doctype == "Purchase Invoice" && doc.update_stock)) { - this.calculate_received_qty(doc, cdt, cdn) - } - super.qty(doc, cdt, cdn); - } - - rejected_qty(doc, cdt, cdn) { - this.calculate_received_qty(doc, cdt, cdn) - } - - calculate_received_qty(doc, cdt, cdn){ - var item = frappe.get_doc(cdt, cdn); - frappe.model.round_floats_in(item, ["qty", "rejected_qty"]); - - if(!doc.is_return && this.validate_negative_quantity(cdt, cdn, item, ["qty", "rejected_qty"])){ return } - - let received_qty = flt(item.qty + item.rejected_qty, precision("received_qty", item)); - let received_stock_qty = flt(item.conversion_factor, precision("conversion_factor", item)) * flt(received_qty); - - frappe.model.set_value(cdt, cdn, "received_qty", received_qty); - frappe.model.set_value(cdt, cdn, "received_stock_qty", received_stock_qty); - } - - batch_no(doc, cdt, cdn) { - super.batch_no(doc, cdt, cdn); - } - - validate_negative_quantity(cdt, cdn, item, fieldnames){ - if(!item || !fieldnames) { return } - - var is_negative_qty = false; - for(var i = 0; i{0} is invalid", [row.manufacturer_part_no]), - title: __("Invalid Part Number") - } - frappe.throw(msg); - } - } - ); - } - } - - add_serial_batch_bundle(doc, cdt, cdn) { - let item = locals[cdt][cdn]; - let me = this; - let fields = ["has_batch_no", "has_serial_no"]; - - frappe.db.get_value("Item", item.item_code, fields) - .then((r) => { - if (r.message && (r.message.has_batch_no || r.message.has_serial_no)) { - fields.forEach((field) => { - item[field] = r.message[field]; - }); - - item.type_of_transaction = item.qty > 0 ? "Inward" : "Outward"; - item.is_rejected = false; - - new erpnext.SerialBatchPackageSelector( - me.frm, item, (r) => { - if (r) { - let qty = Math.abs(r.total_qty); - if (doc.is_return) { - qty = qty * -1; - } - - let update_values = { - "serial_and_batch_bundle": r.name, - "use_serial_batch_fields": 0, - "qty": qty / flt(item.conversion_factor || 1, precision("conversion_factor", item)) - } - - if (r.warehouse) { - update_values["warehouse"] = r.warehouse; - } - - frappe.model.set_value(item.doctype, item.name, update_values); - } - } - ); - } - }); - } - - add_serial_batch_for_rejected_qty(doc, cdt, cdn) { - let item = locals[cdt][cdn]; - let me = this; - let fields = ["has_batch_no", "has_serial_no"]; - - frappe.db.get_value("Item", item.item_code, fields) - .then((r) => { - if (r.message && (r.message.has_batch_no || r.message.has_serial_no)) { - fields.forEach((field) => { - item[field] = r.message[field]; - }); - - item.type_of_transaction = !doc.is_return > 0 ? "Inward" : "Outward"; - item.is_rejected = true; - - new erpnext.SerialBatchPackageSelector( - me.frm, item, (r) => { - if (r) { - let qty = Math.abs(r.total_qty); - if (doc.is_return) { - qty = qty * -1; - } - - let update_values = { - "rejected_serial_and_batch_bundle": r.name, - "use_serial_batch_fields": 0, - "rejected_qty": qty / flt(item.conversion_factor || 1, precision("conversion_factor", item)) - } - - if (r.warehouse) { - update_values["rejected_warehouse"] = r.warehouse; - } - - frappe.model.set_value(item.doctype, item.name, update_values); - } - } - ); - } - }); - } - }; ->>>>>>> 6a52c30591 (fix: not able to make PR against stand alone Debit Note) } onload(doc, cdt, cdn) { @@ -600,7 +174,7 @@ erpnext.buying.BuyingController = class BuyingController extends erpnext.Transac } qty(doc, cdt, cdn) { - if ((doc.doctype == "Purchase Receipt") || (doc.doctype == "Purchase Invoice" && (doc.update_stock || doc.is_return))) { + if ((doc.doctype == "Purchase Receipt") || (doc.doctype == "Purchase Invoice" && doc.update_stock)) { this.calculate_received_qty(doc, cdt, cdn) } super.qty(doc, cdt, cdn);