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 :
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