122 lines
3.6 KiB
PHP
Raw Normal View History

<?php
namespace App\Http\Middleware;
use Closure;
2021-01-19 18:02:19 +03:00
use OutOfBoundsException;
use Illuminate\Support\Str;
use InvalidArgumentException;
2021-01-19 18:02:19 +03:00
use UnexpectedValueException;
class Money
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
2021-02-09 14:56:56 +03:00
if (($request->method() != 'POST') && ($request->method() != 'PATCH')) {
return $next($request);
}
$currency_code = setting('default.currency');
if ($request->get('currency_code')) {
$currency_code = $request->get('currency_code');
}
2021-02-09 14:56:56 +03:00
$parameters = [
'amount',
'sale_price',
'purchase_price',
'opening_balance',
];
2021-01-19 18:02:19 +03:00
2021-02-09 14:56:56 +03:00
foreach ($parameters as $parameter) {
if (!$request->has($parameter)) {
continue;
}
2021-01-19 18:02:19 +03:00
2021-02-09 14:56:56 +03:00
$money_format = $request->get($parameter);
2021-05-14 18:29:24 +03:00
if (!preg_match("/^(?=.*?[0-9])[0-9.,]+$/", $money_format)) {
continue;
}
2021-02-09 14:56:56 +03:00
if ($parameter == 'sale_price' || $parameter == 'purchase_price') {
2021-07-27 18:03:07 +03:00
$money_format = Str::replace(',', '.', $money_format);
if ($dot_count = Str::substrCount($money_format, '.') > 1) {
if ($dot_count > 2) {
$money_format = Str::replaceLast('.', '#', $money_format);
$money_format = Str::replace('.', '', $money_format);
$money_format = Str::replaceFirst('#', '.', $money_format);
} else {
$money_format = Str::replaceFirst('.', '', $money_format);
}
}
2021-08-08 21:00:06 +03:00
$money_format = (double) $money_format;
}
$amount = $this->getAmount($money_format, $currency_code);
2021-01-19 18:02:19 +03:00
2021-02-09 14:56:56 +03:00
$request->request->set($parameter, $amount);
}
2021-02-09 14:56:56 +03:00
$document_number = $request->get('document_number');
$items = $request->get('items');
2021-02-09 14:56:56 +03:00
if (isset($document_number) || !empty($items)) {
if (!empty($items)) {
foreach ($items as $key => $item) {
if (!isset($item['price'])) {
continue;
}
2021-05-14 18:29:24 +03:00
if (!preg_match("/^(?=.*?[0-9])[0-9.,]+$/", $item['price'])) {
continue;
}
$amount = $item['price'];
if (strpos($item['price'], config('money.' . $currency_code . '.symbol')) !== false) {
$amount = $this->getAmount($item['price'], $currency_code);
}
2021-02-09 14:56:56 +03:00
$items[$key]['price'] = $amount;
}
2021-02-09 14:56:56 +03:00
$request->request->set('items', $items);
}
2021-02-09 14:56:56 +03:00
}
2021-02-09 14:56:56 +03:00
return $next($request);
}
protected function getAmount($money_format, $currency_code)
2021-02-09 14:56:56 +03:00
{
try {
if (config('money.' . $currency_code . '.decimal_mark') !== '.') {
$money_format = Str::replaceFirst('.', config('money.' . $currency_code . '.decimal_mark'), $money_format);
}
$amount = money($money_format, $currency_code)->getAmount();
2021-02-09 14:56:56 +03:00
} catch (InvalidArgumentException | OutOfBoundsException | UnexpectedValueException $e) {
2021-06-08 23:33:17 +03:00
report($e);
2021-02-09 14:56:56 +03:00
$amount = 0;
if ($money_format === null) {
$amount = $money_format;
}
}
2021-02-09 14:56:56 +03:00
return $amount;
}
}