Guida processo

Essentials consulting/IT italiano (HR admin)

Certificazioni scadenza + multi-CCNL + employment type/P.IVA/IBAN per consulting/IT 50-500 FTE.

Essentials consulting/IT italiano (HR admin)

Ultimo aggiornamento: 2026-05-25 Owner: Product Writer Audience: hr_admin, admin tenant, owner

Scopo

Spiegare le 3 funzioni Horis pensate specificamente per il segmento consulting/IT italiano 50-500 FTE: tracciamento certificazioni con scadenza, multi-CCNL versioning, employment type / P.IVA / IBAN. Senza queste tre, un'app HR è poco utilizzabile in body rental, staff augmentation e per la vendita di profili a clienti.

Concetti chiave

  • Certificazione: differente da una skill. Ha ente emittente, codice credenziale unico (verificabile pubblicamente), data emissione e scadenza. Es. AWS Solutions Architect Associate, PMP, ITIL Foundation. In consulting si vincono o perdono gare per certificazioni scadute o assenti.
  • Mapping certificazione → skill (CV_ENTITY_GRAPH_01 W02): la tabella catalogo hr_certification_skill_map collega pattern di certificazione alle skill del tenant (es. CKA → Kubernetes, PMP → Project Management) con un peso. Seedata per ~15 cert top via migration 0086 (risolve gli id per tenant, zero orfani); alimenta l'espansione skill del Talent Partner (W03).
  • CCNL: contratto collettivo nazionale di lavoro. Per consulting/IT italiano i piu' frequenti sono Metalmeccanici Industria, Commercio (Confcommercio), Studi Professionali (Confprofessioni). Il catalog Horis e' platform-wide (i CCNL sono nazionali, non per-tenant) con seed di 6 CCNL principali.
  • Employment type: distinzione strutturata fra dipendente, freelance con P.IVA, co.co.co., apprendista, stagista, tirocinante. Senza, body rental e staff aug non distinguono costi/margine.
  • P.IVA italiana: 11 cifre numeriche. Obbligatoria solo se employment_type='freelance_p_iva', vietata altrimenti (vincolo DB).

Prerequisiti

  • ruolo: owner, admin, hr_admin
  • migrations applicate sul progetto Supabase del tenant:
  • 0082_hr_user_certifications.sql
  • 0083_hr_ccnl_catalog.sql
  • 0084_organization_user_details_employment.sql

Accesso rapido

  • Gestione profilo dipendente: /workspace/hr/people → seleziona utente
  • API:
  • GET /api/profile/me/certifications (proprie)
  • GET /api/people/{userId}/certifications (HR scope)
  • GET /api/ccnl-catalog (catalog CCNL leggibile a tutti gli autenticati)
  • PATCH /api/profile/me (campi self: vatNumber, iban, oltre a anagrafica)
  • PATCH /api/people/{userId}/profile (campi HR: employmentType, ccnlId, ccnlLevel, ccnlClassification, ccnlApprenticeship)

1. Certificazioni con scadenza

Campi

  • name — nome certificazione (es. "AWS Solutions Architect Associate")
  • issuer — ente emittente (es. "Amazon Web Services")
  • credential_code — codice/ID univoco emittente (verifica)
  • credential_url — link verifica pubblico (Credly, AWS validation, ecc.)
  • issued_at / expires_at — date (entrambe nullable)
  • statusactive | expired | revoked
  • notes — testo libero

Status calcolato lato UI (helper `deriveExpiryStatus`)

  • no_expiry — certificazione lifetime
  • active — scade tra >90gg
  • watch — scade tra 30 e 90gg (giallo)
  • expiring_soon — scade tra 0 e 30gg (arancione)
  • expired — scaduta (rosso)

