2. Directory
Frappe-bench
Apps
Erpnext
Erpnext
Stock
Doctype
Stock_entry
Stock movement from one warehouse to another (or from, or to a
warehouse).
• Stock_entry.js
• Stock_entry.json
• Stock_entry.py
• Stock_entry_list.js
• Stock_entry_utils.py
13. Set_basic_rate
def set_basic_rate(self, reset_outgoing_rate=True, raise_error_if_no_rate=True):
"""
Set rate for outgoing, scrapped and finished items
"""
# Set rate for outgoing items
outgoing_items_cost = self.set_rate_for_outgoing_items(reset_outgoing_rate, raise_error_if_no_rate)
finished_item_qty = sum(d.transfer_qty for d in self.items if d.is_finished_item or d.is_process_loss)
# Set basic rate for incoming items
for d in self.get("items"):
if d.s_warehouse or d.set_basic_rate_manually:
continue
if d.allow_zero_valuation_rate:
d.basic_rate = 0.0
elif d.is_finished_item:
if self.purpose == "Manufacture":
d.basic_rate = self.get_basic_rate_for_manufactured_item(
finished_item_qty, outgoing_items_cost)
elif self.purpose == "Repack":
d.basic_rate = self.get_basic_rate_for_repacked_items(d.transfer_qty,
outgoing_items_cost)
14. Set_basic_rate
if not d.basic_rate and not d.allow_zero_valuation_rate:
d.basic_rate = get_valuation_rate(
d.item_code,
d.t_warehouse,
self.doctype,
self.name,
d.allow_zero_valuation_rate,
currency=erpnext.get_company_currency(self.company),
company=self.company,
raise_error_if_no_rate=raise_error_if_no_rate,
)
# do not round off basic rate to avoid precision loss
d.basic_rate = flt(d.basic_rate)
if d.is_process_loss:
d.basic_rate = flt(0.0)
d.basic_amount = flt(flt(d.transfer_qty) * flt(d.basic_rate), d.precision("basic_amount"))
15. Distribute_additional_cost
def distribute_additional_costs(self):
# If no incoming items, set additional costs blank
if not any(d.item_code for d in self.items if d.t_warehouse):
self.additional_costs = []
self.total_additional_costs = sum(flt(t.base_amount) for t in
self.get("additional_costs"))
if self.purpose in ("Repack", "Manufacture"):
incoming_items_cost = sum(flt(t.basic_amount) for t in
self.get("items") if t.is_finished_item)
else:
incoming_items_cost = sum(flt(t.basic_amount) for t in
self.get("items") if t.t_warehouse)
if not incoming_items_cost:
return
16. Distribute_additional_cost
for d in self.get("items"):
if self.purpose in ("Repack", "Manufacture") and not
d.is_finished_item:
d.additional_cost = 0
continue
elif not d.t_warehouse:
d.additional_cost = 0
continue
d.additional_cost = (flt(d.basic_amount) / incoming_items_cost) *
self.total_additional_costs
17. Update_valuation_rate
def update_valuation_rate(self):
for d in self.get("items"):
if d.transfer_qty:
d.amount = flt(flt(d.basic_amount) +
flt(d.additional_cost),
d.precision("amount"))
# Do not round off valuation rate to avoid precision loss
d.valuation_rate = flt(d.basic_rate) +
(flt(d.additional_cost) / flt(d.transfer_qty))