diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js index 6ee9e66dd6..3762b4841c 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js @@ -2,8 +2,7 @@ // License: GNU General Public License v3. See license.txt frappe.provide("erpnext.accounts"); -{% include 'erpnext/buying/doctype/purchase_common/purchase_common.js' %}; - +{% include 'erpnext/public/js/controllers/buying.js' %}; erpnext.accounts.PurchaseInvoice = erpnext.buying.BuyingController.extend({ setup: function(doc) { diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.js b/erpnext/buying/doctype/purchase_order/purchase_order.js index 5b16cd6494..85a6329f51 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.js +++ b/erpnext/buying/doctype/purchase_order/purchase_order.js @@ -3,7 +3,7 @@ frappe.provide("erpnext.buying"); -{% include 'erpnext/buying/doctype/purchase_common/purchase_common.js' %}; +{% include 'erpnext/public/js/controllers/buying.js' %}; frappe.ui.form.on("Purchase Order", { setup: function(frm) { diff --git a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js index 59ad092724..92600b774c 100644 --- a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js +++ b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js @@ -2,7 +2,7 @@ // License: GNU General Public License v3. See license.txt -{% include 'erpnext/buying/doctype/purchase_common/purchase_common.js' %}; +{% include 'erpnext/public/js/controllers/buying.js' %}; cur_frm.add_fetch('contact', 'email_id', 'email_id') diff --git a/erpnext/buying/doctype/supplier_quotation/supplier_quotation.js b/erpnext/buying/doctype/supplier_quotation/supplier_quotation.js index 5ed210ca98..1e2379e1a0 100644 --- a/erpnext/buying/doctype/supplier_quotation/supplier_quotation.js +++ b/erpnext/buying/doctype/supplier_quotation/supplier_quotation.js @@ -2,7 +2,7 @@ // License: GNU General Public License v3. See license.txt // attach required files -{% include 'erpnext/buying/doctype/purchase_common/purchase_common.js' %}; +{% include 'erpnext/public/js/controllers/buying.js' %}; frappe.ui.form.on('Suppier Quotation', { setup: function() { diff --git a/erpnext/public/js/controllers/buying.js b/erpnext/public/js/controllers/buying.js new file mode 100644 index 0000000000..108aac1af8 --- /dev/null +++ b/erpnext/public/js/controllers/buying.js @@ -0,0 +1,372 @@ +// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors +// License: GNU General Public License v3. See license.txt + +frappe.provide("erpnext.buying"); + +cur_frm.cscript.tax_table = "Purchase Taxes and Charges"; + +{% include 'erpnext/accounts/doctype/purchase_taxes_and_charges_template/purchase_taxes_and_charges_template.js' %} + +cur_frm.email_field = "contact_email"; + +erpnext.buying.BuyingController = erpnext.TransactionController.extend({ + setup: function() { + this._super(); + }, + + onload: function() { + this.setup_queries(); + this._super(); + + if(this.frm.get_field('shipping_address')) { + this.frm.set_query("shipping_address", function(){ + if(me.frm.doc.customer){ + return { + query: 'frappe.geo.doctype.address.address.address_query', + filters: { link_doctype: 'Customer', link_name: me.frm.doc.customer } + }; + } else + return erpnext.queries.company_address_query(me.frm.doc) + }); + } + }, + + setup_queries: function() { + var me = this; + + if(this.frm.fields_dict.buying_price_list) { + this.frm.set_query("buying_price_list", 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); + + if(this.frm.fields_dict.supplier) { + this.frm.set_query("supplier", function() { + return{ query: "erpnext.controllers.queries.supplier_query" }}); + } + + this.frm.set_query("item_code", "items", function() { + if(me.frm.doc.is_subcontracted == "Yes") { + return{ + query: "erpnext.controllers.queries.item_query", + filters:{ 'is_sub_contracted_item': 1 } + } + } else { + return{ + query: "erpnext.controllers.queries.item_query", + filters: {'is_purchase_item': 1} + } + } + }); + }, + + refresh: function(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._super(); + }, + + supplier: function() { + var me = this; + erpnext.utils.get_party_details(this.frm, null, null, function(){me.apply_pricing_rule()}); + }, + + supplier_address: function() { + erpnext.utils.get_address_display(this.frm); + }, + + buying_price_list: function() { + this.apply_price_list(); + }, + + price_list_rate: function(doc, cdt, cdn) { + var item = frappe.get_doc(cdt, cdn); + frappe.model.round_floats_in(item, ["price_list_rate", "discount_percentage"]); + + item.rate = flt(item.price_list_rate * (1 - item.discount_percentage / 100.0), + precision("rate", item)); + + this.calculate_taxes_and_totals(); + }, + + discount_percentage: function(doc, cdt, cdn) { + this.price_list_rate(doc, cdt, cdn); + }, + + qty: function(doc, cdt, cdn) { + var item = frappe.get_doc(cdt, cdn); + if ((doc.doctype == "Purchase Receipt") || (doc.doctype == "Purchase Invoice" && (doc.update_stock || doc.is_return))) { + frappe.model.round_floats_in(item, ["qty", "received_qty"]); + + if(!doc.is_return && this.validate_negative_quantity(cdt, cdn, item, ["qty", "received_qty"])){ return } + + if(!item.rejected_qty && item.qty) { + item.received_qty = item.qty; + } + + frappe.model.round_floats_in(item, ["qty", "received_qty"]); + item.rejected_qty = flt(item.received_qty - item.qty, precision("rejected_qty", item)); + } + + this._super(doc, cdt, cdn); + }, + + received_qty: function(doc, cdt, cdn) { + this.calculate_accepted_qty(doc, cdt, cdn) + }, + + rejected_qty: function(doc, cdt, cdn) { + this.calculate_accepted_qty(doc, cdt, cdn) + }, + + calculate_accepted_qty: function(doc, cdt, cdn){ + var item = frappe.get_doc(cdt, cdn); + frappe.model.round_floats_in(item, ["received_qty", "rejected_qty"]); + + if(!doc.is_return && this.validate_negative_quantity(cdt, cdn, item, ["received_qty", "rejected_qty"])){ return } + + item.qty = flt(item.received_qty - item.rejected_qty, precision("qty", item)); + this.qty(doc, cdt, cdn); + }, + + validate_negative_quantity: function(cdt, cdn, item, fieldnames){ + if(!item || !fieldnames) { return } + + var is_negative_qty = false; + for(var i = 0; i 0 && qty > 0 && cur_frm.doc.items[i].item_code == d.item_code && !cur_frm.doc.items[i].material_request_item) + { + cur_frm.doc.items[i].material_request = d.mr_name; + cur_frm.doc.items[i].material_request_item = d.mr_item; + my_qty = Math.min(qty, d.qty); + qty = qty - my_qty; + d.qty = d.qty - my_qty; + cur_frm.doc.items[i].stock_qty = my_qty*cur_frm.doc.items[i].conversion_factor; + cur_frm.doc.items[i].qty = my_qty; + + frappe.msgprint("Assigning " + d.mr_name + " to " + d.item_code + " (row " + cur_frm.doc.items[i].idx + ")"); + if (qty > 0) + { + frappe.msgprint("Splitting " + qty + " units of " + d.item_code); + var newrow = frappe.model.add_child(cur_frm.doc, cur_frm.doc.items[i].doctype, "items"); + item_length++; + + for (key in cur_frm.doc.items[i]) + { + newrow[key] = cur_frm.doc.items[i][key]; + } + + newrow.idx = item_length; + newrow["stock_qty"] = newrow.conversion_factor*qty; + newrow["qty"] = qty; + + newrow["material_request"] = ""; + newrow["material_request_item"] = ""; + + } + + + + } + + }); + i++; + } + refresh_field("items"); + //cur_frm.save(); + } + }); + } +}); + +cur_frm.add_fetch('project', 'cost_center', 'cost_center'); + +erpnext.buying.get_default_bom = function(frm) { + $.each(frm.doc["items"] || [], function(i, d) { + if (d.item_code && d.bom === "") { + return frappe.call({ + type: "GET", + method: "erpnext.stock.get_item_details.get_default_bom", + args: { + "item_code": d.item_code, + }, + callback: function(r) { + if(r) { + frappe.model.set_value(d.doctype, d.name, "bom", r.message); + } + } + }) + } + }); +} + +erpnext.buying.get_items_from_product_bundle = function(frm) { + var dialog = new frappe.ui.Dialog({ + title: __("Get Items from Product Bundle"), + fields: [ + { + "fieldtype": "Link", + "label": __("Product Bundle"), + "fieldname": "product_bundle", + "options":"Product Bundle", + "reqd": 1 + }, + { + "fieldtype": "Currency", + "label": __("Quantity"), + "fieldname": "quantity", + "reqd": 1, + "default": 1 + }, + { + "fieldtype": "Button", + "label": __("Get Items"), + "fieldname": "get_items", + "cssClass": "btn-primary" + } + ] + }); + + dialog.fields_dict.get_items.$input.click(function() { + args = dialog.get_values(); + if(!args) return; + dialog.hide(); + return frappe.call({ + type: "GET", + method: "erpnext.stock.doctype.packed_item.packed_item.get_items_from_product_bundle", + args: { + args: { + item_code: args.product_bundle, + quantity: args.quantity, + parenttype: frm.doc.doctype, + parent: frm.doc.name, + supplier: frm.doc.supplier, + currency: frm.doc.currency, + conversion_rate: frm.doc.conversion_rate, + price_list: frm.doc.buying_price_list, + price_list_currency: frm.doc.price_list_currency, + plc_conversion_rate: frm.doc.plc_conversion_rate, + company: frm.doc.company, + is_subcontracted: frm.doc.is_subcontracted, + transaction_date: frm.doc.transaction_date || frm.doc.posting_date, + ignore_pricing_rule: frm.doc.ignore_pricing_rule + } + }, + freeze: true, + callback: function(r) { + if(!r.exc && r.message) { + for ( var i=0; i< r.message.length; i++ ) { + var d = frm.add_child("items"); + var item = r.message[i]; + for ( var key in item) { + if ( !is_null(item[key]) ) { + d[key] = item[key]; + } + } + if(frappe.meta.get_docfield(d.doctype, "price_list_rate", d.name)) { + frm.script_manager.trigger("price_list_rate", d.doctype, d.name); + } + } + frm.refresh_field("items"); + } + } + }) + }); + dialog.show(); +} diff --git a/erpnext/stock/doctype/material_request/material_request.js b/erpnext/stock/doctype/material_request/material_request.js index 3a5a35131d..be0b4c2536 100644 --- a/erpnext/stock/doctype/material_request/material_request.js +++ b/erpnext/stock/doctype/material_request/material_request.js @@ -1,7 +1,7 @@ // Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors // License: GNU General Public License v3. See license.txt -{% include 'erpnext/buying/doctype/purchase_common/purchase_common.js' %}; +{% include 'erpnext/public/js/controllers/buying.js' %}; frappe.ui.form.on('Material Request', { setup: function(frm) { diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js index f9370b4367..383de01e70 100644 --- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js +++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js @@ -1,7 +1,7 @@ // Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors // License: GNU General Public License v3. See license.txt -{% include 'erpnext/buying/doctype/purchase_common/purchase_common.js' %}; +{% include 'erpnext/public/js/controllers/buying.js' %}; frappe.provide("erpnext.stock");