Merge pull request #35923 from frappe/mergify/bp/develop/pr-35918

fix: asset movement (backport #35918)
This commit is contained in:
Anand Baburajan 2023-06-28 20:59:50 +05:30 committed by GitHub
commit 50cbdc778f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 38 additions and 27 deletions

View File

@ -70,19 +70,21 @@ frappe.ui.form.on('Asset Movement', {
else if (frm.doc.purpose === 'Issue') { else if (frm.doc.purpose === 'Issue') {
fieldnames_to_be_altered = { fieldnames_to_be_altered = {
target_location: { read_only: 1, reqd: 0 }, target_location: { read_only: 1, reqd: 0 },
source_location: { read_only: 1, reqd: 1 }, source_location: { read_only: 1, reqd: 0 },
from_employee: { read_only: 1, reqd: 0 }, from_employee: { read_only: 1, reqd: 0 },
to_employee: { read_only: 0, reqd: 1 } to_employee: { read_only: 0, reqd: 1 }
}; };
} }
Object.keys(fieldnames_to_be_altered).forEach(fieldname => { if (fieldnames_to_be_altered) {
let property_to_be_altered = fieldnames_to_be_altered[fieldname]; Object.keys(fieldnames_to_be_altered).forEach(fieldname => {
Object.keys(property_to_be_altered).forEach(property => { let property_to_be_altered = fieldnames_to_be_altered[fieldname];
let value = property_to_be_altered[property]; Object.keys(property_to_be_altered).forEach(property => {
frm.set_df_property(fieldname, property, value, cdn, 'assets'); let value = property_to_be_altered[property];
frm.fields_dict['assets'].grid.update_docfield_property(fieldname, property, value);
});
}); });
}); frm.refresh_field('assets');
frm.refresh_field('assets'); }
} }
}); });

View File

@ -37,6 +37,7 @@
"reqd": 1 "reqd": 1
}, },
{ {
"default": "Now",
"fieldname": "transaction_date", "fieldname": "transaction_date",
"fieldtype": "Datetime", "fieldtype": "Datetime",
"in_list_view": 1, "in_list_view": 1,
@ -95,10 +96,11 @@
"index_web_pages_for_search": 1, "index_web_pages_for_search": 1,
"is_submittable": 1, "is_submittable": 1,
"links": [], "links": [],
"modified": "2021-01-22 12:30:55.295670", "modified": "2023-06-28 16:54:26.571083",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Assets", "module": "Assets",
"name": "Asset Movement", "name": "Asset Movement",
"naming_rule": "Expression",
"owner": "Administrator", "owner": "Administrator",
"permissions": [ "permissions": [
{ {
@ -148,5 +150,6 @@
} }
], ],
"sort_field": "modified", "sort_field": "modified",
"sort_order": "DESC" "sort_order": "DESC",
"states": []
} }

View File

@ -28,25 +28,20 @@ class AssetMovement(Document):
def validate_location(self): def validate_location(self):
for d in self.assets: for d in self.assets:
if self.purpose in ["Transfer", "Issue"]: if self.purpose in ["Transfer", "Issue"]:
if not d.source_location: current_location = frappe.db.get_value("Asset", d.asset, "location")
d.source_location = frappe.db.get_value("Asset", d.asset, "location")
if not d.source_location:
frappe.throw(_("Source Location is required for the Asset {0}").format(d.asset))
if d.source_location: if d.source_location:
current_location = frappe.db.get_value("Asset", d.asset, "location")
if current_location != d.source_location: if current_location != d.source_location:
frappe.throw( frappe.throw(
_("Asset {0} does not belongs to the location {1}").format(d.asset, d.source_location) _("Asset {0} does not belongs to the location {1}").format(d.asset, d.source_location)
) )
else:
d.source_location = current_location
if self.purpose == "Issue": if self.purpose == "Issue":
if d.target_location: if d.target_location:
frappe.throw( frappe.throw(
_( _(
"Issuing cannot be done to a location. Please enter employee who has issued Asset {0}" "Issuing cannot be done to a location. Please enter employee to issue the Asset {0} to"
).format(d.asset), ).format(d.asset),
title=_("Incorrect Movement Purpose"), title=_("Incorrect Movement Purpose"),
) )
@ -107,12 +102,12 @@ class AssetMovement(Document):
) )
def on_submit(self): def on_submit(self):
self.set_latest_location_in_asset() self.set_latest_location_and_custodian_in_asset()
def on_cancel(self): def on_cancel(self):
self.set_latest_location_in_asset() self.set_latest_location_and_custodian_in_asset()
def set_latest_location_in_asset(self): def set_latest_location_and_custodian_in_asset(self):
current_location, current_employee = "", "" current_location, current_employee = "", ""
cond = "1=1" cond = "1=1"

