mirror of
https://github.com/frappe/erpnext.git
synced 2026-04-19 23:05:12 +00:00
fix: don't add template item in sales/purchase transaction
(cherry picked from commit 2c83fff1a1)
# Conflicts:
# erpnext/buying/doctype/purchase_order/test_purchase_order.py
This commit is contained in:
committed by
Mergify
parent
f2d83b1b21
commit
f81d4a79ea
@@ -1239,6 +1239,127 @@ class TestPurchaseOrder(FrappeTestCase):
|
|||||||
|
|
||||||
automatically_fetch_payment_terms(enable=0)
|
automatically_fetch_payment_terms(enable=0)
|
||||||
|
|
||||||
|
<<<<<<< HEAD
|
||||||
|
=======
|
||||||
|
def test_internal_transfer_flow(self):
|
||||||
|
from erpnext.accounts.doctype.sales_invoice.sales_invoice import (
|
||||||
|
make_inter_company_purchase_invoice,
|
||||||
|
)
|
||||||
|
from erpnext.selling.doctype.sales_order.sales_order import (
|
||||||
|
make_delivery_note,
|
||||||
|
make_sales_invoice,
|
||||||
|
)
|
||||||
|
from erpnext.stock.doctype.delivery_note.delivery_note import make_inter_company_purchase_receipt
|
||||||
|
|
||||||
|
frappe.db.set_value("Selling Settings", None, "maintain_same_sales_rate", 1)
|
||||||
|
frappe.db.set_value("Buying Settings", None, "maintain_same_rate", 1)
|
||||||
|
|
||||||
|
prepare_data_for_internal_transfer()
|
||||||
|
supplier = "_Test Internal Supplier 2"
|
||||||
|
|
||||||
|
mr = make_material_request(
|
||||||
|
qty=2, company="_Test Company with perpetual inventory", warehouse="Stores - TCP1"
|
||||||
|
)
|
||||||
|
|
||||||
|
po = create_purchase_order(
|
||||||
|
company="_Test Company with perpetual inventory",
|
||||||
|
supplier=supplier,
|
||||||
|
warehouse="Stores - TCP1",
|
||||||
|
from_warehouse="_Test Internal Warehouse New 1 - TCP1",
|
||||||
|
qty=2,
|
||||||
|
rate=1,
|
||||||
|
material_request=mr.name,
|
||||||
|
material_request_item=mr.items[0].name,
|
||||||
|
)
|
||||||
|
|
||||||
|
so = make_inter_company_sales_order(po.name)
|
||||||
|
so.items[0].delivery_date = today()
|
||||||
|
self.assertEqual(so.items[0].warehouse, "_Test Internal Warehouse New 1 - TCP1")
|
||||||
|
self.assertTrue(so.items[0].purchase_order)
|
||||||
|
self.assertTrue(so.items[0].purchase_order_item)
|
||||||
|
so.submit()
|
||||||
|
|
||||||
|
dn = make_delivery_note(so.name)
|
||||||
|
dn.items[0].target_warehouse = "_Test Internal Warehouse GIT - TCP1"
|
||||||
|
self.assertEqual(dn.items[0].warehouse, "_Test Internal Warehouse New 1 - TCP1")
|
||||||
|
self.assertTrue(dn.items[0].purchase_order)
|
||||||
|
self.assertTrue(dn.items[0].purchase_order_item)
|
||||||
|
|
||||||
|
self.assertEqual(po.items[0].name, dn.items[0].purchase_order_item)
|
||||||
|
dn.submit()
|
||||||
|
|
||||||
|
pr = make_inter_company_purchase_receipt(dn.name)
|
||||||
|
self.assertEqual(pr.items[0].warehouse, "Stores - TCP1")
|
||||||
|
self.assertTrue(pr.items[0].purchase_order)
|
||||||
|
self.assertTrue(pr.items[0].purchase_order_item)
|
||||||
|
self.assertEqual(po.items[0].name, pr.items[0].purchase_order_item)
|
||||||
|
pr.submit()
|
||||||
|
|
||||||
|
si = make_sales_invoice(so.name)
|
||||||
|
self.assertEqual(si.items[0].warehouse, "_Test Internal Warehouse New 1 - TCP1")
|
||||||
|
self.assertTrue(si.items[0].purchase_order)
|
||||||
|
self.assertTrue(si.items[0].purchase_order_item)
|
||||||
|
si.submit()
|
||||||
|
|
||||||
|
pi = make_inter_company_purchase_invoice(si.name)
|
||||||
|
self.assertTrue(pi.items[0].purchase_order)
|
||||||
|
self.assertTrue(pi.items[0].po_detail)
|
||||||
|
pi.submit()
|
||||||
|
mr.reload()
|
||||||
|
|
||||||
|
po.load_from_db()
|
||||||
|
self.assertEqual(po.status, "Completed")
|
||||||
|
self.assertEqual(mr.status, "Received")
|
||||||
|
|
||||||
|
def test_variant_item_po(self):
|
||||||
|
po = create_purchase_order(item_code="_Test Variant Item", qty=1, rate=100, do_not_save=1)
|
||||||
|
|
||||||
|
self.assertRaises(frappe.ValidationError, po.save)
|
||||||
|
|
||||||
|
|
||||||
|
def prepare_data_for_internal_transfer():
|
||||||
|
from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_internal_supplier
|
||||||
|
from erpnext.selling.doctype.customer.test_customer import create_internal_customer
|
||||||
|
from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import make_purchase_receipt
|
||||||
|
from erpnext.stock.doctype.warehouse.test_warehouse import create_warehouse
|
||||||
|
|
||||||
|
company = "_Test Company with perpetual inventory"
|
||||||
|
|
||||||
|
create_internal_customer(
|
||||||
|
"_Test Internal Customer 2",
|
||||||
|
company,
|
||||||
|
company,
|
||||||
|
)
|
||||||
|
|
||||||
|
create_internal_supplier(
|
||||||
|
"_Test Internal Supplier 2",
|
||||||
|
company,
|
||||||
|
company,
|
||||||
|
)
|
||||||
|
|
||||||
|
warehouse = create_warehouse("_Test Internal Warehouse New 1", company=company)
|
||||||
|
|
||||||
|
create_warehouse("_Test Internal Warehouse GIT", company=company)
|
||||||
|
|
||||||
|
make_purchase_receipt(company=company, warehouse=warehouse, qty=2, rate=100)
|
||||||
|
|
||||||
|
if not frappe.db.get_value("Company", company, "unrealized_profit_loss_account"):
|
||||||
|
account = "Unrealized Profit and Loss - TCP1"
|
||||||
|
if not frappe.db.exists("Account", account):
|
||||||
|
frappe.get_doc(
|
||||||
|
{
|
||||||
|
"doctype": "Account",
|
||||||
|
"account_name": "Unrealized Profit and Loss",
|
||||||
|
"parent_account": "Direct Income - TCP1",
|
||||||
|
"company": company,
|
||||||
|
"is_group": 0,
|
||||||
|
"account_type": "Income Account",
|
||||||
|
}
|
||||||
|
).insert()
|
||||||
|
|
||||||
|
frappe.db.set_value("Company", company, "unrealized_profit_loss_account", account)
|
||||||
|
|
||||||
|
>>>>>>> 2c83fff1a1 (fix: don't add template item in sales/purchase transaction)
|
||||||
|
|
||||||
def make_pr_against_po(po, received_qty=0):
|
def make_pr_against_po(po, received_qty=0):
|
||||||
pr = make_purchase_receipt(po)
|
pr = make_purchase_receipt(po)
|
||||||
@@ -1342,8 +1463,8 @@ def create_purchase_order(**args):
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
po.set_missing_values()
|
|
||||||
if not args.do_not_save:
|
if not args.do_not_save:
|
||||||
|
po.set_missing_values()
|
||||||
po.insert()
|
po.insert()
|
||||||
if not args.do_not_submit:
|
if not args.do_not_submit:
|
||||||
if po.is_subcontracted == "Yes":
|
if po.is_subcontracted == "Yes":
|
||||||
|
|||||||
@@ -226,8 +226,10 @@ def validate_item_details(args, item):
|
|||||||
|
|
||||||
validate_end_of_life(item.name, item.end_of_life, item.disabled)
|
validate_end_of_life(item.name, item.end_of_life, item.disabled)
|
||||||
|
|
||||||
if args.transaction_type == "selling" and cint(item.has_variants):
|
if cint(item.has_variants):
|
||||||
throw(_("Item {0} is a template, please select one of its variants").format(item.name))
|
msg = f"Item {item.name} is a template, please select one of its variants"
|
||||||
|
|
||||||
|
throw(_(msg), title=_("Template Item Selected"))
|
||||||
|
|
||||||
elif args.transaction_type == "buying" and args.doctype != "Material Request":
|
elif args.transaction_type == "buying" and args.doctype != "Material Request":
|
||||||
if args.get("is_subcontracted") == "Yes" and item.is_sub_contracted_item != 1:
|
if args.get("is_subcontracted") == "Yes" and item.is_sub_contracted_item != 1:
|
||||||
|
|||||||
Reference in New Issue
Block a user