# Cadastro de Fórmulas

O cadastro de fórmulas surgiu originalmente para o módulo de produção do Gestor. O objetivo é descrever os ingredientes necessários para se produzir um novo item. Consumindo o estoque dos ingredientes, e aumentando o estoque do produto final.

O resultado da execução de uma fórmula cria um item na tabela `ITEM` e armazena as respostas e ingredientes utilizados na tabela `ITEM_COMPOSICAO`.

### Tabelas envolvidas

* `FORMULA` - Armazena o título e código de uma fórmula. Pode conter um ITEM_TIPO que originalmente nas tabelas chamamos de _Família da Fórmula_;
* `FORMULA_COMPOSICAO` - Representa a lista dos ingredientes de uma fórmula. O campo TIPO define o tipo de ingrediente que pode ser utilizado. Veja a `CFG_STATUS.FORMULA_NODO.TIPO`;
* `FORMULA_VERSAO` - Agrupa os ingredientes em versões, para diferenciar as diversas gerações que uma fórmula teve com o passar do tempo. É um controle automático, toda a vez que uma fórmula é **ativada**;
* `FORMULA_TIPO_TOKEN` - É um cadastro de perguntas que podem ser usadas como ingredientes. Suas respostas podem ser usadas como origem de informação para outros ingredientes. Não possui um vínculo direto com fórmula ou tipo de fórmula, pois, o objetivo é que possa ser compartilhado entre fórmulas semelhantes;
* `FORMULA_TOKEN_RESPOSTA` - É uma lista de respostas fixa para uma pergunta cadastrada na tabela `FORMULA_TIPO_TOKEN`;
* `ITEM_TIPO` - Tabela do cadastro de itens/estoque que possui a lista de tipos de itens;
* `ITEM` - É a tabela de itens do cadastro de itens/estoque (veja o manual específico);
* `ITEM_COMPOSICAO` - É a tabela onde armazenamos as respostas e a lista de ingredientes utilizados na execução da fórmula;

### Diagrama ER

```mermaid
erDiagram
    FORMULA ||--o{ FORMULA-VERSAO : ""
    FORMULA ||--o{ FORMULA-COMPOSICAO : ""
    FORMULA }o--o| ITEM-TIPO : ""
    FORMULA-COMPOSICAO }o--|| FORMULA-VERSAO : ""
    FORMULA-COMPOSICAO }o--|| FORMULA-TIPO-TOKEN : ""
    FORMULA-TIPO-TOKEN ||--o{ FORMULA-TOKEN-RESPOSTA : ""
    ITEM |o--o| FORMULA : "ITEM.ID_FORMULA_ORIGEM"
    ITEM ||--o{ ITEM-COMPOSICAO : ""
    ITEM-COMPOSICAO |o--o| FORMULA-COMPOSICAO : ""
```

## Ideias / To do / Refactoring

* Renomear a tabela `FORMULA_TIPO_TOKEN` para `PERGUNTA`;
* Renomear a tabela `FORMULA_TOKEN_RESPOSTA` para `RESPOSTA`;
* Corrigir a `CFG_STATUS.FORMULA_NODO.TIPO` para `CFG_STATUS.FORMULA_COMPOSICAO.TIPO`;
* Adicionar um `ID_FORMULA` na `FORMULA_TIPO_TOKEN` para criar perguntas exclusivas a uma fórmula;
