diff --git "a/modele-social/r\303\250gles/declaration-pam/d\303\251claration-revenus-pamc-formulaire.publicodes" "b/modele-social/r\303\250gles/declaration-pam/d\303\251claration-revenus-pamc-formulaire.publicodes" new file mode 100644 index 0000000000..8223a37f21 --- /dev/null +++ "b/modele-social/r\303\250gles/declaration-pam/d\303\251claration-revenus-pamc-formulaire.publicodes" @@ -0,0 +1,178 @@ +déclaration revenus PAMC: + experimental: oui + valeur: non + +déclaration revenus PAMC . profession: + question: Quelle est votre profession ? + une possibilité: + choix obligatoire: oui + possibilités: + - dentiste + - infirmier + - kinésithérapeute + - médecin + - orthophoniste + - orthoptiste + - pédicure-podologue + - sage-femme + avec: + dentiste: + titre: chirurgien/chirurgienne-dentiste + valeur: profession = 'dentiste' + infirmier: + titre: infirmier/infirmière + valeur: profession = 'infirmier' + kinésithérapeute: + titre: masseure/masseuse-kinésithérapeute + valeur: profession = 'kinésithérapeute' + médecin: + valeur: profession = 'médecin' + orthophoniste: + valeur: profession = 'orthophoniste' + orthoptiste: + valeur: profession = 'orthoptiste' + pédicure-podologue: + valeur: profession = 'pédicure-podologue' + sage-femme: + valeur: profession = 'sage-femme' + +déclaration revenus PAMC . statut: + question: Quel était votre statut d’exercice au 1er janvier ou à votre date de début d’activité ? + description: | + Indiquez ici votre statut au 1er janvier de l’année précédant l’année de déclaration. +
+ Par exemple, pour la déclaration 2025 sur les revenus de 2024, indiquez votre situation au 1er + janvier 2024. + + Si vous avez commencé en cours d’année, indiquez votre statut à la date de début de votre activité. +
+ Par exemple, si vous avez débuté votre activité au 1er mars en tant que remplaçant/remplaçante et + que vous vous êtes installé/installée au 1er juillet, sélectionnez « Remplaçant / remplaçante » + une possibilité: + choix obligatoire: oui + possibilités: + - titulaire + - remplaçant + avec: + titulaire: + valeur: statut = 'titulaire' + remplaçant: + titre: remplaçant / remplaçante + valeur: statut = 'remplaçant' + +déclaration revenus PAMC . recettes brutes totales: + unité: €/an + +déclaration revenus PAMC . revenus imposables: + unité: €/an + +déclaration revenus PAMC . cotisations sociales obligatoires: + unité: €/an + +déclaration revenus PAMC . SNIR: + +déclaration revenus PAMC . SNIR . honoraires remboursables: + titre: honoraires tirés d’actes conventionnés + unité: €/an + +déclaration revenus PAMC . SNIR . dépassements honoraires: + titre: dépassements d’honoraires + question: dépassements d’honoraires + unité: €/an + +déclaration revenus PAMC . SNIR . honoraires tarifs opposables: + applicable si: profession . médecin + titre: honoraires aux tarifs opposables hors forfaits + unité: €/an + +déclaration revenus PAMC . SNIR . honoraires hors forfaits: + applicable si: profession . médecin + titre: honoraires totaux hors forfaits + unité: €/an + +déclaration revenus PAMC . SNIR . taux urssaf: + applicable si: profession . dentiste + titre: taux Urssaf + unité: '%' + +déclaration revenus PAMC . activité en structures de soins: + non applicable si: profession . dentiste + question: Avez-vous des recettes issues d’une activité en structure de soins ? + par défaut: non + +déclaration revenus PAMC . activité en structures de soins . recettes: + titre: montant + unité: €/an + par défaut: 0 + +déclaration revenus PAMC . déductions et exonérations: + question: Bénéficiez-vous de déductions et/ou de revenus exonérés fiscalement ? + par défaut: non + +déclaration revenus PAMC . déductions et exonérations . zone déficitaire en offre de soins: + applicable si: profession . médecin + titre: exonération zone déficitaire en offre de soins + unité: €/an + par défaut: 0 + +déclaration revenus PAMC . déductions et exonérations . revenus exonérés: + titre: revenus exonérés + unité: €/an + par défaut: 0 + +déclaration revenus PAMC . déductions et exonérations . plus-values à court terme: + titre: plus-values à court terme exonérées + unité: €/an + par défaut: 0 + +déclaration revenus PAMC . déductions et exonérations . chèques vacances: + titre: montant des chèques vacances déduits du revenu imposable + unité: €/an + par défaut: 0 + +déclaration revenus PAMC . autres revenus non salariés: + question: Avez-vous des revenus non salariés autres que ceux relevant du régime micro-BNC ? + par défaut: non + +déclaration revenus PAMC . autres revenus non salariés . plus-values nettes à court terme: + titre: plus-values nettes à court terme + unité: €/an + par défaut: 0 + +déclaration revenus PAMC . autres revenus non salariés . vente de marchandises: + titre: 'micro-BIC : chiffre d’affaires vente de marchandises' + unité: €/an + par défaut: 0 + +déclaration revenus PAMC . autres revenus non salariés . prestation de service: + titre: 'micro-BIC : chiffre d’affaires prestation de service' + unité: €/an + par défaut: 0 + +déclaration revenus PAMC . autres revenus non salariés . agricole: + titre: 'micro-BA : chiffre d’affaires agricole' + unité: €/an + par défaut: 0 + +déclaration revenus PAMC . actes conventionnés uniquement: + non applicable si: profession . pédicure-podologue + applicable si: + une de ces conditions: + - activité en structures de soins = non + - autres revenus non salariés = non + question: Avez-vous effectué uniquement des actes conventionnés ? + par défaut: non + +déclaration revenus PAMC . revenus de remplacement: + question: Avez-vous perçues des indemnités de la Caf, de la CPAM ou de votre caisse de retraite ? + par défaut: non + +déclaration revenus PAMC . revenus de remplacement . total: + somme: + - AJPA + unité: €/an + +déclaration revenus PAMC . revenus de remplacement . AJPA: + titre: montant perçu de l’AJPA versée par la Caf + unité: €/an + par défaut: 0 diff --git "a/modele-social/r\303\250gles/declaration-pam/d\303\251claration-revenus-pamc-r\303\251sultats.publicodes" "b/modele-social/r\303\250gles/declaration-pam/d\303\251claration-revenus-pamc-r\303\251sultats.publicodes" new file mode 100644 index 0000000000..cf865fe440 --- /dev/null +++ "b/modele-social/r\303\250gles/declaration-pam/d\303\251claration-revenus-pamc-r\303\251sultats.publicodes" @@ -0,0 +1,104 @@ +déclaration revenus PAMC . résultats: + toutes ces conditions: + - recettes brutes totales + - revenus imposables + - cotisations sociales obligatoires + - champs dentiste + - champs médecin + - champs autres professions + avec: + champs dentiste: + variations: + - si: profession . dentiste + alors: SNIR . taux urssaf + - sinon: oui + champs médecin: + variations: + - si: profession . médecin + alors: + toutes ces conditions: + - SNIR . honoraires remboursables + - SNIR . dépassements honoraires + - SNIR . honoraires tarifs opposables + - SNIR . honoraires hors forfaits + - sinon: oui + champs autres professions: + variations: + - si: + toutes ces conditions: + - profession . dentiste = non + - profession . médecin = non + alors: + toutes ces conditions: + - SNIR . honoraires remboursables + - SNIR . dépassements honoraires + - sinon: oui + +déclaration revenus PAMC . déductions et exonérations . total déductible: + somme: + - zone déficitaire en offre de soins + - revenus exonérés + - plus-values à court terme + - chèques vacances exonérés + avec: + chèques vacances exonérés: + valeur: déductions et exonérations . chèques vacances + abattement: + produit: + - 30% + - valeur: SMIC + contexte: + date: période . début d'année + unité: €/an + plancher: 0 + unité: €/an + +déclaration revenus PAMC . revenus nets: + +déclaration revenus PAMC . revenus nets . revenus imposables: + produit: + - revenus imposables + - 66% + unité: €/an + +déclaration revenus PAMC . revenus nets . autres revenus non salariés: + somme: + - autres revenus non salariés . plus-values nettes à court terme + - 0.29 * autres revenus non salariés . vente de marchandises + - 0.50 * autres revenus non salariés . prestation de service + - 0.13 * autres revenus non salariés . agricole + unité: €/an + +déclaration revenus PAMC . revenus nets . assiette sociale: + somme: + - revenus imposables + - autres revenus non salariés + - déductions et exonérations . total déductible + unité: €/an + +déclaration revenus PAMC . revenus nets . revenus conventionnés: + variations: + - si: actes conventionnés uniquement + alors: assiette sociale + - sinon: + produit: + - assiette sociale + - SNIR . honoraires remboursables + - 1 / recettes brutes totales + unité: €/an + +déclaration revenus PAMC . revenus nets . revenus non conventionnés: + variations: + - si: actes conventionnés uniquement + alors: 0 + - sinon: + valeur: assiette sociale + abattement: revenus conventionnés + unité: €/an + +déclaration revenus PAMC . revenus nets . revenus structures de soins: + produit: + - assiette sociale + - activité en structures de soins . recettes + - 1 / recettes brutes totales + unité: €/an diff --git a/site/cypress/integration/mon-entreprise/assistants/declaration-revenus-pamc.ts b/site/cypress/integration/mon-entreprise/assistants/declaration-revenus-pamc.ts new file mode 100644 index 0000000000..6f70c6a265 --- /dev/null +++ b/site/cypress/integration/mon-entreprise/assistants/declaration-revenus-pamc.ts @@ -0,0 +1,635 @@ +import { checkA11Y, fr } from '../../../support/utils' + +const idPrefix = 'déclaration_revenus_PAMC__' +const structureDeSoins = 'activité_en_structures_de_soins' +const exonerations = 'déductions_et_exonérations' +const autresRevenus = 'autres_revenus_non_salariés' +const revenusNets = 'revenus_nets__' + +describe( + `L'assistant à la déclaration de revenu pour PAMC`, + { testIsolation: false }, + function () { + if (!fr) { + return + } + + before(function () { + cy.visit('/assistants/declaration-revenus-pam') + }) + + it('ne devrait pas planter', function () { + cy.contains('Assistant à la déclaration de revenus pour les PAMC').should( + 'be.visible' + ) + }) + + it('devrait demander la profession', function () { + cy.contains('Quelle est votre profession ?').should('be.visible') + }) + + it('devrait effacer les réponses en cliquant sur réinitialiser', function () { + cy.contains('Sage-femme').click() + + cy.contains('Réinitialiser').click() + + cy.contains('Recettes brutes totales').should('not.exist') + }) + + it('devrait demander le statut', function () { + cy.contains( + 'Quel était votre statut d’exercice au 1er janvier ou à votre date de début d’activité ?' + ).should('be.visible') + }) + + it("ne devrait pas montrer les champs avant qu'une profession soit sélectionnée", function () { + cy.contains('Recettes brutes totales').should('not.exist') + cy.get(`#${idPrefix}_recettes_brutes_totales`).should('not.exist') + cy.contains('Revenus imposables').should('not.exist') + cy.get(`#${idPrefix}_revenus_imposables`).should('not.exist') + cy.contains('Cotisations sociales obligatoires').should('not.exist') + cy.get(`#${idPrefix}_cotisations_sociales_obligatoires`).should( + 'not.exist' + ) + + cy.contains('Honoraires tirés d’actes conventionnés').should('not.exist') + cy.get(`#${idPrefix}_SNIR___honoraires_remboursables`).should('not.exist') + cy.contains('Dépassements d’honoraires').should('not.exist') + cy.get(`#${idPrefix}_SNIR___dépassements_honoraires`).should('not.exist') + cy.contains('Honoraires aux tarifs opposables hors forfaits').should( + 'not.exist' + ) + cy.get(`#${idPrefix}_SNIR___honoraires_tarifs_opposables`).should( + 'not.exist' + ) + cy.contains('Honoraires totaux hors forfaits').should('not.exist') + cy.get(`#${idPrefix}_SNIR___honoraires_hors_forfaits`).should('not.exist') + cy.contains('Taux Urssaf').should('not.exist') + cy.get(`#${idPrefix}_SNIR___taux_urssaf`).should('not.exist') + + cy.contains( + 'Avez-vous des recettes issues d’une activité en structure de soins ?' + ).should('not.exist') + cy.get(`#${idPrefix}_${structureDeSoins}`).should('not.exist') + cy.contains('Montant').should('not.exist') + cy.get(`#${idPrefix}_${structureDeSoins}___recettes`).should('not.exist') + + cy.contains( + 'Bénéficiez-vous de déductions et/ou de revenus exonérés fiscalement ?' + ).should('not.exist') + cy.get(`#${idPrefix}_${exonerations}`).should('not.exist') + cy.contains('Exonération zone déficitaire en offre de soins').should( + 'not.exist' + ) + cy.get( + `#${idPrefix}_${exonerations}___zone_déficitaire_en_offre_de_soins` + ).should('not.exist') + cy.contains('Revenus exonérés').should('not.exist') + cy.get(`#${idPrefix}_${exonerations}___revenus_exonérés`).should( + 'not.exist' + ) + cy.contains('Plus-values à court terme exonérées').should('not.exist') + cy.get(`#${idPrefix}_${exonerations}___plus-values_à_court_terme`).should( + 'not.exist' + ) + cy.contains( + 'Montant des chèques vacances déduits du revenu imposable' + ).should('not.exist') + cy.get(`#${idPrefix}_${exonerations}___chèques_vacances`).should( + 'not.exist' + ) + + cy.contains( + 'Avez-vous des revenus non salariés autres que ceux relevant du régime micro-BNC ?' + ).should('not.exist') + cy.get(`#${idPrefix}_${autresRevenus}`).should('not.exist') + cy.contains('Plus-values nettes à court terme').should('not.exist') + cy.get( + `#${idPrefix}_${autresRevenus}___plus-values_nettes_à_court_terme` + ).should('not.exist') + cy.contains( + 'Micro-BIC : chiffre d’affaires vente de marchandises' + ).should('not.exist') + cy.get(`#${idPrefix}_${autresRevenus}___vente_de_marchandises`).should( + 'not.exist' + ) + cy.contains( + 'Micro-BIC : chiffre d’affaires prestation de service' + ).should('not.exist') + cy.get(`#${idPrefix}_${autresRevenus}___prestation_de_service`).should( + 'not.exist' + ) + cy.contains('Micro-BA : chiffre d’affaires agricole').should('not.exist') + cy.get(`#${idPrefix}_${autresRevenus}___agricole`).should('not.exist') + + cy.contains( + 'Avez-vous effectué uniquement des actes conventionnés ?' + ).should('not.exist') + cy.get(`#${idPrefix}_actes_conventionnés_uniquement`).should('not.exist') + + cy.contains( + 'Avez-vous perçues des indemnités de la Caf, de la CPAM ou de votre caisse de retraite ?' + ).should('not.exist') + cy.get(`#${idPrefix}_revenus_de_remplacement`).should('not.exist') + cy.contains('Montant perçu de l’AJPA versée par la Caf').should( + 'not.exist' + ) + cy.get(`#${idPrefix}_revenus_de_remplacement___AJPA`).should('not.exist') + }) + + it("devrait montrer les champs lorsqu'une profession est sélectionnée", function () { + cy.contains('Sage-femme').click() + + cy.contains('Recettes brutes totales').should('be.visible') + cy.get(`#${idPrefix}_recettes_brutes_totales`).should('be.visible') + cy.contains('Revenus imposables').should('be.visible') + cy.get(`#${idPrefix}_revenus_imposables`).should('be.visible') + cy.contains('Cotisations sociales obligatoires').should('be.visible') + cy.get(`#${idPrefix}_cotisations_sociales_obligatoires`).should( + 'be.visible' + ) + + cy.contains('Honoraires tirés d’actes conventionnés').should('be.visible') + cy.get(`#${idPrefix}_SNIR___honoraires_remboursables`).should( + 'be.visible' + ) + cy.contains('Dépassements d’honoraires').should('be.visible') + cy.get(`#${idPrefix}_SNIR___dépassements_honoraires`).should('be.visible') + + cy.contains( + 'Avez-vous des recettes issues d’une activité en structure de soins ?' + ).should('be.visible') + cy.get(`#${idPrefix}_${structureDeSoins}`).should('be.visible') + + cy.contains( + 'Bénéficiez-vous de déductions et/ou de revenus exonérés fiscalement ?' + ).should('be.visible') + cy.get(`#${idPrefix}_${exonerations}`).should('be.visible') + + cy.contains( + 'Avez-vous des revenus non salariés autres que ceux relevant du régime micro-BNC ?' + ).should('be.visible') + cy.get(`#${idPrefix}_${autresRevenus}`).should('be.visible') + + cy.contains( + 'Avez-vous effectué uniquement des actes conventionnés ?' + ).should('be.visible') + cy.get(`#${idPrefix}_actes_conventionnés_uniquement`).should('be.visible') + + cy.contains( + 'Avez-vous perçues des indemnités de la Caf, de la CPAM ou de votre caisse de retraite ?' + ).should('be.visible') + cy.get(`#${idPrefix}_revenus_de_remplacement`).should('be.visible') + }) + + it('ne devrait pas montrer les résultats avant que les champs soient remplis', function () { + cy.contains('Sage-femme').click() + + cy.contains( + 'Montants à reporter dans votre déclaration de revenus' + ).should('not.exist') + + cy.contains( + 'Recettes brutes totales tirées des activités non salariées' + ).should('not.exist') + cy.get(`#${idPrefix}_recettes_brutes_totales-value`).should('not.exist') + + cy.contains('Montant des revenus de remplacement').should('not.exist') + cy.contains( + 'Montant des allocations journalières du proche aidant (AJPA) versées par la CAF' + ).should('not.exist') + cy.get(`#${idPrefix}_revenus_de_remplacement___AJPA-value`).should( + 'not.exist' + ) + + cy.contains('Exonération zone déficitaire en offre de soins').should( + 'not.exist' + ) + cy.get( + `#${idPrefix}_${exonerations}___zone_déficitaire_en_offre_de_soins-value` + ).should('not.exist') + cy.get(`#${idPrefix}_${exonerations}___chèques_vacances-label`).should( + 'not.exist' + ) + cy.get(`#${idPrefix}_${exonerations}___chèques_vacances-value`).should( + 'not.exist' + ) + + cy.contains( + 'Cotisations sociales obligatoires déduites du résultat imposable' + ).should('not.exist') + cy.get(`#${idPrefix}_cotisations_sociales_obligatoires-value`).should( + 'not.exist' + ) + + cy.contains('Répartition des revenus nets').should('not.exist') + cy.contains('Revenu net de l’activité conventionnée').should('not.exist') + cy.get(`#${idPrefix}_${revenusNets}_revenus_conventionnés-value`).should( + 'not.exist' + ) + cy.contains( + 'Revenus nets tirés des autres activités non salariées' + ).should('not.exist') + cy.get( + `#${idPrefix}_${revenusNets}_revenus_non_conventionnés-value` + ).should('not.exist') + cy.contains( + 'Dont revenus nets de l’activité réalisée dans des structures de soins' + ).should('not.exist') + cy.get( + `#${idPrefix}_${revenusNets}_revenus_structures_de_soins-value` + ).should('not.exist') + + cy.contains('Données transmises par l’Assurance Maladie').should( + 'not.exist' + ) + cy.get(`#${idPrefix}_SNIR___honoraires_remboursables-label`).should( + 'not.exist' + ) + cy.get(`#${idPrefix}_SNIR___honoraires_remboursables-value`).should( + 'not.exist' + ) + cy.get(`#${idPrefix}_SNIR___dépassements_honoraires-label`).should( + 'not.exist' + ) + cy.get(`#${idPrefix}_SNIR___dépassements_honoraires-value`).should( + 'not.exist' + ) + cy.contains('Honoraires aux tarifs opposables hors forfaits').should( + 'not.exist' + ) + cy.get(`#${idPrefix}_SNIR___honoraires_tarifs_opposables-value`).should( + 'not.exist' + ) + cy.contains('Honoraires totaux hors forfaits').should('not.exist') + cy.get(`#${idPrefix}_SNIR___honoraires_hors_forfaits-value`).should( + 'not.exist' + ) + cy.contains('Taux Urssaf').should('not.exist') + cy.get(`#${idPrefix}_SNIR___taux_urssaf-value`).should('not.exist') + }) + + it('devrait montrer les résultats lorsque les champs sont remplis', function () { + cy.contains('Sage-femme').click() + cy.get('input[type="text"]').as('inputs').should('have.length', 5) + cy.get('@inputs').each(($input) => { + cy.wrap($input).type('{selectall}100') + }) + + cy.contains( + 'Montants à reporter dans votre déclaration de revenus' + ).should('be.visible') + + cy.contains( + 'Recettes brutes totales tirées des activités non salariées' + ).should('be.visible') + cy.get(`#${idPrefix}_recettes_brutes_totales-value`).should('be.visible') + + cy.contains( + 'Cotisations sociales obligatoires déduites du résultat imposable' + ).should('be.visible') + cy.get(`#${idPrefix}_cotisations_sociales_obligatoires-value`).should( + 'be.visible' + ) + + cy.contains('Répartition des revenus nets').should('be.visible') + cy.contains('Revenu net de l’activité conventionnée').should('be.visible') + cy.get(`#${idPrefix}_${revenusNets}_revenus_conventionnés-value`).should( + 'be.visible' + ) + cy.contains( + 'Revenus nets tirés des autres activités non salariées' + ).should('be.visible') + cy.get( + `#${idPrefix}_${revenusNets}_revenus_non_conventionnés-value` + ).should('be.visible') + + cy.contains('Données transmises par l’Assurance Maladie').should( + 'be.visible' + ) + cy.get(`#${idPrefix}_SNIR___honoraires_remboursables-label`).should( + 'be.visible' + ) + cy.get(`#${idPrefix}_SNIR___honoraires_remboursables-value`).should( + 'be.visible' + ) + cy.get(`#${idPrefix}_SNIR___dépassements_honoraires-label`).should( + 'be.visible' + ) + cy.get(`#${idPrefix}_SNIR___dépassements_honoraires-value`).should( + 'be.visible' + ) + }) + + it('devrait montrer des champs différents aux dentistes', function () { + cy.contains('Sage-femme').click() + + cy.contains('Taux Urssaf').should('not.exist') + cy.get(`#${idPrefix}_SNIR___taux_urssaf`).should('not.exist') + + cy.contains('Chirurgien/chirurgienne-dentiste').click() + + cy.get(`#${idPrefix}_SNIR___taux_urssaf-title`).should('be.visible') + cy.get(`#${idPrefix}_SNIR___taux_urssaf`).should('be.visible') + + cy.contains( + 'Avez-vous des recettes issues d’une activité en structure de soins ?' + ).should('not.exist') + cy.get(`#${idPrefix}_${structureDeSoins}`).should('not.exist') + }) + + it('devrait montrer des résultats différents aux dentistes', function () { + cy.contains('Sage-femme').click() + cy.get('input[type="text"]').each(($input) => { + cy.wrap($input).type('{selectall}100') + }) + + cy.contains('Taux Urssaf').should('not.exist') + cy.get(`#${idPrefix}_SNIR___taux_urssaf-value`).should('not.exist') + + cy.contains('Chirurgien/chirurgienne-dentiste').click() + cy.get('input[type="text"]').as('inputs').should('have.length', 6) + cy.get('@inputs').each(($input) => { + cy.wrap($input).type('{selectall}100') + }) + + cy.get(`#${idPrefix}_SNIR___taux_urssaf-label`).should('be.visible') + cy.get(`#${idPrefix}_SNIR___taux_urssaf-value`).should('be.visible') + + cy.get(`#${idPrefix}_SNIR___honoraires_remboursables-label`).should( + 'not.exist' + ) + cy.get(`#${idPrefix}_SNIR___honoraires_remboursables-value`).should( + 'not.exist' + ) + cy.get(`#${idPrefix}_SNIR___dépassements_honoraires-label`).should( + 'not.exist' + ) + cy.get(`#${idPrefix}_SNIR___dépassements_honoraires-value`).should( + 'not.exist' + ) + }) + + it('devrait montrer des champs différents aux médecins', function () { + cy.contains('Sage-femme').click() + + cy.contains('Honoraires aux tarifs opposables hors forfaits').should( + 'not.exist' + ) + cy.get(`#${idPrefix}_SNIR___honoraires_tarifs_opposables`).should( + 'not.exist' + ) + cy.contains('Honoraires totaux hors forfaits').should('not.exist') + cy.get(`#${idPrefix}_SNIR___honoraires_hors_forfaits`).should('not.exist') + + cy.contains('Médecin').click() + + cy.get(`#${idPrefix}_SNIR___honoraires_tarifs_opposables-title`).should( + 'be.visible' + ) + cy.get(`#${idPrefix}_SNIR___honoraires_tarifs_opposables`).should( + 'be.visible' + ) + cy.get(`#${idPrefix}_SNIR___honoraires_hors_forfaits-title`).should( + 'be.visible' + ) + cy.get(`#${idPrefix}_SNIR___honoraires_hors_forfaits`).should( + 'be.visible' + ) + }) + + it('devrait montrer des résultats différents aux médecins', function () { + cy.contains('Sage-femme').click() + cy.get('input[type="text"]').each(($input) => { + cy.wrap($input).type('{selectall}100') + }) + + cy.contains('Honoraires aux tarifs opposables hors forfaits').should( + 'not.exist' + ) + cy.get(`#${idPrefix}_SNIR___honoraires_tarifs_opposables-value`).should( + 'not.exist' + ) + cy.contains('Honoraires totaux hors forfaits').should('not.exist') + cy.get(`#${idPrefix}_SNIR___honoraires_hors_forfaits-value`).should( + 'not.exist' + ) + + cy.contains('Médecin').click() + cy.get('input[type="text"]').as('inputs').should('have.length', 7) + cy.get('@inputs').each(($input) => { + cy.wrap($input).type('{selectall}100') + }) + + cy.get(`#${idPrefix}_SNIR___honoraires_tarifs_opposables-label`).should( + 'be.visible' + ) + cy.get(`#${idPrefix}_SNIR___honoraires_tarifs_opposables-value`).should( + 'be.visible' + ) + cy.get(`#${idPrefix}_SNIR___honoraires_hors_forfaits-label`).should( + 'be.visible' + ) + cy.get(`#${idPrefix}_SNIR___honoraires_hors_forfaits-value`).should( + 'be.visible' + ) + }) + + it('devrait montrer la question sur les actes conventionnés conditionnellement', function () { + cy.contains('Pédicure-podologue').click() + + cy.contains( + 'Avez-vous effectué uniquement des actes conventionnés ?' + ).should('not.exist') + cy.get(`#${idPrefix}_actes_conventionnés_uniquement`).should('not.exist') + + cy.contains('Sage-femme').click() + + cy.get(`#${idPrefix}_${structureDeSoins}`).contains('Oui').click() + + cy.contains( + 'Avez-vous effectué uniquement des actes conventionnés ?' + ).should('be.visible') + cy.get(`#${idPrefix}_actes_conventionnés_uniquement`).should('be.visible') + + cy.get(`#${idPrefix}_${autresRevenus}`).contains('Oui').click() + + cy.contains( + 'Avez-vous effectué uniquement des actes conventionnés ?' + ).should('not.exist') + cy.get(`#${idPrefix}_actes_conventionnés_uniquement`).should('not.exist') + + cy.get(`#${idPrefix}_${structureDeSoins}`).contains('Non').click() + + cy.contains( + 'Avez-vous effectué uniquement des actes conventionnés ?' + ).should('be.visible') + cy.get(`#${idPrefix}_actes_conventionnés_uniquement`).should('be.visible') + + cy.get(`#${idPrefix}_${autresRevenus}`).contains('Non').click() + }) + + it('devrait montrer le champ pour les activités en structures de soins conditionnellement', function () { + cy.contains('Sage-femme').click() + + cy.get(`#${idPrefix}_${structureDeSoins}___recettes-title`).should( + 'not.exist' + ) + cy.get(`#${idPrefix}_${structureDeSoins}___recettes`).should('not.exist') + + cy.get(`#${idPrefix}_${structureDeSoins}`).contains('Oui').click() + + cy.get(`#${idPrefix}_${structureDeSoins}___recettes-title`).should( + 'be.visible' + ) + cy.get(`#${idPrefix}_${structureDeSoins}___recettes`).should('be.visible') + cy.contains( + 'Dont revenus nets de l’activité réalisée dans des structures de soins' + ).should('be.visible') + cy.get( + `#${idPrefix}_${revenusNets}_revenus_structures_de_soins-value` + ).should('be.visible') + }) + + it('devrait montrer les champs pour les déductions et exonérations conditionnellement', function () { + cy.contains('Sage-femme').click() + + cy.contains('Revenus exonérés').should('not.exist') + cy.get(`#${idPrefix}_${exonerations}___revenus_exonérés`).should( + 'not.exist' + ) + cy.contains('Plus-values à court terme exonérées').should('not.exist') + cy.get(`#${idPrefix}_${exonerations}___plus-values_à_court_terme`).should( + 'not.exist' + ) + cy.contains( + 'Montant des chèques vacances déduits du revenu imposable' + ).should('not.exist') + cy.get(`#${idPrefix}_${exonerations}___chèques_vacances`).should( + 'not.exist' + ) + + cy.get(`#${idPrefix}_${exonerations}`).contains('Oui').click() + + cy.contains('Revenus exonérés').should('be.visible') + cy.get(`#${idPrefix}_${exonerations}___revenus_exonérés`).should( + 'be.visible' + ) + cy.contains('Plus-values à court terme exonérées').should('be.visible') + cy.get(`#${idPrefix}_${exonerations}___plus-values_à_court_terme`).should( + 'be.visible' + ) + cy.contains( + 'Montant des chèques vacances déduits du revenu imposable' + ).should('be.visible') + cy.get(`#${idPrefix}_${exonerations}___chèques_vacances`).should( + 'be.visible' + ) + cy.get(`#${idPrefix}_${exonerations}___chèques_vacances-label`).should( + 'be.visible' + ) + cy.get(`#${idPrefix}_${exonerations}___chèques_vacances-value`).should( + 'be.visible' + ) + }) + + it("devrait montrer un champ d'exonération supplémentaire aux médecins", function () { + cy.contains('Sage-femme').click() + cy.get(`#${idPrefix}_${exonerations}`).contains('Oui').click() + + cy.contains('Exonération zone déficitaire en offre de soins').should( + 'not.exist' + ) + cy.get( + `#${idPrefix}_${exonerations}___zone_déficitaire_en_offre_de_soins` + ).should('not.exist') + + cy.contains('Médecin').click() + cy.get(`#${idPrefix}_${exonerations}`).contains('Oui').click() + + cy.get( + `#${idPrefix}_${exonerations}___zone_déficitaire_en_offre_de_soins-title` + ).should('be.visible') + cy.get( + `#${idPrefix}_${exonerations}___zone_déficitaire_en_offre_de_soins` + ).should('be.visible') + cy.get( + `#${idPrefix}_${exonerations}___zone_déficitaire_en_offre_de_soins-label` + ).should('be.visible') + cy.get( + `#${idPrefix}_${exonerations}___zone_déficitaire_en_offre_de_soins-value` + ).should('be.visible') + }) + + it('devrait montrer les champs pour les autres revenus non salariés conditionnellement', function () { + cy.contains('Sage-femme').click() + + cy.contains('Plus-values nettes à court terme').should('not.exist') + cy.get( + `#${idPrefix}_${autresRevenus}___plus-values_nettes_à_court_terme` + ).should('not.exist') + cy.contains( + 'Micro-BIC : chiffre d’affaires vente de marchandises' + ).should('not.exist') + cy.get(`#${idPrefix}_${autresRevenus}___vente_de_marchandises`).should( + 'not.exist' + ) + cy.contains( + 'Micro-BIC : chiffre d’affaires prestation de service' + ).should('not.exist') + cy.get(`#${idPrefix}_${autresRevenus}___prestation_de_service`).should( + 'not.exist' + ) + cy.contains('Micro-BA : chiffre d’affaires agricole').should('not.exist') + cy.get(`#${idPrefix}_${autresRevenus}___agricole`).should('not.exist') + + cy.get(`#${idPrefix}_${autresRevenus}`).contains('Oui').click() + + cy.contains('Plus-values nettes à court terme').should('be.visible') + cy.get( + `#${idPrefix}_${autresRevenus}___plus-values_nettes_à_court_terme` + ).should('be.visible') + cy.contains( + 'Micro-BIC : chiffre d’affaires vente de marchandises' + ).should('be.visible') + cy.get(`#${idPrefix}_${autresRevenus}___vente_de_marchandises`).should( + 'be.visible' + ) + cy.contains( + 'Micro-BIC : chiffre d’affaires prestation de service' + ).should('be.visible') + cy.get(`#${idPrefix}_${autresRevenus}___prestation_de_service`).should( + 'be.visible' + ) + cy.contains('Micro-BA : chiffre d’affaires agricole').should('be.visible') + cy.get(`#${idPrefix}_${autresRevenus}___agricole`).should('be.visible') + }) + + it('devrait montrer le champ pour les revenus de remplacement conditionnellement', function () { + cy.contains('Sage-femme').click() + + cy.contains('Montant perçu de l’AJPA versée par la Caf').should( + 'not.exist' + ) + cy.get(`#${idPrefix}_revenus_de_remplacement___AJPA`).should('not.exist') + + cy.get(`#${idPrefix}_revenus_de_remplacement`).contains('Oui').click() + + cy.contains('Montant perçu de l’AJPA versée par la Caf').should( + 'be.visible' + ) + cy.get(`#${idPrefix}_revenus_de_remplacement___AJPA`).should('be.visible') + cy.contains('Montant des revenus de remplacement').should('be.visible') + cy.contains( + 'Montant des allocations journalières du proche aidant (AJPA) versées par la CAF' + ).should('be.visible') + cy.get(`#${idPrefix}_revenus_de_remplacement___AJPA-value`).should( + 'be.visible' + ) + }) + + it('devrait être accessible', function () { + checkA11Y() + }) + } +) diff --git a/site/cypress/integration/mon-entreprise/reduction-generale.ts b/site/cypress/integration/mon-entreprise/reduction-generale.ts index 275ff8d50e..8bdef2a677 100755 --- a/site/cypress/integration/mon-entreprise/reduction-generale.ts +++ b/site/cypress/integration/mon-entreprise/reduction-generale.ts @@ -1,6 +1,5 @@ import { checkA11Y, fr } from '../../support/utils' -// TODO Échoue parfois … à creuser describe( 'Simulateur réduction générale', { testIsolation: false }, diff --git a/site/source/components/Assistant/AssistantGoal.tsx b/site/source/components/Assistant/AssistantGoal.tsx new file mode 100644 index 0000000000..3378e12804 --- /dev/null +++ b/site/source/components/Assistant/AssistantGoal.tsx @@ -0,0 +1,118 @@ +import { DottedName } from 'modele-social' +import { PublicodesExpression } from 'publicodes' +import { useCallback, useState } from 'react' +import { useDispatch } from 'react-redux' +import { styled } from 'styled-components' + +import { ForceThemeProvider } from '@/components/utils/DarkModeContext' +import { Grid } from '@/design-system/layout' +import { Body } from '@/design-system/typography/paragraphs' +import { SimpleRuleEvaluation } from '@/domaine/engine/SimpleRuleEvaluation' +import { ajusteLaSituation } from '@/store/actions/actions' + +import { ExplicableRule } from '../conversation/Explicable' +import RuleInput from '../conversation/RuleInput' +import LectureGuide from '../LectureGuide' +import { Appear } from '../ui/animate' +import AnimatedTargetValue from '../ui/AnimatedTargetValue' +import { useEngine } from '../utils/EngineContext' +import { useInitialRender } from '../utils/useInitialRender' + +type SimulationGoalProps = { + dottedName: DottedName + originalUnit?: boolean +} + +export function AssistantGoal({ + dottedName, + originalUnit = false, +}: SimulationGoalProps) { + const dispatch = useDispatch() + const engine = useEngine() + const evaluation = engine.evaluate({ + valeur: dottedName, + }) + const rule = engine.getRule(dottedName) + const initialRender = useInitialRender() + const [isFocused, setFocused] = useState(false) + const onChange = useCallback( + (x?: PublicodesExpression) => { + dispatch( + ajusteLaSituation({ [dottedName]: x } as Record< + DottedName, + SimpleRuleEvaluation + >) + ) + }, + [dispatch, dottedName] + ) + if (evaluation.nodeValue === null) { + return null + } + + return ( + + + + + + + + {rule.title} + + + + + + + + + + + + {!isFocused && ( + + )} + setFocused(true)} + onBlur={() => setFocused(false)} + showSuggestions={false} + aria-labelledby={`${dottedName.replace(/\s|\./g, '_')}-title`} + aria-describedby={`${dottedName.replace( + /\s|\./g, + '_' + )}-description`} + /> + + + + + ) +} + +const StyledGoal = styled.div` + position: relative; + z-index: 1; + margin: ${({ theme }) => theme.spacings.xxs} 0; +` + +const StyledBody = styled(Body)` + margin: 0; + font-size: 1.125rem; +` diff --git a/site/source/components/Simulation/LectureGuide.tsx b/site/source/components/LectureGuide.tsx similarity index 100% rename from site/source/components/Simulation/LectureGuide.tsx rename to site/source/components/LectureGuide.tsx diff --git "a/site/source/components/R\303\251ductionDeCotisations/R\303\251ductionMois.tsx" "b/site/source/components/R\303\251ductionDeCotisations/R\303\251ductionMois.tsx" index 412d603506..a687710aa0 100644 --- "a/site/source/components/R\303\251ductionDeCotisations/R\303\251ductionMois.tsx" +++ "b/site/source/components/R\303\251ductionDeCotisations/R\303\251ductionMois.tsx" @@ -90,7 +90,7 @@ export default function RéductionMois({ formatOptions={{ maximumFractionDigits: 2, }} - displaySuggestions={false} + showSuggestions={false} /> ) } diff --git "a/site/source/components/R\303\251ductionDeCotisations/R\303\251partitionValue.tsx" "b/site/source/components/R\303\251ductionDeCotisations/R\303\251partitionValue.tsx" index aa10cba0ac..6117222446 100644 --- "a/site/source/components/R\303\251ductionDeCotisations/R\303\251partitionValue.tsx" +++ "b/site/source/components/R\303\251ductionDeCotisations/R\303\251partitionValue.tsx" @@ -2,7 +2,7 @@ import { formatValue } from 'publicodes' import { useTranslation } from 'react-i18next' import { styled } from 'styled-components' -import LectureGuide from '@/components/Simulation/LectureGuide' +import LectureGuide from '@/components/LectureGuide' import { Grid } from '@/design-system/layout' import { SmallBody } from '@/design-system/typography/paragraphs' diff --git a/site/source/components/Simulation/EntrepriseSelection.tsx b/site/source/components/Simulation/EntrepriseSelection.tsx index dd1fb210d1..bde8381a14 100644 --- a/site/source/components/Simulation/EntrepriseSelection.tsx +++ b/site/source/components/Simulation/EntrepriseSelection.tsx @@ -8,10 +8,10 @@ import { Body } from '@/design-system/typography/paragraphs' import EntrepriseInput from '../conversation/EntrepriseInput' import Value from '../EngineValue/Value' +import LectureGuide from '../LectureGuide' import { Appear } from '../ui/animate' import { useEngine } from '../utils/EngineContext' import WrongSimulateurWarning from '../WrongSimulateurWarning' -import LectureGuide from './LectureGuide' export default function EntrepriseSelection() { const { t } = useTranslation() diff --git a/site/source/components/Simulation/SimulationGoal.tsx b/site/source/components/Simulation/SimulationGoal.tsx index d939d2ad9b..ff90eacc8e 100644 --- a/site/source/components/Simulation/SimulationGoal.tsx +++ b/site/source/components/Simulation/SimulationGoal.tsx @@ -15,12 +15,12 @@ import { targetUnitSelector } from '@/store/selectors/simulationSelectors' import { ExplicableRule } from '../conversation/Explicable' import RuleInput, { InputProps } from '../conversation/RuleInput' +import LectureGuide from '../LectureGuide' import RuleLink from '../RuleLink' import { Appear } from '../ui/animate' import AnimatedTargetValue from '../ui/AnimatedTargetValue' import { useEngine } from '../utils/EngineContext' import { useInitialRender } from '../utils/useInitialRender' -import LectureGuide from './LectureGuide' type SimulationGoalProps = { dottedName: DottedName diff --git a/site/source/components/Simulation/SimulationValue.tsx b/site/source/components/Simulation/SimulationValue.tsx index 020cb5f357..8f6ff02f16 100644 --- a/site/source/components/Simulation/SimulationValue.tsx +++ b/site/source/components/Simulation/SimulationValue.tsx @@ -10,12 +10,12 @@ import { Body } from '@/design-system/typography/paragraphs' import { Contexte } from '@/domaine/Contexte' import { targetUnitSelector } from '@/store/selectors/simulationSelectors' +import LectureGuide from '../LectureGuide' import RuleLink from '../RuleLink' import { Appear } from '../ui/animate' import AnimatedTargetValue from '../ui/AnimatedTargetValue' import { useEngine } from '../utils/EngineContext' import { useInitialRender } from '../utils/useInitialRender' -import LectureGuide from './LectureGuide' type SimulationValueProps = { dottedName: DottedName diff --git a/site/source/components/conversation/NumberInput.tsx b/site/source/components/conversation/NumberInput.tsx index 829fc9bef9..d6c858d678 100644 --- a/site/source/components/conversation/NumberInput.tsx +++ b/site/source/components/conversation/NumberInput.tsx @@ -21,11 +21,10 @@ export default function NumberInput({ unit, formatOptions, displayedUnit, - displaySuggestions = true, + showSuggestions, ...fieldProps }: InputProps & { unit?: Unit - displaySuggestions?: boolean }) { const unité = serializeUnit(unit) const [currentValue, setCurrentValue] = useState( @@ -93,7 +92,7 @@ export default function NumberInput({ } value={currentValue} /> - {displaySuggestions && ( + {showSuggestions && ( ({ title: rule.title, description: rule.rawNode.description, question: rule.rawNode.question, + showSuggestions, suggestions: showSuggestions ? rule.suggestions : {}, engine: engineValue, ...props, diff --git a/site/source/locales/rules-en.yaml b/site/source/locales/rules-en.yaml index 85c92b2eea..7287f840aa 100644 --- a/site/source/locales/rules-en.yaml +++ b/site/source/locales/rules-en.yaml @@ -4577,6 +4577,222 @@ déclaration charge sociales . résultat . total charges sociales déductible: résumé.fr: '[B + C + D]' titre.en: '[automatic] tax-deductible mandatory social security charges' titre.fr: charges sociales obligatoires déductibles fiscalement +déclaration revenus PAMC: + titre.en: '[automatic] PAMC income tax return' + titre.fr: déclaration revenus PAMC +déclaration revenus PAMC . SNIR: + titre.en: '[automatic] SNIR' + titre.fr: SNIR +déclaration revenus PAMC . SNIR . dépassements honoraires: + question.en: '[automatic] excess fees' + question.fr: dépassements d’honoraires + titre.en: '[automatic] excess fees' + titre.fr: dépassements d’honoraires +déclaration revenus PAMC . SNIR . honoraires hors forfaits: + titre.en: '[automatic] total fees excluding packages' + titre.fr: honoraires totaux hors forfaits +déclaration revenus PAMC . SNIR . honoraires remboursables: + titre.en: '[automatic] fees from conventional procedures' + titre.fr: honoraires tirés d’actes conventionnés +déclaration revenus PAMC . SNIR . honoraires tarifs opposables: + titre.en: + '[automatic] fees charged at the "opposable" rate, excluding lump-sum + payments' + titre.fr: honoraires aux tarifs opposables hors forfaits +déclaration revenus PAMC . SNIR . taux urssaf: + titre.en: '[automatic] Urssaf rate' + titre.fr: taux Urssaf +déclaration revenus PAMC . actes conventionnés uniquement: + question.en: '[automatic] Did you perform only contract procedures?' + question.fr: Avez-vous effectué uniquement des actes conventionnés ? + titre.en: '[automatic] conventional procedures only' + titre.fr: actes conventionnés uniquement +déclaration revenus PAMC . activité en structures de soins: + question.en: '[automatic] Do you generate any income from care facility activities?' + question.fr: Avez-vous des recettes issues d’une activité en structure de soins ? + titre.en: '[automatic] activity in care facilities' + titre.fr: activité en structures de soins +déclaration revenus PAMC . activité en structures de soins . recettes: + titre.en: '[automatic] amount' + titre.fr: montant +déclaration revenus PAMC . autres revenus non salariés: + question.en: '[automatic] Do you have self-employed income other than that + covered by the micro-BNC scheme?' + question.fr: Avez-vous des revenus non salariés autres que ceux relevant du + régime micro-BNC ? + titre.en: '[automatic] other self-employed income' + titre.fr: autres revenus non salariés +déclaration revenus PAMC . autres revenus non salariés . agricole: + titre.en: '[automatic] micro-BA: farm sales' + titre.fr: 'micro-BA : chiffre d’affaires agricole' +déclaration revenus PAMC . autres revenus non salariés . plus-values nettes à court terme: + titre.en: '[automatic] net short-term capital gains' + titre.fr: plus-values nettes à court terme +déclaration revenus PAMC . autres revenus non salariés . prestation de service: + titre.en: '[automatic] micro-BIC: sales of services' + titre.fr: 'micro-BIC : chiffre d’affaires prestation de service' +déclaration revenus PAMC . autres revenus non salariés . vente de marchandises: + titre.en: '[automatic] micro-BIC: sales of goods' + titre.fr: 'micro-BIC : chiffre d’affaires vente de marchandises' +déclaration revenus PAMC . cotisations sociales obligatoires: + titre.en: '[automatic] compulsory social security contributions' + titre.fr: cotisations sociales obligatoires +déclaration revenus PAMC . déductions et exonérations: + question.en: '[automatic] Do you benefit from deductions and/or tax-exempt income?' + question.fr: Bénéficiez-vous de déductions et/ou de revenus exonérés fiscalement ? + titre.en: '[automatic] deductions and exemptions' + titre.fr: déductions et exonérations +déclaration revenus PAMC . déductions et exonérations . chèques vacances: + titre.en: '[automatic] amount of vacation vouchers deducted from taxable income' + titre.fr: montant des chèques vacances déduits du revenu imposable +déclaration revenus PAMC . déductions et exonérations . plus-values à court terme: + titre.en: '[automatic] tax-exempt short-term capital gains' + titre.fr: plus-values à court terme exonérées +déclaration revenus PAMC . déductions et exonérations . revenus exonérés: + titre.en: '[automatic] tax-exempt income' + titre.fr: revenus exonérés +déclaration revenus PAMC . déductions et exonérations . total déductible: + avec: + chèques vacances exonérés: + titre.en: '[automatic] tax-exempt vacation vouchers' + titre.fr: chèques vacances exonérés + titre.en: '[automatic] total deductible' + titre.fr: total déductible +déclaration revenus PAMC . déductions et exonérations . zone déficitaire en offre de soins: + titre.en: '[automatic] exemption for areas with a shortage of healthcare services' + titre.fr: exonération zone déficitaire en offre de soins +déclaration revenus PAMC . profession: + avec: + dentiste: + titre.en: '[automatic] dental surgeon' + titre.fr: chirurgien/chirurgienne-dentiste + infirmier: + titre.en: '[automatic] nurse' + titre.fr: infirmier/infirmière + kinésithérapeute: + titre.en: '[automatic] masseur/physiotherapist' + titre.fr: masseure/masseuse-kinésithérapeute + médecin: + titre.en: '[automatic] doctor' + titre.fr: médecin + orthophoniste: + titre.en: '[automatic] speech therapist' + titre.fr: orthophoniste + orthoptiste: + titre.en: '[automatic] orthoptist' + titre.fr: orthoptiste + pédicure-podologue: + titre.en: '[automatic] chiropodist' + titre.fr: pédicure-podologue + sage-femme: + titre.en: '[automatic] midwife' + titre.fr: sage-femme + question.en: '[automatic] What do you do for a living?' + question.fr: Quelle est votre profession ? + titre.en: '[automatic] profession' + titre.fr: profession +déclaration revenus PAMC . recettes brutes totales: + titre.en: '[automatic] total gross revenues' + titre.fr: recettes brutes totales +déclaration revenus PAMC . revenus de remplacement: + question.en: '[automatic] Do you receive benefits from Caf, CPAM or your pension fund?' + question.fr: + Avez-vous perçues des indemnités de la Caf, de la CPAM ou de votre + caisse de retraite ? + titre.en: '[automatic] replacement income' + titre.fr: revenus de remplacement +déclaration revenus PAMC . revenus de remplacement . AJPA: + titre.en: '[automatic] amount of AJPA paid by Caf' + titre.fr: montant perçu de l’AJPA versée par la Caf +déclaration revenus PAMC . revenus de remplacement . total: + titre.en: '[automatic] total' + titre.fr: total +déclaration revenus PAMC . revenus imposables: + titre.en: '[automatic] taxable income' + titre.fr: revenus imposables +déclaration revenus PAMC . revenus nets: + titre.en: '[automatic] net income' + titre.fr: revenus nets +déclaration revenus PAMC . revenus nets . assiette sociale: + titre.en: '[automatic] social base' + titre.fr: assiette sociale +déclaration revenus PAMC . revenus nets . autres revenus non salariés: + titre.en: '[automatic] other self-employed income' + titre.fr: autres revenus non salariés +déclaration revenus PAMC . revenus nets . revenus conventionnés: + titre.en: '[automatic] conventional incomes' + titre.fr: revenus conventionnés +déclaration revenus PAMC . revenus nets . revenus imposables: + titre.en: '[automatic] taxable income' + titre.fr: revenus imposables +déclaration revenus PAMC . revenus nets . revenus non conventionnés: + titre.en: '[automatic] non-conventional income' + titre.fr: revenus non conventionnés +déclaration revenus PAMC . revenus nets . revenus structures de soins: + titre.en: '[automatic] income from care facilities' + titre.fr: revenus structures de soins +déclaration revenus PAMC . résultats: + avec: + champs autres professions: + titre.en: '[automatic] other professions' + titre.fr: champs autres professions + champs dentiste: + titre.en: '[automatic] dentist fields' + titre.fr: champs dentiste + champs médecin: + titre.en: "[automatic] doctor's field" + titre.fr: champs médecin + titre.en: '[automatic] results' + titre.fr: résultats +déclaration revenus PAMC . statut: + avec: + remplaçant: + titre.en: '[automatic] substitute' + titre.fr: remplaçant / remplaçante + titulaire: + titre.en: '[automatic] holder' + titre.fr: titulaire + description.en: > + [automatic] Indicate your status on January 1st of the year preceding the + reporting year. + +
+ + For example, for the 2025 return on 2024 income, indicate your status on January 1 + + January 2024. + + + If you started during the year, enter your status on the date you began your activity. + +
+ + For example, if you started work on March 1 as a locum and + + and settled in on July 1, select "Substitute". + description.fr: > + Indiquez ici votre statut au 1er janvier de l’année précédant l’année de + déclaration. + +
+ + Par exemple, pour la déclaration 2025 sur les revenus de 2024, indiquez votre situation au 1er + + janvier 2024. + + + Si vous avez commencé en cours d’année, indiquez votre statut à la date de début de votre activité. + +
+ + Par exemple, si vous avez débuté votre activité au 1er mars en tant que remplaçant/remplaçante et + + que vous vous êtes installé/installée au 1er juillet, sélectionnez « Remplaçant / remplaçante » + question.en: '[automatic] What was your practice status on January 1 or when you started?' + question.fr: Quel était votre statut d’exercice au 1er janvier ou à votre date + de début d’activité ? + titre.en: '[automatic] status' + titre.fr: statut entreprise: titre.en: company titre.fr: entreprise diff --git a/site/source/locales/ui-en.yaml b/site/source/locales/ui-en.yaml index 5a89950a2d..d4a4776232 100644 --- a/site/source/locales/ui-en.yaml +++ b/site/source/locales/ui-en.yaml @@ -931,6 +931,12 @@ pages: title: Determining deductible social security charges shortname: Determining deductible social security charges title: Assistance in determining deductible social charges + declaration-revenus-pamc: + meta: + description: Calculate the amounts of your income to report on your tax return. + title: PAMC tax return + shortname: PAMC tax return assistant + title: PAMC tax return assistant pour-mon-entreprise: avertissement-entreprise-non-traitée: <0>There is no income simulator for your type of business on this site yet.<1>If you would like us to develop diff --git a/site/source/locales/ui-fr.yaml b/site/source/locales/ui-fr.yaml index 0ef610128b..c3f5bf3c01 100644 --- a/site/source/locales/ui-fr.yaml +++ b/site/source/locales/ui-fr.yaml @@ -989,6 +989,13 @@ pages: title: Détermination des charges sociales déductibles shortname: Détermination des charges sociales déductibles title: Assistant à la détermination des charges sociales déductibles + declaration-revenus-pamc: + meta: + description: Calculez les montants de vos revenus à reporter dans votre + déclaration de revenus. + title: Déclaration de revenus des PAMC + shortname: Assistant à la déclaration de revenus des PAMC + title: Assistant à la déclaration de revenus pour les PAMC pour-mon-entreprise: avertissement-entreprise-non-traitée: <0>Il n'existe pas encore de simulateur de revenu pour votre type d'entreprise sur ce site.<1>Si vous souhaitez diff --git a/site/source/pages/assistants/declaration-revenus-pamc/components/Formulaire.tsx b/site/source/pages/assistants/declaration-revenus-pamc/components/Formulaire.tsx new file mode 100644 index 0000000000..d0557add04 --- /dev/null +++ b/site/source/pages/assistants/declaration-revenus-pamc/components/Formulaire.tsx @@ -0,0 +1,62 @@ +import { AssistantGoal } from '@/components/Assistant/AssistantGoal' +import { WhenAlreadyDefined } from '@/components/EngineValue/WhenAlreadyDefined' +import { WhenApplicable } from '@/components/EngineValue/WhenApplicable' +import { H2 } from '@/design-system/typography/heading' + +import { SimpleField } from '../../components/Fields' + +export default function Formulaire() { + return ( + <> +

Profession

+ + + + +

Recettes

+ + + + +

Données du relevé SNIR

+ + + + + + + +

Structures de soins

+
+ + + +

Déductions et exonérations

+ + + + + + +

Autres revenus non salariés

+ + + + + + + +

Actes conventionnés

+
+ + +

Revenus de remplacement

+ + +
+ + ) +} diff --git "a/site/source/pages/assistants/declaration-revenus-pamc/components/R\303\251sultats.tsx" "b/site/source/pages/assistants/declaration-revenus-pamc/components/R\303\251sultats.tsx" new file mode 100644 index 0000000000..ebaad0faf3 --- /dev/null +++ "b/site/source/pages/assistants/declaration-revenus-pamc/components/R\303\251sultats.tsx" @@ -0,0 +1,85 @@ +import { Condition } from '@/components/EngineValue/Condition' +import { WhenAlreadyDefined } from '@/components/EngineValue/WhenAlreadyDefined' +import { SimulationValue } from '@/components/Simulation/SimulationValue' +import { Emoji } from '@/design-system/emoji' +import { Container } from '@/design-system/layout' +import { H2, H3 } from '@/design-system/typography/heading' + +export default function Résultats() { + return ( + + theme.colors.bases.primary[600]} + > +

+ Montants à reporter dans votre déclaration de + revenus +

+ + + +

Recettes brutes

+ + + +

Montant des revenus de remplacement

+
+ + + +

Déductions et exonérations

+
+ + + +

Cotisations sociales obligatoires

+ + +

Répartition des revenus nets

+ + + + +

Données transmises par l’Assurance Maladie

+ + + + + + + +
+
+ ) +} diff --git a/site/source/pages/assistants/declaration-revenus-pamc/config.ts b/site/source/pages/assistants/declaration-revenus-pamc/config.ts new file mode 100644 index 0000000000..af7d8823c0 --- /dev/null +++ b/site/source/pages/assistants/declaration-revenus-pamc/config.ts @@ -0,0 +1,39 @@ +import DéclarationRevenusPAMC from '.' +import { config } from '../../simulateurs/_configs/config' +import { SimulatorsDataParams } from '../../simulateurs/_configs/types' + +export function déclarationRevenusPAMCConfig({ + t, + sitePaths, +}: SimulatorsDataParams) { + return config({ + id: 'déclaration-revenus-pamc', + pathId: 'assistants.déclaration-revenus-pamc', + path: sitePaths.assistants['déclaration-revenus-pamc'], + iframePath: 'déclaration-revenus-pamc', + icône: '📑', + tracking: { + chapter1: 'assistant', + chapter2: 'declaration_revenus_pamc', + }, + meta: { + description: t( + 'pages.assistants.declaration-revenus-pamc.meta.description', + 'Calculez les montants de vos revenus à reporter dans votre déclaration de revenus.' + ), + title: t( + 'pages.assistants.declaration-revenus-pamc.meta.title', + 'Déclaration de revenus des PAMC' + ), + }, + shortName: t( + 'pages.assistants.declaration-revenus-pamc.shortname', + 'Assistant à la déclaration de revenus des PAMC' + ), + title: t( + 'pages.assistants.declaration-revenus-pamc.title', + 'Assistant à la déclaration de revenus pour les PAMC' + ), + component: DéclarationRevenusPAMC, + } as const) +} diff --git a/site/source/pages/assistants/declaration-revenus-pamc/index.tsx b/site/source/pages/assistants/declaration-revenus-pamc/index.tsx new file mode 100644 index 0000000000..d0878a83da --- /dev/null +++ b/site/source/pages/assistants/declaration-revenus-pamc/index.tsx @@ -0,0 +1,125 @@ +import { Trans } from 'react-i18next' +import { useDispatch, useSelector } from 'react-redux' +import { styled } from 'styled-components' + +import { TrackPage } from '@/components/ATInternetTracking' +import Warning from '@/components/ui/WarningBlock' +import { Message } from '@/design-system' +import { Button } from '@/design-system/buttons' +import { Spacing } from '@/design-system/layout' +import { Strong } from '@/design-system/typography' +import { Link } from '@/design-system/typography/link' +import { Li, Ul } from '@/design-system/typography/list' +import { Body } from '@/design-system/typography/paragraphs' +import useSimulationConfig from '@/hooks/useSimulationConfig' +import { useSitePaths } from '@/sitePaths' +import { resetSimulation } from '@/store/actions/actions' +import { situationSelector } from '@/store/selectors/simulationSelectors' + +import Formulaire from './components/Formulaire' +import Résultats from './components/Résultats' +import { configDéclarationRevenusPAMC } from './simulationConfig' + +export default function DéclarationRevenusPAMC() { + const { absoluteSitePaths } = useSitePaths() + useSimulationConfig({ + key: absoluteSitePaths.assistants['déclaration-revenus-pamc'], + config: configDéclarationRevenusPAMC, + autoloadLastSimulation: true, + }) + const situation = useSelector(situationSelector) + const dispatch = useDispatch() + + return ( + <> + {Object.keys(situation).length ? ( + + ) : ( + + )} + + +
    + + Cet assistant est à destination des{' '} + + praticiens et auxiliaires médicaux conventionnés (PAMC) + + . + + + Il a pour but de vous aider à remplir le{' '} + volet social de votre déclaration de revenus à + réaliser sur{' '} + + impots.gouv.fr + + . + + + En cas de déficit, renseignez le signe « - » devant + le montant. + + + + L’assistant ne prend pas en compte les situations suivantes : + +
      +
    • revenus étrangers,
    • +
    • revenus non professionnels,
    • +
    • changement de régime en cours d’année,
    • +
    • comptabilités d’engagement,
    • +
    • médecins adhérents au dispositif RSPM.
    • +
    + Si vous êtes dans l’une de ces situations, nous vous invitons à + contacter votre Urssaf pour vous accompagner. +
    +
+ + + Les calculs sont indicatifs. Ils sont faits à + partir des éléments que vous avez saisis et des éléments + réglementaires applicables, mais ils ne tiennent pas compte de + l’ensemble de votre situation.{' '} + Ils ne se substituent pas aux décomptes réels de + l’Urssaf, de l’administration fiscale ou de tout autre organisme. + + +
+ + + Afin de faciliter le remplissage, préparez : +
    +
  • l’ensemble des recettes encaissées,
  • +
  • le détail des cotisations versées à l’Urssaf,
  • +
  • le détail des cotisations versées à votre caisse de retraite.
  • +
+
+ + + + + + + + + + + + ) +} + +const StyledLi = styled(Li)` + &::before { + color: ${({ theme }) => theme.colors.bases.tertiary[800]} !important; + } +` diff --git a/site/source/pages/assistants/declaration-revenus-pamc/simulationConfig.ts b/site/source/pages/assistants/declaration-revenus-pamc/simulationConfig.ts new file mode 100644 index 0000000000..0ef921b150 --- /dev/null +++ b/site/source/pages/assistants/declaration-revenus-pamc/simulationConfig.ts @@ -0,0 +1,8 @@ +import { SimulationConfig } from '@/domaine/SimulationConfig' + +export const configDéclarationRevenusPAMC: SimulationConfig = { + situation: { + 'déclaration revenus PAMC': 'oui', + }, + 'unité par défaut': '€', +} diff --git a/site/source/pages/simulateurs-et-assistants/metadata-src.ts b/site/source/pages/simulateurs-et-assistants/metadata-src.ts index 2934066708..9359d86f42 100644 --- a/site/source/pages/simulateurs-et-assistants/metadata-src.ts +++ b/site/source/pages/simulateurs-et-assistants/metadata-src.ts @@ -2,6 +2,7 @@ import { ImmutableType } from '@/types/utils' import { choixStatutJuridiqueConfig } from '../assistants/choix-du-statut/config' import { déclarationChargesSocialesIndépendantConfig } from '../assistants/declaration-charges-sociales-independant/config' +import { déclarationRevenusPAMCConfig } from '../assistants/declaration-revenus-pamc/config' import { demandeMobilitéConfig } from '../assistants/demande-mobilité/config' import { pourMonEntrepriseConfig } from '../assistants/pour-mon-entreprise/config' import { rechercheCodeApeConfig } from '../assistants/recherche-code-ape/config' @@ -71,6 +72,7 @@ const getMetadataSrc = (params: SimulatorsDataParams) => { // assistants: ...choixStatutJuridiqueConfig(params), ...déclarationChargesSocialesIndépendantConfig(params), + ...déclarationRevenusPAMCConfig(params), ...demandeMobilitéConfig(params), ...pourMonEntrepriseConfig(params), ...rechercheCodeApeConfig(params), diff --git a/site/source/sitePaths.ts b/site/source/sitePaths.ts index 164f9b7365..cbce8847ee 100644 --- a/site/source/sitePaths.ts +++ b/site/source/sitePaths.ts @@ -10,6 +10,7 @@ const rawSitePathsFr = { 'recherche-code-ape': 'recherche-code-ape', 'déclaration-charges-sociales-indépendant': 'declaration-charges-sociales-independant', + 'déclaration-revenus-pamc': 'declaration-revenus-pam', économieCollaborative: { index: 'économie-collaborative', }, @@ -105,6 +106,7 @@ const rawSitePathsEn = { 'recherche-code-ape': 'search-code-ape', 'déclaration-charges-sociales-indépendant': 'declaration-social-charges-independent', + 'déclaration-revenus-pamc': 'income-declaration-pam', économieCollaborative: { index: 'sharing-economy', votreSituation: 'your-situation', diff --git a/site/source/store/reducers/simulation.reducer.ts b/site/source/store/reducers/simulation.reducer.ts index 344f8f640f..c931f6df0a 100644 --- a/site/source/store/reducers/simulation.reducer.ts +++ b/site/source/store/reducers/simulation.reducer.ts @@ -54,6 +54,7 @@ export function simulationReducer( ...state, hiddenNotifications: [...state.hiddenNotifications, action.id], } + case 'RESET_SIMULATION': return { ...state, @@ -137,6 +138,7 @@ export function simulationReducer( return newState } + case 'RETOURNE_À_LA_QUESTION_PRÉCÉDENTE': { if (state.questionsRépondues.length === 0) { return state