erreur import écritures dans version 1.4b3

Répondre
Samuel_Burg
Messages : 144
Enregistré le : mer. juil. 22, 2015 12:17 pm

lun. août 03, 2015 3:42 pm

Bonjour,

Je teste depuis 2-3 semaines le version 1.4b3 de openconcerto.
Je viens de faire des essais avec la fonction "Comptabilité -> Import des écritures"
J'utilise un fichier ods.

1)
l'interface indique que les champs à renseigner dans le fichier sont :
Date (jj/mm/yy) -> Journal -> N°Compte -> NomPièce -> Libellé -> Débit -> Crédit

mais en fait ce qui est lu par le logiciel est :
Date (jj/mm/yy) -> Journal -> N°Compte -> NomPièce -> Libellé -> Crédit -> Débit

Vous avez une permutation des deux dernier champs.

2)
En outre le champ "NomPièce" n'est pas repris dans les écritures.
Le contenu du champ est fusionné avec le "Libellé" de chaque écriture pour créer un nouveau libellé.
Un champ NomPièce est crée de-novo à partir de la date d'import des données.
Ceci n'est pas vraiment pratique.

En plus toutes les écritures sont fusionnées dans un seul mouvement ... arghhhhhhhh !
Les mouvements doivent rester séparés, comme c'est notamment le cas dans le format FEC.

Ceci pourrait être fait en utilisant un champ supplémentaire "N°Mouvement" lors de l'import (le champ EcritureNum du FEC), le numéro du fichier d'entré servant uniquement à identifier les lignes d'écriture devant être assemblées dans le même mouvement, l'incrément du numéro de mouvement dans la base openconcerto étant généré par la base elle même.

Cordialement,
Samuel_Burg
Messages : 144
Enregistré le : mer. juil. 22, 2015 12:17 pm

jeu. août 06, 2015 2:19 pm

au sujet de l'erreur d'import entre Debit et Credit, dans :

org.openconcerto.erp.core.finance.accouting.ui / ImportEcriturePanel.class :

Code : Tout sélectionner

.../...
      gen.mEcritures.put("CREDIT", Long.valueOf(montantD));
      gen.mEcritures.put("DEBIT", Long.valueOf(montantC));
      solde += montantD;
      solde -= montantC;
.../...
vous avez permuté les deux champs "CREDIT" et "DEBIT".

cordialement,
Samuel
Samuel_Burg
Messages : 144
Enregistré le : mer. juil. 22, 2015 12:17 pm

jeu. août 06, 2015 3:13 pm

Ci dessous une proposition de modification de l'import csv/xls/odt, en ajoutant la gestion des mouvements et des nom des pièces présents dans le fichier à importer.

La dernière (7°) colonne du csv/xls/odt contient un entier positif qui change entre chaque mouvement successif.

Comme je n'ai pas les sources de la version 1.4b3 dans un projet eclipse et que je suis pas une flèche en java
je n'ai pas encore pu tester ce code.

en outre il faut vérifier la façon dont la classe GenerationEcritures gen = new GenerationEcritures(); se ré-initialise à chaque nouveau mouvement, je suppose que comme on est en java c'est auto-géré par le compilateur/environnement d’exécution.

