dolibarr/htdocs/core/lib/functions_fi.lib.php
2024-09-06 20:28:06 +08:00

114 lines
5.9 KiB
PHP

<?php
/* Copyright (C) 2010 Laurent Destailleur <eldy@users.sourceforge.net>
*
* 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 <https://www.gnu.org/licenses/>.
* 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 ($amount >= 0 && !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;
}