def update_subscription_from_transaction(subscription, sp_transaction): if subscription.status == Subscription.STATUS_TERMINATED: logger.error( f"La transaction Systempay {sp_transaction.pk} a été mise à jour alors que l'abonnement {subscription.pk} était annulé" ) return if sp_transaction.status == SystemPayTransaction.STATUS_COMPLETED: if subscription.status == Subscription.STATUS_CANCELED: # Peut arriver si nous annulons une souscription en attente, et que la personne la complète quand même. # Dans ce cas, il faut annuler la souscription côté SystemPay pour s'assurer qu'elle soit bien # correctement annulée. La souscription passera donc au du statut CANCELED au statut TERMINATED, puisqu'il y # aura bien eu complétion et création de la souscription systempay. # Il faut mettre son status temporairement à ACTIVE pour que 'terminate_subscription` ne lève pas une # exception. subscription.status = Subscription.STATUS_ACTIVE terminate_subscription(subscription) return complete_subscription(subscription) elif ( subscription.status == SystemPayTransaction.STATUS_WAITING and sp_transaction.status in SUBSCRIPTION_ERROR_STATUS_MAPPING ): subscription.status = SUBSCRIPTION_ERROR_STATUS_MAPPING[sp_transaction.status] subscription.save()
def check_payment_transaction_match_subscription(self, serializer, subscription): if subscription.person is None: # si la personne n'existe plus, il y a un problème, et on met fin à la souscription si elle est active if subscription.status == Subscription.STATUS_ACTIVE: subscriptions.terminate_subscription(subscription) logger.error( "Paiement automatique déclenché par SystemPay sur une transaction sans personne " "associée. Par sécurité, la subscription a été terminée.", extra={"request": self.request}, ) if (subscription.person is not None and subscription.person.id != serializer.validated_data["cust_id"]): logger.error( "Personne différente pour la souscription entre agir et system_pay", extra={"request": self.request}, ) if subscription.price != serializer.validated_data["amount"]: logger.error( "Le montant d'un paiement mensuel ne correspond pas à celui de la souscription", extra={"request": self.request}, ) if subscription.status != Subscription.STATUS_ACTIVE: logger.error( "Paiement sur une souscription non active", extra={"request": self.request}, )
def terminate_subscriptions(sender, instance, **kwargs): for subscription in instance.subscriptions.filter( status=Subscription.STATUS_ACTIVE ): # TODO: à faire dans une tâche Celery ? subscriptions.terminate_subscription(subscription) instance.subscriptions.filter(status=Subscription.STATUS_WAITING).update( status=Subscription.STATUS_ABANDONED )
def post(self, request, pk): subscription = self.get_object() terminate_subscription(subscription) messages.add_message( self.request, messages.SUCCESS, "Votre paiement automatique a bien été supprimé.", ) return redirect("view_payments")
def terminate_view(self, request, subscription_pk): try: subscription = Subscription.objects.get( pk=subscription_pk, status=Subscription.STATUS_ACTIVE) except Subscription.DoesNotExist: raise Http404() if request.method == "POST": terminate_subscription(subscription) return redirect("admin:payments_subscription_change", subscription_pk) context = { "title": "Désactiver le paiment récurent: %s" % escape(subscription_pk), "is_popup": True, "opts": self.model._meta, "subscription": subscription, "change": True, "add": False, "save_as": False, "show_save": True, "has_delete_permission": self.has_delete_permission(request, subscription), "has_add_permission": self.has_add_permission(request), "has_change_permission": self.has_change_permission(request, subscription), "has_view_permission": self.has_view_permission(request, subscription), "has_editable_inline_admin_formsets": False, } context.update(self.admin_site.each_context(request)) request.current_app = self.admin_site.name return TemplateResponse( request, "admin/subscriptions/terminate_subscription.html", context)