Commit 557f2b43 authored by Hugo LEVY-FALK's avatar Hugo LEVY-FALK

Ajoute la possibilité de faire vérifier un form pour le paiement personnalisé.

parent 36741e21
...@@ -103,6 +103,7 @@ class Migration(migrations.Migration): ...@@ -103,6 +103,7 @@ class Migration(migrations.Migration):
('payment_credential', models.CharField(blank=True, default='', max_length=255, verbose_name='ComNpay VAD Number')), ('payment_credential', models.CharField(blank=True, default='', max_length=255, verbose_name='ComNpay VAD Number')),
('payment_pass', re2o.aes_field.AESEncryptedField(blank=True, max_length=255, null=True, verbose_name='ComNpay Secret Key')), ('payment_pass', re2o.aes_field.AESEncryptedField(blank=True, max_length=255, null=True, verbose_name='ComNpay Secret Key')),
('payment', models.OneToOneField(editable=False, on_delete=django.db.models.deletion.CASCADE, related_name='payment_method', to='cotisations.Paiement')), ('payment', models.OneToOneField(editable=False, on_delete=django.db.models.deletion.CASCADE, related_name='payment_method', to='cotisations.Paiement')),
('minimum_payment', models.DecimalField(decimal_places=2, default=1, help_text='The minimal amount of money you have to use when paying with ComNpay', max_digits=5, verbose_name='Minimum payment')),
], ],
bases=(cotisations.payment_methods.mixins.PaymentMethodMixin, models.Model), bases=(cotisations.payment_methods.mixins.PaymentMethodMixin, models.Model),
), ),
......
...@@ -155,7 +155,7 @@ class Facture(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model): ...@@ -155,7 +155,7 @@ class Facture(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model):
models.F('prix')*models.F('number'), models.F('prix')*models.F('number'),
output_field=models.FloatField() output_field=models.FloatField()
) )
)['total'] )['total'] or 0
def name(self): def name(self):
""" """
......
...@@ -95,3 +95,24 @@ class BalancePayment(PaymentMethodMixin, models.Model): ...@@ -95,3 +95,24 @@ class BalancePayment(PaymentMethodMixin, models.Model):
def alter_payment(self, payment): def alter_payment(self, payment):
"""Register the payment as a balance payment.""" """Register the payment as a balance payment."""
self.payment.is_balance = True self.payment.is_balance = True
def check_invoice(self, invoice_form):
"""Checks that a invoice meets the requirement to be paid with user
balance.
Args:
invoice_form: The invoice_form which is to be checked.
Returns:
True if the form is valid for this payment.
"""
user = invoice_form.instance.user
total_price = invoice_form.instance.prix_total()
if float(user.solde) - float(total_price) < self.minimum_balance:
invoice_form.add_error(
'paiement',
_("Your balance is too low for this operation.")
)
return False
return True
...@@ -53,6 +53,14 @@ class ComnpayPayment(PaymentMethodMixin, models.Model): ...@@ -53,6 +53,14 @@ class ComnpayPayment(PaymentMethodMixin, models.Model):
blank=True, blank=True,
verbose_name=_l("ComNpay Secret Key"), verbose_name=_l("ComNpay Secret Key"),
) )
minimum_payment = models.DecimalField(
verbose_name=_l("Minimum payment"),
help_text=_l("The minimal amount of money you have to use when paying"
" with ComNpay"),
max_digits=5,
decimal_places=2,
default=1,
)
def end_payment(self, invoice, request): def end_payment(self, invoice, request):
""" """
...@@ -86,3 +94,23 @@ class ComnpayPayment(PaymentMethodMixin, models.Model): ...@@ -86,3 +94,23 @@ class ComnpayPayment(PaymentMethodMixin, models.Model):
'amount': invoice.prix_total(), 'amount': invoice.prix_total(),
} }
return render(request, 'cotisations/payment.html', r) return render(request, 'cotisations/payment.html', r)
def check_invoice(self, invoice_form):
"""Checks that a invoice meets the requirement to be paid with ComNpay.
Args:
invoice_form: The invoice_form which is to be checked.
Returns:
True if the form is valid for ComNpay.
"""
if invoice_form.instance.prix_total() < self.minimum_payment:
invoice_form.add_error(
'paiement',
_('In order to pay your invoice with ComNpay'
', the price must be grater than {} €')
.format(self.minimum_payment)
)
return False
return True
...@@ -74,6 +74,7 @@ from .forms import ( ...@@ -74,6 +74,7 @@ from .forms import (
) )
from .tex import render_invoice from .tex import render_invoice
from .payment_methods.forms import payment_method_factory from .payment_methods.forms import payment_method_factory
from cotisations.utils import find_payment_method
@login_required @login_required
...@@ -118,8 +119,8 @@ def new_facture(request, user, userid): ...@@ -118,8 +119,8 @@ def new_facture(request, user, userid):
# Check if at leat one article has been selected # Check if at leat one article has been selected
if any(art.cleaned_data for art in articles): if any(art.cleaned_data for art in articles):
new_invoice_instance.save() new_invoice_instance.save()
# Building a purchase for each article sold # Building a purchase for each article sold
purchases = []
for art_item in articles: for art_item in articles:
if art_item.cleaned_data: if art_item.cleaned_data:
article = art_item.cleaned_data['article'] article = art_item.cleaned_data['article']
...@@ -132,17 +133,24 @@ def new_facture(request, user, userid): ...@@ -132,17 +133,24 @@ def new_facture(request, user, userid):
duration=article.duration, duration=article.duration,
number=quantity number=quantity
) )
new_purchase.save() purchases.append(new_purchase)
p = find_payment_method(new_invoice_instance.paiement)
return new_invoice_instance.paiement.end_payment( if hasattr(p, 'check_invoice'):
new_invoice_instance, accept = p.check_invoice(invoice_form)
request else:
accept = True
if accept:
return new_invoice_instance.paiement.end_payment(
new_invoice_instance,
request
)
else:
new_invoice_instance.delete()
else:
messages.error(
request,
_("You need to choose at least one article.")
) )
messages.error(
request,
_("You need to choose at least one article.")
)
p = Paiement.objects.filter(is_balance=True) p = Paiement.objects.filter(is_balance=True)
if len(p) and p[0].can_use_payment(request.user): if len(p) and p[0].can_use_payment(request.user):
balance = user.solde balance = user.solde
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment