---
# System prepended metadata

title: QuestPair. List of scenarios for Mollie payments.
tags: [payments, questpair, dev-notes]

---

# QuestPair. List of scenarios for Mollie payments.

###### tags: `questpair`, `payments`, `dev-notes`

## Installation (First payment of the customer).

When payment is created for the customer that has no active mandates
stored at the service yet, instalment is created, meaning that the
returned payment would also provide a mandate data to be stored as
customer's current mandate.

- [color=#27c43e] Success. User receives the checkout link,
  completes a payment in time, payment successfully goes through.

  - [color=#27c43e] A mandate is established;
  - [color=#27c43e] Payment status changed to `complete`;

<br />

- [color=#27c43e] Expired. User receives the checkout link but doesn't
  manage to complete it in time. Mollie automatically creates a new
  payment for the customer. Customer manages to complete the newer
  payment.

  - [color=#27c43e] Webhook with `expired` is received;
  - [color=#27c43e] The previous payment received with status `expired`;
  - [color=#27c43e] Checkout link for the previous payment is removed
    from the payment. The link becomes unavailable (auto redirect);
  - [color=#27c43e] `PaymentPoll` jobs are removed for the `expired`
    payment;
  - [color=#27c43e] Associated billing is kept `scheduled`;

<br />

- [color=#27c43e] Checkout link used after expiration.

  - [color=#27c43e] Checkout page automatically redirects user back,
    not allowing to perform any action;
  - [color=#27c43e] When new payment is created, it goes the instalment
    way as supposed, new checkout link is generated for the customer;
    
<br />

> Test of the Failed installment is skipped. The reason is that a payment
goes the same route `PaymentController` -> `WebhookController` regardless
of is it an instalment or a regular payment.

> The **Failed** scenario is tested for the regular payment, it is working
as expected. All of the scenarios with a failed mandate are tested separately as well, which makes this scenario exceeding.

> In addition to that, the inability to fail an instalment at the Mollie's
sandbox related to inability to fail an at a production according to JW
comments.

- [color=#9f9f9f] Failed. User received a checkout url, but doesn't
  manage to complete it due to account issues (insufficient funds e.t.c)

  - [color=#9f9f9f] The payment marked as `failed`;
  - [color=#9f9f9f] A mandate is not established;
  - [color=#9f9f9f] Related jobs are removed, no automatic measures
    applied to the payment and the related purpose;
  - [color=#27c43e] Notification is sent about the failed payment;

<br />

## Recurrent payment.

When the payed period of the subscription comes to an end, the new
payment is created at the Core. After it is created, service is called
to create a new payment at the Mollie.

- [color=#27c43e] Success. Recurrent payment successfully completes.

  - [color=#27c43e] Payment status changed to `complete`, according
    billing is updated;
    
<br />
    
- [color=#27c43e] Failed.

    - [color=#27c43e] Payment status changed to `failed`, according
      billing is kept `scheduled`. Notification is fired, no jobs
      related to the payment is initiated;
    - [color=#27c43e] Next payment for the customer goes the instalment
      way if mandate is invalidated or the regular way, if mandate is ok.
      According to a failure reason, new mandate can be issued manually
      via **Mandate Replacement**.

<br />

## Forced mandate replacement.

When user need to change his payment credentials, we manually call a
mandate re-initialization at the service resulting in creation of an
instalment.

- [color=#27c43e] Success. Instalment is created, checkout is completed
  by the customer;
  
  - [color=#27c43e] The last mandate is removed from service DB;
  - [color=#27c43e] The new mandate is received with payment and set
    as current for the customer;
  - [color=#27c43e] Payment successfully goes through and returned with
    status `complete`;
  - [color=#e8a127] Billings are not resolved by automatically when
    subscription is a purpose. There are two way to handle that:
    - [color=#27c43e] To update a billing after payment is received by
      attaching a payment and calling `complete()`;
    - [color=#9f9f9f] To attach payment to the billing before calling
      `initPayments` on the provider instance.
  - [color=#27c43e] Following recurrent payments are issued with the new
    mandate and processed normally.

<br />

## Mandate failure / Mandate revoke.

- [color=#27c43e] When service tries to update a mandate before making
  a new payment, it happens to be unavailable or comes with status
  `inactive`.

  - [color=#27c43e] The payment goes the Instalment way, instead of the
    regular payment, creating a new mandate;

<br />
<br />
<br />
<br />