menu
  Home  ==>  articles  ==>  admin  ==>  simulateur_charges_tns   

Simulateur de Charges TNS - John COLIBRI.
calcul ds charges sociales d'un gérant majoritaire

  • résumé : calculateur des charges sociales pour un travailleur indépendant
  • mots clé : charges sociales, TNS, travailleur non salarié, gérant majoritaire, cotisations sociales, maladie, allocations familiales, retraite, complémentaire, csg, rds, csg crds non déductible
  • matériel utilisé : intel i3-8100, 3.6 gHz, 8GB memory, 128 G and 1 T hard disc
  • logiciel utilisé : Windows 10 pro 64 bit, Delphi 7
  • champ d'application : Delphi 1 à 7, 2006 à 2010, Xe_nnn, Seattle, Tokyo, Berlin, Delphi 10.3
  • niveau : développeur Delphi
  • plan :


1 - Charges Sociales TNS

Nous sommes actuellement (depuis 1980 !) en SARL. Pour comparer avec d'autres formes juridiques, nous souhaitions pouvoir comparer les diverses charges sociales.

Cet article va donc permettre de calculer les charges sociales d'un TNS (Travailleur Non Salarié)




2 - Principe

2.1 - Les Paramètres

Nous avons placés les paramètres des charges dans un fichier .TXT ce qui permettra de faire les calculs si les taux changent

 
          // --- plafond et taux 2019>
plafond_secu 40524
plafond_retraite_2 37960
maladie_T1 7,20 maladie_T2 2,20 maladie_T3 0,85
allocations_T1 3,10
retraite_1 17,75 retraite_2 7,00 retraite_complementaire 8,00
formation_professionnelle 0,25
csg_crds_non_déductible 2,90 csg_déductible 6,80



2.2 - Les règles de calcul

  • la majorité des règles utilise le plafond de la sécurité sociale avec des taux différents pour la partie du salaire net inférieur ou supérieure à ce plafond ou à ses multiples

  • pour la maladie et les allocations familales, la loi a prévu un texte qui fleure bon le choc de simplification:

     
    • I.-En application des articles L. 621-1 et L. 621-3, le taux de la cotisation d'assurance maladie et maternité des travailleurs indépendants qui ne relèvent pas des articles L. 640-1 et L. 723-1 fait l'objet d'une exonération et d'une réduction supplémentaire lorsque le montant annuel de leur revenu d'activité est inférieur à 40 % de la valeur annuelle du plafond déterminée conformément à l'article D. 613-2.

      Le taux prévu à l'alinéa précédent est déterminé selon la formule suivante :

        Taux = [(T1-T2)/ (1,1 × PSS)] × r + [(T2-T3)/ (0,4 × PSS) × r] + T3

      où :

      • T1 est égal au taux de cotisation fixé au I de l'article D. 621-1 ;
      • T2 est égal à 2,2 % ;
      • T3 est égal à 0,85 % ;
      • PSS est la valeur annuelle du plafond de la sécurité sociale déterminée conformément à l'article D. 613-2 ;
      • r est le revenu d'activité, tel que défini à l'article L. 131-6.

    • II.-En application de l'article L. 621-3, lorsque le montant annuel de leur revenu d'activité est compris entre 40 % et 110 % de la valeur annuelle du plafond de la sécurité sociale déterminée conformément à l'article D. 613-2, le taux de la cotisation d'assurance maladie et maternité des travailleurs indépendants qui ne relèvent pas des articles L. 640-1 et L. 723-1 est déterminé, selon la formule suivante :

        Taux = [(T1-T2)/ (1,1 × PSS)] × r + T2

      où :

      • T1 est égal au taux de la cotisation fixé au I de l'article D. 621-1 ;
      • T2 est égal à 2,2 % ;
      • PSS est la valeur annuelle du plafond de la sécurité sociale déterminée conformément à l'article D. 613-2 ;
      • r est le revenu d'activité, tel que défini à l'article L. 131-6.
     

    En français clair, un taux minimal plus une fraction dépendant de l'écart par rapport au plafond de la sécu




3 - Le Projet Delphi de calcul de charges

3.1 - La classe de calcul

Voici la définition de la classe de calcul:

