Normalizza un dataset di rapporti di lavoro conforme al contratto dati:
rinomina le colonne (varianti maiuscole della pipeline e ccnl in
ccnl_warehouse), applica il perimetro contrattuale, risolve le
sentinelle sulle date, esclude i rapporti esterni alla finestra di
analisi e aggiunge le colonne derivate usate dalle funzioni analitiche.
L'input non viene mai modificato: la funzione lavora su una copia e
restituisce un nuovo data.table.
Usage
prepare_rapporti(
dt,
as_of = NULL,
window = NULL,
ccnl_key = c("codice_cnel", "ccnl_warehouse"),
chiavi_non_classificate = "CPUB",
perimetro = c("ccnl", "standard", "completo"),
tipologie = ccnlcob::tipologie_contrattuali
)Arguments
- dt
Un
data.tablecon una riga per rapporto di lavoro; vedivalidate_rapporti()per il contratto dati. Le colonneinizioefinedevono ereditare dalla classeDate(IDateaccettata: la classe viene conservata in uscita).- as_of
Data di riferimento (
Dateo stringa convertibile) per lo stato dei rapporti (attivo) e per la chiusura dei rapporti aperti;NULL(default) usa la data massima non sentinella osservata frainizioefinee non successiva alla data odierna, cioè la data di riferimento dei dati; le date di fine future (fini presunte o valori errati come2999-12-31) non concorrono al default e vengono trattate come rapporti aperti (fine > as_of).- window
Vettore di due
Date(o stringhe convertibili),c(inizio, fine), che delimita l'analisi;NULL(default) usac(min(inizio), as_of), dove il minimo è calcolato sugli avviamenti non sentinella.- ccnl_key
Colonna da usare come chiave CCNL di analisi:
"codice_cnel"(codice CNEL a 4 caratteri prodotto dacnelR) oppure"ccnl_warehouse"(codice warehouse CO). Con il default (entrambe) viene usata la prima colonna presente indt; se una colonna richiesta esplicitamente è assente la funzione produce un errore.- chiavi_non_classificate
Vettore character di valori di
ccnl_keyda trattare come non classificati (NAinccnl_key), oppureNULLper non escludere nulla. Default"CPUB": codice di comodo del bridge dicnelRper il pubblico impiego, non un CCNL misurabile. Vedi Dettagli.- perimetro
Perimetro contrattuale applicato da
filter_perimetro()prima di ogni altro trattamento:"ccnl"(default) conserva solo le tipologie di lavoro subordinato alle quali si applica un CCNL;"standard"conserva il perimetro "standard" dicnelR;"completo"non esclude nulla. Vedi Dettagli.- tipologie
Lookup delle tipologie contrattuali con le colonne
cod_tipologia_contrattuale,macro_tipologia,perimetro_ccnleesclusa_standard; default tipologie_contrattuali.
Value
Un nuovo data.table con le colonne di dt (rinominate come
descritto) e le colonne derivate elencate nei Dettagli, limitato ai
rapporti interni al perimetro che intersecano la finestra; l'attributo
ccnlcob_meta riporta i parametri e i conteggi. L'input non viene
modificato.
Details
Normalizzazione dei nomi
Le varianti maiuscole prodotte dalla pipeline COB vengono rinominate solo
se la colonna minuscola corrispondente è assente: INIZIO, FINE,
COD_TIPOLOGIA_CONTRATTUALE, COMUNE_SEDE_LAVORO, COMUNE_LAVORATORE,
RETRIBUZIONE, ORE_SETTIM_MEDIE (in ore), ETA_LAV_INIZIO (in
eta), SESSO_LAV (in sesso). La colonna sorgente ccnl (codice
warehouse) viene rinominata ccnl_warehouse se quest'ultima è assente.
Il contratto dati viene verificato dopo la rinomina.
Conversione di retribuzione e ore
Nel file rap.fst della pipeline COB retribuzione e ore sono factor
con livelli zero-padded (es. "000023671", "05"). Se presenti come
factor o character, le due colonne vengono convertite in numeric sui
livelli (as.numeric(levels(f))[f]) senza avvisi; i valori che non
rappresentano un numero diventano NA e sono conteggiati nei metadati
n_retribuzione_non_numerica e n_ore_non_numeriche (0 quando le
colonne sono già numeriche o assenti). I valori numerici non vengono
alterati: la pulizia della retribuzione è compito di
clean_retribuzione(), quella delle ore di normalize_fte().
Perimetro contrattuale
Subito dopo la verifica del contratto dati la funzione richiama
filter_perimetro() con il perimetro scelto:
"ccnl"(default) conserva i rapporti conperimetro_ccnl == TRUEnel lookup, cioè il lavoro subordinato al quale si applica un CCNL (codiciA.,F.,G.01.00,G.02.00,H.01.00,H.03.00,I.,N.); esclude collaborazioni e parasubordinati (B.), tirocini e work experience (C.), lavoro autonomo nello spettacolo (G.03.00), lavoro congiunto in agricoltura (H.02.00), associazione in partecipazione (L.), contratti di agenzia (M.) e i codici ignoti;"standard"conserva i rapporti conesclusa_standard == FALSE(perimetro dicnelR), codici ignoti inclusi;"completo"conserva tutte le righe e riproduce il comportamento delle versioni fino alla 0.2.0, che non applicavano alcun perimetro.
Le righe escluse sono conteggiate in n_dropped_perimetro e dettagliate
per tipologia in esclusi_perimetro; filter_perimetro() emette un
message() riassuntivo, sopprimibile. La data di riferimento di default
(as_of = NULL) è calcolata prima del filtro, su tutti i rapporti, così
da non dipendere dal perimetro; la finestra di default parte invece dal
primo avviamento interno al perimetro.
Chiavi non classificate
Dopo la scelta della colonna chiave, i valori elencati in
chiavi_non_classificate diventano NA in ccnl_key e confluiscono nel
gruppo "Non classificati" di rank_ccnl(); la colonna sorgente
(codice_cnel o ccnl_warehouse) conserva il codice originale e il
numero di righe interessate è riportato nel metadato
n_chiavi_non_classificate. Il default "CPUB" è il codice di comodo
assegnato dal bridge di cnelR ai rapporti del pubblico impiego: non
corrisponde a un contratto dell'archivio CNEL e cnelR lo conta fra i
non classificati. Con chiavi_non_classificate = NULL il codice resta
una chiave ordinaria.
Sentinelle sulle date
Questa è l'unica funzione del pacchetto che interviene sulle sentinelle,
con le regole di cnelR 0.6.0:
finemancante,<= 1900-01-01o> as_of(incluso9999-12-31) identifica un rapporto aperto:finediventaas_ofetroncatavale1;iniziomancante o<= 1900-01-01diventa2008-03-01(avvio del sistema delle Comunicazioni Obbligatorie) etroncata_iniziovale1;dopo le sostituzioni,
fine < inizioviene riportata ainizio(rapporto di un giorno) e conteggiata nei metadati.
Se dt contiene già troncata, il flag esistente viene combinato in OR
con quello calcolato; troncata e troncata_inizio sono integer 0/1.
Finestra di analisi
I rapporti con inizio > window[2] o fine < window[1] non
intersecano la finestra e vengono rimossi (conteggiati in
n_dropped_window). Per i rapporti rimanenti giornate conta i giorni
interni alla finestra, estremi inclusi, ed è quindi sempre >= 1.
Colonne aggiunte
ccnl_key(character): chiave di analisi scelta;NArestaNAe i valori inchiavi_non_classificatediventanoNA;perimetro_ccnl(logical): appartenenza al perimetro CCNL secondotipologie,FALSEper i codici ignoti; conperimetro = "ccnl"è sempreTRUE;troncata,troncata_inizio(integer 0/1): flag delle sentinelle;giornate(integer): giorni-contratto nella finestra, vedicompute_giornate();avviato(logical):inizio >= window[1], cioè avviamento interno alla finestra;attivo(logical): rapporto aperto alla dataas_of, con la definizione dicnelR(n_attivi):inizio <= as_ofefineoriginale, cioè prima della chiusura delle sentinelle, mancante,<= 1900-01-01o> as_of(incluso9999-12-31). Una cessazione osservata nel giornoas_of(fine == as_of) chiude il rapporto, che non è attivo; un flagtroncatapreesistente indt(fine non osservata, già chiusa a monte alla data di stabilizzazione) conta come rapporto aperto. Su una slice senzatroncatalostockdirank_ccnl()coincide quindi conn_attividicnelR. Con una finestra esplicita che termina prima dias_of, lo stock si riferisce comunque adas_of: per uno stock alla fine della finestra passareas_of = window[2];anno(integer) etrimestre(character"YYYY-Qn"): coorte di avviamento dainizio;macro_tipologia(character): macro-classe datipologie, vediclassify_tipologia();NAper i codici ignoti;orario(character):"FT"seprior == 1,"PT"seprior == 0,NAaltrimenti.
Metadati
L'attributo ccnlcob_meta del risultato è una lista con as_of,
window, ccnl_key (nome della colonna usata),
chiavi_non_classificate, perimetro, n_input (righe di dt),
n_dropped_perimetro, n_tipologia_ignota, n_chiavi_non_classificate
(righe con ccnl_key portata a NA), n_dropped_window,
n_sentinel_fine, n_sentinel_inizio, n_fine_lt_inizio,
n_retribuzione_non_numerica, n_ore_non_numeriche e
esclusi_perimetro (la tabella esclusi di filter_perimetro()).
See also
Other ingresso:
read_rapporti(),
validate_rapporti()
Examples
library(data.table)
dt <- prepare_rapporti(cob_esempio)
#> filter_perimetro(): perimetro "ccnl", esclusi 254 rapporti su 5000 (5,1%) in 4 tipologie; 0 con tipologia ignota.
attr(dt, "ccnlcob_meta")[c(
"as_of", "n_sentinel_fine", "n_fine_lt_inizio", "n_chiavi_non_classificate"
)]
#> $as_of
#> [1] "2024-12-31"
#>
#> $n_sentinel_fine
#> [1] 149
#>
#> $n_fine_lt_inizio
#> [1] 2
#>
#> $n_chiavi_non_classificate
#> [1] 56
#>
attr(dt, "ccnlcob_meta")$esclusi_perimetro
#> cod_tipologia_contrattuale
#> <char>
#> 1: C.01.00
#> 2: B.03.00
#> 3: B.04.00
#> 4: C.03.00
#> des_tipologia_contrattuale
#> <char>
#> 1: TIROCINIO
#> 2: COLLABORAZIONE COORDINATA E CONTINUATIVA
#> 3: COLLABORAZIONE OCCASIONALE SPORTIVA EX ART. 28 DEL D.LGS. 36/2021
#> 4: LAVORO O ATTIVITÀ SOCIALMENTE UTILE (LSU - ASU)
#> macro_tipologia n
#> <char> <int>
#> 1: Tirocinio 110
#> 2: Collaborazioni 90
#> 3: Collaborazioni 35
#> 4: Altro 19
dt[, .N, by = .(anno, macro_tipologia)][order(anno, -N)][1:5]
#> anno macro_tipologia N
#> <int> <char> <int>
#> 1: 2019 Tempo determinato 291
#> 2: 2019 Tempo indeterminato 222
#> 3: 2019 Somministrazione 103
#> 4: 2019 Intermittente 69
#> 5: 2019 Apprendistato 65
# finestra esplicita, chiave warehouse e nessun filtro di perimetro;
# con chiavi_non_classificate = NULL il codice CPUB resta una chiave
dt24 <- prepare_rapporti(
cob_esempio,
as_of = as.Date("2024-12-31"),
window = as.Date(c("2024-01-01", "2024-12-31")),
ccnl_key = "ccnl_warehouse",
chiavi_non_classificate = NULL,
perimetro = "completo"
)
dt24[, .(n = .N, giornate = sum(giornate)), by = ccnl_key][order(-giornate)]
#> ccnl_key n giornate
#> <char> <int> <int>
#> 1: 2638 287 45329
#> 2: 2614 168 24931
#> 3: 387 115 19717
#> 4: 0942 63 10389
#> 5: 427 64 9719
#> 6: 2138 49 8120
#> 7: 1729 38 7590
#> 8: 1489 45 7317
#> 9: 0752 41 7006
#> 10: 2861 40 6558
#> 11: 1194 44 6253
#> 12: 0100 36 5752
#> 13: 1045 24 5072
#> 14: 1214 26 4862
#> 15: 1209 33 4718
#> 16: 2826 27 4665
#> 17: 2274 24 4257
#> 18: 1883 30 4108
#> 19: 271 22 4077
#> 20: 2312 32 4069
#> 21: 1081 26 3933
#> 22: 2407 25 3705
#> 23: 1408 24 3597
#> 24: 2875 20 3245
#> 25: 1048 22 3044
#> 26: 0557 18 2939
#> 27: 2262 20 2833
#> 28: 2463 18 2770
#> 29: 527 16 2535
#> 30: 1264 17 2349
#> 31: 552 18 2116
#> 32: 1204 13 2035
#> 33: 1458 13 1854
#> ccnl_key n giornate
#> <char> <int> <int>