diff --git a/src/mrs/templates/statistics.html b/src/mrs/templates/statistics.html deleted file mode 100644 index 34f3fd2a..00000000 --- a/src/mrs/templates/statistics.html +++ /dev/null @@ -1,83 +0,0 @@ -{% extends 'base.html' %} - -{% block title %}Statistiques{% endblock %} -{% block description %}Découvrez les statistiques d’utilisation du service Mes Remboursements Simplifiés (MRS).{% endblock %} - -{% block body_class %}statistics{% endblock %} -{% block content %} - - -
-
-
-
-
- {{ view.form }} -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
CatégorieQuantité
Nombre d'assurés{{ view.insured_count }}
Nombre d'assurés ayant basculé vers le véhicule personnel*{{ view.shifted_insured_count }}
Nombre de demandes traitées (Validées/Rejetées){{ view.mrsrequests_processed }}
Nombre de demandes d'assurés ayant basculés{{ view.insured_shifts }}
Délai moyen de traitement en jour(s){{ view.average_payment_delay }}
Economies réalisées**{{ view.savings|floatformat:2 }}€
- - - -

- *Assuré utilisateur de Transport Assis Professionnalisé (TAP) ayant basculé vers le Véhicule Particulier (VP) depuis la mise en oeuvre de MRS -

-

- ** Différence entre le coût théorique d'un TAP et le montant pris en charge au titre du VP pour les assurés ayant basculés. -

- -

- Données provenant de MRS, mise à jour : {{ view.now }} -

