mirror of
https://github.com/frappe/erpnext.git
synced 2026-04-01 03:12:39 +02:00
fix: link correct row item of purchase doc
(cherry picked from commit da1b4cb9ab)
This commit is contained in:
@@ -609,9 +609,7 @@ frappe.ui.form.on("Asset", {
|
|||||||
frm.trigger("toggle_reference_doc");
|
frm.trigger("toggle_reference_doc");
|
||||||
if (frm.doc.purchase_receipt) {
|
if (frm.doc.purchase_receipt) {
|
||||||
if (frm.doc.item_code) {
|
if (frm.doc.item_code) {
|
||||||
frappe.db.get_doc("Purchase Receipt", frm.doc.purchase_receipt).then((pr_doc) => {
|
frm.events.set_values_from_purchase_doc(frm, "Purchase Receipt");
|
||||||
frm.events.set_values_from_purchase_doc(frm, "Purchase Receipt", pr_doc);
|
|
||||||
});
|
|
||||||
} else {
|
} else {
|
||||||
frm.set_value("purchase_receipt", "");
|
frm.set_value("purchase_receipt", "");
|
||||||
frappe.msgprint({
|
frappe.msgprint({
|
||||||
@@ -626,9 +624,7 @@ frappe.ui.form.on("Asset", {
|
|||||||
frm.trigger("toggle_reference_doc");
|
frm.trigger("toggle_reference_doc");
|
||||||
if (frm.doc.purchase_invoice) {
|
if (frm.doc.purchase_invoice) {
|
||||||
if (frm.doc.item_code) {
|
if (frm.doc.item_code) {
|
||||||
frappe.db.get_doc("Purchase Invoice", frm.doc.purchase_invoice).then((pi_doc) => {
|
frm.events.set_values_from_purchase_doc(frm, "Purchase Invoice");
|
||||||
frm.events.set_values_from_purchase_doc(frm, "Purchase Invoice", pi_doc);
|
|
||||||
});
|
|
||||||
} else {
|
} else {
|
||||||
frm.set_value("purchase_invoice", "");
|
frm.set_value("purchase_invoice", "");
|
||||||
frappe.msgprint({
|
frappe.msgprint({
|
||||||
@@ -639,45 +635,36 @@ frappe.ui.form.on("Asset", {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
set_values_from_purchase_doc: function (frm, doctype, purchase_doc) {
|
set_values_from_purchase_doc: (frm, doctype) => {
|
||||||
frm.set_value("company", purchase_doc.company);
|
frappe.call({
|
||||||
if (purchase_doc.bill_date) {
|
method: "erpnext.assets.doctype.asset.asset.get_values_from_purchase_doc",
|
||||||
frm.set_value("purchase_date", purchase_doc.bill_date);
|
args: {
|
||||||
} else {
|
purchase_doc_name: frm.doc.purchase_receipt || frm.doc.purchase_invoice,
|
||||||
frm.set_value("purchase_date", purchase_doc.posting_date);
|
item_code: frm.doc.item_code,
|
||||||
}
|
doctype: doctype,
|
||||||
if (!frm.doc.is_existing_asset && !frm.doc.available_for_use_date) {
|
},
|
||||||
frm.set_value("available_for_use_date", frm.doc.purchase_date);
|
callback: (r) => {
|
||||||
}
|
if (r.message) {
|
||||||
const item = purchase_doc.items.find((item) => item.item_code === frm.doc.item_code);
|
let data = r.message;
|
||||||
if (!item) {
|
frm.set_value("company", data.company);
|
||||||
let doctype_field = frappe.scrub(doctype);
|
frm.set_value("purchase_date", data.purchase_date);
|
||||||
frm.set_value(doctype_field, "");
|
frm.set_value("gross_purchase_amount", data.gross_purchase_amount);
|
||||||
frappe.msgprint({
|
frm.set_value("purchase_amount", data.gross_purchase_amount);
|
||||||
title: __("Invalid {0}", [__(doctype)]),
|
frm.set_value("asset_quantity", data.asset_quantity);
|
||||||
message: __("The selected {0} does not contain the selected Asset Item.", [__(doctype)]),
|
frm.set_value("cost_center", data.cost_center);
|
||||||
indicator: "red",
|
frm.set_value("location", data.asset_location);
|
||||||
});
|
|
||||||
}
|
|
||||||
frappe.db.get_value("Item", item.item_code, "is_grouped_asset", (r) => {
|
|
||||||
var asset_quantity = r.is_grouped_asset ? item.qty : 1;
|
|
||||||
var purchase_amount = flt(
|
|
||||||
item.valuation_rate * asset_quantity,
|
|
||||||
precision("gross_purchase_amount")
|
|
||||||
);
|
|
||||||
|
|
||||||
frm.set_value("gross_purchase_amount", purchase_amount);
|
|
||||||
frm.set_value("purchase_amount", purchase_amount);
|
|
||||||
frm.set_value("asset_quantity", asset_quantity);
|
|
||||||
frm.set_value("cost_center", item.cost_center || purchase_doc.cost_center);
|
|
||||||
if (item.asset_location) {
|
|
||||||
frm.set_value("location", item.asset_location);
|
|
||||||
}
|
|
||||||
if (doctype === "Purchase Receipt") {
|
if (doctype === "Purchase Receipt") {
|
||||||
frm.set_value("purchase_receipt_item", item.name);
|
frm.set_value("purchase_receipt_item", data.purchase_receipt_item);
|
||||||
} else if (doctype === "Purchase Invoice") {
|
} else {
|
||||||
frm.set_value("purchase_invoice_item", item.name);
|
frm.set_value("purchase_invoice_item", data.purchase_invoice_item);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let is_editable = !data.is_multiple_items; // if multiple items, then fields should not be read-only
|
||||||
|
frm.set_df_property("gross_purchase_amount", "read_only", is_editable);
|
||||||
|
frm.set_df_property("asset_quantity", "read_only", !is_editable);
|
||||||
|
}
|
||||||
|
},
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
@@ -227,8 +227,7 @@
|
|||||||
"fieldtype": "Currency",
|
"fieldtype": "Currency",
|
||||||
"label": "Gross Purchase Amount",
|
"label": "Gross Purchase Amount",
|
||||||
"mandatory_depends_on": "eval:(!doc.is_composite_asset || doc.docstatus==1)",
|
"mandatory_depends_on": "eval:(!doc.is_composite_asset || doc.docstatus==1)",
|
||||||
"options": "Company:company:default_currency",
|
"options": "Company:company:default_currency"
|
||||||
"read_only_depends_on": "eval:!doc.is_existing_asset"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"fieldname": "available_for_use_date",
|
"fieldname": "available_for_use_date",
|
||||||
@@ -470,8 +469,7 @@
|
|||||||
"default": "1",
|
"default": "1",
|
||||||
"fieldname": "asset_quantity",
|
"fieldname": "asset_quantity",
|
||||||
"fieldtype": "Int",
|
"fieldtype": "Int",
|
||||||
"label": "Asset Quantity",
|
"label": "Asset Quantity"
|
||||||
"read_only_depends_on": "eval:!doc.is_existing_asset && !doc.is_composite_asset"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"fieldname": "depr_entry_posting_status",
|
"fieldname": "depr_entry_posting_status",
|
||||||
|
|||||||
@@ -121,6 +121,7 @@ class Asset(AccountsController):
|
|||||||
|
|
||||||
def validate(self):
|
def validate(self):
|
||||||
self.validate_precision()
|
self.validate_precision()
|
||||||
|
self.set_purchase_doc_row_item()
|
||||||
self.validate_asset_values()
|
self.validate_asset_values()
|
||||||
self.validate_asset_and_reference()
|
self.validate_asset_and_reference()
|
||||||
self.validate_item()
|
self.validate_item()
|
||||||
@@ -199,6 +200,35 @@ class Asset(AccountsController):
|
|||||||
def after_delete(self):
|
def after_delete(self):
|
||||||
add_asset_activity(self.name, _("Asset deleted"))
|
add_asset_activity(self.name, _("Asset deleted"))
|
||||||
|
|
||||||
|
def set_purchase_doc_row_item(self):
|
||||||
|
if self.is_existing_asset or self.is_composite_asset:
|
||||||
|
return
|
||||||
|
|
||||||
|
self.purchase_amount = self.gross_purchase_amount
|
||||||
|
purchase_type = "Purchase Receipt" if self.purchase_receipt else "Purchase Invoice"
|
||||||
|
purchase_doc = self.purchase_receipt or self.purchase_invoice
|
||||||
|
|
||||||
|
if not purchase_doc:
|
||||||
|
return
|
||||||
|
|
||||||
|
purchase_doc = frappe.get_doc(purchase_type, purchase_doc)
|
||||||
|
|
||||||
|
for item in purchase_doc.items:
|
||||||
|
if self.asset_quantity > 1:
|
||||||
|
if item.base_net_amount == self.gross_purchase_amount and item.qty == self.asset_quantity:
|
||||||
|
self.purchase_receipt_item = item.name if purchase_type == "Purchase Receipt" else None
|
||||||
|
self.purchase_invoice_item = item.name if purchase_type == "Purchase Invoice" else None
|
||||||
|
return
|
||||||
|
elif item.qty == self.asset_quantity:
|
||||||
|
self.purchase_receipt_item = item.name if purchase_type == "Purchase Receipt" else None
|
||||||
|
self.purchase_invoice_item = item.name if purchase_type == "Purchase Invoice" else None
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
if item.base_net_rate == self.gross_purchase_amount:
|
||||||
|
self.purchase_receipt_item = item.name if purchase_type == "Purchase Receipt" else None
|
||||||
|
self.purchase_invoice_item = item.name if purchase_type == "Purchase Invoice" else None
|
||||||
|
return
|
||||||
|
|
||||||
def validate_asset_and_reference(self):
|
def validate_asset_and_reference(self):
|
||||||
if self.purchase_invoice or self.purchase_receipt:
|
if self.purchase_invoice or self.purchase_receipt:
|
||||||
reference_doc = "Purchase Invoice" if self.purchase_invoice else "Purchase Receipt"
|
reference_doc = "Purchase Invoice" if self.purchase_invoice else "Purchase Receipt"
|
||||||
@@ -1125,6 +1155,30 @@ def has_active_capitalization(asset):
|
|||||||
return active_capitalizations > 0
|
return active_capitalizations > 0
|
||||||
|
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
|
def get_values_from_purchase_doc(purchase_doc_name, item_code, doctype):
|
||||||
|
purchase_doc = frappe.get_doc(doctype, purchase_doc_name)
|
||||||
|
matching_items = [item for item in purchase_doc.items if item.item_code == item_code]
|
||||||
|
|
||||||
|
if not matching_items:
|
||||||
|
frappe.throw(_(f"Selected {doctype} does not contain the Item Code {item_code}"))
|
||||||
|
|
||||||
|
first_item = matching_items[0]
|
||||||
|
is_multiple_items = len(matching_items) > 1
|
||||||
|
|
||||||
|
return {
|
||||||
|
"company": purchase_doc.company,
|
||||||
|
"purchase_date": purchase_doc.get("bill_date") or purchase_doc.get("posting_date"),
|
||||||
|
"gross_purchase_amount": flt(first_item.base_net_amount),
|
||||||
|
"asset_quantity": first_item.qty,
|
||||||
|
"cost_center": first_item.cost_center or purchase_doc.get("cost_center"),
|
||||||
|
"asset_location": first_item.get("asset_location"),
|
||||||
|
"is_multiple_items": is_multiple_items,
|
||||||
|
"purchase_receipt_item": first_item.name if doctype == "Purchase Receipt" else None,
|
||||||
|
"purchase_invoice_item": first_item.name if doctype == "Purchase Invoice" else None,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def split_asset(asset_name, split_qty):
|
def split_asset(asset_name, split_qty):
|
||||||
asset = frappe.get_doc("Asset", asset_name)
|
asset = frappe.get_doc("Asset", asset_name)
|
||||||
|
|||||||
Reference in New Issue
Block a user