Type c_calcul_charges_sarl=
         Class(c_stringlist)
           m_titleString;
           m_month_countInteger;

           m_c_key_listm_c_value_listtStringList;

           Constructor create_calcul_charges_sarl(p_namep_pathp_file_nameString);

           Function f_amount(p_keyString): Double;
           Function f_rate(p_keyString): Double;
           Procedure load_parameters;
           Procedure display_parameters;
           Procedure compute_charges(p_salaire,
               p_cotisations_sociales_obligatoire_precedentesDouble);

           Destructor DestroyOverride;
         End// 

Notez que

  • au début nous avions utilisé des champs spécifiques: m_plafond_sécu, m_taux_maladie_T1 etc. Mais comme ces rubriques changent sans cesse, il fallait renommer ou créer de nouveaux champs à chaque fois. L'utilisation de tStringList a résolu le problème
  • nous avons utilisé deux tStringList parallèles: une pour les clés, une pour les valeurs. Il aurait été possible d'utiliser un tIniFile


3.2 - Le chargement des paramètres

Simplement la lecture du fichier .TXT pour initialiser les champs de c_calcul_charges_sarl

Procedure c_calcul_charges_sarl.load_parameters;

  Procedure _add_key_value(p_keyp_valueString);
    Begin
      m_c_key_list.Add(p_key);
      m_c_value_list.Add(p_value);
    End// _add_key_value

  Var l_keyl_valueString;

  Begin // load_parameters
    stop_if_empty;
    display(m_c_stringlist.Text);

    While Not f_end_of_file Do
    Begin
      If Not f_is_blank_or_comment
        Then Begin
            l_key:= f_next_valuel_value:= f_next_value;
            _add_key_value(l_keyl_value);
          End
        Else
          If m_title''
            Then m_title:= m_trimmed_line
            Else _add_key_value('','');

      read_line;
    End// while not f_end_of_file
  End// load_parameters



3.3 - Les calculs

En fait que des règles de trois:

