Merge pull request #7942 from turbo124/v5-stable

v5.5.39
This commit is contained in:
David Bomba 2022-11-14 10:12:51 +11:00 committed by GitHub
commit 5f9b019fee
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
38 changed files with 23681 additions and 23499 deletions

View File

@ -3,7 +3,6 @@
</p>
![v5-develop phpunit](https://github.com/invoiceninja/invoiceninja/workflows/phpunit/badge.svg?branch=v5-develop)
![v5-stable phpunit](https://github.com/invoiceninja/invoiceninja/workflows/phpunit/badge.svg?branch=v5-stable)
[![Codacy Badge](https://app.codacy.com/project/badge/Grade/d16c78aad8574466bf83232b513ef4fb)](https://www.codacy.com/gh/turbo124/invoiceninja/dashboard?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=turbo124/invoiceninja&amp;utm_campaign=Badge_Grade)
<a href="https://cla-assistant.io/invoiceninja/invoiceninja"><img src="https://cla-assistant.io/readme/badge/invoiceninja/invoiceninja" alt="CLA assistant" /></a>

View File

@ -1 +1 @@
5.5.38
5.5.39

View File

@ -15,6 +15,7 @@ use App\Libraries\MultiDB;
use App\Models\Backup;
use App\Models\Company;
use App\Models\Design;
use App\Models\Document;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Storage;
use stdClass;
@ -76,29 +77,51 @@ class BackupUpdate extends Command
set_time_limit(0);
//logos
Company::query()
->cursor()
Company::cursor()
->each(function ($company){
$logo = @file_get_contents($company->present()->logo());
$company_logo = $company->present()->logo();
if($company_logo == 'https://invoicing.co/images/new_logo.png')
return;
$logo = @file_get_contents($company_logo);
if($logo){
$path = str_replace("https://object.invoicing.co/", "", $company->present()->logo());
$path = str_replace("https://objects.invoicing.co/", "", $company->present()->logo());
$path = str_replace("https://v5-at-backup.us-southeast-1.linodeobjects.com/", "", $path);
Storage::disk($this->option('disk'))->put($path, $logo);
}
});
//documents
Document::cursor()
->each(function ($document){
$doc_bin = $document->getFile();
if($doc_bin)
Storage::disk($this->option('disk'))->put($document->url, $doc_bin);
});
//backups
Backup::cursor()
->each(function ($backup){
$backup_bin = Storage::disk('s3')->get($backup->filename);
if($backup_bin)
Storage::disk($this->option('disk'))->put($backup->filename, $backup_bin);
});
}
}

View File

@ -102,6 +102,9 @@ class ProductFilters extends QueryFilters
{
$sort_col = explode('|', $sort);
if(!is_array($sort_col))
return $this->builder;
return $this->builder->orderBy($sort_col[0], $sort_col[1]);
}

View File

@ -0,0 +1,92 @@
<?php
/**
* Invoice Ninja (https://invoiceninja.com).
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2022. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\Helpers\Epc;
use App\Models\Company;
use App\Models\Invoice;
use App\Utils\Ninja;
use BaconQrCode\Renderer\ImageRenderer;
use BaconQrCode\Renderer\Image\SvgImageBackEnd;
use BaconQrCode\Renderer\RendererStyle\RendererStyle;
use BaconQrCode\Writer;
/**
* EpcQrGenerator.
*/
class EpcQrGenerator
{
private array $sepa = [
'serviceTag' => 'BCD',
'version' => 2,
'characterSet' => 1,
'identification' => 'SCT',
'bic' => '',
'purpose' => '',
];
public function __construct(protected Company $company, protected Invoice $invoice, protected float $amount){}
public function getQrCode()
{
$renderer = new ImageRenderer(
new RendererStyle(200),
new SvgImageBackEnd()
);
$writer = new Writer($renderer);
$this->validateFields();
$qr = $writer->writeString($this->encodeMessage());
return "<svg viewBox='0 0 200 200' width='200' height='200' x='0' y='0' xmlns='http://www.w3.org/2000/svg'>
<rect x='0' y='0' width='100%'' height='100%' />{$qr}</svg>";
}
public function encodeMessage()
{
return rtrim(implode("\n", array(
$this->sepa['serviceTag'],
sprintf('%03d', $this->sepa['version']),
$this->sepa['characterSet'],
$this->sepa['identification'],
isset($this->company?->custom_fields?->company2) ? $this->company->settings->custom_value2 : '',
$this->company->present()->name(),
isset($this->company?->custom_fields?->company1) ? $this->company->settings->custom_value1 : '',
$this->formatMoney($this->amount),
$this->sepa['purpose'],
substr($this->invoice->number,0,34),
substr($this->invoice->public_notes,0,139),
''
)), "\n");
}
private function validateFields()
{
if(Ninja::isSelfHost() && isset($this->company?->custom_fields?->company2))
nlog('The BIC field is not present and _may_ be a required fields for EPC QR codes');
if(Ninja::isSelfHost() && isset($this->company?->custom_fields?->company1))
nlog('The IBAN field is required');
}
private function formatMoney($value) {
return sprintf('EUR%s', number_format($value, 2, '.', ''));
}
}

View File

@ -24,7 +24,7 @@ use App\Http\Requests\BankIntegration\UpdateBankIntegrationRequest;
use App\Jobs\Bank\ProcessBankTransactions;
use App\Models\BankIntegration;
use App\Repositories\BankIntegrationRepository;
use App\Services\Bank\BankService;
use App\Services\Bank\BankMatchingService;
use App\Transformers\BankIntegrationTransformer;
use App\Utils\Traits\MakesHash;
use Illuminate\Http\Request;

View File

@ -27,7 +27,7 @@ use App\Http\Requests\Import\PreImportRequest;
use App\Jobs\Bank\MatchBankTransactions;
use App\Models\BankTransaction;
use App\Repositories\BankTransactionRepository;
use App\Services\Bank\BankService;
use App\Services\Bank\BankMatchingService;
use App\Transformers\BankTransactionTransformer;
use App\Utils\Traits\MakesHash;
use Illuminate\Http\Request;

View File

@ -12,6 +12,7 @@
namespace App\Http\Controllers;
use App\Models\Account;
use App\Models\BankTransaction;
use App\Models\Company;
use App\Models\User;
use App\Transformers\ArraySerializer;
@ -819,12 +820,15 @@ class BaseController extends Controller
// 10-01-2022 need to ensure we snake case properly here to ensure permissions work as expected
// 28-03-2022 this is definitely correct here, do not append _ to the view, it resolved correctly when snake cased
if (auth()->user() && ! auth()->user()->hasPermission('view'.lcfirst(class_basename(Str::snake($this->entity_type))))) {
//06-10-2022 - some entities do not have assigned_user_id - this becomes an issue when we have a large company and low permission users
if(lcfirst(class_basename(Str::snake($this->entity_type))) == 'user')
$query->where('id', auth()->user()->id);
elseif($this->entity_type == BankTransaction::class){ //table without assigned_user_id
$query->where('user_id', '=', auth()->user()->id);
}
elseif(in_array(lcfirst(class_basename(Str::snake($this->entity_type))),['design','group_setting','payment_term'])){
//need to pass these back regardless
nlog($this->entity_type);
}
else
$query->where('user_id', '=', auth()->user()->id)->orWhere('assigned_user_id', auth()->user()->id);
@ -996,6 +1000,42 @@ class BaseController extends Controller
return redirect('/setup');
}
public function reactCatch()
{
if ((bool) $this->checkAppSetup() !== false && $account = Account::first()) {
if (config('ninja.require_https') && ! request()->isSecure()) {
return redirect()->secure(request()->getRequestUri());
}
$data = [];
//pass report errors bool to front end
$data['report_errors'] = Ninja::isSelfHost() ? $account->report_errors : true;
//pass referral code to front end
$data['rc'] = request()->has('rc') ? request()->input('rc') : '';
$data['build'] = request()->has('build') ? request()->input('build') : '';
$data['login'] = request()->has('login') ? request()->input('login') : 'false';
$data['signup'] = request()->has('signup') ? request()->input('signup') : 'false';
$data['user_agent'] = request()->server('HTTP_USER_AGENT');
$data['path'] = $this->setBuild();
$this->buildCache();
if (Ninja::isSelfHost() && $account->set_react_as_default_ap) {
return view('react.index', $data);
} else {
abort('page not found', 404);
}
}
return redirect('/setup');
}
private function setBuild()
{
$build = '';

View File

@ -34,6 +34,9 @@ class StoreBankTransactionRequest extends Request
$rules = [];
if(isset($this->bank_integration_id))
$rules['bank_integration_id'] = 'bail|required|exists:bank_integrations,id,company_id,'.auth()->user()->company()->id.',is_deleted,0';
return $rules;
}

View File

@ -45,6 +45,9 @@ class UpdateBankTransactionRequest extends Request
if(isset($this->expense_id))
$rules['expense_id'] = 'bail|required|exists:expenses,id,company_id,'.auth()->user()->company()->id.',is_deleted,0';
if(isset($this->bank_integration_id))
$rules['bank_integration_id'] = 'bail|required|exists:bank_integrations,id,company_id,'.auth()->user()->company()->id.',is_deleted,0';
return $rules;
}

View File

@ -90,7 +90,7 @@ class UpdateRecurringInvoiceRequest extends Request
if (isset($input['invitations'])) {
foreach ($input['invitations'] as $key => $value) {
if (is_numeric($input['invitations'][$key]['id'])) {
if (isset($input['invitations'][$key]['id']) && is_numeric($input['invitations'][$key]['id'])) {
unset($input['invitations'][$key]['id']);
}

View File

@ -26,7 +26,7 @@ use App\Models\Currency;
use App\Models\ExpenseCategory;
use App\Models\Invoice;
use App\Models\Payment;
use App\Services\Bank\BankService;
use App\Services\Bank\BankMatchingService;
use App\Utils\Ninja;
use App\Utils\Traits\GeneratesCounter;
use App\Utils\Traits\MakesHash;
@ -214,9 +214,8 @@ class MatchBankTransactions implements ShouldQueue
$this->invoice = Invoice::withTrashed()->where('id', $invoice->id)->lockForUpdate()->first();
// if($invoices->count() == 1){
// $_amount = $this->available_balance;
// }
$_amount = false;
if(floatval($this->invoice->balance) < floatval($this->available_balance) && $this->available_balance > 0)
{
$_amount = $this->invoice->balance;
@ -230,6 +229,9 @@ class MatchBankTransactions implements ShouldQueue
$this->available_balance = 0;
}
if($_amount)
{
$this->attachable_invoices[] = ['id' => $this->invoice->id, 'amount' => $_amount];
$this->invoice
@ -239,6 +241,7 @@ class MatchBankTransactions implements ShouldQueue
->updatePaidToDate($_amount)
->setCalculatedStatus()
->save();
}
});

View File

@ -16,7 +16,7 @@ use App\Libraries\MultiDB;
use App\Models\BankIntegration;
use App\Models\BankTransaction;
use App\Models\Company;
use App\Services\Bank\BankService;
use App\Services\Bank\BankMatchingService;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
@ -79,7 +79,7 @@ class ProcessBankTransactions implements ShouldQueue
}
while($this->stop_loop);
BankService::dispatch($this->company->id, $this->company->db);
BankMatchingService::dispatch($this->company->id, $this->company->db);
}

