kg to g convertion fix in report

This commit is contained in:
raman 2025-11-05 09:44:02 +05:30
parent f6af6b3260
commit 5316a9a1cb
1 changed files with 88 additions and 104 deletions

View File

@ -22,102 +22,86 @@ class SamashtiDashboard(models.AbstractModel):
pc.name AS category, pc.name AS category,
uom.name AS uom, uom.name AS uom,
-- Current Cost (from Valuation Layer) -- Opening Stock: includes inventory adjustments before fromDate
COALESCE(( COALESCE(SUM(CASE
SELECT SUM(svl.value) / NULLIF(SUM(svl.quantity), 0) WHEN sm.date < {fromDate} AND sl_dest.usage = 'internal' THEN sm.product_uom_qty * (uom.factor /sm_uom.factor)
FROM stock_valuation_layer svl WHEN sm.date < {fromDate} AND sl_src.usage = 'internal' THEN -sm.product_uom_qty * (uom.factor /sm_uom.factor)
WHERE svl.product_id = pp.id WHEN sm.date < {fromDate} AND (sl_src.usage = 'inventory' OR sl_dest.usage = 'inventory') THEN sm.product_uom_qty * (uom.factor /sm_uom.factor)
), 0) AS current_cost,
-- Opening Stock (before start date)
COALESCE(SUM(
CASE
WHEN sml.create_date < {fromDate}
AND sl_dest.usage = 'internal' THEN sml.quantity
WHEN sml.create_date < {fromDate}
AND sl_src.usage = 'internal' THEN -sml.quantity
ELSE 0 ELSE 0
END END), 0) AS opening_stock,
), 0) AS opening_stock,
-- Receipts (Supplier Internal) -- Receipts: from supplier and inventory adjustments in date range
COALESCE(SUM( COALESCE(SUM(CASE
CASE WHEN sm.date BETWEEN {fromDate} AND {toDate}
WHEN sml.create_date BETWEEN {fromDate} AND {toDate}
AND sl_dest.usage = 'internal' AND sl_dest.usage = 'internal'
AND sl_src.usage in ('supplier', 'inventory') THEN sml.quantity AND sl_src.usage in ('supplier','inventory') THEN sm.product_uom_qty * (uom.factor /sm_uom.factor)
WHEN sm.date BETWEEN {fromDate} AND {toDate} AND (sl_src.usage = 'inventory' OR sl_dest.usage = 'inventory') THEN sm.product_uom_qty * (uom.factor /sm_uom.factor)
ELSE 0 ELSE 0
END END), 0) AS receipts,
), 0) AS receipts,
-- Production (Production Internal) -- Production: internal moves from production
COALESCE(SUM( COALESCE(SUM(CASE
CASE WHEN sm.date BETWEEN {fromDate} AND {toDate}
WHEN sml.create_date BETWEEN {fromDate} AND {toDate}
AND sl_dest.usage = 'internal' AND sl_dest.usage = 'internal'
AND sl_src.usage = 'production' THEN sml.quantity AND sl_src.usage = 'production' THEN sm.product_uom_qty * (uom.factor /sm_uom.factor)
ELSE 0 ELSE 0
END END), 0) AS production,
), 0) AS production,
-- Consumption (Internal Production) -- Consumption: internal moves to production
COALESCE(SUM( COALESCE(SUM(CASE
CASE WHEN sm.date BETWEEN {fromDate} AND {toDate}
WHEN sml.create_date BETWEEN {fromDate} AND {toDate}
AND sl_src.usage = 'internal' AND sl_src.usage = 'internal'
AND sl_dest.usage = 'production' THEN sml.quantity AND sl_dest.usage = 'production' THEN sm.product_uom_qty * (uom.factor /sm_uom.factor)
ELSE 0 ELSE 0
END END), 0) AS consumption,
), 0) AS consumption,
-- Dispatch (Internal Customer) -- Dispatch: internal moves to customer
COALESCE(SUM( COALESCE(SUM(CASE
CASE WHEN sm.date BETWEEN {fromDate} AND {toDate}
WHEN sml.create_date BETWEEN {fromDate} AND {toDate}
AND sl_src.usage = 'internal' AND sl_src.usage = 'internal'
AND sl_dest.usage = 'customer' THEN sml.quantity AND sl_dest.usage = 'customer' THEN sm.product_uom_qty * (uom.factor /sm_uom.factor)
ELSE 0 ELSE 0
END END), 0) AS dispatch,
), 0) AS dispatch,
-- Closing Stock = Opening + Receipts + Production - Consumption - Dispatch -- Closing Stock = Opening + Receipts + Production - Consumption - Dispatch + Inventory adjustments
( (
COALESCE(SUM( COALESCE(SUM(CASE
CASE WHEN sm.date < {fromDate} AND sl_dest.usage = 'internal' THEN sm.product_uom_qty * (uom.factor /sm_uom.factor)
WHEN sml.create_date < {fromDate} AND sl_dest.usage = 'internal' THEN sml.quantity WHEN sm.date < {fromDate} AND sl_src.usage = 'internal' THEN -sm.product_uom_qty * (uom.factor /sm_uom.factor)
WHEN sml.create_date < {fromDate} AND sl_src.usage = 'internal' THEN -sml.quantity WHEN sm.date < {fromDate} AND (sl_src.usage = 'inventory' OR sl_dest.usage = 'inventory') THEN sm.product_uom_qty * (uom.factor /sm_uom.factor)
WHEN sml.create_date BETWEEN {fromDate} AND {toDate} WHEN sm.date BETWEEN {fromDate} AND {toDate} AND sl_dest.usage = 'internal' AND sl_src.usage IN ('supplier', 'production') THEN sm.product_uom_qty * (uom.factor /sm_uom.factor)
AND sl_dest.usage = 'internal' AND sl_src.usage IN ('supplier', 'production') THEN sml.quantity WHEN sm.date BETWEEN {fromDate} AND {toDate} AND (sl_src.usage = 'inventory' OR sl_dest.usage = 'inventory') THEN sm.product_uom_qty * (uom.factor /sm_uom.factor)
WHEN sml.create_date BETWEEN {fromDate} AND {toDate} WHEN sm.date BETWEEN {fromDate} AND {toDate} AND sl_src.usage = 'internal' AND sl_dest.usage = 'production' THEN -sm.product_uom_qty * (uom.factor /sm_uom.factor)
AND sl_src.usage = 'internal' AND sl_dest.usage IN ('production', 'customer') THEN -sml.quantity WHEN sm.date BETWEEN {fromDate} AND {toDate} AND sl_src.usage = 'internal' AND sl_dest.usage = 'customer' THEN -sm.product_uom_qty * (uom.factor /sm_uom.factor)
ELSE 0 ELSE 0
END END), 0)
), 0)
) AS closing_stock ) AS closing_stock
FROM FROM
stock_move_line sml stock_move sm
JOIN JOIN
product_product pp ON sml.product_id = pp.id product_product pp ON sm.product_id = pp.id
JOIN JOIN
product_template pt ON pp.product_tmpl_id = pt.id product_template pt ON pp.product_tmpl_id = pt.id
JOIN JOIN
product_category pc ON pt.categ_id = pc.id product_category pc ON pt.categ_id = pc.id
JOIN JOIN
uom_uom uom ON pt.uom_id = uom.id uom_uom uom ON pt.uom_id = uom.id -- Product default UOM
JOIN JOIN
stock_location sl_src ON sml.location_id = sl_src.id uom_uom sm_uom ON sm.product_uom = sm_uom.id -- Stock move UOM
JOIN JOIN
stock_location sl_dest ON sml.location_dest_id = sl_dest.id stock_location sl_src ON sm.location_id = sl_src.id
JOIN
stock_location sl_dest ON sm.location_dest_id = sl_dest.id
WHERE WHERE
sml.state = 'done' sl_src.usage IN ('internal', 'supplier', 'production', 'customer', 'inventory') AND
AND pt.type IN ('product', 'consu') sl_dest.usage IN ('internal', 'supplier', 'production', 'customer', 'inventory') AND
AND sl_src.usage IN ('internal', 'supplier', 'production', 'customer','inventory') sm.state = 'done' AND
AND sl_dest.usage IN ('internal', 'supplier', 'production', 'customer', 'inventory') pt.type = 'consu'
GROUP BY GROUP BY
pp.default_code, pt.name, pc.name, uom.name, pp.id pp.default_code, pt.name, pc.name, uom.name
ORDER BY ORDER BY
pt.name; pt.name;