refactor(treewide): formatting and ruff fixes, + manually enabled F401

Signed-off-by: Akhil Narang <me@akhilnarang.dev>
diff --git a/erpnext/stock/valuation.py b/erpnext/stock/valuation.py
index 35f4f12..b1df982 100644
--- a/erpnext/stock/valuation.py
+++ b/erpnext/stock/valuation.py
@@ -1,9 +1,10 @@
 from abc import ABC, abstractmethod, abstractproperty
-from typing import Callable, List, NewType, Optional, Tuple
+from collections.abc import Callable
+from typing import NewType
 
 from frappe.utils import flt
 
-StockBin = NewType("StockBin", List[float])  # [[qty, rate], ...]
+StockBin = NewType("StockBin", list[float])  # [[qty, rate], ...]
 
 # Indexes of values inside FIFO bin 2-tuple
 QTY = 0
@@ -17,15 +18,15 @@
 
 	@abstractmethod
 	def remove_stock(
-		self, qty: float, outgoing_rate: float = 0.0, rate_generator: Callable[[], float] = None
-	) -> List[StockBin]:
+		self, qty: float, outgoing_rate: float = 0.0, rate_generator: Callable[[], float] | None = None
+	) -> list[StockBin]:
 		pass
 
 	@abstractproperty
-	def state(self) -> List[StockBin]:
+	def state(self) -> list[StockBin]:
 		pass
 
-	def get_total_stock_and_value(self) -> Tuple[float, float]:
+	def get_total_stock_and_value(self) -> tuple[float, float]:
 		total_qty = 0.0
 		total_value = 0.0
 
@@ -62,11 +63,11 @@
 	# ref: https://docs.python.org/3/reference/datamodel.html#slots
 	__slots__ = ["queue"]
 
-	def __init__(self, state: Optional[List[StockBin]]):
-		self.queue: List[StockBin] = state if state is not None else []
+	def __init__(self, state: list[StockBin] | None):
+		self.queue: list[StockBin] = state if state is not None else []
 
 	@property
-	def state(self) -> List[StockBin]:
+	def state(self) -> list[StockBin]:
 		"""Get current state of queue."""
 		return self.queue
 
@@ -95,8 +96,8 @@
 					self.queue[-1][QTY] = qty
 
 	def remove_stock(
-		self, qty: float, outgoing_rate: float = 0.0, rate_generator: Callable[[], float] = None
-	) -> List[StockBin]:
+		self, qty: float, outgoing_rate: float = 0.0, rate_generator: Callable[[], float] | None = None
+	) -> list[StockBin]:
 		"""Remove stock from the queue and return popped bins.
 
 		args:
@@ -166,11 +167,11 @@
 	# ref: https://docs.python.org/3/reference/datamodel.html#slots
 	__slots__ = ["stack"]
 
-	def __init__(self, state: Optional[List[StockBin]]):
-		self.stack: List[StockBin] = state if state is not None else []
+	def __init__(self, state: list[StockBin] | None):
+		self.stack: list[StockBin] = state if state is not None else []
 
 	@property
-	def state(self) -> List[StockBin]:
+	def state(self) -> list[StockBin]:
 		"""Get current state of stack."""
 		return self.stack
 
@@ -201,8 +202,8 @@
 					self.stack[-1][QTY] = qty
 
 	def remove_stock(
-		self, qty: float, outgoing_rate: float = 0.0, rate_generator: Callable[[], float] = None
-	) -> List[StockBin]:
+		self, qty: float, outgoing_rate: float = 0.0, rate_generator: Callable[[], float] | None = None
+	) -> list[StockBin]:
 		"""Remove stock from the stack and return popped bins.
 
 		args: