mirror of
https://github.com/frappe/erpnext.git
synced 2026-09-03 16:40:19 +00:00
refactor: moved files from stock_entry_handler to services
This commit is contained in:
@@ -1653,7 +1653,7 @@ class JobCard(Document):
|
|||||||
)
|
)
|
||||||
|
|
||||||
def populate_manufacture_stock_entry(self, ste):
|
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.make_stock_entry()
|
||||||
ste.stock_entry.flags.ignore_mandatory = True
|
ste.stock_entry.flags.ignore_mandatory = True
|
||||||
|
|||||||
@@ -518,7 +518,7 @@ def _set_pick_list_item_qty(source, target, source_parent, for_qty, max_finished
|
|||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def make_stock_return_entry(work_order: str):
|
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,
|
ManufactureStockEntry,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -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.serial_batch_bundle import SerialBatchCreation
|
||||||
from erpnext.stock.utils import get_combine_datetime
|
from erpnext.stock.utils import get_combine_datetime
|
||||||
|
|
||||||
from .base import BaseStockEntry
|
|
||||||
from .manufacturing import (
|
from .manufacturing import (
|
||||||
ceil_qty_if_uom_has_whole_number,
|
ceil_qty_if_uom_has_whole_number,
|
||||||
get_bom_items,
|
get_bom_items,
|
||||||
get_production_item_details,
|
get_production_item_details,
|
||||||
get_secondary_items,
|
get_secondary_items,
|
||||||
)
|
)
|
||||||
|
from .stock_entry_base import BaseStockEntry
|
||||||
|
|
||||||
|
|
||||||
def _qty_tolerance(precision: int) -> float:
|
def _qty_tolerance(precision: int) -> float:
|
||||||
@@ -16,8 +16,8 @@ from erpnext.stock.serial_batch_bundle import (
|
|||||||
get_serial_nos_from_bundle,
|
get_serial_nos_from_bundle,
|
||||||
)
|
)
|
||||||
|
|
||||||
from .base import BaseStockEntry
|
|
||||||
from .serial_batch import create_serial_and_batch_bundle
|
from .serial_batch import create_serial_and_batch_bundle
|
||||||
|
from .stock_entry_base import BaseStockEntry
|
||||||
|
|
||||||
|
|
||||||
class BaseManufactureStockEntry(BaseStockEntry):
|
class BaseManufactureStockEntry(BaseStockEntry):
|
||||||
@@ -388,7 +388,12 @@ class ManufactureStockEntry(BaseManufactureStockEntry):
|
|||||||
self.add_secondary_items_from_job_card()
|
self.add_secondary_items_from_job_card()
|
||||||
|
|
||||||
def add_raw_materials(self):
|
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:
|
if self.backflush_based_on == "BOM" or self.wo_doc.skip_transfer:
|
||||||
self.add_raw_materials_based_on_work_order()
|
self.add_raw_materials_based_on_work_order()
|
||||||
else:
|
else:
|
||||||
@@ -398,6 +403,21 @@ class ManufactureStockEntry(BaseManufactureStockEntry):
|
|||||||
else:
|
else:
|
||||||
self.add_raw_materials_based_on_transfer()
|
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):
|
def add_unconsumed_raw_materials(self):
|
||||||
wo = self.wo_doc
|
wo = self.wo_doc
|
||||||
if not wo:
|
if not wo:
|
||||||
@@ -2,8 +2,8 @@ import frappe
|
|||||||
from frappe import _
|
from frappe import _
|
||||||
from frappe.query_builder.functions import Sum
|
from frappe.query_builder.functions import Sum
|
||||||
|
|
||||||
from .base import BaseStockEntry
|
|
||||||
from .manufacturing import get_bom_items
|
from .manufacturing import get_bom_items
|
||||||
|
from .stock_entry_base import BaseStockEntry
|
||||||
|
|
||||||
|
|
||||||
class MaterialReceiptStockEntry(BaseStockEntry):
|
class MaterialReceiptStockEntry(BaseStockEntry):
|
||||||
@@ -3,8 +3,8 @@ from frappe import _
|
|||||||
from frappe.query_builder.functions import Sum
|
from frappe.query_builder.functions import Sum
|
||||||
from frappe.utils import cstr, flt
|
from frappe.utils import cstr, flt
|
||||||
|
|
||||||
from .base import BaseStockEntry
|
|
||||||
from .manufacturing import _check_bom_component_qty, get_bom_items
|
from .manufacturing import _check_bom_component_qty, get_bom_items
|
||||||
|
from .stock_entry_base import BaseStockEntry
|
||||||
|
|
||||||
|
|
||||||
class BaseMaterialTransferStockEntry(BaseStockEntry):
|
class BaseMaterialTransferStockEntry(BaseStockEntry):
|
||||||
@@ -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.serial_batch_bundle import SerialBatchCreation, get_serial_or_batch_items
|
||||||
from erpnext.stock.utils import get_combine_datetime
|
from erpnext.stock.utils import get_combine_datetime
|
||||||
|
|
||||||
from .base import BaseStockEntry
|
from .stock_entry_base import BaseStockEntry
|
||||||
|
|
||||||
|
|
||||||
class StockEntrySABB(BaseStockEntry):
|
class StockEntrySABB(BaseStockEntry):
|
||||||
@@ -8,7 +8,7 @@ from frappe.utils import flt
|
|||||||
|
|
||||||
from erpnext.stock.utils import get_bin
|
from erpnext.stock.utils import get_bin
|
||||||
|
|
||||||
from .base import BaseStockEntry
|
from .stock_entry_base import BaseStockEntry
|
||||||
|
|
||||||
|
|
||||||
class SendToSubcontractorStockEntry(BaseStockEntry):
|
class SendToSubcontractorStockEntry(BaseStockEntry):
|
||||||
@@ -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.stock_ledger import get_previous_sle, get_valuation_rate
|
||||||
from erpnext.stock.utils import get_incoming_rate
|
from erpnext.stock.utils import get_incoming_rate
|
||||||
|
|
||||||
from .stock_entry_handler.disassemble import DisassembleStockEntry
|
from .services.disassemble import DisassembleStockEntry
|
||||||
from .stock_entry_handler.manufacturing import (
|
from .services.manufacturing import (
|
||||||
ManufactureStockEntry,
|
ManufactureStockEntry,
|
||||||
MaterialConsumptionForManufactureStockEntry,
|
MaterialConsumptionForManufactureStockEntry,
|
||||||
RepackStockEntry,
|
RepackStockEntry,
|
||||||
)
|
)
|
||||||
from .stock_entry_handler.material_receipt_issue import MaterialIssueStockEntry, MaterialReceiptStockEntry
|
from .services.material_receipt_issue import MaterialIssueStockEntry, MaterialReceiptStockEntry
|
||||||
from .stock_entry_handler.material_transfer import (
|
from .services.material_transfer import (
|
||||||
MaterialRequestStockEntry,
|
MaterialRequestStockEntry,
|
||||||
MaterialTransferForManufactureStockEntry,
|
MaterialTransferForManufactureStockEntry,
|
||||||
MaterialTransferStockEntry,
|
MaterialTransferStockEntry,
|
||||||
)
|
)
|
||||||
from .stock_entry_handler.serial_batch import StockEntrySABB
|
from .services.serial_batch import StockEntrySABB
|
||||||
from .stock_entry_handler.subcontracting import SendToSubcontractorStockEntry
|
from .services.subcontracting import SendToSubcontractorStockEntry
|
||||||
|
|
||||||
|
|
||||||
class FinishedGoodError(frappe.ValidationError):
|
class FinishedGoodError(frappe.ValidationError):
|
||||||
|
|||||||
@@ -2388,7 +2388,7 @@ class TestStockEntry(ERPNextTestSuite):
|
|||||||
"Stock Settings", {"sample_retention_warehouse": "_Test Warehouse 1 - _TC"}
|
"Stock Settings", {"sample_retention_warehouse": "_Test Warehouse 1 - _TC"}
|
||||||
)
|
)
|
||||||
def test_sample_retention_stock_entry(self):
|
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,
|
move_sample_to_retention_warehouse,
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -2558,7 +2558,7 @@ class TestStockEntryCoverage(ERPNextTestSuite):
|
|||||||
# ── ceil_qty_if_uom_has_whole_number ──────────────────────────────────────
|
# ── ceil_qty_if_uom_has_whole_number ──────────────────────────────────────
|
||||||
|
|
||||||
def test_ceil_qty_rounds_up_for_whole_number_uom(self):
|
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,
|
ceil_qty_if_uom_has_whole_number,
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -2567,7 +2567,7 @@ class TestStockEntryCoverage(ERPNextTestSuite):
|
|||||||
frappe.set_value("UOM", "Nos", "must_be_whole_number", 0)
|
frappe.set_value("UOM", "Nos", "must_be_whole_number", 0)
|
||||||
|
|
||||||
def test_ceil_qty_no_rounding_for_decimal_uom(self):
|
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,
|
ceil_qty_if_uom_has_whole_number,
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -2644,7 +2644,7 @@ class TestStockEntryCoverage(ERPNextTestSuite):
|
|||||||
# ── get_production_item_details ────────────────────────────────────────────
|
# ── get_production_item_details ────────────────────────────────────────────
|
||||||
|
|
||||||
def test_get_production_item_details_from_bom(self):
|
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,
|
get_production_item_details,
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -2654,7 +2654,7 @@ class TestStockEntryCoverage(ERPNextTestSuite):
|
|||||||
self.assertIsNotNone(result.stock_uom)
|
self.assertIsNotNone(result.stock_uom)
|
||||||
|
|
||||||
def test_get_production_item_details_from_work_order(self):
|
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,
|
get_production_item_details,
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -2680,7 +2680,7 @@ class TestStockEntryCoverage(ERPNextTestSuite):
|
|||||||
# ── get_bom_items ──────────────────────────────────────────────────────────
|
# ── get_bom_items ──────────────────────────────────────────────────────────
|
||||||
|
|
||||||
def test_get_bom_items_returns_raw_materials_with_structure(self):
|
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})
|
bom_no = frappe.db.get_value("BOM", {"item": "_Test FG Item 2", "is_default": 1, "docstatus": 1})
|
||||||
items = get_bom_items(bom_no)
|
items = get_bom_items(bom_no)
|
||||||
@@ -2690,7 +2690,7 @@ class TestStockEntryCoverage(ERPNextTestSuite):
|
|||||||
self.assertIn("qty", item)
|
self.assertIn("qty", item)
|
||||||
|
|
||||||
def test_get_bom_items_scales_qty_proportionally(self):
|
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})
|
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)}
|
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"}
|
"Stock Settings", {"sample_retention_warehouse": "_Test Warehouse 1 - _TC"}
|
||||||
)
|
)
|
||||||
def test_validate_sample_quantity_raises_when_sample_exceeds_received_qty(self):
|
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,
|
validate_sample_quantity,
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -2718,7 +2718,7 @@ class TestStockEntryCoverage(ERPNextTestSuite):
|
|||||||
|
|
||||||
def test_get_expired_batches_includes_expired_batch(self):
|
def test_get_expired_batches_includes_expired_batch(self):
|
||||||
from erpnext.stock.doctype.batch.test_batch import make_new_batch
|
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,
|
get_expired_batches,
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -2735,7 +2735,7 @@ class TestStockEntryCoverage(ERPNextTestSuite):
|
|||||||
|
|
||||||
def test_get_expired_batches_excludes_future_batch(self):
|
def test_get_expired_batches_excludes_future_batch(self):
|
||||||
from erpnext.stock.doctype.batch.test_batch import make_new_batch
|
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,
|
get_expired_batches,
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -2848,7 +2848,7 @@ class TestStockEntryCoverage(ERPNextTestSuite):
|
|||||||
from erpnext.manufacturing.doctype.work_order.mapper import (
|
from erpnext.manufacturing.doctype.work_order.mapper import (
|
||||||
make_stock_entry as _make_stock_entry,
|
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,
|
get_available_materials,
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -2893,7 +2893,7 @@ class TestStockEntryCoverage(ERPNextTestSuite):
|
|||||||
from erpnext.manufacturing.doctype.work_order.mapper import (
|
from erpnext.manufacturing.doctype.work_order.mapper import (
|
||||||
make_stock_entry as _make_stock_entry,
|
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,
|
get_available_materials,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user