Point sur la gestion des prélèvement SEPA

Bonjour,

J’aimerais avoir un retour des utilisateurs sur la gestion des prélèvements SEPA par Dolibarr 3.9. Beaucoup utilisent ce module ? Vos fichiers sont-ils acceptés par les banques ?

Le dolistore commercialise un module complémentaire « SEPA STS », ce qui laisse penser que le module intégré ne fait pas correctement son office. D’autant plus que la discussion suivante (www.dolibarr.fr/forum/t/erreur-fichier-xml-prelevement/22436/23) laisse penser que le système n’est pas au point.

J’ai eu une discussion off avec edly qui m’a confirmé que le module SEPA sur la version 3.8 n’était pas praticable.

Des retours afin que je me positionne ?

Cordialement.

Bonsoir
J’ai fait quelques tests sur une 3,8,4, si une facture = 1 prélèvement sa passe plutôt bien.
@+

Bonjour

Nous utilisons le module SEPA natif en 3.8.3. le fichier generer est correct, a condition que l’ensemble des imperatif soit correctement rempli. RIb de la societé, etc… Test et production utilisé avec le Credit Mutuel (PS ces dernier on un outils de test et control des fichier SEPA)

Toutefois nous avons apporté quelque correctif sur celui ci, le module ne gere pas
1 la date d’echeance (nous utilisons la date d’echeance de la facture), dans ce module la date d’echeance correspond à la date du jour de la generation du fichier. (Nous avons modifié le fichier puor que celui ci prennent en charge cette date d’echeance, et que le fichier groupe les differentes date, et produise des lots de prelevement pour un meme fichier)
2 plusieurs factures pour une meme societe sur un meme prelevement (Nous avons du corriger la generation du fichier)
3 tous les prélévement doivent etre du meme type (FIRST / RECCURENT) pour un fichier
4 le RUM est generer automatiquement, (nous avons ajusté ce point, nos RUM sont codifié independament)
5 le bon assemble l’ensemble des factures payé par sepa et ne permet pas de scinder le bon generer. (Nous avons ajusté ce point pour nous permettre de precisier quelques facture associé au bon de prelevement)

Mais pour finir la base est suffisante pour une utilisation simple, et assez structuré pour ajusté le comportement avec quelques heure de dev.

Ah oui quand même.

Il y a plein de choses que ce module ne gère pas. Pour le faire il faut donc mettre les mains dans le cambouis :slight_smile:

Il ne me reste plus qu’à tester tout ça.

Merci pour vos retours.

Bonjour à tous,

Je rebondis sur le sujet,
J’ai un problème avec mes prélèvements SEPA. Lorsque les fichiers xml sont émis de dolibarr et testés sur le site de test du crédit mutuel, tout semble être correct, notamment le caractère ‹ FIRST › ou ‹ RÉCURRENT › du prélèvement. Seulement, nous avons eu des refus de banques car notre fichier n’était pas un ‹ FIRST › (bien qu’il ait été analysé comme tel).
Quelqu’un aurait une solution ? Une idée d’où ce problème peut venir ?

J’ai déjà décortiqué le fichier xml et la borne <SeqTp> (destinée selon internet à identifier la nature ‹ FIRST › ou ‹ RÉCURRENTE ›) indique bien le cde ‹ FRST ›.

Merci d’avance

Bonjour,

Vous pouvez essayez http://www.mesfluxdepaiement.fr/testez-vos-fichiers-sepa pour contrôler vos flux mais c’est peut être bien le crédit mutuel qui est derrière.
Il y a aussi http://www.azzana-consulting.com/xmlsolver/
@+

Tout d’abord merci pour ton aide.
En effet, le site http://www.mesfluxdepaiement.fr/ est bien celui dont je parlais.
Pour ce qui est de l’autre site, j’ai comparé balise par balise le fichier exemple qu’ils fournissent avec celui généré par Dolibarr et celui généré par la banque(qu’ils m’ont transmis à ma demande et qui ne rencontre pas ce problème d’identification en first).
Je n’ai rien trouvé de différent, du moins rien de commun aux deux autres fichiers que je n’avais pas dans celui de Dolibarr.

Merci encore,

J’aurai besoin de dénouer le problème rapidement donc je relance le sujet,

Merci d’avance

[b]J’ai enfin trouvé la solution !
Il y a une grosse erreur dans le fichier php qui crée le fichier xml.
En effet, le choix du FIRST ou du RECURRENT se fait en fonction du nombre de factures que contient le prélèvement SEPA (ce qui n’a rien à voir avec le caractère de premier prélèvement ou non).

Il faut donc modifier quelques portions du fichier \compta\prelevement\class\bonprelevement.class.php

