def test_make_sales_invoice_from_dn_with_returned_qty_duplicate_items( self): from erpbee.stock.doctype.delivery_note.delivery_note import make_sales_invoice dn = create_delivery_note(qty=8, do_not_submit=True) dn.append( "items", { "item_code": "_Test Item", "warehouse": "_Test Warehouse - _TC", "qty": 1, "rate": 100, "conversion_factor": 1.0, "expense_account": "Cost of Goods Sold - _TC", "cost_center": "_Test Cost Center - _TC" }) dn.submit() si1 = make_sales_invoice(dn.name) si1.items[0].qty = 4 si1.items.pop(1) si1.save() si1.submit() dn1 = create_delivery_note(is_return=1, return_against=dn.name, qty=-2, do_not_submit=True) dn1.items[0].dn_detail = dn.items[0].name dn1.submit() si2 = make_sales_invoice(dn.name) self.assertEquals(si2.items[0].qty, 2) self.assertEquals(si2.items[1].qty, 1)
def test_serialized_partial_sales_invoice(self): se = make_serialized_item() serial_no = get_serial_nos(se.get("items")[0].serial_no) serial_no = '\n'.join(serial_no) dn = create_delivery_note( item_code="_Test Serialized Item With Series", qty=2, serial_no=serial_no) si = make_sales_invoice(dn.name) si.items[0].qty = 1 si.submit() self.assertEqual(si.items[0].qty, 1) si = make_sales_invoice(dn.name) si.submit() self.assertEqual(si.items[0].qty, len(get_serial_nos(si.items[0].serial_no)))
def test_over_billing_against_dn(self): frappe.db.set_value("Stock Settings", None, "allow_negative_stock", 1) dn = create_delivery_note(do_not_submit=True) self.assertRaises(frappe.ValidationError, make_sales_invoice, dn.name) dn.submit() si = make_sales_invoice(dn.name) self.assertEqual(len(si.get("items")), len(dn.get("items"))) # modify amount si.get("items")[0].rate = 200 self.assertRaises(frappe.ValidationError, frappe.get_doc(si).insert)
def test_dn_billing_status_case3(self): # SO -> DN1 -> SI and SO -> SI and SO -> DN2 from erpbee.selling.doctype.sales_order.sales_order \ import make_delivery_note, make_sales_invoice as make_sales_invoice_from_so frappe.db.set_value("Stock Settings", None, "allow_negative_stock", 1) so = make_sales_order() dn1 = make_delivery_note(so.name) dn1.get("items")[0].qty = 2 dn1.submit() # Testing if Customer's Purchase Order No was rightly copied self.assertEqual(dn1.po_no, so.po_no) si1 = make_sales_invoice(dn1.name) si1.submit() # Testing if Customer's Purchase Order No was rightly copied self.assertEqual(dn1.po_no, si1.po_no) dn1.load_from_db() self.assertEqual(dn1.per_billed, 100) si2 = make_sales_invoice_from_so(so.name) si2.get("items")[0].qty = 4 si2.submit() # Testing if Customer's Purchase Order No was rightly copied self.assertEqual(si2.po_no, so.po_no) dn2 = make_delivery_note(so.name) dn2.get("items")[0].qty = 5 dn2.submit() # Testing if Customer's Purchase Order No was rightly copied self.assertEqual(dn2.po_no, so.po_no) dn1.load_from_db() self.assertEqual(dn1.get("items")[0].billed_amt, 200) self.assertEqual(dn1.per_billed, 100) self.assertEqual(dn1.status, "Completed") self.assertEqual(dn2.get("items")[0].billed_amt, 400) self.assertEqual(dn2.per_billed, 80) self.assertEqual(dn2.status, "To Bill")
def test_make_sales_invoice_from_dn_for_returned_qty(self): from erpbee.selling.doctype.sales_order.sales_order import make_delivery_note from erpbee.stock.doctype.delivery_note.delivery_note import make_sales_invoice so = make_sales_order(qty=2) so.submit() dn = make_delivery_note(so.name) dn.submit() dn1 = create_delivery_note(is_return=1, return_against=dn.name, qty=-1, do_not_submit=True) dn1.items[0].against_sales_order = so.name dn1.items[0].so_detail = so.items[0].name dn1.items[0].dn_detail = dn.items[0].name dn1.submit() si = make_sales_invoice(dn.name) self.assertEquals(si.items[0].qty, 1)
def test_dn_billing_status_case1(self): # SO -> DN -> SI so = make_sales_order() dn = create_dn_against_so(so.name, delivered_qty=2) self.assertEqual(dn.status, "To Bill") self.assertEqual(dn.per_billed, 0) # Testing if Customer's Purchase Order No was rightly copied self.assertEqual(dn.po_no, so.po_no) si = make_sales_invoice(dn.name) si.submit() # Testing if Customer's Purchase Order No was rightly copied self.assertEqual(dn.po_no, si.po_no) dn.load_from_db() self.assertEqual(dn.get("items")[0].billed_amt, 200) self.assertEqual(dn.per_billed, 100) self.assertEqual(dn.status, "Completed")
def test_dn_billing_status_case4(self): # SO -> SI -> DN from erpbee.selling.doctype.sales_order.sales_order import make_sales_invoice from erpbee.accounts.doctype.sales_invoice.sales_invoice import make_delivery_note so = make_sales_order() si = make_sales_invoice(so.name) si.submit() # Testing if Customer's Purchase Order No was rightly copied self.assertEqual(so.po_no, si.po_no) dn = make_delivery_note(si.name) dn.submit() # Testing if Customer's Purchase Order No was rightly copied self.assertEqual(dn.po_no, si.po_no) self.assertEqual(dn.get("items")[0].billed_amt, 1000) self.assertEqual(dn.per_billed, 100) self.assertEqual(dn.status, "Completed")
def test_serialized(self): se = make_serialized_item() serial_no = get_serial_nos(se.get("items")[0].serial_no)[0] dn = create_delivery_note( item_code="_Test Serialized Item With Series", serial_no=serial_no) self.check_serial_no_values(serial_no, { "warehouse": "", "delivery_document_no": dn.name }) si = make_sales_invoice(dn.name) si.insert(ignore_permissions=True) self.assertEqual(dn.items[0].serial_no, si.items[0].serial_no) dn.cancel() self.check_serial_no_values(serial_no, { "warehouse": "_Test Warehouse - _TC", "delivery_document_no": "" })
def test_sales_return_for_non_bundled_items_partial(self): company = frappe.db.get_value('Warehouse', 'Stores - TCP1', 'company') make_stock_entry(item_code="_Test Item", target="Stores - TCP1", qty=50, basic_rate=100) actual_qty_0 = get_qty_after_transaction(warehouse="Stores - TCP1") dn = create_delivery_note(qty=5, rate=500, warehouse="Stores - TCP1", company=company, expense_account="Cost of Goods Sold - TCP1", cost_center="Main - TCP1") actual_qty_1 = get_qty_after_transaction(warehouse="Stores - TCP1") self.assertEqual(actual_qty_0 - 5, actual_qty_1) # outgoing_rate outgoing_rate = frappe.db.get_value("Stock Ledger Entry", { "voucher_type": "Delivery Note", "voucher_no": dn.name }, "stock_value_difference") / 5 # return entry dn1 = create_delivery_note(is_return=1, return_against=dn.name, qty=-2, rate=500, company=company, warehouse="Stores - TCP1", expense_account="Cost of Goods Sold - TCP1", cost_center="Main - TCP1", do_not_submit=1) dn1.items[0].dn_detail = dn.items[0].name dn1.submit() actual_qty_2 = get_qty_after_transaction(warehouse="Stores - TCP1") self.assertEqual(actual_qty_1 + 2, actual_qty_2) incoming_rate, stock_value_difference = frappe.db.get_value( "Stock Ledger Entry", { "voucher_type": "Delivery Note", "voucher_no": dn1.name }, ["incoming_rate", "stock_value_difference"]) self.assertEqual(flt(incoming_rate, 3), abs(flt(outgoing_rate, 3))) stock_in_hand_account = get_inventory_account(company, dn1.items[0].warehouse) gle_warehouse_amount = frappe.db.get_value( "GL Entry", { "voucher_type": "Delivery Note", "voucher_no": dn1.name, "account": stock_in_hand_account }, "debit") self.assertEqual(gle_warehouse_amount, stock_value_difference) # hack because new_doc isn't considering is_return portion of status_updater returned = frappe.get_doc("Delivery Note", dn1.name) returned.update_prevdoc_status() dn.load_from_db() # Check if Original DN updated self.assertEqual(dn.items[0].returned_qty, 2) self.assertEqual(dn.per_returned, 40) from erpbee.controllers.sales_and_purchase_return import make_return_doc return_dn_2 = make_return_doc("Delivery Note", dn.name) # Check if unreturned amount is mapped in 2nd return self.assertEqual(return_dn_2.items[0].qty, -3) si = make_sales_invoice(dn.name) si.submit() self.assertEqual(si.items[0].qty, 3) dn.load_from_db() # DN should be completed on billing all unreturned amount self.assertEqual(dn.items[0].billed_amt, 1500) self.assertEqual(dn.per_billed, 100) self.assertEqual(dn.status, 'Completed') si.load_from_db() si.cancel() dn.load_from_db() self.assertEqual(dn.per_billed, 0) dn1.cancel() dn.cancel()