-
-
-
-{% endblock %} diff --git a/src/mrs/tests/response_fixtures/StatCrawlTest.test_crawl/admin/content b/src/mrs/tests/response_fixtures/StatCrawlTest.test_crawl/admin/content index 5347e3ee..3b22f66b 100644 --- a/src/mrs/tests/response_fixtures/StatCrawlTest.test_crawl/admin/content +++ b/src/mrs/tests/response_fixtures/StatCrawlTest.test_crawl/admin/content @@ -70,16 +70,8 @@ textarea { insert_chartQuotidiennes - - -
  • - show_chartCumulatives + title="Suivi des indicateurs" + >show_chartSuivi des indicateurs
  • diff --git a/src/mrs/tests/response_fixtures/StatCrawlTest.test_crawl/admin/statdate__gte=01%2F05%2F2018&date__lte=31%2F05%2F2018&caisse=1.content b/src/mrs/tests/response_fixtures/StatCrawlTest.test_crawl/admin/statdate__gte=01%2F05%2F2018&date__lte=31%2F05%2F2018&caisse=1.content index 24aee46e..24c2358f 100644 --- a/src/mrs/tests/response_fixtures/StatCrawlTest.test_crawl/admin/statdate__gte=01%2F05%2F2018&date__lte=31%2F05%2F2018&caisse=1.content +++ b/src/mrs/tests/response_fixtures/StatCrawlTest.test_crawl/admin/statdate__gte=01%2F05%2F2018&date__lte=31%2F05%2F2018&caisse=1.content @@ -8,7 +8,7 @@
    -
    +
    @@ -19,18 +19,7 @@
    -
    -
    -
    - - - -
    -
    -
    +
    @@ -39,7 +28,7 @@
    -
    +
    @@ -54,45 +43,41 @@
    - -
    -
    +

    - Moyenne des délais quotidiens de traitement: 0.36 jours + Nombre d'assurés avec un dossier durant la période: 4

    -
    -

    - Nombre de demandes soumises: 5 + Nombre d'assurés ayant basculé vers le véhicule personnel*: 1

    - Nombre de demandes en cours: 4 + Nombre de demandes traitées (Validées/Rejetées): 3

    - Nombre de demandes validées: 2 + Délai moyen de traitement en jours: 0,36

    - Nombre de demandes rejetées: 1 + Economies réalisées**: 8.83€

    -
    -

    - Econnomies réalisées: 8.83€ -

    -

    - Nombre d'assurés ayant basculés pendant la période: 1 -

    -

    - Nombre d'assurés avec un dossier traité durant la période: 0 -

    -

    - Nombre de dossiers traités durant la période d'assurés ayant basculés même en dehors de la période: 2 + Nombre de primo utilisateurs***: 3

    -
    -
    +
    +

    + * Assuré utilisateur de Transport Assis Professionnalisé (TAP) ayant basculé vers le Véhicule Particulier + (VP) depuis la mise en oeuvre de MRS +

    +

    + ** Différence entre le coût théorique d'un TAP et le montant pris en charge au titre du VP pour les + assurés ayant basculés. +

    +

    + *** Assuré ayant réalisé pour la première fois une demande de remboursement sur la période +

    +
    diff --git a/src/mrs/tests/response_fixtures/StatCrawlTest.test_crawl/admin/statdate__gte=01%2F05%2F2018&date__lte=31%2F05%2F2018&caisse=1.metadata b/src/mrs/tests/response_fixtures/StatCrawlTest.test_crawl/admin/statdate__gte=01%2F05%2F2018&date__lte=31%2F05%2F2018&caisse=1.metadata index 57e70bdf..95ef274b 100644 --- a/src/mrs/tests/response_fixtures/StatCrawlTest.test_crawl/admin/statdate__gte=01%2F05%2F2018&date__lte=31%2F05%2F2018&caisse=1.metadata +++ b/src/mrs/tests/response_fixtures/StatCrawlTest.test_crawl/admin/statdate__gte=01%2F05%2F2018&date__lte=31%2F05%2F2018&caisse=1.metadata @@ -1,4 +1,4 @@ { - "query_count": 17, + "query_count": 12, "status_code": 200 } \ No newline at end of file diff --git a/src/mrs/tests/response_fixtures/SuperuserCrawlTest.test_crawl/admin/statdate__gte=01%2F05%2F2018&date__lte=31%2F05%2F2018.content b/src/mrs/tests/response_fixtures/SuperuserCrawlTest.test_crawl/admin/statdate__gte=01%2F05%2F2018&date__lte=31%2F05%2F2018.content index d54e1f03..696d95ef 100644 --- a/src/mrs/tests/response_fixtures/SuperuserCrawlTest.test_crawl/admin/statdate__gte=01%2F05%2F2018&date__lte=31%2F05%2F2018.content +++ b/src/mrs/tests/response_fixtures/SuperuserCrawlTest.test_crawl/admin/statdate__gte=01%2F05%2F2018&date__lte=31%2F05%2F2018.content @@ -8,7 +8,7 @@ -
    +
    @@ -20,18 +20,7 @@
    -
    -
    -
    - - - -
    -
    -
    +
    @@ -40,7 +29,7 @@
    -
    +
    @@ -55,45 +44,41 @@
    - -
    -
    +

    - Moyenne des délais quotidiens de traitement: 0.36 jours + Nombre d'assurés avec un dossier durant la période: 5

    -
    -

    - Nombre de demandes soumises: 8 + Nombre d'assurés ayant basculé vers le véhicule personnel*: 1

    - Nombre de demandes en cours: 6 + Nombre de demandes traitées (Validées/Rejetées): 6

    - Nombre de demandes validées: 4 + Délai moyen de traitement en jours: 0,36

    - Nombre de demandes rejetées: 1 + Economies réalisées**: 8.83€

    -
    -

    - Econnomies réalisées: 8.83€ -

    -

    - Nombre d'assurés ayant basculés pendant la période: 1 -

    -

    - Nombre d'assurés avec un dossier traité durant la période: 3 -

    -

    - Nombre de dossiers traités durant la période d'assurés ayant basculés même en dehors de la période: 4 + Nombre de primo utilisateurs***: 4

    -
    -
    +
    +

    + * Assuré utilisateur de Transport Assis Professionnalisé (TAP) ayant basculé vers le Véhicule Particulier + (VP) depuis la mise en oeuvre de MRS +

    +

    + ** Différence entre le coût théorique d'un TAP et le montant pris en charge au titre du VP pour les + assurés ayant basculés. +

    +

    + *** Assuré ayant réalisé pour la première fois une demande de remboursement sur la période +

    +
    diff --git a/src/mrs/tests/response_fixtures/SuperuserCrawlTest.test_crawl/admin/statdate__gte=01%2F05%2F2018&date__lte=31%2F05%2F2018.metadata b/src/mrs/tests/response_fixtures/SuperuserCrawlTest.test_crawl/admin/statdate__gte=01%2F05%2F2018&date__lte=31%2F05%2F2018.metadata index 57e70bdf..73b2b1c3 100644 --- a/src/mrs/tests/response_fixtures/SuperuserCrawlTest.test_crawl/admin/statdate__gte=01%2F05%2F2018&date__lte=31%2F05%2F2018.metadata +++ b/src/mrs/tests/response_fixtures/SuperuserCrawlTest.test_crawl/admin/statdate__gte=01%2F05%2F2018&date__lte=31%2F05%2F2018.metadata @@ -1,4 +1,4 @@ { - "query_count": 17, + "query_count": 11, "status_code": 200 } \ No newline at end of file diff --git a/src/mrs/tests/response_fixtures/SuperviseurCrawlTest.test_crawl/admin/content b/src/mrs/tests/response_fixtures/SuperviseurCrawlTest.test_crawl/admin/content index 23bedb45..5a5775ee 100644 --- a/src/mrs/tests/response_fixtures/SuperviseurCrawlTest.test_crawl/admin/content +++ b/src/mrs/tests/response_fixtures/SuperviseurCrawlTest.test_crawl/admin/content @@ -93,34 +93,14 @@ textarea { -
  • - -
  • + +
  • + multiline_chartStats +
  • diff --git a/src/mrs/tests/response_fixtures/SuperviseurCrawlTest.test_crawl/admin/statdate__gte=01%2F05%2F2018&date__lte=31%2F05%2F2018&caisse=1.content b/src/mrs/tests/response_fixtures/SuperviseurCrawlTest.test_crawl/admin/statdate__gte=01%2F05%2F2018&date__lte=31%2F05%2F2018&caisse=1.content index 24aee46e..24c2358f 100644 --- a/src/mrs/tests/response_fixtures/SuperviseurCrawlTest.test_crawl/admin/statdate__gte=01%2F05%2F2018&date__lte=31%2F05%2F2018&caisse=1.content +++ b/src/mrs/tests/response_fixtures/SuperviseurCrawlTest.test_crawl/admin/statdate__gte=01%2F05%2F2018&date__lte=31%2F05%2F2018&caisse=1.content @@ -8,7 +8,7 @@ -
    +
    @@ -19,18 +19,7 @@
    -
    -
    -
    - - - -
    -
    -
    +
    @@ -39,7 +28,7 @@
    -
    +
    @@ -54,45 +43,41 @@
    - -
    -
    +

    - Moyenne des délais quotidiens de traitement: 0.36 jours + Nombre d'assurés avec un dossier durant la période: 4

    -
    -

    - Nombre de demandes soumises: 5 + Nombre d'assurés ayant basculé vers le véhicule personnel*: 1

    - Nombre de demandes en cours: 4 + Nombre de demandes traitées (Validées/Rejetées): 3

    - Nombre de demandes validées: 2 + Délai moyen de traitement en jours: 0,36

    - Nombre de demandes rejetées: 1 + Economies réalisées**: 8.83€

    -
    -

    - Econnomies réalisées: 8.83€ -

    -

    - Nombre d'assurés ayant basculés pendant la période: 1 -

    -

    - Nombre d'assurés avec un dossier traité durant la période: 0 -

    -

    - Nombre de dossiers traités durant la période d'assurés ayant basculés même en dehors de la période: 2 + Nombre de primo utilisateurs***: 3

    -
    -
    +
    +

    + * Assuré utilisateur de Transport Assis Professionnalisé (TAP) ayant basculé vers le Véhicule Particulier + (VP) depuis la mise en oeuvre de MRS +

    +

    + ** Différence entre le coût théorique d'un TAP et le montant pris en charge au titre du VP pour les + assurés ayant basculés. +

    +

    + *** Assuré ayant réalisé pour la première fois une demande de remboursement sur la période +

    +
    diff --git a/src/mrs/tests/response_fixtures/SuperviseurCrawlTest.test_crawl/admin/statdate__gte=01%2F05%2F2018&date__lte=31%2F05%2F2018&caisse=1.metadata b/src/mrs/tests/response_fixtures/SuperviseurCrawlTest.test_crawl/admin/statdate__gte=01%2F05%2F2018&date__lte=31%2F05%2F2018&caisse=1.metadata index 57e70bdf..95ef274b 100644 --- a/src/mrs/tests/response_fixtures/SuperviseurCrawlTest.test_crawl/admin/statdate__gte=01%2F05%2F2018&date__lte=31%2F05%2F2018&caisse=1.metadata +++ b/src/mrs/tests/response_fixtures/SuperviseurCrawlTest.test_crawl/admin/statdate__gte=01%2F05%2F2018&date__lte=31%2F05%2F2018&caisse=1.metadata @@ -1,4 +1,4 @@ { - "query_count": 17, + "query_count": 12, "status_code": 200 } \ No newline at end of file diff --git a/src/mrs/tests/test_redirects.py b/src/mrs/tests/test_redirects.py index 494687f8..bfe682e8 100644 --- a/src/mrs/tests/test_redirects.py +++ b/src/mrs/tests/test_redirects.py @@ -6,10 +6,3 @@ def test_demande_redirect(client): r = client.get('/mrsrequest/wizard/') assert r.status_code == 301 assert r['Location'] == '/demande' - - -@pytest.mark.django_db -def test_stats(client): - r = client.get('/stats/') - assert r.status_code == 301 - assert r['Location'] == '/stats' diff --git a/src/mrs/urls.py b/src/mrs/urls.py index 661210a6..33ee0b70 100644 --- a/src/mrs/urls.py +++ b/src/mrs/urls.py @@ -2,7 +2,6 @@ from django.conf import settings from django.contrib import admin -from django.views.decorators.cache import cache_page from django.urls import include, path from contact.views import ContactView @@ -69,13 +68,6 @@ )), path('explorer/', include('explorer.urls')), path('captcha/', include('captcha.urls')), - path('stats/', views.generic.RedirectView.as_view( - url='/stats', permanent=True)), - path( - 'stats', - cache_page(60 * 24)(views.StatisticsView.as_view()), - name='statistics' - ), path('mrsrequest/', include('mrsrequest.urls', namespace='mrsrequest')), path('institution/', include('institution.urls', namespace='institution')), path('oldadmin/', admin.site.urls), diff --git a/src/mrs/views.py b/src/mrs/views.py index 1964fca4..d64da349 100644 --- a/src/mrs/views.py +++ b/src/mrs/views.py @@ -1,18 +1,12 @@ -import pytz - from crudlfap import shortcuts as crudlfap -from django import forms from django import http -from django.conf import settings -from django.contrib.staticfiles import finders from django.db import models +from django.contrib.staticfiles import finders from django.template.loader import render_to_string from django.urls import reverse -from django.utils import timezone from django.views import generic -from caisse.models import Caisse from mrsrequest.models import MRSRequest from person.models import Person @@ -92,63 +86,6 @@ class FaqView(generic.TemplateView): template_name = 'faq.html' -class StatisticsView(crudlfap.Factory, generic.TemplateView): - template_name = 'statistics.html' - - class Form(forms.Form): - caisse = forms.ModelChoiceField( - Caisse.objects.filter(active=True), - ) - - def get_form(self): - if self.request.GET.get('caisse', None): - self.form = self.Form(self.request.GET) - else: - self.form = self.Form() - - def qs_form_filter(self, qs): - if self.form.is_valid() and self.form.cleaned_data.get('caisse', None): - return qs.filter(caisse=self.form.cleaned_data['caisse']) - return qs - - def get_mrsrequests(self): - return self.qs_form_filter(MRSRequest.objects.all()) - - def get_mrsrequests_processed(self): - return self.mrsrequests.processed().count() or 0 - - def get_average_payment_delay(self): - return '{:0.2f}'.format( - self.mrsrequests.aggregate( - result=models.Avg('delay') - )['result'] or 0 - ).replace('.', ',') - - def get_insured_shifts(self): - return self.mrsrequests.filter(insured__shifted=True).count() - - def get_shifted_insured_count(self): - return Person.objects.filter( - shifted=True, - mrsrequest__in=self.mrsrequests, - ).distinct().count() - - def get_insured_count(self): - return Person.objects.filter( - mrsrequest__in=self.mrsrequests - ).distinct().count() - - def get_savings(self): - return self.mrsrequests.aggregate( - result=models.Sum('saving') - )['result'] or 0 - - def get_now(self): - return timezone.now().astimezone( - pytz.timezone(settings.TIME_ZONE) - ).strftime('%d/%m/%Y %H:%M:%S') - - class StaticView(generic.View): path = None content_type = None diff --git a/src/mrsrequest/models.py b/src/mrsrequest/models.py index 2d8b7b9f..8fc733fd 100644 --- a/src/mrsrequest/models.py +++ b/src/mrsrequest/models.py @@ -244,7 +244,8 @@ def created(self, date__gte=None, date__lte=None, datetime__gte=None, - datetime__lte=None): + datetime__lte=None, + caisse=None): if date: date__gte = date @@ -256,6 +257,12 @@ def created(self, datetime__lte = datetime_max(date__lte) qs = self + + if caisse: + qs = qs.filter( + caisse=caisse + ) + if datetime__gte: qs = qs.filter(creation_datetime__gte=datetime__gte) if datetime__lte: diff --git a/src/mrsstat/crudlfap.py b/src/mrsstat/crudlfap.py index 41c978c1..17a65b13 100644 --- a/src/mrsstat/crudlfap.py +++ b/src/mrsstat/crudlfap.py @@ -1,5 +1,4 @@ import datetime -import json import urllib.parse from crudlfap import shortcuts as crudlfap @@ -10,28 +9,18 @@ import django_filters import material +from django.db.models import Count +from mrsrequest.models import MRSRequest from person.models import Person from .models import Stat class StatListView(crudlfap.ListView): - material_icon = 'insert_chart' - title_menu = 'quotidiennes' - title_link = 'Graphique de statistiques quotidiennes' - - keys = [ - 'date', - 'mrsrequest_count_new', - 'mrsrequest_count_inprogress', - 'mrsrequest_count_validated', - 'mrsrequest_count_rejected', - 'mrsrequest_count_conflicted', - 'mrsrequest_count_conflicting', - 'mrsrequest_count_resolved', - 'insured_shifts', - ] + material_icon = 'show_chart' + title_menu = 'suivi des indicateurs' + title_link = 'Suivi des indicateurs' date_args = [ 'date__gte', @@ -40,12 +29,10 @@ class StatListView(crudlfap.ListView): filter_fields = [ 'caisse', - 'institution', ] filterset_form_layout = material.Row( 'caisse', - 'institution', *date_args ) @@ -134,11 +121,6 @@ def get_mrsrequest_count(self, arg): def get_mrsrequests_by_shifted_insured_count(self): return self.mrsrequests.filter(insured__shifted=True).count() - def get_savings(self): - return self.object_list.aggregate( - result=models.Sum('savings') - )['result'] - def get_insured_shifts(self): return self.object_list.aggregate( result=models.Sum('insured_shifts') @@ -158,13 +140,99 @@ def get_insured_count_replied(self): mrsrequest__in=mrsrequests ).distinct().count() + def get_insured_count(self): + mrsrequests = self.mrsrequests.created( + **{ + k: v + for k, v in self.filterset.form.cleaned_data.items() + if k.startswith('date_') + }, + caisse=self.filterset.form.cleaned_data.get('caisse') + ) + return Person.objects.filter( + mrsrequest__in=mrsrequests + ).distinct().count() + + def get_shifted_insured_count(self): + caisse_set = self.filterset.form.cleaned_data.get('caisse') + if caisse_set: + mrsrequests = self.mrsrequests.filter( + caisse=caisse_set + ) + else: + mrsrequests = self.mrsrequests + return Person.objects.filter( + shifted=True, + mrsrequest__in=mrsrequests + ).distinct().count() + + def get_mrsrequests_processed(self): + mrsrequests = self.mrsrequests.created( + **{ + k: v + for k, v in self.filterset.form.cleaned_data.items() + if k.startswith('date_') + }, + caisse=self.filterset.form.cleaned_data.get('caisse') + ).filter( + status__in=( + MRSRequest.STATUS_VALIDATED, + MRSRequest.STATUS_REJECTED, + ), + ) + return mrsrequests.distinct().count() + + def get_average_payment_delay(self): + mrsrequests = self.mrsrequests.created( + **{ + k: v + for k, v in self.filterset.form.cleaned_data.items() + if k.startswith('date_') + }, + caisse=self.filterset.form.cleaned_data.get('caisse') + ) + return '{:0.2f}'.format( + mrsrequests.aggregate( + result=models.Avg('delay') + )['result'] or 0 + ).replace('.', ',') + + def get_savings(self): + mrsrequests = self.mrsrequests.created( + **{ + k: v + for k, v in self.filterset.form.cleaned_data.items() + if k.startswith('date_') + }, + caisse=self.filterset.form.cleaned_data.get('caisse') + ) + return mrsrequests.aggregate( + result=models.Sum('saving') + )['result'] + + def get_primo_users(self): + mrsrequests = self.mrsrequests.created( + **{ + k: v + for k, v in self.filterset.form.cleaned_data.items() + if k.startswith('date_') + }, + caisse=self.filterset.form.cleaned_data.get('caisse') + ) + return Person.objects.annotate( + requestscount=Count('mrsrequest') + ).filter( + requestscount=1, + mrsrequest__in=mrsrequests + ).distinct().count() + def get_mrsrequests(self): # the default controller's list view will return objects user can see controller = crudlfap.site['mrsrequest.MRSRequest'] self.mrsrequests = controller['list']( request=self.request ).get_objects() - for i in ('caisse', 'institution'): + for i in ('caisse'): if self.filterset.form.cleaned_data.get(i, None): self.mrsrequests = self.mrsrequests.filter(**{ i: self.filterset_form_cleaned_data[i] @@ -173,75 +241,14 @@ def get_mrsrequests(self): def get_object_list(self): qs = super().get_object_list() - self.object_list = self.filter_caisse_institution(qs) + self.object_list = self.filter_caisse(qs) return self.object_list - def filter_caisse_institution(self, qs): + def filter_caisse(self, qs): if not self.request.GET.get('caisse'): qs = qs.filter(caisse=None) - if not self.request.GET.get('institution'): - qs = qs.filter(institution=None) return qs - def get_chart_json(self): - columns = [ - [ - 'x' - if k == 'date' - else self.model._meta.get_field(k).verbose_name - ] - for k in self.keys - ] - - rows = self.object_list.values_list(*self.keys) - for row in rows: - for i, value in enumerate(row): - if isinstance(value, datetime.date): - columns[i].append(value.strftime('%Y-%m-%d')) - else: - columns[i].append(value) - - return json.dumps(dict( - bindto='#chart', - data=dict( - x='x', - columns=columns, - ), - axis=dict( - x=dict( - type='timeseries', - tick=dict( - format='%d/%m/%Y', - ) - ), - y=dict( - min=0, - padding=dict(bottom=0), - ), - ), - point=dict( - show=len(rows) < 32, - ) - )) - - -class StatListTotalsView(StatListView): - urlname = 'total' - urlpath = 'total' - template_name = 'mrsstat/stat_list.html' - material_icon = 'show_chart' - title_menu = 'cumulatives' - title_link = 'Graphique de statistiques cumulatives' - - keys = [ - 'date', - 'mrsrequest_total_new', - 'mrsrequest_total_inprogress', - 'mrsrequest_total_validated', - 'mrsrequest_total_rejected', - 'insured_shifts_total', - ] - class StatImportExport(crudlfap.ModelView): material_icon = 'compare_arrows' @@ -256,7 +263,6 @@ class StatRouter(crudlfap.Router): views = [ StatImportExport, StatListView, - StatListTotalsView, ] def get_queryset(self, view): diff --git a/src/mrsstat/jinja2/mrsstat/stat_list.html b/src/mrsstat/jinja2/mrsstat/stat_list.html index 59415e31..86ede213 100644 --- a/src/mrsstat/jinja2/mrsstat/stat_list.html +++ b/src/mrsstat/jinja2/mrsstat/stat_list.html @@ -8,49 +8,41 @@ {% endif %}
    - -
    -
    -

    - Moyenne des délais quotidiens de traitement: {% if view.validation_average_delay %}{{ "%.2f"|format(view.validation_average_delay) }} jours{% else %}?{% endif %} -

    -
    -
    +

    - Nombre de demandes soumises: {{ view.get_mrsrequest_count('new') or 0 }} + Nombre d'assurés avec un dossier durant la période: {{ view.insured_count or 0 }}

    - Nombre de demandes en cours: {{ view.get_mrsrequest_count('inprogress') or 0 }} + Nombre d'assurés ayant basculé vers le véhicule personnel*: {{ view.shifted_insured_count or 0 }}

    - Nombre de demandes validées: {{ view.get_mrsrequest_count('validated') or 0 }} + Nombre de demandes traitées (Validées/Rejetées): {{ view.mrsrequests_processed or 0 }}

    - Nombre de demandes rejetées: {{ view.get_mrsrequest_count('rejected') or 0 }} + Délai moyen de traitement en jours: {{ view.average_payment_delay or 0 }}

    -
    -

    - Econnomies réalisées: {{ '%.2f'|format(view.savings or 0) }}€ + Economies réalisées**: {{ '%.2f'|format(view.savings or 0) }}€

    - Nombre d'assurés ayant basculés pendant la période: {{ view.insured_shifts or 0 }} -

    -

    - Nombre d'assurés avec un dossier traité durant la période: {{ view.insured_count_replied or 0 }} -

    -

    - Nombre de dossiers traités durant la période d'assurés ayant basculés même en dehors de la période: {{ view.mrsrequests_by_shifted_insured_count or 0 }} + Nombre de primo utilisateurs***: {{ view.primo_users }}

    -
    -
    +
    +

    + * Assuré utilisateur de Transport Assis Professionnalisé (TAP) ayant basculé vers le Véhicule Particulier + (VP) depuis la mise en oeuvre de MRS +

    +

    + ** Différence entre le coût théorique d'un TAP et le montant pris en charge au titre du VP pour les + assurés ayant basculés. +

    +

    + *** Assuré ayant réalisé pour la première fois une demande de remboursement sur la période +

    +
    {% endblock %}