1
0
Fork 0
mirror of https://gitlab.com/menjometre/menjometre.git synced 2026-07-04 14:51:57 +02:00
Observatori independent de subvencions i contractes públics a Catalunya. 336.000 entitats, 19.5M registres, codi obert.
  • TypeScript 81%
  • PLpgSQL 16.7%
  • Shell 1.1%
  • Python 0.7%
  • JavaScript 0.3%
  • Other 0.2%
Find a file
Menjòmetre b22c0f47a1 Merge branch 'fix/remove-middleware-unblock-prod' into 'main'
fix(build): remove root middleware to restore Vercel deploys

See merge request menjometre/menjometre!371
2026-07-01 09:00:51 +00:00
infra/fly-tei docs(embeddings): keep infra notes neutral 2026-06-11 10:04:26 +02:00
packages/mcp refactor(rpc): rename cross-party appointment RPC to nomenament_creuat 2026-04-20 21:47:05 +02:00
public security: apply review fixes (RLS, Next CVE bump, hardening) 2026-06-27 21:01:50 +02:00
reference/jongonzlz feat(calculadora): afegir eina interactiva de càlcul salarial 2026-04-24 19:47:03 +02:00
rollbacks fix(schema updates): address P1 code review findings before staging deploy 2026-04-10 12:29:21 +02:00
scripts feat(transparencia): ajusta el llindar de volum del registre TCCSP i vincula òrgans a entitats 2026-06-16 22:22:10 +08:00
src Merge branch 'fix/tema-ondemand-isr' into 'main' 2026-07-01 08:59:37 +00:00
supabase fix(pressupostos): dedupe ranking organ_entity_map join 2026-06-28 01:45:41 +02:00
tests merge: reconcilia la branca amb release-preview (=main) 2026-06-04 16:35:46 +02:00
.gitignore chore(config): ignore local harness files; env-configure embedding host 2026-06-11 15:14:27 +02:00
.gitlab-ci.yml ci: add manual-trigger registry sync jobs 2026-06-11 18:17:39 +02:00
.nvmrc Update README and methodology page with full data pipeline documentation 2026-03-14 17:50:38 +01:00
design.md chore(design): add design.md as visual tokens source of truth 2026-04-27 10:54:14 +02:00
eslint.config.mjs Initial commit from Create Next App 2026-03-10 13:53:58 +01:00
LICENSE AGPL-3.0 license, mobile responsiveness, enrichment docs, security cleanup 2026-03-14 01:31:02 +01:00
next.config.ts security: apply review fixes (RLS, Next CVE bump, hardening) 2026-06-27 21:01:50 +02:00
package-lock.json security: apply review fixes (RLS, Next CVE bump, hardening) 2026-06-27 21:01:50 +02:00
package.json security: apply review fixes (RLS, Next CVE bump, hardening) 2026-06-27 21:01:50 +02:00
playwright.config.ts test(pressupostos): visual regression + OG smoke for efficiency chart 2026-04-27 11:37:32 +02:00
playwright.habitatge.config.ts feat(eines): nova calculadora d'habitatge 2026-05-01 12:38:32 +02:00
playwright.production.config.ts Fix production timeouts: fragmentation ranking, contracts chart, year filter (#19) 2026-03-15 09:56:05 +01:00
postcss.config.mjs Initial commit from Create Next App 2026-03-10 13:53:58 +01:00
pw-noserver.config.ts Merge política: UI polítics, retribucions, partits, scoring polític 2026-03-23 17:38:37 +01:00
README.md docs(readme): actualitza la secció de scoring a la metodologia vigent 2026-06-10 23:02:28 +02:00
screenshot-pages.ts Salary enrichment: cobertura retribució 9.9% → 55.6% (4,282 de 8,103 posicions) 2026-03-21 01:24:35 +01:00
skills-lock.json Merge política: UI polítics, retribucions, partits, scoring polític 2026-03-23 17:38:37 +01:00
tsconfig.json feat(mcp): Menjometre-MCP — public Model Context Protocol surface 2026-04-11 21:01:19 +00:00
Untitled Merge política: UI polítics, retribucions, partits, scoring polític 2026-03-23 17:38:37 +01:00
vercel.json feat(manifest-premsa): worker — Ghost member + welcome email + hash chain 2026-06-05 12:57:54 +02:00
vitest.config.ts refactor(scripts): centralitza la normalització de slugs en un mòdul únic 2026-06-10 23:02:28 +02:00

Menjometre

Observatori independent de subvencions i contractes públics a Catalunya. Rastreja 477.000 entitats beneficiàries, 19,7M subvencions i 1,7M contractes (desglossats per lot, deduplicats per CIF), calcula una puntuació indicant anomalies de concentració i recurrència, i detecta patrons de risc en la contractació pública.

Per a la metodologia completa, consulta /metodologia.

Fonts de dades

Font Registres Període Descripció
RAISC ~19,5M 20162026 Registre d'Ajuts i Subvencions de Catalunya. Font primària. CIF, geografia (comarca/província/vegueria), jerarquia de finalitats a 3 nivells, tipus de beneficiari.
BDNS ~300K actius 20222026 Base de Datos Nacional de Subvenciones. API REST pública. CIF, organisme atorgant. Finestra mòbil de 4 anys.
Contractes.cat ~1,7M 20152026 Contractes públics via SODA API (dataset ybgg-dgi6). CIF adjudicatari, tipus de contracte, procediment, número de lot, import sense IVA. Dedup per lot i per CIF (entitats amb múltiples slugs es consoliden). Vista materialitzada contract_yearly_stats_mv per a estadístiques anuals.

Reconciliació

  • RAISC vs BDNS: els 141K registres BDNS que dupliquen RAISC (mateix bdns_code + entity_id) es marquen superseded.
  • Les dades de contractes es mantenen a la taula contracts (model de dades diferent) i no afecten la puntuació Menjometre.
  • total_public_funds = subvencions + contractes + crèdits ICF combinats per entitat.

Score Menjometre

Índex de concentració estadística (0100) basat en fins a 5 components amb pes igual entre els components disponibles per a cada entitat (versió v5.1, 2026-05-19). Cada indicador utilitza percentile rank. Un score alt no implica cap irregularitat. La configuració canònica viu a scripts/lib/scoring-config.ts.

Component Què mesura
Volum Percentil de total_public_funds (subvencions + contractes + acció concertada; crèdits ICF segregats)
Freqüència Percentil de transaccions per any d'activitat (subvencions + contractes). Requereix total_public_funds ≥ 100K (llindar de robustesa v5.1)
Dominància Percentil dins categoria primària, ponderat grants (finalitat_rais) + contractes (CPV-3). Requereix import de la categoria ≥ 100K
Concurrència Contractació amb baixa tensió competitiva. Exclou contracte menor dins llindars LCSP art. 118 (obres < 40K, serveis/subministraments < 15K); requereix import classificable ≥ 25K
Comptes anuals Transparència registral REJC (dipòsit, recència, cobertura, registre). Àmbit: entitats obligades (Art. 322-15 CCCat, Llei 4/2008) + dipòsits voluntaris

Fórmula v5: mitjana amb pes igual sobre els components disponibles — (V + F + D + C + A) / nombre de components actius. Els components que no apliquen a una entitat (per àmbit o per llindar de robustesa) s'exclouen del denominador en lloc de penalitzar.

Llindars de puntuació: 1+ transaccions i 25.000€+ en fons públics totals.

Changelog de scoring

Data Versió Canvi Motiu
Mar 2026 v1 5 components iguals (20% cadascun) Llançament
Mar 2026 v2 Eliminació HHI i Recurrència; nova Freqüència 53% entitats HHI=100, 70% Recurrència=100 — sense poder discriminant
Mar 2026 v3 Pesos 40/30/20/10; contractes integrats al score Contractes = 75% dels fons públics; volum com a senyal primari
Mar 2026 v3.1 Dominància ponderada grants + CPV-3; llindar 1 txn + 25K Entitats contract-only perdien 22 punts; CPV cobreix 90,5% contractes
Mar 2026 v3.1 Crèdits ICF separats de subvencions Préstecs reemborsables segregats de subvencions a fons perdut
Mar 2026 v3 (comptes) Comptes anuals redissenyat: model híbrid REJC, 5 senyals de transparència Àmbit restringit a obligats (prefix G) + dipòsits voluntaris
Mar 2026 v4 Nou component de Concurrència Tensió competitiva en contractació com a senyal independent
Mar 2026 v5 Pes igual entre components actius: (V+F+D+C+A) / n Pesos fixos infrarepresentaven entitats sense tots els components
Abr 2026 v5 (volum) total_public_funds incorpora acció concertada Cobertura completa de fons públics; llindar de puntuació sense canvis
Mai 2026 v5.1 Llindars de robustesa per a N baixos (Freqüència/Dominància ≥ 100K; Concurrència exclou menors LCSP i requereix ≥ 25K classificable) Percentils inestables amb imports petits generaven senyals espuris

Anàlisi de xarxa de contractes

L'script analyze-contract-network.ts detecta patrons de risc en la contractació pública:

  • Fragmentació: Contractes en el rang 14,9K15K€ (just sota el llindar de licitació pública de 15K€ sense IVA) amb 3+ contractes per òrgan = alerta de fraccionament.
  • Finançadors compartits: Identifica òrgans que atorguen tant subvencions com contractes a la mateixa entitat.
  • Adjudicació directa: Contractes amb un sol licitador (num_bidders = 1, disponible per ~388K contractes) o amb procediment de tipus Contracte menor / Negociat sense publicitat.

Classificació d'entitats

  • Persones físiques: Codi RAISC PFA → separat del ranking principal.
  • Tercer sector: Creuament amb 3 registres oficials (empreses d'inserció, centres especials de treball, entitats jurídiques socials) + heurística CIF per a forma jurídica JSA.
  • Premsa: 82 patrons de nom d'entitat + 13 paraules clau de finalitat de subvenció.
  • Fundacions / Observatoris: Detecció per nom oficial.

Stack tecnològic

  • Framework: Next.js 16 + React 19
  • Estils: Tailwind CSS 4
  • Base de dades: Supabase (PostgreSQL + PostgREST)
  • Llenguatge: TypeScript
  • Pipelines de dades: TypeScript via npx tsx
  • Node.js: 22 LTS (veure .nvmrc)

Configuració local

Requisits

  • Node.js 22 LTS (veure .nvmrc; Node 25 trenca el build de Next.js)
  • Docker (per Supabase local)
  • Supabase CLI

Variables d'entorn

cp .env.local.example .env.local
# Editar amb els valors locals de `supabase start`

Instal·lació

nvm use          # utilitza la versió de .nvmrc
npm install
npx supabase start
npx supabase migration up
npm run dev

Scripts de dades

Script Propòsit
sync-raisc.ts Importa dades RAISC via SODA API
sync-bdns.ts Importa dades BDNS via API REST
sync-contractes.ts Importa contractes públics via SODA API
reconcile-raisc-bdns.ts Marca duplicats BDNS com a superseded
seed-territorial-mapping.ts Inicialitza mapa de comarques i províncies
sync-tercer-sector.ts Classifica entitats del tercer sector
tag-premsa.ts Etiqueta entitats i subvencions de premsa
aggregate-stats.ts Agrega estadístiques per entitat
sync-convenis.ts Importa convenis via SODA API
calculate-scores-fast.ts Calcula scores Menjometre (in-memory)
calculate-scores-sql.ts Calcula scores Menjometre (pure SQL, ràpid)
analyze-contract-network.ts Anàlisi de xarxa de contractes (fragmentació, finançadors compartits)
verify-raisc.ts Verifica importació RAISC
verify-stats.ts Comprovació ràpida d'estadístiques

Ordre d'execució (refresc complet)

npx tsx scripts/seed-territorial-mapping.ts
npx tsx scripts/sync-raisc.ts --all --skip-aggregation
npx tsx scripts/sync-bdns.ts --full --skip-aggregation
npx tsx scripts/reconcile-raisc-bdns.ts
npx tsx scripts/sync-contractes.ts --full --skip-aggregation
npx tsx scripts/sync-tercer-sector.ts
npx tsx scripts/tag-premsa.ts
npx tsx scripts/aggregate-stats.ts
npx tsx scripts/calculate-scores-fast.ts
npx tsx scripts/analyze-contract-network.ts

API pública

Totes les rutes retornen JSON amb CORS habilitat. Per a la documentació completa, consulta /llms.txt.

Endpoint Descripció
GET /api/search?q={query} Cerca entitats per nom o CIF
GET /api/entity/{identifier} Perfil complet d'entitat (CIF, slug o nom)
GET /api/top?limit=10&sort_by=score&type=all&year=2024 Ranking d'entitats
GET /api/stats Resum del dataset
GET /api/equivalencies?amount=5000000 Equivalències en serveis públics
GET /api/export?format=json Exportació massiva (fins a 10K entitats)
GET /api/export/entity?identifier={slug}&type=grants&year=2024 Llista de subvencions/contractes per entitat

Com contribuir

  1. Fes un fork del repositori
  2. Clona el teu fork i crea una branca (git checkout -b feat/la-meva-funcionalitat)
  3. Assegura't que npm run build passa sense errors
  4. Envia un Pull Request al repositori original amb descripció detallada

Tests

npm run test:e2e    # 23 tests E2E (data accuracy, UI, navigation, contracts, search)

Llicència

AGPL-3.0-or-later