Code : Tout sélectionner

  public void importData(File f, String mvtName, final Frame owner)
    throws Exception
  {
    DataImporter importer = new DataImporter(this.tableEcr);
    importer.setSkipFirstLine(false);
    DateFormat dF = new SimpleDateFormat("dd/MM/yyyy");
    ArrayTableModel m = importer.createModelFrom(f); // lire tout les champs du fichier (csv, ods, xls) au kilomètre
    
    GenerationEcritures gen = new GenerationEcritures(); // comment on fait un .clear() sur une classe en java ? c'est auto-géré ?	
    long solde = 0L;
    
    int lastMvtFakeId = -1; // pseudo Mouvment_Id 
    int idMvt = -1; // real Mouvment_Id 
    
    for (int i = 0; i < m.getRowCount(); i++)
    {
      Object valueAt = m.getValueAt(i, 0);
      if (valueAt == null) {
        break;
      }
      Date dateValue;
      Date dateValue;
      if (valueAt.getClass().isAssignableFrom(Date.class))
      {
        dateValue = (Date)valueAt;
      }
      else
      {
        if (valueAt.toString().trim().length() == 0) {
          break;
        }
        dateValue = dF.parse(valueAt.toString());
      }
      
      int currentMvtFakeId = m.getValueAt(i, 7); // pseudo Mouvment Id from CSV file
      String pieceName = m.getValueAt(i, 3).toString(); // nom de la pièce de la ligne d'écriture
      if (lastMvtFakeId != currentMvtFakeId) { 
    	  // GenerationEcritures gen = new GenerationEcritures(); // comment on fait un .clear() sur une classe en java ? c'est auto-géré ?
    	  lastMvtFakeId = currentMvtFakeId;
    	  idMvt = gen.getNewMouvement("", 1, 1, pieceName); // créer un nouveau mvmt
      }
      
      gen.mEcritures.put("ID_MOUVEMENT", Integer.valueOf(idMvt));
      
      int idCpt = ComptePCESQLElement.getId(m.getValueAt(i, 2).toString().trim());
      gen.mEcritures.put("ID_COMPTE_PCE", Integer.valueOf(idCpt));
      
      String stringValueD = m.getValueAt(i, 5).toString();
      long montantD = GestionDevise.parseLongCurrency(stringValueD);
      String stringValueC = m.getValueAt(i, 6).toString();
      long montantC = GestionDevise.parseLongCurrency(stringValueC);
      gen.mEcritures.put("DEBIT", Long.valueOf(montantD));  // typo fixed
      gen.mEcritures.put("CREDIT", Long.valueOf(montantC)); // typo fixed
      solde += montantD;
      solde -= montantC;
      
      System.err.println("(" + stringValueD + " : " + stringValueC + ") ---- (" + montantD + " : " + montantC + ")");
      
      final String valueJrnl = m.getValueAt(i, 1).toString();
      if (this.mapJournal.get(valueJrnl) == null) {
        try
        {
          System.err.println("LOCKED");
          
          SwingUtilities.invokeAndWait(new Runnable()
          {
            public void run()
            {
              JDialog diag = new JDialog(owner);
              diag.setModal(true);
              diag.setContentPane(new SelectionJournalImportPanel(valueJrnl, ImportEcriturePanel.this.mapJournal, null));
              diag.setTitle("Import écritures");
              diag.setLocationRelativeTo(null);
              diag.pack();
              diag.setVisible(true);
            }
          });
          System.err.println("PASSED");
        }
        catch (InterruptedException e1)
        {
          e1.printStackTrace();
        }
      }
      gen.mEcritures.put("ID_JOURNAL", this.mapJournal.get(valueJrnl));
      
      gen.mEcritures.put("DATE", dateValue);
      
      gen.mEcritures.put("NOM", m.getValueAt(i, 4).toString() + " " + m.getValueAt(i, 3).toString());
      
      gen.ajoutEcriture();
    }
    
    if (solde != 0L) {
      throw new IllegalArgumentException("La partie double n'est respectée (solde = " + solde + "). Import annulé!");
    }
    SwingUtilities.invokeLater(new Runnable()
    {
      public void run()
      {
        JOptionPane.showMessageDialog(owner, "Importation des écritures terminée");
      }
    });
  }
}
Avatar du membre
guillaume
Messages : 2457
Enregistré le : ven. févr. 11, 2011 7:15 pm

ven. août 07, 2015 9:49 am

Bonjour,

On va regarder cela. Merci pour votre retour.
Il me semble tout de même que cela a déjà été corrigé il y a quelques semaines,
si vous voulez jouer avec les preview de la prochaine béta, c'est par ici :
http://www.openconcerto.org/fr/telechar ... tas/1.4b4/

Cordialement,
Directeur technique d'OpenConcerto qui dans son temps libre s'occupe du forum.
Pour une assistance pro, nous sommes joignables à ILM Informatique contre quelques jetons.
Pensez aussi à lire le manuel !
guenneguez_t
Messages : 12
Enregistré le : mar. sept. 08, 2015 8:51 pm

mar. sept. 08, 2015 9:14 pm

Bonjour,

Je suis en train de tester la version 1.4Beta4 pour basculer de Ciel...
Effectivement le fait que l'import des données intègre tout dans un seul mouvement et que le numéro de pièce n'arrive pas dans la bonne cas me semble domage.
Je touve la proposition de @Samuel_Burg très judicieuse.

Il serait aussi pratique de pouvoir renseigner dans le fichier le libéllé des comptes. Celà simplifierait les bascules d'un logiciel de compta vers OpenConcerto.

D'autre part contrairement à ce qui est écrit dans la page d'aide aux imports, la date doit être au format dd/MM/yyyy et non dd/MM/yy).

Il semblerait aussi que même si des nouveaux journaux ont été créé avant l'import, ils ne sont pas pris en compte et une reselection manuelle doit être faite.

Cordialement
Thomas Guenneguez
PS : En tout cas le logiciel a l'aire d'être bien fait.
Répondre