Procedure c_calcul_charges_sarl.compute_charges(
    p_salairep_cotisations_sociales_obligatoire_precedentesDouble);
  Var l_totalDouble;

  Procedure _display(p_namep_thresholdString;
      p_basep_ratep_valuep_category_totalDouble);
    Var l_category_totalString;
    Begin
      p_value:= p_valuem_month_count;

      If p_category_total= 0
        Then l_category_total:= ''
        Else l_category_total:= Format('  %10.2f', [p_category_total]);

      l_total:= l_totalp_value;
      display(Format('%-31s %-14s %10.2f %5.2f %10.2f %s ',
          [p_namep_thresholdp_basep_rate* 100, p_valuel_category_total]));
    End// _display

  Procedure _compute_maladie;
    Var l_valuel_rateDouble;
    Begin
      If p_salaire< 0.40* f_amount('plafond_secu')
        Then Begin
            l_rate:= (f_rate('maladie_T1')- f_rate('maladie_T2'))/
                    (1.10* f_amount('plafond_secu'))* p_salaire
                + (f_rate('maladie_T2')- f_rate('maladie_T3'))/
                    (0.40* f_amount('plafond_secu'))* p_salaire
                + f_rate('maladie_T3');
            l_rate:= l_rate/ 100;
            l_value:= p_salairel_rate;
            _display('maladie_1''< 0.4* pss'p_salairel_ratel_value, 0);
          End
        Else
          If p_salaire< 1.10* f_amount('plafond_secu')
            Then Begin
                l_rate:= (f_rate('maladie_T1')- f_rate('maladie_T2'))/
                      (1.10* f_amount('plafond_secu'))* p_salaire
                    + f_rate('maladie_T2') ;
                l_rate:= l_rate/ 100;
                l_value:= p_salairel_rate;
                _display('maladie_1''< 1.1* pss'p_salairel_ratel_value, 0);
              End
            Else Begin
                l_rate:= f_rate('maladie_T1');
                l_rate:= l_rate/ 100;
                l_value:= p_salairel_rate;
                _display('maladie_1''> 1.1* pss'p_salairel_ratel_value, 0);
              End;
    End// _compute_maladie

  Procedure _compute_allocations;
    Var l_valuel_rateDouble;
    Begin
      If p_salaire< 1.10* f_amount('plafond_secu')
        Then Begin
            display('no_alloc');
          End
        Else
          If (p_salaire>= 1.10* f_amount('plafond_secu'))
              And (p_salaire< 1.40* f_amount('plafond_secu'))
            Then Begin
                l_rate:= f_rate('allocations_T1')/ (0.30* f_amount('plafond_secu'))*
                    (p_salaire- 1.10*  f_amount('plafond_secu')) ;
                l_rate:= l_rate/ 100;
                l_value:= p_salairel_rate;
                _display('alloc_2''1.1 1.4 pss'p_salairel_ratel_value, 0);
              End
            Else
              If (p_salaire>= 1.40* f_amount('plafond_secu'))
                Then Begin
                    l_rate:= f_rate('allocations_T1')/ 100;
                    l_value:= p_salairel_rate;
                    _display('alloc_3''> 1.4 pss'p_salairel_ratel_value, 0);
                  End;
    End// _compute_allocations

  Procedure _compute_retraite_base;
    Var l_basel_ratel_valueDouble;
    Begin
      l_base:= Min(p_salairef_amount('plafond_secu'));
      l_rate:= f_rate('retraite_base_1')/ 100;
      l_value:= l_basel_rate;
      _display('retraite_1''< pss'l_basel_ratel_value, 0);

      l_base:= p_salairef_amount('plafond_secu');
      If l_base> 0
        Then Begin
            l_rate:= f_rate('retraite_base_2')/ 100;
            l_value:= l_basel_rate;
            _display('retraite_2''> pss'l_basel_ratel_value, 0);
          End;
    End// _compute_retraite_base

  Procedure _compute_retraite_complementaire;
    Var l_basel_ratel_valueDouble;
    Begin
      l_base:= Min(p_salairef_amount('plafond_complementaire'));
      l_rate:= f_rate('retraite_complementaire_1')/ 100;
      l_value:= l_basel_rate;
      _display('complem_1''< compl'l_basel_ratel_value, 0);

      l_base:= p_salairef_amount('plafond_complementaire');
      If l_base> 0
        Then Begin
            l_base:= Min(l_base, 4* f_amount('plafond_secu'));
            l_rate:= f_rate('retraite_complementaire_2')/ 100;
            l_value:= l_basel_rate;
            _display('complem_2''> compl'l_basel_ratel_value, 0);
          End
    End// _compute_retraite_complementaire

  Procedure _compute_formation_professionnelle;
    Var l_basel_ratel_valueDouble;
    Begin
      l_base:= f_amount('plafond_secu');

      l_rate:= f_rate('formation_professionnelle')/ 100;
      l_value:= l_basel_rate;
      _display('form_profess''plaf'l_basel_ratel_value, 0);
    End// _compute_formation_professionnelle

  Procedure _compute_csg_crds;
    Var l_basel_ratel_valueDouble;
    Begin
      l_base:= p_salairep_cotisations_sociales_obligatoire_precedentes;
      l_rate:= f_rate('csg_crds_non_deductible')/ 100;
      l_value:= l_basel_rate;
      _display('csg_crds''sal+cot_p'l_basel_ratel_value, 0);

      l_rate:= f_rate('csg_deductible')/ 100;
      l_value:= l_basel_rate;
      _display('csg_deduc''sal+cot_p'l_basel_ratel_value, 0);
    End// _compute_csg_crds

  Procedure _compute_xxx;
    Begin
    End// _compute_xxx

  Begin // compute_charges
    display_line;
    display('-----');
    display(Format('Charges Salaire: %10.2f  cotisations n- 1 %10.2f',
        [p_salairep_cotisations_sociales_obligatoire_precedentes]));
    display_line;

    l_total:= 0;

    _compute_maladie;

    display_line;
    _compute_allocations;
    display_line;
    _compute_retraite_base;
    _compute_retraite_complementaire;
    display_line;

    display(Format('total cotisations obligatoires %s %10.2f',
        [f_spaces(41), l_total]));

    display_line;
    _compute_formation_professionnelle;

    display_line;
    _compute_csg_crds;

    display_line;
    display(Format('%s %10.2f', [f_spaces(58+ 5), l_total]));
  End// compute_charges



4 - Mini How To

Voici l'image de l'application

calcule_charges_sociales_tns

