- TypeScript 84.3%
- PLpgSQL 12.9%
- Shell 1.4%
- Python 1%
- JavaScript 0.2%
- Other 0.2%
| .claude | ||
| packages/mcp | ||
| public | ||
| reference/jongonzlz | ||
| rollbacks | ||
| scripts | ||
| src | ||
| supabase | ||
| tests | ||
| .gitignore | ||
| .gitlab-ci.yml | ||
| .nvmrc | ||
| design.md | ||
| eslint.config.mjs | ||
| LICENSE | ||
| next.config.ts | ||
| package-lock.json | ||
| package.json | ||
| playwright.config.ts | ||
| playwright.habitatge.config.ts | ||
| playwright.production.config.ts | ||
| postcss.config.mjs | ||
| pw-noserver.config.ts | ||
| README.md | ||
| screenshot-pages.ts | ||
| skills-lock.json | ||
| tsconfig.json | ||
| Untitled | ||
| vercel.json | ||
| vitest.config.ts | ||
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 | 2016–2026 | 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 | 2022–2026 | Base de Datos Nacional de Subvenciones. API REST pública. CIF, organisme atorgant. Finestra mòbil de 4 anys. |
| Contractes.cat | ~1,7M | 2015–2026 | 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 marquensuperseded. - 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 (0–100) 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,9K–15K€ (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
- Fes un fork del repositori
- Clona el teu fork i crea una branca (
git checkout -b feat/la-meva-funcionalitat) - Assegura't que
npm run buildpassa sense errors - 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