[feature] Blanket Order

- Creaete Sales or Purchase order from the blanket order
- If there is any blanket order for the customer/supplier rates will be fetched from that order
- Manually selecting the Blanket order will change the rates accordingly
- Upon submission of the order, the ordered qty will be updated in the Blanket Order
This commit is contained in:
Manas Solanki
2018-05-28 20:07:08 +05:30
committed by Nabin Hait
parent 2fb63e1724
commit e5e87f7137
12 changed files with 243 additions and 71 deletions

View File

@@ -108,8 +108,11 @@ erpnext.buying.BuyingController = erpnext.TransactionController.extend({
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));
let item_rate = item.price_list_rate;
if (doc.doctype == "Purchase Order" && item.blanket_order_rate) {
item_rate = item.blanket_order_rate;
}
item.rate = flt(item_rate * (1 - item.discount_percentage / 100.0), precision("rate", item));
this.calculate_taxes_and_totals();
},

View File

@@ -4,12 +4,15 @@
erpnext.taxes_and_totals = erpnext.payments.extend({
setup: function() {},
apply_pricing_rule_on_item: function(item){
let effective_item_rate = item.price_list_rate;
if (item.parenttype === "Sales Order" && item.blanket_order_rate) {
effective_item_rate = item.blanket_order_rate;
}
if(item.margin_type == "Percentage"){
item.rate_with_margin = flt(item.price_list_rate)
+ flt(item.price_list_rate) * ( flt(item.margin_rate_or_amount) / 100);
item.rate_with_margin = flt(effective_item_rate)
+ flt(effective_item_rate) * ( flt(item.margin_rate_or_amount) / 100);
} else {
item.rate_with_margin = flt(item.price_list_rate) + flt(item.margin_rate_or_amount);
item.rate_with_margin = flt(effective_item_rate) + flt(item.margin_rate_or_amount);
item.base_rate_with_margin = flt(item.rate_with_margin) * flt(this.frm.doc.conversion_rate);
}

View File

@@ -1323,6 +1323,36 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({
}
})
}
},
blanket_order: function(doc, cdt, cdn) {
var me = this;
var item = locals[cdt][cdn];
if (item.blanket_order && (item.parenttype=="Sales Order" || item.parenttype=="Purchase Order")) {
frappe.call({
method: "erpnext.stock.get_item_details.get_blanket_order_details",
args: {
args:{
item_code: item.item_code,
customer: doc.customer,
supplier: doc.supplier,
company: doc.company,
transaction_date: doc.transaction_date,
blanket_order: item.blanket_order
}
},
callback: function(r) {
if (!r.message) {
frappe.throw(__("Invalid Blanket Order for the selected Customer and Item"))
} else {
frappe.run_serially([
() => frappe.model.set_value(cdt, cdn, "blanket_order_rate", r.message.blanket_order_rate),
() => me.frm.script_manager.trigger("price_list_rate", cdt, cdn)
]);
}
}
})
}
}
});