# 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="/files/Y6ady35cYI8FO05k0ae8" 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="/files/mJ8tD9CSdq0cwKz8DWgw" 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="/files/aCraV11Vg12tZJDnx0n8" 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](/cn285-documentation/menu-contracts/contract-items.md), dans l'onglet "API / Custom" du formulaire ou au niveau des [Products](/cn285-documentation/menu-products/products.md) dans l'onglet "Cn285" du formulaire.

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

<figure><img src="/files/Pj2wZwToWh0UdlZtuRlO" alt=""><figcaption><p>Exemple de SmartCode "Event"</p></figcaption></figure>

:pick:Le SmartCode "Event" permet de réaliser des traitements sur des [Events](/cn285-documentation/menu-objects/events.md). 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](/cn285-documentation/menu-qs/message.md). 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.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.cn285.app/cn285-documentation/menu-configuration/smartcodes.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
