Asset Movement
diff --git a/erpnext/accounts/doctype/asset/asset.js b/erpnext/accounts/doctype/asset/asset.js
index 9b7efb9..19653c2 100644
--- a/erpnext/accounts/doctype/asset/asset.js
+++ b/erpnext/accounts/doctype/asset/asset.js
@@ -63,7 +63,7 @@
var asset_values = ["Asset Value", frm.doc.gross_purchase_amount];
if(frm.doc.opening_accumulated_depreciation) {
- x_intervals.push(dateutil.str_to_obj(frm.doc.creation));
+ x_intervals.push(moment(frm.doc.creation).format('YYYY-MM-DD'));
asset_values.push(flt(frm.doc.gross_purchase_amount) -
flt(frm.doc.opening_accumulated_depreciation))
}
@@ -81,7 +81,6 @@
x_intervals.push(frm.doc.disposal_date);
asset_values.push(0)
}
-
frm.dashboard.reset();
frm.dashboard.add_graph([x_intervals, asset_values]);
@@ -190,7 +189,7 @@
args: {
args: {
"asset": frm.doc.name,
- "transfer_date": args.transfer_date,
+ "transaction_date": args.transfer_date,
"source_warehouse": frm.doc.warehouse,
"target_warehouse": args.target_warehouse,
"company": frm.doc.company
diff --git a/erpnext/accounts/doctype/asset/asset.json b/erpnext/accounts/doctype/asset/asset.json
index b4e90ee..c272a58 100644
--- a/erpnext/accounts/doctype/asset/asset.json
+++ b/erpnext/accounts/doctype/asset/asset.json
@@ -97,7 +97,7 @@
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
- "in_list_view": 0,
+ "in_list_view": 1,
"label": "Status",
"length": 0,
"no_copy": 1,
@@ -738,7 +738,7 @@
"issingle": 0,
"istable": 0,
"max_attachments": 0,
- "modified": "2016-04-21 11:30:57.008128",
+ "modified": "2016-04-22 11:15:40.055518",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Asset",
diff --git a/erpnext/accounts/doctype/asset/asset.py b/erpnext/accounts/doctype/asset/asset.py
index da229fe..23bb08b 100644
--- a/erpnext/accounts/doctype/asset/asset.py
+++ b/erpnext/accounts/doctype/asset/asset.py
@@ -190,4 +190,17 @@
"qty": 1
})
si.set_missing_values()
- return si
\ No newline at end of file
+ return si
+
+@frappe.whitelist()
+def transfer_asset(args):
+ import json
+ args = json.loads(args)
+ movement_entry = frappe.new_doc("Asset Movement")
+ movement_entry.update(args)
+ movement_entry.insert()
+ movement_entry.submit()
+
+ frappe.db.commit()
+
+ frappe.msgprint(_("Asset Movement record {0} created").format("<a href='#Form/Asset Movement/{0}'>{0}</a>".format(movement_entry.name)))
\ No newline at end of file
diff --git a/erpnext/accounts/doctype/asset_movement/__init__.py b/erpnext/accounts/doctype/asset_movement/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/accounts/doctype/asset_movement/__init__.py
diff --git a/erpnext/accounts/doctype/asset_movement/asset_movement.js b/erpnext/accounts/doctype/asset_movement/asset_movement.js
new file mode 100644
index 0000000..680eedc
--- /dev/null
+++ b/erpnext/accounts/doctype/asset_movement/asset_movement.js
@@ -0,0 +1,15 @@
+// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors
+// For license information, please see license.txt
+
+frappe.ui.form.on('Asset Movement', {
+ onload: function(frm) {
+ frm.add_fetch("asset", "warehouse", "source_warehouse");
+
+ frm.set_query("target_warehouse", function() {
+ return {
+ filters: [["Warehouse", "company", "in", ["", cstr(frm.doc.company)]]]
+ }
+ })
+
+ }
+});
diff --git a/erpnext/accounts/doctype/asset_movement/asset_movement.json b/erpnext/accounts/doctype/asset_movement/asset_movement.json
new file mode 100644
index 0000000..59b8823
--- /dev/null
+++ b/erpnext/accounts/doctype/asset_movement/asset_movement.json
@@ -0,0 +1,274 @@
+{
+ "allow_copy": 0,
+ "allow_import": 1,
+ "allow_rename": 0,
+ "autoname": "AM-.#####",
+ "creation": "2016-04-25 18:00:23.559973",
+ "custom": 0,
+ "docstatus": 0,
+ "doctype": "DocType",
+ "document_type": "",
+ "fields": [
+ {
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "fieldname": "asset",
+ "fieldtype": "Link",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "label": "Asset",
+ "length": 0,
+ "no_copy": 0,
+ "options": "Asset",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "report_hide": 0,
+ "reqd": 1,
+ "search_index": 0,
+ "set_only_once": 0,
+ "unique": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "fieldname": "transaction_date",
+ "fieldtype": "Datetime",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "label": "Transaction Date",
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "report_hide": 0,
+ "reqd": 1,
+ "search_index": 0,
+ "set_only_once": 0,
+ "unique": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "fieldname": "company",
+ "fieldtype": "Link",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "label": "Company",
+ "length": 0,
+ "no_copy": 0,
+ "options": "Company",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "report_hide": 0,
+ "reqd": 1,
+ "search_index": 0,
+ "set_only_once": 0,
+ "unique": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "fieldname": "column_break_4",
+ "fieldtype": "Column Break",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "unique": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "fieldname": "source_warehouse",
+ "fieldtype": "Link",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "label": "Source Warehouse",
+ "length": 0,
+ "no_copy": 0,
+ "options": "Warehouse",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 1,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "unique": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "fieldname": "target_warehouse",
+ "fieldtype": "Link",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "label": "Target Warehouse",
+ "length": 0,
+ "no_copy": 0,
+ "options": "Warehouse",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "report_hide": 0,
+ "reqd": 1,
+ "search_index": 0,
+ "set_only_once": 0,
+ "unique": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "fieldname": "amended_from",
+ "fieldtype": "Link",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "label": "Amended From",
+ "length": 0,
+ "no_copy": 1,
+ "options": "Asset Movement",
+ "permlevel": 0,
+ "print_hide": 1,
+ "print_hide_if_no_value": 0,
+ "read_only": 1,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "unique": 0
+ }
+ ],
+ "hide_heading": 0,
+ "hide_toolbar": 0,
+ "idx": 0,
+ "in_create": 0,
+ "in_dialog": 0,
+ "is_submittable": 1,
+ "issingle": 0,
+ "istable": 0,
+ "max_attachments": 0,
+ "modified": "2016-04-25 19:14:08.853429",
+ "modified_by": "Administrator",
+ "module": "Accounts",
+ "name": "Asset Movement",
+ "name_case": "",
+ "owner": "Administrator",
+ "permissions": [
+ {
+ "amend": 1,
+ "apply_user_permissions": 0,
+ "cancel": 1,
+ "create": 1,
+ "delete": 1,
+ "email": 1,
+ "export": 1,
+ "if_owner": 0,
+ "import": 0,
+ "permlevel": 0,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "System Manager",
+ "set_user_permissions": 0,
+ "share": 1,
+ "submit": 1,
+ "write": 1
+ },
+ {
+ "amend": 1,
+ "apply_user_permissions": 0,
+ "cancel": 1,
+ "create": 1,
+ "delete": 1,
+ "email": 1,
+ "export": 1,
+ "if_owner": 0,
+ "import": 0,
+ "permlevel": 0,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Accounts Manager",
+ "set_user_permissions": 0,
+ "share": 1,
+ "submit": 1,
+ "write": 1
+ },
+ {
+ "amend": 1,
+ "apply_user_permissions": 0,
+ "cancel": 1,
+ "create": 1,
+ "delete": 1,
+ "email": 1,
+ "export": 1,
+ "if_owner": 0,
+ "import": 0,
+ "permlevel": 0,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Stock Manager",
+ "set_user_permissions": 0,
+ "share": 1,
+ "submit": 1,
+ "write": 1
+ }
+ ],
+ "quick_entry": 1,
+ "read_only": 0,
+ "read_only_onload": 0,
+ "sort_field": "modified",
+ "sort_order": "DESC",
+ "track_seen": 0
+}
\ No newline at end of file
diff --git a/erpnext/accounts/doctype/asset_movement/asset_movement.py b/erpnext/accounts/doctype/asset_movement/asset_movement.py
new file mode 100644
index 0000000..574c499
--- /dev/null
+++ b/erpnext/accounts/doctype/asset_movement/asset_movement.py
@@ -0,0 +1,48 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors
+# For license information, please see license.txt
+
+from __future__ import unicode_literals
+import frappe
+from frappe import _
+from frappe.model.document import Document
+
+class AssetMovement(Document):
+ def validate(self):
+ self.validate_asset()
+ self.validate_warehouses()
+
+ def validate_asset(self):
+ status, company = frappe.db.get_value("Asset", self.asset, ["status", "company"])
+ if status in ("Draft", "Scrapped", "Sold"):
+ frappe.throw(_("{0} asset cannot be transferred").format(status))
+
+ if company != self.company:
+ frappe.throw(_("Asset {0} does not belong to company {1}").format(self.asset, self.company))
+
+ def validate_warehouses(self):
+ if not self.source_warehouse:
+ self.source_warehouse = frappe.db.get_value("Asset", self.asset, "warehouse")
+
+ if self.source_warehouse == self.target_warehouse:
+ frappe.throw(_("Source and Target Warehouse cannot be same"))
+
+ def on_submit(self):
+ self.set_latest_warehouse_in_asset()
+
+ def on_cancel(self):
+ self.set_latest_warehouse_in_asset()
+
+ def set_latest_warehouse_in_asset(self):
+ latest_movement_entry = frappe.db.sql("""select target_warehouse from `tabAsset Movement`
+ where asset=%s and docstatus=1 and company=%s
+ order by transaction_date desc limit 1""", (self.asset, self.company))
+
+ if latest_movement_entry:
+ warehouse = latest_movement_entry[0][0]
+ else:
+ warehouse = frappe.db.sql("""select source_warehouse from `tabAsset Movement`
+ where asset=%s and docstatus=2 and company=%s
+ order by transaction_date asc limit 1""", (self.asset, self.company))[0][0]
+
+ frappe.db.set_value("Asset", self.asset, "warehouse", warehouse)
\ No newline at end of file
diff --git a/erpnext/accounts/doctype/asset_movement/test_asset_movement.py b/erpnext/accounts/doctype/asset_movement/test_asset_movement.py
new file mode 100644
index 0000000..9880efc
--- /dev/null
+++ b/erpnext/accounts/doctype/asset_movement/test_asset_movement.py
@@ -0,0 +1,51 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
+# See license.txt
+from __future__ import unicode_literals
+
+import frappe
+from frappe.utils import now
+import unittest
+from erpnext.accounts.doctype.asset.test_asset import create_asset
+
+
+class TestAssetMovement(unittest.TestCase):
+ def test_movement(self):
+ asset = create_asset()
+
+ if asset.docstatus == 0:
+ asset.submit()
+
+ movement1 = create_asset_movement(asset, target_warehouse="_Test Warehouse 1 - _TC")
+ self.assertEqual(frappe.db.get_value("Asset", asset.name, "warehouse"), "_Test Warehouse 1 - _TC")
+
+ movement2 = create_asset_movement(asset, target_warehouse="_Test Warehouse 2 - _TC")
+ self.assertEqual(frappe.db.get_value("Asset", asset.name, "warehouse"), "_Test Warehouse 2 - _TC")
+
+ movement1.cancel()
+ self.assertEqual(frappe.db.get_value("Asset", asset.name, "warehouse"), "_Test Warehouse 2 - _TC")
+
+ movement2.cancel()
+ self.assertEqual(frappe.db.get_value("Asset", asset.name, "warehouse"), "_Test Warehouse - _TC")
+
+ asset.load_from_db()
+ asset.cancel()
+ frappe.delete_doc("Asset", asset.name)
+
+
+def create_asset_movement(asset, target_warehouse, transaction_date=None):
+ if not transaction_date:
+ transaction_date = now()
+
+ movement = frappe.new_doc("Asset Movement")
+ movement.update({
+ "asset": asset.name,
+ "transaction_date": transaction_date,
+ "target_warehouse": target_warehouse,
+ "company": asset.company
+ })
+
+ movement.insert()
+ movement.submit()
+
+ return movement
diff --git a/erpnext/config/accounts.py b/erpnext/config/accounts.py
index 72ed0f9..d0629e7 100644
--- a/erpnext/config/accounts.py
+++ b/erpnext/config/accounts.py
@@ -221,6 +221,11 @@
"name": "Period Closing Voucher",
"description": _("Close Balance Sheet and book Profit or Loss.")
},
+ {
+ "type": "doctype",
+ "name": "Asset Movement",
+ "description": _("Transfer an asset from one warehouse to another")
+ },
]
},
{