View File

@ -47,7 +47,7 @@ class TestAssetMovement(unittest.TestCase):
if not frappe.db.exists("Location", "Test Location 2"): if not frappe.db.exists("Location", "Test Location 2"):
frappe.get_doc({"doctype": "Location", "location_name": "Test Location 2"}).insert() frappe.get_doc({"doctype": "Location", "location_name": "Test Location 2"}).insert()
movement1 = create_asset_movement( create_asset_movement(
purpose="Transfer", purpose="Transfer",
company=asset.company, company=asset.company,
assets=[ assets=[
@ -58,7 +58,7 @@ class TestAssetMovement(unittest.TestCase):
) )
self.assertEqual(frappe.db.get_value("Asset", asset.name, "location"), "Test Location 2") self.assertEqual(frappe.db.get_value("Asset", asset.name, "location"), "Test Location 2")
create_asset_movement( movement1 = create_asset_movement(
purpose="Transfer", purpose="Transfer",
company=asset.company, company=asset.company,
assets=[ assets=[
@ -70,21 +70,32 @@ class TestAssetMovement(unittest.TestCase):
self.assertEqual(frappe.db.get_value("Asset", asset.name, "location"), "Test Location") self.assertEqual(frappe.db.get_value("Asset", asset.name, "location"), "Test Location")
movement1.cancel() movement1.cancel()
self.assertEqual(frappe.db.get_value("Asset", asset.name, "location"), "Test Location") self.assertEqual(frappe.db.get_value("Asset", asset.name, "location"), "Test Location 2")
employee = make_employee("testassetmovemp@example.com", company="_Test Company") employee = make_employee("testassetmovemp@example.com", company="_Test Company")
create_asset_movement( create_asset_movement(
purpose="Issue", purpose="Issue",
company=asset.company, company=asset.company,
assets=[{"asset": asset.name, "source_location": "Test Location", "to_employee": employee}], assets=[{"asset": asset.name, "source_location": "Test Location 2", "to_employee": employee}],
reference_doctype="Purchase Receipt", reference_doctype="Purchase Receipt",
reference_name=pr.name, reference_name=pr.name,
) )
# after issuing asset should belong to an employee not at a location # after issuing, asset should belong to an employee not at a location
self.assertEqual(frappe.db.get_value("Asset", asset.name, "location"), None) self.assertEqual(frappe.db.get_value("Asset", asset.name, "location"), None)
self.assertEqual(frappe.db.get_value("Asset", asset.name, "custodian"), employee) self.assertEqual(frappe.db.get_value("Asset", asset.name, "custodian"), employee)
create_asset_movement(
purpose="Receipt",
company=asset.company,
assets=[{"asset": asset.name, "from_employee": employee, "target_location": "Test Location"}],
reference_doctype="Purchase Receipt",
reference_name=pr.name,
)
# after receiving, asset should belong to a location not at an employee
self.assertEqual(frappe.db.get_value("Asset", asset.name, "location"), "Test Location")
def test_last_movement_cancellation(self): def test_last_movement_cancellation(self):
pr = make_purchase_receipt( pr = make_purchase_receipt(
item_code="Macbook Pro", qty=1, rate=100000.0, location="Test Location" item_code="Macbook Pro", qty=1, rate=100000.0, location="Test Location"