diff --git a/app/PaymentDrivers/Rotessa/DataProviders/CAProvinces.php b/app/PaymentDrivers/Rotessa/DataProviders/CAProvinces.php new file mode 100644 index 000000000000..275e79cfad4e --- /dev/null +++ b/app/PaymentDrivers/Rotessa/DataProviders/CAProvinces.php @@ -0,0 +1,55 @@ + 'Alberta', + 'BC' => 'British Columbia', + 'MB' => 'Manitoba', + 'NB' => 'New Brunswick', + 'NL' => 'Newfoundland And Labrador', + 'NS' => 'Nova Scotia', + 'ON' => 'Ontario', + 'PE' => 'Prince Edward Island', + 'QC' => 'Quebec', + 'SK' => 'Saskatchewan', + 'NT' => 'Northwest Territories', + 'NU' => 'Nunavut', + 'YT' => 'Yukon' + ]; + + /** + * Get the name of the province or territory for a given abbreviation. + * + * @param string $abbreviation + * @return string + */ + public static function getName($abbreviation) { + return self::$provinces[$abbreviation]; + } + + /** + * Get all provinces and territories. + * + * @return array + */ + public static function get() { + return self::$provinces; + } + + /** + * Get the abbreviation for a given province or territory name. + * + * @param string $name + * @return string + */ + public static function getAbbreviation($name) { + return array_search(ucwords($name), self::$provinces); + } +} diff --git a/app/PaymentDrivers/Rotessa/DataProviders/Frequencies.php b/app/PaymentDrivers/Rotessa/DataProviders/Frequencies.php new file mode 100644 index 000000000000..ca5623c1694b --- /dev/null +++ b/app/PaymentDrivers/Rotessa/DataProviders/Frequencies.php @@ -0,0 +1,19 @@ +where('name', 'Rotessa')->isEmpty()) { + $gateways = Gateway::orderBy('id')->get(); + } + + $gateways = $gateways->map(fn($item) => $item->name == 'Rotessa'? RotessaGateway::find($item->toArray()['id']) : $item ); + + Cache::forever('gateways', $gateways); + } +} + diff --git a/app/PaymentDrivers/Rotessa/Models/Gateway.php b/app/PaymentDrivers/Rotessa/Models/Gateway.php new file mode 100644 index 000000000000..55405dbd7f5f --- /dev/null +++ b/app/PaymentDrivers/Rotessa/Models/Gateway.php @@ -0,0 +1,23 @@ +name == 'Rotessa' && empty($options)) { + $options = $gateway_types; + } + + return $options; + } +} + diff --git a/app/PaymentDrivers/Rotessa/PaymentMethod.php b/app/PaymentDrivers/Rotessa/PaymentMethod.php new file mode 100755 index 000000000000..9d67edfa6fe3 --- /dev/null +++ b/app/PaymentDrivers/Rotessa/PaymentMethod.php @@ -0,0 +1,261 @@ +rotessa = $rotessa; + $this->rotessa->init(); + } + + /** + * Show the authorization page for Rotessa. + * + * @param array $data + * @return \Illuminate\View\View + */ + public function authorizeView(array $data): View + { + $data['contact'] = collect($data['client']->contacts->firstWhere('is_primary', 1)->toArray())->merge([ + 'home_phone' => $data['client']->phone, + 'custom_identifier' => $data['client']->number . substr(uniqid(),0,4), + 'name' => $data['client']->name, + 'id' => null + ] )->all(); + $data['gateway'] = $this->rotessa; + $data['gateway_type_id'] = (int) request('method'); + $data['account'] = [ + 'routing_number' => $data['client']->routing_id, + 'country' => $data['client']->country->iso_3166_2 + ]; + $data['address'] = collect($data['client']->toArray())->merge(['country' => $data['client']->country->iso_3166_2 ])->all(); + + return view('rotessa::bank_transfer.authorize', $data); + } + + protected function findOrCreateCustomer(Request $request) + { + $result = null; $data = []; + $customer = new Customer( + $request->merge(['id' => $request->input('id') ] + + ['address' => $request->only('address_1','address_2','city','postal_code','province_code','country') ])->all() + ); + try { + $existing = ClientGatewayToken::query() + ->where('company_gateway_id', $this->rotessa->company_gateway->id) + ->where('client_id', $this->rotessa->client->id) + ->first(); + $data = array_filter(Arr::except($customer->jsonSerialize(),['custom_identifier'])); + if ($existing && $existing->token == encrypt($data)) return $existing->gateway_customer_reference; + + $result = $this->rotessa->gateway->authorize($customer->resolve())->send(); + if ($result->isSuccessful()) { + $customer = new Customer($result->getData()); + $data = array_filter(Arr::except($customer->jsonSerialize(),['custom_identifier'])); + $this->rotessa->storeGatewayToken( [ + 'payment_meta' => $customer->resolve() + ['brand' => 'Rotessa'], + 'token' => encrypt($data), + 'payment_method_id' => (int) $request->input("gateway_type_id"), + ], ['gateway_customer_reference' => + $result->getParameter('id') + , 'routing_number' => $result->getParameter('routing_number') ?? $result->getParameter('transit_number')]); + + return $result->getParameter('id'); + } + + throw new \Exception($result->getMessage(), (int) $result->getCode()); + + } catch (\Throwable $th) { + $data = [ + 'transaction_reference' => null, + 'transaction_response' => $th->getMessage(), + 'success' => false, + 'description' => $th->getMessage(), + 'code' =>(int) $th->getCode() + ]; + + SystemLogger::dispatch(['server_response' => is_null($result) ? '' : $result->getData(), 'data' => $data], SystemLog::CATEGORY_GATEWAY_RESPONSE, SystemLog::EVENT_GATEWAY_FAILURE, 880 , $this->rotessa->client, $this->rotessa->client->company); + + throw $th; + } + } + + /** + * Handle the authorization page for Rotessa. + * + * @param Request $request + * @return RedirectResponse + */ + public function authorizeResponse(Request $request): RedirectResponse + { + try { + $request->validate([ + 'gateway_type_id' => ['required','integer'], + 'country' => ['required'], + 'name' => ['required'], + 'address_1' => ['required'], + 'address_2' => ['required'], + 'city' => ['required'], + 'email' => ['required','email:filter'], + 'province_code' => ['required','size:2','alpha'], + 'postal_code' => ['required'], + 'authorization_type' => ['required'], + 'account_number' => ['required'], + 'bank_name' => ['required'], + 'phone' => ['required'], + 'home_phone' => ['required'], + 'bank_account_type'=>['required_if:country,US'], + 'routing_number'=>['required_if:country,US'], + 'institution_number'=>['required_if:country,CA','numeric'], + 'transit_number'=>['required_if:country,CA','numeric'], + 'custom_identifier'=>['required_without:customer_id'], + 'customer_id'=>['required_without:custom_identifier','integer'], + ]); + $this->findOrCreateCustomer($request); + + return redirect()->route('client.payment_methods.index')->withMessage(ctrans('texts.payment_method_added')); + + } catch (\Throwable $e) { + return $this->rotessa->processInternallyFailedPayment($this->rotessa, new ClientPortalAuthorizationException( get_class( $e) . " : {$e->getMessage()}", (int) $e->getCode() )); + } + + return back()->withMessage(ctrans('texts.unable_to_verify_payment_method')); + } + + /** + * Payment view for the Rotessa. + * + * @param array $data + * @return \Illuminate\View\View + */ + public function paymentView(array $data): View + { + $data['gateway'] = $this->rotessa; + $data['amount'] = $data['total']['amount_with_fee']; + $data['due_date'] = date('Y-m-d', min(max(strtotime($data['invoices']->max('due_date')), strtotime('now')), strtotime('+1 day'))); + $data['process_date'] = $data['due_date']; + $data['currency'] = $this->rotessa->client->getCurrencyCode(); + $data['frequency'] = Frequencies::getOnePayment(); + $data['installments'] = 1; + $data['invoice_nums'] = $data['invoices']->pluck('invoice_number')->join(', '); + return view('rotessa::bank_transfer.pay', $data ); + } + + /** + * Handle payments page for Rotessa. + * + * @param PaymentResponseRequest $request + * @return void + */ + public function paymentResponse(PaymentResponseRequest $request) + { + $response= null; + $customer = null; + try { + $request->validate([ + 'source' => ['required','string','exists:client_gateway_tokens,token'], + 'amount' => ['required','numeric'], + 'token_id' => ['required','integer','exists:client_gateway_tokens,id'], + 'process_date'=> ['required','date','after_or_equal:today'], + ]); + $customer = ClientGatewayToken::query() + ->where('company_gateway_id', $this->rotessa->company_gateway->id) + ->where('client_id', $this->rotessa->client->id) + ->where('id', (int) $request->input('token_id')) + ->where('token', $request->input('source')) + ->first(); + if(!$customer) throw new \Exception('Client gateway token not found!', 605); + + $transaction = new Transaction($request->only('frequency' ,'installments','amount','process_date','comment')); + $transaction->additional(['customer_id' => $customer->gateway_customer_reference]); + $transaction = array_filter( $transaction->resolve()); + $response = $this->rotessa->gateway->capture($transaction)->send(); + if(!$response->isSuccessful()) throw new \Exception($response->getMessage(), (int) $response->getCode()); + + return $this->processPendingPayment($response->getParameter('id'), (float) $response->getParameter('amount'), (int) $customer->gateway_type_id , $customer->token); + } catch(\Throwable $e) { + $this->processUnsuccessfulPayment( new InvalidResponseException($e->getMessage(), (int) $e->getCode()) ); + } + } + + public function processPendingPayment($payment_id, float $amount, int $gateway_type_id, $payment_method ) + { + $data = [ + 'payment_method' => $payment_method, + 'payment_type' => $gateway_type_id, + 'amount' => $amount, + 'transaction_reference' =>$payment_id, + 'gateway_type_id' => $gateway_type_id, + ]; + $payment = $this->rotessa->createPayment($data, Payment::STATUS_PENDING); + SystemLogger::dispatch( + [ 'data' => $data ], + SystemLog::CATEGORY_GATEWAY_RESPONSE, + SystemLog::EVENT_GATEWAY_SUCCESS, + 880, + $this->rotessa->client, + $this->rotessa->client->company, + ); + + return redirect()->route('client.payments.show', [ 'payment' => $this->rotessa->encodePrimaryKey($payment->id) ]); + } + + /** + * Handle unsuccessful payment for Rotessa. + * + * @param Exception $exception + * @throws PaymentFailed + * @return void + */ + public function processUnsuccessfulPayment(\Exception $exception): void + { + $this->rotessa->sendFailureMail($exception->getMessage()); + + SystemLogger::dispatch( + $exception->getMessage(), + SystemLog::CATEGORY_GATEWAY_RESPONSE, + SystemLog::EVENT_GATEWAY_FAILURE, + 880, + $this->rotessa->client, + $this->rotessa->client->company, + ); + + throw new PaymentFailed($exception->getMessage(), $exception->getCode()); + } +} diff --git a/app/PaymentDrivers/Rotessa/Providers/.gitkeep b/app/PaymentDrivers/Rotessa/Providers/.gitkeep new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/app/PaymentDrivers/Rotessa/Providers/EventServiceProvider.php b/app/PaymentDrivers/Rotessa/Providers/EventServiceProvider.php new file mode 100644 index 000000000000..0d61ecbce482 --- /dev/null +++ b/app/PaymentDrivers/Rotessa/Providers/EventServiceProvider.php @@ -0,0 +1,21 @@ + [ + Listener::class, + ], + ]; +} diff --git a/app/PaymentDrivers/Rotessa/Providers/ServiceProvider.php b/app/PaymentDrivers/Rotessa/Providers/ServiceProvider.php new file mode 100644 index 000000000000..af11a242f209 --- /dev/null +++ b/app/PaymentDrivers/Rotessa/Providers/ServiceProvider.php @@ -0,0 +1,83 @@ +registerConfig(); + $this->registerTranslations(); + $this->registerViews(); + + event(new CacheGateways); + } + + /** + * Register config. + */ + protected function registerConfig(): void + { + $this->mergeConfigFrom(app_path("PaymentDrivers/{$this->moduleName}/config/gateway_types.php"),$this->moduleNameLower); + } + /** + * Register the service provider. + */ + public function register(): void + { + $this->app->register(EventServiceProvider::class); + + } + + /** + * Register translations. + */ + public function registerTranslations(): void + { + $langPath = resource_path('lang/modules/'.$this->moduleNameLower); + + if (is_dir($langPath)) { + $this->loadTranslationsFrom($langPath, $this->moduleNameLower); + $this->loadJsonTranslationsFrom($langPath); + } else { + $this->loadTranslationsFrom(app_path("PaymentDrivers/{$this->moduleName}resources/lang"), $this->moduleNameLower); + $this->loadJsonTranslationsFrom(app_path("PaymentDrivers/{$this->moduleName}resources/lang")); + } + } + + /** + * Register views. + */ + public function registerViews(): void + { + $viewPath = resource_path('views/portal/ninja2020/gateways/'.$this->moduleNameLower); + $sourcePath = app_path('PaymentDrivers/Rotessa/resources/views/gateways/rotessa'); + $this->loadViewsFrom(array_merge($this->getPublishableViewPaths(), [$sourcePath]), $this->moduleNameLower); + Blade::componentNamespace('App\\PaymentDrivers\\Rotessa\\View\\Components', $this->moduleNameLower); + } + + private function getPublishableViewPaths(): array + { + $paths = [app_path('PaymentDrivers/Rotessa/resources/views/gateways/rotessa')]; + foreach (config('view.paths') as $path) { + if (is_dir($path.'/'.$this->moduleNameLower)) { + $paths[] = $path.'/'.$this->moduleNameLower; + } + } + + return $paths; + } +} diff --git a/app/PaymentDrivers/Rotessa/Resources/Customer.php b/app/PaymentDrivers/Rotessa/Resources/Customer.php new file mode 100644 index 000000000000..c2514dfdd8c1 --- /dev/null +++ b/app/PaymentDrivers/Rotessa/Resources/Customer.php @@ -0,0 +1,22 @@ +resource->jsonSerialize(); + } + + function toArray(Request $request) : array { + return $this->additional + parent::toArray($request); + } +} diff --git a/app/PaymentDrivers/Rotessa/Resources/Transaction.php b/app/PaymentDrivers/Rotessa/Resources/Transaction.php new file mode 100644 index 000000000000..84ce332860f8 --- /dev/null +++ b/app/PaymentDrivers/Rotessa/Resources/Transaction.php @@ -0,0 +1,23 @@ +resource->jsonSerialize(); + } + + function toArray(Request $request) : array { + return $this->additional + parent::toArray($request); + } +} diff --git a/app/PaymentDrivers/Rotessa/View/Components/Components.php b/app/PaymentDrivers/Rotessa/View/Components/Components.php new file mode 100644 index 000000000000..b18269f35f54 --- /dev/null +++ b/app/PaymentDrivers/Rotessa/View/Components/Components.php @@ -0,0 +1,118 @@ +contact = $contact; + $this->attributes = $this->newAttributeBag(Arr::only($this->contact, $this->fields) ); + } + + private $fields = [ + 'name', + 'email', + 'home_phone', + 'phone', + 'custom_identifier', + 'customer_type' , + 'id' + ]; + + private $defaults = [ + 'customer_type' => "Business", + 'customer_identifier' => null, + 'id' => null + ]; + + public function render() + { + return $this->view('rotessa::components.contact', $this->attributes->getAttributes(), $this->defaults ); + } +} + +// Address Component +class AddressComponent extends Component +{ + private $fields = [ + 'address_1', + 'address_2', + 'city', + 'postal_code', + 'province_code', + 'country' + ]; + + private $defaults = [ + 'country' => 'US' + ]; + + public array $address; + + public function __construct(array $address) { + $this->address = $address; + if(strlen($this->address['state']) > 2 ) { + $this->address['state'] = $this->address['country'] == 'US' ? array_search($this->address['state'], USStates::$states) : CAProvinces::getAbbreviation($this->address['state']); + } + + $this->attributes = $this->newAttributeBag( + Arr::only(Arr::mapWithKeys($this->address, function ($item, $key) { + return in_array($key, ['address1','address2','state'])?[ (['address1'=>'address_1','address2'=>'address_2','state'=>'province_code'])[$key] => $item ] :[ $key => $item ]; + }), + $this->fields) ); + } + + + public function render() + { + + return $this->view('rotessa::components.address', $this->attributes->getAttributes(), $this->defaults ); + } +} + +// AmericanBankInfo Component +class AccountComponent extends Component +{ + private $fields = [ + 'bank_account_type', + 'routing_number', + 'institution_number', + 'transit_number', + 'bank_name', + 'country', + 'account_number' + ]; + + private $defaults = [ + 'bank_account_type' => null, + 'routing_number' => null, + 'institution_number' => null, + 'transit_number' => null, + 'bank_name' => ' ', + 'account_number' => null, + 'country' => 'US', + "authorization_type" => 'Online' + ]; + + public array $account; + + public function __construct(array $account) { + $this->account = $account; + $this->attributes = $this->newAttributeBag(Arr::only($this->account, $this->fields) ); + } + + public function render() + { + return $this->view('rotessa::components.account', $this->attributes->getAttributes(), $this->defaults ); + } +} diff --git a/app/PaymentDrivers/Rotessa/View/Composers/Composer.php b/app/PaymentDrivers/Rotessa/View/Composers/Composer.php new file mode 100644 index 000000000000..fb3c126a3555 --- /dev/null +++ b/app/PaymentDrivers/Rotessa/View/Composers/Composer.php @@ -0,0 +1,16 @@ +with('states', $states); +}); + +// CAProvinces View Composer +View::composer(['rotessa::components.address','rotessa::components.banks.CA.bank','rotessa::components.dropdowns.country.CA'], function ($view) { + $provinces = CAProvinces::get(); + $view->with('provinces', $provinces); +}); \ No newline at end of file diff --git a/app/PaymentDrivers/Rotessa/composer.json b/app/PaymentDrivers/Rotessa/composer.json new file mode 100644 index 000000000000..6f9ba511a9b4 --- /dev/null +++ b/app/PaymentDrivers/Rotessa/composer.json @@ -0,0 +1,61 @@ +{ + "name": "karneaud/invoiceninja-rotessa", + "description": "Invoice Ninja with Rotessa gateway", + "type":"laravel-module", + "keywords": [ + "invoice ninja", + "laravel", + "rotessa" + ], + "license": ["Attribution Assurance License","Proprietary License","BSD 3-Clause License"], + "authors": [ + { + "name": "Kendall Arneaud", + "email": "kendall.arneaud@gmail.com" + } + ], + "autoload": { + "classmap": ["./View/Components/Components.php"], + "psr-4": { + "App\\PaymentDrivers\\Rotessa\\":"./", + "App\\PaymentDrivers\\Rotessa\\View\\Components\\":"./View/Components/", + "App\\PaymentDrivers\\Rotessa\\Database\\Seeders\\": "Database/Seeders/" + }, + "files": [ + "./View/Composers/Composer.php" + ] + }, + "config": { + "preferred-install": "dist", + "sort-packages": true, + "optimize-autoloader": true + }, + "repositories": [ + { + "type": "package", + "package": { + "name": "karneaud/omnipay-rotessa", + "source": { + "url": "https://github.com/karneaud/omnipay-rotessa.git", + "type": "git", + "reference": "master" + }, + "version": "1.0.0-beta", + "dist": { + "url": "https://github.com/karneaud/omnipay-rotessa/archive/refs/tags/v1.0.0-beta.zip", + "type": "zip" + }, + "autoload": { + "psr-4": { + "Omnipay\\Rotessa\\":"./src/Omnipay/Rotessa/", + "Omnipay\\Rotessa\\Exception\\":"./src/Omnipay/Rotessa/Exception/" + }, + "classmap": ["./src/Omnipay/Rotessa/Exception/Exceptions.php"] + } + } + } + ], + "require": { + "karneaud/omnipay-rotessa": "v1.0.0-beta" + } +} diff --git a/app/PaymentDrivers/Rotessa/composer.lock b/app/PaymentDrivers/Rotessa/composer.lock new file mode 100644 index 000000000000..24dc1719cffb --- /dev/null +++ b/app/PaymentDrivers/Rotessa/composer.lock @@ -0,0 +1,44 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "4c8b93bd9cd92f484502fc665fdbe826", + "packages": [ + { + "name": "karneaud/omnipay-rotessa", + "version": "1.0.0-beta", + "source": { + "type": "git", + "url": "https://github.com/karneaud/omnipay-rotessa.git", + "reference": "master" + }, + "dist": { + "type": "zip", + "url": "https://github.com/karneaud/omnipay-rotessa/archive/refs/tags/v1.0.0-beta.zip" + }, + "type": "library", + "autoload": { + "psr-4": { + "Omnipay\\Rotessa\\": "./src/Omnipay/Rotessa/", + "Omnipay\\Rotessa\\Exception\\": "./src/Omnipay/Rotessa/Exception/" + }, + "classmap": [ + "./src/Omnipay/Rotessa/Exception/Exceptions.php" + ] + } + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": { + "karneaud/omnipay-rotessa": 10 + }, + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [], + "plugin-api-version": "2.6.0" +} diff --git a/app/PaymentDrivers/Rotessa/config/gateway_types.php b/app/PaymentDrivers/Rotessa/config/gateway_types.php new file mode 100644 index 000000000000..6ae509ae8dd0 --- /dev/null +++ b/app/PaymentDrivers/Rotessa/config/gateway_types.php @@ -0,0 +1,16 @@ + [ + GatewayType::BANK_TRANSFER => [ + 'refund' => false, + 'token_billing' => true, + 'webhooks' => [], + ], + GatewayType::BACS => ['refund' => false, 'token_billing' => true, 'webhooks' => []], + GatewayType::DIRECT_DEBIT => ['refund' => false, 'token_billing' => true, 'webhooks' => []], + GatewayType::ACSS => ['refund' => false, 'token_billing' => true, 'webhooks' => []] + ] +]; \ No newline at end of file diff --git a/app/PaymentDrivers/Rotessa/resources/views/gateways/rotessa/bank_transfer/CA/details.blade.php b/app/PaymentDrivers/Rotessa/resources/views/gateways/rotessa/bank_transfer/CA/details.blade.php new file mode 100644 index 000000000000..9492f3036fc1 --- /dev/null +++ b/app/PaymentDrivers/Rotessa/resources/views/gateways/rotessa/bank_transfer/CA/details.blade.php @@ -0,0 +1,4 @@ +
Gateway:
+
{{ $brand }}
+
Account Number:
+
{{ $account_number }}
\ No newline at end of file diff --git a/app/PaymentDrivers/Rotessa/resources/views/gateways/rotessa/bank_transfer/authorize.blade.php b/app/PaymentDrivers/Rotessa/resources/views/gateways/rotessa/bank_transfer/authorize.blade.php new file mode 100755 index 000000000000..70a0cfb7ba59 --- /dev/null +++ b/app/PaymentDrivers/Rotessa/resources/views/gateways/rotessa/bank_transfer/authorize.blade.php @@ -0,0 +1,35 @@ +@extends('portal.ninja2020.layout.payments', ['gateway_title' => $gateway->company_gateway->label, 'card_title' =>\App\Models\GatewayType::getAlias($gateway_type_id )]) + +@section('gateway_content') + @if(session()->has('ach_error')) +
+

