test: po billed amount against debit note
(cherry picked from commit 81dbfe189e)
# Conflicts:
# erpnext/buying/doctype/purchase_order/test_purchase_order.py
This commit is contained in:
@@ -940,6 +940,165 @@ class TestPurchaseOrder(FrappeTestCase):
|
|||||||
|
|
||||||
self.assertRaises(frappe.ValidationError, po.save)
|
self.assertRaises(frappe.ValidationError, po.save)
|
||||||
|
|
||||||
|
<<<<<<< HEAD
|
||||||
|
=======
|
||||||
|
def test_update_items_for_subcontracting_purchase_order(self):
|
||||||
|
from erpnext.controllers.tests.test_subcontracting_controller import (
|
||||||
|
get_subcontracting_order,
|
||||||
|
make_bom_for_subcontracted_items,
|
||||||
|
make_raw_materials,
|
||||||
|
make_service_items,
|
||||||
|
make_subcontracted_items,
|
||||||
|
)
|
||||||
|
|
||||||
|
def update_items(po, qty):
|
||||||
|
trans_items = [po.items[0].as_dict()]
|
||||||
|
trans_items[0]["qty"] = qty
|
||||||
|
trans_items[0]["fg_item_qty"] = qty
|
||||||
|
trans_items = json.dumps(trans_items, default=str)
|
||||||
|
|
||||||
|
return update_child_qty_rate(
|
||||||
|
po.doctype,
|
||||||
|
trans_items,
|
||||||
|
po.name,
|
||||||
|
)
|
||||||
|
|
||||||
|
make_subcontracted_items()
|
||||||
|
make_raw_materials()
|
||||||
|
make_service_items()
|
||||||
|
make_bom_for_subcontracted_items()
|
||||||
|
|
||||||
|
service_items = [
|
||||||
|
{
|
||||||
|
"warehouse": "_Test Warehouse - _TC",
|
||||||
|
"item_code": "Subcontracted Service Item 7",
|
||||||
|
"qty": 10,
|
||||||
|
"rate": 100,
|
||||||
|
"fg_item": "Subcontracted Item SA7",
|
||||||
|
"fg_item_qty": 10,
|
||||||
|
},
|
||||||
|
]
|
||||||
|
po = create_purchase_order(
|
||||||
|
rm_items=service_items,
|
||||||
|
is_subcontracted=1,
|
||||||
|
supplier_warehouse="_Test Warehouse 1 - _TC",
|
||||||
|
)
|
||||||
|
|
||||||
|
update_items(po, qty=20)
|
||||||
|
po.reload()
|
||||||
|
|
||||||
|
# Test - 1: Items should be updated as there is no Subcontracting Order against PO
|
||||||
|
self.assertEqual(po.items[0].qty, 20)
|
||||||
|
self.assertEqual(po.items[0].fg_item_qty, 20)
|
||||||
|
|
||||||
|
sco = get_subcontracting_order(po_name=po.name, warehouse="_Test Warehouse - _TC")
|
||||||
|
|
||||||
|
# Test - 2: ValidationError should be raised as there is Subcontracting Order against PO
|
||||||
|
self.assertRaises(frappe.ValidationError, update_items, po=po, qty=30)
|
||||||
|
|
||||||
|
sco.reload()
|
||||||
|
sco.cancel()
|
||||||
|
po.reload()
|
||||||
|
|
||||||
|
update_items(po, qty=30)
|
||||||
|
po.reload()
|
||||||
|
|
||||||
|
# Test - 3: Items should be updated as the Subcontracting Order is cancelled
|
||||||
|
self.assertEqual(po.items[0].qty, 30)
|
||||||
|
self.assertEqual(po.items[0].fg_item_qty, 30)
|
||||||
|
|
||||||
|
@change_settings("Buying Settings", {"auto_create_subcontracting_order": 1})
|
||||||
|
def test_auto_create_subcontracting_order(self):
|
||||||
|
from erpnext.controllers.tests.test_subcontracting_controller import (
|
||||||
|
make_bom_for_subcontracted_items,
|
||||||
|
make_raw_materials,
|
||||||
|
make_service_items,
|
||||||
|
make_subcontracted_items,
|
||||||
|
)
|
||||||
|
|
||||||
|
make_subcontracted_items()
|
||||||
|
make_raw_materials()
|
||||||
|
make_service_items()
|
||||||
|
make_bom_for_subcontracted_items()
|
||||||
|
|
||||||
|
service_items = [
|
||||||
|
{
|
||||||
|
"warehouse": "_Test Warehouse - _TC",
|
||||||
|
"item_code": "Subcontracted Service Item 7",
|
||||||
|
"qty": 10,
|
||||||
|
"rate": 100,
|
||||||
|
"fg_item": "Subcontracted Item SA7",
|
||||||
|
"fg_item_qty": 10,
|
||||||
|
},
|
||||||
|
]
|
||||||
|
po = create_purchase_order(
|
||||||
|
rm_items=service_items,
|
||||||
|
is_subcontracted=1,
|
||||||
|
supplier_warehouse="_Test Warehouse 1 - _TC",
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertTrue(frappe.db.get_value("Subcontracting Order", {"purchase_order": po.name}))
|
||||||
|
|
||||||
|
def test_purchase_order_advance_payment_status(self):
|
||||||
|
from erpnext.accounts.doctype.payment_entry.test_payment_entry import get_payment_entry
|
||||||
|
from erpnext.accounts.doctype.payment_request.payment_request import make_payment_request
|
||||||
|
|
||||||
|
po = create_purchase_order()
|
||||||
|
self.assertEqual(
|
||||||
|
frappe.db.get_value(po.doctype, po.name, "advance_payment_status"), "Not Initiated"
|
||||||
|
)
|
||||||
|
|
||||||
|
pr = make_payment_request(dt=po.doctype, dn=po.name, submit_doc=True, return_doc=True)
|
||||||
|
self.assertEqual(frappe.db.get_value(po.doctype, po.name, "advance_payment_status"), "Initiated")
|
||||||
|
|
||||||
|
pe = get_payment_entry(po.doctype, po.name).save().submit()
|
||||||
|
self.assertEqual(
|
||||||
|
frappe.db.get_value(po.doctype, po.name, "advance_payment_status"), "Fully Paid"
|
||||||
|
)
|
||||||
|
|
||||||
|
pe.reload()
|
||||||
|
pe.cancel()
|
||||||
|
self.assertEqual(frappe.db.get_value(po.doctype, po.name, "advance_payment_status"), "Initiated")
|
||||||
|
|
||||||
|
pr.reload()
|
||||||
|
pr.cancel()
|
||||||
|
self.assertEqual(
|
||||||
|
frappe.db.get_value(po.doctype, po.name, "advance_payment_status"), "Not Initiated"
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_po_billed_amount_against_return_entry(self):
|
||||||
|
from erpnext.accounts.doctype.purchase_invoice.purchase_invoice import make_debit_note
|
||||||
|
|
||||||
|
# Create a Purchase Order and Fully Bill it
|
||||||
|
po = create_purchase_order()
|
||||||
|
pi = make_pi_from_po(po.name)
|
||||||
|
pi.insert()
|
||||||
|
pi.submit()
|
||||||
|
|
||||||
|
# Debit Note - 50% Qty & enable updating PO billed amount
|
||||||
|
pi_return = make_debit_note(pi.name)
|
||||||
|
pi_return.items[0].qty = -5
|
||||||
|
pi_return.update_billed_amount_in_purchase_order = 1
|
||||||
|
pi_return.submit()
|
||||||
|
|
||||||
|
# Check if the billed amount reduced
|
||||||
|
po.reload()
|
||||||
|
self.assertEqual(po.per_billed, 50)
|
||||||
|
|
||||||
|
pi_return.reload()
|
||||||
|
pi_return.cancel()
|
||||||
|
|
||||||
|
# Debit Note - 50% Qty & disable updating PO billed amount
|
||||||
|
pi_return = make_debit_note(pi.name)
|
||||||
|
pi_return.items[0].qty = -5
|
||||||
|
pi_return.update_billed_amount_in_purchase_order = 0
|
||||||
|
pi_return.submit()
|
||||||
|
|
||||||
|
# Check if the billed amount stayed the same
|
||||||
|
po.reload()
|
||||||
|
self.assertEqual(po.per_billed, 100)
|
||||||
|
|
||||||
|
>>>>>>> 81dbfe189e (test: po billed amount against debit note)
|
||||||
|
|
||||||
def prepare_data_for_internal_transfer():
|
def prepare_data_for_internal_transfer():
|
||||||
from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_internal_supplier
|
from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_internal_supplier
|
||||||
|
|||||||
Reference in New Issue
Block a user