mirror of
https://github.com/frappe/erpnext.git
synced 2026-03-20 23:42:13 +00:00
fix(treewide): manual ruff fixes
(cherry picked from commit f63396ef47)
Signed-off-by: Akhil Narang <me@akhilnarang.dev>
This commit is contained in:
@@ -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):
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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")
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 = (
|
||||||
|
|||||||
@@ -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
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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})
|
||||||
|
|
||||||
|
|||||||
@@ -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(
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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")
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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 = []
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 _
|
||||||
|
|||||||
@@ -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])
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
@@ -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]
|
||||||
|
|||||||
Reference in New Issue
Block a user