fix: updated packed_items getting fetched on Sales Return / Credit Note (#28607)
* fix: updated packed_items getting fetched on sales return * fix: updated test cases for product bundle returns * fix: moved calculate_mapped_packed_items_return to stock.utils * fix: updated packed_items getting fetched on Return/Credit Note * refactor: change var name to avoid `self` * fix: check item code before assigning parent item Co-authored-by: Ankush Menat <ankush@frappe.io>
This commit is contained in:
parent
cce35c1536
commit
20216fa9f1
@ -43,6 +43,7 @@ from erpnext.setup.doctype.company.company import update_company_current_month_s
|
|||||||
from erpnext.stock.doctype.batch.batch import set_batch_nos
|
from erpnext.stock.doctype.batch.batch import set_batch_nos
|
||||||
from erpnext.stock.doctype.delivery_note.delivery_note import update_billed_amount_based_on_so
|
from erpnext.stock.doctype.delivery_note.delivery_note import update_billed_amount_based_on_so
|
||||||
from erpnext.stock.doctype.serial_no.serial_no import get_delivery_note_serial_no, get_serial_nos
|
from erpnext.stock.doctype.serial_no.serial_no import get_delivery_note_serial_no, get_serial_nos
|
||||||
|
from erpnext.stock.utils import calculate_mapped_packed_items_return
|
||||||
|
|
||||||
form_grid_templates = {
|
form_grid_templates = {
|
||||||
"items": "templates/form_grid/item_grid.html"
|
"items": "templates/form_grid/item_grid.html"
|
||||||
@ -728,6 +729,9 @@ class SalesInvoice(SellingController):
|
|||||||
|
|
||||||
def update_packing_list(self):
|
def update_packing_list(self):
|
||||||
if cint(self.update_stock) == 1:
|
if cint(self.update_stock) == 1:
|
||||||
|
if cint(self.is_return) and self.return_against:
|
||||||
|
calculate_mapped_packed_items_return(self)
|
||||||
|
else:
|
||||||
from erpnext.stock.doctype.packed_item.packed_item import make_packing_list
|
from erpnext.stock.doctype.packed_item.packed_item import make_packing_list
|
||||||
make_packing_list(self)
|
make_packing_list(self)
|
||||||
else:
|
else:
|
||||||
|
@ -14,6 +14,7 @@ from erpnext.controllers.accounts_controller import get_taxes_and_charges
|
|||||||
from erpnext.controllers.selling_controller import SellingController
|
from erpnext.controllers.selling_controller import SellingController
|
||||||
from erpnext.stock.doctype.batch.batch import set_batch_nos
|
from erpnext.stock.doctype.batch.batch import set_batch_nos
|
||||||
from erpnext.stock.doctype.serial_no.serial_no import get_delivery_note_serial_no
|
from erpnext.stock.doctype.serial_no.serial_no import get_delivery_note_serial_no
|
||||||
|
from erpnext.stock.utils import calculate_mapped_packed_items_return
|
||||||
|
|
||||||
form_grid_templates = {
|
form_grid_templates = {
|
||||||
"items": "templates/form_grid/item_grid.html"
|
"items": "templates/form_grid/item_grid.html"
|
||||||
@ -128,6 +129,10 @@ class DeliveryNote(SellingController):
|
|||||||
self.validate_uom_is_integer("uom", "qty")
|
self.validate_uom_is_integer("uom", "qty")
|
||||||
self.validate_with_previous_doc()
|
self.validate_with_previous_doc()
|
||||||
|
|
||||||
|
# Keeps mapped packed_items in case product bundle is updated.
|
||||||
|
if self.is_return and self.return_against:
|
||||||
|
calculate_mapped_packed_items_return(self)
|
||||||
|
else:
|
||||||
from erpnext.stock.doctype.packed_item.packed_item import make_packing_list
|
from erpnext.stock.doctype.packed_item.packed_item import make_packing_list
|
||||||
make_packing_list(self)
|
make_packing_list(self)
|
||||||
|
|
||||||
|
@ -386,8 +386,7 @@ class TestDeliveryNote(ERPNextTestCase):
|
|||||||
self.assertEqual(actual_qty, 25)
|
self.assertEqual(actual_qty, 25)
|
||||||
|
|
||||||
# return bundled item
|
# return bundled item
|
||||||
dn1 = create_delivery_note(item_code='_Test Product Bundle Item', is_return=1,
|
dn1 = create_return_delivery_note(source_name=dn.name, rate=500, qty=-2)
|
||||||
return_against=dn.name, qty=-2, rate=500, company=company, warehouse="Stores - TCP1", expense_account="Cost of Goods Sold - TCP1", cost_center="Main - TCP1")
|
|
||||||
|
|
||||||
# qty after return
|
# qty after return
|
||||||
actual_qty = get_qty_after_transaction(warehouse="Stores - TCP1")
|
actual_qty = get_qty_after_transaction(warehouse="Stores - TCP1")
|
||||||
@ -823,6 +822,15 @@ class TestDeliveryNote(ERPNextTestCase):
|
|||||||
|
|
||||||
automatically_fetch_payment_terms(enable=0)
|
automatically_fetch_payment_terms(enable=0)
|
||||||
|
|
||||||
|
def create_return_delivery_note(**args):
|
||||||
|
args = frappe._dict(args)
|
||||||
|
from erpnext.controllers.sales_and_purchase_return import make_return_doc
|
||||||
|
doc = make_return_doc("Delivery Note", args.source_name, None)
|
||||||
|
doc.items[0].rate = args.rate
|
||||||
|
doc.items[0].qty = args.qty
|
||||||
|
doc.submit()
|
||||||
|
return doc
|
||||||
|
|
||||||
def create_delivery_note(**args):
|
def create_delivery_note(**args):
|
||||||
dn = frappe.new_doc("Delivery Note")
|
dn = frappe.new_doc("Delivery Note")
|
||||||
args = frappe._dict(args)
|
args = frappe._dict(args)
|
||||||
|
@ -5,7 +5,10 @@ import frappe
|
|||||||
from frappe.core.page.permission_manager.permission_manager import reset
|
from frappe.core.page.permission_manager.permission_manager import reset
|
||||||
from frappe.utils import add_days, today
|
from frappe.utils import add_days, today
|
||||||
|
|
||||||
from erpnext.stock.doctype.delivery_note.test_delivery_note import create_delivery_note
|
from erpnext.stock.doctype.delivery_note.test_delivery_note import (
|
||||||
|
create_delivery_note,
|
||||||
|
create_return_delivery_note,
|
||||||
|
)
|
||||||
from erpnext.stock.doctype.item.test_item import make_item
|
from erpnext.stock.doctype.item.test_item import make_item
|
||||||
from erpnext.stock.doctype.landed_cost_voucher.test_landed_cost_voucher import (
|
from erpnext.stock.doctype.landed_cost_voucher.test_landed_cost_voucher import (
|
||||||
create_landed_cost_voucher,
|
create_landed_cost_voucher,
|
||||||
@ -232,8 +235,7 @@ class TestStockLedgerEntry(ERPNextTestCase):
|
|||||||
self.assertEqual(outgoing_rate, 100)
|
self.assertEqual(outgoing_rate, 100)
|
||||||
|
|
||||||
# Return Entry: Qty = -2, Rate = 150
|
# Return Entry: Qty = -2, Rate = 150
|
||||||
return_dn = create_delivery_note(is_return=1, return_against=dn.name, item_code=bundled_item, qty=-2, rate=150,
|
return_dn = create_return_delivery_note(source_name=dn.name, rate=150, qty=-2)
|
||||||
company=company, warehouse="Stores - _TC", expense_account="Cost of Goods Sold - _TC", cost_center="Main - _TC")
|
|
||||||
|
|
||||||
# check incoming rate for Return entry
|
# check incoming rate for Return entry
|
||||||
incoming_rate, stock_value_difference = frappe.db.get_value("Stock Ledger Entry",
|
incoming_rate, stock_value_difference = frappe.db.get_value("Stock Ledger Entry",
|
||||||
|
@ -419,6 +419,19 @@ def is_reposting_item_valuation_in_progress():
|
|||||||
if reposting_in_progress:
|
if reposting_in_progress:
|
||||||
frappe.msgprint(_("Item valuation reposting in progress. Report might show incorrect item valuation."), alert=1)
|
frappe.msgprint(_("Item valuation reposting in progress. Report might show incorrect item valuation."), alert=1)
|
||||||
|
|
||||||
|
|
||||||
|
def calculate_mapped_packed_items_return(return_doc):
|
||||||
|
parent_items = set([item.parent_item for item in return_doc.packed_items])
|
||||||
|
against_doc = frappe.get_doc(return_doc.doctype, return_doc.return_against)
|
||||||
|
|
||||||
|
for original_bundle, returned_bundle in zip(against_doc.items, return_doc.items):
|
||||||
|
if original_bundle.item_code in parent_items:
|
||||||
|
for returned_packed_item, original_packed_item in zip(return_doc.packed_items, against_doc.packed_items):
|
||||||
|
if returned_packed_item.parent_item == original_bundle.item_code:
|
||||||
|
returned_packed_item.parent_detail_docname = returned_bundle.name
|
||||||
|
returned_packed_item.qty = (original_packed_item.qty / original_bundle.qty) * returned_bundle.qty
|
||||||
|
|
||||||
|
|
||||||
def check_pending_reposting(posting_date: str, throw_error: bool = True) -> bool:
|
def check_pending_reposting(posting_date: str, throw_error: bool = True) -> bool:
|
||||||
"""Check if there are pending reposting job till the specified posting date."""
|
"""Check if there are pending reposting job till the specified posting date."""
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user