SELECT
`Customer Name`,
`Sales Order Date`,
`Sales Order No`,
`Item Code`,
FORMAT(`Qty`, 2) AS `Qty`,
FORMAT(`Delivered Qty`, 2) AS `Delivered Qty`,
FORMAT(`Pending Qty`, 2) AS `Pending Qty`
FROM (
-- Main sales order data
SELECT
so.customer AS `Customer Name`,
so.transaction_date AS `Sales Order Date`,
so.name AS `Sales Order No`,
so_item.item_code AS `Item Code`,
so_item.qty AS `Qty`,
IFNULL(so_item.delivered_qty, 0) AS `Delivered Qty`,
(so_item.qty - IFNULL(so_item.delivered_qty, 0)) AS `Pending Qty`,
0 AS sort_order
FROM
`tabSales Order` so
JOIN
`tabSales Order Item` so_item ON so.name = so_item.parent
WHERE
so.company = 'Cotton Craft Pvt Ltd'
AND so.docstatus != 2 -- Exclude cancelled sales orders
AND (%(from_date)s IS NULL OR so.transaction_date >= %(from_date)s)
AND (%(to_date)s IS NULL OR so.transaction_date <= %(to_date)s)
AND (so_item.qty - IFNULL(so_item.delivered_qty, 0)) > 0 -- Exclude rows where Pending Qty = 0
UNION ALL
-- Placeholder rows for customer grouping
SELECT
so.customer AS `Customer Name`,
NULL AS `Sales Order Date`,
NULL AS `Sales Order No`,
NULL AS `Item Code`,
NULL AS `Qty`,
NULL AS `Delivered Qty`,
NULL AS `Pending Qty`,
1 AS sort_order
FROM
`tabSales Order` so
WHERE
so.company = 'Cotton Craft Pvt Ltd'
AND so.docstatus != 2 -- Exclude cancelled sales orders
AND (%(from_date)s IS NULL OR so.transaction_date >= %(from_date)s)
AND (%(to_date)s IS NULL OR so.transaction_date <= %(to_date)s)
AND EXISTS ( -- Only include customers that have at least one pending item
SELECT 1 FROM `tabSales Order Item` soi
WHERE soi.parent = so.name
AND (soi.qty - IFNULL(soi.delivered_qty, 0)) > 0
)
GROUP BY
so.customer
) grouped_data
ORDER BY
`Customer Name`, sort_order, `Sales Order Date`, `Sales Order No`, `Item Code`;
Comments