Comment définir un paramètre de Smart Structure

Prérequis

Afin de pouvoir suivre ce guide, il faut préalablement avoir créé un formulaire (Une Smart Structure).

Comment procéder ?

Recommandation

Si vous n'êtes pas familier avec les paramètres de Smart Structure et leur fonctionnement, il est fortement recommandé de lire la documentation associée diponible ici

La TVA s'applique sur tous les consommables vendu dans le restaurant. Nous allons donc gérer ça au travers des paramètres en deux étapes :

  1. Déclarer le paramètre associé à la TVA dans la Smart Structure concernée : src/vendor/<vendorName>/<moduleName>/Consommable/110-ConsommableParameters.xml



 
 
 
 
 




<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
    <smart:structure-configuration name="CONSOMMABLE">
        <smart:parameters>
            <smart:field-set name="consommable_param_f" type="frame" access="ReadWrite" label="TVA">
                <smart:field-double name="consommable_vat" access="ReadWrite" label="TVA"/>
            </smart:field-set>
        </smart:parameters>
        <smart:defaults />
    </smart:structure-configuration>
</smart:config>
  1. Les plats et boissons, sont des enfants de la Smart Structure Consommable. Pas besoin donc de déclarer le paramètre dans ces derniers car ils en héritent. Cependant nous allons tout de même lui donner une valeur initiale.

src/vendor/<vendorName>/<moduleName>/Plat/110-PlatParameters.xml





 
 
 



<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
    <smart:structure-configuration name="PLAT">
        <smart:parameters />
        <smart:defaults>
            <smart:initial field="consommable_vat" reset="true">10</smart:initial>
        </smart:defaults>
    </smart:structure-configuration>
</smart:config>

src/vendor/<vendorName>/<moduleName>/Boisson/110-BoissonParameters.xml





 
 
 



<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
    <smart:structure-configuration name="BOISSON">
        <smart:parameters />
        <smart:defaults>
            <smart:initial field="consommable_vat" reset="true">10</smart:initial>
        </smart:defaults>
    </smart:structure-configuration>
</smart:config>

Utiliser les paramètres pour effectuer un calcul

Lors de la création d'un Smart Element de type Consommable (Plat ou Boisson), en terme de prix il suffit de renseigner le prix TTC. La TVA étant maintenant définie par défaut au travers des paramètres, nous allons faire en sorte de calculer automatiquement le prix HT de ce consommable.

Rappel

Le calcul automatique d'une valeur de Smart Field a déjà été abordé dans ce chapitre que je vous conseille de lire si vous ne l'avez pas déjà fait.

  • Rendons-nous donc dans le fichier gérant le comportement des consommables afin de créer la méthode effectuant le calcul voulu : src/vendor/<vendorName>/<moduleName>/SmartStructures/Consommable/ConsommableBehavior.php


































 
 
 
 
 
 
 
 


<?php

namespace Cogip\Restauratec\SmartStructures\Consommable;

use Anakeen\Search\Filters\OneDocumentTitle;
use Anakeen\Search\Filters\OrOperator;
use Anakeen\Search\SearchElements;
use Anakeen\SmartHooks;
use SmartStructure\Fields\Consommable as ConsommableFields;
use SmartStructure\Fields\Menu as MenuFields;

class ConsommableBehavior extends \Anakeen\SmartElement
{
  public function registerHooks()
  {
    parent::registerHooks();
    $this->getHooks()->addListener(SmartHooks::PREDELETE, function () {
      // Cherche des menus ...
      $s = new SearchElements("MENU");
      // ... dont le nom du plat OU de la boisson correspond à l'élément cherchant à être supprimé
      $s->addFilter(
        new OrOperator(
          new OneDocumentTitle(MenuFields::menu_plat, $this->getAttributeValue(ConsommableFields::consommable_title)),
          new OneDocumentTitle(MenuFields::menu_boisson, $this->getAttributeValue(ConsommableFields::consommable_title))
        )
      );
      $results = $s->search()->getResults();
      if (count($results) > 0) {
        return "Ce consommable est présent dans un menu";
      }
      return "";
    });
  }

  public function calculatePriceExclVat(): float
  {
    $priceIncVat = $this->getAttributeValue(ConsommableFields::consommable_price_incl_vat);
    $vat = $this->getFamilyParameterValue(ConsommableFields::consommable_vat);
    $priceExclVat = $priceIncVat * (1 - $vat / 100);

    return $priceExclVat;
  }
}
  • Ensuite, dans le fichier de configuration de la Smart Structure concernée, la balise <smart:hooks> est à ajouter et compléter :













 
 
 
 
 




<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
    <smart:structure-configuration name="CONSOMMABLE" label="Consommable">
        <smart:icon file="consommable.png"/>
        <smart:class>Cogip\Restauratec\SmartStructures\Consommable\ConsommableBehavior</smart:class>
        <smart:fields reset="true">
            <smart:field-set name="consommable_frame" type="frame" access="ReadWrite" label="Informations relatives au consommable">
                <smart:field-text name="consommable_title" needed="true" is-title="true" access="ReadWrite" label="Titre"/>
                <smart:field-htmltext name="consommable_description" access="ReadWrite" label="Description"/>
                <smart:field-money name="consommable_price_excl_vat" access="Read" label="Prix HT (€)"/>
                <smart:field-money name="consommable_price_incl_vat" access="ReadWrite" label="Prix TTC (€)"/>
            </smart:field-set>
        </smart:fields>
        <smart:hooks>
            <smart:field-hook event="onPreRefresh" field="consommable_price_excl_vat">
                <smart:field-callable function="::calculatePriceExclVat"/>
            </smart:field-hook>
        </smart:hooks>
        <smart:defaults/>
    </smart:structure-configuration>
</smart:config>

Attention

Pensez à effectuer une réinstallation afin que l'application prenne en compte les modifications effectuées :

npx @anakeen/anakeen-cli deploy -c http://localhost:8080/control -s . -u admin -p anakeen --reinstall

Et ensuite ?

Comment créer un énuméré et l'associer à un Smart Field