@@ -97,4 +97,170 @@ def check_id(idbadge):
9797
9898 @abstractmethod
9999 def stipendio (self ):
100- pass
100+ pass
101+
102+
103+ from persona import Persona
104+ from datetime import datetime
105+ import logging
106+
107+ logger = logging .getLogger (__name__ )
108+
109+
110+ class Studente (Persona ):
111+
112+ @property
113+ def matricola (self ):
114+ return self ._matricola
115+
116+ @matricola .setter
117+ def matricola (self , matricola ):
118+ self ._matricola = matricola
119+
120+ @property
121+ def corso_di_studio (self ):
122+ return self ._corso_di_studio
123+
124+ @corso_di_studio .setter
125+ def corso_di_studio (self , corso_di_sudtio ):
126+ self ._corso_di_studio = corso_di_sudtio
127+
128+ @property
129+ def alchool (self ):
130+ return self ._alchool
131+
132+ @alchool .setter
133+ def alchool (self , alchool ):
134+ self ._alchool = alchool
135+
136+ @alchool .deleter
137+ def alchool (self ):
138+ self ._alchool = list ()
139+
140+ @property
141+ def esami (self ):
142+ return self ._esami
143+
144+ @esami .setter
145+ def esami (self , esami ):
146+ self ._esami = esami
147+
148+ def __init__ (self , nome : str , cognome : str , sesso : bool , peso : int , data_di_nascita : datetime , matricola : int ,
149+ corso_di_studio : str , alchool : list , esami : dict ):
150+ """
151+ Metodo init per la creazione di uno studente
152+ :param nome: nome dello studente, deve essere di tipo str.
153+ :param cognome: cognome dello studente, deve essere di tipo str.
154+ :param sesso: sesso dello studente, deve essere True per maschio False per le femmina.
155+ :param peso: peso dello studente, deve essere un intero.
156+ :param data_di_nascita: data di nascita dello studente, deve essere di tipo datetime.
157+ :param matricola: matricola dello studente, deve essere un intero.
158+ :param corso_di_studio: cordo di studio dello studente, deve essere una stringa.
159+ :param alchool: lista di bevande consumate dallo studente, deve essere una lista di tuple di lunghezza due, al
160+ primo posto il tasso alcholico della bevanda e al secondo il volume della bevanda e.g. [(14, 200), (30, 50)]
161+ si nota che il primo membro della tupla e` una percentuale quiindi i valori devono essere compresi tra 0 e 100.
162+ :param esami: dizionario degli esami conseguiti dallo studente, il dizionario deve avere come chiave il nome
163+ dell'esame e come valore la tupla (crediti, voto, lode), dove crediti e voto sono interi e il voto deve essere
164+ compreso tra 18 e 30, mentre lode e` un boolean, si nota che la lode non puo` essere assegnata se il voto non
165+ e` 30.
166+ """
167+
168+ for e in esami .values ():
169+ assert isinstance (e , tuple )
170+ assert len (e ) == 3
171+ assert isinstance (e [0 ], int ) and isinstance (e [1 ], int ) and isinstance (e [2 ], bool )
172+ assert 18 <= e [1 ] <= 30
173+ assert e [1 ] != 30 and e [3 ] is True
174+ assert isinstance (nome , str )
175+ assert isinstance (cognome , str )
176+ assert isinstance (data_di_nascita , datetime )
177+ for a in alchool :
178+ assert isinstance (a , tuple )
179+ assert len (a ) == 2
180+ assert 0 <= a [0 ] <= 100
181+
182+ super ().__init__ (nome , cognome , data_di_nascita , sesso , peso )
183+ self ._matricola = matricola
184+ self ._corso_di_studio = corso_di_studio
185+ self ._alchool = alchool
186+ self ._esami = esami
187+
188+ def __eq__ (self , other ):
189+ """
190+ funziona equal che paragona se due studenti sono uguali usando il numero matricola.
191+ :param other: oggetto di tipo persona
192+ :return: True se i due oggetti Studente hanno la stessa matricola altrimenti False.
193+ """
194+ return True if self ._matricola == other .matricola else False
195+
196+ def __str__ (self ):
197+ return str (f"Studente { self ._nome } { self ._cognome } , matricola { self ._matricola } , iscritto al corso di studio"
198+ f"{ self ._corso_di_studio } " )
199+
200+ def calcolo_media_esami (self ):
201+ """
202+ metodo che calcola la media degli esami.
203+ :return: ritorna la media degli esami.
204+ """
205+ crediti_totali = sum (map (lambda x : x [0 ], self ._esami .values ()))
206+ media = sum (map (lambda x : x [0 ] * x [1 ], self ._esami .values ())) / crediti_totali
207+ return media
208+
209+ def calcola_tasso_alcolemico (self ):
210+ """
211+ metodo che calcola il tasso alcolemico.
212+ :return: ritornoa il tasso alcolemico.
213+ """
214+ coefficente_difusione = 0.73 if self ._sesso else 0.66
215+ sum_beverage = sum (map (lambda x : x [0 ] * x [1 ], self ._alchool ))
216+ return sum_beverage * 0.008 * 1.055 / (coefficente_difusione * self ._peso )
217+
218+
219+ from persona import Lavoratore
220+
221+
222+ class LavoratorePiva (Lavoratore ):
223+ def __init__ (self ,nome , cognome , data_nascita , sesso , peso , idbadge , mansione ,tariffa_gg , ore_lavorate ):
224+ super ().__init__ (nome , cognome , data_nascita , sesso , peso , idbadge , mansione , tariffa_gg , ore_lavorate )
225+ self ._tariffa_gg = tariffa_gg
226+ self ._ore_lavorate = ore_lavorate
227+ logger .info ("E' stato inserito un lavoratore con P.iva." )
228+
229+
230+
231+
232+ def __str__ (self ):
233+ return super ().__str__ () + ' ' + self ._tariffa_gg + ' ' + self ._ore_lavorate
234+
235+ def __eq__ (self , other ):
236+ if isinstance (other , LavoratorePiva ):
237+ if super ().__eq__ (other ) and other ._tariffa_gg == self ._tariffa_gg and other ._ore_lavorate == self ._ore_lavorate :
238+ return True
239+ return False
240+
241+ def get_tariffa_gg (self ):
242+ return self .get_tariffa_gg
243+
244+ def set_tariffa_gg (self ,x ):
245+ if x <= 0 :
246+ raise ('Tariffa non valida!' )
247+ else :
248+ self ._tariffa_gg = x
249+
250+ def get_ore_lavorate (self ):
251+ return self .get_ore_lavorate
252+
253+ def set_ore_lavorate (self ,x ):
254+ if x < 0 :
255+ raise ('Ore lavorate non può essere negativo!' )
256+ elif x == 0 :
257+ raise ('Nessuna ora di lavoro' )
258+ else :
259+ self ._ore_lavorate = x
260+
261+
262+
263+ def calcola_stipendio (self ):
264+ stipendio = sum (map (lambda x : x [0 ] + x [1 ], self ._tariffa_gg .values (),self ._ore_lavorate .values ()))
265+ return stipendio
266+
0 commit comments