Merge pull request #48831 from frappe/version-14-hotfix

chore: release v14
This commit is contained in:
ruthra kumar
2025-07-29 20:40:08 +05:30
committed by GitHub
5 changed files with 36 additions and 10 deletions

View File

@@ -781,7 +781,7 @@ class PurchaseInvoice(BuyingController):
self.get_provisional_accounts() self.get_provisional_accounts()
for item in self.get("items"): for item in self.get("items"):
if flt(item.base_net_amount): if flt(item.base_net_amount) or (self.get("update_stock") and item.valuation_rate):
account_currency = get_account_currency(item.expense_account) account_currency = get_account_currency(item.expense_account)
if item.item_code: if item.item_code:
frappe.get_cached_value("Item", item.item_code, "asset_category") frappe.get_cached_value("Item", item.item_code, "asset_category")

View File

@@ -27,6 +27,7 @@ from frappe.utils import (
nowdate, nowdate,
) )
from pypika import Order from pypika import Order
from pypika.functions import Coalesce
from pypika.terms import ExistsCriterion from pypika.terms import ExistsCriterion
import erpnext import erpnext
@@ -2197,6 +2198,8 @@ def run_ledger_health_checks():
def build_qb_match_conditions(doctype, user=None) -> list: def build_qb_match_conditions(doctype, user=None) -> list:
match_filters = build_match_conditions(doctype, user, False) match_filters = build_match_conditions(doctype, user, False)
criterion = [] criterion = []
apply_strict_user_permissions = frappe.get_system_settings("apply_strict_user_permissions")
if match_filters: if match_filters:
from frappe import qb from frappe import qb
@@ -2205,6 +2208,12 @@ def build_qb_match_conditions(doctype, user=None) -> list:
for filter in match_filters: for filter in match_filters:
for d, names in filter.items(): for d, names in filter.items():
fieldname = d.lower().replace(" ", "_") fieldname = d.lower().replace(" ", "_")
criterion.append(_dt[fieldname].isin(names)) field = _dt[fieldname]
cond = field.isin(names)
if not apply_strict_user_permissions:
cond = (Coalesce(field, "") == "") | field.isin(names)
criterion.append(cond)
return criterion return criterion

View File

@@ -76,6 +76,7 @@
"fieldname": "completion_date", "fieldname": "completion_date",
"fieldtype": "Datetime", "fieldtype": "Datetime",
"label": "Completion Date", "label": "Completion Date",
"mandatory_depends_on": "eval:doc.repair_status==\"Completed\"",
"no_copy": 1 "no_copy": 1
}, },
{ {
@@ -264,7 +265,7 @@
"index_web_pages_for_search": 1, "index_web_pages_for_search": 1,
"is_submittable": 1, "is_submittable": 1,
"links": [], "links": [],
"modified": "2022-08-16 15:55:25.023471", "modified": "2025-07-29 15:14:34.044564",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Assets", "module": "Assets",
"name": "Asset Repair", "name": "Asset Repair",
@@ -302,10 +303,11 @@
"write": 1 "write": 1
} }
], ],
"row_format": "Dynamic",
"sort_field": "modified", "sort_field": "modified",
"sort_order": "DESC", "sort_order": "DESC",
"states": [], "states": [],
"title_field": "asset_name", "title_field": "asset_name",
"track_changes": 1, "track_changes": 1,
"track_seen": 1 "track_seen": 1
} }

View File

@@ -3,7 +3,7 @@
import frappe import frappe
from frappe import _ from frappe import _
from frappe.utils import add_months, cint, flt, getdate, time_diff_in_hours from frappe.utils import add_months, cint, flt, get_link_to_form, getdate, time_diff_in_hours
import erpnext import erpnext
from erpnext.accounts.general_ledger import make_gl_entries from erpnext.accounts.general_ledger import make_gl_entries
@@ -20,6 +20,20 @@ class AssetRepair(AccountsController):
self.set_stock_items_cost() self.set_stock_items_cost()
self.calculate_total_repair_cost() self.calculate_total_repair_cost()
def validate_asset(self):
if self.asset_doc.status in ("Sold", "Fully Depreciated", "Scrapped"):
frappe.throw(
_("Asset {0} is in {1} status and cannot be repaired.").format(
get_link_to_form("Asset", self.asset), self.asset_doc.status
)
)
def validate_dates(self):
if self.completion_date and (getdate(self.failure_date) > getdate(self.completion_date)):
frappe.throw(
_("Completion Date can not be before Failure Date. Please adjust the dates accordingly.")
)
def update_status(self): def update_status(self):
if self.repair_status == "Pending": if self.repair_status == "Pending":
frappe.db.set_value("Asset", self.asset, "status", "Out of Order") frappe.db.set_value("Asset", self.asset, "status", "Out of Order")
@@ -195,7 +209,7 @@ class AssetRepair(AccountsController):
"voucher_type": self.doctype, "voucher_type": self.doctype,
"voucher_no": self.name, "voucher_no": self.name,
"cost_center": self.cost_center, "cost_center": self.cost_center,
"posting_date": getdate(), "posting_date": self.completion_date,
"against_voucher_type": "Purchase Invoice", "against_voucher_type": "Purchase Invoice",
"against_voucher": self.purchase_invoice, "against_voucher": self.purchase_invoice,
"company": self.company, "company": self.company,
@@ -214,7 +228,7 @@ class AssetRepair(AccountsController):
"voucher_type": self.doctype, "voucher_type": self.doctype,
"voucher_no": self.name, "voucher_no": self.name,
"cost_center": self.cost_center, "cost_center": self.cost_center,
"posting_date": getdate(), "posting_date": self.completion_date,
"company": self.company, "company": self.company,
}, },
item=self, item=self,
@@ -248,7 +262,7 @@ class AssetRepair(AccountsController):
"voucher_type": self.doctype, "voucher_type": self.doctype,
"voucher_no": self.name, "voucher_no": self.name,
"cost_center": self.cost_center, "cost_center": self.cost_center,
"posting_date": getdate(), "posting_date": self.completion_date,
"company": self.company, "company": self.company,
}, },
item=self, item=self,
@@ -265,7 +279,7 @@ class AssetRepair(AccountsController):
"voucher_type": self.doctype, "voucher_type": self.doctype,
"voucher_no": self.name, "voucher_no": self.name,
"cost_center": self.cost_center, "cost_center": self.cost_center,
"posting_date": getdate(), "posting_date": self.completion_date,
"against_voucher_type": "Stock Entry", "against_voucher_type": "Stock Entry",
"against_voucher": self.stock_entry, "against_voucher": self.stock_entry,
"company": self.company, "company": self.company,

View File

@@ -4,7 +4,7 @@
import unittest import unittest
import frappe import frappe
from frappe.utils import flt, nowdate from frappe.utils import add_days, flt, nowdate
from erpnext.assets.doctype.asset.asset import ( from erpnext.assets.doctype.asset.asset import (
get_asset_account, get_asset_account,
@@ -288,6 +288,7 @@ def create_asset_repair(**args):
if args.submit: if args.submit:
asset_repair.repair_status = "Completed" asset_repair.repair_status = "Completed"
asset_repair.completion_date = add_days(args.failure_date, 1)
asset_repair.cost_center = frappe.db.get_value("Company", asset.company, "cost_center") asset_repair.cost_center = frappe.db.get_value("Company", asset.company, "cost_center")
if args.stock_consumption: if args.stock_consumption: