From fff744a600df7bd03895b70df91a8b99ea35db9e Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Mon, 15 Jul 2024 16:21:07 +0530 Subject: [PATCH 1/2] fix: not able to cancel the inter transfer DN (#42333) --- erpnext/controllers/buying_controller.py | 18 +- erpnext/controllers/selling_controller.py | 4 +- .../purchase_receipt/test_purchase_receipt.py | 360 ++++++++++++++++++ 3 files changed, 378 insertions(+), 4 deletions(-) diff --git a/erpnext/controllers/buying_controller.py b/erpnext/controllers/buying_controller.py index 44d448760e..d43a371c3c 100644 --- a/erpnext/controllers/buying_controller.py +++ b/erpnext/controllers/buying_controller.py @@ -546,8 +546,12 @@ class BuyingController(SubcontractingController): "actual_qty": flt(pr_qty), "serial_and_batch_bundle": ( d.serial_and_batch_bundle - if not self.is_internal_transfer() or self.is_return - else self.get_package_for_target_warehouse(d, type_of_transaction=type_of_transaction) + if not self.is_internal_transfer() + or self.is_return + or (self.is_internal_transfer() and self.docstatus == 2) + else self.get_package_for_target_warehouse( + d, type_of_transaction=type_of_transaction + ) ), }, ) @@ -583,6 +587,14 @@ class BuyingController(SubcontractingController): (not cint(self.is_return) and self.docstatus == 2) or (cint(self.is_return) and self.docstatus == 1) ): + serial_and_batch_bundle = None + if self.is_internal_transfer() and self.docstatus == 2: + serial_and_batch_bundle = frappe.db.get_value( + "Stock Ledger Entry", + {"voucher_detail_no": d.name, "warehouse": d.warehouse}, + "serial_and_batch_bundle", + ) + from_warehouse_sle = self.get_sl_entries( d, { @@ -592,7 +604,7 @@ class BuyingController(SubcontractingController): "serial_and_batch_bundle": ( self.get_package_for_target_warehouse(d, d.from_warehouse, "Inward") if self.is_internal_transfer() and self.is_return - else None + else serial_and_batch_bundle ), }, ) diff --git a/erpnext/controllers/selling_controller.py b/erpnext/controllers/selling_controller.py index 65ab41878e..eeef6e4599 100644 --- a/erpnext/controllers/selling_controller.py +++ b/erpnext/controllers/selling_controller.py @@ -539,7 +539,9 @@ class SellingController(StockController): self.make_sl_entries(sl_entries) def get_sle_for_source_warehouse(self, item_row): - serial_and_batch_bundle = item_row.serial_and_batch_bundle + serial_and_batch_bundle = ( + item_row.serial_and_batch_bundle if not self.is_internal_transfer() else None + ) if serial_and_batch_bundle and self.is_internal_transfer() and self.is_return: if self.docstatus == 1: serial_and_batch_bundle = self.make_package_for_transfer( diff --git a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py index f682f3f883..1830990e58 100644 --- a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py +++ b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py @@ -2976,6 +2976,366 @@ class TestPurchaseReceipt(FrappeTestCase): self.assertEqual(pr_return.items[0].rejected_qty, 0.0) self.assertEqual(pr_return.items[0].rejected_warehouse, "") + def test_tax_account_heads_on_lcv_and_item_repost(self): + """ + PO -> PR -> PI + PR -> LCV + Backdated `Repost Item valuation` should not merge tax account heads into stock_rbnb + """ + from erpnext.accounts.doctype.account.test_account import create_account + from erpnext.buying.doctype.purchase_order.test_purchase_order import ( + create_purchase_order, + make_pr_against_po, + ) + from erpnext.stock.doctype.purchase_receipt.purchase_receipt import make_purchase_invoice + + # @dokos: avoid conflict with other tests + frappe.db.delete("Stock Ledger Entry") + + stock_rbnb = "Stock Received But Not Billed - _TC" + stock_in_hand = "Stock In Hand - _TC" + test_cc = "_Test Cost Center - _TC" + test_company = "_Test Company" + creditors = "Creditors - _TC" + lcv_expense_account = "Expenses Included In Valuation - _TC" + + company_doc = frappe.get_doc("Company", test_company) + company_doc.enable_perpetual_inventory = True + company_doc.stock_received_but_not_billed = stock_rbnb + company_doc.default_inventory_account = stock_in_hand + company_doc.save() + + packaging_charges_account = create_account( + account_name="Packaging Charges", + parent_account="Indirect Expenses - _TC", + company=test_company, + account_type="Tax", + ) + + po = create_purchase_order(qty=10, rate=100, do_not_save=1) + po.taxes = [] + po.append( + "taxes", + { + "category": "Valuation and Total", + "account_head": packaging_charges_account, + "cost_center": test_cc, + "description": "Test", + "add_deduct_tax": "Add", + "charge_type": "Actual", + "tax_amount": 250, + }, + ) + po.save().submit() + + pr = make_pr_against_po(po.name, received_qty=10) + pr_gl_entries = get_gl_entries(pr.doctype, pr.name, skip_cancelled=True) + expected_pr_gles = [ + {"account": stock_rbnb, "debit": 0.0, "credit": 1000.0, "cost_center": test_cc}, + {"account": stock_in_hand, "debit": 1250.0, "credit": 0.0, "cost_center": test_cc}, + {"account": packaging_charges_account, "debit": 0.0, "credit": 250.0, "cost_center": test_cc}, + ] + self.assertEqual(expected_pr_gles, pr_gl_entries) + + # Make PI against Purchase Receipt + pi = make_purchase_invoice(pr.name).save().submit() + pi_gl_entries = get_gl_entries(pi.doctype, pi.name, skip_cancelled=True) + expected_pi_gles = [ + {"account": stock_rbnb, "debit": 1000.0, "credit": 0.0, "cost_center": test_cc}, + {"account": packaging_charges_account, "debit": 250.0, "credit": 0.0, "cost_center": test_cc}, + {"account": creditors, "debit": 0.0, "credit": 1250.0, "cost_center": None}, + ] + self.assertEqual(expected_pi_gles, pi_gl_entries) + + lcv = self.create_lcv(pr.doctype, pr.name, test_company, lcv_expense_account) + pr_gles_after_lcv = get_gl_entries(pr.doctype, pr.name, skip_cancelled=True) + expected_pr_gles_after_lcv = [ + {"account": stock_rbnb, "debit": 0.0, "credit": 1000.0, "cost_center": test_cc}, + {"account": stock_in_hand, "debit": 1300.0, "credit": 0.0, "cost_center": test_cc}, + {"account": packaging_charges_account, "debit": 0.0, "credit": 250.0, "cost_center": test_cc}, + {"account": lcv_expense_account, "debit": 0.0, "credit": 50.0, "cost_center": test_cc}, + ] + self.assertEqual(expected_pr_gles_after_lcv, pr_gles_after_lcv) + + # Trigger Repost Item Valudation on a older date + repost_doc = frappe.get_doc( + { + "doctype": "Repost Item Valuation", + "based_on": "Item and Warehouse", + "item_code": pr.items[0].item_code, + "warehouse": pr.items[0].warehouse, + "posting_date": add_days(pr.posting_date, -1), + "posting_time": "00:00:00", + "company": pr.company, + "allow_negative_stock": 1, + "via_landed_cost_voucher": 0, + "allow_zero_rate": 0, + } + ) + repost_doc.save().submit() + + pr_gles_after_repost = get_gl_entries(pr.doctype, pr.name, skip_cancelled=True) + expected_pr_gles_after_repost = [ + {"account": stock_rbnb, "debit": 0.0, "credit": 1000.0, "cost_center": test_cc}, + {"account": stock_in_hand, "debit": 1300.0, "credit": 0.0, "cost_center": test_cc}, + {"account": packaging_charges_account, "debit": 0.0, "credit": 250.0, "cost_center": test_cc}, + {"account": lcv_expense_account, "debit": 0.0, "credit": 50.0, "cost_center": test_cc}, + ] + self.assertEqual(len(pr_gles_after_repost), len(expected_pr_gles_after_repost)) + self.assertEqual(expected_pr_gles_after_repost, pr_gles_after_repost) + + # teardown + lcv.reload() + lcv.cancel() + pi.reload() + pi.cancel() + pr.reload() + pr.cancel() + + company_doc.enable_perpetual_inventory = False + company_doc.stock_received_but_not_billed = None + company_doc.default_inventory_account = None + company_doc.save() + + def create_lcv(self, receipt_document_type, receipt_document, company, expense_account, charges=50): + ref_doc = frappe.get_doc(receipt_document_type, receipt_document) + + lcv = frappe.new_doc("Landed Cost Voucher") + lcv.company = company + lcv.distribute_charges_based_on = "Qty" + lcv.set( + "purchase_receipts", + [ + { + "receipt_document_type": receipt_document_type, + "receipt_document": receipt_document, + "supplier": ref_doc.supplier, + "posting_date": ref_doc.posting_date, + "grand_total": ref_doc.base_grand_total, + } + ], + ) + + lcv.set( + "taxes", + [ + { + "description": "Testing", + "expense_account": expense_account, + "amount": charges, + } + ], + ) + lcv.save().submit() + return lcv + + def test_status_mapping(self): + item_code = "item_for_status" + create_item(item_code) + create_item("item_for_status") + warehouse = create_warehouse("Stores") + supplier = "Test Supplier" + create_supplier(supplier_name=supplier) + pr = make_purchase_receipt( + item_code=item_code, + warehouse=warehouse, + qty=1, + rate=0, + ) + self.assertEqual(pr.grand_total, 0.0) + self.assertEqual(pr.status, "Completed") + + def test_do_not_use_batchwise_valuation_rate(self): + from erpnext.stock.doctype.delivery_note.test_delivery_note import create_delivery_note + + item_code = "Test Item for Do Not Use Batchwise Valuation" + make_item( + item_code, + properties={ + "is_stock_item": 1, + "has_batch_no": 1, + "create_new_batch": 1, + "batch_number_series": "TIDNBV-.#####", + "valuation_method": "Moving Average", + }, + ) + + # 1st pr for 100 rate + pr = make_purchase_receipt( + item_code=item_code, + qty=1, + rate=100, + posting_date=add_days(today(), -2), + ) + + make_purchase_receipt( + item_code=item_code, + qty=1, + rate=200, + posting_date=add_days(today(), -1), + ) + + dn = create_delivery_note( + item_code=item_code, + qty=1, + rate=300, + posting_date=today(), + use_serial_batch_fields=1, + batch_no=get_batch_from_bundle(pr.items[0].serial_and_batch_bundle), + ) + dn.reload() + bundle = dn.items[0].serial_and_batch_bundle + + valuation_rate = frappe.db.get_value("Serial and Batch Bundle", bundle, "avg_rate") + self.assertEqual(valuation_rate, 100) + + doc = frappe.get_doc("Stock Settings") + doc.do_not_use_batchwise_valuation = 1 + doc.flags.ignore_validate = True + doc.save() + + pr.repost_future_sle_and_gle(force=True) + + valuation_rate = frappe.db.get_value("Serial and Batch Bundle", bundle, "avg_rate") + self.assertEqual(valuation_rate, 150) + + doc = frappe.get_doc("Stock Settings") + doc.do_not_use_batchwise_valuation = 0 + doc.flags.ignore_validate = True + doc.save() + + def test_status_mapping(self): + item_code = "item_for_status" + create_item(item_code) + create_item("item_for_status") + warehouse = create_warehouse("Stores") + supplier = "Test Supplier" + create_supplier(supplier_name=supplier) + pr = make_purchase_receipt( + item_code=item_code, + warehouse=warehouse, + qty=1, + rate=0, + ) + self.assertEqual(pr.grand_total, 0.0) + self.assertEqual(pr.status, "Completed") + + def test_internal_transfer_for_batch_items_with_cancel(self): + from erpnext.controllers.sales_and_purchase_return import make_return_doc + from erpnext.stock.doctype.delivery_note.delivery_note import make_inter_company_purchase_receipt + from erpnext.stock.doctype.delivery_note.test_delivery_note import create_delivery_note + + frappe.db.set_single_value("Stock Settings", "use_serial_batch_fields", 0) + + prepare_data_for_internal_transfer() + + customer = "_Test Internal Customer 2" + company = "_Test Company with perpetual inventory" + + batch_item_doc = make_item( + "_Test Batch Item For Stock Transfer Cancel Case", + {"has_batch_no": 1, "create_new_batch": 1, "batch_number_series": "USBF-BT-CANBIFST-.####"}, + ) + + serial_item_doc = make_item( + "_Test Serial No Item For Stock Transfer Cancel Case", + {"has_serial_no": 1, "serial_no_series": "USBF-BT-CANBIFST-.####"}, + ) + + inward_entry = make_purchase_receipt( + item_code=batch_item_doc.name, + qty=10, + rate=150, + warehouse="Stores - TCP1", + company="_Test Company with perpetual inventory", + use_serial_batch_fields=0, + do_not_submit=1, + ) + + inward_entry.append( + "items", + { + "item_code": serial_item_doc.name, + "qty": 15, + "rate": 250, + "item_name": serial_item_doc.item_name, + "conversion_factor": 1.0, + "uom": serial_item_doc.stock_uom, + "stock_uom": serial_item_doc.stock_uom, + "warehouse": "Stores - TCP1", + "use_serial_batch_fields": 0, + }, + ) + + inward_entry.submit() + inward_entry.reload() + + for row in inward_entry.items: + self.assertTrue(row.serial_and_batch_bundle) + + inter_transfer_dn = create_delivery_note( + item_code=inward_entry.items[0].item_code, + company=company, + customer=customer, + cost_center="Main - TCP1", + expense_account="Cost of Goods Sold - TCP1", + qty=10, + rate=500, + warehouse="Stores - TCP1", + target_warehouse="Work In Progress - TCP1", + batch_no=get_batch_from_bundle(inward_entry.items[0].serial_and_batch_bundle), + use_serial_batch_fields=0, + do_not_submit=1, + ) + + inter_transfer_dn.append( + "items", + { + "item_code": serial_item_doc.name, + "qty": 15, + "rate": 350, + "item_name": serial_item_doc.item_name, + "conversion_factor": 1.0, + "uom": serial_item_doc.stock_uom, + "stock_uom": serial_item_doc.stock_uom, + "warehouse": "Stores - TCP1", + "target_warehouse": "Work In Progress - TCP1", + "serial_no": "\n".join( + get_serial_nos_from_bundle(inward_entry.items[1].serial_and_batch_bundle) + ), + "use_serial_batch_fields": 0, + }, + ) + + inter_transfer_dn.submit() + inter_transfer_dn.reload() + for row in inter_transfer_dn.items: + if row.item_code == batch_item_doc.name: + self.assertEqual(row.rate, 150.0) + else: + self.assertEqual(row.rate, 250.0) + + self.assertTrue(row.serial_and_batch_bundle) + + inter_transfer_pr = make_inter_company_purchase_receipt(inter_transfer_dn.name) + for row in inter_transfer_pr.items: + row.from_warehouse = "Work In Progress - TCP1" + row.warehouse = "Stores - TCP1" + inter_transfer_pr.submit() + + for row in inter_transfer_pr.items: + if row.item_code == batch_item_doc.name: + self.assertEqual(row.rate, 150.0) + else: + self.assertEqual(row.rate, 250.0) + + self.assertTrue(row.serial_and_batch_bundle) + + inter_transfer_pr.cancel() + inter_transfer_dn.cancel() + + frappe.db.set_single_value("Stock Settings", "use_serial_batch_fields", 1) + def prepare_data_for_internal_transfer(): from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_internal_supplier -- GitLab From 0443af8b54d5b75538d4ab9357fc47bbb010f849 Mon Sep 17 00:00:00 2001 From: Charles-Henri Decultot Date: Tue, 16 Jul 2024 04:26:17 +0000 Subject: [PATCH 2/2] fix: remove tests present only in develop --- .../purchase_receipt/test_purchase_receipt.py | 244 ------------------ 1 file changed, 244 deletions(-) diff --git a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py index 1830990e58..b5f2beadf9 100644 --- a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py +++ b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py @@ -2976,250 +2976,6 @@ class TestPurchaseReceipt(FrappeTestCase): self.assertEqual(pr_return.items[0].rejected_qty, 0.0) self.assertEqual(pr_return.items[0].rejected_warehouse, "") - def test_tax_account_heads_on_lcv_and_item_repost(self): - """ - PO -> PR -> PI - PR -> LCV - Backdated `Repost Item valuation` should not merge tax account heads into stock_rbnb - """ - from erpnext.accounts.doctype.account.test_account import create_account - from erpnext.buying.doctype.purchase_order.test_purchase_order import ( - create_purchase_order, - make_pr_against_po, - ) - from erpnext.stock.doctype.purchase_receipt.purchase_receipt import make_purchase_invoice - - # @dokos: avoid conflict with other tests - frappe.db.delete("Stock Ledger Entry") - - stock_rbnb = "Stock Received But Not Billed - _TC" - stock_in_hand = "Stock In Hand - _TC" - test_cc = "_Test Cost Center - _TC" - test_company = "_Test Company" - creditors = "Creditors - _TC" - lcv_expense_account = "Expenses Included In Valuation - _TC" - - company_doc = frappe.get_doc("Company", test_company) - company_doc.enable_perpetual_inventory = True - company_doc.stock_received_but_not_billed = stock_rbnb - company_doc.default_inventory_account = stock_in_hand - company_doc.save() - - packaging_charges_account = create_account( - account_name="Packaging Charges", - parent_account="Indirect Expenses - _TC", - company=test_company, - account_type="Tax", - ) - - po = create_purchase_order(qty=10, rate=100, do_not_save=1) - po.taxes = [] - po.append( - "taxes", - { - "category": "Valuation and Total", - "account_head": packaging_charges_account, - "cost_center": test_cc, - "description": "Test", - "add_deduct_tax": "Add", - "charge_type": "Actual", - "tax_amount": 250, - }, - ) - po.save().submit() - - pr = make_pr_against_po(po.name, received_qty=10) - pr_gl_entries = get_gl_entries(pr.doctype, pr.name, skip_cancelled=True) - expected_pr_gles = [ - {"account": stock_rbnb, "debit": 0.0, "credit": 1000.0, "cost_center": test_cc}, - {"account": stock_in_hand, "debit": 1250.0, "credit": 0.0, "cost_center": test_cc}, - {"account": packaging_charges_account, "debit": 0.0, "credit": 250.0, "cost_center": test_cc}, - ] - self.assertEqual(expected_pr_gles, pr_gl_entries) - - # Make PI against Purchase Receipt - pi = make_purchase_invoice(pr.name).save().submit() - pi_gl_entries = get_gl_entries(pi.doctype, pi.name, skip_cancelled=True) - expected_pi_gles = [ - {"account": stock_rbnb, "debit": 1000.0, "credit": 0.0, "cost_center": test_cc}, - {"account": packaging_charges_account, "debit": 250.0, "credit": 0.0, "cost_center": test_cc}, - {"account": creditors, "debit": 0.0, "credit": 1250.0, "cost_center": None}, - ] - self.assertEqual(expected_pi_gles, pi_gl_entries) - - lcv = self.create_lcv(pr.doctype, pr.name, test_company, lcv_expense_account) - pr_gles_after_lcv = get_gl_entries(pr.doctype, pr.name, skip_cancelled=True) - expected_pr_gles_after_lcv = [ - {"account": stock_rbnb, "debit": 0.0, "credit": 1000.0, "cost_center": test_cc}, - {"account": stock_in_hand, "debit": 1300.0, "credit": 0.0, "cost_center": test_cc}, - {"account": packaging_charges_account, "debit": 0.0, "credit": 250.0, "cost_center": test_cc}, - {"account": lcv_expense_account, "debit": 0.0, "credit": 50.0, "cost_center": test_cc}, - ] - self.assertEqual(expected_pr_gles_after_lcv, pr_gles_after_lcv) - - # Trigger Repost Item Valudation on a older date - repost_doc = frappe.get_doc( - { - "doctype": "Repost Item Valuation", - "based_on": "Item and Warehouse", - "item_code": pr.items[0].item_code, - "warehouse": pr.items[0].warehouse, - "posting_date": add_days(pr.posting_date, -1), - "posting_time": "00:00:00", - "company": pr.company, - "allow_negative_stock": 1, - "via_landed_cost_voucher": 0, - "allow_zero_rate": 0, - } - ) - repost_doc.save().submit() - - pr_gles_after_repost = get_gl_entries(pr.doctype, pr.name, skip_cancelled=True) - expected_pr_gles_after_repost = [ - {"account": stock_rbnb, "debit": 0.0, "credit": 1000.0, "cost_center": test_cc}, - {"account": stock_in_hand, "debit": 1300.0, "credit": 0.0, "cost_center": test_cc}, - {"account": packaging_charges_account, "debit": 0.0, "credit": 250.0, "cost_center": test_cc}, - {"account": lcv_expense_account, "debit": 0.0, "credit": 50.0, "cost_center": test_cc}, - ] - self.assertEqual(len(pr_gles_after_repost), len(expected_pr_gles_after_repost)) - self.assertEqual(expected_pr_gles_after_repost, pr_gles_after_repost) - - # teardown - lcv.reload() - lcv.cancel() - pi.reload() - pi.cancel() - pr.reload() - pr.cancel() - - company_doc.enable_perpetual_inventory = False - company_doc.stock_received_but_not_billed = None - company_doc.default_inventory_account = None - company_doc.save() - - def create_lcv(self, receipt_document_type, receipt_document, company, expense_account, charges=50): - ref_doc = frappe.get_doc(receipt_document_type, receipt_document) - - lcv = frappe.new_doc("Landed Cost Voucher") - lcv.company = company - lcv.distribute_charges_based_on = "Qty" - lcv.set( - "purchase_receipts", - [ - { - "receipt_document_type": receipt_document_type, - "receipt_document": receipt_document, - "supplier": ref_doc.supplier, - "posting_date": ref_doc.posting_date, - "grand_total": ref_doc.base_grand_total, - } - ], - ) - - lcv.set( - "taxes", - [ - { - "description": "Testing", - "expense_account": expense_account, - "amount": charges, - } - ], - ) - lcv.save().submit() - return lcv - - def test_status_mapping(self): - item_code = "item_for_status" - create_item(item_code) - create_item("item_for_status") - warehouse = create_warehouse("Stores") - supplier = "Test Supplier" - create_supplier(supplier_name=supplier) - pr = make_purchase_receipt( - item_code=item_code, - warehouse=warehouse, - qty=1, - rate=0, - ) - self.assertEqual(pr.grand_total, 0.0) - self.assertEqual(pr.status, "Completed") - - def test_do_not_use_batchwise_valuation_rate(self): - from erpnext.stock.doctype.delivery_note.test_delivery_note import create_delivery_note - - item_code = "Test Item for Do Not Use Batchwise Valuation" - make_item( - item_code, - properties={ - "is_stock_item": 1, - "has_batch_no": 1, - "create_new_batch": 1, - "batch_number_series": "TIDNBV-.#####", - "valuation_method": "Moving Average", - }, - ) - - # 1st pr for 100 rate - pr = make_purchase_receipt( - item_code=item_code, - qty=1, - rate=100, - posting_date=add_days(today(), -2), - ) - - make_purchase_receipt( - item_code=item_code, - qty=1, - rate=200, - posting_date=add_days(today(), -1), - ) - - dn = create_delivery_note( - item_code=item_code, - qty=1, - rate=300, - posting_date=today(), - use_serial_batch_fields=1, - batch_no=get_batch_from_bundle(pr.items[0].serial_and_batch_bundle), - ) - dn.reload() - bundle = dn.items[0].serial_and_batch_bundle - - valuation_rate = frappe.db.get_value("Serial and Batch Bundle", bundle, "avg_rate") - self.assertEqual(valuation_rate, 100) - - doc = frappe.get_doc("Stock Settings") - doc.do_not_use_batchwise_valuation = 1 - doc.flags.ignore_validate = True - doc.save() - - pr.repost_future_sle_and_gle(force=True) - - valuation_rate = frappe.db.get_value("Serial and Batch Bundle", bundle, "avg_rate") - self.assertEqual(valuation_rate, 150) - - doc = frappe.get_doc("Stock Settings") - doc.do_not_use_batchwise_valuation = 0 - doc.flags.ignore_validate = True - doc.save() - - def test_status_mapping(self): - item_code = "item_for_status" - create_item(item_code) - create_item("item_for_status") - warehouse = create_warehouse("Stores") - supplier = "Test Supplier" - create_supplier(supplier_name=supplier) - pr = make_purchase_receipt( - item_code=item_code, - warehouse=warehouse, - qty=1, - rate=0, - ) - self.assertEqual(pr.grand_total, 0.0) - self.assertEqual(pr.status, "Completed") - def test_internal_transfer_for_batch_items_with_cancel(self): from erpnext.controllers.sales_and_purchase_return import make_return_doc from erpnext.stock.doctype.delivery_note.delivery_note import make_inter_company_purchase_receipt -- GitLab