Exemple #1
0
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)