Communication structurée européenne

Bonjour,
Comment mettre en place la (communication structurée européenne) et autres pays avec dolibarr ?
Comment Générer une communication structurée avec dolibarr ?
Comment générer une communication structurée belge en dolibarr ?
Comment Générer la communication structurée avec dolibarr ?
Comment générer la communication structurée belge en dolibarr ?
Comment générer la communication structurée belge avec dolibarr ?
Indiquer la communication structuré en dolibarr ?
Mettre en place la communication structuré dolibarr ?
Mettre en place une communication structuré européen avec dolibarr ?
Mettre en place une communication structuré belge en dolibarr ?

Pour simplifier la traçabilité et retracer une facture en Belgique et Europe nous devons indiquer la (communication structuré) sur les virements, qui est représenter en 12 chiffres, comme suivant +++123/1234/12345+++

Bonjour,
Un peu répétitif comme post !
Vous souhaitez avoir des numéro de pièces sur le format 000/0000/00000 mais que doit représenter chaque chiffre ?
Le millésime de l’année ? le n° du client ?
Si il y a un format officiel, la communauté vous sera reconnaissante de fournir la source officielle mais pas que je sache.
@+

Bonjour,

Voici l’explication de la communication structurée. Je suis moi aussi intéressé.

Une communication structurée comporte 12 positions numériques : 10 positions significatives et 2 positions de contrôle (les deux dernières). Elle est divisée en 3 séquences séparées par des slash : 123/1234/12345

Comme pour l’algorithme de vérification des codes bancaires belges, les 2 chiffres de contrôle se basent sur le principe du modulo 97 des 10 premiers chiffres, le résultat de l’opération donnant les deux derniers chiffres.

Voici comment procéder pour trouver ces deux chiffres. Imaginons que les dix premiers chiffres soient les suivants : 1013274810

Divisons ce nombre par 97. On obtient un nombre dont on ne garde que la partie entière, avant la virgule : 10446132
Multiplions ce résultat par 97 : 1013274804
Soustrayons enfin ce nombre du nombre de départ 1013274810-1013274804.
On obtient 6 qu’il suffit de coder sur deux positions, soit 06

Bonjour,

Voici un logiciel pour faire de la communication structurée

Cordialement,

XP

Salut Xavier et merci pour le lien.
En fait je ne comprend pas bien l’intérêt de la chose. Juste un masque de numérotation particulier ?
A quoi ce « numéro » va servir en particulier, j’avoue avoir déjà aperçu mais je ne me suis pas posé la question.
@+

Avec ce numéro la banque peu savoir le nom de la société, la date et le numéro de facture ainsi que son montant.

Bon, c’est vieux… mais vous pourriez tomber dessus à la recherche d’une réponse.
Sans garantie aucune — mais je m’en sert depuis quelques années, voici ce que j’ai fait :
:warning: Garder le code sous la main ⇒ Il est écrasé à chaque mise à jour.

Pour ajouter la communication structurée (belge) dans les factures

