IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Barème évolutif par tranches / informations de schéma XML


Sujet :

C#

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Juriste
    Inscrit en
    Février 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Juriste

    Informations forums :
    Inscription : Février 2015
    Messages : 8
    Par défaut Barème évolutif par tranches / informations de schéma XML
    Bonjour,

    Je développe une méthode permettant de calculer le montant d’une taxe en fonction d’un barème à taux évolutif par tranches (progressif ou dégressif) et j’ai des questions que je me permets de soumettre aux membres.

    Je commence par vous livrer l'extrait de mon code avant d’exposer mes questions.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    // Méthode calculant le montant d'une taxe en fonction d'un barème à taux évolutif par tranches.
    public int GetAmount(double valeur) 
    {
        // Base taxable arrondie.
        int baseTaxable = (int) this.Round(valeur);
     
        // Fraction de base taxable dans chaque tranche.
        int fractionBaseTaxable;
     
        // Montant total de la taxe.
        double montantTaxe = 0;
     
        // Pour chaque tranche.
        foreach (Tranche tranche in this.Tranches)
        {
            // Si la base taxable excède la limite inférieure de la tranche.
            if (baseTaxable > tranche.LimiteInferieure)
            {
                // Détermination de la fraction de base taxable dans la tranche.
     
                // Soustraction de la limite inférieure de la tranche. 
                fractionBaseTaxable = baseTaxable - tranche.LimiteInferieure;
     
                // Si la tranche a une limite supérieure non nulle et que la base taxable excède cette limite.
                if (tranche.LimiteSuperieure != 0 && baseTaxable > tranche.LimiteSuperieure)
     
                    // Soustraction de la différence entre la base taxable et limite supérieure de la tranche. 
                    fractionBaseTaxable -= baseTaxable - tranche.LimiteSuperieure;
     
                // Calcul de taxe due au titre de la tranche, arrondissement et ajout au montant total de la taxe.
                montantTaxe += this.Round(fractionBaseTaxable * tranche.Taux);
          }
        }
     
        // Retourne le montant total de la taxe.
        return (int) montantTaxe;
    }
    Les questions que je me pose sont les suivantes :

    - l’algorithme que j’ai imaginé vous semble-t-il le meilleur pour réaliser la tâche souhaitée ? Ça fait quelques temps que je réfléchis à la meilleure approche pour réaliser ce type de calcul. J’aimerais bien savoir si certains ont imaginé d’autres solutions.

    - j’entrepose les données des barèmes à utiliser dans un fichier XML et VS me notifie le message « Impossible de trouver les informations de schéma » pour chacun des éléments du document. Est-ce simplement parce que je n’ai pas défini de schéma pour mon document XML ? Si oui, est-il recommandé de le faire ou puis-je m’en passer ?

    Merci d’avance pour votre aide.

  2. #2
    Membre Expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Par défaut
    Salut,

    pour l'algo c'est l'idée générale, mais je vois pas bien l'utilité du plafond de tranche.
    Il suffit de parcourir tes tranches dans l'ordre décroissant, et au fur et à mesure que tu descends tu "consommes" (soustrait) la partie taxée de ton total.

    Pour ton erreur de XSD je vois pas bien, j'ai jamais eu ce genre d'erreur sur la manip de fichier XML.
    Une recherche sur le web ne m'a montré que des erreurs sur le fichiers de config.
    Comment accèdes-tu à ce fichier XML ?

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Juriste
    Inscrit en
    Février 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Juriste

    Informations forums :
    Inscription : Février 2015
    Messages : 8
    Par défaut
    Citation Envoyé par jopopmk Voir le message
    Salut,

    pour l'algo c'est l'idée générale, mais je vois pas bien l'utilité du plafond de tranche.
    Il suffit de parcourir tes tranches dans l'ordre décroissant, et au fur et à mesure que tu descends tu "consommes" (soustrait) la partie taxée de ton total.
    Merci beaucoup jopopmk, c’est très aimable.

    Tu pensais à quelque chose comme ça ? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for (int i = this.Tranches.Count-1; i >= 0; i--)
    {
        if (baseTaxable > this.Tranches[i].LimiteInferieure)
        {
             montantTaxe += this.Round((baseTaxable - this.Tranches[i].LimiteInferieure) * this.Tranches[i].Taux);
             baseTaxable = this.Tranches[i].LimiteInferieure;
     
        }
    }
    J’ai également pensé à trier la liste par ordre descendant et garder le foreach.

    Pour ton erreur de XSD je vois pas bien, j'ai jamais eu ce genre d'erreur sur la manip de fichier XML.
    Une recherche sur le web ne m'a montré que des erreurs sur le fichiers de config.
    Comment accèdes-tu à ce fichier XML ?
    Voici déjà mon document XML, en cas de besoin :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    <?xml version="1.0" encoding="utf-8" ?>
    <Baremes>
      <Bareme Id="00001">
        <Tranche Num="1">
          <LimiteInferieure>0</LimiteInferieure>
          <LimiteSuperieure>6500</LimiteSuperieure>
          <Taux>0.04</Taux>
        </Tranche>
        <Tranche Num="2">
          <LimiteInferieure>6500</LimiteInferieure>
          <LimiteSuperieure>17000</LimiteSuperieure>
          <Taux>0.0165</Taux>
        </Tranche>
        <Tranche Num="3">
          <LimiteInferieure>17000</LimiteInferieure>
          <LimiteSuperieure>60000</LimiteSuperieure>
          <Taux>0.0110</Taux>
        </Tranche>
        <Tranche Num="4">
          <LimiteInferieure>60000</LimiteInferieure>
          <LimiteSuperieure>0</LimiteSuperieure>
          <Taux>0.00825</Taux>
        </Tranche>
      </Bareme>
    </Baremes>
    J’y accède avec Linq to XML par la requête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    XDocument xmlDoc = XDocument.Load(xmlDocChemin);
     
    this.Tranches = ( from tranche in xmlDoc.Descendants("Tranche")
                      where (int) tranche.Parent.Attribute("Id") == id
                      select new Tranche
                      {
                          Numero = (int) tranche.Attribute("Num"),
                          LimiteInferieure = (int) tranche.Element("LimiteInferieure"),
                          LimiteSuperieure = (int) tranche.Element("LimiteSuperieure"),
                          Taux = (double) tranche.Element("Taux")
                      }).ToList();
    Je n’ai rien trouvé de très éclairant non plus en recherchant par Google.

    Encore merci pour ton aide.

  4. #4
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    Bonsoir,

    il existe (dans le framework) un outil, XSD qui permet de générer (l'outil le fait) une classe correspondant à un "schéma" XML..

    L'avantage est qu'ainsi, tu n'as plus à parser un fichier, ou faire des requetes plus ou moins complexes, là, tu as directement
    toutes tes données XML dans une classe qui va bien... le Load et save sont aussi (si je me souviens bien) générés...

    de tel sorte qu'après XSD, tu récupéres les données de ton fichier XML transformé en classe en 4 lignes de codes

  5. #5
    Membre Expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Par défaut
    Pour le XML je te laisse avec TheMonz.

    Pour l'algo voilà comment je l'aurais fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    	public class tranche {
    		public double palier;
    		public double taux;
    		public tranche(double ppalier, double ptaux) {
    			this.palier = ppalier;
    			this.taux = ptaux;
    		}
    	}
    	public class bareme {
    		public List<tranche> tranches = new List<tranche>();
    		public bareme() {
    			this.tranches.Add(new tranche(151956, 0.45));
    			this.tranches.Add(new tranche(71755, 0.41));
    			this.tranches.Add(new tranche(26765, 0.30));
    			this.tranches.Add(new tranche(9690, 0.14));
    		}
    		public double calcul(double prevenu) {
    			double impot = 0.0;
    			foreach (tranche tra in this.tranches) {
    				double part = prevenu - tra.palier;
    				if (part > 0) {
    					impot += part * tra.taux;
    					prevenu -= part;
    				}
    			}
    			return impot;
    		}
    	}

Discussions similaires

  1. Réponses: 5
    Dernier message: 15/07/2010, 21h53
  2. [JDOM] charger un fichier et valider par un schéma XML
    Par Didine981 dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 23/02/2008, 02h03
  3. Quel éditeur pour créer des schémas XML ?
    Par hlr dans le forum Valider
    Réponses: 1
    Dernier message: 27/03/2006, 16h30
  4. Regroupement par tranche dans une requete SQL (MS SQL)
    Par AODRENN dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 21/03/2006, 13h21
  5. Réponses: 3
    Dernier message: 27/02/2006, 14h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo