diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 52619883fe7..23b279a1170 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -14136,7 +14136,7 @@ function buildParamDate($prefix, $timestamp = null, $hourTime = '', $gm = 'auto' */ function recordNotFound($message = '', $printheader = 1, $printfooter = 1, $showonlymessage = 0, $params = null) { - global $conf, $db, $user, $langs, $hookmanager; + global $conf, $db, $langs, $hookmanager; global $action, $object; if (!is_object($langs)) { diff --git a/htdocs/core/lib/functions_fi.lib.php b/htdocs/core/lib/functions_fi.lib.php new file mode 100644 index 00000000000..ee6e3e9f061 --- /dev/null +++ b/htdocs/core/lib/functions_fi.lib.php @@ -0,0 +1,113 @@ + + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * or see https://www.gnu.org/ + */ + +/** + * \file htdocs/core/lib/functions_fi.lib.php + * \brief A set of finish functions for Dolibarr + * This file contains rare functions. + */ + + +/** + * Calculate Creditor Reference RF / FI Bank payment reference number + * + * @param string $invoice_number Invoice number to generate payment reference + * @param int $statut Invoice status, if draft (0), no reference generating + * @param string $use_rf false/(0) generate FI Bank payment reference + * true/(1) Generate European Reference number based on the global + * Structured Creditor Reference standard (SEPA RF creditor reference) + * @return string String Payment reference number or RF creditor reference + */ +function dolFICalculatePaymentReference($invoice_number, $statut, $use_rf) +{ + if ($statut >= 1) { + $invoice_number = preg_replace('/[^0-9]/', '', $invoice_number); // Keep only numbers + $invoice_number = ltrim($invoice_number, '0'); //Remove any leading zero or zeros + $invoice_number = strrev($invoice_number); // Reverse the reference number + $coefficients = array(7, 3, 1, 7, 3); // Define the coefficient numbers + $sum = 0; + $stlen_invoice_number = (int) strlen($invoice_number); + for ($i = 0; $i < $stlen_invoice_number; $i++) { // Calculate the sum using coefficients + $sum += (int) $invoice_number[$i] * $coefficients[$i % 5]; + } + $check_digit = (10 - ($sum % 10)) % 10; // Calculate the check digit + $bank_reference_fi = strrev($invoice_number) . $check_digit; // Concatenate the Reversed reference number and the check digit + if ($use_rf) { // SEPA RF creditor reference + $reference_with_suffix = $bank_reference_fi . "271500"; // Append "271500" to the end of the payment reference number + $remainder = (int) bcmod($reference_with_suffix, '97'); // Calculate the remainder when dividing by 97 + $check_digit = 98 - $remainder; // Subtract the remainder from 98 + if ($check_digit < 10) { // If below 10 -> add leading zero + $check_digit = '0' . $check_digit; + } + $bank_reference = "RF" . $check_digit . $bank_reference_fi; // Add "RF" and the check digit in front of the payment reference number + } else { // FI payment reference number + $bank_reference = $bank_reference_fi; + } + } else { + $bank_reference = ''; + } + return wordwrap($bank_reference, 4, ' ', true); // Split the string into chunks of 4 characters to improve readability +} + +/** + * Calculate payment Barcode data with FI/RF bank payment reference number + * + * @param string $recipient_account Account number for pank payment + * @param string $amount Amount of invoice payment + * @param string $bank_reference FI Payment reference number or RF creditor reference + * @param string $due_date Payments due to date + * @return string String String for FI/RF Payment barcode + */ +function dolFIGenerateInvoiceBarcodeData($recipient_account, $amount, $bank_reference, $due_date) +{ + $barcodeData = '0'; + if (!empty($bank_reference)) { + if (substr($bank_reference, 0, 2) === "RF") { + $recipient_account = preg_replace('/[^0-9]/', '', $recipient_account); // Remove non-numeric characters from account number + $recipient_account = str_pad($recipient_account, 16, '0', STR_PAD_LEFT); // Add leading zeros if necessary + $referencetobarcode = preg_replace('/[^0-9]/', '', $bank_reference); // Remove non-numeric characters (spaces) + $referencetobarcode = substr($referencetobarcode, 0, 2) . str_pad(substr($referencetobarcode, 2), 21, '0', STR_PAD_LEFT); + $euros = floor(floatval($amount)); // Separate euros and cents + $cents = round((floatval($amount) - $euros) * 100); + $due_date = date('ymd', (int) $due_date); // Format the due date to YYMMDD + $barcodeData = '5'; // Version number // Construct the string + $barcodeData .= $recipient_account; // Recipient's account number (IBAN) + $barcodeData .= sprintf('%06d', (int) $euros); // Euros + $barcodeData .= sprintf('%02d', (int) $cents); // Cents + $barcodeData .= $referencetobarcode; // Reference number + $barcodeData .= (int) $due_date; // Due date YYMMDD + } elseif (substr($bank_reference, 0, 2) !== "RF") { + $recipient_account = preg_replace('/[^0-9]/', '', $recipient_account); // Remove non-numeric characters from account number + $recipient_account = str_pad($recipient_account, 16, '0', STR_PAD_LEFT); // Add leading zeros if necessary + $referencetobarcode = preg_replace('/[^0-9]/', '', $bank_reference); // Remove non-numeric characters (spaces) + $euros = floor(floatval($amount)); // Separate euros and cents + $cents = round((floatval($amount) - $euros) * 100); + $due_date = date('ymd', (int) $due_date); // Format the due date to YYMMDD + $barcodeData = '4'; // Version number // Construct the string + $barcodeData .= $recipient_account; // Recipient's account number (IBAN) + $barcodeData .= sprintf('%06d', (int) $euros); // Euros + $barcodeData .= sprintf('%02d', (int) $cents); // Cents + $barcodeData .= '000'; // Reserved + $barcodeData .= str_pad($referencetobarcode, 20, '0', STR_PAD_LEFT); // Reference number + $barcodeData .= (int) $due_date; // Due date YYMMDD + } + } else { + $barcodeData = ''; + } + return $barcodeData; +} diff --git a/htdocs/core/lib/invoice.lib.php b/htdocs/core/lib/invoice.lib.php index c875bb68cf3..95ed5249031 100644 --- a/htdocs/core/lib/invoice.lib.php +++ b/htdocs/core/lib/invoice.lib.php @@ -1333,91 +1333,3 @@ function getPurchaseInvoiceUnpaidOpenTable($maxCount = 500, $socid = 0) return $result; } - -/** - * Calculate Creditor Reference RF / FI Bank payment reference number - * - * @param string $invoice_number Invoice number to generate payment reference - * @param int $statut Invoice status, if draft (0), no reference generating - * @param string $use_rf false/(0) generate FI Bank payment reference - * true/(1) Generate European Reference number based on the global - * Structured Creditor Reference standard (SEPA RF creditor reference) - * @return string String Payment reference number or RF creditor reference - */ -function calculate_payment_reference($invoice_number, $statut, $use_rf) -{ - if ($statut >= 1) { - $invoice_number = preg_replace('/[^0-9]/', '', $invoice_number); // Keep only numbers - $invoice_number = ltrim($invoice_number, '0'); //Remove any leading zero or zeros - $invoice_number = strrev($invoice_number); // Reverse the reference number - $coefficients = array(7, 3, 1, 7, 3); // Define the coefficient numbers - $sum = 0; - $stlen_invoice_number = (int) strlen($invoice_number); - for ($i = 0; $i < $stlen_invoice_number; $i++) { // Calculate the sum using coefficients - $sum += (int) $invoice_number[$i] * $coefficients[$i % 5]; - } - $check_digit = (10 - ($sum % 10)) % 10; // Calculate the check digit - $bank_reference_fi = strrev($invoice_number) . $check_digit; // Concatenate the Reversed reference number and the check digit - if ($use_rf) { // SEPA RF creditor reference - $reference_with_suffix = $bank_reference_fi . "271500"; // Append "271500" to the end of the payment reference number - $remainder = (int) bcmod($reference_with_suffix, '97'); // Calculate the remainder when dividing by 97 - $check_digit = 98 - $remainder; // Subtract the remainder from 98 - if ($check_digit < 10) { // If below 10 -> add leading zero - $check_digit = '0' . $check_digit; - } - $bank_reference = "RF" . $check_digit . $bank_reference_fi; // Add "RF" and the check digit in front of the payment reference number - } else { // FI payment reference number - $bank_reference = $bank_reference_fi; - } - } else { - $bank_reference = ''; - } - return wordwrap($bank_reference, 4, ' ', true); // Split the string into chunks of 4 characters to improve readability -} - -/** - * Calculate payment Barcode data with FI/RF bank payment reference number - * @param string $recipient_account Account number for pank payment - * @param string $amount Amount of invoice payment - * @param string $bank_reference FI Payment reference number or RF creditor reference - * @param string $due_date Payments due to date - * @return string String String for FI/RF Payment barcode - */ -function generateInvoiceBarcodeData($recipient_account, $amount, $bank_reference, $due_date) -{ - $barcodeData = '0'; - if (!empty($bank_reference)) { - if (substr($bank_reference, 0, 2) === "RF") { - $recipient_account = preg_replace('/[^0-9]/', '', $recipient_account); // Remove non-numeric characters from account number - $recipient_account = str_pad($recipient_account, 16, '0', STR_PAD_LEFT); // Add leading zeros if necessary - $referencetobarcode = preg_replace('/[^0-9]/', '', $bank_reference); // Remove non-numeric characters (spaces) - $referencetobarcode = substr($referencetobarcode, 0, 2) . str_pad(substr($referencetobarcode, 2), 21, '0', STR_PAD_LEFT); - $euros = floor(floatval($amount)); // Separate euros and cents - $cents = round((floatval($amount) - $euros) * 100); - $due_date = date('ymd', (int) $due_date); // Format the due date to YYMMDD - $barcodeData = '5'; // Version number // Construct the string - $barcodeData .= $recipient_account; // Recipient's account number (IBAN) - $barcodeData .= sprintf('%06d', (int) $euros); // Euros - $barcodeData .= sprintf('%02d', (int) $cents); // Cents - $barcodeData .= $referencetobarcode; // Reference number - $barcodeData .= (int) $due_date; // Due date YYMMDD - } elseif (substr($bank_reference, 0, 2) !== "RF") { - $recipient_account = preg_replace('/[^0-9]/', '', $recipient_account); // Remove non-numeric characters from account number - $recipient_account = str_pad($recipient_account, 16, '0', STR_PAD_LEFT); // Add leading zeros if necessary - $referencetobarcode = preg_replace('/[^0-9]/', '', $bank_reference); // Remove non-numeric characters (spaces) - $euros = floor(floatval($amount)); // Separate euros and cents - $cents = round((floatval($amount) - $euros) * 100); - $due_date = date('ymd', (int) $due_date); // Format the due date to YYMMDD - $barcodeData = '4'; // Version number // Construct the string - $barcodeData .= $recipient_account; // Recipient's account number (IBAN) - $barcodeData .= sprintf('%06d', (int) $euros); // Euros - $barcodeData .= sprintf('%02d', (int) $cents); // Cents - $barcodeData .= '000'; // Reserved - $barcodeData .= str_pad($referencetobarcode, 20, '0', STR_PAD_LEFT); // Reference number - $barcodeData .= (int) $due_date; // Due date YYMMDD - } - } else { - $barcodeData = ''; - } - return $barcodeData; -}