2019-08-28 04:36:53 +02:00
|
|
|
<?php
|
|
|
|
/**
|
2020-09-06 11:38:10 +02:00
|
|
|
* Invoice Ninja (https://invoiceninja.com).
|
2019-08-28 04:36:53 +02:00
|
|
|
*
|
|
|
|
* @link https://github.com/invoiceninja/invoiceninja source repository
|
|
|
|
*
|
2021-01-03 22:54:54 +01:00
|
|
|
* @copyright Copyright (c) 2021. Invoice Ninja LLC (https://invoiceninja.com)
|
2019-08-28 04:36:53 +02:00
|
|
|
*
|
|
|
|
* @license https://opensource.org/licenses/AAL
|
|
|
|
*/
|
|
|
|
|
|
|
|
namespace App\Utils;
|
|
|
|
|
2019-10-07 12:21:02 +02:00
|
|
|
use App\Models\Currency;
|
2019-08-28 04:36:53 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Class Number.
|
|
|
|
*/
|
|
|
|
class Number
|
|
|
|
{
|
|
|
|
/**
|
|
|
|
* @param float $value
|
|
|
|
* @param int $precision
|
|
|
|
*
|
|
|
|
* @return float
|
|
|
|
*/
|
|
|
|
public static function roundValue(float $value, int $precision = 2) : float
|
|
|
|
{
|
|
|
|
return round($value, $precision, PHP_ROUND_HALF_UP);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2020-09-06 11:38:10 +02:00
|
|
|
* Formats a given value based on the clients currency.
|
2019-12-30 22:59:12 +01:00
|
|
|
*
|
2020-08-26 02:47:50 +02:00
|
|
|
* @param float $value The number to be formatted
|
2019-08-28 04:36:53 +02:00
|
|
|
* @param object $currency The client currency object
|
2019-12-30 22:59:12 +01:00
|
|
|
*
|
2020-08-26 02:47:50 +02:00
|
|
|
* @return string The formatted value
|
2019-08-28 04:36:53 +02:00
|
|
|
*/
|
2020-08-26 02:47:50 +02:00
|
|
|
public static function formatValue($value, $currency) :string
|
2019-08-28 04:36:53 +02:00
|
|
|
{
|
|
|
|
$value = floatval($value);
|
|
|
|
|
|
|
|
$thousand = $currency->thousand_separator;
|
|
|
|
$decimal = $currency->decimal_separator;
|
|
|
|
$precision = $currency->precision;
|
|
|
|
|
|
|
|
return number_format($value, $precision, $decimal, $thousand);
|
|
|
|
}
|
|
|
|
|
2020-08-26 02:47:50 +02:00
|
|
|
/**
|
|
|
|
* Formats a given value based on the clients currency
|
2020-09-06 11:38:10 +02:00
|
|
|
* BACK to a float.
|
2020-08-26 02:47:50 +02:00
|
|
|
*
|
2020-10-28 11:10:49 +01:00
|
|
|
* @param string $value The formatted number to be converted back to float
|
2020-08-26 02:47:50 +02:00
|
|
|
* @return float The formatted value
|
|
|
|
*/
|
|
|
|
public static function parseFloat($value)
|
|
|
|
{
|
|
|
|
// convert "," to "."
|
|
|
|
$s = str_replace(',', '.', $value);
|
|
|
|
|
|
|
|
// remove everything except numbers and dot "."
|
2020-09-06 11:38:10 +02:00
|
|
|
$s = preg_replace("/[^0-9\.]/", '', $s);
|
2020-08-26 02:47:50 +02:00
|
|
|
|
|
|
|
// remove all seperators from first part and keep the end
|
2020-09-06 11:38:10 +02:00
|
|
|
$s = str_replace('.', '', substr($s, 0, -3)).substr($s, -3);
|
2020-08-26 02:47:50 +02:00
|
|
|
|
|
|
|
// return float
|
|
|
|
return (float) $s;
|
|
|
|
}
|
|
|
|
|
2020-12-20 10:02:10 +01:00
|
|
|
public static function parseStringFloat($value)
|
|
|
|
{
|
|
|
|
$value = preg_replace('/[^0-9-.]+/', '', $value);
|
|
|
|
|
|
|
|
// check for comma as decimal separator
|
|
|
|
if (preg_match('/,[\d]{1,2}$/', $value)) {
|
|
|
|
$value = str_replace(',', '.', $value);
|
|
|
|
}
|
|
|
|
|
|
|
|
$value = preg_replace('/[^0-9\.\-]/', '', $value);
|
|
|
|
|
|
|
|
return floatval($value);
|
|
|
|
}
|
|
|
|
|
2019-08-28 04:36:53 +02:00
|
|
|
/**
|
2020-09-06 11:38:10 +02:00
|
|
|
* Formats a given value based on the clients currency AND country.
|
2019-12-30 22:59:12 +01:00
|
|
|
*
|
2020-10-28 11:10:49 +01:00
|
|
|
* @param floatval $value The number to be formatted
|
|
|
|
* @param $client
|
2019-09-04 23:55:49 +02:00
|
|
|
* @return string The formatted value
|
2019-08-28 04:36:53 +02:00
|
|
|
*/
|
2019-09-11 05:46:23 +02:00
|
|
|
public static function formatMoney($value, $client) :string
|
2019-08-28 04:36:53 +02:00
|
|
|
{
|
2019-10-16 12:24:33 +02:00
|
|
|
$currency = $client->currency();
|
2019-10-07 12:21:02 +02:00
|
|
|
|
2019-10-16 12:24:33 +02:00
|
|
|
$thousand = $currency->thousand_separator;
|
|
|
|
$decimal = $currency->decimal_separator;
|
|
|
|
$precision = $currency->precision;
|
|
|
|
$code = $currency->code;
|
2019-10-23 22:37:20 +02:00
|
|
|
$swapSymbol = $currency->swap_currency_symbol;
|
2019-08-28 04:36:53 +02:00
|
|
|
|
2019-12-30 22:59:12 +01:00
|
|
|
/* Country settings override client settings */
|
2020-12-21 09:08:12 +01:00
|
|
|
if (isset($client->country->thousand_separator) && strlen($client->country->thousand_separator) >= 1) {
|
2019-12-30 22:59:12 +01:00
|
|
|
$thousand = $client->country->thousand_separator;
|
|
|
|
}
|
2020-09-06 11:38:10 +02:00
|
|
|
|
2020-12-21 09:08:12 +01:00
|
|
|
if (isset($client->country->decimal_separator) && strlen($client->country->decimal_separator) >= 1) {
|
2019-12-30 22:59:12 +01:00
|
|
|
$decimal = $client->country->decimal_separator;
|
|
|
|
}
|
2019-10-24 11:23:37 +02:00
|
|
|
|
2020-12-21 09:08:12 +01:00
|
|
|
if (isset($client->country->swap_currency_symbol) && strlen($client->country->swap_currency_symbol) >= 1) {
|
2019-12-30 22:59:12 +01:00
|
|
|
$swapSymbol = $client->country->swap_currency_symbol;
|
|
|
|
}
|
2019-10-24 06:46:24 +02:00
|
|
|
|
2019-08-28 04:36:53 +02:00
|
|
|
$value = number_format($value, $precision, $decimal, $thousand);
|
2019-10-16 12:24:33 +02:00
|
|
|
$symbol = $currency->symbol;
|
2020-09-06 11:38:10 +02:00
|
|
|
|
2020-12-09 13:38:22 +01:00
|
|
|
if ($client->getSetting('show_currency_code') === true && $currency->code == 'CHF') {
|
2020-12-08 21:35:26 +01:00
|
|
|
return "{$code} {$value}";
|
|
|
|
} elseif ($client->getSetting('show_currency_code') === true) {
|
2019-08-28 04:36:53 +02:00
|
|
|
return "{$value} {$code}";
|
|
|
|
} elseif ($swapSymbol) {
|
2020-09-06 11:38:10 +02:00
|
|
|
return "{$value} ".trim($symbol);
|
2019-10-07 12:21:02 +02:00
|
|
|
} elseif ($client->getSetting('show_currency_code') === false) {
|
2019-08-28 04:36:53 +02:00
|
|
|
return "{$symbol}{$value}";
|
|
|
|
} else {
|
2019-10-16 12:24:33 +02:00
|
|
|
return self::formatValue($value, $currency);
|
2019-08-28 04:36:53 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|