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
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 } }
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)
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)
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)
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)
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()
def makeReturnReceipt(doc,method): make_return_doc("Purchase Receipt",doc)
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()