Skip to content

Commit 5f77efc

Browse files
committed
Add Total Stock Value with Location Split documentation
1 parent ad5f56e commit 5f77efc

1 file changed

Lines changed: 141 additions & 0 deletions

File tree

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
2+
# Total Stock Value with Location Split - SSMM
3+
4+
> Product-wise stock balance and valuation at a location, split by incoming, outgoing (normal/error), and dispensed quantities
5+
6+
## Purpose
7+
8+
Computes stock per product for a selected location/date by combining completed incoming supplies, outgoing transfers (split into normal vs entered-in-error/consumption destinations), and medication dispenses. Also calculates total stock value using purchase price.
9+
10+
11+
## Parameters
12+
13+
| Parameter | Type | Description | Example |
14+
|-----------|------|-------------|---------|
15+
| `selected_date` | DATE | Snapshot cutoff date (includes all transactions up to this date) | `'2026-08-01'` |
16+
| `location_id` | INTEGER | Facility location id to compute stock for | `239` |
17+
18+
---
19+
20+
## Query
21+
22+
```sql
23+
SELECT
24+
REPLACE(epk.name, 'Internal Stock Update ', '') AS name,
25+
SUM(total) AS total,
26+
SUM(incoming_count) AS incoming_count,
27+
SUM(outgoing_normal_count) AS outgoing_normal_count,
28+
SUM(outgoing_error_count) AS outgoing_error_count,
29+
SUM(dispense_count) AS dispense_count,
30+
SUM(ep.purchase_price * total) AS total_price
31+
FROM (
32+
SELECT
33+
COALESCE(incoming.id, outgoing_normal.id, outgoing_error.id, dispenses.id) AS final_id,
34+
(COALESCE(incoming.count, 0) - COALESCE(outgoing_normal.count, 0) - COALESCE(outgoing_error.count, 0) - COALESCE(dispenses.count, 0)) AS total,
35+
incoming.count AS incoming_count,
36+
outgoing_normal.count AS outgoing_normal_count,
37+
outgoing_error.count AS outgoing_error_count,
38+
dispenses.count AS dispense_count
39+
FROM (
40+
SELECT id, SUM(count) AS count
41+
FROM (
42+
SELECT
43+
COALESCE(id_nn, COALESCE(id, id_n)) AS id,
44+
(COALESCE(count, 0) + COALESCE(count_n, 0) + COALESCE(count_nn, 0)) AS count
45+
FROM (
46+
SELECT ep.id AS id, SUM(supplied_item_quantity) AS count
47+
FROM emr_supplydelivery esd
48+
LEFT JOIN emr_deliveryorder edo ON esd.order_id = edo.id
49+
LEFT JOIN emr_inventoryitem eii ON esd.supplied_inventory_item_id = eii.id
50+
LEFT JOIN emr_product ep ON eii.product_id = ep.id
51+
WHERE esd.status = 'completed'
52+
AND esd.deleted = FALSE AND edo.deleted = FALSE
53+
AND DATE(esd.created_date) <= {{selected_date}}
54+
AND destination_id = {{location_id}}
55+
AND supplied_item_id IS NULL
56+
AND supplied_inventory_item_id IS NOT NULL
57+
GROUP BY ep.id
58+
) supplied_inventory_item_only
59+
FULL OUTER JOIN (
60+
SELECT supplied_item_id AS id_n, SUM(supplied_item_quantity) AS count_n
61+
FROM emr_supplydelivery esd
62+
LEFT JOIN emr_deliveryorder edo ON esd.order_id = edo.id
63+
WHERE esd.status = 'completed'
64+
AND esd.deleted = FALSE AND edo.deleted = FALSE
65+
AND DATE(esd.created_date) <= {{selected_date}}
66+
AND destination_id = {{location_id}}
67+
AND supplied_inventory_item_id IS NULL
68+
AND supplied_item_id IS NOT NULL
69+
GROUP BY supplied_item_id
70+
) supplied_item_only ON supplied_inventory_item_only.id = supplied_item_only.id_n
71+
FULL OUTER JOIN (
72+
SELECT supplied_item_id AS id_nn, SUM(supplied_item_quantity) AS count_nn
73+
FROM emr_supplydelivery esd
74+
LEFT JOIN emr_deliveryorder edo ON esd.order_id = edo.id
75+
WHERE supplied_inventory_item_id IS NOT NULL
76+
AND supplied_item_id IS NOT NULL
77+
AND esd.status = 'completed'
78+
AND esd.deleted = FALSE AND edo.deleted = FALSE
79+
AND DATE(esd.created_date) <= {{selected_date}}
80+
AND destination_id = {{location_id}}
81+
GROUP BY supplied_item_id
82+
) all_supplied_item ON all_supplied_item.id_nn = supplied_item_only.id_n
83+
) combined
84+
GROUP BY id
85+
) incoming
86+
87+
FULL OUTER JOIN (
88+
SELECT ep.id AS id, SUM(supplied_item_quantity) AS count
89+
FROM emr_supplydelivery esd
90+
LEFT JOIN emr_deliveryorder edo ON esd.order_id = edo.id
91+
LEFT JOIN emr_inventoryitem eii ON esd.supplied_inventory_item_id = eii.id
92+
LEFT JOIN emr_product ep ON eii.product_id = ep.id
93+
WHERE esd.status IN ('completed', 'in_progress')
94+
AND esd.deleted = FALSE AND edo.deleted = FALSE
95+
AND DATE(esd.created_date) <= {{selected_date}}
96+
AND origin_id = {{location_id}}
97+
AND destination_id NOT IN (264, 270, 280, 274, 273, 275, 276, 266, 279, 36, 265, 278, 297, 238, 298, 27, 481, 17, 32, 277)
98+
GROUP BY ep.id
99+
) outgoing_normal ON incoming.id = outgoing_normal.id
100+
101+
FULL OUTER JOIN (
102+
SELECT ep.id AS id, SUM(supplied_item_quantity) AS count
103+
FROM emr_supplydelivery esd
104+
LEFT JOIN emr_deliveryorder edo ON esd.order_id = edo.id
105+
LEFT JOIN emr_inventoryitem eii ON esd.supplied_inventory_item_id = eii.id
106+
LEFT JOIN emr_product ep ON eii.product_id = ep.id
107+
WHERE esd.status IN ('completed', 'in_progress')
108+
AND esd.deleted = FALSE AND edo.deleted = FALSE
109+
AND DATE(esd.created_date) <= {{selected_date}}
110+
AND origin_id = {{location_id}}
111+
AND destination_id IN (264, 270, 280, 274, 273, 275, 276, 266, 279, 36, 265, 278, 297, 238, 298, 27, 481, 17, 32, 277)
112+
GROUP BY ep.id
113+
) outgoing_error ON incoming.id = outgoing_error.id
114+
115+
FULL OUTER JOIN (
116+
SELECT ep.id AS id, SUM(emd.quantity) AS count
117+
FROM emr_medicationdispense emd
118+
LEFT JOIN emr_inventoryitem eii ON eii.id = emd.item_id
119+
LEFT JOIN emr_product ep ON eii.product_id = ep.id
120+
WHERE emd.status NOT IN ('cancelled', 'entered_in_error', 'stopped', 'declined')
121+
AND emd.deleted = FALSE
122+
AND DATE(emd.created_date) <= {{selected_date}}
123+
AND eii.location_id = {{location_id}}
124+
GROUP BY ep.id
125+
) dispenses ON dispenses.id = incoming.id
126+
127+
) total
128+
LEFT JOIN emr_product ep ON ep.id = total.final_id
129+
LEFT JOIN emr_productknowledge epk ON epk.id = ep.product_knowledge_id
130+
WHERE total.total > 0
131+
GROUP BY REPLACE(epk.name, 'Internal Stock Update ', '')
132+
ORDER BY SUM(total);
133+
```
134+
135+
## Notes
136+
137+
- Stock balance formula per item: `incoming - outgoing_normal - outgoing_error - dispensed`.
138+
- Filters to positive balance only (`WHERE total.total > 0`).
139+
- Both `selected_date` and `location_id` are required variables.
140+
141+
*Last updated: 2026-08-13*

0 commit comments

Comments
 (0)