TRPG Agile come Provider di Dati Retributivi
TRPG Agile espone una Services API REST che permette a sistemi GRC e ESG esterni
di leggere dati di Gender Pay Gap, score di compliance UE 2023/970, metriche VSME e alert aperti.
Auth via API Key dedicata, rate limiting 100 req/ora, firma HMAC-SHA256 per webhook outbound.
Sistemi Integrabili
Disponibile
231 Agile (lg231)
Integrazione MOG D.Lgs. 231/2001 + Trasparenza Retributiva. GPG elevato → rischio Art. 25-quinquies,
compliance UE → evidenze OdV, metriche VSME → pillar formazione.
Guida integrazione lg231 →
Pianificato
AllRisk Agile
Feed rischi HR per piattaforma ERM. GPG per categoria/livello mappato su categorie
ISO 31000 — discriminazione retributiva come rischio operativo.
Pianificato
SustainAI Agile
Metriche VSME B08/B10/C5 nel report di sostenibilita' (CSRD, GRI 405).
Score parità di genere come KPI ESG dashboard.
Pianificato
HR Platform (Zucchetti / TeamSystem)
Feed bidirezionale: importa dati dipendenti in real-time, restituisce
GPG calcolato e alert soglia direttamente nel gestionale HR.
Novità v2026.03
AI Chat Agent Chat tool-use con 9 strumenti su 4 database + RAG normativa
Report AI Word Documento .docx 8 sezioni con testo AI + dati strutturati
Stampa PDF Report HTML con toolbar stampa, CSS @page A4, layout ottimizzato
PWA Installabile App nativa su desktop e mobile, aggiornamento automatico, offline
Services API
Non Conformità & Azioni
Guida lg231
Webhook
Quick Start
Base URL: https://trpg.agile.software/api/services
Auth: Header X-API-Key: trpg_xxxx
Rate limit: 100 req/ora per chiave
Caller header: X-Caller: lg231-agile/1.0 (obbligatorio)
Endpoint disponibili
Metodo Endpoint Scope Descrizione
GET
/status
—
Health check, versione API, timestamp. Nessuna autenticazione richiesta.
GET
/gpg-summary
read:gpg
GPG base e mediano, conteggio dipendenti M/F, status (ok/medium/high/critical),
flag requires_joint_assessment, alert aperti. Query: ?period=YYYY-MM
GET
/employees-summary
read:employees
Aggregati forza lavoro: totale, breakdown genere, per categoria CCNL.
Nessun dato personale — solo aggregati. Query: ?period=YYYY-MM
GET
/compliance-score
read:compliance
Score complessivo UE 2023/970 (0-100), breakdown per articolo (Art.5/6/9/10),
data ultimo assessment, status per articolo.
GET
/vsme-metrics
read:vsme
Metriche VSME: B08 (forza lavoro), B09 (salute/sicurezza), B10 (retribuzioni/GPG),
C5 (diversity). Query: ?codes=B08,B10,C5
GET
/alerts
read:gpg
Alert aperti con severity (medium/high/critical), tipo, categoria CCNL,
livello, valore GPG. Query: ?status=open&severity=high,critical
Scopes disponibili
Scope Accesso
read:all Accesso completo a tutti gli endpoint (raccomandato per lg231)
read:gpg GPG summary + alerts
read:employees Employee summary aggregato
read:compliance Compliance score + articoli UE 2023/970
read:vsme Metriche VSME
Esempio risposta /gpg-summary
// GET /api/services/gpg-summary?period=2025-01
// X-API-Key: trpg_Abc123...
{
"success" : true ,
"data" : {
"gpg_base" : 8.2 ,
"gpg_median" : 6.1 ,
"employee_count" : 150 ,
"female_count" : 62 ,
"male_count" : 88 ,
"status" : "high" ,
"period" : "2025-01" ,
"requires_joint_assessment" : true ,
"alerts_open" : 3
},
"meta" : {
"period" : "2025-01" ,
"company_id" : 5 ,
"generated_at" : "2026-03-07T10:00:00Z"
}
}
Esempio risposta /compliance-score
// GET /api/services/compliance-score
{
"success" : true ,
"data" : {
"overall_score" : 72 ,
"assessment_date" : "2026-03-01" ,
"directive" : "UE 2023/970" ,
"articles" : {
"Art. 5" : { "score" : 90 , "status" : "compliant" },
"Art. 6" : { "score" : 60 , "status" : "partial" },
"Art. 9" : { "score" : 80 , "status" : "compliant" },
"Art. 10" : { "score" : 40 , "status" : "non_compliant" }
}
}
}
Endpoint per LG231 (struttura org, KPI, azioni)
Cross-System TRPG → LG231: questi endpoint forniscono dati strutturali
per popolare organigramma, evidenze OdV Pillar 4 e widget dashboard azioni.
Metodo Endpoint Scope Descrizione
GET
/employees-summary
read:employees
Struttura organizzativa completa: totali M/F, breakdown per dipartimento ,
categoria CCNL , livello , tipo contratto. Solo aggregati, nessun dato personale.
Query: ?period=YYYY-MM
GET
/kpi-targets
read:compliance
Obiettivi retributivi e compliance: codice KPI, valore attuale, target, soglie warning/critical,
status (on_track/at_risk/off_track/achieved). Categorie: gpg, compliance, vsme, diversity, safety.
GET
/actions-dashboard
read:compliance
Riepilogo azioni correttive: totali per tipo/stato, azioni scadute, prossime scadenze, KPI associati.
Ideale per widget nella dashboard OdV di LG231.
Near Miss & VSME B09 (per LG231 e SustainAI)
Near Miss (D.L. 159/2025): mancati infortuni registrati, analizzati e comunicati al Ministero.
LG231 usa i near miss come segnale di rischio Art. 25-septies (omicidio colposo/lesioni).
SustainAI usa i near miss + INAIL per la metrica VSME B09 (salute e sicurezza).
Metodo Endpoint Scope Descrizione Consumer
GET
/near-miss-summary
read:compliance
Conteggi aggregati: totale, da analizzare, rischio alto/critico, azioni generate, per categoria, per mese.
LG231, SustainAI
GET
/near-miss-dashboard
read:compliance
Dashboard completa near miss: totali, trend, ultimi eventi, per rischio. Per widget OdV in LG231.
LG231
GET
/vsme-b09
read:vsme
Metriche VSME B09 dettagliate: infortuni, near miss, tasso frequenza/gravita', premi INAIL,
rapporto near miss/infortuni. Query: ?year=2026
SustainAI
Esempio /near-miss-summary
// GET /api/services/near-miss-summary
{
"success" : true ,
"data" : {
"total" : 12 ,
"da_analizzare" : 3 ,
"rischio_alto" : 2 ,
"rischio_critico" : 1 ,
"azioni_generate" : 3 ,
"chiusi" : 8 ,
"by_category" : [
{ "category" : "caduta" , "cnt" : 4 },
{ "category" : "urto" , "cnt" : 3 },
{ "category" : "ergonomia" , "cnt" : 2 }
],
"by_risk" : [
{ "risk_level" : "basso" , "cnt" : 5 },
{ "risk_level" : "medio" , "cnt" : 4 },
{ "risk_level" : "alto" , "cnt" : 2 },
{ "risk_level" : "critico" , "cnt" : 1 }
]
}
}
Esempio /vsme-b09 (per SustainAI)
// GET /api/services/vsme-b09?year=2026
{
"success" : true ,
"data" : {
"year" : 2026 ,
"infortuni_totali" : 3 ,
"di_cui_gravi" : 1 ,
"malattie_prof" : 0 ,
"giorni_persi" : 45 ,
"ore_lavorate" : 312000 ,
"tasso_frequenza" : 9.62 ,
"tasso_gravita" : 0.14 ,
"premio_inail" : 18500.00 ,
"near_miss_total" : 12 ,
"near_miss_critici" : 1 ,
"near_miss_alti" : 2 ,
"near_miss_con_azione" : 3 ,
"rapporto_nm_infortuni" : 4.0
}
}
Per LG231: i near miss con rischio alto/critico generano automaticamente un'azione correttiva in TRPG.
LG231 li importa come rischi HR (Art. 25-septies) via /near-miss-summary e monitora le azioni via /actions-dashboard.
Per SustainAI: l'endpoint /vsme-b09 fornisce tutte le metriche VSME B09 in un unico JSON:
infortuni + near miss + tassi + premi INAIL. Pronto per il bilancio di sostenibilita'.
Esempio /employees-summary (per organigramma)
// GET /api/services/employees-summary?period=2025-01
{
"success" : true ,
"data" : {
"total" : 150 , "female" : 62 , "male" : 88 ,
"female_pct" : 41.3 , "male_pct" : 58.7 ,
"by_department" : [
{ "department" : "Produzione" , "total" : 52 , "female" : 18 , "male" : 34 },
{ "department" : "Amministrazione" , "total" : 35 , "female" : 22 , "male" : 13 },
{ "department" : "Commerciale" , "total" : 28 , "female" : 10 , "male" : 18 },
{ "department" : "IT" , "total" : 20 , "female" : 5 , "male" : 15 },
{ "department" : "Direzione" , "total" : 15 , "female" : 7 , "male" : 8 }
],
"by_category" : [
{ "category" : "Impiegati" , "total" : 65 , "female" : 30 , "male" : 35 },
{ "category" : "Operai" , "total" : 45 , "female" : 15 , "male" : 30 },
{ "category" : "Quadri" , "total" : 25 , "female" : 10 , "male" : 15 },
{ "category" : "Dirigenti" , "total" : 15 , "female" : 7 , "male" : 8 }
],
"by_level" : [
{ "category" : "Dirigenti" , "level" : "D1" , "total" : 7 , "female" : 2 , "male" : 5 },
{ "category" : "Dirigenti" , "level" : "D2" , "total" : 8 , "female" : 5 , "male" : 3 },
{ "category" : "Impiegati" , "level" : "5-7" , "total" : 37 , "female" : 15 , "male" : 22 }
],
"by_contract" : [
{ "contract_type" : "permanent" , "total" : 120 , "female" : 50 , "male" : 70 },
{ "contract_type" : "temporary" , "total" : 20 , "female" : 8 , "male" : 12 },
{ "contract_type" : "part_time" , "total" : 10 , "female" : 4 , "male" : 6 }
]
}
}
Esempio /actions-dashboard (per widget OdV)
// GET /api/services/actions-dashboard
{
"success" : true ,
"data" : {
"totals" : {
"total" : 8 , "corrective" : 5 , "improvement" : 3 ,
"open" : 4 , "closed" : 3 , "overdue" : 1
},
"overdue" : [
{ "id" : 12 , "title" : "Piano riequilibrio Dirigenti" , "severity" : "critical" ,
"deadline" : "2025-03-01" , "action_type" : "corrective" }
],
"upcoming" : [
{ "id" : 15 , "title" : "Valutazione Congiunta Art.10 Quadri" , "severity" : "major" ,
"deadline" : "2025-06-30" , "status" : "in_progress" }
],
"kpis" : [
{ "kpi_code" : "GPG_BASE" , "kpi_name" : "GPG Base" , "current_value" : 12.3 ,
"target_value" : 5.0 , "status" : "off_track" , "direction" : "lower_is_better" },
{ "kpi_code" : "COMPLIANCE_SCORE" , "kpi_name" : "Score UE 2023/970" , "current_value" : 62 ,
"target_value" : 80 , "status" : "at_risk" , "direction" : "higher_is_better" }
]
}
}
Report API (JWT Auth)
Nota: Gli endpoint report richiedono autenticazione JWT (non API Key).
Il consulente o l'utente genera il report dalla piattaforma TRPG; i sistemi esterni possono triggerare la generazione via API.
Metodo Endpoint Descrizione
POST
/api/compliance/{cid}/report/generate
Genera report. Body: {"report_type":"gpg|compliance|vsme|biennial|transparency","format":"pdf|excel|xbrl","period":"YYYY-MM"}
GET
/api/compliance/{cid}/report/view?id={id}
Visualizza report HTML inline (per stampa/PDF dal browser). Header Content-Disposition: inline.
GET
/api/compliance/{cid}/report/download?id={id}
Scarica report come file (attachment). Formati: .html (PDF), .csv (Excel), .xml (XBRL).
GET
/api/compliance/{cid}/report/list
Lista ultimi 50 report generati per l'azienda, con URL download.
AI API (JWT Auth)
Metodo Endpoint Descrizione
POST
/api/ai/chat
Chat AI tool-use: domande su GPG, compliance, dati aziendali. 9 tool su 4 database + Knowledge Base RAG.
POST
/api/ai/analyze/{cid}
Analisi completa azienda: executive summary, punti critici, raccomandazioni AI.
POST
/api/ai/report/{cid}
Genera Report Word .docx (8 sezioni, testo AI + dati strutturati).
POST
/api/ai/kb/search
Ricerca semantica RAG nella Knowledge Base normativa (Voyage 3-lite embeddings).
Headers risposta
Header Valore
X-TRPG-API-Version1.0
X-TRPG-Company-IdID azienda (intero)
X-RateLimit-Limit100 (req/ora per chiave)
X-RateLimit-RemainingRichieste rimaste nella finestra corrente
Processi Cross-System TRPG ↔ LG231
Le non conformità retributive rilevate da TRPG generano automaticamente NC e azioni correttive
nel sistema 231. Il flusso è bidirezionale: LG231 può aggiornare lo stato delle azioni e TRPG
riflette il progresso nel compliance score.
Flusso Non Conformità (TRPG → LG231)
Trigger TRPG Non Conformità Generata Gravità Riferimento
GPG > 5% in una categoria CCNL NC retributiva di genere — obbligo valutazione congiunta Art. 10 Major Art. 25-quinquies D.Lgs. 231/01
GPG > 10% non giustificato NC critica — discriminazione retributiva sistematica Critical Art. 25-quinquies + Art. 10 UE 2023/970
GPG > 15% (alert critico) NC critica + segnalazione OdV automatica Critical Whistleblowing D.Lgs. 24/2023
Squilibrio M/F > 70/30 per categoria NC discriminazione nelle assunzioni Major Art. 25-duodecies D.Lgs. 231/01
Art. 5 non conforme (range retributivo assente) NC trasparenza pre-assunzione Major Art. 5 UE 2023/970 + D.Lgs. 125/2023
Art. 6 non conforme (info su richiesta mancante) NC diritto informazione dipendenti Major Art. 6 UE 2023/970
Art. 9 non conforme (report non pubblicato) NC reporting obbligatorio GPG Critical Art. 9 UE 2023/970
Valutazione congiunta non avviata entro 180gg NC procedura Art. 10 scaduta Critical Art. 10 UE 2023/970
Azioni Correttive Generate Automaticamente
Non Conformità Azione Correttiva Responsabile Scadenza
GPG > 5% categoria Avviare Valutazione Congiunta Art. 10 con rappresentanze sindacali HR / Consulente 30 giorni
GPG > 10% non giustificato Piano di riequilibrio retributivo con target e timeline HR Director 90 giorni
GPG > 15% critico Notifica OdV + piano emergenziale + report straordinario OdV / Compliance 15 giorni
Art. 5 non conforme Aggiornare template offerte lavoro con range retributivo HR / Recruiting 30 giorni
Art. 6 non conforme Implementare procedura informazione su richiesta dipendente HR / Legal 60 giorni
Art. 9 non conforme Generare e pubblicare report GPG annuale HR / Consulente Scadenza legale
Squilibrio M/F > 70/30 Revisione politiche assunzione + piano diversità HR Director 90 giorni
API Endpoint per NC & Azioni (X-API-Key)
Metodo Endpoint Scope Descrizione
GET
/non-conformities
read:compliance
Lista NC aperte per l'azienda. Filtri: ?severity=critical,major&status=open
GET
/corrective-actions
read:compliance
Lista azioni correttive. Filtri: ?status=open,in_progress&nc_id={id}
GET
/compliance-gaps
read:compliance
Gap analysis: articoli UE 2023/970 non conformi con dettaglio requisiti mancanti.
Esempio risposta /non-conformities
// GET /api/services/non-conformities?severity=critical&status=open
{
"success" : true ,
"data" : [
{
"id" : "NC-TRPG-2025-001" ,
"type" : "gpg_threshold" ,
"severity" : "critical" ,
"status" : "open" ,
"title" : "GPG 12.3% in categoria Dirigenti - Obbligo Art. 10" ,
"description" : "Gender Pay Gap del 12.3% rilevato nella categoria Dirigenti D1. Supera la soglia critica del 10%. Richiede piano di riequilibrio e notifica OdV." ,
"trigger" : {
"metric" : "gpg_base" ,
"value" : 12.3 ,
"threshold" : 10.0 ,
"category" : "Dirigenti D1" ,
"period" : "2025-01"
},
"legal_refs" : ["Art. 25-quinquies D.Lgs. 231/01" , "Art. 10 UE 2023/970" ],
"corrective_actions" : [
{
"id" : "CA-TRPG-2025-001" ,
"action" : "Avviare Valutazione Congiunta Art. 10" ,
"responsible" : "HR Director" ,
"deadline" : "2025-04-01" ,
"status" : "open"
},
{
"id" : "CA-TRPG-2025-002" ,
"action" : "Piano riequilibrio retributivo con target e timeline" ,
"responsible" : "HR Director" ,
"deadline" : "2025-06-30" ,
"status" : "open"
}
],
"created_at" : "2025-01-15T10:30:00Z"
}
]
}
Esempio risposta /compliance-gaps
// GET /api/services/compliance-gaps
{
"success" : true ,
"data" : {
"overall_score" : 62 ,
"gaps" : [
{
"article" : "Art. 6" ,
"score" : 40 ,
"status" : "non_compliant" ,
"missing" : [
"Procedura informazione retributiva su richiesta non implementata" ,
"Template risposta ai dipendenti non disponibile"
],
"nc_id" : "NC-TRPG-2025-003" ,
"suggested_actions" : [
"Implementare procedura Art. 6 entro 60 giorni" ,
"Formare HR su risposta richieste retributive"
]
},
{
"article" : "Art. 10" ,
"score" : 30 ,
"status" : "non_compliant" ,
"missing" : [
"Valutazione congiunta non avviata per 2 categorie con GPG > 5%"
],
"nc_id" : "NC-TRPG-2025-004" ,
"suggested_actions" : [
"Avviare valutazione congiunta per Dirigenti e Quadri" ,
"Contattare rappresentanze sindacali entro 15 giorni"
]
}
]
}
}
Integrazione LG231: Flusso Operativo
// ── Nel monitoring-ms di LG231: importa NC e azioni da TRPG ──
// 1. Leggi NC aperte
$ncs = TrpgClient::get('/non-conformities' , $apiKey, [
'status' => 'open' ,
'severity' => 'critical,major'
]);
foreach ($ncs['data' ] as $nc) {
// 2. Crea o aggiorna non conformita' in odv_non_conformities
$this->upsertNonConformity([
'source' => 'trpg_agile' ,
'source_ref' => $nc['id' ],
'category' => 'Trasparenza retributiva' ,
'severity' => $nc['severity' ],
'description' => $nc['title' ],
'legal_refs' => implode(', ' , $nc['legal_refs' ]),
'pillar' => 5 , // OdV monitoraggio
]);
// 3. Crea azioni correttive associate
foreach ($nc['corrective_actions' ] as $ca) {
$this->upsertCorrectiveAction([
'nc_source_ref' => $nc['id' ],
'source_ref' => $ca['id' ],
'description' => $ca['action' ],
'responsible' => $ca['responsible' ],
'deadline' => $ca['deadline' ],
'status' => $ca['status' ],
]);
}
}
// 4. Leggi gap compliance per evidenze OdV
$gaps = TrpgClient::get('/compliance-gaps' , $apiKey);
foreach ($gaps['data' ]['gaps' ] as $gap) {
// Aggiorna pillar 5 OdV con evidenze TRPG
$this->updateOdvEvidence([
'item_code' => 'TRPG-' . str_replace(' ' , '' , $gap['article' ]),
'compliance_score' => $gap['score' ],
'status' => $gap['status' ],
'gaps_detail' => $gap['missing' ],
]);
}
Bidirezionalità: quando LG231 chiude un'azione correttiva o aggiorna lo stato di una NC,
può notificare TRPG tramite il webhook corrective_action.completed.
TRPG aggiornerà automaticamente lo status della checklist compliance e ricalcolerà il punteggio.
Webhook Bidirezionali (LG231 → TRPG)
corrective_action.completed
Azione correttiva completata in LG231
→ TRPG aggiorna compliance score
nc.status_changed
NC chiusa o declassata in LG231
→ TRPG aggiorna alert status
odv.review_completed
OdV ha completato revisione evidenze TRPG
→ TRPG registra audit trail
Checklist Cross-System
LG231 monitoring-ms: implementare GET /api/trpg/non-conformities proxy
LG231 monitoring-ms: mapping NC TRPG → odv_non_conformities (pillar 5)
LG231 monitoring-ms: mapping azioni correttive TRPG → odv_corrective_actions
LG231 company-ms: widget NC TRPG nella company detail (badge count + lista)
LG231 risk-ms: compliance-gaps → aggiornamento risk register HR
TRPG: implementare endpoint /api/services/non-conformities
TRPG: implementare endpoint /api/services/corrective-actions
TRPG: implementare endpoint /api/services/compliance-gaps
TRPG: webhook receiver per corrective_action.completed
(opz.) Dashboard cross-system: NC aperte TRPG + NIS2 + LG231 in un'unica vista
Per l'agente Claude di lg231: questo tab descrive esattamente cosa implementare in
lg231 Agile per consumare TRPG come provider di dati di trasparenza retributiva e compliance UE 2023/970.
Perché integrare lg231 con TRPG
Dato TRPG Rilevanza D.Lgs. 231/2001
GPG > 5% non giustificato (Art.10 UE 2023/970) Rischio presupposto Art. 25-quinquies — discriminazione retributiva di genere
Squilibrio M/F per categoria > 70/30 Art. 25-duodecies — discriminazione nelle assunzioni, caporalato
Score compliance UE 2023/970 Evidenza OdV (Pillar 5 monitoraggio) — prova adempimento direttiva
Metriche VSME B10/C5 (formazione, diversity) Pillar 6 MOG — programmi di formazione e aggiornamento
Alert GPG critico (> 15%) Segnalazione automatica OdV — potenziale whistleblowing Art. 25-quinquies
Valutazione congiunta avviata (Art.10) Attivita' OdV obbligatoria — vigilanza su processo valutazione
1. Configurare TRPG nel company-ms
File: services/company-ms/public/index.php — route PATCH /companies/{id}/provider-config
// Aggiungere a $allowed in provider-config:
$allowed = [
'certisource_pat' ,
'nis2_api_key' ,
'nis2_org_id' ,
'nis2_enabled' ,
// ── Nuovo provider TRPG ──
'trpg_api_key' , // chiave da TRPG → Settings → API Keys
'trpg_company_id' , // ID azienda TRPG (intero)
'trpg_enabled' , // bool: abilitare pull automatico
'trpg_last_sync' , // ISO 8601 timestamp ultimo sync
];
2. TrpgClient (shared lib)
// File: shared/trpg-lib/src/TrpgClient.php
class TrpgClient
{
const BASE_URL = 'https://trpg.agile.software/api/services' ;
public static function get (string $endpoint, string $apiKey, array $query = []): array
{
$url = self::BASE_URL . $endpoint;
if ($query) $url .= '?' . http_build_query($query);
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true ,
CURLOPT_TIMEOUT => 10,
CURLOPT_HTTPHEADER => [
'X-API-Key: ' . $apiKey,
'Accept: application/json' ,
'X-Caller: lg231-agile/1.0' ,
],
]);
$body = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
return $code === 200 && $body
? ['success' => true , 'data' => json_decode($body, true )['data' ]]
: ['success' => false , 'http_code' => $code];
}
public static function isEnabled (array $meta): bool
{
return !empty($meta['trpg_enabled' ]) && !empty($meta['trpg_api_key' ]);
}
}
3. Sincronizzazione rischi GPG → risk-ms
Route: GET /risks/sync-from-trpg?company_id={id} nel risk-ms
// TrpgIntegrationService::syncGpgRisk()
$meta = $this->getCompanyMeta($companyId);
if (!TrpgClient::isEnabled($meta)) return ;
$gpg = TrpgClient::get('/gpg-summary' , $meta['trpg_api_key' ]);
if (!$gpg['success' ] || $gpg['data' ]['gpg_base' ] <= 5) return ;
$gpgValue = $gpg['data' ]['gpg_base' ];
$prob = match(true ) {
$gpgValue > 15 => 'very_high' ,
$gpgValue > 10 => 'high' ,
default => 'medium' ,
};
// Upsert risk in 'risks' table:
// area: 'hr'
// reato_catalog_id: (Art. 25-quinquies — discriminazione di genere)
// probability: $prob
// description: "GPG {$gpgValue}% — Direttiva UE 2023/970 Art.10"
// controls: "Compliance TRPG Agile — Valutazione Congiunta"
// source: 'trpg_agile'
// source_ref: $gpg['data']['period']
// Se GPG > 10% e requires_joint_assessment: crea whistleblowing_report
if ($gpgValue > 10 && $gpg['data' ]['requires_joint_assessment' ]) {
// category: 'Discriminazione retributiva di genere'
// severity: $gpgValue > 15 ? 'critical' : 'high'
// reported_by: 'sistema_trpg_agile'
// subject: "GPG {$gpgValue}% — Richiede Valutazione Congiunta Art.10"
}
4. Evidenze OdV → monitoring-ms
Route: POST /monitoring/import-trpg-evidence?company_id={id} nel monitoring-ms
// TrpgEvidenceService::importComplianceEvidence()
$score = TrpgClient::get('/compliance-score' , $meta['trpg_api_key' ]);
if (!$score['success' ]) return ;
$d = $score['data' ];
// Crea odv_checklist_items:
// pillar_number: 5 (OdV — monitoraggio)
// item_code: 'TRPG-UE2023-970'
// item_description: "Conformita' Direttiva UE 2023/970 — Score: {$d['overall_score']}%"
// compliance_status: $d['overall_score'] >= 70 ? 'completed' : 'in_progress'
// evidence_provided: "Report TRPG del {$d['assessment_date']}"
// source: 'trpg_agile'
// VSME → Pillar 6 (Formazione)
$vsme = TrpgClient::get('/vsme-metrics' , $meta['trpg_api_key' ], ['codes' => 'B10,C5' ]);
if ($vsme['success' ]) {
// Aggiorna mog_pillars WHERE pillar_number=6
// data.trpg_vsme_sync = { B10: ..., C5: ..., synced_at: now }
}
5. Widget TRPG nella company view
// Renderizza nel company detail del frontend lg231:
// ┌───────────────────────────────────────────┐
// │ TRPG Agile — Trasparenza Retributiva │
// │ GPG: 8.2% [!] Alto │
// │ Compliance UE 2023/970: 72% │
// │ Dipendenti: 150 (62F / 88M) │
// │ Alert aperti: 3 │
// │ [Importa Rischi] [Importa Evidenze] │
// │ [Apri TRPG Agile] │
// └───────────────────────────────────────────┘
$apiKey = $meta['trpg_api_key' ] ?? null ;
if ($apiKey && !empty($meta['trpg_enabled' ])) {
$gpg = TrpgClient::get('/gpg-summary' , $apiKey);
$score = TrpgClient::get('/compliance-score' , $apiKey);
// Mostrare gauge GPG + badge status + score compliance
// Link: https://trpg.agile.software/
}
Checklist implementazione lg231
company-ms: aggiungere trpg_api_key, trpg_company_id, trpg_enabled, trpg_last_sync a provider-config
shared: creare TrpgClient.php (curl wrapper) in shared/trpg-lib/src/
risk-ms: TrpgIntegrationService::syncGpgRisk() + route GET /risks/sync-from-trpg
risk-ms: import employee summary → rischio discriminazione se squilibrio M/F > 70/30
monitoring-ms: TrpgEvidenceService::importComplianceEvidence() + route POST /monitoring/import-trpg-evidence
monitoring-ms: whistleblowing auto se GPG > 10% + requires_joint_assessment = true
monitoring-ms: VSME B10/C5 → aggiornamento Pillar 6 MOG (formazione)
UI: widget TRPG nella company detail (gauge GPG + score + alert aperti + pulsanti azione)
(opz.) endpoint POST /api/integrations/trpg-webhook per eventi push
Nota CORS: tutte le chiamate a TRPG devono avvenire server-to-server
(PHP cURL), non da browser. TRPG non accetta origini lg231 in CORS per sicurezza delle API key.
TRPG invia notifiche push su eventi tramite webhook HTTPS firmati HMAC-SHA256.
Il sistema esterno riceve la notifica in tempo reale senza polling.
Eventi disponibili
gpg.recalculated
GPG ricalcolato per un periodo (variazione > 1%)
→ aggiorna risk HR
alert.created_critical
Nuovo alert GPG critico (> 15%) creato
→ whistleblowing OdV
assessment.joint_started
Valutazione congiunta Art.10 avviata
→ attivita' OdV
compliance.score_changed
Variazione score UE 2023/970 > 5%
→ aggiorna evidenze OdV
report.generated
Nuovo report GPG/Compliance/VSME generato
→ documento OdV
Payload webhook
// Headers inviati da TRPG:
X-TRPG-Event: gpg.recalculated
X-TRPG-Signature: sha256=abc123... ← HMAC-SHA256 del body
X-TRPG-Delivery: uuid-delivery-id
Content-Type: application/json
// Body esempio per gpg.recalculated:
{
"event" : "gpg.recalculated" ,
"company_id" : 5 ,
"period" : "2025-01" ,
"data" : {
"gpg_base" : 8.2 ,
"gpg_median" : 6.1 ,
"status" : "high" ,
"requires_joint_assessment" : true
},
"timestamp" : "2026-03-07T10:00:00Z"
}
Verifica firma HMAC (endpoint ricevente lg231)
$secret = $meta['trpg_webhook_secret' ];
$body = file_get_contents('php://input' );
$expected = 'sha256=' . hash_hmac('sha256' , $body, $secret);
$received = $_SERVER['HTTP_X_TRPG_SIGNATURE' ] ?? '' ;
if (!hash_equals($expected, $received)) {
http_response_code(401);
exit ;
}
$event = $_SERVER['HTTP_X_TRPG_EVENT' ] ?? '' ;
$payload = json_decode($body, true );
switch ($event) {
case 'gpg.recalculated' :
// sync risk HR...
break ;
case 'alert.created_critical' :
// crea whistleblowing...
break ;
case 'assessment.joint_started' :
// crea attivita' OdV...
break ;
}
Creare la prima API Key
Login su TRPG Agile con ruolo owner o editor
Vai su Settings → API Keys
Click "Nuova API Key" → nome descrittivo (es: "lg231 Integration") → scope: read:all
Copia la chiave — formato trpg_XXXX... — visibile una sola volta
Nota il Company ID dall'URL della dashboard TRPG
In lg231: salva via PATCH /companies/{id}/provider-config con trpg_api_key e trpg_company_id
Test rapido (curl)
# 1. Verifica senza auth
curl https://trpg.agile.software/api/services/status
# 2. GPG Summary
curl -H "X-API-Key: trpg_TUA_CHIAVE" \
-H "X-Caller: lg231-agile/1.0" \
"https://trpg.agile.software/api/services/gpg-summary?period=2025-01"
# 3. Compliance score
curl -H "X-API-Key: trpg_TUA_CHIAVE" \
-H "X-Caller: lg231-agile/1.0" \
"https://trpg.agile.software/api/services/compliance-score"
# 5. Employee summary (solo aggregati)
curl -H "X-API-Key: trpg_TUA_CHIAVE" \
-H "X-Caller: lg231-agile/1.0" \
"https://trpg.agile.software/api/services/employees-summary"
# 4. Alert critici
curl -H "X-API-Key: trpg_TUA_CHIAVE" \
-H "X-Caller: lg231-agile/1.0" \
"https://trpg.agile.software/api/services/alerts?severity=high,critical"
# 5. Metriche VSME
curl -H "X-API-Key: trpg_TUA_CHIAVE" \
-H "X-Caller: lg231-agile/1.0" \
"https://trpg.agile.software/api/services/vsme-metrics?codes=B08,B10,C5"
Riferimenti
App TRPG Agile https://trpg.agile.software
Gestione API Keys licenseExt.html
Specifiche OpenAPI GET /api/services/openapi.json (prossimamente)
Amministratore cristiano.benassati@gmail.com
Normativa Direttiva UE 2023/970 — Trasparenza Retributiva e Gender Pay Gap