def make_sales_return(source_name, target_doc=None):
	from erpnext.controllers.sales_and_purchase_return import make_return_doc
	return make_return_doc("Sales Invoice", source_name, target_doc)


# @frappe.whitelist()
# def set_cash_account(company):
# 	account = frappe.db.sql("""select name from `tabAccount` where account_type='Cash' and is_group=0 and company='%s'
# 		"""%(company),as_list=1,debug=1)
# 	return account
Example #2
0
def create_sales_return_invoice(sales_return, device, sales_invoice):
	""" make sales return """
	from frappe.utils import nowdate, nowtime
	from erpnext.controllers.sales_and_purchase_return import make_return_doc
	
	bill_no = sales_return.get("strBillNumber")
	try:
		doc = make_return_doc("Sales Invoice", sales_invoice, target_doc=None)

		# doc.posting_date = sales_return.get("date")
		doc.posting_date = nowdate()
		doc.posting_time = nowtime()
		items_to_return = { item.get("strProductCode"):item for item in sales_return.get("products") }
		
		to_remove = []
		for item in doc.items:
			# update item qty, rate and removed items that are not in sales return
			if item.item_code not in items_to_return.keys():
				to_remove.append(item)
			else:
				item.qty = items_to_return.get(item.item_code).get("strQty") * -1
				item.rate = items_to_return.get(item.item_code).get("dblMRP")

		if to_remove: [doc.remove(item) for item in to_remove]

		doc.owner = frappe.session.user
		doc.submit()

		return {
			bill_no: {
				"invStatus": 200,
				"message": "Sales Return Created",
				"strInvoiceDate": doc.creation,
				"strERPBillNumber": doc.name
			}
		}
	except Exception, e:
		return {
			bill_no: { 
				"invStatus": 500,
				"message": "Error while creating Invoice",
				"errors": e.message
			}
		}
Example #3
0
def make_sales_return(source_name, target_doc=None):
	from erpnext.controllers.sales_and_purchase_return import make_return_doc
	return make_return_doc("Sales Invoice", source_name, target_doc)
Example #4
0
def make_purchase_return(source_name, target_doc=None):
	from erpnext.controllers.sales_and_purchase_return import make_return_doc
	return make_return_doc("Purchase Receipt", source_name, target_doc)
Example #5
0
def make_sales_return(source_name, target_doc=None):
    from erpnext.controllers.sales_and_purchase_return import make_return_doc
    return make_return_doc("Delivery Note", source_name, target_doc)
Example #6
0
def make_purchase_return(source_name, target_doc=None):
    from erpnext.controllers.sales_and_purchase_return import make_return_doc
    return make_return_doc("Purchase Receipt", source_name, target_doc)
Example #7
0
def make_debit_note(source_name, target_doc=None):
	from erpnext.controllers.sales_and_purchase_return import make_return_doc
	return make_return_doc("Purchase Invoice", source_name, target_doc)
Example #8
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 erpnext.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()
Example #9
0
def makeReturnReceipt(doc,method):
	make_return_doc("Purchase Receipt",doc)
Example #10
0
    def test_purchase_return_partial(self):
        pr = make_purchase_receipt(company="_Test Company with perpetual inventory",
                                   warehouse="Stores - TCP1", supplier_warehouse="Work in Progress - TCP1")

        return_pr = make_purchase_receipt(company="_Test Company with perpetual inventory",
                                          warehouse="Stores - TCP1", supplier_warehouse="Work in Progress - TCP1",
                                          is_return=1, return_against=pr.name, qty=-2, do_not_submit=1)
        return_pr.items[0].purchase_receipt_item = pr.items[0].name
        return_pr.submit()

        # check sle
        outgoing_rate = frappe.db.get_value("Stock Ledger Entry", {"voucher_type": "Purchase Receipt",
                                                                   "voucher_no": return_pr.name}, "outgoing_rate")

        self.assertEqual(outgoing_rate, 50)

        # check gl entries for return
        gl_entries = get_gl_entries("Purchase Receipt", return_pr.name)

        self.assertTrue(gl_entries)
        stock_in_hand_account = get_inventory_account(return_pr.company)

        expected_values = {
            stock_in_hand_account: [0.0, 100.0],
            "Stock Received But Not Billed - TCP1": [100.0, 0.0],
        }

        for gle in gl_entries:
            self.assertEqual(expected_values[gle.account][0], gle.debit)
            self.assertEqual(expected_values[gle.account][1], gle.credit)

        # hack because new_doc isn't considering is_return portion of status_updater
        returned = frappe.get_doc("Purchase Receipt", return_pr.name)
        returned.update_prevdoc_status()
        pr.load_from_db()

        # Check if Original PR updated
        self.assertEqual(pr.items[0].returned_qty, 2)
        self.assertEqual(pr.per_returned, 40)

        from erpnext.controllers.sales_and_purchase_return import make_return_doc
        return_pr_2 = make_return_doc("Purchase Receipt", pr.name)

        # Check if unreturned amount is mapped in 2nd return
        self.assertEqual(return_pr_2.items[0].qty, -3)

        # Make PI against unreturned amount
        pi = make_purchase_invoice(pr.name)
        pi.submit()

        self.assertEqual(pi.items[0].qty, 3)

        pr.load_from_db()
        # PR should be completed on billing all unreturned amount
        self.assertEqual(pr.items[0].billed_amt, 150)
        self.assertEqual(pr.per_billed, 100)
        self.assertEqual(pr.status, 'Completed')

        pi.load_from_db()
        pi.cancel()

        pr.load_from_db()
        self.assertEqual(pr.per_billed, 0)

        return_pr.cancel()
        pr.cancel()