diff --git a/data/etl/teleicare_history/extractor.py b/data/etl/teleicare_history/extractor.py index b96e8c9ec..acdec9f03 100644 --- a/data/etl/teleicare_history/extractor.py +++ b/data/etl/teleicare_history/extractor.py @@ -156,6 +156,7 @@ def create_declaration_from_teleicare_history(): * télédéclarante de la déclaration (cette relation n'est pour le moment pas conservée, car le BEPIAS ne sait pas ce qu'elle signifie) """ nb_created_declarations = 0 + for ica_complement_alimentaire in IcaComplementAlimentaire.objects.all(): # retrouve la déclaration la plus à jour correspondant à ce complément alimentaire all_ica_declarations = IcaDeclaration.objects.filter(cplalim_id=ica_complement_alimentaire.cplalim_ident) @@ -207,10 +208,15 @@ def create_declaration_from_teleicare_history(): # other_conditions= # effects= # other_effects= + # address= + # postal_code= + # city= + # country= status=Declaration.DeclarationStatus.WITHDRAWN if latest_ica_declaration.dcl_date_fin_commercialisation else DECLARATION_STATUS_MAPPING[latest_ica_version_declaration.stattdcl_ident], ) + try: declaration.save() nb_created_declarations += 1 diff --git a/data/factories/teleicare_history/__init__.py b/data/factories/teleicare_history/__init__.py index 3494cff77..a446b86cd 100644 --- a/data/factories/teleicare_history/__init__.py +++ b/data/factories/teleicare_history/__init__.py @@ -3,14 +3,32 @@ import factory import faker + from phonenumber_field.phonenumber import PhoneNumber +from datetime import datetime, timedelta +from random import randrange from data.choices import CountryChoices from data.models.teleicare_history.ica_etablissement import IcaEtablissement +from data.models.teleicare_history.ica_declaration import ( + IcaComplementAlimentaire, + IcaDeclaration, + IcaVersionDeclaration, +) from data.utils.string_utils import make_random_str from data.factories.company import _make_siret, _make_vat, _make_phone_number +def random_date(start, end=datetime.now()): + """ + Retourne une date random entre une date de début et une date de fin + """ + delta = end - start + int_delta = (delta.days * 24 * 60 * 60) + delta.seconds + random_second = randrange(int_delta) + return start + timedelta(seconds=random_second) + + class EtablissementFactory(factory.django.DjangoModelFactory): class Meta: model = IcaEtablissement @@ -28,3 +46,71 @@ class Meta: etab_adre_ville = factory.Faker("city", locale="FR") etab_adre_cp = factory.Faker("postcode", locale="FR") etab_adre_voie = factory.Faker("street_address", locale="FR") + + +class ComplementAlimentaireFactory(factory.django.DjangoModelFactory): + class Meta: + model = IcaComplementAlimentaire + + cplalim_ident = factory.Sequence(lambda n: n + 1) + frmgal_ident = factory.Faker("pyint", min_value=0, max_value=20) + etab = factory.SubFactory(EtablissementFactory) + cplalim_marque = factory.Faker("text", max_nb_chars=20) + cplalim_gamme = factory.Faker("text", max_nb_chars=20) + cplalim_nom = factory.Faker("text", max_nb_chars=20) + dclencours_gout_arome_parfum = factory.Faker("text", max_nb_chars=20) + cplalim_forme_galenique_autre = factory.Faker("text", max_nb_chars=20) + + +class DeclarationFactory(factory.django.DjangoModelFactory): + class Meta: + model = IcaDeclaration + + dcl_ident = factory.Sequence(lambda n: n + 1) + cplalim = factory.SubFactory(ComplementAlimentaireFactory) + tydcl_ident = factory.Faker("pyint", min_value=0, max_value=20) + etab = factory.SubFactory(EtablissementFactory) + etab_ident_rmm_declarant = factory.Faker("pyint", min_value=0, max_value=20) + dcl_date = datetime.strftime(random_date(start=datetime(2016, 1, 1)), "%m/%d/%Y %H:%M:%S %p") + dcl_date_fin_commercialisation = factory.LazyFunction( + lambda: datetime.strftime(random_date(start=datetime(2016, 1, 1)), "%m/%d/%Y %H:%M:%S %p") + if random.random() > 0.3 + else None + ) + + +class VersionDeclarationFactory(factory.django.DjangoModelFactory): + class Meta: + model = IcaVersionDeclaration + + vrsdecl_ident = factory.Sequence(lambda n: n + 1) + ag_ident = factory.Faker("pyint", min_value=0, max_value=20) + typvrs_ident = factory.Faker("pyint", min_value=0, max_value=20) + unt_ident = factory.Faker("pyint", min_value=0, max_value=20) + pays_ident_adre = factory.Faker("pyint", min_value=0, max_value=8) + etab = factory.SubFactory(EtablissementFactory) + pays_ident_pays_de_reference = factory.Faker("pyint", min_value=0, max_value=8) + dcl = factory.SubFactory(DeclarationFactory) + stattdcl_ident = factory.Faker("pyint", min_value=0, max_value=8) + stadcl_ident = factory.Faker("pyint", min_value=0, max_value=8) + vrsdecl_numero = factory.Faker("pyint", min_value=0, max_value=20) + vrsdecl_commentaires = factory.Faker("text", max_nb_chars=20) + vrsdecl_mise_en_garde = factory.Faker("text", max_nb_chars=20) + vrsdecl_durabilite = factory.Faker("pyint", min_value=0, max_value=8) + vrsdecl_mode_emploi = factory.Faker("text", max_nb_chars=20) + vrsdecl_djr = factory.fuzzy.FuzzyText(length=4, chars=string.ascii_uppercase + string.digits) + vrsdecl_conditionnement = factory.Faker("text", max_nb_chars=20) + vrsdecl_poids_uc = factory.Faker("pyfloat") + vrsdecl_forme_galenique_autre = factory.Faker("text", max_nb_chars=20) + vrsdecl_date_limite_reponse_pro = factory.Faker("text", max_nb_chars=20) + vrsdecl_observations_ac = factory.Faker("text", max_nb_chars=20) + vrsdecl_observations_pro = factory.Faker("text", max_nb_chars=20) + vrsdecl_numero_dossiel = factory.Faker("text", max_nb_chars=20) + vrsdecl_adre_ville = factory.Faker("text", max_nb_chars=20) + vrsdecl_adre_cp = factory.Faker("text", max_nb_chars=20) + vrsdecl_adre_voie = factory.Faker("text", max_nb_chars=20) + vrsdecl_adre_comp = factory.Faker("text", max_nb_chars=20) + vrsdecl_adre_comp2 = factory.Faker("text", max_nb_chars=20) + vrsdecl_adre_dist = factory.Faker("text", max_nb_chars=20) + vrsdecl_adre_region = factory.Faker("text", max_nb_chars=20) + vrsdecl_adre_raison_sociale = factory.Faker("text", max_nb_chars=20) diff --git a/data/models/teleicare_history/ica_declaration.py b/data/models/teleicare_history/ica_declaration.py index 47c68d89e..f235b3099 100644 --- a/data/models/teleicare_history/ica_declaration.py +++ b/data/models/teleicare_history/ica_declaration.py @@ -41,10 +41,10 @@ class IcaDeclaration(models.Model): ) # correspond à l'entreprise gestionnaire de la déclaration etab_ident_rmm_declarant = models.IntegerField() dcl_date = models.TextField() - dcl_saisie_administration = models.BooleanField() - dcl_annee = models.IntegerField() - dcl_mois = models.IntegerField() - dcl_numero = models.IntegerField() + dcl_saisie_administration = models.BooleanField(null=True) # rendu nullable pour simplifier les Factories + dcl_annee = models.IntegerField(null=True) # rendu nullable pour simplifier les Factories + dcl_mois = models.IntegerField(null=True) # rendu nullable pour simplifier les Factories + dcl_numero = models.IntegerField(null=True) # rendu nullable pour simplifier les Factories dcl_date_fin_commercialisation = models.TextField(blank=True, null=True) class Meta: @@ -55,20 +55,20 @@ class Meta: class IcaVersionDeclaration(models.Model): vrsdecl_ident = models.IntegerField(primary_key=True) ag_ident = models.IntegerField(blank=True, null=True) - typvrs_ident = models.IntegerField() + typvrs_ident = models.IntegerField(null=True) # rendu nullable pour simplifier les Factories unt_ident = models.IntegerField(blank=True, null=True) pays_ident_adre = models.IntegerField(blank=True, null=True) etab = models.ForeignKey( IcaEtablissement, on_delete=models.CASCADE, db_column="etab_ident" ) # correspond à l'entreprise télédéclarante - ex_ident = models.IntegerField() + ex_ident = models.IntegerField(null=True) # rendu nullable pour simplifier les Factories pays_ident_pays_de_reference = models.IntegerField(blank=True, null=True) dcl = models.ForeignKey( IcaDeclaration, on_delete=models.CASCADE, db_column="dcl_ident" ) # dcl_ident est aussi une foreign_key vers IcaComplementAlimentaire stattdcl_ident = models.IntegerField(blank=True, null=True) stadcl_ident = models.IntegerField(blank=True, null=True) - vrsdecl_numero = models.IntegerField() + vrsdecl_numero = models.IntegerField(null=True) vrsdecl_commentaires = models.TextField(blank=True, null=True) vrsdecl_mise_en_garde = models.TextField(blank=True, null=True) vrsdecl_durabilite = models.IntegerField(blank=True, null=True) @@ -80,9 +80,9 @@ class IcaVersionDeclaration(models.Model): vrsdecl_date_limite_reponse_pro = models.TextField(blank=True, null=True) vrsdecl_observations_ac = models.TextField(blank=True, null=True) vrsdecl_observations_pro = models.TextField(blank=True, null=True) - vrsdecl_mode_json = models.BooleanField() + vrsdecl_mode_json = models.BooleanField(null=True) # rendu nullable pour simplifier les Factories vrsdecl_numero_dossiel = models.TextField(blank=True, null=True) - vrsdecl_mode_sans_verif = models.BooleanField() + vrsdecl_mode_sans_verif = models.BooleanField(null=True) # rendu nullable pour simplifier les Factories vrsdecl_adre_ville = models.TextField(blank=True, null=True) vrsdecl_adre_cp = models.TextField(blank=True, null=True) vrsdecl_adre_voie = models.TextField(blank=True, null=True) diff --git a/data/tests/test_teleicare_history_importer.py b/data/tests/test_teleicare_history_importer.py index 724798a29..e3d0e4909 100644 --- a/data/tests/test_teleicare_history_importer.py +++ b/data/tests/test_teleicare_history_importer.py @@ -3,10 +3,26 @@ from django.db import connection from django.test import TestCase -from data.etl.teleicare_history.extractor import match_companies_on_siret_or_vat +from data.etl.teleicare_history.extractor import ( + create_declaration_from_teleicare_history, + match_companies_on_siret_or_vat, +) from data.factories.company import CompanyFactory, _make_siret, _make_vat -from data.factories.teleicare_history import EtablissementFactory +from data.factories.galenic_formulation import GalenicFormulationFactory +from data.factories.teleicare_history import ( + ComplementAlimentaireFactory, + DeclarationFactory, + EtablissementFactory, + VersionDeclarationFactory, +) +from data.factories.unit import SubstanceUnitFactory from data.models.company import Company +from data.models.declaration import Declaration +from data.models.teleicare_history.ica_declaration import ( + IcaComplementAlimentaire, + IcaDeclaration, + IcaVersionDeclaration, +) from data.models.teleicare_history.ica_etablissement import IcaEtablissement @@ -20,21 +36,24 @@ def setUp(self): Adapted from: https://stackoverflow.com/a/49800437 """ super().setUp() - with connection.schema_editor() as schema_editor: - schema_editor.create_model(IcaEtablissement) + for table in [IcaEtablissement, IcaComplementAlimentaire, IcaDeclaration, IcaVersionDeclaration]: + with connection.schema_editor() as schema_editor: + schema_editor.create_model(table) - if IcaEtablissement._meta.db_table not in connection.introspection.table_names(): - raise ValueError( - "Table `{table_name}` is missing in test database.".format( - table_name=IcaEtablissement._meta.db_table + if table._meta.db_table not in connection.introspection.table_names(): + raise ValueError( + "Table `{table_name}` is missing in test database.".format(table_name=table._meta.db_table) ) - ) def tearDown(self): super().tearDown() - - with connection.schema_editor() as schema_editor: - schema_editor.delete_model(IcaEtablissement) + for table in [IcaVersionDeclaration, IcaComplementAlimentaire, IcaDeclaration, IcaEtablissement]: + table.objects.all().delete() + # la suppression des modèles fail avec l'erreur + # django.db.utils.OperationalError: cannot DROP TABLE "ica_versiondeclaration" because it has pending trigger events + # même avec un sleep(15) + # with connection.schema_editor() as schema_editor: + # schema_editor.delete_model(table) def test_match_companies_on_siret_or_vat(self): """ @@ -90,15 +109,61 @@ def test_create_new_companies(self): """ etablissement_to_create_as_company = EtablissementFactory(etab_siret=None, etab_ica_importateur=True) - # ne sera pas créé car le numéro de téléphone est mal formatté + # devrait être créée malgré le numéro de téléphone mal formaté _ = EtablissementFactory(etab_siret=None, etab_ica_importateur=True, etab_telephone="0345") self.assertEqual(Company.objects.filter(siccrf_id=etablissement_to_create_as_company.etab_ident).count(), 0) match_companies_on_siret_or_vat(create_if_not_exist=True) - self.assertEqual(Company.objects.filter(siccrf_id=etablissement_to_create_as_company.etab_ident).count(), 1) + self.assertTrue(Company.objects.filter(siccrf_id=etablissement_to_create_as_company.etab_ident).exists()) + self.assertEqual(Company.objects.exclude(siccrf_id=None).count(), 2) created_company = Company.objects.get(siccrf_id=etablissement_to_create_as_company.etab_ident) self.assertEqual(created_company.siccrf_id, etablissement_to_create_as_company.etab_ident) self.assertEqual(created_company.address, etablissement_to_create_as_company.etab_adre_voie) self.assertEqual(created_company.postal_code, etablissement_to_create_as_company.etab_adre_cp) self.assertEqual(created_company.city, etablissement_to_create_as_company.etab_adre_ville) + + def test_create_declaration_from_history(self): + """ + Les déclarations sont créées à partir d'object historiques des modèles Ica_ + """ + galenic_formulation_id = 1 + galenic_formulation = GalenicFormulationFactory(siccrf_id=galenic_formulation_id) + unit_id = 1 + unit = SubstanceUnitFactory(siccrf_id=unit_id) + etablissement_to_create_as_company = EtablissementFactory(etab_siret=None, etab_ica_importateur=True) + + CA_to_create_as_declaration = ComplementAlimentaireFactory( + etab=etablissement_to_create_as_company, frmgal_ident=galenic_formulation_id + ) + declaration_to_create_as_declaration = DeclarationFactory(cplalim=CA_to_create_as_declaration) + version_declaration_to_create_as_declaration = VersionDeclarationFactory( + dcl=declaration_to_create_as_declaration, + stadcl_ident=8, + stattdcl_ident=2, + unt_ident=unit_id, + vrsdecl_djr="32 kg of ppo", + ) + + match_companies_on_siret_or_vat(create_if_not_exist=True) + create_declaration_from_teleicare_history() + + version_declaration_to_create_as_declaration.refresh_from_db() + created_declaration = Declaration.objects.get(siccrf_id=CA_to_create_as_declaration.cplalim_ident) + self.assertEqual(created_declaration.name, CA_to_create_as_declaration.cplalim_nom) + self.assertEqual(created_declaration.brand, CA_to_create_as_declaration.cplalim_marque) + self.assertEqual(created_declaration.gamme, CA_to_create_as_declaration.cplalim_gamme) + self.assertEqual(created_declaration.flavor, CA_to_create_as_declaration.dclencours_gout_arome_parfum) + self.assertEqual(created_declaration.galenic_formulation, galenic_formulation) + self.assertEqual(created_declaration.unit_quantity, 32) + self.assertEqual(created_declaration.unit_measurement, unit) + self.assertEqual( + created_declaration.conditioning, version_declaration_to_create_as_declaration.vrsdecl_conditionnement + ) + self.assertEqual( + created_declaration.daily_recommended_dose, + str(version_declaration_to_create_as_declaration.vrsdecl_poids_uc), + ) + self.assertEqual( + created_declaration.minimum_duration, str(version_declaration_to_create_as_declaration.vrsdecl_durabilite) + ) diff --git a/frontend/src/components/AppHeader.vue b/frontend/src/components/AppHeader.vue index 4441e0741..2309f3d2c 100644 --- a/frontend/src/components/AppHeader.vue +++ b/frontend/src/components/AppHeader.vue @@ -40,6 +40,10 @@ const navItems = [ to: "/blog", text: "Ressources", }, + { + to: "/faq", + text: "FAQ", + }, ] const loggedOnlyNavItems = [ { diff --git a/frontend/src/router/index.js b/frontend/src/router/index.js index 92dd853fe..ec98fb297 100644 --- a/frontend/src/router/index.js +++ b/frontend/src/router/index.js @@ -35,6 +35,7 @@ import ContactForm from "@/views/ContactForm" import CompliancePage from "@/views/CompliancePage" import DeclaredElementPage from "@/views/DeclaredElementPage" import MandatedCompaniesPage from "@/views/MandatedCompaniesPage" +import FaqPage from "@/views/FaqPage" import { ref } from "vue" const routes = [ @@ -372,6 +373,14 @@ const routes = [ title: "Conformité au droit alimentaire", }, }, + { + path: "/faq", + name: "FaqPage", + component: FaqPage, + meta: { + title: "Foire aux questions", + }, + }, { path: "/:catchAll(.*)*", // https://stackoverflow.com/a/70343919/2255491 component: NotFound, diff --git a/frontend/src/views/BlogPostPage.vue b/frontend/src/views/BlogPostPage.vue index 368ce9889..22548418c 100644 --- a/frontend/src/views/BlogPostPage.vue +++ b/frontend/src/views/BlogPostPage.vue @@ -10,9 +10,11 @@ />
{{ author }}
-{{ date }}
+{{ author }}
+{{ date }}
+Documentation pour vous guider dans la prise en main de Compl'Alim.
++ Le moteur de recherche "Ingrédients" vous permet de vérifier rapidement les recommandations d'usage et la + conformité des ingrédients que vous envisagez d’utiliser dans vos produits. +
++ En consultant les informations sur les doses autorisées, les usages permis et les restrictions + réglementaires, vous vous assurez que la composition de vos nouveaux produits respecte les normes en vigueur + dès la phase de conception. +
++ Cela vous aide à anticiper les exigences réglementaires et à sécuriser la mise sur le marché de vos + produits. +
++ Seuls les gestionnaires ont le pouvoir de gérer les accès des collaborateurs. Pour ajouter un collaborateur, + voici la marche à suivre : +
++ Depuis cette même page, vous pouvez modifier les droits d’un collaborateur (ex. passer de gestionnaire à + déclarant) ou révoquer ses accès. +
+Le gestionnaire et le déclarant jouent des rôles distincts au sein de la plateforme.
++ Le gestionnaire est responsable de la gestion des informations de l'entreprise ainsi que des collaborateurs + qui ont les droits de gestion et/ou de déclaration pour cette entreprise. +
++ Le déclarant a uniquement le pouvoir de réaliser des déclarations pour le compte de l'entreprise à laquelle + il est rattaché. +
++ + ⚠️ Attention, le gestionnaire n'est pas automatiquement déclarant (vous ne pourrez pas déclarer un nouveau + produit) + + . Pour cumuler les fonctions de gestion et de déclaration, le gestionnaire doit s'attribuer les deux rôles. +
++ Lors du lancement de la plateforme, il n’était pas possible d’inviter directement une société mandataire. Le + gestionnaire devait inviter individuellement les consultants ou collaborateurs de la société mandatée pour + leur permettre de réaliser des déclarations au nom son entreprise. +
++ Désormais, tous les comptes associés à une société mandataire auront automatiquement l’autorisation de + déclarer pour les clients ayant confié un mandat à cette entité. +
++ Pour cela, un nouvel onglet + Entreprises mandatées + est disponible dans votre tableau de bord. +
+Voici les étapes à suivre pour rattacher une entreprise :
++ ⚠️ L’entreprise mandatée doit disposer d’un compte sur la plateforme. Si ce n’est pas le cas, elle devra en + créer un au préalable. +
++ Si vous souhaitez ajuster les rôles des déclarants de votre entreprise, n’hésitez pas à nous contacter à + l'adresse suivante : + contact@compl-alim.beta.gouv.fr +
+Les champs obligatoires à remplir sont indiqués par une astérix *.
++ 💡 Vous pouvez naviguer librement entre ces onglets sans avoir à remplir tous les champs d'un onglet avant + de passer au suivant. +
++ Toutes vos informations s’enregistrent automatiquement à chaque changement d'étape, en cliquant sur les + boutons en bas de page "Revenir à l'onglet " ou "Passer à l'onglet ". Si le dossier n’est pas soumis, il + sera automatiquement sauvegardé en tant que brouillon. +
++ L'onglet "Produit" vous permet de renseigner les informations principales relatives à votre complément + alimentaire, telles que son nom, sa marque, son format, les populations cibles, ainsi que les effets + recherchés. Plus précisément, vous devez renseigner : +
++ Si une définition n'est pas claire, n'hésitez pas à nous contacter pour demander des informations + complémentaires. +
++ Cet onglet vous permet de renseigner les ingrédients et les substances actives de votre complément + alimentaire. +
++ + La section Ingrédients sert à ajouter les éléments constitutifs du produit, tels que les plantes ou autres + matières premières. + + Pour ajouter un ingrédient, tapez son nom dans le moteur de recherche puis sélectionnez l’ingrédient + correspondant dans la liste déroulante qui s’affiche. +
++ 💡 Dans la section "Ingrédients", vous avez désormais la possibilité de préciser si l’ingrédient ajouté joue + un rôle actif ou non actif dans le produit, afin d'éviter la création de doublons dans la base de données et + de mieux structurer les informations déclarées. +
++ + La section "Substances" affiche automatiquement les composés actifs présents dans les ingrédients actifs + + . Une vigilance particulière est accordée à certaines de ces substances, notamment sur la quantité présente + qui peut conduire à des restrictions d’usage. Il est donc essentiel de les identifier clairement et de + préciser leurs quantités pour assurer la sécurité et la conformité réglementaire du complément alimentaire. +
++ Dans la section "Substances", contrairement à l'ancien outil de déclaration Teleicare, il vous est pour le + moment demandé de renseigner les quantités présentes dans le produit pour toutes les substances identifiées. + Cependant, dans les prochains mois, nous allons distinguer les substances pour lesquelles il est obligatoire + de déclarer le dosage (en raison de restrictions réglementaires, par exemple) de celles pour lesquelles cela + ne sera pas nécessaire. Nous vous tiendrons informés dès que cette modification sera effectuée. + + En attendant, si une substance ne nécessite pas de dosage, vous pouvez simplement indiquer zéro. + +
++ 💡 L'icône "commentaire" en couleur bleue vous permet d'accéder aux informations disponibles sur chaque + substance, telles que la quantité maximale autorisée ou les recommandations spécifiques pour certaines + populations. +
++ 🚀 Dans les prochains mois, nous allons enrichir nos bases de données afin de vous fournir encore plus + d’informations, pour mieux vous accompagner dans la déclaration de vos produits. +
++ Si un ingrédient de votre complément alimentaire n’existe pas dans Compl’Alim, voici la démarche à suivre : +
+Vous pouvez créer :
++ Vous n’avez désormais plus besoin de déterminer vous-mêmes si le complément alimentaire relève de l'article + 15 ou 16 du décret n°2006-352. L'algorithme de Compl'Alim se charge automatiquement de cette classification + en fonction de la composition que vous renseignez. Cela simplifie la procédure et garantit une attribution + conforme aux dispositions réglementaires. +
++ Dès qu'il y a une évolution ou une actualité concernant votre dossier, vous serez automatiquement averti par + email. Cela vous permet de rester informé.e en temps réel de toute mise à jour importante. +
++ Vous pouvez également accéder à une vue récapitulative cliquant sur la carte "Toutes mes déclarations" + depuis votre tableau de bord. Vous accédez alors un tableau répertoriant l'ensemble de vos déclarations. Ce + tableau est partagé avec tous les collaborateurs rattachés à votre entreprise sur Compl’Alim, ce qui vous + permet de suivre collectivement l’avancement de chaque dossier. +
++ accéder aux détails d'un dossier, cliquez sur le nom du produit dans le tableau + . +
++ 💡 Le filtre "Types de déclaration affichés" vous permet de sélectionner les dossiers que vous souhaitez + voir à l’écran, en choisissant les types de déclarations qui vous intéressent : Brouillon, Instruction, + Observation, Objection, Abandon, Déclaration finalisée, Refus, Retiré du marché. +
++ Une fois votre dossier soumis, vous pouvez télécharger l'accusé d'enregistrement au format PDF. Pour cela : +
++ Ce PDF contient l’accusé d’enregistrement de déclaration de votre complément alimentaire ainsi que votre + engagement de conformité. +
++ Actuellement, il n'est pas encore possible de télécharger directement le résumé de votre dossier via la + plateforme. +
+En attendant cette fonctionnalité, vous pouvez créer une version PDF en suivant cette méthode :
+Et voilà, le tour est joué !
++ Lorsqu’une objection a été émise sur la déclaration de votre produit, vous pouvez consulter les détails en + vous rendant sur la page dédiée à ce complément alimentaire. Pour cela, cliquez sur le nom du produit qui + vous intéresse dans le tableau récapitulatif ("Toutes mes déclarations"). +
++ Les commentaires de l’instructeur, expliquant les raisons de cette observation/ objection, seront visibles + dans l'onglet Historique. Après avoir pris connaissance des remarques, il vous sera nécessaire de soumettre + une nouvelle version de votre dossier, en tenant compte des éléments supplémentaires ou des modifications + demandées par l'administration. +
++ Une fois votre dossier instruit, vous pouvez télécharger l’attestation de déclaration au format PDF. Pour + cela : +
+Pour rappel, vous serez informé.e par mail lorsque votre dossier aura été instruit.
+Oui, vous devez recréer une fiche pour votre entreprise sur Compl'Alim.
++ II ne sera pas nécessaire de déclarer à nouveau sur Compl'Alim les produits que vous avez déjà déclarés sur + Teleicare. +
++ L’historique de vos déclarations antérieures sera importé sur Compl'Alim d’ici la fin de l’année, ce qui + vous permettra de retrouver toutes vos informations sans avoir à refaire les démarches. Nous ferons le lien + grâce au SIRET de l'entreprise (après qu'elle ait été créée sur Compl'Alim). +
++ En attendant que cela soit fait, vous conserverez l'accès à la rubrique " + Je consulte les produits + " de Teleicare et pourrez donc toujours accéder à vos attestations de déclaration. +
++ Les dossiers transmis sur Teleicare seront instruits sur Teleicare. Vous conservez l’accès à la rubrique “Je + suis mes déclarations” de Teleicare. +
++ Une fois votre dossier instruit, l’attestation de déclaration sera importée sur Compl’Alim au moment de + l’import de l’historique prévu d’ici la fin de l’année (voir question ci-dessus). +
+