-
-
-
+
- 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 %}