---
# System prepended metadata

title: Système de facturation

---

# Système de facturation

## Sommaire

- [Introduction](#introduction)
- [Motivation](#motivation)
- [Guide-level explanation](#guide-level-explanation)
- [Reference-level explanation](#reference-level-explanation)
- [Justification et alternative](#justification-et-alternatives)
- [Impacts si la situation reste ainsi](#impacts-si-la-situation-reste-ainsi)
- [Etat de l'art](#etat-de-l'art)
- [Questions non résolues](#questions-non-resolues)
- [Possibilités futures](#possibilites-futures)

## Introduction

Il est nécessaire d'avoir un module de facturation afin d'assister les organisations de notre application **Molink** dans ce processus.

## Motivation

Les raisons qui nous poussent à développer le module de facturation sont de permettre aux clients de : 
- Générer et exporter des factures depuis Molink vers les services internes des organisations.
- Visualiser et gérer les factures générées.
- Automatiser cette gestion de factures via l'API Molink.

## Guide-level explanation

### Fonctionnalités

Les raisons qui ont poussé la rédaction du document est de simplifier et d'automatiser tous le processus de facturation des organisations aux déclarants, voici les étapes fonctionnelles visées : 

- **Générer une facture**
    Les organisations pourront, pour une période donnée ainsi qu'un déclarant affilié, générer une facture et l'exporter sous multi-format (PDF, JSON, XML)
- **Visualiser les factures**
    Les organisations pourront visualiser leurs factures ainsi que leur statut afin de pouvoir les administrer sur une seule interface.
- **Automatiser le système de factures**
    Notre API Molink permettra aux organisations d'automatiser toute cette gestion de facture (création, visualisation, envoi ...)
    
### Structure du système de facture

Une facture est composée de :
- Une organisation (envoyeur)
- Un déclarant (receveur)
- Une période donnée
- Des avis de décès 
    - Détailler avec l'existant
    
## Reference-level explanation

### Existant Single-Tenant

-- A remplir par Alexandre

### Format des données

Voici le format d'une facture de la table `invoices`
```json
{
    "id": "uuidv7"
    "organization__id": "organization_fk"
    "operator__id": "operator_fk"
    "start_date": "timestamp"
    "end_date": "timestamp"
    "status": "pending" | "created" | "failed"
    "format": "pdf" | "xml" | "json"
    "url": "string" | null,
}
```

### Génération de facture

Pour générer une facture, une organization va faire un appel d'API ou sélectionner dans son interface Molink :
- `operator_id`: L'identifiant d'un déclarant
- `start_date`: La date de départ d'une période au format dd/mm/YYYY
- `end_date`: La date de fin d'une période au format dd/mm/YYYY
- `format`: Le format demandé de la facture

Une fois la génération demandée, une ligne va se créer dans la table `invoices` au `status = pending` et `url = null`

Un job asynchrone `GenerateInvoice` va alors être lancé qui aura comme responsabilité de :
- Récupérer les `commandes` effectuées pour la période et le déclarant donnés 
- Formatter ces données sous le `format` demandé 
- Stocker ce fichier dans *Amazon AWS*
- Mettre à jour la ligne `invoice` pour passer le `status` à "created" avec l'`url` qui pointera sur le fichier AWS

Pour gérer ces jobs, une solution de Message Queuing (existant ?) sera mis en place : 
- Mettre en place un système de retry pour lancer `3` fois le job si nécessaire
- Si le message n'as pas été consommé : 
    - Il sera mis dans une Dead-Letter Queue, ce qui causera une alerte sur notre système de monitoring
    - Le status de l'`invoice` passera en "failed"

### Export de factures

Pour ce qui est de l'export des factures, celle-ci se fera via appel d'API ou sur la page de visualisation des factures : 
- Une organisation pourra voir ses factures générées, la période donnée, le format demandé, le déclarant associé ainsi que son statut
- Si la facture est créée, il pourra télécharger le fichier

### API Molink de factures

Pour automatiser ce système et permettre à nos organisations d'intégrer Molink à leurs solutions de factures actuelles, ces ressources seront accessibles via appel d'API sur ces routes suivantes : 

```
POST /v2/invoices
    :operator_id
    :start_date
    :end_date
    :format
GET /v2/invoices
    ?filters[status]
    ?filters[operator_id]
    ?filters[between_date]
GET /v2/invoices/{id}/download
```
## Justification et alternatives

Dans notre souhait de fournir un service complet de multi-diffusion de faire-part, permettant aux organisations et déclarants d'internaliser l'intégralité de leur processus métier via Molink, il est nécessaire de comprendre dans ce service la génération de factures.

### Autres conceptions envisagées

#### Transmission de d'informations de facturation simple

Alors que nos organisations auraient déjà un système de facturation et de communication en interne, il est possible d'utiliser la plateforme Molink pour simplement : 
- Résumer à une organisation ce qu'un déclarant lui doit pour une période donnée

##### Avantages

- Facile à implémenter

##### Inconvénients

- Nécessite aux organisations de remplir manuellement leurs factures

## Impacts si la situation reste ainsi

Le système de facturation actuel ne prend pas en charge le multi-tenant.

L'algorithme actuel n'est pas permissif pour aller dans le sens d'un Sass et doit être revu intégralement.

## Etat de l'art

Il existe déjà des modules de facturation très performants connus : 

### Stripe

Stripe permet de générer des factures automatisés pour leur différents clients avec envoi automatique de celles-ci 
aux clients finaux de l'entreprise.

## Questions non résolues

- Quel sera le canal de communication facture entre l'organisation et ses déclarants ? 
- Est-ce Molink pourra faire office d'intermédiaire afin que les déclarants visualisent leurs coûts et factures ?

## Possibilités futures

### Système de template

Les organisations pourront créer leurs propres template de facture personnalisés avec leurs informations

Un template de facture est composé de : 
- Un bloc contenant les informations de l'organisation (envoyeur)
- Un bloc contenant les informations du déclarant (receveur)
- Un bloc de résumé de la facture (titre, numéro de facture)
- Un bloc de détails de la facture (lignes de commande)
- Un bloc de références de la facture (TVA, date d'émission, jours avant règlement)

### Export de factures multi-support

Dans un premier temps, une facture sera exportée en HTTP, que ce soit via l'interface MOLINK ou lors d'un appel d'API.

Il est possible que l'ajout d'un multi-support d'envoi SSH / FTP soit nécessaire par la suite.