models.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. from django.db import models
  2. from django.core.validators import MinValueValidator, MaxValueValidator
  3. from django.core.exceptions import ValidationError
  4. from django.core.urlresolvers import reverse
  5. class RecurringPayment(models.Model):
  6. def get_last_validated_update(self):
  7. for update in self.updates.all():
  8. if update.validated:
  9. return update
  10. get_last_validated_update.short_description = 'Paiement'
  11. def payment_type(self):
  12. if hasattr(self, 'adhesion'):
  13. return 'Adhésion'
  14. if hasattr(self, 'service'):
  15. return 'Service'
  16. payment_type.short_description = 'Type'
  17. @property
  18. def debtor(self):
  19. if hasattr(self, 'adhesion'):
  20. return self.adhesion
  21. if hasattr(self, 'service'):
  22. return self.service.adhesion
  23. def payment_object(self):
  24. return self.adhesion if hasattr(self, 'adhesion') else self.service
  25. def get_absolute_url(self):
  26. return reverse('admin:%s_%s_change' % (self._meta.app_label, self._meta.model_name), args=(self.pk,))
  27. @property
  28. def active(self):
  29. payment = self.get_last_validated_update()
  30. return payment is not None and payment.payment_method != PaymentUpdate.STOP
  31. @property
  32. def amount(self):
  33. payment = self.get_last_validated_update()
  34. if payment is not None and payment.payment_method != PaymentUpdate.STOP:
  35. return payment.amount
  36. else:
  37. return None
  38. class Meta:
  39. verbose_name = 'paiement récurrent'
  40. verbose_name_plural = 'paiements récurrents'
  41. def display(self):
  42. payment = self.get_last_validated_update()
  43. return str(payment) if payment else "pas de paiement"
  44. def __str__(self):
  45. if hasattr(self, 'adhesion'):
  46. return 'Cotisation adhérent %s' % self.adhesion
  47. if hasattr(self, 'service'):
  48. return 'Contribution au service %s' % self.service
  49. class PaymentUpdate(models.Model):
  50. STOP = 0
  51. FREE = 1
  52. DEBIT = 2
  53. TRANSFER = 3
  54. PAYMENT_CHOICES = (
  55. (DEBIT, 'Prélèvement'),
  56. (TRANSFER, 'Virement'),
  57. (FREE, 'Gratuit'),
  58. (STOP, 'Arrêt'),
  59. )
  60. created = models.DateTimeField(auto_now_add=True)
  61. payment = models.ForeignKey(RecurringPayment, related_name='updates')
  62. amount = models.DecimalField(max_digits=9, decimal_places=2, verbose_name='Montant')
  63. period = models.PositiveIntegerField(validators=[MinValueValidator(1), MaxValueValidator(12)],
  64. verbose_name='Période (mois)')
  65. payment_method = models.IntegerField(choices=PAYMENT_CHOICES, default=DEBIT,
  66. verbose_name='Méthode de paiement')
  67. start = models.DateTimeField(verbose_name='Date')
  68. month_day = models.PositiveIntegerField(validators=[MinValueValidator(1), MaxValueValidator(25)],
  69. verbose_name='Jour souhaité de prélèvement',
  70. null=True, blank=True)
  71. validated = models.BooleanField(default=False, verbose_name='Saisie bancaire effectuée')
  72. class Meta:
  73. verbose_name = 'paiement'
  74. ordering = ('-start',)
  75. def clean(self):
  76. super().clean()
  77. errors = {}
  78. if self.payment_method == PaymentUpdate.STOP and self.amount:
  79. errors.update({'amount': "Pour l’arrêt d’un paiement, le montant doit être nul."})
  80. if errors:
  81. raise ValidationError(errors)
  82. def period_verbose(self):
  83. if self.period == 0:
  84. return 'non récurrent'
  85. elif self.period == 1:
  86. return 'mensuel'
  87. elif self.period == 3:
  88. return 'trimestriel'
  89. elif self.period == 6:
  90. return 'biannuel'
  91. elif self.period == 12:
  92. return 'annuel'
  93. else:
  94. return '%d mois' % self.period
  95. def __str__(self):
  96. if self.payment_method == self.STOP:
  97. return 'paiement arrêté'
  98. if self.payment_method == self.FREE:
  99. return 'libre'
  100. s = str(self.amount) + '€'
  101. if self.period:
  102. if self.period == 1:
  103. s += '/mois'
  104. elif self.period == 12:
  105. s += '/an'
  106. else:
  107. s += '/%d mois' % self.period
  108. if self.payment_method == self.DEBIT:
  109. s += ' (prélèvement)'
  110. elif self.payment_method == self.TRANSFER:
  111. s += ' (virement)'
  112. return s