{{ session('ach_error') }}

+
+ @endif + +
+ @csrf + + + + + + + + + + + + @component('portal.ninja2020.gateways.includes.pay_now', ['id' => 'authorize-bank-account', 'type' => 'submit']) + {{ ctrans('texts.add_payment_method') }} + @endcomponent +
+ + + +@endsection + +@section('gateway_footer') + +@endsection \ No newline at end of file diff --git a/app/PaymentDrivers/Rotessa/resources/views/gateways/rotessa/bank_transfer/pay.blade.php b/app/PaymentDrivers/Rotessa/resources/views/gateways/rotessa/bank_transfer/pay.blade.php new file mode 100644 index 000000000000..4e6e0c2a0b22 --- /dev/null +++ b/app/PaymentDrivers/Rotessa/resources/views/gateways/rotessa/bank_transfer/pay.blade.php @@ -0,0 +1,91 @@ +@extends('portal.ninja2020.layout.payments', ['gateway_title' => 'Direct Debit', 'card_title' => 'Direct Debit']) + +@section('gateway_content') + @if (count($tokens) > 0) + + + @include('portal.ninja2020.gateways.includes.payment_details') + +
+ @csrf + + + + + + + + + + + + @component('portal.ninja2020.components.general.card-element', ['title' => ctrans('texts.pay_with')]) + @if (count($tokens) > 0) + @foreach ($tokens as $token) +
+ @endforeach + @endisset +
+ Process Date +
+
+ +
+ {{-- +
+ Insallments +
+
+ +
+ +
+ Frequency +
+
+ +
+ +
+ Comments +
+
+ +
--}} + @endcomponent +
+ @else + @component('portal.ninja2020.components.general.card-element-single', ['title' => 'Direct Debit', 'show_title' => false]) + {{ ctrans('texts.bank_account_not_linked') }} + + {{ ctrans('texts.add_payment_method') }} + @endcomponent + @endif + + @if (count($tokens) > 0) + @include('portal.ninja2020.gateways.includes.pay_now') + @endif +@endsection + +@push('footer') + +@endpush \ No newline at end of file diff --git a/app/PaymentDrivers/Rotessa/resources/views/gateways/rotessa/components/account.blade.php b/app/PaymentDrivers/Rotessa/resources/views/gateways/rotessa/components/account.blade.php new file mode 100644 index 000000000000..c42672255b00 --- /dev/null +++ b/app/PaymentDrivers/Rotessa/resources/views/gateways/rotessa/components/account.blade.php @@ -0,0 +1,31 @@ +
+