Permessi

  • Lettura / scrittura proprie: ogni utente autenticato sulle proprie via /api/profile/me/certifications/*
  • Lettura / scrittura altrui: HR admin / owner / admin tenant via /api/people/{userId}/certifications/*, con check canEditProfile (riusato dal flusso anagrafica)

Out of scope iniziale (deferred)

  • Reminder email automatici su scadenza (programma futuro con cron orario riusabile)
  • Integrazione Credly / AWS Credential Manager / LinkedIn Learning
  • Dashboard HR "certificazioni in scadenza per team/azienda"

2. Multi-CCNL con classificazione

Catalog

Tabella hr_ccnl_catalog platform-wide, read open a tutti gli autenticati, write solo via service-role / SQL Studio.

Seed iniziale (6 CCNL piu' frequenti consulting/IT italiano):

| Code | Nome | Aree tipiche | |---|---|---| | metalmeccanici-industria | Metalmeccanici Industria (Federmeccanica + Assistal) | IT services, system integrator | | commercio | Terziario Distribuzione Servizi (Confcommercio) | Consulting management, ufficio | | studi-professionali | Studi Professionali (Confprofessioni) | Body rental piccole societa' | | cooperative-sociali | Cooperative Sociali | Cooperative HR/IT | | terziario-confesercenti | Terziario, Distribuzione e Servizi (Confesercenti) | Consulting/agenzie | | industria-chimica-farmaceutica | Industria Chimica e Farmaceutica (Federchimica/Farmindustria) | IT pharma |

Campi su `organization_user_details`

  • ccnl_id — FK opzionale al catalog
  • ccnl_level — livello classificazione (es. "5°", "Quadro A1")
  • ccnl_classification — qualifica/mansione free-text (es. "Tecnico Specialista", "Capo Reparto")
  • ccnl_apprenticeship — flag boolean, regime apprendistato

Permessi

Editabili da HR admin / manager / admin / owner (NON self — e' dato di gestione contrattuale, non PII).

Out of scope iniziale (deferred)

  • API CRUD del catalog (Platform owner UI)
  • Versioning storico CCNL (rinnovi contrattuali)
  • Calcolo stipendiale automatico per livello

3. Employment type / P.IVA / IBAN

Enum `employment_type` (default `employee`)

| Valore | Descrizione | |---|---| | employee | Dipendente standard | | freelance_p_iva | Collaboratore con P.IVA (richiede vat_number 11 cifre) | | co_co_co | Collaborazione coordinata e continuativa | | apprendista | Regime apprendistato (durata limitata, retribuzione ridotta) | | stagista | Stage curriculare (no obbligo retributivo) | | tirocinio_extracurriculare | Tirocinio extracurriculare (obbligo retributivo minimo regionale) |

`vat_number` — P.IVA italiana

  • Obbligatoria SOLO se employment_type='freelance_p_iva', vietata altrimenti (check constraint DB).
  • Formato: 11 cifre numeriche.
  • Self-only: solo il dipendente puo' inserirla dal proprio profilo (PII finanziaria).

`iban`

  • Formato regex generale: ^[A-Z]{2}[0-9A-Z]{13,32}$ (validazione checksum Modulo-97 demandata al frontend o future iteration).
  • Self-only: come VAT.

Permessi

  • employment_type editabile da HR / manager / admin / owner
  • vat_number + iban editabili solo dal dipendente (self) dal proprio profilo

Out of scope iniziale (deferred)

  • VAT estere (EU cross-border B2B)
  • Validazione checksum IBAN Modulo-97 server-side
  • Regime fiscale (forfetario vs ordinario)
  • Calcolo costo aziendale automatico su employment_type

Sicurezza & GDPR

  • hr_user_certifications RLS bloccata totalmente, accesso solo via service-role admin client + check applicativo canEditProfile. Audit-tracked (created_by_user_id).
  • hr_ccnl_catalog RLS attiva con policy read-for-authenticated (catalog pubblico interno). Write solo via service-role (Platform owner / SQL).
  • organization_user_details.vat_number e iban sono PII finanziaria self-only. Tentativo HR di scrivere → 403 pii_field_restricted.
  • Tutte le scritture su organization_user_details passano da profile-service.upsertProfileBasicsFor con check source (self|hr_admin|manager).

Cosa NON c'e' (ancora — backlog programma successore)

  • UI consolidata su /workspace/hr/people + /workspace/profile (ora le API funzionano via curl/Postman; UI dedicata in programma futuro)
  • Reminder email scadenza certificazioni
  • Catalog CCNL editabile da UI Platform owner
  • Calcolo costo aziendale automatico
  • Validation checksum IBAN

Programma di provenienza

  • HORIS_CONSULTING_QUICK_WINS_01 (2026-05-25) — 4 wave: W01 certificazioni backend, W02 multi-CCNL catalog backend, W03 employment_type/P.IVA/IBAN backend, W04 wiki bilingue + closure.

Guide correlate