1
0
Fork 0
mirror of https://gitlab.com/menjometre/menjometre.git synced 2026-05-05 17:41:13 +02:00
Observatori independent de subvencions i contractes públics a Catalunya. 336.000 entitats, 19.5M registres, codi obert.
  • TypeScript 84.3%
  • PLpgSQL 12.9%
  • Shell 1.4%
  • Python 1%
  • JavaScript 0.2%
  • Other 0.2%
Find a file
2026-05-05 11:09:59 +00:00
.claude chore: actualitzar bandera de Catalunya i refinar hooks de path 2026-05-05 12:43:51 +02:00
packages/mcp refactor(rpc): rename cross-party appointment RPC to nomenament_creuat 2026-04-20 21:47:05 +02:00
public chore: actualitzar bandera de Catalunya i refinar hooks de path 2026-05-05 12:43:51 +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 Merge branch 'feat/simulador-fiscal-habitatge' into 'main' 2026-05-05 07:46:02 +00:00
src style(ui): system font fallback stack + opaque dropdown overlay 2026-05-05 11:09:59 +00:00
supabase chore(db): migration to drop editorial tables (already applied) 2026-05-04 14:11:15 +02:00
tests refactor(habitatge): preu mitjà unificat a 265.000 € 2026-05-05 11:52:25 +02:00
.gitignore chore: add workspace tooling 2026-05-05 11:17:42 +02:00
.gitlab-ci.yml Add placeholder env vars to GitLab CI build 2026-03-19 01:05:44 +01: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 feat(contribueix): expand landing page with content sections 2026-05-04 16:39:42 +02:00
package-lock.json feat(contribueix): add confetti burst on welcome page mount 2026-05-05 00:07:48 +02:00
package.json feat(contribueix): add confetti burst on welcome page mount 2026-05-05 00:07:48 +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 UI: default sort by total_amount, metodologia updates, anonymization test 2026-03-22 13:36:16 +01: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 refactor(pressupostos/efficiency): show raw direction + outcome color, drop inversion 2026-05-01 11:43:44 +02:00
vitest.config.ts feat(pressupostos/lib): add efficiency-evolution transformation layer 2026-04-27 11:01:18 +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 4 components ponderats. Cada indicador utilitza percentile rank. Un score alt no implica cap irregularitat.

Component Pes Què mesura
Volum 40% Percentil de total_public_funds (subvencions + contractes + crèdits)
Freqüència 30% Percentil de transaccions per any d'activitat (subvencions + contractes)
Dominància 20% Percentil dins categoria primària, ponderat grants (finalitat_rais) + contractes (CPV-3)
Comptes anuals 10% Compliment Art. 322-15 CCCat: dipòsit de comptes anuals (opcional, només associacions/fundacions)

Sense comptes anuals: redistribució proporcional (44,4% / 33,3% / 22,2%).

Llindars: 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

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