-- fsn where clause.
-- qty >=? 0
WITH
fsn AS (
-- Get list of fsn wms barcodes
SELECT
ip.pbarcode,
ip.id_partner,
il.barcode AS wms_barcode,
FROM `noondwh.wms.item` i
JOIN `noondwh.wms.item_lot` il ON (il.id_item_lot = i.id AND i.id_item_kind = 1)
JOIN `noondwh.wms.item` ii ON (ii.id_item = il.id_item_inner)
JOIN `noondwh.wms.item_pbarcode` ip ON (ip.id_item_pbarcode = ii.id AND ii.id_item_kind = 6)
-- https://github.com/fastfishio/sc-wms-api/blob/a0c27fbacc4c50b6cf4c1e528bc8b600f4f9bd09/src/libutil/util.py#L22
WHERE REGEXP_CONTAINS(il.barcode, r'1[0-9]{8,}LS')
),
warehouse_pbarcodes AS (
SELECT
w.code AS wh_code, -- Warehouse code
ip.pbarcode AS pbarcode, -- Pbarcode/GTIN
ANY_VALUE(IF(ip.id_partner = m.id_partner, ip.id_partner, NULL)) AS pri_id, -- Primary partner id (if any)
SUM(IF(ip.id_partner = m.id_partner, qty, 0)) AS pri_qty, -- Primary partner qty (if any)
ARRAY_AGG(DISTINCT IF(ip.id_partner = m.id_partner, NULL, ip.id_partner) IGNORE NULLS) AS sec_ids, -- Secondary partner(s) ids
COUNT(DISTINCT IF(ip.id_partner = m.id_partner, NULL, ip.id_partner)) AS sec_count, -- Secondary partner(s) count
SUM(IF(ip.id_partner = m.id_partner, 0, qty)) AS sec_qty, -- Secondary partner(s) qty
-- Pbarcodes with ANY fsn wms barcodes, under ANY partner (to unmap)
-- To avoid accidental scanning of pbarcode/gtin for an FSN serialized item.
ip.pbarcode IN (SELECT pbarcode FROM fsn) AS has_fsn,
-- PBarcodes with ANY offer price above -country specific- threshold (to unmap)
-- To avoid accidental scanning of pbarcode/gtin for a high value item belonging to another partner.
MAX(o.offer_price) >= CASE ANY_VALUE(c.code)
WHEN 'AE' THEN 500
WHEN 'SA' THEN 500
WHEN 'EG' THEN 1000
END AS is_high_value,
FROM `noondwh.wms.stock` s
JOIN `noondwh.wms.location` l USING (id_location)
JOIN `noondwh.wms.warehouse` w USING (id_warehouse)
JOIN `noondwh.wms.zone` z USING (id_zone)
JOIN `noondwh.wms.area` a USING (id_area)
JOIN `noondwh.wms.country` c USING (id_country)
JOIN `noondwh.wms.item` i USING (id_item)
JOIN `noondwh.wms.item_lot` il ON (il.id_item_lot = i.id AND i.id_item_kind = 1)
JOIN `noondwh.wms.item` ii ON (ii.id_item = il.id_item_inner)
JOIN `noondwh.wms.item_pbarcode` ip ON (ip.id_item_pbarcode = ii.id AND ii.id_item_kind = 6)
LEFT JOIN `noondwh.wms.warehouse_barcode_partner_mapping` m ON (m.id_warehouse = w.id_warehouse AND m.pbarcode_canonical = ip.pbarcode AND m.is_active = 1)
LEFT JOIN `noondwh.schoms_homs.warehouse` hw ON (hw.partner_warehouse_code = w.code)
LEFT JOIN `noondwh.psku.pbarcode` pb ON (pb.pbarcode_canonical = ip.pbarcode AND pb.id_partner = ip.id_partner)
LEFT JOIN `noondwh.psku.psku` ps ON (ps.psku_code = pb.psku_code)
LEFT JOIN `noondwh.instant_spanner.offer` o ON (o.wh_code = hw.code AND o.sku = ps.zsku_child AND o.is_active)
WHERE TRUE
AND c.code IN ('AE', 'SA')
AND w.is_darkstore = 1
AND hw.is_nim_warehouse = 1
AND a.is_virtual = 0
AND s.qty > 0
GROUP BY w.code, ip.pbarcode
HAVING FALSE
OR (NOT has_fsn AND NOT is_high_value AND sec_ids[OFFSET(0)] != 3001 AND sec_count = 1 AND sec_qty > 0 AND pri_qty = 0) -- Mapping
OR (pri_id IS NOT NULL AND pri_qty = 0) -- Unmapping primaries with zero stock
OR (pri_id IS NOT NULL AND has_fsn) -- Unmapping pbarcodes with any fsn barcode
OR (pri_id IS NOT NULL AND is_high_value) -- Unmapping pbarcodes with high value
)
SELECT
wh_code,
pbarcode,
CASE
WHEN (NOT has_fsn AND NOT is_high_value AND sec_ids[OFFSET(0)] != 3001 AND sec_count = 1 AND sec_qty > 0 AND pri_qty = 0) THEN sec_ids[OFFSET(0)] -- Mapping
WHEN (pri_id IS NOT NULL AND pri_qty = 0) THEN pri_id -- Unmapping primaries with zero stock
WHEN (pri_id IS NOT NULL AND has_fsn) THEN pri_id -- Unmapping pbarcodes with any fsn barcode
WHEN (pri_id IS NOT NULL AND is_high_value) THEN pri_id -- Unmapping pbarcodes with high value
END AS id_partner,
CASE
WHEN (NOT has_fsn AND NOT is_high_value AND sec_ids[OFFSET(0)] != 3001 AND sec_count = 1 AND sec_qty > 0 AND pri_qty = 0) THEN 1 -- Mapping
WHEN (pri_id IS NOT NULL AND pri_qty = 0) THEN 0 -- Unmapping primaries with zero stock
WHEN (pri_id IS NOT NULL AND has_fsn) THEN 0 -- Unmapping pbarcodes with any fsn barcode
WHEN (pri_id IS NOT NULL AND is_high_value) THEN 0 -- Unmapping pbarcodes with high value
END AS is_active
FROM warehouse_pbarcodes
ORDER BY wh_code, pbarcode;
Last active
September 16, 2024 12:25
-
-
Save kerdany/f2088c1bca8b376e6993b82cb80be2dc to your computer and use it in GitHub Desktop.
# Primary Partner Tracking
SELECT
ANY_VALUE(country_code) country_code,
warehouse_code,
ANY_VALUE(warehouse_code_partner) warehouse_code_partner,
SUM(pbarcodes_mapped) pbarcodes_mapped,
SUM(pbarcodes_unmapped) pbarcodes_unmapped,
ROUND(SUM(pbarcodes_unmapped) * 100 / SUM(pbarcodes_mapped + pbarcodes_unmapped)) pbarcodes_unmapped_perc,
SUM(qty_total) qty_total,
SUM(qty_mapped) qty_mapped,
SUM(qty_unmapped) qty_unmapped,
ROUND(SUM(qty_unmapped) * 100 / SUM(qty_total)) qty_unmapped_perc
FROM (
SELECT
ANY_VALUE(c.code) AS country_code,
w.code AS warehouse_code,
ANY_VALUE(hw.partner_warehouse_code) AS warehouse_code_partner,
itpb.pbarcode AS pbarcode,
COUNT(DISTINCT itpb.id_partner) partner_count,
ANY_VALUE(m.id_partner) partner_primary,
COUNT(DISTINCT IF(itpb.id_partner = m.id_partner, itpb.id_partner, NULL)) pbarcodes_mapped,
COUNT(DISTINCT IF(itpb.id_partner = m.id_partner, NULL, itpb.id_partner)) pbarcodes_unmapped,
SUM(qty) as qty_total,
SUM(IF(itpb.id_partner = m.id_partner, qty, 0)) qty_mapped,
SUM(IF(itpb.id_partner = m.id_partner, 0, qty)) qty_unmapped
FROM `noondwh.wms.stock` s
LEFT JOIN `noondwh.wms.location` l USING (id_location)
LEFT JOIN `noondwh.wms.warehouse` w USING (id_warehouse)
LEFT JOIN `noondwh.wms.item` it USING (id_item)
LEFT JOIN `noondwh.wms.item_lot` itl ON (it.id_item_kind, it.id) = (1, itl.id_item_lot)
LEFT JOIN `noondwh.wms.item` itinner ON itinner.id_item=itl.id_item_inner
LEFT JOIN `noondwh.wms.item_pbarcode` itpb ON (itinner.id, itinner.id_item_kind) = (itpb.id_item_pbarcode, 6)
LEFT JOIN `noondwh.wms.zone` z USING (id_zone)
LEFT JOIN `noondwh.wms.area` a USING (id_area)
LEFT JOIN `noondwh.wms.country` c USING (id_country)
LEFT JOIN `noondwh.wms.warehouse_barcode_partner_mapping` m ON (m.id_warehouse = w.id_warehouse AND m.pbarcode_canonical = itpb.pbarcode AND m.is_active = 1)
LEFT JOIN `noondwh.schoms_homs.warehouse` hw ON (hw.partner_warehouse_code = w.code)
LEFT JOIN `noondwh.instant_instant_order.warehouse` iw ON (iw.wh_code = hw.code)
WHERE TRUE
AND a.is_virtual = 0
AND s.qty > 0
AND w.is_darkstore = 1
AND hw.is_nim_warehouse = 1
AND iw.is_active = 1
GROUP BY warehouse_code, pbarcode
) GROUP BY warehouse_code
ORDER BY pbarcodes_unmapped_perc DESC;
# Mapping fixes for existing stock.
SELECT
w.code AS wh_code,
itpb.pbarcode AS pbarcode,
ANY_VALUE(IF(itpb.id_partner = m.id_partner, NULL, itpb.id_partner)) AS id_partner,
1 AS is_active,
COUNT(DISTINCT IF(itpb.id_partner = m.id_partner, itpb.id_partner, NULL)) partners_pri,
COUNT(DISTINCT IF(itpb.id_partner = m.id_partner, NULL, itpb.id_partner)) partners_sec,
SUM(IF(itpb.id_partner = m.id_partner, qty, 0)) qty_pri,
SUM(IF(itpb.id_partner = m.id_partner, 0, qty)) qty_sec
FROM `noondwh.wms.stock` s
JOIN `noondwh.wms.location` l USING (id_location)
JOIN `noondwh.wms.warehouse` w USING (id_warehouse)
JOIN `noondwh.wms.zone` z USING (id_zone)
JOIN `noondwh.wms.area` a USING (id_area)
JOIN `noondwh.wms.country` c USING (id_country)
JOIN `noondwh.schoms_homs.warehouse` hw ON (hw.partner_warehouse_code = w.code)
JOIN `noondwh.wms.item` it USING (id_item)
JOIN `noondwh.wms.item_lot` itl ON (it.id_item_kind, it.id) = (1, itl.id_item_lot)
JOIN `noondwh.wms.item` itinner ON (itinner.id_item = itl.id_item_inner)
JOIN `noondwh.wms.item_pbarcode` itpb ON (itinner.id, itinner.id_item_kind) = (itpb.id_item_pbarcode, 6)
LEFT JOIN `noondwh.wms.warehouse_barcode_partner_mapping` m ON (m.is_active = 1 AND m.id_warehouse = w.id_warehouse AND m.pbarcode_canonical = itpb.pbarcode)
WHERE TRUE
AND c.code IN ('AE', 'SA')
AND w.is_darkstore = 1
AND hw.is_nim_warehouse = 1
AND a.is_virtual = 0
AND s.qty > 0
GROUP BY w.code, itpb.pbarcode
HAVING TRUE
AND qty_pri = 0
AND partners_sec = 1
AND qty_sec > 0
AND id_partner != 3001 -- ignore namshi stock
ORDER BY w.code, itpb.pbarcode;
# Mapping incoming TXW & GOMS transfers, created in the past 48 hours
WITH
configs AS (
SELECT 48 AS age_hours -- Transfers created in the past x hours
),
transfers_wms AS (
# Expected WMS transfers, destined to minutes -only- darkstores, created x hours ago (grouped by wh_code, id_partner, pbarcode).
SELECT
w.code AS wh_code,
ANY_VALUE(w.id_warehouse) AS id_warehouse,
ip.id_partner,
ip.pbarcode,
SUM(tl.qty) AS qty_expected
FROM `noondwh.ops_inbound.wms_transfer` t
JOIN `noondwh.wms.warehouse` w ON (w.code = REGEXP_EXTRACT(t.zone_dst, '^[A-Z]{3}DS\\d{2,3}'))
JOIN `noondwh.wms.country` c USING (id_country)
JOIN `noondwh.ops_inbound.wms_transfer_line` tl USING (id_wms_transfer)
JOIN `noondwh.wms.item` i USING (id_item)
JOIN `noondwh.wms.item_lot` il ON (i.id_item_kind, i.id) = (1, il.id_item_lot)
JOIN `noondwh.wms.item` ii ON (ii.id_item = il.id_item_inner)
JOIN `noondwh.wms.item_pbarcode` ip ON (ii.id, ii.id_item_kind) = (ip.id_item_pbarcode, 6)
WHERE TRUE
AND w.is_darkstore = 1
AND REGEXP_CONTAINS(w.code, '^[A-Z]{3}DS\\d{2,3}$') -- Only Minutes DarkStores (exclude Core/Namshi/NowNow DarkStores)
AND c.code = 'AE'
AND DATETIME_DIFF(CURRENT_DATETIME(), DATETIME(t.created_at), HOUR) <= (SELECT age_hours FROM configs)
AND ip.id_partner != 3001 -- ignore namshi owned stock, we don't map these
AND t.doc_type = 'txw' -- Only TXW transfers (exclude ASNs, TXOs, ...)
AND t.id_doc_wms IS NOT NULL -- Only transfers successfully pushed to WMS
GROUP BY w.code, ip.id_partner, ip.pbarcode
),
transfers_goms AS (
# Expected GOMS transfers, destined to minutes -only- darkstores, created x hours ago (grouped by wh_code, id_partner, pbarcode).
SELECT
w.code AS wh_code,
ANY_VALUE(w.id_warehouse) AS id_warehouse,
tl.id_partner,
tl.pbarcode,
SUM(tl.quantity) AS qty_expected
FROM `noondwh.scgoms_goms.transfer_request` t
JOIN `noondwh.scgoms_goms.status` ts USING (id_status)
JOIN `noondwh.scgoms_goms.warehouse` gw ON (gw.id_warehouse = t.id_dst_warehouse)
JOIN `noondwh.wms.warehouse` w ON (w.code = gw.partner_warehouse_code AND gw.id_partner_owner = 9000)
JOIN `noondwh.wms.country` c ON (c.id_country = w.id_country)
JOIN `noondwh.scgoms_goms.transfer_request_line` tl USING (id_transfer_request)
WHERE TRUE
AND w.is_darkstore = 1
AND REGEXP_CONTAINS(w.code, '^[A-Z]{3}DS\\d{2,3}$') -- Only Minutes DarkStores (exclude Core/Namshi/NowNow DarkStores)
AND c.code = 'AE'
AND DATETIME_DIFF(CURRENT_DATETIME(), DATETIME(t.created_at), HOUR) <= (SELECT age_hours FROM configs)
AND tl.id_partner != 3001 -- ignore namshi owned stock, we don't map these
AND ts.code = 'synced'
GROUP BY w.code, tl.id_partner, tl.pbarcode
),
transfers_all AS (
SELECT
wh_code,
ANY_VALUE(id_warehouse) AS id_warehouse,
id_partner,
pbarcode,
SUM(qty_expected) AS qty_expected
FROM (
SELECT * FROM transfers_wms
UNION ALL
SELECT * FROM transfers_goms
)
GROUP BY wh_code, id_partner, pbarcode
)
SELECT
t.wh_code AS wh_code,
t.pbarcode AS pbarcode,
ANY_VALUE(t.id_partner) AS id_partner, -- Partner for Expected Qty
1 AS is_active,
ANY_VALUE(m.id_partner) AS id_partner_primary, -- Primary partner for this pbarcode in WH
ANY_VALUE(t.qty_expected) AS qty_expected, -- Expected qty
SUM(IF(ip.id_partner = t.id_partner, qty, 0)) AS qty_stock_partner, -- PBarcode stock in WH for incoming partner
SUM(IF(ip.id_partner = m.id_partner, qty, 0)) AS qty_stock_primary, -- PBarcode stock in WH for primary partner
SUM(IF(ip.id_partner != t.id_partner AND ip.id_partner != m.id_partner, qty, 0)) AS qty_stock_others, -- PBarcode stock in WH for other partners
SUM(s.qty) AS qty_stock_all, -- All PBarcode stock in WH
FROM `noondwh.wms.stock` s
JOIN `noondwh.wms.location` l USING (id_location)
JOIN `noondwh.wms.zone` z USING (id_zone)
JOIN `noondwh.wms.area` a USING (id_area)
JOIN `noondwh.wms.item` i USING (id_item)
JOIN `noondwh.wms.item_lot` il ON (i.id_item_kind, i.id) = (1, il.id_item_lot)
JOIN `noondwh.wms.item` ii ON (ii.id_item = il.id_item_inner)
JOIN `noondwh.wms.item_pbarcode` ip ON (ii.id, ii.id_item_kind) = (ip.id_item_pbarcode, 6)
JOIN transfers_all t ON (t.id_warehouse = l.id_warehouse AND t.pbarcode = ip.pbarcode)
LEFT JOIN `noondwh.wms.warehouse_barcode_partner_mapping` m ON (m.id_warehouse = t.id_warehouse AND m.pbarcode_canonical = t.pbarcode AND m.is_active = 1)
WHERE a.is_virtual = 0
GROUP BY 1, 2
HAVING (
-- Map incoming stuff if:
-- 1. No primary partner mapped
id_partner_primary IS NULL
OR
-- 2. Primary partner exists, primary partner is different than incoming partner, and primary partner has zero stock.
(id_partner_primary IS NOT NULL AND id_partner != id_partner_primary AND qty_stock_primary = 0)
)
ORDER BY qty_expected DESC; -- Prioritize mappings having larger expected quantity first.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment