Inventory management module
Herry N. Atwar
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
Stock_entry.py
 Class StockEntry(StockController) :
 Def get_feed
 Def onload
 Def before_validate
 Def validate
 Def on_submit
 Def on_cancel
 Def set_job_card_data
 Def validate_work_order_status
 Def validate_purpose
 Def delete_linked_stock_entry
 Def set_transfer_qty
 Def update_cost_in_project
Stock_entry.py
 Class StockEntry(StockController) :
 Def validate_item
 Def validate_qty
 Def validate_fg_completed_qty
 Def validate_difference_account
 Def validate_warehouse
 Def validate_work_order
 Def check_if_operations_completed
 Def check_duplicate_entry_for_work_order
 Def set_actual_qty
 Def get_stock_and_rate
 Def calculate_rate_and_amount
 Def set_basic_rate
Stock_entry.py
 Class StockEntry(StockController) :
 Def set_rate_for_outgoing_items
 Def get_args_for_incoming_rate
 Def get_basic_rate_for_repacked_items
 Def get_basic_rate_for_manufactured_item
 Def distribute_additional_costs
 Def update_valuation_rate
 Def set_total_incoming_outgoing_value
 Def set_total_amount
 Def set_stock_entry_type
 Def set_purpose_for_stock_entry
 Def validate_duplicate_serial_no
 Def validate_bom
 Def mark_finished_and_scrap_items
Stock_entry.py
 Class StockEntry(StockController) :
 Def get_finished_item
 Def validate_finished_goods
 Def update_stock_ledger
 Def get_finished_item_row
 Def get_sle_for_source_warehouse
 Def get_sle_for_target_warehouse
 Def get_gl_entries
 Def update_work_order
 Def get_item_details
 Def set_items_for_stock_in
 Def get_items
Stock_entry.py
 Class StockEntry(StockController) :
 Def get_finished_item
 Def validate_finished_goods
 Def update_stock_ledger
 Def get_finished_item_row
 Def get_sle_for_source_warehouse
 Def get_sle_for_target_warehouse
 Def get_gl_entries
 Def update_work_order
 Def get_item_details
 Def set_items_for_stock_in
 Def get_items
Stock_entry.py
 Class StockEntry(StockController) :
 Def set_scrap_items
 Def set_work_order_details
 Def load_items_from_bom
 Def set_batchwise_finished_goods
 Def add_batchwise_finished_good
 Def add_finished_goods
 Def get_bom_raw_materials
 Def get_bom_scrap_material
 Def get_scrap_items_from_job_card
 Def get_completed_job_card_qty
 Def get_used_scrap_items
 Def get_unconsumed_raw_materials
Stock_entry.py
 Class StockEntry(StockController) :
 Def get_transfered_raw_materials
 Def get_pending_raw_materials
 Def get_pro_order_required_items
 Def get_job_card_item_codes
 Def add_to_stock_entry_detail
 Def validate_with_material_request
 Def validate_batch
 Def update_puchase_order_supplied_items
 Def update_so_in_serial_number
 Def validate_reserved_serial_no_consumption
 Def update_transferred_qty
 Def update_quality_inspection
Stock_entry.py
 Class StockEntry(StockController) :
 Def set_material_request_transfer_status
 Def update_items_for_process_loss
 Def set_serial_no_batch_for_finished_good
 Def get_serial_nos_for_fg
 Def get_available_serial_nos
 Def set_missing_values
 Def move_sample_to_retention_warehouse
 Def make_stock_in_entry
 Def set_missing_values
 Def update_item
Stock_entry.py
 Class StockEntry(StockController) :
 Def get_work_order_details
 Def get_operating_cost_per_unit
 Def get_used_alternative_items
 Def get_valuation_rate_for_finished_good_entry
 Def get_uom_details
 Def get_expired_batch_items
 Def get_warehouse_details
 Def validate_sample_quantity
 Def get_supplied_items
Calculate_rate_and_amount
def calculate_rate_and_amount(self, reset_outgoing_rate=True,
raise_error_if_no_rate=True):
self.set_basic_rate(reset_outgoing_rate, raise_error_if_no_rate)
init_landed_taxes_and_totals(self)
self.distribute_additional_costs()
self.update_valuation_rate()
self.set_total_incoming_outgoing_value()
self.set_total_amount()
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)
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"))
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
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
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))
Set_total_incoming_outgoing_value
def set_total_incoming_outgoing_value(self):
self.total_incoming_value = self.total_outgoing_value = 0.0
for d in self.get("items"):
if d.t_warehouse:
self.total_incoming_value += flt(d.amount)
if d.s_warehouse:
self.total_outgoing_value += flt(d.amount)
self.value_difference = self.total_incoming_value
- self.total_outgoing_value
Set_total_amount
def set_total_amount(self):
self.total_amount = None
if self.purpose not in ["Manufacture", "Repack"]:
self.total_amount = sum([flt(item.amount) for item in
self.get("items")])