+ Account Information +

+ +

+ Enter the information for the bank account +

+
+
+
+ Bank Name +
+
+ +
+
+ +
+
+ Account Number +
+
+ +
+
+ + + + +@include("rotessa::components.banks.$country.bank", compact('bank_account_type','routing_number','institution_number','transit_number')) \ No newline at end of file diff --git a/app/PaymentDrivers/Rotessa/resources/views/gateways/rotessa/components/address.blade.php b/app/PaymentDrivers/Rotessa/resources/views/gateways/rotessa/components/address.blade.php new file mode 100644 index 000000000000..9007501874c4 --- /dev/null +++ b/app/PaymentDrivers/Rotessa/resources/views/gateways/rotessa/components/address.blade.php @@ -0,0 +1,59 @@ + +
+

+ Address Information +

+ +

+ Enter the address information for the account holder +

+
+
+
+ Address Line 1 +
+
+ +
+
+ +
+
+ Address Line 2 +
+
+ +
+
+ +
+
+ City +
+
+ +
+
+ +
+
+ Postal Code +
+
+ +
+
+ +
+
+ Country +
+
+ +
+ +
+
+
+ + @include("rotessa::components.dropdowns.country.$country",compact('province_code')) \ No newline at end of file diff --git a/app/PaymentDrivers/Rotessa/resources/views/gateways/rotessa/components/banks/CA/bank.blade.php b/app/PaymentDrivers/Rotessa/resources/views/gateways/rotessa/components/banks/CA/bank.blade.php new file mode 100644 index 000000000000..3c37b84741c6 --- /dev/null +++ b/app/PaymentDrivers/Rotessa/resources/views/gateways/rotessa/components/banks/CA/bank.blade.php @@ -0,0 +1,17 @@ +
+
+ Transit Number +
+
+ +
+
+ +
+
+ Institution Number +
+
+ +
+
diff --git a/app/PaymentDrivers/Rotessa/resources/views/gateways/rotessa/components/banks/US/bank.blade.php b/app/PaymentDrivers/Rotessa/resources/views/gateways/rotessa/components/banks/US/bank.blade.php new file mode 100644 index 000000000000..07f7abee7b9a --- /dev/null +++ b/app/PaymentDrivers/Rotessa/resources/views/gateways/rotessa/components/banks/US/bank.blade.php @@ -0,0 +1,28 @@ + + +
+
+ Routing Number +
+
+ +
+
+ +
+
+ Account Type +
+
+
+
+ + +
+
+ + +
+
+
+
\ No newline at end of file diff --git a/app/PaymentDrivers/Rotessa/resources/views/gateways/rotessa/components/contact.blade.php b/app/PaymentDrivers/Rotessa/resources/views/gateways/rotessa/components/contact.blade.php new file mode 100644 index 000000000000..827fc587f5ad --- /dev/null +++ b/app/PaymentDrivers/Rotessa/resources/views/gateways/rotessa/components/contact.blade.php @@ -0,0 +1,69 @@ + +
+

