Browse Source

ajout de la commande servicesstats

Élie Bouttier 8 years ago
parent
commit
64d2d10ffa

+ 0 - 0
services/management/__init__.py


+ 0 - 0
services/management/commands/__init__.py


+ 37 - 0
services/management/commands/servicesstats.py

@@ -0,0 +1,37 @@
+from django.core.management.base import BaseCommand, CommandError
+from django.db.models import DecimalField, F, Sum, Func, Q
+
+from decimal import Decimal
+
+from services.models import ServiceType
+
+
+class Command(BaseCommand):
+    help = 'Bénéfices des services'
+
+    def handle(self, *args, **options):
+        as_float_template = '%(function)s(%(expressions)s AS FLOAT)'
+        total_income = Decimal(0.0)
+        lines = []
+        for service_type in ServiceType.objects.all():
+            services = service_type.services
+            ntotal = services.count()
+            services = services.exclude(adherent=None)
+            nadh = services.count()
+            ninf = ntotal - nadh
+            services = services.exclude(Q(contribution__isnull=True) | Q(contribution__amount=0) | Q(contribution__period=0))
+            npay = services.count()
+            ngra = nadh - npay
+            amount = Func(F('contribution__amount'), function='CAST', template=as_float_template)
+            period = F('contribution__period')
+            output_field = DecimalField(max_digits=9, decimal_places=2)
+            income = services.aggregate(income=Sum(amount / period, output_field=output_field))['income'] or Decimal(0.0)
+            total_income += income
+            lines += [(str(service_type), npay, ninf, ngra, income,)]
+        self.stdout.write("%-16s%12s%12s%12s%12s%12s" % ('Service', 'npay', 'ninf', 'ngra', 'eur', 'pourcent'))
+        for service_type, npay, ninf, ngra, income in lines:
+            if total_income:
+                percent = income / total_income * 100
+            else:
+                percent = 0
+            self.stdout.write("%-16s%12d%12d%12d%12.2f%12.1f" % (service_type, npay, ninf, ngra, income, percent))

+ 26 - 0
services/migrations/0003_auto_20161231_0020.py

@@ -0,0 +1,26 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10.3 on 2016-12-30 23:20
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('services', '0002_auto_20161230_1837'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='service',
+            name='adherent',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='adhesions.Adherent', verbose_name='Adhérent'),
+        ),
+        migrations.AlterField(
+            model_name='service',
+            name='service_type',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='services', to='services.ServiceType', verbose_name='Type de service'),
+        ),
+    ]

+ 3 - 2
services/models.py

@@ -42,8 +42,9 @@ class ServiceType(models.Model):
 
 
 class Service(models.Model):
-    adherent = models.ForeignKey(Adherent, verbose_name='Adhérent')
-    service_type = models.ForeignKey(ServiceType, verbose_name='Type de service')
+    adherent = models.ForeignKey(Adherent, verbose_name='Adhérent', null=True, blank=True)
+    service_type = models.ForeignKey(ServiceType, related_name='services',
+                                     verbose_name='Type de service')
     notes = models.TextField(blank=True, default='')
     contribution = models.ForeignKey(Payment, null=True, blank=True,
                                      verbose_name='Cotisation')