View File

@ -1107,7 +1107,7 @@ class CompanyImport implements ShouldQueue
$storage_url = (object)$this->getObject('storage_url', true);
if(!Storage::exists($new_document->url)){
if(!Storage::exists($new_document->url) && is_string($storage_url)){
$url = $storage_url . $new_document->url;

View File

@ -13,6 +13,7 @@ namespace App\Models;
use App\Models\Filterable;
use App\Models\Invoice;
use App\Services\Bank\BankService;
use App\Utils\Traits\MakesHash;
use Illuminate\Database\Eloquent\SoftDeletes;
@ -98,22 +99,9 @@ class BankTransaction extends BaseModel
return $this->belongsTo(Account::class)->withTrashed();
}
public function matchInvoiceNumber()
public function service() :BankService
{
if(strlen($this->description) > 1)
{
$i = Invoice::where('company_id', $this->company_id)
->whereIn('status_id', [1,2,3])
->where('is_deleted', 0)
->where('number', 'LIKE', '%'.$this->description.'%')
->first();
return $i ?: false;
return new BankService($this);
}
return false;
}
}

View File

@ -42,8 +42,10 @@ class CompanyPresenter extends EntityPresenter
return $settings->company_logo;
else if(strlen($settings->company_logo) >= 1)
return url('') . $settings->company_logo;
else
return asset('images/new_logo.png');
else{
return "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=";
//return asset('images/new_logo.png');
}
}
@ -88,8 +90,10 @@ class CompanyPresenter extends EntityPresenter
return "data:image/png;base64, ". base64_encode(@file_get_contents($settings->company_logo, false, stream_context_create($context_options)));
else if(strlen($settings->company_logo) >= 1)
return "data:image/png;base64, ". base64_encode(@file_get_contents(url('') . $settings->company_logo, false, stream_context_create($context_options)));
else
return "data:image/png;base64, ". base64_encode(@file_get_contents(asset('images/new_logo.png'), false, stream_context_create($context_options)));
else{
return "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=";
//return "data:image/png;base64, ". base64_encode(@file_get_contents(asset('images/new_logo.png'), false, stream_context_create($context_options)));
}
}

View File

@ -45,7 +45,7 @@ class InvoiceObserver
* @return void
*/
public function updated(Invoice $invoice)
{nlog("updated");
{
$subscriptions = Webhook::where('company_id', $invoice->company_id)
->where('event_id', Webhook::EVENT_UPDATE_INVOICE)
->exists();

View File

@ -87,16 +87,19 @@ trait Utilities
$error_message = '';
if (array_key_exists('actions', $_payment) && array_key_exists('response_summary', end($_payment['actions']))) {
if (is_array($_payment) && array_key_exists('actions', $_payment) && array_key_exists('response_summary', end($_payment['actions']))) {
$error_message = end($_payment['actions'])['response_summary'];
} elseif (array_key_exists('status', $_payment)) {
} elseif (is_array($_payment) && array_key_exists('status', $_payment)) {
$error_message = $_payment['status'];
}
else {
$error_message = 'Error processing payment.';
}
$this->getParent()->sendFailureMail($error_message);
$message = [
'server_response' => $_payment,
'server_response' => $_payment ?: 'Server did not return any response. Most likely failed before payment was created.',
'data' => $this->getParent()->payment_hash->data,
];
@ -110,7 +113,7 @@ trait Utilities
);
if ($throw_exception) {
throw new PaymentFailed($_payment['status'].' '.$error_message, 500);
throw new PaymentFailed($error_message, 500);
}
}

View File

@ -438,7 +438,7 @@ class CheckoutComPaymentDriver extends BaseDriver
$this->init();
$this->setPaymentHash($request->getPaymentHash());
//11-08-2022 check the user is autenticated
//11-08-2022 check the user is authenticated
if (!Auth::guard('contact')->check()) {
$client = $request->getClient();
auth()->guard('contact')->loginUsingId($client->contacts()->first()->id, true);
@ -455,6 +455,8 @@ class CheckoutComPaymentDriver extends BaseDriver
return $this->processUnsuccessfulPayment($payment);
}
} catch (CheckoutApiException | Exception $e) {
nlog("checkout");
nlog($e->getMessage());
return $this->processInternallyFailedPayment($this, $e);
}
}

View File

