def test_subcontracted_pr_for_multi_transfer_batches(self): from erpnext.stock.doctype.stock_entry.test_stock_entry import make_stock_entry from erpnext.buying.doctype.purchase_order.purchase_order import make_rm_stock_entry, make_purchase_receipt from erpnext.buying.doctype.purchase_order.test_purchase_order import (update_backflush_based_on, create_purchase_order) update_backflush_based_on("Material Transferred for Subcontract") item_code = "_Test Subcontracted FG Item 3" make_item('Sub Contracted Raw Material 3', { 'is_stock_item': 1, 'is_sub_contracted_item': 1, 'has_batch_no': 1, 'create_new_batch': 1 }) create_subcontracted_item(item_code=item_code, has_batch_no=1, raw_materials=["Sub Contracted Raw Material 3"]) order_qty = 500 po = create_purchase_order(item_code=item_code, qty=order_qty, is_subcontracted="Yes", supplier_warehouse="_Test Warehouse 1 - _TC") ste1=make_stock_entry(target="_Test Warehouse - _TC", item_code = "Sub Contracted Raw Material 3", qty=300, basic_rate=100) ste2=make_stock_entry(target="_Test Warehouse - _TC", item_code = "Sub Contracted Raw Material 3", qty=200, basic_rate=100) transferred_batch = { ste1.items[0].batch_no : 300, ste2.items[0].batch_no : 200 } rm_items = [ {"item_code":item_code,"rm_item_code":"Sub Contracted Raw Material 3","item_name":"_Test Item", "qty":300,"warehouse":"_Test Warehouse - _TC", "stock_uom":"Nos", "name": po.supplied_items[0].name}, {"item_code":item_code,"rm_item_code":"Sub Contracted Raw Material 3","item_name":"_Test Item", "qty":200,"warehouse":"_Test Warehouse - _TC", "stock_uom":"Nos", "name": po.supplied_items[0].name} ] rm_item_string = json.dumps(rm_items) se = frappe.get_doc(make_rm_stock_entry(po.name, rm_item_string)) self.assertEqual(len(se.items), 2) se.items[0].batch_no = ste1.items[0].batch_no se.items[1].batch_no = ste2.items[0].batch_no se.submit() supplied_qty = frappe.db.get_value("Purchase Order Item Supplied", {"parent": po.name, "rm_item_code": "Sub Contracted Raw Material 3"}, "supplied_qty") self.assertEqual(supplied_qty, 500.00) pr = make_purchase_receipt(po.name) pr.save() self.assertEqual(len(pr.supplied_items), 2) for row in pr.supplied_items: self.assertEqual(transferred_batch.get(row.batch_no), row.consumed_qty) update_backflush_based_on("BOM")
def test_subcontracting_over_receipt(self): """ Behaviour: Raise multiple PRs against one PO that in total receive more than the required qty in the PO. Expected Result: Error Raised for Over Receipt against PO. """ from erpnext.stock.doctype.stock_entry.test_stock_entry import make_stock_entry from erpnext.buying.doctype.purchase_order.test_purchase_order import (update_backflush_based_on, make_subcontracted_item, create_purchase_order) from erpnext.buying.doctype.purchase_order.purchase_order import (make_purchase_receipt, make_rm_stock_entry as make_subcontract_transfer_entry) update_backflush_based_on("Material Transferred for Subcontract") item_code = "_Test Subcontracted FG Item 1" make_subcontracted_item(item_code=item_code) po = create_purchase_order(item_code=item_code, qty=1, include_exploded_items=0, is_subcontracted="Yes", supplier_warehouse="_Test Warehouse 1 - _TC") #stock raw materials in a warehouse before transfer se1 = make_stock_entry(target="_Test Warehouse - _TC", item_code = "Test Extra Item 1", qty=10, basic_rate=100) se2 = make_stock_entry(target="_Test Warehouse - _TC", item_code = "_Test FG Item", qty=1, basic_rate=100) rm_items = [ { "item_code": item_code, "rm_item_code": po.supplied_items[0].rm_item_code, "item_name": "_Test FG Item", "qty": po.supplied_items[0].required_qty, "warehouse": "_Test Warehouse - _TC", "stock_uom": "Nos" }, { "item_code": item_code, "rm_item_code": po.supplied_items[1].rm_item_code, "item_name": "Test Extra Item 1", "qty": po.supplied_items[1].required_qty, "warehouse": "_Test Warehouse - _TC", "stock_uom": "Nos" } ] rm_item_string = json.dumps(rm_items) se = frappe.get_doc(make_subcontract_transfer_entry(po.name, rm_item_string)) se.to_warehouse = "_Test Warehouse 1 - _TC" se.save() se.submit() pr1 = make_purchase_receipt(po.name) pr2 = make_purchase_receipt(po.name) pr1.submit() self.assertRaises(frappe.ValidationError, pr2.submit) pr1.cancel() se.cancel() se1.cancel() se2.cancel() po.reload() po.cancel()