function GenerateSepa($debit_id, $debit_type = null) { if ($debit_type != 'FRST' and $debit_type != 'RCUR') { error_log(__FUNCTION__ . '() invalid $debit_type ' . $debit_type); return FALSE; } // Check $debit_id if (defined($debit_id) and !is_numeric($debit_id)) { die('Invalid $debit_id'); } $sepa = GetSepaContent($debit_id, $debit_type); if ($sepa === FALSE) { error_log(__FUNCTION__ . "(): unable to fetch content from GetSepaContent() for direct debit {$debit_id} with type {$debit_type}. There is probably no transaction here"); return FALSE; } $company_rib = GetCompanyMaiRIB(); $nombre_virements = 0; $montant_total = 0; $montant_total_centimes = 0; $chaine_totale = ""; $nb_erreurs = 0; $erreurs_details = ""; require_once 'sepa_constants.php'; $config = array("name" => RAISON_SOCIALE, "IBAN" => preg_replace('/\\s+/', '', CODE_IBAN), "BIC" => preg_replace('/\\s+/', '', CODE_BIC), "batch" => "true", "creditor_id" => preg_replace('/\\s+/', '', CODE_ICS), "currency" => "EUR"); try { $SEPASDD = new SEPASDD($config); } catch (Exception $e) { echo $e->getMessage(); } foreach ($sepa as $line) { // On recherche les éléments pouvant bloquer la génération du paiement if (empty($config['IBAN']) or empty($config['BIC']) or empty($config['creditor_id'])) { $nb_erreurs++; $nb_erreurs_ligne++; $erreurs_details .= " - Aucun IBAN et/ou BIC et/ou ICS enregistré(s) pour la société <a href=\"/prospection/fiche_prospect.php?id={$line['id']}\">{$line['name']}</a>.<br />"; } if (strlen($line['iban']) > LONGUEUR_IBAN or empty($line['iban'])) { $nb_erreurs++; $nb_erreurs_ligne++; $erreurs_details .= " - Le code IBAN de \"" . $line['name'] . "\" permettant de générer un virement d'un montant de " . $line['montant'] . " EUR contient " . strlen($line['iban']) . " caractères au lieu de " . LONGUEUR_IBAN . " max. (valeur constatée : " . $line['iban'] . "). Cette ligne est abandonnée.<br />"; } if (strlen($line['bic']) > LONGUEUR_BIC or empty($line['bic'])) { $nb_erreurs++; $nb_erreurs_ligne++; $erreurs_details .= " - Le code BIC de \"" . $line['name'] . "\" permettant de générer un virement d'un montant de " . $line['montant'] . " EUR contient " . strlen($line['bic']) . " caractères au lieu de " . LONGUEUR_BIC . " max. (valeur constatée : " . $line['bic'] . "). Cette ligne est abandonnée.<br />"; } $montant_debit = $line['montant']; $payment = array("name" => $line['name'], "IBAN" => $line['iban'], "BIC" => $line['bic'], "amount" => "{$montant_debit}", "type" => $line['debit_type'], "collection_date" => date('Y-m-d'), "mandate_id" => $line['client_sepaid'], "mandate_date" => $line['mandat_date'], "description" => $line['ref']); try { $SEPASDD->addPayment($payment); } catch (Exception $e) { echo $e->getMessage(); } } if ($nb_erreurs > 0) { // Des erreurs bloquantes ont été detectées ?> <div class="mess_err"> <?php echo $nb_erreurs; ?> erreur(s) bloquante(s) détectée(s) pour la génération du fichier de remise :<br /> <?php echo $erreurs_details; ?> <br /> Remise d'ordre de virement abandonnée <!-- ' --> </div> <br /><br /> <?php return false; } try { $chaine_totale = $SEPASDD->save(); } catch (Exception $e) { echo $e->getMessage(); } $res = mysql_query("UPDATE direct_debit SET type = 'SEPA' WHERE id = {$debit_id}") or die(mysql_error()); $myFile = sys_get_temp_dir() . "/sepa-{$debit_id}-{$debit_type}.xml"; $fh = fopen($myFile, 'w') or die("can't open file"); fwrite($fh, $chaine_totale); fclose($fh); return $myFile; }
function GenerateCfonb($debit_id = null) { // Check $debit_id if (defined($debit_id) and !is_numeric($debit_id)) { die('Invalid $debit_id'); } $where = "WHERE state='todo'"; if (!empty($debit_id)) { $where = "WHERE debit_id = {$debit_id}"; } $company_rib = GetCompanyMaiRIB(); define('NUMERO_EMETTEUR', '484779'); define('RAISON_SOCIALE', 'SARL ISVTEC'); define('SIRET', '44875254300034'); define('CODE_GUICHET_SOCIETE', $company_rib->code_guichet); define('NUMERO_COMPTE_SOCIETE', $company_rib->compte); define('CODE_BANQUE', $company_rib->code_banque); define('REF_REMISE', date('dmy')); define('PRELEVEMENT_TYPE', '08'); //08 = standard, 85 = rapide define('LONGUEUR_CODE_BANQUE', '5'); define('LONGUEUR_CODE_GUICHET', '5'); define('LONGUEUR_NUMERO_COMPTE', '11'); define('LONGUEUR_ENREGISTREMENT', '160'); /** * On définit les variables */ $nombre_virements = 0; $montant_total = 0; $montant_total_centimes = 0; $chaine_totale = ""; $nb_erreurs = 0; $erreurs_details = ""; /** * Enregistrement et données de la remise d'ordres de virement * Enregistrement "Emetteur" */ $ligne = ""; $ligne .= FormatBancaire("03", 2); // Code enregistrement - Constante à "03" (2 caractères) $ligne .= FormatBancaire(PRELEVEMENT_TYPE, 2); // Code opération - Virements ordinaires (2 caractères) $ligne .= FormatBancaire("", 8); // Zone réservée (8 caractères) $ligne .= FormatBancaire(NUMERO_EMETTEUR, 6); // Numéro d'émetteur ou d'identification (6 caractères) $ligne .= FormatBancaire("", 1); // Code CCD : inutile dans notre cas (1 caractères) $ligne .= FormatBancaire("", 6); // Zone réservée (6 caractères) $ligne .= FormatBancaire(date('dm') . substr(date('y'), -1), 5); // Date (JJMMA) (5 caractères) $ligne .= FormatBancaire(stripAccents(RAISON_SOCIALE), 24); // Nom ou raison sociale du donneur d'ordre (24 caractères) $ligne .= FormatBancaire(stripAccents(REF_REMISE), 11); // Référence de la remise (7 caractères) $ligne .= FormatBancaire("", 15); // Zone réservée (17 caractères) $ligne .= FormatBancaire("E", 1); // Code monnaie - Constante à "E" (1 caractères) $ligne .= FormatBancaire("", 5); // Zone réservée (5 caractères) $ligne .= FormatBancaire(CODE_GUICHET_SOCIETE, 5); // Code guichet de la banque du conneur d'ordre (5 caractères) $ligne .= FormatBancaire(NUMERO_COMPTE_SOCIETE, 11); // Numéro de compte du donneur d'ordre (11 caractères) $ligne .= FormatBancaire("", 47); // Zone réservée (31 caractères) $ligne .= FormatBancaire(CODE_BANQUE, 5); // Code établissement de la banque du donneur d'ordre (5 caractères) // $ligne .= FormatBancaire(SIRET, 16); // Identifiant du donneur d'ordre (16 caractères) // $ligne .= FormatBancaire("", 31); // Zone réservée (31 caractères) $ligne .= FormatBancaire("", 6); // Zone réservée (6 caractères) // On vérifie l'intégrité de la chaîne if (strlen($ligne) != LONGUEUR_ENREGISTREMENT) { $nb_erreurs++; $erreurs_details .= " - La première ligne \"Emetteur\" contient " . strlen($ligne) . " caractères au lieu de " . LONGUEUR_ENREGISTREMENT . ". La remise d'ordres de virement ne peut être poursuivie.<br />"; } // On complète la chaîne totale $chaine_totale .= $ligne . "\n"; $Invoice = new Facture(); $res = mysql_query('SELECT id, invoice_id ' . 'FROM direct_debit_row ' . "{$where}") or die(mysql_error()); $total_ttc = 0; while ($invoice = mysql_fetch_assoc($res)) { $info = $Invoice->getInfos($invoice['invoice_id']); $total[$info->nom_client]['TTC'] += $info->total_ttc; // On positionne le nombre d'erreurs de cette ligne à zéro $nb_erreurs_ligne = 0; // On définit les variables de la remise de virement $ref_paiement = "F:" . $info->num_facture; // Formatage du montant $montant = round($info->total_ttc, 2); $montant_centimes = round($info->total_ttc * 100, 0); $rib = GetRibFromIban($info->iban); // On recherche les éléments pouvant bloquer la génération du paiement if (strlen($rib['banque']) != LONGUEUR_CODE_BANQUE) { $nb_erreurs++; $nb_erreurs_ligne++; $erreurs_details .= " - Le code banque de \"" . $info->nom_client . "\" permettant de générer un virement d'un montant de " . $montant . " EUR contient " . strlen($rib['banque']) . " caractères au lieu de " . LONGUEUR_CODE_BANQUE . " (valeur constatée : " . $info->rib_code_banque . "). Cette ligne est abandonnée.<br />"; } if (strlen($rib['guichet']) != LONGUEUR_CODE_GUICHET) { $nb_erreurs++; $nb_erreurs_ligne++; $erreurs_details .= " - Le code guichet de \"" . $info->nom_client . "\" permettant de générer un virement d'un montant de " . $montant . " EUR contient " . strlen($rib['guichet']) . " caractères au lieu de " . LONGUEUR_CODE_GUICHET . " (valeur constatée : " . $info->rib_code_guichet . "). Cette ligne est abandonnée.<br />"; } if (strlen($rib['compte']) != LONGUEUR_NUMERO_COMPTE) { $nb_erreurs++; $nb_erreurs_ligne++; $erreurs_details .= " - Le numéro de compte de \"" . $info->nom_client . "\" permettant de générer un virement d'un montant de " . $montant . " EUR contient " . strlen($rib['compte']) . " caractères au lieu de " . LONGUEUR_NUMERO_COMPTE . " (valeur constatée : " . $info->rib_compte . "). Cette ligne est abandonnée.<br />"; } /** * Enregistrement et données de la remise d'ordres de virement * Enregistrement "Destinataire" */ $ligne = ""; $ligne .= FormatBancaire("06", 2); // Code d'enregistrement - Constante à "06" (2 caractères) $ligne .= FormatBancaire(CODE_OPERATION, 2); // Code opération (2 caractères) $ligne .= FormatBancaire("", 8); // Zone réservée (8 caractères) $ligne .= FormatBancaire(NUMERO_EMETTEUR, 6); // Numéro d'émetteur (6 caractères) $ligne .= FormatBancaire($ref_paiement, 12); // Référence (12 caractères) $ligne .= FormatBancaire(stripAccents($info->nom_client), 24); // Nom/Raison sociale du bénéficaire (24 caractères) $ligne .= FormatBancaire(stripAccents(' '), 20); // Domicialiation : facultatif (24 caractères) $ligne .= FormatBancaire("", 12); // Déclaration à la balance des paiements : ??????? (8 caractères) $ligne .= FormatBancaire($rib['guichet'], 5); // Code guichet bénéficiaire (5 caractères) $ligne .= FormatBancaire($rib['compte'], 11); // Numéro de compte bénéficiaire (11 caractères) $ligne .= FormatBancaire($montant_centimes, 16, "0", "right"); // Montant (16 caractères) $ligne .= FormatBancaire($ref_paiement, 31); // Libellé (31 caractères) $ligne .= FormatBancaire($rib['banque'], 5); // Code établissement bénéficiaire (5 caractères) $ligne .= FormatBancaire("", 6); // Zone réservée (6 caractères) // On vérifie l'intégrité de la chaîne if (strlen($ligne) != LONGUEUR_ENREGISTREMENT) { $nb_erreurs++; $nb_erreurs_ligne++; $erreurs_details .= " - La ligne de virement de \"" . $info->nom_client . "\" d'un montant de " . $montant . " EUR contient " . strlen($ligne) . " caractères au lieu de " . LONGUEUR_ENREGISTREMENT . ". Cette ligne est abandonnée.<br />"; } if ($nb_erreurs_ligne == 0) { // Si cette ligne n'a pas générée d'erreur // On compte le nombre de virements à effectuer $nombre_virements++; // On additionne le montant total $montant_total += $montant; // On complèté la chaîne totale $chaine_totale .= $ligne . "\n"; $montant_total_centimes += $montant_centimes; } } // On calcule le montant total en centimes //$montant_total_centimes = round($total_ttc * 100, 0); /** * Enregistrement et données de la remise d'ordres de virement * Enregistrement "Total" */ $ligne = ""; $ligne .= FormatBancaire("08", 2); // Code enregistrement - constante à "08" (2 caractères) $ligne .= FormatBancaire(CODE_OPERATION, 2); // Code opération (2 caractères) $ligne .= FormatBancaire("", 8); // Zone réservée (8 caractères) $ligne .= FormatBancaire(NUMERO_EMETTEUR, 6); // Numéro d'émetteur (6 caractères) $ligne .= FormatBancaire("", 84); // Zone réservée (12 caractères) $ligne .= FormatBancaire($montant_total_centimes, 16, "0", "right"); // Montant de la remise (16 caractères) $ligne .= FormatBancaire("", 42); // Zone réservée (31 caractères) // On vérifie l'intégrité de la chaîne if (strlen($ligne) != LONGUEUR_ENREGISTREMENT) { $nb_erreurs++; $erreurs_details .= " - La dernière ligne \"Total\" contient " . strlen($ligne) . " caractères au lieu de " . LONGUEUR_ENREGISTREMENT . ". La remise d'ordres de virement ne peut être poursuivie.<br />"; } // On complète la chaîne totale $chaine_totale .= $ligne . "\n"; if ($nb_erreurs > 0) { // Des erreurs bloquantes ont été detectées ?> <div class="mess_err"> <?php echo $nb_erreurs; ?> erreur(s) bloquante(s) détectée(s) pour la génération du fichier de remise :<br /> <?php echo $erreurs_details; ?> <br /> Remise d'ordre de virement abandonnée <!-- ' --> </div> <br /><br /> <?php return false; } $myFile = sys_get_temp_dir() . "/cfonb-{$debit_id}.txt"; $fh = fopen($myFile, 'w') or die("can't open file"); fwrite($fh, $chaine_totale); fclose($fh); return $myFile; }