refactor: moved files from stock_entry_handler to services

This commit is contained in:
Rohit Waghchaure
2026-06-11 16:28:23 +05:30
parent 2652082475
commit 6d9beea56b
12 changed files with 47 additions and 27 deletions

View File

@@ -1653,7 +1653,7 @@ class JobCard(Document):
)
def populate_manufacture_stock_entry(self, ste):
from erpnext.stock.doctype.stock_entry.stock_entry_handler.manufacturing import ManufactureStockEntry
from erpnext.stock.doctype.stock_entry.services.manufacturing import ManufactureStockEntry
ste.make_stock_entry()
ste.stock_entry.flags.ignore_mandatory = True

View File

@@ -518,7 +518,7 @@ def _set_pick_list_item_qty(source, target, source_parent, for_qty, max_finished
@frappe.whitelist()
def make_stock_return_entry(work_order: str):
from erpnext.stock.doctype.stock_entry.stock_entry_handler.manufacturing import (
from erpnext.stock.doctype.stock_entry.services.manufacturing import (
ManufactureStockEntry,
)

View File

@@ -9,13 +9,13 @@ from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos
from erpnext.stock.serial_batch_bundle import SerialBatchCreation
from erpnext.stock.utils import get_combine_datetime
from .base import BaseStockEntry
from .manufacturing import (
ceil_qty_if_uom_has_whole_number,
get_bom_items,
get_production_item_details,
get_secondary_items,
)
from .stock_entry_base import BaseStockEntry
def _qty_tolerance(precision: int) -> float:

View File

@@ -16,8 +16,8 @@ from erpnext.stock.serial_batch_bundle import (
get_serial_nos_from_bundle,
)
from .base import BaseStockEntry
from .serial_batch import create_serial_and_batch_bundle
from .stock_entry_base import BaseStockEntry
class BaseManufactureStockEntry(BaseStockEntry):
@@ -388,7 +388,12 @@ class ManufactureStockEntry(BaseManufactureStockEntry):
self.add_secondary_items_from_job_card()
def add_raw_materials(self):
if not frappe.db.get_single_value("Manufacturing Settings", "material_consumption"):
material_consumption = frappe.db.get_single_value("Manufacturing Settings", "material_consumption")
if material_consumption and self.raw_materials_already_consumed():
return
if not material_consumption:
if self.backflush_based_on == "BOM" or self.wo_doc.skip_transfer:
self.add_raw_materials_based_on_work_order()
else:
@@ -398,6 +403,21 @@ class ManufactureStockEntry(BaseManufactureStockEntry):
else:
self.add_raw_materials_based_on_transfer()
def raw_materials_already_consumed(self) -> bool:
if not self.doc.work_order:
return False
return bool(
frappe.db.exists(
"Stock Entry",
{
"work_order": self.doc.work_order,
"purpose": "Material Consumption for Manufacture",
"docstatus": 1,
},
)
)
def add_unconsumed_raw_materials(self):
wo = self.wo_doc
if not wo:

View File

@@ -2,8 +2,8 @@ import frappe
from frappe import _
from frappe.query_builder.functions import Sum
from .base import BaseStockEntry
from .manufacturing import get_bom_items
from .stock_entry_base import BaseStockEntry
class MaterialReceiptStockEntry(BaseStockEntry):

View File

@@ -3,8 +3,8 @@ from frappe import _
from frappe.query_builder.functions import Sum
from frappe.utils import cstr, flt
from .base import BaseStockEntry
from .manufacturing import _check_bom_component_qty, get_bom_items
from .stock_entry_base import BaseStockEntry
class BaseMaterialTransferStockEntry(BaseStockEntry):

View File

@@ -8,7 +8,7 @@ from erpnext.manufacturing.doctype.bom.bom import get_backflush_based_on
from erpnext.stock.serial_batch_bundle import SerialBatchCreation, get_serial_or_batch_items
from erpnext.stock.utils import get_combine_datetime
from .base import BaseStockEntry
from .stock_entry_base import BaseStockEntry
class StockEntrySABB(BaseStockEntry):

View File

@@ -8,7 +8,7 @@ from frappe.utils import flt
from erpnext.stock.utils import get_bin
from .base import BaseStockEntry
from .stock_entry_base import BaseStockEntry
class SendToSubcontractorStockEntry(BaseStockEntry):

View File

@@ -37,20 +37,20 @@ from erpnext.stock.get_item_details import (
from erpnext.stock.stock_ledger import get_previous_sle, get_valuation_rate
from erpnext.stock.utils import get_incoming_rate
from .stock_entry_handler.disassemble import DisassembleStockEntry
from .stock_entry_handler.manufacturing import (
from .services.disassemble import DisassembleStockEntry
from .services.manufacturing import (
ManufactureStockEntry,
MaterialConsumptionForManufactureStockEntry,
RepackStockEntry,
)
from .stock_entry_handler.material_receipt_issue import MaterialIssueStockEntry, MaterialReceiptStockEntry
from .stock_entry_handler.material_transfer import (
from .services.material_receipt_issue import MaterialIssueStockEntry, MaterialReceiptStockEntry
from .services.material_transfer import (
MaterialRequestStockEntry,
MaterialTransferForManufactureStockEntry,
MaterialTransferStockEntry,
)
from .stock_entry_handler.serial_batch import StockEntrySABB
from .stock_entry_handler.subcontracting import SendToSubcontractorStockEntry
from .services.serial_batch import StockEntrySABB
from .services.subcontracting import SendToSubcontractorStockEntry
class FinishedGoodError(frappe.ValidationError):

View File

@@ -2388,7 +2388,7 @@ class TestStockEntry(ERPNextTestSuite):
"Stock Settings", {"sample_retention_warehouse": "_Test Warehouse 1 - _TC"}
)
def test_sample_retention_stock_entry(self):
from erpnext.stock.doctype.stock_entry.stock_entry_handler.manufacturing import (
from erpnext.stock.doctype.stock_entry.services.manufacturing import (
move_sample_to_retention_warehouse,
)
@@ -2558,7 +2558,7 @@ class TestStockEntryCoverage(ERPNextTestSuite):
# ── ceil_qty_if_uom_has_whole_number ──────────────────────────────────────
def test_ceil_qty_rounds_up_for_whole_number_uom(self):
from erpnext.stock.doctype.stock_entry.stock_entry_handler.manufacturing import (
from erpnext.stock.doctype.stock_entry.services.manufacturing import (
ceil_qty_if_uom_has_whole_number,
)
@@ -2567,7 +2567,7 @@ class TestStockEntryCoverage(ERPNextTestSuite):
frappe.set_value("UOM", "Nos", "must_be_whole_number", 0)
def test_ceil_qty_no_rounding_for_decimal_uom(self):
from erpnext.stock.doctype.stock_entry.stock_entry_handler.manufacturing import (
from erpnext.stock.doctype.stock_entry.services.manufacturing import (
ceil_qty_if_uom_has_whole_number,
)
@@ -2644,7 +2644,7 @@ class TestStockEntryCoverage(ERPNextTestSuite):
# ── get_production_item_details ────────────────────────────────────────────
def test_get_production_item_details_from_bom(self):
from erpnext.stock.doctype.stock_entry.stock_entry_handler.manufacturing import (
from erpnext.stock.doctype.stock_entry.services.manufacturing import (
get_production_item_details,
)
@@ -2654,7 +2654,7 @@ class TestStockEntryCoverage(ERPNextTestSuite):
self.assertIsNotNone(result.stock_uom)
def test_get_production_item_details_from_work_order(self):
from erpnext.stock.doctype.stock_entry.stock_entry_handler.manufacturing import (
from erpnext.stock.doctype.stock_entry.services.manufacturing import (
get_production_item_details,
)
@@ -2680,7 +2680,7 @@ class TestStockEntryCoverage(ERPNextTestSuite):
# ── get_bom_items ──────────────────────────────────────────────────────────
def test_get_bom_items_returns_raw_materials_with_structure(self):
from erpnext.stock.doctype.stock_entry.stock_entry_handler.manufacturing import get_bom_items
from erpnext.stock.doctype.stock_entry.services.manufacturing import get_bom_items
bom_no = frappe.db.get_value("BOM", {"item": "_Test FG Item 2", "is_default": 1, "docstatus": 1})
items = get_bom_items(bom_no)
@@ -2690,7 +2690,7 @@ class TestStockEntryCoverage(ERPNextTestSuite):
self.assertIn("qty", item)
def test_get_bom_items_scales_qty_proportionally(self):
from erpnext.stock.doctype.stock_entry.stock_entry_handler.manufacturing import get_bom_items
from erpnext.stock.doctype.stock_entry.services.manufacturing import get_bom_items
bom_no = frappe.db.get_value("BOM", {"item": "_Test FG Item 2", "is_default": 1, "docstatus": 1})
items_1 = {i["item_code"]: i["qty"] for i in get_bom_items(bom_no, qty=1)}
@@ -2704,7 +2704,7 @@ class TestStockEntryCoverage(ERPNextTestSuite):
"Stock Settings", {"sample_retention_warehouse": "_Test Warehouse 1 - _TC"}
)
def test_validate_sample_quantity_raises_when_sample_exceeds_received_qty(self):
from erpnext.stock.doctype.stock_entry.stock_entry_handler.manufacturing import (
from erpnext.stock.doctype.stock_entry.services.manufacturing import (
validate_sample_quantity,
)
@@ -2718,7 +2718,7 @@ class TestStockEntryCoverage(ERPNextTestSuite):
def test_get_expired_batches_includes_expired_batch(self):
from erpnext.stock.doctype.batch.test_batch import make_new_batch
from erpnext.stock.doctype.stock_entry.stock_entry_handler.serial_batch import (
from erpnext.stock.doctype.stock_entry.services.serial_batch import (
get_expired_batches,
)
@@ -2735,7 +2735,7 @@ class TestStockEntryCoverage(ERPNextTestSuite):
def test_get_expired_batches_excludes_future_batch(self):
from erpnext.stock.doctype.batch.test_batch import make_new_batch
from erpnext.stock.doctype.stock_entry.stock_entry_handler.serial_batch import (
from erpnext.stock.doctype.stock_entry.services.serial_batch import (
get_expired_batches,
)
@@ -2848,7 +2848,7 @@ class TestStockEntryCoverage(ERPNextTestSuite):
from erpnext.manufacturing.doctype.work_order.mapper import (
make_stock_entry as _make_stock_entry,
)
from erpnext.stock.doctype.stock_entry.stock_entry_handler.disassemble import (
from erpnext.stock.doctype.stock_entry.services.disassemble import (
get_available_materials,
)
@@ -2893,7 +2893,7 @@ class TestStockEntryCoverage(ERPNextTestSuite):
from erpnext.manufacturing.doctype.work_order.mapper import (
make_stock_entry as _make_stock_entry,
)
from erpnext.stock.doctype.stock_entry.stock_entry_handler.disassemble import (
from erpnext.stock.doctype.stock_entry.services.disassemble import (
get_available_materials,
)