ERP en LOGICIEL LIBRE dédié aux PME-PMI

           Devenez partenaire Principal ou Majeur de Neogia

ManageNumber


Contents

Gestion des nombres

L'affichage des nombres à virgules dans les formulaires pose plusieurs problème qui sont :

  • gérer leur affichage en fonction de la langue
  • quel est le nombre de virgule à afficher

Le premier problème implique l'utilisation du formattage des nombres avec la locale de l'utilisateur, la deuxième, l'utilisation d'un typage fonctionnel des nombres à afficher.

Le typage fonctionnel et déjà présent dans ofbizNeogia via le fichier de properties : arithmetic, utilisé notamment pour la gestion des BigDécimal.

Fonctionnement

Lors de la création de la form, dans la classe ModelFormField.java, lors de la présence d'un nombre à formatter, on construit on fonction du type demandé et les indications de dans le fichier de properties, le template de formatage que l'on passe ensuite avec la locale à une fonction de formatage.

  • Les nombres à formater ont en suffix "-number"
exemple : accounting-number, correspond à un formatage pour un affichage comptable des montants

Utilisation

Dans une form, lors de l'affichage d'un nombre, on renseigne l'information de la façon suivante :

<field name="x" title="y"><display type="accounting-number" /></field>

Ajout d'un nouveau type

Pour ajouter un nouveau type d'affichage fonctionnel voici la procédure :

  • Configuration de type
Ajouter les informations de formatage du nombre dans le fichier framework/common/config/arithmetic.properties
 Exemple : 
 stock.quantity.decimals = 3
 stock.quantity.rounding = ROUND_HALF_UP
  • Renseigner la dtd
Ajouter le nouveau type dans le fichier xsd de définition des forms framework/widget/dtd/widget-form.xsd
 Exemple :
   <xs:attribute name="type">
       <xs:simpleType>
          <xs:restriction base="xs:token">
               <xs:enumeration value="accounting-number"/>
               <xs:enumeration value="stock-quantity-number"/>


  • Mettre en place la logique metier
Ajouter dans le fichier framework/widget/src/org/ofbiz/widget/form/ModelForm.java le chargement de la nouvelle properties
 Exemple : 
         if ( type.endsWith( "-number" )) {
               Locale locale = (Locale) context.get("locale");
               if (locale == null) locale = Locale.getDefault();
               try {                   
                   Double parsedRetVal = (Double) ObjectType.simpleTypeConvert(retVal, "Double", null, locale, false);
                   String template = "#0.";
                   int decimals = 2;
                   if( type.startsWith("accounting") )
                       decimals = Integer.parseInt(UtilProperties.getPropertyValue( "arithmetic", "accounting.decimals", "1"));
                   if( type.startsWith("stock-quantity") )
                       decimals = Integer.parseInt(UtilProperties.getPropertyValue( "arithmetic", "stock.quantity.decimals", "3"));
                   for (;decimals > 0; decimals--)
                       template += "0";
                   retVal = UtilFormatOut.formatDecimalNumber(parsedRetVal.doubleValue(), template, locale);
               } catch (GeneralException e) {
                   String errMsg = "Error formatting amount value [" + retVal + "]: " + e.toString();
                   Debug.logError(e, errMsg, module);
                   throw new IllegalArgumentException(errMsg);
               }