Merge pull request #35050 from Nandhinidevi123/workstation_filter
add if condition for workstation filter
diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.py b/erpnext/accounts/doctype/payment_entry/payment_entry.py
index ee4d4d2..082128a 100644
--- a/erpnext/accounts/doctype/payment_entry/payment_entry.py
+++ b/erpnext/accounts/doctype/payment_entry/payment_entry.py
@@ -1693,7 +1693,10 @@
):
reference_doc = None
doc = frappe.get_doc(dt, dn)
- if dt in ("Sales Order", "Purchase Order") and flt(doc.per_billed, 2) >= 99.99:
+ over_billing_allowance = frappe.db.get_single_value("Accounts Settings", "over_billing_allowance")
+ if dt in ("Sales Order", "Purchase Order") and flt(doc.per_billed, 2) >= (
+ 100.0 + over_billing_allowance
+ ):
frappe.throw(_("Can only make payment against unbilled {0}").format(dt))
if not party_type:
diff --git a/erpnext/accounts/utils.py b/erpnext/accounts/utils.py
index 890872f..0ee06e8 100644
--- a/erpnext/accounts/utils.py
+++ b/erpnext/accounts/utils.py
@@ -1374,10 +1374,7 @@
if wh_details.account == account and not wh_details.is_group
]
- total_stock_value = 0.0
- for warehouse in related_warehouses:
- value = get_stock_value_on(warehouse, posting_date)
- total_stock_value += value
+ total_stock_value = get_stock_value_on(related_warehouses, posting_date)
precision = frappe.get_precision("Journal Entry Account", "debit_in_account_currency")
return flt(account_balance, precision), flt(total_stock_value, precision), related_warehouses
diff --git a/erpnext/assets/doctype/asset/asset.py b/erpnext/assets/doctype/asset/asset.py
index 6001254..42f5311 100644
--- a/erpnext/assets/doctype/asset/asset.py
+++ b/erpnext/assets/doctype/asset/asset.py
@@ -783,7 +783,7 @@
je.voucher_type = "Depreciation Entry"
je.naming_series = depreciation_series
je.company = asset.company
- je.remark = "Depreciation Entry against asset {0}".format(asset_name)
+ je.remark = _("Depreciation Entry against asset {0}").format(asset_name)
je.append(
"accounts",
diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py
index 6982f71..d0ec654 100644
--- a/erpnext/controllers/accounts_controller.py
+++ b/erpnext/controllers/accounts_controller.py
@@ -1904,12 +1904,14 @@
reconcilation_entry.party = secondary_party
reconcilation_entry.reference_type = self.doctype
reconcilation_entry.reference_name = self.name
- reconcilation_entry.cost_center = self.cost_center
+ reconcilation_entry.cost_center = self.cost_center or erpnext.get_default_cost_center(
+ self.company
+ )
advance_entry.account = primary_account
advance_entry.party_type = primary_party_type
advance_entry.party = primary_party
- advance_entry.cost_center = self.cost_center
+ advance_entry.cost_center = self.cost_center or erpnext.get_default_cost_center(self.company)
advance_entry.is_advance = "Yes"
if self.doctype == "Sales Invoice":
diff --git a/erpnext/public/js/projects/timer.js b/erpnext/public/js/projects/timer.js
index 9dae711..0209f4c 100644
--- a/erpnext/public/js/projects/timer.js
+++ b/erpnext/public/js/projects/timer.js
@@ -68,7 +68,7 @@
// New activity if no activities found
var args = dialog.get_values();
if(!args) return;
- if (frm.doc.time_logs.length <= 1 && !frm.doc.time_logs[0].activity_type && !frm.doc.time_logs[0].from_time) {
+ if (frm.doc.time_logs.length == 1 && !frm.doc.time_logs[0].activity_type && !frm.doc.time_logs[0].from_time) {
frm.doc.time_logs = [];
}
row = frappe.model.add_child(frm.doc, "Timesheet Detail", "time_logs");
diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py
index ee9161b..d995517 100755
--- a/erpnext/selling/doctype/sales_order/sales_order.py
+++ b/erpnext/selling/doctype/sales_order/sales_order.py
@@ -1340,8 +1340,9 @@
.select(Sum(wo.qty))
.where(
(wo.production_item == i.item_code)
- & (wo.sales_order == so.name) * (wo.sales_order_item == i.name)
- & (wo.docstatus.lte(2))
+ & (wo.sales_order == so.name)
+ & (wo.sales_order_item == i.name)
+ & (wo.docstatus.lt(2))
)
.run()[0][0]
)
diff --git a/erpnext/stock/report/incorrect_stock_value_report/incorrect_stock_value_report.py b/erpnext/stock/report/incorrect_stock_value_report/incorrect_stock_value_report.py
index e9c9608..e4f657c 100644
--- a/erpnext/stock/report/incorrect_stock_value_report/incorrect_stock_value_report.py
+++ b/erpnext/stock/report/incorrect_stock_value_report/incorrect_stock_value_report.py
@@ -84,7 +84,7 @@
closing_date = add_days(from_date, -1)
for key, stock_data in voucher_wise_dict.items():
prev_stock_value = get_stock_value_on(
- posting_date=closing_date, item_code=key[0], warehouse=key[1]
+ posting_date=closing_date, item_code=key[0], warehouses=key[1]
)
for data in stock_data:
expected_stock_value = prev_stock_value + data.stock_value_difference
diff --git a/erpnext/stock/utils.py b/erpnext/stock/utils.py
index b8c5187..fb52697 100644
--- a/erpnext/stock/utils.py
+++ b/erpnext/stock/utils.py
@@ -7,10 +7,11 @@
import frappe
from frappe import _
-from frappe.query_builder.functions import CombineDatetime
+from frappe.query_builder.functions import CombineDatetime, IfNull, Sum
from frappe.utils import cstr, flt, get_link_to_form, nowdate, nowtime
import erpnext
+from erpnext.stock.doctype.warehouse.warehouse import get_child_warehouses
from erpnext.stock.valuation import FIFOValuation, LIFOValuation
BarcodeScanResult = Dict[str, Optional[str]]
@@ -53,50 +54,36 @@
return stock_value
-def get_stock_value_on(warehouse=None, posting_date=None, item_code=None):
+def get_stock_value_on(
+ warehouses: list | str = None, posting_date: str = None, item_code: str = None
+) -> float:
if not posting_date:
posting_date = nowdate()
- values, condition = [posting_date], ""
-
- if warehouse:
-
- lft, rgt, is_group = frappe.db.get_value("Warehouse", warehouse, ["lft", "rgt", "is_group"])
-
- if is_group:
- values.extend([lft, rgt])
- condition += "and exists (\
- select name from `tabWarehouse` wh where wh.name = sle.warehouse\
- and wh.lft >= %s and wh.rgt <= %s)"
-
- else:
- values.append(warehouse)
- condition += " AND warehouse = %s"
-
- if item_code:
- values.append(item_code)
- condition += " AND item_code = %s"
-
- stock_ledger_entries = frappe.db.sql(
- """
- SELECT item_code, stock_value, name, warehouse
- FROM `tabStock Ledger Entry` sle
- WHERE posting_date <= %s {0}
- and is_cancelled = 0
- ORDER BY timestamp(posting_date, posting_time) DESC, creation DESC
- """.format(
- condition
- ),
- values,
- as_dict=1,
+ sle = frappe.qb.DocType("Stock Ledger Entry")
+ query = (
+ frappe.qb.from_(sle)
+ .select(IfNull(Sum(sle.stock_value_difference), 0))
+ .where((sle.posting_date <= posting_date) & (sle.is_cancelled == 0))
+ .orderby(CombineDatetime(sle.posting_date, sle.posting_time), order=frappe.qb.desc)
+ .orderby(sle.creation, order=frappe.qb.desc)
)
- sle_map = {}
- for sle in stock_ledger_entries:
- if not (sle.item_code, sle.warehouse) in sle_map:
- sle_map[(sle.item_code, sle.warehouse)] = flt(sle.stock_value)
+ if warehouses:
+ if isinstance(warehouses, str):
+ warehouses = [warehouses]
- return sum(sle_map.values())
+ warehouses = set(warehouses)
+ for wh in list(warehouses):
+ if frappe.db.get_value("Warehouse", wh, "is_group"):
+ warehouses.update(get_child_warehouses(wh))
+
+ query = query.where(sle.warehouse.isin(warehouses))
+
+ if item_code:
+ query = query.where(sle.item_code == item_code)
+
+ return query.run(as_list=True)[0][0]
@frappe.whitelist()