Pour cette mission, vous disposez au départ d'un programme simple permettant d'imprimer des factures. Ce programme comporte principalement deux classes: l'une représente un Article, c'est-à-dire une ligne dans la facture; l'autre représente une Facture sous forme d'une liste d'articles et offre des méthodes permettant de l'imprimer.
Une classe de test initiale Test est également fournie, elle produit 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 | ===================================================================================
Une version plus étendue de cette classe de test est également fournie; elle vous permettra de tester les extensions que vous devez développer.
Votre objectif principal est de développer des classes qui étendent 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 complet devrait être capable de calculer et générer des factures et bons de livraison tels que celui-ci:
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 | | 1 * disque dur 350 GB @ 49.99 | 49.99 | 10.50 | 60.49 | | 3 * souris bluetooth @ 15.99 | 47.97 | 10.07 | 58.04 | | Réparation (0.75 heures) | 46.25 | 9.71 | 55.96 | | 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 | =================================================================================== 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 ***
Voici les étapes à suivre:
Chargez les fichiers et étudiez leurs contenus. Vous disposez des fichiers suivants:
Vous devrez vous-mêmes créer au moins deux classes ArticleReparation et ArticlePiece qui étendent Article, une classe Piece , ainsi que deux méthodes supplémentaires dans Facture , selon les instructions qui suivent.
Créez une nouvelle classe "Piece" qui représente une pièce que l'on peut facturer. Elle comporte les données suivantes:
- une description (string), p.ex. 'souris bluetooth';
- un prix unitaire (float), p.ex. 15.99 Euro;
- 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.
Ajoutez une méthode d'initialisation permettant d'initialiser toutes ces données. Cette méthode d'initialisation doit aussi être utilisable avec seulement deux paramètres (description, prix) pour les pièces de poids négligeable, non fragiles et à taux de TVA normal.
Ajoutez des méthodes accèsseurs (méthodes description() , prix() , poids() , fragile() , tva_reduit()) pour toutes ces données.
Ajoutez une méthode magique __eq__ afin que deux pièces sont considérées égales ( == ) si elles ont la même description et le même prix (les autres données sont ignorées pour la comparaison).
Dans la classe Facture, ajoutez une méthode printLivraison() 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: * imprime une en-tête avec la description de la facture; * imprime toutes les pièces dans la facture avec, pour chacune, sa description, son poids unitaire, le nombre facturé et le poids correspondant; * ajoute une marque dans la description des pièces fragiles; * totalise et imprime à la fin le nombre d'articles, le nombre de pièces et le poids total; * imprime un message supplémentaire si (et seulement si) la livraison contient une ou plusieurs pièces fragiles.
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 printLivraison() , réutiliser un maximum de méthodes déjà existantes dans la classe Facture .
Finalement, modifiez la classe TestFactureInitial ou créez une nouvelle classe teste TestFactureEtape5 pour tester votre nouvelle méthode.
Pour cette mission, vous devez soumettre toutes les classes de votre programme dans un 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, Piece et ArticlePiece.
Votre fichier test.py doit contenir soit votre classe TestFactureInitial modifiée, soit les classes TestFactureInitial, TestFactureEtape1, TestFactureEtape3 et TestFactureEtape5, 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 illustrer 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() .