Feb-19-2023, 03:14 PM
(This post was last modified: Feb-19-2023, 03:34 PM by Yoriz.
Edit Reason: Google translated title, added code tags
)
bonjour,
Je reçois une résultat non qui j'attend, et je ne sais pas pourquoi ?
quand j'appel la méthode pricing_mac(self): de class HardwareGeek(EmployeeHardware): le prix ne change pas, :
quand :
kim.pricing_intel() # on passe au tarif "PC"
project_o.perform(kim, "achat matériel PC", 0.5)
kim.pricing_mac() # on passe au tarif "MAC"
project_o.perform(kim, "achat matériel MAC", 1.5)
project_o.perform(ali, "configuration matériel", 2)
project_o.perform(ali, "installation chez client", 3)
il affiche :
Kim achat matériel PC 65.00€/h 0.50h 32€
Kim achat matériel MAC 75.00€/h 1.50h 112€
Ali configuration matériel 0.00€/h 2.00h 0€
Ali installation chez client 0.00€/h 3.00h 0€
moi je veux cette affiche:
Kim achat matériel PC 65.00€/h 0.50h 32€
Kim achat matériel MAC 75.00€/h 1.50h 112€
Ali configuration matériel 50.00€/h 2.00h 100€
Ali installation chez client 50.00€/h 3.00h 150€
Ceci est mon code :
Je reçois une résultat non qui j'attend, et je ne sais pas pourquoi ?
quand j'appel la méthode pricing_mac(self): de class HardwareGeek(EmployeeHardware): le prix ne change pas, :
quand :
kim.pricing_intel() # on passe au tarif "PC"
project_o.perform(kim, "achat matériel PC", 0.5)
kim.pricing_mac() # on passe au tarif "MAC"
project_o.perform(kim, "achat matériel MAC", 1.5)
project_o.perform(ali, "configuration matériel", 2)
project_o.perform(ali, "installation chez client", 3)
il affiche :
Kim achat matériel PC 65.00€/h 0.50h 32€
Kim achat matériel MAC 75.00€/h 1.50h 112€
Ali configuration matériel 0.00€/h 2.00h 0€
Ali installation chez client 0.00€/h 3.00h 0€
moi je veux cette affiche:
Kim achat matériel PC 65.00€/h 0.50h 32€
Kim achat matériel MAC 75.00€/h 1.50h 112€
Ali configuration matériel 50.00€/h 2.00h 100€
Ali installation chez client 50.00€/h 3.00h 150€
Ceci est mon code :
from abc import ABC, abstractmethod
class InvoiceCalc:
"""
Calcul des montants à facturer
"""
__taux_tva = 0.21
__instance = None
@classmethod
def singleton(taux_tva):
if not InvoiceCalc.__instance:
InvoiceCalc.__instance = InvoiceCalc()
InvoiceCalc.__instance.__taux_tva = InvoiceCalc(taux_tva)
def __init__(self):
pass
def compute_perform(self, price, dur):
""" calcule le montant à facturer (htva, tva, ttc)
pour cet employé "emp" et
pour cette durée de prestation "dur"
avec le tarif horaire "price" = emp.price
"""
montant = dur * price
return self.compute_expense(montant)
def compute_expense(self, exp):
""" calcule et retourne le montant à facturer (htva, tva, ttc)
pour cette dépense "exp"
"""
montant = exp
tva = montant * self.__taux_tva
montant_ttc = montant + tva
return ( montant, tva, montant_ttc )
class Project:
"""
Gestion des enregistrements du temps d'un employé
sur un projet pour un client.
A ne pas modifier !
"""
def __init__(self, project="", client=""):
self.__client = ""
self.__project = project
self.__perform_l = []
self.__expense_l = []
self.__client = client
def perform(self, emp, det, dur):
if isinstance(emp, Employee):
self.__perform_l.append({
"name": emp.name,
"detail": det,
"duration": float(dur),
"price": emp.price
})
def expense(self, emp, subject, amount):
self.__expense_l.append({
"name": emp.name,
"detail": subject,
"amount": float(amount)
})
def __iter__(self):
self.index = 0
self.inv_calc = InvoiceCalc()
return self
def __next__(self):
if self.index >= len(self.__expense_l):
raise StopIteration
data = self.__expense_l[self.index]
self.index += 1
amount = data['amount']
htva, tva, ttc = self.inv_calc.compute_expense(amount)
return f'{data["detail"]},{htva},{tva},{ttc}'
#return data
def __str__(self):
# templates
header_s = \
"""
Client : {1}
Projet : {2}
"""
header_perform_s = \
"""
Détail des prestations (h, €)
"""
header_expense_s = \
"""
Détail des dépenses (€)
"""
perform_str = "{2:8} {0:26} {5:>6.2f}€/h {1:>6.2f}h {4:>6.0f}€\n"
expense_str = "{2:8} {0:26} {4:>6.0f}€\n"
title_str = "{2:^8} {0:^26} {5:^8} {1:^9} {4:^7}\n"
t_p = 0 # total prestation
t_i = 0 # total facturation
t_e = 0 # total expense
final_fs = ""
# header
final_fs += header_s.format("", self.__client, self.__project)
# body "perform"
final_fs += header_perform_s
final_fs += title_str.format("TASK", "DUR", "PERSON", "DEPT", "INV", "PRICE")
for data in self.__perform_l:
inv_c = InvoiceCalc()
to_invoice_tuple = inv_c.compute_perform(data["price"], data["duration"])
final_fs += perform_str.format(
data["detail"],
data["duration"],
data["name"],
"",
to_invoice_tuple[0],
data["price"]
)
t_p += data["duration"]
t_i += to_invoice_tuple[0]
final_fs += "\n" + perform_str.format("Total perform", t_p, "", "", t_i, 0) + "\n"
# body "expense"
final_fs += header_expense_s
final_fs += title_str.format("EXPENSE", "", "PERSON", "DEPT", "INV", "")
for data in self.__expense_l:
inv_c = InvoiceCalc()
to_invoice_tuple = inv_c.compute_expense(data["amount"])
final_fs += expense_str.format(
data["detail"],
0,
data["name"],
"",
to_invoice_tuple[0]
)
t_e += to_invoice_tuple[0]
final_fs += "\n" + expense_str.format("Total expense", 0, "", "", t_e) + "\n"
# footer
final_fs += "\n" + expense_str.format("Total général", 0, "******", "***********", t_e + t_i) + "\n"
return final_fs
class Employee(ABC):
def __init__(self, name):
self.name = name
@property
@abstractmethod
def price(self):
return self.price
#pass
@property
@abstractmethod
def department(self):
return self.department
#pass
@classmethod
def factory(self, name, function):
if function == "Geek":
return Geek(name)
elif function == "hardware":
return HardwareGeek(name)
elif function == "technical manager":
return TechnicalManager(name)
elif function == "account manager":
return AccountManager(name)
else:
raise ValueError("Unknown employee type")
#return EmployeeFake(name)
class EmployeeFake(Employee):
department = "circus"
price = 15
class EmployeeHardware(Employee):
department = "hardware"
project_o = Project("installation de deux PC", "Lehman Brothers Bank")
emp = "kim"
det = {"achat matériel MAC", "configuration matériel", "installation chez client"}#"detail"
dur = 0
project_o.perform(emp, det, dur)
detail = det
class Geek(EmployeeHardware):
price = 60
class HardwareGeek(EmployeeHardware):
price = 0
# fonction à déplacer dans la bonne classe
def pricing_intel(self):
self.price = 65
return self.price
# pass
def pricing_mac(self):
detail = {"achat matériel MAC", "configuration matériel", "installation chez client"}
if detail == "achat matériel MAC":
self.price = 75
if detail == "configuration matériel":
self.price = 50
elif detail == "installation chez client":
self.price = 50
else :self.price = 75
class TechnicalManager(EmployeeHardware):
price = 90
class AccountManager(Employee):
department = "account"
price = 100
if __name__ == '__main__':
#
# 1)
kim = Employee.factory("Kim", "hardware" ) # return HardwareGeek object
ali = Employee.factory("Ali", "hardware" ) # return HardwareGeek object
albert = Employee.factory("Albert", "technical manager") # return TechnicalManager object
sophie = Employee.factory("Sophie", "account manager") # return AccountManager object
# 2)
project_o = Project("installation de deux PC", "Lehman Brothers Bank")
# 3)
project_o.perform(albert, "réunion avec client", 1)
kim.pricing_intel() # on passe au tarif "PC"
project_o.perform(kim, "achat matériel PC", 0.5)
kim.pricing_mac() # on passe au tarif "MAC"
project_o.perform(kim, "achat matériel MAC", 1.5)
project_o.perform(ali, "configuration matériel", 2)
project_o.perform(ali, "installation chez client", 3)
project_o.perform(albert, "remise des clés", 0.5)
project_o.perform(sophie, "convention avec le client", 0.5)
# on ajoute des dépenses
project_o.expense(kim, "deux PC et accessoires", 1500)
project_o.expense(kim, "trois MAC et accessoires", 4500)
print(project_o)
# 4)
print("CSV")
project_it = iter(project_o)
while True:
try:
# iteration
csv = next(project_it)
print(csv)
except StopIteration:
# quand tous les enregistrements ont été reçus
break*merci pour l'aide*
