diff --git a/backend/.env.example b/backend/.env.example index 974d9be584..12971f17ac 100644 --- a/backend/.env.example +++ b/backend/.env.example @@ -62,3 +62,6 @@ AWS_USE_PATH_STYLE_ENDPOINT=true JWT_SECRET=2hoccgHb9r1fqW1lU16C6khSHVa7O0eai6FxkWK95UtQ0LqNDTO5mq1RzDwcq18I JWT_ALGO=HS256 + +# Only required for SAAS mode and if your're charging fees +# OPEN_EXCHANGE_RATES_APP_ID= diff --git a/backend/app/Helper/Currency.php b/backend/app/Helper/Currency.php index 375fe1480f..618bc163cc 100644 --- a/backend/app/Helper/Currency.php +++ b/backend/app/Helper/Currency.php @@ -6,6 +6,30 @@ class Currency { + private const ZERO_DECIMAL_CURRENCIES = [ + 'BIF', + 'CLP', + 'DJF', + 'GNF', + 'JPY', + 'KMF', + 'KRW', + 'MGA', + 'PYG', + 'RWF', + 'UGX', + 'VND', + 'VUV', + 'XAF', + 'XOF', + 'XPF' + ]; + + public static function isZeroDecimalCurrency(string $currencyCode): bool + { + return in_array(strtoupper($currencyCode), self::ZERO_DECIMAL_CURRENCIES, true); + } + public static function format(float|int $amount, string $currencyCode, string $locale = 'en_US'): string { $currencyCode = strtoupper($currencyCode); diff --git a/backend/app/Providers/AppServiceProvider.php b/backend/app/Providers/AppServiceProvider.php index 740c432a8d..209f87984a 100644 --- a/backend/app/Providers/AppServiceProvider.php +++ b/backend/app/Providers/AppServiceProvider.php @@ -9,6 +9,9 @@ use HiEvents\DomainObjects\OrganizerDomainObject; use HiEvents\Models\Event; use HiEvents\Models\Organizer; +use HiEvents\Services\Infrastructure\CurrencyConversion\CurrencyConversionClientInterface; +use HiEvents\Services\Infrastructure\CurrencyConversion\NoOpCurrencyConversionClient; +use HiEvents\Services\Infrastructure\CurrencyConversion\OpenExchangeRatesCurrencyConversionClient; use Illuminate\Cache\RateLimiting\Limit; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Database\Eloquent\Model; @@ -28,6 +31,7 @@ public function register(): void { $this->bindDoctrineConnection(); $this->bindStripeClient(); + $this->bindCurrencyConversionClient(); } /** @@ -130,4 +134,25 @@ private function disableLazyLoading(): void { Model::preventLazyLoading(!app()->isProduction()); } + + private function bindCurrencyConversionClient(): void + { + $this->app->bind( + CurrencyConversionClientInterface::class, + function () { + if (config('services.open_exchange_rates.app_id')) { + return new OpenExchangeRatesCurrencyConversionClient( + apiKey: config('services.open_exchange_rates.app_id'), + cache: $this->app->make('cache.store'), + logger: $this->app->make('log') + ); + } + + // Fallback to no-op client if no other client is available + return new NoOpCurrencyConversionClient( + logger: $this->app->make('log') + ); + } + ); + } } diff --git a/backend/app/Services/Application/Handlers/Order/Payment/Stripe/CreatePaymentIntentHandler.php b/backend/app/Services/Application/Handlers/Order/Payment/Stripe/CreatePaymentIntentHandler.php index f133c3f0d4..0db40c5914 100644 --- a/backend/app/Services/Application/Handlers/Order/Payment/Stripe/CreatePaymentIntentHandler.php +++ b/backend/app/Services/Application/Handlers/Order/Payment/Stripe/CreatePaymentIntentHandler.php @@ -6,7 +6,6 @@ use Brick\Math\Exception\NumberFormatException; use Brick\Math\Exception\RoundingNecessaryException; use Brick\Money\Exception\UnknownCurrencyException; -use Brick\Money\Money; use HiEvents\DomainObjects\AccountConfigurationDomainObject; use HiEvents\DomainObjects\Generated\StripePaymentDomainObjectAbstract; use HiEvents\DomainObjects\OrderItemDomainObject; @@ -23,6 +22,7 @@ use HiEvents\Services\Domain\Payment\Stripe\DTOs\CreatePaymentIntentResponseDTO; use HiEvents\Services\Domain\Payment\Stripe\StripePaymentIntentCreationService; use HiEvents\Services\Infrastructure\Session\CheckoutSessionManagementService; +use HiEvents\Values\MoneyValue; use Stripe\Exception\ApiErrorException; use Throwable; @@ -84,7 +84,7 @@ public function handle(string $orderShortId): CreatePaymentIntentResponseDTO } $paymentIntent = $this->stripePaymentService->createPaymentIntent(CreatePaymentIntentRequestDTO::fromArray([ - 'amount' => Money::of($order->getTotalGross(), $order->getCurrency())->getMinorAmount()->toInt(), + 'amount' => MoneyValue::fromFloat($order->getTotalGross(), $order->getCurrency()), 'currencyCode' => $order->getCurrency(), 'account' => $account, 'order' => $order, diff --git a/backend/app/Services/Domain/Order/MarkOrderAsPaidService.php b/backend/app/Services/Domain/Order/MarkOrderAsPaidService.php index 4682d3f2bc..d9fd58882a 100644 --- a/backend/app/Services/Domain/Order/MarkOrderAsPaidService.php +++ b/backend/app/Services/Domain/Order/MarkOrderAsPaidService.php @@ -2,6 +2,7 @@ namespace HiEvents\Services\Domain\Order; +use Brick\Math\Exception\MathException; use HiEvents\DomainObjects\AccountConfigurationDomainObject; use HiEvents\DomainObjects\AccountDomainObject; use HiEvents\DomainObjects\AttendeeDomainObject; @@ -142,6 +143,9 @@ private function updateAttendeeStatuses(OrderDomainObject $updatedOrder): void ); } + /** + * @throws MathException + */ private function storeApplicationFeePayment(OrderDomainObject $updatedOrder): void { /** @var EventDomainObject $event */ @@ -163,13 +167,14 @@ private function storeApplicationFeePayment(OrderDomainObject $updatedOrder): vo $this->orderApplicationFeeService->createOrderApplicationFee( orderId: $updatedOrder->getId(), - applicationFeeAmount: $this->orderApplicationFeeCalculationService->calculateApplicationFee( + applicationFeeAmountMinorUnit: $this->orderApplicationFeeCalculationService->calculateApplicationFee( $config, $updatedOrder->getTotalGross(), $event->getCurrency(), - )->toFloat(), + )->toMinorUnit(), orderApplicationFeeStatus: OrderApplicationFeeStatus::AWAITING_PAYMENT, paymentMethod: PaymentProviders::OFFLINE, + currency: $updatedOrder->getCurrency(), ); } } diff --git a/backend/app/Services/Domain/Order/OrderApplicationFeeCalculationService.php b/backend/app/Services/Domain/Order/OrderApplicationFeeCalculationService.php index b8ee73a4bf..fa9371f232 100644 --- a/backend/app/Services/Domain/Order/OrderApplicationFeeCalculationService.php +++ b/backend/app/Services/Domain/Order/OrderApplicationFeeCalculationService.php @@ -2,14 +2,19 @@ namespace HiEvents\Services\Domain\Order; +use Brick\Money\Currency; use HiEvents\DomainObjects\AccountConfigurationDomainObject; +use HiEvents\Services\Infrastructure\CurrencyConversion\CurrencyConversionClientInterface; use HiEvents\Values\MoneyValue; use Illuminate\Config\Repository; class OrderApplicationFeeCalculationService { + private const BASE_CURRENCY = 'USD'; + public function __construct( - private readonly Repository $config, + private readonly Repository $config, + private readonly CurrencyConversionClientInterface $currencyConversionClient ) { } @@ -24,12 +29,28 @@ public function calculateApplicationFee( return MoneyValue::zero($currency); } - $fixedFee = $accountConfiguration->getFixedApplicationFee(); + $fixedFee = $this->getConvertedFixedFee($accountConfiguration, $currency); $percentageFee = $accountConfiguration->getPercentageApplicationFee(); return MoneyValue::fromFloat( - amount: $fixedFee + ($orderTotal * $percentageFee / 100), + amount: $fixedFee->toFloat() + ($orderTotal * $percentageFee / 100), currency: $currency ); } + + private function getConvertedFixedFee( + AccountConfigurationDomainObject $accountConfiguration, + string $currency + ): MoneyValue + { + if ($currency === self::BASE_CURRENCY) { + return MoneyValue::fromFloat($accountConfiguration->getFixedApplicationFee(), $currency); + } + + return $this->currencyConversionClient->convert( + fromCurrency: Currency::of(self::BASE_CURRENCY), + toCurrency: Currency::of($currency), + amount: $accountConfiguration->getFixedApplicationFee() + ); + } } diff --git a/backend/app/Services/Domain/Order/OrderApplicationFeeService.php b/backend/app/Services/Domain/Order/OrderApplicationFeeService.php index 12904baac0..01bea9fd8b 100644 --- a/backend/app/Services/Domain/Order/OrderApplicationFeeService.php +++ b/backend/app/Services/Domain/Order/OrderApplicationFeeService.php @@ -5,6 +5,7 @@ use HiEvents\DomainObjects\Enums\PaymentProviders; use HiEvents\DomainObjects\Generated\OrderApplicationFeeDomainObjectAbstract; use HiEvents\DomainObjects\Status\OrderApplicationFeeStatus; +use HiEvents\Helper\Currency; use HiEvents\Repository\Interfaces\OrderApplicationFeeRepositoryInterface; class OrderApplicationFeeService @@ -17,16 +18,24 @@ public function __construct( public function createOrderApplicationFee( int $orderId, - float $applicationFeeAmount, + int $applicationFeeAmountMinorUnit, OrderApplicationFeeStatus $orderApplicationFeeStatus, PaymentProviders $paymentMethod, + string $currency, ): void { + $isZeroDecimalCurrency = Currency::isZeroDecimalCurrency($currency); + + $applicationFeeAmount = $isZeroDecimalCurrency + ? $applicationFeeAmountMinorUnit + : $applicationFeeAmountMinorUnit / 100; + $this->orderApplicationFeeRepository->create([ OrderApplicationFeeDomainObjectAbstract::ORDER_ID => $orderId, OrderApplicationFeeDomainObjectAbstract::AMOUNT => $applicationFeeAmount, OrderApplicationFeeDomainObjectAbstract::STATUS => $orderApplicationFeeStatus->value, OrderApplicationFeeDomainObjectAbstract::PAYMENT_METHOD => $paymentMethod->value, + ORderApplicationFeeDomainObjectAbstract::CURRENCY => $currency, OrderApplicationFeeDomainObjectAbstract::PAID_AT => $orderApplicationFeeStatus->value === OrderApplicationFeeStatus::PAID->value ? now()->toDateTimeString() : null, diff --git a/backend/app/Services/Domain/Payment/Stripe/DTOs/CreatePaymentIntentRequestDTO.php b/backend/app/Services/Domain/Payment/Stripe/DTOs/CreatePaymentIntentRequestDTO.php index fa27bf2ee6..b1f4f954ce 100644 --- a/backend/app/Services/Domain/Payment/Stripe/DTOs/CreatePaymentIntentRequestDTO.php +++ b/backend/app/Services/Domain/Payment/Stripe/DTOs/CreatePaymentIntentRequestDTO.php @@ -5,14 +5,15 @@ use HiEvents\DataTransferObjects\BaseDTO; use HiEvents\DomainObjects\AccountDomainObject; use HiEvents\DomainObjects\OrderDomainObject; +use HiEvents\Values\MoneyValue; class CreatePaymentIntentRequestDTO extends BaseDTO { public function __construct( - public readonly int $amount, - public readonly string $currencyCode, + public readonly MoneyValue $amount, + public readonly string $currencyCode, public AccountDomainObject $account, - public OrderDomainObject $order, + public OrderDomainObject $order, ) { } diff --git a/backend/app/Services/Domain/Payment/Stripe/EventHandlers/PaymentIntentSucceededHandler.php b/backend/app/Services/Domain/Payment/Stripe/EventHandlers/PaymentIntentSucceededHandler.php index 1da220c18e..9d1ff78bf2 100644 --- a/backend/app/Services/Domain/Payment/Stripe/EventHandlers/PaymentIntentSucceededHandler.php +++ b/backend/app/Services/Domain/Payment/Stripe/EventHandlers/PaymentIntentSucceededHandler.php @@ -233,9 +233,10 @@ private function storeApplicationFeePayment(OrderDomainObject $updatedOrder, Pay { $this->orderApplicationFeeService->createOrderApplicationFee( orderId: $updatedOrder->getId(), - applicationFeeAmount: $paymentIntent->application_fee_amount / 100, + applicationFeeAmountMinorUnit: $paymentIntent->application_fee_amount, orderApplicationFeeStatus: OrderApplicationFeeStatus::PAID, paymentMethod: PaymentProviders::STRIPE, + currency: $updatedOrder->getCurrency(), ); } } diff --git a/backend/app/Services/Domain/Payment/Stripe/StripePaymentIntentCreationService.php b/backend/app/Services/Domain/Payment/Stripe/StripePaymentIntentCreationService.php index 8a9c38d7d3..effef6647a 100644 --- a/backend/app/Services/Domain/Payment/Stripe/StripePaymentIntentCreationService.php +++ b/backend/app/Services/Domain/Payment/Stripe/StripePaymentIntentCreationService.php @@ -64,12 +64,12 @@ public function createPaymentIntent(CreatePaymentIntentRequestDTO $paymentIntent $applicationFee = $this->orderApplicationFeeCalculationService->calculateApplicationFee( accountConfiguration: $paymentIntentDTO->account->getConfiguration(), - orderTotal: $paymentIntentDTO->amount / 100, + orderTotal: $paymentIntentDTO->amount->toFloat(), currency: $paymentIntentDTO->currencyCode, )->toMinorUnit(); $paymentIntent = $this->stripeClient->paymentIntents->create([ - 'amount' => $paymentIntentDTO->amount, + 'amount' => $paymentIntentDTO->amount->toMinorUnit(), 'currency' => $paymentIntentDTO->currencyCode, 'customer' => $this->upsertStripeCustomer($paymentIntentDTO)->getStripeCustomerId(), 'metadata' => [ @@ -103,6 +103,8 @@ public function createPaymentIntent(CreatePaymentIntentRequestDTO $paymentIntent 'paymentIntentDTO' => $paymentIntentDTO->toArray(['account']), ]); + $this->databaseManager->rollBack(); + throw new CreatePaymentIntentFailedException( __('There was an error communicating with the payment provider. Please try again later.') ); @@ -113,18 +115,6 @@ public function createPaymentIntent(CreatePaymentIntentRequestDTO $paymentIntent } } - private function getApplicationFee(CreatePaymentIntentRequestDTO $paymentIntentDTO): float - { - if (!$this->config->get('app.saas_mode_enabled')) { - return 0; - } - - $fixedFee = $paymentIntentDTO->account->getApplicationFee()->fixedFee; - $percentageFee = $paymentIntentDTO->account->getApplicationFee()->percentageFee; - - return ceil(($fixedFee * 100) + ($paymentIntentDTO->amount * $percentageFee / 100)); - } - /** * @throws CreatePaymentIntentFailedException */ diff --git a/backend/app/Services/Infrastructure/CurrencyConversion/CurrencyConversionClientInterface.php b/backend/app/Services/Infrastructure/CurrencyConversion/CurrencyConversionClientInterface.php new file mode 100644 index 0000000000..bf10231066 --- /dev/null +++ b/backend/app/Services/Infrastructure/CurrencyConversion/CurrencyConversionClientInterface.php @@ -0,0 +1,11 @@ +logger = $logger; + } + + public function convert(Currency $fromCurrency, Currency $toCurrency, float $amount): MoneyValue + { + $this->logger->warning( + 'NoOpCurrencyConversionClient is being used. This should only be used as a last resort fallback. Never in production.', + [ + 'fromCurrency' => $fromCurrency->getCurrencyCode(), + 'toCurrency' => $toCurrency->getCurrencyCode(), + 'amount' => $amount, + ] + ); + + return MoneyValue::fromFloat($amount, $toCurrency->getCurrencyCode()); + } +} diff --git a/backend/app/Services/Infrastructure/CurrencyConversion/OpenExchangeRatesCurrencyConversionClient.php b/backend/app/Services/Infrastructure/CurrencyConversion/OpenExchangeRatesCurrencyConversionClient.php new file mode 100644 index 0000000000..1819b67795 --- /dev/null +++ b/backend/app/Services/Infrastructure/CurrencyConversion/OpenExchangeRatesCurrencyConversionClient.php @@ -0,0 +1,102 @@ +apiKey = $apiKey; + } + + /** + * @param Currency $fromCurrency + * @param Currency $toCurrency + * @param float $amount + * @return MoneyValue + * @throws CurrencyConversionErrorException + * @throws InvalidArgumentException + * @throws JsonException + * @throws NumberFormatException + * @throws RoundingNecessaryException + * @throws UnknownCurrencyException + */ + public function convert(Currency $fromCurrency, Currency $toCurrency, float $amount): MoneyValue + { + if ($fromCurrency->getCurrencyCode() === $toCurrency->getCurrencyCode()) { + return MoneyValue::fromFloat($amount, $toCurrency->getCurrencyCode()); + } + + $rates = $this->getRates(); + + $fromCurrencyCode = $fromCurrency->getCurrencyCode(); + $toCurrencyCode = $toCurrency->getCurrencyCode(); + + if (!isset($rates[$fromCurrencyCode], $rates[$toCurrencyCode])) { + throw new CurrencyConversionErrorException("Invalid currency conversion: $fromCurrencyCode to $toCurrencyCode"); + } + + // Since base is USD, we calculate: + // amount in USD = amount / rate[from] + // target amount = amount in USD * rate[to] + + $amountInUsd = $amount / $rates[$fromCurrencyCode]; + $convertedAmount = $amountInUsd * $rates[$toCurrencyCode]; + + return MoneyValue::fromFloat($convertedAmount, $toCurrencyCode); + } + + /** + * @throws InvalidArgumentException + * @throws JsonException + * @throws CurrencyConversionErrorException + */ + private function getRates(): array + { + $cacheKey = 'open_exchange_rates_latest'; + + $rates = $this->cache->get($cacheKey); + + if ($rates === null) { + $url = sprintf('%s?app_id=%s', self::API_URL, $this->apiKey); + + $response = file_get_contents($url); + if ($response === false) { + throw new CurrencyConversionErrorException('Failed to fetch exchange rates from Open Exchange Rates.'); + } + + $data = json_decode($response, true, 512, JSON_THROW_ON_ERROR); + + if (!isset($data['rates']) || !is_array($data['rates'])) { + throw new CurrencyConversionErrorException('Invalid response from Open Exchange Rates API.'); + } + + $rates = $data['rates']; + $this->cache->set($cacheKey, $rates, self::CACHE_TTL); + + $this->logger->info('OpenExchangeRates: Cached latest rates.'); + } + + return $rates; + } +} diff --git a/backend/composer.json b/backend/composer.json index 186f85adb1..e480b19745 100644 --- a/backend/composer.json +++ b/backend/composer.json @@ -11,7 +11,6 @@ "barryvdh/laravel-dompdf": "^3.0", "brick/money": "^0.8.0", "doctrine/dbal": "^3.6", - "druc/laravel-langscanner": "dev-l12-compatibility", "ezyang/htmlpurifier": "^4.17", "guzzlehttp/guzzle": "^7.2", "laravel/framework": "^12.0", @@ -26,9 +25,10 @@ "spatie/icalendar-generator": "^2.8", "spatie/laravel-data": "^4.11", "spatie/laravel-webhook-server": "^3.8", - "stripe/stripe-php": "^10.15" + "stripe/stripe-php": "^17.0" }, "require-dev": { + "druc/laravel-langscanner": "dev-l12-compatibility", "fakerphp/faker": "^1.9.1", "gettext/gettext": "^5.7", "laravel/pint": "^1.0", diff --git a/backend/composer.lock b/backend/composer.lock index c1cdba61c9..43d4bbaed7 100644 --- a/backend/composer.lock +++ b/backend/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "b558058c8bb9c2d1e2960495009769b5", + "content-hash": "926ea94433a0d244b23a4ce430cbbdab", "packages": [ { "name": "amphp/amp", @@ -870,16 +870,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.342.6", + "version": "3.342.24", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "2ad93ef447289da27892707efa683c1ae7ced85f" + "reference": "cd7e1cbed4cb52c3aad31a647d1645594ff208eb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/2ad93ef447289da27892707efa683c1ae7ced85f", - "reference": "2ad93ef447289da27892707efa683c1ae7ced85f", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/cd7e1cbed4cb52c3aad31a647d1645594ff208eb", + "reference": "cd7e1cbed4cb52c3aad31a647d1645594ff208eb", "shasum": "" }, "require": { @@ -961,9 +961,9 @@ "support": { "forum": "https://github.com/aws/aws-sdk-php/discussions", "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.342.6" + "source": "https://github.com/aws/aws-sdk-php/tree/3.342.24" }, - "time": "2025-03-14T18:01:18+00:00" + "time": "2025-04-09T18:22:32+00:00" }, { "name": "barryvdh/laravel-dompdf", @@ -1709,26 +1709,29 @@ }, { "name": "doctrine/deprecations", - "version": "1.1.4", + "version": "1.1.5", "source": { "type": "git", "url": "https://github.com/doctrine/deprecations.git", - "reference": "31610dbb31faa98e6b5447b62340826f54fbc4e9" + "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/31610dbb31faa98e6b5447b62340826f54fbc4e9", - "reference": "31610dbb31faa98e6b5447b62340826f54fbc4e9", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", + "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, + "conflict": { + "phpunit/phpunit": "<=7.5 || >=13" + }, "require-dev": { - "doctrine/coding-standard": "^9 || ^12", - "phpstan/phpstan": "1.4.10 || 2.0.3", + "doctrine/coding-standard": "^9 || ^12 || ^13", + "phpstan/phpstan": "1.4.10 || 2.1.11", "phpstan/phpstan-phpunit": "^1.0 || ^2", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12", "psr/log": "^1 || ^2 || ^3" }, "suggest": { @@ -1748,9 +1751,9 @@ "homepage": "https://www.doctrine-project.org/", "support": { "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/1.1.4" + "source": "https://github.com/doctrine/deprecations/tree/1.1.5" }, - "time": "2024-12-07T21:18:45+00:00" + "time": "2025-04-07T20:06:18+00:00" }, { "name": "doctrine/event-manager", @@ -2231,97 +2234,18 @@ ], "time": "2024-10-09T13:47:03+00:00" }, - { - "name": "druc/laravel-langscanner", - "version": "dev-l12-compatibility", - "source": { - "type": "git", - "url": "https://github.com/laravel-shift/laravel-langscanner.git", - "reference": "a4efee46f730e389a8ae53f7495468d123cfee5c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laravel-shift/laravel-langscanner/zipball/a4efee46f730e389a8ae53f7495468d123cfee5c", - "reference": "a4efee46f730e389a8ae53f7495468d123cfee5c", - "shasum": "" - }, - "require": { - "ext-json": "*", - "illuminate/contracts": "^9.0|^10.0|^11.0|^12.0", - "php": "^8.0", - "spatie/laravel-package-tools": "^1.11.3" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^3.3", - "nunomaduro/collision": "^6.2", - "orchestra/testbench": "^7.02|^9.0|^10.0", - "phpunit/phpunit": "^9.5|^10.1|^11.5.3" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "Druc\\Langscanner\\LangscannerServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "Druc\\Langscanner\\": "src" - } - }, - "autoload-dev": { - "psr-4": { - "Druc\\Langscanner\\Tests\\": "tests" - } - }, - "scripts": { - "test": [ - "./vendor/bin/testbench package:test" - ], - "test-coverage": [ - "vendor/bin/phpunit --coverage-html coverage" - ] - }, - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Constantin Druc", - "email": "druc@pinsmile.com", - "role": "Developer" - } - ], - "description": "Scan missing language translations.", - "homepage": "https://github.com/druc/laravel-langscanner", - "keywords": [ - "druc", - "laravel-langscanner" - ], - "support": { - "source": "https://github.com/laravel-shift/laravel-langscanner/tree/l12-compatibility" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/druc" - } - ], - "time": "2025-02-19T14:38:40+00:00" - }, { "name": "egulias/email-validator", - "version": "4.0.3", + "version": "4.0.4", "source": { "type": "git", "url": "https://github.com/egulias/EmailValidator.git", - "reference": "b115554301161fa21467629f1e1391c1936de517" + "reference": "d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/b115554301161fa21467629f1e1391c1936de517", - "reference": "b115554301161fa21467629f1e1391c1936de517", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa", + "reference": "d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa", "shasum": "" }, "require": { @@ -2367,7 +2291,7 @@ ], "support": { "issues": "https://github.com/egulias/EmailValidator/issues", - "source": "https://github.com/egulias/EmailValidator/tree/4.0.3" + "source": "https://github.com/egulias/EmailValidator/tree/4.0.4" }, "funding": [ { @@ -2375,7 +2299,7 @@ "type": "github" } ], - "time": "2024-12-27T00:36:43+00:00" + "time": "2025-03-06T22:45:56+00:00" }, { "name": "ezyang/htmlpurifier", @@ -2573,16 +2497,16 @@ }, { "name": "guzzlehttp/guzzle", - "version": "7.9.2", + "version": "7.9.3", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "d281ed313b989f213357e3be1a179f02196ac99b" + "reference": "7b2f29fe81dc4da0ca0ea7d42107a0845946ea77" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/d281ed313b989f213357e3be1a179f02196ac99b", - "reference": "d281ed313b989f213357e3be1a179f02196ac99b", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/7b2f29fe81dc4da0ca0ea7d42107a0845946ea77", + "reference": "7b2f29fe81dc4da0ca0ea7d42107a0845946ea77", "shasum": "" }, "require": { @@ -2679,7 +2603,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.9.2" + "source": "https://github.com/guzzle/guzzle/tree/7.9.3" }, "funding": [ { @@ -2695,20 +2619,20 @@ "type": "tidelift" } ], - "time": "2024-07-24T11:22:20+00:00" + "time": "2025-03-27T13:37:11+00:00" }, { "name": "guzzlehttp/promises", - "version": "2.0.4", + "version": "2.2.0", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455" + "reference": "7c69f28996b0a6920945dd20b3857e499d9ca96c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/f9c436286ab2892c7db7be8c8da4ef61ccf7b455", - "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455", + "url": "https://api.github.com/repos/guzzle/promises/zipball/7c69f28996b0a6920945dd20b3857e499d9ca96c", + "reference": "7c69f28996b0a6920945dd20b3857e499d9ca96c", "shasum": "" }, "require": { @@ -2762,7 +2686,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/2.0.4" + "source": "https://github.com/guzzle/promises/tree/2.2.0" }, "funding": [ { @@ -2778,20 +2702,20 @@ "type": "tidelift" } ], - "time": "2024-10-17T10:06:22+00:00" + "time": "2025-03-27T13:27:01+00:00" }, { "name": "guzzlehttp/psr7", - "version": "2.7.0", + "version": "2.7.1", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201" + "reference": "c2270caaabe631b3b44c85f99e5a04bbb8060d16" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/a70f5c95fb43bc83f07c9c948baa0dc1829bf201", - "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/c2270caaabe631b3b44c85f99e5a04bbb8060d16", + "reference": "c2270caaabe631b3b44c85f99e5a04bbb8060d16", "shasum": "" }, "require": { @@ -2878,7 +2802,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.7.0" + "source": "https://github.com/guzzle/psr7/tree/2.7.1" }, "funding": [ { @@ -2894,7 +2818,7 @@ "type": "tidelift" } ], - "time": "2024-07-18T11:15:46+00:00" + "time": "2025-03-27T12:30:47+00:00" }, { "name": "guzzlehttp/uri-template", @@ -3034,16 +2958,16 @@ }, { "name": "jean85/pretty-package-versions", - "version": "2.1.0", + "version": "2.1.1", "source": { "type": "git", "url": "https://github.com/Jean85/pretty-package-versions.git", - "reference": "3c4e5f62ba8d7de1734312e4fff32f67a8daaf10" + "reference": "4d7aa5dab42e2a76d99559706022885de0e18e1a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/3c4e5f62ba8d7de1734312e4fff32f67a8daaf10", - "reference": "3c4e5f62ba8d7de1734312e4fff32f67a8daaf10", + "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/4d7aa5dab42e2a76d99559706022885de0e18e1a", + "reference": "4d7aa5dab42e2a76d99559706022885de0e18e1a", "shasum": "" }, "require": { @@ -3053,8 +2977,9 @@ "require-dev": { "friendsofphp/php-cs-fixer": "^3.2", "jean85/composer-provided-replaced-stub-package": "^1.0", - "phpstan/phpstan": "^1.4", + "phpstan/phpstan": "^2.0", "phpunit/phpunit": "^7.5|^8.5|^9.6", + "rector/rector": "^2.0", "vimeo/psalm": "^4.3 || ^5.0" }, "type": "library", @@ -3087,9 +3012,9 @@ ], "support": { "issues": "https://github.com/Jean85/pretty-package-versions/issues", - "source": "https://github.com/Jean85/pretty-package-versions/tree/2.1.0" + "source": "https://github.com/Jean85/pretty-package-versions/tree/2.1.1" }, - "time": "2024-11-18T16:19:46+00:00" + "time": "2025-03-19T14:43:43+00:00" }, { "name": "kelunik/certificate", @@ -3151,16 +3076,16 @@ }, { "name": "laravel/framework", - "version": "v12.2.0", + "version": "v12.8.1", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "2fb06941bc69ea92f28b2888535ab144ee006889" + "reference": "d1ea3566f6e0cad34834c6d18db0bf995438eb87" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/2fb06941bc69ea92f28b2888535ab144ee006889", - "reference": "2fb06941bc69ea92f28b2888535ab144ee006889", + "url": "https://api.github.com/repos/laravel/framework/zipball/d1ea3566f6e0cad34834c6d18db0bf995438eb87", + "reference": "d1ea3566f6e0cad34834c6d18db0bf995438eb87", "shasum": "" }, "require": { @@ -3362,7 +3287,7 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2025-03-12T14:38:20+00:00" + "time": "2025-04-08T19:58:59+00:00" }, { "name": "laravel/prompts", @@ -3489,16 +3414,16 @@ }, { "name": "laravel/serializable-closure", - "version": "v2.0.3", + "version": "v2.0.4", "source": { "type": "git", "url": "https://github.com/laravel/serializable-closure.git", - "reference": "f379c13663245f7aa4512a7869f62eb14095f23f" + "reference": "b352cf0534aa1ae6b4d825d1e762e35d43f8a841" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/f379c13663245f7aa4512a7869f62eb14095f23f", - "reference": "f379c13663245f7aa4512a7869f62eb14095f23f", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/b352cf0534aa1ae6b4d825d1e762e35d43f8a841", + "reference": "b352cf0534aa1ae6b4d825d1e762e35d43f8a841", "shasum": "" }, "require": { @@ -3546,7 +3471,7 @@ "issues": "https://github.com/laravel/serializable-closure/issues", "source": "https://github.com/laravel/serializable-closure" }, - "time": "2025-02-11T15:03:05+00:00" + "time": "2025-03-19T13:51:03+00:00" }, { "name": "laravel/tinker", @@ -4708,16 +4633,16 @@ }, { "name": "monolog/monolog", - "version": "3.8.1", + "version": "3.9.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "aef6ee73a77a66e404dd6540934a9ef1b3c855b4" + "reference": "10d85740180ecba7896c87e06a166e0c95a0e3b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/aef6ee73a77a66e404dd6540934a9ef1b3c855b4", - "reference": "aef6ee73a77a66e404dd6540934a9ef1b3c855b4", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/10d85740180ecba7896c87e06a166e0c95a0e3b6", + "reference": "10d85740180ecba7896c87e06a166e0c95a0e3b6", "shasum": "" }, "require": { @@ -4795,7 +4720,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/3.8.1" + "source": "https://github.com/Seldaek/monolog/tree/3.9.0" }, "funding": [ { @@ -4807,7 +4732,7 @@ "type": "tidelift" } ], - "time": "2024-12-05T17:15:07+00:00" + "time": "2025-03-24T10:02:05+00:00" }, { "name": "mtdowling/jmespath.php", @@ -4944,16 +4869,16 @@ }, { "name": "nesbot/carbon", - "version": "3.8.6", + "version": "3.9.0", "source": { "type": "git", "url": "https://github.com/CarbonPHP/carbon.git", - "reference": "ff2f20cf83bd4d503720632ce8a426dc747bf7fd" + "reference": "6d16a8a015166fe54e22c042e0805c5363aef50d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/ff2f20cf83bd4d503720632ce8a426dc747bf7fd", - "reference": "ff2f20cf83bd4d503720632ce8a426dc747bf7fd", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/6d16a8a015166fe54e22c042e0805c5363aef50d", + "reference": "6d16a8a015166fe54e22c042e0805c5363aef50d", "shasum": "" }, "require": { @@ -5046,20 +4971,20 @@ "type": "tidelift" } ], - "time": "2025-02-20T17:33:38+00:00" + "time": "2025-03-27T12:57:33+00:00" }, { "name": "nette/php-generator", - "version": "v4.1.7", + "version": "v4.1.8", "source": { "type": "git", "url": "https://github.com/nette/php-generator.git", - "reference": "d201c9bc217e0969d1b678d286be49302972fb56" + "reference": "42806049a7774a2bd316c958f5dcf01c6b5c56fa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/php-generator/zipball/d201c9bc217e0969d1b678d286be49302972fb56", - "reference": "d201c9bc217e0969d1b678d286be49302972fb56", + "url": "https://api.github.com/repos/nette/php-generator/zipball/42806049a7774a2bd316c958f5dcf01c6b5c56fa", + "reference": "42806049a7774a2bd316c958f5dcf01c6b5c56fa", "shasum": "" }, "require": { @@ -5113,9 +5038,9 @@ ], "support": { "issues": "https://github.com/nette/php-generator/issues", - "source": "https://github.com/nette/php-generator/tree/v4.1.7" + "source": "https://github.com/nette/php-generator/tree/v4.1.8" }, - "time": "2024-11-29T01:41:18+00:00" + "time": "2025-03-31T00:29:29+00:00" }, { "name": "nette/schema", @@ -5181,16 +5106,16 @@ }, { "name": "nette/utils", - "version": "v4.0.5", + "version": "v4.0.6", "source": { "type": "git", "url": "https://github.com/nette/utils.git", - "reference": "736c567e257dbe0fcf6ce81b4d6dbe05c6899f96" + "reference": "ce708655043c7050eb050df361c5e313cf708309" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/utils/zipball/736c567e257dbe0fcf6ce81b4d6dbe05c6899f96", - "reference": "736c567e257dbe0fcf6ce81b4d6dbe05c6899f96", + "url": "https://api.github.com/repos/nette/utils/zipball/ce708655043c7050eb050df361c5e313cf708309", + "reference": "ce708655043c7050eb050df361c5e313cf708309", "shasum": "" }, "require": { @@ -5261,9 +5186,9 @@ ], "support": { "issues": "https://github.com/nette/utils/issues", - "source": "https://github.com/nette/utils/tree/v4.0.5" + "source": "https://github.com/nette/utils/tree/v4.0.6" }, - "time": "2024-08-07T15:39:19+00:00" + "time": "2025-03-30T21:06:30+00:00" }, { "name": "nikic/php-parser", @@ -5490,16 +5415,16 @@ }, { "name": "php-open-source-saver/jwt-auth", - "version": "v2.8.1", + "version": "v2.8.2", "source": { "type": "git", "url": "https://github.com/PHP-Open-Source-Saver/jwt-auth.git", - "reference": "cd55a88bc98635983c7f8d6fa915d81eaadeb6e1" + "reference": "9af3bd953b5671247c330562183e159f10700533" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-Open-Source-Saver/jwt-auth/zipball/cd55a88bc98635983c7f8d6fa915d81eaadeb6e1", - "reference": "cd55a88bc98635983c7f8d6fa915d81eaadeb6e1", + "url": "https://api.github.com/repos/PHP-Open-Source-Saver/jwt-auth/zipball/9af3bd953b5671247c330562183e159f10700533", + "reference": "9af3bd953b5671247c330562183e159f10700533", "shasum": "" }, "require": { @@ -5582,7 +5507,7 @@ "issues": "https://github.com/PHP-Open-Source-Saver/jwt-auth/issues", "source": "https://github.com/PHP-Open-Source-Saver/jwt-auth" }, - "time": "2025-02-28T05:02:47+00:00" + "time": "2025-03-17T11:41:37+00:00" }, { "name": "phpdocumentor/reflection", @@ -6640,16 +6565,16 @@ }, { "name": "ramsey/collection", - "version": "2.1.0", + "version": "2.1.1", "source": { "type": "git", "url": "https://github.com/ramsey/collection.git", - "reference": "3c5990b8a5e0b79cd1cf11c2dc1229e58e93f109" + "reference": "344572933ad0181accbf4ba763e85a0306a8c5e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/collection/zipball/3c5990b8a5e0b79cd1cf11c2dc1229e58e93f109", - "reference": "3c5990b8a5e0b79cd1cf11c2dc1229e58e93f109", + "url": "https://api.github.com/repos/ramsey/collection/zipball/344572933ad0181accbf4ba763e85a0306a8c5e2", + "reference": "344572933ad0181accbf4ba763e85a0306a8c5e2", "shasum": "" }, "require": { @@ -6710,9 +6635,9 @@ ], "support": { "issues": "https://github.com/ramsey/collection/issues", - "source": "https://github.com/ramsey/collection/tree/2.1.0" + "source": "https://github.com/ramsey/collection/tree/2.1.1" }, - "time": "2025-03-02T04:48:29+00:00" + "time": "2025-03-22T05:38:12+00:00" }, { "name": "ramsey/uuid", @@ -6936,16 +6861,16 @@ }, { "name": "sabberworm/php-css-parser", - "version": "v8.7.0", + "version": "v8.8.0", "source": { "type": "git", "url": "https://github.com/MyIntervals/PHP-CSS-Parser.git", - "reference": "f414ff953002a9b18e3a116f5e462c56f21237cf" + "reference": "3de493bdddfd1f051249af725c7e0d2c38fed740" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/MyIntervals/PHP-CSS-Parser/zipball/f414ff953002a9b18e3a116f5e462c56f21237cf", - "reference": "f414ff953002a9b18e3a116f5e462c56f21237cf", + "url": "https://api.github.com/repos/MyIntervals/PHP-CSS-Parser/zipball/3de493bdddfd1f051249af725c7e0d2c38fed740", + "reference": "3de493bdddfd1f051249af725c7e0d2c38fed740", "shasum": "" }, "require": { @@ -6953,7 +6878,7 @@ "php": "^5.6.20 || ^7.0.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" }, "require-dev": { - "phpunit/phpunit": "5.7.27 || 6.5.14 || 7.5.20 || 8.5.40" + "phpunit/phpunit": "5.7.27 || 6.5.14 || 7.5.20 || 8.5.41" }, "suggest": { "ext-mbstring": "for parsing UTF-8 CSS" @@ -6995,9 +6920,9 @@ ], "support": { "issues": "https://github.com/MyIntervals/PHP-CSS-Parser/issues", - "source": "https://github.com/MyIntervals/PHP-CSS-Parser/tree/v8.7.0" + "source": "https://github.com/MyIntervals/PHP-CSS-Parser/tree/v8.8.0" }, - "time": "2024-10-27T17:38:32+00:00" + "time": "2025-03-23T17:59:05+00:00" }, { "name": "sentry/sentry", @@ -7255,16 +7180,16 @@ }, { "name": "spatie/icalendar-generator", - "version": "2.9.1", + "version": "2.9.2", "source": { "type": "git", "url": "https://github.com/spatie/icalendar-generator.git", - "reference": "21b8d259156368812a6d55096499f289b265be4e" + "reference": "6fa4d5b20490afeebe711f6cad1733853c667aa2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/icalendar-generator/zipball/21b8d259156368812a6d55096499f289b265be4e", - "reference": "21b8d259156368812a6d55096499f289b265be4e", + "url": "https://api.github.com/repos/spatie/icalendar-generator/zipball/6fa4d5b20490afeebe711f6cad1733853c667aa2", + "reference": "6fa4d5b20490afeebe711f6cad1733853c667aa2", "shasum": "" }, "require": { @@ -7308,22 +7233,22 @@ ], "support": { "issues": "https://github.com/spatie/icalendar-generator/issues", - "source": "https://github.com/spatie/icalendar-generator/tree/2.9.1" + "source": "https://github.com/spatie/icalendar-generator/tree/2.9.2" }, - "time": "2025-01-31T13:50:13+00:00" + "time": "2025-03-21T09:01:17+00:00" }, { "name": "spatie/laravel-data", - "version": "4.14.0", + "version": "4.15.1", "source": { "type": "git", "url": "https://github.com/spatie/laravel-data.git", - "reference": "3e1240353569e8fb64b5859eed01652d5df3358b" + "reference": "cb97afe6c0dadeb2e76ea1b7220cd04ed33dcca9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-data/zipball/3e1240353569e8fb64b5859eed01652d5df3358b", - "reference": "3e1240353569e8fb64b5859eed01652d5df3358b", + "url": "https://api.github.com/repos/spatie/laravel-data/zipball/cb97afe6c0dadeb2e76ea1b7220cd04ed33dcca9", + "reference": "cb97afe6c0dadeb2e76ea1b7220cd04ed33dcca9", "shasum": "" }, "require": { @@ -7336,6 +7261,7 @@ "require-dev": { "fakerphp/faker": "^1.14", "friendsofphp/php-cs-fixer": "^3.0", + "inertiajs/inertia-laravel": "^2.0", "livewire/livewire": "^3.0", "mockery/mockery": "^1.6", "nesbot/carbon": "^2.63|^3.0", @@ -7384,7 +7310,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-data/issues", - "source": "https://github.com/spatie/laravel-data/tree/4.14.0" + "source": "https://github.com/spatie/laravel-data/tree/4.15.1" }, "funding": [ { @@ -7392,20 +7318,20 @@ "type": "github" } ], - "time": "2025-03-14T14:26:23+00:00" + "time": "2025-04-10T06:06:27+00:00" }, { "name": "spatie/laravel-package-tools", - "version": "1.19.0", + "version": "1.92.2", "source": { "type": "git", "url": "https://github.com/spatie/laravel-package-tools.git", - "reference": "1c9c30ac6a6576b8d15c6c37b6cf23d748df2faa" + "reference": "d55de371a6f609772c79a8d4d5e5b8fae11398f5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/1c9c30ac6a6576b8d15c6c37b6cf23d748df2faa", - "reference": "1c9c30ac6a6576b8d15c6c37b6cf23d748df2faa", + "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/d55de371a6f609772c79a8d4d5e5b8fae11398f5", + "reference": "d55de371a6f609772c79a8d4d5e5b8fae11398f5", "shasum": "" }, "require": { @@ -7444,7 +7370,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-package-tools/issues", - "source": "https://github.com/spatie/laravel-package-tools/tree/1.19.0" + "source": "https://github.com/spatie/laravel-package-tools/tree/1.92.2" }, "funding": [ { @@ -7452,7 +7378,7 @@ "type": "github" } ], - "time": "2025-02-06T14:58:20+00:00" + "time": "2025-04-10T14:16:34+00:00" }, { "name": "spatie/laravel-webhook-server", @@ -7609,16 +7535,16 @@ }, { "name": "stripe/stripe-php", - "version": "v10.21.0", + "version": "v17.1.1", "source": { "type": "git", "url": "https://github.com/stripe/stripe-php.git", - "reference": "b4ab319731958077227fad1874a3671458c5d593" + "reference": "01ca9b5fdd899b8e4b69f83b85e09d96f6240220" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/stripe/stripe-php/zipball/b4ab319731958077227fad1874a3671458c5d593", - "reference": "b4ab319731958077227fad1874a3671458c5d593", + "url": "https://api.github.com/repos/stripe/stripe-php/zipball/01ca9b5fdd899b8e4b69f83b85e09d96f6240220", + "reference": "01ca9b5fdd899b8e4b69f83b85e09d96f6240220", "shasum": "" }, "require": { @@ -7628,11 +7554,9 @@ "php": ">=5.6.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "3.5.0", - "php-coveralls/php-coveralls": "^2.5", + "friendsofphp/php-cs-fixer": "3.72.0", "phpstan/phpstan": "^1.2", - "phpunit/phpunit": "^5.7 || ^9.0", - "squizlabs/php_codesniffer": "^3.3" + "phpunit/phpunit": "^5.7 || ^9.0" }, "type": "library", "extra": { @@ -7664,9 +7588,9 @@ ], "support": { "issues": "https://github.com/stripe/stripe-php/issues", - "source": "https://github.com/stripe/stripe-php/tree/v10.21.0" + "source": "https://github.com/stripe/stripe-php/tree/v17.1.1" }, - "time": "2023-08-11T00:23:24+00:00" + "time": "2025-04-05T00:09:14+00:00" }, { "name": "symfony/clock", @@ -7744,16 +7668,16 @@ }, { "name": "symfony/console", - "version": "v7.2.1", + "version": "v7.2.5", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "fefcc18c0f5d0efe3ab3152f15857298868dc2c3" + "reference": "e51498ea18570c062e7df29d05a7003585b19b88" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/fefcc18c0f5d0efe3ab3152f15857298868dc2c3", - "reference": "fefcc18c0f5d0efe3ab3152f15857298868dc2c3", + "url": "https://api.github.com/repos/symfony/console/zipball/e51498ea18570c062e7df29d05a7003585b19b88", + "reference": "e51498ea18570c062e7df29d05a7003585b19b88", "shasum": "" }, "require": { @@ -7817,7 +7741,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.2.1" + "source": "https://github.com/symfony/console/tree/v7.2.5" }, "funding": [ { @@ -7833,7 +7757,7 @@ "type": "tidelift" } ], - "time": "2024-12-11T03:49:26+00:00" + "time": "2025-03-12T08:11:12+00:00" }, { "name": "symfony/css-selector", @@ -7969,16 +7893,16 @@ }, { "name": "symfony/error-handler", - "version": "v7.2.4", + "version": "v7.2.5", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "aabf79938aa795350c07ce6464dd1985607d95d5" + "reference": "102be5e6a8e4f4f3eb3149bcbfa33a80d1ee374b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/aabf79938aa795350c07ce6464dd1985607d95d5", - "reference": "aabf79938aa795350c07ce6464dd1985607d95d5", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/102be5e6a8e4f4f3eb3149bcbfa33a80d1ee374b", + "reference": "102be5e6a8e4f4f3eb3149bcbfa33a80d1ee374b", "shasum": "" }, "require": { @@ -8024,7 +7948,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v7.2.4" + "source": "https://github.com/symfony/error-handler/tree/v7.2.5" }, "funding": [ { @@ -8040,7 +7964,7 @@ "type": "tidelift" } ], - "time": "2025-02-02T20:27:07+00:00" + "time": "2025-03-03T07:12:39+00:00" }, { "name": "symfony/event-dispatcher", @@ -8264,16 +8188,16 @@ }, { "name": "symfony/http-foundation", - "version": "v7.2.3", + "version": "v7.2.5", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "ee1b504b8926198be89d05e5b6fc4c3810c090f0" + "reference": "371272aeb6286f8135e028ca535f8e4d6f114126" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/ee1b504b8926198be89d05e5b6fc4c3810c090f0", - "reference": "ee1b504b8926198be89d05e5b6fc4c3810c090f0", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/371272aeb6286f8135e028ca535f8e4d6f114126", + "reference": "371272aeb6286f8135e028ca535f8e4d6f114126", "shasum": "" }, "require": { @@ -8322,7 +8246,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v7.2.3" + "source": "https://github.com/symfony/http-foundation/tree/v7.2.5" }, "funding": [ { @@ -8338,20 +8262,20 @@ "type": "tidelift" } ], - "time": "2025-01-17T10:56:55+00:00" + "time": "2025-03-25T15:54:33+00:00" }, { "name": "symfony/http-kernel", - "version": "v7.2.4", + "version": "v7.2.5", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "9f1103734c5789798fefb90e91de4586039003ed" + "reference": "b1fe91bc1fa454a806d3f98db4ba826eb9941a54" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/9f1103734c5789798fefb90e91de4586039003ed", - "reference": "9f1103734c5789798fefb90e91de4586039003ed", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/b1fe91bc1fa454a806d3f98db4ba826eb9941a54", + "reference": "b1fe91bc1fa454a806d3f98db4ba826eb9941a54", "shasum": "" }, "require": { @@ -8436,7 +8360,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v7.2.4" + "source": "https://github.com/symfony/http-kernel/tree/v7.2.5" }, "funding": [ { @@ -8452,7 +8376,7 @@ "type": "tidelift" } ], - "time": "2025-02-26T11:01:22+00:00" + "time": "2025-03-28T13:32:50+00:00" }, { "name": "symfony/mailer", @@ -9391,16 +9315,16 @@ }, { "name": "symfony/process", - "version": "v7.2.4", + "version": "v7.2.5", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "d8f411ff3c7ddc4ae9166fb388d1190a2df5b5cf" + "reference": "87b7c93e57df9d8e39a093d32587702380ff045d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/d8f411ff3c7ddc4ae9166fb388d1190a2df5b5cf", - "reference": "d8f411ff3c7ddc4ae9166fb388d1190a2df5b5cf", + "url": "https://api.github.com/repos/symfony/process/zipball/87b7c93e57df9d8e39a093d32587702380ff045d", + "reference": "87b7c93e57df9d8e39a093d32587702380ff045d", "shasum": "" }, "require": { @@ -9432,7 +9356,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v7.2.4" + "source": "https://github.com/symfony/process/tree/v7.2.5" }, "funding": [ { @@ -9448,7 +9372,7 @@ "type": "tidelift" } ], - "time": "2025-02-05T08:33:46+00:00" + "time": "2025-03-13T12:21:46+00:00" }, { "name": "symfony/psr-http-message-bridge", @@ -10387,6 +10311,85 @@ } ], "packages-dev": [ + { + "name": "druc/laravel-langscanner", + "version": "dev-l12-compatibility", + "source": { + "type": "git", + "url": "https://github.com/laravel-shift/laravel-langscanner.git", + "reference": "a4efee46f730e389a8ae53f7495468d123cfee5c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel-shift/laravel-langscanner/zipball/a4efee46f730e389a8ae53f7495468d123cfee5c", + "reference": "a4efee46f730e389a8ae53f7495468d123cfee5c", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/contracts": "^9.0|^10.0|^11.0|^12.0", + "php": "^8.0", + "spatie/laravel-package-tools": "^1.11.3" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.3", + "nunomaduro/collision": "^6.2", + "orchestra/testbench": "^7.02|^9.0|^10.0", + "phpunit/phpunit": "^9.5|^10.1|^11.5.3" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Druc\\Langscanner\\LangscannerServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Druc\\Langscanner\\": "src" + } + }, + "autoload-dev": { + "psr-4": { + "Druc\\Langscanner\\Tests\\": "tests" + } + }, + "scripts": { + "test": [ + "./vendor/bin/testbench package:test" + ], + "test-coverage": [ + "vendor/bin/phpunit --coverage-html coverage" + ] + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Constantin Druc", + "email": "druc@pinsmile.com", + "role": "Developer" + } + ], + "description": "Scan missing language translations.", + "homepage": "https://github.com/druc/laravel-langscanner", + "keywords": [ + "druc", + "laravel-langscanner" + ], + "support": { + "source": "https://github.com/laravel-shift/laravel-langscanner/tree/l12-compatibility" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/druc" + } + ], + "time": "2025-02-19T14:38:40+00:00" + }, { "name": "fakerphp/faker", "version": "v1.24.1", @@ -10597,16 +10600,16 @@ }, { "name": "gettext/languages", - "version": "2.10.0", + "version": "2.12.1", "source": { "type": "git", "url": "https://github.com/php-gettext/Languages.git", - "reference": "4d61d67fe83a2ad85959fe6133d6d9ba7dddd1ab" + "reference": "0b0b0851c55168e1dfb14305735c64019732b5f1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-gettext/Languages/zipball/4d61d67fe83a2ad85959fe6133d6d9ba7dddd1ab", - "reference": "4d61d67fe83a2ad85959fe6133d6d9ba7dddd1ab", + "url": "https://api.github.com/repos/php-gettext/Languages/zipball/0b0b0851c55168e1dfb14305735c64019732b5f1", + "reference": "0b0b0851c55168e1dfb14305735c64019732b5f1", "shasum": "" }, "require": { @@ -10616,7 +10619,8 @@ "phpunit/phpunit": "^4.8 || ^5.7 || ^6.5 || ^7.5 || ^8.4" }, "bin": [ - "bin/export-plural-rules" + "bin/export-plural-rules", + "bin/import-cldr-data" ], "type": "library", "autoload": { @@ -10655,7 +10659,7 @@ ], "support": { "issues": "https://github.com/php-gettext/Languages/issues", - "source": "https://github.com/php-gettext/Languages/tree/2.10.0" + "source": "https://github.com/php-gettext/Languages/tree/2.12.1" }, "funding": [ { @@ -10667,7 +10671,7 @@ "type": "github" } ], - "time": "2022-10-18T15:00:10+00:00" + "time": "2025-03-19T11:14:02+00:00" }, { "name": "hamcrest/hamcrest-php", @@ -10722,16 +10726,16 @@ }, { "name": "laravel/pint", - "version": "v1.21.2", + "version": "v1.22.0", "source": { "type": "git", "url": "https://github.com/laravel/pint.git", - "reference": "370772e7d9e9da087678a0edf2b11b6960e40558" + "reference": "7ddfaa6523a675fae5c4123ee38fc6bfb8ee4f36" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/pint/zipball/370772e7d9e9da087678a0edf2b11b6960e40558", - "reference": "370772e7d9e9da087678a0edf2b11b6960e40558", + "url": "https://api.github.com/repos/laravel/pint/zipball/7ddfaa6523a675fae5c4123ee38fc6bfb8ee4f36", + "reference": "7ddfaa6523a675fae5c4123ee38fc6bfb8ee4f36", "shasum": "" }, "require": { @@ -10742,9 +10746,9 @@ "php": "^8.2.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^3.72.0", + "friendsofphp/php-cs-fixer": "^3.75.0", "illuminate/view": "^11.44.2", - "larastan/larastan": "^3.2.0", + "larastan/larastan": "^3.3.1", "laravel-zero/framework": "^11.36.1", "mockery/mockery": "^1.6.12", "nunomaduro/termwind": "^2.3", @@ -10784,7 +10788,7 @@ "issues": "https://github.com/laravel/pint/issues", "source": "https://github.com/laravel/pint" }, - "time": "2025-03-14T22:31:42+00:00" + "time": "2025-04-08T22:11:45+00:00" }, { "name": "laravel/sail", @@ -10994,38 +10998,39 @@ }, { "name": "nunomaduro/collision", - "version": "v8.7.0", + "version": "v8.8.0", "source": { "type": "git", "url": "https://github.com/nunomaduro/collision.git", - "reference": "586cb8181a257a2152b6a855ca8d9598878a1a26" + "reference": "4cf9f3b47afff38b139fb79ce54fc71799022ce8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/collision/zipball/586cb8181a257a2152b6a855ca8d9598878a1a26", - "reference": "586cb8181a257a2152b6a855ca8d9598878a1a26", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/4cf9f3b47afff38b139fb79ce54fc71799022ce8", + "reference": "4cf9f3b47afff38b139fb79ce54fc71799022ce8", "shasum": "" }, "require": { - "filp/whoops": "^2.17.0", + "filp/whoops": "^2.18.0", "nunomaduro/termwind": "^2.3.0", "php": "^8.2.0", - "symfony/console": "^7.2.1" + "symfony/console": "^7.2.5" }, "conflict": { - "laravel/framework": "<11.39.1 || >=13.0.0", - "phpunit/phpunit": "<11.5.3 || >=12.0.0" + "laravel/framework": "<11.44.2 || >=13.0.0", + "phpunit/phpunit": "<11.5.15 || >=13.0.0" }, "require-dev": { - "larastan/larastan": "^2.10.0", - "laravel/framework": "^11.44.2", + "brianium/paratest": "^7.8.3", + "larastan/larastan": "^3.2", + "laravel/framework": "^11.44.2 || ^12.6", "laravel/pint": "^1.21.2", "laravel/sail": "^1.41.0", "laravel/sanctum": "^4.0.8", "laravel/tinker": "^2.10.1", - "orchestra/testbench-core": "^9.12.0", - "pestphp/pest": "^3.7.4", - "sebastian/environment": "^6.1.0 || ^7.2.0" + "orchestra/testbench-core": "^9.12.0 || ^10.1", + "pestphp/pest": "^3.8.0", + "sebastian/environment": "^7.2.0 || ^8.0" }, "type": "library", "extra": { @@ -11088,7 +11093,7 @@ "type": "patreon" } ], - "time": "2025-03-14T22:37:40+00:00" + "time": "2025-04-03T14:33:09+00:00" }, { "name": "phar-io/manifest", @@ -11533,16 +11538,16 @@ }, { "name": "phpunit/phpunit", - "version": "11.5.12", + "version": "11.5.17", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "d42785840519401ed2113292263795eb4c0f95da" + "reference": "fd2e863a2995cdfd864fb514b5e0b28b09895b5c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/d42785840519401ed2113292263795eb4c0f95da", - "reference": "d42785840519401ed2113292263795eb4c0f95da", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/fd2e863a2995cdfd864fb514b5e0b28b09895b5c", + "reference": "fd2e863a2995cdfd864fb514b5e0b28b09895b5c", "shasum": "" }, "require": { @@ -11562,14 +11567,14 @@ "phpunit/php-text-template": "^4.0.1", "phpunit/php-timer": "^7.0.1", "sebastian/cli-parser": "^3.0.2", - "sebastian/code-unit": "^3.0.2", + "sebastian/code-unit": "^3.0.3", "sebastian/comparator": "^6.3.1", "sebastian/diff": "^6.0.2", "sebastian/environment": "^7.2.0", "sebastian/exporter": "^6.3.0", "sebastian/global-state": "^7.0.2", "sebastian/object-enumerator": "^6.0.1", - "sebastian/type": "^5.1.0", + "sebastian/type": "^5.1.2", "sebastian/version": "^5.0.2", "staabm/side-effects-detector": "^1.0.5" }, @@ -11614,7 +11619,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.12" + "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.17" }, "funding": [ { @@ -11630,7 +11635,7 @@ "type": "tidelift" } ], - "time": "2025-03-07T07:31:03+00:00" + "time": "2025-04-08T07:59:11+00:00" }, { "name": "sebastian/cli-parser", @@ -11691,16 +11696,16 @@ }, { "name": "sebastian/code-unit", - "version": "3.0.2", + "version": "3.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/code-unit.git", - "reference": "ee88b0cdbe74cf8dd3b54940ff17643c0d6543ca" + "reference": "54391c61e4af8078e5b276ab082b6d3c54c9ad64" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/ee88b0cdbe74cf8dd3b54940ff17643c0d6543ca", - "reference": "ee88b0cdbe74cf8dd3b54940ff17643c0d6543ca", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/54391c61e4af8078e5b276ab082b6d3c54c9ad64", + "reference": "54391c61e4af8078e5b276ab082b6d3c54c9ad64", "shasum": "" }, "require": { @@ -11736,7 +11741,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/code-unit/issues", "security": "https://github.com/sebastianbergmann/code-unit/security/policy", - "source": "https://github.com/sebastianbergmann/code-unit/tree/3.0.2" + "source": "https://github.com/sebastianbergmann/code-unit/tree/3.0.3" }, "funding": [ { @@ -11744,7 +11749,7 @@ "type": "github" } ], - "time": "2024-12-12T09:59:06+00:00" + "time": "2025-03-19T07:56:08+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", @@ -12449,16 +12454,16 @@ }, { "name": "sebastian/type", - "version": "5.1.0", + "version": "5.1.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "461b9c5da241511a2a0e8f240814fb23ce5c0aac" + "reference": "a8a7e30534b0eb0c77cd9d07e82de1a114389f5e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/461b9c5da241511a2a0e8f240814fb23ce5c0aac", - "reference": "461b9c5da241511a2a0e8f240814fb23ce5c0aac", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/a8a7e30534b0eb0c77cd9d07e82de1a114389f5e", + "reference": "a8a7e30534b0eb0c77cd9d07e82de1a114389f5e", "shasum": "" }, "require": { @@ -12494,7 +12499,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/type/issues", "security": "https://github.com/sebastianbergmann/type/security/policy", - "source": "https://github.com/sebastianbergmann/type/tree/5.1.0" + "source": "https://github.com/sebastianbergmann/type/tree/5.1.2" }, "funding": [ { @@ -12502,7 +12507,7 @@ "type": "github" } ], - "time": "2024-09-17T13:12:04+00:00" + "time": "2025-03-18T13:35:50+00:00" }, { "name": "sebastian/version", @@ -12992,16 +12997,16 @@ }, { "name": "symfony/yaml", - "version": "v7.2.3", + "version": "v7.2.5", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "ac238f173df0c9c1120f862d0f599e17535a87ec" + "reference": "4c4b6f4cfcd7e52053f0c8bfad0f7f30fb924912" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/ac238f173df0c9c1120f862d0f599e17535a87ec", - "reference": "ac238f173df0c9c1120f862d0f599e17535a87ec", + "url": "https://api.github.com/repos/symfony/yaml/zipball/4c4b6f4cfcd7e52053f0c8bfad0f7f30fb924912", + "reference": "4c4b6f4cfcd7e52053f0c8bfad0f7f30fb924912", "shasum": "" }, "require": { @@ -13044,7 +13049,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v7.2.3" + "source": "https://github.com/symfony/yaml/tree/v7.2.5" }, "funding": [ { @@ -13060,7 +13065,7 @@ "type": "tidelift" } ], - "time": "2025-01-07T12:55:42+00:00" + "time": "2025-03-03T07:12:39+00:00" }, { "name": "theseer/tokenizer", diff --git a/backend/config/services.php b/backend/config/services.php index f3e2c74972..f8faf1c875 100644 --- a/backend/config/services.php +++ b/backend/config/services.php @@ -36,4 +36,7 @@ 'public_key' => env('STRIPE_PUBLIC_KEY'), 'webhook_secret' => env('STRIPE_WEBHOOK_SECRET'), ], + 'open_exchange_rates' => [ + 'app_id' => env('OPEN_EXCHANGE_RATES_APP_ID'), + ], ]; diff --git a/backend/data/currencies.php b/backend/data/currencies.php index c6adcaa92d..7a739af584 100644 --- a/backend/data/currencies.php +++ b/backend/data/currencies.php @@ -1,7 +1,8 @@ 'AOA', 'Argentine Peso' => 'ARS', 'Australian Dollar' => 'AUD', - 'Aruban Florin' => 'AWG', 'Azerbaijani Manat' => 'AZN', 'Bosnia & Herzegovina Convertible Mark' => 'BAM', 'Barbadian or Bajan Dollar' => 'BBD', @@ -25,7 +25,6 @@ 'Bolivian Bolíviano' => 'BOB', 'Brazilian Real' => 'BRL', 'Bahamian Dollar' => 'BSD', - 'Bhutanese Ngultrum' => 'BTN', 'Botswana Pula' => 'BWP', 'Belarusian Ruble' => 'BYN', 'Belizean Dollar' => 'BZD', @@ -36,8 +35,6 @@ 'Chinese Yuan Renminbi' => 'CNY', 'Colombian Peso' => 'COP', 'Costa Rican Colon' => 'CRC', - 'Cuban Convertible Peso' => 'CUC', - 'Cuban Peso' => 'CUP', 'Cape Verdean Escudo' => 'CVE', 'Czech Koruna' => 'CZK', 'Djiboutian Franc' => 'DJF', @@ -49,10 +46,8 @@ 'Ethiopian Birr' => 'ETB', 'Euro' => 'EUR', 'Fijian Dollar' => 'FJD', - 'Falkland Island Pound' => 'FKP', 'British Pound' => 'GBP', 'Georgian Lari' => 'GEL', - 'Guernsey Pound' => 'GGP', 'Ghanaian Cedi' => 'GHS', 'Gibraltar Pound' => 'GIP', 'Gambian Dalasi' => 'GMD', @@ -62,16 +57,12 @@ 'Hong Kong Dollar' => 'HKD', 'Honduran Lempira' => 'HNL', 'Croatian Kuna' => 'HRK', - 'Haitian Gourde' => 'HTG', 'Hungarian Forint' => 'HUF', 'Indonesian Rupiah' => 'IDR', 'Israeli Shekel' => 'ILS', - 'Isle of Man Pound' => 'IMP', 'Indian Rupee' => 'INR', 'Iraqi Dinar' => 'IQD', - 'Iranian Rial' => 'IRR', 'Icelandic Krona' => 'ISK', - 'Jersey Pound' => 'JEP', 'Jamaican Dollar' => 'JMD', 'Jordanian Dinar' => 'JOD', 'Japanese Yen' => 'JPY', @@ -79,7 +70,6 @@ 'Kyrgyzstani Som' => 'KGS', 'Cambodian Riel' => 'KHR', 'Comorian Franc' => 'KMF', - 'North Korean Won' => 'KPW', 'South Korean Won' => 'KRW', 'Kuwaiti Dinar' => 'KWD', 'Caymanian Dollar' => 'KYD', @@ -88,7 +78,6 @@ 'Lebanese Pound' => 'LBP', 'Sri Lankan Rupee' => 'LKR', 'Liberian Dollar' => 'LRD', - 'Basotho Loti' => 'LSL', 'Libyan Dinar' => 'LYD', 'Moroccan Dirham' => 'MAD', 'Moldovan Leu' => 'MDL', @@ -97,7 +86,6 @@ 'Burmese Kyat' => 'MMK', 'Mongolian Tughrik' => 'MNT', 'Macau Pataca' => 'MOP', - 'Mauritanian Ouguiya' => 'MRO', 'Mauritian Rupee' => 'MUR', 'Maldivian Rufiyaa' => 'MVR', 'Malawian Kwacha' => 'MWK', @@ -132,11 +120,9 @@ 'Saint Helenian Pound' => 'SHP', 'Sierra Leonean Leone' => 'SLL', 'Somali Shilling' => 'SOS', - 'Seborgan Luigino' => 'SPL', 'Surinamese Dollar' => 'SRD', 'Sao Tomean Dobra' => 'STD', 'Salvadoran Colon' => 'SVC', - 'Syrian Pound' => 'SYP', 'Swazi Lilangeni' => 'SZL', 'Thai Baht' => 'THB', 'Tajikistani Somoni' => 'TJS', @@ -145,7 +131,6 @@ 'Tongan Pa\'anga' => 'TOP', 'Turkish Lira' => 'TRY', 'Trinidadian Dollar' => 'TTD', - 'Tuvaluan Dollar' => 'TVD', 'Taiwan New Dollar' => 'TWD', 'Tanzanian Shilling' => 'TZS', 'Ukrainian Hryvnia' => 'UAH', @@ -153,22 +138,14 @@ 'United States Dollar' => 'USD', 'Uruguayan Peso' => 'UYU', 'Uzbekistani Som' => 'UZS', - 'Venezuelan Bolívar' => 'VEF', 'Vietnamese Dong' => 'VND', - 'Ni-Vanuatu Vatu' => 'VUV', + 'Vanuatu Vatu' => 'VUV', 'Samoan Tala' => 'WST', - 'Central African CFA Franc BEAC' => 'XAF', - 'Silver Ounce' => 'XAG', - 'Gold Ounce' => 'XAU', 'East Caribbean Dollar' => 'XCD', - 'IMF Special Drawing Rights' => 'XDR', - 'CFA Franc' => 'XOF', - 'Palladium Ounce' => 'XPD', + 'Central African CFA Franc BEAC' => 'XAF', + 'West African CFA Franc' => 'XOF', 'CFP Franc' => 'XPF', - 'Platinum Ounce' => 'XPT', 'Yemeni Rial' => 'YER', 'South African Rand' => 'ZAR', 'Zambian Kwacha' => 'ZMW', - 'Zimbabwean Dollar' => 'ZWD', ]; - diff --git a/frontend/data/currencies.ts b/frontend/data/currencies.ts index dae1979783..ffb7980a0d 100644 --- a/frontend/data/currencies.ts +++ b/frontend/data/currencies.ts @@ -40,8 +40,6 @@ export const currencies = { "Congolese Franc": "CDF", "Costa Rican Colon": "CRC", "Croatian Kuna": "HRK", - "Cuban Convertible Peso": "CUC", - "Cuban Peso": "CUP", "Czech Koruna": "CZK", "Danish Krone": "DKK", "Djiboutian Franc": "DJF", @@ -51,32 +49,24 @@ export const currencies = { "Eritrean Nakfa": "ERN", "Ethiopian Birr": "ETB", "Euro": "EUR", - "Falkland Island Pound": "FKP", "Fijian Dollar": "FJD", "Gambian Dalasi": "GMD", "Georgian Lari": "GEL", "Ghanaian Cedi": "GHS", "Gibraltar Pound": "GIP", - "Gold Ounce": "XAU", "Guatemalan Quetzal": "GTQ", - "Guernsey Pound": "GGP", "Guinean Franc": "GNF", "Guyanese Dollar": "GYD", - "Haitian Gourde": "HTG", "Honduran Lempira": "HNL", "Hong Kong Dollar": "HKD", "Hungarian Forint": "HUF", - "IMF Special Drawing Rights": "XDR", "Icelandic Krona": "ISK", "Indian Rupee": "INR", "Indonesian Rupiah": "IDR", - "Iranian Rial": "IRR", "Iraqi Dinar": "IQD", - "Isle of Man Pound": "IMP", "Israeli Shekel": "ILS", "Jamaican Dollar": "JMD", "Japanese Yen": "JPY", - "Jersey Pound": "JEP", "Jordanian Dinar": "JOD", "Kazakhstani Tenge": "KZT", "Kenyan Shilling": "KES", @@ -92,7 +82,6 @@ export const currencies = { "Malawian Kwacha": "MWK", "Malaysian Ringgit": "MYR", "Maldivian Rufiyaa": "MVR", - "Mauritanian Ouguiya": "MRO", "Mauritian Rupee": "MUR", "Mexican Peso": "MXN", "Moldovan Leu": "MDL", @@ -105,17 +94,14 @@ export const currencies = { "Ni-Vanuatu Vatu": "VUV", "Nicaraguan Cordoba": "NIO", "Nigerian Naira": "NGN", - "North Korean Won": "KPW", "Norwegian Krone": "NOK", "Omani Rial": "OMR", "Pakistani Rupee": "PKR", - "Palladium Ounce": "XPD", "Panamanian Balboa": "PAB", "Papua New Guinean Kina": "PGK", "Paraguayan Guarani": "PYG", "Peruvian Sol": "PEN", "Philippine Peso": "PHP", - "Platinum Ounce": "XPT", "Polish Zloty": "PLN", "Qatari Riyal": "QAR", "Romanian Leu": "RON", @@ -124,13 +110,10 @@ export const currencies = { "Saint Helenian Pound": "SHP", "Salvadoran Colon": "SVC", "Samoan Tala": "WST", - "Sao Tomean Dobra": "STD", "Saudi Arabian Riyal": "SAR", - "Seborgan Luigino": "SPL", "Serbian Dinar": "RSD", "Seychellois Rupee": "SCR", "Sierra Leonean Leone": "SLL", - "Silver Ounce": "XAG", "Singapore Dollar": "SGD", "Solomon Islander Dollar": "SBD", "Somali Shilling": "SOS", @@ -142,7 +125,6 @@ export const currencies = { "Swazi Lilangeni": "SZL", "Swedish Krona": "SEK", "Swiss Franc": "CHF", - "Syrian Pound": "SYP", "Taiwan New Dollar": "TWD", "Tajikistani Somoni": "TJS", "Tanzanian Shilling": "TZS", @@ -152,24 +134,18 @@ export const currencies = { "Tunisian Dinar": "TND", "Turkish Lira": "TRY", "Turkmenistani Manat": "TMT", - "Tuvaluan Dollar": "TVD", "Ugandan Shilling": "UGX", "Ukrainian Hryvnia": "UAH", "United Arab Emirates Dirham": "AED", "United States Dollar": "USD", "Uruguayan Peso": "UYU", "Uzbekistani Som": "UZS", - "Venezuelan Bol\u00edvar": "VEF", "Vietnamese Dong": "VND", "Yemeni Rial": "YER", - "Zambian Kwacha": "ZMW", - "Zimbabwean Dollar": "ZWD" -} + "Zambian Kwacha": "ZMW" +}; -export const currenciesMap = Object.entries(currencies).map(([k, v]) => { - //todo - return long currency name - return { - value: v, - label: k, - } -}); \ No newline at end of file +export const currenciesMap = Object.entries(currencies).map(([k, v]) => ({ + value: v, + label: k, +})); diff --git a/frontend/package.json b/frontend/package.json index 579dce4eae..9f51a4c9f6 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -41,9 +41,11 @@ "@stripe/stripe-js": "^1.54.1", "@tabler/icons-react": "^2.44.0", "@tanstack/react-query": "5.52.2", + "@tiptap/extension-color": "^2.11.7", "@tiptap/extension-image": "^2.11.5", "@tiptap/extension-link": "^2.1.13", "@tiptap/extension-text-align": "^2.1.13", + "@tiptap/extension-text-style": "^2.11.7", "@tiptap/extension-underline": "^2.1.13", "@tiptap/pm": "^2.1.13", "@tiptap/react": "^2.1.13", diff --git a/frontend/src/components/common/Editor/index.tsx b/frontend/src/components/common/Editor/index.tsx index 0c954cf420..064b1b2bf1 100644 --- a/frontend/src/components/common/Editor/index.tsx +++ b/frontend/src/components/common/Editor/index.tsx @@ -4,6 +4,8 @@ import StarterKit from '@tiptap/starter-kit'; import Underline from '@tiptap/extension-underline'; import TextAlign from '@tiptap/extension-text-align'; import Image from '@tiptap/extension-image'; +import TextStyle from '@tiptap/extension-text-style'; +import Color from '@tiptap/extension-color'; import React, {useEffect, useState} from "react"; import {InputDescription, InputError, InputLabel} from "@mantine/core"; import classes from "./Editor.module.scss"; @@ -44,7 +46,9 @@ export const Editor = ({ Link, TextAlign.configure({types: ['heading', 'paragraph']}), Image, - ImageResize + ImageResize, + TextStyle, + Color ], onUpdate: ({editor}) => { const html = editor.getHTML(); @@ -92,6 +96,24 @@ export const Editor = ({ + @@ -130,6 +152,24 @@ export const Editor = ({ + diff --git a/frontend/yarn.lock b/frontend/yarn.lock index fe20bf5a9f..bbd15dc222 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -1435,6 +1435,11 @@ resolved "https://registry.yarnpkg.com/@tiptap/extension-code/-/extension-code-2.11.5.tgz#a550c544804e65507ab66dc8ab89a1e2f7d9228d" integrity sha512-xOvHevNIQIcCCVn9tpvXa1wBp0wHN/2umbAZGTVzS+AQtM7BTo0tz8IyzwxkcZJaImONcUVYLOLzt2AgW1LltA== +"@tiptap/extension-color@^2.11.7": + version "2.11.7" + resolved "https://registry.yarnpkg.com/@tiptap/extension-color/-/extension-color-2.11.7.tgz#c5222456d2f017391707fe86d4f7f811faa60968" + integrity sha512-2CWb0Qnh8Crf9OwnnWB+M1QJtWrbn6IMSwuOzk+tSzdWSazjN8h6XAZVemr0qMdAA/SyUigzorStiPxN6o3/vQ== + "@tiptap/extension-document@^2.11.5": version "2.11.5" resolved "https://registry.yarnpkg.com/@tiptap/extension-document/-/extension-document-2.11.5.tgz#1d650d232df46cf07b83e0a5cc64db1c70057f37" @@ -1524,6 +1529,11 @@ resolved "https://registry.yarnpkg.com/@tiptap/extension-text-style/-/extension-text-style-2.11.5.tgz#f1b3882de489328203187e6256e6ee130477cfad" integrity sha512-YUmYl0gILSd/u/ZkOmNxjNXVw+mu8fpC2f8G4I4tLODm0zCx09j9DDEJXSrM5XX72nxJQqtSQsCpNKnL0hfeEQ== +"@tiptap/extension-text-style@^2.11.7": + version "2.11.7" + resolved "https://registry.yarnpkg.com/@tiptap/extension-text-style/-/extension-text-style-2.11.7.tgz#1af9c23ed6154680eac1c0621d1112764c3fafb9" + integrity sha512-LHO6DBg/9SkCQFdWlVfw9nolUmw+Cid94WkTY+7IwrpyG2+ZGQxnKpCJCKyeaFNbDoYAtvu0vuTsSXeCkgShcA== + "@tiptap/extension-text@^2.11.5": version "2.11.5" resolved "https://registry.yarnpkg.com/@tiptap/extension-text/-/extension-text-2.11.5.tgz#10cc6ec519aac71a6841ec9bd914ded747f6ec3f"