a6c03a091e
Moved from gov-agreg/src/pages/achizitii/* to root (drop prefix). - 22 pages migrated, 127 files total - All internal links: /achizitii/X → /X (176 occurrences fixed) - AchizitiiLayout subnav rewritten: /X paths, top-right link to vreaudigital.ro hub - BaseLayout new (vreau.digital branding, OG tags, site URL) - astro.config.mjs: site https://vreau.digital, server output (was static) - docker-compose: port 5096 (vreaudigital is 5095), container vreau-digital - deploy.sh: paths /opt/vreau-digital, log /var/log/vreau-digital-deploy.log Backend shared with gov-agreg: - PostgreSQL satra (same schemas: seap, firms, anaf, anre, ...) - Photon, Martin tiles - Infisical /vreaudigital path (DATABASE_URL etc. shared) build: PASS (npx astro check 0 errors, npm run build 5s vite + 10s server)
95 lines
3.5 KiB
PL/PgSQL
95 lines
3.5 KiB
PL/PgSQL
-- Per-UAT KPI materialized view powering /harta v2 multi-metric choropleth.
|
|
-- Columns:
|
|
-- total_contracts, total_value, distinct_suppliers
|
|
-- direct_pct — share of value awarded via direct procurement (type='da')
|
|
-- framework_pct — share via framework agreements
|
|
-- hhi_suppliers — Herfindahl-Hirschman index 0..10000 (DOJ thresholds: <1500 ok, 1500-2500 moderate, >2500 concentrated)
|
|
-- top_supplier_share — biggest single-supplier dependency 0..1
|
|
-- q4_spike — Q4 value / (yearly_avg_quarter) for last full year; >1.5 = spike, NULL if no data
|
|
--
|
|
-- Refresh: weekly cron — REFRESH MATERIALIZED VIEW CONCURRENTLY seap.uat_kpi;
|
|
-- Idempotent: safe to re-run.
|
|
|
|
BEGIN;
|
|
|
|
DROP MATERIALIZED VIEW IF EXISTS seap.uat_kpi CASCADE;
|
|
|
|
CREATE MATERIALIZED VIEW seap.uat_kpi AS
|
|
WITH base AS (
|
|
SELECT
|
|
a.authority_siruta AS siruta,
|
|
a.authority_cui,
|
|
a.supplier_cui,
|
|
a.type,
|
|
a.awarded_value,
|
|
a.publication_date,
|
|
a.framework_agreement
|
|
FROM seap.announcements a
|
|
WHERE a.authority_siruta IS NOT NULL
|
|
),
|
|
uat_totals AS (
|
|
SELECT
|
|
siruta,
|
|
COUNT(*)::int AS total_contracts,
|
|
COALESCE(SUM(awarded_value), 0)::numeric(20,2) AS total_value,
|
|
COALESCE(SUM(awarded_value) FILTER (WHERE type = 'da'), 0)::numeric(20,2) AS direct_value,
|
|
COALESCE(SUM(awarded_value) FILTER (WHERE framework_agreement = true), 0)::numeric(20,2) AS framework_value,
|
|
COUNT(DISTINCT supplier_cui)::int AS distinct_suppliers
|
|
FROM base
|
|
GROUP BY siruta
|
|
),
|
|
supplier_shares AS (
|
|
SELECT
|
|
siruta,
|
|
supplier_cui,
|
|
SUM(awarded_value) / NULLIF(SUM(SUM(awarded_value)) OVER (PARTITION BY siruta), 0) AS ratio
|
|
FROM base
|
|
WHERE supplier_cui IS NOT NULL AND awarded_value IS NOT NULL
|
|
GROUP BY siruta, supplier_cui
|
|
),
|
|
hhi_calc AS (
|
|
SELECT
|
|
siruta,
|
|
COALESCE(SUM(POWER(ratio, 2)) * 10000, 0) AS hhi,
|
|
COALESCE(MAX(ratio), 0) AS top_supplier_share
|
|
FROM supplier_shares
|
|
GROUP BY siruta
|
|
),
|
|
last_full_year AS (
|
|
SELECT extract(year from now()) - 1 AS yr
|
|
),
|
|
q4_data AS (
|
|
SELECT
|
|
siruta,
|
|
COALESCE(SUM(awarded_value) FILTER (WHERE extract(quarter FROM publication_date) = 4), 0)::numeric AS q4_value,
|
|
COALESCE(SUM(awarded_value), 0)::numeric AS yearly_value
|
|
FROM base
|
|
WHERE extract(year FROM publication_date) = (SELECT yr FROM last_full_year)
|
|
GROUP BY siruta
|
|
)
|
|
SELECT
|
|
ut.siruta,
|
|
ut.total_contracts,
|
|
ut.total_value,
|
|
ut.distinct_suppliers,
|
|
CASE WHEN ut.total_value > 0 THEN ut.direct_value / ut.total_value ELSE 0 END AS direct_pct,
|
|
CASE WHEN ut.total_value > 0 THEN ut.framework_value / ut.total_value ELSE 0 END AS framework_pct,
|
|
COALESCE(hh.hhi, 0)::numeric(10,2) AS hhi_suppliers,
|
|
COALESCE(hh.top_supplier_share, 0)::numeric(8,4) AS top_supplier_share,
|
|
CASE WHEN q4.yearly_value > 0 THEN q4.q4_value / (q4.yearly_value / 4) ELSE NULL END AS q4_spike
|
|
FROM uat_totals ut
|
|
LEFT JOIN hhi_calc hh ON hh.siruta = ut.siruta
|
|
LEFT JOIN q4_data q4 ON q4.siruta = ut.siruta;
|
|
|
|
CREATE UNIQUE INDEX IF NOT EXISTS idx_uat_kpi_pk ON seap.uat_kpi(siruta);
|
|
CREATE INDEX IF NOT EXISTS idx_uat_kpi_value ON seap.uat_kpi(total_value DESC NULLS LAST);
|
|
CREATE INDEX IF NOT EXISTS idx_uat_kpi_direct ON seap.uat_kpi(direct_pct DESC) WHERE total_contracts > 5;
|
|
CREATE INDEX IF NOT EXISTS idx_uat_kpi_hhi ON seap.uat_kpi(hhi_suppliers DESC) WHERE total_contracts > 5;
|
|
|
|
COMMIT;
|
|
|
|
-- Refresh helper (idempotent)
|
|
CREATE OR REPLACE FUNCTION seap.refresh_uat_kpi() RETURNS void LANGUAGE sql AS $$
|
|
REFRESH MATERIALIZED VIEW CONCURRENTLY seap.uat_kpi;
|
|
$$;
|