Upgrade for iDeal 2.0

This commit is contained in:
David Bomba 2025-03-08 10:33:34 +11:00
parent 12f6d9d7fc
commit 68bfd04d8f
9 changed files with 76 additions and 129 deletions

View File

@ -29,7 +29,9 @@ class ChartController extends BaseController
{ {
/** @var \App\Models\User auth()->user() */ /** @var \App\Models\User auth()->user() */
$user = auth()->user(); $user = auth()->user();
$cs = new ChartService($user->company(), $user, $user->isAdmin()); $admin_equivalent_permissions = $user->isAdmin() || $user->hasExactPermissionAndAll('view_all') || $user->hasExactPermissionAndAll('edit_all');
$cs = new ChartService($user->company(), $user, $admin_equivalent_permissions);
return response()->json($cs->totals($request->input('start_date'), $request->input('end_date')), 200); return response()->json($cs->totals($request->input('start_date'), $request->input('end_date')), 200);
} }
@ -39,7 +41,9 @@ class ChartController extends BaseController
/** @var \App\Models\User auth()->user() */ /** @var \App\Models\User auth()->user() */
$user = auth()->user(); $user = auth()->user();
$cs = new ChartService($user->company(), $user, $user->isAdmin()); $admin_equivalent_permissions = $user->isAdmin() || $user->hasExactPermissionAndAll('view_all') || $user->hasExactPermissionAndAll('edit_all');
$cs = new ChartService($user->company(), $user, $admin_equivalent_permissions);
return response()->json($cs->chart_summary($request->input('start_date'), $request->input('end_date')), 200); return response()->json($cs->chart_summary($request->input('start_date'), $request->input('end_date')), 200);
} }
@ -51,7 +55,9 @@ class ChartController extends BaseController
{ {
/** @var \App\Models\User auth()->user() */ /** @var \App\Models\User auth()->user() */
$user = auth()->user(); $user = auth()->user();
$cs = new ChartService($user->company(), $user, $user->isAdmin()); $admin_equivalent_permissions = $user->isAdmin() || $user->hasExactPermissionAndAll('view_all') || $user->hasExactPermissionAndAll('edit_all');
$cs = new ChartService($user->company(), $user, $admin_equivalent_permissions);
return response()->json($cs->totals($request->input('start_date'), $request->input('end_date')), 200); return response()->json($cs->totals($request->input('start_date'), $request->input('end_date')), 200);
} }
@ -61,7 +67,9 @@ class ChartController extends BaseController
/** @var \App\Models\User auth()->user() */ /** @var \App\Models\User auth()->user() */
$user = auth()->user(); $user = auth()->user();
$cs = new ChartService($user->company(), $user, $user->isAdmin()); $admin_equivalent_permissions = $user->isAdmin() || $user->hasExactPermissionAndAll('view_all') || $user->hasExactPermissionAndAll('edit_all');
$cs = new ChartService($user->company(), $user, $admin_equivalent_permissions);
return response()->json($cs->chart_summary($request->input('start_date'), $request->input('end_date')), 200); return response()->json($cs->chart_summary($request->input('start_date'), $request->input('end_date')), 200);
} }
@ -71,7 +79,9 @@ class ChartController extends BaseController
/** @var \App\Models\User auth()->user() */ /** @var \App\Models\User auth()->user() */
$user = auth()->user(); $user = auth()->user();
$cs = new ChartService($user->company(), $user, $user->isAdmin()); $admin_equivalent_permissions = $user->isAdmin() || $user->hasExactPermissionAndAll('view_all') || $user->hasExactPermissionAndAll('edit_all');
$cs = new ChartService($user->company(), $user, $admin_equivalent_permissions);
$result = $cs->getCalculatedField($request->all()); $result = $cs->getCalculatedField($request->all());
return response()->json($result, 200); return response()->json($result, 200);

View File