+ Account Holder Information +

+ +

+ Enter the information for the account holder +

+
+ +
+
+ Full Name +
+
+ +
+
+ + +
+
+ Email Address +
+
+ +
+
+ +
+
+ Home Phone +
+
+ +
+
+ +
+
+ Other Phone +
+
+ +
+
+ +
+
+ Customer Type +
+
+
+
+ + +
+
+ + +
+
+
+
+ + + + \ No newline at end of file diff --git a/app/PaymentDrivers/Rotessa/resources/views/gateways/rotessa/components/dropdowns/country/CA.blade.php b/app/PaymentDrivers/Rotessa/resources/views/gateways/rotessa/components/dropdowns/country/CA.blade.php new file mode 100644 index 000000000000..f2d7a38a5ecb --- /dev/null +++ b/app/PaymentDrivers/Rotessa/resources/views/gateways/rotessa/components/dropdowns/country/CA.blade.php @@ -0,0 +1,12 @@ +
+
+ Province Code +
+
+ +
+
\ No newline at end of file diff --git a/app/PaymentDrivers/Rotessa/resources/views/gateways/rotessa/components/dropdowns/country/US.blade.php b/app/PaymentDrivers/Rotessa/resources/views/gateways/rotessa/components/dropdowns/country/US.blade.php new file mode 100644 index 000000000000..7c33af78d31a --- /dev/null +++ b/app/PaymentDrivers/Rotessa/resources/views/gateways/rotessa/components/dropdowns/country/US.blade.php @@ -0,0 +1,12 @@ +
+
+ State +
+
+ +
+
\ No newline at end of file diff --git a/app/PaymentDrivers/Rotessa/vendor/autoload.php b/app/PaymentDrivers/Rotessa/vendor/autoload.php new file mode 100644 index 000000000000..ff18c070b772 --- /dev/null +++ b/app/PaymentDrivers/Rotessa/vendor/autoload.php @@ -0,0 +1,25 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Autoload; + +/** + * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. + * + * $loader = new \Composer\Autoload\ClassLoader(); + * + * // register classes with namespaces + * $loader->add('Symfony\Component', __DIR__.'/component'); + * $loader->add('Symfony', __DIR__.'/framework'); + * + * // activate the autoloader + * $loader->register(); + * + * // to enable searching the include path (eg. for PEAR packages) + * $loader->setUseIncludePath(true); + * + * In this example, if you try to use a class in the Symfony\Component + * namespace or one of its children (Symfony\Component\Console for instance), + * the autoloader will first look for the class under the component/ + * directory, and it will then fallback to the framework/ directory if not + * found before giving up. + * + * This class is loosely based on the Symfony UniversalClassLoader. + * + * @author Fabien Potencier + * @author Jordi Boggiano + * @see https://www.php-fig.org/psr/psr-0/ + * @see https://www.php-fig.org/psr/psr-4/ + */ +class ClassLoader +{ + /** @var \Closure(string):void */ + private static $includeFile; + + /** @var string|null */ + private $vendorDir; + + // PSR-4 + /** + * @var array> + */ + private $prefixLengthsPsr4 = array(); + /** + * @var array> + */ + private $prefixDirsPsr4 = array(); + /** + * @var list + */ + private $fallbackDirsPsr4 = array(); + + // PSR-0 + /** + * List of PSR-0 prefixes + * + * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2'))) + * + * @var array>> + */ + private $prefixesPsr0 = array(); + /** + * @var list + */ + private $fallbackDirsPsr0 = array(); + + /** @var bool */ + private $useIncludePath = false; + + /** + * @var array + */ + private $classMap = array(); + + /** @var bool */ + private $classMapAuthoritative = false; + + /** + * @var array + */ + private $missingClasses = array(); + + /** @var string|null */ + private $apcuPrefix; + + /** + * @var array + */ + private static $registeredLoaders = array(); + + /** + * @param string|null $vendorDir + */ + public function __construct($vendorDir = null) + { + $this->vendorDir = $vendorDir; + self::initializeIncludeClosure(); + } + + /** + * @return array> + */ + public function getPrefixes() + { + if (!empty($this->prefixesPsr0)) { + return call_user_func_array('array_merge', array_values($this->prefixesPsr0)); + } + + return array(); + } + + /** + * @return array> + */ + public function getPrefixesPsr4() + { + return $this->prefixDirsPsr4; + } + + /** + * @return list + */ + public function getFallbackDirs() + { + return $this->fallbackDirsPsr0; + } + + /** + * @return list + */ + public function getFallbackDirsPsr4() + { + return $this->fallbackDirsPsr4; + } + + /** + * @return array Array of classname => path + */ + public function getClassMap() + { + return $this->classMap; + } + + /** + * @param array $classMap Class to filename map + * + * @return void + */ + public function addClassMap(array $classMap) + { + if ($this->classMap) { + $this->classMap = array_merge($this->classMap, $classMap); + } else { + $this->classMap = $classMap; + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, either + * appending or prepending to the ones previously set for this prefix. + * + * @param string $prefix The prefix + * @param list|string $paths The PSR-0 root directories + * @param bool $prepend Whether to prepend the directories + * + * @return void + */ + public function add($prefix, $paths, $prepend = false) + { + $paths = (array) $paths; + if (!$prefix) { + if ($prepend) { + $this->fallbackDirsPsr0 = array_merge( + $paths, + $this->fallbackDirsPsr0 + ); + } else { + $this->fallbackDirsPsr0 = array_merge( + $this->fallbackDirsPsr0, + $paths + ); + } + + return; + } + + $first = $prefix[0]; + if (!isset($this->prefixesPsr0[$first][$prefix])) { + $this->prefixesPsr0[$first][$prefix] = $paths; + + return; + } + if ($prepend) { + $this->prefixesPsr0[$first][$prefix] = array_merge( + $paths, + $this->prefixesPsr0[$first][$prefix] + ); + } else { + $this->prefixesPsr0[$first][$prefix] = array_merge( + $this->prefixesPsr0[$first][$prefix], + $paths + ); + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, either + * appending or prepending to the ones previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param list|string $paths The PSR-4 base directories + * @param bool $prepend Whether to prepend the directories + * + * @throws \InvalidArgumentException + * + * @return void + */ + public function addPsr4($prefix, $paths, $prepend = false) + { + $paths = (array) $paths; + if (!$prefix) { + // Register directories for the root namespace. + if ($prepend) { + $this->fallbackDirsPsr4 = array_merge( + $paths, + $this->fallbackDirsPsr4 + ); + } else { + $this->fallbackDirsPsr4 = array_merge( + $this->fallbackDirsPsr4, + $paths + ); + } + } elseif (!isset($this->prefixDirsPsr4[$prefix])) { + // Register directories for a new namespace. + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = $paths; + } elseif ($prepend) { + // Prepend directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + $paths, + $this->prefixDirsPsr4[$prefix] + ); + } else { + // Append directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + $this->prefixDirsPsr4[$prefix], + $paths + ); + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, + * replacing any others previously set for this prefix. + * + * @param string $prefix The prefix + * @param list|string $paths The PSR-0 base directories + * + * @return void + */ + public function set($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr0 = (array) $paths; + } else { + $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, + * replacing any others previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param list|string $paths The PSR-4 base directories + * + * @throws \InvalidArgumentException + * + * @return void + */ + public function setPsr4($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr4 = (array) $paths; + } else { + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = (array) $paths; + } + } + + /** + * Turns on searching the include path for class files. + * + * @param bool $useIncludePath + * + * @return void + */ + public function setUseIncludePath($useIncludePath) + { + $this->useIncludePath = $useIncludePath; + } + + /** + * Can be used to check if the autoloader uses the include path to check + * for classes. + * + * @return bool + */ + public function getUseIncludePath() + { + return $this->useIncludePath; + } + + /** + * Turns off searching the prefix and fallback directories for classes + * that have not been registered with the class map. + * + * @param bool $classMapAuthoritative + * + * @return void + */ + public function setClassMapAuthoritative($classMapAuthoritative) + { + $this->classMapAuthoritative = $classMapAuthoritative; + } + + /** + * Should class lookup fail if not found in the current class map? + * + * @return bool + */ + public function isClassMapAuthoritative() + { + return $this->classMapAuthoritative; + } + + /** + * APCu prefix to use to cache found/not-found classes, if the extension is enabled. + * + * @param string|null $apcuPrefix + * + * @return void + */ + public function setApcuPrefix($apcuPrefix) + { + $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; + } + + /** + * The APCu prefix in use, or null if APCu caching is not enabled. + * + * @return string|null + */ + public function getApcuPrefix() + { + return $this->apcuPrefix; + } + + /** + * Registers this instance as an autoloader. + * + * @param bool $prepend Whether to prepend the autoloader or not + * + * @return void + */ + public function register($prepend = false) + { + spl_autoload_register(array($this, 'loadClass'), true, $prepend); + + if (null === $this->vendorDir) { + return; + } + + if ($prepend) { + self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders; + } else { + unset(self::$registeredLoaders[$this->vendorDir]); + self::$registeredLoaders[$this->vendorDir] = $this; + } + } + + /** + * Unregisters this instance as an autoloader. + * + * @return void + */ + public function unregister() + { + spl_autoload_unregister(array($this, 'loadClass')); + + if (null !== $this->vendorDir) { + unset(self::$registeredLoaders[$this->vendorDir]); + } + } + + /** + * Loads the given class or interface. + * + * @param string $class The name of the class + * @return true|null True if loaded, null otherwise + */ + public function loadClass($class) + { + if ($file = $this->findFile($class)) { + $includeFile = self::$includeFile; + $includeFile($file); + + return true; + } + + return null; + } + + /** + * Finds the path to the file where the class is defined. + * + * @param string $class The name of the class + * + * @return string|false The path if found, false otherwise + */ + public function findFile($class) + { + // class map lookup + if (isset($this->classMap[$class])) { + return $this->classMap[$class]; + } + if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { + return false; + } + if (null !== $this->apcuPrefix) { + $file = apcu_fetch($this->apcuPrefix.$class, $hit); + if ($hit) { + return $file; + } + } + + $file = $this->findFileWithExtension($class, '.php'); + + // Search for Hack files if we are running on HHVM + if (false === $file && defined('HHVM_VERSION')) { + $file = $this->findFileWithExtension($class, '.hh'); + } + + if (null !== $this->apcuPrefix) { + apcu_add($this->apcuPrefix.$class, $file); + } + + if (false === $file) { + // Remember that this class does not exist. + $this->missingClasses[$class] = true; + } + + return $file; + } + + /** + * Returns the currently registered loaders keyed by their corresponding vendor directories. + * + * @return array + */ + public static function getRegisteredLoaders() + { + return self::$registeredLoaders; + } + + /** + * @param string $class + * @param string $ext + * @return string|false + */ + private function findFileWithExtension($class, $ext) + { + // PSR-4 lookup + $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; + + $first = $class[0]; + if (isset($this->prefixLengthsPsr4[$first])) { + $subPath = $class; + while (false !== $lastPos = strrpos($subPath, '\\')) { + $subPath = substr($subPath, 0, $lastPos); + $search = $subPath . '\\'; + if (isset($this->prefixDirsPsr4[$search])) { + $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); + foreach ($this->prefixDirsPsr4[$search] as $dir) { + if (file_exists($file = $dir . $pathEnd)) { + return $file; + } + } + } + } + } + + // PSR-4 fallback dirs + foreach ($this->fallbackDirsPsr4 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { + return $file; + } + } + + // PSR-0 lookup + if (false !== $pos = strrpos($class, '\\')) { + // namespaced class name + $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) + . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); + } else { + // PEAR-like class name + $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; + } + + if (isset($this->prefixesPsr0[$first])) { + foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { + if (0 === strpos($class, $prefix)) { + foreach ($dirs as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + } + } + } + + // PSR-0 fallback dirs + foreach ($this->fallbackDirsPsr0 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + + // PSR-0 include paths. + if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { + return $file; + } + + return false; + } + + /** + * @return void + */ + private static function initializeIncludeClosure() + { + if (self::$includeFile !== null) { + return; + } + + /** + * Scope isolated include. + * + * Prevents access to $this/self from included files. + * + * @param string $file + * @return void + */ + self::$includeFile = \Closure::bind(static function($file) { + include $file; + }, null, null); + } +} diff --git a/app/PaymentDrivers/Rotessa/vendor/composer/InstalledVersions.php b/app/PaymentDrivers/Rotessa/vendor/composer/InstalledVersions.php new file mode 100644 index 000000000000..51e734a774b3 --- /dev/null +++ b/app/PaymentDrivers/Rotessa/vendor/composer/InstalledVersions.php @@ -0,0 +1,359 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer; + +use Composer\Autoload\ClassLoader; +use Composer\Semver\VersionParser; + +/** + * This class is copied in every Composer installed project and available to all + * + * See also https://getcomposer.org/doc/07-runtime.md#installed-versions + * + * To require its presence, you can require `composer-runtime-api ^2.0` + * + * @final + */ +class InstalledVersions +{ + /** + * @var mixed[]|null + * @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array}|array{}|null + */ + private static $installed; + + /** + * @var bool|null + */ + private static $canGetVendors; + + /** + * @var array[] + * @psalm-var array}> + */ + private static $installedByVendor = array(); + + /** + * Returns a list of all package names which are present, either by being installed, replaced or provided + * + * @return string[] + * @psalm-return list + */ + public static function getInstalledPackages() + { + $packages = array(); + foreach (self::getInstalled() as $installed) { + $packages[] = array_keys($installed['versions']); + } + + if (1 === \count($packages)) { + return $packages[0]; + } + + return array_keys(array_flip(\call_user_func_array('array_merge', $packages))); + } + + /** + * Returns a list of all package names with a specific type e.g. 'library' + * + * @param string $type + * @return string[] + * @psalm-return list + */ + public static function getInstalledPackagesByType($type) + { + $packagesByType = array(); + + foreach (self::getInstalled() as $installed) { + foreach ($installed['versions'] as $name => $package) { + if (isset($package['type']) && $package['type'] === $type) { + $packagesByType[] = $name; + } + } + } + + return $packagesByType; + } + + /** + * Checks whether the given package is installed + * + * This also returns true if the package name is provided or replaced by another package + * + * @param string $packageName + * @param bool $includeDevRequirements + * @return bool + */ + public static function isInstalled($packageName, $includeDevRequirements = true) + { + foreach (self::getInstalled() as $installed) { + if (isset($installed['versions'][$packageName])) { + return $includeDevRequirements || !isset($installed['versions'][$packageName]['dev_requirement']) || $installed['versions'][$packageName]['dev_requirement'] === false; + } + } + + return false; + } + + /** + * Checks whether the given package satisfies a version constraint + * + * e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call: + * + * Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3') + * + * @param VersionParser $parser Install composer/semver to have access to this class and functionality + * @param string $packageName + * @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package + * @return bool + */ + public static function satisfies(VersionParser $parser, $packageName, $constraint) + { + $constraint = $parser->parseConstraints((string) $constraint); + $provided = $parser->parseConstraints(self::getVersionRanges($packageName)); + + return $provided->matches($constraint); + } + + /** + * Returns a version constraint representing all the range(s) which are installed for a given package + * + * It is easier to use this via isInstalled() with the $constraint argument if you need to check + * whether a given version of a package is installed, and not just whether it exists + * + * @param string $packageName + * @return string Version constraint usable with composer/semver + */ + public static function getVersionRanges($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + $ranges = array(); + if (isset($installed['versions'][$packageName]['pretty_version'])) { + $ranges[] = $installed['versions'][$packageName]['pretty_version']; + } + if (array_key_exists('aliases', $installed['versions'][$packageName])) { + $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']); + } + if (array_key_exists('replaced', $installed['versions'][$packageName])) { + $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']); + } + if (array_key_exists('provided', $installed['versions'][$packageName])) { + $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']); + } + + return implode(' || ', $ranges); + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present + */ + public static function getVersion($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + if (!isset($installed['versions'][$packageName]['version'])) { + return null; + } + + return $installed['versions'][$packageName]['version']; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present + */ + public static function getPrettyVersion($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + if (!isset($installed['versions'][$packageName]['pretty_version'])) { + return null; + } + + return $installed['versions'][$packageName]['pretty_version']; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference + */ + public static function getReference($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + if (!isset($installed['versions'][$packageName]['reference'])) { + return null; + } + + return $installed['versions'][$packageName]['reference']; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path. + */ + public static function getInstallPath($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @return array + * @psalm-return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool} + */ + public static function getRootPackage() + { + $installed = self::getInstalled(); + + return $installed[0]['root']; + } + + /** + * Returns the raw installed.php data for custom implementations + * + * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect. + * @return array[] + * @psalm-return array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} + */ + public static function getRawData() + { + @trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED); + + if (null === self::$installed) { + // only require the installed.php file if this file is loaded from its dumped location, + // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 + if (substr(__DIR__, -8, 1) !== 'C') { + self::$installed = include __DIR__ . '/installed.php'; + } else { + self::$installed = array(); + } + } + + return self::$installed; + } + + /** + * Returns the raw data of all installed.php which are currently loaded for custom implementations + * + * @return array[] + * @psalm-return list}> + */ + public static function getAllRawData() + { + return self::getInstalled(); + } + + /** + * Lets you reload the static array from another file + * + * This is only useful for complex integrations in which a project needs to use + * this class but then also needs to execute another project's autoloader in process, + * and wants to ensure both projects have access to their version of installed.php. + * + * A typical case would be PHPUnit, where it would need to make sure it reads all + * the data it needs from this class, then call reload() with + * `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure + * the project in which it runs can then also use this class safely, without + * interference between PHPUnit's dependencies and the project's dependencies. + * + * @param array[] $data A vendor/composer/installed.php data set + * @return void + * + * @psalm-param array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $data + */ + public static function reload($data) + { + self::$installed = $data; + self::$installedByVendor = array(); + } + + /** + * @return array[] + * @psalm-return list}> + */ + private static function getInstalled() + { + if (null === self::$canGetVendors) { + self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders'); + } + + $installed = array(); + + if (self::$canGetVendors) { + foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { + if (isset(self::$installedByVendor[$vendorDir])) { + $installed[] = self::$installedByVendor[$vendorDir]; + } elseif (is_file($vendorDir.'/composer/installed.php')) { + /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $required */ + $required = require $vendorDir.'/composer/installed.php'; + $installed[] = self::$installedByVendor[$vendorDir] = $required; + if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) { + self::$installed = $installed[count($installed) - 1]; + } + } + } + } + + if (null === self::$installed) { + // only require the installed.php file if this file is loaded from its dumped location, + // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 + if (substr(__DIR__, -8, 1) !== 'C') { + /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $required */ + $required = require __DIR__ . '/installed.php'; + self::$installed = $required; + } else { + self::$installed = array(); + } + } + + if (self::$installed !== array()) { + $installed[] = self::$installed; + } + + return $installed; + } +} diff --git a/app/PaymentDrivers/Rotessa/vendor/composer/LICENSE b/app/PaymentDrivers/Rotessa/vendor/composer/LICENSE new file mode 100644 index 000000000000..f27399a042d9 --- /dev/null +++ b/app/PaymentDrivers/Rotessa/vendor/composer/LICENSE @@ -0,0 +1,21 @@ + +Copyright (c) Nils Adermann, Jordi Boggiano + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + diff --git a/app/PaymentDrivers/Rotessa/vendor/composer/autoload_classmap.php b/app/PaymentDrivers/Rotessa/vendor/composer/autoload_classmap.php new file mode 100644 index 000000000000..45e77acc6441 --- /dev/null +++ b/app/PaymentDrivers/Rotessa/vendor/composer/autoload_classmap.php @@ -0,0 +1,69 @@ + $baseDir . '/DataProviders/CAProvinces.php', + 'App\\PaymentDrivers\\Rotessa\\DataProviders\\Frequencies' => $baseDir . '/DataProviders/Frequencies.php', + 'App\\PaymentDrivers\\Rotessa\\Events\\CacheGateways' => $baseDir . '/Events/CacheGateways.php', + 'App\\PaymentDrivers\\Rotessa\\Listeners\\CacheGateways' => $baseDir . '/Listeners/CacheGateways.php', + 'App\\PaymentDrivers\\Rotessa\\Models\\Gateway' => $baseDir . '/Models/Gateway.php', + 'App\\PaymentDrivers\\Rotessa\\PaymentMethod' => $baseDir . '/PaymentMethod.php', + 'App\\PaymentDrivers\\Rotessa\\Providers\\EventServiceProvider' => $baseDir . '/Providers/EventServiceProvider.php', + 'App\\PaymentDrivers\\Rotessa\\Providers\\ServiceProvider' => $baseDir . '/Providers/ServiceProvider.php', + 'App\\PaymentDrivers\\Rotessa\\Resources\\Customer' => $baseDir . '/Resources/Customer.php', + 'App\\PaymentDrivers\\Rotessa\\Resources\\Transaction' => $baseDir . '/Resources/Transaction.php', + 'App\\PaymentDrivers\\Rotessa\\View\\Components\\AccountComponent' => $baseDir . '/View/Components/Components.php', + 'App\\PaymentDrivers\\Rotessa\\View\\Components\\AddressComponent' => $baseDir . '/View/Components/Components.php', + 'App\\PaymentDrivers\\Rotessa\\View\\Components\\ContactComponent' => $baseDir . '/View/Components/Components.php', + 'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php', + 'Omnipay\\Rotessa\\AbstractClient' => $vendorDir . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/AbstractClient.php', + 'Omnipay\\Rotessa\\ApiTrait' => $vendorDir . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/ApiTrait.php', + 'Omnipay\\Rotessa\\ClientInterface' => $vendorDir . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/ClientInterface.php', + 'Omnipay\\Rotessa\\Exception\\BadRequestException' => $vendorDir . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Exception/Exceptions.php', + 'Omnipay\\Rotessa\\Exception\\InternalServerErrorException' => $vendorDir . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Exception/Exceptions.php', + 'Omnipay\\Rotessa\\Exception\\NotAcceptableException' => $vendorDir . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Exception/Exceptions.php', + 'Omnipay\\Rotessa\\Exception\\NotFoundException' => $vendorDir . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Exception/Exceptions.php', + 'Omnipay\\Rotessa\\Exception\\ServiceUnavailableException' => $vendorDir . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Exception/Exceptions.php', + 'Omnipay\\Rotessa\\Exception\\UnauthorizedException' => $vendorDir . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Exception/Exceptions.php', + 'Omnipay\\Rotessa\\Exception\\UnprocessableEntityException' => $vendorDir . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Exception/Exceptions.php', + 'Omnipay\\Rotessa\\Exception\\ValidationException' => $vendorDir . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Exception/Exceptions.php', + 'Omnipay\\Rotessa\\Gateway' => $vendorDir . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Gateway.php', + 'Omnipay\\Rotessa\\Http\\Client' => $vendorDir . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Http/Client.php', + 'Omnipay\\Rotessa\\Http\\Response\\Response' => $vendorDir . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Http/Response/Response.php', + 'Omnipay\\Rotessa\\IsValidTypeTrait' => $vendorDir . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/IsValidTypeTrait.php', + 'Omnipay\\Rotessa\\Message\\Request\\AbstractRequest' => $vendorDir . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Message/Request/AbstractRequest.php', + 'Omnipay\\Rotessa\\Message\\Request\\BaseRequest' => $vendorDir . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Message/Request/BaseRequest.php', + 'Omnipay\\Rotessa\\Message\\Request\\DeleteTransactionSchedulesId' => $vendorDir . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Message/Request/DeleteTransactionSchedulesId.php', + 'Omnipay\\Rotessa\\Message\\Request\\GetCustomers' => $vendorDir . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Message/Request/GetCustomers.php', + 'Omnipay\\Rotessa\\Message\\Request\\GetCustomersId' => $vendorDir . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Message/Request/GetCustomersId.php', + 'Omnipay\\Rotessa\\Message\\Request\\GetTransactionSchedulesId' => $vendorDir . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Message/Request/GetTransactionSchedulesId.php', + 'Omnipay\\Rotessa\\Message\\Request\\PatchCustomersId' => $vendorDir . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Message/Request/PatchCustomersId.php', + 'Omnipay\\Rotessa\\Message\\Request\\PatchTransactionSchedulesId' => $vendorDir . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Message/Request/PatchTransactionSchedulesId.php', + 'Omnipay\\Rotessa\\Message\\Request\\PostCustomers' => $vendorDir . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Message/Request/PostCustomers.php', + 'Omnipay\\Rotessa\\Message\\Request\\PostCustomersShowWithCustomIdentifier' => $vendorDir . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Message/Request/PostCustomersShowWithCustomIdentifier.php', + 'Omnipay\\Rotessa\\Message\\Request\\PostTransactionSchedules' => $vendorDir . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Message/Request/PostTransactionSchedules.php', + 'Omnipay\\Rotessa\\Message\\Request\\PostTransactionSchedulesCreateWithCustomIdentifier' => $vendorDir . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Message/Request/PostTransactionSchedulesCreateWithCustomIdentifier.php', + 'Omnipay\\Rotessa\\Message\\Request\\PostTransactionSchedulesUpdateViaPost' => $vendorDir . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Message/Request/PostTransactionSchedulesUpdateViaPost.php', + 'Omnipay\\Rotessa\\Message\\Request\\RequestInterface' => $vendorDir . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Message/Request/RequestInterface.php', + 'Omnipay\\Rotessa\\Message\\Response\\AbstractResponse' => $vendorDir . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Message/Response/AbstractResponse.php', + 'Omnipay\\Rotessa\\Message\\Response\\BaseResponse' => $vendorDir . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Message/Response/BaseResponse.php', + 'Omnipay\\Rotessa\\Message\\Response\\ResponseInterface' => $vendorDir . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Message/Response/ResponseInterface.php', + 'Omnipay\\Rotessa\\Model\\AbstractModel' => $vendorDir . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Model/AbstractModel.php', + 'Omnipay\\Rotessa\\Model\\BaseModel' => $vendorDir . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Model/BaseModel.php', + 'Omnipay\\Rotessa\\Model\\CustomerModel' => $vendorDir . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Model/CustomerModel.php', + 'Omnipay\\Rotessa\\Model\\CustomerPatchModel' => $vendorDir . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Model/CustomerPatchModel.php', + 'Omnipay\\Rotessa\\Model\\ModelInterface' => $vendorDir . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Model/ModelInterface.php', + 'Omnipay\\Rotessa\\Model\\TransactionScheduleModel' => $vendorDir . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Model/TransactionScheduleModel.php', + 'Omnipay\\Rotessa\\Model\\TransactionSchedulesIdBodyModel' => $vendorDir . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Model/TransactionSchedulesIdBodyModel.php', + 'Omnipay\\Rotessa\\Model\\TransactionSchedulesUpdateViaPostBodyModel' => $vendorDir . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Model/TransactionSchedulesUpdateViaPostBodyModel.php', + 'Omnipay\\Rotessa\\Object\\Address' => $vendorDir . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Object/Address.php', + 'Omnipay\\Rotessa\\Object\\AuthorizationType' => $vendorDir . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Object/AuthorizationType.php', + 'Omnipay\\Rotessa\\Object\\BankAccountType' => $vendorDir . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Object/BankAccountType.php', + 'Omnipay\\Rotessa\\Object\\Country' => $vendorDir . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Object/Country.php', + 'Omnipay\\Rotessa\\Object\\CustomerType' => $vendorDir . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Object/CustomerType.php', + 'Omnipay\\Rotessa\\Object\\Frequency' => $vendorDir . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Object/Frequency.php', +); diff --git a/app/PaymentDrivers/Rotessa/vendor/composer/autoload_files.php b/app/PaymentDrivers/Rotessa/vendor/composer/autoload_files.php new file mode 100644 index 000000000000..1dfada572dbd --- /dev/null +++ b/app/PaymentDrivers/Rotessa/vendor/composer/autoload_files.php @@ -0,0 +1,10 @@ + $baseDir . '/View/Composers/Composer.php', +); diff --git a/app/PaymentDrivers/Rotessa/vendor/composer/autoload_namespaces.php b/app/PaymentDrivers/Rotessa/vendor/composer/autoload_namespaces.php new file mode 100644 index 000000000000..15a2ff3ad6d8 --- /dev/null +++ b/app/PaymentDrivers/Rotessa/vendor/composer/autoload_namespaces.php @@ -0,0 +1,9 @@ + array($vendorDir . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Exception'), + 'Omnipay\\Rotessa\\' => array($vendorDir . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa'), + 'App\\PaymentDrivers\\Rotessa\\View\\Components\\' => array($baseDir . '/View/Components'), + 'App\\PaymentDrivers\\Rotessa\\Database\\Seeders\\' => array($baseDir . '/Database/Seeders'), + 'App\\PaymentDrivers\\Rotessa\\' => array($baseDir . '/'), +); diff --git a/app/PaymentDrivers/Rotessa/vendor/composer/autoload_real.php b/app/PaymentDrivers/Rotessa/vendor/composer/autoload_real.php new file mode 100644 index 000000000000..c792b343f965 --- /dev/null +++ b/app/PaymentDrivers/Rotessa/vendor/composer/autoload_real.php @@ -0,0 +1,48 @@ +register(true); + + $filesToLoad = \Composer\Autoload\ComposerStaticInita0415998b2208af2a6b954b72fdf7005::$files; + $requireFile = \Closure::bind(static function ($fileIdentifier, $file) { + if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { + $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; + + require $file; + } + }, null, null); + foreach ($filesToLoad as $fileIdentifier => $file) { + $requireFile($fileIdentifier, $file); + } + + return $loader; + } +} diff --git a/app/PaymentDrivers/Rotessa/vendor/composer/autoload_static.php b/app/PaymentDrivers/Rotessa/vendor/composer/autoload_static.php new file mode 100644 index 000000000000..4b6356219f6c --- /dev/null +++ b/app/PaymentDrivers/Rotessa/vendor/composer/autoload_static.php @@ -0,0 +1,122 @@ + __DIR__ . '/../..' . '/View/Composers/Composer.php', + ); + + public static $prefixLengthsPsr4 = array ( + 'O' => + array ( + 'Omnipay\\Rotessa\\Exception\\' => 26, + 'Omnipay\\Rotessa\\' => 16, + ), + 'A' => + array ( + 'App\\PaymentDrivers\\Rotessa\\View\\Components\\' => 43, + 'App\\PaymentDrivers\\Rotessa\\Database\\Seeders\\' => 44, + 'App\\PaymentDrivers\\Rotessa\\' => 27, + ), + ); + + public static $prefixDirsPsr4 = array ( + 'Omnipay\\Rotessa\\Exception\\' => + array ( + 0 => __DIR__ . '/..' . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Exception', + ), + 'Omnipay\\Rotessa\\' => + array ( + 0 => __DIR__ . '/..' . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa', + ), + 'App\\PaymentDrivers\\Rotessa\\View\\Components\\' => + array ( + 0 => __DIR__ . '/../..' . '/View/Components', + ), + 'App\\PaymentDrivers\\Rotessa\\Database\\Seeders\\' => + array ( + 0 => __DIR__ . '/../..' . '/Database/Seeders', + ), + 'App\\PaymentDrivers\\Rotessa\\' => + array ( + 0 => __DIR__ . '/../..' . '/', + ), + ); + + public static $classMap = array ( + 'App\\PaymentDrivers\\Rotessa\\DataProviders\\CAProvinces' => __DIR__ . '/../..' . '/DataProviders/CAProvinces.php', + 'App\\PaymentDrivers\\Rotessa\\DataProviders\\Frequencies' => __DIR__ . '/../..' . '/DataProviders/Frequencies.php', + 'App\\PaymentDrivers\\Rotessa\\Events\\CacheGateways' => __DIR__ . '/../..' . '/Events/CacheGateways.php', + 'App\\PaymentDrivers\\Rotessa\\Listeners\\CacheGateways' => __DIR__ . '/../..' . '/Listeners/CacheGateways.php', + 'App\\PaymentDrivers\\Rotessa\\Models\\Gateway' => __DIR__ . '/../..' . '/Models/Gateway.php', + 'App\\PaymentDrivers\\Rotessa\\PaymentMethod' => __DIR__ . '/../..' . '/PaymentMethod.php', + 'App\\PaymentDrivers\\Rotessa\\Providers\\EventServiceProvider' => __DIR__ . '/../..' . '/Providers/EventServiceProvider.php', + 'App\\PaymentDrivers\\Rotessa\\Providers\\ServiceProvider' => __DIR__ . '/../..' . '/Providers/ServiceProvider.php', + 'App\\PaymentDrivers\\Rotessa\\Resources\\Customer' => __DIR__ . '/../..' . '/Resources/Customer.php', + 'App\\PaymentDrivers\\Rotessa\\Resources\\Transaction' => __DIR__ . '/../..' . '/Resources/Transaction.php', + 'App\\PaymentDrivers\\Rotessa\\View\\Components\\AccountComponent' => __DIR__ . '/../..' . '/View/Components/Components.php', + 'App\\PaymentDrivers\\Rotessa\\View\\Components\\AddressComponent' => __DIR__ . '/../..' . '/View/Components/Components.php', + 'App\\PaymentDrivers\\Rotessa\\View\\Components\\ContactComponent' => __DIR__ . '/../..' . '/View/Components/Components.php', + 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', + 'Omnipay\\Rotessa\\AbstractClient' => __DIR__ . '/..' . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/AbstractClient.php', + 'Omnipay\\Rotessa\\ApiTrait' => __DIR__ . '/..' . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/ApiTrait.php', + 'Omnipay\\Rotessa\\ClientInterface' => __DIR__ . '/..' . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/ClientInterface.php', + 'Omnipay\\Rotessa\\Exception\\BadRequestException' => __DIR__ . '/..' . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Exception/Exceptions.php', + 'Omnipay\\Rotessa\\Exception\\InternalServerErrorException' => __DIR__ . '/..' . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Exception/Exceptions.php', + 'Omnipay\\Rotessa\\Exception\\NotAcceptableException' => __DIR__ . '/..' . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Exception/Exceptions.php', + 'Omnipay\\Rotessa\\Exception\\NotFoundException' => __DIR__ . '/..' . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Exception/Exceptions.php', + 'Omnipay\\Rotessa\\Exception\\ServiceUnavailableException' => __DIR__ . '/..' . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Exception/Exceptions.php', + 'Omnipay\\Rotessa\\Exception\\UnauthorizedException' => __DIR__ . '/..' . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Exception/Exceptions.php', + 'Omnipay\\Rotessa\\Exception\\UnprocessableEntityException' => __DIR__ . '/..' . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Exception/Exceptions.php', + 'Omnipay\\Rotessa\\Exception\\ValidationException' => __DIR__ . '/..' . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Exception/Exceptions.php', + 'Omnipay\\Rotessa\\Gateway' => __DIR__ . '/..' . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Gateway.php', + 'Omnipay\\Rotessa\\Http\\Client' => __DIR__ . '/..' . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Http/Client.php', + 'Omnipay\\Rotessa\\Http\\Response\\Response' => __DIR__ . '/..' . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Http/Response/Response.php', + 'Omnipay\\Rotessa\\IsValidTypeTrait' => __DIR__ . '/..' . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/IsValidTypeTrait.php', + 'Omnipay\\Rotessa\\Message\\Request\\AbstractRequest' => __DIR__ . '/..' . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Message/Request/AbstractRequest.php', + 'Omnipay\\Rotessa\\Message\\Request\\BaseRequest' => __DIR__ . '/..' . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Message/Request/BaseRequest.php', + 'Omnipay\\Rotessa\\Message\\Request\\DeleteTransactionSchedulesId' => __DIR__ . '/..' . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Message/Request/DeleteTransactionSchedulesId.php', + 'Omnipay\\Rotessa\\Message\\Request\\GetCustomers' => __DIR__ . '/..' . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Message/Request/GetCustomers.php', + 'Omnipay\\Rotessa\\Message\\Request\\GetCustomersId' => __DIR__ . '/..' . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Message/Request/GetCustomersId.php', + 'Omnipay\\Rotessa\\Message\\Request\\GetTransactionSchedulesId' => __DIR__ . '/..' . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Message/Request/GetTransactionSchedulesId.php', + 'Omnipay\\Rotessa\\Message\\Request\\PatchCustomersId' => __DIR__ . '/..' . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Message/Request/PatchCustomersId.php', + 'Omnipay\\Rotessa\\Message\\Request\\PatchTransactionSchedulesId' => __DIR__ . '/..' . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Message/Request/PatchTransactionSchedulesId.php', + 'Omnipay\\Rotessa\\Message\\Request\\PostCustomers' => __DIR__ . '/..' . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Message/Request/PostCustomers.php', + 'Omnipay\\Rotessa\\Message\\Request\\PostCustomersShowWithCustomIdentifier' => __DIR__ . '/..' . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Message/Request/PostCustomersShowWithCustomIdentifier.php', + 'Omnipay\\Rotessa\\Message\\Request\\PostTransactionSchedules' => __DIR__ . '/..' . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Message/Request/PostTransactionSchedules.php', + 'Omnipay\\Rotessa\\Message\\Request\\PostTransactionSchedulesCreateWithCustomIdentifier' => __DIR__ . '/..' . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Message/Request/PostTransactionSchedulesCreateWithCustomIdentifier.php', + 'Omnipay\\Rotessa\\Message\\Request\\PostTransactionSchedulesUpdateViaPost' => __DIR__ . '/..' . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Message/Request/PostTransactionSchedulesUpdateViaPost.php', + 'Omnipay\\Rotessa\\Message\\Request\\RequestInterface' => __DIR__ . '/..' . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Message/Request/RequestInterface.php', + 'Omnipay\\Rotessa\\Message\\Response\\AbstractResponse' => __DIR__ . '/..' . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Message/Response/AbstractResponse.php', + 'Omnipay\\Rotessa\\Message\\Response\\BaseResponse' => __DIR__ . '/..' . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Message/Response/BaseResponse.php', + 'Omnipay\\Rotessa\\Message\\Response\\ResponseInterface' => __DIR__ . '/..' . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Message/Response/ResponseInterface.php', + 'Omnipay\\Rotessa\\Model\\AbstractModel' => __DIR__ . '/..' . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Model/AbstractModel.php', + 'Omnipay\\Rotessa\\Model\\BaseModel' => __DIR__ . '/..' . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Model/BaseModel.php', + 'Omnipay\\Rotessa\\Model\\CustomerModel' => __DIR__ . '/..' . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Model/CustomerModel.php', + 'Omnipay\\Rotessa\\Model\\CustomerPatchModel' => __DIR__ . '/..' . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Model/CustomerPatchModel.php', + 'Omnipay\\Rotessa\\Model\\ModelInterface' => __DIR__ . '/..' . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Model/ModelInterface.php', + 'Omnipay\\Rotessa\\Model\\TransactionScheduleModel' => __DIR__ . '/..' . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Model/TransactionScheduleModel.php', + 'Omnipay\\Rotessa\\Model\\TransactionSchedulesIdBodyModel' => __DIR__ . '/..' . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Model/TransactionSchedulesIdBodyModel.php', + 'Omnipay\\Rotessa\\Model\\TransactionSchedulesUpdateViaPostBodyModel' => __DIR__ . '/..' . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Model/TransactionSchedulesUpdateViaPostBodyModel.php', + 'Omnipay\\Rotessa\\Object\\Address' => __DIR__ . '/..' . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Object/Address.php', + 'Omnipay\\Rotessa\\Object\\AuthorizationType' => __DIR__ . '/..' . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Object/AuthorizationType.php', + 'Omnipay\\Rotessa\\Object\\BankAccountType' => __DIR__ . '/..' . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Object/BankAccountType.php', + 'Omnipay\\Rotessa\\Object\\Country' => __DIR__ . '/..' . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Object/Country.php', + 'Omnipay\\Rotessa\\Object\\CustomerType' => __DIR__ . '/..' . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Object/CustomerType.php', + 'Omnipay\\Rotessa\\Object\\Frequency' => __DIR__ . '/..' . '/karneaud/omnipay-rotessa/src/Omnipay/Rotessa/Object/Frequency.php', + ); + + public static function getInitializer(ClassLoader $loader) + { + return \Closure::bind(function () use ($loader) { + $loader->prefixLengthsPsr4 = ComposerStaticInita0415998b2208af2a6b954b72fdf7005::$prefixLengthsPsr4; + $loader->prefixDirsPsr4 = ComposerStaticInita0415998b2208af2a6b954b72fdf7005::$prefixDirsPsr4; + $loader->classMap = ComposerStaticInita0415998b2208af2a6b954b72fdf7005::$classMap; + + }, null, ClassLoader::class); + } +} diff --git a/app/PaymentDrivers/Rotessa/vendor/composer/installed.json b/app/PaymentDrivers/Rotessa/vendor/composer/installed.json new file mode 100644 index 000000000000..0e82da86c48f --- /dev/null +++ b/app/PaymentDrivers/Rotessa/vendor/composer/installed.json @@ -0,0 +1,32 @@ +{ + "packages": [ + { + "name": "karneaud/omnipay-rotessa", + "version": "1.0.0-beta", + "version_normalized": "1.0.0.0-beta", + "source": { + "type": "git", + "url": "https://github.com/karneaud/omnipay-rotessa.git", + "reference": "master" + }, + "dist": { + "type": "zip", + "url": "https://github.com/karneaud/omnipay-rotessa/archive/refs/tags/v1.0.0-beta.zip" + }, + "type": "library", + "installation-source": "source", + "autoload": { + "psr-4": { + "Omnipay\\Rotessa\\": "./src/Omnipay/Rotessa/", + "Omnipay\\Rotessa\\Exception\\": "./src/Omnipay/Rotessa/Exception/" + }, + "classmap": [ + "./src/Omnipay/Rotessa/Exception/Exceptions.php" + ] + }, + "install-path": "../karneaud/omnipay-rotessa" + } + ], + "dev": true, + "dev-package-names": [] +} diff --git a/app/PaymentDrivers/Rotessa/vendor/composer/installed.php b/app/PaymentDrivers/Rotessa/vendor/composer/installed.php new file mode 100644 index 000000000000..6a55666ddf6f --- /dev/null +++ b/app/PaymentDrivers/Rotessa/vendor/composer/installed.php @@ -0,0 +1,32 @@ + array( + 'name' => 'karneaud/invoiceninja-rotessa', + 'pretty_version' => '1.0.0+no-version-set', + 'version' => '1.0.0.0', + 'reference' => null, + 'type' => 'laravel-module', + 'install_path' => __DIR__ . '/../../', + 'aliases' => array(), + 'dev' => true, + ), + 'versions' => array( + 'karneaud/invoiceninja-rotessa' => array( + 'pretty_version' => '1.0.0+no-version-set', + 'version' => '1.0.0.0', + 'reference' => null, + 'type' => 'laravel-module', + 'install_path' => __DIR__ . '/../../', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'karneaud/omnipay-rotessa' => array( + 'pretty_version' => '1.0.0-beta', + 'version' => '1.0.0.0-beta', + 'reference' => 'master', + 'type' => 'library', + 'install_path' => __DIR__ . '/../karneaud/omnipay-rotessa', + 'aliases' => array(), + 'dev_requirement' => false, + ), + ), +); diff --git a/app/PaymentDrivers/Rotessa/vendor/karneaud/omnipay-rotessa b/app/PaymentDrivers/Rotessa/vendor/karneaud/omnipay-rotessa new file mode 160000 index 000000000000..c3107930d3f9 --- /dev/null +++ b/app/PaymentDrivers/Rotessa/vendor/karneaud/omnipay-rotessa @@ -0,0 +1 @@ +Subproject commit c3107930d3f9d656ae3287241ebeded9a1daf8a9 diff --git a/app/PaymentDrivers/RotessaPaymentDriver.php b/app/PaymentDrivers/RotessaPaymentDriver.php new file mode 100644 index 000000000000..de22db09112a --- /dev/null +++ b/app/PaymentDrivers/RotessaPaymentDriver.php @@ -0,0 +1,109 @@ + BankTransfer::class, + GatewayType::BACS => BankTransfer::class, + GatewayType::ACSS => BankTransfer::class, + GatewayType::DIRECT_DEBIT => BankTransfer::class + ]; + + public function init(): self + { + + $this->gateway = Omnipay::create( + $this->company_gateway->gateway->provider + ); + $this->gateway->initialize((array) $this->company_gateway->getConfig()); + return $this; + } + + public function gatewayTypes(): array + { + $types = []; + + if ($this->client + && isset($this->client->country) + && (in_array($this->client->country->iso_3166_2, ['US']) || ($this->client->gateway_tokens()->where('gateway_type_id', GatewayType::BANK_TRANSFER)->exists())) + ) { + $types[] = GatewayType::BANK_TRANSFER; + } + + if ($this->client + && $this->client->currency() + && in_array($this->client->currency()->code, ['CAD', 'USD']) + && isset($this->client->country) + && in_array($this->client->country->iso_3166_2, ['CA', 'US'])) { + $types[] = GatewayType::DIRECT_DEBIT; + $types[] = GatewayType::ACSS; + } + + return $types; + } + + + public function setPaymentMethod($payment_method_id) + { + $class = self::$methods[$payment_method_id]; + $this->payment_method = new $class($this); + + return $this; + } + + public function authorizeView(array $data) + { + return $this->payment_method->authorizeView($data); + } + + public function authorizeResponse($request) + { + return $this->payment_method->authorizeResponse($request); + } + + public function processPaymentView(array $data) + { + return $this->payment_method->paymentView($data); + } + + public function processPaymentResponse($request) + { + return $this->payment_method->paymentResponse($request); + } + + +}