@ -24,14 +24,14 @@ class BankTransactionRepository extends BaseRepository
public function save($data, BankTransaction $bank_transaction)
{
if(!isset($bank_transaction->bank_integration_id) && array_key_exists('bank_integration_id', $data))
if(array_key_exists('bank_integration_id', $data))
$bank_transaction->bank_integration_id = $data['bank_integration_id'];
$bank_transaction->fill($data);
$bank_transaction->save();
if($bank_transaction->base_type == 'CREDIT' && $invoice = $bank_transaction->matchInvoiceNumber())
if($bank_transaction->base_type == 'CREDIT' && $invoice = $bank_transaction->service()->matchInvoiceNumber())
{
$bank_transaction->invoice_ids = $invoice->hashed_id;
$bank_transaction->status_id = BankTransaction::STATUS_MATCHED;

View File

@ -280,7 +280,7 @@ class BaseRepository
$model = $model->service()->applyNumber()->save();
/* Handle attempts where the deposit is greater than the amount/balance of the invoice */
if((int)$model->balance != 0 && $model->partial > $model->amount)
if((int)$model->balance != 0 && $model->partial > $model->amount && $model->amount > 0)
$model->partial = min($model->amount, $model->balance);
/* Update product details if necessary - if we are inside a transaction - do nothing */

View File

@ -0,0 +1,84 @@
<?php
/**
* Invoice Ninja (https://invoiceninja.com).
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2022. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\Services\Bank;
use App\Libraries\MultiDB;
use App\Models\BankTransaction;
use App\Models\Company;
use App\Models\Invoice;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
class BankMatchingService implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
private $company_id;
private Company $company;
private $db;
private $invoices;
public $deleteWhenMissingModels = true;
public function __construct($company_id, $db)
{
$this->company_id = $company_id;
$this->db = $db;
}
public function handle()
{
MultiDB::setDb($this->db);
$this->company = Company::find($this->company_id);
$this->invoices = Invoice::where('company_id', $this->company->id)
->whereIn('status_id', [1,2,3])
->where('is_deleted', 0)
->get();
$this->match();
}
private function match()
{
BankTransaction::where('company_id', $this->company->id)
->where('status_id', BankTransaction::STATUS_UNMATCHED)
->cursor()
->each(function ($bt){
$invoice = $this->invoices->first(function ($value, $key) use ($bt){
return str_contains($bt->description, $value->number);
});
if($invoice)
{
$bt->invoice_ids = $invoice->hashed_id;
$bt->status_id = BankTransaction::STATUS_MATCHED;
$bt->save();
}
});
}
}

View File

@ -11,74 +11,40 @@
namespace App\Services\Bank;
use App\Libraries\MultiDB;
use App\Models\BankTransaction;
use App\Models\Company;
use App\Models\Invoice;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use App\Services\Bank\ProcessBankRule;
class BankService implements ShouldQueue
class BankService
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
private $company_id;
public function __construct(public BankTransaction $bank_transaction) {}
private Company $company;
private $db;
private $invoices;
public $deleteWhenMissingModels = true;
public function __construct($company_id, $db)
{
$this->company_id = $company_id;
$this->db = $db;
}
public function handle()
public function matchInvoiceNumber()
{
MultiDB::setDb($this->db);
if(strlen($this->bank_transaction->description) > 1)
{
$this->company = Company::find($this->company_id);
$this->invoices = Invoice::where('company_id', $this->company->id)
$i = Invoice::where('company_id', $this->bank_transaction->company_id)
->whereIn('status_id', [1,2,3])
->where('is_deleted', 0)
->get();
->where('number', 'LIKE', '%'.$this->bank_transaction->description.'%')
->first();
$this->match();
return $i ?: false;
}
private function match()
return false;
}
public function processRule($rule)
{
(new ProcessBankRule($this->bank_transaction, $rule))->run();
BankTransaction::where('company_id', $this->company->id)
->where('status_id', BankTransaction::STATUS_UNMATCHED)
->cursor()
->each(function ($bt){
$invoice = $this->invoices->first(function ($value, $key) use ($bt){
return str_contains($bt->description, $value->number);
});
if($invoice)
{
$bt->invoice_ids = $invoice->hashed_id;
$bt->status_id = BankTransaction::STATUS_MATCHED;
$bt->save();
return $this;
}
});
}
}

View File

@ -0,0 +1,27 @@
<?php
/**
* Invoice Ninja (https://invoiceninja.com).
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2022. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\Services\Bank;
use App\Models\BankTransaction;
use App\Services\AbstractService;
class ProcessBankRule extends AbstractService
{
public function __construct(private BankTransaction $bank_transaction, $rule){}
public function run() : void
{
}
}

View File

@ -27,6 +27,8 @@ class TriggeredActions extends AbstractService
private $invoice;
private bool $updated = false;
public function __construct(Invoice $invoice, Request $request)
{
$this->request = $request;
@ -37,30 +39,38 @@ class TriggeredActions extends AbstractService
public function run()
{
if ($this->request->has('auto_bill') && $this->request->input('auto_bill') == 'true') {
$this->invoice->service()->autoBill();
$this->invoice->service()->autoBill(); //update notification sends automatically for this.
}
if ($this->request->has('paid') && $this->request->input('paid') == 'true') {
$this->invoice = $this->invoice->service()->markPaid()->save();
$this->invoice = $this->invoice->service()->markPaid()->save(); //update notification sends automatically for this.
}
if ($this->request->has('mark_sent') && $this->request->input('mark_sent') == 'true') {
$this->invoice = $this->invoice->service()->markSent()->save();
if ($this->request->has('mark_sent') && $this->request->input('mark_sent') == 'true' && $this->invoice->status_id == Invoice::STATUS_DRAFT) {
$this->invoice = $this->invoice->service()->markSent()->save(); //update notification NOT sent
$this->updated = true;
}
if ($this->request->has('amount_paid') && is_numeric($this->request->input('amount_paid'))) {
$this->invoice = $this->invoice->service()->applyPaymentAmount($this->request->input('amount_paid'))->save();
$this->updated = false;
}
if ($this->request->has('send_email') && $this->request->input('send_email') == 'true') {
$this->invoice->service()->markSent()->touchPdf()->save();
$this->sendEmail();
$this->updated = false;
}
if ($this->request->has('cancel') && $this->request->input('cancel') == 'true') {
$this->invoice = $this->invoice->service()->handleCancellation()->save();
$this->updated = false;
}
if($this->updated)
event('eloquent.updated: App\Models\Invoice', $this->invoice);
return $this->invoice;
}

View File

@ -32,6 +32,7 @@ class VendorContactTransformer extends EntityTransformer
'id' => $this->encodePrimaryKey($vendor->id),
'first_name' => $vendor->first_name ?: '',
'last_name' => $vendor->last_name ?: '',
'send_email' => (bool)$vendor->send_email,
'email' => $vendor->email ?: '',
'created_at' => (int) $vendor->created_at,
'updated_at' => (int) $vendor->updated_at,

View File

@ -12,6 +12,7 @@
namespace App\Utils;
use App\Helpers\Epc\EpcQrGenerator;
use App\Helpers\SwissQr\SwissQrGenerator;
use App\Models\Country;
use App\Models\CreditInvitation;
@ -581,6 +582,11 @@ class HtmlEngine
$data['$payments'] = ['value' => $payment_list, 'label' => ctrans('texts.payments')];
}
if($this->entity_string == 'invoice' && isset($this->company?->custom_fields?->company1))
{
$data['$sepa_qr_code'] = ['value' => (new EpcQrGenerator($this->company, $this->entity,$data['$amount_raw']['value']))->getQrCode(), 'label' => ''];
}
$arrKeysLength = array_map('strlen', array_keys($data));
array_multisort($arrKeysLength, SORT_DESC, $data);

View File

@ -14,8 +14,8 @@ return [
'require_https' => env('REQUIRE_HTTPS', true),
'app_url' => rtrim(env('APP_URL', ''), '/'),
'app_domain' => env('APP_DOMAIN', 'invoicing.co'),
'app_version' => '5.5.38',
'app_tag' => '5.5.38',
'app_version' => '5.5.39',
'app_tag' => '5.5.39',
'minimum_client_version' => '5.0.16',
'terms_version' => '1.0.1',
'api_secret' => env('API_SECRET', ''),

18
package-lock.json generated
View File

@ -6,7 +6,7 @@
"": {
"dependencies": {
"autoprefixer": "^10.3.7",
"axios": "^0.24.0",
"axios": "^0.25",
"card-js": "^1.0.13",
"card-validator": "^8.1.1",
"clipboard": "^2.0.10",
@ -2367,11 +2367,11 @@
}
},
"node_modules/axios": {
"version": "0.24.0",
"resolved": "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz",
"integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==",
"version": "0.25.0",
"resolved": "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz",
"integrity": "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==",
"dependencies": {
"follow-redirects": "^1.14.4"
"follow-redirects": "^1.14.7"
}
},
"node_modules/babel-loader": {
@ -10890,11 +10890,11 @@
}
},
"axios": {
"version": "0.24.0",
"resolved": "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz",
"integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==",
"version": "0.25.0",
"resolved": "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz",
"integrity": "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==",
"requires": {
"follow-redirects": "^1.14.4"
"follow-redirects": "^1.14.7"
}
},
"babel-loader": {

View File

@ -11,9 +11,9 @@ const RESOURCES = {
"favicon.png": "dca91c54388f52eded692718d5a98b8b",
"favicon.ico": "51636d3a390451561744c42188ccd628",
"flutter.js": "f85e6fb278b0fd20c349186fb46ae36d",
"/": "b3e1f363b096f7aa924366021ccd1f84",
"/": "d2b918382ed83045e8e3854cae1edc55",
"manifest.json": "ef43d90e57aa7682d7e2cfba2f484a40",
"main.dart.js": "ec0f416f73c0949c563c9c049a29747d",
"main.dart.js": "f6e5cc85c8e2f5aca83137308c219666",
"assets/AssetManifest.json": "759f9ef9973f7e26c2a51450b55bb9fa",
"assets/FontManifest.json": "087fb858dc3cbfbf6baf6a30004922f1",
"assets/NOTICES": "1a34e70168d56fad075adfb4bdbb20eb",

22168
public/main.dart.js vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

23899
public/main.foss.dart.js vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -7,10 +7,10 @@
@foreach ($entity->documents as $document)
<div class="inline-flex items-center space-x-1">
@if($entity instanceof App\Models\PurchaseOrder)
<a href="{{ route('vendor.documents.show', $document->hashed_id) }}" target="_blank"
<a href="{{ route('vendor.documents.download', $document->hashed_id) }}" target="_blank"
class="block text-sm button-link text-primary">{{ Illuminate\Support\Str::limit($document->name, 40) }}</a>
@else
<a href="{{ route('client.documents.show', $document->hashed_id) }}" target="_blank"
<a href="{{ route('client.documents.download', $document->hashed_id) }}" target="_blank"
class="block text-sm button-link text-primary">{{ Illuminate\Support\Str::limit($document->name, 40) }}</a>
@endif
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none"
@ -30,10 +30,10 @@
@foreach ($entity->company->documents as $document)
<div class="inline-flex items-center space-x-1">
@if($entity instanceof App\Models\PurchaseOrder)
<a href="{{ route('vendor.documents.show', $document->hashed_id) }}" target="_blank"
<a href="{{ route('vendor.documents.download', $document->hashed_id) }}" target="_blank"
class="block text-sm button-link text-primary">{{ Illuminate\Support\Str::limit($document->name, 40) }}</a>
@else
<a href="{{ route('client.documents.show', $document->hashed_id) }}" target="_blank"
<a href="{{ route('client.documents.download', $document->hashed_id) }}" target="_blank"
class="block text-sm button-link text-primary">{{ Illuminate\Support\Str::limit($document->name, 40) }}</a>
@endif
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none"
@ -54,7 +54,7 @@
@foreach ($entity->expense_documents() as $expense)
@foreach($expense->documents as $document)
<div class="inline-flex items-center space-x-1">
<a href="{{ route('client.documents.show', $document->hashed_id) }}" target="_blank"
<a href="{{ route('client.documents.download', $document->hashed_id) }}" target="_blank"
class="block text-sm button-link text-primary">{{ Illuminate\Support\Str::limit($document->name, 40) }}</a>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none"
@ -77,7 +77,7 @@
@foreach ($entity->task_documents() as $task)
@foreach($task->documents as $document)
<div class="inline-flex items-center space-x-1">
<a href="{{ route('client.documents.show', $document->hashed_id) }}" target="_blank"
<a href="{{ route('client.documents.download', $document->hashed_id) }}" target="_blank"
class="block text-sm button-link text-primary">{{ Illuminate\Support\Str::limit($document->name, 40) }}</a>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none"

View File

@ -1,207 +1,227 @@
<link rel="modulepreload" href="/react/nth-check.58e8385d.js">
<link rel="stylesheet" href="/react/index.bff791ad.css">
<link rel="modulepreload" href="/react/uuid.ef4f150d.js">
<link rel="modulepreload" href="/react/@emotion.9aa0086d.js">
<link rel="modulepreload" href="/react/react-select.0c11d83f.js">
<link rel="modulepreload" href="/react/space-separated-tokens.59bb4ca8.js">
<link rel="modulepreload" href="/react/raf-schd.43184c40.js">
<link rel="modulepreload" href="/react/recharts-scale.dc8389ce.js">
<link rel="modulepreload" href="/react/unist-util-position.04d68b2b.js">
<link rel="modulepreload" href="/react/reduce-css-calc.281532ee.js">
<link rel="modulepreload" href="/react/is-plain-obj.260ab441.js">
<link rel="modulepreload" href="/react/remark-rehype.66f21be3.js">
<link rel="modulepreload" href="/react/extend.ca41ef84.js">
<link rel="modulepreload" href="/react/micromark-extension-gfm-footnote.5e766f8c.js">
<link rel="modulepreload" href="/react/boolbase.bd705bc9.js">
<link rel="modulepreload" href="/react/react.967f52d5.js">
<link rel="modulepreload" href="/react/micromark-factory-whitespace.4e8e9fce.js">
<link rel="modulepreload" href="/react/react-router-dom.09ff5a14.js">
<script type="module" crossorigin src="/react/index.a4e53c8d.js"></script>
<link rel="modulepreload" href="/react/mdast-util-to-string.717718d5.js">
<link rel="modulepreload" href="/react/micromark-util-html-tag-name.8b7c83fe.js">
<link rel="modulepreload" href="/react/mdast-util-gfm-autolink-literal.4b04cd2e.js">
<link rel="stylesheet" href="/react/@uiw.d17b7851.css">
<link rel="modulepreload" href="/react/unist-util-is.bd39e4f2.js">
<link rel="modulepreload" href="/react/react-qr-code.4878cb6b.js">
<link rel="modulepreload" href="/react/web-namespaces.a24d7a09.js">
<link rel="modulepreload" href="/react/micromark-util-sanitize-uri.f9c714eb.js">
<link rel="modulepreload" href="/react/micromark-extension-gfm-task-list-item.33d9f10c.js">
<link rel="modulepreload" href="/react/html-parse-stringify.32417b46.js">
<link rel="modulepreload" href="/react/i18next.cf61342d.js">
<link rel="modulepreload" href="/react/html-escaper.7cd36ce3.js">
<link rel="modulepreload" href="/react/lodash-es.8df7cfb3.js">
<link rel="modulepreload" href="/react/d3-shape.c407f78b.js">
<link rel="modulepreload" href="/react/tslib.1cf50020.js">
<link rel="modulepreload" href="/react/use-memo-one.4a0d5bdc.js">
<link rel="modulepreload" href="/react/qr.js.da7c6dcd.js">
<link rel="modulepreload" href="/react/mdast-util-gfm.0152e39c.js">
<link rel="modulepreload" href="/react/is-decimal.247a88b7.js">
<link rel="modulepreload" href="/react/react-hot-toast.80758c68.js">
<link rel="modulepreload" href="/react/react-popper.d301c4dd.js">
<link rel="modulepreload" href="/react/react-debounce-input.1347744c.js">
<link rel="modulepreload" href="/react/d3-format.5a3f6ba7.js">
<link rel="modulepreload" href="/react/react-markdown.3a061863.js">
<link rel="modulepreload" href="/react/rehype-rewrite.cb5dac09.js">
<link rel="modulepreload" href="/react/attr-accept.6d6aa28d.js">
<link rel="modulepreload" href="/react/micromark-extension-gfm.3af3365b.js">
<link rel="modulepreload" href="/react/@popperjs.50883750.js">
<link rel="modulepreload" href="/react/warning.3e618ed9.js">
<link rel="modulepreload" href="/react/immer.a08a4913.js">
<link rel="modulepreload" href="/react/micromark-util-encode.b78670b5.js">
<link rel="modulepreload" href="/react/micromark-util-character.811e4fc8.js">
<link rel="modulepreload" href="/react/property-information.17621e99.js">
<link rel="modulepreload" href="/react/formik.0c2f9d9e.js">
<link rel="modulepreload" href="/react/character-reference-invalid.9429e209.js">
<link rel="modulepreload" href="/react/hast-util-to-parse5.d0422f4e.js">
<link rel="modulepreload" href="/react/prop-types.c5f1cd8f.js">
<link rel="modulepreload" href="/react/currency.js.cd0659e5.js">
<link rel="modulepreload" href="/react/redux.acdf7418.js">
<link rel="modulepreload" href="/react/react-feather.ba7315c7.js">
<link rel="modulepreload" href="/react/decode-named-character-reference.58fdd984.js">
<link rel="modulepreload" href="/react/raf.ef427214.js">
<link rel="modulepreload" href="/react/react-redux.7269b315.js">
<link rel="modulepreload" href="/react/ccount.24f4fb2a.js">
<link rel="modulepreload" href="/react/react-resize-detector.73849032.js">
<link rel="modulepreload" href="/react/hast-util-heading-rank.0127330c.js">
<link rel="modulepreload" href="/react/character-entities-html4.bfdecac8.js">
<link rel="modulepreload" href="/react/unist-util-visit.551af7f6.js">
<link rel="modulepreload" href="/react/is-alphabetical.a64573e0.js">
<link rel="modulepreload" href="/react/prismjs.1fc2e6a8.js">
<link rel="modulepreload" href="/react/comma-separated-tokens.826a3e44.js">
<link rel="modulepreload" href="/react/react-dropzone.87de0271.js">
<link rel="modulepreload" href="/react/parse-entities.0d3eeb8f.js">
<link rel="modulepreload" href="/react/unist-util-stringify-position.6cdff1ba.js">
<link rel="modulepreload" href="/react/hast-util-from-parse5.1bc31bb6.js">
<link rel="modulepreload" href="/react/lodash.debounce.bf978eb6.js">
<link rel="modulepreload" href="/react/rehype-prism-plus.2cab531a.js">
<link rel="modulepreload" href="/react/react-onclickoutside.05557887.js">
<link rel="modulepreload" href="/react/hast-util-select.9295ace7.js">
<link rel="modulepreload" href="/react/zwitch.84c833f3.js">
<link rel="modulepreload" href="/react/css-unit-converter.d617fa75.js">
<link rel="modulepreload" href="/react/rehype-autolink-headings.4312e6cb.js">
<link rel="modulepreload" href="/react/micromark-extension-gfm-autolink-literal.75d97f6e.js">
<link rel="modulepreload" href="/react/vfile.8a59bc59.js">
<link rel="modulepreload" href="/react/hoist-non-react-statics.cc69b77f.js">
<link rel="modulepreload" href="/react/collect.js.64c89be2.js">
<link rel="modulepreload" href="/react/react-beautiful-dnd.1242ed17.js">
<link rel="modulepreload" href="/react/micromark-extension-gfm-tagfilter.97dd1d78.js">
<link rel="modulepreload" href="/react/react-dom.bbdc7aed.js">
<link rel="modulepreload" href="/react/micromark-core-commonmark.894384bd.js">
<link rel="modulepreload" href="/react/mdast-util-gfm-footnote.9832ece2.js">
<link rel="modulepreload" href="/react/micromark-util-normalize-identifier.f045ed13.js">
<link rel="modulepreload" href="/react/array-move.20870289.js">
<link rel="modulepreload" href="/react/lodash.6e1b81d9.js">
<link rel="modulepreload" href="/react/date-fns.c9928d0b.js">
<link rel="modulepreload" href="/react/mdast-util-from-markdown.b6500a0a.js">
<link rel="modulepreload" href="/react/eventemitter3.e831f4a3.js">
<link rel="modulepreload" href="/react/is-alphanumerical.39e15300.js">
<link rel="modulepreload" href="/react/hastscript.aa96013f.js">
<link rel="modulepreload" href="/react/unist-util-generated.22d80e74.js">
<link rel="modulepreload" href="/react/remark-gfm.f031f689.js">
<link rel="modulepreload" href="/react/remark-parse.a34fb5cc.js">
<link rel="modulepreload" href="/react/axios.308741bb.js">
<link rel="modulepreload" href="/react/character-entities-legacy.cb27298c.js">
<link rel="modulepreload" href="/react/parse5.761ebfb8.js">
<link rel="modulepreload" href="/react/void-elements.fa8a9e47.js">
<link rel="modulepreload" href="/react/scheduler.84e669cb.js">
<link rel="modulepreload" href="/react/markdown-table.f01db7c9.js">
<link rel="modulepreload" href="/react/mdast-util-gfm-strikethrough.4389f7f3.js">
<link rel="stylesheet" href="/react/react-datepicker.e2be669b.css">
<link rel="modulepreload" href="/react/micromark-factory-label.2e0fc916.js">
<link rel="modulepreload" href="/react/micromark-extension-gfm-strikethrough.39c8bc63.js">
<link rel="modulepreload" href="/react/vfile-message.9560db1f.js">
<link rel="modulepreload" href="/react/mdast-util-to-markdown.7e1348ca.js">
<link rel="modulepreload" href="/react/redux-thunk.281dc3fb.js">
<link rel="modulepreload" href="/react/is-buffer.f91fab60.js">
<link rel="modulepreload" href="/react/rehype-raw.4c3d8b62.js">
<link rel="modulepreload" href="/react/d3-array.1895b022.js">
<link rel="modulepreload" href="/react/parse-numeric-range.fd682744.js">
<link rel="modulepreload" href="/react/hast-util-parse-selector.1be1f27a.js">
<link rel="modulepreload" href="/react/refractor.9012dc30.js">
<link rel="modulepreload" href="/react/css-box-model.54a3012b.js">
<link rel="modulepreload" href="/react/tiny-invariant.817bfd36.js">
<link rel="modulepreload" href="/react/object-assign.f7ed182d.js">
<link rel="modulepreload" href="/react/reselect.68dc670d.js">
<link rel="modulepreload" href="/react/rehype-slug.8f0b0db8.js">
<link rel="modulepreload" href="/react/resize-observer-polyfill.2e10476d.js">
<link rel="modulepreload" href="/react/micromark-factory-title.f4e107a2.js">
<link rel="modulepreload" href="/react/mdast-util-gfm-table.f1729384.js">
<link rel="modulepreload" href="/react/react-query.15f431cf.js">
<link rel="modulepreload" href="/react/react-i18next.b628690b.js">
<link rel="modulepreload" href="/react/micromark-factory-destination.08e32d90.js">
<link rel="modulepreload" href="/react/d3-scale.40adf854.js">
<link rel="modulepreload" href="/react/hast-util-to-string.03a4649a.js">
<link rel="modulepreload" href="/react/d3-path.a0f08300.js">
<link rel="modulepreload" href="/react/hast-util-whitespace.b9acc724.js">
<link rel="modulepreload" href="/react/micromark-util-classify-character.bb02743f.js">
<link rel="modulepreload" href="/react/@babel.d4f90752.js">
<link rel="modulepreload" href="/react/performance-now.3ab08c2f.js">
<link rel="modulepreload" href="/react/d3-time.03d82efa.js">
<link rel="modulepreload" href="/react/react-smooth.ec2093ff.js">
<link rel="modulepreload" href="/react/stringify-entities.a3ae839a.js">
<link rel="modulepreload" href="/react/@sentry.c26c3197.js">
<link rel="modulepreload" href="/react/react-lifecycles-compat.8d6bbd76.js">
<link rel="modulepreload" href="/react/html-void-elements.d3b5aea3.js">
<link rel="modulepreload" href="/react/rehype-parse.74f2042d.js">
<link rel="modulepreload" href="/react/d3-color.69ee14e3.js">
<link rel="modulepreload" href="/react/micromark-util-subtokenize.0273ad72.js">
<link rel="modulepreload" href="/react/react-router.47f931a4.js">
<link rel="modulepreload" href="/react/deepmerge.a6dda5ef.js">
<link rel="modulepreload" href="/react/file-selector.6172b388.js">
<link rel="modulepreload" href="/react/mdast-util-gfm-task-list-item.36dc3006.js">
<link rel="modulepreload" href="/react/hast-to-hyperscript.55881f10.js">
<link rel="modulepreload" href="/react/react-fast-compare.d5a5a050.js">
<link rel="modulepreload" href="/react/fast-equals.9df4a03b.js">
<link rel="modulepreload" href="/react/tippy.js.1053d821.js">
<link rel="modulepreload" href="/react/@headlessui.f2f54a45.js">
<link rel="modulepreload" href="/react/bail.58fa4042.js">
<link rel="modulepreload" href="/react/vfile-location.85c89654.js">
<link rel="modulepreload" href="/react/recharts.38803f97.js">
<link rel="modulepreload" href="/react/unist-util-filter.14ea3396.js">
<link rel="modulepreload" href="/react/direction.5373b893.js">
<link rel="modulepreload" href="/react/micromark.31ec2ae2.js">
<link rel="modulepreload" href="/react/goober.56221fd8.js">
<link rel="modulepreload" href="/react/micromark-util-decode-string.d48b94e2.js">
<link rel="modulepreload" href="/react/react-datepicker.3e071b73.js">
<link rel="modulepreload" href="/react/hast-util-is-element.4ae8c712.js">
<link rel="modulepreload" href="/react/micromark-util-chunked.62b98efd.js">
<link rel="modulepreload" href="/react/mdurl.530e10e1.js">
<link rel="modulepreload" href="/react/mdast-util-find-and-replace.c8360cfe.js">
<link rel="modulepreload" href="/react/internmap.bf78dfdb.js">
<link rel="modulepreload" href="/react/tiny-warning.14328f40.js">
<link rel="modulepreload" href="/react/css-selector-parser.838f527e.js">
<link rel="modulepreload" href="/react/decimal.js-light.b1218db1.js">
<link rel="modulepreload" href="/react/hast-util-has-property.bf6e0cae.js">
<link rel="modulepreload" href="/react/unified.ac4b28d0.js">
<link rel="modulepreload" href="/react/@uiw.e53102d7.js">
<link rel="modulepreload" href="/react/micromark-util-combine-extensions.fc6008e7.js">
<link rel="modulepreload" href="/react/d3-time-format.0353a6ed.js">
<link rel="modulepreload" href="/react/style-to-object.74a4cfe6.js">
<link rel="modulepreload" href="/react/hast-util-raw.6bdb4dc9.js">
<link rel="modulepreload" href="/react/micromark-util-resolve-all.b4e652e2.js">
<link rel="modulepreload" href="/react/bcp-47-match.b7ba7942.js">
<link rel="modulepreload" href="/react/stylis.ba53937c.js">
<link rel="modulepreload" href="/react/mdast-util-definitions.fd07577f.js">
<link rel="modulepreload" href="/react/micromark-util-decode-numeric-character-reference.029edbd3.js">
<link rel="modulepreload" href="/react/unist-builder.67dd3ae6.js">
<link rel="modulepreload" href="/react/memoize-one.413f527d.js">
<link rel="modulepreload" href="/react/hast-util-to-html.54b58e35.js">
<link rel="modulepreload" href="/react/micromark-extension-gfm-table.f7983341.js">
<link rel="modulepreload" href="/react/unist-util-visit-parents.78083329.js">
<link rel="modulepreload" href="/react/github-slugger.144f2824.js">
<link rel="modulepreload" href="/react/dayjs.6e560245.js">
<link rel="modulepreload" href="/react/rehype.bee4df94.js">
<link rel="modulepreload" href="/react/history.8119d98b.js">
<link rel="modulepreload" href="/react/inline-style-parser.ec55a77b.js">
<link rel="modulepreload" href="/react/react.6d2722b1.js">
<link rel="modulepreload" href="/react/hoist-non-react-statics.8cec2199.js">
<link rel="modulepreload" href="/react/mdast-util-from-markdown.47be020c.js">
<link rel="modulepreload" href="/react/is-hexadecimal.d91cb013.js">
<link rel="modulepreload" href="/react/react-is.c6bf3c04.js">
<link rel="modulepreload" href="/react/rehype-attr.8040248d.js">
<link rel="modulepreload" href="/react/internmap.bf78dfdb.js">
<link rel="modulepreload" href="/react/react-use.b131d4e4.js">
<link rel="modulepreload" href="/react/memoize-one.413f527d.js">
<link rel="modulepreload" href="/react/parse-entities.0d3eeb8f.js">
<link rel="modulepreload" href="/react/micromark-extension-gfm-strikethrough.39c8bc63.js">
<link rel="modulepreload" href="/react/d3-time-format.84293c9a.js">
<link rel="modulepreload" href="/react/mdast-util-to-markdown.7e1348ca.js">
<link rel="modulepreload" href="/react/i18next.f9b3f786.js">
<link rel="modulepreload" href="/react/mdast-util-gfm.a8afc4d4.js">
<link rel="modulepreload" href="/react/space-separated-tokens.59bb4ca8.js">
<link rel="modulepreload" href="/react/currency.js.cd0659e5.js">
<link rel="modulepreload" href="/react/is-plain-obj.9b15794f.js">
<link rel="modulepreload" href="/react/micromark-factory-destination.08e32d90.js">
<link rel="modulepreload" href="/react/micromark-extension-gfm-tagfilter.97dd1d78.js">
<link rel="modulepreload" href="/react/mdast-util-gfm-footnote.9832ece2.js">
<link rel="modulepreload" href="/react/@uiw.f40ae12b.js">
<link rel="modulepreload" href="/react/raf-schd.43184c40.js">
<link rel="stylesheet" href="/react/index.f0329153.css">
<link rel="modulepreload" href="/react/tippy.js.33e070d5.js">
<link rel="modulepreload" href="/react/micromark-util-sanitize-uri.dc741380.js">
<link rel="modulepreload" href="/react/micromark-factory-title.f4e107a2.js">
<link rel="modulepreload" href="/react/boolbase.bd705bc9.js">
<link rel="modulepreload" href="/react/classnames.254a7dff.js">
<link rel="modulepreload" href="/react/react-google-login.a35a93aa.js">
<link rel="modulepreload" href="/react/micromark-util-normalize-identifier.f045ed13.js">
<link rel="modulepreload" href="/react/react-beautiful-dnd.ce6bd671.js">
<link rel="modulepreload" href="/react/file-selector.8e1450da.js">
<link rel="modulepreload" href="/react/bcp-47-match.82067f51.js">
<link rel="modulepreload" href="/react/reduce-css-calc.35cb3a35.js">
<link rel="modulepreload" href="/react/eventemitter3.e831f4a3.js">
<link rel="modulepreload" href="/react/extend.ca41ef84.js">
<link rel="modulepreload" href="/react/react-qr-code.f7dc9c91.js">
<link rel="modulepreload" href="/react/d3-time.48bf946b.js">
<link rel="modulepreload" href="/react/unist-util-stringify-position.7846d611.js">
<link rel="modulepreload" href="/react/@tippyjs.5240e2ab.js">
<link rel="modulepreload" href="/react/tiny-warning.14328f40.js">
<link rel="modulepreload" href="/react/micromark-util-html-tag-name.86a7a283.js">
<link rel="modulepreload" href="/react/decode-named-character-reference.58fdd984.js">
<link rel="modulepreload" href="/react/warning.3e618ed9.js">
<link rel="modulepreload" href="/react/is-alphabetical.a64573e0.js">
<link rel="modulepreload" href="/react/react-router-dom.5d948220.js">
<link rel="modulepreload" href="/react/rehype-prism-plus.19d4cddd.js">
<link rel="modulepreload" href="/react/pretty-bytes.1ef697de.js">
<link rel="modulepreload" href="/react/dayjs.d754961f.js">
<link rel="modulepreload" href="/react/@emotion.b14cd998.js">
<link rel="modulepreload" href="/react/use-memo-one.b8c24b4b.js">
<link rel="modulepreload" href="/react/react-dropzone.b6706047.js">
<link rel="modulepreload" href="/react/d3-shape.c407f78b.js">
<link rel="modulepreload" href="/react/is-buffer.f91fab60.js">
<link rel="modulepreload" href="/react/unist-builder.67dd3ae6.js">
<link rel="modulepreload" href="/react/html-parse-stringify.32417b46.js">
<link rel="modulepreload" href="/react/unist-util-filter.14ea3396.js">
<link rel="modulepreload" href="/react/d3-color.69ee14e3.js">
<link rel="modulepreload" href="/react/react-datepicker.b82a0eea.js">
<link rel="modulepreload" href="/react/micromark-util-resolve-all.b4e652e2.js">
<link rel="modulepreload" href="/react/hast-util-is-element.4ae8c712.js">
<link rel="modulepreload" href="/react/micromark-util-combine-extensions.fc6008e7.js">
<link rel="modulepreload" href="/react/nth-check.53474b0f.js">
<link rel="stylesheet" href="/react/@asseinfo.3193d98e.css">
<link rel="modulepreload" href="/react/html-void-elements.d3b5aea3.js">
<link rel="modulepreload" href="/react/is-alphanumerical.39e15300.js">
<link rel="modulepreload" href="/react/throttle-debounce.006a1c17.js">
<link rel="modulepreload" href="/react/direction.5373b893.js">
<link rel="modulepreload" href="/react/hast-util-heading-rank.0127330c.js">
<link rel="modulepreload" href="/react/rehype-ignore.e0470258.js">
<link rel="modulepreload" href="/react/markdown-table.f01db7c9.js">
<link rel="modulepreload" href="/react/micromark-extension-gfm-footnote.b328c551.js">
<link rel="modulepreload" href="/react/react-smooth.2c402a8c.js">
<link rel="modulepreload" href="/react/micromark.d3421ea8.js">
<link rel="modulepreload" href="/react/@babel.f1839c5f.js">
<link rel="modulepreload" href="/react/react-debounce-input.eaa992b0.js">
<link rel="modulepreload" href="/react/ts-easing.fc2b827e.js">
<link rel="modulepreload" href="/react/attr-accept.6d6aa28d.js">
<link rel="modulepreload" href="/react/nano-css.abede7db.js">
<link rel="modulepreload" href="/react/void-elements.fa8a9e47.js">
<link rel="modulepreload" href="/react/react-dom.c60dcaa6.js">
<link rel="modulepreload" href="/react/fast-shallow-equal.b907bd6a.js">
<link rel="modulepreload" href="/react/tslib.fa5fc1d5.js">
<link rel="modulepreload" href="/react/recharts-scale.dc8389ce.js">
<link rel="modulepreload" href="/react/prop-types.a7f6e4c4.js">
<link rel="modulepreload" href="/react/react-redux.5670cce6.js">
<link rel="modulepreload" href="/react/redux.9b782e58.js">
<link rel="modulepreload" href="/react/react-fast-compare.d5a5a050.js">
<link rel="modulepreload" href="/react/react-select.c1620801.js">
<link rel="modulepreload" href="/react/remark-gfm.e7a04880.js">
<link rel="modulepreload" href="/react/hast-util-to-parse5.625ebfe2.js">
<link rel="modulepreload" href="/react/micromark-util-subtokenize.0273ad72.js">
<link rel="modulepreload" href="/react/micromark-extension-gfm.f1ea290d.js">
<link rel="modulepreload" href="/react/react-hot-toast.5a237525.js">
<link rel="modulepreload" href="/react/formik.ab8648c2.js">
<link rel="modulepreload" href="/react/unist-util-position.207de903.js">
<link rel="modulepreload" href="/react/hastscript.f0edb024.js">
<link rel="modulepreload" href="/react/micromark-util-chunked.62b98efd.js">
<link rel="modulepreload" href="/react/jotai.aab81db9.js">
<link rel="modulepreload" href="/react/uuid.ef4f150d.js">
<link rel="modulepreload" href="/react/character-reference-invalid.9429e209.js">
<link rel="modulepreload" href="/react/react-lifecycles-compat.8d6bbd76.js">
<link rel="modulepreload" href="/react/parse-numeric-range.fd682744.js">
<link rel="modulepreload" href="/react/axios.8c581cdc.js">
<link rel="modulepreload" href="/react/toggle-selection.25b8be4d.js">
<link rel="modulepreload" href="/react/rehype-raw.f523f917.js">
<link rel="modulepreload" href="/react/unist-util-is.bd39e4f2.js">
<link rel="modulepreload" href="/react/rehype-stringify.df062706.js">
<link rel="modulepreload" href="/react/rehype.4c8e9be8.js">
<link rel="modulepreload" href="/react/hast-util-from-parse5.56137232.js">
<link rel="modulepreload" href="/react/react-is.f8841f29.js">
<link rel="modulepreload" href="/react/character-entities-html4.bfdecac8.js">
<link rel="modulepreload" href="/react/micromark-util-character.811e4fc8.js">
<link rel="modulepreload" href="/react/refractor.fd19e74e.js">
<link rel="modulepreload" href="/react/rehype-attr.a7e03b64.js">
<link rel="modulepreload" href="/react/react-icons.fc270227.js">
<link rel="modulepreload" href="/react/github-slugger.b13b4a70.js">
<link rel="modulepreload" href="/react/lodash.debounce.856c164a.js">
<link rel="modulepreload" href="/react/react-markdown.0e68cdd0.js">
<link rel="modulepreload" href="/react/micromark-util-classify-character.bb02743f.js">
<link rel="modulepreload" href="/react/react-popper.9ab0f4d7.js">
<link rel="modulepreload" href="/react/fast-deep-equal.acde360c.js">
<link rel="modulepreload" href="/react/micromark-extension-gfm-task-list-item.33d9f10c.js">
<link rel="modulepreload" href="/react/d3-interpolate.c988a5d7.js">
<link rel="modulepreload" href="/react/reselect.de22b1b7.js">
<link rel="modulepreload" href="/react/unist-util-visit.7a4beab6.js">
<link rel="modulepreload" href="/react/parse5.761ebfb8.js">
<link rel="modulepreload" href="/react/mdast-util-find-and-replace.60a1bc2c.js">
<link rel="modulepreload" href="/react/msal.be72c8ff.js">
<link rel="modulepreload" href="/react/micromark-extension-gfm-table.f7983341.js">
<link rel="modulepreload" href="/react/property-information.3a528fcb.js">
<link rel="modulepreload" href="/react/d3-path.a0f08300.js">
<link rel="modulepreload" href="/react/fast-equals.9df4a03b.js">
<link rel="modulepreload" href="/react/tiny-invariant.4a33ca3a.js">
<link rel="modulepreload" href="/react/css-unit-converter.d617fa75.js">
<link rel="modulepreload" href="/react/@reduxjs.1f71e996.js">
<link rel="modulepreload" href="/react/@remix-run.e74ca769.js">
<link rel="modulepreload" href="/react/react-query.b4e01096.js">
<link rel="modulepreload" href="/react/style-to-object.74a4cfe6.js">
<link rel="modulepreload" href="/react/d3-scale.d5d64494.js">
<link rel="modulepreload" href="/react/hast-util-parse-selector.1be1f27a.js">
<link rel="modulepreload" href="/react/micromark-util-encode.2bb97fcf.js">
<link rel="modulepreload" href="/react/@floating-ui.1d43bb23.js">
<link rel="modulepreload" href="/react/vfile.65955e00.js">
<link rel="modulepreload" href="/react/bail.58fa4042.js">
<link rel="modulepreload" href="/react/react-router.aa61f6e8.js">
<link rel="modulepreload" href="/react/decimal.js-light.b1218db1.js">
<link rel="modulepreload" href="/react/js-cookie.a424ed8d.js">
<link rel="modulepreload" href="/react/css-selector-parser.838f527e.js">
<link rel="modulepreload" href="/react/hast-util-whitespace.b9acc724.js">
<link rel="modulepreload" href="/react/mdast-util-gfm-strikethrough.4389f7f3.js">
<link rel="modulepreload" href="/react/object-assign.f7ed182d.js">
<link rel="modulepreload" href="/react/remark-parse.079ed600.js">
<link rel="modulepreload" href="/react/unified.8e87ff8a.js">
<link rel="modulepreload" href="/react/mdast-util-to-string.717718d5.js">
<link rel="modulepreload" href="/react/react-feather.464ed696.js">
<link rel="modulepreload" href="/react/react-i18next.3f8ace4b.js">
<link rel="modulepreload" href="/react/hast-util-to-html.234f88e7.js">
<link rel="modulepreload" href="/react/micromark-util-decode-numeric-character-reference.029edbd3.js">
<link rel="modulepreload" href="/react/recharts.c8945651.js">
<link rel="modulepreload" href="/react/hast-util-has-property.bf6e0cae.js">
<link rel="modulepreload" href="/react/vfile-location.85c89654.js">
<link rel="modulepreload" href="/react/hast-util-raw.fe1282e9.js">
<link rel="modulepreload" href="/react/remark-rehype.9f06c99a.js">
<link rel="modulepreload" href="/react/ccount.24f4fb2a.js">
<link rel="modulepreload" href="/react/react-universal-interface.4a8b8b61.js">
<link rel="modulepreload" href="/react/qr.js.da7c6dcd.js">
<link rel="modulepreload" href="/react/@asseinfo.5ffe303c.js">
<link rel="modulepreload" href="/react/micromark-core-commonmark.53c183e2.js">
<link rel="modulepreload" href="/react/react-microsoft-login.9ff59228.js">
<link rel="modulepreload" href="/react/micromark-util-decode-string.d48b94e2.js">
<link rel="modulepreload" href="/react/immer.3239d3dc.js">
<link rel="modulepreload" href="/react/rehype-rewrite.fabf64e9.js">
<link rel="modulepreload" href="/react/lodash-es.dd7c056c.js">
<link rel="modulepreload" href="/react/lodash.c2607a2a.js">
<link rel="modulepreload" href="/react/deepmerge.a6dda5ef.js">
<link rel="modulepreload" href="/react/unist-util-visit-parents.56bb16a1.js">
<link rel="modulepreload" href="/react/scheduler.a959f150.js">
<link rel="modulepreload" href="/react/stylis.967d24d9.js">
<link rel="modulepreload" href="/react/react-json-view.3f2a7802.js">
<link rel="modulepreload" href="/react/screenfull.4b7dcae0.js">
<link rel="modulepreload" href="/react/@sentry.6e94e5db.js">
<link rel="modulepreload" href="/react/web-namespaces.a24d7a09.js">
<link rel="modulepreload" href="/react/hast-to-hyperscript.7bd6ed35.js">
<link rel="modulepreload" href="/react/copy-to-clipboard.107ef1da.js">
<link rel="modulepreload" href="/react/trough.e66b541d.js">
<link rel="modulepreload" href="/react/array-move.20870289.js">
<link rel="modulepreload" href="/react/micromark-extension-gfm-autolink-literal.75d97f6e.js">
<link rel="modulepreload" href="/react/set-harmonic-interval.933d0946.js">
<link rel="modulepreload" href="/react/react-resize-detector.55fbacd6.js">
<link rel="modulepreload" href="/react/@headlessui.d1a49191.js">
<link rel="modulepreload" href="/react/rehype-autolink-headings.44122af2.js">
<link rel="modulepreload" href="/react/@xobotyi.606f64fa.js">
<link rel="modulepreload" href="/react/trim-lines.a08a0c08.js">
<link rel="modulepreload" href="/react/react-onclickoutside.af17f133.js">
<link rel="modulepreload" href="/react/comma-separated-tokens.826a3e44.js">
<link rel="modulepreload" href="/react/character-entities-legacy.cb27298c.js">
<link rel="modulepreload" href="/react/d3-format.5a3f6ba7.js">
<link rel="modulepreload" href="/react/goober.f083a39d.js">
<link rel="modulepreload" href="/react/collect.js.3ca95072.js">
<link rel="modulepreload" href="/react/micromark-factory-space.84551a41.js">
<link rel="modulepreload" href="/react/rehype-stringify.540b84fb.js">
<link rel="modulepreload" href="/react/d3-interpolate.f5146873.js">
<link rel="modulepreload" href="/react/mdast-util-to-hast.d1d8e0b2.js">
<link rel="modulepreload" href="/react/trough.714478ec.js">
<link rel="modulepreload" href="/react/@tippyjs.36ad76fa.js">
<link rel="modulepreload" href="/react/@reduxjs.9b745b7e.js">
<link rel="modulepreload" href="/react/classnames.02e8c2fa.js">
<link rel="modulepreload" href="/react/mdast-util-gfm-table.f1729384.js">
<link rel="modulepreload" href="/react/hast-util-to-string.03a4649a.js">
<link rel="modulepreload" href="/react/zwitch.84c833f3.js">
<link rel="modulepreload" href="/react/mdast-util-gfm-autolink-literal.c934cb3a.js">
<link rel="modulepreload" href="/react/inline-style-parser.ec55a77b.js">
<link rel="modulepreload" href="/react/rehype-parse.453fda54.js">
<link rel="modulepreload" href="/react/micromark-factory-label.2e0fc916.js">
<link rel="modulepreload" href="/react/css-box-model.973b9073.js">
<link rel="stylesheet" href="/react/@uiw.f7899131.css">
<link rel="modulepreload" href="/react/use-isomorphic-layout-effect.07a92e11.js">
<link rel="modulepreload" href="/react/vfile-message.531f27be.js">
<link rel="modulepreload" href="/react/micromark-factory-whitespace.4e8e9fce.js">
<link rel="modulepreload" href="/react/hast-util-select.19d9d11a.js">
<link rel="modulepreload" href="/react/mdast-util-definitions.f453f0a8.js">
<link rel="modulepreload" href="/react/date-fns.c9928d0b.js">
<link rel="modulepreload" href="/react/rehype-slug.79dc0c87.js">
<link rel="stylesheet" href="/react/react-datepicker.d89d2ad1.css">
<link rel="modulepreload" href="/react/mdast-util-gfm-task-list-item.36dc3006.js">
<link rel="modulepreload" href="/react/mdast-util-to-hast.f08c5f84.js">
<link rel="modulepreload" href="/react/is-decimal.247a88b7.js">
<link rel="modulepreload" href="/react/@popperjs.37a74db9.js">
<link rel="modulepreload" href="/react/react-string-replace.6d88c783.js">
<link rel="modulepreload" href="/react/stringify-entities.a8aab4da.js">
<link rel="modulepreload" href="/react/redux-thunk.281dc3fb.js">
<link rel="modulepreload" href="/react/d3-array.1895b022.js">
<script type="module" crossorigin src="/react/index.8ce41049.js"></script>
<link rel="modulepreload" href="/react/unist-util-generated.22d80e74.js">

View File

@ -59,3 +59,5 @@ Route::get('checkout/3ds_redirect/{company_key}/{company_gateway_id}/{hash}', [C
Route::get('mollie/3ds_redirect/{company_key}/{company_gateway_id}/{hash}', [Mollie3dsController::class, 'index'])->middleware('domain_db')->name('mollie.3ds_redirect');
Route::get('gocardless/ibp_redirect/{company_key}/{company_gateway_id}/{hash}', [GoCardlessController::class, 'ibpRedirect'])->middleware('domain_db')->name('gocardless.ibp_redirect');
Route::get('.well-known/apple-developer-merchantid-domain-association', [ApplePayDomainController::class, 'showAppleMerchantId']);
Route::fallback([BaseController::class, 'reactCatch']);