mirror of
https://github.com/frappe/erpnext.git
synced 2026-06-01 03:09:09 +00:00
refactor(treewide): formatting and ruff fixes, + manually enabled F401
Signed-off-by: Akhil Narang <me@akhilnarang.dev>
This commit is contained in:
@@ -169,7 +169,7 @@ class PurchaseOrder(BuyingController):
|
||||
# end: auto-generated types
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super(PurchaseOrder, self).__init__(*args, **kwargs)
|
||||
super().__init__(*args, **kwargs)
|
||||
self.status_updater = [
|
||||
{
|
||||
"source_dt": "Purchase Order Item",
|
||||
@@ -190,7 +190,7 @@ class PurchaseOrder(BuyingController):
|
||||
self.set_onload("can_update_items", self.can_update_items())
|
||||
|
||||
def validate(self):
|
||||
super(PurchaseOrder, self).validate()
|
||||
super().validate()
|
||||
|
||||
self.set_status()
|
||||
|
||||
@@ -226,7 +226,7 @@ class PurchaseOrder(BuyingController):
|
||||
if self.is_subcontracted:
|
||||
mri_compare_fields = [["project", "="]]
|
||||
|
||||
super(PurchaseOrder, self).validate_with_previous_doc(
|
||||
super().validate_with_previous_doc(
|
||||
{
|
||||
"Supplier Quotation": {
|
||||
"ref_dn_field": "supplier_quotation",
|
||||
@@ -321,9 +321,7 @@ class PurchaseOrder(BuyingController):
|
||||
itemwise_min_order_qty = frappe._dict(
|
||||
frappe.db.sql(
|
||||
"""select name, min_order_qty
|
||||
from tabItem where name in ({0})""".format(
|
||||
", ".join(["%s"] * len(items))
|
||||
),
|
||||
from tabItem where name in ({})""".format(", ".join(["%s"] * len(items))),
|
||||
items,
|
||||
)
|
||||
)
|
||||
@@ -369,7 +367,9 @@ class PurchaseOrder(BuyingController):
|
||||
)
|
||||
elif not frappe.get_value("Item", item.fg_item, "default_bom"):
|
||||
frappe.throw(
|
||||
_("Row #{0}: Default BOM not found for FG Item {1}").format(item.idx, item.fg_item)
|
||||
_("Row #{0}: Default BOM not found for FG Item {1}").format(
|
||||
item.idx, item.fg_item
|
||||
)
|
||||
)
|
||||
if not item.fg_item_qty:
|
||||
frappe.throw(_("Row #{0}: Finished Good Item Qty can not be zero").format(item.idx))
|
||||
@@ -403,8 +403,9 @@ class PurchaseOrder(BuyingController):
|
||||
d.rate = d.base_rate / conversion_rate
|
||||
d.last_purchase_rate = d.rate
|
||||
else:
|
||||
|
||||
item_last_purchase_rate = frappe.get_cached_value("Item", d.item_code, "last_purchase_rate")
|
||||
item_last_purchase_rate = frappe.get_cached_value(
|
||||
"Item", d.item_code, "last_purchase_rate"
|
||||
)
|
||||
if item_last_purchase_rate:
|
||||
d.base_price_list_rate = (
|
||||
d.base_rate
|
||||
@@ -439,7 +440,7 @@ class PurchaseOrder(BuyingController):
|
||||
|
||||
def check_modified_date(self):
|
||||
mod_db = frappe.db.sql("select modified from `tabPurchase Order` where name = %s", self.name)
|
||||
date_diff = frappe.db.sql("select '%s' - '%s' " % (mod_db[0][0], cstr(self.modified)))
|
||||
date_diff = frappe.db.sql(f"select '{mod_db[0][0]}' - '{cstr(self.modified)}' ")
|
||||
|
||||
if date_diff and date_diff[0][0]:
|
||||
msgprint(
|
||||
@@ -459,7 +460,7 @@ class PurchaseOrder(BuyingController):
|
||||
clear_doctype_notifications(self)
|
||||
|
||||
def on_submit(self):
|
||||
super(PurchaseOrder, self).on_submit()
|
||||
super().on_submit()
|
||||
|
||||
if self.is_against_so():
|
||||
self.update_status_updater()
|
||||
@@ -484,7 +485,7 @@ class PurchaseOrder(BuyingController):
|
||||
|
||||
def on_cancel(self):
|
||||
self.ignore_linked_doctypes = ("GL Entry", "Payment Ledger Entry")
|
||||
super(PurchaseOrder, self).on_cancel()
|
||||
super().on_cancel()
|
||||
|
||||
if self.is_against_so():
|
||||
self.update_status_updater()
|
||||
@@ -656,7 +657,9 @@ def close_or_unclose_purchase_orders(names, status):
|
||||
po = frappe.get_doc("Purchase Order", name)
|
||||
if po.docstatus == 1:
|
||||
if status == "Closed":
|
||||
if po.status not in ("Cancelled", "Closed") and (po.per_received < 100 or po.per_billed < 100):
|
||||
if po.status not in ("Cancelled", "Closed") and (
|
||||
po.per_received < 100 or po.per_billed < 100
|
||||
):
|
||||
po.update_status(status)
|
||||
else:
|
||||
if po.status == "Closed":
|
||||
@@ -827,9 +830,7 @@ def make_inter_company_sales_order(source_name, target_doc=None):
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def make_subcontracting_order(
|
||||
source_name, target_doc=None, save=False, submit=False, notify=False
|
||||
):
|
||||
def make_subcontracting_order(source_name, target_doc=None, save=False, submit=False, notify=False):
|
||||
target_doc = get_mapped_subcontracting_order(source_name, target_doc)
|
||||
|
||||
if (save or submit) and frappe.has_permission(target_doc.doctype, "create"):
|
||||
@@ -854,7 +855,6 @@ def make_subcontracting_order(
|
||||
|
||||
|
||||
def get_mapped_subcontracting_order(source_name, target_doc=None):
|
||||
|
||||
if target_doc and isinstance(target_doc, str):
|
||||
target_doc = json.loads(target_doc)
|
||||
for key in ["service_items", "items", "supplied_items"]:
|
||||
|
||||
@@ -11,11 +11,13 @@ from frappe.utils.data import today
|
||||
|
||||
from erpnext.accounts.doctype.payment_entry.payment_entry import get_payment_entry
|
||||
from erpnext.accounts.party import get_due_date_from_template
|
||||
from erpnext.buying.doctype.purchase_order.purchase_order import make_inter_company_sales_order
|
||||
from erpnext.buying.doctype.purchase_order.purchase_order import (
|
||||
make_inter_company_sales_order,
|
||||
make_purchase_receipt,
|
||||
)
|
||||
from erpnext.buying.doctype.purchase_order.purchase_order import (
|
||||
make_purchase_invoice as make_pi_from_po,
|
||||
)
|
||||
from erpnext.buying.doctype.purchase_order.purchase_order import make_purchase_receipt
|
||||
from erpnext.controllers.accounts_controller import InvalidQtyError, update_child_qty_rate
|
||||
from erpnext.manufacturing.doctype.blanket_order.test_blanket_order import make_blanket_order
|
||||
from erpnext.stock.doctype.item.test_item import make_item
|
||||
@@ -190,7 +192,7 @@ class TestPurchaseOrder(FrappeTestCase):
|
||||
po.items[0].qty = 4
|
||||
po.save()
|
||||
po.submit()
|
||||
pr = make_pr_against_po(po.name, 2)
|
||||
make_pr_against_po(po.name, 2)
|
||||
|
||||
po.load_from_db()
|
||||
existing_ordered_qty = get_ordered_qty()
|
||||
@@ -220,7 +222,7 @@ class TestPurchaseOrder(FrappeTestCase):
|
||||
po.items[0].qty = 4
|
||||
po.save()
|
||||
po.submit()
|
||||
pr = make_pr_against_po(po.name, 2)
|
||||
make_pr_against_po(po.name, 2)
|
||||
|
||||
po.reload()
|
||||
first_item_of_po = po.get("items")[0]
|
||||
@@ -461,9 +463,7 @@ class TestPurchaseOrder(FrappeTestCase):
|
||||
make_purchase_receipt as make_purchase_receipt_return,
|
||||
)
|
||||
|
||||
pr1 = make_purchase_receipt_return(
|
||||
is_return=1, return_against=pr.name, qty=-3, do_not_submit=True
|
||||
)
|
||||
pr1 = make_purchase_receipt_return(is_return=1, return_against=pr.name, qty=-3, do_not_submit=True)
|
||||
pr1.items[0].purchase_order = po.name
|
||||
pr1.items[0].purchase_order_item = po.items[0].name
|
||||
pr1.submit()
|
||||
@@ -544,9 +544,7 @@ class TestPurchaseOrder(FrappeTestCase):
|
||||
self.assertEqual(po.payment_schedule[0].payment_amount, 2500.0)
|
||||
self.assertEqual(getdate(po.payment_schedule[0].due_date), getdate(po.transaction_date))
|
||||
self.assertEqual(po.payment_schedule[1].payment_amount, 2500.0)
|
||||
self.assertEqual(
|
||||
getdate(po.payment_schedule[1].due_date), add_days(getdate(po.transaction_date), 30)
|
||||
)
|
||||
self.assertEqual(getdate(po.payment_schedule[1].due_date), add_days(getdate(po.transaction_date), 30))
|
||||
pi = make_pi_from_po(po.name)
|
||||
pi.save()
|
||||
|
||||
@@ -556,9 +554,7 @@ class TestPurchaseOrder(FrappeTestCase):
|
||||
self.assertEqual(pi.payment_schedule[0].payment_amount, 2500.0)
|
||||
self.assertEqual(getdate(pi.payment_schedule[0].due_date), getdate(po.transaction_date))
|
||||
self.assertEqual(pi.payment_schedule[1].payment_amount, 2500.0)
|
||||
self.assertEqual(
|
||||
getdate(pi.payment_schedule[1].due_date), add_days(getdate(po.transaction_date), 30)
|
||||
)
|
||||
self.assertEqual(getdate(pi.payment_schedule[1].due_date), add_days(getdate(po.transaction_date), 30))
|
||||
automatically_fetch_payment_terms(enable=0)
|
||||
|
||||
def test_warehouse_company_validation(self):
|
||||
@@ -702,9 +698,9 @@ class TestPurchaseOrder(FrappeTestCase):
|
||||
raise Exception
|
||||
|
||||
def test_default_payment_terms(self):
|
||||
due_date = get_due_date_from_template(
|
||||
"_Test Payment Term Template 1", "2023-02-03", None
|
||||
).strftime("%Y-%m-%d")
|
||||
due_date = get_due_date_from_template("_Test Payment Term Template 1", "2023-02-03", None).strftime(
|
||||
"%Y-%m-%d"
|
||||
)
|
||||
self.assertEqual(due_date, "2023-03-31")
|
||||
|
||||
def test_terms_are_not_copied_if_automatically_fetch_payment_terms_is_unchecked(self):
|
||||
@@ -755,9 +751,7 @@ class TestPurchaseOrder(FrappeTestCase):
|
||||
pe_doc.cancel()
|
||||
|
||||
def create_account(self, account_name, company, currency, parent):
|
||||
if not frappe.db.get_value(
|
||||
"Account", filters={"account_name": account_name, "company": company}
|
||||
):
|
||||
if not frappe.db.get_value("Account", filters={"account_name": account_name, "company": company}):
|
||||
account = frappe.get_doc(
|
||||
{
|
||||
"doctype": "Account",
|
||||
@@ -788,9 +782,7 @@ class TestPurchaseOrder(FrappeTestCase):
|
||||
company = "_Test Company"
|
||||
|
||||
# Setup default 'Advance Paid' account
|
||||
account = self.create_account(
|
||||
"Advance Paid", company, "INR", "Application of Funds (Assets) - _TC"
|
||||
)
|
||||
account = self.create_account("Advance Paid", company, "INR", "Application of Funds (Assets) - _TC")
|
||||
company_doc = frappe.get_doc("Company", company)
|
||||
company_doc.book_advance_payments_in_separate_party_account = True
|
||||
company_doc.default_advance_paid_account = account.name
|
||||
@@ -885,7 +877,7 @@ class TestPurchaseOrder(FrappeTestCase):
|
||||
Second Purchase Order should not add on to Blanket Orders Ordered Quantity.
|
||||
"""
|
||||
|
||||
bo = make_blanket_order(blanket_order_type="Purchasing", quantity=10, rate=10)
|
||||
make_blanket_order(blanket_order_type="Purchasing", quantity=10, rate=10)
|
||||
|
||||
po = create_purchase_order(item_code="_Test Item", qty=5, against_blanket_order=1)
|
||||
po_doc = frappe.get_doc("Purchase Order", po.get("name"))
|
||||
@@ -1281,15 +1273,11 @@ def create_pr_against_po(po, received_qty=4):
|
||||
|
||||
|
||||
def get_ordered_qty(item_code="_Test Item", warehouse="_Test Warehouse - _TC"):
|
||||
return flt(
|
||||
frappe.db.get_value("Bin", {"item_code": item_code, "warehouse": warehouse}, "ordered_qty")
|
||||
)
|
||||
return flt(frappe.db.get_value("Bin", {"item_code": item_code, "warehouse": warehouse}, "ordered_qty"))
|
||||
|
||||
|
||||
def get_requested_qty(item_code="_Test Item", warehouse="_Test Warehouse - _TC"):
|
||||
return flt(
|
||||
frappe.db.get_value("Bin", {"item_code": item_code, "warehouse": warehouse}, "indented_qty")
|
||||
)
|
||||
return flt(frappe.db.get_value("Bin", {"item_code": item_code, "warehouse": warehouse}, "indented_qty"))
|
||||
|
||||
|
||||
test_dependencies = ["BOM", "Item Price"]
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
|
||||
|
||||
import json
|
||||
from typing import Optional
|
||||
|
||||
import frappe
|
||||
from frappe import _
|
||||
@@ -66,7 +65,7 @@ class RequestforQuotation(BuyingController):
|
||||
self.validate_duplicate_supplier()
|
||||
self.validate_supplier_list()
|
||||
validate_for_items(self)
|
||||
super(RequestforQuotation, self).set_qty_as_per_stock_uom()
|
||||
super().set_qty_as_per_stock_uom()
|
||||
self.update_email_id()
|
||||
|
||||
if self.docstatus < 1:
|
||||
@@ -316,7 +315,7 @@ class RequestforQuotation(BuyingController):
|
||||
|
||||
def update_rfq_supplier_status(self, sup_name=None):
|
||||
for supplier in self.suppliers:
|
||||
if sup_name == None or supplier.supplier == sup_name:
|
||||
if sup_name is None or supplier.supplier == sup_name:
|
||||
quote_status = _("Received")
|
||||
for item in self.items:
|
||||
sqi_count = frappe.db.sql(
|
||||
@@ -347,9 +346,7 @@ def send_supplier_emails(rfq_name):
|
||||
|
||||
|
||||
def check_portal_enabled(reference_doctype):
|
||||
if not frappe.db.get_value(
|
||||
"Portal Menu Item", {"reference_doctype": reference_doctype}, "enabled"
|
||||
):
|
||||
if not frappe.db.get_value("Portal Menu Item", {"reference_doctype": reference_doctype}, "enabled"):
|
||||
frappe.throw(
|
||||
_(
|
||||
"The Access to Request for Quotation From Portal is Disabled. To Allow Access, Enable it in Portal Settings."
|
||||
@@ -478,9 +475,9 @@ def create_rfq_items(sq_doc, supplier, data):
|
||||
def get_pdf(
|
||||
name: str,
|
||||
supplier: str,
|
||||
print_format: Optional[str] = None,
|
||||
language: Optional[str] = None,
|
||||
letterhead: Optional[str] = None,
|
||||
print_format: str | None = None,
|
||||
language: str | None = None,
|
||||
letterhead: str | None = None,
|
||||
):
|
||||
doc = frappe.get_doc("Request for Quotation", name)
|
||||
if supplier:
|
||||
@@ -555,9 +552,7 @@ def get_item_from_material_requests_based_on_supplier(source_name, target_doc=No
|
||||
@frappe.whitelist()
|
||||
def get_supplier_tag():
|
||||
filters = {"document_type": "Supplier"}
|
||||
tags = list(
|
||||
set(tag.tag for tag in frappe.get_all("Tag Link", filters=filters, fields=["tag"]) if tag)
|
||||
)
|
||||
tags = list(set(tag.tag for tag in frappe.get_all("Tag Link", filters=filters, fields=["tag"]) if tag))
|
||||
|
||||
return tags
|
||||
|
||||
@@ -570,7 +565,7 @@ def get_rfq_containing_supplier(doctype, txt, searchfield, start, page_len, filt
|
||||
conditions += "and rfq.name like '%%" + txt + "%%' "
|
||||
|
||||
if filters.get("transaction_date"):
|
||||
conditions += "and rfq.transaction_date = '{0}'".format(filters.get("transaction_date"))
|
||||
conditions += "and rfq.transaction_date = '{}'".format(filters.get("transaction_date"))
|
||||
|
||||
rfq_data = frappe.db.sql(
|
||||
f"""
|
||||
|
||||
@@ -64,9 +64,7 @@ class TestRequestforQuotation(FrappeTestCase):
|
||||
|
||||
rfq = make_request_for_quotation(supplier_data=supplier_wt_appos)
|
||||
|
||||
sq = make_supplier_quotation_from_rfq(
|
||||
rfq.name, for_supplier=supplier_wt_appos[0].get("supplier")
|
||||
)
|
||||
sq = make_supplier_quotation_from_rfq(rfq.name, for_supplier=supplier_wt_appos[0].get("supplier"))
|
||||
sq.submit()
|
||||
|
||||
frappe.form_dict.name = rfq.name
|
||||
@@ -97,9 +95,7 @@ class TestRequestforQuotation(FrappeTestCase):
|
||||
row = item.append("uoms", {"uom": "Kg", "conversion_factor": 2})
|
||||
row.db_update()
|
||||
|
||||
rfq = make_request_for_quotation(
|
||||
item_code="_Test Multi UOM RFQ Item", uom="Kg", conversion_factor=2
|
||||
)
|
||||
rfq = make_request_for_quotation(item_code="_Test Multi UOM RFQ Item", uom="Kg", conversion_factor=2)
|
||||
rfq.get("items")[0].rate = 100
|
||||
rfq.supplier = rfq.suppliers[0].supplier
|
||||
|
||||
|
||||
@@ -11,9 +11,8 @@ from frappe.contacts.address_and_contact import (
|
||||
)
|
||||
from frappe.model.naming import set_name_by_naming_series, set_name_from_naming_options
|
||||
|
||||
from erpnext.accounts.party import ( # noqa
|
||||
from erpnext.accounts.party import (
|
||||
get_dashboard_info,
|
||||
get_timeline_data,
|
||||
validate_party_accounts,
|
||||
)
|
||||
from erpnext.controllers.website_list_for_contact import add_role_for_portal_user
|
||||
@@ -126,9 +125,7 @@ class Supplier(TransactionBase):
|
||||
return
|
||||
|
||||
user_doc.add_roles("Supplier")
|
||||
frappe.msgprint(
|
||||
_("Added Supplier Role to User {0}.").format(frappe.bold(user_doc.name)), alert=True
|
||||
)
|
||||
frappe.msgprint(_("Added Supplier Role to User {0}.").format(frappe.bold(user_doc.name)), alert=True)
|
||||
|
||||
def validate(self):
|
||||
self.flags.is_new_doc = self.is_new()
|
||||
@@ -230,6 +227,6 @@ def get_supplier_primary_contact(doctype, txt, searchfield, start, page_len, fil
|
||||
.where(
|
||||
(dynamic_link.link_name == supplier)
|
||||
& (dynamic_link.link_doctype == "Supplier")
|
||||
& (contact.name.like("%{0}%".format(txt)))
|
||||
& (contact.name.like(f"%{txt}%"))
|
||||
)
|
||||
).run(as_dict=False)
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
|
||||
|
||||
import frappe
|
||||
from frappe.custom.doctype.property_setter.property_setter import make_property_setter
|
||||
from frappe.test_runner import make_test_records
|
||||
|
||||
from erpnext.accounts.party import get_due_date
|
||||
@@ -183,7 +182,6 @@ def create_supplier(**args):
|
||||
|
||||
class TestSupplierPortal(FrappeTestCase):
|
||||
def test_portal_user_can_access_supplier_data(self):
|
||||
|
||||
supplier = create_supplier()
|
||||
|
||||
user = frappe.generate_hash() + "@example.com"
|
||||
|
||||
@@ -104,7 +104,7 @@ class SupplierQuotation(BuyingController):
|
||||
# end: auto-generated types
|
||||
|
||||
def validate(self):
|
||||
super(SupplierQuotation, self).validate()
|
||||
super().validate()
|
||||
|
||||
if not self.status:
|
||||
self.status = "Draft"
|
||||
@@ -130,7 +130,7 @@ class SupplierQuotation(BuyingController):
|
||||
pass
|
||||
|
||||
def validate_with_previous_doc(self):
|
||||
super(SupplierQuotation, self).validate_with_previous_doc(
|
||||
super().validate_with_previous_doc(
|
||||
{
|
||||
"Material Request": {
|
||||
"ref_dn_field": "prevdoc_docname",
|
||||
|
||||
@@ -66,7 +66,11 @@ class SupplierScorecard(Document):
|
||||
for c2 in self.standings:
|
||||
if c1 != c2:
|
||||
if c1.max_grade > c2.min_grade and c1.min_grade < c2.max_grade:
|
||||
throw(_("Overlap in scoring between {0} and {1}").format(c1.standing_name, c2.standing_name))
|
||||
throw(
|
||||
_("Overlap in scoring between {0} and {1}").format(
|
||||
c1.standing_name, c2.standing_name
|
||||
)
|
||||
)
|
||||
if c2.min_grade == score:
|
||||
score = c2.max_grade
|
||||
if score < 100:
|
||||
@@ -77,7 +81,6 @@ class SupplierScorecard(Document):
|
||||
)
|
||||
|
||||
def validate_criteria_weights(self):
|
||||
|
||||
weight = 0
|
||||
for c in self.criteria:
|
||||
weight += c.weight
|
||||
@@ -196,7 +199,6 @@ def refresh_scorecards():
|
||||
|
||||
@frappe.whitelist()
|
||||
def make_all_scorecards(docname):
|
||||
|
||||
sc = frappe.get_doc("Supplier Scorecard", docname)
|
||||
supplier = frappe.get_doc("Supplier", sc.supplier)
|
||||
|
||||
|
||||
@@ -43,8 +43,8 @@ class SupplierScorecardCriteria(Document):
|
||||
regex = r"\{(.*?)\}"
|
||||
|
||||
mylist = re.finditer(regex, test_formula, re.MULTILINE | re.DOTALL)
|
||||
for dummy1, match in enumerate(mylist):
|
||||
for dummy2 in range(0, len(match.groups())):
|
||||
for _dummy1, match in enumerate(mylist):
|
||||
for _dummy2 in range(0, len(match.groups())):
|
||||
test_formula = test_formula.replace("{" + match.group(1) + "}", "0")
|
||||
|
||||
try:
|
||||
@@ -78,8 +78,8 @@ def _get_variables(criteria):
|
||||
regex = r"\{(.*?)\}"
|
||||
|
||||
mylist = re.finditer(regex, criteria.formula, re.MULTILINE | re.DOTALL)
|
||||
for dummy1, match in enumerate(mylist):
|
||||
for dummy2 in range(0, len(match.groups())):
|
||||
for _dummy1, match in enumerate(mylist):
|
||||
for _dummy2 in range(0, len(match.groups())):
|
||||
try:
|
||||
var = frappe.db.sql(
|
||||
"""
|
||||
@@ -94,6 +94,8 @@ def _get_variables(criteria):
|
||||
)[0]
|
||||
my_variables.append(var)
|
||||
except Exception:
|
||||
frappe.throw(_("Unable to find variable:") + " " + str(match.group(1)), InvalidFormulaVariable)
|
||||
frappe.throw(
|
||||
_("Unable to find variable:") + " " + str(match.group(1)), InvalidFormulaVariable
|
||||
)
|
||||
|
||||
return my_variables
|
||||
|
||||
@@ -47,7 +47,6 @@ class SupplierScorecardPeriod(Document):
|
||||
self.calculate_score()
|
||||
|
||||
def validate_criteria_weights(self):
|
||||
|
||||
weight = 0
|
||||
for c in self.criteria:
|
||||
weight += c.weight
|
||||
@@ -70,14 +69,17 @@ class SupplierScorecardPeriod(Document):
|
||||
crit.score = min(
|
||||
crit.max_score,
|
||||
max(
|
||||
0, frappe.safe_eval(self.get_eval_statement(crit.formula), None, {"max": max, "min": min})
|
||||
0,
|
||||
frappe.safe_eval(
|
||||
self.get_eval_statement(crit.formula), None, {"max": max, "min": min}
|
||||
),
|
||||
),
|
||||
)
|
||||
except Exception:
|
||||
frappe.throw(
|
||||
_("Could not solve criteria score function for {0}. Make sure the formula is valid.").format(
|
||||
crit.criteria_name
|
||||
),
|
||||
_(
|
||||
"Could not solve criteria score function for {0}. Make sure the formula is valid."
|
||||
).format(crit.criteria_name),
|
||||
frappe.ValidationError,
|
||||
)
|
||||
crit.score = 0
|
||||
@@ -108,7 +110,7 @@ class SupplierScorecardPeriod(Document):
|
||||
if var.value:
|
||||
if var.param_name in my_eval_statement:
|
||||
my_eval_statement = my_eval_statement.replace(
|
||||
"{" + var.param_name + "}", "{:.2f}".format(var.value)
|
||||
"{" + var.param_name + "}", f"{var.value:.2f}"
|
||||
)
|
||||
else:
|
||||
if var.param_name in my_eval_statement:
|
||||
|
||||
@@ -2,17 +2,8 @@
|
||||
# For license information, please see license.txt
|
||||
|
||||
|
||||
from datetime import datetime
|
||||
|
||||
import frappe
|
||||
from frappe.tests.utils import FrappeTestCase
|
||||
|
||||
from erpnext.buying.doctype.purchase_order.purchase_order import make_purchase_receipt
|
||||
from erpnext.buying.report.procurement_tracker.procurement_tracker import execute
|
||||
from erpnext.stock.doctype.material_request.material_request import make_purchase_order
|
||||
from erpnext.stock.doctype.material_request.test_material_request import make_material_request
|
||||
from erpnext.stock.doctype.warehouse.test_warehouse import create_warehouse
|
||||
|
||||
|
||||
class TestProcurementTracker(FrappeTestCase):
|
||||
pass
|
||||
|
||||
@@ -68,9 +68,7 @@ def get_data(filters):
|
||||
po.company,
|
||||
po_item.name,
|
||||
)
|
||||
.where(
|
||||
(po_item.parent == po.name) & (po.status.notin(("Stopped", "Closed"))) & (po.docstatus == 1)
|
||||
)
|
||||
.where((po_item.parent == po.name) & (po.status.notin(("Stopped", "Closed"))) & (po.docstatus == 1))
|
||||
.groupby(po_item.name)
|
||||
.orderby(po.transaction_date)
|
||||
)
|
||||
@@ -80,9 +78,7 @@ def get_data(filters):
|
||||
query = query.where(po[field] == filters.get(field))
|
||||
|
||||
if filters.get("from_date") and filters.get("to_date"):
|
||||
query = query.where(
|
||||
po.transaction_date.between(filters.get("from_date"), filters.get("to_date"))
|
||||
)
|
||||
query = query.where(po.transaction_date.between(filters.get("from_date"), filters.get("to_date")))
|
||||
|
||||
if filters.get("status"):
|
||||
query = query.where(po.status.isin(filters.get("status")))
|
||||
@@ -114,7 +110,7 @@ def prepare_data(data, filters):
|
||||
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
|
||||
|
||||
@@ -57,9 +57,7 @@ def get_data(filters):
|
||||
"qty_to_receive"
|
||||
),
|
||||
Sum(Coalesce(mr_item.received_qty, 0)).as_("received_qty"),
|
||||
(Sum(Coalesce(mr_item.stock_qty, 0)) - Sum(Coalesce(mr_item.ordered_qty, 0))).as_(
|
||||
"qty_to_order"
|
||||
),
|
||||
(Sum(Coalesce(mr_item.stock_qty, 0)) - Sum(Coalesce(mr_item.ordered_qty, 0))).as_("qty_to_order"),
|
||||
mr_item.item_name,
|
||||
mr_item.description,
|
||||
mr.company,
|
||||
@@ -110,7 +108,7 @@ def prepare_data(data, filters):
|
||||
|
||||
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 +125,7 @@ def prepare_data(data, filters):
|
||||
|
||||
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
|
||||
|
||||
@@ -112,7 +112,7 @@ def prepare_subcontracted_data(orders, supplied_items):
|
||||
|
||||
|
||||
def get_subcontracted_data(order_details, data):
|
||||
for key, details in order_details.items():
|
||||
for _key, details in order_details.items():
|
||||
res = details.order_item
|
||||
for index, row in enumerate(details.supplied_items):
|
||||
if index != 0:
|
||||
|
||||
@@ -62,7 +62,9 @@ class TestSubcontractedItemToBeReceived(FrappeTestCase):
|
||||
"from_date": frappe.utils.get_datetime(
|
||||
frappe.utils.add_to_date(sco.transaction_date, days=-10)
|
||||
),
|
||||
"to_date": frappe.utils.get_datetime(frappe.utils.add_to_date(sco.transaction_date, days=10)),
|
||||
"to_date": frappe.utils.get_datetime(
|
||||
frappe.utils.add_to_date(sco.transaction_date, days=10)
|
||||
),
|
||||
}
|
||||
)
|
||||
)
|
||||
|
||||
@@ -48,7 +48,9 @@ class TestSubcontractedItemToBeTransferred(FrappeTestCase):
|
||||
"from_date": frappe.utils.get_datetime(
|
||||
frappe.utils.add_to_date(sco.transaction_date, days=-10)
|
||||
),
|
||||
"to_date": frappe.utils.get_datetime(frappe.utils.add_to_date(sco.transaction_date, days=10)),
|
||||
"to_date": frappe.utils.get_datetime(
|
||||
frappe.utils.add_to_date(sco.transaction_date, days=10)
|
||||
),
|
||||
}
|
||||
)
|
||||
)
|
||||
|
||||
@@ -82,18 +82,14 @@ def prepare_data(supplier_quotation_data, filters):
|
||||
group_wise_map = defaultdict(list)
|
||||
supplier_qty_price_map = {}
|
||||
|
||||
group_by_field = (
|
||||
"supplier_name" if filters.get("group_by") == "Group by Supplier" else "item_code"
|
||||
)
|
||||
group_by_field = "supplier_name" if filters.get("group_by") == "Group by Supplier" else "item_code"
|
||||
company_currency = frappe.db.get_default("currency")
|
||||
float_precision = cint(frappe.db.get_default("float_precision")) or 2
|
||||
|
||||
for data in supplier_quotation_data:
|
||||
group = data.get(group_by_field) # get item or supplier value for this row
|
||||
|
||||
supplier_currency = frappe.db.get_value(
|
||||
"Supplier", data.get("supplier_name"), "default_currency"
|
||||
)
|
||||
supplier_currency = frappe.db.get_value("Supplier", data.get("supplier_name"), "default_currency")
|
||||
|
||||
if supplier_currency:
|
||||
exchange_rate = get_exchange_rate(supplier_currency, company_currency)
|
||||
@@ -126,7 +122,7 @@ def prepare_data(supplier_quotation_data, filters):
|
||||
# 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 +165,7 @@ def prepare_chart_data(suppliers, qty_list, supplier_qty_price_map):
|
||||
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])
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
|
||||
|
||||
import json
|
||||
from typing import Dict
|
||||
|
||||
import frappe
|
||||
from frappe import _
|
||||
@@ -87,7 +86,7 @@ def set_stock_levels(row) -> None:
|
||||
row.set(field, qty_data[field])
|
||||
|
||||
|
||||
def validate_item_and_get_basic_data(row) -> Dict:
|
||||
def validate_item_and_get_basic_data(row) -> dict:
|
||||
item = frappe.db.get_values(
|
||||
"Item",
|
||||
filters={"name": row.item_code},
|
||||
@@ -101,12 +100,7 @@ def validate_item_and_get_basic_data(row) -> Dict:
|
||||
|
||||
|
||||
def validate_stock_item_warehouse(row, item) -> None:
|
||||
if (
|
||||
item.is_stock_item == 1
|
||||
and row.qty
|
||||
and not row.warehouse
|
||||
and not row.get("delivered_by_supplier")
|
||||
):
|
||||
if item.is_stock_item == 1 and row.qty and not row.warehouse and not row.get("delivered_by_supplier"):
|
||||
frappe.throw(
|
||||
_("Row #{1}: Warehouse is mandatory for stock Item {0}").format(
|
||||
frappe.bold(row.item_code), row.idx
|
||||
@@ -118,9 +112,7 @@ def check_on_hold_or_closed_status(doctype, docname) -> None:
|
||||
status = frappe.db.get_value(doctype, docname, "status")
|
||||
|
||||
if status in ("Closed", "On Hold"):
|
||||
frappe.throw(
|
||||
_("{0} {1} status is {2}").format(doctype, docname, status), frappe.InvalidStatusError
|
||||
)
|
||||
frappe.throw(_("{0} {1} status is {2}").format(doctype, docname, status), frappe.InvalidStatusError)
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
|
||||
Reference in New Issue
Block a user