Dans le document .php qui génère la facture (ex. htdocs/core/modules/facture/doc/pdf_crabe.php.
Perso., je l’ai mis — logiquement — dans les informations de paiement SI virement, donc
Cherchez les lignes

if (empty($object->mode_reglement_code) || $object->mode_reglement_code == 'VIR')
{
    if (! empty($object->mode_reglement_code) || ! empty($object->fk_bank) || ! empty($conf->global->FACTURE_RIB_NUMBER))
    {

et remplacer la ligne

$pdf->MultiCell(100,3, 'Communication:' . $outputlangs->convToOutputCharset($object->ref),0, 'L', 0);

par le code suivant :

//NIMAL 2018-09-22
switch (substr($object->ref,0,2))
                                  {
                                      case "FA":
                                          $n_type_code = '20'; //code des factures
                                          break;
                                      case "AC":
                                          $n_type_code = '21'; //code des acomptes
                                          break;
                                      case "FR":
                                          $n_type_code = '30'; //code des factures de remplacement
                                          break;
                                      case "NC":
                                          $n_type_code = '40'; //code des notes de crédit
                                          break;
                                      default:
                                          $n_type_code = '00';
                                  }
                                  $n_code = substr($object->ref,2,strlen($object->ref) - 2); //reprend la partie numérique de la référence du documment
                                  $n_code = explode("-",$n_code);                            //sépare la partie date de la séquence
                                  $n_size = strlen($n_code[0]) + strlen($n_code[1]);         //si je n’ai pas 8 caractères, j’ajoute des 0 à la séquence
                                  if ($n_size > 8)
                                  {
                                      $n_code[1] = substr($n_code[1],-($n_size-8));
                                  }
                                  $n_base = (float)($n_type_code . $n_code[0] . $n_code[1]); // calcul de la somme de controle
                                  $n_control = $n_base - floor($n_base / 97) * 97;
                                  if ($n_control == 0)
                                      $n_control = 97;
                                  $n_base_s = (string) $n_base;                              //repasse tout en string
                                  $n_control_s = (string) $n_control;                        //vérifie que la somme de controle est sur 2 caractères
                                  if ($control < 10)
                                      $control_s = "0" . $n_control_s;

                                  $n_count = 10 - strlen($n_base_s);                         //vérifie qu’on a 10 caractère pour la base
                                  for ($i=0; $i < $count; $i++)
                                  {
                                      $n_base_s = "0" . $n_base_s;
                                  }
                                  $n_com = $n_base_s . $n_control_s;                        //formatage
                                  $n_com = "+++" . substr($n_com,0,3) . "/" . substr($n_com,3,4) . "/" . substr($n_com,-5) . "+++";
                                  //affichage
                                  $dpf->MultiCell(100,3,'Communiaction: ' . $outputlangs->convToOutputCharset($n_com,0,'L',0);
                                  $posy+=2;

C’est la même chose pour les autres documents (AC, NC, …) le Switch… case «  » au début du code donne un nombre différent en fonction du type de document… vous pouvez naturellement changer ces valeurs ou les adapter à votre configuration.

Pour ajouter dans les mails __FACCOM_STRCT__ qui représente la communication structurée

Il y en a un peu plus, je vous le mets…
Les premières entrées⁽*⁾ n’ont rien à voir, mais permettent de mettre les infos élémentaires dans un mail également.
* ces éléments ne sont pas de moi, mais — mea culpa — je ne me souviens plus de l’auteur pour lui rendre hommage. Navré.
Edit : J’ai retrouvé. C’était Philazerty dans ce post. Merci à lui !

Dans le fichier htdocs/core/lib/functions.lib.php, ajouter dans la fonction getCommonSubstitutionArray(…)
vers la fin, avant le TODO foreign multicurrency et _TOTAL_TTC_ (vers la ligne 7000)

                  //NIMAL 2018-09-22
                  $substitutionarray['__FACDATE__']        = is_object($object)?(isset($object->date) ? dol_print_date($object->date, 'daytext', 0, $outputlangs) : '') : '';
                  $substitutionarray['__FACDATELIMREG__']        = is_object($object)?(isset($object->date) ? dol_print_date($object->date_lim_reglement, 'daytext', 0, $outputlangs) : '') : '';
                  $substitutionarray['__FACTOTALTTC_2D__'] = is_object($object)?number_format($object->total_ttc,2,',',' '):'';
                  $substitutionarray['__FACTOTALHT_2D__'] = is_object($object)?number_format($object->total_ht,2,',',' '):'';
                  $substitutionarray['__FACPAYE_2D__'] = is_object($object)?number_format($object->totalpaye,2,',',' '):'';
                  $substitutionarray['__FACREST_2D__'] = is_object($object)?number_format($object->total_ttc - $object->totalpaye,2,',',' '):'';
                  /**************************************************/
                                  // COMMUNICATION STRUCTURÉE:
                                  // <codeDoc><reference Doc><modulo 97>
                                  switch (substr($object->ref,0,2))
                                  {
                                      case "FA":
                                          $n_type_code = '20'; //code des factures
                                          break;
                                      case "AC":
                                          $n_type_code = '21'; //code des acomptes
                                          break;
                                      case "FR":
                                          $n_type_code = '30'; //code des factures de remplacement
                                          break;
                                      case "NC":
                                          $n_type_code = '40'; //code des notes de crédit
                                          break;
                                      default:
                                          $n_type_code = '00';
                                  }
                                  $n_code = substr($object->ref,2,strlen($object->ref) - 2); //reprend la partie numérique de la référence du documment
                                  $n_code = explode("-",$n_code);                            //sépare la partie date de la séquence
                                  $n_size = strlen($n_code[0]) + strlen($n_code[1]);         //si je n’ai pas 8 caractères, j’ajoute des 0 à la séquence
                                  if ($n_size > 8)
                                  {
                                      $n_code[1] = substr($n_code[1],-($n_size-8));
                                  }
                                  $n_base = (float)($n_type_code . $n_code[0] . $n_code[1]); // calcul de la somme de controle
                                  $n_control = $n_base - floor($n_base / 97) * 97;
                                  if ($n_control == 0)
                                      $n_control = 97;
                                  $n_base_s = (string) $n_base;                              //repasse tout en string
                                  $n_control_s = (string) $n_control;                        //vérifie que la somme de controle est sur 2 caractères
                                  if ($control < 10)
                                      $control_s = "0" . $n_control_s;

                                  $n_count = 10 - strlen($n_base_s);                         //vérifie qu’on a 10 caractère pour la base
                                  for ($i=0; $i < $count; $i++)
                                  {
                                      $n_base_s = "0" . $n_base_s;
                                  }
                                  $n_com = $n_base_s . $n_control_s;                        //formatage
                                  $n_com = "+++" . substr($n_com,0,3) . "/" . substr($n_com,3,4) . "/" . substr($n_com,-5) . "+++";
                                  $substitutionarray['__FACCOM_STRCT__'] = $n_com;

                  //END NIMAL
3 « J'aime »

Bonjour @GNL,

j’ai essayé d’intégrer votre code dans la version 16 de Dolibarr. Mais à chaque fois que je mets cette ligne dans le code. Le modèle crabe disparait de l’administration des modules

 $pdf->MultiCell(100,3,'Communiaction: ' . $outputlangs->convToOutputCharset($n_com,0,'L',0);

auriez-vous quelques conseils ou une version plus récente?

Drari

Salut les enfants,

Ne serait-il pas possible de l’inclure dans dolibarr ? un petit github ?

Car j’avoue que ça m’intéresse aussi.

Egalement à la recherche d’un module pour les communications structurées.
Ce serait bien de le voir apparaitre dans une des prochaines mises à jour.

Pierre

2 « J'aime »