# SmartCodes

## Introduction

Cn285 permet la personnalisation des traitements applicables aux champs d'un objet ou à un objet lui même, à travers l'insertion de code directement via l'interface utilisateur. Ces traitements sont applicables via des **SmartCodes**.

{% hint style="danger" %}
Certaines personnalisations / mise en place de SmartCode nécessitent une compétence technique dans le langage Python.
{% endhint %}

Il existe différents type de SmartCode:

* Prorator
* LifeCycle Callback
* Event

## Configuration

Les SmartCodes sont accessibles et configurables depuis le menu **Cn285 / Configuration / Smart Codes.**

<figure><img src="https://823951457-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MjVNWpKJ_CHCQYQ3A5a%2Fuploads%2FPi2IXWxrxLyWgsiW2fsq%2Fimage.png?alt=media&#x26;token=08712b56-287d-4465-9f5a-2ed0e10e8980" alt=""><figcaption><p>Création d'un nouveau SmartCode</p></figcaption></figure>

Différents champs sont accessibles sur ce SmartCode:

* **Nom**: Le nom du SmartCode.
* **Description**: Une description permettant d'indiquer ce que réalise ce SmartCode.
* **Key**: Une clé générée en fonction du nom. Cette clé permet d'identifier le SmartCode. Elle peut être personnalisée.
* **SmartCode Type**: Le type de SmartCode souhaitée.
* **Python Code Type**: Le type de code du SmartCode. Il existe deux types de code pour les SmartCodes:
  * **Internal Code:** Le code utilisé par le SmartCode est une méthode standard livrée par Cn285. Celle-ci ne peut être personnalisée. Lorsque cette option est sélectionnée, un nouveau champ "**Internal Method**" apparait sur le formulaire et permet de sélectionner la méthode standard à utilisé pour ce SmartCode.&#x20;
  * **Inline:** Permet de personnaliser le SmartCode via du code Python directement depuis l'interface. Lorsque cette option est sélectionnée, un nouvel onglet "**Inline Code**" apparaît et permet d'écrire du code Python.

{% hint style="info" %}
Chaque SmartCode possède un exemple de personnalisation dans l'onglet "Inline Code".
{% endhint %}

Les SmartCodes se définissent soit au niveau du ContractItem, soit au niveau du produit.

## SmartCode Type

Comme décrit précédemment, il existe plusieurs type de SmartCode.

### SmartCode "Prorator"

<figure><img src="https://823951457-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MjVNWpKJ_CHCQYQ3A5a%2Fuploads%2F6yzN5g0keFx0dS9reTXZ%2Fimage.png?alt=media&#x26;token=e9a50e51-0294-47d5-8cd5-36b9ad1a75c8" alt=""><figcaption><p>Exemple de SmartCode "Prorator"</p></figcaption></figure>

Le SmartCode "Prorator" permet de proratiser les différents périodes du ContractItem. Il existe 3 SmartCode "Prorator":

* **Prorator First Period**: Permet de proratiser la premiere période du ContractItem.
* **Prorator Intermediate Period**: Permet de proratiser les différentes périodes intermédiaires du ContractItem.
* **Prorator Last Period**: Permet de proratiser la dernière période du ContractItem.

Cn285 intègre des fonctionnalités standards pour ces 3 SmartCode "Prorator":

* **Nb Days**: Retourne le nombre de jours dans la période.
* **Temporis**: Calcul la quantité en fonction du nombre de jours présents dans la période. Fonctionne uniquement sur de la facturation alignée (mensuel, trimestriel, ..).
* **Whole Period**: Retourne toute la période si au moins un jour est présent.
* **Void Period**: Annule la période si au moins un jour est présent.

{% hint style="info" %}
Chaque SmartCode "Prorator" possède les fonctionnalités standards.
{% endhint %}

### SmartCode "LifeCycle Callback"

<figure><img src="https://823951457-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MjVNWpKJ_CHCQYQ3A5a%2Fuploads%2FEnU0iZufOSBiZSyqaCVA%2Fimage.png?alt=media&#x26;token=12cbd862-f6bb-41ad-b48e-149f51abc805" alt=""><figcaption><p>Exemple de SmartCode "LifeCycle"</p></figcaption></figure>

Le SmartCode "LifeCycle Callback" est appelé  à différents étapes de la vie d'un **ContractItem** et permet de réaliser différentes actions au cours de la vie d'un ContractItem.

* **beforefirstrenewal**: Le SmartCode est appelé avant le premier renouvellement.
* **beforeotherrenewal**: Le SmartCode est appelé avant les renouvellements intermédiaires.
* **beforelastrenewal**: Le SmartCode est appelé avant le dernier renouvellement de la période.
* **afterfinished**: Le SmartCode est appelé après la fin "naturel" du ContractItem.
* **beforeterminate**: Le SmartCode est appelé avant la résiliation du ContractItem.&#x20;
* **afterterminate**: Le SmartCode est appelé après la résiliation du ContractItem.

Le SmartCode "LifeCycle Callback" se définit au niveau des [contract-items](https://docs.cn285.app/cn285-documentation/menu-contracts/contract-items "mention"), dans l'onglet "API / Custom" du formulaire ou au niveau des [products](https://docs.cn285.app/cn285-documentation/menu-products/products "mention") dans l'onglet "Cn285" du formulaire.

### :hammer\_pick: SmartCode "Event"

<figure><img src="https://823951457-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MjVNWpKJ_CHCQYQ3A5a%2Fuploads%2F24CGluRo9O8TPD6teEiQ%2Fimage.png?alt=media&#x26;token=1d045f5d-50d3-45f2-a0ed-73d6af9aec53" alt=""><figcaption><p>Exemple de SmartCode "Event"</p></figcaption></figure>

:pick:Le SmartCode "Event" permet de réaliser des traitements sur des [events](https://docs.cn285.app/cn285-documentation/menu-objects/events "mention"). Ce SmartCode est spécifique puisqu'il n'est pas défini au niveau des ContractItems / Items mais intervient dans le traitement de l'évènement.\
Un évènement, avant d'être traiter par Cn285, est insérer sous forme de [message](https://docs.cn285.app/cn285-documentation/menu-qs/message "mention"). Ce message est ensuite traité par un **Message Processor**. Ce **Message Processor** peut être associé à un SmartCode "Event' si celui-ci possède la même clé que son **Selector.** Grâce à l'association entre le **Message Processor** et le SmartCode, il est alors possible de réaliser des traitements sur cet évènement.
