removed complications from sales purchase return
diff --git a/stock/doctype/stock_entry/stock_entry.py b/stock/doctype/stock_entry/stock_entry.py
index 131e9ff..edaf63b 100644
--- a/stock/doctype/stock_entry/stock_entry.py
+++ b/stock/doctype/stock_entry/stock_entry.py
@@ -279,7 +279,7 @@
def validate_return_reference_doc(self):
"""validate item with reference doc"""
- ref = get_return_reference_details(self.doc.fields)
+ ref = get_return_doclist_and_details(self.doc.fields)
if ref.doclist:
# validate docstatus
@@ -703,7 +703,7 @@
def query_return_item(doctype, txt, searchfield, start, page_len, filters):
txt = txt.replace("%", "")
- ref = get_return_reference_details(filters)
+ ref = get_return_doclist_and_details(filters)
stock_items = get_stock_items_for_return(ref.doclist, ref.parentfields)
@@ -737,7 +737,7 @@
return stock_items
-def get_return_reference_details(args):
+def get_return_doclist_and_details(args):
ref = webnotes._dict()
# get ref_doclist
@@ -768,7 +768,7 @@
if not se.doc.purpose in ["Sales Return", "Purchase Return"]:
return
- ref = get_return_reference_details(se.doc.fields)
+ ref = get_return_doclist_and_details(se.doc.fields)
if ref.doclist[0].doctype == "Delivery Note":
result = make_return_jv_from_delivery_note(se, ref)
@@ -794,8 +794,6 @@
"doctype": "Journal Voucher Detail",
"parentfield": "entries",
"account": r.get("account"),
- "debit": r.get("debit"),
- "credit": r.get("credit"),
"against_invoice": r.get("against_invoice"),
"against_voucher": r.get("against_voucher"),
"balance": get_balance_on(r.get("account"), se.doc.posting_date)
@@ -807,42 +805,32 @@
# customer account entry
parent = {
"account": ref.doclist[0].debit_to,
- "credit": 0.0,
"against_invoice": ref.doclist[0].name,
}
# income account entries
- children = {}
+ children = []
for se_item in se.doclist.get({"parentfield": "mtn_details"}):
# find item in ref.doclist
ref_item = ref.doclist.getone({"item_code": se_item.item_code})
- account, debit = get_sales_account_and_amount_from_item(ref.doclist, ref_item,
- se_item.transfer_qty)
+ account = get_sales_account_from_item(ref.doclist, ref_item)
if account not in children:
- children[account] = 0
- children[account] += debit
- parent["credit"] += debit
+ children.append(account)
- # find tax account and value and add corresponding rows
+ return [parent] + [{"account": account} for account in children]
- return [parent] + [{"account": account, "debit": debit} for account, debit in children.items()]
-
-def get_sales_account_and_amount_from_item(doclist, ref_item, transfer_qty):
- account = debit = None
+def get_sales_account_from_item(doclist, ref_item):
+ account = None
if not ref_item.income_account:
if ref_item.parent_item:
parent_item = doclist.getone({"item_code": ref_item.parent_item})
- packing_ratio = parent_item.qty / ref_item.qty
-
- debit = parent_item.basic_rate * transfer_qty * packing_ratio
account = parent_item.income_account
else:
- debit = ref_item.basic_rate * transfer_qty
account = ref_item.income_account
- return account, debit
+ return account
def make_return_jv_from_delivery_note(se, ref):
invoices_against_delivery = get_invoice_list("Sales Invoice Item", "delivery_note",
@@ -854,11 +842,14 @@
invoices_against_delivery = get_invoice_list("Sales Invoice Item", "sales_order",
sales_orders_against_delivery)
+
+ if not invoices_against_delivery:
+ return []
- against_invoice = {}
+ parent = {}
+ children = []
for se_item in se.doclist.get({"parentfield": "mtn_details"}):
- pending = se_item.transfer_qty
for sales_invoice in invoices_against_delivery:
si = webnotes.bean("Sales Invoice", sales_invoice)
si.run_method("make_packing_list")
@@ -866,44 +857,24 @@
if not ref_item:
continue
-
+
ref_item = ref_item[0]
- if ref_item.qty < pending:
- transfer_qty = ref_item.qty
- pending -= ref_item.qty
- else:
- transfer_qty = pending
- pending = 0
+ account = get_sales_account_from_item(si.doclist, ref_item)
- account, debit = get_sales_account_and_amount_from_item(si.doclist, ref_item,
- transfer_qty)
-
- if si.doclist[0].name not in against_invoice:
- against_invoice[sales_invoice] = {
- "parent": {"account": si.doclist[0].debit_to, "credit": 0},
- "children": {}
- }
-
- against_invoice[sales_invoice]["parent"]["credit"] += debit
+ if account not in children:
+ children.append(account)
- if account not in against_invoice[sales_invoice]["children"]:
- against_invoice[sales_invoice]["children"][account] = 0
+ if not parent:
+ parent = {"account": si.doc.debit_to}
+
+ break
- against_invoice[sales_invoice]["children"][account] += debit
-
- # find tax account and value and add corresponding rows
-
- if pending <= 0:
- break
+ if len(invoices_against_delivery) == 1:
+ parent["against_invoice"] = invoices_against_delivery[0]
- result = []
- for sales_invoice, opts in against_invoice.items():
- parent = opts["parent"]
- parent.update({"against_invoice": sales_invoice})
- children = [{"account": account, "debit": debit}
- for account, debit in opts["children"].items()]
- result += [parent] + children
+ result = [parent] + [{"account": account} for account in children]
+
return result
def get_invoice_list(doctype, link_field, value):
@@ -925,53 +896,36 @@
invoice_against_receipt = get_invoice_list("Purchase Invoice Item", "purchase_order",
purchase_orders_against_receipt)
- against_voucher = {}
+ if not invoice_against_receipt:
+ return []
+
+ parent = {}
+ children = []
for se_item in se.doclist.get({"parentfield": "mtn_details"}):
- pending = se_item.transfer_qty
for purchase_invoice in invoice_against_receipt:
pi = webnotes.bean("Purchase Invoice", purchase_invoice)
ref_item = pi.doclist.get({"item_code": se_item.item_code})
if not ref_item:
continue
-
+
ref_item = ref_item[0]
- if ref_item.qty < pending:
- transfer_qty = ref_item.qty
- pending -= ref_item.qty
- else:
- transfer_qty = pending
- pending = 0
-
- credit = ref_item.rate * transfer_qty
account = ref_item.expense_head
- if pi.doclist[0].name not in against_voucher:
- against_voucher[purchase_invoice] = {
- "parent": {"account": pi.doclist[0].credit_to, "debit": 0},
- "children": {}
- }
+ if account not in children:
+ children.append(account)
- against_voucher[purchase_invoice]["parent"]["debit"] += credit
+ if not parent:
+ parent = {"account": pi.doc.credit_to}
- if account not in against_voucher[purchase_invoice]["children"]:
- against_voucher[purchase_invoice]["children"][account] = 0
-
- against_voucher[purchase_invoice]["children"][account] += credit
+ break
- # find tax account and value and add corresponding rows
-
- if pending <= 0:
- break
+ if len(invoice_against_receipt) == 1:
+ parent["against_voucher"] = invoice_against_receipt[0]
- result = []
- for purchase_invoice, opts in against_voucher.items():
- parent = opts["parent"]
- parent.update({"against_voucher": purchase_invoice})
- children = [{"account": account, "credit": credit}
- for account, credit in opts["children"].items()]
- result += [parent] + children
+ result = [parent] + [{"account": account} for account in children]
+
return result
\ No newline at end of file
diff --git a/stock/doctype/stock_entry/test_stock_entry.py b/stock/doctype/stock_entry/test_stock_entry.py
index 049b0e6..322fcfa 100644
--- a/stock/doctype/stock_entry/test_stock_entry.py
+++ b/stock/doctype/stock_entry/test_stock_entry.py
@@ -309,7 +309,7 @@
def test_delivery_note_return_of_packing_item(self):
self._test_delivery_note_return("_Test Sales BOM Item", 25, 20)
- def _test_sales_return_jv(self, se, returned_value):
+ def _test_sales_return_jv(self, se):
from stock.doctype.stock_entry.stock_entry import make_return_jv
jv_list = make_return_jv(se.doc.name)
@@ -320,35 +320,27 @@
self.assertEqual(jv_list[2].get("account"), "Sales - _TC")
self.assertTrue(jv_list[1].get("against_invoice"))
- # debit == credit
- debit = sum([flt(d.get("debit")) for d in jv_list])
- credit = sum([flt(d.get("credit")) for d in jv_list])
- self.assertEqual(debit, credit)
-
- # validate value of debit
- self.assertEqual(debit, returned_value)
-
def test_make_return_jv_for_sales_invoice_non_packing_item(self):
se = self._test_sales_invoice_return("_Test Item", 5, 2)
- self._test_sales_return_jv(se, 1000)
+ self._test_sales_return_jv(se)
def test_make_return_jv_for_sales_invoice_packing_item(self):
se = self._test_sales_invoice_return("_Test Sales BOM Item", 25, 20)
- self._test_sales_return_jv(se, 2000)
+ self._test_sales_return_jv(se)
def test_make_return_jv_for_delivery_note_non_packing_item(self):
se = self._test_delivery_note_return("_Test Item", 5, 2)
- self._test_sales_return_jv(se, 200)
+ self._test_sales_return_jv(se)
se = self._test_delivery_note_return_against_sales_order("_Test Item", 5, 2)
- self._test_sales_return_jv(se, 200)
+ self._test_sales_return_jv(se)
def test_make_return_jv_for_delivery_note_packing_item(self):
se = self._test_delivery_note_return("_Test Sales BOM Item", 25, 20)
- self._test_sales_return_jv(se, 400)
+ self._test_sales_return_jv(se)
se = self._test_delivery_note_return_against_sales_order("_Test Sales BOM Item", 25, 20)
- self._test_sales_return_jv(se, 400)
+ self._test_sales_return_jv(se)
def _test_delivery_note_return_against_sales_order(self, item_code, delivered_qty, returned_qty):
self._insert_material_receipt()
@@ -477,7 +469,7 @@
self.assertRaises(StockOverReturnError, se.insert)
- def _test_purchase_return_jv(self, se, returned_value):
+ def _test_purchase_return_jv(self, se):
from stock.doctype.stock_entry.stock_entry import make_return_jv
jv_list = make_return_jv(se.doc.name)
@@ -488,20 +480,12 @@
self.assertEqual(jv_list[2].get("account"), "_Test Account Cost for Goods Sold - _TC")
self.assertTrue(jv_list[1].get("against_voucher"))
- # debit == credit
- debit = sum([flt(d.get("debit")) for d in jv_list])
- credit = sum([flt(d.get("credit")) for d in jv_list])
- self.assertEqual(debit, credit)
-
- # validate value of credit
- self.assertEqual(credit, returned_value)
-
def test_make_return_jv_for_purchase_receipt(self):
se, pr_name = self.test_purchase_receipt_return()
- self._test_purchase_return_jv(se, 250)
+ self._test_purchase_return_jv(se)
se, pr_name = self._test_purchase_return_return_against_purchase_order()
- self._test_purchase_return_jv(se, 250)
+ self._test_purchase_return_jv(se)
def _test_purchase_return_return_against_purchase_order(self):
self._clear_stock()