Pour cette mission, vous disposez au départ d'un programme simple mission9.py permettant d'imprimer des factures. Ce programme comporte principalement deux classes:
Un fichier de test initiale test.py est également fournie. Exécuter ce fichier test produira l'exemple de facture suivant:
Facture PC Store - 22 novembre =================================================================================== | Description | prix HTVA | TVA | prix TVAC | =================================================================================== | laptop 15" 8GB RAM | 743.79 | 156.20 | 899.99 | | installation windows | 66.11 | 13.88 | 79.99 | | installation wifi | 45.22 | 9.50 | 54.72 | | carte graphique | 119.49 | 25.09 | 144.58 | =================================================================================== | T O T A L | 974.61 | 204.67 | 1179.28 | ===================================================================================
Partant de ce code déjà fonctionnel, l'objectif principal de cette mission est de développer des classes qui héritent de la classe Article , en offrant des fonctionnalités supplémentaires tout en restant utilisables par la classe Facture . Dans un deuxième temps, vous ajouterez aussi une méthode à la classe Facture qui exploite ces nouvelles fonctionnalités.
Votre programme final devrait être capable de calculer et générer des factures plus complets comme
Facture No 1 : Facture PC Store - 22 novembre =================================================================================== | Description | prix HTVA | TVA | prix TVAC | =================================================================================== | laptop 15" 8GB RAM | 743.79 | 156.20 | 899.99 | | installation windows | 66.11 | 13.88 | 79.99 | | installation wifi | 45.22 | 9.50 | 54.72 | | carte graphique | 119.49 | 25.09 | 144.58 | | Réparation (0.75 heures) | 46.25 | 9.71 | 55.96 | | 1 * disque dur 350 GB @ 49.99 | 49.99 | 10.50 | 60.49 | | 3 * souris bluetooth @ 15.99 | 47.97 | 10.07 | 58.04 | | 5 * adaptateur DVI - VGA @ 12.00 | 60.00 | 12.60 | 72.60 | | 2 * Java in a Nutshell @ 24.00 | 48.00 | 2.88 | 50.88 | | 5 * souris bluetooth @ 15.99 | 79.95 | 16.79 | 96.74 | =================================================================================== | T O T A L | 1306.77 | 267.22 | 1573.99 | ===================================================================================
et des bordereaux de livraison tels que celui-ci
Livraison - Facture No 1 : PC Store - 22 novembre =================================================================================== | Description | poids/pce | nombre | poids | =================================================================================== | disque dur 350 GB @ 49.99 (!) | 0.355kg | 1 | 0.355kg | | souris bluetooth @ 15.99 | 0.176kg | 3 | 0.528kg | | adaptateur DVI - VGA @ 12.00 | 0.000kg | 5 | 0.000kg | | Java in a Nutshell @ 24.00 | 0.321kg | 2 | 0.642kg | | souris bluetooth @ 15.99 | 0.176kg | 5 | 0.880kg | =================================================================================== | 5 articles | | 16 | 2.405kg | =================================================================================== (!) *** livraison fragile ***
Voici les étapes à suivre.
Chargez les fichiers mission9.py et test.py et étudiez leurs contenus. Vous disposez des classes et fonctions suivants:
Vous devrez vous-mêmes créer au moins deux classes ArticleReparation et ArticlePiece qui héritent de la classe Article, une classe Piece (utilisée par la classe ArticlePiece), ainsi que deux méthodes supplémentaires dans Facture , selon les instructions qui suivent.
Au fichier mission9.py , ajoutez une nouvelle classe ArticleReparation qui hérite de la classe Article . Cette nouvelle classe représente une prestation de réparation de durée donnée (un float, en heures).
Définissez une méthode d'initialisation avec la durée en paramètre.
Re-définissez la méthode description() pour fournir un descriptif adéquat comme Reparation (0.75 heures).
Re-définissez la méthode prix() pour calculer un coût fixe de 20 euro plus un coût variable de 35 euro/h. Pour une réparation de 0.75 heures ça donne donc un coût de 20 + 35*0.75 = 46.25 euro HTVA.
Dans le fichier test.py , ajoutez des tests pour tester cette nouvelle classe et son utilisation dans une facture. Par exemple, vérifiez que la ligne correspondant à une réparation soit affiché comme:
Facture PC Store - 22 novembre =================================================================================== | Description | prix HTVA | TVA | prix TVAC | =================================================================================== | ... | | Réparation (0.75 heures) | 46.25 | 9.71 | 55.96 | =================================================================================== | T O T A L | 1020.86 | 214.38 | 1235.24 | ===================================================================================
Créez une nouvelle classe ArticlePiece qui hérite de Article et qui représente l'achat pas d'un seul article mais d'un nombre donné d'une pièce donnée. (Par exemple, 3 souris Bluetooth à 15.99 EUR par pièce.)
Implémentez d'abord une nouvelle classe Piece qui représente la pièce dont on veut facturer plusieurs exemplaires. Elle comporte les données suivantes:
- une description (string), p.ex. 'souris bluetooth'; - un prix unitaire (float), p.ex. 15.99 Euro;
et, optionnellement
- un poids unitaire en kg (float), p.ex. 0,154 kg; - un indicateur booléen indiquant si la pièce est fragile, p.ex. un disque dur est fragile mais pas une souris; - un indicateur booléen indiquant si la pièce est à taux de TVA réduit, p.ex. les livres bénéficient de TVA réduite.
Ensuite implémentez la classe ArticlePiece qui hérite de Article
Finalement, dans le fichier test.py , ajoutez des tests pour tester ces nouvelles classes et leur utilisation dans une facture. Par exemple, vérifiez que les lignes correspondant aux articles pièces soient affichés comme:
Facture PC Store - 22 novembre =================================================================================== | Description | prix HTVA | TVA | prix TVAC | =================================================================================== | ... | | 3 * souris bluetooth @ 15.99 | 47.97 | 10.07 | 58.04 | | 2 * Java in a Nutshell @ 24.00 | 48.00 | 2.88 | 50.88 | | ... | =================================================================================== | T O T A L | 1306.77 | 267.22 | 1573.99 | ===================================================================================
Modifiez la classe Facture pour que chaque nouvelle facture reçoive un numéro séquentiel unique, qui apparait dans l'en-tête de la facture.
Dans la classe Facture, ajoutez une méthode def nombre(self,pce) qui retourne le nombre d'exemplaires d'une Piece pce dans la facture, en totalisant sur tous les articles qui concernent cette pièce. (Vous pouvez utiliser le fait que le comparateur ``==`` a été redéfinie dans la classe ``Piece`` (via la méthode magique ``__eq__`` que vous avez ajoutée).)
Dans la classe Facture, ajoutez une méthode print_livraison() qui imprime un bordereau de livraison comme
Livraison - Facture No 1 : PC store 22 octobre =================================================================================== | Description | poids/pce | nombre | poids | =================================================================================== | disque dur 350 GB (!) | 0.355kg | 1 | 0.355kg | | souris bluetooth | 0.176kg | 3 | 0.528kg | | adaptateur DVI - VGA | 0.000kg | 5 | 0.000kg | | Java in a Nutshell | 0.321kg | 2 | 0.642kg | | souris bluetooth | 0.176kg | 5 | 0.880kg | =================================================================================== | 5 articles | | 16 | 2.405kg | =================================================================================== (!) *** livraison fragile ***
Ce bordereau:
Remarquez que les détails imprimés dans ce bordereau de livraison ne concernent que les articles de type ArticlePiece; les autres articles sont ignorés. Pour faciliter le formatage du texte, vous pouvez utiliser la méthode format, déjà utilisée à plusieurs endroits dans la classe Facture. Si vous ne la connaissez pas, n'hésitez pas à chercher en-ligne comment cette méthode format fonctionne exactement. Pour implémenter la méthode print_livraison() , réutiliser un maximum de méthodes déjà existantes de la classe Facture .
Finalement, modifiez le fichier test.py pour tester votre nouvelle méthode. En particulier, vérifiez qu'un bordereau de livraison soit affiché comme:
Livraison - Facture No 1 : PC Store - 22 novembre =================================================================================== | Description | poids/pce | nombre | poids | =================================================================================== | disque dur 350 GB @ 49.99 (!) | 0.355kg | 1 | 0.355kg | | souris bluetooth @ 15.99 | 0.176kg | 3 | 0.528kg | | adaptateur DVI - VGA @ 12.00 | 0.000kg | 5 | 0.000kg | | Java in a Nutshell @ 24.00 | 0.321kg | 2 | 0.642kg | | souris bluetooth @ 15.99 | 0.176kg | 5 | 0.880kg | =================================================================================== | 5 articles | | 16 | 2.405kg | =================================================================================== (!) *** livraison fragile ***
Le diagramme de classes suivant résume les différentes classes et méthodes à implémenter lors de cette mission :
Pour cette mission, vous devez soumettre toutes les classes de votre programme dans un seul fichier mission9.py, vos classes tests dans un fichier test.py, ainsi que votre fichier README.txt qui décrit comment on peut tester votre code.
Votre fichier mission9.py doit contenir les classes Facture, Article, ArticleReparation, ArticlePiece et Piece.
Votre fichier test.py doit contenir des tests pour chacune des classes et étappes de cette mission, ainsi qu'une série d'instructions à la fin pour lancer tous les tests automatiquement lors de l'exécution du fichier.
L'exécution de votre programme mission9.py doit imprimer une facture et un bon de livraison comme illustré plus haut dans ce document.
Il est possible d'ajouter de multiples variantes d'article à ce programme. Par exemple:
On peut également ajouter des calculs supplémentaires sur les factures, par exemple un bilan des frais de main d'oeuvre. Un peu plus difficile, modifier la méthode printLivraison() de la classe Facture pour n'imprimer qu'une seule ligne par pièce qui cumule les articles correspondants, comme dans la méthode nombre() .