mirror of
https://github.com/frappe/erpnext.git
synced 2026-03-26 14:41:42 +01:00
feat: Asset Capitalization Form
This commit is contained in:
@@ -0,0 +1,389 @@
|
|||||||
|
// Copyright (c) 2021, Frappe Technologies Pvt. Ltd. and contributors
|
||||||
|
// For license information, please see license.txt
|
||||||
|
|
||||||
|
frappe.provide("erpnext.assets");
|
||||||
|
|
||||||
|
|
||||||
|
erpnext.assets.AssetCapitalization = class AssetCapitalization extends erpnext.stock.StockController {
|
||||||
|
setup() {
|
||||||
|
this.setup_posting_date_time_check();
|
||||||
|
}
|
||||||
|
|
||||||
|
onload() {
|
||||||
|
this.setup_queries();
|
||||||
|
}
|
||||||
|
|
||||||
|
refresh() {
|
||||||
|
erpnext.hide_company();
|
||||||
|
}
|
||||||
|
|
||||||
|
setup_queries() {
|
||||||
|
var me = this;
|
||||||
|
|
||||||
|
me.setup_warehouse_query();
|
||||||
|
|
||||||
|
me.frm.set_query("target_item_code", function() {
|
||||||
|
return erpnext.queries.item();
|
||||||
|
});
|
||||||
|
|
||||||
|
me.frm.set_query("target_asset", function() {
|
||||||
|
var filters = {};
|
||||||
|
|
||||||
|
if (me.frm.doc.target_item_code) {
|
||||||
|
filters['item_code'] = me.frm.doc.target_item_code;
|
||||||
|
}
|
||||||
|
|
||||||
|
filters['status'] = ["not in", ["Draft", "Scrapped", "Sold"]]
|
||||||
|
filters['docstatus'] = 1;
|
||||||
|
|
||||||
|
return {
|
||||||
|
filters: filters
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
me.frm.set_query("asset", "asset_items", function() {
|
||||||
|
var filters = {
|
||||||
|
'status': ["not in", ["Draft", "Scrapped", "Sold"]],
|
||||||
|
'docstatus': 1
|
||||||
|
}
|
||||||
|
|
||||||
|
if (me.frm.doc.target_asset) {
|
||||||
|
filters['name'] = ['!=', me.frm.doc.target_asset]
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
filters: filters
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
me.frm.set_query("item_code", "stock_items", function() {
|
||||||
|
return erpnext.queries.item({"is_stock_item": 1});
|
||||||
|
});
|
||||||
|
|
||||||
|
me.frm.set_query("item_code", "service_items", function() {
|
||||||
|
return erpnext.queries.item({"is_stock_item": 0, "is_fixed_asset": 0});
|
||||||
|
});
|
||||||
|
|
||||||
|
me.frm.set_query('batch_no', 'stock_items', function(doc, cdt, cdn) {
|
||||||
|
var item = locals[cdt][cdn];
|
||||||
|
if(!item.item_code) {
|
||||||
|
frappe.throw(__("Please enter Item Code to get Batch Number"));
|
||||||
|
} else {
|
||||||
|
var filters = {
|
||||||
|
'item_code': item.item_code,
|
||||||
|
'posting_date': me.frm.doc.posting_date || frappe.datetime.nowdate(),
|
||||||
|
'warehouse': item.warehouse
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
query : "erpnext.controllers.queries.get_batch_no",
|
||||||
|
filters: filters
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
me.frm.set_query('expense_account', 'service_items', function() {
|
||||||
|
return {
|
||||||
|
filters: {
|
||||||
|
"account_type": ['in', ["Tax", "Expense Account", "Income Account", "Expenses Included In Valuation", "Expenses Included In Asset Valuation"]],
|
||||||
|
"is_group": 0,
|
||||||
|
"company": me.frm.doc.company
|
||||||
|
}
|
||||||
|
};
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
target_item_code() {
|
||||||
|
return this.get_target_item_details();
|
||||||
|
}
|
||||||
|
|
||||||
|
target_asset() {
|
||||||
|
return this.get_target_asset_details();
|
||||||
|
}
|
||||||
|
|
||||||
|
item_code(doc, cdt, cdn) {
|
||||||
|
var row = frappe.get_doc(cdt, cdn);
|
||||||
|
if (cdt === "Asset Capitalization Stock Item") {
|
||||||
|
this.get_consumed_stock_item_details(row);
|
||||||
|
} else if (cdt == "Asset Capitalization Service Item") {
|
||||||
|
this.get_service_item_details(row);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
warehouse(doc, cdt, cdn) {
|
||||||
|
var row = frappe.get_doc(cdt, cdn);
|
||||||
|
if (cdt === "Asset Capitalization Stock Item") {
|
||||||
|
this.get_warehouse_details(row);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
asset(doc, cdt, cdn) {
|
||||||
|
var row = frappe.get_doc(cdt, cdn);
|
||||||
|
if (cdt === "Asset Capitalization Asset Item") {
|
||||||
|
this.get_consumed_asset_details(row);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
posting_date() {
|
||||||
|
if (this.frm.doc.posting_date) {
|
||||||
|
this.get_all_item_warehouse_details();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
posting_time() {
|
||||||
|
if (this.frm.doc.posting_time) {
|
||||||
|
this.get_all_item_warehouse_details();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
finance_book() {
|
||||||
|
this.get_all_asset_values();
|
||||||
|
}
|
||||||
|
|
||||||
|
stock_qty() {
|
||||||
|
this.calculate_totals();
|
||||||
|
}
|
||||||
|
|
||||||
|
qty() {
|
||||||
|
this.calculate_totals();
|
||||||
|
}
|
||||||
|
|
||||||
|
rate() {
|
||||||
|
this.calculate_totals();
|
||||||
|
}
|
||||||
|
|
||||||
|
company() {
|
||||||
|
var me = this;
|
||||||
|
|
||||||
|
if (me.frm.doc.company) {
|
||||||
|
frappe.call({
|
||||||
|
method: "frappe.client.get_value",
|
||||||
|
args: {
|
||||||
|
doctype: "Company",
|
||||||
|
filters: {"name": me.frm.doc.company},
|
||||||
|
fieldname: "cost_center"
|
||||||
|
},
|
||||||
|
callback: function (r) {
|
||||||
|
if (r.message) {
|
||||||
|
$.each(me.frm.doc.service_items || [], function (i, d) {
|
||||||
|
frappe.model.set_value(d.doctype, d.name, "cost_center", r.message.cost_center);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
erpnext.accounts.dimensions.update_dimension(me.frm, me.frm.doctype);
|
||||||
|
}
|
||||||
|
|
||||||
|
serivce_items_add(doc, cdt, cdn) {
|
||||||
|
erpnext.accounts.dimensions.copy_dimension_from_first_row(this.frm, cdt, cdn, 'service_items');
|
||||||
|
}
|
||||||
|
|
||||||
|
get_target_item_details() {
|
||||||
|
var me = this;
|
||||||
|
|
||||||
|
if (me.frm.doc.target_item_code) {
|
||||||
|
return me.frm.call({
|
||||||
|
method: "erpnext.assets.doctype.asset_capitalization.asset_capitalization.get_target_item_details",
|
||||||
|
child: me.frm.doc,
|
||||||
|
args: {
|
||||||
|
item_code: me.frm.doc.target_item_code,
|
||||||
|
},
|
||||||
|
callback: function (r) {
|
||||||
|
if (!r.exc) {
|
||||||
|
me.frm.refresh_fields();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
get_target_asset_details() {
|
||||||
|
var me = this;
|
||||||
|
|
||||||
|
if (me.frm.doc.target_asset) {
|
||||||
|
return me.frm.call({
|
||||||
|
method: "erpnext.assets.doctype.asset_capitalization.asset_capitalization.get_target_asset_details",
|
||||||
|
child: me.frm.doc,
|
||||||
|
args: {
|
||||||
|
asset: me.frm.doc.target_asset
|
||||||
|
},
|
||||||
|
callback: function (r) {
|
||||||
|
if (!r.exc) {
|
||||||
|
me.frm.refresh_fields();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
get_consumed_stock_item_details(row) {
|
||||||
|
var me = this;
|
||||||
|
|
||||||
|
if (row && row.item_code) {
|
||||||
|
return me.frm.call({
|
||||||
|
method: "erpnext.assets.doctype.asset_capitalization.asset_capitalization.get_consumed_stock_item_details",
|
||||||
|
child: row,
|
||||||
|
args: {
|
||||||
|
args: {
|
||||||
|
item_code: row.item_code,
|
||||||
|
warehouse: row.warehouse,
|
||||||
|
stock_qty: flt(row.stock_qty),
|
||||||
|
doctype: me.frm.doc.doctype,
|
||||||
|
name: me.frm.doc.name,
|
||||||
|
company: me.frm.doc.company,
|
||||||
|
posting_date: me.frm.doc.posting_date,
|
||||||
|
posting_time: me.frm.doc.posting_time,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
callback: function (r) {
|
||||||
|
if (!r.exc) {
|
||||||
|
me.calculate_totals();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
get_consumed_asset_details(row) {
|
||||||
|
var me = this;
|
||||||
|
|
||||||
|
if (row && row.asset) {
|
||||||
|
return me.frm.call({
|
||||||
|
method: "erpnext.assets.doctype.asset_capitalization.asset_capitalization.get_consumed_asset_details",
|
||||||
|
child: row,
|
||||||
|
args: {
|
||||||
|
args: {
|
||||||
|
asset: row.asset,
|
||||||
|
doctype: me.frm.doc.doctype,
|
||||||
|
name: me.frm.doc.name,
|
||||||
|
company: me.frm.doc.company,
|
||||||
|
finance_book: me.frm.doc.finance_book,
|
||||||
|
posting_date: me.frm.doc.posting_date,
|
||||||
|
posting_time: me.frm.doc.posting_time,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
callback: function (r) {
|
||||||
|
if (!r.exc) {
|
||||||
|
me.calculate_totals();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
get_service_item_details(row) {
|
||||||
|
var me = this;
|
||||||
|
|
||||||
|
if (row && row.item_code) {
|
||||||
|
return me.frm.call({
|
||||||
|
method: "erpnext.assets.doctype.asset_capitalization.asset_capitalization.get_service_item_details",
|
||||||
|
child: row,
|
||||||
|
args: {
|
||||||
|
args: {
|
||||||
|
item_code: row.item_code,
|
||||||
|
qty: flt(row.qty),
|
||||||
|
expense_account: row.expense_account,
|
||||||
|
company: me.frm.doc.company,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
callback: function (r) {
|
||||||
|
if (!r.exc) {
|
||||||
|
me.calculate_totals();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
get_warehouse_details(item) {
|
||||||
|
var me = this;
|
||||||
|
if(item.item_code && item.warehouse) {
|
||||||
|
me.frm.call({
|
||||||
|
method: "erpnext.assets.doctype.asset_capitalization.asset_capitalization.get_warehouse_details",
|
||||||
|
child: item,
|
||||||
|
args: {
|
||||||
|
args: {
|
||||||
|
'item_code': item.item_code,
|
||||||
|
'warehouse': cstr(item.warehouse),
|
||||||
|
'qty': flt(item.stock_qty),
|
||||||
|
'serial_no': item.serial_no,
|
||||||
|
'posting_date': me.frm.doc.posting_date,
|
||||||
|
'posting_time': me.frm.doc.posting_time,
|
||||||
|
'company': me.frm.doc.company,
|
||||||
|
'voucher_type': me.frm.doc.doctype,
|
||||||
|
'voucher_no': me.frm.doc.name,
|
||||||
|
'allow_zero_valuation': 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
callback: function(r) {
|
||||||
|
if (!r.exc) {
|
||||||
|
me.calculate_totals();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
get_all_item_warehouse_details() {
|
||||||
|
var me = this;
|
||||||
|
me.frm.call({
|
||||||
|
method: "set_warehouse_details",
|
||||||
|
doc: me.frm.doc,
|
||||||
|
callback: function(r) {
|
||||||
|
if (!r.exc) {
|
||||||
|
me.calculate_totals();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
get_all_asset_values() {
|
||||||
|
var me = this;
|
||||||
|
me.frm.call({
|
||||||
|
method: "set_asset_values",
|
||||||
|
doc: me.frm.doc,
|
||||||
|
callback: function(r) {
|
||||||
|
if (!r.exc) {
|
||||||
|
me.calculate_totals();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
calculate_totals() {
|
||||||
|
var me = this;
|
||||||
|
|
||||||
|
me.frm.doc.stock_items_total = 0;
|
||||||
|
me.frm.doc.asset_items_total = 0;
|
||||||
|
me.frm.doc.service_items_total = 0;
|
||||||
|
|
||||||
|
$.each(me.frm.doc.stock_items || [], function (i, d) {
|
||||||
|
d.amount = flt(flt(d.stock_qty) * flt(d.valuation_rate), precision('amount', d));
|
||||||
|
me.frm.doc.stock_items_total += d.amount;
|
||||||
|
});
|
||||||
|
|
||||||
|
$.each(me.frm.doc.asset_items || [], function (i, d) {
|
||||||
|
d.asset_value = flt(flt(d.asset_value), precision('asset_value', d));
|
||||||
|
me.frm.doc.asset_items_total += d.asset_value;
|
||||||
|
});
|
||||||
|
|
||||||
|
$.each(me.frm.doc.service_items || [], function (i, d) {
|
||||||
|
d.amount = flt(flt(d.qty) * flt(d.rate), precision('amount', d));
|
||||||
|
me.frm.doc.service_items_total += d.amount;
|
||||||
|
});
|
||||||
|
|
||||||
|
me.frm.doc.stock_items_total = flt(me.frm.doc.stock_items_total, precision('stock_items_total'));
|
||||||
|
me.frm.doc.asset_items_total = flt(me.frm.doc.asset_items_total, precision('asset_items_total'));
|
||||||
|
me.frm.doc.service_items_total = flt(me.frm.doc.service_items_total, precision('service_items_total'));
|
||||||
|
|
||||||
|
me.frm.doc.total_value = me.frm.doc.stock_items_total + me.frm.doc.asset_items_total + me.frm.doc.service_items_total;
|
||||||
|
me.frm.doc.total_value = flt(me.frm.doc.total_value, precision('total_value'));
|
||||||
|
|
||||||
|
me.frm.refresh_fields();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
//$.extend(cur_frm.cscript, new erpnext.assets.AssetCapitalization({frm: cur_frm}));
|
||||||
|
cur_frm.cscript = new erpnext.assets.AssetCapitalization({frm: cur_frm});
|
||||||
@@ -0,0 +1,340 @@
|
|||||||
|
{
|
||||||
|
"actions": [],
|
||||||
|
"autoname": "naming_series:",
|
||||||
|
"creation": "2021-09-04 13:38:04.217187",
|
||||||
|
"doctype": "DocType",
|
||||||
|
"document_type": "Document",
|
||||||
|
"editable_grid": 1,
|
||||||
|
"engine": "InnoDB",
|
||||||
|
"field_order": [
|
||||||
|
"title",
|
||||||
|
"target_item_code",
|
||||||
|
"target_item_name",
|
||||||
|
"target_is_fixed_asset",
|
||||||
|
"target_has_batch_no",
|
||||||
|
"target_has_serial_no",
|
||||||
|
"entry_type",
|
||||||
|
"finance_book",
|
||||||
|
"naming_series",
|
||||||
|
"column_break_9",
|
||||||
|
"company",
|
||||||
|
"posting_date",
|
||||||
|
"posting_time",
|
||||||
|
"set_posting_time",
|
||||||
|
"amended_from",
|
||||||
|
"target_item_details_section",
|
||||||
|
"target_asset",
|
||||||
|
"target_asset_name",
|
||||||
|
"target_warehouse",
|
||||||
|
"target_batch_no",
|
||||||
|
"target_serial_no",
|
||||||
|
"column_break_5",
|
||||||
|
"target_qty",
|
||||||
|
"target_stock_uom",
|
||||||
|
"section_break_16",
|
||||||
|
"stock_items",
|
||||||
|
"stock_items_total",
|
||||||
|
"section_break_26",
|
||||||
|
"asset_items",
|
||||||
|
"asset_items_total",
|
||||||
|
"service_expenses_section",
|
||||||
|
"service_items",
|
||||||
|
"service_items_total",
|
||||||
|
"totals_section",
|
||||||
|
"total_value"
|
||||||
|
],
|
||||||
|
"fields": [
|
||||||
|
{
|
||||||
|
"fieldname": "title",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"hidden": 1,
|
||||||
|
"label": "Title"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "target_item_code",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"in_standard_filter": 1,
|
||||||
|
"label": "Target Item Code",
|
||||||
|
"options": "Item",
|
||||||
|
"reqd": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"depends_on": "eval:doc.target_item_code && doc.target_item_name != doc.target_item_code",
|
||||||
|
"fetch_from": "target_item_code.item_name",
|
||||||
|
"fieldname": "target_item_name",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"label": "Target Item Name",
|
||||||
|
"read_only": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"default": "0",
|
||||||
|
"fetch_from": "target_item_code.is_fixed_asset",
|
||||||
|
"fieldname": "target_is_fixed_asset",
|
||||||
|
"fieldtype": "Check",
|
||||||
|
"hidden": 1,
|
||||||
|
"label": "Target Is Fixed Asset",
|
||||||
|
"read_only": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "column_break_5",
|
||||||
|
"fieldtype": "Column Break"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"depends_on": "eval:!doc.target_item_code || doc.target_is_fixed_asset",
|
||||||
|
"fieldname": "target_asset",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"in_standard_filter": 1,
|
||||||
|
"label": "Target Asset",
|
||||||
|
"no_copy": 1,
|
||||||
|
"options": "Asset"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"depends_on": "target_asset",
|
||||||
|
"fetch_from": "target_asset.asset_name",
|
||||||
|
"fieldname": "target_asset_name",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"label": "Asset Name",
|
||||||
|
"no_copy": 1,
|
||||||
|
"read_only": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "column_break_9",
|
||||||
|
"fieldtype": "Column Break"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fetch_from": "asset.company",
|
||||||
|
"fieldname": "company",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"label": "Company",
|
||||||
|
"options": "Company",
|
||||||
|
"reqd": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"default": "Today",
|
||||||
|
"fieldname": "posting_date",
|
||||||
|
"fieldtype": "Date",
|
||||||
|
"in_list_view": 1,
|
||||||
|
"in_standard_filter": 1,
|
||||||
|
"label": "Posting Date",
|
||||||
|
"no_copy": 1,
|
||||||
|
"reqd": 1,
|
||||||
|
"search_index": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"default": "Now",
|
||||||
|
"fieldname": "posting_time",
|
||||||
|
"fieldtype": "Time",
|
||||||
|
"label": "Posting Time",
|
||||||
|
"no_copy": 1,
|
||||||
|
"reqd": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"default": "0",
|
||||||
|
"depends_on": "eval:doc.docstatus==0",
|
||||||
|
"fieldname": "set_posting_time",
|
||||||
|
"fieldtype": "Check",
|
||||||
|
"label": "Edit Posting Date and Time"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "naming_series",
|
||||||
|
"fieldtype": "Select",
|
||||||
|
"label": "Series",
|
||||||
|
"options": "ACC-ASC-.YYYY.-",
|
||||||
|
"reqd": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "amended_from",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"label": "Amended From",
|
||||||
|
"no_copy": 1,
|
||||||
|
"options": "Asset Capitalization",
|
||||||
|
"print_hide": 1,
|
||||||
|
"read_only": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "section_break_16",
|
||||||
|
"fieldtype": "Section Break",
|
||||||
|
"label": "Consumed Stock Items"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "stock_items",
|
||||||
|
"fieldtype": "Table",
|
||||||
|
"label": "Stock Items",
|
||||||
|
"options": "Asset Capitalization Stock Item"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "target_item_details_section",
|
||||||
|
"fieldtype": "Section Break",
|
||||||
|
"label": "Target Item Details"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"depends_on": "eval:!doc.target_is_fixed_asset",
|
||||||
|
"fieldname": "target_warehouse",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"label": "Target Warehouse",
|
||||||
|
"options": "Warehouse"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"depends_on": "target_has_batch_no",
|
||||||
|
"fieldname": "target_batch_no",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"label": "Target Batch No",
|
||||||
|
"options": "Batch"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"default": "1",
|
||||||
|
"fieldname": "target_qty",
|
||||||
|
"fieldtype": "Float",
|
||||||
|
"label": "Target Qty",
|
||||||
|
"read_only_depends_on": "target_is_fixed_asset"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fetch_from": "target_item_code.stock_uom",
|
||||||
|
"fieldname": "target_stock_uom",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"label": "Stock UOM",
|
||||||
|
"options": "UOM",
|
||||||
|
"read_only": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"default": "0",
|
||||||
|
"fetch_from": "target_item_code.has_batch_no",
|
||||||
|
"fieldname": "target_has_batch_no",
|
||||||
|
"fieldtype": "Check",
|
||||||
|
"hidden": 1,
|
||||||
|
"label": "Target Has Batch No",
|
||||||
|
"read_only": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"default": "0",
|
||||||
|
"fetch_from": "target_item_code.has_serial_no",
|
||||||
|
"fieldname": "target_has_serial_no",
|
||||||
|
"fieldtype": "Check",
|
||||||
|
"hidden": 1,
|
||||||
|
"label": "Target Has Serial No",
|
||||||
|
"read_only": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"depends_on": "target_has_serial_no",
|
||||||
|
"fieldname": "target_serial_no",
|
||||||
|
"fieldtype": "Small Text",
|
||||||
|
"label": "Target Serial No"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "section_break_26",
|
||||||
|
"fieldtype": "Section Break",
|
||||||
|
"label": "Consumed Asset Items"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "asset_items",
|
||||||
|
"fieldtype": "Table",
|
||||||
|
"label": "Assets",
|
||||||
|
"options": "Asset Capitalization Asset Item"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "entry_type",
|
||||||
|
"fieldtype": "Select",
|
||||||
|
"in_list_view": 1,
|
||||||
|
"in_standard_filter": 1,
|
||||||
|
"label": "Entry Type",
|
||||||
|
"options": "\nCapitalization\nDecapitalization",
|
||||||
|
"read_only": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "stock_items_total",
|
||||||
|
"fieldtype": "Currency",
|
||||||
|
"label": "Consumed Stock Total Value",
|
||||||
|
"options": "Company:company:default_currency",
|
||||||
|
"read_only": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "asset_items_total",
|
||||||
|
"fieldtype": "Currency",
|
||||||
|
"label": "Consumed Asset Total Value",
|
||||||
|
"options": "Company:company:default_currency",
|
||||||
|
"read_only": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "finance_book",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"label": "Finance Book",
|
||||||
|
"options": "Finance Book"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "service_expenses_section",
|
||||||
|
"fieldtype": "Section Break",
|
||||||
|
"label": "Service Expenses"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "service_items",
|
||||||
|
"fieldtype": "Table",
|
||||||
|
"label": "Services",
|
||||||
|
"options": "Asset Capitalization Service Item"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "service_items_total",
|
||||||
|
"fieldtype": "Currency",
|
||||||
|
"label": "Service Expense Total Amount",
|
||||||
|
"options": "Company:company:default_currency",
|
||||||
|
"read_only": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "totals_section",
|
||||||
|
"fieldtype": "Section Break",
|
||||||
|
"label": "Totals"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "total_value",
|
||||||
|
"fieldtype": "Currency",
|
||||||
|
"label": "Total Value",
|
||||||
|
"options": "Company:company:default_currency",
|
||||||
|
"read_only": 1
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"index_web_pages_for_search": 1,
|
||||||
|
"is_submittable": 1,
|
||||||
|
"links": [],
|
||||||
|
"modified": "2021-09-06 17:18:31.881006",
|
||||||
|
"modified_by": "Administrator",
|
||||||
|
"module": "Assets",
|
||||||
|
"name": "Asset Capitalization",
|
||||||
|
"naming_rule": "By \"Naming Series\" field",
|
||||||
|
"owner": "Administrator",
|
||||||
|
"permissions": [
|
||||||
|
{
|
||||||
|
"amend": 1,
|
||||||
|
"cancel": 1,
|
||||||
|
"create": 1,
|
||||||
|
"delete": 1,
|
||||||
|
"email": 1,
|
||||||
|
"export": 1,
|
||||||
|
"print": 1,
|
||||||
|
"read": 1,
|
||||||
|
"report": 1,
|
||||||
|
"role": "Manufacturing Manager",
|
||||||
|
"share": 1,
|
||||||
|
"submit": 1,
|
||||||
|
"write": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"amend": 1,
|
||||||
|
"cancel": 1,
|
||||||
|
"create": 1,
|
||||||
|
"delete": 1,
|
||||||
|
"email": 1,
|
||||||
|
"export": 1,
|
||||||
|
"print": 1,
|
||||||
|
"read": 1,
|
||||||
|
"report": 1,
|
||||||
|
"role": "Quality Manager",
|
||||||
|
"share": 1,
|
||||||
|
"submit": 1,
|
||||||
|
"write": 1
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"sort_field": "modified",
|
||||||
|
"sort_order": "DESC",
|
||||||
|
"title_field": "title",
|
||||||
|
"track_changes": 1,
|
||||||
|
"track_seen": 1
|
||||||
|
}
|
||||||
@@ -0,0 +1,402 @@
|
|||||||
|
# Copyright (c) 2021, Frappe Technologies Pvt. Ltd. and contributors
|
||||||
|
# For license information, please see license.txt
|
||||||
|
|
||||||
|
import frappe
|
||||||
|
from frappe import _
|
||||||
|
from erpnext.controllers.accounts_controller import AccountsController
|
||||||
|
from frappe.utils import cint, flt
|
||||||
|
from erpnext.stock.get_item_details import get_item_warehouse, get_default_expense_account, get_default_cost_center
|
||||||
|
from erpnext.stock.doctype.item.item import get_item_defaults
|
||||||
|
from erpnext.setup.doctype.item_group.item_group import get_item_group_defaults
|
||||||
|
from erpnext.setup.doctype.brand.brand import get_brand_defaults
|
||||||
|
from erpnext.stock.utils import get_incoming_rate
|
||||||
|
from erpnext.stock.stock_ledger import get_previous_sle
|
||||||
|
from erpnext.assets.doctype.asset_value_adjustment.asset_value_adjustment import get_current_asset_value
|
||||||
|
from six import string_types
|
||||||
|
import json
|
||||||
|
|
||||||
|
force_fields = ['target_item_name', 'target_asset_name', 'item_name', 'asset_name',
|
||||||
|
'target_is_fixed_asset', 'target_has_serial_no', 'target_has_batch_no',
|
||||||
|
'target_stock_uom', 'stock_uom']
|
||||||
|
|
||||||
|
|
||||||
|
class AssetCapitalization(AccountsController):
|
||||||
|
def validate(self):
|
||||||
|
self.validate_posting_time()
|
||||||
|
self.set_missing_values(for_validate=True)
|
||||||
|
self.set_entry_type()
|
||||||
|
self.validate_target_item()
|
||||||
|
self.validate_target_asset()
|
||||||
|
self.validate_consumed_stock_item()
|
||||||
|
self.validate_consumed_asset_item()
|
||||||
|
self.validate_service_item()
|
||||||
|
self.set_warehouse_details()
|
||||||
|
self.set_asset_values()
|
||||||
|
self.calculate_totals()
|
||||||
|
self.set_title()
|
||||||
|
|
||||||
|
def set_entry_type(self):
|
||||||
|
self.entry_type = "Capitalization" if self.target_is_fixed_asset else "Decapitalization"
|
||||||
|
|
||||||
|
def set_title(self):
|
||||||
|
self.title = self.target_asset_name or self.target_item_name or self.target_item_code
|
||||||
|
|
||||||
|
def set_missing_values(self, for_validate=False):
|
||||||
|
target_item_details = get_target_item_details(self.target_item_code)
|
||||||
|
for k, v in target_item_details.items():
|
||||||
|
if self.meta.has_field(k) and (not self.get(k) or k in force_fields):
|
||||||
|
self.set(k, v)
|
||||||
|
|
||||||
|
# Remove asset if item not a fixed asset
|
||||||
|
if not self.target_is_fixed_asset:
|
||||||
|
self.target_asset = None
|
||||||
|
|
||||||
|
target_asset_details = get_target_asset_details(self.target_asset)
|
||||||
|
for k, v in target_asset_details.items():
|
||||||
|
if self.meta.has_field(k) and (not self.get(k) or k in force_fields):
|
||||||
|
self.set(k, v)
|
||||||
|
|
||||||
|
for d in self.stock_items:
|
||||||
|
args = self.as_dict()
|
||||||
|
args.update(d.as_dict())
|
||||||
|
args.doctype = self.doctype
|
||||||
|
args.name = self.name
|
||||||
|
consumed_stock_item_details = get_consumed_stock_item_details(args, get_valuation_rate=False)
|
||||||
|
for k, v in consumed_stock_item_details.items():
|
||||||
|
if d.meta.has_field(k) and (not d.get(k) or k in force_fields):
|
||||||
|
d.set(k, v)
|
||||||
|
|
||||||
|
for d in self.asset_items:
|
||||||
|
args = self.as_dict()
|
||||||
|
args.update(d.as_dict())
|
||||||
|
args.doctype = self.doctype
|
||||||
|
args.name = self.name
|
||||||
|
consumed_asset_details = get_consumed_asset_details(args, get_asset_value=False)
|
||||||
|
for k, v in consumed_asset_details.items():
|
||||||
|
if d.meta.has_field(k) and (not d.get(k) or k in force_fields):
|
||||||
|
d.set(k, v)
|
||||||
|
|
||||||
|
for d in self.service_items:
|
||||||
|
args = self.as_dict()
|
||||||
|
args.update(d.as_dict())
|
||||||
|
args.doctype = self.doctype
|
||||||
|
args.name = self.name
|
||||||
|
service_item_details = get_service_item_details(args)
|
||||||
|
for k, v in service_item_details.items():
|
||||||
|
if d.meta.has_field(k) and (not d.get(k) or k in force_fields):
|
||||||
|
d.set(k, v)
|
||||||
|
|
||||||
|
def validate_target_item(self):
|
||||||
|
target_item = frappe.get_cached_doc("Item", self.target_item_code)
|
||||||
|
|
||||||
|
if not target_item.is_fixed_asset and not target_item.is_stock_item:
|
||||||
|
frappe.throw(_("Target Item {0} is neither a Fixed Asset nor a Stock Item")
|
||||||
|
.format(target_item.name))
|
||||||
|
|
||||||
|
if target_item.is_fixed_asset:
|
||||||
|
self.target_qty = 1
|
||||||
|
|
||||||
|
if not target_item.is_stock_item:
|
||||||
|
self.target_warehouse = None
|
||||||
|
if not target_item.is_fixed_asset:
|
||||||
|
self.target_asset = None
|
||||||
|
if not target_item.has_batch_no:
|
||||||
|
self.target_batch_no = None
|
||||||
|
if not target_item.has_serial_no:
|
||||||
|
self.target_serial_no = ""
|
||||||
|
|
||||||
|
self.validate_item(target_item)
|
||||||
|
|
||||||
|
def validate_target_asset(self):
|
||||||
|
if self.target_is_fixed_asset and not self.target_asset:
|
||||||
|
frappe.throw(_("Target Asset is mandatory for Capitalization"))
|
||||||
|
|
||||||
|
if self.target_asset:
|
||||||
|
target_asset = self.get_asset_for_validation(self.target_asset)
|
||||||
|
|
||||||
|
if target_asset.item_code != self.target_item_code:
|
||||||
|
frappe.throw(_("Asset {0} does not belong to Item {1}").format(self.target_asset, self.target_item_code))
|
||||||
|
|
||||||
|
self.validate_asset(target_asset)
|
||||||
|
|
||||||
|
def validate_consumed_stock_item(self):
|
||||||
|
for d in self.stock_items:
|
||||||
|
if d.item_code:
|
||||||
|
item = frappe.get_cached_doc("Item", d.item_code)
|
||||||
|
|
||||||
|
if not item.is_stock_item:
|
||||||
|
frappe.throw(_("Row #{0}: Item {1} is not a stock item").format(d.idx, d.item_code))
|
||||||
|
|
||||||
|
if flt(d.stock_qty) <= 0:
|
||||||
|
frappe.throw(_("Row #{0}: Qty must be a positive number").format(d.idx))
|
||||||
|
|
||||||
|
self.validate_item(item)
|
||||||
|
|
||||||
|
def validate_consumed_asset_item(self):
|
||||||
|
for d in self.asset_items:
|
||||||
|
if d.asset:
|
||||||
|
if d.asset == self.target_asset:
|
||||||
|
frappe.throw(_("Row #{0}: Consumed Asset {1} cannot be the same as the Target Asset")
|
||||||
|
.format(d.idx, d.asset))
|
||||||
|
|
||||||
|
asset = self.get_asset_for_validation(d.asset)
|
||||||
|
self.validate_asset(asset)
|
||||||
|
|
||||||
|
def validate_service_item(self):
|
||||||
|
for d in self.service_items:
|
||||||
|
if d.item_code:
|
||||||
|
item = frappe.get_cached_doc("Item", d.item_code)
|
||||||
|
|
||||||
|
if item.is_stock_item or item.is_fixed_asset:
|
||||||
|
frappe.throw(_("Row #{0}: Item {1} is not a service item").format(d.idx, d.item_code))
|
||||||
|
|
||||||
|
if flt(d.qty) <= 0:
|
||||||
|
frappe.throw(_("Row #{0}: Qty must be a positive number").format(d.idx))
|
||||||
|
|
||||||
|
if flt(d.amount) <= 0:
|
||||||
|
frappe.throw(_("Row #{0}: Amount must be a positive number").format(d.idx))
|
||||||
|
|
||||||
|
self.validate_item(item)
|
||||||
|
|
||||||
|
if not d.cost_center:
|
||||||
|
d.cost_center = frappe.get_cached_value("Company", self.company, "cost_center")
|
||||||
|
|
||||||
|
def validate_item(self, item):
|
||||||
|
from erpnext.stock.doctype.item.item import validate_end_of_life
|
||||||
|
validate_end_of_life(item.name, item.end_of_life, item.disabled)
|
||||||
|
|
||||||
|
def get_asset_for_validation(self, asset):
|
||||||
|
return frappe.db.get_value("Asset", asset, ["name", "item_code", "company", "status", "docstatus"], as_dict=1)
|
||||||
|
|
||||||
|
def validate_asset(self, asset):
|
||||||
|
if asset.status in ("Draft", "Scrapped", "Sold"):
|
||||||
|
frappe.throw(_("Asset {0} is {1}").format(asset.name, asset.status))
|
||||||
|
|
||||||
|
if asset.docstatus == 0:
|
||||||
|
frappe.throw(_("Asset {0} is Draft").format(asset.name))
|
||||||
|
if asset.docstatus == 2:
|
||||||
|
frappe.throw(_("Asset {0} is cancelled").format(asset.name))
|
||||||
|
|
||||||
|
if asset.company != self.company:
|
||||||
|
frappe.throw(_("Asset {0} does not belong to company {1}").format(self.target_asset, self.company))
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
|
def set_warehouse_details(self):
|
||||||
|
for d in self.stock_items:
|
||||||
|
if d.item_code and d.warehouse:
|
||||||
|
args = self.get_args_for_incoming_rate(d)
|
||||||
|
warehouse_details = get_warehouse_details(args)
|
||||||
|
d.update(warehouse_details)
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
|
def set_asset_values(self):
|
||||||
|
for d in self.asset_items:
|
||||||
|
if d.asset:
|
||||||
|
d.asset_value = flt(get_current_asset_value(d.asset, self.finance_book))
|
||||||
|
|
||||||
|
def get_args_for_incoming_rate(self, item):
|
||||||
|
return frappe._dict({
|
||||||
|
"item_code": item.item_code,
|
||||||
|
"warehouse": item.warehouse,
|
||||||
|
"posting_date": self.posting_date,
|
||||||
|
"posting_time": self.posting_time,
|
||||||
|
"qty": -1 * flt(item.stock_qty),
|
||||||
|
"serial_no": item.serial_no,
|
||||||
|
"batch_no": item.batch_no,
|
||||||
|
"voucher_type": self.doctype,
|
||||||
|
"voucher_no": self.name,
|
||||||
|
"company": self.company,
|
||||||
|
"allow_zero_valuation": cint(item.get('allow_zero_valuation_rate')),
|
||||||
|
})
|
||||||
|
|
||||||
|
def calculate_totals(self):
|
||||||
|
self.stock_items_total = 0
|
||||||
|
self.asset_items_total = 0
|
||||||
|
self.service_items_total = 0
|
||||||
|
|
||||||
|
for d in self.stock_items:
|
||||||
|
d.amount = flt(flt(d.stock_qty) * flt(d.valuation_rate), d.precision('amount'))
|
||||||
|
self.stock_items_total += d.amount
|
||||||
|
|
||||||
|
for d in self.asset_items:
|
||||||
|
d.asset_value = flt(flt(d.asset_value), d.precision('asset_value'))
|
||||||
|
self.asset_items_total += d.asset_value
|
||||||
|
|
||||||
|
for d in self.service_items:
|
||||||
|
d.amount = flt(flt(d.qty) * flt(d.rate), d.precision('amount'))
|
||||||
|
self.service_items_total += d.amount
|
||||||
|
|
||||||
|
self.stock_items_total = flt(self.stock_items_total, self.precision('stock_items_total'))
|
||||||
|
self.asset_items_total = flt(self.asset_items_total, self.precision('asset_items_total'))
|
||||||
|
self.service_items_total = flt(self.service_items_total, self.precision('service_items_total'))
|
||||||
|
|
||||||
|
self.total_value = self.stock_items_total + self.asset_items_total + self.service_items_total
|
||||||
|
self.total_value = flt(self.total_value, self.precision('total_value'))
|
||||||
|
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
|
def get_target_item_details(item_code=None):
|
||||||
|
out = frappe._dict()
|
||||||
|
|
||||||
|
# Get Item Details
|
||||||
|
item = frappe._dict()
|
||||||
|
if item_code:
|
||||||
|
item = frappe.get_cached_doc("Item", item_code)
|
||||||
|
|
||||||
|
# Set Item Details
|
||||||
|
out.target_item_name = item.item_name
|
||||||
|
out.target_stock_uom = item.stock_uom
|
||||||
|
out.target_is_fixed_asset = cint(item.is_fixed_asset)
|
||||||
|
out.target_has_batch_no = cint(item.has_batch_no)
|
||||||
|
out.target_has_serial_no = cint(item.has_serial_no)
|
||||||
|
|
||||||
|
if out.target_is_fixed_asset:
|
||||||
|
out.target_qty = 1
|
||||||
|
out.target_warehouse = None
|
||||||
|
else:
|
||||||
|
out.target_asset = None
|
||||||
|
|
||||||
|
if not out.target_has_batch_no:
|
||||||
|
out.target_batch_no = None
|
||||||
|
if not out.target_has_serial_no:
|
||||||
|
out.target_serial_no = ""
|
||||||
|
|
||||||
|
# Set Entry Type
|
||||||
|
if not item_code:
|
||||||
|
out.entry_type = ""
|
||||||
|
elif out.target_is_fixed_asset:
|
||||||
|
out.entry_type = "Capitalization"
|
||||||
|
else:
|
||||||
|
out.entry_type = "Decapitalization"
|
||||||
|
|
||||||
|
return out
|
||||||
|
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
|
def get_target_asset_details(asset=None):
|
||||||
|
out = frappe._dict()
|
||||||
|
|
||||||
|
# Get Asset Details
|
||||||
|
asset_details = frappe._dict()
|
||||||
|
if asset:
|
||||||
|
asset_details = frappe.db.get_value("Asset", asset, ['asset_name', 'item_code'], as_dict=1)
|
||||||
|
if not asset_details:
|
||||||
|
frappe.throw(_("Asset {0} does not exist").format(asset))
|
||||||
|
|
||||||
|
# Re-set item code from Asset
|
||||||
|
out.target_item_code = asset_details.item_code
|
||||||
|
|
||||||
|
# Set Asset Details
|
||||||
|
out.asset_name = asset_details.asset_name
|
||||||
|
|
||||||
|
return out
|
||||||
|
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
|
def get_consumed_stock_item_details(args, get_valuation_rate=True):
|
||||||
|
if isinstance(args, string_types):
|
||||||
|
args = json.loads(args)
|
||||||
|
|
||||||
|
args = frappe._dict(args)
|
||||||
|
out = frappe._dict()
|
||||||
|
|
||||||
|
item = frappe._dict()
|
||||||
|
if args.item_code:
|
||||||
|
item = frappe.get_cached_doc("Item", args.item_code)
|
||||||
|
|
||||||
|
out.item_name = item.item_name
|
||||||
|
out.batch_no = None
|
||||||
|
out.serial_no = ""
|
||||||
|
|
||||||
|
out.stock_qty = flt(args.stock_qty) or 1
|
||||||
|
out.stock_uom = item.stock_uom
|
||||||
|
|
||||||
|
out.warehouse = get_item_warehouse(item, args, overwrite_warehouse=True) if item else None
|
||||||
|
|
||||||
|
if get_valuation_rate:
|
||||||
|
if args.item_code and out.warehouse:
|
||||||
|
incoming_rate_args = frappe._dict({
|
||||||
|
'item_code': args.item_code,
|
||||||
|
'warehouse': out.warehouse,
|
||||||
|
'posting_date': args.posting_date,
|
||||||
|
'posting_time': args.posting_time,
|
||||||
|
'qty': -1 * flt(out.stock_qty),
|
||||||
|
"voucher_type": args.doctype,
|
||||||
|
"voucher_no": args.name,
|
||||||
|
"company": args.company,
|
||||||
|
})
|
||||||
|
out.update(get_warehouse_details(incoming_rate_args))
|
||||||
|
else:
|
||||||
|
out.valuation_rate = 0
|
||||||
|
out.actual_qty = 0
|
||||||
|
|
||||||
|
return out
|
||||||
|
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
|
def get_warehouse_details(args):
|
||||||
|
if isinstance(args, string_types):
|
||||||
|
args = json.loads(args)
|
||||||
|
|
||||||
|
args = frappe._dict(args)
|
||||||
|
|
||||||
|
out = {}
|
||||||
|
if args.warehouse and args.item_code:
|
||||||
|
out = {
|
||||||
|
"actual_qty": get_previous_sle(args).get("qty_after_transaction") or 0,
|
||||||
|
"valuation_rate": get_incoming_rate(args, raise_error_if_no_rate=False)
|
||||||
|
}
|
||||||
|
return out
|
||||||
|
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
|
def get_consumed_asset_details(args, get_asset_value=True):
|
||||||
|
if isinstance(args, string_types):
|
||||||
|
args = json.loads(args)
|
||||||
|
|
||||||
|
args = frappe._dict(args)
|
||||||
|
out = frappe._dict()
|
||||||
|
|
||||||
|
asset_details = frappe._dict()
|
||||||
|
if args.asset:
|
||||||
|
asset_details = frappe.db.get_value("Asset", args.asset, ['asset_name', 'item_code', 'item_name'], as_dict=1)
|
||||||
|
if not asset_details:
|
||||||
|
frappe.throw(_("Asset {0} does not exist").format(args.asset))
|
||||||
|
|
||||||
|
out.item_code = asset_details.item_code
|
||||||
|
out.asset_name = asset_details.asset_name
|
||||||
|
out.item_name = asset_details.item_name
|
||||||
|
|
||||||
|
if get_asset_value:
|
||||||
|
if args.asset:
|
||||||
|
out.asset_value = flt(get_current_asset_value(args.asset, finance_book=args.finance_book))
|
||||||
|
else:
|
||||||
|
out.asset_value = 0
|
||||||
|
|
||||||
|
return out
|
||||||
|
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
|
def get_service_item_details(args):
|
||||||
|
if isinstance(args, string_types):
|
||||||
|
args = json.loads(args)
|
||||||
|
|
||||||
|
args = frappe._dict(args)
|
||||||
|
out = frappe._dict()
|
||||||
|
|
||||||
|
item = frappe._dict()
|
||||||
|
if args.item_code:
|
||||||
|
item = frappe.get_cached_doc("Item", args.item_code)
|
||||||
|
|
||||||
|
out.item_name = item.item_name
|
||||||
|
out.qty = flt(args.qty) or 1
|
||||||
|
out.uom = item.purchase_uom or item.stock_uom
|
||||||
|
|
||||||
|
item_defaults = get_item_defaults(item.name, args.company)
|
||||||
|
item_group_defaults = get_item_group_defaults(item.name, args.company)
|
||||||
|
brand_defaults = get_brand_defaults(item.name, args.company)
|
||||||
|
|
||||||
|
out.expense_account = get_default_expense_account(args, item_defaults, item_group_defaults, brand_defaults)
|
||||||
|
out.cost_center = get_default_cost_center(args, item_defaults, item_group_defaults, brand_defaults)
|
||||||
|
|
||||||
|
return out
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
# Copyright (c) 2021, Frappe Technologies Pvt. Ltd. and Contributors
|
||||||
|
# See license.txt
|
||||||
|
|
||||||
|
# import frappe
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
class TestAssetCapitalization(unittest.TestCase):
|
||||||
|
pass
|
||||||
@@ -0,0 +1,85 @@
|
|||||||
|
{
|
||||||
|
"actions": [],
|
||||||
|
"creation": "2021-09-05 15:52:10.124538",
|
||||||
|
"doctype": "DocType",
|
||||||
|
"editable_grid": 1,
|
||||||
|
"engine": "InnoDB",
|
||||||
|
"field_order": [
|
||||||
|
"asset",
|
||||||
|
"asset_name",
|
||||||
|
"column_break_3",
|
||||||
|
"item_code",
|
||||||
|
"item_name",
|
||||||
|
"section_break_6",
|
||||||
|
"asset_value",
|
||||||
|
"column_break_9"
|
||||||
|
],
|
||||||
|
"fields": [
|
||||||
|
{
|
||||||
|
"fieldname": "asset",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"in_list_view": 1,
|
||||||
|
"label": "Asset",
|
||||||
|
"options": "Asset",
|
||||||
|
"reqd": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fetch_from": "asset.asset_name",
|
||||||
|
"fieldname": "asset_name",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"in_list_view": 1,
|
||||||
|
"label": "Asset Name",
|
||||||
|
"read_only": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "column_break_3",
|
||||||
|
"fieldtype": "Column Break"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fetch_from": "asset.item_code",
|
||||||
|
"fieldname": "item_code",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"in_list_view": 1,
|
||||||
|
"label": "Item Code",
|
||||||
|
"options": "Item",
|
||||||
|
"read_only": 1,
|
||||||
|
"reqd": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "item_name",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"label": "Item Name",
|
||||||
|
"read_only": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "section_break_6",
|
||||||
|
"fieldtype": "Section Break",
|
||||||
|
"label": "Value"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"default": "0",
|
||||||
|
"fieldname": "asset_value",
|
||||||
|
"fieldtype": "Currency",
|
||||||
|
"in_list_view": 1,
|
||||||
|
"label": "Asset Value",
|
||||||
|
"options": "Company:company:default_currency",
|
||||||
|
"read_only": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "column_break_9",
|
||||||
|
"fieldtype": "Column Break"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"index_web_pages_for_search": 1,
|
||||||
|
"istable": 1,
|
||||||
|
"links": [],
|
||||||
|
"modified": "2021-09-06 13:46:04.892863",
|
||||||
|
"modified_by": "Administrator",
|
||||||
|
"module": "Assets",
|
||||||
|
"name": "Asset Capitalization Asset Item",
|
||||||
|
"owner": "Administrator",
|
||||||
|
"permissions": [],
|
||||||
|
"sort_field": "modified",
|
||||||
|
"sort_order": "DESC",
|
||||||
|
"track_changes": 1
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
# Copyright (c) 2021, Frappe Technologies Pvt. Ltd. and contributors
|
||||||
|
# For license information, please see license.txt
|
||||||
|
|
||||||
|
# import frappe
|
||||||
|
from frappe.model.document import Document
|
||||||
|
|
||||||
|
class AssetCapitalizationAssetItem(Document):
|
||||||
|
pass
|
||||||
@@ -0,0 +1,129 @@
|
|||||||
|
{
|
||||||
|
"actions": [],
|
||||||
|
"creation": "2021-09-06 13:32:08.642060",
|
||||||
|
"doctype": "DocType",
|
||||||
|
"editable_grid": 1,
|
||||||
|
"engine": "InnoDB",
|
||||||
|
"field_order": [
|
||||||
|
"item_code",
|
||||||
|
"item_name",
|
||||||
|
"column_break_3",
|
||||||
|
"expense_account",
|
||||||
|
"section_break_6",
|
||||||
|
"qty",
|
||||||
|
"uom",
|
||||||
|
"column_break_9",
|
||||||
|
"rate",
|
||||||
|
"amount",
|
||||||
|
"accounting_dimensions_section",
|
||||||
|
"cost_center",
|
||||||
|
"dimension_col_break",
|
||||||
|
"project"
|
||||||
|
],
|
||||||
|
"fields": [
|
||||||
|
{
|
||||||
|
"bold": 1,
|
||||||
|
"fieldname": "item_code",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"in_list_view": 1,
|
||||||
|
"label": "Item Code",
|
||||||
|
"options": "Item"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fetch_from": "item_code.item_name",
|
||||||
|
"fieldname": "item_name",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"label": "Item Name",
|
||||||
|
"read_only": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "column_break_3",
|
||||||
|
"fieldtype": "Column Break"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "expense_account",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"in_list_view": 1,
|
||||||
|
"label": "Expense Account",
|
||||||
|
"options": "Account",
|
||||||
|
"reqd": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "section_break_6",
|
||||||
|
"fieldtype": "Section Break",
|
||||||
|
"label": "Qty and Rate"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"columns": 1,
|
||||||
|
"default": "1",
|
||||||
|
"fieldname": "qty",
|
||||||
|
"fieldtype": "Float",
|
||||||
|
"in_list_view": 1,
|
||||||
|
"label": "Qty",
|
||||||
|
"non_negative": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"columns": 1,
|
||||||
|
"fetch_from": "stock_item_code.stock_uom",
|
||||||
|
"fieldname": "uom",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"in_list_view": 1,
|
||||||
|
"label": "UOM",
|
||||||
|
"options": "UOM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "column_break_9",
|
||||||
|
"fieldtype": "Column Break"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "rate",
|
||||||
|
"fieldtype": "Currency",
|
||||||
|
"in_list_view": 1,
|
||||||
|
"label": "Rate",
|
||||||
|
"options": "Company:company:default_currency"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"default": "0",
|
||||||
|
"fieldname": "amount",
|
||||||
|
"fieldtype": "Currency",
|
||||||
|
"in_list_view": 1,
|
||||||
|
"label": "Amount",
|
||||||
|
"options": "Company:company:default_currency",
|
||||||
|
"read_only": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"collapsible": 1,
|
||||||
|
"fieldname": "accounting_dimensions_section",
|
||||||
|
"fieldtype": "Section Break",
|
||||||
|
"label": "Accounting Dimensions"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "cost_center",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"label": "Cost Center",
|
||||||
|
"options": "Cost Center"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "dimension_col_break",
|
||||||
|
"fieldtype": "Column Break"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "project",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"label": "Project",
|
||||||
|
"options": "Project"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"index_web_pages_for_search": 1,
|
||||||
|
"istable": 1,
|
||||||
|
"links": [],
|
||||||
|
"modified": "2021-09-06 14:06:34.768152",
|
||||||
|
"modified_by": "Administrator",
|
||||||
|
"module": "Assets",
|
||||||
|
"name": "Asset Capitalization Service Item",
|
||||||
|
"owner": "Administrator",
|
||||||
|
"permissions": [],
|
||||||
|
"sort_field": "modified",
|
||||||
|
"sort_order": "DESC",
|
||||||
|
"track_changes": 1
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
# Copyright (c) 2021, Frappe Technologies Pvt. Ltd. and contributors
|
||||||
|
# For license information, please see license.txt
|
||||||
|
|
||||||
|
# import frappe
|
||||||
|
from frappe.model.document import Document
|
||||||
|
|
||||||
|
class AssetCapitalizationServiceItem(Document):
|
||||||
|
pass
|
||||||
@@ -0,0 +1,137 @@
|
|||||||
|
{
|
||||||
|
"actions": [],
|
||||||
|
"creation": "2021-09-05 15:23:23.492310",
|
||||||
|
"doctype": "DocType",
|
||||||
|
"editable_grid": 1,
|
||||||
|
"engine": "InnoDB",
|
||||||
|
"field_order": [
|
||||||
|
"item_code",
|
||||||
|
"item_name",
|
||||||
|
"column_break_3",
|
||||||
|
"warehouse",
|
||||||
|
"section_break_6",
|
||||||
|
"stock_qty",
|
||||||
|
"stock_uom",
|
||||||
|
"actual_qty",
|
||||||
|
"column_break_9",
|
||||||
|
"valuation_rate",
|
||||||
|
"amount",
|
||||||
|
"batch_and_serial_no_section",
|
||||||
|
"batch_no",
|
||||||
|
"column_break_13",
|
||||||
|
"serial_no"
|
||||||
|
],
|
||||||
|
"fields": [
|
||||||
|
{
|
||||||
|
"fieldname": "column_break_3",
|
||||||
|
"fieldtype": "Column Break"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "warehouse",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"in_list_view": 1,
|
||||||
|
"label": "Warehouse",
|
||||||
|
"options": "Warehouse",
|
||||||
|
"reqd": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "batch_no",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"label": "Batch No",
|
||||||
|
"options": "Batch"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "section_break_6",
|
||||||
|
"fieldtype": "Section Break",
|
||||||
|
"label": "Qty and Rate"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"columns": 1,
|
||||||
|
"fieldname": "stock_qty",
|
||||||
|
"fieldtype": "Float",
|
||||||
|
"in_list_view": 1,
|
||||||
|
"label": "Qty",
|
||||||
|
"non_negative": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"columns": 1,
|
||||||
|
"fetch_from": "stock_item_code.stock_uom",
|
||||||
|
"fieldname": "stock_uom",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"in_list_view": 1,
|
||||||
|
"label": "Stock UOM",
|
||||||
|
"options": "UOM",
|
||||||
|
"read_only": 1,
|
||||||
|
"reqd": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "column_break_9",
|
||||||
|
"fieldtype": "Column Break"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "valuation_rate",
|
||||||
|
"fieldtype": "Currency",
|
||||||
|
"in_list_view": 1,
|
||||||
|
"label": "Valuation Rate",
|
||||||
|
"options": "Company:company:default_currency",
|
||||||
|
"read_only": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"default": "0",
|
||||||
|
"fieldname": "amount",
|
||||||
|
"fieldtype": "Currency",
|
||||||
|
"in_list_view": 1,
|
||||||
|
"label": "Amount",
|
||||||
|
"options": "Company:company:default_currency",
|
||||||
|
"read_only": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "batch_and_serial_no_section",
|
||||||
|
"fieldtype": "Section Break",
|
||||||
|
"label": "Batch and Serial No"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "column_break_13",
|
||||||
|
"fieldtype": "Column Break"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "serial_no",
|
||||||
|
"fieldtype": "Small Text",
|
||||||
|
"label": "Serial No"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "item_code",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"in_list_view": 1,
|
||||||
|
"label": "Item Code",
|
||||||
|
"options": "Item",
|
||||||
|
"reqd": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fetch_from": "item_code.item_name",
|
||||||
|
"fieldname": "item_name",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"label": "Item Name",
|
||||||
|
"read_only": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "actual_qty",
|
||||||
|
"fieldtype": "Float",
|
||||||
|
"label": "Actual Qty in Warehouse",
|
||||||
|
"no_copy": 1,
|
||||||
|
"read_only": 1
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"index_web_pages_for_search": 1,
|
||||||
|
"istable": 1,
|
||||||
|
"links": [],
|
||||||
|
"modified": "2021-09-06 13:46:13.579140",
|
||||||
|
"modified_by": "Administrator",
|
||||||
|
"module": "Assets",
|
||||||
|
"name": "Asset Capitalization Stock Item",
|
||||||
|
"owner": "Administrator",
|
||||||
|
"permissions": [],
|
||||||
|
"sort_field": "modified",
|
||||||
|
"sort_order": "DESC",
|
||||||
|
"track_changes": 1
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
# Copyright (c) 2021, Frappe Technologies Pvt. Ltd. and contributors
|
||||||
|
# For license information, please see license.txt
|
||||||
|
|
||||||
|
# import frappe
|
||||||
|
from frappe.model.document import Document
|
||||||
|
|
||||||
|
class AssetCapitalizationStockItem(Document):
|
||||||
|
pass
|
||||||
@@ -137,6 +137,17 @@
|
|||||||
"onboard": 0,
|
"onboard": 0,
|
||||||
"type": "Link"
|
"type": "Link"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"dependencies": "Asset",
|
||||||
|
"hidden": 0,
|
||||||
|
"is_query_report": 0,
|
||||||
|
"label": "Asset Capitalization",
|
||||||
|
"link_count": 0,
|
||||||
|
"link_to": "Asset Capitalization",
|
||||||
|
"link_type": "DocType",
|
||||||
|
"onboard": 0,
|
||||||
|
"type": "Link"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
"is_query_report": 0,
|
"is_query_report": 0,
|
||||||
@@ -179,7 +190,7 @@
|
|||||||
"type": "Link"
|
"type": "Link"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"modified": "2021-08-05 12:15:54.839452",
|
"modified": "2021-09-06 16:59:02.668813",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Assets",
|
"module": "Assets",
|
||||||
"name": "Assets",
|
"name": "Assets",
|
||||||
|
|||||||
Reference in New Issue
Block a user