From 5e1279f4989ed0664dbc96cf0c71f1e5a70dfca3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?R=C3=A9mi=20PAILHAREY?= <rpailharey@grandlyon.com>
Date: Wed, 15 Dec 2021 08:42:16 +0000
Subject: [PATCH] feat(Partners): Add partners check modal

---
 manifest.webapp                               |   24 +-
 src/assets/icons/ico/notif_maintenance.svg    |   18 +
 src/assets/icons/ico/warn-orange.svg          |    3 +
 .../Connection/ConnectionResult.tsx           |   76 +-
 src/components/Home/ConsumptionView.tsx       |   43 +-
 src/components/Home/FluidButton.tsx           |   21 +-
 .../Konnector/KonnectorViewerCard.tsx         |   41 +-
 .../PartnersIssue/PartnersIssueModal.spec.tsx |   54 +
 .../PartnersIssue/PartnersIssueModal.tsx      |   92 ++
 .../PartnersIssueModal.spec.tsx.snap          | 1093 +++++++++++++++++
 .../PartnersIssue/partnersIssueModal.scss     |   34 +
 src/components/Splash/SplashRoot.tsx          |   48 +-
 src/enum/fluid.enum.ts                        |    1 +
 src/locales/fr.json                           |    8 +
 src/migrations/migration.data.ts              |   20 +-
 src/migrations/migration.ts                   |    1 +
 src/models/global.model.ts                    |    1 +
 src/models/partnersInfo.model.ts              |    6 +
 src/models/profile.model.ts                   |    7 +-
 src/services/fluid.service.spec.ts            |  150 +++
 src/services/fluid.service.ts                 |   79 +-
 src/services/initialization.service.ts        |    1 -
 src/services/partnersInfo.service.spec.ts     |   20 +
 src/services/partnersInfo.service.ts          |   32 +
 src/services/profile.service.spec.ts          |    4 +
 src/services/profile.service.ts               |    3 +
 src/store/global/global.actions.ts            |   16 +
 src/store/global/global.reducer.ts            |    9 +
 src/store/profile/profile.reducer.ts          |    1 +
 tests/__mocks__/fluidStatusData.mock.ts       |   14 +
 tests/__mocks__/profile.mock.ts               |    3 +
 tests/__mocks__/store.ts                      |    2 +
 32 files changed, 1865 insertions(+), 60 deletions(-)
 create mode 100644 src/assets/icons/ico/notif_maintenance.svg
 create mode 100644 src/assets/icons/ico/warn-orange.svg
 create mode 100644 src/components/PartnersIssue/PartnersIssueModal.spec.tsx
 create mode 100644 src/components/PartnersIssue/PartnersIssueModal.tsx
 create mode 100644 src/components/PartnersIssue/__snapshots__/PartnersIssueModal.spec.tsx.snap
 create mode 100644 src/components/PartnersIssue/partnersIssueModal.scss
 create mode 100644 src/models/partnersInfo.model.ts
 create mode 100644 src/services/partnersInfo.service.spec.ts
 create mode 100644 src/services/partnersInfo.service.ts

diff --git a/manifest.webapp b/manifest.webapp
index 3af905030..48b1332d2 100644
--- a/manifest.webapp
+++ b/manifest.webapp
@@ -59,6 +59,12 @@
         },
         "backoffice": {
           "description": "Requis pour la récupération et l’envoi de statistiques d’utilisation anonymisées."
+        },
+        "backoffice-partners-info-rec": {
+          "description": "Requis pour la récupération du status des services partenaires"
+        },
+        "backoffice-partners-info": {
+          "description": "Requis pour la récupération du status des services partenaires"
         }
       }
     },
@@ -109,10 +115,16 @@
           "description": "Required for sending cozy anonymized stats."
         },
         "backoffice-rec": {
-          "description": "Required for gathering and sending anonymous usage statistics."
+          "description": "Required for retrieving newsletter informations from backoffice rec."
         },
         "backoffice": {
-          "description": "Required for gathering and sending anonymous usage statistics."
+          "description": "Required for retrieving newsletter informations from backoffice prod."
+        },
+        "backoffice-partners-info-rec": {
+          "description": "Required for getting the status of partners' services"
+        },
+        "backoffice-partners-info": {
+          "description": "Required for getting the status of partners' services"
         }
       }
     }
@@ -211,6 +223,14 @@
     "backoffice-prod": {
       "type": "org.ecolyo.backoffice",
       "verbs": ["ALL"]
+    },
+    "backoffice-partners-info-rec": {
+      "type": "org.ecolyo.backoffice.partners.info.rec",
+      "verbs": ["ALL"]
+    },
+    "backoffice-partners-info": {
+      "type": "org.ecolyo.backoffice.partners.info",
+      "verbs": ["ALL"]
     }
   }
 }
diff --git a/src/assets/icons/ico/notif_maintenance.svg b/src/assets/icons/ico/notif_maintenance.svg
new file mode 100644
index 000000000..f1ce1f02a
--- /dev/null
+++ b/src/assets/icons/ico/notif_maintenance.svg
@@ -0,0 +1,18 @@
+<svg width="26" height="26" viewBox="0 0 26 26" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_d_9986_55791)">
+<circle cx="13" cy="11" r="11" fill="#383941"/>
+<circle cx="13" cy="11" r="10.5" stroke="white"/>
+</g>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M19 11.7213V10.2471H17.4414C17.3295 9.5783 17.0672 8.94367 16.6741 8.39114L17.7757 7.28962L16.711 6.225L15.6094 7.32652C15.0568 6.93317 14.4222 6.67033 13.7533 6.55779V5H12.2474V6.55779C11.5784 6.66998 10.9437 6.93285 10.3914 7.32652L9.28977 6.225L8.24691 7.26703L9.34549 8.36554C8.94176 8.92382 8.67224 9.56769 8.55788 10.2471H7V11.7213H8.55337C8.66213 12.4016 8.92651 13.0475 9.32591 13.6089L8.22432 14.7104L9.28901 15.775L10.3906 14.6735C10.9327 15.0597 11.563 15.3263 12.2467 15.4422V17H13.7526V15.4422C14.432 15.3277 15.0759 15.0582 15.6342 14.6547L16.7321 15.7524L17.7749 14.7104L16.6733 13.6089C17.0726 13.0474 17.3369 12.4015 17.4459 11.7213H19ZM13.0154 13.2972C12.41 13.2817 11.8345 13.0304 11.4118 12.5968C10.989 12.1631 10.7524 11.5815 10.7524 10.9759C10.7524 10.3703 10.989 9.78868 11.4118 9.35505C11.8345 8.92141 12.41 8.67008 13.0154 8.65466C13.6209 8.67008 14.1963 8.92141 14.6191 9.35505C15.0418 9.78868 15.2784 10.3703 15.2784 10.9759C15.2784 11.5815 15.0418 12.1631 14.6191 12.5968C14.1963 13.0304 13.6209 13.2817 13.0154 13.2972Z" fill="white"/>
+<defs>
+<filter id="filter0_d_9986_55791" x="0" y="0" width="26" height="26" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="2"/>
+<feGaussianBlur stdDeviation="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.7 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_9986_55791"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_9986_55791" result="shape"/>
+</filter>
+</defs>
+</svg>
diff --git a/src/assets/icons/ico/warn-orange.svg b/src/assets/icons/ico/warn-orange.svg
new file mode 100644
index 000000000..2a82160c8
--- /dev/null
+++ b/src/assets/icons/ico/warn-orange.svg
@@ -0,0 +1,3 @@
+<svg width="38" height="34" viewBox="0 0 38 34" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M37.5217 32.1521C38.1367 31.0979 38.1586 30.0437 37.5876 28.9896L21.7751 1.58125C21.1602 0.527083 20.2378 0 19.0079 0C17.7781 0 16.8557 0.527083 16.2407 1.58125L0.428255 28.9896C-0.142752 30.0437 -0.142752 31.0979 0.428255 32.1521C1.04318 33.2062 1.96558 33.7333 3.19544 33.7333H34.8204C36.0503 33.7333 36.9507 33.2062 37.5217 32.1521ZM20.564 19.292V13H17.374V19.292C17.374 19.9667 17.4143 20.6377 17.495 21.305C17.5757 21.965 17.682 22.6397 17.814 23.329H20.124C20.256 22.6397 20.3623 21.965 20.443 21.305C20.5237 20.6377 20.564 19.9667 20.564 19.292ZM17.143 26.563C17.0477 26.7903 17 27.036 17 27.3C17 27.564 17.0477 27.8133 17.143 28.048C17.2457 28.2753 17.3813 28.4733 17.55 28.642C17.726 28.8107 17.9313 28.9427 18.166 29.038C18.4007 29.1333 18.6573 29.181 18.936 29.181C19.2073 29.181 19.4603 29.1333 19.695 29.038C19.9297 28.9427 20.135 28.8107 20.311 28.642C20.487 28.4733 20.6227 28.2753 20.718 28.048C20.8207 27.8133 20.872 27.564 20.872 27.3C20.872 27.036 20.8207 26.7903 20.718 26.563C20.6227 26.3357 20.487 26.1377 20.311 25.969C20.135 25.8003 19.9297 25.6683 19.695 25.573C19.4603 25.4703 19.2073 25.419 18.936 25.419C18.6573 25.419 18.4007 25.4703 18.166 25.573C17.9313 25.6683 17.726 25.8003 17.55 25.969C17.3813 26.1377 17.2457 26.3357 17.143 26.563Z" fill="#EC9D41"/>
+</svg>
diff --git a/src/components/Connection/ConnectionResult.tsx b/src/components/Connection/ConnectionResult.tsx
index 3e93db6b5..22ea201a0 100644
--- a/src/components/Connection/ConnectionResult.tsx
+++ b/src/components/Connection/ConnectionResult.tsx
@@ -17,7 +17,7 @@ import './connectionResult.scss'
 import { UsageEventType } from 'enum/usageEvent.enum'
 import UsageEventService from 'services/usageEvent.service'
 import DateChartService from 'services/dateChart.service'
