Esempio n. 1
0
    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)
Esempio n. 2
0
    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)))
Esempio n. 3
0
    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)
Esempio n. 4
0
    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")
Esempio n. 5
0
    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)
Esempio n. 6
0
    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")
Esempio n. 7
0
    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")
Esempio n. 8
0
    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": ""
        })
Esempio n. 9
0
    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()