> For the complete documentation index, see [llms.txt](https://guideadmin.margipro.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://guideadmin.margipro.com/parametres/prix-achat-ingredients.md).

# Prix d'achat centralisé des ingrédients

Cette page décrit les règles d'administration du prix matière utilisé par les recettes.

## Principe

Le prix d'achat d'un ingrédient peut provenir de deux sources :

| Source      | Stockage                                                           | Priorité                                       |
| ----------- | ------------------------------------------------------------------ | ---------------------------------------------- |
| **Recette** | `recipe_items.manual_cost_per_unit`                                | Prioritaire lorsqu'une valeur positive existe. |
| **Facture** | Dernière `invoice_lines.unit_price` associée au produit et au site | Utilisée lorsque le coût manuel est absent.    |

La centralisation ne repose pas sur un champ de prix global ajouté au produit. Elle synchronise les coûts manuels de toutes les lignes `recipe_items` qui référencent directement le même `product_id`.

Les sous-recettes ne sont pas réécrites artificiellement : leur coût se propage naturellement dans les recettes parentes par le calcul récursif existant.

## Actions depuis Paramètres → Ingrédients

Une saisie manuelle, sauvegardée par catégorie :

1. met à jour `manual_cost_per_unit` sur toutes les lignes de recettes directement liées à l'ingrédient ;
2. actualise la date de modification des recettes concernées ;
3. fait passer la source affichée à **Recette** ;
4. notifie la vue Ingrédients pour un rafraîchissement immédiat.

L'action **Relier au prix d'achat** met ces valeurs manuelles à `NULL`. Les recettes reprennent alors le dernier prix facturé du site sélectionné.

## Actions depuis l'éditeur de recette

À la sauvegarde d'une recette, MargiPro compare le prix manuel de chaque ingrédient avec sa valeur chargée initialement :

* une nouvelle valeur positive est propagée aux autres recettes utilisant le produit ;
* la suppression d'une valeur manuelle relie toutes les recettes concernées au dernier achat facturé ;
* une ligne inchangée ne déclenche aucune propagation ;
* l'ajout d'un ingrédient sans prix manuel ne supprime pas les prix existants.

Cette règle garantit qu'un même ingrédient n'affiche pas des prix manuels différents selon la recette.

## Validation d'une nouvelle facture

Après l'insertion réussie d'une nouvelle facture, MargiPro examine les produits associés aux lignes :

* seuls les produits avec `products.is_ingredient = TRUE` sont concernés ;
* la ligne doit posséder un prix strictement supérieur à zéro ;
* les coûts manuels des recettes liées sont remis à `NULL` ;
* la dernière ligne de facture devient la référence d'achat du site.

Ainsi, un prix manuel à **10 €** est remplacé partout par le nouvel achat à **15 €** dès que la facture correspondante est validée.

{% hint style="warning" %}
Une ligne non rapprochée d'un produit, un produit non marqué comme ingrédient ou un prix nul ne déclenche pas cette bascule.
{% endhint %}

## Correction d'une facture existante

Lorsqu'un administrateur corrige le prix d'une facture déjà enregistrée, la nouvelle valeur est propagée comme coût manuel aux recettes liées. La source devient alors **Recette** jusqu'à ce qu'une liaison au dernier achat soit rétablie ou qu'une nouvelle facture valide soit enregistrée.

## Portée et sécurité

Toutes les lectures et écritures sont réalisées côté client et restent soumises aux politiques RLS. La dernière facture est recherchée pour le site sélectionné, tandis que la propagation ne touche que les recettes visibles et modifiables par l'utilisateur courant.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

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

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://guideadmin.margipro.com/parametres/prix-achat-ingredients.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

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.
