fix(selling): account for returned deliveries in credit limits

This commit is contained in:
Poovetha
2026-10-27 10:50:22 +05:30
committed by pandiyan
parent ed59ce64f3
commit da0a92bb1e
+21 -5
View File
@@ -15,7 +15,7 @@ from frappe.model.mapper import get_mapped_doc
from frappe.model.naming import set_name_by_naming_series, set_name_from_naming_options
from frappe.model.utils.rename_doc import update_linked_doctypes
from frappe.query_builder import Criterion
from frappe.query_builder.functions import IfNull, Sum
from frappe.query_builder.functions import Coalesce, IfNull, Sum
from frappe.utils import cint, cstr, flt, get_formatted_email, get_link_to_form, today
from frappe.utils.deprecations import deprecated
from frappe.utils.user import get_users_with_role
@@ -708,15 +708,31 @@ def get_customer_outstanding(customer, company, ignore_outstanding_sales_order=F
SalesInvoice = frappe.qb.DocType("Sales Invoice")
SalesInvoiceItem = frappe.qb.DocType("Sales Invoice Item")
returned_items = (
frappe.qb.from_(DeliveryNoteItem)
.join(DeliveryNote)
.on(DeliveryNote.name == DeliveryNoteItem.parent)
.select(DeliveryNoteItem.name, DeliveryNoteItem.dn_detail)
.where(DeliveryNote.customer == customer)
.where(DeliveryNote.company == company)
.where(DeliveryNote.docstatus == 1)
.where(DeliveryNote.is_return == 1)
).as_("returned_items")
# Credits against a return delivery reduce the original delivery row's billed quantity.
billed_dn_detail = Coalesce(returned_items.dn_detail, SalesInvoiceItem.dn_detail)
si_subquery = (
frappe.qb.from_(SalesInvoiceItem)
.join(SalesInvoice)
.on(SalesInvoice.name == SalesInvoiceItem.parent)
.select(SalesInvoiceItem.dn_detail, Sum(SalesInvoiceItem.stock_qty).as_("billed_qty"))
.left_join(returned_items)
.on((returned_items.name == SalesInvoiceItem.dn_detail) & (SalesInvoice.is_return == 1))
.select(billed_dn_detail.as_("dn_detail"), Sum(SalesInvoiceItem.stock_qty).as_("billed_qty"))
.where(SalesInvoiceItem.docstatus == 1)
.where((SalesInvoice.is_return == 0) | (SalesInvoice.update_billed_amount_in_delivery_note == 1))
.groupby(SalesInvoiceItem.dn_detail)
.groupby(billed_dn_detail)
)
returned_qty = IfNull(DeliveryNoteItem.returned_qty, 0.0)
dn_query = (
frappe.qb.from_(DeliveryNote)
@@ -728,7 +744,7 @@ def get_customer_outstanding(customer, company, ignore_outstanding_sales_order=F
Sum(
(
DeliveryNoteItem.base_net_amount
* (DeliveryNoteItem.stock_qty - IfNull(si_subquery.billed_qty, 0.0))
* (DeliveryNoteItem.stock_qty - IfNull(si_subquery.billed_qty, 0.0) - returned_qty)
/ DeliveryNoteItem.stock_qty
/ DeliveryNote.base_net_total
)
@@ -740,7 +756,7 @@ def get_customer_outstanding(customer, company, ignore_outstanding_sales_order=F
.where(DeliveryNote.docstatus == 1)
.where(DeliveryNote.base_net_total > 0)
.where(DeliveryNote.status.notin(["Closed", "Stopped"]))
.where(DeliveryNoteItem.stock_qty > IfNull(si_subquery.billed_qty, 0.0))
.where(DeliveryNoteItem.stock_qty > IfNull(si_subquery.billed_qty, 0.0) + returned_qty)
.where(
Criterion.any(
[DeliveryNoteItem.against_sales_order.isnull(), DeliveryNoteItem.against_sales_order == ""]