Rimborso della trasferta
L’ufficio amministrazione di una società di consulenza rimborsa ai dipendenti le spese delle trasferte di lavoro. Ogni nota spese arriva come due elenchi della stessa lunghezza, uno accanto all’altro: la categoria di ciascuna spesa (“treno”, “aereo”, “taxi”, “hotel”, “pasto”, “minibar”…) e il suo importo in euro, più la durata della trasferta in giorni.
Il regolamento aziendale dice tre cose. Le spese della categoria “minibar”, “alcolici” e “multa” non si rimborsano mai. Un “pasto” si rimborsa fino a 30 euro: un pranzo da 42 euro vale 30, uno da 30 esatti o meno vale quello che è costato; il limite è per ogni singolo pasto, non sul totale dei pasti. Tutte le altre spese si rimborsano per intero. Infine c’è un tetto complessivo di 150 euro per ogni giorno di trasferta: se le spese rimborsabili lo superano, si rimborsa il tetto; se ci arrivano esatte, si rimborsano tutte.
Scrivi la funzione rimborso_trasferta(categorie, importi, giorni) che restituisce gli euro da rimborsare, con due decimali. Ti serve %in% per riconoscere le categorie escluse e ! per tenere le altre. Prima di scrivere codice, scrivi tu la specifica con i casi al confine: un pasto da 30 euro esatti, una nota fatta solo di spese escluse, una nota che arriva esattamente al tetto.
categorievettore di testi — categoria di ciascuna spesa della nota, per esempio "treno", "hotel", "pasto", "minibar"importivettore di numeri — importo in euro di ciascuna spesa, stesso ordine di categoriegiorninumero — durata della trasferta in giorni
rimborso numero — euro rimborsati al dipendente, 2 decimali
rimborso_trasfertaSoluzione
| caso | categorie | importi | giorni | atteso | ottenuto |
|---|
rimborso_trasferta <- function(categorie, importi, giorni){
mai_rimborsate <- c("minibar", "alcolici", "multa")
totale <- 0
for(i in 1:length(importi)){
if(!(categorie[i] %in% mai_rimborsate)){
if(categorie[i] == "pasto" & importi[i] > 30){
totale <- totale + 30 # oltre i 30 euro paga il dipendente
}else{
totale <- totale + importi[i]
}
}
}
# il tetto dipende dalla durata della trasferta
tetto <- 150 * giorni
if(totale > tetto){
totale <- tetto
}
return(round(totale, 2))
}
rimborso_trasferta(c("treno", "hotel", "pasto", "minibar"), c(49.9, 95, 24.5, 12), 1) # 150