fix(treewide): manual ruff fixes

(cherry picked from commit f63396ef47)
Signed-off-by: Akhil Narang <me@akhilnarang.dev>
This commit is contained in:
Akhil Narang
2024-03-27 12:16:13 +05:30
parent 960ef14b7a
commit 7828eee014
35 changed files with 121 additions and 137 deletions

View File

@@ -182,7 +182,7 @@ class BankTransaction(Document):
frappe.throw(_("Voucher {0} is over-allocated by {1}").format(unallocated_amount)) frappe.throw(_("Voucher {0} is over-allocated by {1}").format(unallocated_amount))
for payment_entry in to_remove: for payment_entry in to_remove:
self.remove(to_remove) self.remove(payment_entry)
@frappe.whitelist() @frappe.whitelist()
def remove_payment_entries(self): def remove_payment_entries(self):

View File

@@ -373,12 +373,9 @@ def get_actual_expense(args):
args.update(lft_rgt) args.update(lft_rgt)
condition2 = """and exists(select name from `tab{doctype}` condition2 = f"""and exists(select name from `tab{args.budget_against_doctype}`
where lft>=%(lft)s and rgt<=%(rgt)s where lft>=%(lft)s and rgt<=%(rgt)s
and name=gle.{budget_against_field})""".format( and name=gle.{budget_against_field})"""
doctype=args.budget_against_doctype,
budget_against_field=budget_against_field, # nosec
)
else: else:
condition2 = f"""and exists(select name from `tab{args.budget_against_doctype}` condition2 = f"""and exists(select name from `tab{args.budget_against_doctype}`
where name=gle.{budget_against_field} and where name=gle.{budget_against_field} and

View File

@@ -75,8 +75,8 @@ class TestInvoiceDiscounting(unittest.TestCase):
gle = get_gl_entries("Invoice Discounting", inv_disc.name) gle = get_gl_entries("Invoice Discounting", inv_disc.name)
expected_gle = {inv.debit_to: [0.0, 200], self.ar_credit: [200, 0.0]} expected_gle = {inv.debit_to: [0.0, 200], self.ar_credit: [200, 0.0]}
for _i, gle in enumerate(gle): for _i, gle_value in enumerate(gle):
self.assertEqual([gle.debit, gle.credit], expected_gle.get(gle.account)) self.assertEqual([gle_value.debit, gle_value.credit], expected_gle.get(gle_value.account))
def test_loan_on_submit(self): def test_loan_on_submit(self):
inv = create_sales_invoice(rate=300) inv = create_sales_invoice(rate=300)

View File

@@ -160,7 +160,7 @@ class TestPaymentEntry(FrappeTestCase):
supplier.on_hold = 0 supplier.on_hold = 0
supplier.save() supplier.save()
except: except Exception:
pass pass
else: else:
raise Exception raise Exception

View File

@@ -84,11 +84,14 @@ class TestPaymentLedgerEntry(FrappeTestCase):
self.customer = customer.name self.customer = customer.name
def create_sales_invoice( def create_sales_invoice(
self, qty=1, rate=100, posting_date=nowdate(), do_not_save=False, do_not_submit=False self, qty=1, rate=100, posting_date=None, do_not_save=False, do_not_submit=False
): ):
""" """
Helper function to populate default values in sales invoice Helper function to populate default values in sales invoice
""" """
if posting_date is None:
posting_date = nowdate()
sinv = create_sales_invoice( sinv = create_sales_invoice(
qty=qty, qty=qty,
rate=rate, rate=rate,
@@ -112,10 +115,12 @@ class TestPaymentLedgerEntry(FrappeTestCase):
) )
return sinv return sinv
def create_payment_entry(self, amount=100, posting_date=nowdate()): def create_payment_entry(self, amount=100, posting_date=None):
""" """
Helper function to populate default values in payment entry Helper function to populate default values in payment entry
""" """
if posting_date is None:
posting_date = nowdate()
payment = create_payment_entry( payment = create_payment_entry(
company=self.company, company=self.company,
payment_type="Receive", payment_type="Receive",
@@ -128,9 +133,10 @@ class TestPaymentLedgerEntry(FrappeTestCase):
payment.posting_date = posting_date payment.posting_date = posting_date
return payment return payment
def create_sales_order( def create_sales_order(self, qty=1, rate=100, posting_date=None, do_not_save=False, do_not_submit=False):
self, qty=1, rate=100, posting_date=nowdate(), do_not_save=False, do_not_submit=False if posting_date is None:
): posting_date = nowdate()
so = make_sales_order( so = make_sales_order(
company=self.company, company=self.company,
transaction_date=posting_date, transaction_date=posting_date,

View File

@@ -134,11 +134,14 @@ class TestPaymentReconciliation(FrappeTestCase):
setattr(self, x.attribute, acc.name) setattr(self, x.attribute, acc.name)
def create_sales_invoice( def create_sales_invoice(
self, qty=1, rate=100, posting_date=nowdate(), do_not_save=False, do_not_submit=False self, qty=1, rate=100, posting_date=None, do_not_save=False, do_not_submit=False
): ):
""" """
Helper function to populate default values in sales invoice Helper function to populate default values in sales invoice
""" """
if posting_date is None:
posting_date = nowdate()
sinv = create_sales_invoice( sinv = create_sales_invoice(
qty=qty, qty=qty,
rate=rate, rate=rate,
@@ -162,10 +165,13 @@ class TestPaymentReconciliation(FrappeTestCase):
) )
return sinv return sinv
def create_payment_entry(self, amount=100, posting_date=nowdate(), customer=None): def create_payment_entry(self, amount=100, posting_date=None, customer=None):
""" """
Helper function to populate default values in payment entry Helper function to populate default values in payment entry
""" """
if posting_date is None:
posting_date = nowdate()
payment = create_payment_entry( payment = create_payment_entry(
company=self.company, company=self.company,
payment_type="Receive", payment_type="Receive",
@@ -179,11 +185,14 @@ class TestPaymentReconciliation(FrappeTestCase):
return payment return payment
def create_purchase_invoice( def create_purchase_invoice(
self, qty=1, rate=100, posting_date=nowdate(), do_not_save=False, do_not_submit=False self, qty=1, rate=100, posting_date=None, do_not_save=False, do_not_submit=False
): ):
""" """
Helper function to populate default values in sales invoice Helper function to populate default values in sales invoice
""" """
if posting_date is None:
posting_date = nowdate()
pinv = make_purchase_invoice( pinv = make_purchase_invoice(
qty=qty, qty=qty,
rate=rate, rate=rate,
@@ -208,11 +217,14 @@ class TestPaymentReconciliation(FrappeTestCase):
return pinv return pinv
def create_purchase_order( def create_purchase_order(
self, qty=1, rate=100, posting_date=nowdate(), do_not_save=False, do_not_submit=False self, qty=1, rate=100, posting_date=None, do_not_save=False, do_not_submit=False
): ):
""" """
Helper function to populate default values in sales invoice Helper function to populate default values in sales invoice
""" """
if posting_date is None:
posting_date = nowdate()
pord = create_purchase_order( pord = create_purchase_order(
qty=qty, qty=qty,
rate=rate, rate=rate,

View File

@@ -480,7 +480,7 @@ def create_merge_logs(invoice_by_customer, closing_entry=None):
if closing_entry: if closing_entry:
closing_entry.set_status(update=True, status="Failed") closing_entry.set_status(update=True, status="Failed")
if type(error_message) == list: if isinstance(error_message, list):
error_message = frappe.json.dumps(error_message) error_message = frappe.json.dumps(error_message)
closing_entry.db_set("error_message", error_message) closing_entry.db_set("error_message", error_message)
raise raise

View File

@@ -503,7 +503,7 @@ def reconcile(doc: None | str = None) -> None:
def is_any_doc_running(for_filter: str | dict | None = None) -> str | None: def is_any_doc_running(for_filter: str | dict | None = None) -> str | None:
running_doc = None running_doc = None
if for_filter: if for_filter:
if type(for_filter) == str: if isinstance(for_filter, str):
for_filter = frappe.json.loads(for_filter) for_filter = frappe.json.loads(for_filter)
running_doc = frappe.db.get_value( running_doc = frappe.db.get_value(

View File

@@ -1,13 +1,11 @@
# Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and contributors # Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and contributors
# For license information, please see license.txt # For license information, please see license.txt
from datetime import datetime
import frappe import frappe
from frappe.model.document import Document from frappe.model.document import Document
from frappe.utils import getdate from frappe.utils import getdate
from erpnext.accounts.doctype.subscription.subscription import process_all from erpnext.accounts.doctype.subscription.subscription import DateTimeLikeObject, process_all
class ProcessSubscription(Document): class ProcessSubscription(Document):
@@ -29,7 +27,7 @@ class ProcessSubscription(Document):
def create_subscription_process( def create_subscription_process(
subscription: str | None = None, posting_date: str | datetime.date | None = None subscription: str | None = None, posting_date: DateTimeLikeObject | None = None
): ):
"""Create a new Process Subscription document""" """Create a new Process Subscription document"""
doc = frappe.new_doc("Process Subscription") doc = frappe.new_doc("Process Subscription")

View File

@@ -221,7 +221,7 @@ class TestPurchaseInvoice(FrappeTestCase, StockTestMixin):
supplier.on_hold = 0 supplier.on_hold = 0
supplier.save() supplier.save()
except: except Exception:
pass pass
else: else:
raise Exception raise Exception

View File

@@ -3730,41 +3730,6 @@ def set_advance_flag(company, flag, default_account):
) )
def get_sales_invoice_for_e_invoice():
si = make_sales_invoice_for_ewaybill()
si.naming_series = "INV-2020-.#####"
si.items = []
si.append(
"items",
{
"item_code": "_Test Item",
"uom": "Nos",
"warehouse": "_Test Warehouse - _TC",
"qty": 2000,
"rate": 12,
"income_account": "Sales - _TC",
"expense_account": "Cost of Goods Sold - _TC",
"cost_center": "_Test Cost Center - _TC",
},
)
si.append(
"items",
{
"item_code": "_Test Item 2",
"uom": "Nos",
"warehouse": "_Test Warehouse - _TC",
"qty": 420,
"rate": 15,
"income_account": "Sales - _TC",
"expense_account": "Cost of Goods Sold - _TC",
"cost_center": "_Test Cost Center - _TC",
},
)
return si
def check_gl_entries(doc, voucher_no, expected_gle, posting_date, voucher_type="Sales Invoice"): def check_gl_entries(doc, voucher_no, expected_gle, posting_date, voucher_type="Sales Invoice"):
gl = frappe.qb.DocType("GL Entry") gl = frappe.qb.DocType("GL Entry")
q = ( q = (

View File

@@ -2,8 +2,7 @@
# For license information, please see license.txt # For license information, please see license.txt
from datetime import datetime from datetime import date
from typing import Optional, Union
import frappe import frappe
from frappe import _ from frappe import _
@@ -37,7 +36,7 @@ class InvoiceNotCancelled(frappe.ValidationError):
pass pass
DateTimeLikeObject = Union[str, datetime.date] DateTimeLikeObject = str | date
class Subscription(Document): class Subscription(Document):
@@ -88,7 +87,7 @@ class Subscription(Document):
# update start just before the subscription doc is created # update start just before the subscription doc is created
self.update_subscription_period(self.start_date) self.update_subscription_period(self.start_date)
def update_subscription_period(self, date: Optional["DateTimeLikeObject"] = None): def update_subscription_period(self, date: DateTimeLikeObject | None = None):
""" """
Subscription period is the period to be billed. This method updates the Subscription period is the period to be billed. This method updates the
beginning of the billing period and end of the billing period. beginning of the billing period and end of the billing period.
@@ -99,13 +98,13 @@ class Subscription(Document):
self.current_invoice_start = self.get_current_invoice_start(date) self.current_invoice_start = self.get_current_invoice_start(date)
self.current_invoice_end = self.get_current_invoice_end(self.current_invoice_start) self.current_invoice_end = self.get_current_invoice_end(self.current_invoice_start)
def _get_subscription_period(self, date: Optional["DateTimeLikeObject"] = None): def _get_subscription_period(self, date: DateTimeLikeObject | None = None):
_current_invoice_start = self.get_current_invoice_start(date) _current_invoice_start = self.get_current_invoice_start(date)
_current_invoice_end = self.get_current_invoice_end(_current_invoice_start) _current_invoice_end = self.get_current_invoice_end(_current_invoice_start)
return _current_invoice_start, _current_invoice_end return _current_invoice_start, _current_invoice_end
def get_current_invoice_start(self, date: Optional["DateTimeLikeObject"] = None) -> datetime.date | str: def get_current_invoice_start(self, date: DateTimeLikeObject | None = None) -> DateTimeLikeObject:
""" """
This returns the date of the beginning of the current billing period. This returns the date of the beginning of the current billing period.
If the `date` parameter is not given , it will be automatically set as today's If the `date` parameter is not given , it will be automatically set as today's
@@ -128,7 +127,7 @@ class Subscription(Document):
return _current_invoice_start return _current_invoice_start
def get_current_invoice_end(self, date: Optional["DateTimeLikeObject"] = None) -> datetime.date | str: def get_current_invoice_end(self, date: DateTimeLikeObject | None = None) -> DateTimeLikeObject:
""" """
This returns the date of the end of the current billing period. This returns the date of the end of the current billing period.
If the subscription is in trial period, it will be set as the end of the If the subscription is in trial period, it will be set as the end of the
@@ -222,7 +221,7 @@ class Subscription(Document):
return data return data
def set_subscription_status(self, posting_date: Optional["DateTimeLikeObject"] = None) -> None: def set_subscription_status(self, posting_date: DateTimeLikeObject | None = None) -> None:
""" """
Sets the status of the `Subscription` Sets the status of the `Subscription`
""" """
@@ -246,7 +245,7 @@ class Subscription(Document):
@staticmethod @staticmethod
def period_has_passed( def period_has_passed(
end_date: str | datetime.date, posting_date: Optional["DateTimeLikeObject"] = None end_date: DateTimeLikeObject, posting_date: DateTimeLikeObject | None = None
) -> bool: ) -> bool:
""" """
Returns true if the given `end_date` has passed Returns true if the given `end_date` has passed
@@ -266,7 +265,7 @@ class Subscription(Document):
return status return status
def is_past_grace_period(self, posting_date: Optional["DateTimeLikeObject"] = None) -> bool: def is_past_grace_period(self, posting_date: DateTimeLikeObject | None = None) -> bool:
""" """
Returns `True` if the grace period for the `Subscription` has passed Returns `True` if the grace period for the `Subscription` has passed
""" """
@@ -276,7 +275,7 @@ class Subscription(Document):
grace_period = cint(frappe.get_value("Subscription Settings", None, "grace_period")) grace_period = cint(frappe.get_value("Subscription Settings", None, "grace_period"))
return getdate(posting_date) >= getdate(add_days(self.current_invoice.due_date, grace_period)) return getdate(posting_date) >= getdate(add_days(self.current_invoice.due_date, grace_period))
def current_invoice_is_past_due(self, posting_date: Optional["DateTimeLikeObject"] = None) -> bool: def current_invoice_is_past_due(self, posting_date: DateTimeLikeObject | None = None) -> bool:
""" """
Returns `True` if the current generated invoice is overdue Returns `True` if the current generated invoice is overdue
""" """
@@ -377,9 +376,9 @@ class Subscription(Document):
def generate_invoice( def generate_invoice(
self, self,
from_date: str | datetime.date | None = None, from_date: DateTimeLikeObject | None = None,
to_date: str | datetime.date | None = None, to_date: DateTimeLikeObject | None = None,
posting_date: str | datetime.date | None = None, posting_date: DateTimeLikeObject | None = None,
) -> Document: ) -> Document:
""" """
Creates a `Invoice` for the `Subscription`, updates `self.invoices` and Creates a `Invoice` for the `Subscription`, updates `self.invoices` and
@@ -390,9 +389,9 @@ class Subscription(Document):
def create_invoice( def create_invoice(
self, self,
from_date: str | datetime.date | None = None, from_date: DateTimeLikeObject | None = None,
to_date: str | datetime.date | None = None, to_date: DateTimeLikeObject | None = None,
posting_date: str | datetime.date | None = None, posting_date: DateTimeLikeObject | None = None,
) -> Document: ) -> Document:
""" """
Creates a `Invoice`, submits it and returns it Creates a `Invoice`, submits it and returns it
@@ -572,7 +571,7 @@ class Subscription(Document):
return items return items
@frappe.whitelist() @frappe.whitelist()
def process(self, posting_date: Optional["DateTimeLikeObject"] = None) -> bool: def process(self, posting_date: DateTimeLikeObject | None = None) -> bool:
""" """
To be called by task periodically. It checks the subscription and takes appropriate action To be called by task periodically. It checks the subscription and takes appropriate action
as need be. It calls either of these methods depending the `Subscription` status: as need be. It calls either of these methods depending the `Subscription` status:
@@ -597,7 +596,7 @@ class Subscription(Document):
self.save() self.save()
def can_generate_new_invoice(self, posting_date: Optional["DateTimeLikeObject"] = None) -> bool: def can_generate_new_invoice(self, posting_date: DateTimeLikeObject | None = None) -> bool:
if self.cancelation_date: if self.cancelation_date:
return False return False
@@ -619,8 +618,8 @@ class Subscription(Document):
def is_current_invoice_generated( def is_current_invoice_generated(
self, self,
_current_start_date: datetime.date | str | None = None, _current_start_date: DateTimeLikeObject | None = None,
_current_end_date: datetime.date | str | None = None, _current_end_date: DateTimeLikeObject | None = None,
) -> bool: ) -> bool:
if not (_current_start_date and _current_end_date): if not (_current_start_date and _current_end_date):
_current_start_date, _current_end_date = self._get_subscription_period( _current_start_date, _current_end_date = self._get_subscription_period(
@@ -716,7 +715,7 @@ class Subscription(Document):
self.save() self.save()
@frappe.whitelist() @frappe.whitelist()
def restart_subscription(self, posting_date: Optional["DateTimeLikeObject"] = None) -> None: def restart_subscription(self, posting_date: DateTimeLikeObject | None = None) -> None:
""" """
This sets the subscription as active. The subscription will be made to be like a new This sets the subscription as active. The subscription will be made to be like a new
subscription and the `Subscription` will lose all the history of generated invoices subscription and the `Subscription` will lose all the history of generated invoices
@@ -736,8 +735,8 @@ def is_prorate() -> int:
def get_prorata_factor( def get_prorata_factor(
period_end: datetime.date | str, period_end: DateTimeLikeObject,
period_start: datetime.date | str, period_start: DateTimeLikeObject,
is_prepaid: int | None = None, is_prepaid: int | None = None,
) -> int | float: ) -> int | float:
if is_prepaid: if is_prepaid:
@@ -748,7 +747,7 @@ def get_prorata_factor(
return diff / plan_days return diff / plan_days
def process_all(subscription: str | None = None, posting_date: Optional["DateTimeLikeObject"] = None) -> None: def process_all(subscription: str | None = None, posting_date: DateTimeLikeObject | None = None) -> None:
""" """
Task to updates the status of all `Subscription` apart from those that are cancelled Task to updates the status of all `Subscription` apart from those that are cancelled
""" """

View File

@@ -192,7 +192,7 @@ class Deferred_Invoice:
for item in self.items: for item in self.items:
item_total = item.calculate_item_revenue_expense_for_period() item_total = item.calculate_item_revenue_expense_for_period()
# update invoice total # update invoice total
for idx, period in enumerate(self.period_list, 0): for idx in range(len(self.period_list)):
self.period_total[idx].total += item_total[idx].total self.period_total[idx].total += item_total[idx].total
self.period_total[idx].actual += item_total[idx].actual self.period_total[idx].actual += item_total[idx].actual
return self.period_total return self.period_total
@@ -346,7 +346,7 @@ class Deferred_Revenue_and_Expense_Report:
for inv in self.deferred_invoices: for inv in self.deferred_invoices:
inv_total = inv.calculate_invoice_revenue_expense_for_period() inv_total = inv.calculate_invoice_revenue_expense_for_period()
# calculate total for whole report # calculate total for whole report
for idx, period in enumerate(self.period_list, 0): for idx in range(len(self.period_list)):
self.period_total[idx].total += inv_total[idx].total self.period_total[idx].total += inv_total[idx].total
self.period_total[idx].actual += inv_total[idx].actual self.period_total[idx].actual += inv_total[idx].actual

View File

@@ -491,7 +491,7 @@ def get_accountwise_gle(filters, accounting_dimensions, gl_entries, gle_map):
else: else:
update_value_in_dict(consolidated_gle, key, gle) update_value_in_dict(consolidated_gle, key, gle)
for key, value in consolidated_gle.items(): for value in consolidated_gle.values():
update_value_in_dict(totals, "total", value) update_value_in_dict(totals, "total", value)
update_value_in_dict(totals, "closing", value) update_value_in_dict(totals, "closing", value)
entries.append(value) entries.append(value)

View File

@@ -494,7 +494,7 @@ class GrossProfitGenerator:
def get_average_rate_based_on_group_by(self): def get_average_rate_based_on_group_by(self):
for key in list(self.grouped): for key in list(self.grouped):
if self.filters.get("group_by") == "Invoice": if self.filters.get("group_by") == "Invoice":
for i, row in enumerate(self.grouped[key]): for row in self.grouped[key]:
if row.indent == 1.0: if row.indent == 1.0:
if ( if (
row.parent in self.returned_invoices row.parent in self.returned_invoices

View File

@@ -86,11 +86,14 @@ class TestGrossProfit(FrappeTestCase):
self.customer = customer.name self.customer = customer.name
def create_sales_invoice( def create_sales_invoice(
self, qty=1, rate=100, posting_date=nowdate(), do_not_save=False, do_not_submit=False self, qty=1, rate=100, posting_date=None, do_not_save=False, do_not_submit=False
): ):
""" """
Helper function to populate default values in sales invoice Helper function to populate default values in sales invoice
""" """
if posting_date is None:
posting_date = nowdate()
sinv = create_sales_invoice( sinv = create_sales_invoice(
qty=qty, qty=qty,
rate=rate, rate=rate,
@@ -115,11 +118,14 @@ class TestGrossProfit(FrappeTestCase):
return sinv return sinv
def create_delivery_note( def create_delivery_note(
self, item=None, qty=1, rate=100, posting_date=nowdate(), do_not_save=False, do_not_submit=False self, item=None, qty=1, rate=100, posting_date=None, do_not_save=False, do_not_submit=False
): ):
""" """
Helper function to populate default values in Delivery Note Helper function to populate default values in Delivery Note
""" """
if posting_date is None:
posting_date = nowdate()
dnote = create_delivery_note( dnote = create_delivery_note(
company=self.company, company=self.company,
customer=self.customer, customer=self.customer,

View File

@@ -692,7 +692,7 @@ class TestPurchaseOrder(FrappeTestCase):
supplier.on_hold = 0 supplier.on_hold = 0
supplier.save() supplier.save()
except: except Exception:
pass pass
else: else:
raise Exception raise Exception

View File

@@ -140,13 +140,16 @@ class TestAccountsController(FrappeTestCase):
qty=1, qty=1,
rate=1, rate=1,
conversion_rate=80, conversion_rate=80,
posting_date=nowdate(), posting_date=None,
do_not_save=False, do_not_save=False,
do_not_submit=False, do_not_submit=False,
): ):
""" """
Helper function to populate default values in sales invoice Helper function to populate default values in sales invoice
""" """
if posting_date is None:
posting_date = nowdate()
sinv = create_sales_invoice( sinv = create_sales_invoice(
qty=qty, qty=qty,
rate=rate, rate=rate,
@@ -171,10 +174,13 @@ class TestAccountsController(FrappeTestCase):
) )
return sinv return sinv
def create_payment_entry(self, amount=1, source_exc_rate=75, posting_date=nowdate(), customer=None): def create_payment_entry(self, amount=1, source_exc_rate=75, posting_date=None, customer=None):
""" """
Helper function to populate default values in payment entry Helper function to populate default values in payment entry
""" """
if posting_date is None:
posting_date = nowdate()
payment = create_payment_entry( payment = create_payment_entry(
company=self.company, company=self.company,
payment_type="Receive", payment_type="Receive",

View File

@@ -560,7 +560,7 @@ class TestSubcontractingController(FrappeTestCase):
scr2.set_missing_values() scr2.set_missing_values()
scr2.submit() scr2.submit()
for key, value in get_supplied_items(scr2).items(): for value in get_supplied_items(scr2).values():
self.assertEqual(value.qty, 4) self.assertEqual(value.qty, 4)
scr3 = make_subcontracting_receipt(sco.name) scr3 = make_subcontracting_receipt(sco.name)
@@ -570,7 +570,7 @@ class TestSubcontractingController(FrappeTestCase):
scr3.set_missing_values() scr3.set_missing_values()
scr3.submit() scr3.submit()
for key, value in get_supplied_items(scr3).items(): for value in get_supplied_items(scr3).values():
self.assertEqual(value.qty, 1) self.assertEqual(value.qty, 1)
def test_partial_transfer_serial_no_components_based_on_material_transfer(self): def test_partial_transfer_serial_no_components_based_on_material_transfer(self):

View File

@@ -3,6 +3,7 @@
import datetime import datetime
import typing
import frappe import frappe
from frappe import _ from frappe import _
@@ -36,7 +37,7 @@ class AppointmentBookingSettings(Document):
success_redirect_url: DF.Data | None success_redirect_url: DF.Data | None
# end: auto-generated types # end: auto-generated types
agent_list = [] # Hack agent_list: typing.ClassVar[list] = [] # Hack
min_date = "01/01/1970 " min_date = "01/01/1970 "
format_string = "%d/%m/%Y %H:%M:%S" format_string = "%d/%m/%Y %H:%M:%S"

View File

@@ -1580,7 +1580,7 @@ def get_items_for_material_requests(doc, warehouses=None, get_parent_warehouse_d
so_item_details[sales_order][item_code] = details so_item_details[sales_order][item_code] = details
mr_items = [] mr_items = []
for sales_order, item_code in so_item_details.items(): for sales_order in so_item_details:
item_dict = so_item_details[sales_order] item_dict = so_item_details[sales_order]
for details in item_dict.values(): for details in item_dict.values():
bin_dict = get_bin_details(details, doc.company, warehouse) bin_dict = get_bin_details(details, doc.company, warehouse)

View File

@@ -87,7 +87,7 @@ class ForecastingReport(ExponentialSmoothingForecast):
entry.get(self.based_on_field) entry.get(self.based_on_field)
) )
for key, value in self.period_wise_data.items(): for value in self.period_wise_data.values():
list_of_period_value = [value.get(p.key, 0) for p in self.period_list] list_of_period_value = [value.get(p.key, 0) for p in self.period_list]
if list_of_period_value: if list_of_period_value:

View File

@@ -8,13 +8,11 @@ def execute():
frappe.reload_doc("accounts", "doctype", frappe.scrub(doctype)) frappe.reload_doc("accounts", "doctype", frappe.scrub(doctype))
frappe.db.sql( frappe.db.sql(
""" UPDATE `tabGL Entry`, `tab{doctype}` f""" UPDATE `tabGL Entry`, `tab{doctype}`
SET SET
`tabGL Entry`.due_date = `tab{doctype}`.due_date `tabGL Entry`.due_date = `tab{doctype}`.due_date
WHERE WHERE
`tabGL Entry`.voucher_no = `tab{doctype}`.name and `tabGL Entry`.party is not null `tabGL Entry`.voucher_no = `tab{doctype}`.name and `tabGL Entry`.party is not null
and `tabGL Entry`.voucher_type in ('Sales Invoice', 'Purchase Invoice', 'Journal Entry') and `tabGL Entry`.voucher_type in ('Sales Invoice', 'Purchase Invoice', 'Journal Entry')
and `tabGL Entry`.account in (select name from `tabAccount` where account_type in ('Receivable', 'Payable'))""".format( # nosec and `tabGL Entry`.account in (select name from `tabAccount` where account_type in ('Receivable', 'Payable'))"""
doctype=doctype
)
) )

View File

@@ -100,7 +100,7 @@ def get_opp_by_lead_source(from_date, to_date, company):
pivot_table = [] pivot_table = []
for sales_stage in sales_stages: for sales_stage in sales_stages:
row = [] row = []
for source, sales_stage_values in summary.items(): for sales_stage_values in summary.values():
row.append(flt(sales_stage_values.get(sales_stage))) row.append(flt(sales_stage_values.get(sales_stage)))
pivot_table.append({"chartType": "bar", "name": sales_stage, "values": row}) pivot_table.append({"chartType": "bar", "name": sales_stage, "values": row})

View File

@@ -112,7 +112,13 @@ class TestHolidayList(unittest.TestCase):
frappe.local.lang = lang frappe.local.lang = lang
def make_holiday_list(name, from_date=getdate() - timedelta(days=10), to_date=getdate(), holiday_dates=None): def make_holiday_list(name, from_date=None, to_date=None, holiday_dates=None):
if from_date is None:
from_date = getdate() - timedelta(days=10)
if to_date is None:
to_date = getdate()
frappe.delete_doc_if_exists("Holiday List", name, force=1) frappe.delete_doc_if_exists("Holiday List", name, force=1)
doc = frappe.get_doc( doc = frappe.get_doc(
{ {

View File

@@ -486,12 +486,7 @@ def is_deletion_doc_running(company: str | None = None, err_msg: str | None = No
def check_for_running_deletion_job(doc, method=None): def check_for_running_deletion_job(doc, method=None):
# Check if DocType has 'company' field # Check if DocType has 'company' field
df = qb.DocType("DocField") df = qb.DocType("DocField")
if ( if qb.from_(df).select(df.parent).where((df.fieldname == "company") & (df.parent == doc.doctype)).run():
not_allowed := qb.from_(df)
.select(df.parent)
.where((df.fieldname == "company") & (df.parent == doc.doctype))
.run()
):
is_deletion_doc_running( is_deletion_doc_running(
doc.company, _("Cannot make any transactions until the deletion job is completed") doc.company, _("Cannot make any transactions until the deletion job is completed")
) )

View File

@@ -117,10 +117,10 @@ class TestBatch(FrappeTestCase):
self.assertTrue(receipt2.items[0].serial_and_batch_bundle) self.assertTrue(receipt2.items[0].serial_and_batch_bundle)
batchwise_qty = frappe._dict({}) batchwise_qty = frappe._dict({})
for receipt in [receipt, receipt2]: for r in [receipt, receipt2]:
batch_no = get_batch_from_bundle(receipt.items[0].serial_and_batch_bundle) batch_no = get_batch_from_bundle(r.items[0].serial_and_batch_bundle)
key = (batch_no, receipt.items[0].warehouse) key = (batch_no, r.items[0].warehouse)
batchwise_qty[key] = receipt.items[0].qty batchwise_qty[key] = r.items[0].qty
batches = get_batch_qty(batch_no) batches = get_batch_qty(batch_no)
for d in batches: for d in batches:

View File

@@ -1,6 +1,6 @@
# Copyright (c) 2021, Frappe Technologies Pvt. Ltd. and contributors # Copyright (c) 2021, Frappe Technologies Pvt. Ltd. and contributors
# For license information, please see license.txt # For license information, please see license.txt
import typing
import frappe import frappe
from frappe import _ from frappe import _
@@ -23,7 +23,7 @@ class ItemVariantSettings(Document):
fields: DF.Table[VariantField] fields: DF.Table[VariantField]
# end: auto-generated types # end: auto-generated types
invalid_fields_for_copy_fields_in_variants = ["barcodes"] invalid_fields_for_copy_fields_in_variants: typing.ClassVar[list] = ["barcodes"]
def set_default_fields(self): def set_default_fields(self):
self.fields = [] self.fields = []

View File

@@ -182,12 +182,12 @@ class TestPackedItem(FrappeTestCase):
def sort_function(p): def sort_function(p):
return p.parent_item, p.item_code, p.qty return p.parent_item, p.item_code, p.qty
for sent, returned in zip( for sent_item, returned_item in zip(
sorted(original, key=sort_function), sorted(returned, key=sort_function), strict=False sorted(original, key=sort_function), sorted(returned, key=sort_function), strict=False
): ):
self.assertEqual(sent.item_code, returned.item_code) self.assertEqual(sent_item.item_code, returned_item.item_code)
self.assertEqual(sent.parent_item, returned.parent_item) self.assertEqual(sent_item.parent_item, returned_item.parent_item)
self.assertEqual(sent.qty, -1 * returned.qty) self.assertEqual(sent_item.qty, -1 * returned_item.qty)
def test_returning_full_bundles(self): def test_returning_full_bundles(self):
from erpnext.stock.doctype.delivery_note.delivery_note import make_sales_return from erpnext.stock.doctype.delivery_note.delivery_note import make_sales_return

View File

@@ -4,7 +4,6 @@
import json import json
from collections import OrderedDict, defaultdict from collections import OrderedDict, defaultdict
from itertools import groupby from itertools import groupby
from typing import Dict, List
import frappe import frappe
from frappe import _ from frappe import _

View File

@@ -2,10 +2,9 @@
# License: GNU General Public License v3. See license.txt # License: GNU General Public License v3. See license.txt
import frappe
from frappe.permissions import add_user_permission, remove_user_permission from frappe.permissions import add_user_permission, remove_user_permission
from frappe.tests.utils import FrappeTestCase, change_settings from frappe.tests.utils import FrappeTestCase, change_settings
from frappe.utils import add_days, flt, nowdate, nowtime, today from frappe.utils import add_days, flt, nowtime, today
from erpnext.accounts.doctype.account.test_account import get_inventory_account from erpnext.accounts.doctype.account.test_account import get_inventory_account
from erpnext.stock.doctype.item.test_item import ( from erpnext.stock.doctype.item.test_item import (
@@ -530,10 +529,10 @@ class TestStockEntry(FrappeTestCase):
self.assertTrue(sle) self.assertTrue(sle)
sle.sort(key=lambda x: x[1]) sle.sort(key=lambda x: x[1])
for i, sle in enumerate(sle): for i, sle_value in enumerate(sle):
self.assertEqual(expected_sle[i][0], sle[0]) self.assertEqual(expected_sle[i][0], sle_value[0])
self.assertEqual(expected_sle[i][1], sle[1]) self.assertEqual(expected_sle[i][1], sle_value[1])
self.assertEqual(expected_sle[i][2], sle[2]) self.assertEqual(expected_sle[i][2], sle_value[2])
def check_gl_entries(self, voucher_type, voucher_no, expected_gl_entries): def check_gl_entries(self, voucher_type, voucher_no, expected_gl_entries):
expected_gl_entries.sort(key=lambda x: x[0]) expected_gl_entries.sort(key=lambda x: x[0])

View File

@@ -915,14 +915,14 @@ class TestStockLedgerEntry(FrappeTestCase, StockTestMixin):
receipt.submit() receipt.submit()
expected_queues = [] expected_queues = []
for idx, rate in enumerate(rates, start=1): for idx in range(1, len(rates) + 1):
expected_queues.append({"stock_queue": [[10, 10 * i] for i in range(1, idx + 1)]}) expected_queues.append({"stock_queue": [[10, 10 * i] for i in range(1, idx + 1)]})
self.assertSLEs(receipt, expected_queues) self.assertSLEs(receipt, expected_queues)
transfer = make_stock_entry( transfer = make_stock_entry(
item_code=item.name, source=source, target=target, qty=10, do_not_save=True, rate=10 item_code=item.name, source=source, target=target, qty=10, do_not_save=True, rate=10
) )
for rate in rates[1:]: for _ in rates[1:]:
row = frappe.copy_doc(transfer.items[0], ignore_no_copy=False) row = frappe.copy_doc(transfer.items[0], ignore_no_copy=False)
transfer.append("items", row) transfer.append("items", row)
@@ -951,7 +951,7 @@ class TestStockLedgerEntry(FrappeTestCase, StockTestMixin):
repack = make_stock_entry( repack = make_stock_entry(
item_code=rm.name, source=warehouse, qty=10, do_not_save=True, rate=10, purpose="Repack" item_code=rm.name, source=warehouse, qty=10, do_not_save=True, rate=10, purpose="Repack"
) )
for rate in rates[1:]: for _ in rates[1:]:
row = frappe.copy_doc(repack.items[0], ignore_no_copy=False) row = frappe.copy_doc(repack.items[0], ignore_no_copy=False)
repack.append("items", row) repack.append("items", row)

View File

@@ -743,9 +743,7 @@ class StockReconciliation(StockController):
data.incoming_rate = (data.total_amount) / data.actual_qty data.incoming_rate = (data.total_amount) / data.actual_qty
for key, value in merge_similar_entries.items(): new_sl_entries.extend(merge_similar_entries.values())
new_sl_entries.append(value)
return new_sl_entries return new_sl_entries
def get_gl_entries(self, warehouse_account=None): def get_gl_entries(self, warehouse_account=None):

View File

@@ -217,7 +217,7 @@ def get_child_warehouses(warehouse):
from frappe.utils.nestedset import get_descendants_of from frappe.utils.nestedset import get_descendants_of
children = get_descendants_of("Warehouse", warehouse, ignore_permissions=True, order_by="lft") children = get_descendants_of("Warehouse", warehouse, ignore_permissions=True, order_by="lft")
return children + [warehouse] # append self for backward compatibility return [*children, warehouse] # append self for backward compatibility
def get_warehouses_based_on_account(account, company=None): def get_warehouses_based_on_account(account, company=None):

View File

@@ -3,7 +3,6 @@
import datetime import datetime
from collections import OrderedDict from collections import OrderedDict
from typing import Union
import frappe import frappe
from frappe import _ from frappe import _
@@ -15,7 +14,7 @@ Filters = frappe._dict
Row = frappe._dict Row = frappe._dict
Data = list[Row] Data = list[Row]
Columns = list[dict[str, str]] Columns = list[dict[str, str]]
DateTime = Union[datetime.date, datetime.datetime] DateTime = datetime.date | datetime.datetime
FilteredEntries = list[dict[str, str | float | DateTime | None]] FilteredEntries = list[dict[str, str | float | DateTime | None]]
ItemGroupsDict = dict[tuple[int, int], dict[str, str | int]] ItemGroupsDict = dict[tuple[int, int], dict[str, str | int]]
SVDList = list[frappe._dict] SVDList = list[frappe._dict]