mirror of
https://github.com/frappe/erpnext.git
synced 2026-10-29 22:57:42 +00:00
fix(selling): account for returned deliveries in credit limits
This commit is contained in:
@@ -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 == ""]
|
||||
|
||||
Reference in New Issue
Block a user