Merge pull request #43448 from rohitwaghchaure/fixed-support-22814
fix: last purchase rate for purchase invoice
This commit is contained in:
@@ -2371,6 +2371,24 @@ class TestPurchaseInvoice(FrappeTestCase, StockTestMixin):
|
|||||||
self.assertEqual(len(actual), 3)
|
self.assertEqual(len(actual), 3)
|
||||||
self.assertEqual(expected, actual)
|
self.assertEqual(expected, actual)
|
||||||
|
|
||||||
|
def test_last_purchase_rate(self):
|
||||||
|
item = create_item("_Test Item For Last Purchase Rate from PI", is_stock_item=1)
|
||||||
|
pi1 = make_purchase_invoice(item_code=item.item_code, qty=10, rate=100)
|
||||||
|
item.reload()
|
||||||
|
self.assertEqual(item.last_purchase_rate, 100)
|
||||||
|
|
||||||
|
pi2 = make_purchase_invoice(item_code=item.item_code, qty=10, rate=200)
|
||||||
|
item.reload()
|
||||||
|
self.assertEqual(item.last_purchase_rate, 200)
|
||||||
|
|
||||||
|
pi2.cancel()
|
||||||
|
item.reload()
|
||||||
|
self.assertEqual(item.last_purchase_rate, 100)
|
||||||
|
|
||||||
|
pi1.cancel()
|
||||||
|
item.reload()
|
||||||
|
self.assertEqual(item.last_purchase_rate, 0)
|
||||||
|
|
||||||
|
|
||||||
def set_advance_flag(company, flag, default_account):
|
def set_advance_flag(company, flag, default_account):
|
||||||
frappe.db.set_value(
|
frappe.db.set_value(
|
||||||
|
|||||||
@@ -702,9 +702,11 @@ class BuyingController(SubcontractingController):
|
|||||||
if self.get("is_return"):
|
if self.get("is_return"):
|
||||||
return
|
return
|
||||||
|
|
||||||
if self.doctype in ["Purchase Order", "Purchase Receipt"] and not frappe.db.get_single_value(
|
if self.doctype in [
|
||||||
"Buying Settings", "disable_last_purchase_rate"
|
"Purchase Order",
|
||||||
):
|
"Purchase Receipt",
|
||||||
|
"Purchase Invoice",
|
||||||
|
] and not frappe.db.get_single_value("Buying Settings", "disable_last_purchase_rate"):
|
||||||
update_last_purchase_rate(self, is_submit=0)
|
update_last_purchase_rate(self, is_submit=0)
|
||||||
|
|
||||||
if self.doctype in ["Purchase Receipt", "Purchase Invoice"]:
|
if self.doctype in ["Purchase Receipt", "Purchase Invoice"]:
|
||||||
|
|||||||
@@ -1287,6 +1287,10 @@ erpnext.TransactionController = class TransactionController extends erpnext.taxe
|
|||||||
.filter(Boolean).length > 0;
|
.filter(Boolean).length > 0;
|
||||||
} else if (this.frm.doc?.items) {
|
} else if (this.frm.doc?.items) {
|
||||||
let first_row = this.frm.doc.items[0];
|
let first_row = this.frm.doc.items[0];
|
||||||
|
if (!first_row) {
|
||||||
|
return false
|
||||||
|
};
|
||||||
|
|
||||||
let mapped_rows = mappped_fields.filter(d => first_row[d])
|
let mapped_rows = mappped_fields.filter(d => first_row[d])
|
||||||
|
|
||||||
return mapped_rows?.length > 0;
|
return mapped_rows?.length > 0;
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ from frappe.utils import (
|
|||||||
strip_html,
|
strip_html,
|
||||||
)
|
)
|
||||||
from frappe.utils.html_utils import clean_html
|
from frappe.utils.html_utils import clean_html
|
||||||
|
from pypika import Order
|
||||||
|
|
||||||
import erpnext
|
import erpnext
|
||||||
from erpnext.controllers.item_variant import (
|
from erpnext.controllers.item_variant import (
|
||||||
@@ -1139,34 +1140,10 @@ def get_last_purchase_details(item_code, doc_name=None, conversion_rate=1.0):
|
|||||||
"""returns last purchase details in stock uom"""
|
"""returns last purchase details in stock uom"""
|
||||||
# get last purchase order item details
|
# get last purchase order item details
|
||||||
|
|
||||||
last_purchase_order = frappe.db.sql(
|
last_purchase_order = get_purchase_voucher_details("Purchase Order", item_code, doc_name)
|
||||||
"""\
|
|
||||||
select po.name, po.transaction_date, po.conversion_rate,
|
|
||||||
po_item.conversion_factor, po_item.base_price_list_rate,
|
|
||||||
po_item.discount_percentage, po_item.base_rate, po_item.base_net_rate
|
|
||||||
from `tabPurchase Order` po, `tabPurchase Order Item` po_item
|
|
||||||
where po.docstatus = 1 and po_item.item_code = %s and po.name != %s and
|
|
||||||
po.name = po_item.parent
|
|
||||||
order by po.transaction_date desc, po.name desc
|
|
||||||
limit 1""",
|
|
||||||
(item_code, cstr(doc_name)),
|
|
||||||
as_dict=1,
|
|
||||||
)
|
|
||||||
|
|
||||||
# get last purchase receipt item details
|
# get last purchase receipt item details
|
||||||
last_purchase_receipt = frappe.db.sql(
|
last_purchase_receipt = get_purchase_voucher_details("Purchase Receipt", item_code, doc_name)
|
||||||
"""\
|
|
||||||
select pr.name, pr.posting_date, pr.posting_time, pr.conversion_rate,
|
|
||||||
pr_item.conversion_factor, pr_item.base_price_list_rate, pr_item.discount_percentage,
|
|
||||||
pr_item.base_rate, pr_item.base_net_rate
|
|
||||||
from `tabPurchase Receipt` pr, `tabPurchase Receipt Item` pr_item
|
|
||||||
where pr.docstatus = 1 and pr_item.item_code = %s and pr.name != %s and
|
|
||||||
pr.name = pr_item.parent
|
|
||||||
order by pr.posting_date desc, pr.posting_time desc, pr.name desc
|
|
||||||
limit 1""",
|
|
||||||
(item_code, cstr(doc_name)),
|
|
||||||
as_dict=1,
|
|
||||||
)
|
|
||||||
|
|
||||||
purchase_order_date = getdate(
|
purchase_order_date = getdate(
|
||||||
last_purchase_order and last_purchase_order[0].transaction_date or "1900-01-01"
|
last_purchase_order and last_purchase_order[0].transaction_date or "1900-01-01"
|
||||||
@@ -1187,7 +1164,13 @@ def get_last_purchase_details(item_code, doc_name=None, conversion_rate=1.0):
|
|||||||
purchase_date = purchase_receipt_date
|
purchase_date = purchase_receipt_date
|
||||||
|
|
||||||
else:
|
else:
|
||||||
return frappe._dict()
|
last_purchase_invoice = get_purchase_voucher_details("Purchase Invoice", item_code, doc_name)
|
||||||
|
|
||||||
|
if last_purchase_invoice:
|
||||||
|
last_purchase = last_purchase_invoice[0]
|
||||||
|
purchase_date = getdate(last_purchase.posting_date)
|
||||||
|
else:
|
||||||
|
return frappe._dict()
|
||||||
|
|
||||||
conversion_factor = flt(last_purchase.conversion_factor)
|
conversion_factor = flt(last_purchase.conversion_factor)
|
||||||
out = frappe._dict(
|
out = frappe._dict(
|
||||||
@@ -1213,6 +1196,40 @@ def get_last_purchase_details(item_code, doc_name=None, conversion_rate=1.0):
|
|||||||
return out
|
return out
|
||||||
|
|
||||||
|
|
||||||
|
def get_purchase_voucher_details(doctype, item_code, document_name):
|
||||||
|
parent_doc = frappe.qb.DocType(doctype)
|
||||||
|
child_doc = frappe.qb.DocType(doctype + " Item")
|
||||||
|
|
||||||
|
query = (
|
||||||
|
frappe.qb.from_(parent_doc)
|
||||||
|
.inner_join(child_doc)
|
||||||
|
.on(parent_doc.name == child_doc.parent)
|
||||||
|
.select(
|
||||||
|
parent_doc.name,
|
||||||
|
parent_doc.conversion_rate,
|
||||||
|
child_doc.conversion_factor,
|
||||||
|
child_doc.base_price_list_rate,
|
||||||
|
child_doc.discount_percentage,
|
||||||
|
child_doc.base_rate,
|
||||||
|
child_doc.base_net_rate,
|
||||||
|
)
|
||||||
|
.where(parent_doc.docstatus == 1)
|
||||||
|
.where(child_doc.item_code == item_code)
|
||||||
|
.where(parent_doc.name != document_name)
|
||||||
|
)
|
||||||
|
|
||||||
|
if doctype in ("Purchase Receipt", "Purchase Invoice"):
|
||||||
|
query = query.select(parent_doc.posting_date, parent_doc.posting_time)
|
||||||
|
query = query.orderby(
|
||||||
|
parent_doc.posting_date, parent_doc.posting_time, parent_doc.name, order=Order.desc
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
query = query.select(parent_doc.transaction_date)
|
||||||
|
query = query.orderby(parent_doc.transaction_date, parent_doc.name, order=Order.desc)
|
||||||
|
|
||||||
|
return query.run(as_dict=1)
|
||||||
|
|
||||||
|
|
||||||
def check_stock_uom_with_bin(item, stock_uom):
|
def check_stock_uom_with_bin(item, stock_uom):
|
||||||
if stock_uom == frappe.db.get_value("Item", item, "stock_uom"):
|
if stock_uom == frappe.db.get_value("Item", item, "stock_uom"):
|
||||||
return
|
return
|
||||||
|
|||||||
Reference in New Issue
Block a user