ERPNext_Inventory.pptx

  • 1.
  • 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
  • 3.
    Stock_entry.py  Class StockEntry(StockController):  Def get_feed  Def onload  Def before_validate  Def validate  Def on_submit  Def on_cancel  Def set_job_card_data  Def validate_work_order_status  Def validate_purpose  Def delete_linked_stock_entry  Def set_transfer_qty  Def update_cost_in_project
  • 4.
    Stock_entry.py  Class StockEntry(StockController):  Def validate_item  Def validate_qty  Def validate_fg_completed_qty  Def validate_difference_account  Def validate_warehouse  Def validate_work_order  Def check_if_operations_completed  Def check_duplicate_entry_for_work_order  Def set_actual_qty  Def get_stock_and_rate  Def calculate_rate_and_amount  Def set_basic_rate
  • 5.
    Stock_entry.py  Class StockEntry(StockController):  Def set_rate_for_outgoing_items  Def get_args_for_incoming_rate  Def get_basic_rate_for_repacked_items  Def get_basic_rate_for_manufactured_item  Def distribute_additional_costs  Def update_valuation_rate  Def set_total_incoming_outgoing_value  Def set_total_amount  Def set_stock_entry_type  Def set_purpose_for_stock_entry  Def validate_duplicate_serial_no  Def validate_bom  Def mark_finished_and_scrap_items
  • 6.
    Stock_entry.py  Class StockEntry(StockController):  Def get_finished_item  Def validate_finished_goods  Def update_stock_ledger  Def get_finished_item_row  Def get_sle_for_source_warehouse  Def get_sle_for_target_warehouse  Def get_gl_entries  Def update_work_order  Def get_item_details  Def set_items_for_stock_in  Def get_items
  • 7.
    Stock_entry.py  Class StockEntry(StockController):  Def get_finished_item  Def validate_finished_goods  Def update_stock_ledger  Def get_finished_item_row  Def get_sle_for_source_warehouse  Def get_sle_for_target_warehouse  Def get_gl_entries  Def update_work_order  Def get_item_details  Def set_items_for_stock_in  Def get_items
  • 8.
    Stock_entry.py  Class StockEntry(StockController):  Def set_scrap_items  Def set_work_order_details  Def load_items_from_bom  Def set_batchwise_finished_goods  Def add_batchwise_finished_good  Def add_finished_goods  Def get_bom_raw_materials  Def get_bom_scrap_material  Def get_scrap_items_from_job_card  Def get_completed_job_card_qty  Def get_used_scrap_items  Def get_unconsumed_raw_materials
  • 9.
    Stock_entry.py  Class StockEntry(StockController):  Def get_transfered_raw_materials  Def get_pending_raw_materials  Def get_pro_order_required_items  Def get_job_card_item_codes  Def add_to_stock_entry_detail  Def validate_with_material_request  Def validate_batch  Def update_puchase_order_supplied_items  Def update_so_in_serial_number  Def validate_reserved_serial_no_consumption  Def update_transferred_qty  Def update_quality_inspection
  • 10.
    Stock_entry.py  Class StockEntry(StockController):  Def set_material_request_transfer_status  Def update_items_for_process_loss  Def set_serial_no_batch_for_finished_good  Def get_serial_nos_for_fg  Def get_available_serial_nos  Def set_missing_values  Def move_sample_to_retention_warehouse  Def make_stock_in_entry  Def set_missing_values  Def update_item
  • 11.
    Stock_entry.py  Class StockEntry(StockController):  Def get_work_order_details  Def get_operating_cost_per_unit  Def get_used_alternative_items  Def get_valuation_rate_for_finished_good_entry  Def get_uom_details  Def get_expired_batch_items  Def get_warehouse_details  Def validate_sample_quantity  Def get_supplied_items
  • 12.
    Calculate_rate_and_amount def calculate_rate_and_amount(self, reset_outgoing_rate=True, raise_error_if_no_rate=True): self.set_basic_rate(reset_outgoing_rate,raise_error_if_no_rate) init_landed_taxes_and_totals(self) self.distribute_additional_costs() self.update_valuation_rate() self.set_total_incoming_outgoing_value() self.set_total_amount()
  • 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_rateand 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): # Ifno 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 inself.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 din 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))
  • 18.
    Set_total_incoming_outgoing_value def set_total_incoming_outgoing_value(self): self.total_incoming_value =self.total_outgoing_value = 0.0 for d in self.get("items"): if d.t_warehouse: self.total_incoming_value += flt(d.amount) if d.s_warehouse: self.total_outgoing_value += flt(d.amount) self.value_difference = self.total_incoming_value - self.total_outgoing_value
  • 19.
    Set_total_amount def set_total_amount(self): self.total_amount =None if self.purpose not in ["Manufacture", "Repack"]: self.total_amount = sum([flt(item.amount) for item in self.get("items")])