From 39ee5e86fa95fb816fa4098d067677ebe7c6a856 Mon Sep 17 00:00:00 2001 From: Rene Fichtmueller Date: Wed, 1 Apr 2026 23:16:50 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20procurement=20demo=20data=20=E2=80=94=20?= =?UTF-8?q?correct=20schema=20column=20names=20for=20all=204=20tables?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sql/021-procurement-demo-data.sql | 346 +++++++++++++++--------------- 1 file changed, 176 insertions(+), 170 deletions(-) diff --git a/sql/021-procurement-demo-data.sql b/sql/021-procurement-demo-data.sql index c3d6b50..25a674c 100644 --- a/sql/021-procurement-demo-data.sql +++ b/sql/021-procurement-demo-data.sql @@ -1,31 +1,35 @@ --- Migration 021: Procurement Intelligence Demo Data +-- Migration 021: Procurement Intelligence Demo Data (corrected schema) -- Seeds realistic procurement signals, ABC classes, stock observations --- so the dashboard tab shows meaningful data immediately -- ───────────────────────────────────────────────────────────────────────────── --- 1. ABC Classification demo entries (top transceiver SKUs) +-- 1. ABC Classification demo entries +-- abc_classification: transceiver_id, abc_class, obs_90d, compat_count, +-- vendor_count, price_volatility, demand_score, supply_risk, computed_at -- ───────────────────────────────────────────────────────────────────────────── -INSERT INTO abc_classification (transceiver_id, abc_class, score, obs_90d, compat_count, vendor_count, classified_at) +INSERT INTO abc_classification ( + transceiver_id, abc_class, obs_90d, compat_count, vendor_count, + price_volatility, demand_score, supply_risk, computed_at +) SELECT t.id, CASE - WHEN t.speed_gbps >= 400 AND t.form_factor IN ('QSFP-DD', 'OSFP') THEN 'A' - WHEN t.speed_gbps >= 100 AND t.form_factor IN ('QSFP28', 'QSFP+') THEN 'A' - WHEN t.speed_gbps = 25 AND t.form_factor = 'SFP28' THEN 'B' - WHEN t.speed_gbps = 10 AND t.form_factor IN ('SFP+', 'SFP') THEN 'B' - WHEN t.speed_gbps = 1 THEN 'C' + WHEN t.speed_gbps >= 400 THEN 'A' + WHEN t.speed_gbps >= 100 THEN 'A' + WHEN t.speed_gbps >= 25 THEN 'B' + WHEN t.speed_gbps >= 10 THEN 'B' ELSE 'C' - END AS abc_class, - CASE - WHEN t.speed_gbps >= 400 THEN 0.85 + random() * 0.14 - WHEN t.speed_gbps >= 100 THEN 0.65 + random() * 0.20 - WHEN t.speed_gbps >= 25 THEN 0.40 + random() * 0.25 - WHEN t.speed_gbps >= 10 THEN 0.20 + random() * 0.20 - ELSE 0.05 + random() * 0.15 - END AS score, - FLOOR(10 + random() * 90)::INTEGER AS obs_90d, - FLOOR(5 + random() * 50)::INTEGER AS compat_count, - FLOOR(1 + random() * 8)::INTEGER AS vendor_count, + END, + FLOOR(10 + random() * 90)::INTEGER, + FLOOR(5 + random() * 50)::INTEGER, + FLOOR(1 + random() * 8)::INTEGER, + ROUND((random() * 0.25)::NUMERIC, 4), + ROUND(CASE + WHEN t.speed_gbps >= 400 THEN 75 + random() * 24 + WHEN t.speed_gbps >= 100 THEN 55 + random() * 30 + WHEN t.speed_gbps >= 25 THEN 30 + random() * 25 + ELSE 5 + random() * 25 + END::NUMERIC, 2), + CASE WHEN random() > 0.7 THEN 'high' WHEN random() > 0.4 THEN 'medium' ELSE 'low' END, NOW() - (random() * INTERVAL '2 hours') FROM transceivers t WHERE NOT EXISTS (SELECT 1 FROM abc_classification abc WHERE abc.transceiver_id = t.id) @@ -33,111 +37,92 @@ LIMIT 200 ON CONFLICT DO NOTHING; -- ───────────────────────────────────────────────────────────────────────────── --- 2. Reorder signals demo (key technologies) +-- 2. Reorder signals demo +-- reorder_signals: transceiver_id, signal, signal_strength, reasons, +-- stock_trend, price_trend, lead_time_weeks, hype_phase, computed_at, expires_at -- ───────────────────────────────────────────────────────────────────────────── INSERT INTO reorder_signals ( transceiver_id, signal, signal_strength, reasons, - current_asp_eur, price_trend_30d, lead_time_days, - weeks_of_stock, abc_class, computed_at + stock_trend, price_trend, lead_time_weeks, hype_phase, + computed_at, expires_at ) SELECT t.id, CASE - WHEN t.speed_gbps >= 400 AND t.form_factor = 'QSFP-DD' THEN 'buy_now' - WHEN t.speed_gbps = 100 AND t.reach_label LIKE '%DR%' THEN 'buy_now' - WHEN t.speed_gbps = 100 AND t.reach_label LIKE '%ZR%' THEN 'wait' - WHEN t.speed_gbps = 400 AND t.reach_label LIKE '%ZR%' THEN 'wait' - WHEN t.speed_gbps = 25 THEN 'monitor' - WHEN t.speed_gbps = 10 AND t.reach_label LIKE '%LR%' THEN 'hold' + WHEN t.speed_gbps >= 400 AND t.form_factor = 'QSFP-DD' THEN 'buy_now' + WHEN t.speed_gbps = 100 AND t.reach_label ILIKE '%DR%' THEN 'buy_now' + WHEN t.speed_gbps = 100 AND t.reach_label ILIKE '%ZR%' THEN 'wait' + WHEN t.speed_gbps = 400 AND t.reach_label ILIKE '%ZR%' THEN 'wait' + WHEN t.speed_gbps = 25 THEN 'monitor' + WHEN t.speed_gbps = 10 AND t.reach_label ILIKE '%LR%' THEN 'hold' ELSE 'monitor' - END AS signal, - CASE + END, + ROUND(CASE WHEN t.speed_gbps >= 400 THEN 0.75 + random() * 0.22 WHEN t.speed_gbps >= 100 THEN 0.55 + random() * 0.30 ELSE 0.30 + random() * 0.40 - END AS signal_strength, + END::NUMERIC, 2), CASE WHEN t.speed_gbps >= 400 AND t.form_factor = 'QSFP-DD' - THEN '["Price near 12-month low","Adoption entering slope of enlightenment","Lead times stable at 8-12 weeks","Hyperscaler demand confirmed (AWS $105B CapEx 2026)"]'::jsonb - WHEN t.speed_gbps = 100 AND t.reach_label LIKE '%DR%' - THEN '["DR4 pricing dropped 18% in Q1 2026","High switch compat (400+ switches)","FS.com and 10Gtek stock in","Strong Flexoptix catalog coverage"]'::jsonb - WHEN t.speed_gbps = 100 AND t.reach_label LIKE '%ZR%' + THEN '["Price near 12-month low","Adoption entering slope of enlightenment","Hyperscaler demand confirmed (AWS $105B CapEx 2026)","Lead times stable 8-12 weeks"]'::jsonb + WHEN t.speed_gbps = 100 AND t.reach_label ILIKE '%DR%' + THEN '["DR4 pricing dropped 18% Q1 2026","High switch compat (400+ switches)","FS.com and 10Gtek stock available","Strong Flexoptix catalog coverage"]'::jsonb + WHEN t.speed_gbps = 100 AND t.reach_label ILIKE '%ZR%' THEN '["ZR+ standard still finalizing","Coherent lead times 16-20 weeks","Price expected -25% by Q3 2026","Wait for IEEE 802.3df ratification"]'::jsonb - WHEN t.speed_gbps = 400 AND t.reach_label LIKE '%ZR%' + WHEN t.speed_gbps = 400 AND t.reach_label ILIKE '%ZR%' THEN '["400ZR recently ratified","Market still volatile","Multiple vendors entering","Price floor not yet established"]'::jsonb WHEN t.speed_gbps = 25 - THEN '["SFP28 market mature","Price stable","Monitor for next refresh cycle","No urgent action required"]'::jsonb - ELSE '["Stable pricing","No lifecycle event triggered","Normal replenishment timing"]'::jsonb - END AS reasons, + THEN '["SFP28 market mature and stable","No lifecycle event triggered","Normal replenishment timing applies"]'::jsonb + ELSE '["Stable pricing","No urgent lifecycle event","Standard replenishment cycle"]'::jsonb + END, + CASE WHEN random() > 0.5 THEN 'declining' WHEN random() > 0.3 THEN 'stable' ELSE 'increasing' END, + CASE WHEN t.speed_gbps >= 100 THEN 'falling' WHEN random() > 0.4 THEN 'stable' ELSE 'falling' END, CASE - WHEN t.speed_gbps = 400 THEN 180 + random() * 120 - WHEN t.speed_gbps = 100 THEN 65 + random() * 80 - WHEN t.speed_gbps = 25 THEN 35 + random() * 30 - WHEN t.speed_gbps = 10 THEN 22 + random() * 20 - ELSE 8 + random() * 15 - END AS current_asp_eur, + WHEN t.speed_gbps >= 400 THEN FLOOR(2 + random() * 3)::INTEGER + WHEN t.speed_gbps >= 100 THEN FLOOR(1 + random() * 2)::INTEGER + ELSE 1 + END, CASE - WHEN t.speed_gbps >= 400 AND t.form_factor = 'QSFP-DD' THEN -0.08 - random() * 0.05 - WHEN t.speed_gbps = 100 AND t.reach_label LIKE '%DR%' THEN -0.12 - random() * 0.06 - WHEN t.speed_gbps = 100 AND t.reach_label LIKE '%ZR%' THEN -0.18 - random() * 0.07 - WHEN t.speed_gbps = 25 THEN -0.03 - random() * 0.04 - WHEN t.speed_gbps = 10 THEN -0.02 - random() * 0.02 - ELSE 0.01 - random() * 0.05 - END AS price_trend_30d, - CASE - WHEN t.speed_gbps >= 400 THEN 8 + FLOOR(random() * 8) - WHEN t.speed_gbps >= 100 THEN 4 + FLOOR(random() * 6) - ELSE 2 + FLOOR(random() * 4) - END::INTEGER AS lead_time_days, - CASE - WHEN t.speed_gbps >= 400 THEN 4 + FLOOR(random() * 8) - WHEN t.speed_gbps >= 100 THEN 6 + FLOOR(random() * 10) - ELSE 12 + FLOOR(random() * 12) - END::INTEGER AS weeks_of_stock, - CASE - WHEN t.speed_gbps >= 400 THEN 'A' - WHEN t.speed_gbps >= 100 THEN 'A' - WHEN t.speed_gbps >= 25 THEN 'B' - ELSE 'C' - END AS abc_class, - NOW() - (random() * INTERVAL '1 hour') + WHEN t.speed_gbps >= 400 THEN 'SLOPE_OF_ENLIGHTENMENT' + WHEN t.speed_gbps >= 100 THEN 'PLATEAU_OF_PRODUCTIVITY' + WHEN t.speed_gbps >= 25 THEN 'PLATEAU_OF_PRODUCTIVITY' + WHEN t.speed_gbps >= 10 THEN 'LEGACY_DECLINE' + ELSE 'LEGACY_DECLINE' + END, + NOW() - (random() * INTERVAL '1 hour'), + NOW() + INTERVAL '24 hours' FROM transceivers t WHERE NOT EXISTS (SELECT 1 FROM reorder_signals rs WHERE rs.transceiver_id = t.id) LIMIT 150 ON CONFLICT DO NOTHING; -- ───────────────────────────────────────────────────────────────────────────── --- 3. Stock snapshots — simulate recent stock observations +-- 3. Stock snapshots demo +-- stock_snapshots: transceiver_id, vendor_id, stock_level, stock_quantity, +-- incoming_quantity, incoming_eta, lead_time_days, moq, price_breaks, +-- source_url, crawler_confidence, scraped_at -- ───────────────────────────────────────────────────────────────────────────── INSERT INTO stock_snapshots ( - transceiver_id, vendor_id, observed_at, - stock_level, quantity_available, incoming_quantity, - incoming_eta, lead_time_days, moq, price, currency, source_url + transceiver_id, vendor_id, + stock_level, stock_quantity, incoming_quantity, incoming_eta, + lead_time_days, moq, source_url, crawler_confidence, scraped_at ) SELECT t.id, v.id, - NOW() - (random() * INTERVAL '6 hours'), - CASE WHEN random() > 0.3 THEN 'in_stock' - WHEN random() > 0.6 THEN 'low_stock' - ELSE 'on_request' END, + CASE + WHEN random() > 0.6 THEN 'in_stock' + WHEN random() > 0.3 THEN 'limited' + ELSE 'unknown' + END, CASE WHEN random() > 0.4 THEN FLOOR(10 + random() * 500)::INTEGER ELSE NULL END, CASE WHEN random() > 0.6 THEN FLOOR(50 + random() * 300)::INTEGER ELSE NULL END, - CASE WHEN random() > 0.6 THEN NOW() + INTERVAL '2 weeks' + (random() * INTERVAL '4 weeks') ELSE NULL END, + CASE WHEN random() > 0.6 THEN CURRENT_DATE + FLOOR(14 + random() * 28)::INTEGER ELSE NULL END, FLOOR(3 + random() * 14)::INTEGER, CASE WHEN t.speed_gbps >= 100 THEN 5 ELSE 1 END, - CASE - WHEN t.speed_gbps = 400 THEN 180 + random() * 200 - WHEN t.speed_gbps = 100 THEN 60 + random() * 100 - WHEN t.speed_gbps = 25 THEN 25 + random() * 40 - WHEN t.speed_gbps = 10 THEN 15 + random() * 25 - ELSE 5 + random() * 15 - END, - CASE WHEN v.name ILIKE '%flexoptix%' THEN 'EUR' - WHEN v.website_url ILIKE '%fs.com%' THEN 'USD' - WHEN v.website_url ILIKE '%atgbics%' THEN 'GBP' - ELSE 'USD' END, - v.website_url + v.website_url, + ROUND((0.70 + random() * 0.28)::NUMERIC, 2), + NOW() - (random() * INTERVAL '6 hours') FROM transceivers t CROSS JOIN ( SELECT id, name, website_url FROM vendors @@ -147,114 +132,135 @@ CROSS JOIN ( WHERE NOT EXISTS ( SELECT 1 FROM stock_snapshots ss WHERE ss.transceiver_id = t.id AND ss.vendor_id = v.id - AND ss.observed_at > NOW() - INTERVAL '12 hours' + AND ss.scraped_at > NOW() - INTERVAL '12 hours' ) LIMIT 300 ON CONFLICT DO NOTHING; -- ───────────────────────────────────────────────────────────────────────────── --- 4. Market intelligence — expand with current data points +-- 4. Market intelligence — expand current data +-- market_intelligence: intel_type, title, summary, relevance_score, +-- technologies, buy_signal_implication, impact_horizon_months, +-- source_url, source_name, published_at -- ───────────────────────────────────────────────────────────────────────────── INSERT INTO market_intelligence ( - source_name, source_url, title, description, category, - impact_level, buy_signal_effect, confidence, published_date + intel_type, title, summary, relevance_score, + technologies, buy_signal_implication, impact_horizon_months, + source_url, source_name, published_at ) VALUES - ('LightReading', - 'https://www.lightreading.com/400g-zr-market-2026', - '400G ZR+ Volume Shipments Accelerating in H1 2026', - 'Multiple sources confirm 400G ZR+ module shipments are ramping faster than expected. Coherent, Lumentum, and II-VI all report order increases >40% QoQ. Pricing dropped from €350 to €285 average since Jan 2026. Expect further 15-20% decline by Q3.', - 'market_trend', 'high', 'buy_now', 0.82, '2026-03-28'), + ('supply_chain', + '400G ZR+ Volume Shipments Accelerating H1 2026', + 'Multiple sources confirm 400G ZR+ module shipments ramping >40% QoQ. Coherent, Lumentum, II-VI all report order surge. Pricing dropped from €350 to €285 average since Jan 2026. Further 15-20% decline expected by Q3.', + 0.88, ARRAY['400G','ZR+','QSFP-DD'], 'buy_now', 3, + 'https://www.lightreading.com/400g-zr-market-2026', 'LightReading', + '2026-03-28 09:00:00+00'), - ('FierceTelecom', - 'https://www.fiercetelecom.com/networking/100g-dr4-price-war', - '100G DR4 Price War: FS.com Drops to $49, Triggers Industry Response', - 'FS.com reduced 100G QSFP28 DR4 pricing to $49 (from $67) effective March 2026. 10Gtek and ATGBICS responded within 72 hours with matching prices. Flexoptix adjusted EU pricing to €52. This is a structural price reset — the floor is moving down.', - 'price_event', 'high', 'buy_now', 0.91, '2026-03-15'), + ('supply_chain', + '100G DR4 Price War: FS.com Triggers Industry Reset to $49', + 'FS.com reduced 100G QSFP28 DR4 pricing to $49 (from $67) March 2026. 10Gtek and ATGBICS responded within 72h. Flexoptix adjusted to €52. Structural price reset — new floor establishing at $45-55.', + 0.95, ARRAY['100G','DR4','QSFP28'], 'buy_now', 2, + 'https://www.fiercetelecom.com/networking/100g-dr4-price-war', 'FierceTelecom', + '2026-03-15 14:00:00+00'), - ('Farnell', - 'https://farnell.com/lead-times-q2-2026', - 'QSFP28 100G SR4 Lead Times Extended — Factory Allocation Issues', - 'Farnell reports QSFP28-100G-SR4 lead times extended to 12-16 weeks from InnoLight and Lumentum factories due to component shortages. Spot market prices €15-20 above list. Recommendation: pre-order Q2/Q3 requirements now.', - 'supply_chain', 'high', 'buy_now', 0.87, '2026-03-22'), + ('distributor_lead_time', + 'QSFP28 100G SR4 Lead Times Extended to 12-16 Weeks — InnoLight Allocation', + 'Farnell reports QSFP28-100G-SR4 lead times extended 12-16 weeks due to component shortages at InnoLight and Lumentum. Spot market prices €15-20 above list. Pre-order Q2/Q3 requirements now.', + 0.91, ARRAY['100G','SR4','QSFP28'], 'buy_now', 3, + 'https://farnell.com/lead-times-q2-2026', 'Farnell', + '2026-03-22 10:00:00+00'), - ('IEEE 802.3', - 'https://www.ieee802.org/3/df/index.html', - 'IEEE 802.3df 200G/400G/800G PAM4 Standard — Vote Expected Q2 2026', - 'IEEE 802.3 Task Force 802.3df targeting 200G-per-lane PAM4 standard ballot for Q2 2026. Expected to enable 800G single-mode modules at sub-€300 by 2027. Impacts current 400G DR4/FR4 pricing trajectory — may accelerate decline.', - 'standards', 'medium', 'monitor', 0.78, '2026-03-10'), + ('standard_draft', + 'IEEE 802.3df 200G/400G/800G PAM4 — Ballot Q2 2026', + 'IEEE 802.3 Task Force 802.3df targeting 200G-per-lane PAM4 standard ballot Q2 2026. Enables 800G single-mode modules at sub-€300 by 2027. Will accelerate 400G DR4/FR4 price decline.', + 0.82, ARRAY['800G','400G','PAM4','OSFP'], 'monitor', 9, + 'https://www.ieee802.org/3/df/index.html', 'IEEE 802.3', + '2026-03-10 08:00:00+00'), - ('Mouser Electronics', - 'https://mouser.com/optics-availability-q1-2026', - 'SFP28 25G Short-Run Availability Improving — Lead Times Down to 2-4 Weeks', - 'Mouser reports SFP28 25G SR/LR availability improving significantly in Q1 2026. Lead times for generic-compatible SFP28 dropped from 8-10 weeks to 2-4 weeks. Pricing flat to -5% YoY. Market entering plateau phase.', - 'supply_chain', 'low', 'monitor', 0.84, '2026-03-18'), + ('distributor_lead_time', + 'SFP28 25G Short-Run Availability Improving — Lead Times 2-4 Weeks', + 'Mouser reports SFP28 25G SR/LR availability improving significantly Q1 2026. Lead times for generic-compatible SFP28 dropped from 8-10 weeks to 2-4 weeks. Pricing flat to -5% YoY.', + 0.79, ARRAY['25G','SFP28','SR','LR'], 'monitor', 1, + 'https://mouser.com/optics-availability-q1-2026', 'Mouser Electronics', + '2026-03-18 11:00:00+00'), - ('Arista Community', - 'https://eos.arista.com/800g-announcement', - 'Arista Announces 800G OSFP Platform — Delivery Q3 2026', - 'Arista Networks confirmed 7800R3-48CQFM-LC supporting 800G OSFP modules, targeting Q3 2026 availability. First enterprise switching platform with native 800G. Implications: 400G prices will accelerate decline in H2 2026 as 800G creates pull-through demand.', - 'new_product', 'high', 'buy_now', 0.88, '2026-03-05'), + ('trade_show', + 'Arista 800G OSFP Platform Confirmed — Q3 2026 Delivery', + 'Arista Networks confirmed 7800R3-48CQFM-LC supporting 800G OSFP modules, Q3 2026. First enterprise switching platform with native 800G. 400G prices will accelerate decline in H2 2026 as 800G creates pull-through demand.', + 0.90, ARRAY['800G','OSFP','400G','Arista'], 'buy_now', 6, + 'https://eos.arista.com/800g-announcement', 'Arista Community', + '2026-03-05 09:00:00+00'), - ('EU TED', - 'https://ted.europa.eu/search?q=optical+transceiver', - 'EU Public Procurement: Deutsche Bahn €3.8M Optical Transceiver Tender', - 'Deutsche Bahn AG issued tender for 40,000+ QSFP28 100G LR4 and SFP28 25G SR4 modules for ETCS signalling upgrades. Contract value €3.8M over 3 years. Delivery from Q4 2026. Represents significant European demand signal for 100G multimode.', - 'market_event', 'medium', 'buy_now', 0.75, '2026-03-30'), + ('tender', + 'EU TED: Deutsche Bahn €3.8M Optical Transceiver Tender Q4 2026', + 'Deutsche Bahn AG tender for 40,000+ QSFP28 100G LR4 and SFP28 25G SR4 for ETCS signalling upgrades. Contract value €3.8M over 3 years. Delivery from Q4 2026. Strong European demand signal.', + 0.76, ARRAY['100G','LR4','25G','SR4'], 'buy_now', 6, + 'https://ted.europa.eu/search?q=optical+transceiver', 'EU TED', + '2026-03-30 16:00:00+00'), - ('Reddit r/networking', - 'https://www.reddit.com/r/networking/osfp_800g_interop', - '800G OSFP Interoperability: Early Adopter Field Reports Mixed', - 'Community thread: early 800G OSFP deployments showing inconsistent interoperability between Coherent and Lumentum modules on Arista 7800. DOM reporting incomplete on some FW versions. Not production-ready for mixed-vendor environments yet. Wait for EOS 4.32+.', - 'interop', 'medium', 'hold', 0.72, '2026-03-25'), - - ('LightCounting Market Research', - 'https://lightcounting.com/q1-2026-market-report', - 'Transceiver Market Q1 2026: $1.4B Quarterly Revenue, Up 28% YoY', - 'LightCounting Q1 2026 report shows transceiver market at $1.4B, up 28% YoY driven by hyperscaler AI cluster buildouts. 400G QSFP-DD now 38% of revenue. 100G declining share but volume stable. 800G <1% today. Flexoptix-addressable market (compatible segment) ~12% of total.', - 'market_trend', 'high', 'buy_now', 0.90, '2026-04-01') + ('capex_cycle', + 'Transceiver Market Q1 2026: $1.4B Revenue, Up 28% YoY — AI Clusters Drive Growth', + 'LightCounting Q1 2026: transceiver market $1.4B, up 28% YoY driven by hyperscaler AI buildouts. 400G QSFP-DD now 38% of revenue. 100G declining share but stable volume. 800G <1% today. Flexoptix-addressable segment ~12% of total.', + 0.93, ARRAY['400G','QSFP-DD','100G','800G'], 'buy_now', 3, + 'https://lightcounting.com/q1-2026-market-report', 'LightCounting Market Research', + '2026-04-01 08:00:00+00') ON CONFLICT DO NOTHING; -- ───────────────────────────────────────────────────────────────────────────── --- 5. Product lifecycle events — more entries +-- 5. Product lifecycle events — additional entries +-- product_lifecycle_events: event_type, title, description, technology, +-- effective_date, source_url, source_name, impact_level, buy_signal -- ───────────────────────────────────────────────────────────────────────────── INSERT INTO product_lifecycle_events ( - product_name, speed_gbps, form_factor, event_type, - event_date, source_url, notes, impact_level + event_type, title, description, technology, + effective_date, source_url, source_name, impact_level, buy_signal ) VALUES - ('QSFP28 100G LR4', 100, 'QSFP28', 'new_standard', - '2025-12-01', 'https://ieee802.org/3/bs/', - 'IEEE 802.3bs 400GbE ratified, making 100G LR4 the established enterprise standard for 10km+ runs. Full ecosystem maturity.', - 'medium'), - ('SFP-10G-SR', 10, 'SFP+', 'eol_announced', - '2026-09-30', 'https://www.cisco.com/c/en/us/products/eol.html', - 'Cisco SFP-10G-SR EOL 2026-09-30 (LDOS 2031-09-30). Volume declining. Compatible alternatives available at 60% lower price.', - 'medium'), - ('QSFP-DD 400G ZR', 400, 'QSFP-DD', 'new_standard', - '2022-06-15', 'https://400zr.net/', - 'OIF 400ZR standard ratified. First coherent pluggable standard. Major ecosystem enabler — now fully supported by Cisco, Arista, Juniper, Nokia.', - 'high'), - ('OSFP 800G', 800, 'OSFP', 'in_development', - '2026-03-01', 'https://opensystemsintegration.com/800G-MSA', - '800G OSFP MSA draft v2.0 published. Sampling from Coherent and Lumentum. General availability expected Q3-Q4 2026.', - 'high'), - ('SFP28 25G SR4', 25, 'SFP28', 'price_floor', - '2026-01-15', 'https://fs.com/25g-sfp28-market', - '25G SR4 market reached price floor at ~$8-12 (generic compatible). No further significant price decline expected. Stable supply from multiple Chinese manufacturers.', - 'low'), - ('QSFP28 100G DR4', 100, 'QSFP28', 'price_drop', - '2026-03-15', 'https://www.fiercetelecom.com/networking/100g-dr4-price-war', - 'FS.com price drop to $49 triggered industry-wide 100G DR4 repricing. New price floor establishing at $45-55 range.', - 'high') + ('standard_ratified', 'QSFP28 100G LR4 — IEEE 802.3bs Mature Standard', + 'IEEE 802.3bs 400GbE fully ratified. 100G LR4 is now the established enterprise standard for 10km+ datacenter interconnect. Full multi-vendor ecosystem, price floor establishing.', + '100G LR4', '2025-12-01', + 'https://ieee802.org/3/bs/', 'IEEE 802.3', 'medium', 'buy_now'), + + ('eol_announced', 'Cisco SFP-10G-SR EOL Announced — Sep 2026', + 'Cisco SFP-10G-SR EOL 2026-09-30. Last day of support 2031-09-30. Volume declining rapidly. Generic compatible alternatives at 60% lower cost readily available.', + '10G SR', '2026-09-30', + 'https://www.cisco.com/c/en/us/products/eol.html', 'Cisco', 'medium', 'hold'), + + ('standard_ratified', '400ZR OIF Standard Ratified — Coherent Pluggable Era', + 'OIF 400ZR standard fully ratified and deployed at scale. Now supported by Cisco, Arista, Juniper, Nokia. Pricing dropped 45% from initial release. Market entering slope of enlightenment.', + '400G ZR', '2022-06-15', + 'https://400zr.net/', 'OIF', 'high', 'buy_now'), + + ('standard_draft', '800G OSFP MSA Draft v2.0 Published', + '800G OSFP MSA draft v2.0 published. Sampling from Coherent and Lumentum expected Q2 2026. General availability Q3-Q4 2026. Will displace 400G QSFP-DD in hyperscale builds from 2027.', + '800G OSFP', '2026-03-01', + 'https://opensystemsintegration.com/800G-MSA', 'OSFP MSA', 'high', 'monitor'), + + ('price_floor', 'SFP28 25G SR4 — Price Floor Reached at €8-12', + '25G SR4 market reached structural price floor ~€8-12 (generic compatible). Multiple Chinese manufacturers (InnoLight, Eoptolink) in volume production. No further significant decline expected.', + '25G SFP28', '2026-01-15', + 'https://fs.com/25g-sfp28-market', 'FS.com', 'low', 'buy_now'), + + ('supply_chain', '100G DR4 Price Reset — New Floor Establishing at $45-55', + 'FS.com price drop to $49 triggered industry-wide 100G DR4 repricing March 2026. New competitive floor at $45-55 range. Flexoptix EUR equivalent €44-52. Optimal buy window now open.', + '100G DR4', '2026-03-15', + 'https://www.fiercetelecom.com/networking/100g-dr4-price-war', 'FierceTelecom', 'high', 'buy_now') + ON CONFLICT DO NOTHING; -- ───────────────────────────────────────────────────────────────────────────── --- 6. Update known issues count on transceivers (computed field) +-- 6. Update computed count fields -- ───────────────────────────────────────────────────────────────────────────── UPDATE transceivers t SET known_issues_count = ( SELECT COUNT(*) FROM product_issues pi WHERE pi.transceiver_id = t.id ); - UPDATE transceivers t SET documents_count = ( SELECT COUNT(*) FROM product_documents pd WHERE pd.transceiver_id = t.id ); + +-- Summary +SELECT + (SELECT COUNT(*) FROM abc_classification) AS abc_entries, + (SELECT COUNT(*) FROM reorder_signals) AS reorder_signals, + (SELECT COUNT(*) FROM stock_snapshots) AS stock_snapshots, + (SELECT COUNT(*) FROM market_intelligence) AS market_intel, + (SELECT COUNT(*) FROM product_lifecycle_events) AS lifecycle_events;