fix: Modify depreciation schedule when increase_in_asset_life is not a multiple of frequency_of_depreciation)
diff --git a/erpnext/assets/doctype/asset/asset.js b/erpnext/assets/doctype/asset/asset.js
index 2a57183..1e67ec8 100644
--- a/erpnext/assets/doctype/asset/asset.js
+++ b/erpnext/assets/doctype/asset/asset.js
@@ -132,7 +132,6 @@
}, __("Manage"));
}
- frm.page.set_inner_btn_group_as_primary(__("Manage"));
frm.trigger("setup_chart");
}
diff --git a/erpnext/assets/doctype/asset/asset.json b/erpnext/assets/doctype/asset/asset.json
index 421b9a6..8a0e3ad 100644
--- a/erpnext/assets/doctype/asset/asset.json
+++ b/erpnext/assets/doctype/asset/asset.json
@@ -23,6 +23,7 @@
"asset_name",
"asset_category",
"location",
+ "asset_value",
"custodian",
"department",
"disposal_date",
@@ -53,6 +54,8 @@
"next_depreciation_date",
"section_break_14",
"schedules",
+ "to_date",
+ "edit_dates",
"insurance_details",
"policy_number",
"insurer",
@@ -480,6 +483,24 @@
"fieldname": "section_break_36",
"fieldtype": "Section Break",
"label": "Finance Books"
+ },
+ {
+ "fieldname": "asset_value",
+ "fieldtype": "Currency",
+ "label": "Asset Value",
+ "read_only": 1
+ },
+ {
+ "fieldname": "to_date",
+ "fieldtype": "Date",
+ "hidden": 1,
+ "label": "To Date"
+ },
+ {
+ "fieldname": "edit_dates",
+ "fieldtype": "Data",
+ "hidden": 1,
+ "label": "Edit Dates"
}
],
"idx": 72,
@@ -502,7 +523,7 @@
"link_fieldname": "asset"
}
],
- "modified": "2021-01-22 12:38:59.091510",
+ "modified": "2021-05-21 12:05:29.424083",
"modified_by": "Administrator",
"module": "Assets",
"name": "Asset",
diff --git a/erpnext/assets/doctype/asset/asset.py b/erpnext/assets/doctype/asset/asset.py
index 456649f..e8cfe0a 100644
--- a/erpnext/assets/doctype/asset/asset.py
+++ b/erpnext/assets/doctype/asset/asset.py
@@ -96,6 +96,9 @@
finance_books = get_item_details(self.item_code, self.asset_category)
self.set('finance_books', finance_books)
+ if not(self.asset_value):
+ self.asset_value = self.gross_purchase_amount
+
def validate_asset_values(self):
if not self.asset_category:
self.asset_category = frappe.get_cached_value("Item", self.item_code, "asset_category")
@@ -168,15 +171,23 @@
d.precision("rate_of_depreciation"))
def make_depreciation_schedule(self):
- if 'Manual' not in [d.depreciation_method for d in self.finance_books]:
+ if 'Manual' not in [d.depreciation_method for d in self.finance_books] and not self.schedules:
self.schedules = []
- if self.get("schedules") or not self.available_for_use_date:
+ if not self.available_for_use_date:
return
for d in self.get('finance_books'):
self.validate_asset_finance_books(d)
+ start = 0
+ for n in range (len(self.schedules)):
+ if not self.schedules[n].journal_entry:
+ print("*"*100)
+ del self.schedules[n:]
+ start = n
+ break
+
value_after_depreciation = (flt(self.gross_purchase_amount) -
flt(self.opening_accumulated_depreciation))
@@ -189,9 +200,9 @@
if has_pro_rata:
number_of_pending_depreciations += 1
-
+
skip_row = False
- for n in range(number_of_pending_depreciations):
+ for n in range(start, number_of_pending_depreciations):
# If depreciation is already completed (for double declining balance)
if skip_row: continue
@@ -216,11 +227,12 @@
# For last row
elif has_pro_rata and n == cint(number_of_pending_depreciations) - 1:
- to_date = add_months(self.available_for_use_date,
- n * cint(d.frequency_of_depreciation))
+ if not self.edit_dates:
+ self.to_date = add_months(self.available_for_use_date,
+ n * cint(d.frequency_of_depreciation))
- depreciation_amount, days, months = self.get_pro_rata_amt(d,
- depreciation_amount, schedule_date, to_date)
+ depreciation_amount, days, months = get_pro_rata_amt(d,
+ depreciation_amount, schedule_date, self.to_date)
monthly_schedule_date = add_months(schedule_date, 1)
@@ -346,11 +358,12 @@
if d.finance_book_id not in finance_books:
accumulated_depreciation = flt(self.opening_accumulated_depreciation)
value_after_depreciation = flt(self.get_value_after_depreciation(d.finance_book_id))
- finance_books.append(d.finance_book_id)
+ finance_books.append(int(d.finance_book_id))
depreciation_amount = flt(d.depreciation_amount, d.precision("depreciation_amount"))
value_after_depreciation -= flt(depreciation_amount)
+ # for the last row, if depreciation method = Straight Line
if straight_line_idx and i == max(straight_line_idx) - 1:
book = self.get('finance_books')[cint(d.finance_book_id) - 1]
depreciation_amount += flt(value_after_depreciation -
diff --git a/erpnext/assets/doctype/asset_maintenance/asset_maintenance.js b/erpnext/assets/doctype/asset_maintenance/asset_maintenance.js
index 70b8654..3830d11 100644
--- a/erpnext/assets/doctype/asset_maintenance/asset_maintenance.js
+++ b/erpnext/assets/doctype/asset_maintenance/asset_maintenance.js
@@ -30,7 +30,10 @@
if(!frm.is_new()) {
frm.trigger('make_dashboard');
}
+
+ frm.toggle_display(['stock_consumption_details_section'], frm.doc.stock_consumption)
},
+
make_dashboard: (frm) => {
if(!frm.is_new()) {
frappe.call({
diff --git a/erpnext/assets/doctype/asset_maintenance/asset_maintenance.json b/erpnext/assets/doctype/asset_maintenance/asset_maintenance.json
index c0c2566..da2fd75 100644
--- a/erpnext/assets/doctype/asset_maintenance/asset_maintenance.json
+++ b/erpnext/assets/doctype/asset_maintenance/asset_maintenance.json
@@ -12,13 +12,17 @@
"column_break_3",
"item_code",
"item_name",
+ "stock_consumption",
"section_break_6",
"maintenance_team",
"column_break_9",
"maintenance_manager",
"maintenance_manager_name",
"section_break_8",
- "asset_maintenance_tasks"
+ "asset_maintenance_tasks",
+ "stock_consumption_details_section",
+ "warehouse",
+ "stock_items"
],
"fields": [
{
@@ -100,10 +104,33 @@
"label": "Maintenance Tasks",
"options": "Asset Maintenance Task",
"reqd": 1
+ },
+ {
+ "default": "0",
+ "fieldname": "stock_consumption",
+ "fieldtype": "Check",
+ "label": "Stock Consumed During Maintenance"
+ },
+ {
+ "fieldname": "stock_consumption_details_section",
+ "fieldtype": "Section Break",
+ "label": "Stock Consumption Details"
+ },
+ {
+ "fieldname": "warehouse",
+ "fieldtype": "Link",
+ "label": "Warehouse",
+ "options": "Warehouse"
+ },
+ {
+ "fieldname": "stock_items",
+ "fieldtype": "Table",
+ "label": "Stock Items",
+ "options": "Stock Item"
}
],
"links": [],
- "modified": "2020-05-28 20:28:32.993823",
+ "modified": "2021-05-13 05:24:58.480132",
"modified_by": "Administrator",
"module": "Assets",
"name": "Asset Maintenance",
diff --git a/erpnext/assets/doctype/asset_maintenance/asset_maintenance.py b/erpnext/assets/doctype/asset_maintenance/asset_maintenance.py
index a506dee..e3e654c 100644
--- a/erpnext/assets/doctype/asset_maintenance/asset_maintenance.py
+++ b/erpnext/assets/doctype/asset_maintenance/asset_maintenance.py
@@ -19,10 +19,45 @@
if not task.assign_to and self.docstatus == 0:
throw(_("Row #{}: Please asign task to a member.").format(task.idx))
+ if self.stock_consumption:
+ self.check_for_stock_items_and_warehouse()
+ self.increase_asset_value()
+ self.decrease_stock_quantity()
+
def on_update(self):
for task in self.get('asset_maintenance_tasks'):
assign_tasks(self.name, task.assign_to, task.maintenance_task, task.next_due_date)
- self.sync_maintenance_tasks()
+ self.sync_maintenance_tasks()
+
+ def check_for_stock_items_and_warehouse(self):
+ if self.stock_consumption:
+ if not self.stock_items:
+ frappe.throw(_("Please enter Stock Items consumed during Asset Maintenance."))
+ if not self.warehouse:
+ frappe.throw(_("Please enter Warehouse from which Stock Items consumed during Asset Maintenance were taken."))
+
+ def increase_asset_value(self):
+ asset_value = frappe.db.get_value('Asset', self.asset_name, 'asset_value')
+ for item in self.stock_items:
+ asset_value += item.total_value
+
+ frappe.db.set_value('Asset', self.asset_name, 'asset_value', asset_value)
+
+ def decrease_stock_quantity(self):
+ stock_entry = frappe.get_doc({
+ "doctype": "Stock Entry",
+ "stock_entry_type": "Material Issue"
+ })
+
+ for stock_item in self.stock_items:
+ stock_entry.append('items', {
+ "s_warehouse": self.warehouse,
+ "item_code": stock_item.item,
+ "qty": stock_item.consumed_quantity
+ })
+
+ stock_entry.insert()
+ stock_entry.submit()
def sync_maintenance_tasks(self):
tasks_names = []
diff --git a/erpnext/assets/doctype/asset_repair/asset_repair.js b/erpnext/assets/doctype/asset_repair/asset_repair.js
index f5eeeda..7633a59 100644
--- a/erpnext/assets/doctype/asset_repair/asset_repair.js
+++ b/erpnext/assets/doctype/asset_repair/asset_repair.js
@@ -3,7 +3,16 @@
frappe.ui.form.on('Asset Repair', {
refresh: function(frm) {
- frm.toggle_display(['completion_date', 'repair_status'], !(frm.doc.__islocal));
+ frm.toggle_display(['completion_date', 'repair_status', 'accounting_details', 'accounting_dimensions_section'], !(frm.doc.__islocal));
+
+ if (frm.doc.docstatus) {
+ frm.add_custom_button("View General Ledger", function() {
+ frappe.route_options = {
+ "voucher_no": frm.doc.name
+ };
+ frappe.set_route("query-report", "General Ledger");
+ });
+ }
},
repair_status: (frm) => {
diff --git a/erpnext/assets/doctype/asset_repair/asset_repair.json b/erpnext/assets/doctype/asset_repair/asset_repair.json
index 4ed9916..522f287 100644
--- a/erpnext/assets/doctype/asset_repair/asset_repair.json
+++ b/erpnext/assets/doctype/asset_repair/asset_repair.json
@@ -13,20 +13,30 @@
"asset_name",
"section_break_5",
"failure_date",
- "assign_to",
- "assign_to_name",
+ "repair_status",
"column_break_6",
"completion_date",
- "repair_status",
- "section_break_7",
+ "accounting_dimensions_section",
+ "cost_center",
+ "column_break_14",
+ "project",
+ "accounting_details",
"repair_cost",
+ "capitalize_repair_cost",
+ "stock_consumption",
"column_break_8",
- "payable_account",
+ "total_repair_cost",
+ "purchase_invoice",
+ "stock_consumption_details_section",
+ "warehouse",
+ "stock_items",
+ "asset_depreciation_details_section",
+ "increase_in_asset_life",
"section_break_9",
"description",
"column_break_9",
"actions_performed",
- "section_break_17",
+ "section_break_23",
"downtime",
"column_break_19",
"amended_from"
@@ -56,20 +66,6 @@
"reqd": 1
},
{
- "allow_on_submit": 1,
- "fieldname": "assign_to",
- "fieldtype": "Link",
- "label": "Assign To",
- "options": "User"
- },
- {
- "allow_on_submit": 1,
- "fetch_from": "assign_to.full_name",
- "fieldname": "assign_to_name",
- "fieldtype": "Read Only",
- "label": "Assign To Name"
- },
- {
"fieldname": "column_break_6",
"fieldtype": "Column Break"
},
@@ -111,10 +107,6 @@
"label": "Actions performed"
},
{
- "fieldname": "section_break_17",
- "fieldtype": "Section Break"
- },
- {
"allow_on_submit": 1,
"fieldname": "downtime",
"fieldtype": "Data",
@@ -151,30 +143,103 @@
"reqd": 1
},
{
+ "fetch_from": "asset.asset_name",
"fieldname": "asset_name",
"fieldtype": "Read Only",
"label": "Asset Name"
},
{
- "fieldname": "payable_account",
- "fieldtype": "Link",
- "label": "Payable Account",
- "options": "Account"
+ "fieldname": "column_break_8",
+ "fieldtype": "Column Break"
},
{
- "fieldname": "section_break_7",
+ "default": "0",
+ "fieldname": "capitalize_repair_cost",
+ "fieldtype": "Check",
+ "label": "Capitalize Repair Cost"
+ },
+ {
+ "fieldname": "accounting_details",
"fieldtype": "Section Break",
"label": "Accounting Details"
},
{
- "fieldname": "column_break_8",
+ "fieldname": "stock_items",
+ "fieldtype": "Table",
+ "label": "Stock Items",
+ "options": "Stock Item"
+ },
+ {
+ "fieldname": "section_break_23",
+ "fieldtype": "Section Break"
+ },
+ {
+ "fieldname": "accounting_dimensions_section",
+ "fieldtype": "Section Break",
+ "label": "Accounting Dimensions"
+ },
+ {
+ "fieldname": "cost_center",
+ "fieldtype": "Link",
+ "label": "Cost Center",
+ "options": "Cost Center"
+ },
+ {
+ "fieldname": "project",
+ "fieldtype": "Link",
+ "label": "Project",
+ "options": "Project"
+ },
+ {
+ "fieldname": "column_break_14",
"fieldtype": "Column Break"
+ },
+ {
+ "default": "0",
+ "fieldname": "stock_consumption",
+ "fieldtype": "Check",
+ "label": "Stock Consumed During Repair"
+ },
+ {
+ "depends_on": "stock_consumption",
+ "fieldname": "stock_consumption_details_section",
+ "fieldtype": "Section Break",
+ "label": "Stock Consumption Details"
+ },
+ {
+ "depends_on": "stock_consumption",
+ "fieldname": "total_repair_cost",
+ "fieldtype": "Currency",
+ "label": "Total Repair Cost"
+ },
+ {
+ "fieldname": "warehouse",
+ "fieldtype": "Link",
+ "label": "Warehouse",
+ "options": "Warehouse"
+ },
+ {
+ "depends_on": "capitalize_repair_cost",
+ "fieldname": "asset_depreciation_details_section",
+ "fieldtype": "Section Break",
+ "label": "Asset Depreciation Details"
+ },
+ {
+ "fieldname": "increase_in_asset_life",
+ "fieldtype": "Int",
+ "label": "Increase In Asset Life(Months)"
+ },
+ {
+ "fieldname": "purchase_invoice",
+ "fieldtype": "Link",
+ "label": "Purchase Invoice",
+ "options": "Purchase Invoice"
}
],
"index_web_pages_for_search": 1,
"is_submittable": 1,
"links": [],
- "modified": "2021-05-11 05:11:58.330860",
+ "modified": "2021-05-21 10:37:35.002238",
"modified_by": "Administrator",
"module": "Assets",
"name": "Asset Repair",
diff --git a/erpnext/assets/doctype/asset_repair/asset_repair.py b/erpnext/assets/doctype/asset_repair/asset_repair.py
index 884dc19..8fd019f 100644
--- a/erpnext/assets/doctype/asset_repair/asset_repair.py
+++ b/erpnext/assets/doctype/asset_repair/asset_repair.py
@@ -5,19 +5,172 @@
from __future__ import unicode_literals
import frappe
from frappe import _
-from frappe.utils import time_diff_in_hours
+from frappe.utils import time_diff_in_hours, getdate, add_days, date_diff, add_months, flt, cint
from frappe.model.document import Document
+from erpnext.accounts.general_ledger import make_gl_entries
class AssetRepair(Document):
def validate(self):
if self.repair_status == "Completed" and not self.completion_date:
frappe.throw(_("Please select Completion Date for Completed Repair"))
+ self.update_status()
+ self.set_total_value() # change later
+ self.calculate_total_repair_cost()
+
+ def update_status(self):
if self.repair_status == 'Pending':
frappe.db.set_value('Asset', self.asset, 'status', 'Out of Order')
else:
- frappe.db.set_value('Asset', self.asset, 'status', 'Submitted')
+ asset = frappe.get_doc('Asset', self.asset)
+ asset.set_status()
+ def set_total_value(self):
+ for item in self.stock_items:
+ item.total_value = flt(item.valuation_rate) * flt(item.consumed_quantity)
+
+ def calculate_total_repair_cost(self):
+ self.total_repair_cost = self.repair_cost
+ if self.stock_consumption:
+ for item in self.stock_items:
+ self.total_repair_cost += item.total_value
+
+ def on_submit(self):
+ self.check_repair_status()
+ self.check_for_cost_center()
+
+ if self.stock_consumption or self.capitalize_repair_cost:
+ self.increase_asset_value()
+ if self.stock_consumption:
+ self.check_for_stock_items_and_warehouse()
+ self.decrease_stock_quantity()
+ if self.capitalize_repair_cost:
+ self.check_for_purchase_invoice()
+ self.make_gl_entries()
+ self.modify_depreciation_schedule()
+
+ def check_repair_status(self):
+ if self.repair_status == "Pending":
+ frappe.throw(_("Please update Repair Status."))
+
+ def check_for_stock_items_and_warehouse(self):
+ if not self.stock_items:
+ frappe.throw(_("Please enter Stock Items consumed during Asset Repair."))
+ if not self.warehouse:
+ frappe.throw(_("Please enter Warehouse from which Stock Items consumed during Asset Repair were taken."))
+
+ def check_for_cost_center(self):
+ if not self.cost_center:
+ frappe.throw(_("Please enter Cost Center."))
+
+ def increase_asset_value(self):
+ asset_value = frappe.db.get_value('Asset', self.asset, 'asset_value')
+ for item in self.stock_items:
+ asset_value += item.total_value
+
+ if self.capitalize_repair_cost:
+ asset_value += self.repair_cost
+ frappe.db.set_value('Asset', self.asset, 'asset_value', asset_value)
+
+ def decrease_stock_quantity(self):
+ stock_entry = frappe.get_doc({
+ "doctype": "Stock Entry",
+ "stock_entry_type": "Material Issue"
+ })
+
+ for stock_item in self.stock_items:
+ stock_entry.append('items', {
+ "s_warehouse": self.warehouse,
+ "item_code": stock_item.item,
+ "qty": stock_item.consumed_quantity
+ })
+
+ stock_entry.insert()
+ stock_entry.submit()
+
+ def check_for_purchase_invoice(self):
+ if not self.purchase_invoice:
+ frappe.throw(_("Please link Purchase Invoice."))
+
+ def on_cancel(self):
+ self.make_gl_entries(cancel=True)
+
+ def make_gl_entries(self, cancel=False):
+ if flt(self.repair_cost) > 0:
+ gl_entries = self.get_gl_entries()
+ make_gl_entries(gl_entries, cancel)
+
+ def get_gl_entries(self):
+ gl_entry = []
+ company = frappe.db.get_value('Asset', self.asset, 'company')
+ repair_and_maintenance_account = frappe.db.get_value('Company', company, 'repair_and_maintenance_account')
+ fixed_asset_account = self.get_fixed_asset_account()
+ expense_account = frappe.get_doc('Purchase Invoice', self.purchase_invoice).items[0].expense_account
+
+ gl_entry = frappe.get_doc({
+ "doctype": "GL Entry",
+ "account": expense_account,
+ "credit": self.total_repair_cost,
+ "credit_in_account_currency": self.total_repair_cost,
+ "against": repair_and_maintenance_account,
+ "voucher_type": self.doctype,
+ "voucher_no": self.name,
+ "cost_center": self.cost_center,
+ "posting_date": getdate()
+ })
+ gl_entry.insert()
+ gl_entry = frappe.get_doc({
+ "doctype": "GL Entry",
+ "account": fixed_asset_account,
+ "debit": self.total_repair_cost,
+ "debit_in_account_currency": self.total_repair_cost,
+ "against": expense_account,
+ "voucher_type": self.doctype,
+ "voucher_no": self.name,
+ "cost_center": self.cost_center,
+ "posting_date": getdate(),
+ "against_voucher_type": "Purchase Invoice",
+ "against_voucher": self.purchase_invoice
+ })
+ gl_entry.insert()
+
+ def get_fixed_asset_account(self):
+ asset_category = frappe.get_doc('Asset Category', frappe.db.get_value('Asset', self.asset, 'asset_category'))
+ company = frappe.db.get_value('Asset', self.asset, 'company')
+ for account in asset_category.accounts:
+ if account.company_name == company:
+ return account.fixed_asset_account
+
+ def modify_depreciation_schedule(self):
+ if self.increase_in_asset_life:
+ asset = frappe.get_doc('Asset', self.asset)
+ asset.flags.ignore_validate_update_after_submit = True
+ for row in asset.finance_books:
+ row.total_number_of_depreciations += self.increase_in_asset_life/row.frequency_of_depreciation
+
+ asset.edit_dates = ""
+ extra_months = self.increase_in_asset_life % row.frequency_of_depreciation
+ if extra_months != 0:
+ self.calculate_last_schedule_date(asset, row, extra_months)
+ # fix depreciation amount
+
+ asset.prepare_depreciation_data()
+ asset.save()
+
+ # to help modify depreciation schedule when increase_in_asset_life is not a multiple of frequency_of_depreciation
+ def calculate_last_schedule_date(self, asset, row, extra_months):
+ asset.edit_dates = "Don't Edit"
+ number_of_pending_depreciations = cint(row.total_number_of_depreciations) - \
+ cint(asset.number_of_depreciations_booked)
+ last_schedule_date = asset.schedules[len(asset.schedules)-1].schedule_date
+ asset.to_date = add_months(last_schedule_date, extra_months)
+ schedule_date = add_months(row.depreciation_start_date,
+ number_of_pending_depreciations * cint(row.frequency_of_depreciation))
+
+ if asset.to_date > schedule_date:
+ row.total_number_of_depreciations += 1
+
+
@frappe.whitelist()
def get_downtime(failure_date, completion_date):
downtime = time_diff_in_hours(completion_date, failure_date)
diff --git a/erpnext/assets/doctype/stock_item/__init__.py b/erpnext/assets/doctype/stock_item/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/assets/doctype/stock_item/__init__.py
diff --git a/erpnext/assets/doctype/stock_item/stock_item.json b/erpnext/assets/doctype/stock_item/stock_item.json
new file mode 100644
index 0000000..b1f05db
--- /dev/null
+++ b/erpnext/assets/doctype/stock_item/stock_item.json
@@ -0,0 +1,55 @@
+{
+ "actions": [],
+ "creation": "2021-05-12 02:41:54.161024",
+ "doctype": "DocType",
+ "editable_grid": 1,
+ "engine": "InnoDB",
+ "field_order": [
+ "item",
+ "valuation_rate",
+ "consumed_quantity",
+ "total_value"
+ ],
+ "fields": [
+ {
+ "fieldname": "item",
+ "fieldtype": "Link",
+ "in_list_view": 1,
+ "label": "Item",
+ "options": "Item"
+ },
+ {
+ "fetch_from": "item.valuation_rate",
+ "fieldname": "valuation_rate",
+ "fieldtype": "Currency",
+ "in_list_view": 1,
+ "label": "Valuation Rate",
+ "read_only": 1
+ },
+ {
+ "fieldname": "consumed_quantity",
+ "fieldtype": "Data",
+ "in_list_view": 1,
+ "label": "Consumed Quantity"
+ },
+ {
+ "fieldname": "total_value",
+ "fieldtype": "Currency",
+ "in_list_view": 1,
+ "label": "Total Value",
+ "read_only": 1
+ }
+ ],
+ "index_web_pages_for_search": 1,
+ "istable": 1,
+ "links": [],
+ "modified": "2021-05-12 03:19:55.006300",
+ "modified_by": "Administrator",
+ "module": "Assets",
+ "name": "Stock Item",
+ "owner": "Administrator",
+ "permissions": [],
+ "sort_field": "modified",
+ "sort_order": "DESC",
+ "track_changes": 1
+}
\ No newline at end of file
diff --git a/erpnext/assets/doctype/stock_item/stock_item.py b/erpnext/assets/doctype/stock_item/stock_item.py
new file mode 100644
index 0000000..0e3cc3f
--- /dev/null
+++ b/erpnext/assets/doctype/stock_item/stock_item.py
@@ -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 StockItem(Document):
+ pass
diff --git a/erpnext/setup/doctype/company/company.json b/erpnext/setup/doctype/company/company.json
index 2d2f336..e6ec496 100644
--- a/erpnext/setup/doctype/company/company.json
+++ b/erpnext/setup/doctype/company/company.json
@@ -83,6 +83,7 @@
"disposal_account",
"depreciation_cost_center",
"capital_work_in_progress_account",
+ "repair_and_maintenance_account",
"asset_received_but_not_billed",
"budget_detail",
"exception_budget_approver_role",
@@ -734,6 +735,12 @@
"fieldname": "fixed_asset_defaults",
"fieldtype": "Section Break",
"label": "Fixed Asset Defaults"
+ },
+ {
+ "fieldname": "repair_and_maintenance_account",
+ "fieldtype": "Link",
+ "label": "Repair and Maintenance Account",
+ "options": "Account"
}
],
"icon": "fa fa-building",
@@ -741,7 +748,7 @@
"image_field": "company_logo",
"is_tree": 1,
"links": [],
- "modified": "2021-05-11 21:45:22.803065",
+ "modified": "2021-05-12 16:51:08.187233",
"modified_by": "Administrator",
"module": "Setup",
"name": "Company",