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.0><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.0><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.