-import { FluidType } from 'enum/fluid.enum'
+import { FluidState, FluidType } from 'enum/fluid.enum'
 import { DateTime } from 'luxon'
 
 interface ConnectionResultProps {
@@ -135,46 +135,56 @@ const ConnectionResult: React.FC<ConnectionResultProps> = ({
     <div className="connection-update-result">
       <div
         className={
-          status === 'errored' && !hasUpdatedToday()
+          status === 'errored' &&
+          !hasUpdatedToday() &&
+          fluidStatus.status !== FluidState.PARTNER_ISSUE
             ? 'connection-update-errored'
             : ''
         }
       >
-        {outDatedDataDays ? (
+        {outDatedDataDays || fluidStatus.status === FluidState.PARTNER_ISSUE ? (
           <div className="connection-caption text-16-normal">
             <div className="text-16-normal">
-              {hasUpdatedToday() === true ? (
+              {fluidStatus.status === FluidState.PARTNER_ISSUE ? (
+                <div className="connection-caption">
+                  {t('konnector_form.wait_end_issue')}
+                </div>
+              ) : (
                 <>
-                  <div className="connection-caption">
-                    {t('konnector_form.label_updated_at')}
-                  </div>
-                  <div className="text-16-bold">
-                    {lastExecutionDate.toLocaleString()}
-                  </div>
-                  <div>
-                    {fluidStatus &&
-                      fluidStatus.connection &&
-                      fluidStatus.connection.konnector &&
-                      t('konnector_form.issue') +
-                        ' ' +
-                        fluidStatus.connection.konnector.name +
-                        '.'}
-                  </div>
+                  {hasUpdatedToday() === true ? (
+                    <>
+                      <div className="connection-caption">
+                        {t('konnector_form.label_updated_at')}
+                      </div>
+                      <div className="text-16-bold">
+                        {lastExecutionDate.toLocaleString()}
+                      </div>
+                      <div>
+                        {fluidStatus &&
+                          fluidStatus.connection &&
+                          fluidStatus.connection.konnector &&
+                          t('konnector_form.issue') +
+                            ' ' +
+                            fluidStatus.connection.konnector.name +
+                            '.'}
+                      </div>
+                    </>
+                  ) : (
+                    <div className="connection-caption-errored connection-update-errored warning-white text-16-normal">
+                      <StyledIcon
+                        icon={warningWhite}
+                        size={36}
+                        className="warning-icon"
+                        role="img"
+                        title="Attention"
+                        ariaHidden={false}
+                      />
+                      <div className="text-16-normal">
+                        {t('konnector_form.resolve')}
+                      </div>
+                    </div>
+                  )}
                 </>
-              ) : (
-                <div className="connection-caption-errored connection-update-errored warning-white text-16-normal">
-                  <StyledIcon
-                    icon={warningWhite}
-                    size={36}
-                    className="warning-icon"
-                    role="img"
-                    title="Attention"
-                    ariaHidden={false}
-                  />
-                  <div className="text-16-normal">
-                    {t('konnector_form.resolve')}
-                  </div>
-                </div>
               )}
             </div>
           </div>
diff --git a/src/components/Home/ConsumptionView.tsx b/src/components/Home/ConsumptionView.tsx
index 0d47ffec9..9905f6901 100644
--- a/src/components/Home/ConsumptionView.tsx
+++ b/src/components/Home/ConsumptionView.tsx
@@ -19,7 +19,11 @@ import KonnectorViewerList from 'components/Konnector/KonnectorViewerList'
 import classNames from 'classnames'
 import { isKonnectorActive } from 'utils/utils'
 import ReleaseNotesModal from './releaseNotesModal'
-import { showReleaseNotes } from 'store/global/global.actions'
+import { setPartnersIssue, showReleaseNotes } from 'store/global/global.actions'
+import PartnersIssueModal from 'components/PartnersIssue/PartnersIssueModal'
+import ProfileService from 'services/profile.service'
+import { useClient } from 'cozy-client'
+import { DateTime } from 'luxon'
 
 interface ConsumptionViewProps {
   fluidType: FluidType
@@ -27,11 +31,13 @@ interface ConsumptionViewProps {
 const ConsumptionView: React.FC<ConsumptionViewProps> = ({
   fluidType,
 }: ConsumptionViewProps) => {
+  const client = useClient()
+
   const dispatch = useDispatch()
   const { currentTimeStep, loading } = useSelector(
     (state: AppStore) => state.ecolyo.chart
   )
-  const { fluidStatus, releaseNotes } = useSelector(
+  const { fluidStatus, releaseNotes, openPartnersIssueModal } = useSelector(
     (state: AppStore) => state.ecolyo.global
   )
 
@@ -48,7 +54,13 @@ const ConsumptionView: React.FC<ConsumptionViewProps> = ({
 
   /* eslint-disable @typescript-eslint/no-non-null-assertion */
 
-  const lastDataDate =
+  const updatekey =
+    fluidType !== FluidType.MULTIFLUID && fluidStatus[fluidType].lastDataDate
+      ? `${fluidStatus[fluidType].lastDataDate!.toLocaleString()} + ${
+          fluidStatus[fluidType].status
+        }`
+      : ''
+  const lastDataDateKey =
     fluidType !== FluidType.MULTIFLUID && fluidStatus[fluidType].lastDataDate
       ? fluidStatus[fluidType].lastDataDate!.toLocaleString()
       : ''
@@ -62,6 +74,20 @@ const ConsumptionView: React.FC<ConsumptionViewProps> = ({
     dispatch(showReleaseNotes(false, releaseNotes.notes))
   }, [dispatch, releaseNotes.notes])
 
+  const handleCloseModal = useCallback(async () => {
+    const profileService = new ProfileService(client)
+    const updatedProfile = await profileService.updateProfile({
+      partnersIssueDate: DateTime.local()
+        .setZone('utc', {
+          keepLocalTime: true,
+        })
+        .startOf('day'),
+    })
+    if (updatedProfile) {
+      dispatch(setPartnersIssue(false))
+    }
+  }, [client, dispatch])
+
   useEffect(() => {
     setIsFluidKonnected(isKonnectorActive(fluidStatus, fluidType))
     if (
@@ -75,6 +101,7 @@ const ConsumptionView: React.FC<ConsumptionViewProps> = ({
   useEffect(() => {
     dispatch(setLoading(true))
   }, [dispatch])
+
   return (
     <>
       <CozyBar titleKey={'navigation.consumption'} />
@@ -82,7 +109,7 @@ const ConsumptionView: React.FC<ConsumptionViewProps> = ({
         <DateNavigator />
       </Header>
       <Content height={headerHeight}>
-        <FluidButtons activeFluid={fluidType} key={lastDataDate} />
+        <FluidButtons activeFluid={fluidType} key={updatekey} />
 
         {openReleaseNoteModal && (
           <ReleaseNotesModal
@@ -105,7 +132,7 @@ const ConsumptionView: React.FC<ConsumptionViewProps> = ({
               <FluidChart
                 fluidType={fluidType}
                 setActive={setActive}
-                key={lastDataDate}
+                key={lastDataDateKey}
               />
               <ConsumptionDetails fluidType={fluidType} />
             </div>
@@ -139,6 +166,12 @@ const ConsumptionView: React.FC<ConsumptionViewProps> = ({
           </div>
         )}
       </Content>
+
+      <PartnersIssueModal
+        open={openPartnersIssueModal}
+        fluidStatus={fluidStatus}
+        handleCloseClick={handleCloseModal}
+      />
     </>
   )
 }
diff --git a/src/components/Home/FluidButton.tsx b/src/components/Home/FluidButton.tsx
index 7be422f8b..e8c80f310 100644
--- a/src/components/Home/FluidButton.tsx
+++ b/src/components/Home/FluidButton.tsx
@@ -12,6 +12,7 @@ import { useSelector } from 'react-redux'
 import { AppStore } from 'store'
 import { isKonnectorActive } from 'utils/utils'
 import ErrorNotif from 'assets/icons/ico/notif_error.svg'
+import PartnerIssueNotif from 'assets/icons/ico/notif_maintenance.svg'
 import DateChartService from 'services/dateChart.service'
 
 interface FluidButtonProps {
@@ -68,6 +69,14 @@ const FluidButton: React.FC<FluidButtonProps> = ({
     )
   }, [history, fluidType, client])
 
+  const serviceIsDown = () => {
+    return (
+      fluidType !== FluidType.MULTIFLUID &&
+      fluidStatus[fluidType] &&
+      fluidStatus[fluidType].status === FluidState.PARTNER_ISSUE
+    )
+  }
+
   useEffect(() => {
     //Show errors only on konnected konnectors that are in error, outdated, with no data (specific case), and not in multifluid
     if (
@@ -92,8 +101,16 @@ const FluidButton: React.FC<FluidButtonProps> = ({
         icon={iconType}
         size={fluidType === FluidType.MULTIFLUID ? 36 : 32}
       />
-      {showError && (
-        <StyledIcon icon={ErrorNotif} size={22} className="notif-error" />
+      {serviceIsDown() ? (
+        <StyledIcon
+          icon={PartnerIssueNotif}
+          size={22}
+          className="notif-error"
+        />
+      ) : (
+        showError && (
+          <StyledIcon icon={ErrorNotif} size={22} className="notif-error" />
+        )
       )}
       <div
         className={`fluid-title ${FluidType[
diff --git a/src/components/Konnector/KonnectorViewerCard.tsx b/src/components/Konnector/KonnectorViewerCard.tsx
index 6b7bad4ac..224ce0e0c 100644
--- a/src/components/Konnector/KonnectorViewerCard.tsx
+++ b/src/components/Konnector/KonnectorViewerCard.tsx
@@ -34,6 +34,7 @@ import ExpansionPanel from '@material-ui/core/ExpansionPanel'
 import ExpansionPanelSummary from '@material-ui/core/ExpansionPanelSummary'
 import ExpansionPanelDetails from '@material-ui/core/ExpansionPanelDetails'
 import ErrorNotif from 'assets/icons/ico/notif_error.svg'
+import PartnersIssueNotif from 'assets/icons/ico/notif_maintenance.svg'
 import ConnectionNotFound from 'components/Connection/ConnectionNotFound'
 import ConnectionForm from 'components/Connection/ConnectionForm'
 import ConnectionResult from 'components/Connection/ConnectionResult'
@@ -178,6 +179,15 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({
       await handleAccountDeletion()
     } else {
       if (updatedFluidStatus.length > 0) {
+        const fluidService = new FluidService(client)
+        const partnerIssuesArray = await fluidService.getFluidsConcernedByPartnerIssue(
+          statusArray
+        )
+        if (partnerIssuesArray && partnerIssuesArray.length > 0) {
+          for (const fluid of partnerIssuesArray) {
+            updatedFluidStatus[fluid].status = FluidState.PARTNER_ISSUE
+          }
+        }
         dispatch(setFluidStatus(updatedFluidStatus))
       }
     }
@@ -194,6 +204,7 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({
     handleAccountDeletion,
     konnectorErrorDescription,
     setActive,
+    statusArray,
     updatedFluidStatus,
   ])
 
@@ -303,9 +314,10 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({
           onChange={toggleAccordion}
           classes={{
             root: `expansion-panel-root ${
-              fluidStatus.status === FluidState.ERROR ||
-              fluidStatus.status === FluidState.ERROR_LOGIN_FAILED ||
-              isOutdatedData
+              fluidStatus.status !== FluidState.PARTNER_ISSUE &&
+              (fluidStatus.status === FluidState.ERROR ||
+                fluidStatus.status === FluidState.ERROR_LOGIN_FAILED ||
+                isOutdatedData)
                 ? 'red-border'
                 : ''
             }`,
@@ -330,7 +342,13 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({
               ) : (
                 <Icon icon={iconAddType} size={49} />
               )}
-              {fluidStatus.status === FluidState.ERROR || isOutdatedData ? (
+              {fluidStatus.status === FluidState.PARTNER_ISSUE ? (
+                <StyledIcon
+                  icon={PartnersIssueNotif}
+                  size={24}
+                  className="konnector-state-picto"
+                />
+              ) : fluidStatus.status === FluidState.ERROR || isOutdatedData ? (
                 <StyledIcon
                   icon={ErrorNotif}
                   size={24}
@@ -342,13 +360,18 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({
               className={classNames('konnector-title', {
                 [`${FluidType[
                   fluidStatus.fluidType
-                ].toLowerCase()}-connected text-18-bold`]:
-                  fluidStatus.status !== FluidState.NOT_CONNECTED,
+                ].toLowerCase()}-connected text-16-bold`]:
+                  fluidStatus.status !== FluidState.NOT_CONNECTED &&
+                  fluidStatus.status !== FluidState.PARTNER_ISSUE,
               })}
             >
-              {fluidStatus.connection.account &&
-              fluidStatus.status !== FluidState.ERROR_LOGIN_FAILED &&
-              !isOutdatedData ? (
+              {fluidStatus.status === FluidState.PARTNER_ISSUE ? (
+                <span className="text-16-bold">
+                  {t(`konnector_options.partner_issue`)}
+                </span>
+              ) : fluidStatus.connection.account &&
+                fluidStatus.status !== FluidState.ERROR_LOGIN_FAILED &&
+                !isOutdatedData ? (
                 t('FLUID.' + FluidType[fluidStatus.fluidType] + '.LABEL')
               ) : fluidStatus.status !== FluidState.ERROR_LOGIN_FAILED ? (
                 <span className="text-16-bold outdated">
diff --git a/src/components/PartnersIssue/PartnersIssueModal.spec.tsx b/src/components/PartnersIssue/PartnersIssueModal.spec.tsx
new file mode 100644
index 000000000..ec3e9bd98
--- /dev/null
+++ b/src/components/PartnersIssue/PartnersIssueModal.spec.tsx
@@ -0,0 +1,54 @@
+import React from 'react'
+import { mount } from 'enzyme'
+import { Provider } from 'react-redux'
+import toJson from 'enzyme-to-json'
+import configureStore from 'redux-mock-store'
+import { mockInitialEcolyoState } from '../../../tests/__mocks__/store'
+import PartnersIssueModal from './PartnersIssueModal'
+import { Button } from '@material-ui/core'
+
+jest.mock('cozy-ui/transpiled/react/I18n', () => {
+  return {
+    useI18n: jest.fn(() => {
+      return {
+        t: (str: string) => str,
+      }
+    }),
+  }
+})
+
+const mockStore = configureStore([])
+const mockHandleClose = jest.fn()
+describe('PartnersIssueModal component', () => {
+  it('should render correctly', () => {
+    const store = mockStore({
+      ecolyo: mockInitialEcolyoState,
+    })
+    const wrapper = mount(
+      <Provider store={store}>
+        <PartnersIssueModal
+          open={true}
+          handleCloseClick={mockHandleClose}
+          fluidStatus={mockInitialEcolyoState.global.fluidStatus}
+        />
+      </Provider>
+    )
+    expect(toJson(wrapper)).toMatchSnapshot()
+  })
+  it('should close modal correctly', () => {
+    const store = mockStore({
+      ecolyo: mockInitialEcolyoState,
+    })
+    const wrapper = mount(
+      <Provider store={store}>
+        <PartnersIssueModal
+          open={true}
+          handleCloseClick={mockHandleClose}
+          fluidStatus={mockInitialEcolyoState.global.fluidStatus}
+        />
+      </Provider>
+    )
+    wrapper.find(Button).simulate('click')
+    expect(mockHandleClose).toHaveBeenCalled()
+  })
+})
diff --git a/src/components/PartnersIssue/PartnersIssueModal.tsx b/src/components/PartnersIssue/PartnersIssueModal.tsx
new file mode 100644
index 000000000..68a048023
--- /dev/null
+++ b/src/components/PartnersIssue/PartnersIssueModal.tsx
@@ -0,0 +1,92 @@
+import React, { useEffect, useState } from 'react'
+import './partnersIssueModal.scss'
+import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import Button from '@material-ui/core/Button'
+import Dialog from '@material-ui/core/Dialog'
+import Icon from 'cozy-ui/transpiled/react/Icon'
+import { FluidState } from 'enum/fluid.enum'
+import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
+import OrangeWarn from 'assets/icons/ico/warn-orange.svg'
+import { FluidStatus } from 'models'
+import IconButton from '@material-ui/core/IconButton'
+import CloseIcon from 'assets/icons/ico/close.svg'
+
+interface PartnersIssueModalProps {
+  open: boolean
+  fluidStatus: FluidStatus[]
+  handleCloseClick: () => void
+}
+
+const PartnersIssueModal: React.FC<PartnersIssueModalProps> = ({
+  open,
+  fluidStatus,
+  handleCloseClick,
+}: PartnersIssueModalProps) => {
+  const { t } = useI18n()
+  const [fluids, setFluids] = useState<FluidStatus[]>([])
+
+  useEffect(() => {
+    const issuedFluids = fluidStatus.filter(fluid => {
+      return fluid.status === FluidState.PARTNER_ISSUE
+    })
+    setFluids(issuedFluids)
+  }, [fluidStatus])
+  return (
+    <Dialog
+      open={open}
+      disableBackdropClick
+      disableEscapeKeyDown
+      onClose={handleCloseClick}
+      aria-labelledby={'accessibility-title'}
+      classes={{
+        root: 'modal-root',
+        paper: 'modal-paper',
+      }}
+    >
+      <div id={'accessibility-title'}>
+        {t('feedback.accessibility.window_title')}
+      </div>
+      <IconButton
+        aria-label={t('feedback.accessibility.button_close')}
+        className="modal-paper-close-button"
+        onClick={handleCloseClick}
+      >
+        <Icon icon={CloseIcon} size={16} />
+      </IconButton>
+      <div className="partnersIssueModal">
+        <StyledIcon icon={OrangeWarn} size={40} className={'warn-icon'} />
+
+        <div className="partners-issue-title text-20-bold">
+          {t('consumption.partners_issue_modal.title')}
+        </div>
+        <div className="partners-issue-content text-16-normal">
+          {t('consumption.partners_issue_modal.text_1')}
+        </div>
+        <ul>
+          {fluids.map((fluid: FluidStatus, key) => {
+            return (
+              <li key={key} className="text-16-bold">
+                {fluid.connection.konnectorConfig.name}
+              </li>
+            )
+          })}
+        </ul>
+        <div className="partners-issue-content text-16-normal">
+          {t('consumption.partners_issue_modal.text_2')}
+        </div>
+
+        <Button
+          onClick={handleCloseClick}
+          classes={{
+            root: 'btn-highlight',
+            label: 'text-16-bold',
+          }}
+        >
+          {t('consumption.partners_issue_modal.button_validate')}
+        </Button>
+      </div>
+    </Dialog>
+  )
+}
+
+export default PartnersIssueModal
diff --git a/src/components/PartnersIssue/__snapshots__/PartnersIssueModal.spec.tsx.snap b/src/components/PartnersIssue/__snapshots__/PartnersIssueModal.spec.tsx.snap
new file mode 100644
index 000000000..834700542
--- /dev/null
+++ b/src/components/PartnersIssue/__snapshots__/PartnersIssueModal.spec.tsx.snap
@@ -0,0 +1,1093 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`PartnersIssueModal component should render correctly 1`] = `
+<Provider
+  store={
+    Object {
+      "clearActions": [Function],
+      "dispatch": [Function],
+      "getActions": [Function],
+      "getState": [Function],
+      "replaceReducer": [Function],
+      "subscribe": [Function],
+    }
+  }
+>
+  <PartnersIssueModal
+    fluidStatus={
+      Array [
+        Object {
+          "connection": Object {
+            "account": null,
+            "isUpdating": false,
+            "konnector": null,
+            "konnectorConfig": Object {
+              "activation": "",
+              "name": "",
+              "oauth": false,
+              "siteLink": "",
+              "slug": "",
+            },
+            "shouldLaunchKonnector": false,
+            "trigger": null,
+            "triggerState": null,
+          },
+          "fluidType": 0,
+          "lastDataDate": null,
+          "status": 0,
+        },
+        Object {
+          "connection": Object {
+            "account": null,
+            "isUpdating": false,
+            "konnector": null,
+            "konnectorConfig": Object {
+              "activation": "",
+              "name": "",
+              "oauth": false,
+              "siteLink": "",
+              "slug": "",
+            },
+            "shouldLaunchKonnector": false,
+            "trigger": null,
+            "triggerState": null,
+          },
+          "fluidType": 1,
+          "lastDataDate": null,
+          "status": 0,
+        },
+        Object {
+          "connection": Object {
+            "account": null,
+            "isUpdating": false,
+            "konnector": null,
+            "konnectorConfig": Object {
+              "activation": "",
+              "name": "",
+              "oauth": false,
+              "siteLink": "",
+              "slug": "",
+            },
+            "shouldLaunchKonnector": false,
+            "trigger": null,
+            "triggerState": null,
+          },
+          "fluidType": 2,
+          "lastDataDate": null,
+          "status": 0,
+        },
+      ]
+    }
+    handleCloseClick={[MockFunction]}
+    open={true}
+  >
+    <WithStyles(ForwardRef(Dialog))
+      aria-labelledby="accessibility-title"
+      classes={
+        Object {
+          "paper": "modal-paper",
+          "root": "modal-root",
+        }
+      }
+      disableBackdropClick={true}
+      disableEscapeKeyDown={true}
+      onClose={[MockFunction]}
+      open={true}
+    >
+      <ForwardRef(Dialog)
+        aria-labelledby="accessibility-title"
+        classes={
+          Object {
+            "container": "MuiDialog-container",
+            "paper": "MuiDialog-paper modal-paper",
+            "paperFullScreen": "MuiDialog-paperFullScreen",
+            "paperFullWidth": "MuiDialog-paperFullWidth",
+            "paperScrollBody": "MuiDialog-paperScrollBody",
+            "paperScrollPaper": "MuiDialog-paperScrollPaper",
+            "paperWidthFalse": "MuiDialog-paperWidthFalse",
+            "paperWidthLg": "MuiDialog-paperWidthLg",
+            "paperWidthMd": "MuiDialog-paperWidthMd",
+            "paperWidthSm": "MuiDialog-paperWidthSm",
+            "paperWidthXl": "MuiDialog-paperWidthXl",
+            "paperWidthXs": "MuiDialog-paperWidthXs",
+            "root": "MuiDialog-root modal-root",
+            "scrollBody": "MuiDialog-scrollBody",
+            "scrollPaper": "MuiDialog-scrollPaper",
+          }
+        }
+        disableBackdropClick={true}
+        disableEscapeKeyDown={true}
+        onClose={[MockFunction]}
+        open={true}
+      >
+        <ForwardRef(Modal)
+          BackdropComponent={
+            Object {
+              "$$typeof": Symbol(react.forward_ref),
+              "Naked": Object {
+                "$$typeof": Symbol(react.forward_ref),
+                "propTypes": Object {
+                  "children": [Function],
+                  "className": [Function],
+                  "classes": [Function],
+                  "invisible": [Function],
+                  "open": [Function],
+                  "transitionDuration": [Function],
+                },
+                "render": [Function],
+              },
+              "displayName": "WithStyles(ForwardRef(Backdrop))",
+              "options": Object {
+                "defaultTheme": Object {
+                  "breakpoints": Object {
+                    "between": [Function],
+                    "down": [Function],
+                    "keys": Array [
+                      "xs",
+                      "sm",
+                      "md",
+                      "lg",
+                      "xl",
+                    ],
+                    "only": [Function],
+                    "up": [Function],
+                    "values": Object {
+                      "lg": 1280,
+                      "md": 960,
+                      "sm": 600,
+                      "xl": 1920,
+                      "xs": 0,
+                    },
+                    "width": [Function],
+                  },
+                  "direction": "ltr",
+                  "mixins": Object {
+                    "gutters": [Function],
+                    "toolbar": Object {
+                      "@media (min-width:0px) and (orientation: landscape)": Object {
+                        "minHeight": 48,
+                      },
+                      "@media (min-width:600px)": Object {
+                        "minHeight": 64,
+                      },
+                      "minHeight": 56,
+                    },
+                  },
+                  "overrides": Object {},
+                  "palette": Object {
+                    "action": Object {
+                      "active": "rgba(0, 0, 0, 0.54)",
+                      "disabled": "rgba(0, 0, 0, 0.26)",
+                      "disabledBackground": "rgba(0, 0, 0, 0.12)",
+                      "hover": "rgba(0, 0, 0, 0.08)",
+                      "hoverOpacity": 0.08,
+                      "selected": "rgba(0, 0, 0, 0.14)",
+                    },
+                    "augmentColor": [Function],
+                    "background": Object {
+                      "default": "#fafafa",
+                      "paper": "#fff",
+                    },
+                    "common": Object {
+                      "black": "#000",
+                      "white": "#fff",
+                    },
+                    "contrastThreshold": 3,
+                    "divider": "rgba(0, 0, 0, 0.12)",
+                    "error": Object {
+                      "contrastText": "#fff",
+                      "dark": "#d32f2f",
+                      "light": "#e57373",
+                      "main": "#f44336",
+                    },
+                    "getContrastText": [Function],
+                    "grey": Object {
+                      "100": "#f5f5f5",
+                      "200": "#eeeeee",
+                      "300": "#e0e0e0",
+                      "400": "#bdbdbd",
+                      "50": "#fafafa",
+                      "500": "#9e9e9e",
+                      "600": "#757575",
+                      "700": "#616161",
+                      "800": "#424242",
+                      "900": "#212121",
+                      "A100": "#d5d5d5",
+                      "A200": "#aaaaaa",
+                      "A400": "#303030",
+                      "A700": "#616161",
+                    },
+                    "info": Object {
+                      "contrastText": "#fff",
+                      "dark": "#1976d2",
+                      "light": "#64b5f6",
+                      "main": "#2196f3",
+                    },
+                    "primary": Object {
+                      "contrastText": "#fff",
+                      "dark": "#303f9f",
+                      "light": "#7986cb",
+                      "main": "#3f51b5",
+                    },
+                    "secondary": Object {
+                      "contrastText": "#fff",
+                      "dark": "#c51162",
+                      "light": "#ff4081",
+                      "main": "#f50057",
+                    },
+                    "success": Object {
+                      "contrastText": "rgba(0, 0, 0, 0.87)",
+                      "dark": "#388e3c",
+                      "light": "#81c784",
+                      "main": "#4caf50",
+                    },
+                    "text": Object {
+                      "disabled": "rgba(0, 0, 0, 0.38)",
+                      "hint": "rgba(0, 0, 0, 0.38)",
+                      "primary": "rgba(0, 0, 0, 0.87)",
+                      "secondary": "rgba(0, 0, 0, 0.54)",
+                    },
+                    "tonalOffset": 0.2,
+                    "type": "light",
+                    "warning": Object {
+                      "contrastText": "rgba(0, 0, 0, 0.87)",
+                      "dark": "#f57c00",
+                      "light": "#ffb74d",
+                      "main": "#ff9800",
+                    },
+                  },
+                  "props": Object {},
+                  "shadows": Array [
+                    "none",
+                    "0px 2px 1px -1px rgba(0,0,0,0.2),0px 1px 1px 0px rgba(0,0,0,0.14),0px 1px 3px 0px rgba(0,0,0,0.12)",
+                    "0px 3px 1px -2px rgba(0,0,0,0.2),0px 2px 2px 0px rgba(0,0,0,0.14),0px 1px 5px 0px rgba(0,0,0,0.12)",
+                    "0px 3px 3px -2px rgba(0,0,0,0.2),0px 3px 4px 0px rgba(0,0,0,0.14),0px 1px 8px 0px rgba(0,0,0,0.12)",
+                    "0px 2px 4px -1px rgba(0,0,0,0.2),0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12)",
+                    "0px 3px 5px -1px rgba(0,0,0,0.2),0px 5px 8px 0px rgba(0,0,0,0.14),0px 1px 14px 0px rgba(0,0,0,0.12)",
+                    "0px 3px 5px -1px rgba(0,0,0,0.2),0px 6px 10px 0px rgba(0,0,0,0.14),0px 1px 18px 0px rgba(0,0,0,0.12)",
+                    "0px 4px 5px -2px rgba(0,0,0,0.2),0px 7px 10px 1px rgba(0,0,0,0.14),0px 2px 16px 1px rgba(0,0,0,0.12)",
+                    "0px 5px 5px -3px rgba(0,0,0,0.2),0px 8px 10px 1px rgba(0,0,0,0.14),0px 3px 14px 2px rgba(0,0,0,0.12)",
+                    "0px 5px 6px -3px rgba(0,0,0,0.2),0px 9px 12px 1px rgba(0,0,0,0.14),0px 3px 16px 2px rgba(0,0,0,0.12)",
+                    "0px 6px 6px -3px rgba(0,0,0,0.2),0px 10px 14px 1px rgba(0,0,0,0.14),0px 4px 18px 3px rgba(0,0,0,0.12)",
+                    "0px 6px 7px -4px rgba(0,0,0,0.2),0px 11px 15px 1px rgba(0,0,0,0.14),0px 4px 20px 3px rgba(0,0,0,0.12)",
+                    "0px 7px 8px -4px rgba(0,0,0,0.2),0px 12px 17px 2px rgba(0,0,0,0.14),0px 5px 22px 4px rgba(0,0,0,0.12)",
+                    "0px 7px 8px -4px rgba(0,0,0,0.2),0px 13px 19px 2px rgba(0,0,0,0.14),0px 5px 24px 4px rgba(0,0,0,0.12)",
+                    "0px 7px 9px -4px rgba(0,0,0,0.2),0px 14px 21px 2px rgba(0,0,0,0.14),0px 5px 26px 4px rgba(0,0,0,0.12)",
+                    "0px 8px 9px -5px rgba(0,0,0,0.2),0px 15px 22px 2px rgba(0,0,0,0.14),0px 6px 28px 5px rgba(0,0,0,0.12)",
+                    "0px 8px 10px -5px rgba(0,0,0,0.2),0px 16px 24px 2px rgba(0,0,0,0.14),0px 6px 30px 5px rgba(0,0,0,0.12)",
+                    "0px 8px 11px -5px rgba(0,0,0,0.2),0px 17px 26px 2px rgba(0,0,0,0.14),0px 6px 32px 5px rgba(0,0,0,0.12)",
+                    "0px 9px 11px -5px rgba(0,0,0,0.2),0px 18px 28px 2px rgba(0,0,0,0.14),0px 7px 34px 6px rgba(0,0,0,0.12)",
+                    "0px 9px 12px -6px rgba(0,0,0,0.2),0px 19px 29px 2px rgba(0,0,0,0.14),0px 7px 36px 6px rgba(0,0,0,0.12)",
+                    "0px 10px 13px -6px rgba(0,0,0,0.2),0px 20px 31px 3px rgba(0,0,0,0.14),0px 8px 38px 7px rgba(0,0,0,0.12)",
+                    "0px 10px 13px -6px rgba(0,0,0,0.2),0px 21px 33px 3px rgba(0,0,0,0.14),0px 8px 40px 7px rgba(0,0,0,0.12)",
+                    "0px 10px 14px -6px rgba(0,0,0,0.2),0px 22px 35px 3px rgba(0,0,0,0.14),0px 8px 42px 7px rgba(0,0,0,0.12)",
+                    "0px 11px 14px -7px rgba(0,0,0,0.2),0px 23px 36px 3px rgba(0,0,0,0.14),0px 9px 44px 8px rgba(0,0,0,0.12)",
+                    "0px 11px 15px -7px rgba(0,0,0,0.2),0px 24px 38px 3px rgba(0,0,0,0.14),0px 9px 46px 8px rgba(0,0,0,0.12)",
+                  ],
+                  "shape": Object {
+                    "borderRadius": 4,
+                  },
+                  "spacing": [Function],
+                  "transitions": Object {
+                    "create": [Function],
+                    "duration": Object {
+                      "complex": 375,
+                      "enteringScreen": 225,
+                      "leavingScreen": 195,
+                      "short": 250,
+                      "shorter": 200,
+                      "shortest": 150,
+                      "standard": 300,
+                    },
+                    "easing": Object {
+                      "easeIn": "cubic-bezier(0.4, 0, 1, 1)",
+                      "easeInOut": "cubic-bezier(0.4, 0, 0.2, 1)",
+                      "easeOut": "cubic-bezier(0.0, 0, 0.2, 1)",
+                      "sharp": "cubic-bezier(0.4, 0, 0.6, 1)",
+                    },
+                    "getAutoHeightDuration": [Function],
+                  },
+                  "typography": Object {
+                    "body1": Object {
+                      "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif",
+                      "fontSize": "1rem",
+                      "fontWeight": 400,
+                      "letterSpacing": "0.00938em",
+                      "lineHeight": 1.5,
+                    },
+                    "body2": Object {
+                      "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif",
+                      "fontSize": "0.875rem",
+                      "fontWeight": 400,
+                      "letterSpacing": "0.01071em",
+                      "lineHeight": 1.43,
+                    },
+                    "button": Object {
+                      "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif",
+                      "fontSize": "0.875rem",
+                      "fontWeight": 500,
+                      "letterSpacing": "0.02857em",
+                      "lineHeight": 1.75,
+                      "textTransform": "uppercase",
+                    },
+                    "caption": Object {
+                      "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif",
+                      "fontSize": "0.75rem",
+                      "fontWeight": 400,
+                      "letterSpacing": "0.03333em",
+                      "lineHeight": 1.66,
+                    },
+                    "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif",
+                    "fontSize": 14,
+                    "fontWeightBold": 700,
+                    "fontWeightLight": 300,
+                    "fontWeightMedium": 500,
+                    "fontWeightRegular": 400,
+                    "h1": Object {
+                      "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif",
+                      "fontSize": "6rem",
+                      "fontWeight": 300,
+                      "letterSpacing": "-0.01562em",
+                      "lineHeight": 1.167,
+                    },
+                    "h2": Object {
+                      "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif",
+                      "fontSize": "3.75rem",
+                      "fontWeight": 300,
+                      "letterSpacing": "-0.00833em",
+                      "lineHeight": 1.2,
+                    },
+                    "h3": Object {
+                      "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif",
+                      "fontSize": "3rem",
+                      "fontWeight": 400,
+                      "letterSpacing": "0em",
+                      "lineHeight": 1.167,
+                    },
+                    "h4": Object {
+                      "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif",
+                      "fontSize": "2.125rem",
+                      "fontWeight": 400,
+                      "letterSpacing": "0.00735em",
+                      "lineHeight": 1.235,
+                    },
+                    "h5": Object {
+                      "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif",
+                      "fontSize": "1.5rem",
+                      "fontWeight": 400,
+                      "letterSpacing": "0em",
+                      "lineHeight": 1.334,
+                    },
+                    "h6": Object {
+                      "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif",
+                      "fontSize": "1.25rem",
+                      "fontWeight": 500,
+                      "letterSpacing": "0.0075em",
+                      "lineHeight": 1.6,
+                    },
+                    "htmlFontSize": 16,
+                    "overline": Object {
+                      "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif",
+                      "fontSize": "0.75rem",
+                      "fontWeight": 400,
+                      "letterSpacing": "0.08333em",
+                      "lineHeight": 2.66,
+                      "textTransform": "uppercase",
+                    },
+                    "pxToRem": [Function],
+                    "round": [Function],
+                    "subtitle1": Object {
+                      "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif",
+                      "fontSize": "1rem",
+                      "fontWeight": 400,
+                      "letterSpacing": "0.00938em",
+                      "lineHeight": 1.75,
+                    },
+                    "subtitle2": Object {
+                      "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif",
+                      "fontSize": "0.875rem",
+                      "fontWeight": 500,
+                      "letterSpacing": "0.00714em",
+                      "lineHeight": 1.57,
+                    },
+                  },
+                  "zIndex": Object {
+                    "appBar": 1100,
+                    "drawer": 1200,
+                    "mobileStepper": 1000,
+                    "modal": 1300,
+                    "snackbar": 1400,
+                    "speedDial": 1050,
+                    "tooltip": 1500,
+                  },
+                },
+                "name": "MuiBackdrop",
+              },
+              "propTypes": Object {
+                "classes": [Function],
+                "innerRef": [Function],
+              },
+              "render": [Function],
+              "useStyles": [Function],
+            }
+          }
+          BackdropProps={
+            Object {
+              "transitionDuration": Object {
+                "enter": 225,
+                "exit": 195,
+              },
+            }
+          }
+          className="MuiDialog-root modal-root"
+          closeAfterTransition={true}
+          disableBackdropClick={true}
+          disableEscapeKeyDown={true}
+          onClose={[MockFunction]}
+          open={true}
+        >
+          <ForwardRef(Portal)
+            disablePortal={false}
+          >
+            <Portal
+              containerInfo={
+                <body
+                  style="padding-right: 0px; overflow: hidden;"
+                >
+                  <div
+                    class="MuiDialog-root modal-root"
+                    role="presentation"
+                    style="position: fixed; z-index: 1300; right: 0px; bottom: 0px; top: 0px; left: 0px;"
+                  >
+                    <div
+                      aria-hidden="true"
+                      class="MuiBackdrop-root"
+                      style="opacity: 1; webkit-transition: opacity 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; transition: opacity 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;"
+                    />
+                    <div
+                      data-test="sentinelStart"
+                      tabindex="0"
+                    />
+                    <div
+                      class="MuiDialog-container MuiDialog-scrollPaper"
+                      role="none presentation"
+                      style="opacity: 1; webkit-transition: opacity 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; transition: opacity 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;"
+                      tabindex="-1"
+                    >
+                      <div
+                        aria-labelledby="accessibility-title"
+                        class="MuiPaper-root MuiDialog-paper modal-paper MuiDialog-paperScrollPaper MuiDialog-paperWidthSm MuiPaper-elevation24 MuiPaper-rounded"
+                        role="dialog"
+                      >
+                        <div
+                          id="accessibility-title"
+                        >
+                          feedback.accessibility.window_title
+                        </div>
+                        <button
+                          aria-label="feedback.accessibility.button_close"
+                          class="MuiButtonBase-root MuiIconButton-root modal-paper-close-button"
+                          tabindex="0"
+                          type="button"
+                        >
+                          <span
+                            class="MuiIconButton-label"
+                          >
+                            <svg
+                              class="styles__icon___23x3R"
+                              height="16"
+                              width="16"
+                            >
+                              <use
+                                xlink:href="#test-file-stub"
+                              />
+                            </svg>
+                          </span>
+                          <span
+                            class="MuiTouchRipple-root"
+                          />
+                        </button>
+                        <div
+                          class="partnersIssueModal"
+                        >
+                          <svg
+                            aria-hidden="true"
+                            class="warn-icon styles__icon___23x3R"
+                            height="40"
+                            width="40"
+                          >
+                            <use
+                              xlink:href="#test-file-stub"
+                            />
+                          </svg>
+                          <div
+                            class="partners-issue-title text-20-bold"
+                          >
+                            consumption.partners_issue_modal.title
+                          </div>
+                          <div
+                            class="partners-issue-content text-16-normal"
+                          >
+                            consumption.partners_issue_modal.text_1
+                          </div>
+                          <ul />
+                          <div
+                            class="partners-issue-content text-16-normal"
+                          >
+                            consumption.partners_issue_modal.text_2
+                          </div>
+                          <button
+                            class="MuiButtonBase-root MuiButton-root btn-highlight MuiButton-text"
+                            tabindex="0"
+                            type="button"
+                          >
+                            <span
+                              class="MuiButton-label text-16-bold"
+                            >
+                              consumption.partners_issue_modal.button_validate
+                            </span>
+                            <span
+                              class="MuiTouchRipple-root"
+                            />
+                          </button>
+                        </div>
+                      </div>
+                    </div>
+                    <div
+                      data-test="sentinelEnd"
+                      tabindex="0"
+                    />
+                  </div>
+                </body>
+              }
+            >
+              <div
+                className="MuiDialog-root modal-root"
+                onKeyDown={[Function]}
+                role="presentation"
+                style={
+                  Object {
+                    "bottom": 0,
+                    "left": 0,
+                    "position": "fixed",
+                    "right": 0,
+                    "top": 0,
+                    "zIndex": 1300,
+                  }
+                }
+              >
+                <WithStyles(ForwardRef(Backdrop))
+                  onClick={[Function]}
+                  open={true}
+                  transitionDuration={
+                    Object {
+                      "enter": 225,
+                      "exit": 195,
+                    }
+                  }
+                >
+                  <ForwardRef(Backdrop)
+                    classes={
+                      Object {
+                        "invisible": "MuiBackdrop-invisible",
+                        "root": "MuiBackdrop-root",
+                      }
+                    }
+                    onClick={[Function]}
+                    open={true}
+                    transitionDuration={
+                      Object {
+                        "enter": 225,
+                        "exit": 195,
+                      }
+                    }
+                  >
+                    <ForwardRef(Fade)
+                      in={true}
+                      onClick={[Function]}
+                      timeout={
+                        Object {
+                          "enter": 225,
+                          "exit": 195,
+                        }
+                      }
+                    >
+                      <Transition
+                        appear={true}
+                        enter={true}
+                        exit={true}
+                        in={true}
+                        mountOnEnter={false}
+                        onClick={[Function]}
+                        onEnter={[Function]}
+                        onEntered={[Function]}
+                        onEntering={[Function]}
+                        onExit={[Function]}
+                        onExited={[Function]}
+                        onExiting={[Function]}
+                        timeout={
+                          Object {
+                            "enter": 225,
+                            "exit": 195,
+                          }
+                        }
+                        unmountOnExit={false}
+                      >
+                        <div
+                          aria-hidden={true}
+                          className="MuiBackdrop-root"
+                          onClick={[Function]}
+                          style={
+                            Object {
+                              "opacity": 1,
+                              "visibility": undefined,
+                            }
+                          }
+                        />
+                      </Transition>
+                    </ForwardRef(Fade)>
+                  </ForwardRef(Backdrop)>
+                </WithStyles(ForwardRef(Backdrop))>
+                <TrapFocus
+                  disableAutoFocus={false}
+                  disableEnforceFocus={false}
+                  disableRestoreFocus={false}
+                  getDoc={[Function]}
+                  isEnabled={[Function]}
+                  open={true}
+                >
+                  <div
+                    data-test="sentinelStart"
+                    tabIndex={0}
+                  />
+                  <ForwardRef(Fade)
+                    appear={true}
+                    in={true}
+                    onEnter={[Function]}
+                    onExited={[Function]}
+                    role="none presentation"
+                    tabIndex="-1"
+                    timeout={
+                      Object {
+                        "enter": 225,
+                        "exit": 195,
+                      }
+                    }
+                  >
+                    <Transition
+                      appear={true}
+                      enter={true}
+                      exit={true}
+                      in={true}
+                      mountOnEnter={false}
+                      onEnter={[Function]}
+                      onEntered={[Function]}
+                      onEntering={[Function]}
+                      onExit={[Function]}
+                      onExited={[Function]}
+                      onExiting={[Function]}
+                      role="none presentation"
+                      tabIndex="-1"
+                      timeout={
+                        Object {
+                          "enter": 225,
+                          "exit": 195,
+                        }
+                      }
+                      unmountOnExit={false}
+                    >
+                      <div
+                        className="MuiDialog-container MuiDialog-scrollPaper"
+                        onClick={[Function]}
+                        onMouseDown={[Function]}
+                        role="none presentation"
+                        style={
+                          Object {
+                            "opacity": 1,
+                            "visibility": undefined,
+                          }
+                        }
+                        tabIndex="-1"
+                      >
+                        <WithStyles(ForwardRef(Paper))
+                          aria-labelledby="accessibility-title"
+                          className="MuiDialog-paper modal-paper MuiDialog-paperScrollPaper MuiDialog-paperWidthSm"
+                          elevation={24}
+                          role="dialog"
+                        >
+                          <ForwardRef(Paper)
+                            aria-labelledby="accessibility-title"
+                            className="MuiDialog-paper modal-paper MuiDialog-paperScrollPaper MuiDialog-paperWidthSm"
+                            classes={
+                              Object {
+                                "elevation0": "MuiPaper-elevation0",
+                                "elevation1": "MuiPaper-elevation1",
+                                "elevation10": "MuiPaper-elevation10",
+                                "elevation11": "MuiPaper-elevation11",
+                                "elevation12": "MuiPaper-elevation12",
+                                "elevation13": "MuiPaper-elevation13",
+                                "elevation14": "MuiPaper-elevation14",
+                                "elevation15": "MuiPaper-elevation15",
+                                "elevation16": "MuiPaper-elevation16",
+                                "elevation17": "MuiPaper-elevation17",
+                                "elevation18": "MuiPaper-elevation18",
+                                "elevation19": "MuiPaper-elevation19",
+                                "elevation2": "MuiPaper-elevation2",
+                                "elevation20": "MuiPaper-elevation20",
+                                "elevation21": "MuiPaper-elevation21",
+                                "elevation22": "MuiPaper-elevation22",
+                                "elevation23": "MuiPaper-elevation23",
+                                "elevation24": "MuiPaper-elevation24",
+                                "elevation3": "MuiPaper-elevation3",
+                                "elevation4": "MuiPaper-elevation4",
+                                "elevation5": "MuiPaper-elevation5",
+                                "elevation6": "MuiPaper-elevation6",
+                                "elevation7": "MuiPaper-elevation7",
+                                "elevation8": "MuiPaper-elevation8",
+                                "elevation9": "MuiPaper-elevation9",
+                                "outlined": "MuiPaper-outlined",
+                                "root": "MuiPaper-root",
+                                "rounded": "MuiPaper-rounded",
+                              }
+                            }
+                            elevation={24}
+                            role="dialog"
+                          >
+                            <div
+                              aria-labelledby="accessibility-title"
+                              className="MuiPaper-root MuiDialog-paper modal-paper MuiDialog-paperScrollPaper MuiDialog-paperWidthSm MuiPaper-elevation24 MuiPaper-rounded"
+                              role="dialog"
+                            >
+                              <div
+                                id="accessibility-title"
+                              >
+                                feedback.accessibility.window_title
+                              </div>
+                              <WithStyles(ForwardRef(IconButton))
+                                aria-label="feedback.accessibility.button_close"
+                                className="modal-paper-close-button"
+                                onClick={[MockFunction]}
+                              >
+                                <ForwardRef(IconButton)
+                                  aria-label="feedback.accessibility.button_close"
+                                  className="modal-paper-close-button"
+                                  classes={
+                                    Object {
+                                      "colorInherit": "MuiIconButton-colorInherit",
+                                      "colorPrimary": "MuiIconButton-colorPrimary",
+                                      "colorSecondary": "MuiIconButton-colorSecondary",
+                                      "disabled": "Mui-disabled",
+                                      "edgeEnd": "MuiIconButton-edgeEnd",
+                                      "edgeStart": "MuiIconButton-edgeStart",
+                                      "label": "MuiIconButton-label",
+                                      "root": "MuiIconButton-root",
+                                      "sizeSmall": "MuiIconButton-sizeSmall",
+                                    }
+                                  }
+                                  onClick={[MockFunction]}
+                                >
+                                  <WithStyles(ForwardRef(ButtonBase))
+                                    aria-label="feedback.accessibility.button_close"
+                                    centerRipple={true}
+                                    className="MuiIconButton-root modal-paper-close-button"
+                                    disabled={false}
+                                    focusRipple={true}
+                                    onClick={[MockFunction]}
+                                  >
+                                    <ForwardRef(ButtonBase)
+                                      aria-label="feedback.accessibility.button_close"
+                                      centerRipple={true}
+                                      className="MuiIconButton-root modal-paper-close-button"
+                                      classes={
+                                        Object {
+                                          "disabled": "Mui-disabled",
+                                          "focusVisible": "Mui-focusVisible",
+                                          "root": "MuiButtonBase-root",
+                                        }
+                                      }
+                                      disabled={false}
+                                      focusRipple={true}
+                                      onClick={[MockFunction]}
+                                    >
+                                      <button
+                                        aria-label="feedback.accessibility.button_close"
+                                        className="MuiButtonBase-root MuiIconButton-root modal-paper-close-button"
+                                        disabled={false}
+                                        onBlur={[Function]}
+                                        onClick={[MockFunction]}
+                                        onDragLeave={[Function]}
+                                        onFocus={[Function]}
+                                        onKeyDown={[Function]}
+                                        onKeyUp={[Function]}
+                                        onMouseDown={[Function]}
+                                        onMouseLeave={[Function]}
+                                        onMouseUp={[Function]}
+                                        onTouchEnd={[Function]}
+                                        onTouchMove={[Function]}
+                                        onTouchStart={[Function]}
+                                        tabIndex={0}
+                                        type="button"
+                                      >
+                                        <span
+                                          className="MuiIconButton-label"
+                                        >
+                                          <Icon
+                                            icon="test-file-stub"
+                                            size={16}
+                                            spin={false}
+                                          >
+                                            <Component
+                                              className="styles__icon___23x3R"
+                                              height={16}
+                                              style={Object {}}
+                                              width={16}
+                                            >
+                                              <svg
+                                                className="styles__icon___23x3R"
+                                                height={16}
+                                                style={Object {}}
+                                                width={16}
+                                              >
+                                                <use
+                                                  xlinkHref="#test-file-stub"
+                                                />
+                                              </svg>
+                                            </Component>
+                                          </Icon>
+                                        </span>
+                                        <NoSsr>
+                                          <WithStyles(memo)
+                                            center={true}
+                                          >
+                                            <ForwardRef(TouchRipple)
+                                              center={true}
+                                              classes={
+                                                Object {
+                                                  "child": "MuiTouchRipple-child",
+                                                  "childLeaving": "MuiTouchRipple-childLeaving",
+                                                  "childPulsate": "MuiTouchRipple-childPulsate",
+                                                  "ripple": "MuiTouchRipple-ripple",
+                                                  "ripplePulsate": "MuiTouchRipple-ripplePulsate",
+                                                  "rippleVisible": "MuiTouchRipple-rippleVisible",
+                                                  "root": "MuiTouchRipple-root",
+                                                }
+                                              }
+                                            >
+                                              <span
+                                                className="MuiTouchRipple-root"
+                                              >
+                                                <TransitionGroup
+                                                  childFactory={[Function]}
+                                                  component={null}
+                                                  exit={true}
+                                                />
+                                              </span>
+                                            </ForwardRef(TouchRipple)>
+                                          </WithStyles(memo)>
+                                        </NoSsr>
+                                      </button>
+                                    </ForwardRef(ButtonBase)>
+                                  </WithStyles(ForwardRef(ButtonBase))>
+                                </ForwardRef(IconButton)>
+                              </WithStyles(ForwardRef(IconButton))>
+                              <div
+                                className="partnersIssueModal"
+                              >
+                                <StyledIcon
+                                  className="warn-icon"
+                                  icon="test-file-stub"
+                                  size={40}
+                                >
+                                  <Icon
+                                    aria-hidden={true}
+                                    className="warn-icon"
+                                    icon="test-file-stub"
+                                    size={40}
+                                    spin={false}
+                                  >
+                                    <Component
+                                      aria-hidden={true}
+                                      className="warn-icon styles__icon___23x3R"
+                                      height={40}
+                                      style={Object {}}
+                                      width={40}
+                                    >
+                                      <svg
+                                        aria-hidden={true}
+                                        className="warn-icon styles__icon___23x3R"
+                                        height={40}
+                                        style={Object {}}
+                                        width={40}
+                                      >
+                                        <use
+                                          xlinkHref="#test-file-stub"
+                                        />
+                                      </svg>
+                                    </Component>
+                                  </Icon>
+                                </StyledIcon>
+                                <div
+                                  className="partners-issue-title text-20-bold"
+                                >
+                                  consumption.partners_issue_modal.title
+                                </div>
+                                <div
+                                  className="partners-issue-content text-16-normal"
+                                >
+                                  consumption.partners_issue_modal.text_1
+                                </div>
+                                <ul />
+                                <div
+                                  className="partners-issue-content text-16-normal"
+                                >
+                                  consumption.partners_issue_modal.text_2
+                                </div>
+                                <WithStyles(ForwardRef(Button))
+                                  classes={
+                                    Object {
+                                      "label": "text-16-bold",
+                                      "root": "btn-highlight",
+                                    }
+                                  }
+                                  onClick={[MockFunction]}
+                                >
+                                  <ForwardRef(Button)
+                                    classes={
+                                      Object {
+                                        "colorInherit": "MuiButton-colorInherit",
+                                        "contained": "MuiButton-contained",
+                                        "containedPrimary": "MuiButton-containedPrimary",
+                                        "containedSecondary": "MuiButton-containedSecondary",
+                                        "containedSizeLarge": "MuiButton-containedSizeLarge",
+                                        "containedSizeSmall": "MuiButton-containedSizeSmall",
+                                        "disableElevation": "MuiButton-disableElevation",
+                                        "disabled": "Mui-disabled",
+                                        "endIcon": "MuiButton-endIcon",
+                                        "focusVisible": "Mui-focusVisible",
+                                        "fullWidth": "MuiButton-fullWidth",
+                                        "iconSizeLarge": "MuiButton-iconSizeLarge",
+                                        "iconSizeMedium": "MuiButton-iconSizeMedium",
+                                        "iconSizeSmall": "MuiButton-iconSizeSmall",
+                                        "label": "MuiButton-label text-16-bold",
+                                        "outlined": "MuiButton-outlined",
+                                        "outlinedPrimary": "MuiButton-outlinedPrimary",
+                                        "outlinedSecondary": "MuiButton-outlinedSecondary",
+                                        "outlinedSizeLarge": "MuiButton-outlinedSizeLarge",
+                                        "outlinedSizeSmall": "MuiButton-outlinedSizeSmall",
+                                        "root": "MuiButton-root btn-highlight",
+                                        "sizeLarge": "MuiButton-sizeLarge",
+                                        "sizeSmall": "MuiButton-sizeSmall",
+                                        "startIcon": "MuiButton-startIcon",
+                                        "text": "MuiButton-text",
+                                        "textPrimary": "MuiButton-textPrimary",
+                                        "textSecondary": "MuiButton-textSecondary",
+                                        "textSizeLarge": "MuiButton-textSizeLarge",
+                                        "textSizeSmall": "MuiButton-textSizeSmall",
+                                      }
+                                    }
+                                    onClick={[MockFunction]}
+                                  >
+                                    <WithStyles(ForwardRef(ButtonBase))
+                                      className="MuiButton-root btn-highlight MuiButton-text"
+                                      component="button"
+                                      disabled={false}
+                                      focusRipple={true}
+                                      focusVisibleClassName="Mui-focusVisible"
+                                      onClick={[MockFunction]}
+                                      type="button"
+                                    >
+                                      <ForwardRef(ButtonBase)
+                                        className="MuiButton-root btn-highlight MuiButton-text"
+                                        classes={
+                                          Object {
+                                            "disabled": "Mui-disabled",
+                                            "focusVisible": "Mui-focusVisible",
+                                            "root": "MuiButtonBase-root",
+                                          }
+                                        }
+                                        component="button"
+                                        disabled={false}
+                                        focusRipple={true}
+                                        focusVisibleClassName="Mui-focusVisible"
+                                        onClick={[MockFunction]}
+                                        type="button"
+                                      >
+                                        <button
+                                          className="MuiButtonBase-root MuiButton-root btn-highlight MuiButton-text"
+                                          disabled={false}
+                                          onBlur={[Function]}
+                                          onClick={[MockFunction]}
+                                          onDragLeave={[Function]}
+                                          onFocus={[Function]}
+                                          onKeyDown={[Function]}
+                                          onKeyUp={[Function]}
+                                          onMouseDown={[Function]}
+                                          onMouseLeave={[Function]}
+                                          onMouseUp={[Function]}
+                                          onTouchEnd={[Function]}
+                                          onTouchMove={[Function]}
+                                          onTouchStart={[Function]}
+                                          tabIndex={0}
+                                          type="button"
+                                        >
+                                          <span
+                                            className="MuiButton-label text-16-bold"
+                                          >
+                                            consumption.partners_issue_modal.button_validate
+                                          </span>
+                                          <NoSsr>
+                                            <WithStyles(memo)
+                                              center={false}
+                                            >
+                                              <ForwardRef(TouchRipple)
+                                                center={false}
+                                                classes={
+                                                  Object {
+                                                    "child": "MuiTouchRipple-child",
+                                                    "childLeaving": "MuiTouchRipple-childLeaving",
+                                                    "childPulsate": "MuiTouchRipple-childPulsate",
+                                                    "ripple": "MuiTouchRipple-ripple",
+                                                    "ripplePulsate": "MuiTouchRipple-ripplePulsate",
+                                                    "rippleVisible": "MuiTouchRipple-rippleVisible",
+                                                    "root": "MuiTouchRipple-root",
+                                                  }
+                                                }
+                                              >
+                                                <span
+                                                  className="MuiTouchRipple-root"
+                                                >
+                                                  <TransitionGroup
+                                                    childFactory={[Function]}
+                                                    component={null}
+                                                    exit={true}
+                                                  />
+                                                </span>
+                                              </ForwardRef(TouchRipple)>
+                                            </WithStyles(memo)>
+                                          </NoSsr>
+                                        </button>
+                                      </ForwardRef(ButtonBase)>
+                                    </WithStyles(ForwardRef(ButtonBase))>
+                                  </ForwardRef(Button)>
+                                </WithStyles(ForwardRef(Button))>
+                              </div>
+                            </div>
+                          </ForwardRef(Paper)>
+                        </WithStyles(ForwardRef(Paper))>
+                      </div>
+                    </Transition>
+                  </ForwardRef(Fade)>
+                  <div
+                    data-test="sentinelEnd"
+                    tabIndex={0}
+                  />
+                </TrapFocus>
+              </div>
+            </Portal>
+          </ForwardRef(Portal)>
+        </ForwardRef(Modal)>
+      </ForwardRef(Dialog)>
+    </WithStyles(ForwardRef(Dialog))>
+  </PartnersIssueModal>
+</Provider>
+`;
diff --git a/src/components/PartnersIssue/partnersIssueModal.scss b/src/components/PartnersIssue/partnersIssueModal.scss
new file mode 100644
index 000000000..ffb8ff0be
--- /dev/null
+++ b/src/components/PartnersIssue/partnersIssueModal.scss
@@ -0,0 +1,34 @@
+@import '../../styles/base/typo-variables';
+@import '../../styles/base/color';
+
+.partnersIssueModal {
+  padding: 1rem;
+  max-width: 20rem;
+  .warn-icon {
+    margin: 1rem auto;
+    display: block;
+  }
+  .partners-issue-title {
+    color: #ec9d41;
+    margin: 1rem auto;
+    text-align: center;
+  }
+  .partners-issue-content {
+    color: $grey-bright;
+  }
+
+  button.btn-highlight {
+    padding: 0.65rem;
+  }
+}
+.partners-issue-portal {
+  .modal-overlay {
+    .modal-box {
+      max-width: 21rem;
+    }
+  }
+}
+
+#accessibility-title {
+  display: none;
+}
diff --git a/src/components/Splash/SplashRoot.tsx b/src/components/Splash/SplashRoot.tsx
index 97463335e..c6a002c1f 100644
--- a/src/components/Splash/SplashRoot.tsx
+++ b/src/components/Splash/SplashRoot.tsx
@@ -8,6 +8,8 @@ import React, {
 import { useClient } from 'cozy-client'
 import classNames from 'classnames'
 import { useDispatch } from 'react-redux'
+import { FluidState, FluidType } from 'enum/fluid.enum'
+
 import {
   toggleAnalysisNotification,
   toggleChallengeExplorationNotification,
@@ -17,6 +19,7 @@ import {
   GlobalActionTypes,
   updateTermValidation,
   showReleaseNotes,
+  setPartnersIssue,
 } from 'store/global/global.actions'
 import {
   ProfileActionTypes,
@@ -46,12 +49,15 @@ import {
 import { DateTime } from 'luxon'
 import { UserActionState } from 'enum/userAction.enum'
 import ActionService from 'services/action.service'
-import { UserChallenge } from 'models'
+import { FluidStatus, UserChallenge } from 'models'
 import UsageEventService from 'services/usageEvent.service'
 import { UsageEventType } from 'enum/usageEvent.enum'
 import { MigrationService } from 'migrations/migration.service'
 import { migrations } from 'migrations/migration.data'
 import { ReleaseNotes } from 'models/releaseNotes.model'
+import PartnersInfoService from 'services/partnersInfo.service'
+import FluidService from 'services/fluid.service'
+import { PartnersInfo } from 'models/partnersInfo.model'
 
 interface SplashRootProps {
   fadeTimer?: number
@@ -100,6 +106,7 @@ const SplashRoot = ({
     let subscribed = true
     async function loadData() {
       const initializationService = new InitializationService(client)
+      const partnersInfoService = new PartnersInfoService(client)
       const ms = new MigrationService(client)
       const migrationsResult: ReleaseNotes = await ms.runMigrations(migrations)
       try {
@@ -242,8 +249,45 @@ const SplashRoot = ({
           ...prev,
           splashStart: true,
         }))
+
+        // Check partnersInfo from backoffice
+        const partnersInfo: PartnersInfo = await partnersInfoService.getPartnersInfo()
+
+        // Get last partnersIssueDate
+        const today = DateTime.local()
+          .setZone('utc', {
+            keepLocalTime: true,
+          })
+          .startOf('day')
+          .toISO()
+
+        // If notification is activated and konnector is connected, set FluidStatus to PARTNER_ISSUE
+        if (partnersInfo && partnersInfo.notification_activated) {
+          const fluidService = new FluidService(client)
+          const _updatedFluidStatus: FluidStatus[] = await fluidService.getFluidStatus(
+            partnersInfo
+          )
+          let isConcernedByPartnerIssue = false
+          for (const fluid of _updatedFluidStatus) {
+            if (fluid.status === FluidState.PARTNER_ISSUE)
+              isConcernedByPartnerIssue = true
+          }
+          dispatch(setFluidStatus(_updatedFluidStatus))
+          if (
+            today !== (profile && profile.partnersIssueDate.toISO()) &&
+            isConcernedByPartnerIssue
+          ) {
+            dispatch(setPartnersIssue(true))
+          }
+        }
+
+        /*
+         * If the partnersIssueModal has not been seen today
+         * and the user is concerned by any one of the partners' issue
+         * enable the modal
+         */
       } catch (err) {
-        setError(err)
+        setError(err as any)
       }
     }
     loadData()
diff --git a/src/enum/fluid.enum.ts b/src/enum/fluid.enum.ts
index e62cd529e..cd67a004d 100644
--- a/src/enum/fluid.enum.ts
+++ b/src/enum/fluid.enum.ts
@@ -11,4 +11,5 @@ export enum FluidState {
   DONE = 200,
   ERROR = 300,
   ERROR_LOGIN_FAILED = 301,
+  PARTNER_ISSUE = 500,
 }
diff --git a/src/locales/fr.json b/src/locales/fr.json
index 772debd5e..45a0046bd 100644
--- a/src/locales/fr.json
+++ b/src/locales/fr.json
@@ -249,6 +249,12 @@
       "button_previous_value": "Sélectionner la valeur précédente",
       "button_next_value": "Sélectionner la valeur suivante",
       "checkbox_compare": "Afficher ou cacher la comparaison"
+    },
+    "partners_issue_modal": {
+      "title": "Un problème dans la récupération de vos données",
+      "text_1": "Ces partenaires nous indiquent qu’ils subissent en ce moment un soucis technique :",
+      "text_2": "La visualisation de vos consommations peut s’en trouver affectée.",
+      "button_validate": "J'ai compris"
     }
   },
   "consumption_details": {
@@ -541,6 +547,7 @@
   "konnector_form": {
     "label_updated_at": "Dernière mise-à-jour le",
     "button_update": "Mettre à jour",
+    "wait_end_issue": "Attendre la fin de la maintenance avant de mettre à jour.",
     "button_delete": "Supprimer",
     "issue": "Le problème semble venir de ",
     "resolve": "Une mise à jour peut résoudre ce problème.",
@@ -565,6 +572,7 @@
     "label_connect_to_electricity": "Se connecter à l'électricité",
     "label_connect_to_water": "Se connecter à l'eau",
     "label_connect_to_gas": "Se connecter au gaz",
+    "partner_issue": "En maintenance",
     "accessibility": {
       "label_ko_status": "Connecteur en erreur",
       "button_toggle_detail_electricity": "Afficher ou masquer le détail de la connexion à l'électricité",
diff --git a/src/migrations/migration.data.ts b/src/migrations/migration.data.ts
index c96ca4a84..ec04ee686 100644
--- a/src/migrations/migration.data.ts
+++ b/src/migrations/migration.data.ts
@@ -283,7 +283,25 @@ export const migrations: Migration[] = [
   {
     baseSchemaVersion: 9,
     targetSchemaVersion: 10,
-    appVersion: '1.5.1',
+    appVersion: '1.6.0',
+    description:
+      "Profil now contains partnersIssueDate in order to handle partners' issue display",
+    releaseNotes: null,
+    docTypes: PROFILE_DOCTYPE,
+    run: async (_client: Client, docs: any[]): Promise<Profile[]> => {
+      return docs.map((doc: Profile) => {
+        doc.partnersIssueDate = DateTime.local()
+          .minus({ day: 1 })
+          .startOf('day')
+        console.log(doc)
+        return doc
+      })
+    },
+  },
+  {
+    baseSchemaVersion: 10,
+    targetSchemaVersion: 11,
+    appVersion: '1.6.0',
     description:
       'Rename tutorial to onboaring in ecolyo profile, remove isLastTermAccepted',
     releaseNotes: null,
diff --git a/src/migrations/migration.ts b/src/migrations/migration.ts
index 38ccf98c9..fa9c222a1 100644
--- a/src/migrations/migration.ts
+++ b/src/migrations/migration.ts
@@ -165,6 +165,7 @@ export async function migrate(
           break
       }
     } catch (err) {
+      console.error(err)
       result = {
         type: MIGRATION_RESULT_FAILED,
         errors: [err.toString()],
diff --git a/src/models/global.model.ts b/src/models/global.model.ts
index d36194024..fe4eb2a49 100644
--- a/src/models/global.model.ts
+++ b/src/models/global.model.ts
@@ -13,4 +13,5 @@ export interface GlobalState {
   isLastTermAccepted: boolean
   fluidStatus: FluidStatus[]
   fluidTypes: FluidType[]
+  openPartnersIssueModal: boolean
 }
diff --git a/src/models/partnersInfo.model.ts b/src/models/partnersInfo.model.ts
new file mode 100644
index 000000000..410458467
--- /dev/null
+++ b/src/models/partnersInfo.model.ts
@@ -0,0 +1,6 @@
+export interface PartnersInfo {
+  grdf_failure: boolean
+  enedis_failure: boolean
+  egl_failure: boolean
+  notification_activated: boolean
+}
diff --git a/src/models/profile.model.ts b/src/models/profile.model.ts
index 1613097f6..f28a546c8 100644
--- a/src/models/profile.model.ts
+++ b/src/models/profile.model.ts
@@ -21,12 +21,17 @@ export interface ProfileEntity {
   isProfileTypeCompleted: boolean
   onboarding: Onboarding
   mailToken: string
+  partnersIssueDate: string
   _id?: string
   _rev?: string
 }
 
 export interface Profile
-  extends Omit<ProfileEntity, 'lastConnectionDate' | 'monthlyAnalysisDate'> {
+  extends Omit<
+    ProfileEntity,
+    'lastConnectionDate' | 'monthlyAnalysisDate' | 'partnersIssueDate'
+  > {
   lastConnectionDate: DateTime
   monthlyAnalysisDate: DateTime
+  partnersIssueDate: DateTime
 }
diff --git a/src/services/fluid.service.spec.ts b/src/services/fluid.service.spec.ts
index 05995a31c..fe9caea0a 100644
--- a/src/services/fluid.service.spec.ts
+++ b/src/services/fluid.service.spec.ts
@@ -7,6 +7,10 @@ import { triggerStateData } from '../../tests/__mocks__/triggerStateData.mock'
 import { DateTime } from 'luxon'
 import { FluidState, FluidType } from 'enum/fluid.enum'
 import { FluidStatus } from 'models'
+import {
+  mockPartnersInfoActivated,
+  mockPartnersInfoDisabled,
+} from '../../tests/__mocks__/fluidStatusData.mock'
 
 const mockGetAccountByType = jest.fn()
 jest.mock('./account.service', () => {
@@ -651,5 +655,151 @@ describe('FLuid service', () => {
       const result: FluidType[] = await FluidService.getOldFluidData([])
       expect(result).toEqual([])
     })
+    it('should return the fluids concerned by partnerIssue', async () => {
+      const mockFluidStatus: FluidStatus[] = [
+        {
+          fluidType: FluidType.ELECTRICITY,
+          status: FluidState.PARTNER_ISSUE,
+          lastDataDate: DateTime.fromISO('2020-01-01').setZone('utc', {
+            keepLocalTime: true,
+          }),
+          connection: {
+            konnector: konnectorsData[0],
+            account: accountsData[0],
+            trigger: triggersData[0],
+            triggerState: triggerStateData,
+            shouldLaunchKonnector: false,
+            isUpdating: false,
+            konnectorConfig: {
+              name: 'Enedis',
+              oauth: true,
+              slug: 'enedisgrandlyon',
+              siteLink: 'https://mon-compte-client.enedis.fr/',
+              activation: 'https://mon-compte-particulier.enedis.fr/donnees/',
+            },
+          },
+        },
+        {
+          fluidType: FluidType.WATER,
+          status: FluidState.ERROR_LOGIN_FAILED,
+          lastDataDate: DateTime.fromISO('2020-01-01').setZone('utc', {
+            keepLocalTime: true,
+          }),
+          connection: {
+            konnector: konnectorsData[0],
+            account: accountsData[0],
+            trigger: triggersData[0],
+            triggerState: triggerStateData,
+            shouldLaunchKonnector: false,
+            isUpdating: false,
+            konnectorConfig: {
+              name: 'Eau du Grand Lyon',
+              oauth: true,
+              slug: 'eglgrandlyon',
+              siteLink: '',
+              activation: '',
+            },
+          },
+        },
+      ]
+      const result: FluidType[] = await fluidService.getFluidsConcernedByPartnerIssue(
+        mockFluidStatus
+      )
+      expect(result).toEqual([FluidType.ELECTRICITY])
+    })
+    it('should return the fluids concerned by partnerIssue', async () => {
+      const mockFluidStatus: FluidStatus[] = [
+        {
+          fluidType: FluidType.ELECTRICITY,
+          status: FluidState.PARTNER_ISSUE,
+          lastDataDate: DateTime.fromISO('2020-01-01').setZone('utc', {
+            keepLocalTime: true,
+          }),
+          connection: {
+            konnector: konnectorsData[0],
+            account: accountsData[0],
+            trigger: triggersData[0],
+            triggerState: triggerStateData,
+            shouldLaunchKonnector: false,
+            isUpdating: false,
+            konnectorConfig: {
+              name: 'Enedis',
+              oauth: true,
+              slug: 'enedisgrandlyon',
+              siteLink: 'https://mon-compte-client.enedis.fr/',
+              activation: 'https://mon-compte-particulier.enedis.fr/donnees/',
+            },
+          },
+        },
+        {
+          fluidType: FluidType.WATER,
+          status: FluidState.ERROR_LOGIN_FAILED,
+          lastDataDate: DateTime.fromISO('2020-01-01').setZone('utc', {
+            keepLocalTime: true,
+          }),
+          connection: {
+            konnector: konnectorsData[0],
+            account: accountsData[0],
+            trigger: triggersData[0],
+            triggerState: triggerStateData,
+            shouldLaunchKonnector: false,
+            isUpdating: false,
+            konnectorConfig: {
+              name: 'Eau du Grand Lyon',
+              oauth: true,
+              slug: 'eglgrandlyon',
+              siteLink: '',
+              activation: '',
+            },
+          },
+        },
+        {
+          fluidType: FluidType.GAS,
+          status: FluidState.ERROR_LOGIN_FAILED,
+          lastDataDate: DateTime.fromISO('2020-01-01').setZone('utc', {
+            keepLocalTime: true,
+          }),
+          connection: {
+            konnector: konnectorsData[0],
+            account: accountsData[0],
+            trigger: triggersData[0],
+            triggerState: triggerStateData,
+            shouldLaunchKonnector: false,
+            isUpdating: false,
+            konnectorConfig: {
+              name: 'GRDF',
+              oauth: true,
+              slug: 'grdfgrandlyon',
+              siteLink: '',
+              activation: '',
+            },
+          },
+        },
+      ]
+      const result: boolean = fluidService.isFluidInPartnerIssue(
+        FluidType.ELECTRICITY,
+        mockFluidStatus[FluidType.ELECTRICITY].status,
+        mockPartnersInfoActivated
+      )
+      expect(result).toEqual(true)
+      const result2: boolean = fluidService.isFluidInPartnerIssue(
+        FluidType.WATER,
+        FluidState.PARTNER_ISSUE,
+        mockPartnersInfoActivated
+      )
+      expect(result2).toEqual(true)
+      const result3: boolean = fluidService.isFluidInPartnerIssue(
+        FluidType.GAS,
+        FluidState.PARTNER_ISSUE,
+        mockPartnersInfoActivated
+      )
+      expect(result3).toEqual(true)
+      const result4: boolean = fluidService.isFluidInPartnerIssue(
+        FluidType.GAS,
+        FluidState.PARTNER_ISSUE,
+        mockPartnersInfoDisabled
+      )
+      expect(result4).toEqual(false)
+    })
   })
 })
diff --git a/src/services/fluid.service.ts b/src/services/fluid.service.ts
index c31603038..6989034b3 100644
--- a/src/services/fluid.service.ts
+++ b/src/services/fluid.service.ts
@@ -8,6 +8,7 @@ import ConsumptionService from 'services/consumption.service'
 import AccountService from 'services/account.service'
 import TriggerService from 'services/triggers.service'
 import { DateTime } from 'luxon'
+import { PartnersInfo } from 'models/partnersInfo.model'
 
 export default class FluidService {
   private _client: Client
@@ -40,7 +41,53 @@ export default class FluidService {
     }
   }
 
-  public getFluidStatus = async (): Promise<FluidStatus[]> => {
+  public isFluidInPartnerIssue = (
+    fluidType: FluidType,
+    fluidState: FluidState,
+    partnersInfo: PartnersInfo
+  ) => {
+    if (
+      fluidType === FluidType.GAS &&
+      partnersInfo.grdf_failure &&
+      fluidState !== FluidState.NOT_CONNECTED &&
+      fluidState !== FluidState.KONNECTOR_NOT_FOUND
+    ) {
+      return true
+    }
+    if (
+      fluidType === FluidType.ELECTRICITY &&
+      partnersInfo.enedis_failure &&
+      fluidState !== FluidState.NOT_CONNECTED &&
+      fluidState !== FluidState.KONNECTOR_NOT_FOUND
+    ) {
+      return true
+    }
+    if (
+      fluidType === FluidType.WATER &&
+      partnersInfo.egl_failure &&
+      fluidState !== FluidState.NOT_CONNECTED &&
+      fluidState !== FluidState.KONNECTOR_NOT_FOUND
+    ) {
+      return true
+    }
+    return false
+  }
+
+  public getFluidsConcernedByPartnerIssue = async (
+    statusArray: FluidStatus[]
+  ): Promise<FluidType[]> => {
+    const concernedFluids: FluidType[] = []
+    statusArray.forEach(fluid => {
+      if (fluid.status === FluidState.PARTNER_ISSUE) {
+        concernedFluids.push(fluid.fluidType)
+      }
+    })
+    return concernedFluids
+  }
+
+  public getFluidStatus = async (
+    partnersInfo?: PartnersInfo
+  ): Promise<FluidStatus[]> => {
     const fluidConfig = new ConfigService().getFluidConfig()
     const accountService = new AccountService(this._client)
     const [
@@ -107,7 +154,15 @@ export default class FluidService {
     const result: FluidStatus[] = [
       {
         fluidType: FluidType.ELECTRICITY,
-        status: this.parseFluidStatus(elecKonnector, elecStatus),
+        status:
+          partnersInfo &&
+          this.isFluidInPartnerIssue(
+            FluidType.ELECTRICITY,
+            this.parseFluidStatus(elecKonnector, elecStatus),
+            partnersInfo
+          )
+            ? FluidState.PARTNER_ISSUE
+            : this.parseFluidStatus(elecKonnector, elecStatus),
         lastDataDate: lastDataDates[FluidType.ELECTRICITY],
         connection: {
           shouldLaunchKonnector: false,
@@ -121,7 +176,15 @@ export default class FluidService {
       },
       {
         fluidType: FluidType.WATER,
-        status: this.parseFluidStatus(waterKonnector, waterStatus),
+        status:
+          partnersInfo &&
+          this.isFluidInPartnerIssue(
+            FluidType.WATER,
+            this.parseFluidStatus(waterKonnector, waterStatus),
+            partnersInfo
+          )
+            ? FluidState.PARTNER_ISSUE
+            : this.parseFluidStatus(waterKonnector, waterStatus),
         lastDataDate: lastDataDates[FluidType.WATER],
         connection: {
           shouldLaunchKonnector: false,
@@ -135,7 +198,15 @@ export default class FluidService {
       },
       {
         fluidType: FluidType.GAS,
-        status: this.parseFluidStatus(gasKonnector, gasStatus),
+        status:
+          partnersInfo &&
+          this.isFluidInPartnerIssue(
+            FluidType.GAS,
+            this.parseFluidStatus(gasKonnector, gasStatus),
+            partnersInfo
+          )
+            ? FluidState.PARTNER_ISSUE
+            : this.parseFluidStatus(gasKonnector, gasStatus),
         lastDataDate: lastDataDates[FluidType.GAS],
         connection: {
           shouldLaunchKonnector: false,
diff --git a/src/services/initialization.service.ts b/src/services/initialization.service.ts
index dcee9ea98..983826119 100644
--- a/src/services/initialization.service.ts
+++ b/src/services/initialization.service.ts
@@ -2,7 +2,6 @@ import { Client, Q, QueryDefinition } from 'cozy-client'
 import {
   ECOGESTURE_DOCTYPE,
   PROFILE_DOCTYPE,
-  PROFILETYPE_DOCTYPE,
   EGL_DAY_DOCTYPE,
   EGL_MONTH_DOCTYPE,
   EGL_YEAR_DOCTYPE,
diff --git a/src/services/partnersInfo.service.spec.ts b/src/services/partnersInfo.service.spec.ts
new file mode 100644
index 000000000..2a66339fd
--- /dev/null
+++ b/src/services/partnersInfo.service.spec.ts
@@ -0,0 +1,20 @@
+import { PartnersInfo } from 'models/partnersInfo.model'
+import mockClient from '../../tests/__mocks__/client'
+import PartnersInfoService from './partnersInfo.service'
+
+describe('PartnersInfo service', () => {
+  const partnersInfoService = new PartnersInfoService(mockClient)
+
+  it('should return partnersInfo', async () => {
+    const result: PartnersInfo = await partnersInfoService.getPartnersInfo()
+    expect(result).toEqual(undefined)
+  })
+  it('should return an error', async () => {
+    mockClient.query.mockRejectedValue(new Error())
+    try {
+      await partnersInfoService.getPartnersInfo()
+    } catch (error) {
+      expect(error).rejects.toThrow(new Error())
+    }
+  })
+})
diff --git a/src/services/partnersInfo.service.ts b/src/services/partnersInfo.service.ts
new file mode 100644
index 000000000..202629f7b
--- /dev/null
+++ b/src/services/partnersInfo.service.ts
@@ -0,0 +1,32 @@
+import { Client } from 'cozy-client'
+import { PartnersInfo } from 'models/partnersInfo.model'
+import EnvironementService from './environement.service'
+
+export default class PartnersInfoService {
+  private readonly _client: Client
+
+  constructor(_client: Client) {
+    this._client = _client
+  }
+
+  /*
+   * Get information from backoffice about the status of partners' service
+   * On success, respond the partnersInfo
+   * Else, throw an error
+   */
+  public async getPartnersInfo(): Promise<PartnersInfo> {
+    const env = new EnvironementService()
+    const remoteUrl = env.isProduction()
+      ? `/remote/org.ecolyo.backoffice.partners.info`
+      : `/remote/org.ecolyo.backoffice.partners.info.rec`
+    try {
+      const result = await this._client
+        .getStackClient()
+        .fetchJSON('GET', remoteUrl)
+      return result as PartnersInfo
+    } catch (error) {
+      console.error(error)
+      throw new Error("Failed to get partners' info")
+    }
+  }
+}
diff --git a/src/services/profile.service.spec.ts b/src/services/profile.service.spec.ts
index 55d223e9e..5cb4f6d59 100644
--- a/src/services/profile.service.spec.ts
+++ b/src/services/profile.service.spec.ts
@@ -62,6 +62,7 @@ describe('UserProfile service', () => {
       const userProfile = {
         ...profileData,
         monthlyAnalysisDate: '2020-11-03T00:00:00.000Z',
+        partnersIssueDate: '2020-11-03T00:00:00.000Z',
       }
       // eslint-disable-next-line @typescript-eslint/no-explicit-any
       const mockQueryResult: QueryResult<any[]> = {
@@ -88,6 +89,9 @@ describe('UserProfile service', () => {
         monthlyAnalysisDate: DateTime.fromISO('2020-11-03T00:00:00.000Z', {
           zone: 'utc',
         }),
+        partnersIssueDate: DateTime.fromISO('2020-11-03T00:00:00.000Z', {
+          zone: 'utc',
+        }),
         haveSeenLastAnalysis: false,
       }
       const result = await profileService.updateProfile({
diff --git a/src/services/profile.service.ts b/src/services/profile.service.ts
index 3ea5d3a83..0f2629456 100644
--- a/src/services/profile.service.ts
+++ b/src/services/profile.service.ts
@@ -26,6 +26,9 @@ export default class ProfileService {
       lastConnectionDate: DateTime.fromISO(profileEntity.lastConnectionDate, {
         zone: 'utc',
       }),
+      partnersIssueDate: DateTime.fromISO(profileEntity.partnersIssueDate, {
+        zone: 'utc',
+      }),
     }
     return profile
   }
diff --git a/src/store/global/global.actions.ts b/src/store/global/global.actions.ts
index 072b7fddc..803df92c2 100644
--- a/src/store/global/global.actions.ts
+++ b/src/store/global/global.actions.ts
@@ -15,6 +15,7 @@ export const TOGGLE_ANALYSIS_NOTIFICATION = 'TOGGLE_ANALYSIS_NOTIFICATION'
 export const SET_FLUID_STATUS = 'SET_FLUID_STATUS'
 export const UPDATE_FLUID_CONNECTION = 'UPDATE_FLUID_CONNECTION'
 export const UPDATE_TERMS_VALIDATION = 'UPDATE_TERMS_VALIDATION'
+export const SET_PARTNERS_ISSUE = 'SET_PARTNERS_ISSUE'
 
 interface ChangeScreenType {
   type: typeof CHANGE_SCREEN_TYPE
@@ -61,6 +62,11 @@ interface ShowReleaseNotes {
   payload?: { show: boolean; notes: Notes[] }
 }
 
+interface SetPartnersIssue {
+  type: typeof SET_PARTNERS_ISSUE
+  payload?: boolean
+}
+
 export type GlobalActionTypes =
   | ChangeScreenType
   | ToogleChallengeExplorationNotification
@@ -71,6 +77,7 @@ export type GlobalActionTypes =
   | UpdatedFluidConnection
   | UpdateTermValidation
   | ShowReleaseNotes
+  | SetPartnersIssue
 
 export function changeScreenType(screenType: ScreenType): GlobalActionTypes {
   return {
@@ -147,3 +154,12 @@ export function updateTermValidation(
     payload: isLastTermAccepted,
   }
 }
+
+export function setPartnersIssue(
+  openPartnersIssueModal: boolean
+): GlobalActionTypes {
+  return {
+    type: SET_PARTNERS_ISSUE,
+    payload: openPartnersIssueModal,
+  }
+}
diff --git a/src/store/global/global.reducer.ts b/src/store/global/global.reducer.ts
index e4e408f99..86c285188 100644
--- a/src/store/global/global.reducer.ts
+++ b/src/store/global/global.reducer.ts
@@ -10,6 +10,7 @@ import {
   GlobalActionTypes,
   UPDATE_TERMS_VALIDATION,
   SHOW_RELEASE_NOTES,
+  SET_PARTNERS_ISSUE,
 } from 'store/global/global.actions'
 import { FluidStatus, GlobalState } from 'models'
 import { ScreenType } from 'enum/screen.enum'
@@ -94,6 +95,7 @@ const initialState: GlobalState = {
     },
   ],
   fluidTypes: [],
+  openPartnersIssueModal: false,
 }
 
 const getFluidTypesFromStatus = (fluidStatus: FluidStatus[]): FluidType[] => {
@@ -172,6 +174,13 @@ export const globalReducer: Reducer<GlobalState> = (
             releaseNotes: action.payload,
           }
         : state
+    case SET_PARTNERS_ISSUE:
+      return action.payload != undefined
+        ? {
+            ...state,
+            openPartnersIssueModal: action.payload,
+          }
+        : state
     case UPDATE_FLUID_CONNECTION:
       if (action.payload !== undefined) {
         const updatedFluidStatus = [...state.fluidStatus]
diff --git a/src/store/profile/profile.reducer.ts b/src/store/profile/profile.reducer.ts
index da1a34589..94fdf371c 100644
--- a/src/store/profile/profile.reducer.ts
+++ b/src/store/profile/profile.reducer.ts
@@ -14,6 +14,7 @@ const initialState: Profile = {
   quizHash: '',
   explorationHash: '',
   isFirstConnection: false,
+  partnersIssueDate: DateTime.fromISO('0000-01-01T00:00:00.000Z'),
   lastConnectionDate: DateTime.fromISO('0000-01-01T00:00:00.000Z'),
   haveSeenLastAnalysis: true,
   sendAnalysisNotification: true,
diff --git a/tests/__mocks__/fluidStatusData.mock.ts b/tests/__mocks__/fluidStatusData.mock.ts
index 8505c1a5e..82efc473a 100644
--- a/tests/__mocks__/fluidStatusData.mock.ts
+++ b/tests/__mocks__/fluidStatusData.mock.ts
@@ -1,6 +1,8 @@
 import { FluidState } from 'enum/fluid.enum'
 import { DateTime } from 'luxon'
 import { FluidStatus } from 'models'
+import { PartnersInfo } from 'models/partnersInfo.model'
+/* eslint-disable @typescript-eslint/camelcase */
 
 export const fluidStatusData: FluidStatus[] = [
   {
@@ -71,6 +73,18 @@ export const fluidStatusData: FluidStatus[] = [
     },
   },
 ]
+export const mockPartnersInfoActivated: PartnersInfo = {
+  grdf_failure: true,
+  enedis_failure: true,
+  egl_failure: true,
+  notification_activated: true,
+}
+export const mockPartnersInfoDisabled: PartnersInfo = {
+  grdf_failure: false,
+  enedis_failure: false,
+  egl_failure: false,
+  notification_activated: false,
+}
 
 export const fluidStatusConnectedData: FluidStatus[] = [
   {
diff --git a/tests/__mocks__/profile.mock.ts b/tests/__mocks__/profile.mock.ts
index 0b95a8fa8..fa8a65ba6 100644
--- a/tests/__mocks__/profile.mock.ts
+++ b/tests/__mocks__/profile.mock.ts
@@ -13,6 +13,9 @@ export const profileData: Profile = {
   isFirstConnection: true,
   sendConsumptionAlert: false,
   waterDailyConsumptionLimit: 0,
+  partnersIssueDate: DateTime.fromISO('2020-11-03T00:00:00.000Z', {
+    zone: 'utc',
+  }),
   mailToken: '',
   lastConnectionDate: DateTime.fromISO('2020-11-03T00:00:00.000Z', {
     zone: 'utc',
diff --git a/tests/__mocks__/store.ts b/tests/__mocks__/store.ts
index 39fb1a9a4..85cd98bbe 100644
--- a/tests/__mocks__/store.ts
+++ b/tests/__mocks__/store.ts
@@ -33,6 +33,7 @@ export const mockInitialGlobalState: GlobalState = {
   challengeDuelNotification: false,
   analysisNotification: false,
   isLastTermAccepted: false,
+  openPartnersIssueModal: false,
   releaseNotes: { show: false, notes: [{ description: '', title: '' }] },
   fluidStatus: [
     {
@@ -107,6 +108,7 @@ export const mockInitialProfileState: Profile = {
   quizHash: '',
   explorationHash: '',
   isFirstConnection: false,
+  partnersIssueDate: DateTime.fromISO('0000-01-01T00:00:00.000Z'),
   lastConnectionDate: DateTime.fromISO('0000-01-01T00:00:00.000Z'),
   haveSeenLastAnalysis: true,
   sendConsumptionAlert: false,
-- 
GitLab