Autour de la ligne 1327 :
remplacer :[/b]
$fileEmetteurSection .= $this->EnregEmetteurSEPA($conf, $date_actu, $i, $this->total, $CrLf);
par:
$fileEmetteurSection .= $this->EnregEmetteurSEPA($conf, $date_actu, $i, $this->total, $CrLf, $obj->code, $this->db->jdate($obj->datec), $obj->drum);

Autour de la ligne 1680 :
remplacer :

[i]function EnregEmetteurSEPA($configuration, $ladate, $nombre, $total, $CrLf=’\n’)
{ // SEPA INITIALISATION
global $confs;

	$dateTime_YMD = dol_print_date($ladate, '%Y%m%d');
	$dateTime_ETAD = dol_print_date($ladate, '%Y-%m-%d');
	$dateTime_YMDHMS = dol_print_date($ladate, '%Y-%m-%dT%H:%M:%S');

	// Récupération info demandeur
	$sql = "SELECT rowid, ref";
	$sql.= " FROM";
	$sql.= " ".MAIN_DB_PREFIX."prelevement_bons as pb";
	$sql.= " WHERE pb.rowid = ".$this-\>id;

	$resql=$this-\>db-\>query($sql);
	if ($resql)
	{
		$obj = $this-\>db-\>fetch_object($resql);

		// DONNEES BRUTES : par la suite Rows['XXX'] de la requete au dessus
		$country = explode(':', $configuration-\>global-\>MAIN_INFO_SOCIETE_COUNTRY);
		$IdBon  = sprintf("%05d", $obj-\>rowid);
		$RefBon = $obj-\>ref;
		$type = ($nombre == 1) ? 'FRST' : 'RCUR' ;
		// SEPA Paiement Information
		$XML_SEPA_INFO = '';[/i]

par :

[i] function EnregEmetteurSEPA($configuration, $ladate, $nombre, $total, $CrLf=’\n’, $row_code_client, $row_datec, $row_drum)
{ // SEPA INITIALISATION
global $confs;

	$dateTime_YMD = dol_print_date($ladate, '%Y%m%d');
	$dateTime_ETAD = dol_print_date($ladate, '%Y-%m-%d');
	$dateTime_YMDHMS = dol_print_date($ladate, '%Y-%m-%dT%H:%M:%S');

    $Rum = $this-\>buildRumNumber($row_code_client, $row_datec, $row_drum);
	// Récupération info demandeur
	$sql = "SELECT rowid, ref";
	$sql.= " FROM";
	$sql.= " ".MAIN_DB_PREFIX."prelevement_bons as pb";
	$sql.= " WHERE pb.rowid = ".$this-\>id;

    //Récupération des RUM
    $sql2 = "SELECT pl.rowid as rowid, soc.code_client as code_client, rib.datec as date_creation, rib.rowid as rowid_rib";
    $sql2.= " FROM ".MAIN_DB_PREFIX."prelevement_lignes as pl";
    $sql2.= " LEFT JOIN ".MAIN_DB_PREFIX."societe as soc ON pl.fk_soc=soc.rowid";
    $sql2.= " LEFT JOIN ".MAIN_DB_PREFIX."societe_rib as rib ON pl.fk_soc=rib.fk_soc";
    $sql2.= " WHERE NOT(pl.fk_prelevement_bons=".$this-\>id.")";
    $sql2.= " GROUP BY date_creation";
	$resql=$this-\>db-\>query($sql);
    $resql2=$this-\>db-\>query($sql2);
	if ($resql && $resql2)
	{
		$obj = $this-\>db-\>fetch_object($resql);
        $count = 0;
        $test=1;
        for ($i=0; $test ; $i++) { 
            $rums[$i]= $this-\>db-\>fetch_object($resql2);
            $count++;
            if (empty($rums[$i]-\>rowid)) {
                $test=0;
                unset($rums[$i]);
            }
        }

		// DONNEES BRUTES : par la suite Rows['XXX'] de la requete au dessus
		$country = explode(':', $configuration-\>global-\>MAIN_INFO_SOCIETE_COUNTRY);
		$IdBon  = sprintf("%05d", $obj-\>rowid);
		$RefBon = $obj-\>ref;
        $nbOfPrlvmnt = 0;
        for ($i=0; $i <sizeof($rums) ; $i++) { 
            if ($this-\>buildRumNumber($rums[$i]-\>code_client,$this-\>db-\>jdate($rums[$i]-\>date_creation),$rums[$i]-\>rowid_rib) == $Rum) {
                $nbOfPrlvmnt++;
            }
        }
		$type = ($nbOfPrlvmnt == 0) ? 'FRST' : 'RCUR' ;
		// SEPA Paiement Information
		$XML_SEPA_INFO = '';[/i]

Je ne suis pas un grand développeur mais plus un petit bidouilleur donc il se peut que le code ne soit pas très propre mais pour moi il marche.