Donc

  • initialisez le fichier des paramètres. 2019 est fourni dans le .ZIP, 2020 est fourni, mais partiel (nous n'avons pas trouvé toutes les informations
  • sélectionnez le fichier de paramètres dans la tFileListBox
  • entrez le salaire net et les cotisations sociales précédentes
    • soit en cliquant un des trois tRadioButton (< plafond, > plafond, >> plafond)
    • soit en saisissant manuellement les valeurs qui vous intéressent
  • cliquez "compute_"
Nous avons utilisé comme exemple une valeur mettant en oeuvre tous les taux.

Nous avons validé les calculs pour notre cas personnel (qui n'est pas 120.000 !) pour 2019.




5 - Améliorations

5.1 - Quelques pistes

  • formuler une liste de règles et calculer automatiquement les valeurs, en utilisant éventuellement le pattern strategy
  • si quelqu'un a les taux 2020, je mettrai à jour la table des paramètres

  • nous n'avons pas traités tous les cas spéciaux (cotisations minimales, épouse etc)


5.2 - Liens

Quelques liens pour trouver des taux (2019 !) et aussi


6 - Télécharger le code source Delphi

Vous pouvez télécharger: Ce .ZIP qui comprend:
  • le .DPR, la forme principale, les formes annexes eventuelles
  • les fichiers de paramètres (le schéma et le batch de création)
  • dans chaque .ZIP, toutes les librairies nécessaires à chaque projet (chaque .ZIP est autonome)
Ces .ZIP, pour les projets en Delphi 6, contiennent des chemins RELATIFS. Par conséquent:
  • créez un répertoire n'importe où sur votre machine
  • placez le .ZIP dans ce répertoire
  • dézippez et les sous-répertoires nécessaires seront créés
  • compilez et exécutez
Ces .ZIP ne modifient pas votre PC (pas de changement de la Base de Registre, de DLL ou autre). Pour supprimer le projet, effacez le répertoire.

La notation utilisée est la notation alsacienne qui consiste à préfixer les identificateurs par la zone de compilation: K_onstant, T_ype, G_lobal, L_ocal, P_arametre, F_unction, C_lasse. Elle est présentée plus en détail dans l'article La Notation Alsacienne



Comme d'habitude:

  • nous vous remercions de nous signaler toute erreur, inexactitude ou problème de téléchargement en envoyant un e-mail à jcolibri@jcolibri.com. Les corrections qui en résulteront pourront aider les prochains lecteurs
  • tous vos commentaires, remarques, questions, critiques, suggestion d'article, ou mentions d'autres sources sur le même sujet seront de même les bienvenus à jcolibri@jcolibri.com.
  • plus simplement, vous pouvez taper (anonymement ou en fournissant votre e-mail pour une réponse) vos commentaires ci-dessus et nous les envoyer en cliquant "envoyer" :
    Nom :
    E-mail :
    Commentaires * :
     

  • et si vous avez apprécié cet article, faites connaître notre site, ajoutez un lien dans vos listes de liens ou citez-nous dans vos blogs ou réponses sur les messageries. C'est très simple: plus nous aurons de visiteurs et de références Google, plus nous écrirons d'articles.



7 - L'auteur

John COLIBRI est passionné par le développement Delphi et les applications de Bases de Données. Il a écrit de nombreux livres et articles, et partage son temps entre le développement de projets (nouveaux projets, maintenance, audit, migration BDE, migration Xe_n, refactoring) pour ses clients, le conseil (composants, architecture, test) et la formation. Son site contient des articles avec code source, ainsi que le programme et le calendrier des stages de formation Delphi, base de données, programmation objet, Services Web, Tcp/Ip et UML qu'il anime personellement tous les mois, à Paris, en province ou sur site client.
Created: jan-04. Last updated: mar-2020 - 250 articles, 620 .ZIP sources, 3303 figures
Contact : John COLIBRI - Tel: 01.42.83.69.36 / 06.87.88.23.91 - email:jcolibri@jcolibri.com
Copyright © J.Colibri   http://www.jcolibri.com - 2001 - 2020
Retour:  Home  Articles  Formations  Développement Delphi  Livres  Pascalissime  Liens  Download
l'Institut Pascal

John COLIBRI

+ Home
  + articles_avec_sources
    + bases_de_donnees
    + web_internet_sockets
    + services_web_
    + prog_objet_composants
    + office_com_automation
    + colibri_utilities
    + uml_design_patterns
    + graphique
    + delphi
    + outils
    + firemonkey
    + vcl_rtl
    + colibri_helpers
    + colibri_skelettons
    + admin
      – simul_charges_tns
      – simul_charges_salarie
      – simul_impots_societes
      – simul_impots_revenu
      – choix_salaire_divid
      – calcul_salaire_divid
  + formations
  + developpement_delphi
  + présentations
  + pascalissime
  + livres
  + entre_nous
  – télécharger

contacts
plan_du_site
– chercher :

RSS feed  
Blog