Merge pull request #38608 from s-aga-r/FIX-6766
fix(ux): don't update qty blindly
diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs
index 3bc22af..275442a 100644
--- a/.git-blame-ignore-revs
+++ b/.git-blame-ignore-revs
@@ -28,4 +28,7 @@
494bd9ef78313436f0424b918f200dab8fc7c20b
# bulk format python code with black
-baec607ff5905b1c67531096a9cf50ec7ff00a5d
\ No newline at end of file
+baec607ff5905b1c67531096a9cf50ec7ff00a5d
+
+# bulk refactor with sourcery
+eb9ee3f79b94e594fc6dfa4f6514580e125eee8c
diff --git a/erpnext/__init__.py b/erpnext/__init__.py
index 5c58f84..48ebe92 100644
--- a/erpnext/__init__.py
+++ b/erpnext/__init__.py
@@ -36,7 +36,7 @@
if not frappe.flags.company_cost_center:
frappe.flags.company_cost_center = {}
- if not company in frappe.flags.company_cost_center:
+ if company not in frappe.flags.company_cost_center:
frappe.flags.company_cost_center[company] = frappe.get_cached_value(
"Company", company, "cost_center"
)
@@ -47,7 +47,7 @@
"""Returns the default company currency"""
if not frappe.flags.company_currency:
frappe.flags.company_currency = {}
- if not company in frappe.flags.company_currency:
+ if company not in frappe.flags.company_currency:
frappe.flags.company_currency[company] = frappe.db.get_value(
"Company", company, "default_currency", cache=True
)
@@ -81,7 +81,7 @@
if not hasattr(frappe.local, "enable_perpetual_inventory"):
frappe.local.enable_perpetual_inventory = {}
- if not company in frappe.local.enable_perpetual_inventory:
+ if company not in frappe.local.enable_perpetual_inventory:
frappe.local.enable_perpetual_inventory[company] = (
frappe.get_cached_value("Company", company, "enable_perpetual_inventory") or 0
)
@@ -96,7 +96,7 @@
if not hasattr(frappe.local, "default_finance_book"):
frappe.local.default_finance_book = {}
- if not company in frappe.local.default_finance_book:
+ if company not in frappe.local.default_finance_book:
frappe.local.default_finance_book[company] = frappe.get_cached_value(
"Company", company, "default_finance_book"
)
@@ -108,7 +108,7 @@
if not hasattr(frappe.local, "party_account_types"):
frappe.local.party_account_types = {}
- if not party_type in frappe.local.party_account_types:
+ if party_type not in frappe.local.party_account_types:
frappe.local.party_account_types[party_type] = (
frappe.db.get_value("Party Type", party_type, "account_type") or ""
)
diff --git a/erpnext/accounts/deferred_revenue.py b/erpnext/accounts/deferred_revenue.py
index d0940c7..367b017 100644
--- a/erpnext/accounts/deferred_revenue.py
+++ b/erpnext/accounts/deferred_revenue.py
@@ -232,7 +232,7 @@
if amount + already_booked_amount_in_account_currency > item.net_amount:
amount = item.net_amount - already_booked_amount_in_account_currency
- if not (get_first_day(start_date) == start_date and get_last_day(end_date) == end_date):
+ if get_first_day(start_date) != start_date or get_last_day(end_date) != end_date:
partial_month = flt(date_diff(end_date, start_date)) / flt(
date_diff(get_last_day(end_date), get_first_day(start_date))
)
diff --git a/erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.py b/erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.py
index e9cbb33..8be09db 100644
--- a/erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.py
+++ b/erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.py
@@ -44,7 +44,7 @@
self.set_total_gain_loss()
def validate_rounding_loss_allowance(self):
- if not (self.rounding_loss_allowance >= 0 and self.rounding_loss_allowance < 1):
+ if self.rounding_loss_allowance < 0 or self.rounding_loss_allowance >= 1:
frappe.throw(_("Rounding Loss Allowance should be between 0 and 1"))
def set_total_gain_loss(self):
diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.py b/erpnext/accounts/doctype/journal_entry/journal_entry.py
index dd3e9d0..40d552b 100644
--- a/erpnext/accounts/doctype/journal_entry/journal_entry.py
+++ b/erpnext/accounts/doctype/journal_entry/journal_entry.py
@@ -631,7 +631,7 @@
)
# set totals
- if not d.reference_name in self.reference_totals:
+ if d.reference_name not in self.reference_totals:
self.reference_totals[d.reference_name] = 0.0
if self.voucher_type not in ("Deferred Revenue", "Deferred Expense"):
diff --git a/erpnext/accounts/doctype/loyalty_program/test_loyalty_program.py b/erpnext/accounts/doctype/loyalty_program/test_loyalty_program.py
index 3641ac4..cbfb17b 100644
--- a/erpnext/accounts/doctype/loyalty_program/test_loyalty_program.py
+++ b/erpnext/accounts/doctype/loyalty_program/test_loyalty_program.py
@@ -140,7 +140,7 @@
"Loyalty Point Entry",
{"invoice_type": "Sales Invoice", "invoice": si.name, "customer": si.customer},
)
- self.assertEqual(True, not (lpe is None))
+ self.assertEqual(True, lpe is not None)
# cancelling sales invoice
si.cancel()
diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.py b/erpnext/accounts/doctype/payment_entry/payment_entry.py
index 1282ab6..a6ddce5 100644
--- a/erpnext/accounts/doctype/payment_entry/payment_entry.py
+++ b/erpnext/accounts/doctype/payment_entry/payment_entry.py
@@ -369,12 +369,12 @@
self.set(self.party_account_field, party_account)
self.party_account = party_account
- if self.paid_from and not (self.paid_from_account_currency or self.paid_from_account_balance):
+ if self.paid_from and not self.paid_from_account_currency and not self.paid_from_account_balance:
acc = get_account_details(self.paid_from, self.posting_date, self.cost_center)
self.paid_from_account_currency = acc.account_currency
self.paid_from_account_balance = acc.account_balance
- if self.paid_to and not (self.paid_to_account_currency or self.paid_to_account_balance):
+ if self.paid_to and not self.paid_to_account_currency and not self.paid_to_account_balance:
acc = get_account_details(self.paid_to, self.posting_date, self.cost_center)
self.paid_to_account_currency = acc.account_currency
self.paid_to_account_balance = acc.account_balance
@@ -390,8 +390,9 @@
) -> None:
for d in self.get("references"):
if d.allocated_amount:
- if update_ref_details_only_for and (
- not (d.reference_doctype, d.reference_name) in update_ref_details_only_for
+ if (
+ update_ref_details_only_for
+ and (d.reference_doctype, d.reference_name) not in update_ref_details_only_for
):
continue
@@ -702,7 +703,7 @@
self.db_set("status", self.status, update_modified=True)
def set_tax_withholding(self):
- if not self.party_type == "Supplier":
+ if self.party_type != "Supplier":
return
if not self.apply_tax_withholding_amount:
@@ -793,7 +794,7 @@
self.base_received_amount = self.base_paid_amount
if (
self.paid_from_account_currency == self.paid_to_account_currency
- and not self.payment_type == "Internal Transfer"
+ and self.payment_type != "Internal Transfer"
):
self.received_amount = self.paid_amount
@@ -1757,7 +1758,7 @@
"Payment Schedule", filters={"parent": invoice.voucher_no}, fields=["*"], order_by="due_date"
)
for payment_term in payment_schedule:
- if not payment_term.outstanding > 0.1:
+ if payment_term.outstanding <= 0.1:
continue
doc_details = exc_rates.get(payment_term.parent, None)
diff --git a/erpnext/accounts/doctype/pricing_rule/pricing_rule.py b/erpnext/accounts/doctype/pricing_rule/pricing_rule.py
index b41cf53..82bd662 100644
--- a/erpnext/accounts/doctype/pricing_rule/pricing_rule.py
+++ b/erpnext/accounts/doctype/pricing_rule/pricing_rule.py
@@ -286,7 +286,7 @@
def validate_price_list_with_currency(self):
if self.currency and self.for_price_list:
price_list_currency = frappe.db.get_value("Price List", self.for_price_list, "currency", True)
- if not self.currency == price_list_currency:
+ if self.currency != price_list_currency:
throw(_("Currency should be same as Price List Currency: {0}").format(price_list_currency))
def validate_dates(self):
diff --git a/erpnext/accounts/doctype/pricing_rule/utils.py b/erpnext/accounts/doctype/pricing_rule/utils.py
index 57feaa0..18aa682 100644
--- a/erpnext/accounts/doctype/pricing_rule/utils.py
+++ b/erpnext/accounts/doctype/pricing_rule/utils.py
@@ -581,6 +581,8 @@
if d.price_or_product_discount == "Price":
if d.apply_discount_on:
doc.set("apply_discount_on", d.apply_discount_on)
+ # Variable to track whether the condition has been met
+ condition_met = False
for field in ["additional_discount_percentage", "discount_amount"]:
pr_field = "discount_percentage" if field == "additional_discount_percentage" else field
@@ -603,6 +605,11 @@
if coupon_code_pricing_rule == d.name:
# if selected coupon code is linked with pricing rule
doc.set(field, d.get(pr_field))
+
+ # Set the condition_met variable to True and break out of the loop
+ condition_met = True
+ break
+
else:
# reset discount if not linked
doc.set(field, 0)
@@ -611,6 +618,10 @@
doc.set(field, 0)
doc.calculate_taxes_and_totals()
+
+ # Break out of the main loop if the condition is met
+ if condition_met:
+ break
elif d.price_or_product_discount == "Product":
item_details = frappe._dict({"parenttype": doc.doctype, "free_item_data": []})
get_product_discount_rule(d, item_details, doc=doc)
diff --git a/erpnext/accounts/doctype/process_payment_reconciliation/process_payment_reconciliation.py b/erpnext/accounts/doctype/process_payment_reconciliation/process_payment_reconciliation.py
index 67a7f90..f44b14c 100644
--- a/erpnext/accounts/doctype/process_payment_reconciliation/process_payment_reconciliation.py
+++ b/erpnext/accounts/doctype/process_payment_reconciliation/process_payment_reconciliation.py
@@ -475,7 +475,7 @@
frappe.db.set_value("Process Payment Reconciliation", doc, "status", "Completed")
else:
- if not (frappe.db.get_value("Process Payment Reconciliation", doc, "status") == "Paused"):
+ if frappe.db.get_value("Process Payment Reconciliation", doc, "status") != "Paused":
# trigger next batch in job
# generate reconcile job name
allocation = get_next_allocation(log)
diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
index 7156fa2..ae377eb 100644
--- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
+++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
@@ -371,7 +371,7 @@
check_list = []
for d in self.get("items"):
- if d.purchase_order and not d.purchase_order in check_list and not d.purchase_receipt:
+ if d.purchase_order and d.purchase_order not in check_list and not d.purchase_receipt:
check_list.append(d.purchase_order)
check_on_hold_or_closed_status("Purchase Order", d.purchase_order)
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
index 96a557b..f2f4dda 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
@@ -458,7 +458,7 @@
self.update_billing_status_for_zero_amount_refdoc("Sales Order")
self.check_credit_limit()
- if not cint(self.is_pos) == 1 and not self.is_return:
+ if cint(self.is_pos) != 1 and not self.is_return:
self.update_against_document_in_jv()
self.update_time_sheet(self.name)
@@ -1960,9 +1960,9 @@
if inter_company_reference:
doc = frappe.get_doc(ref_doc, inter_company_reference)
ref_party = doc.supplier if doctype in ["Sales Invoice", "Sales Order"] else doc.customer
- if not frappe.db.get_value(partytype, {"represents_company": doc.company}, "name") == party:
+ if frappe.db.get_value(partytype, {"represents_company": doc.company}, "name") != party:
frappe.throw(_("Invalid {0} for Inter Company Transaction.").format(_(partytype)))
- if not frappe.get_cached_value(ref_partytype, ref_party, "represents_company") == company:
+ if frappe.get_cached_value(ref_partytype, ref_party, "represents_company") != company:
frappe.throw(_("Invalid Company for Inter Company Transaction."))
elif frappe.db.get_value(partytype, {"name": party, internal: 1}, "name") == party:
@@ -1972,7 +1972,7 @@
filters={"parenttype": partytype, "parent": party},
)
companies = [d.company for d in companies]
- if not company in companies:
+ if company not in companies:
frappe.throw(
_("{0} not allowed to transact with {1}. Please change the Company.").format(
_(partytype), company
diff --git a/erpnext/accounts/doctype/shipping_rule/shipping_rule.py b/erpnext/accounts/doctype/shipping_rule/shipping_rule.py
index 52a60ac..6877a74 100644
--- a/erpnext/accounts/doctype/shipping_rule/shipping_rule.py
+++ b/erpnext/accounts/doctype/shipping_rule/shipping_rule.py
@@ -142,12 +142,12 @@
}
if self.shipping_rule_type == "Selling":
# check if not applied on purchase
- if not doc.meta.get_field("taxes").options == "Sales Taxes and Charges":
+ if doc.meta.get_field("taxes").options != "Sales Taxes and Charges":
frappe.throw(_("Shipping rule only applicable for Selling"))
shipping_charge["doctype"] = "Sales Taxes and Charges"
else:
# check if not applied on sales
- if not doc.meta.get_field("taxes").options == "Purchase Taxes and Charges":
+ if doc.meta.get_field("taxes").options != "Purchase Taxes and Charges":
frappe.throw(_("Shipping rule only applicable for Buying"))
shipping_charge["doctype"] = "Purchase Taxes and Charges"
diff --git a/erpnext/accounts/doctype/subscription/subscription.py b/erpnext/accounts/doctype/subscription/subscription.py
index 6cc2d1e..aba1b64 100644
--- a/erpnext/accounts/doctype/subscription/subscription.py
+++ b/erpnext/accounts/doctype/subscription/subscription.py
@@ -676,7 +676,7 @@
to_generate_invoice = (
True
if self.status == "Active"
- and not self.generate_invoice_at == "Beginning of the current subscription period"
+ and self.generate_invoice_at != "Beginning of the current subscription period"
else False
)
self.status = "Cancelled"
@@ -694,7 +694,7 @@
subscription and the `Subscription` will lose all the history of generated invoices
it has.
"""
- if not self.status == "Cancelled":
+ if self.status != "Cancelled":
frappe.throw(_("You cannot restart a Subscription that is not cancelled."), InvoiceNotCancelled)
self.status = "Active"
diff --git a/erpnext/accounts/doctype/unreconcile_payment/unreconcile_payment.py b/erpnext/accounts/doctype/unreconcile_payment/unreconcile_payment.py
index e258a73..9b56952 100644
--- a/erpnext/accounts/doctype/unreconcile_payment/unreconcile_payment.py
+++ b/erpnext/accounts/doctype/unreconcile_payment/unreconcile_payment.py
@@ -37,7 +37,7 @@
def validate(self):
self.supported_types = ["Payment Entry", "Journal Entry"]
- if not self.voucher_type in self.supported_types:
+ if self.voucher_type not in self.supported_types:
frappe.throw(_("Only {0} are supported").format(comma_and(self.supported_types)))
@frappe.whitelist()
diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py
index 1efe35c..008614e 100644
--- a/erpnext/accounts/party.py
+++ b/erpnext/accounts/party.py
@@ -775,7 +775,7 @@
frozen_accounts_modifier = frappe.db.get_single_value(
"Accounts Settings", "frozen_accounts_modifier"
)
- if not frozen_accounts_modifier in frappe.get_roles():
+ if frozen_accounts_modifier not in frappe.get_roles():
frappe.throw(_("{0} {1} is frozen").format(party_type, party_name), PartyFrozen)
elif party_type == "Employee":
diff --git a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py
index eaf9f42..50d5eae 100644
--- a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py
+++ b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py
@@ -123,7 +123,7 @@
else:
key = (ple.account, ple.voucher_type, ple.voucher_no, ple.party)
- if not key in self.voucher_balance:
+ if key not in self.voucher_balance:
self.voucher_balance[key] = frappe._dict(
voucher_type=ple.voucher_type,
voucher_no=ple.voucher_no,
@@ -938,7 +938,7 @@
return True
def get_party_details(self, party):
- if not party in self.party_details:
+ if party not in self.party_details:
if self.account_type == "Receivable":
fields = ["customer_name", "territory", "customer_group", "customer_primary_contact"]
diff --git a/erpnext/accounts/report/deferred_revenue_and_expense/deferred_revenue_and_expense.py b/erpnext/accounts/report/deferred_revenue_and_expense/deferred_revenue_and_expense.py
index cad5325..eebd61c 100644
--- a/erpnext/accounts/report/deferred_revenue_and_expense/deferred_revenue_and_expense.py
+++ b/erpnext/accounts/report/deferred_revenue_and_expense/deferred_revenue_and_expense.py
@@ -97,7 +97,7 @@
if base_amount + already_booked_amount > self.base_net_amount:
base_amount = self.base_net_amount - already_booked_amount
- if not (get_first_day(start_date) == start_date and get_last_day(end_date) == end_date):
+ if get_first_day(start_date) != start_date or get_last_day(end_date) != end_date:
partial_month = flt(date_diff(end_date, start_date)) / flt(
date_diff(get_last_day(end_date), get_first_day(start_date))
)
diff --git a/erpnext/accounts/report/gross_and_net_profit_report/gross_and_net_profit_report.py b/erpnext/accounts/report/gross_and_net_profit_report/gross_and_net_profit_report.py
index f0ca405..604bc01 100644
--- a/erpnext/accounts/report/gross_and_net_profit_report/gross_and_net_profit_report.py
+++ b/erpnext/accounts/report/gross_and_net_profit_report/gross_and_net_profit_report.py
@@ -170,7 +170,7 @@
totals[node["account"]] += value
parent = node["parent_account"]
- if not parent == "":
+ if parent != "":
return set_total(
next(item for item in complete_list if item["account"] == parent), value, complete_list, totals
)
diff --git a/erpnext/accounts/report/gross_profit/gross_profit.py b/erpnext/accounts/report/gross_profit/gross_profit.py
index 38060bb..e4efefe 100644
--- a/erpnext/accounts/report/gross_profit/gross_profit.py
+++ b/erpnext/accounts/report/gross_profit/gross_profit.py
@@ -695,7 +695,7 @@
def get_average_buying_rate(self, row, item_code):
args = row
- if not item_code in self.average_buying_rate:
+ if item_code not in self.average_buying_rate:
args.update(
{
"voucher_type": row.parenttype,
diff --git a/erpnext/accounts/report/tax_withholding_details/tax_withholding_details.py b/erpnext/accounts/report/tax_withholding_details/tax_withholding_details.py
index f6c7bd3..ba946c3 100644
--- a/erpnext/accounts/report/tax_withholding_details/tax_withholding_details.py
+++ b/erpnext/accounts/report/tax_withholding_details/tax_withholding_details.py
@@ -154,7 +154,7 @@
)
for d in gle:
- if not d.voucher_no in gle_map:
+ if d.voucher_no not in gle_map:
gle_map[d.voucher_no] = [d]
else:
gle_map[d.voucher_no].append(d)
diff --git a/erpnext/accounts/utils.py b/erpnext/accounts/utils.py
index f88e26e..6b59827 100644
--- a/erpnext/accounts/utils.py
+++ b/erpnext/accounts/utils.py
@@ -1062,11 +1062,11 @@
if (
min_outstanding
and max_outstanding
- and not (outstanding_amount >= min_outstanding and outstanding_amount <= max_outstanding)
+ and (outstanding_amount < min_outstanding or outstanding_amount > max_outstanding)
):
continue
- if not d.voucher_type == "Purchase Invoice" or d.voucher_no not in held_invoices:
+ if d.voucher_type != "Purchase Invoice" or d.voucher_no not in held_invoices:
outstanding_invoices.append(
frappe._dict(
{
diff --git a/erpnext/assets/doctype/asset/asset.py b/erpnext/assets/doctype/asset/asset.py
index 5fb2d36..707ce19 100644
--- a/erpnext/assets/doctype/asset/asset.py
+++ b/erpnext/assets/doctype/asset/asset.py
@@ -313,7 +313,7 @@
frappe.throw(_("Gross Purchase Amount is mandatory"), frappe.MandatoryError)
if is_cwip_accounting_enabled(self.asset_category):
- if not self.is_existing_asset and not (self.purchase_receipt or self.purchase_invoice):
+ if not self.is_existing_asset and not self.purchase_receipt and not self.purchase_invoice:
frappe.throw(
_("Please create purchase receipt or purchase invoice for the item {0}").format(
self.item_code
diff --git a/erpnext/assets/doctype/asset_movement/asset_movement.py b/erpnext/assets/doctype/asset_movement/asset_movement.py
index 0d8efcb..ff52643 100644
--- a/erpnext/assets/doctype/asset_movement/asset_movement.py
+++ b/erpnext/assets/doctype/asset_movement/asset_movement.py
@@ -84,7 +84,7 @@
frappe.throw(_("Source and Target Location cannot be same"))
if self.purpose == "Receipt":
- if not (d.source_location) and not (d.target_location or d.to_employee):
+ if not (d.source_location) and not d.target_location and not d.to_employee:
frappe.throw(
_("Target Location or To Employee is required while receiving Asset {0}").format(d.asset)
)
diff --git a/erpnext/buying/report/purchase_order_analysis/purchase_order_analysis.py b/erpnext/buying/report/purchase_order_analysis/purchase_order_analysis.py
index b6e4630..b88efe1 100644
--- a/erpnext/buying/report/purchase_order_analysis/purchase_order_analysis.py
+++ b/erpnext/buying/report/purchase_order_analysis/purchase_order_analysis.py
@@ -114,7 +114,7 @@
if filters.get("group_by_po"):
po_name = row["purchase_order"]
- if not po_name in purchase_order_map:
+ if po_name not in purchase_order_map:
# create an entry
row_copy = copy.deepcopy(row)
purchase_order_map[po_name] = row_copy
diff --git a/erpnext/buying/report/requested_items_to_order_and_receive/requested_items_to_order_and_receive.py b/erpnext/buying/report/requested_items_to_order_and_receive/requested_items_to_order_and_receive.py
index 0718735..d431010 100644
--- a/erpnext/buying/report/requested_items_to_order_and_receive/requested_items_to_order_and_receive.py
+++ b/erpnext/buying/report/requested_items_to_order_and_receive/requested_items_to_order_and_receive.py
@@ -110,7 +110,7 @@
for row in data:
# item wise map for charts
- if not row["item_code"] in item_qty_map:
+ if row["item_code"] not in item_qty_map:
item_qty_map[row["item_code"]] = {
"qty": flt(row["stock_qty"], precision),
"stock_qty": flt(row["stock_qty"], precision),
@@ -127,7 +127,7 @@
if filters.get("group_by_mr"):
# consolidated material request map for group by filter
- if not row["material_request"] in material_request_map:
+ if row["material_request"] not in material_request_map:
# create an entry with mr as key
row_copy = copy.deepcopy(row)
material_request_map[row["material_request"]] = row_copy
diff --git a/erpnext/buying/report/supplier_quotation_comparison/supplier_quotation_comparison.py b/erpnext/buying/report/supplier_quotation_comparison/supplier_quotation_comparison.py
index 01ff28d..73b7d45 100644
--- a/erpnext/buying/report/supplier_quotation_comparison/supplier_quotation_comparison.py
+++ b/erpnext/buying/report/supplier_quotation_comparison/supplier_quotation_comparison.py
@@ -126,7 +126,7 @@
# map for chart preparation of the form {'supplier1': {'qty': 'price'}}
supplier = data.get("supplier_name")
if filters.get("item_code"):
- if not supplier in supplier_qty_price_map:
+ if supplier not in supplier_qty_price_map:
supplier_qty_price_map[supplier] = {}
supplier_qty_price_map[supplier][row["qty"]] = row["price"]
@@ -169,7 +169,7 @@
for supplier in suppliers:
entry = supplier_qty_price_map[supplier]
for qty in qty_list:
- if not qty in data_points_map:
+ if qty not in data_points_map:
data_points_map[qty] = []
if qty in entry:
data_points_map[qty].append(entry[qty])
diff --git a/erpnext/controllers/queries.py b/erpnext/controllers/queries.py
index 199732b..63dca63 100644
--- a/erpnext/controllers/queries.py
+++ b/erpnext/controllers/queries.py
@@ -222,7 +222,7 @@
searchfields = meta.get_search_fields()
columns = ""
- extra_searchfields = [field for field in searchfields if not field in ["name", "description"]]
+ extra_searchfields = [field for field in searchfields if field not in ["name", "description"]]
if extra_searchfields:
columns += ", " + ", ".join(extra_searchfields)
@@ -233,8 +233,13 @@
searchfields = searchfields + [
field
- for field in [searchfield or "name", "item_code", "item_group", "item_name"]
- if not field in searchfields
+ for field in [
+ searchfield or "name",
+ "item_code",
+ "item_group",
+ "item_name",
+ ]
+ if field not in searchfields
]
searchfields = " or ".join([field + " like %(txt)s" for field in searchfields])
@@ -872,7 +877,7 @@
meta = frappe.get_meta(doctype)
fields.extend(meta.get_search_fields())
- if meta.title_field and not meta.title_field.strip() in fields:
+ if meta.title_field and meta.title_field.strip() not in fields:
fields.insert(1, meta.title_field.strip())
return unique(fields)
diff --git a/erpnext/controllers/stock_controller.py b/erpnext/controllers/stock_controller.py
index fc45c7a..2fda9cc 100644
--- a/erpnext/controllers/stock_controller.py
+++ b/erpnext/controllers/stock_controller.py
@@ -642,7 +642,7 @@
)
qa_docstatus = frappe.db.get_value("Quality Inspection", row.quality_inspection, "docstatus")
- if not qa_docstatus == 1:
+ if qa_docstatus != 1:
link = frappe.utils.get_link_to_form("Quality Inspection", row.quality_inspection)
msg = (
f"Row #{row.idx}: Quality Inspection {link} is not submitted for the item: {row.item_code}"
diff --git a/erpnext/crm/doctype/appointment/appointment.py b/erpnext/crm/doctype/appointment/appointment.py
index 7be6fdc..a735510 100644
--- a/erpnext/crm/doctype/appointment/appointment.py
+++ b/erpnext/crm/doctype/appointment/appointment.py
@@ -55,7 +55,7 @@
"Appointment", filters={"scheduled_time": self.scheduled_time}
)
number_of_agents = frappe.db.get_single_value("Appointment Booking Settings", "number_of_agents")
- if not number_of_agents == 0:
+ if number_of_agents != 0:
if number_of_appointments_in_same_slot >= number_of_agents:
frappe.throw(_("Time slot is not available"))
# Link lead
@@ -110,7 +110,7 @@
cal_event.save(ignore_permissions=True)
def set_verified(self, email):
- if not email == self.customer_email:
+ if email != self.customer_email:
frappe.throw(_("Email verification failed."))
# Create new lead
self.create_lead_and_link()
diff --git a/erpnext/erpnext_integrations/utils.py b/erpnext/erpnext_integrations/utils.py
index 8984f1b..1924ffb 100644
--- a/erpnext/erpnext_integrations/utils.py
+++ b/erpnext/erpnext_integrations/utils.py
@@ -16,7 +16,7 @@
hmac.new(settings.get(secret_key).encode("utf8"), frappe.request.data, hashlib.sha256).digest()
)
- if frappe.request.data and not sig == bytes(frappe.get_request_header(hmac_key).encode()):
+ if frappe.request.data and sig != bytes(frappe.get_request_header(hmac_key).encode()):
frappe.throw(_("Unverified Webhook Data"))
frappe.set_user(settings.modified_by)
diff --git a/erpnext/hooks.py b/erpnext/hooks.py
index 17ad155..f6b6802 100644
--- a/erpnext/hooks.py
+++ b/erpnext/hooks.py
@@ -637,6 +637,7 @@
extend_bootinfo = [
"erpnext.support.doctype.service_level_agreement.service_level_agreement.add_sla_doctypes",
+ "erpnext.startup.boot.bootinfo",
]
diff --git a/erpnext/manufacturing/doctype/blanket_order/blanket_order.py b/erpnext/manufacturing/doctype/blanket_order/blanket_order.py
index b5ab63e..6a72c4f 100644
--- a/erpnext/manufacturing/doctype/blanket_order/blanket_order.py
+++ b/erpnext/manufacturing/doctype/blanket_order/blanket_order.py
@@ -89,7 +89,7 @@
def update_item(source, target, source_parent):
target_qty = source.get("qty") - source.get("ordered_qty")
- target.qty = target_qty if not flt(target_qty) < 0 else 0
+ target.qty = target_qty if flt(target_qty) >= 0 else 0
item = get_item_defaults(target.item_code, source_parent.company)
if item:
target.item_name = item.get("item_name")
diff --git a/erpnext/manufacturing/doctype/bom/bom.py b/erpnext/manufacturing/doctype/bom/bom.py
index 71015a4..f0381d2 100644
--- a/erpnext/manufacturing/doctype/bom/bom.py
+++ b/erpnext/manufacturing/doctype/bom/bom.py
@@ -1381,7 +1381,7 @@
# check for deletions
for d in old_value:
- if not d.get(identifier) in new_row_by_identifier:
+ if d.get(identifier) not in new_row_by_identifier:
out.removed.append([df.fieldname, d.as_dict()])
return out
@@ -1397,13 +1397,18 @@
fields = ["name", "item_name", "item_group", "description"]
fields.extend(
- [field for field in searchfields if not field in ["name", "item_group", "description"]]
+ [field for field in searchfields if field not in ["name", "item_group", "description"]]
)
searchfields = searchfields + [
field
- for field in [searchfield or "name", "item_code", "item_group", "item_name"]
- if not field in searchfields
+ for field in [
+ searchfield or "name",
+ "item_code",
+ "item_group",
+ "item_name",
+ ]
+ if field not in searchfields
]
query_filters = {"disabled": 0, "ifnull(end_of_life, '3099-12-31')": (">", today())}
diff --git a/erpnext/manufacturing/doctype/production_plan/production_plan.py b/erpnext/manufacturing/doctype/production_plan/production_plan.py
index 13ae3b3..c201c4f 100644
--- a/erpnext/manufacturing/doctype/production_plan/production_plan.py
+++ b/erpnext/manufacturing/doctype/production_plan/production_plan.py
@@ -815,7 +815,7 @@
key = "{}:{}:{}".format(item.sales_order, material_request_type, item_doc.customer or "")
schedule_date = item.schedule_date or add_days(nowdate(), cint(item_doc.lead_time_days))
- if not key in material_request_map:
+ if key not in material_request_map:
# make a new MR for the combination
material_request_map[key] = frappe.new_doc("Material Request")
material_request = material_request_map[key]
diff --git a/erpnext/manufacturing/doctype/work_order/work_order.py b/erpnext/manufacturing/doctype/work_order/work_order.py
index 78bfc76..0acc2b1 100644
--- a/erpnext/manufacturing/doctype/work_order/work_order.py
+++ b/erpnext/manufacturing/doctype/work_order/work_order.py
@@ -930,7 +930,7 @@
validate_end_of_life(self.production_item)
def validate_qty(self):
- if not self.qty > 0:
+ if self.qty <= 0:
frappe.throw(_("Quantity to Manufacture must be greater than 0."))
if (
@@ -957,7 +957,7 @@
max_qty = qty_dict.get("planned_qty", 0) + allowance_qty - qty_dict.get("ordered_qty", 0)
- if not max_qty > 0:
+ if max_qty <= 0:
frappe.throw(
_("Cannot produce more item for {0}").format(self.production_item), OverProductionError
)
@@ -968,7 +968,7 @@
)
def validate_transfer_against(self):
- if not self.docstatus == 1:
+ if self.docstatus != 1:
# let user configure operations until they're ready to submit
return
if not self.operations:
@@ -981,7 +981,7 @@
def validate_operation_time(self):
for d in self.operations:
- if not d.time_in_mins > 0:
+ if d.time_in_mins <= 0:
frappe.throw(_("Operation Time must be greater than 0 for Operation {0}").format(d.operation))
def update_required_items(self):
diff --git a/erpnext/patches/v12_0/set_task_status.py b/erpnext/patches/v12_0/set_task_status.py
index 1c6654e..27810d7 100644
--- a/erpnext/patches/v12_0/set_task_status.py
+++ b/erpnext/patches/v12_0/set_task_status.py
@@ -10,7 +10,7 @@
)
if property_setter_name:
property_setter = frappe.get_doc("Property Setter", property_setter_name)
- if not "Completed" in property_setter.value:
+ if "Completed" not in property_setter.value:
property_setter.value = property_setter.value + "\nCompleted"
property_setter.save()
diff --git a/erpnext/patches/v13_0/update_sla_enhancements.py b/erpnext/patches/v13_0/update_sla_enhancements.py
index 84c683a..cf9e185 100644
--- a/erpnext/patches/v13_0/update_sla_enhancements.py
+++ b/erpnext/patches/v13_0/update_sla_enhancements.py
@@ -46,7 +46,7 @@
{"response_time": response_time, "resolution_time": resolution_time},
)
if priority.parenttype == "Service Level":
- if not priority.parent in priority_dict:
+ if priority.parent not in priority_dict:
priority_dict[priority.parent] = []
priority_dict[priority.parent].append(priority)
diff --git a/erpnext/portal/utils.py b/erpnext/portal/utils.py
index 903d4a6..86426b2 100644
--- a/erpnext/portal/utils.py
+++ b/erpnext/portal/utils.py
@@ -50,7 +50,7 @@
party = frappe.new_doc(doctype)
fullname = frappe.utils.get_fullname(user)
- if not doctype == "Customer":
+ if doctype != "Customer":
party.update(
{
"supplier_name": fullname,
diff --git a/erpnext/projects/doctype/project/project.py b/erpnext/projects/doctype/project/project.py
index 4f2e395..751dcbd 100644
--- a/erpnext/projects/doctype/project/project.py
+++ b/erpnext/projects/doctype/project/project.py
@@ -661,7 +661,7 @@
"""
set status for project and all related tasks
"""
- if not status in ("Completed", "Cancelled"):
+ if status not in ("Completed", "Cancelled"):
frappe.throw(_("Status must be Cancelled or Completed"))
project = frappe.get_doc("Project", project)
diff --git a/erpnext/public/js/financial_statements.js b/erpnext/public/js/financial_statements.js
index 1b10d8a..17341d1 100644
--- a/erpnext/public/js/financial_statements.js
+++ b/erpnext/public/js/financial_statements.js
@@ -2,10 +2,16 @@
erpnext.financial_statements = {
"filters": get_filters(),
- "formatter": function(value, row, column, data, default_formatter) {
+ "formatter": function(value, row, column, data, default_formatter, filter) {
if (data && column.fieldname=="account") {
value = data.account_name || value;
+ if (filter && filter?.text && filter?.type == "contains") {
+ if (!value.toLowerCase().includes(filter.text)) {
+ return value;
+ }
+ }
+
if (data.account) {
column.link_onclick =
"erpnext.financial_statements.open_general_ledger(" + JSON.stringify(data) + ")";
diff --git a/erpnext/selling/report/item_wise_sales_history/item_wise_sales_history.py b/erpnext/selling/report/item_wise_sales_history/item_wise_sales_history.py
index 2624db3..cd45e7d 100644
--- a/erpnext/selling/report/item_wise_sales_history/item_wise_sales_history.py
+++ b/erpnext/selling/report/item_wise_sales_history/item_wise_sales_history.py
@@ -240,7 +240,7 @@
for row in data:
item_key = row.get("item_code")
- if not item_key in item_wise_sales_map:
+ if item_key not in item_wise_sales_map:
item_wise_sales_map[item_key] = 0
item_wise_sales_map[item_key] = flt(item_wise_sales_map[item_key]) + flt(row.get("amount"))
diff --git a/erpnext/selling/report/sales_order_analysis/sales_order_analysis.py b/erpnext/selling/report/sales_order_analysis/sales_order_analysis.py
index 2969123..1e1d0c0 100644
--- a/erpnext/selling/report/sales_order_analysis/sales_order_analysis.py
+++ b/erpnext/selling/report/sales_order_analysis/sales_order_analysis.py
@@ -167,7 +167,7 @@
if filters.get("group_by_so"):
so_name = row["sales_order"]
- if not so_name in sales_order_map:
+ if so_name not in sales_order_map:
# create an entry
row_copy = copy.deepcopy(row)
sales_order_map[so_name] = row_copy
diff --git a/erpnext/setup/doctype/authorization_control/authorization_control.py b/erpnext/setup/doctype/authorization_control/authorization_control.py
index feb14a8..9446fb4 100644
--- a/erpnext/setup/doctype/authorization_control/authorization_control.py
+++ b/erpnext/setup/doctype/authorization_control/authorization_control.py
@@ -185,7 +185,10 @@
# Remove user specific rules from global authorization rules
for r in based_on:
- if r in final_based_on and not r in ["Itemwise Discount", "Item Group wise Discount"]:
+ if r in final_based_on and r not in [
+ "Itemwise Discount",
+ "Item Group wise Discount",
+ ]:
final_based_on.remove(r)
# Check for authorization set on particular roles
@@ -213,7 +216,10 @@
# Remove role specific rules from global authorization rules
for r in based_on:
- if r in final_based_on and not r in ["Itemwise Discount", "Item Group wise Discount"]:
+ if r in final_based_on and r not in [
+ "Itemwise Discount",
+ "Item Group wise Discount",
+ ]:
final_based_on.remove(r)
# Check for global authorization
diff --git a/erpnext/setup/doctype/department/department.py b/erpnext/setup/doctype/department/department.py
index 6b090f8..16f6fbf 100644
--- a/erpnext/setup/doctype/department/department.py
+++ b/erpnext/setup/doctype/department/department.py
@@ -44,7 +44,7 @@
def before_rename(self, old, new, merge=False):
# renaming consistency with abbreviation
- if not frappe.get_cached_value("Company", self.company, "abbr") in new:
+ if frappe.get_cached_value("Company", self.company, "abbr") not in new:
new = get_abbreviated_name(new, self.company)
return new
diff --git a/erpnext/setup/doctype/email_digest/email_digest.py b/erpnext/setup/doctype/email_digest/email_digest.py
index 22bdf50..4b07056 100644
--- a/erpnext/setup/doctype/email_digest/email_digest.py
+++ b/erpnext/setup/doctype/email_digest/email_digest.py
@@ -689,7 +689,7 @@
]
def get_root_type_accounts(self, root_type):
- if not root_type in self._accounts:
+ if root_type not in self._accounts:
self._accounts[root_type] = [
d.name
for d in frappe.db.get_all(
diff --git a/erpnext/setup/doctype/employee/employee.py b/erpnext/setup/doctype/employee/employee.py
index 6f9176c..4bb3539 100755
--- a/erpnext/setup/doctype/employee/employee.py
+++ b/erpnext/setup/doctype/employee/employee.py
@@ -187,7 +187,7 @@
throw(_("Please enter relieving date."))
def validate_for_enabled_user_id(self, enabled):
- if not self.status == "Active":
+ if self.status != "Active":
return
if enabled is None:
diff --git a/erpnext/setup/install.py b/erpnext/setup/install.py
index 5b993fa..d1214fd 100644
--- a/erpnext/setup/install.py
+++ b/erpnext/setup/install.py
@@ -197,7 +197,7 @@
for item in erpnext_navbar_items:
current_labels = [item.get("item_label") for item in current_navbar_items]
- if not item.get("item_label") in current_labels:
+ if item.get("item_label") not in current_labels:
navbar_settings.append("help_dropdown", item)
for item in current_navbar_items:
diff --git a/erpnext/setup/setup_wizard/operations/taxes_setup.py b/erpnext/setup/setup_wizard/operations/taxes_setup.py
index 49ba78c..32d92f6 100644
--- a/erpnext/setup/setup_wizard/operations/taxes_setup.py
+++ b/erpnext/setup/setup_wizard/operations/taxes_setup.py
@@ -2,8 +2,8 @@
# License: GNU General Public License v3. See license.txt
-import os
import json
+import os
import frappe
from frappe import _
@@ -114,10 +114,11 @@
frappe.scrub(country)
)
frappe.get_attr(module_name)(country, company)
- except Exception as e:
+ except (ImportError, AttributeError):
+ pass
+ except Exception:
# Log error and ignore if failed to setup regional tax settings
frappe.log_error("Unable to setup regional tax settings")
- pass
def make_taxes_and_charges_template(company_name, doctype, template):
diff --git a/erpnext/startup/boot.py b/erpnext/startup/boot.py
index bdbf8b4..4b4d14f 100644
--- a/erpnext/startup/boot.py
+++ b/erpnext/startup/boot.py
@@ -75,3 +75,11 @@
"Sales Person Tree": {"title": "Sales Person Tree", "route": "Tree/Sales Person"},
}
)
+
+
+def bootinfo(bootinfo):
+ if bootinfo.get("user") and bootinfo["user"].get("name"):
+ bootinfo["user"]["employee"] = ""
+ employee = frappe.db.get_value("Employee", {"user_id": bootinfo["user"]["name"]}, "name")
+ if employee:
+ bootinfo["user"]["employee"] = employee
diff --git a/erpnext/stock/doctype/material_request/material_request.py b/erpnext/stock/doctype/material_request/material_request.py
index 7df74f8..3e90ed5 100644
--- a/erpnext/stock/doctype/material_request/material_request.py
+++ b/erpnext/stock/doctype/material_request/material_request.py
@@ -79,10 +79,10 @@
so_items = {} # Format --> {'SO/00001': {'Item/001': 120, 'Item/002': 24}}
for d in self.get("items"):
if d.sales_order:
- if not d.sales_order in so_items:
+ if d.sales_order not in so_items:
so_items[d.sales_order] = {d.item_code: flt(d.qty)}
else:
- if not d.item_code in so_items[d.sales_order]:
+ if d.item_code not in so_items[d.sales_order]:
so_items[d.sales_order][d.item_code] = flt(d.qty)
else:
so_items[d.sales_order][d.item_code] += flt(d.qty)
diff --git a/erpnext/stock/doctype/putaway_rule/putaway_rule.py b/erpnext/stock/doctype/putaway_rule/putaway_rule.py
index 3fc4e01..7ed6923 100644
--- a/erpnext/stock/doctype/putaway_rule/putaway_rule.py
+++ b/erpnext/stock/doctype/putaway_rule/putaway_rule.py
@@ -170,7 +170,7 @@
pending_qty -= qty_to_allocate
rule["free_space"] -= stock_qty_to_allocate
- if not pending_stock_qty > 0:
+ if pending_stock_qty <= 0:
break
# if pending qty after applying all rules, add row without warehouse
diff --git a/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.json b/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.json
index d46b07a..7a58462 100644
--- a/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.json
+++ b/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.json
@@ -1,7 +1,7 @@
{
"actions": [],
"autoname": "naming_series:",
- "creation": "2022-09-29 14:56:38.338267",
+ "creation": "2023-08-11 17:22:12.907518",
"doctype": "DocType",
"editable_grid": 1,
"engine": "InnoDB",
@@ -250,7 +250,7 @@
"index_web_pages_for_search": 1,
"is_submittable": 1,
"links": [],
- "modified": "2023-07-28 12:56:03.072224",
+ "modified": "2023-12-07 17:56:55.528563",
"modified_by": "Administrator",
"module": "Stock",
"name": "Serial and Batch Bundle",
@@ -270,6 +270,118 @@
"share": 1,
"submit": 1,
"write": 1
+ },
+ {
+ "cancel": 1,
+ "create": 1,
+ "delete": 1,
+ "email": 1,
+ "export": 1,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Purchase User",
+ "share": 1,
+ "submit": 1,
+ "write": 1
+ },
+ {
+ "cancel": 1,
+ "create": 1,
+ "delete": 1,
+ "email": 1,
+ "export": 1,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Purchase Manager",
+ "share": 1,
+ "submit": 1,
+ "write": 1
+ },
+ {
+ "cancel": 1,
+ "create": 1,
+ "delete": 1,
+ "email": 1,
+ "export": 1,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Stock User",
+ "share": 1,
+ "submit": 1,
+ "write": 1
+ },
+ {
+ "cancel": 1,
+ "create": 1,
+ "delete": 1,
+ "email": 1,
+ "export": 1,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Stock Manager",
+ "share": 1,
+ "submit": 1,
+ "write": 1
+ },
+ {
+ "cancel": 1,
+ "create": 1,
+ "delete": 1,
+ "email": 1,
+ "export": 1,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Delivery User",
+ "share": 1,
+ "submit": 1,
+ "write": 1
+ },
+ {
+ "cancel": 1,
+ "create": 1,
+ "delete": 1,
+ "email": 1,
+ "export": 1,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Delivery Manager",
+ "share": 1,
+ "submit": 1,
+ "write": 1
+ },
+ {
+ "cancel": 1,
+ "create": 1,
+ "delete": 1,
+ "email": 1,
+ "export": 1,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Manufacturing User",
+ "share": 1,
+ "submit": 1,
+ "write": 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
}
],
"sort_field": "modified",
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py
index 3baafd7..84e99c5 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.py
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.py
@@ -227,7 +227,7 @@
self.calculate_rate_and_amount()
self.validate_putaway_capacity()
- if not self.get("purpose") == "Manufacture":
+ if self.get("purpose") != "Manufacture":
# ignore scrap item wh difference and empty source/target wh
# in Manufacture Entry
self.reset_default_field_value("from_warehouse", "items", "s_warehouse")
diff --git a/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py b/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
index e62f0b2..23788cf 100644
--- a/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
+++ b/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
@@ -214,7 +214,9 @@
if not self.serial_and_batch_bundle:
self.throw_error_message(f"Serial No / Batch No are mandatory for Item {self.item_code}")
- if self.serial_and_batch_bundle and not (item_detail.has_serial_no or item_detail.has_batch_no):
+ if (
+ self.serial_and_batch_bundle and not item_detail.has_serial_no and not item_detail.has_batch_no
+ ):
self.throw_error_message(f"Serial No and Batch No are not allowed for Item {self.item_code}")
def throw_error_message(self, message, exception=frappe.ValidationError):
diff --git a/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.js b/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.js
index b3998b7..8e9dcb0 100644
--- a/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.js
+++ b/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.js
@@ -209,7 +209,7 @@
set_amount_quantity: function(doc, cdt, cdn) {
var d = frappe.model.get_doc(cdt, cdn);
- if (d.qty & d.valuation_rate) {
+ if (d.qty && d.valuation_rate) {
frappe.model.set_value(cdt, cdn, "amount", flt(d.qty) * flt(d.valuation_rate));
frappe.model.set_value(cdt, cdn, "quantity_difference", flt(d.qty) - flt(d.current_qty));
frappe.model.set_value(cdt, cdn, "amount_difference", flt(d.amount) - flt(d.current_amount));
diff --git a/erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py b/erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py
index 85550c2..24650fd 100644
--- a/erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py
+++ b/erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py
@@ -931,7 +931,7 @@
continue
# Stock should be reserved from the Pick List if has Picked Qty.
- if not from_voucher_type == "Pick List" and flt(item.picked_qty) > 0:
+ if from_voucher_type != "Pick List" and flt(item.picked_qty) > 0:
frappe.throw(
_("Row #{0}: Item {1} has been picked, please reserve stock from the Pick List.").format(
item.idx, frappe.bold(item.item_code)
diff --git a/erpnext/stock/report/stock_ledger_variance/stock_ledger_variance.py b/erpnext/stock/report/stock_ledger_variance/stock_ledger_variance.py
index acbbe90..189a90a 100644
--- a/erpnext/stock/report/stock_ledger_variance/stock_ledger_variance.py
+++ b/erpnext/stock/report/stock_ledger_variance/stock_ledger_variance.py
@@ -56,6 +56,11 @@
"options": "Warehouse",
},
{
+ "fieldname": "valuation_method",
+ "fieldtype": "Data",
+ "label": _("Valuation Method"),
+ },
+ {
"fieldname": "voucher_type",
"fieldtype": "Link",
"label": _("Voucher Type"),
@@ -194,6 +199,7 @@
def get_data(filters=None):
filters = frappe._dict(filters or {})
item_warehouse_map = get_item_warehouse_combinations(filters)
+ valuation_method = frappe.db.get_single_value("Stock Settings", "valuation_method")
data = []
if item_warehouse_map:
@@ -206,8 +212,17 @@
continue
for row in report_data:
- if has_difference(row, precision, filters.difference_in):
- data.append(add_item_warehouse_details(row, item_warehouse))
+ if has_difference(
+ row, precision, filters.difference_in, item_warehouse.valuation_method or valuation_method
+ ):
+ row.update(
+ {
+ "item_code": item_warehouse.item_code,
+ "warehouse": item_warehouse.warehouse,
+ "valuation_method": item_warehouse.valuation_method or valuation_method,
+ }
+ )
+ data.append(row)
break
return data
@@ -229,6 +244,7 @@
.select(
bin.item_code,
bin.warehouse,
+ item.valuation_method,
)
.where(
(item.is_stock_item == 1)
@@ -248,37 +264,27 @@
return query.run(as_dict=1)
-def has_difference(row, precision, difference_in):
- has_qty_difference = flt(row.difference_in_qty, precision) or flt(row.fifo_qty_diff, precision)
- has_value_difference = (
- flt(row.diff_value_diff, precision)
- or flt(row.fifo_value_diff, precision)
- or flt(row.fifo_difference_diff, precision)
- )
- has_valuation_difference = flt(row.valuation_diff, precision) or flt(
- row.fifo_valuation_diff, precision
- )
+def has_difference(row, precision, difference_in, valuation_method):
+ if valuation_method == "Moving Average":
+ qty_diff = flt(row.difference_in_qty, precision)
+ value_diff = flt(row.diff_value_diff, precision)
+ valuation_diff = flt(row.valuation_diff, precision)
+ else:
+ qty_diff = flt(row.difference_in_qty, precision) or flt(row.fifo_qty_diff, precision)
+ value_diff = (
+ flt(row.diff_value_diff, precision)
+ or flt(row.fifo_value_diff, precision)
+ or flt(row.fifo_difference_diff, precision)
+ )
+ valuation_diff = flt(row.valuation_diff, precision) or flt(row.fifo_valuation_diff, precision)
- if difference_in == "Qty" and has_qty_difference:
+ if difference_in == "Qty" and qty_diff:
return True
- elif difference_in == "Value" and has_value_difference:
+ elif difference_in == "Value" and value_diff:
return True
- elif difference_in == "Valuation" and has_valuation_difference:
+ elif difference_in == "Valuation" and valuation_diff:
return True
elif difference_in not in ["Qty", "Value", "Valuation"] and (
- has_qty_difference or has_value_difference or has_valuation_difference
+ qty_diff or value_diff or valuation_diff
):
return True
-
- return False
-
-
-def add_item_warehouse_details(row, item_warehouse):
- row.update(
- {
- "item_code": item_warehouse.item_code,
- "warehouse": item_warehouse.warehouse,
- }
- )
-
- return row
diff --git a/erpnext/stock/stock_ledger.py b/erpnext/stock/stock_ledger.py
index 9142a27..9203f45 100644
--- a/erpnext/stock/stock_ledger.py
+++ b/erpnext/stock/stock_ledger.py
@@ -1711,7 +1711,7 @@
def validate_negative_qty_in_future_sle(args, allow_negative_stock=False):
if allow_negative_stock or is_negative_stock_allowed(item_code=args.item_code):
return
- if not (args.actual_qty < 0 or args.voucher_type == "Stock Reconciliation"):
+ if args.actual_qty >= 0 and args.voucher_type != "Stock Reconciliation":
return
neg_sle = get_future_sle_with_negative_qty(args)
diff --git a/erpnext/support/doctype/service_level_agreement/service_level_agreement.py b/erpnext/support/doctype/service_level_agreement/service_level_agreement.py
index 879381c..8b37c94 100644
--- a/erpnext/support/doctype/service_level_agreement/service_level_agreement.py
+++ b/erpnext/support/doctype/service_level_agreement/service_level_agreement.py
@@ -100,7 +100,7 @@
priorities.append(priority.priority)
# Check if repeated priority
- if not len(set(priorities)) == len(priorities):
+ if len(set(priorities)) != len(priorities):
repeated_priority = get_repeated(priorities)
frappe.throw(_("Priority {0} has been repeated.").format(repeated_priority))
@@ -128,7 +128,7 @@
)
# Check for repeated workday
- if not len(set(support_days)) == len(support_days):
+ if len(set(support_days)) != len(support_days):
repeated_days = get_repeated(support_days)
frappe.throw(_("Workday {0} has been repeated.").format(repeated_days))
@@ -748,13 +748,13 @@
and frappe.db.get_single_value("Support Settings", "track_service_level_agreement")
):
- if not self.priority == frappe.db.get_value("Issue", self.name, "priority"):
+ if self.priority != frappe.db.get_value("Issue", self.name, "priority"):
self.set_response_and_resolution_time(
priority=self.priority, service_level_agreement=self.service_level_agreement
)
frappe.msgprint(_("Priority has been changed to {0}.").format(self.priority))
- if not self.service_level_agreement == frappe.db.get_value(
+ if self.service_level_agreement != frappe.db.get_value(
"Issue", self.name, "service_level_agreement"
):
self.set_response_and_resolution_time(