@ -114,8 +114,7 @@
"twig/twig": "^3.14", "twig/twig": "^3.14",
"twilio/sdk": "^6.40", "twilio/sdk": "^6.40",
"wikimedia/composer-merge-plugin": "^2.1", "wikimedia/composer-merge-plugin": "^2.1",
"wildbit/postmark-php": "^4.0", "wildbit/postmark-php": "^4.0"
"invoiceninja/admin-api": "dev-main"
}, },
"require-dev": { "require-dev": {
"barryvdh/laravel-debugbar": "^3.6", "barryvdh/laravel-debugbar": "^3.6",

78
composer.lock generated
View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "7fbe3af752ff66c779ab5cf92f9e0052", "content-hash": "2937b569c924dcc633b94288887c722c",
"packages": [ "packages": [
{ {
"name": "adrienrn/php-mimetyper", "name": "adrienrn/php-mimetyper",
@ -4511,65 +4511,6 @@
], ],
"time": "2022-05-21T17:30:32+00:00" "time": "2022-05-21T17:30:32+00:00"
}, },
{
"name": "invoiceninja/admin-api",
"version": "dev-main",
"dist": {
"type": "path",
"url": "../admin-api",
"reference": "20e652814f85db0f1825236843bb168b363859ee"
},
"require": {
"afosto/yaac": "^1.5",
"asm/php-ansible": "dev-main",
"ext-curl": "*",
"ext-dom": "*",
"ext-json": "*",
"ext-libxml": "*",
"ext-simplexml": "*",
"illuminate/database": "^11",
"illuminate/support": "^11",
"imdhemy/laravel-purchases": "^1.7",
"php": "^8.2|^8.3|^8.4"
},
"require-dev": {
"larastan/larastan": "^3.0",
"orchestra/testbench": "^9.0",
"phpstan/phpstan": "^2.0",
"phpunit/phpunit": "^11.0"
},
"type": "library",
"extra": {
"laravel": {
"providers": [
"InvoiceNinja\\AdminApi\\Providers\\AdminApiServiceProvider"
]
}
},
"autoload": {
"psr-4": {
"InvoiceNinja\\AdminApi\\": "src/"
}
},
"autoload-dev": {
"psr-4": {
"InvoiceNinja\\AdminApi\\Tests\\": "tests/"
}
},
"license": [
"Elastic"
],
"authors": [
{
"name": "David Bomba",
"email": "turbo124@gmail.com"
}
],
"description": "API endpoints for the admin interface",
"transport-options": {
"relative": true
}
},
{ {
"name": "invoiceninja/einvoice", "name": "invoiceninja/einvoice",
"version": "dev-main", "version": "dev-main",
@ -19829,16 +19770,16 @@
}, },
{ {
"name": "sebastian/comparator", "name": "sebastian/comparator",
"version": "6.3.0", "version": "6.3.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/comparator.git", "url": "https://github.com/sebastianbergmann/comparator.git",
"reference": "d4e47a769525c4dd38cea90e5dcd435ddbbc7115" "reference": "24b8fbc2c8e201bb1308e7b05148d6ab393b6959"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/d4e47a769525c4dd38cea90e5dcd435ddbbc7115", "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/24b8fbc2c8e201bb1308e7b05148d6ab393b6959",
"reference": "d4e47a769525c4dd38cea90e5dcd435ddbbc7115", "reference": "24b8fbc2c8e201bb1308e7b05148d6ab393b6959",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -19857,7 +19798,7 @@
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "6.2-dev" "dev-main": "6.3-dev"
} }
}, },
"autoload": { "autoload": {
@ -19897,7 +19838,7 @@
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/comparator/issues", "issues": "https://github.com/sebastianbergmann/comparator/issues",
"security": "https://github.com/sebastianbergmann/comparator/security/policy", "security": "https://github.com/sebastianbergmann/comparator/security/policy",
"source": "https://github.com/sebastianbergmann/comparator/tree/6.3.0" "source": "https://github.com/sebastianbergmann/comparator/tree/6.3.1"
}, },
"funding": [ "funding": [
{ {
@ -19905,7 +19846,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2025-01-06T10:28:19+00:00" "time": "2025-03-07T06:57:01+00:00"
}, },
{ {
"name": "sebastian/complexity", "name": "sebastian/complexity",
@ -21273,8 +21214,7 @@
"beganovich/snappdf": 20, "beganovich/snappdf": 20,
"horstoeko/orderx": 20, "horstoeko/orderx": 20,
"invoiceninja/einvoice": 20, "invoiceninja/einvoice": 20,
"socialiteproviders/apple": 20, "socialiteproviders/apple": 20
"invoiceninja/admin-api": 20
}, },
"prefer-stable": true, "prefer-stable": true,
"prefer-lowest": false, "prefer-lowest": false,

File diff suppressed because one or more lines are too long

View File

@ -1,9 +0,0 @@
var l=Object.defineProperty;var c=(n,t,e)=>t in n?l(n,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):n[t]=e;var r=(n,t,e)=>(c(n,typeof t!="symbol"?t+"":t,e),e);import{i as a,w as o}from"./wait-8f4ae121.js";/**
* Invoice Ninja (https://invoiceninja.com)
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2021. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://www.elastic.co/licensing/elastic-license
*/class d{constructor(t,e){r(this,"setupStripe",()=>{this.stripeConnect?this.stripe=Stripe(this.key,{stripeAccount:this.stripeConnect}):this.stripe=Stripe(this.key);let t=this.stripe.elements();var e={style:{base:{padding:"10px 12px",color:"#32325d",fontSize:"16px","::placeholder":{color:"#aab7c4"}}}};return this.ideal=t.create("idealBank",e),this.ideal.mount("#ideal-bank-element"),this});r(this,"handle",()=>{document.getElementById("pay-now").addEventListener("click",t=>{let e=document.getElementById("errors");if(!document.getElementById("ideal-name").value){e.textContent=document.querySelector("meta[name=translation-name-required]").content,e.hidden=!1,console.log("name");return}document.getElementById("pay-now").disabled=!0,document.querySelector("#pay-now > svg").classList.remove("hidden"),document.querySelector("#pay-now > span").classList.add("hidden"),this.stripe.confirmIdealPayment(document.querySelector("meta[name=pi-client-secret").content,{payment_method:{ideal:this.ideal,billing_details:{name:document.getElementById("ideal-name").value}},return_url:document.querySelector('meta[name="return-url"]').content})})});this.key=t,this.errors=document.getElementById("errors"),this.stripeConnect=e}}function i(){var e,s;const n=((e=document.querySelector('meta[name="stripe-publishable-key"]'))==null?void 0:e.content)??"",t=((s=document.querySelector('meta[name="stripe-account-id"]'))==null?void 0:s.content)??"";new d(n,t).setupStripe().handle()}a()?i():o("#stripe-ideal-payment").then(()=>i());a()?i():o("#stripe-ideal-payment").then(()=>i());

View File

@ -0,0 +1,9 @@
var i=Object.defineProperty;var a=(n,t,e)=>t in n?i(n,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):n[t]=e;var r=(n,t,e)=>(a(n,typeof t!="symbol"?t+"":t,e),e);import{i as c,w as l}from"./wait-8f4ae121.js";/**
* Invoice Ninja (https://invoiceninja.com)
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2021. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://www.elastic.co/licensing/elastic-license
*/class d{constructor(t,e){r(this,"setupStripe",()=>{this.stripeConnect?this.stripe=Stripe(this.key,{stripeAccount:this.stripeConnect}):this.stripe=Stripe(this.key);var t={style:{base:{padding:"10px 12px",color:"#32325d",fontSize:"16px","::placeholder":{color:"#aab7c4"}}},clientSecret:document.querySelector("meta[name=pi-client-secret").content};this.elements=this.stripe.elements(t);const e={layout:"accordion"};return this.ideal=this.elements.create("payment",e),this.ideal.mount("#payment-element"),this});r(this,"handle",()=>{document.getElementById("pay-now").addEventListener("click",async t=>{t.preventDefault();let e=document.getElementById("errors");e.textContent="",e.hidden=!0,document.getElementById("pay-now").disabled=!0,document.querySelector("#pay-now > svg").classList.remove("hidden"),document.querySelector("#pay-now > span").classList.add("hidden");const{error:s}=await this.stripe.confirmPayment({elements:this.elements,confirmParams:{return_url:document.querySelector('meta[name="return-url"]').content}});s&&(e.textContent=s.message,e.hidden=!1,document.getElementById("pay-now").disabled=!1,document.querySelector("#pay-now > svg").classList.add("hidden"),document.querySelector("#pay-now > span").classList.remove("hidden"))})});this.key=t,this.errors=document.getElementById("errors"),this.stripeConnect=e}}function o(){var e,s;const n=((e=document.querySelector('meta[name="stripe-publishable-key"]'))==null?void 0:e.content)??"",t=((s=document.querySelector('meta[name="stripe-account-id"]'))==null?void 0:s.content)??"";new d(n,t).setupStripe().handle()}c()?o():l("#stripe-ideal-payment").then(()=>o());

View File

@ -12,7 +12,7 @@
"file": "assets/wait-8f4ae121.js" "file": "assets/wait-8f4ae121.js"
}, },
"resources/js/app.js": { "resources/js/app.js": {
"file": "assets/app-09990367.js", "file": "assets/app-059c169b.js",
"imports": [ "imports": [
"_index-08e160a7.js", "_index-08e160a7.js",
"__commonjsHelpers-725317a4.js" "__commonjsHelpers-725317a4.js"
@ -283,7 +283,7 @@
"src": "resources/js/clients/payments/stripe-giropay.js" "src": "resources/js/clients/payments/stripe-giropay.js"
}, },
"resources/js/clients/payments/stripe-ideal.js": { "resources/js/clients/payments/stripe-ideal.js": {
"file": "assets/stripe-ideal-2110e54f.js", "file": "assets/stripe-ideal-aee1d791.js",
"imports": [ "imports": [
"_wait-8f4ae121.js" "_wait-8f4ae121.js"
], ],

View File

@ -21,7 +21,6 @@ class ProcessIDEALPay {
if (this.stripeConnect) { if (this.stripeConnect) {
// this.stripe.stripeAccount = this.stripeConnect;
this.stripe = Stripe(this.key, { this.stripe = Stripe(this.key, {
stripeAccount: this.stripeConnect, stripeAccount: this.stripeConnect,
@ -32,8 +31,6 @@ class ProcessIDEALPay {
this.stripe = Stripe(this.key); this.stripe = Stripe(this.key);
} }
let elements = this.stripe.elements();
var options = { var options = {
style: { style: {
base: { base: {
@ -45,40 +42,48 @@ class ProcessIDEALPay {
}, },
}, },
}, },
clientSecret: document.querySelector('meta[name=pi-client-secret').content,
}; };
this.ideal = elements.create('idealBank', options);
this.ideal.mount("#ideal-bank-element"); this.elements = this.stripe.elements(options);
const paymentElementOptions = { layout: 'accordion' };
this.ideal = this.elements.create('payment', paymentElementOptions);
this.ideal.mount('#payment-element');
return this; return this;
}; };
handle = () => { handle = () => {
document.getElementById('pay-now').addEventListener('click', (e) => { document.getElementById('pay-now').addEventListener('click', async (e) => {
e.preventDefault();
let errors = document.getElementById('errors'); let errors = document.getElementById('errors');
errors.textContent = '';
errors.hidden = true;
if (!document.getElementById('ideal-name').value) {
errors.textContent = document.querySelector('meta[name=translation-name-required]').content;
errors.hidden = false;
console.log("name");
return;
}
document.getElementById('pay-now').disabled = true; document.getElementById('pay-now').disabled = true;
document.querySelector('#pay-now > svg').classList.remove('hidden'); document.querySelector('#pay-now > svg').classList.remove('hidden');
document.querySelector('#pay-now > span').classList.add('hidden'); document.querySelector('#pay-now > span').classList.add('hidden');
this.stripe.confirmIdealPayment( const { error } = await this.stripe.confirmPayment({
document.querySelector('meta[name=pi-client-secret').content, elements: this.elements,
{ confirmParams: {
payment_method: {
ideal: this.ideal,
billing_details: {
name: document.getElementById("ideal-name").value,
},
},
return_url: document.querySelector( return_url: document.querySelector(
'meta[name="return-url"]' 'meta[name="return-url"]'
).content, ).content,
} },
); });
if (error) {
errors.textContent = error.message;
errors.hidden = false;
document.getElementById('pay-now').disabled = false;
document.querySelector('#pay-now > svg').classList.add('hidden');
document.querySelector('#pay-now > span').classList.remove('hidden');
}
}); });
}; };
} }
@ -95,5 +100,3 @@ function boot() {
} }
instant() ? boot() : wait('#stripe-ideal-payment').then(() => boot()); instant() ? boot() : wait('#stripe-ideal-payment').then(() => boot());
instant() ? boot() : wait('#stripe-ideal-payment').then(() => boot());

View File

@ -1,11 +1,6 @@
<div id="stripe--payment-container"> <div id="stripe--payment-container">
@component('portal.ninja2020.components.general.card-element', ['title' => ctrans('texts.name')]) @component('portal.ninja2020.components.general.card-element', ['title' => ctrans('texts.name')])
<label for="giropay-name"> <div id="payment-element">
<input class="input w-full" id="ideal-name" type="text" placeholder="{{ ctrans('texts.bank_account_holder') }}"> </div>
</label>
<label for="ideal-bank-element"></label>
<div class="border p-4 rounded">
<div id="ideal-bank-element"></div>
</div>
@endcomponent @endcomponent
</div> </div>